LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMiBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmlnLmg+CiNlbHNlCiNkZWZpbmUgSEFWRV9HRVRPUFQgMQojZW5kaWYKCiNpZiBIQVZFX0dFVE9QVF9MT05HCiNkZWZpbmUgX0dOVV9TT1VSQ0UKI2luY2x1ZGUgPGdldG9wdC5oPgpjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7CiAgICB7InZlcnNpb24iLCAwLCAwLCAnVid9LAogICAgeyJ2ZXJib3NlIiwgMCwgMCwgJ3YnfSwKICAgIHsiaGVscCIsIDAsIDAsICc/J30sCiAgICB7TlVMTCwwLDAsMH0sCn07CiNlbHNlCiNpZiBIQVZFX0dFVE9QVApleHRlcm4gY2hhciAqb3B0YXJnOwpleHRlcm4gaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7CiNlbmRpZgojZW5kaWYKCnZvaWQgdXNhZ2UgKGNoYXIgKnByb2dyYW0pCnsKICAgIGZwcmludGYgKHN0ZGVyciwgInVzYWdlOiAlcyBbLXZWP10gWy0tdmVyYm9zZV0gWy0tdmVyc2lvbl0gWy0taGVscF0gW2RpcnNdXG4iLAoJICAgICBwcm9ncmFtKTsKICAgIGZwcmludGYgKHN0ZGVyciwgIkJ1aWxkIGZvbnQgaW5mb3JtYXRpb24gY2FjaGVzIGluIFtkaXJzXVxuIgoJICAgICAiKGFsbCBkaXJlY3RvcmllcyBpbiBmb250IGNvbmZpZ3VyYXRpb24gYnkgZGVmYXVsdCkuXG4iKTsKICAgIGZwcmludGYgKHN0ZGVyciwgIlxuIik7CiAgICBmcHJpbnRmIChzdGRlcnIsICIgIC12LCAtLXZlcmJvc2UgICAgICAgIGRpc3BsYXkgc3RhdHVzIGluZm9ybWF0aW9uIHdoaWxlIGJ1c3lcbiIpOwogICAgZnByaW50ZiAoc3RkZXJyLCAiICAtViwgLS12ZXJzaW9uICAgICAgICBkaXNwbGF5IGZvbnQgY29uZmlnIHZlcnNpb24gYW5kIGV4aXRcbiIpOwogICAgZnByaW50ZiAoc3RkZXJyLCAiICAtPywgLS1oZWxwICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdFxuIik7CiAgICBleGl0ICgxKTsKfQoKaW50Cm1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgaW50CQlyZXQgPSAwOwogICAgRmNGb250U2V0CSpzZXQ7CiAgICBjaGFyCSoqZGlyczsKICAgIGludAkJdmVyYm9zZSA9IDA7CiAgICBpbnQJCWk7CiNpZiBIQVZFX0dFVE9QVF9MT05HIHx8IEhBVkVfR0VUT1BUCiAgICBpbnQJCWM7CgojaWYgSEFWRV9HRVRPUFRfTE9ORwogICAgd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJWdj8iLCBsb25nb3B0cywgTlVMTCkpICE9IC0xKQojZWxzZQogICAgd2hpbGUgKChjID0gZ2V0b3B0IChhcmdjLCBhcmd2LCAiVnY/IikpICE9IC0xKQojZW5kaWYKICAgIHsKCXN3aXRjaCAoYykgewoJY2FzZSAnVic6CgkgICAgZnByaW50ZiAoc3RkZXJyLCAiZm9udGNvbmZpZyB2ZXJzaW9uICVkLiVkLiVkXG4iLCAKCQkgICAgIEZDX01BSk9SLCBGQ19NSU5PUiwgRkNfUkVWSVNJT04pOwoJICAgIGV4aXQgKDApOwoJY2FzZSAndic6CgkgICAgdmVyYm9zZSA9IDE7CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIHVzYWdlIChhcmd2WzBdKTsKCX0KICAgIH0KICAgIGkgPSBvcHRpbmQ7CiNlbHNlCiAgICBpID0gMTsKI2VuZGlmCgogICAgaWYgKCFGY0luaXRDb25maWcgKCkpCiAgICB7CglmcHJpbnRmIChzdGRlcnIsICJDYW4ndCBpbml0IGZvbnQgY29uZmlnIGxpYnJhcnlcbiIpOwoJcmV0dXJuIDE7CiAgICB9CiAgICBpZiAoYXJndltpXSkKCWRpcnMgPSBhcmd2K2k7CiAgICBlbHNlCglkaXJzID0gRmNDb25maWdHZXREaXJzICgwKTsKICAgIC8qCiAgICAgKiBOb3cgc2NhbiBhbGwgb2YgdGhlIGRpcmVjdG9yaWVzIGludG8gc2VwYXJhdGUgZGF0YWJhc2VzCiAgICAgKiBhbmQgd3JpdGUgb3V0IHRoZSByZXN1bHRzCiAgICAgKi8KICAgIHdoaWxlIChkaXJzICYmICpkaXJzKQogICAgewoJaWYgKHZlcmJvc2UpCgkgICAgcHJpbnRmICgiJXM6IFNjYW5uaW5nIGRpcmVjdG9yeSBcIiVzXCJcbiIsIGFyZ3ZbMF0sICpkaXJzKTsKCXNldCA9IEZjRm9udFNldENyZWF0ZSAoKTsKCWlmICghc2V0KQoJewoJICAgIGZwcmludGYgKHN0ZGVyciwgIk91dCBvZiBtZW1vcnkgaW4gXCIlc1wiXG4iLCAqZGlycyk7CgkgICAgcmV0Kys7Cgl9CgllbHNlCgl7CgkgICAgaWYgKCFGY0RpclNjYW4gKHNldCwgMCwgRmNDb25maWdHZXRCbGFua3MgKDApLCAqZGlycywgRmNUcnVlKSkKCSAgICB7CgkJZnByaW50ZiAoc3RkZXJyLCAiQ2FuJ3Qgc2NhbiBkaXJlY3RvcnkgXCIlc1wiXG4iLCAqZGlycyk7CgkJcmV0Kys7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJaWYgKHZlcmJvc2UpCgkJICAgIHByaW50ZiAoIiVzOiBTYXZpbmcgJWQgZm9udCBuYW1lcyBmb3IgXCIlc1wiXG4iLCAKCQkJICAgIGFyZ3ZbMF0sIHNldC0+bmZvbnQsICpkaXJzKTsKCQlpZiAoIUZjRGlyU2F2ZSAoc2V0LCAqZGlycykpCgkJewoJCSAgICBmcHJpbnRmIChzdGRlcnIsICJDYW4ndCBzYXZlIGNhY2hlIGluIFwiJXNcIlxuIiwgKmRpcnMpOwoJCSAgICByZXQrKzsKCQl9CgkgICAgfQoJICAgIEZjRm9udFNldERlc3Ryb3kgKHNldCk7Cgl9CgkrK2RpcnM7CiAgICB9CiAgICBpZiAodmVyYm9zZSkKCXByaW50ZiAoIiVzOiAlc1xuIiwgYXJndlswXSwgcmV0ID8gImZhaWxlZCIgOiAic3VjY2VlZGVkIik7CiAgICByZXR1cm4gcmV0Owp9Cg==