LyoKICogJFhGcmVlODY6IHhjL2xpYi9mb250Y29uZmlnL3NyYy9mY2RiZy5jLHYgMS44IDIwMDIvMDgvMTkgMTk6MzI6MDUga2VpdGhwIEV4cCAkCiAqCiAqIENvcHlyaWdodCCpIDIwMDAgS2VpdGggUGFja2FyZCwgbWVtYmVyIG9mIFRoZSBYRnJlZTg2IFByb2plY3QsIEluYy4KICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KICogYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CiAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCiAqIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAogKiBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgogKgogKiBLRUlUSCBQQUNLQVJEIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCiAqIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIKICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogKiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlICJmY2ludC5oIgoKdm9pZApGY1ZhbHVlUHJpbnQgKGNvbnN0IEZjVmFsdWUgdikKewogICAgc3dpdGNoICh2LnR5cGUpIHsKICAgIGNhc2UgRmNUeXBlVm9pZDoKCXByaW50ZiAoIiA8dm9pZD4iKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVJbnRlZ2VyOgoJcHJpbnRmICgiICVkIiwgdi51LmkpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZURvdWJsZToKCXByaW50ZiAoIiAlZyIsIHYudS5kKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVTdHJpbmc6CglwcmludGYgKCIgXCIlc1wiIiwgdi51LnMpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUJvb2w6CglwcmludGYgKCIgJXMiLCB2LnUuYiA/ICJGY1RydWUiIDogIkZjRmFsc2UiKTsKCWJyZWFrOwogICAgY2FzZSBGY1R5cGVNYXRyaXg6CglwcmludGYgKCIgKCVmICVmOyAlZiAlZikiLCB2LnUubS0+eHgsIHYudS5tLT54eSwgdi51Lm0tPnl4LCB2LnUubS0+eXkpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUNoYXJTZXQ6CS8qIFhYWCAqLwoJcHJpbnRmICgiIHNldCIpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUxhbmdTZXQ6CglwcmludGYgKCIgbGFuZ3NldCIpOwoJYnJlYWs7CiAgICBjYXNlIEZjVHlwZUZURmFjZToKCXByaW50ZiAoIiBmYWNlIik7CglicmVhazsKICAgIH0KfQoKdm9pZApGY1ZhbHVlTGlzdFByaW50IChjb25zdCBGY1ZhbHVlTGlzdCAqbCkKewogICAgZm9yICg7IGw7IGwgPSBsLT5uZXh0KQoJRmNWYWx1ZVByaW50IChsLT52YWx1ZSk7Cn0KCnZvaWQKRmNQYXR0ZXJuUHJpbnQgKGNvbnN0IEZjUGF0dGVybiAqcCkKewogICAgaW50CQkgICAgaTsKICAgIEZjUGF0dGVybkVsdCAgICplOwogICAgCiAgICBpZiAoIXApCiAgICB7CglwcmludGYgKCJOdWxsIHBhdHRlcm5cbiIpOwoJcmV0dXJuOwogICAgfQogICAgcHJpbnRmICgiUGF0dGVybiAlZCBvZiAlZFxuIiwgcC0+bnVtLCBwLT5zaXplKTsKICAgIGZvciAoaSA9IDA7IGkgPCBwLT5udW07IGkrKykKICAgIHsKCWUgPSAmcC0+ZWx0c1tpXTsKCXByaW50ZiAoIlx0JXM6IiwgZS0+b2JqZWN0KTsKCUZjVmFsdWVMaXN0UHJpbnQgKGUtPnZhbHVlcyk7CglwcmludGYgKCJcbiIpOwogICAgfQogICAgcHJpbnRmICgiXG4iKTsKfQoKdm9pZApGY09wUHJpbnQgKEZjT3Agb3ApCnsKICAgIHN3aXRjaCAob3ApIHsKICAgIGNhc2UgRmNPcEludGVnZXI6IHByaW50ZiAoIkludGVnZXIiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BEb3VibGU6IHByaW50ZiAoIkRvdWJsZSIpOyBicmVhazsKICAgIGNhc2UgRmNPcFN0cmluZzogcHJpbnRmICgiU3RyaW5nIik7IGJyZWFrOwogICAgY2FzZSBGY09wTWF0cml4OiBwcmludGYgKCJNYXRyaXgiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BCb29sOiBwcmludGYgKCJCb29sIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ2hhclNldDogcHJpbnRmICgiQ2hhclNldCIpOyBicmVhazsKICAgIGNhc2UgRmNPcEZpZWxkOiBwcmludGYgKCJGaWVsZCIpOyBicmVhazsKICAgIGNhc2UgRmNPcENvbnN0OiBwcmludGYgKCJDb25zdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcEFzc2lnbjogcHJpbnRmICgiQXNzaWduIik7IGJyZWFrOwogICAgY2FzZSBGY09wQXNzaWduUmVwbGFjZTogcHJpbnRmICgiQXNzaWduUmVwbGFjZSIpOyBicmVhazsKICAgIGNhc2UgRmNPcFByZXBlbmQ6IHByaW50ZiAoIlByZXBlbmQiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BQcmVwZW5kRmlyc3Q6IHByaW50ZiAoIlByZXBlbmRGaXJzdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcEFwcGVuZDogcHJpbnRmICgiQXBwZW5kIik7IGJyZWFrOwogICAgY2FzZSBGY09wQXBwZW5kTGFzdDogcHJpbnRmICgiQXBwZW5kTGFzdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcFF1ZXN0OiBwcmludGYgKCJRdWVzdCIpOyBicmVhazsKICAgIGNhc2UgRmNPcE9yOiBwcmludGYgKCJPciIpOyBicmVhazsKICAgIGNhc2UgRmNPcEFuZDogcHJpbnRmICgiQW5kIik7IGJyZWFrOwogICAgY2FzZSBGY09wRXF1YWw6IHByaW50ZiAoIkVxdWFsIik7IGJyZWFrOwogICAgY2FzZSBGY09wTm90RXF1YWw6IHByaW50ZiAoIk5vdEVxdWFsIik7IGJyZWFrOwogICAgY2FzZSBGY09wTGVzczogcHJpbnRmICgiTGVzcyIpOyBicmVhazsKICAgIGNhc2UgRmNPcExlc3NFcXVhbDogcHJpbnRmICgiTGVzc0VxdWFsIik7IGJyZWFrOwogICAgY2FzZSBGY09wTW9yZTogcHJpbnRmICgiTW9yZSIpOyBicmVhazsKICAgIGNhc2UgRmNPcE1vcmVFcXVhbDogcHJpbnRmICgiTW9yZUVxdWFsIik7IGJyZWFrOwogICAgY2FzZSBGY09wQ29udGFpbnM6IHByaW50ZiAoIkNvbnRhaW5zIik7IGJyZWFrOwogICAgY2FzZSBGY09wTm90Q29udGFpbnM6IHByaW50ZiAoIk5vdENvbnRhaW5zIik7IGJyZWFrOwogICAgY2FzZSBGY09wUGx1czogcHJpbnRmICgiUGx1cyIpOyBicmVhazsKICAgIGNhc2UgRmNPcE1pbnVzOiBwcmludGYgKCJNaW51cyIpOyBicmVhazsKICAgIGNhc2UgRmNPcFRpbWVzOiBwcmludGYgKCJUaW1lcyIpOyBicmVhazsKICAgIGNhc2UgRmNPcERpdmlkZTogcHJpbnRmICgiRGl2aWRlIik7IGJyZWFrOwogICAgY2FzZSBGY09wTm90OiBwcmludGYgKCJOb3QiKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BOaWw6IHByaW50ZiAoIk5pbCIpOyBicmVhazsKICAgIGNhc2UgRmNPcENvbW1hOiBwcmludGYgKCJDb21tYSIpOyBicmVhazsKICAgIGNhc2UgRmNPcEludmFsaWQ6IHByaW50ZiAoIkludmFsaWQiKTsgYnJlYWs7CiAgICB9Cn0KCnZvaWQKRmNFeHByUHJpbnQgKGNvbnN0IEZjRXhwciAqZXhwcikKewogICAgc3dpdGNoIChleHByLT5vcCkgewogICAgY2FzZSBGY09wSW50ZWdlcjogcHJpbnRmICgiJWQiLCBleHByLT51Lml2YWwpOyBicmVhazsKICAgIGNhc2UgRmNPcERvdWJsZTogcHJpbnRmICgiJWciLCBleHByLT51LmR2YWwpOyBicmVhazsKICAgIGNhc2UgRmNPcFN0cmluZzogcHJpbnRmICgiXCIlc1wiIiwgZXhwci0+dS5zdmFsKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BNYXRyaXg6IHByaW50ZiAoIlslZyAlZyAlZyAlZ10iLAoJCQkgICAgICBleHByLT51Lm12YWwtPnh4LAoJCQkgICAgICBleHByLT51Lm12YWwtPnh5LAoJCQkgICAgICBleHByLT51Lm12YWwtPnl4LAoJCQkgICAgICBleHByLT51Lm12YWwtPnl5KTsgYnJlYWs7CiAgICBjYXNlIEZjT3BCb29sOiBwcmludGYgKCIlcyIsIGV4cHItPnUuYnZhbCA/ICJ0cnVlIiA6ICJmYWxzZSIpOyBicmVhazsKICAgIGNhc2UgRmNPcENoYXJTZXQ6IHByaW50ZiAoImNoYXJzZXRcbiIpOyBicmVhazsKICAgIGNhc2UgRmNPcE5pbDogcHJpbnRmICgibmlsXG4iKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BGaWVsZDogcHJpbnRmICgiJXMiLCBleHByLT51LmZpZWxkKTsgYnJlYWs7CiAgICBjYXNlIEZjT3BDb25zdDogcHJpbnRmICgiJXMiLCBleHByLT51LmNvbnN0YW50KTsgYnJlYWs7CiAgICBjYXNlIEZjT3BRdWVzdDoKCUZjRXhwclByaW50IChleHByLT51LnRyZWUubGVmdCk7CglwcmludGYgKCIgcXVlc3QgIik7CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLnJpZ2h0LT51LnRyZWUubGVmdCk7CglwcmludGYgKCIgY29sb24gIik7CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLnJpZ2h0LT51LnRyZWUucmlnaHQpOwoJYnJlYWs7CiAgICBjYXNlIEZjT3BBc3NpZ246CiAgICBjYXNlIEZjT3BBc3NpZ25SZXBsYWNlOgogICAgY2FzZSBGY09wUHJlcGVuZEZpcnN0OgogICAgY2FzZSBGY09wUHJlcGVuZDoKICAgIGNhc2UgRmNPcEFwcGVuZDoKICAgIGNhc2UgRmNPcEFwcGVuZExhc3Q6CiAgICBjYXNlIEZjT3BPcjoKICAgIGNhc2UgRmNPcEFuZDoKICAgIGNhc2UgRmNPcEVxdWFsOgogICAgY2FzZSBGY09wTm90RXF1YWw6CiAgICBjYXNlIEZjT3BMZXNzOgogICAgY2FzZSBGY09wTGVzc0VxdWFsOgogICAgY2FzZSBGY09wTW9yZToKICAgIGNhc2UgRmNPcE1vcmVFcXVhbDoKICAgIGNhc2UgRmNPcENvbnRhaW5zOgogICAgY2FzZSBGY09wTm90Q29udGFpbnM6CiAgICBjYXNlIEZjT3BQbHVzOgogICAgY2FzZSBGY09wTWludXM6CiAgICBjYXNlIEZjT3BUaW1lczoKICAgIGNhc2UgRmNPcERpdmlkZToKICAgIGNhc2UgRmNPcENvbW1hOgoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5sZWZ0KTsKCXByaW50ZiAoIiAiKTsKCXN3aXRjaCAoZXhwci0+b3ApIHsKCWNhc2UgRmNPcEFzc2lnbjogcHJpbnRmICgiQXNzaWduIik7IGJyZWFrOwoJY2FzZSBGY09wQXNzaWduUmVwbGFjZTogcHJpbnRmICgiQXNzaWduUmVwbGFjZSIpOyBicmVhazsKCWNhc2UgRmNPcFByZXBlbmRGaXJzdDogcHJpbnRmICgiUHJlcGVuZEZpcnN0Iik7IGJyZWFrOwoJY2FzZSBGY09wUHJlcGVuZDogcHJpbnRmICgiUHJlcGVuZCIpOyBicmVhazsKCWNhc2UgRmNPcEFwcGVuZDogcHJpbnRmICgiQXBwZW5kIik7IGJyZWFrOwoJY2FzZSBGY09wQXBwZW5kTGFzdDogcHJpbnRmICgiQXBwZW5kTGFzdCIpOyBicmVhazsKCWNhc2UgRmNPcE9yOiBwcmludGYgKCJPciIpOyBicmVhazsKCWNhc2UgRmNPcEFuZDogcHJpbnRmICgiQW5kIik7IGJyZWFrOwoJY2FzZSBGY09wRXF1YWw6IHByaW50ZiAoIkVxdWFsIik7IGJyZWFrOwoJY2FzZSBGY09wTm90RXF1YWw6IHByaW50ZiAoIk5vdEVxdWFsIik7IGJyZWFrOwoJY2FzZSBGY09wTGVzczogcHJpbnRmICgiTGVzcyIpOyBicmVhazsKCWNhc2UgRmNPcExlc3NFcXVhbDogcHJpbnRmICgiTGVzc0VxdWFsIik7IGJyZWFrOwoJY2FzZSBGY09wTW9yZTogcHJpbnRmICgiTW9yZSIpOyBicmVhazsKCWNhc2UgRmNPcE1vcmVFcXVhbDogcHJpbnRmICgiTW9yZUVxdWFsIik7IGJyZWFrOwoJY2FzZSBGY09wQ29udGFpbnM6IHByaW50ZiAoIkNvbnRhaW5zIik7IGJyZWFrOwoJY2FzZSBGY09wTm90Q29udGFpbnM6IHByaW50ZiAoIk5vdENvbnRhaW5zIik7IGJyZWFrOwoJY2FzZSBGY09wUGx1czogcHJpbnRmICgiUGx1cyIpOyBicmVhazsKCWNhc2UgRmNPcE1pbnVzOiBwcmludGYgKCJNaW51cyIpOyBicmVhazsKCWNhc2UgRmNPcFRpbWVzOiBwcmludGYgKCJUaW1lcyIpOyBicmVhazsKCWNhc2UgRmNPcERpdmlkZTogcHJpbnRmICgiRGl2aWRlIik7IGJyZWFrOwoJY2FzZSBGY09wQ29tbWE6IHByaW50ZiAoIkNvbW1hIik7IGJyZWFrOwoJZGVmYXVsdDogYnJlYWs7Cgl9CglwcmludGYgKCIgIik7CglGY0V4cHJQcmludCAoZXhwci0+dS50cmVlLnJpZ2h0KTsKCWJyZWFrOwogICAgY2FzZSBGY09wTm90OgoJcHJpbnRmICgiTm90ICIpOwoJRmNFeHByUHJpbnQgKGV4cHItPnUudHJlZS5sZWZ0KTsKCWJyZWFrOwogICAgY2FzZSBGY09wSW52YWxpZDogcHJpbnRmICgiSW52YWxpZCIpOyBicmVhazsKICAgIH0KfQoKdm9pZApGY1Rlc3RQcmludCAoY29uc3QgRmNUZXN0ICp0ZXN0KQp7CiAgICBzd2l0Y2ggKHRlc3QtPmtpbmQpIHsKICAgIGNhc2UgRmNNYXRjaFBhdHRlcm46CglwcmludGYgKCJwYXR0ZXJuICIpOwoJYnJlYWs7CiAgICBjYXNlIEZjTWF0Y2hGb250OgoJcHJpbnRmICgiZm9udCAiKTsKCWJyZWFrOwogICAgfQogICAgc3dpdGNoICh0ZXN0LT5xdWFsKSB7CiAgICBjYXNlIEZjUXVhbEFueToKCXByaW50ZiAoImFueSAiKTsKCWJyZWFrOwogICAgY2FzZSBGY1F1YWxBbGw6CglwcmludGYgKCJhbGwgIik7CglicmVhazsKICAgIGNhc2UgRmNRdWFsRmlyc3Q6CglwcmludGYgKCJmaXJzdCAiKTsKCWJyZWFrOwogICAgY2FzZSBGY1F1YWxOb3RGaXJzdDoKCXByaW50ZiAoIm5vdF9maXJzdCAiKTsKCWJyZWFrOwogICAgfQogICAgcHJpbnRmICgiJXMgIiwgdGVzdC0+ZmllbGQpOwogICAgRmNPcFByaW50ICh0ZXN0LT5vcCk7CiAgICBwcmludGYgKCIgIik7CiAgICBGY0V4cHJQcmludCAodGVzdC0+ZXhwcik7CiAgICBwcmludGYgKCJcbiIpOwp9Cgp2b2lkCkZjRWRpdFByaW50IChjb25zdCBGY0VkaXQgKmVkaXQpCnsKICAgIHByaW50ZiAoIkVkaXQgJXMgIiwgZWRpdC0+ZmllbGQpOwogICAgRmNPcFByaW50IChlZGl0LT5vcCk7CiAgICBwcmludGYgKCIgIik7CiAgICBGY0V4cHJQcmludCAoZWRpdC0+ZXhwcik7Cn0KCnZvaWQKRmNTdWJzdFByaW50IChjb25zdCBGY1N1YnN0ICpzdWJzdCkKewogICAgRmNFZGl0CSplOwogICAgRmNUZXN0CSp0OwogICAgCiAgICBwcmludGYgKCJtYXRjaFxuIik7CiAgICBmb3IgKHQgPSBzdWJzdC0+dGVzdDsgdDsgdCA9IHQtPm5leHQpCiAgICB7CglwcmludGYgKCJcdCIpOwoJRmNUZXN0UHJpbnQgKHQpOwogICAgfQogICAgcHJpbnRmICgiZWRpdFxuIik7CiAgICBmb3IgKGUgPSBzdWJzdC0+ZWRpdDsgZTsgZSA9IGUtPm5leHQpCiAgICB7CglwcmludGYgKCJcdCIpOwoJRmNFZGl0UHJpbnQgKGUpOwoJcHJpbnRmICgiO1xuIik7CiAgICB9CiAgICBwcmludGYgKCJcbiIpOwp9Cgp2b2lkCkZjRm9udFNldFByaW50IChjb25zdCBGY0ZvbnRTZXQgKnMpCnsKICAgIGludAkgICAgaTsKCiAgICBwcmludGYgKCJGb250U2V0ICVkIG9mICVkXG4iLCBzLT5uZm9udCwgcy0+c2ZvbnQpOwogICAgZm9yIChpID0gMDsgaSA8IHMtPm5mb250OyBpKyspCiAgICB7CglwcmludGYgKCJGb250ICVkICIsIGkpOwoJRmNQYXR0ZXJuUHJpbnQgKHMtPmZvbnRzW2ldKTsKICAgIH0KfQoKaW50CkZjRGVidWcgKHZvaWQpCnsKICAgIHN0YXRpYyBpbnQgIGluaXRpYWxpemVkOwogICAgc3RhdGljIGludCAgZGVidWc7CgogICAgaWYgKCFpbml0aWFsaXplZCkKICAgIHsKCWNoYXIgICAgKmU7CgoJaW5pdGlhbGl6ZWQgPSAxOwoJZSA9IGdldGVudiAoIkZDX0RFQlVHIik7CglpZiAoZSkKCXsKCSAgICBwcmludGYgKCJGQ19ERUJVRz0lc1xuIiwgZSk7CgkgICAgZGVidWcgPSBhdG9pIChlKTsKCSAgICBpZiAoZGVidWcgPCAwKQoJCWRlYnVnID0gMDsKCX0KICAgIH0KICAgIHJldHVybiBkZWJ1ZzsKfQo=