LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMiBLZWl0aCBQYWNrYXJkLCBtZW1iZXIgb2YgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jLgogKgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0CiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgS2VpdGggUGFja2FyZCBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIEtlaXRoIFBhY2thcmQgbWFrZXMgbm8KICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS4gIEl0CiAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCiAqCiAqIEtFSVRIIFBBQ0tBUkQgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCiAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KICogRVZFTlQgU0hBTEwgS0VJVEggUEFDS0FSRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaWZkZWYgSEFWRV9DT05GSUdfSAojaW5jbHVkZSA8Y29uZmlnLmg+CiNlbHNlCiNkZWZpbmUgSEFWRV9HRVRPUFQgMQojZW5kaWYKCiNpZiBIQVZFX0dFVE9QVF9MT05HCiNkZWZpbmUgX0dOVV9TT1VSQ0UKI2luY2x1ZGUgPGdldG9wdC5oPgpjb25zdCBzdHJ1Y3Qgb3B0aW9uIGxvbmdvcHRzW10gPSB7CiAgICB7InZlcnNpb24iLCAwLCAwLCAnVid9LAogICAgeyJ2ZXJib3NlIiwgMCwgMCwgJ3YnfSwKICAgIHsiaGVscCIsIDAsIDAsICc/J30sCiAgICB7TlVMTCwwLDAsMH0sCn07CiNlbHNlCiNpZiBIQVZFX0dFVE9QVApleHRlcm4gY2hhciAqb3B0YXJnOwpleHRlcm4gaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7CiNlbmRpZgojZW5kaWYKCnN0YXRpYyB2b2lkCnVzYWdlIChjaGFyICpwcm9ncmFtKQp7CiAgICBmcHJpbnRmIChzdGRlcnIsICJ1c2FnZTogJXMgWy12Vj9dIFstLXZlcmJvc2VdIFstLXZlcnNpb25dIFstLWhlbHBdIFtkaXJzXVxuIiwKCSAgICAgcHJvZ3JhbSk7CiAgICBmcHJpbnRmIChzdGRlcnIsICJCdWlsZCBmb250IGluZm9ybWF0aW9uIGNhY2hlcyBpbiBbZGlyc11cbiIKCSAgICAgIihhbGwgZGlyZWN0b3JpZXMgaW4gZm9udCBjb25maWd1cmF0aW9uIGJ5IGRlZmF1bHQpLlxuIik7CiAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOwogICAgZnByaW50ZiAoc3RkZXJyLCAiICAtdiwgLS12ZXJib3NlICAgICAgICBkaXNwbGF5IHN0YXR1cyBpbmZvcm1hdGlvbiB3aGlsZSBidXN5XG4iKTsKICAgIGZwcmludGYgKHN0ZGVyciwgIiAgLVYsIC0tdmVyc2lvbiAgICAgICAgZGlzcGxheSBmb250IGNvbmZpZyB2ZXJzaW9uIGFuZCBleGl0XG4iKTsKICAgIGZwcmludGYgKHN0ZGVyciwgIiAgLT8sIC0taGVscCAgICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgYW5kIGV4aXRcbiIpOwogICAgZXhpdCAoMSk7Cn0KCmludAptYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKICAgIGludAkJcmV0ID0gMDsKICAgIEZjRm9udFNldAkqc2V0OwogICAgRmNDaGFyOAkqKmRpcnM7CiAgICBpbnQJCXZlcmJvc2UgPSAwOwogICAgaW50CQlpOwojaWYgSEFWRV9HRVRPUFRfTE9ORyB8fCBIQVZFX0dFVE9QVAogICAgaW50CQljOwoKI2lmIEhBVkVfR0VUT1BUX0xPTkcKICAgIHdoaWxlICgoYyA9IGdldG9wdF9sb25nIChhcmdjLCBhcmd2LCAiVnY/IiwgbG9uZ29wdHMsIE5VTEwpKSAhPSAtMSkKI2Vsc2UKICAgIHdoaWxlICgoYyA9IGdldG9wdCAoYXJnYywgYXJndiwgIlZ2PyIpKSAhPSAtMSkKI2VuZGlmCiAgICB7Cglzd2l0Y2ggKGMpIHsKCWNhc2UgJ1YnOgoJICAgIGZwcmludGYgKHN0ZGVyciwgImZvbnRjb25maWcgdmVyc2lvbiAlZC4lZC4lZFxuIiwgCgkJICAgICBGQ19NQUpPUiwgRkNfTUlOT1IsIEZDX1JFVklTSU9OKTsKCSAgICBleGl0ICgwKTsKCWNhc2UgJ3YnOgoJICAgIHZlcmJvc2UgPSAxOwoJICAgIGJyZWFrOwoJZGVmYXVsdDoKCSAgICB1c2FnZSAoYXJndlswXSk7Cgl9CiAgICB9CiAgICBpID0gb3B0aW5kOwojZWxzZQogICAgaSA9IDE7CiNlbmRpZgoKICAgIGlmICghRmNJbml0Q29uZmlnICgpKQogICAgewoJZnByaW50ZiAoc3RkZXJyLCAiQ2FuJ3QgaW5pdCBmb250IGNvbmZpZyBsaWJyYXJ5XG4iKTsKCXJldHVybiAxOwogICAgfQogICAgaWYgKGFyZ3ZbaV0pCglkaXJzID0gKEZjQ2hhcjggKiopIChhcmd2K2kpOwogICAgZWxzZQoJZGlycyA9IEZjQ29uZmlnR2V0RGlycyAoMCk7CiAgICAvKgogICAgICogTm93IHNjYW4gYWxsIG9mIHRoZSBkaXJlY3RvcmllcyBpbnRvIHNlcGFyYXRlIGRhdGFiYXNlcwogICAgICogYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0cwogICAgICovCiAgICB3aGlsZSAoZGlycyAmJiAqZGlycykKICAgIHsKCWlmICh2ZXJib3NlKQoJICAgIHByaW50ZiAoIiVzOiBTY2FubmluZyBkaXJlY3RvcnkgXCIlc1wiXG4iLCBhcmd2WzBdLCAqZGlycyk7CglzZXQgPSBGY0ZvbnRTZXRDcmVhdGUgKCk7CglpZiAoIXNldCkKCXsKCSAgICBmcHJpbnRmIChzdGRlcnIsICJPdXQgb2YgbWVtb3J5IGluIFwiJXNcIlxuIiwgKmRpcnMpOwoJICAgIHJldCsrOwoJfQoJZWxzZQoJewoJICAgIGlmICghRmNEaXJTY2FuIChzZXQsIDAsIEZjQ29uZmlnR2V0QmxhbmtzICgwKSwgKmRpcnMsIEZjVHJ1ZSkpCgkgICAgewoJCWZwcmludGYgKHN0ZGVyciwgIkNhbid0IHNjYW4gZGlyZWN0b3J5IFwiJXNcIlxuIiwgKmRpcnMpOwoJCXJldCsrOwoJICAgIH0KCSAgICBlbHNlCgkgICAgewoJCWlmICh2ZXJib3NlKQoJCSAgICBwcmludGYgKCIlczogU2F2aW5nICVkIGZvbnQgbmFtZXMgZm9yIFwiJXNcIlxuIiwgCgkJCSAgICBhcmd2WzBdLCBzZXQtPm5mb250LCAqZGlycyk7CgkJaWYgKCFGY0RpclNhdmUgKHNldCwgKmRpcnMpKQoJCXsKCQkgICAgZnByaW50ZiAoc3RkZXJyLCAiQ2FuJ3Qgc2F2ZSBjYWNoZSBpbiBcIiVzXCJcbiIsICpkaXJzKTsKCQkgICAgcmV0Kys7CgkJfQoJICAgIH0KCSAgICBGY0ZvbnRTZXREZXN0cm95IChzZXQpOwoJfQoJKytkaXJzOwogICAgfQogICAgaWYgKHZlcmJvc2UpCglwcmludGYgKCIlczogJXNcbiIsIGFyZ3ZbMF0sIHJldCA/ICJmYWlsZWQiIDogInN1Y2NlZWRlZCIpOwogICAgcmV0dXJuIHJldDsKfQo=