LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAib2xlLmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImRlYnVnLmgiCgovKiBMb2NhbGUgbmFtZSB0byBpZCBtYXAuIHVzZWQgYnkgRW51bVN5c3RlbUxvY2FsZXMsIEdldExvY2FsSW5mb0EgCiAqIE1VU1QgY29udGFpbiBhbGwgI2RlZmluZXMgZnJvbSB3aW5ubHMuaAogKiBsYXN0IGVudHJ5IGhhcyBOVUxMIG5hbWUsIDAgaWQuCiAqLyAKI2RlZmluZSBMT0NBTEVfRU5UUlkoeCkJeyN4LExPQ0FMRV8jI3h9CnN0YXRpYyBzdHJ1Y3QgdGFnTE9DQUxFX05BTUUySUQgewoJY2hhcgkqbmFtZTsKCURXT1JECWlkOwp9IGxvY2FsZV9uYW1lMmlkW109IHsKCUxPQ0FMRV9FTlRSWShJTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0VOR0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoSUNPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTRU5HQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkNUUllOQU1FKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRBTlNJQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKFNMSVNUKSwKCUxPQ0FMRV9FTlRSWShJTUVBU1VSRSksCglMT0NBTEVfRU5UUlkoU0RFQ0lNQUwpLAoJTE9DQUxFX0VOVFJZKFNUSE9VU0FORCksCglMT0NBTEVfRU5UUlkoU0dST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElORUdOVU1CRVIpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVESUdJVFMpLAoJTE9DQUxFX0VOVFJZKFNDVVJSRU5DWSksCglMT0NBTEVfRU5UUlkoU0lOVExTWU1CT0wpLAoJTE9DQUxFX0VOVFJZKFNNT05ERUNJTUFMU0VQKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhPVVNBTkRTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05HUk9VUElORyksCglMT0NBTEVfRU5UUlkoSUNVUlJESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElJTlRMQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUNVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShJTkVHQ1VSUiksCglMT0NBTEVfRU5UUlkoU0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FKSwKCUxPQ0FMRV9FTlRSWShTU0hPUlREQVRFKSwKCUxPQ0FMRV9FTlRSWShTTE9OR0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FRk9STUFUKSwKCUxPQ0FMRV9FTlRSWShJREFURSksCglMT0NBTEVfRU5UUlkoSUxEQVRFKSwKCUxPQ0FMRV9FTlRSWShJVElNRSksCglMT0NBTEVfRU5UUlkoSVRJTUVNQVJLUE9TTiksCglMT0NBTEVfRU5UUlkoSUNFTlRVUlkpLAoJTE9DQUxFX0VOVFJZKElUTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElEQVlMWkVSTyksCglMT0NBTEVfRU5UUlkoSU1PTkxaRVJPKSwKCUxPQ0FMRV9FTlRSWShTMTE1OSksCglMT0NBTEVfRU5UUlkoUzIzNTkpLAoJTE9DQUxFX0VOVFJZKElDQUxFTkRBUlRZUEUpLAoJTE9DQUxFX0VOVFJZKElPUFRJT05BTENBTEVOREFSKSwKCUxPQ0FMRV9FTlRSWShJRklSU1REQVlPRldFRUspLAoJTE9DQUxFX0VOVFJZKElGSVJTVFdFRUtPRllFQVIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMSksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNCksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTgpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU5KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTApLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEyKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU1BPU0lUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoU05FR0FUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoSVBPU1NJR05QT1NOKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElQT1NTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSVBPU1NFUEJZU1BBQ0UpLAoJTE9DQUxFX0VOVFJZKElORUdTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSU5FR1NFUEJZU1BBQ0UpLAovKglMT0NBTEVfRU5UUlkoRk9OVFNJR05BVFVSRSksKi8KCXtOVUxMLDB9LAp9OwoKY29uc3Qgc3RydWN0IG1hcF9sY2lkMnN0ciB7CglMQ0lECQlsYW5naWQ7Cgljb25zdCBjaGFyCSpsYW5nbmFtZTsKfSBsYW5ndWFnZXNbXT17Cgl7MHgwNDAxLCJBcmFiaXNjaCJ9LAoJezB4MDQwMiwiQnVsZ2FyaXNjaCJ9LAoJezB4MDQwMywiS2F0YWxhbmlzY2gifSwKCXsweDA0MDQsIlRyYWRpdGlvbmFsZXMgQ2hpbmVzaXNjaCJ9LAoJezB4MDQwNSwiVHNjaGVjaXNjaCJ9LAoJezB4MDQwNiwiRORuaXNjaCJ9LAoJezB4MDQwNywiRGV1dHNjaCJ9LAoJezB4MDQwOCwiR3JpZWNoaXNjaCJ9LAoJezB4MDQwOSwiQW1lcmlrYW5pc2NoZXMgRW5nbGlzY2gifSwKCXsweDA0MEEsIkthc3RpbGlzY2hlcyBTcGFuaXNjaCJ9LAoJezB4MDQwQiwiRmlubmlzY2gifSwKCXsweDA0MEMsIkZyYW56dnNpc2NoIn0sCgl7MHgwNDBELCJIZWJyZGlzY2gifSwKCXsweDA0MEUsIlVuZ2FyaXNjaCJ9LAoJezB4MDQwRiwiSXNsZG5kaXNjaCJ9LAoJezB4MDQxMCwiSXRhbGllbmlzY2gifSwKCXsweDA0MTEsIkphcGFuaXNjaCJ9LAoJezB4MDQxMiwiS29yZWFuaXNjaCJ9LAoJezB4MDQxMywiTmllZGVybGRuZGlzY2gifSwKCXsweDA0MTQsIk5vcndlZ2lzY2gtQm9rbWFsIn0sCgl7MHgwNDE1LCJQb2xuaXNjaCJ9LAoJezB4MDQxNiwiQnJhc2lsaWFuaXNjaGVzIFBvcnR1Z2llc2lzY2gifSwKCXsweDA0MTcsIlJkdG9yb21hbmlzY2gifSwKCXsweDA0MTgsIlJ1bWRuaXNjaCJ9LAoJezB4MDQxOSwiUnVzc2lzY2gifSwKCXsweDA0MUEsIktyb2F0b3NlcmJpc2NoIChsYXRlaW5pc2NoKSJ9LAoJezB4MDQxQiwiU2xvd2VuaXNjaCJ9LAoJezB4MDQxQywiQWxiYW5pc2NoIn0sCgl7MHgwNDFELCJTY2h3ZWRpc2NoIn0sCgl7MHgwNDFFLCJUaGFpIn0sCgl7MHgwNDFGLCJUfHJraXNjaCJ9LAoJezB4MDQyMCwiVXJkdSJ9LAoJezB4MDQyMSwiQmFoYXNhIn0sCgl7MHgwODA0LCJWZXJlaW5mYWNodGVzIENoaW5lc2lzY2gifSwKCXsweDA4MDcsIlNjaHdlaXplcmRldXRzY2gifSwKCXsweDA4MDksIkJyaXRpc2NoZXMgRW5nbGlzY2gifSwKCXsweDA4MEEsIk1leGlrYW5pc2NoZXMgU3BhbmlzY2gifSwKCXsweDA4MEMsIkJlbGdpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDA4MTAsIlNjaHdlaXplcmlzY2hlcyBJdGFsaWVuaXNjaCJ9LAoJezB4MDgxMywiQmVsZ2lzY2hlcyBOaWVkZXJsZG5kaXNjaCJ9LAoJezB4MDgxNCwiTm9yZ3dlZ2lzY2gtTnlub3JzayJ9LAoJezB4MDgxNiwiUG9ydHVnaWVzaXNjaCJ9LAoJezB4MDgxQSwiU2VyYm9rcmF0aXNjaCAoa3lyaWxsaXNjaCkifSwKCXsweDBDMUMsIkthbmFkaXNjaGVzIEZyYW56dnNpc2NoIn0sCgl7MHgxMDBDLCJTY2h3ZWl6ZXJpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDAwMDAsIlVuYmVrYW5udCJ9LAp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRVc2VyRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMSkKICovCkxDSUQgV0lOQVBJIEdldFVzZXJEZWZhdWx0TENJRCgpCnsKLyogRGVmYXVsdCBzb3J0aW5nLCBuZXV0cmFsIHN1Ymxhbmd1YWdlICovCiAgICBzd2l0Y2goT3B0aW9ucy5sYW5ndWFnZSkKICAgIHsKIC8qIGNhc2UgTEFOR19CdTogcmV0dXJuIDB4MDI7ICovICAgICAgLyogQnVsZ2FyaWFuICovCiAvKiBjYXNlIExBTkdfQ2g6IHJldHVybiAweDA0OyAqLyAgICAgIC8qIENoaW5lc2UgKi8KICAgIGNhc2UgTEFOR19DejogcmV0dXJuIDB4MDU7ICAgICAgICAgLyogQ3plY2ggKi8KICAgIGNhc2UgTEFOR19EYTogcmV0dXJuIDB4MDY7ICAgICAgICAgLyogRGFuaXNoICovCiAgICBjYXNlIExBTkdfRGU6IHJldHVybiAweDA3OyAgICAgICAgIC8qIEdlcm1hbiAqLwogLyogY2FzZSBMQU5HX0dyOiByZXR1cm4gMHgwODsgKi8gICAgICAvKiBHcmVlayAqLwogICAgY2FzZSBMQU5HX0VuOiByZXR1cm4gMHgwOTsgICAgICAgICAvKiBFbmdsaXNoICovCiAgICBjYXNlIExBTkdfRXM6IHJldHVybiAweDBhOyAgICAgICAgIC8qIFNwYW5pc2ggKi8KICAgIGNhc2UgTEFOR19GaTogcmV0dXJuIDB4MGI7ICAgICAgICAgLyogRmlubmlzaCAqLwogICAgY2FzZSBMQU5HX0ZyOiByZXR1cm4gMHgwYzsgICAgICAgICAvKiBGcmVuY2ggKi8KICAgIGNhc2UgTEFOR19IdTogcmV0dXJuIDB4MGU7ICAgICAgICAgLyogSHVuZ2FyaWFuICovCiAvKiBjYXNlIExBTkdfSWM6IHJldHVybiAweDBmOyAqLyAgICAgIC8qIEljZWxhbmRpYyAqLwogICAgY2FzZSBMQU5HX0l0OiByZXR1cm4gMHgxMDsgICAgICAgICAvKiBJdGFsaWFuICovCiAvKiBjYXNlIExBTkdfSnA6IHJldHVybiAweDExOyAqLyAgICAgIC8qIEphcGFuZXNlICovCiAgICBjYXNlIExBTkdfS286IHJldHVybiAweDEyOyAgICAgICAgIC8qIEtvcmVhbiAqLwogLyogY2FzZSBMQU5HX0R1OiByZXR1cm4gMHgxMzsgKi8gICAgICAvKiBEdXRjaCAqLwogICAgY2FzZSBMQU5HX05vOiByZXR1cm4gMHgxNDsgICAgICAgICAvKiBOb3J3ZWdpYW4gKi8KICAgIGNhc2UgTEFOR19QbDogcmV0dXJuIDB4MTU7ICAgICAgICAgLyogUG9saXNoICovCiAgICBjYXNlIExBTkdfUG86IHJldHVybiAweDE2OyAgICAgICAgIC8qIFBvcnR1Z3Vlc2UgKi8KIC8qIGNhc2UgTEFOR19SbzogcmV0dXJuIDB4MTg7ICovICAgICAgLyogUm9tYW5pYW4gKi8KIC8qIGNhc2UgTEFOR19SdTogcmV0dXJuIDB4MTk7ICovICAgICAgLyogUnVzc2lhbiAqLwogLyogY2FzZSBMQU5HX0NyOiByZXR1cm4gMHgxYTsgKi8gICAgICAvKiBDcm9hdGlhbiAqLwogLyogY2FzZSBMQU5HX1NsOiByZXR1cm4gMHgxYjsgKi8gICAgICAvKiBTbG92YWsgKi8KICAgIGNhc2UgTEFOR19TdzogcmV0dXJuIDB4MWQ7ICAgICAgICAgLyogU3dlZGlzaCAqLwogLyogY2FzZSBMQU5HX1R1OiByZXR1cm4gMHgxZjsgKi8gICAgICAvKiBUdXJraXNoICovCiAvKiBjYXNlIExBTkdfU3Y6IHJldHVybiAweDI0OyAqLyAgICAgIC8qIFNsb3ZlbmlhbiAqLwogICAgY2FzZSBMQU5HX0VvOiByZXR1cm4gMHgyNTsgICAgICAgICAvKiBFc3BlcmFudG8gKG5vdCBvZmZpY2lhbCkgKi8KICAgIGNhc2UgTEFOR19DYTogcmV0dXJuIDB4MjY7ICAgICAgICAgLyogQ2F0YWxhbiAqLwoKICAgIGRlZmF1bHQ6CglyZXR1cm4gMHgwMDsgICAgICAgICAgICAgICAgICAgLyogTmV1dHJhbCBsYW5ndWFnZSAqLwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TENJRCAgICAgICAoT0xFMk5MUy4yKQogKi8KTENJRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExDSUQoKQp7CglyZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFVzZXJEZWZhdWx0TGFuZ0lEICAgICAgIChPTEUyTkxTLjMpCiAqLwpMQU5HSUQgV0lOQVBJIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIDB4NDAwfChXT1JEKUdldFVzZXJEZWZhdWx0TENJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEICAgICAoT0xFMk5MUy40KQogKi8KTEFOR0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIDB4NDAwfEdldFVzZXJEZWZhdWx0TGFuZ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldExvY2FsZUluZm9BICAgICAgICAgICAgIChPTEUyTkxTLjUpCiAqIElzIHRoZSBsYXN0IHBhcmFtZXRlciByZWFsbHkgV09SRCBmb3IgV2luMTY/CiAqLwpJTlQxNiBXSU5BUEkgR2V0TG9jYWxlSW5mbzE2KExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQU1RSIGJ1ZixJTlQxNiBsZW4pCnsKCXJldHVybiBHZXRMb2NhbGVJbmZvMzJBKGxjaWQsTENUeXBlLGJ1ZixsZW4pOwp9CgpJTlQzMiBXSU5BUEkgR2V0TG9jYWxlSW5mbzMyQShMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFNUUiBidWYsSU5UMzIgbGVuKQp7CgljaGFyCSpyZXRTdHJpbmc7CglpbnQJZm91bmQsaTsKCglUUkFDRShvbGUsIigweCVseCwweCVseCwlcCwleClcbiIsCgkJCWxjaWQsTENUeXBlLGJ1ZixsZW4pOwoKCUxDVHlwZSAmPSB+KExPQ0FMRV9OT1VTRVJPVkVSUklERXxMT0NBTEVfVVNFX0NQX0FDUCk7CgoJLyogQXMgYW4gb3B0aW9uLCB3ZSBjb3VsZCBvYnRhaW4gdGhlIHZhbHVlIGZyb20gd2luLmluaS4KCSAgIFRoaXMgd291bGQgbm90IG1hdGNoIHRoZSBXaW5lIGNvbXBpbGUtdGltZSBvcHRpb24uCgkgICBBbHNvLCBub3QgYWxsIGlkZW50aWZpZXJzIGFyZSBhdmFpbGFibGUgZnJvbSB3aW4uaW5pICovCglyZXRTdHJpbmc9MDsKCS8qIElmIHdlIGFyZSB0aHJvdWdoIGFsbCBvZiB0aGlzLCByZXRMZW4gc2hvdWxkIG5vdCBiZSB6ZXJvIGFueW1vcmUuCgkgICBJZiBpdCBpcywgdGhlIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KCWk9MDsKCXdoaWxlIChsb2NhbGVfbmFtZTJpZFtpXS5uYW1lIT1OVUxMKSB7CgkJaWYgKExDVHlwZSA9PSBsb2NhbGVfbmFtZTJpZFtpXS5pZCkgewoJCQlyZXRTdHJpbmcgPSBsb2NhbGVfbmFtZTJpZFtpXS5uYW1lOwoJCQlicmVhazsKCQl9CgkJaSsrOwoJfQoJaWYgKCFyZXRTdHJpbmcpIHsKCQlXQVJOKG9sZSwiVW5rb3duIExDIHR5cGUgJWxYXG4iLExDVHlwZSk7CgkJcmV0dXJuIDA7Cgl9CgojZGVmaW5lIExPQ1ZBTCh0eXBlLHZhbHVlKSBjYXNlIHR5cGU6cmV0U3RyaW5nPXZhbHVlO2JyZWFrOwoKLyogTm93LCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgZGVmaW5pdGlvbnMuIFRoZXkgZG9uJ3QgaGF2ZSB0byBiZQogICBjb21wbGV0ZSAqLwogICAgZm91bmQ9MTsKICAgIHN3aXRjaChPcHRpb25zLmxhbmd1YWdlKQogICAgewogICAgY2FzZSBMQU5HX0RlOgogICAgCXN3aXRjaCAoTENUeXBlKSB7CiNpbmNsdWRlICJubHMvZGV1Lm5scyIKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgIC8qIExBTkcoRGUpICovCgogICAgY2FzZSBMQU5HX0RhOgogICAgCXN3aXRjaCAoTENUeXBlKSB7CiNpbmNsdWRlICJubHMvZG5rLm5scyIKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgLyogTEFORyhEYSkgKi8KCiAgICBjYXNlIExBTkdfRW46CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKI2luY2x1ZGUgIm5scy9lbnUubmxzIgoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAgLyogTEFORyhFbikgKi8KCiAgICBjYXNlIExBTkdfRW86CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKI2luY2x1ZGUgIm5scy9lc3BlcmFudG8ubmxzIgoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAgLyogTEFORyhFbykgKi8KCiAgICBjYXNlIExBTkdfRmk6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKI2luY2x1ZGUgIm5scy9maW4ubmxzIgoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAgLyogTEFORyhGaSkgKi8KCiAgICBjYXNlIExBTkdfSXQ6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKI2luY2x1ZGUgIm5scy9pdGEubmxzIgoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAgLyogTEFORyhJdCkgKi8KCiAgICBjYXNlIDB4MDgwOToKICAgIAlzd2l0Y2ggKExDVHlwZSkgewojaW5jbHVkZSAibmxzL2VuZy5ubHMiCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7IC8qIExBTkcoMHgwODA5KSAoVS5LLiBFbmdsaXNoKSAqLwoKICAgIGNhc2UgTEFOR19LbzogLyogc3RyaW5nIHVzaW5nIGNvZGVwYWdlIDk0OSAqLwogICAgICAgIHN3aXRjaCAoTENUeXBlKSB7CiNpbmNsdWRlICJubHMva29yLm5scyIKICAgICAgICBkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwogICAgICAgIH0KICAgIGJyZWFrOyAgLyogTEFORyhLbykgKi8KCiAgICBjYXNlIExBTkdfSHU6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKI2luY2x1ZGUgIm5scy9odW4ubmxzIgoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAgLyogTEFORyhFbikgKi8KCiAgICBjYXNlIExBTkdfUGw6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKI2luY2x1ZGUgIm5scy9wbGsubmxzIgoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAgLyogTEFORyhQbCkgKi8KCiAgICBjYXNlIExBTkdfUG86CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKI2luY2x1ZGUgIm5scy9wdGIubmxzIgoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAvKiBMQU5HKFBvKSAqLwoKICAgIGNhc2UgTEFOR19TdzoKICAgIAlzd2l0Y2ggKExDVHlwZSkgewojaW5jbHVkZSAibmxzL3N2ZS5ubHMiCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7IC8qIExBTkcoU3cpICovCgovKkluc2VydCBvdGhlciBsYW5ndWFnZXMgaGVyZSovCgogICAgZGVmYXVsdDoKICAgIAlmb3VuZD0wOwoJYnJlYWs7CiAgICB9ICAvKiBzd2l0Y2ggKi8KCglpZighZm91bmQpIHsKCQlFUlIob2xlLCInJXMnIG5vdCBzdXBwb3J0ZWQgZm9yIHlvdXIgbGFuZ3VhZ2UuXG4iLAoJCQlyZXRTdHJpbmcpOwoJCXJldFN0cmluZyA9ICI8V0lORS1OTFMtdW5rbm93bj4iOwoJCS8qcmV0dXJuIDA7Ki8KCX0KCWlmIChidWYpCgkJbHN0cmNweW4zMkEoYnVmLHJldFN0cmluZyxsZW4pOwoJcmV0dXJuIHN0cmxlbihyZXRTdHJpbmcpKzE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldExvY2FsZUluZm8zMlcgICAgICAgICAgICAgKEtFUk5FTDMyLjIzMCkKICogSXMgdGhlIGxhc3QgcGFyYW1ldGVyIHJlYWxseSBXT1JEIGZvciBXaW4xNj8KICovCklOVDMyIFdJTkFQSSBHZXRMb2NhbGVJbmZvMzJXKExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQV1NUUiB3YnVmLElOVDMyIGxlbikKewoJTFBTVFIgYWJ1ZiA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbik7CgoJSU5UMzIgbiA9IEdldExvY2FsZUluZm8zMkEobGNpZCwgTENUeXBlLCBhYnVmLCBsZW4pOwoJaWYgKHdidWYpCgkJbHN0cmNweW5BdG9XKHdidWYsYWJ1ZixsZW4pOwoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGFidWYpOwoJcmV0dXJuIG47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgU2V0TG9jYWxlSW5mb0EgICAgICAgW0tFUk5FTDMyLjQ5OV0KICovCkJPT0wxNiBXSU5BUEkgU2V0TG9jYWxlSW5mb0EoRFdPUkQgbGNpZCwgRFdPUkQgbGN0eXBlLCBMUENTVFIgZGF0YSkKewogICAgRklYTUUob2xlLCIoJWxkLCVsZCwlcyk6IHN0dWJcbiIsbGNpZCxsY3R5cGUsZGF0YSk7CiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBJc1ZhbGlkTG9jYWxlICAgICAgIFtLRVJORUwzMi4zNjFdCiAqLwpCT09MMzIgV0lOQVBJIElzVmFsaWRMb2NhbGUoTENJRCBsY2lkLERXT1JEIGZsYWdzKQp7CgkvKiB3ZSBzdXBwb3J0IEFOWSBsYW5ndWFnZS4gV2VsbCwgYXQgbGVhc3Qgc2F5IHRoYXQuLi4qLwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVN5c3RlbUxvY2FsZXMzMlcgICAgICAgICAgICAgICAgW0tFUk5FTDMyLjkzXQogKi8KQk9PTDMyIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlczMyVyggTE9DQUxFX0VOVU1QUk9DMzJXIGxwZm5Mb2NhbGVFbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBmbGFncyApCnsKCWludAlpOwoJQk9PTDMyCXJldDsKCVdDSEFSCWJ1ZmZlclsyMDBdOwoJSEtFWQl4aGtleTsKCglUUkFDRSh3aW4zMiwiKCVwLCUwOGx4KVxuIixscGZuTG9jYWxlRW51bSxmbGFncyApOwoJLyogc2VlIGlmIHdlIGNhbiByZXVzZSB0aGUgV2luOTUgcmVnaXN0cnkgZW50cmllcy4uLi4gKi8KCWlmIChFUlJPUl9TVUNDRVNTPT1SZWdPcGVuS2V5MzJBKEhLRVlfTE9DQUxfTUFDSElORSwiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcIiwmeGhrZXkpKSB7CgkJaT0wOwoJCXdoaWxlICgxKSB7CgkJCWlmIChFUlJPUl9TVUNDRVNTIT1SZWdFbnVtS2V5MzJXKHhoa2V5LGksYnVmZmVyLHNpemVvZihidWZmZXIpKSkKCQkJCWJyZWFrOwogICAgICAgICAgICAJCWlmICghbHBmbkxvY2FsZUVudW0oYnVmZmVyKSkKCQkJCWJyZWFrOwoJCQlpKys7CgkJfQoJCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKCQlyZXR1cm4gVFJVRTsKCX0KCglpPTA7Cgl3aGlsZSAobGFuZ3VhZ2VzW2ldLmxhbmduYW1lIT1OVUxMKQogICAgICAgIHsKICAgICAgICAgICAgTFBXU1RSIGNwOwoJICAgIGNoYXIgICB4YnVmZmVyWzEwXTsKICAJCgkgICAgc3ByaW50Zih4YnVmZmVyLCIlMDhseCIsKERXT1JEKWxhbmd1YWdlc1tpXS5sYW5naWQpOwoKCSAgICBjcCA9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgeGJ1ZmZlciApOwogICAgICAgICAgICByZXQgPSBscGZuTG9jYWxlRW51bShjcCk7CiAgICAgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBjcCApOwogICAgICAgICAgICBpZiAoIXJldCkgYnJlYWs7CiAgICAgICAgICAgIGkrKzsKCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1TeXN0ZW1Mb2NhbGVzMzJBICAgICAgICAgICAgICAgIFtLRVJORUwzMi45Ml0KICovCkJPT0wzMiBXSU5BUEkgRW51bVN5c3RlbUxvY2FsZXMzMkEoTE9DQUxFX0VOVU1QUk9DMzJBIGxwZm5Mb2NhbGVFbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzKQp7CglpbnQJaTsKCUNIQVIJYnVmZmVyWzIwMF07CglIS0VZCXhoa2V5OwoKCVRSQUNFKHdpbjMyLCIoJXAsJTA4bHgpXG4iLAoJCWxwZm5Mb2NhbGVFbnVtLGZsYWdzCgkpOwoJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ09wZW5LZXkzMkEoSEtFWV9MT0NBTF9NQUNISU5FLCJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwiLCZ4aGtleSkpIHsKCQlpPTA7CgkJd2hpbGUgKDEpIHsKCQkJaWYgKEVSUk9SX1NVQ0NFU1MhPVJlZ0VudW1LZXkzMkEoeGhrZXksaSxidWZmZXIsc2l6ZW9mKGJ1ZmZlcikpKQoJCQkJYnJlYWs7CiAgICAgICAgICAgIAkJaWYgKCFscGZuTG9jYWxlRW51bShidWZmZXIpKQoJCQkJYnJlYWs7CgkJCWkrKzsKCQl9CgkJUmVnQ2xvc2VLZXkoeGhrZXkpOwoJCXJldHVybiBUUlVFOwoJfQoJaT0wOwoJd2hpbGUgKGxhbmd1YWdlc1tpXS5sYW5nbmFtZSE9TlVMTCkgewoJCXNwcmludGYoYnVmZmVyLCIlMDhseCIsKERXT1JEKWxhbmd1YWdlc1tpXS5sYW5naWQpOwoJCWlmICghbHBmbkxvY2FsZUVudW0oYnVmZmVyKSkKCQkJYnJlYWs7CgkJaSsrOwoJfQoJcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIENUX0NUeXBlMl9MVVRbXSA9IHsKICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDggKi8KICBDMl9TRUdNRU5UU0VQQVJBVE9SLCAvKiAgIC0gICA5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDEyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIxICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDMwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAzMSAqLwogIEMyX1dISVRFU1BBQ0UsIC8qICAgLSAgMzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICEgLSAgMzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICIgLSAgMzQgKi8gLyogIiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICMgLSAgMzUgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAkIC0gIDM2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogJSAtICAzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiAmIC0gIDM4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAnIC0gIDM5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAoIC0gIDQwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiApIC0gIDQxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAqIC0gIDQyICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogKyAtICA0MyAqLwogIEMyX0NPTU1PTlNFUEFSQVRPUiwgLyogLCAtICA0NCAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIC0gLSAgNDUgKi8KICBDMl9FVVJPUEVTRVBBUkFUT1IsIC8qIC4gLSAgNDYgKi8KICBDMl9FVVJPUEVTRVBBUkFUT1IsIC8qIC8gLSAgNDcgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDAgLSAgNDggKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDEgLSAgNDkgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDIgLSAgNTAgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDMgLSAgNTEgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDQgLSAgNTIgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDUgLSAgNTMgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDYgLSAgNTQgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDcgLSAgNTUgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDggLSAgNTYgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qIDkgLSAgNTcgKi8KICBDMl9DT01NT05TRVBBUkFUT1IsIC8qIDogLSAgNTggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIDsgLSAgNTkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIDwgLSAgNjAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qID0gLSAgNjEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qID4gLSAgNjIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qID8gLSAgNjMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQCAtICA2NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBBIC0gIDY1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEIgLSAgNjYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQyAtICA2NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBEIC0gIDY4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEUgLSAgNjkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRiAtICA3MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBHIC0gIDcxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEggLSAgNzIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSSAtICA3MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBKIC0gIDc0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEsgLSAgNzUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTCAtICA3NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBNIC0gIDc3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE4gLSAgNzggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTyAtICA3OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBQIC0gIDgwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFEgLSAgODEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUiAtICA4MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBTIC0gIDgzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFQgLSAgODQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogVSAtICA4NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBWIC0gIDg2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFcgLSAgODcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWCAtICA4OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBZIC0gIDg5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFogLSAgOTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIFsgLSAgOTEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIFwgLSAgOTIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIF0gLSAgOTMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIF4gLSAgOTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIF8gLSAgOTUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIGAgLSAgOTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYSAtICA5NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBiIC0gIDk4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGMgLSAgOTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZCAtIDEwMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBlIC0gMTAxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGYgLSAxMDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZyAtIDEwMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBoIC0gMTA0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGkgLSAxMDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaiAtIDEwNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBrIC0gMTA3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGwgLSAxMDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbSAtIDEwOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBuIC0gMTEwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG8gLSAxMTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcCAtIDExMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBxIC0gMTEzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHIgLSAxMTQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcyAtIDExNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB0IC0gMTE2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHUgLSAxMTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdiAtIDExOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB3IC0gMTE5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHggLSAxMjAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeSAtIDEyMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB6IC0gMTIyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiB7IC0gMTIzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiB8IC0gMTI0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiB9IC0gMTI1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiB+IC0gMTI2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogfyAtIDEyNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIIAgLSAxMjggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCBIC0gMTI5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCCIC0gMTMwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIMgLSAxMzEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIQgLSAxMzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIUgLSAxMzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIYgLSAxMzQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIcgLSAxMzUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogiCAtIDEzNiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIIkgLSAxMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogiiAtIDEzOCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogiyAtIDEzOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCMIC0gMTQwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjSAtIDE0MSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII4gLSAxNDIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCPIC0gMTQzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogkCAtIDE0NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogkSAtIDE0NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogkiAtIDE0NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogkyAtIDE0NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoglCAtIDE0OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoglSAtIDE0OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogliAtIDE1MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoglyAtIDE1MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCYIC0gMTUyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCZIC0gMTUzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJogLSAxNTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJsgLSAxNTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyognCAtIDE1NiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJ0gLSAxNTcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCeIC0gMTU4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJ8gLSAxNTkgKi8KICBDMl9XSElURVNQQUNFLCAvKiCgIC0gMTYwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiChIC0gMTYxICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogoiAtIDE2MiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKMgLSAxNjMgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCkIC0gMTY0ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogpSAtIDE2NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogpiAtIDE2NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogpyAtIDE2NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogqCAtIDE2OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogqSAtIDE2OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogqiAtIDE3MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogqyAtIDE3MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogrCAtIDE3MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogrSAtIDE3MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogriAtIDE3NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogryAtIDE3NSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qILAgLSAxNzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCxIC0gMTc3ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiCyIC0gMTc4ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiCzIC0gMTc5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC0IC0gMTgwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC1IC0gMTgxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC2IC0gMTgyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC3IC0gMTgzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC4IC0gMTg0ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiC5IC0gMTg1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC6IC0gMTg2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC7IC0gMTg3ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC8IC0gMTg4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC9IC0gMTg5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC+IC0gMTkwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiC/IC0gMTkxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMAgLSAxOTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwSAtIDE5MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDCIC0gMTk0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMMgLSAxOTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxCAtIDE5NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDFIC0gMTk3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMYgLSAxOTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxyAtIDE5OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDIIC0gMjAwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMkgLSAyMDEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyiAtIDIwMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDLIC0gMjAzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMwgLSAyMDQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogzSAtIDIwNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDOIC0gMjA2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM8gLSAyMDcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0CAtIDIwOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDRIC0gMjA5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINIgLSAyMTAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0yAtIDIxMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDUIC0gMjEyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINUgLSAyMTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1iAtIDIxNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyog1yAtIDIxNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDYIC0gMjE2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINkgLSAyMTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2iAtIDIxOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDbIC0gMjE5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINwgLSAyMjAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3SAtIDIyMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDeIC0gMjIyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN8gLSAyMjMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4CAtIDIyNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDhIC0gMjI1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOIgLSAyMjYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4yAtIDIyNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDkIC0gMjI4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOUgLSAyMjkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5iAtIDIzMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDnIC0gMjMxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOggLSAyMzIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6SAtIDIzMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDqIC0gMjM0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOsgLSAyMzUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7CAtIDIzNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDtIC0gMjM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO4gLSAyMzggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7yAtIDIzOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDwIC0gMjQwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPEgLSAyNDEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8iAtIDI0MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDzIC0gMjQzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPQgLSAyNDQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9SAtIDI0NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD2IC0gMjQ2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiD3IC0gMjQ3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPggLSAyNDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+SAtIDI0OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD6IC0gMjUwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPsgLSAyNTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/CAtIDI1MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD9IC0gMjUzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIP4gLSAyNTQgKi8KICBDMl9MRUZUVE9SSUdIVCAvKiD/IC0gMjU1ICovCn07CgpzdGF0aWMgY29uc3QgV09SRCBDVF9DVHlwZTNfTFVUW10gPSB7IAogIDB4MDAwMCwgLyogICAtICAgMCAqLwogIDB4MDAwMCwgLyogICAtICAgMSAqLwogIDB4MDAwMCwgLyogICAtICAgMiAqLwogIDB4MDAwMCwgLyogICAtICAgMyAqLwogIDB4MDAwMCwgLyogICAtICAgNCAqLwogIDB4MDAwMCwgLyogICAtICAgNSAqLwogIDB4MDAwMCwgLyogICAtICAgNiAqLwogIDB4MDAwMCwgLyogICAtICAgNyAqLwogIDB4MDAwMCwgLyogICAtICAgOCAqLwogIDB4MDAwOCwgLyogICAtICAgOSAqLwogIDB4MDAwOCwgLyogICAtICAxMCAqLwogIDB4MDAwOCwgLyogICAtICAxMSAqLwogIDB4MDAwOCwgLyogICAtICAxMiAqLwogIDB4MDAwOCwgLyogICAtICAxMyAqLwogIDB4MDAwMCwgLyogICAtICAxNCAqLwogIDB4MDAwMCwgLyogICAtICAxNSAqLwogIDB4MDAwMCwgLyogICAtICAxNiAqLwogIDB4MDAwMCwgLyogICAtICAxNyAqLwogIDB4MDAwMCwgLyogICAtICAxOCAqLwogIDB4MDAwMCwgLyogICAtICAxOSAqLwogIDB4MDAwMCwgLyogICAtICAyMCAqLwogIDB4MDAwMCwgLyogICAtICAyMSAqLwogIDB4MDAwMCwgLyogICAtICAyMiAqLwogIDB4MDAwMCwgLyogICAtICAyMyAqLwogIDB4MDAwMCwgLyogICAtICAyNCAqLwogIDB4MDAwMCwgLyogICAtICAyNSAqLwogIDB4MDAwMCwgLyogICAtICAyNiAqLwogIDB4MDAwMCwgLyogICAtICAyNyAqLwogIDB4MDAwMCwgLyogICAtICAyOCAqLwogIDB4MDAwMCwgLyogICAtICAyOSAqLwogIDB4MDAwMCwgLyogICAtICAzMCAqLwogIDB4MDAwMCwgLyogICAtICAzMSAqLwogIDB4MDA0OCwgLyogICAtICAzMiAqLwogIDB4MDA0OCwgLyogISAtICAzMyAqLwogIDB4MDQ0OCwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgMHgwMDQ4LCAvKiAjIC0gIDM1ICovCiAgMHgwNDQ4LCAvKiAkIC0gIDM2ICovCiAgMHgwMDQ4LCAvKiAlIC0gIDM3ICovCiAgMHgwMDQ4LCAvKiAmIC0gIDM4ICovCiAgMHgwNDQwLCAvKiAnIC0gIDM5ICovCiAgMHgwMDQ4LCAvKiAoIC0gIDQwICovCiAgMHgwMDQ4LCAvKiApIC0gIDQxICovCiAgMHgwMDQ4LCAvKiAqIC0gIDQyICovCiAgMHgwMDQ4LCAvKiArIC0gIDQzICovCiAgMHgwMDQ4LCAvKiAsIC0gIDQ0ICovCiAgMHgwNDQwLCAvKiAtIC0gIDQ1ICovCiAgMHgwMDQ4LCAvKiAuIC0gIDQ2ICovCiAgMHgwNDQ4LCAvKiAvIC0gIDQ3ICovCiAgMHgwMDQwLCAvKiAwIC0gIDQ4ICovCiAgMHgwMDQwLCAvKiAxIC0gIDQ5ICovCiAgMHgwMDQwLCAvKiAyIC0gIDUwICovCiAgMHgwMDQwLCAvKiAzIC0gIDUxICovCiAgMHgwMDQwLCAvKiA0IC0gIDUyICovCiAgMHgwMDQwLCAvKiA1IC0gIDUzICovCiAgMHgwMDQwLCAvKiA2IC0gIDU0ICovCiAgMHgwMDQwLCAvKiA3IC0gIDU1ICovCiAgMHgwMDQwLCAvKiA4IC0gIDU2ICovCiAgMHgwMDQwLCAvKiA5IC0gIDU3ICovCiAgMHgwMDQ4LCAvKiA6IC0gIDU4ICovCiAgMHgwMDQ4LCAvKiA7IC0gIDU5ICovCiAgMHgwMDQ4LCAvKiA8IC0gIDYwICovCiAgMHgwNDQ4LCAvKiA9IC0gIDYxICovCiAgMHgwMDQ4LCAvKiA+IC0gIDYyICovCiAgMHgwMDQ4LCAvKiA/IC0gIDYzICovCiAgMHgwNDQ4LCAvKiBAIC0gIDY0ICovCiAgMHg4MDQwLCAvKiBBIC0gIDY1ICovCiAgMHg4MDQwLCAvKiBCIC0gIDY2ICovCiAgMHg4MDQwLCAvKiBDIC0gIDY3ICovCiAgMHg4MDQwLCAvKiBEIC0gIDY4ICovCiAgMHg4MDQwLCAvKiBFIC0gIDY5ICovCiAgMHg4MDQwLCAvKiBGIC0gIDcwICovCiAgMHg4MDQwLCAvKiBHIC0gIDcxICovCiAgMHg4MDQwLCAvKiBIIC0gIDcyICovCiAgMHg4MDQwLCAvKiBJIC0gIDczICovCiAgMHg4MDQwLCAvKiBKIC0gIDc0ICovCiAgMHg4MDQwLCAvKiBLIC0gIDc1ICovCiAgMHg4MDQwLCAvKiBMIC0gIDc2ICovCiAgMHg4MDQwLCAvKiBNIC0gIDc3ICovCiAgMHg4MDQwLCAvKiBOIC0gIDc4ICovCiAgMHg4MDQwLCAvKiBPIC0gIDc5ICovCiAgMHg4MDQwLCAvKiBQIC0gIDgwICovCiAgMHg4MDQwLCAvKiBRIC0gIDgxICovCiAgMHg4MDQwLCAvKiBSIC0gIDgyICovCiAgMHg4MDQwLCAvKiBTIC0gIDgzICovCiAgMHg4MDQwLCAvKiBUIC0gIDg0ICovCiAgMHg4MDQwLCAvKiBVIC0gIDg1ICovCiAgMHg4MDQwLCAvKiBWIC0gIDg2ICovCiAgMHg4MDQwLCAvKiBXIC0gIDg3ICovCiAgMHg4MDQwLCAvKiBYIC0gIDg4ICovCiAgMHg4MDQwLCAvKiBZIC0gIDg5ICovCiAgMHg4MDQwLCAvKiBaIC0gIDkwICovCiAgMHgwMDQ4LCAvKiBbIC0gIDkxICovCiAgMHgwNDQ4LCAvKiBcIC0gIDkyICovCiAgMHgwMDQ4LCAvKiBdIC0gIDkzICovCiAgMHgwNDQ4LCAvKiBeIC0gIDk0ICovCiAgMHgwNDQ4LCAvKiBfIC0gIDk1ICovCiAgMHgwNDQ4LCAvKiBgIC0gIDk2ICovCiAgMHg4MDQwLCAvKiBhIC0gIDk3ICovCiAgMHg4MDQwLCAvKiBiIC0gIDk4ICovCiAgMHg4MDQwLCAvKiBjIC0gIDk5ICovCiAgMHg4MDQwLCAvKiBkIC0gMTAwICovCiAgMHg4MDQwLCAvKiBlIC0gMTAxICovCiAgMHg4MDQwLCAvKiBmIC0gMTAyICovCiAgMHg4MDQwLCAvKiBnIC0gMTAzICovCiAgMHg4MDQwLCAvKiBoIC0gMTA0ICovCiAgMHg4MDQwLCAvKiBpIC0gMTA1ICovCiAgMHg4MDQwLCAvKiBqIC0gMTA2ICovCiAgMHg4MDQwLCAvKiBrIC0gMTA3ICovCiAgMHg4MDQwLCAvKiBsIC0gMTA4ICovCiAgMHg4MDQwLCAvKiBtIC0gMTA5ICovCiAgMHg4MDQwLCAvKiBuIC0gMTEwICovCiAgMHg4MDQwLCAvKiBvIC0gMTExICovCiAgMHg4MDQwLCAvKiBwIC0gMTEyICovCiAgMHg4MDQwLCAvKiBxIC0gMTEzICovCiAgMHg4MDQwLCAvKiByIC0gMTE0ICovCiAgMHg4MDQwLCAvKiBzIC0gMTE1ICovCiAgMHg4MDQwLCAvKiB0IC0gMTE2ICovCiAgMHg4MDQwLCAvKiB1IC0gMTE3ICovCiAgMHg4MDQwLCAvKiB2IC0gMTE4ICovCiAgMHg4MDQwLCAvKiB3IC0gMTE5ICovCiAgMHg4MDQwLCAvKiB4IC0gMTIwICovCiAgMHg4MDQwLCAvKiB5IC0gMTIxICovCiAgMHg4MDQwLCAvKiB6IC0gMTIyICovCiAgMHgwMDQ4LCAvKiB7IC0gMTIzICovCiAgMHgwMDQ4LCAvKiB8IC0gMTI0ICovCiAgMHgwMDQ4LCAvKiB9IC0gMTI1ICovCiAgMHgwNDQ4LCAvKiB+IC0gMTI2ICovCiAgMHgwMDAwLCAvKiB/IC0gMTI3ICovCiAgMHgwMDAwLCAvKiCAIC0gMTI4ICovCiAgMHgwMDAwLCAvKiCBIC0gMTI5ICovCiAgMHgwMDA4LCAvKiCCIC0gMTMwICovCiAgMHg4MDAwLCAvKiCDIC0gMTMxICovCiAgMHgwMDA4LCAvKiCEIC0gMTMyICovCiAgMHgwMDA4LCAvKiCFIC0gMTMzICovCiAgMHgwMDA4LCAvKiCGIC0gMTM0ICovCiAgMHgwMDA4LCAvKiCHIC0gMTM1ICovCiAgMHgwMDAxLCAvKiCIIC0gMTM2ICovCiAgMHgwMDA4LCAvKiCJIC0gMTM3ICovCiAgMHg4MDAzLCAvKiCKIC0gMTM4ICovCiAgMHgwMDA4LCAvKiCLIC0gMTM5ICovCiAgMHg4MDAwLCAvKiCMIC0gMTQwICovCiAgMHgwMDAwLCAvKiCNIC0gMTQxICovCiAgMHgwMDAwLCAvKiCOIC0gMTQyICovCiAgMHgwMDAwLCAvKiCPIC0gMTQzICovCiAgMHgwMDAwLCAvKiCQIC0gMTQ0ICovCiAgMHgwMDg4LCAvKiCRIC0gMTQ1ICovCiAgMHgwMDg4LCAvKiCSIC0gMTQ2ICovCiAgMHgwMDg4LCAvKiCTIC0gMTQ3ICovCiAgMHgwMDg4LCAvKiCUIC0gMTQ4ICovCiAgMHgwMDA4LCAvKiCVIC0gMTQ5ICovCiAgMHgwNDAwLCAvKiCWIC0gMTUwICovCiAgMHgwNDAwLCAvKiCXIC0gMTUxICovCiAgMHgwNDA4LCAvKiCYIC0gMTUyICovCiAgMHgwMDAwLCAvKiCZIC0gMTUzICovCiAgMHg4MDAzLCAvKiCaIC0gMTU0ICovCiAgMHgwMDA4LCAvKiCbIC0gMTU1ICovCiAgMHg4MDAwLCAvKiCcIC0gMTU2ICovCiAgMHgwMDAwLCAvKiCdIC0gMTU3ICovCiAgMHgwMDAwLCAvKiCeIC0gMTU4ICovCiAgMHg4MDAzLCAvKiCfIC0gMTU5ICovCiAgMHgwMDA4LCAvKiCgIC0gMTYwICovCiAgMHgwMDA4LCAvKiChIC0gMTYxICovCiAgMHgwMDQ4LCAvKiCiIC0gMTYyICovCiAgMHgwMDQ4LCAvKiCjIC0gMTYzICovCiAgMHgwMDA4LCAvKiCkIC0gMTY0ICovCiAgMHgwMDQ4LCAvKiClIC0gMTY1ICovCiAgMHgwMDQ4LCAvKiCmIC0gMTY2ICovCiAgMHgwMDA4LCAvKiCnIC0gMTY3ICovCiAgMHgwNDA4LCAvKiCoIC0gMTY4ICovCiAgMHgwMDA4LCAvKiCpIC0gMTY5ICovCiAgMHgwNDAwLCAvKiCqIC0gMTcwICovCiAgMHgwMDA4LCAvKiCrIC0gMTcxICovCiAgMHgwMDQ4LCAvKiCsIC0gMTcyICovCiAgMHgwNDA4LCAvKiCtIC0gMTczICovCiAgMHgwMDA4LCAvKiCuIC0gMTc0ICovCiAgMHgwNDQ4LCAvKiCvIC0gMTc1ICovCiAgMHgwMDA4LCAvKiCwIC0gMTc2ICovCiAgMHgwMDA4LCAvKiCxIC0gMTc3ICovCiAgMHgwMDAwLCAvKiCyIC0gMTc4ICovCiAgMHgwMDAwLCAvKiCzIC0gMTc5ICovCiAgMHgwNDA4LCAvKiC0IC0gMTgwICovCiAgMHgwMDA4LCAvKiC1IC0gMTgxICovCiAgMHgwMDA4LCAvKiC2IC0gMTgyICovCiAgMHgwMDA4LCAvKiC3IC0gMTgzICovCiAgMHgwNDA4LCAvKiC4IC0gMTg0ICovCiAgMHgwMDAwLCAvKiC5IC0gMTg1ICovCiAgMHgwNDAwLCAvKiC6IC0gMTg2ICovCiAgMHgwMDA4LCAvKiC7IC0gMTg3ICovCiAgMHgwMDAwLCAvKiC8IC0gMTg4ICovCiAgMHgwMDAwLCAvKiC9IC0gMTg5ICovCiAgMHgwMDAwLCAvKiC+IC0gMTkwICovCiAgMHgwMDA4LCAvKiC/IC0gMTkxICovCiAgMHg4MDAzLCAvKiDAIC0gMTkyICovCiAgMHg4MDAzLCAvKiDBIC0gMTkzICovCiAgMHg4MDAzLCAvKiDCIC0gMTk0ICovCiAgMHg4MDAzLCAvKiDDIC0gMTk1ICovCiAgMHg4MDAzLCAvKiDEIC0gMTk2ICovCiAgMHg4MDAzLCAvKiDFIC0gMTk3ICovCiAgMHg4MDAwLCAvKiDGIC0gMTk4ICovCiAgMHg4MDAzLCAvKiDHIC0gMTk5ICovCiAgMHg4MDAzLCAvKiDIIC0gMjAwICovCiAgMHg4MDAzLCAvKiDJIC0gMjAxICovCiAgMHg4MDAzLCAvKiDKIC0gMjAyICovCiAgMHg4MDAzLCAvKiDLIC0gMjAzICovCiAgMHg4MDAzLCAvKiDMIC0gMjA0ICovCiAgMHg4MDAzLCAvKiDNIC0gMjA1ICovCiAgMHg4MDAzLCAvKiDOIC0gMjA2ICovCiAgMHg4MDAzLCAvKiDPIC0gMjA3ICovCiAgMHg4MDAwLCAvKiDQIC0gMjA4ICovCiAgMHg4MDAzLCAvKiDRIC0gMjA5ICovCiAgMHg4MDAzLCAvKiDSIC0gMjEwICovCiAgMHg4MDAzLCAvKiDTIC0gMjExICovCiAgMHg4MDAzLCAvKiDUIC0gMjEyICovCiAgMHg4MDAzLCAvKiDVIC0gMjEzICovCiAgMHg4MDAzLCAvKiDWIC0gMjE0ICovCiAgMHgwMDA4LCAvKiDXIC0gMjE1ICovCiAgMHg4MDAzLCAvKiDYIC0gMjE2ICovCiAgMHg4MDAzLCAvKiDZIC0gMjE3ICovCiAgMHg4MDAzLCAvKiDaIC0gMjE4ICovCiAgMHg4MDAzLCAvKiDbIC0gMjE5ICovCiAgMHg4MDAzLCAvKiDcIC0gMjIwICovCiAgMHg4MDAzLCAvKiDdIC0gMjIxICovCiAgMHg4MDAwLCAvKiDeIC0gMjIyICovCiAgMHg4MDAwLCAvKiDfIC0gMjIzICovCiAgMHg4MDAzLCAvKiDgIC0gMjI0ICovCiAgMHg4MDAzLCAvKiDhIC0gMjI1ICovCiAgMHg4MDAzLCAvKiDiIC0gMjI2ICovCiAgMHg4MDAzLCAvKiDjIC0gMjI3ICovCiAgMHg4MDAzLCAvKiDkIC0gMjI4ICovCiAgMHg4MDAzLCAvKiDlIC0gMjI5ICovCiAgMHg4MDAwLCAvKiDmIC0gMjMwICovCiAgMHg4MDAzLCAvKiDnIC0gMjMxICovCiAgMHg4MDAzLCAvKiDoIC0gMjMyICovCiAgMHg4MDAzLCAvKiDpIC0gMjMzICovCiAgMHg4MDAzLCAvKiDqIC0gMjM0ICovCiAgMHg4MDAzLCAvKiDrIC0gMjM1ICovCiAgMHg4MDAzLCAvKiDsIC0gMjM2ICovCiAgMHg4MDAzLCAvKiDtIC0gMjM3ICovCiAgMHg4MDAzLCAvKiDuIC0gMjM4ICovCiAgMHg4MDAzLCAvKiDvIC0gMjM5ICovCiAgMHg4MDAwLCAvKiDwIC0gMjQwICovCiAgMHg4MDAzLCAvKiDxIC0gMjQxICovCiAgMHg4MDAzLCAvKiDyIC0gMjQyICovCiAgMHg4MDAzLCAvKiDzIC0gMjQzICovCiAgMHg4MDAzLCAvKiD0IC0gMjQ0ICovCiAgMHg4MDAzLCAvKiD1IC0gMjQ1ICovCiAgMHg4MDAzLCAvKiD2IC0gMjQ2ICovCiAgMHgwMDA4LCAvKiD3IC0gMjQ3ICovCiAgMHg4MDAzLCAvKiD4IC0gMjQ4ICovCiAgMHg4MDAzLCAvKiD5IC0gMjQ5ICovCiAgMHg4MDAzLCAvKiD6IC0gMjUwICovCiAgMHg4MDAzLCAvKiD7IC0gMjUxICovCiAgMHg4MDAzLCAvKiD8IC0gMjUyICovCiAgMHg4MDAzLCAvKiD9IC0gMjUzICovCiAgMHg4MDAwLCAvKiD+IC0gMjU0ICovCiAgMHg4MDAzICAvKiD/IC0gMjU1ICovCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldFN0cmluZ1R5cGVBICAgICAgICAgICAgICAgIFtPTEUyTkxTLjddCiAqLwpCT09MMTYgV0lOQVBJIEdldFN0cmluZ1R5cGUxNihMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMkEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRTdHJpbmdUeXBlQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuMjc3XQogKi8KQk9PTDMyIFdJTkFQSSBHZXRTdHJpbmdUeXBlMzJBKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMkEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0U3RyaW5nVHlwZUV4QSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuMjc2XQogKgogKiBGSVhNRTogSWdub3JlcyB0aGUgbG9jYWxlLgogKi8KQk9PTDMyIFdJTkFQSSBHZXRTdHJpbmdUeXBlRXgzMkEoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglpbnQJaTsKCQoJaWYgKChzcmM9PU5VTEwpIHx8IChjaGFydHlwZT09TlVMTCkgfHwgKHNyYz09KExQU1RSKWNoYXJ0eXBlKSkKCXsKCSAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCSAgcmV0dXJuIEZBTFNFOwoJfQoKCWlmIChjY2hTcmM9PS0xKQoJICBjY2hTcmM9bHN0cmxlbjMyQShzcmMpKzE7CgkgIAoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMToKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldID0gMDsKCSAgICBpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkgICAgaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJICAgIGlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCSAgICBpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkgICAgaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJICAgIGlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCSAgICBpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCgkgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkgICAgLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKCgljYXNlIENUX0NUWVBFMjoKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldPShXT1JEKUNUX0NUeXBlMl9MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJY2FzZSBDVF9DVFlQRTM6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXT1DVF9DVHlwZTNfTFVUW2ldOwoJICB9CgkgIHJldHVybiBUUlVFOwoKCWRlZmF1bHQ6CgkgIEVSUihvbGUsIlVua25vd24gZHdJbmZvVHlwZTolbGRcbiIsZHdJbmZvVHlwZSk7CgkgIHJldHVybiBGQUxTRTsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgR2V0U3RyaW5nVHlwZVcgW0tFUk5FTDMyLjI3OV0KICoKICogTk9URVMKICogWWVzLCB0aGlzIGlzIG1pc3NpbmcgTENJRCBsb2NhbGUuIE1TIGZhdWx0LgogKi8KQk9PTDMyIFdJTkFQSSBHZXRTdHJpbmdUeXBlMzJXKERXT1JEIGR3SW5mb1R5cGUsTFBDV1NUUiBzcmMsSU5UMzIgY2NoU3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBXT1JEIGNoYXJ0eXBlKQp7CglyZXR1cm4gR2V0U3RyaW5nVHlwZUV4MzJXKDAvKmRlZmF1bHRsb2NhbGUqLyxkd0luZm9UeXBlLHNyYyxjY2hTcmMsY2hhcnR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgR2V0U3RyaW5nVHlwZVcgICBbS0VSTkVMMzIuMjc4XQogKiBGSVhNRTogdW5pY29kZSBjaGFycyBhcmUgYXNzdW1lZCBjaGFycwogKi8KQk9PTDMyIFdJTkFQSSBHZXRTdHJpbmdUeXBlRXgzMlcoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENXU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJaW50CWk7CgoKCWlmIChjY2hTcmM9PS0xKQoJICBjY2hTcmM9bHN0cmxlbjMyVyhzcmMpKzE7CgkKCXN3aXRjaCAoZHdJbmZvVHlwZSkgewoJY2FzZSBDVF9DVFlQRTI6CgkJRklYTUUob2xlLCJDVF9DVFlQRTIgbm90IHN1cHBvcnRlZC5cbiIpOwoJCXJldHVybiBGQUxTRTsKCWNhc2UgQ1RfQ1RZUEUzOgoJCUZJWE1FKG9sZSwiQ1RfQ1RZUEUzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQlyZXR1cm4gRkFMU0U7CglkZWZhdWx0OmJyZWFrOwoJfQoJZm9yIChpPTA7aTxjY2hTcmM7aSsrKSB7CgkJY2hhcnR5cGVbaV0gPSAwOwoJCWlmIChpc2RpZ2l0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9ESUdJVDsKCQlpZiAoaXNhbHBoYShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQUxQSEE7CgkJaWYgKGlzbG93ZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0xPV0VSOwoJCWlmIChpc3VwcGVyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9VUFBFUjsKCQlpZiAoaXNzcGFjZShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfU1BBQ0U7CgkJaWYgKGlzcHVuY3Qoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1BVTkNUOwoJCWlmIChpc2NudHJsKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9DTlRSTDsKLyogRklYTUU6IGlzYmxhbmsoKSBpcyBhIEdOVSBleHRlbnNpb24gKi8KLyoJCWlmIChpc2JsYW5rKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsgKi8KICAgICAgICAgICAgICAgIGlmICgoc3JjW2ldID09ICcgJykgfHwgKHNyY1tpXSA9PSAnXHQnKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOwoJCS8qIEMxX1hESUdJVCAqLwoJfQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBWZXJMYW5ndWFnZU5hbWUxNiAgIFtWRVIuMTBdIAogKi8KRFdPUkQgV0lOQVBJIFZlckxhbmd1YWdlTmFtZTE2KFVJTlQxNiBsYW5naWQsTFBTVFIgbGFuZ25hbWUsVUlOVDE2IGxhbmduYW1lbGVuKQp7CglpbnQJaTsKCURXT1JECXJlc3VsdDsKCWNoYXIJYnVmZmVyWzgwXTsKCglUUkFDRSh2ZXIsIiglZCwlcCwlZClcbiIsbGFuZ2lkLGxhbmduYW1lLGxhbmduYW1lbGVuKTsKCS8qIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgoJICogZnJvbSB0aGUgcmVnaXN0cnkuIAoJICovCglzcHJpbnRmKGJ1ZmZlciwKCQkiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsCgkJbGFuZ2lkKTsKCXJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWUxNihIS0VZX0xPQ0FMX01BQ0hJTkUsIGJ1ZmZlciwgbGFuZ25hbWUsCgkJCQkoTFBEV09SRCkmbGFuZ25hbWVsZW4pOwoJaWYgKHJlc3VsdCA9PSBFUlJPUl9TVUNDRVNTKSB7CgkJbGFuZ25hbWVbbGFuZ25hbWVsZW4tMV09J1wwJzsKCQlyZXR1cm4gbGFuZ25hbWVsZW47Cgl9CgkvKiBpZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGludGVybmFsIHRhYmxlICovCglmb3IgKGk9MDtsYW5ndWFnZXNbaV0ubGFuZ2lkIT0wO2krKykKCQlpZiAobGFuZ2lkPT1sYW5ndWFnZXNbaV0ubGFuZ2lkKQoJCQlicmVhazsKCXN0cm5jcHkobGFuZ25hbWUsbGFuZ3VhZ2VzW2ldLmxhbmduYW1lLGxhbmduYW1lbGVuKTsKCWxhbmduYW1lW2xhbmduYW1lbGVuLTFdPSdcMCc7CglyZXR1cm4gc3RybGVuKGxhbmd1YWdlc1tpXS5sYW5nbmFtZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBWZXJMYW5ndWFnZU5hbWUzMkEJCQkJW1ZFUlNJT04uOV0gCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lMzJBKFVJTlQzMiBsYW5naWQsTFBTVFIgbGFuZ25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGxhbmduYW1lbGVuKQp7CglyZXR1cm4gVmVyTGFuZ3VhZ2VOYW1lMTYobGFuZ2lkLGxhbmduYW1lLGxhbmduYW1lbGVuKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFZlckxhbmd1YWdlTmFtZTMyVwkJCQlbVkVSU0lPTi4xMF0gCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lMzJXKFVJTlQzMiBsYW5naWQsTFBXU1RSIGxhbmduYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiBsYW5nbmFtZWxlbikKewoJaW50CWk7CglMUFdTVFIJa2V5bmFtZTsKCURXT1JECXJlc3VsdDsKCWNoYXIJYnVmZmVyWzgwXTsKCgkvKiBGaXJzdCwgY2hlY2sgXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxjb250cm9sXE5sc1xMb2NhbGVcPGxhbmdpZD4KCSAqIGZyb20gdGhlIHJlZ2lzdHJ5LiAKCSAqLwoJc3ByaW50ZihidWZmZXIsCgkJIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCUwOHgiLAoJCWxhbmdpZCk7CglrZXluYW1lID0gSEVBUF9zdHJkdXBBdG9XKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXIgKTsKCXJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWUzMlcoSEtFWV9MT0NBTF9NQUNISU5FLCBrZXluYW1lLCBsYW5nbmFtZSwKCQkJCShMUERXT1JEKSZsYW5nbmFtZWxlbik7CglIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwga2V5bmFtZSApOwoJaWYgKHJlc3VsdCAhPSBFUlJPUl9TVUNDRVNTKSB7CgkJLyogaWYgdGhhdCBmYWlscywgdXNlIHRoZSBpbnRlcm5hbCB0YWJsZSAqLwoJCWZvciAoaT0wO2xhbmd1YWdlc1tpXS5sYW5naWQhPTA7aSsrKQoJCQlpZiAobGFuZ2lkPT1sYW5ndWFnZXNbaV0ubGFuZ2lkKQoJCQkJYnJlYWs7CiAgICAgICAgCWxzdHJjcHlBdG9XKCBsYW5nbmFtZSwgbGFuZ3VhZ2VzW2ldLmxhbmduYW1lICk7CgkJbGFuZ25hbWVsZW4gPSBzdHJsZW4obGFuZ3VhZ2VzW2ldLmxhbmduYW1lKTsKCSAJLyogc2FtZSBhcyBzdHJsZW5XKGxhbmduYW1lKTsgKi8KCX0KCXJldHVybiBsYW5nbmFtZWxlbjsKfQogCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVFtdID0gewogIDYgICAgICAsICAgMywgLyogICAtICAgMSAqLyAgCiAgNiAgICAgICwgICA0LCAvKiAgIC0gICAyICovICAKICA2ICAgICAgLCAgIDUsIC8qICAgLSAgIDMgKi8gIAogIDYgICAgICAsICAgNiwgLyogICAtICAgNCAqLyAgCiAgNiAgICAgICwgICA3LCAvKiAgIC0gICA1ICovICAKICA2ICAgICAgLCAgIDgsIC8qICAgLSAgIDYgKi8gIAogIDYgICAgICAsICAgOSwgLyogICAtICAgNyAqLyAgCiAgNiAgICAgICwgIDEwLCAvKiAgIC0gICA4ICovICAKICA3ICAgICAgLCAgIDUsIC8qICAgLSAgIDkgKi8gIAogIDcgICAgICAsICAgNiwgLyogICAtICAxMCAqLyAgCiAgNyAgICAgICwgICA3LCAvKiAgIC0gIDExICovICAKICA3ICAgICAgLCAgIDgsIC8qICAgLSAgMTIgKi8gIAogIDcgICAgICAsICAgOSwgLyogICAtICAxMyAqLyAgCiAgNiAgICAgICwgIDExLCAvKiAgIC0gIDE0ICovICAKICA2ICAgICAgLCAgMTIsIC8qICAgLSAgMTUgKi8gIAogIDYgICAgICAsICAxMywgLyogICAtICAxNiAqLyAgCiAgNiAgICAgICwgIDE0LCAvKiAgIC0gIDE3ICovICAKICA2ICAgICAgLCAgMTUsIC8qICAgLSAgMTggKi8gIAogIDYgICAgICAsICAxNiwgLyogICAtICAxOSAqLyAgCiAgNiAgICAgICwgIDE3LCAvKiAgIC0gIDIwICovICAKICA2ICAgICAgLCAgMTgsIC8qICAgLSAgMjEgKi8gIAogIDYgICAgICAsICAxOSwgLyogICAtICAyMiAqLyAgCiAgNiAgICAgICwgIDIwLCAvKiAgIC0gIDIzICovICAKICA2ICAgICAgLCAgMjEsIC8qICAgLSAgMjQgKi8gIAogIDYgICAgICAsICAyMiwgLyogICAtICAyNSAqLyAgCiAgNiAgICAgICwgIDIzLCAvKiAgIC0gIDI2ICovICAKICA2ICAgICAgLCAgMjQsIC8qICAgLSAgMjcgKi8gIAogIDYgICAgICAsICAyNSwgLyogICAtICAyOCAqLyAgCiAgNiAgICAgICwgIDI2LCAvKiAgIC0gIDI5ICovICAKICA2ICAgICAgLCAgMjcsIC8qICAgLSAgMzAgKi8gIAogIDYgICAgICAsICAyOCwgLyogICAtICAzMSAqLyAgCiAgNyAgICAgICwgICAyLCAvKiAgIC0gIDMyICovCiAgNyAgICAgICwgIDI4LCAvKiAhIC0gIDMzICovCiAgNyAgICAgICwgIDI5LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICA3ICAgICAgLCAgMzEsIC8qICMgLSAgMzUgKi8KICA3ICAgICAgLCAgMzMsIC8qICQgLSAgMzYgKi8KICA3ICAgICAgLCAgMzUsIC8qICUgLSAgMzcgKi8KICA3ICAgICAgLCAgMzcsIC8qICYgLSAgMzggKi8KICA2ICAgICAgLCAxMjgsIC8qICcgLSAgMzkgKi8KICA3ICAgICAgLCAgMzksIC8qICggLSAgNDAgKi8KICA3ICAgICAgLCAgNDIsIC8qICkgLSAgNDEgKi8KICA3ICAgICAgLCAgNDUsIC8qICogLSAgNDIgKi8KICA4ICAgICAgLCAgIDMsIC8qICsgLSAgNDMgKi8KICA3ICAgICAgLCAgNDcsIC8qICwgLSAgNDQgKi8KICA2ICAgICAgLCAxMzAsIC8qIC0gLSAgNDUgKi8KICA3ICAgICAgLCAgNTEsIC8qIC4gLSAgNDYgKi8KICA3ICAgICAgLCAgNTMsIC8qIC8gLSAgNDcgKi8KIDEyICAgICAgLCAgIDMsIC8qIDAgLSAgNDggKi8KIDEyICAgICAgLCAgMzMsIC8qIDEgLSAgNDkgKi8KIDEyICAgICAgLCAgNTEsIC8qIDIgLSAgNTAgKi8KIDEyICAgICAgLCAgNzAsIC8qIDMgLSAgNTEgKi8KIDEyICAgICAgLCAgODgsIC8qIDQgLSAgNTIgKi8KIDEyICAgICAgLCAxMDYsIC8qIDUgLSAgNTMgKi8KIDEyICAgICAgLCAxMjUsIC8qIDYgLSAgNTQgKi8KIDEyICAgICAgLCAxNDQsIC8qIDcgLSAgNTUgKi8KIDEyICAgICAgLCAxNjIsIC8qIDggLSAgNTYgKi8KIDEyICAgICAgLCAxODAsIC8qIDkgLSAgNTcgKi8KICA3ICAgICAgLCAgNTUsIC8qIDogLSAgNTggKi8KICA3ICAgICAgLCAgNTgsIC8qIDsgLSAgNTkgKi8KICA4ICAgICAgLCAgMTQsIC8qIDwgLSAgNjAgKi8KICA4ICAgICAgLCAgMTgsIC8qID0gLSAgNjEgKi8KICA4ICAgICAgLCAgMjAsIC8qID4gLSAgNjIgKi8KICA3ICAgICAgLCAgNjAsIC8qID8gLSAgNjMgKi8KICA3ICAgICAgLCAgNjIsIC8qIEAgLSAgNjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIEEgLSAgNjUgKi8KIDE0ICAgICAgLCAgIDksIC8qIEIgLSAgNjYgKi8KIDE0ICAgICAgLCAgMTAsIC8qIEMgLSAgNjcgKi8KIDE0ICAgICAgLCAgMjYsIC8qIEQgLSAgNjggKi8KIDE0ICAgICAgLCAgMzMsIC8qIEUgLSAgNjkgKi8KIDE0ICAgICAgLCAgMzUsIC8qIEYgLSAgNzAgKi8KIDE0ICAgICAgLCAgMzcsIC8qIEcgLSAgNzEgKi8KIDE0ICAgICAgLCAgNDQsIC8qIEggLSAgNzIgKi8KIDE0ICAgICAgLCAgNTAsIC8qIEkgLSAgNzMgKi8KIDE0ICAgICAgLCAgNTMsIC8qIEogLSAgNzQgKi8KIDE0ICAgICAgLCAgNTQsIC8qIEsgLSAgNzUgKi8KIDE0ICAgICAgLCAgNzIsIC8qIEwgLSAgNzYgKi8KIDE0ICAgICAgLCAgODEsIC8qIE0gLSAgNzcgKi8KIDE0ICAgICAgLCAxMTIsIC8qIE4gLSAgNzggKi8KIDE0ICAgICAgLCAxMjQsIC8qIE8gLSAgNzkgKi8KIDE0ICAgICAgLCAxMjYsIC8qIFAgLSAgODAgKi8KIDE0ICAgICAgLCAxMzcsIC8qIFEgLSAgODEgKi8KIDE0ICAgICAgLCAxMzgsIC8qIFIgLSAgODIgKi8KIDE0ICAgICAgLCAxNDUsIC8qIFMgLSAgODMgKi8KIDE0ICAgICAgLCAxNTMsIC8qIFQgLSAgODQgKi8KIDE0ICAgICAgLCAxNTksIC8qIFUgLSAgODUgKi8KIDE0ICAgICAgLCAxNjIsIC8qIFYgLSAgODYgKi8KIDE0ICAgICAgLCAxNjQsIC8qIFcgLSAgODcgKi8KIDE0ICAgICAgLCAxNjYsIC8qIFggLSAgODggKi8KIDE0ICAgICAgLCAxNjcsIC8qIFkgLSAgODkgKi8KIDE0ICAgICAgLCAxNjksIC8qIFogLSAgOTAgKi8KICA3ICAgICAgLCAgNjMsIC8qIFsgLSAgOTEgKi8KICA3ICAgICAgLCAgNjUsIC8qIFwgLSAgOTIgKi8KICA3ICAgICAgLCAgNjYsIC8qIF0gLSAgOTMgKi8KICA3ICAgICAgLCAgNjcsIC8qIF4gLSAgOTQgKi8KICA3ICAgICAgLCAgNjgsIC8qIF8gLSAgOTUgKi8KICA3ICAgICAgLCAgNzIsIC8qIGAgLSAgOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIGEgLSAgOTcgKi8KIDE0ICAgICAgLCAgIDksIC8qIGIgLSAgOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIGMgLSAgOTkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIGQgLSAxMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIGUgLSAxMDEgKi8KIDE0ICAgICAgLCAgMzUsIC8qIGYgLSAxMDIgKi8KIDE0ICAgICAgLCAgMzcsIC8qIGcgLSAxMDMgKi8KIDE0ICAgICAgLCAgNDQsIC8qIGggLSAxMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIGkgLSAxMDUgKi8KIDE0ICAgICAgLCAgNTMsIC8qIGogLSAxMDYgKi8KIDE0ICAgICAgLCAgNTQsIC8qIGsgLSAxMDcgKi8KIDE0ICAgICAgLCAgNzIsIC8qIGwgLSAxMDggKi8KIDE0ICAgICAgLCAgODEsIC8qIG0gLSAxMDkgKi8KIDE0ICAgICAgLCAxMTIsIC8qIG4gLSAxMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qIG8gLSAxMTEgKi8KIDE0ICAgICAgLCAxMjYsIC8qIHAgLSAxMTIgKi8KIDE0ICAgICAgLCAxMzcsIC8qIHEgLSAxMTMgKi8KIDE0ICAgICAgLCAxMzgsIC8qIHIgLSAxMTQgKi8KIDE0ICAgICAgLCAxNDUsIC8qIHMgLSAxMTUgKi8KIDE0ICAgICAgLCAxNTMsIC8qIHQgLSAxMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qIHUgLSAxMTcgKi8KIDE0ICAgICAgLCAxNjIsIC8qIHYgLSAxMTggKi8KIDE0ICAgICAgLCAxNjQsIC8qIHcgLSAxMTkgKi8KIDE0ICAgICAgLCAxNjYsIC8qIHggLSAxMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIHkgLSAxMjEgKi8KIDE0ICAgICAgLCAxNjksIC8qIHogLSAxMjIgKi8KICA3ICAgICAgLCAgNzQsIC8qIHsgLSAxMjMgKi8KICA3ICAgICAgLCAgNzYsIC8qIHwgLSAxMjQgKi8KICA3ICAgICAgLCAgNzgsIC8qIH0gLSAxMjUgKi8KICA3ICAgICAgLCAgODAsIC8qIH4gLSAxMjYgKi8KICA2ICAgICAgLCAgMjksIC8qIH8gLSAxMjcgKi8KICA2ICAgICAgLCAgMzAsIC8qIIAgLSAxMjggKi8KICA2ICAgICAgLCAgMzEsIC8qIIEgLSAxMjkgKi8KICA3ICAgICAgLCAxMjMsIC8qIIIgLSAxMzAgKi8KIDE0ICAgICAgLCAgMzUsIC8qIIMgLSAxMzEgKi8KICA3ICAgICAgLCAxMjcsIC8qIIQgLSAxMzIgKi8KIDEwICAgICAgLCAgMjEsIC8qIIUgLSAxMzMgKi8KIDEwICAgICAgLCAgMTUsIC8qIIYgLSAxMzQgKi8KIDEwICAgICAgLCAgMTYsIC8qIIcgLSAxMzUgKi8KICA3ICAgICAgLCAgNjcsIC8qIIggLSAxMzYgKi8KIDEwICAgICAgLCAgMjIsIC8qIIkgLSAxMzcgKi8KIDE0ICAgICAgLCAxNDUsIC8qIIogLSAxMzggKi8KICA3ICAgICAgLCAxMzYsIC8qIIsgLSAxMzkgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIIwgLSAxNDAgKi8KICA2ICAgICAgLCAgNDMsIC8qII0gLSAxNDEgKi8KICA2ICAgICAgLCAgNDQsIC8qII4gLSAxNDIgKi8KICA2ICAgICAgLCAgNDUsIC8qII8gLSAxNDMgKi8KICA2ICAgICAgLCAgNDYsIC8qIJAgLSAxNDQgKi8KICA3ICAgICAgLCAxMjEsIC8qIJEgLSAxNDUgKi8KICA3ICAgICAgLCAxMjIsIC8qIJIgLSAxNDYgKi8KICA3ICAgICAgLCAxMjUsIC8qIJMgLSAxNDcgKi8KICA3ICAgICAgLCAxMjYsIC8qIJQgLSAxNDggKi8KIDEwICAgICAgLCAgMTcsIC8qIJUgLSAxNDkgKi8KICA2ICAgICAgLCAxMzcsIC8qIJYgLSAxNTAgKi8KICA2ICAgICAgLCAxMzksIC8qIJcgLSAxNTEgKi8KICA3ICAgICAgLCAgOTMsIC8qIJggLSAxNTIgKi8KIDE0ICAgICAgLCAxNTYsIC8qIJkgLSAxNTMgKi8KIDE0ICAgICAgLCAxNDUsIC8qIJogLSAxNTQgKi8KICA3ICAgICAgLCAxMzcsIC8qIJsgLSAxNTUgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIJwgLSAxNTYgKi8KICA2ICAgICAgLCAgNTksIC8qIJ0gLSAxNTcgKi8KICA2ICAgICAgLCAgNjAsIC8qIJ4gLSAxNTggKi8KIDE0ICAgICAgLCAxNjcsIC8qIJ8gLSAxNTkgKi8KICA3ICAgICAgLCAgIDQsIC8qIKAgLSAxNjAgKi8KICA3ICAgICAgLCAgODEsIC8qIKEgLSAxNjEgKi8KIDEwICAgICAgLCAgIDIsIC8qIKIgLSAxNjIgKi8KIDEwICAgICAgLCAgIDMsIC8qIKMgLSAxNjMgKi8KIDEwICAgICAgLCAgIDQsIC8qIKQgLSAxNjQgKi8KIDEwICAgICAgLCAgIDUsIC8qIKUgLSAxNjUgKi8KICA3ICAgICAgLCAgODIsIC8qIKYgLSAxNjYgKi8KIDEwICAgICAgLCAgIDYsIC8qIKcgLSAxNjcgKi8KICA3ICAgICAgLCAgODMsIC8qIKggLSAxNjggKi8KIDEwICAgICAgLCAgIDcsIC8qIKkgLSAxNjkgKi8KIDE0ICAgICAgLCAgIDIsIC8qIKogLSAxNzAgKi8KICA4ICAgICAgLCAgMjQsIC8qIKsgLSAxNzEgKi8KIDEwICAgICAgLCAgIDgsIC8qIKwgLSAxNzIgKi8KICA2ICAgICAgLCAxMzEsIC8qIK0gLSAxNzMgKi8KIDEwICAgICAgLCAgIDksIC8qIK4gLSAxNzQgKi8KICA3ICAgICAgLCAgODQsIC8qIK8gLSAxNzUgKi8KIDEwICAgICAgLCAgMTAsIC8qILAgLSAxNzYgKi8KICA4ICAgICAgLCAgMjMsIC8qILEgLSAxNzcgKi8KIDEyICAgICAgLCAgNTEsIC8qILIgLSAxNzggKi8KIDEyICAgICAgLCAgNzAsIC8qILMgLSAxNzkgKi8KICA3ICAgICAgLCAgODUsIC8qILQgLSAxODAgKi8KIDEwICAgICAgLCAgMTEsIC8qILUgLSAxODEgKi8KIDEwICAgICAgLCAgMTIsIC8qILYgLSAxODIgKi8KIDEwICAgICAgLCAgMTMsIC8qILcgLSAxODMgKi8KICA3ICAgICAgLCAgODYsIC8qILggLSAxODQgKi8KIDEyICAgICAgLCAgMzMsIC8qILkgLSAxODUgKi8KIDE0ICAgICAgLCAxMjQsIC8qILogLSAxODYgKi8KICA4ICAgICAgLCAgMjYsIC8qILsgLSAxODcgKi8KIDEyICAgICAgLCAgMjEsIC8qILwgLSAxODggKi8KIDEyICAgICAgLCAgMjUsIC8qIL0gLSAxODkgKi8KIDEyICAgICAgLCAgMjksIC8qIL4gLSAxOTAgKi8KICA3ICAgICAgLCAgODcsIC8qIL8gLSAxOTEgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMAgLSAxOTIgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMEgLSAxOTMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMIgLSAxOTQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMMgLSAxOTUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMQgLSAxOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMUgLSAxOTcgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIMYgLSAxOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIMcgLSAxOTkgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMggLSAyMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMkgLSAyMDEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMogLSAyMDIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMsgLSAyMDMgKi8KIDE0ICAgICAgLCAgNTAsIC8qIMwgLSAyMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM0gLSAyMDUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM4gLSAyMDYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM8gLSAyMDcgKi8KIDE0ICAgICAgLCAgMjYsIC8qINAgLSAyMDggKi8KIDE0ICAgICAgLCAxMTIsIC8qINEgLSAyMDkgKi8KIDE0ICAgICAgLCAxMjQsIC8qINIgLSAyMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qINMgLSAyMTEgKi8KIDE0ICAgICAgLCAxMjQsIC8qINQgLSAyMTIgKi8KIDE0ICAgICAgLCAxMjQsIC8qINUgLSAyMTMgKi8KIDE0ICAgICAgLCAxMjQsIC8qINYgLSAyMTQgKi8KICA4ICAgICAgLCAgMjgsIC8qINcgLSAyMTUgKi8KIDE0ICAgICAgLCAxMjQsIC8qINggLSAyMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qINkgLSAyMTcgKi8KIDE0ICAgICAgLCAxNTksIC8qINogLSAyMTggKi8KIDE0ICAgICAgLCAxNTksIC8qINsgLSAyMTkgKi8KIDE0ICAgICAgLCAxNTksIC8qINwgLSAyMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIN0gLSAyMjEgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIN4gLSAyMjIgKi8KIDE0ICsgNDggLCAxNDUsIC8qIN8gLSAyMjMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOAgLSAyMjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOEgLSAyMjUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOIgLSAyMjYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOMgLSAyMjcgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOQgLSAyMjggKi8KIDE0ICAgICAgLCAgIDIsIC8qIOUgLSAyMjkgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIOYgLSAyMzAgKi8KIDE0ICAgICAgLCAgMTAsIC8qIOcgLSAyMzEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOggLSAyMzIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOkgLSAyMzMgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOogLSAyMzQgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOsgLSAyMzUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIOwgLSAyMzYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO0gLSAyMzcgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO4gLSAyMzggKi8KIDE0ICAgICAgLCAgNTAsIC8qIO8gLSAyMzkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIPAgLSAyNDAgKi8KIDE0ICAgICAgLCAxMTIsIC8qIPEgLSAyNDEgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPIgLSAyNDIgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPMgLSAyNDMgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPQgLSAyNDQgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPUgLSAyNDUgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPYgLSAyNDYgKi8KICA4ICAgICAgLCAgMjksIC8qIPcgLSAyNDcgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPggLSAyNDggKi8KIDE0ICAgICAgLCAxNTksIC8qIPkgLSAyNDkgKi8KIDE0ICAgICAgLCAxNTksIC8qIPogLSAyNTAgKi8KIDE0ICAgICAgLCAxNTksIC8qIPsgLSAyNTEgKi8KIDE0ICAgICAgLCAxNTksIC8qIPwgLSAyNTIgKi8KIDE0ICAgICAgLCAxNjcsIC8qIP0gLSAyNTMgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIP4gLSAyNTQgKi8KIDE0ICAgICAgLCAxNjcgIC8qIP8gLSAyNTUgKi8gfTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVF8yW10gPSB7IDMzLCA0NCwgMTQ1IH07CgojZGVmaW5lIExDTV9EaWFjcml0aWNfU3RhcnQgMTMxCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fRGlhY3JpdGljX0xVVFtdID0geyAKMTIzLCAgLyoggyAtIDEzMSAqLwogIDIsICAvKiCEIC0gMTMyICovCiAgMiwgIC8qIIUgLSAxMzMgKi8KICAyLCAgLyoghiAtIDEzNCAqLwogIDIsICAvKiCHIC0gMTM1ICovCiAgMywgIC8qIIggLSAxMzYgKi8KICAyLCAgLyogiSAtIDEzNyAqLwogMjAsICAvKiCKIC0gMTM4ICovCiAgMiwgIC8qIIsgLSAxMzkgKi8KICAyLCAgLyogjCAtIDE0MCAqLwogIDIsICAvKiCNIC0gMTQxICovCiAgMiwgIC8qII4gLSAxNDIgKi8KICAyLCAgLyogjyAtIDE0MyAqLwogIDIsICAvKiCQIC0gMTQ0ICovCiAgMiwgIC8qIJEgLSAxNDUgKi8KICAyLCAgLyogkiAtIDE0NiAqLwogIDIsICAvKiCTIC0gMTQ3ICovCiAgMiwgIC8qIJQgLSAxNDggKi8KICAyLCAgLyoglSAtIDE0OSAqLwogIDIsICAvKiCWIC0gMTUwICovCiAgMiwgIC8qIJcgLSAxNTEgKi8KICAyLCAgLyogmCAtIDE1MiAqLwogIDIsICAvKiCZIC0gMTUzICovCiAyMCwgIC8qIJogLSAxNTQgKi8KICAyLCAgLyogmyAtIDE1NSAqLwogIDIsICAvKiCcIC0gMTU2ICovCiAgMiwgIC8qIJ0gLSAxNTcgKi8KICAyLCAgLyogniAtIDE1OCAqLwogMTksICAvKiCfIC0gMTU5ICovCiAgMiwgIC8qIKAgLSAxNjAgKi8KICAyLCAgLyogoSAtIDE2MSAqLwogIDIsICAvKiCiIC0gMTYyICovCiAgMiwgIC8qIKMgLSAxNjMgKi8KICAyLCAgLyogpCAtIDE2NCAqLwogIDIsICAvKiClIC0gMTY1ICovCiAgMiwgIC8qIKYgLSAxNjYgKi8KICAyLCAgLyogpyAtIDE2NyAqLwogIDIsICAvKiCoIC0gMTY4ICovCiAgMiwgIC8qIKkgLSAxNjkgKi8KICAzLCAgLyogqiAtIDE3MCAqLwogIDIsICAvKiCrIC0gMTcxICovCiAgMiwgIC8qIKwgLSAxNzIgKi8KICAyLCAgLyogrSAtIDE3MyAqLwogIDIsICAvKiCuIC0gMTc0ICovCiAgMiwgIC8qIK8gLSAxNzUgKi8KICAyLCAgLyogsCAtIDE3NiAqLwogIDIsICAvKiCxIC0gMTc3ICovCiAgMiwgIC8qILIgLSAxNzggKi8KICAyLCAgLyogsyAtIDE3OSAqLwogIDIsICAvKiC0IC0gMTgwICovCiAgMiwgIC8qILUgLSAxODEgKi8KICAyLCAgLyogtiAtIDE4MiAqLwogIDIsICAvKiC3IC0gMTgzICovCiAgMiwgIC8qILggLSAxODQgKi8KICAyLCAgLyoguSAtIDE4NSAqLwogIDMsICAvKiC6IC0gMTg2ICovCiAgMiwgIC8qILsgLSAxODcgKi8KICAyLCAgLyogvCAtIDE4OCAqLwogIDIsICAvKiC9IC0gMTg5ICovCiAgMiwgIC8qIL4gLSAxOTAgKi8KICAyLCAgLyogvyAtIDE5MSAqLwogMTUsICAvKiDAIC0gMTkyICovCiAxNCwgIC8qIMEgLSAxOTMgKi8KIDE4LCAgLyogwiAtIDE5NCAqLwogMjUsICAvKiDDIC0gMTk1ICovCiAxOSwgIC8qIMQgLSAxOTYgKi8KIDI2LCAgLyogxSAtIDE5NyAqLwogIDIsICAvKiDGIC0gMTk4ICovCiAyOCwgIC8qIMcgLSAxOTkgKi8KIDE1LCAgLyogyCAtIDIwMCAqLwogMTQsICAvKiDJIC0gMjAxICovCiAxOCwgIC8qIMogLSAyMDIgKi8KIDE5LCAgLyogyyAtIDIwMyAqLwogMTUsICAvKiDMIC0gMjA0ICovCiAxNCwgIC8qIM0gLSAyMDUgKi8KIDE4LCAgLyogziAtIDIwNiAqLwogMTksICAvKiDPIC0gMjA3ICovCjEwNCwgIC8qINAgLSAyMDggKi8KIDI1LCAgLyog0SAtIDIwOSAqLwogMTUsICAvKiDSIC0gMjEwICovCiAxNCwgIC8qINMgLSAyMTEgKi8KIDE4LCAgLyog1CAtIDIxMiAqLwogMjUsICAvKiDVIC0gMjEzICovCiAxOSwgIC8qINYgLSAyMTQgKi8KICAyLCAgLyog1yAtIDIxNSAqLwogMzMsICAvKiDYIC0gMjE2ICovCiAxNSwgIC8qINkgLSAyMTcgKi8KIDE0LCAgLyog2iAtIDIxOCAqLwogMTgsICAvKiDbIC0gMjE5ICovCiAxOSwgIC8qINwgLSAyMjAgKi8KIDE0LCAgLyog3SAtIDIyMSAqLwogIDIsICAvKiDeIC0gMjIyICovCiAgMiwgIC8qIN8gLSAyMjMgKi8KIDE1LCAgLyog4CAtIDIyNCAqLwogMTQsICAvKiDhIC0gMjI1ICovCiAxOCwgIC8qIOIgLSAyMjYgKi8KIDI1LCAgLyog4yAtIDIyNyAqLwogMTksICAvKiDkIC0gMjI4ICovCiAyNiwgIC8qIOUgLSAyMjkgKi8KICAyLCAgLyog5iAtIDIzMCAqLwogMjgsICAvKiDnIC0gMjMxICovCiAxNSwgIC8qIOggLSAyMzIgKi8KIDE0LCAgLyog6SAtIDIzMyAqLwogMTgsICAvKiDqIC0gMjM0ICovCiAxOSwgIC8qIOsgLSAyMzUgKi8KIDE1LCAgLyog7CAtIDIzNiAqLwogMTQsICAvKiDtIC0gMjM3ICovCiAxOCwgIC8qIO4gLSAyMzggKi8KIDE5LCAgLyog7yAtIDIzOSAqLwoxMDQsICAvKiDwIC0gMjQwICovCiAyNSwgIC8qIPEgLSAyNDEgKi8KIDE1LCAgLyog8iAtIDI0MiAqLwogMTQsICAvKiDzIC0gMjQzICovCiAxOCwgIC8qIPQgLSAyNDQgKi8KIDI1LCAgLyog9SAtIDI0NSAqLwogMTksICAvKiD2IC0gMjQ2ICovCiAgMiwgIC8qIPcgLSAyNDcgKi8KIDMzLCAgLyog+CAtIDI0OCAqLwogMTUsICAvKiD5IC0gMjQ5ICovCiAxNCwgIC8qIPogLSAyNTAgKi8KIDE4LCAgLyog+yAtIDI1MSAqLwogMTksICAvKiD8IC0gMjUyICovCiAxNCwgIC8qIP0gLSAyNTMgKi8KICAyLCAgLyog/iAtIDI1NCAqLwogMTksICAvKiD/IC0gMjU1ICovCn0gOwoKc3RhdGljIGludCBPTEUyTkxTX2lzUHVuY3R1YXRpb24odW5zaWduZWQgY2hhciBjKSAKewogIC8qICJwdW5jdHVhdGlvbiBjaGFyYWN0ZXIiIGluIHRoaXMgY29udGV4dCBpcyBhIGNoYXJhY3RlciB3aGljaCBpcyAKICAgICBjb25zaWRlcmVkICJsZXNzIGltcG9ydGFudCIgZHVyaW5nIHdvcmQgc29ydCBjb21wYXJpc29uLgogICAgIFNlZSBMQ01hcFN0cmluZyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHByZWNpc2UgZGVmaW5pdGlvbiAKICAgICBvZiAibGVzcyBpbXBvcnRhbnQiLiAqLwoKICByZXR1cm4gKExDTV9Vbmljb2RlX0xVVFstMisyKmNdPT02KTsKfQoKc3RhdGljIGludCBpZGVudGl0eShpbnQgYykKewogIHJldHVybiBjOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgTENNYXBTdHJpbmczMkEgICAgICAgICAgICAgICAgW0tFUk5FTDMyLjQ5Ml0KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBJZiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSwgdGhlIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGUKICogYSBzb3J0IGtleSBmb3IgdGhlIHNvdXJjZSBzdHJpbmcuICBFbHNlLCBpdCB3aWxsIGNvbnZlcnQgaXQKICogYWNjb3JkaW5nbHkgdG8gdGhlIGZsYWdzIExDTUFQX1VQUEVSQ0FTRSwgTENNQVBfTE9XRVJDQVNFLC4uLgogKgogKiBSRVRVUk5TCiAqICAgIEVycm9yIDogMC4KICogICAgU3VjY2VzcyA6IGxlbmd0aCBvZiB0aGUgcmVzdWx0IHN0cmluZy4KICoKICogTk9URVMKICogICAgSWYgY2FsbGVkIHdpdGggc2NybGVuID0gLTEsIHRoZSBmdW5jdGlvbiB3aWxsIGNvbXB1dGUgdGhlIGxlbmd0aAogKiAgICAgIG9mIHRoZSAwLXRlcm1pbmF0ZWQgc3RyaW5nIHN0cnNyYyBieSBpdHNlbGYuICAgICAgCiAqIAogKiAgICBJZiBjYWxsZWQgd2l0aCBkc3RsZW4gPSAwLCByZXR1cm5zIHRoZSBidWZmZXIgbGVuZ3RoIHRoYXQgCiAqICAgICAgd291bGQgYmUgcmVxdWlyZWQuCiAqCiAqICAgIE5PUk1fSUdOT1JFV0lEVEggbWVhbnMgdG8gY29tcGFyZSBBU0NJSSBhbmQgVW5pY29kZSBjaGFyYWN0ZXJzCiAqICAgIGFzIGlmIHRoZXkgYXJlIGVxdWFsLiAgU2luY2UgV2luZSBzZXBhcmF0ZXMgQVNDSUkgYW5kIFVuaWNvZGUgaW50bwogKiAgICBzZXBhcmF0ZSBmdW5jdGlvbnMsIHdlIHNob3VsZG4ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGZvciB0aGlzIGZsYWcuCiAqICAgIEkgYWRkZWQgaXQgdG8gdGhlIGxpc3Qgb2YgZmxhZ3MgdGhhdCBkb24ndCBuZWVkIGEgZml4bWUgbWVzc2FnZQogKiAgICB0byBtYWtlIE1TIFdvcmQgOTUgbm90IHByaW50IHNldmVyYWwgdGhvdXNhbmQgZml4bWUgbWVzc2FnZXMgZm9yIAogKiAgICB0aGlzIGZ1bmN0aW9uLgogKi8KSU5UMzIgV0lOQVBJIExDTWFwU3RyaW5nMzJBKAoJTENJRCBsY2lkIC8qIGxvY2FsZSBpZGVudGlmaWVyIGNyZWF0ZWQgd2l0aCBNQUtFTENJRDsgCgkJICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQgYW5kIExPQ0FMRV9VU0VSX0RFRkFVTFQgYXJlIAogICAgICAgICAgICAgICAgICAgICBwcmVkZWZpbmVkIHZhbHVlcy4gKi8sCglEV09SRCBtYXBmbGFncyAvKiBmbGFncyAqLywKCUxQQ1NUUiBzcmNzdHIgIC8qIHNvdXJjZSBidWZmZXIgKi8sCglJTlQzMiBzcmNsZW4gICAvKiBzb3VyY2UgbGVuZ3RoICovLAoJTFBTVFIgZHN0c3RyICAgLyogZGVzdGluYXRpb24gYnVmZmVyICovLAoJSU5UMzIgZHN0bGVuICAgLyogZGVzdGluYXRpb24gYnVmZmVyIGxlbmd0aCAqLykgCnsKICBpbnQgaTsKCiAgVFJBQ0Uoc3RyaW5nLCIoMHglMDRseCwweCUwOGx4LCVzLCVkLCVwLCVkKVxuIiwKCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKCiAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICB7CiAgICBFUlIob2xlLCAiKHNyYz0lcyxkZXN0PSVzKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgc3Jjc3RyLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuID09IC0xKSAKICAgIHNyY2xlbiA9IGxzdHJsZW4zMkEoc3Jjc3RyKSArIDEgOyAgICAvKiAoaW5jbHVkZSBmaW5hbCAnXDAnKSAqLwoKICBpZiAobWFwZmxhZ3MgJiB+ICggTENNQVBfVVBQRVJDQVNFIHwgTENNQVBfTE9XRVJDQVNFIHwgTENNQVBfU09SVEtFWSB8CgkJICAgICBOT1JNX0lHTk9SRUNBU0UgfCBOT1JNX0lHTk9SRU5PTlNQQUNFIHwgU09SVF9TVFJJTkdTT1JUIHwKCQkgICAgIE5PUk1fSUdOT1JFV0lEVEgpICkKICB7CiAgICBGSVhNRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbixtYXBmbGFncyk7CiAgfQoKICBpZiAoICEobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSApCiAgewogICAgaW50ICgqZikoaW50KT1pZGVudGl0eTsgCgogICAgaWYgKGRzdGxlbj09MCkKICAgICAgcmV0dXJuIHNyY2xlbjsgIC8qIGRzdGxlbj0wIG1lYW5zICJkbyBub3RoaW5nIGJ1dCByZXR1cm4gcmVxdWlyZWQgbGVuZ3RoIiAqLwogICAgaWYgKGRzdGxlbjxzcmNsZW4pCiAgICAgIHNyY2xlbj1kc3RsZW47ICAvKiBObywgdGhpcyBjYXNlIGlzIG5vdCBhbiBlcnJvciB1bmRlciBXaW5kb3dzIDk1LgoJCSAgICAgICAgIEFuZCBubyAnXDAnIGdldHMgd3JpdHRlbi4gKi8KICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICBmb3IgKGk9MDsgaSA8IHNyY2xlbjsgaSsrKQogICAgICBkc3RzdHJbaV0gPSAoQ0hBUikgZihzcmNzdHJbaV0pOwogICAgcmV0dXJuIHNyY2xlbjsKICB9CgogIC8qIGVsc2UgLi4uIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICAqLwogIHsKICAgIGludCB1bmljb2RlX2xlbj0wOwogICAgaW50IGNhc2VfbGVuPTA7CiAgICBpbnQgZGlhY3JpdGljX2xlbj0wOwogICAgaW50IGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuPTA7CiAgICBjaGFyICpjYXNlX2NvbXBvbmVudDsKICAgIGNoYXIgKmRpYWNyaXRpY19jb21wb25lbnQ7CiAgICBjaGFyICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudDsKICAgIGludCByb29tLGNvdW50OwogICAgaW50IGZsYWdfc3RyaW5nc29ydCA9IG1hcGZsYWdzICYgU09SVF9TVFJJTkdTT1JUOwoKICAgIC8qIGNvbXB1dGUgaG93IG11Y2ggcm9vbSB3ZSB3aWxsIG5lZWQgKi8KICAgIGZvciAoaT0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgaW50IG9mczsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhciA9IHNyY3N0cltpXTsKICAgICAgaWYgKHNvdXJjZV9jaGFyIT0nXDAnKSAKICAgICAgewoJaWYgKGZsYWdfc3RyaW5nc29ydCB8fCAhT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkKCXsKCSAgdW5pY29kZV9sZW4rKzsKCSAgaWYgKCBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl0gJiB+MTUgKQoJICAgIHVuaWNvZGVfbGVuKys7ICAgICAgICAgICAgIC8qIGRvdWJsZSBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4rKzsKCX0JICAKICAgICAgfQoJICAKICAgICAgaWYgKGlzdXBwZXIoc291cmNlX2NoYXIpKQoJY2FzZV9sZW49dW5pY29kZV9sZW47IAoKICAgICAgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwogICAgICBpZiAoKG9mcz49MCkgJiYgKExDTV9EaWFjcml0aWNfTFVUW29mc10hPTIpKQoJZGlhY3JpdGljX2xlbj11bmljb2RlX2xlbjsKICAgIH0KCiAgICBpZiAobWFwZmxhZ3MgJiBOT1JNX0lHTk9SRUNBU0UpCiAgICAgIGNhc2VfbGVuPTA7ICAgICAgICAgICAgICAgICAgIAogICAgaWYgKG1hcGZsYWdzICYgTk9STV9JR05PUkVOT05TUEFDRSkKICAgICAgZGlhY3JpdGljX2xlbj0wOwoKICAgIHJvb20gPSAgMiAqIHVuaWNvZGVfbGVuICAgICAgICAgICAgICAvKiAidW5pY29kZSIgY29tcG9uZW50ICovCiAgICAgICsgICAgIGRpYWNyaXRpY19sZW4gICAgICAgICAgICAgICAgLyogImRpYWNyaXRpYyIgY29tcG9uZW50ICovCiAgICAgICsgICAgIGNhc2VfbGVuICAgICAgICAgICAgICAgICAgICAgLyogImNhc2UiIGNvbXBvbmVudCAqLwogICAgICArICAgICA0ICogZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4gIC8qIHB1bmN0dWF0aW9uIGluIHdvcmQgc29ydCBtb2RlICovCiAgICAgICsgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm91ciAnXDEnIHNlcGFyYXRvcnMgKi8KICAgICAgKyAgICAgMSAgOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hbCAnXDAnICovCiAgICBpZiAoZHN0bGVuPT0wKQogICAgICByZXR1cm4gcm9vbTsgICAgICAKICAgIGVsc2UgaWYgKGRzdGxlbjxyb29tKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qRklYTUUgdGhlIFBvaW50ZXJjaGVjayBzaG91bGQgbm90IGJlIG5lc3Nlc2FyeSAqLwogICAgaWYgKElzQmFkV3JpdGVQdHIzMiAoZHN0c3RyLHJvb20pKQogICAgeyBFUlIgKHN0cmluZywiYmFkIGRlc3RpbmF0aW9uIGJ1ZmZlciAoZHN0c3RyKSA6ICVwLCVkXG4iLGRzdHN0cixkc3RsZW4pOwogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIGxvY2F0ZSBlYWNoIGNvbXBvbmVudCwgd3JpdGUgc2VwYXJhdG9ycyAqLwogICAgZGlhY3JpdGljX2NvbXBvbmVudCA9IGRzdHN0ciArIDIqdW5pY29kZV9sZW4gOwogICAgKmRpYWNyaXRpY19jb21wb25lbnQrKyA9ICdcMSc7IAogICAgY2FzZV9jb21wb25lbnQgPSBkaWFjcml0aWNfY29tcG9uZW50ICsgZGlhY3JpdGljX2xlbiA7CiAgICAqY2FzZV9jb21wb25lbnQrKyA9ICdcMSc7IAogICAgZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQgPSBjYXNlX2NvbXBvbmVudCArIGNhc2VfbGVuIDsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKCiAgICAvKiByZWFkIHNvdXJjZSBzdHJpbmcgY2hhciBieSBjaGFyLCB3cml0ZSAKICAgICAgIGNvcnJlc3BvbmRpbmcgd2VpZ2h0IGluIGVhY2ggY29tcG9uZW50LiAqLwogICAgZm9yIChpPTAsY291bnQ9MDtpPHNyY2xlbjtpKyspCiAgICB7CiAgICAgIHVuc2lnbmVkIGNoYXIgc291cmNlX2NoYXI9c3Jjc3RyW2ldOwogICAgICBpZiAoc291cmNlX2NoYXIhPSdcMCcpIAogICAgICB7CglpbnQgdHlwZSxsb25nY29kZTsKCXR5cGUgPSBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl07Cglsb25nY29kZSA9IHR5cGUgPj4gNDsKCXR5cGUgJj0gMTU7CglpZiAoIWZsYWdfc3RyaW5nc29ydCAmJiBPTEUyTkxTX2lzUHVuY3R1YXRpb24oc291cmNlX2NoYXIpKSAKCXsKCSAgVUlOVDE2IGVuY3J5cHRlZF9sb2NhdGlvbiA9ICgxPDwxNSkgKyA3ICsgNCpjb3VudDsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAodW5zaWduZWQgY2hhcikgKGVuY3J5cHRlZF9sb2NhdGlvbj4+OCk7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24mMjU1KTsKICAgICAgICAgICAgICAgICAgICAgLyogYmlnLWVuZGlhbiBpcyB1c2VkIGhlcmUgYmVjYXVzZSBpdCBsZXRzIHN0cmluZyBjb21wYXJpc29uIGJlCgkJCWNvbXBhdGlibGUgd2l0aCBudW1lcmljYWwgY29tcGFyaXNvbiAqLwoKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSB0eXBlOwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9IExDTV9Vbmljb2RlX0xVVFstMSsyKnNvdXJjZV9jaGFyXTsgIAogICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bXB0aW9uIDogYSBwdW5jdHVhdGlvbiBjaGFyYWN0ZXIgaXMgbmV2ZXIgYSAKCQkJZG91YmxlIG9yIGFjY2VudGVkIGxldHRlciAqLwoJfQoJZWxzZQoJewoJICBkc3RzdHJbMipjb3VudF0gPSB0eXBlOwoJICBkc3RzdHJbMipjb3VudCsxXSA9IExDTV9Vbmljb2RlX0xVVFstMSsyKnNvdXJjZV9jaGFyXTsgIAoJICBpZiAobG9uZ2NvZGUpCgkgIHsKCSAgICBpZiAoY291bnQ8Y2FzZV9sZW4pCgkgICAgICBjYXNlX2NvbXBvbmVudFtjb3VudF0gPSAoIGlzdXBwZXIoc291cmNlX2NoYXIpID8gMTggOiAyICkgOwoJICAgIGlmIChjb3VudDxkaWFjcml0aWNfbGVuKQoJICAgICAgZGlhY3JpdGljX2NvbXBvbmVudFtjb3VudF0gPSAyOyAvKiBhc3N1bXB0aW9uOiBhIGRvdWJsZSBsZXR0ZXIKCQkJCQkJIGlzIG5ldmVyIGFjY2VudGVkICovCgkgICAgY291bnQrKzsKCSAgICAKCSAgICBkc3RzdHJbMipjb3VudF0gPSB0eXBlOwoJICAgIGRzdHN0clsyKmNvdW50KzFdID0gKihMQ01fVW5pY29kZV9MVVRfMiAtIDEgKyBsb25nY29kZSk7IAoJICAgIC8qIDE2IGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMSAKCSAgICAgICAzMiBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDIgCgkgICAgICAgNDggaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAzICovCgkgIH0KCgkgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICBjYXNlX2NvbXBvbmVudFtjb3VudF0gPSAoIGlzdXBwZXIoc291cmNlX2NoYXIpID8gMTggOiAyICkgOwoJICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKCSAgewoJICAgIGludCBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CgkgICAgZGlhY3JpdGljX2NvbXBvbmVudFtjb3VudF0gPSAob2ZzPj0wID8gTENNX0RpYWNyaXRpY19MVVRbb2ZzXSA6IDIpOwoJICB9CgkgIGNvdW50Kys7Cgl9CiAgICAgIH0KICAgIH0KICAgIGRzdHN0cltyb29tLTFdID0gJ1wwJzsKICAgIHJldHVybiByb29tOwogIH0KfQoJCSAgICAgCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBMQ01hcFN0cmluZzMyVyAgICAgICAgICAgICAgICBbS0VSTkVMMzIuNDkzXQogKgogKiBDb252ZXJ0IGEgc3RyaW5nLCBvciBnZW5lcmF0ZSBhIHNvcnQga2V5IGZyb20gaXQuCiAqCiAqIE5PVEUKICoKICogU2VlIExDTWFwU3RyaW5nMzJBIGZvciBkb2N1bWVudGF0aW9uCiAqLwpJTlQzMiBXSU5BUEkgTENNYXBTdHJpbmczMlcoCglMQ0lEIGxjaWQsRFdPUkQgbWFwZmxhZ3MsTFBDV1NUUiBzcmNzdHIsSU5UMzIgc3JjbGVuLExQV1NUUiBkc3RzdHIsCglJTlQzMiBkc3RsZW4pCnsKICBpbnQgaTsKIAogIFRSQUNFKHN0cmluZywiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZClcbiIsCglsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbik7CgogIGlmICggKChkc3RsZW4hPTApICYmIChkc3RzdHI9PU5VTEwpKSB8fCAoc3Jjc3RyPT1OVUxMKSApCiAgewogICAgRVJSKG9sZSwgIihzcmM9JXAsZHN0PSVwKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgc3Jjc3RyLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuPT0tMSkgCiAgICBzcmNsZW4gPSBsc3RybGVuMzJXKHNyY3N0cikrMTsKICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSAKICB7CiAgICBGSVhNRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbixtYXBmbGFncyk7CiAgICByZXR1cm4gMDsKICB9CiAgZWxzZQogIHsKICAgIGludCAoKmYpKGludCk9aWRlbnRpdHk7IAoKICAgIGlmIChkc3RsZW49PTApCiAgICAgIHJldHVybiBzcmNsZW47ICAKICAgIGlmIChkc3RsZW48c3JjbGVuKQogICAgICByZXR1cm4gMDsgICAgICAgCiAgICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpCiAgICAgIGYgPSB0b3VwcGVyOwogICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCiAgICAgIGYgPSB0b2xvd2VyOwogICAgZm9yIChpPTA7IGkgPCBzcmNsZW47IGkrKykKICAgICAgZHN0c3RyW2ldID0gKFdDSEFSKSBmKHNyY3N0cltpXSk7CiAgICByZXR1cm4gc3JjbGVuOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBDb21wYXJlU3RyaW5nMTYgICAgICAgKE9MRTJOTFMuOCkKICovClVJTlQxNiBXSU5BUEkgQ29tcGFyZVN0cmluZzE2KERXT1JEIGxjaWQsRFdPUkQgZmR3U3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBzMSxEV09SRCBsMSxMUENTVFIgczIsRFdPUkQgbDIpCnsKCXJldHVybiAoVUlOVDE2KUNvbXBhcmVTdHJpbmczMkEobGNpZCxmZHdTdHlsZSxzMSxsMSxzMixsMik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb21wYXJlU3RyaW5nMzJBIFtLRVJORUwzMi4yOV0gQ29tcGFyZXMgdHdvIHN0cmluZ3MgdXNpbmcgbG9jYWxlCiAqCiAqIFJFVFVSTlMKICoKICogc3VjY2VzczogQ1NUUl9MRVNTX1RIQU4sIENTVFJfRVFVQUwsIENTVFJfR1JFQVRFUl9USEFOCiAqIGZhaWx1cmU6IDAKICoKICogTk9URVMKICoKICogRGVmYXVsdHMgdG8gYSB3b3JkIHNvcnQsIGJ1dCB1c2VzIGEgc3RyaW5nIHNvcnQgaWYKICogU09SVF9TVFJJTkdTT1JUIGlzIHNldC4KICogQ2FsbHMgU2V0TGFzdEVycm9yIGZvciBFUlJPUl9JTlZBTElEX0ZMQUdTLCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUi4KICogCiAqIEJVR1MKICoKICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKICoKICogRklYTUUKICogCiAqIFF1aXRlIGluZWZmaWNpZW50LgogKi8KVUlOVDMyIFdJTkFQSSBDb21wYXJlU3RyaW5nMzJBKAogICAgRFdPUkQgbGNpZCwgICAgIC8qIGxvY2FsZSBJRCAqLwogICAgRFdPUkQgZmR3U3R5bGUsIC8qIGNvbXBhcmlzb24tc3R5bGUgb3B0aW9ucyAqLwogICAgTFBDU1RSIHMxLCAgICAgIC8qIGZpcnN0IHN0cmluZyAqLwogICAgRFdPUkQgbDEsICAgICAgIC8qIGxlbmd0aCBvZiBmaXJzdCBzdHJpbmcgKi8KICAgIExQQ1NUUiBzMiwgICAgICAvKiBzZWNvbmQgc3RyaW5nICovCiAgICBEV09SRCBsMikgICAgICAgLyogbGVuZ3RoIG9mIHNlY29uZCBzdHJpbmcgKi8KewogIGludCBtYXBzdHJpbmdfZmxhZ3M7CiAgaW50IGxlbjEsbGVuMjsKICBpbnQgcmVzdWx0OwogIExQU1RSIHNrMSxzazI7CiAgVFJBQ0Uob2xlLCIlcyBhbmQgJXNcbiIsCglkZWJ1Z3N0cl9hIChzMSksIGRlYnVnc3RyX2EgKHMyKSk7CgogIGlmICggKHMxPT1OVUxMKSB8fCAoczI9PU5VTEwpICkKICB7ICAgIAogICAgRVJSKG9sZSwgIihzMT0lcyxzMj0lcyk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHMxLCBzMik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQoKICBpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFU1lNQk9MUykKICAgIEZJWE1FKG9sZSwgIklHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CiAgCQogIG1hcHN0cmluZ19mbGFncyA9IExDTUFQX1NPUlRLRVkgfCBmZHdTdHlsZSA7CiAgbGVuMSA9IExDTWFwU3RyaW5nMzJBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMxLGwxLE5VTEwsMCk7CiAgbGVuMiA9IExDTWFwU3RyaW5nMzJBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMyLGwyLE5VTEwsMCk7CgogIGlmICgobGVuMT09MCl8fChsZW4yPT0wKSkKICAgIHJldHVybiAwOyAgICAgLyogc29tZXRoaW5nIHdyb25nIGhhcHBlbmVkICovCgogIHNrMSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbjEpOwogIHNrMiA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbjIpOwogIGlmICggKCFMQ01hcFN0cmluZzMyQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMSxsMSxzazEsbGVuMSkpCgkgfHwgKCFMQ01hcFN0cmluZzMyQShsY2lkLG1hcHN0cmluZ19mbGFncyxzMixsMixzazIsbGVuMikpICkKICB7CiAgICBFUlIob2xlLCJCdWcgaW4gTENtYXBTdHJpbmczMkEuXG4iKTsKICAgIHJlc3VsdCA9IDA7CiAgfQogIGVsc2UKICB7CiAgICAvKiBzdHJjbXAgZG9lc24ndCBuZWNlc3NhcmlseSByZXR1cm4gLTEsIDAsIG9yIDEgKi8KICAgIHJlc3VsdCA9IHN0cmNtcChzazEsc2syKTsKICB9CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHNrMSk7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHNrMik7CgogIGlmIChyZXN1bHQgPCAwKQogICAgcmV0dXJuIDE7CiAgaWYgKHJlc3VsdCA9PSAwKQogICAgcmV0dXJuIDI7CgogIC8qIG11c3QgYmUgZ3JlYXRlciwgaWYgd2UgcmVhY2ggdGhpcyBwb2ludCAqLwogIHJldHVybiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENvbXBhcmVTdHJpbmczMlcgICAgICAgKEtFUk5FTDMyLjMwKQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKiBGSVhNRSA6ICBEb2VzIG9ubHkgc3RyaW5nIHNvcnQuICBTaG91bGQKICogYmUgcmVpbXBsZW1lbnRlZCB0aGUgc2FtZSB3YXkgYXMgQ29tcGFyZVN0cmluZzMyQS4KICovClVJTlQzMiBXSU5BUEkgQ29tcGFyZVN0cmluZzMyVyhEV09SRCBsY2lkLCBEV09SRCBmZHdTdHlsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENXU1RSIHMxLCBEV09SRCBsMSwgTFBDV1NUUiBzMixEV09SRCBsMikKewoJaW50IGxlbixyZXQ7CglpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCgkJRklYTUUob2xlLCJJR05PUkVOT05TUEFDRSBub3Qgc3VwcHJ0ZWRcbiIpOwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCgkJRklYTUUob2xlLCJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwoKCS8qIElzIHN0cmNtcCBkZWZhdWx0aW5nIHRvIHN0cmluZyBzb3J0IG9yIHRvIHdvcmQgc29ydD8/ICovCgkvKiBGSVhNRTogSGFuZGxlIE5PUk1fU1RSSU5HU09SVCAqLwoJbDEgPSAobDE9PS0xKT9sc3RybGVuMzJXKHMxKTpsMTsKCWwyID0gKGwyPT0tMSk/bHN0cmxlbjMyVyhzMik6bDI7CglsZW4gPSBsMTxsMiA/IGwxOmwyOwoJcmV0ID0gKGZkd1N0eWxlICYgTk9STV9JR05PUkVDQVNFKSA/CgkJbHN0cm5jbXBpMzJXKHMxLHMyLGxlbikJOiBsc3RybmNtcDMyVyhzMSxzMixsZW4pOwoJLyogbm90IGVxdWFsLCByZXR1cm4gMSBvciAzICovCglpZihyZXQhPTApIHJldHVybiByZXQrMjsKCS8qIHNhbWUgbGVuLCByZXR1cm4gMiAqLwoJaWYobDE9PWwyKSByZXR1cm4gMjsKCS8qIHRoZSBsb25nZXIgb25lIGlzIGxleGljYWxseSBncmVhdGVyICovCglyZXR1cm4gKGwxPGwyKT8gMSA6IDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgT0xFX0dldEZvcm1hdEEoKSBbaW50ZXJuYWxdCgoKIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzdHVmZiBmb3IgR2V0RGF0ZUZvcm1hdCgpIGFuZCAKIEdldFRpbWVGb3JtYXQoKS4KCiAgZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAgTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICBNTSAgIHR3by1kaWdpdCBtb250aAogIE1NTSAgc2hvcnQgbW9udGggbmFtZQogIE1NTU0gZnVsbCBtb250aCBuYW1lCiAgeSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAgeXkgICB0d28tZGlnaXQgeWVhcgogIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAgZ2cgICBlcmEgc3RyaW5nCiAgaCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICBoaCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgSCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICBISCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgbSAgICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgbW0gICBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgcyAgICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgc3MgICBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgdCAgICB0aW1lIG1hcmtlciAoQSBvciBQKQogIHR0ICAgdGltZSBtYXJrZXIgKEFNLCBQTSkKICAnJyAgIHVzZWQgdG8gcXVvdGUgbGl0ZXJhbCBjaGFyYWN0ZXJzCiAgJycgICAod2l0aGluIGEgcXVvdGVkIHN0cmluZykgaW5kaWNhdGVzIGEgbGl0ZXJhbCAnCgogVGhlc2UgZnVuY3Rpb25zIFJFUVVJUkUgdmFsaWQgbG9jYWxlLCBkYXRlLCAgYW5kIGZvcm1hdC4gCgogKi8KCklOVDMyIFdJTkFQSSBPTEVfR2V0Rm9ybWF0QShMQ0lEIGxvY2FsZSwKCQkJICAgIERXT1JEIGZsYWdzLAoJCQkgICAgRFdPUkQgdGZsYWdzLAoJCQkgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgTFBDU1RSIF9mb3JtYXQsIAoJCQkgICAgTFBTVFIgZGF0ZSwgSU5UMzIgZGF0ZWxlbikKewogICBJTlQzMiBpbnBvcywgb3V0cG9zOwogICBpbnQgY291bnQsIHR5cGUsIGlucXVvdGUsIE92ZXJmbG93OwogICBjaGFyIGJ1Zls0MF07CiAgIGNoYXIgZm9ybWF0WzQwXTsKICAgY2hhciAqIHBvczsKICAgaW50IGJ1ZmxlbjsKCiAgIGNvbnN0IGNoYXIgKiBfZGdmbXRbXSA9IHsgIiVkIiwgIiUwMmQiIH07CiAgIGNvbnN0IGNoYXIgKiogZGdmbXQgPSBfZGdmbXQgLSAxOyAKCiAgIC8qIHJlcG9ydCwgZm9yIGRlYnVnZ2luZyAqLwogICBUUkFDRShvbGUsICIoMHglbHgsMHglbHgsIDB4JWx4LCB0aW1lKGQ9JWQsaD0lZCxtPSVkLHM9JWQpLCBmbXQ6XCclc1wnIChhdCAlcCksICVwICglcyksIGxlbj0lZClcbiIsCiAgIAkgbG9jYWxlLCBmbGFncywgdGZsYWdzLAoJIHh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKCSBmb3JtYXQsIGZvcm1hdCwgZGF0ZSwgZGF0ZSwgZGF0ZWxlbik7CiAgCiAgIC8qIGluaXRhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgYW5kIG91dHB1dCBidWZmZXIgKi8KICAgaW5wb3MgPSBvdXRwb3MgPSAwOwogICBjb3VudCA9IDA7IGlucXVvdGUgPSAwOyBPdmVyZmxvdyA9IDA7CiAgIHR5cGUgPSAnXDAnOwogICBkYXRlWzBdID0gYnVmWzBdID0gJ1wwJzsKICAgICAgCiAgIHN0cmNweShmb3JtYXQsX2Zvcm1hdCk7CgogICAvKiBhbHRlciB0aGUgZm9ybWF0c3RyaW5nLCB3aGlsZSBpdCB3b3JrcyBmb3IgYWxsIGxhbmd1YWdlcyBub3cgaW4gd2luZQogICBpdHMgcG9zc2libGUgdGhhdCBpdCBmYWlscyB3aGVuIHRoZSB0aW1lIGxvb2tzIGxpa2Ugc3M6bW06aGggYXMgZXhhbXBsZSovICAgCiAgIGlmICh0ZmxhZ3MgJiAoVElNRV9OT01JTlVURVNPUlNFQ09ORFMpKQogICB7IGlmICgocG9zID0gc3Ryc3RyICggZm9ybWF0LCAiOm1tIikpKQogICAgIHsgbWVtY3B5ICggcG9zLCBwb3MrMywgc3RybGVuKGZvcm1hdCktKHBvcy1mb3JtYXQpLTIgKTsKICAgICB9CiAgIH0KICAgaWYgKHRmbGFncyAmIChUSU1FX05PU0VDT05EUykpCiAgIHsgaWYgKChwb3MgPSBzdHJzdHIgKCBmb3JtYXQsICI6c3MiKSkpCiAgICAgeyBtZW1jcHkgKCBwb3MsIHBvcyszLCBzdHJsZW4oZm9ybWF0KS0ocG9zLWZvcm1hdCktMiApOwogICAgIH0KICAgfQogICAKICAgZm9yIChpbnBvcyA9IDA7OyBpbnBvcysrKSB7CiAgICAgIC8qIFRSQUNFKG9sZSwgIlNUQVRFIGlucG9zPSUyZCBvdXRwb3M9JTJkIGNvdW50PSVkIGlucXVvdGU9JWQgdHlwZT0lYyBidWYsZGF0ZSA9ICVjLCVjXG4iLCBpbnBvcywgb3V0cG9zLCBjb3VudCwgaW5xdW90ZSwgdHlwZSwgYnVmW2lucG9zXSwgZGF0ZVtvdXRwb3NdKTsgKi8KICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MgKz0gMTsKCSAgICAgICBkYXRlW291dHBvcysrXSA9ICdcJyc7CgkgICAgfSBlbHNlIHsKCSAgICAgICBpbnF1b3RlID0gMDsKCSAgICAgICBjb250aW51ZTsgLyogd2UgZGlkIG5vdGhpbmcgdG8gdGhlIG91dHB1dCAqLwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIGRhdGVbb3V0cG9zKytdID0gJ1wwJzsKCSAgICBpZiAob3V0cG9zID4gZGF0ZWxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOwoJIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSB7CgkgICAgICAgT3ZlcmZsb3cgPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zLTFdID0gJ1wwJzsgLyogdGhpcyBpcyB0aGUgbGFzdCBwbGFjZSB3aGVyZQoJCQkJCSBpdCdzIHNhZmUgdG8gd3JpdGUgKi8KCSAgICAgICBicmVhazsKCSAgICB9CgkgfQogICAgICB9IGVsc2UgaWYgKCAgKGNvdW50ICYmIChmb3JtYXRbaW5wb3NdICE9IHR5cGUpKQoJCSAgIHx8IGNvdW50ID09IDQKCQkgICB8fCAoY291bnQgPT0gMiAmJiBzdHJjaHIoImdoSG1zdCIsIHR5cGUpKSApCiAgICAgICB7CgkgICAgaWYgICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NEQVlOQU1FMQoJCQkJICAgKyB4dGltZS0+d0RheU9mV2VlayAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkJICAgR2V0TG9jYWxlSW5mbzMyQShsb2NhbGUsIAoJCQkJCSAgICBMT0NBTEVfU0FCQlJFVkRBWU5BTUUxIAoJCQkJCSAgICArIHh0aW1lLT53RGF5T2ZXZWVrIC0gMSwKCQkJCQkgICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJICAgICAgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53RGF5KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgICAgIGlmIChjb3VudCA9PSAzKSB7CgkJICBHZXRMb2NhbGVJbmZvMzJBKGxvY2FsZSwgCgkJCQkgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLAoJCQkJICAgTE9DQUxFX1NNT05USE5BTUUxCgkJCQkgICArIHh0aW1lLT53TW9udGggLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgICAgIGlmIChjb3VudCA9PSA0KSB7CgkJICAgICAgc3ByaW50ZihidWYsICIlZCIsIHh0aW1lLT53WWVhcik7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkJICBzdHJjcHkoYnVmLCAieXl5Iik7CgkJICBXQVJOKG9sZSwgInVua25vd24gZm9ybWF0LCBjPSVjLCBuPSVkXG4iLCAgdHlwZSwgY291bnQpOwoJCSB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJCSAgRklYTUUob2xlLCAiTE9DQUxFX0lDQUxFTkRBUlRZUEUgdW5pbXAuXG4iKTsKCQkgIHN0cmNweShidWYsICJBRCIpOwoJICAgIH0gZWxzZSB7CgkJICBzdHJjcHkoYnVmLCAiZyIpOwoJCSAgV0FSTihvbGUsICJ1bmtub3duIGZvcm1hdCwgYz0lYywgbj0lZFxuIiwgdHlwZSwgY291bnQpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2gnKSB7CgkgICAgICAgLyogZ2l2ZXMgdXMgaG91cnMgMTowMCAtLSAxMjowMCAqLwoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICAgICAvKiAyNC1ob3VyIHRpbWUgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0hvdXIpOwoJICAgIH0gZWxzZSBpZiAoIHR5cGUgPT0gJ20nKSB7CgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndNaW51dGUpOwoJICAgIH0gZWxzZSBpZiAoIHR5cGUgPT0gJ3MnKSB7CgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndTZWNvbmQpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAndCcpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDEpIHsKCQkgIHNwcmludGYoYnVmLCAiJWMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gJ0EnIDogJ1AnKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDIpIHsKCQkgIC8qIHNwcmludGYoYnVmLCAiJXMiLCAoeHRpbWUtPndIb3VyIDwgMTIpID8gIkFNIiA6ICJQTSIpOyAqLwoJCSAgR2V0TG9jYWxlSW5mbzMyQShsb2NhbGUsCgkJCQkgICAoeHRpbWUtPndIb3VyPDEyKSAKCQkJCSAgID8gTE9DQUxFX1MxMTU5IDogTE9DQUxFX1MyMzU5LAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfQoJICAgIH07CgoJICAgIC8qIHdlIG5lZWQgdG8gY2hlY2sgdGhlIG5leHQgY2hhciBpbiB0aGUgZm9ybWF0IHN0cmluZyAKCSAgICAgICBhZ2Fpbiwgbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQgKi8KCSAgICBpbnBvcy0tOwoJICAgIAoJICAgIC8qIGFkZCB0aGUgY29udGVudHMgb2YgYnVmIHRvIHRoZSBvdXRwdXQgKi8KCSAgICBidWZsZW4gPSBzdHJsZW4oYnVmKTsKCSAgICBpZiAob3V0cG9zICsgYnVmbGVuIDwgZGF0ZWxlbikgewoJICAgICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7IC8qIGZvciBzdHJjYXQgdG8gaG9vayBvbnRvICovCgkJIHN0cmNhdChkYXRlLCBidWYpOwoJICAgICAgIG91dHBvcyArPSBidWZsZW47CgkgICAgfSBlbHNlIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOwoJICAgICAgIHN0cm5jYXQoZGF0ZSwgYnVmLCBkYXRlbGVuIC0gb3V0cG9zKTsKCQkgZGF0ZVtkYXRlbGVuIC0gMV0gPSAnXDAnOwoJCSBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgICAgICAgV0FSTihvbGUsICJpbnN1ZmZpY2llbnQgYnVmZmVyXG4iKTsKCQkgcmV0dXJuIDA7CgkgICAgfQoKCSAgICAvKiByZXNldCB0aGUgdmFyaWFibGVzIHdlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGlzIGl0ZW0gKi8KCSAgICBjb3VudCA9IDA7CgkgICAgdHlwZSA9ICdcMCc7CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcMCcpIHsKCSAgICAvKiB3ZSBjYW4ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgbG9vcC1oZWFkLCBiZWNhdXNlCgkgICAgICAgdGhhdCBicmVha3MgdGhlIHByaW50aW5nIG9mIHRoZSBsYXN0IGZvcm1hdC1pdGVtICovCgkgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChjb3VudCkgewoJICAgIC8qIGNvbnRpbnVpbmcgYSBjb2RlIGZvciBhbiBpdGVtICovCgkgICAgY291bnQgKz0xOwoJICAgIGNvbnRpbnVlOwoJIH0gZWxzZSBpZiAoc3RyY2hyKCJoSG1zdHlNZGciLCBmb3JtYXRbaW5wb3NdKSkgewoJICAgIHR5cGUgPSBmb3JtYXRbaW5wb3NdOwoJICAgIGNvdW50ID0gMTsKCSAgICBjb250aW51ZTsKCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJICAgIGlucXVvdGUgPSAxOwoJICAgIGNvbnRpbnVlOwogICAgICAgfSBlbHNlIHsKCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CgkgfQogICAgICAvKiBub3cgZGVhbCB3aXRoIGEgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93ICovCiAgICAgIGlmIChvdXRwb3MgPj0gZGF0ZWxlbikgewogICAgICAgZGF0ZVtkYXRlbGVuIC0gMV0gPSAnXDAnOwogICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgfQogICAKICAgaWYgKE92ZXJmbG93KSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgfTsKCiAgIC8qIGZpbmlzaCBpdCBvZmYgd2l0aCBhIHN0cmluZyB0ZXJtaW5hdG9yICovCiAgIG91dHBvcysrOwogICAvKiBzYW5pdHkgY2hlY2sgKi8KICAgaWYgKG91dHBvcyA+IGRhdGVsZW4tMSkgb3V0cG9zID0gZGF0ZWxlbi0xOwogICBkYXRlW291dHBvc10gPSAnXDAnOwogICAKICAgVFJBQ0Uob2xlLCAiT0xFX0dldEZvcm1hdEEgcmV0dXJucyBzdHJpbmcgJyVzJywgbGVuICVkXG4iLAoJICAgICAgIGRhdGUsIG91dHBvcyk7CiAgIHJldHVybiBvdXRwb3M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEVfR2V0Rm9ybWF0VyAgW2ludGVybmFsXSAgCiAqLwpJTlQzMiBXSU5BUEkgT0xFX0dldEZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGZsYWdzLCBEV09SRCB0ZmxhZ3MsCgkJCSAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICBMUENXU1RSIGZvcm1hdCwKCQkJICAgIExQV1NUUiBvdXRwdXQsIElOVDMyIG91dGxlbikKewogICBJTlQzMiAgIGlucG9zLCBvdXRwb3M7CiAgIGludCAgICAgY291bnQsIHR5cGU9MCwgaW5xdW90ZTsKICAgaW50ICAgICBPdmVyZmxvdzsgLyogbG9vcCBjaGVjayAqLwogICBpbnQgdXNlZGF0ZSwgdXNldGltZTsKICAgV0NIQVIgICBidWZbNDBdOwogICBpbnQgICAgIGJ1Zmxlbj0wOwogICBjaGFyICAgIGFidWZbNDBdOwogICBXQ0hBUiAgIGFyZzBbXSA9IHswfSwgYXJnMVtdID0geyclJywnZCcsMH07CiAgIFdDSEFSICAgYXJnMltdID0geyclJywnMCcsJzInLCdkJywwfTsKICAgV0NIQVIgICphcmdhcnJbXSA9IHthcmcwLCBhcmcxLCBhcmcyfTsKICAgaW50ICAgICBkYXRldmFycz0wLCB0aW1ldmFycz0wOwoKICAgLyogbWFrZSBhIGRlYnVnIHJlcG9ydCAqLwogICBsc3RyY3B5bld0b0EoYWJ1ZiwgZm9ybWF0LCBzaXplb2YoZm9ybWF0KSk7CiAgIFRSQUNFKG9sZSwgImFyZ3M6IDB4JWx4LCAweCVseCwgMHglbHgsIHRpbWUoZD0lZCxoPSVkLG09JWQscz0lZCksIGZtdDpcJyVzXCcgKGF0ICVwKSwgJXAgd2l0aCBtYXggbGVuICVkXG4iLAoJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgYWJ1ZiwgZm9ybWF0LCBvdXRwdXQsIG91dGxlbik7CiAgIAoKICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KICAgaW5wb3MgPSBvdXRwb3MgPSAwOwogICBjb3VudCA9IDA7CiAgIGlucXVvdGUgPSBPdmVyZmxvdyA9IDA7CiAgIC8qIHRoaXMgaXMgcmVhbGx5IGp1c3QgYSBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cHV0WzBdID0gYnVmWzBdID0gMDsKICAgYWJ1ZlswXSA9ICdcMCc7CiAgIC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2ZmaWNpYWwgV2luZG93cyBiZWhhdmlvciAqLwogICB1c2VkYXRlID0gZmxhZ3MgJiBEQVRFX0RBVEVWQVJTT05MWTsKICAgdXNldGltZSA9IGZsYWdzICYgVElNRV9USU1FVkFSU09OTFk7CiAgIAogICAvKiB0aGlzIGxvb3AgaXMgdGhlIGNvcmUgb2YgdGhlIGZ1bmN0aW9uICovCiAgIGZvciAoaW5wb3MgPSAwOyAvKiB3ZSBoYXZlIHNldmVyYWwgYnJlYWsgcG9pbnRzICovIDsgaW5wb3MrKykgewogICAgICBpZiAoaW5xdW90ZSkgewoJIGlmIChmb3JtYXRbaW5wb3NdID09IChXQ0hBUikgJ1wnJykgewoJICAgIGlmIChmb3JtYXRbaW5wb3MrMV0gPT0gJ1wnJykgewoJICAgICAgIGlucG9zKys7CgkgICAgICAgb3V0cHV0W291dHBvcysrXSA9ICdcJyc7CgkgICAgfSBlbHNlIHsKCSAgICAgICBpbnF1b3RlID0gMDsKCSAgICAgICBjb250aW51ZTsKCSAgICB9CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09IDApIHsKCSAgICBvdXRwdXRbb3V0cG9zKytdID0gMDsKCSAgICBpZiAob3V0cG9zID4gb3V0bGVuKSBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7ICAvKiAgbm9ybWFsIGV4aXQgKHdpdGhpbiBhIHF1b3RlKSAqLwoJIH0gZWxzZSB7CgkgICAgb3V0cHV0W291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107IC8qIGNvcHkgaW5wdXQgKi8KCSAgICBpZiAob3V0cG9zID4gb3V0bGVuKSB7CgkgICAgICAgT3ZlcmZsb3cgPSAxOwoJICAgICAgIG91dHB1dFtvdXRwb3MtMV0gPSAwOyAKCSAgICAgICBicmVhazsKCSAgICB9CgkgfQogICAgICB9IGVsc2UgaWYgKCAgKGNvdW50ICYmIChmb3JtYXRbaW5wb3NdICE9IHR5cGUpKQoJCSAgIHx8ICggKGNvdW50PT00ICYmIHR5cGUgPT0neScpIHx8CgkJCShjb3VudD09NCAmJiB0eXBlID09J00nKSB8fAoJCQkoY291bnQ9PTQgJiYgdHlwZSA9PSdkJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nZycpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J2gnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdIJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nbScpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J3MnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSd0JykgKSAgKSB7CgkgaWYgICAgICAgICh0eXBlID09ICdkJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm8zMlcobG9jYWxlLAoJCQkgICAgIExPQ0FMRV9TREFZTkFNRTEgKyB4dGltZS0+d0RheU9mV2VlayAtMSwKCQkJICAgICBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwKCQkJCUxPQ0FMRV9TQUJCUkVWREFZTkFNRTEgKwoJCQkJeHRpbWUtPndEYXlPZldlZWsgLTEsCgkJCQlidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIHh0aW1lLT53RGF5ICk7CgkgICAgfTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ00nKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSA0KSB7CgkgICAgICAgR2V0TG9jYWxlSW5mbzMyVyhsb2NhbGUsICBMT0NBTEVfU01PTlRITkFNRTEgKwoJCQkJeHRpbWUtPndNb250aCAtMSwgYnVmLAoJCQkJc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm8zMlcobG9jYWxlLCAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIHh0aW1lLT53TW9udGgpOwoJICAgIH0KCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ3knKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSA0KSB7CgkgICAgICAgd3NucHJpbnRmMzJXKGJ1ZiwgNiwgYXJnYXJyWzFdIC8qICIlZCIgKi8sCgkJCSB4dGltZS0+d1llYXIpOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJ5eXkiLCA1KTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZjMyVyhidWYsIDYsIGFyZ2Fycltjb3VudF0sCgkJCSAgICB4dGltZS0+d1llYXIgJSAxMDApOwoJICAgIH0KCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ2cnKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAyKSB7CgkgICAgICAgRklYTUUob2xlLCAiTE9DQUxFX0lDQUxFTkRBUlRZUEUgdW5pbXBsZW1lbnRlZFxuIik7CgkgICAgICAgbHN0cmNweW5BdG9XKGJ1ZiwgIkFEIiwgNSk7CgkgICAgfSBlbHNlIHsKCSAgICAgICAvKiBXaW4gQVBJIHNleiB3ZSBjb3B5IGl0IHZlcmJhdGltICovCgkgICAgICAgbHN0cmNweW5BdG9XKGJ1ZiwgImciLCA1KTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICdoJykgewoJICAgIC8qIGhvdXJzIDE6MDAtMTI6MDAgLS0tIGlzIHRoaXMgcmlnaHQ/ICovCgkgICAgd3NucHJpbnRmMzJXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgCgkJCSAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ0gnKSB7CgkgICAgd3NucHJpbnRmMzJXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgCgkJCSB4dGltZS0+d0hvdXIpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnbScgKSB7CgkgICAgd3NucHJpbnRmMzJXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwKCQkJIHh0aW1lLT53TWludXRlKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ3MnICkgewoJICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sCgkJCSB4dGltZS0+d1NlY29uZCk7CgkgfSBlbHNlIGlmICh0eXBlID09ICd0JykgewoJICAgIEdldExvY2FsZUluZm8zMlcobG9jYWxlLCAoeHRpbWUtPndIb3VyIDwgMTIpID8KCQkJICAgICBMT0NBTEVfUzExNTkgOiBMT0NBTEVfUzIzNTksCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKSApOwoJICAgIGlmICAgICAgICAoY291bnQgPT0gMSkgewoJICAgICAgIGJ1ZlsxXSA9IDA7CgkgICAgfQp9CgoJIC8qIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkLCAgd2UgbmVlZCB0byBjaGVjayB0aGlzIG5leHQgCgkgICAgY2hhcmFjdGVyIHRoZSBuZXh0IHRpbWUgd2UgbG9vcCB0aHJvdWdoICovCgkgaW5wb3MtLTsKCgkgLyogY2F0IGJ1ZiBvbnRvIHRoZSBvdXRwdXQgKi8KCSBvdXRsZW4gPSBsc3RybGVuMzJXKGJ1Zik7CgkgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IG91dGxlbikgewoJICAgIG91dHB1dFtvdXRwb3NdID0gMDsgIC8qIGEgImhvb2siIGZvciBzdHJjYXQgKi8KCSAgICBsc3RyY2F0MzJXKG91dHB1dCwgYnVmKTsKCSAgICBvdXRwb3MgKz0gYnVmbGVuOwoJIH0gZWxzZSB7CgkgICAgb3V0cHV0W291dHBvc10gPSAwOwoJICAgIGxzdHJjYXRuMzJXKG91dHB1dCwgYnVmLCBvdXRsZW4gLSBvdXRwb3MpOwoJICAgIG91dHB1dFtvdXRsZW4gLSAxXSA9IDA7CgkgICAgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAvKiBBYm5vcm1hbCBleGl0ICovCgkgfQoKCSAvKiByZXNldCB0aGUgdmFyaWFibGVzIHdlIHVzZWQgdGhpcyB0aW1lICovCgkgY291bnQgPSAwOwoJIHR5cGUgPSAnXDAnOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJIC8qIHdlIGNhbid0IGNoZWNrIGZvciB0aGlzIGF0IHRoZSBiZWdpbm5pbmcsICBiZWNhdXNlIHRoYXQgCgkgd291bGQga2VlcCB1cyBmcm9tIHByaW50aW5nIGEgZm9ybWF0IHNwZWMgdGhhdCBlbmRlZCB0aGUgCgkgc3RyaW5nICovCgkgb3V0cHV0W291dHBvc10gPSAwOwoJIGJyZWFrOyAgLyogIE5PUk1BTCBFWElUICAqLwogICAgICB9IGVsc2UgaWYgKGNvdW50KSB7CgkgLyogaG93IHdlIGtlZXAgdHJhY2sgb2YgdGhlIG1pZGRsZSBvZiBhIGZvcm1hdCBzcGVjICovCgkgY291bnQrKzsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmICggKGRhdGV2YXJzICYmIChmb3JtYXRbaW5wb3NdPT0nZCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdNJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3knIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nZycpICApIHx8CgkJICAodGltZXZhcnMgJiYgKGZvcm1hdFtpbnBvc109PSdIJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J2gnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nbScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdzJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3QnKSApICAgICkgewoJIHR5cGUgPSBmb3JtYXRbaW5wb3NdOwoJIGNvdW50ID0gMTsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSBpbnF1b3RlID0gMTsKCSBjb250aW51ZTsKICAgICAgfSBlbHNlIHsKCSAvKiB1bnF1b3RlZCBsaXRlcmFscyAqLwoJIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwogICAgICB9CiAgIH0KCiAgIGlmIChPdmVyZmxvdykgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIFdBUk4ob2xlLCAiIGJ1ZmZlciBvdmVyZmxvd1xuIik7CiAgIH07CgogICAvKiBmaW5hbCBzdHJpbmcgdGVybWluYXRvciBhbmQgc2FuaXR5IGNoZWNrICovCiAgIG91dHBvcysrOwogICBpZiAob3V0cG9zID4gb3V0bGVuLTEpIG91dHBvcyA9IG91dGxlbi0xOwogICBvdXRwdXRbb3V0cG9zXSA9ICcwJzsKCiAgIGxzdHJjcHluV3RvQShhYnVmLCBvdXRwdXQsIHNpemVvZihhYnVmKSApOwogICBUUkFDRShvbGUsICIgcmV0dXJuaW5nIHN0cmluZyBcJyVzXCdcbiIsIGFidWYpOwoJCiAgIHJldHVybiAoIU92ZXJmbG93KSA/IG91dGxlbiA6IDA7CiAgIAp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBHZXREYXRlRm9ybWF0MzJBKCkgW0tFUk5FTDMyLjMxMF0gTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIFRoaXMgZnVuY3Rpb24gdXNlcyBmb3JtYXQgdG8gZm9ybWF0IHRoZSBkYXRlLCAgb3IsICBpZiBmb3JtYXQKICogaXMgTlVMTCwgdXNlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGxvY2FsZS4gIGZvcm1hdCBpcyBhIHN0cmluZwogKiBvZiBsaXRlcmFsIGZpZWxkcyBhbmQgY2hhcmFjdGVycyBhcyBmb2xsb3dzOgogKgogKiAtIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCiAqIC0gZGQgICB0d28tZGlnaXQgZGF5IChvZiBtb250aCkKICogLSBkZGQgIHNob3J0IGRheS1vZi13ZWVrIG5hbWUKICogLSBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQogKiAtIE0gICAgc2luZ2xlLWRpZ2l0IG1vbnRoCiAqIC0gTU0gICB0d28tZGlnaXQgbW9udGgKICogLSBNTU0gIHNob3J0IG1vbnRoIG5hbWUKICogLSBNTU1NIGZ1bGwgbW9udGggbmFtZQogKiAtIHkgICAgdHdvLWRpZ2l0IHllYXIsIG5vIGxlYWRpbmcgMAogKiAtIHl5ICAgdHdvLWRpZ2l0IHllYXIKICogLSB5eXl5IGZvdXItZGlnaXQgeWVhcgogKiAtIGdnICAgZXJhIHN0cmluZwogKgogKi8KCklOVDMyIFdJTkFQSSBHZXREYXRlRm9ybWF0MzJBKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICAgIExQQ1NUUiBmb3JtYXQsIExQU1RSIGRhdGUsSU5UMzIgZGF0ZWxlbikgCnsKICAgCiAgY2hhciBmb3JtYXRfYnVmWzQwXTsKICBMUENTVFIgdGhpc2Zvcm1hdDsKICBTWVNURU1USU1FIHQ7CiAgTFBTWVNURU1USU1FIHRoaXN0aW1lOwogIExDSUQgdGhpc2xvY2FsZTsKCiAgSU5UMzIgcmV0OwoKICBUUkFDRShvbGUsIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLAoJICAgICAgbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCxkYXRlLGRhdGVsZW4pOwogIAogIGlmICghbG9jYWxlKSB7CiAgICAgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwogICAgIH07CiAgCiAgaWYgKGxvY2FsZSA9PSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwogIH0gZWxzZSB7CiAgICAgdGhpc2xvY2FsZSA9IGxvY2FsZTsKICAgfTsKCiAgaWYgKHh0aW1lID09IE5VTEwpIHsKICAgICBHZXRTeXN0ZW1UaW1lKCZ0KTsKICAgICB0aGlzdGltZSA9ICZ0OwogIH0gZWxzZSB7CiAgICAgdGhpc3RpbWUgPSB4dGltZTsKICB9OwoKICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKICAgICBHZXRMb2NhbGVJbmZvMzJBKHRoaXNsb2NhbGUsICgoZmxhZ3MmREFURV9MT05HREFURSkgCgkJCQkgICA/IExPQ0FMRV9TTE9OR0RBVEUKCQkJCSAgIDogTE9DQUxFX1NTSE9SVERBVEUpLAoJCSAgICAgIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICAgdGhpc2Zvcm1hdCA9IGZvcm1hdF9idWY7CiAgfSBlbHNlIHsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0OwogIH07CgogIAogIHJldCA9IE9MRV9HZXRGb3JtYXRBKHRoaXNsb2NhbGUsIGZsYWdzLCAwLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwgCgkJICAgICAgIGRhdGUsIGRhdGVsZW4pOwogIAoKICAgVFJBQ0Uob2xlLCAKCSAgICAgICAiR2V0RGF0ZUZvcm1hdDMyQSgpIHJldHVybmluZyAlZCwgd2l0aCBkYXRhPSVzXG4iLAoJICAgICAgIHJldCwgZGF0ZSk7CiAgcmV0dXJuIHJldDsKfQoKLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBHZXREYXRlRm9ybWF0MzJXKCkgW0tFUk5FTDMyLjMxMV0gTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgZGF0ZQogKgogKiBBY3RzIHRoZSBzYW1lIGFzIEdldERhdGVGb3JtYXQzMkEoKSwgIGV4Y2VwdCB0aGF0IGl0J3MgVW5pY29kZS4KICogQWNjZXB0cyAmIHJldHVybnMgc2l6ZXMgYXMgY291bnRzIG9mIFVuaWNvZGUgY2hhcmFjdGVycy4KICoKICovCklOVDMyIFdJTkFQSSBHZXREYXRlRm9ybWF0MzJXKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgICBMUFdTVFIgZGF0ZSwgSU5UMzIgZGF0ZWxlbikKewogICBzaG9ydCBkYXRlYXJyW10gPSB7JzEnLCc5JywnOScsJzQnLCctJywnMScsJy0nLCcxJywwfTsKCiAgIEZJWE1FKG9sZSwgIlNUVUIgKHNob3VsZCBjYWxsIE9MRV9HZXRGb3JtYXRXKVxuIik7ICAgCiAgIGxzdHJjcHluMzJXKGRhdGUsIGRhdGVhcnIsIGRhdGVsZW4pOwogICByZXR1cm4gKCAgZGF0ZWxlbiA8IDkpID8gZGF0ZWxlbiA6IDk7CiAgIAogICAKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0MzJBCShLRVJORUwzMi4zNTUpCiAqIE5PVEU6IHR5cGUgb2YgbHBGb3JtYXQgc2hvdWxkIGJlIENPTlNUIE5VTUJFUkZPUk1BVCAKICovCklOVDMyIFdJTkFQSSBHZXROdW1iZXJGb3JtYXQzMkEoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENTVFIgbHB2YWx1ZSwgIGNoYXIgKmxwRm9ybWF0LAoJCQkgICAgICAgTFBTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCnsKIGludCBuOwoKIEZJWE1FKGZpbGUsIiVzOiBzdHViLCBubyByZWZvcm1hdGluZyBkb25lXG4iLGxwdmFsdWUpOwoKIG4gPSBzdHJsZW4obHB2YWx1ZSk7CiBpZiAoY2NoTnVtYmVyKSB7IAogICBzdHJuY3B5KGxwTnVtYmVyU3RyLGxwdmFsdWUsY2NoTnVtYmVyKTsKICAgaWYgKGNjaE51bWJlciA8PSBuKSB7CiAgICAgbHBOdW1iZXJTdHJbY2NoTnVtYmVyLTFdID0gMDsKICAgICBuID0gY2NoTnVtYmVyLTE7CiAgIH0KIH0KIHJldHVybiBuOwp9CiAKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogR2V0VGltZUZvcm1hdDMyQSgpIFtLRVJORUwzMi40MjJdIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgdGltZQogKgogKiBGb3JtYXRzIGRhdGUgYWNjb3JkaW5nIHRvIGZvcm1hdCwgIG9yIGxvY2FsZSBkZWZhdWx0IGlmIGZvcm1hdCBpcwogKiBOVUxMLiBUaGUgZm9ybWF0IGNvbnNpc3RzIG9mIGxpdGVyYWwgY2hhcmFjdGVycyBhbmQgZmllbGRzIGFzIGZvbGxvd3M6CiAqCiAqIGggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogKiBoaCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBIICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICogSEggaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogbSAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBtbSBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHMgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICogc3Mgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiB0ICB0aW1lIG1hcmtlciAoQSBvciBQKQogKiB0dCB0aW1lIG1hcmtlciAoQU0sIFBNKQogKgogKi8KCklOVDMyIFdJTkFQSSAKR2V0VGltZUZvcm1hdDMyQShMQ0lEIGxvY2FsZSwgICAgICAgIC8qIGluICAqLwoJCSBEV09SRCBmbGFncywgICAgICAgIC8qIGluICAqLwoJCSBMUFNZU1RFTVRJTUUgeHRpbWUsIC8qIGluICAqLyAKCQkgTFBDU1RSIGZvcm1hdCwgICAgICAvKiBpbiAgKi8KCQkgTFBTVFIgdGltZXN0ciwgICAgICAvKiBvdXQgKi8KCQkgSU5UMzIgdGltZWxlbiAgICAgICAvKiBpbiAgKi8pIAp7IGNoYXIgZm9ybWF0X2J1Zls0MF07CiAgTFBDU1RSIHRoaXNmb3JtYXQ7CiAgU1lTVEVNVElNRSB0OwogIExQU1lTVEVNVElNRSB0aGlzdGltZTsKICBMQ0lEIHRoaXNsb2NhbGU9MDsKICBEV09SRCB0aGlzZmxhZ3M9TE9DQUxFX1NUSU1FRk9STUFUOyAvKiBzdGFuZGFydCB0aW1lZm9ybWF0ICovOwogIAogIFRSQUNFKG9sZSwiR2V0VGltZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLGxvY2FsZSxmbGFncyx4dGltZSxmb3JtYXQsdGltZXN0cix0aW1lbGVuKTsKCiAgaWYgKCFsb2NhbGUpIAogIHsgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwogIH0KICAKICBpZiAobG9jYWxlID09IExPQ0FMRV9TWVNURU1fREVGQVVMVCkgCiAgeyB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICB9IAogIGVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSAKICB7IHRoaXNsb2NhbGUgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKICB9CiAgZWxzZQogIHsgdGhpc2xvY2FsZSA9IGxvY2FsZTsKICB9CgogIGlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCiAgeyBGSVhNRShvbGUsIlRJTUVfTk9USU1FTUFSS0VSIG9yIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQgbm90IGltcGxlbWVudGVkXG4iKTsKICB9CiAgZmxhZ3MgJj0gKFRJTUVfTk9TRUNPTkRTIHwgVElNRV9OT01JTlVURVNPUlNFQ09ORFMpOyAvKiBtYXNrIGZvciBPTEVfR2V0Rm9ybWF0QSovCgogIGlmIChmb3JtYXQgPT0gTlVMTCkgCiAgeyBpZiAoZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpICAvKnVzZSBzeXN0ZW0gZGVmYXVsdCovCiAgICB7IHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICAgfQogICAgR2V0TG9jYWxlSW5mbzMyQSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9CiAgZWxzZSAKICB7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfQogIAogIGlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KICB7IEdldFN5c3RlbVRpbWUoJnQpOwogICAgdGhpc3RpbWUgPSAmdDsKICB9IAogIGVsc2UKICB7IHRoaXN0aW1lID0geHRpbWU7CiAgfQogIHJldHVybiBPTEVfR2V0Rm9ybWF0QSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZsYWdzLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwgdGltZXN0ciwgdGltZWxlbik7Cn0KCgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBHZXRUaW1lRm9ybWF0MzJXKCkgIFtLRVJORUwzMi40MjNdIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIHRpbWUKICogCiAqCiAqLwoKSU5UMzIgV0lOQVBJIApHZXRUaW1lRm9ybWF0MzJXKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICAgIExQQ1dTVFIgZm9ybWF0LCAKCQkJICAgICAgTFBXU1RSIHRpbWVzdHIsSU5UMzIgdGltZWxlbikgCnsKICAgY2hhciBkZWJ1Z2J1Zls0MF07CiAgIFdDSEFSIGJ1ZlsyMF07CiAgIExQQ1dTVFIgcmVhbGZvcm1hdD0wOwogICBTWVNURU1USU1FIHQ7CiAgIExQU1lTVEVNVElNRSByZWFsdGltZTsKICAgV0NIQVIgKiBmbXRfYnVmID0gTlVMTDsKICAgaW50IGZtdF9idWZfc2l6ZSA9IDA7IC8qIHVuaXRzIG9mIFdDSEFScyAqLwogICBJTlQzMiByZXR2YWw7CiAgIAogICBsc3RyY3B5bld0b0EoZGVidWdidWYsIGZvcm1hdCwgKHNpemVvZihidWYpKS8yKTsKICAgVFJBQ0Uob2xlLCAiR2V0VGltZUZvcm1hdFcgbGVuICVkIGZsYWdzIDB4JWxYIGZvcm1hdCA+JXM8XG4iLAoJCXRpbWVsZW4sIGZsYWdzLCBkZWJ1Z2J1Zik7CgogICAvKiBFbmZvcmNlIHRoZSBXaW5kb3dzIGJlaGF2aW9yICovCiAgIGZsYWdzIHw9IH5MT0NBTEVfVElNRURBVEVCT1RIOwogICBmbGFncyB8PSBUSU1FX1RJTUVWQVJTT05MWTsKCiAgIC8qIHRha2UgY2FyZSBvZiB0aGUgZm9ybWF0IG9yIGxvY2FsZSBub3QgYmVpbmcgZ2l2ZW4gKi8KICAgaWYgKGZvcm1hdCkgewogICAgICByZWFsZm9ybWF0ID0gZm9ybWF0OwogICB9IGVsc2UgaWYgKGxvY2FsZSkgewogICAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KICAgICAgcmV0dmFsID0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUjsKICAgICAgZm10X2J1ZiA9IG1hbGxvYygoZm10X2J1Zl9zaXplKz03KSAqIHNpemVvZihXQ0hBUikpOwogICAgICBpZiAoIWZtdF9idWYpCglnb3RvIG91dF9ub21lbTsKCiAgICAgIHdoaWxlKCFHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwgTE9DQUxFX1NUSU1FRk9STUFULAoJCQkgICAgICBmbXRfYnVmLCBmbXRfYnVmX3NpemUpKSB7CglyZXR2YWwgPSBFUlJPUl9PVVRPRk1FTU9SWTsKCWZtdF9idWYgPSByZWFsbG9jKGZtdF9idWYsIAoJCQkgICAoZm10X2J1Zl9zaXplICs9IDEwKSAqIHNpemVvZihXQ0hBUikpOwoJaWYgKCFmbXRfYnVmKQoJCWdvdG8gb3V0X25vbWVtOwogICAgICB9CiAgICAgIHJlYWxmb3JtYXQgPSBmbXRfYnVmOwogICB9IGVsc2UgewogICAgICBGSVhNRShvbGUsICAiY2FsbGVyIGdhdmUgbm8gbG9jYWxlLCAgbm8gZm9ybWF0OyAgd2hhdCBzaG91bGQgd2UgZG8/XG4iKTsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0JBRF9GT1JNQVQpOwogICB9CiAgIGlmICghbG9jYWxlKQogICAgICBsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoKICAgcmVhbHRpbWUgPSB4dGltZTsKICAgaWYgKCFyZWFsdGltZSkgewogICAgICByZWFsdGltZSA9ICZ0OwogICAgICBHZXRTeXN0ZW1UaW1lKHJlYWx0aW1lKTsKICAgfQoKICAgcmV0dmFsID0gT0xFX0dldEZvcm1hdFcobG9jYWxlLCBmbGFncywgMCwgcmVhbHRpbWUsIHJlYWxmb3JtYXQsIHRpbWVzdHIsICB0aW1lbGVuKTsKICAgaWYgKGZtdF9idWYpCglmcmVlKGZtdF9idWYpOwogICByZXR1cm4gcmV0dmFsOwoKb3V0X25vbWVtOgoJU2V0TGFzdEVycm9yKHJldHZhbCk7CglXQVJOKG9sZSwgImNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBjaGFycyBvZiBtZW1vcnlcbiIsIGZtdF9idWZfc2l6ZSk7IAoJcmV0dXJuIDA7Cn0K