[RFC PATCH 2/5] mpt: Add Smsdid and Smmpt supervisor domain core
Rahul Pathak <[email protected]> Wed, 22 Jul 2026 09:04:51 +0530
| Newsgroups | org.infradead.lists.opensbi |
|---|---|
| Message-ID | <[email protected]> |
SW50cm9kdWNlIHRoZSBzdXBlcnZpc29yZCBvbWFpbiBtZW1vcnktcHJvdGVjdGlvbiAoU21tcHQp IHRhYmxlCm1hbmFnZW1lbnQgY29yZS4gVGhpcyBhZGRzIHRoZSBtb2RlIGFnbm9zdGljIGNvcmUg bGF5ZXIgYW5kIHRoZQpwZXIgbW9kZSB0YWJsZSB3YWxrZXJzL2J1aWxkZXIuCgpBZGQgZGVmaW5l cyBmb3IgdGhlIG1tcHQgQ1NSIGVuY29kaW5nLCBNUFRFIGJpdCBsYXlvdXQsIHBlcm1pc3Npb24g ZmxhZ3MsCnN0cnVjdHVyZXMsIGZlbmNlIGhlbHBlcnMgYW5kIHRoZSBwdWJsaWMgaW50ZXJmYWNl cy4KCkl0IGltcGxlbWVudHMgdGhlIFJWNjQgc3VwcG9ydGVkIG1vZGVzIChTbW1wdDQzLzUyLzY0 KSBhbmQKdGhlIFJWMzIgbW9kZSAoU21tcHQzNCksIGl0cyBNUFQgdGFibGUgc3VwcG9ydC4KCkFs c28gaW1wbGVtZW50cyBtcHQgY29yZSB3aGljaCBpbnRlZ3JhdGVzIFNtbXB0IHdpdGggU0JJIGRv bWFpbnMgYW5kCm90aGVyIGNvcmUgbGF5ZXJzLgoKU2lnbmVkLW9mZi1ieTogUmFodWwgUGF0aGFr IDxyYWh1bC5wYXRoYWtAb3NzLnF1YWxjb21tLmNvbT4KLS0tCiBpbmNsdWRlL3NiaS9zYmlfbXB0 LmggIHwgMzIxICsrKysrKysrKysrKysrKwogbGliL3NiaS9vYmplY3RzLm1rICAgICB8ICAgMiAr CiBsaWIvc2JpL3NiaV9tcHQuYyAgICAgIHwgODgyICsrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysKIGxpYi9zYmkvc2JpX21wdF9tb2RlLmMgfCA4OTEgKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgMjA5NiBpbnNl cnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9zYmkvc2JpX21wdC5oCiBjcmVh dGUgbW9kZSAxMDA2NDQgbGliL3NiaS9zYmlfbXB0LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBsaWIv c2JpL3NiaV9tcHRfbW9kZS5jCgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zYmkvc2JpX21wdC5oIGIv aW5jbHVkZS9zYmkvc2JpX21wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw Li4wZDc2MTg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvc2JpL3NiaV9tcHQuaApAQCAt MCwwICsxLDMyMSBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0yLUNsYXVzZQor ICoKKyAqIENvcHlyaWdodCAoYykgMjAyNiBRdWFsY29tbSBJbmMuCisgKgorICogQXV0aG9yczog UmFodWwgUGF0aGFrIDxyYWh1bC5wYXRoYWtAb3NzLnF1YWxjb21tLmNvbT4KKyAqLworCisjaWZu ZGVmIF9fU0JJX01QVF9IX18KKyNkZWZpbmUgX19TQklfTVBUX0hfXworCisjaW5jbHVkZSA8c2Jp L3NiaV90eXBlcy5oPgorI2luY2x1ZGUgPHNiaS9yaXNjdl9sb2Nrcy5oPgorI2luY2x1ZGUgPHNi aS9zYmlfc2NyYXRjaC5oPgorI2luY2x1ZGUgPHNiaS9zYmlfYml0bWFwLmg+CisjaW5jbHVkZSA8 c2JpL3Jpc2N2X2FzbS5oPgorCitzdHJ1Y3Qgc2JpX2RvbWFpbjsKK3N0cnVjdCBzYmlfbXB0X2Rv bWFpbjsKK3N0cnVjdCBzYmlfbXB0X2N0cmw7CitzdHJ1Y3Qgc2JpX2RvbWFpbl9tZW1yZWdpb247 CisKKy8qIENTUiBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU0JJX0NTUl9NTVBUCQkweDM4MgorI2Rl ZmluZSBTQklfQ1NSX01TRENGRwkJMHg3NEUKKworLyogbW1wdCByZWdpc3RlciBmaWVsZCBkZWZp bml0aW9ucyAqLworI2lmIF9fcmlzY3ZfeGxlbiA9PSA2NAorIyBkZWZpbmUgU0JJX01NUFRfTU9E RV9TSElGVAk2MFVMCisjIGRlZmluZSBTQklfTU1QVF9NT0RFX01BU0sJKFVMKDB4RikgPDwgU0JJ X01NUFRfTU9ERV9TSElGVCkKKyMgZGVmaW5lIFNCSV9NTVBUX1NESURfU0hJRlQJNTJVTAorIyBk ZWZpbmUgU0JJX01NUFRfU0RJRF9NQVNLCShVTCgweDNGKSA8PCBTQklfTU1QVF9TRElEX1NISUZU KQorIyBkZWZpbmUgU0JJX01NUFRfUFBOX01BU0sJVUwoMHgwMDAwMEZGRkZGRkZGRkZGKQorI2Vs c2UKKyMgZGVmaW5lIFNCSV9NTVBUX01PREVfU0hJRlQJVUwoMzApCisjIGRlZmluZSBTQklfTU1Q VF9NT0RFX01BU0sJKFVMKDB4MykgPDwgU0JJX01NUFRfTU9ERV9TSElGVCkKKyMgZGVmaW5lIFNC SV9NTVBUX1NESURfU0hJRlQJVUwoMjIpCisjIGRlZmluZSBTQklfTU1QVF9TRElEX01BU0sJKFVM KDB4M0YpIDw8IFNCSV9NTVBUX1NESURfU0hJRlQpCisjIGRlZmluZSBTQklfTU1QVF9QUE5fTUFT SwlVTCgweDNGRkZGRikKKyNlbmRpZgorCisjZGVmaW5lIFNCSV9NTVBUX01PREVfQkFSRQkwVUwK KyNpZiBfX3Jpc2N2X3hsZW4gPT0gNjQKKyMgZGVmaW5lIFNCSV9NTVBUX01PREVfU01NUFQ0Mwkx VUwKKyMgZGVmaW5lIFNCSV9NTVBUX01PREVfU01NUFQ1MgkyVUwKKyMgZGVmaW5lIFNCSV9NTVBU X01PREVfU01NUFQ2NAkzVUwKKyNlbHNlCisjIGRlZmluZSBTQklfTU1QVF9NT0RFX1NNTVBUMzQJ MVVMCisjZW5kaWYKKworLyoKKyAqIHNiaV9tbXB0X2VuY29kZSgpIOKAlCBhc3NlbWJsZSB0aGUg ZnVsbCBtbXB0IENTUiB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNi aV9tbXB0X2VuY29kZSh1MzIgbW9kZSwgdTMyIHNkaWQsCisJCQkJCSAgICB1bnNpZ25lZCBsb25n IHBwbikKK3sKKwlyZXR1cm4gKCgodW5zaWduZWQgbG9uZyltb2RlIDw8IFNCSV9NTVBUX01PREVf U0hJRlQpICYgU0JJX01NUFRfTU9ERV9NQVNLKSB8CisJICAgICAgICgoKHVuc2lnbmVkIGxvbmcp c2RpZCA8PCBTQklfTU1QVF9TRElEX1NISUZUKSAmIFNCSV9NTVBUX1NESURfTUFTSykgfAorCSAg ICAgICAocHBuICYgU0JJX01NUFRfUFBOX01BU0spOworfQorCisvKgorICogTVBURSBiaXQgZGVm aW5pdGlvbnMKKyAqLworI2RlZmluZSBTQklfTVBURV9WCQkoMVVMIDw8IDApCisjZGVmaW5lIFNC SV9NUFRFX0wJCSgxVUwgPDwgMSkKKyNkZWZpbmUgU0JJX01QVEVfTgkJKDFVTCA8PCAyKQorI2Rl ZmluZSBTQklfTVBURV9QUE5fU0hJRlQJMTBVCisjZGVmaW5lIFNCSV9NUFRfUEFHRV9TSElGVAkx MlUKKyNkZWZpbmUgU0JJX01QVF9QQUdFX1NJWkUJNDA5NlVMCisjZGVmaW5lIFNCSV9NUFRfUEFH RV9NQVNLCShTQklfTVBUX1BBR0VfU0laRSAtIDFVTCkKKyNkZWZpbmUgU0JJX01QVEVfWFdSX0JB U0UJOFUKKyNkZWZpbmUgU0JJX01QVEVfWFdSX1dJRFRICTNVCisjZGVmaW5lIFNCSV9NUFRFX1hX Ul9NQVNLCTdVTAorCitzdGF0aWMgaW5saW5lIHUzMiBzYmlfbXB0ZV94d3Jfc2hpZnQodTMyIG4p Cit7CisJcmV0dXJuIChTQklfTVBURV9YV1JfQkFTRSArIG4gKiBTQklfTVBURV9YV1JfV0lEVEgp OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2JpX21wdGVfbGVhZl9zZXRfeHdy KHVuc2lnbmVkIGxvbmcgbXB0ZSwKKwkJCQkJCSAgICB1MzIgbiwgdTggeHdyKQoreworCXUzMiBz aCA9IHNiaV9tcHRlX3h3cl9zaGlmdChuKTsKKworCW1wdGUgJj0gfihTQklfTVBURV9YV1JfTUFT SyA8PCBzaCk7CisJbXB0ZSB8PSAoeHdyICYgU0JJX01QVEVfWFdSX01BU0spIDw8IHNoOworCXJl dHVybiBtcHRlOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgc2JpX21wdGVfbm9u bGVhZih1bnNpZ25lZCBsb25nIHRhYmxlX3BhKQoreworCXJldHVybiAoKCh0YWJsZV9wYSA+PiBT QklfTVBUX1BBR0VfU0hJRlQpIDw8IFNCSV9NUFRFX1BQTl9TSElGVCkKKwkgICAgICAgfCBTQklf TVBURV9WKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHNiaV9tcHRlX25vbmxl YWZfdGFibGVfcGEodW5zaWduZWQgbG9uZyBtcHRlKQoreworCXJldHVybiAoKG1wdGUgPj4gU0JJ X01QVEVfUFBOX1NISUZUKSA8PCBTQklfTVBUX1BBR0VfU0hJRlQpOworfQorCisvKgorICogWFdS IHBlcm1pc3Npb24gY29uc3RhbnRzIChYV1I9MDAwIG1lYW5zIG5vIGFjY2VzcykKKyAqLworI2Rl ZmluZSBTQklfTVBUX1BFUk1fTk9ORQkwVQorI2RlZmluZSBTQklfTVBUX1BFUk1fUgkJMVUKKyNk ZWZpbmUgU0JJX01QVF9QRVJNX1cJCTJVCisjZGVmaW5lIFNCSV9NUFRfUEVSTV9YCQk0VQorI2Rl ZmluZSBTQklfTVBUX1BFUk1fUlcJCShTQklfTVBUX1BFUk1fUiB8IFNCSV9NUFRfUEVSTV9XKQor I2RlZmluZSBTQklfTVBUX1BFUk1fUlgJCShTQklfTVBUX1BFUk1fUiB8IFNCSV9NUFRfUEVSTV9Y KQorI2RlZmluZSBTQklfTVBUX1BFUk1fUldYCShTQklfTVBUX1BFUk1fUiB8IFNCSV9NUFRfUEVS TV9XIHwgU0JJX01QVF9QRVJNX1gpCisKKy8qCisgKiBTRElEIGNvbnN0YW50cworICovCisjZGVm aW5lIFNCSV9NUFRfU0RJRE1BWAkJNlUKKyNkZWZpbmUgU0JJX01QVF9NQVhfRE9NQUlOUwkoMVVM IDw8IFNCSV9NUFRfU0RJRE1BWCkKKyNkZWZpbmUgU0JJX01QVF9TRElEX0lOVkFMSUQJU0JJX01Q VF9NQVhfRE9NQUlOUworCisvKgorICogU0JJX01QVF9NQVhfUkVHSU9OU19ET01BSU46IE51bWJl ciBvZiByZWdpb25zIGEgZG9tYWluIG1heSBoYXZlCisgKiBVc2VkIGZvciB0cmFja2luZyBvZiBy ZWdpb25zCisgKi8KKyNkZWZpbmUgU0JJX01QVF9NQVhfUkVHSU9OU19ET01BSU4gIDMyVQorCisv KgorICogU01TRElEIG1mZW5jZSBhbmQgbWludmFsIHJhdyBlbmNvZGluZ3MKKyAqCisgKiBSLXR5 cGUsIG9wY29kZT1TWVNURU0oMHg3MyksIGZ1bmN0Mz0wLCByZD14MCwgcnMxPVBBRERSLCByczI9 U0RJRAorICogbWZlbmNlLnBhIGZ1bmN0Nz0weDE5IC0+IDB4MzIwMDAwNzMgd2hlcmUgcnMxPXJz Mj14MAorICogbWludmFsLnBhIGZ1bmN0Nz0weDFiIC0+IDB4MzYwMDAwNzMgd2hlcmUgcnMxPXJz Mj14MAorICoKKyAqIC5pbnNuIHIgb3Bjb2RlLCBmdW5jMywgZnVuYzcsIHJkLCByczEsIHJzMgor ICovCisjZGVmaW5lIFNCSV9NUFRfTUZFTkNFX1BBKHJzMSwgcnMyKQkiLmluc24gciAweDczLCAw LCAweDE5LCB4MCwgIiByczEgIiwgIiByczIKKworI2RlZmluZSBTQklfTVBUX01JTlZBTF9QQShy czEsIHJzMikJIi5pbnNuIHIgMHg3MywgMCwgMHgxYiwgeDAsICIgcnMxICIsICIgcnMyCisKKy8q CisgKiBGZW5jZSBhbmQgaW52YWxpZGF0aW9uIGhlbHBlcnMKKyAqLworc3RhdGljIGlubGluZSB2 b2lkIHNiaV9tcHRfZmVuY2VfYWxsKHZvaWQpCit7CisJX19hc21fXyB2b2xhdGlsZShTQklfTVBU X01GRU5DRV9QQSgieDAiLCAieDAiKSA6OjogIm1lbW9yeSIpOworfQorCitzdGF0aWMgaW5saW5l IHZvaWQgc2JpX21wdF9mZW5jZV9zZGlkKHUzMiBzZGlkKQoreworCXVuc2lnbmVkIGxvbmcgcyA9 ICh1bnNpZ25lZCBsb25nKXNkaWQgJiAoU0JJX01QVF9NQVhfRE9NQUlOUyAtIFVMKDEpKTsKKwor CV9fYXNtX18gdm9sYXRpbGUoU0JJX01QVF9NRkVOQ0VfUEEoIngwIiwgIiUwIikgOjogInIiKHMp IDogIm1lbW9yeSIpOworfQorCisvKgorICogcnMxPXBhZGRyIGFuZCByczI9eDAKKyAqLworc3Rh dGljIGlubGluZSB2b2lkIHNiaV9tcHRfbWZlbmNlX2FkZHIodW5zaWduZWQgbG9uZyBwYWRkcikK K3sKKwlfX2FzbV9fIHZvbGF0aWxlKFNCSV9NUFRfTUZFTkNFX1BBKCIlMCIsICJ4MCIpIDo6ICJy IihwYWRkcikgOiAibWVtb3J5Iik7Cit9CisKKy8qCisgKiByczE9cGFkZHIgYW5kIHJzMj1zZGlk CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzYmlfbXB0X21mZW5jZV9wYSh1bnNpZ25lZCBsb25n IHBhZGRyLCB1MzIgc2RpZCkKK3sKKwl1bnNpZ25lZCBsb25nIHMgPSAodW5zaWduZWQgbG9uZylz ZGlkICYgKFNCSV9NUFRfTUFYX0RPTUFJTlMgLSBVTCgxKSk7CisKKwlfX2FzbV9fIHZvbGF0aWxl KFNCSV9NUFRfTUZFTkNFX1BBKCIlMCIsICIlMSIpCisJCQkgOjogInIiKHBhZGRyKSwgInIiKHMp IDogIm1lbW9yeSIpOworfQorCisvKgorICogcnMxPTAgYW5kIHJzMj0wCisgKi8KK3N0YXRpYyBp bmxpbmUgdm9pZCBzYmlfbXB0X21pbnZhbF9hbGwodm9pZCkKK3sKKwkvKiBQcmlvciBzdG9yZXMg Z2xvYmFsbHkgdmlzaWJsZSBiZWZvcmUgaW52YWxpZGF0aW9uICovCisJX19hc21fXyB2b2xhdGls ZSgic2ZlbmNlLncuaW52YWwiIDo6OiAibWVtb3J5Iik7CisJX19hc21fXyB2b2xhdGlsZShTQklf TVBUX01JTlZBTF9QQSgieDAiLCAieDAiKSA6OjogIm1lbW9yeSIpOworCS8qIEludmFsaWRhdGlv biBjb21wbGV0ZXMgYmVmb3JlIHN1YnNlcXVlbnQgaW1wbGljaXQgYWNjZXNzZXMgKi8KKwlfX2Fz bV9fIHZvbGF0aWxlKCJzZmVuY2UuaW52YWwuaXIiIDo6OiAibWVtb3J5Iik7Cit9CisKKy8qCisg KiByczE9cGFkZHIgYW5kIHJzMj1zZGlkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzYmlfbXB0 X21pbnZhbF9zZGlkKHVuc2lnbmVkIGxvbmcgcGEsIHUzMiBzZGlkKQoreworCXVuc2lnbmVkIGxv bmcgcyA9ICh1bnNpZ25lZCBsb25nKXNkaWQgJiAoU0JJX01QVF9NQVhfRE9NQUlOUyAtIFVMKDEp KTsKKworCV9fYXNtX18gdm9sYXRpbGUoInNmZW5jZS53LmludmFsIiA6OjogIm1lbW9yeSIpOwor CV9fYXNtX18gdm9sYXRpbGUoU0JJX01QVF9NSU5WQUxfUEEoIiUwIiwgIiUxIikKKwkJCSA6OiAi ciIocGEpLCAiciIocykgOiAibWVtb3J5Iik7CisJX19hc21fXyB2b2xhdGlsZSgic2ZlbmNlLmlu dmFsLmlyIiA6OjogIm1lbW9yeSIpOworfQorCisvKgorICogQ29yZSBkYXRhIHN0cnVjdHVyZXMK KyAqLworc3RydWN0IHNiaV9tcHRfcmVnaW9uIHsKKwl1bnNpZ25lZCBsb25nCXBhOworCXVuc2ln bmVkIGxvbmcJc2l6ZTsKKwl1OAkJeHdyOworCS8qIHJlZ2lvbiBpcyBsb2NrZWQgYW5kIGRlbnkg bW9kaWZpY2F0aW9uIHZpYSBhZGQvcmVtb3ZlX3JlZ2lvbiAqLworCWJvb2wJCWxvY2tlZDsKKwkv KiBtYXBwZWQgaW50byBtb3JlIHRoYW4gb25lIGRvbWFpbiAqLworCWJvb2wJCXNoYXJlZDsKK307 CisKKy8qCisgKiBzdHJ1Y3Qgc2JpX21wdF9tb2RlIOKAlCBTTU1QVCBtb2RlIGRlc2NyaXB0aW9u LgorICovCitzdHJ1Y3Qgc2JpX21wdF9tb2RlIHsKKwljb25zdCBjaGFyCSpuYW1lOworCXUzMgkJ bW9kZV92YWw7CisJdW5zaWduZWQgbG9uZwkoKmVuY29kZV9tbXB0KSh1bnNpZ25lZCBsb25nIHBw biwgdTMyIHNkaWQpOworCS8qIG1hcCBhIHJhbmdlIGluIE1QVCB0YWJsZSAqLworCWludAkJKCpt YXBfcmFuZ2UpKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJdW5zaWduZWQgbG9uZyBw YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCB4d3IpOworCS8qIG51bWJlciBieXRlcyBmb3Igcm9v dCB0YWJsZSBhbGxvY2F0aW9uICovCisJdW5zaWduZWQgbG9uZwkoKnJvb3RfdGFibGVfc2l6ZSko dm9pZCk7CisJLyogcmVxdWlyZWQgcm9vdCB0YWJsZSBwaHlzaWNhbCBhZGRyZXNzIGFsaWdubWVu dCAqLworCXVuc2lnbmVkIGxvbmcJKCpyb290X3RhYmxlX2FsaWduKSh2b2lkKTsKKwkvKiBjaGVj ayBpZiBbcGEscGErc2l6ZV0gZml0cyBpbiBzbW1wdCBtb2RlIHN1cHBvcnRlZCBhZGRyZXNzIHNw YWNlICovCisJYm9vbAkJKCpwYV9pbl9yYW5nZSkodW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQg bG9uZyBzaXplKTsKKwlpbnQJCSgqbWFwX2Z1bGxfcmFuZ2UpKHN0cnVjdCBzYmlfbXB0X2RvbWFp biAqZG9tLCB1OCB4d3IpOworfTsKKworc3RydWN0IHNiaV9tcHRfZG9tYWluIHsKKwl1MzIJCQlz ZGlkOworCWJvb2wJCQl2YWxpZDsKKwl1bnNpZ25lZCBsb25nCQlyb290X3BhOworCXN0cnVjdCBz YmlfbXB0X21vZGUJKm1vZGU7CisJc3RydWN0IHNiaV9kb21haW4JKnNiaV9kb207CisJdW5zaWdu ZWQgaW50CQlucmVnaW9uczsKKwlzdHJ1Y3Qgc2JpX21wdF9yZWdpb24JcmVnaW9uc1tTQklfTVBU X01BWF9SRUdJT05TX0RPTUFJTl07CisJc3BpbmxvY2tfdAkJbG9jazsKK307CisKKy8qCisgKiBz dHJ1Y3Qgc2JpX21wdF9jdHJsIOKAlCBSRFNNIE1QVCBzdGF0ZQorICovCitzdHJ1Y3Qgc2JpX21w dF9jdHJsIHsKKwlib29sCQkJcmVhZHk7CisJc3RydWN0IHNiaV9tcHRfbW9kZQkqbW9kZTsKKwkv KiBkZXRlY3RlZCBzZGlkbGVuIGZyb20gbW1wdCBwcm9iZSAqLworCXUzMgkJCXNkaWRfbGVuOwor CS8qIDJec2RpZF9sZW4g4oCUIHJ1bnRpbWUgbGltaXQgZm9yIGFsbCBkb21haW4gb3BlcmF0aW9u cyAqLworCXUzMgkJCW1heF9kb21haW5zOworCXVuc2lnbmVkIGxvbmcJCWZ3X3BhOworCXVuc2ln bmVkIGxvbmcJCWZ3X3NpemU7CisJc3RydWN0IHNiaV9tcHRfZG9tYWluCWRvbWFpbnNbU0JJX01Q VF9NQVhfRE9NQUlOU107CisJdTMyCQkJbmRvbWFpbjsKKwkvKiBzZGlkIG9mZnNldCBpbiBzY3Jh dGNoICovCisJdW5zaWduZWQgbG9uZwkJc2RpZF9vZmZzZXQ7CisJLyogYml0bWFwIHRvIHRyYWNr IGFzc2lnbmVkL2ZyZWUgU0RJRCAoYml0IE4gc2V0ID0gU0RJRCBOIGZyZWUpICovCisJREVDTEFS RV9CSVRNQVAoc2RpZF9iaXRtYXAsIFNCSV9NUFRfTUFYX0RPTUFJTlMpOworfTsKKworc3RydWN0 IHNiaV9tcHRfY3RybCAqc2JpX21wdF9jdHJsX2dldCh2b2lkKTsKKworc3RhdGljIGlubGluZSB1 MzIgc2JpX21wdF90aGlzaGFydF9zZGlkKHZvaWQpCit7CisJc3RydWN0IHNiaV9tcHRfY3RybCAq Y3RybCA9IHNiaV9tcHRfY3RybF9nZXQoKTsKKwl1MzIgKnA7CisKKwlpZiAoIWN0cmwtPnJlYWR5 IHx8ICFjdHJsLT5zZGlkX29mZnNldCkKKwkJcmV0dXJuICh1MzIpU0JJX01QVF9TRElEX0lOVkFM SUQ7CisJcCA9IHNiaV9zY3JhdGNoX29mZnNldF9wdHIoc2JpX3NjcmF0Y2hfdGhpc2hhcnRfcHRy KCksCisJCQkJICAgY3RybC0+c2RpZF9vZmZzZXQpOworCXJldHVybiAqcDsKK30KKworLyoKKyAq IERvbWFpbiBjcmVhdGlvbiBjb25maWcKKyAqCisgKiBzYmlfZG9tIGFuZCByZWdpb25zIGFyZSBt dXR1YWxseSBleGNsdXNpdmUuCisgKiB3aGVuIGEgc3VwZXJ2aXNvciBkb21haW4gaXMgYmFja2Vk IGJ5IGEgU0JJIGRvbWFpbgorICogdGhlbiB0aGUgcmVnaW9ucyBsaXN0IGFuZCBhY2Nlc3MgcGVy bWlzc2lvbnMgYXJlIGRlcml2ZWQKKyAqIGZyb20gdGhlIFNCSSBkb21haW4gc3RydWN0dXJlcy4K KyAqLworc3RydWN0IHNiaV9tcHRfZG9tYWluX2NvbmZpZyB7CisJLyogU0JJIGRvbWFpbiB3aG9z ZSBTL1UgbWVtcmVnaW9ucyBhcmUgbWFwcGVkLiAqLworCXN0cnVjdCBzYmlfZG9tYWluCSpzYmlf ZG9tOworCS8qIHBlcm1pc3Npb24gZm9yIHJlZ2lvbnMgaW5oZXJpdGVkIGZyb20gc2JpX2RvbSAq LworCXU4CQkJeHdyOworCS8qIHByb3RlY3QgZmlybXdhcmUgcmVnaW9ucyBmb3IgdGhlIGRvbWFp biAqLworCWJvb2wJCQlmd19wcm90ZWN0OworCS8qCisJICogZXhwbGljaXQgcmVnaW9uIGxpc3Qg bWFwcGVkIGluIE1QVCB0YWJsZS4KKwkgKiBOVUxMIHdoZW4gc2JpX2RvbSBjb3ZlcnMgZXZlcnl0 aGluZworCSAqLworCXN0cnVjdCBzYmlfbXB0X3JlZ2lvbgkqcmVnaW9uczsKKwl1MzIJCQlucmVn aW9uczsKK307CisKK2ludCBzYmlfbXB0X2luaXQodm9pZCk7CisKK2ludCBzYmlfbXB0X2RvbWFp bl9jcmVhdGUoY29uc3Qgc3RydWN0IHNiaV9tcHRfZG9tYWluX2NvbmZpZyAqY2ZnLCB1MzIgKm91 dF9zZGlkKTsKKworaW50IHNiaV9tcHRfZG9tYWluX2FkZF9yZWdpb24odTMyIHNkaWQsIHVuc2ln bmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdTggeHdyKTsKKworaW50IHNiaV9tcHRf ZG9tYWluX3JlbW92ZV9yZWdpb24odTMyIHNkaWQsIHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVk IGxvbmcgc2l6ZSk7CisKK2ludCBzYmlfbXB0X3NoYXJlX3JlZ2lvbih1MzIgc3JjX3NkaWQsIHUz MiBkc3Rfc2RpZCwgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLCB1OCBkc3Rf eHdyKTsKKworaW50IHNiaV9tcHRfdW5zaGFyZV9yZWdpb24odTMyIHNkaWQsIHVuc2lnbmVkIGxv bmcgcGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKK2ludCBzYmlfbXB0X2hhcnRfYWN0aXZhdGUo dTMyIHNkaWQpOworCitpbnQgc2JpX21wdF9oYXJ0X2FjdGl2YXRlX2Zvcl9kb21haW4oc3RydWN0 IHNiaV9kb21haW4gKnNiaV9kb20pOworCitzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKnNiaV9tcHRf ZG9tYWluX2dldCh1MzIgc2RpZCk7CisKK3Vuc2lnbmVkIGxvbmcgc2JpX21wdF9wb29sX2FsbG9j KHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBhbGlnbik7CisKK3ZvaWQgc2JpX21w dF9zZGlkX2ZyZWUodTMyIHNkaWQpOworCit2b2lkIHNiaV9tcHRfZHVtcCh2b2lkKTsKKworI2Vu ZGlmIC8qIF9fU0JJX01QVF9IX18gKi8KZGlmZiAtLWdpdCBhL2xpYi9zYmkvb2JqZWN0cy5tayBi L2xpYi9zYmkvb2JqZWN0cy5tawppbmRleCBjMjljODg4Zi4uM2IzYzNlYTMgMTAwNjQ0Ci0tLSBh L2xpYi9zYmkvb2JqZWN0cy5taworKysgYi9saWIvc2JpL29iamVjdHMubWsKQEAgLTEwOCwzICsx MDgsNSBAQCBsaWJzYmktb2Jqcy15ICs9IHNiaV9leHBlY3RlZF90cmFwLm8KIGxpYnNiaS1vYmpz LXkgKz0gc2JpX2NwcGMubwogbGlic2JpLW9ianMtJChDQ19TVVBQT1JUX1ZFQ1RPUikgKz0gc2Jp X3ZlY3Rvci5vCiBsaWJzYmktb2Jqcy15ICs9IHNiaV9mcC5vCitsaWJzYmktb2Jqcy15ICs9IHNi aV9tcHQubworbGlic2JpLW9ianMteSArPSBzYmlfbXB0X21vZGUubwpkaWZmIC0tZ2l0IGEvbGli L3NiaS9zYmlfbXB0LmMgYi9saWIvc2JpL3NiaV9tcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMC4uNjAxZmRlYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvc2JpL3NiaV9t cHQuYwpAQCAtMCwwICsxLDg4MiBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0y LUNsYXVzZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAyNiBRdWFsY29tbSBJbmMuCisgKgorICog QXV0aG9yczogUmFodWwgUGF0aGFrIDxyYWh1bC5wYXRoYWtAb3NzLnF1YWxjb21tLmNvbT4KKyAq LworCisjaW5jbHVkZSA8c2JpL3NiaV9tcHQuaD4KKyNpbmNsdWRlIDxzYmkvc2JpX2RvbWFpbi5o PgorI2luY2x1ZGUgPHNiaS9zYmlfZXJyb3IuaD4KKyNpbmNsdWRlIDxzYmkvc2JpX2hhcnQuaD4K KyNpbmNsdWRlIDxzYmkvc2JpX2hlYXAuaD4KKyNpbmNsdWRlIDxzYmkvc2JpX3NjcmF0Y2guaD4K KyNpbmNsdWRlIDxzYmkvc2JpX3N0cmluZy5oPgorI2luY2x1ZGUgPHNiaS9zYmlfY29uc29sZS5o PgorI2luY2x1ZGUgPHNiaS9yaXNjdl9sb2Nrcy5oPgorI2luY2x1ZGUgPHNiaS9yaXNjdl9hc20u aD4KKworc3RhdGljIHN0cnVjdCBzYmlfbXB0X2N0cmwgbXB0X2N0cmw7CisKK3N0cnVjdCBzYmlf bXB0X2N0cmwgKnNiaV9tcHRfY3RybF9nZXQodm9pZCkKK3sKKwlyZXR1cm4gJm1wdF9jdHJsOwor fQorCitzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKnNiaV9tcHRfZG9tYWluX2dldCh1MzIgc2RpZCkK K3sKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKnNkOworCisJaWYgKHNkaWQgPj0gbXB0X2N0cmwu bWF4X2RvbWFpbnMpCisJCXJldHVybiBOVUxMOworCisJc2QgPSBtcHRfY3RybC5kb21haW5zW3Nk aWRdLnZhbGlkID8gJm1wdF9jdHJsLmRvbWFpbnNbc2RpZF0gOiBOVUxMOworCisJcmV0dXJuIHNk OworfQorCisvKiBNZW1vcnkgYWxsb2NhdG9yIGZvciBNUFQgdGFibGVzIGZyb20gaGVhcCAqLwor dW5zaWduZWQgbG9uZyBzYmlfbXB0X3Bvb2xfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplLCB1bnNp Z25lZCBsb25nIGFsaWduKQoreworCXVuc2lnbmVkIGxvbmcgcHRyID0gKHVuc2lnbmVkIGxvbmcp c2JpX2FsaWduZWRfYWxsb2MoYWxpZ24sIHNpemUpOworCisJaWYgKCFwdHIpIHsKKwkJc2JpX3By aW50Zigic2JpX21wdDogYWxsb2MgZmFpbGVkIChzaXplPTB4JWx4IGFsaWduPTB4JWx4KVxuIiwK KwkJCSAgIHNpemUsIGFsaWduKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTVBUIHRhYmxlcyBt dXN0IGJlIHplcm9lZCB0byBtYXJrIHRoZW0gaW52YWxpZCAobXB0ZS5WID0gMCkgKi8KKwlzYmlf bWVtc2V0KCh2b2lkICopcHRyLCAwLCBzaXplKTsKKworCXJldHVybiBwdHI7Cit9CisKKy8qIENo ZWNrIGlmIHR3byByZWdpb25zIG92ZXJsYXAgKi8KK3N0YXRpYyBib29sIHJlZ2lvbnNfb3Zlcmxh cCh1bnNpZ25lZCBsb25nIHBhMSwgdW5zaWduZWQgbG9uZyBzaXplMSwKKwkJCSAgIHVuc2lnbmVk IGxvbmcgcGEyLCB1bnNpZ25lZCBsb25nIHNpemUyKQoreworCXJldHVybiAocGExIDwgcGEyICsg c2l6ZTIpICYmIChwYTIgPCBwYTEgKyBzaXplMSk7Cit9CisKKy8qIENoZWNrIGlmIGEgcmVnaW9u IGlzIGNvbXBsZXRlbHkgY29udGFpbmVkIGluc2lkZSBhbm90aGVyIHJlZ2lvbiAqLworc3RhdGlj IGJvb2wgcmVnaW9uX2NvbnRhaW5lZCh1bnNpZ25lZCBsb25nIGNoaWxkX3BhLCB1bnNpZ25lZCBs b25nIGNoaWxkX3NpemUsCisJCQkgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfcGEsIHVuc2lnbmVk IGxvbmcgcGFyZW50X3NpemUpCit7CisJcmV0dXJuIChjaGlsZF9wYSA+PSBwYXJlbnRfcGEpICYm CisJICAgICAgIChjaGlsZF9wYSArIGNoaWxkX3NpemUgPD0gcGFyZW50X3BhICsgcGFyZW50X3Np emUpOworfQorCisvKgorICogQ2hlY2sgaWYgYSByZWdpb24gW3BhLCBwYStzaXplXSBvdmVybGFw cyB3aXRoIGFueSBtYXBwZWQKKyAqIHJlZ2lvbiB3aGljaCBpcyBsb2NrZWQKKyAqLworc3RhdGlj IGJvb2wgcmVnaW9uX292ZXJsYXBzX2xvY2tlZChjb25zdCBzdHJ1Y3Qgc2JpX21wdF9kb21haW4g KmRvbSwKKwkJCSAgICB1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJ dW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZG9tLT5ucmVnaW9uczsgaSsrKQor CQlpZiAoZG9tLT5yZWdpb25zW2ldLmxvY2tlZCAmJgorCQkgICAgcmVnaW9uc19vdmVybGFwKHBh LCBzaXplLCBkb20tPnJlZ2lvbnNbaV0ucGEsIGRvbS0+cmVnaW9uc1tpXS5zaXplKSkKKwkJCXJl dHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyogUHJvYmUgU0RJRExFTiBmcm9tIE1N UFQgQ1NSICovCitzdGF0aWMgdTMyIHByb2JlX3NkaWRsZW4odm9pZCkKK3sKKwl1bnNpZ25lZCBs b25nIG1tcHRfdmFsLCBzZGlkX3ZhbDsKKwl1MzIgc2RpZGxlbiA9IDA7CisKKwltbXB0X3ZhbCA9 IGNzcl9yZWFkKFNCSV9DU1JfTU1QVCk7CisKKwkvKiBXcml0ZSBhbGwtb25lcyBpbnRvIFNESUQg ZmllbGQgKi8KKwltbXB0X3ZhbCB8PSBTQklfTU1QVF9TRElEX01BU0s7CisJY3NyX3dyaXRlKFNC SV9DU1JfTU1QVCwgU0JJX01NUFRfU0RJRF9NQVNLKTsKKworCXNkaWRfdmFsID0gKGNzcl9yZWFk KFNCSV9DU1JfTU1QVCkgJiBTQklfTU1QVF9TRElEX01BU0spID4+IFNCSV9NTVBUX1NESURfU0hJ RlQ7CisKKwlpZiAoc2RpZF92YWwpIHsKKwkJc2RpZGxlbiA9IDA7CisJCXdoaWxlIChzZGlkX3Zh bCkgeworCQkJc2RpZGxlbis9MTsKKwkJCXNkaWRfdmFsID4+PSAxOworCQl9CisKKwkJaWYgKHNk aWRsZW4gPiBTQklfTVBUX1NESURNQVgpCisJCQlzZGlkbGVuID0gU0JJX01QVF9TRElETUFYOwor CX0KKworCWNzcl93cml0ZShTQklfQ1NSX01NUFQsIG1tcHRfdmFsKTsKKworCXJldHVybiBzZGlk bGVuOworfQorCisjaWYgX19yaXNjdl94bGVuID09IDY0CitleHRlcm4gc3RydWN0IHNiaV9tcHRf bW9kZSBzbW1wdDQzX21vZGU7CitleHRlcm4gc3RydWN0IHNiaV9tcHRfbW9kZSBzbW1wdDUyX21v ZGU7CitleHRlcm4gc3RydWN0IHNiaV9tcHRfbW9kZSBzbW1wdDY0X21vZGU7CisjZWxzZQorZXh0 ZXJuIHN0cnVjdCBzYmlfbXB0X21vZGUgc21tcHQzNF9tb2RlOworI2VuZGlmCisKK3N0YXRpYyBi b29sIHByb2JlX21vZGUodTMyIG1vZGVfdmFsKQoreworCXUzMiBtOworCWNzcl93cml0ZShTQklf Q1NSX01NUFQsCisJCSAgKCh1bnNpZ25lZCBsb25nKW1vZGVfdmFsIDw8IFNCSV9NTVBUX01PREVf U0hJRlQpICYgU0JJX01NUFRfTU9ERV9NQVNLKTsKKworCW0gPSAoY3NyX3JlYWQoU0JJX0NTUl9N TVBUKSAmIFNCSV9NTVBUX01PREVfTUFTSykgPj4gU0JJX01NUFRfTU9ERV9TSElGVDsKKworCXJl dHVybiAobSA9PSBtb2RlX3ZhbCk7Cit9CisKKworLyoKKyAqIFByb2JlIFNNTVBUIG1vZGUgYW5k IGluaXRpYWxpemUgdGhlIHJlbGF0ZWQgbW9kZSBvcHMKKyAqCisgKiBEZWxpYmVyYXRlbHkgcHJl ZmVyIGNvdmVyYWdlIG92ZXIgbGF0ZW5jeSwgYmVjYXVzZSBsYXRlbmN5IGNhbiBiZQorICogaW1w cm92ZWQgYnkgdGhlIE1QVCBjYWNoZSB3aGljaCBoYXJkd2FyZSBtYXkgaW1wbGVtZW50IGJ1dCB0 aGUKKyAqIGNvdmVyYWdlIGlzIG5vdC4gU28gcGljayB0aGUgd2lkZXN0IG1vZGUgd2hpY2ggaXMg c3VwcG9ydGVkIGJ5IHRoZQorICogaGFyZHdhcmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2JpX21w dF9tb2RlICppbml0X21wdF9tb2RlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBtbXB0X3ZhbCA9 IGNzcl9yZWFkKFNCSV9DU1JfTU1QVCk7CisJc3RydWN0IHNiaV9tcHRfbW9kZSAqcyA9IE5VTEw7 CisKKyNpZiBfX3Jpc2N2X3hsZW4gPT0gNjQKKwlpZiAocHJvYmVfbW9kZShTQklfTU1QVF9NT0RF X1NNTVBUNjQpKQorCQlzID0gJnNtbXB0NjRfbW9kZTsKKwllbHNlIGlmIChwcm9iZV9tb2RlKFNC SV9NTVBUX01PREVfU01NUFQ1MikpCisJCXMgPSAmc21tcHQ1Ml9tb2RlOworCWVsc2UgaWYgKHBy b2JlX21vZGUoU0JJX01NUFRfTU9ERV9TTU1QVDQzKSkKKwkJcyA9ICZzbW1wdDQzX21vZGU7Cisj ZWxzZQorCWlmIChwcm9iZV9tb2RlKFNCSV9NTVBUX01PREVfU01NUFQzNCkpCisJCXMgPSAmc21t cHQzNF9tb2RlOworI2VuZGlmCisKKwljc3Jfd3JpdGUoU0JJX0NTUl9NTVBULCBtbXB0X3ZhbCk7 CisJcmV0dXJuIHM7Cit9CisKKy8qCisgKiBtcHRfbWFwX3JhbmdlX3Blcm0oKTogTWFwcyBbcGEs IHBhK3NpemVdIHJlZ2lvbiBpbnRvIHN1cGVydmlzb3IgZG9tYWluIE1QVCB0YWJsZQorICogd2l0 aCBpdHMgYWNjZXNzIHBlcm1pc3Npb25zKHh3cikuCisgKgorICogbG9ja2VkPXRydWU6IG1lYW5z IGVudHJ5IGlzIGltbXV0YWJsZSBhbmQgaXQgY2Fubm90IGJlIG1vZGlmaWVkLiBVc2VkIGZvcgor ICogZmlybXdhcmUgZGVueS1hbGwgYW5kIG90aGVyIHN1Y2ggcmVnaW9ucyBmb3IgcGVybWFuZW5l dCBhY2Nlc3MgcG9saWN5LgorICoKKyAqIGxvY2tlZD1mYWxzZTogcmVnaW9uIGVudHJ5IGlzIG1v ZGlmaWFibGUgYXQgcnVudGltZSB2aWEgYWRkL3JlbW92ZV9yZWdpb24uCisgKiBVc2VkIGZvciBT L1UtbW9kZSBhY2Nlc3NpYmxlIGRvbWFpbiByZWdpb25zLgorICovCisKK3N0YXRpYyBpbnQgbXB0 X21hcF9yYW5nZV9wZXJtKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCBzdHJ1Y3Qgc2JpX21w dF9tb2RlICpzY2gsCisJCQkgIHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwg dTggeHdyLCBib29sIGxvY2tlZCkKK3sKKwlpbnQgcmM7CisJYm9vbCBmaXJzdF9pbl9yYW5nZTsK KworCWlmICghc2l6ZSkgeworCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBpbnZhbGlkIHNpemUgZm9y IHJhbmdlIDB4JWx4XG4iLCBwYSk7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCWlmICgo cGEgJiBTQklfTVBUX1BBR0VfTUFTSykgfHwgKHNpemUgJiBTQklfTVBUX1BBR0VfTUFTSykpIHsK KwkJc2JpX3ByaW50Zigic2JpX21wdDogdW5hbGlnbmVkIHJhbmdlIDB4JWx4KzB4JWx4XG4iLCBw YSwgc2l6ZSk7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCWlmICghc2NoLT5wYV9pbl9y YW5nZShwYSwgc2l6ZSkpIHsKKwkJLyoKKwkJICogQSByZWdpb24gdGhhdCBwYV9pbl9yYW5nZSgp IHJldHVybnMgZmFsc2UgZmFsbHMgaW50byBvbmUgb2YgdHdvCisJCSAqIGRpZmZlcmVudCBjYXNl cyAtIFBBIHdoaWNoIGlzIG91dCBvZiByYW5nZSBmcm9tIHRoZSBtYXBwYWJsZQorCQkgKiByYW5n ZSBvZiB0aGF0IG1vZGUgYW5kIHNlY29uZCBpcyBQQSBpcyBpbiByYW5nZSBidXQgdGhlIGVuZAor CQkgKiAocGEgKyBzaXplKSBpcyBjcm9zc2luZyB0aGUgbWFwcGFibGUgcmFuZ2UuCisJCSAqCisJ CSAqIERpc3Rpbmd1aXNoIHRoZSB0d28gYnkgcHJvYmluZyBwYV9pbl9yYW5nZSgpIGZvciBqdXN0 CisJCSAqIHRoZSBmaXJzdCBwYWdlIGluIHRoYXQgYmlnIHJhbmdlIGFuZCBpZiBldmVuIHRoZSBm aXJzdCBwYWdlCisJCSAqIGlzIG91dCBvZiByYW5nZSBpdCBpcyB0aGUgZmlyc3QgY2FzZSBhbmQg aWYgdGhlIGJhc2UgaXMgaW4KKwkJICogcmFuZ2UgYnV0IHRoZSB3aG9sZSByZWdpb24gaXMgbm90 LCBpdCBpcyBjYXNlIGxhdGVyLgorCQkgKi8KKwkJZmlyc3RfaW5fcmFuZ2UgPSBzY2gtPnBhX2lu X3JhbmdlKHBhLCBTQklfTVBUX1BBR0VfU0laRSk7CisKKwkJaWYgKGxvY2tlZCkgeworCQkJc2Jp X3ByaW50Zigic2JpX21wdDogbG9ja2VkIHJlZ2lvbiAweCVseCsweCVseCBvdXQgb2YgbW9kZSBy YW5nZVxuIiwKKwkJCQkgICBwYSwgc2l6ZSk7CisJCQlyZXR1cm4gU0JJX0VJTlZBTDsKKwkJfQor CisJCS8qIFJlZ2lvbiB3aXRoIFBBIHdoaWNoIHBhcnRpYWxseSBjcm9zc292ZXIgdGhlIG1hcHBh YmxlIHNwYWNlICovCisJCWlmIChmaXJzdF9pbl9yYW5nZSkgeworCQkJc2JpX3ByaW50Zigic2Jp X21wdDogZmF0YWwgcmVnaW9uIDB4JWx4KzB4JWx4IGNyb3Nzb3ZlciIKKwkJCQkgICAiIG1vZGUg JyVzJyBjZWlsaW5nOyBoaWdoIHBhcnQgbWF5IGFsaWFzIgorCQkJCSAgICIgd2l0aCBsb3cgTVBU RSBlbnRyaWVzIOKAlCBub3QgbWFwcGluZyB0aGlzIHJlZ2lvblxuIiwKKwkJCQkgICBwYSwgc2l6 ZSwgc2NoLT5uYW1lKTsKKwkJCXJldHVybiBTQklfRUlOVkFMOworCQl9CisKKwkJLyogUmVnaW9u IHdoaWNoIGlzIGVudGlyZWx5IGFib3ZlIHRoZSBjZWlsaW5nIOKAlCB1bnJlYWNoYWJsZSAqLwor CQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBza2lwIG91dC1vZi1yYW5nZSAweCVseCsweCVseCIKKwkJ CSAgICIgKGVudGlyZWx5IGFib3ZlICclcycgY2VpbGluZzsgbm8gTVBUIGVudHJ5LFxuIiwKKwkJ CSAgIHBhLCBzaXplLCBzY2gtPm5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IHNjaC0+ bWFwX3JhbmdlKGRvbSwgcGEsIHNpemUsIHh3cik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisK KwlpZiAoZG9tLT5ucmVnaW9ucyA+PSBTQklfTVBUX01BWF9SRUdJT05TX0RPTUFJTikKKwkJcmV0 dXJuIFNCSV9FTk9NRU07CisKKwlkb20tPnJlZ2lvbnNbZG9tLT5ucmVnaW9uc10ucGEgPSBwYTsK Kwlkb20tPnJlZ2lvbnNbZG9tLT5ucmVnaW9uc10uc2l6ZSA9IHNpemU7CisJZG9tLT5yZWdpb25z W2RvbS0+bnJlZ2lvbnNdLnh3ciA9IHh3cjsKKwlkb20tPnJlZ2lvbnNbZG9tLT5ucmVnaW9uc10u bG9ja2VkID0gbG9ja2VkOworCWRvbS0+cmVnaW9uc1tkb20tPm5yZWdpb25zXS5zaGFyZWQgPSBm YWxzZTsKKwlkb20tPm5yZWdpb25zKys7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG1wdF94 d3JfZnJvbV9tZW1yZWdpb24oKTogZGVyaXZlIGFuIE1QVEUgWFdSIGVuY29kaW5nIGZyb20gYSBT QkkgZG9tYWluCisgKiBtZW1yZWdpb24ncyBTL1UgYWNjZXNzIGZsYWdzLCBjbGFtcGVkIGJ5IGNh cC4KKyAqCisgKiBjYXAgaXMgYW4gdXBwZXIgYm91bmQgdGhlIGNhbGxlciBtYXkgaW1wb3NlLiBB IHJlZ2lvbiBmcm9tIFNCSSBkb21haW4KKyAqIG1heSBoYXZlIG1vcmUgcGVybWlzc2l2ZSBhY2Nl c3MgcGVybWlzc2lvbnMgd2hpY2ggYW4gc3VwZXJ2aXNvciBkb21haW4KKyAqIG1heSB3YW50IHRv IHJlc3RpY3QgYW5kIGNhcCB0aGVtLgorICovCitzdGF0aWMgdTggbXB0X3h3cl9mcm9tX21lbXJl Z2lvbihjb25zdCBzdHJ1Y3Qgc2JpX2RvbWFpbl9tZW1yZWdpb24gKm1yLAorCQkJCSB1OCBjYXAp Cit7CisJdTggeHdyID0gU0JJX01QVF9QRVJNX05PTkU7CisKKwlpZiAobXItPmZsYWdzICYgU0JJ X0RPTUFJTl9NRU1SRUdJT05fU1VfUkVBREFCTEUpCisJCXh3ciB8PSBTQklfTVBUX1BFUk1fUjsK KwlpZiAobXItPmZsYWdzICYgU0JJX0RPTUFJTl9NRU1SRUdJT05fU1VfV1JJVEFCTEUpCisJCXh3 ciB8PSBTQklfTVBUX1BFUk1fVzsKKwlpZiAobXItPmZsYWdzICYgU0JJX0RPTUFJTl9NRU1SRUdJ T05fU1VfRVhFQ1VUQUJMRSkKKwkJeHdyIHw9IFNCSV9NUFRfUEVSTV9YOworCisJeHdyICY9IGNh cDsKKworCS8qIFhXUiBlbmNvZGluZ3MgMGIwMTAgKFcpIGFuZCAwYjExMCAoV1gpIGFyZSByZXNl cnZlZCAqLworCWlmICgoeHdyICYgU0JJX01QVF9QRVJNX1cpICYmICEoeHdyICYgU0JJX01QVF9Q RVJNX1IpKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IHJlZ2lvbiAweCVseDogVyB3aXRob3V0 IFIgaXMgYSByZXNlcnZlZCIKKwkJCSAgICIgWFdSIGVuY29kaW5nIOKAlCBkZW55aW5nIHJlZ2lv blxuIiwgbXItPmJhc2UpOworCQlyZXR1cm4gU0JJX01QVF9QRVJNX05PTkU7CisJfQorCisJcmV0 dXJuIHh3cjsKK30KKworLyoKKyAqIHNiaV9tcHRfaW5pdCgpOiBJbml0aWFsaXplIE1QVCBzdHJ1 Y3R1cmVzCisgKi8KK2ludCBzYmlfbXB0X2luaXQodm9pZCkKK3sKKwl1MzIgKnA7CisJdW5zaWdu ZWQgbG9uZyBmd19lbmQ7CisJc3RydWN0IHNiaV9zY3JhdGNoICpzOworCXN0cnVjdCBzYmlfc2Ny YXRjaCAqc2NyYXRjaCA9IHNiaV9zY3JhdGNoX3RoaXNoYXJ0X3B0cigpOworCXVuc2lnbmVkIGxv bmcgZndfcGEgPSBzY3JhdGNoLT5md19zdGFydDsKKwl1bnNpZ25lZCBsb25nIGZ3X3NpemUgPSBz Y3JhdGNoLT5md19zaXplOworCisJaWYgKG1wdF9jdHJsLnJlYWR5KQorCQlyZXR1cm4gMDsKKwor CWlmICghc2JpX2hhcnRfaGFzX2V4dGVuc2lvbihzY3JhdGNoLCBTQklfSEFSVF9FWFRfU01TRElE KSkgeworCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBTbXNkaWQgZXh0ZW5zaW9uIGFic2VudFxuIik7 CisJCXJldHVybiBTQklfRU5PREVWOworCX0KKworCWlmICghc2JpX2hhcnRfaGFzX2V4dGVuc2lv bihzY3JhdGNoLCBTQklfSEFSVF9FWFRfU01NUFQpKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6 IFNtbXB0IGV4dGVuc2lvbiBhYnNlbnRcbiIpOworCQlyZXR1cm4gU0JJX0VOT0RFVjsKKwl9CisK KwltcHRfY3RybC5zZGlkX2xlbiA9IHByb2JlX3NkaWRsZW4oKTsKKwlpZiAoIW1wdF9jdHJsLnNk aWRfbGVuKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IFNESURMRU49MCDigJQgU0RJRCBmaWVs ZCBub3QgaW1wbGVtZW50ZWRcbiIpOworCQlyZXR1cm4gU0JJX0VOT0RFVjsKKwl9CisJbXB0X2N0 cmwubWF4X2RvbWFpbnMgPSBVTCgxKSA8PCBtcHRfY3RybC5zZGlkX2xlbjsKKworCS8qCisJICog SW5pdGlhbGlzZSBTRElEIGJpdG1hcAorCSAqIHNldCBiaXRzIDAuLihtYXhfZG9tYWlucy0xKSBh cyAxIG1hcmtpbmcgdGhvc2UgU0RJRHMgZnJlZS4KKwkgKi8KKwliaXRtYXBfZmlsbChtcHRfY3Ry bC5zZGlkX2JpdG1hcCwgbXB0X2N0cmwubWF4X2RvbWFpbnMpOworCisJbXB0X2N0cmwubW9kZSA9 IGluaXRfbXB0X21vZGUoKTsKKwlpZiAoIW1wdF9jdHJsLm1vZGUpIHsKKwkJc2JpX3ByaW50Zigi c2JpX21wdDogV0FSTCBwcm9iZSBmb3VuZCBubyBtb2RlXG4iKTsKKwkJcmV0dXJuIFNCSV9FTk9E RVY7CisJfQorCisJLyogUm91bmQgZndfcGEgYW5kIGZ3X3NpemUgdG8gcGFnZSBib3VuZGFyaWVz IGJlZm9yZSBzdG9yaW5nLiAqLworCWZ3X2VuZCA9IChmd19wYSArIGZ3X3NpemUgKyBTQklfTVBU X1BBR0VfU0laRSAtIDFVTCkgJiB+U0JJX01QVF9QQUdFX01BU0s7CisJbXB0X2N0cmwuZndfcGEg PSBmd19wYSAmIH5TQklfTVBUX1BBR0VfTUFTSzsKKwltcHRfY3RybC5md19zaXplID0gZndfZW5k IC0gbXB0X2N0cmwuZndfcGE7CisKKworCS8qIFBlci1oYXJ0IFNESUQgc2NyYXRjaCBzbG90IOKA lCBpbml0aWFsaXNlIGFsbCBoYXJ0cyB0byBJTlZBTElEICovCisJbXB0X2N0cmwuc2RpZF9vZmZz ZXQgPSBzYmlfc2NyYXRjaF9hbGxvY19vZmZzZXQoc2l6ZW9mKHUzMikpOworCWlmICghbXB0X2N0 cmwuc2RpZF9vZmZzZXQpIHsKKwkJc2JpX3ByaW50Zigic2JpX21wdDogc2NyYXRjaCBhbGxvYyBm b3IgU0RJRCBmYWlsZWRcbiIpOworCX0KKwllbHNlIHsKKwkJc2JpX2Zvcl9lYWNoX2hhcnRpbmRl eChpKSB7CisJCQlzID0gc2JpX2hhcnRpbmRleF90b19zY3JhdGNoKGkpOworCQkJaWYgKHMpIHsK KwkJCQlwID0gc2JpX3NjcmF0Y2hfb2Zmc2V0X3B0cihzLCBtcHRfY3RybC5zZGlkX29mZnNldCk7 CisJCQkJKnAgPSBTQklfTVBUX1NESURfSU5WQUxJRDsKKwkJCX0KKwkJfQorCX0KKworCW1wdF9j dHJsLnJlYWR5ID0gdHJ1ZTsKKworCXJldHVybiAwOworfQorCisvKgorICogc2JpX21wdF9kb21h aW5fY3JlYXRlKCk6IENyZWF0ZSBhIFN1cGVydmlzb3IgRG9tYWluCisgKi8KK2ludCBzYmlfbXB0 X2RvbWFpbl9jcmVhdGUoY29uc3Qgc3RydWN0IHNiaV9tcHRfZG9tYWluX2NvbmZpZyAqY2ZnLAor CQkJICAgdTMyICpvdXRfc2RpZCkKK3sKKwlpbnQgcmM7CisJdTMyIHNkaWQsIGk7CisJdW5zaWdu ZWQgbG9uZyByb290X3BhOworCXN0cnVjdCBzYmlfbXB0X21vZGUgKnNjaDsKKwlzdHJ1Y3Qgc2Jp X21wdF9kb21haW4gKmRvbTsKKwljb25zdCBzdHJ1Y3Qgc2JpX2RvbWFpbl9tZW1yZWdpb24gKm1y OworCXN0cnVjdCBzYmlfbXB0X2N0cmwgKmN0cmwgPSAmbXB0X2N0cmw7CisJdTggYmFzZV94d3Ig PSBTQklfTVBUX1BFUk1fTk9ORTsKKworCWlmICghY3RybC0+cmVhZHkpCisJCXJldHVybiBTQklf RU5PREVWOworCisJaWYgKGNmZy0+c2JpX2RvbSAmJiBjZmctPm5yZWdpb25zKSB7CisJCXNiaV9w cmludGYoInNiaV9tcHQ6IHNiaV9kb20gYW5kIGV4cGxpY2l0IHJlZ2lvbnMgYXJlIG11dHVhbGx5 IGV4Y2x1c2l2ZVxuIik7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCS8qCisJICogc2Rp ZF9iaXRtYXAgZW1wdHkgbWVhbnMgZXZlcnkgYXZhaWxhYmxlIFNESUQgaXMKKwkgKiBjdXJyZW50 bHkgaW4gdXNlIGFuZCBubyBkb21haW4gY2FuIGJlIGNyZWF0ZWQuCisJICovCisJaWYgKGJpdG1h cF9lbXB0eShjdHJsLT5zZGlkX2JpdG1hcCwgY3RybC0+bWF4X2RvbWFpbnMpKQorCQlyZXR1cm4g U0JJX0VOT01FTTsKKworCXNjaCA9IGN0cmwtPm1vZGU7CisKKwlyb290X3BhID0gc2JpX21wdF9w b29sX2FsbG9jKHNjaC0+cm9vdF90YWJsZV9zaXplKCksCisJCQkJICAgICBzY2gtPnJvb3RfdGFi bGVfYWxpZ24oKSk7CisJaWYgKCFyb290X3BhKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IE9P TSByb290IHRhYmxlXG4iKTsKKwkJcmV0dXJuIFNCSV9FTk9NRU07CisJfQorCisJLyoKKwkgKiBS b290IE1QVCBtZW1vcnkgYWxsb2NhdGVkIOKAlCB0YWtlIFNESUQgZnJvbSBiaXRtYXAgZm9yIHJv b3Qgc3VwZXJ2aXNvcgorCSAqIGRvbWFpbgorCSAqLworCWZvciAoc2RpZCA9IDA7IHNkaWQgPCBj dHJsLT5tYXhfZG9tYWluczsgc2RpZCsrKQorCQlpZiAoYml0bWFwX3Rlc3QoY3RybC0+c2RpZF9i aXRtYXAsIHNkaWQpKQorCQkJYnJlYWs7CisJYml0bWFwX2NsZWFyKGN0cmwtPnNkaWRfYml0bWFw LCBzZGlkLCAxKTsKKworCWRvbSA9ICZjdHJsLT5kb21haW5zW3NkaWRdOworCVNQSU5fTE9DS19J TklUKGRvbS0+bG9jayk7CisKKwlkb20tPnNkaWQgPSBzZGlkOworCWRvbS0+dmFsaWQgPSB0cnVl OworCWRvbS0+cm9vdF9wYSA9IHJvb3RfcGE7CisJZG9tLT5tb2RlID0gc2NoOworCWRvbS0+c2Jp X2RvbSA9IGNmZy0+c2JpX2RvbTsKKwlkb20tPm5yZWdpb25zID0gMDsKKworCWlmIChjZmctPnNi aV9kb20pIHsKKwkJLyoKKwkJICogU2ltaWxhciB0byBTQkkgZG9tYWluLCBjcmVhdGUgYSBiYXNl bGluZSB3aGljaAorCQkgKiBtYXBzIHdob2xlIG1hcHBhYmxlIGFkZHJlc3Mgc3BhY2UgYnkgYSBt b2RlIGFuZCBtYXJrIGl0CisJCSAqIHdpdGggWFdSIHBlcm1pc3Npb25zLiBMYXRlciBzZWxlY3Rp dmVseSByZXN0cmljdCB0aGUKKwkJICogcGVybWlzc2lvbnMgaW4gYW5vdGhlciBwYXNzLgorCQkg Ki8KKwkJc2JpX2RvbWFpbl9mb3JfZWFjaF9tZW1yZWdpb24oY2ZnLT5zYmlfZG9tLCBtcikgewor CQkJaWYgKG1yLT5vcmRlciA8IHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpCisJCQkJY29udGlu dWU7CisKKwkJCWlmICghKG1yLT5mbGFncyAmIFNCSV9ET01BSU5fTUVNUkVHSU9OX1NVX0FDQ0VT U19NQVNLKSkKKwkJCQljb250aW51ZTsKKworCQkJYmFzZV94d3IgPSBtcHRfeHdyX2Zyb21fbWVt cmVnaW9uKG1yLCBjZmctPnh3cik7CisJCQlyYyA9IHNjaC0+bWFwX2Z1bGxfcmFuZ2UoZG9tLCBi YXNlX3h3cik7CisJCQlpZiAocmMpCisJCQkJZ290byBmYWlsOworCisJCQlpZiAoZG9tLT5ucmVn aW9ucyA8IFNCSV9NUFRfTUFYX1JFR0lPTlNfRE9NQUlOKSB7CisJCQkJc3RydWN0IHNiaV9tcHRf cmVnaW9uICpyID0gJmRvbS0+cmVnaW9uc1tkb20tPm5yZWdpb25zKytdOworCQkJCXItPnBhID0g MDsKKwkJCQlyLT5zaXplID0gfjBVTCAmIH5TQklfTVBUX1BBR0VfTUFTSzsKKwkJCQlyLT54d3Ig PSBiYXNlX3h3cjsKKwkJCQlyLT5sb2NrZWQgPSBmYWxzZTsKKwkJCQlyLT5zaGFyZWQgPSBmYWxz ZTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBBbm90aGVyIHBhc3MgdG8g bWFwIGV2ZXJ5IG90aGVyIHJlZ2lvbiB3aGljaCBoYXMgaXRzIG93bgorCQkgKiBwZXJtaXNzaW9u cyBkZXJpdmVkIGZyb20gdGhlIG1lbXJlZ2lvbidzIFMvVSBmbGFncy4KKwkJICovCisJCXNiaV9k b21haW5fZm9yX2VhY2hfbWVtcmVnaW9uKGNmZy0+c2JpX2RvbSwgbXIpIHsKKwkJCWlmIChtci0+ b3JkZXIgPj0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkKKwkJCQljb250aW51ZTsKKworCQkJ cmMgPSBtcHRfbWFwX3JhbmdlX3Blcm0oZG9tLCBzY2gsIG1yLT5iYXNlLCBCSVQobXItPm9yZGVy KSwKKwkJCQkJCW1wdF94d3JfZnJvbV9tZW1yZWdpb24obXIsIGNmZy0+eHdyKSwgZmFsc2UpOwor CQkJaWYgKHJjKQorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCS8qIE1hcCBleHBsaWNpdCBy ZWdpb25zIHdoaWNoIGFyZSBub3QgcGFydCBvZiBhbnkgU0JJIGRvbWFpbiAqLworCWZvciAoaSA9 IDA7IGkgPCBjZmctPm5yZWdpb25zOyBpKyspIHsKKwkJcmMgPSBtcHRfbWFwX3JhbmdlX3Blcm0o ZG9tLCBzY2gsIGNmZy0+cmVnaW9uc1tpXS5wYSwgY2ZnLT5yZWdpb25zW2ldLnNpemUsCisJCQkJ CWNmZy0+cmVnaW9uc1tpXS54d3IsIGZhbHNlKTsKKwkJaWYgKHJjKQorCQkJZ290byBmYWlsOwor CX0KKworCS8qCisJICogTWFwIGZpcm13YXJlIHJlZ2lvbiB3aXRoIG5vIHBlcm1pc3Npb24gd2l0 aCBhbmQgbWFyayBhcyBsb2NrZWQKKwkgKi8KKwlpZiAoY2ZnLT5md19wcm90ZWN0KSB7CisJCXJj ID0gbXB0X21hcF9yYW5nZV9wZXJtKGRvbSwgc2NoLCBjdHJsLT5md19wYSwgY3RybC0+Zndfc2l6 ZSwKKwkJCQkJU0JJX01QVF9QRVJNX05PTkUsIHRydWUpOworCQlpZiAocmMpIHsKKwkJCXNiaV9w cmludGYoInNiaV9tcHQ6IGNhbm5vdCBwcm90ZWN0IGZpcm13YXJlIgorCQkJCSAgICIgcmM9JWRc biIsIHJjKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCWN0cmwtPm5kb21haW4rKzsKKwlp ZiAob3V0X3NkaWQpCisJCSpvdXRfc2RpZCA9IHNkaWQ7CisKKwlzYmlfbXB0X2ZlbmNlX3NkaWQo c2RpZCk7CisKKwkvKiBUbyBiZSByZW1vdmVkICovCisJc2JpX3ByaW50Zigic2JpX21wdDogU0RJ RCAldSByb290PTB4JWx4IG1vZGU9JXMgZG9tPSVzXG4iLAorCQkgICBzZGlkLCByb290X3BhLCBz Y2gtPm5hbWUsIGNmZy0+c2JpX2RvbSA/IGNmZy0+c2JpX2RvbS0+bmFtZSA6ICIobm9uZSkiKTsK KwlyZXR1cm4gMDsKKworZmFpbDoKKwliaXRtYXBfc2V0KGN0cmwtPnNkaWRfYml0bWFwLCAoaW50 KXNkaWQsIDEpOworCWRvbS0+dmFsaWQgPSBmYWxzZTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisg KiBzYmlfbXB0X2RvbWFpbl9hZGRfcmVnaW9uKCk6IE1hcCBhIHJlZ2lvbiBpbiBhIE1QVCB0YWJs ZQorICovCitpbnQgc2JpX21wdF9kb21haW5fYWRkX3JlZ2lvbih1MzIgc2RpZCwgdW5zaWduZWQg bG9uZyBwYSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIHU4IHh3cikKK3sKKwlzdHJ1 Y3Qgc2JpX21wdF9kb21haW4gKmRvbTsKKwlzdHJ1Y3Qgc2JpX21wdF9yZWdpb24gKnI7CisJaW50 IHJjOworCisJaWYgKCFtcHRfY3RybC5yZWFkeSkKKwkJcmV0dXJuIFNCSV9FTk9ERVY7CisJaWYg KCFzaXplIHx8IChwYSAmIFNCSV9NUFRfUEFHRV9NQVNLKSB8fCAoc2l6ZSAmIFNCSV9NUFRfUEFH RV9NQVNLKSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisKKwlkb20gPSBzYmlfbXB0X2RvbWFpbl9n ZXQoc2RpZCk7CisJaWYgKCFkb20pCisJCXJldHVybiBTQklfRUlOVkFMOworCisJaWYgKHJlZ2lv bl9vdmVybGFwc19sb2NrZWQoZG9tLCBwYSwgc2l6ZSkpIHsKKwkJc2JpX3ByaW50Zigic2JpX21w dDogMHglbHgrMHglbHggb3ZlcmxhcHMgbG9ja2VkIgorCQkJICAgIiAoU0RJRCAldSlcbiIsIHBh LCBzaXplLCBzZGlkKTsKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisJfQorCisJaWYgKCFkb20tPm1v ZGUtPnBhX2luX3JhbmdlKHBhLCBzaXplKSkgeworCQkvKgorCQkgKiBBIHJlZ2lvbiB0aGF0IHBh X2luX3JhbmdlKCkgcmVqZWN0cyBmYWxscyBpbnRvIG9uZSBvZiB0d28KKwkJICogZGlmZmVyZW50 IGNhc2VzIC0gUEEgd2hpY2ggaXMgb3V0IG9mIHJhbmdlIGZyb20gdGhlIG1hcHBhYmxlCisJCSAq IHJhbmdlIG9mIHRoYXQgbW9kZSBhbmQgc2Vjb25kIGlzIFBBIGlzIGluIHJhbmdlIGJ1dCB0aGUg ZW5kCisJCSAqIChQQSArIFNJWkUpIGlzIGNyb3NzaW5nIHRoZSBtYXBwYWJsZSByYW5nZS4KKwkJ ICoKKwkJICogRGlzdGluZ3Vpc2ggdGhlIHR3byBieSBwcm9iaW5nIHBhX2luX3JhbmdlKCkgZm9y IGp1c3QKKwkJICogdGhlIGJhc2UgcGFnZSBhbmQgaWYgZXZlbiB0aGUgYmFzZSBpcyBvdXQgb2Yg cmFuZ2UgaXQgaXMKKwkJICogdGhlIGZpcnN0IGNhc2UgYW5kIGlmIHRoZSBiYXNlIGlzIGluIHJh bmdlIGJ1dCB0aGUgd2hvbGUKKwkJICogcmVnaW9uIGlzIG5vdCwgaXQgaXMgY2FzZSBsYXRlci4K KwkJICovCisJCWlmIChkb20tPm1vZGUtPnBhX2luX3JhbmdlKHBhLCBTQklfTVBUX1BBR0VfU0la RSkpCisJCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiAweCVseCsweCVseCBjcm9zc292ZXIgbW9kZSAn JXMnIgorCQkJCSAgICIgY2VpbGluZyAoU0RJRCAldSkg4oCUIGhpZ2ggcGFydCB3b3VsZCBhbGlh czsiCisJCQkJICAgIiByZWplY3RlZFxuIiwKKwkJCQkgICBwYSwgc2l6ZSwgZG9tLT5tb2RlLT5u YW1lLCBzZGlkKTsKKwkJZWxzZQorCQkJc2JpX3ByaW50Zigic2JpX21wdDogMHglbHgrMHglbHgg b3V0IG9mIHJhbmdlIgorCQkJCSAgICIgKFNESUQgJXUpXG4iLCBwYSwgc2l6ZSwgc2RpZCk7CisJ CXJldHVybiBTQklfRUlOVkFMOworCX0KKworCXNwaW5fbG9jaygmZG9tLT5sb2NrKTsKKwlyYyA9 IGRvbS0+bW9kZS0+bWFwX3JhbmdlKGRvbSwgcGEsIHNpemUsIHh3cik7CisJc3Bpbl91bmxvY2so JmRvbS0+bG9jayk7CisKKwlpZiAoIXJjKSB7CisJCWlmIChkb20tPm5yZWdpb25zIDwgU0JJX01Q VF9NQVhfUkVHSU9OU19ET01BSU4pIHsKKwkJCXIgPSAmZG9tLT5yZWdpb25zW2RvbS0+bnJlZ2lv bnMrK107CisJCQlyLT5wYSA9IHBhOworCQkJci0+c2l6ZSA9IHNpemU7CisJCQlyLT54d3IgPSB4 d3I7CisJCQlyLT5sb2NrZWQgPSBmYWxzZTsKKwkJCXItPnNoYXJlZCA9IGZhbHNlOworCQl9CisK KwkJc2JpX21wdF9mZW5jZV9zZGlkKHNkaWQpOworCX0KKworCXJldHVybiByYzsKK30KKworLyoK KyAqIHNiaV9tcHRfZG9tYWluX3JlbW92ZV9yZWdpb24oKTogVW5tYXAgYSByZWdpb24gZnJvbSB0 aGUgTVBUIHRhYmxlCisgKi8KK2ludCBzYmlfbXB0X2RvbWFpbl9yZW1vdmVfcmVnaW9uKHUzMiBz ZGlkLCB1bnNpZ25lZCBsb25nIHBhLAorCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlu dCByYzsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbTsKKwlz dHJ1Y3Qgc2JpX21wdF9yZWdpb24gKnI7CisKKwlpZiAoIW1wdF9jdHJsLnJlYWR5KQorCQlyZXR1 cm4gU0JJX0VOT0RFVjsKKworCWlmICghc2l6ZSB8fCAocGEgJiBTQklfTVBUX1BBR0VfTUFTSykg fHwgKHNpemUgJiBTQklfTVBUX1BBR0VfTUFTSykpCisJCXJldHVybiBTQklfRUlOVkFMOworCisJ ZG9tID0gc2JpX21wdF9kb21haW5fZ2V0KHNkaWQpOworCWlmICghZG9tKQorCQlyZXR1cm4gU0JJ X0VJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBkb20tPm5yZWdpb25zOyBpKyspIHsKKwkJciA9 ICZkb20tPnJlZ2lvbnNbaV07CisKKwkJaWYgKHItPmxvY2tlZCAmJiByZWdpb25fY29udGFpbmVk KHBhLCBzaXplLCByLT5wYSwgci0+c2l6ZSkpCisJCQlyZXR1cm4gU0JJX0VERU5JRUQ7CisJCS8q CisJCSAqIFNoYXJlZCByZWdpb25zIG11c3QgYmUgcmVtb3ZlZCB2aWEgc2JpX21wdF91bnNoYXJl X3JlZ2lvbigpCisJCSAqIGJlY2F1c2UgdGhhdCBmdW5jdGlvbiBwcmV2ZW50cyBvbmUgZG9tYWlu IHJldm9raW5nIGEgcmVnaW9uCisJCSAqIHRoYXQgYW5vdGhlciBkb21haW4gc3RpbGwgaGFzIG1h cHBlZC4KKwkJICovCisJCWlmIChyLT5zaGFyZWQgJiYgci0+cGEgPT0gcGEgJiYgci0+c2l6ZSA9 PSBzaXplKQorCQkJcmV0dXJuIFNCSV9FREVOSUVEOworCX0KKworCXNwaW5fbG9jaygmZG9tLT5s b2NrKTsKKwlyYyA9IGRvbS0+bW9kZS0+bWFwX3JhbmdlKGRvbSwgcGEsIHNpemUsIFNCSV9NUFRf UEVSTV9OT05FKTsKKwlzcGluX3VubG9jaygmZG9tLT5sb2NrKTsKKworCWlmICghcmMpCisJCXNi aV9tcHRfZmVuY2Vfc2RpZChzZGlkKTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqIFNoYXJl ZCBtZW1vcnkgcmVnaW9ucworICoKKyAqIHNiaV9tcHRfc2hhcmVfcmVnaW9uKCkg4oCUIG1hcCBh IHJlZ2lvbiBpbnRvIGEgc2Vjb25kIGRvbWFpbi4KKyAqCisgKiBCb3RoIGRvbWFpbnMgTVBUIHRh YmxlcyBhcmUgdXBkYXRlZCBpbmRlcGVuZGVudGx5IOKAlCBlYWNoIGhhcyBpdHMKKyAqIG93biBy b290L2lubmVyL2xlYWYgdGFibGUgdHJlZS4gVGhlIHNhbWUgUEEgcmFuZ2UgY2FuIGhhdmUgZGlm ZmVyZW50CisgKiBYV1IgcGVybWlzc2lvbnMgaW4gZGlmZmVyZW50IGRvbWFpbnMuCisgKgorICov CisKK2ludCBzYmlfbXB0X3NoYXJlX3JlZ2lvbih1MzIgc3JjX3NkaWQsIHUzMiBkc3Rfc2RpZCwK KwkJCSAgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICB1OCBkc3Rf eHdyKQoreworCXVuc2lnbmVkIGludCBpOworCWludCByYzsKKwlzdHJ1Y3Qgc2JpX21wdF9kb21h aW4gKnNyY19kb20sICpkc3RfZG9tOworCisJaWYgKCFtcHRfY3RybC5yZWFkeSkKKwkJcmV0dXJu IFNCSV9FTk9ERVY7CisKKwlpZiAoIXNpemUgfHwgKHBhICYgU0JJX01QVF9QQUdFX01BU0spIHx8 IChzaXplICYgU0JJX01QVF9QQUdFX01BU0spKQorCQlyZXR1cm4gU0JJX0VJTlZBTDsKKworCWlm IChzcmNfc2RpZCA9PSBkc3Rfc2RpZCkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisKKwlzcmNfZG9t ID0gc2JpX21wdF9kb21haW5fZ2V0KHNyY19zZGlkKTsKKwlkc3RfZG9tID0gc2JpX21wdF9kb21h aW5fZ2V0KGRzdF9zZGlkKTsKKwlpZiAoIXNyY19kb20gfHwgIWRzdF9kb20pCisJCXJldHVybiBT QklfRUlOVkFMOworCisJaWYgKHJlZ2lvbl9vdmVybGFwc19sb2NrZWQoZHN0X2RvbSwgcGEsIHNp emUpKSB7CisJCXNiaV9wcmludGYoInNiaV9tcHQ6IHNoYXJlIDB4JWx4KzB4JWx4IG92ZXJsYXBz IGxvY2tlZCByZWdpb24gaW4gU0RJRCAldVxuIiwKKwkJCSAgIHBhLCBzaXplLCBkc3Rfc2RpZCk7 CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCS8qIFJlamVjdCByZXNlcnZlZCB4d3IgcGVy bWlzc2lvbnM6IDBiMDEwIGFuZCAwYjExMCAoVyB3aXRob3V0IFIpICovCisJaWYgKChkc3RfeHdy ICYgU0JJX01QVF9QRVJNX1cpICYmICEoZHN0X3h3ciAmIFNCSV9NUFRfUEVSTV9SKSkgeworCQlz YmlfcHJpbnRmKCJzYmlfbXB0OiBzaGFyZSAweCVseCsweCVseDogVyB3aXRob3V0IFIgaXMgYSBy ZXNlcnZlZCBYV1IgZW5jb2RpbmdcbiIsCisJCQkgICBwYSwgc2l6ZSk7CisJCXJldHVybiBTQklf RUlOVkFMOworCX0KKworCWlmIChkc3RfZG9tLT5ucmVnaW9ucyA+PSBTQklfTVBUX01BWF9SRUdJ T05TX0RPTUFJTikgeworCQlzYmlfcHJpbnRmKCJzYmlfbXB0OiBzaGFyZTogU0RJRCAldSByZWdp b24gdGFibGUgZnVsbFxuIiwgZHN0X3NkaWQpOworCQlyZXR1cm4gU0JJX0VOT01FTTsKKwl9CisK KwlzcGluX2xvY2soJmRzdF9kb20tPmxvY2spOworCXJjID0gZHN0X2RvbS0+bW9kZS0+bWFwX3Jh bmdlKGRzdF9kb20sIHBhLCBzaXplLCBkc3RfeHdyKTsKKwlzcGluX3VubG9jaygmZHN0X2RvbS0+ bG9jayk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlkc3RfZG9tLT5yZWdpb25zW2RzdF9k b20tPm5yZWdpb25zXS5wYSA9IHBhOworCWRzdF9kb20tPnJlZ2lvbnNbZHN0X2RvbS0+bnJlZ2lv bnNdLnNpemUgPSBzaXplOworCWRzdF9kb20tPnJlZ2lvbnNbZHN0X2RvbS0+bnJlZ2lvbnNdLnh3 ciA9IGRzdF94d3I7CisJZHN0X2RvbS0+cmVnaW9uc1tkc3RfZG9tLT5ucmVnaW9uc10ubG9ja2Vk ID0gZmFsc2U7CisJZHN0X2RvbS0+cmVnaW9uc1tkc3RfZG9tLT5ucmVnaW9uc10uc2hhcmVkID0g dHJ1ZTsKKwlkc3RfZG9tLT5ucmVnaW9ucysrOworCisJZm9yIChpID0gMDsgaSA8IHNyY19kb20t Pm5yZWdpb25zOyBpKyspIHsKKwkJaWYgKHNyY19kb20tPnJlZ2lvbnNbaV0ucGEgPT0gcGEgJiYK KwkJICAgIHNyY19kb20tPnJlZ2lvbnNbaV0uc2l6ZSA9PSBzaXplKSB7CisJCQlzcmNfZG9tLT5y ZWdpb25zW2ldLnNoYXJlZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNiaV9tcHRf ZmVuY2Vfc2RpZChzcmNfc2RpZCk7CisJc2JpX21wdF9mZW5jZV9zZGlkKGRzdF9zZGlkKTsKKwor CXNiaV9wcmludGYoInNiaV9tcHQ6IHNoYXJlZCAweCVseCsweCVseCBTRElEICV1IOKGkiBTRElE ICV1IHh3cj0ldVxuIiwKKwkJICAgcGEsIHNpemUsIHNyY19zZGlkLCBkc3Rfc2RpZCwgZHN0X3h3 cik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNiaV9tcHRfdW5zaGFyZV9yZWdpb24oKSDi gJQgVW5tYXAgYSBzaGFyZWQgcmVnaW9uIGZyb20gYSBkb21haW4uCisgKgorICogVGhlIG90aGVy IGRvbWFpbiByZW1haW5zIHVuYWZmZWN0ZWQganVzdCB0aGUgc2hhcmVkIGZsYWcgZ2V0cyByZW1v dmVkCisgKiBmb3IgdGhhdCByZWdpb24gZnJvbSBib3RoIHRoZSBkb21haW5zLgorICovCitpbnQg c2JpX21wdF91bnNoYXJlX3JlZ2lvbih1MzIgc2RpZCwgdW5zaWduZWQgbG9uZyBwYSwgdW5zaWdu ZWQgbG9uZyBzaXplKQoreworCXUzMiBzOworCWludCByYzsKKwl1bnNpZ25lZCBpbnQgaSwgajsK KwlzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwgKnBlZXI7CisKKwlpZiAoIW1wdF9jdHJsLnJl YWR5KQorCQlyZXR1cm4gU0JJX0VOT0RFVjsKKworCWlmICghc2l6ZSB8fCAocGEgJiBTQklfTVBU X1BBR0VfTUFTSykgfHwgKHNpemUgJiBTQklfTVBUX1BBR0VfTUFTSykpCisJCXJldHVybiBTQklf RUlOVkFMOworCisJZG9tID0gc2JpX21wdF9kb21haW5fZ2V0KHNkaWQpOworCWlmICghZG9tKQor CQlyZXR1cm4gU0JJX0VJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBkb20tPm5yZWdpb25zOyBp KyspIHsKKwkJaWYgKGRvbS0+cmVnaW9uc1tpXS5wYSA9PSBwYSAmJgorCQkgICAgZG9tLT5yZWdp b25zW2ldLnNpemUgPT0gc2l6ZSAmJgorCQkgICAgZG9tLT5yZWdpb25zW2ldLnNoYXJlZCkKKwkJ CWJyZWFrOworCX0KKwlpZiAoaSA9PSBkb20tPm5yZWdpb25zKSB7CisJCXNiaV9wcmludGYoInNi aV9tcHQ6IHVuc2hhcmUgMHglbHgrMHglbHggbm90IGZvdW5kIGluIFNESUQgJXVcbiIsCisJCQkg ICBwYSwgc2l6ZSwgc2RpZCk7CisJCXJldHVybiBTQklfRUlOVkFMOworCX0KKworCXNwaW5fbG9j aygmZG9tLT5sb2NrKTsKKwlyYyA9IGRvbS0+bW9kZS0+bWFwX3JhbmdlKGRvbSwgcGEsIHNpemUs IFNCSV9NUFRfUEVSTV9OT05FKTsKKwlzcGluX3VubG9jaygmZG9tLT5sb2NrKTsKKworCWlmIChy YykKKwkJcmV0dXJuIHJjOworCisJZG9tLT5ucmVnaW9ucyAtPSAxOworCWRvbS0+cmVnaW9uc1tp XSA9IGRvbS0+cmVnaW9uc1tkb20tPm5yZWdpb25zXTsKKworCS8qIENsZWFyIHRoZSBzaGFyZWQg ZmxhZyBvbiBhbnkgb3RoZXIgZG9tYWluIHRoYXQgaGFzIHRoaXMgUEEgcmVnaW9uIHNoYXJlZC4q LworCWZvciAocyA9IDA7IHMgPCBtcHRfY3RybC5tYXhfZG9tYWluczsgcysrKSB7CisJCXBlZXIg PSBzYmlfbXB0X2RvbWFpbl9nZXQocyk7CisJCWlmICghcGVlciB8fCBwZWVyID09IGRvbSkKKwkJ CWNvbnRpbnVlOworCisJCWZvciAoaiA9IDA7IGogPCBwZWVyLT5ucmVnaW9uczsgaisrKQorCQkJ aWYgKHBlZXItPnJlZ2lvbnNbal0ucGEgPT0gcGEgJiYgcGVlci0+cmVnaW9uc1tqXS5zaXplID09 IHNpemUpCisJCQkJcGVlci0+cmVnaW9uc1tqXS5zaGFyZWQgPSBmYWxzZTsKKwl9CisKKwlzYmlf bXB0X2ZlbmNlX3NkaWQoc2RpZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERpc2FibGUg U01NUFQgb24gaGFydAorICovCit2b2lkIHNiaV9tcHRfaGFydF9kZWFjdGl2YXRlKHZvaWQpCit7 CisJLyoKKwkgKiBtbXB0IGlzIGluYWN0aXZlIGluIE0tbW9kZSBwZXIgc3BlYywgc28gbm8gQ1NS IHdyaXRlCisJICogaXMgbmVlZGVkLgorCSAqLworfQorCisvKgorICogRW5hYmxlIFNNTVBUIG9u IGhhcnQKKyAqLworaW50IHNiaV9tcHRfaGFydF9hY3RpdmF0ZSh1MzIgc2RpZCkKK3sKKwl1MzIg KnA7CisJdW5zaWduZWQgbG9uZyBwcG47CisJc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb207CisK KwlpZiAoIW1wdF9jdHJsLnJlYWR5KQorCQlyZXR1cm4gU0JJX0VOT0RFVjsKKworCWRvbSA9IHNi aV9tcHRfZG9tYWluX2dldChzZGlkKTsKKwlpZiAoIWRvbSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7 CisKKwlwcG4gPSBkb20tPnJvb3RfcGEgPj4gU0JJX01QVF9QQUdFX1NISUZUOworCWNzcl93cml0 ZShTQklfQ1NSX01NUFQsIGRvbS0+bW9kZS0+ZW5jb2RlX21tcHQocHBuLCBzZGlkKSk7CisJc2Jp X21wdF9mZW5jZV9zZGlkKHNkaWQpOworCisJaWYgKG1wdF9jdHJsLnNkaWRfb2Zmc2V0KSB7CisJ CXAgPSBzYmlfc2NyYXRjaF9vZmZzZXRfcHRyKHNiaV9zY3JhdGNoX3RoaXNoYXJ0X3B0cigpLCBt cHRfY3RybC5zZGlkX29mZnNldCk7CisJCSpwID0gc2RpZDsKKwl9CisKKwlyZXR1cm4gMDsKK30K KworLyoKKyAqIEFjdGl2YXRlIFNNTVBUIGZvciBhbGwgaGFydHMgd2hpY2ggYXJlIGFzc29jaWF0 ZWQgd2l0aCBhbiBsaW5rZWQKKyAqIFNCSSBkb21haW4gaW4gYW4gc3VwZXJ2aXNvciBkb21haW4u CisgKi8KK2ludCBzYmlfbXB0X2hhcnRfYWN0aXZhdGVfZm9yX2RvbWFpbihzdHJ1Y3Qgc2JpX2Rv bWFpbiAqc2JpX2RvbSkKK3sKKwl1MzIgczsKKworCWlmICghbXB0X2N0cmwucmVhZHkpCisJCXJl dHVybiBTQklfRU5PREVWOworCWlmICghc2JpX2RvbSkKKwkJcmV0dXJuIFNCSV9FSU5WQUw7CisK KwkvKgorCSAqIFNlYXJjaCBhbGwgc3VwZXJ2aXNvciBkb21haW5zIGZvciBhc3NvY2lhdGVkIHNi aV9kb20gYW5kCisJICogYWN0aXZhdGUgaGFydHMgZm9yIHRoYXQgc3VwZXJ2aXNvciBkb21haW4K KwkgKi8KKwlmb3IgKHMgPSAwOyBzIDwgbXB0X2N0cmwubWF4X2RvbWFpbnM7IHMrKykgeworCQlp ZiAobXB0X2N0cmwuZG9tYWluc1tzXS52YWxpZCAmJiBtcHRfY3RybC5kb21haW5zW3NdLnNiaV9k b20gPT0gc2JpX2RvbSkKKwkJCXJldHVybiBzYmlfbXB0X2hhcnRfYWN0aXZhdGUocyk7CisJfQor CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzYmlfbXB0X3NkaWRfZnJlZSgpOiBSZXR1cm5zIFNE SUQgdG8gdGhlIGZyZWUgcG9vbCBhZnRlciBkb21haW4gZGVzdHJveS4KKyAqLwordm9pZCBzYmlf bXB0X3NkaWRfZnJlZSh1MzIgc2RpZCkKK3sKKwlpZiAoIW1wdF9jdHJsLnJlYWR5IHx8IHNkaWQg Pj0gbXB0X2N0cmwubWF4X2RvbWFpbnMpCisJCXJldHVybjsKKwliaXRtYXBfc2V0KG1wdF9jdHJs LnNkaWRfYml0bWFwLCAoaW50KXNkaWQsIDEpOworCW1wdF9jdHJsLmRvbWFpbnNbc2RpZF0udmFs aWQgPSBmYWxzZTsKK30KKworLyoKKyAqIERlYnVnIGR1bXAKKyAqLwordm9pZCBzYmlfbXB0X2R1 bXAodm9pZCkKK3sKKwl1MzIgczsKKwl1bnNpZ25lZCBpbnQgcjsKKwljb25zdCBzdHJ1Y3Qgc2Jp X21wdF9kb21haW4gKmQ7CisJY29uc3QgdW5zaWduZWQgbG9uZyBjYXRjaGFsbF9zaXplID0gfjBV TCAmIH5TQklfTVBUX1BBR0VfTUFTSzsKKworCWlmICghbXB0X2N0cmwucmVhZHkpIHsKKwkJc2Jp X3ByaW50Zigic2JpX21wdDogbm90IGluaXRpYWxpc2VkXG4iKTsKKwkJcmV0dXJuOworCX0KKwor CXNiaV9wcmludGYoInNiaV9tcHQ6IG1vZGU9JS0xMHMgU0RJRExFTj0ldSBtYXhfZG9tYWlucz0l dVxuIiwgbXB0X2N0cmwubW9kZS0+bmFtZSwKKwkJICAgbXB0X2N0cmwuc2RpZF9sZW4sIG1wdF9j dHJsLm1heF9kb21haW5zKTsKKwlzYmlfcHJpbnRmKCJyb290X3NpemU9MHglbHggcm9vdF9hbGln bj0weCVseFxuIiwKKwkJICAgbXB0X2N0cmwubW9kZS0+cm9vdF90YWJsZV9zaXplKCksIG1wdF9j dHJsLm1vZGUtPnJvb3RfdGFibGVfYWxpZ24oKSk7CisJc2JpX3ByaW50ZigiZncgMHglMDE2bHgr MHglbHggIHBvb2w9Z2xvYmFsIGhlYXBcbiIsCisJCSAgIG1wdF9jdHJsLmZ3X3BhLCBtcHRfY3Ry bC5md19zaXplKTsKKwlmb3IgKHMgPSAwOyBzIDwgbXB0X2N0cmwubWF4X2RvbWFpbnM7IHMrKykg eworCQlib29sIGhhc19iYXNlbGluZSA9IGZhbHNlOworCQl1OCAgIGJhc2VsaW5lX3h3ciA9IFNC SV9NUFRfUEVSTV9OT05FOworCisJCWQgPSAmbXB0X2N0cmwuZG9tYWluc1tzXTsKKwkJaWYgKCFk LT52YWxpZCkKKwkJCWNvbnRpbnVlOworCQlzYmlfcHJpbnRmKCJTRElEICUydSByb290PTB4JTAx Nmx4IHJlZ2lvbnM9JXUgZG9tPSVzXG4iLAorCQkJICAgZC0+c2RpZCwgZC0+cm9vdF9wYSwgZC0+ bnJlZ2lvbnMsIGQtPnNiaV9kb20gPyBkLT5zYmlfZG9tLT5uYW1lIDogIihub25lKSIpOworCQlm b3IgKHIgPSAwOyByIDwgZC0+bnJlZ2lvbnM7IHIrKykgeworCisJCQlpZiAoZC0+cmVnaW9uc1ty XS5wYSA9PSAwICYmCisJCQkgICAgZC0+cmVnaW9uc1tyXS5zaXplID09IGNhdGNoYWxsX3NpemUp IHsKKwkJCQloYXNfYmFzZWxpbmUgPSB0cnVlOworCQkJCWJhc2VsaW5lX3h3ciA9IGQtPnJlZ2lv bnNbcl0ueHdyOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlzYmlfcHJpbnRmKCJTLURvbWFp biV1IFJlZ2lvbiUwMnUgICAgICAgICAgOiAweCUwMTZseCsweCUtMTZseDogeHdyPSV1ICglYyVj JWMpJXMlc1xuIiwKKwkJCSAgIGQtPnNkaWQsIHIsIGQtPnJlZ2lvbnNbcl0ucGEsCisJCQkgICBk LT5yZWdpb25zW3JdLnNpemUsCisJCQkgICBkLT5yZWdpb25zW3JdLnh3ciwKKwkJCSAgIChkLT5y ZWdpb25zW3JdLnh3ciAmIFNCSV9NUFRfUEVSTV9SKSA/ICdSJyA6ICctJywKKwkJCSAgIChkLT5y ZWdpb25zW3JdLnh3ciAmIFNCSV9NUFRfUEVSTV9XKSA/ICdXJyA6ICctJywKKwkJCSAgIChkLT5y ZWdpb25zW3JdLnh3ciAmIFNCSV9NUFRfUEVSTV9YKSA/ICdYJyA6ICctJywKKwkJCSAgIGQtPnJl Z2lvbnNbcl0ubG9ja2VkID8gIiBbTE9DS0VEXSIgOiAiIiwKKwkJCSAgIGQtPnJlZ2lvbnNbcl0u c2hhcmVkID8gIiBbU0hBUkVEXSIgOiAiIik7CisJCX0KKworCQlpZiAoaGFzX2Jhc2VsaW5lKSB7 CisJCQlzYmlfcHJpbnRmKCJTLURvbWFpbiV1IERlZmF1bHQgICAgICAgICAgIDogJS0zN3M6IHh3 cj0ldSAoJWMlYyVjKSAgIFtiYXNlbGluZSwgb3ZlcmxheSBieSByZWdpb25zIGFib3ZlXVxuIiwK KwkJCQkgICBkLT5zZGlkLCAiUmVzdCBvZiB0aGUgYWRkcmVzcyBzcGFjZSIsCisJCQkJICAgYmFz ZWxpbmVfeHdyLAorCQkJCSAgIChiYXNlbGluZV94d3IgJiBTQklfTVBUX1BFUk1fUikgPyAnUicg OiAnLScsCisJCQkJICAgKGJhc2VsaW5lX3h3ciAmIFNCSV9NUFRfUEVSTV9XKSA/ICdXJyA6ICct JywKKwkJCQkgICAoYmFzZWxpbmVfeHdyICYgU0JJX01QVF9QRVJNX1gpID8gJ1gnIDogJy0nKTsK KwkJfQorCQllbHNlIHsKKwkJCXNiaV9wcmludGYoIlMtRG9tYWluJXUgICAgICAgICAgIDogeHdy PTAgKC0tLSkgICBbbm8gYmFzZWxpbmUg4oCUIHVubWFwcGVkIFBBcyBkZW5pZWRdXG4iLAorCQkJ CSAgIGQtPnNkaWQpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvbGliL3NiaS9zYmlfbXB0X21v ZGUuYyBiL2xpYi9zYmkvc2JpX21wdF9tb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAuLmY0MGI4Y2EwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3NiaS9zYmlfbXB0X21v ZGUuYwpAQCAtMCwwICsxLDg5MSBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0y LUNsYXVzZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAyNiBRdWFsY29tbSBJbmMuCisgKgorICog QXV0aG9yczogUmFodWwgUGF0aGFrIDxyYWh1bC5wYXRoYWtAb3NzLnF1YWxjb21tLmNvbT4KKyAq LworCisjaW5jbHVkZSA8c2JpL3NiaV9tcHQuaD4KKyNpbmNsdWRlIDxzYmkvc2JpX2Vycm9yLmg+ CisjaW5jbHVkZSA8c2JpL3NiaV9zdHJpbmcuaD4KKyNpbmNsdWRlIDxzYmkvc2JpX2NvbnNvbGUu aD4KKworI2lmIF9fcmlzY3ZfeGxlbiA9PSA2NAorCisvKgorICogU21tcHQ0MyAg4oCUICA0My1i aXQgc3VwZXJ2aXNvciBwaHlzaWNhbCBhZGRyZXNzIChTUEEpCisgKiArLS0tLS0tLS0tKy0tLS0t LS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tKworICogfCAgcG5bMl0gIHwgIHBuWzFd ICB8ICBwblswXSAgfCAgICBwaSAgIHwgb2Zmc2V0IHwKKyAqIHwgWzQyOjM0XSB8IFszMzoyNV0g fCBbMjQ6MTZdIHwgWzE1OjEyXSB8IFsxMTowXSB8CisgKiB8ICAgIDliICAgfCAgICA5YiAgIHwg ICAgOWIgICB8ICAgIDRiICAgfCAgMTJiICAgfAorICogKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0t LS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLSsKKyAqCisgKiBTbW1wdDUyICDigJQgIDUyLWJpdCBz dXBlcnZpc29yIHBoeXNpY2FsIGFkZHJlc3MgKFNQQSkKKyAqICstLS0tLS0tLS0rLS0tLS0tLS0t Ky0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tKworICogfCAgcG5bM10gIHwg IHBuWzJdICB8ICBwblsxXSAgfCAgcG5bMF0gIHwgICAgcGkgICB8IG9mZnNldCB8CisgKiB8IFs1 MTo0M10gfCBbNDI6MzRdIHwgWzMzOjI1XSB8IFsyNDoxNl0gfCBbMTU6MTJdIHwgWzExOjBdIHwK KyAqIHwgICAgOWIgICB8ICAgIDliICAgfCAgICA5YiAgIHwgICAgOWIgICB8ICAgIDRiICAgfCAg MTJiICAgfAorICogKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0t LS0tLS0rLS0tLS0tLS0rCisgKgorICogU21tcHQ2NCAg4oCUICA2NC1iaXQgc3VwZXJ2aXNvciBw aHlzaWNhbCBhZGRyZXNzIChTUEEpCisgKiArLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0r LS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0rCisgKiB8ICBwbls0XSAgfCAg cG5bM10gIHwgIHBuWzJdICB8ICBwblsxXSAgfCAgcG5bMF0gIHwgICAgcGkgICB8IG9mZnNldCB8 CisgKiB8IFs2Mzo1Ml0gfCBbNTE6NDNdIHwgWzQyOjM0XSB8IFszMzoyNV0gfCBbMjQ6MTZdIHwg WzE1OjEyXSB8IFsxMTowXSB8CisgKiB8ICAgMTJiICAgfCAgICA5YiAgIHwgICAgOWIgICB8ICAg IDliICAgfCAgICA5YiAgIHwgICAgNGIgICB8ICAxMmIgICB8CisgKiArLS0tLS0tLS0tKy0tLS0t LS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0rCisg KgorICovCisKKy8qIElubnRlciBlbnRyaWVzIGFyZSBNUFRFcyBub3QgaW4gcm9vdCBNUFQgcGFn ZSAqLworI2RlZmluZSBSVjY0X0lOTkVSX0VOVFJJRVMJCTUxMlUKKyNkZWZpbmUgUlY2NF9NUFRF X1NJWkUJCQk4VUwKKyNkZWZpbmUgUlY2NF9UQUJMRV9TSVpFCQkJKFJWNjRfSU5ORVJfRU5UUklF UyAqIFJWNjRfTVBURV9TSVpFKQorCisvKiBTbW1wdDY0IHJvb3Q6IDQwOTYgZW50cmllcyDDlyA4 QiA9IDMyS0IsIDMyS0IgYWxpZ25lZCAqLworI2RlZmluZSBSVjY0X1JPT1RfU01NUFQ2NF9FTlRS SUVTCTQwOTZVCisjZGVmaW5lIFJWNjRfUk9PVF9TTU1QVDY0X1NJWkUJCShSVjY0X1JPT1RfU01N UFQ2NF9FTlRSSUVTICogUlY2NF9NUFRFX1NJWkUpCisKKyNkZWZpbmUgUlY2NF9OVU1QR0lOUkFO R0UJCTRVCisjZGVmaW5lIFJWNjRfUEFHRVNfUEVSX01QVEUJCSgxVSA8PCBSVjY0X05VTVBHSU5S QU5HRSkKKyNkZWZpbmUgUlY2NF9QQUdFU19QRVJfTVBURV9NQVNLCShSVjY0X1BBR0VTX1BFUl9N UFRFIC0gMVUpCisjZGVmaW5lIFJWNjRfSU5ORVJfUE5fQklUUwkJOVUKKworLyogQnl0ZXMgY292 ZXJlZCBieSBvbmUgY29tcGxldGUgbGVhZiB0YWJsZSA9IHBhZ2VzX3Blcl9sZWFmIMOXIFBBR0Vf U0laRSAqLworI2RlZmluZSBSVjY0X0xFQUZfUkFOR0UJCQkoUlY2NF9QQUdFU19QRVJfTVBURSAq IFNCSV9NUFRfUEFHRV9TSVpFKQorCisvKgorICogTkFQT1QgRz00IGZvciBTbW1wdDQzLCBTbW1w dDUyIGFuZCBTbW1wdDY0CisgKgorICogRz00IG1lYW5zIDJeKEcrMSk9MzIgY29udGlndW91cyBs ZWFmIG1wdGUgd2hpY2ggZm9ybSBhIE5BUE9UIGdyb3VwLgorICogRWFjaCBSVjY0IGxlYWYgTVBU RSBjb3ZlcnMgNjRLaUIgc28gb25lIE5BUE9UIGdyb3VwIGNvdmVycyAyTWlCLgorICoKKyAqIEFs bCBvdGhlciBHIHZhbHVlcyBhcGFydCBmcm9tIDQgYXJlIHJlc2VydmVkLgorICovCisjZGVmaW5l IFJWNjRfTkFQT1RfRwkJCTRVCisjZGVmaW5lIFJWNjRfTkFQT1RfR19TSElGVAkJMTJVCisjZGVm aW5lIFJWNjRfTkFQT1RfTVBURV9DT1VOVAkJKDFVIDw8IChSVjY0X05BUE9UX0cgKyAxKSkKKyNk ZWZpbmUgUlY2NF9OQVBPVF9TSVpFCQkJKCh1bnNpZ25lZCBsb25nKVJWNjRfTkFQT1RfTVBURV9D T1VOVCAqIFJWNjRfTEVBRl9SQU5HRSkKKyNkZWZpbmUgUlY2NF9OQVBPVF9QTjBfQUxJR04JCVJW NjRfTkFQT1RfTVBURV9DT1VOVAorCisvKgorICogU3dpdGggdG8gZGlzYWJsZSBOQVBPVCBjb21w YWN0aW9uIG9mIE1QVEUgZW50cmllcyB3aGlsZSB3cml0aW5nLgorICovCisjZGVmaW5lIFJWNjRf TkFQT1RfRElTQUJMRQkwCisKKy8qCisgKiBTdXBlcnZpc29yIFBoeXN1Y2FsIGFkZHJlc3MgZmll bGRzIGV4dHJhY3Rpb24KKyAqLworCisvKgorICogcnY2NF90YWJsZV9pZHgoKSDigJQgZXh0cmFj dCBwbltsZXZlbF0gZnJvbSBhIFNQQS4KKyAqLworc3RhdGljIGlubGluZSB1MzIgcnY2NF90YWJs ZV9pZHgodW5zaWduZWQgbG9uZyBwYSwgdTMyIGxldmVsLAorCQkJICBjb25zdCBzdHJ1Y3Qgc2Jp X21wdF9tb2RlICpzY2gpCit7CisJdTMyIHNoaWZ0ID0gMTYgKyBsZXZlbCAqIDk7CisJdTMyIG1h c2sgPSAoc2NoLT5tb2RlX3ZhbCA9PSBTQklfTU1QVF9NT0RFX1NNTVBUNjQgJiYgbGV2ZWwgPT0g NCkgPyAweEZGRiA6IDB4MUZGOworCisJcmV0dXJuICgocGEgPj4gc2hpZnQpICYgbWFzayk7Cit9 CisKKy8qCisgKiBydjY0X3R1cGxlX2lkeF9zaGlmdCgpIOKAlCBYV1IgdHVwbGUgaW5kZXggc2hp ZnQgYXQgbGV2ZWwgaS4KKyAqLworc3RhdGljIGlubGluZSB1MzIgcnY2NF90dXBsZV9pZHhfc2hp ZnQodTMyIGxldmVsKQoreworCXJldHVybiAoU0JJX01QVF9QQUdFX1NISUZUICsgbGV2ZWwgKiBS VjY0X0lOTkVSX1BOX0JJVFMpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBydjY0X3R1cGxlX2lk eCh1bnNpZ25lZCBsb25nIHBhLCB1MzIgbGV2ZWwpCit7CisJcmV0dXJuICgocGEgPj4gcnY2NF90 dXBsZV9pZHhfc2hpZnQobGV2ZWwpKSAmIFJWNjRfUEFHRVNfUEVSX01QVEVfTUFTSyk7Cit9CisK Ky8qCisgKiBydjY0X21wdGVfcmFuZ2UoKSDigJQgYnl0ZXMgY292ZXJlZCBieSBvbmUgTVBURSBh dCBsZXZlbCBMLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcnY2NF9tcHRlX3Jh bmdlKHUzMiBsZXZlbCkKK3sKKwlyZXR1cm4gUlY2NF9MRUFGX1JBTkdFIDw8IChsZXZlbCAqIFJW NjRfSU5ORVJfUE5fQklUUyk7Cit9CisKKy8qCisgKiBSVjY0IE1QVEUgUmVhZC9Xcml0ZSBmdW5j dGlvbnMKKyAqLworCitzdGF0aWMgaW5saW5lIHU2NCBydjY0X3JlYWRfbXB0ZSh1bnNpZ25lZCBs b25nIHBhKQoreworCXJldHVybiAqKHZvbGF0aWxlIHU2NCAqKXBhOworfQorCitzdGF0aWMgaW5s aW5lIHZvaWQgcnY2NF93cml0ZV9tcHRlKHVuc2lnbmVkIGxvbmcgcGEsIHU2NCB2KQoreworCSoo dm9sYXRpbGUgdTY0ICopcGEgPSB2OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcg cnY2NF9tcHRlX3BhKHVuc2lnbmVkIGxvbmcgdGFibGVfcGEsIHUzMiBpZHgpCit7CisJcmV0dXJu ICh0YWJsZV9wYSArIGlkeCAqIFJWNjRfTVBURV9TSVpFKTsKK30KKworc3RhdGljIGlubGluZSB1 bnNpZ25lZCBsb25nIHJ2NjRfbmV4dF90YWJsZV9wYSh1NjQgbXB0ZSkKK3sKKwlyZXR1cm4gKHVu c2lnbmVkIGxvbmcpKCh1NjQpKG1wdGUgPj4gU0JJX01QVEVfUFBOX1NISUZUKSA8PCBTQklfTVBU X1BBR0VfU0hJRlQpOworfQorCisvKgorICogR2VuZXJhdGUgTmFwb3QgTGVhZiBNUFRFCisgKgor ICogQ29uc3RydWN0cyBvbmUgTVBURSB2YWx1ZSB1c2VkIGZvciBhbGwKKyAqIFJWNjRfTkFQT1Rf TVBURV9DT1VOVCBlbnRyaWVzIGluIGEgTkFQT1QgZ3JvdXAuCisgKgorICogQWxsIE1QVEVzIGlu IHRoZSBncm91cCBhcmUgaWRlbnRpY2FsCisgKi8KK3N0YXRpYyBpbmxpbmUgdTY0IHJ2NjRfbmFw b3RfbGVhZl9tcHRlKHU4IHh3cikKK3sKKwl1NjQgbXB0ZSA9IFNCSV9NUFRFX1YgfCBTQklfTVBU RV9MIHwgU0JJX01QVEVfTjsKKworCW1wdGUgPSBzYmlfbXB0ZV9sZWFmX3NldF94d3IobXB0ZSwg MCwgeHdyKTsKKwltcHRlIHw9ICgodTY0KVJWNjRfTkFQT1RfRyA8PCBSVjY0X05BUE9UX0dfU0hJ RlQpOworCisJcmV0dXJuIG1wdGU7Cit9CisKKy8qCisgKiBydjY0X25hcG90X2xlYWZfeHdyKCkg 4oCUIHJlY292ZXIgdGhlIHVuaWZvcm0gWFdSIGZyb20gYSBOQVBPVCBsZWFmLgorICovCitzdGF0 aWMgaW5saW5lIHU4IHJ2NjRfbmFwb3RfbGVhZl94d3IodTY0IG1wdGUpCit7CisJcmV0dXJuICgo bXB0ZSA+PiBTQklfTVBURV9YV1JfQkFTRSkgJiBTQklfTVBURV9YV1JfTUFTSyk7Cit9CisKKy8q CisgKiBydjY0X25hcG90X2RlbW90ZSgpIOKAlCBDb252ZXJ0IGEgTmFwb3QgTVBURSBncm91cCBp bnRvIFJWNjRfTkFQT1RfTVBURV9DT1VOVAorICogbm9ybWFsKE5vbi1OYXBvdCkgTVBURSBjYXJy eWluZyB0aGUgU0FNRSBwZXJtaXNzaW9uLgorICoKKyAqIGxlYWZfbXB0ZV9wYSBpcyBhbnkgbGVh ZiBtcHRlIHBhIGZyb20gdGhlIE5hcG90IGdyb3VwCisgKi8KK3N0YXRpYyB2b2lkIHJ2NjRfbmFw b3RfZGVtb3RlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAgICAgdW5zaWduZWQg bG9uZyBsZWFmX21wdGVfcGEsIHVuc2lnbmVkIGxvbmcgcGEpCit7CisJdTggeHdyOworCXUzMiBw bjAsIHBnLCBpOworCXU2NCBsZWFmOworCXVuc2lnbmVkIGxvbmcgZ3JwX2Jhc2U7CisKKwl4d3Ig PSBydjY0X25hcG90X2xlYWZfeHdyKHJ2NjRfcmVhZF9tcHRlKGxlYWZfbXB0ZV9wYSkpOworCXBu MCA9IHJ2NjRfdGFibGVfaWR4KHBhLCAwLCBkb20tPm1vZGUpOworCWdycF9iYXNlID0gbGVhZl9t cHRlX3BhIC0gKHBuMCAmIChSVjY0X05BUE9UX01QVEVfQ09VTlQgLSAxKSkgKiBSVjY0X01QVEVf U0laRTsKKwlsZWFmID0gU0JJX01QVEVfViB8IFNCSV9NUFRFX0w7CisKKwlmb3IgKHBnID0gMDsg cGcgPCBSVjY0X1BBR0VTX1BFUl9NUFRFOyBwZysrKQorCQlsZWFmID0gc2JpX21wdGVfbGVhZl9z ZXRfeHdyKGxlYWYsIHBnLCB4d3IpOworCisJZm9yIChpID0gMDsgaSA8IFJWNjRfTkFQT1RfTVBU RV9DT1VOVDsgaSsrKQorCQlydjY0X3dyaXRlX21wdGUoZ3JwX2Jhc2UgKyBpICogUlY2NF9NUFRF X1NJWkUsIGxlYWYpOworfQorCisvKgorICogTVBUIHRhYmxlIGJlc3QtbGV2ZWwgc2VsZWN0aW9u CisgKgorICogUmV0dXJucyB0aGUgaGlnaGVzdCBsZXZlbCBhdCB3aGljaCB0aGUgcmFuZ2UgW3Bh LCBwYStzaXplXSBjYW4gYmUKKyAqIGNvdmVyZWQgYnkgYSBzaW5nbGUgbGVhZiBNUFRFLiBMZXZl bCAwIGlzIGFsd2F5cyB2YWxpZCBiZWNhdXNlIHRoYXRzCisgKiB0aGUgbGFzdCByZXNvcnQuCisg Ki8KK3N0YXRpYyB1MzIgcnY2NF9iZXN0X2xldmVsKHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVk IGxvbmcgc2l6ZSwKKwkJCSAgIHUzMiB0b3BfbGV2ZWwpCit7CisJdTMyIGx2bDsKKwl1bnNpZ25l ZCBsb25nIHJhbmdlOworCisJZm9yIChsdmwgPSB0b3BfbGV2ZWw7IGx2bCA+PSAxOyBsdmwtLSkg eworCQlyYW5nZSA9IHJ2NjRfbXB0ZV9yYW5nZShsdmwpOworCisJCWlmIChzaXplID49IHJhbmdl ICYmIChwYSAmIChyYW5nZSAtIDEpKSA9PSAwKQorCQkJcmV0dXJuIGx2bDsKKwl9CisJcmV0dXJu IDA7Cit9CisKKy8qCisgKiBHZW5lcmljIE4tbGV2ZWwgd2FsayB3aXRoIGxhenkgdGFibGUgYWxs b2NhdGlvbgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydjY0X3NwbGl0X2xlYWYodW5zaWdu ZWQgbG9uZyBwYXJlbnRfZXApCit7CisJdTY0IHBhcmVudCA9IHJ2NjRfcmVhZF9tcHRlKHBhcmVu dF9lcCk7CisJdW5zaWduZWQgbG9uZyBzdWI7CisJdTMyIGosIHBnLCBzaDsKKwl1OCB4d3I7CisJ dTY0IGNoaWxkOworCisJc3ViID0gc2JpX21wdF9wb29sX2FsbG9jKFJWNjRfVEFCTEVfU0laRSwg U0JJX01QVF9QQUdFX1NJWkUpOworCWlmICghc3ViKQorCQlyZXR1cm4gMDsKKworCWZvciAoaiA9 IDA7IGogPCBSVjY0X0lOTkVSX0VOVFJJRVM7IGorKykgeworCQlzaCA9IHNiaV9tcHRlX3h3cl9z aGlmdChqID4+IDUpOworCQl4d3IgPSAoKCh1bnNpZ25lZCBsb25nKXBhcmVudCA+PiBzaCkgJiBT QklfTVBURV9YV1JfTUFTSyk7CisJCWNoaWxkID0gU0JJX01QVEVfViB8IFNCSV9NUFRFX0w7IC8q IE49MCB1bmlmb3JtIGxlYWYgKi8KKworCQlmb3IgKHBnID0gMDsgcGcgPCBSVjY0X1BBR0VTX1BF Ul9NUFRFOyBwZysrKQorCQkJY2hpbGQgPSBzYmlfbXB0ZV9sZWFmX3NldF94d3IoY2hpbGQsIHBn LCB4d3IpOworCisJCXJ2NjRfd3JpdGVfbXB0ZShzdWIgKyBqICogUlY2NF9NUFRFX1NJWkUsIGNo aWxkKTsKKwl9CisKKwkvKiBwYXJlbnQgbGVhZiAtPiBub24tbGVhZiBwb2ludGVyIHRvIE1QVCBz dWIgdGFibGUuICovCisJcnY2NF93cml0ZV9tcHRlKHBhcmVudF9lcCwgc2JpX21wdGVfbm9ubGVh ZihzdWIpKTsKKwlyZXR1cm4gc3ViOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBydjY0X3dh bGtfYWxsb2Moc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sCisJCQkJICAgICB1bnNpZ25lZCBs b25nIHBhLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCSAgICAgdTMyICpvdXRf bGV2ZWwsCisJCQkJICAgICB1MzIgdG9wX2xldmVsKQoreworCXUzMiBsdmwsIGlkeDsKKwl1NjQg bXB0ZTsKKwl1bnNpZ25lZCBsb25nIGVwLCBzdWIsIG5ld19wYTsKKwljb25zdCBzdHJ1Y3Qgc2Jp X21wdF9tb2RlICpzY2ggPSBkb20tPm1vZGU7CisJdW5zaWduZWQgbG9uZyB0YWJsZV9wYSA9IGRv bS0+cm9vdF9wYTsKKwl1MzIgYmVzdF9sdmwgPSBydjY0X2Jlc3RfbGV2ZWwocGEsIHNpemUsIHRv cF9sZXZlbCk7CisKKworCWZvciAobHZsID0gdG9wX2xldmVsOyBsdmwgPj0gMTsgbHZsLS0pIHsK KwkJaWR4ID0gcnY2NF90YWJsZV9pZHgocGEsIGx2bCwgc2NoKTsKKwkJZXAgPSBydjY0X21wdGVf cGEodGFibGVfcGEsIGlkeCk7CisJCW1wdGUgPSBydjY0X3JlYWRfbXB0ZShlcCk7CisKKwkJaWYg KG1wdGUgJiBTQklfTVBURV9MKSB7CisJCQlpZiAobHZsID4gYmVzdF9sdmwpIHsKKwkJCQlzdWIg PSBydjY0X3NwbGl0X2xlYWYoZXApOworCQkJCWlmICghc3ViKQorCQkJCQlyZXR1cm4gMDsKKwkJ CQl0YWJsZV9wYSA9IHN1YjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCSpvdXRfbGV2ZWwgPSBs dmw7CisJCQlyZXR1cm4gZXA7CisJCX0KKworCQlpZiAoIShtcHRlICYgU0JJX01QVEVfVikpIHsK KwkJCWlmIChsdmwgPD0gYmVzdF9sdmwpIHsKKwkJCQkqb3V0X2xldmVsID0gbHZsOworCQkJCXJl dHVybiBlcDsKKwkJCX0KKwkJCS8qIEFsbG9jYXRlIGlubmVyIHRhYmxlIChhbHdheXMgNEtpQiwg YWxsIGxldmVscywgYWxsIG1vZGVzKSAqLworCQkJbmV3X3BhID0gc2JpX21wdF9wb29sX2FsbG9j KFJWNjRfVEFCTEVfU0laRSwKKwkJCQkJCSAgICBTQklfTVBUX1BBR0VfU0laRSk7CisJCQlpZiAo IW5ld19wYSkKKwkJCQlyZXR1cm4gMDsKKwkJCXJ2NjRfd3JpdGVfbXB0ZShlcCwgKHU2NClzYmlf bXB0ZV9ub25sZWFmKG5ld19wYSkpOworCQkJdGFibGVfcGEgPSBuZXdfcGE7CisJCX0KKwkJZWxz ZSB7CisJCQl0YWJsZV9wYSA9IHJ2NjRfbmV4dF90YWJsZV9wYShtcHRlKTsKKwkJfQorCX0KKwor CSpvdXRfbGV2ZWwgPSAwOworCXJldHVybiBydjY0X21wdGVfcGEodGFibGVfcGEsIHJ2NjRfdGFi bGVfaWR4KHBhLCAwLCBzY2gpKTsKK30KKworLyoKKyAqIEdlbmVyaWMgbWFwX3JhbmdlIOKAlCBz aGFyZWQgYnkgU21tcHQ0MywgU21tcHQ1MiwgU21tcHQ2NAorICoKKyAqIE1hcHMgYSByYW5nZSBb cGEsIHBhK3NpemVdIGluIHRoZSBNUFQgdGFibGUKKyAqLworc3RhdGljIGludCBfX3J2NjRfbWFw X3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAgIHVuc2lnbmVkIGxvbmcg cGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgICB1OCB4d3IsIHUzMiB0b3BfbGV2ZWwpCit7 CisJdW5zaWduZWQgbG9uZyBjdXIgPSBwYTsKKwl1bnNpZ25lZCBsb25nIGVuZCA9IHBhICsgc2l6 ZTsKKwl1bnNpZ25lZCBsb25nIGxlYWZfbXB0ZV9wYSwgbXB0ZV9yYW5nZSwgbXB0ZV9iYXNlLCBt cHRlX2VuZCwgYmF0Y2hfZW5kOworCXUzMiBsZXZlbCwgcG4wLCBpLCBwZ19maXJzdCwgcGdfbGFz dCwgcGc7CisJdTY0IG5hcG90LCBtcHRlOworCisJd2hpbGUgKGN1ciA8IGVuZCkgeworCQkvKgor CQkgKiBDaGVjayBpZiB0aGUgcmVnaW9uIHF1YWxpZmllcyBmb3IgTkFQT1QgcmFuZ2UgYW5kIHRo ZQorCQkgKiByZWdpb24gaXMgY29udGFpbmVkCisJCSAqLworCQlpZiAoKGN1ciAmIChSVjY0X05B UE9UX1NJWkUgLSAxKSkgPT0gMCAmJgorCQkJCWN1ciArIFJWNjRfTkFQT1RfU0laRSA+IGN1ciAm JgorCQkJCWN1ciArIFJWNjRfTkFQT1RfU0laRSA8PSBlbmQpIHsKKwkJCWxlYWZfbXB0ZV9wYSA9 IHJ2NjRfd2Fsa19hbGxvYyhkb20sIGN1ciwgZW5kIC0gY3VyLCAmbGV2ZWwsIHRvcF9sZXZlbCk7 CisJCQlpZiAoIWxlYWZfbXB0ZV9wYSkKKwkJCQlyZXR1cm4gU0JJX0VOT01FTTsKKworCQkJcG4w ID0gcnY2NF90YWJsZV9pZHgoY3VyLCAwLCBkb20tPm1vZGUpOworCisJCQlpZiAoIVJWNjRfTkFQ T1RfRElTQUJMRSAmJiBsZXZlbCA9PSAwICYmIChwbjAgJiAoUlY2NF9OQVBPVF9QTjBfQUxJR04g LSAxKSkgPT0gMCkgeworCQkJCW5hcG90ID0gcnY2NF9uYXBvdF9sZWFmX21wdGUoeHdyKTsKKwor CQkJCWZvciAoaSA9IDA7IGkgPCBSVjY0X05BUE9UX01QVEVfQ09VTlQ7IGkrKykKKwkJCQkJcnY2 NF93cml0ZV9tcHRlKGxlYWZfbXB0ZV9wYSArIGkgKiBSVjY0X01QVEVfU0laRSwgbmFwb3QpOwor CisJCQkJY3VyICs9IFJWNjRfTkFQT1RfU0laRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQor CQllbHNlIHsKKwkJCWxlYWZfbXB0ZV9wYSA9IHJ2NjRfd2Fsa19hbGxvYyhkb20sIGN1ciwgZW5k IC0gY3VyLCAmbGV2ZWwsIHRvcF9sZXZlbCk7CisJCQlpZiAoIWxlYWZfbXB0ZV9wYSkKKwkJCQly ZXR1cm4gU0JJX0VOT01FTTsKKwkJfQorCisJCS8qIE5vcm1hbCBwYXRoICovCisJCW1wdGVfcmFu Z2UgPSBydjY0X21wdGVfcmFuZ2UobGV2ZWwpOworCQlwZ19maXJzdCA9IHJ2NjRfdHVwbGVfaWR4 KGN1ciwgbGV2ZWwpOworCQltcHRlX2Jhc2UgPSBjdXIgJiB+KG1wdGVfcmFuZ2UgLSAxKTsKKwor CQltcHRlX2VuZCA9IG1wdGVfYmFzZSArIG1wdGVfcmFuZ2U7CisJCWlmIChtcHRlX2VuZCA8IG1w dGVfYmFzZSkKKwkJCW1wdGVfZW5kID0gfjBVTDsKKworCQliYXRjaF9lbmQgPSAoZW5kIDwgbXB0 ZV9lbmQpID8gZW5kIDogbXB0ZV9lbmQ7CisJCXBnX2xhc3QgPSBydjY0X3R1cGxlX2lkeChiYXRj aF9lbmQgLSBTQklfTVBUX1BBR0VfU0laRSwgbGV2ZWwpOworCisJCS8qCisJCSogSWYgdGhpcyBs ZXZlbC0wIE1QVEUgaXMgYSBOYXBvdCBtZW1iZXIsIGV4cGFuZCB0aGUKKwkJKiB3aG9sZSBuYXR1 cmFsbHktYWxpZ25lZCBncm91cCB0byBwbGFpbiBsZWF2ZXMgYW5kIHdyaXRlIHNhbWUKKwkJKiBw ZXJtaXNzaW9ucyB4d3IKKwkJKi8KKwkJbXB0ZSA9IHJ2NjRfcmVhZF9tcHRlKGxlYWZfbXB0ZV9w YSk7CisJCWlmIChsZXZlbCA9PSAwICYmIChtcHRlICYgKHU2NClTQklfTVBURV9OKSkgeworCQkJ cnY2NF9uYXBvdF9kZW1vdGUoZG9tLCBsZWFmX21wdGVfcGEsIGN1cik7CisJCQlzYmlfbXB0X2Zl bmNlX3NkaWQoZG9tLT5zZGlkKTsKKwkJCW1wdGUgPSBydjY0X3JlYWRfbXB0ZShsZWFmX21wdGVf cGEpOworCQl9CisJCWlmICghKG1wdGUgJiAodTY0KShTQklfTVBURV9WIHwgU0JJX01QVEVfTCkp KQorCQkJbXB0ZSA9ICh1NjQpKFNCSV9NUFRFX1YgfCBTQklfTVBURV9MKTsKKworCQlmb3IgKHBn ID0gcGdfZmlyc3Q7IHBnIDw9IHBnX2xhc3Q7IHBnKyspCisJCQltcHRlID0gc2JpX21wdGVfbGVh Zl9zZXRfeHdyKG1wdGUsIHBnLCB4d3IpOworCisJCXJ2NjRfd3JpdGVfbXB0ZShsZWFmX21wdGVf cGEsIG1wdGUpOworCisJCWN1ciA9IGJhdGNoX2VuZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwor LyoKKyAqIFBlci1tb2RlIG1tcHQgZW5jb2RpbmcKKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9u ZyBzbW1wdDQzX2VuY29kZV9tbXB0KHVuc2lnbmVkIGxvbmcgcHBuLCB1MzIgc2RpZCkKK3sKKwly ZXR1cm4gc2JpX21tcHRfZW5jb2RlKFNCSV9NTVBUX01PREVfU01NUFQ0Mywgc2RpZCwgcHBuKTsK K30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQ1Ml9lbmNvZGVfbW1wdCh1bnNpZ25lZCBs b25nIHBwbiwgdTMyIHNkaWQpCit7CisJcmV0dXJuIHNiaV9tbXB0X2VuY29kZShTQklfTU1QVF9N T0RFX1NNTVBUNTIsIHNkaWQsIHBwbik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNtbXB0 NjRfZW5jb2RlX21tcHQodW5zaWduZWQgbG9uZyBwcG4sIHUzMiBzZGlkKQoreworCXJldHVybiBz YmlfbW1wdF9lbmNvZGUoU0JJX01NUFRfTU9ERV9TTU1QVDY0LCBzZGlkLCBwcG4pOworfQorCitz dGF0aWMgdW5zaWduZWQgbG9uZyBzbW1wdDQzX3Jvb3RfdGFibGVfc2l6ZSh2b2lkKQoreworCXJl dHVybiBSVjY0X1RBQkxFX1NJWkU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNtbXB0NDNf cm9vdF90YWJsZV9hbGlnbih2b2lkKQoreworCXJldHVybiBTQklfTVBUX1BBR0VfU0laRTsKK30K Kworc3RhdGljIGJvb2wgc21tcHQ0M19wYV9pbl9yYW5nZSh1bnNpZ25lZCBsb25nIHBhLCB1bnNp Z25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBwYV9tYXggPSAxVUwgPDwgNDM7CisK KwlyZXR1cm4gKHBhIDwgcGFfbWF4ICYmIHNpemUgPD0gcGFfbWF4IC0gcGEpOworfQorCitzdGF0 aWMgdW5zaWduZWQgbG9uZyBzbW1wdDUyX3Jvb3RfdGFibGVfc2l6ZSh2b2lkKQoreworCXJldHVy biBSVjY0X1RBQkxFX1NJWkU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNtbXB0NTJfcm9v dF90YWJsZV9hbGlnbih2b2lkKQoreworCXJldHVybiBTQklfTVBUX1BBR0VfU0laRTsKK30KKwor c3RhdGljIGJvb2wgc21tcHQ1Ml9wYV9pbl9yYW5nZSh1bnNpZ25lZCBsb25nIHBhLCB1bnNpZ25l ZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBwYV9tYXggPSAxVUwgPDwgNTI7CisKKwly ZXR1cm4gKHBhIDwgcGFfbWF4ICYmIHNpemUgPD0gcGFfbWF4IC0gcGEpOworfQorCitzdGF0aWMg dW5zaWduZWQgbG9uZyBzbW1wdDY0X3Jvb3RfdGFibGVfc2l6ZSh2b2lkKQoreworCXJldHVybiBS VjY0X1JPT1RfU01NUFQ2NF9TSVpFOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzbW1wdDY0 X3Jvb3RfdGFibGVfYWxpZ24odm9pZCkKK3sKKwlyZXR1cm4gUlY2NF9ST09UX1NNTVBUNjRfU0la RTsKK30KKworc3RhdGljIGJvb2wgc21tcHQ2NF9wYV9pbl9yYW5nZSh1bnNpZ25lZCBsb25nIHBh LAorCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwkvKgorCSAqIFNtbXB0NjQgY292ZXJzIHRo ZSBmdWxsIDY0LWJpdCBQQSBzcGFjZS4KKwkgKi8KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAq IFBlci1tb2RlIG1hcF9yYW5nZSB3cmFwcGVycworICoKKyAqIFNtbXB0NDM6CisgKiBSb290IGxl dmVsIDIsIDktYml0LCAgNTEyIGVudHJpZXMsICA0S2lCIHJvb3QgTVBUIHNpemUKKyAqCisgKiBT bW1wdDUyOgorICogUm9vdCBsZXZlbCAzLCA5LWJpdCwgIDUxMiBlbnRyaWVzLCAgNEtpQiByb290 IE1QVCBzaXplCisgKgorICogU21tcHQ2NDoKKyAqIFJvb3QgbGV2ZWwgNCwgMTItYml0LCA0MDk2 IGVudHJpZXMsIDMyS2lCIHJvb3QgTVBUIHNpemUKKyAqLworCitzdGF0aWMgaW50IHNtbXB0NDNf bWFwX3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAgICB1bnNpZ25lZCBs b25nIHBhLCB1bnNpZ25lZCBsb25nIHNpemUsIHU4IHh3cikKK3sKKwlyZXR1cm4gX19ydjY0X21h cF9yYW5nZShkb20sIHBhLCBzaXplLCB4d3IsIDIpOworfQorCitzdGF0aWMgaW50IHNtbXB0NTJf bWFwX3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAgICB1bnNpZ25lZCBs b25nIHBhLCB1bnNpZ25lZCBsb25nIHNpemUsIHU4IHh3cikKK3sKKwlyZXR1cm4gX19ydjY0X21h cF9yYW5nZShkb20sIHBhLCBzaXplLCB4d3IsIDMpOworfQorCitzdGF0aWMgaW50IHNtbXB0NjRf bWFwX3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAgICB1bnNpZ25lZCBs b25nIHBhLCB1bnNpZ25lZCBsb25nIHNpemUsIHU4IHh3cikKK3sKKwlyZXR1cm4gX19ydjY0X21h cF9yYW5nZShkb20sIHBhLCBzaXplLCB4d3IsIDQpOworfQorCisvKgorICogX19ydjY0X21hcF9m dWxsX3JhbmdlKCkg4oCUIFdyaXRlIGV2ZXJ5IE1QVEUgYXQgUm9vdCBNUFQKKyAqCisgKiBXcml0 ZXMgeHdyIGludG8gZXZlcnkgcm9vdCB0YWJsZSBNUFRFIGRpcmVjdGx5IGFzIGEgbGVhZgorICog c3VwZXJwYWdlIGNvdmVyaW5nIHRoZSBtb2RlIGVudGlyZSBhZGRyZXNzYWJsZSBQQSByYW5nZS4K KyAqIE5vIGludGVybWlkaWF0ZSBNUFQgdGFibGVzIGFsbG9jYXRlZCBqdXN0IGFsbCBsZWFmIE1Q VEVzIGF0CisgKiByb290IGxldmVsLgorICovCisKK3N0YXRpYyBpbnQgX19ydjY0X21hcF9mdWxs X3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1OCB4d3IsCisJCQkJIHVuc2lnbmVk IGxvbmcgcm9vdF9lbnRyaWVzKQoreworCXUzMiBwZzsKKwl1bnNpZ25lZCBsb25nIGk7CisJdTY0 IG1wdGUgPSBTQklfTVBURV9WIHwgU0JJX01QVEVfTDsKKworCWZvciAocGcgPSAwOyBwZyA8IFJW NjRfUEFHRVNfUEVSX01QVEU7IHBnKyspCisJCW1wdGUgPSBzYmlfbXB0ZV9sZWFmX3NldF94d3Io bXB0ZSwgcGcsIHh3cik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcm9vdF9lbnRyaWVzOyBpKyspCisJ CXJ2NjRfd3JpdGVfbXB0ZShydjY0X21wdGVfcGEoZG9tLT5yb290X3BhLCBpKSwgbXB0ZSk7CisK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbW1wdDQzX21hcF9mdWxsX3JhbmdlKHN0cnVj dCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1OCB4d3IpCit7CisJcmV0dXJuIF9fcnY2NF9tYXBfZnVs bF9yYW5nZShkb20sIHh3ciwgUlY2NF9JTk5FUl9FTlRSSUVTKTsKK30KKworc3RhdGljIGludCBz bW1wdDUyX21hcF9mdWxsX3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1OCB4d3Ip Cit7CisJcmV0dXJuIF9fcnY2NF9tYXBfZnVsbF9yYW5nZShkb20sIHh3ciwgUlY2NF9JTk5FUl9F TlRSSUVTKTsKK30KKworc3RhdGljIGludCBzbW1wdDY0X21hcF9mdWxsX3JhbmdlKHN0cnVjdCBz YmlfbXB0X2RvbWFpbiAqZG9tLCB1OCB4d3IpCit7CisJcmV0dXJuIF9fcnY2NF9tYXBfZnVsbF9y YW5nZShkb20sIHh3ciwgUlY2NF9ST09UX1NNTVBUNjRfRU5UUklFUyk7Cit9CisKK3N0cnVjdCBz YmlfbXB0X21vZGUgc21tcHQ0M19tb2RlID0geworCS5uYW1lCQkJPSAiU21tcHQ0MyIsCisJLm1v ZGVfdmFsCQk9IFNCSV9NTVBUX01PREVfU01NUFQ0MywKKwkuZW5jb2RlX21tcHQJCT0gc21tcHQ0 M19lbmNvZGVfbW1wdCwKKwkubWFwX3JhbmdlCQk9IHNtbXB0NDNfbWFwX3JhbmdlLAorCS5yb290 X3RhYmxlX3NpemUJPSBzbW1wdDQzX3Jvb3RfdGFibGVfc2l6ZSwKKwkucm9vdF90YWJsZV9hbGln bgk9IHNtbXB0NDNfcm9vdF90YWJsZV9hbGlnbiwKKwkucGFfaW5fcmFuZ2UJCT0gc21tcHQ0M19w YV9pbl9yYW5nZSwKKwkubWFwX2Z1bGxfcmFuZ2UJCT0gc21tcHQ0M19tYXBfZnVsbF9yYW5nZSwK K307CisKK3N0cnVjdCBzYmlfbXB0X21vZGUgc21tcHQ1Ml9tb2RlID0geworCS5uYW1lCQkJPSAi U21tcHQ1MiIsCisJLm1vZGVfdmFsCQk9IFNCSV9NTVBUX01PREVfU01NUFQ1MiwKKwkuZW5jb2Rl X21tcHQJCT0gc21tcHQ1Ml9lbmNvZGVfbW1wdCwKKwkubWFwX3JhbmdlCQk9IHNtbXB0NTJfbWFw X3JhbmdlLAorCS5yb290X3RhYmxlX3NpemUJPSBzbW1wdDUyX3Jvb3RfdGFibGVfc2l6ZSwKKwku cm9vdF90YWJsZV9hbGlnbgk9IHNtbXB0NTJfcm9vdF90YWJsZV9hbGlnbiwKKwkucGFfaW5fcmFu Z2UJCT0gc21tcHQ1Ml9wYV9pbl9yYW5nZSwKKwkubWFwX2Z1bGxfcmFuZ2UJCT0gc21tcHQ1Ml9t YXBfZnVsbF9yYW5nZSwKK307CisKK3N0cnVjdCBzYmlfbXB0X21vZGUgc21tcHQ2NF9tb2RlID0g eworCS5uYW1lCQkJPSAiU21tcHQ2NCIsCisJLm1vZGVfdmFsCQk9IFNCSV9NTVBUX01PREVfU01N UFQ2NCwKKwkuZW5jb2RlX21tcHQJCT0gc21tcHQ2NF9lbmNvZGVfbW1wdCwKKwkubWFwX3Jhbmdl CQk9IHNtbXB0NjRfbWFwX3JhbmdlLAorCS5yb290X3RhYmxlX3NpemUJPSBzbW1wdDY0X3Jvb3Rf dGFibGVfc2l6ZSwKKwkucm9vdF90YWJsZV9hbGlnbgk9IHNtbXB0NjRfcm9vdF90YWJsZV9hbGln biwKKwkucGFfaW5fcmFuZ2UJCT0gc21tcHQ2NF9wYV9pbl9yYW5nZSwKKwkubWFwX2Z1bGxfcmFu Z2UJCT0gc21tcHQ2NF9tYXBfZnVsbF9yYW5nZSwKK307CisKKyNlbHNlIC8qIF9fcmlzY3ZfeGxl biA9PSA2NCAqLworCisvKgorICogU21tcHQzNCAoUlYzMikgIOKAlCAgMzQtYml0IHN1cGVydmlz b3IgcGh5c2ljYWwgYWRkcmVzcyAoU1BBKQorICoKKyAqICstLS0tLS0tLS0rLS0tLS0tLS0tKy0t LS0tLS0tLSstLS0tLS0tLSsKKyAqIHwgIHBuWzFdICB8ICBwblswXSAgfCAgICBwaSAgIHwgb2Zm c2V0IHwKKyAqIHwgWzMzOjI1XSB8IFsyNDoxNV0gfCBbMTQ6MTJdIHwgWzExOjBdIHwKKyAqIHwg ICAgOWIgICB8ICAgMTBiICAgfCAgICAzYiAgIHwgIDEyYiAgIHwKKyAqICstLS0tLS0tLS0rLS0t LS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLSsKKyAqCisgKi8KKworI2RlZmluZSBSVjMyX01QVEVf U0laRQkJCTRVTAorI2RlZmluZSBSVjMyX1JPT1RfRU5UUklFUwkJNTEyVQorI2RlZmluZSBSVjMy X0xFQUZfRU5UUklFUwkJMTAyNFUKKyNkZWZpbmUgUlYzMl9ST09UX1NJWkUJCQkoUlYzMl9ST09U X0VOVFJJRVMgKiBSVjMyX01QVEVfU0laRSkKKyNkZWZpbmUgUlYzMl9MRUFGX1NJWkUJCQkoUlYz Ml9MRUFGX0VOVFJJRVMgKiBSVjMyX01QVEVfU0laRSkKKworLyogcG4gZmllbGQgd2lkdGhzICov CisjZGVmaW5lIFJWMzJfUE4xX0JJVFMJCQk5VQorI2RlZmluZSBSVjMyX1BOMF9CSVRTCQkJMTBV CisKKyNkZWZpbmUgUlYzMl9OVU1QR0lOUkFOR0UJCTNVCisjZGVmaW5lIFJWMzJfUEFHRVNfUEVS X01QVEUJCSgxVSA8PCBSVjMyX05VTVBHSU5SQU5HRSkKKyNkZWZpbmUgUlYzMl9QQUdFU19QRVJf TVBURV9NQVNLCShSVjMyX1BBR0VTX1BFUl9NUFRFIC0gMSkKKworLyogUmFuZ2UgY292ZXJlZCBi eSBvbmUgTVBURSBhdCBlYWNoIGxldmVsICovCisjZGVmaW5lIFJWMzJfTEVBRl9SQU5HRQkJCShS VjMyX1BBR0VTX1BFUl9NUFRFICogU0JJX01QVF9QQUdFX1NJWkUpCisjZGVmaW5lIFJWMzJfUk9P VF9SQU5HRQkJCShSVjMyX0xFQUZfUkFOR0UgPDwgUlYzMl9QTjBfQklUUykKKworLyogTkFQT1Qg Y29uc3RhbnRzIChHPTYpICovCisjZGVmaW5lIFJWMzJfTkFQT1RfRwkJCTZVCisjZGVmaW5lIFJW MzJfTkFQT1RfR19TSElGVAkJMTJVCisjZGVmaW5lIFJWMzJfTkFQT1RfQ09VTlQJCSgxVSA8PCAo UlYzMl9OQVBPVF9HICsgMSkpCisjZGVmaW5lIFJWMzJfTkFQT1RfU0laRQkJCShSVjMyX05BUE9U X0NPVU5UICogUlYzMl9MRUFGX1JBTkdFKQorI2RlZmluZSBSVjMyX05BUE9UX1BOMF9BTElHTgkJ UlYzMl9OQVBPVF9DT1VOVAorCisvKgorICogU3dpdGggdG8gZGlzYWJsZSBOQVBPVCBjb21wYWN0 aW9uIG9mIE1QVEUgZW50cmllcyB3aGlsZSB3cml0aW5nLgorICovCisjZGVmaW5lIFJWMzJfTkFQ T1RfRElTQUJMRQkwCisKKy8qCisgKiBydjMyX3BuMV90YWJsZV9pZHgoKSDigJQgZXh0cmFjdCBw blsxXSBmcm9tIGEgU1BBLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBydjMyX3BuMV90YWJsZV9p ZHgodW5zaWduZWQgbG9uZyBwYSkKK3sKKwlyZXR1cm4gKChwYSA+PiAyNSkgJiAweDFGRlUpOwor fQorCisvKgorICogcnYzMl9wbjBfdGFibGVfaWR4KCkg4oCUIGV4dHJhY3QgcG5bMF0gZnJvbSBh IFNQQS4KKyAqLworc3RhdGljIGlubGluZSB1MzIgcnYzMl9wbjBfdGFibGVfaWR4KHVuc2lnbmVk IGxvbmcgcGEpCit7CisJcmV0dXJuICgocGEgPj4gMTUpICYgMHgzRkZVKTsKK30KKworc3RhdGlj IGlubGluZSB1MzIgcnYzMl90dXBsZV9pZHhfc2hpZnQodTMyIGxldmVsKQoreworCXJldHVybiAo bGV2ZWwgPT0gMCkgPyBTQklfTVBUX1BBR0VfU0hJRlQgOiBTQklfTVBUX1BBR0VfU0hJRlQgKyBS VjMyX1BOMF9CSVRTOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBydjMyX3R1cGxlX2lkeCh1bnNp Z25lZCBsb25nIHBhLCB1MzIgbGV2ZWwpCit7CisJcmV0dXJuICgocGEgPj4gcnYzMl90dXBsZV9p ZHhfc2hpZnQobGV2ZWwpKSAmIFJWMzJfUEFHRVNfUEVSX01QVEVfTUFTSyk7Cit9CisKKy8qIEJ5 dGVzIGNvdmVyZWQgYnkgb25lIE1QVEUgYXQgdGhlIGdpdmVuIGxldmVsICovCitzdGF0aWMgaW5s aW5lIHVuc2lnbmVkIGxvbmcgcnYzMl9tcHRlX3JhbmdlKHUzMiBsZXZlbCkKK3sKKwlyZXR1cm4g KGxldmVsID09IDApID8gUlYzMl9MRUFGX1JBTkdFIDogUlYzMl9ST09UX1JBTkdFOworfQorCisv KgorICogUlYzMiBNUFRFIFJlYWQvV3JpdGUgZnVuY3Rpb25zCisgKi8KK3N0YXRpYyBpbmxpbmUg dTMyIHJ2MzJfcmVhZF9tcHRlKHVuc2lnbmVkIGxvbmcgcGEpCit7CisJcmV0dXJuICoodm9sYXRp bGUgdTMyICopcGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydjMyX3dyaXRlX21wdGUodW5z aWduZWQgbG9uZyBwYSwgdTMyIHYpCit7CisJKih2b2xhdGlsZSB1MzIgKilwYSA9IHY7Cit9CisK K3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBydjMyX21wdGVfcGEodW5zaWduZWQgbG9uZyB0 YWJsZV9wYSwgdTMyIGlkeCkKK3sKKwlyZXR1cm4gKHRhYmxlX3BhICsgaWR4ICogUlYzMl9NUFRF X1NJWkUpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcnYzMl9uZXh0X3RhYmxl X3BhKHUzMiBtcHRlKQoreworCXJldHVybiAoKG1wdGUgPj4gU0JJX01QVEVfUFBOX1NISUZUKSA8 PCBTQklfTVBUX1BBR0VfU0hJRlQpOworfQorCisvKgorICogR2VuZXJhdGUgTmFwb3QgTGVhZiBN UFRFCisgKgorICogQ29uc3RydWN0cyBvbmUgTVBURSB2YWx1ZSB1c2VkIGZvciBhbGwgUlYzMl9O QVBPVF9DT1VOVCBlbnRyaWVzCisgKiBpbiBhIE5BUE9UIGdyb3VwLgorICoKKyAqIEFsbCBNUFRF cyBpbiB0aGUgZ3JvdXAgYXJlIGlkZW50aWNhbAorICovCitzdGF0aWMgaW5saW5lIHUzMiBydjMy X25hcG90X2xlYWYodTggeHdyKQoreworCXUzMiBtcHRlID0gU0JJX01QVEVfViB8IFNCSV9NUFRF X0wgfCBTQklfTVBURV9OOworCisJbXB0ZSA9IHNiaV9tcHRlX2xlYWZfc2V0X3h3cihtcHRlLCAw LCB4d3IpOworCW1wdGUgfD0gKCh1MzIpUlYzMl9OQVBPVF9HIDw8IFJWMzJfTkFQT1RfR19TSElG VCk7CisKKwlyZXR1cm4gbXB0ZTsKK30KKworLyogR2V0IHRoZSB4d3IgZnJvbSBhIE5hcG90IGxl YWYuICovCitzdGF0aWMgaW5saW5lIHU4IHJ2MzJfbmFwb3RfeHdyKHUzMiBtcHRlKQoreworCXJl dHVybiAoKG1wdGUgPj4gU0JJX01QVEVfWFdSX0JBU0UpICYgU0JJX01QVEVfWFdSX01BU0spOwor fQorCisvKgorICogcnYzMl9uYXBvdF9kZW1vdGUoKSDigJQgQ29udmVydCBhIE5hcG90IE1QVEUg Z3JvdXAgaW50byBSVjY0X05BUE9UX01QVEVfQ09VTlQKKyAqIG5vcm1hbChOb24tTmFwb3QpIE1Q VEUgY2FycnlpbmcgdGhlIFNBTUUgcGVybWlzc2lvbi4KKyAqCisgKiBsZWFmX21wdGVfcGEgaXMg YW55IG9mIHRoZSBncm91cCBNUFRFIFBBCisgKi8KK3N0YXRpYyB2b2lkIHJ2MzJfbmFwb3RfZGVt b3RlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBs ZWFmX21wdGVfcGEsIHVuc2lnbmVkIGxvbmcgcGEpCit7CisJdTMyIHBnLCBsZWFmLCBpOworCXVu c2lnbmVkIGxvbmcgZ3JwX2Jhc2U7CisKKwl1OCB4d3IgPSBydjMyX25hcG90X3h3cihydjMyX3Jl YWRfbXB0ZShsZWFmX21wdGVfcGEpKTsKKwl1MzIgcG4wID0gcnYzMl9wbjBfdGFibGVfaWR4KHBh KTsKKworCWdycF9iYXNlID0gbGVhZl9tcHRlX3BhIC0gKHBuMCAmIChSVjMyX05BUE9UX0NPVU5U IC0gMSkpICogUlYzMl9NUFRFX1NJWkU7CisKKwlsZWFmID0gKFNCSV9NUFRFX1YgfCBTQklfTVBU RV9MKTsgLyogTj0wICovCisKKwlmb3IgKHBnID0gMDsgcGcgPCBSVjMyX1BBR0VTX1BFUl9NUFRF OyBwZysrKQorCQlsZWFmID0gc2JpX21wdGVfbGVhZl9zZXRfeHdyKGxlYWYsIHBnLCB4d3IpOwor CisJZm9yIChpID0gMDsgaSA8IFJWMzJfTkFQT1RfQ09VTlQ7IGkrKykKKwkJcnYzMl93cml0ZV9t cHRlKGdycF9iYXNlICsgaSAqIFJWMzJfTVBURV9TSVpFLCBsZWFmKTsKK30KKworc3RhdGljIGlu bGluZSB1MzIgcnYzMl9iZXN0X2xldmVsKHVuc2lnbmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcg c2l6ZSkKK3sKKwlpZiAoc2l6ZSA+PSBSVjMyX1JPT1RfUkFOR0UgJiYgKHBhICYgKFJWMzJfUk9P VF9SQU5HRSAtIDEpKSA9PSAwKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKgor ICogTVBUIFdhbGsgZm9yIFJWMzIgU21tcHQ0MworICoKKyAqIFJldHVybnMgdGhlIFBBIG9mIHRo ZSBNUFRFIGNvdmVyaW5nIHBhCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJ2MzJfd2Fsa19h bGxvYyhzdHJ1Y3Qgc2JpX21wdF9kb21haW4gKmRvbSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcg cGEsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJICAgICB1MzIgKm91dF9sZXZl bCkKK3sKKwl1bnNpZ25lZCBsb25nIHJvb3RfZXAgPSBydjMyX21wdGVfcGEoZG9tLT5yb290X3Bh LCBydjMyX3BuMV90YWJsZV9pZHgocGEpKTsKKwl1MzIgcm9vdF9tcHRlID0gcnYzMl9yZWFkX21w dGUocm9vdF9lcCk7CisJdTMyIGJlc3QgPSBydjMyX2Jlc3RfbGV2ZWwocGEsIHNpemUpOworCXVu c2lnbmVkIGxvbmcgbGVhZl9wYTsKKworCWlmIChyb290X21wdGUgJiAodTMyKVNCSV9NUFRFX0wp IHsKKwkJLyogRXhpc3Rpbmcgcm9vdC1sZXZlbCBsZWFmICovCisJCSpvdXRfbGV2ZWwgPSAxOwor CQlyZXR1cm4gcm9vdF9lcDsKKwl9CisKKwlpZiAoIShyb290X21wdGUgJiAodTMyKVNCSV9NUFRF X1YpICYmIGJlc3QgPT0gMSkgeworCQkvKiBuZXcgZW50cnksIHJhbmdlIGZpdHMgYXQgcm9vdCBs ZXZlbCBzbyBza2lwIGxlYWYgYWxsb2NhdGlvbiAqLworCQkqb3V0X2xldmVsID0gMTsKKwkJcmV0 dXJuIHJvb3RfZXA7CisJfQorCisJaWYgKCEocm9vdF9tcHRlICYgKHUzMilTQklfTVBURV9WKSkg eworCQkvKiBBbGxvY2F0ZSBsZWFmIHRhYmxlIGZyb20gZ2xvYmFsIGhlYXAgKi8KKwkJbGVhZl9w YSA9IHNiaV9tcHRfcG9vbF9hbGxvYyhSVjMyX0xFQUZfU0laRSwKKwkJCQkJICAgICBTQklfTVBU X1BBR0VfU0laRSk7CisJCWlmICghbGVhZl9wYSkKKwkJCXJldHVybiAwOworCisJCXJ2MzJfd3Jp dGVfbXB0ZShyb290X2VwLCBzYmlfbXB0ZV9ub25sZWFmKGxlYWZfcGEpKTsKKwkJKm91dF9sZXZl bCA9IDA7CisKKwkJcmV0dXJuIHJ2MzJfbXB0ZV9wYShsZWFmX3BhLCBydjMyX3BuMF90YWJsZV9p ZHgocGEpKTsKKwl9CisKKwkvKiBWYWxpZCBub24tbGVhZjogZm9sbG93IFBQTiB0byBleGlzdGlu ZyBsZWFmIHRhYmxlICovCisJKm91dF9sZXZlbCA9IDA7CisKKwlyZXR1cm4gcnYzMl9tcHRlX3Bh KHJ2MzJfbmV4dF90YWJsZV9wYShydjMyX3JlYWRfbXB0ZShyb290X2VwKSksIHJ2MzJfcG4wX3Rh YmxlX2lkeChwYSkpOworfQorCisvKgorICogc21tcHQzNF9tYXBfcmFuZ2UoKTogTWFwcyBhIHJh bmdlIFtwYSwgcGErc2l6ZV0gaW4gdGhlIE1QVCB0YWJsZQorICovCisKK3N0YXRpYyBpbnQgc21t cHQzNF9tYXBfcmFuZ2Uoc3RydWN0IHNiaV9tcHRfZG9tYWluICpkb20sCisJCQkgICAgIHVuc2ln bmVkIGxvbmcgcGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdTggeHdyKQoreworCXVuc2lnbmVkIGxv bmcgY3VyID0gcGE7CisJdW5zaWduZWQgbG9uZyBlbmQgPSBwYSArIHNpemU7CisJdW5zaWduZWQg bG9uZyBsZWFmX21wdGVfcGE7CisJdW5zaWduZWQgbG9uZyBtcHRlX3JhbmdlLCBtcHRlX2Jhc2Us IG1wdGVfZW5kLCBiYXRjaF9lbmQ7CisJdTMyIGxldmVsLCBwZ19maXJzdCwgcGdfbGFzdCwgcGcs IGk7CisJdTMyIG1wdGUsIG5hcG90OworCisJd2hpbGUgKGN1ciA8IGVuZCkgeworCQkvKgorCQkg KiBDaGVjayBpZiB0aGUgcmVnaW9uIHF1YWxpZmllcyBmb3IgTkFQT1QgcmFuZ2UgYW5kIHRoZQor CQkgKiByZWdpb24gaXMgY29udGFpbmVkCisJCSAqLworCQlpZiAoKGN1ciAmIChSVjMyX05BUE9U X1NJWkUgLSAxKSkgPT0gMCAmJgorCQkJY3VyICsgUlYzMl9OQVBPVF9TSVpFID4gY3VyICYmCisJ CQljdXIgKyBSVjMyX05BUE9UX1NJWkUgPD0gZW5kKSB7CisJCQlsZWFmX21wdGVfcGEgPSBydjMy X3dhbGtfYWxsb2MoZG9tLCBjdXIsIGVuZCAtIGN1ciwgJmxldmVsKTsKKwkJCWlmICghbGVhZl9t cHRlX3BhKQorCQkJCXJldHVybiBTQklfRU5PTUVNOworCisJCQlpZiAoIVJWMzJfTkFQT1RfRElT QUJMRSAmJiBsZXZlbCA9PSAwICYmIChydjMyX3BuMF90YWJsZV9pZHgoY3VyKSAmIChSVjMyX05B UE9UX1BOMF9BTElHTiAtIDEpKSA9PSAwKSB7CisJCQkJbmFwb3QgPSBydjMyX25hcG90X2xlYWYo eHdyKTsKKworCQkJCWZvciAoaSA9IDA7IGkgPCBSVjMyX05BUE9UX0NPVU5UOyBpKyspCisJCQkJ CXJ2MzJfd3JpdGVfbXB0ZShsZWFmX21wdGVfcGEgKyBpICogUlYzMl9NUFRFX1NJWkUsIG5hcG90 KTsKKworCQkJCWN1ciArPSBSVjMyX05BUE9UX1NJWkU7CisKKwkJCQljb250aW51ZTsKKwkJCX0K KwkJfSBlbHNlIHsKKwkJCWxlYWZfbXB0ZV9wYSA9IHJ2MzJfd2Fsa19hbGxvYyhkb20sIGN1ciwg ZW5kIC0gY3VyLCAmbGV2ZWwpOworCQkJaWYgKCFsZWFmX21wdGVfcGEpCisJCQkJcmV0dXJuIFNC SV9FTk9NRU07CisJCX0KKworCQkvKiBOb3JtYWwgcGF0aCAqLworCQltcHRlX3JhbmdlID0gcnYz Ml9tcHRlX3JhbmdlKGxldmVsKTsKKwkJcGdfZmlyc3QgPSBydjMyX3R1cGxlX2lkeChjdXIsIGxl dmVsKTsKKwkJbXB0ZV9iYXNlID0gY3VyICYgfihtcHRlX3JhbmdlIC0gMVVMKTsKKwkJbXB0ZV9l bmQgPSBtcHRlX2Jhc2UgKyBtcHRlX3JhbmdlOworCQliYXRjaF9lbmQgPSAoZW5kIDwgbXB0ZV9l bmQpID8gZW5kIDogbXB0ZV9lbmQ7CisJCXBnX2xhc3QgPSBydjMyX3R1cGxlX2lkeChiYXRjaF9l bmQgLSBTQklfTVBUX1BBR0VfU0laRSwgbGV2ZWwpOworCisJCS8qCisJCSogSWYgdGhpcyBsZXZl bC0wIE1QVEUgaXMgYSBOYXBvdCBtZW1iZXIsIGV4cGFuZCB0aGUKKwkJKiB3aG9sZSBuYXR1cmFs bHktYWxpZ25lZCBncm91cCB0byBwbGFpbiBsZWF2ZXMgYW5kIHdyaXRlIHNhbWUKKwkJKiBwZXJt aXNzaW9ucyB4d3IKKwkJKi8KKwkJbXB0ZSA9IHJ2MzJfcmVhZF9tcHRlKGxlYWZfbXB0ZV9wYSk7 CisJCWlmIChsZXZlbCA9PSAwICYmIChtcHRlICYgKHUzMilTQklfTVBURV9OKSkgeworCQkJcnYz Ml9uYXBvdF9kZW1vdGUoZG9tLCBsZWFmX21wdGVfcGEsIGN1cik7CisJCQlzYmlfbXB0X2ZlbmNl X3NkaWQoZG9tLT5zZGlkKTsKKwkJCW1wdGUgPSBydjMyX3JlYWRfbXB0ZShsZWFmX21wdGVfcGEp OworCQl9CisJCWlmICghKG1wdGUgJiAodTMyKShTQklfTVBURV9WIHwgU0JJX01QVEVfTCkpKQor CQkJbXB0ZSA9IFNCSV9NUFRFX1YgfCBTQklfTVBURV9MOworCisJCWZvciAocGcgPSBwZ19maXJz dDsgcGcgPD0gcGdfbGFzdDsgcGcrKykKKwkJCW1wdGUgPSBzYmlfbXB0ZV9sZWFmX3NldF94d3Io bXB0ZSwgcGcsIHh3cik7CisKKwkJcnYzMl93cml0ZV9tcHRlKGxlYWZfbXB0ZV9wYSwgbXB0ZSk7 CisJCWN1ciA9IGJhdGNoX2VuZDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG1tcHQg ZW5jb2RpbmcKKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgc21tcHQzNF9lbmNvZGVfbW1wdCh1 bnNpZ25lZCBsb25nIHBwbiwgdTMyIHNkaWQpCit7CisJcmV0dXJuIHNiaV9tbXB0X2VuY29kZShT QklfTU1QVF9NT0RFX1NNTVBUMzQsIHNkaWQsIHBwbik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBs b25nIHNtbXB0MzRfcm9vdF90YWJsZV9zaXplKHZvaWQpCit7CisJcmV0dXJuIFJWMzJfUk9PVF9T SVpFOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzbW1wdDM0X3Jvb3RfdGFibGVfYWxpZ24o dm9pZCkKK3sKKwlyZXR1cm4gU0JJX01QVF9QQUdFX1NJWkU7Cit9CisKK3N0YXRpYyBib29sIHNt bXB0MzRfcGFfaW5fcmFuZ2UodW5zaWduZWQgbG9uZyBwYSwgdW5zaWduZWQgbG9uZyBzaXplKQor eworCS8qCisJICogUmV0dXJuIHRydWUgc2luY2UgMSA8PCAzNCB3aWwgYmUgVUIKKwkgKiBpbiBS VjMyIGNhc2UgYW5kIGFueXdheXMgdmFyaWFibGVzIGFyZSBsaW1pdGVkIGJ5IFJWMzIKKwkgKiBh cmNoaXRlY3R1cmFsIHdpZHRoCisJICovCisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIHNt bXB0MzRfbWFwX2Z1bGxfcmFuZ2UoKSDigJQgV3JpdGUgZXZlcnkgTVBURSBhdCBSb290IE1QVAor ICoKKyAqIFdyaXRlcyB4d3IgaW50byBldmVyeSByb290IHRhYmxlIE1QVEUgZGlyZWN0bHkgYXMg YSBsZWFmCisgKiBzdXBlcnBhZ2UgY292ZXJpbmcgdGhlIG1vZGUgZW50aXJlIGFkZHJlc3NhYmxl IFBBIHJhbmdlLgorICogTm8gaW50ZXJtaWRpYXRlIE1QVCB0YWJsZXMgYWxsb2NhdGVkIGp1c3Qg YWxsIGxlYWYgTVBURXMgYXQKKyAqIHJvb3QgbGV2ZWwuCisgKi8KKworc3RhdGljIGludCBzbW1w dDM0X21hcF9mdWxsX3JhbmdlKHN0cnVjdCBzYmlfbXB0X2RvbWFpbiAqZG9tLCB1OCB4d3IpCit7 CisJdTMyIG1wdGUgPSBTQklfTVBURV9WIHwgU0JJX01QVEVfTDsKKwl1MzIgcGcsIGk7CisKKwlm b3IgKHBnID0gMDsgcGcgPCBSVjMyX1BBR0VTX1BFUl9NUFRFOyBwZysrKQorCQltcHRlID0gc2Jp X21wdGVfbGVhZl9zZXRfeHdyKG1wdGUsIHBnLCB4d3IpOworCisJZm9yIChpID0gMDsgaSA8IFJW MzJfUk9PVF9FTlRSSUVTOyBpKyspCisJCXJ2MzJfd3JpdGVfbXB0ZShydjMyX21wdGVfcGEoZG9t LT5yb290X3BhLCBpKSwgbXB0ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNiaV9tcHRf bW9kZSBzbW1wdDM0X21vZGUgPSB7CisJLm5hbWUgPSAiU21tcHQzNCIsCisJLm1vZGVfdmFsID0g U0JJX01NUFRfTU9ERV9TTU1QVDM0LAorCS5lbmNvZGVfbW1wdCA9IHNtbXB0MzRfZW5jb2RlX21t cHQsCisJLm1hcF9yYW5nZSA9IHNtbXB0MzRfbWFwX3JhbmdlLAorCS5yb290X3RhYmxlX3NpemUg PSBzbW1wdDM0X3Jvb3RfdGFibGVfc2l6ZSwKKwkucm9vdF90YWJsZV9hbGlnbiA9IHNtbXB0MzRf cm9vdF90YWJsZV9hbGlnbiwKKwkucGFfaW5fcmFuZ2UgPSBzbW1wdDM0X3BhX2luX3JhbmdlLAor CS5tYXBfZnVsbF9yYW5nZSA9IHNtbXB0MzRfbWFwX2Z1bGxfcmFuZ2UsCit9OworCisjZW5kaWYg LyogX19yaXNjdl94bGVuID09IDMyICovCi0tIAoyLjUxLjAKCgotLSAKb3BlbnNiaSBtYWlsaW5n IGxpc3QKb3BlbnNiaUBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQu b3JnL21haWxtYW4vbGlzdGluZm8vb3BlbnNiaQo=