LyogQ29tcGFyZSBzdHJpbmdzIHdoaWxlIHRyZWF0aW5nIGRpZ2l0cyBjaGFyYWN0ZXJzIG51bWVyaWNhbGx5Lg0KICAgQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAyLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5Lg0KICAgQ29udHJpYnV0ZWQgYnkgSmVhbi1GcmFu529pcyBCaWdub2xsZXMgPGJpZ25vbGxlQGVjb2xlZG9jLmlicC5mcj4sIDE5OTcuDQoNCiAgIExpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3INCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMNCiAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcg0KICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQoNCiAgIExpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLA0KICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VDQogICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KDQogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljDQogICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUNCiAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUENCiAgIDAyMTEwLTEzMDEgVVNBLiAgKi8NCg0KI2luY2x1ZGUgPGN0eXBlLmg+DQoNCi8qDQpAZGVmdHlwZWZ1biBpbnQgc3RydmVyc2NtcCAoY29uc3QgY2hhciAqQHZhcntzMX0sIGNvbnN0IGNoYXIgKkB2YXJ7czJ9KQ0KVGhlIEBjb2Rle3N0cnZlcnNjbXB9IGZ1bmN0aW9uIGNvbXBhcmVzIHRoZSBzdHJpbmcgQHZhcntzMX0gYWdhaW5zdA0KQHZhcntzMn0sIGNvbnNpZGVyaW5nIHRoZW0gYXMgaG9sZGluZyBpbmRpY2VzL3ZlcnNpb24gbnVtYmVycy4gIFJldHVybg0KdmFsdWUgZm9sbG93cyB0aGUgc2FtZSBjb252ZW50aW9ucyBhcyBmb3VuZCBpbiB0aGUgQGNvZGV7c3RydmVyc2NtcH0NCmZ1bmN0aW9uLiAgSW4gZmFjdCwgaWYgQHZhcntzMX0gYW5kIEB2YXJ7czJ9IGNvbnRhaW4gbm8gZGlnaXRzLA0KQGNvZGV7c3RydmVyc2NtcH0gYmVoYXZlcyBsaWtlIEBjb2Rle3N0cmNtcH0uDQoNCkJhc2ljYWxseSwgd2UgY29tcGFyZSBzdHJpbmdzIG5vcm1hbGx5IChjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyKSwgdW50aWwNCndlIGZpbmQgYSBkaWdpdCBpbiBlYWNoIHN0cmluZyAtIHRoZW4gd2UgZW50ZXIgYSBzcGVjaWFsIGNvbXBhcmlzb24NCm1vZGUsIHdoZXJlIGVhY2ggc2VxdWVuY2Ugb2YgZGlnaXRzIGlzIHRha2VuIGFzIGEgd2hvbGUuICBJZiB3ZSByZWFjaCB0aGUNCmVuZCBvZiB0aGVzZSB0d28gcGFydHMgd2l0aG91dCBub3RpY2luZyBhIGRpZmZlcmVuY2UsIHdlIHJldHVybiB0byB0aGUNCnN0YW5kYXJkIGNvbXBhcmlzb24gbW9kZS4gIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgbnVtZXJpYyBwYXJ0czoNCiJpbnRlZ3JhbCIgYW5kICJmcmFjdGlvbmFsIiAodGhvc2UgIGJlZ2luIHdpdGggYSAnMCcpLiBUaGUgdHlwZXMNCm9mIHRoZSBudW1lcmljIHBhcnRzIGFmZmVjdCB0aGUgd2F5IHdlIHNvcnQgdGhlbToNCg0KQGl0ZW1pemUgQGJ1bGxldA0KQGl0ZW0NCmludGVncmFsL2ludGVncmFsOiB3ZSBjb21wYXJlIHZhbHVlcyBhcyB5b3Ugd291bGQgZXhwZWN0Lg0KDQpAaXRlbQ0KZnJhY3Rpb25hbC9pbnRlZ3JhbDogdGhlIGZyYWN0aW9uYWwgcGFydCBpcyBsZXNzIHRoYW4gdGhlIGludGVncmFsIG9uZS4NCkFnYWluLCBubyBzdXJwcmlzZS4NCg0KQGl0ZW0NCmZyYWN0aW9uYWwvZnJhY3Rpb25hbDogdGhlIHRoaW5ncyBiZWNvbWUgYSBiaXQgbW9yZSBjb21wbGV4Lg0KSWYgdGhlIGNvbW1vbiBwcmVmaXggY29udGFpbnMgb25seSBsZWFkaW5nIHplcm9lcywgdGhlIGxvbmdlc3QgcGFydCBpcyBsZXNzDQp0aGFuIHRoZSBvdGhlciBvbmU7IGVsc2UgdGhlIGNvbXBhcmlzb24gYmVoYXZlcyBub3JtYWxseS4NCkBlbmQgaXRlbWl6ZQ0KDQpAc21hbGxleGFtcGxlDQpzdHJ2ZXJzY21wICgibm8gZGlnaXQiLCAibm8gZGlnaXQiKQ0KICAgIEByZXN1bHR7fSAwICAgIC8vIEBye3NhbWUgYmVoYXZpb3IgYXMgc3RyY21wLn0NCnN0cnZlcnNjbXAgKCJpdGVtIzk5IiwgIml0ZW0jMTAwIikNCiAgICBAcmVzdWx0e30gPDAgICAvLyBAcntzYW1lIHByZWZpeCwgYnV0IDk5IDwgMTAwLn0NCnN0cnZlcnNjbXAgKCJhbHBoYTEiLCAiYWxwaGEwMDEiKQ0KICAgIEByZXN1bHR7fSA+MCAgIC8vIEBye2ZyYWN0aW9uYWwgcGFydCBpbmZlcmlvciB0byBpbnRlZ3JhbCBvbmUufQ0Kc3RydmVyc2NtcCAoInBhcnQxX2YwMTIiLCAicGFydDFfZjAxIikNCiAgICBAcmVzdWx0e30gPjAgICAvLyBAcnt0d28gZnJhY3Rpb25hbCBwYXJ0cy59DQpzdHJ2ZXJzY21wICgiZm9vLjAwOSIsICJmb28uMCIpDQogICAgQHJlc3VsdHt9IDwwICAgLy8gQHJ7aWRlbSwgYnV0IHdpdGggbGVhZGluZyB6ZXJvZXMgb25seS59DQpAZW5kIHNtYWxsZXhhbXBsZQ0KDQpUaGlzIGZ1bmN0aW9uIGlzIGVzcGVjaWFsbHkgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoIGZpbGVuYW1lIHNvcnRpbmcsDQpiZWNhdXNlIGZpbGVuYW1lcyBmcmVxdWVudGx5IGhvbGQgaW5kaWNlcy92ZXJzaW9uIG51bWJlcnMuDQpAZW5kIGRlZnR5cGVmdW4NCg0KKi8NCg0KLyogc3RhdGVzOiBTX046IG5vcm1hbCwgU19JOiBjb21wYXJpbmcgaW50ZWdyYWwgcGFydCwgU19GOiBjb21wYXJpbmcNCiAgICAgICAgICAgZnJhY3Rpb25hbCBwYXJ0cywgU19aOiBpZGVtIGJ1dCB3aXRoIGxlYWRpbmcgWmVyb2VzIG9ubHkgKi8NCiNkZWZpbmUgIFNfTiAgICAweDANCiNkZWZpbmUgIFNfSSAgICAweDQNCiNkZWZpbmUgIFNfRiAgICAweDgNCiNkZWZpbmUgIFNfWiAgICAweEMNCg0KLyogcmVzdWx0X3R5cGU6IENNUDogcmV0dXJuIGRpZmY7IExFTjogY29tcGFyZSB1c2luZyBsZW5fZGlmZi9kaWZmICovDQojZGVmaW5lICBDTVAgICAgMg0KI2RlZmluZSAgTEVOICAgIDMNCg0KDQovKiBDb21wYXJlIFMxIGFuZCBTMiBhcyBzdHJpbmdzIGhvbGRpbmcgaW5kaWNlcy92ZXJzaW9uIG51bWJlcnMsDQogICByZXR1cm5pbmcgbGVzcyB0aGFuLCBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gemVybyBpZiBTMSBpcyBsZXNzIHRoYW4sDQogICBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gUzIgKGZvciBtb3JlIGluZm8sIHNlZSB0aGUgR2xpYmMgdGV4aW5mbyBkb2MpLiAgKi8NCg0KaW50DQpzdHJ2ZXJzY21wIChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpDQp7DQogIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgczE7DQogIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgczI7DQogIHVuc2lnbmVkIGNoYXIgYzEsIGMyOw0KICBpbnQgc3RhdGU7DQogIGludCBkaWZmOw0KDQogIC8qIFN5bWJvbChzKSAgICAwICAgICAgIFsxLTldICAgb3RoZXJzICAocGFkZGluZykNCiAgICAgVHJhbnNpdGlvbiAgICgxMCkgMCAgKDAxKSBkICAoMDApIHggICgxMSkgLSAgICovDQogIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmV4dF9zdGF0ZVtdID0NCiAgICB7DQogICAgICAvKiBzdGF0ZSAgICB4ICAgIGQgICAgMCAgICAtICovDQogICAgICAvKiBTX04gKi8gIFNfTiwgU19JLCBTX1osIFNfTiwNCiAgICAgIC8qIFNfSSAqLyAgU19OLCBTX0ksIFNfSSwgU19JLA0KICAgICAgLyogU19GICovICBTX04sIFNfRiwgU19GLCBTX0YsDQogICAgICAvKiBTX1ogKi8gIFNfTiwgU19GLCBTX1osIFNfWg0KICAgIH07DQoNCiAgc3RhdGljIGNvbnN0IGludCByZXN1bHRfdHlwZVtdID0NCiAgICB7DQogICAgICAvKiBzdGF0ZSAgIHgveCAgeC9kICB4LzAgIHgvLSAgZC94ICBkL2QgIGQvMCAgZC8tDQogICAgICAgICAgICAgICAgIDAveCAgMC9kICAwLzAgIDAvLSAgLS94ICAtL2QgIC0vMCAgLS8tICovDQoNCiAgICAgIC8qIFNfTiAqLyAgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIExFTiwgQ01QLCBDTVAsDQogICAgICAgICAgICAgICAgIENNUCwgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIENNUCwgQ01QLA0KICAgICAgLyogU19JICovICBDTVAsIC0xLCAgLTEsICBDTVAsICsxLCAgTEVOLCBMRU4sIENNUCwNCiAgICAgICAgICAgICAgICAgKzEsICBMRU4sIExFTiwgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsDQogICAgICAvKiBTX0YgKi8gIENNUCwgQ01QLCBDTVAsIENNUCwgQ01QLCBMRU4sIENNUCwgQ01QLA0KICAgICAgICAgICAgICAgICBDTVAsIENNUCwgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIENNUCwNCiAgICAgIC8qIFNfWiAqLyAgQ01QLCArMSwgICsxLCAgQ01QLCAtMSwgIENNUCwgQ01QLCBDTVAsDQogICAgICAgICAgICAgICAgIC0xLCAgQ01QLCBDTVAsIENNUA0KICAgIH07DQoNCiAgaWYgKHAxID09IHAyKQ0KICAgIHJldHVybiAwOw0KDQogIGMxID0gKnAxKys7DQogIGMyID0gKnAyKys7DQogIC8qIEhpbnQ6ICcwJyBpcyBhIGRpZ2l0IHRvby4gICovDQogIHN0YXRlID0gU19OIHwgKChjMSA9PSAnMCcpICsgKGlzZGlnaXQgKGMxKSAhPSAwKSk7DQoNCiAgd2hpbGUgKChkaWZmID0gYzEgLSBjMikgPT0gMCAmJiBjMSAhPSAnXDAnKQ0KICAgIHsNCiAgICAgIHN0YXRlID0gbmV4dF9zdGF0ZVtzdGF0ZV07DQogICAgICBjMSA9ICpwMSsrOw0KICAgICAgYzIgPSAqcDIrKzsNCiAgICAgIHN0YXRlIHw9IChjMSA9PSAnMCcpICsgKGlzZGlnaXQgKGMxKSAhPSAwKTsNCiAgICB9DQoNCiAgc3RhdGUgPSByZXN1bHRfdHlwZVtzdGF0ZSA8PCAyIHwgKCgoYzIgPT0gJzAnKSArIChpc2RpZ2l0IChjMikgIT0gMCkpKV07DQoNCiAgc3dpdGNoIChzdGF0ZSkNCiAgICB7DQogICAgY2FzZSBDTVA6DQogICAgICByZXR1cm4gZGlmZjsNCg0KICAgIGNhc2UgTEVOOg0KICAgICAgd2hpbGUgKGlzZGlnaXQgKCpwMSsrKSkNCiAgICAgICAgaWYgKCFpc2RpZ2l0ICgqcDIrKykpDQogICAgICAgICAgcmV0dXJuIDE7DQoNCiAgICAgIHJldHVybiBpc2RpZ2l0ICgqcDIpID8gLTEgOiBkaWZmOw0KDQogICAgZGVmYXVsdDoNCiAgICAgIHJldHVybiBzdGF0ZTsNCiAgICB9DQp9DQo=