LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAib3B0aW9ucy5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgojaW5jbHVkZSAibWFpbi5oIgoKREVDTEFSRV9ERUJVR19DSEFOTkVMKGZpbGUpCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChvbGUpCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChzdHJpbmcpCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTCh3aW4zMikKCnN0cnVjdCBOTFNfbGFuZ2xvY2FsZSB7Cgljb25zdCBpbnQgbGFuZzsKCXN0cnVjdCBOTFNfbG9jYWxldmFyIHsKCQljb25zdCBpbnQJdHlwZTsKCQljb25zdCBjaGFyCSp2YWw7Cgl9IGxvY3ZhcnNbMTUwXTsKfTsKCiNkZWZpbmUgTEFOR19CRUdJTihsLHMpCXsJTUFLRUxBTkdJRChsLHMpLCB7CgojZGVmaW5lIExPQ1ZBTCh0eXBlLHZhbHVlKQkJCQkJe3R5cGUsdmFsdWV9LAoKI2RlZmluZSBMQU5HX0VORAkJCQkJIH19LAoKc3RhdGljIGNvbnN0IHN0cnVjdCBOTFNfbGFuZ2xvY2FsZSBsYW5nbG9jYWxlc1tdID0gewovKiBhZGQgbGFuZ3VhZ2VzIGluIG51bWVyaWNhbCBvcmRlciBvZiBtYWluIGxhbmd1YWdlIChsYXN0IHR3byBkaWdpdHMpCiAqIGl0IGlzIG11Y2ggZWFzaWVyIHRvIGZpbmQgdGhlIG1pc3NpbmcgaG9sZXMgdGhhdCB3YXkgKi8KCkxBTkdfQkVHSU4gKExBTkdfQ0FUQUxBTiwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwMyovCiNpbmNsdWRlICJubHMvY2F0Lm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfQ1pFQ0gsIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MDUqLwojaW5jbHVkZSAibmxzL2N6ZS5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0RBTklTSCwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwNiovCiNpbmNsdWRlICJubHMvZGFuLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTikJCS8qMHgwNDA3Ki8KI2luY2x1ZGUgIm5scy9kZXUubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fU1dJU1MpCQkvKjB4MDgwNyovCiNpbmNsdWRlICJubHMvZGVzLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOX0FVU1RSSUFOKQkvKjB4MEMwNyovCiNpbmNsdWRlICJubHMvZGVhLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcpCS8qMHgxMDA3Ki8KI2luY2x1ZGUgIm5scy9kZWwubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTikJLyoweDE0MDcqLwojaW5jbHVkZSAibmxzL2RlYy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUykJCS8qMHgwNDA5Ki8KI2luY2x1ZGUgIm5scy9lbnUubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VSykJCS8qMHgwODA5Ki8KI2luY2x1ZGUgIm5scy9lbmcubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9BVVMpCQkvKjB4MEMwOSovCiNpbmNsdWRlICJubHMvZW5hLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfQ0FOKQkJLyoweDEwMDkqLwojaW5jbHVkZSAibmxzL2VuYy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX05aKQkJLyoweDE0MDkqLwojaW5jbHVkZSAibmxzL2Vuei5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0VJUkUpCQkvKjB4MTgwOSovCiNpbmNsdWRlICJubHMvaXJsLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfU0FGUklDQSkJLyoweDFDMDkqLwojaW5jbHVkZSAibmxzL2Vucy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0pBTUFJQ0EpCS8qMHgyMDA5Ki8KI2luY2x1ZGUgIm5scy9lbmoubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9DQVJSSUJFQU4pCS8qMHgyNDA5Ki8KI2luY2x1ZGUgIm5scy9lbmIubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9CRUxJWkUpCS8qMHgyODA5Ki8KI2luY2x1ZGUgIm5scy9lbmwubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9UUklOSURBRCkgICAgCS8qMHgyQzA5Ki8KI2luY2x1ZGUgIm5scy9lbnQubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0gpCQkvKjB4MDQwYSovCiNpbmNsdWRlICJubHMvZXNwLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfTUVYSUNBTikJLyoweDA4MGEqLwojaW5jbHVkZSAibmxzL2VzbS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX01PREVSTikJLyoweDBDMGEqLwojaW5jbHVkZSAibmxzL2Vzbi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0dVQVRFTUFMQSkJLyoweDEwMGEqLwojaW5jbHVkZSAibmxzL2VzZy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0NPU1RBUklDQSkJLyoweDE0MGEqLwojaW5jbHVkZSAibmxzL2VzYy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1BBTkFNQSkJLyoweDE4MGEqLwojaW5jbHVkZSAibmxzL2VzYS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0RPTUlOSUNBTikJLyoweDFDMEEqLwojaW5jbHVkZSAibmxzL2VzZC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQSkJLyoweDIwMGEqLwojaW5jbHVkZSAibmxzL2Vzdi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBKQkvKjB4MjQwYSovCiNpbmNsdWRlICJubHMvZXNvLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUEVSVSkJCS8qMHgyODBhKi8KI2luY2x1ZGUgIm5scy9lc3IubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkEpCS8qMHgyYzBhKi8KI2luY2x1ZGUgIm5scy9lc3MubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9FQ1VBRE9SKQkvKjB4MzAwYSovCiNpbmNsdWRlICJubHMvZXNmLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQ0hJTEUpCS8qMHgzNDBhKi8KI2luY2x1ZGUgIm5scy9lc2wubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZKQkvKjB4MzgwYSovCiNpbmNsdWRlICJubHMvZXN5Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUEFSQUdVQVkpCS8qMHgzYzBhKi8KI2luY2x1ZGUgIm5scy9lc3oubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9CT0xJVklBKQkvKjB4NDAwYSovCiNpbmNsdWRlICJubHMvZXNiLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1IpCS8qMHg0NDBhKi8KI2luY2x1ZGUgIm5scy9lc2UubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9IT05EVVJBUykJLyoweDQ4MGEqLwojaW5jbHVkZSAibmxzL2VzaC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX05JQ0FSQUdVQSkJLyoweDRjMGEqLwojaW5jbHVkZSAibmxzL2VzaS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPKQkvKjB4NTAwYSovCiNpbmNsdWRlICJubHMvZXN1Lm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRklOTklTSCwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwQiovCiNpbmNsdWRlICJubHMvZmluLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSCkJCS8qMHgwNDBDKi8KI2luY2x1ZGUgIm5scy9mcmEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0ZSRU5DSCwgU1VCTEFOR19GUkVOQ0hfQkVMR0lBTikJLyoweDA4MEMqLwojaW5jbHVkZSAibmxzL2ZyYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9DQU5BRElBTikJLyoweDBDMEMqLwojaW5jbHVkZSAibmxzL2ZyYy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9TV0lTUykJCS8qMHgxMDBDKi8KI2luY2x1ZGUgIm5scy9mcnMubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0ZSRU5DSCwgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRykJLyoweDE0MEMqLwojaW5jbHVkZSAibmxzL2ZybC5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0hVTkdBUklBTiwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwZSovCiNpbmNsdWRlICJubHMvaHVuLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfSVRBTElBTiwgU1VCTEFOR19JVEFMSUFOKQkJLyoweDA0MTAqLwojaW5jbHVkZSAibmxzL2l0YS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfSVRBTElBTiwgU1VCTEFOR19JVEFMSUFOX1NXSVNTKQkvKjB4MDgxMCovCiNpbmNsdWRlICJubHMvaXRzLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfS09SRUFOLCBTVUJMQU5HX0tPUkVBTikJLyoweDA0MTIqLwojaW5jbHVkZSAibmxzL2tvci5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0RVVENILCBTVUJMQU5HX0RVVENIKQkJLyoweDA0MTMqLwojaW5jbHVkZSAibmxzL25sZC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRFVUQ0gsIFNVQkxBTkdfRFVUQ0hfQkVMR0lBTikJLyoweDA4MTMqLwojaW5jbHVkZSAibmxzL25sYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRFVUQ0gsIFNVQkxBTkdfRFVUQ0hfU1VSSU5BTSkJLyoweDBDMTMqLwojaW5jbHVkZSAibmxzL25scy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX05PUldFR0lBTiwgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMKQkvKjB4MDQxNCovCiNpbmNsdWRlICJubHMvbm9yLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19OT1JXRUdJQU4sIFNVQkxBTkdfTk9SV0VHSUFOX05ZTk9SU0spCS8qMHgwODE0Ki8KI2luY2x1ZGUgIm5scy9ub24ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19QT0xJU0gsIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MTUqLwojaW5jbHVkZSAibmxzL3Bsay5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1BPUlRVR1VFU0UgLFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4pCS8qMHgwNDE2Ki8KI2luY2x1ZGUgIm5scy9wdGIubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1BPUlRVR1VFU0UgLFNVQkxBTkdfUE9SVFVHVUVTRSkJCS8qMHgwODE2Ki8KI2luY2x1ZGUgIm5scy9wdGcubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19SVVNTSUFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHg0MTkqLwojaW5jbHVkZSAibmxzL3J1cy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1NMT1ZBSywgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQxYiovCiNpbmNsdWRlICJubHMvc2t5Lm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfU1dFRElTSCwgU1VCTEFOR19TV0VESVNIKQkJLyoweDA0MWQqLwojaW5jbHVkZSAibmxzL3N2ZS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1dFRElTSCwgU1VCTEFOR19TV0VESVNIX0ZJTkxBTkQpCS8qMHgwODFkKi8KI2luY2x1ZGUgIm5scy9zdmYubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19USEFJLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHg0MWUqLwojaW5jbHVkZSAibmxzL3RoYS5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0VTUEVSQU5UTywgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQ4ZiovCiNpbmNsdWRlICJubHMvZXNwZXJhbnRvLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfV0FMT04sIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0OTAqLwojaW5jbHVkZSAibmxzL3dhbC5ubHMiCkxBTkdfRU5ECgkgICAgfTsKCgovKiBMb2NhbGUgbmFtZSB0byBpZCBtYXAuIHVzZWQgYnkgRW51bVN5c3RlbUxvY2FsZXMsIEdldExvY2FsSW5mb0EgCiAqIE1VU1QgY29udGFpbiBhbGwgI2RlZmluZXMgZnJvbSB3aW5ubHMuaAogKiBsYXN0IGVudHJ5IGhhcyBOVUxMIG5hbWUsIDAgaWQuCiAqLyAKI2RlZmluZSBMT0NBTEVfRU5UUlkoeCkJeyN4LExPQ0FMRV8jI3h9CnN0YXRpYyBzdHJ1Y3QgdGFnTE9DQUxFX05BTUUySUQgewoJY2hhcgkqbmFtZTsKCURXT1JECWlkOwp9IGxvY2FsZV9uYW1lMmlkW109IHsKCUxPQ0FMRV9FTlRSWShJTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0VOR0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoSUNPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTRU5HQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkNUUllOQU1FKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRBTlNJQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUTUFDQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKFNMSVNUKSwKCUxPQ0FMRV9FTlRSWShJTUVBU1VSRSksCglMT0NBTEVfRU5UUlkoU0RFQ0lNQUwpLAoJTE9DQUxFX0VOVFJZKFNUSE9VU0FORCksCglMT0NBTEVfRU5UUlkoU0dST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElORUdOVU1CRVIpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVESUdJVFMpLAoJTE9DQUxFX0VOVFJZKFNDVVJSRU5DWSksCglMT0NBTEVfRU5UUlkoU0lOVExTWU1CT0wpLAoJTE9DQUxFX0VOVFJZKFNNT05ERUNJTUFMU0VQKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhPVVNBTkRTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05HUk9VUElORyksCglMT0NBTEVfRU5UUlkoSUNVUlJESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElJTlRMQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUNVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShJTkVHQ1VSUiksCglMT0NBTEVfRU5UUlkoU0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FKSwKCUxPQ0FMRV9FTlRSWShTU0hPUlREQVRFKSwKCUxPQ0FMRV9FTlRSWShTTE9OR0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FRk9STUFUKSwKCUxPQ0FMRV9FTlRSWShJREFURSksCglMT0NBTEVfRU5UUlkoSUxEQVRFKSwKCUxPQ0FMRV9FTlRSWShJVElNRSksCglMT0NBTEVfRU5UUlkoSVRJTUVNQVJLUE9TTiksCglMT0NBTEVfRU5UUlkoSUNFTlRVUlkpLAoJTE9DQUxFX0VOVFJZKElUTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElEQVlMWkVSTyksCglMT0NBTEVfRU5UUlkoSU1PTkxaRVJPKSwKCUxPQ0FMRV9FTlRSWShTMTE1OSksCglMT0NBTEVfRU5UUlkoUzIzNTkpLAoJTE9DQUxFX0VOVFJZKElDQUxFTkRBUlRZUEUpLAoJTE9DQUxFX0VOVFJZKElPUFRJT05BTENBTEVOREFSKSwKCUxPQ0FMRV9FTlRSWShJRklSU1REQVlPRldFRUspLAoJTE9DQUxFX0VOVFJZKElGSVJTVFdFRUtPRllFQVIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMSksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNCksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTgpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU5KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTApLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEyKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU1BPU0lUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoU05FR0FUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoSVBPU1NJR05QT1NOKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElQT1NTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSVBPU1NFUEJZU1BBQ0UpLAoJTE9DQUxFX0VOVFJZKElORUdTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSU5FR1NFUEJZU1BBQ0UpLAoJTE9DQUxFX0VOVFJZKEZPTlRTSUdOQVRVUkUpLAoJTE9DQUxFX0VOVFJZKFNJU082MzlMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoU0lTTzMxNjZDVFJZTkFNRSksCgl7TlVMTCwwfSwKfTsKCmNvbnN0IHN0cnVjdCBtYXBfbGNpZDJzdHIgewoJTENJRAkJbGFuZ2lkOwoJY29uc3QgY2hhcgkqbGFuZ25hbWU7Cn0gbGFuZ3VhZ2VzW109ewoJezB4MDQwMSwiQXJhYmljIChTYXVkaSBBcmFiaWEpIn0sCgl7MHgwODAxLCJBcmFiaWMgKElyYXEpIn0sCgl7MHgwYzAxLCJBcmFiaWMgKEVneXB0KSJ9LAoJezB4MTAwMSwiQXJhYmljIChMaWJ5YSkifSwKCXsweDE0MDEsIkFyYWJpYyAoQWxnZXJpYSkifSwKCXsweDE4MDEsIkFyYWJpYyAoTW9yb2NjbykifSwKCXsweDFjMDEsIkFyYWJpYyAoVHVuaXNpYSkifSwKCXsweDIwMDEsIkFyYWJpYyAoT21hbikifSwKCXsweDI0MDEsIkFyYWJpYyAoWWVtZW4pIn0sCgl7MHgyODAxLCJBcmFiaWMgKFN5cmlhKSJ9LAoJezB4MmMwMSwiQXJhYmljIChKb3JkYW4pIn0sCgl7MHgzMDAxLCJBcmFiaWMgKExlYmFub24pIn0sCgl7MHgzNDAxLCJBcmFiaWMgKEt1d2FpdCkifSwKCXsweDM4MDEsIkFyYWJpYyAoVW5pdGVkIEFyYWIgRW1pcmF0ZXMpIn0sCgl7MHgzYzAxLCJBcmFiaWMgKEJhaHJhaW4pIn0sCgl7MHg0MDAxLCJBcmFiaWMgKFFhdGFyKSJ9LAoJezB4MDQwMiwiQnVsZ2FyaWFuIn0sCgl7MHgwNDAzLCJDYXRhbGFuIn0sCgl7MHgwNDA0LCJDaGluZXNlIChUYWl3YW4pIn0sCgl7MHgwODA0LCJDaGluZXNlIChQZW9wbGUncyBSZXB1YmxpYyBvZiBDaGluYSkifSwKCXsweDBjMDQsIkNoaW5lc2UgKEhvbmcgS29uZykifSwKCXsweDEwMDQsIkNoaW5lc2UgKFNpbmdhcG9yZSkifSwKCXsweDE0MDQsIkNoaW5lc2UgKE1hY2F1KSJ9LAoJezB4MDQwNSwiQ3plY2gifSwKCXsweDA0MDYsIkRhbmlzaCJ9LAoJezB4MDQwNywiR2VybWFuIChHZXJtYW55KSJ9LAoJezB4MDgwNywiR2VybWFuIChTd2l0emVybGFuZCkifSwKCXsweDBjMDcsIkdlcm1hbiAoQXVzdHJpYSkifSwKCXsweDEwMDcsIkdlcm1hbiAoTHV4ZW1ib3VyZykifSwKCXsweDE0MDcsIkdlcm1hbiAoTGllY2h0ZW5zdGVpbikifSwKCXsweDA0MDgsIkdyZWVrIn0sCgl7MHgwNDA5LCJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSJ9LAoJezB4MDgwOSwiRW5nbGlzaCAoVW5pdGVkIEtpbmdkb20pIn0sCgl7MHgwYzA5LCJFbmdsaXNoIChBdXN0cmFsaWEpIn0sCgl7MHgxMDA5LCJFbmdsaXNoIChDYW5hZGEpIn0sCgl7MHgxNDA5LCJFbmdsaXNoIChOZXcgWmVhbGFuZCkifSwKCXsweDE4MDksIkVuZ2xpc2ggKElyZWxhbmQpIn0sCgl7MHgxYzA5LCJFbmdsaXNoIChTb3V0aCBBZnJpY2EpIn0sCgl7MHgyMDA5LCJFbmdsaXNoIChKYW1haWNhKSJ9LAoJezB4MjQwOSwiRW5nbGlzaCAoQ2FyaWJiZWFuKSJ9LAoJezB4MjgwOSwiRW5nbGlzaCAoQmVsaXplKSJ9LAoJezB4MmMwOSwiRW5nbGlzaCAoVHJpbmlkYWQpIn0sCgl7MHgzMDA5LCJFbmdsaXNoIChaaW1iYWJ3ZSkifSwKCXsweDM0MDksIkVuZ2xpc2ggKFBoaWxpcHBpbmVzKSJ9LAoJezB4MDQwYSwiU3BhbmlzaCAoU3BhaW4sIHRyYWRpdGlvbmFsIHNvcnRpbmcpIn0sCgl7MHgwODBhLCJTcGFuaXNoIChNZXhpY28pIn0sCgl7MHgwYzBhLCJTcGFuaXNoIChTcGFpbiwgaW50ZXJuYXRpb25hbCBzb3J0aW5nKSJ9LAoJezB4MTAwYSwiU3BhbmlzaCAoR3VhdGVtYWxhKSJ9LAoJezB4MTQwYSwiU3BhbmlzaCAoQ29zdGEgUmljYSkifSwKCXsweDE4MGEsIlNwYW5pc2ggKFBhbmFtYSkifSwKCXsweDFjMGEsIlNwYW5pc2ggKERvbWluaWNhbiBSZXB1YmxpYykifSwKCXsweDIwMGEsIlNwYW5pc2ggKFZlbmV6dWVsYSkifSwKCXsweDI0MGEsIlNwYW5pc2ggKENvbG9tYmlhKSJ9LAoJezB4MjgwYSwiU3BhbmlzaCAoUGVydSkifSwKCXsweDJjMGEsIlNwYW5pc2ggKEFyZ2VudGluYSkifSwKCXsweDMwMGEsIlNwYW5pc2ggKEVjdWFkb3IpIn0sCgl7MHgzNDBhLCJTcGFuaXNoIChDaGlsZSkifSwKCXsweDM4MGEsIlNwYW5pc2ggKFVydWd1YXkpIn0sCgl7MHgzYzBhLCJTcGFuaXNoIChQYXJhZ3VheSkifSwKCXsweDQwMGEsIlNwYW5pc2ggKEJvbGl2aWEpIn0sCgl7MHg0NDBhLCJTcGFuaXNoIChFbCBTYWx2YWRvcikifSwKCXsweDQ4MGEsIlNwYW5pc2ggKEhvbmR1cmFzKSJ9LAoJezB4NGMwYSwiU3BhbmlzaCAoTmljYXJhZ3VhKSJ9LAoJezB4NTAwYSwiU3BhbmlzaCAoUHVlcnRvIFJpY28pIn0sCgl7MHgwNDBiLCJGaW5uaXNoIn0sCgl7MHgwNDBjLCJGcmVuY2ggKEZyYW5jZSkifSwKCXsweDA4MGMsIkZyZW5jaCAoQmVsZ2l1bSkifSwKCXsweDBjMGMsIkZyZW5jaCAoQ2FuYWRhKSJ9LAoJezB4MTAwYywiRnJlbmNoIChTd2l0emVybGFuZCkifSwKCXsweDE0MGMsIkZyZW5jaCAoTHV4ZW1ib3VyZykifSwKCXsweDE4MGMsIkZyZW5jaCAoTW9uYWNvKSJ9LAoJezB4MDQwZCwiSGVicmV3In0sCgl7MHgwNDBlLCJIdW5nYXJpYW4ifSwKCXsweDA0MGYsIkljZWxhbmRpYyJ9LAoJezB4MDQxMCwiSXRhbGlhbiAoSXRhbHkpIn0sCgl7MHgwODEwLCJJdGFsaWFuIChTd2l0emVybGFuZCkifSwKCXsweDA0MTEsIkphcGFuZXNlIn0sCgl7MHgwNDEyLCJLb3JlYW4gKFdhbnN1bmcpIn0sCgl7MHgwODEyLCJLb3JlYW4gKEpvaGFiKSJ9LAoJezB4MDQxMywiRHV0Y2ggKE5ldGhlcmxhbmRzKSJ9LAoJezB4MDgxMywiRHV0Y2ggKEJlbGdpdW0pIn0sCgl7MHgwNDE0LCJOb3J3ZWdpYW4gKEJva21hbCkifSwKCXsweDA4MTQsIk5vcndlZ2lhbiAoTnlub3JzaykifSwKCXsweDA0MTUsIlBvbGlzaCJ9LAoJezB4MDQxNiwiUG9ydHVndWVzZSAoQnJhemlsKSJ9LAoJezB4MDgxNiwiUG9ydHVndWVzZSAoUG9ydHVnYWwpIn0sCgl7MHgwNDE3LCJSaGFldG8gUm9tYW5pYyJ9LAoJezB4MDQxOCwiUm9tYW5pYW4ifSwKCXsweDA4MTgsIk1vbGRhdmlhbiJ9LAoJezB4MDQxOSwiUnVzc2lhbiAoUnVzc2lhKSJ9LAoJezB4MDgxOSwiUnVzc2lhbiAoTW9sZGF2aWEpIn0sCgl7MHgwNDFhLCJDcm9hdGlhbiJ9LAoJezB4MDgxYSwiU2VyYmlhbiAobGF0aW4pIn0sCgl7MHgwYzFhLCJTZXJiaWFuIChjeXJpbGxpYykifSwKCXsweDA0MWIsIlNsb3ZhayJ9LAoJezB4MDQxYywiQWxiYW5pYW4ifSwKCXsweDA0MWQsIlN3ZWRpc2ggKFN3ZWRlbikifSwKCXsweDA4MWQsIlN3ZWRpc2ggKEZpbmxhbmQpIn0sCgl7MHgwNDFlLCJUaGFpIn0sCgl7MHgwNDFmLCJUdXJraXNoIn0sCgl7MHgwNDIwLCJVcmR1In0sCgl7MHgwNDIxLCJJbmRvbmVzaWFuIn0sCgl7MHgwNDIyLCJVa3JhaW5pYW4ifSwKCXsweDA0MjMsIkJlbGFydXNpYW4ifSwKCXsweDA0MjQsIlNsb3ZlbmUifSwKCXsweDA0MjUsIkVzdG9uaWFuIn0sCgl7MHgwNDI2LCJMYXR2aWFuIn0sCgl7MHgwNDI3LCJMaXRodWFuaWFuIChtb2Rlcm4pIn0sCgl7MHgwODI3LCJMaXRodWFuaWFuIChjbGFzc2ljKSJ9LAoJezB4MDQyOCwiTWFvcmkifSwKCXsweDA0MjksIkZhcnNpIn0sCgl7MHgwNDJhLCJWaWV0bmFtZXNlIn0sCgl7MHgwNDJiLCJBcm1lbmlhbiJ9LAoJezB4MDQyYywiQXplcmkgKGxhdGluKSJ9LAoJezB4MDgyYywiQXplcmkgKGN5cmlsbGljKSJ9LAoJezB4MDQyZCwiQmFzcXVlIn0sCgl7MHgwNDJlLCJTb3JiaWFuIn0sCgl7MHgwNDJmLCJNYWNlZG9uaWFuIn0sCgl7MHgwNDMwLCJTdXR1In0sCgl7MHgwNDMxLCJUc29uZ2EifSwKCXsweDA0MzIsIlRzd2FuYSJ9LAoJezB4MDQzMywiVmVuZGEifSwKCXsweDA0MzQsIlhob3NhIn0sCgl7MHgwNDM1LCJadWx1In0sCgl7MHgwNDM2LCJBZnJpa2FhbnMifSwKCXsweDA0MzcsIkdlb3JnaWFuIn0sCgl7MHgwNDM4LCJGYWVyb2VzZSJ9LAoJezB4MDQzOSwiSGluZGkifSwKCXsweDA0M2EsIk1hbHRlc2UifSwKCXsweDA0M2IsIlNhYW1pIn0sCgl7MHgwNDNjLCJJcmlzaCBnYWVsaWMifSwKCXsweDA4M2MsIlNjb3R0aXNoIGdhZWxpYyJ9LAoJezB4MDQzZSwiTWFsYXkgKE1hbGF5c2lhKSJ9LAoJezB4MDgzZSwiTWFsYXkgKEJydW5laSBEYXJ1c3NhbGFtKSJ9LAoJezB4MDQzZiwiS2F6YWsifSwKCXsweDA0NDEsIlN3YWhpbGkifSwKCXsweDA0NDMsIlV6YmVrIChsYXRpbikifSwKCXsweDA4NDMsIlV6YmVrIChjeXJpbGxpYykifSwKCXsweDA0NDQsIlRhdGFyIn0sCgl7MHgwNDQ1LCJCZW5nYWxpIn0sCgl7MHgwNDQ2LCJQdW5qYWJpIn0sCgl7MHgwNDQ3LCJHdWphcmF0aSJ9LAoJezB4MDQ0OCwiT3JpeWEifSwKCXsweDA0NDksIlRhbWlsIn0sCgl7MHgwNDRhLCJUZWx1Z3UifSwKCXsweDA0NGIsIkthbm5hZGEifSwKCXsweDA0NGMsIk1hbGF5YWxhbSJ9LAoJezB4MDQ0ZCwiQXNzYW1lc2UifSwKCXsweDA0NGUsIk1hcmF0aGkifSwKCXsweDA0NGYsIlNhbnNrcml0In0sCgl7MHgwNDU3LCJLb25rYW5pIn0sCgl7MHgwNDhmLCJFc3BlcmFudG8ifSwgLyogTm9uIG9mZmljaWFsICovCgl7MHgwNDkwLCJXYWxvbiJ9LCAvKiBOb24gb2ZmaWNpYWwgKi8KCXsweDAwMDAsIlVua25vd24ifQogICAgfSwgbGFuZ3VhZ2VzX2RlW109ewoJezB4MDQwMSwiQXJhYmljIn0sCgl7MHgwNDAyLCJCdWxnYXJpc2NoIn0sCgl7MHgwNDAzLCJLYXRhbGFuaXNjaCJ9LAoJezB4MDQwNCwiVHJhZGl0aW9uYWxlcyBDaGluZXNpc2NoIn0sCgl7MHgwNDA1LCJUc2NoZWNpc2NoIn0sCgl7MHgwNDA2LCJE5G5pc2NoIn0sCgl7MHgwNDA3LCJEZXV0c2NoIn0sCgl7MHgwNDA4LCJHcmllY2hpc2NoIn0sCgl7MHgwNDA5LCJBbWVyaWthbmlzY2hlcyBFbmdsaXNjaCJ9LAoJezB4MDQwQSwiS2FzdGlsaXNjaGVzIFNwYW5pc2NoIn0sCgl7MHgwNDBCLCJGaW5uaXNjaCJ9LAoJezB4MDQwQywiRnJhbnp2c2lzY2gifSwKCXsweDA0MEQsIkhlYnJkaXNjaCJ9LAoJezB4MDQwRSwiVW5nYXJpc2NoIn0sCgl7MHgwNDBGLCJJc2xkbmRpc2NoIn0sCgl7MHgwNDEwLCJJdGFsaWVuaXNjaCJ9LAoJezB4MDQxMSwiSmFwYW5pc2NoIn0sCgl7MHgwNDEyLCJLb3JlYW5pc2NoIn0sCgl7MHgwNDEzLCJOaWVkZXJsZG5kaXNjaCJ9LAoJezB4MDQxNCwiTm9yd2VnaXNjaC1Cb2ttYWwifSwKCXsweDA0MTUsIlBvbG5pc2NoIn0sCgl7MHgwNDE2LCJCcmFzaWxpYW5pc2NoZXMgUG9ydHVnaWVzaXNjaCJ9LAoJezB4MDQxNywiUmR0b3JvbWFuaXNjaCJ9LAoJezB4MDQxOCwiUnVtZG5pc2NoIn0sCgl7MHgwNDE5LCJSdXNzaXNjaCJ9LAoJezB4MDQxQSwiS3JvYXRvc2VyYmlzY2ggKGxhdGVpbmlzY2gpIn0sCgl7MHgwNDFCLCJTbG93ZW5pc2NoIn0sCgl7MHgwNDFDLCJBbGJhbmlzY2gifSwKCXsweDA0MUQsIlNjaHdlZGlzY2gifSwKCXsweDA0MUUsIlRoYWkifSwKCXsweDA0MUYsIlT8cmtpc2NoIn0sCgl7MHgwNDIwLCJVcmR1In0sCgl7MHgwNDIxLCJCYWhhc2EifSwKCXsweDA4MDQsIlZlcmVpbmZhY2h0ZXMgQ2hpbmVzaXNjaCJ9LAoJezB4MDgwNywiU2Nod2VpemVyZGV1dHNjaCJ9LAoJezB4MDgwOSwiQnJpdGlzY2hlcyBFbmdsaXNjaCJ9LAoJezB4MDgwQSwiTWV4aWthbmlzY2hlcyBTcGFuaXNjaCJ9LAoJezB4MDgwQywiQmVsZ2lzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MDgxMCwiU2Nod2VpemVyaXNjaGVzIEl0YWxpZW5pc2NoIn0sCgl7MHgwODEzLCJCZWxnaXNjaGVzIE5pZWRlcmxkbmRpc2NoIn0sCgl7MHgwODE0LCJOb3Jnd2VnaXNjaC1OeW5vcnNrIn0sCgl7MHgwODE2LCJQb3J0dWdpZXNpc2NoIn0sCgl7MHgwODFBLCJTZXJib2tyYXRpc2NoIChreXJpbGxpc2NoKSJ9LAoJezB4MEMxQywiS2FuYWRpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDEwMEMsIlNjaHdlaXplcmlzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MDAwMCwiVW5iZWthbm50In0sCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldFVzZXJEZWZhdWx0TENJRCAgICAgICAoT0xFMk5MUy4xKQogKi8KTENJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMQ0lEKCkKewoJcmV0dXJuIE1BS0VMQ0lEKCBHZXRVc2VyRGVmYXVsdExhbmdJRCgpICwgU09SVF9ERUZBVUxUICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFN5c3RlbURlZmF1bHRMQ0lEICAgICAgIChPTEUyTkxTLjIpCiAqLwpMQ0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpCnsKCXJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0VXNlckRlZmF1bHRMYW5nSUQgICAgICAgKE9MRTJOTFMuMykKICovCkxBTkdJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMYW5nSUQoKQp7CgkvKiBjYWNoaW5nIHJlc3VsdCwgaWYgZGVmaW5lZCBmcm9tIGVudmlyb25tZW50LCB3aGljaCBzaG91bGQgKD8pIG5vdCBjaGFuZ2UgZHVyaW5nIGEgV0lORSBzZXNzaW9uICovCglzdGF0aWMJTEFOR0lECXVzZXJMQ0lEID0gMDsKCWlmIChPcHRpb25zLmxhbmd1YWdlKSB7CgkJcmV0dXJuIExhbmd1YWdlc1tPcHRpb25zLmxhbmd1YWdlXS5sYW5naWQ7Cgl9CgoJaWYgKHVzZXJMQ0lEID09IDApIHsKCQljaGFyICpidWY9TlVMTDsKCQljaGFyICpsYW5nLCpjb3VudHJ5LCpjaGFyc2V0LCpkaWFsZWN0LCpuZXh0OwoJCWludCAJcmV0PTA7CgkJCgkJYnVmPWdldGVudigiTEFOR1VBR0UiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTEFORyIpOwoJCWlmICghYnVmKSBidWY9Z2V0ZW52KCJMQ19BTEwiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTENfTUVTU0FHRVMiKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTENfQ1RZUEUiKTsKCQlpZiAoIWJ1ZikgcmV0dXJuIHVzZXJMQ0lEID0gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCQkKCQlpZiAoIXN0cmNtcChidWYsIlBPU0lYIikgfHwgIXN0cmNtcChidWYsIkMiKSkgewoJCQlyZXR1cm4gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKCQl9CgkJCgkJbGFuZz1idWY7CgkJCgkJZG8gewoJCQluZXh0PXN0cmNocihsYW5nLCc6Jyk7IGlmIChuZXh0KSAqbmV4dCsrPSdcMCc7CgkJCWRpYWxlY3Q9c3RyY2hyKGxhbmcsJ0AnKTsgaWYgKGRpYWxlY3QpICpkaWFsZWN0Kys9J1wwJzsKCQkJY2hhcnNldD1zdHJjaHIobGFuZywnLicpOyBpZiAoY2hhcnNldCkgKmNoYXJzZXQrKz0nXDAnOwoJCQljb3VudHJ5PXN0cmNocihsYW5nLCdfJyk7IGlmIChjb3VudHJ5KSAqY291bnRyeSsrPSdcMCc7CgkJCQoJCQlyZXQ9TUFJTl9HZXRMYW5ndWFnZUlEKGxhbmcsIGNvdW50cnksIGNoYXJzZXQsIGRpYWxlY3QpOwoJCQkKCQkJbGFuZz1uZXh0OwoJCQkKCQl9IHdoaWxlIChsYW5nICYmICFyZXQpOwoJCQoJCS8qIEZJWE1FIDogYXJlIHN0cmluZ3MgcmV0dXJuZWQgYnkgZ2V0ZW52KCkgdG8gYmUgZnJlZSgpJ2VkID8gKi8KCQl1c2VyTENJRCA9IChMQU5HSUQpcmV0OwoJfQoJcmV0dXJuIHVzZXJMQ0lEOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEICAgICAoT0xFMk5MUy40KQogKi8KTEFOR0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldExvY2FsZUluZm8xNglbT0xFMk5MUy41XQogKiBJcyB0aGUgbGFzdCBwYXJhbWV0ZXIgcmVhbGx5IFdPUkQgZm9yIFdpbjE2PwogKi8KSU5UMTYgV0lOQVBJIEdldExvY2FsZUluZm8xNihMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFNUUiBidWYsSU5UMTYgbGVuKQp7CglyZXR1cm4gR2V0TG9jYWxlSW5mb0EobGNpZCxMQ1R5cGUsYnVmLGxlbik7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb252ZXJ0RGVmYXVsdExvY2FsZTMyIFtLRVJORUwzMi4xNDddCiAqLwpMQ0lEIFdJTkFQSSBDb252ZXJ0RGVmYXVsdExvY2FsZTMyIChMQ0lEIGxjaWQpCnsJc3dpdGNoIChsY2lkKQoJeyAgY2FzZSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ6CgkgICAgIHJldHVybiBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJICAgY2FzZSBMT0NBTEVfVVNFUl9ERUZBVUxUOgoJICAgICByZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CgkgICBjYXNlIDA6CgkgICAgIHJldHVybiBNQUtFTENJRCAoTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwpOwoJfSAgCglyZXR1cm4gTUFLRUxBTkdJRCggUFJJTUFSWUxBTkdJRChsY2lkKSwgU1VCTEFOR19ORVVUUkFMKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldExvY2FsZUluZm8zMkEgW0tFUk5FTDMyLjM0Ml0KICoKICogTk9URVMgCiAqICBMQU5HX05FVVRSQUwgaXMgZXF1YWwgdG8gTE9DQUxFX1NZU1RFTV9ERUZBVUxUCiAqCiAqICBNUyBvbmxpbmUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGUgc3RyaW5nIHJldHVybmVkIGlzIE5VTEwgdGVybWluYXRlZAogKiAgZXhjZXB0IGZvciBMT0NBTEVfRk9OVFNJR05BVFVSRSAgd2hpY2ggIndpbGwgcmV0dXJuIGEgbm9uLU5VTEwKICogIHRlcm1pbmF0ZWQgc3RyaW5nIi4KICovCklOVCBXSU5BUEkgR2V0TG9jYWxlSW5mb0EoTENJRCBsY2lkLExDVFlQRSBMQ1R5cGUsTFBTVFIgYnVmLElOVCBsZW4pCnsKICBMUENTVFIgIHJldFN0cmluZzsKCWludAlmb3VuZCxpOwoJaW50CWxhbmc9MDsKCiAgVFJBQ0Uob2xlLCIobGNpZD0weCVseCxsY3R5cGU9MHglbHgsJXAsJXgpXG4iLGxjaWQsTENUeXBlLGJ1ZixsZW4pOwoKICBpZiAobGVuICYmICghIGJ1ZikgKSB7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKGxjaWQgPT0wIHx8IGxjaWQgPT0gTEFOR19TWVNURU1fREVGQVVMVCB8fCAoTENUeXBlICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSApCS8qIDB4MDAsIDB4NDAwICovCgl7CiAgICAgICAgICAgIGxjaWQgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJfSAKCWVsc2UgaWYgKGxjaWQgPT0gTEFOR19VU0VSX0RFRkFVTFQpIC8qMHg4MDAqLwoJewogICAgICAgICAgICBsY2lkID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cgl9CglMQ1R5cGUgJj0gfihMT0NBTEVfTk9VU0VST1ZFUlJJREV8TE9DQUxFX1VTRV9DUF9BQ1ApOwoKCS8qIEFzIGFuIG9wdGlvbiwgd2UgY291bGQgb2J0YWluIHRoZSB2YWx1ZSBmcm9tIHdpbi5pbmkuCgkgICBUaGlzIHdvdWxkIG5vdCBtYXRjaCB0aGUgV2luZSBjb21waWxlLXRpbWUgb3B0aW9uLgoJICAgQWxzbywgbm90IGFsbCBpZGVudGlmaWVycyBhcmUgYXZhaWxhYmxlIGZyb20gd2luLmluaSAqLwoJcmV0U3RyaW5nPTA7CgkvKiBJZiB3ZSBhcmUgdGhyb3VnaCBhbGwgb2YgdGhpcywgcmV0TGVuIHNob3VsZCBub3QgYmUgemVybyBhbnltb3JlLgoJICAgSWYgaXQgaXMsIHRoZSB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkICovCglpPTA7Cgl3aGlsZSAobG9jYWxlX25hbWUyaWRbaV0ubmFtZSE9TlVMTCkgewoJCWlmIChMQ1R5cGUgPT0gbG9jYWxlX25hbWUyaWRbaV0uaWQpIHsKCQkJcmV0U3RyaW5nID0gbG9jYWxlX25hbWUyaWRbaV0ubmFtZTsKCQkJYnJlYWs7CgkJfQoJCWkrKzsKCX0KCWlmICghcmV0U3RyaW5nKSB7CiAgICAgIEZJWE1FKG9sZSwiVW5rb3duIExDIHR5cGUgJWxYXG4iLExDVHlwZSk7CgkJcmV0dXJuIDA7Cgl9CgogICAgZm91bmQ9MDtsYW5nPWxjaWQ7CiAgICBmb3IgKGk9MDsoaTwzICYmICFmb3VuZCk7aSsrKSB7CiAgICAgIGludCBqOwoKICAgICAgZm9yIChqPTA7ajxzaXplb2YobGFuZ2xvY2FsZXMpL3NpemVvZihsYW5nbG9jYWxlc1swXSk7aisrKSB7CglpZiAobGFuZ2xvY2FsZXNbal0ubGFuZyA9PSBsYW5nKSB7CgkgIGludCBrOwoKCSAgZm9yIChrPTA7azxzaXplb2YobGFuZ2xvY2FsZXNbal0ubG9jdmFycykvc2l6ZW9mKGxhbmdsb2NhbGVzW2pdLmxvY3ZhcnNbMF0pICYmIChsYW5nbG9jYWxlc1tqXS5sb2N2YXJzW2tdLnR5cGUpO2srKykgewoJICAgIGlmIChsYW5nbG9jYWxlc1tqXS5sb2N2YXJzW2tdLnR5cGUgPT0gTENUeXBlKSB7CgkgICAgICBmb3VuZCA9IDE7CgkgICAgICByZXRTdHJpbmcgPSBsYW5nbG9jYWxlc1tqXS5sb2N2YXJzW2tdLnZhbDsKCSAgYnJlYWs7CgkgICAgfQoJICB9CiAgICAgICAgICBpZiAoZm91bmQpCgkgICAgYnJlYWs7Cgl9CiAgICAgIH0KCSAgLyogbGFuZ3VhZ2Ugbm90IGZvdW5kLCB0cnkgd2l0aG91dCBhIHN1Ymxhbmd1YWdlKi8KCSAgaWYgKGk9PTEpIGxhbmc9TUFLRUxBTkdJRCggUFJJTUFSWUxBTkdJRChsYW5nKSwgU1VCTEFOR19ERUZBVUxUKTsKCSAgLyogbWFzayB0aGUgTEMgVmFsdWUgKi8KCSAgaWYgKGk9PTIpIExDVHlwZSAmPSAweGZmZjsKICAgIH0KCiAgICBpZighZm91bmQpIHsKICAgICAgRVJSKG9sZSwiJyVzJyBub3Qgc3VwcG9ydGVkIGZvciB5b3VyIGxhbmd1YWdlICglMDRYKS5cbiIsCgkJCXJldFN0cmluZywoV09SRClsY2lkKTsKCQlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJCXJldHVybiAwOwkJCQoJfQogICAgLyogYSBGT05UU0lHTkFUVVJFIGlzIG5vdCBhIHN0cmluZywganVzdCA2IERXT1JEcyAgKi8KICAgIGlmIChMQ1R5cGUgPT0gTE9DQUxFX0ZPTlRTSUdOQVRVUkUpIHsKICAgICAgICBpZiAobGVuKQogICAgICAgICAgICBtZW1jcHkoYnVmLCByZXRTdHJpbmcsIChsZW48PXNpemVvZihGT05UU0lHTkFUVVJFKSk/bGVuOnNpemVvZihGT05UU0lHTkFUVVJFKSk7CiAgICAgICAgcmV0dXJuIHNpemVvZihGT05UU0lHTkFUVVJFKTsKICAgIH0KICAgIC8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgsIGRvbid0IHRvdWNoIHRoZSBidWZmZXIqLwogICAgaWYgKGxlbikgbHN0cmNweW5BKGJ1ZixyZXRTdHJpbmcsbGVuKTsKICAgIHJldHVybiBzdHJsZW4ocmV0U3RyaW5nKSsxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRMb2NhbGVJbmZvMzJXCVtLRVJORUwzMi4zNDNdCiAqCiAqIE5PVEVTCiAqICBNUyBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IGxlbiAic3BlY2lmaWVzIHRoZSBzaXplLCBpbiBieXRlcyAoQU5TSSB2ZXJzaW9uKQogKiAgb3IgY2hhcmFjdGVycyAoVW5pY29kZSB2ZXJzaW9uKSwgb2YiIHdidWYuIFRodXMgdGhlIG51bWJlciByZXR1cm5lZCBpcwogKiAgdGhlIHNhbWUgYmV0d2VlbiBHZXRMb2NhbGVJbmZvMzJXIGFuZCBHZXRMb2NhbGVJbmZvMzJBLgogKi8KSU5UIFdJTkFQSSBHZXRMb2NhbGVJbmZvVyhMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFdTVFIgd2J1ZixJTlQgbGVuKQp7CVdPUkQgd2xlbjsKCUxQU1RSIGFidWY7CgkKCWlmIChsZW4gJiYgKCEgd2J1ZikgKQoJeyBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgIHJldHVybiAwOwoJfQoKCWFidWYgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4pOwoJd2xlbiA9IEdldExvY2FsZUluZm9BKGxjaWQsIExDVHlwZSwgYWJ1ZiwgbGVuKTsKCglpZiAod2xlbiAmJiBsZW4pCS8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgqLwoJICBsc3RyY3B5bkF0b1cod2J1ZixhYnVmLGxlbik7CgoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGFidWYpOwoJcmV0dXJuIHdsZW47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldExvY2FsZUluZm9BCVtLRVJORUwzMi42NTZdCiAqLwpCT09MMTYgV0lOQVBJIFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpCnsKICAgIEZJWE1FKG9sZSwiKCVsZCwlbGQsJXMpOiBzdHViXG4iLGxjaWQsbGN0eXBlLGRhdGEpOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlzVmFsaWRMb2NhbGUJW0tFUk5FTDMyLjQ4OV0KICovCkJPT0wgV0lOQVBJIElzVmFsaWRMb2NhbGUoTENJRCBsY2lkLERXT1JEIGZsYWdzKQp7CgkvKiB3ZSBzdXBwb3J0IEFOWSBsYW5ndWFnZS4gV2VsbCwgYXQgbGVhc3Qgc2F5IHRoYXQuLi4qLwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1TeXN0ZW1Mb2NhbGVzMzJXCVtLRVJORUwzMi4yMDldCiAqLwpCT09MIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlc1coIExPQ0FMRV9FTlVNUFJPQ1cgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzICkKewoJaW50CWk7CglCT09MCXJldDsKCVdDSEFSCWJ1ZmZlclsyMDBdOwoJSEtFWQl4aGtleTsKCglUUkFDRSh3aW4zMiwiKCVwLCUwOGx4KVxuIixscGZuTG9jYWxlRW51bSxmbGFncyApOwoJLyogc2VlIGlmIHdlIGNhbiByZXVzZSB0aGUgV2luOTUgcmVnaXN0cnkgZW50cmllcy4uLi4gKi8KCWlmIChFUlJPUl9TVUNDRVNTPT1SZWdPcGVuS2V5QShIS0VZX0xPQ0FMX01BQ0hJTkUsIlN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwiLCZ4aGtleSkpIHsKCQlpPTA7CgkJd2hpbGUgKDEpIHsKCQkJaWYgKEVSUk9SX1NVQ0NFU1MhPVJlZ0VudW1LZXlXKHhoa2V5LGksYnVmZmVyLHNpemVvZihidWZmZXIpKSkKCQkJCWJyZWFrOwogICAgICAgICAgICAJCWlmICghbHBmbkxvY2FsZUVudW0oYnVmZmVyKSkKCQkJCWJyZWFrOwoJCQlpKys7CgkJfQoJCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKCQlyZXR1cm4gVFJVRTsKCX0KCglpPTA7Cgl3aGlsZSAobGFuZ3VhZ2VzW2ldLmxhbmdpZCE9MCkKICAgICAgICB7CiAgICAgICAgICAgIExQV1NUUiBjcDsKCSAgICBjaGFyICAgeGJ1ZmZlclsxMF07CiAgCQoJICAgIHNwcmludGYoeGJ1ZmZlciwiJTA4bHgiLChEV09SRClsYW5ndWFnZXNbaV0ubGFuZ2lkKTsKCgkgICAgY3AgPSBIRUFQX3N0cmR1cEF0b1coIEdldFByb2Nlc3NIZWFwKCksIDAsIHhidWZmZXIgKTsKICAgICAgICAgICAgcmV0ID0gbHBmbkxvY2FsZUVudW0oY3ApOwogICAgICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY3AgKTsKICAgICAgICAgICAgaWYgKCFyZXQpIGJyZWFrOwogICAgICAgICAgICBpKys7Cgl9CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bVN5c3RlbUxvY2FsZXMzMkEJW0tFUk5FTDMyLjIwOF0KICovCkJPT0wgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzQShMT0NBTEVfRU5VTVBST0NBIGxwZm5Mb2NhbGVFbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzKQp7CglpbnQJaTsKCUNIQVIJYnVmZmVyWzIwMF07CglIS0VZCXhoa2V5OwoKCVRSQUNFKHdpbjMyLCIoJXAsJTA4bHgpXG4iLAoJCWxwZm5Mb2NhbGVFbnVtLGZsYWdzCgkpOwoJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ09wZW5LZXlBKEhLRVlfTE9DQUxfTUFDSElORSwiU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCIsJnhoa2V5KSkgewoJCWk9MDsKCQl3aGlsZSAoMSkgewoJCQlpZiAoRVJST1JfU1VDQ0VTUyE9UmVnRW51bUtleUEoeGhrZXksaSxidWZmZXIsc2l6ZW9mKGJ1ZmZlcikpKQoJCQkJYnJlYWs7CiAgICAgICAgICAgIAkJaWYgKCFscGZuTG9jYWxlRW51bShidWZmZXIpKQoJCQkJYnJlYWs7CgkJCWkrKzsKCQl9CgkJUmVnQ2xvc2VLZXkoeGhrZXkpOwoJCXJldHVybiBUUlVFOwoJfQoJaT0wOwoJd2hpbGUgKGxhbmd1YWdlc1tpXS5sYW5naWQhPTApIHsKCQlzcHJpbnRmKGJ1ZmZlciwiJTA4bHgiLChEV09SRClsYW5ndWFnZXNbaV0ubGFuZ2lkKTsKCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCWJyZWFrOwoJCWkrKzsKCX0KCXJldHVybiBUUlVFOwp9CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBDVF9DVHlwZTJfTFVUW10gPSB7CiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA4ICovCiAgQzJfU0VHTUVOVFNFUEFSQVRPUiwgLyogICAtICAgOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDExICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAzMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMzEgKi8KICBDMl9XSElURVNQQUNFLCAvKiAgIC0gIDMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAhIC0gIDMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAjIC0gIDM1ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogJCAtICAzNiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICUgLSAgMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogJiAtICAzOCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogJyAtICAzOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKCAtICA0MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKSAtICA0MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKiAtICA0MiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICsgLSAgNDMgKi8KICBDMl9DT01NT05TRVBBUkFUT1IsIC8qICwgLSAgNDQgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAtIC0gIDQ1ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAuIC0gIDQ2ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAvIC0gIDQ3ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAwIC0gIDQ4ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAxIC0gIDQ5ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAyIC0gIDUwICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAzIC0gIDUxICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA0IC0gIDUyICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA1IC0gIDUzICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA2IC0gIDU0ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA3IC0gIDU1ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA4IC0gIDU2ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA5IC0gIDU3ICovCiAgQzJfQ09NTU9OU0VQQVJBVE9SLCAvKiA6IC0gIDU4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA7IC0gIDU5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA8IC0gIDYwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA9IC0gIDYxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA+IC0gIDYyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA/IC0gIDYzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEAgLSAgNjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQSAtICA2NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBCIC0gIDY2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEMgLSAgNjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRCAtICA2OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBFIC0gIDY5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEYgLSAgNzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRyAtICA3MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBIIC0gIDcyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEkgLSAgNzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSiAtICA3NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBLIC0gIDc1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEwgLSAgNzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTSAtICA3NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBOIC0gIDc4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE8gLSAgNzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUCAtICA4MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBRIC0gIDgxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFIgLSAgODIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUyAtICA4MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBUIC0gIDg0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFUgLSAgODUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogViAtICA4NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBXIC0gIDg3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFggLSAgODggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWSAtICA4OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBaIC0gIDkwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBbIC0gIDkxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBcIC0gIDkyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBdIC0gIDkzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBeIC0gIDk0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBfIC0gIDk1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBgIC0gIDk2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGEgLSAgOTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYiAtICA5OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBjIC0gIDk5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGQgLSAxMDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZSAtIDEwMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBmIC0gMTAyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGcgLSAxMDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaCAtIDEwNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBpIC0gMTA1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGogLSAxMDYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogayAtIDEwNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBsIC0gMTA4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG0gLSAxMDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbiAtIDExMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBvIC0gMTExICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHAgLSAxMTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcSAtIDExMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiByIC0gMTE0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHMgLSAxMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdCAtIDExNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB1IC0gMTE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHYgLSAxMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdyAtIDExOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB4IC0gMTIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHkgLSAxMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeiAtIDEyMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogeyAtIDEyMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfCAtIDEyNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfSAtIDEyNSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfiAtIDEyNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIH8gLSAxMjcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCAIC0gMTI4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyoggSAtIDEyOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoggiAtIDEzMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCDIC0gMTMxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCEIC0gMTMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCFIC0gMTMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCGIC0gMTM0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCHIC0gMTM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIggLSAxMzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCJIC0gMTM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIogLSAxMzggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIsgLSAxMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogjCAtIDE0MCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII0gLSAxNDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCOIC0gMTQyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjyAtIDE0MyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJAgLSAxNDQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJEgLSAxNDUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJIgLSAxNDYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJMgLSAxNDcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJQgLSAxNDggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJUgLSAxNDkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJYgLSAxNTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJcgLSAxNTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogmCAtIDE1MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogmSAtIDE1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCaIC0gMTU0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCbIC0gMTU1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJwgLSAxNTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCdIC0gMTU3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogniAtIDE1OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCfIC0gMTU5ICovCiAgQzJfV0hJVEVTUEFDRSwgLyogoCAtIDE2MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogoSAtIDE2MSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKIgLSAxNjIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCjIC0gMTYzICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogpCAtIDE2NCAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKUgLSAxNjUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKYgLSAxNjYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKcgLSAxNjcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKggLSAxNjggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKkgLSAxNjkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKogLSAxNzAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKsgLSAxNzEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKwgLSAxNzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK0gLSAxNzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK4gLSAxNzQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK8gLSAxNzUgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCwIC0gMTc2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogsSAtIDE3NyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsiAtIDE3OCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsyAtIDE3OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtCAtIDE4MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtSAtIDE4MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtiAtIDE4MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtyAtIDE4MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguCAtIDE4NCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyoguSAtIDE4NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguiAtIDE4NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguyAtIDE4NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvCAtIDE4OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvSAtIDE4OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogviAtIDE5MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvyAtIDE5MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDAIC0gMTkyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMEgLSAxOTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwiAtIDE5NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDDIC0gMTk1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMQgLSAxOTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxSAtIDE5NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDGIC0gMTk4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMcgLSAxOTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyCAtIDIwMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDJIC0gMjAxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMogLSAyMDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyyAtIDIwMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDMIC0gMjA0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM0gLSAyMDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogziAtIDIwNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDPIC0gMjA3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINAgLSAyMDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0SAtIDIwOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDSIC0gMjEwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINMgLSAyMTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1CAtIDIxMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDVIC0gMjEzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINYgLSAyMTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qINcgLSAyMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2CAtIDIxNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDZIC0gMjE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINogLSAyMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2yAtIDIxOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDcIC0gMjIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN0gLSAyMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3iAtIDIyMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDfIC0gMjIzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOAgLSAyMjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4SAtIDIyNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDiIC0gMjI2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOMgLSAyMjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5CAtIDIyOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDlIC0gMjI5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOYgLSAyMzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5yAtIDIzMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDoIC0gMjMyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOkgLSAyMzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6iAtIDIzNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDrIC0gMjM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOwgLSAyMzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7SAtIDIzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDuIC0gMjM4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO8gLSAyMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8CAtIDI0MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDxIC0gMjQxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPIgLSAyNDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8yAtIDI0MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD0IC0gMjQ0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPUgLSAyNDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9iAtIDI0NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyog9yAtIDI0NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD4IC0gMjQ4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPkgLSAyNDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+iAtIDI1MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD7IC0gMjUxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPwgLSAyNTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/SAtIDI1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD+IC0gMjU0ICovCiAgQzJfTEVGVFRPUklHSFQgLyog/yAtIDI1NSAqLwp9OwoKY29uc3QgV09SRCBPTEUyTkxTX0NUX0NUeXBlM19MVVRbXSA9IHsgCiAgMHgwMDAwLCAvKiAgIC0gICAwICovCiAgMHgwMDAwLCAvKiAgIC0gICAxICovCiAgMHgwMDAwLCAvKiAgIC0gICAyICovCiAgMHgwMDAwLCAvKiAgIC0gICAzICovCiAgMHgwMDAwLCAvKiAgIC0gICA0ICovCiAgMHgwMDAwLCAvKiAgIC0gICA1ICovCiAgMHgwMDAwLCAvKiAgIC0gICA2ICovCiAgMHgwMDAwLCAvKiAgIC0gICA3ICovCiAgMHgwMDAwLCAvKiAgIC0gICA4ICovCiAgMHgwMDA4LCAvKiAgIC0gICA5ICovCiAgMHgwMDA4LCAvKiAgIC0gIDEwICovCiAgMHgwMDA4LCAvKiAgIC0gIDExICovCiAgMHgwMDA4LCAvKiAgIC0gIDEyICovCiAgMHgwMDA4LCAvKiAgIC0gIDEzICovCiAgMHgwMDAwLCAvKiAgIC0gIDE0ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE1ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE2ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE3ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE4ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE5ICovCiAgMHgwMDAwLCAvKiAgIC0gIDIwICovCiAgMHgwMDAwLCAvKiAgIC0gIDIxICovCiAgMHgwMDAwLCAvKiAgIC0gIDIyICovCiAgMHgwMDAwLCAvKiAgIC0gIDIzICovCiAgMHgwMDAwLCAvKiAgIC0gIDI0ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI1ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI2ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI3ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI4ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI5ICovCiAgMHgwMDAwLCAvKiAgIC0gIDMwICovCiAgMHgwMDAwLCAvKiAgIC0gIDMxICovCiAgMHgwMDQ4LCAvKiAgIC0gIDMyICovCiAgMHgwMDQ4LCAvKiAhIC0gIDMzICovCiAgMHgwNDQ4LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICAweDAwNDgsIC8qICMgLSAgMzUgKi8KICAweDA0NDgsIC8qICQgLSAgMzYgKi8KICAweDAwNDgsIC8qICUgLSAgMzcgKi8KICAweDAwNDgsIC8qICYgLSAgMzggKi8KICAweDA0NDAsIC8qICcgLSAgMzkgKi8KICAweDAwNDgsIC8qICggLSAgNDAgKi8KICAweDAwNDgsIC8qICkgLSAgNDEgKi8KICAweDAwNDgsIC8qICogLSAgNDIgKi8KICAweDAwNDgsIC8qICsgLSAgNDMgKi8KICAweDAwNDgsIC8qICwgLSAgNDQgKi8KICAweDA0NDAsIC8qIC0gLSAgNDUgKi8KICAweDAwNDgsIC8qIC4gLSAgNDYgKi8KICAweDA0NDgsIC8qIC8gLSAgNDcgKi8KICAweDAwNDAsIC8qIDAgLSAgNDggKi8KICAweDAwNDAsIC8qIDEgLSAgNDkgKi8KICAweDAwNDAsIC8qIDIgLSAgNTAgKi8KICAweDAwNDAsIC8qIDMgLSAgNTEgKi8KICAweDAwNDAsIC8qIDQgLSAgNTIgKi8KICAweDAwNDAsIC8qIDUgLSAgNTMgKi8KICAweDAwNDAsIC8qIDYgLSAgNTQgKi8KICAweDAwNDAsIC8qIDcgLSAgNTUgKi8KICAweDAwNDAsIC8qIDggLSAgNTYgKi8KICAweDAwNDAsIC8qIDkgLSAgNTcgKi8KICAweDAwNDgsIC8qIDogLSAgNTggKi8KICAweDAwNDgsIC8qIDsgLSAgNTkgKi8KICAweDAwNDgsIC8qIDwgLSAgNjAgKi8KICAweDA0NDgsIC8qID0gLSAgNjEgKi8KICAweDAwNDgsIC8qID4gLSAgNjIgKi8KICAweDAwNDgsIC8qID8gLSAgNjMgKi8KICAweDA0NDgsIC8qIEAgLSAgNjQgKi8KICAweDgwNDAsIC8qIEEgLSAgNjUgKi8KICAweDgwNDAsIC8qIEIgLSAgNjYgKi8KICAweDgwNDAsIC8qIEMgLSAgNjcgKi8KICAweDgwNDAsIC8qIEQgLSAgNjggKi8KICAweDgwNDAsIC8qIEUgLSAgNjkgKi8KICAweDgwNDAsIC8qIEYgLSAgNzAgKi8KICAweDgwNDAsIC8qIEcgLSAgNzEgKi8KICAweDgwNDAsIC8qIEggLSAgNzIgKi8KICAweDgwNDAsIC8qIEkgLSAgNzMgKi8KICAweDgwNDAsIC8qIEogLSAgNzQgKi8KICAweDgwNDAsIC8qIEsgLSAgNzUgKi8KICAweDgwNDAsIC8qIEwgLSAgNzYgKi8KICAweDgwNDAsIC8qIE0gLSAgNzcgKi8KICAweDgwNDAsIC8qIE4gLSAgNzggKi8KICAweDgwNDAsIC8qIE8gLSAgNzkgKi8KICAweDgwNDAsIC8qIFAgLSAgODAgKi8KICAweDgwNDAsIC8qIFEgLSAgODEgKi8KICAweDgwNDAsIC8qIFIgLSAgODIgKi8KICAweDgwNDAsIC8qIFMgLSAgODMgKi8KICAweDgwNDAsIC8qIFQgLSAgODQgKi8KICAweDgwNDAsIC8qIFUgLSAgODUgKi8KICAweDgwNDAsIC8qIFYgLSAgODYgKi8KICAweDgwNDAsIC8qIFcgLSAgODcgKi8KICAweDgwNDAsIC8qIFggLSAgODggKi8KICAweDgwNDAsIC8qIFkgLSAgODkgKi8KICAweDgwNDAsIC8qIFogLSAgOTAgKi8KICAweDAwNDgsIC8qIFsgLSAgOTEgKi8KICAweDA0NDgsIC8qIFwgLSAgOTIgKi8KICAweDAwNDgsIC8qIF0gLSAgOTMgKi8KICAweDA0NDgsIC8qIF4gLSAgOTQgKi8KICAweDA0NDgsIC8qIF8gLSAgOTUgKi8KICAweDA0NDgsIC8qIGAgLSAgOTYgKi8KICAweDgwNDAsIC8qIGEgLSAgOTcgKi8KICAweDgwNDAsIC8qIGIgLSAgOTggKi8KICAweDgwNDAsIC8qIGMgLSAgOTkgKi8KICAweDgwNDAsIC8qIGQgLSAxMDAgKi8KICAweDgwNDAsIC8qIGUgLSAxMDEgKi8KICAweDgwNDAsIC8qIGYgLSAxMDIgKi8KICAweDgwNDAsIC8qIGcgLSAxMDMgKi8KICAweDgwNDAsIC8qIGggLSAxMDQgKi8KICAweDgwNDAsIC8qIGkgLSAxMDUgKi8KICAweDgwNDAsIC8qIGogLSAxMDYgKi8KICAweDgwNDAsIC8qIGsgLSAxMDcgKi8KICAweDgwNDAsIC8qIGwgLSAxMDggKi8KICAweDgwNDAsIC8qIG0gLSAxMDkgKi8KICAweDgwNDAsIC8qIG4gLSAxMTAgKi8KICAweDgwNDAsIC8qIG8gLSAxMTEgKi8KICAweDgwNDAsIC8qIHAgLSAxMTIgKi8KICAweDgwNDAsIC8qIHEgLSAxMTMgKi8KICAweDgwNDAsIC8qIHIgLSAxMTQgKi8KICAweDgwNDAsIC8qIHMgLSAxMTUgKi8KICAweDgwNDAsIC8qIHQgLSAxMTYgKi8KICAweDgwNDAsIC8qIHUgLSAxMTcgKi8KICAweDgwNDAsIC8qIHYgLSAxMTggKi8KICAweDgwNDAsIC8qIHcgLSAxMTkgKi8KICAweDgwNDAsIC8qIHggLSAxMjAgKi8KICAweDgwNDAsIC8qIHkgLSAxMjEgKi8KICAweDgwNDAsIC8qIHogLSAxMjIgKi8KICAweDAwNDgsIC8qIHsgLSAxMjMgKi8KICAweDAwNDgsIC8qIHwgLSAxMjQgKi8KICAweDAwNDgsIC8qIH0gLSAxMjUgKi8KICAweDA0NDgsIC8qIH4gLSAxMjYgKi8KICAweDAwMDAsIC8qIH8gLSAxMjcgKi8KICAweDAwMDAsIC8qIIAgLSAxMjggKi8KICAweDAwMDAsIC8qIIEgLSAxMjkgKi8KICAweDAwMDgsIC8qIIIgLSAxMzAgKi8KICAweDgwMDAsIC8qIIMgLSAxMzEgKi8KICAweDAwMDgsIC8qIIQgLSAxMzIgKi8KICAweDAwMDgsIC8qIIUgLSAxMzMgKi8KICAweDAwMDgsIC8qIIYgLSAxMzQgKi8KICAweDAwMDgsIC8qIIcgLSAxMzUgKi8KICAweDAwMDEsIC8qIIggLSAxMzYgKi8KICAweDAwMDgsIC8qIIkgLSAxMzcgKi8KICAweDgwMDMsIC8qIIogLSAxMzggKi8KICAweDAwMDgsIC8qIIsgLSAxMzkgKi8KICAweDgwMDAsIC8qIIwgLSAxNDAgKi8KICAweDAwMDAsIC8qII0gLSAxNDEgKi8KICAweDAwMDAsIC8qII4gLSAxNDIgKi8KICAweDAwMDAsIC8qII8gLSAxNDMgKi8KICAweDAwMDAsIC8qIJAgLSAxNDQgKi8KICAweDAwODgsIC8qIJEgLSAxNDUgKi8KICAweDAwODgsIC8qIJIgLSAxNDYgKi8KICAweDAwODgsIC8qIJMgLSAxNDcgKi8KICAweDAwODgsIC8qIJQgLSAxNDggKi8KICAweDAwMDgsIC8qIJUgLSAxNDkgKi8KICAweDA0MDAsIC8qIJYgLSAxNTAgKi8KICAweDA0MDAsIC8qIJcgLSAxNTEgKi8KICAweDA0MDgsIC8qIJggLSAxNTIgKi8KICAweDAwMDAsIC8qIJkgLSAxNTMgKi8KICAweDgwMDMsIC8qIJogLSAxNTQgKi8KICAweDAwMDgsIC8qIJsgLSAxNTUgKi8KICAweDgwMDAsIC8qIJwgLSAxNTYgKi8KICAweDAwMDAsIC8qIJ0gLSAxNTcgKi8KICAweDAwMDAsIC8qIJ4gLSAxNTggKi8KICAweDgwMDMsIC8qIJ8gLSAxNTkgKi8KICAweDAwMDgsIC8qIKAgLSAxNjAgKi8KICAweDAwMDgsIC8qIKEgLSAxNjEgKi8KICAweDAwNDgsIC8qIKIgLSAxNjIgKi8KICAweDAwNDgsIC8qIKMgLSAxNjMgKi8KICAweDAwMDgsIC8qIKQgLSAxNjQgKi8KICAweDAwNDgsIC8qIKUgLSAxNjUgKi8KICAweDAwNDgsIC8qIKYgLSAxNjYgKi8KICAweDAwMDgsIC8qIKcgLSAxNjcgKi8KICAweDA0MDgsIC8qIKggLSAxNjggKi8KICAweDAwMDgsIC8qIKkgLSAxNjkgKi8KICAweDA0MDAsIC8qIKogLSAxNzAgKi8KICAweDAwMDgsIC8qIKsgLSAxNzEgKi8KICAweDAwNDgsIC8qIKwgLSAxNzIgKi8KICAweDA0MDgsIC8qIK0gLSAxNzMgKi8KICAweDAwMDgsIC8qIK4gLSAxNzQgKi8KICAweDA0NDgsIC8qIK8gLSAxNzUgKi8KICAweDAwMDgsIC8qILAgLSAxNzYgKi8KICAweDAwMDgsIC8qILEgLSAxNzcgKi8KICAweDAwMDAsIC8qILIgLSAxNzggKi8KICAweDAwMDAsIC8qILMgLSAxNzkgKi8KICAweDA0MDgsIC8qILQgLSAxODAgKi8KICAweDAwMDgsIC8qILUgLSAxODEgKi8KICAweDAwMDgsIC8qILYgLSAxODIgKi8KICAweDAwMDgsIC8qILcgLSAxODMgKi8KICAweDA0MDgsIC8qILggLSAxODQgKi8KICAweDAwMDAsIC8qILkgLSAxODUgKi8KICAweDA0MDAsIC8qILogLSAxODYgKi8KICAweDAwMDgsIC8qILsgLSAxODcgKi8KICAweDAwMDAsIC8qILwgLSAxODggKi8KICAweDAwMDAsIC8qIL0gLSAxODkgKi8KICAweDAwMDAsIC8qIL4gLSAxOTAgKi8KICAweDAwMDgsIC8qIL8gLSAxOTEgKi8KICAweDgwMDMsIC8qIMAgLSAxOTIgKi8KICAweDgwMDMsIC8qIMEgLSAxOTMgKi8KICAweDgwMDMsIC8qIMIgLSAxOTQgKi8KICAweDgwMDMsIC8qIMMgLSAxOTUgKi8KICAweDgwMDMsIC8qIMQgLSAxOTYgKi8KICAweDgwMDMsIC8qIMUgLSAxOTcgKi8KICAweDgwMDAsIC8qIMYgLSAxOTggKi8KICAweDgwMDMsIC8qIMcgLSAxOTkgKi8KICAweDgwMDMsIC8qIMggLSAyMDAgKi8KICAweDgwMDMsIC8qIMkgLSAyMDEgKi8KICAweDgwMDMsIC8qIMogLSAyMDIgKi8KICAweDgwMDMsIC8qIMsgLSAyMDMgKi8KICAweDgwMDMsIC8qIMwgLSAyMDQgKi8KICAweDgwMDMsIC8qIM0gLSAyMDUgKi8KICAweDgwMDMsIC8qIM4gLSAyMDYgKi8KICAweDgwMDMsIC8qIM8gLSAyMDcgKi8KICAweDgwMDAsIC8qINAgLSAyMDggKi8KICAweDgwMDMsIC8qINEgLSAyMDkgKi8KICAweDgwMDMsIC8qINIgLSAyMTAgKi8KICAweDgwMDMsIC8qINMgLSAyMTEgKi8KICAweDgwMDMsIC8qINQgLSAyMTIgKi8KICAweDgwMDMsIC8qINUgLSAyMTMgKi8KICAweDgwMDMsIC8qINYgLSAyMTQgKi8KICAweDAwMDgsIC8qINcgLSAyMTUgKi8KICAweDgwMDMsIC8qINggLSAyMTYgKi8KICAweDgwMDMsIC8qINkgLSAyMTcgKi8KICAweDgwMDMsIC8qINogLSAyMTggKi8KICAweDgwMDMsIC8qINsgLSAyMTkgKi8KICAweDgwMDMsIC8qINwgLSAyMjAgKi8KICAweDgwMDMsIC8qIN0gLSAyMjEgKi8KICAweDgwMDAsIC8qIN4gLSAyMjIgKi8KICAweDgwMDAsIC8qIN8gLSAyMjMgKi8KICAweDgwMDMsIC8qIOAgLSAyMjQgKi8KICAweDgwMDMsIC8qIOEgLSAyMjUgKi8KICAweDgwMDMsIC8qIOIgLSAyMjYgKi8KICAweDgwMDMsIC8qIOMgLSAyMjcgKi8KICAweDgwMDMsIC8qIOQgLSAyMjggKi8KICAweDgwMDMsIC8qIOUgLSAyMjkgKi8KICAweDgwMDAsIC8qIOYgLSAyMzAgKi8KICAweDgwMDMsIC8qIOcgLSAyMzEgKi8KICAweDgwMDMsIC8qIOggLSAyMzIgKi8KICAweDgwMDMsIC8qIOkgLSAyMzMgKi8KICAweDgwMDMsIC8qIOogLSAyMzQgKi8KICAweDgwMDMsIC8qIOsgLSAyMzUgKi8KICAweDgwMDMsIC8qIOwgLSAyMzYgKi8KICAweDgwMDMsIC8qIO0gLSAyMzcgKi8KICAweDgwMDMsIC8qIO4gLSAyMzggKi8KICAweDgwMDMsIC8qIO8gLSAyMzkgKi8KICAweDgwMDAsIC8qIPAgLSAyNDAgKi8KICAweDgwMDMsIC8qIPEgLSAyNDEgKi8KICAweDgwMDMsIC8qIPIgLSAyNDIgKi8KICAweDgwMDMsIC8qIPMgLSAyNDMgKi8KICAweDgwMDMsIC8qIPQgLSAyNDQgKi8KICAweDgwMDMsIC8qIPUgLSAyNDUgKi8KICAweDgwMDMsIC8qIPYgLSAyNDYgKi8KICAweDAwMDgsIC8qIPcgLSAyNDcgKi8KICAweDgwMDMsIC8qIPggLSAyNDggKi8KICAweDgwMDMsIC8qIPkgLSAyNDkgKi8KICAweDgwMDMsIC8qIPogLSAyNTAgKi8KICAweDgwMDMsIC8qIPsgLSAyNTEgKi8KICAweDgwMDMsIC8qIPwgLSAyNTIgKi8KICAweDgwMDMsIC8qIP0gLSAyNTMgKi8KICAweDgwMDAsIC8qIP4gLSAyNTQgKi8KICAweDgwMDMgIC8qIP8gLSAyNTUgKi8KfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGUxNglbT0xFMk5MUy43XQogKi8KQk9PTDE2IFdJTkFQSSBHZXRTdHJpbmdUeXBlMTYoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglyZXR1cm4gR2V0U3RyaW5nVHlwZUV4QShsb2NhbGUsZHdJbmZvVHlwZSxzcmMsY2NoU3JjLGNoYXJ0eXBlKTsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTdHJpbmdUeXBlMzJBCVtLRVJORUwzMi4zOTZdCiAqLwpCT09MIFdJTkFQSSBHZXRTdHJpbmdUeXBlQShMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJcmV0dXJuIEdldFN0cmluZ1R5cGVFeEEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVFeDMyQQlbS0VSTkVMMzIuMzk3XQogKgogKiBGSVhNRTogSWdub3JlcyB0aGUgbG9jYWxlLgogKi8KQk9PTCBXSU5BUEkgR2V0U3RyaW5nVHlwZUV4QShMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglpbnQJaTsKCQoJaWYgKChzcmM9PU5VTEwpIHx8IChjaGFydHlwZT09TlVMTCkgfHwgKHNyYz09KExQU1RSKWNoYXJ0eXBlKSkKCXsKCSAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCSAgcmV0dXJuIEZBTFNFOwoJfQoKCWlmIChjY2hTcmM9PS0xKQoJICBjY2hTcmM9bHN0cmxlbkEoc3JjKSsxOwoJICAKCXN3aXRjaCAoZHdJbmZvVHlwZSkgewoJY2FzZSBDVF9DVFlQRTE6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXSA9IDA7CgkgICAgaWYgKGlzZGlnaXQoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0RJR0lUOwoJICAgIGlmIChpc2FscGhhKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9BTFBIQTsKCSAgICBpZiAoaXNsb3dlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfTE9XRVI7CgkgICAgaWYgKGlzdXBwZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1VQUEVSOwoJICAgIGlmIChpc3NwYWNlKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9TUEFDRTsKCSAgICBpZiAoaXNwdW5jdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfUFVOQ1Q7CgkgICAgaWYgKGlzY250cmwoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0NOVFJMOwovKiBGSVhNRTogaXNibGFuaygpIGlzIGEgR05VIGV4dGVuc2lvbiAqLwovKgkJaWYgKGlzYmxhbmsoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOyAqLwoJICAgIGlmICgoc3JjW2ldID09ICcgJykgfHwgKHNyY1tpXSA9PSAnXHQnKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOwoJICAgIC8qIEMxX1hESUdJVCAqLwoJfQoJcmV0dXJuIFRSVUU7CgoJY2FzZSBDVF9DVFlQRTI6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXT0oV09SRClDVF9DVHlwZTJfTFVUW2ldOwoJICB9CgkgIHJldHVybiBUUlVFOwoKCWNhc2UgQ1RfQ1RZUEUzOgoJICBmb3IgKGk9MDtpPGNjaFNyYztpKyspIAoJICB7CgkgICAgY2hhcnR5cGVbaV09T0xFMk5MU19DVF9DVHlwZTNfTFVUW2ldOwoJICB9CgkgIHJldHVybiBUUlVFOwoKCWRlZmF1bHQ6CgkgIEVSUihvbGUsIlVua25vd24gZHdJbmZvVHlwZTolbGRcbiIsZHdJbmZvVHlwZSk7CgkgIHJldHVybiBGQUxTRTsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZTMyVwlbS0VSTkVMMzIuMzk5XQogKgogKiBOT1RFUwogKiBZZXMsIHRoaXMgaXMgbWlzc2luZyBMQ0lEIGxvY2FsZS4gTVMgZmF1bHQuCiAqLwpCT09MIFdJTkFQSSBHZXRTdHJpbmdUeXBlVyhEV09SRCBkd0luZm9UeXBlLExQQ1dTVFIgc3JjLElOVCBjY2hTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXhXKDAvKmRlZmF1bHRsb2NhbGUqLyxkd0luZm9UeXBlLHNyYyxjY2hTcmMsY2hhcnR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTdHJpbmdUeXBlRXgzMlcJW0tFUk5FTDMyLjM5OF0KICoKICogRklYTUU6IHVuaWNvZGUgY2hhcnMgYXJlIGFzc3VtZWQgY2hhcnMKICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVFeFcoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENXU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCWludAlpOwoKCglpZiAoY2NoU3JjPT0tMSkKCSAgY2NoU3JjPWxzdHJsZW5XKHNyYykrMTsKCQoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMjoKCQlGSVhNRShvbGUsIkNUX0NUWVBFMiBub3Qgc3VwcG9ydGVkLlxuIik7CgkJcmV0dXJuIEZBTFNFOwoJY2FzZSBDVF9DVFlQRTM6CgkJRklYTUUob2xlLCJDVF9DVFlQRTMgbm90IHN1cHBvcnRlZC5cbiIpOwoJCXJldHVybiBGQUxTRTsKCWRlZmF1bHQ6YnJlYWs7Cgl9Cglmb3IgKGk9MDtpPGNjaFNyYztpKyspIHsKCQljaGFydHlwZVtpXSA9IDA7CgkJaWYgKGlzZGlnaXQoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0RJR0lUOwoJCWlmIChpc2FscGhhKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9BTFBIQTsKCQlpZiAoaXNsb3dlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfTE9XRVI7CgkJaWYgKGlzdXBwZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1VQUEVSOwoJCWlmIChpc3NwYWNlKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9TUEFDRTsKCQlpZiAoaXNwdW5jdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfUFVOQ1Q7CgkJaWYgKGlzY250cmwoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0NOVFJMOwovKiBGSVhNRTogaXNibGFuaygpIGlzIGEgR05VIGV4dGVuc2lvbiAqLwovKgkJaWYgKGlzYmxhbmsoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOyAqLwogICAgICAgICAgICAgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkJLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFdJTkVfR2V0TGFuZ3VhZ2VOYW1lICAgW2ludGVybmFsXSAKICoKICogRklYTUU6ICBXaW5kb3dzIGtlZXBzIGxhbmd1YWdlIG5hbWVzIGluIGEgc3RyaW5nIHRhYmxlCiAqICAgICAgICAgcmVzb3VyY2UgaW4gVkVSLkRMTCAuLi4KICovCkxQQ1NUUiBXSU5FX0dldExhbmd1YWdlTmFtZSggVUlOVCBsYW5naWQgKQp7CiAgICBpbnQgaTsKICAgIGZvciAoIGkgPSAwOyBsYW5ndWFnZXNbaV0ubGFuZ2lkICE9IDA7IGkrKyApCiAgICAgICAgaWYgKCBsYW5naWQgPT0gbGFuZ3VhZ2VzW2ldLmxhbmdpZCApCiAgICAgICAgICAgIGJyZWFrOwoKICAgIHJldHVybiBsYW5ndWFnZXNbaV0ubGFuZ25hbWU7Cn0KIApzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRbXSA9IHsKICA2ICAgICAgLCAgIDMsIC8qICAgLSAgIDEgKi8gIAogIDYgICAgICAsICAgNCwgLyogICAtICAgMiAqLyAgCiAgNiAgICAgICwgICA1LCAvKiAgIC0gICAzICovICAKICA2ICAgICAgLCAgIDYsIC8qICAgLSAgIDQgKi8gIAogIDYgICAgICAsICAgNywgLyogICAtICAgNSAqLyAgCiAgNiAgICAgICwgICA4LCAvKiAgIC0gICA2ICovICAKICA2ICAgICAgLCAgIDksIC8qICAgLSAgIDcgKi8gIAogIDYgICAgICAsICAxMCwgLyogICAtICAgOCAqLyAgCiAgNyAgICAgICwgICA1LCAvKiAgIC0gICA5ICovICAKICA3ICAgICAgLCAgIDYsIC8qICAgLSAgMTAgKi8gIAogIDcgICAgICAsICAgNywgLyogICAtICAxMSAqLyAgCiAgNyAgICAgICwgICA4LCAvKiAgIC0gIDEyICovICAKICA3ICAgICAgLCAgIDksIC8qICAgLSAgMTMgKi8gIAogIDYgICAgICAsICAxMSwgLyogICAtICAxNCAqLyAgCiAgNiAgICAgICwgIDEyLCAvKiAgIC0gIDE1ICovICAKICA2ICAgICAgLCAgMTMsIC8qICAgLSAgMTYgKi8gIAogIDYgICAgICAsICAxNCwgLyogICAtICAxNyAqLyAgCiAgNiAgICAgICwgIDE1LCAvKiAgIC0gIDE4ICovICAKICA2ICAgICAgLCAgMTYsIC8qICAgLSAgMTkgKi8gIAogIDYgICAgICAsICAxNywgLyogICAtICAyMCAqLyAgCiAgNiAgICAgICwgIDE4LCAvKiAgIC0gIDIxICovICAKICA2ICAgICAgLCAgMTksIC8qICAgLSAgMjIgKi8gIAogIDYgICAgICAsICAyMCwgLyogICAtICAyMyAqLyAgCiAgNiAgICAgICwgIDIxLCAvKiAgIC0gIDI0ICovICAKICA2ICAgICAgLCAgMjIsIC8qICAgLSAgMjUgKi8gIAogIDYgICAgICAsICAyMywgLyogICAtICAyNiAqLyAgCiAgNiAgICAgICwgIDI0LCAvKiAgIC0gIDI3ICovICAKICA2ICAgICAgLCAgMjUsIC8qICAgLSAgMjggKi8gIAogIDYgICAgICAsICAyNiwgLyogICAtICAyOSAqLyAgCiAgNiAgICAgICwgIDI3LCAvKiAgIC0gIDMwICovICAKICA2ICAgICAgLCAgMjgsIC8qICAgLSAgMzEgKi8gIAogIDcgICAgICAsICAgMiwgLyogICAtICAzMiAqLwogIDcgICAgICAsICAyOCwgLyogISAtICAzMyAqLwogIDcgICAgICAsICAyOSwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgNyAgICAgICwgIDMxLCAvKiAjIC0gIDM1ICovCiAgNyAgICAgICwgIDMzLCAvKiAkIC0gIDM2ICovCiAgNyAgICAgICwgIDM1LCAvKiAlIC0gIDM3ICovCiAgNyAgICAgICwgIDM3LCAvKiAmIC0gIDM4ICovCiAgNiAgICAgICwgMTI4LCAvKiAnIC0gIDM5ICovCiAgNyAgICAgICwgIDM5LCAvKiAoIC0gIDQwICovCiAgNyAgICAgICwgIDQyLCAvKiApIC0gIDQxICovCiAgNyAgICAgICwgIDQ1LCAvKiAqIC0gIDQyICovCiAgOCAgICAgICwgICAzLCAvKiArIC0gIDQzICovCiAgNyAgICAgICwgIDQ3LCAvKiAsIC0gIDQ0ICovCiAgNiAgICAgICwgMTMwLCAvKiAtIC0gIDQ1ICovCiAgNyAgICAgICwgIDUxLCAvKiAuIC0gIDQ2ICovCiAgNyAgICAgICwgIDUzLCAvKiAvIC0gIDQ3ICovCiAxMiAgICAgICwgICAzLCAvKiAwIC0gIDQ4ICovCiAxMiAgICAgICwgIDMzLCAvKiAxIC0gIDQ5ICovCiAxMiAgICAgICwgIDUxLCAvKiAyIC0gIDUwICovCiAxMiAgICAgICwgIDcwLCAvKiAzIC0gIDUxICovCiAxMiAgICAgICwgIDg4LCAvKiA0IC0gIDUyICovCiAxMiAgICAgICwgMTA2LCAvKiA1IC0gIDUzICovCiAxMiAgICAgICwgMTI1LCAvKiA2IC0gIDU0ICovCiAxMiAgICAgICwgMTQ0LCAvKiA3IC0gIDU1ICovCiAxMiAgICAgICwgMTYyLCAvKiA4IC0gIDU2ICovCiAxMiAgICAgICwgMTgwLCAvKiA5IC0gIDU3ICovCiAgNyAgICAgICwgIDU1LCAvKiA6IC0gIDU4ICovCiAgNyAgICAgICwgIDU4LCAvKiA7IC0gIDU5ICovCiAgOCAgICAgICwgIDE0LCAvKiA8IC0gIDYwICovCiAgOCAgICAgICwgIDE4LCAvKiA9IC0gIDYxICovCiAgOCAgICAgICwgIDIwLCAvKiA+IC0gIDYyICovCiAgNyAgICAgICwgIDYwLCAvKiA/IC0gIDYzICovCiAgNyAgICAgICwgIDYyLCAvKiBAIC0gIDY0ICovCiAxNCAgICAgICwgICAyLCAvKiBBIC0gIDY1ICovCiAxNCAgICAgICwgICA5LCAvKiBCIC0gIDY2ICovCiAxNCAgICAgICwgIDEwLCAvKiBDIC0gIDY3ICovCiAxNCAgICAgICwgIDI2LCAvKiBEIC0gIDY4ICovCiAxNCAgICAgICwgIDMzLCAvKiBFIC0gIDY5ICovCiAxNCAgICAgICwgIDM1LCAvKiBGIC0gIDcwICovCiAxNCAgICAgICwgIDM3LCAvKiBHIC0gIDcxICovCiAxNCAgICAgICwgIDQ0LCAvKiBIIC0gIDcyICovCiAxNCAgICAgICwgIDUwLCAvKiBJIC0gIDczICovCiAxNCAgICAgICwgIDUzLCAvKiBKIC0gIDc0ICovCiAxNCAgICAgICwgIDU0LCAvKiBLIC0gIDc1ICovCiAxNCAgICAgICwgIDcyLCAvKiBMIC0gIDc2ICovCiAxNCAgICAgICwgIDgxLCAvKiBNIC0gIDc3ICovCiAxNCAgICAgICwgMTEyLCAvKiBOIC0gIDc4ICovCiAxNCAgICAgICwgMTI0LCAvKiBPIC0gIDc5ICovCiAxNCAgICAgICwgMTI2LCAvKiBQIC0gIDgwICovCiAxNCAgICAgICwgMTM3LCAvKiBRIC0gIDgxICovCiAxNCAgICAgICwgMTM4LCAvKiBSIC0gIDgyICovCiAxNCAgICAgICwgMTQ1LCAvKiBTIC0gIDgzICovCiAxNCAgICAgICwgMTUzLCAvKiBUIC0gIDg0ICovCiAxNCAgICAgICwgMTU5LCAvKiBVIC0gIDg1ICovCiAxNCAgICAgICwgMTYyLCAvKiBWIC0gIDg2ICovCiAxNCAgICAgICwgMTY0LCAvKiBXIC0gIDg3ICovCiAxNCAgICAgICwgMTY2LCAvKiBYIC0gIDg4ICovCiAxNCAgICAgICwgMTY3LCAvKiBZIC0gIDg5ICovCiAxNCAgICAgICwgMTY5LCAvKiBaIC0gIDkwICovCiAgNyAgICAgICwgIDYzLCAvKiBbIC0gIDkxICovCiAgNyAgICAgICwgIDY1LCAvKiBcIC0gIDkyICovCiAgNyAgICAgICwgIDY2LCAvKiBdIC0gIDkzICovCiAgNyAgICAgICwgIDY3LCAvKiBeIC0gIDk0ICovCiAgNyAgICAgICwgIDY4LCAvKiBfIC0gIDk1ICovCiAgNyAgICAgICwgIDcyLCAvKiBgIC0gIDk2ICovCiAxNCAgICAgICwgICAyLCAvKiBhIC0gIDk3ICovCiAxNCAgICAgICwgICA5LCAvKiBiIC0gIDk4ICovCiAxNCAgICAgICwgIDEwLCAvKiBjIC0gIDk5ICovCiAxNCAgICAgICwgIDI2LCAvKiBkIC0gMTAwICovCiAxNCAgICAgICwgIDMzLCAvKiBlIC0gMTAxICovCiAxNCAgICAgICwgIDM1LCAvKiBmIC0gMTAyICovCiAxNCAgICAgICwgIDM3LCAvKiBnIC0gMTAzICovCiAxNCAgICAgICwgIDQ0LCAvKiBoIC0gMTA0ICovCiAxNCAgICAgICwgIDUwLCAvKiBpIC0gMTA1ICovCiAxNCAgICAgICwgIDUzLCAvKiBqIC0gMTA2ICovCiAxNCAgICAgICwgIDU0LCAvKiBrIC0gMTA3ICovCiAxNCAgICAgICwgIDcyLCAvKiBsIC0gMTA4ICovCiAxNCAgICAgICwgIDgxLCAvKiBtIC0gMTA5ICovCiAxNCAgICAgICwgMTEyLCAvKiBuIC0gMTEwICovCiAxNCAgICAgICwgMTI0LCAvKiBvIC0gMTExICovCiAxNCAgICAgICwgMTI2LCAvKiBwIC0gMTEyICovCiAxNCAgICAgICwgMTM3LCAvKiBxIC0gMTEzICovCiAxNCAgICAgICwgMTM4LCAvKiByIC0gMTE0ICovCiAxNCAgICAgICwgMTQ1LCAvKiBzIC0gMTE1ICovCiAxNCAgICAgICwgMTUzLCAvKiB0IC0gMTE2ICovCiAxNCAgICAgICwgMTU5LCAvKiB1IC0gMTE3ICovCiAxNCAgICAgICwgMTYyLCAvKiB2IC0gMTE4ICovCiAxNCAgICAgICwgMTY0LCAvKiB3IC0gMTE5ICovCiAxNCAgICAgICwgMTY2LCAvKiB4IC0gMTIwICovCiAxNCAgICAgICwgMTY3LCAvKiB5IC0gMTIxICovCiAxNCAgICAgICwgMTY5LCAvKiB6IC0gMTIyICovCiAgNyAgICAgICwgIDc0LCAvKiB7IC0gMTIzICovCiAgNyAgICAgICwgIDc2LCAvKiB8IC0gMTI0ICovCiAgNyAgICAgICwgIDc4LCAvKiB9IC0gMTI1ICovCiAgNyAgICAgICwgIDgwLCAvKiB+IC0gMTI2ICovCiAgNiAgICAgICwgIDI5LCAvKiB/IC0gMTI3ICovCiAgNiAgICAgICwgIDMwLCAvKiCAIC0gMTI4ICovCiAgNiAgICAgICwgIDMxLCAvKiCBIC0gMTI5ICovCiAgNyAgICAgICwgMTIzLCAvKiCCIC0gMTMwICovCiAxNCAgICAgICwgIDM1LCAvKiCDIC0gMTMxICovCiAgNyAgICAgICwgMTI3LCAvKiCEIC0gMTMyICovCiAxMCAgICAgICwgIDIxLCAvKiCFIC0gMTMzICovCiAxMCAgICAgICwgIDE1LCAvKiCGIC0gMTM0ICovCiAxMCAgICAgICwgIDE2LCAvKiCHIC0gMTM1ICovCiAgNyAgICAgICwgIDY3LCAvKiCIIC0gMTM2ICovCiAxMCAgICAgICwgIDIyLCAvKiCJIC0gMTM3ICovCiAxNCAgICAgICwgMTQ1LCAvKiCKIC0gMTM4ICovCiAgNyAgICAgICwgMTM2LCAvKiCLIC0gMTM5ICovCiAxNCArIDE2ICwgMTI0LCAvKiCMIC0gMTQwICovCiAgNiAgICAgICwgIDQzLCAvKiCNIC0gMTQxICovCiAgNiAgICAgICwgIDQ0LCAvKiCOIC0gMTQyICovCiAgNiAgICAgICwgIDQ1LCAvKiCPIC0gMTQzICovCiAgNiAgICAgICwgIDQ2LCAvKiCQIC0gMTQ0ICovCiAgNyAgICAgICwgMTIxLCAvKiCRIC0gMTQ1ICovCiAgNyAgICAgICwgMTIyLCAvKiCSIC0gMTQ2ICovCiAgNyAgICAgICwgMTI1LCAvKiCTIC0gMTQ3ICovCiAgNyAgICAgICwgMTI2LCAvKiCUIC0gMTQ4ICovCiAxMCAgICAgICwgIDE3LCAvKiCVIC0gMTQ5ICovCiAgNiAgICAgICwgMTM3LCAvKiCWIC0gMTUwICovCiAgNiAgICAgICwgMTM5LCAvKiCXIC0gMTUxICovCiAgNyAgICAgICwgIDkzLCAvKiCYIC0gMTUyICovCiAxNCAgICAgICwgMTU2LCAvKiCZIC0gMTUzICovCiAxNCAgICAgICwgMTQ1LCAvKiCaIC0gMTU0ICovCiAgNyAgICAgICwgMTM3LCAvKiCbIC0gMTU1ICovCiAxNCArIDE2ICwgMTI0LCAvKiCcIC0gMTU2ICovCiAgNiAgICAgICwgIDU5LCAvKiCdIC0gMTU3ICovCiAgNiAgICAgICwgIDYwLCAvKiCeIC0gMTU4ICovCiAxNCAgICAgICwgMTY3LCAvKiCfIC0gMTU5ICovCiAgNyAgICAgICwgICA0LCAvKiCgIC0gMTYwICovCiAgNyAgICAgICwgIDgxLCAvKiChIC0gMTYxICovCiAxMCAgICAgICwgICAyLCAvKiCiIC0gMTYyICovCiAxMCAgICAgICwgICAzLCAvKiCjIC0gMTYzICovCiAxMCAgICAgICwgICA0LCAvKiCkIC0gMTY0ICovCiAxMCAgICAgICwgICA1LCAvKiClIC0gMTY1ICovCiAgNyAgICAgICwgIDgyLCAvKiCmIC0gMTY2ICovCiAxMCAgICAgICwgICA2LCAvKiCnIC0gMTY3ICovCiAgNyAgICAgICwgIDgzLCAvKiCoIC0gMTY4ICovCiAxMCAgICAgICwgICA3LCAvKiCpIC0gMTY5ICovCiAxNCAgICAgICwgICAyLCAvKiCqIC0gMTcwICovCiAgOCAgICAgICwgIDI0LCAvKiCrIC0gMTcxICovCiAxMCAgICAgICwgICA4LCAvKiCsIC0gMTcyICovCiAgNiAgICAgICwgMTMxLCAvKiCtIC0gMTczICovCiAxMCAgICAgICwgICA5LCAvKiCuIC0gMTc0ICovCiAgNyAgICAgICwgIDg0LCAvKiCvIC0gMTc1ICovCiAxMCAgICAgICwgIDEwLCAvKiCwIC0gMTc2ICovCiAgOCAgICAgICwgIDIzLCAvKiCxIC0gMTc3ICovCiAxMiAgICAgICwgIDUxLCAvKiCyIC0gMTc4ICovCiAxMiAgICAgICwgIDcwLCAvKiCzIC0gMTc5ICovCiAgNyAgICAgICwgIDg1LCAvKiC0IC0gMTgwICovCiAxMCAgICAgICwgIDExLCAvKiC1IC0gMTgxICovCiAxMCAgICAgICwgIDEyLCAvKiC2IC0gMTgyICovCiAxMCAgICAgICwgIDEzLCAvKiC3IC0gMTgzICovCiAgNyAgICAgICwgIDg2LCAvKiC4IC0gMTg0ICovCiAxMiAgICAgICwgIDMzLCAvKiC5IC0gMTg1ICovCiAxNCAgICAgICwgMTI0LCAvKiC6IC0gMTg2ICovCiAgOCAgICAgICwgIDI2LCAvKiC7IC0gMTg3ICovCiAxMiAgICAgICwgIDIxLCAvKiC8IC0gMTg4ICovCiAxMiAgICAgICwgIDI1LCAvKiC9IC0gMTg5ICovCiAxMiAgICAgICwgIDI5LCAvKiC+IC0gMTkwICovCiAgNyAgICAgICwgIDg3LCAvKiC/IC0gMTkxICovCiAxNCAgICAgICwgICAyLCAvKiDAIC0gMTkyICovCiAxNCAgICAgICwgICAyLCAvKiDBIC0gMTkzICovCiAxNCAgICAgICwgICAyLCAvKiDCIC0gMTk0ICovCiAxNCAgICAgICwgICAyLCAvKiDDIC0gMTk1ICovCiAxNCAgICAgICwgICAyLCAvKiDEIC0gMTk2ICovCiAxNCAgICAgICwgICAyLCAvKiDFIC0gMTk3ICovCiAxNCArIDE2ICwgICAyLCAvKiDGIC0gMTk4ICovCiAxNCAgICAgICwgIDEwLCAvKiDHIC0gMTk5ICovCiAxNCAgICAgICwgIDMzLCAvKiDIIC0gMjAwICovCiAxNCAgICAgICwgIDMzLCAvKiDJIC0gMjAxICovCiAxNCAgICAgICwgIDMzLCAvKiDKIC0gMjAyICovCiAxNCAgICAgICwgIDMzLCAvKiDLIC0gMjAzICovCiAxNCAgICAgICwgIDUwLCAvKiDMIC0gMjA0ICovCiAxNCAgICAgICwgIDUwLCAvKiDNIC0gMjA1ICovCiAxNCAgICAgICwgIDUwLCAvKiDOIC0gMjA2ICovCiAxNCAgICAgICwgIDUwLCAvKiDPIC0gMjA3ICovCiAxNCAgICAgICwgIDI2LCAvKiDQIC0gMjA4ICovCiAxNCAgICAgICwgMTEyLCAvKiDRIC0gMjA5ICovCiAxNCAgICAgICwgMTI0LCAvKiDSIC0gMjEwICovCiAxNCAgICAgICwgMTI0LCAvKiDTIC0gMjExICovCiAxNCAgICAgICwgMTI0LCAvKiDUIC0gMjEyICovCiAxNCAgICAgICwgMTI0LCAvKiDVIC0gMjEzICovCiAxNCAgICAgICwgMTI0LCAvKiDWIC0gMjE0ICovCiAgOCAgICAgICwgIDI4LCAvKiDXIC0gMjE1ICovCiAxNCAgICAgICwgMTI0LCAvKiDYIC0gMjE2ICovCiAxNCAgICAgICwgMTU5LCAvKiDZIC0gMjE3ICovCiAxNCAgICAgICwgMTU5LCAvKiDaIC0gMjE4ICovCiAxNCAgICAgICwgMTU5LCAvKiDbIC0gMjE5ICovCiAxNCAgICAgICwgMTU5LCAvKiDcIC0gMjIwICovCiAxNCAgICAgICwgMTY3LCAvKiDdIC0gMjIxICovCiAxNCArIDMyICwgMTUzLCAvKiDeIC0gMjIyICovCiAxNCArIDQ4ICwgMTQ1LCAvKiDfIC0gMjIzICovCiAxNCAgICAgICwgICAyLCAvKiDgIC0gMjI0ICovCiAxNCAgICAgICwgICAyLCAvKiDhIC0gMjI1ICovCiAxNCAgICAgICwgICAyLCAvKiDiIC0gMjI2ICovCiAxNCAgICAgICwgICAyLCAvKiDjIC0gMjI3ICovCiAxNCAgICAgICwgICAyLCAvKiDkIC0gMjI4ICovCiAxNCAgICAgICwgICAyLCAvKiDlIC0gMjI5ICovCiAxNCArIDE2ICwgICAyLCAvKiDmIC0gMjMwICovCiAxNCAgICAgICwgIDEwLCAvKiDnIC0gMjMxICovCiAxNCAgICAgICwgIDMzLCAvKiDoIC0gMjMyICovCiAxNCAgICAgICwgIDMzLCAvKiDpIC0gMjMzICovCiAxNCAgICAgICwgIDMzLCAvKiDqIC0gMjM0ICovCiAxNCAgICAgICwgIDMzLCAvKiDrIC0gMjM1ICovCiAxNCAgICAgICwgIDUwLCAvKiDsIC0gMjM2ICovCiAxNCAgICAgICwgIDUwLCAvKiDtIC0gMjM3ICovCiAxNCAgICAgICwgIDUwLCAvKiDuIC0gMjM4ICovCiAxNCAgICAgICwgIDUwLCAvKiDvIC0gMjM5ICovCiAxNCAgICAgICwgIDI2LCAvKiDwIC0gMjQwICovCiAxNCAgICAgICwgMTEyLCAvKiDxIC0gMjQxICovCiAxNCAgICAgICwgMTI0LCAvKiDyIC0gMjQyICovCiAxNCAgICAgICwgMTI0LCAvKiDzIC0gMjQzICovCiAxNCAgICAgICwgMTI0LCAvKiD0IC0gMjQ0ICovCiAxNCAgICAgICwgMTI0LCAvKiD1IC0gMjQ1ICovCiAxNCAgICAgICwgMTI0LCAvKiD2IC0gMjQ2ICovCiAgOCAgICAgICwgIDI5LCAvKiD3IC0gMjQ3ICovCiAxNCAgICAgICwgMTI0LCAvKiD4IC0gMjQ4ICovCiAxNCAgICAgICwgMTU5LCAvKiD5IC0gMjQ5ICovCiAxNCAgICAgICwgMTU5LCAvKiD6IC0gMjUwICovCiAxNCAgICAgICwgMTU5LCAvKiD7IC0gMjUxICovCiAxNCAgICAgICwgMTU5LCAvKiD8IC0gMjUyICovCiAxNCAgICAgICwgMTY3LCAvKiD9IC0gMjUzICovCiAxNCArIDMyICwgMTUzLCAvKiD+IC0gMjU0ICovCiAxNCAgICAgICwgMTY3ICAvKiD/IC0gMjU1ICovIH07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRfMltdID0geyAzMywgNDQsIDE0NSB9OwoKI2RlZmluZSBMQ01fRGlhY3JpdGljX1N0YXJ0IDEzMQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX0RpYWNyaXRpY19MVVRbXSA9IHsgCjEyMywgIC8qIIMgLSAxMzEgKi8KICAyLCAgLyoghCAtIDEzMiAqLwogIDIsICAvKiCFIC0gMTMzICovCiAgMiwgIC8qIIYgLSAxMzQgKi8KICAyLCAgLyoghyAtIDEzNSAqLwogIDMsICAvKiCIIC0gMTM2ICovCiAgMiwgIC8qIIkgLSAxMzcgKi8KIDIwLCAgLyogiiAtIDEzOCAqLwogIDIsICAvKiCLIC0gMTM5ICovCiAgMiwgIC8qIIwgLSAxNDAgKi8KICAyLCAgLyogjSAtIDE0MSAqLwogIDIsICAvKiCOIC0gMTQyICovCiAgMiwgIC8qII8gLSAxNDMgKi8KICAyLCAgLyogkCAtIDE0NCAqLwogIDIsICAvKiCRIC0gMTQ1ICovCiAgMiwgIC8qIJIgLSAxNDYgKi8KICAyLCAgLyogkyAtIDE0NyAqLwogIDIsICAvKiCUIC0gMTQ4ICovCiAgMiwgIC8qIJUgLSAxNDkgKi8KICAyLCAgLyogliAtIDE1MCAqLwogIDIsICAvKiCXIC0gMTUxICovCiAgMiwgIC8qIJggLSAxNTIgKi8KICAyLCAgLyogmSAtIDE1MyAqLwogMjAsICAvKiCaIC0gMTU0ICovCiAgMiwgIC8qIJsgLSAxNTUgKi8KICAyLCAgLyognCAtIDE1NiAqLwogIDIsICAvKiCdIC0gMTU3ICovCiAgMiwgIC8qIJ4gLSAxNTggKi8KIDE5LCAgLyognyAtIDE1OSAqLwogIDIsICAvKiCgIC0gMTYwICovCiAgMiwgIC8qIKEgLSAxNjEgKi8KICAyLCAgLyogoiAtIDE2MiAqLwogIDIsICAvKiCjIC0gMTYzICovCiAgMiwgIC8qIKQgLSAxNjQgKi8KICAyLCAgLyogpSAtIDE2NSAqLwogIDIsICAvKiCmIC0gMTY2ICovCiAgMiwgIC8qIKcgLSAxNjcgKi8KICAyLCAgLyogqCAtIDE2OCAqLwogIDIsICAvKiCpIC0gMTY5ICovCiAgMywgIC8qIKogLSAxNzAgKi8KICAyLCAgLyogqyAtIDE3MSAqLwogIDIsICAvKiCsIC0gMTcyICovCiAgMiwgIC8qIK0gLSAxNzMgKi8KICAyLCAgLyogriAtIDE3NCAqLwogIDIsICAvKiCvIC0gMTc1ICovCiAgMiwgIC8qILAgLSAxNzYgKi8KICAyLCAgLyogsSAtIDE3NyAqLwogIDIsICAvKiCyIC0gMTc4ICovCiAgMiwgIC8qILMgLSAxNzkgKi8KICAyLCAgLyogtCAtIDE4MCAqLwogIDIsICAvKiC1IC0gMTgxICovCiAgMiwgIC8qILYgLSAxODIgKi8KICAyLCAgLyogtyAtIDE4MyAqLwogIDIsICAvKiC4IC0gMTg0ICovCiAgMiwgIC8qILkgLSAxODUgKi8KICAzLCAgLyoguiAtIDE4NiAqLwogIDIsICAvKiC7IC0gMTg3ICovCiAgMiwgIC8qILwgLSAxODggKi8KICAyLCAgLyogvSAtIDE4OSAqLwogIDIsICAvKiC+IC0gMTkwICovCiAgMiwgIC8qIL8gLSAxOTEgKi8KIDE1LCAgLyogwCAtIDE5MiAqLwogMTQsICAvKiDBIC0gMTkzICovCiAxOCwgIC8qIMIgLSAxOTQgKi8KIDI1LCAgLyogwyAtIDE5NSAqLwogMTksICAvKiDEIC0gMTk2ICovCiAyNiwgIC8qIMUgLSAxOTcgKi8KICAyLCAgLyogxiAtIDE5OCAqLwogMjgsICAvKiDHIC0gMTk5ICovCiAxNSwgIC8qIMggLSAyMDAgKi8KIDE0LCAgLyogySAtIDIwMSAqLwogMTgsICAvKiDKIC0gMjAyICovCiAxOSwgIC8qIMsgLSAyMDMgKi8KIDE1LCAgLyogzCAtIDIwNCAqLwogMTQsICAvKiDNIC0gMjA1ICovCiAxOCwgIC8qIM4gLSAyMDYgKi8KIDE5LCAgLyogzyAtIDIwNyAqLwoxMDQsICAvKiDQIC0gMjA4ICovCiAyNSwgIC8qINEgLSAyMDkgKi8KIDE1LCAgLyog0iAtIDIxMCAqLwogMTQsICAvKiDTIC0gMjExICovCiAxOCwgIC8qINQgLSAyMTIgKi8KIDI1LCAgLyog1SAtIDIxMyAqLwogMTksICAvKiDWIC0gMjE0ICovCiAgMiwgIC8qINcgLSAyMTUgKi8KIDMzLCAgLyog2CAtIDIxNiAqLwogMTUsICAvKiDZIC0gMjE3ICovCiAxNCwgIC8qINogLSAyMTggKi8KIDE4LCAgLyog2yAtIDIxOSAqLwogMTksICAvKiDcIC0gMjIwICovCiAxNCwgIC8qIN0gLSAyMjEgKi8KICAyLCAgLyog3iAtIDIyMiAqLwogIDIsICAvKiDfIC0gMjIzICovCiAxNSwgIC8qIOAgLSAyMjQgKi8KIDE0LCAgLyog4SAtIDIyNSAqLwogMTgsICAvKiDiIC0gMjI2ICovCiAyNSwgIC8qIOMgLSAyMjcgKi8KIDE5LCAgLyog5CAtIDIyOCAqLwogMjYsICAvKiDlIC0gMjI5ICovCiAgMiwgIC8qIOYgLSAyMzAgKi8KIDI4LCAgLyog5yAtIDIzMSAqLwogMTUsICAvKiDoIC0gMjMyICovCiAxNCwgIC8qIOkgLSAyMzMgKi8KIDE4LCAgLyog6iAtIDIzNCAqLwogMTksICAvKiDrIC0gMjM1ICovCiAxNSwgIC8qIOwgLSAyMzYgKi8KIDE0LCAgLyog7SAtIDIzNyAqLwogMTgsICAvKiDuIC0gMjM4ICovCiAxOSwgIC8qIO8gLSAyMzkgKi8KMTA0LCAgLyog8CAtIDI0MCAqLwogMjUsICAvKiDxIC0gMjQxICovCiAxNSwgIC8qIPIgLSAyNDIgKi8KIDE0LCAgLyog8yAtIDI0MyAqLwogMTgsICAvKiD0IC0gMjQ0ICovCiAyNSwgIC8qIPUgLSAyNDUgKi8KIDE5LCAgLyog9iAtIDI0NiAqLwogIDIsICAvKiD3IC0gMjQ3ICovCiAzMywgIC8qIPggLSAyNDggKi8KIDE1LCAgLyog+SAtIDI0OSAqLwogMTQsICAvKiD6IC0gMjUwICovCiAxOCwgIC8qIPsgLSAyNTEgKi8KIDE5LCAgLyog/CAtIDI1MiAqLwogMTQsICAvKiD9IC0gMjUzICovCiAgMiwgIC8qIP4gLSAyNTQgKi8KIDE5LCAgLyog/yAtIDI1NSAqLwp9IDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc1B1bmN0dWF0aW9uIFtJTlRFUk5BTF0KICovCnN0YXRpYyBpbnQgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiAicHVuY3R1YXRpb24gY2hhcmFjdGVyIiBpbiB0aGlzIGNvbnRleHQgaXMgYSBjaGFyYWN0ZXIgd2hpY2ggaXMgCiAgICAgY29uc2lkZXJlZCAibGVzcyBpbXBvcnRhbnQiIGR1cmluZyB3b3JkIHNvcnQgY29tcGFyaXNvbi4KICAgICBTZWUgTENNYXBTdHJpbmcgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBwcmVjaXNlIGRlZmluaXRpb24gCiAgICAgb2YgImxlc3MgaW1wb3J0YW50Ii4gKi8KCiAgcmV0dXJuIChMQ01fVW5pY29kZV9MVVRbLTIrMipjXT09Nik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc05vblNwYWNpbmcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzTm9uU3BhY2luZyh1bnNpZ25lZCBjaGFyIGMpIAp7CiAgLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IExDTWFwU3RyaW5nMzJBLiAgQ2hhcmFjdGVycyAKICAgICBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlIGFyZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBhCiAgICAgc3RyaW5nIHdpdGggTk9STV9JR05PUkVOT05TUEFDRSAqLwogIHJldHVybiAoKGM9PTEzNikgfHwgKGM9PTE3MCkgfHwgKGM9PTE4NikpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRTJOTFNfaXNTeW1ib2wgW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzU3ltYm9sKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmczMkEuICBDaGFyYWN0ZXJzIAogICAgIGZvciB3aGljaCBpdCByZXR1cm5zIHRydWUgYXJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGEKICAgICBzdHJpbmcgd2l0aCBOT1JNX0lHTk9SRVNZTUJPTFMgKi8KICByZXR1cm4gKCAoYyE9MCkgJiYgIUlzQ2hhckFscGhhTnVtZXJpY0EoYykgKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJaWRlbnRpdHkJW0ludGVybmFsXQogKi8Kc3RhdGljIGludCBpZGVudGl0eShpbnQgYykKewogIHJldHVybiBjOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgTENNYXBTdHJpbmczMkEgICAgICAgICAgICAgICAgW0tFUk5FTDMyLjQ5Ml0KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBJZiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSwgdGhlIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGUKICogYSBzb3J0IGtleSBmb3IgdGhlIHNvdXJjZSBzdHJpbmcuICBFbHNlLCBpdCB3aWxsIGNvbnZlcnQgaXQKICogYWNjb3JkaW5nbHkgdG8gdGhlIGZsYWdzIExDTUFQX1VQUEVSQ0FTRSwgTENNQVBfTE9XRVJDQVNFLC4uLgogKgogKiBSRVRVUk5TCiAqICAgIEVycm9yIDogMC4KICogICAgU3VjY2VzcyA6IGxlbmd0aCBvZiB0aGUgcmVzdWx0IHN0cmluZy4KICoKICogTk9URVMKICogICAgSWYgY2FsbGVkIHdpdGggc2NybGVuID0gLTEsIHRoZSBmdW5jdGlvbiB3aWxsIGNvbXB1dGUgdGhlIGxlbmd0aAogKiAgICAgIG9mIHRoZSAwLXRlcm1pbmF0ZWQgc3RyaW5nIHN0cnNyYyBieSBpdHNlbGYuICAgICAgCiAqIAogKiAgICBJZiBjYWxsZWQgd2l0aCBkc3RsZW4gPSAwLCByZXR1cm5zIHRoZSBidWZmZXIgbGVuZ3RoIHRoYXQgCiAqICAgICAgd291bGQgYmUgcmVxdWlyZWQuCiAqCiAqICAgIE5PUk1fSUdOT1JFV0lEVEggbWVhbnMgdG8gY29tcGFyZSBBU0NJSSBhbmQgd2lkZSBjaGFyYWN0ZXJzCiAqICAgIGFzIGlmIHRoZXkgYXJlIGVxdWFsLiAgCiAqICAgIEluIHRoZSBvbmx5IGNvZGUgcGFnZSBpbXBsZW1lbnRlZCBzbyBmYXIsIHRoZXJlIG1heSBub3QgYmUKICogICAgd2lkZSBjaGFyYWN0ZXJzIGluIHN0cmluZ3MgcGFzc2VkIHRvIExDTWFwU3RyaW5nMzJBLAogKiAgICBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIGRvbmUgZm9yIHRoaXMgZmxhZy4KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdBKAoJTENJRCBsY2lkIC8qIGxvY2FsZSBpZGVudGlmaWVyIGNyZWF0ZWQgd2l0aCBNQUtFTENJRDsgCgkJICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQgYW5kIExPQ0FMRV9VU0VSX0RFRkFVTFQgYXJlIAogICAgICAgICAgICAgICAgICAgICBwcmVkZWZpbmVkIHZhbHVlcy4gKi8sCglEV09SRCBtYXBmbGFncyAvKiBmbGFncyAqLywKCUxQQ1NUUiBzcmNzdHIgIC8qIHNvdXJjZSBidWZmZXIgKi8sCglJTlQgc3JjbGVuICAgLyogc291cmNlIGxlbmd0aCAqLywKCUxQU1RSIGRzdHN0ciAgIC8qIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLywKCUlOVCBkc3RsZW4gICAvKiBkZXN0aW5hdGlvbiBidWZmZXIgbGVuZ3RoICovKSAKewogIGludCBpOwoKICBUUkFDRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXMsJWQsJXAsJWQpXG4iLAoJbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUihvbGUsICIoc3JjPSVzLGRlc3Q9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzcmNzdHIsIGRzdHN0cik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChzcmNsZW4gPT0gLTEpIAogICAgc3JjbGVuID0gbHN0cmxlbkEoc3Jjc3RyKSArIDEgOyAgICAvKiAoaW5jbHVkZSBmaW5hbCAnXDAnKSAqLwoKI2RlZmluZSBMQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTIChMQ01BUF9VUFBFUkNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTENNQVBfTE9XRVJDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDTUFQX1NPUlRLRVkgICAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRUNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVOT05TUEFDRSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPUlRfU1RSSU5HU09SVCAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRVdJRFRIKQoKICBpZiAobWFwZmxhZ3MgJiB+TENNQVBTVFJJTkdBX1NVUFBPUlRFRF9GTEFHUykKICB7CiAgICBGSVhNRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLAoJICBtYXBmbGFncywKCSAgc3Jjc3RyLAoJICBzcmNsZW4sCgkgIGRzdHN0ciwKCSAgZHN0bGVuLAoJICBtYXBmbGFncyAmIH5MQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTCiAgICAgKTsKICB9CgogIGlmICggIShtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICkKICB7CiAgICBpbnQgaSxqOwogICAgaW50ICgqZikoaW50KSA9IGlkZW50aXR5OyAKICAgIGludCBmbGFnX2lnbm9yZW5vbnNwYWNlID0gbWFwZmxhZ3MgJiBOT1JNX0lHTk9SRU5PTlNQQUNFOwogICAgaW50IGZsYWdfaWdub3Jlc3ltYm9scyA9IG1hcGZsYWdzICYgTk9STV9JR05PUkVTWU1CT0xTOwoKICAgIGlmIChmbGFnX2lnbm9yZW5vbnNwYWNlIHx8IGZsYWdfaWdub3Jlc3ltYm9scykKICAgIHsKICAgICAgLyogRm9yIHNvbWUgdmFsdWVzIG9mIG1hcGZsYWdzLCB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgCgkgc3RyaW5nIGlzIG5vdCBrbm93biBhdCB0aGlzIHBvaW50LiAgV2luZG93cyBkb2VzIG1hcCB0aGUgc3RyaW5nCgkgYW5kIGRvZXMgbm90IFNldExhc3RFcnJvciBFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSIGluCgkgdGhlc2UgY2FzZXMuICovCiAgICAgIGlmIChkc3RsZW49PTApCiAgICAgIHsKCS8qIENvbXB1dGUgcmVxdWlyZWQgbGVuZ3RoICovCglmb3IgKGk9aj0wOyBpIDwgc3JjbGVuOyBpKyspCgl7CgkgIGlmICggIShmbGFnX2lnbm9yZW5vbnNwYWNlICYmIE9MRTJOTFNfaXNOb25TcGFjaW5nKHNyY3N0cltpXSkpCgkgICAgICAgJiYgIShmbGFnX2lnbm9yZXN5bWJvbHMgJiYgT0xFMk5MU19pc1N5bWJvbChzcmNzdHJbaV0pKSApCgkgICAgaisrOwoJfQoJcmV0dXJuIGo7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaWYgKGRzdGxlbj09MCkKCXJldHVybiBzcmNsZW47ICAKICAgICAgaWYgKGRzdGxlbjxzcmNsZW4pIAoJICAgewoJICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgICAgIHJldHVybiAwOwoJICAgfQogICAgfQogICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQogICAgICBmID0gdG91cHBlcjsKICAgIGVsc2UgaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKQogICAgICBmID0gdG9sb3dlcjsKICAgIC8qIEZJWE1FOiBOT1JNX0lHTk9SRU5PTlNQQUNFIHJlcXVpcmVzIGFub3RoZXIgY29udmVyc2lvbiAqLwogICAgZm9yIChpPWo9MDsgKGk8c3JjbGVuKSAmJiAoajxkc3RsZW4pIDsgaSsrKQogICAgewogICAgICBpZiAoICEoZmxhZ19pZ25vcmVub25zcGFjZSAmJiBPTEUyTkxTX2lzTm9uU3BhY2luZyhzcmNzdHJbaV0pKQoJICAgJiYgIShmbGFnX2lnbm9yZXN5bWJvbHMgJiYgT0xFMk5MU19pc1N5bWJvbChzcmNzdHJbaV0pKSApCiAgICAgIHsKCWRzdHN0cltqXSA9IChDSEFSKSBmKHNyY3N0cltpXSk7CglqKys7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBqOwogIH0KCiAgLyogZWxzZSAuLi4gKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgICovCiAgewogICAgaW50IHVuaWNvZGVfbGVuPTA7CiAgICBpbnQgY2FzZV9sZW49MDsKICAgIGludCBkaWFjcml0aWNfbGVuPTA7CiAgICBpbnQgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW49MDsKICAgIGNoYXIgKmNhc2VfY29tcG9uZW50OwogICAgY2hhciAqZGlhY3JpdGljX2NvbXBvbmVudDsKICAgIGNoYXIgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50OwogICAgaW50IHJvb20sY291bnQ7CiAgICBpbnQgZmxhZ19zdHJpbmdzb3J0ID0gbWFwZmxhZ3MgJiBTT1JUX1NUUklOR1NPUlQ7CgogICAgLyogY29tcHV0ZSBob3cgbXVjaCByb29tIHdlIHdpbGwgbmVlZCAqLwogICAgZm9yIChpPTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICBpbnQgb2ZzOwogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyID0gc3Jjc3RyW2ldOwogICAgICBpZiAoc291cmNlX2NoYXIhPSdcMCcpIAogICAgICB7CglpZiAoZmxhZ19zdHJpbmdzb3J0IHx8ICFPTEUyTkxTX2lzUHVuY3R1YXRpb24oc291cmNlX2NoYXIpKQoJewoJICB1bmljb2RlX2xlbisrOwoJICBpZiAoIExDTV9Vbmljb2RlX0xVVFstMisyKnNvdXJjZV9jaGFyXSAmIH4xNSApCgkgICAgdW5pY29kZV9sZW4rKzsgICAgICAgICAgICAgLyogZG91YmxlIGxldHRlciAqLwoJfQoJZWxzZQoJewoJICBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbisrOwoJfQkgIAogICAgICB9CgkgIAogICAgICBpZiAoaXN1cHBlcihzb3VyY2VfY2hhcikpCgljYXNlX2xlbj11bmljb2RlX2xlbjsgCgogICAgICBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CiAgICAgIGlmICgob2ZzPj0wKSAmJiAoTENNX0RpYWNyaXRpY19MVVRbb2ZzXSE9MikpCglkaWFjcml0aWNfbGVuPXVuaWNvZGVfbGVuOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFQ0FTRSkKICAgICAgY2FzZV9sZW49MDsgICAgICAgICAgICAgICAgICAgCiAgICBpZiAobWFwZmxhZ3MgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQogICAgICBkaWFjcml0aWNfbGVuPTA7CgogICAgcm9vbSA9ICAyICogdW5pY29kZV9sZW4gICAgICAgICAgICAgIC8qICJ1bmljb2RlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgZGlhY3JpdGljX2xlbiAgICAgICAgICAgICAgICAvKiAiZGlhY3JpdGljIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgY2FzZV9sZW4gICAgICAgICAgICAgICAgICAgICAvKiAiY2FzZSIgY29tcG9uZW50ICovCiAgICAgICsgICAgIDQgKiBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbiAgLyogcHVuY3R1YXRpb24gaW4gd29yZCBzb3J0IG1vZGUgKi8KICAgICAgKyAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VyICdcMScgc2VwYXJhdG9ycyAqLwogICAgICArICAgICAxICA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRlcm1pbmFsICdcMCcgKi8KICAgIGlmIChkc3RsZW49PTApCiAgICAgIHJldHVybiByb29tOyAgICAgIAogICAgZWxzZSBpZiAoZHN0bGVuPHJvb20pCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLypGSVhNRSB0aGUgUG9pbnRlcmNoZWNrIHNob3VsZCBub3QgYmUgbmVzc2VzYXJ5ICovCiAgICBpZiAoSXNCYWRXcml0ZVB0ciAoZHN0c3RyLHJvb20pKQogICAgeyBFUlIgKHN0cmluZywiYmFkIGRlc3RpbmF0aW9uIGJ1ZmZlciAoZHN0c3RyKSA6ICVwLCVkXG4iLGRzdHN0cixkc3RsZW4pOwogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIGxvY2F0ZSBlYWNoIGNvbXBvbmVudCwgd3JpdGUgc2VwYXJhdG9ycyAqLwogICAgZGlhY3JpdGljX2NvbXBvbmVudCA9IGRzdHN0ciArIDIqdW5pY29kZV9sZW4gOwogICAgKmRpYWNyaXRpY19jb21wb25lbnQrKyA9ICdcMSc7IAogICAgY2FzZV9jb21wb25lbnQgPSBkaWFjcml0aWNfY29tcG9uZW50ICsgZGlhY3JpdGljX2xlbiA7CiAgICAqY2FzZV9jb21wb25lbnQrKyA9ICdcMSc7IAogICAgZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQgPSBjYXNlX2NvbXBvbmVudCArIGNhc2VfbGVuIDsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKCiAgICAvKiByZWFkIHNvdXJjZSBzdHJpbmcgY2hhciBieSBjaGFyLCB3cml0ZSAKICAgICAgIGNvcnJlc3BvbmRpbmcgd2VpZ2h0IGluIGVhY2ggY29tcG9uZW50LiAqLwogICAgZm9yIChpPTAsY291bnQ9MDtpPHNyY2xlbjtpKyspCiAgICB7CiAgICAgIHVuc2lnbmVkIGNoYXIgc291cmNlX2NoYXI9c3Jjc3RyW2ldOwogICAgICBpZiAoc291cmNlX2NoYXIhPSdcMCcpIAogICAgICB7CglpbnQgdHlwZSxsb25nY29kZTsKCXR5cGUgPSBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl07Cglsb25nY29kZSA9IHR5cGUgPj4gNDsKCXR5cGUgJj0gMTU7CglpZiAoIWZsYWdfc3RyaW5nc29ydCAmJiBPTEUyTkxTX2lzUHVuY3R1YXRpb24oc291cmNlX2NoYXIpKSAKCXsKCSAgVUlOVDE2IGVuY3J5cHRlZF9sb2NhdGlvbiA9ICgxPDwxNSkgKyA3ICsgNCpjb3VudDsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAodW5zaWduZWQgY2hhcikgKGVuY3J5cHRlZF9sb2NhdGlvbj4+OCk7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24mMjU1KTsKICAgICAgICAgICAgICAgICAgICAgLyogYmlnLWVuZGlhbiBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpdCBsZXRzIHN0cmluZyBjb21wYXJpc29uIGJlCgkJCWNvbXBhdGlibGUgd2l0aCBudW1lcmljYWwgY29tcGFyaXNvbiAqLwoKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSB0eXBlOwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9IExDTV9Vbmljb2RlX0xVVFstMSsyKnNvdXJjZV9jaGFyXTsgIAogICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bXB0aW9uIDogYSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXIgaXMgbmV2ZXIgYSAKCQkJZG91YmxlIG9yIGFjY2VudGVkIGxldHRlciAqLwoJfQoJZWxzZQoJewoJICBkc3RzdHJbMipjb3VudF0gPSB0eXBlOwoJICBkc3RzdHJbMipjb3VudCsxXSA9IExDTV9Vbmljb2RlX0xVVFstMSsyKnNvdXJjZV9jaGFyXTsgIAoJICBpZiAobG9uZ2NvZGUpCgkgIHsKCSAgICBpZiAoY291bnQ8Y2FzZV9sZW4pCgkgICAgICBjYXNlX2NvbXBvbmVudFtjb3VudF0gPSAoIGlzdXBwZXIoc291cmNlX2NoYXIpID8gMTggOiAyICkgOwoJICAgIGlmIChjb3VudDxkaWFjcml0aWNfbGVuKQoJICAgICAgZGlhY3JpdGljX2NvbXBvbmVudFtjb3VudF0gPSAyOyAvKiBhc3N1bXB0aW9uOiBhIGRvdWJsZSBsZXR0ZXIKCQkJCQkJIGlzIG5ldmVyIGFjY2VudGVkICovCgkgICAgY291bnQrKzsKCSAgICAKCSAgICBkc3RzdHJbMipjb3VudF0gPSB0eXBlOwoJICAgIGRzdHN0clsyKmNvdW50KzFdID0gKihMQ01fVW5pY29kZV9MVVRfMiAtIDEgKyBsb25nY29kZSk7IAoJICAgIC8qIDE2IGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMSAKCSAgICAgICAzMiBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDIgCgkgICAgICAgNDggaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAzICovCgkgIH0KCgkgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICBjYXNlX2NvbXBvbmVudFtjb3VudF0gPSAoIGlzdXBwZXIoc291cmNlX2NoYXIpID8gMTggOiAyICkgOwoJICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKCSAgewoJICAgIGludCBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CgkgICAgZGlhY3JpdGljX2NvbXBvbmVudFtjb3VudF0gPSAob2ZzPj0wID8gTENNX0RpYWNyaXRpY19MVVRbb2ZzXSA6IDIpOwoJICB9CgkgIGNvdW50Kys7Cgl9CiAgICAgIH0KICAgIH0KICAgIGRzdHN0cltyb29tLTFdID0gJ1wwJzsKICAgIHJldHVybiByb29tOwogIH0KfQoJCSAgICAgCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBMQ01hcFN0cmluZzMyVyAgICAgICAgICAgICAgICBbS0VSTkVMMzIuNDkzXQogKgogKiBDb252ZXJ0IGEgc3RyaW5nLCBvciBnZW5lcmF0ZSBhIHNvcnQga2V5IGZyb20gaXQuCiAqCiAqIE5PVEUKICoKICogU2VlIExDTWFwU3RyaW5nMzJBIGZvciBkb2N1bWVudGF0aW9uCiAqLwpJTlQgV0lOQVBJIExDTWFwU3RyaW5nVygKCUxDSUQgbGNpZCxEV09SRCBtYXBmbGFncyxMUENXU1RSIHNyY3N0cixJTlQgc3JjbGVuLExQV1NUUiBkc3RzdHIsCglJTlQgZHN0bGVuKQp7CiAgaW50IGk7CiAKICBUUkFDRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpXG4iLAoJbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUihvbGUsICIoc3JjPSVwLGRzdD0lcCk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHNyY3N0ciwgZHN0c3RyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKHNyY2xlbj09LTEpIAogICAgc3JjbGVuID0gbHN0cmxlblcoc3Jjc3RyKSsxOwogIGlmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpIAogIHsKICAgIEZJWE1FKHN0cmluZywiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZCk6ICIKCSAgInVuaW1wbGVtZW50ZWQgZmxhZ3M6IDB4JTA4bHhcbiIsCgkgIGxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuLG1hcGZsYWdzKTsKICAgIHJldHVybiAwOwogIH0KICBlbHNlCiAgewogICAgaW50ICgqZikoaW50KT1pZGVudGl0eTsgCgogICAgaWYgKGRzdGxlbj09MCkKICAgICAgcmV0dXJuIHNyY2xlbjsgIAogICAgaWYgKGRzdGxlbjxzcmNsZW4pIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICBmb3IgKGk9MDsgaSA8IHNyY2xlbjsgaSsrKQogICAgICBkc3RzdHJbaV0gPSAoV0NIQVIpIGYoc3Jjc3RyW2ldKTsKICAgIHJldHVybiBzcmNsZW47CiAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENvbXBhcmVTdHJpbmcxNiAgICAgICAoT0xFMk5MUy44KQogKi8KVUlOVDE2IFdJTkFQSSBDb21wYXJlU3RyaW5nMTYoRFdPUkQgbGNpZCxEV09SRCBmZHdTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHMxLERXT1JEIGwxLExQQ1NUUiBzMixEV09SRCBsMikKewoJcmV0dXJuIChVSU5UMTYpQ29tcGFyZVN0cmluZ0EobGNpZCxmZHdTdHlsZSxzMSxsMSxzMixsMik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbXBhcmVTdHJpbmczMkEJW0tFUk5FTDMyLjE0M10KICogQ29tcGFyZXMgdHdvIHN0cmluZ3MgdXNpbmcgbG9jYWxlCiAqCiAqIFJFVFVSTlMKICoKICogc3VjY2VzczogQ1NUUl9MRVNTX1RIQU4sIENTVFJfRVFVQUwsIENTVFJfR1JFQVRFUl9USEFOCiAqIGZhaWx1cmU6IDAKICoKICogTk9URVMKICoKICogRGVmYXVsdHMgdG8gYSB3b3JkIHNvcnQsIGJ1dCB1c2VzIGEgc3RyaW5nIHNvcnQgaWYKICogU09SVF9TVFJJTkdTT1JUIGlzIHNldC4KICogQ2FsbHMgU2V0TGFzdEVycm9yIGZvciBFUlJPUl9JTlZBTElEX0ZMQUdTLCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUi4KICogCiAqIEJVR1MKICoKICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKICoKICogRklYTUUKICogCiAqIFF1aXRlIGluZWZmaWNpZW50LgogKi8KVUlOVCBXSU5BUEkgQ29tcGFyZVN0cmluZ0EoCiAgICBEV09SRCBsY2lkLCAgICAgLyogbG9jYWxlIElEICovCiAgICBEV09SRCBmZHdTdHlsZSwgLyogY29tcGFyaXNvbi1zdHlsZSBvcHRpb25zICovCiAgICBMUENTVFIgczEsICAgICAgLyogZmlyc3Qgc3RyaW5nICovCiAgICBEV09SRCBsMSwgICAgICAgLyogbGVuZ3RoIG9mIGZpcnN0IHN0cmluZyAqLwogICAgTFBDU1RSIHMyLCAgICAgIC8qIHNlY29uZCBzdHJpbmcgKi8KICAgIERXT1JEIGwyKSAgICAgICAvKiBsZW5ndGggb2Ygc2Vjb25kIHN0cmluZyAqLwp7CiAgaW50IG1hcHN0cmluZ19mbGFnczsKICBpbnQgbGVuMSxsZW4yOwogIGludCByZXN1bHQ7CiAgTFBTVFIgc2sxLHNrMjsKICBUUkFDRShvbGUsIiVzIGFuZCAlc1xuIiwKCWRlYnVnc3RyX2EgKHMxKSwgZGVidWdzdHJfYSAoczIpKTsKCiAgaWYgKCAoczE9PU5VTEwpIHx8IChzMj09TlVMTCkgKQogIHsgICAgCiAgICBFUlIob2xlLCAiKHMxPSVzLHMyPSVzKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgczEsIHMyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CgogIGlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQogICAgRklYTUUob2xlLCAiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKICAJCiAgbWFwc3RyaW5nX2ZsYWdzID0gTENNQVBfU09SVEtFWSB8IGZkd1N0eWxlIDsKICBsZW4xID0gTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMxLGwxLE5VTEwsMCk7CiAgbGVuMiA9IExDTWFwU3RyaW5nQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMixsMixOVUxMLDApOwoKICBpZiAoKGxlbjE9PTApfHwobGVuMj09MCkpCiAgICByZXR1cm4gMDsgICAgIC8qIHNvbWV0aGluZyB3cm9uZyBoYXBwZW5lZCAqLwoKICBzazEgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4xKTsKICBzazIgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4yKTsKICBpZiAoICghTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMxLGwxLHNrMSxsZW4xKSkKCSB8fCAoIUxDTWFwU3RyaW5nQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMixsMixzazIsbGVuMikpICkKICB7CiAgICBFUlIob2xlLCJCdWcgaW4gTENtYXBTdHJpbmczMkEuXG4iKTsKICAgIHJlc3VsdCA9IDA7CiAgfQogIGVsc2UKICB7CiAgICAvKiBzdHJjbXAgZG9lc24ndCBuZWNlc3NhcmlseSByZXR1cm4gLTEsIDAsIG9yIDEgKi8KICAgIHJlc3VsdCA9IHN0cmNtcChzazEsc2syKTsKICB9CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHNrMSk7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHNrMik7CgogIGlmIChyZXN1bHQgPCAwKQogICAgcmV0dXJuIDE7CiAgaWYgKHJlc3VsdCA9PSAwKQogICAgcmV0dXJuIDI7CgogIC8qIG11c3QgYmUgZ3JlYXRlciwgaWYgd2UgcmVhY2ggdGhpcyBwb2ludCAqLwogIHJldHVybiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDb21wYXJlU3RyaW5nMzJXCVtLRVJORUwzMi4xNDRdCiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgbG9jYWxlCiAqIEZJWE1FIDogIERvZXMgb25seSBzdHJpbmcgc29ydC4gIFNob3VsZAogKiBiZSByZWltcGxlbWVudGVkIHRoZSBzYW1lIHdheSBhcyBDb21wYXJlU3RyaW5nMzJBLgogKi8KVUlOVCBXSU5BUEkgQ29tcGFyZVN0cmluZ1coRFdPUkQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBzMSwgRFdPUkQgbDEsIExQQ1dTVFIgczIsRFdPUkQgbDIpCnsKCWludCBsZW4scmV0OwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQoJCUZJWE1FKG9sZSwiSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FKG9sZSwiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCgkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwoJLyogRklYTUU6IEhhbmRsZSBOT1JNX1NUUklOR1NPUlQgKi8KCWwxID0gKGwxPT0tMSk/bHN0cmxlblcoczEpOmwxOwoJbDIgPSAobDI9PS0xKT9sc3RybGVuVyhzMik6bDI7CglsZW4gPSBsMTxsMiA/IGwxOmwyOwoJcmV0ID0gKGZkd1N0eWxlICYgTk9STV9JR05PUkVDQVNFKSA/CgkJbHN0cm5jbXBpVyhzMSxzMixsZW4pCTogbHN0cm5jbXBXKHMxLHMyLGxlbik7CgkvKiBub3QgZXF1YWwsIHJldHVybiAxIG9yIDMgKi8KCWlmKHJldCE9MCkgcmV0dXJuIHJldCsyOwoJLyogc2FtZSBsZW4sIHJldHVybiAyICovCglpZihsMT09bDIpIHJldHVybiAyOwoJLyogdGhlIGxvbmdlciBvbmUgaXMgbGV4aWNhbGx5IGdyZWF0ZXIgKi8KCXJldHVybiAobDE8bDIpPyAxIDogMzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJT0xFX0dldEZvcm1hdEEJW0ludGVybmFsXQogKgogKiBGSVhNRQogKiAgICBJZiBkYXRlbGVuID09IDAsIGl0IHNob3VsZCByZXR1cm4gdGhlIHJlZ3VpcmVkIHN0cmluZyBsZW5ndGguCiAqCiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgc3R1ZmYgZm9yIEdldERhdGVGb3JtYXQoKSBhbmQgCiBHZXRUaW1lRm9ybWF0KCkuCgogIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCiAgZGQgICB0d28tZGlnaXQgZGF5IChvZiBtb250aCkKICBkZGQgIHNob3J0IGRheS1vZi13ZWVrIG5hbWUKICBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQogIE0gICAgc2luZ2xlLWRpZ2l0IG1vbnRoCiAgTU0gICB0d28tZGlnaXQgbW9udGgKICBNTU0gIHNob3J0IG1vbnRoIG5hbWUKICBNTU1NIGZ1bGwgbW9udGggbmFtZQogIHkgICAgdHdvLWRpZ2l0IHllYXIsIG5vIGxlYWRpbmcgMAogIHl5ICAgdHdvLWRpZ2l0IHllYXIKICB5eXl5IGZvdXItZGlnaXQgeWVhcgogIGdnICAgZXJhIHN0cmluZwogIGggICAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAgaGggICBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIEggICAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDI0LWhvdXIpCiAgSEggICBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIG0gICAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogIG1tICAgbWludXRlcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIHMgICAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogIHNzICAgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIHQgICAgdGltZSBtYXJrZXIgKEEgb3IgUCkKICB0dCAgIHRpbWUgbWFya2VyIChBTSwgUE0pCiAgJycgICB1c2VkIHRvIHF1b3RlIGxpdGVyYWwgY2hhcmFjdGVycwogICcnICAgKHdpdGhpbiBhIHF1b3RlZCBzdHJpbmcpIGluZGljYXRlcyBhIGxpdGVyYWwgJwoKIFRoZXNlIGZ1bmN0aW9ucyBSRVFVSVJFIHZhbGlkIGxvY2FsZSwgZGF0ZSwgIGFuZCBmb3JtYXQuIAogKi8Kc3RhdGljIElOVCBPTEVfR2V0Rm9ybWF0QShMQ0lEIGxvY2FsZSwKCQkJICAgIERXT1JEIGZsYWdzLAoJCQkgICAgRFdPUkQgdGZsYWdzLAoJCQkgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgTFBDU1RSIF9mb3JtYXQsIAkvKmluKi8KCQkJICAgIExQU1RSIGRhdGUsCQkvKm91dCovCgkJCSAgICBJTlQgZGF0ZWxlbikKewogICBJTlQgaW5wb3MsIG91dHBvczsKICAgaW50IGNvdW50LCB0eXBlLCBpbnF1b3RlLCBPdmVyZmxvdzsKICAgY2hhciBidWZbNDBdOwogICBjaGFyIGZvcm1hdFs0MF07CiAgIGNoYXIgKiBwb3M7CiAgIGludCBidWZsZW47CgogICBjb25zdCBjaGFyICogX2RnZm10W10gPSB7ICIlZCIsICIlMDJkIiB9OwogICBjb25zdCBjaGFyICoqIGRnZm10ID0gX2RnZm10IC0gMTsgCgogICAvKiByZXBvcnQsIGZvciBkZWJ1Z2dpbmcgKi8KICAgVFJBQ0Uob2xlLCAiKDB4JWx4LDB4JWx4LCAweCVseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10PSVwIFwnJXNcJyAsICVwLCBsZW49JWQpXG4iLAogICAJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgX2Zvcm1hdCwgX2Zvcm1hdCwgZGF0ZSwgZGF0ZWxlbik7CiAgCiAgIGlmKGRhdGVsZW4gPT0gMCkgewogICAgIEZJWE1FKG9sZSwgImRhdGVsZW4gPSAwLCByZXR1cm5pbmcgMjU1XG4iKTsKICAgICByZXR1cm4gMjU1OwogICB9CgogICAvKiBpbml0YWxpemUgc3RhdGUgdmFyaWFibGVzIGFuZCBvdXRwdXQgYnVmZmVyICovCiAgIGlucG9zID0gb3V0cG9zID0gMDsKICAgY291bnQgPSAwOyBpbnF1b3RlID0gMDsgT3ZlcmZsb3cgPSAwOwogICB0eXBlID0gJ1wwJzsKICAgZGF0ZVswXSA9IGJ1ZlswXSA9ICdcMCc7CiAgICAgIAogICBzdHJjcHkoZm9ybWF0LF9mb3JtYXQpOwoKICAgLyogYWx0ZXIgdGhlIGZvcm1hdHN0cmluZywgd2hpbGUgaXQgd29ya3MgZm9yIGFsbCBsYW5ndWFnZXMgbm93IGluIHdpbmUKICAgaXRzIHBvc3NpYmxlIHRoYXQgaXQgZmFpbHMgd2hlbiB0aGUgdGltZSBsb29rcyBsaWtlIHNzOm1tOmhoIGFzIGV4YW1wbGUqLyAgIAogICBpZiAodGZsYWdzICYgKFRJTUVfTk9NSU5VVEVTT1JTRUNPTkRTKSkKICAgeyBpZiAoKHBvcyA9IHN0cnN0ciAoIGZvcm1hdCwgIjptbSIpKSkKICAgICB7IG1lbWNweSAoIHBvcywgcG9zKzMsIHN0cmxlbihmb3JtYXQpLShwb3MtZm9ybWF0KS0yICk7CiAgICAgfQogICB9CiAgIGlmICh0ZmxhZ3MgJiAoVElNRV9OT1NFQ09ORFMpKQogICB7IGlmICgocG9zID0gc3Ryc3RyICggZm9ybWF0LCAiOnNzIikpKQogICAgIHsgbWVtY3B5ICggcG9zLCBwb3MrMywgc3RybGVuKGZvcm1hdCktKHBvcy1mb3JtYXQpLTIgKTsKICAgICB9CiAgIH0KICAgCiAgIGZvciAoaW5wb3MgPSAwOzsgaW5wb3MrKykgewogICAgICAvKiBUUkFDRShvbGUsICJTVEFURSBpbnBvcz0lMmQgb3V0cG9zPSUyZCBjb3VudD0lZCBpbnF1b3RlPSVkIHR5cGU9JWMgYnVmLGRhdGUgPSAlYywlY1xuIiwgaW5wb3MsIG91dHBvcywgY291bnQsIGlucXVvdGUsIHR5cGUsIGJ1ZltpbnBvc10sIGRhdGVbb3V0cG9zXSk7ICovCiAgICAgIGlmIChpbnF1b3RlKSB7CgkgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJICAgIGlmIChmb3JtYXRbaW5wb3MrMV0gPT0gJ1wnJykgewoJICAgICAgIGlucG9zICs9IDE7CgkgICAgICAgZGF0ZVtvdXRwb3MrK10gPSAnXCcnOwoJICAgIH0gZWxzZSB7CgkgICAgICAgaW5xdW90ZSA9IDA7CgkgICAgICAgY29udGludWU7IC8qIHdlIGRpZCBub3RoaW5nIHRvIHRoZSBvdXRwdXQgKi8KCSAgICB9CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcMCcpIHsKCSAgICBkYXRlW291dHBvcysrXSA9ICdcMCc7CgkgICAgaWYgKG91dHBvcyA+IGRhdGVsZW4pIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsKCSB9IGVsc2UgewoJICAgIGRhdGVbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKCSAgICBpZiAob3V0cG9zID4gZGF0ZWxlbikgewoJICAgICAgIE92ZXJmbG93ID0gMTsKCSAgICAgICBkYXRlW291dHBvcy0xXSA9ICdcMCc7IC8qIHRoaXMgaXMgdGhlIGxhc3QgcGxhY2Ugd2hlcmUKCQkJCQkgaXQncyBzYWZlIHRvIHdyaXRlICovCgkgICAgICAgYnJlYWs7CgkgICAgfQoJIH0KICAgICAgfSBlbHNlIGlmICggIChjb3VudCAmJiAoZm9ybWF0W2lucG9zXSAhPSB0eXBlKSkKCQkgICB8fCBjb3VudCA9PSA0CgkJICAgfHwgKGNvdW50ID09IDIgJiYgc3RyY2hyKCJnaEhtc3QiLCB0eXBlKSkgKQogICAgICAgewoJICAgIGlmICAgICAgICAgKHR5cGUgPT0gJ2QnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSA0KSB7CgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsCgkJCQkgICBMT0NBTEVfU0RBWU5BTUUxCgkJCQkgICArIHh0aW1lLT53RGF5T2ZXZWVrIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJCQkgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIAoJCQkJCSAgICBMT0NBTEVfU0FCQlJFVkRBWU5BTUUxIAoJCQkJCSAgICArIHh0aW1lLT53RGF5T2ZXZWVrIC0gMSwKCQkJCQkgICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJICAgICAgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53RGF5KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgICAgIGlmIChjb3VudCA9PSAzKSB7CgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIAoJCQkJICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxCgkJCQkgICArIHh0aW1lLT53TW9udGggLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSA0KSB7CgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsCgkJCQkgICBMT0NBTEVfU01PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCQkgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53TW9udGgpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3knKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDQpIHsKCQkgICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgeHRpbWUtPndZZWFyKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkgIHN0cmNweShidWYsICJ5eXkiKTsKCQkgIFdBUk4ob2xlLCAidW5rbm93biBmb3JtYXQsIGM9JWMsIG49JWRcbiIsICB0eXBlLCBjb3VudCk7CgkJIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d1llYXIgJSAxMDApOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2cnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSAyKSB7CgkJICBGSVhNRShvbGUsICJMT0NBTEVfSUNBTEVOREFSVFlQRSB1bmltcC5cbiIpOwoJCSAgc3RyY3B5KGJ1ZiwgIkFEIik7CgkgICAgfSBlbHNlIHsKCQkgIHN0cmNweShidWYsICJnIik7CgkJICBXQVJOKG9sZSwgInVua25vd24gZm9ybWF0LCBjPSVjLCBuPSVkXG4iLCB0eXBlLCBjb3VudCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAgICAvKiBnaXZlcyB1cyBob3VycyAxOjAwIC0tIDEyOjAwICovCgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgKHh0aW1lLT53SG91ci0xKSUxMiArMSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdIJykgewoJICAgICAgIC8qIDI0LWhvdXIgdGltZSAqLwoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53SG91cik7CgkgICAgfSBlbHNlIGlmICggdHlwZSA9PSAnbScpIHsKCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01pbnV0ZSk7CgkgICAgfSBlbHNlIGlmICggdHlwZSA9PSAncycpIHsKCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d1NlY29uZCk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICd0JykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gMSkgewoJCSAgc3ByaW50ZihidWYsICIlYyIsICh4dGltZS0+d0hvdXIgPCAxMikgPyAnQScgOiAnUCcpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMikgewoJCSAgLyogc3ByaW50ZihidWYsICIlcyIsICh4dGltZS0+d0hvdXIgPCAxMikgPyAiQU0iIDogIlBNIik7ICovCgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsCgkJCQkgICAoeHRpbWUtPndIb3VyPDEyKSAKCQkJCSAgID8gTE9DQUxFX1MxMTU5IDogTE9DQUxFX1MyMzU5LAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfQoJICAgIH07CgoJICAgIC8qIHdlIG5lZWQgdG8gY2hlY2sgdGhlIG5leHQgY2hhciBpbiB0aGUgZm9ybWF0IHN0cmluZyAKCSAgICAgICBhZ2Fpbiwgbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQgKi8KCSAgICBpbnBvcy0tOwoJICAgIAoJICAgIC8qIGFkZCB0aGUgY29udGVudHMgb2YgYnVmIHRvIHRoZSBvdXRwdXQgKi8KCSAgICBidWZsZW4gPSBzdHJsZW4oYnVmKTsKCSAgICBpZiAob3V0cG9zICsgYnVmbGVuIDwgZGF0ZWxlbikgewoJICAgICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7IC8qIGZvciBzdHJjYXQgdG8gaG9vayBvbnRvICovCgkJIHN0cmNhdChkYXRlLCBidWYpOwoJICAgICAgIG91dHBvcyArPSBidWZsZW47CgkgICAgfSBlbHNlIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOwoJICAgICAgIHN0cm5jYXQoZGF0ZSwgYnVmLCBkYXRlbGVuIC0gb3V0cG9zKTsKCQkgZGF0ZVtkYXRlbGVuIC0gMV0gPSAnXDAnOwoJCSBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgICAgICAgV0FSTihvbGUsICJpbnN1ZmZpY2llbnQgYnVmZmVyXG4iKTsKCQkgcmV0dXJuIDA7CgkgICAgfQoKCSAgICAvKiByZXNldCB0aGUgdmFyaWFibGVzIHdlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGlzIGl0ZW0gKi8KCSAgICBjb3VudCA9IDA7CgkgICAgdHlwZSA9ICdcMCc7CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcMCcpIHsKCSAgICAvKiB3ZSBjYW4ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgbG9vcC1oZWFkLCBiZWNhdXNlCgkgICAgICAgdGhhdCBicmVha3MgdGhlIHByaW50aW5nIG9mIHRoZSBsYXN0IGZvcm1hdC1pdGVtICovCgkgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChjb3VudCkgewoJICAgIC8qIGNvbnRpbnVpbmcgYSBjb2RlIGZvciBhbiBpdGVtICovCgkgICAgY291bnQgKz0xOwoJICAgIGNvbnRpbnVlOwoJIH0gZWxzZSBpZiAoc3RyY2hyKCJoSG1zdHlNZGciLCBmb3JtYXRbaW5wb3NdKSkgewoJICAgIHR5cGUgPSBmb3JtYXRbaW5wb3NdOwoJICAgIGNvdW50ID0gMTsKCSAgICBjb250aW51ZTsKCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJICAgIGlucXVvdGUgPSAxOwoJICAgIGNvbnRpbnVlOwogICAgICAgfSBlbHNlIHsKCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CgkgfQogICAgICAvKiBub3cgZGVhbCB3aXRoIGEgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93ICovCiAgICAgIGlmIChvdXRwb3MgPj0gZGF0ZWxlbikgewogICAgICAgZGF0ZVtkYXRlbGVuIC0gMV0gPSAnXDAnOwogICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgfQogICAKICAgaWYgKE92ZXJmbG93KSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgfTsKCiAgIC8qIGZpbmlzaCBpdCBvZmYgd2l0aCBhIHN0cmluZyB0ZXJtaW5hdG9yICovCiAgIG91dHBvcysrOwogICAvKiBzYW5pdHkgY2hlY2sgKi8KICAgaWYgKG91dHBvcyA+IGRhdGVsZW4tMSkgb3V0cG9zID0gZGF0ZWxlbi0xOwogICBkYXRlW291dHBvc10gPSAnXDAnOwogICAKICAgVFJBQ0Uob2xlLCAiT0xFX0dldEZvcm1hdEEgcmV0dXJucyBzdHJpbmcgJyVzJywgbGVuICVkXG4iLAoJICAgICAgIGRhdGUsIG91dHBvcyk7CiAgIHJldHVybiBvdXRwb3M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFX0dldEZvcm1hdFcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIElOVCBPTEVfR2V0Rm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZmxhZ3MsIERXT1JEIHRmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgTFBXU1RSIG91dHB1dCwgSU5UIG91dGxlbikKewogICBJTlQgICBpbnBvcywgb3V0cG9zOwogICBpbnQgICAgIGNvdW50LCB0eXBlPTAsIGlucXVvdGU7CiAgIGludCAgICAgT3ZlcmZsb3c7IC8qIGxvb3AgY2hlY2sgKi8KICAgV0NIQVIgICBidWZbNDBdOwogICBpbnQgICAgIGJ1Zmxlbj0wOwogICBXQ0hBUiAgIGFyZzBbXSA9IHswfSwgYXJnMVtdID0geyclJywnZCcsMH07CiAgIFdDSEFSICAgYXJnMltdID0geyclJywnMCcsJzInLCdkJywwfTsKICAgV0NIQVIgICphcmdhcnJbM107CiAgIGludCAgICAgZGF0ZXZhcnM9MCwgdGltZXZhcnM9MDsKCiAgIGFyZ2FyclswXSA9IGFyZzA7CiAgIGFyZ2FyclsxXSA9IGFyZzE7CiAgIGFyZ2FyclsyXSA9IGFyZzI7CgogICAvKiBtYWtlIGEgZGVidWcgcmVwb3J0ICovCiAgIFRSQUNFKG9sZSwgImFyZ3M6IDB4JWx4LCAweCVseCwgMHglbHgsIHRpbWUoZD0lZCxoPSVkLG09JWQscz0lZCksIGZtdDolcyAoYXQgJXApLCAiCiAgIAkgICAgICAiJXAgd2l0aCBtYXggbGVuICVkXG4iLAoJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgZGVidWdzdHJfdyhmb3JtYXQpLCBmb3JtYXQsIG91dHB1dCwgb3V0bGVuKTsKICAgCiAgIGlmKG91dGxlbiA9PSAwKSB7CiAgICAgRklYTUUob2xlLCAib3V0bGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KICAgaW5wb3MgPSBvdXRwb3MgPSAwOwogICBjb3VudCA9IDA7CiAgIGlucXVvdGUgPSBPdmVyZmxvdyA9IDA7CiAgIC8qIHRoaXMgaXMgcmVhbGx5IGp1c3QgYSBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cHV0WzBdID0gYnVmWzBdID0gMDsKICAgCiAgIC8qIHRoaXMgbG9vcCBpcyB0aGUgY29yZSBvZiB0aGUgZnVuY3Rpb24gKi8KICAgZm9yIChpbnBvcyA9IDA7IC8qIHdlIGhhdmUgc2V2ZXJhbCBicmVhayBwb2ludHMgKi8gOyBpbnBvcysrKSB7CiAgICAgIGlmIChpbnF1b3RlKSB7CgkgaWYgKGZvcm1hdFtpbnBvc10gPT0gKFdDSEFSKSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MrKzsKCSAgICAgICBvdXRwdXRbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSAwOwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsgIC8qICBub3JtYWwgZXhpdCAod2l0aGluIGEgcXVvdGUpICovCgkgfSBlbHNlIHsKCSAgICBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsgLyogY29weSBpbnB1dCAqLwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgb3V0cHV0W291dHBvcy0xXSA9IDA7IAoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgKCAoY291bnQ9PTQgJiYgdHlwZSA9PSd5JykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nTScpIHx8CgkJCShjb3VudD09NCAmJiB0eXBlID09J2QnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdnJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0naCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J0gnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdtJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ncycpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J3QnKSApICApIHsKCSBpZiAgICAgICAgKHR5cGUgPT0gJ2QnKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLAoJCQkgICAgIExPQ0FMRV9TREFZTkFNRTEgKyB4dGltZS0+d0RheU9mV2VlayAtMSwKCQkJICAgICBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsCgkJCQlMT0NBTEVfU0FCQlJFVkRBWU5BTUUxICsKCQkJCXh0aW1lLT53RGF5T2ZXZWVrIC0xLAoJCQkJYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgeHRpbWUtPndEYXkgKTsKCSAgICB9OwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnTScpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsICBMT0NBTEVfU01PTlRITkFNRTEgKwoJCQkJeHRpbWUtPndNb250aCAtMSwgYnVmLAoJCQkJc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgeHRpbWUtPndNb250aCk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAneScpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCSAgICAgICB3c25wcmludGZXKGJ1ZiwgNiwgYXJnYXJyWzFdIC8qICIlZCIgKi8sCgkJCSB4dGltZS0+d1llYXIpOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJ5eXkiLCA1KTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA2LCBhcmdhcnJbY291bnRdLAoJCQkgICAgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJICAgICAgIEZJWE1FKG9sZSwgIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wbGVtZW50ZWRcbiIpOwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJBRCIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgLyogV2luIEFQSSBzZXogd2UgY29weSBpdCB2ZXJiYXRpbSAqLwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJnIiwgNSk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAvKiBob3VycyAxOjAwLTEyOjAwIC0tLSBpcyB0aGlzIHJpZ2h0PyAqLwoJICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCAKCQkJICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgCgkJCSB4dGltZS0+d0hvdXIpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnbScgKSB7CgkgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sCgkJCSB4dGltZS0+d01pbnV0ZSk7CgkgfSBlbHNlIGlmICh0eXBlID09ICdzJyApIHsKCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwKCQkJIHh0aW1lLT53U2Vjb25kKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CgkgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAoeHRpbWUtPndIb3VyIDwgMTIpID8KCQkJICAgICBMT0NBTEVfUzExNTkgOiBMT0NBTEVfUzIzNTksCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKSApOwoJICAgIGlmICAgICAgICAoY291bnQgPT0gMSkgewoJICAgICAgIGJ1ZlsxXSA9IDA7CgkgICAgfQp9CgoJIC8qIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkLCAgd2UgbmVlZCB0byBjaGVjayB0aGlzIG5leHQgCgkgICAgY2hhcmFjdGVyIHRoZSBuZXh0IHRpbWUgd2UgbG9vcCB0aHJvdWdoICovCgkgaW5wb3MtLTsKCgkgLyogY2F0IGJ1ZiBvbnRvIHRoZSBvdXRwdXQgKi8KCSBvdXRsZW4gPSBsc3RybGVuVyhidWYpOwoJIGlmIChvdXRwb3MgKyBidWZsZW4gPCBvdXRsZW4pIHsKCSAgICBvdXRwdXRbb3V0cG9zXSA9IDA7ICAvKiBhICJob29rIiBmb3Igc3RyY2F0ICovCgkgICAgbHN0cmNhdFcob3V0cHV0LCBidWYpOwoJICAgIG91dHBvcyArPSBidWZsZW47CgkgfSBlbHNlIHsKCSAgICBvdXRwdXRbb3V0cG9zXSA9IDA7CgkgICAgbHN0cmNhdG5XKG91dHB1dCwgYnVmLCBvdXRsZW4gLSBvdXRwb3MpOwoJICAgIG91dHB1dFtvdXRsZW4gLSAxXSA9IDA7CgkgICAgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAvKiBBYm5vcm1hbCBleGl0ICovCgkgfQoKCSAvKiByZXNldCB0aGUgdmFyaWFibGVzIHdlIHVzZWQgdGhpcyB0aW1lICovCgkgY291bnQgPSAwOwoJIHR5cGUgPSAnXDAnOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBiZWdpbm5pbmcsICBiZWNhdXNlIHRoYXQgCgkgd291bGQga2VlcCB1cyBmcm9tIHByaW50aW5nIGEgZm9ybWF0IHNwZWMgdGhhdCBlbmRlZCB0aGUgCgkgc3RyaW5nICovCgkgb3V0cHV0W291dHBvc10gPSAwOwoJIGJyZWFrOyAgLyogIE5PUk1BTCBFWElUICAqLwogICAgICB9IGVsc2UgaWYgKGNvdW50KSB7CgkgLyogaG93IHdlIGtlZXAgdHJhY2sgb2YgdGhlIG1pZGRsZSBvZiBhIGZvcm1hdCBzcGVjICovCgkgY291bnQrKzsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmICggKGRhdGV2YXJzICYmIChmb3JtYXRbaW5wb3NdPT0nZCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdNJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3knIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nZycpICApIHx8CgkJICAodGltZXZhcnMgJiYgKGZvcm1hdFtpbnBvc109PSdIJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J2gnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nbScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdzJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3QnKSApICAgICkgewoJIHR5cGUgPSBmb3JtYXRbaW5wb3NdOwoJIGNvdW50ID0gMTsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSBpbnF1b3RlID0gMTsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKCSAvKiB1bnF1b3RlZCBsaXRlcmFscyAqLwoJIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwogICAgICB9CiAgIH0KCiAgIGlmIChPdmVyZmxvdykgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIFdBUk4ob2xlLCAiIGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAgIH07CgogICAvKiBmaW5hbCBzdHJpbmcgdGVybWluYXRvciBhbmQgc2FuaXR5IGNoZWNrICovCiAgIG91dHBvcysrOwogICBpZiAob3V0cG9zID4gb3V0bGVuLTEpIG91dHBvcyA9IG91dGxlbi0xOwogICBvdXRwdXRbb3V0cG9zXSA9ICcwJzsKCiAgIFRSQUNFKG9sZSwgIiByZXR1cm5pbmcgJXNcbiIsIGRlYnVnc3RyX3cob3V0cHV0KSk7CgkKICAgcmV0dXJuICghT3ZlcmZsb3cpID8gb3V0bGVuIDogMDsKICAgCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXREYXRlRm9ybWF0MzJBCVtLRVJORUwzMi4zMTBdCiAqIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgZGF0ZQogKgogKiBUaGlzIGZ1bmN0aW9uIHVzZXMgZm9ybWF0IHRvIGZvcm1hdCB0aGUgZGF0ZSwgIG9yLCAgaWYgZm9ybWF0CiAqIGlzIE5VTEwsIHVzZXMgdGhlIGRlZmF1bHQgZm9yIHRoZSBsb2NhbGUuICBmb3JtYXQgaXMgYSBzdHJpbmcKICogb2YgbGl0ZXJhbCBmaWVsZHMgYW5kIGNoYXJhY3RlcnMgYXMgZm9sbG93czoKICoKICogLSBkICAgIHNpbmdsZS1kaWdpdCAobm8gbGVhZGluZyB6ZXJvKSBkYXkgKG9mIG1vbnRoKQogKiAtIGRkICAgdHdvLWRpZ2l0IGRheSAob2YgbW9udGgpCiAqIC0gZGRkICBzaG9ydCBkYXktb2Ytd2VlayBuYW1lCiAqIC0gZGRkZCBsb25nIGRheS1vZi13ZWVrIG5hbWUKICogLSBNICAgIHNpbmdsZS1kaWdpdCBtb250aAogKiAtIE1NICAgdHdvLWRpZ2l0IG1vbnRoCiAqIC0gTU1NICBzaG9ydCBtb250aCBuYW1lCiAqIC0gTU1NTSBmdWxsIG1vbnRoIG5hbWUKICogLSB5ICAgIHR3by1kaWdpdCB5ZWFyLCBubyBsZWFkaW5nIDAKICogLSB5eSAgIHR3by1kaWdpdCB5ZWFyCiAqIC0geXl5eSBmb3VyLWRpZ2l0IHllYXIKICogLSBnZyAgIGVyYSBzdHJpbmcKICoKICovCklOVCBXSU5BUEkgR2V0RGF0ZUZvcm1hdEEoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDU1RSIGZvcm1hdCwgTFBTVFIgZGF0ZSxJTlQgZGF0ZWxlbikgCnsKICAgCiAgY2hhciBmb3JtYXRfYnVmWzQwXTsKICBMUENTVFIgdGhpc2Zvcm1hdDsKICBTWVNURU1USU1FIHQ7CiAgTFBTWVNURU1USU1FIHRoaXN0aW1lOwogIExDSUQgdGhpc2xvY2FsZTsKICBJTlQgcmV0OwoKICBUUkFDRShvbGUsIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLAoJICAgICAgbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCxkYXRlLGRhdGVsZW4pOwogIAogIGlmICghbG9jYWxlKSB7CiAgICAgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwogICAgIH07CiAgCiAgaWYgKGxvY2FsZSA9PSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwogIH0gZWxzZSB7CiAgICAgdGhpc2xvY2FsZSA9IGxvY2FsZTsKICAgfTsKCiAgaWYgKHh0aW1lID09IE5VTEwpIHsKICAgICBHZXRTeXN0ZW1UaW1lKCZ0KTsKICAgICB0aGlzdGltZSA9ICZ0OwogIH0gZWxzZSB7CiAgICAgdGhpc3RpbWUgPSB4dGltZTsKICB9OwoKICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKICAgICBHZXRMb2NhbGVJbmZvQSh0aGlzbG9jYWxlLCAoKGZsYWdzJkRBVEVfTE9OR0RBVEUpIAoJCQkJICAgPyBMT0NBTEVfU0xPTkdEQVRFCgkJCQkgICA6IExPQ0FMRV9TU0hPUlREQVRFKSwKCQkgICAgICBmb3JtYXRfYnVmLCBzaXplb2YoZm9ybWF0X2J1ZikpOwogICAgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwogIH0gZWxzZSB7CiAgICAgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKICB9OwoKICAKICByZXQgPSBPTEVfR2V0Rm9ybWF0QSh0aGlzbG9jYWxlLCBmbGFncywgMCwgdGhpc3RpbWUsIHRoaXNmb3JtYXQsIAoJCSAgICAgICBkYXRlLCBkYXRlbGVuKTsKICAKCiAgIFRSQUNFKG9sZSwgCgkgICAgICAgIkdldERhdGVGb3JtYXQzMkEoKSByZXR1cm5pbmcgJWQsIHdpdGggZGF0YT0lc1xuIiwKCSAgICAgICByZXQsIGRhdGUpOwogIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldERhdGVGb3JtYXQzMlcJW0tFUk5FTDMyLjMxMV0KICogTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgZGF0ZQogKgogKiBBY3RzIHRoZSBzYW1lIGFzIEdldERhdGVGb3JtYXQzMkEoKSwgIGV4Y2VwdCB0aGF0IGl0J3MgVW5pY29kZS4KICogQWNjZXB0cyAmIHJldHVybnMgc2l6ZXMgYXMgY291bnRzIG9mIFVuaWNvZGUgY2hhcmFjdGVycy4KICoKICovCklOVCBXSU5BUEkgR2V0RGF0ZUZvcm1hdFcoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICAgIExQV1NUUiBkYXRlLCBJTlQgZGF0ZWxlbikKewogICB1bnNpZ25lZCBzaG9ydCBkYXRlYXJyW10gPSB7JzEnLCc5JywnOScsJzQnLCctJywnMScsJy0nLCcxJywwfTsKCiAgIEZJWE1FKG9sZSwgIlNUVUIgKHNob3VsZCBjYWxsIE9MRV9HZXRGb3JtYXRXKVxuIik7ICAgCiAgIGxzdHJjcHluVyhkYXRlLCBkYXRlYXJyLCBkYXRlbGVuKTsKICAgcmV0dXJuICggIGRhdGVsZW4gPCA5KSA/IGRhdGVsZW4gOiA5OwogICAKICAgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzMzJBCShLRVJORUwzMi4xOTgpCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNBKAogIERBVEVGTVRfRU5VTVBST0NBIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRShvbGUsICJPbmx5IFVTIEVuZ2xpc2ggc3VwcG9ydGVkXG4iKTsKCiAgaWYoIWxwRGF0ZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZC95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTS9kZC95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU0vZGQveXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXkvTU0vZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NTS15eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBNTU1NIGRkLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIGRkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRShvbGUsICJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0czMyVwkoS0VSTkVMMzIuMTk5KQogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzVygKICBEQVRFRk1UX0VOVU1QUk9DVyBscERhdGVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRShvbGUsICIoJXAsICVsZCwgJWxkKTogc3R1YlxuIiwgbHBEYXRlRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzMzJBCShLRVJORUwzMi4yMTApCiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNBKAogIFRJTUVGTVRfRU5VTVBST0NBIGxwVGltZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKG9sZSwgIk9ubHkgVVMgRW5nbGlzaCBzdXBwb3J0ZWRcbiIpOwoKICBpZighbHBUaW1lRm10RW51bVByb2MpCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgaWYoZHdGbGFncykKICAgIHsKICAgICAgRklYTUUob2xlLCAiVW5rbm93biB0aW1lIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAogICAgfQogIAogIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImhoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwoKICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHMzMlcJKEtFUk5FTDMyLjIxMSkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c1coCiAgVElNRUZNVF9FTlVNUFJPQ1cgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUUob2xlLCAiKCVwLCVsZCwlbGQpOiBzdHViXG4iLCBscFRpbWVGbXRFbnVtUHJvYywgTG9jYWxlLCBkd0ZsYWdzKTsKICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXQzMkEJKEtFUk5FTDMyLjM1NSkKICovCklOVCBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0QShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgIGNvbnN0IE5VTUJFUkZNVEEgKiBscEZvcm1hdCwKCQkJICAgICAgIExQU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiBGSVhNRShmaWxlLCIlczogc3R1Yiwgbm8gcmVmb3JtYXRpbmcgZG9uZVxuIixscHZhbHVlKTsKCiBsc3RyY3B5bkEoIGxwTnVtYmVyU3RyLCBscHZhbHVlLCBjY2hOdW1iZXIgKTsKIHJldHVybiBjY2hOdW1iZXI/IGxzdHJsZW5BKCBscE51bWJlclN0ciApIDogMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdDMyVwkoS0VSTkVMMzIueHh4KQogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDV1NUUiBscHZhbHVlLCAgY29uc3QgTlVNQkVSRk1UVyAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBXU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiBGSVhNRShmaWxlLCIlczogc3R1Yiwgbm8gcmVmb3JtYXRpbmcgZG9uZVxuIixkZWJ1Z3N0cl93KGxwdmFsdWUpKTsKCiBsc3RyY3B5blcoIGxwTnVtYmVyU3RyLCBscHZhbHVlLCBjY2hOdW1iZXIgKTsKIHJldHVybiBjY2hOdW1iZXI/IGxzdHJsZW5XKCBscE51bWJlclN0ciApIDogMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlPTEUyTkxTX0NoZWNrTG9jYWxlCVtpbnRlcm5dCiAqLyAKc3RhdGljIExDSUQgT0xFMk5MU19DaGVja0xvY2FsZSAoTENJRCBsb2NhbGUpCnsKCWlmICghbG9jYWxlKSAKCXsgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwoJfQogIAoJaWYgKGxvY2FsZSA9PSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQpIAogIAl7IHJldHVybiBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJfSAKCWVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSAKCXsgcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwoJfQoJZWxzZQoJeyByZXR1cm4gbG9jYWxlOwoJfQp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFRpbWVGb3JtYXQzMkEJW0tFUk5FTDMyLjQyMl0KICogTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSB0aW1lCiAqCiAqIEZvcm1hdHMgZGF0ZSBhY2NvcmRpbmcgdG8gZm9ybWF0LCAgb3IgbG9jYWxlIGRlZmF1bHQgaWYgZm9ybWF0IGlzCiAqIE5VTEwuIFRoZSBmb3JtYXQgY29uc2lzdHMgb2YgbGl0ZXJhbCBjaGFyYWN0ZXJzIGFuZCBmaWVsZHMgYXMgZm9sbG93czoKICoKICogaCAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAqIGhoIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIEggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQogKiBISCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBtICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqIG1tIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogcyAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBzcyBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHQgIHRpbWUgbWFya2VyIChBIG9yIFApCiAqIHR0IHRpbWUgbWFya2VyIChBTSwgUE0pCiAqCiAqLwpJTlQgV0lOQVBJIApHZXRUaW1lRm9ybWF0QShMQ0lEIGxvY2FsZSwgICAgICAgIC8qIGluICAqLwoJCSBEV09SRCBmbGFncywgICAgICAgIC8qIGluICAqLwoJCSBMUFNZU1RFTVRJTUUgeHRpbWUsIC8qIGluICAqLyAKCQkgTFBDU1RSIGZvcm1hdCwgICAgICAvKiBpbiAgKi8KCQkgTFBTVFIgdGltZXN0ciwgICAgICAvKiBvdXQgKi8KCQkgSU5UIHRpbWVsZW4gICAgICAgLyogaW4gICovKSAKeyBjaGFyIGZvcm1hdF9idWZbNDBdOwogIExQQ1NUUiB0aGlzZm9ybWF0OwogIFNZU1RFTVRJTUUgdDsKICBMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CiAgTENJRCB0aGlzbG9jYWxlPTA7CiAgRFdPUkQgdGhpc2ZsYWdzPUxPQ0FMRV9TVElNRUZPUk1BVDsgLyogc3RhbmRhcnQgdGltZWZvcm1hdCAqLwogIElOVCByZXQ7CiAgICAKICBUUkFDRShvbGUsIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LHRpbWVzdHIsdGltZWxlbik7CgogIHRoaXNsb2NhbGUgPSBPTEUyTkxTX0NoZWNrTG9jYWxlICggbG9jYWxlICk7CgogIGlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCiAgeyBGSVhNRShvbGUsIlRJTUVfTk9USU1FTUFSS0VSIG9yIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQgbm90IGltcGxlbWVudGVkXG4iKTsKICB9CiAgCiAgZmxhZ3MgJj0gKFRJTUVfTk9TRUNPTkRTIHwgVElNRV9OT01JTlVURVNPUlNFQ09ORFMpOyAvKiBtYXNrIGZvciBPTEVfR2V0Rm9ybWF0QSovCgogIGlmIChmb3JtYXQgPT0gTlVMTCkgCiAgeyBpZiAoZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpICAvKnVzZSBzeXN0ZW0gZGVmYXVsdCovCiAgICB7IHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICAgfQogICAgR2V0TG9jYWxlSW5mb0EodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmb3JtYXRfYnVmLCBzaXplb2YoZm9ybWF0X2J1ZikpOwogICAgdGhpc2Zvcm1hdCA9IGZvcm1hdF9idWY7CiAgfQogIGVsc2UgCiAgeyB0aGlzZm9ybWF0ID0gZm9ybWF0OwogIH0KICAKICBpZiAoeHRpbWUgPT0gTlVMTCkgLyogTlVMTCBtZWFucyB1c2UgdGhlIGN1cnJlbnQgbG9jYWwgdGltZSovCiAgeyBHZXRTeXN0ZW1UaW1lKCZ0KTsKICAgIHRoaXN0aW1lID0gJnQ7CiAgfSAKICBlbHNlCiAgeyB0aGlzdGltZSA9IHh0aW1lOwogIH0KICByZXQgPSBPTEVfR2V0Rm9ybWF0QSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZsYWdzLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwKICAJCQkgdGltZXN0ciwgdGltZWxlbik7CiAgcmV0dXJuIHJldDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFRpbWVGb3JtYXQzMlcJW0tFUk5FTDMyLjQyM10KICogTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgdGltZQogKi8KSU5UIFdJTkFQSSAKR2V0VGltZUZvcm1hdFcoTENJRCBsb2NhbGUsICAgICAgICAvKiBpbiAgKi8KCQkgRFdPUkQgZmxhZ3MsICAgICAgICAvKiBpbiAgKi8KCQkgTFBTWVNURU1USU1FIHh0aW1lLCAvKiBpbiAgKi8gCgkJIExQQ1dTVFIgZm9ybWF0LCAgICAgLyogaW4gICovCgkJIExQV1NUUiB0aW1lc3RyLCAgICAgLyogb3V0ICovCgkJIElOVCB0aW1lbGVuICAgICAgIC8qIGluICAqLykgCnsJV0NIQVIgZm9ybWF0X2J1Zls0MF07CglMUENXU1RSIHRoaXNmb3JtYXQ7CglTWVNURU1USU1FIHQ7CglMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CglMQ0lEIHRoaXNsb2NhbGU9MDsKCURXT1JEIHRoaXNmbGFncz1MT0NBTEVfU1RJTUVGT1JNQVQ7IC8qIHN0YW5kYXJ0IHRpbWVmb3JtYXQgKi8KCUlOVCByZXQ7CgkgICAgCglUUkFDRShvbGUsIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MsCgl4dGltZSxkZWJ1Z3N0cl93KGZvcm1hdCksdGltZXN0cix0aW1lbGVuKTsKCgl0aGlzbG9jYWxlID0gT0xFMk5MU19DaGVja0xvY2FsZSAoIGxvY2FsZSApOwoKCWlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCgl7IEZJWE1FKG9sZSwiVElNRV9OT1RJTUVNQVJLRVIgb3IgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCBub3QgaW1wbGVtZW50ZWRcbiIpOwoJfQogIAoJZmxhZ3MgJj0gKFRJTUVfTk9TRUNPTkRTIHwgVElNRV9OT01JTlVURVNPUlNFQ09ORFMpOyAvKiBtYXNrIGZvciBPTEVfR2V0Rm9ybWF0QSovCgoJaWYgKGZvcm1hdCA9PSBOVUxMKSAKCXsgaWYgKGZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSAgLyp1c2Ugc3lzdGVtIGRlZmF1bHQqLwoJICB7IHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJICB9CgkgIEdldExvY2FsZUluZm9XKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZm9ybWF0X2J1ZiwgNDApOwoJICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKCX0JICAKCWVsc2UgCgl7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7Cgl9CiAKCWlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KCXsgR2V0U3lzdGVtVGltZSgmdCk7CgkgIHRoaXN0aW1lID0gJnQ7Cgl9IAoJZWxzZQoJeyB0aGlzdGltZSA9IHh0aW1lOwoJfQoKCXJldCA9IE9MRV9HZXRGb3JtYXRXKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAogIAkJCSB0aW1lc3RyLCB0aW1lbGVuKTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9BCVtLRVJORUwzMi4xOTZdCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvQSgKCUNBTElORk9fRU5VTVBST0NBIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLENBTElEIGNhbGVuZGFyLENBTFRZUEUgY2FsdHlwZQopIHsKCUZJWE1FKG9sZSwiKCVwLDB4JTA0bHgsMHglMDhseCwweCUwOGx4KSxzdHViIVxuIixjYWxpbmZvcHJvYyxsb2NhbGUsY2FsZW5kYXIsY2FsdHlwZSk7CglyZXR1cm4gRkFMU0U7Cn0K