LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqLwoKLyoJQXQgdGhlIG1vbWVudCwgdGhlc2UgYXJlIG9ubHkgZW1wdHkgc3R1YnMuCiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAib2xlLmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRVc2VyRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMSkKICovCkRXT1JEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExDSUQoKQp7Ci8qIERlZmF1bHQgc29ydGluZywgbmV1dHJhbCBzdWJsYW5ndWFnZSAqLwogICAgc3dpdGNoKE9wdGlvbnMubGFuZ3VhZ2UpCiAgICB7CiAgICBjYXNlIExBTkdfRW46IHJldHVybiAweDA5OwogICAgY2FzZSBMQU5HX0VzOiByZXR1cm4gMHgwNzsgLyogSnVzdCBhIEd1ZXNzIDotKSAqLwogICAgY2FzZSBMQU5HX0RlOiByZXR1cm4gMHgwNzsKICAgIGNhc2UgTEFOR19ObzogcmV0dXJuIDB4MTQ7CiAgICBjYXNlIExBTkdfRnI6CiAgICBjYXNlIExBTkdfRmk6CiAgICBjYXNlIExBTkdfRGE6CiAgICBkZWZhdWx0OgoJcmV0dXJuIDA7ICAvKiBOZXV0cmFsIGxhbmd1YWdlICovCiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFN5c3RlbURlZmF1bHRMQ0lEICAgICAgIChPTEUyTkxTLjIpCiAqLwpEV09SRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExDSUQoKQp7CglyZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFVzZXJEZWZhdWx0TGFuZ0lEICAgICAgIChPTEUyTkxTLjMpCiAqLwpXT1JEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExhbmdJRCgpCnsKCXJldHVybiAoV09SRClHZXRVc2VyRGVmYXVsdExDSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCAgICAgKE9MRTJOTFMuNCkKICovCldPUkQgV0lOQVBJIEdldFN5c3RlbURlZmF1bHRMYW5nSUQoKQp7CglyZXR1cm4gR2V0VXNlckRlZmF1bHRMYW5nSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0TG9jYWxlSW5mb0EgICAgICAgICAgICAgKE9MRTJOTFMuNSkKICogSXMgdGhlIGxhc3QgcGFyYW1ldGVyIHJlYWxseSBXT1JEIGZvciBXaW4xNj8KICovCmludCBXSU5BUEkgR2V0TG9jYWxlSW5mb0EoRFdPUkQgbGNpZCxEV09SRCBMQ1R5cGUsTFBTVFIgYnVmLFdPUkQgbGVuKQp7CgljaGFyICpyZXRTdHJpbmc7CiAgICBpbnQgcmV0TGVuOwogICAgZHByaW50Zl9vbGUoc3RkZGViLCJHZXRMb2NhbGVJbmZvQSglOGxYLCU4bFgsJXAsJTRYKVxuIiwKCQkJbGNpZCxMQ1R5cGUsYnVmLGxlbik7CgkvKiBXaW5lIGlzIHN1cHBvcnRpbmcgb25seSB0aGUgZGVmYXVsdCBsb2NhbGUgKi8KCWlmKGxjaWQhPUdldFVzZXJEZWZhdWx0TENJRCgpKQoJewoJCWRwcmludGZfb2xlKHN0ZG5pbXAsIkdldExvY2FsZUluZm9BOiBVbmtub3duIGxvY2FsZVxuIik7CgkJcmV0dXJuIDA7Cgl9CgkvKiBBcyBhbiBvcHRpb24sIHdlIGNvdWxkIG9idGFpbiB0aGUgdmFsdWUgZnJvbSB3aW4uaW5pLgoJICAgVGhpcyB3b3VsZCBub3QgbWF0Y2ggdGhlIFdpbmUgY29tcGlsZS10aW1lIG9wdGlvbi4KCSAgIEFsc28sIG5vdCBhbGwgaWRlbnRpZmllcnMgYXJlIGF2YWlsYWJsZSBmcm9tIHdpbi5pbmkgKi8KCXJldFN0cmluZz0wOwoJcmV0TGVuPTA7CgkvKiBJZiB3ZSBhcmUgdGhyb3VnaCBhbGwgb2YgdGhpcywgcmV0TGVuIHNob3VsZCBub3QgYmUgemVybyBhbnltb3JlLgoJICAgSWYgaXQgaXMsIHRoZSB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkICovCiNkZWZpbmUgTE9DVkFMKHR5cGUsdmFsdWUpCWlmKHR5cGU9PUxDVHlwZSkJCQlcCgkJCQkJCQkJe3JldExlbj1zdHJsZW4odmFsdWUpKzE7XAoJCQkJCQkJCSByZXRTdHJpbmc9dmFsdWU7ICAgICAgIFwKCQkJCQkJCQl9CiNkZWZpbmUgVU5TVVBQT1JURUQodHlwZSkgICBpZih0eXBlPT1sY2lkKXJldFN0cmluZz0jdHlwZTsKCi8qIEkgcmVhbGx5IHdpc2ggSSB3b3VsZCBrbm93IGEgYmV0dGVyIHdheSB0byBkbyB0aGlzICovClVOU1VQUE9SVEVEKExPQ0FMRV9JTEFOR1VBR0UpClVOU1VQUE9SVEVEKExPQ0FMRV9TTEFOR1VBR0UpClVOU1VQUE9SVEVEKExPQ0FMRV9TRU5HTEFOR1VBR0UpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUpClVOU1VQUE9SVEVEKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUpClVOU1VQUE9SVEVEKExPQ0FMRV9JQ09VTlRSWSkKVU5TVVBQT1JURUQoTE9DQUxFX1NDT1VOVFJZKQpVTlNVUFBPUlRFRChMT0NBTEVfU0VOR0NPVU5UUlkpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUpClVOU1VQUE9SVEVEKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUpClVOU1VQUE9SVEVEKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFKQpVTlNVUFBPUlRFRChMT0NBTEVfSURFRkFVTFRDT1VOVFJZKQpVTlNVUFBPUlRFRChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkKVU5TVVBQT1JURUQoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKQpVTlNVUFBPUlRFRChMT0NBTEVfU0xJU1QpClVOU1VQUE9SVEVEKExPQ0FMRV9JTUVBU1VSRSkKVU5TVVBQT1JURUQoTE9DQUxFX1NERUNJTUFMKQpVTlNVUFBPUlRFRChMT0NBTEVfU1RIT1VTQU5EKQpVTlNVUFBPUlRFRChMT0NBTEVfU0dST1VQSU5HKQpVTlNVUFBPUlRFRChMT0NBTEVfSURJR0lUUykKVU5TVVBQT1JURUQoTE9DQUxFX0lMWkVSTykKVU5TVVBQT1JURUQoTE9DQUxFX0lORUdOVU1CRVIpClVOU1VQUE9SVEVEKExPQ0FMRV9TTkFUSVZFRElHSVRTKQpVTlNVUFBPUlRFRChMT0NBTEVfU0NVUlJFTkNZKQpVTlNVUFBPUlRFRChMT0NBTEVfU0lOVExTWU1CT0wpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OREVDSU1BTFNFUCkKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE9VU0FORFNFUCkKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05HUk9VUElORykKVU5TVVBQT1JURUQoTE9DQUxFX0lDVVJSRElHSVRTKQpVTlNVUFBPUlRFRChMT0NBTEVfSUlOVExDVVJSRElHSVRTKQpVTlNVUFBPUlRFRChMT0NBTEVfSUNVUlJFTkNZKQpVTlNVUFBPUlRFRChMT0NBTEVfSU5FR0NVUlIpClVOU1VQUE9SVEVEKExPQ0FMRV9TREFURSkKVU5TVVBQT1JURUQoTE9DQUxFX1NUSU1FKQpVTlNVUFBPUlRFRChMT0NBTEVfU1NIT1JUREFURSkKVU5TVVBQT1JURUQoTE9DQUxFX1NMT05HREFURSkKVU5TVVBQT1JURUQoTE9DQUxFX1NUSU1FRk9STUFUKQpVTlNVUFBPUlRFRChMT0NBTEVfSURBVEUpClVOU1VQUE9SVEVEKExPQ0FMRV9JTERBVEUpClVOU1VQUE9SVEVEKExPQ0FMRV9JVElNRSkKVU5TVVBQT1JURUQoTE9DQUxFX0lUSU1FTUFSS1BPU04pClVOU1VQUE9SVEVEKExPQ0FMRV9JQ0VOVFVSWSkKVU5TVVBQT1JURUQoTE9DQUxFX0lUTFpFUk8pClVOU1VQUE9SVEVEKExPQ0FMRV9JREFZTFpFUk8pClVOU1VQUE9SVEVEKExPQ0FMRV9JTU9OTFpFUk8pClVOU1VQUE9SVEVEKExPQ0FMRV9TMTE1OSkKVU5TVVBQT1JURUQoTE9DQUxFX1MyMzU5KQpVTlNVUFBPUlRFRChMT0NBTEVfSUNBTEVOREFSVFlQRSkKVU5TVVBQT1JURUQoTE9DQUxFX0lPUFRJT05BTENBTEVOREFSKQpVTlNVUFBPUlRFRChMT0NBTEVfSUZJUlNUREFZT0ZXRUVLKQpVTlNVUFBPUlRFRChMT0NBTEVfSUZJUlNUV0VFS09GWUVBUikKVU5TVVBQT1JURUQoTE9DQUxFX1NEQVlOQU1FMSkKVU5TVVBQT1JURUQoTE9DQUxFX1NEQVlOQU1FMikKVU5TVVBQT1JURUQoTE9DQUxFX1NEQVlOQU1FMykKVU5TVVBQT1JURUQoTE9DQUxFX1NEQVlOQU1FNCkKVU5TVVBQT1JURUQoTE9DQUxFX1NEQVlOQU1FNSkKVU5TVVBQT1JURUQoTE9DQUxFX1NEQVlOQU1FNikKVU5TVVBQT1JURUQoTE9DQUxFX1NEQVlOQU1FNykKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMikKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMykKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNikKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNykKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUUxKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTIpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FMykKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUU0KQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTUpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FNikKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUU3KQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTgpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FOSkKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUUxMCkKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUUxMSkKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUUxMikKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUUxMykKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMykKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNikKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMikKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMykKVU5TVVBQT1JURUQoTE9DQUxFX1NQT1NJVElWRVNJR04pClVOU1VQUE9SVEVEKExPQ0FMRV9TTkVHQVRJVkVTSUdOKQpVTlNVUFBPUlRFRChMT0NBTEVfSVBPU1NJR05QT1NOKQpVTlNVUFBPUlRFRChMT0NBTEVfSU5FR1NJR05QT1NOKQpVTlNVUFBPUlRFRChMT0NBTEVfSVBPU1NZTVBSRUNFREVTKQpVTlNVUFBPUlRFRChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UpClVOU1VQUE9SVEVEKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMpClVOU1VQUE9SVEVEKExPQ0FMRV9JTkVHU0VQQllTUEFDRSkKCi8qIE5vdywgdGhlIGxhbmd1YWdlIHNwZWNpZmljIGRlZmluaXRpb25zLiBUaGV5IGRvbid0IGhhdmUgdG8gYmUKICAgY29tcGxldGUgKi8KICAgIHN3aXRjaChPcHRpb25zLmxhbmd1YWdlKQogICAgewogICAgY2FzZSBMQU5HX0RlOgovKiBUaGlzIGRlZmluaXRpb25zIGFwcGx5IHRvIEdlcm1hbnkgb25seS4gVXNlcnMgaW4gQXVzdHJpYSAKICAgb3IgU3dpdHplcmxhbmQgbWlnaHQgd2FudCB0byBtb2RpZnkgdGhlbSAqLwpMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiOSIpCkxPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJEZXV0c2NoIikKTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkdlcm1hbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJkZXUiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiRGV1dHNjaCIpCkxPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIjQ5IikKTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiRGV1dHNjaGxhbmQiKQpMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJEZXV0c2NobGFuZCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJEZSIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJEZXV0c2NobGFuZCIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiOSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCI0OSIpCi8qIER1bm5vCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkKTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkKKi8KTE9DVkFMKExPQ0FMRV9TTElTVCwiOyIpCkxPQ1ZBTChMT0NBTEVfSU1FQVNVUkUsIjAiKQpMT0NWQUwoTE9DQUxFX1NERUNJTUFMLCIsIikKTE9DVkFMKExPQ0FMRV9TVEhPVVNBTkQsIi4iKQovKgpMT0NWQUwoTE9DQUxFX1NHUk9VUElORykKKi8KTE9DVkFMKExPQ0FMRV9JRElHSVRTLCIyIikKTE9DVkFMKExPQ0FMRV9JTFpFUk8sIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lORUdOVU1CRVIpCklzIHRoaXMgIjAxMjM0NTY3ODkiID8/CkxPQ1ZBTChMT0NBTEVfU05BVElWRURJR0lUUykKKi8KTE9DVkFMKExPQ0FMRV9TQ1VSUkVOQ1ksIkRNIikKLyoKTE9DVkFMKExPQ0FMRV9TSU5UTFNZTUJPTCkKTE9DVkFMKExPQ0FMRV9TTU9OREVDSU1BTFNFUCkKTE9DVkFMKExPQ0FMRV9TTU9OVEhPVVNBTkRTRVApCkxPQ1ZBTChMT0NBTEVfU01PTkdST1VQSU5HKQoqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRElHSVRTLCIyIikKLyoKTE9DVkFMKExPQ0FMRV9JSU5UTENVUlJESUdJVFMpCiovCkxPQ1ZBTChMT0NBTEVfSUNVUlJFTkNZLCIzIikKTE9DVkFMKExPQ0FMRV9JTkVHQ1VSUiwiOCIpCkxPQ1ZBTChMT0NBTEVfU0RBVEUsIi4iKQpMT0NWQUwoTE9DQUxFX1NUSU1FLCI6IikKTE9DVkFMKExPQ0FMRV9TU0hPUlREQVRFLCJkZC5NTS55eXl5IikKTE9DVkFMKExPQ0FMRV9TTE9OR0RBVEUsImRkZCwgZC4gTU1NTSB5eXl5IikKLyoKTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkKKi8KTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSUxEQVRFKQoqLwpMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKQpMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKQoqLwpMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykKTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pCkxPQ1ZBTChMT0NBTEVfUzExNTkpCkxPQ1ZBTChMT0NBTEVfUzIzNTkpCkxPQ1ZBTChMT0NBTEVfSUNBTEVOREFSVFlQRSkKTE9DVkFMKExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUikKTE9DVkFMKExPQ0FMRV9JRklSU1REQVlPRldFRUspCkxPQ1ZBTChMT0NBTEVfSUZJUlNUV0VFS09GWUVBUikKKi8KTE9DVkFMKExPQ0FMRV9TREFZTkFNRTEsIk1vbnRhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUyLCJEaWVuc3RhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCJNaXR0d29jaCIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCJEb25uZXJzdGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTUsIkZyZWl0YWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwiU29ubmFiZW5kIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTcsIlNvbm50YWciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwiTW8iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwiRGkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywiTWkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwiRG8iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwiRnIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwiU2EiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiU28iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxLCJKYW51YXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJGZWJydWFyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywiTeRyeiIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTQsIkFwcmlsIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNSwiTWFpIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNiwiSnVuaSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTcsIkp1bGkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU4LCJBdWd1c3QiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU5LCJTZXB0ZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwiT2t0b2JlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTExLCJOb3ZlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEyLCJEZXplbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLCJKYW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCJGZWIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCJN5HIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCJBcHIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1LCJNYWkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCJKdW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCJKdWwiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU4LCJBdWciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCJTZXAiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwiT2t0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEsIk5vdiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCJEZXoiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKLyoKTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOKQpMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04pCkxPQ1ZBTChMT0NBTEVfSVBPU1NJR05QT1NOKQpMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTikKTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMpCkxPQ1ZBTChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UpCkxPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTKQpMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFKQoqLwogICAgYnJlYWs7ICAvKiBMQU5HKERlKSAqLwoKICAgIGNhc2UgTEFOR19EYToKLyogTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjkiKSAqLwpMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRGFuc2siKQpMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiRGFuaXNoIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsImRhbiIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJEYW5zayIpCkxPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIjQ1IikKTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiRGFubWFyayIpCkxPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkRlbm1hcmsiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiRGEiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiRGFubWFyayIpCi8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiOSIpICovCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCI0NSIpCi8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSkgKi8KLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkgKi8KTE9DVkFMKExPQ0FMRV9TTElTVCwiOyIpCkxPQ1ZBTChMT0NBTEVfSU1FQVNVUkUsIjAiKQpMT0NWQUwoTE9DQUxFX1NERUNJTUFMLCIsIikKTE9DVkFMKExPQ0FMRV9TVEhPVVNBTkQsIi4iKQovKiBMT0NWQUwoTE9DQUxFX1NHUk9VUElORykgKi8KTE9DVkFMKExPQ0FMRV9JRElHSVRTLCIyIikKTE9DVkFMKExPQ0FMRV9JTFpFUk8sIjEiKQovKiBMT0NWQUwoTE9DQUxFX0lORUdOVU1CRVIpICovCi8qIExPQ1ZBTChMT0NBTEVfU05BVElWRURJR0lUUykgKi8KTE9DVkFMKExPQ0FMRV9TQ1VSUkVOQ1ksImtyIikKLyogTE9DVkFMKExPQ0FMRV9TSU5UTFNZTUJPTCkgKi8KTE9DVkFMKExPQ0FMRV9TTU9OREVDSU1BTFNFUCwiLCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRIT1VTQU5EU0VQLCIuIikKLyogTE9DVkFMKExPQ0FMRV9TTU9OR1JPVVBJTkcpICovCkxPQ1ZBTChMT0NBTEVfSUNVUlJESUdJVFMsIjIiKQovKiBMT0NWQUwoTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUykgKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkVOQ1ksIjMiKQpMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCI4IikKTE9DVkFMKExPQ0FMRV9TREFURSwiLiIpCkxPQ1ZBTChMT0NBTEVfU1RJTUUsIjoiKQpMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsImRkL01NLXl5eXkiKQpMT0NWQUwoTE9DQUxFX1NMT05HREFURSwiZGRkLCBkLiBNTU1NIHl5eXkiKQovKiBMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKSAqLwpMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikKLyogTE9DVkFMKExPQ0FMRV9JTERBVEUpICovCkxPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQovKiBMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pICovCi8qIExPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpICovCkxPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCi8qIExPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykgKi8KLyogTE9DVkFMKExPQ0FMRV9TMTE1OSkgKi8KLyogTE9DVkFMKExPQ0FMRV9TMjM1OSkgKi8KLyogTE9DVkFMKExPQ0FMRV9JQ0FMRU5EQVJUWVBFKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lPUFRJT05BTENBTEVOREFSKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSykgKi8KLyogTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSKSAqLwpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwiTWFuZGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIlRpcnNkYWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywiT25zZGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsIlRvcnNkYWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwiRnJlZGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsIkz4cmRhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJT+G5kYWciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwiTWEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwiVGkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywiT24iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwiVG8iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwiRnIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwiTPgiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiU/giKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxLCJKYW51YXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJGZWJydWFyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywiTWFydHMiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCJBcHJpbCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTUsIk1haiIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTYsIkp1bmkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU3LCJKdWxpIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwiQXVndXN0IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOSwiU2VwdGVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTAsIk9rdG9iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwiTm92ZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMiwiRGVjZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMywiIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwiSmFuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwiRmViIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywiTWFyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwiQXByIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwiTWFqIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNiwiSnVuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywiSnVsIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwiQXVnIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSwiU2VwIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIk9rdCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCJOb3YiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMiwiRGVjIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsIiIpCi8qIExPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTikgKi8KLyogTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTikgKi8KLyogTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04pICovCi8qIExPQ1ZBTChMT0NBTEVfSVBPU1NZTVBSRUNFREVTKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lQT1NTRVBCWVNQQUNFKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lORUdTWU1QUkVDRURFUykgKi8KLyogTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSkgKi8KICAgIGJyZWFrOyAvKiBMQU5HKERhKSAqLwoKLypJbnNlcnQgb3RoZXIgbGFuZ3VhZ2VzIGhlcmUqLwoKICAgIGRlZmF1bHQ6CglicmVhazsKICAgIH0gIC8qIHN3aXRjaCAqLwoKCWlmKCFyZXRMZW4pCgl7CgkJaWYoIXJldFN0cmluZylmcHJpbnRmKHN0ZGVyciwiVW5rb3duIExDIHR5cGUgJWxYXG4iLExDVHlwZSk7CgkJZWxzZSBmcHJpbnRmKHN0ZGVyciwiJyVzJyBub3Qgc3VwcG9ydGVkIGZvciB5b3VyIGxhbmd1YWdlLlxuIiwKCQkJcmV0U3RyaW5nKTsKCQlyZXR1cm4gMDsKCX0KCglpZihyZXRMZW4+bGVuKXJldExlbj1sZW47Cglsc3RyY3B5bihidWYscmV0U3RyaW5nLGxlbik7CglyZXR1cm4gcmV0TGVuOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBDb21wYXJlU3RyaW5nQSAgICAgICAoT0xFMk5MUy44KQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZSwgYW5kIHRydXN0cyBpbiBsaWJjCiAqLwppbnQgQ29tcGFyZVN0cmluZ0EoRFdPUkQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsIAoJY2hhciAqczEsIGludCBsMSwgY2hhciAqczIsaW50IGwyKQp7CglpbnQgbGVuLHJldDsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVOT05TUEFDRSkKCXsKCQlmcHJpbnRmKHN0ZG5pbXAsICJDb21wYXJlU3RyaW5nQTogSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKCX0KCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCWZwcmludGYoc3RkbmltcCwgIkNvbXBhcmVTdHJpbmdBOiBJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwoJLyogSXMgc3RyY21wIGRlZmF1bHRpbmcgdG8gc3RyaW5nIHNvcnQgb3IgdG8gd29yZCBzb3J0Pz8gKi8KCS8qIEZJWE1FOiBIYW5kbGUgTk9STV9TVFJJTkdTT1JUICovCglsMSA9IChsMT09LTEpP3N0cmxlbihzMSk6bDE7CglsMiA9IChsMj09LTEpP3N0cmxlbihzMik6bDI7CglsZW4gPSBsMTxsMiA/IGwxOmwyOwoJcmV0ID0gKGZkd1N0eWxlICYgTk9STV9JR05PUkVDQVNFKSA/CgkJc3RybmNhc2VjbXAoczEsczIsbGVuKQk6CgkJc3RybmNtcChzMSxzMixsZW4pOwoJLyogbm90IGVxdWFsLCByZXR1cm4gMSBvciAzICovCglpZihyZXQhPTApcmV0dXJuIHJldCsyOwoJLyogc2FtZSBsZW4sIHJldHVybiAyICovCglpZihsMT09bDIpcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9Cgo=