LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgImZjaW50LmgiCgp2b2lkCkZjVmFsdWVQcmludCAoRmNWYWx1ZSB2KQp7CiAgICBzd2l0Y2ggKHYudHlwZSkgewogICAgY2FzZSBGY1R5cGVWb2lkOgoJcHJpbnRmICgiIDx2b2lkPiIpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUludGVnZXI6CglwcmludGYgKCIgJWQiLCB2LnUuaSk7CglicmVhazsKICAgIGNhc2UgRmNUeXBlRG91YmxlOgoJcHJpbnRmICgiICVnIiwgdi51LmQpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZVN0cmluZzoKCXByaW50ZiAoIiBcIiVzXCIiLCB2LnUucyk7CglicmVhazsKICAgIGNhc2UgRmNUeXBlQm9vbDoKCXByaW50ZiAoIiAlcyIsIHYudS5iID8gIkZjVHJ1ZSIgOiAiRmNGYWxzZSIpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZU1hdHJpeDoKCXByaW50ZiAoIiAoJWYgJWY7ICVmICVmKSIsIHYudS5tLT54eCwgdi51Lm0tPnh5LCB2LnUubS0+eXgsIHYudS5tLT55eSk7CglicmVhazsKICAgIGNhc2UgRmNUeXBlQ2hhclNldDoJLyogWFhYICovCglwcmludGYgKCIgc2V0Iik7CglicmVhazsKICAgIH0KfQoKdm9pZApGY1ZhbHVlTGlzdFByaW50IChGY1ZhbHVlTGlzdCAqbCkKewogICAgZm9yICg7IGw7IGwgPSBsLT5uZXh0KQoJRmNWYWx1ZVByaW50IChsLT52YWx1ZSk7Cn0KCnZvaWQKRmNQYXR0ZXJuUHJpbnQgKEZjUGF0dGVybiAqcCkKewogICAgaW50CQkgICAgaTsKICAgIEZjUGF0dGVybkVsdCAgICplOwogICAgCiAgICBpZiAoIXApCiAgICB7CglwcmludGYgKCJOdWxsIHBhdHRlcm5cbiIpOwoJcmV0dXJuOwogICAgfQogICAgcHJpbnRmICgiUGF0dGVybiAlZCBvZiAlZFxuIiwgcC0+bnVtLCBwLT5zaXplKTsKICAgIGZvciAoaSA9IDA7IGkgPCBwLT5udW07IGkrKykKICAgIHsKCWUgPSAmcC0+ZWx0c1tpXTsKCXByaW50ZiAoIlx0JXM6IiwgZS0+b2JqZWN0KTsKCUZjVmFsdWVMaXN0UHJpbnQgKGUtPnZhbHVlcyk7CglwcmludGYgKCJcbiIpOwogICAgfQogICAgcHJpbnRmICgiXG4iKTsKfQoKdm9pZApGY09wUHJpbnQgKEZjT3Agb3ApCnsKICAgIHN3aXRjaCAob3ApIHsKICAgIGNhc2UgRmNPcEludGVnZXI6IHByaW50ZiAoIkludGVnZXIiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BEb3VibGU6IHByaW50ZiAoIkRvdWJsZSIpOyBicmVhazsKICAgIGNhc2UgRmNPcFN0cmluZzogcHJpbnRmICgiU3RyaW5nIik7IGJyZWFrOwogICAgY2FzZSBGY09wTWF0cml4OiBwcmludGYgKCJNYXRyaXgiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BCb29sOiBwcmludGYgKCJCb29sIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ2hhclNldDogcHJpbnRmICgiQ2hhclNldCIpOyBicmVhazsKICAgIGNhc2UgRmNPcEZpZWxkOiBwcmludGYgKCJGaWVsZCIpOyBicmVhazsKICAgIGNhc2UgRmNPcENvbnN0OiBwcmludGYgKCJDb25zdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcEFzc2lnbjogcHJpbnRmICgiQXNzaWduIik7IGJyZWFrOwogICAgY2FzZSBGY09wQXNzaWduUmVwbGFjZTogcHJpbnRmICgiQXNzaWduUmVwbGFjZSIpOyBicmVhazsKICAgIGNhc2UgRmNPcFByZXBlbmQ6IHByaW50ZiAoIlByZXBlbmQiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BQcmVwZW5kRmlyc3Q6IHByaW50ZiAoIlByZXBlbmRGaXJzdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcEFwcGVuZDogcHJpbnRmICgiQXBwZW5kIik7IGJyZWFrOwogICAgY2FzZSBGY09wQXBwZW5kTGFzdDogcHJpbnRmICgiQXBwZW5kTGFzdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcFF1ZXN0OiBwcmludGYgKCJRdWVzdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcE9yOiBwcmludGYgKCJPciIpOyBicmVhazsKICAgIGNhc2UgRmNPcEFuZDogcHJpbnRmICgiQW5kIik7IGJyZWFrOwogICAgY2FzZSBGY09wRXF1YWw6IHByaW50ZiAoIkVxdWFsIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ29udGFpbnM6IHByaW50ZiAoIkNvbnRhaW5zIik7IGJyZWFrOwogICAgY2FzZSBGY09wTm90RXF1YWw6IHByaW50ZiAoIk5vdEVxdWFsIik7IGJyZWFrOwogICAgY2FzZSBGY09wTGVzczogcHJpbnRmICgiTGVzcyIpOyBicmVhazsKICAgIGNhc2UgRmNPcExlc3NFcXVhbDogcHJpbnRmICgiTGVzc0VxdWFsIik7IGJyZWFrOwogICAgY2FzZSBGY09wTW9yZTogcHJpbnRmICgiTW9yZSIpOyBicmVhazsKICAgIGNhc2UgRmNPcE1vcmVFcXVhbDogcHJpbnRmICgiTW9yZUVxdWFsIik7IGJyZWFrOwogICAgY2FzZSBGY09wUGx1czogcHJpbnRmICgiUGx1cyIpOyBicmVhazsKICAgIGNhc2UgRmNPcE1pbnVzOiBwcmludGYgKCJNaW51cyIpOyBicmVhazsKICAgIGNhc2UgRmNPcFRpbWVzOiBwcmludGYgKCJUaW1lcyIpOyBicmVhazsKICAgIGNhc2UgRmNPcERpdmlkZTogcHJpbnRmICgiRGl2aWRlIik7IGJyZWFrOwogICAgY2FzZSBGY09wTm90OiBwcmludGYgKCJOb3QiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BOaWw6IHByaW50ZiAoIk5pbCIpOyBicmVhazsKICAgIGNhc2UgRmNPcENvbW1hOiBwcmludGYgKCJDb21tYSIpOyBicmVhazsKICAgIGNhc2UgRmNPcEludmFsaWQ6IHByaW50ZiAoIkludmFsaWQiKTsgYnJlYWs7CiAgICB9Cn0KCnZvaWQKRmNFeHByUHJpbnQgKEZjRXhwciAqZXhwcikKewogICAgc3dpdGNoIChleHByLT5vcCkgewogICAgY2FzZSBGY09wSW50ZWdlcjogcHJpbnRmICgiJWQiLCBleHByLT51Lml2YWwpOyBicmVhazsKICAgIGNhc2UgRmNPcERvdWJsZTogcHJpbnRmICgiJWciLCBleHByLT51LmR2YWwpOyBicmVhazsKICAgIGNhc2UgRmNPcFN0cmluZzogcHJpbnRmICgiXCIlc1wiIiwgZXhwci0+dS5zdmFsKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BNYXRyaXg6IHByaW50ZiAoIlslZyAlZyAlZyAlZ10iLAoJCQkgICAgICBleHByLT51Lm12YWwtPnh4LAoJCQkgICAgICBleHByLT51Lm12YWwtPnh5LAoJCQkgICAgICBleHByLT51Lm12YWwtPnl4LAoJCQkgICAgICBleHByLT51Lm12YWwtPnl5KTsKICAgIGNhc2UgRmNPcEJvb2w6IHByaW50ZiAoIiVzIiwgZXhwci0+dS5idmFsID8gInRydWUiIDogImZhbHNlIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ2hhclNldDogcHJpbnRmICgiY2hhcnNldFxuIik7IGJyZWFrOwogICAgY2FzZSBGY09wTmlsOiBwcmludGYgKCJuaWxcbiIpOwogICAgY2FzZSBGY09wRmllbGQ6IHByaW50ZiAoIiVzIiwgZXhwci0+dS5maWVsZCk7IGJyZWFrOwogICAgY2FzZSBGY09wQ29uc3Q6IHByaW50ZiAoIiVzIiwgZXhwci0+dS5jb25zdGFudCk7IGJyZWFrOwogICAgY2FzZSBGY09wUXVlc3Q6CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLmxlZnQpOwoJcHJpbnRmICgiIHF1ZXN0ICIpOwoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5yaWdodC0+dS50cmVlLmxlZnQpOwoJcHJpbnRmICgiIGNvbG9uICIpOwoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5yaWdodC0+dS50cmVlLnJpZ2h0KTsKCWJyZWFrOwogICAgY2FzZSBGY09wQXNzaWduOgogICAgY2FzZSBGY09wQXNzaWduUmVwbGFjZToKICAgIGNhc2UgRmNPcFByZXBlbmRGaXJzdDoKICAgIGNhc2UgRmNPcFByZXBlbmQ6CiAgICBjYXNlIEZjT3BBcHBlbmQ6CiAgICBjYXNlIEZjT3BBcHBlbmRMYXN0OgogICAgY2FzZSBGY09wT3I6CiAgICBjYXNlIEZjT3BBbmQ6CiAgICBjYXNlIEZjT3BFcXVhbDoKICAgIGNhc2UgRmNPcENvbnRhaW5zOgogICAgY2FzZSBGY09wTm90RXF1YWw6CiAgICBjYXNlIEZjT3BMZXNzOgogICAgY2FzZSBGY09wTGVzc0VxdWFsOgogICAgY2FzZSBGY09wTW9yZToKICAgIGNhc2UgRmNPcE1vcmVFcXVhbDoKICAgIGNhc2UgRmNPcFBsdXM6CiAgICBjYXNlIEZjT3BNaW51czoKICAgIGNhc2UgRmNPcFRpbWVzOgogICAgY2FzZSBGY09wRGl2aWRlOgogICAgY2FzZSBGY09wQ29tbWE6CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLmxlZnQpOwoJcHJpbnRmICgiICIpOwoJc3dpdGNoIChleHByLT5vcCkgewoJY2FzZSBGY09wQXNzaWduOiBwcmludGYgKCJBc3NpZ24iKTsgYnJlYWs7CgljYXNlIEZjT3BBc3NpZ25SZXBsYWNlOiBwcmludGYgKCJBc3NpZ25SZXBsYWNlIik7IGJyZWFrOwoJY2FzZSBGY09wUHJlcGVuZEZpcnN0OiBwcmludGYgKCJQcmVwZW5kRmlyc3QiKTsgYnJlYWs7CgljYXNlIEZjT3BQcmVwZW5kOiBwcmludGYgKCJQcmVwZW5kIik7IGJyZWFrOwoJY2FzZSBGY09wQXBwZW5kOiBwcmludGYgKCJBcHBlbmQiKTsgYnJlYWs7CgljYXNlIEZjT3BBcHBlbmRMYXN0OiBwcmludGYgKCJBcHBlbmRMYXN0Iik7IGJyZWFrOwoJY2FzZSBGY09wT3I6IHByaW50ZiAoIk9yIik7IGJyZWFrOwoJY2FzZSBGY09wQW5kOiBwcmludGYgKCJBbmQiKTsgYnJlYWs7CgljYXNlIEZjT3BFcXVhbDogcHJpbnRmICgiRXF1YWwiKTsgYnJlYWs7CgljYXNlIEZjT3BDb250YWluczogcHJpbnRmICgiQ29udGFpbnMiKTsgYnJlYWs7CgljYXNlIEZjT3BOb3RFcXVhbDogcHJpbnRmICgiTm90RXF1YWwiKTsgYnJlYWs7CgljYXNlIEZjT3BMZXNzOiBwcmludGYgKCJMZXNzIik7IGJyZWFrOwoJY2FzZSBGY09wTGVzc0VxdWFsOiBwcmludGYgKCJMZXNzRXF1YWwiKTsgYnJlYWs7CgljYXNlIEZjT3BNb3JlOiBwcmludGYgKCJNb3JlIik7IGJyZWFrOwoJY2FzZSBGY09wTW9yZUVxdWFsOiBwcmludGYgKCJNb3JlRXF1YWwiKTsgYnJlYWs7CgljYXNlIEZjT3BQbHVzOiBwcmludGYgKCJQbHVzIik7IGJyZWFrOwoJY2FzZSBGY09wTWludXM6IHByaW50ZiAoIk1pbnVzIik7IGJyZWFrOwoJY2FzZSBGY09wVGltZXM6IHByaW50ZiAoIlRpbWVzIik7IGJyZWFrOwoJY2FzZSBGY09wRGl2aWRlOiBwcmludGYgKCJEaXZpZGUiKTsgYnJlYWs7CgljYXNlIEZjT3BDb21tYTogcHJpbnRmICgiQ29tbWEiKTsgYnJlYWs7CglkZWZhdWx0OiBicmVhazsKCX0KCXByaW50ZiAoIiAiKTsKCUZjRXhwclByaW50IChleHByLT51LnRyZWUucmlnaHQpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BOb3Q6CglwcmludGYgKCJOb3QgIik7CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLmxlZnQpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BJbnZhbGlkOiBwcmludGYgKCJJbnZhbGlkIik7IGJyZWFrOwogICAgfQp9Cgp2b2lkCkZjVGVzdFByaW50IChGY1Rlc3QgKnRlc3QpCnsKICAgIHN3aXRjaCAodGVzdC0+cXVhbCkgewogICAgY2FzZSBGY1F1YWxBbnk6CglwcmludGYgKCJhbnkgIik7CglicmVhazsKICAgIGNhc2UgRmNRdWFsQWxsOgoJcHJpbnRmICgiYWxsICIpOwoJYnJlYWs7CiAgICB9CiAgICBwcmludGYgKCIlcyAiLCB0ZXN0LT5maWVsZCk7CiAgICBGY09wUHJpbnQgKHRlc3QtPm9wKTsKICAgIHByaW50ZiAoIiAiKTsKICAgIEZjRXhwclByaW50ICh0ZXN0LT5leHByKTsKICAgIHByaW50ZiAoIlxuIik7Cn0KCnZvaWQKRmNFZGl0UHJpbnQgKEZjRWRpdCAqZWRpdCkKewogICAgcHJpbnRmICgiRWRpdCAlcyAiLCBlZGl0LT5maWVsZCk7CiAgICBGY09wUHJpbnQgKGVkaXQtPm9wKTsKICAgIHByaW50ZiAoIiAiKTsKICAgIEZjRXhwclByaW50IChlZGl0LT5leHByKTsKfQoKdm9pZApGY1N1YnN0UHJpbnQgKEZjU3Vic3QgKnN1YnN0KQp7CiAgICBGY0VkaXQJKmU7CiAgICBGY1Rlc3QJKnQ7CiAgICAKICAgIHByaW50ZiAoIm1hdGNoXG4iKTsKICAgIGZvciAodCA9IHN1YnN0LT50ZXN0OyB0OyB0ID0gdC0+bmV4dCkKICAgIHsKCXByaW50ZiAoIlx0Iik7CglGY1Rlc3RQcmludCAodCk7CiAgICB9CiAgICBwcmludGYgKCJlZGl0XG4iKTsKICAgIGZvciAoZSA9IHN1YnN0LT5lZGl0OyBlOyBlID0gZS0+bmV4dCkKICAgIHsKCXByaW50ZiAoIlx0Iik7CglGY0VkaXRQcmludCAoZSk7CglwcmludGYgKCI7XG4iKTsKICAgIH0KICAgIHByaW50ZiAoIlxuIik7Cn0KCnZvaWQKRmNGb250U2V0UHJpbnQgKEZjRm9udFNldCAqcykKewogICAgaW50CSAgICBpOwoKICAgIHByaW50ZiAoIkZvbnRTZXQgJWQgb2YgJWRcbiIsIHMtPm5mb250LCBzLT5zZm9udCk7CiAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmZvbnQ7IGkrKykKICAgIHsKCXByaW50ZiAoIkZvbnQgJWQgIiwgaSk7CglGY1BhdHRlcm5QcmludCAocy0+Zm9udHNbaV0pOwogICAgfQp9CgppbnQKRmNEZWJ1ZyAodm9pZCkKewogICAgc3RhdGljIGludCAgaW5pdGlhbGl6ZWQ7CiAgICBzdGF0aWMgaW50ICBkZWJ1ZzsKCiAgICBpZiAoIWluaXRpYWxpemVkKQogICAgewoJY2hhciAgICAqZTsKCglpbml0aWFsaXplZCA9IDE7CgllID0gZ2V0ZW52ICgiRkNfREVCVUciKTsKCWlmIChlKQoJewoJICAgIHByaW50ZiAoIkZDX0RFQlVHPSVzXG4iLCBlKTsKCSAgICBkZWJ1ZyA9IGF0b2kgKGUpOwoJICAgIGlmIChkZWJ1ZyA8IDApCgkJZGVidWcgPSAwOwoJfQogICAgfQogICAgcmV0dXJuIGRlYnVnOwp9Cg==