LyoKICogIFBoaXNoaW5nIG1vZHVsZTogZG9tYWluIGxpc3QgaW1wbGVtZW50YXRpb24uCiAqCiAqICBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBU9nL2ayBFZHZpbiA8ZWR3aW5AY2xhbWF2Lm5ldD4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyAKICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAogKiAgTUEgMDIxMTAtMTMwMSwgVVNBLgogKgogKi8KCiNpZiBIQVZFX0NPTkZJR19ICiNpbmNsdWRlICJjbGFtYXYtY29uZmlnLmgiCiNlbmRpZgoKCiNpZm5kZWYgQ0xfREVCVUcKI2RlZmluZSBOREVCVUcKI2VuZGlmCgojaWZkZWYgQ0xfVEhSRUFEX1NBRkUKI2lmbmRlZiBfUkVFTlRSQU5UCiNkZWZpbmUgX1JFRU5UUkFOVAojZW5kaWYKI2VuZGlmCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KCiNpbmNsdWRlICJjbGFtYXYuaCIKI2luY2x1ZGUgIm90aGVycy5oIgojaW5jbHVkZSAicGhpc2hjaGVjay5oIgojaW5jbHVkZSAicGhpc2hfZG9tYWluY2hlY2tfZGIuaCIKI2luY2x1ZGUgInJlZ2V4X2xpc3QuaCIKCmludCBkb21haW5saXN0X21hdGNoKGNvbnN0IHN0cnVjdCBjbF9lbmdpbmUqIGVuZ2luZSxjaGFyKiByZWFsX3VybCxjb25zdCBjaGFyKiBkaXNwbGF5X3VybCxjb25zdCBzdHJ1Y3QgcHJlX2ZpeHVwX2luZm8qIHByZV9maXh1cCxpbnQgaG9zdE9ubHksdW5zaWduZWQgc2hvcnQqIGZsYWdzKQp7Cgljb25zdCBjaGFyKiBpbmZvOwoJaW50IHJjID0gZW5naW5lLT5kb21haW5saXN0X21hdGNoZXIgPyByZWdleF9saXN0X21hdGNoKGVuZ2luZS0+ZG9tYWlubGlzdF9tYXRjaGVyLHJlYWxfdXJsLGRpc3BsYXlfdXJsLGhvc3RPbmx5ID8gcHJlX2ZpeHVwIDogTlVMTCxob3N0T25seSwmaW5mbywwKSA6IDA7CglpZihyYyAmJiBpbmZvICYmIGluZm9bMF0gJiYgaW5mb1swXSAhPSAnOicpIHsvKm1hdGNoIHN1Y2Nlc3NmdWwsIGFuZCBoYXMgY3VzdG9tIGZsYWdzKi8KCQlpZihzdHJsZW4oaW5mbyk9PTMgJiYgaXN4ZGlnaXQoaW5mb1swXSkgJiYgaXN4ZGlnaXQoaW5mb1sxXSkgJiYgaXN4ZGlnaXQoaW5mb1syXSkpIHsKCQkJdW5zaWduZWQgc2hvcnQgbm90d2FudGVkZmxhZ3M9MDsKCQkJc3NjYW5mKGluZm8sIiVoeCIsJm5vdHdhbnRlZGZsYWdzKTsKCQkgICAgICAgICpmbGFncyAmPSB+bm90d2FudGVkZmxhZ3M7LyogZmlsdGVyIHVud2FudGVkIHBoaXNoY2hlY2sgZmxhZ3MgKi8JCgkJfQoJCWVsc2UgewoJCQljbGlfd2Fybm1zZygiUGhpc2hjaGVjazpVbmtub3duIGZsYWcgZm9ybWF0IGluIGRvbWFpbi1saXN0LCAzIGhleCBkaWdpdHMgZXhwZWN0ZWQiKTsKCQl9Cgl9CglyZXR1cm4gcmM7Cn0KCmludCBpbml0X2RvbWFpbmxpc3Qoc3RydWN0IGNsX2VuZ2luZSogZW5naW5lKQp7CglpZihlbmdpbmUpIHsKCQllbmdpbmUtPmRvbWFpbmxpc3RfbWF0Y2hlciA9IChzdHJ1Y3QgcmVnZXhfbWF0Y2hlciAqKSBjbGlfbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVnZXhfbWF0Y2hlcikpOwoJCWlmKCFlbmdpbmUtPmRvbWFpbmxpc3RfbWF0Y2hlcikKCQkJcmV0dXJuIENMX0VNRU07CgkJcmV0dXJuIGluaXRfcmVnZXhfbGlzdChlbmdpbmUtPmRvbWFpbmxpc3RfbWF0Y2hlcik7Cgl9CgllbHNlCgkJcmV0dXJuIENMX0VOVUxMQVJHOwp9CgppbnQgaXNfZG9tYWlubGlzdF9vayhjb25zdCBzdHJ1Y3QgY2xfZW5naW5lKiBlbmdpbmUpCnsKCXJldHVybiAoZW5naW5lICYmIGVuZ2luZS0+ZG9tYWlubGlzdF9tYXRjaGVyKSA/IGlzX3JlZ2V4X29rKGVuZ2luZS0+ZG9tYWlubGlzdF9tYXRjaGVyKSA6IDE7Cn0KCnZvaWQgZG9tYWlubGlzdF9jbGVhbnVwKGNvbnN0IHN0cnVjdCBjbF9lbmdpbmUqIGVuZ2luZSkKewoJaWYoZW5naW5lICYmIGVuZ2luZS0+ZG9tYWlubGlzdF9tYXRjaGVyKSB7CgkJcmVnZXhfbGlzdF9jbGVhbnVwKGVuZ2luZS0+ZG9tYWlubGlzdF9tYXRjaGVyKTsKCX0KfQoKdm9pZCBkb21haW5saXN0X2RvbmUoc3RydWN0IGNsX2VuZ2luZSogZW5naW5lKQp7CglpZihlbmdpbmUgJiYgZW5naW5lLT5kb21haW5saXN0X21hdGNoZXIpIHsKCQlyZWdleF9saXN0X2RvbmUoZW5naW5lLT5kb21haW5saXN0X21hdGNoZXIpOwoJCWZyZWUoZW5naW5lLT5kb21haW5saXN0X21hdGNoZXIpOwoJCWVuZ2luZS0+ZG9tYWlubGlzdF9tYXRjaGVyID0gTlVMTDsKCX0KfQoK