LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAiZmNpbnQuaCIKCkZjT2JqZWN0U2V0ICoKRmNPYmplY3RTZXRDcmVhdGUgKHZvaWQpCnsKICAgIEZjT2JqZWN0U2V0ICAgICpvczsKCiAgICBvcyA9IChGY09iamVjdFNldCAqKSBtYWxsb2MgKHNpemVvZiAoRmNPYmplY3RTZXQpKTsKICAgIGlmICghb3MpCglyZXR1cm4gMDsKICAgIEZjTWVtQWxsb2MgKEZDX01FTV9PQkpFQ1RTRVQsIHNpemVvZiAoRmNPYmplY3RTZXQpKTsKICAgIG9zLT5ub2JqZWN0ID0gMDsKICAgIG9zLT5zb2JqZWN0ID0gMDsKICAgIG9zLT5vYmplY3RzID0gMDsKICAgIHJldHVybiBvczsKfQoKRmNCb29sCkZjT2JqZWN0U2V0QWRkIChGY09iamVjdFNldCAqb3MsIGNvbnN0IGNoYXIgKm9iamVjdCkKewogICAgaW50CQlzOwogICAgY29uc3QgY2hhcgkqKm9iamVjdHM7CiAgICAKICAgIGlmIChvcy0+bm9iamVjdCA9PSBvcy0+c29iamVjdCkKICAgIHsKCXMgPSBvcy0+c29iamVjdCArIDQ7CglpZiAob3MtPm9iamVjdHMpCgkgICAgb2JqZWN0cyA9IChjb25zdCBjaGFyICoqKSByZWFsbG9jICgodm9pZCAqKSBvcy0+b2JqZWN0cywKCQkJCQkgICAgICAgcyAqIHNpemVvZiAoY29uc3QgY2hhciAqKSk7CgllbHNlCgkgICAgb2JqZWN0cyA9IChjb25zdCBjaGFyICoqKSBtYWxsb2MgKHMgKiBzaXplb2YgKGNvbnN0IGNoYXIgKikpOwoJaWYgKCFvYmplY3RzKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJaWYgKG9zLT5zb2JqZWN0KQoJICAgIEZjTWVtRnJlZSAoRkNfTUVNX09CSkVDVFBUUiwgb3MtPnNvYmplY3QgKiBzaXplb2YgKGNvbnN0IGNoYXIgKikpOwoJRmNNZW1BbGxvYyAoRkNfTUVNX09CSkVDVFBUUiwgcyAqIHNpemVvZiAoY29uc3QgY2hhciAqKSk7Cglvcy0+b2JqZWN0cyA9IG9iamVjdHM7Cglvcy0+c29iamVjdCA9IHM7CiAgICB9CiAgICBvcy0+b2JqZWN0c1tvcy0+bm9iamVjdCsrXSA9IG9iamVjdDsKICAgIHJldHVybiBGY1RydWU7Cn0KCnZvaWQKRmNPYmplY3RTZXREZXN0cm95IChGY09iamVjdFNldCAqb3MpCnsKICAgIGlmIChvcy0+b2JqZWN0cykKICAgIHsKCUZjTWVtRnJlZSAoRkNfTUVNX09CSkVDVFBUUiwgb3MtPnNvYmplY3QgKiBzaXplb2YgKGNvbnN0IGNoYXIgKikpOwoJZnJlZSAoKHZvaWQgKikgb3MtPm9iamVjdHMpOwogICAgfQogICAgRmNNZW1GcmVlIChGQ19NRU1fT0JKRUNUU0VULCBzaXplb2YgKEZjT2JqZWN0U2V0KSk7CiAgICBmcmVlIChvcyk7Cn0KCkZjT2JqZWN0U2V0ICoKRmNPYmplY3RTZXRWYUJ1aWxkIChjb25zdCBjaGFyICpmaXJzdCwgdmFfbGlzdCB2YSkKewogICAgRmNPYmplY3RTZXQgICAgKnJldDsKCiAgICBGY09iamVjdFNldFZhcEJ1aWxkIChyZXQsIGZpcnN0LCB2YSk7CiAgICByZXR1cm4gcmV0Owp9CgpGY09iamVjdFNldCAqCkZjT2JqZWN0U2V0QnVpbGQgKGNvbnN0IGNoYXIgKmZpcnN0LCAuLi4pCnsKICAgIHZhX2xpc3QJICAgIHZhOwogICAgRmNPYmplY3RTZXQgICAgKm9zOwoKICAgIHZhX3N0YXJ0ICh2YSwgZmlyc3QpOwogICAgRmNPYmplY3RTZXRWYXBCdWlsZCAob3MsIGZpcnN0LCB2YSk7CiAgICB2YV9lbmQgKHZhKTsKICAgIHJldHVybiBvczsKfQoKc3RhdGljIEZjQm9vbApGY0xpc3RWYWx1ZUxpc3RNYXRjaEFueSAoRmNWYWx1ZUxpc3QgKnYxb3JpZywKCQkJIEZjVmFsdWVMaXN0ICp2Mm9yaWcpCnsKICAgIEZjVmFsdWVMaXN0CSAgICAqdjEsICp2MjsKCiAgICBmb3IgKHYxID0gdjFvcmlnOyB2MTsgdjEgPSB2MS0+bmV4dCkKCWZvciAodjIgPSB2Mm9yaWc7IHYyOyB2MiA9IHYyLT5uZXh0KQoJICAgIGlmIChGY0NvbmZpZ0NvbXBhcmVWYWx1ZSAodjItPnZhbHVlLCBGY09wQ29udGFpbnMsIHYxLT52YWx1ZSkpCgkJcmV0dXJuIEZjVHJ1ZTsKICAgIHJldHVybiBGY0ZhbHNlOwp9CgpzdGF0aWMgRmNCb29sCkZjTGlzdFZhbHVlTGlzdEVxdWFsIChGY1ZhbHVlTGlzdCAgICp2MW9yaWcsCgkJICAgICAgRmNWYWx1ZUxpc3QgICAqdjJvcmlnKQp7CiAgICBGY1ZhbHVlTGlzdAkgICAgKnYxLCAqdjI7CgogICAgZm9yICh2MSA9IHYxb3JpZzsgdjE7IHYxID0gdjEtPm5leHQpCiAgICB7Cglmb3IgKHYyID0gdjJvcmlnOyB2MjsgdjIgPSB2Mi0+bmV4dCkKCSAgICBpZiAoRmNDb25maWdDb21wYXJlVmFsdWUgKHYxLT52YWx1ZSwgRmNPcEVxdWFsLCB2Mi0+dmFsdWUpKQoJCWJyZWFrOwoJaWYgKCF2MikKCSAgICByZXR1cm4gRmNGYWxzZTsKICAgIH0KICAgIGZvciAodjIgPSB2Mm9yaWc7IHYyOyB2MiA9IHYyLT5uZXh0KQogICAgewoJZm9yICh2MSA9IHYxb3JpZzsgdjE7IHYxID0gdjEtPm5leHQpCgkgICAgaWYgKEZjQ29uZmlnQ29tcGFyZVZhbHVlICh2MS0+dmFsdWUsIEZjT3BFcXVhbCwgdjItPnZhbHVlKSkKCQlicmVhazsKCWlmICghdjEpCgkgICAgcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICByZXR1cm4gRmNUcnVlOwp9CgovKgogKiBGY1RydWUgaWZmIGFsbCBvYmplY3RzIGluICJwIiBtYXRjaCAiZm9udCIKICovCgpzdGF0aWMgRmNCb29sCkZjTGlzdFBhdHRlcm5NYXRjaEFueSAoRmNQYXR0ZXJuICpwLAoJCSAgICAgICBGY1BhdHRlcm4gKmZvbnQpCnsKICAgIGludAkJICAgIGk7CiAgICBGY1BhdHRlcm5FbHQgICAqZTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgcC0+bnVtOyBpKyspCiAgICB7CgllID0gRmNQYXR0ZXJuRmluZCAoZm9udCwgcC0+ZWx0c1tpXS5vYmplY3QsIEZjRmFsc2UpOwoJaWYgKCFlKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJaWYgKCFGY0xpc3RWYWx1ZUxpc3RNYXRjaEFueSAocC0+ZWx0c1tpXS52YWx1ZXMsIGUtPnZhbHVlcykpCgkgICAgcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNCb29sCkZjTGlzdFBhdHRlcm5FcXVhbCAoRmNQYXR0ZXJuCSpwMSwKCQkgICAgRmNQYXR0ZXJuCSpwMiwKCQkgICAgRmNPYmplY3RTZXQJKm9zKQp7CiAgICBpbnQJCSAgICBpOwogICAgRmNQYXR0ZXJuRWx0ICAgICplMSwgKmUyOwoKICAgIGZvciAoaSA9IDA7IGkgPCBvcy0+bm9iamVjdDsgaSsrKQogICAgewoJZTEgPSBGY1BhdHRlcm5GaW5kIChwMSwgb3MtPm9iamVjdHNbaV0sIEZjRmFsc2UpOwoJZTIgPSBGY1BhdHRlcm5GaW5kIChwMiwgb3MtPm9iamVjdHNbaV0sIEZjRmFsc2UpOwoJaWYgKCFlMSAmJiAhZTIpCgkgICAgcmV0dXJuIEZjVHJ1ZTsKCWlmICghZTEgfHwgIWUyKQoJICAgIHJldHVybiBGY0ZhbHNlOwoJaWYgKCFGY0xpc3RWYWx1ZUxpc3RFcXVhbCAoZTEtPnZhbHVlcywgZTItPnZhbHVlcykpCgkgICAgcmV0dXJuIEZjRmFsc2U7CiAgICB9CiAgICByZXR1cm4gRmNUcnVlOwp9CgpzdGF0aWMgRmNDaGFyMzIKRmNMaXN0U3RyaW5nSGFzaCAoY29uc3QgRmNDaGFyOAkqcykKewogICAgRmNDaGFyMzIJaCA9IDA7CiAgICBGY0NoYXI4CWM7CgogICAgd2hpbGUgKChjID0gKnMrKykpCiAgICB7CgljID0gRmNUb0xvd2VyIChjKTsKCWggPSAoKGggPDwgMykgXiAoaCA+PiAzKSkgXiBjOwogICAgfQogICAgcmV0dXJuIGg7Cn0KCnN0YXRpYyBGY0NoYXIzMgpGY0xpc3RNYXRyaXhIYXNoIChjb25zdCBGY01hdHJpeCAqbSkKewogICAgaW50CSAgICB4eCA9IChpbnQpIChtLT54eCAqIDEwMCksIAoJICAgIHh5ID0gKGludCkgKG0tPnh5ICogMTAwKSwgCgkgICAgeXggPSAoaW50KSAobS0+eXggKiAxMDApLAoJICAgIHl5ID0gKGludCkgKG0tPnl5ICogMTAwKTsKCiAgICByZXR1cm4gKChGY0NoYXIzMikgeHgpIF4gKChGY0NoYXIzMikgeHkpIF4gKChGY0NoYXIzMikgeXgpIF4gKChGY0NoYXIzMikgeXkpOwp9CgpzdGF0aWMgRmNDaGFyMzIKRmNMaXN0VmFsdWVIYXNoIChGY1ZhbHVlICAgIHYpCnsKICAgIHN3aXRjaCAodi50eXBlKSB7CiAgICBjYXNlIEZjVHlwZVZvaWQ6CglyZXR1cm4gMDsKICAgIGNhc2UgRmNUeXBlSW50ZWdlcjoKCXJldHVybiAoRmNDaGFyMzIpIHYudS5pOwogICAgY2FzZSBGY1R5cGVEb3VibGU6CglyZXR1cm4gKEZjQ2hhcjMyKSAoaW50KSB2LnUuZDsKICAgIGNhc2UgRmNUeXBlU3RyaW5nOgoJcmV0dXJuIEZjTGlzdFN0cmluZ0hhc2ggKHYudS5zKTsKICAgIGNhc2UgRmNUeXBlQm9vbDoKCXJldHVybiAoRmNDaGFyMzIpIHYudS5iOwogICAgY2FzZSBGY1R5cGVNYXRyaXg6CglyZXR1cm4gRmNMaXN0TWF0cml4SGFzaCAodi51Lm0pOwogICAgY2FzZSBGY1R5cGVDaGFyU2V0OgoJcmV0dXJuIEZjQ2hhclNldENvdW50ICh2LnUuYyk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIEZjQ2hhcjMyCkZjTGlzdFZhbHVlTGlzdEhhc2ggKEZjVmFsdWVMaXN0ICAgICpsaXN0KQp7CiAgICBGY0NoYXIzMgloID0gMDsKICAgIAogICAgd2hpbGUgKGxpc3QpCiAgICB7CgloID0gaCBeIEZjTGlzdFZhbHVlSGFzaCAobGlzdC0+dmFsdWUpOwoJbGlzdCA9IGxpc3QtPm5leHQ7CiAgICB9CiAgICByZXR1cm4gaDsKfQoKc3RhdGljIEZjQ2hhcjMyCkZjTGlzdFBhdHRlcm5IYXNoIChGY1BhdHRlcm4JKmZvbnQsCgkJICAgRmNPYmplY3RTZXQJKm9zKQp7CiAgICBpbnQJCSAgICBuOwogICAgRmNQYXR0ZXJuRWx0ICAgICplOwogICAgRmNDaGFyMzIJICAgIGggPSAwOwoKICAgIGZvciAobiA9IDA7IG4gPCBvcy0+bm9iamVjdDsgbisrKQogICAgewoJZSA9IEZjUGF0dGVybkZpbmQgKGZvbnQsIG9zLT5vYmplY3RzW25dLCBGY0ZhbHNlKTsKCWlmIChlKQoJICAgIGggPSBoIF4gRmNMaXN0VmFsdWVMaXN0SGFzaCAoZS0+dmFsdWVzKTsKICAgIH0KICAgIHJldHVybiBoOwp9Cgp0eXBlZGVmIHN0cnVjdCBfRmNMaXN0QnVja2V0IHsKICAgIHN0cnVjdCBfRmNMaXN0QnVja2V0ICAgICpuZXh0OwogICAgRmNDaGFyMzIJCSAgICBoYXNoOwogICAgRmNQYXR0ZXJuCQkgICAgKnBhdHRlcm47Cn0gRmNMaXN0QnVja2V0OwoKI2RlZmluZSBGQ19MSVNUX0hBU0hfU0laRSAgIDQwOTkKCnR5cGVkZWYgc3RydWN0IF9GY0xpc3RIYXNoVGFibGUgewogICAgaW50CQkgICAgZW50cmllczsKICAgIEZjTGlzdEJ1Y2tldCAgICAqYnVja2V0c1tGQ19MSVNUX0hBU0hfU0laRV07Cn0gRmNMaXN0SGFzaFRhYmxlOwogICAgCnN0YXRpYyB2b2lkCkZjTGlzdEhhc2hUYWJsZUluaXQgKEZjTGlzdEhhc2hUYWJsZSAqdGFibGUpCnsKICAgIHRhYmxlLT5lbnRyaWVzID0gMDsKICAgIG1lbXNldCAodGFibGUtPmJ1Y2tldHMsICdcMCcsIHNpemVvZiAodGFibGUtPmJ1Y2tldHMpKTsKfQoKc3RhdGljIHZvaWQKRmNMaXN0SGFzaFRhYmxlQ2xlYW51cCAoRmNMaXN0SGFzaFRhYmxlICp0YWJsZSkKewogICAgaW50CWk7CiAgICBGY0xpc3RCdWNrZXQgICAgKmJ1Y2tldCwgKm5leHQ7CgogICAgZm9yIChpID0gMDsgaSA8IEZDX0xJU1RfSEFTSF9TSVpFOyBpKyspCiAgICB7Cglmb3IgKGJ1Y2tldCA9IHRhYmxlLT5idWNrZXRzW2ldOyBidWNrZXQ7IGJ1Y2tldCA9IG5leHQpCgl7CgkgICAgbmV4dCA9IGJ1Y2tldC0+bmV4dDsKCSAgICBGY1BhdHRlcm5EZXN0cm95IChidWNrZXQtPnBhdHRlcm4pOwoJICAgIEZjTWVtRnJlZSAoRkNfTUVNX0xJU1RCVUNLLCBzaXplb2YgKEZjTGlzdEJ1Y2tldCkpOwoJICAgIGZyZWUgKGJ1Y2tldCk7Cgl9Cgl0YWJsZS0+YnVja2V0c1tpXSA9IDA7CiAgICB9CiAgICB0YWJsZS0+ZW50cmllcyA9IDA7Cn0KCnN0YXRpYyBGY0Jvb2wKRmNMaXN0QXBwZW5kIChGY0xpc3RIYXNoVGFibGUJKnRhYmxlLAoJICAgICAgRmNQYXR0ZXJuCQkqZm9udCwKCSAgICAgIEZjT2JqZWN0U2V0CSpvcykKewogICAgaW50CQkgICAgbzsKICAgIEZjUGF0dGVybkVsdCAgICAqZTsKICAgIEZjVmFsdWVMaXN0CSAgICAqdjsKICAgIEZjQ2hhcjMyCSAgICBoYXNoOwogICAgRmNMaXN0QnVja2V0ICAgICoqcHJldiwgKmJ1Y2tldDsKCiAgICBoYXNoID0gRmNMaXN0UGF0dGVybkhhc2ggKGZvbnQsIG9zKTsKICAgIGZvciAocHJldiA9ICZ0YWJsZS0+YnVja2V0c1toYXNoICUgRkNfTElTVF9IQVNIX1NJWkVdOwoJIChidWNrZXQgPSAqcHJldik7IHByZXYgPSAmKGJ1Y2tldC0+bmV4dCkpCiAgICB7CglpZiAoYnVja2V0LT5oYXNoID09IGhhc2ggJiYgCgkgICAgRmNMaXN0UGF0dGVybkVxdWFsIChidWNrZXQtPnBhdHRlcm4sIGZvbnQsIG9zKSkKCSAgICByZXR1cm4gRmNUcnVlOwogICAgfQogICAgYnVja2V0ID0gKEZjTGlzdEJ1Y2tldCAqKSBtYWxsb2MgKHNpemVvZiAoRmNMaXN0QnVja2V0KSk7CiAgICBpZiAoIWJ1Y2tldCkKCWdvdG8gYmFpbDA7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fTElTVEJVQ0ssIHNpemVvZiAoRmNMaXN0QnVja2V0KSk7CiAgICBidWNrZXQtPm5leHQgPSAwOwogICAgYnVja2V0LT5oYXNoID0gaGFzaDsKICAgIGJ1Y2tldC0+cGF0dGVybiA9IEZjUGF0dGVybkNyZWF0ZSAoKTsKICAgIGlmICghYnVja2V0LT5wYXR0ZXJuKQoJZ290byBiYWlsMTsKICAgIAogICAgZm9yIChvID0gMDsgbyA8IG9zLT5ub2JqZWN0OyBvKyspCiAgICB7CgllID0gRmNQYXR0ZXJuRmluZCAoZm9udCwgb3MtPm9iamVjdHNbb10sIEZjRmFsc2UpOwoJaWYgKGUpCgl7CgkgICAgZm9yICh2ID0gZS0+dmFsdWVzOyB2OyB2ID0gdi0+bmV4dCkKCSAgICB7CgkJaWYgKCFGY1BhdHRlcm5BZGQgKGJ1Y2tldC0+cGF0dGVybiwgCgkJCQkgICBvcy0+b2JqZWN0c1tvXSwgCgkJCQkgICB2LT52YWx1ZSwgRmNUcnVlKSkKCQkgICAgZ290byBiYWlsMjsKCSAgICB9Cgl9CiAgICB9CiAgICAqcHJldiA9IGJ1Y2tldDsKICAgICsrdGFibGUtPmVudHJpZXM7CgogICAgcmV0dXJuIEZjVHJ1ZTsKICAgIApiYWlsMjoKICAgIEZjUGF0dGVybkRlc3Ryb3kgKGJ1Y2tldC0+cGF0dGVybik7CmJhaWwxOgogICAgRmNNZW1GcmVlIChGQ19NRU1fTElTVEJVQ0ssIHNpemVvZiAoRmNMaXN0QnVja2V0KSk7CiAgICBmcmVlIChidWNrZXQpOwpiYWlsMDoKICAgIHJldHVybiBGY0ZhbHNlOwp9CgpGY0ZvbnRTZXQgKgpGY0ZvbnRMaXN0IChGY0NvbmZpZwkqY29uZmlnLAoJICAgIEZjUGF0dGVybgkqcCwKCSAgICBGY09iamVjdFNldCAqb3MpCnsKICAgIEZjRm9udFNldAkgICAgKnJldDsKICAgIEZjRm9udFNldAkgICAgKnM7CiAgICBpbnQJCSAgICBmOwogICAgRmNTZXROYW1lCSAgICBzZXQ7CiAgICBGY0xpc3RIYXNoVGFibGUgdGFibGU7CiAgICBpbnQJCSAgICBpOwogICAgRmNMaXN0QnVja2V0ICAgICpidWNrZXQ7CgogICAgaWYgKCFjb25maWcpCiAgICB7Cgljb25maWcgPSBGY0NvbmZpZ0dldEN1cnJlbnQgKCk7CglpZiAoIWNvbmZpZykKCSAgICBnb3RvIGJhaWwwOwogICAgfQogICAgRmNMaXN0SGFzaFRhYmxlSW5pdCAoJnRhYmxlKTsKICAgIC8qCiAgICAgKiBXYWxrIGFsbCBhdmFpbGFibGUgZm9udHMgYWRkaW5nIHRob3NlIHRoYXQKICAgICAqIG1hdGNoIHRvIHRoZSBoYXNoIHRhYmxlCiAgICAgKi8KICAgIGZvciAoc2V0ID0gRmNTZXRTeXN0ZW07IHNldCA8PSBGY1NldEFwcGxpY2F0aW9uOyBzZXQrKykKICAgIHsKCXMgPSBjb25maWctPmZvbnRzW3NldF07CglpZiAoIXMpCgkgICAgY29udGludWU7Cglmb3IgKGYgPSAwOyBmIDwgcy0+bmZvbnQ7IGYrKykKCSAgICBpZiAoRmNMaXN0UGF0dGVybk1hdGNoQW55IChwLCBzLT5mb250c1tmXSkpCgkJaWYgKCFGY0xpc3RBcHBlbmQgKCZ0YWJsZSwgcy0+Zm9udHNbZl0sIG9zKSkKCQkgICAgZ290byBiYWlsMTsKICAgIH0KI2lmIDAKICAgIHsKCWludAltYXggPSAwOwoJaW50CWZ1bGwgPSAwOwoJaW50CWVudHMgPSAwOwoJaW50CWxlbjsKCWZvciAoaSA9IDA7IGkgPCBGQ19MSVNUX0hBU0hfU0laRTsgaSsrKQoJewoJICAgIGlmICgoYnVja2V0ID0gdGFibGUuYnVja2V0c1tpXSkpCgkgICAgewoJCWxlbiA9IDA7CgkJZm9yICg7IGJ1Y2tldDsgYnVja2V0ID0gYnVja2V0LT5uZXh0KQoJCXsKCQkgICAgZW50cysrOwoJCSAgICBsZW4rKzsKCQl9CgkJaWYgKGxlbiA+IG1heCkKCQkgICAgbWF4ID0gbGVuOwoJCWZ1bGwrKzsKCSAgICB9Cgl9CglwcmludGYgKCJ1c2VkOiAlZCBtYXg6ICVkIGF2ZzogJWdcbiIsIGZ1bGwsIG1heCwgCgkJKGRvdWJsZSkgZW50cyAvIEZDX0xJU1RfSEFTSF9TSVpFKTsKICAgIH0KI2VuZGlmCiAgICAvKgogICAgICogV2FsayB0aGUgaGFzaCB0YWJsZSBhbmQgYnVpbGQKICAgICAqIGEgZm9udCBzZXQKICAgICAqLwogICAgcmV0ID0gRmNGb250U2V0Q3JlYXRlICgpOwogICAgaWYgKCFyZXQpCglnb3RvIGJhaWwwOwogICAgZm9yIChpID0gMDsgaSA8IEZDX0xJU1RfSEFTSF9TSVpFOyBpKyspCgl3aGlsZSAoKGJ1Y2tldCA9IHRhYmxlLmJ1Y2tldHNbaV0pKQoJewoJICAgIGlmICghRmNGb250U2V0QWRkIChyZXQsIGJ1Y2tldC0+cGF0dGVybikpCgkJZ290byBiYWlsMjsKCSAgICB0YWJsZS5idWNrZXRzW2ldID0gYnVja2V0LT5uZXh0OwoJICAgIEZjTWVtRnJlZSAoRkNfTUVNX0xJU1RCVUNLLCBzaXplb2YgKEZjTGlzdEJ1Y2tldCkpOwoJICAgIGZyZWUgKGJ1Y2tldCk7Cgl9CiAgICAKICAgIHJldHVybiByZXQ7CgpiYWlsMjoKICAgIEZjRm9udFNldERlc3Ryb3kgKHJldCk7CmJhaWwxOgogICAgRmNMaXN0SGFzaFRhYmxlQ2xlYW51cCAoJnRhYmxlKTsKYmFpbDA6CiAgICByZXR1cm4gMDsKfQo=