LyorKw0KDQpDb3B5cmlnaHQgKGMpICAxOTk5LTIwMDYgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQNClRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIGxpY2Vuc2VkIGFuZCBtYWRlIGF2YWlsYWJsZSANCnVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2Ugd2hpY2ggYWNjb21wYW5pZXMgdGhpcyANCmRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0DQpodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwDQoNClRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLA0KV0lUSE9VVCBXQVJSQU5USUVTIE9SIFJFUFJFU0VOVEFUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRC4NCg0KDQpNb2R1bGUgTmFtZToNCg0KICBNb2RpZnlJbmYuYw0KDQpBYnN0cmFjdDoNCg0KICBJdCBpcyBhIHNpbXBsZSB0b29sIHRvIG1vZGlmeSBzb21lIGZpZWxkcyBpbiBhIEZWIGluZiBmaWxlIA0KICBhbmQgb3V0cHV0IGEgbmV3IEZWIGluZiBmaWxlLiAgDQoNCi0tKi8NCg0KI2luY2x1ZGUgInN0ZGlvLmgiDQojaW5jbHVkZSAic3RyaW5nLmgiDQoNCiNkZWZpbmUgVVRJTElUWV9OQU1FICJNb2RpZnlJbmYiDQojZGVmaW5lIFVUSUxJVFlfTUFKT1JfVkVSU0lPTiAxDQojZGVmaW5lIFVUSUxJVFlfTUlOT1JfVkVSU0lPTiAxDQoNCi8vDQovLyBSZWFkIGEgbGluZSBpbnRvIGJ1ZmZlciBpbmNsdWRpbmcgJ1xyXG4nDQovLw0KaW50DQpSZWFkTGluZSAoDQogIGNoYXIgKkxpbmVCdWZmZXIsDQogIEZJTEUgKmZwDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBHQ19UT0RPOiBBZGQgZnVuY3Rpb24gZGVzY3JpcHRpb24NCg0KQXJndW1lbnRzOg0KDQogIExpbmVCdWZmZXIgIC0gR0NfVE9ETzogYWRkIGFyZ3VtZW50IGRlc2NyaXB0aW9uDQogIGZwICAgICAgICAgIC0gR0NfVE9ETzogYWRkIGFyZ3VtZW50IGRlc2NyaXB0aW9uDQoNClJldHVybnM6DQoNCiAgR0NfVE9ETzogYWRkIHJldHVybiB2YWx1ZXMNCg0KLS0qLw0Kew0KICBpbnQgICBDaGFyQzsNCiAgY2hhciAgKkxpbmU7DQoNCiAgTGluZSA9IExpbmVCdWZmZXI7DQoNCiAgd2hpbGUgKChDaGFyQyA9IGZnZXRjIChmcCkpICE9IEVPRikgew0KICAgICpMaW5lKysgPSAoY2hhcikgQ2hhckM7DQogICAgaWYgKENoYXJDID09IDB4MGEpIHsNCiAgICAgIGJyZWFrOw0KICAgIH0NCiAgfQ0KDQogICpMaW5lID0gMDsNCg0KICBpZiAoQ2hhckMgPT0gRU9GKSB7DQogICAgcmV0dXJuIDA7DQogIH0gZWxzZSB7DQogICAgcmV0dXJuIDE7DQogIH0NCg0KfQ0KLy8NCi8vIFdyaXRlIGEgbGluZSBpbnRvIG91dHB1dCBmaWxlDQovLw0KaW50DQpXcml0ZUxpbmUgKA0KICBjaGFyICpMaW5lLA0KICBGSUxFICpmcA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgR0NfVE9ETzogQWRkIGZ1bmN0aW9uIGRlc2NyaXB0aW9uDQoNCkFyZ3VtZW50czoNCg0KICBMaW5lICAtIEdDX1RPRE86IGFkZCBhcmd1bWVudCBkZXNjcmlwdGlvbg0KICBmcCAgICAtIEdDX1RPRE86IGFkZCBhcmd1bWVudCBkZXNjcmlwdGlvbg0KDQpSZXR1cm5zOg0KDQogIEdDX1RPRE86IGFkZCByZXR1cm4gdmFsdWVzDQoNCi0tKi8NCnsNCiAgZndyaXRlIChMaW5lLCBzdHJsZW4gKExpbmUpLCAxLCBmcCk7DQogIHJldHVybiAwOw0KfQ0KLy8NCi8vIEFwcGx5IHBhdHRlcm5zIHRvIGEgbGluZQ0KLy8gQ3VycmVudGx5IHRoZXJlIGFyZSAyIHBhdHRlcm5zIHRvIHN1cHBvcnQNCi8vICc9PScgcmVwbGFjZSBhIGZpZWxkIHZhbHVlIHdpdGggYSBuZXcgdmFsdWUNCi8vICcrPScgYXBwZW5kIGEgc3RyaW5nIGF0IHRoZSBlbmQgb2Ygb3JpZ2luYWwgbGluZQ0KLy8gJy0nICBwcmV2ZW50IHRoZSBsaW5lIGZyb20gYXBwbHlpbmcgYW55IHBhdHRlcm5zDQovLyAgICAgIGl0IGhhcyB0aGUgaGlnaGVzdCBwcmlvcml0eQ0KLy8NCmludA0KQXBwbHlQYXR0ZXJuICgNCiAgY2hhciAqTGluZSwNCiAgY2hhciAqYXJndltdLA0KICBpbnQgIGFyZ2MNCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIEdDX1RPRE86IEFkZCBmdW5jdGlvbiBkZXNjcmlwdGlvbg0KDQpBcmd1bWVudHM6DQoNCiAgTGluZSAgLSBHQ19UT0RPOiBhZGQgYXJndW1lbnQgZGVzY3JpcHRpb24NCiAgXSAgICAgLSBHQ19UT0RPOiBhZGQgYXJndW1lbnQgZGVzY3JpcHRpb24NCiAgYXJnYyAgLSBHQ19UT0RPOiBhZGQgYXJndW1lbnQgZGVzY3JpcHRpb24NCg0KUmV0dXJuczoNCg0KICBHQ19UT0RPOiBhZGQgcmV0dXJuIHZhbHVlcw0KDQotLSovDQp7DQogIHN0YXRpYyBjaGFyIFNlY3Rpb25bMjU2XTsNCiAgY2hhciAgICAgICAgUGF0dGVybkJ1ZmZlclsyNTZdOw0KICBjaGFyICAgICAgICAqUGF0dGVybjsNCiAgY2hhciAgICAgICAgKlBhdHRlcm4xOw0KICBjaGFyICAgICAgICAqUGF0dGVybjI7DQogIGludCAgICAgICAgIFBhdHRlcm5OdW07DQogIGNoYXIgICAgICAgICpQdHI7DQoNCiAgUGF0dGVybiAgICAgPSBQYXR0ZXJuQnVmZmVyOw0KDQogIFBhdHRlcm5OdW0gID0gYXJnYzsNCg0KICAvLw0KICAvLyBGb3Igc2VjdGlvbiBmaWVsZA0KICAvLyByZWNvcmQgY3VycmVudCBzY29wZSBzZWN0aW9uIGludG8gc3RhdGljIGJ1ZmZlcg0KICAvLw0KICBQdHIgPSBMaW5lOw0KICBpZiAoKlB0ciA9PSAnWycpIHsNCiAgICB3aGlsZSAoKlB0ciAhPSAnXScpIHsNCiAgICAgIGlmICghKCpQdHIrKykpIHsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIHN0cmNweSAoU2VjdGlvbiwgTGluZSk7DQogICAgU2VjdGlvbltQdHIgLSBMaW5lICsgMV0gPSAwOw0KICB9DQogIC8vDQogIC8vIEFwcGx5IGVhY2ggcGF0dGVybiBvbiB0aGUgbGluZQ0KICAvLw0KICB3aGlsZSAoUGF0dGVybk51bS0tID4gMykgew0KDQogICAgc3RyY3B5IChQYXR0ZXJuLCBhcmd2W1BhdHRlcm5OdW1dKTsNCg0KICAgIC8vDQogICAgLy8gRm9yIHBhdHRlcm4gJy0nDQogICAgLy8ga2VlcCBpdCB1bm1vZGlmaWVkIGJ5IG90aGVyIHBhdHRlcm5zDQogICAgLy8NCiAgICBpZiAoKlBhdHRlcm4gPT0gJy0nKSB7DQogICAgICBpZiAoc3Ryc3RyIChMaW5lLCBQYXR0ZXJuICsgMSkpIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBjb250aW51ZTsNCiAgICAgIH0NCiAgICB9DQogICAgLy8NCiAgICAvLyBGb3Igb3RoZXIgcGF0dGVybnMNCiAgICAvLyBnZXQgaXRzIHNlY3Rpb24gYXQgZmlyc3QgaWYgaXQgaGFzDQogICAgLy8NCiAgICBpZiAoKlBhdHRlcm4gPT0gJ1snKSB7DQogICAgICBpZiAoc3RybmNtcCAoU2VjdGlvbiwgUGF0dGVybiwgc3RybGVuIChTZWN0aW9uKSkpIHsNCiAgICAgICAgLy8NCiAgICAgICAgLy8gVGhpcyBwYXR0ZXJuIGNhbid0IGJlIGFwcGllZCBmb3IgY3VycmVudCBzZWN0aW9uDQogICAgICAgIC8vDQogICAgICAgIGNvbnRpbnVlOw0KICAgICAgfQ0KICAgICAgLy8NCiAgICAgIC8vIFN0cmlwIHRoZSBzZWN0aW9uIGZpZWxkDQogICAgICAvLw0KICAgICAgd2hpbGUgKCpQYXR0ZXJuICE9ICddJykgew0KICAgICAgICBpZiAoISgqUGF0dGVybisrKSkgew0KICAgICAgICAgIHJldHVybiAtMTsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICBQYXR0ZXJuKys7DQogICAgfQ0KICAgIC8vDQogICAgLy8gQXBwbHkgcGF0dGVybnMNCiAgICAvLw0KICAgIFBhdHRlcm4xICA9IHN0cnN0ciAoUGF0dGVybiwgIj09Iik7DQogICAgUGF0dGVybjIgID0gc3Ryc3RyIChQYXR0ZXJuLCAiKz0iKTsNCiAgICBpZiAoUGF0dGVybjEpIHsNCiAgICAgIC8vDQogICAgICAvLyBGb3IgcGF0dGVybiAnPT0nDQogICAgICAvLyByZXBsYWNlIHRoZSBmaWVsZCB2YWx1ZSB3aXRoIGEgbmV3IHN0cmluZw0KICAgICAgLy8NCiAgICAgIGlmICghc3RybmNtcCAoTGluZSwgUGF0dGVybiwgUGF0dGVybjEgLSBQYXR0ZXJuKSkgew0KICAgICAgICBQYXR0ZXJuMSArPSAyOw0KICAgICAgICBQdHIgPSBzdHJzdHIgKExpbmUsICI9Iik7DQogICAgICAgIGlmICghUHRyKSB7DQogICAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgICB9DQoNCiAgICAgICAgd2hpbGUgKCooKytQdHIpID09ICcgJykNCiAgICAgICAgICA7DQogICAgICAgICpQdHIgPSAwOw0KICAgICAgICBzdHJjYXQgKExpbmUsIFBhdHRlcm4xKTsNCiAgICAgICAgc3RyY2F0IChMaW5lLCAiXHJcbiIpOw0KICAgICAgfQ0KICAgIH0gZWxzZSBpZiAoUGF0dGVybjIpIHsNCiAgICAgIC8vDQogICAgICAvLyBGb3IgcGF0dGVybiAnKz0nDQogICAgICAvLyBhcHBlbmQgYSBzdHJpbmcgYXQgZW5kIG9mIHRoZSBvcmlnaW5hbCBzdHJpbmcNCiAgICAgIC8vDQogICAgICBpZiAoIXN0cm5jbXAgKExpbmUsIFBhdHRlcm4sIFBhdHRlcm4yIC0gUGF0dGVybikpIHsNCiAgICAgICAgUGF0dGVybjIgKz0gMjsNCiAgICAgICAgUHRyID0gTGluZTsNCiAgICAgICAgd2hpbGUgKCpQdHIgIT0gMHgwRCAmJiAqUHRyICE9IDB4MEEpIHsNCiAgICAgICAgICBQdHIrKzsNCiAgICAgICAgfQ0KDQogICAgICAgICpQdHIgPSAwOw0KICAgICAgICBzdHJjYXQgKExpbmUsIFBhdHRlcm4yKTsNCiAgICAgICAgc3RyY2F0IChMaW5lLCAiXHJcbiIpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiAwOw0KfQ0KDQp2b2lkIA0KVmVyc2lvbigNCiAgdm9pZA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgUHJpbnQgb3V0IHZlcnNpb24gaW5mb3JtYXRpb24gZm9yIFN0cmlwLg0KDQpBcmd1bWVudHM6DQoNCiAgTm9uZQ0KICANClJldHVybnM6DQoNCiAgTm9uZQ0KICANCi0tKi8gDQp7DQogIHByaW50ZiAoIiVzIHYlZC4lZCAtRURLIE1vZGlmeSBmaWVsZHMgaW4gRlYgaW5mIGZpbGVzLlxuIiwgVVRJTElUWV9OQU1FLCBVVElMSVRZX01BSk9SX1ZFUlNJT04sIFVUSUxJVFlfTUlOT1JfVkVSU0lPTik7DQogIHByaW50ZiAoIkNvcHlyaWdodCAoYykgMjAwNS0yMDA2IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuIik7DQp9DQoNCnZvaWQgDQpVc2FnZSgNCiAgdm9pZA0KICApDQovKisrDQoNClJvdXRpbmUgRGVzY3JpcHRpb246DQoNCiAgUHJpbnQgb3V0IHVzYWdlIGluZm9ybWF0aW9uIGZvciBTdHJpcC4NCg0KQXJndW1lbnRzOg0KDQogIE5vbmUNCiAgDQpSZXR1cm5zOg0KDQogIE5vbmUNCiAgDQotLSovIA0Kew0KICBWZXJzaW9uKCk7DQogIHByaW50ZiAoIlxuVXNhZ2U6ICVzIElucHV0RmlsZSBPdXRwdXRGaWxlIFBhdHRlcm5fU3RyaW5nIFtQYXR0ZXJuX1N0cmluZyChrV1cblwNCiAgIFdoZXJlOiBcblwNCiAgICAgUGF0dGVybl9TdHJpbmcgaXMgb2YgdGhlIGZvcm1hdCAobm90ZSB0aGF0IHRoZSBzZWN0aW9uIG5hbWUgbXVzdCBiZSBcblwNCiAgICAgZW5jbG9zZWQgd2l0aGluIHNxdWFyZSBicmFja2V0cyk6XG5cDQogICAgICAgICBbc2VjdGlvbl1GaWVsZEtleTxvcD5WYWx1ZSBbKEZpZWxkS2V5PG9wPlZhbHVlKSChrV0gXG5cDQogICAgIFRoZSBvcGVyYXRvciwgPG9wPiwgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzogXG5cDQogICAgICAgICAnPT0nIHJlcGxhY2UgYSBmaWVsZCB2YWx1ZSB3aXRoIGEgbmV3IHZhbHVlIFxuXA0KICAgICAgICAgJys9JyBhcHBlbmQgYSBzdHJpbmcgYXQgdGhlIGVuZCBvZiBvcmlnaW5hbCBsaW5lIFxuXA0KICAgICAgICAgJy0nICBwcmV2ZW50IHRoZSBsaW5lIGZyb20gYXBwbHlpbmcgYW55IHBhdHRlcm5zIFxuXA0KICAgICBFeGFtcGxlOiBcblwNCiAgICAgICAgIE1vZGlmeUluZiBCdWlsZFJvb3RGdkZ2TWFpbi5pbmYgQnVpbGRSb290RnZGdk1haW5FWFAuaW5mIFxcIFxuXA0KICAgICAgICAgICAgICAgW2ZpbGVzXUVGSV9GSUxFX05BTUUrPS5PcmcgRUZJX05VTV9CTE9DS1M9PTB4MjAgXFwgXG5cDQogICAgICAgICAgICAgICBbb3B0aW9uc11FRklfRklMRU5BTUU9PUZjTWFpbkNvbXBhY3QuZnYgLURwc2RTaWduYXR1cmUuZHhlIFxuIiwgVVRJTElUWV9OQU1FKTsNCn0NCg0KDQppbnQNCm1haW4gKA0KICBpbnQgYXJnYywNCiAgY2hhciphcmd2W10NCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIEdDX1RPRE86IEFkZCBmdW5jdGlvbiBkZXNjcmlwdGlvbg0KDQpBcmd1bWVudHM6DQoNCiAgYXJnYyAgLSBHQ19UT0RPOiBhZGQgYXJndW1lbnQgZGVzY3JpcHRpb24NCiAgXSAgICAgLSBHQ19UT0RPOiBhZGQgYXJndW1lbnQgZGVzY3JpcHRpb24NCg0KUmV0dXJuczoNCg0KICBHQ19UT0RPOiBhZGQgcmV0dXJuIHZhbHVlcw0KDQotLSovDQp7DQogIGNoYXIgIExpbmVCdWZmZXJbMjU2XTsNCiAgRklMRSAgKmZwaW47DQogIEZJTEUgICpmcG91dDsNCg0KICBpZiAoYXJnYyA9PSAxKSB7DQogICAgVXNhZ2UoKTsNCiAgICByZXR1cm4gLTE7DQogIH0NCiAgDQogIGlmICgoc3RyY21wKGFyZ3ZbMV0sICItaCIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIi0taGVscCIpID09IDApIHx8DQogICAgICAoc3RyY21wKGFyZ3ZbMV0sICItPyIpID09IDApIHx8IChzdHJjbXAoYXJndlsxXSwgIi8/IikgPT0gMCkpIHsNCiAgICBVc2FnZSgpOw0KICAgIHJldHVybiAwOw0KICB9DQogIA0KICBpZiAoKHN0cmNtcChhcmd2WzFdLCAiLVYiKSA9PSAwKSB8fCAoc3RyY21wKGFyZ3ZbMV0sICItLXZlcnNpb24iKSA9PSAwKSkgew0KICAgIFZlcnNpb24oKTsNCiAgICByZXR1cm4gMDsNCiAgfQ0KICANCiAgaWYgKGFyZ2MgPCAzKSB7DQogICAgVXNhZ2UoKTsNCiAgICByZXR1cm4gLTE7DQogIH0NCg0KICBmcGluID0gZm9wZW4gKGFyZ3ZbMV0sICJyYiIpOw0KICBpZiAoIWZwaW4pIHsNCiAgICBwcmludGYgKCJDYW4ndCBvcGVuIGlucHV0IGZpbGUhXHJcbiIpOw0KICAgIHJldHVybiAtMTsNCiAgfQ0KDQogIGZwb3V0ID0gZm9wZW4gKGFyZ3ZbMl0sICJ3YiIpOw0KICBpZiAoIWZwb3V0KSB7DQogICAgZmNsb3NlIChmcGluKTsNCiAgICBwcmludGYgKCJDYW4ndCBjcmVhdGUgb3V0cHV0IGZpbGUhXHJcbiIpOw0KICAgIHJldHVybiAtMTsNCiAgfQ0KDQogIHdoaWxlIChSZWFkTGluZSAoTGluZUJ1ZmZlciwgZnBpbikpIHsNCiAgICBBcHBseVBhdHRlcm4gKExpbmVCdWZmZXIsIGFyZ3YsIGFyZ2MpOw0KICAgIFdyaXRlTGluZSAoTGluZUJ1ZmZlciwgZnBvdXQpOw0KICB9DQoNCiAgZmNsb3NlIChmcGluKTsNCiAgZmNsb3NlIChmcG91dCk7DQoNCiAgcmV0dXJuIDA7DQp9DQo=