LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqLwoKLyoJQXQgdGhlIG1vbWVudCwgdGhlc2UgYXJlIG9ubHkgZW1wdHkgc3R1YnMuCiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAib2xlLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRVc2VyRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMSkKICovCkRXT1JEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExDSUQoKQp7Ci8qIERlZmF1bHQgc29ydGluZywgbmV1dHJhbCBzdWJsYW5ndWFnZSAqLwojaWYgI0xBTkcoRW4pCglyZXR1cm4gOTsKI2VsaWYgI0xBTkcoRGUpCglyZXR1cm4gNzsKI2VsaWYgI0xBTkcoTm8pCglyZXR1cm4gMHgxNDsKI2Vsc2UKCS8qIE5ldXRyYWwgbGFuZ3VhZ2UgKi8KCXJldHVybiAwOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMikKICovCkRXT1JEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpCnsKCXJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0VXNlckRlZmF1bHRMYW5nSUQgICAgICAgKE9MRTJOTFMuMykKICovCldPUkQgV0lOQVBJIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIChXT1JEKUdldFVzZXJEZWZhdWx0TENJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEICAgICAoT0xFMk5MUy40KQogKi8KV09SRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCgpCnsKCXJldHVybiBHZXRVc2VyRGVmYXVsdExhbmdJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRMb2NhbGVJbmZvQSAgICAgICAgICAgICAoT0xFMk5MUy41KQogKiBJcyB0aGUgbGFzdCBwYXJhbWV0ZXIgcmVhbGx5IFdPUkQgZm9yIFdpbjE2PwogKi8KaW50IFdJTkFQSSBHZXRMb2NhbGVJbmZvQShEV09SRCBsY2lkLERXT1JEIExDVHlwZSxMUFNUUiBidWYsV09SRCBsZW4pCnsKCWNoYXIgKnJldFN0cmluZzsKICAgIGludCByZXRMZW47CiAgICBkcHJpbnRmX29sZShzdGRkZWIsIkdldExvY2FsZUluZm9BKCU4bFgsJThsWCwlcCwlNFgpXG4iLAoJCQlsY2lkLExDVHlwZSxidWYsbGVuKTsKCS8qIFdpbmUgaXMgc3VwcG9ydGluZyBvbmx5IHRoZSBkZWZhdWx0IGxvY2FsZSAqLwoJaWYobGNpZCE9R2V0VXNlckRlZmF1bHRMQ0lEKCkpCgl7CgkJZHByaW50Zl9vbGUoc3RkbmltcCwiR2V0TG9jYWxlSW5mb0E6IFVua25vd24gbG9jYWxlXG4iKTsKCQlyZXR1cm4gMDsKCX0KCS8qIEFzIGFuIG9wdGlvbiwgd2UgY291bGQgb2J0YWluIHRoZSB2YWx1ZSBmcm9tIHdpbi5pbmkuCgkgICBUaGlzIHdvdWxkIG5vdCBtYXRjaCB0aGUgV2luZSBjb21waWxlLXRpbWUgb3B0aW9uLgoJICAgQWxzbywgbm90IGFsbCBpZGVudGlmaWVycyBhcmUgYXZhaWxhYmxlIGZyb20gd2luLmluaSAqLwoJcmV0U3RyaW5nPTA7CglyZXRMZW49MDsKCS8qIElmIHdlIGFyZSB0aHJvdWdoIGFsbCBvZiB0aGlzLCByZXRMZW4gc2hvdWxkIG5vdCBiZSB6ZXJvIGFueW1vcmUuCgkgICBJZiBpdCBpcywgdGhlIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgKi8KI2RlZmluZSBMT0NWQUwodHlwZSx2YWx1ZSkJaWYodHlwZT09TENUeXBlKQkJCVwKCQkJCQkJCQl7cmV0TGVuPXN0cmxlbih2YWx1ZSkrMTtcCgkJCQkJCQkJIHJldFN0cmluZz12YWx1ZTsgICAgICAgXAoJCQkJCQkJCX0KI2RlZmluZSBVTlNVUFBPUlRFRCh0eXBlKSAgIGlmKHR5cGU9PWxjaWQpcmV0U3RyaW5nPSN0eXBlOwoKLyogSSByZWFsbHkgd2lzaCBJIHdvdWxkIGtub3cgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMgKi8KVU5TVVBQT1JURUQoTE9DQUxFX0lMQU5HVUFHRSkKVU5TVVBQT1JURUQoTE9DQUxFX1NMQU5HVUFHRSkKVU5TVVBQT1JURUQoTE9DQUxFX1NFTkdMQU5HVUFHRSkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSkKVU5TVVBQT1JURUQoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSkKVU5TVVBQT1JURUQoTE9DQUxFX0lDT1VOVFJZKQpVTlNVUFBPUlRFRChMT0NBTEVfU0NPVU5UUlkpClVOU1VQUE9SVEVEKExPQ0FMRV9TRU5HQ09VTlRSWSkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSkKVU5TVVBQT1JURUQoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSkKVU5TVVBQT1JURUQoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UpClVOU1VQUE9SVEVEKExPQ0FMRV9JREVGQVVMVENPVU5UUlkpClVOU1VQUE9SVEVEKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKQpVTlNVUFBPUlRFRChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpClVOU1VQUE9SVEVEKExPQ0FMRV9TTElTVCkKVU5TVVBQT1JURUQoTE9DQUxFX0lNRUFTVVJFKQpVTlNVUFBPUlRFRChMT0NBTEVfU0RFQ0lNQUwpClVOU1VQUE9SVEVEKExPQ0FMRV9TVEhPVVNBTkQpClVOU1VQUE9SVEVEKExPQ0FMRV9TR1JPVVBJTkcpClVOU1VQUE9SVEVEKExPQ0FMRV9JRElHSVRTKQpVTlNVUFBPUlRFRChMT0NBTEVfSUxaRVJPKQpVTlNVUFBPUlRFRChMT0NBTEVfSU5FR05VTUJFUikKVU5TVVBQT1JURUQoTE9DQUxFX1NOQVRJVkVESUdJVFMpClVOU1VQUE9SVEVEKExPQ0FMRV9TQ1VSUkVOQ1kpClVOU1VQUE9SVEVEKExPQ0FMRV9TSU5UTFNZTUJPTCkKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05ERUNJTUFMU0VQKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRIT1VTQU5EU0VQKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTkdST1VQSU5HKQpVTlNVUFBPUlRFRChMT0NBTEVfSUNVUlJESUdJVFMpClVOU1VQUE9SVEVEKExPQ0FMRV9JSU5UTENVUlJESUdJVFMpClVOU1VQUE9SVEVEKExPQ0FMRV9JQ1VSUkVOQ1kpClVOU1VQUE9SVEVEKExPQ0FMRV9JTkVHQ1VSUikKVU5TVVBQT1JURUQoTE9DQUxFX1NEQVRFKQpVTlNVUFBPUlRFRChMT0NBTEVfU1RJTUUpClVOU1VQUE9SVEVEKExPQ0FMRV9TU0hPUlREQVRFKQpVTlNVUFBPUlRFRChMT0NBTEVfU0xPTkdEQVRFKQpVTlNVUFBPUlRFRChMT0NBTEVfU1RJTUVGT1JNQVQpClVOU1VQUE9SVEVEKExPQ0FMRV9JREFURSkKVU5TVVBQT1JURUQoTE9DQUxFX0lMREFURSkKVU5TVVBQT1JURUQoTE9DQUxFX0lUSU1FKQpVTlNVUFBPUlRFRChMT0NBTEVfSVRJTUVNQVJLUE9TTikKVU5TVVBQT1JURUQoTE9DQUxFX0lDRU5UVVJZKQpVTlNVUFBPUlRFRChMT0NBTEVfSVRMWkVSTykKVU5TVVBQT1JURUQoTE9DQUxFX0lEQVlMWkVSTykKVU5TVVBQT1JURUQoTE9DQUxFX0lNT05MWkVSTykKVU5TVVBQT1JURUQoTE9DQUxFX1MxMTU5KQpVTlNVUFBPUlRFRChMT0NBTEVfUzIzNTkpClVOU1VQUE9SVEVEKExPQ0FMRV9JQ0FMRU5EQVJUWVBFKQpVTlNVUFBPUlRFRChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIpClVOU1VQUE9SVEVEKExPQ0FMRV9JRklSU1REQVlPRldFRUspClVOU1VQUE9SVEVEKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSKQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUUxKQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUUyKQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUUzKQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUU0KQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUU1KQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUU2KQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBWU5BTUU3KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3KQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTEpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FMikKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUUzKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTQpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FNSkKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUU2KQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTcpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FOCkKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUU5KQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTEwKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTExKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTEyKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTEzKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMikKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTQpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTcpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEwKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEzKQpVTlNVUFBPUlRFRChMT0NBTEVfU1BPU0lUSVZFU0lHTikKVU5TVVBQT1JURUQoTE9DQUxFX1NORUdBVElWRVNJR04pClVOU1VQUE9SVEVEKExPQ0FMRV9JUE9TU0lHTlBPU04pClVOU1VQUE9SVEVEKExPQ0FMRV9JTkVHU0lHTlBPU04pClVOU1VQUE9SVEVEKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMpClVOU1VQUE9SVEVEKExPQ0FMRV9JUE9TU0VQQllTUEFDRSkKVU5TVVBQT1JURUQoTE9DQUxFX0lORUdTWU1QUkVDRURFUykKVU5TVVBQT1JURUQoTE9DQUxFX0lORUdTRVBCWVNQQUNFKQoKLyogTm93LCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgZGVmaW5pdGlvbnMuIFRoZXkgZG9uJ3QgaGF2ZSB0byBiZQogICBjb21wbGV0ZSAqLwojaWYgI0xBTkcoRGUpCi8qIFRoaXMgZGVmaW5pdGlvbnMgYXBwbHkgdG8gR2VybWFueSBvbmx5LiBVc2VycyBpbiBBdXN0cmlhIAogICBvciBTd2l0emVybGFuZCBtaWdodCB3YW50IHRvIG1vZGlmeSB0aGVtICovCkxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCI5IikKTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkRldXRzY2giKQpMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiR2VybWFuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImRldSIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJEZXV0c2NoIikKTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiNDkiKQpMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJEZXV0c2NobGFuZCIpCkxPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkRldXRzY2hsYW5kIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkRlIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIkRldXRzY2hsYW5kIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCI5IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQ5IikKLyogRHVubm8KTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKQoqLwpMT0NWQUwoTE9DQUxFX1NMSVNULCI7IikKTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwiMCIpCkxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsIiwiKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwiLiIpCi8qCkxPQ1ZBTChMT0NBTEVfU0dST1VQSU5HKQoqLwpMT0NWQUwoTE9DQUxFX0lESUdJVFMsIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUikKSXMgdGhpcyAiMDEyMzQ1Njc4OSIgPz8KTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTKQoqLwpMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwiRE0iKQovKgpMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MKQpMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQKQpMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCkKTE9DVkFMKExPQ0FMRV9TTU9OR1JPVVBJTkcpCiovCkxPQ1ZBTChMT0NBTEVfSUNVUlJESUdJVFMsIjIiKQovKgpMT0NWQUwoTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUykKKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkVOQ1ksIjMiKQpMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCI4IikKTE9DVkFMKExPQ0FMRV9TREFURSwiLiIpCkxPQ1ZBTChMT0NBTEVfU1RJTUUsIjoiKQpMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsImRkLk1NLnl5eXkiKQpMT0NWQUwoTE9DQUxFX1NMT05HREFURSwiZGRkLCBkLiBNTU1NIHl5eXkiKQovKgpMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKQoqLwpMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JTERBVEUpCiovCkxPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pCkxPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpCiovCkxPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKQpMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykKTE9DVkFMKExPQ0FMRV9TMTE1OSkKTE9DVkFMKExPQ0FMRV9TMjM1OSkKTE9DVkFMKExPQ0FMRV9JQ0FMRU5EQVJUWVBFKQpMT0NWQUwoTE9DQUxFX0lPUFRJT05BTENBTEVOREFSKQpMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSykKTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSKQoqLwpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwiTW9udGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIkRpZW5zdGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsIk1pdHR3b2NoIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsIkRvbm5lcnN0YWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwiRnJlaXRhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU2LCJTb25uYWJlbmQiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNywiU29ubnRhZyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJNbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJEaSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJNaSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCJEbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJGciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJTYSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCJTbyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsIkphbnVhciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsIkZlYnJ1YXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUzLCJN5HJ6IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiQXByaWwiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCJNYWkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU2LCJKdW5pIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywiSnVsaSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsIkF1Z3VzdCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksIlNlcHRlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCJPa3RvYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTEsIk5vdmVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsIkRlemVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTMsIiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEsIkphbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsIkZlYiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMsIk3kciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTQsIkFwciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsIk1haSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTYsIkp1biIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTcsIkp1bCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsIkF1ZyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTksIlNlcCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEwLCJPa3QiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwiTm92IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsIkRleiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEzLCIiKQovKgpMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04pCkxPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTikKTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04pCkxPQ1ZBTChMT0NBTEVfSU5FR1NJR05QT1NOKQpMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUykKTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSkKTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMpCkxPQ1ZBTChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UpCiovCiNlbmRpZiAvKiBMQU5HKERlKSAqLwoKLypJbnNlcnQgb3RoZXIgbGFuZ3VhZ2VzIGhlcmUqLwoKCgoJaWYoIXJldExlbikKCXsKCQlpZighcmV0U3RyaW5nKWZwcmludGYoc3RkZXJyLCJVbmtvd24gTEMgdHlwZSAlbFhcbiIsTENUeXBlKTsKCQllbHNlIGZwcmludGYoc3RkZXJyLCInJXMnIG5vdCBzdXBwb3J0ZWQgZm9yIHlvdXIgbGFuZ3VhZ2UuXG4iLAoJCQlyZXRTdHJpbmcpOwoJCXJldHVybiAwOwoJfQoKCWlmKHJldExlbj5sZW4pcmV0TGVuPWxlbjsKCXN0cm5jcHkoYnVmLHJldFN0cmluZyxsZW4pOwoJcmV0dXJuIHJldExlbjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgQ29tcGFyZVN0cmluZ0EgICAgICAgKE9MRTJOTFMuOCkKICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUsIGFuZCB0cnVzdHMgaW4gbGliYwogKi8KaW50IENvbXBhcmVTdHJpbmdBKERXT1JEIGxjaWQsIERXT1JEIGZkd1N0eWxlLCAKCWNoYXIgKnMxLCBpbnQgbDEsIGNoYXIgKnMyLGludCBsMikKewoJaW50IGxlbixyZXQ7CglpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCgl7CgkJZnByaW50ZihzdGRuaW1wLCAiQ29tcGFyZVN0cmluZ0E6IElHTk9SRU5PTlNQQUNFIG5vdCBzdXBwcnRlZFxuIik7Cgl9CglpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFU1lNQk9MUykKCQlmcHJpbnRmKHN0ZG5pbXAsICJDb21wYXJlU3RyaW5nQTogSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCS8qIElzIHN0cmNtcCBkZWZhdWx0aW5nIHRvIHN0cmluZyBzb3J0IG9yIHRvIHdvcmQgc29ydD8/ICovCgkvKiBGSVhNRTogSGFuZGxlIE5PUk1fU1RSSU5HU09SVCAqLwoJbDEgPSAobDE9PS0xKT9zdHJsZW4oczEpOmwxOwoJbDIgPSAobDI9PS0xKT9zdHJsZW4oczIpOmwyOwoJbGVuID0gbDE8bDIgPyBsMTpsMjsKCXJldCA9IChmZHdTdHlsZSAmIE5PUk1fSUdOT1JFQ0FTRSkgPwoJCXN0cm5jYXNlY21wKHMxLHMyLGxlbikJOgoJCXN0cm5jbXAoczEsczIsbGVuKTsKCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwoJaWYocmV0IT0wKXJldHVybiByZXQrMjsKCS8qIHNhbWUgbGVuLCByZXR1cm4gMiAqLwoJaWYobDE9PWwyKXJldHVybiAyOwoJLyogdGhlIGxvbmdlciBvbmUgaXMgbGV4aWNhbGx5IGdyZWF0ZXIgKi8KCXJldHVybiAobDE8bDIpPyAxIDogMzsKfQoK