LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKiAKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KCgojZGVmaW5lIFJFQUxNT0RFX0JBU0UgICAgKChjaGFyKikweDdjMCkKI2RlZmluZSBSRUFMTU9ERV9NQUlMQk9YICgoY2hhciopMHhlMDApCgoKZXh0ZXJuIGNoYXIgcmVhbG1vZGVfZW50ZXI7CgoKaW50IGVudGVyX3JlYWxtb2RlKHUxNiBzZWcsIHUxNiBvZmYsIHN0cnVjdCBwdF9yZWdzICppbiwgc3RydWN0IHB0X3JlZ3MgKm91dCkKewoJCgkvKiBzZXR1cCBvdXQgdGhpbiBiaW9zIGVtdWxhdGlvbiAqLwoJaWYgKGJpb3Nfc2V0dXAoKSkgewoJCXJldHVybiAtMTsKCX0KCQkKCS8qIGNvcHkgdGhlIHJlYWxtb2RlIHN3aXRjaCBjb2RlICovCglpZiAoaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSA+IChSRUFMTU9ERV9NQUlMQk9YLVJFQUxNT0RFX0JBU0UpKSB7CgkJcHJpbnRmKCJyZWFsbW9kZSBzd2l0Y2ggdG9vIGxhcmdlICglbGQgYnl0ZXMsIG1heCBpcyAlZClcbiIsIAoJCSAgICAgICBpMzg2Ym9vdF9yZWFsbW9kZV9zaXplLCAoUkVBTE1PREVfTUFJTEJPWC1SRUFMTU9ERV9CQVNFKSk7CgkJcmV0dXJuIC0xOwoJfQoJCgltZW1jcHkoUkVBTE1PREVfQkFTRSwgaTM4NmJvb3RfcmVhbG1vZGUsIGkzODZib290X3JlYWxtb2RlX3NpemUpOwoJCQoJCglpbi0+ZWlwID0gb2ZmOwoJaW4tPnhjcyA9IHNlZzsKCWlmICgzPmluLT5lc3AgJiAweGZmZmYpIHsKCQlwcmludGYoIldhcm5pbmc6IGVudGVyaW5nIHJlYWxtb2RlIHdpdGggc3AgPCA0IHdpbGwgZmFpbFxuIik7Cgl9CgkKCW1lbWNweShSRUFMTU9ERV9NQUlMQk9YLCBpbiwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CgkKCV9fYXNtX18gdm9sYXRpbGUgKCAKCQkgImxjYWxsICQweDIwLCUwXG4iICA6IDogICJpIiAoJnJlYWxtb2RlX2VudGVyKSApOwoKCW1lbWNweShvdXQsIFJFQUxNT0RFX01BSUxCT1gsIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOwoKCXJldHVybiBvdXQtPmVheDsKfQoK