Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qCiAqICByZWFkcHJvZmlsZS5jIC0gdXNlZCB0byByZWFkIC9wcm9jL3Byb2ZpbGUKICoKICogIENvcHlyaWdodCAoQykgMTk5NCwxOTk2IEFsZXNzYW5kcm8gUnViaW5pIChydWJpbmlAaXB2dmlzLnVuaXB2Lml0KQogKgogKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHRhcmJhbGwgZm9yIGRldGFpbHMuCiAqLwoKLyoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICogMTk5OS0wOS0wMSBTdGVwaGFuZSBFcmFuaWFuIDxlcmFuaWFuQGNlbGxvLmhwbC5ocC5jb20+CiAqIC0gNjRiaXQgY2xlYW4gcGF0Y2gKICogM0ZlYjIwMDEgQW5kcmV3IE1vcnRvbiA8YW5kcmV3bUB1b3cuZWR1LmF1PgogKiAtIC1NIG9wdGlvbiB0byB3cml0ZSBwcm9maWxlIG11bHRpcGxpZXIuCiAqIDIwMDEtMTEtMDcgV2VybmVyIEFsbWVzYmVyZ2VyIDx3YUBhbG1lc2Jlcmdlci5uZXQ+CiAqIC0gYnl0ZSBvcmRlciBhdXRvLWRldGVjdGlvbiBhbmQgLW4gb3B0aW9uCiAqIDIwMDEtMTEtMDkgV2VybmVyIEFsbWVzYmVyZ2VyIDx3YUBhbG1lc2Jlcmdlci5uZXQ+CiAqIC0gc2tpcCBzdGVwIHNpemUgKGluZGV4IDApCiAqIDIwMDItMDMtMDkgSm9obiBMZXZvbiA8bW96QGNvbXBzb2MubWFuLmFjLnVrPgogKiAtIG1ha2UgbWFwbGluZW5vIGRvIHNvbWV0aGluZwogKiAyMDAyLTExLTI4IE1hZHMgTWFydGluIEpvZXJnZW5zZW4gKwogKiAtIGFsc28gdHJ5IC9ib290L1N5c3RlbS5tYXAtYHVuYW1lIC1yYAogKiAyMDAzLTA0LTA5IFdlcm5lciBBbG1lc2JlcmdlciA8d2FAYWxtZXNiZXJnZXIubmV0PgogKiAtIGZpeGVkIG9mZi1ieSBlaWdodCBlcnJvciBhbmQgaW1wcm92ZWQgaGV1cmlzdGljcyBpbiBieXRlIG9yZGVyIGRldGVjdGlvbgogKiAyMDAzLTA4LTEyIE5pa2l0YSBEYW5pbG92IDxOaWtpdGFATmFtZXN5cy5DT00+CiAqIC0gYWRkZWQgLXMgb3B0aW9uOyBleGFtcGxlIG9mIHVzZToKICogInJlYWRwcm9maWxlIC1zIC1tIC9ib290L1N5c3RlbS5tYXAtdGVzdCB8IGdyZXAgX19kX2xvb2t1cCB8IHNvcnQgLW4gLWszIgogKgogKiBUYWtlbiBmcm9tIHV0aWwtbGludXggYW5kIGFkYXB0ZWQgZm9yIGJ1c3lib3ggYnkKICogUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4uCiAqLwoKI2luY2x1ZGUgImJ1c3lib3guaCIKI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CgojZGVmaW5lIFNfTEVOIDEyOAoKLyogVGhlc2UgYXJlIHRoZSBkZWZhdWx0cyAqLwpzdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0bWFwW109Ii9ib290L1N5c3RlbS5tYXAiOwpzdGF0aWMgY29uc3QgY2hhciBkZWZhdWx0cHJvW109Ii9wcm9jL3Byb2ZpbGUiOwoKaW50IHJlYWRwcm9maWxlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CglGSUxFICptYXA7CglpbnQgcHJvRmQ7Cgljb25zdCBjaGFyICptYXBGaWxlLCAqcHJvRmlsZSwgKm11bHQ9MDsKCXVuc2lnbmVkIGxvbmcgbGVuPTAsIGluZHg9MTsKCXVpbnQ2NF90IGFkZDA9MDsKCXVuc2lnbmVkIGludCBzdGVwOwoJdW5zaWduZWQgaW50ICpidWYsIHRvdGFsLCBmbl9sZW47Cgl1bnNpZ25lZCBsb25nIGxvbmcgZm5fYWRkLCBuZXh0X2FkZDsgICAgICAgICAgLyogY3VycmVudCBhbmQgbmV4dCBhZGRyZXNzICovCgljaGFyIGZuX25hbWVbU19MRU5dLCBuZXh0X25hbWVbU19MRU5dOyAgIC8qIGN1cnJlbnQgYW5kIG5leHQgbmFtZSAqLwoJY2hhciBtb2RlWzhdOwoJaW50IGM7CglpbnQgb3B0QWxsPTAsIG9wdEluZm89MCwgb3B0UmVzZXQ9MCwgb3B0VmVyYm9zZT0wLCBvcHROYXRpdmU9MDsKCWludCBvcHRCaW5zPTAsIG9wdFN1Yj0wOwoJY2hhciBtYXBsaW5lW1NfTEVOXTsKCWludCBtYXBsaW5lbm89MTsKCWludCBoZWFkZXJfcHJpbnRlZDsKCiNkZWZpbmUgbmV4dCAoY3VycmVudF4xKQoKCXByb0ZpbGUgPSBkZWZhdWx0cHJvOwoJbWFwRmlsZSA9IGRlZmF1bHRtYXA7CgoJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJNOm06bnA6aXR2YXJWYnMiKSkgIT0gLTEpIHsKCQlzd2l0Y2goYykgewoJCWNhc2UgJ20nOgoJCQltYXBGaWxlID0gb3B0YXJnOwoJCQlicmVhazsKCQljYXNlICduJzoKCQkJb3B0TmF0aXZlKys7CgkJCWJyZWFrOwoJCWNhc2UgJ3AnOgoJCQlwcm9GaWxlID0gb3B0YXJnOwoJCQlicmVhazsKCQljYXNlICdhJzoKCQkJb3B0QWxsKys7CgkJCWJyZWFrOwoJCWNhc2UgJ2InOgoJCQlvcHRCaW5zKys7CgkJCWJyZWFrOwoJCWNhc2UgJ3MnOgoJCQlvcHRTdWIrKzsKCQkJYnJlYWs7CgkJY2FzZSAnaSc6CgkJCW9wdEluZm8rKzsKCQkJYnJlYWs7CgkJY2FzZSAnTSc6CgkJCW11bHQgPSBvcHRhcmc7CgkJCWJyZWFrOwoJCWNhc2UgJ3InOgoJCQlvcHRSZXNldCsrOwoJCQlicmVhazsKCQljYXNlICd2JzoKCQkJb3B0VmVyYm9zZSsrOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQliYl9zaG93X3VzYWdlKCk7CgkJfQoJfQoKCWlmIChvcHRSZXNldCB8fCBtdWx0KSB7CgkJaW50IG11bHRpcGxpZXIsIGZkLCB0b193cml0ZTsKCgkJLyoKCQkgKiBXaGVuIHdyaXRpbmcgdGhlIG11bHRpcGxpZXIsIGlmIHRoZSBsZW5ndGggb2YgdGhlIHdyaXRlIGlzCgkJICogbm90IHNpemVvZihpbnQpLCB0aGUgbXVsdGlwbGllciBpcyBub3QgY2hhbmdlZAoJCSAqLwoJCWlmIChtdWx0KSB7CgkJCW11bHRpcGxpZXIgPSBzdHJ0b3VsKG11bHQsIDAsIDEwKTsKCQkJdG9fd3JpdGUgPSBzaXplb2YoaW50KTsKCQl9IGVsc2UgewoJCQltdWx0aXBsaWVyID0gMDsKCQkJdG9fd3JpdGUgPSAxOwkvKiBzdGggZGlmZmVyZW50IGZyb20gc2l6ZW9mKGludCkgKi8KCQl9CgoJCWZkID0geG9wZW4oZGVmYXVsdHBybyxPX1dST05MWSk7CgoJCWlmICh3cml0ZShmZCwgJm11bHRpcGxpZXIsIHRvX3dyaXRlKSAhPSB0b193cml0ZSkKCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJlcnJvciB3cml0aW5nICVzIiwgZGVmYXVsdHBybyk7CgoJCWNsb3NlKGZkKTsKCQlyZXR1cm4gRVhJVF9TVUNDRVNTOwoJfQoKCS8qCgkgKiBVc2UgYW4gZmQgZm9yIHRoZSBwcm9maWxpbmcgYnVmZmVyLCB0byBza2lwIHN0ZGlvIG92ZXJoZWFkCgkgKi8KCglwcm9GZCA9IHhvcGVuKHByb0ZpbGUsT19SRE9OTFkpOwoKCWlmICgoKGludCkobGVuPWxzZWVrKHByb0ZkLDAsU0VFS19FTkQpKSA8IDApCgkgICAgfHwgKGxzZWVrKHByb0ZkLDAsU0VFS19TRVQpIDwgMCkpCgkJYmJfcGVycm9yX21zZ19hbmRfZGllKHByb0ZpbGUpOwoKCWJ1ZiA9IHhtYWxsb2MobGVuKTsKCglpZiAocmVhZChwcm9GZCxidWYsbGVuKSAhPSBsZW4pCgkJYmJfcGVycm9yX21zZ19hbmRfZGllKHByb0ZpbGUpOwoKCWNsb3NlKHByb0ZkKTsKCglpZiAoIW9wdE5hdGl2ZSkgewoJCWludCBlbnRyaWVzID0gbGVuL3NpemVvZigqYnVmKTsKCQlpbnQgYmlnID0gMCxzbWFsbCA9IDAsaTsKCQl1bnNpZ25lZCAqcDsKCgkJZm9yIChwID0gYnVmKzE7IHAgPCBidWYrZW50cmllczsgcCsrKSB7CgkJCWlmICgqcCAmIH4wVSA8PCAoc2l6ZW9mKCpidWYpKjQpKQoJCQkJYmlnKys7CgkJCWlmICgqcCAmICgoMSA8PCAoc2l6ZW9mKCpidWYpKjQpKS0xKSkKCQkJCXNtYWxsKys7CgkJfQoJCWlmIChiaWcgPiBzbWFsbCkgewoJCQliYl9lcnJvcl9tc2coIkFzc3VtaW5nIHJldmVyc2VkIGJ5dGUgb3JkZXIuICIKCQkJCSJVc2UgLW4gdG8gZm9yY2UgbmF0aXZlIGJ5dGUgb3JkZXIuIik7CgkJCWZvciAocCA9IGJ1ZjsgcCA8IGJ1ZitlbnRyaWVzOyBwKyspCgkJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKCpidWYpLzI7IGkrKykgewoJCQkJCXVuc2lnbmVkIGNoYXIgKmIgPSAodW5zaWduZWQgY2hhciAqKSBwOwoJCQkJCXVuc2lnbmVkIGNoYXIgdG1wOwoKCQkJCQl0bXAgPSBiW2ldOwoJCQkJCWJbaV0gPSBiW3NpemVvZigqYnVmKS1pLTFdOwoJCQkJCWJbc2l6ZW9mKCpidWYpLWktMV0gPSB0bXA7CgkJCQl9CgkJfQoJfQoKCXN0ZXAgPSBidWZbMF07CglpZiAob3B0SW5mbykgewoJCXByaW50ZigiU2FtcGxpbmdfc3RlcDogJWlcbiIsIHN0ZXApOwoJCXJldHVybiBFWElUX1NVQ0NFU1M7Cgl9CgoJdG90YWwgPSAwOwoKCW1hcCA9IHhmb3BlbihtYXBGaWxlLCAiciIpOwoKCXdoaWxlIChmZ2V0cyhtYXBsaW5lLFNfTEVOLG1hcCkpIHsKCQlpZiAoc3NjYW5mKG1hcGxpbmUsIiVsbHggJXMgJXMiLCZmbl9hZGQsbW9kZSxmbl9uYW1lKSAhPSAzKQoJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMoJWkpOiB3cm9uZyBtYXAgbGluZSIsCgkJCQkJICAgICBtYXBGaWxlLCBtYXBsaW5lbm8pOwoKCQlpZiAoIXN0cmNtcChmbl9uYW1lLCJfc3RleHQiKSkgLyogb25seSBlbGYgd29ya3MgbGlrZSB0aGlzICovIHsKCQkJYWRkMCA9IGZuX2FkZDsKCQkJYnJlYWs7CgkJfQoJCW1hcGxpbmVubysrOwoJfQoKCWlmICghYWRkMCkKCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZmluZCBcIl9zdGV4dFwiIGluICVzIiwgbWFwRmlsZSk7CgoJLyoKCSAqIE1haW4gbG9vcC4KCSAqLwoJd2hpbGUgKGZnZXRzKG1hcGxpbmUsU19MRU4sbWFwKSkgewoJCXVuc2lnbmVkIGludCB0aGlzID0gMDsKCgkJaWYgKHNzY2FuZihtYXBsaW5lLCIlbGx4ICVzICVzIiwmbmV4dF9hZGQsbW9kZSxuZXh0X25hbWUpICE9IDMpCgkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyglaSk6IHdyb25nIG1hcCBsaW5lIiwKCQkJCQkgICAgIG1hcEZpbGUsIG1hcGxpbmVubyk7CgoJCWhlYWRlcl9wcmludGVkID0gMDsKCgkJLyogaWdub3JlIGFueSBMRUFESU5HIChiZWZvcmUgYSAnW3RUXScgc3ltYm9sIGlzIGZvdW5kKQoJCSAgIEFic29sdXRlIHN5bWJvbHMgKi8KCQlpZiAoKCptb2RlID09ICdBJyB8fCAqbW9kZSA9PSAnPycpICYmIHRvdGFsID09IDApIGNvbnRpbnVlOwoJCWlmICgqbW9kZSAhPSAnVCcgJiYgKm1vZGUgIT0gJ3QnICYmCgkJICAgICptb2RlICE9ICdXJyAmJiAqbW9kZSAhPSAndycpCgkJCWJyZWFrOwkvKiBvbmx5IHRleHQgaXMgcHJvZmlsZWQgKi8KCgkJaWYgKGluZHggPj0gbGVuIC8gc2l6ZW9mKCpidWYpKQoJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicHJvZmlsZSBhZGRyZXNzIG91dCBvZiByYW5nZS4gIgoJCQkJCSAgICAgIldyb25nIG1hcCBmaWxlPyIpOwoKCQl3aGlsZSAoaW5keCA8IChuZXh0X2FkZC1hZGQwKS9zdGVwKSB7CgkJCWlmIChvcHRCaW5zICYmIChidWZbaW5keF0gfHwgb3B0QWxsKSkgewoJCQkJaWYgKCFoZWFkZXJfcHJpbnRlZCkgewoJCQkJCXByaW50ZiAoIiVzOlxuIiwgZm5fbmFtZSk7CgkJCQkJaGVhZGVyX3ByaW50ZWQgPSAxOwoJCQkJfQoJCQkJcHJpbnRmICgiXHQlIlBSSXg2NCJcdCV1XG4iLCAoaW5keCAtIDEpKnN0ZXAgKyBhZGQwLCBidWZbaW5keF0pOwoJCQl9CgkJCXRoaXMgKz0gYnVmW2luZHgrK107CgkJfQoJCXRvdGFsICs9IHRoaXM7CgoJCWlmIChvcHRCaW5zKSB7CgkJCWlmIChvcHRWZXJib3NlIHx8IHRoaXMgPiAwKQoJCQkJcHJpbnRmICgiICB0b3RhbFx0XHRcdFx0JXVcbiIsIHRoaXMpOwoJCX0gZWxzZSBpZiAoKHRoaXMgfHwgb3B0QWxsKSAmJgoJCQkgICAoZm5fbGVuID0gbmV4dF9hZGQtZm5fYWRkKSAhPSAwKSB7CgkJCWlmIChvcHRWZXJib3NlKQoJCQkJcHJpbnRmKCIlMDE2bGx4ICUtNDBzICU2aSAlOC40ZlxuIiwgZm5fYWRkLAoJCQkJICAgICAgIGZuX25hbWUsdGhpcyx0aGlzLyhkb3VibGUpZm5fbGVuKTsKCQkJZWxzZQoJCQkJcHJpbnRmKCIlNmkgJS00MHMgJTguNGZcbiIsCgkJCQkgICAgICAgdGhpcyxmbl9uYW1lLHRoaXMvKGRvdWJsZSlmbl9sZW4pOwoJCQlpZiAob3B0U3ViKSB7CgkJCQl1bnNpZ25lZCBsb25nIGxvbmcgc2NhbjsKCgkJCQlmb3IgKHNjYW4gPSAoZm5fYWRkLWFkZDApL3N0ZXAgKyAxOwoJCQkJICAgICBzY2FuIDwgKG5leHRfYWRkLWFkZDApL3N0ZXA7IHNjYW4rKykgewoJCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyOwoKCQkJCQlhZGRyID0gKHNjYW4gLSAxKSpzdGVwICsgYWRkMDsKCQkJCQlwcmludGYoIlx0JSNsbHhcdCVzKyUjbGx4XHQldVxuIiwKCQkJCQkgICAgICAgYWRkciwgZm5fbmFtZSwgYWRkciAtIGZuX2FkZCwKCQkJCQkgICAgICAgYnVmW3NjYW5dKTsKCQkJCX0KCQkJfQoJCX0KCgkJZm5fYWRkID0gbmV4dF9hZGQ7CgkJc3RyY3B5KGZuX25hbWUsbmV4dF9uYW1lKTsKCgkJbWFwbGluZW5vKys7Cgl9CgoJLyogY2xvY2sgdGlja3MsIG91dCBvZiBrZXJuZWwgdGV4dCAtIHByb2JhYmx5IG1vZHVsZXMgKi8KCXByaW50ZigiJTZpICVzXG4iLCBidWZbbGVuL3NpemVvZigqYnVmKS0xXSwgIip1bmtub3duKiIpOwoKCS8qIHRyYWlsZXIgKi8KCWlmIChvcHRWZXJib3NlKQoJCXByaW50ZigiJTAxNnggJS00MHMgJTZpICU4LjRmXG4iLAoJCSAgICAgICAwLCJ0b3RhbCIsdG90YWwsdG90YWwvKGRvdWJsZSkoZm5fYWRkLWFkZDApKTsKCWVsc2UKCQlwcmludGYoIiU2aSAlLTQwcyAlOC40ZlxuIiwKCQkgICAgICAgdG90YWwsInRvdGFsIix0b3RhbC8oZG91YmxlKShmbl9hZGQtYWRkMCkpOwoKCWZjbG9zZShtYXApOwoJZnJlZShidWYpOwoKCXJldHVybiBFWElUX1NVQ0NFU1M7Cn0K