LyogbW9kaWZpZWQgYnkgTWFydGluIEhlZGVuZmFsayA8bWhlQHN0YWNrZW4ua3RoLnNlPiBmb3IgdXNlIGluIEN1cmwKICogbGFzdCBtb2RpZmllZCAyMDAwLTA5LTE4CiAqIEV2ZW4gbW9yZSBvYnNjdXJpZmllZCB0byBtZXJnZSBiZXR0ZXIgaW50byBsaWJjdXJsIGJ5IERhbmllbCBTdGVuYmVyZy4KICovCgovKgogKiBDb3B5cmlnaHQgKGMpIDE5OTgsIDE5OTkgS3VuZ2xpZ2EgVGVrbmlza2EgSPZnc2tvbGFuCiAqIChSb3lhbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgU3RvY2tob2xtLCBTd2VkZW4pLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiAKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKiAKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKiAKICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgSW5zdGl0dXRlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLgogKi8KCiNpbmNsdWRlICJzZXR1cC5oIgoKI2lmZGVmIEtSQjQKCiNkZWZpbmUgX01QUklOVEZfUkVQTEFDRSAvKiB3ZSB3YW50IGN1cmwtZnVuY3Rpb25zIGluc3RlYWQgb2YgbmF0aXZlIG9uZXMgKi8KI2luY2x1ZGUgPGN1cmwvbXByaW50Zi5oPgoKI2luY2x1ZGUgInNlY3VyaXR5LmgiCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8bmV0ZGIuaD4KCiNpZmRlZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCgojaW5jbHVkZSAiYmFzZTY0LmgiCiNpbmNsdWRlICJzZW5kZi5oIgojaW5jbHVkZSAiZnRwLmgiCgovKiBUaGUgbGFzdCAjaW5jbHVkZSBmaWxlIHNob3VsZCBiZTogKi8KI2lmZGVmIE1BTExPQ0RFQlVHCiNpbmNsdWRlICJtZW1kZWJ1Zy5oIgojZW5kaWYKCiNkZWZpbmUgbWluKGEsIGIpICAgKChhKSA8IChiKSA/IChhKSA6IChiKSkKCnN0YXRpYyBzdHJ1Y3QgewogICAgZW51bSBwcm90ZWN0aW9uX2xldmVsIGxldmVsOwogICAgY29uc3QgY2hhciAqbmFtZTsKfSBsZXZlbF9uYW1lc1tdID0gewogICAgeyBwcm90X2NsZWFyLCAiY2xlYXIiIH0sCiAgICB7IHByb3Rfc2FmZSwgInNhZmUiIH0sCiAgICB7IHByb3RfY29uZmlkZW50aWFsLCAiY29uZmlkZW50aWFsIiB9LAogICAgeyBwcm90X3ByaXZhdGUsICJwcml2YXRlIiB9Cn07CgojaWYgMApzdGF0aWMgY29uc3QgY2hhciAqCmxldmVsX3RvX25hbWUoZW51bSBwcm90ZWN0aW9uX2xldmVsIGxldmVsKQp7CiAgICBpbnQgaTsKICAgIGZvcihpID0gMDsgaSA8IHNpemVvZihsZXZlbF9uYW1lcykgLyBzaXplb2YobGV2ZWxfbmFtZXNbMF0pOyBpKyspCglpZihsZXZlbF9uYW1lc1tpXS5sZXZlbCA9PSBsZXZlbCkKCSAgICByZXR1cm4gbGV2ZWxfbmFtZXNbaV0ubmFtZTsKICAgIHJldHVybiAidW5rbm93biI7Cn0KI2VuZGlmCgojaWZuZGVmIEZUUF9TRVJWRVIgLyogbm90IHVzZWQgaW4gc2VydmVyICovCnN0YXRpYyBlbnVtIHByb3RlY3Rpb25fbGV2ZWwgCm5hbWVfdG9fbGV2ZWwoY29uc3QgY2hhciAqbmFtZSkKewogICAgaW50IGk7CiAgICBmb3IoaSA9IDA7IGkgPCBzaXplb2YobGV2ZWxfbmFtZXMpIC8gc2l6ZW9mKGxldmVsX25hbWVzWzBdKTsgaSsrKQoJaWYoIXN0cm5jYXNlY21wKGxldmVsX25hbWVzW2ldLm5hbWUsIG5hbWUsIHN0cmxlbihuYW1lKSkpCgkgICAgcmV0dXJuIGxldmVsX25hbWVzW2ldLmxldmVsOwogICAgcmV0dXJuIChlbnVtIHByb3RlY3Rpb25fbGV2ZWwpLTE7Cn0KI2VuZGlmCgojaWZkZWYgRlRQX1NFUlZFUgoKc3RhdGljIHN0cnVjdCBzZWNfc2VydmVyX21lY2ggKm1lY2hzW10gPSB7CiNpZmRlZiBLUkI1CiAgICAmZ3NzX3NlcnZlcl9tZWNoLAojZW5kaWYKI2lmZGVmIEtSQjQKICAgICZrcmI0X3NlcnZlcl9tZWNoLAojZW5kaWYKICAgIE5VTEwKfTsKCnN0YXRpYyBzdHJ1Y3Qgc2VjX3NlcnZlcl9tZWNoICptZWNoOwoKI2Vsc2UKCnN0YXRpYyBzdHJ1Y3Qgc2VjX2NsaWVudF9tZWNoICptZWNoc1tdID0gewojaWZkZWYgS1JCNQogICAgJmdzc19jbGllbnRfbWVjaCwKI2VuZGlmCiNpZmRlZiBLUkI0CiAgICAma3JiNF9jbGllbnRfbWVjaCwKI2VuZGlmCiAgICBOVUxMCn07CgpzdGF0aWMgc3RydWN0IHNlY19jbGllbnRfbWVjaCAqbWVjaDsKCiNlbmRpZgoKaW50CnNlY19nZXRjKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgRklMRSAqRikKewogIGlmKGNvbm4tPnNlY19jb21wbGV0ZSAmJiBjb25uLT5kYXRhX3Byb3QpIHsKICAgIGNoYXIgYzsKICAgIGlmKHNlY19yZWFkKGNvbm4sIGZpbGVubyhGKSwgJmMsIDEpIDw9IDApCiAgICAgIHJldHVybiBFT0Y7CiAgICByZXR1cm4gYzsKICB9IGVsc2UKICAgIHJldHVybiBnZXRjKEYpOwp9CgpzdGF0aWMgaW50CmJsb2NrX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCnsKICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBidWY7CiAgICBpbnQgYjsKICAgIHdoaWxlKGxlbikgewoJYiA9IHJlYWQoZmQsIHAsIGxlbik7CglpZiAoYiA9PSAwKQoJICAgIHJldHVybiAwOwoJZWxzZSBpZiAoYiA8IDApCgkgICAgcmV0dXJuIC0xOwoJbGVuIC09IGI7CglwICs9IGI7CiAgICB9CiAgICByZXR1cm4gcCAtICh1bnNpZ25lZCBjaGFyKilidWY7Cn0KCnN0YXRpYyBpbnQKYmxvY2tfd3JpdGUoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCnsKICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBidWY7CiAgICBpbnQgYjsKICAgIHdoaWxlKGxlbikgewoJYiA9IHdyaXRlKGZkLCBwLCBsZW4pOwoJaWYoYiA8IDApCgkgICAgcmV0dXJuIC0xOwoJbGVuIC09IGI7CglwICs9IGI7CiAgICB9CiAgICByZXR1cm4gcCAtICh1bnNpZ25lZCBjaGFyKilidWY7Cn0KCnN0YXRpYyBpbnQKc2VjX2dldF9kYXRhKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwKICAgICAgICAgICAgIGludCBmZCwgc3RydWN0IGtyYjRidWZmZXIgKmJ1ZiwgaW50IGxldmVsKQp7CiAgaW50IGxlbjsKICBpbnQgYjsKCiAgYiA9IGJsb2NrX3JlYWQoZmQsICZsZW4sIHNpemVvZihsZW4pKTsKICBpZiAoYiA9PSAwKQogICAgcmV0dXJuIDA7CiAgZWxzZSBpZiAoYiA8IDApCiAgICByZXR1cm4gLTE7CiAgbGVuID0gbnRvaGwobGVuKTsKICBidWYtPmRhdGEgPSByZWFsbG9jKGJ1Zi0+ZGF0YSwgbGVuKTsKICBiID0gYmxvY2tfcmVhZChmZCwgYnVmLT5kYXRhLCBsZW4pOwogIGlmIChiID09IDApCiAgICByZXR1cm4gMDsKICBlbHNlIGlmIChiIDwgMCkKICAgIHJldHVybiAtMTsKICBidWYtPnNpemUgPSAoKm1lY2gtPmRlY29kZSkoY29ubi0+YXBwX2RhdGEsIGJ1Zi0+ZGF0YSwgbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLT5kYXRhX3Byb3QsIGNvbm4pOwogIGJ1Zi0+aW5kZXggPSAwOwogIHJldHVybiAwOwp9CgpzdGF0aWMgc2l6ZV90CmJ1ZmZlcl9yZWFkKHN0cnVjdCBrcmI0YnVmZmVyICpidWYsIHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCnsKICAgIGxlbiA9IG1pbihsZW4sIGJ1Zi0+c2l6ZSAtIGJ1Zi0+aW5kZXgpOwogICAgbWVtY3B5KGRhdGEsIChjaGFyKilidWYtPmRhdGEgKyBidWYtPmluZGV4LCBsZW4pOwogICAgYnVmLT5pbmRleCArPSBsZW47CiAgICByZXR1cm4gbGVuOwp9CgpzdGF0aWMgc2l6ZV90CmJ1ZmZlcl93cml0ZShzdHJ1Y3Qga3JiNGJ1ZmZlciAqYnVmLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQp7CiAgICBpZihidWYtPmluZGV4ICsgbGVuID4gYnVmLT5zaXplKSB7Cgl2b2lkICp0bXA7CglpZihidWYtPmRhdGEgPT0gTlVMTCkKCSAgICB0bXAgPSBtYWxsb2MoMTAyNCk7CgllbHNlCgkgICAgdG1wID0gcmVhbGxvYyhidWYtPmRhdGEsIGJ1Zi0+aW5kZXggKyBsZW4pOwoJaWYodG1wID09IE5VTEwpCgkgICAgcmV0dXJuIC0xOwoJYnVmLT5kYXRhID0gdG1wOwoJYnVmLT5zaXplID0gYnVmLT5pbmRleCArIGxlbjsKICAgIH0KICAgIG1lbWNweSgoY2hhciopYnVmLT5kYXRhICsgYnVmLT5pbmRleCwgZGF0YSwgbGVuKTsKICAgIGJ1Zi0+aW5kZXggKz0gbGVuOwogICAgcmV0dXJuIGxlbjsKfQoKaW50CnNlY19yZWFkKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGZkLCB2b2lkICpidWZmZXIsIGludCBsZW5ndGgpCnsKICAgIHNpemVfdCBsZW47CiAgICBpbnQgcnggPSAwOwoKICAgIGlmKGNvbm4tPnNlY19jb21wbGV0ZSA9PSAwIHx8IGNvbm4tPmRhdGFfcHJvdCA9PSAwKQogICAgICByZXR1cm4gcmVhZChmZCwgYnVmZmVyLCBsZW5ndGgpOwoKICAgIGlmKGNvbm4tPmluX2J1ZmZlci5lb2ZfZmxhZyl7CiAgICAgIGNvbm4tPmluX2J1ZmZlci5lb2ZfZmxhZyA9IDA7CiAgICAgIHJldHVybiAwOwogICAgfQogICAgCiAgICBsZW4gPSBidWZmZXJfcmVhZCgmY29ubi0+aW5fYnVmZmVyLCBidWZmZXIsIGxlbmd0aCk7CiAgICBsZW5ndGggLT0gbGVuOwogICAgcnggKz0gbGVuOwogICAgYnVmZmVyID0gKGNoYXIqKWJ1ZmZlciArIGxlbjsKICAgIAogICAgd2hpbGUobGVuZ3RoKSB7CiAgICAgIGlmKHNlY19nZXRfZGF0YShjb25uLCBmZCwgJmNvbm4tPmluX2J1ZmZlciwgY29ubi0+ZGF0YV9wcm90KSA8IDApCiAgICAgICAgcmV0dXJuIC0xOwogICAgICBpZihjb25uLT5pbl9idWZmZXIuc2l6ZSA9PSAwKSB7CiAgICAgICAgaWYocngpCiAgICAgICAgICBjb25uLT5pbl9idWZmZXIuZW9mX2ZsYWcgPSAxOwogICAgICAgIHJldHVybiByeDsKICAgICAgfQogICAgICBsZW4gPSBidWZmZXJfcmVhZCgmY29ubi0+aW5fYnVmZmVyLCBidWZmZXIsIGxlbmd0aCk7CiAgICAgIGxlbmd0aCAtPSBsZW47CiAgICAgIHJ4ICs9IGxlbjsKICAgICAgYnVmZmVyID0gKGNoYXIqKWJ1ZmZlciArIGxlbjsKICAgIH0KICAgIHJldHVybiByeDsKfQoKc3RhdGljIGludApzZWNfc2VuZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBmZCwgY2hhciAqZnJvbSwgaW50IGxlbmd0aCkKewogIGludCBieXRlczsKICB2b2lkICpidWY7CiAgYnl0ZXMgPSAoKm1lY2gtPmVuY29kZSkoY29ubi0+YXBwX2RhdGEsIGZyb20sIGxlbmd0aCwgY29ubi0+ZGF0YV9wcm90LCAmYnVmLCBjb25uKTsKICBieXRlcyA9IGh0b25sKGJ5dGVzKTsKICBibG9ja193cml0ZShmZCwgJmJ5dGVzLCBzaXplb2YoYnl0ZXMpKTsKICBibG9ja193cml0ZShmZCwgYnVmLCBudG9obChieXRlcykpOwogIGZyZWUoYnVmKTsKICByZXR1cm4gbGVuZ3RoOwp9CgppbnQKc2VjX2ZmbHVzaChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIEZJTEUgKkYpCnsKICBpZihjb25uLT5kYXRhX3Byb3QgIT0gcHJvdF9jbGVhcikgewogICAgaWYoY29ubi0+b3V0X2J1ZmZlci5pbmRleCA+IDApewogICAgICBzZWNfd3JpdGUoY29ubiwgZmlsZW5vKEYpLAogICAgICAgICAgICAgICAgY29ubi0+b3V0X2J1ZmZlci5kYXRhLCBjb25uLT5vdXRfYnVmZmVyLmluZGV4KTsKICAgICAgY29ubi0+b3V0X2J1ZmZlci5pbmRleCA9IDA7CiAgICB9CiAgICBzZWNfc2VuZChjb25uLCBmaWxlbm8oRiksIE5VTEwsIDApOwogIH0KICBmZmx1c2goRik7CiAgcmV0dXJuIDA7Cn0KCmludApzZWNfZmZsdXNoX2ZkKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGZkKQp7CiAgaWYoY29ubi0+ZGF0YV9wcm90ICE9IHByb3RfY2xlYXIpIHsKICAgIGlmKGNvbm4tPm91dF9idWZmZXIuaW5kZXggPiAwKXsKICAgICAgc2VjX3dyaXRlKGNvbm4sIGZkLAogICAgICAgICAgICAgICAgY29ubi0+b3V0X2J1ZmZlci5kYXRhLCBjb25uLT5vdXRfYnVmZmVyLmluZGV4KTsKICAgICAgY29ubi0+b3V0X2J1ZmZlci5pbmRleCA9IDA7CiAgICB9CiAgICBzZWNfc2VuZChjb25uLCBmZCwgTlVMTCwgMCk7CiAgfQogIHJldHVybiAwOwp9CgppbnQKc2VjX3dyaXRlKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGZkLCBjaGFyICpidWZmZXIsIGludCBsZW5ndGgpCnsKICBpbnQgbGVuID0gY29ubi0+YnVmZmVyX3NpemU7CiAgaW50IHR4ID0gMDsKICAgICAgCiAgaWYoY29ubi0+ZGF0YV9wcm90ID09IHByb3RfY2xlYXIpCiAgICByZXR1cm4gd3JpdGUoZmQsIGJ1ZmZlciwgbGVuZ3RoKTsKCiAgbGVuIC09ICgqbWVjaC0+b3ZlcmhlYWQpKGNvbm4tPmFwcF9kYXRhLCBjb25uLT5kYXRhX3Byb3QsIGxlbik7CiAgd2hpbGUobGVuZ3RoKXsKICAgIGlmKGxlbmd0aCA8IGxlbikKICAgICAgbGVuID0gbGVuZ3RoOwogICAgc2VjX3NlbmQoY29ubiwgZmQsIGJ1ZmZlciwgbGVuKTsKICAgIGxlbmd0aCAtPSBsZW47CiAgICBidWZmZXIgKz0gbGVuOwogICAgdHggKz0gbGVuOwogIH0KICByZXR1cm4gdHg7Cn0KCmludApzZWNfdmZwcmludGYyKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgRklMRSAqZiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQp7CiAgY2hhciAqYnVmOwogIGludCByZXQ7CiAgaWYoY29ubi0+ZGF0YV9wcm90ID09IHByb3RfY2xlYXIpCiAgICByZXR1cm4gdmZwcmludGYoZiwgZm10LCBhcCk7CiAgZWxzZSB7CiAgICBidWYgPSBhcHJpbnRmKGZtdCwgYXApOwogICAgcmV0ID0gYnVmZmVyX3dyaXRlKCZjb25uLT5vdXRfYnVmZmVyLCBidWYsIHN0cmxlbihidWYpKTsKICAgIGZyZWUoYnVmKTsKICAgIHJldHVybiByZXQ7CiAgfQp9CgppbnQKc2VjX2ZwcmludGYyKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgRklMRSAqZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCnsKICAgIGludCByZXQ7CiAgICB2YV9saXN0IGFwOwogICAgdmFfc3RhcnQoYXAsIGZtdCk7CiAgICByZXQgPSBzZWNfdmZwcmludGYyKGNvbm4sIGYsIGZtdCwgYXApOwogICAgdmFfZW5kKGFwKTsKICAgIHJldHVybiByZXQ7Cn0KCmludApzZWNfcHV0YyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCBjLCBGSUxFICpGKQp7CiAgY2hhciBjaCA9IGM7CiAgaWYoY29ubi0+ZGF0YV9wcm90ID09IHByb3RfY2xlYXIpCiAgICByZXR1cm4gcHV0YyhjLCBGKTsKICAgIAogIGJ1ZmZlcl93cml0ZSgmY29ubi0+b3V0X2J1ZmZlciwgJmNoLCAxKTsKICBpZihjID09ICdcbicgfHwgY29ubi0+b3V0X2J1ZmZlci5pbmRleCA+PSAxMDI0IC8qIFhYWCAqLykgewogICAgc2VjX3dyaXRlKGNvbm4sIGZpbGVubyhGKSwgY29ubi0+b3V0X2J1ZmZlci5kYXRhLCBjb25uLT5vdXRfYnVmZmVyLmluZGV4KTsKICAgIGNvbm4tPm91dF9idWZmZXIuaW5kZXggPSAwOwogIH0KICByZXR1cm4gYzsKfQoKaW50CnNlY19yZWFkX21zZyhzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGNoYXIgKnMsIGludCBsZXZlbCkKewogICAgaW50IGxlbjsKICAgIGNoYXIgKmJ1ZjsKICAgIGludCBjb2RlOwogICAgCiAgICBidWYgPSBtYWxsb2Moc3RybGVuKHMpKTsKICAgIGxlbiA9IEN1cmxfYmFzZTY0X2RlY29kZShzICsgNCwgYnVmKTsgLyogWFhYICovCiAgICAKICAgIGxlbiA9ICgqbWVjaC0+ZGVjb2RlKShjb25uLT5hcHBfZGF0YSwgYnVmLCBsZW4sIGxldmVsLCBjb25uKTsKICAgIGlmKGxlbiA8IDApCglyZXR1cm4gLTE7CiAgICAKICAgIGJ1ZltsZW5dID0gJ1wwJzsKCiAgICBpZihidWZbM10gPT0gJy0nKQoJY29kZSA9IDA7CiAgICBlbHNlCglzc2NhbmYoYnVmLCAiJWQiLCAmY29kZSk7CiAgICBpZihidWZbbGVuLTFdID09ICdcbicpCglidWZbbGVuLTFdID0gJ1wwJzsKICAgIHN0cmNweShzLCBidWYpOwogICAgZnJlZShidWYpOwogICAgcmV0dXJuIGNvZGU7Cn0KCi8qIG1vZGlmaWVkIHRvIHJldHVybiBob3cgbWFueSBieXRlcyB3cml0dGVuLCBvciAtMSBvbiBlcnJvciAqKiovCmludApzZWNfdmZwcmludGYoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBGSUxFICpmLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCnsKICAgIGludCByZXQgPSAwOwogICAgY2hhciAqYnVmOwogICAgdm9pZCAqZW5jOwogICAgaW50IGxlbjsKICAgIGlmKCFjb25uLT5zZWNfY29tcGxldGUpCglyZXR1cm4gdmZwcmludGYoZiwgZm10LCBhcCk7CiAgICAKICAgIGJ1ZiA9IGFwcmludGYoZm10LCBhcCk7CiAgICBsZW4gPSAoKm1lY2gtPmVuY29kZSkoY29ubi0+YXBwX2RhdGEsIGJ1Ziwgc3RybGVuKGJ1ZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi0+Y29tbWFuZF9wcm90LCAmZW5jLAoJCQkgIGNvbm4pOwogICAgZnJlZShidWYpOwogICAgaWYobGVuIDwgMCkgewoJZmFpbGYoY29ubi0+ZGF0YSwgIkZhaWxlZCB0byBlbmNvZGUgY29tbWFuZC5cbiIpOwoJcmV0dXJuIC0xOwogICAgfQogICAgaWYoQ3VybF9iYXNlNjRfZW5jb2RlKGVuYywgbGVuLCAmYnVmKSA8IDApewogICAgICBmYWlsZihjb25uLT5kYXRhLCAiT3V0IG9mIG1lbW9yeSBiYXNlNjQtZW5jb2RpbmcuXG4iKTsKICAgICAgcmV0dXJuIC0xOwogICAgfQojaWZkZWYgRlRQX1NFUlZFUgogICAgaWYoY29tbWFuZF9wcm90ID09IHByb3Rfc2FmZSkKCWZwcmludGYoZiwgIjYzMSAlc1xyXG4iLCBidWYpOwogICAgZWxzZSBpZihjb21tYW5kX3Byb3QgPT0gcHJvdF9wcml2YXRlKQoJZnByaW50ZihmLCAiNjMyICVzXHJcbiIsIGJ1Zik7CiAgICBlbHNlIGlmKGNvbW1hbmRfcHJvdCA9PSBwcm90X2NvbmZpZGVudGlhbCkKCWZwcmludGYoZiwgIjYzMyAlc1xyXG4iLCBidWYpOwojZWxzZQogICAgaWYoY29ubi0+Y29tbWFuZF9wcm90ID09IHByb3Rfc2FmZSkKCXJldCA9IGZwcmludGYoZiwgIk1JQyAlcyIsIGJ1Zik7CiAgICBlbHNlIGlmKGNvbm4tPmNvbW1hbmRfcHJvdCA9PSBwcm90X3ByaXZhdGUpCglyZXQgPSBmcHJpbnRmKGYsICJFTkMgJXMiLCBidWYpOwogICAgZWxzZSBpZihjb25uLT5jb21tYW5kX3Byb3QgPT0gcHJvdF9jb25maWRlbnRpYWwpCglyZXQgPSBmcHJpbnRmKGYsICJDT05GICVzIiwgYnVmKTsKI2VuZGlmCiAgICBmcmVlKGJ1Zik7CiAgICByZXR1cm4gcmV0Owp9CgppbnQKc2VjX2ZwcmludGYoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBGSUxFICpmLCBjb25zdCBjaGFyICpmbXQsIC4uLikKewogICAgdmFfbGlzdCBhcDsKICAgIGludCByZXQ7CiAgICB2YV9zdGFydChhcCwgZm10KTsKICAgIHJldCA9IHNlY192ZnByaW50Zihjb25uLCBmLCBmbXQsIGFwKTsKICAgIHZhX2VuZChhcCk7CiAgICByZXR1cm4gcmV0Owp9CgovKiBlbmQgY29tbW9uIHN0dWZmICovCgojaWZkZWYgRlRQX1NFUlZFUgoKLyogc25pcCAqLwoKI2Vsc2UgLyogRlRQX1NFUlZFUiAqLwoKI2lmIDAKdm9pZApzZWNfc3RhdHVzKHZvaWQpCnsKICAgIGlmKGNvbm4tPnNlY19jb21wbGV0ZSl7CglwcmludGYoIlVzaW5nICVzIGZvciBhdXRoZW50aWNhdGlvbi5cbiIsIG1lY2gtPm5hbWUpOwoJcHJpbnRmKCJVc2luZyAlcyBjb21tYW5kIGNoYW5uZWwuXG4iLCBsZXZlbF90b19uYW1lKGNvbW1hbmRfcHJvdCkpOwoJcHJpbnRmKCJVc2luZyAlcyBkYXRhIGNoYW5uZWwuXG4iLCBsZXZlbF90b19uYW1lKGRhdGFfcHJvdCkpOwoJaWYoYnVmZmVyX3NpemUgPiAwKQoJICAgIHByaW50ZigiUHJvdGVjdGlvbiBidWZmZXIgc2l6ZTogJWx1LlxuIiwgCgkJICAgKHVuc2lnbmVkIGxvbmcpYnVmZmVyX3NpemUpOwogICAgfWVsc2V7CglwcmludGYoIk5vdCB1c2luZyBhbnkgc2VjdXJpdHkgbWVjaGFuaXNtLlxuIik7CiAgICB9Cn0KI2VuZGlmCgpzdGF0aWMgaW50CnNlY19wcm90X2ludGVybmFsKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgaW50IGxldmVsKQp7CiAgICBjaGFyICpwOwogICAgdW5zaWduZWQgaW50IHMgPSAxMDQ4NTc2OwogICAgc2l6ZV90IG5yZWFkOwoKICAgIGlmKCFjb25uLT5zZWNfY29tcGxldGUpewogICAgICBpbmZvZihjb25uLT5kYXRhLCAiTm8gc2VjdXJpdHkgZGF0YSBleGNoYW5nZSBoYXMgdGFrZW4gcGxhY2UuXG4iKTsKICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGlmKGxldmVsKXsKICAgICAgQ3VybF9mdHBzZW5kZihjb25uLT5kYXRhLT5maXJzdHNvY2tldCwgY29ubiwKICAgICAgICAgICAgICAgICAgICAiUEJTWiAldSIsIHMpOwogICAgICAvKiB3YWl0IGZvciBmZWVkYmFjayAqLwogICAgICBucmVhZCA9IEN1cmxfR2V0RlRQUmVzcG9uc2UoY29ubi0+ZGF0YS0+Zmlyc3Rzb2NrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLT5kYXRhLT5idWZmZXIsIGNvbm4sIE5VTEwpOwogICAgICBpZihucmVhZCA8IDApCiAgICAgICAgcmV0dXJuIC8qQ1VSTEVfT1BFUkFUSU9OX1RJTUVPVVRFRCovLTE7CiAgICAgIGlmKC8qcmV0ICE9IENPTVBMRVRFKi9jb25uLT5kYXRhLT5idWZmZXJbMF0gIT0gJzInKXsKICAgICAgICBmYWlsZihjb25uLT5kYXRhLCAiRmFpbGVkIHRvIHNldCBwcm90ZWN0aW9uIGJ1ZmZlciBzaXplLlxuIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIGNvbm4tPmJ1ZmZlcl9zaXplID0gczsKICAgICAgcCA9IHN0cnN0cigvKnJlcGx5X3N0cmluZyovY29ubi0+ZGF0YS0+YnVmZmVyLCAiUEJTWj0iKTsKICAgICAgaWYocCkKICAgICAgICBzc2NhbmYocCwgIlBCU1o9JXUiLCAmcyk7CiAgICAgIGlmKHMgPCBjb25uLT5idWZmZXJfc2l6ZSkKICAgICAgICBjb25uLT5idWZmZXJfc2l6ZSA9IHM7CiAgICB9CgogICAgQ3VybF9mdHBzZW5kZihjb25uLT5kYXRhLT5maXJzdHNvY2tldCwgY29ubiwKICAgICAgICAgICAgICAgICAgIlBST1QgJWMiLCBsZXZlbFsiQ1NFUCJdKTsKICAgIC8qIHdhaXQgZm9yIGZlZWRiYWNrICovCiAgICBucmVhZCA9IEN1cmxfR2V0RlRQUmVzcG9uc2UoY29ubi0+ZGF0YS0+Zmlyc3Rzb2NrZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi0+ZGF0YS0+YnVmZmVyLCBjb25uLCBOVUxMKTsKICAgIGlmKG5yZWFkIDwgMCkKICAgICAgcmV0dXJuIC8qQ1VSTEVfT1BFUkFUSU9OX1RJTUVPVVRFRCovLTE7CiAgICBpZigvKnJldCAhPSBDT01QTEVURSovY29ubi0+ZGF0YS0+YnVmZmVyWzBdICE9ICcyJyl7CiAgICAgIGZhaWxmKGNvbm4tPmRhdGEsICJGYWlsZWQgdG8gc2V0IHByb3RlY3Rpb24gbGV2ZWwuXG4iKTsKICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgCiAgICBjb25uLT5kYXRhX3Byb3QgPSAoZW51bSBwcm90ZWN0aW9uX2xldmVsKWxldmVsOwogICAgcmV0dXJuIDA7Cn0KCmVudW0gcHJvdGVjdGlvbl9sZXZlbApzZXRfY29tbWFuZF9wcm90KHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgZW51bSBwcm90ZWN0aW9uX2xldmVsIGxldmVsKQp7CiAgICBlbnVtIHByb3RlY3Rpb25fbGV2ZWwgb2xkID0gY29ubi0+Y29tbWFuZF9wcm90OwogICAgY29ubi0+Y29tbWFuZF9wcm90ID0gbGV2ZWw7CiAgICByZXR1cm4gb2xkOwp9CgojaWYgMAp2b2lkCnNlY19wcm90KGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgaW50IGxldmVsID0gLTE7CgogICAgaWYoYXJnYyA8IDIgfHwgYXJnYyA+IDMpCglnb3RvIHVzYWdlOwogICAgaWYoIXNlY19jb21wbGV0ZSkgewoJcHJpbnRmKCJObyBzZWN1cml0eSBkYXRhIGV4Y2hhbmdlIGhhcyB0YWtlbiBwbGFjZS5cbiIpOwoJY29kZSA9IC0xOwoJcmV0dXJuOwogICAgfQogICAgbGV2ZWwgPSBuYW1lX3RvX2xldmVsKGFyZ3ZbYXJnYyAtIDFdKTsKICAgIAogICAgaWYobGV2ZWwgPT0gLTEpCglnb3RvIHVzYWdlOwogICAgCiAgICBpZigoKm1lY2gtPmNoZWNrX3Byb3QpKGNvbm4tPmFwcF9kYXRhLCBsZXZlbCkpIHsKCXByaW50ZigiJXMgZG9lcyBub3QgaW1wbGVtZW50ICVzIHByb3RlY3Rpb24uXG4iLCAKCSAgICAgICBtZWNoLT5uYW1lLCBsZXZlbF90b19uYW1lKGxldmVsKSk7Cgljb2RlID0gLTE7CglyZXR1cm47CiAgICB9CiAgICAKICAgIGlmKGFyZ2MgPT0gMiB8fCBzdHJuY2FzZWNtcChhcmd2WzFdLCAiZGF0YSIsIHN0cmxlbihhcmd2WzFdKSkgPT0gMCkgewoJaWYoc2VjX3Byb3RfaW50ZXJuYWwobGV2ZWwpIDwgMCl7CgkgICAgY29kZSA9IC0xOwoJICAgIHJldHVybjsKCX0KICAgIH0gZWxzZSBpZihzdHJuY2FzZWNtcChhcmd2WzFdLCAiY29tbWFuZCIsIHN0cmxlbihhcmd2WzFdKSkgPT0gMCkKCXNldF9jb21tYW5kX3Byb3QobGV2ZWwpOwogICAgZWxzZQoJZ290byB1c2FnZTsKICAgIGNvZGUgPSAwOwogICAgcmV0dXJuOwogdXNhZ2U6CiAgICBwcmludGYoInVzYWdlOiAlcyBbY29tbWFuZHxkYXRhXSBbY2xlYXJ8c2FmZXxjb25maWRlbnRpYWx8cHJpdmF0ZV1cbiIsCgkgICBhcmd2WzBdKTsKICAgIGNvZGUgPSAtMTsKfQojZW5kaWYKCnZvaWQKc2VjX3NldF9wcm90ZWN0aW9uX2xldmVsKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKewogIGlmKGNvbm4tPnNlY19jb21wbGV0ZSAmJiBjb25uLT5kYXRhX3Byb3QgIT0gY29ubi0+cmVxdWVzdF9kYXRhX3Byb3QpCiAgICBzZWNfcHJvdF9pbnRlcm5hbChjb25uLCBjb25uLT5yZXF1ZXN0X2RhdGFfcHJvdCk7Cn0KCgppbnQKc2VjX3JlcXVlc3RfcHJvdChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGNoYXIgKmxldmVsKQp7CiAgaW50IGwgPSBuYW1lX3RvX2xldmVsKGxldmVsKTsKICBpZihsID09IC0xKQogICAgcmV0dXJuIC0xOwogIGNvbm4tPnJlcXVlc3RfZGF0YV9wcm90ID0gKGVudW0gcHJvdGVjdGlvbl9sZXZlbClsOwogIHJldHVybiAwOwp9CgppbnQKc2VjX2xvZ2luKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKewogICAgaW50IHJldDsKICAgIHN0cnVjdCBzZWNfY2xpZW50X21lY2ggKiptOwogICAgc2l6ZV90IG5yZWFkOwogICAgc3RydWN0IFVybERhdGEgKmRhdGE9Y29ubi0+ZGF0YTsKCiAgICBmb3IobSA9IG1lY2hzOyAqbSAmJiAoKm0pLT5uYW1lOyBtKyspIHsKCXZvaWQgKnRtcDsKCgl0bXAgPSByZWFsbG9jKGNvbm4tPmFwcF9kYXRhLCAoKm0pLT5zaXplKTsKCWlmICh0bXAgPT0gTlVMTCkgewogICAgICAgICAgZmFpbGYgKGRhdGEsICJyZWFsbG9jICV1IGZhaWxlZCIsICgqbSktPnNpemUpOwogICAgICAgICAgcmV0dXJuIC0xOwoJfQoJY29ubi0+YXBwX2RhdGEgPSB0bXA7CgkgICAgCglpZigoKm0pLT5pbml0ICYmICgqKCptKS0+aW5pdCkoY29ubi0+YXBwX2RhdGEpICE9IDApIHsKCSAgICBpbmZvZihkYXRhLCAiU2tpcHBpbmcgJXMuLi5cbiIsICgqbSktPm5hbWUpOwoJICAgIGNvbnRpbnVlOwoJfQoJaW5mb2YoZGF0YSwgIlRyeWluZyAlcy4uLlxuIiwgKCptKS0+bmFtZSk7CgkvKnJldCA9IGNvbW1hbmQoIkFVVEggJXMiLCAoKm0pLT5uYW1lKTsqKiovCglDdXJsX2Z0cHNlbmRmKGNvbm4tPmRhdGEtPmZpcnN0c29ja2V0LCBjb25uLAogICAgICAgICAgICAgICAgICJBVVRIICVzIiwgKCptKS0+bmFtZSk7CgkvKiB3YWl0IGZvciBmZWVkYmFjayAqLwoJbnJlYWQgPSBDdXJsX0dldEZUUFJlc3BvbnNlKGNvbm4tPmRhdGEtPmZpcnN0c29ja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLT5kYXRhLT5idWZmZXIsIGNvbm4sIE5VTEwpOwoJaWYobnJlYWQgPCAwKQoJICAgIHJldHVybiAvKkNVUkxFX09QRVJBVElPTl9USU1FT1VURUQqLy0xOwoJaWYoLypyZXQgIT0gQ09OVElOVUUqL2Nvbm4tPmRhdGEtPmJ1ZmZlclswXSAhPSAnMycpewoJICAgIGlmKC8qY29kZSA9PSA1MDQqL3N0cm5jbXAoY29ubi0+ZGF0YS0+YnVmZmVyLCI1MDQiLDMpID09IDApIHsKCQlpbmZvZihkYXRhLAogICAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci5cbiIsICgqbSktPm5hbWUpOwoJICAgIH0KICAgICAgICAgICAgZWxzZSBpZigvKmNvZGUgPT0gNTM0Ki9zdHJuY21wKGNvbm4tPmRhdGEtPmJ1ZmZlciwiNTM0IiwzKSA9PSAwKSB7CiAgICAgICAgICAgICAgaW5mb2YoZGF0YSwgIiVzIHJlamVjdGVkIGFzIHNlY3VyaXR5IG1lY2hhbmlzbS5cbiIsICgqbSktPm5hbWUpOwoJICAgIH0KICAgICAgICAgICAgZWxzZSBpZigvKnJldCA9PSBFUlJPUiovY29ubi0+ZGF0YS0+YnVmZmVyWzBdID09ICc1JykgewogICAgICAgICAgICAgIGluZm9mKGRhdGEsICJUaGUgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgRlRQICIKICAgICAgICAgICAgICAgICAgICAic2VjdXJpdHkgZXh0ZW5zaW9ucy5cbiIpOwogICAgICAgICAgICAgIHJldHVybiAtMTsKCSAgICB9CgkgICAgY29udGludWU7Cgl9CgoJcmV0ID0gKCooKm0pLT5hdXRoKShjb25uLT5hcHBfZGF0YSwgLypob3N0KioqL2Nvbm4pOwoJCglpZihyZXQgPT0gQVVUSF9DT05USU5VRSkKICAgICAgICAgIGNvbnRpbnVlOwoJZWxzZSBpZihyZXQgIT0gQVVUSF9PSyl7CiAgICAgICAgICAvKiBtZWNoYW5pc20gaXMgc3VwcG9zZWQgdG8gb3V0cHV0IGVycm9yIHN0cmluZyAqLwoJICAgIHJldHVybiAtMTsKCX0KCW1lY2ggPSAqbTsKCWNvbm4tPnNlY19jb21wbGV0ZSA9IDE7Cgljb25uLT5jb21tYW5kX3Byb3QgPSBwcm90X3NhZmU7CglicmVhazsKICAgIH0KICAgIAogICAgcmV0dXJuICptID09IE5VTEw7Cn0KCnZvaWQKc2VjX2VuZChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCnsKICAgIGlmIChtZWNoICE9IE5VTEwpIHsKCWlmKG1lY2gtPmVuZCkKCSAgICAoKm1lY2gtPmVuZCkoY29ubi0+YXBwX2RhdGEpOwoJbWVtc2V0KGNvbm4tPmFwcF9kYXRhLCAwLCBtZWNoLT5zaXplKTsKCWZyZWUoY29ubi0+YXBwX2RhdGEpOwoJY29ubi0+YXBwX2RhdGEgPSBOVUxMOwogICAgfQogICAgY29ubi0+c2VjX2NvbXBsZXRlID0gMDsKICAgIGNvbm4tPmRhdGFfcHJvdCA9IChlbnVtIHByb3RlY3Rpb25fbGV2ZWwpMDsKfQoKI2VuZGlmIC8qIEZUUF9TRVJWRVIgKi8KCiNlbmRpZiAvKiBLUkI0ICovCg==