ZGlmZiAtLWdpdCBhL2FwL2xpYi9saWJhdGV4dC9leHRfc29ja2V0X2Z1bmMuYyBiL2FwL2xpYi9saWJhdGV4dC9leHRfc29ja2V0X2Z1bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNTY2MDMxCi0tLSAvZGV2L251bGwKKysrIGIvYXAvbGliL2xpYmF0ZXh0L2V4dF9zb2NrZXRfZnVuYy5jCkBAIC0wLDAgKzEsMTYzNSBAQAorI2lmbmRlZiBDT05GSUdfTUlOXzhNX1ZFUlNJT04KKyNpbmNsdWRlICJzb2Z0YXBfYXBpLmgiCisjaW5jbHVkZSAiZXh0X3NvY2tldF9mdW5jLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgImF0X2NvbS5oIgorCitzdHJ1Y3QgbmV0c3J2X21zZyBuZXRzcnYgPSB7MH07CisKKy8vSVC12Na3uPHKvbzssukKK2ludCBjaGVja19pcGFkZHJfbGVnYWwoY2hhciogaXBhZGRyKQoreworCWNoYXIqIHBvaW50ZXJfdG1wX3N0YXJ0ID0gTlVMTDsKKwljaGFyKiBwb2ludGVyX3RtcF9lbmQgPSBOVUxMOworCWNoYXIgc3RyX3RtcFs2NF0gPSB7MH07CisJaW50IGlwYWRkcl9sZW4gPSBzdHJsZW4oaXBhZGRyKTsKKwlpbnQgbnVtID0gMDsKKwlpbnQgaSA9IDA7CisKKwlwb2ludGVyX3RtcF9lbmQgPSBzdHJjaHIoaXBhZGRyLCAnLicpOworCWlmIChwb2ludGVyX3RtcF9lbmQgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYoKGludCkocG9pbnRlcl90bXBfZW5kIC0gaXBhZGRyKSA8IHNpemVvZihzdHJfdG1wKSkKKwkJc25wcmludGYoc3RyX3RtcCwoaW50KShwb2ludGVyX3RtcF9lbmQgLSBpcGFkZHIpKzEsIiVzIixpcGFkZHIpOworCS8vc3RybmNweShzdHJfdG1wLCBpcGFkZHIsIChpbnQpKHBvaW50ZXJfdG1wX2VuZCAtIGlwYWRkcikpOworCW51bSA9IGF0b2koc3RyX3RtcCk7CisKKwlpZiAobnVtIDwgMCB8fCBudW0gPiAyNTUpIHsKKwkJcmV0dXJuIDA7CisJfQorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJcG9pbnRlcl90bXBfc3RhcnQgPSBwb2ludGVyX3RtcF9lbmQgKyAxOworCQlpZiAocG9pbnRlcl90bXBfc3RhcnQgPj0gaXBhZGRyICsgaXBhZGRyX2xlbikgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJcG9pbnRlcl90bXBfZW5kID0gc3RyY2hyKHBvaW50ZXJfdG1wX3N0YXJ0LCAnLicpOworCQlpZiAocG9pbnRlcl90bXBfZW5kID09IE5VTEwpIHsKKwkJCXJldHVybiAwOworCQl9CisJCW1lbXNldChzdHJfdG1wLCAwLCBzaXplb2Yoc3RyX3RtcCkpOworCQlpZigoaW50KShwb2ludGVyX3RtcF9lbmQgLSBwb2ludGVyX3RtcF9zdGFydCkgPCBzaXplb2Yoc3RyX3RtcCkpCisJCQlzbnByaW50ZihzdHJfdG1wLChpbnQpKHBvaW50ZXJfdG1wX2VuZCAtIHBvaW50ZXJfdG1wX3N0YXJ0KSsxLCIlcyIscG9pbnRlcl90bXBfc3RhcnQpOworCQkvL3N0cm5jcHkoc3RyX3RtcCwgcG9pbnRlcl90bXBfc3RhcnQsIChpbnQpKHBvaW50ZXJfdG1wX2VuZCAtIHBvaW50ZXJfdG1wX3N0YXJ0KSk7CisJCW51bSA9IGF0b2koc3RyX3RtcCk7CisJCWlmIChudW0gPCAwIHx8IG51bSA+IDI1NSkgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcG9pbnRlcl90bXBfc3RhcnQgPSBwb2ludGVyX3RtcF9lbmQgKyAxOworCWlmIChwb2ludGVyX3RtcF9zdGFydCA+PSBpcGFkZHIgKyBpcGFkZHJfbGVuKSB7CisJCXJldHVybiAwOworCX0KKwlwb2ludGVyX3RtcF9lbmQgPSBpcGFkZHIgKyBpcGFkZHJfbGVuOworCW1lbXNldChzdHJfdG1wLCAwLCBzaXplb2Yoc3RyX3RtcCkpOworCWlmKChpbnQpKGlwYWRkciArIGlwYWRkcl9sZW4gLSBwb2ludGVyX3RtcF9zdGFydCkgPCBzaXplb2Yoc3RyX3RtcCkpCisJCXNucHJpbnRmKHN0cl90bXAsKGludCkoaXBhZGRyICsgaXBhZGRyX2xlbiAtIHBvaW50ZXJfdG1wX3N0YXJ0KSsxLCIlcyIscG9pbnRlcl90bXBfc3RhcnQpOworCS8vc3RybmNweShzdHJfdG1wLCBwb2ludGVyX3RtcF9zdGFydCwgKGludCkoaXBhZGRyICsgaXBhZGRyX2xlbiAtIHBvaW50ZXJfdG1wX3N0YXJ0KSk7CisJbnVtID0gYXRvaShzdHJfdG1wKTsKKwlpZiAobnVtIDwgMCB8fCBudW0gPiAyNTUpIHsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8vufq153NvY2tldLe9sLi6r8r9yrXP1sf4CisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8KKy8qCisgYXQrbXluZXRzcnY9MSwyLDIsMCwiMTkyLjE2OC4zMC4yMDE6NTEwMKGxCisqLworaW50IGV4dF9uZXRzcnZfcmVxKGludCBhdF9mZCwgY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZywgaW50ICpyZXNfbXNnbGVuKQoreworCXN0cnVjdCBuZXRzcnZfbXNnICAqc3J2ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmV0c3J2X21zZykpOworCWFzc2VydChzcnYpOworCWNoYXIgKiBwb3NfY29sb24gPSBOVUxMOworCWNoYXIgKiBwb3J0ID0gTlVMTDsKKwljaGFyICphdF9zdHIgPSBOVUxMOworCWNoYXIgKnBbNV0gPSB7JnNydi0+Y2hfaWQsICZzcnYtPnNvY2tldGlkLCAmc3J2LT5jb25uX3R5cGUsICZzcnYtPnZpZXdNb2RlLCBzcnYtPmlwcG9ydH07CisgICAgY2hhciAqYyA9IE5VTEw7CisgICAgY2hhciBpcHBvcnRbMTI4XTsKKwltZW1zZXQoc3J2LCAweDAwLCBzaXplb2Yoc3RydWN0IG5ldHNydl9tc2cpKTsKKwlpZig1ICE9IHBhcnNlX3BhcmFtMigiJWQsJWQsJWQsJWQsJXMiLCBhdF9wYXJhcywgcCkpeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKwkvL7LOyv287LLpCisJbWVtY3B5KGlwcG9ydCwgc3J2LT5pcHBvcnQsIHNpemVvZihpcHBvcnQpKTsKKyAgICBwb3NfY29sb24gPSBzdHJjaHIoaXBwb3J0LCAnOicpOyAgICAKKwlwb3J0ID0gcG9zX2NvbG9uICsgMTsKKwlpZiAoKHNydi0+c29ja2V0aWQgPCAwIHx8IHNydi0+c29ja2V0aWQgPj0gNikKKwkgICAgfHwgKHNydi0+dmlld01vZGUgIT0gMCAmJiBzcnYtPnZpZXdNb2RlICE9IDEpCisJICAgIHx8IChzcnYtPmNvbm5fdHlwZSA8IDAgfHwgc3J2LT5jb25uX3R5cGUgPiAyKQorCSAgICB8fCAoc3J2LT5jaF9pZCA8IDAgfHwgc3J2LT5jaF9pZCA+PSA2KQorCSAgICB8fCBwb3NfY29sb24gPT0gTlVMTAorCSAgICB8fCAoYXRvaShwb3J0KSA8IDAgfHwgYXRvaShwb3J0KSA+IDY1NTM1KSkgeworCQlnb3RvIGVycm9yOworCX0KKyAgICAqcG9zX2NvbG9uID0gJ1wwJzsKKyAgICBjID0gaXBwb3J0OworCS8vsLTX1r3a0a27t7zssunKx7fxuqzT0NfWxLijrMjn09DU8mJyZWFrCisJd2hpbGUgKCpjKSB7CisJCWlmIChpc2FscGhhKCpjKSkKKwkJCWJyZWFrOworCQljKys7CisJfQorCWlmICghKmMpIHsKKyAgICAgICAgaWYgKGNoZWNrX2lwYWRkcl9sZWdhbChpcHBvcnQpID09IDApIHsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKyAgICB9CisJbmV0c3J2ID0gKnNydjsvL86qsunRr9PDCisJKnJlc19tc2cgPSBzcnY7CisJKnJlc19tc2dsZW4gPSBzaXplb2Yoc3RydWN0IG5ldHNydl9tc2cpOworCXJldHVybiBBVF9DT05USU5VRTsKKworZXJyb3I6CisgICAgZnJlZShzcnYpOworCWF0X3N0ciA9IG1hbGxvYygzMik7CisJYXNzZXJ0KGF0X3N0cik7CisJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SOiA5ODBcclxuIik7CisJKnJlc19tc2cgPSBhdF9zdHI7CisJKnJlc19tc2dsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKwlyZXR1cm4gQVRfRU5EOworfQoraW50IGV4dF9uZXRzcnZfcnNwKHZvaWQgKnJzcF9tc2csIHZvaWQqKnJldCwgaW50ICpyZXRsZW4pCit7CisJc3RydWN0IGNvbW1fcnNwbXNnICptc2cgPSAoc3RydWN0IGNvbW1fcnNwbXNnKilyc3BfbXNnOworCWNoYXIgKmF0X3N0ciA9IG1hbGxvYygzMik7CisJYXNzZXJ0KGF0X3N0cik7CisJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworCisJaWYgKG1zZy0+cmV0IDwgMCkgeworCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUjogJWRcclxuIiwgbXNnLT5lcnIpOworCX0gZWxzZSB7CisJCXNwcmludGYoYXRfc3RyLCAiXHJcbk9LXHJcbiIpOworCX0KKwkqcmV0ID0gYXRfc3RyOworCSpyZXRsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKwlyZXR1cm4gQVRfRU5EOworfQoraW50IGV4dF9uZXRvcGVuX3JlcShpbnQgYXRfZmQsIGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2csIGludCAqcmVzX21zZ2xlbikKK3sKKwlzdHJ1Y3QgY29tbV9yZXFtc2cgKnJlcW1zZyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IGNvbW1fcmVxbXNnKSk7CisJYXNzZXJ0KHJlcW1zZyk7CisgICAgY2hhciAqYXRfc3RyID0gTlVMTDsKKyAgICBjaGFyICpwWzFdID0geyZyZXFtc2ctPnNvY2tldGlkfTsKKwltZW1zZXQocmVxbXNnLCAweDAwLCBzaXplb2Yoc3RydWN0IGNvbW1fcmVxbXNnKSk7CisJaWYoMSAhPSBwYXJzZV9wYXJhbTIoIiVkIiwgYXRfcGFyYXMsIHApKXsKKyAgICAgICAgZnJlZShyZXFtc2cpOworICAgIAlhdF9zdHIgPSBtYWxsb2MoMzIpOworCQlhc3NlcnQoYXRfc3RyKTsKKyAgICAJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworICAgIAlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUjogOTgwXHJcbiIpOworICAgIAkqcmVzX21zZyA9IGF0X3N0cjsKKyAgICAJKnJlc19tc2dsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKyAgICAJcmV0dXJuIEFUX0VORDsKKyAgICB9CisKKwkqcmVzX21zZyA9IHJlcW1zZzsKKwkqcmVzX21zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgY29tbV9yZXFtc2cpOworCXJldHVybiBBVF9DT05USU5VRTsKK30KK2ludCBleHRfbmV0b3Blbl9yc3Aodm9pZCAqcnNwX21zZywgdm9pZCoqcmV0LCBpbnQgKnJldGxlbikKK3sKKwlzdHJ1Y3QgY29tbV9yc3Btc2cgKm1zZyA9IChzdHJ1Y3QgY29tbV9yc3Btc2cqKXJzcF9tc2c7CisJY2hhciAqYXRfc3RyID0gbWFsbG9jKDY0KTsKKwlhc3NlcnQoYXRfc3RyKTsKKwljaGFyIHBhcmFtWzEwXSA9IHswfTsKKwlpbnQgb2Zmc2V0ID0gMDsKKwltZW1zZXQoYXRfc3RyLCAweDAwLCA2NCk7CisKKwlpZiAobXNnLT5yZXQgPCAwKSB7CisJCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SOiAlZFxyXG4iLCBtc2ctPmVycik7CisJfSBlbHNlIHsKKwkJaWYgKG1zZy0+cmVtb3RlX21zcykgeworCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiXHJcbiRNWU5FVE9QRU46ICVkLCVkXHJcbiIsIG1zZy0+c29ja2V0aWQsIG1zZy0+cmVtb3RlX21zcyk7CisJCX0gZWxzZSB7CisJCQlvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIgKyBvZmZzZXQsICJcclxuJE1ZTkVUT1BFTjogJWRcclxuIiwgbXNnLT5zb2NrZXRpZCk7CisJCX0KKwkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiXHJcbk9LXHJcbiIpOworCX0KKwkqcmV0ID0gYXRfc3RyOworCSpyZXRsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKwlyZXR1cm4gQVRfRU5EOworCit9CitpbnQgZXh0X25ldHJlYWRfcmVxKGludCBhdF9mZCwgY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZywgaW50ICpyZXNfbXNnbGVuKQoreworCXN0cnVjdCBjb21tX3JlcW1zZyAqcmVxbXNnID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tbV9yZXFtc2cpKTsKKwlhc3NlcnQocmVxbXNnKTsKKyAgICBjaGFyICphdF9zdHIgPSBOVUxMOworCWNoYXIgKnBbMl0gPSB7JnJlcW1zZy0+c29ja2V0aWQsICZyZXFtc2ctPmxlbn07CisJbWVtc2V0KHJlcW1zZywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBjb21tX3JlcW1zZykpOworCWlmKDIgIT0gcGFyc2VfcGFyYW0yKCIlZCwlZCIsIGF0X3BhcmFzLCBwKSl7CisgICAgICAgIGZyZWUocmVxbXNnKTsKKyAgICAJYXRfc3RyID0gbWFsbG9jKDMyKTsKKwkJYXNzZXJ0KGF0X3N0cik7CisgICAgCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyKTsKKyAgICAJc3ByaW50ZihhdF9zdHIsICJcclxuRVJST1I6IDk4MFxyXG4iKTsKKyAgICAJKnJlc19tc2cgPSBhdF9zdHI7CisgICAgCSpyZXNfbXNnbGVuID0gc3RybGVuKGF0X3N0cik7CisgICAgCXJldHVybiBBVF9FTkQ7CisgICAgfQorCisJKnJlc19tc2cgPSByZXFtc2c7CisJKnJlc19tc2dsZW4gPSBzaXplb2Yoc3RydWN0IGNvbW1fcmVxbXNnKTsKKwlyZXR1cm4gQVRfQ09OVElOVUU7CisKK30KK2ludCBleHRfbmV0cmVhZF9yc3Aodm9pZCAqcnNwX21zZywgdm9pZCoqcmV0LCBpbnQgKnJldGxlbikKK3sKKwlzdHJ1Y3QgY29tbV9yc3Btc2cgKm1zZyA9IChzdHJ1Y3QgY29tbV9yc3Btc2cqKXJzcF9tc2c7CisJY2hhciAqYXRfc3RyID0gTlVMTDsKKwlpbnQgb2Zmc2V0ID0gMDsKKworCWlmIChtc2ctPnJldCA8IDApIHsKKwkJYXRfc3RyID0gbWFsbG9jKDMyKTsKKwkJYXNzZXJ0KGF0X3N0cik7CisJCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyKTsKKwkJc3ByaW50ZihhdF9zdHIsICJcclxuRVJST1I6ICVkXHJcbiIsIG1zZy0+ZXJyKTsKKwkJb2Zmc2V0ID0gc3RybGVuKGF0X3N0cik7CisJfSBlbHNlIGlmIChtc2ctPmxlbiA9PSAwKSB7CisJCWF0X3N0ciA9IG1hbGxvYyg2NCk7CisJCWFzc2VydChhdF9zdHIpOworCQltZW1zZXQoYXRfc3RyLCAweDAwLCA2NCk7CisJCXNwcmludGYoYXRfc3RyLCAiXHJcbiRNWU5FVFJFQUQ6ICVkLDBcclxuXHJcbk9LXHJcbiIsIG1zZy0+c29ja2V0aWQpOworCQlvZmZzZXQgPSBzdHJsZW4oYXRfc3RyKTsKKwl9IGVsc2UgeworCQlpbnQgdmlld21vZGUgPSBtc2ctPnZpZXdtb2RlOworCQljaGFyICpkYXRhID0gKChjaGFyICopcnNwX21zZyArIHNpemVvZihzdHJ1Y3QgY29tbV9yc3Btc2cpKTsKKwkJaWYgKHZpZXdtb2RlID09IDApIHsgLy9oZXjEo8q9CisJCQlpbnQgaSA9IDA7CisJCQlhdF9zdHIgPSBtYWxsb2MoNjQgKyBtc2ctPmxlbik7CisJCQlhc3NlcnQoYXRfc3RyKTsKKwkJCW1lbXNldChhdF9zdHIsIDB4MDAsIDY0ICsgbXNnLT5sZW4pOworCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiXHJcbiRNWU5FVFJFQUQ6ICVkLCVkXHJcbiIsIG1zZy0+c29ja2V0aWQsIG1zZy0+bGVuKTsKKwkJCW1lbWNweShhdF9zdHIgKyBvZmZzZXQsIGRhdGEsIG1zZy0+bGVuKTsKKwkJCW9mZnNldCArPSBtc2ctPmxlbjsKKwkJCW9mZnNldCArPSBzcHJpbnRmKGF0X3N0ciArIG9mZnNldCwgIlxyXG5PS1xyXG4iKTsKKwkJfSBlbHNlIHsgLy90ZXh0xKPKvQorCQkJLy9pbnQgaSA9IDA7CisJCQlhdF9zdHIgPSBtYWxsb2MoNjQgKyBtc2ctPmxlbiAqIDIpOworCQkJYXNzZXJ0KGF0X3N0cik7CisJCQltZW1zZXQoYXRfc3RyLCAweDAwLCA2NCArIG1zZy0+bGVuICogMik7CisJCQlvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIgKyBvZmZzZXQsICJcclxuJE1ZTkVUUkVBRDogJWQsJWRcclxuIiwgbXNnLT5zb2NrZXRpZCwgbXNnLT5sZW4pOworCQkJbWVtY3B5KGF0X3N0ciArIG9mZnNldCwgZGF0YSwgbXNnLT5sZW4pOworCQkJb2Zmc2V0ICs9IG1zZy0+bGVuOworCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiXHJcbk9LXHJcbiIpOworCQl9CisJfQorCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IG9mZnNldDsKKwlyZXR1cm4gQVRfRU5EOworCit9CisKK2ludCBleHRfc2VuZGJ1Zl9yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJc3RydWN0IGNvbW1fcmVxbXNnICpyZXFtc2cgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb21tX3JlcW1zZykpOworCWFzc2VydChyZXFtc2cpOworICAgIGNoYXIgKmF0X3N0ciA9IE5VTEw7CisJY2hhciAqcFsyXSA9IHsmcmVxbXNnLT5zb2NrZXRpZCwgJnJlcW1zZy0+bGVufTsKKwltZW1zZXQocmVxbXNnLCAweDAwLCBzaXplb2Yoc3RydWN0IGNvbW1fcmVxbXNnKSk7CisJaWYoMiAhPSBwYXJzZV9wYXJhbTIoIiVkLCVkIiwgYXRfcGFyYXMsIHApKXsKKyAgICAgICAgZnJlZShyZXFtc2cpOworICAgIAlhdF9zdHIgPSBtYWxsb2MoMzIpOworCQlhc3NlcnQoYXRfc3RyKTsKKyAgICAJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworICAgIAlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUjogOTgwXHJcbiIpOworICAgIAkqcmVzX21zZyA9IGF0X3N0cjsKKyAgICAJKnJlc19tc2dsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKyAgICAJcmV0dXJuIEFUX0VORDsKKyAgICB9CisKKwkqcmVzX21zZyA9IHJlcW1zZzsKKwkqcmVzX21zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgY29tbV9yZXFtc2cpOworCXJldHVybiBBVF9DT05USU5VRTsKKworfQoraW50IGV4dF9zZW5kYnVmX3JzcCh2b2lkICpyc3BfbXNnLCB2b2lkKipyZXQsIGludCAqcmV0bGVuKQoreworCXN0cnVjdCBjb21tX3JzcG1zZyAqbXNnID0gKHN0cnVjdCBjb21tX3JzcG1zZyopcnNwX21zZzsKKwljaGFyICphdF9zdHIgPSBOVUxMOworCisJaWYgKG1zZy0+cmV0IDwgMCkgeworCQlhdF9zdHIgPSBtYWxsb2MoMzIpOworCQlhc3NlcnQoYXRfc3RyKTsKKwkJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUjogJWRcclxuIiwgbXNnLT5lcnIpOworCX0gZWxzZSB7CisJCWF0X3N0ciA9IG1hbGxvYyg2NCk7CisJCWFzc2VydChhdF9zdHIpOworCQltZW1zZXQoYXRfc3RyLCAweDAwLCA2NCk7CisJCXNwcmludGYoYXRfc3RyLCAiXHJcbiRNWU5FVFdSSVRFOiAlZCwlZFxyXG4iLCBtc2ctPnNvY2tldGlkLCBtc2ctPmxlbik7CisJfQorCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IHN0cmxlbihhdF9zdHIpOworCXJldHVybiBBVF9FTkQ7Cit9CisKK2ludCBleHRfbmV0d3JpdGVfcnNwKHZvaWQgKnJzcF9tc2csIHZvaWQqKnJldCwgaW50ICpyZXRsZW4pCit7CisJc3RydWN0IGNvbW1fcnNwbXNnICptc2cgPSAoc3RydWN0IGNvbW1fcnNwbXNnKilyc3BfbXNnOworCWNoYXIgKmF0X3N0ciA9IE5VTEw7CisKKwlhdF9zdHIgPSBtYWxsb2MoMzIpOworCWFzc2VydChhdF9zdHIpOworCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyKTsKKworCWlmIChtc2ctPnJldCA8IDApIHsKKwkJc3ByaW50ZihhdF9zdHIsICJcclxuRVJST1I6JWRcclxuIiwgbXNnLT5lcnIpOworCX0gZWxzZSB7CisJCXNwcmludGYoYXRfc3RyLCAiXHJcbk9LXHJcbiIpOworCX0KKwkqcmV0ID0gYXRfc3RyOworCSpyZXRsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKwlyZXR1cm4gQVRfRU5EOworCit9CisKK2ludCBleHRfbmV0Y2xvc2VfcmVxKGludCBhdF9mZCwgY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZywgaW50ICpyZXNfbXNnbGVuKQoreworCXN0cnVjdCBjb21tX3JlcW1zZyAqcmVxbXNnID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tbV9yZXFtc2cpKTsKKwlhc3NlcnQocmVxbXNnKTsKKyAgICBjaGFyICphdF9zdHIgPSBOVUxMOworICAgIGNoYXIgKnBbMV0gPSB7JnJlcW1zZy0+c29ja2V0aWR9OworCW1lbXNldChyZXFtc2csIDB4MDAsIHNpemVvZihzdHJ1Y3QgY29tbV9yZXFtc2cpKTsKKwlpZigxICE9IHBhcnNlX3BhcmFtMigiJWQiLCBhdF9wYXJhcywgcCkpeworICAgICAgICBmcmVlKHJlcW1zZyk7CisgICAgCWF0X3N0ciA9IG1hbGxvYygzMik7CisJCWFzc2VydChhdF9zdHIpOworICAgIAltZW1zZXQoYXRfc3RyLCAweDAwLCAzMik7CisgICAgCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SOiA5ODBcclxuIik7CisgICAgCSpyZXNfbXNnID0gYXRfc3RyOworICAgIAkqcmVzX21zZ2xlbiA9IHN0cmxlbihhdF9zdHIpOworICAgIAlyZXR1cm4gQVRfRU5EOworICAgIH0KKworCSpyZXNfbXNnID0gcmVxbXNnOworCSpyZXNfbXNnbGVuID0gc2l6ZW9mKHN0cnVjdCBjb21tX3JlcW1zZyk7CisJcmV0dXJuIEFUX0NPTlRJTlVFOworCit9CitpbnQgZXh0X25ldGNsb3NlX3JzcCh2b2lkICpyc3BfbXNnLCB2b2lkKipyZXQsIGludCAqcmV0bGVuKQoreworCXN0cnVjdCBjb21tX3JzcG1zZyAqbXNnID0gKHN0cnVjdCBjb21tX3JzcG1zZyopcnNwX21zZzsKKwljaGFyICphdF9zdHIgPSBOVUxMOworCisJaWYgKG1zZy0+cmV0IDwgMCkgeworCQlhdF9zdHIgPSBtYWxsb2MoMzIpOworCQlhc3NlcnQoYXRfc3RyKTsKKwkJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUjogJWRcclxuIiwgbXNnLT5lcnIpOworCX0gZWxzZSB7CisJCWF0X3N0ciA9IG1hbGxvYyg2NCk7CisJCWFzc2VydChhdF9zdHIpOworCQltZW1zZXQoYXRfc3RyLCAweDAwLCA2NCk7CisJCXNwcmludGYoYXRfc3RyLCAiXHJcbiRNWU5FVENMT1NFOiAlZFxyXG5cclxuT0tcclxuIiwgbXNnLT5zb2NrZXRpZCk7CisJfQorCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IHN0cmxlbihhdF9zdHIpOworCXJldHVybiBBVF9FTkQ7Cit9CisvKgorIGF0K215bmV0cGluZz0iMTkyLjE2OC4zMC4yMDEiLDUsNDAKKyovCitpbnQgZXh0X25ldHBpbmdfcmVxKGludCBhdF9mZCwgY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZywgaW50ICpyZXNfbXNnbGVuKQoreworCXN0cnVjdCBuZXRwaW5nX3JlcW1zZyAgKnBpbmcgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRwaW5nX3JlcW1zZykpOworCWFzc2VydChwaW5nKTsKKwljaGFyICpwWzNdID0geyZwaW5nLT5yZW1vdGVfaXAsICZwaW5nLT50cnlfY291bnQsICZwaW5nLT5wYWNrZXRfc2l6ZX07CisJbWVtc2V0KHBpbmcsIDB4MDAsIHNpemVvZihzdHJ1Y3QgbmV0cGluZ19yZXFtc2cpKTsKKwlwYXJzZV9wYXJhbTIoIiVzLCVkLCVkIiwgYXRfcGFyYXMsIHApOworCXBpbmctPnRyeV9jb3VudCA9IHBpbmctPnRyeV9jb3VudCA9PSAwID8gNCA6IHBpbmctPnRyeV9jb3VudDsKKwlwaW5nLT5wYWNrZXRfc2l6ZSA9IHBpbmctPnBhY2tldF9zaXplID09IDAgPyAzMiA6IHBpbmctPnBhY2tldF9zaXplOworCSpyZXNfbXNnID0gcGluZzsKKwkqcmVzX21zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgbmV0cGluZ19yZXFtc2cpOworCXJldHVybiBBVF9DT05USU5VRTsKK30KK2ludCBleHRfbmV0cGluZ19yc3Aodm9pZCAqcnNwX21zZywgdm9pZCoqcmV0LCBpbnQgKnJldGxlbikKK3sKKwlzdHJ1Y3QgbmV0cGluZ19yc3Btc2cgKm1zZyA9IChzdHJ1Y3QgbmV0cGluZ19yc3Btc2cqKXJzcF9tc2c7CisJY2hhciAqYXRfc3RyID0gTlVMTDsKKworCWlmIChtc2ctPnJldCA8IDApIHsKKwkJYXRfc3RyID0gbWFsbG9jKDMyKTsKKwkJYXNzZXJ0KGF0X3N0cik7CisJCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyKTsKKwkJc3ByaW50ZihhdF9zdHIsICJcclxuRVJST1I6JWRcclxuIiwgbXNnLT5lcnIpOworCX0gZWxzZSB7CisJCWF0X3N0ciA9IG1hbGxvYyg2NCk7CisJCWFzc2VydChhdF9zdHIpOworCQltZW1zZXQoYXRfc3RyLCAweDAwLCA2NCk7CisJCXNucHJpbnRmKGF0X3N0ciwgNjQsIlxyXG4kTVlORVRQSU5HOiVkLCVkLFwiJXNcIlxyXG4iLAorCQkgICAgICAgIG1zZy0+dG90YWxfcmVjdiwgbXNnLT5lY2hvX3JlcF90dGwsIG1zZy0+cm91bmRfdHJpcF9zdGEpOworCX0KKwkqcmV0ID0gYXRfc3RyOworCSpyZXRsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKwlyZXR1cm4gQVRfRU5EOworfQoraW50IGV4dF9uZXRhY2NlcHRfcmVxKGludCBhdF9mZCwgY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZywgaW50ICpyZXNfbXNnbGVuKQoreworCXN0cnVjdCBuZXRhY2NlcHRfcmVxbXNnICpyZXFtc2cgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRhY2NlcHRfcmVxbXNnKSk7CisJYXNzZXJ0KHJlcW1zZyk7CisgICAgY2hhciAqYXRfc3RyID0gTlVMTDsKKwltZW1zZXQocmVxbXNnLCAweDAwLCBzaXplb2Yoc3RydWN0IG5ldGFjY2VwdF9yZXFtc2cpKTsKKwljaGFyICpwWzNdID0geyZyZXFtc2ctPnNvY2tldGlkLCAmcmVxbXNnLT5hY3Rpb24sICZyZXFtc2ctPnRyYW5zcG9ydE1vZGV9OworCWNoYXIgKnAxWzJdID0geyZyZXFtc2ctPnNvY2tldGlkLCAmcmVxbXNnLT5hY3Rpb259OworCWlmIChnX2N1c3RvbWVyX3R5cGUgPT0gQ1VTVE9NRVJfR1VPRElBTil7CisJCWlmKDMgIT0gcGFyc2VfcGFyYW0yKCIlZCwlZCwlZCIsIGF0X3BhcmFzLCBwKSl7CisgICAgICAgICAgICBmcmVlKHJlcW1zZyk7CisgICAgICAgIAlhdF9zdHIgPSBtYWxsb2MoMzIpOworCQkJYXNzZXJ0KGF0X3N0cik7CisgICAgICAgIAltZW1zZXQoYXRfc3RyLCAweDAwLCAzMik7CisgICAgICAgIAlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUjogOTgwXHJcbiIpOworICAgICAgICAJKnJlc19tc2cgPSBhdF9zdHI7CisgICAgICAgIAkqcmVzX21zZ2xlbiA9IHN0cmxlbihhdF9zdHIpOworICAgICAgICAJcmV0dXJuIEFUX0VORDsKKyAgICAgICAgfQorICAgIH0KKwllbHNlIGlmIChnX2N1c3RvbWVyX3R5cGUgPT0gQ1VTVE9NRVJfTkFORElBTil7CisJCWlmKDIgIT0gcGFyc2VfcGFyYW0yKCIlZCwlZCIsIGF0X3BhcmFzLCBwMSkpeworICAgICAgICAgICAgZnJlZShyZXFtc2cpOworICAgICAgICAJYXRfc3RyID0gbWFsbG9jKDMyKTsKKwkJCWFzc2VydChhdF9zdHIpOworICAgICAgICAJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworICAgICAgICAJc3ByaW50ZihhdF9zdHIsICJcclxuRVJST1I6IDk4MFxyXG4iKTsKKyAgICAgICAgCSpyZXNfbXNnID0gYXRfc3RyOworICAgICAgICAJKnJlc19tc2dsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKyAgICAgICAgCXJldHVybiBBVF9FTkQ7CisgICAgICAgIH0KKyAgICB9CisKKwkqcmVzX21zZyA9IHJlcW1zZzsKKwkqcmVzX21zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgbmV0YWNjZXB0X3JlcW1zZyk7CisJcmV0dXJuIEFUX0NPTlRJTlVFOworCit9CitpbnQgZXh0X25ldGFjY2VwdF9yc3Aodm9pZCAqcnNwX21zZywgdm9pZCoqcmV0LCBpbnQgKnJldGxlbikKK3sKKwlzdHJ1Y3QgbmV0YWNjZXB0X3JzcG1zZyAqbXNnID0gKHN0cnVjdCBuZXRhY2NlcHRfcnNwbXNnKilyc3BfbXNnOworCWNoYXIgKmF0X3N0ciA9IE5VTEw7CisKKwlpZiAobXNnLT5yZXQgPCAwKSB7CisJCWF0X3N0ciA9IG1hbGxvYygzMik7CisJCWFzc2VydChhdF9zdHIpOworCQltZW1zZXQoYXRfc3RyLCAweDAwLCAzMik7CisJCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SOiAlZFxyXG4iLCBtc2ctPmVycik7CisJfSBlbHNlIHsKKwkJYXRfc3RyID0gbWFsbG9jKDMyKTsKKwkJYXNzZXJ0KGF0X3N0cik7CisJCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyKTsKKwkJaWYgKG1zZy0+dHJhbnNwb3J0TW9kZSA9PSBOT05fVFJBTlNQQVJFTlRfTU9ERSkgeworCQkJc3ByaW50ZihhdF9zdHIsICJcclxuT0tcclxuIik7CisJCX0gZWxzZSB7CisJCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5DT05ORUNUXHJcbiIpOworCQl9CisJfQorCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IHN0cmxlbihhdF9zdHIpOworCXJldHVybiBBVF9FTkQ7Cit9CitpbnQgZXh0X25ldGNyZWF0ZV9yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJc3RydWN0IG5ldGNyZWF0ZV9tc2cgICpuZXRjcmVhdGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRjcmVhdGVfbXNnKSk7CisJYXNzZXJ0KG5ldGNyZWF0ZSk7CisgICAgY2hhciAqYXRfc3RyID0gTlVMTDsKKwljaGFyICpwWzZdID0geyZuZXRjcmVhdGUtPmNoX2lkLCAmbmV0Y3JlYXRlLT5tb2RlLCAmbmV0Y3JlYXRlLT5zb2NrZXRpZCwgbmV0Y3JlYXRlLT5yZW1vdGVfaXAsICZuZXRjcmVhdGUtPnJlbW90ZV9wb3J0LCAmbmV0Y3JlYXRlLT5sb2NhbF9wb3J0fTsKKwltZW1zZXQobmV0Y3JlYXRlLCAweDAwLCBzaXplb2Yoc3RydWN0IG5ldGNyZWF0ZV9tc2cpKTsKKwlpZig1ID4gcGFyc2VfcGFyYW0yKCIlZCwlZCwlZCwlcywlZCwlZCIsIGF0X3BhcmFzLCBwKSl7CisgICAgICAgIGZyZWUobmV0Y3JlYXRlKTsKKyAgICAJYXRfc3RyID0gbWFsbG9jKDMyKTsKKwkJYXNzZXJ0KGF0X3N0cik7CisgICAgCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyKTsKKyAgICAJc3ByaW50ZihhdF9zdHIsICJcclxuRVJST1I6IDk4MFxyXG4iKTsKKyAgICAJKnJlc19tc2cgPSBhdF9zdHI7CisgICAgCSpyZXNfbXNnbGVuID0gc3RybGVuKGF0X3N0cik7CisgICAgCXJldHVybiBBVF9FTkQ7CisgICAgfQorCSpyZXNfbXNnID0gbmV0Y3JlYXRlOworCSpyZXNfbXNnbGVuID0gc2l6ZW9mKHN0cnVjdCBuZXRjcmVhdGVfbXNnKTsKKwlyZXR1cm4gQVRfQ09OVElOVUU7Cit9CitpbnQgZXh0X25ldGNyZWF0ZV9yc3Aodm9pZCAqcnNwX21zZywgdm9pZCoqcmV0LCBpbnQgKnJldGxlbikKK3sKKwlzdHJ1Y3QgbmV0Y3JlYXRlX3JzcG1zZyAqbXNnID0gKHN0cnVjdCBuZXRjcmVhdGVfcnNwbXNnKilyc3BfbXNnOworCWNoYXIgKmF0X3N0ciA9IG1hbGxvYyg2NCk7CisJYXNzZXJ0KGF0X3N0cik7CisJY2hhciBwYXJhbVsxMF0gPSB7MH07CisJaW50IG9mZnNldCA9IDA7CisKKwltZW1zZXQoYXRfc3RyLCAweDAwLCA2NCk7CisKKwlpZiAobXNnLT5yZXQgPCAwKSB7CisJCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SOiVkXHJcbiIsIG1zZy0+ZXJyKTsKKwl9IGVsc2UgeworCQlpZiAobXNnLT5tb2RlID09IENPTk5fVFlQRV9UQ1BfUykgeworCQkJc3ByaW50ZihhdF9zdHIsICJcclxuT0tcclxuIik7CisJCX0gZWxzZSB7CisJCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5DT05ORUNUXHJcbiIpOworCQl9CisJfQorCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IHN0cmxlbihhdF9zdHIpOworCXJldHVybiBBVF9FTkQ7CisKK30KKworaW50IGV4dF9uZXR1cmNfcmVxKGludCBhdF9mZCwgY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZywgaW50ICpyZXNfbXNnbGVuKQoreworCXN0cnVjdCBuZXR1cmNfcmVxbXNnICpyZXFtc2cgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXR1cmNfcmVxbXNnKSk7CisJYXNzZXJ0KHJlcW1zZyk7CisgICAgY2hhciAqYXRfc3RyID0gTlVMTDsKKwltZW1zZXQocmVxbXNnLCAweDAwLCBzaXplb2Yoc3RydWN0IG5ldHVyY19yZXFtc2cpKTsKKwljaGFyICpwWzFdID0geyZyZXFtc2ctPm9uX29mZn07CisJaWYoMSAhPSBwYXJzZV9wYXJhbTIoIiVkIiwgYXRfcGFyYXMsIHApKXsKKyAgICAgICAgZnJlZShyZXFtc2cpOworICAgIAlhdF9zdHIgPSBtYWxsb2MoMzIpOworCQlhc3NlcnQoYXRfc3RyKTsKKyAgICAJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworICAgIAlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUjogOTgwXHJcbiIpOworICAgIAkqcmVzX21zZyA9IGF0X3N0cjsKKyAgICAJKnJlc19tc2dsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKyAgICAJcmV0dXJuIEFUX0VORDsKKyAgICB9CisKKwkqcmVzX21zZyA9IHJlcW1zZzsKKwkqcmVzX21zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgbmV0dXJjX3JlcW1zZyk7CisJcmV0dXJuIEFUX0NPTlRJTlVFOworCit9CitpbnQgZXh0X25ldHVyY19yc3Aodm9pZCAqcnNwX21zZywgdm9pZCoqcmV0LCBpbnQgKnJldGxlbikKK3sKKwlzdHJ1Y3QgY29tbV9yc3Btc2cgKm1zZyA9IChzdHJ1Y3QgY29tbV9yc3Btc2cqKXJzcF9tc2c7CisJY2hhciAqYXRfc3RyID0gTlVMTDsKKworCWF0X3N0ciA9IG1hbGxvYygzMik7CisJYXNzZXJ0KGF0X3N0cik7CisJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworCWlmIChtc2ctPnJldCA8IDApIHsKKwkJc3ByaW50ZihhdF9zdHIsICJcclxuRVJST1JcclxuIik7CisJfSBlbHNlIHsKKwkJc3ByaW50ZihhdF9zdHIsICJcclxuT0tcclxuIik7CisJfQorCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IHN0cmxlbihhdF9zdHIpOworCXJldHVybiBBVF9FTkQ7Cit9CitpbnQgZXh0X2lwZmlsdGVyX3JlcShpbnQgYXRfZmQsIGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2csIGludCAqcmVzX21zZ2xlbikKK3sKKwlzdHJ1Y3QgaXBmaWx0ZXJfcmVxbXNnICpyZXFtc2cgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpcGZpbHRlcl9yZXFtc2cpKTsKKwlhc3NlcnQocmVxbXNnKTsKKyAgICBjaGFyICphdF9zdHIgPSBOVUxMOworCW1lbXNldChyZXFtc2csIDB4MDAsIHNpemVvZihzdHJ1Y3QgaXBmaWx0ZXJfcmVxbXNnKSk7CisJY2hhciAqcFs0XSA9IHsmcmVxbXNnLT5pZCwgJnJlcW1zZy0+YWN0aW9uLCByZXFtc2ctPmlwX2FkZHJlc3MsIHJlcW1zZy0+bmV0X21hc2t9OworCWlmKDIgPiBwYXJzZV9wYXJhbTIoIiVkLCVkLCVzLCVzIiwgYXRfcGFyYXMsIHApKXsKKyAgICAgICAgZnJlZShyZXFtc2cpOworICAgIAlhdF9zdHIgPSBtYWxsb2MoMzIpOworCQlhc3NlcnQoYXRfc3RyKTsKKyAgICAJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworICAgIAlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUjogOTgwXHJcbiIpOworICAgIAkqcmVzX21zZyA9IGF0X3N0cjsKKyAgICAJKnJlc19tc2dsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKyAgICAJcmV0dXJuIEFUX0VORDsKKyAgICB9CisJLy9pcGZpbHRlciA9ICpyZXFtc2c7CisJKnJlc19tc2cgPSByZXFtc2c7CisJKnJlc19tc2dsZW4gPSBzaXplb2Yoc3RydWN0IGlwZmlsdGVyX3JlcW1zZyk7CisJcmV0dXJuIEFUX0NPTlRJTlVFOworCit9CitpbnQgZXh0X2lwZmlsdGVyX3JzcCh2b2lkICpyc3BfbXNnLCB2b2lkKipyZXQsIGludCAqcmV0bGVuKQoreworCXN0cnVjdCBjb21tX3JzcG1zZyAqbXNnID0gKHN0cnVjdCBjb21tX3JzcG1zZyopcnNwX21zZzsKKwljaGFyICphdF9zdHIgPSBOVUxMOworCisJYXRfc3RyID0gbWFsbG9jKDMyKTsKKwlhc3NlcnQoYXRfc3RyKTsKKwltZW1zZXQoYXRfc3RyLCAweDAwLCAzMik7CisJaWYgKG1zZy0+cmV0IDwgMCkgeworCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUjogJWRcclxuIiwgbXNnLT5lcnIpOworCX0gZWxzZSB7CisJCXNwcmludGYoYXRfc3RyLCAiXHJcbk9LXHJcbiIpOworCX0KKwkqcmV0ID0gYXRfc3RyOworCSpyZXRsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKwlyZXR1cm4gQVRfRU5EOworfQoraW50IGV4dF9uZXRhY2tfcmVxKGludCBhdF9mZCwgY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZywgaW50ICpyZXNfbXNnbGVuKQoreworCXN0cnVjdCBjb21tX3JlcW1zZyAqcmVxbXNnID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29tbV9yZXFtc2cpKTsKKwlhc3NlcnQocmVxbXNnKTsKKyAgICBjaGFyICphdF9zdHIgPSBOVUxMOworCW1lbXNldChyZXFtc2csIDB4MDAsIHNpemVvZihzdHJ1Y3QgY29tbV9yZXFtc2cpKTsKKwljaGFyICpwWzFdID0geyZyZXFtc2ctPnNvY2tldGlkfTsKKwlpZigxICE9IHBhcnNlX3BhcmFtMigiJWQiLCBhdF9wYXJhcywgcCkpeworICAgICAgICBmcmVlKHJlcW1zZyk7CisgICAgCWF0X3N0ciA9IG1hbGxvYygzMik7CisJCWFzc2VydChhdF9zdHIpOworICAgIAltZW1zZXQoYXRfc3RyLCAweDAwLCAzMik7CisgICAgCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SOiA5ODBcclxuIik7CisgICAgCSpyZXNfbXNnID0gYXRfc3RyOworICAgIAkqcmVzX21zZ2xlbiA9IHN0cmxlbihhdF9zdHIpOworICAgIAlyZXR1cm4gQVRfRU5EOworICAgIH0KKworCSpyZXNfbXNnID0gcmVxbXNnOworCSpyZXNfbXNnbGVuID0gc2l6ZW9mKHN0cnVjdCBjb21tX3JlcW1zZyk7CisJcmV0dXJuIEFUX0NPTlRJTlVFOworCit9CitpbnQgZXh0X25ldGFja19yc3Aodm9pZCAqcnNwX21zZywgdm9pZCoqcmV0LCBpbnQgKnJldGxlbikKK3sKKwlzdHJ1Y3QgbmV0YWNrX3JzcG1zZyAqbXNnID0gKHN0cnVjdCBuZXRhY2tfcnNwbXNnKilyc3BfbXNnOworCWNoYXIgKmF0X3N0ciA9IE5VTEw7CisKKwlhdF9zdHIgPSBtYWxsb2MoMzIpOworCWFzc2VydChhdF9zdHIpOworCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyKTsKKworCWlmIChtc2ctPnJldCA8IDApIHsKKwkJc25wcmludGYoYXRfc3RyLCAzMiwiXHJcbkVSUk9SOiAlZFxyXG4iLCBtc2ctPmVycik7CisJfSBlbHNlIHsKKwkJc25wcmludGYoYXRfc3RyLCAzMiwiXHJcbiRNWU5FVEFDSzogJWQsJWQsJWRcclxuXHJcbk9LXHJcbiIsIG1zZy0+c29ja2V0aWQsIG1zZy0+dW5hY2tlZF9kYXRhbGVuLCBtc2ctPnJlc3RfYnVmZmVybGVuKTsKKwl9CisKKwkqcmV0ID0gYXRfc3RyOworCSpyZXRsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKwlyZXR1cm4gQVRfRU5EOworfQoraW50IGV4dF90eXBlX3JlcShpbnQgYXRfZmQsIGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2csIGludCAqcmVzX21zZ2xlbikKK3sKKwkqcmVzX21zZyA9IE5VTEw7CisJKnJlc19tc2dsZW4gPSAwOworCXJldHVybiBBVF9DT05USU5VRTsKKworfQoraW50IGV4dF90eXBlX3JzcCh2b2lkICpyc3BfbXNnLCB2b2lkKipyZXQsIGludCAqcmV0bGVuKQoreworCXN0cnVjdCB0eXBlX3JzcG1zZyAqbXNnID0gKHN0cnVjdCB0eXBlX3JzcG1zZyopcnNwX21zZzsKKwljaGFyICphdF9zdHIgPSBOVUxMOworCisJYXRfc3RyID0gbWFsbG9jKDMyKTsKKwlhc3NlcnQoYXRfc3RyKTsKKwltZW1zZXQoYXRfc3RyLCAweDAwLCAzMik7CisJaWYgKGdfY3VzdG9tZXJfdHlwZSA9PSBDVVNUT01FUl9HVU9ESUFOKQorCQlzbnByaW50ZihhdF9zdHIsIDMyLCJcclxuJE1ZVFlQRTolLjJ4LCUuMngsJS4yeFxyXG5cclxuT0tcclxuIiwgbXNnLT5tb2RlLCBtc2ctPm5ldHdvcmtfdHlwZSwgbXNnLT5leHRlbmRlZF9mZWF0dXJlKTsKKwllbHNlIGlmIChnX2N1c3RvbWVyX3R5cGUgPT0gQ1VTVE9NRVJfTkFORElBTikKKwkJc25wcmludGYoYXRfc3RyLCAzMiwiXHJcbiRNWU1PREVNOiAlLjJ4LCUuNHhcclxuXHJcbk9LXHJcbiIsIG1zZy0+bW9kZSwgbXNnLT5uZXR3b3JrX3R5cGUpOworCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IHN0cmxlbihhdF9zdHIpOworCXJldHVybiBBVF9FTkQ7Cit9CitpbnQgZXh0X25ldGFjdF9xdWVyeV9yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJKnJlc19tc2cgPSBOVUxMOworCSpyZXNfbXNnbGVuID0gMDsKKwlyZXR1cm4gQVRfQ09OVElOVUU7CisKK30KKworaW50IGV4dF9uZXRhY3RfcXVlcnlfcnNwKHZvaWQgKnJzcF9tc2csIHZvaWQqKnJldCwgaW50ICpyZXRsZW4pCit7CisJc3RydWN0IG5ldGFjdF9xdWVyeV9yc3Btc2cgKm1zZyA9IChzdHJ1Y3QgbmV0YWN0X3F1ZXJ5X3JzcG1zZyopcnNwX21zZzsKKwljaGFyICphdF9zdHIgPSBOVUxMOworCisJYXRfc3RyID0gbWFsbG9jKDY0KTsKKwlhc3NlcnQoYXRfc3RyKTsKKwltZW1zZXQoYXRfc3RyLCAweDAwLCA2NCk7CisKKwlzbnByaW50ZihhdF9zdHIsIDY0LCJcclxuJE1ZTkVUQUNUOiAlZCwlZCxcIiVzXCJcclxuXHJcbk9LXHJcbiIsIG1zZy0+Y2hhbm5lbCwgbXNnLT5zdGF0dXMsIG1zZy0+aXApOworCisJKnJldCA9IGF0X3N0cjsKKwkqcmV0bGVuID0gc3RybGVuKGF0X3N0cik7CisJcmV0dXJuIEFUX0VORDsKK30KKworaW50IGV4dF9uZXRhY3RfZXF1YWxfcXVlcnlfcmVxKGludCBhdF9mZCwgY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZywgaW50ICpyZXNfbXNnbGVuKQoreworCWNoYXIgKmF0X3N0ciA9IE5VTEw7CisKKwlhdF9zdHIgPSBtYWxsb2MoNjQpOworCWFzc2VydChhdF9zdHIpOworCW1lbXNldChhdF9zdHIsIDAsIDY0KTsKKwlzcHJpbnRmKChjaGFyKilhdF9zdHIsICJcclxuJE1ZTkVUQUNUOiAoMC0xKSwoMC01KVxyXG5PS1xyXG4iKTsKKwkqcmVzX21zZyA9IGF0X3N0cjsKKwkqcmVzX21zZ2xlbiA9IHN0cmxlbigqcmVzX21zZyk7CisJcmV0dXJuIEFUX0VORDsKKworfQorCitpbnQgZXh0X25ldHVyY19xdWVyeV9yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJKnJlc19tc2cgPSBOVUxMOworCSpyZXNfbXNnbGVuID0gMDsKKwlyZXR1cm4gQVRfQ09OVElOVUU7CisKK30KK2ludCBleHRfbmV0dXJjX3F1ZXJ5X3JzcCh2b2lkICpyc3BfbXNnLCB2b2lkKipyZXQsIGludCAqcmV0bGVuKQoreworCXN0cnVjdCBuZXR1cmNfcXVlcnlfcnNwbXNnICptc2cgPSAoc3RydWN0IG5ldHVyY19xdWVyeV9yc3Btc2cqKXJzcF9tc2c7CisJY2hhciAqYXRfc3RyID0gTlVMTDsKKworCWF0X3N0ciA9IG1hbGxvYygzMik7CisJYXNzZXJ0KGF0X3N0cik7CisJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworCisJc3ByaW50ZihhdF9zdHIsICJcclxuJE1ZTkVUVVJDOiAlZFxyXG5PS1xyXG4iLCBtc2ctPm9uX29mZik7CisKKwkqcmV0ID0gYXRfc3RyOworCSpyZXRsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKwlyZXR1cm4gQVRfRU5EOworfQoraW50IGV4dF9pcGZpbHRlcl9xdWVyeV9yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJKnJlc19tc2cgPSBOVUxMOworCSpyZXNfbXNnbGVuID0gMDsKKwlyZXR1cm4gQVRfQ09OVElOVUU7CisKK30KK2ludCBleHRfaXBmaWx0ZXJfcXVlcnlfcnNwKHZvaWQgKnJzcF9tc2csIHZvaWQqKnJldCwgaW50ICpyZXRsZW4pCit7CisJc3RydWN0IGlwZmlsdGVyX3F1ZXJ5X3JzcG1zZyAqbXNnID0gKHN0cnVjdCBpcGZpbHRlcl9xdWVyeV9yc3Btc2cqKXJzcF9tc2c7CisJY2hhciAqYXRfc3RyID0gTlVMTDsKKwlpbnQgaSxqID0gMDsKKwlpbnQgb2Zmc2V0ID0gMDsKKworCWF0X3N0ciA9IG1hbGxvYygzMiArIElQX0ZJTFRFUl9OVU0qc2l6ZW9mKHN0cnVjdCBpcGZpbHRlcl9xdWVyeV9yc3Btc2cpKTsKKwlhc3NlcnQoYXRfc3RyKTsKKwltZW1zZXQoYXRfc3RyLCAweDAwLCAzMiArIElQX0ZJTFRFUl9OVU0qc2l6ZW9mKHN0cnVjdCBpcGZpbHRlcl9xdWVyeV9yc3Btc2cpKTsKKworCWZvciAoaSA9IDA7IGkgPCBJUF9GSUxURVJfTlVNOyBpKyspIHsKKyAgICAgICAgZm9yKGogPSAwOyBqIDwgbXNnLT5udW07IGorKykgeworICAgICAgICAgICAgaWYoaSA9PSBtc2ctPmlwZmlsdGVyX2luZm9bal0uaWQpeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKGogPT0gbXNnLT5udW0peworICAgICAgICAgICAgb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiXHJcbiRNWUlQRklMVEVSOiAlZCxcIlwiLFwiXCIiLCBpKTsKKyAgICAgICAgfWVsc2V7CisJCSAgICBvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIgKyBvZmZzZXQsICJcclxuJE1ZSVBGSUxURVI6ICVkLFwiJXNcIixcIiVzXCIiLCBtc2ctPmlwZmlsdGVyX2luZm9bal0uaWQsIG1zZy0+aXBmaWx0ZXJfaW5mb1tqXS5pcF9hZGRyZXNzLCBtc2ctPmlwZmlsdGVyX2luZm9bal0ubmV0X21hc2spOworICAgICAgICB9CisJfQorCW9mZnNldCArPSBzcHJpbnRmKGF0X3N0ciArIG9mZnNldCwgIlxyXG5PS1xyXG4iKTsKKworCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IG9mZnNldDsKKwlyZXR1cm4gQVRfRU5EOworfQoraW50IGV4dF9uZXRzcnZfcXVlcnlfcnNwKGludCBhdF9mZCwgY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZywgaW50ICpyZXNfbXNnbGVuKQoreworCWNoYXIgKmF0X3N0ciA9IE5VTEw7CisJaW50IG9mZnNldCA9IDA7CisKKwlhdF9zdHIgPSBtYWxsb2MoMzIgKyBzaXplb2YobmV0c3J2KSk7CisJYXNzZXJ0KGF0X3N0cik7CisJbWVtc2V0KGF0X3N0ciwgMCwgMzIgKyBzaXplb2YobmV0c3J2KSk7CisJb2Zmc2V0ICs9IHNucHJpbnRmKGF0X3N0ciwgMzIgKyBzaXplb2YobmV0c3J2KSwiXHJcbiRNWU5FVFNSVjogJWQsJWQsJWQsJWQsXCIlc1wiIiwgbmV0c3J2LmNoX2lkLCBuZXRzcnYuc29ja2V0aWQsIG5ldHNydi5jb25uX3R5cGUsIG5ldHNydi52aWV3TW9kZSwgbmV0c3J2LmlwcG9ydCk7CisJb2Zmc2V0ICs9IHNucHJpbnRmKGF0X3N0ciArIG9mZnNldCwzMiArIHNpemVvZihuZXRzcnYpLW9mZnNldCwgIlxyXG5PS1xyXG4iKTsKKwkqcmVzX21zZyA9IGF0X3N0cjsKKwkqcmVzX21zZ2xlbiA9IG9mZnNldDsKKwlyZXR1cm4gQVRfRU5EOworCit9CitpbnQgZXh0X2lwZmlsdGVyX2VxdWFsX3F1ZXJ5X3JzcChpbnQgYXRfZmQsIGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2csIGludCAqcmVzX21zZ2xlbikKK3sKKwljaGFyICphdF9zdHIgPSBOVUxMOworCWludCBvZmZzZXQgPSAwOworCisJYXRfc3RyID0gbWFsbG9jKDY0KTsKKwlhc3NlcnQoYXRfc3RyKTsKKwltZW1zZXQoYXRfc3RyLCAwLCA2NCk7CisJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyLCAiXHJcbiRNWUlQRklMVEVSOiAoMC00KSwoMC0yKSxcIlwiLFwiXCIiKTsKKwlvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIgKyBvZmZzZXQsICJcclxuT0tcclxuIik7CisJKnJlc19tc2cgPSBhdF9zdHI7CisJKnJlc19tc2dsZW4gPSBvZmZzZXQ7CisJcmV0dXJuIEFUX0VORDsKKworfQoraW50IGV4dF9uZXRvcGVuX3F1ZXJ5X3JlcShpbnQgYXRfZmQsIGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2csIGludCAqcmVzX21zZ2xlbikKK3sKKwkqcmVzX21zZyA9IE5VTEw7CisJKnJlc19tc2dsZW4gPSAwOworCXJldHVybiBBVF9DT05USU5VRTsKKworfQoraW50IGV4dF9uZXRvcGVuX3F1ZXJ5X3JzcCh2b2lkICpyc3BfbXNnLCB2b2lkKipyZXQsIGludCAqcmV0bGVuKQoreworCXN0cnVjdCBuZXRvcGVuX3F1ZXJ5X3JzcG1zZyAqbXNnID0gKHN0cnVjdCBuZXRvcGVuX3F1ZXJ5X3JzcG1zZyopcnNwX21zZzsKKwljaGFyICphdF9zdHIgPSBOVUxMOworCisJaWYgKG1zZy0+cmV0ID09IC0xKSB7CisJCWF0X3N0ciA9IG1hbGxvYygzMik7CisJCWFzc2VydChhdF9zdHIpOworCQltZW1zZXQoYXRfc3RyLCAweDAwLCAzMik7CisJCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SXHJcbiIpOworCX0gZWxzZSB7CisJCWF0X3N0ciA9IG1hbGxvYygzMiArIHNpemVvZihzdHJ1Y3QgbmV0b3Blbl9xdWVyeV9yc3Btc2cpKTsKKwkJYXNzZXJ0KGF0X3N0cik7CisJCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyICsgc2l6ZW9mKHN0cnVjdCBuZXRvcGVuX3F1ZXJ5X3JzcG1zZykpOworCisJCXNucHJpbnRmKGF0X3N0ciwzMiArIHNpemVvZihzdHJ1Y3QgbmV0b3Blbl9xdWVyeV9yc3Btc2cpLCAiXHJcbiRNWU5FVE9QRU46ICVkLFwiJXNcIiwlZCxcIiVzXCIsXCIlc1wiLFwiJXNcIiwlZCxcIiVzXCIsJWRcclxuT0tcclxuIiwKKwkJICAgICAgICBtc2ctPnNvY2tldF9pZCwgbXNnLT5sb2NhbF9pcCwgbXNnLT5sb2NhbF9wb3J0LCBtc2ctPmdhdGUsIG1zZy0+ZG5zMSwgbXNnLT5kbnMyLCBtc2ctPnR5cGUsIG1zZy0+ZGVzdF9pcCwgbXNnLT5kZXN0X3Byb3QpOworCX0KKwkqcmV0ID0gYXRfc3RyOworCSpyZXRsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKwlyZXR1cm4gQVRfRU5EOworfQoraW50IGV4dF9va19yc3AoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJY2hhciAqYXRfc3RyID0gTlVMTDsKKworCWF0X3N0ciA9IG1hbGxvYygzMik7CisJYXNzZXJ0KGF0X3N0cik7CisJbWVtc2V0KGF0X3N0ciwgMCwgMzIpOworCXNwcmludGYoKGNoYXIqKWF0X3N0ciwgIlxyXG5PS1xyXG4iKTsKKwkqcmVzX21zZyA9IGF0X3N0cjsKKwkqcmVzX21zZ2xlbiA9IHN0cmxlbigqcmVzX21zZyk7CisJcmV0dXJuIEFUX0VORDsKKworfQorCitjaGFyICogY3NxX2Zvcm1hdChjaGFyICphdF9zdHIpCit7CisJaW50IHJzc2kgPSAwLCBiZXIgPSAwLCBhY3QgPSAwOworCWNoYXIgKmF0X25ldyA9IG1hbGxvYyhzdHJsZW4oYXRfc3RyKSArIDEpOworCWFzc2VydChhdF9uZXcpOworCXZvaWQgKnBbM10gPSB7JnJzc2ksICZiZXIsICZhY3R9OworCWNoYXIgc3RyX3RtcFs2NF0gPSB7MH07CisJY2hhciAqcGNocnN0YXJ0ID0gTlVMTDsKKworCXBjaHJzdGFydCA9IGF0X3N0ciArIDE7CisKKwljaGFyICpwY2hyZW5kID0gc3Ryc3RyKHBjaHJzdGFydCwgIlxyXG4iKTsKKwlpZihwY2hyZW5kICYmIChwY2hyZW5kIC0gcGNocnN0YXJ0KSA8IHNpemVvZihzdHJfdG1wKSkKKwkJc25wcmludGYoc3RyX3RtcCwocGNocmVuZCAtIHBjaHJzdGFydCkrMSwgIiVzIixwY2hyc3RhcnQpOworCS8vc3RybmNweShzdHJfdG1wLCBwY2hyc3RhcnQsIChpbnQpKHBjaHJlbmQgLSBwY2hyc3RhcnQpKTsKKworCS8vaWYgKGF0X25ldyA9PSBOVUxMKQorCS8vCXNvZnRhcF9hc3NlcnQoIiIpOworCisJcGFyc2VfcGFyYW0yKCIlZCwlZCwlZCIsIHN0cl90bXAsIHApOworCisJaWYgKGFjdCA9PSA1IHx8IGFjdCA9PSAxNSkgeyAvL1cgVEQKKwkJaWYgKHJzc2kgPT0gMTk5KSB7CisJCQlyc3NpID0gcnNzaSAtIDEwMDsKKwkJfSBlbHNlIHsKKwkJCXJzc2kgPSBmbG9vcigoKChyc3NpIC0gMTAwIC0gMTE2KSAqICgxMDAuMCAvIDkxLjApICsgMTI3LjQpICogMzEpIC8gMTAwICsgMC4xKTsKKwkJfQorCX0gZWxzZSBpZiAoYWN0ID09IDE3KSB7IC8vTFRFCisJCWlmIChyc3NpID09IDE5OSkgeworCQkJcnNzaSA9IHJzc2kgLSAxMDA7CisJCX0gZWxzZSB7CisJCQlyc3NpID0gZmxvb3IoKCgocnNzaSAtIDEwMCAtIDE0MSkgKiAoMTAwLjAgLyA5Ny4wKSArIDE0NS4zKSAqIDMxKSAvIDEwMCArIDAuMSk7CisJCX0KKwl9CisKKworCW1lbXNldChhdF9uZXcsIDAsIHN0cmxlbihhdF9zdHIpICsgMSk7CisJc3ByaW50ZihhdF9uZXcsICI6ICVsZCwlbGQiLCByc3NpLCBiZXIpOworCXByaW50ZigiY3NxX2Zvcm1hdCBhdF9uZXcgPSAlc1xuIiwgYXRfbmV3KTsKKwlyZXR1cm4gYXRfbmV3OworfQorCitjaGFyICogeHJlZ19mb3JtYXQoY2hhciAqYXRfc3RyKQoreworCWNoYXIgKmF0X25ldyA9IG1hbGxvYyhzdHJsZW4oYXRfc3RyKSArIDEpOworCWFzc2VydChhdF9uZXcpOworCWNoYXIgc3RyX3RtcFs2NF0gPSB7MH07CisJY2hhciAqcGNocnN0YXJ0ID0gTlVMTDsKKwlpbnQgb2Zmc2V0ID0gMDsKKworCS8vaWYgKGF0X25ldyA9PSBOVUxMKQorCS8vCXNvZnRhcF9hc3NlcnQoIiIpOworCW1lbXNldChhdF9uZXcsIDAsIHN0cmxlbihhdF9zdHIpICsgMSk7CisKKwlwY2hyc3RhcnQgPSBhdF9zdHIgKyAyOworCWNoYXIgKnBjaHJlbmQgPSBzdHJzdHIocGNocnN0YXJ0LCAiXHJcbiIpOworCWlmIChwY2hyZW5kID09IE5VTEwpeworCQlzb2Z0YXBfYXNzZXJ0KCIiKTsKKwkJcmV0dXJuIGF0X25ldzsKKwl9CisJaWYgKHN0cnN0cihwY2hyc3RhcnQsICJPSyIpID09IE5VTEwpIHsKKwkJbWVtY3B5KGF0X25ldywgYXRfc3RyLCBwY2hyZW5kIC0gYXRfc3RyKTsKKwl9IGVsc2UgaWYgKHN0cmNocihwY2hyc3RhcnQsICcoJykgIT0gTlVMTCkgeworCQltZW1jcHkoYXRfbmV3LCBhdF9zdHIsIHBjaHJlbmQgLSBhdF9zdHIpOworCX0gZWxzZSB7CisJCWludCAgbiA9IDA7CisJCWludCAgc3RhdCA9IDA7CisJCWNoYXIgY2VyZWdfc3RhdFsyMF0gPSB7MH07CisKKwkJb2Zmc2V0ICs9IHNwcmludGYoYXRfbmV3LCAiOiAlZCIsIDApOworCisJCWdldF9hdF9jbWRfcGFyYW1faW50KHBjaHJzdGFydCwgJm4sICZwY2hyc3RhcnQpOworCisJCW1vdmVfdG9fbmV4dF9wYXJhbShwY2hyc3RhcnQsICZwY2hyc3RhcnQpOworCisJCWdldF9hdF9jbWRfcGFyYW1faW50KHBjaHJzdGFydCwgJnN0YXQsICZwY2hyc3RhcnQpOworCisJCWNmZ19nZXRfaXRlbSgiY2VyZWdfc3RhdCIsIGNlcmVnX3N0YXQsIHNpemVvZihjZXJlZ19zdGF0KSk7CisJCWlmIChzdGF0ICE9IDEgJiYgc3RhdCAhPSA1ICYmICgxID09IGF0b2koY2VyZWdfc3RhdCkgfHwgNSA9PSBhdG9pKGNlcmVnX3N0YXQpKSkgeworCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfbmV3ICsgb2Zmc2V0LCAiLCVkIiwgMSk7CisJCX0gZWxzZSB7CisJCQlvZmZzZXQgKz0gc3ByaW50ZihhdF9uZXcgKyBvZmZzZXQsICIsJWQiLCBzdGF0KTsKKwkJfQorCisJCS8vuvPD5ru509Cyzsr9CisJCWlmICghaXNfYXRfY21kX2VuZChwY2hyc3RhcnQpKSB7CisJCQlzdHJuY3B5KGF0X25ldyArIG9mZnNldCwgcGNocnN0YXJ0IC0gMSwgKGludCkocGNocmVuZCAtIHBjaHJzdGFydCArIDEpKTsKKwkJfQorCX0KKworCS8vcHJpbnRmKCJ4cmVnX2Zvcm1hdCBhdF9uZXcgPSAlc1xuIiwgYXRfbmV3KTsKKwlyZXR1cm4gYXRfbmV3OworfQorCitjaGFyICogY2dhdHRfZm9ybWF0KGNoYXIgKmF0X3N0cikKK3sKKwljaGFyICphdF9uZXcgPSBtYWxsb2Moc3RybGVuKGF0X3N0cikgKyAxKTsKKwlhc3NlcnQoYXRfbmV3KTsKKwkvL2lmIChhdF9uZXcgPT0gTlVMTCkKKwkvLwlzb2Z0YXBfYXNzZXJ0KCIiKTsKKworCW1lbXNldChhdF9uZXcsIDAsIHN0cmxlbihhdF9zdHIpICsgMSk7CisJc3ByaW50ZihhdF9uZXcsICI6ICVkIiwgMSk7CisKKwlwcmludGYoImNnYXR0X2Zvcm1hdCBhdF9uZXcgPSAlc1xuIiwgYXRfbmV3KTsKKwlyZXR1cm4gYXRfbmV3OworfQorCitjaGFyICogY2dzbl9mb3JtYXQoY2hhciAqYXRfc3RyKQoreworCWNoYXIgKmF0X25ldyA9IG1hbGxvYyhzdHJsZW4oYXRfc3RyKSArIDMpOworCWFzc2VydChhdF9uZXcpOworCWNoYXIgc3RyX3RtcFszMl0gPSB7MH07CisJY2hhciAqcGNocnN0YXJ0ID0gTlVMTDsKKworCXBjaHJzdGFydCA9IGF0X3N0ciArIDI7CisKKwljaGFyICpwY2hyZW5kID0gc3Ryc3RyKHBjaHJzdGFydCwgIlxyXG4iKTsKKwlpZihwY2hyZW5kICYmIChwY2hyZW5kIC0gcGNocnN0YXJ0KSA8IHNpemVvZihzdHJfdG1wKSkKKwkJc25wcmludGYoc3RyX3RtcCwocGNocmVuZCAtIHBjaHJzdGFydCkrMSwgIiVzIixwY2hyc3RhcnQpOworCS8vc3RybmNweShzdHJfdG1wLCBwY2hyc3RhcnQsIChpbnQpKHBjaHJlbmQgLSBwY2hyc3RhcnQpKTsKKwkvL2lmIChhdF9uZXcgPT0gTlVMTCkKKwkvLwlzb2Z0YXBfYXNzZXJ0KCIiKTsKKworCW1lbXNldChhdF9uZXcsIDAsIHN0cmxlbihhdF9zdHIpICsgMSk7CisJc3ByaW50ZihhdF9uZXcsICI6IFwiJXNcIiIsIHN0cl90bXApOworCisJcHJpbnRmKCJjZ3NuX2Zvcm1hdCBhdF9uZXcgPSAlc1xuIiwgYXRfbmV3KTsKKwlyZXR1cm4gYXRfbmV3OworfQorCisjaWZkZWYgQVRfUVVFQ1RFTAorLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vCisvL3F1ZWN0ZWwgc29ja2V0t72wuLqvyv3Ktc/Wx/gKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLworLyoKKyBhdCtxaW9wZW49MSwwLCJUQ1AiLCIxOTIuMTY4LjMwLjIwMSIsNTEwMCwwLDAKKyovCitpbnQgZXh0X3Fpb3Blbl9yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJc3RydWN0IHF1ZWN0ZWxfcWlvcGVuX21zZyAgKnFpb3BlbiA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHF1ZWN0ZWxfcWlvcGVuX21zZykpOworCWNoYXIgKnBbN10gPSB7JnFpb3Blbi0+Y29udGV4dF9pZCwgJnFpb3Blbi0+Y29ubmVjdF9pZCwgcWlvcGVuLT5zZXJ2aWNlX3R5cGUsIHFpb3Blbi0+aXBfYWRkciwgcWlvcGVuLT5yZW1vdGVfcG9ydCwgcWlvcGVuLT5sb2NhbF9wb3J0LCBxaW9wZW4tPmFjY2Vzc19tb2RlfTsKKwltZW1zZXQocWlvcGVuLCAweDAwLCBzaXplb2Yoc3RydWN0IHF1ZWN0ZWxfcWlvcGVuX21zZykpOworCXBhcnNlX3BhcmFtMigiJWQsJWQsJXMsJXMsJWQsJWQsJWQiLCBhdF9wYXJhcywgcCk7CisJKnJlc19tc2cgPSBxaW9wZW47CisJKnJlc19tc2dsZW4gPSBzaXplb2Yoc3RydWN0IHF1ZWN0ZWxfcWlvcGVuX21zZyk7CisJcmV0dXJuIEFUX0NPTlRJTlVFOworfQoraW50IGV4dF9xaW9wZW5fcnNwKHZvaWQgKnJzcF9tc2csIHZvaWQqKnJldCwgaW50ICpyZXRsZW4pCit7CisJc3RydWN0IHF1ZWN0ZWxfY29tbV9yc3Btc2cgKm1zZyA9IChzdHJ1Y3QgcXVlY3RlbF9jb21tX3JzcG1zZyopcnNwX21zZzsKKwljaGFyICphdF9zdHIgPSBtYWxsb2MoMzIpOworCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyKTsKKworCWlmIChtc2ctPmFjY2Vzc19tb2RlID09IEJVRkZFUl9BQ0NFU1NfTU9ERSB8fCBtc2ctPmFjY2Vzc19tb2RlID09IERJUkVDVF9QVVNIX01PREUpIHsKKwkJc3ByaW50ZihhdF9zdHIsICJcclxuT0tcclxuK1FJT1BFTjogJWQsJWRcclxuIiwgbXNnLT5jb25uZWN0X2lkLCBtc2ctPmVycik7CisJfSBlbHNlIGlmIChtc2ctPmFjY2Vzc19tb2RlID09IFRSQU5TUEFSRU5UX0FDQ0VTU19NT0RFKSB7CisJCWlmIChtc2ctPnJldCA8IDApIHsKKwkJCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SXHJcbiIpOworCQl9IGVsc2UgeworCQkJc3ByaW50ZihhdF9zdHIsICJcclxuQ09OTkVDVFxyXG4iKTsKKwkJfQorCX0KKwkqcmV0ID0gYXRfc3RyOworCSpyZXRsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKwlyZXR1cm4gQVRfRU5EOworfQoraW50IGV4dF9xaWNsb3NlX3JlcShpbnQgYXRfZmQsIGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2csIGludCAqcmVzX21zZ2xlbikKK3sKKwlzdHJ1Y3QgcXVlY3RlbF9xaWNsb3NlX3JlcW1zZyAqcmVxbXNnID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcXVlY3RlbF9xaWNsb3NlX3JlcW1zZykpOworCWNoYXIgKnBbMl0gPSB7JnJlcW1zZy0+Y29ubmVjdF9pZCwgJnJlcW1zZy0+dGltZW91dH07CisJbWVtc2V0KHJlcW1zZywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBxdWVjdGVsX3FpY2xvc2VfcmVxbXNnKSk7CisJcGFyc2VfcGFyYW0yKCIlZCwlZCIsIGF0X3BhcmFzLCBwKTsKKworCSpyZXNfbXNnID0gcmVxbXNnOworCSpyZXNfbXNnbGVuID0gc2l6ZW9mKHN0cnVjdCBxdWVjdGVsX3FpY2xvc2VfcmVxbXNnKTsKKwlyZXR1cm4gQVRfQ09OVElOVUU7Cit9CitpbnQgZXh0X3FpY2xvc2VfcnNwKHZvaWQgKnJzcF9tc2csIHZvaWQqKnJldCwgaW50ICpyZXRsZW4pCit7CisJc3RydWN0IHF1ZWN0ZWxfY29tbV9yc3Btc2cgKm1zZyA9IChzdHJ1Y3QgcXVlY3RlbF9jb21tX3JzcG1zZyopcnNwX21zZzsKKwljaGFyICphdF9zdHIgPSBtYWxsb2MoMzIpOworCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyKTsKKworCWlmIChtc2ctPnJldCA8IDApIHsKKwkJc3ByaW50ZihhdF9zdHIsICJcclxuRVJST1JcclxuIik7CisJfSBlbHNlIHsKKwkJc3ByaW50ZihhdF9zdHIsICJcclxuT0tcclxuIik7CisJfQorCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IHN0cmxlbihhdF9zdHIpOworCXJldHVybiBBVF9FTkQ7CisKK30KK2ludCBleHRfcWlzdGF0ZV9yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJc3RydWN0IHF1ZWN0ZWxfcWlzdGF0ZV9yZXFtc2cgKnJlcW1zZyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHF1ZWN0ZWxfcWlzdGF0ZV9yZXFtc2cpKTsKKwljaGFyICpwWzJdID0geyZyZXFtc2ctPnF1ZXJ5X3R5cGUsICZyZXFtc2ctPnF1ZXJ5X2lkfTsKKwltZW1zZXQocmVxbXNnLCAweDAwLCBzaXplb2Yoc3RydWN0IHF1ZWN0ZWxfcWlzdGF0ZV9yZXFtc2cpKTsKKwlwYXJzZV9wYXJhbTIoIiVkLCVkIiwgYXRfcGFyYXMsIHApOworCisJKnJlc19tc2cgPSByZXFtc2c7CisJKnJlc19tc2dsZW4gPSBzaXplb2Yoc3RydWN0IHF1ZWN0ZWxfcWlzdGF0ZV9yZXFtc2cpOworCXJldHVybiBBVF9DT05USU5VRTsKKworfQoraW50IGV4dF9xaXN0YXRlX3JzcCh2b2lkICpyc3BfbXNnLCB2b2lkKipyZXQsIGludCAqcmV0bGVuKQoreworCXN0cnVjdCBxdWVjdGVsX3Fpc3RhdGVfcnNwbXNnICptc2cgPSAoc3RydWN0IHF1ZWN0ZWxfcWlzdGF0ZV9yc3Btc2cqKXJzcF9tc2c7CisJY2hhciAqYXRfc3RyID0gTlVMTDsKKwlpbnQgb2Zmc2V0ID0gMDsKKwlpbnQgaSA9IDA7CisKKwlpZiAobXNnLT5udW0gPT0gMCkgeworCQlhdF9zdHIgPSBtYWxsb2MoMzIpOworCQltZW1zZXQoYXRfc3RyLCAweDAwLCAzMik7CisJCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SXHJcbiIpOworCQlvZmZzZXQgPSBzdHJsZW4oYXRfc3RyKTsKKwl9IGVsc2UgaWYgKG1zZy0+cXVlcnlfdHlwZSA9PSBRVUVSWV9DT05ORUNUSU9OX1NUQVRVU19CWV9DT05ORUNUSUQpIHsKKwkJYXRfc3RyID0gbWFsbG9jKDY0ICsgc2l6ZW9mKHN0cnVjdCBxdWVjdGVsX3NvY2tfaW5mbykpOworCQltZW1zZXQoYXRfc3RyLCAweDAwLCA2NCArIHNpemVvZihzdHJ1Y3QgcXVlY3RlbF9zb2NrX2luZm8pKTsKKwkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyLCAiXHJcbitRSVNUQVRFOlxuIik7CisJCW9mZnNldCArPSBzcHJpbnRmKGF0X3N0ciArIG9mZnNldCwgIiVkLCVkLCVzLCVkLCVkLCVkLCVkLCVkLCVkLCVkXHJcbiIsCisJCSAgICAgICAgICAgICAgICAgIG1zZy0+cXVlcnlfc3RhdHVzX2luZm9bMF0uY29ubmVjdF9pZCwKKwkJICAgICAgICAgICAgICAgICAgbXNnLT5xdWVyeV9zdGF0dXNfaW5mb1swXS5zZXJ2aWNlX3R5cGUsCisJCSAgICAgICAgICAgICAgICAgIG1zZy0+cXVlcnlfc3RhdHVzX2luZm9bMF0uaXBfYWRkciwKKwkJICAgICAgICAgICAgICAgICAgbXNnLT5xdWVyeV9zdGF0dXNfaW5mb1swXS5yZW1vdGVfcG9ydCwKKwkJICAgICAgICAgICAgICAgICAgbXNnLT5xdWVyeV9zdGF0dXNfaW5mb1swXS5sb2NhbF9wb3J0LAorCQkgICAgICAgICAgICAgICAgICBtc2ctPnF1ZXJ5X3N0YXR1c19pbmZvWzBdLnNvY2tldF9zdGF0ZSwKKwkJICAgICAgICAgICAgICAgICAgbXNnLT5xdWVyeV9zdGF0dXNfaW5mb1swXS5jb250ZXh0X2lkLAorCQkgICAgICAgICAgICAgICAgICBtc2ctPnF1ZXJ5X3N0YXR1c19pbmZvWzBdLnNlcnZlcl9pZCwKKwkJICAgICAgICAgICAgICAgICAgbXNnLT5xdWVyeV9zdGF0dXNfaW5mb1swXS5hY2Nlc3NfbW9kZSwKKwkJICAgICAgICAgICAgICAgICAgbXNnLT5xdWVyeV9zdGF0dXNfaW5mb1swXS5hdF9wb3J0KTsKKwl9IGVsc2UgeworCQlhdF9zdHIgPSBtYWxsb2MoNjQgKyBtc2ctPm51bSAqIHNpemVvZihzdHJ1Y3QgcXVlY3RlbF9zb2NrX2luZm8pKTsKKwkJbWVtc2V0KGF0X3N0ciwgMHgwMCwgNjQgKyBtc2ctPm51bSAqIHNpemVvZihzdHJ1Y3QgcXVlY3RlbF9zb2NrX2luZm8pKTsKKwkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyLCAiXHJcbkxpc3Qgb2YoK1FJU1RBVEU6XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IG1zZy0+bnVtOyBpKyspIHsKKwkJCW9mZnNldCArPSBzcHJpbnRmKGF0X3N0ciArIG9mZnNldCwgIiVkLCVkLCVzLCVkLCVkLCVkLCVkLCVkLCVkLCVkXHJcbiIsCisJCQkgICAgICAgICAgICAgICAgICBtc2ctPnF1ZXJ5X3N0YXR1c19pbmZvW2ldLmNvbm5lY3RfaWQsCisJCQkgICAgICAgICAgICAgICAgICBtc2ctPnF1ZXJ5X3N0YXR1c19pbmZvW2ldLnNlcnZpY2VfdHlwZSwKKwkJCSAgICAgICAgICAgICAgICAgIG1zZy0+cXVlcnlfc3RhdHVzX2luZm9baV0uaXBfYWRkciwKKwkJCSAgICAgICAgICAgICAgICAgIG1zZy0+cXVlcnlfc3RhdHVzX2luZm9baV0ucmVtb3RlX3BvcnQsCisJCQkgICAgICAgICAgICAgICAgICBtc2ctPnF1ZXJ5X3N0YXR1c19pbmZvW2ldLmxvY2FsX3BvcnQsCisJCQkgICAgICAgICAgICAgICAgICBtc2ctPnF1ZXJ5X3N0YXR1c19pbmZvW2ldLnNvY2tldF9zdGF0ZSwKKwkJCSAgICAgICAgICAgICAgICAgIG1zZy0+cXVlcnlfc3RhdHVzX2luZm9baV0uY29udGV4dF9pZCwKKwkJCSAgICAgICAgICAgICAgICAgIG1zZy0+cXVlcnlfc3RhdHVzX2luZm9baV0uc2VydmVyX2lkLAorCQkJICAgICAgICAgICAgICAgICAgbXNnLT5xdWVyeV9zdGF0dXNfaW5mb1tpXS5hY2Nlc3NfbW9kZSwKKwkJCSAgICAgICAgICAgICAgICAgIG1zZy0+cXVlcnlfc3RhdHVzX2luZm9baV0uYXRfcG9ydCk7CisJCX0KKwkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiKVxuIik7CisJfQorCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IG9mZnNldDsKKwlyZXR1cm4gQVRfRU5EOworCit9CitpbnQgZXh0X3Fpc2VuZF9yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHF1ZWN0ZWxfcWlzZW5kX3JlcW1zZyAqcmVxbXNnID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcXVlY3RlbF9xaXNlbmRfcmVxbXNnKSk7CisJY2hhciAqcFs0XSA9IHsmcmVxbXNnLT5jb25uZWN0X2lkLCAmcmVxbXNnLT5sZW4sIHJlcW1zZy0+aXBfYWRkciwgJnJlcW1zZy0+cmVtb3RlX3BvcnR9OworCW1lbXNldChyZXFtc2csIDB4MDAsIHNpemVvZihzdHJ1Y3QgcXVlY3RlbF9xaXNlbmRfcmVxbXNnKSk7CisJcmV0ID0gcGFyc2VfcGFyYW0yKCIlZCwlZCwlcywlZCIsIGF0X3BhcmFzLCBwKTsKKwlpZiAocmV0ID09IDEpIHsKKwkJcmVxbXNnLT5zZW5kX3R5cGUgPSBDSEFOR0VBQkxFX0xFTkdUSDsKKwl9IGVsc2UgaWYgKHJldCA9PSAyKSB7CisJCWlmIChyZXFtc2ctPmxlbiA9PSAwKSB7CisJCQlyZXFtc2ctPnNlbmRfdHlwZSA9IFFVRVJZX0RBVEFfSU5GTzsKKwkJfSBlbHNlIHsKKwkJCXJlcW1zZy0+c2VuZF90eXBlID0gRklYRURfTEVOR1RIOworCQl9CisJfSBlbHNlIGlmIChyZXQgPT0gNCkgeworCQlyZXFtc2ctPnNlbmRfdHlwZSA9IFVEUF9EQVRBOworCX0KKworCSpyZXNfbXNnID0gcmVxbXNnOworCSpyZXNfbXNnbGVuID0gc2l6ZW9mKHN0cnVjdCBxdWVjdGVsX3Fpc2VuZF9yZXFtc2cpOworCXJldHVybiBBVF9DT05USU5VRTsKKworfQoraW50IGV4dF9xaXNlbmRfcnNwKHZvaWQgKnJzcF9tc2csIHZvaWQqKnJldCwgaW50ICpyZXRsZW4pCit7CisJc3RydWN0IHF1ZWN0ZWxfcWlzZW5kX3JzcG1zZyAqbXNnID0gKHN0cnVjdCBxdWVjdGVsX3Fpc2VuZF9yc3Btc2cqKXJzcF9tc2c7CisJY2hhciAqYXRfc3RyID0gTlVMTDsKKwlpbnQgb2Zmc2V0ID0gMDsKKworCWF0X3N0ciA9IG1hbGxvYygzMik7CisJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworCisJaWYgKG1zZy0+c2VuZF90eXBlID09IFFVRVJZX0RBVEFfSU5GTykgeworCQlpZiAobXNnLT5yZXQgPT0gQ09OTkVDVElPTl9FWElTVCkgeworCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyLCAiXHJcbitRSVNFTkQ6XG4iKTsKKwkJCW9mZnNldCArPSBzcHJpbnRmKGF0X3N0ciArIG9mZnNldCwgIiVkLCVkLCVkXHJcbiIsIG1zZy0+dG90YWxfc2VuZF9sZW5ndGgsIG1zZy0+YWNrZWRieXRlcywgbXNnLT51bmFja2VkYnl0ZXMpOworCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiXHJcbk9LXHJcbiIpOworCQl9IGVsc2UgaWYgKG1zZy0+cmV0ID09IENPTk5FQ1RJT05fTk9UX0VYSVNUKSB7CisJCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUlxyXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChtc2ctPnJldCA9PSBSRUFEWV9UT19TRU5EKSB7CisJCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5TRU5EIE9LXHJcbiIpOworCQl9IGVsc2UgaWYgKG1zZy0+cmV0ID09IFNFTkRfT0spIHsKKwkJCXNwcmludGYoYXRfc3RyLCAiXHJcbiIpOworCQl9IGVsc2UgaWYgKG1zZy0+cmV0ID09IFNFTkRfRkFJTCkgeworCQkJc3ByaW50ZihhdF9zdHIsICJcclxuU0VORCBGQUlMXHJcbiIpOworCQl9IGVsc2UgaWYgKG1zZy0+cmV0ID09IFNFTkRfRVJST1IgfHwgbXNnLT5yZXQgPT0gQ09OTkVDVElPTl9OT1RfRVhJU1QpIHsKKwkJCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SXHJcbiIpOworCQl9CisJfQorCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IHN0cmxlbihhdF9zdHIpOworCXJldHVybiBBVF9FTkQ7Cit9CisKK2ludCBleHRfcWlzZW5kZXhfcmVxKGludCBhdF9mZCwgY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZywgaW50ICpyZXNfbXNnbGVuKQoreworCXN0cnVjdCBxdWVjdGVsX3Fpc2VuZGV4X3JlcW1zZyAqcmVxbXNnID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcXVlY3RlbF9xaXNlbmRleF9yZXFtc2cpKTsKKwljaGFyICpwWzJdID0geyZyZXFtc2ctPmNvbm5lY3RfaWQsIHJlcW1zZy0+aGV4X2RhdGF9OworCW1lbXNldChyZXFtc2csIDB4MDAsIHNpemVvZihzdHJ1Y3QgcXVlY3RlbF9xaXNlbmRleF9yZXFtc2cpKTsKKwlwYXJzZV9wYXJhbTIoIiVkLCVzIiwgYXRfcGFyYXMsIHApOworCisJKnJlc19tc2cgPSByZXFtc2c7CisJKnJlc19tc2dsZW4gPSBzaXplb2Yoc3RydWN0IHF1ZWN0ZWxfcWlzZW5kZXhfcmVxbXNnKTsKKwlyZXR1cm4gQVRfQ09OVElOVUU7CisKK30KK2ludCBleHRfcWlzZW5kZXhfcnNwKHZvaWQgKnJzcF9tc2csIHZvaWQqKnJldCwgaW50ICpyZXRsZW4pCit7CisJc3RydWN0IHF1ZWN0ZWxfY29tbV9yc3Btc2cgKm1zZyA9IChzdHJ1Y3QgcXVlY3RlbF9jb21tX3JzcG1zZyopcnNwX21zZzsKKwljaGFyICphdF9zdHIgPSBOVUxMOworCisJYXRfc3RyID0gbWFsbG9jKDMyKTsKKwltZW1zZXQoYXRfc3RyLCAweDAwLCAzMik7CisKKwlpZiAobXNnLT5yZXQgPT0gU0VORF9PSykgeworCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5TRU5EIE9LXHJcbiIpOworCX0gZWxzZSBpZiAobXNnLT5yZXQgPT0gU0VORF9GQUlMKSB7CisJCXNwcmludGYoYXRfc3RyLCAiXHJcblNFTkQgRkFJTFxyXG4iKTsKKwl9IGVsc2UgaWYgKG1zZy0+cmV0ID09IFNFTkRfRVJST1IpIHsKKwkJc3ByaW50ZihhdF9zdHIsICJcclxuRVJST1JcclxuIik7CisJfQorCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IHN0cmxlbihhdF9zdHIpOworCXJldHVybiBBVF9FTkQ7CisKK30KK2ludCBleHRfcWlyZF9yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHF1ZWN0ZWxfcWlyZF9yZXFtc2cgKnJlcW1zZyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHF1ZWN0ZWxfcWlyZF9yZXFtc2cpKTsKKwljaGFyICpwWzJdID0geyZyZXFtc2ctPmNvbm5lY3RfaWQsICZyZXFtc2ctPmxlbn07CisJbWVtc2V0KHJlcW1zZywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBxdWVjdGVsX3FpcmRfcmVxbXNnKSk7CisKKwlyZXQgPSBwYXJzZV9wYXJhbTIoIiVkLCVkIiwgYXRfcGFyYXMsIHApOworCWlmIChyZXQgPT0gMSkgeworCQlyZXFtc2ctPnJlYWRfdHlwZSA9IENIQU5HRUFCTEVfTEVOR1RIOworCX0gZWxzZSBpZiAocmV0ID09IDIpIHsKKwkJaWYgKHJlcW1zZy0+bGVuID09IDApIHsKKwkJCXJlcW1zZy0+cmVhZF90eXBlID0gUVVFUllfREFUQV9JTkZPOworCQl9IGVsc2UgeworCQkJcmVxbXNnLT5yZWFkX3R5cGUgPSBGSVhFRF9MRU5HVEg7CisJCX0KKwl9CisKKwkqcmVzX21zZyA9IHJlcW1zZzsKKwkqcmVzX21zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgcXVlY3RlbF9xaXJkX3JlcW1zZyk7CisJcmV0dXJuIEFUX0NPTlRJTlVFOworCit9CitpbnQgZXh0X3FpcmRfcnNwKHZvaWQgKnJzcF9tc2csIHZvaWQqKnJldCwgaW50ICpyZXRsZW4pCit7CisJaW50IG9mZnNldCA9IDA7CisJc3RydWN0IHF1ZWN0ZWxfcWlyZF9yc3Btc2cgKm1zZyA9IChzdHJ1Y3QgcXVlY3RlbF9xaXJkX3JzcG1zZyopcnNwX21zZzsKKwljaGFyICphdF9zdHIgPSBOVUxMOworCisJaWYgKG1zZy0+cmVhZF90eXBlID09IFFVRVJZX0RBVEFfSU5GTykgeworCQlpZiAobXNnLT5yZXQgPT0gQ09OTkVDVElPTl9FWElTVCkgeworCQkJYXRfc3RyID0gbWFsbG9jKDMyKTsKKwkJCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyKTsKKwkJCW9mZnNldCArPSBzcHJpbnRmKGF0X3N0ciwgIlxyXG4rUUlSRDpcbiIpOworCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiJWQsJWQsJWRcclxuIiwgbXNnLT50b3RhbF9yY3ZfbGVuZ3RoLCBtc2ctPmhhdmVfcmVhZF9sZW5ndGgsIG1zZy0+dW5yZWFkX2xlbmd0aCk7CisJCQlvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIgKyBvZmZzZXQsICJcclxuT0tcclxuIik7CisJCX0gZWxzZSBpZiAobXNnLT5yZXQgPT0gQ09OTkVDVElPTl9OT1RfRVhJU1QpIHsKKwkJCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SXHJcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKG1zZy0+c2VydmljZV90eXBlID09IFRDUCB8fCBtc2ctPnNlcnZpY2VfdHlwZSA9PSBVRFAgfHwgbXNnLT5zZXJ2aWNlX3R5cGUgPT0gVENQX0xJU1RFTkVSKSB7CisJCQlpZiAobXNnLT5yZXQgPT0gUkVBRF9PSykgeworCQkJCWF0X3N0ciA9IG1hbGxvYygzMiArIG1zZy0+cmVhZF9hY3R1YWxfbGVuZ3RoKTsKKwkJCQltZW1zZXQoYXRfc3RyLCAweDAwLCAzMiArIG1zZy0+cmVhZF9hY3R1YWxfbGVuZ3RoKTsKKwkJCQlvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIsICJcclxuK1FJUkQ6JWRcclxuIiwgbXNnLT5yZWFkX2FjdHVhbF9sZW5ndGgpOworCQkJCW1lbWNweShhdF9zdHIgKyBvZmZzZXQsIG1zZy0+ZGF0YSwgbXNnLT5yZWFkX2FjdHVhbF9sZW5ndGgpOworCQkJCW9mZnNldCArPSBtc2ctPnJlYWRfYWN0dWFsX2xlbmd0aDsKKwkJCQlvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIgKyBvZmZzZXQsICJcclxuT0tcclxuIik7CisJCQl9IGVsc2UgaWYgKG1zZy0+cmV0ID09IE5PREFUQV9SRUFEKSB7CisJCQkJYXRfc3RyID0gbWFsbG9jKDMyKTsKKwkJCQltZW1zZXQoYXRfc3RyLCAweDAwLCAzMik7CisJCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyLCAiXHJcbitRSVJEOjBcbiIpOworCQkJCW9mZnNldCArPSBzcHJpbnRmKGF0X3N0ciArIG9mZnNldCwgIlxyXG5PS1xyXG4iKTsKKwkJCX0gZWxzZSBpZiAobXNnLT5yZXQgPT0gQ09OTkVDVElPTl9OT1RfRVhJU1QpIHsKKwkJCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUlxyXG4iKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChtc2ctPnNlcnZpY2VfdHlwZSA9PSBVRFBfU0VSVklDRSkgeworCQkJaWYgKG1zZy0+cmV0ID09IFJFQURfT0spIHsKKwkJCQlhdF9zdHIgPSBtYWxsb2MoMzIgKyBtc2ctPnJlYWRfYWN0dWFsX2xlbmd0aCk7CisJCQkJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIgKyBtc2ctPnJlYWRfYWN0dWFsX2xlbmd0aCk7CisJCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyLCAiXHJcbitRSVJEOiVkLCVzLCVkXHJcbiIsIG1zZy0+cmVhZF9hY3R1YWxfbGVuZ3RoLCBtc2ctPnJlbW90ZV9pcGFkZHIsIG1zZy0+cmVtb3RlX3BvcnQpOworCQkJCW1lbWNweShhdF9zdHIgKyBvZmZzZXQsIG1zZy0+ZGF0YSwgbXNnLT5yZWFkX2FjdHVhbF9sZW5ndGgpOworCQkJCW9mZnNldCArPSBtc2ctPnJlYWRfYWN0dWFsX2xlbmd0aDsKKwkJCQlvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIgKyBvZmZzZXQsICJcclxuT0tcclxuIik7CisJCQl9IGVsc2UgaWYgKG1zZy0+cmV0ID09IE5PREFUQV9SRUFEKSB7CisJCQkJYXRfc3RyID0gbWFsbG9jKDMyKTsKKwkJCQltZW1zZXQoYXRfc3RyLCAweDAwLCAzMik7CisJCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyLCAiXHJcbitRSVJEOjBcbiIpOworCQkJCW9mZnNldCArPSBzcHJpbnRmKGF0X3N0ciArIG9mZnNldCwgIlxyXG5PS1xyXG4iKTsKKwkJCX0gZWxzZSBpZiAobXNnLT5yZXQgPT0gQ09OTkVDVElPTl9OT1RfRVhJU1QpIHsKKwkJCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUlxyXG4iKTsKKwkJCX0KKwkJfQorCX0KKwkqcmV0ID0gYXRfc3RyOworCSpyZXRsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKwlyZXR1cm4gQVRfRU5EOworfQoraW50IGV4dF9xaXN3dG1kX3JlcShpbnQgYXRfZmQsIGNoYXIgKmF0X3BhcmFzLCB2b2lkICoqIHJlc19tc2csIGludCAqcmVzX21zZ2xlbikKK3sKKwlzdHJ1Y3QgcXVlY3RlbF9xaXN3dG1kX3JlcW1zZyAgKnJlcW1zZyA9IG1hbGxvYyhzaXplb2Yoc3RydWN0IHF1ZWN0ZWxfcWlzd3RtZF9yZXFtc2cpKTsKKwljaGFyICpwWzJdID0geyZyZXFtc2ctPmNvbm5lY3RfaWQsICZyZXFtc2ctPmFjY2Vzc19tb2RlfTsKKwltZW1zZXQocmVxbXNnLCAweDAwLCBzaXplb2Yoc3RydWN0IHF1ZWN0ZWxfcWlzd3RtZF9yZXFtc2cpKTsKKwlwYXJzZV9wYXJhbTIoIiVkLCVkIiwgYXRfcGFyYXMsIHApOworCSpyZXNfbXNnID0gcmVxbXNnOworCSpyZXNfbXNnbGVuID0gc2l6ZW9mKHN0cnVjdCBxdWVjdGVsX3Fpc3d0bWRfcmVxbXNnKTsKKwlyZXR1cm4gQVRfQ09OVElOVUU7Cit9CitpbnQgZXh0X3Fpc3d0bWRfcnNwKHZvaWQgKnJzcF9tc2csIHZvaWQqKnJldCwgaW50ICpyZXRsZW4pCit7CisJc3RydWN0IHF1ZWN0ZWxfcWlzd3RtZF9yc3Btc2cgKm1zZyA9IChzdHJ1Y3QgcXVlY3RlbF9xaXN3dG1kX3JzcG1zZyopcnNwX21zZzsKKwljaGFyICphdF9zdHIgPSBtYWxsb2MoMzIpOworCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyKTsKKworCWlmIChtc2ctPnJldCA9PSBTV19TVUNDKSB7CisJCWlmIChtc2ctPmFjY2Vzc19tb2RlID09IEJVRkZFUl9BQ0NFU1NfTU9ERSB8fCBtc2ctPmFjY2Vzc19tb2RlID09IERJUkVDVF9QVVNIX01PREUpIHsKKwkJCXNwcmludGYoYXRfc3RyLCAiXHJcbk9LXHJcbiIpOworCQl9IGVsc2UgaWYgKG1zZy0+YWNjZXNzX21vZGUgPT0gQlVGRkVSX0FDQ0VTU19NT0RFIHx8IG1zZy0+YWNjZXNzX21vZGUgPT0gRElSRUNUX1BVU0hfTU9ERSkgeworCQkJc3ByaW50ZihhdF9zdHIsICJcclxuQ09OTkVDVFxyXG4iKTsKKwkJfQorCX0gZWxzZSBpZiAobXNnLT5yZXQgPT0gU1dfRkFJTCkgeworCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUlxyXG4iKTsKKwl9CisJKnJldCA9IGF0X3N0cjsKKwkqcmV0bGVuID0gc3RybGVuKGF0X3N0cik7CisJcmV0dXJuIEFUX0VORDsKK30KK2V4dF9xaWRuc2NmZ19yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHF1ZWN0ZWxfcWlkbnNjZmdfcmVxbXNnICpyZXFtc2cgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBxdWVjdGVsX3FpZG5zY2ZnX3JlcW1zZykpOworCWNoYXIgKnBbM10gPSB7JnJlcW1zZy0+Y29udGV4dF9pZCwgcmVxbXNnLT5wcmlfZG5zX2FkZHIsIHJlcW1zZy0+c2VjX2Ruc19hZGRyfTsKKwltZW1zZXQocmVxbXNnLCAweDAwLCBzaXplb2Yoc3RydWN0IHF1ZWN0ZWxfcWlkbnNjZmdfcmVxbXNnKSk7CisKKwlyZXQgPSBwYXJzZV9wYXJhbTIoIiVkLCVkIiwgYXRfcGFyYXMsIHApOworCWlmIChyZXQgPT0gMSkgeworCQlyZXFtc2ctPmFjdGlvbl90eXBlID0gRE5TX1FVRVJZOworCX0gZWxzZSBpZiAocmV0ID09IDIpIHsKKwkJcmVxbXNnLT5hY3Rpb25fdHlwZSA9IEROU19DRkdfTk9fU0VDRE5TQUREUjsKKwl9IGVsc2UgaWYgKHJldCA9PSAzKSB7CisJCXJlcW1zZy0+YWN0aW9uX3R5cGUgPSBETlNfQ0ZHX1dJVEhfU0VDRE5TQUREUjsKKwl9CisKKwkqcmVzX21zZyA9IHJlcW1zZzsKKwkqcmVzX21zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgcXVlY3RlbF9xaXJkX3JlcW1zZyk7CisJcmV0dXJuIEFUX0NPTlRJTlVFOworCit9CitpbnQgZXh0X3FpZG5zY2ZnX3JzcCh2b2lkICpyc3BfbXNnLCB2b2lkKipyZXQsIGludCAqcmV0bGVuKQoreworCWludCBvZmZzZXQgPSAwOworCXN0cnVjdCBxdWVjdGVsX3FpZG5zY2ZnX3JzcG1zZyAqbXNnID0gKHN0cnVjdCBxdWVjdGVsX3FpZG5zY2ZnX3JzcG1zZyopcnNwX21zZzsKKwljaGFyICphdF9zdHIgPSBOVUxMOworCisJaWYgKG1zZy0+YWN0aW9uX3R5cGUgPT0gRE5TX0NGR19XSVRIX1NFQ0ROU0FERFIgfHwgbXNnLT5hY3Rpb25fdHlwZSA9PSBETlNfQ0ZHX05PX1NFQ0ROU0FERFIpIHsKKwkJaWYgKG1zZy0+cmV0ID09IEROU19BQ1RJT05fU1VDQykgeworCQkJc3ByaW50ZihhdF9zdHIsICJcclxuT0tcclxuIik7CisJCX0gZWxzZSBpZiAobXNnLT5yZXQgPT0gRE5TX0FDVElPTl9GQUlMKSB7CisJCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUlxyXG4iKTsKKwkJfQorCX0gZWxzZSBpZiAobXNnLT5hY3Rpb25fdHlwZSA9PSBETlNfUVVFUlkpIHsKKwkJaWYgKG1zZy0+cmV0ID09IEROU19BQ1RJT05fU1VDQykgeworCQkJYXRfc3RyID0gbWFsbG9jKDMyICsgc2l6ZW9mKG1zZy0+cHJpX2Ruc19hZGRyKSArIHNpemVvZihtc2ctPnNlY19kbnNfYWRkcikpOworCQkJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIgKyBzaXplb2YobXNnLT5wcmlfZG5zX2FkZHIpICsgc2l6ZW9mKG1zZy0+c2VjX2Ruc19hZGRyKSk7CisJCQlvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIsICJcclxuK1FJRE5TQ0ZHOiVkLCVzLCVzXHJcbiIsIG1zZy0+Y29udGV4dF9pZCwgbXNnLT5wcmlfZG5zX2FkZHIsIG1zZy0+c2VjX2Ruc19hZGRyKTsKKwkJCW9mZnNldCArPSBzcHJpbnRmKGF0X3N0ciArIG9mZnNldCwgIlxyXG5PS1xyXG4iKTsKKwkJfSBlbHNlIGlmIChtc2ctPnJldCA9PSBETlNfQUNUSU9OX0ZBSUwpIHsKKwkJCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SXHJcbiIpOworCQl9CisKKwl9CisJKnJldCA9IGF0X3N0cjsKKwkqcmV0bGVuID0gc3RybGVuKGF0X3N0cik7CisJcmV0dXJuIEFUX0VORDsKK30KK2V4dF9xaWRuc2dpcF9yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHF1ZWN0ZWxfcWlkbnNnaXBfcmVxbXNnICpyZXFtc2cgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBxdWVjdGVsX3FpZG5zZ2lwX3JlcW1zZykpOworCWNoYXIgKnBbMl0gPSB7JnJlcW1zZy0+Y29udGV4dF9pZCwgcmVxbXNnLT5ob3N0X25hbWV9OworCW1lbXNldChyZXFtc2csIDB4MDAsIHNpemVvZihzdHJ1Y3QgcXVlY3RlbF9xaWRuc2dpcF9yZXFtc2cpKTsKKworCXJldCA9IHBhcnNlX3BhcmFtMigiJWQsJXMiLCBhdF9wYXJhcywgcCk7CisKKwkqcmVzX21zZyA9IHJlcW1zZzsKKwkqcmVzX21zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgcXVlY3RlbF9xaWRuc2dpcF9yZXFtc2cpOworCXJldHVybiBBVF9DT05USU5VRTsKKworfQoraW50IGV4dF9xaWRuc2dpcF9yc3Aodm9pZCAqcnNwX21zZywgdm9pZCoqcmV0LCBpbnQgKnJldGxlbikKK3sKKwlpbnQgb2Zmc2V0ID0gMDsKKwlzdHJ1Y3QgcXVlY3RlbF9xaWRuc2NmZ19yc3Btc2cgKm1zZyA9IChzdHJ1Y3QgcXVlY3RlbF9xaWRuc2NmZ19yc3Btc2cqKXJzcF9tc2c7CisJY2hhciAqYXRfc3RyID0gTlVMTDsKKworCWlmIChtc2ctPmFjdGlvbl90eXBlID09IEROU19DRkdfV0lUSF9TRUNETlNBRERSIHx8IG1zZy0+YWN0aW9uX3R5cGUgPT0gRE5TX0NGR19OT19TRUNETlNBRERSKSB7CisJCWlmIChtc2ctPnJldCA9PSBETlNfQUNUSU9OX1NVQ0MpIHsKKwkJCXNwcmludGYoYXRfc3RyLCAiXHJcbk9LXHJcbiIpOworCQl9IGVsc2UgaWYgKG1zZy0+cmV0ID09IEROU19BQ1RJT05fRkFJTCkgeworCQkJc3ByaW50ZihhdF9zdHIsICJcclxuRVJST1JcclxuIik7CisJCX0KKwl9IGVsc2UgaWYgKG1zZy0+YWN0aW9uX3R5cGUgPT0gRE5TX1FVRVJZKSB7CisJCWlmIChtc2ctPnJldCA9PSBETlNfQUNUSU9OX1NVQ0MpIHsKKwkJCWF0X3N0ciA9IG1hbGxvYygzMiArIHNpemVvZihtc2ctPnByaV9kbnNfYWRkcikgKyBzaXplb2YobXNnLT5zZWNfZG5zX2FkZHIpKTsKKwkJCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyICsgc2l6ZW9mKG1zZy0+cHJpX2Ruc19hZGRyKSArIHNpemVvZihtc2ctPnNlY19kbnNfYWRkcikpOworCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyLCAiXHJcbitRSUROU0NGRzolZCwlcywlc1xyXG4iLCBtc2ctPmNvbnRleHRfaWQsIG1zZy0+cHJpX2Ruc19hZGRyLCBtc2ctPnNlY19kbnNfYWRkcik7CisJCQlvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIgKyBvZmZzZXQsICJcclxuT0tcclxuIik7CisJCX0gZWxzZSBpZiAobXNnLT5yZXQgPT0gRE5TX0FDVElPTl9GQUlMKSB7CisJCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUlxyXG4iKTsKKwkJfQorCisJfQorCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IHN0cmxlbihhdF9zdHIpOworCXJldHVybiBBVF9FTkQ7Cit9CitpbnQgZXh0X3FpZ2V0ZXJyb3JfcmVxKGludCBhdF9mZCwgY2hhciAqYXRfcGFyYXMsIHZvaWQgKiogcmVzX21zZywgaW50ICpyZXNfbXNnbGVuKQoreworCSpyZXNfbXNnID0gTlVMTDsKKwkqcmVzX21zZ2xlbiA9IDA7CisJcmV0dXJuIEFUX0NPTlRJTlVFOworfQoraW50IGV4dF9xaWdldGVycm9yX3JzcCh2b2lkICpyc3BfbXNnLCB2b2lkKipyZXQsIGludCAqcmV0bGVuKQoreworCXN0cnVjdCBxdWVjdGVsX3FpZ2V0ZXJyb3JfcnNwbXNnICptc2cgPSAoc3RydWN0IHF1ZWN0ZWxfcWlnZXRlcnJvcl9yc3Btc2cqKXJzcF9tc2c7CisJaW50IG9mZnNldCA9IDA7CisJY2hhciAqYXRfc3RyID0gbWFsbG9jKDY0KTsKKwltZW1zZXQoYXRfc3RyLCAweDAwLCA2NCk7CisKKwlvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIsICJcclxuK1FJR0VURVJST1I6JWQsJXNcclxuIiwgbXNnLT5lcnIsIG1zZy0+ZXJyY29kZV9kZXNjcmlwdGlvbik7CisJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiXHJcbk9LXHJcbiIpOworCisJKnJldCA9IGF0X3N0cjsKKwkqcmV0bGVuID0gc3RybGVuKGF0X3N0cik7CisJcmV0dXJuIEFUX0VORDsKKworfQoraW50IGV4dF9xcGluZ19yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJc3RydWN0IHFwaW5nX3JlcW1zZyAgKnBpbmcgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBxcGluZ19yZXFtc2cpKTsKKwljaGFyICpwWzRdID0geyZwaW5nLT5jb250ZXh0LCBwaW5nLT5yZW1vdGVfaXAsICZwaW5nLT50aW1lb3V0LCAmcGluZy0+cGluZ19udW19OworCW1lbXNldChwaW5nLCAweDAwLCBzaXplb2Yoc3RydWN0IG5ldHBpbmdfcmVxbXNnKSk7CisJcGFyc2VfcGFyYW0yKCIlZCwlcywlZCwlZCIsIGF0X3BhcmFzLCBwKTsKKwlwaW5nLT50aW1lb3V0ID0gcGluZy0+dGltZW91dCA9PSAwID8gNCA6IHBpbmctPnRpbWVvdXQ7CisJcGluZy0+cGluZ19udW0gPSBwaW5nLT5waW5nX251bSA9PSAwID8gNCA6IHBpbmctPnBpbmdfbnVtOworCSpyZXNfbXNnID0gcGluZzsKKwkqcmVzX21zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgcXBpbmdfcmVxbXNnKTsKKwlyZXR1cm4gQVRfQ09OVElOVUU7Cit9CitpbnQgZXh0X3FwaW5nX3JzcCh2b2lkICpyc3BfbXNnLCB2b2lkKipyZXQsIGludCAqcmV0bGVuKQoreworCXN0cnVjdCBxcGluZ19yc3Btc2cgKm1zZyA9IChzdHJ1Y3QgcXBpbmdfcnNwbXNnKilyc3BfbXNnOworCWNoYXIgKmF0X3N0ciA9IE5VTEw7CisJaW50IG9mZnNldCA9IDA7CisJaW50IGkgPSAwOworCisJaWYgKG1zZy0+cmV0IDwgMCkgeworCQlhdF9zdHIgPSBtYWxsb2MoMzIpOworCQltZW1zZXQoYXRfc3RyLCAweDAwLCAzMik7CisJCXNwcmludGYoYXRfc3RyLCAiXHJcbkVSUk9SXHJcbiIpOworCX0gZWxzZSB7CisJCWF0X3N0ciA9IG1hbGxvYygzMiArIHNpemVvZihzdHJ1Y3QgcXBpbmdfcnNwbXNnKSk7CisJCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyICsgc2l6ZW9mKHN0cnVjdCBxcGluZ19yc3Btc2cpKTsKKwkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiXHJcbk9LXHJcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgbXNnLT5waW5nX251bTsgaSsrKSB7CisJCQlpZiAobXNnLT5lYWNoX3BpbmdfcmVzdWx0W2ldLnJlc3VsdCA9PSAwKSB7CisJCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiXHJcbiRRUElORzpcclxuJWQsJXMsJWQsJWQsJWRcclxuIiwKKwkJCQkgICAgICAgICAgICAgICAgICBtc2ctPmVhY2hfcGluZ19yZXN1bHRbaV0ucmVzdWx0LAorCQkJCSAgICAgICAgICAgICAgICAgIG1zZy0+ZWFjaF9waW5nX3Jlc3VsdFtpXS5yZW1vdGVfaXAsCisJCQkJICAgICAgICAgICAgICAgICAgbXNnLT5lYWNoX3BpbmdfcmVzdWx0W2ldLnBpbmdfbGVuLAorCQkJCSAgICAgICAgICAgICAgICAgIG1zZy0+ZWFjaF9waW5nX3Jlc3VsdFtpXS5yZXNwb25zZV90aW1lLAorCQkJCSAgICAgICAgICAgICAgICAgIG1zZy0+ZWFjaF9waW5nX3Jlc3VsdFtpXS50dGwpOworCQkJfSBlbHNlIHsKKwkJCQlvZmZzZXQgKz0gc3ByaW50ZihhdF9zdHIgKyBvZmZzZXQsICJcclxuJFFQSU5HOlxyXG4lZFxyXG4iLCBtc2ctPmVhY2hfcGluZ19yZXN1bHRbaV0ucmVzdWx0KTsKKwkJCX0KKwkJfQorCQlpZiAobXNnLT5maW5yZXN1bHQgPT0gMCkgeworCQkJb2Zmc2V0ICs9IHNwcmludGYoYXRfc3RyICsgb2Zmc2V0LCAiXHJcbiRRUElORzpcclxuJWQsJWQsJWQsJWQsJWQsJWQsJWRcclxuIiwKKwkJCSAgICAgICAgICAgICAgICAgIG1zZy0+ZmlucmVzdWx0LCBtc2ctPnNlbnQsIG1zZy0+cmN2ZCwgbXNnLT5sb3N0LCBtc2ctPm1pbiwgbXNnLT5tYXgsIG1zZy0+YXZnKTsKKwkJfSBlbHNlIHsKKwkJCW9mZnNldCArPSBzcHJpbnRmKGF0X3N0ciArIG9mZnNldCwgIlxyXG4kUVBJTkc6XHJcbiVkXHJcbiIsIG1zZy0+ZmlucmVzdWx0KTsKKwkJfQorCisJfQorCSpyZXQgPSBhdF9zdHI7CisJKnJldGxlbiA9IHN0cmxlbihhdF9zdHIpOworCXJldHVybiBBVF9FTkQ7Cit9CisjZW5kaWYKKworLyoKKyAgYXQkTVlTT0NLRVRMRUQ9PE9OT0ZGPgorKi8KK3N0YXRpYyBpbnQgZXh0X3NvY2tldGxlZF9yZXEoaW50IGF0X2ZkLCBjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnLCBpbnQgKnJlc19tc2dsZW4pCit7CisJc3RydWN0IHp0ZWZ0cF9zb2NrZXRsZWRfcmVxbXNnICAqcmVxbXNnID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgenRlZnRwX3NvY2tldGxlZF9yZXFtc2cpKTsKKwlhc3NlcnQocmVxbXNnKTsKKyAgICBjaGFyICphdF9zdHIgPSBOVUxMOworCWNoYXIgKnBbMV0gPSB7JnJlcW1zZy0+aXN3aXRjaH07CisJbWVtc2V0KHJlcW1zZywgMHgwMCwgc2l6ZW9mKHN0cnVjdCB6dGVmdHBfc29ja2V0bGVkX3JlcW1zZykpOworCWlmKDEgIT0gcGFyc2VfcGFyYW0yKCIlZCIsIGF0X3BhcmFzLCBwKSl7CisgICAgICAgIGZyZWUocmVxbXNnKTsKKyAgICAJYXRfc3RyID0gbWFsbG9jKDMyKTsKKwkJYXNzZXJ0KGF0X3N0cik7CisgICAgCW1lbXNldChhdF9zdHIsIDB4MDAsIDMyKTsKKyAgICAJc3ByaW50ZihhdF9zdHIsICJcclxuRVJST1I6IDk4MFxyXG4iKTsKKyAgICAJKnJlc19tc2cgPSBhdF9zdHI7CisgICAgCSpyZXNfbXNnbGVuID0gc3RybGVuKGF0X3N0cik7CisgICAgCXJldHVybiBBVF9FTkQ7CisgICAgfQorCS8vYXRfcHJpbnQoQVRfTk9STUFMLCJ6dGVmdHBfc29ja2V0bGVkX3JlcW1zZyAlZFxuIiwgcmVxbXNnLT5pc3dpdGNoKTsKKwkqcmVzX21zZyA9IHJlcW1zZzsKKwkqcmVzX21zZ2xlbiA9IHNpemVvZihzdHJ1Y3QgenRlZnRwX3NvY2tldGxlZF9yZXFtc2cpOworCXJldHVybiBBVF9DT05USU5VRTsKK30KKy8qCisgIDxDUj48TEY+T0s8Q1I+PExGPgorICA8Q1I+PExGPkVSUk9SPENSPjxMRj4KKyovCitzdGF0aWMgaW50IGV4dF9zb2NrZXRsZWRfcnNwKHZvaWQgKnJzcF9tc2csIHZvaWQqKnJldCwgaW50ICpyZXRsZW4pCit7CisJc3RydWN0IHp0ZWZ0cF9zb2NrZXRsZWRfcnNwbXNnICpyc3Btc2cgPSAoc3RydWN0IHp0ZWZ0cF9zb2NrZXRsZWRfcnNwbXNnKilyc3BfbXNnOworCWNoYXIgKmF0X3N0ciA9IG1hbGxvYygzMik7CisJYXNzZXJ0KGF0X3N0cik7CisJbWVtc2V0KGF0X3N0ciwgMHgwMCwgMzIpOworCisJaWYgKHJzcG1zZy0+cmVzdWx0IDwgMCkgeworCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5FUlJPUlxyXG4iKTsKKwl9IGVsc2UgeworCQlzcHJpbnRmKGF0X3N0ciwgIlxyXG5PS1xyXG4iKTsKKwl9CisKKwkqcmV0ID0gYXRfc3RyOworCSpyZXRsZW4gPSBzdHJsZW4oYXRfc3RyKTsKKwlyZXR1cm4gQVRfRU5EOworfQorCitpbnQgZXh0X2VucHdyc2F2ZV9zZXRfZnVuYyhjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnKQoreworCWludCBlbnB3cnNhdmUgPSAwOworCXZvaWQgKnBbXSA9IHsmZW5wd3JzYXZlfTsKKwlpbnQgcmV0ID0gMDsKKwljaGFyICphdF9zdHIgPSBOVUxMOworCWF0X3N0ciA9IG1hbGxvYygxNik7CisJYXNzZXJ0KGF0X3N0cik7CisJbWVtc2V0KGF0X3N0ciwwLDE2KTsKKworCXJldCA9IHBhcnNlX3BhcmFtKCIlZCIsYXRfcGFyYXMsIHApOworCWlmKHJldCAhPSBBVF9QQVJTRV9PSykKKwl7CisJCXNwcmludGYoYXRfc3RyLCJcclxuRVJST1I6IDk4MFxyXG4iKTsKKwkJKnJlc19tc2cgPSBhdF9zdHI7CisJCXJldHVybiBBVF9FTkQ7CisJfQorCQorCWlmKDAgPT0gZW5wd3JzYXZlKQkvL7K71MrQ7b34yOvQ3cPfxKPKvQorCXsKKwkJc2V0X3dha2VfbG9jayhBUF9MT0NLKTsKKwkJZ19hcF9sb2NrID0gMDsKKwl9CisJZWxzZSBpZigxID09IGVucHdyc2F2ZSkgLy/UytDtvfjI69Ddw9/Eo8q9CisJeworCQlzZXRfd2FrZV91bmxvY2soQVBfTE9DSyk7CisJCWdfYXBfbG9jayA9IDE7CisJfQorCWVsc2UKKwl7CisJCXNwcmludGYoYXRfc3RyLCJcclxuRVJST1I6IDk4MFxyXG4iKTsKKwkJKnJlc19tc2cgPSBhdF9zdHI7CisJCXJldHVybiBBVF9FTkQ7CisJfQorCQorCXNwcmludGYoYXRfc3RyLCJcclxuT0tcclxuIik7CisJKnJlc19tc2cgPSBhdF9zdHI7CisJcmV0dXJuIEFUX0VORDsJCisKK30KKworaW50IGV4dF9lbnB3cnNhdmVfcXVlcnlfZnVuYyhjaGFyICphdF9wYXJhcywgdm9pZCAqKiByZXNfbXNnKQorewkKKwljaGFyICphdF9zdHIgPSBOVUxMOworCWF0X3N0ciA9IG1hbGxvYygzMik7CisJYXNzZXJ0KGF0X3N0cik7CisJbWVtc2V0KGF0X3N0ciwwLDMyKTsKKworCXNwcmludGYoYXRfc3RyLCJcclxuK0VOUFdSU0FWRTogJWRcclxuT0tcclxuIixnX2FwX2xvY2spOworCSpyZXNfbXNnID0gYXRfc3RyOworCXJldHVybiBBVF9FTkQ7CQorfQorCisKK2ludCAgZXh0X3NvY2tldF9yZWdpc3Qodm9pZCkKK3sKKwlpZiAoZ19jdXN0b21lcl90eXBlID09IENVU1RPTUVSX0dVT0RJQU4pIHsKKwkJLy9TT0NLRVS0tL2ooaLK/b7dytW3ogorCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVFNSVj0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVFNSVl9SRVEsIE1TR19DTURfTkVUU1JWX1JTUCwgZXh0X25ldHNydl9yZXEsCWV4dF9uZXRzcnZfcnNwKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRPUEVOPSIsIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfTkVUT1BFTl9SRVEsIE1TR19DTURfTkVUT1BFTl9SU1AsIGV4dF9uZXRvcGVuX3JlcSwgZXh0X25ldG9wZW5fcnNwKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRSRUFEPSIsIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfTkVUUkVBRF9SRVEsIE1TR19DTURfTkVUUkVBRF9SU1AsIGV4dF9uZXRyZWFkX3JlcSwgZXh0X25ldHJlYWRfcnNwKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRXUklURT0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX1NFTkRCVUZfUkVRLCBNU0dfQ01EX1NFTkRCVUZfUlNQLCBleHRfc2VuZGJ1Zl9yZXEsIGV4dF9zZW5kYnVmX3JzcCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUQ0xPU0U9IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9ORVRDTE9TRV9SRVEsIE1TR19DTURfTkVUQ0xPU0VfUlNQLCBleHRfbmV0Y2xvc2VfcmVxLCBleHRfbmV0Y2xvc2VfcnNwKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRQSU5HPSIsIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfTkVUUElOR19SRVEsIE1TR19DTURfTkVUUElOR19SU1AsIGV4dF9uZXRwaW5nX3JlcSwgZXh0X25ldHBpbmdfcnNwKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRBQ0NFUFQ9IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9ORVRBQ0NFUFRfUkVRLCBNU0dfQ01EX05FVEFDQ0VQVF9SU1AsIGV4dF9uZXRhY2NlcHRfcmVxLCBleHRfbmV0YWNjZXB0X3JzcCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUQ1JFQVRFPSIsIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfTkVUQ1JFQVRFX1JFUSwgTVNHX0NNRF9ORVRDUkVBVEVfUlNQLCBleHRfbmV0Y3JlYXRlX3JlcSwgZXh0X25ldGNyZWF0ZV9yc3ApOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVFVSQz0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVFVSQ19SRVEsIE1TR19DTURfTkVUVVJDX1JTUCwgZXh0X25ldHVyY19yZXEsIGV4dF9uZXR1cmNfcnNwKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlJUEZJTFRFUj0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX0lQRklMVEVSX1JFUSwgTVNHX0NNRF9JUEZJTFRFUl9SU1AsIGV4dF9pcGZpbHRlcl9yZXEsIGV4dF9pcGZpbHRlcl9yc3ApOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVEFDSz0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVEFDS19SRVEsIE1TR19DTURfTkVUQUNLX1JTUCwgZXh0X25ldGFja19yZXEsIGV4dF9uZXRhY2tfcnNwKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlTT0NLRVRMRUQ9IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9TT0NLRVRMRURfUkVRLCBNU0dfQ01EX1NPQ0tFVExFRF9SU1AsIGV4dF9zb2NrZXRsZWRfcmVxLAlleHRfc29ja2V0bGVkX3JzcCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZVFlQRT8iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX1RZUEVfUkVRLCBNU0dfQ01EX1RZUEVfUlNQLCBleHRfdHlwZV9yZXEsIGV4dF90eXBlX3JzcCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUQUNUPyIsIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfTkVUQUNUX1FVRVJZX1JFUSwgTVNHX0NNRF9ORVRBQ1RfUVVFUllfUlNQLCBleHRfbmV0YWN0X3F1ZXJ5X3JlcSwgZXh0X25ldGFjdF9xdWVyeV9yc3ApOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVFVSQz8iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVFVSQ19RVUVSWV9SRVEsIE1TR19DTURfTkVUVVJDX1FVRVJZX1JTUCwgZXh0X25ldHVyY19xdWVyeV9yZXEsIGV4dF9uZXR1cmNfcXVlcnlfcnNwKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRBQ1Q9PyIsIDAsIDAsIDAsIGV4dF9uZXRhY3RfZXF1YWxfcXVlcnlfcmVxLCBOVUxMKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlJUEZJTFRFUj8iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX0lQRklMVEVSX1FVRVJZX1JFUSwgTVNHX0NNRF9JUEZJTFRFUl9RVUVSWV9SU1AsIGV4dF9pcGZpbHRlcl9xdWVyeV9yZXEsIGV4dF9pcGZpbHRlcl9xdWVyeV9yc3ApOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWUlQRklMVEVSPT8iLCAwLCAwLCAwLCBleHRfaXBmaWx0ZXJfZXF1YWxfcXVlcnlfcnNwLCBOVUxMKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRTUlY/IiwgMCwgMCwgMCwgZXh0X25ldHNydl9xdWVyeV9yc3AsIE5VTEwpOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVFNSVj0/IiwgMCwgMCwgMCwgZXh0X29rX3JzcCwgTlVMTCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUT1BFTj8iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVE9QRU5fUVVFUllfUkVRLCBNU0dfQ01EX05FVE9QRU5fUVVFUllfUlNQLCBleHRfbmV0b3Blbl9xdWVyeV9yZXEsIGV4dF9uZXRvcGVuX3F1ZXJ5X3JzcCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUT1BFTj0/IiwgMCwgMCwgMCwgZXh0X29rX3JzcCwgTlVMTCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUUkVBRD0/IiwgMCwgMCwgMCwgZXh0X29rX3JzcCwgTlVMTCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUV1JJVEU9PyIsIDAsIDAsIDAsIGV4dF9va19yc3AsIE5VTEwpOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVENMT1NFPyIsIDAsIDAsIDAsIGV4dF9va19yc3AsIE5VTEwpOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVENMT1NFPT8iLCAwLCAwLCAwLCBleHRfb2tfcnNwLCBOVUxMKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRBQ0NFUFQ/IiwgMCwgMCwgMCwgZXh0X29rX3JzcCwgTlVMTCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUQUNDRVBUPT8iLCAwLCAwLCAwLCBleHRfb2tfcnNwLCBOVUxMKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRDUkVBVEU/IiwgMCwgMCwgMCwgZXh0X29rX3JzcCwgTlVMTCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUQ1JFQVRFPT8iLCAwLCAwLCAwLCBleHRfb2tfcnNwLCBOVUxMKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jKCJFTlBXUlNBVkU9IiwwLGV4dF9lbnB3cnNhdmVfc2V0X2Z1bmMpOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMoIkVOUFdSU0FWRT8iLDAsZXh0X2VucHdyc2F2ZV9xdWVyeV9mdW5jKTsKKworCQlyZWdpc3Rlcl9mb3JtYXRJbmZvcm1fZnVuYygiK0NTUSIsIGNzcV9mb3JtYXQpOworCQlyZWdpc3Rlcl9mb3JtYXRJbmZvcm1fZnVuYygiK0NSRUciLCB4cmVnX2Zvcm1hdCk7CisJCXJlZ2lzdGVyX2Zvcm1hdEluZm9ybV9mdW5jKCIrQ0dSRUciLCB4cmVnX2Zvcm1hdCk7CisJCXJlZ2lzdGVyX2Zvcm1hdEluZm9ybV9mdW5jKCIrQ0VSRUciLCB4cmVnX2Zvcm1hdCk7CisJCXJlZ2lzdGVyX2Zvcm1hdEluZm9ybV9mdW5jKCIrQ0dBVFQiLCBjZ2F0dF9mb3JtYXQpOworCQlyZWdpc3Rlcl9mb3JtYXRJbmZvcm1fZnVuYygiK0NHU04iLCBjZ3NuX2Zvcm1hdCk7CisJfSBlbHNlIGlmIChnX2N1c3RvbWVyX3R5cGUgPT0gQ1VTVE9NRVJfTkFORElBTikgeworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVEFDVD8iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVEFDVF9RVUVSWV9SRVEsIE1TR19DTURfTkVUQUNUX1FVRVJZX1JTUCwgZXh0X25ldGFjdF9xdWVyeV9yZXEsIGV4dF9uZXRhY3RfcXVlcnlfcnNwKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRBQ1Q9PyIsIDAsIDAsIDAsIGV4dF9uZXRhY3RfZXF1YWxfcXVlcnlfcmVxLCBOVUxMKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlJUEZJTFRFUj0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX0lQRklMVEVSX1JFUSwgTVNHX0NNRF9JUEZJTFRFUl9SU1AsIGV4dF9pcGZpbHRlcl9yZXEsIGV4dF9pcGZpbHRlcl9yc3ApOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWUlQRklMVEVSPyIsIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfSVBGSUxURVJfUVVFUllfUkVRLCBNU0dfQ01EX0lQRklMVEVSX1FVRVJZX1JTUCwgZXh0X2lwZmlsdGVyX3F1ZXJ5X3JlcSwgZXh0X2lwZmlsdGVyX3F1ZXJ5X3JzcCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZSVBGSUxURVI9PyIsIDAsIDAsIDAsIGV4dF9pcGZpbHRlcl9lcXVhbF9xdWVyeV9yc3AsIE5VTEwpOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVFNSVj0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVFNSVl9SRVEsIE1TR19DTURfTkVUU1JWX1JTUCwgZXh0X25ldHNydl9yZXEsCWV4dF9uZXRzcnZfcnNwKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRTUlY/IiwgMCwgMCwgMCwgZXh0X25ldHNydl9xdWVyeV9yc3AsIE5VTEwpOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVFNSVj0/IiwgMCwgMCwgMCwgZXh0X29rX3JzcCwgTlVMTCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUT1BFTj0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVE9QRU5fUkVRLCBNU0dfQ01EX05FVE9QRU5fUlNQLCBleHRfbmV0b3Blbl9yZXEsIGV4dF9uZXRvcGVuX3JzcCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUT1BFTj8iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVE9QRU5fUVVFUllfUkVRLCBNU0dfQ01EX05FVE9QRU5fUVVFUllfUlNQLCBleHRfbmV0b3Blbl9xdWVyeV9yZXEsIGV4dF9uZXRvcGVuX3F1ZXJ5X3JzcCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUT1BFTj0/IiwgMCwgMCwgMCwgZXh0X29rX3JzcCwgTlVMTCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUUkVBRD0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVFJFQURfUkVRLCBNU0dfQ01EX05FVFJFQURfUlNQLCBleHRfbmV0cmVhZF9yZXEsIGV4dF9uZXRyZWFkX3JzcCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUUkVBRD0/IiwgMCwgMCwgMCwgZXh0X29rX3JzcCwgTlVMTCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUV1JJVEU9IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9TRU5EQlVGX1JFUSwgTVNHX0NNRF9TRU5EQlVGX1JTUCwgZXh0X3NlbmRidWZfcmVxLCBleHRfc2VuZGJ1Zl9yc3ApOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVFdSSVRFPT8iLCAwLCAwLCAwLCBleHRfb2tfcnNwLCBOVUxMKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRDTE9TRT0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVENMT1NFX1JFUSwgTVNHX0NNRF9ORVRDTE9TRV9SU1AsIGV4dF9uZXRjbG9zZV9yZXEsIGV4dF9uZXRjbG9zZV9yc3ApOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVENMT1NFPyIsIDAsIDAsIDAsIGV4dF9va19yc3AsIE5VTEwpOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVENMT1NFPT8iLCAwLCAwLCAwLCBleHRfb2tfcnNwLCBOVUxMKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRBQ0s9IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9ORVRBQ0tfUkVRLCBNU0dfQ01EX05FVEFDS19SU1AsIGV4dF9uZXRhY2tfcmVxLCBleHRfbmV0YWNrX3JzcCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTkVUQUNDRVBUPSIsIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfTkVUQUNDRVBUX1JFUSwgTVNHX0NNRF9ORVRBQ0NFUFRfUlNQLCBleHRfbmV0YWNjZXB0X3JlcSwgZXh0X25ldGFjY2VwdF9yc3ApOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVEFDQ0VQVD8iLCAwLCAwLCAwLCBleHRfb2tfcnNwLCBOVUxMKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRBQ0NFUFQ9PyIsIDAsIDAsIDAsIGV4dF9va19yc3AsIE5VTEwpOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJNWU5FVFVSQz0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX05FVFVSQ19SRVEsIE1TR19DTURfTkVUVVJDX1JTUCwgZXh0X25ldHVyY19yZXEsIGV4dF9uZXR1cmNfcnNwKTsKKwkJcmVnaXN0ZXJfc2Vydl9mdW5jMigiTVlORVRVUkM/IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9ORVRVUkNfUVVFUllfUkVRLCBNU0dfQ01EX05FVFVSQ19RVUVSWV9SU1AsIGV4dF9uZXR1cmNfcXVlcnlfcmVxLCBleHRfbmV0dXJjX3F1ZXJ5X3JzcCk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIk1ZTU9ERU0/IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9UWVBFX1JFUSwgTVNHX0NNRF9UWVBFX1JTUCwgZXh0X3R5cGVfcmVxLCBleHRfdHlwZV9yc3ApOworCQlyZWdpc3Rlcl9zZXJ2X2Z1bmMoIkVOUFdSU0FWRT0iLDAsZXh0X2VucHdyc2F2ZV9zZXRfZnVuYyk7CisJCXJlZ2lzdGVyX3NlcnZfZnVuYygiRU5QV1JTQVZFPyIsMCxleHRfZW5wd3JzYXZlX3F1ZXJ5X2Z1bmMpOworCisJCXJlZ2lzdGVyX2Zvcm1hdEluZm9ybV9mdW5jKCIrQ1NRIiwgY3NxX2Zvcm1hdCk7CisJCXJlZ2lzdGVyX2Zvcm1hdEluZm9ybV9mdW5jKCIrQ0dBVFQiLCBjZ2F0dF9mb3JtYXQpOworCQlyZWdpc3Rlcl9mb3JtYXRJbmZvcm1fZnVuYygiK0NHU04iLCBjZ3NuX2Zvcm1hdCk7CisKKwl9CisKKyNpZmRlZiBBVF9RVUVDVEVMCisJcmVnaXN0ZXJfc2Vydl9mdW5jMigiUUlPUEVOPSIsIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfUUlPUEVOX1JFUSwgTVNHX0NNRF9RSU9QRU5fUlNQLCBleHRfcWlvcGVuX3JlcSwJZXh0X3Fpb3Blbl9yc3ApOworCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIlFJQ0xPU0U9IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9RSUNMT1NFX1JFUSwgTVNHX0NNRF9RSUNMT1NFX1JTUCwgZXh0X3FpY2xvc2VfcmVxLCBleHRfcWljbG9zZV9yc3ApOworCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIlFJU1RBVEU9IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9RSVNUQVRFX1JFUSwgTVNHX0NNRF9RSVNUQVRFX1JTUCwgZXh0X3Fpc3RhdGVfcmVxLCBleHRfcWlzdGF0ZV9yc3ApOworCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIlFJU0VORD0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX1FJU0VORF9SRVEsIE1TR19DTURfUUlTRU5EX1JTUCwgZXh0X3Fpc2VuZF9yZXEsIGV4dF9xaXNlbmRfcnNwKTsKKwlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJRSVJEPSIsIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfUUlSRF9SRVEsIE1TR19DTURfUUlSRF9SU1AsIGV4dF9xaXJkX3JlcSwgZXh0X3FpcmRfcnNwKTsKKwlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJRSVNFTkRFWD0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX1FJU0VOREVYX1JFUSwgTVNHX0NNRF9RSVNFTkRFWF9SU1AsIGV4dF9xaXNlbmRleF9yZXEsIGV4dF9xaXNlbmRleF9yc3ApOworCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIlFJU1dUTUQ9IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9RSVNXVE1EX1JFUSwgTVNHX0NNRF9RSVNXVE1EX1JTUCwgZXh0X3Fpc3d0bWRfcmVxLCBleHRfcWlzd3RtZF9yc3ApOworCXJlZ2lzdGVyX3NlcnZfZnVuYzIoIlFJRE5TQ0ZHPSIsIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfUUlETlNDRkdfUkVRLCBNU0dfQ01EX1FJRE5TQ0ZHX1JTUCwgZXh0X3FpZG5zY2ZnX3JlcSwgZXh0X3FpZG5zY2ZnX3JzcCk7CisJcmVnaXN0ZXJfc2Vydl9mdW5jMigiUUlETlNHSVA9IiwgTU9EVUxFX0lEX1NPQ0tFVF9QUk9YWSwgTVNHX0NNRF9RSUROU0dJUF9SRVEsIE1TR19DTURfUUlETlNHSVBfUlNQLCBleHRfcWlkbnNnaXBfcmVxLCBleHRfcWlkbnNnaXBfcnNwKTsKKwlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJRSUdFVEVSUk9SPSIsIE1PRFVMRV9JRF9TT0NLRVRfUFJPWFksIE1TR19DTURfUUlHRVRFUlJPUl9SRVEsIE1TR19DTURfUUlHRVRFUlJPUl9SU1AsIGV4dF9xaWdldGVycm9yX3JlcSwgZXh0X3FpZ2V0ZXJyb3JfcnNwKTsKKwlyZWdpc3Rlcl9zZXJ2X2Z1bmMyKCJRUElORz0iLCBNT0RVTEVfSURfU09DS0VUX1BST1hZLCBNU0dfQ01EX1FQSU5HX1JFUSwgTVNHX0NNRF9RUElOR19SU1AsIGV4dF9xcGluZ19yZXEsIGV4dF9xcGluZ19yc3ApOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCg==