LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qCiAqIEBmaWxlIG5ldHNubXBfZGF0YV9saXN0LmgKICoKICogQGFkZHRvZ3JvdXAgYWdlbnQKICogQGFkZHRvZ3JvdXAgbGlicmFyeSAqCiAqCiAqICRJZCQKICoKICogRXh0ZXJuYWwgZGVmaW5pdGlvbnMgZm9yIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGluIG5ldHNubXBfZGF0YV9saXN0LmMuCiAqCiAqIEB7CiAqLwoKI2lmbmRlZiBEQVRBX0xJU1RfSAojZGVmaW5lIERBVEFfTElTVF9ICgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICAgICAgICAgICJDIiB7CiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9pbXBsLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3Rvb2xzLmg+CgogICAgdHlwZWRlZiB2b2lkICAgIChOZXRzbm1wX0ZyZWVfTGlzdF9EYXRhKSAodm9pZCAqKTsKICAgIHR5cGVkZWYgaW50ICAgICAoTmV0c25tcF9TYXZlX0xpc3RfRGF0YSkgKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sIHZvaWQgKik7CiAgICB0eXBlZGVmIHZvaWQgKiAgKE5ldHNubXBfUmVhZF9MaXN0X0RhdGEpIChjaGFyICpidWYsIHNpemVfdCBidWZfbGVuKTsKCi8qKiBAc3RydWN0IG5ldHNubXBfZGF0YV9saXN0X3MKICogdXNlZCB0byBpdGVyYXRlIHRocm91Z2ggbGlzdHMgb2YgZGF0YQogKi8KICAgIHR5cGVkZWYgc3RydWN0IG5ldHNubXBfZGF0YV9saXN0X3MgewogICAgICAgIHN0cnVjdCBuZXRzbm1wX2RhdGFfbGlzdF9zICpuZXh0OwogICAgICAgIGNoYXIgICAgICAgICAgICpuYW1lOwogCS8qKiBUaGUgcG9pbnRlciB0byB0aGUgZGF0YSBwYXNzZWQgb24uICovCiAgICAgICAgdm9pZCAgICAgICAgICAgKmRhdGE7CiAgICAgICAgLyoqIG11c3Qga25vdyBob3cgdG8gZnJlZSBuZXRzbm1wX2RhdGFfbGlzdC0+ZGF0YSAqLwogICAgICAgIE5ldHNubXBfRnJlZV9MaXN0X0RhdGEgKmZyZWVfZnVuYzsKICAgIH0gbmV0c25tcF9kYXRhX2xpc3Q7CgogICAgdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9kYXRhX2xpc3Rfc2F2ZWluZm9fcyB7CiAgICAgICBuZXRzbm1wX2RhdGFfbGlzdCAqKmRhdGFsaXN0OwogICAgICAgY29uc3QgY2hhciAqdHlwZTsKICAgICAgIGNvbnN0IGNoYXIgKnRva2VuOwogICAgICAgTmV0c25tcF9TYXZlX0xpc3RfRGF0YSAqZGF0YV9saXN0X3NhdmVfcHRyOwogICAgICAgTmV0c25tcF9SZWFkX0xpc3RfRGF0YSAqZGF0YV9saXN0X3JlYWRfcHRyOwogICAgICAgTmV0c25tcF9GcmVlX0xpc3RfRGF0YSAqZGF0YV9saXN0X2ZyZWVfcHRyOwogICAgfSBuZXRzbm1wX2RhdGFfbGlzdF9zYXZlaW5mbzsKCiAgICBuZXRzbm1wX2RhdGFfbGlzdCAqCiAgICAgIG5ldHNubXBfY3JlYXRlX2RhdGFfbGlzdChjb25zdCBjaGFyICosIHZvaWQgKiwgTmV0c25tcF9GcmVlX0xpc3RfRGF0YSogKTsKICAgIHZvaWQgICAgICAgICAgICBuZXRzbm1wX2RhdGFfbGlzdF9hZGRfbm9kZShuZXRzbm1wX2RhdGFfbGlzdCAqKmhlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9kYXRhX2xpc3QgKm5vZGUpOwogICAgbmV0c25tcF9kYXRhX2xpc3QgKgogICAgICBuZXRzbm1wX2RhdGFfbGlzdF9hZGRfZGF0YShuZXRzbm1wX2RhdGFfbGlzdCAqKmhlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHNubXBfRnJlZV9MaXN0X0RhdGEgKiBiZWVyKTsKICAgIHZvaWQgICAgICAgICAgICpuZXRzbm1wX2dldF9saXN0X2RhdGEobmV0c25tcF9kYXRhX2xpc3QgKmhlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5vZGUpOwogICAgdm9pZCAgICAgICAgICAgIG5ldHNubXBfZnJlZV9saXN0X2RhdGEobmV0c25tcF9kYXRhX2xpc3QgKmhlYWQpOyAgICAvKiBzaW5nbGUgKi8KICAgIHZvaWQgICAgICAgICAgICBuZXRzbm1wX2ZyZWVfYWxsX2xpc3RfZGF0YShuZXRzbm1wX2RhdGFfbGlzdCAqaGVhZCk7ICAgICAgICAvKiBtdWx0aXBsZSAqLwogICAgaW50ICAgICAgICAgICAgIG5ldHNubXBfcmVtb3ZlX2xpc3Rfbm9kZShuZXRzbm1wX2RhdGFfbGlzdCAqKnJlYWxoZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKICAgIG5ldHNubXBfZGF0YV9saXN0ICoKICAgIG5ldHNubXBfZ2V0X2xpc3Rfbm9kZShuZXRzbm1wX2RhdGFfbGlzdCAqaGVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKCiAgICAvKiogZGVwcmVjaWF0ZWQ6IHVzZSBuZXRzbm1wX2RhdGFfbGlzdF9hZGRfbm9kZSgpICovCiAgICB2b2lkICAgICAgICAgICAgbmV0c25tcF9hZGRfbGlzdF9kYXRhKG5ldHNubXBfZGF0YV9saXN0ICoqaGVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9kYXRhX2xpc3QgKm5vZGUpOwoKCiAgICB2b2lkCiAgICBuZXRzbm1wX3JlZ2lzdGVyX3NhdmVfbGlzdChuZXRzbm1wX2RhdGFfbGlzdCAqKmRhdGFsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRzbm1wX1NhdmVfTGlzdF9EYXRhICpkYXRhX2xpc3Rfc2F2ZV9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRzbm1wX1JlYWRfTGlzdF9EYXRhICpkYXRhX2xpc3RfcmVhZF9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXRzbm1wX0ZyZWVfTGlzdF9EYXRhICpkYXRhX2xpc3RfZnJlZV9wdHIpOwogICAgaW50CiAgICBuZXRzbm1wX3NhdmVfYWxsX2RhdGEobmV0c25tcF9kYXRhX2xpc3QgKmhlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0c25tcF9TYXZlX0xpc3RfRGF0YSAqIGRhdGFfbGlzdF9zYXZlX3B0cik7CiAgICBTTk1QQ2FsbGJhY2sgbmV0c25tcF9zYXZlX2FsbF9kYXRhX2NhbGxiYWNrOwogICAgdm9pZCBuZXRzbm1wX3JlYWRfZGF0YV9jYWxsYmFjayhjb25zdCBjaGFyICp0b2tlbiwgY2hhciAqbGluZSk7CiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgojZW5kaWYKLyoqIEB9ICovCg==