LyogVGhpcyBmaWxlIGlzIG9iai1ldmF4LmgKICAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMjEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkgb2YKICAgICBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueS4KCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCgogICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCiAgIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwKICAgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KCi8qCiAqIFRoaXMgZmlsZSBpcyBvYmotZXZheC5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgogKiBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KICovCgojaW5jbHVkZSAiYXMuaCIKCi8qIGRlZmluZSBhbiBvYmogc3BlY2lmaWMgbWFjcm8gb2ZmIHdoaWNoIHRhcmdldCBjcHUgYmFjayBlbmRzIG1heSBrZXkuICAqLwojZGVmaW5lIE9CSl9FVkFYIDEKCi8qIGluY2x1ZGUgd2hhdGV2ZXIgdGFyZ2V0IGNwdSBpcyBhcHByb3ByaWF0ZS4gICovCiNpbmNsdWRlICJ0YXJnLWNwdS5oIgoKI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyCgpzdHJ1Y3QgZml4OwoKLyogU2ltcGx5IGxpbmtlZCBsaXN0IG9mIC5saW5rYWdlLiAgKi8Kc3RydWN0IGFscGhhX2xpbmthZ2VfZml4dXBzCnsKICAvKiBOZXh0IGVudHJ5LiAgKi8KICBzdHJ1Y3QgYWxwaGFfbGlua2FnZV9maXh1cHMgKm5leHQ7CgogIC8qIENvcnJlc3BvbmRpbmcgZml4dXAuICAqLwogIHN0cnVjdCBmaXggKmZpeHA7CgogIC8qIExhYmVsIHRoYXQgZGVzaWduYXRlcyB0aGlzIGVudHJ5LgogICAgIE5vdGUgdGhhdCBhIGxpbmthZ2UgZW50cnkgY2FuIG9ubHkgYmUgZGVzaWduYXRlZCBieSBvbmUgbGFiZWwuCiAgICAgQWxzbywgc19hbHBoYV9saW5rYWdlIGZvcmNlIHRoZSBjcmVhdGlvbiBvZiBhIGxhYmVsLiAgKi8KICBzeW1ib2xTICpsYWJlbDsKfTsKCi8qCiAqIFNZTUJPTFMKICovCgovKgogKiBJZiB5b3VyIG9iamVjdCBmb3JtYXQgbmVlZHMgdG8gcmVvcmRlciBzeW1ib2xzLCBkZWZpbmUgdGhpcy4gIFdoZW4KICogZGVmaW5lZCwgc3ltYm9scyBhcmUga2VwdCBvbiBhIGRvdWJseSBsaW5rZWQgbGlzdCBhbmQgZnVuY3Rpb25zIGFyZQogKiBtYWRlIGF2YWlsYWJsZSBmb3IgcHVzaCwgaW5zZXJ0LCBhcHBlbmQsIGFuZCBkZWxldGUuICBJZiBub3QgZGVmaW5lZCwKICogc3ltYm9scyBhcmUga2VwdCBvbiBhIHNpbmdseSBsaW5rZWQgbGlzdCwgb25seSB0aGUgYXBwZW5kIGFuZCBjbGVhcgogKiBmYWNpbGl0aWVzIGFyZSBhdmFpbGFibGUsIGFuZCB0aGV5IGFyZSBtYWNyb3MuCiAqLwoKLyogI2RlZmluZSBTWU1CT0xTX05FRURfUEFDS1BPSU5URVJTICovCgojZGVmaW5lIE9CSl9FTUlUX0xJTkVOTyhhLGIsYykJLyogbXVzdCBiZSAqc29tZXRoaW5nKi4gIFRoaXMgbm8tb3AncyBpdCBvdXQuICAqLwoKI2RlZmluZSBvYmpfc3ltYm9sX25ld19ob29rKHMpICAgICAgIGV2YXhfc3ltYm9sX25ld19ob29rIChzKQojZGVmaW5lIG9ial9mcm9iX3N5bWJvbChzLHApICAgICAgICAgZXZheF9mcm9iX3N5bWJvbCAocywgJnApCiNkZWZpbmUgb2JqX2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0ICBldmF4X2Zyb2JfZmlsZV9iZWZvcmVfYWRqdXN0CiNkZWZpbmUgb2JqX2Zyb2JfZmlsZV9iZWZvcmVfZml4ICAgICBldmF4X2Zyb2JfZmlsZV9iZWZvcmVfZml4CgojZGVmaW5lIFNfR0VUX09USEVSKFMpCTAKI2RlZmluZSBTX0dFVF9UWVBFKFMpCTAKI2RlZmluZSBTX0dFVF9ERVNDKFMpCTAKCiNkZWZpbmUgUERTQ19TX0tfS0lORF9GUF9TVEFDSyA5CiNkZWZpbmUgUERTQ19TX0tfS0lORF9GUF9SRUdJU1RFUiAxMAojZGVmaW5lIFBEU0NfU19LX0tJTkRfTlVMTCA4CgojZGVmaW5lIFBEU0NfU19LX01JTl9TVEFDS19TSVpFIDMyCiNkZWZpbmUgUERTQ19TX0tfTUlOX1JFR0lTVEVSX1NJWkUgMjQKI2RlZmluZSBQRFNDX1NfS19OVUxMX1NJWkUgMTYKCiNkZWZpbmUgUERTQ19TX01fSEFORExFUl9WQUxJRCAweDEwCQkvKiBsb3cgYnl0ZSAqLwojZGVmaW5lIFBEU0NfU19NX0hBTkRMRVJfREFUQV9WQUxJRCAweDQwCS8qIGxvdyBieXRlICovCiNkZWZpbmUgUERTQ19TX01fQkFTRV9SRUdfSVNfRlAgMHg4MAkJLyogbG93IGJ5dGUgKi8KI2RlZmluZSBQRFNDX1NfTV9OQVRJVkUgMHgxMAkJLyogaGlnaCBieXRlICovCiNkZWZpbmUgUERTQ19TX01fTk9fSkFDS0VUIDB4MjAJCS8qIGhpZ2ggYnl0ZSAqLwoKI2RlZmluZSBMS1BfU19LX1NJWkUgMTYKCmV4dGVybiBzZWdUIGFscGhhX2xpbmtfc2VjdGlvbjsKZXh0ZXJuIHN0cnVjdCBhbHBoYV9saW5rYWdlX2ZpeHVwcyAqYWxwaGFfbGlua2FnZV9maXh1cF9yb290OwoKZXh0ZXJuIHZvaWQgZXZheF9zZWN0aW9uIChpbnQpOwpleHRlcm4gdm9pZCBldmF4X3N5bWJvbF9uZXdfaG9vayAoc3ltYm9sUyAqKTsKZXh0ZXJuIHZvaWQgZXZheF9mcm9iX3N5bWJvbCAoc3ltYm9sUyAqLCBpbnQgKik7CmV4dGVybiB2b2lkIGV2YXhfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgKHZvaWQpOwpleHRlcm4gdm9pZCBldmF4X2Zyb2JfZmlsZV9iZWZvcmVfZml4ICh2b2lkKTsKZXh0ZXJuIGNoYXIgKmV2YXhfc2hvcnRlbl9uYW1lIChjaGFyICopOwoKLyoKICogTG9jYWwgVmFyaWFibGVzOgogKiBjb21tZW50LWNvbHVtbjogMAogKiBmaWxsLWNvbHVtbjogMTMxCiAqIEVuZDoKICovCg==