LyogLSotIGMtYmFzaWMtb2Zmc2V0OiA4IC0qLQogKgogKiBjbXAuYyAtIENvbm5lY3Rpb24gTWFuYWdlbWVudCBQcm9jZWR1cmVzCiAqIENvcHlyaWdodCAoQykgMjAwMSBLcmlzdGlhbiBI+GdzYmVyZwogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgogKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAogKiBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogKi8KCi8qIFRPRE8KICogLS0tLQogKgogKiAtIEltcGxlbWVudCBJRUM2MTg4My0xIG91dHB1dCBwbHVncyBhbmQgY29ubmVjdGlvbiBtYW5hZ2VtZW50LgogKiAgIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIHBhcnQgb2YgdGhlIGdlbmVyYWwgc3Vic3lzdGVtLCBhcyBpdCBjb3VsZAogKiAgIGJlIHNoYXJlZCB3aXRoIGR2MTM5NC4KICoKICogLSBBZGQgSUVDNjE4ODMgdW5pdCBkaXJlY3Rvcnkgd2hlbiBsb2FkaW5nIHRoaXMgbW9kdWxlLiAgVGhpcwogKiAgIHJlcXVpcmVzIGEgcnVuLXRpbWUgY2hhbmdlYWJsZSBjb25maWcgcm9tLgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgojaW5jbHVkZSA8bGludXgvd2FpdC5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CgojaW5jbHVkZSAiaG9zdHMuaCIKI2luY2x1ZGUgImhpZ2hsZXZlbC5oIgojaW5jbHVkZSAiaWVlZTEzOTQuaCIKI2luY2x1ZGUgImllZWUxMzk0X2NvcmUuaCIKI2luY2x1ZGUgImNtcC5oIgoKc3RydWN0IHBsdWcgewoJdW5pb24gewoJCXN0cnVjdCBjbXBfcGNyIHBjcjsKCQlxdWFkbGV0X3QgcXVhZGxldDsKCX0gdTsKCXZvaWQgKCp1cGRhdGUpKHN0cnVjdCBjbXBfcGNyICpwbHVnLCB2b2lkICpkYXRhKTsKCXZvaWQgKmRhdGE7Cn07CgpzdHJ1Y3QgY21wX2hvc3QgewoJc3RydWN0IGhwc2JfaG9zdCAqaG9zdDsKCgl1bmlvbiB7CgkJc3RydWN0IGNtcF9tcHIgb21wcjsKCQlxdWFkbGV0X3Qgb21wcl9xdWFkbGV0OwoJfSB1OwoJc3RydWN0IHBsdWcgb3BjclsyXTsKCgl1bmlvbiB7CgkJc3RydWN0IGNtcF9tcHIgaW1wcjsKCQlxdWFkbGV0X3QgaW1wcl9xdWFkbGV0OwoJfSB2OwoJc3RydWN0IHBsdWcgaXBjclsyXTsKfTsKCmVudW0gewoJQ01QX1AyUF9DT05ORUNUSU9OLAoJQ01QX0JDX0NPTk5FQ1RJT04KfTsKCiNkZWZpbmUgQ1NSX1BDUl9NQVAgICAgICAweDkwMAojZGVmaW5lIENTUl9QQ1JfTUFQX0VORCAgMHg5ZmMKCnN0YXRpYyBzdHJ1Y3QgaHBzYl9oaWdobGV2ZWwgY21wX2hpZ2hsZXZlbDsKCnN0YXRpYyB2b2lkIGNtcF9hZGRfaG9zdChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KTsKc3RhdGljIHZvaWQgY21wX2hvc3RfcmVzZXQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCk7CnN0YXRpYyBpbnQgcGNyX3JlYWQoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICpidWYsCgkJICAgIHU2NCBhZGRyLCBzaXplX3QgbGVuZ3RoLCB1MTYgZmxhZ3MpOwpzdGF0aWMgaW50IHBjcl9sb2NrKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIHF1YWRsZXRfdCAqc3RvcmUsCgkJICAgIHU2NCBhZGRyLCBxdWFkbGV0X3QgZGF0YSwgcXVhZGxldF90IGFyZywgaW50IGV4dGNvZGUsIHUxNiBmbGFncyk7CgpzdGF0aWMgc3RydWN0IGhwc2JfaGlnaGxldmVsIGNtcF9oaWdobGV2ZWwgPSB7CgkubmFtZSA9CQkiY21wIiwKCS5hZGRfaG9zdCA9CWNtcF9hZGRfaG9zdCwKCS5ob3N0X3Jlc2V0ID0JY21wX2hvc3RfcmVzZXQsCn07CgpzdGF0aWMgc3RydWN0IGhwc2JfYWRkcmVzc19vcHMgcGNyX29wcyA9IHsKCS5yZWFkID0JcGNyX3JlYWQsCgkubG9jayA9CXBjcl9sb2NrLAp9OwoKCnN0cnVjdCBjbXBfcGNyICoKY21wX3JlZ2lzdGVyX29wY3Ioc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG9wY3JfbnVtYmVyLCBpbnQgcGF5bG9hZCwKCQkgIHZvaWQgKCp1cGRhdGUpKHN0cnVjdCBjbXBfcGNyICpwY3IsIHZvaWQgKmRhdGEpLAoJCSAgdm9pZCAqZGF0YSkKewoJc3RydWN0IGNtcF9ob3N0ICpjaDsKCXN0cnVjdCBwbHVnICpwbHVnOwoKCWNoID0gaHBzYl9nZXRfaG9zdGluZm8oJmNtcF9oaWdobGV2ZWwsIGhvc3QpOwoKCWlmIChvcGNyX251bWJlciA+PSBjaC0+dS5vbXByLm5wbHVncyB8fAoJICAgIGNoLT5vcGNyW29wY3JfbnVtYmVyXS51cGRhdGUgIT0gTlVMTCkKCQlyZXR1cm4gTlVMTDsKCglwbHVnID0gJmNoLT5vcGNyW29wY3JfbnVtYmVyXTsKCXBsdWctPnUucGNyLm9ubGluZSA9IDE7CglwbHVnLT51LnBjci5iY2FzdF9jb3VudCA9IDA7CglwbHVnLT51LnBjci5wMnBfY291bnQgPSAwOwoJcGx1Zy0+dS5wY3Iub3ZlcmhlYWQgPSAwOwoJcGx1Zy0+dS5wY3IucGF5bG9hZCA9IHBheWxvYWQ7CglwbHVnLT51cGRhdGUgPSB1cGRhdGU7CglwbHVnLT5kYXRhID0gZGF0YTsKCglyZXR1cm4gJnBsdWctPnUucGNyOwp9Cgp2b2lkIGNtcF91bnJlZ2lzdGVyX29wY3Ioc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgc3RydWN0IGNtcF9wY3IgKm9wY3IpCnsKCXN0cnVjdCBjbXBfaG9zdCAqY2g7CglzdHJ1Y3QgcGx1ZyAqcGx1ZzsKCgljaCA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZjbXBfaGlnaGxldmVsLCBob3N0KTsKCXBsdWcgPSAoc3RydWN0IHBsdWcgKilvcGNyOwoJaWYgKHBsdWcgLSBjaC0+b3BjciA+PSBjaC0+dS5vbXByLm5wbHVncykgQlVHKCk7CgoJcGx1Zy0+dS5wY3Iub25saW5lID0gMDsKCXBsdWctPnVwZGF0ZSA9IE5VTEw7Cn0KCnN0YXRpYyB2b2lkIHJlc2V0X3BsdWdzKHN0cnVjdCBjbXBfaG9zdCAqY2gpCnsKCWludCBpOwoKCWNoLT51Lm9tcHIubm9uX3BlcnNpc3RlbnRfZXh0ID0gMHhmZjsKCWZvciAoaSA9IDA7IGkgPCBjaC0+dS5vbXByLm5wbHVnczsgaSsrKSB7CgkJY2gtPm9wY3JbaV0udS5wY3IuYmNhc3RfY291bnQgPSAwOwoJCWNoLT5vcGNyW2ldLnUucGNyLnAycF9jb3VudCA9IDA7CgkJY2gtPm9wY3JbaV0udS5wY3Iub3ZlcmhlYWQgPSAwOwoJfQp9CgpzdGF0aWMgdm9pZCBjbXBfYWRkX2hvc3Qoc3RydWN0IGhwc2JfaG9zdCAqaG9zdCkKewoJc3RydWN0IGNtcF9ob3N0ICpjaCA9IGhwc2JfY3JlYXRlX2hvc3RpbmZvKCZjbXBfaGlnaGxldmVsLCBob3N0LCBzaXplb2YgKCpjaCkpOwoKCWlmIChjaCA9PSBOVUxMKSB7CgkJSFBTQl9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBjbXBfaG9zdCIpOwoJCXJldHVybjsKCX0KCglocHNiX3JlZ2lzdGVyX2FkZHJzcGFjZSgmY21wX2hpZ2hsZXZlbCwgaG9zdCwgJnBjcl9vcHMsCgkJCQlDU1JfUkVHSVNURVJfQkFTRSArIENTUl9QQ1JfTUFQLAoJCQkJQ1NSX1JFR0lTVEVSX0JBU0UgKyBDU1JfUENSX01BUF9FTkQpOwoKCWNoLT5ob3N0ID0gaG9zdDsKCWNoLT51Lm9tcHIucmF0ZSA9IElFRUUxMzk0X1NQRUVEXzEwMDsKCWNoLT51Lm9tcHIuYmNhc3RfY2hhbm5lbF9iYXNlID0gNjM7CgljaC0+dS5vbXByLm5wbHVncyA9IDI7CgoJcmVzZXRfcGx1Z3MoY2gpOwp9CgpzdGF0aWMgdm9pZCBjbXBfaG9zdF9yZXNldChzdHJ1Y3QgaHBzYl9ob3N0ICpob3N0KQp7CglzdHJ1Y3QgY21wX2hvc3QgKmNoOwoKCWNoID0gaHBzYl9nZXRfaG9zdGluZm8oJmNtcF9oaWdobGV2ZWwsIGhvc3QpOwoJaWYgKGNoID09IE5VTEwpIHsKCQlIUFNCX0VSUigiY21wOiBUcmllZCB0byByZXNldCB1bmtub3duIGhvc3QiKTsKCQlyZXR1cm47Cgl9CgoJcmVzZXRfcGx1Z3MoY2gpOwp9CgpzdGF0aWMgaW50IHBjcl9yZWFkKHN0cnVjdCBocHNiX2hvc3QgKmhvc3QsIGludCBub2RlaWQsIHF1YWRsZXRfdCAqYnVmLAoJCSAgICB1NjQgYWRkciwgc2l6ZV90IGxlbmd0aCwgdTE2IGZsYWdzKQp7CglpbnQgY3NyYWRkciA9IGFkZHIgLSBDU1JfUkVHSVNURVJfQkFTRTsKCWludCBwbHVnOwoJc3RydWN0IGNtcF9ob3N0ICpjaDsKCglpZiAobGVuZ3RoICE9IDQpCgkJcmV0dXJuIFJDT0RFX1RZUEVfRVJST1I7CgoJY2ggPSBocHNiX2dldF9ob3N0aW5mbygmY21wX2hpZ2hsZXZlbCwgaG9zdCk7CglpZiAoY3NyYWRkciA9PSAweDkwMCkgewoJCSpidWYgPSBjcHVfdG9fYmUzMihjaC0+dS5vbXByX3F1YWRsZXQpOwoJCXJldHVybiBSQ09ERV9DT01QTEVURTsKCX0KCWVsc2UgaWYgKGNzcmFkZHIgPCAweDkwNCArIGNoLT51Lm9tcHIubnBsdWdzICogNCkgewoJCXBsdWcgPSAoY3NyYWRkciAtIDB4OTA0KSAvIDQ7CgkJKmJ1ZiA9IGNwdV90b19iZTMyKGNoLT5vcGNyW3BsdWddLnUucXVhZGxldCk7CgkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOwoJfQoJZWxzZSBpZiAoY3NyYWRkciA8IDB4OTgwKSB7CgkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7Cgl9CgllbHNlIGlmIChjc3JhZGRyID09IDB4OTgwKSB7CgkJKmJ1ZiA9IGNwdV90b19iZTMyKGNoLT52LmltcHJfcXVhZGxldCk7CgkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOwoJfQoJZWxzZSBpZiAoY3NyYWRkciA8IDB4OTg0ICsgY2gtPnYuaW1wci5ucGx1Z3MgKiA0KSB7CgkJcGx1ZyA9IChjc3JhZGRyIC0gMHg5ODQpIC8gNDsKCQkqYnVmID0gY3B1X3RvX2JlMzIoY2gtPmlwY3JbcGx1Z10udS5xdWFkbGV0KTsKCQlyZXR1cm4gUkNPREVfQ09NUExFVEU7Cgl9CgllbHNlCgkJcmV0dXJuIFJDT0RFX0FERFJFU1NfRVJST1I7Cn0KCnN0YXRpYyBpbnQgcGNyX2xvY2soc3RydWN0IGhwc2JfaG9zdCAqaG9zdCwgaW50IG5vZGVpZCwgcXVhZGxldF90ICpzdG9yZSwKCQkgICAgdTY0IGFkZHIsIHF1YWRsZXRfdCBkYXRhLCBxdWFkbGV0X3QgYXJnLCBpbnQgZXh0Y29kZSwgdTE2IGZsYWdzKQp7CglpbnQgY3NyYWRkciA9IGFkZHIgLSBDU1JfUkVHSVNURVJfQkFTRTsKCWludCBwbHVnOwoJc3RydWN0IGNtcF9ob3N0ICpjaDsKCgljaCA9IGhwc2JfZ2V0X2hvc3RpbmZvKCZjbXBfaGlnaGxldmVsLCBob3N0KTsKCglpZiAoZXh0Y29kZSAhPSBFWFRDT0RFX0NPTVBBUkVfU1dBUCkKCQlyZXR1cm4gUkNPREVfVFlQRV9FUlJPUjsKCglpZiAoY3NyYWRkciA9PSAweDkwMCkgewoJCS8qIEZJWE1FOiBJZ25vcmUgd3JpdGVzIHRvIGJpdHMgMzAtMzEgYW5kIDAtNyAqLwoJCSpzdG9yZSA9IGNwdV90b19iZTMyKGNoLT51Lm9tcHJfcXVhZGxldCk7CgkJaWYgKGFyZyA9PSBjcHVfdG9fYmUzMihjaC0+dS5vbXByX3F1YWRsZXQpKQoJCQljaC0+dS5vbXByX3F1YWRsZXQgPSBiZTMyX3RvX2NwdShkYXRhKTsKCgkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOwoJfQoJaWYgKGNzcmFkZHIgPCAweDkwNCArIGNoLT51Lm9tcHIubnBsdWdzICogNCkgewoJCXBsdWcgPSAoY3NyYWRkciAtIDB4OTA0KSAvIDQ7CgkJKnN0b3JlID0gY3B1X3RvX2JlMzIoY2gtPm9wY3JbcGx1Z10udS5xdWFkbGV0KTsKCgkJaWYgKGFyZyA9PSAqc3RvcmUpCgkJCWNoLT5vcGNyW3BsdWddLnUucXVhZGxldCA9IGJlMzJfdG9fY3B1KGRhdGEpOwoKCQlpZiAoYmUzMl90b19jcHUoKnN0b3JlKSAhPSBjaC0+b3BjcltwbHVnXS51LnF1YWRsZXQgJiYKCQkgICAgY2gtPm9wY3JbcGx1Z10udXBkYXRlICE9IE5VTEwpCgkJCWNoLT5vcGNyW3BsdWddLnVwZGF0ZSgmY2gtPm9wY3JbcGx1Z10udS5wY3IsCgkJCQkJICAgICAgY2gtPm9wY3JbcGx1Z10uZGF0YSk7CgoJCXJldHVybiBSQ09ERV9DT01QTEVURTsKCX0KCWVsc2UgaWYgKGNzcmFkZHIgPCAweDk4MCkgewoJCXJldHVybiBSQ09ERV9BRERSRVNTX0VSUk9SOwoJfQoJZWxzZSBpZiAoY3NyYWRkciA9PSAweDk4MCkgewoJCS8qIEZJWE1FOiBJZ25vcmUgd3JpdGVzIHRvIGJpdHMgMjQtMzEgYW5kIDAtNyAqLwoJCSpzdG9yZSA9IGNwdV90b19iZTMyKGNoLT51Lm9tcHJfcXVhZGxldCk7CgkJaWYgKGFyZyA9PSBjcHVfdG9fYmUzMihjaC0+dS5vbXByX3F1YWRsZXQpKQoJCQljaC0+dS5vbXByX3F1YWRsZXQgPSBiZTMyX3RvX2NwdShkYXRhKTsKCgkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOwoJfQoJZWxzZSBpZiAoY3NyYWRkciA8IDB4OTg0ICsgY2gtPnYuaW1wci5ucGx1Z3MgKiA0KSB7CgkJcGx1ZyA9IChjc3JhZGRyIC0gMHg5ODQpIC8gNDsKCQkqc3RvcmUgPSBjcHVfdG9fYmUzMihjaC0+aXBjcltwbHVnXS51LnF1YWRsZXQpOwoKCQlpZiAoYXJnID09ICpzdG9yZSkKCQkJY2gtPmlwY3JbcGx1Z10udS5xdWFkbGV0ID0gYmUzMl90b19jcHUoZGF0YSk7CgoJCWlmIChiZTMyX3RvX2NwdSgqc3RvcmUpICE9IGNoLT5pcGNyW3BsdWddLnUucXVhZGxldCAmJgoJCSAgICBjaC0+aXBjcltwbHVnXS51cGRhdGUgIT0gTlVMTCkKCQkJY2gtPmlwY3JbcGx1Z10udXBkYXRlKCZjaC0+aXBjcltwbHVnXS51LnBjciwKCQkJCQkgICAgICBjaC0+aXBjcltwbHVnXS5kYXRhKTsKCgkJcmV0dXJuIFJDT0RFX0NPTVBMRVRFOwoJfQoJZWxzZQoJCXJldHVybiBSQ09ERV9BRERSRVNTX0VSUk9SOwp9CgoKLyogTW9kdWxlIGludGVyZmFjZSAqLwoKTU9EVUxFX0FVVEhPUigiS3Jpc3RpYW4gSG9nc2JlcmcgPGhvZ3NiZXJnQHVzZXJzLnNmLm5ldD4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJDb25uZWN0aW9uIE1hbmFnZW1lbnQgUHJvY2VkdXJlcyAoQ01QKSIpOwpNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiY21wIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCkVYUE9SVF9TWU1CT0woY21wX3JlZ2lzdGVyX29wY3IpOwpFWFBPUlRfU1lNQk9MKGNtcF91bnJlZ2lzdGVyX29wY3IpOwoKc3RhdGljIGludCBfX2luaXQgY21wX2luaXRfbW9kdWxlICh2b2lkKQp7CglocHNiX3JlZ2lzdGVyX2hpZ2hsZXZlbCAoJmNtcF9oaWdobGV2ZWwpOwoKCUhQU0JfSU5GTygiTG9hZGVkIENNUCBkcml2ZXIiKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgX19leGl0IGNtcF9leGl0X21vZHVsZSAodm9pZCkKewogICAgICAgIGhwc2JfdW5yZWdpc3Rlcl9oaWdobGV2ZWwoJmNtcF9oaWdobGV2ZWwpOwoKCUhQU0JfSU5GTygiVW5sb2FkZWQgQ01QIGRyaXZlciIpOwp9Cgptb2R1bGVfaW5pdChjbXBfaW5pdF9tb2R1bGUpOwptb2R1bGVfZXhpdChjbXBfZXhpdF9tb2R1bGUpOwo=