LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAib2xlLmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImRlYnVnLmgiCgovKiBMb2NhbGUgbmFtZSB0byBpZCBtYXAuIHVzZWQgYnkgRW51bVN5c3RlbUxvY2FsZXMsIEdldExvY2FsSW5mb0EgCiAqIE1VU1QgY29udGFpbiBhbGwgI2RlZmluZXMgZnJvbSB3aW5ubHMuaAogKiBsYXN0IGVudHJ5IGhhcyBOVUxMIG5hbWUsIDAgaWQuCiAqLyAKI2RlZmluZSBMT0NBTEVfRU5UUlkoeCkJeyN4LExPQ0FMRV8jI3h9CnN0YXRpYyBzdHJ1Y3QgdGFnTE9DQUxFX05BTUUySUQgewoJY2hhcgkqbmFtZTsKCURXT1JECWlkOwp9IGxvY2FsZV9uYW1lMmlkW109IHsKCUxPQ0FMRV9FTlRSWShJTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0VOR0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoSUNPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTRU5HQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkNUUllOQU1FKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRBTlNJQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKFNMSVNUKSwKCUxPQ0FMRV9FTlRSWShJTUVBU1VSRSksCglMT0NBTEVfRU5UUlkoU0RFQ0lNQUwpLAoJTE9DQUxFX0VOVFJZKFNUSE9VU0FORCksCglMT0NBTEVfRU5UUlkoU0dST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElORUdOVU1CRVIpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVESUdJVFMpLAoJTE9DQUxFX0VOVFJZKFNDVVJSRU5DWSksCglMT0NBTEVfRU5UUlkoU0lOVExTWU1CT0wpLAoJTE9DQUxFX0VOVFJZKFNNT05ERUNJTUFMU0VQKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhPVVNBTkRTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05HUk9VUElORyksCglMT0NBTEVfRU5UUlkoSUNVUlJESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElJTlRMQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUNVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShJTkVHQ1VSUiksCglMT0NBTEVfRU5UUlkoU0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FKSwKCUxPQ0FMRV9FTlRSWShTU0hPUlREQVRFKSwKCUxPQ0FMRV9FTlRSWShTTE9OR0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FRk9STUFUKSwKCUxPQ0FMRV9FTlRSWShJREFURSksCglMT0NBTEVfRU5UUlkoSUxEQVRFKSwKCUxPQ0FMRV9FTlRSWShJVElNRSksCglMT0NBTEVfRU5UUlkoSVRJTUVNQVJLUE9TTiksCglMT0NBTEVfRU5UUlkoSUNFTlRVUlkpLAoJTE9DQUxFX0VOVFJZKElUTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElEQVlMWkVSTyksCglMT0NBTEVfRU5UUlkoSU1PTkxaRVJPKSwKCUxPQ0FMRV9FTlRSWShTMTE1OSksCglMT0NBTEVfRU5UUlkoUzIzNTkpLAoJTE9DQUxFX0VOVFJZKElDQUxFTkRBUlRZUEUpLAoJTE9DQUxFX0VOVFJZKElPUFRJT05BTENBTEVOREFSKSwKCUxPQ0FMRV9FTlRSWShJRklSU1REQVlPRldFRUspLAoJTE9DQUxFX0VOVFJZKElGSVJTVFdFRUtPRllFQVIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMSksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNCksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTgpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU5KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTApLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEyKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU1BPU0lUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoU05FR0FUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoSVBPU1NJR05QT1NOKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElQT1NTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSVBPU1NFUEJZU1BBQ0UpLAoJTE9DQUxFX0VOVFJZKElORUdTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSU5FR1NFUEJZU1BBQ0UpLAovKglMT0NBTEVfRU5UUlkoRk9OVFNJR05BVFVSRSksKi8KCXtOVUxMLDB9LAp9OwoKY29uc3Qgc3RydWN0IG1hcF9sY2lkMnN0ciB7CglMQ0lECQlsYW5naWQ7Cgljb25zdCBjaGFyCSpsYW5nbmFtZTsKfSBsYW5ndWFnZXNbXT17Cgl7MHgwNDAxLCJBcmFiaWMgKFNhdWRpIEFyYWJpYSkifSwKCXsweDA4MDEsIkFyYWJpYyAoSXJhcSkifSwKCXsweDBjMDEsIkFyYWJpYyAoRWd5cHQpIn0sCgl7MHgxMDAxLCJBcmFiaWMgKExpYnlhKSJ9LAoJezB4MTQwMSwiQXJhYmljIChBbGdlcmlhKSJ9LAoJezB4MTgwMSwiQXJhYmljIChNb3JvY2NvKSJ9LAoJezB4MWMwMSwiQXJhYmljIChUdW5pc2lhKSJ9LAoJezB4MjAwMSwiQXJhYmljIChPbWFuKSJ9LAoJezB4MjQwMSwiQXJhYmljIChZZW1lbikifSwKCXsweDI4MDEsIkFyYWJpYyAoU3lyaWEpIn0sCgl7MHgyYzAxLCJBcmFiaWMgKEpvcmRhbikifSwKCXsweDMwMDEsIkFyYWJpYyAoTGViYW5vbikifSwKCXsweDM0MDEsIkFyYWJpYyAoS3V3YWl0KSJ9LAoJezB4MzgwMSwiQXJhYmljIChVbml0ZWQgQXJhYiBFbWlyYXRlcykifSwKCXsweDNjMDEsIkFyYWJpYyAoQmFocmFpbikifSwKCXsweDQwMDEsIkFyYWJpYyAoUWF0YXIpIn0sCgl7MHgwNDAyLCJCdWxnYXJpYW4ifSwKCXsweDA0MDMsIkNhdGFsYW4ifSwKCXsweDA0MDQsIkNoaW5lc2UgKFRhaXdhbikifSwKCXsweDA4MDQsIkNoaW5lc2UgKFBlb3BsZSdzIFJlcHVibGljIG9mIENoaW5hKSJ9LAoJezB4MGMwNCwiQ2hpbmVzZSAoSG9uZyBLb25nKSJ9LAoJezB4MTAwNCwiQ2hpbmVzZSAoU2luZ2Fwb3JlKSJ9LAoJezB4MTQwNCwiQ2hpbmVzZSAoTWFjYXUpIn0sCgl7MHgwNDA1LCJDemVjaCJ9LAoJezB4MDQwNiwiRGFuaXNoIn0sCgl7MHgwNDA3LCJHZXJtYW4gKEdlcm1hbnkpIn0sCgl7MHgwODA3LCJHZXJtYW4gKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MGMwNywiR2VybWFuIChBdXN0cmlhKSJ9LAoJezB4MTAwNywiR2VybWFuIChMdXhlbWJvdXJnKSJ9LAoJezB4MTQwNywiR2VybWFuIChMaWVjaHRlbnN0ZWluKSJ9LAoJezB4MDQwOCwiR3JlZWsifSwKCXsweDA0MDksIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIn0sCgl7MHgwODA5LCJFbmdsaXNoIChVbml0ZWQgS2luZ2RvbSkifSwKCXsweDBjMDksIkVuZ2xpc2ggKEF1c3RyYWxpYSkifSwKCXsweDEwMDksIkVuZ2xpc2ggKENhbmFkYSkifSwKCXsweDE0MDksIkVuZ2xpc2ggKE5ldyBaZWFsYW5kKSJ9LAoJezB4MTgwOSwiRW5nbGlzaCAoSXJlbGFuZCkifSwKCXsweDFjMDksIkVuZ2xpc2ggKFNvdXRoIEFmcmljYSkifSwKCXsweDIwMDksIkVuZ2xpc2ggKEphbWFpY2EpIn0sCgl7MHgyNDA5LCJFbmdsaXNoIChDYXJpYmJlYW4pIn0sCgl7MHgyODA5LCJFbmdsaXNoIChCZWxpemUpIn0sCgl7MHgyYzA5LCJFbmdsaXNoIChUcmluaWRhZCkifSwKCXsweDMwMDksIkVuZ2xpc2ggKFppbWJhYndlKSJ9LAoJezB4MzQwOSwiRW5nbGlzaCAoUGhpbGlwcGluZXMpIn0sCgl7MHgwNDBhLCJTcGFuaXNoIChTcGFpbiwgdHJhZGl0aW9uYWwgc29ydGluZykifSwKCXsweDA4MGEsIlNwYW5pc2ggKE1leGljbykifSwKCXsweDBjMGEsIlNwYW5pc2ggKFNwYWluLCBpbnRlcm5hdGlvbmFsIHNvcnRpbmcpIn0sCgl7MHgxMDBhLCJTcGFuaXNoIChHdWF0ZW1hbGEpIn0sCgl7MHgxNDBhLCJTcGFuaXNoIChDb3N0YSBSaWNhKSJ9LAoJezB4MTgwYSwiU3BhbmlzaCAoUGFuYW1hKSJ9LAoJezB4MWMwYSwiU3BhbmlzaCAoRG9taW5pY2FuIFJlcHVibGljKSJ9LAoJezB4MjAwYSwiU3BhbmlzaCAoVmVuZXp1ZWxhKSJ9LAoJezB4MjQwYSwiU3BhbmlzaCAoQ29sb21iaWEpIn0sCgl7MHgyODBhLCJTcGFuaXNoIChQZXJ1KSJ9LAoJezB4MmMwYSwiU3BhbmlzaCAoQXJnZW50aW5hKSJ9LAoJezB4MzAwYSwiU3BhbmlzaCAoRWN1YWRvcikifSwKCXsweDM0MGEsIlNwYW5pc2ggKENoaWxlKSJ9LAoJezB4MzgwYSwiU3BhbmlzaCAoVXJ1Z3VheSkifSwKCXsweDNjMGEsIlNwYW5pc2ggKFBhcmFndWF5KSJ9LAoJezB4NDAwYSwiU3BhbmlzaCAoQm9saXZpYSkifSwKCXsweDQ0MGEsIlNwYW5pc2ggKEVsIFNhbHZhZG9yKSJ9LAoJezB4NDgwYSwiU3BhbmlzaCAoSG9uZHVyYXMpIn0sCgl7MHg0YzBhLCJTcGFuaXNoIChOaWNhcmFndWEpIn0sCgl7MHg1MDBhLCJTcGFuaXNoIChQdWVydG8gUmljbykifSwKCXsweDA0MGIsIkZpbm5pc2gifSwKCXsweDA0MGMsIkZyZW5jaCAoRnJhbmNlKSJ9LAoJezB4MDgwYywiRnJlbmNoIChCZWxnaXVtKSJ9LAoJezB4MGMwYywiRnJlbmNoIChDYW5hZGEpIn0sCgl7MHgxMDBjLCJGcmVuY2ggKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MTQwYywiRnJlbmNoIChMdXhlbWJvdXJnKSJ9LAoJezB4MTgwYywiRnJlbmNoIChNb25hY28pIn0sCgl7MHgwNDBkLCJIZWJyZXcifSwKCXsweDA0MGUsIkh1bmdhcmlhbiJ9LAoJezB4MDQwZiwiSWNlbGFuZGljIn0sCgl7MHgwNDEwLCJJdGFsaWFuIChJdGFseSkifSwKCXsweDA4MTAsIkl0YWxpYW4gKFN3aXR6ZXJsYW5kKSJ9LAoJezB4MDQxMSwiSmFwYW5lc2UifSwKCXsweDA0MTIsIktvcmVhbiAoV2Fuc3VuZykifSwKCXsweDA4MTIsIktvcmVhbiAoSm9oYWIpIn0sCgl7MHgwNDEzLCJEdXRjaCAoTmV0aGVybGFuZHMpIn0sCgl7MHgwODEzLCJEdXRjaCAoQmVsZ2l1bSkifSwKCXsweDA0MTQsIk5vcndlZ2lhbiAoQm9rbWFsKSJ9LAoJezB4MDgxNCwiTm9yd2VnaWFuIChOeW5vcnNrKSJ9LAoJezB4MDQxNSwiUG9saXNoIn0sCgl7MHgwNDE2LCJQb3J0dWd1ZXNlIChCcmF6aWwpIn0sCgl7MHgwODE2LCJQb3J0dWd1ZXNlIChQb3J0dWdhbCkifSwKCXsweDA0MTcsIlJoYWV0byBSb21hbmljIn0sCgl7MHgwNDE4LCJSb21hbmlhbiJ9LAoJezB4MDgxOCwiTW9sZGF2aWFuIn0sCgl7MHgwNDE5LCJSdXNzaWFuIChSdXNzaWEpIn0sCgl7MHgwODE5LCJSdXNzaWFuIChNb2xkYXZpYSkifSwKCXsweDA0MWEsIkNyb2F0aWFuIn0sCgl7MHgwODFhLCJTZXJiaWFuIChsYXRpbikifSwKCXsweDBjMWEsIlNlcmJpYW4gKGN5cmlsbGljKSJ9LAoJezB4MDQxYiwiU2xvdmFrIn0sCgl7MHgwNDFjLCJBbGJhbmlhbiJ9LAoJezB4MDQxZCwiU3dlZGlzaCAoU3dlZGVuKSJ9LAoJezB4MDgxZCwiU3dlZGlzaCAoRmlubGFuZCkifSwKCXsweDA0MWUsIlRoYWkifSwKCXsweDA0MWYsIlR1cmtpc2gifSwKCXsweDA0MjAsIlVyZHUifSwKCXsweDA0MjEsIkluZG9uZXNpYW4ifSwKCXsweDA0MjIsIlVrcmFpbmlhbiJ9LAoJezB4MDQyMywiQmVsYXJ1c2lhbiJ9LAoJezB4MDQyNCwiU2xvdmVuZSJ9LAoJezB4MDQyNSwiRXN0b25pYW4ifSwKCXsweDA0MjYsIkxhdHZpYW4ifSwKCXsweDA0MjcsIkxpdGh1YW5pYW4gKG1vZGVybikifSwKCXsweDA4MjcsIkxpdGh1YW5pYW4gKGNsYXNzaWMpIn0sCgl7MHgwNDI4LCJNYW9yaSJ9LAoJezB4MDQyOSwiRmFyc2kifSwKCXsweDA0MmEsIlZpZXRuYW1lc2UifSwKCXsweDA0MmIsIkFybWVuaWFuIn0sCgl7MHgwNDJjLCJBemVyaSAobGF0aW4pIn0sCgl7MHgwODJjLCJBemVyaSAoY3lyaWxsaWMpIn0sCgl7MHgwNDJkLCJCYXNxdWUifSwKCXsweDA0MmUsIlNvcmJpYW4ifSwKCXsweDA0MmYsIk1hY2Vkb25pYW4ifSwKCXsweDA0MzAsIlN1dHUifSwKCXsweDA0MzEsIlRzb25nYSJ9LAoJezB4MDQzMiwiVHN3YW5hIn0sCgl7MHgwNDMzLCJWZW5kYSJ9LAoJezB4MDQzNCwiWGhvc2EifSwKCXsweDA0MzUsIlp1bHUifSwKCXsweDA0MzYsIkFmcmlrYWFucyJ9LAoJezB4MDQzNywiR2VvcmdpYW4ifSwKCXsweDA0MzgsIkZhZXJvZXNlIn0sCgl7MHgwNDM5LCJIaW5kaSJ9LAoJezB4MDQzYSwiTWFsdGVzZSJ9LAoJezB4MDQzYiwiU2FhbWkifSwKCXsweDA0M2MsIklyaXNoIGdhZWxpYyJ9LAoJezB4MDgzYywiU2NvdHRpc2ggZ2FlbGljIn0sCgl7MHgwNDNlLCJNYWxheSAoTWFsYXlzaWEpIn0sCgl7MHgwODNlLCJNYWxheSAoQnJ1bmVpIERhcnVzc2FsYW0pIn0sCgl7MHgwNDNmLCJLYXphayJ9LAoJezB4MDQ0MSwiU3dhaGlsaSJ9LAoJezB4MDQ0MywiVXpiZWsgKGxhdGluKSJ9LAoJezB4MDg0MywiVXpiZWsgKGN5cmlsbGljKSJ9LAoJezB4MDQ0NCwiVGF0YXIifSwKCXsweDA0NDUsIkJlbmdhbGkifSwKCXsweDA0NDYsIlB1bmphYmkifSwKCXsweDA0NDcsIkd1amFyYXRpIn0sCgl7MHgwNDQ4LCJPcml5YSJ9LAoJezB4MDQ0OSwiVGFtaWwifSwKCXsweDA0NGEsIlRlbHVndSJ9LAoJezB4MDQ0YiwiS2FubmFkYSJ9LAoJezB4MDQ0YywiTWFsYXlhbGFtIn0sCgl7MHgwNDRkLCJBc3NhbWVzZSJ9LAoJezB4MDQ0ZSwiTWFyYXRoaSJ9LAoJezB4MDQ0ZiwiU2Fuc2tyaXQifSwKCXsweDA0NTcsIktvbmthbmkifSwKCXsweDA0OGYsIkVzcGVyYW50byJ9LCAvKiBOb24gb2ZmaWNpYWwgKi8KCXsweDAwMDAsIlVua25vd24ifQogICAgfSwgbGFuZ3VhZ2VzX2RlW109ewoJezB4MDQwMSwiQXJhYmljIn0sCgl7MHgwNDAyLCJCdWxnYXJpc2NoIn0sCgl7MHgwNDAzLCJLYXRhbGFuaXNjaCJ9LAoJezB4MDQwNCwiVHJhZGl0aW9uYWxlcyBDaGluZXNpc2NoIn0sCgl7MHgwNDA1LCJUc2NoZWNpc2NoIn0sCgl7MHgwNDA2LCJE5G5pc2NoIn0sCgl7MHgwNDA3LCJEZXV0c2NoIn0sCgl7MHgwNDA4LCJHcmllY2hpc2NoIn0sCgl7MHgwNDA5LCJBbWVyaWthbmlzY2hlcyBFbmdsaXNjaCJ9LAoJezB4MDQwQSwiS2FzdGlsaXNjaGVzIFNwYW5pc2NoIn0sCgl7MHgwNDBCLCJGaW5uaXNjaCJ9LAoJezB4MDQwQywiRnJhbnp2c2lzY2gifSwKCXsweDA0MEQsIkhlYnJkaXNjaCJ9LAoJezB4MDQwRSwiVW5nYXJpc2NoIn0sCgl7MHgwNDBGLCJJc2xkbmRpc2NoIn0sCgl7MHgwNDEwLCJJdGFsaWVuaXNjaCJ9LAoJezB4MDQxMSwiSmFwYW5pc2NoIn0sCgl7MHgwNDEyLCJLb3JlYW5pc2NoIn0sCgl7MHgwNDEzLCJOaWVkZXJsZG5kaXNjaCJ9LAoJezB4MDQxNCwiTm9yd2VnaXNjaC1Cb2ttYWwifSwKCXsweDA0MTUsIlBvbG5pc2NoIn0sCgl7MHgwNDE2LCJCcmFzaWxpYW5pc2NoZXMgUG9ydHVnaWVzaXNjaCJ9LAoJezB4MDQxNywiUmR0b3JvbWFuaXNjaCJ9LAoJezB4MDQxOCwiUnVtZG5pc2NoIn0sCgl7MHgwNDE5LCJSdXNzaXNjaCJ9LAoJezB4MDQxQSwiS3JvYXRvc2VyYmlzY2ggKGxhdGVpbmlzY2gpIn0sCgl7MHgwNDFCLCJTbG93ZW5pc2NoIn0sCgl7MHgwNDFDLCJBbGJhbmlzY2gifSwKCXsweDA0MUQsIlNjaHdlZGlzY2gifSwKCXsweDA0MUUsIlRoYWkifSwKCXsweDA0MUYsIlT8cmtpc2NoIn0sCgl7MHgwNDIwLCJVcmR1In0sCgl7MHgwNDIxLCJCYWhhc2EifSwKCXsweDA4MDQsIlZlcmVpbmZhY2h0ZXMgQ2hpbmVzaXNjaCJ9LAoJezB4MDgwNywiU2Nod2VpemVyZGV1dHNjaCJ9LAoJezB4MDgwOSwiQnJpdGlzY2hlcyBFbmdsaXNjaCJ9LAoJezB4MDgwQSwiTWV4aWthbmlzY2hlcyBTcGFuaXNjaCJ9LAoJezB4MDgwQywiQmVsZ2lzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MDgxMCwiU2Nod2VpemVyaXNjaGVzIEl0YWxpZW5pc2NoIn0sCgl7MHgwODEzLCJCZWxnaXNjaGVzIE5pZWRlcmxkbmRpc2NoIn0sCgl7MHgwODE0LCJOb3Jnd2VnaXNjaC1OeW5vcnNrIn0sCgl7MHgwODE2LCJQb3J0dWdpZXNpc2NoIn0sCgl7MHgwODFBLCJTZXJib2tyYXRpc2NoIChreXJpbGxpc2NoKSJ9LAoJezB4MEMxQywiS2FuYWRpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDEwMEMsIlNjaHdlaXplcmlzY2hlcyBGcmFuenZzaXNjaCJ9LAoJezB4MDAwMCwiVW5iZWthbm50In0sCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldFVzZXJEZWZhdWx0TENJRCAgICAgICAoT0xFMk5MUy4xKQogKi8KTENJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMQ0lEKCkKewovKiBEZWZhdWx0IHNvcnRpbmcsIG5ldXRyYWwgc3VibGFuZ3VhZ2UgKi8KLyogbGFuZ3VhZ2UgbmFtZXMgZm9sbG93aW5nIElTTyA2MzkgKHJmYyAxNzY2KSAqLwogICAgc3dpdGNoKE9wdGlvbnMubGFuZ3VhZ2UpCiAgICB7CiAvKiBjYXNlIExBTkdfQXI6IHJldHVybiAweDAxOyAqLyAgICAgIC8qIEFyYWJpYyAqLwogLyogY2FzZSBMQU5HX0J1OiByZXR1cm4gMHgwMjsgKi8gICAgICAvKiBCdWxnYXJpYW4gKi8KICAgIGNhc2UgTEFOR19DYTogcmV0dXJuIDB4MDM7ICAgICAgICAgLyogQ2F0YWxhbiAqLwogLyogY2FzZSBMQU5HX1poOiByZXR1cm4gMHgwNDsgKi8gICAgICAvKiBDaGluZXNlICovCiAgICBjYXNlIExBTkdfQ3M6IHJldHVybiAweDA1OyAgICAgICAgIC8qIEN6ZWNoICovCiAgICBjYXNlIExBTkdfRGE6IHJldHVybiAweDA2OyAgICAgICAgIC8qIERhbmlzaCAqLwogICAgY2FzZSBMQU5HX0RlOiByZXR1cm4gMHgwNzsgICAgICAgICAvKiBHZXJtYW4gKi8KIC8qIGNhc2UgTEFOR19FbDogcmV0dXJuIDB4MDg7ICovICAgICAgLyogR3JlZWsgKi8KICAgIGNhc2UgTEFOR19FbjogcmV0dXJuIDB4MDk7ICAgICAgICAgLyogRW5nbGlzaCAqLwogICAgY2FzZSBMQU5HX0VzOiByZXR1cm4gMHgwYTsgICAgICAgICAvKiBTcGFuaXNoICovCiAgICBjYXNlIExBTkdfRmk6IHJldHVybiAweDBiOyAgICAgICAgIC8qIEZpbm5pc2ggKi8KICAgIGNhc2UgTEFOR19GcjogcmV0dXJuIDB4MGM7ICAgICAgICAgLyogRnJlbmNoICovCiAvKiBjYXNlIExBTkdfSXc6IHJldHVybiAweDBkOyAqLyAgICAgIC8qIEhlYnJldyAqLwogICAgY2FzZSBMQU5HX0h1OiByZXR1cm4gMHgwZTsgICAgICAgICAvKiBIdW5nYXJpYW4gKi8KIC8qIGNhc2UgTEFOR19JYzogcmV0dXJuIDB4MGY7ICovICAgICAgLyogSWNlbGFuZGljICovCiAgICBjYXNlIExBTkdfSXQ6IHJldHVybiAweDEwOyAgICAgICAgIC8qIEl0YWxpYW4gKi8KIC8qIGNhc2UgTEFOR19KYTogcmV0dXJuIDB4MTE7ICovICAgICAgLyogSmFwYW5lc2UgKi8KICAgIGNhc2UgTEFOR19LbzogcmV0dXJuIDB4MTI7ICAgICAgICAgLyogS29yZWFuICovCiAvKiBjYXNlIExBTkdfTmw6IHJldHVybiAweDEzOyAqLyAgICAgIC8qIER1dGNoICovCiAgICBjYXNlIExBTkdfTm86IHJldHVybiAweDE0OyAgICAgICAgIC8qIE5vcndlZ2lhbiAqLwogICAgY2FzZSBMQU5HX1BsOiByZXR1cm4gMHgxNTsgICAgICAgICAvKiBQb2xpc2ggKi8KICAgIGNhc2UgTEFOR19QdDogcmV0dXJuIDB4MTY7ICAgICAgICAgLyogUG9ydHVndWVzZSAqLwogLyogY2FzZSBMQU5HX1JtOiByZXR1cm4gMHgxNzsgKi8gICAgICAvKiBSaGFldG8tcm9tYW5jZSAqLyAgIAogLyogY2FzZSBMQU5HX1JvOiByZXR1cm4gMHgxODsgKi8gICAgICAvKiBSb21hbmlhbiAqLwogLyogY2FzZSBMQU5HX1J1OiByZXR1cm4gMHgxOTsgKi8gICAgICAvKiBSdXNzaWFuICovCiAvKiBjYXNlIExBTkdfSHI6IHJldHVybiAweDFhOyAqLyAgICAgIC8qIENyb2F0aWFuICovCiAvKiBjYXNlIExBTkdfU2s6IHJldHVybiAweDFiOyAqLyAgICAgIC8qIFNsb3ZhayAqLwogLyogY2FzZSBMQU5HX1NxOiByZXR1cm4gMHgxYzsgKi8gICAgICAvKiBBbGJhbmlhbiAqLwogICAgY2FzZSBMQU5HX1N2OiByZXR1cm4gMHgxZDsgICAgICAgICAvKiBTd2VkaXNoICovCiAvKiBjYXNlIExBTkdfVGg6IHJldHVybiAweDFlOyAqLyAgICAgIC8qIFRoYWkgKi8KIC8qIGNhc2UgTEFOR19UcjogcmV0dXJuIDB4MWY7ICovICAgICAgLyogVHVya2lzaCAqLwogLyogY2FzZSBMQU5HX1VyOiByZXR1cm4gMHgyMDsgKi8gICAgICAvKiBVcmR1ICovCiAvKiBjYXNlIExBTkdfSW46IHJldHVybiAweDIxOyAqLyAgICAgIC8qIEluZG9uZXNpYW4gKi8KIC8qIGNhc2UgTEFOR19VazogcmV0dXJuIDB4MjI7ICovICAgICAgLyogVWtyYWluaWFuICovCiAvKiBjYXNlIExBTkdfQmU6IHJldHVybiAweDIzOyAqLyAgICAgIC8qIEJlbGFydXNpYW4gKi8KIC8qIGNhc2UgTEFOR19TbDogcmV0dXJuIDB4MjQ7ICovICAgICAgLyogU2xvdmVuaWFuICovCiAvKiBjYXNlIExBTkdfRXQ6IHJldHVybiAweDI1OyAqLyAgICAgIC8qIEVzdG9uaWFuICovCiAvKiBjYXNlIExBTkdfTHY6IHJldHVybiAweDI2OyAqLyAgICAgIC8qIExhdHZpYW4gKi8KIC8qIGNhc2UgTEFOR19MdDogcmV0dXJuIDB4Mjc7ICovICAgICAgLyogTGl0aHVhbmlhbiAqLwogLyogY2FzZSBMQU5HX01pOiByZXR1cm4gMHgyODsgKi8gICAgICAvKiBNYW9yaSAqLwogLyogY2FzZSBMQU5HX0ZhOiByZXR1cm4gMHgyOTsgKi8gICAgICAvKiBGYXJzaSAqLwogLyogY2FzZSBMQU5HX1ZpOiByZXR1cm4gMHgyYTsgKi8gICAgICAvKiBWaWV0bmFtZXNlICovCiAvKiBjYXNlIExBTkdfSHk6IHJldHVybiAweDJiOyAqLyAgICAgIC8qIEFybWVuaWFuICovCiAvKiBjYXNlIExBTkdfQXo6IHJldHVybiAweDJjOyAqLyAgICAgIC8qIEF6ZXJpICovCiAvKiBjYXNlIExBTkdfRXU6IHJldHVybiAweDJkOyAqLyAgICAgIC8qIEJhc3F1ZSAqLwogLyogY2FzZSBMQU5HXz8/OiByZXR1cm4gMHgyZTsgKi8gICAgICAvKiBTb3JiaWFuICovCiAvKiBjYXNlIExBTkdfTWs6IHJldHVybiAweDJmOyAqLyAgICAgIC8qIE1hY2Vkb25pYW4gKi8KIC8qIGNhc2UgTEFOR18/PzogcmV0dXJuIDB4MzA7ICovICAgICAgLyogU3V0dSAqLwogLyogY2FzZSBMQU5HX1RzOiByZXR1cm4gMHgzMTsgKi8gICAgICAvKiBUc29uZ2EgKi8KIC8qIGNhc2UgTEFOR18/PzogcmV0dXJuIDB4MzI7ICovICAgICAgLyogVHN3YW5hICovCiAvKiBjYXNlIExBTkdfPz86IHJldHVybiAweDMzOyAqLyAgICAgIC8qIFZlbmRhICovCiAvKiBjYXNlIExBTkdfWGg6IHJldHVybiAweDM0OyAqLyAgICAgIC8qIFhob3NhICovCiAvKiBjYXNlIExBTkdfWnU6IHJldHVybiAweDM1OyAqLyAgICAgIC8qIFp1bHUgKi8KIC8qIGNhc2UgTEFOR19BZjogcmV0dXJuIDB4MzY7ICovICAgICAgLyogQWZyaWthYW5zICovCiAvKiBjYXNlIExBTkdfS2E6IHJldHVybiAweDM3OyAqLyAgICAgIC8qIEdlb3JnaWFuICovCiAvKiBjYXNlIExBTkdfRm86IHJldHVybiAweDM4OyAqLyAgICAgIC8qIEZhZXJvZXNlICovCiAvKiBjYXNlIExBTkdfSGk6IHJldHVybiAweDM5OyAqLyAgICAgIC8qIEhpbmRpICovCiAvKiBjYXNlIExBTkdfTXQ6IHJldHVybiAweDNhOyAqLyAgICAgIC8qIE1hbHRlc2UgKi8KIC8qIGNhc2UgTEFOR18/PzogcmV0dXJuIDB4M2I7ICovICAgICAgLyogU2FhbWkgKi8KIC8qIGNhc2UgTEFOR19HYTogcmV0dXJuIDB4M2M7ICovICAgICAgLyogR2FlbGljICovCiAvKiBjYXNlIExBTkdfTXM6IHJldHVybiAweDNlOyAqLyAgICAgIC8qIE1hbGF5ICovCiAvKiBjYXNlIExBTkdfS2s6IHJldHVybiAweDNmOyAqLyAgICAgIC8qIEthemFraCAqLwogLyogY2FzZSBMQU5HX1N3OiByZXR1cm4gMHg0MTsgKi8gICAgICAvKiBTd2FoaWxpICovCiAvKiBjYXNlIExBTkdfVXo6IHJldHVybiAweDQzOyAqLyAgICAgIC8qIFV6YmVrICovCiAvKiBjYXNlIExBTkdfVHQ6IHJldHVybiAweDQ0OyAqLyAgICAgIC8qIFRhdGFyICovCiAvKiBjYXNlIExBTkdfQm46IHJldHVybiAweDQ1OyAqLyAgICAgIC8qIEJlbmdhbGkgKi8KIC8qIGNhc2UgTEFOR19QYTogcmV0dXJuIDB4NDY7ICovICAgICAgLyogUHVuamFiaSAqLwogLyogY2FzZSBMQU5HX0d1OiByZXR1cm4gMHg0NzsgKi8gICAgICAvKiBHdWphcmF0aSAqLwogLyogY2FzZSBMQU5HX09yOiByZXR1cm4gMHg0ODsgKi8gICAgICAvKiBPcml5YSAqLwogLyogY2FzZSBMQU5HX1RhOiByZXR1cm4gMHg0OTsgKi8gICAgICAvKiBUYW1pbCAqLwogLyogY2FzZSBMQU5HX1RlOiByZXR1cm4gMHg0YTsgKi8gICAgICAvKiBUZWx1Z3UgKi8KIC8qIGNhc2UgTEFOR19LbjogcmV0dXJuIDB4NGI7ICovICAgICAgLyogS2FubmFkYSAqLwogLyogY2FzZSBMQU5HX01sOiByZXR1cm4gMHg0YzsgKi8gICAgICAvKiBNYWxheWFsYW0gKi8KIC8qIGNhc2UgTEFOR19BczogcmV0dXJuIDB4NGQ7ICovICAgICAgLyogQXNzYW1lc2UgKi8KIC8qIGNhc2UgTEFOR19NcjogcmV0dXJuIDB4NGU7ICovICAgICAgLyogTWFyYXRoaSAqLwogLyogY2FzZSBMQU5HX1NhOiByZXR1cm4gMHg0ZjsgKi8gICAgICAvKiBTYW5za3JpdCAqLwogLyogY2FzZSBMQU5HXz8/OiByZXR1cm4gMHg1NzsgKi8gICAgICAvKiBLb25rYW5pICovCiAgICBjYXNlIExBTkdfRW86IHJldHVybiAweDhmOyAgICAgICAgIC8qIEVzcGVyYW50byAobm90IG9mZmljaWFsIG51bWJlcikgKi8KCiAgICBkZWZhdWx0OgoJcmV0dXJuIDB4MDA7ICAgICAgICAgICAgICAgICAgIC8qIE5ldXRyYWwgbGFuZ3VhZ2UgKi8KICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMikKICovCkxDSUQgV0lOQVBJIEdldFN5c3RlbURlZmF1bHRMQ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRVc2VyRGVmYXVsdExhbmdJRCAgICAgICAoT0xFMk5MUy4zKQogKi8KTEFOR0lEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExhbmdJRCgpCnsKCXJldHVybiAweDQwMHwoV09SRClHZXRVc2VyRGVmYXVsdExDSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCAgICAgKE9MRTJOTFMuNCkKICovCkxBTkdJRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCgpCnsKCXJldHVybiAweDQwMHxHZXRVc2VyRGVmYXVsdExhbmdJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRMb2NhbGVJbmZvQSAgICAgICAgICAgICAoT0xFMk5MUy41KQogKiBJcyB0aGUgbGFzdCBwYXJhbWV0ZXIgcmVhbGx5IFdPUkQgZm9yIFdpbjE2PwogKi8KSU5UMTYgV0lOQVBJIEdldExvY2FsZUluZm8xNihMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFNUUiBidWYsSU5UMTYgbGVuKQp7CglyZXR1cm4gR2V0TG9jYWxlSW5mbzMyQShsY2lkLExDVHlwZSxidWYsbGVuKTsKfQoKSU5UMzIgV0lOQVBJIEdldExvY2FsZUluZm8zMkEoTENJRCBsY2lkLExDVFlQRSBMQ1R5cGUsTFBTVFIgYnVmLElOVDMyIGxlbikKewoJY2hhcgkqcmV0U3RyaW5nOwoJaW50CWZvdW5kLGk7CgoJVFJBQ0Uob2xlLCIoMHglbHgsMHglbHgsJXAsJXgpXG4iLAoJCQlsY2lkLExDVHlwZSxidWYsbGVuKTsKCglMQ1R5cGUgJj0gfihMT0NBTEVfTk9VU0VST1ZFUlJJREV8TE9DQUxFX1VTRV9DUF9BQ1ApOwoKCS8qIEFzIGFuIG9wdGlvbiwgd2UgY291bGQgb2J0YWluIHRoZSB2YWx1ZSBmcm9tIHdpbi5pbmkuCgkgICBUaGlzIHdvdWxkIG5vdCBtYXRjaCB0aGUgV2luZSBjb21waWxlLXRpbWUgb3B0aW9uLgoJICAgQWxzbywgbm90IGFsbCBpZGVudGlmaWVycyBhcmUgYXZhaWxhYmxlIGZyb20gd2luLmluaSAqLwoJcmV0U3RyaW5nPTA7CgkvKiBJZiB3ZSBhcmUgdGhyb3VnaCBhbGwgb2YgdGhpcywgcmV0TGVuIHNob3VsZCBub3QgYmUgemVybyBhbnltb3JlLgoJICAgSWYgaXQgaXMsIHRoZSB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkICovCglpPTA7Cgl3aGlsZSAobG9jYWxlX25hbWUyaWRbaV0ubmFtZSE9TlVMTCkgewoJCWlmIChMQ1R5cGUgPT0gbG9jYWxlX25hbWUyaWRbaV0uaWQpIHsKCQkJcmV0U3RyaW5nID0gbG9jYWxlX25hbWUyaWRbaV0ubmFtZTsKCQkJYnJlYWs7CgkJfQoJCWkrKzsKCX0KCWlmICghcmV0U3RyaW5nKSB7CgkJV0FSTihvbGUsIlVua293biBMQyB0eXBlICVsWFxuIixMQ1R5cGUpOwoJCXJldHVybiAwOwoJfQoKI2RlZmluZSBMT0NWQUwodHlwZSx2YWx1ZSkgY2FzZSB0eXBlOnJldFN0cmluZz12YWx1ZTticmVhazsKCi8qIE5vdywgdGhlIGxhbmd1YWdlIHNwZWNpZmljIGRlZmluaXRpb25zLiBUaGV5IGRvbid0IGhhdmUgdG8gYmUKICAgY29tcGxldGUgKi8KICAgIGZvdW5kPTE7CiAgICBzd2l0Y2goT3B0aW9ucy5sYW5ndWFnZSkKICAgIHsKICAgIGNhc2UgTEFOR19EZToKICAgIAlzd2l0Y2ggKExDVHlwZSkgewojaW5jbHVkZSAibmxzL2RldS5ubHMiCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7ICAvKiBMQU5HKERlKSAqLwoKICAgIGNhc2UgTEFOR19EYToKICAgIAlzd2l0Y2ggKExDVHlwZSkgewojaW5jbHVkZSAibmxzL2Ruay5ubHMiCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7IC8qIExBTkcoRGEpICovCgogICAgY2FzZSBMQU5HX0VuOgogICAgCXN3aXRjaCAoTENUeXBlKSB7CiNpbmNsdWRlICJubHMvZW51Lm5scyIKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgIC8qIExBTkcoRW4pICovCgogICAgY2FzZSBMQU5HX0VvOgogICAgCXN3aXRjaCAoTENUeXBlKSB7CiNpbmNsdWRlICJubHMvZXNwZXJhbnRvLm5scyIKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgIC8qIExBTkcoRW8pICovCgogICAgY2FzZSBMQU5HX0ZpOgogICAgCXN3aXRjaCAoTENUeXBlKSB7CiNpbmNsdWRlICJubHMvZmluLm5scyIKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgIC8qIExBTkcoRmkpICovCgogICAgY2FzZSBMQU5HX0l0OgogICAgCXN3aXRjaCAoTENUeXBlKSB7CiNpbmNsdWRlICJubHMvaXRhLm5scyIKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgIC8qIExBTkcoSXQpICovCgogICAgY2FzZSAweDA4MDk6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKI2luY2x1ZGUgIm5scy9lbmcubmxzIgoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAvKiBMQU5HKDB4MDgwOSkgKFUuSy4gRW5nbGlzaCkgKi8KCiAgICBjYXNlIExBTkdfS286IC8qIHN0cmluZyB1c2luZyBjb2RlcGFnZSA5NDkgKi8KICAgICAgICBzd2l0Y2ggKExDVHlwZSkgewojaW5jbHVkZSAibmxzL2tvci5ubHMiCiAgICAgICAgZGVmYXVsdDogZm91bmQ9MDticmVhazsKICAgICAgICB9CiAgICBicmVhazsgIC8qIExBTkcoS28pICovCgogICAgY2FzZSBMQU5HX0h1OgogICAgCXN3aXRjaCAoTENUeXBlKSB7CiNpbmNsdWRlICJubHMvaHVuLm5scyIKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgIC8qIExBTkcoRW4pICovCgogICAgY2FzZSBMQU5HX1BsOgogICAgCXN3aXRjaCAoTENUeXBlKSB7CiNpbmNsdWRlICJubHMvcGxrLm5scyIKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgIC8qIExBTkcoUGwpICovCgogICAgY2FzZSBMQU5HX1B0OgogICAgCXN3aXRjaCAoTENUeXBlKSB7CiNpbmNsdWRlICJubHMvcHRiLm5scyIKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgLyogTEFORyhQdCkgKi8KCiAgICBjYXNlIExBTkdfU3Y6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKI2luY2x1ZGUgIm5scy9zdmUubmxzIgoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAvKiBMQU5HKFN2KSAqLwoKLypJbnNlcnQgb3RoZXIgbGFuZ3VhZ2VzIGhlcmUqLwoKICAgIGRlZmF1bHQ6CiAgICAJZm91bmQ9MDsKCWJyZWFrOwogICAgfSAgLyogc3dpdGNoICovCgoJaWYoIWZvdW5kKSB7CgkJRVJSKG9sZSwiJyVzJyBub3Qgc3VwcG9ydGVkIGZvciB5b3VyIGxhbmd1YWdlLlxuIiwKCQkJcmV0U3RyaW5nKTsKCQlyZXRTdHJpbmcgPSAiPFdJTkUtTkxTLXVua25vd24+IjsKCQkvKnJldHVybiAwOyovCgl9CglpZiAoYnVmKQoJCWxzdHJjcHluMzJBKGJ1ZixyZXRTdHJpbmcsbGVuKTsKCXJldHVybiBzdHJsZW4ocmV0U3RyaW5nKSsxOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRMb2NhbGVJbmZvMzJXICAgICAgICAgICAgIChLRVJORUwzMi4yMzApCiAqIElzIHRoZSBsYXN0IHBhcmFtZXRlciByZWFsbHkgV09SRCBmb3IgV2luMTY/CiAqLwpJTlQzMiBXSU5BUEkgR2V0TG9jYWxlSW5mbzMyVyhMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFdTVFIgd2J1ZixJTlQzMiBsZW4pCnsKCUxQU1RSIGFidWYgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4pOwoKCUlOVDMyIG4gPSBHZXRMb2NhbGVJbmZvMzJBKGxjaWQsIExDVHlwZSwgYWJ1ZiwgbGVuKTsKCWlmICh3YnVmKQoJCWxzdHJjcHluQXRvVyh3YnVmLGFidWYsbGVuKTsKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxhYnVmKTsKCXJldHVybiBuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFNldExvY2FsZUluZm9BICAgICAgIFtLRVJORUwzMi40OTldCiAqLwpCT09MMTYgV0lOQVBJIFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpCnsKICAgIEZJWE1FKG9sZSwiKCVsZCwlbGQsJXMpOiBzdHViXG4iLGxjaWQsbGN0eXBlLGRhdGEpOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgSXNWYWxpZExvY2FsZSAgICAgICBbS0VSTkVMMzIuMzYxXQogKi8KQk9PTDMyIFdJTkFQSSBJc1ZhbGlkTG9jYWxlKExDSUQgbGNpZCxEV09SRCBmbGFncykKewoJLyogd2Ugc3VwcG9ydCBBTlkgbGFuZ3VhZ2UuIFdlbGwsIGF0IGxlYXN0IHNheSB0aGF0Li4uKi8KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1TeXN0ZW1Mb2NhbGVzMzJXICAgICAgICAgICAgICAgIFtLRVJORUwzMi45M10KICovCkJPT0wzMiBXSU5BUEkgRW51bVN5c3RlbUxvY2FsZXMzMlcoIExPQ0FMRV9FTlVNUFJPQzMyVyBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MgKQp7CglpbnQJaTsKCUJPT0wzMglyZXQ7CglXQ0hBUglidWZmZXJbMjAwXTsKCUhLRVkJeGhrZXk7CgoJVFJBQ0Uod2luMzIsIiglcCwlMDhseClcbiIsbHBmbkxvY2FsZUVudW0sZmxhZ3MgKTsKCS8qIHNlZSBpZiB3ZSBjYW4gcmV1c2UgdGhlIFdpbjk1IHJlZ2lzdHJ5IGVudHJpZXMuLi4uICovCglpZiAoRVJST1JfU1VDQ0VTUz09UmVnT3BlbktleTMyQShIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCIsJnhoa2V5KSkgewoJCWk9MDsKCQl3aGlsZSAoMSkgewoJCQlpZiAoRVJST1JfU1VDQ0VTUyE9UmVnRW51bUtleTMyVyh4aGtleSxpLGJ1ZmZlcixzaXplb2YoYnVmZmVyKSkpCgkJCQlicmVhazsKICAgICAgICAgICAgCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCQlicmVhazsKCQkJaSsrOwoJCX0KCQlSZWdDbG9zZUtleSh4aGtleSk7CgkJcmV0dXJuIFRSVUU7Cgl9CgoJaT0wOwoJd2hpbGUgKGxhbmd1YWdlc1tpXS5sYW5nbmFtZSE9TlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIExQV1NUUiBjcDsKCSAgICBjaGFyICAgeGJ1ZmZlclsxMF07CiAgCQoJICAgIHNwcmludGYoeGJ1ZmZlciwiJTA4bHgiLChEV09SRClsYW5ndWFnZXNbaV0ubGFuZ2lkKTsKCgkgICAgY3AgPSBIRUFQX3N0cmR1cEF0b1coIEdldFByb2Nlc3NIZWFwKCksIDAsIHhidWZmZXIgKTsKICAgICAgICAgICAgcmV0ID0gbHBmbkxvY2FsZUVudW0oY3ApOwogICAgICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY3AgKTsKICAgICAgICAgICAgaWYgKCFyZXQpIGJyZWFrOwogICAgICAgICAgICBpKys7Cgl9CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtU3lzdGVtTG9jYWxlczMyQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuOTJdCiAqLwpCT09MMzIgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzMzJBKExPQ0FMRV9FTlVNUFJPQzMyQSBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBmbGFncykKewoJaW50CWk7CglDSEFSCWJ1ZmZlclsyMDBdOwoJSEtFWQl4aGtleTsKCglUUkFDRSh3aW4zMiwiKCVwLCUwOGx4KVxuIiwKCQlscGZuTG9jYWxlRW51bSxmbGFncwoJKTsKCWlmIChFUlJPUl9TVUNDRVNTPT1SZWdPcGVuS2V5MzJBKEhLRVlfTE9DQUxfTUFDSElORSwiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcIiwmeGhrZXkpKSB7CgkJaT0wOwoJCXdoaWxlICgxKSB7CgkJCWlmIChFUlJPUl9TVUNDRVNTIT1SZWdFbnVtS2V5MzJBKHhoa2V5LGksYnVmZmVyLHNpemVvZihidWZmZXIpKSkKCQkJCWJyZWFrOwogICAgICAgICAgICAJCWlmICghbHBmbkxvY2FsZUVudW0oYnVmZmVyKSkKCQkJCWJyZWFrOwoJCQlpKys7CgkJfQoJCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKCQlyZXR1cm4gVFJVRTsKCX0KCWk9MDsKCXdoaWxlIChsYW5ndWFnZXNbaV0ubGFuZ25hbWUhPU5VTEwpIHsKCQlzcHJpbnRmKGJ1ZmZlciwiJTA4bHgiLChEV09SRClsYW5ndWFnZXNbaV0ubGFuZ2lkKTsKCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCWJyZWFrOwoJCWkrKzsKCX0KCXJldHVybiBUUlVFOwp9CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBDVF9DVHlwZTJfTFVUW10gPSB7CiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA4ICovCiAgQzJfU0VHTUVOVFNFUEFSQVRPUiwgLyogICAtICAgOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDExICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAzMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMzEgKi8KICBDMl9XSElURVNQQUNFLCAvKiAgIC0gIDMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAhIC0gIDMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAjIC0gIDM1ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogJCAtICAzNiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICUgLSAgMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogJiAtICAzOCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogJyAtICAzOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKCAtICA0MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKSAtICA0MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKiAtICA0MiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICsgLSAgNDMgKi8KICBDMl9DT01NT05TRVBBUkFUT1IsIC8qICwgLSAgNDQgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAtIC0gIDQ1ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAuIC0gIDQ2ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAvIC0gIDQ3ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAwIC0gIDQ4ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAxIC0gIDQ5ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAyIC0gIDUwICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAzIC0gIDUxICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA0IC0gIDUyICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA1IC0gIDUzICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA2IC0gIDU0ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA3IC0gIDU1ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA4IC0gIDU2ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA5IC0gIDU3ICovCiAgQzJfQ09NTU9OU0VQQVJBVE9SLCAvKiA6IC0gIDU4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA7IC0gIDU5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA8IC0gIDYwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA9IC0gIDYxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA+IC0gIDYyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA/IC0gIDYzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEAgLSAgNjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQSAtICA2NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBCIC0gIDY2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEMgLSAgNjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRCAtICA2OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBFIC0gIDY5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEYgLSAgNzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRyAtICA3MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBIIC0gIDcyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEkgLSAgNzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSiAtICA3NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBLIC0gIDc1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEwgLSAgNzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTSAtICA3NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBOIC0gIDc4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE8gLSAgNzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUCAtICA4MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBRIC0gIDgxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFIgLSAgODIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUyAtICA4MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBUIC0gIDg0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFUgLSAgODUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogViAtICA4NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBXIC0gIDg3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFggLSAgODggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWSAtICA4OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBaIC0gIDkwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBbIC0gIDkxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBcIC0gIDkyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBdIC0gIDkzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBeIC0gIDk0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBfIC0gIDk1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBgIC0gIDk2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGEgLSAgOTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYiAtICA5OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBjIC0gIDk5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGQgLSAxMDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZSAtIDEwMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBmIC0gMTAyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGcgLSAxMDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaCAtIDEwNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBpIC0gMTA1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGogLSAxMDYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogayAtIDEwNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBsIC0gMTA4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG0gLSAxMDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbiAtIDExMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBvIC0gMTExICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHAgLSAxMTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcSAtIDExMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiByIC0gMTE0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHMgLSAxMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdCAtIDExNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB1IC0gMTE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHYgLSAxMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdyAtIDExOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB4IC0gMTIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHkgLSAxMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeiAtIDEyMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogeyAtIDEyMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfCAtIDEyNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfSAtIDEyNSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfiAtIDEyNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIH8gLSAxMjcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCAIC0gMTI4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyoggSAtIDEyOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoggiAtIDEzMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCDIC0gMTMxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCEIC0gMTMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCFIC0gMTMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCGIC0gMTM0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCHIC0gMTM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIggLSAxMzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCJIC0gMTM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIogLSAxMzggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIsgLSAxMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogjCAtIDE0MCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII0gLSAxNDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCOIC0gMTQyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjyAtIDE0MyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJAgLSAxNDQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJEgLSAxNDUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJIgLSAxNDYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJMgLSAxNDcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJQgLSAxNDggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJUgLSAxNDkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJYgLSAxNTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJcgLSAxNTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogmCAtIDE1MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogmSAtIDE1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCaIC0gMTU0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCbIC0gMTU1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJwgLSAxNTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCdIC0gMTU3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogniAtIDE1OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCfIC0gMTU5ICovCiAgQzJfV0hJVEVTUEFDRSwgLyogoCAtIDE2MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogoSAtIDE2MSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKIgLSAxNjIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCjIC0gMTYzICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogpCAtIDE2NCAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKUgLSAxNjUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKYgLSAxNjYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKcgLSAxNjcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKggLSAxNjggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKkgLSAxNjkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKogLSAxNzAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKsgLSAxNzEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKwgLSAxNzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK0gLSAxNzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK4gLSAxNzQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK8gLSAxNzUgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCwIC0gMTc2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogsSAtIDE3NyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsiAtIDE3OCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsyAtIDE3OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtCAtIDE4MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtSAtIDE4MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtiAtIDE4MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtyAtIDE4MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguCAtIDE4NCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyoguSAtIDE4NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguiAtIDE4NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguyAtIDE4NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvCAtIDE4OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvSAtIDE4OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogviAtIDE5MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvyAtIDE5MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDAIC0gMTkyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMEgLSAxOTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwiAtIDE5NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDDIC0gMTk1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMQgLSAxOTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxSAtIDE5NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDGIC0gMTk4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMcgLSAxOTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyCAtIDIwMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDJIC0gMjAxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMogLSAyMDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyyAtIDIwMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDMIC0gMjA0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM0gLSAyMDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogziAtIDIwNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDPIC0gMjA3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINAgLSAyMDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0SAtIDIwOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDSIC0gMjEwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINMgLSAyMTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1CAtIDIxMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDVIC0gMjEzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINYgLSAyMTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qINcgLSAyMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2CAtIDIxNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDZIC0gMjE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINogLSAyMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2yAtIDIxOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDcIC0gMjIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN0gLSAyMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3iAtIDIyMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDfIC0gMjIzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOAgLSAyMjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4SAtIDIyNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDiIC0gMjI2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOMgLSAyMjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5CAtIDIyOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDlIC0gMjI5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOYgLSAyMzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5yAtIDIzMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDoIC0gMjMyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOkgLSAyMzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6iAtIDIzNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDrIC0gMjM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOwgLSAyMzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7SAtIDIzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDuIC0gMjM4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO8gLSAyMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8CAtIDI0MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDxIC0gMjQxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPIgLSAyNDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8yAtIDI0MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD0IC0gMjQ0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPUgLSAyNDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9iAtIDI0NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyog9yAtIDI0NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD4IC0gMjQ4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPkgLSAyNDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+iAtIDI1MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD7IC0gMjUxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPwgLSAyNTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/SAtIDI1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD+IC0gMjU0ICovCiAgQzJfTEVGVFRPUklHSFQgLyog/yAtIDI1NSAqLwp9OwoKc3RhdGljIGNvbnN0IFdPUkQgQ1RfQ1R5cGUzX0xVVFtdID0geyAKICAweDAwMDAsIC8qICAgLSAgIDAgKi8KICAweDAwMDAsIC8qICAgLSAgIDEgKi8KICAweDAwMDAsIC8qICAgLSAgIDIgKi8KICAweDAwMDAsIC8qICAgLSAgIDMgKi8KICAweDAwMDAsIC8qICAgLSAgIDQgKi8KICAweDAwMDAsIC8qICAgLSAgIDUgKi8KICAweDAwMDAsIC8qICAgLSAgIDYgKi8KICAweDAwMDAsIC8qICAgLSAgIDcgKi8KICAweDAwMDAsIC8qICAgLSAgIDggKi8KICAweDAwMDgsIC8qICAgLSAgIDkgKi8KICAweDAwMDgsIC8qICAgLSAgMTAgKi8KICAweDAwMDgsIC8qICAgLSAgMTEgKi8KICAweDAwMDgsIC8qICAgLSAgMTIgKi8KICAweDAwMDgsIC8qICAgLSAgMTMgKi8KICAweDAwMDAsIC8qICAgLSAgMTQgKi8KICAweDAwMDAsIC8qICAgLSAgMTUgKi8KICAweDAwMDAsIC8qICAgLSAgMTYgKi8KICAweDAwMDAsIC8qICAgLSAgMTcgKi8KICAweDAwMDAsIC8qICAgLSAgMTggKi8KICAweDAwMDAsIC8qICAgLSAgMTkgKi8KICAweDAwMDAsIC8qICAgLSAgMjAgKi8KICAweDAwMDAsIC8qICAgLSAgMjEgKi8KICAweDAwMDAsIC8qICAgLSAgMjIgKi8KICAweDAwMDAsIC8qICAgLSAgMjMgKi8KICAweDAwMDAsIC8qICAgLSAgMjQgKi8KICAweDAwMDAsIC8qICAgLSAgMjUgKi8KICAweDAwMDAsIC8qICAgLSAgMjYgKi8KICAweDAwMDAsIC8qICAgLSAgMjcgKi8KICAweDAwMDAsIC8qICAgLSAgMjggKi8KICAweDAwMDAsIC8qICAgLSAgMjkgKi8KICAweDAwMDAsIC8qICAgLSAgMzAgKi8KICAweDAwMDAsIC8qICAgLSAgMzEgKi8KICAweDAwNDgsIC8qICAgLSAgMzIgKi8KICAweDAwNDgsIC8qICEgLSAgMzMgKi8KICAweDA0NDgsIC8qICIgLSAgMzQgKi8gLyogIiAqLwogIDB4MDA0OCwgLyogIyAtICAzNSAqLwogIDB4MDQ0OCwgLyogJCAtICAzNiAqLwogIDB4MDA0OCwgLyogJSAtICAzNyAqLwogIDB4MDA0OCwgLyogJiAtICAzOCAqLwogIDB4MDQ0MCwgLyogJyAtICAzOSAqLwogIDB4MDA0OCwgLyogKCAtICA0MCAqLwogIDB4MDA0OCwgLyogKSAtICA0MSAqLwogIDB4MDA0OCwgLyogKiAtICA0MiAqLwogIDB4MDA0OCwgLyogKyAtICA0MyAqLwogIDB4MDA0OCwgLyogLCAtICA0NCAqLwogIDB4MDQ0MCwgLyogLSAtICA0NSAqLwogIDB4MDA0OCwgLyogLiAtICA0NiAqLwogIDB4MDQ0OCwgLyogLyAtICA0NyAqLwogIDB4MDA0MCwgLyogMCAtICA0OCAqLwogIDB4MDA0MCwgLyogMSAtICA0OSAqLwogIDB4MDA0MCwgLyogMiAtICA1MCAqLwogIDB4MDA0MCwgLyogMyAtICA1MSAqLwogIDB4MDA0MCwgLyogNCAtICA1MiAqLwogIDB4MDA0MCwgLyogNSAtICA1MyAqLwogIDB4MDA0MCwgLyogNiAtICA1NCAqLwogIDB4MDA0MCwgLyogNyAtICA1NSAqLwogIDB4MDA0MCwgLyogOCAtICA1NiAqLwogIDB4MDA0MCwgLyogOSAtICA1NyAqLwogIDB4MDA0OCwgLyogOiAtICA1OCAqLwogIDB4MDA0OCwgLyogOyAtICA1OSAqLwogIDB4MDA0OCwgLyogPCAtICA2MCAqLwogIDB4MDQ0OCwgLyogPSAtICA2MSAqLwogIDB4MDA0OCwgLyogPiAtICA2MiAqLwogIDB4MDA0OCwgLyogPyAtICA2MyAqLwogIDB4MDQ0OCwgLyogQCAtICA2NCAqLwogIDB4ODA0MCwgLyogQSAtICA2NSAqLwogIDB4ODA0MCwgLyogQiAtICA2NiAqLwogIDB4ODA0MCwgLyogQyAtICA2NyAqLwogIDB4ODA0MCwgLyogRCAtICA2OCAqLwogIDB4ODA0MCwgLyogRSAtICA2OSAqLwogIDB4ODA0MCwgLyogRiAtICA3MCAqLwogIDB4ODA0MCwgLyogRyAtICA3MSAqLwogIDB4ODA0MCwgLyogSCAtICA3MiAqLwogIDB4ODA0MCwgLyogSSAtICA3MyAqLwogIDB4ODA0MCwgLyogSiAtICA3NCAqLwogIDB4ODA0MCwgLyogSyAtICA3NSAqLwogIDB4ODA0MCwgLyogTCAtICA3NiAqLwogIDB4ODA0MCwgLyogTSAtICA3NyAqLwogIDB4ODA0MCwgLyogTiAtICA3OCAqLwogIDB4ODA0MCwgLyogTyAtICA3OSAqLwogIDB4ODA0MCwgLyogUCAtICA4MCAqLwogIDB4ODA0MCwgLyogUSAtICA4MSAqLwogIDB4ODA0MCwgLyogUiAtICA4MiAqLwogIDB4ODA0MCwgLyogUyAtICA4MyAqLwogIDB4ODA0MCwgLyogVCAtICA4NCAqLwogIDB4ODA0MCwgLyogVSAtICA4NSAqLwogIDB4ODA0MCwgLyogViAtICA4NiAqLwogIDB4ODA0MCwgLyogVyAtICA4NyAqLwogIDB4ODA0MCwgLyogWCAtICA4OCAqLwogIDB4ODA0MCwgLyogWSAtICA4OSAqLwogIDB4ODA0MCwgLyogWiAtICA5MCAqLwogIDB4MDA0OCwgLyogWyAtICA5MSAqLwogIDB4MDQ0OCwgLyogXCAtICA5MiAqLwogIDB4MDA0OCwgLyogXSAtICA5MyAqLwogIDB4MDQ0OCwgLyogXiAtICA5NCAqLwogIDB4MDQ0OCwgLyogXyAtICA5NSAqLwogIDB4MDQ0OCwgLyogYCAtICA5NiAqLwogIDB4ODA0MCwgLyogYSAtICA5NyAqLwogIDB4ODA0MCwgLyogYiAtICA5OCAqLwogIDB4ODA0MCwgLyogYyAtICA5OSAqLwogIDB4ODA0MCwgLyogZCAtIDEwMCAqLwogIDB4ODA0MCwgLyogZSAtIDEwMSAqLwogIDB4ODA0MCwgLyogZiAtIDEwMiAqLwogIDB4ODA0MCwgLyogZyAtIDEwMyAqLwogIDB4ODA0MCwgLyogaCAtIDEwNCAqLwogIDB4ODA0MCwgLyogaSAtIDEwNSAqLwogIDB4ODA0MCwgLyogaiAtIDEwNiAqLwogIDB4ODA0MCwgLyogayAtIDEwNyAqLwogIDB4ODA0MCwgLyogbCAtIDEwOCAqLwogIDB4ODA0MCwgLyogbSAtIDEwOSAqLwogIDB4ODA0MCwgLyogbiAtIDExMCAqLwogIDB4ODA0MCwgLyogbyAtIDExMSAqLwogIDB4ODA0MCwgLyogcCAtIDExMiAqLwogIDB4ODA0MCwgLyogcSAtIDExMyAqLwogIDB4ODA0MCwgLyogciAtIDExNCAqLwogIDB4ODA0MCwgLyogcyAtIDExNSAqLwogIDB4ODA0MCwgLyogdCAtIDExNiAqLwogIDB4ODA0MCwgLyogdSAtIDExNyAqLwogIDB4ODA0MCwgLyogdiAtIDExOCAqLwogIDB4ODA0MCwgLyogdyAtIDExOSAqLwogIDB4ODA0MCwgLyogeCAtIDEyMCAqLwogIDB4ODA0MCwgLyogeSAtIDEyMSAqLwogIDB4ODA0MCwgLyogeiAtIDEyMiAqLwogIDB4MDA0OCwgLyogeyAtIDEyMyAqLwogIDB4MDA0OCwgLyogfCAtIDEyNCAqLwogIDB4MDA0OCwgLyogfSAtIDEyNSAqLwogIDB4MDQ0OCwgLyogfiAtIDEyNiAqLwogIDB4MDAwMCwgLyogfyAtIDEyNyAqLwogIDB4MDAwMCwgLyoggCAtIDEyOCAqLwogIDB4MDAwMCwgLyoggSAtIDEyOSAqLwogIDB4MDAwOCwgLyoggiAtIDEzMCAqLwogIDB4ODAwMCwgLyoggyAtIDEzMSAqLwogIDB4MDAwOCwgLyoghCAtIDEzMiAqLwogIDB4MDAwOCwgLyoghSAtIDEzMyAqLwogIDB4MDAwOCwgLyoghiAtIDEzNCAqLwogIDB4MDAwOCwgLyoghyAtIDEzNSAqLwogIDB4MDAwMSwgLyogiCAtIDEzNiAqLwogIDB4MDAwOCwgLyogiSAtIDEzNyAqLwogIDB4ODAwMywgLyogiiAtIDEzOCAqLwogIDB4MDAwOCwgLyogiyAtIDEzOSAqLwogIDB4ODAwMCwgLyogjCAtIDE0MCAqLwogIDB4MDAwMCwgLyogjSAtIDE0MSAqLwogIDB4MDAwMCwgLyogjiAtIDE0MiAqLwogIDB4MDAwMCwgLyogjyAtIDE0MyAqLwogIDB4MDAwMCwgLyogkCAtIDE0NCAqLwogIDB4MDA4OCwgLyogkSAtIDE0NSAqLwogIDB4MDA4OCwgLyogkiAtIDE0NiAqLwogIDB4MDA4OCwgLyogkyAtIDE0NyAqLwogIDB4MDA4OCwgLyoglCAtIDE0OCAqLwogIDB4MDAwOCwgLyoglSAtIDE0OSAqLwogIDB4MDQwMCwgLyogliAtIDE1MCAqLwogIDB4MDQwMCwgLyoglyAtIDE1MSAqLwogIDB4MDQwOCwgLyogmCAtIDE1MiAqLwogIDB4MDAwMCwgLyogmSAtIDE1MyAqLwogIDB4ODAwMywgLyogmiAtIDE1NCAqLwogIDB4MDAwOCwgLyogmyAtIDE1NSAqLwogIDB4ODAwMCwgLyognCAtIDE1NiAqLwogIDB4MDAwMCwgLyognSAtIDE1NyAqLwogIDB4MDAwMCwgLyogniAtIDE1OCAqLwogIDB4ODAwMywgLyognyAtIDE1OSAqLwogIDB4MDAwOCwgLyogoCAtIDE2MCAqLwogIDB4MDAwOCwgLyogoSAtIDE2MSAqLwogIDB4MDA0OCwgLyogoiAtIDE2MiAqLwogIDB4MDA0OCwgLyogoyAtIDE2MyAqLwogIDB4MDAwOCwgLyogpCAtIDE2NCAqLwogIDB4MDA0OCwgLyogpSAtIDE2NSAqLwogIDB4MDA0OCwgLyogpiAtIDE2NiAqLwogIDB4MDAwOCwgLyogpyAtIDE2NyAqLwogIDB4MDQwOCwgLyogqCAtIDE2OCAqLwogIDB4MDAwOCwgLyogqSAtIDE2OSAqLwogIDB4MDQwMCwgLyogqiAtIDE3MCAqLwogIDB4MDAwOCwgLyogqyAtIDE3MSAqLwogIDB4MDA0OCwgLyogrCAtIDE3MiAqLwogIDB4MDQwOCwgLyogrSAtIDE3MyAqLwogIDB4MDAwOCwgLyogriAtIDE3NCAqLwogIDB4MDQ0OCwgLyogryAtIDE3NSAqLwogIDB4MDAwOCwgLyogsCAtIDE3NiAqLwogIDB4MDAwOCwgLyogsSAtIDE3NyAqLwogIDB4MDAwMCwgLyogsiAtIDE3OCAqLwogIDB4MDAwMCwgLyogsyAtIDE3OSAqLwogIDB4MDQwOCwgLyogtCAtIDE4MCAqLwogIDB4MDAwOCwgLyogtSAtIDE4MSAqLwogIDB4MDAwOCwgLyogtiAtIDE4MiAqLwogIDB4MDAwOCwgLyogtyAtIDE4MyAqLwogIDB4MDQwOCwgLyoguCAtIDE4NCAqLwogIDB4MDAwMCwgLyoguSAtIDE4NSAqLwogIDB4MDQwMCwgLyoguiAtIDE4NiAqLwogIDB4MDAwOCwgLyoguyAtIDE4NyAqLwogIDB4MDAwMCwgLyogvCAtIDE4OCAqLwogIDB4MDAwMCwgLyogvSAtIDE4OSAqLwogIDB4MDAwMCwgLyogviAtIDE5MCAqLwogIDB4MDAwOCwgLyogvyAtIDE5MSAqLwogIDB4ODAwMywgLyogwCAtIDE5MiAqLwogIDB4ODAwMywgLyogwSAtIDE5MyAqLwogIDB4ODAwMywgLyogwiAtIDE5NCAqLwogIDB4ODAwMywgLyogwyAtIDE5NSAqLwogIDB4ODAwMywgLyogxCAtIDE5NiAqLwogIDB4ODAwMywgLyogxSAtIDE5NyAqLwogIDB4ODAwMCwgLyogxiAtIDE5OCAqLwogIDB4ODAwMywgLyogxyAtIDE5OSAqLwogIDB4ODAwMywgLyogyCAtIDIwMCAqLwogIDB4ODAwMywgLyogySAtIDIwMSAqLwogIDB4ODAwMywgLyogyiAtIDIwMiAqLwogIDB4ODAwMywgLyogyyAtIDIwMyAqLwogIDB4ODAwMywgLyogzCAtIDIwNCAqLwogIDB4ODAwMywgLyogzSAtIDIwNSAqLwogIDB4ODAwMywgLyogziAtIDIwNiAqLwogIDB4ODAwMywgLyogzyAtIDIwNyAqLwogIDB4ODAwMCwgLyog0CAtIDIwOCAqLwogIDB4ODAwMywgLyog0SAtIDIwOSAqLwogIDB4ODAwMywgLyog0iAtIDIxMCAqLwogIDB4ODAwMywgLyog0yAtIDIxMSAqLwogIDB4ODAwMywgLyog1CAtIDIxMiAqLwogIDB4ODAwMywgLyog1SAtIDIxMyAqLwogIDB4ODAwMywgLyog1iAtIDIxNCAqLwogIDB4MDAwOCwgLyog1yAtIDIxNSAqLwogIDB4ODAwMywgLyog2CAtIDIxNiAqLwogIDB4ODAwMywgLyog2SAtIDIxNyAqLwogIDB4ODAwMywgLyog2iAtIDIxOCAqLwogIDB4ODAwMywgLyog2yAtIDIxOSAqLwogIDB4ODAwMywgLyog3CAtIDIyMCAqLwogIDB4ODAwMywgLyog3SAtIDIyMSAqLwogIDB4ODAwMCwgLyog3iAtIDIyMiAqLwogIDB4ODAwMCwgLyog3yAtIDIyMyAqLwogIDB4ODAwMywgLyog4CAtIDIyNCAqLwogIDB4ODAwMywgLyog4SAtIDIyNSAqLwogIDB4ODAwMywgLyog4iAtIDIyNiAqLwogIDB4ODAwMywgLyog4yAtIDIyNyAqLwogIDB4ODAwMywgLyog5CAtIDIyOCAqLwogIDB4ODAwMywgLyog5SAtIDIyOSAqLwogIDB4ODAwMCwgLyog5iAtIDIzMCAqLwogIDB4ODAwMywgLyog5yAtIDIzMSAqLwogIDB4ODAwMywgLyog6CAtIDIzMiAqLwogIDB4ODAwMywgLyog6SAtIDIzMyAqLwogIDB4ODAwMywgLyog6iAtIDIzNCAqLwogIDB4ODAwMywgLyog6yAtIDIzNSAqLwogIDB4ODAwMywgLyog7CAtIDIzNiAqLwogIDB4ODAwMywgLyog7SAtIDIzNyAqLwogIDB4ODAwMywgLyog7iAtIDIzOCAqLwogIDB4ODAwMywgLyog7yAtIDIzOSAqLwogIDB4ODAwMCwgLyog8CAtIDI0MCAqLwogIDB4ODAwMywgLyog8SAtIDI0MSAqLwogIDB4ODAwMywgLyog8iAtIDI0MiAqLwogIDB4ODAwMywgLyog8yAtIDI0MyAqLwogIDB4ODAwMywgLyog9CAtIDI0NCAqLwogIDB4ODAwMywgLyog9SAtIDI0NSAqLwogIDB4ODAwMywgLyog9iAtIDI0NiAqLwogIDB4MDAwOCwgLyog9yAtIDI0NyAqLwogIDB4ODAwMywgLyog+CAtIDI0OCAqLwogIDB4ODAwMywgLyog+SAtIDI0OSAqLwogIDB4ODAwMywgLyog+iAtIDI1MCAqLwogIDB4ODAwMywgLyog+yAtIDI1MSAqLwogIDB4ODAwMywgLyog/CAtIDI1MiAqLwogIDB4ODAwMywgLyog/SAtIDI1MyAqLwogIDB4ODAwMCwgLyog/iAtIDI1NCAqLwogIDB4ODAwMyAgLyog/yAtIDI1NSAqLwp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRTdHJpbmdUeXBlQSAgICAgICAgICAgICAgICBbT0xFMk5MUy43XQogKi8KQk9PTDE2IFdJTkFQSSBHZXRTdHJpbmdUeXBlMTYoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglyZXR1cm4gR2V0U3RyaW5nVHlwZUV4MzJBKGxvY2FsZSxkd0luZm9UeXBlLHNyYyxjY2hTcmMsY2hhcnR5cGUpOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0U3RyaW5nVHlwZUEgICAgICAgICAgICAgICAgW0tFUk5FTDMyLjI3N10KICovCkJPT0wzMiBXSU5BUEkgR2V0U3RyaW5nVHlwZTMyQShMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglyZXR1cm4gR2V0U3RyaW5nVHlwZUV4MzJBKGxvY2FsZSxkd0luZm9UeXBlLHNyYyxjY2hTcmMsY2hhcnR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldFN0cmluZ1R5cGVFeEEgICAgICAgICAgICAgICAgW0tFUk5FTDMyLjI3Nl0KICoKICogRklYTUU6IElnbm9yZXMgdGhlIGxvY2FsZS4KICovCkJPT0wzMiBXSU5BUEkgR2V0U3RyaW5nVHlwZUV4MzJBKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJaW50CWk7CgkKCWlmICgoc3JjPT1OVUxMKSB8fCAoY2hhcnR5cGU9PU5VTEwpIHx8IChzcmM9PShMUFNUUiljaGFydHlwZSkpCgl7CgkgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CgkgIHJldHVybiBGQUxTRTsKCX0KCglpZiAoY2NoU3JjPT0tMSkKCSAgY2NoU3JjPWxzdHJsZW4zMkEoc3JjKSsxOwoJICAKCXN3aXRjaCAoZHdJbmZvVHlwZSkgewoJY2FzZSBDVF9DVFlQRTE6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXSA9IDA7CgkgICAgaWYgKGlzZGlnaXQoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0RJR0lUOwoJICAgIGlmIChpc2FscGhhKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9BTFBIQTsKCSAgICBpZiAoaXNsb3dlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfTE9XRVI7CgkgICAgaWYgKGlzdXBwZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1VQUEVSOwoJICAgIGlmIChpc3NwYWNlKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9TUEFDRTsKCSAgICBpZiAoaXNwdW5jdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfUFVOQ1Q7CgkgICAgaWYgKGlzY250cmwoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0NOVFJMOwovKiBGSVhNRTogaXNibGFuaygpIGlzIGEgR05VIGV4dGVuc2lvbiAqLwovKgkJaWYgKGlzYmxhbmsoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOyAqLwoJICAgIGlmICgoc3JjW2ldID09ICcgJykgfHwgKHNyY1tpXSA9PSAnXHQnKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOwoJICAgIC8qIEMxX1hESUdJVCAqLwoJfQoJcmV0dXJuIFRSVUU7CgoJY2FzZSBDVF9DVFlQRTI6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXT0oV09SRClDVF9DVHlwZTJfTFVUW2ldOwoJICB9CgkgIHJldHVybiBUUlVFOwoKCWNhc2UgQ1RfQ1RZUEUzOgoJICBmb3IgKGk9MDtpPGNjaFNyYztpKyspIAoJICB7CgkgICAgY2hhcnR5cGVbaV09Q1RfQ1R5cGUzX0xVVFtpXTsKCSAgfQoJICByZXR1cm4gVFJVRTsKCglkZWZhdWx0OgoJICBFUlIob2xlLCJVbmtub3duIGR3SW5mb1R5cGU6JWxkXG4iLGR3SW5mb1R5cGUpOwoJICByZXR1cm4gRkFMU0U7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIEdldFN0cmluZ1R5cGVXIFtLRVJORUwzMi4yNzldCiAqCiAqIE5PVEVTCiAqIFllcywgdGhpcyBpcyBtaXNzaW5nIExDSUQgbG9jYWxlLiBNUyBmYXVsdC4KICovCkJPT0wzMiBXSU5BUEkgR2V0U3RyaW5nVHlwZTMyVyhEV09SRCBkd0luZm9UeXBlLExQQ1dTVFIgc3JjLElOVDMyIGNjaFNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV09SRCBjaGFydHlwZSkKewoJcmV0dXJuIEdldFN0cmluZ1R5cGVFeDMyVygwLypkZWZhdWx0bG9jYWxlKi8sZHdJbmZvVHlwZSxzcmMsY2NoU3JjLGNoYXJ0eXBlKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgIEdldFN0cmluZ1R5cGVXICAgW0tFUk5FTDMyLjI3OF0KICogRklYTUU6IHVuaWNvZGUgY2hhcnMgYXJlIGFzc3VtZWQgY2hhcnMKICovCkJPT0wzMiBXSU5BUEkgR2V0U3RyaW5nVHlwZUV4MzJXKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDV1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCWludAlpOwoKCglpZiAoY2NoU3JjPT0tMSkKCSAgY2NoU3JjPWxzdHJsZW4zMlcoc3JjKSsxOwoJCglzd2l0Y2ggKGR3SW5mb1R5cGUpIHsKCWNhc2UgQ1RfQ1RZUEUyOgoJCUZJWE1FKG9sZSwiQ1RfQ1RZUEUyIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQlyZXR1cm4gRkFMU0U7CgljYXNlIENUX0NUWVBFMzoKCQlGSVhNRShvbGUsIkNUX0NUWVBFMyBub3Qgc3VwcG9ydGVkLlxuIik7CgkJcmV0dXJuIEZBTFNFOwoJZGVmYXVsdDpicmVhazsKCX0KCWZvciAoaT0wO2k8Y2NoU3JjO2krKykgewoJCWNoYXJ0eXBlW2ldID0gMDsKCQlpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkJaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJCWlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCQlpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkJaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJCWlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCQlpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCiAgICAgICAgICAgICAgICBpZiAoKHNyY1tpXSA9PSAnICcpIHx8IChzcmNbaV0gPT0gJ1x0JykpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsKCQkvKiBDMV9YRElHSVQgKi8KCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVmVyTGFuZ3VhZ2VOYW1lMTYgICBbVkVSLjEwXSAKICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWUxNihVSU5UMTYgbGFuZ2lkLExQU1RSIGxhbmduYW1lLFVJTlQxNiBsYW5nbmFtZWxlbikKewoJaW50CWk7CglEV09SRAlyZXN1bHQ7CgljaGFyCWJ1ZmZlcls4MF07CgoJVFJBQ0UodmVyLCIoJWQsJXAsJWQpXG4iLGxhbmdpZCxsYW5nbmFtZSxsYW5nbmFtZWxlbik7CgkvKiBGaXJzdCwgY2hlY2sgXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxjb250cm9sXE5sc1xMb2NhbGVcPGxhbmdpZD4KCSAqIGZyb20gdGhlIHJlZ2lzdHJ5LiAKCSAqLwoJc3ByaW50ZihidWZmZXIsCgkJIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCUwOHgiLAoJCWxhbmdpZCk7CglyZXN1bHQgPSBSZWdRdWVyeVZhbHVlMTYoSEtFWV9MT0NBTF9NQUNISU5FLCBidWZmZXIsIGxhbmduYW1lLAoJCQkJKExQRFdPUkQpJmxhbmduYW1lbGVuKTsKCWlmIChyZXN1bHQgPT0gRVJST1JfU1VDQ0VTUykgewoJCWxhbmduYW1lW2xhbmduYW1lbGVuLTFdPSdcMCc7CgkJcmV0dXJuIGxhbmduYW1lbGVuOwoJfQoJLyogaWYgdGhhdCBmYWlscywgdXNlIHRoZSBpbnRlcm5hbCB0YWJsZSAqLwoJZm9yIChpPTA7bGFuZ3VhZ2VzW2ldLmxhbmdpZCE9MDtpKyspCgkJaWYgKGxhbmdpZD09bGFuZ3VhZ2VzW2ldLmxhbmdpZCkKCQkJYnJlYWs7CglzdHJuY3B5KGxhbmduYW1lLGxhbmd1YWdlc1tpXS5sYW5nbmFtZSxsYW5nbmFtZWxlbik7CglsYW5nbmFtZVtsYW5nbmFtZWxlbi0xXT0nXDAnOwoJcmV0dXJuIHN0cmxlbihsYW5ndWFnZXNbaV0ubGFuZ25hbWUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVmVyTGFuZ3VhZ2VOYW1lMzJBCQkJCVtWRVJTSU9OLjldIAogKi8KRFdPUkQgV0lOQVBJIFZlckxhbmd1YWdlTmFtZTMyQShVSU5UMzIgbGFuZ2lkLExQU1RSIGxhbmduYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBsYW5nbmFtZWxlbikKewoJcmV0dXJuIFZlckxhbmd1YWdlTmFtZTE2KGxhbmdpZCxsYW5nbmFtZSxsYW5nbmFtZWxlbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBWZXJMYW5ndWFnZU5hbWUzMlcJCQkJW1ZFUlNJT04uMTBdIAogKi8KRFdPUkQgV0lOQVBJIFZlckxhbmd1YWdlTmFtZTMyVyhVSU5UMzIgbGFuZ2lkLExQV1NUUiBsYW5nbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgbGFuZ25hbWVsZW4pCnsKCWludAlpOwoJTFBXU1RSCWtleW5hbWU7CglEV09SRAlyZXN1bHQ7CgljaGFyCWJ1ZmZlcls4MF07CgoJLyogRmlyc3QsIGNoZWNrIFxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcY29udHJvbFxObHNcTG9jYWxlXDxsYW5naWQ+CgkgKiBmcm9tIHRoZSByZWdpc3RyeS4gCgkgKi8KCXNwcmludGYoYnVmZmVyLAoJCSJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwlMDh4IiwKCQlsYW5naWQpOwoJa2V5bmFtZSA9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYnVmZmVyICk7CglyZXN1bHQgPSBSZWdRdWVyeVZhbHVlMzJXKEhLRVlfTE9DQUxfTUFDSElORSwga2V5bmFtZSwgbGFuZ25hbWUsCgkJCQkoTFBEV09SRCkmbGFuZ25hbWVsZW4pOwoJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGtleW5hbWUgKTsKCWlmIChyZXN1bHQgIT0gRVJST1JfU1VDQ0VTUykgewoJCS8qIGlmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJuYWwgdGFibGUgKi8KCQlmb3IgKGk9MDtsYW5ndWFnZXNbaV0ubGFuZ2lkIT0wO2krKykKCQkJaWYgKGxhbmdpZD09bGFuZ3VhZ2VzW2ldLmxhbmdpZCkKCQkJCWJyZWFrOwogICAgICAgIAlsc3RyY3B5QXRvVyggbGFuZ25hbWUsIGxhbmd1YWdlc1tpXS5sYW5nbmFtZSApOwoJCWxhbmduYW1lbGVuID0gc3RybGVuKGxhbmd1YWdlc1tpXS5sYW5nbmFtZSk7CgkgCS8qIHNhbWUgYXMgc3RybGVuVyhsYW5nbmFtZSk7ICovCgl9CglyZXR1cm4gbGFuZ25hbWVsZW47Cn0KIApzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRbXSA9IHsKICA2ICAgICAgLCAgIDMsIC8qICAgLSAgIDEgKi8gIAogIDYgICAgICAsICAgNCwgLyogICAtICAgMiAqLyAgCiAgNiAgICAgICwgICA1LCAvKiAgIC0gICAzICovICAKICA2ICAgICAgLCAgIDYsIC8qICAgLSAgIDQgKi8gIAogIDYgICAgICAsICAgNywgLyogICAtICAgNSAqLyAgCiAgNiAgICAgICwgICA4LCAvKiAgIC0gICA2ICovICAKICA2ICAgICAgLCAgIDksIC8qICAgLSAgIDcgKi8gIAogIDYgICAgICAsICAxMCwgLyogICAtICAgOCAqLyAgCiAgNyAgICAgICwgICA1LCAvKiAgIC0gICA5ICovICAKICA3ICAgICAgLCAgIDYsIC8qICAgLSAgMTAgKi8gIAogIDcgICAgICAsICAgNywgLyogICAtICAxMSAqLyAgCiAgNyAgICAgICwgICA4LCAvKiAgIC0gIDEyICovICAKICA3ICAgICAgLCAgIDksIC8qICAgLSAgMTMgKi8gIAogIDYgICAgICAsICAxMSwgLyogICAtICAxNCAqLyAgCiAgNiAgICAgICwgIDEyLCAvKiAgIC0gIDE1ICovICAKICA2ICAgICAgLCAgMTMsIC8qICAgLSAgMTYgKi8gIAogIDYgICAgICAsICAxNCwgLyogICAtICAxNyAqLyAgCiAgNiAgICAgICwgIDE1LCAvKiAgIC0gIDE4ICovICAKICA2ICAgICAgLCAgMTYsIC8qICAgLSAgMTkgKi8gIAogIDYgICAgICAsICAxNywgLyogICAtICAyMCAqLyAgCiAgNiAgICAgICwgIDE4LCAvKiAgIC0gIDIxICovICAKICA2ICAgICAgLCAgMTksIC8qICAgLSAgMjIgKi8gIAogIDYgICAgICAsICAyMCwgLyogICAtICAyMyAqLyAgCiAgNiAgICAgICwgIDIxLCAvKiAgIC0gIDI0ICovICAKICA2ICAgICAgLCAgMjIsIC8qICAgLSAgMjUgKi8gIAogIDYgICAgICAsICAyMywgLyogICAtICAyNiAqLyAgCiAgNiAgICAgICwgIDI0LCAvKiAgIC0gIDI3ICovICAKICA2ICAgICAgLCAgMjUsIC8qICAgLSAgMjggKi8gIAogIDYgICAgICAsICAyNiwgLyogICAtICAyOSAqLyAgCiAgNiAgICAgICwgIDI3LCAvKiAgIC0gIDMwICovICAKICA2ICAgICAgLCAgMjgsIC8qICAgLSAgMzEgKi8gIAogIDcgICAgICAsICAgMiwgLyogICAtICAzMiAqLwogIDcgICAgICAsICAyOCwgLyogISAtICAzMyAqLwogIDcgICAgICAsICAyOSwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgNyAgICAgICwgIDMxLCAvKiAjIC0gIDM1ICovCiAgNyAgICAgICwgIDMzLCAvKiAkIC0gIDM2ICovCiAgNyAgICAgICwgIDM1LCAvKiAlIC0gIDM3ICovCiAgNyAgICAgICwgIDM3LCAvKiAmIC0gIDM4ICovCiAgNiAgICAgICwgMTI4LCAvKiAnIC0gIDM5ICovCiAgNyAgICAgICwgIDM5LCAvKiAoIC0gIDQwICovCiAgNyAgICAgICwgIDQyLCAvKiApIC0gIDQxICovCiAgNyAgICAgICwgIDQ1LCAvKiAqIC0gIDQyICovCiAgOCAgICAgICwgICAzLCAvKiArIC0gIDQzICovCiAgNyAgICAgICwgIDQ3LCAvKiAsIC0gIDQ0ICovCiAgNiAgICAgICwgMTMwLCAvKiAtIC0gIDQ1ICovCiAgNyAgICAgICwgIDUxLCAvKiAuIC0gIDQ2ICovCiAgNyAgICAgICwgIDUzLCAvKiAvIC0gIDQ3ICovCiAxMiAgICAgICwgICAzLCAvKiAwIC0gIDQ4ICovCiAxMiAgICAgICwgIDMzLCAvKiAxIC0gIDQ5ICovCiAxMiAgICAgICwgIDUxLCAvKiAyIC0gIDUwICovCiAxMiAgICAgICwgIDcwLCAvKiAzIC0gIDUxICovCiAxMiAgICAgICwgIDg4LCAvKiA0IC0gIDUyICovCiAxMiAgICAgICwgMTA2LCAvKiA1IC0gIDUzICovCiAxMiAgICAgICwgMTI1LCAvKiA2IC0gIDU0ICovCiAxMiAgICAgICwgMTQ0LCAvKiA3IC0gIDU1ICovCiAxMiAgICAgICwgMTYyLCAvKiA4IC0gIDU2ICovCiAxMiAgICAgICwgMTgwLCAvKiA5IC0gIDU3ICovCiAgNyAgICAgICwgIDU1LCAvKiA6IC0gIDU4ICovCiAgNyAgICAgICwgIDU4LCAvKiA7IC0gIDU5ICovCiAgOCAgICAgICwgIDE0LCAvKiA8IC0gIDYwICovCiAgOCAgICAgICwgIDE4LCAvKiA9IC0gIDYxICovCiAgOCAgICAgICwgIDIwLCAvKiA+IC0gIDYyICovCiAgNyAgICAgICwgIDYwLCAvKiA/IC0gIDYzICovCiAgNyAgICAgICwgIDYyLCAvKiBAIC0gIDY0ICovCiAxNCAgICAgICwgICAyLCAvKiBBIC0gIDY1ICovCiAxNCAgICAgICwgICA5LCAvKiBCIC0gIDY2ICovCiAxNCAgICAgICwgIDEwLCAvKiBDIC0gIDY3ICovCiAxNCAgICAgICwgIDI2LCAvKiBEIC0gIDY4ICovCiAxNCAgICAgICwgIDMzLCAvKiBFIC0gIDY5ICovCiAxNCAgICAgICwgIDM1LCAvKiBGIC0gIDcwICovCiAxNCAgICAgICwgIDM3LCAvKiBHIC0gIDcxICovCiAxNCAgICAgICwgIDQ0LCAvKiBIIC0gIDcyICovCiAxNCAgICAgICwgIDUwLCAvKiBJIC0gIDczICovCiAxNCAgICAgICwgIDUzLCAvKiBKIC0gIDc0ICovCiAxNCAgICAgICwgIDU0LCAvKiBLIC0gIDc1ICovCiAxNCAgICAgICwgIDcyLCAvKiBMIC0gIDc2ICovCiAxNCAgICAgICwgIDgxLCAvKiBNIC0gIDc3ICovCiAxNCAgICAgICwgMTEyLCAvKiBOIC0gIDc4ICovCiAxNCAgICAgICwgMTI0LCAvKiBPIC0gIDc5ICovCiAxNCAgICAgICwgMTI2LCAvKiBQIC0gIDgwICovCiAxNCAgICAgICwgMTM3LCAvKiBRIC0gIDgxICovCiAxNCAgICAgICwgMTM4LCAvKiBSIC0gIDgyICovCiAxNCAgICAgICwgMTQ1LCAvKiBTIC0gIDgzICovCiAxNCAgICAgICwgMTUzLCAvKiBUIC0gIDg0ICovCiAxNCAgICAgICwgMTU5LCAvKiBVIC0gIDg1ICovCiAxNCAgICAgICwgMTYyLCAvKiBWIC0gIDg2ICovCiAxNCAgICAgICwgMTY0LCAvKiBXIC0gIDg3ICovCiAxNCAgICAgICwgMTY2LCAvKiBYIC0gIDg4ICovCiAxNCAgICAgICwgMTY3LCAvKiBZIC0gIDg5ICovCiAxNCAgICAgICwgMTY5LCAvKiBaIC0gIDkwICovCiAgNyAgICAgICwgIDYzLCAvKiBbIC0gIDkxICovCiAgNyAgICAgICwgIDY1LCAvKiBcIC0gIDkyICovCiAgNyAgICAgICwgIDY2LCAvKiBdIC0gIDkzICovCiAgNyAgICAgICwgIDY3LCAvKiBeIC0gIDk0ICovCiAgNyAgICAgICwgIDY4LCAvKiBfIC0gIDk1ICovCiAgNyAgICAgICwgIDcyLCAvKiBgIC0gIDk2ICovCiAxNCAgICAgICwgICAyLCAvKiBhIC0gIDk3ICovCiAxNCAgICAgICwgICA5LCAvKiBiIC0gIDk4ICovCiAxNCAgICAgICwgIDEwLCAvKiBjIC0gIDk5ICovCiAxNCAgICAgICwgIDI2LCAvKiBkIC0gMTAwICovCiAxNCAgICAgICwgIDMzLCAvKiBlIC0gMTAxICovCiAxNCAgICAgICwgIDM1LCAvKiBmIC0gMTAyICovCiAxNCAgICAgICwgIDM3LCAvKiBnIC0gMTAzICovCiAxNCAgICAgICwgIDQ0LCAvKiBoIC0gMTA0ICovCiAxNCAgICAgICwgIDUwLCAvKiBpIC0gMTA1ICovCiAxNCAgICAgICwgIDUzLCAvKiBqIC0gMTA2ICovCiAxNCAgICAgICwgIDU0LCAvKiBrIC0gMTA3ICovCiAxNCAgICAgICwgIDcyLCAvKiBsIC0gMTA4ICovCiAxNCAgICAgICwgIDgxLCAvKiBtIC0gMTA5ICovCiAxNCAgICAgICwgMTEyLCAvKiBuIC0gMTEwICovCiAxNCAgICAgICwgMTI0LCAvKiBvIC0gMTExICovCiAxNCAgICAgICwgMTI2LCAvKiBwIC0gMTEyICovCiAxNCAgICAgICwgMTM3LCAvKiBxIC0gMTEzICovCiAxNCAgICAgICwgMTM4LCAvKiByIC0gMTE0ICovCiAxNCAgICAgICwgMTQ1LCAvKiBzIC0gMTE1ICovCiAxNCAgICAgICwgMTUzLCAvKiB0IC0gMTE2ICovCiAxNCAgICAgICwgMTU5LCAvKiB1IC0gMTE3ICovCiAxNCAgICAgICwgMTYyLCAvKiB2IC0gMTE4ICovCiAxNCAgICAgICwgMTY0LCAvKiB3IC0gMTE5ICovCiAxNCAgICAgICwgMTY2LCAvKiB4IC0gMTIwICovCiAxNCAgICAgICwgMTY3LCAvKiB5IC0gMTIxICovCiAxNCAgICAgICwgMTY5LCAvKiB6IC0gMTIyICovCiAgNyAgICAgICwgIDc0LCAvKiB7IC0gMTIzICovCiAgNyAgICAgICwgIDc2LCAvKiB8IC0gMTI0ICovCiAgNyAgICAgICwgIDc4LCAvKiB9IC0gMTI1ICovCiAgNyAgICAgICwgIDgwLCAvKiB+IC0gMTI2ICovCiAgNiAgICAgICwgIDI5LCAvKiB/IC0gMTI3ICovCiAgNiAgICAgICwgIDMwLCAvKiCAIC0gMTI4ICovCiAgNiAgICAgICwgIDMxLCAvKiCBIC0gMTI5ICovCiAgNyAgICAgICwgMTIzLCAvKiCCIC0gMTMwICovCiAxNCAgICAgICwgIDM1LCAvKiCDIC0gMTMxICovCiAgNyAgICAgICwgMTI3LCAvKiCEIC0gMTMyICovCiAxMCAgICAgICwgIDIxLCAvKiCFIC0gMTMzICovCiAxMCAgICAgICwgIDE1LCAvKiCGIC0gMTM0ICovCiAxMCAgICAgICwgIDE2LCAvKiCHIC0gMTM1ICovCiAgNyAgICAgICwgIDY3LCAvKiCIIC0gMTM2ICovCiAxMCAgICAgICwgIDIyLCAvKiCJIC0gMTM3ICovCiAxNCAgICAgICwgMTQ1LCAvKiCKIC0gMTM4ICovCiAgNyAgICAgICwgMTM2LCAvKiCLIC0gMTM5ICovCiAxNCArIDE2ICwgMTI0LCAvKiCMIC0gMTQwICovCiAgNiAgICAgICwgIDQzLCAvKiCNIC0gMTQxICovCiAgNiAgICAgICwgIDQ0LCAvKiCOIC0gMTQyICovCiAgNiAgICAgICwgIDQ1LCAvKiCPIC0gMTQzICovCiAgNiAgICAgICwgIDQ2LCAvKiCQIC0gMTQ0ICovCiAgNyAgICAgICwgMTIxLCAvKiCRIC0gMTQ1ICovCiAgNyAgICAgICwgMTIyLCAvKiCSIC0gMTQ2ICovCiAgNyAgICAgICwgMTI1LCAvKiCTIC0gMTQ3ICovCiAgNyAgICAgICwgMTI2LCAvKiCUIC0gMTQ4ICovCiAxMCAgICAgICwgIDE3LCAvKiCVIC0gMTQ5ICovCiAgNiAgICAgICwgMTM3LCAvKiCWIC0gMTUwICovCiAgNiAgICAgICwgMTM5LCAvKiCXIC0gMTUxICovCiAgNyAgICAgICwgIDkzLCAvKiCYIC0gMTUyICovCiAxNCAgICAgICwgMTU2LCAvKiCZIC0gMTUzICovCiAxNCAgICAgICwgMTQ1LCAvKiCaIC0gMTU0ICovCiAgNyAgICAgICwgMTM3LCAvKiCbIC0gMTU1ICovCiAxNCArIDE2ICwgMTI0LCAvKiCcIC0gMTU2ICovCiAgNiAgICAgICwgIDU5LCAvKiCdIC0gMTU3ICovCiAgNiAgICAgICwgIDYwLCAvKiCeIC0gMTU4ICovCiAxNCAgICAgICwgMTY3LCAvKiCfIC0gMTU5ICovCiAgNyAgICAgICwgICA0LCAvKiCgIC0gMTYwICovCiAgNyAgICAgICwgIDgxLCAvKiChIC0gMTYxICovCiAxMCAgICAgICwgICAyLCAvKiCiIC0gMTYyICovCiAxMCAgICAgICwgICAzLCAvKiCjIC0gMTYzICovCiAxMCAgICAgICwgICA0LCAvKiCkIC0gMTY0ICovCiAxMCAgICAgICwgICA1LCAvKiClIC0gMTY1ICovCiAgNyAgICAgICwgIDgyLCAvKiCmIC0gMTY2ICovCiAxMCAgICAgICwgICA2LCAvKiCnIC0gMTY3ICovCiAgNyAgICAgICwgIDgzLCAvKiCoIC0gMTY4ICovCiAxMCAgICAgICwgICA3LCAvKiCpIC0gMTY5ICovCiAxNCAgICAgICwgICAyLCAvKiCqIC0gMTcwICovCiAgOCAgICAgICwgIDI0LCAvKiCrIC0gMTcxICovCiAxMCAgICAgICwgICA4LCAvKiCsIC0gMTcyICovCiAgNiAgICAgICwgMTMxLCAvKiCtIC0gMTczICovCiAxMCAgICAgICwgICA5LCAvKiCuIC0gMTc0ICovCiAgNyAgICAgICwgIDg0LCAvKiCvIC0gMTc1ICovCiAxMCAgICAgICwgIDEwLCAvKiCwIC0gMTc2ICovCiAgOCAgICAgICwgIDIzLCAvKiCxIC0gMTc3ICovCiAxMiAgICAgICwgIDUxLCAvKiCyIC0gMTc4ICovCiAxMiAgICAgICwgIDcwLCAvKiCzIC0gMTc5ICovCiAgNyAgICAgICwgIDg1LCAvKiC0IC0gMTgwICovCiAxMCAgICAgICwgIDExLCAvKiC1IC0gMTgxICovCiAxMCAgICAgICwgIDEyLCAvKiC2IC0gMTgyICovCiAxMCAgICAgICwgIDEzLCAvKiC3IC0gMTgzICovCiAgNyAgICAgICwgIDg2LCAvKiC4IC0gMTg0ICovCiAxMiAgICAgICwgIDMzLCAvKiC5IC0gMTg1ICovCiAxNCAgICAgICwgMTI0LCAvKiC6IC0gMTg2ICovCiAgOCAgICAgICwgIDI2LCAvKiC7IC0gMTg3ICovCiAxMiAgICAgICwgIDIxLCAvKiC8IC0gMTg4ICovCiAxMiAgICAgICwgIDI1LCAvKiC9IC0gMTg5ICovCiAxMiAgICAgICwgIDI5LCAvKiC+IC0gMTkwICovCiAgNyAgICAgICwgIDg3LCAvKiC/IC0gMTkxICovCiAxNCAgICAgICwgICAyLCAvKiDAIC0gMTkyICovCiAxNCAgICAgICwgICAyLCAvKiDBIC0gMTkzICovCiAxNCAgICAgICwgICAyLCAvKiDCIC0gMTk0ICovCiAxNCAgICAgICwgICAyLCAvKiDDIC0gMTk1ICovCiAxNCAgICAgICwgICAyLCAvKiDEIC0gMTk2ICovCiAxNCAgICAgICwgICAyLCAvKiDFIC0gMTk3ICovCiAxNCArIDE2ICwgICAyLCAvKiDGIC0gMTk4ICovCiAxNCAgICAgICwgIDEwLCAvKiDHIC0gMTk5ICovCiAxNCAgICAgICwgIDMzLCAvKiDIIC0gMjAwICovCiAxNCAgICAgICwgIDMzLCAvKiDJIC0gMjAxICovCiAxNCAgICAgICwgIDMzLCAvKiDKIC0gMjAyICovCiAxNCAgICAgICwgIDMzLCAvKiDLIC0gMjAzICovCiAxNCAgICAgICwgIDUwLCAvKiDMIC0gMjA0ICovCiAxNCAgICAgICwgIDUwLCAvKiDNIC0gMjA1ICovCiAxNCAgICAgICwgIDUwLCAvKiDOIC0gMjA2ICovCiAxNCAgICAgICwgIDUwLCAvKiDPIC0gMjA3ICovCiAxNCAgICAgICwgIDI2LCAvKiDQIC0gMjA4ICovCiAxNCAgICAgICwgMTEyLCAvKiDRIC0gMjA5ICovCiAxNCAgICAgICwgMTI0LCAvKiDSIC0gMjEwICovCiAxNCAgICAgICwgMTI0LCAvKiDTIC0gMjExICovCiAxNCAgICAgICwgMTI0LCAvKiDUIC0gMjEyICovCiAxNCAgICAgICwgMTI0LCAvKiDVIC0gMjEzICovCiAxNCAgICAgICwgMTI0LCAvKiDWIC0gMjE0ICovCiAgOCAgICAgICwgIDI4LCAvKiDXIC0gMjE1ICovCiAxNCAgICAgICwgMTI0LCAvKiDYIC0gMjE2ICovCiAxNCAgICAgICwgMTU5LCAvKiDZIC0gMjE3ICovCiAxNCAgICAgICwgMTU5LCAvKiDaIC0gMjE4ICovCiAxNCAgICAgICwgMTU5LCAvKiDbIC0gMjE5ICovCiAxNCAgICAgICwgMTU5LCAvKiDcIC0gMjIwICovCiAxNCAgICAgICwgMTY3LCAvKiDdIC0gMjIxICovCiAxNCArIDMyICwgMTUzLCAvKiDeIC0gMjIyICovCiAxNCArIDQ4ICwgMTQ1LCAvKiDfIC0gMjIzICovCiAxNCAgICAgICwgICAyLCAvKiDgIC0gMjI0ICovCiAxNCAgICAgICwgICAyLCAvKiDhIC0gMjI1ICovCiAxNCAgICAgICwgICAyLCAvKiDiIC0gMjI2ICovCiAxNCAgICAgICwgICAyLCAvKiDjIC0gMjI3ICovCiAxNCAgICAgICwgICAyLCAvKiDkIC0gMjI4ICovCiAxNCAgICAgICwgICAyLCAvKiDlIC0gMjI5ICovCiAxNCArIDE2ICwgICAyLCAvKiDmIC0gMjMwICovCiAxNCAgICAgICwgIDEwLCAvKiDnIC0gMjMxICovCiAxNCAgICAgICwgIDMzLCAvKiDoIC0gMjMyICovCiAxNCAgICAgICwgIDMzLCAvKiDpIC0gMjMzICovCiAxNCAgICAgICwgIDMzLCAvKiDqIC0gMjM0ICovCiAxNCAgICAgICwgIDMzLCAvKiDrIC0gMjM1ICovCiAxNCAgICAgICwgIDUwLCAvKiDsIC0gMjM2ICovCiAxNCAgICAgICwgIDUwLCAvKiDtIC0gMjM3ICovCiAxNCAgICAgICwgIDUwLCAvKiDuIC0gMjM4ICovCiAxNCAgICAgICwgIDUwLCAvKiDvIC0gMjM5ICovCiAxNCAgICAgICwgIDI2LCAvKiDwIC0gMjQwICovCiAxNCAgICAgICwgMTEyLCAvKiDxIC0gMjQxICovCiAxNCAgICAgICwgMTI0LCAvKiDyIC0gMjQyICovCiAxNCAgICAgICwgMTI0LCAvKiDzIC0gMjQzICovCiAxNCAgICAgICwgMTI0LCAvKiD0IC0gMjQ0ICovCiAxNCAgICAgICwgMTI0LCAvKiD1IC0gMjQ1ICovCiAxNCAgICAgICwgMTI0LCAvKiD2IC0gMjQ2ICovCiAgOCAgICAgICwgIDI5LCAvKiD3IC0gMjQ3ICovCiAxNCAgICAgICwgMTI0LCAvKiD4IC0gMjQ4ICovCiAxNCAgICAgICwgMTU5LCAvKiD5IC0gMjQ5ICovCiAxNCAgICAgICwgMTU5LCAvKiD6IC0gMjUwICovCiAxNCAgICAgICwgMTU5LCAvKiD7IC0gMjUxICovCiAxNCAgICAgICwgMTU5LCAvKiD8IC0gMjUyICovCiAxNCAgICAgICwgMTY3LCAvKiD9IC0gMjUzICovCiAxNCArIDMyICwgMTUzLCAvKiD+IC0gMjU0ICovCiAxNCAgICAgICwgMTY3ICAvKiD/IC0gMjU1ICovIH07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRfMltdID0geyAzMywgNDQsIDE0NSB9OwoKI2RlZmluZSBMQ01fRGlhY3JpdGljX1N0YXJ0IDEzMQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX0RpYWNyaXRpY19MVVRbXSA9IHsgCjEyMywgIC8qIIMgLSAxMzEgKi8KICAyLCAgLyoghCAtIDEzMiAqLwogIDIsICAvKiCFIC0gMTMzICovCiAgMiwgIC8qIIYgLSAxMzQgKi8KICAyLCAgLyoghyAtIDEzNSAqLwogIDMsICAvKiCIIC0gMTM2ICovCiAgMiwgIC8qIIkgLSAxMzcgKi8KIDIwLCAgLyogiiAtIDEzOCAqLwogIDIsICAvKiCLIC0gMTM5ICovCiAgMiwgIC8qIIwgLSAxNDAgKi8KICAyLCAgLyogjSAtIDE0MSAqLwogIDIsICAvKiCOIC0gMTQyICovCiAgMiwgIC8qII8gLSAxNDMgKi8KICAyLCAgLyogkCAtIDE0NCAqLwogIDIsICAvKiCRIC0gMTQ1ICovCiAgMiwgIC8qIJIgLSAxNDYgKi8KICAyLCAgLyogkyAtIDE0NyAqLwogIDIsICAvKiCUIC0gMTQ4ICovCiAgMiwgIC8qIJUgLSAxNDkgKi8KICAyLCAgLyogliAtIDE1MCAqLwogIDIsICAvKiCXIC0gMTUxICovCiAgMiwgIC8qIJggLSAxNTIgKi8KICAyLCAgLyogmSAtIDE1MyAqLwogMjAsICAvKiCaIC0gMTU0ICovCiAgMiwgIC8qIJsgLSAxNTUgKi8KICAyLCAgLyognCAtIDE1NiAqLwogIDIsICAvKiCdIC0gMTU3ICovCiAgMiwgIC8qIJ4gLSAxNTggKi8KIDE5LCAgLyognyAtIDE1OSAqLwogIDIsICAvKiCgIC0gMTYwICovCiAgMiwgIC8qIKEgLSAxNjEgKi8KICAyLCAgLyogoiAtIDE2MiAqLwogIDIsICAvKiCjIC0gMTYzICovCiAgMiwgIC8qIKQgLSAxNjQgKi8KICAyLCAgLyogpSAtIDE2NSAqLwogIDIsICAvKiCmIC0gMTY2ICovCiAgMiwgIC8qIKcgLSAxNjcgKi8KICAyLCAgLyogqCAtIDE2OCAqLwogIDIsICAvKiCpIC0gMTY5ICovCiAgMywgIC8qIKogLSAxNzAgKi8KICAyLCAgLyogqyAtIDE3MSAqLwogIDIsICAvKiCsIC0gMTcyICovCiAgMiwgIC8qIK0gLSAxNzMgKi8KICAyLCAgLyogriAtIDE3NCAqLwogIDIsICAvKiCvIC0gMTc1ICovCiAgMiwgIC8qILAgLSAxNzYgKi8KICAyLCAgLyogsSAtIDE3NyAqLwogIDIsICAvKiCyIC0gMTc4ICovCiAgMiwgIC8qILMgLSAxNzkgKi8KICAyLCAgLyogtCAtIDE4MCAqLwogIDIsICAvKiC1IC0gMTgxICovCiAgMiwgIC8qILYgLSAxODIgKi8KICAyLCAgLyogtyAtIDE4MyAqLwogIDIsICAvKiC4IC0gMTg0ICovCiAgMiwgIC8qILkgLSAxODUgKi8KICAzLCAgLyoguiAtIDE4NiAqLwogIDIsICAvKiC7IC0gMTg3ICovCiAgMiwgIC8qILwgLSAxODggKi8KICAyLCAgLyogvSAtIDE4OSAqLwogIDIsICAvKiC+IC0gMTkwICovCiAgMiwgIC8qIL8gLSAxOTEgKi8KIDE1LCAgLyogwCAtIDE5MiAqLwogMTQsICAvKiDBIC0gMTkzICovCiAxOCwgIC8qIMIgLSAxOTQgKi8KIDI1LCAgLyogwyAtIDE5NSAqLwogMTksICAvKiDEIC0gMTk2ICovCiAyNiwgIC8qIMUgLSAxOTcgKi8KICAyLCAgLyogxiAtIDE5OCAqLwogMjgsICAvKiDHIC0gMTk5ICovCiAxNSwgIC8qIMggLSAyMDAgKi8KIDE0LCAgLyogySAtIDIwMSAqLwogMTgsICAvKiDKIC0gMjAyICovCiAxOSwgIC8qIMsgLSAyMDMgKi8KIDE1LCAgLyogzCAtIDIwNCAqLwogMTQsICAvKiDNIC0gMjA1ICovCiAxOCwgIC8qIM4gLSAyMDYgKi8KIDE5LCAgLyogzyAtIDIwNyAqLwoxMDQsICAvKiDQIC0gMjA4ICovCiAyNSwgIC8qINEgLSAyMDkgKi8KIDE1LCAgLyog0iAtIDIxMCAqLwogMTQsICAvKiDTIC0gMjExICovCiAxOCwgIC8qINQgLSAyMTIgKi8KIDI1LCAgLyog1SAtIDIxMyAqLwogMTksICAvKiDWIC0gMjE0ICovCiAgMiwgIC8qINcgLSAyMTUgKi8KIDMzLCAgLyog2CAtIDIxNiAqLwogMTUsICAvKiDZIC0gMjE3ICovCiAxNCwgIC8qINogLSAyMTggKi8KIDE4LCAgLyog2yAtIDIxOSAqLwogMTksICAvKiDcIC0gMjIwICovCiAxNCwgIC8qIN0gLSAyMjEgKi8KICAyLCAgLyog3iAtIDIyMiAqLwogIDIsICAvKiDfIC0gMjIzICovCiAxNSwgIC8qIOAgLSAyMjQgKi8KIDE0LCAgLyog4SAtIDIyNSAqLwogMTgsICAvKiDiIC0gMjI2ICovCiAyNSwgIC8qIOMgLSAyMjcgKi8KIDE5LCAgLyog5CAtIDIyOCAqLwogMjYsICAvKiDlIC0gMjI5ICovCiAgMiwgIC8qIOYgLSAyMzAgKi8KIDI4LCAgLyog5yAtIDIzMSAqLwogMTUsICAvKiDoIC0gMjMyICovCiAxNCwgIC8qIOkgLSAyMzMgKi8KIDE4LCAgLyog6iAtIDIzNCAqLwogMTksICAvKiDrIC0gMjM1ICovCiAxNSwgIC8qIOwgLSAyMzYgKi8KIDE0LCAgLyog7SAtIDIzNyAqLwogMTgsICAvKiDuIC0gMjM4ICovCiAxOSwgIC8qIO8gLSAyMzkgKi8KMTA0LCAgLyog8CAtIDI0MCAqLwogMjUsICAvKiDxIC0gMjQxICovCiAxNSwgIC8qIPIgLSAyNDIgKi8KIDE0LCAgLyog8yAtIDI0MyAqLwogMTgsICAvKiD0IC0gMjQ0ICovCiAyNSwgIC8qIPUgLSAyNDUgKi8KIDE5LCAgLyog9iAtIDI0NiAqLwogIDIsICAvKiD3IC0gMjQ3ICovCiAzMywgIC8qIPggLSAyNDggKi8KIDE1LCAgLyog+SAtIDI0OSAqLwogMTQsICAvKiD6IC0gMjUwICovCiAxOCwgIC8qIPsgLSAyNTEgKi8KIDE5LCAgLyog/CAtIDI1MiAqLwogMTQsICAvKiD9IC0gMjUzICovCiAgMiwgIC8qIP4gLSAyNTQgKi8KIDE5LCAgLyog/yAtIDI1NSAqLwp9IDsKCnN0YXRpYyBpbnQgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiAicHVuY3R1YXRpb24gY2hhcmFjdGVyIiBpbiB0aGlzIGNvbnRleHQgaXMgYSBjaGFyYWN0ZXIgd2hpY2ggaXMgCiAgICAgY29uc2lkZXJlZCAibGVzcyBpbXBvcnRhbnQiIGR1cmluZyB3b3JkIHNvcnQgY29tcGFyaXNvbi4KICAgICBTZWUgTENNYXBTdHJpbmcgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBwcmVjaXNlIGRlZmluaXRpb24gCiAgICAgb2YgImxlc3MgaW1wb3J0YW50Ii4gKi8KCiAgcmV0dXJuIChMQ01fVW5pY29kZV9MVVRbLTIrMipjXT09Nik7Cn0KCnN0YXRpYyBpbnQgaWRlbnRpdHkoaW50IGMpCnsKICByZXR1cm4gYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nMzJBICAgICAgICAgICAgICAgIFtLRVJORUwzMi40OTJdCiAqCiAqIENvbnZlcnQgYSBzdHJpbmcsIG9yIGdlbmVyYXRlIGEgc29ydCBrZXkgZnJvbSBpdC4KICoKICogSWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSksIHRoZSBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlCiAqIGEgc29ydCBrZXkgZm9yIHRoZSBzb3VyY2Ugc3RyaW5nLiAgRWxzZSwgaXQgd2lsbCBjb252ZXJ0IGl0CiAqIGFjY29yZGluZ2x5IHRvIHRoZSBmbGFncyBMQ01BUF9VUFBFUkNBU0UsIExDTUFQX0xPV0VSQ0FTRSwuLi4KICoKICogUkVUVVJOUwogKiAgICBFcnJvciA6IDAuCiAqICAgIFN1Y2Nlc3MgOiBsZW5ndGggb2YgdGhlIHJlc3VsdCBzdHJpbmcuCiAqCiAqIE5PVEVTCiAqICAgIElmIGNhbGxlZCB3aXRoIHNjcmxlbiA9IC0xLCB0aGUgZnVuY3Rpb24gd2lsbCBjb21wdXRlIHRoZSBsZW5ndGgKICogICAgICBvZiB0aGUgMC10ZXJtaW5hdGVkIHN0cmluZyBzdHJzcmMgYnkgaXRzZWxmLiAgICAgIAogKiAKICogICAgSWYgY2FsbGVkIHdpdGggZHN0bGVuID0gMCwgcmV0dXJucyB0aGUgYnVmZmVyIGxlbmd0aCB0aGF0IAogKiAgICAgIHdvdWxkIGJlIHJlcXVpcmVkLgogKgogKiAgICBOT1JNX0lHTk9SRVdJRFRIIG1lYW5zIHRvIGNvbXBhcmUgQVNDSUkgYW5kIFVuaWNvZGUgY2hhcmFjdGVycwogKiAgICBhcyBpZiB0aGV5IGFyZSBlcXVhbC4gIFNpbmNlIFdpbmUgc2VwYXJhdGVzIEFTQ0lJIGFuZCBVbmljb2RlIGludG8KICogICAgc2VwYXJhdGUgZnVuY3Rpb25zLCB3ZSBzaG91bGRuJ3QgaGF2ZSB0byBkbyBhbnl0aGluZyBmb3IgdGhpcyBmbGFnLgogKiAgICBJIGFkZGVkIGl0IHRvIHRoZSBsaXN0IG9mIGZsYWdzIHRoYXQgZG9uJ3QgbmVlZCBhIGZpeG1lIG1lc3NhZ2UKICogICAgdG8gbWFrZSBNUyBXb3JkIDk1IG5vdCBwcmludCBzZXZlcmFsIHRob3VzYW5kIGZpeG1lIG1lc3NhZ2VzIGZvciAKICogICAgdGhpcyBmdW5jdGlvbi4KICovCklOVDMyIFdJTkFQSSBMQ01hcFN0cmluZzMyQSgKCUxDSUQgbGNpZCAvKiBsb2NhbGUgaWRlbnRpZmllciBjcmVhdGVkIHdpdGggTUFLRUxDSUQ7IAoJCSAgICAgTE9DQUxFX1NZU1RFTV9ERUZBVUxUIGFuZCBMT0NBTEVfVVNFUl9ERUZBVUxUIGFyZSAKICAgICAgICAgICAgICAgICAgICAgcHJlZGVmaW5lZCB2YWx1ZXMuICovLAoJRFdPUkQgbWFwZmxhZ3MgLyogZmxhZ3MgKi8sCglMUENTVFIgc3Jjc3RyICAvKiBzb3VyY2UgYnVmZmVyICovLAoJSU5UMzIgc3JjbGVuICAgLyogc291cmNlIGxlbmd0aCAqLywKCUxQU1RSIGRzdHN0ciAgIC8qIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLywKCUlOVDMyIGRzdGxlbiAgIC8qIGRlc3RpbmF0aW9uIGJ1ZmZlciBsZW5ndGggKi8pIAp7CiAgaW50IGk7CgogIFRSQUNFKHN0cmluZywiKDB4JTA0bHgsMHglMDhseCwlcywlZCwlcCwlZClcbiIsCglsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbik7CgogIGlmICggKChkc3RsZW4hPTApICYmIChkc3RzdHI9PU5VTEwpKSB8fCAoc3Jjc3RyPT1OVUxMKSApCiAgewogICAgRVJSKG9sZSwgIihzcmM9JXMsZGVzdD0lcyk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHNyY3N0ciwgZHN0c3RyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKHNyY2xlbiA9PSAtMSkgCiAgICBzcmNsZW4gPSBsc3RybGVuMzJBKHNyY3N0cikgKyAxIDsgICAgLyogKGluY2x1ZGUgZmluYWwgJ1wwJykgKi8KCiAgaWYgKG1hcGZsYWdzICYgfiAoIExDTUFQX1VQUEVSQ0FTRSB8IExDTUFQX0xPV0VSQ0FTRSB8IExDTUFQX1NPUlRLRVkgfAoJCSAgICAgTk9STV9JR05PUkVDQVNFIHwgTk9STV9JR05PUkVOT05TUEFDRSB8IFNPUlRfU1RSSU5HU09SVCB8CgkJICAgICBOT1JNX0lHTk9SRVdJRFRIKSApCiAgewogICAgRklYTUUoc3RyaW5nLCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKTogIgoJICAidW5pbXBsZW1lbnRlZCBmbGFnczogMHglMDhseFxuIiwKCSAgbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4sbWFwZmxhZ3MpOwogIH0KCiAgaWYgKCAhKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgKQogIHsKICAgIGludCAoKmYpKGludCk9aWRlbnRpdHk7IAoKICAgIGlmIChkc3RsZW49PTApCiAgICAgIHJldHVybiBzcmNsZW47ICAvKiBkc3RsZW49MCBtZWFucyAiZG8gbm90aGluZyBidXQgcmV0dXJuIHJlcXVpcmVkIGxlbmd0aCIgKi8KICAgIGlmIChkc3RsZW48c3JjbGVuKQogICAgICBzcmNsZW49ZHN0bGVuOyAgLyogTm8sIHRoaXMgY2FzZSBpcyBub3QgYW4gZXJyb3IgdW5kZXIgV2luZG93cyA5NS4KCQkgICAgICAgICBBbmQgbm8gJ1wwJyBnZXRzIHdyaXR0ZW4uICovCiAgICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpCiAgICAgIGYgPSB0b3VwcGVyOwogICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCiAgICAgIGYgPSB0b2xvd2VyOwogICAgZm9yIChpPTA7IGkgPCBzcmNsZW47IGkrKykKICAgICAgZHN0c3RyW2ldID0gKENIQVIpIGYoc3Jjc3RyW2ldKTsKICAgIHJldHVybiBzcmNsZW47CiAgfQoKICAvKiBlbHNlIC4uLiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSAgKi8KICB7CiAgICBpbnQgdW5pY29kZV9sZW49MDsKICAgIGludCBjYXNlX2xlbj0wOwogICAgaW50IGRpYWNyaXRpY19sZW49MDsKICAgIGludCBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbj0wOwogICAgY2hhciAqY2FzZV9jb21wb25lbnQ7CiAgICBjaGFyICpkaWFjcml0aWNfY29tcG9uZW50OwogICAgY2hhciAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQ7CiAgICBpbnQgcm9vbSxjb3VudDsKICAgIGludCBmbGFnX3N0cmluZ3NvcnQgPSBtYXBmbGFncyAmIFNPUlRfU1RSSU5HU09SVDsKCiAgICAvKiBjb21wdXRlIGhvdyBtdWNoIHJvb20gd2Ugd2lsbCBuZWVkICovCiAgICBmb3IgKGk9MDtpPHNyY2xlbjtpKyspCiAgICB7CiAgICAgIGludCBvZnM7CiAgICAgIHVuc2lnbmVkIGNoYXIgc291cmNlX2NoYXIgPSBzcmNzdHJbaV07CiAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykgCiAgICAgIHsKCWlmIChmbGFnX3N0cmluZ3NvcnQgfHwgIU9MRTJOTFNfaXNQdW5jdHVhdGlvbihzb3VyY2VfY2hhcikpCgl7CgkgIHVuaWNvZGVfbGVuKys7CgkgIGlmICggTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdICYgfjE1ICkKCSAgICB1bmljb2RlX2xlbisrOyAgICAgICAgICAgICAvKiBkb3VibGUgbGV0dGVyICovCgl9CgllbHNlCgl7CgkgIGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuKys7Cgl9CSAgCiAgICAgIH0KCSAgCiAgICAgIGlmIChpc3VwcGVyKHNvdXJjZV9jaGFyKSkKCWNhc2VfbGVuPXVuaWNvZGVfbGVuOyAKCiAgICAgIG9mcyA9IHNvdXJjZV9jaGFyIC0gTENNX0RpYWNyaXRpY19TdGFydDsKICAgICAgaWYgKChvZnM+PTApICYmIChMQ01fRGlhY3JpdGljX0xVVFtvZnNdIT0yKSkKCWRpYWNyaXRpY19sZW49dW5pY29kZV9sZW47CiAgICB9CgogICAgaWYgKG1hcGZsYWdzICYgTk9STV9JR05PUkVDQVNFKQogICAgICBjYXNlX2xlbj0wOyAgICAgICAgICAgICAgICAgICAKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCiAgICAgIGRpYWNyaXRpY19sZW49MDsKCiAgICByb29tID0gIDIgKiB1bmljb2RlX2xlbiAgICAgICAgICAgICAgLyogInVuaWNvZGUiIGNvbXBvbmVudCAqLwogICAgICArICAgICBkaWFjcml0aWNfbGVuICAgICAgICAgICAgICAgIC8qICJkaWFjcml0aWMiIGNvbXBvbmVudCAqLwogICAgICArICAgICBjYXNlX2xlbiAgICAgICAgICAgICAgICAgICAgIC8qICJjYXNlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgNCAqIGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuICAvKiBwdW5jdHVhdGlvbiBpbiB3b3JkIHNvcnQgbW9kZSAqLwogICAgICArICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdXIgJ1wxJyBzZXBhcmF0b3JzICovCiAgICAgICsgICAgIDEgIDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYWwgJ1wwJyAqLwogICAgaWYgKGRzdGxlbj09MCkKICAgICAgcmV0dXJuIHJvb207ICAgICAgCiAgICBlbHNlIGlmIChkc3RsZW48cm9vbSkKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKkZJWE1FIHRoZSBQb2ludGVyY2hlY2sgc2hvdWxkIG5vdCBiZSBuZXNzZXNhcnkgKi8KICAgIGlmIChJc0JhZFdyaXRlUHRyMzIgKGRzdHN0cixyb29tKSkKICAgIHsgRVJSIChzdHJpbmcsImJhZCBkZXN0aW5hdGlvbiBidWZmZXIgKGRzdHN0cikgOiAlcCwlZFxuIixkc3RzdHIsZHN0bGVuKTsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiBsb2NhdGUgZWFjaCBjb21wb25lbnQsIHdyaXRlIHNlcGFyYXRvcnMgKi8KICAgIGRpYWNyaXRpY19jb21wb25lbnQgPSBkc3RzdHIgKyAyKnVuaWNvZGVfbGVuIDsKICAgICpkaWFjcml0aWNfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGNhc2VfY29tcG9uZW50ID0gZGlhY3JpdGljX2NvbXBvbmVudCArIGRpYWNyaXRpY19sZW4gOwogICAgKmNhc2VfY29tcG9uZW50KysgPSAnXDEnOyAKICAgIGRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50ID0gY2FzZV9jb21wb25lbnQgKyBjYXNlX2xlbiA7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CiAgICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICdcMSc7CgogICAgLyogcmVhZCBzb3VyY2Ugc3RyaW5nIGNoYXIgYnkgY2hhciwgd3JpdGUgCiAgICAgICBjb3JyZXNwb25kaW5nIHdlaWdodCBpbiBlYWNoIGNvbXBvbmVudC4gKi8KICAgIGZvciAoaT0wLGNvdW50PTA7aTxzcmNsZW47aSsrKQogICAgewogICAgICB1bnNpZ25lZCBjaGFyIHNvdXJjZV9jaGFyPXNyY3N0cltpXTsKICAgICAgaWYgKHNvdXJjZV9jaGFyIT0nXDAnKSAKICAgICAgewoJaW50IHR5cGUsbG9uZ2NvZGU7Cgl0eXBlID0gTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdOwoJbG9uZ2NvZGUgPSB0eXBlID4+IDQ7Cgl0eXBlICY9IDE1OwoJaWYgKCFmbGFnX3N0cmluZ3NvcnQgJiYgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkgCgl7CgkgIFVJTlQxNiBlbmNyeXB0ZWRfbG9jYXRpb24gPSAoMTw8MTUpICsgNyArIDQqY291bnQ7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24+PjgpOwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uJjI1NSk7CiAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gaXMgdXNlZCBoZXJlIGJlY2F1c2UgaXQgbGV0cyBzdHJpbmcgY29tcGFyaXNvbiBiZQoJCQljb21wYXRpYmxlIHdpdGggbnVtZXJpY2FsIGNvbXBhcmlzb24gKi8KCgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gdHlwZTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKICAgICAgICAgICAgICAgICAgICAgLyogYXNzdW1wdGlvbiA6IGEgcHVuY3R1YXRpb24gY2hhcmFjdGVyIGlzIG5ldmVyIGEgCgkJCWRvdWJsZSBvciBhY2NlbnRlZCBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgZHN0c3RyWzIqY291bnQrMV0gPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07ICAKCSAgaWYgKGxvbmdjb2RlKQoJICB7CgkgICAgaWYgKGNvdW50PGNhc2VfbGVuKQoJICAgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKCSAgICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gMjsgLyogYXNzdW1wdGlvbjogYSBkb3VibGUgbGV0dGVyCgkJCQkJCSBpcyBuZXZlciBhY2NlbnRlZCAqLwoJICAgIGNvdW50Kys7CgkgICAgCgkgICAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgICBkc3RzdHJbMipjb3VudCsxXSA9ICooTENNX1VuaWNvZGVfTFVUXzIgLSAxICsgbG9uZ2NvZGUpOyAKCSAgICAvKiAxNiBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDEgCgkgICAgICAgMzIgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAyIAoJICAgICAgIDQ4IGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMyAqLwoJICB9CgoJICBpZiAoY291bnQ8Y2FzZV9sZW4pCgkgICAgY2FzZV9jb21wb25lbnRbY291bnRdID0gKCBpc3VwcGVyKHNvdXJjZV9jaGFyKSA/IDE4IDogMiApIDsKCSAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgIHsKCSAgICBpbnQgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwoJICAgIGRpYWNyaXRpY19jb21wb25lbnRbY291bnRdID0gKG9mcz49MCA/IExDTV9EaWFjcml0aWNfTFVUW29mc10gOiAyKTsKCSAgfQoJICBjb3VudCsrOwoJfQogICAgICB9CiAgICB9CiAgICBkc3RzdHJbcm9vbS0xXSA9ICdcMCc7CiAgICByZXR1cm4gcm9vbTsKICB9Cn0KCQkgICAgIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgTENNYXBTdHJpbmczMlcgICAgICAgICAgICAgICAgW0tFUk5FTDMyLjQ5M10KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBOT1RFCiAqCiAqIFNlZSBMQ01hcFN0cmluZzMyQSBmb3IgZG9jdW1lbnRhdGlvbgogKi8KSU5UMzIgV0lOQVBJIExDTWFwU3RyaW5nMzJXKAoJTENJRCBsY2lkLERXT1JEIG1hcGZsYWdzLExQQ1dTVFIgc3Jjc3RyLElOVDMyIHNyY2xlbixMUFdTVFIgZHN0c3RyLAoJSU5UMzIgZHN0bGVuKQp7CiAgaW50IGk7CiAKICBUUkFDRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpXG4iLAoJbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUihvbGUsICIoc3JjPSVwLGRzdD0lcCk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHNyY3N0ciwgZHN0c3RyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKHNyY2xlbj09LTEpIAogICAgc3JjbGVuID0gbHN0cmxlbjMyVyhzcmNzdHIpKzE7CiAgaWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgCiAgewogICAgRklYTUUoc3RyaW5nLCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKTogIgoJICAidW5pbXBsZW1lbnRlZCBmbGFnczogMHglMDhseFxuIiwKCSAgbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4sbWFwZmxhZ3MpOwogICAgcmV0dXJuIDA7CiAgfQogIGVsc2UKICB7CiAgICBpbnQgKCpmKShpbnQpPWlkZW50aXR5OyAKCiAgICBpZiAoZHN0bGVuPT0wKQogICAgICByZXR1cm4gc3JjbGVuOyAgCiAgICBpZiAoZHN0bGVuPHNyY2xlbikKICAgICAgcmV0dXJuIDA7ICAgICAgIAogICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQogICAgICBmID0gdG91cHBlcjsKICAgIGVsc2UgaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKQogICAgICBmID0gdG9sb3dlcjsKICAgIGZvciAoaT0wOyBpIDwgc3JjbGVuOyBpKyspCiAgICAgIGRzdHN0cltpXSA9IChXQ0hBUikgZihzcmNzdHJbaV0pOwogICAgcmV0dXJuIHNyY2xlbjsKICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgQ29tcGFyZVN0cmluZzE2ICAgICAgIChPTEUyTkxTLjgpCiAqLwpVSU5UMTYgV0lOQVBJIENvbXBhcmVTdHJpbmcxNihEV09SRCBsY2lkLERXT1JEIGZkd1N0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgczEsRFdPUkQgbDEsTFBDU1RSIHMyLERXT1JEIGwyKQp7CglyZXR1cm4gKFVJTlQxNilDb21wYXJlU3RyaW5nMzJBKGxjaWQsZmR3U3R5bGUsczEsbDEsczIsbDIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29tcGFyZVN0cmluZzMyQSBbS0VSTkVMMzIuMjldIENvbXBhcmVzIHR3byBzdHJpbmdzIHVzaW5nIGxvY2FsZQogKgogKiBSRVRVUk5TCiAqCiAqIHN1Y2Nlc3M6IENTVFJfTEVTU19USEFOLCBDU1RSX0VRVUFMLCBDU1RSX0dSRUFURVJfVEhBTgogKiBmYWlsdXJlOiAwCiAqCiAqIE5PVEVTCiAqCiAqIERlZmF1bHRzIHRvIGEgd29yZCBzb3J0LCBidXQgdXNlcyBhIHN0cmluZyBzb3J0IGlmCiAqIFNPUlRfU1RSSU5HU09SVCBpcyBzZXQuCiAqIENhbGxzIFNldExhc3RFcnJvciBmb3IgRVJST1JfSU5WQUxJRF9GTEFHUywgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIuCiAqIAogKiBCVUdTCiAqCiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgbG9jYWxlCiAqCiAqIEZJWE1FCiAqIAogKiBRdWl0ZSBpbmVmZmljaWVudC4KICovClVJTlQzMiBXSU5BUEkgQ29tcGFyZVN0cmluZzMyQSgKICAgIERXT1JEIGxjaWQsICAgICAvKiBsb2NhbGUgSUQgKi8KICAgIERXT1JEIGZkd1N0eWxlLCAvKiBjb21wYXJpc29uLXN0eWxlIG9wdGlvbnMgKi8KICAgIExQQ1NUUiBzMSwgICAgICAvKiBmaXJzdCBzdHJpbmcgKi8KICAgIERXT1JEIGwxLCAgICAgICAvKiBsZW5ndGggb2YgZmlyc3Qgc3RyaW5nICovCiAgICBMUENTVFIgczIsICAgICAgLyogc2Vjb25kIHN0cmluZyAqLwogICAgRFdPUkQgbDIpICAgICAgIC8qIGxlbmd0aCBvZiBzZWNvbmQgc3RyaW5nICovCnsKICBpbnQgbWFwc3RyaW5nX2ZsYWdzOwogIGludCBsZW4xLGxlbjI7CiAgaW50IHJlc3VsdDsKICBMUFNUUiBzazEsc2syOwogIFRSQUNFKG9sZSwiJXMgYW5kICVzXG4iLAoJZGVidWdzdHJfYSAoczEpLCBkZWJ1Z3N0cl9hIChzMikpOwoKICBpZiAoIChzMT09TlVMTCkgfHwgKHMyPT1OVUxMKSApCiAgeyAgICAKICAgIEVSUihvbGUsICIoczE9JXMsczI9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzMSwgczIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCiAgICBGSVhNRShvbGUsICJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwogIAkKICBtYXBzdHJpbmdfZmxhZ3MgPSBMQ01BUF9TT1JUS0VZIHwgZmR3U3R5bGUgOwogIGxlbjEgPSBMQ01hcFN0cmluZzMyQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMSxsMSxOVUxMLDApOwogIGxlbjIgPSBMQ01hcFN0cmluZzMyQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMixsMixOVUxMLDApOwoKICBpZiAoKGxlbjE9PTApfHwobGVuMj09MCkpCiAgICByZXR1cm4gMDsgICAgIC8qIHNvbWV0aGluZyB3cm9uZyBoYXBwZW5lZCAqLwoKICBzazEgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4xKTsKICBzazIgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxsZW4yKTsKICBpZiAoICghTENNYXBTdHJpbmczMkEobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsc2sxLGxlbjEpKQoJIHx8ICghTENNYXBTdHJpbmczMkEobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczIsbDIsc2syLGxlbjIpKSApCiAgewogICAgRVJSKG9sZSwiQnVnIGluIExDbWFwU3RyaW5nMzJBLlxuIik7CiAgICByZXN1bHQgPSAwOwogIH0KICBlbHNlCiAgewogICAgLyogc3RyY21wIGRvZXNuJ3QgbmVjZXNzYXJpbHkgcmV0dXJuIC0xLCAwLCBvciAxICovCiAgICByZXN1bHQgPSBzdHJjbXAoc2sxLHNrMik7CiAgfQogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxzazEpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxzazIpOwoKICBpZiAocmVzdWx0IDwgMCkKICAgIHJldHVybiAxOwogIGlmIChyZXN1bHQgPT0gMCkKICAgIHJldHVybiAyOwoKICAvKiBtdXN0IGJlIGdyZWF0ZXIsIGlmIHdlIHJlYWNoIHRoaXMgcG9pbnQgKi8KICByZXR1cm4gMzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBDb21wYXJlU3RyaW5nMzJXICAgICAgIChLRVJORUwzMi4zMCkKICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKICogRklYTUUgOiAgRG9lcyBvbmx5IHN0cmluZyBzb3J0LiAgU2hvdWxkCiAqIGJlIHJlaW1wbGVtZW50ZWQgdGhlIHNhbWUgd2F5IGFzIENvbXBhcmVTdHJpbmczMkEuCiAqLwpVSU5UMzIgV0lOQVBJIENvbXBhcmVTdHJpbmczMlcoRFdPUkQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBzMSwgRFdPUkQgbDEsIExQQ1dTVFIgczIsRFdPUkQgbDIpCnsKCWludCBsZW4scmV0OwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQoJCUZJWE1FKG9sZSwiSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FKG9sZSwiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCgkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwoJLyogRklYTUU6IEhhbmRsZSBOT1JNX1NUUklOR1NPUlQgKi8KCWwxID0gKGwxPT0tMSk/bHN0cmxlbjMyVyhzMSk6bDE7CglsMiA9IChsMj09LTEpP2xzdHJsZW4zMlcoczIpOmwyOwoJbGVuID0gbDE8bDIgPyBsMTpsMjsKCXJldCA9IChmZHdTdHlsZSAmIE5PUk1fSUdOT1JFQ0FTRSkgPwoJCWxzdHJuY21waTMyVyhzMSxzMixsZW4pCTogbHN0cm5jbXAzMlcoczEsczIsbGVuKTsKCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwoJaWYocmV0IT0wKSByZXR1cm4gcmV0KzI7CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMikgcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogIE9MRV9HZXRGb3JtYXRBKCkgW2ludGVybmFsXQoKCiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgc3R1ZmYgZm9yIEdldERhdGVGb3JtYXQoKSBhbmQgCiBHZXRUaW1lRm9ybWF0KCkuCgogIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCiAgZGQgICB0d28tZGlnaXQgZGF5IChvZiBtb250aCkKICBkZGQgIHNob3J0IGRheS1vZi13ZWVrIG5hbWUKICBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQogIE0gICAgc2luZ2xlLWRpZ2l0IG1vbnRoCiAgTU0gICB0d28tZGlnaXQgbW9udGgKICBNTU0gIHNob3J0IG1vbnRoIG5hbWUKICBNTU1NIGZ1bGwgbW9udGggbmFtZQogIHkgICAgdHdvLWRpZ2l0IHllYXIsIG5vIGxlYWRpbmcgMAogIHl5ICAgdHdvLWRpZ2l0IHllYXIKICB5eXl5IGZvdXItZGlnaXQgeWVhcgogIGdnICAgZXJhIHN0cmluZwogIGggICAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAgaGggICBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIEggICAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDI0LWhvdXIpCiAgSEggICBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIG0gICAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogIG1tICAgbWludXRlcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIHMgICAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogIHNzICAgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIHQgICAgdGltZSBtYXJrZXIgKEEgb3IgUCkKICB0dCAgIHRpbWUgbWFya2VyIChBTSwgUE0pCiAgJycgICB1c2VkIHRvIHF1b3RlIGxpdGVyYWwgY2hhcmFjdGVycwogICcnICAgKHdpdGhpbiBhIHF1b3RlZCBzdHJpbmcpIGluZGljYXRlcyBhIGxpdGVyYWwgJwoKIFRoZXNlIGZ1bmN0aW9ucyBSRVFVSVJFIHZhbGlkIGxvY2FsZSwgZGF0ZSwgIGFuZCBmb3JtYXQuIAoKICovCgpJTlQzMiBXSU5BUEkgT0xFX0dldEZvcm1hdEEoTENJRCBsb2NhbGUsCgkJCSAgICBEV09SRCBmbGFncywKCQkJICAgIERXT1JEIHRmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1NUUiBfZm9ybWF0LCAKCQkJICAgIExQU1RSIGRhdGUsIElOVDMyIGRhdGVsZW4pCnsKICAgSU5UMzIgaW5wb3MsIG91dHBvczsKICAgaW50IGNvdW50LCB0eXBlLCBpbnF1b3RlLCBPdmVyZmxvdzsKICAgY2hhciBidWZbNDBdOwogICBjaGFyIGZvcm1hdFs0MF07CiAgIGNoYXIgKiBwb3M7CiAgIGludCBidWZsZW47CgogICBjb25zdCBjaGFyICogX2RnZm10W10gPSB7ICIlZCIsICIlMDJkIiB9OwogICBjb25zdCBjaGFyICoqIGRnZm10ID0gX2RnZm10IC0gMTsgCgogICAvKiByZXBvcnQsIGZvciBkZWJ1Z2dpbmcgKi8KICAgVFJBQ0Uob2xlLCAiKDB4JWx4LDB4JWx4LCAweCVseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10OlwnJXNcJyAoYXQgJXApLCAlcCAoJXMpLCBsZW49JWQpXG4iLAogICAJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgZm9ybWF0LCBmb3JtYXQsIGRhdGUsIGRhdGUsIGRhdGVsZW4pOwogIAogICAvKiBpbml0YWxpemUgc3RhdGUgdmFyaWFibGVzIGFuZCBvdXRwdXQgYnVmZmVyICovCiAgIGlucG9zID0gb3V0cG9zID0gMDsKICAgY291bnQgPSAwOyBpbnF1b3RlID0gMDsgT3ZlcmZsb3cgPSAwOwogICB0eXBlID0gJ1wwJzsKICAgZGF0ZVswXSA9IGJ1ZlswXSA9ICdcMCc7CiAgICAgIAogICBzdHJjcHkoZm9ybWF0LF9mb3JtYXQpOwoKICAgLyogYWx0ZXIgdGhlIGZvcm1hdHN0cmluZywgd2hpbGUgaXQgd29ya3MgZm9yIGFsbCBsYW5ndWFnZXMgbm93IGluIHdpbmUKICAgaXRzIHBvc3NpYmxlIHRoYXQgaXQgZmFpbHMgd2hlbiB0aGUgdGltZSBsb29rcyBsaWtlIHNzOm1tOmhoIGFzIGV4YW1wbGUqLyAgIAogICBpZiAodGZsYWdzICYgKFRJTUVfTk9NSU5VVEVTT1JTRUNPTkRTKSkKICAgeyBpZiAoKHBvcyA9IHN0cnN0ciAoIGZvcm1hdCwgIjptbSIpKSkKICAgICB7IG1lbWNweSAoIHBvcywgcG9zKzMsIHN0cmxlbihmb3JtYXQpLShwb3MtZm9ybWF0KS0yICk7CiAgICAgfQogICB9CiAgIGlmICh0ZmxhZ3MgJiAoVElNRV9OT1NFQ09ORFMpKQogICB7IGlmICgocG9zID0gc3Ryc3RyICggZm9ybWF0LCAiOnNzIikpKQogICAgIHsgbWVtY3B5ICggcG9zLCBwb3MrMywgc3RybGVuKGZvcm1hdCktKHBvcy1mb3JtYXQpLTIgKTsKICAgICB9CiAgIH0KICAgCiAgIGZvciAoaW5wb3MgPSAwOzsgaW5wb3MrKykgewogICAgICAvKiBUUkFDRShvbGUsICJTVEFURSBpbnBvcz0lMmQgb3V0cG9zPSUyZCBjb3VudD0lZCBpbnF1b3RlPSVkIHR5cGU9JWMgYnVmLGRhdGUgPSAlYywlY1xuIiwgaW5wb3MsIG91dHBvcywgY291bnQsIGlucXVvdGUsIHR5cGUsIGJ1ZltpbnBvc10sIGRhdGVbb3V0cG9zXSk7ICovCiAgICAgIGlmIChpbnF1b3RlKSB7CgkgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJICAgIGlmIChmb3JtYXRbaW5wb3MrMV0gPT0gJ1wnJykgewoJICAgICAgIGlucG9zICs9IDE7CgkgICAgICAgZGF0ZVtvdXRwb3MrK10gPSAnXCcnOwoJICAgIH0gZWxzZSB7CgkgICAgICAgaW5xdW90ZSA9IDA7CgkgICAgICAgY29udGludWU7IC8qIHdlIGRpZCBub3RoaW5nIHRvIHRoZSBvdXRwdXQgKi8KCSAgICB9CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcMCcpIHsKCSAgICBkYXRlW291dHBvcysrXSA9ICdcMCc7CgkgICAgaWYgKG91dHBvcyA+IGRhdGVsZW4pIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsKCSB9IGVsc2UgewoJICAgIGRhdGVbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKCSAgICBpZiAob3V0cG9zID4gZGF0ZWxlbikgewoJICAgICAgIE92ZXJmbG93ID0gMTsKCSAgICAgICBkYXRlW291dHBvcy0xXSA9ICdcMCc7IC8qIHRoaXMgaXMgdGhlIGxhc3QgcGxhY2Ugd2hlcmUKCQkJCQkgaXQncyBzYWZlIHRvIHdyaXRlICovCgkgICAgICAgYnJlYWs7CgkgICAgfQoJIH0KICAgICAgfSBlbHNlIGlmICggIChjb3VudCAmJiAoZm9ybWF0W2lucG9zXSAhPSB0eXBlKSkKCQkgICB8fCBjb3VudCA9PSA0CgkJICAgfHwgKGNvdW50ID09IDIgJiYgc3RyY2hyKCJnaEhtc3QiLCB0eXBlKSkgKQogICAgICAgewoJICAgIGlmICAgICAgICAgKHR5cGUgPT0gJ2QnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSA0KSB7CgkJICBHZXRMb2NhbGVJbmZvMzJBKGxvY2FsZSwKCQkJCSAgIExPQ0FMRV9TREFZTkFNRTEKCQkJCSAgICsgeHRpbWUtPndEYXlPZldlZWsgLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkJCSAgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLCAKCQkJCQkgICAgTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSAKCQkJCQkgICAgKyB4dGltZS0+d0RheU9mV2VlayAtIDEsCgkJCQkJICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJCSAgICAgIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0RheSk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnTScpIHsKCSAgICAgICBpZiAoY291bnQgPT0gMykgewoJCSAgR2V0TG9jYWxlSW5mbzMyQShsb2NhbGUsIAoJCQkJICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxCgkJCQkgICArIHh0aW1lLT53TW9udGggLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSA0KSB7CgkJICBHZXRMb2NhbGVJbmZvMzJBKGxvY2FsZSwKCQkJCSAgIExPQ0FMRV9TTU9OVEhOQU1FMQoJCQkJICAgKyB4dGltZS0+d01vbnRoIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJCSB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndNb250aCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAneScpIHsKCSAgICAgICBpZiAoY291bnQgPT0gNCkgewoJCSAgICAgIHNwcmludGYoYnVmLCAiJWQiLCB4dGltZS0+d1llYXIpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJCSAgc3RyY3B5KGJ1ZiwgInl5eSIpOwoJCSAgV0FSTihvbGUsICJ1bmtub3duIGZvcm1hdCwgYz0lYywgbj0lZFxuIiwgIHR5cGUsIGNvdW50KTsKCQkgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53WWVhciAlIDEwMCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnZycpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDIpIHsKCQkgIEZJWE1FKG9sZSwgIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wLlxuIik7CgkJICBzdHJjcHkoYnVmLCAiQUQiKTsKCSAgICB9IGVsc2UgewoJCSAgc3RyY3B5KGJ1ZiwgImciKTsKCQkgIFdBUk4ob2xlLCAidW5rbm93biBmb3JtYXQsIGM9JWMsIG49JWRcbiIsIHR5cGUsIGNvdW50KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdoJykgewoJICAgICAgIC8qIGdpdmVzIHVzIGhvdXJzIDE6MDAgLS0gMTI6MDAgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ0gnKSB7CgkgICAgICAgLyogMjQtaG91ciB0aW1lICovCgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndIb3VyKTsKCSAgICB9IGVsc2UgaWYgKCB0eXBlID09ICdtJykgewoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53TWludXRlKTsKCSAgICB9IGVsc2UgaWYgKCB0eXBlID09ICdzJykgewoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53U2Vjb25kKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSAxKSB7CgkJICBzcHJpbnRmKGJ1ZiwgIiVjIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICdBJyA6ICdQJyk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAyKSB7CgkJICAvKiBzcHJpbnRmKGJ1ZiwgIiVzIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICJBTSIgOiAiUE0iKTsgKi8KCQkgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLAoJCQkJICAgKHh0aW1lLT53SG91cjwxMikgCgkJCQkgICA/IExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0KCSAgICB9OwoKCSAgICAvKiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBuZXh0IGNoYXIgaW4gdGhlIGZvcm1hdCBzdHJpbmcgCgkgICAgICAgYWdhaW4sIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkICovCgkgICAgaW5wb3MtLTsKCSAgICAKCSAgICAvKiBhZGQgdGhlIGNvbnRlbnRzIG9mIGJ1ZiB0byB0aGUgb3V0cHV0ICovCgkgICAgYnVmbGVuID0gc3RybGVuKGJ1Zik7CgkgICAgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IGRhdGVsZW4pIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOyAvKiBmb3Igc3RyY2F0IHRvIGhvb2sgb250byAqLwoJCSBzdHJjYXQoZGF0ZSwgYnVmKTsKCSAgICAgICBvdXRwb3MgKz0gYnVmbGVuOwoJICAgIH0gZWxzZSB7CgkgICAgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICAgICBzdHJuY2F0KGRhdGUsIGJ1ZiwgZGF0ZWxlbiAtIG91dHBvcyk7CgkJIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKCQkgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICAgIFdBUk4ob2xlLCAiaW5zdWZmaWNpZW50IGJ1ZmZlclxuIik7CgkJIHJldHVybiAwOwoJICAgIH0KCgkgICAgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhpcyBpdGVtICovCgkgICAgY291bnQgPSAwOwoJICAgIHR5cGUgPSAnXDAnOwoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgLyogd2UgY2FuJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIGxvb3AtaGVhZCwgYmVjYXVzZQoJICAgICAgIHRoYXQgYnJlYWtzIHRoZSBwcmludGluZyBvZiB0aGUgbGFzdCBmb3JtYXQtaXRlbSAqLwoJICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CgkgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAoY291bnQpIHsKCSAgICAvKiBjb250aW51aW5nIGEgY29kZSBmb3IgYW4gaXRlbSAqLwoJICAgIGNvdW50ICs9MTsKCSAgICBjb250aW51ZTsKCSB9IGVsc2UgaWYgKHN0cmNocigiaEhtc3R5TWRnIiwgZm9ybWF0W2lucG9zXSkpIHsKCSAgICB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSAgICBjb3VudCA9IDE7CgkgICAgY29udGludWU7CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpbnF1b3RlID0gMTsKCSAgICBjb250aW51ZTsKICAgICAgIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJIH0KICAgICAgLyogbm93IGRlYWwgd2l0aCBhIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdyAqLwogICAgICBpZiAob3V0cG9zID49IGRhdGVsZW4pIHsKICAgICAgIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgIHJldHVybiAwOwogICAgICB9CiAgIH0KICAgCiAgIGlmIChPdmVyZmxvdykgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgIH07CgogICAvKiBmaW5pc2ggaXQgb2ZmIHdpdGggYSBzdHJpbmcgdGVybWluYXRvciAqLwogICBvdXRwb3MrKzsKICAgLyogc2FuaXR5IGNoZWNrICovCiAgIGlmIChvdXRwb3MgPiBkYXRlbGVuLTEpIG91dHBvcyA9IGRhdGVsZW4tMTsKICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKICAgCiAgIFRSQUNFKG9sZSwgIk9MRV9HZXRGb3JtYXRBIHJldHVybnMgc3RyaW5nICclcycsIGxlbiAlZFxuIiwKCSAgICAgICBkYXRlLCBvdXRwb3MpOwogICByZXR1cm4gb3V0cG9zOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFX0dldEZvcm1hdFcgIFtpbnRlcm5hbF0gIAogKi8KSU5UMzIgV0lOQVBJIE9MRV9HZXRGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBmbGFncywgRFdPUkQgdGZsYWdzLAoJCQkgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICBMUFdTVFIgb3V0cHV0LCBJTlQzMiBvdXRsZW4pCnsKICAgSU5UMzIgICBpbnBvcywgb3V0cG9zOwogICBpbnQgICAgIGNvdW50LCB0eXBlPTAsIGlucXVvdGU7CiAgIGludCAgICAgT3ZlcmZsb3c7IC8qIGxvb3AgY2hlY2sgKi8KICAgaW50IHVzZWRhdGUsIHVzZXRpbWU7CiAgIFdDSEFSICAgYnVmWzQwXTsKICAgaW50ICAgICBidWZsZW49MDsKICAgY2hhciAgICBhYnVmWzQwXTsKICAgV0NIQVIgICBhcmcwW10gPSB7MH0sIGFyZzFbXSA9IHsnJScsJ2QnLDB9OwogICBXQ0hBUiAgIGFyZzJbXSA9IHsnJScsJzAnLCcyJywnZCcsMH07CiAgIFdDSEFSICAqYXJnYXJyW10gPSB7YXJnMCwgYXJnMSwgYXJnMn07CiAgIGludCAgICAgZGF0ZXZhcnM9MCwgdGltZXZhcnM9MDsKCiAgIC8qIG1ha2UgYSBkZWJ1ZyByZXBvcnQgKi8KICAgbHN0cmNweW5XdG9BKGFidWYsIGZvcm1hdCwgc2l6ZW9mKGZvcm1hdCkpOwogICBUUkFDRShvbGUsICJhcmdzOiAweCVseCwgMHglbHgsIDB4JWx4LCB0aW1lKGQ9JWQsaD0lZCxtPSVkLHM9JWQpLCBmbXQ6XCclc1wnIChhdCAlcCksICVwIHdpdGggbWF4IGxlbiAlZFxuIiwKCSBsb2NhbGUsIGZsYWdzLCB0ZmxhZ3MsCgkgeHRpbWUtPndEYXksIHh0aW1lLT53SG91ciwgeHRpbWUtPndNaW51dGUsIHh0aW1lLT53U2Vjb25kLAoJIGFidWYsIGZvcm1hdCwgb3V0cHV0LCBvdXRsZW4pOwogICAKCiAgIC8qIGluaXRpYWxpemUgc3RhdGUgdmFyaWFibGVzICovCiAgIGlucG9zID0gb3V0cG9zID0gMDsKICAgY291bnQgPSAwOwogICBpbnF1b3RlID0gT3ZlcmZsb3cgPSAwOwogICAvKiB0aGlzIGlzIHJlYWxseSBqdXN0IGEgc2FuaXR5IGNoZWNrICovCiAgIG91dHB1dFswXSA9IGJ1ZlswXSA9IDA7CiAgIGFidWZbMF0gPSAnXDAnOwogICAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9mZmljaWFsIFdpbmRvd3MgYmVoYXZpb3IgKi8KICAgdXNlZGF0ZSA9IGZsYWdzICYgREFURV9EQVRFVkFSU09OTFk7CiAgIHVzZXRpbWUgPSBmbGFncyAmIFRJTUVfVElNRVZBUlNPTkxZOwogICAKICAgLyogdGhpcyBsb29wIGlzIHRoZSBjb3JlIG9mIHRoZSBmdW5jdGlvbiAqLwogICBmb3IgKGlucG9zID0gMDsgLyogd2UgaGF2ZSBzZXZlcmFsIGJyZWFrIHBvaW50cyAqLyA7IGlucG9zKyspIHsKICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAoV0NIQVIpICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcysrOwoJICAgICAgIG91dHB1dFtvdXRwb3MrK10gPSAnXCcnOwoJICAgIH0gZWxzZSB7CgkgICAgICAgaW5xdW90ZSA9IDA7CgkgICAgICAgY29udGludWU7CgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgICAgb3V0cHV0W291dHBvcysrXSA9IDA7CgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAgLyogIG5vcm1hbCBleGl0ICh3aXRoaW4gYSBxdW90ZSkgKi8KCSB9IGVsc2UgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOyAvKiBjb3B5IGlucHV0ICovCgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgewoJICAgICAgIE92ZXJmbG93ID0gMTsKCSAgICAgICBvdXRwdXRbb3V0cG9zLTFdID0gMDsgCgkgICAgICAgYnJlYWs7CgkgICAgfQoJIH0KICAgICAgfSBlbHNlIGlmICggIChjb3VudCAmJiAoZm9ybWF0W2lucG9zXSAhPSB0eXBlKSkKCQkgICB8fCAoIChjb3VudD09NCAmJiB0eXBlID09J3knKSB8fAoJCQkoY291bnQ9PTQgJiYgdHlwZSA9PSdNJykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nZCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J2cnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdoJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nSCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J20nKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdzJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ndCcpICkgICkgewoJIGlmICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwKCQkJICAgICBMT0NBTEVfU0RBWU5BTUUxICsgeHRpbWUtPndEYXlPZldlZWsgLTEsCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mbzMyVyhsb2NhbGUsCgkJCQlMT0NBTEVfU0FCQlJFVkRBWU5BTUUxICsKCQkJCXh0aW1lLT53RGF5T2ZXZWVrIC0xLAoJCQkJYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGYzMlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d0RheSApOwoJICAgIH07CgkgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIEdldExvY2FsZUluZm8zMlcobG9jYWxlLCAgTE9DQUxFX1NNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGYzMlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIHdzbnByaW50ZjMyVyhidWYsIDYsIGFyZ2FyclsxXSAvKiAiJWQiICovLAoJCQkgeHRpbWUtPndZZWFyKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBsc3RyY3B5bkF0b1coYnVmLCAieXl5IiwgNSk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGYzMlcoYnVmLCA2LCBhcmdhcnJbY291bnRdLAoJCQkgICAgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJICAgICAgIEZJWE1FKG9sZSwgIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wbGVtZW50ZWRcbiIpOwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJBRCIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgLyogV2luIEFQSSBzZXogd2UgY29weSBpdCB2ZXJiYXRpbSAqLwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJnIiwgNSk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAvKiBob3VycyAxOjAwLTEyOjAwIC0tLSBpcyB0aGlzIHJpZ2h0PyAqLwoJICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIAoJCQkgKHh0aW1lLT53SG91ci0xKSUxMiArMSk7CgkgfSBlbHNlIGlmICh0eXBlID09ICdIJykgewoJICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIAoJCQkgeHRpbWUtPndIb3VyKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ20nICkgewoJICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sCgkJCSB4dGltZS0+d01pbnV0ZSk7CgkgfSBlbHNlIGlmICh0eXBlID09ICdzJyApIHsKCSAgICB3c25wcmludGYzMlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLAoJCQkgeHRpbWUtPndTZWNvbmQpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAndCcpIHsKCSAgICBHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwgKHh0aW1lLT53SG91ciA8IDEyKSA/CgkJCSAgICAgTE9DQUxFX1MxMTU5IDogTE9DQUxFX1MyMzU5LAoJCQkgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikgKTsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDEpIHsKCSAgICAgICBidWZbMV0gPSAwOwoJICAgIH0KfQoKCSAvKiBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCwgIHdlIG5lZWQgdG8gY2hlY2sgdGhpcyBuZXh0IAoJICAgIGNoYXJhY3RlciB0aGUgbmV4dCB0aW1lIHdlIGxvb3AgdGhyb3VnaCAqLwoJIGlucG9zLS07CgoJIC8qIGNhdCBidWYgb250byB0aGUgb3V0cHV0ICovCgkgb3V0bGVuID0gbHN0cmxlbjMyVyhidWYpOwoJIGlmIChvdXRwb3MgKyBidWZsZW4gPCBvdXRsZW4pIHsKCSAgICBvdXRwdXRbb3V0cG9zXSA9IDA7ICAvKiBhICJob29rIiBmb3Igc3RyY2F0ICovCgkgICAgbHN0cmNhdDMyVyhvdXRwdXQsIGJ1Zik7CgkgICAgb3V0cG9zICs9IGJ1ZmxlbjsKCSB9IGVsc2UgewoJICAgIG91dHB1dFtvdXRwb3NdID0gMDsKCSAgICBsc3RyY2F0bjMyVyhvdXRwdXQsIGJ1Ziwgb3V0bGVuIC0gb3V0cG9zKTsKCSAgICBvdXRwdXRbb3V0bGVuIC0gMV0gPSAwOwoJICAgIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsgLyogQWJub3JtYWwgZXhpdCAqLwoJIH0KCgkgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRoaXMgdGltZSAqLwoJIGNvdW50ID0gMDsKCSB0eXBlID0gJ1wwJzsKICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09IDApIHsKCSAvKiB3ZSBjYW4ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgYmVnaW5uaW5nLCAgYmVjYXVzZSB0aGF0IAoJIHdvdWxkIGtlZXAgdXMgZnJvbSBwcmludGluZyBhIGZvcm1hdCBzcGVjIHRoYXQgZW5kZWQgdGhlIAoJIHN0cmluZyAqLwoJIG91dHB1dFtvdXRwb3NdID0gMDsKCSBicmVhazsgIC8qICBOT1JNQUwgRVhJVCAgKi8KICAgICAgfSBlbHNlIGlmIChjb3VudCkgewoJIC8qIGhvdyB3ZSBrZWVwIHRyYWNrIG9mIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXQgc3BlYyAqLwoJIGNvdW50Kys7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoIChkYXRldmFycyAmJiAoZm9ybWF0W2lucG9zXT09J2QnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nTScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd5JyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J2cnKSAgKSB8fAoJCSAgKHRpbWV2YXJzICYmIChmb3JtYXRbaW5wb3NdPT0nSCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdoJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J20nIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0ncycgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd0JykgKSAgICApIHsKCSB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSBjb3VudCA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgaW5xdW90ZSA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSB7CgkgLyogdW5xdW90ZWQgbGl0ZXJhbHMgKi8KCSBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKICAgICAgfQogICB9CgogICBpZiAoT3ZlcmZsb3cpIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICBXQVJOKG9sZSwgIiBidWZmZXIgb3ZlcmZsb3dcbiIpOwogICB9OwoKICAgLyogZmluYWwgc3RyaW5nIHRlcm1pbmF0b3IgYW5kIHNhbml0eSBjaGVjayAqLwogICBvdXRwb3MrKzsKICAgaWYgKG91dHBvcyA+IG91dGxlbi0xKSBvdXRwb3MgPSBvdXRsZW4tMTsKICAgb3V0cHV0W291dHBvc10gPSAnMCc7CgogICBsc3RyY3B5bld0b0EoYWJ1Ziwgb3V0cHV0LCBzaXplb2YoYWJ1ZikgKTsKICAgVFJBQ0Uob2xlLCAiIHJldHVybmluZyBzdHJpbmcgXCclc1wnXG4iLCBhYnVmKTsKCQogICByZXR1cm4gKCFPdmVyZmxvdykgPyBvdXRsZW4gOiAwOwogICAKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgR2V0RGF0ZUZvcm1hdDMyQSgpIFtLRVJORUwzMi4zMTBdIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgZGF0ZQogKgogKiBUaGlzIGZ1bmN0aW9uIHVzZXMgZm9ybWF0IHRvIGZvcm1hdCB0aGUgZGF0ZSwgIG9yLCAgaWYgZm9ybWF0CiAqIGlzIE5VTEwsIHVzZXMgdGhlIGRlZmF1bHQgZm9yIHRoZSBsb2NhbGUuICBmb3JtYXQgaXMgYSBzdHJpbmcKICogb2YgbGl0ZXJhbCBmaWVsZHMgYW5kIGNoYXJhY3RlcnMgYXMgZm9sbG93czoKICoKICogLSBkICAgIHNpbmdsZS1kaWdpdCAobm8gbGVhZGluZyB6ZXJvKSBkYXkgKG9mIG1vbnRoKQogKiAtIGRkICAgdHdvLWRpZ2l0IGRheSAob2YgbW9udGgpCiAqIC0gZGRkICBzaG9ydCBkYXktb2Ytd2VlayBuYW1lCiAqIC0gZGRkZCBsb25nIGRheS1vZi13ZWVrIG5hbWUKICogLSBNICAgIHNpbmdsZS1kaWdpdCBtb250aAogKiAtIE1NICAgdHdvLWRpZ2l0IG1vbnRoCiAqIC0gTU1NICBzaG9ydCBtb250aCBuYW1lCiAqIC0gTU1NTSBmdWxsIG1vbnRoIG5hbWUKICogLSB5ICAgIHR3by1kaWdpdCB5ZWFyLCBubyBsZWFkaW5nIDAKICogLSB5eSAgIHR3by1kaWdpdCB5ZWFyCiAqIC0geXl5eSBmb3VyLWRpZ2l0IHllYXIKICogLSBnZyAgIGVyYSBzdHJpbmcKICoKICovCgpJTlQzMiBXSU5BUEkgR2V0RGF0ZUZvcm1hdDMyQShMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKCQkJICAgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgICBMUENTVFIgZm9ybWF0LCBMUFNUUiBkYXRlLElOVDMyIGRhdGVsZW4pIAp7CiAgIAogIGNoYXIgZm9ybWF0X2J1Zls0MF07CiAgTFBDU1RSIHRoaXNmb3JtYXQ7CiAgU1lTVEVNVElNRSB0OwogIExQU1lTVEVNVElNRSB0aGlzdGltZTsKICBMQ0lEIHRoaXNsb2NhbGU7CgogIElOVDMyIHJldDsKCiAgVFJBQ0Uob2xlLCIoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIiwKCSAgICAgIGxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsZGF0ZSxkYXRlbGVuKTsKICAKICBpZiAoIWxvY2FsZSkgewogICAgIGxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKICAgICB9OwogIAogIGlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgfSBlbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkgewogICAgIHRoaXNsb2NhbGUgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgewogICAgIHRoaXNsb2NhbGUgPSBsb2NhbGU7CiAgIH07CgogIGlmICh4dGltZSA9PSBOVUxMKSB7CiAgICAgR2V0U3lzdGVtVGltZSgmdCk7CiAgICAgdGhpc3RpbWUgPSAmdDsKICB9IGVsc2UgewogICAgIHRoaXN0aW1lID0geHRpbWU7CiAgfTsKCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CiAgICAgR2V0TG9jYWxlSW5mbzMyQSh0aGlzbG9jYWxlLCAoKGZsYWdzJkRBVEVfTE9OR0RBVEUpIAoJCQkJICAgPyBMT0NBTEVfU0xPTkdEQVRFCgkJCQkgICA6IExPQ0FMRV9TU0hPUlREQVRFKSwKCQkgICAgICBmb3JtYXRfYnVmLCBzaXplb2YoZm9ybWF0X2J1ZikpOwogICAgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwogIH0gZWxzZSB7CiAgICAgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKICB9OwoKICAKICByZXQgPSBPTEVfR2V0Rm9ybWF0QSh0aGlzbG9jYWxlLCBmbGFncywgMCwgdGhpc3RpbWUsIHRoaXNmb3JtYXQsIAoJCSAgICAgICBkYXRlLCBkYXRlbGVuKTsKICAKCiAgIFRSQUNFKG9sZSwgCgkgICAgICAgIkdldERhdGVGb3JtYXQzMkEoKSByZXR1cm5pbmcgJWQsIHdpdGggZGF0YT0lc1xuIiwKCSAgICAgICByZXQsIGRhdGUpOwogIHJldHVybiByZXQ7Cn0KCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogR2V0RGF0ZUZvcm1hdDMyVygpIFtLRVJORUwzMi4zMTFdIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogQWN0cyB0aGUgc2FtZSBhcyBHZXREYXRlRm9ybWF0MzJBKCksICBleGNlcHQgdGhhdCBpdCdzIFVuaWNvZGUuCiAqIEFjY2VwdHMgJiByZXR1cm5zIHNpemVzIGFzIGNvdW50cyBvZiBVbmljb2RlIGNoYXJhY3RlcnMuCiAqCiAqLwpJTlQzMiBXSU5BUEkgR2V0RGF0ZUZvcm1hdDMyVyhMQ0lEIGxvY2FsZSxEV09SRCBmbGFncywKCQkJICAgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgICBMUENXU1RSIGZvcm1hdCwKCQkJICAgICAgTFBXU1RSIGRhdGUsIElOVDMyIGRhdGVsZW4pCnsKICAgc2hvcnQgZGF0ZWFycltdID0geycxJywnOScsJzknLCc0JywnLScsJzEnLCctJywnMScsMH07CgogICBGSVhNRShvbGUsICJTVFVCIChzaG91bGQgY2FsbCBPTEVfR2V0Rm9ybWF0VylcbiIpOyAgIAogICBsc3RyY3B5bjMyVyhkYXRlLCBkYXRlYXJyLCBkYXRlbGVuKTsKICAgcmV0dXJuICggIGRhdGVsZW4gPCA5KSA/IGRhdGVsZW4gOiA5OwogICAKICAgCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzMzJBCShLRVJORUwzMi4xOTgpCiAqLwpCT09MMzIgV0lOQVBJIEVudW1EYXRlRm9ybWF0czMyQSgKICBEQVRFRk1UX0VOVU1QUk9DMzJBIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRShvbGUsICJPbmx5IFVTIEVuZ2xpc2ggc3VwcG9ydGVkXG4iKTsKCiAgaWYoIWxwRGF0ZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZC95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTS9kZC95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU0vZGQveXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXkvTU0vZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NTS15eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBNTU1NIGRkLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIGRkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRShvbGUsICJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0czMyVwkoS0VSTkVMMzIuMTk5KQogKi8KQk9PTDMyIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHMzMlcoCiAgREFURUZNVF9FTlVNUFJPQzMyVyBscERhdGVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRShvbGUsICIoJXAsICVsZCwgJWxkKTogc3R1YlxuIiwgbHBEYXRlRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzMzJBCShLRVJORUwzMi4yMTApCiAqLwpCT09MMzIgV0lOQVBJIEVudW1UaW1lRm9ybWF0czMyQSgKICBUSU1FRk1UX0VOVU1QUk9DMzJBIGxwVGltZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKG9sZSwgIk9ubHkgVVMgRW5nbGlzaCBzdXBwb3J0ZWRcbiIpOwoKICBpZighbHBUaW1lRm10RW51bVByb2MpCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgaWYoZHdGbGFncykKICAgIHsKICAgICAgRklYTUUob2xlLCAiVW5rbm93biB0aW1lIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAogICAgfQogIAogIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImhoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwoKICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHMzMlcJKEtFUk5FTDMyLjIxMSkKICovCkJPT0wzMiBXSU5BUEkgRW51bVRpbWVGb3JtYXRzMzJXKAogIFRJTUVGTVRfRU5VTVBST0MzMlcgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUUob2xlLCAiKCVwLCVsZCwlbGQpOiBzdHViIiwgbHBUaW1lRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0MzJBCShLRVJORUwzMi4zNTUpCiAqIE5PVEU6IHR5cGUgb2YgbHBGb3JtYXQgc2hvdWxkIGJlIENPTlNUIE5VTUJFUkZPUk1BVCAKICovCklOVDMyIFdJTkFQSSBHZXROdW1iZXJGb3JtYXQzMkEoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENTVFIgbHB2YWx1ZSwgIGNoYXIgKmxwRm9ybWF0LAoJCQkgICAgICAgTFBTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCnsKIGludCBuOwoKIEZJWE1FKGZpbGUsIiVzOiBzdHViLCBubyByZWZvcm1hdGluZyBkb25lXG4iLGxwdmFsdWUpOwoKIG4gPSBzdHJsZW4obHB2YWx1ZSk7CiBpZiAoY2NoTnVtYmVyKSB7IAogICBzdHJuY3B5KGxwTnVtYmVyU3RyLGxwdmFsdWUsY2NoTnVtYmVyKTsKICAgaWYgKGNjaE51bWJlciA8PSBuKSB7CiAgICAgbHBOdW1iZXJTdHJbY2NoTnVtYmVyLTFdID0gMDsKICAgICBuID0gY2NoTnVtYmVyLTE7CiAgIH0KIH0KIHJldHVybiBuOwp9CiAKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogR2V0VGltZUZvcm1hdDMyQSgpIFtLRVJORUwzMi40MjJdIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgdGltZQogKgogKiBGb3JtYXRzIGRhdGUgYWNjb3JkaW5nIHRvIGZvcm1hdCwgIG9yIGxvY2FsZSBkZWZhdWx0IGlmIGZvcm1hdCBpcwogKiBOVUxMLiBUaGUgZm9ybWF0IGNvbnNpc3RzIG9mIGxpdGVyYWwgY2hhcmFjdGVycyBhbmQgZmllbGRzIGFzIGZvbGxvd3M6CiAqCiAqIGggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogKiBoaCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBIICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICogSEggaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogbSAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBtbSBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHMgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICogc3Mgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiB0ICB0aW1lIG1hcmtlciAoQSBvciBQKQogKiB0dCB0aW1lIG1hcmtlciAoQU0sIFBNKQogKgogKi8KCklOVDMyIFdJTkFQSSAKR2V0VGltZUZvcm1hdDMyQShMQ0lEIGxvY2FsZSwgICAgICAgIC8qIGluICAqLwoJCSBEV09SRCBmbGFncywgICAgICAgIC8qIGluICAqLwoJCSBMUFNZU1RFTVRJTUUgeHRpbWUsIC8qIGluICAqLyAKCQkgTFBDU1RSIGZvcm1hdCwgICAgICAvKiBpbiAgKi8KCQkgTFBTVFIgdGltZXN0ciwgICAgICAvKiBvdXQgKi8KCQkgSU5UMzIgdGltZWxlbiAgICAgICAvKiBpbiAgKi8pIAp7IGNoYXIgZm9ybWF0X2J1Zls0MF07CiAgTFBDU1RSIHRoaXNmb3JtYXQ7CiAgU1lTVEVNVElNRSB0OwogIExQU1lTVEVNVElNRSB0aGlzdGltZTsKICBMQ0lEIHRoaXNsb2NhbGU9MDsKICBEV09SRCB0aGlzZmxhZ3M9TE9DQUxFX1NUSU1FRk9STUFUOyAvKiBzdGFuZGFydCB0aW1lZm9ybWF0ICovOwogIAogIFRSQUNFKG9sZSwiR2V0VGltZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLGxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsdGltZXN0cix0aW1lbGVuKTsKCiAgaWYgKCFsb2NhbGUpIAogIHsgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwogIH0KICAKICBpZiAobG9jYWxlID09IExPQ0FMRV9TWVNURU1fREVGQVVMVCkgCiAgeyB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICB9IAogIGVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSAKICB7IHRoaXNsb2NhbGUgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKICB9CiAgZWxzZQogIHsgdGhpc2xvY2FsZSA9IGxvY2FsZTsKICB9CgogIGlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCiAgeyBGSVhNRShvbGUsIlRJTUVfTk9USU1FTUFSS0VSIG9yIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQgbm90IGltcGxlbWVudGVkXG4iKTsKICB9CiAgZmxhZ3MgJj0gKFRJTUVfTk9TRUNPTkRTIHwgVElNRV9OT01JTlVURVNPUlNFQ09ORFMpOyAvKiBtYXNrIGZvciBPTEVfR2V0Rm9ybWF0QSovCgogIGlmIChmb3JtYXQgPT0gTlVMTCkgCiAgeyBpZiAoZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpICAvKnVzZSBzeXN0ZW0gZGVmYXVsdCovCiAgICB7IHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICAgfQogICAgR2V0TG9jYWxlSW5mbzMyQSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9CiAgZWxzZSAKICB7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfQogIAogIGlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KICB7IEdldFN5c3RlbVRpbWUoJnQpOwogICAgdGhpc3RpbWUgPSAmdDsKICB9IAogIGVsc2UKICB7IHRoaXN0aW1lID0geHRpbWU7CiAgfQogIHJldHVybiBPTEVfR2V0Rm9ybWF0QSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZsYWdzLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwgdGltZXN0ciwgdGltZWxlbik7Cn0KCgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBHZXRUaW1lRm9ybWF0MzJXKCkgIFtLRVJORUwzMi40MjNdIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIHRpbWUKICogCiAqCiAqLwoKSU5UMzIgV0lOQVBJIApHZXRUaW1lRm9ybWF0MzJXKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICAgIExQQ1dTVFIgZm9ybWF0LCAKCQkJICAgICAgTFBXU1RSIHRpbWVzdHIsSU5UMzIgdGltZWxlbikgCnsKICAgY2hhciBkZWJ1Z2J1Zls0MF07CiAgIFdDSEFSIGJ1ZlsyMF07CiAgIExQQ1dTVFIgcmVhbGZvcm1hdD0wOwogICBTWVNURU1USU1FIHQ7CiAgIExQU1lTVEVNVElNRSByZWFsdGltZTsKICAgV0NIQVIgKiBmbXRfYnVmID0gTlVMTDsKICAgaW50IGZtdF9idWZfc2l6ZSA9IDA7IC8qIHVuaXRzIG9mIFdDSEFScyAqLwogICBJTlQzMiByZXR2YWw7CiAgIAogICBsc3RyY3B5bld0b0EoZGVidWdidWYsIGZvcm1hdCwgKHNpemVvZihidWYpKS8yKTsKICAgVFJBQ0Uob2xlLCAiR2V0VGltZUZvcm1hdFcgbGVuICVkIGZsYWdzIDB4JWxYIGZvcm1hdCA+JXM8XG4iLAoJCXRpbWVsZW4sIGZsYWdzLCBkZWJ1Z2J1Zik7CgogICAvKiBFbmZvcmNlIHRoZSBXaW5kb3dzIGJlaGF2aW9yICovCiAgIGZsYWdzIHw9IH5MT0NBTEVfVElNRURBVEVCT1RIOwogICBmbGFncyB8PSBUSU1FX1RJTUVWQVJTT05MWTsKCiAgIC8qIHRha2UgY2FyZSBvZiB0aGUgZm9ybWF0IG9yIGxvY2FsZSBub3QgYmVpbmcgZ2l2ZW4gKi8KICAgaWYgKGZvcm1hdCkgewogICAgICByZWFsZm9ybWF0ID0gZm9ybWF0OwogICB9IGVsc2UgaWYgKGxvY2FsZSkgewogICAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KICAgICAgcmV0dmFsID0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUjsKICAgICAgZm10X2J1ZiA9IG1hbGxvYygoZm10X2J1Zl9zaXplKz03KSAqIHNpemVvZihXQ0hBUikpOwogICAgICBpZiAoIWZtdF9idWYpCglnb3RvIG91dF9ub21lbTsKCiAgICAgIHdoaWxlKCFHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwgTE9DQUxFX1NUSU1FRk9STUFULAoJCQkgICAgICBmbXRfYnVmLCBmbXRfYnVmX3NpemUpKSB7CglyZXR2YWwgPSBFUlJPUl9PVVRPRk1FTU9SWTsKCWZtdF9idWYgPSByZWFsbG9jKGZtdF9idWYsIAoJCQkgICAoZm10X2J1Zl9zaXplICs9IDEwKSAqIHNpemVvZihXQ0hBUikpOwoJaWYgKCFmbXRfYnVmKQoJCWdvdG8gb3V0X25vbWVtOwogICAgICB9CiAgICAgIHJlYWxmb3JtYXQgPSBmbXRfYnVmOwogICB9IGVsc2UgewogICAgICBGSVhNRShvbGUsICAiY2FsbGVyIGdhdmUgbm8gbG9jYWxlLCAgbm8gZm9ybWF0OyAgd2hhdCBzaG91bGQgd2UgZG8/XG4iKTsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0JBRF9GT1JNQVQpOwogICB9CiAgIGlmICghbG9jYWxlKQogICAgICBsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoKICAgcmVhbHRpbWUgPSB4dGltZTsKICAgaWYgKCFyZWFsdGltZSkgewogICAgICByZWFsdGltZSA9ICZ0OwogICAgICBHZXRTeXN0ZW1UaW1lKHJlYWx0aW1lKTsKICAgfQoKICAgcmV0dmFsID0gT0xFX0dldEZvcm1hdFcobG9jYWxlLCBmbGFncywgMCwgcmVhbHRpbWUsIHJlYWxmb3JtYXQsIHRpbWVzdHIsICB0aW1lbGVuKTsKICAgaWYgKGZtdF9idWYpCglmcmVlKGZtdF9idWYpOwogICByZXR1cm4gcmV0dmFsOwoKb3V0X25vbWVtOgoJU2V0TGFzdEVycm9yKHJldHZhbCk7CglXQVJOKG9sZSwgImNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBjaGFycyBvZiBtZW1vcnlcbiIsIGZtdF9idWZfc2l6ZSk7IAoJcmV0dXJuIDA7Cn0K