ZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZS5hbSBiL3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWI4ZmE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsOCBAQAoraW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLnZhcnMKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5ydWxlcworCitTVUJESVJTID0gYXBwcyBpbmNsdWRlIGxpYiB0ZXN0bGliIHdpdGhzY3RwCisKK2lmIEJVSUxEX1RFU1RTCitTVUJESVJTICs9IGZ1bmNfdGVzdHMKK2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvYXBwcy8uZ2l0aWdub3JlIGIvc3JjL2FwcHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2JhMDE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2FwcHMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDEwIEBACitiaW5keF90ZXN0CitteWZ0cAorbmFnbGVfcmN2CituYWdsZV9zbmQKK3BlZWxfY2xpZW50CitwZWVsX3NlcnZlcgorc2N0cF9kYXJuCitzY3RwX3N0YXR1cworc2N0cF90ZXN0CitzY3RwX3hjb25uZWN0CmRpZmYgLS1naXQgYS9zcmMvYXBwcy9NYWtlZmlsZS5hbSBiL3NyYy9hcHBzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMzIzMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYXBwcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQyIEBACisjIEluY2x1ZGUgdGhlc2UgdHdvIGluIGFsbCB0aGUgTWFrZWZpbGUuYW0ncyEhIQoraW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLnZhcnMKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5ydWxlcworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmRpcnMKKworIyBHZW5lcmFsIGNvbXBpbGF0aW9uIGZsYWdzCitBTV9DUFBGTEFHUyA9IC1JLiAtSSQodG9wX2J1aWxkZGlyKS9zcmMvaW5jbHVkZSAtSSQodG9wX3NyY2Rpcikvc3JjL3Rlc3RsaWIgXAorICAgICAgICAgICAgICAtZyAtTzIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcyBcCisgICAgICAgICAgICAgIC1XaW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24KKworQU1fTERGTEFHUyA9IAorCitMREFERCA9ICQodG9wX2J1aWxkZGlyKS9zcmMvdGVzdGxpYi9saWJzY3RwdXRpbC5sYSBcCisJJCh0b3BfYnVpbGRkaXIpL3NyYy9saWIvbGlic2N0cC5sYQorCisjIHByb2dyYW1zIHRvIGJlIGluc3RhbGxlZCB3aXRoIHRoZSBkaXN0cml1YnV0aW9uCitiaW5fUFJPR1JBTVMgPSBzY3RwX2Rhcm4gc2N0cF90ZXN0IHNjdHBfc3RhdHVzCisKKyMgVGVzdCBwcm9ncmFtcyBhbmQgbGlicmFyaWVzIHRvIGJ1aWxkCitub2luc3RfUFJPR1JBTVMgPSBiaW5keF90ZXN0IG5hZ2xlX3NuZCBuYWdsZV9yY3YgbXlmdHAgc2N0cF94Y29ubmVjdCBcCisJcGVlbF9zZXJ2ZXIgcGVlbF9jbGllbnQgc2N0cF90ZXN0IHNjdHBfc3RhdHVzCisKKyQodG9wX2J1aWxkZGlyKS9zcmMvbGliL2xpYnNjdHAubGE6CisJJChNQUtFKSAtQyAkKHRvcF9idWlsZGRpcikvc3JjL2xpYiBsaWJzY3RwLmxhCisKKyQodG9wX2J1aWxkZGlyKS9zcmMvdGVzdGxpYi9saWJzY3RwdXRpbC5sYToKKwkkKE1BS0UpIC1DICQodG9wX2J1aWxkZGlyKS9zcmMvdGVzdGxpYiBsaWJzY3RwdXRpbC5sYQorCisjIFNwZWNpZnlpbmcgdGhlIHNvdXJjZXMKK2JpbmR4X3Rlc3RfU09VUkNFUyA9IGJpbmR4X3Rlc3QuYworc2N0cF9kYXJuX1NPVVJDRVMgPSBzY3RwX2Rhcm4uYyBzY3RwX2Rhcm4uaAorc2N0cF90ZXN0X1NPVVJDRVMgPSBzY3RwX3Rlc3QuYworc2N0cF9zdGF0dXNfU09VUkNFUyA9IHNjdHBfc3RhdHVzLmMKK25hZ2xlX3Jjdl9TT1VSQ0VTID0gbmFnbGVfcmN2LmMgCituYWdsZV9zbmRfU09VUkNFUyA9IG5hZ2xlX3NuZC5jIAorbXlmdHBfU09VUkNFUyA9IG15ZnRwLmMKK3NjdHBfeGNvbm5lY3RfU09VUkNFUyA9IHNjdHBfeGNvbm5lY3QuYworcGVlbF9zZXJ2ZXJfU09VUkNFUyA9IHBlZWxfc2VydmVyLmMKK3BlZWxfY2xpZW50X1NPVVJDRVMgPSBwZWVsX2NsaWVudC5jCisKKyMgVHV0b3JpYWxzCitwa2dkb2NfREFUQSA9IHNjdHBfZGFybi5jIHNjdHBfZGFybi5oIHNjdHBfdGVzdC5jIHNjdHBfc3RhdHVzLmMKZGlmZiAtLWdpdCBhL3NyYy9hcHBzL2JpbmR4X3Rlc3QuYyBiL3NyYy9hcHBzL2JpbmR4X3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjNkZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2FwcHMvYmluZHhfdGVzdC5jCkBAIC0wLDAgKzEsMTM0IEBACisgIC8qIC0qLWMtKi0KKyAgKioKKyAgKiogc2N0cC10b29sczogQW5vdGhlciBiaW5keCB0ZXN0LgorICAqKiAKKyAgKiogJElkOiBiaW5keF90ZXN0LmMsdiAxLjEuMS4xIDIwMDIvMDgvMDYgMjI6MzE6MDUgaW5ha3kgRXhwICQKKyAgKioKKyAgKiogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHUEwgdjIuMCBhcyBkZXNjcmliZWQgaW4KKyAgKiogJHRvcF9zcmNkaXIvQ09QWUlORy4gCisgICoqCisgICoqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDMKKyAgKiogKEMpIDIwMDIgSW50ZWwgQ29ycG9yYXRpb24KKyAgKiogICAgSfFha3kgUOlyZXotR29ueuFsZXogPGluYWt5LnBlcmV6LWdvbnphbGV6QGludGVsLmNvbT46CisgICoqICAgIFNyaWRoYXIgU2FtdWRyYWxhIDxzcmlAdXMuaWJtLmNvbT4KKyAgKi8KKworI2RlZmluZSBfR05VX1NPVVJDRSAvKiBHTlUgZXh0ZW5zaW9ucyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+ICAgICAvKiBtYWxsb2MoKSAqLworI2luY2x1ZGUgPGFycGEvaW5ldC5oPiAgLyogaW5ldF9wdG9uKCkgKi8KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4gLyogc29ja2V0KCkgKi8KKyNpbmNsdWRlIDxzdGRpby5oPiAgICAgIC8qIGZwcmludGYgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+IC8qIHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAvKiBjbG9zZSgpICovCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAvKiBzdHJjaHIoKSAqLworI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPiAgIC8qIGJpbmR4KCkgKi8KKworICAvKiBHbG9iYWwgc3R1ZmYgKi8KKworI2lmbmRlZiBJUFBST1RPX1NDVFAgCisjZGVmaW5lIElQUFJPVE9fU0NUUCAxMzIKKyNlbmRpZgorCisgIC8qISBNYWluIGZ1bmN0aW9uOiBpbml0aWFsaXplLCBzZXR1cCwgcnVuIHRoZSBtYWluIGxvb3AKKyAgKioKKyAgKioKKyAgKi8KKworaW50IG1haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl2b2lkICphZGRyX2J1ZiwgKmJ1Zl9wdHI7CisJdm9pZCAqYWRkcl9idWZfc2l6ZSA9IDA7CisJc2l6ZV90IGFkZHJzLCBjbnQ7CisJaW50IHNkLCByZXN1bHQsIHBvcnQ7CisJaW50IGRvbWFpbiA9IFBGX0lORVQ2OworCisJaWYgKGFyZ2MgPCAzKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlVzYWdlOiBiaW5keF90ZXN0IFBPUlQgSVBBRERSMSBbSVBBRERSMiBbLi4uXV1cbiIpOworCQlyZXR1cm4gMTsKKwl9CisgIAorCXBvcnQgPSBhdG9pKGFyZ3ZbMV0pOworCXByaW50ZigiYmluZHhfdGVzdDogSU5GTzogUG9ydCBpcyAlZFxuIiwgcG9ydCk7CisKKwkvKiBBbGxvY2F0ZSB0aGUgbWF4aW11bSBzcGFjZSBmb3IgdGhlIHNwZWNpZmllZCBuby4gb2YgIGFkZHJlc3Nlcy4KKwkgKiBBc3N1bWUgYWxsIG9mIHRoZW0gYXJlIHY2IGFkZHJlc3Nlcy4KKwkgKi8KKwlhZGRyX2J1ZiA9IG1hbGxvYygoYXJnYyAtMikgKiBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCWlmIChhZGRyX2J1ZiA9PSBOVUxMKSB7CisJCXBlcnJvcigiYmluZHhfdGVzdDogRVJST1I6IGFkZHIgYnVmIGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAxOworCX0KKyAgCisJLyogR2V0IHRoZSBhZGRyZXNzZXMgZnJvbSB0aGUgY21kIGxpbmUgKi8KKwlhZGRycyA9IDA7ICAvKiBoZWFsdGh5IGFkZHJlc3MgaXRlcmF0b3IgW2FuZCB0b3RhbCBjb3VudGVyXSAqLworCWNudCA9IDI7ICAgIC8qIGFyZ3VtZW50IGl0ZXJhdG9yICovCisJYnVmX3B0ciA9IGFkZHJfYnVmOworCXdoaWxlIChjbnQgPCBhcmdjKSB7CisJCXByaW50ZigiYmluZHhfdGVzdDogSU5GTzogQXJnICV6dTogJXMiLCBjbnQsIGFyZ3ZbY250XSk7CisJCWZmbHVzaChzdGRlcnIpOworCQlpZiAoc3RyY2hyKGFyZ3ZbY250XSwgJzonKSkgeworCQkJc3RydWN0IHNvY2thZGRyX2luNiAqc2E2OyAKKworCQkJc2E2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilidWZfcHRyOworCQkJcHJpbnRmKCIgSVB2NiBhZGRyZXNzIG51bWJlciAlenUiLCBhZGRycyk7CisJCQlzYTYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCQlzYTYtPnNpbjZfcG9ydCA9IHBvcnQ7CisJCQlpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBhcmd2W2NudF0sICZzYTYtPnNpbjZfYWRkcikpIHsKKwkJCQlhZGRycysrOworCQkJCWFkZHJfYnVmX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQkJCWJ1Zl9wdHIgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQkJfSBlbHNlCisJCQkJcHJpbnRmKCIgZXJyb3IiKTsKKwkJfSBlbHNlIGlmIChzdHJjaHIoYXJndltjbnRdLCAnLicpKSB7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhOyAKKworCQkJZG9tYWluID0gUEZfSU5FVDsKKwkJCXNhID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWJ1Zl9wdHI7CisJCQlwcmludGYgKCIgSVB2NCBhZGRyZXNzIG51bWJlciAlenUiLCBhZGRycyk7CisJCQlzYS0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQlzYS0+c2luX3BvcnQgPSBwb3J0OworCQkJaWYgKGluZXRfcHRvbiAoQUZfSU5FVCwgYXJndltjbnRdLCAmc2EtPnNpbl9hZGRyKSkgeworCQkJCWFkZHJzKys7CisJCQkJYWRkcl9idWZfc2l6ZSArPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwkJCQlidWZfcHRyICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJfSBlbHNlCisJCQkJcHJpbnRmICgiIGVycm9yIik7CisJCX0gZWxzZQorCQkJcHJpbnRmICgiIFVua25vd24iKTsKKwkJcHV0Y2hhciAoJ1xuJyk7CisJCWNudCsrOworCX0KKworCXByaW50ZiAoImJpbmR4X3Rlc3Q6IElORk86IEdvdCAlenUgYWRkcnNcbiIsIGFkZHJzKTsKKyAgCisJLyogQ3JlYXRlIHRoZSBzb2NrZXQgKi8KKwlzZCA9IHNvY2tldChkb21haW4sIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCWlmIChzZCA9PSAtMSkgeworCQlwZXJyb3IoImJpbmR4X3Rlc3Q6IEVSUk9SOiBDYW5ub3Qgb3BlbiBzb2NrZXQiKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogYWRkIGFsbCAqLworCXJlc3VsdCA9IHNjdHBfYmluZHgoc2QsIChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyX2J1ZiwgYWRkcnMsCisJCQkgICAgU0NUUF9CSU5EWF9BRERfQUREUik7CisJaWYgKHJlc3VsdCA9PSAtMSkKKwkJcGVycm9yKCJiaW5keF90ZXN0OiBFUlJPUjogYmluZHggYWRkaXRpb24gZXJyb3IiKTsKKwllbHNlIHsKKwkJcHJpbnRmKCJiaW5keF90ZXN0OiBPSzogYmluZHggYWRkcmVzcyBhZGRpdGlvblxuIik7CisKKwkJLyogcmVtb3ZlIGFsbCBidXQgdGhlIGxhc3QgKi8KKwkJcmVzdWx0ID0gc2N0cF9iaW5keChzZCwgKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJfYnVmLCBhZGRycy0xLAorCQkJCSAgICAgU0NUUF9CSU5EWF9SRU1fQUREUik7CisJCWlmIChyZXN1bHQgPT0gLTEpCisJCQlwZXJyb3IoImJpbmR4X3Rlc3Q6IEVSUk9SOiBiaW5keCBhZGRyZXNzIHJlbW92YWwiKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJiaW5keF90ZXN0OiBPSzogYmluZHggYWRkcmVzcyByZW1vdmFsXG4iKTsKKwl9CisgIAorCWNsb3NlKHNkKTsKKwlmcmVlKGFkZHJfYnVmKTsKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvc3JjL2FwcHMvbXlmdHAuYyBiL3NyYy9hcHBzL215ZnRwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRmYTNmMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9hcHBzL215ZnRwLmMKQEAgLTAsMCArMSw0MTMgQEAKKy8qIG15ZnRwIC0gc2ltcGxlIGZpbGUgdHJhbnNmZXIgb3ZlciBzY3RwIHRlc3RpbmcgdG9vbC4gCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZWwgQ29ycC4KKyAqIAorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExLU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24uICBUaGlzCisgKiBpcyBhIHN1Ym1pc3Npb24gYnkgWGluZ2FuZyBHdW8gZnJvbSB0aGUgSW50ZWwgQ29ycG9yYXRpb24gd2hpbGUgCisgKiBwYXJ0aWNpcGF0aW5nIG9uIHRoZSBMS1NDVFAgcHJvamVjdC4gIAorICogCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOyAKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIAorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgCisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIAorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgCisgKiAKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPHNjdHAtZGV2ZWxvcGVycy1saXN0QGNpZy5tb3QuY29tPgorICogCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieTogCisgKiAgICBYaW5nYW5nIEd1byAgICAgICAgICAgPHhpbmdhbmcuZ3VvQGludGVsLmNvbT4KKyAqICAgIEpvbiBHcmltbSAgICAgICAgICAgICA8amdyaW1tQHVzLmlibS5jb20+IAorICogCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4gLyogZm9yIHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKworI2RlZmluZSBCVUZTSVpFIDEwMjQKK3N0YXRpYyBjaGFyIGJ1ZmZlcltCVUZTSVpFXTsKKyNkZWZpbmUgRFVNUF9DT1JFIHsgIGNoYXIgKmRpZWRpZWRpZSA9IDA7ICpkaWVkaWVkaWUgPSAwOyB9CisKK3R5cGVkZWYgZW51bSB7IENPTU1BTkRfTk9ORSwgQ09NTUFORF9SRUNWLCBDT01NQU5EX1NFTkQgfSBjb21tYW5kX3Q7CisKKy8qIFRoZXNlIGFyZSB0aGUgZ2xvYmFsIG9wdGlvbnMuICAqLworI2RlZmluZSBNQVhfTlVNX0hPU1QJNQorc3RhdGljIGNoYXIgKmxvY2FsX2hvc3RbTUFYX05VTV9IT1NUXTsKK3N0YXRpYyBpbnQgbnVtX2xvY2FsX2hvc3QgPSAwOworc3RhdGljIGludCBsb2NhbF9wb3J0ID0gNDQ0NDsKKworc3RhdGljIGludCBidWZmZXJfc2l6ZSA9IEJVRlNJWkU7CitzdGF0aWMgY2hhciAqcmVtb3RlX2hvc3QgPSBOVUxMOworc3RhdGljIGludCByZW1vdGVfcG9ydCA9IDQ0NDQ7CitzdGF0aWMgY29tbWFuZF90IGNvbW1hbmQgPSBDT01NQU5EX05PTkU7CitzdGF0aWMgY2hhciAqZmlsZW5hbWUgPSBOVUxMOworc3RhdGljIGludCBpbnRlcmFjdGl2ZSA9IDA7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWxheSA9IDA7CSAgICAgCitzdGF0aWMgaW50IHZlcmJvc2UgPSAwOworCitzdGF0aWMgdm9pZAordXNhZ2UoY2hhciAqYXJndjApCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgW29wdGlvbnNdXG4iLGFyZ3YwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIk9wdGlvbnM6XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LS1sb2NhbCwgLUggPGhvc3RuYW1lPiAgICAgU3BlY2lmeSBsb2NhbCBpbnRlcmZhY2VcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtLWxvY2FsLXBvcnQsIC1QIDxwb3J0PiAgICBTcGVjaWZ5IGxvY2FsIHBvcnQgKGRlZmF1bHQgNDQ0NClcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtLXJlbW90ZSwgLWggPGhvc3RuYW1lPiAgICBTcGVjaWZ5IGludGVyZmFjZSBvbiByZW1vdGUgaG9zdFxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC0tcmVtb3RlLXBvcnQsIC1wIDxwb3J0PiAgIFNwZWNpZnkgcmVtb3RlIHBvcnQgKGRlZmF1bHQgNDQ0NClcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtLWxpc3RlbiwgLWwgICAgICAgICAgICAgICBXb3JrIGluIHJlY2VpdmluZyBtb2RlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LS1zZW5kLCAtcyAgICAgICAgICAgICAgICAgV29yayBpbiBzZW5kaW5nIG1vZGVcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtLWZpbGUsIC1mIDxmaWxlbmFtZT4gICAgICBGaWxlIHRvIHJlYWQgb3Igd3JpdGUsXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LS1idWZmZXIsIC1iIDxzaXplPiAgICAgICAgQnVmZmVyIHNpemUuIChkZWZhdWx0IDEwMjQgYnl0ZXMpXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgZGVmYXVsdCB1c2Ugc3RhbmRhcmQgaW5wdXQvb3V0cHV0LlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC0tcXVpY2ssIC1xICAgICAgICAgICAgICAgIFNlbmQgcGFja2V0cyBjb250aW51ZW91c2x5LFxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIG5vdCB3YWl0IGZvciA8RU5URVI+IGtleS4gRGVmYXVsdCB3YWl0LlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC0tZGVsYXksIC1kIDx1c2VjPiAgICAgICAgIERlbGF5IGJldHdlZW4gY29uc2VjdXRpdmUgc2VuZHMgKHNlZSAtLXF1aWNrKVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC0tdmVyYm9zZSwgLXYgICAgICAgICAgICAgIEluIHZlcmJvc2UgbW9kZSwgZGlzcGxheSB0aGUgcHJvZ3Jlc3MuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuXHQtLWhlbHAsICAgICAgICAgICAgICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UuXG5cbiIpOworfSAvKiB1c2FnZSgpICovCisKK3N0YXRpYyBpbnQgcGFyc2VfYXJndW1lbnRzKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IG9wdGlvbl9pbmRleCA9IDA7CisJaW50IGM7CisJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCXsibG9jYWwiLAkxLCAwLCAxfSwKKwkJeyJsb2NhbC1wb3J0IiwJMSwgMCwgMn0sCisJCXsicmVtb3RlIiwJMSwgMCwgM30sCisJCXsicmVtb3RlLXBvcnQiLAkxLCAwLCA0fSwKKwkJeyJmaWxlIiwJMSwgMCwgNX0sCisJCXsiZGVsYXkiLAkxLCAwLCA2fSwKKwkJeyJidWZmZXIiLAkxLCAwLCA3fSwKKwkJeyJsaXN0ZW4iLAkwLCAwLCAxMH0sCisJCXsic2VuZCIsCTAsIDAsIDExfSwKKwkJeyJxdWljayIsCTAsIDAsIDEyfSwKKwkJeyJ2ZXJib3NlIiwJMCwgMCwgMTN9LAorCQl7ImhlbHAiLAkwLCAwLCA5OX0sCisJCXswLAkJMCwgMCwgMH0KKwl9OworCisJLyogUGFyc2UgdGhlIGFyZ3VtZW50cy4gICovCisJd2hpbGUgKDEpIHsKKwkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJIOlA6aDpwOmY6ZDpiOnFsc3YiLGxvbmdfb3B0aW9ucywmb3B0aW9uX2luZGV4KTsKKwkJaWYgKGMgPT0gLTEpIGJyZWFrOworCisJCXN3aXRjaCAoYykgeworCQljYXNlIDA6CisJCQlwcmludGYgKCJvcHRpb24gJXMiLCBsb25nX29wdGlvbnNbb3B0aW9uX2luZGV4XS5uYW1lKTsKKwkJCWlmIChvcHRhcmcpIHByaW50ZiAoIiB3aXRoIGFyZyAlcyIsIG9wdGFyZyk7CisJCQlwcmludGYgKCJcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMToJCS8qIGxvY2FsIGhvc3QgKi8KKwkJY2FzZSAnSCc6CisJCQlsb2NhbF9ob3N0W251bV9sb2NhbF9ob3N0KytdID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgMjoJCS8qIGxvY2FsIHBvcnQgKi8KKwkJY2FzZSAnUCc6CisJCQlsb2NhbF9wb3J0ID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgMzoJCS8qIHJlbW90ZSBob3N0ICovCisJCWNhc2UgJ2gnOgorCQkJcmVtb3RlX2hvc3QgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSA0OgkJLyogcmVtb3RlIHBvcnQgKi8KKwkJY2FzZSAncCc6CisJCQlyZW1vdGVfcG9ydCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCWNhc2UgJ2YnOgorCQkJZmlsZW5hbWUgPSBvcHRhcmc7CisJCQlicmVhazsKKworCQljYXNlIDY6CisJCWNhc2UgJ2QnOgorCQkJZGVsYXkgPSBzdHJ0b3VsKG9wdGFyZyxOVUxMLDEwKTsKKwkJCXByaW50ZigiZGVsYXkgaXMgJWxkIHVzZWNcbiIsZGVsYXkpOworCQkJYnJlYWs7CisKKwkJY2FzZSA3OgorCQljYXNlICdiJzoKKwkJCWJ1ZmZlcl9zaXplID0gYXRvaShvcHRhcmcpOworCQkJaWYgKCBidWZmZXJfc2l6ZSA+IEJVRlNJWkUgKSB7CisJCQkJYnVmZmVyX3NpemUgPSBCVUZTSVpFOworCQkJCWZwcmludGYoc3RkZXJyLCJXYXJuaW5nLCBidWZmZXIgc2l6ZSB0b28gbGFyZ2UsIHNldCB0byAlZFxuIixidWZmZXJfc2l6ZSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDEyOgorCQljYXNlICdxJzoJaW50ZXJhY3RpdmUgPSAwOyBicmVhazsKKworCQljYXNlIDEzOgorCQljYXNlICd2JzoJdmVyYm9zZSA9IDE7IGJyZWFrOworCQkJLyogQ09NTUFORFMgKi8KKwkJY2FzZSAxMDoJLyogbGlzdGVuICovCisJCWNhc2UgJ2wnOgorCQkJaWYgKGNvbW1hbmQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBwaWNrIE9ORSBvZiBsaXN0ZW4gb3Igc2VuZFxuIiwgYXJndlswXSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQllbHNlIGNvbW1hbmQgPSBDT01NQU5EX1JFQ1Y7CisJCQlicmVhazsKKworCQljYXNlIDExOgkvKiBzZW5kICovCisJCWNhc2UgJ3MnOgorCQkJaWYgKGNvbW1hbmQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBwaWNrIE9ORSBvZiBsaXN0ZW4gb3Igc2VuZFxuIiwgYXJndlswXSk7CisJCQkJcmV0dXJuIDI7CisJCQl9IGVsc2UgY29tbWFuZCA9IENPTU1BTkRfU0VORDsKKwkJCWJyZWFrOworCisJCWNhc2UgJz8nOgorCQljYXNlIDk5OgorCQkJdXNhZ2UoYXJndlswXSk7CisJCQlyZXR1cm4gMzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGYgKCIlczogdW5yZWNvZ25pemVkIG9wdGlvbiAwJWNcbiIsIGFyZ3ZbMF0sIGMpOworCQkJdXNhZ2UoYXJndlswXSk7CisJCQlyZXR1cm4gNDsKKwkJfQorCX0KKworCWlmIChvcHRpbmQgPCBhcmdjKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IG5vbi1vcHRpb24gYXJndW1lbnRzIGFyZSBpbGxlZ2FsOiAiLCBhcmd2WzBdKTsKKwkJd2hpbGUgKG9wdGluZCA8IGFyZ2MpIGZwcmludGYoc3RkZXJyLCAiJXMgIiwgYXJndltvcHRpbmQrK10pOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJCXVzYWdlKGFyZ3ZbMF0pOworCQlyZXR1cm4gNTsKKwl9CisKKworCWlmICgwID09IG51bV9sb2NhbF9ob3N0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IFlvdSBNVVNUIHByb3ZpZGUgYSBsb2NhbCBob3N0LlxuIiwgYXJndlswXSk7CisJCXVzYWdlKGFyZ3ZbMF0pOworCQlyZXR1cm4gNjsKKwl9CisKKwlpZiAoIGZpbGVuYW1lID09IE5VTEwgJiYgY29tbWFuZCA9PSBDT01NQU5EX1NFTkQpCisJCWZwcmludGYoc3RkZXJyLCIlczogVXNlIHN0YW5kYXJkIGlucHV0IHRvIHNlbmRcbiIsYXJndlswXSk7CisKKwlpZiAoIGZpbGVuYW1lID09IE5VTEwgJiYgY29tbWFuZCA9PSBDT01NQU5EX1JFQ1YgKQorCQlmcHJpbnRmKHN0ZGVyciwiJXM6IFVzZSBzdGFuZGFyZCBvdXRwdXQgdG8gd3JpdGVcbiIsYXJndlswXSk7CisKKwlyZXR1cm4gMDsKK30gLyogcGFyc2VfYXJndW1lbnRzKCkgKi8KKworc3RhdGljIHZvaWQKK2Vtc2coY2hhciAqcHJvZyxjaGFyICpzKQoreworCWlmICggcHJvZyAhPSBOVUxMICkgZnByaW50ZihzdGRlcnIsIiVzOiAiLHByb2cpOworCXBlcnJvcihzKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwkvL0RVTVBfQ09SRTsKKworCWV4aXQoLTEpOworfQorCitzdGF0aWMgaW50IGJ1aWxkX2VuZHBvaW50KGNoYXIgKmFyZ3YwKQoreworCWludCByZXR2YWwsaTsKKworCS8qIENyZWF0ZSB0aGUgbG9jYWwgZW5kcG9pbnQuICAqLworCWlmICggKHJldHZhbCA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NFUVBBQ0tFVCwgSVBQUk9UT19TQ1RQKSkgPCAwICkgeworCQllbXNnKGFyZ3YwLCJzb2NrZXQiKTsKKwkJZXhpdChyZXR2YWwpOworCX0KKworCWZvciAoIGkgPSAwO2kgPCBudW1fbG9jYWxfaG9zdDtpKysgKSB7CisJCXN0cnVjdCBob3N0ZW50ICpoc3Q7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBsYWRkcjsKKworCQltZW1zZXQoJmxhZGRyLCAwLCBzaXplb2YobGFkZHIpKTsKKwkJLyogR2V0IHRoZSB0cmFuc3BvcnQgYWRkcmVzcyBmb3IgdGhlIGxvY2FsIGhvc3QgbmFtZS4gICovCisJCWZwcmludGYoc3RkZXJyLCJIb3N0bmFtZSAlZCBpcyAlc1xuIixpKzEsbG9jYWxfaG9zdFtpXSk7CisJCWlmICggKGhzdCA9IGdldGhvc3RieW5hbWUobG9jYWxfaG9zdFtpXSkpID09IE5VTEwgKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBiYWQgaG9zdG5hbWU6ICVzXG4iLCBhcmd2MCwgbG9jYWxfaG9zdFtpXSk7CisJCQlleGl0KDEpOworCQl9CisJCW1lbWNweSgmbGFkZHIuc2luX2FkZHIsIGhzdC0+aF9hZGRyX2xpc3RbMF0sc2l6ZW9mKGxhZGRyLnNpbl9hZGRyKSk7CisJCWxhZGRyLnNpbl9wb3J0ID0gaHRvbnMobG9jYWxfcG9ydCk7CisJCWxhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCisJCS8qIEJpbmQgdGhpcyBzb2NrZXQgdG8gdGhlIHRlc3QgcG9ydC4gICovCisJCWlmICggYmluZChyZXR2YWwsIChzdHJ1Y3Qgc29ja2FkZHIgKikmbGFkZHIsIHNpemVvZihsYWRkcikpICkgeworCQkJZW1zZyhhcmd2MCwiYmluZCIpOworCQkJZXhpdCgtMSk7CisJCX0KKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwiRW5kcG9pbnQgYnVpbHQuXG4iKTsKKworCXJldHVybiByZXR2YWw7Cit9IC8qIGJ1aWxkX2VuZHBvaW50KCkgKi8KKworLyogQ29udmVuaWVuY2Ugc3RydWN0dXJlIHRvIGRldGVybWluZSBzcGFjZSBuZWVkZWQgZm9yIGNtc2cuICovCit0eXBlZGVmIHVuaW9uIHsKKwlzdHJ1Y3Qgc2N0cF9pbml0bXNnIGluaXQ7CisJc3RydWN0IHNjdHBfc25kcmN2aW5mbyBzbmRyY3ZpbmZvOworfSBfc2N0cF9jbXNnX2RhdGFfdDsKKworCisvKiBMaXN0ZW4gb24gdGhlIHNvY2tldCwgcHJpbnRpbmcgb3V0IGFueXRoaW5nIHRoYXQgYXJyaXZlcy4gICovCitzdGF0aWMgdm9pZAorY29tbWFuZF9yZWN2KGNoYXIgKmFyZ3YwLCBpbnQgc2spCit7CisJc3RydWN0IG1zZ2hkciBpbm1lc3NhZ2U7CisJY2hhciBpbmNtc2dbQ01TR19TUEFDRShzaXplb2YoX3NjdHBfY21zZ19kYXRhX3QpKV07CisJc3RydWN0IGlvdmVjIGlvdjsKKwlpbnQgcmV0OworCWludCBmZDsKKwlpbnQgY3Q7CisKKwlpZiAobGlzdGVuKHNrLCAxKSA9PSAtMSkKKwkJZW1zZyhhcmd2MCwgImxpc3RlbiIpOworCS8qIEluaXRpYWxpemUgaW5tZXNzYWdlIHdpdGggZW5vdWdoIHNwYWNlIGZvciBEQVRBLi4uICovCisJbWVtc2V0KCZpbm1lc3NhZ2UsIDAsIHNpemVvZihpbm1lc3NhZ2UpKTsKKwlpb3YuaW92X2Jhc2UgPSBidWZmZXI7CisJaW92Lmlvdl9sZW4gPSBidWZmZXJfc2l6ZTsKKwlpbm1lc3NhZ2UubXNnX2lvdiA9ICZpb3Y7CisJaW5tZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworCS8qIG9yIGEgY29udHJvbCBtZXNzYWdlLiAgKi8KKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisKKwkvKiBjcmVhdCBhIGZpbGUgKi8KKwlpZiAoIGZpbGVuYW1lID09IE5VTEwgKSBmZCA9IDE7CisJZWxzZSBpZiAoIChmZCA9IG9wZW4oZmlsZW5hbWUsT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLFNfSVJFQUR8U19JV1JJVEUpKSA9PSAtMSApCisJCWVtc2coYXJndjAsIm9wZW4iKTsKKworCWZwcmludGYoc3RkZXJyLCIlcyBSZWNlaXZpbmcuLi5cbiIsIGFyZ3YwKTsKKwkvKiBHZXQgdGhlIG1lc3NhZ2VzIHNlbnQgKi8KKwljdCA9IDA7CisJd2hpbGUgKCAocmV0ID0gcmVjdm1zZyhzaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpKSA+PSAwICkgeworCQlpZiAoIHZlcmJvc2UgKQorCQkJZnByaW50ZihzdGRlcnIsIiVzLSVkIHJlY2VpdmVkICVkIGJ5dGVzXG4iLAorCQkJCWFyZ3YwLCArK2N0LCByZXQpOworCQlpZiAoICEoaW5tZXNzYWdlLm1zZ19mbGFncyAmIE1TR19OT1RJRklDQVRJT04pICkgeworCQkJLy9wcmludGYoIiVzIHdyaXRlICVkIGJ5dGVzXG4iLGFyZ3YwLHJldCk7CisJCQlpZiAoIHdyaXRlKGZkLGJ1ZmZlcixyZXQpICE9IHJldCApIGVtc2coYXJndjAsIndyaXRlIik7CisJCX0gZWxzZSB7CisJCQl1bmlvbiBzY3RwX25vdGlmaWNhdGlvbiAqc247CisJCQlzbiA9ICh1bmlvbiBzY3RwX25vdGlmaWNhdGlvbiAqKWlvdi5pb3ZfYmFzZTsKKwkJCWlmICgoc24tPnNuX2hlYWRlci5zbl90eXBlID09IFNDVFBfQVNTT0NfQ0hBTkdFKSAmJgorCQkJICAgIChzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19zdGF0ZSAKKwkJCSAgICAgPT0gU0NUUF9TSFVURE9XTl9DT01QKSkKKwkJCQlicmVhazsKKwkJfQorCQkJCisJfQorCisJaWYgKCByZXQgPCAwICkgZW1zZyhhcmd2MCwicmVjdm1zZyIpOworCisJY2xvc2UoZmQpOworCWNsb3NlKHNrKTsKK30gLyogY29tbWFuZF9yZWN2KCkgKi8KKworLyogUmVhZCBsaW5lcyBmcm9tIHN0ZGluIGFuZCBzZW5kIHRoZW0gdG8gdGhlIHNvY2tldC4gICovCitzdGF0aWMgdm9pZAorY29tbWFuZF9zZW5kKGNoYXIgKmFyZ3YwLCBpbnQgc2spCit7CisJc3RydWN0IG1zZ2hkciBvdXRtc2c7CisJc3RydWN0IGlvdmVjIGlvdjsKKwlzdHJ1Y3QgaG9zdGVudCAqaHN0OworCXN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVfYWRkcjsKKwlpbnQgZmQ7CisJaW50IG1zZ2xlbjsKKwlpbnQgY3Q7CisKKwkvKiBTZXQgdXAgdGhlIGRlc3RpbmF0aW9uLiAgKi8KKwloc3QgPSBnZXRob3N0YnluYW1lKHJlbW90ZV9ob3N0KTsKKwlpZiAoaHN0ID09IE5VTEwgfHwgaHN0LT5oX2xlbmd0aCA8IDEpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogYmFkIGhvc3RuYW1lOiAlc1xuIiwgYXJndjAsIHJlbW90ZV9ob3N0KTsKKwkJZXhpdCgxKTsKKwl9CisJbWVtY3B5KCZyZW1vdGVfYWRkci5zaW5fYWRkciwgaHN0LT5oX2FkZHJfbGlzdFswXSwgc2l6ZW9mKHJlbW90ZV9hZGRyLnNpbl9hZGRyKSk7CisJcmVtb3RlX2FkZHIuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVfcG9ydCk7CisJcmVtb3RlX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisKKwkvKiBJbml0aWFsaXplIHRoZSBtZXNzYWdlIHN0cnVjdCB3ZSB1c2UgdG8gcGFzcyBtZXNzYWdlcyB0bworCSAqIHRoZSByZW1vdGUgc29ja2V0LgorCSAqLworCWlvdi5pb3ZfYmFzZSA9IGJ1ZmZlcjsKKwlpb3YuaW92X2xlbiA9IGJ1ZmZlcl9zaXplOworCW91dG1zZy5tc2dfaW92ID0gJmlvdjsKKwlvdXRtc2cubXNnX2lvdmxlbiA9IDE7CisJb3V0bXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwlvdXRtc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW91dG1zZy5tc2dfbmFtZSA9ICZyZW1vdGVfYWRkcjsKKwlvdXRtc2cubXNnX25hbWVsZW4gPSBzaXplb2YocmVtb3RlX2FkZHIpOworCisJLyogb3BlbiB0aGUgZmlsZSAqLworCWlmICggZmlsZW5hbWUgPT0gTlVMTCApIGZkID0gMDsKKwllbHNlIGlmICggKGZkID0gb3BlbihmaWxlbmFtZSxPX1JET05MWSkpID09IC0xICkgZW1zZyhhcmd2MCwib3BlbiIpOworCisJZnByaW50ZihzdGRlcnIsIiVzIHJlYWR5IHRvIHNlbmQuLi5cbiIsIGFyZ3YwKTsKKwljdCA9IDA7CisJd2hpbGUgKCAobXNnbGVuID0gcmVhZChmZCxidWZmZXIsYnVmZmVyX3NpemUpKSA+IDAgKSB7CisJCS8qIFNlbmQgdG8gb3VyIG5laWdoYm9yLiAgKi8KKwkJaW92Lmlvdl9sZW4gPSBtc2dsZW47CisJCWlmICggc2VuZG1zZyhzaywgJm91dG1zZywgMCkgIT0gbXNnbGVuICkgZW1zZyhhcmd2MCwic2VuZG1zZyIpOworCQlpZiAoIHZlcmJvc2UgKSBmcHJpbnRmKHN0ZGVyciwiJXMtJWQgc2VuZCAlZCBieXRlc1xuIixhcmd2MCwrK2N0LG1zZ2xlbik7CisJCWlmICggaW50ZXJhY3RpdmUgJiYgZmQgIT0gMSApIAorCQkJZ2V0Y2hhcigpOworCQkJLy8gbm8gZmxvdyBjb250cm9sPyBubyBwcm9ibGVtLCBtYWtlIGl0IHNsb3cKKwkJZWxzZSBpZiAoIGRlbGF5ID4gMCApIAorCQkJdXNsZWVwKGRlbGF5KTsKKwl9CisKKwljbG9zZShmZCk7CisJY2xvc2Uoc2spOworfSAvKiBjb21tYW5kX3NlbmQoKSAqLworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCByZXQ7CisKKwlpZiAoKCByZXQgPSBwYXJzZV9hcmd1bWVudHMoYXJnYywgYXJndikgKSkgcmV0dXJuIHJldDsKKworCXN3aXRjaChjb21tYW5kKSB7CisJY2FzZSBDT01NQU5EX05PTkU6CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IFBsZWFzZSBzcGVjaWZ5IGEgY29tbWFuZC5cbiIsIGFyZ3ZbMF0pOworCQlicmVhazsKKwljYXNlIENPTU1BTkRfUkVDVjoKKwkJY29tbWFuZF9yZWN2KGFyZ3ZbMF0sYnVpbGRfZW5kcG9pbnQoYXJndlswXSkpOworCQlicmVhazsKKwljYXNlIENPTU1BTkRfU0VORDoKKwkJY29tbWFuZF9zZW5kKGFyZ3ZbMF0sYnVpbGRfZW5kcG9pbnQoYXJndlswXSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBpbGxlZ2FsIGNvbW1hbmQgJWRcbiIsIGFyZ3ZbMF0sIGNvbW1hbmQpOworCX0gLyogc3dpdGNoKGNvbW1hbmQpICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9hcHBzL25hZ2xlX3Jjdi5jIGIvc3JjL2FwcHMvbmFnbGVfcmN2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlMDk0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9hcHBzL25hZ2xlX3Jjdi5jCkBAIC0wLDAgKzEsMjQzIEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMworICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBOb2tpYSwgSW5jLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBBcmRlbGxlIEZhbiA8YXJkZWxsZS5mYW5AaW50ZWwuY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgPHNyaUB1cy5pYm0uY29tPgorICovCisKKy8qIFRoaXMgaXMgYSByZWNlaXZlciBmb3IgdGhlIHBlcmZvcm1hbmNlIHRlc3QgdG8gdmVyaWZ5IE5hZ2xlJ3MgYWxnb3JpdGhtLiAKKyAqIEl0IGNyZWF0ZXMgYSBzb2NrZXQsIGJpbmRzIHRvIGEgYWRkcmVzcyBzcGVjaWZpZWQgYXMgYSBwYXJhbWV0ZXIgYW5kCisgKiBnb2VzIGludG8gYSByZWNlaXZlIGxvb3Agd2FpdGluZyBmb3IgMSwwMDAsMDAwIHBhY2tldHMuIFRoZW4gaXQgY2FsY3VsYXRlcworICogdGhlIHBhY2tldCByZWNlaXZlIHJhdGUsIGkuZS4gcGFja2V0cy9zZWNvbmQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCitjaGFyICpUQ0lEID0gX19GSUxFX187CitpbnQgVFNUX1RPVEFMID0gMTsKK2ludCBUU1RfQ05UID0gMDsKKwordm9pZAordXNhZ2UoY2hhciAqcHJvZ25hbWUpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgLUggaG9zdG5hbWUgWy1QIHBvcnRdXG4iLCBwcm9nbmFtZSk7CisJZnByaW50ZihzdGRlcnIsICIgLUgsIC0tbG9jYWxcdFx0IGxvY2FsIGhvc3RuYW1lLFxuIik7CisJZnByaW50ZihzdGRlcnIsICIgLVAsIC0tbG9jYWwtcG9ydFx0IGxvY2FsIHBvcnQsXG4iKTsKK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IHNrLCBpOworCXN0cnVjdCBhZGRyaW5mbyAqaHN0X3JlczsKKwlzb2NrYWRkcl9zdG9yYWdlX3QgaG9zdDsKKwlzb2NrYWRkcl9zdG9yYWdlX3QgbXNnbmFtZTsKKwlzdHJ1Y3QgaW92ZWMgaW92OworCXN0cnVjdCBtc2doZHIgaW5tZXNzYWdlOworCWNoYXIgaW5jbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHNjdHBfY21zZ19kYXRhX3QpKV07CisJaW50IGVycm9yLCBwZl9jbGFzczsKKwljaGFyICpiaWdfYnVmZmVyOworCWNoYXIgKmxvY2FsX2hvc3QgPSBOVUxMOworCWludCBsb2NhbF9wb3J0ID0gU0NUUF9URVNUUE9SVF8xOyAKKwljaGFyIHBvcnRfYnVmZmVyWzEwXTsKKwlpbnQgb3B0aW9uX2luZGV4ID0gMDsKKwl0aW1lX3QgZnJvbSwgdG87CisJaW50IGJ5dGVzX3JlY2VpdmVkID0gMDsgCisJaW50IGM7CisJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCXsibG9jYWwiLAkxLCAwLCAxfSwKKwkJeyJsb2NhbC1wb3J0IiwJMSwgMCwgMn0sCisJCXswLAkJMCwgMCwgMH0KKwl9OworCisJLyogUmF0aGVyIHRoYW4gZmZsdXNoKCkgdGhyb3VnaG91dCB0aGUgY29kZSwgc2V0IHN0ZG91dCB0byAKKwkgKiBiZSB1bmJ1ZmZlcmVkLiAKKwkgKi8KKwlzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsgCisKKwkvKiBQYXJzZSB0aGUgYXJndW1lbnRzLiAgKi8KKwl3aGlsZSAoMSkgeworCQljID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJIOlA6IiwKKwkJCQkgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAwOgorCQkJcHJpbnRmKCJvcHRpb24gJXMiLCBsb25nX29wdGlvbnNbb3B0aW9uX2luZGV4XS5uYW1lKTsKKwkJCWlmIChvcHRhcmcpIHsKKwkJCQlwcmludGYoIiB3aXRoIGFyZyAlcyIsIG9wdGFyZyk7CisJCQl9CisJCQlwcmludGYoIlxuIik7CisJCQlicmVhazsKKwkJY2FzZSAxOgkJLyogbG9jYWwgaG9zdCAqLworCQljYXNlICdIJzoKKwkJCWxvY2FsX2hvc3QgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAyOgkJLyogbG9jYWwgcG9ydCAqLworCQljYXNlICdQJzoKKwkJCWxvY2FsX3BvcnQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQl1c2FnZShhcmd2WzBdKTsKKwkJCWV4aXQoMCk7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ZiAoIiVzOiB1bnJlY29nbml6ZWQgb3B0aW9uIDAlY1xuIiwgYXJndlswXSwgYyk7CisJCQl1c2FnZShhcmd2WzBdKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwlpZiAob3B0aW5kIDwgYXJnYykKKwl7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IG5vbi1vcHRpb24gYXJndW1lbnRzIGFyZSBpbGxlZ2FsOiAiLAorCQkJYXJndlswXSk7CisJCXdoaWxlIChvcHRpbmQgPCBhcmdjKQorCQkJZnByaW50ZihzdGRlcnIsICIlcyAiLCBhcmd2W29wdGluZCsrXSk7CisJCWZwcmludGYgKHN0ZGVyciwgIlxuIik7CisJCXVzYWdlKGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCWlmICghbG9jYWxfaG9zdCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiA6IG9wdGlvbiAtSCwgLS1sb2NhbCBpcyByZXF1aXJlZFxuIiwKKwkJCWFyZ3ZbMF0pOworCQl1c2FnZShhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBTZXQgc29tZSBiYXNpYyB2YWx1ZXMgd2hpY2ggZGVwZW5kIG9uIHRoZSBhZGRyZXNzIGZhbWlseS4gKi8KKwlpZiAoIXN0cmNtcChsb2NhbF9ob3N0LCAiMCIpKQorCQlsb2NhbF9ob3N0ID0gIjAuMC4wLjAiOworCisJc25wcmludGYocG9ydF9idWZmZXIsIDEwLCAiJWQiLCBsb2NhbF9wb3J0KTsKKwllcnJvciA9IGdldGFkZHJpbmZvKGxvY2FsX2hvc3QsIHBvcnRfYnVmZmVyLCBOVUxMLCAmaHN0X3Jlcyk7CisJaWYgKGVycm9yKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGdldGFkZHJpbmZvIGZhaWxlZDogJXNcbiIsIGFyZ3ZbMF0sIGxvY2FsX2hvc3QpOworCQlleGl0KDEpOworCX0KKworCXBmX2NsYXNzID0gaHN0X3Jlcy0+YWlfZmFtaWx5OworCXN3aXRjaCAocGZfY2xhc3MpIHsKKwljYXNlIEFGX0lORVQ6CisJY2FzZSBBRl9JTkVUNjoKKwkJbWVtY3B5KCZob3N0LnNhLCBoc3RfcmVzLT5haV9hZGRyLCBoc3RfcmVzLT5haV9hZGRybGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGFkZHJlc3MgdHlwZS5cbiIpOworCQlleGl0KDEpOworCQlicmVhazsKKwl9CisKKwlmcmVlYWRkcmluZm8oaHN0X3Jlcyk7CisKKwkvKiBDcmVhdGUgdGhlIGVuZHBvaW50IHdoaWNoIHdpbGwgdGFsayB0byBuYWdsZV9zbmQuICAqLworCXNrID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCisJLyogRW5hYmxlIEFTU09DX0NIQU5HRSBhbmQgU05EUkNWSU5GTyBub3RpZmljYXRpb25zLiAqLworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZShzayk7CisKKwkvKiBCaW5kIHRoZSBzb2NrZXRzIHRvIHRoZSB0ZXN0IHBvcnQuICAqLworCXRlc3RfYmluZChzaywgJmhvc3Quc2EsIHNpemVvZihob3N0KSk7CisKKwkvKiBNYXJrIHNrIGFzIGJlaW5nIGFibGUgdG8gYWNjZXB0IG5ldyBhc3NvY2lhdGlvbnMuICAqLworCXRlc3RfbGlzdGVuKHNrLCAxKTsKKworCXByaW50ZigiTGlzdGVuaW5nIG9uIHBvcnQ6JWRcbiIsIGxvY2FsX3BvcnQpOworCisJLyogSW5pdGlhbGl6ZSBpbm1lc3NhZ2UgZm9yIHJlY2VpdmVzLiAqLworCW1lbXNldCgmaW5tZXNzYWdlLCAwLCBzaXplb2YoaW5tZXNzYWdlKSk7CisJYmlnX2J1ZmZlciA9IHRlc3RfbWFsbG9jKFJFQUxMWV9CSUcpOworCWlvdi5pb3ZfYmFzZSA9IGJpZ19idWZmZXI7CisJaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworCWlubWVzc2FnZS5tc2dfaW92ID0gJmlvdjsKKwlpbm1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisJaW5tZXNzYWdlLm1zZ19jb250cm9sID0gaW5jbXNnOworCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCWlubWVzc2FnZS5tc2dfbmFtZSA9ICZtc2duYW1lOworCWlubWVzc2FnZS5tc2dfbmFtZWxlbiA9IHNpemVvZihtc2duYW1lKTsKKwltZW1zZXQoJm1zZ25hbWUsIDAsIHNpemVvZihtc2duYW1lKSk7CisKKwkvKiBHZXQgdGhlIGNvbW11bmljYXRpb24gdXAgbWVzc2FnZSBvbiBzay4gICovCisJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc2ssICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9DT01NX1VQKTsJCisKKwlwcmludGYoIkVzdGFibGlzaGVkIGNvbm5lY3Rpb24gd2l0aCAiKTsgCisJaWYgKEFGX0lORVQgPT0gbXNnbmFtZS5zYS5zYV9mYW1pbHkpCisJCXByaW50ZigiJWQuJWQuJWQuJWQoJWQpXG4iLCBOSVBRVUFEKG1zZ25hbWUudjQuc2luX2FkZHIpLAorCQkgICAgICAgbnRvaHMobXNnbmFtZS52NC5zaW5fcG9ydCkpOworCWlmIChBRl9JTkVUNiA9PSBtc2duYW1lLnNhLnNhX2ZhbWlseSkKKwkJcHJpbnRmKCIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHgoJWQpXG4iLAorCQkgICAgICAgTklQNihtc2duYW1lLnY2LnNpbjZfYWRkciksIG50b2hzKG1zZ25hbWUudjYuc2luNl9wb3J0KSk7CisKKwl0aW1lKCZmcm9tKTsKKwlmb3IgKGk9MDsgaTwxMDAwMDAwOyBpKyspIHsKKwkJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJCWlubWVzc2FnZS5tc2dfbmFtZWxlbiA9IHNpemVvZihtc2duYW1lKTsKKwkJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc2ssICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwkJaWYgKGlubWVzc2FnZS5tc2dfZmxhZ3MgJiBNU0dfTk9USUZJQ0FUSU9OKQorCQkJYnJlYWs7CisJCXByaW50ZigiUmVjZWl2ZWQgJWQgYnl0ZXMgb2YgZGF0YVxuIiwgZXJyb3IpOworCQlieXRlc19yZWNlaXZlZCArPSBlcnJvcjsKKwl9CisJdGltZSgmdG8pOworCisJcHJpbnRmKCJcdCVkIG1lc3NhZ2VzKCVkIGJ5dGVzKSBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgaW4gJWxkICIKKwkgICAgICAgInNlY29uZHMuXG4iLCBpLCBieXRlc19yZWNlaXZlZCwgdG8gLSBmcm9tKTsKKwlwcmludGYoIlRoZSByZWNlaXZlIHJhdGUgaXMgJWxkIGJ5dGVzL3NlY29uZFxuIiwKKwkgICAgICAgYnl0ZXNfcmVjZWl2ZWQvKHRvIC0gZnJvbSkpOworCisJLyogU2h1dCBkb3duIHRoZSBsaW5rLgkqLworCWVycm9yID0gMDsKKwljbG9zZShzayk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9hcHBzL25hZ2xlX3NuZC5jIGIvc3JjL2FwcHMvbmFnbGVfc25kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5NjBjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9hcHBzL25hZ2xlX3NuZC5jCkBAIC0wLDAgKzEsMzU5IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMworICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBOb2tpYSwgSW5jLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBBcmRlbGxlIEZhbiA8YXJkZWxsZS5mYW5AaW50ZWwuY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgPHNyaUB1cy5pYm0uY29tPgorICovCisKKy8qIFRoaXMgaXMgYSByZWNlaXZlciBmb3IgdGhlIHBlcmZvcm1hbmNlIHRlc3QgdG8gdmVyaWZ5IE5hZ2xlJ3MgYWxnb3JpdGhtLiAKKyAqIEl0IGNyZWF0ZXMgYSBzb2NrZXQsIGJpbmRzIHRvIGEgYWRkcmVzcyBzcGVjaWZpZWQgYXMgYSBwYXJhbWV0ZXIgYW5kCisgKiBzZW5kcyAxLDAwMCwwMDAgcGFja2V0cyB0byBhIHNwZWNpZmllZCB0YXJnZXQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSAxOworaW50IFRTVF9DTlQgPSAwOworCit2b2lkCit1c2FnZShjaGFyICphcmd2MCkKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyAtSCBsb2NhbGhvc3QgWy1QIGxvY2FscG9ydF0gIgorCQkiLWggcmVtb3RlaG9zdCBbLXAgcmVtb3RlcG9ydF1cbiIKKwkJIlx0XHRbLVMgbXNnc2l6ZV0gWy1JIGludGVydmFsXSAtTlxuIgorCQkiIC1ILCAtLWxvY2FsXHRcdHNwZWNpZnkgb25lIG9mIHRoZSBsb2NhbCBhZGRyZXNzZXMsXG4iCisJCSIgLVAsIC0tbG9jYWwtcG9ydFx0c3BlY2lmeSB0aGUgcG9ydCBudW1iZXIgZm9yIGxvY2FsIGFkZHJlc3NlcyxcbiIKKwkJIiAtaCwgLS1yZW1vdGVcdFx0c3BlY2lmeSBvbmUgb2YgdGhlIHJlbW90ZSBhZGRyZXNzZXMsXG4iCisJCSIgLXAsIC0tcmVtb3RlLXBvcnRcdHNwZWNpZnkgdGhlIHBvcnQgbnVtYmVyIGZvciByZW1vdGUgYWRkcmVzc2VzLFxuIgorCQkiIC1TLCAtLXNpemVcdFx0c3BlY2lmeSB0aGUgc2l6ZShieXRlKSBvZiB0aGUgc2VuZGluZyBtZXNzYWdlLFxuIgorCQkiIC1JLCAtLWludGVydmFsXHRcdHNwZWNpZnkgdGhlIGludGVydmFsKHNlY29uZCkgdGhhdCBzZW5kaW5nIG1lc3NhZ2VzIGF0LFxuIgorCQkiIC1OLCAtLW5vZGVsYXlcdFx0c3BlY2lmeSB3aGV0aGVyIHRoZSBTQ1RQIGFsbG93cyBOYWdsZSdzIGFsZ29yaXRobVxuIiwKKwkJYXJndjApOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgc2ssIGk7CisJc3RydWN0IGFkZHJpbmZvICpoc3RfcmVzLCAqdGd0X3JlczsKKwlzb2NrYWRkcl9zdG9yYWdlX3QgaG9zdCwgdGFyZ2V0OworCXNvY2thZGRyX3N0b3JhZ2VfdCBtc2duYW1lOworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJc3RydWN0IG1zZ2hkciBpbm1lc3NhZ2U7CisJc3RydWN0IG1zZ2hkciBvdXRtZXNzYWdlOworCWNoYXIgaW5jbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHNjdHBfY21zZ19kYXRhX3QpKV07CisJY2hhciBvdXRjbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKV07CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm87CisJc3RydWN0IGlvdmVjIG91dF9pb3Y7CisJY2hhciAqbWVzc2FnZTsKKwlpbnQgZXJyb3IsIHBmX2NsYXNzOworCXNjdHBfYXNzb2NfdCBhc3NvY2lkOworCXVpbnQzMl90IHBwaWQ7CisJdWludDMyX3Qgc3RyZWFtOworCWNoYXIgKnJlbW90ZV9ob3N0ID0gTlVMTDsKKwlpbnQgcmVtb3RlX3BvcnQgPSBTQ1RQX1RFU1RQT1JUXzE7CisJY2hhciAqbG9jYWxfaG9zdCA9IE5VTEw7CisJaW50IGxvY2FsX3BvcnQgPSBTQ1RQX1RFU1RQT1JUXzI7CisJaW50IHNpemUgPSAxOworCWludCBpbnRlcnZhbCA9IDA7CisJaW50IG5vZGVsYXkgPSAwOworCWludCBvcHRpb25faW5kZXggPSAwOworCWNoYXIgKmJpZ19idWZmZXI7CisJY2hhciBwb3J0X2J1ZmZlclsxMF07CisJaW50IGM7CisJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCXsibG9jYWwiLAkgMSwgMCwgMX0sCisJCXsibG9jYWwtcG9ydCIsCSAxLCAwLCAyfSwKKwkJeyJyZW1vdGUiLAkgMSwgMCwgM30sCisJCXsicmVtb3RlLXBvcnQiLCAgMSwgMCwgNH0sCisJCXsic2l6ZSIsCSAxLCAwLCA1fSwKKwkJeyJpbnRlcnZhbCIsCSAxLCAwLCA2fSwKKwkJeyJub2RlbGF5IiwJIDAsIDAsIDEwfSwKKwkJezAsCQkgMCwgMCwgMH0KKwl9OworCisJLyogUmF0aGVyIHRoYW4gZmZsdXNoKCkgdGhyb3VnaG91dCB0aGUgY29kZSwgc2V0IHN0ZG91dCB0byAKKwkgKiBiZSB1bmJ1ZmZlcmVkLiAKKwkgKi8KKwlzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsgCisKKwkvKiBQYXJzZSB0aGUgYXJndW1lbnRzLiAgKi8KKwl3aGlsZSAoMSkgeworCQljID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJIOlA6aDpwOlM6STpOIiwKKwkJCQkgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKKwkJaWYgKGMgPT0gLTEpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAwOgorCQkJcHJpbnRmKCJvcHRpb24gJXMiLCBsb25nX29wdGlvbnNbb3B0aW9uX2luZGV4XS5uYW1lKTsKKwkJCWlmIChvcHRhcmcpIHsKKwkJCQlwcmludGYoIiB3aXRoIGFyZyAlcyIsIG9wdGFyZyk7CisJCQl9CisJCQlwcmludGYoIlxuIik7CisJCQlicmVhazsKKwkJY2FzZSAxOgkJLyogbG9jYWwgaG9zdCAqLworCQljYXNlICdIJzoKKwkJCWxvY2FsX2hvc3QgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAyOgkJLyogbG9jYWwgcG9ydCAqLworCQljYXNlICdQJzoKKwkJCWxvY2FsX3BvcnQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAzOgkJLyogcmVtb3RlIGhvc3QgKi8KKwkJY2FzZSAnaCc6CisJCQlyZW1vdGVfaG9zdCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlIDQ6CQkvKiByZW1vdGUgcG9ydCAqLworCQljYXNlICdwJzoKKwkJCXJlbW90ZV9wb3J0ID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgNToJCS8qIHNpemUgKi8KKwkJY2FzZSAnUyc6CisJCQlzaXplID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgNjoJCS8qIGludGVydmFsICovCisJCWNhc2UgJ0knOgorCQkJaW50ZXJ2YWwgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAxMDoJIC8qIG5vZGVsYXkgKi8KKwkJY2FzZSAnTic6CisJCQlub2RlbGF5ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJZXhpdCgwKTsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRmICgiJXM6IHVucmVjb2duaXplZCBvcHRpb24gMCVjXG4iLAorCQkJCWFyZ3ZbMF0sIGMpOworCQkJdXNhZ2UoYXJndlswXSk7CisJCQlleGl0KDEpOworCQl9CisJfQorCisJaWYgKG9wdGluZCA8IGFyZ2MpCisJeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBub24tb3B0aW9uIGFyZ3VtZW50cyBhcmUgaWxsZWdhbDogIiwKKwkJCWFyZ3ZbMF0pOworCQl3aGlsZSAob3B0aW5kIDwgYXJnYykKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMgIiwgYXJndltvcHRpbmQrK10pOworCQlmcHJpbnRmIChzdGRlcnIsICJcbiIpOworCQl1c2FnZShhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoIWxvY2FsX2hvc3QgfHwgIXJlbW90ZV9ob3N0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IDogb3B0aW9uIC0tbG9jYWwgYW5kIC0tcmVtb3RlIGFyZSByZXF1aXJlZFxuIiwKKwkJCWFyZ3ZbMF0pOworCQl1c2FnZShhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBTZXQgc29tZSBiYXNpYyB2YWx1ZXMgd2hpY2ggZGVwZW5kIG9uIHRoZSBhZGRyZXNzIGZhbWlseS4gKi8KKwlpZiAoIXN0cmNtcChsb2NhbF9ob3N0LCAiMCIpKQorCQlsb2NhbF9ob3N0ID0gIjAuMC4wLjAiOworCisJc25wcmludGYocG9ydF9idWZmZXIsIDEwLCAiJWQiLCBsb2NhbF9wb3J0KTsKKwllcnJvciA9IGdldGFkZHJpbmZvKGxvY2FsX2hvc3QsIHBvcnRfYnVmZmVyLCBOVUxMLCAmaHN0X3Jlcyk7CisJaWYgKGVycm9yKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGdldGFkZHJpbmZvIGZhaWxlZDogJXNcbiIsIGFyZ3ZbMF0sIGxvY2FsX2hvc3QpOworCQlleGl0KDEpOworCX0KKworCXNucHJpbnRmKHBvcnRfYnVmZmVyLCAxMCwgIiVkIiwgcmVtb3RlX3BvcnQpOworCWVycm9yID0gZ2V0YWRkcmluZm8ocmVtb3RlX2hvc3QsIHBvcnRfYnVmZmVyLCBOVUxMLCAmdGd0X3Jlcyk7CisJaWYgKGVycm9yKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGdldGFkZHJpbmZvIGZhaWxlZDogJXNcbiIsIGFyZ3ZbMF0sIHJlbW90ZV9ob3N0KTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoIGhzdF9yZXMtPmFpX2ZhbWlseSAhPSB0Z3RfcmVzLT5haV9mYW1pbHkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJsb2NhbCBhbmQgcmVvbXRlIGhvc3RzIHNob3VsZCBiZSB0aGUgIiAKKwkJCSJzYW1lIGFkZHJlc3MgZmFtaWx5XG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlwZl9jbGFzcyA9IGhzdF9yZXMtPmFpX2ZhbWlseTsKKwlzd2l0Y2ggKHBmX2NsYXNzKSB7CisJY2FzZSBBRl9JTkVUOgorCWNhc2UgQUZfSU5FVDY6CisJCW1lbWNweSgmaG9zdC5zYSwgaHN0X3Jlcy0+YWlfYWRkciwgaHN0X3Jlcy0+YWlfYWRkcmxlbik7CisJCW1lbWNweSgmdGFyZ2V0LnNhLCB0Z3RfcmVzLT5haV9hZGRyLCB0Z3RfcmVzLT5haV9hZGRybGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGFkZHJlc3MgdHlwZS5cbiIpOworCQlleGl0KDEpOworCQlicmVhazsKKwl9CisKKwlmcmVlYWRkcmluZm8oaHN0X3Jlcyk7CisJZnJlZWFkZHJpbmZvKHRndF9yZXMpOworCisJc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisKKwkvKiBFbmFibGUgQVNTT0NfQ0hBTkdFIGFuZCBTTkRSQ1ZJTkZPIG5vdGlmaWNhdGlvbnMuICovCisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKHNrKTsKKworCXRlc3Rfc2V0c29ja29wdChzaywgU0NUUF9OT0RFTEFZLCAmbm9kZWxheSwgc2l6ZW9mKGludCkpOworCisJLyogQmluZCB0aGUgc29ja2V0cyB0byB0aGUgdGVzdCBwb3J0LiAgKi8KKwl0ZXN0X2JpbmQoc2ssICZob3N0LnNhLCBzaXplb2YoaG9zdCkpOworCisJLyogTWFyayBzayBhcyBiZWluZyBhYmxlIHRvIGFjY2VwdCBuZXcgYXNzb2NpYXRpb25zLiAgKi8KKwl0ZXN0X2xpc3RlbihzaywgMSk7CisKKwkvKiBCdWlsZCB1cCBhIG1zZ2hkciBzdHJ1Y3R1cmUgd2UgY2FuIHVzZSBmb3IgYWxsIHNlbmRpbmcuICAqLworCW91dG1lc3NhZ2UubXNnX25hbWUgPSAmdGFyZ2V0OworCW91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2YodGFyZ2V0KTsKKwlvdXRtZXNzYWdlLm1zZ19pb3YgPSAmb3V0X2lvdjsKKwlvdXRtZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworCW91dG1lc3NhZ2UubXNnX2NvbnRyb2wgPSBvdXRjbXNnOworCW91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2Yob3V0Y21zZyk7CisJb3V0bWVzc2FnZS5tc2dfZmxhZ3MgPSAwOworCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZvdXRtZXNzYWdlKTsKKwljbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworCWNtc2ctPmNtc2dfdHlwZSA9IFNDVFBfU05EUkNWOworCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47CisJc2luZm8gPSAoc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqKUNNU0dfREFUQShjbXNnKTsKKwltZW1zZXQoc2luZm8sIDB4MDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJcHBpZCA9IHJhbmQoKTsgLyogQ2hvb3NlIGFuIGFyYml0cmFyeSB2YWx1ZS4gKi8KKwlzdHJlYW0gPSAxOyAKKwlzaW5mby0+c2luZm9fcHBpZCA9IHBwaWQ7CisJc2luZm8tPnNpbmZvX3N0cmVhbSA9IHN0cmVhbTsKKworCW1lc3NhZ2UgPSB0ZXN0X21hbGxvYygoc2l6ZSArIDEpICogc2l6ZW9mKHVfaW50OF90KSk7CisKKwlmb3IoaT0wOyBpICsgMTAgPCBzaXplOyBpKz0gMTApCisJCW1lbWNweShtZXNzYWdlK2ksICIxMjM0NTY3ODkwIiwgMTApOworCXN0cm5jcHkobWVzc2FnZStpLCAiMTIzNDU2Nzg5MCIsIHNpemUtaSk7CisJKihtZXNzYWdlK3NpemUpID0gMDsKKworCW91dG1lc3NhZ2UubXNnX2lvdi0+aW92X2Jhc2UgPSBtZXNzYWdlOworCW91dG1lc3NhZ2UubXNnX2lvdi0+aW92X2xlbiA9IHNpemUgKyAxOworCisJcHJpbnRmKCJJbml0aWF0aW5nIGNvbm5lY3Rpb24gd2l0aCAlczolZC4uLlxuIiwgcmVtb3RlX2hvc3QsCisJICAgICAgIHJlbW90ZV9wb3J0KTsKKworCS8qIFNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UuICBUaGlzIHdpbGwgY3JlYXRlIHRoZSBhc3NvY2lhdGlvbi4gICovCisJdGVzdF9zZW5kbXNnKHNrLCAmb3V0bWVzc2FnZSwgMCwgc2l6ZSsxKTsKKworCW1lbXNldCgmaW5tZXNzYWdlLCAwLCBzaXplb2YoaW5tZXNzYWdlKSk7CisJYmlnX2J1ZmZlciA9IHRlc3RfbWFsbG9jKFJFQUxMWV9CSUcpOworCWlvdi5pb3ZfYmFzZSA9IGJpZ19idWZmZXI7CisJaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworCWlubWVzc2FnZS5tc2dfaW92ID0gJmlvdjsKKwlpbm1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisJaW5tZXNzYWdlLm1zZ19jb250cm9sID0gaW5jbXNnOworCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCWlubWVzc2FnZS5tc2dfbmFtZSA9ICZtc2duYW1lOworCWlubWVzc2FnZS5tc2dfbmFtZWxlbiA9IHNpemVvZihtc2duYW1lKTsKKwltZW1zZXQoJm1zZ25hbWUsIDAsIHNpemVvZihtc2duYW1lKSk7CisKKwkvKiBHZXQgdGhlIGNvbW11bmljYXRpb24gdXAgbWVzc2FnZSBvbiBzay4gICovCisJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc2ssICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9DT01NX1VQKTsJCisJYXNzb2NpZCA9ICgoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICopaW92Lmlvdl9iYXNlKS0+c2FjX2Fzc29jX2lkOworCisJcHJpbnRmKCJFc3RhYmxpc2hlZCBjb25uZWN0aW9uIHdpdGggIik7CQorCWlmIChBRl9JTkVUID09IG1zZ25hbWUuc2Euc2FfZmFtaWx5KQorCQlwcmludGYoIiVkLiVkLiVkLiVkKCVkKVxuIiwgTklQUVVBRChtc2duYW1lLnY0LnNpbl9hZGRyKSwKKwkJICAgICAgIG50b2hzKG1zZ25hbWUudjQuc2luX3BvcnQpKTsKKwlpZiAoQUZfSU5FVDYgPT0gbXNnbmFtZS5zYS5zYV9mYW1pbHkpCisJCXByaW50ZigiJTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4KCVkKVxuIiwKKwkJICAgICAgIE5JUDYobXNnbmFtZS52Ni5zaW42X2FkZHIpLCBudG9ocyhtc2duYW1lLnY2LnNpbjZfcG9ydCkpOworCisJcHJpbnRmKCJTZW5kaW5nIGRhdGEgdG8gcmVjZWl2ZXIuLi5cbiIpOworCisJZm9yIChpPTE7IGk8MTAwMDAwMDsgaSsrKSB7CisKKwkJaWYgKGludGVydmFsKQorCQkJc2xlZXAoaW50ZXJ2YWwpOworCisJCW91dG1lc3NhZ2UubXNnX25hbWUgPSAmdGFyZ2V0OworCQlvdXRtZXNzYWdlLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHRhcmdldCk7CisJCW91dG1lc3NhZ2UubXNnX2lvdiA9ICZvdXRfaW92OworCQlvdXRtZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworCQlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKG91dGNtc2cpOworCQlvdXRtZXNzYWdlLm1zZ19mbGFncyA9IDA7CisKKwkJY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1lc3NhZ2UpOworCQljbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworCQljbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKwkJY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCQlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47CisJCXNpbmZvID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7CisJCW1lbXNldChzaW5mbywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKworCQlwcGlkKys7CisKKwkJc2luZm8tPnNpbmZvX3BwaWQgPSBwcGlkOworCQlzaW5mby0+c2luZm9fc3RyZWFtID0gc3RyZWFtOworCQlzaW5mby0+c2luZm9fYXNzb2NfaWQgPSBhc3NvY2lkOworCisJCW91dG1lc3NhZ2UubXNnX2lvdi0+aW92X2Jhc2UgPSBtZXNzYWdlOworCQlvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9sZW4gPSBzaXplICsgMTsKKworCQl0ZXN0X3NlbmRtc2coc2ssICZvdXRtZXNzYWdlLCAwLCBzaXplKzEpOworCX0KKworCXByaW50ZigiXG5cblx0XHRDb21wbGV0ZSBhbGwgdGhlIGRhdGEgc2VuZGluZ3MgdG8gcmVjZWl2ZXIuLi5cblxuXG4iKTsKKworCWVycm9yID0gMDsKKwljbG9zZShzayk7CisKKwlmcmVlKG1lc3NhZ2UpOworCisJLyogSW5kaWNhdGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLiAgKi8KKwlyZXR1cm4gMDsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL2FwcHMvcGVlbF9jbGllbnQuYyBiL3NyYy9hcHBzL3BlZWxfY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxOTVkMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9hcHBzL3BlZWxfY2xpZW50LmMKQEAgLTAsMCArMSw2NzIgQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAzCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogSW4gYWRkaXRpb246CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIENpc2NvCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiBhKSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogYikgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorICogICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBjKSBOZWl0aGVyIHRoZSBuYW1lIG9mIENpc2NvIFN5c3RlbXMsIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworICogT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCisgKiBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICogT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgIFJhbmRhbGwgU3Rld2FydCAgIDxycnNAY2lzY28uY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgPHNyaUB1cy5pYm0uY29tPgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKworI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2lmZGVmIF9fTmV0QlNEX18KKyNpbmNsdWRlIDxzeXMvaW50dHlwZXMuaD4KKyNlbmRpZgorCisjZGVmaW5lIFNDVFBfQ1JDMzJDX1BPTFkgMHgxRURDNkY0MQorI2RlZmluZSBTQ1RQX0NSQzMyQyhjLGQpIChjPShjPj44KV5zY3RwX2NyY19jWyhjXihkKSkmMHhGRl0pCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCisvKiBDb3B5cmlnaHQgMjAwMSwgRC4gT3Rpcy4gIFVzZSB0aGlzIHByb2dyYW0sIGNvZGUgb3IgdGFibGVzICAgICovCisvKiBleHRyYWN0ZWQgZnJvbSBpdCwgYXMgZGVzaXJlZCB3aXRob3V0IHJlc3RyaWN0aW9uLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAzMiBCaXQgUmVmbGVjdGVkIENSQyB0YWJsZSBnZW5lcmF0aW9uIGZvciBTQ1RQLiAgICAgICAgICAgICAgICovCisvKiBUbyBhY2NvbW1vZGF0ZSBzZXJpYWwgYnl0ZSBkYXRhIGJlaW5nIHNoaWZ0ZWQgb3V0IGxlYXN0ICAgICAgICovCisvKiBzaWduaWZpY2FudCBiaXQgZmlyc3QsIHRoZSB0YWJsZSdzIDMyIGJpdCB3b3JkcyBhcmUgcmVmbGVjdGVkICovCisvKiB3aGljaCBmbGlwcyBib3RoIGJ5dGUgYW5kIGJpdCBNUyBhbmQgTFMgcG9zaXRpb25zLiAgVGhlIENSQyAgICovCisvKiBpcyBjYWxjdWxhdGVkIE1TIGJpdHMgZmlyc3QgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIHNlcmlhbCovCisvKiBzdHJlYW0uICBUaGUgeF4zMiB0ZXJtIGlzIGltcGxpZWQgYW5kIHRoZSB4XjAgdGVybSBtYXkgYWxzbyAgICovCisvKiBiZSBzaG93biBhcyArMS4gIFRoZSBwb2x5bm9taWFsIGNvZGUgdXNlZCBpcyAweDFFREM2RjQxLiAgICAgICovCisvKiBDYXN0YWdub2xpOTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiB4XjMyK3heMjgreF4yNyt4XjI2K3heMjUreF4yMyt4XjIyK3heMjAreF4xOSt4XjE4K3heMTQreF4xMysgICovCisvKiB4XjExK3heMTAreF45K3heOCt4XjYreF4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBHdXkgQ2FzdGFnbm9saSBTdGVmYW4gQnJhZXVlciBhbmQgTWFydGluIEhlcnJtYW4gICAgICAgICAgICAgICovCisvKiAiT3B0aW1pemF0aW9uIG9mIEN5Y2xpYyBSZWR1bmRhbmN5LUNoZWNrIENvZGVzICAgICAgICAgICAgICAgICovCisvKiB3aXRoIDI0IGFuZCAzMiBQYXJpdHkgQml0cyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJRUVFIFRyYW5zYWN0aW9ucyBvbiBDb21tdW5pY2F0aW9ucywgVm9sLjQxLCBOby42LCBKdW5lIDE5OTMgICovCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcjFbNDEwMF07CitzdGF0aWMgdW5zaWduZWQgY2hhciBidWZmZXIyWzQxMDBdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVmZmVyM1s0MTAwXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcjRbNDEwMF07CitzdGF0aWMgc3RydWN0IHNvY2thZGRyX2luIGJpbmR0byxnb3QsdG87CitzdGF0aWMgc29ja2xlbl90IGxlbjsKKwordW5zaWduZWQgbG9uZyAgc2N0cF9jcmNfY1syNTZdID0geworCTB4MDAwMDAwMDBMLCAweEYyNkI4MzAzTCwgMHhFMTNCNzBGN0wsIDB4MTM1MEYzRjRMLAorCTB4Qzc5QTk3MUZMLCAweDM1RjExNDFDTCwgMHgyNkExRTdFOEwsIDB4RDRDQTY0RUJMLAorCTB4OEFEOTU4Q0ZMLCAweDc4QjJEQkNDTCwgMHg2QkUyMjgzOEwsIDB4OTk4OUFCM0JMLAorCTB4NEQ0M0NGRDBMLCAweEJGMjg0Q0QzTCwgMHhBQzc4QkYyN0wsIDB4NUUxMzNDMjRMLAorCTB4MTA1RUM3NkZMLCAweEUyMzU0NDZDTCwgMHhGMTY1Qjc5OEwsIDB4MDMwRTM0OUJMLAorCTB4RDdDNDUwNzBMLCAweDI1QUZEMzczTCwgMHgzNkZGMjA4N0wsIDB4QzQ5NEEzODRMLAorCTB4OUE4NzlGQTBMLCAweDY4RUMxQ0EzTCwgMHg3QkJDRUY1N0wsIDB4ODlENzZDNTRMLAorCTB4NUQxRDA4QkZMLCAweEFGNzY4QkJDTCwgMHhCQzI2Nzg0OEwsIDB4NEU0REZCNEJMLAorCTB4MjBCRDhFREVMLCAweEQyRDYwRERETCwgMHhDMTg2RkUyOUwsIDB4MzNFRDdEMkFMLAorCTB4RTcyNzE5QzFMLCAweDE1NEM5QUMyTCwgMHgwNjFDNjkzNkwsIDB4RjQ3N0VBMzVMLAorCTB4QUE2NEQ2MTFMLCAweDU4MEY1NTEyTCwgMHg0QjVGQTZFNkwsIDB4QjkzNDI1RTVMLAorCTB4NkRGRTQxMEVMLCAweDlGOTVDMjBETCwgMHg4Q0M1MzFGOUwsIDB4N0VBRUIyRkFMLAorCTB4MzBFMzQ5QjFMLCAweEMyODhDQUIyTCwgMHhEMUQ4Mzk0NkwsIDB4MjNCM0JBNDVMLAorCTB4Rjc3OURFQUVMLCAweDA1MTI1REFETCwgMHgxNjQyQUU1OUwsIDB4RTQyOTJENUFMLAorCTB4QkEzQTExN0VMLCAweDQ4NTE5MjdETCwgMHg1QjAxNjE4OUwsIDB4QTk2QUUyOEFMLAorCTB4N0RBMDg2NjFMLCAweDhGQ0IwNTYyTCwgMHg5QzlCRjY5NkwsIDB4NkVGMDc1OTVMLAorCTB4NDE3QjFEQkNMLCAweEIzMTA5RUJGTCwgMHhBMDQwNkQ0QkwsIDB4NTIyQkVFNDhMLAorCTB4ODZFMThBQTNMLCAweDc0OEEwOUEwTCwgMHg2N0RBRkE1NEwsIDB4OTVCMTc5NTdMLAorCTB4Q0JBMjQ1NzNMLCAweDM5QzlDNjcwTCwgMHgyQTk5MzU4NEwsIDB4RDhGMkI2ODdMLAorCTB4MEMzOEQyNkNMLCAweEZFNTM1MTZGTCwgMHhFRDAzQTI5QkwsIDB4MUY2ODIxOThMLAorCTB4NTEyNURBRDNMLCAweEEzNEU1OUQwTCwgMHhCMDFFQUEyNEwsIDB4NDI3NTI5MjdMLAorCTB4OTZCRjREQ0NMLCAweDY0RDRDRUNGTCwgMHg3Nzg0M0QzQkwsIDB4ODVFRkJFMzhMLAorCTB4REJGQzgyMUNMLCAweDI5OTcwMTFGTCwgMHgzQUM3RjJFQkwsIDB4QzhBQzcxRThMLAorCTB4MUM2NjE1MDNMLCAweEVFMEQ5NjAwTCwgMHhGRDVENjVGNEwsIDB4MEYzNkU2RjdMLAorCTB4NjFDNjkzNjJMLCAweDkzQUQxMDYxTCwgMHg4MEZERTM5NUwsIDB4NzI5NjYwOTZMLAorCTB4QTY1QzA0N0RMLCAweDU0Mzc4NzdFTCwgMHg0NzY3NzQ4QUwsIDB4QjUwQ0Y3ODlMLAorCTB4RUIxRkNCQURMLCAweDE5NzQ0OEFFTCwgMHgwQTI0QkI1QUwsIDB4Rjg0RjM4NTlMLAorCTB4MkM4NTVDQjJMLCAweERFRUVERkIxTCwgMHhDREJFMkM0NUwsIDB4M0ZENUFGNDZMLAorCTB4NzE5ODU0MERMLCAweDgzRjNENzBFTCwgMHg5MEEzMjRGQUwsIDB4NjJDOEE3RjlMLAorCTB4QjYwMkMzMTJMLCAweDQ0Njk0MDExTCwgMHg1NzM5QjNFNUwsIDB4QTU1MjMwRTZMLAorCTB4RkI0MTBDQzJMLCAweDA5MkE4RkMxTCwgMHgxQTdBN0MzNUwsIDB4RTgxMUZGMzZMLAorCTB4M0NEQjlCRERMLCAweENFQjAxOERFTCwgMHhEREUwRUIyQUwsIDB4MkY4QjY4MjlMLAorCTB4ODJGNjNCNzhMLCAweDcwOURCODdCTCwgMHg2M0NENEI4RkwsIDB4OTFBNkM4OENMLAorCTB4NDU2Q0FDNjdMLCAweEI3MDcyRjY0TCwgMHhBNDU3REM5MEwsIDB4NTYzQzVGOTNMLAorCTB4MDgyRjYzQjdMLCAweEZBNDRFMEI0TCwgMHhFOTE0MTM0MEwsIDB4MUI3RjkwNDNMLAorCTB4Q0ZCNUY0QThMLCAweDNEREU3N0FCTCwgMHgyRThFODQ1RkwsIDB4RENFNTA3NUNMLAorCTB4OTJBOEZDMTdMLCAweDYwQzM3RjE0TCwgMHg3MzkzOENFMEwsIDB4ODFGODBGRTNMLAorCTB4NTUzMjZCMDhMLCAweEE3NTlFODBCTCwgMHhCNDA5MUJGRkwsIDB4NDY2Mjk4RkNMLAorCTB4MTg3MUE0RDhMLCAweEVBMUEyN0RCTCwgMHhGOTRBRDQyRkwsIDB4MEIyMTU3MkNMLAorCTB4REZFQjMzQzdMLCAweDJEODBCMEM0TCwgMHgzRUQwNDMzMEwsIDB4Q0NCQkMwMzNMLAorCTB4QTI0QkI1QTZMLCAweDUwMjAzNkE1TCwgMHg0MzcwQzU1MUwsIDB4QjExQjQ2NTJMLAorCTB4NjVEMTIyQjlMLCAweDk3QkFBMUJBTCwgMHg4NEVBNTI0RUwsIDB4NzY4MUQxNERMLAorCTB4Mjg5MkVENjlMLCAweERBRjk2RTZBTCwgMHhDOUE5OUQ5RUwsIDB4M0JDMjFFOURMLAorCTB4RUYwODdBNzZMLCAweDFENjNGOTc1TCwgMHgwRTMzMEE4MUwsIDB4RkM1ODg5ODJMLAorCTB4QjIxNTcyQzlMLCAweDQwN0VGMUNBTCwgMHg1MzJFMDIzRUwsIDB4QTE0NTgxM0RMLAorCTB4NzU4RkU1RDZMLCAweDg3RTQ2NkQ1TCwgMHg5NEI0OTUyMUwsIDB4NjZERjE2MjJMLAorCTB4MzhDQzJBMDZMLCAweENBQTdBOTA1TCwgMHhEOUY3NUFGMUwsIDB4MkI5Q0Q5RjJMLAorCTB4RkY1NkJEMTlMLCAweDBEM0QzRTFBTCwgMHgxRTZEQ0RFRUwsIDB4RUMwNjRFRURMLAorCTB4QzM4RDI2QzRMLCAweDMxRTZBNUM3TCwgMHgyMkI2NTYzM0wsIDB4RDBEREQ1MzBMLAorCTB4MDQxN0IxREJMLCAweEY2N0MzMkQ4TCwgMHhFNTJDQzEyQ0wsIDB4MTc0NzQyMkZMLAorCTB4NDk1NDdFMEJMLCAweEJCM0ZGRDA4TCwgMHhBODZGMEVGQ0wsIDB4NUEwNDhERkZMLAorCTB4OEVDRUU5MTRMLCAweDdDQTU2QTE3TCwgMHg2RkY1OTlFM0wsIDB4OUQ5RTFBRTBMLAorCTB4RDNEM0UxQUJMLCAweDIxQjg2MkE4TCwgMHgzMkU4OTE1Q0wsIDB4QzA4MzEyNUZMLAorCTB4MTQ0OTc2QjRMLCAweEU2MjJGNUI3TCwgMHhGNTcyMDY0M0wsIDB4MDcxOTg1NDBMLAorCTB4NTkwQUI5NjRMLCAweEFCNjEzQTY3TCwgMHhCODMxQzk5M0wsIDB4NEE1QTRBOTBMLAorCTB4OUU5MDJFN0JMLCAweDZDRkJBRDc4TCwgMHg3RkFCNUU4Q0wsIDB4OERDMEREOEZMLAorCTB4RTMzMEE4MUFMLCAweDExNUIyQjE5TCwgMHgwMjBCRDhFREwsIDB4RjA2MDVCRUVMLAorCTB4MjRBQTNGMDVMLCAweEQ2QzFCQzA2TCwgMHhDNTkxNEZGMkwsIDB4MzdGQUNDRjFMLAorCTB4NjlFOUYwRDVMLCAweDlCODI3M0Q2TCwgMHg4OEQyODAyMkwsIDB4N0FCOTAzMjFMLAorCTB4QUU3MzY3Q0FMLCAweDVDMThFNEM5TCwgMHg0RjQ4MTczREwsIDB4QkQyMzk0M0VMLAorCTB4RjM2RTZGNzVMLCAweDAxMDVFQzc2TCwgMHgxMjU1MUY4MkwsIDB4RTAzRTlDODFMLAorCTB4MzRGNEY4NkFMLCAweEM2OUY3QjY5TCwgMHhENUNGODg5REwsIDB4MjdBNDBCOUVMLAorCTB4NzlCNzM3QkFMLCAweDhCRENCNEI5TCwgMHg5ODhDNDc0REwsIDB4NkFFN0M0NEVMLAorCTB4QkUyREEwQTVMLCAweDRDNDYyM0E2TCwgMHg1RjE2RDA1MkwsIDB4QUQ3RDUzNTFMLAorfTsKKwordV9pbnQzMl90Cit1cGRhdGVfY3JjMzIodV9pbnQzMl90IGNyYzMyLAorCSAgICAgdW5zaWduZWQgY2hhciAqYnVmZmVyLAorCSAgICAgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJU0NUUF9DUkMzMkMoY3JjMzIsIGJ1ZmZlcltpXSk7CisJfQorCXJldHVybiAoY3JjMzIpOworfQorCit1X2ludDMyX3QKK3NjdHBfY3N1bV9maW5hbGl6ZSh1X2ludDMyX3QgY3JjMzIpCit7CisJdV9pbnQzMl90IHJlc3VsdDsKKyNpZiBCWVRFX09SREVSID09IEJJR19FTkRJQU4KKwl1X2ludDhfdCBieXRlMCwgYnl0ZTEsIGJ5dGUyLCBieXRlMzsKKyNlbmRpZgorCS8qIENvbXBsZW1lbnQgdGhlIHJlc3VsdCAqLworCXJlc3VsdCA9IH5jcmMzMjsKKyNpZiBCWVRFX09SREVSID09IEJJR19FTkRJQU4KKwkvKgorCSAqIEZvciBCSUctRU5ESUFOLi4gYWthIE1vdG9yb2xhIGJ5dGUgb3JkZXIgdGhlIHJlc3VsdCBpcyBpbgorCSAqIGxpdHRsZS1lbmRpYW4gZm9ybS4gU28gd2UgbXVzdCBtYW51YWxseSBzd2FwIHRoZSBieXRlcy4gVGhlbgorCSAqIHdlIGNhbiBjYWxsIGh0b25sKCkgd2hpY2ggZG9lcyBub3RoaW5nLi4uCisJICovCisJYnl0ZTAgPSByZXN1bHQgJiAweDAwMDAwMGZmOworCWJ5dGUxID0gKHJlc3VsdCA+PiA4KSAmIDB4MDAwMDAwZmY7CisJYnl0ZTIgPSAocmVzdWx0ID4+IDE2KSAmIDB4MDAwMDAwZmY7CisJYnl0ZTMgPSAocmVzdWx0ID4+IDI0KSAmIDB4MDAwMDAwZmY7CisJcmVzdWx0ID0gKChieXRlMCA8PCAyNCkgfAorCQkgIChieXRlMSA8PCAxNikgfAorCQkgIChieXRlMiA8PCA4KSB8CisJCSAgYnl0ZTMpOworCWNyYzMyID0gaHRvbmwocmVzdWx0KTsKKyNlbHNlCisJLyoKKwkgKiBGb3IgSU5URUwgcGxhdGZvcm1zIHRoZSByZXN1bHQgY29tZXMgb3V0IGluIG5ldHdvcmsgb3JkZXIuCisJICogTm8gaHRvbmwgaXMgcmVxdWlyZWQgb3IgdGhlIHN3YXAgYWJvdmUuIFNvIHdlIG9wdGltaXplIG91dAorCSAqIGJvdGggdGhlIGh0b25sIGFuZCB0aGUgbWFudWFsIHN3YXAgYWJvdmUuCisJICovCisJY3JjMzIgPSByZXN1bHQ7CisjZW5kaWYKKwlyZXR1cm4gKGNyYzMyKTsKK30KKworc3RhdGljIHVfaW50MzJfdCBhdCA9IDQ2ODcwMDsKKwordm9pZAorcHJlcGFyZV9idWZmZXJzKHZvaWQpCit7CisgICAgICAgIC8qIFByZXBhcmUgYnVmZmVycyAqLworCXVfaW50MzJfdCB0ZW1wLCpwOworCWludCBpOworCisJcCA9ICh1X2ludDMyX3QgKilidWZmZXIxOworCWZvcihpPTA7aTwoc2l6ZW9mKGJ1ZmZlcjEpLzQpO2krKyl7CisJCSpwID0gYXQ7CisJCWF0Kys7CisJCXArKzsKKwl9CisJLyogYmFja3VwIG92ZXIgdGhlIGxhc3QgaW50ICovCisJcC0tOworCSpwID0gMDsKKwl0ZW1wID0gMHhmZmZmZmZmZjsKKwl0ZW1wID0gdXBkYXRlX2NyYzMyKHRlbXAsYnVmZmVyMSwoc2l6ZW9mKGJ1ZmZlcjEpLTQpKTsKKwkqcCA9IHNjdHBfY3N1bV9maW5hbGl6ZSh0ZW1wKTsKKworCXAgPSAodV9pbnQzMl90ICopYnVmZmVyMjsKKwlmb3IoaT0wO2k8KHNpemVvZihidWZmZXIyKS80KTtpKyspeworCQkqcCA9IGF0OworCQlhdCsrOworCQlwKys7CisJfQorCXAtLTsKKwkqcCA9IDA7CisJdGVtcCA9IDB4ZmZmZmZmZmY7CisJdGVtcCA9IHVwZGF0ZV9jcmMzMih0ZW1wLGJ1ZmZlcjIsKHNpemVvZihidWZmZXIyKS00KSk7CisJKnAgPSBzY3RwX2NzdW1fZmluYWxpemUodGVtcCk7CisKKwlwID0gKHVfaW50MzJfdCAqKWJ1ZmZlcjM7CisJZm9yKGk9MDtpPChzaXplb2YoYnVmZmVyMykvNCk7aSsrKXsKKwkJKnAgPSBhdDsKKwkJYXQrKzsKKwkJcCsrOworCX0KKwlwLS07CisJKnAgPSAwOworCXRlbXAgPSAweGZmZmZmZmZmOworCXRlbXAgPSB1cGRhdGVfY3JjMzIodGVtcCxidWZmZXIzLChzaXplb2YoYnVmZmVyMyktNCkpOworCSpwID0gc2N0cF9jc3VtX2ZpbmFsaXplKHRlbXApOworCisJcCA9ICh1X2ludDMyX3QgKilidWZmZXI0OworCWZvcihpPTA7aTwoc2l6ZW9mKGJ1ZmZlcjQpLzQpO2krKyl7CisJCSpwID0gYXQ7CisJCWF0Kys7CisJCXArKzsKKwl9CisJcC0tOworCSpwID0gMDsKKwl0ZW1wID0gMHhmZmZmZmZmZjsKKwl0ZW1wID0gdXBkYXRlX2NyYzMyKHRlbXAsYnVmZmVyNCwoc2l6ZW9mKGJ1ZmZlcjQpLTQpKTsKKwkqcCA9IHNjdHBfY3N1bV9maW5hbGl6ZSh0ZW1wKTsKK30KKworc3RhdGljIGludAorbXlfaGFuZGxlX25vdGlmaWNhdGlvbihpbnQgZmQsY2hhciAqbm90aWZ5X2J1ZikgeworCXVuaW9uIHNjdHBfbm90aWZpY2F0aW9uICpzbnA7CisJc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICpzYWM7CisJc3RydWN0IHNjdHBfcGFkZHJfY2hhbmdlICpzcGM7CisJc3RydWN0IHNjdHBfcmVtb3RlX2Vycm9yICpzcmU7CisJc3RydWN0IHNjdHBfc2VuZF9mYWlsZWQgKnNzZjsKKwlzdHJ1Y3Qgc2N0cF9zaHV0ZG93bl9ldmVudCAqc3NlOworCWludCBhc29jRG93bjsKKwljaGFyICpzdHI7CisJY2hhciBidWZbMjU2XTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OworCisJYXNvY0Rvd24gPSAwOworCXNucCA9ICh1bmlvbiBzY3RwX25vdGlmaWNhdGlvbiAqKW5vdGlmeV9idWY7CisJc3dpdGNoKHNucC0+c25faGVhZGVyLnNuX3R5cGUpIHsKKwljYXNlIFNDVFBfQVNTT0NfQ0hBTkdFOgorCQlzYWMgPSAmc25wLT5zbl9hc3NvY19jaGFuZ2U7CisJCXN3aXRjaChzYWMtPnNhY19zdGF0ZSkgeworCisJCWNhc2UgU0NUUF9DT01NX1VQOgorCQkJc3RyID0gIkNPTU1VTklDQVRJT04gVVAiOworCQkJYnJlYWs7CisJCWNhc2UgU0NUUF9DT01NX0xPU1Q6CisJCQlzdHIgPSAiQ09NTVVOSUNBVElPTiBMT1NUIjsKKwkJCWFzb2NEb3duID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFNDVFBfUkVTVEFSVDoKKwkJICAgICAgICBzdHIgPSAiUkVTVEFSVCI7CisJCQlicmVhazsKKwkJY2FzZSBTQ1RQX1NIVVRET1dOX0NPTVA6CisJCQlzdHIgPSAiU0hVVERPV04gQ09NUExFVEUiOworCQkJYXNvY0Rvd24gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgU0NUUF9DQU5UX1NUUl9BU1NPQzoKKwkJCXN0ciA9ICJDQU5UIFNUQVJUIEFTU09DIjsKKwkJCXByaW50ZigiRVhJVDpTQ1RQX0FTU09DX0NIQU5HRTogJXMsIGFzc29jPSV4aFxuIiwgc3RyLAorCQkJICAgICAgICh1aW50MzJfdClzYWMtPnNhY19hc3NvY19pZCk7CisJCQlleGl0KDApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdHIgPSAiVU5LTk9XTiI7CisJCX0gLyogZW5kIHN3aXRjaChzYWMtPnNhY19zdGF0ZSkgKi8KKwkJcHJpbnRmKCJTQ1RQX0FTU09DX0NIQU5HRTogJXMsIGFzc29jPSV4aFxuIiwgc3RyLAorCQkgICAgICAgKHVpbnQzMl90KXNhYy0+c2FjX2Fzc29jX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX1BFRVJfQUREUl9DSEFOR0U6CisJCXNwYyA9ICZzbnAtPnNuX3BhZGRyX2NoYW5nZTsKKwkJc3dpdGNoKHNwYy0+c3BjX3N0YXRlKSB7CisJCWNhc2UgU0NUUF9BRERSX0FWQUlMQUJMRToKKwkJCXN0ciA9ICJBRERSRVNTIEFWQUlMQUJMRSI7CisJCQlicmVhazsKKwkJY2FzZSBTQ1RQX0FERFJfVU5SRUFDSEFCTEU6CisJCQlzdHIgPSAiQUREUkVTUyBVTkFWQUlMQUJMRSI7CisJCQlicmVhazsKKwkJY2FzZSBTQ1RQX0FERFJfUkVNT1ZFRDoKKwkJCXN0ciA9ICJBRERSRVNTIFJFTU9WRUQiOworCQkJYnJlYWs7CisJCWNhc2UgU0NUUF9BRERSX0FEREVEOgorCQkJc3RyID0gIkFERFJFU1MgQURERUQiOworCQkJYnJlYWs7CisJCWNhc2UgU0NUUF9BRERSX01BREVfUFJJTToKKwkJCXN0ciA9ICJBRERSRVNTIE1BREUgUFJJTUFSWSI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN0ciA9ICJVTktOT1dOIjsKKwkJfSAvKiBlbmQgc3dpdGNoICovCisJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzcGMtPnNwY19hYWRkcjsKKwkJaWYgKHNpbjYtPnNpbjZfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCQlpbmV0X250b3AoQUZfSU5FVDYsIChjaGFyKikmc2luNi0+c2luNl9hZGRyLCBidWYsIHNpemVvZihidWYpKTsKKwkJfSBlbHNlIHsKKwkJCXNpbiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmc3BjLT5zcGNfYWFkZHI7CisJCQlpbmV0X250b3AoQUZfSU5FVCwgKGNoYXIqKSZzaW4tPnNpbl9hZGRyLCBidWYsIHNpemVvZihidWYpKTsKKwkJfQorCQlwcmludGYoIlNDVFBfUEVFUl9BRERSX0NIQU5HRTogJXMsIGFkZHI9JXMsIGFzc29jPSV4aFxuIiwgc3RyLAorCQkgICAgICAgYnVmLCAodWludDMyX3Qpc3BjLT5zcGNfYXNzb2NfaWQpOworCQlicmVhazsKKwljYXNlIFNDVFBfUkVNT1RFX0VSUk9SOgorCQlzcmUgPSAmc25wLT5zbl9yZW1vdGVfZXJyb3I7CisJCXByaW50ZigiU0NUUF9SRU1PVEVfRVJST1I6IGFzc29jPSV4aFxuIiwKKwkJICAgICAgICh1aW50MzJfdClzcmUtPnNyZV9hc3NvY19pZCk7CisJCWJyZWFrOworCWNhc2UgU0NUUF9TRU5EX0ZBSUxFRDoKKwkJc3NmID0gJnNucC0+c25fc2VuZF9mYWlsZWQ7CisJCXByaW50ZigiU0NUUF9TRU5EX0ZBSUxFRDogYXNzb2M9JXhoXG4iLAorCQkgICAgICAgKHVpbnQzMl90KXNzZi0+c3NmX2Fzc29jX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX0FEQVBUQVRJT05fSU5ESUNBVElPTjoKKwkgIHsKKwkgICAgc3RydWN0IHNjdHBfYWRhcHRhdGlvbl9ldmVudCAqYWU7CisJICAgIGFlID0gJnNucC0+c25fYWRhcHRhdGlvbl9ldmVudDsKKwkgICAgcHJpbnRmKCJcblNDVFBfYWRhcHRhdGlvbl9pbmRpY2F0aW9uIGJpdHM6MHgleFxuIiwKKwkJICAgKHVfaW50KWFlLT5zYWlfYWRhcHRhdGlvbl9pbmQpOworCSAgfQorCSAgYnJlYWs7CisJY2FzZSBTQ1RQX1BBUlRJQUxfREVMSVZFUllfRVZFTlQ6CisJICB7CisJICAgIHN0cnVjdCBzY3RwX3BkYXBpX2V2ZW50ICpwZGFwaTsKKwkgICAgcGRhcGkgPSAmc25wLT5zbl9wZGFwaV9ldmVudDsKKwkgICAgcHJpbnRmKCJTQ1RQX1BELUFQSSBldmVudDoldVxuIiwKKwkJICAgcGRhcGktPnBkYXBpX2luZGljYXRpb24pOworCSAgICBpZihwZGFwaS0+cGRhcGlfaW5kaWNhdGlvbiA9PSAwKXsKKwkJICAgIHByaW50ZigiUERJLSBBYm9ydGVkXG4iKTsKKwkgICAgfQorCSAgfQorCSAgYnJlYWs7CisKKwljYXNlIFNDVFBfU0hVVERPV05fRVZFTlQ6CisgICAgICAgICAgICAgICAgc3NlID0gJnNucC0+c25fc2h1dGRvd25fZXZlbnQ7CisJCXByaW50ZigiU0NUUF9TSFVURE9XTl9FVkVOVDogYXNzb2M9JXhoXG4iLAorCQkgICAgICAgKHVpbnQzMl90KXNzZS0+c3NlX2Fzc29jX2lkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJVbmtub3duIG5vdGlmaWNhdGlvbiBldmVudCB0eXBlPSV4aFxuIiwgCisJCSAgICAgICBzbnAtPnNuX2hlYWRlci5zbl90eXBlKTsKKwl9IC8qIGVuZCBzd2l0Y2goc25wLT5zbl90eXBlKSAqLworCWlmKGFzb2NEb3duKXsKKwkJcHJpbnRmKCJCcmluZyBhc3NvY2lhdGlvbiBiYWNrIHVwXG4iKTsKKwkJbGVuID0gc2l6ZW9mKHRvKTsKKwkJaWYoY29ubmVjdChmZCwoc3RydWN0IHNvY2thZGRyICopJnRvLGxlbikgPT0gLTEpeworCQkJcHJpbnRmKCJTb3JyeSBjb25uZWN0IGZhaWxzICVkXG4iLGVycm5vKTsKKwkJfQorCQlyZXR1cm4oMSk7CisJfQorCXJldHVybigwKTsKK30KKworCisJCitpbnQKK215X3NjdHBSZWFkSW5wdXQoaW50IGZkKQoreworCS8qIHJlY2VpdmUgc29tZSBudW1iZXIgb2YgZGF0YWdyYW1zIGFuZAorCSAqIGFjdCBvbiB0aGVtLgorCSAqLworCWludCBzejsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlzdHJ1Y3QgaW92ZWMgaW92WzJdOworCXVuc2lnbmVkIGNoYXIgZnJvbVsyMDBdOworCWNoYXIgcmVhZEJ1ZmZlcls2NTUzNV07CisJY2hhciBjb250cm9sVmVjdG9yWzY1NTM1XTsKKyAgCisJaW92WzBdLmlvdl9iYXNlID0gcmVhZEJ1ZmZlcjsKKwlpb3ZbMF0uaW92X2xlbiA9IHNpemVvZihyZWFkQnVmZmVyKTsKKwlpb3ZbMV0uaW92X2Jhc2UgPSBOVUxMOworCWlvdlsxXS5pb3ZfbGVuID0gMDsKKwltc2cubXNnX25hbWUgPSAoY2FkZHJfdClmcm9tOworCW1zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihmcm9tKTsKKwltc2cubXNnX2lvdiA9IGlvdjsKKwltc2cubXNnX2lvdmxlbiA9IDE7CisJbXNnLm1zZ19jb250cm9sID0gKGNhZGRyX3QpY29udHJvbFZlY3RvcjsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoY29udHJvbFZlY3Rvcik7CisJbXNnLm1zZ19mbGFncyA9IDA7CisJZXJybm8gPSAwOworCXN6ID0gcmVjdm1zZyhmZCwmbXNnLDApOworCWlmKHN6IDw9IDApeworCQlwcmludGYoIlJlYWQgcmV0dXJucyAlZCBlcnJubzolZCBjb250cm9sIGxlbiBpcyAlenUgbXNnZmxnOiV4XG4iLAorCQkgICAgICAgc3osZXJybm8sCisJCSAgICAgICBtc2cubXNnX2NvbnRyb2xsZW4sbXNnLm1zZ19mbGFncyk7CisJfQorCWlmIChtc2cubXNnX2ZsYWdzICYgTVNHX05PVElGSUNBVElPTikgeworCQlyZXR1cm4obXlfaGFuZGxlX25vdGlmaWNhdGlvbihmZCxyZWFkQnVmZmVyKSk7CisJfWVsc2V7CisJCXByaW50ZigiSHVoLCBJIGdvdCBkYXRhPy4uIGlnbm9yZWQgKCVkIGJ5dGVzKVxuIixzeik7CisJCXJldHVybigwKTsKKwl9Cit9CisKKworaW50CitjbGVhcl9mZHMoaW50IGZkLGludCBmZDEpCit7CisJaW50IGZlbGxkb3duOworCWludCBtYXgsbm90ZG9uZTsKKwlmZF9zZXQgcmVhZGZkcyx3cml0ZWZkcyxleGNlcHRmZHM7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJbWVtc2V0KCZ0diwwLHNpemVvZih0dikpOworCUZEX1pFUk8oJnJlYWRmZHMpOworCUZEX1pFUk8oJndyaXRlZmRzKTsKKwlGRF9aRVJPKCZleGNlcHRmZHMpOworCWZlbGxkb3duID0gMDsKKwlGRF9TRVQoZmQsJnJlYWRmZHMpOworCUZEX1NFVChmZDEsJnJlYWRmZHMpOworCWlmKGZkID4gZmQxKXsKKwkJbWF4ID0gZmQgKyAxOworCX1lbHNleworCQltYXggPSBmZDEgKyAxOworCX0KKwlub3Rkb25lID0gMTsKKwl3aGlsZShub3Rkb25lKXsKKwkJaWYgKHNlbGVjdChtYXgsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMsICZ0dikgPT0gLTEpCisJCQlicmVhazsKKwkJbm90ZG9uZSA9IDA7CisJCWlmKEZEX0lTU0VUKGZkLCZyZWFkZmRzKSl7CisJCQlub3Rkb25lKys7CisJCQlwcmludGYoImNsZWFyaW5nIGZkOiVkXG4iLGZkKTsKKwkJCWZlbGxkb3duICs9IG15X3NjdHBSZWFkSW5wdXQoZmQpOworCQkJbm90ZG9uZSA9IDE7CisJCX0KKwkJaWYoRkRfSVNTRVQoZmQxLCZyZWFkZmRzKSl7CisJCQlub3Rkb25lKys7CisJCQlwcmludGYoImNsZWFyaW5nIGZkMTolZFxuIixmZDEpOworCQkJZmVsbGRvd24gKz0gbXlfc2N0cFJlYWRJbnB1dChmZDEpOworCQl9CisJfQorCXJldHVybihmZWxsZG93bik7Cit9CisKK3ZvaWQKK3Byb2Nlc3Nfb3V0X2RhdGEoaW50IGZkLGludCBmZDEpCit7CisJaW50IG5vdGRvbmUseCxyZXQ7CisJd2hpbGUoMSl7CisJCS8qIFByZXBhcmUgdGhlIGJ1ZmZlcnMgKi8KKwkJcHJlcGFyZV9idWZmZXJzKCk7CisJCS8qIHNlbmQgb3V0IHRoZSA0IGJ1ZmZlcnMgKi8KKwkJcmV0ID0gc2VuZHRvKGZkLGJ1ZmZlcjEsc2l6ZW9mKGJ1ZmZlcjEpLDAsCisJCQkgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmdG8sc2l6ZW9mKHRvKSk7CisJCWlmKHJldCA8IHNpemVvZihidWZmZXIxKSl7CisJCQlwcmludGYoIkdhazEsIGVycm9yOiVkIHJldDolZFxuIixlcnJubyxyZXQpOworCQl9CisKKwkJcmV0ID0gc2VuZHRvKGZkMSxidWZmZXIyLHNpemVvZihidWZmZXIxKSwwLAorCQkJICAgICAoc3RydWN0IHNvY2thZGRyICopJnRvLHNpemVvZih0bykpOworCQlpZihyZXQgPCBzaXplb2YoYnVmZmVyMikpeworCQkJcHJpbnRmKCJHYWsyLCBlcnJvcjolZCByZXQ6JWRcbiIsZXJybm8scmV0KTsKKwkJfQorCisKKwkJcmV0ID0gc2VuZHRvKGZkLGJ1ZmZlcjMsc2l6ZW9mKGJ1ZmZlcjEpLDAsCisJCQkgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmdG8sc2l6ZW9mKHRvKSk7CisJCWlmKHJldCA8IHNpemVvZihidWZmZXIzKSl7CisJCQlwcmludGYoIkdhazMsIGVycm9yOiVkIHJldDolZFxuIixlcnJubyxyZXQpOworCQl9CisKKworCQlyZXQgPSBzZW5kdG8oZmQxLGJ1ZmZlcjQsc2l6ZW9mKGJ1ZmZlcjEpLDAsCisJCQkgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikmdG8sc2l6ZW9mKHRvKSk7CisJCWlmKHJldCA8IHNpemVvZihidWZmZXI0KSl7CisJCQlwcmludGYoIkdhazQsIGVycm9yOiVkIHJldDolZFxuIixlcnJubyxyZXQpOworCQl9CisKKwkJLyogIG5vdyB3YWl0IHVudGlsIHdlIGdldCBhIGFzc29jIGZhaWxpbmcgKi8KKwkJbm90ZG9uZSA9IDE7CisJCXdoaWxlKG5vdGRvbmUpeworCQkJeCA9IGNsZWFyX2ZkcyhmZCxmZDEpOworCQkJaWYoeCl7CisJCQkJbm90ZG9uZSA9IDA7CisJCQl9CisJCQlzbGVlcCgxKTsKKwkJfQorCX0KK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSxmZCxmZDE7CisJY2hhciAqYWRkcj1OVUxMOworCXVpbnQxNl90IHBvcnQ9MDsKKwlpbnQgcHJvdG9jb2xfdG91c2UgPSBJUFBST1RPX1NDVFA7CisJc3RydWN0IHNjdHBfZXZlbnRfc3Vic2NyaWJlIGV2ZW50ID0gezB9OworCisJd2hpbGUoKGk9IGdldG9wdChhcmdjLGFyZ3YsInA6aDoiKSkgIT0gRU9GKXsKKwkJc3dpdGNoKGkpeworCQljYXNlICdoJzoKKwkJCWFkZHIgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlwb3J0ID0gKHVpbnQxNl90KXN0cnRvbChvcHRhcmcsTlVMTCwwKTsKKwkJCWJyZWFrOworCQl9OworCX0KKwltZW1zZXQoJnRvLDAsc2l6ZW9mKHRvKSk7CisJaWYoKGFkZHIgPT0gTlVMTCkgfHwgKHBvcnQgPT0gMCkpeworCQlwcmludGYoIlVzYWdlOiAlcyAtaCBhZGRyIC1wIHBvcnRcbiIsIGFyZ3ZbMF0pOworCQlyZXR1cm4oLTEpOworCX0KKwlpZihpbmV0X3B0b24oQUZfSU5FVCwgYWRkciwgKHZvaWQgKikgJnRvLnNpbl9hZGRyKSl7CisJCS8vdG8uc2luX2xlbiA9IHNpemVvZih0byk7CisJCXRvLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlwcmludGYoInBvcnQgc2VsZWN0ZWQgaXMgJWRcbiIscG9ydCk7CisJCXByaW50ZigiYWRkciAleFxuIiwodV9pbnQpbnRvaGwodG8uc2luX2FkZHIuc19hZGRyKSk7CisJCXRvLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJfWVsc2V7CisJCXByaW50ZigiQ2FuJ3QgdHJhbnNsYXRlIHRoZSBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJLyoqKioqKioqKioqKioqKioqKioqKipzb2NrZXQgMSAqKioqKioqKioqKioqKioqKioqLworICAgICAgCWZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU0VRUEFDS0VULCBwcm90b2NvbF90b3VzZSk7CisJaWYoZmQgPT0gLTEpeworCQlwcmludGYoImNhbid0IG9wZW4gc29ja2V0OiVkXG4iLGVycm5vKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJbWVtc2V0KCZiaW5kdG8sMCxzaXplb2YoYmluZHRvKSk7CisJLy9sZW4gPSBiaW5kdG8uc2luX2xlbiA9IHNpemVvZihiaW5kdG8pOworCWxlbiA9IHNpemVvZihiaW5kdG8pOworCWJpbmR0by5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwliaW5kdG8uc2luX3BvcnQgPSAwOworCWlmKGJpbmQoZmQsKHN0cnVjdCBzb2NrYWRkciAqKSZiaW5kdG8sIGxlbikgPCAwKXsKKwkJcHJpbnRmKCJjYW4ndCBiaW5kIGEgc29ja2V0OiVkXG4iLGVycm5vKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4oLTEpOworCX0KKwlpZihnZXRzb2NrbmFtZShmZCwoc3RydWN0IHNvY2thZGRyICopJmdvdCwmbGVuKSA8IDApeworCQlwcmludGYoImdldCBzb2NrbmFtZSBmYWlsZWQgZXJyOiVkXG4iLGVycm5vKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4oLTEpOworCX0JCisJcHJpbnRmKCJmZCB1c2VzIHBvcnQgJWRcbiIsbnRvaHMoZ290LnNpbl9wb3J0KSk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKnNvY2tldCAyICoqKioqKioqKioqKioqKioqKiovCisgICAgICAJZmQxID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU0VRUEFDS0VULCBwcm90b2NvbF90b3VzZSk7CisJaWYoZmQxID09IC0xKXsKKwkJcHJpbnRmKCJjYW4ndCBvcGVuIHNvY2tldDolZFxuIixlcnJubyk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJbWVtc2V0KCZiaW5kdG8sMCxzaXplb2YoYmluZHRvKSk7CisJLy9sZW4gPSBiaW5kdG8uc2luX2xlbiA9IHNpemVvZihiaW5kdG8pOworCWxlbiA9IHNpemVvZihiaW5kdG8pOworCWJpbmR0by5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwliaW5kdG8uc2luX3BvcnQgPSAwOworCWlmKGJpbmQoZmQxLChzdHJ1Y3Qgc29ja2FkZHIgKikmYmluZHRvLCBsZW4pIDwgMCl7CisJCXByaW50ZigiY2FuJ3QgYmluZCBhIHNvY2tldDolZFxuIixlcnJubyk7CisJCWNsb3NlKGZkKTsKKwkJY2xvc2UoZmQxKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJaWYoZ2V0c29ja25hbWUoZmQxLChzdHJ1Y3Qgc29ja2FkZHIgKikmZ290LCZsZW4pIDwgMCl7CisJCXByaW50ZigiZ2V0IHNvY2tuYW1lIGZhaWxlZCBlcnI6JWRcbiIsZXJybm8pOworCQljbG9zZShmZCk7CisJCWNsb3NlKGZkMSk7CisJCXJldHVybigtMSk7CisJfQkKKwlwcmludGYoImZkMSB1c2VzIHBvcnQgJWRcbiIsbnRvaHMoZ290LnNpbl9wb3J0KSk7CisKKwkvKiBlbmFibGUgYWxsIGV2ZW50IG5vdGlmaWNhdGlvbnMgKi8KKwlldmVudC5zY3RwX2RhdGFfaW9fZXZlbnQgPSAxOworCWV2ZW50LnNjdHBfYXNzb2NpYXRpb25fZXZlbnQgPSAxOworCWV2ZW50LnNjdHBfYWRkcmVzc19ldmVudCA9IDE7CisJZXZlbnQuc2N0cF9zZW5kX2ZhaWx1cmVfZXZlbnQgPSAxOworCWV2ZW50LnNjdHBfcGVlcl9lcnJvcl9ldmVudCA9IDE7CisJZXZlbnQuc2N0cF9zaHV0ZG93bl9ldmVudCA9IDE7CisJZXZlbnQuc2N0cF9wYXJ0aWFsX2RlbGl2ZXJ5X2V2ZW50ID0gMTsKKwlldmVudC5zY3RwX2FkYXB0YXRpb25fbGF5ZXJfZXZlbnQgPSAxOworCWlmIChzZXRzb2Nrb3B0KGZkLCBJUFBST1RPX1NDVFAsIAorCQkgICAgICAgU0NUUF9FVkVOVFMsICZldmVudCwgCisJCSAgICAgICBzaXplb2YoZXZlbnQpKSAhPSAwKSB7CisJCXByaW50ZigiR2FrLCBjYW4ndCBzZXQgZXZlbnRzIGVycm5vOiVkXG4iLGVycm5vKTsKKwkJZXhpdCgwKTsKKwl9CisJaWYgKHNldHNvY2tvcHQoZmQxLCBJUFBST1RPX1NDVFAsIAorCQkgICAgICAgU0NUUF9FVkVOVFMsICZldmVudCwgCisJCSAgICAgICBzaXplb2YoZXZlbnQpKSAhPSAwKSB7CisJCXByaW50ZigiR2FrLCBjYW4ndCBzZXQgZXZlbnRzIGVycm5vOiVkXG4iLGVycm5vKTsKKwkJZXhpdCgwKTsKKwl9CisKKwlpZihjb25uZWN0KGZkLChzdHJ1Y3Qgc29ja2FkZHIgKikmdG8sbGVuKSA9PSAtMSl7CisJCXByaW50ZigiU29ycnkgY29ubmVjdCBmYWlscyAlZFxuIixlcnJubyk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJaWYoY29ubmVjdChmZDEsKHN0cnVjdCBzb2NrYWRkciAqKSZ0byxsZW4pID09IC0xKXsKKwkJcHJpbnRmKCJTb3JyeSBjb25uZWN0IGZhaWxzICVkXG4iLGVycm5vKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4oLTEpOworCX0KKwlwcmludGYoIkNvbm5lY3RlZFxuIik7CisJY2xlYXJfZmRzKGZkLGZkMSk7CisJcHJvY2Vzc19vdXRfZGF0YShmZCxmZDEpOworCisJcmV0dXJuKDApOworfQorCmRpZmYgLS1naXQgYS9zcmMvYXBwcy9wZWVsX3NlcnZlci5jIGIvc3JjL2FwcHMvcGVlbF9zZXJ2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGExZWY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2FwcHMvcGVlbF9zZXJ2ZXIuYwpAQCAtMCwwICsxLDY2NyBAQAorLyogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24KKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDMKKyAqIENvcHlyaWdodCAoYykgMjAwMyBDaXNjbworICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIEluIGFkZGl0aW9uOgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBDaXNjbworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogYSkgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICogICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIGIpIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogYykgTmVpdGhlciB0aGUgbmFtZSBvZiBDaXNjbyBTeXN0ZW1zLCBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKKyAqIE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBSYW5kYWxsIFN0ZXdhcnQgICA8cnJzQGNpc2NvLmNvbT4KKyAqICAgIFNyaWRoYXIgU2FtdWRyYWxhIDxzcmlAdXMuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisKKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpZmRlZiBfX05ldEJTRF9fCisjaW5jbHVkZSA8c3lzL2ludHR5cGVzLmg+CisjZW5kaWYKKworI2RlZmluZSBTQ1RQX0NSQzMyQ19QT0xZIDB4MUVEQzZGNDEKKyNkZWZpbmUgU0NUUF9DUkMzMkMoYyxkKSAoYz0oYz4+OClec2N0cF9jcmNfY1soY14oZCkpJjB4RkZdKQorLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLworLyogQ29weXJpZ2h0IDIwMDEsIEQuIE90aXMuICBVc2UgdGhpcyBwcm9ncmFtLCBjb2RlIG9yIHRhYmxlcyAgICAqLworLyogZXh0cmFjdGVkIGZyb20gaXQsIGFzIGRlc2lyZWQgd2l0aG91dCByZXN0cmljdGlvbi4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogMzIgQml0IFJlZmxlY3RlZCBDUkMgdGFibGUgZ2VuZXJhdGlvbiBmb3IgU0NUUC4gICAgICAgICAgICAgICAqLworLyogVG8gYWNjb21tb2RhdGUgc2VyaWFsIGJ5dGUgZGF0YSBiZWluZyBzaGlmdGVkIG91dCBsZWFzdCAgICAgICAqLworLyogc2lnbmlmaWNhbnQgYml0IGZpcnN0LCB0aGUgdGFibGUncyAzMiBiaXQgd29yZHMgYXJlIHJlZmxlY3RlZCAqLworLyogd2hpY2ggZmxpcHMgYm90aCBieXRlIGFuZCBiaXQgTVMgYW5kIExTIHBvc2l0aW9ucy4gIFRoZSBDUkMgICAqLworLyogaXMgY2FsY3VsYXRlZCBNUyBiaXRzIGZpcnN0IGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBzZXJpYWwqLworLyogc3RyZWFtLiAgVGhlIHheMzIgdGVybSBpcyBpbXBsaWVkIGFuZCB0aGUgeF4wIHRlcm0gbWF5IGFsc28gICAqLworLyogYmUgc2hvd24gYXMgKzEuICBUaGUgcG9seW5vbWlhbCBjb2RlIHVzZWQgaXMgMHgxRURDNkY0MS4gICAgICAqLworLyogQ2FzdGFnbm9saTkzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogeF4zMit4XjI4K3heMjcreF4yNit4XjI1K3heMjMreF4yMit4XjIwK3heMTkreF4xOCt4XjE0K3heMTMrICAqLworLyogeF4xMSt4XjEwK3heOSt4XjgreF42K3heMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogR3V5IENhc3RhZ25vbGkgU3RlZmFuIEJyYWV1ZXIgYW5kIE1hcnRpbiBIZXJybWFuICAgICAgICAgICAgICAqLworLyogIk9wdGltaXphdGlvbiBvZiBDeWNsaWMgUmVkdW5kYW5jeS1DaGVjayBDb2RlcyAgICAgICAgICAgICAgICAqLworLyogd2l0aCAyNCBhbmQgMzIgUGFyaXR5IEJpdHMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSUVFRSBUcmFuc2FjdGlvbnMgb24gQ29tbXVuaWNhdGlvbnMsIFZvbC40MSwgTm8uNiwgSnVuZSAxOTkzICAqLworLyogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBidWZmZXIxWzQxMDBdOworc3RhdGljIHVuc2lnbmVkIGNoYXIgYnVmZmVyMls0MTAwXTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcjNbNDEwMF07CitzdGF0aWMgdW5zaWduZWQgY2hhciBidWZmZXI0WzQxMDBdOworc3RhdGljIHN0cnVjdCBzb2NrYWRkcl9pbiBiaW5kdG8sZ290Oworc3RhdGljIHNvY2tsZW5fdCBsZW47CisKK3Vuc2lnbmVkIGxvbmcgIHNjdHBfY3JjX2NbMjU2XSA9IHsKKwkweDAwMDAwMDAwTCwgMHhGMjZCODMwM0wsIDB4RTEzQjcwRjdMLCAweDEzNTBGM0Y0TCwKKwkweEM3OUE5NzFGTCwgMHgzNUYxMTQxQ0wsIDB4MjZBMUU3RThMLCAweEQ0Q0E2NEVCTCwKKwkweDhBRDk1OENGTCwgMHg3OEIyREJDQ0wsIDB4NkJFMjI4MzhMLCAweDk5ODlBQjNCTCwKKwkweDRENDNDRkQwTCwgMHhCRjI4NENEM0wsIDB4QUM3OEJGMjdMLCAweDVFMTMzQzI0TCwKKwkweDEwNUVDNzZGTCwgMHhFMjM1NDQ2Q0wsIDB4RjE2NUI3OThMLCAweDAzMEUzNDlCTCwKKwkweEQ3QzQ1MDcwTCwgMHgyNUFGRDM3M0wsIDB4MzZGRjIwODdMLCAweEM0OTRBMzg0TCwKKwkweDlBODc5RkEwTCwgMHg2OEVDMUNBM0wsIDB4N0JCQ0VGNTdMLCAweDg5RDc2QzU0TCwKKwkweDVEMUQwOEJGTCwgMHhBRjc2OEJCQ0wsIDB4QkMyNjc4NDhMLCAweDRFNERGQjRCTCwKKwkweDIwQkQ4RURFTCwgMHhEMkQ2MEREREwsIDB4QzE4NkZFMjlMLCAweDMzRUQ3RDJBTCwKKwkweEU3MjcxOUMxTCwgMHgxNTRDOUFDMkwsIDB4MDYxQzY5MzZMLCAweEY0NzdFQTM1TCwKKwkweEFBNjRENjExTCwgMHg1ODBGNTUxMkwsIDB4NEI1RkE2RTZMLCAweEI5MzQyNUU1TCwKKwkweDZERkU0MTBFTCwgMHg5Rjk1QzIwREwsIDB4OENDNTMxRjlMLCAweDdFQUVCMkZBTCwKKwkweDMwRTM0OUIxTCwgMHhDMjg4Q0FCMkwsIDB4RDFEODM5NDZMLCAweDIzQjNCQTQ1TCwKKwkweEY3NzlERUFFTCwgMHgwNTEyNURBREwsIDB4MTY0MkFFNTlMLCAweEU0MjkyRDVBTCwKKwkweEJBM0ExMTdFTCwgMHg0ODUxOTI3REwsIDB4NUIwMTYxODlMLCAweEE5NkFFMjhBTCwKKwkweDdEQTA4NjYxTCwgMHg4RkNCMDU2MkwsIDB4OUM5QkY2OTZMLCAweDZFRjA3NTk1TCwKKwkweDQxN0IxREJDTCwgMHhCMzEwOUVCRkwsIDB4QTA0MDZENEJMLCAweDUyMkJFRTQ4TCwKKwkweDg2RTE4QUEzTCwgMHg3NDhBMDlBMEwsIDB4NjdEQUZBNTRMLCAweDk1QjE3OTU3TCwKKwkweENCQTI0NTczTCwgMHgzOUM5QzY3MEwsIDB4MkE5OTM1ODRMLCAweEQ4RjJCNjg3TCwKKwkweDBDMzhEMjZDTCwgMHhGRTUzNTE2RkwsIDB4RUQwM0EyOUJMLCAweDFGNjgyMTk4TCwKKwkweDUxMjVEQUQzTCwgMHhBMzRFNTlEMEwsIDB4QjAxRUFBMjRMLCAweDQyNzUyOTI3TCwKKwkweDk2QkY0RENDTCwgMHg2NEQ0Q0VDRkwsIDB4Nzc4NDNEM0JMLCAweDg1RUZCRTM4TCwKKwkweERCRkM4MjFDTCwgMHgyOTk3MDExRkwsIDB4M0FDN0YyRUJMLCAweEM4QUM3MUU4TCwKKwkweDFDNjYxNTAzTCwgMHhFRTBEOTYwMEwsIDB4RkQ1RDY1RjRMLCAweDBGMzZFNkY3TCwKKwkweDYxQzY5MzYyTCwgMHg5M0FEMTA2MUwsIDB4ODBGREUzOTVMLCAweDcyOTY2MDk2TCwKKwkweEE2NUMwNDdETCwgMHg1NDM3ODc3RUwsIDB4NDc2Nzc0OEFMLCAweEI1MENGNzg5TCwKKwkweEVCMUZDQkFETCwgMHgxOTc0NDhBRUwsIDB4MEEyNEJCNUFMLCAweEY4NEYzODU5TCwKKwkweDJDODU1Q0IyTCwgMHhERUVFREZCMUwsIDB4Q0RCRTJDNDVMLCAweDNGRDVBRjQ2TCwKKwkweDcxOTg1NDBETCwgMHg4M0YzRDcwRUwsIDB4OTBBMzI0RkFMLCAweDYyQzhBN0Y5TCwKKwkweEI2MDJDMzEyTCwgMHg0NDY5NDAxMUwsIDB4NTczOUIzRTVMLCAweEE1NTIzMEU2TCwKKwkweEZCNDEwQ0MyTCwgMHgwOTJBOEZDMUwsIDB4MUE3QTdDMzVMLCAweEU4MTFGRjM2TCwKKwkweDNDREI5QkRETCwgMHhDRUIwMThERUwsIDB4RERFMEVCMkFMLCAweDJGOEI2ODI5TCwKKwkweDgyRjYzQjc4TCwgMHg3MDlEQjg3QkwsIDB4NjNDRDRCOEZMLCAweDkxQTZDODhDTCwKKwkweDQ1NkNBQzY3TCwgMHhCNzA3MkY2NEwsIDB4QTQ1N0RDOTBMLCAweDU2M0M1RjkzTCwKKwkweDA4MkY2M0I3TCwgMHhGQTQ0RTBCNEwsIDB4RTkxNDEzNDBMLCAweDFCN0Y5MDQzTCwKKwkweENGQjVGNEE4TCwgMHgzRERFNzdBQkwsIDB4MkU4RTg0NUZMLCAweERDRTUwNzVDTCwKKwkweDkyQThGQzE3TCwgMHg2MEMzN0YxNEwsIDB4NzM5MzhDRTBMLCAweDgxRjgwRkUzTCwKKwkweDU1MzI2QjA4TCwgMHhBNzU5RTgwQkwsIDB4QjQwOTFCRkZMLCAweDQ2NjI5OEZDTCwKKwkweDE4NzFBNEQ4TCwgMHhFQTFBMjdEQkwsIDB4Rjk0QUQ0MkZMLCAweDBCMjE1NzJDTCwKKwkweERGRUIzM0M3TCwgMHgyRDgwQjBDNEwsIDB4M0VEMDQzMzBMLCAweENDQkJDMDMzTCwKKwkweEEyNEJCNUE2TCwgMHg1MDIwMzZBNUwsIDB4NDM3MEM1NTFMLCAweEIxMUI0NjUyTCwKKwkweDY1RDEyMkI5TCwgMHg5N0JBQTFCQUwsIDB4ODRFQTUyNEVMLCAweDc2ODFEMTRETCwKKwkweDI4OTJFRDY5TCwgMHhEQUY5NkU2QUwsIDB4QzlBOTlEOUVMLCAweDNCQzIxRTlETCwKKwkweEVGMDg3QTc2TCwgMHgxRDYzRjk3NUwsIDB4MEUzMzBBODFMLCAweEZDNTg4OTgyTCwKKwkweEIyMTU3MkM5TCwgMHg0MDdFRjFDQUwsIDB4NTMyRTAyM0VMLCAweEExNDU4MTNETCwKKwkweDc1OEZFNUQ2TCwgMHg4N0U0NjZENUwsIDB4OTRCNDk1MjFMLCAweDY2REYxNjIyTCwKKwkweDM4Q0MyQTA2TCwgMHhDQUE3QTkwNUwsIDB4RDlGNzVBRjFMLCAweDJCOUNEOUYyTCwKKwkweEZGNTZCRDE5TCwgMHgwRDNEM0UxQUwsIDB4MUU2RENERUVMLCAweEVDMDY0RUVETCwKKwkweEMzOEQyNkM0TCwgMHgzMUU2QTVDN0wsIDB4MjJCNjU2MzNMLCAweEQwRERENTMwTCwKKwkweDA0MTdCMURCTCwgMHhGNjdDMzJEOEwsIDB4RTUyQ0MxMkNMLCAweDE3NDc0MjJGTCwKKwkweDQ5NTQ3RTBCTCwgMHhCQjNGRkQwOEwsIDB4QTg2RjBFRkNMLCAweDVBMDQ4REZGTCwKKwkweDhFQ0VFOTE0TCwgMHg3Q0E1NkExN0wsIDB4NkZGNTk5RTNMLCAweDlEOUUxQUUwTCwKKwkweEQzRDNFMUFCTCwgMHgyMUI4NjJBOEwsIDB4MzJFODkxNUNMLCAweEMwODMxMjVGTCwKKwkweDE0NDk3NkI0TCwgMHhFNjIyRjVCN0wsIDB4RjU3MjA2NDNMLCAweDA3MTk4NTQwTCwKKwkweDU5MEFCOTY0TCwgMHhBQjYxM0E2N0wsIDB4QjgzMUM5OTNMLCAweDRBNUE0QTkwTCwKKwkweDlFOTAyRTdCTCwgMHg2Q0ZCQUQ3OEwsIDB4N0ZBQjVFOENMLCAweDhEQzBERDhGTCwKKwkweEUzMzBBODFBTCwgMHgxMTVCMkIxOUwsIDB4MDIwQkQ4RURMLCAweEYwNjA1QkVFTCwKKwkweDI0QUEzRjA1TCwgMHhENkMxQkMwNkwsIDB4QzU5MTRGRjJMLCAweDM3RkFDQ0YxTCwKKwkweDY5RTlGMEQ1TCwgMHg5QjgyNzNENkwsIDB4ODhEMjgwMjJMLCAweDdBQjkwMzIxTCwKKwkweEFFNzM2N0NBTCwgMHg1QzE4RTRDOUwsIDB4NEY0ODE3M0RMLCAweEJEMjM5NDNFTCwKKwkweEYzNkU2Rjc1TCwgMHgwMTA1RUM3NkwsIDB4MTI1NTFGODJMLCAweEUwM0U5QzgxTCwKKwkweDM0RjRGODZBTCwgMHhDNjlGN0I2OUwsIDB4RDVDRjg4OURMLCAweDI3QTQwQjlFTCwKKwkweDc5QjczN0JBTCwgMHg4QkRDQjRCOUwsIDB4OTg4QzQ3NERMLCAweDZBRTdDNDRFTCwKKwkweEJFMkRBMEE1TCwgMHg0QzQ2MjNBNkwsIDB4NUYxNkQwNTJMLCAweEFEN0Q1MzUxTCwKK307CisKK3VfaW50MzJfdAordXBkYXRlX2NyYzMyKHVfaW50MzJfdCBjcmMzMiwKKwkgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKwkgICAgIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCVNDVFBfQ1JDMzJDKGNyYzMyLCBidWZmZXJbaV0pOworCX0KKwlyZXR1cm4gKGNyYzMyKTsKK30KKwordV9pbnQzMl90CitzY3RwX2NzdW1fZmluYWxpemUodV9pbnQzMl90IGNyYzMyKQoreworCXVfaW50MzJfdCByZXN1bHQ7CisjaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisJdV9pbnQ4X3QgYnl0ZTAsIGJ5dGUxLCBieXRlMiwgYnl0ZTM7CisjZW5kaWYKKwkvKiBDb21wbGVtZW50IHRoZSByZXN1bHQgKi8KKwlyZXN1bHQgPSB+Y3JjMzI7CisjaWYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisJLyoKKwkgKiBGb3IgQklHLUVORElBTi4uIGFrYSBNb3Rvcm9sYSBieXRlIG9yZGVyIHRoZSByZXN1bHQgaXMgaW4KKwkgKiBsaXR0bGUtZW5kaWFuIGZvcm0uIFNvIHdlIG11c3QgbWFudWFsbHkgc3dhcCB0aGUgYnl0ZXMuIFRoZW4KKwkgKiB3ZSBjYW4gY2FsbCBodG9ubCgpIHdoaWNoIGRvZXMgbm90aGluZy4uLgorCSAqLworCWJ5dGUwID0gcmVzdWx0ICYgMHgwMDAwMDBmZjsKKwlieXRlMSA9IChyZXN1bHQgPj4gOCkgJiAweDAwMDAwMGZmOworCWJ5dGUyID0gKHJlc3VsdCA+PiAxNikgJiAweDAwMDAwMGZmOworCWJ5dGUzID0gKHJlc3VsdCA+PiAyNCkgJiAweDAwMDAwMGZmOworCXJlc3VsdCA9ICgoYnl0ZTAgPDwgMjQpIHwKKwkJICAoYnl0ZTEgPDwgMTYpIHwKKwkJICAoYnl0ZTIgPDwgOCkgfAorCQkgIGJ5dGUzKTsKKwljcmMzMiA9IGh0b25sKHJlc3VsdCk7CisjZWxzZQorCS8qCisJICogRm9yIElOVEVMIHBsYXRmb3JtcyB0aGUgcmVzdWx0IGNvbWVzIG91dCBpbiBuZXR3b3JrIG9yZGVyLgorCSAqIE5vIGh0b25sIGlzIHJlcXVpcmVkIG9yIHRoZSBzd2FwIGFib3ZlLiBTbyB3ZSBvcHRpbWl6ZSBvdXQKKwkgKiBib3RoIHRoZSBodG9ubCBhbmQgdGhlIG1hbnVhbCBzd2FwIGFib3ZlLgorCSAqLworCWNyYzMyID0gcmVzdWx0OworI2VuZGlmCisJcmV0dXJuIChjcmMzMik7Cit9CisKK2ludAorY2hlY2tfYnVmZmVycyh2b2lkKQoreworICAgICAgICAvKiBQcmVwYXJlIGJ1ZmZlcnMgKi8KKwl1X2ludDMyX3QgdGVtcCwqY3N1bTsKKwlpbnQgcmV0PTA7CisJdGVtcCA9IDB4ZmZmZmZmZmY7CisJdGVtcCA9IHVwZGF0ZV9jcmMzMih0ZW1wLGJ1ZmZlcjEsKHNpemVvZihidWZmZXIxKS00KSk7CisJdGVtcCA9IHNjdHBfY3N1bV9maW5hbGl6ZSh0ZW1wKTsKKwljc3VtID0gKHVfaW50MzJfdCAqKShidWZmZXIxKyhzaXplb2YoYnVmZmVyMSktNCkpOworCWlmKCpjc3VtICE9IHRlbXApeworCQlwcmludGYoIkJ1ZmZlcjE6IEZvdW5kIGNzdW06JXggY2FsY3VsYXRlZDoleFxuIiwKKwkJICAgICAgICpjc3VtLHRlbXApOworCQlyZXQrKzsKKwl9CisJdGVtcCA9IDB4ZmZmZmZmZmY7CisJdGVtcCA9IHVwZGF0ZV9jcmMzMih0ZW1wLGJ1ZmZlcjIsKHNpemVvZihidWZmZXIyKS00KSk7CisJdGVtcCA9IHNjdHBfY3N1bV9maW5hbGl6ZSh0ZW1wKTsKKwljc3VtID0gKHVfaW50MzJfdCAqKShidWZmZXIyKyhzaXplb2YoYnVmZmVyMiktNCkpOworCWlmKCpjc3VtICE9IHRlbXApeworCQlwcmludGYoIkJ1ZmZlcjI6IEZvdW5kIGNzdW06JXggY2FsY3VsYXRlZDoleFxuIiwKKwkJICAgICAgICpjc3VtLHRlbXApOworCQlyZXQrKzsKKwl9CisKKwl0ZW1wID0gMHhmZmZmZmZmZjsKKwl0ZW1wID0gdXBkYXRlX2NyYzMyKHRlbXAsYnVmZmVyMywoc2l6ZW9mKGJ1ZmZlcjMpLTQpKTsKKwl0ZW1wID0gc2N0cF9jc3VtX2ZpbmFsaXplKHRlbXApOworCWNzdW0gPSAodV9pbnQzMl90ICopKGJ1ZmZlcjMrKHNpemVvZihidWZmZXIzKS00KSk7CisJaWYoKmNzdW0gIT0gdGVtcCl7CisJCXByaW50ZigiQnVmZmVyMzogRm91bmQgY3N1bToleCBjYWxjdWxhdGVkOiV4XG4iLAorCQkgICAgICAgKmNzdW0sdGVtcCk7CisJCXJldCsrOworCX0KKworCXRlbXAgPSAweGZmZmZmZmZmOworCXRlbXAgPSB1cGRhdGVfY3JjMzIodGVtcCxidWZmZXI0LChzaXplb2YoYnVmZmVyNCktNCkpOworCXRlbXAgPSBzY3RwX2NzdW1fZmluYWxpemUodGVtcCk7CisJY3N1bSA9ICh1X2ludDMyX3QgKikoYnVmZmVyNCsoc2l6ZW9mKGJ1ZmZlcjQpLTQpKTsKKwlpZigqY3N1bSAhPSB0ZW1wKXsKKwkJcHJpbnRmKCJCdWZmZXI0OiBGb3VuZCBjc3VtOiV4IGNhbGN1bGF0ZWQ6JXhcbiIsCisJCSAgICAgICAqY3N1bSx0ZW1wKTsKKwkJcmV0Kys7CisJfQorCXJldHVybihyZXQpOworfQorCitzdGF0aWMgaW50CitteV9oYW5kbGVfbm90aWZpY2F0aW9uKGludCBmZCxjaGFyICpub3RpZnlfYnVmKSB7CisJdW5pb24gc2N0cF9ub3RpZmljYXRpb24gKnNucDsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKnNhYzsKKwlzdHJ1Y3Qgc2N0cF9wYWRkcl9jaGFuZ2UgKnNwYzsKKwlzdHJ1Y3Qgc2N0cF9yZW1vdGVfZXJyb3IgKnNyZTsKKwlzdHJ1Y3Qgc2N0cF9zZW5kX2ZhaWxlZCAqc3NmOworCXN0cnVjdCBzY3RwX3NodXRkb3duX2V2ZW50ICpzc2U7CisJaW50IGFzb2NVcDsKKwljaGFyICpzdHI7CisJY2hhciBidWZbMjU2XTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OworCisJc25wID0gKHVuaW9uIHNjdHBfbm90aWZpY2F0aW9uICopbm90aWZ5X2J1ZjsKKwlhc29jVXAgPSAwOworCXN3aXRjaChzbnAtPnNuX2hlYWRlci5zbl90eXBlKSB7CisJY2FzZSBTQ1RQX0FTU09DX0NIQU5HRToKKwkJc2FjID0gJnNucC0+c25fYXNzb2NfY2hhbmdlOworCQlzd2l0Y2goc2FjLT5zYWNfc3RhdGUpIHsKKworCQljYXNlIFNDVFBfQ09NTV9VUDoKKwkJCXN0ciA9ICJDT01NVU5JQ0FUSU9OIFVQIjsKKwkJCWFzb2NVcCsrOworCQkJYnJlYWs7CisJCWNhc2UgU0NUUF9DT01NX0xPU1Q6CisJCQlzdHIgPSAiQ09NTVVOSUNBVElPTiBMT1NUIjsKKwkJCWJyZWFrOworCQljYXNlIFNDVFBfUkVTVEFSVDoKKwkJICAgICAgICBzdHIgPSAiUkVTVEFSVCI7CisJCQlhc29jVXArKzsKKwkJCWJyZWFrOworCQljYXNlIFNDVFBfU0hVVERPV05fQ09NUDoKKwkJCXN0ciA9ICJTSFVURE9XTiBDT01QTEVURSI7CisJCQlicmVhazsKKwkJY2FzZSBTQ1RQX0NBTlRfU1RSX0FTU09DOgorCQkJc3RyID0gIkNBTlQgU1RBUlQgQVNTT0MiOworCQkJcHJpbnRmKCJFWElUOlNDVFBfQVNTT0NfQ0hBTkdFOiAlcywgYXNzb2M9JXhoXG4iLCBzdHIsCisJCQkgICAgICAgKHVpbnQzMl90KXNhYy0+c2FjX2Fzc29jX2lkKTsKKwkJCWV4aXQoMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXN0ciA9ICJVTktOT1dOIjsKKwkJfSAvKiBlbmQgc3dpdGNoKHNhYy0+c2FjX3N0YXRlKSAqLworCQlwcmludGYoIlNDVFBfQVNTT0NfQ0hBTkdFOiAlcywgYXNzb2M9JXhoXG4iLCBzdHIsCisJCSAgICAgICAodWludDMyX3Qpc2FjLT5zYWNfYXNzb2NfaWQpOworCQlicmVhazsKKwljYXNlIFNDVFBfUEVFUl9BRERSX0NIQU5HRToKKwkJc3BjID0gJnNucC0+c25fcGFkZHJfY2hhbmdlOworCQlzd2l0Y2goc3BjLT5zcGNfc3RhdGUpIHsKKwkJY2FzZSBTQ1RQX0FERFJfQVZBSUxBQkxFOgorCQkJc3RyID0gIkFERFJFU1MgQVZBSUxBQkxFIjsKKwkJCWJyZWFrOworCQljYXNlIFNDVFBfQUREUl9VTlJFQUNIQUJMRToKKwkJCXN0ciA9ICJBRERSRVNTIFVOQVZBSUxBQkxFIjsKKwkJCWJyZWFrOworCQljYXNlIFNDVFBfQUREUl9SRU1PVkVEOgorCQkJc3RyID0gIkFERFJFU1MgUkVNT1ZFRCI7CisJCQlicmVhazsKKwkJY2FzZSBTQ1RQX0FERFJfQURERUQ6CisJCQlzdHIgPSAiQUREUkVTUyBBRERFRCI7CisJCQlicmVhazsKKwkJY2FzZSBTQ1RQX0FERFJfTUFERV9QUklNOgorCQkJc3RyID0gIkFERFJFU1MgTUFERSBQUklNQVJZIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RyID0gIlVOS05PV04iOworCQl9IC8qIGVuZCBzd2l0Y2ggKi8KKwkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNwYy0+c3BjX2FhZGRyOworCQlpZiAoc2luNi0+c2luNl9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJCWluZXRfbnRvcChBRl9JTkVUNiwgKGNoYXIqKSZzaW42LT5zaW42X2FkZHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQl9IGVsc2UgeworCQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzcGMtPnNwY19hYWRkcjsKKwkJCWluZXRfbnRvcChBRl9JTkVULCAoY2hhciopJnNpbi0+c2luX2FkZHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQl9CisJCXByaW50ZigiU0NUUF9QRUVSX0FERFJfQ0hBTkdFOiAlcywgYWRkcj0lcywgYXNzb2M9JXhoXG4iLCBzdHIsCisJCSAgICAgICBidWYsICh1aW50MzJfdClzcGMtPnNwY19hc3NvY19pZCk7CisJCWJyZWFrOworCWNhc2UgU0NUUF9SRU1PVEVfRVJST1I6CisJCXNyZSA9ICZzbnAtPnNuX3JlbW90ZV9lcnJvcjsKKwkJcHJpbnRmKCJTQ1RQX1JFTU9URV9FUlJPUjogYXNzb2M9JXhoXG4iLAorCQkgICAgICAgKHVpbnQzMl90KXNyZS0+c3JlX2Fzc29jX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBTQ1RQX1NFTkRfRkFJTEVEOgorCQlzc2YgPSAmc25wLT5zbl9zZW5kX2ZhaWxlZDsKKwkJcHJpbnRmKCJTQ1RQX1NFTkRfRkFJTEVEOiBhc3NvYz0leGhcbiIsCisJCSAgICAgICAodWludDMyX3Qpc3NmLT5zc2ZfYXNzb2NfaWQpOworCQlicmVhazsKKwljYXNlIFNDVFBfQURBUFRBVElPTl9JTkRJQ0FUSU9OOgorCSAgeworCSAgICBzdHJ1Y3Qgc2N0cF9hZGFwdGF0aW9uX2V2ZW50ICphZTsKKwkgICAgYWUgPSAmc25wLT5zbl9hZGFwdGF0aW9uX2V2ZW50OworCSAgICBwcmludGYoIlxuU0NUUF9hZGFwdGF0aW9uX2luZGljYXRpb24gYml0czoweCV4XG4iLAorCQkgICAodV9pbnQpYWUtPnNhaV9hZGFwdGF0aW9uX2luZCk7CisJICB9CisJICBicmVhazsKKwljYXNlIFNDVFBfUEFSVElBTF9ERUxJVkVSWV9FVkVOVDoKKwkgIHsKKwkgICAgc3RydWN0IHNjdHBfcGRhcGlfZXZlbnQgKnBkYXBpOworCSAgICBwZGFwaSA9ICZzbnAtPnNuX3BkYXBpX2V2ZW50OworCSAgICBwcmludGYoIlNDVFBfUEQtQVBJIGV2ZW50OiV1XG4iLAorCQkgICBwZGFwaS0+cGRhcGlfaW5kaWNhdGlvbik7CisJICAgIGlmKHBkYXBpLT5wZGFwaV9pbmRpY2F0aW9uID09IDApeworCQkgICAgcHJpbnRmKCJQREktIEFib3J0ZWRcbiIpOworCSAgICB9CisJICB9CisJICBicmVhazsKKworCWNhc2UgU0NUUF9TSFVURE9XTl9FVkVOVDoKKyAgICAgICAgICAgICAgICBzc2UgPSAmc25wLT5zbl9zaHV0ZG93bl9ldmVudDsKKwkJcHJpbnRmKCJTQ1RQX1NIVVRET1dOX0VWRU5UOiBhc3NvYz0leGhcbiIsCisJCSAgICAgICAodWludDMyX3Qpc3NlLT5zc2VfYXNzb2NfaWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIlVua25vd24gbm90aWZpY2F0aW9uIGV2ZW50IHR5cGU9JXhoXG4iLCAKKwkJICAgICAgIHNucC0+c25faGVhZGVyLnNuX3R5cGUpOworCX0gLyogZW5kIHN3aXRjaChzbnAtPnNuX3R5cGUpICovCisJcmV0dXJuKGFzb2NVcCk7Cit9CisKKworc3RhdGljIGNoYXIgcmVhZEJ1ZmZlcls2NTUzNV07CQorc3RhdGljIGludCBzej0wOworc3RhdGljIGNoYXIgY29udHJvbFZlY3Rvcls2NTUzNV07CitzdGF0aWMgc3RydWN0IG1zZ2hkciBtc2c7CitpbnQKK215X3NjdHBSZWFkSW5wdXQoaW50IGZkLGludCBtYXhyZWFkKQoreworCS8qIHJlY2VpdmUgc29tZSBudW1iZXIgb2YgZGF0YWdyYW1zIGFuZAorCSAqIGFjdCBvbiB0aGVtLgorCSAqLworCXN0cnVjdCBpb3ZlYyBpb3ZbMl07CisJdW5zaWduZWQgY2hhciBmcm9tWzIwMF07CisKKwltZW1zZXQoJm1zZywwLHNpemVvZihtc2cpKTsKKwltZW1zZXQoY29udHJvbFZlY3RvciwwLHNpemVvZihjb250cm9sVmVjdG9yKSk7CisJbWVtc2V0KHJlYWRCdWZmZXIsMCxzaXplb2YocmVhZEJ1ZmZlcikpOworCisJaW92WzBdLmlvdl9iYXNlID0gcmVhZEJ1ZmZlcjsKKwlpb3ZbMF0uaW92X2xlbiA9IG1heHJlYWQ7CisJaW92WzFdLmlvdl9iYXNlID0gTlVMTDsKKwlpb3ZbMV0uaW92X2xlbiA9IDA7CisJbXNnLm1zZ19uYW1lID0gKGNhZGRyX3QpZnJvbTsKKwltc2cubXNnX25hbWVsZW4gPSBzaXplb2YoZnJvbSk7CisJbXNnLm1zZ19pb3YgPSBpb3Y7CisJbXNnLm1zZ19pb3ZsZW4gPSAxOworCW1zZy5tc2dfY29udHJvbCA9IChjYWRkcl90KWNvbnRyb2xWZWN0b3I7CisJbXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGNvbnRyb2xWZWN0b3IpOworCWVycm5vID0gMDsKKwlzeiA9IHJlY3Ztc2coZmQsJm1zZywwKTsKKwlwcmludGYoIlJlYWQgZmQ6JWQgcmV0dXJucyAlZCBlcnJubzolZCBjb250cm9sIGxlbiBpcyAlenUgbXNnZmxnOiV4XG4iLAorCSAgICAgICBmZCwKKwkgICAgICAgc3osZXJybm8sCisJICAgICAgIG1zZy5tc2dfY29udHJvbGxlbiwKKwkgICAgICAgbXNnLm1zZ19mbGFncyk7CisKKwlpZiAobXNnLm1zZ19mbGFncyAmIE1TR19OT1RJRklDQVRJT04pIHsKKwkJcHJpbnRmKCJHb3QgYSBub3RpZmljYXRpb25cbiIpOworCQlyZXR1cm4obXlfaGFuZGxlX25vdGlmaWNhdGlvbihmZCxyZWFkQnVmZmVyKSk7CisJfWVsc2V7CisJCXByaW50ZigiR290IGRhdGFcbiIpOworCQlyZXR1cm4oLTEpOworCX0KK30KKworCitpbnQKK3BvbGxfZmQoaW50IGZkKQoreworCWludCBjYW1ldXA7CisJaW50IG1heDsKKwlmZF9zZXQgcmVhZGZkcyx3cml0ZWZkcyxleGNlcHRmZHM7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwltZW1zZXQoJnR2LDAsc2l6ZW9mKHR2KSk7CisJRkRfWkVSTygmcmVhZGZkcyk7CisJRkRfWkVSTygmd3JpdGVmZHMpOworCUZEX1pFUk8oJmV4Y2VwdGZkcyk7CisJY2FtZXVwID0gMDsKKwltYXggPSBmZCArIDE7CisKKwlwcmludGYoInBvbGxfZmRcbiIpOworCUZEX1NFVChmZCwmcmVhZGZkcyk7CisKKwlpZiAoc2VsZWN0KG1heCwgJnJlYWRmZHMsICZ3cml0ZWZkcywgJmV4Y2VwdGZkcywgTlVMTCkgPT0gLTEpCisJCXJldHVybihjYW1ldXApOworCWlmKEZEX0lTU0VUKGZkLCZyZWFkZmRzKSl7CisJCXByaW50ZigiUmVhZCBwbGVhc2VcbiIpOworCQljYW1ldXAgKz0gbXlfc2N0cFJlYWRJbnB1dChmZCw0MTAwKTsKKwl9CisKKwlyZXR1cm4oY2FtZXVwKTsKK30KKworc3RhdGljIHNjdHBfYXNzb2NfdAorZGlnX291dF9hc29jaWQodm9pZCkKK3sKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzX2luZm87CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJc19pbmZvID0gTlVMTDsKKwlpZihtc2cubXNnX2NvbnRyb2xsZW4peworCQkvKiBwYXJzZSB0aHJvdWdoIGFuZCBzZWUgaWYgd2UgZmluZAorCQkgKiB0aGUgc2N0cF9zbmRyY3ZpbmZvCisJCSAqLworCQljbXNnID0gKHN0cnVjdCBjbXNnaGRyICopY29udHJvbFZlY3RvcjsKKwkJd2hpbGUoY21zZyl7CisJCQlpZihjbXNnLT5jbXNnX2xldmVsID09IElQUFJPVE9fU0NUUCl7CisJCQkJaWYoY21zZy0+Y21zZ190eXBlID09IFNDVFBfU05EUkNWKXsKKwkJCQkJLyogR290IGl0ICovCisJCQkJCXNfaW5mbyA9IChzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICopQ01TR19EQVRBKGNtc2cpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQljbXNnID0gQ01TR19OWFRIRFIoJm1zZyxjbXNnKTsKKwkJfQorCX1lbHNleworCQlwcmludGYoIk5vIENNU0c/XG4iKTsKKwkJZXhpdCgwKTsKKwl9CisJaWYoc19pbmZvID09IE5VTEwpeworCQlwcmludGYoIk5vIHNpbmZvP1xuIik7CisJCWV4aXQoMCk7CisJfQorCXJldHVybihzX2luZm8tPnNpbmZvX2Fzc29jX2lkKTsKK30KKworCit2b2lkCitwcm9jZXNzKGludCBmZCxpbnQgbWFnaWMpCit7CisJaW50IGZkMSxudW1fYXNvYyxyZXQsaTsKKwlzY3RwX2Fzc29jX3QgYXNvYzsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJbnVtX2Fzb2MgPSAwOworCWkgPSAxOworCXRzLnR2X3NlYyA9IDA7CisJdHMudHZfbnNlYyA9IDEwMDAwOworCisJd2hpbGUoaSA8IDQwOTkpeworCQlwcmludGYoInBhc3MgJWRcbiIsaSk7CisJCXdoaWxlKG51bV9hc29jIDwgMil7CisJCQlyZXQgPSBwb2xsX2ZkKGZkKTsKKwkJCWlmKHJldCA+MCApeworCQkJCW51bV9hc29jICs9IHJldDsKKwkJCX1lbHNlIGlmKHJldCA9PSAwKXsKKwkJCQlzbGVlcCgxKTsKKwkJCX1lbHNlIGlmKHJldCA8IDApeworCQkJCXByaW50ZigiR290IGRhdGE/ICVkXG4iLHN6KTsKKwkJCQlzbGVlcCgxKTsKKwkJCX0KKwkJCXByaW50ZigiYXNvYyBjb3VudCBpcyAlZFxuIixudW1fYXNvYyk7CisJCX0KKwlhZ2FpbjoKKwkJcHJpbnRmKCJSZWFkaW5nIGZvciAlZCBieXRlcyBmcm9tIGZkOiVkXG4iLAorCQkgICAgICAgaSxmZCk7CisJCW15X3NjdHBSZWFkSW5wdXQoZmQsaSk7CisJCWlmKHN6ID09IGkpeworCQkJbWVtY3B5KGJ1ZmZlcjEscmVhZEJ1ZmZlcixpKTsKKwkJfWVsc2V7CisJCQlwcmludGYoIkh1aCBJIGFtIG1lc3NlZCB1cCByZWFkICVkIHdhbnRlZCAlZFxuIiwKKwkJCSAgICAgICBzeixpKTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJaWYobXNnLm1zZ19mbGFncyAmIE1TR19FT1IpeworCQkJcHJpbnRmKCJIdWggZ290IEVPUiBvbiBwYXJpdGlhbCByZWFkP1xuIik7CisJCQlleGl0KDApOworCQl9CisJCWFzb2MgPSBkaWdfb3V0X2Fzb2NpZCgpOworCQluYW5vc2xlZXAoJnRzLE5VTEwpOworCisJCWZkMSA9IHNjdHBfcGVlbG9mZihmZCxhc29jKTsKKwkJaWYoZmQxID09IC0xKXsKKwkJCXByaW50ZigicGVlbG9mZiBmYWlsZWQgJWQvZXJyOiVkXG4iLAorCQkJICAgICAgIGZkMSxlcnJubyk7CisJCQlleGl0KDApOworCQl9CisJCW15X3NjdHBSZWFkSW5wdXQoZmQxLCg0MTAwLWkpKTsKKwkJaWYoc3ogPiAwKXsKKwkJCW1lbWNweSgmYnVmZmVyMVtpXSxyZWFkQnVmZmVyLHN6KTsKKwkJCXByaW50ZigiQ29waWVkICVkIGJ5dGVzXG4iLHN6KTsKKwkJfWVsc2V7CisJCQlwcmludGYoIkh1aCBvbmx5IHJlYWQgJWRcbiIsc3opOworCQl9CisJCWlmKG1hZ2ljID49IGkpeworCQkJcHJpbnRmKCJtYWdpYyBlbmdhZ2VkXG4iKTsKKwkJCW15X3NjdHBSZWFkSW5wdXQoZmQsaSk7CisJCX1lbHNleworCQkJbXlfc2N0cFJlYWRJbnB1dChmZCw0MTAwKTsKKwkJfQorCQlpZihzeiA+IDApeworCQkJbWVtY3B5KGJ1ZmZlcjIscmVhZEJ1ZmZlcixzeik7CisJCQlwcmludGYoImNvcGllZCAlZCBieXRlc1xuIixzeik7CisJCX1lbHNleworCQkJcHJpbnRmKCJIdWggb25seSByZWFkICVkXG4iLHN6KTsKKwkJfQorCQlteV9zY3RwUmVhZElucHV0KGZkMSw0MTAwKTsKKwkJaWYoc3ogPiAwKXsKKwkJCW1lbWNweShidWZmZXIzLHJlYWRCdWZmZXIsc3opOworCQkJcHJpbnRmKCJjb3BpZWQgJWQgYnl0ZXNcbiIsc3opOworCQl9ZWxzZXsKKwkJCXByaW50ZigiSHVoIG9ubHkgcmVhZCAlZFxuIixzeik7CisJCX0KKwkJbXlfc2N0cFJlYWRJbnB1dChmZCw0MTAwKTsKKwkJaWYoc3ogPiAwKXsKKwkJCW1lbWNweShidWZmZXI0LHJlYWRCdWZmZXIsc3opOworCQkJcHJpbnRmKCJjb3BpZWQgJWQgYnl0ZXNcbiIsc3opOworCQl9ZWxzZXsKKwkJCXByaW50ZigiSHVoIG9ubHkgcmVhZCAlZFxuIixzeik7CisJCX0KKwkJaWYoY2hlY2tfYnVmZmVycygpKXsKKwkJCWV4aXQoMCk7CisJCX0KKwkJY2xvc2UoZmQxKTsKKwkJaSsrOworCQludW1fYXNvYy0tOworCX0KK30KKworaW50CittYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSxmZDsKKwl1aW50MTZfdCBteXBvcnQ9MDsKKwlpbnQgbWFnaWM9MDsKKwlzdHJ1Y3Qgc2N0cF9ldmVudF9zdWJzY3JpYmUgZXZlbnQgPSB7MH07CisJd2hpbGUoKGk9IGdldG9wdChhcmdjLGFyZ3YsIm06TToiKSkgIT0gRU9GKXsKKwkJc3dpdGNoKGkpeworCQljYXNlICdtJzoKKwkJCW15cG9ydCA9ICh1aW50MTZfdClzdHJ0b2wob3B0YXJnLE5VTEwsMCk7CisJCQlicmVhazsKKwkJY2FzZSAnTSc6CisJCQltYWdpYyA9IHN0cnRvbChvcHRhcmcsTlVMTCwwKTsKKwkJCWJyZWFrOworCQl9OworCX0KKwkvKioqKioqKioqKioqKioqKioqKioqKnNvY2tldCAxICoqKioqKioqKioqKioqKioqKiovCisgICAgICAJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisJaWYoZmQgPT0gLTEpeworCQlwcmludGYoImNhbid0IG9wZW4gc29ja2V0OiVkXG4iLGVycm5vKTsKKwkJcmV0dXJuKC0xKTsKKwl9CisJbWVtc2V0KCZiaW5kdG8sMCxzaXplb2YoYmluZHRvKSk7CisJLy9sZW4gPSBiaW5kdG8uc2luX2xlbiA9IHNpemVvZihiaW5kdG8pOworCWxlbiA9IHNpemVvZihiaW5kdG8pOworCWJpbmR0by5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlwcmludGYoImJpbmQgcG9ydCAlZFxuIixteXBvcnQpOworCWJpbmR0by5zaW5fcG9ydCA9IGh0b25zKG15cG9ydCk7CisJaWYoYmluZChmZCwoc3RydWN0IHNvY2thZGRyICopJmJpbmR0bywgbGVuKSA8IDApeworCQlwcmludGYoImNhbid0IGJpbmQgYSBzb2NrZXQ6JWRcbiIsZXJybm8pOworCQljbG9zZShmZCk7CisJCXJldHVybigtMSk7CisJfQorCWlmKGdldHNvY2tuYW1lKGZkLChzdHJ1Y3Qgc29ja2FkZHIgKikmZ290LCZsZW4pIDwgMCl7CisJCXByaW50ZigiZ2V0IHNvY2tuYW1lIGZhaWxlZCBlcnI6JWRcbiIsZXJybm8pOworCQljbG9zZShmZCk7CisJCXJldHVybigtMSk7CisJfQkKKwlwcmludGYoImZkIHVzZXMgcG9ydCAlZFxuIixudG9ocyhnb3Quc2luX3BvcnQpKTsKKwlpZiAobGlzdGVuKGZkLCAxMDApID09IC0xKSB7CisJCXByaW50ZigibGlzdGVuIGVycjogJWRcbiIsIGVycm5vKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4oLTEpOworCX0KKwkvKiBlbmFibGUgYWxsIGV2ZW50IG5vdGlmaWNhdGlvbnMgKi8KKwlldmVudC5zY3RwX2RhdGFfaW9fZXZlbnQgPSAxOworCWV2ZW50LnNjdHBfYXNzb2NpYXRpb25fZXZlbnQgPSAxOworCWV2ZW50LnNjdHBfYWRkcmVzc19ldmVudCA9IDE7CisJZXZlbnQuc2N0cF9zZW5kX2ZhaWx1cmVfZXZlbnQgPSAxOworCWV2ZW50LnNjdHBfcGVlcl9lcnJvcl9ldmVudCA9IDE7CisJZXZlbnQuc2N0cF9zaHV0ZG93bl9ldmVudCA9IDE7CisJZXZlbnQuc2N0cF9wYXJ0aWFsX2RlbGl2ZXJ5X2V2ZW50ID0gMTsKKwlldmVudC5zY3RwX2FkYXB0YXRpb25fbGF5ZXJfZXZlbnQgPSAxOworCWlmIChzZXRzb2Nrb3B0KGZkLCBJUFBST1RPX1NDVFAsIAorCQkgICAgICAgU0NUUF9FVkVOVFMsICZldmVudCwgCisJCSAgICAgICBzaXplb2YoZXZlbnQpKSAhPSAwKSB7CisJCXByaW50ZigiR2FrLCBjYW4ndCBzZXQgZXZlbnRzIGVycm5vOiVkXG4iLGVycm5vKTsKKwkJZXhpdCgwKTsKKwl9CisJcHJpbnRmKCJ0byBwcm9jZXNzXG4iKTsKKwlwcm9jZXNzKGZkLG1hZ2ljKTsKKwlyZXR1cm4oMCk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9hcHBzL3NjdHBfZGFybi5jIGIvc3JjL2FwcHMvc2N0cF9kYXJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmYjgyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9hcHBzL3NjdHBfZGFybi5jCkBAIC0wLDAgKzEsMjQxNCBAQAorLyogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24KKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEsIDIwMDMKKyAqIENvcHlyaWdodCAoYykgMTk5OSBDaXNjbworICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwLCAyMDAxIE1vdG9yb2xhCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTm9raWEKKyAqIENvcHlyaWdodCAoYykgMjAwMSBMYSBNb250ZSBILlAuIFlhcnJvbGwKKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgTGEgTW9udGUgSC5QLiBZYXJyb2xsIDxwaWdneUBhY20ub3JnPgorICogICAgS2FybCBLbnV0c29uIDxrYXJsQGF0aGVuYS5jaGljYWdvLmlsLnVzPgorICogICAgSHVpIEh1YW5nIDxodWkuaHVhbmdAbm9raWEuY29tPgorICogICAgRGFpc3kgQ2hhbmcgPGRhaXN5Y0B1cy5pYm0uY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgPHNyaUB1cy5pYm0uY29tPgorICovCisKKy8qIFRoaXMgaXMgYSB1c2Vyc3BhY2UgdGVzdCBhcHBsaWNhdGlvbiBmb3IgdGhlIFNDVFAga2VybmVsIAorICogaW1wbGVtZW50YXRpb24gc3RhdGUgbWFjaGluZS4gIEl0IGlzIHZhZ3VlbHkgaW5zcGlyZWQgYnkgU3RldmVucycKKyAqIHByb2dyYW0gInNvY2siLgorICoKKyAqIEl0IGhhcyB0aGUgbGltaXRlZCBhYmlsaXR5IHRvIHNlbmQgbWVzc2FnZXMgYW5kIHRvIGxpc3RlbiBmb3IgbWVzc2FnZXMKKyAqIHNlbnQgdmlhIFNDVFAuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKy8vI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlICJzY3RwX2Rhcm4uaCIKKworY2hhciAqVENJRCA9IF9fRklMRV9fOworaW50IFRTVF9UT1RBTCA9IDE7CitpbnQgVFNUX0NOVCA9IDA7CisKKyNkZWZpbmUgR0VOX0RBVEFfRklSU1QJMHgyMQorI2RlZmluZSBHRU5fREFUQV9MQVNUCTB4N2UKKworLyogRGlzcGxheSBhbiBJUHY0IGFkZHJlc3MgaW4gcmVhZGFibGUgZm9ybWF0LiAgKi8KKyNkZWZpbmUgTklQUVVBRChhZGRyKSBcCisgICAgICAgICgodW5zaWduZWQgY2hhciAqKSZhZGRyKVswXSwgXAorICAgICAgICAoKHVuc2lnbmVkIGNoYXIgKikmYWRkcilbMV0sIFwKKyAgICAgICAgKCh1bnNpZ25lZCBjaGFyICopJmFkZHIpWzJdLCBcCisgICAgICAgICgodW5zaWduZWQgY2hhciAqKSZhZGRyKVszXQorCisvKiBEaXNwbGF5IGFuIElQdjYgYWRkcmVzcyBpbiByZWFkYWJsZSBmb3JtYXQuICAqLworI2RlZmluZSBOSVA2KGFkZHIpIFwKKyAgICAgICAgbnRvaHMoKGFkZHIpLnM2X2FkZHIxNlswXSksIFwKKyAgICAgICAgbnRvaHMoKGFkZHIpLnM2X2FkZHIxNlsxXSksIFwKKyAgICAgICAgbnRvaHMoKGFkZHIpLnM2X2FkZHIxNlsyXSksIFwKKyAgICAgICAgbnRvaHMoKGFkZHIpLnM2X2FkZHIxNlszXSksIFwKKyAgICAgICAgbnRvaHMoKGFkZHIpLnM2X2FkZHIxNls0XSksIFwKKyAgICAgICAgbnRvaHMoKGFkZHIpLnM2X2FkZHIxNls1XSksIFwKKyAgICAgICAgbnRvaHMoKGFkZHIpLnM2X2FkZHIxNls2XSksIFwKKyAgICAgICAgbnRvaHMoKGFkZHIpLnM2X2FkZHIxNls3XSkKKworLyogVGhlc2UgYXJlIHRoZSBnbG9iYWwgb3B0aW9ucy4gICovCitjaGFyICpsb2NhbF9ob3N0ID0gTlVMTDsKK2ludCBsb2NhbF9wb3J0ID0gMDsKK2NoYXIgKnJlbW90ZV9ob3N0ID0gTlVMTDsKK2ludCByZW1vdGVfcG9ydCA9IDA7Citjb21tYW5kX3QgY29tbWFuZCA9IENPTU1BTkRfTk9ORTsKK3N0cnVjdCBzb2NrYWRkciAqYmluZHhfYWRkX2FkZHJzID0gTlVMTDsKK2ludCBiaW5keF9hZGRfY291bnQgPSAwOworc3RydWN0IHNvY2thZGRyICpiaW5keF9yZW1fYWRkcnMgPSBOVUxMOworaW50IGJpbmR4X3JlbV9jb3VudCA9IDA7CitzdHJ1Y3Qgc29ja2FkZHIgKmNvbm5lY3R4X2FkZHJzID0gTlVMTDsKK2ludCBjb25uZWN0eF9jb3VudCA9IDA7CitpbnQgaW50ZXJhY3RpdmVfbW9kZSA9IDA7CitpbnQgcG9sbF9za24gPSAwOworaW50IG5vbmJsb2NraW5nID0gMDsKK2ludCBvcHRfc3BhY2UgPSAwOworY2hhciBnZW5fZGF0YSA9IEdFTl9EQVRBX0ZJUlNUOworY2hhciAqaW50ZXJfb3V0YnVmID0gTlVMTDsKK2ludCBpbnRlcl9vdXRsZW4gPSAwOworaW50IGludGVyX3NrID0gMDsKK2ludCBwb2xsX3NuZF9zaXplID0gMDsKK2ludCB1c2VfcG9sbCA9IDA7CitpbnQgc29ja2V0X3R5cGUgPSBTT0NLX1NFUVBBQ0tFVDsKK3NjdHBfYXNzb2NfdCBhc3NvY2lkID0gMDsKK2ludCBlY2hvID0gMDsKK2NoYXIgKmludGVyZmFjZSA9ICJldGgwIjsKK2ludCBpZl9pbmRleCA9IDA7Citzb2NrYWRkcl9zdG9yYWdlX3QgcmVtb3RlX2FkZHI7CitzYV9mYW1pbHlfdCByYV9mYW1pbHk7CS8qIFdoYXQgZmFtaWx5IGlzIHJlbW90ZV9hZGRyPyAqLworaW50IHJhX2xlbiA9IDA7CQkvKiBIb3cgbG9uZyBpcyByZW1vdGVfYWRkcj8gKi8KK3ZvaWQgKnJhX3JhdzsJCS8qIFRoaXMgaXMgdGhlIGFkZHIgcGFydCBvZiByZW1vdGVfYWRkci4gKi8KK2ludCBuZXdfY29ubmVjdGlvbiA9IDE7CisKK2VudW0gaW50ZXJfY21kX251bSB7CisJSU5URVJfU05EID0gMCwKKwlJTlRFUl9SQ1YsCisJSU5URVJfU05EQlVGLAorCUlOVEVSX1JDVkJVRiwKKwlJTlRFUl9CSU5EWF9BREQsCisJSU5URVJfQklORFhfUkVNLAorCUlOVEVSX1NFVF9QUklNLAorCUlOVEVSX1NFVF9QRUVSX1BSSU0sCisJSU5URVJfU0hVVERPV04sCisJSU5URVJfQUJPUlQsCisJSU5URVJfTk9ERUxBWSwKKwlJTlRFUl9NQVhTRUcsCisJSU5URVJfSEVBUlRCRUFULAorCUlOVEVSX0dFVF9TVEFUUworfTsKKworZW51bSBzaHV0ZG93bl90eXBlIHsKKwlTSFVURE9XTl9BQk9SVCA9IDAsCisJU0hVVERPV05fU0hVVERPV04KK307CisKK3N0cnVjdCBpbnRlcl9lbnRyeSB7CisJY2hhciAqY21kOworCWludCBjbWRfbnVtOworfTsKKworc3RydWN0IGludGVyX2VudHJ5IGludGVyX2NvbW1hbmRzW10gPSB7CisJeyJzbmQiLCBJTlRFUl9TTkR9LAorCXsicmN2IiwJSU5URVJfUkNWfSwKKwl7InNuZGJ1ZiIsIElOVEVSX1NOREJVRn0sCisJeyJyY3ZidWYiLCBJTlRFUl9SQ1ZCVUZ9LAorCXsiYmluZHgtYWRkIiwgSU5URVJfQklORFhfQUREfSwKKwl7ImJpbmR4LXJlbSIsIElOVEVSX0JJTkRYX1JFTX0sCisJeyJwcmltYXJ5IiwgSU5URVJfU0VUX1BSSU19LAorCXsicGVlcl9wcmltYXJ5IiwgSU5URVJfU0VUX1BFRVJfUFJJTX0sCisJeyJzaHV0ZG93biIsIElOVEVSX1NIVVRET1dOfSwKKwl7ImFib3J0IiwgSU5URVJfQUJPUlR9LAorCXsibm9kZWxheSIsIElOVEVSX05PREVMQVl9LAorCXsibWF4c2VnIiwgSU5URVJfTUFYU0VHfSwKKwl7ImhlYXJ0YmVhdCIsIElOVEVSX0hFQVJUQkVBVH0sCisJeyJzdGF0cyIsIElOVEVSX0dFVF9TVEFUU30sCisJe05VTEwsIC0xfSwKK307CisKKyNkZWZpbmUgUE9MTF9TS19NQVggCTI1NgkvKiBUaGUgbWF4IG51bWJlciBvZiBzb2NrZXRzIHRvIHNlbGVjdC9wb2xsLiAqLworaW50IHBvbGxfc2tzW1BPTExfU0tfTUFYXTsJCS8qIFRoZSBhcnJheSBmb3IgdXNpbmcgc2VsZWN0KCkuICovCitzdHJ1Y3QgcG9sbGZkIHBvbGxfZmRzW1BPTExfU0tfTUFYXTsJLyogVGhlIGFycmF5IGZvciB1c2luZyBwb2xsKCkuICAqLworI2RlZmluZSBQT0xMX1NORF9TSVpFCTE2Mzg0CS8qIERlZmF1bHQgbWVzc2FnZSBzaXplIGluIHRoZSBwb2xsIG1vZGUuICovCisKKworc3RydWN0IHNvY2thZGRyICphcHBlbmRfYWRkcihjb25zdCBjaGFyICpwYXJtLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJzLAorCQkJICAgICBpbnQgKnJldF9jb3VudCkgOworaW50IGJ1aWxkX2VuZHBvaW50KGNoYXIgKmFyZ3YwLCBpbnQgcG9ydG51bSk7CitzdGF0aWMgaW50IHBhcnNlX2ludGVyX2NvbW1hbmRzKGNoYXIgKiwgY2hhciAqLCBpbnQpOworc3RhdGljIHZvaWQgc25kX2Z1bmMoY2hhciAqKTsKK3N0YXRpYyB2b2lkIHNuZGJ1Zl9mdW5jKGNoYXIgKiwgaW50LCBpbnQsIGludCk7CitzdGF0aWMgdm9pZCByY3ZidWZfZnVuYyhjaGFyICosIGludCwgaW50LCBpbnQpOworc3RhdGljIHN0cnVjdCBzb2NrYWRkciAqZ2V0X2JpbmR4X2FkZHIoY2hhciAqLCBpbnQgKik7CitzdGF0aWMgaW50IGJpbmR4X2Z1bmMoY2hhciAqLCBpbnQsIHN0cnVjdCBzb2NrYWRkciAqLCBpbnQsIGludCwgaW50KTsKK3N0YXRpYyBpbnQgY29ubmVjdHhfZnVuYyhjaGFyICosIGludCwgc3RydWN0IHNvY2thZGRyICosIGludCk7CitzdGF0aWMgdm9pZCAgcHJpbWFyeV9mdW5jKGNoYXIgKiwgaW50LCBjaGFyICosIGludCk7CitzdGF0aWMgdm9pZCAgcGVlcl9wcmltYXJ5X2Z1bmMoY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50KTsKK3N0YXRpYyB2b2lkICBzcHBfaGJfZGVtYW5kX2Z1bmMoY2hhciAqLCBpbnQsIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgbm9kZWxheV9mdW5jKGNoYXIgKiwgaW50LCBpbnQgdmFsLCBpbnQgc2V0KTsKK3N0YXRpYyBpbnQgbWF4c2VnX2Z1bmMoY2hhciAqLCBpbnQsIGludCB2YWwsIGludCBzZXQpOworc3RhdGljIGludCBzaHV0ZG93bl9mdW5jKGNoYXIgKmFyZ3YwLCBpbnQgKnNrcCwgaW50IHNodXRkb3duX3R5cGUpOworc3RhdGljIGludCBnZXRfYXNzb2NzdGF0c19mdW5jKGludCwgc2N0cF9hc3NvY190KTsKK3N0YXRpYyBpbnQgdGVzdF9za19mb3JfYXNzb2MoaW50IHNrLCBzY3RwX2Fzc29jX3QgYXNzb2NfaWQpOworc3RhdGljIGNoYXIgKiBnZW5fbWVzc2FnZShpbnQpOworc3RhdGljIHNjdHBfYXNzb2NfdCB0ZXN0X3JlY3ZfYXNzb2NfY2hhbmdlKGludCk7CitzdGF0aWMgc2N0cF9hc3NvY190IHRlc3RfdmVyaWZ5X2Fzc29jX2NoYW5nZShzdHJ1Y3QgbXNnaGRyICopOwordm9pZCBwcmludF9hZGRyX2J1Zih2b2lkICogbGFkZHJzLCBpbnQgbl9sYWRkcnMpOworaW50IHByaW50X3NvY2thZGRyKHN0cnVjdCBzb2NrYWRkciAqc2FfYWRkcik7CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisJaW50IHNrID0gLTE7CisJaW50IGVycm9yID0gMDsKKwlpbnQgaTsKKworCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKworCXBhcnNlX2FyZ3VtZW50cyhhcmdjLCBhcmd2KTsKKworCXN3aXRjaChjb21tYW5kKSB7CisJY2FzZSBDT01NQU5EX05PTkU6CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IFBsZWFzZSBzcGVjaWZ5IGEgY29tbWFuZC5cbiIsCisJCQlhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwkJYnJlYWs7CisJY2FzZSBDT01NQU5EX0xJU1RFTjoKKwkJc2sgPSBidWlsZF9lbmRwb2ludChhcmd2WzBdLCBsb2NhbF9wb3J0KTsKKwkJZXJyb3IgPSBjb21tYW5kX2xpc3Rlbihhcmd2WzBdLCBzayk7CisJCWJyZWFrOworCWNhc2UgQ09NTUFORF9TRU5EOgorCQlzayA9IGJ1aWxkX2VuZHBvaW50KGFyZ3ZbMF0sIGxvY2FsX3BvcnQpOworCQllcnJvciA9IGNvbW1hbmRfc2VuZChhcmd2WzBdLCAmc2spOworCQlicmVhazsKKwljYXNlIENPTU1BTkRfUE9MTDoKKwkJaWYgKHVzZV9wb2xsKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgcG9sbF9za247IGkrKykgeworCQkJCXBvbGxfZmRzW2ldLmZkID0gYnVpbGRfZW5kcG9pbnQoYXJndlswXSwKKwkJCQkJbG9jYWxfcG9ydCArIGkpOworCQkJfQorCQl9IGVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IHBvbGxfc2tuOyBpKyspIHsKKwkJCQlwb2xsX3Nrc1tpXSA9IGJ1aWxkX2VuZHBvaW50KGFyZ3ZbMF0sCisJCQkJCWxvY2FsX3BvcnQgKyBpKTsKKwkJCX0KKwkJfQorCQllcnJvciA9IGNvbW1hbmRfcG9sbChhcmd2WzBdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICIlczogaWxsZWdhbCBjb21tYW5kICVkXG4iLAorCQkJYXJndlswXSwgY29tbWFuZCk7CisJCWV4aXQoMSk7CisJfQorCisJLyogU2h1dCBkb3duIHRoZSBsaW5rLiAgKi8KKwlpZiAoQ09NTUFORF9QT0xMICE9IGNvbW1hbmQpIHsKKwkJY2xvc2Uoc2spOworCX0gZWxzZSB7CisJCS8qIFNodXRkb3duIGFsbCBsaW5rcy4gICovCisJCWlmICh1c2VfcG9sbCkgeworCQkJZm9yIChpID0gMDsgaSA8IHBvbGxfc2tuOyBpKyspIHsKKwkJCQljbG9zZShwb2xsX2Zkc1tpXS5mZCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgcG9sbF9za247IGkrKykgeworCQkJCWNsb3NlKHBvbGxfc2tzW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCWV4aXQoZXJyb3IpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIDJuZCBMZXZlbCBBYnN0cmFjdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZAorcGFyc2VfYXJndW1lbnRzKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKwlpbnQgb3B0aW9uX2luZGV4ID0gMDsKKwlpbnQgYzsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnRtcF9hZGRycyA9IE5VTEw7CisKKwlzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKKwkJeyJsb2NhbCIsCTEsIDAsIDF9LAorCQl7ImxvY2FsLXBvcnQiLAkxLCAwLCAyfSwKKwkJeyJyZW1vdGUiLAkxLCAwLCAzfSwKKwkJeyJyZW1vdGUtcG9ydCIsCTEsIDAsIDR9LAorCQl7Imxpc3RlbiIsCTAsIDAsIDEwfSwKKwkJeyJzZW5kIiwJMCwgMCwgMTF9LAorCQl7ImJpbmR4LWFkZCIsCTEsIDAsIDE1fSwKKwkJeyJiaW5keC1yZW0iLAkxLCAwLCAxNn0sCisJCXsidXNlLXBvbGwiLAkwLCAwLCAyMH0sCisJCXsiZWNobyIsICAgICAgICAwLCAwLCAnZSd9LAorCQl7ImludGVyZmFjZSIsICAgb3B0aW9uYWxfYXJndW1lbnQsIDAsIDUsfSwKKwkJeyJjb25uZWN0eCIsICAgIDEsIDAsIDE3fSwKKwkJezAsCQkwLCAwLCAwfQorCX07CisKKwkvKiBQYXJzZSB0aGUgYXJndW1lbnRzLiAgKi8KKwl3aGlsZSAoMSkgeworCQljID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJCOkg6SVA6YjpoOmk6cDpsbTpuc3R6OmVjOiIsCisJCQkJIGxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7CisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgMDoKKwkJCXByaW50Zigib3B0aW9uICVzIiwgbG9uZ19vcHRpb25zW29wdGlvbl9pbmRleF0ubmFtZSk7CisJCQlpZiAob3B0YXJnKSB7CisJCQkJcHJpbnRmKCIgd2l0aCBhcmcgJXMiLCBvcHRhcmcpOworCQkJfQorCQkJcHJpbnRmKCJcbiIpOworCQkJYnJlYWs7CisJCWNhc2UgMToJCS8qIGxvY2FsIGhvc3QgKi8KKwkJY2FzZSAnSCc6CisJCQlsb2NhbF9ob3N0ID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgMjoJCS8qIGxvY2FsIHBvcnQgKi8KKwkJY2FzZSAnUCc6CisJCQlsb2NhbF9wb3J0ID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgMzoJCS8qIHJlbW90ZSBob3N0ICovCisJCWNhc2UgJ2gnOgorCQkJcmVtb3RlX2hvc3QgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSA0OgkJLyogcmVtb3RlIHBvcnQgKi8KKwkJY2FzZSAncCc6CisJCQlyZW1vdGVfcG9ydCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlIDU6ICAvKiBpbnRlcmZhY2UgZm9yIHNpbjZfc2NvcGVfaWQgKi8KKwkJCWlmIChvcHRhcmcpCisJCQkJaW50ZXJmYWNlID0gb3B0YXJnOworCQkJaWZfaW5kZXggPSBpZl9uYW1ldG9pbmRleChpbnRlcmZhY2UpOworCQkJaWYgKCFpZl9pbmRleCkgeworCQkJCXByaW50ZigiSW50ZXJmYWNlICVzIHVua25vd25cbiIsIGludGVyZmFjZSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQkJLyogQ09NTUFORFMgKi8KKwkJY2FzZSAxMDoJLyogbGlzdGVuICovCisJCWNhc2UgJ2wnOgorCQkJaWYgKGNvbW1hbmQpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJIiVzOiBwaWNrIE9ORSBvZiBsaXN0ZW4gb3Igc2VuZFxuIiwKKwkJCQkJYXJndlswXSk7CisJCQkJZXhpdCgxKTsKKwkJCX0gZWxzZSB7CisJCQkJY29tbWFuZCA9IENPTU1BTkRfTElTVEVOOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAxMToJLyogc2VuZCAqLworCQljYXNlICdzJzoKKwkJCWlmIChjb21tYW5kKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSIlczogcGljayBPTkUgb2YgbGlzdGVuIG9yIHNlbmRcbiIsCisJCQkJCWFyZ3ZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9IGVsc2UgeworCQkJCWNvbW1hbmQgPSBDT01NQU5EX1NFTkQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDE1OgkJLyogYmluZHhfYWRkICovCisJCWNhc2UgJ0InOgorCQkJdG1wX2FkZHJzID0KKwkJCQlhcHBlbmRfYWRkcihvcHRhcmcsIGJpbmR4X2FkZF9hZGRycywKKwkJCQkJICAgICZiaW5keF9hZGRfY291bnQpOworCQkJaWYgKE5VTEwgPT0gdG1wX2FkZHJzKSB7CisJCQkJLyogV2UgaGF2ZSBubyBtZW1vcnksIHNvIGtlZXAgZnByaW50ZigpCisJCQkJICogZnJvbSB0cnlpbmcgdG8gYWxsb2NhdGUgbW9yZS4KKwkJCQkgKi8KKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIG1lbW9yeSB0byBhZGQgIik7CisJCQkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgb3B0YXJnKTsKKwkJCQlleGl0KDIpOworCQkJfQorCQkJYmluZHhfYWRkX2FkZHJzID0gdG1wX2FkZHJzOworCisJCQlicmVhazsKKworCQljYXNlIDE2OgkJLyogYmluZHhfcmVtICovCisJCWNhc2UgJ2InOgorCQkJdG1wX2FkZHJzID0KKwkJCQlhcHBlbmRfYWRkcihvcHRhcmcsIGJpbmR4X3JlbV9hZGRycywKKwkJCQkJICAgICZiaW5keF9yZW1fY291bnQpOworCQkJaWYgKE5VTEwgPT0gdG1wX2FkZHJzKSB7CisJCQkJLyogV2UgaGF2ZSBubyBtZW1vcnksIHNvIGtlZXAgZnByaW50ZigpCisJCQkJICogZnJvbSB0cnlpbmcgdG8gYWxsb2NhdGUgbW9yZS4KKwkJCQkgKi8KKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIG1lbW9yeSB0byBhZGQgIik7CisJCQkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgb3B0YXJnKTsKKwkJCQlleGl0KDIpOworCQkJfQorCQkJYmluZHhfcmVtX2FkZHJzID0gdG1wX2FkZHJzOworCQkJYnJlYWs7CisJCWNhc2UgMTc6CQkvKiBjb25uZWN0eCAqLworCQljYXNlICdjJzoKKwkJCXRtcF9hZGRycyA9CisJCQkJYXBwZW5kX2FkZHIob3B0YXJnLCBjb25uZWN0eF9hZGRycywKKwkJCQkJICAgICZjb25uZWN0eF9jb3VudCk7CisJCQlpZiAoTlVMTCA9PSB0bXBfYWRkcnMpIHsKKwkJCQkvKiBXZSBoYXZlIG5vIG1lbW9yeSwgc28ga2VlcCBmcHJpbnRmKCkKKwkJCQkgKiBmcm9tIHRyeWluZyB0byBhbGxvY2F0ZSBtb3JlLgorCQkJCSAqLworCQkJCWZwcmludGYoc3RkZXJyLCAiTm8gbWVtb3J5IHRvIGFkZCAiKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBvcHRhcmcpOworCQkJCWV4aXQoMik7CisJCQl9CisJCQljb25uZWN0eF9hZGRycyA9IHRtcF9hZGRyczsKKwkJCWJyZWFrOworCQljYXNlIDIwOgkJLyogdXNlLXBvbGwgKi8KKwkJCXVzZV9wb2xsID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdJJzoKKwkJCWludGVyYWN0aXZlX21vZGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJY29tbWFuZCA9IENPTU1BTkRfUE9MTDsKKwkJCXBvbGxfc2tuID0gYXRvaShvcHRhcmcpOworCQkJaWYgKHBvbGxfc2tuIDw9IDAgfHwgcG9sbF9za24gPiBQT0xMX1NLX01BWCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiVG9vIG1hbnkgc29ja2V0cyBmb3IgIik7CisJCQkJZnByaW50ZihzdGRlcnIsICJmb3IgcG9sbGluZ1xuIik7CisJCQkJZXhpdCgyKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCW9wdF9zcGFjZSA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW5vbmJsb2NraW5nID0gMTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCXNvY2tldF90eXBlID0gU09DS19TVFJFQU07CisJCQlicmVhazsKKwkJY2FzZSAneic6CisJCQlwb2xsX3NuZF9zaXplID0gYXRvaShvcHRhcmcpOworCQkJaWYgKHBvbGxfc25kX3NpemUgPD0gMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiQmFkIG1lc3NhZ2Ugc2l6ZS5cbiIpOworCQkJCWV4aXQoMik7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnZSc6CisJCQllY2hvID0gMTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJZXhpdCgxKTsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRmICgiJXM6IHVucmVjb2duaXplZCBvcHRpb24gMCVjXG4iLAorCQkJCWFyZ3ZbMF0sIGMpOworCQkJdXNhZ2UoYXJndlswXSk7CisJCQlleGl0KDEpOworCQl9CisJfQorCisJaWYgKG9wdGluZCA8IGFyZ2MpCisJeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBub24tb3B0aW9uIGFyZ3VtZW50cyBhcmUgaWxsZWdhbDogIiwKKwkJCWFyZ3ZbMF0pOworCQl3aGlsZSAob3B0aW5kIDwgYXJnYykKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMgIiwgYXJndltvcHRpbmQrK10pOworCQlmcHJpbnRmIChzdGRlcnIsICJcbiIpOworCQl1c2FnZShhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKworCWlmIChOVUxMID09IGxvY2FsX2hvc3QpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogWW91IE1VU1QgcHJvdmlkZSBhIGxvY2FsIGhvc3QuXG4iLAorCQkJYXJndlswXSk7CisJCXVzYWdlKGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCWlmIChjb21tYW5kID09IENPTU1BTkRfU0VORCAmJiBOVUxMID09IHJlbW90ZV9ob3N0CisJICAgICYmIGNvbm5lY3R4X2NvdW50ID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogWW91IE1VU1QgcHJvdmlkZSBhIHJlbW90ZSBob3N0IGZvciBzZW5kaW5nLlxuIiwKKwkJCWFyZ3ZbMF0pOworCQl1c2FnZShhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAocmVtb3RlX2hvc3QgIT0gTlVMTCAmJiBjb25uZWN0eF9jb3VudCAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IFlvdSBjYW4gbm90IHByb3ZpZGUgYm90aCAtaCBhbmQgLWMgb3B0aW9ucy5cbiIsCisJCQlhcmd2WzBdKTsKKwkJdXNhZ2UoYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorfSAvKiBwYXJzZV9hcmd1bWVudHMoKSAqLworCisvKiBTZXQgdXAgdGhlIGxvY2FsIGVuZHBvaW50LiAgKi8KK2ludAorYnVpbGRfZW5kcG9pbnQoY2hhciAqYXJndjAsIGludCBwb3J0bnVtKQoreworCWludCByZXR2YWw7CisJc3RydWN0IGhvc3RlbnQgKmhzdDsKKwlzb2NrYWRkcl9zdG9yYWdlX3QgbG9jYWxfYWRkcjsKKwlzYV9mYW1pbHlfdCBsYV9mYW1pbHk7CS8qIFdoYXQgZmFtaWx5IGlzIGxvY2FsX2FkZHI/ICovCisJaW50IGxhX2xlbjsJCS8qIEhvdyBsb25nIGlzIGxvY2FsX2FkZHI/ICovCisJdm9pZCAqbGFfcmF3OwkJLyogVGhpcyBpcyB0aGUgYWRkciBwYXJ0IG9mIGxvY2FsX2FkZHIuICovCisJaW50IGVycm9yOworCXN0cnVjdCBzY3RwX2V2ZW50X3N1YnNjcmliZSBzdWJzY3JpYmU7CisKKwkvKiBHZXQgdGhlIHRyYW5zcG9ydCBhZGRyZXNzIGZvciB0aGUgbG9jYWwgaG9zdCBuYW1lLiAgKi8KKwloc3QgPSBnZXRob3N0YnluYW1lKGxvY2FsX2hvc3QpOworCWlmIChoc3QgPT0gTlVMTCkgeworCQloc3QgPSBnZXRob3N0YnluYW1lMihsb2NhbF9ob3N0LCBBRl9JTkVUNik7CisJfQorCisJaWYgKGhzdCA9PSBOVUxMIHx8IGhzdC0+aF9sZW5ndGggPCAxKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IGJhZCBob3N0bmFtZTogJXNcbiIsIGFyZ3YwLCBsb2NhbF9ob3N0KTsKKwkJZXhpdCgxKTsKKwl9CisKKwlsYV9mYW1pbHkgPSBoc3QtPmhfYWRkcnR5cGU7CisJc3dpdGNoIChsYV9mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCWxhX2xlbiA9IHNpemVvZihsb2NhbF9hZGRyLnY0KTsKKwkJbGFfcmF3ID0gJmxvY2FsX2FkZHIudjQuc2luX2FkZHI7CisJCWxvY2FsX2FkZHIudjQuc2luX3BvcnQgPSBodG9ucyhwb3J0bnVtKTsKKwkJbG9jYWxfYWRkci52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJYnJlYWs7CisJY2FzZSBBRl9JTkVUNjoKKwkJbGFfbGVuID0gc2l6ZW9mKGxvY2FsX2FkZHIudjYpOworCQlsYV9yYXcgPSAmbG9jYWxfYWRkci52Ni5zaW42X2FkZHI7CisJCWxvY2FsX2FkZHIudjYuc2luNl9wb3J0ID0gaHRvbnMocG9ydG51bSk7CisJCWxvY2FsX2FkZHIudjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJbG9jYWxfYWRkci52Ni5zaW42X3Njb3BlX2lkID0gaWZfaW5kZXg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBhZGRyZXNzIHR5cGUuXG4iKTsKKwkJZXhpdCgxKTsKKwkJYnJlYWs7CisJfQorCW1lbWNweShsYV9yYXcsIGhzdC0+aF9hZGRyX2xpc3RbMF0sIGhzdC0+aF9sZW5ndGgpOworCisJLyogQ3JlYXRlIHRoZSBsb2NhbCBlbmRwb2ludC4gICovCisJcmV0dmFsID0gc29ja2V0KGxhX2ZhbWlseSwgc29ja2V0X3R5cGUsIElQUFJPVE9fU0NUUCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogZmFpbGVkIHRvIGNyZWF0ZSBzb2NrZXQ6ICAlcy5cbiIsCisJCQlhcmd2MCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoU09DS19TRVFQQUNLRVQgPT0gc29ja2V0X3R5cGUpIHsKKwkJbWVtc2V0KCZzdWJzY3JpYmUsIDAsIHNpemVvZihzdWJzY3JpYmUpKTsKKwkJc3Vic2NyaWJlLnNjdHBfZGF0YV9pb19ldmVudCA9IDE7CisJCXN1YnNjcmliZS5zY3RwX2Fzc29jaWF0aW9uX2V2ZW50ID0gMTsKKwkJZXJyb3IgPSBzZXRzb2Nrb3B0KHJldHZhbCwgU09MX1NDVFAsIFNDVFBfRVZFTlRTLAorCQkJCSAgIChjaGFyICopJnN1YnNjcmliZSwgc2l6ZW9mKHN1YnNjcmliZSkpOworCQlpZiAoZXJyb3IpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiU0NUUF9FVkVOVFM6IGVycm9yOiAlZFxuIiwgZXJyb3IpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCS8qIEJpbmQgdGhpcyBzb2NrZXQgdG8gdGhlIHRlc3QgcG9ydC4gICovCisJZXJyb3IgPSBiaW5kKHJldHZhbCwgJmxvY2FsX2FkZHIuc2EsIGxhX2xlbik7CisJaWYgKGVycm9yICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogY2FuIG5vdCBiaW5kIHRvICVzOiVkOiAlcy5cbiIsCisJCQlhcmd2MCwgbG9jYWxfaG9zdCwgcG9ydG51bSwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCisJLyogRG8gd2UgbmVlZCB0byBkbyBiaW5keCgpIHRvIGFkZCBhbnkgYWRkaXRpb25hbCBhZGRyZXNzZXM/ICovCisJaWYgKGJpbmR4X2FkZF9hZGRycykgeworCQlpZiAoMCAhPSBiaW5keF9mdW5jKGFyZ3YwLCByZXR2YWwsIGJpbmR4X2FkZF9hZGRycywKKwkJCWJpbmR4X2FkZF9jb3VudCwgU0NUUF9CSU5EWF9BRERfQUREUiwgcG9ydG51bSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiYmluZHhfZnVuYyAoYWRkKSBmYWlsZWQuXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9IC8qIGlmIChiaW5keF9hZGRfYWRkcnMpICovCisKKwkvKiBEbyB3ZSBuZWVkIHRvIGRvIGJpbmR4KCkgdG8gcmVtb3ZlIGFueSBib3VuZCBhZGRyZXNzZXM/ICovCisJaWYgKGJpbmR4X3JlbV9hZGRycykgeworCQlpZiAoMCAhPSBiaW5keF9mdW5jKGFyZ3YwLCByZXR2YWwsIGJpbmR4X3JlbV9hZGRycywKKwkJCWJpbmR4X3JlbV9jb3VudCwgU0NUUF9CSU5EWF9SRU1fQUREUiwgcG9ydG51bSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiYmluZHhfZnVuYyAocmVtb3ZlKSBmYWlsZWQuXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9IC8qIGlmIChiaW5keF9yZW1fYWRkcnMpICovCisKKwkvKiBEbyB3ZSB3YW50IHRvIHJ1biBpbiB0aGUgbm9uLWJsb2NraW5nIG1vZGU/ICovCisJaWYgKG5vbmJsb2NraW5nKSB7CisJCWVycm9yID0gZmNudGwocmV0dmFsLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKwkJaWYgKGVycm9yICE9IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIGZjbnRsOiAlcy5cbiIsCisJCQkJYXJndjAsIHN0cmVycm9yKGVycm5vKSk7CisJCQlleGl0KDEpOworCQl9CisJfQorCisJaWYgKG9wdF9zcGFjZSkgeworCQlzbmRidWZfZnVuYyhhcmd2MCwgcmV0dmFsLCBvcHRfc3BhY2UsIDEpOworCQlyY3ZidWZfZnVuYyhhcmd2MCwgcmV0dmFsLCBvcHRfc3BhY2UsIDEpOworCX0KKworCXJldHVybiByZXR2YWw7CisKK30gLyogYnVpbGRfZW5kcG9pbnQoKSAqLworCisvKiBDb252ZW5pZW5jZSBzdHJ1Y3R1cmUgdG8gZGV0ZXJtaW5lIHNwYWNlIG5lZWRlZCBmb3IgY21zZy4gKi8KK3R5cGVkZWYgdW5pb24geworCXN0cnVjdCBzY3RwX2luaXRtc2cgaW5pdDsKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvIHNuZHJjdmluZm87Cit9IF9zY3RwX2Ntc2dfZGF0YV90OworCisKKy8qIExpc3RlbiBvbiB0aGUgc29ja2V0LCBwcmludGluZyBvdXQgYW55dGhpbmcgdGhhdCBhcnJpdmVzLiAgKi8KK2ludAorY29tbWFuZF9saXN0ZW4oY2hhciAqYXJndjAsIGludCBzaykKK3sKKwljaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihfc2N0cF9jbXNnX2RhdGFfdCkpXTsKKwlzdHJ1Y3QgaW92ZWMgaW92OworCXN0cnVjdCBtc2doZHIgaW5tZXNzYWdlOworCXNvY2thZGRyX3N0b3JhZ2VfdCBtc2duYW1lOworCWNoYXIgbWVzc2FnZVtSRUFMTFlfQklHXTsKKwlpbnQgZG9uZSA9IDA7CisJaW50IGVycm9yOworCWludCBjOworCWludCByZWN2c2sgPSAwOworCisgCS8qIE1hcmsgc2sgYXMgYmVpbmcgYWJsZSB0byBhY2NlcHQgbmV3IGFzc29jaWF0aW9ucyAqLworCWVycm9yID0gbGlzdGVuKHNrLCA1KTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlwcmludGYoIlxuXG5cdFx0bGlzdGVuIEZhaWx1cmU6ICAlcy5cblxuXG4iLAorCQkgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAobm9uYmxvY2tpbmcpIHsKKwkJaWYgKCFpbnRlcmFjdGl2ZV9tb2RlKSB7CisJCQlwcmludGYoIlVzZSAtSSBmb3IgaW50ZXJhY3RpdmUgbW9kZSB3aXRoIik7CisJCSAgICAgICBwcmludGYoIgktbiBub25ibG9ja2luZ1xuIik7CisJCSAgICAgICBleGl0KDEpOworCQkgfQorCX0KKworCS8qIEluaXRpYWxpemUgdGhlIGdsb2JhbCB2YWx1ZSBmb3IgaW50ZXJhY3RpdmUgbW9kZSBmdW5jdGlvbnMuICAqLworCWlmIChpbnRlcmFjdGl2ZV9tb2RlKSB7CisJCWludGVyX3NrID0gc2s7CisJfQorCisJLyogSW5pdGlhbGl6ZSBpbm1lc3NhZ2Ugd2l0aCBlbm91Z2ggc3BhY2UgZm9yIERBVEEuLi4gKi8KKwltZW1zZXQoJmlubWVzc2FnZSwgMCwgc2l6ZW9mKGlubWVzc2FnZSkpOworCWlmICgoaW92Lmlvdl9iYXNlID0gbWFsbG9jKFJFQUxMWV9CSUcpKSA9PSBOVUxMKSB7CisJCXByaW50ZigiJXM6IENhbid0IGFsbG9jYXRlIG1lbW9yeS5cbiIsIGFyZ3YwKTsKKwkJZXhpdCgxKTsKKwl9CisJaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworCWlubWVzc2FnZS5tc2dfaW92ID0gJmlvdjsKKwlpbm1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisJLyogb3IgYSBjb250cm9sIG1lc3NhZ2UuICAqLworCWlubWVzc2FnZS5tc2dfY29udHJvbCA9IGluY21zZzsKKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwlpbm1lc3NhZ2UubXNnX25hbWUgPSAmbXNnbmFtZTsKKwlpbm1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2YobXNnbmFtZSk7CisKKwlwcmludGYoIiVzIGxpc3RlbmluZy4uLlxuIiwgYXJndjApOworCS8qIEdldCB0aGUgbWVzc2FnZXMgc2VudCAqLworCWRvbmUgPSAwOworCXdoaWxlICghZG9uZSkgeworCQlpZiAoaW50ZXJhY3RpdmVfbW9kZSkgeworCQkJLyogUmVhZCBmcm9tIHRoZSB1c2VyLiAgKi8KKwkJCWlmIChyZW1vdGVfaG9zdCkgeworCQkJCXByaW50ZigiJXM6JWQtJXM6JWQgSW50ZXJhY3RpdmUgbW9kZT4gIiwKKwkJCQkJbG9jYWxfaG9zdCwgbG9jYWxfcG9ydCwgcmVtb3RlX2hvc3QsCisJCQkJCXJlbW90ZV9wb3J0KTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCIlczolZC0iLCBsb2NhbF9ob3N0LCBsb2NhbF9wb3J0KTsKKwkJCQlpZiAoYXNzb2NpZCkgeworCQkJCQlwcmludF9zb2NrYWRkcigmcmVtb3RlX2FkZHIuc2EpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ZigiPzolZCIsIHJlbW90ZV9wb3J0KTsKKwkJCQl9CisJCQkJcHJpbnRmKCIgSW50ZXJhY3RpdmUgbW9kZT4gIik7CisJCQl9CisJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCWlmIChOVUxMID09IGZnZXRzKG1lc3NhZ2UsIFJFQUxMWV9CSUcsIHN0ZGluKSkgeworCQkJCWRvbmUgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoMCA8PSAoYyA9IHBhcnNlX2ludGVyX2NvbW1hbmRzKGFyZ3YwLCBtZXNzYWdlLAorCQkJCTApKSkgeworCQkJCWlmIChJTlRFUl9SQ1YgIT0gYykgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJaWYgKHNvY2tldF90eXBlID09IFNPQ0tfU1RSRUFNKSB7CisJCQlzb2NrbGVuX3QgbGVuID0gMDsKKworCQkJaWYgKCFyZWN2c2spIHsKKwkJCQlpZiAoKHJlY3ZzayA9IGFjY2VwdChzaywgTlVMTCwgJmxlbikpIDwgMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvcjogJXMuXG4iLAorCQkJCQkJYXJndjAsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCWV4aXQoMSk7CisJCQkJfQorCQkJfQorCisJCX0gZWxzZSB7CisJCQlyZWN2c2sgPSBzazsKKwkJfQorCisJCWVycm9yID0gcmVjdm1zZyhyZWN2c2ssICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwkJaWYgKGVycm9yIDwgMCkgeworCQkJaWYgKG5vbmJsb2NraW5nICYmIChFQUdBSU4gPT0gZXJybm8pKSB7CisJCQkJZXJyb3IgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoc29ja2V0X3R5cGUgPT0gU09DS19TVFJFQU0pIHsKKwkJCQlpZiAoRU5PVENPTk4gIT0gZXJybm8pCisJCQkJCWJyZWFrOworCQkJCXByaW50ZigiTm8gYXNzb2NpYXRpb24gaXMgcHJlc2VudCBub3chIVxuIik7CisJCQkJY2xvc2UocmVjdnNrKTsKKwkJCQlyZWN2c2sgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvKiBVcGRhdGUgdGhlIGFzc29jaWQgd2hlbiBhIG5vdGlmaWNhdGlvbiBpcyByZWNlaXZlZCBvbiBhCisJCSAqIFVEUC1zdHlsZSBzb2NrZXQuCisJCSAqLworCQlpZiAoaW5tZXNzYWdlLm1zZ19mbGFncyAmIE1TR19OT1RJRklDQVRJT04pCisJCQlhc3NvY2lkID0gdGVzdF92ZXJpZnlfYXNzb2NfY2hhbmdlKCZpbm1lc3NhZ2UpOworCisJCWlmIChlY2hvKSB7CisJCQlpZiggIShNU0dfTk9USUZJQ0FUSU9OICYgaW5tZXNzYWdlLm1zZ19mbGFncykpIHsKKwkJCQlpZiAoc2VuZHRvKHJlY3ZzaywgaW5tZXNzYWdlLm1zZ19pb3YtPmlvdl9iYXNlLAorCQkJCQkgICBlcnJvciwgMCwKKwkJCQkJICAgKHN0cnVjdCBzb2NrYWRkciAqKSZtc2duYW1lLAorCQkJCQkgICBzaXplb2YobXNnbmFtZSkpID09IC0xKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yOiAlcy5cbiIsCisJCQkJCQlhcmd2MCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJZXhpdCgxKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQl0ZXN0X3ByaW50X21lc3NhZ2Uoc2ssICZpbm1lc3NhZ2UsIGVycm9yKTsKKworCQlpbm1lc3NhZ2UubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisJCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCQlpbm1lc3NhZ2UubXNnX25hbWUgPSAmbXNnbmFtZTsKKwkJaW5tZXNzYWdlLm1zZ19uYW1lbGVuID0gc2l6ZW9mKG1zZ25hbWUpOworCQlpb3YuaW92X2xlbiA9IFJFQUxMWV9CSUc7CisKKwkJLyogVmVyaWZ5IHRoYXQgdGhlIGFzc29jaWF0aW9uIGlzIG5vIGxvbmdlciBwcmVzZW50LiAgKi8KKwkJaWYgKDAgIT0gdGVzdF9za19mb3JfYXNzb2MocmVjdnNrLCBhc3NvY2lkKSkgeworCQkJcHJpbnRmKCJObyBhc3NvY2lhdGlvbiBpcyBwcmVzZW50IG5vdyEhXG4iKTsKKwkJCWlmIChzb2NrZXRfdHlwZSA9PSBTT0NLX1NUUkVBTSkgeworCQkJCWNsb3NlKHJlY3Zzayk7CisJCQkJcmVjdnNrID0gMDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChlcnJvciA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogZXJyb3I6ICVzLlxuIiwKKwkJCWFyZ3YwLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KDEpOworCX0KKworCXJldHVybiBlcnJvcjsKKworfSAvKiBjb21tYW5kX2xpc3RlbigpICovCisKKy8qIFJlYWQgbGluZXMgZnJvbSBzdGRpbiBhbmQgc2VuZCB0aGVtIHRvIHRoZSBzb2NrZXQuICAqLworaW50Citjb21tYW5kX3NlbmQoY2hhciAqYXJndjAsIGludCAqc2twKQoreworCXN0cnVjdCBtc2doZHIgb3V0bXNnOworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJaW50IGRvbmUgPSAwOworCWNoYXIgbWVzc2FnZVtSRUFMTFlfQklHXTsKKwlzdHJ1Y3QgaG9zdGVudCAqaHN0OworCWludCBjOworCXN0cnVjdCBzb2NrYWRkciAqYWRkcnM7CisJaW50IG1zZ2xlbjsKKwlpbnQgZXJyb3IgPSAwOworCWludCBzayA9ICpza3A7CisKKwkvKiBTZXQgdXAgdGhlIGRlc3RpbmF0aW9uLiAgKi8KKwlpZiAocmVtb3RlX2hvc3QgIT0gTlVMTCkgeworCQloc3QgPSBnZXRob3N0YnluYW1lKHJlbW90ZV9ob3N0KTsKKwkJaWYgKGhzdCA9PSBOVUxMKSB7CisJCQloc3QgPSBnZXRob3N0YnluYW1lMihyZW1vdGVfaG9zdCwgQUZfSU5FVDYpOworCQl9CisKKwkJaWYgKGhzdCA9PSBOVUxMIHx8IGhzdC0+aF9sZW5ndGggPCAxKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBiYWQgaG9zdG5hbWU6ICVzXG4iLAorCQkJCWFyZ3YwLCByZW1vdGVfaG9zdCk7CisJCQlleGl0KDEpOworCQl9CisKKwkJcmFfZmFtaWx5ID0gaHN0LT5oX2FkZHJ0eXBlOworCQlzd2l0Y2ggKHJhX2ZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCQlyYV9sZW4gPSBzaXplb2YocmVtb3RlX2FkZHIudjQpOworCQkJcmFfcmF3ID0gJnJlbW90ZV9hZGRyLnY0LnNpbl9hZGRyOworCQkJcmVtb3RlX2FkZHIudjQuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVfcG9ydCk7CisJCQlyZW1vdGVfYWRkci52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWJyZWFrOworCQljYXNlIEFGX0lORVQ2OgorCQkJcmFfbGVuID0gc2l6ZW9mKHJlbW90ZV9hZGRyLnY2KTsKKwkJCXJhX3JhdyA9ICZyZW1vdGVfYWRkci52Ni5zaW42X2FkZHI7CisJCQlyZW1vdGVfYWRkci52Ni5zaW42X3BvcnQgPSBodG9ucyhyZW1vdGVfcG9ydCk7CisJCQlyZW1vdGVfYWRkci52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJcmVtb3RlX2FkZHIudjYuc2luNl9zY29wZV9pZCA9IGlmX2luZGV4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgYWRkcmVzcyB0eXBlLlxuIik7CisJCQlleGl0KDEpOworCQkJYnJlYWs7CisJCX0KKwkJbWVtY3B5KHJhX3JhdywgaHN0LT5oX2FkZHJfbGlzdFswXSwgaHN0LT5oX2xlbmd0aCk7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgZ2xvYmFsIHZhbHVlIGZvciBpbnRlcmFjdGl2ZSBtb2RlIGZ1bmN0aW9ucy4gICovCisJaWYgKGludGVyYWN0aXZlX21vZGUpIHsKKwkJaW50ZXJfc2sgPSBzazsKKwl9CisKKwlwcmludGYoIiVzIHJlYWR5IHRvIHNlbmQuLi5cbiIsIGFyZ3YwKTsKKwl3aGlsZSAoIWRvbmUpIHsKKwkJLyogUmVhZCBmcm9tIHRoZSB1c2VyLiAgKi8KKwkJaWYgKHJlbW90ZV9ob3N0KSB7CisJCQlpZiAoaW50ZXJhY3RpdmVfbW9kZSkgeworCQkJCXByaW50ZigiJXM6JWQtJXM6JWQgSW50ZXJhY3RpdmUgbW9kZT4gIiwKKwkJCQkJbG9jYWxfaG9zdCwgbG9jYWxfcG9ydCwgcmVtb3RlX2hvc3QsCisJCQkJCXJlbW90ZV9wb3J0KTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCIlczolZC0lczolZD4gIiwKKwkJCQkgICAgICAgbG9jYWxfaG9zdCwgbG9jYWxfcG9ydCwKKwkJCQkgICAgICAgcmVtb3RlX2hvc3QsIHJlbW90ZV9wb3J0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiJXM6JWQtIiwgbG9jYWxfaG9zdCwgbG9jYWxfcG9ydCk7CisJCQlpZiAoYXNzb2NpZCkgeworCQkJCXByaW50X3NvY2thZGRyKCZyZW1vdGVfYWRkci5zYSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ZigiWFhYWFhYOiVkIiwgcmVtb3RlX3BvcnQpOworCQkJfQorCQkJaWYgKGludGVyYWN0aXZlX21vZGUpIHsKKwkJCQlwcmludGYoIiBJbnRlcmFjdGl2ZSBtb2RlPiAiKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCI+ICIpOworCQkJfQorCQl9CisJCWZmbHVzaChzdGRvdXQpOworCQlpZiAoTlVMTCA9PSBmZ2V0cyhtZXNzYWdlLCBSRUFMTFlfQklHLCBzdGRpbikpIHsKKwkJCWRvbmUgPSAxOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaW50ZXJhY3RpdmVfbW9kZSkgeworCQkJLyogVGhpcyBpcyB0aGUgc2VuZCBvbmx5IGFnZW50LiAgKi8KKwkJCWlmICgwIDw9IChjID0gcGFyc2VfaW50ZXJfY29tbWFuZHMoYXJndjAsIG1lc3NhZ2UsCisJCQkJMSkpKSB7CisJCQkJaWYgKElOVEVSX1NORCA9PSBjKSB7CisJCQkJCWlvdi5pb3ZfYmFzZSA9IGludGVyX291dGJ1ZjsKKwkJCQkJbXNnbGVuID0gaW50ZXJfb3V0bGVuOworCQkJCQlpb3YuaW92X2xlbiA9IG1zZ2xlbjsKKworCQkJCX0gZWxzZSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFNlbmQgdG8gb3VyIG5laWdoYm9yLiAgKi8KKwkJCW1zZ2xlbiA9IHN0cmxlbihtZXNzYWdlKSArIDE7CisJCQlpb3YuaW92X2xlbiA9IG1zZ2xlbjsKKwkJfQorCisJCS8qIEZvciBhIFVEUC1zdHlsZSBzb2NrZXQsIHZlcmlmeSBpZiBhbiBleGlzdGluZyBhc3NvY2lhdGlvbgorCQkgKiBoYXMgZ29uZS4gSWYgc28sIHJlY2VpdmUgdGhlIHBlbmRpbmcgU0NUUF9BU1NPQ19DSEFOR0UKKwkJICogbm90aWZpY2F0aW9uLgorCQkgKi8KKwkJaWYgKChTT0NLX1NFUVBBQ0tFVCA9PSBzb2NrZXRfdHlwZSkgJiYgYXNzb2NpZCAmJgorCQkgICAgKDAgIT0gdGVzdF9za19mb3JfYXNzb2Moc2ssIGFzc29jaWQpKSkgeworCQkJYXNzb2NpZCA9IHRlc3RfcmVjdl9hc3NvY19jaGFuZ2Uoc2spOworCQkJcHJpbnRmKCJPbGQgYXNzb2NpYXRpb24gZ29uZSwgU3RhcnRpbmcgYSBuZXcgb25lIVxuIik7CisJCQluZXdfY29ubmVjdGlvbiA9IDE7CisJCX0KKworCQlpZiAobmV3X2Nvbm5lY3Rpb24gJiYgY29ubmVjdHhfY291bnQgIT0gMCkgeworCQkJLyogRG8gYSBzY3RwX2Nvbm5lY3R4KCkgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbi4gKi8KKwkJCWVycm9yID0gY29ubmVjdHhfZnVuYyhhcmd2MCwgc2ssIGNvbm5lY3R4X2FkZHJzLAorCQkJCQkgICAgICBjb25uZWN0eF9jb3VudCk7CisJCQlpZiAoMCAhPSBlcnJvcikgeworCQkJCWlmIChlcnJvciA9PSAtMikgeworCQkJCQlwcmludGYoIkNvbm5lY3Rpb24gcmVmdXNlZFxuIik7CisJCQkJCWlmIChTT0NLX1NFUVBBQ0tFVCA9PSBzb2NrZXRfdHlwZSkgeworCQkJCQkJYXNzb2NpZCA9IHRlc3RfcmVjdl9hc3NvY19jaGFuZ2Uoc2spOworCQkJCQl9CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlmcHJpbnRmKHN0ZGVyciwgImNvbm5lY3R4IGZhaWxlZC5cbiIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlpZiAoU09DS19TRVFQQUNLRVQgPT0gc29ja2V0X3R5cGUpIHsKKwkJCQlhc3NvY2lkID0gdGVzdF9yZWN2X2Fzc29jX2NoYW5nZShzayk7CisJCQl9IGVsc2UgeworCQkJCWFzc29jaWQgPSAxOworCQkJfQorCQkJaW50IHJjID0gc2N0cF9nZXRwYWRkcnMoc2ssIGFzc29jaWQsICZhZGRycyk7CisJCQlpZiAoMCA+PSByYykgeworCQkJCWlmIChyYyA9PSAwKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAic2N0cF9nZXRwYWRkcnMgZmFpbGVkLCBubyBwZWVycy5cbiIpOworCQkJCX0gZWxzZSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAic2N0cF9nZXRwYWRkcnMgZmFpbGVkICVzKCVkKS5cbiIsIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOworCQkJCX0KKwkJCQlleGl0KDEpOworCQkJfQorCQkJcHJpbnRmKCJOZXcgY29ubmVjdGlvbiwgcGVlciBhZGRyZXNzZXNcbiIpOworCQkJcHJpbnRfYWRkcl9idWYoYWRkcnMsIHJjKTsKKwkJCXJhX2ZhbWlseSA9IGFkZHJzWzBdLnNhX2ZhbWlseTsKKwkJCXN3aXRjaCAocmFfZmFtaWx5KSB7CisJCQljYXNlIEFGX0lORVQ6CisJCQkJcmFfbGVuID0gc2l6ZW9mKHJlbW90ZV9hZGRyLnY0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUZfSU5FVDY6CisJCQkJcmFfbGVuID0gc2l6ZW9mKHJlbW90ZV9hZGRyLnY2KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGFkZHJlc3MgdHlwZS5cbiIpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQltZW1jcHkoJnJlbW90ZV9hZGRyLCAmYWRkcnNbMF0sIHJhX2xlbik7CisJCQlzY3RwX2ZyZWVwYWRkcnMoYWRkcnMpOworCQkJbmV3X2Nvbm5lY3Rpb24gPSAwOworCQl9CisKKwkJZG8geworCQkJaWYgKFNPQ0tfU0VRUEFDS0VUID09IHNvY2tldF90eXBlIHx8CisJCQkgICAgKGNvbm5lY3R4X2NvdW50ID09IDAgJiYgbmV3X2Nvbm5lY3Rpb24pKSB7CisJCQkJLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBzdHJ1Y3Qgd2UgdXNlIHRvIHBhc3MKKwkJCQkgKiBtZXNzYWdlcyB0byB0aGUgcmVtb3RlIHNvY2tldC4KKwkJCQkgKi8KKwkJCQlpZiAoIWludGVyYWN0aXZlX21vZGUpIHsKKwkJCQkJaW92Lmlvdl9iYXNlID0gbWVzc2FnZTsKKwkJCQkJaW92Lmlvdl9sZW4gPSBtc2dsZW47CisJCQkJfQorCQkJCW91dG1zZy5tc2dfaW92ID0gJmlvdjsKKwkJCQlvdXRtc2cubXNnX2lvdmxlbiA9IDE7CisJCQkJb3V0bXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwkJCQlvdXRtc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCQkJCW91dG1zZy5tc2dfbmFtZSA9ICZyZW1vdGVfYWRkcjsKKwkJCQlvdXRtc2cubXNnX25hbWVsZW4gPSByYV9sZW47CisJCQkJb3V0bXNnLm1zZ19mbGFncyA9IDA7CisKKwkJCQllcnJvciA9IHNlbmRtc2coc2ssICZvdXRtc2csIDApOworCQkJfSBlbHNlIHsKKwkJCQllcnJvciA9IHNlbmQoc2ssIG1lc3NhZ2UsIG1zZ2xlbiwgMCk7CisJCQkJaWYgKGVycm9yID09IC0xICYmIGVycm5vID09IEVQSVBFKSB7CisJCQkJCWVycm9yID0gY2xvc2Uoc2spOworCQkJCQlpZiAoZXJyb3IgIT0gMCkgeworCQkJCQkJZnByaW50ZihzdGRlcnIsICJjbG9zZSBmYWlsZWQgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJCQlleGl0KDEpOworCQkJCQl9CisJCQkJCSpza3AgPSBzayA9IGJ1aWxkX2VuZHBvaW50KGFyZ3YwLCBsb2NhbF9wb3J0KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoZXJyb3IgIT0gbXNnbGVuKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlczogZXJyb3I6ICVzLlxuIiwKKwkJCQkJYXJndjAsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJaWYgKG5vbmJsb2NraW5nICYmIEVBR0FJTiA9PSBlcnJubykgeworCQkJCQlpZiAoaW50ZXJhY3RpdmVfbW9kZSkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWV4aXQoMSk7CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlIChlcnJvciAhPSBtc2dsZW4pOworCisJCS8qIElmIHRoaXMgaXMgdGhlIGZpcnN0IG1lc3NhZ2Ugc2VudCBvdmVyIGEgVURQLXN0eWxlIHNvY2tldCwKKwkJICogZ2V0IHRoZSBhc3NvY2lkIGZyb20gdGhlIFNDVFBfQVNTT0NfQ0hBTkdFIG5vdGlmaWNhdGlvbi4KKwkJICovCisJCWlmICgoU09DS19TRVFQQUNLRVQgPT0gc29ja2V0X3R5cGUpICYmICgwID09IGFzc29jaWQpKQorCQkJYXNzb2NpZCA9IHRlc3RfcmVjdl9hc3NvY19jaGFuZ2Uoc2spOworCisJCS8qIFZlcmlmeSB0aGVyZSBpcyBubyBhc3NvY2lhdGlvbi4gICovCisJCWlmICgwICE9IHRlc3Rfc2tfZm9yX2Fzc29jKHNrLCBhc3NvY2lkKSkgeworCQkJcHJpbnRmKCJObyBhc3NvY2lhdGlvbiBpcyBwcmVzZW50IG5vdyEhXG4iKTsKKwkJCW5ld19jb25uZWN0aW9uID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChuZXdfY29ubmVjdGlvbikgeworCQkJCWludCByYyA9IHNjdHBfZ2V0cGFkZHJzKHNrLCBhc3NvY2lkLCAmYWRkcnMpOworCQkJCWlmICgwID49IHJjKSB7CisJCQkJCWlmIChyYyA9PSAwKSB7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgInNjdHBfZ2V0cGFkZHJzIGZhaWxlZCwgbm8gcGVlcnMuXG4iKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWZwcmludGYoc3RkZXJyLCAic2N0cF9nZXRwYWRkcnMgZmFpbGVkICVzKCVkKS5cbiIsIHN0cmVycm9yKGVycm5vKSwgZXJybm8pOworCQkJCQl9CisJCQkJCWV4aXQoMSk7CisJCQkJfQorCQkJCXByaW50ZigiTmV3IGNvbm5lY3Rpb24sIHBlZXIgYWRkcmVzc2VzXG4iKTsKKwkJCQlwcmludF9hZGRyX2J1ZihhZGRycywgcmMpOworCQkJCXNjdHBfZnJlZXBhZGRycyhhZGRycyk7CisJCQkJbmV3X2Nvbm5lY3Rpb24gPSAwOworCQkJfQorCQl9CisKKwkJLyogQ2xlYW4gdXAuICAqLworCQlpZiAoaW50ZXJhY3RpdmVfbW9kZSkgeworCQkJZnJlZShpbnRlcl9vdXRidWYpOworCQkJaW50ZXJfb3V0YnVmID0gTlVMTDsKKwkJfQorCX0gLyogd2hpbGUoIWRvbmUpICovCisKKwlyZXR1cm4gZXJyb3I7CisKK30gLyogY29tbWFuZF9zZW5kKCkgKi8KKworLyogTGlzdGVuIG9uIHRoZSBhcnJheSBvZiBzb2NrZXRzLCBwcmludGluZyBvdXQgYW55dGhpbmcgdGhhdCBhcnJpdmVzLiAgKi8KK2ludAorY29tbWFuZF9wb2xsKGNoYXIgKmFyZ3YwKQoreworCWNoYXIgaW5jbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKF9zY3RwX2Ntc2dfZGF0YV90KSldOworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJc3RydWN0IG1zZ2hkciBpbm1lc3NhZ2U7CisJaW50IGRvbmUgPSAwOworCWludCBlcnJvciA9IDA7CisJaW50IG1heF9mZCwgaSwgcmV0OworCWludCBzaXplOworCWZkX3NldCAqaWJpdHNwID0gTlVMTDsKKwlmZF9zZXQgKm9iaXRzcCA9IE5VTEw7CisJZmRfc2V0ICp4Yml0c3AgPSBOVUxMOworCisJc3RydWN0IG1zZ2hkciBvdXRtc2c7CisJc3RydWN0IGhvc3RlbnQgKmhzdDsKKwlpbnQgbXNnbGVuOworCWludCB0ZW1wX2ZkLCB0ZW1wX3NldDsKKworCisKKwkvKiBJZiBhIHJlbW90ZSBob3N0IGlzIHNwZWNpZmllZCwgaW5pdGlhbGl6ZSB0aGUgZGVzdGluYXRpb24uICovCisJaWYgKHJlbW90ZV9ob3N0KSB7CisJCS8qIFNldCB1cCB0aGUgZGVzdGluYXRpb24uICAqLworCQloc3QgPSBnZXRob3N0YnluYW1lKHJlbW90ZV9ob3N0KTsKKwkJaWYgKGhzdCA9PSBOVUxMKSB7CisJCQloc3QgPSBnZXRob3N0YnluYW1lMihyZW1vdGVfaG9zdCwgQUZfSU5FVDYpOworCQl9CisKKwkJaWYgKGhzdCA9PSBOVUxMIHx8IGhzdC0+aF9sZW5ndGggPCAxKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBiYWQgaG9zdG5hbWU6ICVzXG4iLAorCQkJCWFyZ3YwLCByZW1vdGVfaG9zdCk7CisJCQlleGl0KDEpOworCQl9CisKKwkJcmFfZmFtaWx5ID0gaHN0LT5oX2FkZHJ0eXBlOworCQlzd2l0Y2ggKHJhX2ZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCQlyYV9sZW4gPSBzaXplb2YocmVtb3RlX2FkZHIudjQpOworCQkJcmFfcmF3ID0gJnJlbW90ZV9hZGRyLnY0LnNpbl9hZGRyOworCQkJcmVtb3RlX2FkZHIudjQuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVfcG9ydCk7CisJCQlyZW1vdGVfYWRkci52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCWJyZWFrOworCQljYXNlIEFGX0lORVQ2OgorCQkJcmFfbGVuID0gc2l6ZW9mKHJlbW90ZV9hZGRyLnY2KTsKKwkJCXJhX3JhdyA9ICZyZW1vdGVfYWRkci52Ni5zaW42X2FkZHI7CisJCQlyZW1vdGVfYWRkci52Ni5zaW42X3BvcnQgPSBodG9ucyhyZW1vdGVfcG9ydCk7CisJCQlyZW1vdGVfYWRkci52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJcmVtb3RlX2FkZHIudjYuc2luNl9zY29wZV9pZCA9IGlmX2luZGV4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgYWRkcmVzcyB0eXBlLlxuIik7CisJCQlleGl0KDEpOworCQkJYnJlYWs7CisJCX0KKwkJbWVtY3B5KHJhX3JhdywgaHN0LT5oX2FkZHJfbGlzdFswXSwgaHN0LT5oX2xlbmd0aCk7CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBzdHJ1Y3Qgd2UgdXNlIHRvIHBhc3MgbWVzc2FnZXMgdG8KKwkgCSAqIHRoZSByZW1vdGUgc29ja2V0LgorCSAJICovCisJCW91dG1zZy5tc2dfaW92ID0gJmlvdjsKKwkJb3V0bXNnLm1zZ19pb3ZsZW4gPSAxOworCQlvdXRtc2cubXNnX2NvbnRyb2wgPSBOVUxMOworCQlvdXRtc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCQlvdXRtc2cubXNnX25hbWUgPSAmcmVtb3RlX2FkZHI7CisJCW91dG1zZy5tc2dfbmFtZWxlbiA9IHJhX2xlbjsKKwkJb3V0bXNnLm1zZ19mbGFncyA9IDA7CisJfQorCisKKwltYXhfZmQgPSAtMTsKKworCS8qIFNldCBhbGwgb2YgdGhlIHNvY2tldHMgdG8gYmUgcmVhZHkgZm9yIGxpc3RlbmluZy4gKi8KKwlpZiAodXNlX3BvbGwpIHsKKwkJZm9yIChpID0gMDsgaSA8IHBvbGxfc2tuOyBpKyspIHsKKwkJCWVycm9yID0gbGlzdGVuKHBvbGxfZmRzW2ldLmZkLCAxKTsKKwkJCWlmIChlcnJvciAhPSAwKSB7CisJCQkJcHJpbnRmKCIlczogTGlzdGVuIGZhaWxlZCBvbiBzb2NrZXQgbnVtYmVyICIsCisJCQkJCWFyZ3YwKTsKKwkJCQlwcmludGYoIiVkOiAlcy5cbiIsIGksIHN0cmVycm9yKGVycm5vKSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJfQorCQlwcmludGYoIiVzIGxpc3RlbmluZy4uLlxuIiwgYXJndjApOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBwb2xsX3NrbjsgaSsrKSB7CisJCQllcnJvciA9IGxpc3Rlbihwb2xsX3Nrc1tpXSwgMSk7CisJCQlpZiAoZXJyb3IgIT0gMCkgeworCQkJCXByaW50ZigiJXM6IExpc3RlbiBmYWlsZWQgb24gc29ja2V0IG51bWJlciAiLAorCQkJCQlhcmd2MCk7CisJCQkJcHJpbnRmKCIlZDogJXMuXG4iLCBpLCBzdHJlcnJvcihlcnJubykpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlpZiAocG9sbF9za3NbaV0gPiBtYXhfZmQpIHsKKwkJCQltYXhfZmQgPSBwb2xsX3Nrc1tpXTsKKwkJCX0KKwkJfQorCQlwcmludGYoIiVzIGxpc3RlbmluZy4uLlxuIiwgYXJndjApOworCisJCXNpemUgPSBob3dtYW55KG1heF9mZCArIDEsIE5GREJJVFMpICogc2l6ZW9mKGZkX21hc2spOworCQlpZiAoKGliaXRzcCA9IChmZF9zZXQgKiltYWxsb2Moc2l6ZSkpID09IE5VTEwpIHsKKwkJCXByaW50ZigiJXM6IENhbid0IGFsbG9jYXRlIG1lbW9yeS5cbiIsIGFyZ3YwKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJaWYgKChvYml0c3AgPSAoZmRfc2V0ICopbWFsbG9jKHNpemUpKSA9PSBOVUxMKSB7CisJCQlwcmludGYoIiVzOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkuXG4iLCBhcmd2MCk7CisJCQlleGl0KDEpOworCQl9CisJCWlmICgoeGJpdHNwID0gKGZkX3NldCAqKW1hbGxvYyhzaXplKSkgPT0gTlVMTCkgeworCQkJcHJpbnRmKCIlczogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5LlxuIiwgYXJndjApOworCQkJZXhpdCgxKTsKKwkJfQorCQltZW1zZXQoaWJpdHNwLCAwLCBzaXplKTsKKwkJbWVtc2V0KG9iaXRzcCwgMCwgc2l6ZSk7CisJCW1lbXNldCh4Yml0c3AsIDAsIHNpemUpOworCX0KKworCisJLyogSW5pdGlhbGl6ZSBpbm1lc3NhZ2Ugd2l0aCBlbm91Z2ggc3BhY2UgZm9yIERBVEEuLi4gKi8KKwltZW1zZXQoJmlubWVzc2FnZSwgMCwgc2l6ZW9mKGlubWVzc2FnZSkpOworCWlmICgoaW92Lmlvdl9iYXNlID0gbWFsbG9jKFJFQUxMWV9CSUcpKSA9PSBOVUxMKSB7CisJCXByaW50ZigiJXM6IENhbid0IGFsbG9jYXRlIG1lbW9yeS5cbiIsIGFyZ3YwKTsKKwkJZXhpdCgxKTsKKwl9CisJaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworCWlubWVzc2FnZS5tc2dfaW92ID0gJmlvdjsKKwlpbm1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisJLyogb3IgYSBjb250cm9sIG1lc3NhZ2UuICAqLworCWlubWVzc2FnZS5tc2dfY29udHJvbCA9IGluY21zZzsKKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKworCisJZG9uZSA9IDA7CisJLyogU2V0IHRoZSBkZWZhdWx0IHNlbmQgbWVzc2FnZSBzaXplLiAgKi8KKwlpZiAoIXBvbGxfc25kX3NpemUpIHsKKwkJcG9sbF9zbmRfc2l6ZSA9IFBPTExfU05EX1NJWkU7CisJfQorCisJd2hpbGUgKCFkb25lKSB7CisKKwkJaWYgKHVzZV9wb2xsKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgcG9sbF9za247IGkrKykgeworCQkJCXBvbGxfZmRzW2ldLmV2ZW50cyA9IFBPTExJTjsKKwkJCX0KKwkJCWlmIChyZW1vdGVfaG9zdCkgeworCQkJCS8qIFBvbGwgb3V0cHV0IG9uIHRoZSBmaXJzdCBzb2NrZXQuICAqLworCQkJCXBvbGxfZmRzWzBdLmV2ZW50cyB8PSBQT0xMT1VUOworCQkJfQorCisJCQlpZiAoKHJldCA9IHBvbGwocG9sbF9mZHMsIHBvbGxfc2tuLCAtMSkpKSB7CisJCQkJaWYgKHJldCA9PSAtMSkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgcG9sbF9za247IGkrKykgeworCQkJCUZEX1NFVChwb2xsX3Nrc1tpXSwgaWJpdHNwKTsKKwkJCQlGRF9TRVQocG9sbF9za3NbaV0sIHhiaXRzcCk7CisJCQl9CisJCQlpZiAocmVtb3RlX2hvc3QpIHsKKwkJCQkvKiBPbmx5IHNlbGVjdCBvdXRwdXQgb24gdGhlIGZpcnN0IHNvY2tldC4gICovCisJCQkJRkRfU0VUKHBvbGxfc2tzWzBdLCBvYml0c3ApOworCQkJfQorCisKKwkJCWlmICgocmV0ID0gc2VsZWN0KG1heF9mZCArIDEsIGliaXRzcCwgb2JpdHNwLCB4Yml0c3AsCisJCQkJKHN0cnVjdCB0aW1ldmFsICopMCkpIDwgMCkgeworCQkJCWlmIChyZXQgPT0gLTEpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCX0KKworCQlpZiAocmVtb3RlX2hvc3QpIHsKKwkJCWlmICh1c2VfcG9sbCkgeworCQkJCXRlbXBfc2V0ID0gcG9sbF9mZHNbMF0ucmV2ZW50cyAmIFBPTExPVVQ7CisJCQkJdGVtcF9mZCA9IHBvbGxfZmRzWzBdLmZkOworCQkJfSBlbHNlIHsKKwkJCQl0ZW1wX3NldCA9IEZEX0lTU0VUKHBvbGxfc2tzWzBdLCBvYml0c3ApOworCQkJCXRlbXBfZmQgPSBwb2xsX3Nrc1swXTsKKwkJCX0KKworCQkJaWYgKHRlbXBfc2V0KSB7CisJCQkJaW50ZXJfb3V0YnVmID0gZ2VuX21lc3NhZ2UocG9sbF9zbmRfc2l6ZSk7CisJCQkJaWYgKCFpbnRlcl9vdXRidWYpIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJDYW5ub3QgYWxsb2NhdGUgb3V0IG1lc3NhZ2UuXG4iKTsKKwkJCQkJZXhpdCgxKTsKKwkJCQl9CisJCQkJaW92Lmlvdl9iYXNlID0gaW50ZXJfb3V0YnVmOworCQkJCW1zZ2xlbiA9IHBvbGxfc25kX3NpemU7CisJCQkJaW92Lmlvdl9sZW4gPSBtc2dsZW47CisKKwkJCQllcnJvciA9IHNlbmRtc2codGVtcF9mZCwgJm91dG1zZywgMCk7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJzZW50IGEgbWVzc2FnZSwgbXNnbGVuID0gJWRcbiIsCisJCQkJCW1zZ2xlbik7CisKKwkJCQlpZiAoZXJyb3IgIT0gbXNnbGVuKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yOiAlcy5cbiIsCisJCQkJCQlhcmd2MCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJaWYgKCghbm9uYmxvY2tpbmcpIHx8CisJCQkJCSAgICAoRUFHQUlOICE9IGVycm5vKSkgeworCQkJCQkJZXhpdCgxKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIENsZWFuIHVwLiAgKi8KKwkJCQlmcmVlKGludGVyX291dGJ1Zik7CisJCQkJaW50ZXJfb3V0YnVmID0gTlVMTDsKKwkJCX0KKworCQl9IC8qIHdoaWxlKCFkb25lKSAqLworCisJCWZvciAoaSA9IDA7ICFkb25lICYmIChpIDwgcG9sbF9za24pOyBpKyspIHsKKwkJCWlmICh1c2VfcG9sbCkgeworCQkJCXRlbXBfc2V0ID0gcG9sbF9mZHNbaV0ucmV2ZW50cyAmIFBPTExJTjsKKwkJCQl0ZW1wX2ZkID0gcG9sbF9mZHNbaV0uZmQ7CisJCQl9IGVsc2UgeworCQkJCXRlbXBfc2V0ID0gRkRfSVNTRVQocG9sbF9za3NbaV0sIGliaXRzcCk7CisJCQkJdGVtcF9mZCA9IHBvbGxfc2tzW2ldOworCQkJfQorCQkJaWYgKHRlbXBfc2V0KSB7CisJCQkJZXJyb3IgPSByZWN2bXNnKHRlbXBfZmQsICZpbm1lc3NhZ2UsCisJCQkJCU1TR19XQUlUQUxMKTsKKwkJCQlpZiAoZXJyb3IgPCAwKSB7CisJCQkJCWlmICgoRUFHQUlOID09IGVycm5vKSkgeworCQkJCQkJZXJyb3IgPSAwOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJCQkiJXM6IGVycm9yOiAlcy5cbiIsCisJCQkJCQkJYXJndjAsCisJCQkJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCQkJCWV4aXQoMSk7CisJCQkJCX0KKwkJCQl9CisJCQkJdGVzdF9wcmludF9tZXNzYWdlKHRlbXBfZmQsICZpbm1lc3NhZ2UsIGVycm9yKTsKKwkJCQlpbm1lc3NhZ2UubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisJCQkJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJCQkJaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworCQkJfQorCisJCQkvKiBVcGRhdGUgdGhlIGFzc29jaWQgd2hlbiBhIG5vdGlmaWNhdGlvbiBpcyByZWNlaXZlZAorCQkJICogb24gYSBVRFAtc3R5bGUgc29ja2V0LgorCQkJICovCisJCQlpZiAoaW5tZXNzYWdlLm1zZ19mbGFncyAmIE1TR19OT1RJRklDQVRJT04pCisJCQkJYXNzb2NpZCA9IHRlc3RfdmVyaWZ5X2Fzc29jX2NoYW5nZSgmaW5tZXNzYWdlKTsKKworCQkJLyogVmVyaWZ5IHRoZXJlIGlzIG5vIGFzc29jaWF0aW9uLiAqLworCQkJaWYgKDAgIT0gdGVzdF9za19mb3JfYXNzb2MocG9sbF9za3NbaV0sIGFzc29jaWQpKSB7CisJCQkJcHJpbnRmKCJObyBhc3NvY2lhdGlvbiBpcyBwcmVzZW50IGluIHNrICIKKwkJCQkgICAgICAgIk5vLiVkIG5vdyEhXG4iLGkpOworCQkJfQorCQl9CisKKwl9CisKKwlpZiAoIXVzZV9wb2xsKSB7CisJCWZyZWUoaWJpdHNwKTsKKwkJZnJlZShvYml0c3ApOworCQlmcmVlKHhiaXRzcCk7CisJfQorCisJcmV0dXJuIGVycm9yOworCit9IC8qIGNvbW1hbmRfcG9sbCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogM3JkIExldmVsIEFic3RyYWN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZQUyhhcmcpIGZwcmludGYoc3RkZXJyLCBhcmcpCisKK3ZvaWQKK3VzYWdlKGNoYXIgKmFyZ3YwKQoreworCS8qCisJICogVGhlIGJpbmR4IG9wdGlvbnMsIC0tYmluZHgtYWRkIGFuZCAtLWJpbmR4LXJlbSwgYXJlIGFkZGVkIHRvCisJICoKKwkgKiAxLiBwcm92aWRlIGZpcnN0IHRlc3RjYXNlcyBmb3IgdGhlIG5ldyBiaW5keCBzeXN0ZW0gY2FsbAorCSAqCisJICogMi4gY29udGludWUgdG8gZ3JvdyBzY3RwX2Rhcm4gd2l0aCBtb3JlIGZ1bmN0aW9ucyBhbmQKKwkgKiBmZWF0dXJlcyBzbyBpdCB3aWxsIGJlIGVxdWl2YWxlbnQgdG8gdGhlICJzb2NrIiB0b29sIGZvcgorCSAqIFRDUCBhcyBmb3IgU0NUUC4KKwkgKgorCSAqIEZJWE1FIC0KKwkgKgorCSAqIEl0IGlzIG5vdCB2ZXJ5IGVmZmVjdGl2ZSB0byB1c2UgdGhlc2UgdHdvIG9wdGlvbnMgaW4gdGhlCisJICogY3VycmVudCBjb21tYW5kIGxpbmUgbW9kZSBvZiBzY3RwX2Rhcm4uIEZvciBleGFtcGxlLCB0aGUKKwkgKiAtLWJpbmR4LXJlbSBvcHRpb24gY2FuIG9ubHkgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQorCSAqIC0tYmluZHgtYWRkIHNpbXBseSB0byB0ZXN0IHRoZSBmdW5jdGlvbiBpbiB0aGUga2VybmVsCisJICogcGF0aC4gSWRlYWxseSwgYmluZHggbmVlZHMgdG8gYmUgdGVzdGVkIGJ5IGEgdG9vbCB3aGljaAorCSAqIHByb3ZpZGVzIGFuIGludGVyYWN0aXZlIG1vZGUgZm9yIHVzZXJzIHRvIGNoYW5nZSBwYXJhbWV0ZXJzCisJICogYW5kIGNvbmZpZ3VyYXRpb24gZHluYW1pY2FsbHkgd2l0aCBleGlzdGluZyBlbmRwb2ludHMgYW5kCisJICogYXNzb2NpYXRpb25zLgorCSAqLworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIC1IIDxsb2NhbGhvc3Q+IC1QIDxsb2NhbHBvcnQ+ICIKKwkJIlstaCA8cmVtb3RlaG9zdD5dIFstcCA8cmVtb3RlcG9ydD5dIC1sfHNcbiIKKwkJIiAtSCwgLS1sb2NhbFx0XHRzcGVjaWZ5IG9uZSBvZiB0aGUgbG9jYWwgYWRkcmVzc2VzLFxuIgorCQkiIC1QLCAtLWxvY2FsLXBvcnRcdHNwZWNpZnkgdGhlIHBvcnQgbnVtYmVyIGZvciBsb2NhbCBhZGRyZXNzZXMsXG4iCisJCSIgLWgsIC0tcmVtb3RlXHRcdHNwZWNpZnkgdGhlIHBlZXIgYWRkcmVzcyxcbiIKKwkJIiAtcCwgLS1yZW1vdGUtcG9ydFx0c3BlY2lmeSB0aGUgcG9ydCBudW1iZXIgZm9yIHRoZSBwZWVyIGFkZHJlc3MsXG4iCisJCSIgLWwsIC0tbGlzdGVuXHRcdHByaW50IG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIHBlZXIsXG4iCisJCSIgLXMsIC0tc2VuZFx0XHRzZW5kIG1lc3NhZ2VzIHRvIHRoZSBwZWVyLFxuIgorCQkiIC1CLCAtLWJpbmR4LWFkZCIKKwkJIlx0YWRkIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyhlcykgYXMgYWRkaXRpb25hbCBiaW5kXG4iCisJCSJcdFx0XHRhZGRyZXNzZXMgdG8gdGhlIGxvY2FsIHNvY2tldC4gTXVsdGlwbGUgYWRkcmVzc2VzIGNhblxuIgorCQkiXHRcdFx0YmUgc3BlY2lmaWVkIGJ5IHVzaW5nIHRoaXMgYXJndW1lbnQgbXVsdGlwbGUgdGltZXMuXG4iCisJCSJcdFx0XHRGb3IgZXhhbXBsZSwgJy1CIDEwLjAuMC4xIC1CIDIwLjAuMC4yJy5cbiIKKwkJIiAtYiwgLS1iaW5keC1yZW0iCisJCSJcdHJlbW92ZSB0aGUgc3BlY2lmaWVkIGFkZHJlc3MoZXMpIGZyb20gdGhlIGJpbmRcbiIKKwkJIlx0XHRcdGFkZHJlc3NlcyBvZiB0aGUgbG9jYWwgc29ja2V0LiBNdWx0aXBsZSBhZGRyZXNzZXMgY2FuXG4iCisJCSJcdFx0XHRiZSBzcGVjaWZpZWQgYnkgdXNpbmcgdGhpcyBhcmd1bWVudCBtdWx0aXBsZSB0aW1lcy5cbiIKKwkJIlx0XHRcdEZvciBleGFtcGxlLCAnLWIgMTAuMC4wLjEgLWIgMjAuMC4wLjInLlxuIgorCQkiIC1jLCAtLWNvbm5lY3R4IgorCQkiXHRcdHVzZSB0aGUgc3BlY2lmaWVkIGFkZHJlc3MoZXMpIGZvciBjb25uZWN0aW9uIHRvIHRoZVxuIgorCQkiXHRcdFx0cGVlciBzb2NrZXQuIE11bHRpcGxlIGFkZHJlc3NlcyBjYW4gYmUgc3BlY2lmaWVkIGJ5XG4iCisJCSJcdFx0XHR1c2luZyB0aGlzIGFyZ3VtZW50IG11bHRpcGxlIHRpbWVzLlxuIgorCQkiXHRcdFx0Rm9yIGV4YW1wbGUsICctYyAxMC4wLjAuMSAtYyAyMC4wLjAuMicuXG4iCisJCSJcdFx0XHRUaGlzIG9wdGlvbiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgLWggb3B0aW9uLlxuIgorCQkiIC1JXHRcdFx0dXNlIHRoZSBpbnRlcmFjdGl2ZSBtb2RlLlxuIgorCQkiIC1pXHRcdFx0c2V0dXAgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW5kcG9pbnRzIGJ5IHVzaW5nIHRoZVxuIgorCQkiXHRcdFx0c3BlY2lmaWVkIGxvY2FsIGhvc3QgKC1IKSBhbmQgbG9jYWwgcG9ydCAoLVApLiBUaGUgcG9ydFxuIgorICAgICAgICAJIlx0XHRcdG51bWJlciB3aWxsIGJlIGluY3JlbWVudGVkIGJ5IG9uZSBmb3IgZWFjaCBhZGRpdGlvbmFsXG4iCisgICAgICAgIAkiXHRcdFx0ZW5kcG9pbnQuICBBbGwgb2YgdGhlc2UgZW5kcG9pbnRzIHdpbGwgYmUgbGlzdGVuaW5nLlxuIgorCQkiXHRcdFx0SWYgYSByZW1vdGUgaG9zdCAoLWgpIGFuZCBhIHJlbW90ZSBwb3J0IGFyZSBhbHNvXG4iCisJCSJcdFx0XHRzcGVjaWZpZWQsIHRoZSBmaXJzdCBlbmRwb2ludCB3aWxsIHN0YXJ0IHNlbmRpbmcgZml4ZWRcbiIKKwkJIlx0XHRcdHNpemVkIG1lc3NhZ2VzIHRvIHRoZSByZW1vdGUgaG9zdC5cbiIKKwkJIiAtbVx0XHRcdHNwZWNpZnkgdGhlIHNvY2tvcHQgc25kYnVmL3JjdmJ1ZiBzaXplLlxuIgorCQkiIC1uXHRcdFx0c2V0IHRoZSBzb2NrZXQocykgdG8gYmUgaW4gdGhlIG5vbi1ibG9ja2luZyBtb2RlLlxuIgorCQkiXHRcdFx0Y29sbGVjdCBtZXNzYWdlcyBmcm9tIHN0ZGluIGFuZCBkZWxpdmVyIHRoZW0gdG8gdGhlXG4iCisJCSJcdFx0XHRwZWVyLFxuIgorCQkiLS11c2UtcG9sbFx0XHR1c2Ugc3lzdGVtIGNhbGwgcG9sbCgpIGZvciBwb2xsaW5nIGFtb25nIHRoZVxuIgorCQkiXHRcdFx0bnVtYmVyIG9mIGVuZHBvaW50cyBzcGVjaWZpZWQgYnkgdGhlIC1pIG9wdGlvbi4gV2l0aG91dFxuIgorCQkiXHRcdFx0dGhpcyBvcHRpb24sIHNlbGVjdCgpIHdvdWxkIGJlIHVzZWQgYXMgZGVmYXVsdC5cbiIKKwkJIiAtdFx0XHRcdHVzZSBTT0NLX1NUUkVBTSB0Y3Atc3R5bGUgc29ja2V0cy5cbiIKKwkJIiAtelx0XHRcdHNwZWNpZnkgdGhlIG1lc3NhZ2Ugc2l6ZSB0byBiZSBzZW50LiAgVGhlIGRlZmF1bHRcbiIKKwkJIlx0XHRcdG1lc3NhZ2Ugc2l6ZSBnZW5lcmF0ZWQgd291bGQgYmUgMTZLLlxuIgorCQkiIC0taW50ZXJmYWNlPVwiaWZuYW1lXCJcdHNlbGVjdCBpbnRlcmZhY2UgZm9yIHNpbjZfc2NvcGVfaWQuXG4iLAorCQlhcmd2MCk7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBjaGVja3MgbWVzc2FnZXMgdG8gc2VlIGlmIHRoZXkgYXJlIG9mIHR5cGUgJ2V2ZW50JworICogYW5kIGlmIHRoZXkgYXJlIHdlbGwtZm9ybWVkLgorICovCitpbnQKK3VzZXJfdGVzdF9jaGVja19tZXNzYWdlKHN0cnVjdCBtc2doZHIgKm1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb250cm9sbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgc2N0cF9jbXNnX3QgZXZlbnQpCit7CisKKworCWlmIChtc2ctPm1zZ19jb250cm9sbGVuICE9IGNvbnRyb2xsZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCQkiR290IGNvbnRyb2wgc3RydWN0dXJlIG9mIGxlbmd0aCAlenUsIG5vdCAlZFxuIiwKKwkJCW1zZy0+bXNnX2NvbnRyb2xsZW4sIGNvbnRyb2xsZW4pOworCQlleGl0KDEpOworCX0KKwlpZiAoY29udHJvbGxlbiA+IDAgJiYgZXZlbnQgIT0gQ01TR19GSVJTVEhEUihtc2cpLT5jbXNnX3R5cGUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJXcm9uZyBraW5kIG9mIGV2ZW50OiAlZCwgbm90ICVkXG4iLAorCQkJQ01TR19GSVJTVEhEUihtc2cpLT5jbXNnX3R5cGUsIGV2ZW50KTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gMTsKKworfSAvKiB1c2VyX3Rlc3RfY2hlY2tfbWVzc2FnZSgpICovCisKKy8qIEFkZCBhbm90aGVyIGFkZHJlc3MgcmVwcmVzZW50ZWQgYXMgdGhlIHN0cmluZyAncGFybScgdG8gdGhlIGxpc3QKKyAqIGFkZHJzLiAgVGhlIGFyZ3VtZW50IGNvdW50IGlzIHRoZSBudW1iZXIgb2YgYWRkcnMgb24gaW5wdXQgYW5kIGlzCisgKiBhZGp1c3RlZCBmb3Igb3V0cHV0LgorICovCitzdHJ1Y3Qgc29ja2FkZHIgKgorYXBwZW5kX2FkZHIoY29uc3QgY2hhciAqcGFybSwgc3RydWN0IHNvY2thZGRyICphZGRycywgaW50ICpyZXRfY291bnQpCit7CisJc3RydWN0IHNvY2thZGRyICpuZXdfYWRkcnMgPSBOVUxMOworCXZvaWQgKmFwdHI7CisJc3RydWN0IHNvY2thZGRyICpzYV9hZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqYjRhcDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpiNmFwOworCXN0cnVjdCBob3N0ZW50ICpoc3Q0ID0gTlVMTDsKKwlzdHJ1Y3QgaG9zdGVudCAqaHN0NiA9IE5VTEw7CisJaW50IGk0ID0gMDsKKwlpbnQgaTYgPSAwOworCWludCBqOworCWludCBvcmlnX2NvdW50ID0gKnJldF9jb3VudDsKKwlpbnQgY291bnQgPSBvcmlnX2NvdW50OworCisKKwlpZiAoIXBhcm0pCisJCXJldHVybiBOVUxMOworCS8qIEdldCB0aGUgZW50cmllcyBmb3IgdGhpcyBob3N0LiAgKi8KKwloc3Q0ID0gZ2V0aG9zdGJ5bmFtZShwYXJtKTsKKwloc3Q2ID0gZ2V0aG9zdGJ5bmFtZTIocGFybSwgQUZfSU5FVDYpOworCisJaWYgKChOVUxMID09IGhzdDQgfHwgaHN0NC0+aF9sZW5ndGggPCAxKQorCSAgICAmJiAoTlVMTCA9PSBoc3Q2IHx8IGhzdDYtPmhfbGVuZ3RoIDwgMSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJiYWQgaG9zdG5hbWU6ICVzXG4iLCBwYXJtKTsKKwkJZ290byBmaW5hbGx5OworCX0KKworCisJLyogRmlndXJlIG91dCB0aGUgbnVtYmVyIG9mIGFkZHJlc3Nlcy4gICovCisJaWYgKE5VTEwgIT0gaHN0NCkgeworCQlmb3IgKGk0ID0gMDsgTlVMTCAhPSBoc3Q0LT5oX2FkZHJfbGlzdFtpNF07ICsraTQpIHsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisJaWYgKE5VTEwgIT0gaHN0NikgeworCQlmb3IgKGk2ID0gMDsgTlVMTCAhPSBoc3Q2LT5oX2FkZHJfbGlzdFtpNl07ICsraTYpIHsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisKKwkvKiBFeHBhbmQgbWVtb3J5IGZvciB0aGUgbmV3IGFkZHJlc3Nlcy4gIEFzc3VtZSBhbGwgdGhlIGFkZHJlc3NlcyAKKwkgKiBhcmUgdjYgYWRkcmVzc2VzLgorCSAqLworCW5ld19hZGRycyA9IChzdHJ1Y3Qgc29ja2FkZHIgKikKKwkJcmVhbGxvYyhhZGRycywgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpICogY291bnQpOworCisJaWYgKE5VTEwgPT0gbmV3X2FkZHJzKSB7CisJCWNvdW50ID0gKnJldF9jb3VudDsKKwkJZ290byBmaW5hbGx5OworCX0KKworCS8qIFNraXAgdGhlIGV4aXN0aW5nIGFkZHJlc3Nlcy4gKi8KKwlhcHRyID0gbmV3X2FkZHJzOyAKKwlmb3IgKGogPSAwOyBqIDwgb3JpZ19jb3VudDsgaisrKSB7CisJCXNhX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopYXB0cjsKKwkJc3dpdGNoKHNhX2FkZHItPnNhX2ZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCQlhcHRyICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJYnJlYWs7CisJCWNhc2UgQUZfSU5FVDY6CisJCQlhcHRyICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY291bnQgPSBvcmlnX2NvdW50OworCQkJZ290byBmaW5hbGx5OworCQl9CisJfQkKKwkJCQkJCisJLyogUHV0IHRoZSBuZXcgYWRkcmVzc2VzIGF3YXkuICAqLworCWlmIChOVUxMICE9IGhzdDQpIHsKKwkJZm9yIChqID0gMDsgaiA8IGk0OyArK2opIHsKKwkJCWI0YXAgPSAoc3RydWN0IHNvY2thZGRyX2luICopYXB0cjsKKwkJCW1lbXNldChiNGFwLCAweDAwLCBzaXplb2YoKmI0YXApKTsKKwkJCWI0YXAtPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJYjRhcC0+c2luX3BvcnQgPSBodG9ucyhsb2NhbF9wb3J0KTsKKwkJCWJjb3B5KGhzdDQtPmhfYWRkcl9saXN0W2pdLCAmYjRhcC0+c2luX2FkZHIsCisJCQkgICAgICBoc3Q0LT5oX2xlbmd0aCk7CisKKwkJCWFwdHIgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCX0gLyogZm9yIChsb29wIHRocm91Z2ggdGhlIG5ldyB2NCBhZGRyZXNzZXMpICovCisJfQorCisJaWYgKE5VTEwgIT0gaHN0NikgeworCQlmb3IgKGogPSAwOyBqIDwgaTY7ICsraikgeworCQkJYjZhcCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYXB0cjsKKwkJCW1lbXNldChiNmFwLCAweDAwLCBzaXplb2YoKmI2YXApKTsKKwkJCWI2YXAtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCQliNmFwLT5zaW42X3BvcnQgPSAgaHRvbnMobG9jYWxfcG9ydCk7CisJCQliNmFwLT5zaW42X3Njb3BlX2lkID0gaWZfaW5kZXg7CisJCQliY29weShoc3Q2LT5oX2FkZHJfbGlzdFtqXSwgJmI2YXAtPnNpbjZfYWRkciwKKwkJCSAgICAgIGhzdDYtPmhfbGVuZ3RoKTsKKworCQkJYXB0ciArPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCX0gLyogZm9yIChsb29wIHRocm91Z2ggdGhlIG5ldyB2NiBhZGRyZXNzZXMpICovCisJfQorCisgZmluYWxseToKKworCSpyZXRfY291bnQgPSBjb3VudDsKKworCXJldHVybiBuZXdfYWRkcnM7CisKK30gLyogYXBwZW5kX2FkZHIoKSAqLworCitzdGF0aWMgaW50CitwYXJzZV9pbnRlcl9jb21tYW5kcyhjaGFyICphcmd2MCwgY2hhciAqaW5wdXQsIGludCBzbmRfb25seSkKK3sKKwlpbnQgaTsKKwljaGFyICpwOworCWludCBsZW47CisJaW50IHNldCA9IDA7CisJaW50IHZhbDsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnRtcF9hZGRycyA9IE5VTEw7CisKKworCXAgPSBpbnB1dDsKKwlpZiAoKnAgPT0gJz8nIHx8ICpwID09ICdcbicpIHsKKwkJcHJpbnRmKCJJbnRlcmFjdGl2ZSBjb21tYW5kczpcbiIpOworCQlwcmludGYoInNuZD08aW50PiAgICAgICAgLSBEbyBhIHNlbmRtc2cgd2l0aCB0aGUgc3BlY2lmaWVkIik7CisJCXByaW50ZigiIGxlbmd0aC5cbiIpOworCQlwcmludGYoInJjdj08aW50PiAgICAgICAgLSBEbyBhIHJlY3Ztc2cuIik7CisJCXByaW50ZigiVGhlIGxlbmd0aCBpcyBpZ25vcmVkIGZvciBub3cuXG4iKTsKKwkJcHJpbnRmKCJiaW5keC1hZGQ9PGFkZHI+IC0gQWRkIGEgbG9jYWwgYWRkcmVzcyIpOworCQlwcmludGYoIiB3aXRoIGJpbmR4LiBcbiIpOworCQlwcmludGYoImJpbmR4LXJlbT08YWRkcj4gLSBSZW1vdmUgYSBsb2NhbCBhZGRyZXNzIik7CisJCXByaW50ZigiIHdpdGggYmluZHguIFxuIik7CisJCXByaW50ZigicmN2YnVmPTxpbnQ+ICAgICAtIEdldC9TZXQgcmVjZWl2ZSBidWZmZXIgc2l6ZVxuIik7CisJCXByaW50Zigic25kYnVmPTxpbnQ+ICAgICAtIEdldC9TZXQgc2VuZCBidWZmZXIgc2l6ZS5cbiIpOworCQlwcmludGYoInByaW1hcnk9PGFkZHI+ICAgLSBHZXQvU2V0IGFzc29jaWF0aW9uJ3MgcHJpbWFyeVxuIik7CisJCXByaW50ZigicGVlcl9wcmltYXJ5PWFkZHItIFNldCBhc3NvY2lhdGlvbidzIHBlZXJfcHJpbWFyeVxuIik7CisJCXByaW50ZigiaGVhcnRiZWF0PTxhZGRyPiAtIFJlcXVlc3QgYSB1c2VyIGluaXRpYXRlZCBoZWFydGJlYXRcbiIpOworCQlwcmludGYoIm1heHNlZz08aW50PiAgICAgLSBHZXQvU2V0IE1heGltdW0gZnJhZ21lbnQgc2l6ZS5cbiIpOworCQlwcmludGYoIm5vZGVsYXk9PDB8MT4gICAgLSBHZXQvU2V0IE5PREVMQVkgb3B0aW9uLlxuIik7CisJCXByaW50Zigic2h1dGRvd24gICAgICAgICAtIFNodXRkb3duIHRoZSBhc3NvY2lhdGlvbi5cbiIpOworCQlwcmludGYoImFib3J0ICAgICAgICAgICAgLSBBYm9ydCB0aGUgYXNzb2NpYXRpb24uXG4iKTsKKwkJcHJpbnRmKCJzdGF0cyAgICAgICAgICAgIC0gUHJpbnQgR0VUX0FTU09DX1NUQVRTIChpZiBhdmFpbGFibGUgaW4ga2VybmVsKS5cbiIpOworCQlwcmludGYoIj8gICAgICAgICAgICAgICAgLSBIZWxwLiBEaXNwbGF5IHRoaXMgbWVzc2FnZS5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFJFQUxMWV9CSUc7IGkrKykgeworCQlpZiAoKCc9JyA9PSAqcCkgfHwKKwkJICAgICgnPycgPT0gKnApIHx8CisJCSAgICAoJ1xuJyA9PSAqcCkpIHsKKwkJCWlmICgnPScgPT0gKnApIHsKKwkJCQlzZXQgPSAxOworCQkJfQorCQkJKnArKyA9ICdcMCc7CisJCQlicmVhazsKKwkJfQorCQlwKys7CisJfQorCWlmIChpID49IFJFQUxMWV9CSUcpIHsKKwkJcHJpbnRmKCJJbnZhbGlkIGlucHV0LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpID0gMDsKKwl3aGlsZSAoTlVMTCAhPSBpbnRlcl9jb21tYW5kc1tpXS5jbWQpIHsKKwkJaWYgKCFzdHJjbXAoaW5wdXQsIGludGVyX2NvbW1hbmRzW2ldLmNtZCkpIHsKKwkJCXN3aXRjaCAoaSkgeworCQkJY2FzZSBJTlRFUl9TTkQ6CisJCQkJaWYgKHNuZF9vbmx5KSB7CisJCQkJCWlmICgqcCA8ICcwJyB8fCAqcCA+ICc5JykgeworCQkJCQkJZ290byBlcnJfaW5wdXQ7CisJCQkJCX0KKwkJCQkJc25kX2Z1bmMocCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZ290byBlcnJfaW5wdXQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBJTlRFUl9SQ1Y6CisJCQkJaWYgKHNuZF9vbmx5KSB7CisJCQkJCWdvdG8gZXJyX2lucHV0OworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgSU5URVJfU05EQlVGOgorCQkJCWlmIChzZXQpIHsKKwkJCQkJaWYgKCpwIDwgJzAnIHx8ICpwID4gJzknKSB7CisJCQkJCQlnb3RvIGVycl9pbnB1dDsKKwkJCQkJfQorCQkJCX0KKwkJCQlsZW4gPSAoc2V0KSA/IGF0b2kocCkgOiAwOworCQkJCXNuZGJ1Zl9mdW5jKGFyZ3YwLCBpbnRlcl9zaywgbGVuLCBzZXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBJTlRFUl9SQ1ZCVUY6CisJCQkJaWYgKHNldCkgeworCQkJCQlpZiAoKnAgPCAnMCcgfHwgKnAgPiAnOScpIHsKKwkJCQkJCWdvdG8gZXJyX2lucHV0OworCQkJCQl9CisJCQkJfQorCQkJCWxlbiA9IChzZXQpID8gYXRvaShwKSA6IDA7CisJCQkJcmN2YnVmX2Z1bmMoYXJndjAsIGludGVyX3NrLCBsZW4sIHNldCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElOVEVSX0JJTkRYX0FERDoKKwkJCQl0bXBfYWRkcnMgPSBnZXRfYmluZHhfYWRkcihwLCAmbGVuKTsKKwkJCQliaW5keF9mdW5jKGFyZ3YwLCBpbnRlcl9zaywgdG1wX2FkZHJzLCBsZW4sCisJCQkJCVNDVFBfQklORFhfQUREX0FERFIsIGxvY2FsX3BvcnQpOworCQkJCWZyZWUodG1wX2FkZHJzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSU5URVJfQklORFhfUkVNOgorCQkJCXRtcF9hZGRycyA9IGdldF9iaW5keF9hZGRyKHAsICZsZW4pOworCQkJCWJpbmR4X2Z1bmMoYXJndjAsIGludGVyX3NrLCB0bXBfYWRkcnMsIGxlbiwKKwkJCQkJU0NUUF9CSU5EWF9SRU1fQUREUiwgbG9jYWxfcG9ydCk7CisJCQkJZnJlZSh0bXBfYWRkcnMpOworCQkJCWJyZWFrOworCQkJY2FzZSBJTlRFUl9TRVRfUFJJTToKKwkJCQlwcmltYXJ5X2Z1bmMoYXJndjAsIGludGVyX3NrLCBwLCBzZXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBJTlRFUl9TRVRfUEVFUl9QUklNOgorCQkJCXBlZXJfcHJpbWFyeV9mdW5jKGFyZ3YwLCBpbnRlcl9zaywgcCwgc2V0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSU5URVJfSEVBUlRCRUFUOgorCQkJCXNwcF9oYl9kZW1hbmRfZnVuYyhhcmd2MCwgaW50ZXJfc2ssIHAsIHNldCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElOVEVSX1NIVVRET1dOOgorCQkJCXNodXRkb3duX2Z1bmMoYXJndjAsICZpbnRlcl9zaywgU0hVVERPV05fU0hVVERPV04pOworCQkJCWJyZWFrOworCQkJY2FzZSBJTlRFUl9BQk9SVDoKKwkJCQlzaHV0ZG93bl9mdW5jKGFyZ3YwLCAmaW50ZXJfc2ssIFNIVVRET1dOX0FCT1JUKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSU5URVJfTk9ERUxBWToKKwkJCQlpZiAoc2V0KSB7CisJCQkJCWlmICgqcCA8ICcwJyB8fCAqcCA+ICc5JykgeworCQkJCQkJZ290byBlcnJfaW5wdXQ7CisJCQkJCX0KKwkJCQl9CisJCQkJdmFsID0gKHNldCkgPyBhdG9pKHApIDogMDsKKwkJCQlub2RlbGF5X2Z1bmMoYXJndjAsIGludGVyX3NrLCB2YWwsIHNldCk7CisJCQkJYnJlYWs7CisJCQljYXNlIElOVEVSX01BWFNFRzoKKwkJCQlpZiAoc2V0KSB7CisJCQkJCWlmICgqcCA8ICcwJyB8fCAqcCA+ICc5JykgeworCQkJCQkJZ290byBlcnJfaW5wdXQ7CisJCQkJCX0KKwkJCQl9CisJCQkJdmFsID0gKHNldCkgPyBhdG9pKHApIDogMDsKKwkJCQltYXhzZWdfZnVuYyhhcmd2MCwgaW50ZXJfc2ssIHZhbCwgc2V0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSU5URVJfR0VUX1NUQVRTOgorCQkJCWdldF9hc3NvY3N0YXRzX2Z1bmMoaW50ZXJfc2ssIGFzc29jaWQpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGVycl9pbnB1dDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcmV0dXJuIGk7CisJCX0KKwkJaSsrOworCX0KKworZXJyX2lucHV0OgorCXByaW50ZigiSW52YWxpZCBpbnB1dC5cbiIpOworCXJldHVybiAtMTsKKworfSAvKiBwYXJzZV9pbnRlcl9jb21tYW5kcygpICovCisKK3N0YXRpYyBjaGFyICoKK2dlbl9tZXNzYWdlKGludCBsZW4pCit7CisKKwljaGFyICpidWY7CisJY2hhciAqcDsKKwlpbnQgaTsKKworCWJ1ZiA9IG1hbGxvYyhsZW4pOworCisJaWYgKE5VTEwgIT0gYnVmKSB7CisJCWZvciAoaSA9IDAsIHAgPSBidWY7IGkgPCBsZW47IGkrKywgcCsrKSB7CisJCQlpZiAoZ2VuX2RhdGEgPiBHRU5fREFUQV9MQVNUKSB7CisJCQkJZ2VuX2RhdGEgPSBHRU5fREFUQV9GSVJTVDsKKwkJCX0KKwkJCSpwID0gZ2VuX2RhdGErKzsKKwkJfQorCX0KKworCXJldHVybihidWYpOworCit9IC8qIGdlbl9tZXNzYWdlKCkgKi8KKworc3RhdGljIHZvaWQKK3NuZF9mdW5jKGNoYXIgKmlucHV0KQoreworCisJaW50IGxlbjsKKworCWxlbiA9IGF0b2koaW5wdXQpOworCWlmICghKGludGVyX291dGJ1ZiA9IGdlbl9tZXNzYWdlKGxlbikpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGFsbG9jYXRlIG91dCBtZXNzYWdlLlxuIik7CisJCWV4aXQoMSk7CisJfQorCWludGVyX291dGxlbiA9IGxlbjsKKworfSAvKiBzbmRfZnVuYygpICovCisKK3N0YXRpYyB2b2lkCitzbmRidWZfZnVuYyhjaGFyICphcmd2MCwgaW50IHNrLCBpbnQgbGVuLCBpbnQgc2V0KQoreworCWludCBlcnJvcjsKKwlzb2NrbGVuX3Qgb3B0bGVuOworCisJaWYgKHNldCkgeworCQllcnJvciA9IHNldHNvY2tvcHQoc2ssIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwKKwkJCShjaGFyICopJmxlbiwgc2l6ZW9mKGxlbikpOworCX0gZWxzZSB7CisJCW9wdGxlbiA9IHNpemVvZihsZW4pOworCQllcnJvciA9IGdldHNvY2tvcHQoc2ssIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwKKwkJCShjaGFyICopJmxlbiwgJm9wdGxlbik7CisJfQorCWlmIChlcnJvciAhPSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IEVycm9yIHNldHRpbmcvZ2V0dGluZyBzbmRidWY6ICVzLlxuIiwKKwkJCWFyZ3YwLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KDEpOworCX0KKworCWlmICghc2V0KSB7CisJCXByaW50Zigic25kYnVmIGlzICVkLlxuIiwgbGVuKTsKKwl9CisKK30gLyogc25kYnVmX2Z1bmMoKSAqLworCitzdGF0aWMgdm9pZAorcmN2YnVmX2Z1bmMoY2hhciAqYXJndjAsIGludCBzaywgaW50IGxlbiwgaW50IHNldCkKK3sKKwlpbnQgZXJyb3I7CisJc29ja2xlbl90IG9wdGxlbjsKKworCWlmIChzZXQpIHsKKwkJZXJyb3IgPSBzZXRzb2Nrb3B0KHNrLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsCisJCQkoY2hhciAqKSZsZW4sIHNpemVvZihsZW4pKTsKKwl9IGVsc2UgeworCQlvcHRsZW4gPSBzaXplb2YobGVuKTsKKwkJZXJyb3IgPSBnZXRzb2Nrb3B0KHNrLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsCisJCQkoY2hhciAqKSZsZW4sICZvcHRsZW4pOworCX0KKwlpZiAoZXJyb3IgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBFcnJvciBzZXR0aW5nL2dldHRpbmcgcmN2YnVmOiAlcy5cbiIsCisJCQlhcmd2MCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoIXNldCkgeworCQlwcmludGYoInJjdmJ1ZiBpcyAlZC5cbiIsIGxlbik7CisJfQorCit9IC8qIHJjdmJ1Zl9mdW5jKCkgKi8KKworCitzdGF0aWMgc3RydWN0IHNvY2thZGRyICoKK2dldF9iaW5keF9hZGRyKGNoYXIgKmluLCBpbnQgKmNvdW50KQoreworCisJc3RydWN0IHNvY2thZGRyICp0bXBfYWRkcnMgPSBOVUxMOworCWNoYXIgKnAgPSBpbjsKKworCS8qIFNldCB0aGUgYnVmZmVyIGZvciBhZGRyZXNzIHBhcnNpbmcuICAqLworCXdoaWxlICgnXG4nICE9ICpwKSB7CisJCXArKzsKKwl9CisJKnAgPSAnXDAnOworCisJKmNvdW50ID0gMDsKKworCXRtcF9hZGRycyA9IGFwcGVuZF9hZGRyKGluLCB0bXBfYWRkcnMsIGNvdW50KTsKKwlpZiAoTlVMTCA9PSB0bXBfYWRkcnMpIHsKKwkJLyogV2UgaGF2ZSBubyBtZW1vcnksIHNvIGtlZXAgZnByaW50ZigpCisJCSAqIGZyb20gdHJ5aW5nIHRvIGFsbG9jYXRlIG1vcmUuCisJCSAqLworCQlmcHJpbnRmKHN0ZGVyciwgIk5vIG1lbW9yeSB0byBhZGQgIik7CisJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGluKTsKKwkJZXhpdCgyKTsKKwl9CisJcmV0dXJuIHRtcF9hZGRyczsKKworfSAvKiBnZXRfYmluZHhfYWRkcigpICovCisKK3N0YXRpYyBpbnQKK2JpbmR4X2Z1bmMoY2hhciAqYXJndjAsIGludCBzaywgc3RydWN0IHNvY2thZGRyICphZGRycywgaW50IGNvdW50LCBpbnQgZmxhZywgaW50IHBvcnRudW0pCit7CisKKwlpbnQgZXJyb3I7CisJaW50IGk7CisJc3RydWN0IHNvY2thZGRyICpzYV9hZGRyOworCXZvaWQgKmFwdHI7CisKKworCWlmICgwID09IHBvcnRudW0pIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogQSBub24tMCBsb2NhbCBwb3J0IG51bWJlciBpcyAiLCBhcmd2MCk7CisJCWZwcmludGYoc3RkZXJyLCAicmVxdWlyZWQgZm9yIGJpbmR4IHRvIHdvcmshXG4iKTsKKwkJcmV0dXJuIC0xIDsKKwl9CisKKwkvKiBTZXQgdGhlIHBvcnQgaW4gZXZlcnkgYWRkcmVzcy4gICovCisJYXB0ciA9IGFkZHJzOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXNhX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopYXB0cjsKKworCQlzd2l0Y2goc2FfYWRkci0+c2FfZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCSgoc3RydWN0IHNvY2thZGRyX2luICopc2FfYWRkciktPnNpbl9wb3J0ID0KKwkJCQlodG9ucyhwb3J0bnVtKTsKKwkJCWFwdHIgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCQlicmVhazsKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCSgoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhX2FkZHIpLT5zaW42X3BvcnQgPQorCQkJCWh0b25zKHBvcnRudW0pOworCQkJYXB0ciArPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBhZGRyZXNzIGZhbWlseVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwllcnJvciA9IHNjdHBfYmluZHgoc2ssIGFkZHJzLCBjb3VudCwgZmxhZyk7CisKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlpZiAoZmxhZyA9PSBTQ1RQX0JJTkRYX0FERF9BRERSKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvciBhZGRpbmcgYWRkcnM6ICVzLlxuIiwKKwkJCQlhcmd2MCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yIHJlbW92aW5nIGFkZHJzOiAlcy5cbiIsCisJCQkJYXJndjAsIHN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworfSAvKiBiaW5keF9mdW5jKCkgKi8KKworc3RhdGljIGludAorY29ubmVjdHhfZnVuYyhjaGFyICphcmd2MCwgaW50IHNrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJzLCBpbnQgY291bnQpCit7CisKKwlpbnQgZXJyb3I7CisJaW50IGk7CisJc3RydWN0IHNvY2thZGRyICpzYV9hZGRyOworCXZvaWQgKmFwdHI7CisKKworCWlmICgwID09IHJlbW90ZV9wb3J0KSB7CisJCWZwcmludGYoc3RkZXJyLCAiJXM6IEEgbm9uLTAgcmVtb3RlIHBvcnQgbnVtYmVyIGlzICIsIGFyZ3YwKTsKKwkJZnByaW50ZihzdGRlcnIsICJyZXF1aXJlZCBmb3IgY29ubmVjdHggdG8gd29yayFcbiIpOworCQlyZXR1cm4gLTEgOworCX0KKworCS8qIFNldCB0aGUgcG9ydCBpbiBldmVyeSBhZGRyZXNzLiAgKi8KKwlhcHRyID0gYWRkcnM7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJc2FfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhcHRyOworCisJCXN3aXRjaChzYV9hZGRyLT5zYV9mYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYV9hZGRyKS0+c2luX3BvcnQgPQorCQkJCWh0b25zKHJlbW90ZV9wb3J0KTsKKwkJCWFwdHIgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCQlicmVhazsKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCSgoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhX2FkZHIpLT5zaW42X3BvcnQgPQorCQkJCWh0b25zKHJlbW90ZV9wb3J0KTsKKwkJCWFwdHIgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgYWRkcmVzcyBmYW1pbHlcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJZXJyb3IgPSBzY3RwX2Nvbm5lY3R4KHNrLCBhZGRycywgY291bnQsIE5VTEwpOworCisJaWYgKGVycm9yICE9IDApIHsKKwkJaWYgKGVycm5vID09IEVDT05OUkVGVVNFRCkKKwkJCXJldHVybiAtMjsKKwkJZnByaW50ZihzdGRlcnIsICIlczogZXJyb3IgY29ubmVjdGluZyB0byBhZGRyczogJXMuXG4iLAorCQkJYXJndjAsIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKKworfSAvKiBjb25uZWN0eF9mdW5jKCkgKi8KKworc3RhdGljIHZvaWQKK3ByaW1hcnlfZnVuYyhjaGFyICphcmd2MCwgaW50IHNrLCBjaGFyICpjcCwgaW50IHNldCkKK3sKKwlzdHJ1Y3Qgc2N0cF9wcmltIHByaW07CisJc3RydWN0IHNvY2thZGRyX2luICppbl9hZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmluNl9hZGRyOworCXN0cnVjdCBzb2NrYWRkciAqc2FkZHI7CisJc29ja2xlbl90IHByaW1fbGVuOworCWludCByZXQ7CisJY2hhciAqcCA9IGNwOworCWNoYXIgYWRkcl9idWZbSU5FVDZfQUREUlNUUkxFTl07CisJY29uc3QgY2hhciAqYXAgPSBOVUxMOworCisJcHJpbV9sZW4gPSBzaXplb2Yoc3RydWN0IHNjdHBfcHJpbSk7CisJaWYgKCFzZXQpIHsKKwkJcHJpbS5zc3BfYXNzb2NfaWQgPSBhc3NvY2lkOworCQlyZXQgPSBnZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1NDVFAsIFNDVFBfUFJJTUFSWV9BRERSLAorCQkJCSAgICZwcmltLCAmcHJpbV9sZW4pOyAKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycjsKKwkKKwkJc2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJnByaW0uc3NwX2FkZHI7CQorCQlpZiAoQUZfSU5FVCA9PSBzYWRkci0+c2FfZmFtaWx5KSB7CisJCQlpbl9hZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZwcmltLnNzcF9hZGRyOworCQkJYXAgPSBpbmV0X250b3AoQUZfSU5FVCwgJmluX2FkZHItPnNpbl9hZGRyLCBhZGRyX2J1ZiwKKwkJCQkgICAgICAgSU5FVDZfQUREUlNUUkxFTik7CisJCX0gZWxzZSBpZiAoQUZfSU5FVDYgPT0gc2FkZHItPnNhX2ZhbWlseSkgeworCQkJaW42X2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZwcmltLnNzcF9hZGRyOworCQkJYXAgPSBpbmV0X250b3AoQUZfSU5FVDYsICZpbjZfYWRkci0+c2luNl9hZGRyLCBhZGRyX2J1ZiwKKwkJCQkgICAgICAgSU5FVDZfQUREUlNUUkxFTik7CisJCX0KKwkJaWYgKCFhcCkKKwkJCWdvdG8gZXJyOworCQlwcmludGYoIiVzXG4iLCBhcCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBTZXQgdGhlIGJ1ZmZlciBmb3IgYWRkcmVzcyBwYXJzaW5nLiAgKi8KKwl3aGlsZSAoJ1xuJyAhPSAqcCkKKwkJcCsrOworCSpwID0gJ1wwJzsKKworCXByaW0uc3NwX2Fzc29jX2lkID0gYXNzb2NpZDsJCisJaWYgKHN0cmNocihjcCwgJy4nKSkgeworCQlpbl9hZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZwcmltLnNzcF9hZGRyOworCQlpbl9hZGRyLT5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZV9wb3J0KTsKKwkJaW5fYWRkci0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCXJldCA9IGluZXRfcHRvbiAoQUZfSU5FVCwgY3AsICZpbl9hZGRyLT5zaW5fYWRkcik7CisJCWlmIChyZXQgPD0gMCkKKwkJCWdvdG8gZXJyOwkJCisJfSBlbHNlIGlmIChzdHJjaHIoY3AsICc6JykpIHsKKwkJaW42X2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZwcmltLnNzcF9hZGRyOworCQlpbjZfYWRkci0+c2luNl9wb3J0ID0gaHRvbnMocmVtb3RlX3BvcnQpOworCQlpbjZfYWRkci0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJcmV0ID0gaW5ldF9wdG9uKEFGX0lORVQ2LCBjcCwgJmluNl9hZGRyLT5zaW42X2FkZHIpOworCQlpZiAocmV0IDw9IDApCisJCQlnb3RvIGVycjsJCQorCX0gZWxzZQorCQlnb3RvIGVycjsKKworCXJldCA9IHNldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9QUklNQVJZX0FERFIsCisJCQkgICAgJnByaW0sIHNpemVvZihzdHJ1Y3Qgc2N0cF9wcmltKSk7IAorCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjsKKworCXJldHVybjsKK2VycjoKKwlpZiAoIWVycm5vKQorCQllcnJubyA9IEVJTlZBTDsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvciAlcyBwcmltYXJ5OiAlcy5cbiIsIGFyZ3YwLAorCSAgICAgICAgKHNldCk/InNldHRpbmciOiJnZXR0aW5nIiwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworc3RhdGljIHZvaWQKK3BlZXJfcHJpbWFyeV9mdW5jKGNoYXIgKmFyZ3YwLCBpbnQgc2ssIGNoYXIgKmNwLCBpbnQgc2V0KQoreworCXN0cnVjdCBzY3RwX3NldHBlZXJwcmltIHNldHBlZXJwcmltOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqaW5fYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICppbjZfYWRkcjsKKwlpbnQgcmV0OworCWNoYXIgKnAgPSBjcDsKKworCWlmICghc2V0KSB7CisJCWdvdG8gZXJyOworCX0KKworCS8qIFNldCB0aGUgYnVmZmVyIGZvciBhZGRyZXNzIHBhcnNpbmcuICAqLworCXdoaWxlICgnXG4nICE9ICpwKQorCQlwKys7CisJKnAgPSAnXDAnOworCisJc2V0cGVlcnByaW0uc3NwcF9hc3NvY19pZCA9IGFzc29jaWQ7CQorCWlmIChzdHJjaHIoY3AsICcuJykpIHsKKwkJaW5fYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmc2V0cGVlcnByaW0uc3NwcF9hZGRyOworCQlpbl9hZGRyLT5zaW5fcG9ydCA9IGh0b25zKGxvY2FsX3BvcnQpOworCQlpbl9hZGRyLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJcmV0ID0gaW5ldF9wdG9uIChBRl9JTkVULCBjcCwgJmluX2FkZHItPnNpbl9hZGRyKTsKKwkJaWYgKHJldCA8PSAwKQorCQkJZ290byBlcnI7CQkKKwl9IGVsc2UgaWYgKHN0cmNocihjcCwgJzonKSkgeworCQlpbjZfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNldHBlZXJwcmltLnNzcHBfYWRkcjsKKwkJaW42X2FkZHItPnNpbjZfcG9ydCA9IGh0b25zKGxvY2FsX3BvcnQpOworCQlpbjZfYWRkci0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJcmV0ID0gaW5ldF9wdG9uKEFGX0lORVQ2LCBjcCwgJmluNl9hZGRyLT5zaW42X2FkZHIpOworCQlpZiAocmV0IDw9IDApCisJCQlnb3RvIGVycjsJCQorCX0gZWxzZQorCQlnb3RvIGVycjsKKworCXJldCA9IHNldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9TRVRfUEVFUl9QUklNQVJZX0FERFIsCisJCQkgICAgJnNldHBlZXJwcmltLCBzaXplb2Yoc3RydWN0IHNjdHBfc2V0cGVlcnByaW0pKTsgCisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCisJcmV0dXJuOworZXJyOgorCWlmICghZXJybm8pCisJCWVycm5vID0gRUlOVkFMOworCWZwcmludGYoc3RkZXJyLCAiJXM6IGVycm9yICVzIHBlZXJfcHJpbWFyeTogJXMuXG4iLCBhcmd2MCwKKwkgICAgICAgIChzZXQpPyJzZXR0aW5nIjoiZ2V0dGluZyIsIHN0cmVycm9yKGVycm5vKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzcHBfaGJfZGVtYW5kX2Z1bmMoY2hhciAqYXJndjAsIGludCBzaywgY2hhciAqY3AsIGludCBzZXQpCit7CisJc3RydWN0IHNjdHBfcGFkZHJwYXJhbXMgcGFyYW1zOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqaW5fYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICppbjZfYWRkcjsKKwlpbnQgcmV0OworCWNoYXIgKnAgPSBjcDsKKworCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfcGFkZHJwYXJhbXMpKTsKKwlwYXJhbXMuc3BwX2Fzc29jX2lkID0gYXNzb2NpZDsKKwlwYXJhbXMuc3BwX2ZsYWdzID0gU1BQX0hCX0RFTUFORDsKKworCWlmIChzZXQpIHsKKwkJLyogU2V0IHRoZSBidWZmZXIgZm9yIGFkZHJlc3MgcGFyc2luZy4gICovCisJCXdoaWxlICgnXG4nICE9ICpwKQorCQkJcCsrOworCQkqcCA9ICdcMCc7CisKKwkJaWYgKHN0cmNocihjcCwgJy4nKSkgeworCQkJaW5fYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmcGFyYW1zLnNwcF9hZGRyZXNzOworCQkJaW5fYWRkci0+c2luX3BvcnQgPSBodG9ucyhyZW1vdGVfcG9ydCk7CisJCQlpbl9hZGRyLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCXJldCA9IGluZXRfcHRvbihBRl9JTkVULCBjcCwgJmluX2FkZHItPnNpbl9hZGRyKTsKKwkJCWlmIChyZXQgPD0gMCkKKwkJCQlnb3RvIGVycjsKKwkJfSBlbHNlIGlmIChzdHJjaHIoY3AsICc6JykpIHsKKwkJCWluNl9hZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmcGFyYW1zLnNwcF9hZGRyZXNzOworCQkJaW42X2FkZHItPnNpbjZfcG9ydCA9IGh0b25zKHJlbW90ZV9wb3J0KTsKKwkJCWluNl9hZGRyLT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJcmV0ID0gaW5ldF9wdG9uKEFGX0lORVQ2LCBjcCwgJmluNl9hZGRyLT5zaW42X2FkZHIpOworCQkJaWYgKHJldCA8PSAwKQorCQkJCWdvdG8gZXJyOworCQl9IGVsc2UKKwkJCWdvdG8gZXJyOworCX0KKworCXJldCA9IHNldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9QRUVSX0FERFJfUEFSQU1TLAorCQkJICAgICZwYXJhbXMsIHNpemVvZihzdHJ1Y3Qgc2N0cF9wYWRkcnBhcmFtcykpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjsKKworCXJldHVybjsKK2VycjoKKwlpZiAoIWVycm5vKQorCQllcnJubyA9IEVJTlZBTDsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvciAlcyBwZWVyX2FkZHJfcGFyYW1zOiAlcy5cbiIsIGFyZ3YwLAorCSAgICAgICAgKHNldCk/InNldHRpbmciOiJnZXR0aW5nIiwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworc3RhdGljIGludAorbm9kZWxheV9mdW5jKGNoYXIgKmFyZ3YwLCBpbnQgc2ssIGludCB2YWwsIGludCBzZXQpCit7CisJc29ja2xlbl90IG9wdGxlbjsKKwlpbnQgZXJyb3I7CisKKwlpZiAoc2V0KSB7CisJCWVycm9yID0gc2V0c29ja29wdChzaywgU09MX1NDVFAsIFNDVFBfTk9ERUxBWSwKKwkJCShjaGFyICopJnZhbCwgc2l6ZW9mKHZhbCkpOworCX0gZWxzZSB7CisJCW9wdGxlbiA9IHNpemVvZih2YWwpOworCQllcnJvciA9IGdldHNvY2tvcHQoc2ssIFNPTF9TQ1RQLCBTQ1RQX05PREVMQVksCisJCQkoY2hhciAqKSZ2YWwsICZvcHRsZW4pOworCX0KKwlpZiAoZXJyb3IgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBFcnJvciBzZXR0aW5nL2dldHRpbmcgbm9kZWxheTogJXMuXG4iLAorCQkJYXJndjAsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCFzZXQpIHsKKwkJcHJpbnRmKCJub2RlbGF5IGlzICVkLlxuIiwgdmFsKTsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK21heHNlZ19mdW5jKGNoYXIgKmFyZ3YwLCBpbnQgc2ssIGludCB2YWwsIGludCBzZXQpCit7CisJc29ja2xlbl90IG9wdGxlbjsKKwlpbnQgZXJyb3I7CisKKwlpZiAoc2V0KSB7CisJCWVycm9yID0gc2V0c29ja29wdChzaywgU09MX1NDVFAsIFNDVFBfTUFYU0VHLAorCQkJKGNoYXIgKikmdmFsLCBzaXplb2YodmFsKSk7CisJfSBlbHNlIHsKKwkJb3B0bGVuID0gc2l6ZW9mKHZhbCk7CisJCWVycm9yID0gZ2V0c29ja29wdChzaywgU09MX1NDVFAsIFNDVFBfTUFYU0VHLAorCQkJKGNoYXIgKikmdmFsLCAmb3B0bGVuKTsKKwl9CisJaWYgKGVycm9yICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogRXJyb3Igc2V0dGluZy9nZXR0aW5nIG1heHNlZzogJXMuXG4iLAorCQkJYXJndjAsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKCFzZXQpIHsKKwkJcHJpbnRmKCJtYXhzZWcgaXMgJWQuXG4iLCB2YWwpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorc2h1dGRvd25fZnVuYyhjaGFyICphcmd2MCwgaW50ICpza3AsIGludCBzaHV0ZG93bl90eXBlKQoreworCXN0cnVjdCBtc2doZHIgb3V0bWVzc2FnZTsKKwljaGFyIG91dGNtc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpXTsKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKyAgICAgICAgaW50IGVycm9yPTAsIGJ5dGVzX3NlbnQ7CisJc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm87CisJc3RydWN0IGhvc3RlbnQgKmhzdDsKKwljaGFyICpzZF90eXBlOworCWludCBzayA9ICpza3A7CisKKwlpZiAoc2h1dGRvd25fdHlwZSA9PSBTSFVURE9XTl9BQk9SVCkKKwkJc2RfdHlwZSA9ICJBQk9SVCI7CisJZWxzZQorCQlzZF90eXBlID0gIlNIVVRET1dOIjsKKworCS8qIFZlcmlmeSB0aGF0IHRoZSBhc3NvY2lhdGlvbiBpcyBwcmVzZW50LiAqLworCWVycm9yID0gdGVzdF9za19mb3JfYXNzb2Moc2ssIGFzc29jaWQpOworCWlmIChlcnJvciAhPSAwKSB7CisJCXByaW50ZigiVGhlIGFzc29jaWF0aW9uIGlzbid0IHByZXNlbnQgeWV0ISBDYW5ub3QgJXMhXG4iLCBzZF90eXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChzb2NrZXRfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCkgeworCQkvKiBTZXQgdXAgdGhlIGRlc3RpbmF0aW9uLiAgKi8KKwkJaWYgKHJlbW90ZV9ob3N0KSB7CisJCQloc3QgPSBnZXRob3N0YnluYW1lKHJlbW90ZV9ob3N0KTsKKwkJCWlmIChoc3QgPT0gTlVMTCkgeworCQkJCWhzdCA9IGdldGhvc3RieW5hbWUyKHJlbW90ZV9ob3N0LCBBRl9JTkVUNik7CisJCQl9CisKKwkJCWlmIChoc3QgPT0gTlVMTCB8fCBoc3QtPmhfbGVuZ3RoIDwgMSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGJhZCBob3N0bmFtZTogJXNcbiIsCisJCQkJCWFyZ3YwLCByZW1vdGVfaG9zdCk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKworCQkJcmFfZmFtaWx5ID0gaHN0LT5oX2FkZHJ0eXBlOworCQkJc3dpdGNoIChyYV9mYW1pbHkpIHsKKwkJCWNhc2UgQUZfSU5FVDoKKwkJCQlyYV9sZW4gPSBzaXplb2YocmVtb3RlX2FkZHIudjQpOworCQkJCXJhX3JhdyA9ICZyZW1vdGVfYWRkci52NC5zaW5fYWRkcjsKKwkJCQlyZW1vdGVfYWRkci52NC5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZV9wb3J0KTsKKwkJCQlyZW1vdGVfYWRkci52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUZfSU5FVDY6CisJCQkJcmFfbGVuID0gc2l6ZW9mKHJlbW90ZV9hZGRyLnY2KTsKKwkJCQlyYV9yYXcgPSAmcmVtb3RlX2FkZHIudjYuc2luNl9hZGRyOworCQkJCXJlbW90ZV9hZGRyLnY2LnNpbjZfcG9ydCA9IGh0b25zKHJlbW90ZV9wb3J0KTsKKwkJCQlyZW1vdGVfYWRkci52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgYWRkcmVzcyB0eXBlLlxuIik7CisJCQkJZXhpdCgxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1lbWNweShyYV9yYXcsIGhzdC0+aF9hZGRyX2xpc3RbMF0sIGhzdC0+aF9sZW5ndGgpOworCQl9CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgbWVzc2FnZSBzdHJ1Y3Qgd2UgdXNlIHRvIHBhc3MgbWVzc2FnZXMgdG8KKwkJICogdGhlIHJlbW90ZSBzb2NrZXQuCisJCSAqLworCQlvdXRtZXNzYWdlLm1zZ19uYW1lID0gJnJlbW90ZV9hZGRyOworCQlvdXRtZXNzYWdlLm1zZ19uYW1lbGVuID0gcmFfbGVuOworCisJCW91dG1lc3NhZ2UubXNnX2lvdiA9IE5VTEw7CisJCW91dG1lc3NhZ2UubXNnX2lvdmxlbiA9IDA7CisJCW91dG1lc3NhZ2UubXNnX2NvbnRyb2wgPSBvdXRjbXNnOworCQlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKG91dGNtc2cpOworCQlvdXRtZXNzYWdlLm1zZ19mbGFncyA9IDA7CisKKwkJY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1lc3NhZ2UpOworCQljbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworCQljbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKwkJY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCQlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47CisJCXNpbmZvID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7CisJCW1lbXNldChzaW5mbywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwkJaWYgKHNodXRkb3duX3R5cGUgPT0gU0hVVERPV05fQUJPUlQpCisJCQlzaW5mby0+c2luZm9fZmxhZ3MgfD0gU0NUUF9BQk9SVDsKKwkJZWxzZQorCQkJc2luZm8tPnNpbmZvX2ZsYWdzIHw9IFNDVFBfRU9GOworCisJCXNpbmZvLT5zaW5mb19hc3NvY19pZCA9IGFzc29jaWQ7CisJCisJCWJ5dGVzX3NlbnQgPSBzZW5kbXNnKHNrLCAmb3V0bWVzc2FnZSwgMCk7CisJCWlmIChieXRlc19zZW50ICE9IDApIHsKKwkJCXByaW50ZigiRmFpbHVyZTogICVzLlxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qIFJlY2VpdmUgdGhlIENPTU1fTE9TVCBvciBTSFVURE9XTl9DT01QIGV2ZW50LiAqLworCQl0ZXN0X3JlY3ZfYXNzb2NfY2hhbmdlKHNrKTsKKwl9IGVsc2UgeworCQlpZiAoc2h1dGRvd25fdHlwZSA9PSBTSFVURE9XTl9BQk9SVCkgeworCQkJc3RydWN0ICBsaW5nZXIgeworCQkJCWludCAgbF9vbm9mZjsgCisJCQkJaW50ICBsX2xpbmdlcjsKKwkJCX0gZGF0YSA9IHsxLCAwfTsKKwkJCWVycm9yID0gc2V0c29ja29wdChzaywgU09MX1NPQ0tFVCwgU09fTElOR0VSLAorCQkJCQkgICAoY2hhciAqKSZkYXRhLCBzaXplb2YoZGF0YSkpOworCQkJaWYgKGVycm9yICE9IDApIHsKKwkJCQlwcmludGYoInNldHNvY2tvcHQgZmFpbGVkICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCX0KKwkJZXJyb3IgPSBjbG9zZShzayk7CisJCWlmIChlcnJvciAhPSAwKSB7CisJCQlwcmludGYoImNsb3NlIGZhaWxlZCAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJKnNrcCA9IHNrID0gYnVpbGRfZW5kcG9pbnQoYXJndjAsIGxvY2FsX3BvcnQpOworCX0KKworCS8qIFZlcmlmeSB0aGF0IHRoZSBhc3NvY2lhdGlvbiBpcyBubyBsb25nZXIgcHJlc2VudC4gICovCisJZXJyb3IgPSB0ZXN0X3NrX2Zvcl9hc3NvYyhzaywgYXNzb2NpZCk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJcHJpbnRmKCJTdWNjZXNzZnVsbHkgJXMgdGhlIG9yaWdpbmFsIGFzc29jaWF0aW9uXG4iLCBzZF90eXBlKTsKKwkJYXNzb2NpZCA9IDA7CisJCW5ld19jb25uZWN0aW9uID0gMTsKKwl9IGVsc2UgeworCQlwcmludGYoIiVzIGZhaWxlZFxuIiwgc2RfdHlwZSk7CisJCWV4aXQoMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2dldF9hc3NvY3N0YXRzX2Z1bmMoaW50IHNrLCBzY3RwX2Fzc29jX3QgYXNzb2NfaWQpCit7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY19zdGF0cyBzdGF0czsKKwlzb2NrbGVuX3QgbGVuOworCisJaWYgKGFzc29jX2lkID09IDApIHsKKwkJcHJpbnRmKCJObyBhc3NvY2lhdGlvbiBwcmVzZW50IHlldFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwltZW1zZXQoJnN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2Nfc3RhdHMpKTsKKwlzdGF0cy5zYXNfYXNzb2NfaWQgPSBhc3NvY19pZDsKKwlsZW4gPSBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2Nfc3RhdHMpOworCWVycm9yID0gZ2V0c29ja29wdChzaywgU09MX1NDVFAsIFNDVFBfR0VUX0FTU09DX1NUQVRTLAorCQkJKGNoYXIgKikmc3RhdHMsICZsZW4pOworCWlmIChlcnJvciAhPSAwKSB7CisJCXByaW50ZigiZ2V0X2Fzc29jX3N0YXRzKCkgZmFpbGVkICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcHJpbnRmKCJSZXRyYW5zbWl0dGVkIENodW5rczogJSIgUFJJdTY0ICJcbiIsICh1aW50NjRfdCkgc3RhdHMuc2FzX3J0eGNodW5rcyk7CisJcHJpbnRmKCJHYXAgQWNrbm93bGVkZ2VtZW50cyBSZWNlaXZlZDogJSIgUFJJdTY0ICJcbiIsICh1aW50NjRfdCkgc3RhdHMuc2FzX2dhcGNudCk7CisJcHJpbnRmKCJUU04gcmVjZWl2ZWQgPiBuZXh0IGV4cGVjdGVkOiAlIiBQUkl1NjQgIlxuIiwgKHVpbnQ2NF90KSBzdGF0cy5zYXNfb3V0b2ZzZXF0c25zKTsKKwlwcmludGYoIlNBQ0tzIHNlbnQ6ICUiIFBSSXU2NCAiXG4iLCAodWludDY0X3QpIHN0YXRzLnNhc19vc2Fja3MpOworCXByaW50ZigiU0FDS3MgcmVjZWl2ZWQ6ICUiIFBSSXU2NCAiXG4iLCAodWludDY0X3QpIHN0YXRzLnNhc19pc2Fja3MpOworCXByaW50ZigiQ29udHJvbCBjaHVua3Mgc2VudDogJSIgUFJJdTY0ICJcbiIsICh1aW50NjRfdCkgc3RhdHMuc2FzX29jdHJsY2h1bmtzKTsKKwlwcmludGYoIkNvbnRyb2wgY2h1bmtzIHJlY2VpdmVkOiAlIiBQUkl1NjQgIlxuIiwgKHVpbnQ2NF90KSBzdGF0cy5zYXNfaWN0cmxjaHVua3MpOworCXByaW50ZigiT3JkZXJlZCBkYXRhIGNodW5rcyBzZW50OiAlIiBQUkl1NjQgIlxuIiwgKHVpbnQ2NF90KSBzdGF0cy5zYXNfb29kY2h1bmtzKTsKKwlwcmludGYoIk9yZGVyZWQgZGF0YSBjaHVua3MgcmVjZWl2ZWQ6ICUiIFBSSXU2NCAiXG4iLCAodWludDY0X3QpIHN0YXRzLnNhc19pb2RjaHVua3MpOworCXByaW50ZigiVW5vcmRlcmVkIGRhdGEgY2h1bmtzIHNlbnQ6ICUiIFBSSXU2NCAiXG4iLCAodWludDY0X3QpIHN0YXRzLnNhc19vdW9kY2h1bmtzKTsKKwlwcmludGYoIlVub3JkZXJlZCBkYXRhIGNodW5rcyByZWNlaXZlZDogJSIgUFJJdTY0ICJcbiIsICh1aW50NjRfdCkgc3RhdHMuc2FzX2l1b2RjaHVua3MpOworCXByaW50ZigiRHVwcyByZWNlaXZlZCAob3JkZXJlZCt1bm9yZGVyZWQpOiAlIiBQUkl1NjQgIlxuIiwgKHVpbnQ2NF90KSBzdGF0cy5zYXNfaWR1cGNodW5rcyk7CisJcHJpbnRmKCJQYWNrZXRzIHNlbnQ6ICUiIFBSSXU2NCAiXG4iLCAodWludDY0X3QpIHN0YXRzLnNhc19vcGFja2V0cyk7CisJcHJpbnRmKCJQYWNrZXRzIHJlY2VpdmVkOiAlIiBQUkl1NjQgIlxuIiwgKHVpbnQ2NF90KSBzdGF0cy5zYXNfaXBhY2tldHMpOworCXByaW50ZigiTWF4aW11bSBPYnNlcnZlZCBSVE8gdGhpcyBwZXJpb2Q6ICUiIFBSSXU2NCAiIC0gVHJhbnNwb3J0OiAiLCAodWludDY0X3QpIHN0YXRzLnNhc19tYXhydG8pOworCXByaW50X3NvY2thZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKikmc3RhdHMuc2FzX29ic19ydG9faXBhZGRyKTsKKwlwcmludGYoIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGVzdF9za19mb3JfYXNzb2MoaW50IHNrLCBzY3RwX2Fzc29jX3QgYXNzb2NfaWQpCit7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3Qgc2N0cF9zdGF0dXMgc3RhdHVzOworCXNvY2tsZW5fdCBzdGF0dXNfbGVuOworCisJbWVtc2V0KCZzdGF0dXMsIDAsIHNpemVvZihzdGF0dXMpKTsKKwlpZiAoYXNzb2NfaWQpCisJCXN0YXR1cy5zc3RhdF9hc3NvY19pZCA9IGFzc29jX2lkOworCXN0YXR1c19sZW4gPSBzaXplb2Yoc3RydWN0IHNjdHBfc3RhdHVzKTsKKwllcnJvciA9IGdldHNvY2tvcHQoc2ssIFNPTF9TQ1RQLCBTQ1RQX1NUQVRVUywKKyAgICAgICAgICAgICAgIAkJKGNoYXIgKikmc3RhdHVzLCAmc3RhdHVzX2xlbik7CisJcmV0dXJuIGVycm9yOworfQorCisvKiBSZWNlaXZlIGEgbm90aWZpY2F0aW9uIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYXNzb2NpZCBpZiB0aGUgZXZlbnQgaXMKKyAqIFNDVFBfQ09NTV9VUC4gUmV0dXJuIDAgZm9yIGFueSBvdGhlciBldmVudC4KKyAqLworc3RhdGljIHNjdHBfYXNzb2NfdAordGVzdF9yZWN2X2Fzc29jX2NoYW5nZShpbnQgc2spCit7CisJc3RydWN0IG1zZ2hkciBpbm1lc3NhZ2U7CisJc3RydWN0IGlvdmVjIGlvdjsKKwljaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihfc2N0cF9jbXNnX2RhdGFfdCkpXTsKKwlpbnQgZXJyb3I7CisKKwkvKiBJbml0aWFsaXplIGlubWVzc2FnZSB3aXRoIGVub3VnaCBzcGFjZSBmb3IgREFUQS4uLiAqLworCW1lbXNldCgmaW5tZXNzYWdlLCAwLCBzaXplb2YoaW5tZXNzYWdlKSk7CisJaWYgKChpb3YuaW92X2Jhc2UgPSBtYWxsb2MoUkVBTExZX0JJRykpID09IE5VTEwpIHsKKwkJcHJpbnRmKCIlczogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5LlxuIiwgX19GVU5DVElPTl9fKTsKKwkJZXhpdCgxKTsKKwl9CisJaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworCWlubWVzc2FnZS5tc2dfaW92ID0gJmlvdjsKKwlpbm1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisJLyogb3IgYSBjb250cm9sIG1lc3NhZ2UuICAqLworCWlubWVzc2FnZS5tc2dfY29udHJvbCA9IGluY21zZzsKKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKworCWVycm9yID0gcmVjdm1zZyhzaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCWlmIChlcnJvciA8IDApIHsKKwkJcHJpbnRmKCIlczogcmVjdm1zZzogJXNcbiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gdGVzdF92ZXJpZnlfYXNzb2NfY2hhbmdlKCZpbm1lc3NhZ2UpOworfQorCisvKiBWZXJpZnkgYSBub3RpZmljYXRpb24gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhc3NvY2lkIGlmIHRoZSBldmVudCBpcworICogU0NUUF9DT01NX1VQLiBSZXR1cm4gMCBmb3IgYW55IG90aGVyIGV2ZW50LgorICovCitzdGF0aWMgc2N0cF9hc3NvY190Cit0ZXN0X3ZlcmlmeV9hc3NvY19jaGFuZ2Uoc3RydWN0IG1zZ2hkciAqbXNnKQoreworCXVuaW9uIHNjdHBfbm90aWZpY2F0aW9uICpzbjsKKworCWlmICghKG1zZy0+bXNnX2ZsYWdzICYgTVNHX05PVElGSUNBVElPTikpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogUmVjZWl2ZWQgZGF0YSB3aGVuIG5vdGlmaWNhdGlvbiBpcyBleHBlY3RlZFxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJCWV4aXQoMSk7CisJfQorCisJc24gPSAodW5pb24gc2N0cF9ub3RpZmljYXRpb24gKiltc2ctPm1zZ19pb3YtPmlvdl9iYXNlOworCWlmIChTQ1RQX0FTU09DX0NIQU5HRSAhPSBzbi0+c25faGVhZGVyLnNuX3R5cGUpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogUmVjZWl2ZWQgdW5leHBlY3RlZCBub3RpZmljYXRpb246ICVkIiwKKwkJCV9fRlVOQ1RJT05fXywgc24tPnNuX2hlYWRlci5zbl90eXBlKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlzd2l0Y2goc24tPnNuX2Fzc29jX2NoYW5nZS5zYWNfc3RhdGUpCisJeworCWNhc2UgU0NUUF9DT01NX1VQOgorCQlwcmludGYoIlJlY2VpdmVkIFNDVFBfQ09NTV9VUFxuIik7CisJCWJyZWFrOworCWNhc2UgU0NUUF9DT01NX0xPU1Q6CisJCXByaW50ZigiUmVjZWl2ZWQgU0NUUF9DT01NX0xPU1RcbiIpOworCQlicmVhazsKKwljYXNlIFNDVFBfUkVTVEFSVDoKKwkJcHJpbnRmKCJSZWNlaXZlZCBTQ1RQX1JFU1RBUlRcbiIpOworCQlicmVhazsKKwljYXNlIFNDVFBfU0hVVERPV05fQ09NUDoKKwkJcHJpbnRmKCJSZWNlaXZlZCBTQ1RQX1NIVVRET1dOX0NPTVBcbiIpOworCQlicmVhazsKKwljYXNlIFNDVFBfQ0FOVF9TVFJfQVNTT0M6CisJCXByaW50ZigiUmVjZWl2ZWQgU0NUUF9DQU5UX1NUUl9BU1NPQ1xuIik7CisJCWJyZWFrOworCX0KKworCWlmIChTQ1RQX0NPTU1fVVAgPT0gc24tPnNuX2Fzc29jX2NoYW5nZS5zYWNfc3RhdGUpCisJCXJldHVybiBzbi0+c25fYXNzb2NfY2hhbmdlLnNhY19hc3NvY19pZDsKKwllbHNlCisJCXJldHVybiAwOworfQorCit2b2lkIHByaW50X2FkZHJfYnVmKHZvaWQgKiBsYWRkcnMsIGludCBuX2xhZGRycykKK3sKKwl2b2lkICphZGRyX2J1ZiA9IGxhZGRyczsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuX2xhZGRyczsgaSsrKSB7CisJCWFkZHJfYnVmICs9IHByaW50X3NvY2thZGRyKChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyX2J1Zik7CisJCXByaW50ZigiXG4iKTsKKwl9Cit9CisKK2ludCBwcmludF9zb2NrYWRkcihzdHJ1Y3Qgc29ja2FkZHIgKnNhX2FkZHIpCit7CisJc3RydWN0IHNvY2thZGRyX2luICppbl9hZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmluNl9hZGRyOworCisJaWYgKEFGX0lORVQgPT0gc2FfYWRkci0+c2FfZmFtaWx5KSB7CisJCWluX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopc2FfYWRkcjsKKwkJcHJpbnRmKCIlZC4lZC4lZC4lZDolZCIsCisJCSAgICAgICBOSVBRVUFEKGluX2FkZHItPnNpbl9hZGRyKSwKKwkJICAgICAgIG50b2hzKGluX2FkZHItPnNpbl9wb3J0KSk7CisJCXJldHVybiBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwl9IGVsc2UgeworCQlpbjZfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2FfYWRkcjsKKwkJcHJpbnRmKCIlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JWQiLAorCQkgICAgICAgTklQNihpbjZfYWRkci0+c2luNl9hZGRyKSwKKwkJICAgICAgIG50b2hzKGluNl9hZGRyLT5zaW42X3BvcnQpKTsKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvYXBwcy9zY3RwX2Rhcm4uaCBiL3NyYy9hcHBzL3NjdHBfZGFybi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzFlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYXBwcy9zY3RwX2Rhcm4uaApAQCAtMCwwICsxLDI5IEBACisjaWZuZGVmIF9fc2N0cF9kYXJuX2hfXworI2RlZmluZSBfX3NjdHBfZGFybl9oX18KKworI2RlZmluZSBSRUFMTFlfQklHIDY1NTM2CisjZGVmaW5lIFNDVFBfVEVTVFBPUlRfMSAxCisjZGVmaW5lIFNDVFBfVEVTVFBPUlRfMiAyCisKK3ZvaWQgcGFyc2VfYXJndW1lbnRzKGludCBhcmdjLCBjaGFyICphcmd2W10pOwordm9pZCB1c2FnZShjaGFyICphcmd2MCk7CitpbnQgY29tbWFuZF9saXN0ZW4oY2hhciAqYXJnMCwgaW50IHNrKTsKK2ludCBjb21tYW5kX3NlbmQoY2hhciAqYXJnMCwgICBpbnQgKnNrcCk7CitpbnQgY29tbWFuZF9wb2xsKGNoYXIgKmFyZzApOworaW50IHRlc3RfcHJpbnRfbWVzc2FnZShpbnQgc2ssIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90IG1zZ19sZW4pOworCit0eXBlZGVmIGVudW0geworCUNPTU1BTkRfTk9ORSA9IDAsCisJQ09NTUFORF9MSVNURU4sCisJQ09NTUFORF9TRU5ELAorCUNPTU1BTkRfUE9MTCwKK30gY29tbWFuZF90OworCit0eXBlZGVmIHVuaW9uIHsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBzczsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIHY0OworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42IHY2OworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgc2E7Cit9IHNvY2thZGRyX3N0b3JhZ2VfdDsKKworI2VuZGlmIC8qIF9fc2N0cF9kYXJuX2hfXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2FwcHMvc2N0cF9zdGF0dXMuYyBiL3NyYy9hcHBzL3NjdHBfc3RhdHVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2M2NiZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYXBwcy9zY3RwX3N0YXR1cy5jCkBAIC0wLDAgKzEsOTQ1IEBACisvKiBTQ1RQIGtlcm5lbCByZWZlcmVuY2UgSW1wbGVtZW50YXRpb24KKyAqIChDKSBDb3B5cmlnaHQgRnVqaXRzdSBMdGQuIDIwMDgsIDIwMDkKKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBXZWkgWW9uZ2p1biA8eWp3ZWlAY24uZnVqaXRzdS5jb20+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIERFRkFVTFRfU0VDCTAKKyNkZWZpbmUgREVGQVVMVF9VU0VDCTUwMDAKKworI2RlZmluZSBSRUFMTFlfQklHIDY1NTM2CisKKyNkZWZpbmUgU0VSVkVSIAkJMAorI2RlZmluZSBDTElFTlQgCQkxCisjZGVmaW5lIE5PVF9ERUZJTkVECTY2NgorCisjZGVmaW5lIERFQlVHX05PTkUJMAorI2RlZmluZSBERUJVR19NSU4JMQorI2RlZmluZSBERUJVR19NQVgJMgorCisjZGVmaW5lIE9SREVSX1BBVFRFUk5fVU5PUkRFUkVEICAgMAorI2RlZmluZSBPUkRFUl9QQVRURVJOX09SREVSRUQgICAgIDEKKyNkZWZpbmUgT1JERVJfUEFUVEVSTl9BTFRFUk5BVEUgICAyCisjZGVmaW5lIE9SREVSX1BBVFRFUk5fUkFORE9NICAgICAgMworCisjZGVmaW5lIFNUUkVBTV9QQVRURVJOX1NFUVVFTlRJQUwgMAorI2RlZmluZSBTVFJFQU1fUEFUVEVSTl9SQU5ET00gICAgIDEKKworI2RlZmluZSBNQVhfQklORF9SRVRSWVMgMTAKKyNkZWZpbmUgQklHX1JFUEVBVAkxMDAwMDAwCisjZGVmaW5lIFJFUEVBVCAJCTEwCisKKyNkZWZpbmUgREVGQVVMVF9NQVhfV0lORE9XIDMyNzY4CisjZGVmaW5lIERFRkFVTFRfTUlOX1dJTkRPVyAxNTAwCisKKyNkZWZpbmUgTVNHX0NOVAkJMTAKKworI2RlZmluZSBERUJVR19QUklOVChsZXZlbCwgcHJpbnRfdGhpcy4uLikJXAorewkJCQkJCVwKKwlpZiAoZGVidWdfbGV2ZWwgPj0gbGV2ZWwpIHsgCQlcCisJCWZwcmludGYoc3Rkb3V0LCBwcmludF90aGlzKTsgCVwKKwkJZmZsdXNoKHN0ZG91dCk7IAkJXAorCX0JCQkJCVwKK30gLyogREVCVUdfUFJJTlQgKi8KKworY2hhciAqbG9jYWxfaG9zdCA9IE5VTEw7CitpbnQgbG9jYWxfcG9ydCA9IDA7CitjaGFyICpyZW1vdGVfaG9zdCA9IE5VTEw7CitpbnQgcmVtb3RlX3BvcnQgPSAwOworc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc19yZW0sIHNfbG9jOworaW50IHJfbGVuLCBsX2xlbjsKK2ludCBzaXplX2FyZyA9IDA7CitpbnQgZGVidWdfbGV2ZWwgPSBERUJVR19OT05FOworaW50IG9yZGVyX3BhdHRlcm4gPSBPUkRFUl9QQVRURVJOX1VOT1JERVJFRDsKK2ludCBvcmRlcl9zdGF0ZSA9IDA7CitpbnQgc3RyZWFtX3BhdHRlcm4gPSBTVFJFQU1fUEFUVEVSTl9TRVFVRU5USUFMOworaW50IHN0cmVhbV9zdGF0ZSA9IDA7CitpbnQgcmVwZWF0ID0gUkVQRUFUOworaW50IHJlcGVhdF9jb3VudCA9IDA7CitpbnQgbWF4X21zZ3NpemUgPSBERUZBVUxUX01BWF9XSU5ET1c7CitpbnQgbXNnX2NudCA9IE1TR19DTlQ7CitpbnQgZHJhaW4gPSAwOworaW50IG1heF9zdHJlYW0gPSAwOworaW50IGdzayA9IC0xOworaW50IHBlcmlvZCA9IDE7CitjaGFyICpzdGF0dXNmaWxlID0gTlVMTDsKKwordm9pZCBwcmludHN0YXR1cyhpbnQgc2spOwordm9pZCBzaWdoYW5kbGVyKGludCBzaWdubyk7Cit2b2lkIHNldHRpbWVyaGFuZGxlKHZvaWQpOwordm9pZCB1c2FnZShjaGFyICphcmd2MCk7Cit2b2lkIHN0YXJ0X3Rlc3QoaW50IHJvbGUpOworCit1bnNpZ25lZCBjaGFyIG1zZ1tdID0gIjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCI7CisKKy8qIENvbnZlbmllbmNlIHN0cnVjdHVyZSB0byBkZXRlcm1pbmUgc3BhY2UgbmVlZGVkIGZvciBjbXNnLiAqLwordHlwZWRlZiB1bmlvbiB7CisJc3RydWN0IHNjdHBfaW5pdG1zZyBpbml0OworCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gc25kcmN2aW5mbzsKK30gX3NjdHBfY21zZ19kYXRhX3Q7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKwlpbnQgYywgcm9sZSA9IE5PVF9ERUZJTkVEOworCWNoYXIgKmludGVyZmFjZSA9IE5VTEw7CisJc3RydWN0IHNvY2thZGRyX2luICp0X2FkZHI7CisJc3RydWN0IHNvY2thZGRyX2luNiAqdF9hZGRyNjsKKworCS8qIFBhcnNlIHRoZSBhcmd1bWVudHMuICAqLworCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiOkg6TDpQOmg6cDpjOmQ6bG06c3g6WDpvOk06RGk6STpmOiIpKSA+PSAwICkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnSCc6CisJCQlsb2NhbF9ob3N0ID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ1AnOgorCQkJbG9jYWxfcG9ydCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJCXJlbW90ZV9ob3N0ID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJcmVtb3RlX3BvcnQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlpZiAocm9sZSAhPSBOT1RfREVGSU5FRCkgeworCQkJCXByaW50ZigiJXM6IG9ubHkgLXMgb3IgLWxcbiIsIGFyZ3ZbMF0pOworCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlyb2xlID0gU0VSVkVSOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJaWYgKHJvbGUgIT0gTk9UX0RFRklORUQpIHsKKwkJCQlwcmludGYoIiVzOiBvbmx5IC1zIG9yIC1sXG4iLCBhcmd2WzBdKTsKKwkJCQl1c2FnZShhcmd2WzBdKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJcm9sZSA9IENMSUVOVDsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCWRyYWluID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWRlYnVnX2xldmVsID0gYXRvaShvcHRhcmcpOworCQkJaWYgKGRlYnVnX2xldmVsIDwgREVCVUdfTk9ORQorCQkJICAgIHx8IGRlYnVnX2xldmVsID4gREVCVUdfTUFYKSB7CisJCQkJdXNhZ2UoYXJndlswXSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdJJzoKKwkJCXBlcmlvZCA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChwZXJpb2QgPCAwKSB7CisJCQkJdXNhZ2UoYXJndlswXSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICd4JzoKKwkJCXJlcGVhdCA9IGF0b2kob3B0YXJnKTsKKwkJCWlmICghcmVwZWF0KSB7CisJCQkJcmVwZWF0ID0gQklHX1JFUEVBVDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdYJzoKKwkJCW1zZ19jbnQgPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAoKG1zZ19jbnQgPD0gMCkgfHwgKG1zZ19jbnQgPiBNU0dfQ05UKSkgeworCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQlzaXplX2FyZyA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChzaXplX2FyZyA8IDApIHsKKwkJCQl1c2FnZShhcmd2WzBdKTsKKwkJCQlleGl0KDEpOworCQkJfQorCisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlvcmRlcl9wYXR0ZXJuID0gYXRvaShvcHRhcmcpOworCQkJaWYgKG9yZGVyX3BhdHRlcm4gPCAgT1JERVJfUEFUVEVSTl9VTk9SREVSRUQKKwkJCSAgICB8fCBvcmRlcl9wYXR0ZXJuICA+IE9SREVSX1BBVFRFUk5fUkFORE9NICkgeworCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnTSc6CisJCQltYXhfc3RyZWFtID0gYXRvaShvcHRhcmcpOworCQkJaWYgKG1heF9zdHJlYW0gPCAgMAorCQkJICAgIHx8IG1heF9zdHJlYW0gPj0gKDE8PDE2KSkgeworCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQltYXhfbXNnc2l6ZSA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCWludGVyZmFjZSA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCXN0YXR1c2ZpbGUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCWRlZmF1bHQ6CisJCQl1c2FnZShhcmd2WzBdKTsKKwkJCWV4aXQoMCk7CisJCX0KKwl9IC8qIHdoaWxlKCkgKi8KKworCWlmIChOT1RfREVGSU5FRCA9PSByb2xlKSB7CisJCXVzYWdlKGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCWlmIChTRVJWRVIgPT0gcm9sZSAmJiBOVUxMID09IGxvY2FsX2hvc3QgJiYgcmVtb3RlX2hvc3QgIT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBTZXJ2ZXIgbmVlZHMgbG9jYWwgYWRkcmVzcywgIgorCQkJICJub3QgcmVtb3RlIGFkZHJlc3NcbiIsIGFyZ3ZbMF0pOworCQl1c2FnZShhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKENMSUVOVCA9PSByb2xlICYmIE5VTEwgPT0gcmVtb3RlX2hvc3QpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogQ2xpZW50IG5lZWRzIGF0IGxlYXN0IHJlbW90ZSBhZGRyZXNzICIKKwkJCSAiJiBwb3J0XG4iLCBhcmd2WzBdKTsKKwkJdXNhZ2UoYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKG9wdGluZCA8IGFyZ2MpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogbm9uLW9wdGlvbiBhcmd1bWVudHMgYXJlIGlsbGVnYWw6ICIsIGFyZ3ZbMF0pOworCQl3aGlsZSAob3B0aW5kIDwgYXJnYykKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMgIiwgYXJndltvcHRpbmQrK10pOworCQlmcHJpbnRmIChzdGRlcnIsICJcbiIpOworCQl1c2FnZShhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAocmVtb3RlX2hvc3QgIT0gTlVMTCAmJiByZW1vdGVfcG9ydCAhPSAwKSB7CisJCXN0cnVjdCBhZGRyaW5mbyAqcmVzOworCQlpbnQgZXJyb3I7CisJCWNoYXIgKmhvc3RfcywgKnNlcnZfczsKKworCQlpZiAoKGhvc3RfcyA9IG1hbGxvYyhOSV9NQVhIT1NUKSkgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJcbioqKiBob3N0X3MgbWFsbG9jIGZhaWxlZCEhISAqKipcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAoKHNlcnZfcyA9IG1hbGxvYyhOSV9NQVhTRVJWKSkgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJcbioqKiBzZXJ2X3MgbWFsbG9jIGZhaWxlZCEhISAqKipcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCWVycm9yID0gZ2V0YWRkcmluZm8ocmVtb3RlX2hvc3QsIDAsIE5VTEwsICZyZXMpOworCQlpZiAoZXJyb3IpIHsKKwkJCXByaW50ZigiJXMuXG4iLCBnYWlfc3RyZXJyb3IoZXJyb3IpKTsKKwkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJZXhpdCgxKTsKKwkJfQorCisJCXN3aXRjaCAocmVzLT5haV9mYW1pbHkpIHsKKwkJCWNhc2UgQUZfSU5FVDoKKwkJCQl0X2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopJnNfcmVtOworCisJCQkJbWVtY3B5KHRfYWRkciwgcmVzLT5haV9hZGRyLAorCQkJCSAgICAgICByZXMtPmFpX2FkZHJsZW4pOworCQkJCXRfYWRkci0+c2luX2ZhbWlseSA9IHJlcy0+YWlfZmFtaWx5OworCQkJCXRfYWRkci0+c2luX3BvcnQgPSBodG9ucyhyZW1vdGVfcG9ydCk7CisKKwkJCQlyX2xlbiA9IHJlcy0+YWlfYWRkcmxlbjsKKyNpZmRlZiBfX0ZyZWVCU0RfXworCQkJCXRfYWRkci0+c2luX2xlbiA9IHJfbGVuOworI2VuZGlmCisJCQkJYnJlYWs7CisJCQljYXNlIEFGX0lORVQ2OgorCQkJCXRfYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzX3JlbTsKKworCQkJCW1lbWNweSh0X2FkZHI2LCByZXMtPmFpX2FkZHIsCisJCQkJICAgICAgIHJlcy0+YWlfYWRkcmxlbik7CisJCQkJdF9hZGRyNi0+c2luNl9mYW1pbHkgPSByZXMtPmFpX2ZhbWlseTsKKwkJCQl0X2FkZHI2LT5zaW42X3BvcnQgPSBodG9ucyhyZW1vdGVfcG9ydCk7CisJCQkJaWYgKGludGVyZmFjZSkKKwkJCQkJdF9hZGRyNi0+c2luNl9zY29wZV9pZCA9IGlmX25hbWV0b2luZGV4KGludGVyZmFjZSk7CisKKwkJCQlyX2xlbiA9IHJlcy0+YWlfYWRkcmxlbjsKKworI2lmZGVmIF9fRnJlZUJTRF9fCisJCQkJdF9hZGRyNi0+c2luNl9sZW4gPSByX2xlbjsKKyNlbmRpZgorCQkJCWJyZWFrOworCQl9CisKKwkJZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciAqKSZzX3JlbSwgcl9sZW4sIGhvc3RfcywKKwkJCSAgICBOSV9NQVhIT1NULCBzZXJ2X3MsIE5JX01BWFNFUlYsIE5JX05VTUVSSUNIT1NUKTsKKworCQlERUJVR19QUklOVChERUJVR19NQVgsICJyZW1vdGU6YWRkcj0lcywgcG9ydD0lcywgZmFtaWx5PSVkXG4iLAorCQkJICAgIGhvc3Rfcywgc2Vydl9zLCByZXMtPmFpX2ZhbWlseSk7CisKKwkJZnJlZWFkZHJpbmZvKHJlcyk7CisgICAgICAgIH0KKworCWlmIChsb2NhbF9ob3N0ICE9IE5VTEwpIHsKKwkJc3RydWN0IGFkZHJpbmZvICpyZXM7CisJCWludCBlcnJvcjsKKwkJY2hhciAqaG9zdF9zLCAqc2Vydl9zOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnRfYWRkcjsKKwkJc3RydWN0IHNvY2thZGRyX2luNiAqdF9hZGRyNjsKKworCQlpZiAoKGhvc3RfcyA9IG1hbGxvYyhOSV9NQVhIT1NUKSkgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJcbioqKiBob3N0X3MgbWFsbG9jIGZhaWxlZCEhISAqKipcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAoKHNlcnZfcyA9IG1hbGxvYyhOSV9NQVhTRVJWKSkgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJcbioqKiBzZXJ2X3MgbWFsbG9jIGZhaWxlZCEhISAqKipcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCWlmIChzdHJjbXAobG9jYWxfaG9zdCwgIjAiKSA9PSAwKQorCQkJbG9jYWxfaG9zdCA9ICIwLjAuMC4wIjsKKworCQllcnJvciA9IGdldGFkZHJpbmZvKGxvY2FsX2hvc3QsIDAsIE5VTEwsICZyZXMpOworCQlpZiAoZXJyb3IpIHsKKwkJCXByaW50ZigiJXMuXG4iLCBnYWlfc3RyZXJyb3IoZXJyb3IpKTsKKwkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJZXhpdCgxKTsKKwkJfQorCisJCXN3aXRjaCAocmVzLT5haV9mYW1pbHkpIHsKKwkJCWNhc2UgQUZfSU5FVDoKKwkJCQl0X2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopJnNfbG9jOworCisJCQkJbWVtY3B5KHRfYWRkciwgcmVzLT5haV9hZGRyLAorCQkJCSAgICAgICByZXMtPmFpX2FkZHJsZW4pOworCQkJCXRfYWRkci0+c2luX2ZhbWlseSA9IHJlcy0+YWlfZmFtaWx5OworCQkJCXRfYWRkci0+c2luX3BvcnQgPSBodG9ucyhsb2NhbF9wb3J0KTsKKworCQkJCWxfbGVuID0gcmVzLT5haV9hZGRybGVuOworI2lmZGVmIF9fRnJlZUJTRF9fCisJCQkJdF9hZGRyLT5zaW5fbGVuID0gbF9sZW47CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgQUZfSU5FVDY6CisJCQkJdF9hZGRyNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNfbG9jOworCisJCQkJbWVtY3B5KHRfYWRkcjYsIHJlcy0+YWlfYWRkciwKKwkJCQkgICAgICAgcmVzLT5haV9hZGRybGVuKTsKKwkJCQl0X2FkZHI2LT5zaW42X2ZhbWlseSA9IHJlcy0+YWlfZmFtaWx5OworCQkJCXRfYWRkcjYtPnNpbjZfcG9ydCA9IGh0b25zKGxvY2FsX3BvcnQpOworCQkJCWlmIChpbnRlcmZhY2UpCisJCQkJCXRfYWRkcjYtPnNpbjZfc2NvcGVfaWQgPSBpZl9uYW1ldG9pbmRleChpbnRlcmZhY2UpOworCisJCQkJbF9sZW4gPSByZXMtPmFpX2FkZHJsZW47CisKKyNpZmRlZiBfX0ZyZWVCU0RfXworCQkJCXRfYWRkcjYtPnNpbjZfbGVuID0gbF9sZW47CisjZW5kaWYKKwkJCQlicmVhazsKKwkJfQorCisJCWVycm9yID0gZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciAqKSZzX2xvYywgbF9sZW4sIGhvc3RfcywKKwkJCSAgICBOSV9NQVhIT1NULCBzZXJ2X3MsIE5JX01BWFNFUlYsIE5JX05VTUVSSUNIT1NUKTsKKworCQlpZiAoZXJyb3IpCisJCQlwcmludGYoIiVzLi5cbiIsIGdhaV9zdHJlcnJvcihlcnJvcikpOworCisJCURFQlVHX1BSSU5UKERFQlVHX01BWCwgImxvY2FsOmFkZHI9JXMsIHBvcnQ9JXMsIGZhbWlseT0lZFxuIiwKKwkJCSAgICBob3N0X3MsIHNlcnZfcywgcmVzLT5haV9mYW1pbHkpOworCisJCWZyZWVhZGRyaW5mbyhyZXMpOworICAgICAgICB9CisKKwkvKiBMZXQgdGhlIHRlc3RpbmcgYmVnaW4uICovCisJc3RhcnRfdGVzdChyb2xlKTsKKworCXJldHVybiAwOworfQorCitpbnQgYmluZF9yKGludCBzaywgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNhZGRyKSB7CisJaW50IGVycm9yID0gMCwgaSA9IDA7CisJY2hhciAqaG9zdF9zLCAqc2Vydl9zOworCisJaWYgKChob3N0X3MgPSBtYWxsb2MoTklfTUFYSE9TVCkpID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJcblx0XHQqKiogaG9zdF9zIG1hbGxvYyBmYWlsZWQhISEgKioqXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKChzZXJ2X3MgPSBtYWxsb2MoTklfTUFYU0VSVikpID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJcblx0XHQqKiogc2Vydl9zIG1hbGxvYyBmYWlsZWQhISEgKioqXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlkbyB7CisJCWlmIChpID4gMCkgc2xlZXAoMSk7IC8qIHNsZWVwIGEgd2hpbGUgYmVmb3JlIG5ldyB0cnkuLi4gKi8KKworCQllcnJvciA9IGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIgKilzYWRkciwgbF9sZW4sIGhvc3RfcywKKwkJCQkgICAgTklfTUFYSE9TVCwgc2Vydl9zLCBOSV9NQVhTRVJWLAorCQkJCSAgICBOSV9OVU1FUklDSE9TVCk7CisKKwkJaWYgKGVycm9yKQorCQkJcHJpbnRmKCIlc1xuIiwgZ2FpX3N0cmVycm9yKGVycm9yKSk7CisKKwkJREVCVUdfUFJJTlQoREVCVUdfTUlOLAorCQkJIlx0YmluZChzaz0lZCwgW2E6JXMscDolc10pICAtLSAgYXR0ZW1wdCAlZC8lZFxuIiwKKwkJCXNrLCBob3N0X3MsIHNlcnZfcywgaSsxLCBNQVhfQklORF9SRVRSWVMpOworCisJCWVycm9yID0gYmluZChzaywgKHN0cnVjdCBzb2NrYWRkciAqKXNhZGRyLCBsX2xlbik7CisKKwkJaWYgKGVycm9yICE9IDApIHsKKwkJCWlmKCBlcnJubyAhPSBFQUREUklOVVNFICkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiXG5cblx0XHQqKipiaW5kOiBjYW4gIgorCQkJCQkibm90IGJpbmQgdG8gJXM6JXM6ICVzICoqKipcbiIsCisJCQkJCWhvc3Rfcywgc2Vydl9zLCBzdHJlcnJvcihlcnJubykpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCX0KKwkJaSsrOworCQlpZiAoaSA+PSBNQVhfQklORF9SRVRSWVMpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiTWF4aW11bSBiaW5kKCkgYXR0ZW1wdHMuICIKKwkJCQkiRGllIG5vdy4uLlxuXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9IHdoaWxlIChlcnJvciA8IDAgJiYgaSA8IE1BWF9CSU5EX1JFVFJZUyk7CisKKwlyZXR1cm4gMDsKK30gLyogYmluZF9yKCkgKi8KKworaW50IGxpc3Rlbl9yKGludCBzaywgaW50IGxpc3Rlbl9jb3VudCkgeworCWludCBlcnJvciA9IDA7CisKKwlERUJVR19QUklOVChERUJVR19NSU4sICJcdGxpc3Rlbihzaz0lZCxiYWNrbG9nPSVkKVxuIiwKKwkJc2ssIGxpc3Rlbl9jb3VudCk7CisKKwkvKiBNYXJrIHNrIGFzIGJlaW5nIGFibGUgdG8gYWNjZXB0IG5ldyBhc3NvY2lhdGlvbnMgKi8KKwllcnJvciA9IGxpc3RlbihzaywgMSk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJcblxuXHRcdCoqKiBsaXN0ZW46ICAlcyAqKipcblxuXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KDEpOworCX0KKworCXJldHVybiAwOworfSAvKiBsaXN0ZW5fcigpICovCisKK2ludCBhY2NlcHRfcihpbnQgc2speworCXNvY2tsZW5fdCBsZW4gPSAwOworCisJREVCVUdfUFJJTlQoREVCVUdfTUlOLCAiXHRhY2NlcHQoc2s9JWQpXG4iLCBzayk7CisKKwlnc2sgPSBhY2NlcHQoc2ssIE5VTEwsICZsZW4pOworCWlmIChnc2sgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiXG5cblx0XHQqKiogYWNjZXB0OiAgJXMgKioqXG5cblxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30gLyogYWNjZXB0X3IoKSAqLworCitpbnQgY29ubmVjdF9yKGludCBzaywgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzZXJ2X2FkZHIsIHNvY2tsZW5fdCBhZGRybGVuKSB7CisJaW50IGVycm9yID0gMDsKKworCURFQlVHX1BSSU5UKERFQlVHX01JTiwgIlx0Y29ubmVjdChzaz0lZClcbiIsIHNrKTsKKworCS8qIE1hcmsgc2sgYXMgYmVpbmcgYWJsZSB0byBhY2NlcHQgbmV3IGFzc29jaWF0aW9ucyAqLworCWVycm9yID0gY29ubmVjdChzaywgc2Vydl9hZGRyLCBhZGRybGVuKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlxuXG5cdFx0KioqIGNvbm5lY3Q6ICAlcyAqKipcblxuXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlnc2sgPSBzazsKKworCXJldHVybiAwOworfSAvKiBjb25uZWN0X3IoKSAqLworCitpbnQgY2xvc2VfcihpbnQgc2spIHsKKwlpbnQgZXJyb3IgPSAwOworCisJREVCVUdfUFJJTlQoREVCVUdfTUlOLCAiXHRjbG9zZShzaz0lZClcbiIsc2spOworCisJZXJyb3IgPSBjbG9zZShzayk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJcblxuXHRcdCoqKiBjbG9zZTogJXMgKioqXG5cbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlleGl0KDEpOworCX0KKwlmZmx1c2goc3Rkb3V0KTsKKwlyZXR1cm4gMDsKK30gLyogY2xvc2VfcigpICovCisKK2ludCByZWNlaXZlX3IoaW50IHNrKQoreworCWludCBlcnJvciA9IDA7CisJY2hhciBpbmNtc2dbQ01TR19TUEFDRShzaXplb2YoX3NjdHBfY21zZ19kYXRhX3QpKV07CisJc3RydWN0IGlvdmVjIGlvdjsKKwlzdHJ1Y3QgbXNnaGRyIGlubWVzc2FnZTsKKworCS8qIEluaXRpYWxpemUgaW5tZXNzYWdlIHdpdGggZW5vdWdoIHNwYWNlIGZvciBEQVRBLi4uICovCisJbWVtc2V0KCZpbm1lc3NhZ2UsIDAsIHNpemVvZihpbm1lc3NhZ2UpKTsKKwlpZiAoKGlvdi5pb3ZfYmFzZSA9IG1hbGxvYyhSRUFMTFlfQklHKSkgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlxuXHRcdCoqKiBtYWxsb2Mgbm90IGVub3VnaCBtZW1vcnkhISEgKioqXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworCWlubWVzc2FnZS5tc2dfaW92ID0gJmlvdjsKKwlpbm1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisJLyogb3IgYSBjb250cm9sIG1lc3NhZ2UuICAqLworCWlubWVzc2FnZS5tc2dfY29udHJvbCA9IGluY21zZzsKKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKworCS8qIEdldCB0aGUgbWVzc2FnZXMgc2VudCAqLworCXdoaWxlICgxKSB7CisJCURFQlVHX1BSSU5UKERFQlVHX01JTiwgIlx0cmVjdm1zZyhzaz0lZCkgIiwgc2spOworCisJCWVycm9yID0gcmVjdm1zZyhzaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCQlpZiAoZXJyb3IgPCAwICYmIGVycm5vICE9IEVBR0FJTikgeworCQkJZnByaW50ZihzdGRlcnIsICJcblx0XHQqKiogcmVjdm1zZzogJXMgKioqXG5cbiIsCisJCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCWNsb3NlKHNrKTsKKwkJCWZyZWUoaW92Lmlvdl9iYXNlKTsKKwkJCWV4aXQoMSk7CisJCX0gZWxzZSBpZiAoZXJyb3IgPT0gMCkgeworCQkJcHJpbnRmKCJcblx0XHRyZWN2bXNnKCkgcmV0dXJuZWQgMCAhISEhXG4iKTsKKwkJCWZmbHVzaChzdGRvdXQpOworCQl9CisKKwkJaWYoTVNHX05PVElGSUNBVElPTiAmIGlubWVzc2FnZS5tc2dfZmxhZ3MpCisJCQljb250aW51ZTsgLyogZ290IGEgbm90aWZpY2F0aW9uLi4uICovCisKKwkJaW5tZXNzYWdlLm1zZ19jb250cm9sID0gaW5jbXNnOworCQlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwkJaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworCQlicmVhazsKKwl9CisKKwlmcmVlKGlvdi5pb3ZfYmFzZSk7CisJcmV0dXJuIDA7Cit9IC8qIHJlY2VpdmVfciAoKSAqLworCit2b2lkIHNlcnZlcihpbnQgc2spIHsKKwlpbnQgaTsKKworCWlmIChtYXhfbXNnc2l6ZSA+IERFRkFVTFRfTUFYX1dJTkRPVykgeworCQlpZiAoc2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTT19SQ1ZCVUYsICZtYXhfbXNnc2l6ZSwKKwkJCSAgICAgICBzaXplb2YobWF4X21zZ3NpemUpKSA8IDApIHsKKwkJCXBlcnJvcigic2V0c29ja29wdChTT19SQ1ZCVUYpIik7CisJCQlleGl0KDEpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1zZ19jbnQ7IGkrKykgeworCQlyZWNlaXZlX3Ioc2spOworCQlERUJVR19QUklOVChERUJVR19NSU4sICJjb3VudCAlZFxuIiwgaSsxKTsKKwl9Cit9IC8qIHNlcnZlcigpICovCisKK3ZvaWQgKiBidWlsZF9tc2coaW50IGxlbikgeworCWludCBpID0gbGVuIC0gMTsKKwlpbnQgbjsKKwljaGFyICptc2dfYnVmLCAqcDsKKworCW1zZ19idWYgPSBtYWxsb2MobGVuKTsKKwlpZiAoTlVMTCA9PSBtc2dfYnVmKSB7CisJCWZwcmludGYoc3RkZXJyLCAiXG5cdFx0KioqIG1hbGxvYyBub3QgZW5vdWdoIG1lbW9yeSEhISAqKipcbiIpOworCQlleGl0KDEpOworCX0KKwlwID0gbXNnX2J1ZjsKKworCWRvIHsKKwkJbiA9ICgoaSA+IDUwKT81MDppKTsKKwkJbWVtY3B5KHAsIG1zZywgKChpID4gNTApPzUwOmkpKTsKKwkJcCArPSBuOworCQlpIC09IG47CisJfSB3aGlsZSAoaSA+IDApOworCisJbXNnX2J1ZltsZW4tMV0gPSAnXDAnOworCisJcmV0dXJuKG1zZ19idWYpOworCit9IC8qIGJ1aWxkX21zZygpICovCisKK2ludCBzZW5kX3IoaW50IHNrLCBpbnQgc3RyZWFtLCBpbnQgb3JkZXIsIGludCBzZW5kX3NpemUsIGludCBhc3NvY19pKSB7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1Y3QgbXNnaGRyIG91dG1zZzsKKwlzdHJ1Y3QgaW92ZWMgaW92OworCWNoYXIgKm1lc3NhZ2UgPSBOVUxMOworCWludCBtc2dsZW4gPSAwOworCWNoYXIgb3V0Y21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSldOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvOworCisJaWYgKHNlbmRfc2l6ZSA+IDApIHsKKwkJbWVzc2FnZSA9IGJ1aWxkX21zZyhzZW5kX3NpemUpOworCQltc2dsZW4gPSBzdHJsZW4obWVzc2FnZSkgKyAxOworCQlpb3YuaW92X2Jhc2UgPSBtZXNzYWdlOworCQlpb3YuaW92X2xlbiA9IG1zZ2xlbjsKKwl9IGVsc2UgeworCQkJZXhpdCgxKTsKKwl9CisKKwlvdXRtc2cubXNnX25hbWUgPSAmc19yZW07CisJb3V0bXNnLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKTsKKwlvdXRtc2cubXNnX2lvdiA9ICZpb3Y7CisJb3V0bXNnLm1zZ19pb3ZsZW4gPSAxOworCW91dG1zZy5tc2dfY29udHJvbCA9IG91dGNtc2c7CisJb3V0bXNnLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKG91dGNtc2cpOworCW91dG1zZy5tc2dfZmxhZ3MgPSAwOworCisJY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1zZyk7CisJY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKKwljbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKwljbXNnLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisKKwlvdXRtc2cubXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKKwlzaW5mbyA9IChzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICopQ01TR19EQVRBKGNtc2cpOworCW1lbXNldChzaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlzaW5mby0+c2luZm9fcHBpZCA9IHJhbmQoKTsKKwlzaW5mby0+c2luZm9fc3RyZWFtID0gc3RyZWFtOworCXNpbmZvLT5zaW5mb19mbGFncyA9IDA7CisJaWYgKCFvcmRlcikKKwkJc2luZm8tPnNpbmZvX2ZsYWdzID0gU0NUUF9VTk9SREVSRUQ7CisKKwlERUJVR19QUklOVChERUJVR19NSU4sICJcdHNlbmRtc2coc2s9JWQsIGFzc29jPSVkKSAlNGQgYnl0ZXMuXG4iLAorCQkgICAgc2ssIGFzc29jX2ksIHNlbmRfc2l6ZSk7CisJREVCVUdfUFJJTlQoREVCVUdfTUFYLCAiXHQgIFNORFJDViIpOworCWlmIChERUJVR19NQVggPT0gZGVidWdfbGV2ZWwpIHsKKwkJcHJpbnRmKCIoc3RyZWFtPSV1ICIsIAlzaW5mby0+c2luZm9fc3RyZWFtKTsKKwkJcHJpbnRmKCJmbGFncz0weCV4ICIsCXNpbmZvLT5zaW5mb19mbGFncyk7CisJCXByaW50ZigicHBpZD0ldSlcbiIsCXNpbmZvLT5zaW5mb19wcGlkKTsKKwl9CisKKwkvKiBTZW5kIHRvIG91ciBuZWlnaGJvci4gICovCisJZXJyb3IgPSBzZW5kbXNnKHNrLCAmb3V0bXNnLCBNU0dfV0FJVEFMTCk7CisJaWYgKGVycm9yICE9IG1zZ2xlbikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlxuXHRcdCoqKiBzZW5kbXNnOiAlcyAqKipcblxuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCWZmbHVzaChzdGRvdXQpOworCQlleGl0KDEpOworCX0KKworCWlmIChzZW5kX3NpemUgPiAwKSBmcmVlKG1lc3NhZ2UpOworCXJldHVybiAwOworfSAvKiBzZW5kX3IoKSAqLworCitpbnQgbmV4dF9vcmRlcihpbnQgc3RhdGUsIGludCBwYXR0ZXJuKQoreworCXN3aXRjaCAocGF0dGVybil7CisJY2FzZSBPUkRFUl9QQVRURVJOX1VOT1JERVJFRDoKKwkJc3RhdGUgPSAwOworCQlicmVhazsKKwljYXNlIE9SREVSX1BBVFRFUk5fT1JERVJFRDoKKwkJc3RhdGUgPSAxOworCQlicmVhazsKKwljYXNlIE9SREVSX1BBVFRFUk5fQUxURVJOQVRFOgorCQlzdGF0ZSA9IHN0YXRlID8gMCA6IDE7CisJCWJyZWFrOworCWNhc2UgT1JERVJfUEFUVEVSTl9SQU5ET006CisJCXN0YXRlID0gcmFuZCgpICUgMjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXRlOworfQorCitpbnQgbmV4dF9zdHJlYW0oaW50IHN0YXRlLCBpbnQgcGF0dGVybikKK3sKKwlzd2l0Y2ggKHBhdHRlcm4peworCWNhc2UgU1RSRUFNX1BBVFRFUk5fUkFORE9NOgorCQlzdGF0ZSA9IHJhbmQoKSAlIG1heF9zdHJlYW07CisJCWJyZWFrOworCWNhc2UgU1RSRUFNX1BBVFRFUk5fU0VRVUVOVElBTDoKKwkJc3RhdGUgPSBzdGF0ZSArIDE7CisJCWlmIChzdGF0ZSA+PSBtYXhfc3RyZWFtKQorCQkJc3RhdGUgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdGU7Cit9CisKK2ludCBuZXh0X21zZ19zaXplKGludCBtc2dfY250KQoreworCWludCBtc2dfc2l6ZTsKKworCWlmIChzaXplX2FyZykgeworCQltc2dfc2l6ZSA9IHNpemVfYXJnOworCX0gZWxzZSB7CisJCW1zZ19zaXplID0gKHJhbmQoKSAlIG1heF9tc2dzaXplKSArIDE7CisJfQorCisJcmV0dXJuIG1zZ19zaXplOworCit9IC8qIG5leHRfbXNnX3NpemUoKSAqLworCit2b2lkIGNsaWVudChpbnQgc2spIHsKKwlpbnQgbXNnX3NpemU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnX2NudDsgaSsrKSB7CisJCW1zZ19zaXplID0gbmV4dF9tc2dfc2l6ZShpKTsKKwkJb3JkZXJfc3RhdGUgPSBuZXh0X29yZGVyKG9yZGVyX3N0YXRlLCBvcmRlcl9wYXR0ZXJuKTsKKwkJc3RyZWFtX3N0YXRlID0gbmV4dF9zdHJlYW0oc3RyZWFtX3N0YXRlLCBzdHJlYW1fcGF0dGVybik7CisKKwkJaWYgKHNlbmRfcihzaywgc3RyZWFtX3N0YXRlLCBvcmRlcl9zdGF0ZSwgbXNnX3NpemUsIDApIDwgMCkgeworCQkJY2xvc2Uoc2spOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBUaGUgc2VuZGVyIGlzIGVjaG9pbmcgc28gZG8gZGlzY2FyZCB0aGUgZWNob2VkIGRhdGEuICovCisJCWlmIChkcmFpbiAmJiAoKGkgKyAxKSAlIHBlcmlvZCA9PSAwKSkgeworCQkJcmVjZWl2ZV9yKHNrKTsKKwkJfQorCX0KK30gLyogY2xpZW50KCkgKi8KKwordm9pZCBzdGFydF90ZXN0KGludCByb2xlKSB7CisJaW50IHNrLCBwaWQsIHJldDsKKwlpbnQgaSA9IDA7CisKKwlERUJVR19QUklOVChERUJVR19OT05FLCAiXG5TdGFydGluZyB0ZXN0cy4uLlxuIik7CisKKwlyZXBlYXRfY291bnQgPSByZXBlYXQ7CisKKwlERUJVR19QUklOVChERUJVR19NSU4sICJcdHNvY2tldChTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKSIpOworCisJaWYgKChzayA9IHNvY2tldChzX2xvYy5zc19mYW1pbHksIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApKSA8IDAgKSB7CisJCWZwcmludGYoc3RkZXJyLCAiXG5cblx0XHQqKiogc29ja2V0OiBmYWlsZWQgdG8gY3JlYXRlIgorCQkJIiBzb2NrZXQ6ICAlcyAqKipcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCURFQlVHX1BSSU5UKERFQlVHX01JTiwgIiAgLT4gIHNrPSVkXG4iLCBzayk7CisKKwliaW5kX3Ioc2ssICZzX2xvYyk7CisKKwlpZiAocm9sZSA9PSBTRVJWRVIpIHsKKwkJbGlzdGVuX3Ioc2ssIDEpOworCQlhY2NlcHRfcihzayk7CisJfSBlbHNlIHsKKwkJaWYgKG1heF9zdHJlYW0gPiAwKSB7CisJCQlzdHJ1Y3Qgc2N0cF9pbml0bXNnIGluaXRtc2c7CisKKwkJCW1lbXNldCgmaW5pdG1zZywgMCwgc2l6ZW9mKGluaXRtc2cpKTsKKwkJCWluaXRtc2cuc2luaXRfbnVtX29zdHJlYW1zID0gbWF4X3N0cmVhbTsKKwkJCWluaXRtc2cuc2luaXRfbWF4X2luc3RyZWFtcyA9IG1heF9zdHJlYW07CisJCQlpbml0bXNnLnNpbml0X21heF9hdHRlbXB0cyA9IDM7CisKKwkJCXJldCA9IHNldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9JTklUTVNHLAorCQkJCQkgJmluaXRtc2csIHNpemVvZihpbml0bXNnKSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXBlcnJvcigic2V0c29ja29wdChTQ1RQX0lOSVRNU0cpIik7CisJCQkJZXhpdCgwKTsKKwkJCX0KKwkJfQorCisJCWNvbm5lY3RfcihzaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzX3JlbSwgcl9sZW4pOworCX0KKworCWlmICgocGlkID0gZm9yaygpKSA9PSAwKSB7CisJCXNldHRpbWVyaGFuZGxlKCk7CisJCXByaW50c3RhdHVzKGdzayk7CisJCXdoaWxlKDEpOworCX0gZWxzZSB7CisJCWlmICghZGVidWdfbGV2ZWwpIHsKKwkJCXByaW50ZigiICAgICAiKTsKKwkJfQorCisJCWZvcihpID0gMDsgaSA8IHJlcGVhdF9jb3VudDsgaSsrKSB7CisKKwkJCWlmIChyb2xlID09IFNFUlZFUikgeworCQkJCURFQlVHX1BSSU5UKERFQlVHX05PTkUsICJTZXJ2ZXI6IFJlY2VpdmluZyBwYWNrZXRzLiglZC8lZClcbiIsCisJCQkJCWkrMSwgcmVwZWF0X2NvdW50KTsKKwkJCQlzZXJ2ZXIoZ3NrKTsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUdfUFJJTlQoREVCVUdfTk9ORSwgIkNsaWVudDogU2VuZGluZyBwYWNrZXRzLiglZC8lZClcbiIsCisJCQkJCWkrMSwgcmVwZWF0X2NvdW50KTsKKwkJCQljbGllbnQoc2spOworCQkJfQorCisJCQlmZmx1c2goc3Rkb3V0KTsKKwkJfQorCisJCWlmIChyb2xlID09IFNFUlZFUikgY2xvc2Vfcihnc2spOworCQljbG9zZV9yKHNrKTsKKwl9Cit9IC8qIHN0YXJ0X3Rlc3QoKSAqLworCit2b2lkIHNldHRpbWVyaGFuZGxlKHZvaWQpIHsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKKwlzdHJ1Y3QgaXRpbWVydmFsIGludGVydmFsOworCisJYWN0LnNhX2hhbmRsZXIgPSBzaWdoYW5kbGVyOworCWFjdC5zYV9mbGFncyA9IDA7CisJc2lnZW1wdHlzZXQoJmFjdC5zYV9tYXNrKTsKKwlzaWdhY3Rpb24oU0lHUFJPRiwgJmFjdCwgTlVMTCk7CisKKwlpbnRlcnZhbC5pdF92YWx1ZS50dl9zZWMgPSBERUZBVUxUX1NFQzsKKwlpbnRlcnZhbC5pdF92YWx1ZS50dl91c2VjID0gREVGQVVMVF9VU0VDOworCWludGVydmFsLml0X2ludGVydmFsID0gaW50ZXJ2YWwuaXRfdmFsdWU7CisKKwlzZXRpdGltZXIoSVRJTUVSX1BST0YsICZpbnRlcnZhbCwgTlVMTCk7Cit9CisKK3ZvaWQgdXNhZ2UoY2hhciAqYXJndjApIHsKKwlmcHJpbnRmKHN0ZGVyciwgIlxudXNhZ2U6XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgc2VydmVyOlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICU4cyAtSCBsb2NhbC1hZGRyIC1QIGxvY2FsLXBvcnQgLWwgWy1kIGxldmVsXSBbLXhdXG4iCisJCQkiXHQgICAgICBbLUwgbnVtLXBvcnRzXSBbLVMgbnVtLXBvcnRzXVxuIgorCQkJIlx0ICAgICAgWy1hIGFzc29jLXBhdHRlcm5dXG4iCisJCQkiXHQgICAgICBbLWkgaW50ZXJmYWNlXVxuIgorCQkJIlx0ICAgICAgWy1mIHN0YXR1cy1maWxlXVxuIiwKKwkJYXJndjApOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgY2xpZW50OlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICU4cyAtSCBsb2NhbC1hZGRyIC1QIGxvY2FsLXBvcnQgLWggcmVtb3RlLWFkZHJcbiIKKwkJIlx0ICAgICAgLXAgcmVtb3RlLXBvcnQgLXMgWy1jIGNhc2UgXSBbLWQgbGV2ZWxdXG4iCisJCSJcdCAgICAgIFsteCByZXBlYXRdIFstbyBvcmRlci1wYXR0ZXJuXSByZWFtLXBhdHRlcm5dXG4iCisJCSJcdCAgICAgIFstTSBtYXgtc3RyZWFtXVxuIgorCQkiXHQgICAgICBbLW0gbWF4LW1zZ3NpemVdXG4iCisJCSJcdCAgICAgIFstTCBudW0tcG9ydHNdIFstUyBudW0tcG9ydHNdXG4iCisJCSJcdCAgICAgIFstaSBpbnRlcmZhY2VdXG4iCisJCSJcdCAgICAgIFstZiBzdGF0dXMtZmlsZV1cbiIsCisJCWFyZ3YwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1jIHZhbHVlID0gUGFja2V0cyBvZiBzcGVjaWZlZCBzaXplLlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1tIG1zZ3NpemUoMTUwMC02NTUxNSwgZGVmYXVsdCB2YWx1ZSAzMjc2OClcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQteCBudW1iZXIgb2YgcmVwZWF0c1xuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1YIG51bWJlciBvZiBtZXNzYWdlc1xuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1vIG9yZGVyLXBhdHRlcm5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICAwID0gYWxsIHVub3JkZXJlZChkZWZhdWx0KSBcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICAxID0gYWxsIG9yZGVyZWQgXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgMiA9IGFsdGVybmF0aW5nIFxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdCAgIDMgPSByYW5kb21cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtTSBtYXgtc3RyZWFtIChkZWZhdWx0IHZhbHVlIDApXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LUQgZHJhaW4uIElmIGluIGNsaWVudCBtb2RlIGRvIGEgcmVhZCBmb2xsb3dpbmcgc2VuZC5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtSSByZWNlaXZlIGFmdGVyIDxuPiB0aW1lcyBvZiBzZW5kLCBkZWZhdWx0IHZhbHVlIDEuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZmZsdXNoKHN0ZGVycik7CisKK30gLyogdXNhZ2UoKSAqLworCit2b2lkIHNpZ2hhbmRsZXIoaW50IHNpZ25vKSB7CisJREVCVUdfUFJJTlQoREVCVUdfTUFYLCAidGltZW91dCBzaWdcbiIpOworCXByaW50c3RhdHVzKGdzayk7Cit9CisKK2NoYXIqIGdldF9zc3RhdF9zdGF0ZShpbnQgc3RhdGUpIHsKKwlzd2l0Y2goc3RhdGUpIHsKKwljYXNlIFNDVFBfRU1QVFk6CisJCXJldHVybiAiRU1QVFkiOworCWNhc2UgU0NUUF9DTE9TRUQ6CisJCXJldHVybiAiQ0xPU0VEIjsKKwljYXNlIFNDVFBfQ09PS0lFX1dBSVQ6CisJCXJldHVybiAiQ09PS0lFX1dBSVQiOworCWNhc2UgU0NUUF9DT09LSUVfRUNIT0VEOgorCQlyZXR1cm4gIkNPT0tJRV9FQ0hPRUQiOworCWNhc2UgU0NUUF9FU1RBQkxJU0hFRDoKKwkJcmV0dXJuICJFU1RBQkxJU0hFRCI7CisJY2FzZSBTQ1RQX1NIVVRET1dOX1BFTkRJTkc6CisJCXJldHVybiAiU0hVVERPV05fUEVORElORyI7CisJY2FzZSBTQ1RQX1NIVVRET1dOX1NFTlQ6CisJCXJldHVybiAiU0hVVERPV05fU0VOVCI7CisJY2FzZSBTQ1RQX1NIVVRET1dOX1JFQ0VJVkVEOgorCQlyZXR1cm4gIlNIVVRET1dOX1JFQ0VJVkVEIjsKKwljYXNlIFNDVFBfU0hVVERPV05fQUNLX1NFTlQ6CisJCXJldHVybiAiU0hVVERPV05fQUNLX1NFTlQiOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XIjsKKwl9Cit9CisKK3ZvaWQgcHJpbnRzdGF0dXMoaW50IHNrKSB7CisJc3RhdGljIGludCBjd25kID0gMDsKKwlzdGF0aWMgaW50IGNvdW50ID0gMDsKKwlzdHJ1Y3Qgc2N0cF9zdGF0dXMgc3RhdHVzOworCXNvY2tsZW5fdCBvcHRsZW47CisJRklMRSAqIGZwOworCWNvbnN0IGNoYXIgKnN0YXRlX3RvX3N0cltdID0geworCQlbU0NUUF9JTkFDVElWRV0JCT0JIklOQUNUSVZFIiwKKwkJW1NDVFBfUEZdCQk9CSJQRiIsCisJCVtTQ1RQX0FDVElWRV0JCT0JIkFDVElWRSIsCisJCVtTQ1RQX1VOQ09ORklSTUVEXQk9CSJVTkNPTkZJUk1FRCIsCisJfTsKKworCW9wdGxlbiA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9zdGF0dXMpOworCWlmKGdldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9TVEFUVVMsICZzdGF0dXMsICZvcHRsZW4pIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGdldHRpbmcgc3RhdHVzOiAlcy5cbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKHN0YXR1c2ZpbGUgIT0gTlVMTCkgeworCQlpZiAoY291bnQgPT0gMCkKKwkJCXVubGluayhzdGF0dXNmaWxlKTsKKworCQlpZigoZnAgPSBmb3BlbihzdGF0dXNmaWxlLCAiYSsiKSkgPT0gTlVMTCkgeworCQkJcGVycm9yKCJmb3BlbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCX0gZWxzZQorCQlmcCA9IHN0ZG91dDsKKworCWlmIChjb3VudCA9PSAwKQorCQlmcHJpbnRmKGZwLCAiTk8uIEFTU09DLUlEIFNUQVRFICAgICAgICAgICAgIFJXTkQgICAgIFVOQUNLREFUQSBQRU5EREFUQSBJTlNUUk1TIE9VVFNUUk1TICIKKwkJCQkiRlJBRy1QT0lOVCBTUElORk8tU1RBVEUgU1BJTkZPLUNXRE4gU1BJTkZPLVNSVFQgU1BJTkZPLVJUTyBTUElORk8tTVRVXG4iKTsKKworCWlmIChjd25kICE9IHN0YXR1cy5zc3RhdF9wcmltYXJ5LnNwaW5mb19jd25kKSB7CisJCWNvdW50Kys7CisKKwkJZnByaW50ZihmcCwgIiUtM2QgJS04ZCAlLTE3cyAlLThkICUtOWQgJS04ZCAlLTdkICUtOGQgJS0xMGQgJS0xMnMgJS0xMWQgJS0xMWQgJS0xMGQgJWRcbiIsIGNvdW50LAorCQkJCXN0YXR1cy5zc3RhdF9hc3NvY19pZCwgZ2V0X3NzdGF0X3N0YXRlKHN0YXR1cy5zc3RhdF9zdGF0ZSksCisJCQkJc3RhdHVzLnNzdGF0X3J3bmQsIHN0YXR1cy5zc3RhdF91bmFja2RhdGEsIHN0YXR1cy5zc3RhdF9wZW5kZGF0YSwKKwkJCQlzdGF0dXMuc3N0YXRfaW5zdHJtcywgc3RhdHVzLnNzdGF0X291dHN0cm1zLCBzdGF0dXMuc3N0YXRfZnJhZ21lbnRhdGlvbl9wb2ludCwKKwkJCQlzdGF0ZV90b19zdHJbc3RhdHVzLnNzdGF0X3ByaW1hcnkuc3BpbmZvX3N0YXRlXSwKKwkJCQlzdGF0dXMuc3N0YXRfcHJpbWFyeS5zcGluZm9fY3duZCwgc3RhdHVzLnNzdGF0X3ByaW1hcnkuc3BpbmZvX3NydHQsCisJCQkJc3RhdHVzLnNzdGF0X3ByaW1hcnkuc3BpbmZvX3J0bywgc3RhdHVzLnNzdGF0X3ByaW1hcnkuc3BpbmZvX210dSk7CisJfQorCisJY3duZCA9IHN0YXR1cy5zc3RhdF9wcmltYXJ5LnNwaW5mb19jd25kOworCisJZmZsdXNoKGZwKTsKKworCWlmIChmcCAhPSBzdGRvdXQpCisJCWZjbG9zZShmcCk7CisKKwlpZiAoc3RhdHVzLnNzdGF0X3ByaW1hcnkuc3BpbmZvX3N0YXRlICE9IFNDVFBfQUNUSVZFKSB7CisJCWNsb3NlX3Ioc2spOworCQlleGl0KDEpOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9hcHBzL3NjdHBfdGVzdC5jIGIvc3JjL2FwcHMvc2N0cF90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q3NjU0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9hcHBzL3NjdHBfdGVzdC5jCkBAIC0wLDAgKzEsMTg1MiBAQAorLyogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24KKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEsIDIwMDMKKyAqIENvcHlyaWdodCAoYykgMTk5OSBDaXNjbworICogQ29weXJpZ2h0IChjKSAxOTk5LCAyMDAwLCAyMDAxIE1vdG9yb2xhCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBOb2tpYQorICogQ29weXJpZ2h0IChjKSAyMDAxIExhIE1vbnRlIEguUC4gWWFycm9sbAorICoKKyAqIFRoaXMgaXMgYSB1c2Vyc3BhY2UgdGVzdCBhcHBsaWNhdGlvbiBmb3IgdGhlIFNDVFAga2VybmVsIAorICogaW1wbGVtZW50YXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgSHVpIEh1YW5nICAgICAgICAgPGh1aS5odWFuZ0Bub2tpYS5jb20+CisgKiAgIFNyaWRoYXIgU2FtdWRyYWxhIDxzYW11ZHJhbGFAdXMuaWJtLmNvbT4KKyAqICAgSm9uIEdyaW1tICAgICAgICAgPGpncmltbUB1cy5pYm0uY29tPgorICogICBEYWlzeSBDaGFuZyAgICAgICA8ZGFpc3ljQHVzLmlibS5jb20+CisgKiAgIFJ5YW4gTGF5ZXIJICAgICAgIDxybWxheWVyQHVzLmlibS5jb20+CisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bmV0ZGIuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKworI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCisKKyNkZWZpbmUgUkVBTExZX0JJRyA2NTUzNgorCisjZGVmaW5lIFNFUlZFUiAJCTAKKyNkZWZpbmUgQ0xJRU5UIAkJMQorI2RlZmluZSBNSVhFRCAJCTIKKyNkZWZpbmUgTk9UX0RFRklORUQJNjY2CisKKyNkZWZpbmUgUkVQRUFUIAkJMTAKKyNkZWZpbmUgQklHX1JFUEVBVAkxMDAwMDAwCisjZGVmaW5lIE1BWF9CSU5EX1JFVFJZUyAxMAorI2RlZmluZSBCT0RZU0laRQkxMAorI2RlZmluZSBNU0dfQ05UCQkxMAkvKiBJZiB0aGlzIGlzIGNoYW5nZWQgdGhlIG1zZ19zaXplcyBhcnJheQorCQkJCSAgIG5lZWRzIHRvIGJlIG1vZGlmaWVkIGFjY29yZGluZ2x5LiAgKi8KKworI2RlZmluZSBERUZBVUxUX01BWF9XSU5ET1cgMzI3NjgKKyNkZWZpbmUgREVGQVVMVF9NSU5fV0lORE9XIDE1MDAKKworI2RlZmluZSBERUJVR19OT05FCTAKKyNkZWZpbmUgREVCVUdfTUlOCTEKKyNkZWZpbmUgREVCVUdfTUFYCTIKKworI2RlZmluZSBTVFJFQU1fUEFUVEVSTl9TRVFVRU5USUFMIDAKKyNkZWZpbmUgU1RSRUFNX1BBVFRFUk5fUkFORE9NICAgICAxCisKKyNkZWZpbmUgT1JERVJfUEFUVEVSTl9VTk9SREVSRUQgICAwCisjZGVmaW5lIE9SREVSX1BBVFRFUk5fT1JERVJFRCAgICAgMQorI2RlZmluZSBPUkRFUl9QQVRURVJOX0FMVEVSTkFURSAgIDIKKyNkZWZpbmUgT1JERVJfUEFUVEVSTl9SQU5ET00gICAgICAzCisKKyNkZWZpbmUgQVNTT0NfUEFUVEVSTl9TRVFVRU5USUFMIDAKKyNkZWZpbmUgQVNTT0NfUEFUVEVSTl9SQU5ET00gICAgIDEKKworI2RlZmluZSBOQ0FTRVMgNgorI2RlZmluZSBNQVhfUE9MTF9TS1MgMjU2CisKKyNkZWZpbmUgREVCVUdfUFJJTlQobGV2ZWwsIHByaW50X3RoaXMuLi4pCVwKK3sJCQkJCQlcCisJaWYgKGRlYnVnX2xldmVsID49IGxldmVsKSB7IAkJXAorCQlmcHJpbnRmKHN0ZG91dCwgcHJpbnRfdGhpcyk7IAlcCisJCWZmbHVzaChzdGRvdXQpOyAJCVwKKwl9CQkJCQlcCit9IC8qIERFQlVHX1BSSU5UICovCisKKy8qIENvbnZlbmllbmNlIHN0cnVjdHVyZSB0byBkZXRlcm1pbmUgc3BhY2UgbmVlZGVkIGZvciBjbXNnLiAqLwordHlwZWRlZiB1bmlvbiB7CisgICAgICAgIHN0cnVjdCBzY3RwX2luaXRtc2cgaW5pdDsKKyAgICAgICAgc3RydWN0IHNjdHBfc25kcmN2aW5mbyBzbmRyY3ZpbmZvOworfSBfc2N0cF9jbXNnX2RhdGFfdDsKKworI2lmZGVmIF9fRnJlZUJTRF9fCit0eXBlZGVmIHVuaW9uIHsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICByYXc7CisgICAgICAgIHN0cnVjdCBzY3RwX2luaXRtc2cgICAgIGluaXQ7CisgICAgICAgIHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gIHNuZHJjdjsKK30gc2N0cF9jbXNnX2RhdGFfdDsKKyNlbmRpZgorCisjZGVmaW5lIENNU0dfU1BBQ0VfSU5JVE1TRyAoQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfaW5pdG1zZykpKQorI2RlZmluZSBDTVNHX1NQQUNFX1NORFJDViAoQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpKQorCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHJlbV9wb3J0OworICAgICAgICBpbnQgb3JkZXJfc3RhdGU7CisgICAgICAgIGludCBzdHJlYW1fc3RhdGU7CisJaW50IG1zZ19jbnQ7CisJaW50IG1zZ19zZW50OworCWludCBjeWNsZTsKK30gX2Fzc29jX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGludCBzazsKKyAgICAgICAgaW50IGFzc29jX2k7CisJX2Fzc29jX3N0YXRlICphc3NvY19zdGF0ZTsKK30gX3BvbGxfc2tzOworCitjaGFyICpsb2NhbF9ob3N0ID0gTlVMTDsKK2ludCBsb2NhbF9wb3J0ID0gMDsKK2NoYXIgKnJlbW90ZV9ob3N0ID0gTlVMTDsKK2ludCByZW1vdGVfcG9ydCA9IDA7CisvKiBzdHJ1Y3Qgc29ja2FkZHJfaW4gc19yZW0sIHNfbG9jOyAqLworc3RydWN0IHNvY2thZGRyX3N0b3JhZ2Ugc19yZW0sIHNfbG9jOworaW50IHJfbGVuLCBsX2xlbjsKK2ludCB0ZXN0X2Nhc2UgPSAwOworaW50IHNpemVfYXJnID0gMDsKK2ludCB4ZmxhZyA9IDA7CitpbnQgZGVidWdfbGV2ZWwgPSBERUJVR19NQVg7CitpbnQgZG9fZXhpdCA9IDE7CitpbnQgc3RyZWFtX3BhdHRlcm4gPSBTVFJFQU1fUEFUVEVSTl9TRVFVRU5USUFMOworaW50IHN0cmVhbV9zdGF0ZSA9IDA7CitpbnQgb3JkZXJfcGF0dGVybiA9IE9SREVSX1BBVFRFUk5fVU5PUkRFUkVEOworaW50IG9yZGVyX3N0YXRlID0gMDsKK2ludCBtYXhfc3RyZWFtID0gMDsKK2ludCBzZWVkID0gMDsKK2ludCBtYXhfbXNnc2l6ZSA9IERFRkFVTFRfTUFYX1dJTkRPVzsKK2ludCB0aW1ldG9saXZlID0gMDsKK2ludCBhc3NvY19wYXR0ZXJuID0gQVNTT0NfUEFUVEVSTl9TRVFVRU5USUFMOworaW50IHNvY2tldF90eXBlID0gU09DS19TRVFQQUNLRVQ7CitpbnQgcmVwZWF0X2NvdW50ID0gMDsKK2ludCBsaXN0ZW5lcnMgPSAwOworaW50IHRvc2VuZCA9IDA7CitfcG9sbF9za3MgcG9sbF9za3NbTUFYX1BPTExfU0tTXTsKK2ludCByZXBlYXQgPSBSRVBFQVQ7CitpbnQgbXNnX2NudCA9IE1TR19DTlQ7CitpbnQgZHJhaW4gPSAwOworaW50IHJvbGUgPSBOT1RfREVGSU5FRDsKK3N0cnVjdCBzb2NrYWRkciAqYmluZHhfYWRkX2FkZHJzID0gTlVMTDsKK2ludCBiaW5keF9hZGRfY291bnQgPSAwOworc3RydWN0IHNvY2thZGRyICpjb25uZWN0eF9hZGRycyA9IE5VTEw7CitpbnQgY29ubmVjdHhfY291bnQgPSAwOworaW50IGlmX2luZGV4ID0gMDsKKwordW5zaWduZWQgY2hhciBtc2dbXSA9ICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiOworCitzdGF0aWMgaW50IG1zZ19zaXplc1tOQ0FTRVNdW01TR19DTlRdID0KKwl7ezEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDF9LAorCSB7MTQ1MiwgMjkwNCwgNDM1NiwgMTQ1MiwgMjkwNCwgNDM1NiwgMTQ1MiwgMjkwNCwgNDM1NiwgMTQ1Mn0sCisJIHsxNDUzLCAxNDUzLCAxNDUzLCAxNDUzLCAxNDUzLCAxNDUzLCAxNDUzLCAxNDUzLCAxNDUzLCAxNDUzfSwKKwkgezEsIDE0NTMsIDMyNzY4LCAxLCAxNDUzLCAzMjc2OCwgMSwgMTQ1MywgMzI3NjgsIDF9LAorCSB7MSwgMTAwMCwgMjAwMCwgMzAwMCwgNTAwMCwgMTAwMDAsIDE1MDAwLCAyMDAwMCwgMjUwMDAsIDMyNzY4fSwKKwkgezMyNzY4LCAzMjc2OCwgMzI3NjgsIDMyNzY4LCAzMjc2OCwgMzI3NjgsIDMyNzY4LCAzMjc2OCwgMzI3NjgsIDMyNzY4fSwKKwl9OworCitzdGF0aWMgY29uc3QgY2hhciAqc2FjX3N0YXRlX3RibFtdID0geworCSJDT01NVU5JQ0FUSU9OX1VQIiwKKwkiQ09NTVVOSUNBVElPTl9MT1NUIiwKKwkiUkVTVEFSVCIsCisJIlNIVVRET1dOX0NPTVBMRVRFIiwKKwkiQ0FOVF9TVEFSVF9BU1NPQ0lDQVRJT04iCit9OworCit2b2lkIHVzYWdlKGNoYXIgKmFyZ3YwKQoreworCWZwcmludGYoc3RkZXJyLCAiXG51c2FnZTpcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICBzZXJ2ZXI6XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgJThzIC1IIGxvY2FsLWFkZHIgLVAgbG9jYWwtcG9ydCAtbCBbLWQgbGV2ZWxdIFsteF1cbiIKKwkJCSJcdCAgICAgIFstTCBudW0tcG9ydHNdIFstUyBudW0tcG9ydHNdXG4iCisJCQkiXHQgICAgICBbLWEgYXNzb2MtcGF0dGVybl1cbiIKKwkJCSJcdCAgICAgIFstaSBpbnRlcmZhY2VdXG4iLAorCQlhcmd2MCk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICBjbGllbnQ6XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgJThzIC1IIGxvY2FsLWFkZHIgLVAgbG9jYWwtcG9ydCAtaCByZW1vdGUtYWRkclxuIgorCQkiXHQgICAgICAtcCByZW1vdGUtcG9ydCAtcyBbLWMgY2FzZSBdIFstZCBsZXZlbF1cbiIKKwkJIlx0ICAgICAgWy14IHJlcGVhdF0gWy1vIG9yZGVyLXBhdHRlcm5dIFstdCBzdHJlYW0tcGF0dGVybl1cbiIKKwkJIlx0ICAgICAgWy1NIG1heC1zdHJlYW1dIFstciByYW5kLXNlZWRdXG4iCisJCSJcdCAgICAgIFstbSBtYXgtbXNnc2l6ZV1cbiIKKwkJIlx0ICAgICAgWy1MIG51bS1wb3J0c10gWy1TIG51bS1wb3J0c11cbiIKKwkJIlx0ICAgICAgWy1hIGFzc29jLXBhdHRlcm5dXG4iCisJCSJcdCAgICAgIFstaSBpbnRlcmZhY2VdXG4iLAorCQlhcmd2MCk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtYSBhc3NvY19wYXR0ZXJuIGluIHRoZSBtaXhlZCBtb2RlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgMCA9IHNlcXVlbnRpYWwgYXNjZW5kaW5nKGRlZmF1bHQpXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgMSA9IHJhbmRvbVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1kIGRlYnVnXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgMCA9IG5vbmVcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICAxID0gbWluKGRlZmF1bHQpXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgMiA9IG1heFxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1jIHRlc3RjYXNlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgMCA9IDEgYnl0ZSBwYWNrZXRzLlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdCAgIDEgPSBTZXF1ZW5jZSBvZiBtdWx0aXBsZXMgb2YgMTQ1MiBieXRlIHBhY2tldHMuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgICAgICgxNDUyIGlzIGZyYWdtZW50YXRpb24gcG9pbnQgZm9yIGFuIGkvZiB3aXRoICIpOworCWZwcmludGYoc3RkZXJyLCAiMTUwMCBhcyBtdHUuKVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdCAgIDIgPSAxNDUzIGJ5dGUgcGFja2V0cy5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICAgICAgKG1pbi4gc2l6ZSBhdCB3aGljaCBmcmFnbWVudGF0aW9uIG9jY3Vyc1xuIik7CisJZnByaW50ZihzdGRlcnIsICJcdCAgICAgICAgZm9yIGFuIGkvZiB3aXRoIDE1MDAgYXMgbXR1LilcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICAzID0gU2VxdWVuY2Ugb2YgMSwgMTQ1MywgMzI3NjggYnl0ZSBwYWNrZXRzLlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdCAgIDQgPSBTZXF1ZW5jZSBvZiBmb2xsb3dpbmcgc2l6ZSBwYWNrZXRzLlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdCAgICAgICAoMSwgMTAwMCwgMjAwMCwgMzAwMCwgNTAwMCwgMTAwMDAsIik7CisJZnByaW50ZihzdGRlcnIsICIxNTAwMCwgMjAwMDAsIDI1MDAwLCAzMjc2OClcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICA1ID0gMzI3NjggYnl0ZSBwYWNrZXRzLlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdCAgICAgICAoZGVmYXVsdCBtYXggcmVjZWl2ZSB3aW5kb3cgc2l6ZS4pXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgNiA9IHJhbmRvbSBzaXplIHBhY2tldHMuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgLXZlIHZhbHVlID0gUGFja2V0cyBvZiBzcGVjaWZlZCBzaXplLlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1tIG1heCBtc2dzaXplIGZvciBvcHRpb24gLWMgNiAoMTUwMC02NTUxNSwgZGVmYXVsdCB2YWx1ZSAzMjc2OClcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQteCBudW1iZXIgb2YgcmVwZWF0c1xuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1vIG9yZGVyLXBhdHRlcm5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICAwID0gYWxsIHVub3JkZXJlZChkZWZhdWx0KSBcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICAxID0gYWxsIG9yZGVyZWQgXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgMiA9IGFsdGVybmF0aW5nIFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXHQgICAzID0gcmFuZG9tXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LXQgc3RyZWFtLXBhdHRlcm5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICAwID0gc2VxdWVudGlhbCBhc2NlbmRpbmcoZGVmYXVsdClcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICAxID0gcmFuZG9tXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LU0gbWF4LXN0cmVhbSAoZGVmYXVsdCB2YWx1ZSAwKVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1yIHNlZWQgKGRlZmF1bHQgMCwgdXNlIHRpbWUoKSlcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtTCBudW0tcG9ydHMgKGRlZmF1bHQgdmFsdWUgMCkuIFJ1biB0aGUgbWl4ZWQgbW9kZVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1TIG51bS1wb3J0cyAoZGVmYXVsdCB2YWx1ZSAwKS4gUnVuIHRoZSBtaXhlZCBtb2RlXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LUQgZHJhaW4uIElmIGluIGNsaWVudCBtb2RlIGRvIGEgcmVhZCBmb2xsb3dpbmcgc2VuZC5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtVCB1c2UgU09DS19TVFJFQU0gdGNwLXN0eWxlIHNvY2tldHMuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LUIgYWRkIHRoZSBzcGVjaWZpZWQgYWRkcmVzcyhlcykgYXMgYWRkaXRpb25hbCBiaW5kXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgYWRkcmVzc2VzIG9mIHRoZSBsb2NhbCBzb2NrZXQuIE11bHRpcGxlIGFkZHJlc3NlcyBjYW5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICBiZSBzcGVjaWZpZWQgYnkgdXNpbmcgdGhpcyBhcmd1bWVudCBtdWx0aXBsZSB0aW1lcy5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICBGb3IgZXhhbXBsZSwgJy1CIDEwLjAuMC4xIC1CIDIwLjAuMC4yJy5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICBJbiBjYXNlIG9mIElQdjYgbGlua2xvY2FsIGFkZHJlc3MsIGludGVyZmFjZSBuYW1lIGNhbiBiZSBzZXQgaW4gZm9sbG93aW5nIHdheSBcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQgICBGb3IgZXhhbXBsZSwgJy1CIGZlODA6OmY4YzM6Yjc3Zjo2OThlOjQ1MDYlJWV0aDInLlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1DIHVzZSB0aGUgc3BlY2lmaWVkIGFkZHJlc3MoZXMpIGZvciBjb25uZWN0aW9uIHRvIHRoZVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdCAgIHBlZXIgc29ja2V0LiBNdWx0aXBsZSBhZGRyZXNzZXMgY2FuIGJlIHNwZWNpZmllZCBieVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdCAgIHVzaW5nIHRoaXMgYXJndW1lbnQgbXVsdGlwbGUgdGltZXMuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgRm9yIGV4YW1wbGUsICctQyAxMC4wLjAuMSAtQyAyMC4wLjAuMicuXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0ICAgVGhpcyBvcHRpb24gaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIC1oIG9wdGlvbi5cbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtTyB0aW1lIHRvIGxpdmUgKGRlZmF1bHQgdmFsdWUgMClcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwlmZmx1c2goc3RkZXJyKTsKKworfSAvKiB1c2FnZSgpICovCisKK3ZvaWQgKgorYnVpbGRfbXNnKGludCBsZW4pCit7CisJaW50IGkgPSBsZW4gLSAxOworCWludCBuOworCWNoYXIgKm1zZ19idWYsICpwOworCisJbXNnX2J1ZiA9IG1hbGxvYyhsZW4pOworCWlmIChOVUxMID09IG1zZ19idWYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJcblx0XHQqKiogbWFsbG9jIG5vdCBlbm91Z2ggbWVtb3J5ISEhICoqKlxuIik7CisJCWV4aXQoMSk7CisJfQorCXAgPSBtc2dfYnVmOworCisJZG8geworCQluID0gKChpID4gNTApPzUwOmkpOworCQltZW1jcHkocCwgbXNnLCAoKGkgPiA1MCk/NTA6aSkpOworCQlwICs9IG47CisJCWkgLT0gbjsKKwl9IHdoaWxlIChpID4gMCk7CisKKwltc2dfYnVmW2xlbi0xXSA9ICdcMCc7CisKKwlyZXR1cm4obXNnX2J1Zik7CisKK30gLyogYnVpbGRfbXNnKCkgKi8KKworc3RhdGljIGludAorcHJpbnRfY21zZyhpbnQgdHlwZSwgc2N0cF9jbXNnX2RhdGFfdCAqZGF0YSkKK3sKKyAgICAgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgICAgY2FzZSBTQ1RQX0lOSVQ6CisJCURFQlVHX1BSSU5UKERFQlVHX01BWCwgIlx0SU5JVFxuIik7CisJCWlmIChERUJVR19NQVggPT0gZGVidWdfbGV2ZWwpIHsKKwkJCXByaW50ZigiXHRcdHNpbml0X251bV9vc3RyZWFtcz0lZCAiLAorCQkJICAgICAgIGRhdGEtPmluaXQuc2luaXRfbnVtX29zdHJlYW1zKTsKKyAgICAgICAgICAgICAgICAJcHJpbnRmKCJzaW5pdF9tYXhfaW5zdHJlYW1zPSVkICIsCisJCQkgICAgICAgZGF0YS0+aW5pdC5zaW5pdF9tYXhfaW5zdHJlYW1zKTsKKwkgICAgICAgICAgICAgICAgcHJpbnRmKCJzaW5pdF9tYXhfYXR0ZW1wdHM9JWQgIiwKKwkJCSAgICAgICBkYXRhLT5pbml0LnNpbml0X21heF9hdHRlbXB0cyk7CisgICAgICAgIAkgICAgICAgIHByaW50Zigic2luaXRfbWF4X2luaXRfdGltZW89JWRcbiIsCisJCQkgICAgICAgZGF0YS0+aW5pdC5zaW5pdF9tYXhfaW5pdF90aW1lbyk7CisJCX0KKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU0NUUF9TTkRSQ1Y6CisJCURFQlVHX1BSSU5UKERFQlVHX01BWCwgIlx0ICBTTkRSQ1YiKTsKKwkJaWYgKERFQlVHX01BWCA9PSBkZWJ1Z19sZXZlbCkgeworICAgICAgICAJICAgICAgICBwcmludGYoIihzdHJlYW09JXUgIiwgCWRhdGEtPnNuZHJjdi5zaW5mb19zdHJlYW0pOworICAgICAgICAgICAgICAgIAlwcmludGYoInNzbj0ldSAiLCAJZGF0YS0+c25kcmN2LnNpbmZvX3Nzbik7CisJCQlwcmludGYoInRzbj0ldSAiLCAJZGF0YS0+c25kcmN2LnNpbmZvX3Rzbik7CisJICAgICAgICAgICAgICAgIHByaW50ZigiZmxhZ3M9MHgleCAiLAlkYXRhLT5zbmRyY3Yuc2luZm9fZmxhZ3MpOworICAgICAgICAJICAgICAgICBwcmludGYoInBwaWQ9JXVcbiIsCWRhdGEtPnNuZHJjdi5zaW5mb19wcGlkKTsKKwkJCXByaW50ZigiY3VtdHNuPSV1XG4iLCAgIGRhdGEtPnNuZHJjdi5zaW5mb19jdW10c24pOworICAgICAgICAgICAgICAgIH0KKwkJYnJlYWs7CisgICAgICAgICBkZWZhdWx0OgorCQlERUJVR19QUklOVChERUJVR19NSU4sICJcdFVua25vd24gdHlwZTogJWRcbiIsIHR5cGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisJZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIHJldHVybiAwOworCit9IC8qIHByaW50X2Ntc2coKSAqLworCisvKiBUaGlzIGZ1bmN0aW9uIHByaW50cyB0aGUgbWVzc2FnZS4gKi8KK3N0YXRpYyBpbnQKK3ByaW50X21lc3NhZ2UoY29uc3QgaW50IHNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBtc2dfbGVuKSB7CisJc3RydWN0IGNtc2doZHIgKnNjbXNnOworCXNjdHBfY21zZ19kYXRhX3QgKmRhdGE7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmICghKE1TR19OT1RJRklDQVRJT04gJiBtc2ctPm1zZ19mbGFncykpIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworCisJCURFQlVHX1BSSU5UKERFQlVHX01JTiwgIkRhdGEgJXp1IGJ5dGVzLiIsIG1zZ19sZW4pOworCQlERUJVR19QUklOVChERUJVR19NQVgsICIgRmlyc3QgJXp1IGJ5dGVzOiAiLAorCQkJCSAgICAobXNnX2xlbiA8IEJPRFlTSVpFKT9tc2dfbGVuOkJPRFlTSVpFKTsKKyAgICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCBldmVyeXRoaW5nIGlzIHByaW50YWJsZSBhbmQgdGhhdCB3ZQorICAgICAgICAgICAgICAgICAqIGFyZSBOVUwgdGVybWluYXRlZC4uLgorICAgICAgICAgICAgICAgICAqLworCQl3aGlsZSAoIG1zZ19sZW4gPiAwICkgeworCQkJY2hhciAqdGV4dCwgdG1wdGV4dFtCT0RZU0laRV07CisJCQlpbnQgbGVuOworCisJCQltZW1zZXQodG1wdGV4dCwgMHgwLCBCT0RZU0laRSk7CisKKwkJCXRleHQgPSBtc2ctPm1zZ19pb3ZbaW5kZXhdLmlvdl9iYXNlOworCQkJbGVuID0gbXNnLT5tc2dfaW92W2luZGV4XS5pb3ZfbGVuOworCisJCQlpZiAobXNnX2xlbiA9PSAxICYmIHRleHRbMF0gPT0gMCkgeworCQkJCURFQlVHX1BSSU5UKERFQlVHX01JTiwgIjxlbXB0eT4gdGV4dFswXT0lZCIsCisJCQkJCSAgICB0ZXh0WzBdKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCBsZW4gPiBtc2dfbGVuICkgeworCQkJCS8qIHRleHRbKGxlbiA9IG1zZ19sZW4pIC0gMV0gPSAnXDAnOyAqLworCQkJCXRleHRbKGxlbiA9IG1zZ19sZW4pXSA9ICdcMCc7CisJCQl9CisKKwkJCWlmICggKG1zZ19sZW4gLT0gbGVuKSA+IDAgKSB7IGluZGV4Kys7IH0KKworCQkJZm9yIChpID0gMDsgaSA8IGxlbiAtIDE7ICsraSkgeworCQkJCWlmICghaXNwcmludCh0ZXh0W2ldKSkgdGV4dFtpXSA9ICcuJzsKKwkJCX0KKworIAkJCXN0cm5jcHkodG1wdGV4dCwgdGV4dCwgQk9EWVNJWkUpOworIAkJCXRtcHRleHRbQk9EWVNJWkUtMV0gPSAnXDAnOworCisJCQlERUJVR19QUklOVChERUJVR19NQVgsICIlcyIsIHRtcHRleHQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIERFQlVHX1BSSU5UKERFQlVHX01JTiwgIlxuIik7CisgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIH0gIGVsc2UgeyAvKiBpZih3ZSBoYXZlIG5vdGlmaWNhdGlvbikgKi8KKwkJc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICpzYWM7CisJCXN0cnVjdCBzY3RwX3NlbmRfZmFpbGVkICpzc2Y7CisJCXN0cnVjdCBzY3RwX3BhZGRyX2NoYW5nZSAqc3BjOworCQlzdHJ1Y3Qgc2N0cF9yZW1vdGVfZXJyb3IgKnNyZTsKKwkJdW5pb24gc2N0cF9ub3RpZmljYXRpb24gKnNucDsKKwkJY2hhciBhZGRyYnVmW0lORVQ2X0FERFJTVFJMRU5dOworCQljb25zdCBjaGFyICphcDsKKwkJc3RydWN0IHNvY2thZGRyX2luICpzaW47CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjY7CisJCWludCBpbmRleCA9IDA7CisKKwkJc25wID0gKHVuaW9uIHNjdHBfbm90aWZpY2F0aW9uICopbXNnLT5tc2dfaW92W2luZGV4XS5pb3ZfYmFzZTsKKworCQlERUJVR19QUklOVChERUJVR19NSU4sICJOb3RpZmljYXRpb246Iik7CisgICAgICAgIAkKKwkJc3dpdGNoIChzbnAtPnNuX2hlYWRlci5zbl90eXBlKSB7CisJCQljYXNlIFNDVFBfQVNTT0NfQ0hBTkdFOgorCQkJCXNhYyA9ICZzbnAtPnNuX2Fzc29jX2NoYW5nZTsKKwkJCQlERUJVR19QUklOVChERUJVR19NSU4sCisJCQkJCSAgICAiIFNDVFBfQVNTT0NfQ0hBTkdFKCVzKVxuIiwKKwkJCQkJICAgIHNhY19zdGF0ZV90Ymxbc2FjLT5zYWNfc3RhdGVdKTsKKwkJCQlERUJVR19QUklOVChERUJVR19NQVgsCisJCQkJCSAgICAiXHRcdChhc3NvY19jaGFuZ2U6IHN0YXRlPSVodSwgIgorCQkJCQkgICAgImVycm9yPSVodSwgaW5zdHI9JWh1ICIKKwkJCQkJICAgICJvdXRzdHI9JWh1KVxuIiwKKwkJCQkJICAgIHNhYy0+c2FjX3N0YXRlLCBzYWMtPnNhY19lcnJvciwKKwkJCQkJICAgIHNhYy0+c2FjX2luYm91bmRfc3RyZWFtcywKKwkJCQkJICAgIHNhYy0+c2FjX291dGJvdW5kX3N0cmVhbXMpOworCQkJCWJyZWFrOworCQkJY2FzZSBTQ1RQX1BFRVJfQUREUl9DSEFOR0U6CisJCQkJc3BjID0gJnNucC0+c25fcGFkZHJfY2hhbmdlOworCQkJCURFQlVHX1BSSU5UKERFQlVHX01JTiwKKwkJCQkJICAgICIgU0NUUF9QRUVSX0FERFJfQ0hBTkdFXG4iKTsKKwkJCQlpZiAoc3BjLT5zcGNfYWFkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJCQkJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKQorCQkJCQkgICAgICAgJnNwYy0+c3BjX2FhZGRyOworCQkJCQlhcCA9IGluZXRfbnRvcChBRl9JTkVULCAmc2luLT5zaW5fYWRkciwKKwkJCQkJCSAgICAgICBhZGRyYnVmLAorCQkJCQkJICAgICAgIElORVQ2X0FERFJTVFJMRU4pOworCQkJCX0gZWxzZSB7CisJCQkJCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKQorCQkJCQkJJnNwYy0+c3BjX2FhZGRyOworCQkJCQlhcCA9IGluZXRfbnRvcChBRl9JTkVUNiwKKwkJCQkJCSAgICAgICAmc2luNi0+c2luNl9hZGRyLAorCQkJCQkJICAgICAgIGFkZHJidWYsCisJCQkJCQkgICAgICAgSU5FVDZfQUREUlNUUkxFTik7CisJCQkJfQorCQkJCURFQlVHX1BSSU5UKERFQlVHX01BWCwKKwkJCQkJICAgICJcdFx0KHBlZXJfYWRkcl9jaGFuZ2U6ICVzICIKKwkJCQkJICAgICJzdGF0ZT0lZCwgZXJyb3I9JWQpXG4iLAorCQkJCQkgICAgYXAsIHNwYy0+c3BjX3N0YXRlLAorCQkJCQkgICAgc3BjLT5zcGNfZXJyb3IpOworCQkJCWJyZWFrOworCQkJY2FzZSBTQ1RQX1NFTkRfRkFJTEVEOgorCQkJCXNzZiA9ICZzbnAtPnNuX3NlbmRfZmFpbGVkOworCQkJCURFQlVHX1BSSU5UKERFQlVHX01JTiwKKwkJCQkJICAgICIgU0NUUF9TRU5EX0ZBSUxFRFxuIik7CisJCQkJREVCVUdfUFJJTlQoREVCVUdfTUFYLAorCQkJCQkgICAgIlx0XHQoc2VuZGZhaWxlZDogbGVuPSVodSAiCisJCQkJCSAgICAiZXJyPSVkKVxuIiwKKwkJCQkJICAgIHNzZi0+c3NmX2xlbmd0aCwgc3NmLT5zc2ZfZXJyb3IpOworCQkJCWJyZWFrOworCQkJY2FzZSBTQ1RQX1JFTU9URV9FUlJPUjoKKwkJCQlzcmUgPSAmc25wLT5zbl9yZW1vdGVfZXJyb3I7CisJCQkJREVCVUdfUFJJTlQoREVCVUdfTUlOLAorCQkJCQkgICAgIiBTQ1RQX1JFTU9URV9FUlJPUlxuIik7CisJCQkJREVCVUdfUFJJTlQoREVCVUdfTUFYLAorCQkJCQkgICAgIlx0XHQocmVtb3RlX2Vycm9yOiBlcnI9JWh1KVxuIiwKKwkJCQkJICAgICBudG9ocyhzcmUtPnNyZV9lcnJvcikpOworCQkJCWJyZWFrOworCQkJY2FzZSBTQ1RQX1NIVVRET1dOX0VWRU5UOgorCQkJCURFQlVHX1BSSU5UKERFQlVHX01JTiwKKwkJCQkJICAgICIgU0NUUF9TSFVURE9XTl9FVkVOVFxuIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCURFQlVHX1BSSU5UKERFQlVHX01JTiwKKwkJCQkJICAgICIgVW5rbm93biB0eXBlOiAlaHVcbiIsCisJCQkJCSAgICBzbnAtPnNuX2hlYWRlci5zbl90eXBlKTsKKwkJCQlicmVhazsKKwkJfQorCisJCWZmbHVzaChzdGRvdXQpOworCQlyZXR1cm4gMTsKKworICAgICAgICB9IC8qIG5vdGlmaWNhdGlvbiByZWNlaXZlZCAqLworCisgICAgICAgIGZvciAoc2Ntc2cgPSBDTVNHX0ZJUlNUSERSKG1zZyk7CisgICAgICAgICAgICAgc2Ntc2cgIT0gTlVMTDsKKyAgICAgICAgICAgICBzY21zZyA9IENNU0dfTlhUSERSKG1zZywgc2Ntc2cpKSB7CisKKwkJZGF0YSA9IChzY3RwX2Ntc2dfZGF0YV90ICopQ01TR19EQVRBKHNjbXNnKTsKKwkJaWYgKGRlYnVnX2xldmVsKSBwcmludF9jbXNnKHNjbXNnLT5jbXNnX3R5cGUsIGRhdGEpOworCX0KKworCisJZmZsdXNoKHN0ZG91dCk7CisgICAgICAgIHJldHVybiAwOworCit9IC8qIHByaW50X21lc3NhZ2UoKSAqLworCitzdHJ1Y3Qgc29ja2FkZHIgKgorYXBwZW5kX2FkZHIoY29uc3QgY2hhciAqcGFybSwgc3RydWN0IHNvY2thZGRyICphZGRycywgaW50ICpyZXRfY291bnQpCit7CisJc3RydWN0IHNvY2thZGRyICpuZXdfYWRkcnMgPSBOVUxMOworCXZvaWQgKmFwdHI7CisJc3RydWN0IHNvY2thZGRyICpzYV9hZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqYjRhcDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpiNmFwOworCXN0cnVjdCBob3N0ZW50ICpoc3Q0ID0gTlVMTDsKKwlzdHJ1Y3QgaG9zdGVudCAqaHN0NiA9IE5VTEw7CisJaW50IGk0ID0gMDsKKwlpbnQgaTYgPSAwOworCWludCBqOworCWludCBvcmlnX2NvdW50ID0gKnJldF9jb3VudDsKKwlpbnQgY291bnQgPSBvcmlnX2NvdW50OworCWNoYXIgKmlwYWRkciA9IHN0cmR1cChwYXJtKTsKKwljaGFyICppZm5hbWU7CisJaW50IGlmaW5kZXggPSAwOworCisJLyogY2hlY2sgdGhlIGludGVyZmFjZS4gKi8KKwlpZm5hbWUgPSBzdHJjaHIoaXBhZGRyLCclJyk7CisJaWYgKGlmbmFtZSkgeworCQkqaWZuYW1lPTA7CisJCWlmbmFtZSsrOworCQlpZmluZGV4ID0gaWZfbmFtZXRvaW5kZXgoaWZuYW1lKTsKKwkJaWYgKCFpZmluZGV4KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImJhZCBpbnRlcmZhY2UgbmFtZTogJXNcbiIsIGlmbmFtZSk7CisJCQlnb3RvIGZpbmFsbHk7CisJCX0KKwl9CisKKwkvKiBHZXQgdGhlIGVudHJpZXMgZm9yIHRoaXMgaG9zdC4gICovCisJaHN0NCA9IGdldGhvc3RieW5hbWUoaXBhZGRyKTsKKwloc3Q2ID0gZ2V0aG9zdGJ5bmFtZTIoaXBhZGRyLCBBRl9JTkVUNik7CisKKwlpZiAoKE5VTEwgPT0gaHN0NCB8fCBoc3Q0LT5oX2xlbmd0aCA8IDEpCisJICAgICYmIChOVUxMID09IGhzdDYgfHwgaHN0Ni0+aF9sZW5ndGggPCAxKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImJhZCBob3N0bmFtZTogJXNcbiIsIGlwYWRkcik7CisJCWdvdG8gZmluYWxseTsKKwl9CisKKwkvKiBGaWd1cmUgb3V0IHRoZSBudW1iZXIgb2YgYWRkcmVzc2VzLiAgKi8KKwlpZiAoTlVMTCAhPSBoc3Q0KSB7CisJCWZvciAoaTQgPSAwOyBOVUxMICE9IGhzdDQtPmhfYWRkcl9saXN0W2k0XTsgKytpNCkgeworCQkJY291bnQrKzsKKwkJfQorCX0KKwlpZiAoTlVMTCAhPSBoc3Q2KSB7CisJCWZvciAoaTYgPSAwOyBOVUxMICE9IGhzdDYtPmhfYWRkcl9saXN0W2k2XTsgKytpNikgeworCQkJY291bnQrKzsKKwkJfQorCX0KKworCS8qIEV4cGFuZCBtZW1vcnkgZm9yIHRoZSBuZXcgYWRkcmVzc2VzLiAgQXNzdW1lIGFsbCB0aGUgYWRkcmVzc2VzCisJICogYXJlIHY2IGFkZHJlc3Nlcy4KKwkgKi8KKwluZXdfYWRkcnMgPSAoc3RydWN0IHNvY2thZGRyICopCisJCXJlYWxsb2MoYWRkcnMsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSAqIGNvdW50KTsKKworCWlmIChOVUxMID09IG5ld19hZGRycykgeworCQljb3VudCA9ICpyZXRfY291bnQ7CisJCWdvdG8gZmluYWxseTsKKwl9CisKKwkvKiBTa2lwIHRoZSBleGlzdGluZyBhZGRyZXNzZXMuICovCisJYXB0ciA9IG5ld19hZGRyczsKKwlmb3IgKGogPSAwOyBqIDwgb3JpZ19jb3VudDsgaisrKSB7CisJCXNhX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopYXB0cjsKKwkJc3dpdGNoKHNhX2FkZHItPnNhX2ZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCQlhcHRyICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJYnJlYWs7CisJCWNhc2UgQUZfSU5FVDY6CisJCQlhcHRyICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY291bnQgPSBvcmlnX2NvdW50OworCQkJZ290byBmaW5hbGx5OworCQl9CisJfQorCisJLyogUHV0IHRoZSBuZXcgYWRkcmVzc2VzIGF3YXkuICAqLworCWlmIChOVUxMICE9IGhzdDQpIHsKKwkJZm9yIChqID0gMDsgaiA8IGk0OyArK2opIHsKKwkJCWI0YXAgPSAoc3RydWN0IHNvY2thZGRyX2luICopYXB0cjsKKwkJCW1lbXNldChiNGFwLCAweDAwLCBzaXplb2YoKmI0YXApKTsKKwkJCWI0YXAtPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJYjRhcC0+c2luX3BvcnQgPSBodG9ucyhsb2NhbF9wb3J0KTsKKwkJCWJjb3B5KGhzdDQtPmhfYWRkcl9saXN0W2pdLCAmYjRhcC0+c2luX2FkZHIsCisJCQkgICAgICBoc3Q0LT5oX2xlbmd0aCk7CisKKwkJCWFwdHIgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCX0gLyogZm9yIChsb29wIHRocm91Z2ggdGhlIG5ldyB2NCBhZGRyZXNzZXMpICovCisJfQorCisJaWYgKE5VTEwgIT0gaHN0NikgeworCQlmb3IgKGogPSAwOyBqIDwgaTY7ICsraikgeworCQkJYjZhcCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYXB0cjsKKwkJCW1lbXNldChiNmFwLCAweDAwLCBzaXplb2YoKmI2YXApKTsKKwkJCWI2YXAtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCQliNmFwLT5zaW42X3BvcnQgPSAgaHRvbnMobG9jYWxfcG9ydCk7CisJCQliNmFwLT5zaW42X3Njb3BlX2lkID0gaWZfaW5kZXg7CisJCQliY29weShoc3Q2LT5oX2FkZHJfbGlzdFtqXSwgJmI2YXAtPnNpbjZfYWRkciwKKwkJCSAgICAgIGhzdDYtPmhfbGVuZ3RoKTsKKwkJCWlmICghaWZpbmRleCkgeworCQkJCWI2YXAtPnNpbjZfc2NvcGVfaWQgPSBpZmluZGV4OworCQkJfQorCisJCQlhcHRyICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJfSAvKiBmb3IgKGxvb3AgdGhyb3VnaCB0aGUgbmV3IHY2IGFkZHJlc3NlcykgKi8KKwl9CisKKyBmaW5hbGx5OgorCWZyZWUoaXBhZGRyKTsKKwkqcmV0X2NvdW50ID0gY291bnQ7CisKKwlyZXR1cm4gbmV3X2FkZHJzOworCit9IC8qIGFwcGVuZF9hZGRyKCkgKi8KKworaW50IHNvY2tldF9yKHZvaWQpCit7CisJc3RydWN0IHNjdHBfZXZlbnRfc3Vic2NyaWJlIHN1YnNjcmliZTsKKwlpbnQgc2ssIGVycm9yOworCisJREVCVUdfUFJJTlQoREVCVUdfTUlOLCAiXHRzb2NrZXQoJXMsIElQUFJPVE9fU0NUUCkiLAorCQkoc29ja2V0X3R5cGUgPT0gU09DS19TRVFQQUNLRVQpID8gIlNPQ0tfU0VRUEFDS0VUIiA6ICJTT0NLX1NUUkVBTSIpOworCisJaWYgKChzayA9IHNvY2tldChzX2xvYy5zc19mYW1pbHksIHNvY2tldF90eXBlLCBJUFBST1RPX1NDVFApKSA8IDAgKSB7CisJCWlmIChkb19leGl0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuXG5cdFx0KioqIHNvY2tldDogZmFpbGVkIHRvIGNyZWF0ZSIKKwkJCQkiIHNvY2tldDogICVzICoqKlxuIiwKKyAgICAgICAgCSAgICAgICAJICAgICAgICBzdHJlcnJvcihlcnJubykpOworCQkJZXhpdCgxKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlERUJVR19QUklOVChERUJVR19NSU4sICIgIC0+ICBzaz0lZFxuIiwgc2spOworCisJbWVtc2V0KCZzdWJzY3JpYmUsIDAsIHNpemVvZihzdWJzY3JpYmUpKTsKKwlzdWJzY3JpYmUuc2N0cF9kYXRhX2lvX2V2ZW50ID0gMTsKKwlzdWJzY3JpYmUuc2N0cF9hc3NvY2lhdGlvbl9ldmVudCA9IDE7CisJZXJyb3IgPSBzZXRzb2Nrb3B0KHNrLCBTT0xfU0NUUCwgU0NUUF9FVkVOVFMsIChjaGFyICopJnN1YnNjcmliZSwKKwkJCSAgIHNpemVvZihzdWJzY3JpYmUpKTsKKwlpZiAoZXJyb3IpIHsKKwkJZnByaW50ZihzdGRlcnIsICJTQ1RQX0VWRU5UUzogZXJyb3I6ICVkXG4iLCBlcnJvcik7CisJCWV4aXQoMSk7CisJfQorICAgICAgICBpZiAobWF4X3N0cmVhbSA+IDApIHsKKyAgICAgICAgCXN0cnVjdCBzY3RwX2luaXRtc2cgaW5pdG1zZzsKKyAgICAgICAgCW1lbXNldCgmaW5pdG1zZywgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX2luaXRtc2cpKTsKKyAgICAgICAgCWluaXRtc2cuc2luaXRfbnVtX29zdHJlYW1zID0gbWF4X3N0cmVhbTsKKyAgICAgICAgCWVycm9yID0gc2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTQ1RQX0lOSVRNU0csICZpbml0bXNnLCBzaXplb2Yoc3RydWN0IHNjdHBfaW5pdG1zZykpOworICAgICAgICAJaWYgKGVycm9yKSB7CisgICAgICAgIAkJZnByaW50ZihzdGRlcnIsICJTQ1RQX0lOSVRNU0c6IGVycm9yOiAlZFxuIiwgZXJyb3IpOworICAgICAgICAJCWV4aXQoMSk7CisgICAgICAgIAl9CisgICAgICAgIH0KKwlyZXR1cm4gc2s7CisKK30gLyogc29ja2V0X3IoKSAqLworCitpbnQgYmluZF9yKGludCBzaywgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKnNhZGRyKQoreworICAgICAgICBpbnQgZXJyb3IgPSAwLCBpID0gMDsKKwljaGFyICpob3N0X3MsICpzZXJ2X3M7CisKKwlpZiAoKGhvc3RfcyA9IG1hbGxvYyhOSV9NQVhIT1NUKSkgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlxuXHRcdCoqKiBob3N0X3MgbWFsbG9jIGZhaWxlZCEhISAqKipcbiIpOworCQlleGl0KDEpOworCX0KKwlpZiAoKHNlcnZfcyA9IG1hbGxvYyhOSV9NQVhTRVJWKSkgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlxuXHRcdCoqKiBzZXJ2X3MgbWFsbG9jIGZhaWxlZCEhISAqKipcbiIpOworCQlleGl0KDEpOworCX0KKworCWRvIHsKKwkJaWYgKGkgPiAwKSBzbGVlcCgxKTsgLyogc2xlZXAgYSB3aGlsZSBiZWZvcmUgbmV3IHRyeS4uLiAqLworCisJCWVycm9yID0gZ2V0bmFtZWluZm8oKHN0cnVjdCBzb2NrYWRkciAqKXNhZGRyLCBsX2xlbiwgaG9zdF9zLAorCQkJCSAgICBOSV9NQVhIT1NULCBzZXJ2X3MsIE5JX01BWFNFUlYsCisJCQkJICAgIE5JX05VTUVSSUNIT1NUKTsKKworCQlpZiAoZXJyb3IpCisJCQlwcmludGYoIiVzXG4iLCBnYWlfc3RyZXJyb3IoZXJyb3IpKTsKKworICAgICAgIAkJREVCVUdfUFJJTlQoREVCVUdfTUlOLAorCQkJICAgICJcdGJpbmQoc2s9JWQsIFthOiVzLHA6JXNdKSAgLS0gIGF0dGVtcHQgJWQvJWRcbiIsCisgICAgICAgCQkJICAgIHNrLCBob3N0X3MsIHNlcnZfcywgaSsxLCBNQVhfQklORF9SRVRSWVMpOworCisgICAgICAgCQllcnJvciA9IGJpbmQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKilzYWRkciwgbF9sZW4pOworCisJICAgICAgICBpZiAoZXJyb3IgIT0gMCkgeworCSAgICAgICAgCWlmKCBlcnJubyAhPSBFQUREUklOVVNFICkgeworCSAgICAgICAgCQlpZiAoZG9fZXhpdCkgeworCSAgICAgICAgCQkgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5cblx0XHQqKipiaW5kOiBjYW4gIgorCQkJCQkJIm5vdCBiaW5kIHRvICVzOiVzOiAlcyAqKioqXG4iLAorCQkJCQkJaG9zdF9zLCBzZXJ2X3MsCisJCQkJCQlzdHJlcnJvcihlcnJubykpOworCQkJCQlleGl0KDEpOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaSsrOworCQlpZiAoaSA+PSBNQVhfQklORF9SRVRSWVMpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiTWF4aW11bSBiaW5kKCkgYXR0ZW1wdHMuICIKKwkJCQkiRGllIG5vdy4uLlxuXG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKyAgICAgICAgfSB3aGlsZSAoZXJyb3IgPCAwICYmIGkgPCBNQVhfQklORF9SRVRSWVMpOworCisJZnJlZShob3N0X3MpOworCWZyZWUoc2Vydl9zKTsKKwlyZXR1cm4gMDsKKworfSAvKiBiaW5kX3IoKSAqLworCitpbnQKK2JpbmR4X3IoaW50IHNrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJzLCBpbnQgY291bnQsIGludCBmbGFnKQoreworCWludCBlcnJvcjsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhX2FkZHI7CisJdm9pZCAqYXB0cjsKKworCS8qIFNldCB0aGUgcG9ydCBpbiBldmVyeSBhZGRyZXNzLiAgKi8KKwlhcHRyID0gYWRkcnM7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJc2FfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhcHRyOworCisJCXN3aXRjaChzYV9hZGRyLT5zYV9mYW1pbHkpIHsKKwkJY2FzZSBBRl9JTkVUOgorCQkJKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYV9hZGRyKS0+c2luX3BvcnQgPQorCQkJCWh0b25zKGxvY2FsX3BvcnQpOworCQkJYXB0ciArPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwkJCWJyZWFrOworCQljYXNlIEFGX0lORVQ2OgorCQkJKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2FfYWRkciktPnNpbjZfcG9ydCA9CisJCQkJaHRvbnMobG9jYWxfcG9ydCk7CisJCQlhcHRyICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGFkZHJlc3MgZmFtaWx5XG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwllcnJvciA9IHNjdHBfYmluZHgoc2ssIGFkZHJzLCBjb3VudCwgZmxhZyk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJcblxuXHRcdCoqKmJpbmR4X3I6IGVycm9yIGFkZGluZyBhZGRyczoiCisJCQkiICVzLiAqKipcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoMSk7CisJfQorCisJcmV0dXJuIDA7CisKK30gLyogYmluZHhfcigpICovCisKK2ludCBsaXN0ZW5fcihpbnQgc2ssIGludCBsaXN0ZW5fY291bnQpCit7CisJaW50IGVycm9yID0gMDsKKwkKKyAgICAgICAgREVCVUdfUFJJTlQoREVCVUdfTUlOLCAiXHRsaXN0ZW4oc2s9JWQsYmFja2xvZz0lZClcbiIsCisJCSAgICBzaywgbGlzdGVuX2NvdW50KTsKKworIAkvKiBNYXJrIHNrIGFzIGJlaW5nIGFibGUgdG8gYWNjZXB0IG5ldyBhc3NvY2lhdGlvbnMgKi8KKyAgICAgICAgZXJyb3IgPSBsaXN0ZW4oc2ssIGxpc3Rlbl9jb3VudCk7CisgICAgICAgIGlmIChlcnJvciAhPSAwKSB7CisgICAgICAgIAlpZiAoZG9fZXhpdCkgeworICAgICAgICAgICAgICAgIAlmcHJpbnRmKHN0ZGVyciwgIlxuXG5cdFx0KioqIGxpc3RlbjogICVzICoqKlxuXG5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIAkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCWV4aXQoMSk7CisJCX0KKwkJZWxzZSByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisKK30gLyogbGlzdGVuX3IoKSAqLworCitpbnQgYWNjZXB0X3IoaW50IHNrKXsKKwlzb2NrbGVuX3QgbGVuID0gMDsKKwlpbnQgc3Vic2s7CisKKwlERUJVR19QUklOVChERUJVR19NSU4sICJcdGFjY2VwdChzaz0lZClcbiIsIHNrKTsKKworCXN1YnNrID0gYWNjZXB0KHNrLCBOVUxMLCAmbGVuKTsKKwlpZiAoc3Vic2sgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiXG5cblx0XHQqKiogYWNjZXB0OiAgJXMgKioqXG5cblxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyZXR1cm4gc3Vic2s7Cit9IC8qIGFjY2VwdF9yKCkgKi8KKworaW50IGNvbm5lY3RfcihpbnQgc2ssIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2Vydl9hZGRyLCBzb2NrbGVuX3QgYWRkcmxlbikKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJREVCVUdfUFJJTlQoREVCVUdfTUlOLCAiXHRjb25uZWN0KHNrPSVkKVxuIiwgc2spOworCisJLyogTWFyayBzayBhcyBiZWluZyBhYmxlIHRvIGFjY2VwdCBuZXcgYXNzb2NpYXRpb25zICovCisJZXJyb3IgPSBjb25uZWN0KHNrLCBzZXJ2X2FkZHIsIGFkZHJsZW4pOworCWlmIChlcnJvciAhPSAwKSB7CisJCWlmIChkb19leGl0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuXG5cdFx0KioqIGNvbm5lY3Q6ICAlcyAqKipcblxuXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQlleGl0KDEpOworCQl9CisJCWVsc2UgcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKKworfSAvKiBjb25uZWN0X3IoKSAqLworCitpbnQgY29ubmVjdHhfcihpbnQgc2ssIHN0cnVjdCBzb2NrYWRkciAqYWRkcnMsIGludCBjb3VudCkKK3sKKwlpbnQgZXJyb3I7CisJaW50IGk7CisJc3RydWN0IHNvY2thZGRyICpzYV9hZGRyOworCXZvaWQgKmFwdHI7CisKKwkvKiBTZXQgdGhlIHBvcnQgaW4gZXZlcnkgYWRkcmVzcy4gICovCisJYXB0ciA9IGFkZHJzOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXNhX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopYXB0cjsKKworCQlzd2l0Y2goc2FfYWRkci0+c2FfZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCSgoc3RydWN0IHNvY2thZGRyX2luICopc2FfYWRkciktPnNpbl9wb3J0ID0KKwkJCQlodG9ucyhyZW1vdGVfcG9ydCk7CisJCQlhcHRyICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJYnJlYWs7CisJCWNhc2UgQUZfSU5FVDY6CisJCQkoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYV9hZGRyKS0+c2luNl9wb3J0ID0KKwkJCQlodG9ucyhyZW1vdGVfcG9ydCk7CisJCQlhcHRyICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGFkZHJlc3MgZmFtaWx5XG4iKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwllcnJvciA9IHNjdHBfY29ubmVjdHgoc2ssIGFkZHJzLCBjb3VudCwgTlVMTCk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJcblxuXHRcdCoqKiBjb25uZWN0eF9yOiBlcnJvciBjb25uZWN0aW5nIgorCQkJIiB0byBhZGRyczogJXMgKioqXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlleGl0KDEpOworCX0KKworCXJldHVybiAwOworCit9IC8qIGNvbm5lY3R4X3IoKSAqLworCitpbnQgcmVjZWl2ZV9yKGludCBzaywgaW50IG9uY2UpCit7CisJaW50IHJlY3ZzayA9IHNrLCBpID0gMCwgZXJyb3IgPSAwOworICAgICAgICBjaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihfc2N0cF9jbXNnX2RhdGFfdCkpXTsKKyAgICAgICAgc3RydWN0IGlvdmVjIGlvdjsKKyAgICAgICAgc3RydWN0IG1zZ2hkciBpbm1lc3NhZ2U7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBpbm1lc3NhZ2Ugd2l0aCBlbm91Z2ggc3BhY2UgZm9yIERBVEEuLi4gKi8KKyAgICAgICAgbWVtc2V0KCZpbm1lc3NhZ2UsIDAsIHNpemVvZihpbm1lc3NhZ2UpKTsKKyAgICAgICAgaWYgKChpb3YuaW92X2Jhc2UgPSBtYWxsb2MoUkVBTExZX0JJRykpID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJcblx0XHQqKiogbWFsbG9jIG5vdCBlbm91Z2ggbWVtb3J5ISEhICoqKlxuIik7CisJCWV4aXQoMSk7CisJfQorCWlvdi5pb3ZfbGVuID0gUkVBTExZX0JJRzsKKwlpbm1lc3NhZ2UubXNnX2lvdiA9ICZpb3Y7CisJaW5tZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworCS8qIG9yIGEgY29udHJvbCBtZXNzYWdlLiAgKi8KKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisKKwkvKiBHZXQgdGhlIG1lc3NhZ2VzIHNlbnQgKi8KKwl3aGlsZSAoMSkgeworCisJCWlmIChyZWN2c2sgPT0gc2sgJiYgc29ja2V0X3R5cGUgPT0gU09DS19TVFJFQU0gJiYKKwkJICAgIHJvbGUgPT0gU0VSVkVSKQorCQkJcmVjdnNrID0gYWNjZXB0X3Ioc2spOworCisJCURFQlVHX1BSSU5UKERFQlVHX01JTiwgIlx0cmVjdm1zZyhzaz0lZCkgIiwgc2spOworCisJCWVycm9yID0gcmVjdm1zZyhyZWN2c2ssICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwkJaWYgKGVycm9yIDwgMCAmJiBlcnJubyAhPSBFQUdBSU4pIHsKKwkJCWlmIChlcnJubyA9PSBFTk9UQ09OTiAmJiBzb2NrZXRfdHlwZSA9PSBTT0NLX1NUUkVBTSAmJgorCQkJICAgIHJvbGUgPT0gU0VSVkVSKSB7CisJCQkJcHJpbnRmKCJObyBhc3NvY2lhdGlvbiBpcyBwcmVzZW50IG5vdyEhXG4iKTsKKwkJCQljbG9zZShyZWN2c2spOworCQkJCXJlY3ZzayA9IHNrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuXHRcdCoqKiByZWN2bXNnOiAlcyAqKipcblxuIiwKKwkJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCWZmbHVzaChzdGRvdXQpOworCQkJaWYgKGRvX2V4aXQpIGV4aXQoMSk7CisJCQllbHNlIGdvdG8gZXJyb3Jfb3V0OworCQl9CisJCWVsc2UgaWYgKGVycm9yID09IDApIHsKKwkJCWlmIChzb2NrZXRfdHlwZSA9PSBTT0NLX1NUUkVBTSAmJiByb2xlID09IFNFUlZFUikgeworCQkJCXByaW50ZigiTm8gYXNzb2NpYXRpb24gaXMgcHJlc2VudCBub3chIVxuIik7CisJCQkJY2xvc2UocmVjdnNrKTsKKwkJCQlyZWN2c2sgPSBzazsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXByaW50ZigiXG5cdFx0cmVjdm1zZygpIHJldHVybmVkIDAgISEhIVxuIik7CisJCQlmZmx1c2goc3Rkb3V0KTsKKwkJfQorCisJCWlmIChwcmludF9tZXNzYWdlKHJlY3ZzaywgJmlubWVzc2FnZSwgZXJyb3IpID4gMCkKKwkJCWNvbnRpbnVlOyAvKiBnb3QgYSBub3RpZmljYXRpb24uLi4gKi8KKworCQlpbm1lc3NhZ2UubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisJCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCQlpb3YuaW92X2xlbiA9IFJFQUxMWV9CSUc7CisJCWkrKzsKKwkJaWYgKG9uY2UpCisJCQlicmVhazsKKwl9CisKKwlpZiAocmVjdnNrICE9IHNrKQorCQljbG9zZShyZWN2c2spOworCisJZnJlZShpb3YuaW92X2Jhc2UpOworCXJldHVybiAwOworZXJyb3Jfb3V0OgorCWNsb3NlKHNrKTsKKwlmcmVlKGlvdi5pb3ZfYmFzZSk7CisJcmV0dXJuIC0xOworCit9IC8qIHJlY2VpdmVfciAoKSAqLworCitpbnQgbmV4dF9vcmRlcihpbnQgc3RhdGUsIGludCBwYXR0ZXJuKQoreworCXN3aXRjaCAocGF0dGVybil7CisJY2FzZSBPUkRFUl9QQVRURVJOX1VOT1JERVJFRDoKKwkJc3RhdGUgPSAwOworCQlicmVhazsKKwljYXNlIE9SREVSX1BBVFRFUk5fT1JERVJFRDoKKwkJc3RhdGUgPSAxOworCQlicmVhazsKKwljYXNlIE9SREVSX1BBVFRFUk5fQUxURVJOQVRFOgorCQlzdGF0ZSA9IHN0YXRlID8gMCA6IDE7CisJCWJyZWFrOworCWNhc2UgT1JERVJfUEFUVEVSTl9SQU5ET006CisJCXN0YXRlID0gcmFuZCgpICUgMjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHN0YXRlOworfQorCitpbnQgbmV4dF9zdHJlYW0oaW50IHN0YXRlLCBpbnQgcGF0dGVybikKK3sKKwlzd2l0Y2ggKHBhdHRlcm4peworCWNhc2UgU1RSRUFNX1BBVFRFUk5fUkFORE9NOgorCQlzdGF0ZSA9IHJhbmQoKSAlIChtYXhfc3RyZWFtID09IDAgPyAxIDogbWF4X3N0cmVhbSk7CisJCWJyZWFrOworCWNhc2UgU1RSRUFNX1BBVFRFUk5fU0VRVUVOVElBTDoKKwkJc3RhdGUgPSBzdGF0ZSArIDE7CisJCWlmIChzdGF0ZSA+PSBtYXhfc3RyZWFtKQorCQkJc3RhdGUgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3RhdGU7Cit9CisKK2ludCBuZXh0X21zZ19zaXplKGludCBtc2dfY250KQoreworCWludCBtc2dfc2l6ZTsKKworCWlmIChzaXplX2FyZykgeworCQltc2dfc2l6ZSA9IHNpemVfYXJnOworCX0gZWxzZSBpZiAodGVzdF9jYXNlIDwgTkNBU0VTKSB7CisJCW1zZ19zaXplID0gbXNnX3NpemVzW3Rlc3RfY2FzZV1bbXNnX2NudF07CisJfSBlbHNlIHsKKwkJbXNnX3NpemUgPSAocmFuZCgpICUgbWF4X21zZ3NpemUpICsgMTsKKwl9CisKKwlyZXR1cm4gbXNnX3NpemU7CisKK30gLyogbmV4dF9tc2dfc2l6ZSgpICovCisKK2ludCBuZXh0X2Fzc29jKGludCBpLCBpbnQgc3RhdGUsIGludCBwYXR0ZXJuKQoreworCWludCBqOworCWludCBmb3VuZCA9IDA7CisJX2Fzc29jX3N0YXRlICphczsKKworCisJc3dpdGNoIChwYXR0ZXJuKXsKKwljYXNlIEFTU09DX1BBVFRFUk5fUkFORE9NOgorCQlzdGF0ZSA9IHJhbmQoKSAlIHRvc2VuZDsKKwkJYnJlYWs7CisJY2FzZSBBU1NPQ19QQVRURVJOX1NFUVVFTlRJQUw6CisJCXN0YXRlID0gc3RhdGUgKyAxOworCQlpZiAoc3RhdGUgPj0gdG9zZW5kKQorCQkJc3RhdGUgPSAwOworCQlicmVhazsKKwl9CisKKwlhcyA9IHBvbGxfc2tzW2ldLmFzc29jX3N0YXRlOworCWogPSBzdGF0ZTsKKwlkbyB7CisJCWlmIChhc1tqXS5tc2dfc2VudCA8IHJlcGVhdF9jb3VudCkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCsraiA+PSB0b3NlbmQpIHsKKwkJCWogPSAwOworCQl9CisJfSB3aGlsZSAoaiAhPSBzdGF0ZSk7CisKKwlpZiAoZm91bmQpIHsKKwkJcmV0dXJuIGo7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC0xOworCX0KKwkKK30gLyogbmV4dF9hc3NvYygpICovCisKK2ludCBzZW5kX3IoaW50IHNrLCBpbnQgc3RyZWFtLCBpbnQgb3JkZXIsIGludCBzZW5kX3NpemUsIGludCBhc3NvY19pKQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IG1zZ2hkciBvdXRtc2c7CisJc3RydWN0IGlvdmVjIGlvdjsKKwljaGFyICptZXNzYWdlID0gTlVMTDsKKwlpbnQgbXNnbGVuID0gMDsKKwljaGFyIG91dGNtc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpXTsKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbzsKKworCWlmIChzZW5kX3NpemUgPiAwKSB7CisJCW1lc3NhZ2UgPSBidWlsZF9tc2coc2VuZF9zaXplKTsKKwkJbXNnbGVuID0gc3RybGVuKG1lc3NhZ2UpICsgMTsKKwkJaW92Lmlvdl9iYXNlID0gbWVzc2FnZTsKKwkJaW92Lmlvdl9sZW4gPSBtc2dsZW47CisJfQorCWVsc2UgeworCQlpZiAoZG9fZXhpdCkgeworCQkJZXhpdCgxKTsKKwkJfSBlbHNlIHsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJfQorCisJb3V0bXNnLm1zZ19uYW1lID0gJnNfcmVtOworICAgICAgIAlvdXRtc2cubXNnX25hbWVsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpOworCW91dG1zZy5tc2dfaW92ID0gJmlvdjsKKwlvdXRtc2cubXNnX2lvdmxlbiA9IDE7CisJb3V0bXNnLm1zZ19jb250cm9sID0gb3V0Y21zZzsKKwlvdXRtc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2Yob3V0Y21zZyk7CisJb3V0bXNnLm1zZ19mbGFncyA9IDA7CisKKwljbXNnID0gQ01TR19GSVJTVEhEUigmb3V0bXNnKTsKKwljbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworCWNtc2ctPmNtc2dfdHlwZSA9IFNDVFBfU05EUkNWOworCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKworCW91dG1zZy5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworCXNpbmZvID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7CisJbWVtc2V0KHNpbmZvLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCXNpbmZvLT5zaW5mb19wcGlkID0gcmFuZCgpOworCXNpbmZvLT5zaW5mb19zdHJlYW0gPSBzdHJlYW07CisJc2luZm8tPnNpbmZvX2ZsYWdzID0gMDsKKwlpZiAoIW9yZGVyKQorCQlzaW5mby0+c2luZm9fZmxhZ3MgPSBTQ1RQX1VOT1JERVJFRDsKKwlpZiAodGltZXRvbGl2ZSkKKwkJc2luZm8tPnNpbmZvX3RpbWV0b2xpdmUgPSB0aW1ldG9saXZlOworCisJREVCVUdfUFJJTlQoREVCVUdfTUlOLCAiXHRzZW5kbXNnKHNrPSVkLCBhc3NvYz0lZCkgJTRkIGJ5dGVzLlxuIiwKKwkJICAgIHNrLCBhc3NvY19pLCBzZW5kX3NpemUpOworCURFQlVHX1BSSU5UKERFQlVHX01BWCwgIlx0ICBTTkRSQ1YiKTsKKwlpZiAoREVCVUdfTUFYID09IGRlYnVnX2xldmVsKSB7CisgICAgICAgIAlwcmludGYoIihzdHJlYW09JXUgIiwgCXNpbmZvLT5zaW5mb19zdHJlYW0pOworCQlwcmludGYoImZsYWdzPTB4JXggIiwJc2luZm8tPnNpbmZvX2ZsYWdzKTsKKwkJcHJpbnRmKCJwcGlkPSV1XG4iLAlzaW5mby0+c2luZm9fcHBpZCk7CisJfQorCisJLyogU2VuZCB0byBvdXIgbmVpZ2hib3IuICAqLworCWVycm9yID0gc2VuZG1zZyhzaywgJm91dG1zZywgTVNHX1dBSVRBTEwpOworCWlmIChlcnJvciAhPSBtc2dsZW4pIHsKKwkJZnByaW50ZihzdGRlcnIsICJcblx0XHQqKiogc2VuZG1zZzogJXMgKioqXG5cbiIsCisJCQlzdHJlcnJvcihlcnJubykpOworCQlmZmx1c2goc3Rkb3V0KTsKKwkKKwkJaWYgKGRvX2V4aXQpIHsKKwkJCWV4aXQoMSk7CisJCX0gZWxzZSB7CisJCQlpZiAoIWRyYWluKQorCQkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJfQorCisJaWYgKHNlbmRfc2l6ZSA+IDApIGZyZWUobWVzc2FnZSk7CisJcmV0dXJuIDA7CitlcnJvcl9vdXQ6CisJaWYgKHNlbmRfc2l6ZSA+IDApIGZyZWUobWVzc2FnZSk7CisJcmV0dXJuIC0xOworCit9IC8qIHNlbmRfcigpICovCisKK2ludCBjbG9zZV9yKGludCBzaykKK3sKKwlpbnQgZXJyb3IgPSAwOworCQorCURFQlVHX1BSSU5UKERFQlVHX01JTiwgIlx0Y2xvc2Uoc2s9JWQpXG4iLHNrKTsKKworCWVycm9yID0gY2xvc2Uoc2spOworCWlmIChlcnJvciAhPSAwKSB7CisJCWlmIChkb19leGl0KSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuXG5cdFx0KioqIGNsb3NlOiAlcyAqKipcblxuIiwKKwkJCQlzdHJlcnJvcihlcnJubykpOworCQkJZXhpdCgxKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlmZmx1c2goc3Rkb3V0KTsKKwlyZXR1cm4gMDsKKworfSAvKiBjbG9zZV9yKCkgKi8KKwordm9pZAorc2VydmVyKGludCBzaykKK3sKKwlpZiAobWF4X21zZ3NpemUgPiBERUZBVUxUX01BWF9XSU5ET1cpIHsKKwkJaWYgKHNldHNvY2tvcHQoc2ssIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJm1heF9tc2dzaXplLAorCQkJICAgICAgIHNpemVvZihtYXhfbXNnc2l6ZSkpIDwgMCkgeworCQkJcGVycm9yKCJzZXRzb2Nrb3B0KFNPX1JDVkJVRikiKTsKKwkJCWV4aXQoMSk7CisJCX0gCQorCX0KKworCXJlY2VpdmVfcihzaywgMCk7CisKK30gLyogc2VydmVyKCkgKi8KKwordm9pZAorY2xpZW50KGludCBzaykKK3sKKwlpbnQgbXNnX3NpemU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNnX2NudDsgaSsrKSB7CisKKwkJbXNnX3NpemUgPSBuZXh0X21zZ19zaXplKGkpOworCQlvcmRlcl9zdGF0ZSA9IG5leHRfb3JkZXIob3JkZXJfc3RhdGUsIG9yZGVyX3BhdHRlcm4pOworCQlzdHJlYW1fc3RhdGUgPSBuZXh0X3N0cmVhbShzdHJlYW1fc3RhdGUsIHN0cmVhbV9wYXR0ZXJuKTsKKworCQlpZiAoc2VuZF9yKHNrLCBzdHJlYW1fc3RhdGUsIG9yZGVyX3N0YXRlLCBtc2dfc2l6ZSwgMCkgPCAwKQorCQkJYnJlYWs7CisJCS8qIFRoZSBzZW5kZXIgaXMgZWNob2luZyBzbyBkbyBkaXNjYXJkIHRoZSBlY2hvZWQgZGF0YS4gKi8KKwkJaWYgKGRyYWluKSB7CisJCQlyZWNlaXZlX3Ioc2ssIDEpOworCQl9CisJfQorfSAvKiBjbGllbnQoKSAqLworCit2b2lkCittaXhlZF9tb2RlX3Rlc3Qodm9pZCkKK3sKKwlpbnQgZXJyb3IsIGksIGosIG1heF9mZCwgc2tzLCBzaXplOworCWludCBhc3NvY19pLCBuX21zZ19zaXplLCBuX29yZGVyLCBuX3N0cmVhbTsKKwlpbnQgZG9uZSA9IDA7CisJZmRfc2V0ICppYml0c3AgPSBOVUxMLCAqb2JpdHNwID0gTlVMTCwgKnhiaXRzcCA9IE5VTEw7CisgICAgICAgIGNoYXIgaW5jbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKF9zY3RwX2Ntc2dfZGF0YV90KSldOworICAgICAgICBzdHJ1Y3QgaW92ZWMgaW92OworICAgICAgICBzdHJ1Y3QgbXNnaGRyIGlubWVzc2FnZTsKKwlfYXNzb2Nfc3RhdGUgKmFzOworCisJCisJLyogU2V0IHVwIHRoZSBsaXN0ZW5lcnMuICBJZiBsaXN0ZW5lcnMgaXMgMCwgc2V0IHVwIG9uZSBzb2NrZXQgZm9yCisJICogdHJhbnNtaXR0aW5nIG9ubHkuCisJICovCisJaW92Lmlvdl9iYXNlID0gTlVMTDsKKwltYXhfZmQgPSAtMTsKKwlza3MgPSAoMCA9PSBsaXN0ZW5lcnMpID8gMSA6IGxpc3RlbmVyczsKKwltZW1zZXQocG9sbF9za3MsIDAsIHNrcyAqIHNpemVvZihfcG9sbF9za3MpKTsKKworCWZvciAoaSA9IDA7IGkgPCBza3M7IGkrKykgeworCQlwb2xsX3Nrc1tpXS5zayA9IHNvY2tldF9yKCk7CisKKwkJaWYgKHNfbG9jLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJCSggKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmc19sb2MpLT5zaW42X3BvcnQgPQorCQkJCWh0b25zKGxvY2FsX3BvcnQgKyBpKTsKKwkJZWxzZQorCQkJKCAoc3RydWN0IHNvY2thZGRyX2luICopJnNfbG9jKS0+c2luX3BvcnQgPQorCQkJCWh0b25zKGxvY2FsX3BvcnQgKyBpKTsKKworCQliaW5kX3IocG9sbF9za3NbaV0uc2ssICZzX2xvYyk7CisJCWlmIChsaXN0ZW5lcnMpIHsKKwkJCWxpc3Rlbl9yKHBvbGxfc2tzW2ldLnNrLCAxMDApOworCQl9CisJCWlmIChtYXhfbXNnc2l6ZSA+IERFRkFVTFRfTUFYX1dJTkRPVykgeworCQkJaWYgKHNldHNvY2tvcHQocG9sbF9za3NbaV0uc2ssIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwKKwkJCQkmbWF4X21zZ3NpemUsIHNpemVvZihtYXhfbXNnc2l6ZSkpIDwgMCkgeworCQkJCXBlcnJvcigic2V0c29ja29wdChTT19SQ1ZCVUYpIik7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJfSAJCisKKwkJaWYgKHRvc2VuZCkgeworCQkJaWYgKChwb2xsX3Nrc1tpXS5hc3NvY19zdGF0ZSA9IChfYXNzb2Nfc3RhdGUgKiltYWxsb2MoCisJCQkJc2l6ZW9mKF9hc3NvY19zdGF0ZSkgKiB0b3NlbmQpKSA9PSBOVUxMKSB7CisJCQkJcHJpbnRmKCJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKKwkJCQlnb3RvIGNsZWFuX3VwOworCQkJfQorCQkJbWVtc2V0KHBvbGxfc2tzW2ldLmFzc29jX3N0YXRlLCAwLAorCQkJCXNpemVvZihfYXNzb2Nfc3RhdGUpICogdG9zZW5kKTsKKwkJfQorCisJCWlmIChwb2xsX3Nrc1tpXS5zayA+IG1heF9mZCkgeworCQkJbWF4X2ZkID0gcG9sbF9za3NbaV0uc2s7CisJCX0KKwl9CisKKwlzaXplID0gaG93bWFueShtYXhfZmQgKyAxLCBORkRCSVRTKSAqIHNpemVvZihmZF9tYXNrKTsKKwlpZiAoKGliaXRzcCA9IChmZF9zZXQgKiltYWxsb2Moc2l6ZSkpID09IE5VTEwpIHsKKwkJcHJpbnRmKCJDYW4ndCBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKKwkJZ290byBjbGVhbl91cDsKKwl9CisJaWYgKChvYml0c3AgPSAoZmRfc2V0ICopbWFsbG9jKHNpemUpKSA9PSBOVUxMKSB7CisJCXByaW50ZigiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5LlxuIik7CisJCWdvdG8gY2xlYW5fdXA7CisJfQorCWlmICgoeGJpdHNwID0gKGZkX3NldCAqKW1hbGxvYyhzaXplKSkgPT0gTlVMTCkgeworCQlwcmludGYoIkNhbid0IGFsbG9jYXRlIG1lbW9yeS5cbiIpOworCQlnb3RvIGNsZWFuX3VwOworCX0KKworCW1lbXNldChpYml0c3AsIDAsIHNpemUpOworCW1lbXNldChvYml0c3AsIDAsIHNpemUpOworCW1lbXNldCh4Yml0c3AsIDAsIHNpemUpOworCisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBpbm1lc3NhZ2Ugd2l0aCBlbm91Z2ggc3BhY2UgZm9yIERBVEEuLi4gKi8KKyAgICAgICAgbWVtc2V0KCZpbm1lc3NhZ2UsIDAsIHNpemVvZihpbm1lc3NhZ2UpKTsKKyAgICAgICAgaWYgKChpb3YuaW92X2Jhc2UgPSBtYWxsb2MoUkVBTExZX0JJRykpID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJcblx0XHQqKiogbWFsbG9jIG5vdCBlbm91Z2ggbWVtb3J5ISEhICoqKlxuIik7CisJCWdvdG8gY2xlYW5fdXA7CisJfQorCWlvdi5pb3ZfbGVuID0gUkVBTExZX0JJRzsKKwlpbm1lc3NhZ2UubXNnX2lvdiA9ICZpb3Y7CisJaW5tZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworCS8qIG9yIGEgY29udHJvbCBtZXNzYWdlLiAgKi8KKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisKKwkvKiBTZXQgdXAgdGhlIHJlbW90ZSBwb3J0IG51bWJlciBwZXIgYXNzb2NpYXRpb24gZm9yIG91dHB1dC4gICovCisJZm9yIChpID0gMDsgaSA8IHNrczsgaSsrKSB7CisJCWFzID0gcG9sbF9za3NbaV0uYXNzb2Nfc3RhdGU7CisJCWZvciAoaiA9IDA7IGogPCB0b3NlbmQ7IGorKykgeworCQkJYXNbal0ucmVtX3BvcnQgPSByZW1vdGVfcG9ydCArIGo7CisJCX0KKwl9CisKKwl3aGlsZSAoIWRvbmUpIHsKKworCQlmb3IgKGkgPSAwOyBpIDwgc2tzOyBpKyspIHsKKwkJCUZEX1NFVChwb2xsX3Nrc1tpXS5zaywgaWJpdHNwKTsKKwkJCUZEX1NFVChwb2xsX3Nrc1tpXS5zaywgb2JpdHNwKTsKKwkJCUZEX1NFVChwb2xsX3Nrc1tpXS5zaywgeGJpdHNwKTsKKwkJfQorCQlpZiAoKGVycm9yID0gc2VsZWN0KG1heF9mZCArIDEsIGliaXRzcCwgb2JpdHNwLCB4Yml0c3AsCisJCQkoc3RydWN0IHRpbWV2YWwgKikwKSkgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuXHRcdCoqKiBzZWxlY3QoKSBmYWlsZWQgIik7CisJCQlmcHJpbnRmKHN0ZGVyciwgIndpdGggZXJyb3I6ICVzXG5cbiIsCisJCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJCWZmbHVzaChzdGRvdXQpOworCQkJZ290byBjbGVhbl91cDsKKwkJfQorCQkKKwkJZm9yIChpID0gMDsgaSA8IHNrczsgaSsrKSB7CisJCQkvKiBJcyB0aGVyZSBhbnl0aGluZyB0byByZWFkIGZyb20gdGhlIHNvY2tldD8gICovCisJCQlpZiAobGlzdGVuZXJzICYmIEZEX0lTU0VUKHBvbGxfc2tzW2ldLnNrLCBpYml0c3ApKSB7CisKKwkJCQlGRF9DTFIocG9sbF9za3NbaV0uc2ssIGliaXRzcCk7CisJCQkJZXJyb3IgPSByZWN2bXNnKHBvbGxfc2tzW2ldLnNrLCAmaW5tZXNzYWdlLAorCQkJCQlNU0dfV0FJVEFMTCk7CisJCQkJaWYgKGVycm9yIDwgMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkJCSJcblx0XHQqKiogcmVjdm1zZzogJXMgKioqXG5cbiIsCisJCQkJCQlzdHJlcnJvcihlcnJubykpOworCQkJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCQkJZ290byBjbGVhbl91cDsKKwkJCQl9CisJCQkJZWxzZSBpZiAoZXJyb3IgPT0gMCkgeworCQkJCQlwcmludGYoIlxuXHRcdHJlY3Ztc2coKSByZXR1cm5lZCAiKTsKKwkJCQkgICAgICAgCXByaW50ZigiMCAhISEhXG4iKTsKKwkJCQkJZmZsdXNoKHN0ZG91dCk7CisJCQkJfQorCisJCQkJcHJpbnRfbWVzc2FnZShwb2xsX3Nrc1tpXS5zaywgJmlubWVzc2FnZSwKKwkJCQkJZXJyb3IpOworCisJCQkJaW5tZXNzYWdlLm1zZ19jb250cm9sID0gaW5jbXNnOworCQkJCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCQkJCWlvdi5pb3ZfbGVuID0gUkVBTExZX0JJRzsKKwkJCX0KKwkJCQorCQkJLyogSXMgdGhpcyBzb2NrZXQgd3JpdGVhYmxlPyAgKi8KKwkJCWlmICh0b3NlbmQgJiYgRkRfSVNTRVQocG9sbF9za3NbaV0uc2ssIG9iaXRzcCkpIHsKKworCQkJCUZEX0NMUihwb2xsX3Nrc1tpXS5zaywgb2JpdHNwKTsKKworCQkJCS8qIFBpY2sgYW4gYXNzb2NpYXRpb24uICAqLworCQkJCWFzc29jX2kgPSBuZXh0X2Fzc29jKGksIHBvbGxfc2tzW2ldLmFzc29jX2ksCisJCQkJCQlhc3NvY19wYXR0ZXJuKTsKKwkJCQlpZiAoYXNzb2NfaSA8IDApIHsKKwkJCQkJLyogTm8gd29yayB0byBkbyBvbiBhbnkgYXNzb2NpYXRpb25zLgorCQkJCQkgKiBXZSBhcmUgcHJvYmFibHkgZG9uZS4gKi8KKwkJCQkJaWYgKCFsaXN0ZW5lcnMpIHsKKwkJCQkJCWRvbmUgPSAxOworCQkJCQl9CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlwb2xsX3Nrc1tpXS5hc3NvY19pID0gYXNzb2NfaTsKKworCQkJCWFzID0gcG9sbF9za3NbaV0uYXNzb2Nfc3RhdGU7CisJCQkJbl9tc2dfc2l6ZSA9IG5leHRfbXNnX3NpemUoYXNbYXNzb2NfaV0ubXNnX2NudCk7CisJCQkJbl9vcmRlciA9IGFzW2Fzc29jX2ldLm9yZGVyX3N0YXRlID0KKwkJCQkJbmV4dF9vcmRlcihhc1thc3NvY19pXS5vcmRlcl9zdGF0ZSwKKwkJCQkJb3JkZXJfcGF0dGVybik7CisJCQkJbl9zdHJlYW0gPSBhc1thc3NvY19pXS5zdHJlYW1fc3RhdGUgPQorCQkJCQluZXh0X3N0cmVhbShhc1thc3NvY19pXS5zdHJlYW1fc3RhdGUsCisJCQkJCXN0cmVhbV9wYXR0ZXJuKTsKKworCQkJCS8qIFNldCB0aGUgZGVzdGluYXRpb24gcG9ydC4gICovCisJCQkJaWYgKHNfcmVtLnNzX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJCQkJKCAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzX3JlbSktPgorCQkJCQkJc2luNl9wb3J0ID0KKwkJCQkJCWh0b25zKGFzW2Fzc29jX2ldLnJlbV9wb3J0KTsKKwkJCQllbHNlCisJCQkJCSggKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZzX3JlbSktPgorCQkJCQkJc2luX3BvcnQgPQorCQkJCQkJaHRvbnMoYXNbYXNzb2NfaV0ucmVtX3BvcnQpOworCisJCQkJLyogU2VuZCBhIG1lc3NhZ2UgdGhydSB0aGUgYXNzb2NpYXRpb24uICAqLworCQkJCWlmIChzZW5kX3IocG9sbF9za3NbaV0uc2ssIG5fc3RyZWFtLCBuX29yZGVyLAorCQkJCQluX21zZ19zaXplLCBhc3NvY19pKSA8IDApIHsKKwkJCQkJLyogRG9uJ3QgaW5jcmVtZW50IGNvdW50ZXIgaWYgdGhlcmUKKwkJCQkJICogaXMgYSBwcm9ibGVtIG9mIHNlbmRpbmcuCisJCQkJCSAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQkvKiBJbmNyZW1lbnQgY291bnRlcnMuICovCisJCQkJaWYgKCsrYXNbYXNzb2NfaV0ubXNnX2NudCA+PSBNU0dfQ05UKSB7CisJCQkJCWFzW2Fzc29jX2ldLm1zZ19jbnQgPSAwOworCQkJCX0KKwkJCQlpZiAoKythc1thc3NvY19pXS5tc2dfc2VudCA+PQorCQkJCQlyZXBlYXRfY291bnQpIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJBc3NvY2lhdGlvbiAjJWQgaW4gIiwKKwkJCQkJCWFzc29jX2kpOworCQkJCQlmcHJpbnRmKHN0ZGVyciwgInNrPSVkIGhhcyAiLAorCQkJCQkJcG9sbF9za3NbaV0uc2spOworCQkJCQlmcHJpbnRmKHN0ZGVyciwgImNvbXBsZXRlZCAlZCBtc2cgYXMgIiwKKwkJCQkJCWFzW2Fzc29jX2ldLm1zZ19zZW50KTsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJjeWNsZSAlZC5cbiIsCisJCQkJCQkrK2FzW2Fzc29jX2ldLmN5Y2xlKTsKKworCQkJCQkvKiBJbiB0aGUgbWl4ZWQgbW9kZSwgLXggbm90IG9ubHkKKwkJCQkJICogc3BlY2lmeSB0aGUgbG9uZ2VyIHJlcGVhdCBjeWNsZSwKKwkJCQkJICogYnV0IGl0IGFsc28gbWVhbiB0byBydW4gdGhlIHRlc3QKKwkJCQkJICogZm9yZXZlci4KKwkJCQkJICovCisJCQkJCWlmICh4ZmxhZykgeworCQkJCQkJYXNbYXNzb2NfaV0ubXNnX3NlbnQgPSAwOworCQkJCQl9CisKKwkJCQl9CisKKwkJCX0KKwkJfQorCX0KKworY2xlYW5fdXA6CisJZm9yIChpID0gMDsgaSA8IHNrczsgaSsrKSB7CisJCWNsb3NlKHBvbGxfc2tzW2ldLnNrKTsKKwkJaWYgKHBvbGxfc2tzW2ldLmFzc29jX3N0YXRlKSB7CisJCQlmcmVlKHBvbGxfc2tzW2ldLmFzc29jX3N0YXRlKTsKKwkJfQorCX0KKworCWlmIChpYml0c3ApIGZyZWUoaWJpdHNwKTsKKwlpZiAob2JpdHNwKSBmcmVlKG9iaXRzcCk7CisJaWYgKHhiaXRzcCkgZnJlZSh4Yml0c3ApOworCisJaWYgKGlvdi5pb3ZfYmFzZSkgZnJlZShpb3YuaW92X2Jhc2UpOworCit9IC8qIG1peGVkX21vZGVfdGVzdCgpICovCisKK3ZvaWQgc3RhcnRfdGVzdChpbnQgcm9sZSkKK3sKKwlpbnQgc2s7CisJaW50IGkgPSAwOworCQorCURFQlVHX1BSSU5UKERFQlVHX05PTkUsICJcblN0YXJ0aW5nIHRlc3RzLi4uXG4iKTsKKworCXJlcGVhdF9jb3VudCA9IHJlcGVhdDsKKworCisJaWYgKE1JWEVEID09IHJvbGUpIHsKKwkJcmVwZWF0X2NvdW50ID0gcmVwZWF0X2NvdW50ICogbXNnX2NudDsgIC8qIFJlcGVhdCBwZXIgYXNzb2MuICovCisJCW1peGVkX21vZGVfdGVzdCgpOworCQlyZXR1cm47CisJfQorCisJc2sgPSBzb2NrZXRfcigpOworCWlmIChzayA8IDApIHsKKwkJREVCVUdfUFJJTlQoREVCVUdfTk9ORSwgIlxuU29ja2V0IGNyZWF0ZSBlcnIgJWRcbiIsIGVycm5vKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChiaW5kX3Ioc2ssICZzX2xvYykgPT0gLTEpIHsKKwkJREVCVUdfUFJJTlQoREVCVUdfTk9ORSwgIlxuU29ja2V0IGJpbmQgZXJyICVkXG4iLCBlcnJubyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBEbyB3ZSBuZWVkIHRvIGRvIGJpbmR4KCkgdG8gYWRkIGFueSBhZGRpdGlvbmFsIGFkZHJlc3Nlcz8gKi8KKwlpZiAoYmluZHhfYWRkX2FkZHJzKQorCQliaW5keF9yKHNrLCBiaW5keF9hZGRfYWRkcnMsIGJpbmR4X2FkZF9jb3VudCwKKwkJCSAgIFNDVFBfQklORFhfQUREX0FERFIpOworCisJaWYgKHJvbGUgPT0gU0VSVkVSKSB7CisJCWxpc3Rlbl9yKHNrLCAxMDApOworCX0gZWxzZSB7CisJCWlmIChzb2NrZXRfdHlwZSA9PSBTT0NLX1NUUkVBTSAmJiBjb25uZWN0eF9jb3VudCA9PSAwKQorCQkJY29ubmVjdF9yKHNrLCAoc3RydWN0IHNvY2thZGRyICopJnNfcmVtLCByX2xlbik7CisKKwkJaWYgKGNvbm5lY3R4X2NvdW50ICE9IDApCisJCQljb25uZWN0eF9yKHNrLCBjb25uZWN0eF9hZGRycywgY29ubmVjdHhfY291bnQpOworCX0KKworCWlmICghZGVidWdfbGV2ZWwpIHsKKwkJcHJpbnRmKCIgICAgICIpOworCX0KKworCWZvcihpID0gMDsgaSA8IHJlcGVhdF9jb3VudDsgaSsrKSB7CisJCQorCQlpZiAocm9sZSA9PSBTRVJWRVIpIHsKKwkJCURFQlVHX1BSSU5UKERFQlVHX05PTkUsCisJCQkJICAgICJTZXJ2ZXI6IFJlY2VpdmluZyBwYWNrZXRzLlxuIik7CisJCQlzZXJ2ZXIoc2spOworCQl9IGVsc2UgeworCQkJREVCVUdfUFJJTlQoREVCVUdfTk9ORSwKKwkJCQkgICAgIkNsaWVudDogU2VuZGluZyBwYWNrZXRzLiglZC8lZClcbiIsCisJCSAgICAJCSAgICBpKzEsIHJlcGVhdF9jb3VudCk7CisJCQljbGllbnQoc2spOworCQl9CisKKwkJZmZsdXNoKHN0ZG91dCk7CisJfQorCisJY2xvc2Vfcihzayk7CisKK30gLyogc3RhcnRfdGVzdCgpICovCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBjOworCWNoYXIgKmludGVyZmFjZSA9IE5VTEw7CisJc3RydWN0IHNvY2thZGRyX2luICp0X2FkZHI7CisJc3RydWN0IHNvY2thZGRyX2luNiAqdF9hZGRyNjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnRtcF9hZGRycyA9IE5VTEw7CisJCisgICAgICAgIC8qIFBhcnNlIHRoZSBhcmd1bWVudHMuICAqLworICAgICAgICB3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgIjpIOkw6UDpTOmE6aDpwOmM6ZDpsbTpzeDpYOm86dDpNOnI6dzpEaTpUQjpDOk86IikpID49IDAgKSB7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnSCc6CisJCQlsb2NhbF9ob3N0ID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ0wnOgorCQkJcm9sZSA9IE1JWEVEOworCQkJbGlzdGVuZXJzID0gYXRvaShvcHRhcmcpOworCQkJaWYgKGxpc3RlbmVycyA+IE1BWF9QT0xMX1NLUykgeworCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnUCc6CisJCQlsb2NhbF9wb3J0ID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ1MnOgorCQkJcm9sZSA9IE1JWEVEOworCQkJdG9zZW5kID0gYXRvaShvcHRhcmcpOworCQkJaWYgKHRvc2VuZCA+IE1BWF9QT0xMX1NLUykgeworCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnYSc6CisJCQlhc3NvY19wYXR0ZXJuID0gYXRvaShvcHRhcmcpOworCQkJaWYgKGFzc29jX3BhdHRlcm4gPCAgQVNTT0NfUEFUVEVSTl9TRVFVRU5USUFMCisJCQkgICAgfHwgYXNzb2NfcGF0dGVybiA+IEFTU09DX1BBVFRFUk5fUkFORE9NICkgeworCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQlyZW1vdGVfaG9zdCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCWRyYWluID0gMTsKKwkJCWRvX2V4aXQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOgorCQkJcmVtb3RlX3BvcnQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlpZiAocm9sZSAhPSBOT1RfREVGSU5FRCkgeworCQkJCXByaW50ZigiJXM6IG9ubHkgLXMgb3IgLWxcbiIsIGFyZ3ZbMF0pOworCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlyb2xlID0gQ0xJRU5UOworCQkJYnJlYWs7CisJCWNhc2UgJ2wnOgorCQkJaWYgKHJvbGUgIT0gTk9UX0RFRklORUQpIHsKKwkJCQlwcmludGYoIiVzOiBvbmx5IC1zIG9yIC1sXG4iLCBhcmd2WzBdKTsKKwkJCQl1c2FnZShhcmd2WzBdKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJcm9sZSA9IFNFUlZFUjsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWRlYnVnX2xldmVsID0gYXRvaShvcHRhcmcpOworCQkJaWYgKGRlYnVnX2xldmVsIDwgREVCVUdfTk9ORQorCQkJICAgIHx8IGRlYnVnX2xldmVsID4gREVCVUdfTUFYKSB7CisJCQkJdXNhZ2UoYXJndlswXSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICd4JzoKKwkJCXJlcGVhdCA9IGF0b2kob3B0YXJnKTsKKwkJCWlmICghcmVwZWF0KSB7CisJCQkJeGZsYWcgPSAxOworCQkJCXJlcGVhdCA9IEJJR19SRVBFQVQ7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnWCc6CisJCQltc2dfY250ID0gYXRvaShvcHRhcmcpOworCQkJaWYgKChtc2dfY250IDw9IDApIHx8IChtc2dfY250ID4gTVNHX0NOVCkpIHsKKwkJCQl1c2FnZShhcmd2WzBdKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJdGVzdF9jYXNlID0gYXRvaShvcHRhcmcpOworCQkJaWYgKHRlc3RfY2FzZSA+IE5DQVNFUykgeworCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlpZiAodGVzdF9jYXNlIDwgMCkgeworCQkJCXNpemVfYXJnID0gLXRlc3RfY2FzZTsKKwkJCX0KKwkJCQorCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJb3JkZXJfcGF0dGVybiA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChvcmRlcl9wYXR0ZXJuIDwgIE9SREVSX1BBVFRFUk5fVU5PUkRFUkVECisJCQkgICAgfHwgb3JkZXJfcGF0dGVybiAgPiBPUkRFUl9QQVRURVJOX1JBTkRPTSApIHsKKwkJCQl1c2FnZShhcmd2WzBdKTsKKwkJCQlleGl0KDEpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ08nOgorCQkJdGltZXRvbGl2ZSA9IGF0b2kob3B0YXJnKTsKKwkJCWlmICh0aW1ldG9saXZlIDwgMCkgeworCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQlzdHJlYW1fcGF0dGVybiA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChzdHJlYW1fcGF0dGVybiA8ICBTVFJFQU1fUEFUVEVSTl9TRVFVRU5USUFMCisJCQkgICAgfHwgc3RyZWFtX3BhdHRlcm4gPiBTVFJFQU1fUEFUVEVSTl9SQU5ET00gKSB7CisJCQkJdXNhZ2UoYXJndlswXSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdNJzoKKwkJCW1heF9zdHJlYW0gPSBhdG9pKG9wdGFyZyk7CisJCQlpZiAobWF4X3N0cmVhbSA8ICAwCisJCQkgICAgfHwgbWF4X3N0cmVhbSA+PSAoMTw8MTYpKSB7CisJCQkJdXNhZ2UoYXJndlswXSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXNlZWQgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQltYXhfbXNnc2l6ZSA9IGF0b2kob3B0YXJnKTsKKyNpZiAwCisJCQlpZiAoKG1heF9tc2dzaXplIDwgREVGQVVMVF9NSU5fV0lORE9XKSB8fAorCQkJICAgIChtYXhfbXNnc2l6ZSA+IDY1NTE1KSkgeworCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCWludGVyZmFjZSA9IG9wdGFyZzsKKwkJCWlmX2luZGV4ID0gaWZfbmFtZXRvaW5kZXgoaW50ZXJmYWNlKTsKKwkJCWlmICghaWZfaW5kZXgpIHsKKwkJCQlwcmludGYoIkludGVyZmFjZSAlcyB1bmtub3duXG4iLCBpbnRlcmZhY2UpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnVCc6CisJCQlzb2NrZXRfdHlwZSA9IFNPQ0tfU1RSRUFNOworCQkJYnJlYWs7CisJCWNhc2UgJ0InOgorCQkJdG1wX2FkZHJzID0gYXBwZW5kX2FkZHIob3B0YXJnLCBiaW5keF9hZGRfYWRkcnMsCisJCQkJCQkmYmluZHhfYWRkX2NvdW50KTsKKwkJCWlmIChOVUxMID09IHRtcF9hZGRycykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiTm8gbWVtb3J5IHRvIGFkZCAiKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBvcHRhcmcpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQliaW5keF9hZGRfYWRkcnMgPSB0bXBfYWRkcnM7CisJCQlicmVhazsKKwkJY2FzZSAnQyc6CisJCQl0bXBfYWRkcnMgPSBhcHBlbmRfYWRkcihvcHRhcmcsIGNvbm5lY3R4X2FkZHJzLAorCQkJCQkJJmNvbm5lY3R4X2NvdW50KTsKKwkJCWlmIChOVUxMID09IHRtcF9hZGRycykgeworCQkJCWZwcmludGYoc3RkZXJyLCAiTm8gbWVtb3J5IHRvIGFkZCAiKTsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBvcHRhcmcpOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQljb25uZWN0eF9hZGRycyA9IHRtcF9hZGRyczsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJZXhpdCgwKTsKKwkJfQorCX0gLyogd2hpbGUoKSAqLworCisJaWYgKE5PVF9ERUZJTkVEID09IHJvbGUpIHsKKwkJdXNhZ2UoYXJndlswXSk7CisJCWV4aXQoMSk7CisJfQorCisKKwlpZiAoU0VSVkVSID09IHJvbGUgJiYgTlVMTCA9PSBsb2NhbF9ob3N0ICYmIHJlbW90ZV9ob3N0ICE9IE5VTEwpIHsKKwkJZnByaW50ZiAoc3RkZXJyLCAiJXM6IFNlcnZlciBuZWVkcyBsb2NhbCBhZGRyZXNzLCAiCisJCQkgIm5vdCByZW1vdGUgYWRkcmVzc1xuIiwgYXJndlswXSk7CisJCXVzYWdlKGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKwlpZiAoQ0xJRU5UID09IHJvbGUgJiYgTlVMTCA9PSByZW1vdGVfaG9zdCAmJiBjb25uZWN0eF9jb3VudCA9PSAwKSB7CisJCWZwcmludGYgKHN0ZGVyciwgIiVzOiBDbGllbnQgbmVlZHMgYXQgbGVhc3QgcmVtb3RlIGFkZHJlc3MgIgorCQkJICImIHBvcnRcbiIsIGFyZ3ZbMF0pOworCQl1c2FnZShhcmd2WzBdKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKE1JWEVEID09IHJvbGUpIHsKKwkJaWYgKGxpc3RlbmVycyAmJiBOVUxMID09IGxvY2FsX2hvc3QpIHsKKwkJCWZwcmludGYgKHN0ZGVyciwgIiVzOiBTZXJ2ZXJzIG5lZWQgbG9jYWwgYWRkcmVzc1xuIiwKKwkJCQlhcmd2WzBdKTsKKwkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAodG9zZW5kICYmIE5VTEwgPT0gcmVtb3RlX2hvc3QpIHsKKwkJCWZwcmludGYgKHN0ZGVyciwgIiVzOiBDbGllbnRzIG5lZWQgcmVtb3RlIGFkZHJlc3MgIiwKKwkJCQlhcmd2WzBdKTsKKwkJCWZwcmludGYgKHN0ZGVyciwgIiYgcG9ydFxuIik7CisJCQl1c2FnZShhcmd2WzBdKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwlpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IG5vbi1vcHRpb24gYXJndW1lbnRzIGFyZSBpbGxlZ2FsOiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJndlswXSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKG9wdGluZCA8IGFyZ2MpCisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzICIsIGFyZ3Zbb3B0aW5kKytdKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIGV4aXQoMSk7CisJfQorCisJaWYgKHJlbW90ZV9ob3N0ICE9IE5VTEwgJiYgY29ubmVjdHhfY291bnQgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBZb3UgY2FuIG5vdCBwcm92aWRlIGJvdGggLWggYW5kIC1DIG9wdGlvbnMuXG4iLAorCQkJYXJndlswXSk7CisJCXVzYWdlKGFyZ3ZbMF0pOworCQlleGl0KDEpOworCX0KKworCWlmIChyZW1vdGVfaG9zdCAhPSBOVUxMICYmIHJlbW90ZV9wb3J0ICE9IDApIHsKKwkJc3RydWN0IGFkZHJpbmZvICpyZXM7CisJCWludCBlcnJvcjsKKwkJY2hhciAqaG9zdF9zLCAqc2Vydl9zOworCisJCWlmICgoaG9zdF9zID0gbWFsbG9jKE5JX01BWEhPU1QpKSA9PSBOVUxMKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuKioqIGhvc3RfcyBtYWxsb2MgZmFpbGVkISEhICoqKlxuIik7CisJCQlleGl0KDEpOworCQl9CisJCWlmICgoc2Vydl9zID0gbWFsbG9jKE5JX01BWFNFUlYpKSA9PSBOVUxMKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuKioqIHNlcnZfcyBtYWxsb2MgZmFpbGVkISEhICoqKlxuIik7CisJCQlleGl0KDEpOworCQl9CisKKwkJZXJyb3IgPSBnZXRhZGRyaW5mbyhyZW1vdGVfaG9zdCwgMCwgTlVMTCwgJnJlcyk7CisJCWlmIChlcnJvcikgeworCQkJcHJpbnRmKCIlcy5cbiIsIGdhaV9zdHJlcnJvcihlcnJvcikpOworCQkJdXNhZ2UoYXJndlswXSk7CisJCQlleGl0KDEpOworCQl9CisKKwkJc3dpdGNoIChyZXMtPmFpX2ZhbWlseSkgeworCQkJY2FzZSBBRl9JTkVUOgorCQkJCXRfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmc19yZW07CisKKwkJCQltZW1jcHkodF9hZGRyLCByZXMtPmFpX2FkZHIsCisJCQkJICAgICAgIHJlcy0+YWlfYWRkcmxlbik7CisJCQkJdF9hZGRyLT5zaW5fZmFtaWx5ID0gcmVzLT5haV9mYW1pbHk7CisJCQkJdF9hZGRyLT5zaW5fcG9ydCA9IGh0b25zKHJlbW90ZV9wb3J0KTsKKworCQkJCXJfbGVuID0gcmVzLT5haV9hZGRybGVuOworCisjaWZkZWYgX19GcmVlQlNEX18KKwkJCQl0X2FkZHItPnNpbl9sZW4gPSByX2xlbjsKKyNlbmRpZgorCQkJCWJyZWFrOworCQkJY2FzZSBBRl9JTkVUNjoKKworCQkJCXRfYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzX3JlbTsKKwkJCQkKKwkJCQltZW1jcHkodF9hZGRyNiwgcmVzLT5haV9hZGRyLAorCQkJCSAgICAgICByZXMtPmFpX2FkZHJsZW4pOworCQkJCXRfYWRkcjYtPnNpbjZfZmFtaWx5ID0gcmVzLT5haV9mYW1pbHk7CisJCQkJdF9hZGRyNi0+c2luNl9wb3J0ID0gaHRvbnMocmVtb3RlX3BvcnQpOworCQkJCWlmIChpbnRlcmZhY2UpCisJCQkJCXRfYWRkcjYtPnNpbjZfc2NvcGVfaWQgPQorCQkJCQkJaWZfbmFtZXRvaW5kZXgoaW50ZXJmYWNlKTsKKworCQkJCXJfbGVuID0gcmVzLT5haV9hZGRybGVuOworCisjaWZkZWYgX19GcmVlQlNEX18KKwkJCQl0X2FkZHI2LT5zaW42X2xlbiA9IHJfbGVuOworI2VuZGlmCisJCQkJYnJlYWs7CisJCX0KKworCQlnZXRuYW1laW5mbygoc3RydWN0IHNvY2thZGRyICopJnNfcmVtLCByX2xlbiwgaG9zdF9zLAorCQkJICAgIE5JX01BWEhPU1QsIHNlcnZfcywgTklfTUFYU0VSViwgTklfTlVNRVJJQ0hPU1QpOworCQkJCisJCURFQlVHX1BSSU5UKERFQlVHX01BWCwgInJlbW90ZTphZGRyPSVzLCBwb3J0PSVzLCBmYW1pbHk9JWRcbiIsCisJCQkgICAgaG9zdF9zLCBzZXJ2X3MsIHJlcy0+YWlfZmFtaWx5KTsKKworCQlmcmVlYWRkcmluZm8ocmVzKTsKKyAgICAgICAgfQorCisJaWYgKGNvbm5lY3R4X2NvdW50ICE9IDApIHsKKwkJc3dpdGNoIChjb25uZWN0eF9hZGRycy0+c2FfZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCXRfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmc19yZW07CisJCQlyX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJbWVtY3B5KHRfYWRkciwgY29ubmVjdHhfYWRkcnMsIHJfbGVuKTsKKwkJCXRfYWRkci0+c2luX3BvcnQgPSBodG9ucyhyZW1vdGVfcG9ydCk7CisJCQlicmVhazsKKwkJY2FzZSBBRl9JTkVUNjoKKwkJCXRfYWRkcjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSZzX3JlbTsKKwkJCXJfbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQkJbWVtY3B5KHRfYWRkcjYsIGNvbm5lY3R4X2FkZHJzLCByX2xlbik7CisJCQl0X2FkZHI2LT5zaW42X3BvcnQgPSBodG9ucyhyZW1vdGVfcG9ydCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChsb2NhbF9ob3N0ICE9IE5VTEwpIHsKKwkJc3RydWN0IGFkZHJpbmZvICpyZXM7CisJCWludCBlcnJvcjsKKwkJY2hhciAqaG9zdF9zLCAqc2Vydl9zOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnRfYWRkcjsKKwkJc3RydWN0IHNvY2thZGRyX2luNiAqdF9hZGRyNjsKKworCQlpZiAoKGhvc3RfcyA9IG1hbGxvYyhOSV9NQVhIT1NUKSkgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJcbioqKiBob3N0X3MgbWFsbG9jIGZhaWxlZCEhISAqKipcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCQlpZiAoKHNlcnZfcyA9IG1hbGxvYyhOSV9NQVhTRVJWKSkgPT0gTlVMTCkgeworCQkJZnByaW50ZihzdGRlcnIsICJcbioqKiBzZXJ2X3MgbWFsbG9jIGZhaWxlZCEhISAqKipcbiIpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCWlmIChzdHJjbXAobG9jYWxfaG9zdCwgIjAiKSA9PSAwKQorCQkJbG9jYWxfaG9zdCA9ICIwLjAuMC4wIjsKKworCQllcnJvciA9IGdldGFkZHJpbmZvKGxvY2FsX2hvc3QsIDAsIE5VTEwsICZyZXMpOworCQlpZiAoZXJyb3IpIHsKKwkJCXByaW50ZigiJXMuXG4iLCBnYWlfc3RyZXJyb3IoZXJyb3IpKTsKKwkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJZXhpdCgxKTsKKwkJfQorCisJCXN3aXRjaCAocmVzLT5haV9mYW1pbHkpIHsKKwkJCWNhc2UgQUZfSU5FVDoKKwkJCQl0X2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopJnNfbG9jOworCQkJCW1lbWNweSh0X2FkZHIsIHJlcy0+YWlfYWRkciwKKwkJCQkgICAgICAgcmVzLT5haV9hZGRybGVuKTsKKwkJCQl0X2FkZHItPnNpbl9mYW1pbHkgPSByZXMtPmFpX2ZhbWlseTsKKwkJCQl0X2FkZHItPnNpbl9wb3J0ID0gaHRvbnMobG9jYWxfcG9ydCk7CisKKwkJCQlsX2xlbiA9IHJlcy0+YWlfYWRkcmxlbjsKKworI2lmZGVmIF9fRnJlZUJTRF9fCisJCQkJdF9hZGRyLT5zaW5fbGVuID0gbF9sZW47CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgQUZfSU5FVDY6CisJCQkJdF9hZGRyNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJnNfbG9jOworCisJCQkJbWVtY3B5KHRfYWRkcjYsIHJlcy0+YWlfYWRkciwKKwkJCQkgICAgICAgcmVzLT5haV9hZGRybGVuKTsKKwkJCQl0X2FkZHI2LT5zaW42X2ZhbWlseSA9IHJlcy0+YWlfZmFtaWx5OworCQkJCXRfYWRkcjYtPnNpbjZfcG9ydCA9IGh0b25zKGxvY2FsX3BvcnQpOworCQkJCWlmIChpbnRlcmZhY2UpCisJCQkJCXRfYWRkcjYtPnNpbjZfc2NvcGVfaWQgPQorCQkJCQkJaWZfbmFtZXRvaW5kZXgoaW50ZXJmYWNlKTsKKworCQkJCWxfbGVuID0gcmVzLT5haV9hZGRybGVuOworCisjaWZkZWYgX19GcmVlQlNEX18KKwkJCQl0X2FkZHI2LT5zaW42X2xlbiA9IGxfbGVuOworI2VuZGlmCisJCQkJYnJlYWs7CisJCX0KKworCQllcnJvciA9IGdldG5hbWVpbmZvKChzdHJ1Y3Qgc29ja2FkZHIgKikmc19sb2MsIGxfbGVuLCBob3N0X3MsCisJCQkgICAgTklfTUFYSE9TVCwgc2Vydl9zLCBOSV9NQVhTRVJWLCBOSV9OVU1FUklDSE9TVCk7CisKKwkJaWYgKGVycm9yKQorCQkJcHJpbnRmKCIlcy4uXG4iLCBnYWlfc3RyZXJyb3IoZXJyb3IpKTsKKworCQlERUJVR19QUklOVChERUJVR19NQVgsICJsb2NhbDphZGRyPSVzLCBwb3J0PSVzLCBmYW1pbHk9JWRcbiIsCisJCQkgICAgaG9zdF9zLCBzZXJ2X3MsIHJlcy0+YWlfZmFtaWx5KTsKKworCQlmcmVlYWRkcmluZm8ocmVzKTsKKyAgICAgICAgfQorCisKKwkvKiBBIGhhbGYtaGVhcnRlZCBhdHRlbXB0IHRvIHNlZWQgcmFuZCgpICovCisJaWYgKHNlZWQgPT0gMCApIHsKKwkJc2VlZCA9IHRpbWUoMCk7CisJCURFQlVHX1BSSU5UKERFQlVHX05PTkUsICJzZWVkID0gJWRcbiIsIHNlZWQpOwkKKwl9CisJCisJc3JhbmQoc2VlZCk7CisKKwkvKiBMZXQgdGhlIHRlc3RpbmcgYmVnaW4uICovCisJc3RhcnRfdGVzdChyb2xlKTsKKworCXJldHVybiAwOworCit9IC8qICBtYWluKCkgKi8KZGlmZiAtLWdpdCBhL3NyYy9hcHBzL3NjdHBfeGNvbm5lY3QuYyBiL3NyYy9hcHBzL3NjdHBfeGNvbm5lY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzU5YzBlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2FwcHMvc2N0cF94Y29ubmVjdC5jCkBAIC0wLDAgKzEsNTc5IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMworICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBSeWFuIExheWVyCQk8cm1sYXllckB1cy5pYm0uY29tPgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSAxOworaW50IFRTVF9DTlQgPSAwOworCisjZGVmaW5lIE1BWEhPU1ROQU1FIDY0CisKKyNkZWZpbmUgTUFYQ0xJRU5UTlVNIDEwMDAwCisKKyNkZWZpbmUgVFJVRSAxCisKKyNkZWZpbmUgU0VSVkVSIDEKKyNkZWZpbmUgQ0xJRU5UIDAKKyNkZWZpbmUgTk9UX0RFRklORUQgLTEKKworaW50IG1vZGUgPSBOT1RfREVGSU5FRDsKKworaW50CWFzc29jX251bSwKKwlyZW1vdGVfcG9ydCwKKwlsb2NhbF9wb3J0OworaW50IGFjdGl2ZSA9IDA7CisKK2NoYXIgKmxvY2FsX2hvc3QgPSBOVUxMOworY2hhciAqcmVtb3RlX2hvc3QgPSBOVUxMOworc29ja2FkZHJfc3RvcmFnZV90IGNsaWVudF9sb29wLAorCQlzZXJ2ZXJfbG9vcDsKK3N0cnVjdCBob3N0ZW50ICpoc3Q7CitjaGFyIGJpZ19idWZmZXJbUkVBTExZX0JJR107CisKK3ZvaWQgdXNhZ2UoY2hhciAqYXJndjApOwordm9pZCBwYXJzZV9hcmd1bWVudHMoaW50IGFyZ2MsIGNoYXIqYXJndltdKTsKK3ZvaWQgZGF0YV9yZWNlaXZlZChzdHJ1Y3QgbXNnaGRyICppbm1lc3NhZ2UsIGludCBsZW4sIGludCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VydmVyX3NvY2tldCk7CitpbnQgZXZlbnRfcmVjZWl2ZWQoc3RydWN0IG1zZ2hkciAqaW5tZXNzYWdlLCBpbnQgYXNzb2NfbnVtKTsKK3ZvaWQgcHJvY2Vzc19yZWFkeV9zb2NrZXRzKGludCBjbGllbnRfc29ja2V0W10sIGludCBhc3NvY19udW0sIGZkX3NldCAqcmZkcyk7Cit2b2lkIHNlcnZlcl9tb2RlKHZvaWQpOwordm9pZCBjbGllbnRfbW9kZSh2b2lkKTsKKworLyogUHJpbnQgdGhlIHN5bnRheC91c2FnZSAqLwordm9pZCB1c2FnZShjaGFyICphcmd2MCkKK3sKKwlwcmludGYoInVzYWdlOiAlcyAtSCBsb2NhbGhvc3QgLVAgbG9jYWxwb3J0IC1sfGMgWy1oIHJlbW90ZWhvc3RdXG4iCisJICAgICAgICJcdFx0Wy1wIHJlbW90ZXBvcnRdIFstYV0gWy1uIDxjbnQ+XVxuIiAKKwkgICAgICAgIiAtSFx0XHRzcGVjaWZ5IGEgbG9jYWwgYWRkcmVzcy5cbiIKKwkgICAgICAgIiAtUFx0XHRzcGVjaWZ5IHRoZSBsb2NhbCBwb3J0IG51bWJlciB0byBiZSB1c2VkXG4iCisJICAgICAgICIgLWxcdFx0cnVuIGluIHNlcnZlciBtb2RlLlxuIgorCSAgICAgICAiIC1jXHRcdHJ1biBpbiBjbGllbnQgbW9kZS5cbiIKKwkgICAgICAgIiAtaFx0XHRzcGVjaWZ5IHRoZSBwZWVyIGFkZHJlc3MuXG4iCisJICAgICAgICIgLXBcdFx0c3BlY2lmeSB0aGUgcG9ydCBudW1iZXIgZm9yIHRoZSBwZWVyIGFkZHJlc3MuXG4iCisJICAgICAgICIgLWFcdFx0YWN0aXZlbHkgZ2VuZXJhdGUgdHJhZmZpYyB3aXRoIHRoZSBzZXJ2ZXIuXG4iCisJICAgICAgICIgLW5cdFx0c3BlY2lmeSB0aGUgbnVtYmVyIG9mIGFzc29jaWF0aW9ucyB0byBjcmVhdGUuXG4iLAorCSAgICAgICBhcmd2MCk7Cit9CisKKy8qIFBhcnNlIGNvbW1hbmQgbGluZSBvcHRpb25zICovCit2b2lkIHBhcnNlX2FyZ3VtZW50cyhpbnQgYXJnYywgY2hhciphcmd2W10pIHsKKwlpbnQgYzsKKworCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiOkg6UDphY2g6bG46cDoiKSkgPj0gMCkgeworCQlzd2l0Y2ggKGMpIHsKKwkJCWNhc2UgJ0gnOgorCQkJCWxvY2FsX2hvc3QgPSBvcHRhcmc7CisJCQkJYnJlYWs7CisJCQljYXNlICdQJzoKKwkJCQlsb2NhbF9wb3J0ID0gYXRvaShvcHRhcmcpOworCQkJCWJyZWFrOworCQkJY2FzZSAnYyc6CisJCQkgICAgaWYgKG1vZGUgPT0gTk9UX0RFRklORUQpCisJCQkJCW1vZGUgPSBDTElFTlQ7CisJCQkJZWxzZSB7CisJCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJCQlleGl0KDApOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgJ2EnOgorCQkJCWFjdGl2ZSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdoJzoKKwkJCQlyZW1vdGVfaG9zdCA9IG9wdGFyZzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2wnOgorCQkJICAgIGlmIChtb2RlID09IE5PVF9ERUZJTkVEKQorCQkJCQltb2RlID0gU0VSVkVSOworCQkJCWVsc2UgeworCQkJCQl1c2FnZShhcmd2WzBdKTsKKwkJCQkJZXhpdCgwKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlICduJzoKKwkJCQlhc3NvY19udW0gPSBhdG9pKG9wdGFyZyk7CisJCQkJYnJlYWs7CisJCQljYXNlICdwJzoKKwkJCQlyZW1vdGVfcG9ydCA9IGF0b2kob3B0YXJnKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdXNhZ2UoYXJndlswXSk7CisJCQkJZXhpdCgwKTsKKwkJfQorCX0gLyogd2hpbGUoKSAqLworCisJaWYgKG1vZGUgPT0gQ0xJRU5UKSB7CisJCWlmIChhc3NvY19udW0pIHsKKwkJCWlmIChhc3NvY19udW0gPiBNQVhDTElFTlROVU0pIHsKKwkJCQlwcmludGYoIlRoZSBudW1iZXIgb2YgYXNzb2NpYXRpb25zIGluZGljYXRlZCAiCisJCQkJCSJpcyBncmVhdGVyIHRoYW4gdGhlIik7CisJCQkJcHJpbnRmKCJtYXggbnVtYmVyIG9mIGFzc29jaWF0aW9ucyAiCisJCQkJCSJhbGxvd2VkKCVkKS4iLCBNQVhDTElFTlROVU0pOworCQkJCXVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoMCk7CisJCQl9CisJCX0gZWxzZQorCQkJYXNzb2NfbnVtID0gMTsKKworCQlpZiAocmVtb3RlX2hvc3QgJiYgcmVtb3RlX3BvcnQpIHsKKwkJCWhzdCA9IGdldGhvc3RieW5hbWUocmVtb3RlX2hvc3QpOworCisJCQltZW1jcHkoJnNlcnZlcl9sb29wLnY0LnNpbl9hZGRyLCBoc3QtPmhfYWRkcl9saXN0WzBdLAorCQkJCSAgIHNpemVvZihzZXJ2ZXJfbG9vcC52NC5zaW5fYWRkcikpOworCisJCQlzZXJ2ZXJfbG9vcC52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKK3NlcnZlcl9sb29wLnY0LnNpbl9wb3J0ID0gaHRvbnMocmVtb3RlX3BvcnQpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCJSZW1vdGUgaG9zdCBhbmQgcmVtb3RlIHBvcnQgbXVzdCBiZSBkZWZpbmVkICIKKwkJCQkiaW4gY2xpZW50IG1vZGVcbiIpOworCQkJdXNhZ2UoYXJndlswXSk7CisJCQlleGl0KDApOworCQl9CisKKwkJaWYgKGxvY2FsX2hvc3QpIHsKKwkJCWhzdCA9IGdldGhvc3RieW5hbWUobG9jYWxfaG9zdCk7CisKKwkJCW1lbWNweSgmY2xpZW50X2xvb3AudjQuc2luX2FkZHIsIGhzdC0+aF9hZGRyX2xpc3RbMF0sCisJCQkJICAgc2l6ZW9mKGNsaWVudF9sb29wLnY0LnNpbl9hZGRyKSk7CisJCX0gZWxzZQorCQkJY2xpZW50X2xvb3AudjQuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCQlpZiAobG9jYWxfcG9ydCkKKwkJCWNsaWVudF9sb29wLnY0LnNpbl9wb3J0ID0gaHRvbnMobG9jYWxfcG9ydCk7CisJCWVsc2UKKwkJCWNsaWVudF9sb29wLnY0LnNpbl9wb3J0ID0gMDsKKworCQljbGllbnRfbG9vcC52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwl9IGVsc2UgaWYgKG1vZGUgPT0gU0VSVkVSKSB7CisJCWlmIChhY3RpdmUpIHsKKwkJCXByaW50ZigiVGhpcyBvcHRpb24gaWYgZm9yIGNsaWVudCB1c2Ugb25seSIpOworCQkJdXNhZ2UoYXJndlswXSk7CisJCQlleGl0KDApOworCQl9CisKKwkJaWYgKHJlbW90ZV9ob3N0IHx8IHJlbW90ZV9wb3J0KSB7CisJCQlwcmludGYoIlJlbW90ZSB2YWx1ZXMgbm90IG5lZWRlZCBpbiBzZXJ2ZXIgbW9kZS5cbiIpOworCQkJdXNhZ2UoYXJndlswXSk7CisJCQlleGl0KDApOworCQl9CisKKwkJaWYgKGxvY2FsX2hvc3QpIHsKKwkJCWhzdCA9IGdldGhvc3RieW5hbWUobG9jYWxfaG9zdCk7CisKKwkJCW1lbWNweSgmc2VydmVyX2xvb3AudjQuc2luX2FkZHIsIGhzdC0+aF9hZGRyX2xpc3RbMF0sCisJCQkJICAgc2l6ZW9mKHNlcnZlcl9sb29wLnY0LnNpbl9hZGRyKSk7CisJCX0gZWxzZQorCQkJc2VydmVyX2xvb3AudjQuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKworCQlpZiAobG9jYWxfcG9ydCkKKwkJCXNlcnZlcl9sb29wLnY0LnNpbl9wb3J0ID0gaHRvbnMobG9jYWxfcG9ydCk7CisJCWVsc2UgeworCQkJcHJpbnRmKCJTcGVjaWZ5IGEgbG9jYWwgcG9ydCBpbiBzZXJ2ZXIgbW9kZS5cbiIpOworCQkJdXNhZ2UoYXJndlswXSk7CisJCQlleGl0KDApOworCQl9CisKKwkJc2VydmVyX2xvb3AudjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJNdXN0IGFzc2lzZ24gYSBjbGllbnQgb3Igc2VydmVyIG1vZGUuXG4iKTsKKwkJdXNhZ2UoYXJndlswXSk7CisJCWV4aXQoMCk7CisJfQorfSAvKiBwYXJzZV9hcmd1bWVudHMoKSAqLworCisvKiBIYW5kbGUgZGF0YSByZWNlaXZlZCAqLwordm9pZCBkYXRhX3JlY2VpdmVkKHN0cnVjdCBtc2doZHIgKmlubWVzc2FnZSwgaW50IGxlbiwgaW50IHN0cmVhbSwgaW50IHNvY2tldCkgeworCisJaW50IHBwaWQsIGVycm9yOworCWNoYXIgKnBpbmcgPSAiUElORyI7CisKKwlpZiAobW9kZSA9PSBTRVJWRVIpIHsKKwkJcHBpZCA9IHJhbmQoKTsKKworCQllcnJvciA9IHNjdHBfc2VuZG1zZyhzb2NrZXQsCisJCQkJaW5tZXNzYWdlLT5tc2dfaW92LT5pb3ZfYmFzZSwKKwkJCQlsZW4sCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKWlubWVzc2FnZS0+bXNnX25hbWUsCisJCQkJaW5tZXNzYWdlLT5tc2dfbmFtZWxlbiwKKwkJCQlwcGlkLAorCQkJCTAsCisJCQkJc3RyZWFtLAorCQkJCTAsIDApOworCisJCWlmIChlcnJvciA8IDApIHsKKwkJCXByaW50ZigiU2VuZCBGYWlsdXJlOiAlcy5cbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlEVU1QX0NPUkU7CisJCX0KKwl9IGVsc2UgeworCQlwcGlkID0gcmFuZCgpOworCisJCXByaW50ZigiRGF0YSBSZWNlaXZlZCBieSBzb2NrZXQgIzogJWQuXG4iLCBzb2NrZXQpOworCQlwcmludGYoIlx0TWVzc2FnZSA9ICVzXG4iLAorCQkJKGNoYXIgKilpbm1lc3NhZ2UtPm1zZ19pb3YtPmlvdl9iYXNlKTsKKworCQlpZiAoYWN0aXZlKSB7CisJCQllcnJvciA9IHNjdHBfc2VuZG1zZyhzb2NrZXQsIHBpbmcsIHN0cmxlbihwaW5nKSArIDEsCisJCQkJCSAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZzZXJ2ZXJfbG9vcCwKKwkJCQkJICAgICBzaXplb2Yoc2VydmVyX2xvb3ApLCBwcGlkLCAwLAorCQkJCQkgICAgIHN0cmVhbSwgMCwgMCk7CisJCQlpZiAoZXJyb3IgPCAwKSB7CisJCQkJcHJpbnRmKCJTZW5kIEZhaWx1cmU6ICVzLlxuIiwKKwkJCQkgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlEVU1QX0NPUkU7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIFRoaXMgd2lsbCBwcmludCB3aGF0IHR5cGUgb2YgU0NUUF9BU1NPQ19DSEFOR0Ugc3RhdGUgdGhhdCB3YXMgcmVjZWl2ZWQgKi8KK3ZvaWQgcHJpbnRfc2N0cF9zYWNfc3RhdGUoc3RydWN0IG1zZ2hkciAqbXNnKSB7CisKKwljaGFyICpkYXRhOworCXVuaW9uIHNjdHBfbm90aWZpY2F0aW9uICpzbjsKKworCWlmIChtc2ctPm1zZ19mbGFncyAmIE1TR19OT1RJRklDQVRJT04pIHsKKwkJZGF0YSA9IChjaGFyICopbXNnLT5tc2dfaW92WzBdLmlvdl9iYXNlOworCisJCXNuID0gKHVuaW9uIHNjdHBfbm90aWZpY2F0aW9uICopZGF0YTsKKworCQlzd2l0Y2ggKHNuLT5zbl9hc3NvY19jaGFuZ2Uuc2FjX3N0YXRlKSB7CisJCQkJY2FzZSBTQ1RQX0NPTU1fVVA6CisJCQkJCQlwcmludGYoIlNDVFBfQ09NTV9VUFxuIik7CisJCQkJCQlicmVhazsKKwkJCQljYXNlIFNDVFBfQ09NTV9MT1NUOgorCQkJCQkJcHJpbnRmKCJTQ1RQX0NPTU1fTE9TVFxuIik7CisJCQkJCQlicmVhazsKKwkJCQljYXNlIFNDVFBfUkVTVEFSVDoKKwkJCQkJCXByaW50ZigiU0NUUF9SRVNUQVJUIik7CisJCQkJCQlicmVhazsKKwkJCQljYXNlIFNDVFBfU0hVVERPV05fQ09NUDoKKwkJCQkJCXByaW50ZigiU0NUUF9TSFVURE9XTl9DT01QXG4iKTsKKwkJCQkJCWJyZWFrOworCQkJCWNhc2UgU0NUUF9DQU5UX1NUUl9BU1NPQzoKKwkJCQkJCXByaW50ZigiU0NUUF9DQU5UX1NUUl9BU1NPQ1xuIik7CisJCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQkJYnJlYWs7CisJCX0KKwl9Cit9IC8qIHZvaWQgcHJpbnRfc2N0cF9zYWNfc3RhdGUoKSAqLworCisvKiBUZXN0cyB3aGF0IHR5cGUgb2YgTVNHX05PVElGSUNBVElPTiBoYXMgYmVlbiByZWNlaXZlZC4KKyogRm9yIG5vdyB0aGlzIGZ1Y250aW9uIG9ubHkgd29ya3Mgd2l0aCBTQ1RQX0FTU09DX0NIQU5HRSAKKyogdHlwZXMsIGJ1dCBjYW4gYmUgZWFzaWx5IGV4cGFuZGVkLgorKgorKiBXaWxsIHJldHVybi4uLgorKiAtMSBpZiB0aGUgbXNnX2ZsYWdzIGlzIG5vdCBNU0dfTk9USUZJQ0FUSU9OCisqICAwIGlmIHRoZSBNU0dfTk9USUZJQ0FUSU9OIHR5cGUgZGlmZmVycyBmcm9tIHRoZSB0eXBlCisqICAgICAgIHBhc3NlZCBpbnRvIHRoZSBhZGRpdGlvbmFsIHZhcmlhYmxlCisqICAxIGlmIHRoZSBNU0dfTk9USUZJQ0FUSU9OIHR5cGUgbWF0Y2hlcyB0aGUgdHlwZQorKiAgICAgICBwYXNzZWQgaW50byB0aGUgYWRkaXRpb25hbCB2YXJpYWJsZQorKi8KK2ludCB0ZXN0X2NoZWNrX25vdGlmaWNhdGlvbl90eXBlKHN0cnVjdCBtc2doZHIgKm1zZywKKwl1aW50MTZfdCBzbl90eXBlLAorCXVpbnQzMl90IGFkZGl0aW9uYWwpIHsKKworCWNoYXIgKmRhdGE7CisJdW5pb24gc2N0cF9ub3RpZmljYXRpb24gKnNuOworCisJaWYgKCEobXNnLT5tc2dfZmxhZ3MgJiBNU0dfTk9USUZJQ0FUSU9OKSkgeworCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKworCQkvKiBGaXh1cCBmb3IgdGVzdGZyYW1lLiAqLworCQlkYXRhID0gKGNoYXIgKiltc2ctPm1zZ19pb3ZbMF0uaW92X2Jhc2U7CisKKwkJc24gPSAodW5pb24gc2N0cF9ub3RpZmljYXRpb24gKilkYXRhOworCisJCWlmIChzbi0+c25faGVhZGVyLnNuX3R5cGUgIT0gc25fdHlwZSkKKwkJCXJldHVybiAwOworCQllbHNlIGlmIChzbi0+c25faGVhZGVyLnNuX3R5cGUgPT0gU0NUUF9BU1NPQ19DSEFOR0UpCisJCQlpZiAoc24tPnNuX2Fzc29jX2NoYW5nZS5zYWNfc3RhdGUgPT0gYWRkaXRpb25hbCkKKwkJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiBEZXRlcm1pbmUgdGhlIHR5cGUgb2YgZXZlbnQgYW5kIG1ha2UgY29ycmVjdCBhZGp1c3RtZW50cyB0byB0aGUKKyogYXNzb2NpYXRpb24gY291bnQKKyovCitpbnQgZXZlbnRfcmVjZWl2ZWQoc3RydWN0IG1zZ2hkciAqaW5tZXNzYWdlLCBpbnQgYXNzb2NfbnVtKSB7CisKKwlpbnQgZXJyb3I7CisKKwlwcmludGYoIkV2ZW50IFJlY2VpdmVkXG4iKTsKKworCXByaW50X3NjdHBfc2FjX3N0YXRlKGlubWVzc2FnZSk7CisKKwlpZiAobW9kZSA9PSBTRVJWRVIpIHsKKwkJLyogVGVzdCB0eXBlIG9mIEV2ZW50ICovCisJCWVycm9yID0gdGVzdF9jaGVja19ub3RpZmljYXRpb25fdHlwZShpbm1lc3NhZ2UsCisJCQkJCQlTQ1RQX0FTU09DX0NIQU5HRSwKKwkJCQkJCVNDVFBfQ09NTV9VUCk7CisJCWlmIChlcnJvciA+IDApIHsKKwkJCWFzc29jX251bSsrOworCQkJcHJpbnRmKCJBc3Nvc2lhdGlvbiBFc3RhYmxpc2hlZDogY291bnQgPSAlZC5cbiIsCisJCQkJYXNzb2NfbnVtKTsKKwkJfSBlbHNlIHsKKwkJCWVycm9yID0gdGVzdF9jaGVja19ub3RpZmljYXRpb25fdHlwZShpbm1lc3NhZ2UsCisJCQkJCQkJU0NUUF9BU1NPQ19DSEFOR0UsCisJCQkJCQkJU0NUUF9TSFVURE9XTl9DT01QKTsKKworCQkJaWYgKGVycm9yID4gMCkgeworCQkJCWFzc29jX251bS0tOworCQkJCXByaW50ZigiQXNzb3NpYXRpb24gU2h1dGRvd246IGNvdW50ID0gJWQuXG4iLAorCQkJCQlhc3NvY19udW0pOworCQkJfQorCQl9CisJfQorCXJldHVybiBhc3NvY19udW07Cit9CisKK3ZvaWQgc2VydmVyX21vZGUoKSB7CisJc29ja2FkZHJfc3RvcmFnZV90IG1zZ25hbWU7CisJaW50IHNlcnZlcl9zb2NrZXQsCisJCWVycm9yLAorCQlzdHJlYW07CisJaW50IGFzc29jX251bSA9MDsKKwlzdHJ1Y3QgbXNnaGRyIGlubWVzc2FnZTsKKwlzdHJ1Y3QgaW92ZWMgaW92OworCWNoYXIgaW5jbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHNjdHBfY21zZ19kYXRhX3QpKV07CisKKworCXByaW50ZigiUnVubmluZyBpbiBTZXJ2ZXIgTW9kZS4uLlxuIik7CisKKwltZW1zZXQoJmlubWVzc2FnZSwgMCwgc2l6ZW9mKGlubWVzc2FnZSkpOworCWlvdi5pb3ZfYmFzZSA9IGJpZ19idWZmZXI7CisJaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworCWlubWVzc2FnZS5tc2dfaW92ID0gJmlvdjsKKwlpbm1lc3NhZ2UubXNnX2lvdmxlbiA9MTsKKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJaW5tZXNzYWdlLm1zZ19uYW1lID0gJm1zZ25hbWU7CisJaW5tZXNzYWdlLm1zZ19uYW1lbGVuID0gc2l6ZW9mIChtc2duYW1lKTsKKworCXN0cmVhbSA9IDE7CisKKwlzZXJ2ZXJfc29ja2V0ID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCWlmIChzZXJ2ZXJfc29ja2V0IDwgMCkgeworCQlwcmludGYoIlNvY2tldCBGYWlsdXJlOiAgJXMuXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlEVU1QX0NPUkU7CisJfQorCisJZXJyb3IgPSBiaW5kKHNlcnZlcl9zb2NrZXQsICZzZXJ2ZXJfbG9vcC5zYSwgc2l6ZW9mKHNlcnZlcl9sb29wKSk7CisJaWYgKGVycm9yICE9IDAgKSB7CisJCXByaW50ZigiQmluZCBGYWlsdXJlOiAlcy5cbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCURVTVBfQ09SRTsKKwl9CisKKwllcnJvciA9IGxpc3RlbihzZXJ2ZXJfc29ja2V0LCAxKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlwcmludGYoIkxpc3RlbiBGYWlsdXJlOiAlcy5cbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCURVTVBfQ09SRTsKKwl9CisJd2hpbGUgKFRSVUUpIHsKKwkJZXJyb3IgPSByZWN2bXNnKHNlcnZlcl9zb2NrZXQsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwkJaWYgKGVycm9yIDwgMCkgeworCQkJcHJpbnRmKCJSZWNlaXZlIEZhaWx1cmU6ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJfSBlbHNlIHsKKwkJaWYgKGlubWVzc2FnZS5tc2dfZmxhZ3MgJiBNU0dfTk9USUZJQ0FUSU9OKQorCQkJYXNzb2NfbnVtID0gZXZlbnRfcmVjZWl2ZWQoJmlubWVzc2FnZSwgYXNzb2NfbnVtKTsKKwkJZWxzZQorCQkJZGF0YV9yZWNlaXZlZCgmaW5tZXNzYWdlLCBlcnJvciwgc3RyZWFtLCBzZXJ2ZXJfc29ja2V0KTsKKwkJfQorCX0KK30KKwordm9pZCBjbGllbnRfbW9kZSgpIHsKKworCWludCBpLCBlcnJvciwgc3RyZWFtLCBtYXhfc29ja2V0ID0gMDsKKwl1aW50MzJfdCBwcGlkID0gMDsKKwlpbnQgY2xpZW50X3NvY2tldFthc3NvY19udW1dOworCWNoYXIgKm1lc3NhZ2UgPSAiQXdha2UiOworCWZkX3NldCByZmRzOworCXN0cnVjdCB0aW1ldmFsIHR2OworCisgICAgICAgIHN0cmVhbSA9IDE7CisKKwlwcmludGYoIlJ1bm5pbmcgaW4gQ2xpZW50IE1vZGUuLi5cbiIpOworCisgICAgICAgIC8qIENyZWF0ZSB0aGUgc29ja2V0cyAqLworCWZvciAoaSA9IDA7IGkgPCBhc3NvY19udW07IGkrKykgeworCQljbGllbnRfc29ja2V0W2ldID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfU0VRUEFDS0VULAorCQkJCQlJUFBST1RPX1NDVFApOworCQlpZiAoY2xpZW50X3NvY2tldFtpXSA8IDAgKXsKKwkJCXByaW50ZigiU29ja2V0IEZhaWx1cmU6ICVzLlxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCURVTVBfQ09SRTsKKwkJfQorCisJCWlmIChsb2NhbF9wb3J0KSB7CisJCQllcnJvciA9IGJpbmQoY2xpZW50X3NvY2tldFtpXSwgJmNsaWVudF9sb29wLnNhLAorCQkJCXNpemVvZihjbGllbnRfbG9vcCkpOworCQkJaWYgKGVycm9yIDwgMCkgeworCQkJCXByaW50ZigiQmluZCBGYWlsdXJlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlEVU1QX0NPUkU7CisJCQl9CisJCX0KKworCQlwcmludGYoIkNyZWF0ZSBTb2NrZXQgIzogJWRcbiIsIGNsaWVudF9zb2NrZXRbaV0pOworCisJCS8qIENvbm5lY3QgdG8gc2VydmVyIGFuZCBzZW5kIGluaXRpYWwgbWVzc2FnZSAqLworCQllcnJvciA9IGNvbm5lY3QoY2xpZW50X3NvY2tldFtpXSwgJnNlcnZlcl9sb29wLnNhLAorCQkJCQkJICAgIHNpemVvZihzZXJ2ZXJfbG9vcCkpOworCQlpZiAoZXJyb3IgPCAwKXsKKwkJCXByaW50ZigiQ29ubmVjdCBGYWlsdXJlOiAlcy5cbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlEVU1QX0NPUkU7CisJCX0KKworCQltYXhfc29ja2V0ID0gY2xpZW50X3NvY2tldFtpXTsKKworICAgICAgICAgICAgICAgIHBwaWQrKzsKKworCQkvKiBTZW5kIGluaXRpYWwgbWVzc2FnZSAqLworCQllcnJvciA9IHNjdHBfc2VuZG1zZyhjbGllbnRfc29ja2V0W2ldLAorCQkJCW1lc3NhZ2UsCisJCQkJc3RybGVuKG1lc3NhZ2UpICsgMSwKKwkJCQkoc3RydWN0IHNvY2thZGRyICopJnNlcnZlcl9sb29wLAorCQkJCXNpemVvZihzZXJ2ZXJfbG9vcCksCisJCQkJcHBpZCwKKwkJCQkwLAorCQkJCXN0cmVhbSwKKwkJCQkwLCAwKTsKKwkJaWYgKGVycm9yIDwgMCApIHsKKwkJCXByaW50ZigiU2VuZCBGYWlsdXJlOiAlcy5cbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlEVU1QX0NPUkU7CisJCX0KKwl9CisKKwl3aGlsZSAoVFJVRSl7CisKKwkJLyogQ2xlYXIgdGhlIHNldCBmb3Igc2VsZWN0KCkgKi8KKwkJRkRfWkVSTygmcmZkcyk7CisKKwkJLyogU2V0IHRpbWUgb3V0IHZhbHVlcyBmb3Igc2VsZWN0KCkgKi8KKwkJdHYudHZfc2VjID0gNTsKKwkJdHYudHZfdXNlYyA9IDA7CisKKwkJLyogQWRkIHRoZSBzb2NrZXRzIHNlbGVjdCgpIHdpbGwgZXhhbWluZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgYXNzb2NfbnVtOyBpKyspIHsKKwkJCUZEX1NFVChjbGllbnRfc29ja2V0W2ldLCAmcmZkcyk7CisJCX0KKworCQkvKiBXYWl0IHVudGlsIHRoZXJlIGlzIGRhdGEgdG8gYmUgcmVhZCBmcm9tIG9uZSBvZiB0aGUKKwkJICogc29ja2V0cywgb3IgdW50aWwgdGhlIHRpbWVyIGV4cGlyZXMKKwkJICovCisJCWVycm9yID0gc2VsZWN0KG1heF9zb2NrZXQgKyAxLCAmcmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKKworCQlpZiAoZXJyb3IgPCAwKSB7CisJCQlwcmludGYoIlNlbGVjdCBGYWlsdXJlOiAlcy5cbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQlEVU1QX0NPUkU7CisJCX0gZWxzZSBpZiAoZXJyb3IpIHsKKwkJCS8qIExvb3AgdGhyb3VnaCB0aGUgYXJyYXkgb2Ygc29ja2V0cyB0byBmaW5kIHRoZSBvbmVzCisJCQkgKnRoYXQgaGF2ZSBpbmZvcm1hdGlvbiB0byBiZSByZWFkCisJCQkgKi8KKwkJCXByb2Nlc3NfcmVhZHlfc29ja2V0cyhjbGllbnRfc29ja2V0LCBhc3NvY19udW0sICZyZmRzKTsKKwkJfQorCX0KK30KKwordm9pZCBwcm9jZXNzX3JlYWR5X3NvY2tldHMoaW50IGNsaWVudF9zb2NrZXRbXSwgaW50IGFzc29jX251bSwgZmRfc2V0ICpyZmRzKSB7CisKKyAgICAgICAgaW50IGksIHN0cmVhbSwgZXJyb3I7CisJc3RydWN0IG1zZ2hkciBpbm1lc3NhZ2U7CisJc3RydWN0IGlvdmVjIGlvdjsKKwljaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZiAoc2N0cF9jbXNnX2RhdGFfdCkpXTsKKwlzb2NrYWRkcl9zdG9yYWdlX3QgbXNnbmFtZTsKKworICAgICAgICAvKiBTZXR1cCBpbm1lc3NhZ2UgdG8gYmUgYWJsZSB0byByZWNlaXZlIGluIGluY29tbWluZyBtZXNzYWdlICovCisJbWVtc2V0KCZpbm1lc3NhZ2UsIDAsIHNpemVvZiAoaW5tZXNzYWdlKSk7CisJaW92Lmlvdl9iYXNlID0gYmlnX2J1ZmZlcjsKKwlpb3YuaW92X2xlbiA9IFJFQUxMWV9CSUc7CisJaW5tZXNzYWdlLm1zZ19pb3YgPSAmaW92OworCWlubWVzc2FnZS5tc2dfaW92bGVuID0xOworCWlubWVzc2FnZS5tc2dfY29udHJvbCA9IGluY21zZzsKKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YgKGluY21zZyk7CisJaW5tZXNzYWdlLm1zZ19uYW1lID0gJm1zZ25hbWU7CisJaW5tZXNzYWdlLm1zZ19uYW1lbGVuID0gc2l6ZW9mIChtc2duYW1lKTsKKworCXN0cmVhbSA9IDE7CisKKwlmb3IoIGkgPSAwOyBpIDwgYXNzb2NfbnVtOyBpKyspIHsKKwkJaWYgKEZEX0lTU0VUKGNsaWVudF9zb2NrZXRbaV0sIHJmZHMpKSB7CisJCQkJZXJyb3IgPSByZWN2bXNnKGNsaWVudF9zb2NrZXRbaV0sICZpbm1lc3NhZ2UsCisJCQkJCQlNU0dfV0FJVEFMTCk7CisJCQkJaWYgKGVycm9yIDwgMCkKKwkJCQkJCXByaW50ZigiUmVjZWl2ZSBGYWlsdXJlOiAlc1xuIiwKKwkJCQkJCQlzdHJlcnJvcihlcnJubykpOworCQkJCWVsc2UgeworCQkvKiBUZXN0IHRvIGZpbmQgdGhlIHR5cGUgb2YgbWVzc2FnZSB0aGF0IHdhcyByZWFkKGV2ZW50L2RhdGEpICovCisJCQkJCWlmIChpbm1lc3NhZ2UubXNnX2ZsYWdzICYKKwkJCQkJCU1TR19OT1RJRklDQVRJT04pCisJCQkJCQkgZXZlbnRfcmVjZWl2ZWQoJmlubWVzc2FnZSwKKwkJCQkJCQkJMCk7CisKKwkJCQkJZWxzZQorCQkJCQkJZGF0YV9yZWNlaXZlZCgmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkJCQlzdHJlYW0sCisJCQkJCQkJY2xpZW50X3NvY2tldFtpXSk7CisJCQl9CisJCX0KKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKworCXBhcnNlX2FyZ3VtZW50cyhhcmdjLCBhcmd2KTsKKworCWlmIChtb2RlID09IFNFUlZFUikgeworCQlzZXJ2ZXJfbW9kZSgpOworCX0gZWxzZSBpZiAobW9kZSA9PSBDTElFTlQpeworCQljbGllbnRfbW9kZSgpOworCX0KKwlleGl0KDEpOworfQorCmRpZmYgLS1naXQgYS9zcmMvZnVuY190ZXN0cy8uZ2l0aWdub3JlIGIvc3JjL2Z1bmNfdGVzdHMvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjBkYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDQxIEBACit0ZXN0XzFfdG9fMV9hY2NlcHRfY2xvc2UKK3Rlc3RfMV90b18xX2FkZHJzCit0ZXN0XzFfdG9fMV9jb25uZWN0Cit0ZXN0XzFfdG9fMV9jb25uZWN0eAordGVzdF8xX3RvXzFfZXZlbnRzCit0ZXN0XzFfdG9fMV9pbml0bXNnX2Nvbm5lY3QKK3Rlc3RfMV90b18xX25vbmJsb2NrCit0ZXN0XzFfdG9fMV9yZWN2ZnJvbQordGVzdF8xX3RvXzFfcmVjdm1zZwordGVzdF8xX3RvXzFfcnRvaW5mbwordGVzdF8xX3RvXzFfc2VuZAordGVzdF8xX3RvXzFfc2VuZG1zZwordGVzdF8xX3RvXzFfc2VuZHRvCit0ZXN0XzFfdG9fMV9zaHV0ZG93bgordGVzdF8xX3RvXzFfc29ja2V0X2JpbmRfbGlzdGVuCit0ZXN0XzFfdG9fMV9zb2Nrb3B0Cit0ZXN0XzFfdG9fMV90aHJlYWRzCit0ZXN0X2Fzc29jX2Fib3J0Cit0ZXN0X2Fzc29jX3NodXRkb3duCit0ZXN0X2F1dG9jbG9zZQordGVzdF9iYXNpYwordGVzdF9iYXNpY192NgordGVzdF9jb25uZWN0Cit0ZXN0X2Nvbm5lY3R4Cit0ZXN0X2ZyYWdtZW50cwordGVzdF9mcmFnbWVudHNfdjYKK3Rlc3RfZ2V0bmFtZQordGVzdF9nZXRuYW1lX3Y2Cit0ZXN0X2luYWRkcl9hbnkKK3Rlc3RfaW5hZGRyX2FueV92NgordGVzdF9wZWVsb2ZmCit0ZXN0X3BlZWxvZmZfdjYKK3Rlc3RfcmVjdm1zZwordGVzdF9zY3RwX3NlbmRyZWN2bXNnCit0ZXN0X3NjdHBfc2VuZHJlY3Ztc2dfdjYKK3Rlc3Rfc29ja29wdAordGVzdF9zb2Nrb3B0X3Y2Cit0ZXN0X3RjcF9zdHlsZQordGVzdF90Y3Bfc3R5bGVfdjYKK3Rlc3RfdGltZXRvbGl2ZQordGVzdF90aW1ldG9saXZlX3Y2CmRpZmYgLS1naXQgYS9zcmMvZnVuY190ZXN0cy9NYWtlZmlsZS5hbSBiL3NyYy9mdW5jX3Rlc3RzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YmY0NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZnVuY190ZXN0cy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE3OSBAQAorIyBJbmNsdWRlIHRoZXNlIHR3byBpbiBhbGwgdGhlIE1ha2VmaWxlLmFtJ3MhISEKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS52YXJzCitpbmNsdWRlICQodG9wX3NyY2RpcikvTWFrZWZpbGUucnVsZXMKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5kaXJzCisKKyMgR2VuZXJhbCBjb21waWxhdGlvbiBmbGFncworQU1fQ1BQRkxBR1MgPSAtSS4gLUkkKHRvcF9idWlsZGRpcikvc3JjL2luY2x1ZGUgLUkkKHRvcF9zcmNkaXIpL3NyYy90ZXN0bGliIFwKKyAgICAgICAgICAgICAgLWcgLU8yIC1mbm8tc3RyaWN0LWFsaWFzaW5nIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMgXAorICAgICAgICAgICAgICAtV2ltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uCisKK0FNX0xERkxBR1MgPSAtbHB0aHJlYWQKKworTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL3Rlc3RsaWIvbGlic2N0cHV0aWwubGEgXAorCSQodG9wX2J1aWxkZGlyKS9zcmMvbGliL2xpYnNjdHAubGEKKworVjZGTEFHUyA9IC1EQ09ORklHX0lQVjY9MSAtRFRFU1RfVjY9MSAke0RFRlN9ICR7SU5DTFVERVN9ICR7Q0ZMQUdTfQorCisjIFRlc3QgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcyB0byBidWlsZAorUEFTU0lOR19LRVJOX1RFU1RTID0gXAorCXRlc3RfYXNzb2NfYWJvcnQgXAorCXRlc3RfYXNzb2Nfc2h1dGRvd24gXAorCXRlc3RfYXV0b2Nsb3NlIFwKKwl0ZXN0X2Jhc2ljIFwKKwl0ZXN0X2ZyYWdtZW50cyBcCisJdGVzdF9pbmFkZHJfYW55IFwKKwl0ZXN0X3BlZWxvZmYgXAorCXRlc3Rfc29ja29wdCBcCisJdGVzdF9jb25uZWN0IFwKKwl0ZXN0X2Nvbm5lY3R4IFwKKwl0ZXN0X3JlY3Ztc2cgXAorCXRlc3RfdGltZXRvbGl2ZSBcCisJdGVzdF9zY3RwX3NlbmRyZWN2bXNnIFwKKwl0ZXN0X2dldG5hbWUgXAorCXRlc3RfdGNwX3N0eWxlXAorCXRlc3RfMV90b18xX3NvY2tldF9iaW5kX2xpc3RlbiBcCisJdGVzdF8xX3RvXzFfYWNjZXB0X2Nsb3NlIFwKKwl0ZXN0XzFfdG9fMV9jb25uZWN0IFwKKwl0ZXN0XzFfdG9fMV9jb25uZWN0eCBcCisJdGVzdF8xX3RvXzFfc2VuZCBcCisJdGVzdF8xX3RvXzFfc2VuZHRvIFwKKwl0ZXN0XzFfdG9fMV9zZW5kbXNnIFwKKwl0ZXN0XzFfdG9fMV9yZWN2ZnJvbSBcCisJdGVzdF8xX3RvXzFfcmVjdm1zZyBcCisJdGVzdF8xX3RvXzFfc2h1dGRvd24gXAorCXRlc3RfMV90b18xX3NvY2tvcHQgXAorCXRlc3RfMV90b18xX2FkZHJzIFwKKwl0ZXN0XzFfdG9fMV9ub25ibG9jayBcCisJdGVzdF8xX3RvXzFfcnRvaW5mbyBcCisJdGVzdF8xX3RvXzFfZXZlbnRzIFwKKwl0ZXN0XzFfdG9fMV90aHJlYWRzIFwKKwl0ZXN0XzFfdG9fMV9pbml0bXNnX2Nvbm5lY3QKKworUEFTU0lOR19WNl9LRVJOX1RFU1RTID0gXAorCXRlc3RfYmFzaWNfdjYgXAorCXRlc3Rfc29ja29wdF92NiBcCisJdGVzdF9mcmFnbWVudHNfdjYgXAorCXRlc3RfaW5hZGRyX2FueV92NiBcCisJdGVzdF9wZWVsb2ZmX3Y2IFwKKwl0ZXN0X3RpbWV0b2xpdmVfdjYgXAorCXRlc3Rfc2N0cF9zZW5kcmVjdm1zZ192NiBcCisJdGVzdF9nZXRuYW1lX3Y2IFwKKwl0ZXN0X3RjcF9zdHlsZV92NgorCitpZiBIQVZFX1NDVFBfU0VORFYKK1BBU1NJTkdfS0VSTl9URVNUUyArPSBcCisJdGVzdF9zY3RwX3NlbmR2cmVjdnYKK1BBU1NJTkdfVjZfS0VSTl9URVNUUyArPSBcCisJdGVzdF9zY3RwX3NlbmR2cmVjdnZfdjYKK2VuZGlmCisKK25vaW5zdF9QUk9HUkFNUyA9ICR7UEFTU0lOR19LRVJOX1RFU1RTfSAke1BBU1NJTkdfVjZfS0VSTl9URVNUU30KKworJCh0b3BfYnVpbGRkaXIpL3NyYy9saWIvbGlic2N0cC5sYToKKwkkKE1BS0UpIC1DICQodG9wX2J1aWxkZGlyKS9zcmMvbGliIGxpYnNjdHAubGEKKworJCh0b3BfYnVpbGRkaXIpL3NyYy90ZXN0bGliL2xpYnNjdHB1dGlsLmxhOgorCSQoTUFLRSkgLUMgJCh0b3BfYnVpbGRkaXIpL3NyYy90ZXN0bGliIGxpYnNjdHB1dGlsLmxhCisKKyMgVGhlc2UgYXJlIHRlc3RzIGZvciBsaXZlIGtlcm5lbHMgd2hpY2ggcGFzcy4KK3Y0dGVzdDogJHtQQVNTSU5HX0tFUk5fVEVTVFN9CisJQGZvciBhIGluICReOwkJCQlcCisJZG8gCQkJCQlcCisJCWVjaG8gIi4vJCRhIjsJCQlcCisJCWlmIC4vJCRhOwkJCVwKKwkJdGhlbgkJCQlcCisJCQllY2hvICIkJGEgcGFzc2VzIjsJXAorCQkJZWNobyAiIjsJCVwKKwkJZWxzZQkJCQlcCisJCQllY2hvICIkJGEgZmFpbHMiOwlcCisJCQlleGl0IDE7CQkJXAorCQlmaTsJCQkJXAorCQlzbGVlcCAxOwkJCVwKKwlkb25lCisJQGVjaG8gIkhvb2R5IGhvbyEiCisKKyMgVGhlc2UgYXJlIHRlc3RzIGZvciBsaXZlIGtlcm5lbHMgd2hpY2ggcGFzcy4KK3Y2dGVzdDogJHtQQVNTSU5HX1Y2X0tFUk5fVEVTVFN9CisJQGZvciBhIGluICReOwkJCQlcCisJZG8gCQkJCQlcCisJCWVjaG8gIi4vJCRhIjsJCQlcCisJCWlmIC4vJCRhOwkJCVwKKwkJdGhlbgkJCQlcCisJCQllY2hvICIkJGEgcGFzc2VzIjsJXAorCQkJZWNobyAiIjsJCVwKKwkJZWxzZQkJCQlcCisJCQllY2hvICIkJGEgZmFpbHMiOwlcCisJCQlleGl0IDE7CQkJXAorCQlmaTsJCQkJXAorCQlzbGVlcCAxOwkJCVwKKwlkb25lCisJQGVjaG8gIkhvb2R5IGhvbyEiCisKKyMgU3BlY2lmeWluZyB0aGUgc291cmNlcwordGVzdF9hc3NvY19hYm9ydF9TT1VSQ0VTID0gdGVzdF9hc3NvY19hYm9ydC5jIAordGVzdF9hc3NvY19zaHV0ZG93bl9TT1VSQ0VTID0gdGVzdF9hc3NvY19zaHV0ZG93bi5jIAordGVzdF9hdXRvY2xvc2VfU09VUkNFUyA9IHRlc3RfYXV0b2Nsb3NlLmMgCit0ZXN0X2Jhc2ljX1NPVVJDRVMgPSB0ZXN0X2Jhc2ljLmMgCit0ZXN0X2ZyYWdtZW50c19TT1VSQ0VTID0gdGVzdF9mcmFnbWVudHMuYyAKK3Rlc3RfaW5hZGRyX2FueV9TT1VSQ0VTID0gdGVzdF9pbmFkZHJfYW55LmMgCit0ZXN0X3BlZWxvZmZfU09VUkNFUyA9IHRlc3RfcGVlbG9mZi5jIAordGVzdF9zb2Nrb3B0X1NPVVJDRVMgPSB0ZXN0X3NvY2tvcHQuYyAKK3Rlc3RfY29ubmVjdF9TT1VSQ0VTID0gdGVzdF9jb25uZWN0LmMgCit0ZXN0X2Nvbm5lY3R4X1NPVVJDRVMgPSB0ZXN0X2Nvbm5lY3R4LmMgCit0ZXN0X3JlY3Ztc2dfU09VUkNFUyA9IHRlc3RfcmVjdm1zZy5jIAordGVzdF90aW1ldG9saXZlX1NPVVJDRVMgPSB0ZXN0X3RpbWV0b2xpdmUuYwordGVzdF9zY3RwX3NlbmRyZWN2bXNnX1NPVVJDRVMgPSB0ZXN0X3NjdHBfc2VuZHJlY3Ztc2cuYwordGVzdF9zY3RwX3NlbmR2cmVjdnZfU09VUkNFUyA9IHRlc3Rfc2N0cF9zZW5kdnJlY3Z2LmMKK3Rlc3RfZ2V0bmFtZV9TT1VSQ0VTID0gdGVzdF9nZXRuYW1lLmMgCit0ZXN0X3RjcF9zdHlsZV9TT1VSQ0VTID0gdGVzdF90Y3Bfc3R5bGUuYyAKKwordGVzdF8xX3RvXzFfc29ja2V0X2JpbmRfbGlzdGVuX1NPVVJDRVMgPSB0ZXN0XzFfdG9fMV9zb2NrZXRfYmluZF9saXN0ZW4uYwordGVzdF8xX3RvXzFfYWNjZXB0X2Nsb3NlX1NPVVJDRVMgPSB0ZXN0XzFfdG9fMV9hY2NlcHRfY2xvc2UuYwordGVzdF8xX3RvXzFfY29ubmVjdF9TT1VSQ0VTID0gdGVzdF8xX3RvXzFfY29ubmVjdC5jCit0ZXN0XzFfdG9fMV9jb25uZWN0eF9TT1VSQ0VTID0gdGVzdF8xX3RvXzFfY29ubmVjdHguYwordGVzdF8xX3RvXzFfc2VuZF9TT1VSQ0VTID0gdGVzdF8xX3RvXzFfc2VuZC5jCit0ZXN0XzFfdG9fMV9zZW5kdG9fU09VUkNFUyA9IHRlc3RfMV90b18xX3NlbmR0by5jCit0ZXN0XzFfdG9fMV9zZW5kbXNnX1NPVVJDRVMgPSB0ZXN0XzFfdG9fMV9zZW5kbXNnLmMKK3Rlc3RfMV90b18xX3JlY3Zmcm9tX1NPVVJDRVMgPSB0ZXN0XzFfdG9fMV9yZWN2ZnJvbS5jCit0ZXN0XzFfdG9fMV9yZWN2bXNnX1NPVVJDRVMgPSB0ZXN0XzFfdG9fMV9yZWN2bXNnLmMKK3Rlc3RfMV90b18xX3NodXRkb3duX1NPVVJDRVMgPSB0ZXN0XzFfdG9fMV9zaHV0ZG93bi5jCit0ZXN0XzFfdG9fMV9zb2Nrb3B0X1NPVVJDRVMgPSB0ZXN0XzFfdG9fMV9zb2Nrb3B0LmMKK3Rlc3RfMV90b18xX2FkZHJzX1NPVVJDRVMgPSB0ZXN0XzFfdG9fMV9hZGRycy5jCit0ZXN0XzFfdG9fMV9ub25ibG9ja19TT1VSQ0VTID0gdGVzdF8xX3RvXzFfbm9uYmxvY2suYwordGVzdF8xX3RvXzFfcnRvaW5mb19TT1VSQ0VTID0gdGVzdF8xX3RvXzFfcnRvaW5mby5jCit0ZXN0XzFfdG9fMV9ldmVudHNfU09VUkNFUyA9IHRlc3RfMV90b18xX2V2ZW50cy5jCit0ZXN0XzFfdG9fMV90aHJlYWRzX1NPVVJDRVMgPSB0ZXN0XzFfdG9fMV90aHJlYWRzLmMKK3Rlc3RfMV90b18xX2luaXRtc2dfY29ubmVjdF9TT1VSQ0VTID0gdGVzdF8xX3RvXzFfaW5pdG1zZ19jb25uZWN0LmMKKworIworIyBTcGVjaWZ5aW5nIG9iamVjdHMgcnVsZXMgZm9yICJ2NnRlc3QiCisjCit0ZXN0X2Jhc2ljX3Y2X1NPVVJDRVMgPSB0ZXN0X2Jhc2ljLmMKK3Rlc3RfYmFzaWNfdjZfQ0ZMQUdTID0gJHtWNkZMQUdTfQorCit0ZXN0X3NvY2tvcHRfdjZfU09VUkNFUyA9IHRlc3Rfc29ja29wdC5jCit0ZXN0X3NvY2tvcHRfdjZfQ0ZMQUdTID0gJHtWNkZMQUdTfQorCit0ZXN0X2ZyYWdtZW50c192Nl9TT1VSQ0VTID0gdGVzdF9mcmFnbWVudHMuYwordGVzdF9mcmFnbWVudHNfdjZfQ0ZMQUdTID0gJHtWNkZMQUdTfQorCit0ZXN0X2luYWRkcl9hbnlfdjZfU09VUkNFUyA9IHRlc3RfaW5hZGRyX2FueS5jCit0ZXN0X2luYWRkcl9hbnlfdjZfQ0ZMQUdTID0gJHtWNkZMQUdTfQorCit0ZXN0X3BlZWxvZmZfdjZfU09VUkNFUyA9IHRlc3RfcGVlbG9mZi5jCit0ZXN0X3BlZWxvZmZfdjZfQ0ZMQUdTID0gJHtWNkZMQUdTfQorCit0ZXN0X3RpbWV0b2xpdmVfdjZfU09VUkNFUyA9IHRlc3RfdGltZXRvbGl2ZS5jCit0ZXN0X3RpbWV0b2xpdmVfdjZfQ0ZMQUdTID0gJHtWNkZMQUdTfQorCit0ZXN0X3NjdHBfc2VuZHJlY3Ztc2dfdjZfU09VUkNFUyA9IHRlc3Rfc2N0cF9zZW5kcmVjdm1zZy5jCit0ZXN0X3NjdHBfc2VuZHZyZWN2dl92Nl9TT1VSQ0VTID0gdGVzdF9zY3RwX3NlbmR2cmVjdnYuYwordGVzdF9zY3RwX3NlbmRyZWN2bXNnX3Y2X0NGTEFHUyA9ICR7VjZGTEFHU30KK3Rlc3Rfc2N0cF9zZW5kdnJlY3Z2X3Y2X0NGTEFHUyA9ICR7VjZGTEFHU30KKwordGVzdF9nZXRuYW1lX3Y2X1NPVVJDRVMgPSB0ZXN0X2dldG5hbWUuYwordGVzdF9nZXRuYW1lX3Y2X0NGTEFHUyA9ICR7VjZGTEFHU30KKwordGVzdF90Y3Bfc3R5bGVfdjZfU09VUkNFUyA9IHRlc3RfdGNwX3N0eWxlLmMKK3Rlc3RfdGNwX3N0eWxlX3Y2X0NGTEFHUyA9ICR7VjZGTEFHU30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX2FjY2VwdF9jbG9zZS5jIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfYWNjZXB0X2Nsb3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxNjJmOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX2FjY2VwdF9jbG9zZS5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAzIEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQKKyAqCisgKiBUaGlzIGZpbGUgaGFzIHRlc3QgY2FzZXMgdG8gdGVzdCB0aGUgYWNjZXB0ICgpIGFuZCBjbG9zZSAoKSBjYWxsIGZvciAKKyAqIDEtMSBzdHlsZSBzb2NrZXRzCisgKgorICogYWNjZXB0ICgpIFRlc3RzOgorICogLS0tLS0tLS0tLS0tLS0tCisgKiBURVNUMTogQmFkIHNvY2tldCBkZXNjcmlwdG9yCisgKiBURVNUMjogSW52YWxpZCBzb2NrZXQKKyAqIFRFU1QzOiBJbnZhbGlkIGFkZHJlc3MKKyAqIFRFU1Q0OiBPbiBhIG5vbi1saXN0ZW5pbmcgc29ja2V0CisgKiBURVNUNTogT24gYSBlc3RhYmxpc2hlZCBzb2NrZXQKKyAqIFRFU1Q2OiBPbiBhIENMT1NFRCBhc3NvY2lhdGlvbgorICogVEVTVDc6IEV4dHJhY3RpbmcgdGhlIGFzc29jaWF0aW9uIG9uIHRoZSBsaXN0ZW5pbmcgc29ja2V0CisgKgorICogY2xvc2UgKCkgVGVzdHM6CisgKiAtLS0tLS0tLS0tLS0tLQorICogVEVTVDg6IEJhZCBzb2NrZXQgZGVzY3JpcHRvcgorICogVEVTVDk6IHZhbGlkIHNvY2tldCBkZXNjcmlwdG9yCisgKiBURVNUMTA6IENsb3NlZCBzb2NrZXQgZGVzY3JpcHRvcgorICogCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiAgICAgICAgIC8qIGZvciBzb2NrYWRkcl9pbiAqLworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9zY3RwLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPHNjdHB1dGlsLmg+CisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSAxMDsKK2ludCBUU1RfQ05UID0gMDsKKworI2RlZmluZSBTS19NQVggIDEwCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgICAgICBzb2NrbGVuX3QgbGVuOworCWludCBpOworCWludCBzayxsc3RuX3NrLGNsbnRfc2tbU0tfTUFYXSxhY3B0X3NrLHBmX2NsYXNzOworCWludCBuZXdfc2tbU0tfTUFYXSxjbG50Ml9za1tTS19NQVhdOworCWludCBlcnJvcjsKKwlpbnQgZmQsIGVycl9ubyA9IDA7CisJY2hhciBmaWxlbmFtZVsyMV07CisKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGNvbm5fYWRkcixsc3RuX2FkZHIsYWNwdF9hZGRyOworCisJLyogUmF0aGVyIHRoYW4gZmZsdXNoKCkgdGhyb3VnaG91dCB0aGUgY29kZSwgc2V0IHN0ZG91dCB0bworICAgICAgICAgKiBiZSB1bmJ1ZmZlcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgMCk7CisgICAgICAgIHNldHZidWYoc3RkZXJyLCBOVUxMLCBfSU9OQkYsIDApOworCisgICAgICAgIHBmX2NsYXNzID0gUEZfSU5FVDsKKworICAgICAgICBzayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKworCWZvciAoaT0wIDsgaSA8IFNLX01BWCA7IGkrKykKKwkJbmV3X3NrW2ldID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJLyogQ3JlYXRpbmcgYSByZWd1bGFyIHNvY2tldCAqLworCWZvciAoaSA9IDAgOyBpIDwgU0tfTUFYIDsgaSsrKQorCQljbG50X3NrW2ldID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJZm9yIChpID0gMCA7IGkgPCBTS19NQVggOyBpKyspCisJCWNsbnQyX3NrW2ldID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJLyogQ3JlYXRpbmcgYSBsaXN0ZW4gc29ja2V0ICovCisgICAgICAgIGxzdG5fc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwljb25uX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGNvbm5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworICAgICAgICBjb25uX2FkZHIuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCisJbHN0bl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBsc3RuX2FkZHIuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgbHN0bl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCS8qIEJpbmRpbmcgdGhlIGxpc3RlbiBzb2NrZXQgKi8KKwl0ZXN0X2JpbmQobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmbHN0bl9hZGRyLCBzaXplb2YobHN0bl9hZGRyKSk7CisKKwkvKiBMaXN0ZW5pbmcgbWFueSBzb2NrZXRzIGFzIHdlIGFyZSBjYWxsaW5nIHRvbyBtYW55IGNvbm5lY3QgaGVyZSAqLworCXRlc3RfbGlzdGVuKGxzdG5fc2ssIFNLX01BWCApOworCisJLyogY29ubmVjdCgpIGlzIGNhbGxlZCBqdXN0IHRvIG1ha2Ugc3VyZSBhY2NlcHQoKSBkb2Vzbid0IGJsb2NrIHRoZQorCSAqIHByb2dyYW0KKwkgKi8KKwlpID0gMDsKKwlsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwl0ZXN0X2Nvbm5lY3QoY2xudF9za1tpKytdLCAoc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIGxlbik7CisKKwkvKiBhY2NlcHQoKSBURVNUMTogQmFkIHNvY2tldCBkZXNjcmlwdG9yIEVCQURGLCBFeHBlY3RlZCBlcnJvciAqLworICAgICAgICBlcnJvciA9IGFjY2VwdCgtMSwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWNwdF9hZGRyLCAmbGVuKTsKKyAgICAgICAgaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVCQURGKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJhY2NlcHQgd2l0aCBhIGJhZCBzb2NrZXQgZGVzY3JpcHRvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiYWNjZXB0KCkgd2l0aCBhIGJhZCBzb2NrZXQgZGVzY3JpcHRvciAtIEVCQURGIik7CisKKyAgICAgICAgLyphY2NlcHQoKSBURVNUMjogSW52YWxpZCBzb2NrZXQgRU5PVFNPQ0ssIEV4cGVjdGVkIGVycm9yKi8KKwlzdHJjcHkoZmlsZW5hbWUsICIvdG1wL3NjdHB0ZXN0LlhYWFhYWCIpOworCWZkID0gbWtzdGVtcChmaWxlbmFtZSk7CisJaWYgKGZkID09IC0xKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJGYWlsZWQgdG8gbWtzdGVtcCAlczogJXMiLAorCQkJCWZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCWVycm9yID0gYWNjZXB0KGZkLCAoc3RydWN0IHNvY2thZGRyICopICZhY3B0X2FkZHIsICZsZW4pOworCWlmIChlcnJvciA9PSAtMSkKKwkJZXJyX25vID0gZXJybm87CisJY2xvc2UoZmQpOworCXVubGluayhmaWxlbmFtZSk7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycl9ubyAhPSBFTk9UU09DSykKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiYWNjZXB0IHdpdGggaW52YWxpZCBzb2NrZXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJfbm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJhY2NlcHQoKSB3aXRoIGludmFsaWQgc29ja2V0IC0gRU5PVFNPQ0siKTsKKworICAgICAgICAvKmFjY2VwdCgpIFRFU1QzOiBJbnZhbGlkIGFkZHJlc3MgRUZBVUxULCBFeHBlY3RlZCBlcnJvciovCisgICAgICAgIGVycm9yID0gYWNjZXB0KGxzdG5fc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgLTEsICZsZW4pOworICAgICAgICBpZiAoZXJyb3IgIT0gLTEgfHwgZXJybm8gIT0gRUZBVUxUKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJhY2NlcHQgd2l0aCBpbnZhbGlkIGFkZHJlc3MiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImFjY2VwdCgpIHdpdGggaW52YWxpZCBhZGRyZXNzIC0gRUZBVUxUIik7CisKKwl0ZXN0X2Nvbm5lY3QoY2xudF9za1tpKytdLCAoc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIGxlbik7CisKKyAgICAgICAgLyphY2NlcHQoKSBURVNUNDogb24gYSBub24tbGlzdGVuaW5nIHNvY2tldCBFSU5WQUwsIEV4cGVjdGVkIGVycm9yKi8KKyAgICAgICAgZXJyb3IgPSBhY2NlcHQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFjcHRfYWRkciwgJmxlbik7CisgICAgICAgIGlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFSU5WQUwpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImFjY2VwdCBvbiBhIG5vbi1saXN0ZW5pbmcgc29ja2V0IgorICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJhY2NlcHQoKSBvbiBhIG5vbi1saXN0ZW5pbmcgc29ja2V0IC0gRUlOVkFMIik7CisJCisJdGVzdF9jb25uZWN0KGNsbnRfc2tbaSsrXSwgKHN0cnVjdCBzb2NrYWRkciAqKSAmY29ubl9hZGRyLCBsZW4pOworCisJLypDYWxsaW5nIGFjY2VwdCB0byBlc3RhYmxpc2ggdGhlIGNvbm5lY3Rpb24qLworCWFjcHRfc2sgPSB0ZXN0X2FjY2VwdChsc3RuX3NrLCAoc3RydWN0IHNvY2thZGRyICopICZhY3B0X2FkZHIsICZsZW4pOworCisJLyogYWNjZXB0KCkgVEVTVDU6IE9uIGEgZXN0YWJsaXNoZWQgc29ja2V0IEVJTlZBTCBvciBFQUNDRVMgd2hlbgorCSAqIFNFTGludXggc2V0IHRvIGVuZm9yY2luZywgRXhwZWN0ZWQgZXJyb3IuICovCisJZXJyb3IgPSBhY2NlcHQoYWNwdF9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWNwdF9hZGRyLCAmbGVuKTsKKwlpZiAoZXJyb3IgIT0gLTEgfHwgKGVycm5vICE9IEVJTlZBTCAmJiBlcnJubyAhPSBFQUNDRVMpKSB7CisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImFjY2VwdCBvbiBhbiBlc3RhYmxpc2hlZCBzb2NrZXQiCisJCQkiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKwl9CisKKwl0c3RfcmVzbShUUEFTUywgImFjY2VwdCgpIG9uIGFuIGVzdGFibGlzaGVkIHNvY2tldCAtICVkIiwgZXJybm8pOworCisJLypDbG9zaW5nIHRoZSBwcmV2aW91c2x5IGVzdGFibGlzaGVkIGFzc29jaWF0aW9uKi8KKwljbG9zZShhY3B0X3NrKTsKKworCXRlc3RfY29ubmVjdChjbG50X3NrW2ldLCAoc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIGxlbik7CisKKwkvKmFjY2VwdCgpIFRFU1Q2OiBPbiB0aGUgQ0xPU0VEIGFzc29jaWF0aW9uIHNob3VsZCBzdWNjZWVkKi8KKwlhY3B0X3NrID0gYWNjZXB0KGxzdG5fc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFjcHRfYWRkciwgJmxlbik7CisgICAgICAgIGlmIChhY3B0X3NrIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiYWNjZXB0IGEgY2xvc2VkIGFzc29jaWF0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJhY2NlcHQoKSBhIGNsb3NlZCBhc3NvY2lhdGlvbiAtIFNVQ0NFU1MiKTsKKworCWNsb3NlKGFjcHRfc2spOworCisJLyphY2NlcHQoKSBURVNUNzogRXh0cmFjdGluZyB0aGUgYXNzb2NpYXRpb24gb24gdGhlIGxpc3RlbmluZyBzb2NrZXQKKwlhcyBuZXcgc29ja2V0LCBuZXcgc29ja2V0IHNvY2tldCBkZXNjcmlwdG9yIHNob3VsZCByZXR1cm4qLworCWZvciAoaSA9IDAgOyBpIDwgKFNLX01BWCAtIDEpOyBpKyspCisJCXRlc3RfY29ubmVjdChjbG50Ml9za1tpXSwgKHN0cnVjdCBzb2NrYWRkciAqKSAmY29ubl9hZGRyLCBsZW4pOworCisJZm9yIChpID0gMCA7IGkgPCAoU0tfTUFYIC0gMSk7IGkrKykKKwkJbmV3X3NrW2ldID0gdGVzdF9hY2NlcHQobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSZhY3B0X2FkZHIsCisJCQkJCSZsZW4pOworCisJdHN0X3Jlc20oVFBBU1MsICJhY2NlcHQoKSBvbiBhIGxpc3RlbmluZyBzb2NrZXQgLSBTVUNDRVNTIik7CisKKwkKKyAgICAgICAgLypjbG9zZSgpIFRFU1Q4OiBCYWQgc29ja2V0IGRlc2NyaXB0b3IsIEVCQURGIEV4cGVjdGVkIGVycm9yKi8KKwllcnJvciA9IGNsb3NlKC0xKTsKKwlpZiAoZXJyb3IgIT0gLTEgfHwgZXJybm8gIT0gRUJBREYpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImNsb3NlIHdpdGggYSBiYWQgc29ja2V0IGRlc2NyaXB0b3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJjbG9zZSgpIHdpdGggYSBiYWQgc29ja2V0IGRlc2NyaXB0b3IgLSBFQkFERiIpOworCisJLypjbG9zZSgpIFRFU1Q5OiB2YWxpZCBzb2NrZXQgZGVzY3JpcHRvciBzaG91bGQgc3VjY2VlZCovCisJZXJyb3IgPSBjbG9zZShzayk7CisJaWYgKGVycm9yIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiY2xvc2Ugd2l0aCBhIHZhbGlkIHNvY2tldCBkZXNjcmlwdG9yIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiY2xvc2UoKSB3aXRoIGEgdmFsaWQgc29ja2V0IGRlc2NyaXB0b3IgLSBTVUNDRVNTIik7CisKKwkvKmNsb3NlKCkgVEVTVDEwOiBjbG9zZWQgc29ja2V0IGRlc2NyaXB0b3IsIEVCQURGIEV4cGVjdGVkIGVycm9yKi8KKyAgICAgICAgZXJyb3IgPSBjbG9zZShzayk7CisgICAgICAgIGlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFQkFERikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiY2xvc2Ugd2l0aCBhIGNsb3NlZCBzb2NrZXQgIgorCQkJICJkZXNjcmlwdG9yIGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImNsb3NlKCkgd2l0aCBhIGNsb3NlZCBzb2NrZXQgZGVzY3JpcHRvciAtIEVCQURGIik7CisJCisJZm9yIChpID0gMCA7IGkgPCBTS19NQVggOyBpKyspIHsKKwkJY2xvc2UoY2xudF9za1tpXSk7CisJCWNsb3NlKG5ld19za1tpXSk7CisJCWNsb3NlKGNsbnQyX3NrW2ldKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX2FkZHJzLmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9hZGRycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTY5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9hZGRycy5jCkBAIC0wLDAgKzEsMjg5IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAzIEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQKKyAqCisgKiBUaGlzIGZpbGUgaGFzIHRlc3QgY2FzZXMgdG8gdGVzdCB0aGUgc2N0cF9nZXRsYWRkcnMgKCksIHNjdHBfZnJlZWFsZGRycyAoKSwKKyAqIHNjdHBfZ2V0cGFkZHJzICgpLCBzY3RwX2ZyZWVhcGFkZHJzICgpIGZvciAxLTEgc3R5bGUgc29ja2V0cworICoKKyAqIHNjdHBfZ2V0bGFkZHJzICgpIFRlc3RzOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRFU1QxOiBCYWQgc29ja2V0IGRlc2NyaXB0b3IKKyAqIFRFU1QyOiBJbnZhbGlkIHNvY2tldAorICogVEVTVDM6IFNvY2tldCBvZiBkaWZmZXJlbnQgcHJvdG9jb2wKKyAqIFRFU1Q0OiBHZXR0aW5nIHRoZSBsb2NhbCBhZGRyZXNzZXMKKyAqCisgKiBzY3RwX2ZyZWVhbGRkcnMgKCkgVGVzdHM6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRFU1Q1OiBGcmVlaW5nIHRoZSBsb2NhbCBhZGRyZXNzCisgKgorICogc2N0cF9nZXRwYWRkcnMgKCkgVGVzdHM6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVEVTVDY6IEJhZCBzb2NrZXQgZGVzY3JpcHRvcgorICogVEVTVDc6IEludmFsaWQgc29ja2V0CisgKiBURVNUODogU29ja2V0IG9mIGRpZmZlcmVudCBwcm90b2NvbAorICogVEVTVDk6IEdldHRpbmcgdGhlIHBlZXJzIGFkZHJlc3NlcworICoKKyAqIHNjdHBfZnJlZWFwZGRycyAoKSBUZXN0czoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVEVTVDEwOiBGcmVlaW5nIHRoZSBwZWVyJ3MgYWRkcmVzcworICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+ICAgICAgICAgLyogZm9yIHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8c2N0cHV0aWwuaD4KKworY2hhciAqVENJRCA9IF9fRklMRV9fOworaW50IFRTVF9UT1RBTCA9IDEwOworaW50IFRTVF9DTlQgPSAwOworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICAgICAgaW50IGVycm9yOworCXNvY2tsZW5fdCBsZW47CisJaW50IGxzdG5fc2ssY2xudF9zayxhY3B0X3NrLHBmX2NsYXNzLHNrMTsKKwlzdHJ1Y3QgbXNnaGRyIG91dG1lc3NhZ2U7CisgICAgICAgIHN0cnVjdCBtc2doZHIgaW5tZXNzYWdlOworICAgICAgICBjaGFyICptZXNzYWdlID0gImhlbGxvLCB3b3JsZCFcbiI7CisgICAgICAgIHN0cnVjdCBpb3ZlYyBpb3ZfcmN2OworICAgICAgICBzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbzsKKyAgICAgICAgaW50IG1zZ19jb3VudDsKKyAgICAgICAgY2hhciBvdXRjbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKV07CisgICAgICAgIHN0cnVjdCBjbXNnaGRyICpjbXNnOworICAgICAgICBzdHJ1Y3QgaW92ZWMgb3V0X2lvdjsKKyAgICAgICAgY2hhciAqIGJ1ZmZlcl9yY3Y7CisJY2hhciBpbmNtc2dbQ01TR19TUEFDRShzaXplb2Yoc2N0cF9jbXNnX2RhdGFfdCkpXTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmxhZGRycywgKnBhZGRyczsKKwlpbnQgZmQsIGVycl9ubyA9IDA7CisJY2hhciBmaWxlbmFtZVsyMV07CisKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGNvbm5fYWRkcixsc3RuX2FkZHIsYWNwdF9hZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjsKKworCS8qIFJhdGhlciB0aGFuIGZmbHVzaCgpIHRocm91Z2hvdXQgdGhlIGNvZGUsIHNldCBzdGRvdXQgdG8KKyAgICAgICAgICogYmUgdW5idWZmZXJlZC4KKyAgICAgICAgICovCisgICAgICAgIHNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworICAgICAgICBzZXR2YnVmKHN0ZGVyciwgTlVMTCwgX0lPTkJGLCAwKTsKKworICAgICAgICBwZl9jbGFzcyA9IFBGX0lORVQ7CisKKwkvKkNyZWF0aW5nIGEgcmVndWxhciBzb2NrZXQqLworCWNsbnRfc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwkvKkNyZWF0aW5nIGEgbGlzdGVuIHNvY2tldCovCisgICAgICAgIGxzdG5fc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwljb25uX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGNvbm5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworICAgICAgICBjb25uX2FkZHIuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCisJbHN0bl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBsc3RuX2FkZHIuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgbHN0bl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCS8qQmluZGluZyB0aGUgbGlzdGVuIHNvY2tldCovCisJdGVzdF9iaW5kKGxzdG5fc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmxzdG5fYWRkciwgc2l6ZW9mKGxzdG5fYWRkcikpOworCisJLypMaXN0ZW5pbmcgbWFueSBzb2NrZXRzIGFzIHdlIGFyZSBjYWxsaW5nIHRvbyBtYW55IGNvbm5lY3QgaGVyZSovCisJdGVzdF9saXN0ZW4obHN0bl9zaywgMSk7CisKKwlsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwkKKwl0ZXN0X2Nvbm5lY3QoY2xudF9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmY29ubl9hZGRyLCBsZW4pOworCisJYWNwdF9zayA9IHRlc3RfYWNjZXB0KGxzdG5fc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFjcHRfYWRkciwgJmxlbik7CisKKwltZW1zZXQoJmlubWVzc2FnZSwgMCwgc2l6ZW9mKGlubWVzc2FnZSkpOworICAgICAgICBidWZmZXJfcmN2ID0gbWFsbG9jKFJFQUxMWV9CSUcpOworCisgICAgICAgIGlvdl9yY3YuaW92X2Jhc2UgPSBidWZmZXJfcmN2OworICAgICAgICBpb3ZfcmN2Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworICAgICAgICBpbm1lc3NhZ2UubXNnX2lvdiA9ICZpb3ZfcmN2OworICAgICAgICBpbm1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisgICAgICAgIGlubWVzc2FnZS5tc2dfY29udHJvbCA9IGluY21zZzsKKyAgICAgICAgaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisKKyAgICAgICAgbXNnX2NvdW50ID0gc3RybGVuKG1lc3NhZ2UpICsgMTsKKworCW1lbXNldCgmb3V0bWVzc2FnZSwgMCwgc2l6ZW9mKG91dG1lc3NhZ2UpKTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfbmFtZSA9ICZsc3RuX2FkZHI7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2YobHN0bl9hZGRyKTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92ID0gJm91dF9pb3Y7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2NvbnRyb2wgPSBvdXRjbXNnOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKG91dGNtc2cpOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19mbGFncyA9IDA7CisKKyAgICAgICAgY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1lc3NhZ2UpOworICAgICAgICBjbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworICAgICAgICBjbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKyAgICAgICAgY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47CisgICAgICAgIHNpbmZvID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7CisgICAgICAgIG1lbXNldChzaW5mbywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9iYXNlID0gbWVzc2FnZTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfbGVuID0gbXNnX2NvdW50OworCisJdGVzdF9zZW5kbXNnKGNsbnRfc2ssICZvdXRtZXNzYWdlLCBNU0dfTk9TSUdOQUwsIG1zZ19jb3VudCk7CisKKwl0ZXN0X3JlY3Ztc2coYWNwdF9zaywgJmlubWVzc2FnZSwgTVNHX05PU0lHTkFMKTsKKworCS8qc2N0cF9nZXRsYWRkcnMoKSBURVNUMTogQmFkIHNvY2tldCBkZXNjcmlwdG9yLCBFQkFERiBFeHBlY3RlZCBlcnJvciovCisJZXJyb3IgPSBzY3RwX2dldGxhZGRycygtMSwgMCwgJmxhZGRycyk7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVCQURGKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX2dldGxhZGRycyB3aXRoIGEgYmFkIHNvY2tldCAiCisJCQkgImRlc2NyaXB0b3IgZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9nZXRsYWRkcnMoKSB3aXRoIGEgYmFkIHNvY2tldCBkZXNjcmlwdG9yIC0gIgorCQkgIkVCQURGIik7CisKKwkvKnNjdHBfZ2V0bGFkZHJzKCkgVEVTVDI6IEludmFsaWQgc29ja2V0LCBFTk9UU09DSyBFeHBlY3RlZCBlcnJvciovCisJc3RyY3B5KGZpbGVuYW1lLCAiL3RtcC9zY3RwdGVzdC5YWFhYWFgiKTsKKwlmZCA9IG1rc3RlbXAoZmlsZW5hbWUpOworCWlmIChmZCA9PSAtMSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiRmFpbGVkIHRvIG1rc3RlbXAgJXM6ICVzIiwKKwkJCQlmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwllcnJvciA9IHNjdHBfZ2V0bGFkZHJzKGZkLCAwLCAmbGFkZHJzKTsKKwlpZiAoZXJyb3IgPT0gLTEpCisJCWVycl9ubyA9IGVycm5vOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoZmlsZW5hbWUpOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJfbm8gIT0gRU5PVFNPQ0spCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNjdHBfZ2V0bGFkZHJzIHdpdGggaW52YWxpZCBzb2NrZXQgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJyX25vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9nZXRsYWRkcnMoKSB3aXRoIGludmFsaWQgc29ja2V0IC0gRU5PVFNPQ0siKTsKKworCS8qc2N0cF9nZXRsYWRkcnMoKSBURVNUMzogc29ja2V0IG9mIGRpZmZlcmVudCBwcm90b2NvbAorCUVPUE5PVFNVUFAgRXhwZWN0ZWQgZXJyb3IqLworICAgICAgICBzazEgPSBzb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX0lQKTsKKwllcnJvciA9IHNjdHBfZ2V0bGFkZHJzKHNrMSwgMCwgJmxhZGRycyk7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVPUE5PVFNVUFApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNjdHBfZ2V0bGFkZHJzIHdpdGggc29ja2V0IG9mICIKKwkJCSAiZGlmZmVyZW50IHByb3RvY29sIGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfZ2V0bGFkZHJzKCkgd2l0aCBzb2NrZXQgb2YgZGlmZmVyZW50IHByb3RvY29sIC0gIgorCQkgIkVPUE5PVFNVUFAiKTsKKworCS8qc2N0cF9nZXRsYWRkcnMoKSBURVNUNDogR2V0dGluZyB0aGUgbG9jYWwgYWRkcmVzc2VzKi8KKwllcnJvciA9IHNjdHBfZ2V0bGFkZHJzKGxzdG5fc2ssIDAsICZsYWRkcnMpOworCWlmIChlcnJvciA8IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNjdHBfZ2V0bGFkZHJzIHdpdGggdmFsaWQgc29ja2V0ICIKKwkJCSAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopbGFkZHJzOworCWlmIChhZGRyLT5zaW5fcG9ydCAhPSBsc3RuX2FkZHIuc2luX3BvcnQgfHwgCisJICAgIGFkZHItPnNpbl9mYW1pbHkgIT0gbHN0bl9hZGRyLnNpbl9mYW1pbHkgfHwgCisJICAgIGFkZHItPnNpbl9hZGRyLnNfYWRkciAhPSBsc3RuX2FkZHIuc2luX2FkZHIuc19hZGRyKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX2dldGxhZGRycyBjb21wYXJpc2lvbiBmYWlsZWQiKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9nZXRsYWRkcnMoKSAtIFNVQ0NFU1MiKTsKKworCS8qc2N0cF9mcmVlYWxkZHJzKCkgVEVTVDU6IGZyZWVpbmcgdGhlIGxvY2FsIGFkZHJlc3MqLworCWlmICgoc2N0cF9mcmVlbGFkZHJzKGxhZGRycykpIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2N0cF9mcmVlbGFkZHJzICIKKwkJCSAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKwkJCisJdHN0X3Jlc20oVFBBU1MsICJzY3RwX2ZyZWVsYWRkcnMoKSAtIFNVQ0NFU1MiKTsKKworCS8qc2N0cF9nZXRwYWRkcnMoKSBURVNUNjogQmFkIHNvY2tldCBkZXNjcmlwdG9yLCBFQkFERiBFeHBlY3RlZCBlcnJvciovCisJZXJyb3IgPSBzY3RwX2dldHBhZGRycygtMSwgMCwgJnBhZGRycyk7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVCQURGKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX2dldHBhZGRycyB3aXRoIGEgYmFkIHNvY2tldCAiCisJCQkgImRlc2NyaXB0b3IgZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9nZXRwYWRkcnMoKSB3aXRoIGEgYmFkIHNvY2tldCBkZXNjcmlwdG9yIC0gIgorCQkgIkVCQURGIik7CisKKwkvKnNjdHBfZ2V0cGFkZHJzKCkgVEVTVDc6IEludmFsaWQgc29ja2V0LCBFTk9UU09DSyBFeHBlY3RlZCBlcnJvciovCisJc3RyY3B5KGZpbGVuYW1lLCAiL3RtcC9zY3RwdGVzdC5YWFhYWFgiKTsKKwlmZCA9IG1rc3RlbXAoZmlsZW5hbWUpOworCWlmIChmZCA9PSAtMSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiRmFpbGVkIHRvIG1rc3RlbXAgJXM6ICVzIiwKKwkJCQlmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwllcnJvciA9IHNjdHBfZ2V0cGFkZHJzKGZkLCAwLCAmcGFkZHJzKTsKKwlpZiAoZXJyb3IgPT0gLTEpCisJCWVycl9ubyA9IGVycm5vOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoZmlsZW5hbWUpOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJfbm8gIT0gRU5PVFNPQ0spCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNjdHBfZ2V0cGFkZHJzIHdpdGggaW52YWxpZCBzb2NrZXQgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJyX25vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9nZXRwYWRkcnMoKSB3aXRoIGludmFsaWQgc29ja2V0IC0gRU5PVFNPQ0siKTsKKwkKKwkvKnNjdHBfZ2V0cGFkZHJzKCkgVEVTVDg6IHNvY2tldCBvZiBkaWZmZXJlbnQgcHJvdG9jb2wKKwlFT1BOT1RTVVBQIEV4cGVjdGVkIGVycm9yKi8KKwllcnJvciA9IHNjdHBfZ2V0cGFkZHJzKHNrMSwgMCwgJmxhZGRycyk7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVPUE5PVFNVUFApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNjdHBfZ2V0cGFkZHJzIHdpdGggc29ja2V0IG9mICIKKwkJCSAiZGlmZmVyZW50IHByb3RvY29sIGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfZ2V0cGFkZHJzKCkgd2l0aCBzb2NrZXQgb2YgZGlmZmVyZW50IHByb3RvY29sIC0gIgorCQkgIkVPUE5PVFNVUFAiKTsKKwkKKwkvKnNjdHBfZ2V0cGFkZHJzKCkgVEVTVDk6IEdldHRpbmcgdGhlIHBlZXIgYWRkcmVzc2VzKi8KKwllcnJvciA9IHNjdHBfZ2V0cGFkZHJzKGFjcHRfc2ssIDAsICZwYWRkcnMpOworCWlmIChlcnJvciA8IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNjdHBfZ2V0cGFkZHJzIHdpdGggdmFsaWQgc29ja2V0ICIKKwkJCSAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKwkKKwlhZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXBhZGRyczsKKwlpZiAoYWRkci0+c2luX3BvcnQgIT0gYWNwdF9hZGRyLnNpbl9wb3J0IHx8CisgICAgICAgICAgICBhZGRyLT5zaW5fZmFtaWx5ICE9IGFjcHRfYWRkci5zaW5fZmFtaWx5IHx8IAorICAgICAgICAgICAgYWRkci0+c2luX2FkZHIuc19hZGRyICE9IGFjcHRfYWRkci5zaW5fYWRkci5zX2FkZHIpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNjdHBfZ2V0cGFkZHJzIGNvbXBhcmlzaW9uIGZhaWxlZCIpOworCisJdHN0X3Jlc20oVFBBU1MsICJzY3RwX2dldHBhZGRycygpIC0gU1VDQ0VTUyIpOworCisJLypzY3RwX2ZyZWVhcGRkcnMoKSBURVNUMTA6IGZyZWVpbmcgdGhlIHBlZXIgYWRkcmVzcyovCisJaWYgKChzY3RwX2ZyZWVwYWRkcnMocGFkZHJzKSkgPCAwKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX2ZyZWVwYWRkcnMgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCQkKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfZnJlZXBhZGRycygpIC0gU1VDQ0VTUyIpOworCisJY2xvc2UoY2xudF9zayk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX2Nvbm5lY3QuYyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX2Nvbm5lY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJjNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfY29ubmVjdC5jCkBAIC0wLDAgKzEsMjM0IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAzIEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQKKyAqCisgKiBUaGlzIGZpbGUgaGFzIHRlc3QgY2FzZXMgdG8gdGVzdCB0aGUgY29ubmVjdCAoKSBjYWxsIGZvciAxLTEgc3R5bGUgc29ja2V0cworICoKKyAqIFRFU1QxOiBCYWQgc29ja2V0IGRlc2NyaXB0b3IKKyAqIFRFU1QyOiBJbnZhbGlkIHNvY2tldAorICogVEVTVDM6IEludmFsaWQgYWRkcmVzcworICogVEVTVDQ6IEludmFsaWQgYWRkcmVzcyBsZW5ndGgKKyAqIFRFU1Q1OiBJbnZhbGlkIGFkZHJlc3MgZmFtaWx5CisgKiBURVNUNjogVmFsaWQgYmxvY2tpbmcgY29ubmVjdAorICogVEVTVDc6IENvbm5lY3Qgd2hlbiBhY2NlcHQgcXVldWUgaXMgZnVsbAorICogVEVTVDg6IE9uIGEgbGlzdGVuaW5nIHNvY2tldAorICogVEVTVDk6IE9uIGVzdGFibGlzaGVkIHNvY2tldAorICogVEVTVDEwOiBDb25uZWN0IHRvIHJlLWVzdGFibGlzaCBhIGNsb3NlZCBhc3NvY2lhdGlvbi4gCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiAgICAgICAgIC8qIGZvciBzb2NrYWRkcl9pbiAqLworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgInNjdHB1dGlsLmgiCisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSAxMDsKK2ludCBUU1RfQ05UID0gMDsKKworI2RlZmluZSBTS19NQVggMTAKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgICAgIGludCBlcnJvcixpOworCXNvY2tsZW5fdCBsZW47CisJaW50IHNrLGxzdG5fc2ssY2xudF9za1tTS19NQVhdLGFjcHRfc2tbU0tfTUFYXSxwZl9jbGFzczsKKwlpbnQgc2sxLGNsbnQyX3NrOworCWludCBmZCwgZXJyX25vID0gMDsKKwljaGFyIGZpbGVuYW1lWzIxXTsKKworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gY29ubl9hZGRyLGxzdG5fYWRkcixhY3B0X2FkZHI7CisKKwkvKiBSYXRoZXIgdGhhbiBmZmx1c2goKSB0aHJvdWdob3V0IHRoZSBjb2RlLCBzZXQgc3Rkb3V0IHRvCisgICAgICAgICAqIGJlIHVuYnVmZmVyZWQuCisgICAgICAgICAqLworICAgICAgICBzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsKKyAgICAgICAgc2V0dmJ1ZihzdGRlcnIsIE5VTEwsIF9JT05CRiwgMCk7CisKKyAgICAgICAgcGZfY2xhc3MgPSBQRl9JTkVUOworCisgICAgICAgIHNrID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworICAgICAgICBzazEgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwkvKkNyZWF0aW5nIGEgbGlzdGVuIHNvY2tldCovCisgICAgICAgIGxzdG5fc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwkvKkNyZWF0aW5nIGEgcmVndWxhciBzb2NrZXQqLworCWZvciAoaSA9IDAgOyBpIDwgU0tfTUFYIDsgaSsrKQorCQljbG50X3NrW2ldID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJY2xudDJfc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwljb25uX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGNvbm5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworICAgICAgICBjb25uX2FkZHIuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCisJbHN0bl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBsc3RuX2FkZHIuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgbHN0bl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCS8qQmluZGluZyB0aGUgbGlzdGVuIHNvY2tldCovCisJdGVzdF9iaW5kKGxzdG5fc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmxzdG5fYWRkciwgc2l6ZW9mKGxzdG5fYWRkcikpOworCisJLypMaXN0ZW5pbmcgdGhlIHNvY2tldCovCisJdGVzdF9saXN0ZW4obHN0bl9zaywgU0tfTUFYLTEpOworCisKKwkvKmNvbm5lY3QgKCkgVEVTVDE6IEJhZCBzb2NrZXQgZGVzY3JpcHRvciwgRUJBREYgRXhwZWN0ZWQgZXJyb3IqLworCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCWVycm9yID0gY29ubmVjdCgtMSwgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSAmY29ubl9hZGRyLCBsZW4pOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFQkFERikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiY29ubmVjdCB3aXRoIGJhZCBzb2NrZXQgIgorCQkJICJkZXNjcmlwdG9yIGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImNvbm5lY3QoKSB3aXRoIGJhZCBzb2NrZXQgZGVzY3JpcHRvciAtIEVCQURGIik7CisJCisJLypjb25uZWN0ICgpIFRFU1QyOiBJbnZhbGlkIHNvY2tldCwgRU5PVFNPQ0sgRXhwZWN0ZWQgZXJyb3IqLworCXN0cmNweShmaWxlbmFtZSwgIi90bXAvc2N0cHRlc3QuWFhYWFhYIik7CisJZmQgPSBta3N0ZW1wKGZpbGVuYW1lKTsKKwlpZiAoZmQgPT0gLTEpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIkZhaWxlZCB0byBta3N0ZW1wICVzOiAlcyIsCisJCQkJZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJZXJyb3IgPSBjb25uZWN0KGZkLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIGxlbik7CisJaWYgKGVycm9yID09IC0xKQorCQllcnJfbm8gPSBlcnJubzsKKwljbG9zZShmZCk7CisJdW5saW5rKGZpbGVuYW1lKTsKKwlpZiAoZXJyb3IgIT0gLTEgfHwgZXJyX25vICE9IEVOT1RTT0NLKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJjb25uZWN0IHdpdGggaW52YWxpZCBzb2NrZXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJyX25vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiY29ubmVjdCgpIHdpdGggaW52YWxpZCBzb2NrZXQgLSBFTk9UU09DSyIpOworCisJLypjb25uZWN0ICgpIFRFU1QzOiBJbnZhbGlkIGFkZHJlc3MsIEVGQVVMVCBFeHBlY3RlZCBlcnJvciovCisJZXJyb3IgPSBjb25uZWN0KHNrLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopIC0xLCBsZW4pOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFRkFVTFQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImNvbm5lY3Qgd2l0aCBpbnZhbGlkIGFkZHJlc3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJjb25uZWN0KCkgd2l0aCBpbnZhbGlkIGFkZHJlc3MgLSBFRkFVTFQiKTsKKworCS8qY29ubmVjdCAoKSBURVNUNDogSW52YWxpZCBhZGRyZXNzIGxlbmd0aCwgRUlOVkFMIEV4cGVjdGVkIGVycm9yKi8KKwllcnJvciA9IGNvbm5lY3Qoc2ssIChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKikgJmNvbm5fYWRkciwgKGxlbiAtIDMpKTsKKwlpZiAoZXJyb3IgIT0gLTEgfHwgZXJybm8gIT0gRUlOVkFMKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJjb25uZWN0IHdpdGggaW52YWxpZCBhZGRyZXNzIGxlbmd0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImNvbm5lY3QoKSB3aXRoIGludmFsaWQgYWRkcmVzcyBsZW5ndGggLSBFSU5WQUwiKTsKKworCS8qY29ubmVjdCAoKSBURVNUNTogSW52YWxpZCBhZGRyZXNzIGZhbWlseSwgRUlOVkFMIEV4cGVjdCBlcnJvciovCisJY29ubl9hZGRyLnNpbl9mYW1pbHkgPSA5MDkwOyAvKkFzc2lnbmluZyBpbnZhbGlkIGFkZHJlc3MgZmFtaWx5Ki8KKyAgICAgICAgZXJyb3IgPSBjb25uZWN0KHNrLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIGxlbik7CisgICAgICAgIGlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFSU5WQUwpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImNvbm5lY3Qgd2l0aCBpbnZhbGlkIGFkZHJlc3MgZmFtaWx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiY29ubmVjdCgpIHdpdGggaW52YWxpZCBhZGRyZXNzIGZhbWlseSAtIEVJTlZBTCIpOworCisJY29ubl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCisJLypjb25uZWN0ICgpIFRFU1Q2OiBCbG9ja2luZyBjb25uZWN0LCBzaG91bGQgcGFzcyovCisJLypBbGwgdGhlIGJlIGJlbG93IGJsb2NraW5nIGNvbm5lY3Qgc2hvdWxkIHBhc3MgYXMgc29ja2V0IHdpbGwgYmUgCisJbGlzdGVuaW5nIFNLX01BWCBjbGllbnRzKi8KKwlmb3IgKGkgPSAwIDsgaSA8IFNLX01BWCA7IGkrKykgeworCQllcnJvciA9IGNvbm5lY3QoY2xudF9za1tpXSwgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZjb25uX2FkZHIsCisJCQkgICAgICBsZW4pOworCQlpZiAoZXJyb3IgPCAwKQorCQkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAidmFsaWQgYmxvY2tpbmcgY29ubmVjdCAiCisJCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCX0KKworCXRzdF9yZXNtKFRQQVNTLCAidmFsaWQgYmxvY2tpbmcgY29ubmVjdCgpIC0gU1VDQ0VTUyIpOworCisJLypjb25uZWN0ICgpIFRFU1Q3OiBjb25uZWN0IHdoZW4gYWNjZXB0IHF1ZXVlIGlzIGZ1bGwsIEVDT05OUkVGVVNFRAorCUV4cGVjdCBlcnJvciovCisJLypOb3cgdGhhdCBhY2NlcHQgcXVldWUgaXMgZnVsbCwgdGhlIGJlbG93IGNvbm5lY3Qgc2hvdWxkIGZhaWwqLworCWVycm9yID0gY29ubmVjdChjbG50Ml9zaywgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSAmY29ubl9hZGRyLCBsZW4pOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFQ09OTlJFRlVTRUQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImNvbm5lY3Qgd2hlbiBhY2NlcHQgcXVldWUgaXMgZnVsbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImNvbm5lY3QoKSB3aGVuIGFjY2VwdCBxdWV1ZSBpcyBmdWxsIC0gRUNPTk5SRUZVU0VEIik7CisJCisJLypDYWxsaW5nIGEgYWNjZXB0IGZpcnN0IHRvIGVzdGJsaXNoIHRoZSBwZW5kaW5nIGNvbm5lY3Rpb25zKi8KKwlmb3IgKGk9MCA7IGkgPCBTS19NQVggOyBpKyspCisJCWFjcHRfc2tbaV0gPSB0ZXN0X2FjY2VwdChsc3RuX3NrLAorCQkJCQkgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWNwdF9hZGRyLCAmbGVuKTsKKworCS8qY29ubmVjdCAoKSBURVNUODogZnJvbSBhIGxpc3RlbmluZyBzb2NrZXQsIEVJU0NPTk4gRXhwZWN0IGVycm9yKi8KKwllcnJvciA9IGNvbm5lY3QobHN0bl9zaywgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSAmbHN0bl9hZGRyLCBsZW4pOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFSVNDT05OKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJjb25uZWN0IG9uIGEgbGlzdGVuaW5nIHNvY2tldCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImNvbm5lY3QoKSBvbiBhIGxpc3RlbmluZyBzb2NrZXQgLSBFSVNDT05OIik7CisKKwkvKmNvbm5lY3QoKSBURVNUOTogT24gZXN0YWJsaXNoZWQgc29ja2V0LCBFSVNDT05OIEV4cGVjdCBlcnJvciovCisJaT0wOworCWVycm9yID0gY29ubmVjdChhY3B0X3NrW2ldLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopICZsc3RuX2FkZHIsIGxlbik7CisgICAgICAgIGlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFSVNDT05OKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJjb25uZWN0IG9uIGFuIGVzdGFibGlzaGVkIHNvY2tldCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImNvbm5lY3QoKSBvbiBhbiBlc3RhYmxpc2hlZCBzb2NrZXQgLSBFSVNDT05OIik7CisKKwlmb3IgKGkgPSAwIDsgaSA8IDQgOyBpKyspIHsKKwkJY2xvc2UoY2xudF9za1tpXSk7CisJCWNsb3NlKGFjcHRfc2tbaV0pOworCX0gCisKKwkvKiBjb25uZWN0KCkgVEVTVDEwOiBSZS1lc3RhYmxpc2ggYW4gYXNzb2NpYXRpb24gdGhhdCBpcyBjbG9zZWQuCisJICogc2hvdWxkIHN1Y2NlZWQuCisJICovCisJZXJyb3IgPSBjb25uZWN0KHNrMSwgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZjb25uX2FkZHIsIGxlbik7CisJaWYgKGVycm9yIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiUmUtZXN0YWJsaXNoIGFuIGFzc29jaWF0aW9uIHRoYXQgIgorCQkJCSAiaXMgY2xvc2VkIGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImNvbm5lY3QoKSB0byByZS1lc3RhYmxpc2ggYSBjbG9zZWQgYXNzb2NpYXRpb24gLSAiCisJCSAiU1VDQ0VTUyIpOworCisJY2xvc2Uoc2spOworCWNsb3NlKHNrMSk7CisJY2xvc2UobHN0bl9zayk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX2Nvbm5lY3R4LmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9jb25uZWN0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYjE4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9jb25uZWN0eC5jCkBAIC0wLDAgKzEsMjI2IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAzIEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQKKyAqCisgKiBUaGlzIGZpbGUgaGFzIHRlc3QgY2FzZXMgdG8gdGVzdCB0aGUgc2N0cF9jb25uZWN0eCAoKSBjYWxsIGZvciAxLTEgc3R5bGUgc29ja2V0cworICoKKyAqIFRFU1QxOiBCYWQgc29ja2V0IGRlc2NyaXB0b3IKKyAqIFRFU1QyOiBJbnZhbGlkIHNvY2tldAorICogVEVTVDM6IEludmFsaWQgYWRkcmVzcworICogVEVTVDQ6IEludmFsaWQgYWRkcmVzcyBsZW5ndGgKKyAqIFRFU1Q1OiBJbnZhbGlkIGFkZHJlc3MgZmFtaWx5CisgKiBURVNUNjogVmFsaWQgYmxvY2tpbmcgc2N0cF9jb25uZWN0eAorICogVEVTVDc6IENvbm5lY3Qgd2hlbiBhY2NlcHQgcXVldWUgaXMgZnVsbAorICogVEVTVDg6IE9uIGEgbGlzdGVuaW5nIHNvY2tldAorICogVEVTVDk6IE9uIGVzdGFibGlzaGVkIHNvY2tldAorICogVEVTVDEwOiBDb25uZWN0IHRvIHJlLWVzdGFibGlzaCBhIGNsb3NlZCBhc3NvY2lhdGlvbi4gCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiAgICAgICAgIC8qIGZvciBzb2NrYWRkcl9pbiAqLworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgInNjdHB1dGlsLmgiCisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSAxMDsKK2ludCBUU1RfQ05UID0gMDsKKworI2RlZmluZSBTS19NQVggMTAKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGVycm9yLGk7CisJc29ja2xlbl90IGxlbjsKKwlpbnQgc2ssbHN0bl9zayxjbG50X3NrW1NLX01BWF0sYWNwdF9za1tTS19NQVhdLHBmX2NsYXNzOworCWludCBzazEsY2xudDJfc2s7CisKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gY29ubl9hZGRyLGxzdG5fYWRkcixhY3B0X2FkZHI7CisJc3RydWN0IHNvY2thZGRyICp0bXBfYWRkcjsKKworCS8qIFJhdGhlciB0aGFuIGZmbHVzaCgpIHRocm91Z2hvdXQgdGhlIGNvZGUsIHNldCBzdGRvdXQgdG8KKwkgKiBiZSB1bmJ1ZmZlcmVkLgorCSAqLworCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworCXNldHZidWYoc3RkZXJyLCBOVUxMLCBfSU9OQkYsIDApOworCisJcGZfY2xhc3MgPSBQRl9JTkVUOworCisJc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisJc2sxID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJLypDcmVhdGluZyBhIGxpc3RlbiBzb2NrZXQqLworCWxzdG5fc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwkvKkNyZWF0aW5nIGEgcmVndWxhciBzb2NrZXQqLworCWZvciAoaSA9IDAgOyBpIDwgU0tfTUFYIDsgaSsrKQorCQljbG50X3NrW2ldID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJY2xudDJfc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwljb25uX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJY29ubl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisJY29ubl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCWxzdG5fYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlsc3RuX2FkZHIuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKwlsc3RuX2FkZHIuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCisJLypCaW5kaW5nIHRoZSBsaXN0ZW4gc29ja2V0Ki8KKwl0ZXN0X2JpbmQobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmbHN0bl9hZGRyLCBzaXplb2YobHN0bl9hZGRyKSk7CisKKwkvKkxpc3RlbmluZyB0aGUgc29ja2V0Ki8KKwl0ZXN0X2xpc3Rlbihsc3RuX3NrLCBTS19NQVgtMSk7CisKKworCS8qc2N0cF9jb25uZWN0eCAoKSBURVNUMTogQmFkIHNvY2tldCBkZXNjcmlwdG9yLCBFQkFERiBFeHBlY3RlZCBlcnJvciovCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJZXJyb3IgPSBzY3RwX2Nvbm5lY3R4KC0xLCAoc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIDEsIE5VTEwpOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFQkFERikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2N0cF9jb25uZWN0eCB3aXRoIGJhZCBzb2NrZXQgIgorCQkJICJkZXNjcmlwdG9yIGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfY29ubmVjdHgoKSB3aXRoIGJhZCBzb2NrZXQgZGVzY3JpcHRvciAtIEVCQURGIik7CisJCisJLypzY3RwX2Nvbm5lY3R4ICgpIFRFU1QyOiBJbnZhbGlkIHNvY2tldCwgRU5PVFNPQ0sgRXhwZWN0ZWQgZXJyb3IqLworCWVycm9yID0gc2N0cF9jb25uZWN0eCgwLCAoc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIDEsIE5VTEwpOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFTk9UU09DSykKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2N0cF9jb25uZWN0eCB3aXRoIGludmFsaWQgc29ja2V0ICIKKwkgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzY3RwX2Nvbm5lY3R4KCkgd2l0aCBpbnZhbGlkIHNvY2tldCAtIEVOT1RTT0NLIik7CisKKwkvKnNjdHBfY29ubmVjdHggKCkgVEVTVDM6IEludmFsaWQgYWRkcmVzcywgRUlOVkFMIEV4cGVjdGVkIGVycm9yKi8KKwl0bXBfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpIC0gMSk7CisJdG1wX2FkZHItPnNhX2ZhbWlseSA9IEFGX0lORVQ7CisJZXJyb3IgPSBzY3RwX2Nvbm5lY3R4KHNrLCB0bXBfYWRkciwgMSwgTlVMTCk7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVJTlZBTCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2N0cF9jb25uZWN0eCB3aXRoIGludmFsaWQgYWRkcmVzcyAiCisJICAgICAgICAgICAgICAgICAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9jb25uZWN0eCgpIHdpdGggaW52YWxpZCBhZGRyZXNzIC0gRUlOVkFMIik7CisKKwkvKnNjdHBfY29ubmVjdHggKCkgVEVTVDQ6IEludmFsaWQgYWRkcmVzcyBsZW5ndGgsIEVJTlZBTCBFeHBlY3RlZCBlcnJvciovCisJZXJyb3IgPSBzY3RwX2Nvbm5lY3R4KHNrLCAoc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIDAsIE5VTEwpOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFSU5WQUwpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNjdHBfY29ubmVjdHggd2l0aCBpbnZhbGlkIGFkZHJlc3MgbGVuZ3RoICIKKwkgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzY3RwX2Nvbm5lY3R4KCkgd2l0aCBpbnZhbGlkIGFkZHJlc3MgbGVuZ3RoIC0gRUlOVkFMIik7CisKKwkvKnNjdHBfY29ubmVjdHggKCkgVEVTVDU6IEludmFsaWQgYWRkcmVzcyBmYW1pbHksIEVJTlZBTCBFeHBlY3QgZXJyb3IqLworCWNvbm5fYWRkci5zaW5fZmFtaWx5ID0gOTA5MDsgLypBc3NpZ25pbmcgaW52YWxpZCBhZGRyZXNzIGZhbWlseSovCisJZXJyb3IgPSBzY3RwX2Nvbm5lY3R4KHNrLCAoc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIDEsIE5VTEwpOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFSU5WQUwpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNjdHBfY29ubmVjdHggd2l0aCBpbnZhbGlkIGFkZHJlc3MgZmFtaWx5ICIKKwkgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzY3RwX2Nvbm5lY3R4KCkgd2l0aCBpbnZhbGlkIGFkZHJlc3MgZmFtaWx5IC0gRUlOVkFMIik7CisKKwljb25uX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisKKwkvKnNjdHBfY29ubmVjdHggKCkgVEVTVDY6IEJsb2NraW5nIHNjdHBfY29ubmVjdHgsIHNob3VsZCBwYXNzKi8KKwkvKkFsbCB0aGUgYmUgYmVsb3cgYmxvY2tpbmcgc2N0cF9jb25uZWN0eCBzaG91bGQgcGFzcyBhcyBzb2NrZXQgd2lsbCBiZSAKKwlsaXN0ZW5pbmcgU0tfTUFYIGNsaWVudHMqLworCWZvciAoaSA9IDAgOyBpIDwgU0tfTUFYIDsgaSsrKSB7CisJCWVycm9yID0gc2N0cF9jb25uZWN0eChjbG50X3NrW2ldLCAoc3RydWN0IHNvY2thZGRyICopJmNvbm5fYWRkciwKKwkJCSAgICAgIDEsIE5VTEwpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAidmFsaWQgYmxvY2tpbmcgc2N0cF9jb25uZWN0eCAiCisJCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCX0KKworCXRzdF9yZXNtKFRQQVNTLCAidmFsaWQgYmxvY2tpbmcgc2N0cF9jb25uZWN0eCgpIC0gU1VDQ0VTUyIpOworCisJLypzY3RwX2Nvbm5lY3R4ICgpIFRFU1Q3OiBzY3RwX2Nvbm5lY3R4IHdoZW4gYWNjZXB0IHF1ZXVlIGlzIGZ1bGwsIEVDT05OUkVGVVNFRAorCUV4cGVjdCBlcnJvciovCisJLypOb3cgdGhhdCBhY2NlcHQgcXVldWUgaXMgZnVsbCwgdGhlIGJlbG93IHNjdHBfY29ubmVjdHggc2hvdWxkIGZhaWwqLworCWVycm9yID0gc2N0cF9jb25uZWN0eChjbG50Ml9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmY29ubl9hZGRyLCAxLCBOVUxMKTsKKwlpZiAoZXJyb3IgIT0gLTEgfHwgZXJybm8gIT0gRUNPTk5SRUZVU0VEKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX2Nvbm5lY3R4IHdoZW4gYWNjZXB0IHF1ZXVlIGlzIGZ1bGwgIgorCSAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfY29ubmVjdHgoKSB3aGVuIGFjY2VwdCBxdWV1ZSBpcyBmdWxsIC0gRUNPTk5SRUZVU0VEIik7CisJCisJLypDYWxsaW5nIGEgYWNjZXB0IGZpcnN0IHRvIGVzdGJsaXNoIHRoZSBwZW5kaW5nIHNjdHBfY29ubmVjdHhpb25zKi8KKwlmb3IgKGk9MCA7IGkgPCBTS19NQVggOyBpKyspCisJCWFjcHRfc2tbaV0gPSB0ZXN0X2FjY2VwdChsc3RuX3NrLAorCQkJCQkgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWNwdF9hZGRyLCAmbGVuKTsKKworCS8qc2N0cF9jb25uZWN0eCAoKSBURVNUODogZnJvbSBhIGxpc3RlbmluZyBzb2NrZXQsIEVJU0NPTk4gRXhwZWN0IGVycm9yKi8KKwllcnJvciA9IHNjdHBfY29ubmVjdHgobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmbHN0bl9hZGRyLCAxLCBOVUxMKTsKKwlpZiAoZXJyb3IgIT0gLTEgfHwgZXJybm8gIT0gRUlTQ09OTikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2N0cF9jb25uZWN0eCBvbiBhIGxpc3RlbmluZyBzb2NrZXQgIgorCSAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfY29ubmVjdHgoKSBvbiBhIGxpc3RlbmluZyBzb2NrZXQgLSBFSVNDT05OIik7CisKKwkvKnNjdHBfY29ubmVjdHgoKSBURVNUOTogT24gZXN0YWJsaXNoZWQgc29ja2V0LCBFSVNDT05OIEV4cGVjdCBlcnJvciovCisJaT0wOworCWVycm9yID0gc2N0cF9jb25uZWN0eChhY3B0X3NrW2ldLCAoc3RydWN0IHNvY2thZGRyICopICZsc3RuX2FkZHIsIDEsIE5VTEwpOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFSVNDT05OKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX2Nvbm5lY3R4IG9uIGFuIGVzdGFibGlzaGVkIHNvY2tldCAiCisJICAgICAgICAgICAgICAgICAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9jb25uZWN0eCgpIG9uIGFuIGVzdGFibGlzaGVkIHNvY2tldCAtIEVJU0NPTk4iKTsKKworCWZvciAoaSA9IDAgOyBpIDwgNCA7IGkrKykgeworCQljbG9zZShjbG50X3NrW2ldKTsKKwkJY2xvc2UoYWNwdF9za1tpXSk7CisJfSAKKworCS8qIHNjdHBfY29ubmVjdHgoKSBURVNUMTA6IFJlLWVzdGFibGlzaCBhbiBhc3NvY2lhdGlvbiB0aGF0IGlzIGNsb3NlZC4KKwkgKiBzaG91bGQgc3VjY2VlZC4KKwkgKi8KKwllcnJvciA9IHNjdHBfY29ubmVjdHgoc2sxLCAoc3RydWN0IHNvY2thZGRyICopJmNvbm5fYWRkciwgMSwgTlVMTCk7CisJaWYgKGVycm9yIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiUmUtZXN0YWJsaXNoIGFuIGFzc29jaWF0aW9uIHRoYXQgIgorCQkJCSAiaXMgY2xvc2VkIGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfY29ubmVjdHgoKSB0byByZS1lc3RhYmxpc2ggYSBjbG9zZWQgYXNzb2NpYXRpb24gLSAiCisJCSAiU1VDQ0VTUyIpOworCisJY2xvc2Uoc2spOworCWNsb3NlKHNrMSk7CisJY2xvc2UobHN0bl9zayk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX2V2ZW50cy5jIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1OGQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX2V2ZW50cy5jCkBAIC0wLDAgKzEsMjA1IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAzIEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQKKyAqCisgKiBUaGlzIHRlc3QgdGVzdHMgdGhlIGV2ZW50cyBmb3IgMS0xIHN0eWxlIHNvY2tldHMuCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAgICAgICAgIC8qIG5lZWRlZCBieSBsaW51eC9zY3RwLmggKi8KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiAgICAgICAgIC8qIGZvciBzb2NrYWRkcl9pbiAqLworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9zY3RwLmg+CisjaW5jbHVkZSA8c2N0cHV0aWwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworY2hhciAqVENJRCA9IF9fRklMRV9fOworaW50IFRTVF9UT1RBTCA9IDQ7CitpbnQgVFNUX0NOVCA9IDA7CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBzdnJfc2ssIGNsdF9zayxhY3B0X3NrOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzdnJfbG9vcCwgY2x0X2xvb3AsYWNwdF9sb29wOworCXN0cnVjdCBpb3ZlYyBpb3YsIG91dF9pb3Y7CisJc3RydWN0IG1zZ2hkciBpbm1lc3NhZ2UsIG91dG1lc3NhZ2U7CisJY2hhciBpbmNtc2dbQ01TR19TUEFDRShzaXplb2Yoc2N0cF9jbXNnX2RhdGFfdCkpXTsKKwljaGFyIG91dGNtc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpXTsKKwlpbnQgZXJyb3I7CisJc29ja2xlbl90IGxlbjsKKwljaGFyICpiaWdfYnVmZmVyOworCXN0cnVjdCBzY3RwX2V2ZW50X3N1YnNjcmliZSBldmVudDsKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbzsKKwljaGFyICptZXNzYWdlID0gImhlbGxvLCB3b3JsZCFcbiI7CisJdWludDMyX3QgcHBpZDsKKwl1aW50MzJfdCBzdHJlYW07CisKKyAgICAgICAgLyogUmF0aGVyIHRoYW4gZmZsdXNoKCkgdGhyb3VnaG91dCB0aGUgY29kZSwgc2V0IHN0ZG91dCB0byAKKwkgKiBiZSB1bmJ1ZmZlcmVkLiAgCisJICovIAorCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOyAKKworCS8qIEluaXRpYWxpemUgdGhlIHNlcnZlciBhbmQgY2xpZW50IGFkZHJlc3Nlcy4gKi8gCisJc3ZyX2xvb3Auc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc3ZyX2xvb3Auc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKwlzdnJfbG9vcC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKwljbHRfbG9vcC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwljbHRfbG9vcC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCWNsdF9sb29wLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCS8qIENyZWF0ZSBhbmQgYmluZCB0aGUgc2VydmVyIHNvY2tldC4gICovCisgICAgICAgIHN2cl9zayA9IHRlc3Rfc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCXRlc3RfYmluZChzdnJfc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnN2cl9sb29wLCBzaXplb2Yoc3ZyX2xvb3ApKTsKKworCS8qIE1hcmsgc2VydmVyIHNvY2tldCBhcyBiZWluZyBhYmxlIHRvIGFjY2VwdCBuZXcgYXNzb2NpYXRpb25zLiAgKi8KKwl0ZXN0X2xpc3RlbihzdnJfc2ssIDMpOworCisJLyogQ3JlYXRlIHRoZSBjbGllbnQgc29ja2V0LiAgKi8KKwljbHRfc2sgPSB0ZXN0X3NvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKworCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOworCWV2ZW50LnNjdHBfZGF0YV9pb19ldmVudCA9IDE7CisJZXZlbnQuc2N0cF9hc3NvY2lhdGlvbl9ldmVudCA9IDE7CisJZXZlbnQuc2N0cF9zaHV0ZG93bl9ldmVudCA9IDE7CisjaWZkZWYgSEFWRV9TQ1RQX0FVVEhfTk9fQVVUSAorCWV2ZW50LnNjdHBfYXV0aGVudGljYXRpb25fZXZlbnQgPSAxOworI2VuZGlmCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBzY3RwX2V2ZW50X3N1YnNjcmliZSk7CisJdGVzdF9zZXRzb2Nrb3B0KHN2cl9zaywgU0NUUF9FVkVOVFMsICZldmVudCwgbGVuKTsKKwl0ZXN0X3NldHNvY2tvcHQoY2x0X3NrLCBTQ1RQX0VWRU5UUywgJmV2ZW50LCBsZW4pOworCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJdGVzdF9jb25uZWN0KGNsdF9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmY2x0X2xvb3AsIGxlbik7CisJCisJYWNwdF9zayA9IHRlc3RfYWNjZXB0KHN2cl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWNwdF9sb29wLCAmbGVuKTsKKworCS8qIEJ1aWxkIHVwIGEgbXNnaGRyIHN0cnVjdHVyZSB3ZSBjYW4gdXNlIGZvciBhbGwgc2VuZGluZy4gICovCisJbWVtc2V0KCZvdXRtZXNzYWdlLCAwLCBzaXplb2Yob3V0bWVzc2FnZSkpOwkKKwlvdXRtZXNzYWdlLm1zZ19uYW1lID0gJnN2cl9sb29wOworCW91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2Yoc3ZyX2xvb3ApOworCW91dG1lc3NhZ2UubXNnX2lvdiA9ICZvdXRfaW92OworCW91dG1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbCA9IG91dGNtc2c7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihvdXRjbXNnKTsKKwlvdXRtZXNzYWdlLm1zZ19mbGFncyA9IDA7CisKKwljbXNnID0gQ01TR19GSVJTVEhEUigmb3V0bWVzc2FnZSk7CisJY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKKwljbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKwljbXNnLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworCXNpbmZvID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7CisJbWVtc2V0KHNpbmZvLCAweDAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCXBwaWQgPSByYW5kKCk7IC8qIENob29zZSBhbiBhcmJpdHJhcnkgdmFsdWUuICovCisJc3RyZWFtID0gMTsKKworCXNpbmZvLT5zaW5mb19wcGlkID0gcHBpZDsKKwlzaW5mby0+c2luZm9fc3RyZWFtID0gc3RyZWFtOworCisJb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfYmFzZSA9IG1lc3NhZ2U7CisJb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfbGVuID0gKHN0cmxlbihtZXNzYWdlKSArIDEpOworCisJLyogU2VuZCAuIFRoaXMgd2lsbCBjcmVhdGUgdGhlIGFzc29jaWF0aW9uKi8KKwl0ZXN0X3NlbmRtc2coY2x0X3NrLCAmb3V0bWVzc2FnZSwgMCwgc3RybGVuKG1lc3NhZ2UpKzEpOworCisgICAgICAgIG1lbXNldCgmaW5tZXNzYWdlLCAwLCBzaXplb2YoaW5tZXNzYWdlKSk7CisJLyogTk9XIGluaXRpYWxpemUgaW5tZXNzYWdlIHdpdGggZW5vdWdoIHNwYWNlIGZvciBEQVRBLi4uICovCisJYmlnX2J1ZmZlciA9IG1hbGxvYyhSRUFMTFlfQklHKTsKKwlpZiAoIWJpZ19idWZmZXIpIHsgRFVNUF9DT1JFOyB9CisKKwkvKiBMZXQncyBkbyBhIHRlc3QgdG8gZG8gYSByZWN2bXNnIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgYW5kCisJICogd2hlbiB3ZSBoYXZlIG5vIGFzc29jaWF0aW9ucy4KKwkgKi8KKwlpb3YuaW92X2Jhc2UgPSBiaWdfYnVmZmVyOworCWlvdi5pb3ZfbGVuID0gUkVBTExZX0JJRzsKKwlpbm1lc3NhZ2UubXNnX2lvdiA9ICZpb3Y7CisJaW5tZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworCWlubWVzc2FnZS5tc2dfY29udHJvbCA9IGluY21zZzsKKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKworCWVycm9yID0gdGVzdF9yZWN2bXNnKGNsdF9zaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDVFBfQVNTT0NfQ0hBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NUUF9DT01NX1VQKTsKKwkKKwl0c3RfcmVzbShUUEFTUywgIkNPTU1fVVAgbm90aWZpY2F0aW9uIG9uIGNsaWVudCBzb2NrZXQgLSBTVUNDRVNTIik7CisKKwllcnJvciA9IHRlc3RfcmVjdm1zZyhhY3B0X3NrLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NUUF9BU1NPQ19DSEFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ1RQX0NPTU1fVVApOworCQorCXRzdF9yZXNtKFRQQVNTLCAiQ09NTV9VUCBub3RpZmljYXRpb24gb24gc2VydmVyIHNvY2tldCAtIFNVQ0NFU1MiKTsKKworI2lmZGVmIEhBVkVfU0NUUF9BVVRIX05PX0FVVEgKKwllcnJvciA9IHRlc3RfcmVjdm1zZyhhY3B0X3NrLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsCisJCQkJICAgIGVycm9yLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXV0aGtleV9ldmVudCksCisJCQkJICAgIFNDVFBfQVVUSEVOVElDQVRJT05fRVZFTlQsCisJCQkJICAgIFNDVFBfQVVUSF9OT19BVVRIKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiQVVUSF9OT19BVVRIIG5vdGlmaWNhdGlvbiBvbiBzZXJ2ZXIgc29ja2V0IC0gU1VDQ0VTUyIpOworI2VuZGlmCisKKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coYWNwdF9zaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworICAgICAgICB0ZXN0X2NoZWNrX21zZ19kYXRhKCZpbm1lc3NhZ2UsIGVycm9yLCBzdHJsZW4obWVzc2FnZSkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TR19FT1IsIHN0cmVhbSwgcHBpZCk7CisKKwl0c3RfcmVzbShUUEFTUywgIkRhdGEgbWVzc2FnZSBvbiBzZXJ2ZXIgc29ja2V0IC0gU1VDQ0VTUyIpOworCisJY2xvc2UoY2x0X3NrKTsKKwllcnJvciA9IHRlc3RfcmVjdm1zZyhhY3B0X3NrLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9zaHV0ZG93bl9ldmVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ1RQX1NIVVRET1dOX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKwl0c3RfcmVzbShUUEFTUywgIlNIVVRET1dOIG5vdGlmaWNhdGlvbiBvbiBhY2NlcHRlZCBzb2NrZXQgLSBTVUNDRVNTIik7CisJY2xvc2Uoc3ZyX3NrKTsKKwljbG9zZShhY3B0X3NrKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfaW5pdG1zZ19jb25uZWN0LmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9pbml0bXNnX2Nvbm5lY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWZiNGY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfaW5pdG1zZ19jb25uZWN0LmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUAorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNAorICoKKyAqIFdoZW4gaW5pdCB0aW1lb3V0IGlzIHNldCB0byB6ZXJvLCBhIGNvbm5lY3QgKCkgY3Jhc2hlZCB0aGUgc3lzdGVtLiBUaGlzIGNhc2UKKyAqIHRlc3RzIHRoZSBmaXggZm9yIHRoZSBzYW1lLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4gICAgICAgICAvKiBmb3Igc29ja2FkZHJfaW4gKi8KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPiAKKworY2hhciAqVENJRCA9IF9fRklMRV9fOworaW50IFRTVF9UT1RBTCA9IDE7CitpbnQgVFNUX0NOVCA9IDA7CisKK2ludCAKK21haW4gKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc2sxLCBzazIsIHNrMywgcGZfY2xhc3M7CisJc29ja2xlbl90IGxlbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gbHN0bl9hZGRyLCBhY3B0X2FkZHI7CisJc3RydWN0IHNvY2thZGRyX2luIGNvbm5fYWRkcjsKKwljaGFyICogYnVmZmVyX3JjdjsKKwlzdHJ1Y3Qgc2N0cF9pbml0bXNnIHNpbm1zZzsKKwljaGFyICptZXNzYWdlID0gIkhlbGxvIFdvcmxkIVxuIjsKKworCS8qIFJhdGhlciB0aGFuIGZmbHVzaCgpIHRocm91Z2hvdXQgdGhlIGNvZGUsIHNldCBzdGRvdXQgdG8KKwkgKiBiZSB1bmJ1ZmZlcmVkLgorCSAqLworCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworCXNldHZidWYoc3RkZXJyLCBOVUxMLCBfSU9OQkYsIDApOworCisJLyogT3BlbmluZyB0aGUgc29ja2V0Ki8KKwkKKwlwZl9jbGFzcyA9IFBGX0lORVQ7CisKKwlzazEgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisJc2szID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisgICAgICAgIGNvbm5fYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgY29ubl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisgICAgICAgIGNvbm5fYWRkci5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKyAgICAgICAgbHN0bl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBsc3RuX2FkZHIuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgbHN0bl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCXRlc3RfYmluZChzazMsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmxzdG5fYWRkciwgc2l6ZW9mKGxzdG5fYWRkcikpOworCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBzY3RwX2luaXRtc2cpOworCXNpbm1zZy5zaW5pdF9udW1fb3N0cmVhbXMgPSA2NTUzNTsKKwlzaW5tc2cuc2luaXRfbWF4X2luc3RyZWFtcyA9IDEwOworCXNpbm1zZy5zaW5pdF9tYXhfYXR0ZW1wdHMgPSAxOworCXNpbm1zZy5zaW5pdF9tYXhfaW5pdF90aW1lbyA9IDA7CisJdGVzdF9zZXRzb2Nrb3B0KHNrMSwgU0NUUF9JTklUTVNHLCAmc2lubXNnLCBsZW4pOworCXNpbm1zZy5zaW5pdF9udW1fb3N0cmVhbXMgPSAxMDsKKwlzaW5tc2cuc2luaXRfbWF4X2luc3RyZWFtcyA9IDY1NTM1OworCXRlc3Rfc2V0c29ja29wdChzazMsIFNDVFBfSU5JVE1TRywgJnNpbm1zZywgbGVuKTsKKworCXRlc3RfbGlzdGVuKHNrMywgMSk7CisKKwlsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwl0ZXN0X2Nvbm5lY3Qoc2sxLCAoc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIGxlbik7CisKKwlzazIgPSB0ZXN0X2FjY2VwdChzazMsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFjcHRfYWRkciwgJmxlbik7CisKKwl0ZXN0X3NjdHBfc2VuZG1zZyhzazEsIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSArIDEsCisJCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmY29ubl9hZGRyLCBsZW4sCisJCQkgIDAsIDAsIDY1NTM0LCAwLCAwKTsKKworCWJ1ZmZlcl9yY3YgPSBtYWxsb2MoMTAwKTsKKwl0ZXN0X3JlY3Yoc2syLCBidWZmZXJfcmN2LCAoc3RybGVuKG1lc3NhZ2UpICsgMSksIE1TR19OT1NJR05BTCk7CisKKwl0c3RfcmVzbShUUEFTUywgImNvbm5lY3QoKSB3aXRoIGluaXQgdGltZW91dCBzZXQgdG8gMCAtIFNVQ0NFU1MiKTsKKworCWNsb3NlIChzazEpOworCWNsb3NlIChzazIpOworCWNsb3NlIChzazMpOworCQorICAgICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX25vbmJsb2NrLmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9ub25ibG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzlmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9ub25ibG9jay5jCkBAIC0wLDAgKzEsMjA5IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAzIEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQKKyAqCisgKiBUaGlzIGZpbGUgaGFzIHRlc3QgY2FzZXMgdG8gdGVzdCB0aGUgTm9uLUJsb2NraW5nIG1vZGUgb2YgY29ubmVjdCgpLAorICogYWNjZXB0KCkgYW5kIHJlY3Ztc2coKSBjYWxscy4KKyAqCisgKiBURVNUMTogTm9uIGJsb2NraW5nIGFjY2VwdCByZXR1cm4gRUFHQUlOIGlmIGNvbm5lY3QgaXMgbm90IGNhbGxlZCAKKyAqIFRFU1QyOiBOb24gYmxvY2tpbmcgY29ubmVjdCBzaG91bGQgcmV0dXJuIEVJTlBST0dSRVNTCisgKiBURVNUMzogYWNjZXB0KCkgcGFzc2VzIHdoZW4gY29ubmVjdCBjYWxsZWQgaW4gTm9uLWJsb2NraW5nIG1vZGUKKyAqIFRFU1Q0OiBOb24gYmxvY2tpbmcgcmVjdm1zZyBzaG91bGQgcmV0dXJuIEVBR0FJTgorICogVEVTVDU6IHJlY3Ztc2coKSBzaG91bGQgc3VjY2VlZCBpZiBkYXRhIHByZXNlbnQgdG8gcmVjZWl2ZSBpbiBub24gYmxvY2tpbmcKKyAqCSAgbW9kZQorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4gICAgICAgICAvKiBmb3Igc29ja2FkZHJfaW4gKi8KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorCitjaGFyICpUQ0lEID0gX19GSUxFX187CitpbnQgVFNUX1RPVEFMID0gNTsKK2ludCBUU1RfQ05UID0gMDsKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgICAgIGludCBlcnJvcixtc2dfY291bnQ7CisJc29ja2xlbl90IGxlbjsKKwlpbnQgc2sscGZfY2xhc3MsbHN0bl9zayxhY3B0X3NrLGZsYWcsY2ZsYWcsc2ZsYWc7CisJc3RydWN0IG1zZ2hkciBvdXRtZXNzYWdlOworCXN0cnVjdCBtc2doZHIgaW5tZXNzYWdlOworICAgICAgICBjaGFyICptZXNzYWdlID0gImhlbGxvLCB3b3JsZCFcbiI7CisgICAgICAgIHN0cnVjdCBpb3ZlYyBpb3ZfcmN2OworCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvOworCWNoYXIgb3V0Y21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSldOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworICAgICAgICBzdHJ1Y3QgaW92ZWMgb3V0X2lvdjsKKwljaGFyICogYnVmZmVyX3JjdjsKKwljaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzY3RwX2Ntc2dfZGF0YV90KSldOworCQorICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gY29ubl9hZGRyLGxzdG5fYWRkcixzdnJfYWRkcjsKKworCS8qIFJhdGhlciB0aGFuIGZmbHVzaCgpIHRocm91Z2hvdXQgdGhlIGNvZGUsIHNldCBzdGRvdXQgdG8KKyAgICAgICAgICogYmUgdW5idWZmZXJkCisgICAgICAgICAqLworICAgICAgICBzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsKKyAgICAgICAgc2V0dmJ1ZihzdGRlcnIsIE5VTEwsIF9JT05CRiwgMCk7CisKKyAgICAgICAgcGZfY2xhc3MgPSBQRl9JTkVUOworCisgICAgICAgIHNrID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisgICAgICAgIGxzdG5fc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwljb25uX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGNvbm5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworICAgICAgICBjb25uX2FkZHIuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCisJbHN0bl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBsc3RuX2FkZHIuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgbHN0bl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCS8qQmluZGluZyB0aGUgbGlzdGVuIHNvY2tldCovCisgICAgICAgIHRlc3RfYmluZChsc3RuX3NrLCAoc3RydWN0IHNvY2thZGRyICopICZsc3RuX2FkZHIsIHNpemVvZihsc3RuX2FkZHIpKTsKKworICAgICAgICAvKkxpc3RlbmluZyB0aGUgc29ja2V0Ki8KKyAgICAgICAgdGVzdF9saXN0ZW4obHN0bl9zaywgMTApOworCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJZmxhZyA9IE1TR19OT1NJR05BTDsKKwkKKwkvKlNldHRpbmcgc2VydmVyIHNvY2tldCBub24tYmxvY2tpbmcqLworCXNmbGFnID0gZmNudGwobHN0bl9zaywgRl9HRVRGTCwgMCk7CisJaWYgKHNmbGFnIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZmNudCBGX0dFVEZMIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInNmbGFnOiVkLCBlcnJubzolZCIsIHNmbGFnLCBlcnJubyk7CisKKwllcnJvciA9IGZjbnRsKGxzdG5fc2ssIEZfU0VURkwsIHNmbGFnIHwgT19OT05CTE9DSyk7CisJaWYgKGVycm9yIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZmNudCBGX1NFVEZMIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwkvKiBURVNUMTogYWNjZXB0IHNob3VsZCByZXR1cm4gRUFHQUlOIGluc3RlYWQgYmxvY2tpbmcuICovCisJZXJyb3IgPSBhY2NlcHQobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzdnJfYWRkciwgJmxlbik7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVBR0FJTikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAibm9uLWJsb2NraW5nIGFjY2VwdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgIm5vbi1ibG9ja2luZyBhY2NlcHQoKSAtIEVBR0FJTiIpOworCisJLyogVEVTVDI6IE5vbiBCbG9jayBjb25uZWN0IHNob3VsZCByZXR1cm4gRUlOUFJPR1JFU1MgKi8KKwkvKlNldCBjbGllbnQgc29ja2V0IGFzIG5vbi1ibG9ja2luZyovCisJY2ZsYWcgPSBmY250bChzaywgRl9HRVRGTCwgMCk7CisJaWYgKGNmbGFnIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZmNudCBGX0dFVEZMIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImNmbGFnOiVkLCBlcnJubzolZCIsIGNmbGFnLCBlcnJubyk7CisKKwllcnJvciA9IGZjbnRsKHNrLCBGX1NFVEZMLCBzZmxhZyB8IE9fTk9OQkxPQ0spOworCWlmIChlcnJvciA8IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImZjbnQgRl9TRVRGTCBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJZXJyb3IgPSBjb25uZWN0KHNrLCAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIGxlbik7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVJTlBST0dSRVNTKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJub24tYmxvY2tpbmcgY29ubmVjdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgIm5vbi1ibG9ja2luZyBjb25uZWN0KCkgLSBFSU5QUk9HUkVTUyIpOworCisJLyogVEVTVDM6IE5vdyB0aGF0IGNvbm5lY3QoKSBjYWxsZWQsIGFjY2VwdCB3aWxsIHN1Y2NlZWQgKi8KKwlhY3B0X3NrID0gYWNjZXB0KGxzdG5fc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3ZyX2FkZHIsICZsZW4pOworCWlmIChhY3B0X3NrIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiYWNjZXB0IGFmdGVyIGEgbm9uLWJsb2NraW5nIGNvbm5lY3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCQorCXRzdF9yZXNtKFRQQVNTLCAiYWNjZXB0KCkgYWZ0ZXIgYSBub24tYmxvY2tpbmcgY29ubmVjdCAtIFNVQ0NFU1MiKTsKKworCW1lbXNldCgmb3V0bWVzc2FnZSwgMCwgc2l6ZW9mKG91dG1lc3NhZ2UpKTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfbmFtZSA9ICZzdnJfYWRkcjsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfbmFtZWxlbiA9IHNpemVvZihzdnJfYWRkcik7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2lvdiA9ICZvdXRfaW92OworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19jb250cm9sID0gb3V0Y21zZzsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihvdXRjbXNnKTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfZmxhZ3MgPSAwOworCisJY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1lc3NhZ2UpOworICAgICAgICBjbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworICAgICAgICBjbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKyAgICAgICAgY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47CisJc2luZm8gPSAoc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqKUNNU0dfREFUQShjbXNnKTsKKyAgICAgICAgbWVtc2V0KHNpbmZvLCAweDAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCisgICAgICAgIG91dG1lc3NhZ2UubXNnX2lvdi0+aW92X2Jhc2UgPSBtZXNzYWdlOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9sZW4gPSBzdHJsZW4obWVzc2FnZSkgKyAxOworCisJbWVtc2V0KCZpbm1lc3NhZ2UsIDAsIHNpemVvZihpbm1lc3NhZ2UpKTsKKyAgICAgICAgYnVmZmVyX3JjdiA9IG1hbGxvYyhSRUFMTFlfQklHKTsKKworICAgICAgICBpb3ZfcmN2Lmlvdl9iYXNlID0gYnVmZmVyX3JjdjsKKyAgICAgICAgaW92X3Jjdi5pb3ZfbGVuID0gUkVBTExZX0JJRzsKKyAgICAgICAgaW5tZXNzYWdlLm1zZ19pb3YgPSAmaW92X3JjdjsKKyAgICAgICAgaW5tZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworICAgICAgICBpbm1lc3NhZ2UubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisgICAgICAgIGlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCisJbXNnX2NvdW50ID0gc3RybGVuKG1lc3NhZ2UpICsgMTsKKworCS8qIFRFU1Q0OiByZWN2bXNnKCkgc2hvdWxkIHJldHVybiBFQUdBSU4gaW5zdGVhZCBibG9ja2luZyAqLworCWVycm9yID0gcmVjdm1zZyhzaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCWlmICggZXJyb3IgIT0gLTEgfHwgZXJybm8gIT0gRUFHQUlOKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJub24tYmxvY2tpbmcgcmVjdm1zZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgIm5vbi1ibG9ja2luZyByZWN2bXNnKCkgLSBFQUdBSU4iKTsKKworCXRlc3Rfc2VuZG1zZyhhY3B0X3NrLCAmb3V0bWVzc2FnZSwgZmxhZywgbXNnX2NvdW50KTsKKworCS8qIFRFU1Q1OiByZWN2bXNnKCkgc2hvdWxkIHN1Y2NlZWQgbm93IGFzIGRhdGEgaXMgYXZhaWxhYmxlLiAqLworCWVycm9yID0gdGVzdF9yZWN2bXNnKHNrLCAmaW5tZXNzYWdlLCBmbGFnKTsKKyAgICAgICAgdGVzdF9jaGVja19tc2dfZGF0YSgmaW5tZXNzYWdlLCBlcnJvciwgbXNnX2NvdW50LCBNU0dfRU9SLCAwLCAwKTsKKworCXRzdF9yZXNtKFRQQVNTLCAibm9uLWJsb2NraW5nIHJlY3Ztc2coKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlIC0gIgorCQkgIlNVQ0NFU1MiKTsKKworCWNsb3NlKGxzdG5fc2spOworCWNsb3NlKGFjcHRfc2spOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfcmVjdmZyb20uYyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX3JlY3Zmcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkZTU2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX3JlY3Zmcm9tLmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUAorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNAorICoKKyAqIFRoaXMgZmlsZSBoYXMgdGVzdCBjYXNlcyB0byB0ZXN0IHRoZSByZWN2ZnJvbSAoKSBjYWxsIGZvciAxLTEgc3R5bGUgc29ja2V0cworICoKKyAqIFRFU1QxOiBCYWQgc29ja2V0IGRlc2NyaXB0b3IKKyAqIFRFU1QyOiBJbnZhbGlkIHNvY2tldAorICogVEVTVDM6IEludmFsaWQgbWVzc2FnZSBwb2ludGVyCisgKiBURVNUNDogT24gYSBsaXN0ZW5pbmcgc29ja2V0CisgKiBURVNUNTogUmVhZGluZyBvbiBhIHNvY2tldCB0aGF0IHJlY2VpdmVkIFNIVVRET1dOCisgKiBURVNUNjogUmVhZGluZyB0aGUgcGVuZGluZyBtZXNzYWdlIG9uIHNvY2tldCB0aGF0IHJlY2VpdmVkIFNIVVRET1dOCisgKiBURVNUNzogTm8gbW9yZSBtZXNzYWdlIGFuZCBhc3NvY2lhdGlvbiBpcyBzaHV0ZG93bgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4gICAgICAgICAvKiBmb3Igc29ja2FkZHJfaW4gKi8KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorCitjaGFyICpUQ0lEID0gX19GSUxFX187CitpbnQgVFNUX1RPVEFMID0gNzsKK2ludCBUU1RfQ05UID0gMDsKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgICAgIGludCBtc2dfY291bnQ7CisJc29ja2xlbl90IGxlbjsKKwlpbnQgc2sscGZfY2xhc3MsbHN0bl9zayxhY3B0X3NrLCBmbGFnOworICAgICAgICBjaGFyICptZXNzYWdlID0gImhlbGxvLCB3b3JsZCFcbiI7CisJY2hhciAqbWVzc2FnZV9yY3Y7CisgICAgICAgIGludCBjb3VudDsKKwlpbnQgZmQsIGVycl9ubyA9IDA7CisJY2hhciBmaWxlbmFtZVsyMV07CisKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGNvbm5fYWRkcixsc3RuX2FkZHIsc3ZyX2FkZHI7CisKKwkvKiBSYXRoZXIgdGhhbiBmZmx1c2goKSB0aHJvdWdob3V0IHRoZSBjb2RlLCBzZXQgc3Rkb3V0IHRvCisgICAgICAgICAqIGJlIHVuYnVmZmVyZWQuCisgICAgICAgICAqLworICAgICAgICBzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsKKyAgICAgICAgc2V0dmJ1ZihzdGRlcnIsIE5VTEwsIF9JT05CRiwgMCk7CisKKwltZXNzYWdlX3JjdiA9IG1hbGxvYyg1MTIpOworCisgICAgICAgIHBmX2NsYXNzID0gUEZfSU5FVDsKKworICAgICAgICBzayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKworICAgICAgICBsc3RuX3NrID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJY29ubl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBjb25uX2FkZHIuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgY29ubl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCWxzdG5fYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgbHN0bl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisgICAgICAgIGxzdG5fYWRkci5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKwkvKkJpbmRpbmcgdGhlIGxpc3RlbiBzb2NrZXQqLworICAgICAgICB0ZXN0X2JpbmQobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmbHN0bl9hZGRyLCBzaXplb2YobHN0bl9hZGRyKSk7CisKKyAgICAgICAgLypMaXN0ZW5pbmcgdGhlIHNvY2tldCovCisgICAgICAgIHRlc3RfbGlzdGVuKGxzdG5fc2ssIDEwKTsKKworCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQorCXRlc3RfY29ubmVjdChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmY29ubl9hZGRyLCBsZW4pOworCisJYWNwdF9zayA9IHRlc3RfYWNjZXB0KGxzdG5fc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3ZyX2FkZHIsICZsZW4pOworCQorCW1zZ19jb3VudCA9IChzdHJsZW4obWVzc2FnZSkgKyAxKTsKKworCWZsYWcgPSBNU0dfTk9TSUdOQUw7CisJLypTZW5kaW5nIHRoZSBtZXNzYWdlKi8KKwljb3VudCA9IHRlc3Rfc2VuZChzaywgbWVzc2FnZSwgbXNnX2NvdW50LCBmbGFnKTsKKworCS8qcmVjdmZyb20gKCkgVEVTVDE6IEJhZCBzb2NrZXQgZGVzY3JpcHRvciwgRUJBREYgRXhwZWN0ZWQgZXJyb3IqLworCWNvdW50ID0gcmVjdmZyb20oLTEsIG1lc3NhZ2VfcmN2LCBtc2dfY291bnQsIGZsYWcsCisJCQkgKHN0cnVjdCBzb2NrYWRkciAqKSZzdnJfYWRkciwgJmxlbik7CisJaWYgKGNvdW50ICE9IC0xIHx8IGVycm5vICE9IEVCQURGKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJyZWN2ZnJvbSB3aXRoIGEgYmFkIHNvY2tldCAiCisJCQkgImRlc2NyaXB0b3IgY291bnQ6JWQsIGVycm5vOiVkIiwgY291bnQsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAicmVjdmZyb20oKSB3aXRoIGEgYmFkIHNvY2tldCBkZXNjcmlwdG9yIC0gRUJBREYiKTsKKworCS8qcmVjdmZyb20gKCkgVEVTVDI6IEludmFsaWQgc29ja2V0ICwgRU5PVFNPQ0sgRXhwZWN0ZWQgZXJyb3IqLworCXN0cmNweShmaWxlbmFtZSwgIi90bXAvc2N0cHRlc3QuWFhYWFhYIik7CisJZmQgPSBta3N0ZW1wKGZpbGVuYW1lKTsKKwlpZiAoZmQgPT0gLTEpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIkZhaWxlZCB0byBta3N0ZW1wICVzOiAlcyIsCisJCQkJZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJY291bnQgPSByZWN2ZnJvbShmZCwgbWVzc2FnZV9yY3YsIG1zZ19jb3VudCwgZmxhZywKKwkJCSAoc3RydWN0IHNvY2thZGRyICopJnN2cl9hZGRyLCAmbGVuKTsKKwlpZiAoY291bnQgPT0gLTEpCisJCWVycl9ubyA9IGVycm5vOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoZmlsZW5hbWUpOworCWlmIChjb3VudCAhPSAtMSB8fCBlcnJfbm8gIT0gRU5PVFNPQ0spCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInJlY3Zmcm9tIHdpdGggaW52YWxpZCBzb2NrZXQgIgorCQkJICJjb3VudDolZCwgZXJybm86JWQiLCBjb3VudCwgZXJyX25vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAicmVjdmZyb20oKSB3aXRoIGludmFsaWQgc29ja2V0IC0gRU5PVFNPQ0siKTsKKworCS8qcmVjdmZyb20gKCkgVEVTVDM6IEludmFsaWQgbWVzc2FnZSBwb2ludGVyIEVGQVVMVCwgRXhwZWN0ZWQgZXJyb3IqLworCWNvdW50ID0gcmVjdmZyb20oYWNwdF9zaywgKGNoYXIgKiktMSwgbXNnX2NvdW50LCBmbGFnLAorCQkJIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3ZyX2FkZHIsICZsZW4pOworCWlmIChjb3VudCAhPSAtMSB8fCBlcnJubyAhPSBFRkFVTFQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInJlY3Zmcm9tIHdpdGggaW52YWxpZCBtZXNzYWdlICIKKwkJCSAicG9pbnRlciBjb3VudDolZCwgZXJybm86JWQiLCBjb3VudCwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJyZWN2ZnJvbSgpIHdpdGggaW52YWxpZCBtZXNzYWdlIHB0ciAtIEVGQVVMVCIpOworCisJLypURVNUNDogcmVjdmZyb20gb24gbGlzdGVuaW5nIHNvY2tldCxFTk9UQ09OTiBFeHBlY3RlZCBlcnJvciovCisJY291bnQgPSByZWN2ZnJvbShsc3RuX3NrLCBtZXNzYWdlX3JjdiwgbXNnX2NvdW50LCBmbGFnLAorCQkJIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3ZyX2FkZHIsICZsZW4pOworCWlmIChjb3VudCAhPSAtMSB8fCBlcnJubyAhPSBFTk9UQ09OTikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicmVjdmZyb20gb24gbGlzdGVuaW5nIHNvY2tldCAiCisJCQkgImNvdW50OiVkLCBlcnJubzolZCIsIGNvdW50LCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInJlY3Zmcm9tKCkgb24gbGlzdGVuaW5nIHNvY2tldCAtIEVOT1RDT05OIik7CisKKwljb3VudCA9IHRlc3Rfc2VuZChhY3B0X3NrLCBtZXNzYWdlLCBtc2dfY291bnQsIGZsYWcpOworCisJdGVzdF9zaHV0ZG93bihzaywgU0hVVF9XUik7CisKKwkvKnJlY3Zmcm9tICgpIFRFU1Q1OnJlYWRpbmcgb24gYSBzb2NrZXQgdGhhdCByZWNlaXZlZCBTSFVURE9XTiovCisJY291bnQgPSByZWN2ZnJvbShhY3B0X3NrLCBtZXNzYWdlX3JjdiwgbXNnX2NvdW50LCBmbGFnLAorCQkJIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3ZyX2FkZHIsICZsZW4pOworCWlmIChjb3VudCA8IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInJlY3Zmcm9tIG9uIGEgc29ja2V0IHRoYXQgaGFzICIKKwkJCSAicmVjZWl2ZWQgc2h1dGRvd24gY291bnQ6JWQsIGVycm5vOiVkIiwgY291bnQsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAicmVjdmZyb20oKSBvbiBhIHNvY2tldCB0aGF0IGhhcyByZWNlaXZlZCBzaHV0ZG93biAtICIKKwkJICJFT0YiKTsKKworCS8qcmVjdmZyb20gKCkgVEVTVDY6cmVhZGluZyB0aGUgcGVuZGluZyBtZXNzYWdlIG9uIHNvY2tldCB0aGF0IHNlbnQgCisJU0hVVERPV04qLworCWNvdW50ID0gcmVjdmZyb20oc2ssIG1lc3NhZ2VfcmN2LCBtc2dfY291bnQsIGZsYWcsCisJCQkgKHN0cnVjdCBzb2NrYWRkciAqKSZzdnJfYWRkciwgJmxlbik7CisJaWYgKGNvdW50IDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicmVjdmZyb20gb24gYSBzb2NrZXQgd2l0aCBwZW5kaW5nICIKKwkJCSAibWVzc2FnZSB0aGF0IGhhcyBzZW50IHNodXRkb3duIGNvdW50OiVkLCBlcnJubzolZCIsCisJCQkgY291bnQsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAicmVjdmZyb20oKSBvbiBhIHNvY2tldCB3aXRoIHBlbmRpbmcgbWVzc2FnZSB0aGF0IGhhcyAiCisJCSAic2VudCBzaHV0ZG93biAtIFNVQ0NFU1MiKTsKKworCS8qcmVjdmZyb20gKCkgVEVTVDc6IE5vIG1vcmUgbWVzc2FnZSBhbmQgYXNzb2NpYXRpb24gaXMgc2h1dGRvd24sCisJRU5PVENPTk4gRXhwZWN0ZWQgZXJyb3IqLworCWNvdW50ID0gcmVjdmZyb20oc2ssIG1lc3NhZ2VfcmN2LCBtc2dfY291bnQsIGZsYWcsCisJCQkgKHN0cnVjdCBzb2NrYWRkciAqKSZzdnJfYWRkciwgJmxlbik7CisJaWYgKGNvdW50ICE9IC0xIHx8IGVycm5vICE9IEVOT1RDT05OKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJyZWN2ZnJvbSBvbiBhIHNvY2tldCB3aXRoIG5vICIKKwkJCSAicGVuZGluZyBtZXNzYWdlcyBhbmQgaGFzIHNlbnQgc2h1dGRvd24gY291bnQ6JWQsICIKKwkJCSAiZXJybm86JWQiLCBjb3VudCwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJyZWN2ZnJvbSgpIG9uIGEgc29ja2V0IHdpdGggbm8gcGVuZGluZyBtZXNzYWdlcyBhbmQgIgorCQkgIiBoYXMgc2VudCBzaHV0ZG93biAtIEVOT1RDT05OIik7CisKKwljbG9zZShzayk7CisJY2xvc2UobHN0bl9zayk7CisJY2xvc2UoYWNwdF9zayk7CisJcmV0dXJuIDA7CisJCit9CmRpZmYgLS1naXQgYS9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9yZWN2bXNnLmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9yZWN2bXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwNmJiNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX3JlY3Ztc2cuYwpAQCAtMCwwICsxLDIxNiBAQAorLyogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwMyBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA0CisgKgorICogVGhpcyBmaWxlIGhhcyB0ZXN0IGNhc2VzIHRvIHRlc3QgdGhlIHJlY3Ztc2coKSBjYWxsIGZvciAxLTEgc3R5bGUgc29ja2V0cworICoKKyAqIFRFU1QxOiBCYWQgc29ja2V0IGRlc2NyaXB0b3IKKyAqIFRFU1QyOiBJbnZhbGlkIHNvY2tldAorICogVEVTVDM6IEludmFsaWQgaW92ZWMgcG9pbnRlcgorICogVEVTVDQ6IEludmFsaWQgbXNnaGRyIHBvaW50ZXIKKyAqIFRFU1Q1OiBPbiBhIGxpc3RlbmluZyBzb2NrZXQKKyAqIFRFU1Q2OiBSZWFkaW5nIG9uIGEgc29ja2V0IHRoYXQgcmVjZWl2ZWQgU0hVVERPV04KKyAqIFRFU1Q3OiBSZWFkaW5nIHRoZSBwZW5kaW5nIG1lc3NhZ2Ugc29ja2V0IHRoYXQgcmVjZWl2ZWQgU0hVVERPV04KKyAqIFRFU1Q4OiBObyBtb3JlIG1lc3NhZ2UgYW5kIGFzc29jaWF0aW9uIGlzIHNodXRkb3duCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiAgICAgICAgIC8qIGZvciBzb2NrYWRkcl9pbiAqLworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9zY3RwLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPHNjdHB1dGlsLmg+CisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSA4OworaW50IFRTVF9DTlQgPSAwOworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICAgICAgc29ja2xlbl90IGxlbjsKKwlpbnQgc2sscGZfY2xhc3MsbHN0bl9zayxhY3B0X3NrOworCWludCBmbGFnID0gMDsKKwlpbnQgZmQsIGVycl9ubyA9IDA7CisJY2hhciBmaWxlbmFtZVsyMV07CisJc3RydWN0IG1zZ2hkciBpbm1lc3NhZ2U7CisgICAgICAgIGNoYXIgKm1lc3NhZ2UgPSAiaGVsbG8sIHdvcmxkIVxuIjsKKwlzdHJ1Y3QgaW92ZWMgaW92X3JjdjsKKyAgICAgICAgaW50IGNvdW50OworCWNoYXIgKiBidWZmZXJfcmN2OworICAgICAgICBjaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzY3RwX2Ntc2dfZGF0YV90KSldOworCWNoYXIgKm1lc3NhZ2UxID0gImhlbGxvLCB3b3JsZCFcbiI7CisKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGNvbm5fYWRkcixsc3RuX2FkZHIsc3ZyX2FkZHI7CisKKwkvKiBSYXRoZXIgdGhhbiBmZmx1c2goKSB0aHJvdWdob3V0IHRoZSBjb2RlLCBzZXQgc3Rkb3V0IHRvCisgICAgICAgICAqIGJlIHVuYnVmZmVyZWQuCisgICAgICAgICAqLworICAgICAgICBzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsKKyAgICAgICAgc2V0dmJ1ZihzdGRlcnIsIE5VTEwsIF9JT05CRiwgMCk7CisKKyAgICAgICAgcGZfY2xhc3MgPSBQRl9JTkVUOworCisgICAgICAgIHNrID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisgICAgICAgIGxzdG5fc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwljb25uX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGNvbm5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworICAgICAgICBjb25uX2FkZHIuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCisJbHN0bl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBsc3RuX2FkZHIuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgbHN0bl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCS8qQmluZGluZyB0aGUgbGlzdGVuIHNvY2tldCovCisgICAgICAgIHRlc3RfYmluZChsc3RuX3NrLCAoc3RydWN0IHNvY2thZGRyICopICZsc3RuX2FkZHIsIHNpemVvZihsc3RuX2FkZHIpKTsKKworICAgICAgICAvKkxpc3RlbmluZyB0aGUgc29ja2V0Ki8KKyAgICAgICAgdGVzdF9saXN0ZW4obHN0bl9zaywgMTApOworCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCisJdGVzdF9jb25uZWN0KHNrLCAoc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIGxlbik7CisKKwlhY3B0X3NrID0gdGVzdF9hY2NlcHQobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzdnJfYWRkciwgJmxlbik7CisKKwltZW1zZXQoJmlubWVzc2FnZSwgMCwgc2l6ZW9mKGlubWVzc2FnZSkpOworICAgICAgICBidWZmZXJfcmN2ID0gbWFsbG9jKFJFQUxMWV9CSUcpOworCisgICAgICAgIGlvdl9yY3YuaW92X2Jhc2UgPSBidWZmZXJfcmN2OworICAgICAgICBpb3ZfcmN2Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworICAgICAgICBpbm1lc3NhZ2UubXNnX2lvdiA9ICZpb3ZfcmN2OworICAgICAgICBpbm1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisgICAgICAgIGlubWVzc2FnZS5tc2dfY29udHJvbCA9IGluY21zZzsKKyAgICAgICAgaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisKKwkvKnJlY3Ztc2cgKCkgVEVTVDE6IEJhZCBzb2NrZXQgZGVzY3JpcHRvciwgRUJBREYgRXhwZWN0ZWQgZXJyb3IqLworCWNvdW50ID0gcmVjdm1zZygtMSwgJmlubWVzc2FnZSwgZmxhZyk7CisJaWYgKGNvdW50ICE9IC0xIHx8IGVycm5vICE9IEVCQURGKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJyZWN2bXNnIHdpdGggYSBiYWQgc29ja2V0ICIKKwkJCSAiZGVzY3JpcHRvciBjb3VudDolZCwgZXJybm86JWQiLCBjb3VudCwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJyZWN2bXNnKCkgd2l0aCBhIGJhZCBzb2NrZXQgZGVzY3JpcHRvciAtIEVCQURGIik7CisKKwkvKnJlY3Ztc2cgKCkgVEVTVDI6IEludmFsaWQgc29ja2V0ICwgRU5PVFNPQ0sgRXhwZWN0ZWQgZXJyb3IqLworCXN0cmNweShmaWxlbmFtZSwgIi90bXAvc2N0cHRlc3QuWFhYWFhYIik7CisJZmQgPSBta3N0ZW1wKGZpbGVuYW1lKTsKKwlpZiAoZmQgPT0gLTEpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIkZhaWxlZCB0byBta3N0ZW1wICVzOiAlcyIsCisJCQkJZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJY291bnQgPSByZWN2bXNnKGZkLCAmaW5tZXNzYWdlLCBmbGFnKTsKKwlpZiAoY291bnQgPT0gLTEpCisJCWVycl9ubyA9IGVycm5vOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoZmlsZW5hbWUpOworCWlmIChjb3VudCAhPSAtMSB8fCBlcnJfbm8gIT0gRU5PVFNPQ0spCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInJlY3Ztc2cgd2l0aCBpbnZhbGlkIHNvY2tldCAiCisJCQkgImNvdW50OiVkLCBlcnJubzolZCIsIGNvdW50LCBlcnJfbm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJyZWN2bXNnKCkgd2l0aCBpbnZhbGlkIHNvY2tldCAtIEVOT1RTT0NLIik7CisKKwkvKnJlY3Ztc2cgKCkgVEVTVDM6IEludmFsaWQgaW92ZWMgcG9pbnRlciBFRkFVTFQsIEV4cGVjdGVkIGVycm9yKi8KKwlpbm1lc3NhZ2UubXNnX2lvdiA9IChzdHJ1Y3QgaW92ZWMgKiktMTsKKwljb3VudCA9IHJlY3Ztc2coYWNwdF9zaywgJmlubWVzc2FnZSwgZmxhZyk7CisJaWYgKGNvdW50ICE9IC0xIHx8IGVycm5vICE9IEVGQVVMVCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicmVjdm1zZyB3aXRoIGludmFsaWQgaW92ZWMgIgorCQkJICJwb2ludGVyIGNvdW50OiVkLCBlcnJubzolZCIsIGNvdW50LCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInJlY3Ztc2coKSB3aXRoIGludmFsaWQgaW92ZWMgcHRyIC0gRUZBVUxUIik7CisJCisJaW5tZXNzYWdlLm1zZ19pb3YgPSAmaW92X3JjdjsKKworCS8qcmVjdm1zZyAoKSBURVNUNDogSW52YWxpZCBtc2doZHIgcG9pbnRlciBFRkFVTFQsIEV4cGVjdGVkIGVycm9yKi8KKwljb3VudCA9IHJlY3Ztc2coYWNwdF9zaywgKHN0cnVjdCBtc2doZHIgKiktMSwgZmxhZyk7CisJaWYgKGNvdW50ICE9IC0xIHx8IGVycm5vICE9IEVGQVVMVCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicmVjdm1zZyB3aXRoIGludmFsaWQgbXNnaGRyICIKKwkJCSAicG9pbnRlciBjb3VudDolZCwgZXJybm86JWQiLCBjb3VudCwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJyZWN2bXNnKCkgd2l0aCBpbnZhbGlkIG1zZ2hkciBwdHIgLSBFRkFVTFQiKTsKKworCS8qcmVjdm1zZyAoKSBURVNUNTpyZWN2bXNnIG9uIGxpc3RlbmluZyBzb2NrZXQsRU5PVENPTk4gRXhwZWN0ZWQgZXJyb3IqLworCWNvdW50ID0gcmVjdm1zZyhsc3RuX3NrLCAmaW5tZXNzYWdlLCBmbGFnKTsKKwlpZiAoY291bnQgIT0gLTEgfHwgZXJybm8gIT0gRU5PVENPTk4pCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInJlY3Ztc2cgb24gbGlzdGVuaW5nIHNvY2tldCAiCisJCQkgImNvdW50OiVkLCBlcnJubzolZCIsIGNvdW50LCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInJlY3Ztc2coKSBvbiBsaXN0ZW5pbmcgc29ja2V0IC0gRU5PVENPTk4iKTsKKworCWNvdW50ID0gdGVzdF9zZW5kKGFjcHRfc2ssIG1lc3NhZ2UxLCBzdHJsZW4obWVzc2FnZSksIDApOworCisJdGVzdF9zaHV0ZG93bihzaywgU0hVVF9XUik7CisKKwlmbGFnID0gTVNHX05PU0lHTkFMOworCS8qcmVjdm1zZyAoKSBURVNUNjpyZWFkaW5nIG9uIGEgc29ja2V0IHRoYXQgcmVjZWl2ZWQgU0hVVERPV04qLworCWNvdW50ID0gcmVjdm1zZyhhY3B0X3NrLCAmaW5tZXNzYWdlLCBmbGFnKTsKKwlpZiAoY291bnQgPCAwKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJyZWN2bXNnIG9uIGEgc29ja2V0IHRoYXQgaGFzICIKKwkJCSAicmVjZWl2ZWQgc2h1dGRvd24gY291bnQ6JWQsIGVycm5vOiVkIiwgY291bnQsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAicmVjdm1zZygpIG9uIGEgc29ja2V0IHRoYXQgaGFzIHJlY2VpdmVkIHNodXRkb3duIC0gIgorCQkgIkVPRiIpOworCisJLypyZWN2bXNnICgpIFRFU1Q3OnJlYWRpbmcgdGhlIHBlbmRpbmcgbWVzc2FnZSBzb2NrZXQgdGhhdCBzZW50IAorCVNIVVRET1dOKi8KKwljb3VudCA9IHJlY3Ztc2coc2ssICZpbm1lc3NhZ2UsIGZsYWcpOworCWlmIChjb3VudCA8IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInJlY3Ztc2cgb24gYSBzb2NrZXQgd2l0aCBwZW5kaW5nICIKKwkJCSAibWVzc2FnZSB0aGF0IGhhcyBzZW50IHNodXRkb3duIGNvdW50OiVkLCBlcnJubzolZCIsCisJCQkgY291bnQsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAicmVjdm1zZygpIG9uIGEgc29ja2V0IHdpdGggcGVuZGluZyBtZXNzYWdlIHRoYXQgaGFzICIKKwkJICJzZW50IHNodXRkb3duIC0gU1VDQ0VTUyIpOworCisJLypyZWN2bXNnICgpIFRFU1Q4OiBObyBtb3JlIG1lc3NhZ2UgYW5kIGFzc29jaWF0aW9uIGlzIHNodXRkb3duLAorCUVOT1RDT05OIEV4cGVjdGVkIGVycm9yKi8KKwljb3VudCA9IHJlY3Ztc2coc2ssICZpbm1lc3NhZ2UsIGZsYWcpOworCWlmIChjb3VudCAhPSAtMSB8fCBlcnJubyAhPSBFTk9UQ09OTikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicmVjdm1zZyBvbiBhIHNvY2tldCB3aXRoIG5vICIKKwkJCSAicGVuZGluZyBtZXNzYWdlcyBhbmQgaGFzIHNlbnQgc2h1dGRvd24gY291bnQ6JWQsICIKKwkJCSAiZXJybm86JWQiLCBjb3VudCwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJyZWN2bXNnKCkgb24gYSBzb2NrZXQgd2l0aCBubyBwZW5kaW5nIG1lc3NhZ2VzIGFuZCAiCisJCSAiIGhhcyBzZW50IHNodXRkb3duIC0gRU5PVENPTk4iKTsKKworCWNsb3NlKHNrKTsKKwljbG9zZShsc3RuX3NrKTsKKwljbG9zZShhY3B0X3NrKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX3J0b2luZm8uYyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX3J0b2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjUxZGYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfcnRvaW5mby5jCkBAIC0wLDAgKzEsMTE1IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAzIEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQKKyAqCisgKiBUaGlzIGZpbGUgaGFzIHRlc3QgY2FzZXMgdG8gdGVzdCB0aGUgZ2V0c29ja29wdCAoKSBhbmQgc2VjdHNvY2tvcHQgKCkgd2l0aAorICogU0NUUF9SVE9JTkZPIG9wdGlvbiBvbiAxLTEgc3R5bGUgc29ja2V0CisgKgorICogVGhpcyBwcm9ncmFtIGZpcnN0IGdldHMgdGhlIGRlZmF1bHQgdmFsdWVzIHVzaW5nIGdldHNvY2tvcHQoKS4gSXQgYWxzbyBzZXRzCisgKiB0aGUgdmFsdWUgdXNpbmcgc2V0c29ja29wdCgpIGFuZCBnZXRzIHRoZSBzZXQgdmFsdWUgdXNpbmcgZ2V0c29ja29wdCgpLgorICogQSBjb21wYXJpc29uIGJldHdlZW4gc2V0IHZhbHVlcyBhbmQgZ2V0IHZhbHVlcyBhcmUgcGVyZm9ybWVkLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+ICAgICAgICAgLyogZm9yIHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8bGludXgvaW42Lmg+ICAgICAgICAgLyogZm9yIHNvY2thZGRyX2luNiAqLworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHNjdHB1dGlsLmg+CisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSAzOworaW50IFRTVF9DTlQgPSAwOworCitpbnQgCittYWluKHZvaWQpIAoreworCQorCWludCBzZCwgcmV0OworCXNvY2tsZW5fdCBsZW47CisJc3RydWN0IHNjdHBfcnRvaW5mbyBzcnRvaW5mbzsgLypzZXR0aW5nIHRoZSB2YXJpYWJsZXMqLworCXN0cnVjdCBzY3RwX3J0b2luZm8gZ3J0b2luZm87IC8qR2V0dGluZyB0aGUgdmFyaWFibGVzKi8KKworCXNkID0gdGVzdF9zb2NrZXQgKFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBzY3RwX3J0b2luZm8pOworCQorCS8qVEVTVDEgR2V0dGluZyB0aGUgZGVmYXVsdCB2YWx1ZXMgdXNpbmcgZ2V0c29ja29wdCgpKi8KKwlyZXQgPSBnZXRzb2Nrb3B0KHNkLCBJUFBST1RPX1NDVFAsIFNDVFBfUlRPSU5GTywgJmdydG9pbmZvLCAmbGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdCBTQ1RQX1JUT0lORk8gIgorCQkJICJyZXQ6JWQsIGVycm5vOiVkIiwgcmV0LCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tvcHQoKSBTQ1RQX1JUT0lORk8gLSBTVUNDRVNTIik7CisKKwkvKkFzc2lnbmluZyB0aGUgdmFsdWVzIHRvIFJUTyBpbml0aWFsIGFuZCBtYXggYW5kIG1pbiBib3VuZHMqLworCXNydG9pbmZvLnNydG9faW5pdGlhbD02MDsKKwlzcnRvaW5mby5zcnRvX21heD0xMDA7CisJc3J0b2luZm8uc3J0b19taW49NDA7CisJc3J0b2luZm8uc3J0b19hc3NvY19pZCA9IDA7CisKKwkvKlRFU1QyIFNldHRpbmcgdGhlIHZhbHVlcyB1c2luZyBzZXRzb2Nrb3B0KCkqLworCXJldCA9IHNldHNvY2tvcHQoc2QsIElQUFJPVE9fU0NUUCwgU0NUUF9SVE9JTkZPLCAmc3J0b2luZm8sIAorCQlzaXplb2Yoc3RydWN0IHNjdHBfcnRvaW5mbykpOworCWlmIChyZXQgPCAwKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0IFNDVFBfUlRPSU5GTyAiCisJCQkgInJldDolZCwgZXJybm86JWQiLCByZXQsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2V0c29ja29wdCgpIFNDVFBfUlRPSU5GTyAtIFNVQ0NFU1MiKTsKKworCS8qR2V0dGluZyB0aGUgdmFsdWVzIHdoaWNoIGFyZSBzZXQgdXNpbmcgc2V0c29ja29wdCgpKi8KKwlyZXQgPSBnZXRzb2Nrb3B0KHNkLCBJUFBST1RPX1NDVFAsIFNDVFBfUlRPSU5GTywgJmdydG9pbmZvLCAmbGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdCBTQ1RQX1JUT0lORk8gIgorCQkJICJyZXQ6JWQsIGVycm5vOiVkIiwgcmV0LCBlcnJubyk7CisKKwkvKiBURVNUMyBDb21wYXJlIHRoZSBnZXQgdmFsdWVzIHdpdGggdGhlIHNldCB2YWx1ZXMuICovIAorCWlmIChzcnRvaW5mby5zcnRvX2luaXRpYWwgIT0gZ3J0b2luZm8uc3J0b19pbml0aWFsICYmCisgICAgICAgICAgICBzcnRvaW5mby5zcnRvX21heCAhPSBncnRvaW5mby5zcnRvX21heCAmJgorICAgICAgICAgICAgc3J0b2luZm8uc3J0b19taW4gIT0gZ3J0b2luZm8uc3J0b19taW4pCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNldHNvY2tvcHQvZ2V0c29ja29wdCBTQ1RQX1JUT0lORk8gIgorCQkJICJjb21wYXJlIGZhaWxlZCIpOworCisJdHN0X3Jlc20oVFBBU1MsICJzZXRzb2Nrb3B0KCkvZ2V0c29ja29wdCBTQ1RQX1JUT0lORk8gY29tcGFyZSAtICIKKwkJICJTVUNDRVNTIik7CisKKwljbG9zZShzZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX3NlbmQuYyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX3NlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDk1MTZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfc2VuZC5jCkBAIC0wLDAgKzEsMjQxIEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAzIEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQKKyAqCisgKiBUaGlzIGZpbGUgaGFzIHRlc3QgY2FzZXMgdG8gdGVzdCB0aGUgc2VuZCgpIGNhbGwgZm9yIDEtMSBzdHlsZSBzb2NrZXRzCisgKgorICogVEVTVDE6IEJhZCBzb2NrZXQgZGVzY3JpcHRvcgorICogVEVTVDI6IEludmFsaWQgc29ja2V0CisgKiBURVNUMzogT24gYSBsaXN0ZW5pbmcgc29ja2V0CisgKiBURVNUNDogT24gYSBjbG9zZWQgYXNzb2NpYXRpb24KKyAqIFRFU1Q1OiBJbnZhbGlkIG1lc3NhZ2UgYWRkcmVzcworICogVEVTVDY6IHNlbmQgZnJvbSBjbGllbnQgdG8gc2VydmVyIAorICogVEVTVDc6IHNlbmQgZnJvbSBzZXJ2ZXIgdG8gY2xpZW50IAorICogVEVTVDg6IHNlbmRpbmcgcGFydGlhbCBkYXRhIGZyb20gYSBidWZmZXIKKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+ICAgICAgICAgLyogZm9yIHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8c2N0cHV0aWwuaD4KKworY2hhciAqVENJRCA9IF9fRklMRV9fOworaW50IFRTVF9UT1RBTCA9IDg7CitpbnQgVFNUX0NOVCA9IDA7CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgICAgICBzb2NrbGVuX3QgbGVuLGxlbl9zbmQ7CisJaW50IG1zZ19jb3VudDsKKwlpbnQgc2ssc2sxLHBmX2NsYXNzLGxzdG5fc2ssYWNwdF9zayxhY3B0MV9zaywgZmxhZywgY291bnQ7CisgICAgICAgIGNoYXIgKm1lc3NhZ2UgPSAiaGVsbG8sIHdvcmxkIVxuIjsKKyAgICAgICAgY2hhciAqbWVzc2FnZV9yY3Y7CisJaW50IGZkLCBlcnJfbm8gPSAwOworCWNoYXIgZmlsZW5hbWVbMjFdOworCisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBjb25uX2FkZHIsbHN0bl9hZGRyLHN2cl9hZGRyOworCisJLyogUmF0aGVyIHRoYW4gZmZsdXNoKCkgdGhyb3VnaG91dCB0aGUgY29kZSwgc2V0IHN0ZG91dCB0bworICAgICAgICAgKiBiZSB1bmJ1ZmZlcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgMCk7CisgICAgICAgIHNldHZidWYoc3RkZXJyLCBOVUxMLCBfSU9OQkYsIDApOworCisgICAgICAgIHBmX2NsYXNzID0gUEZfSU5FVDsKKworICAgICAgICBzayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKworICAgICAgICBzazEgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKyAgICAgICAgbHN0bl9zayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKworCWNvbm5fYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgY29ubl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisgICAgICAgIGNvbm5fYWRkci5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKwlsc3RuX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGxzdG5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworICAgICAgICBsc3RuX2FkZHIuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCisJLypCaW5kaW5nIHRoZSBsaXN0ZW4gc29ja2V0Ki8KKyAgICAgICAgdGVzdF9iaW5kKGxzdG5fc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmxzdG5fYWRkciwgc2l6ZW9mKGxzdG5fYWRkcikpOworCisgICAgICAgIC8qTGlzdGVuaW5nIHRoZSBzb2NrZXQqLworICAgICAgICB0ZXN0X2xpc3Rlbihsc3RuX3NrLCAxMCk7CisKKwlsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwkKKwl0ZXN0X2Nvbm5lY3Qoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmNvbm5fYWRkciwgbGVuKTsKKworCWFjcHRfc2sgPSB0ZXN0X2FjY2VwdChsc3RuX3NrLCAoc3RydWN0IHNvY2thZGRyICopJnN2cl9hZGRyLCAmbGVuKTsKKworCWxlbl9zbmQgPSAoc3RybGVuKG1lc3NhZ2UpICsgMSk7CisKKwlmbGFnID0gTVNHX05PU0lHTkFMOworCS8qc2VuZCAoKSBURVNUMTogQmFkIHNvY2tldCBkZXNjcmlwdG9yLCBFQkFERiBFeHBlY3RlZCBlcnJvciovCisJY291bnQgPSBzZW5kKC0xLCBtZXNzYWdlLCBsZW5fc25kLCBmbGFnKTsKKwlpZiAoY291bnQgIT0gLTEgfHwgZXJybm8gIT0gRUJBREYpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmQgd2l0aCBhIGJhZCBzb2NrZXQgIgorCQkJICJkZXNjcmlwdG9yIGNvdW50OiVkLCBlcnJubzolZCIsIGNvdW50LCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNlbmQoKSB3aXRoIGEgYmFkIHNvY2tldCBkZXNjcmlwdG9yIC0gRUJBREYiKTsKKwkKKwkvKnNlbmQgKCkgVEVTVDI6IEludmFsaWQgc29ja2V0LCBFTk9UU09DSyBFeHBlY3RlZCBlcnJvciovCisJc3RyY3B5KGZpbGVuYW1lLCAiL3RtcC9zY3RwdGVzdC5YWFhYWFgiKTsKKwlmZCA9IG1rc3RlbXAoZmlsZW5hbWUpOworCWlmIChmZCA9PSAtMSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiRmFpbGVkIHRvIG1rc3RlbXAgJXM6ICVzIiwKKwkJCQlmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwljb3VudCA9IHNlbmQoZmQsIG1lc3NhZ2UsIGxlbl9zbmQsIGZsYWcpOworCWlmIChjb3VudCA9PSAtMSkKKwkJZXJyX25vID0gZXJybm87CisJY2xvc2UoZmQpOworCXVubGluayhmaWxlbmFtZSk7CisJaWYgKGNvdW50ICE9IC0xIHx8IGVycl9ubyAhPSBFTk9UU09DSykKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2VuZCB3aXRoIGludmFsaWQgc29ja2V0ICIKKwkJCSAiY291bnQ6JWQsIGVycm5vOiVkIiwgY291bnQsIGVycl9ubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNlbmQoKSB3aXRoIGludmFsaWQgc29ja2V0IC0gRU5PVFNPQ0siKTsKKworCS8qc2VuZCAoKSBURVNUMzogc2VuZCBvbiBsaXN0ZW5pbmcgc29ja2V0LCBFUElQRSBFeHBlY3RlZCBlcnJvciovCisJY291bnQgPSBzZW5kKGxzdG5fc2ssIG1lc3NhZ2UsIGxlbl9zbmQsIGZsYWcpOworCWlmIChjb3VudCAhPSAtMSB8fCBlcnJubyAhPSBFUElQRSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2VuZCBvbiBhIGxpc3RlbmluZyBzb2NrZXQgIgorCQkJICJjb3VudDolZCwgZXJybm86JWQiLCBjb3VudCwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kKCkgb24gYSBsaXN0ZW5pbmcgc29ja2V0IC0gRVBJUEUiKTsKKyNpZiAwCisJLypzZW5kICgpIFRFU1Q0OiBJbnZhbGlkIG1lc3NhZ2UgYWRkcmVzcywgRUZBVUxUIEV4cGVjdGVkIGVycm9yKi8KKyAgICAgICAvKiBGSVhNRSB0aGlzIHRlc3Qgc2hvdWxkIHBhc3MuIERvbid0IGNhdGNoIHdoeS4uLiAgKi8KKwljb3VudCA9IHNlbmQoc2ssIChjaGFyICopMHgxLCBsZW5fc25kLCBmbGFnKTsKKwlpZiAoY291bnQgIT0gLTEgfHwgZXJybm8gIT0gRUZBVUxUKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZW5kIHdpdGggaW52YWxpZCBtZXNzYWdlICIKKwkJCSAicG9pbnRlciBjb3VudDolZCwgZXJybm86JWQiLCBjb3VudCwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kKCkgd2l0aCBpbnZhbGlkIG1lc3NhZ2UgcHRyIC0gRUZBVUxUIik7CisjZW5kaWYKKworCXRlc3RfY29ubmVjdChzazEsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmxzdG5fYWRkciwgbGVuKTsKKwkJIAorCWNvdW50ID0gdGVzdF9zZW5kKHNrMSwgbWVzc2FnZSwgbGVuX3NuZCwgZmxhZyk7CisKKwljbG9zZShzazEpOworCisJYWNwdDFfc2sgPSB0ZXN0X2FjY2VwdChsc3RuX3NrLCAoc3RydWN0IHNvY2thZGRyICopJmNvbm5fYWRkciwgJmxlbik7CisKKwkvKnNlbmQgKCkgVEVTVDU6IHNlbmQgb24gY2xvc2VkIGFzc29jaWF0aW9uLCBFUElQRSBFeHBlY3RlZCBlcnJvciovCisJY291bnQgPSBzZW5kKGFjcHQxX3NrLCBtZXNzYWdlLCBsZW5fc25kLCBmbGFnKTsKKwlpZiAoY291bnQgIT0gLTEgfHwgZXJybm8gIT0gRVBJUEUpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmQgb24gYSBjbG9zZWQgYXNzb2NpYXRpb24gIgorCQkJICJjb3VudDolZCwgZXJybm86JWQiLCBjb3VudCwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kKCkgb24gYSBjbG9zZWQgYXNzb2NpYXRpb24gLSBFUElQRSIpOworCisJY2xvc2UoYWNwdDFfc2spOworCWNsb3NlKHNrKTsKKwljbG9zZShsc3RuX3NrKTsKKwljbG9zZShhY3B0X3NrKTsKKworICAgICAgICBzayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKworICAgICAgICBsc3RuX3NrID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJbWVzc2FnZV9yY3YgPSBtYWxsb2MoNTEyKTsKKworCS8qQmluZGluZyB0aGUgbGlzdGVuIHNvY2tldCovCisgICAgICAgIHRlc3RfYmluZChsc3RuX3NrLCAoc3RydWN0IHNvY2thZGRyICopICZsc3RuX2FkZHIsIHNpemVvZihsc3RuX2FkZHIpKTsKKworICAgICAgICAvKkxpc3RlbmluZyB0aGUgc29ja2V0Ki8KKyAgICAgICAgdGVzdF9saXN0ZW4obHN0bl9zaywgMTApOworCisJY29ubl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBjb25uX2FkZHIuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgY29ubl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCisJdGVzdF9jb25uZWN0KHNrLCAoc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIGxlbik7CisKKwlhY3B0X3NrID0gdGVzdF9hY2NlcHQobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzdnJfYWRkciwgJmxlbik7CisJCisJbXNnX2NvdW50ID0gc3RybGVuKG1lc3NhZ2UpICsgMTsKKworCS8qc2VuZCgpIFRFU1Q2OiBTZW5kaW5nIGRhdGEgZnJvbSBjbGllbnQgc29ja2V0IHRvIHNlcnZlciBzb2NrZXQqLworCWNvdW50ID0gc2VuZChzaywgbWVzc2FnZSwgbXNnX2NvdW50LCBmbGFnKTsKKwlpZiAoY291bnQgIT0gbXNnX2NvdW50KQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZW5kIGZyb20gY2xpZW50IHRvIHNlcnZlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50OiVkLCBlcnJubzolZCIsIGNvdW50LCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNlbmQoKSBmcm9tIGNsaWVudCB0byBzZXJ2ZXIgLSBTVUNDRVNTIik7CisKKwl0ZXN0X3JlY3YoYWNwdF9zaywgbWVzc2FnZV9yY3YsIG1zZ19jb3VudCwgZmxhZyk7CisKKwlzdHJuY3B5KG1lc3NhZ2VfcmN2LCJcMCIsNTEyKTsKKworCS8qc2VuZCgpIFRFU1Q3OiBTZW5kaW5nIGRhdGEgZnJvbSBhY2NlcHQgc29ja2V0IHRvIGNsaWVudCBzb2NrZXQqLworCWNvdW50ID0gc2VuZChhY3B0X3NrLCBtZXNzYWdlLCBtc2dfY291bnQsIGZsYWcpOworCWlmIChjb3VudCAhPSBtc2dfY291bnQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmQgZnJvbSBhY2NlcHQgc29ja2V0IHRvIGNsaWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50OiVkLCBlcnJubzolZCIsIGNvdW50LCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNlbmQoKSBmcm9tIGFjY2VwdCBzb2NrZXQgdG8gY2xpZW50IC0gU1VDQ0VTUyIpOworCisJdGVzdF9yZWN2KHNrLCBtZXNzYWdlX3JjdiwgbXNnX2NvdW50LCBmbGFnKTsKKworCS8qc2VuZCgpIFRFU1Q4OiBTZW5kaW5nIGxlc3MgbnVtYmVyIG9mIGRhdGEgZnJvbSB0aGUgYnVmZmVyKi8KKwkvKlNlbmRpbmcgb25seSA1IGJ5dGVzIHNvIHRoYXQgb25seSBoZWxsbyBpcyByZWNlaXZlZCovCisJdGVzdF9zZW5kKHNrLCBtZXNzYWdlLCA1ICwgZmxhZyk7CisJdGVzdF9yZWN2KGFjcHRfc2ssIG1lc3NhZ2VfcmN2LCA1LCBmbGFnKTsKKwkKKwl0c3RfcmVzbShUUEFTUywgInNlbmQoKSBwYXJ0aWFsIGRhdGEgZnJvbSBhIGJ1ZmZlciAtIFNVQ0NFU1MiKTsKKworCS8qIFRFU1Q5OiBzY3RwX3NlbmQgd2l0aCBubyBzaW5mbyAqLworCXRlc3Rfc2N0cF9zZW5kKHNrLCBtZXNzYWdlLCBzdHJsZW4obWVzc2FnZSkgKyAxICwgTlVMTCwgZmxhZyk7CisJdGVzdF9yZWN2KGFjcHRfc2ssIG1lc3NhZ2VfcmN2LCBzdHJsZW4obWVzc2FnZSkgKyAxLCBmbGFnKTsKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfc2VuZCgpIHdpdGggbm8gc2luZm8gLSBTVUNDRVNTIik7CisKKwljbG9zZShzazEpOworCWNsb3NlKGxzdG5fc2spOworCWNsb3NlKGFjcHRfc2spOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9zZW5kbXNnLmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9zZW5kbXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjOTIwZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX3NlbmRtc2cuYwpAQCAtMCwwICsxLDM3NyBAQAorLyogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwMyBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA0CisgKgorICogVGhpcyBmaWxlIGhhcyB0ZXN0IGNhc2VzIHRvIHRlc3QgdGhlIHNlbmRtc2coKSBjYWxsIGZvciAxLTEgc3R5bGUgc29ja2V0cworICoKKyAqIFRFU1QxOiBCYWQgc29ja2V0IGRlc2NyaXB0b3IKKyAqIFRFU1QyOiBJbnZhbGlkIHNvY2tldAorICogVEVTVDM6IE9uIGEgbGlzdGVuaW5nIHNvY2tldAorICogVEVTVDQ6IEludmFsaWQgaW92ZWMgcG9pbnRlcgorICogVEVTVDU6IEludmFsaWQgaW92ZWMgbGVuZ3RoCisgKiBURVNUNjogSW52YWxpZCBtc2doZHIgcG9pbnRlcgorICogVEVTVDc6IEludmFsaWQgc2luZm8gZmxhZ3MKKyAqIFRFU1Q4OiBTQ1RQX0VPRiBmbGFnIHNldAorICogVEVTVDk6IFNDVFBfQUJPUlQgZmxhZyBzZXQKKyAqIFRFU1QxMDogT24gYSBjbG9zZWQgYXNzb2NpYXRpb24KKyAqCisgKiBURVNUMTE6IFNlbmRpbmcgZGF0YSBmcm9tIHNlcnZlciBzb2NrZXQgdG8gY2xpZW50IHNvY2tldAorICogVEVTVDEyOiBTZW5kaW5nIGRhdGEgZnJvbSBjbGllbnQgc29ja2V0IHRvIHNlcnZlciBzb2NrZXQKKyAqIFRFU1QxMzogU2VuZGluZyBkYXRhIGZyb20gdW5jb25uZWN0ZWQgY2xpZW50IHRvIHNlcnZlciAKKyAqIFRFU1QxNDogU2VuZGluZyBhIG1lc3NhZ2Ugb24gU0hVVF9SRCBzb2NrZXQKKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+ICAgICAgICAgLyogZm9yIHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8c2N0cHV0aWwuaD4KKworY2hhciAqVENJRCA9IF9fRklMRV9fOworaW50IFRTVF9UT1RBTCA9IDE0OworaW50IFRTVF9DTlQgPSAwOworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICAgICAgc29ja2xlbl90IGxlbjsKKwlpbnQgbXNnX2NvdW50OworCWludCBzayxzazEscGZfY2xhc3MsbHN0bl9zayxhY3B0X3NrLGFjcHQxX3NrLCBmbGFnOworCXN0cnVjdCBtc2doZHIgb3V0bWVzc2FnZTsKKyAgICAgICAgY2hhciAqbWVzc2FnZSA9ICJoZWxsbywgd29ybGQhXG4iOworCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvOworICAgICAgICBpbnQgY291bnQ7CisJY2hhciBvdXRjbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKV07CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisgICAgICAgIHN0cnVjdCBpb3ZlYyBvdXRfaW92OworCXN0cnVjdCBtc2doZHIgaW5tZXNzYWdlOworCWNoYXIgKiBidWZmZXJfcmN2OworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gY29ubl9hZGRyLGxzdG5fYWRkcixzdnJfYWRkcjsKKyAgICAgICAgc3RydWN0IGlvdmVjIGlvdl9yY3Y7CisJY2hhciBpbmNtc2dbQ01TR19TUEFDRShzaXplb2Yoc2N0cF9jbXNnX2RhdGFfdCkpXTsKKwlpbnQgZmQsIGVycl9ubyA9IDA7CisJY2hhciBmaWxlbmFtZVsyMV07CisKKwkvKiBSYXRoZXIgdGhhbiBmZmx1c2goKSB0aHJvdWdob3V0IHRoZSBjb2RlLCBzZXQgc3Rkb3V0IHRvCisgICAgICAgICAqIGJlIHVuYnVmZmVyZWQuCisgICAgICAgICAqLworICAgICAgICBzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsKKyAgICAgICAgc2V0dmJ1ZihzdGRlcnIsIE5VTEwsIF9JT05CRiwgMCk7CisKKyAgICAgICAgcGZfY2xhc3MgPSBQRl9JTkVUOworCisgICAgICAgIHNrID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisgICAgICAgIHNrMSA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKworICAgICAgICBsc3RuX3NrID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJY29ubl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBjb25uX2FkZHIuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgY29ubl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCWxzdG5fYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgbHN0bl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisgICAgICAgIGxzdG5fYWRkci5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKwkvKkJpbmRpbmcgdGhlIGxpc3RlbiBzb2NrZXQqLworICAgICAgICB0ZXN0X2JpbmQobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmbHN0bl9hZGRyLCBzaXplb2YobHN0bl9hZGRyKSk7CisKKyAgICAgICAgLypMaXN0ZW5pbmcgdGhlIHNvY2tldCovCisgICAgICAgIHRlc3RfbGlzdGVuKGxzdG5fc2ssIDEwKTsKKworCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQorCXRlc3RfY29ubmVjdChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmY29ubl9hZGRyLCBsZW4pOworCisJYWNwdF9zayA9IHRlc3RfYWNjZXB0KGxzdG5fc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3ZyX2FkZHIsICZsZW4pOworCisJbWVtc2V0KCZvdXRtZXNzYWdlLCAwLCBzaXplb2Yob3V0bWVzc2FnZSkpOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19uYW1lID0gJmNvbm5fYWRkcjsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfbmFtZWxlbiA9IHNpemVvZihjb25uX2FkZHIpOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YgPSAmb3V0X2lvdjsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92bGVuID0gMTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfY29udHJvbCA9IG91dGNtc2c7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2Yob3V0Y21zZyk7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2ZsYWdzID0gMDsKKworCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZvdXRtZXNzYWdlKTsKKyAgICAgICAgY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKKyAgICAgICAgY21zZy0+Y21zZ190eXBlID0gU0NUUF9TTkRSQ1Y7CisgICAgICAgIGNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworCXNpbmZvID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7CisgICAgICAgIG1lbXNldChzaW5mbywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9iYXNlID0gbWVzc2FnZTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfbGVuID0gc3RybGVuKG1lc3NhZ2UpICsgMTsKKworCWZsYWcgPSBNU0dfTk9TSUdOQUw7CisJLypzZW5kbXNnICgpIFRFU1QxOiBCYWQgc29ja2V0IGRlc2NyaXB0b3IsIEVCQURGIEV4cGVjdGVkIGVycm9yKi8KKwljb3VudCA9IHNlbmRtc2coLTEsICZvdXRtZXNzYWdlLCBmbGFnKTsKKwlpZiAoY291bnQgIT0gLTEgfHwgZXJybm8gIT0gRUJBREYpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmRtc2cgd2l0aCBhIGJhZCBzb2NrZXQgIgorCQkJICJkZXNjcmlwdG9yIGNvdW50OiVkLCBlcnJubzolZCIsIGNvdW50LCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNlbmRtc2coKSB3aXRoIGEgYmFkIHNvY2tldCBkZXNjcmlwdG9yIC0gRUJBREYiKTsKKwkKKwkvKnNlbmRtc2cgKCkgVEVTVDI6IEludmFsaWQgc29ja2V0LCBFTk9UU09DSyBFeHBlY3RlZCBlcnJvciovCisJc3RyY3B5KGZpbGVuYW1lLCAiL3RtcC9zY3RwdGVzdC5YWFhYWFgiKTsKKwlmZCA9IG1rc3RlbXAoZmlsZW5hbWUpOworCWlmIChmZCA9PSAtMSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiRmFpbGVkIHRvIG1rc3RlbXAgJXM6ICVzIiwKKwkJCQlmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwljb3VudCA9IHNlbmRtc2coZmQsICZvdXRtZXNzYWdlLCBmbGFnKTsKKwlpZiAoY291bnQgPT0gLTEpCisJCWVycl9ubyA9IGVycm5vOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoZmlsZW5hbWUpOworCWlmIChjb3VudCAhPSAtMSB8fCBlcnJfbm8gIT0gRU5PVFNPQ0spCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmRtc2cgd2l0aCBpbnZhbGlkIHNvY2tldCAiCisJCQkgImNvdW50OiVkLCBlcnJubzolZCIsIGNvdW50LCBlcnJfbm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kbXNnKCkgd2l0aCBpbnZhbGlkIHNvY2tldCAtIEVOT1RTT0NLIik7CisKKwkvKnNlbmRtc2cgKCkgVEVTVDM6IHNlbmRtc2cgb24gbGlzdGVuaW5nIHNvY2tldCwgRVBJUEUgRXhwZWN0ZWQgZXJyb3IqLworCWNvdW50ID0gc2VuZG1zZyhsc3RuX3NrLCAmb3V0bWVzc2FnZSwgZmxhZyk7CisJaWYgKGNvdW50ICE9IC0xIHx8IGVycm5vICE9IEVQSVBFKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZW5kbXNnIG9uIGEgbGlzdGVuaW5nIHNvY2tldCAiCisJCQkgImNvdW50OiVkLCBlcnJubzolZCIsIGNvdW50LCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNlbmRtc2coKSBvbiBhIGxpc3RlbmluZyBzb2NrZXQgLSBFUElQRSIpOworCisJLypzZW5kbXNnICgpIFRFU1Q0OiBJbnZhbGlkIGlvdmVjIHBvaW50ZXIgRUZBVUxULCBFeHBlY3RlZCBlcnJvciovCisJb3V0bWVzc2FnZS5tc2dfaW92ID0gKHN0cnVjdCBpb3ZlYyAqKS0xOworCWNvdW50ID0gc2VuZG1zZyhzaywgJm91dG1lc3NhZ2UsIGZsYWcpOworCWlmIChjb3VudCAhPSAtMSB8fCBlcnJubyAhPSBFRkFVTFQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmRtc2cgd2l0aCBpbnZhbGlkIGlvdmVjICIKKwkJCSAicG9pbnRlciBjb3VudDolZCwgZXJybm86JWQiLCBjb3VudCwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kbXNnKCkgd2l0aCBpbnZhbGlkIGlvdmVjIHB0ciAtIEVGQVVMVCIpOworCQorCW91dG1lc3NhZ2UubXNnX2lvdiA9ICZvdXRfaW92OworCisJLypzZW5kbXNnICgpIFRFU1Q1OiBJbnZhbGlkIGlvdmVjIGNvdW50IEVJTlZBTCwgRXhwZWN0ZWQgZXJyb3IqLworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3ZsZW4gPSAwOworCWNvdW50ID0gc2VuZG1zZyhzaywgJm91dG1lc3NhZ2UsIGZsYWcpOworCWlmIChjb3VudCAhPSAtMSB8fCBlcnJubyAhPSBFSU5WQUwpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmRtc2cgd2l0aCBpbnZhbGlkIGlvdmVjICIKKwkJCSAibGVuZ3RoIGNvdW50OiVkLCBlcnJubzolZCIsIGNvdW50LCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNlbmRtc2coKSB3aXRoIGludmFsaWQgaW92ZWMgbGVuZ3RoIC0gRUlOVkFMIik7CisKKwlvdXRtZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworCQorCS8qc2VuZG1zZyAoKSBURVNUNjogSW52YWxpZCBtc2doZHIgcG9pbnRlciBFRkFVTFQsIEV4cGVjdGVkIGVycm9yKi8KKwljb3VudCA9IHNlbmRtc2coc2ssIChzdHJ1Y3QgbXNnaGRyICopLTEsIGZsYWcpOworCWlmIChjb3VudCAhPSAtMSB8fCBlcnJubyAhPSBFRkFVTFQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmRtc2cgd2l0aCBpbnZhbGlkIG1zZ2hkciAiCisJCQkgInBvaW50ZXIgY291bnQ6JWQsIGVycm5vOiVkIiwgY291bnQsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2VuZG1zZygpIHdpdGggaW52YWxpZCBtc2doZHIgcHRyIC0gRUZBVUxUIik7CisKKwkvKnNlbmRtc2cgKCkgVEVTVDc6IEludmFsaWQgc2luZm8gZmxhZyBFSU5WQUwsIEV4cGVjdGVkIGVycm9yKi8KKwlzaW5mby0+c2luZm9fZmxhZ3MgPSA5OTk7CisJY291bnQgPSBzZW5kbXNnKHNrLCAmb3V0bWVzc2FnZSwgLTEpOworCWlmIChjb3VudCAhPSAtMSB8fCBlcnJubyAhPSBFSU5WQUwpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmRtc2cgd2l0aCBpbnZhbGlkIHNpbmZvICIKKwkJCSAiZmxhZ3MgY291bnQ6JWQsIGVycm5vOiVkIiwgY291bnQsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2VuZG1zZygpIHdpdGggaW52YWxpZCBzaW5mbyBmbGFncyAtIEVJTlZBTCIpOworCisJLypzZW5kbXNnICgpIFRFU1Q4OiBTQ1RQX0VPRiBmbGFnIEVJTlZBTCwgRXhwZWN0ZWQgZXJyb3IqLworCXNpbmZvLT5zaW5mb19mbGFncyA9IFNDVFBfRU9GOworCWNvdW50ID0gc2VuZG1zZyhzaywgJm91dG1lc3NhZ2UsIGZsYWcpOworCWlmIChjb3VudCAhPSAtMSB8fCBlcnJubyAhPSBFSU5WQUwpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmRtc2cgd2l0aCBTQ1RQX0VPRiBmbGFnICIKKwkJCSAiY291bnQ6JWQsIGVycm5vOiVkIiwgY291bnQsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2VuZG1zZygpIHdpdGggU0NUUF9FT0YgZmxhZyAtIEVJTlZBTCIpOworCisJLypzZW5kbXNnICgpIFRFU1Q5OiBTQ1RQX0FCT1JUIGZsYWcgRUlOVkFMLCBFeHBlY3RlZCBlcnJvciovCisJc2luZm8tPnNpbmZvX2ZsYWdzID0gU0NUUF9BQk9SVDsKKwljb3VudCA9IHNlbmRtc2coc2ssICZvdXRtZXNzYWdlLCBmbGFnKTsKKwlpZiAoY291bnQgIT0gLTEgfHwgZXJybm8gIT0gRUlOVkFMKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZW5kbXNnIHdpdGggU0NUUF9BQk9SVCBmbGFnICIKKwkJCSAiY291bnQ6JWQsIGVycm5vOiVkIiwgY291bnQsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2VuZG1zZygpIHdpdGggU0NUUF9BQk9SVCBmbGFnIC0gRUlOVkFMIik7CisKKwlzaW5mby0+c2luZm9fZmxhZ3MgPSAwOyAKKwkKKwl0ZXN0X2Nvbm5lY3Qoc2sxLCAoc3RydWN0IHNvY2thZGRyICopICZsc3RuX2FkZHIsIGxlbik7CisJCSAKKwl0ZXN0X3NlbmRtc2coc2sxLCAmb3V0bWVzc2FnZSwgZmxhZywgc3RybGVuKG1lc3NhZ2UpKzEpOworCisJY2xvc2Uoc2sxKTsKKwlhY3B0MV9zayA9IHRlc3RfYWNjZXB0KGxzdG5fc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmY29ubl9hZGRyLCAmbGVuKTsKKworCS8qc2VuZG1zZyAoKSBURVNUMTA6c2VuZG1zZyBvbiBjbG9zZWQgYXNzb2NpYXRpb24sIEVQSVBFIEV4cGVjdGVkIGVycm9yKi8KKwljb3VudCA9IHNlbmRtc2coYWNwdDFfc2ssICZvdXRtZXNzYWdlLCBmbGFnKTsKKwlpZiAoY291bnQgIT0gLTEgfHwgZXJybm8gIT0gRVBJUEUpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmRtc2cgb24gYSBjbG9zZWQgYXNzb2NpYXRpb24gIgorCQkJICJjb3VudDolZCwgZXJybm86JWQiLCBjb3VudCwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kbXNnKCkgb24gYSBjbG9zZWQgYXNzb2NpYXRpb24gLSBFUElQRSIpOworCisJY2xvc2UoYWNwdDFfc2spOworCWNsb3NlKHNrKTsKKwljbG9zZShsc3RuX3NrKTsKKwljbG9zZShhY3B0X3NrKTsKKworICAgICAgICBzayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKworICAgICAgICBsc3RuX3NrID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJY29ubl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBjb25uX2FkZHIuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgY29ubl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCWxzdG5fYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgbHN0bl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisgICAgICAgIGxzdG5fYWRkci5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKwkvKkJpbmRpbmcgdGhlIGxpc3RlbiBzb2NrZXQqLworICAgICAgICB0ZXN0X2JpbmQobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmbHN0bl9hZGRyLCBzaXplb2YobHN0bl9hZGRyKSk7CisKKyAgICAgICAgLypMaXN0ZW5pbmcgdGhlIHNvY2tldCovCisgICAgICAgIHRlc3RfbGlzdGVuKGxzdG5fc2ssIDEwKTsKKworCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCWZsYWcgPSBNU0dfTk9TSUdOQUw7CisJCisJdGVzdF9jb25uZWN0KHNrLCAoc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIGxlbik7CisKKwlhY3B0X3NrID0gdGVzdF9hY2NlcHQobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzdnJfYWRkciwgJmxlbik7CisKKwltZW1zZXQoJm91dG1lc3NhZ2UsIDAsIHNpemVvZihvdXRtZXNzYWdlKSk7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX25hbWUgPSAmc3ZyX2FkZHI7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2Yoc3ZyX2FkZHIpOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YgPSAmb3V0X2lvdjsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92bGVuID0gMTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfY29udHJvbCA9IG91dGNtc2c7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2Yob3V0Y21zZyk7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2ZsYWdzID0gMDsKKworCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZvdXRtZXNzYWdlKTsKKyAgICAgICAgY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKKyAgICAgICAgY21zZy0+Y21zZ190eXBlID0gU0NUUF9TTkRSQ1Y7CisgICAgICAgIGNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworCXNpbmZvID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7CisgICAgICAgIG1lbXNldChzaW5mbywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9iYXNlID0gbWVzc2FnZTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfbGVuID0gc3RybGVuKG1lc3NhZ2UpICsgMTsKKworCW1lbXNldCgmaW5tZXNzYWdlLCAwLCBzaXplb2YoaW5tZXNzYWdlKSk7CisgICAgICAgIGJ1ZmZlcl9yY3YgPSBtYWxsb2MoUkVBTExZX0JJRyk7CisKKyAgICAgICAgaW92X3Jjdi5pb3ZfYmFzZSA9IGJ1ZmZlcl9yY3Y7CisgICAgICAgIGlvdl9yY3YuaW92X2xlbiA9IFJFQUxMWV9CSUc7CisgICAgICAgIGlubWVzc2FnZS5tc2dfaW92ID0gJmlvdl9yY3Y7CisgICAgICAgIGlubWVzc2FnZS5tc2dfaW92bGVuID0gMTsKKyAgICAgICAgaW5tZXNzYWdlLm1zZ19jb250cm9sID0gaW5jbXNnOworICAgICAgICBpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKworCW1zZ19jb3VudCA9IHN0cmxlbihtZXNzYWdlKSArIDE7CisKKwkvKnNlbmRtc2coKSBURVNUMTE6IFNlbmRpbmcgZGF0YSBmcm9tIHNlcnZlciBzb2NrZXQgdG8gY2xpZW50IHNvY2tldCovCisJY291bnQgPSBzZW5kbXNnKGFjcHRfc2ssICZvdXRtZXNzYWdlLCBmbGFnKTsKKwlpZiAoY291bnQgIT0gbXNnX2NvdW50KQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZW5kbXNnIGZyb20gYWNjZXB0IHNvY2tldCB0byAiCisJCQkgImNsaWVudCBjb3VudDolZCwgZXJybm86JWQiLCBjb3VudCwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kbXNnKCkgZnJvbSBhY2NlcHQgc29ja2V0IHRvIGNsaWVudCAtIFNVQ0NFU1MiKTsKKworCWNvdW50ID0gdGVzdF9yZWN2bXNnKHNrLCAmaW5tZXNzYWdlLCBmbGFnKTsKKyAgICAgICAgdGVzdF9jaGVja19tc2dfZGF0YSgmaW5tZXNzYWdlLCBjb3VudCwgbXNnX2NvdW50LCBNU0dfRU9SLCAwLCAwKTsKKworICAgICAgICBvdXRtZXNzYWdlLm1zZ19uYW1lID0gJmNvbm5fYWRkcjsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfbmFtZWxlbiA9IHNpemVvZihjb25uX2FkZHIpOworCS8qc2VuZG1zZygpIFRFU1QxMjogU2VuZGluZyBkYXRhIGZyb20gY2xpZW50IHNvY2tldCB0byBzZXJ2ZXIgc29ja2V0Ki8KKwljb3VudCA9IHNlbmRtc2coc2ssICZvdXRtZXNzYWdlLCBmbGFnKTsKKwlpZiAoY291bnQgIT0gbXNnX2NvdW50KQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZW5kbXNnIGZyb20gY2xpZW50IHRvIHNlcnZlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50OiVkLCBlcnJubzolZCIsIGNvdW50LCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNlbmRtc2coKSBmcm9tIGNsaWVudCB0byBzZXJ2ZXIgLSBTVUNDRVNTIik7CisKKwljb3VudCA9IHRlc3RfcmVjdm1zZyhhY3B0X3NrLCAmaW5tZXNzYWdlLCBmbGFnKTsKKyAgICAgICAgdGVzdF9jaGVja19tc2dfZGF0YSgmaW5tZXNzYWdlLCBjb3VudCwgbXNnX2NvdW50LCBNU0dfRU9SLCAwLCAwKTsKKworICAgICAgICBvdXRtZXNzYWdlLm1zZ19uYW1lID0gJmNvbm5fYWRkcjsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfbmFtZWxlbiA9IHNpemVvZihjb25uX2FkZHIpOworCWNsb3NlKHNrKTsKKwljbG9zZShhY3B0X3NrKTsKKwlzazEgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwkvKnNlbmRtc2coKSBURVNUMTM6IFNlbmRpbmcgZGF0YSBmcm9tIHVuY29ubmVjdGVkIGNsaWVudCBzb2NrZXQgdG8gCisJc2VydmVyIHNvY2tldCovCisJY291bnQgPSBzZW5kbXNnKHNrMSwgJm91dG1lc3NhZ2UsIGZsYWcpOworCWlmIChjb3VudCAhPSBtc2dfY291bnQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmRtc2cgZnJvbSB1bmNvbm5lY3RlZCBjbGllbnQgdG8gIgorCQkJICJzZXJ2ZXIgY291bnQ6JWQsIGVycm5vOiVkIiwgY291bnQsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2VuZG1zZygpIGZyb20gdW5jb25uZWN0ZWQgY2x0IHRvIHNlcnZlciAtIFNVQ0NFU1MiKTsKKworCWFjcHRfc2sgPSB0ZXN0X2FjY2VwdChsc3RuX3NrLCAoc3RydWN0IHNvY2thZGRyICopJnN2cl9hZGRyLCAmbGVuKTsKKworCWNvdW50ID0gdGVzdF9yZWN2bXNnKGFjcHRfc2ssICZpbm1lc3NhZ2UsIGZsYWcpOworICAgICAgICB0ZXN0X2NoZWNrX21zZ19kYXRhKCZpbm1lc3NhZ2UsIGNvdW50LCBtc2dfY291bnQsIE1TR19FT1IsIDAsIDApOworCisJdGVzdF9zaHV0ZG93bihzazEsIFNIVVRfUkQpOworCisJLypzZW5kbXNnKCkgVEVTVDE0OiBTZW5kaW5nIGEgbWVzc2FnZSBvbiBTSFVUX1JEIHNvY2tldCovCisJY291bnQgPSBzZW5kbXNnKHNrMSwgJm91dG1lc3NhZ2UsIGZsYWcpOworCWlmIChjb3VudCAhPSBtc2dfY291bnQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmRtc2cgb24gYSBTSFVUX1JEIHNvY2tldCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50OiVkLCBlcnJubzolZCIsIGNvdW50LCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNlbmRtc2coKSBvbiBhIFNIVVRfUkQgc29ja2V0IC0gU1VDQ0VTUyIpOworCisJY291bnQgPSB0ZXN0X3JlY3Ztc2coYWNwdF9zaywgJmlubWVzc2FnZSwgZmxhZyk7CisgICAgICAgIHRlc3RfY2hlY2tfbXNnX2RhdGEoJmlubWVzc2FnZSwgY291bnQsIG1zZ19jb3VudCwgTVNHX0VPUiwgMCwgMCk7CisKKwljbG9zZShzazEpOworCWNsb3NlKGxzdG5fc2spOworCWNsb3NlKGFjcHRfc2spOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfc2VuZHRvLmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9zZW5kdG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmIxMDJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfc2VuZHRvLmMKQEAgLTAsMCArMSwxNjQgQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUAorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNAorICoKKyAqIFRoaXMgZmlsZSBoYXMgdGVzdCBjYXNlcyB0byB0ZXN0IHRoZSBzZW5kdG8gKCkgY2FsbCAKKyAqIGZvciAxLTEgc3R5bGUgc29ja2V0cworICoKKyAqIFRFU1QxOiBTZW5kaW5nIGRhdGEgZnJvbSBjbGllbnQgc29ja2V0IHRvIHNlcnZlciBzb2NrZXQKKyAqIFRFU1QyOiBTZW5kaW5nIGRhdGEgZnJvbSBhY2NlcHQgKHNlcnZlcikgc29ja2V0IHRvIGNsaWVudCBzb2NrZXQKKyAqIFRFU1QzOiBTZW5kaW5nIGRhdGEgZnJvbSB1bmNvbm5lY3RlZCBjbGllbnQgc29ja2V0IHRvIHNlcnZlcgorICogVEVTVDQ6IHNlbmRpbmcgcGFydGlhbCBkYXRhIGZyb20gYSBidWZmZXIKKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4gICAgICAgICAvKiBmb3Igc29ja2FkZHJfaW4gKi8KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorCitjaGFyICpUQ0lEID0gX19GSUxFX187CitpbnQgVFNUX1RPVEFMID0gNDsKK2ludCBUU1RfQ05UID0gMDsKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgICAgIGludCBtc2dfY291bnQ7CisJc29ja2xlbl90IGxlbjsKKwlpbnQgc2ssc2sxLHBmX2NsYXNzLGxzdG5fc2ssYWNwdF9zayxmbGFnOworICAgICAgICBjaGFyICptZXNzYWdlID0gImhlbGxvLCB3b3JsZCFcbiI7CisgICAgICAgIGNoYXIgKm1lc3NhZ2VfcmN2OworICAgICAgICBpbnQgY291bnQ7CisJCisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBjb25uX2FkZHIsbHN0bl9hZGRyLHN2cl9hZGRyOworCisJLyogUmF0aGVyIHRoYW4gZmZsdXNoKCkgdGhyb3VnaG91dCB0aGUgY29kZSwgc2V0IHN0ZG91dCB0bworICAgICAgICAgKiBiZSB1bmJ1ZmZlcmQKKyAgICAgICAgICovCisgICAgICAgIHNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworICAgICAgICBzZXR2YnVmKHN0ZGVyciwgTlVMTCwgX0lPTkJGLCAwKTsKKworICAgICAgICBwZl9jbGFzcyA9IFBGX0lORVQ7CisKKyAgICAgICAgc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKyAgICAgICAgbHN0bl9zayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKworCW1lc3NhZ2VfcmN2ID0gbWFsbG9jKDUxMik7CisJY29ubl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBjb25uX2FkZHIuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgY29ubl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCWxzdG5fYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgbHN0bl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisgICAgICAgIGxzdG5fYWRkci5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKwkvKkJpbmRpbmcgdGhlIGxpc3RlbiBzb2NrZXQqLworICAgICAgICB0ZXN0X2JpbmQobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmbHN0bl9hZGRyLCBzaXplb2YobHN0bl9hZGRyKSk7CisKKyAgICAgICAgLypMaXN0ZW5pbmcgdGhlIHNvY2tldCovCisgICAgICAgIHRlc3RfbGlzdGVuKGxzdG5fc2ssIDEwKTsKKworCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCWZsYWcgPSBNU0dfTk9TSUdOQUw7CisJCisJdGVzdF9jb25uZWN0KHNrLCAoc3RydWN0IHNvY2thZGRyICopICZjb25uX2FkZHIsIGxlbik7CisKKwlhY3B0X3NrID0gdGVzdF9hY2NlcHQobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzdnJfYWRkciwgJmxlbik7CisKKwltc2dfY291bnQgPSBzdHJsZW4obWVzc2FnZSkgKyAxOworCisJLypzZW5kdG8oKSBURVNUMTogU2VuZGluZyBkYXRhIGZyb20gY2xpZW50IHNvY2tldCB0byBzZXJ2ZXIgc29ja2V0Ki8KKwljb3VudCA9IHNlbmR0byhzaywgbWVzc2FnZSwgbXNnX2NvdW50LCBmbGFnLAorCQkgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSAmY29ubl9hZGRyLCBsZW4pOworCWlmIChjb3VudCAhPSBtc2dfY291bnQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmR0byBmcm9tIGNsaWVudCB0byBzZXJ2ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VudDolZCwgZXJybm86JWQiLCBjb3VudCwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kdG8oKSBmcm9tIGNsaWVudCB0byBzZXJ2ZXIgLSBTVUNDRVNTIik7CisKKwl0ZXN0X3JlY3YoYWNwdF9zaywgbWVzc2FnZV9yY3YsIG1zZ19jb3VudCwgZmxhZyk7CisKKwlzdHJuY3B5KG1lc3NhZ2VfcmN2LCJcMCIsNTEyKTsKKworCS8qc2VuZHRvKCkgVEVTVDI6IFNlbmRpbmcgZGF0YSBmcm9tIGFjY2VwdCBzb2NrZXQgdG8gY2xpZW50IHNvY2tldCovCisJY291bnQgPSBzZW5kdG8oYWNwdF9zaywgbWVzc2FnZSwgbXNnX2NvdW50LCBmbGFnLAorCQkgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSAmc3ZyX2FkZHIsIGxlbik7CisJaWYgKGNvdW50ICE9IG1zZ19jb3VudCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2VuZHRvIGZyb20gYWNjZXB0IHNvY2tldCB0byBjbGllbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VudDolZCwgZXJybm86JWQiLCBjb3VudCwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kdG8oKSBmcm9tIGFjY2VwdCBzb2NrZXQgdG8gY2xpZW50IC0gU1VDQ0VTUyIpOworCisJdGVzdF9yZWN2KHNrLCBtZXNzYWdlX3JjdiwgbXNnX2NvdW50LCBmbGFnKTsKKworICAgICAgICBjbG9zZShzayk7CisgICAgICAgIGNsb3NlKGFjcHRfc2spOworCisgICAgICAgIHNrMSA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKworCS8qc2VuZHRvKCkgVEVTVDM6IFNlbmRpbmcgZGF0YSBmcm9tIHVuY29ubmVjdGVkIGNsaWVudCBzb2NrZXQgdG8KKyAgICAgICAgc2VydmVyIHNvY2tldCovCisgICAgICAgIGNvdW50ID0gc2VuZHRvKHNrMSwgbWVzc2FnZSwgbXNnX2NvdW50LCBmbGFnLAorCQkgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSAmY29ubl9hZGRyLCBsZW4pOworICAgICAgICBpZiAoY291bnQgIT0gbXNnX2NvdW50KQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZW5kdG8gZnJvbSB1bmNvbm5lY3RlZCBjbGllbnQgdG8gIgorCQkJICJzZXJ2ZXIgY291bnQ6JWQsIGVycm5vOiVkIiwgY291bnQsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2VuZHRvKCkgZnJvbSB1bmNvbm5lY3RlZCBjbGllbnQgdG8gc2VydmVyIC0gU1VDQ0VTUyIpOworCisgICAgICAgIGFjcHRfc2sgPSB0ZXN0X2FjY2VwdChsc3RuX3NrLCAoc3RydWN0IHNvY2thZGRyICopJnN2cl9hZGRyLCAmbGVuKTsKKworICAgICAgICB0ZXN0X3JlY3YoYWNwdF9zaywgbWVzc2FnZV9yY3YsIG1zZ19jb3VudCwgZmxhZyk7CisKKwkvKnNlbmQoKSBURVNUNDogU2VuZGluZyBsZXNzIG51bWJlciBvZiBkYXRhIGZyb20gdGhlIGJ1ZmZlciovCisJLypTZW5kaW5nIG9ubHkgNSBieXRlcyBzbyB0aGF0IG9ubHkgaGVsbG8gaXMgcmVjZWl2ZWQqLworCXRlc3Rfc2VuZHRvKHNrMSwgbWVzc2FnZSwgNSwgZmxhZywgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZjb25uX2FkZHIsCisJCSAgICBsZW4pOworCXRlc3RfcmVjdihhY3B0X3NrLCBtZXNzYWdlX3JjdiwgNSwgZmxhZyk7CisJCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kdG8oKSBwYXJ0aWFsIGRhdGEgZnJvbSBhIGJ1ZmZlciAtIFNVQ0NFU1MiKTsKKworCWNsb3NlKHNrMSk7CisJY2xvc2UobHN0bl9zayk7CisJY2xvc2UoYWNwdF9zayk7CisJcmV0dXJuIDA7CisJCit9CmRpZmYgLS1naXQgYS9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9zaHV0ZG93bi5jIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfc2h1dGRvd24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmM1YjE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfc2h1dGRvd24uYwpAQCAtMCwwICsxLDIyOCBAQAorLyogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwMyBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA0CisgKgorICogVGhpcyBmaWxlIGhhcyB0ZXN0IGNhc2VzIHRvIHRlc3QgdGhlIHNodXRkb3duKCkgY2FsbCBmb3IgMS0xIHN0eWxlIHNvY2tldHMKKyAqCisgKiBURVNUMTogQmFkIHNvY2tldCBkZXNjcmlwdG9yCisgKiBURVNUMjogSW52YWxpZCBzb2NrZXQKKyAqIFRFU1QzOiBzaHV0ZG93biB3aXRoIFNIVVRfV1IgZmxhZyB0byBkaXNhYmxlIG5ldyBzZW5kCisgKiBURVNUNDogc2h1dGRvd24gd2l0aCBTSFVUX1JEIGZsYWcgdG8gZGlzYWJsZSBuZXcgcmVjZWl2ZQorICogVEVTVDU6IHNodXRkb3duIHdpdGggU0hVVF9SRFdSIGZsYWcgdG8gZGlzYWJsZSBuZXcgcmVjZWl2ZS9zZW5kCisgKiBURVNUNjogVW5jb25uZWN0ZWQgc29ja2V0CisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNjdHB1dGlsLmg+CisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSA2OworaW50IFRTVF9DTlQgPSAwOworCisjZGVmaW5lIE1BWF9DTElFTlRTIDEwCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBjbG50X3NrW01BWF9DTElFTlRTXSwgYWNwdF9za1tNQVhfQ0xJRU5UU10sc2s7CisJaW50IGxzdG5fc2s7CisJc3RydWN0IHNvY2thZGRyX2luIGxzdG5fYWRkciwgYWNwdF9hZGRyOworCXNvY2tsZW5fdCBhZGRybGVuOworCWludCBlcnJvciwgaTsKKyAgICAgICAgY2hhciAqbWVzc2FnZSA9ICJoZWxsbywgd29ybGQhXG4iOworCWNoYXIgbXNnYnVmWzEwMF07CisJaW50IHBmX2NsYXNzOworCWludCBmZCwgZXJyX25vID0gMDsKKwljaGFyIGZpbGVuYW1lWzIxXTsKKworICAgICAgICAvKiBSYXRoZXIgdGhhbiBmZmx1c2goKSB0aHJvdWdob3V0IHRoZSBjb2RlLCBzZXQgc3Rkb3V0IHRvIAorCSAqIGJlIHVuYnVmZmVyZWQuICAKKwkgKi8gCisJc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgMCk7IAorCXNldHZidWYoc3RkZXJyLCBOVUxMLCBfSU9OQkYsIDApOyAKKworCS8qIEluaXRpYWxpemUgdGhlIHNlcnZlciBhbmQgY2xpZW50IGFkZHJlc3Nlcy4gKi8gCisJcGZfY2xhc3MgPSBQRl9JTkVUOworCisJbHN0bl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWxzdG5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCWxzdG5fYWRkci5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKyAgICAgICAgc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisgICAgICAgIGxzdG5fc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwl0ZXN0X2JpbmQobHN0bl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmbHN0bl9hZGRyLCBzaXplb2YobHN0bl9hZGRyKSk7CisKKwl0ZXN0X2xpc3Rlbihsc3RuX3NrLCBNQVhfQ0xJRU5UUyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykgeworCQljbG50X3NrW2ldID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCQl0ZXN0X2Nvbm5lY3QoY2xudF9za1tpXSwgKHN0cnVjdCBzb2NrYWRkciAqKSZsc3RuX2FkZHIsCisJCQkgICAgIHNpemVvZihsc3RuX2FkZHIpKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykgeworCQlhZGRybGVuID0gc2l6ZW9mKGFjcHRfYWRkcik7CisJCWFjcHRfc2tbaV0gPSB0ZXN0X2FjY2VwdChsc3RuX3NrLCAoc3RydWN0IHNvY2thZGRyICopJmFjcHRfYWRkciwKKwkJCQkJICZhZGRybGVuKTsgCisJfQorCisJLypzaHV0ZG93bigpIFRFU1QxOiBCYWQgc29ja2V0IGRlc2NyaXB0b3IsIEVCQURGIEV4cGVjdGVkIGVycm9yKi8KKwllcnJvciA9IHNodXRkb3duKC0xLCBTSFVUX1dSKTsKKwlpZiAoZXJyb3IgIT0gLTEgfHwgZXJybm8gIT0gRUJBREYpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNodXRkb3duIHdpdGggYSBiYWQgc29ja2V0ICIKKwkJCSAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2h1dGRvd24oKSB3aXRoIGEgYmFkIHNvY2tldCBkZXNjcmlwdG9yIC0gRUJBREYiKTsKKworCS8qc2h1dGRvd24oKSBURVNUMjogSW52YWxpZCBzb2NrZXQsIEVOT1RTT0NLIEV4cGVjdGVkIGVycm9yKi8KKwlzdHJjcHkoZmlsZW5hbWUsICIvdG1wL3NjdHB0ZXN0LlhYWFhYWCIpOworCWZkID0gbWtzdGVtcChmaWxlbmFtZSk7CisJaWYgKGZkID09IC0xKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJGYWlsZWQgdG8gbWtzdGVtcCAlczogJXMiLAorCQkJCWZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCWVycm9yID0gc2h1dGRvd24oZmQsIFNIVVRfV1IpOworCWlmIChlcnJvciA9PSAtMSkKKwkJZXJyX25vID0gZXJybm87CisJY2xvc2UoZmQpOworCXVubGluayhmaWxlbmFtZSk7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycl9ubyAhPSBFTk9UU09DSykKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2h1dGRvd24gd2l0aCBhbiBpbnZhbGlkIHNvY2tldCAiCisJCQkgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJfbm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzaHV0ZG93bigpIHdpdGggYW4gaW52YWxpZCBzb2NrZXQgLSBFTk9UU09DSyIpOworCisJZXJybm8gPSAwOworCS8qRG8gYSBzZW5kIGZpcnN0IGJlZm9yZSBkb2luZyBzaHV0ZG93biovCisJdGVzdF9zZW5kKGFjcHRfc2tbMF0sIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSwgMCk7CisKKwkvKnNodXRkb3duKCkgVEVTVDM6IHNodXRkb3duIHdpdGggU0hVVF9XUiBmbGFnIHRvIGRpc2FibGUgbmV3IHNlbmQqLworCWVycm9yID0gc2h1dGRvd24oY2xudF9za1swXSwgU0hVVF9XUik7CisJaWYgKGVycm9yIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2h1dGRvd24gd2l0aCBTSFVUX1dSIGZsYWcgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJLyogUmVhZGluZyBvbiBhIHNvY2tldCB0aGF0IGhhcyByZWNlaXZlZCBTSFVURE9XTiBzaG91bGQgcmV0dXJuIDAgCisJICogaW5kaWNhdGluZyBFT0YuCisJICovCisJZXJyb3IgPSByZWN2KGFjcHRfc2tbMF0sIG1zZ2J1ZiwgMTAwLCAwKTsKKwlpZiAoKGVycm9yICE9IDApIHx8IChlcnJubyAhPSAwKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicmVjdiBvbiBhIFNIVVRET1dOIHJlY2VpdmVkIHNvY2tldCAiCisJCQkgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwkvKiBSZWFkIHRoZSBwZW5kaW5nIG1lc3NhZ2Ugb24gY2xudF9za1swXSB0aGF0IHdhcyByZWNlaXZlZCBiZWZvcmUKKwkgKiBTSFVURE9XTiBjYWxsLgorCSAqLyAgCisJdGVzdF9yZWN2KGNsbnRfc2tbMF0sIG1zZ2J1ZiwgMTAwLCAwKTsKKworCS8qIE5vIG1vcmUgbWVzc2FnZXMgYW5kIHRoZSBhc3NvY2lhdGlvbiBpcyBTSFVURE9XTiwgc2hvdWxkIGZhaWwuICovCisJZXJyb3IgPSByZWN2KGNsbnRfc2tbMF0sIG1zZ2J1ZiwgMTAwLCAwKTsKKwlpZiAoKGVycm9yICE9IC0xKSB8fCAoZXJybm8gIT0gRU5PVENPTk4pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJyZWN2IG9uIGEgU0hVVF9XUiBzb2NrZXQgd2l0aCBubyAiCisJCQkgIm1lc3NhZ2VzIGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNodXRkb3duKCkgd2l0aCBTSFVUX1dSIGZsYWcgLSBTVUNDRVNTIik7CisKKwllcnJubyA9IDA7CisKKwkvKnNodXRkb3duKCkgVEVTVDQ6IHNodXRkb3duIHdpdGggU0hVVF9SRCBmbGFnIHRvIGRpc2FibGUgbmV3IHJlY2VpdmUqLworCXRlc3Rfc2h1dGRvd24oY2xudF9za1sxXSwgU0hVVF9SRCk7CisKKwllcnJvciA9IHJlY3YoY2xudF9za1sxXSwgbXNnYnVmLCAxMDAsIDApOworCWlmICgoZXJyb3IgIT0gMCkgfHwgKGVycm5vICE9IDApKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJyZWN2IG9uIGEgU0hVVF9SRCBzb2NrZXQgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJLyogU2VuZGluZyBhIG1lc3NhZ2Ugb24gU0hVVF9SRCBzb2NrZXQuICovCisJZXJyb3IgPSB0ZXN0X3NlbmQoY2xudF9za1sxXSwgbWVzc2FnZSwgc3RybGVuKG1lc3NhZ2UpLCAwKTsKKwlpZiAoZXJyb3IgPCAwKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZW5kIG9uIGEgU0hVVF9SRCBzb2NrZXQgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJLyogUmVjZWl2ZSB0aGUgbWVzc2FnZSBzZW50IG9uIFNIVVRfUkQgc29ja2V0LiAqLworCXRlc3RfcmVjdihhY3B0X3NrWzFdLCBtc2didWYsIDEwMCwgMCk7CisKKwkvKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgU0hVVF9SRCBzb2NrZXQuICovCisJdGVzdF9zZW5kKGFjcHRfc2tbMV0sIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSwgMCk7CisKKwkvKiBXZSBzaG91bGQgbm90IHJlY2VpdmUgdGhlIG1lc3NhZ2UgYXMgdGhlIHNvY2tldCBpcyBTSFVUX1JEICovIAorCWVycm9yID0gcmVjdihjbG50X3NrWzFdLCBtc2didWYsIDEwMCwgMCk7CisJaWYgKChlcnJvciAhPSAwKSB8fCAoZXJybm8gIT0gMCkpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInJlY3Ygb24gYSBTSFVUX1JEIHNvY2tldCAiCisJCQkgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNodXRkb3duKCkgd2l0aCBTSFVUX1JEIGZsYWcgLSBTVUNDRVNTIik7CisKKwkvKnNodXRkb3duKCkgVEVTVDU6IHNodXRkb3duIHdpdGggU0hVVF9SRFdSIGZsYWcgdG8gZGlzYWJsZSBuZXcgCisJcmVjZWl2ZS9zZW5kKi8KKyAgICAgICAgdGVzdF9zaHV0ZG93bihjbG50X3NrWzJdLCBTSFVUX1JEV1IpOworCisJZXJyb3IgPSByZWN2KGFjcHRfc2tbMl0sIG1zZ2J1ZiwgMTAwLCAwKTsKKwlpZiAoKGVycm9yICE9IDApIHx8IChlcnJubyAhPSAwKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicmVjdiBvbiBhIFNIVVRET1dOIHJlY2VpdmVkIHNvY2tldCAiCisJCQkgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwllcnJvciA9IHJlY3YoY2xudF9za1syXSwgbXNnYnVmLCAxMDAsIDApOworCWlmICgoZXJyb3IgIT0gMCkgfHwgKGVycm5vICE9IDApKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJyZWN2IG9uIGEgU0hVVF9SRFdSIHNvY2tldCAiCisJCQkgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNodXRkb3duKCkgd2l0aCBTSFVUX1JEV1IgZmxhZyAtIFNVQ0NFU1MiKTsKKworCS8qc2h1dGRvd24oKSBURVNUNjogVW5jb25uZWN0ZWQgc29ja2V0LCBFTk9UQ09OTiBFeHBlY3RlZCBlcnJvciovCisJZXJyb3IgPSBzaHV0ZG93bihzaywgU0hVVF9SRCk7CisJaWYgKChlcnJvciAhPSAtMSkgfHwgKGVycm5vICE9IEVOT1RDT05OKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2h1dGRvd24gb24gYW4gdW5jb25uZWN0ZWQgc29ja2V0ICIKKwkJCSAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2h1dGRvd24oKSBvbiBhbiB1bmNvbm5lY3RlZCBzb2NrZXQgLSBTVUNDRVNTIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykKKwkJY2xvc2UoY2xudF9za1tpXSk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9DTElFTlRTOyBpKyspCisJCWNsb3NlKGFjcHRfc2tbaV0pOworCisKKwljbG9zZShsc3RuX3NrKTsKKwljbG9zZShzayk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX3NvY2tldF9iaW5kX2xpc3Rlbi5jIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfc29ja2V0X2JpbmRfbGlzdGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjNjg0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX3NvY2tldF9iaW5kX2xpc3Rlbi5jCkBAIC0wLDAgKzEsMjg4IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAzIEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQKKyAqCisgKiBUaGlzIGZpbGUgaGFzIHRlc3QgY2FzZXMgdG8gdGVzdCB0aGUgc29ja2V0ICgpLCBiaW5kICgpIGFuZCBsaXN0ZW4gKCkgZm9yCisgKiAxLTEgc3R5bGUgc29ja2V0cworICoKKyAqIHNvY2tldCAoKSBUZXN0czoKKyAqIC0tLS0tLS0tLS0tLS0tLQorICogVEVTVDE6IEludmFsaWQgZG9tYWluCisgKiBURVNUMjogSW52YWxpZCB0eXBlCisgKiBURVNUMzogT3BlbmluZyBhIFRDUCBzdHlsZSBzb2NrZXQKKyAqCisgKiBiaW5kICgpIFRlc3RzOgorICogLS0tLS0tLS0tLS0tLQorICogVEVTVDQ6IEludmFsaWQgYWRkcmVzcworICogVEVTVDU6IEludmFsaWQgYWRkcmVzcyBsZW5ndGgKKyAqIFRFU1Q2OiBJbnZhbGlkIHNvY2tldCBkZXNjcmlwdG9yCisgKiBURVNUNzogSW52YWxpZCBob3N0IG5hbWUKKyAqIFRFU1Q4OiBPbiBhIHNvY2tldCB0aGF0IGlzIGFscmVhZHkgYm91bmQKKyAqIFRFU1Q5OiBPbiByZXNlcnZlZCBwb3J0cworICogVEVTVDEwOiBJTkFERFJfQU5ZIGFkZHJlc3MgYW5kIG5vbi16ZXJvIHBvcnQKKyAqIFRFU1QxMTogSU5BRERSX0FOWSBhZGRyZXNzIGFuZCB6ZXJvIHBvcnQKKyAqIFRFU1QxMjogTG9jYWwgYWRkcmVzcyBhbmQgemVybyBwb3J0CisgKiAKKyAqIGxpc3RlbiAoKSBUZXN0czoKKyAqIC0tLS0tLS0tLS0tLS0tLQorICogVEVTVDEzOiBCYWQgc29ja2V0IGRlc2NyaXB0b3IKKyAqIFRFU1QxNDogSW52YWxpZCBzb2NrZXQKKyAqIFRFU1QxNTogTGlzdGVuaW5nIGEgYm91bmQgc29ja2V0CisgKiAKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+ICAgICAgICAgLyogZm9yIHNvY2thZGRyX2luICovCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8c2N0cHV0aWwuaD4KKworI2RlZmluZSBTQ1RQX1JFU0VSVkVEX1BPUlQgNworI2RlZmluZSBTQ1RQX0lOVl9MT09QQkFDSyAiMTcyLjMxLjQzLjExMiIKKworY2hhciAqVENJRCA9IF9fRklMRV9fOworaW50IFRTVF9UT1RBTCA9IDE1OworaW50IFRTVF9DTlQgPSAwOworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICAgICAgaW50IHNrLHBmX2NsYXNzOworCWludCBlcnJvciA9IDA7CisJaW50IHVpZDsKKwlpbnQgZmQsIGVycl9ubyA9IDA7CisJY2hhciBmaWxlbmFtZVsyMV07CisKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIGJpbmRfYWRkcjsKKworCS8qIFJhdGhlciB0aGFuIGZmbHVzaCgpIHRocm91Z2hvdXQgdGhlIGNvZGUsIHNldCBzdGRvdXQgdG8KKyAgICAgICAgICogYmUgdW5idWZmZXJlZC4KKyAgICAgICAgICovCisgICAgICAgIHNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworICAgICAgICBzZXR2YnVmKHN0ZGVyciwgTlVMTCwgX0lPTkJGLCAwKTsKKworICAgICAgICBwZl9jbGFzcyA9IFBGX0lORVQ7CisKKyAgICAgICAgLyogc29ja2V0KCkgVEVTVDE6IEludmFsaWQgZG9tYWluLCBFQUZOT1NVUFBPUlQgRXhwZWN0ZWQgZXJyb3IgKi8KKyAgICAgICAgc2sgPSBzb2NrZXQoLTEsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworICAgICAgICBpZiAoc2sgIT0gLTEgfHwgZXJybm8gIT0gRUFGTk9TVVBQT1JUKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzb2NrZXQoKSB3aXRoIGludmFsaWQgZG9tYWluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic29ja2V0KCkgd2l0aCBpbnZhbGlkIGRvbWFpbiAtIEVBRk5PU1VQUE9SVCIpOworCisJLypzb2NrZXQoKSBURVNUMiA6IEludmFsaWQgdHlwZSwgRUlOVkFMIEV4cGVjdGVkIGVycm9yKi8KKyAgICAgICAgc2sgPSBzb2NrZXQocGZfY2xhc3MsIC0xLCBJUFBST1RPX1NDVFApOworICAgICAgICBpZiAoc2sgIT0gLTEgfHwgZXJybm8gIT0gRUlOVkFMKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzb2NrZXQoKSB3aXRoIGludmFsaWQgdHlwZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNvY2tldCgpIHdpdGggaW52YWxpZCB0eXBlIC0gRUlOVkFMIik7CisKKwkvKnNvY2tldCgpIFRFU1QzOiBvcGVuaW5nIGEgc29ja2V0Ki8KKyAgICAgICAgc2sgPSBzb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworICAgICAgICBpZiAoc2sgPCAwKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJ2YWxpZCBzb2NrZXQoKSBjYWxsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic29ja2V0KCkgLSBTVUNDRVNTIik7CisKKwkvKmJpbmQoKSBURVNUNDogSW52YWxpZCBzdHJ1Y3R1cmUsIEVGQVVMVCBFeHBlY3RlZCBlcnJvciAqLworICAgICAgICBlcnJvciA9IGJpbmQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKiktMSwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOworICAgICAgICBpZiAoZXJyb3IgIT0gLTEgfHwgZXJybm8gIT0gRUZBVUxUKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJiaW5kKCkgd2l0aCBpbnZhbGlkIGFkZHJlc3MgcHRyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiYmluZCgpIHdpdGggaW52YWxpZCBhZGRyZXNzIHB0ciAtIEVGQVVMVCIpOworCisJLypiaW5kKCkgVEVTVDU6IEludmFsaWQgYWRkcmVzcyBsZW5ndGgsIEVJTlZBTCBFeHBlY3QgZXJyb3IqLworCWJpbmRfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgYmluZF9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisgICAgICAgIGJpbmRfYWRkci5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKwllcnJvciA9IGJpbmQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmJpbmRfYWRkciwgc2l6ZW9mKGJpbmRfYWRkciktMik7CisgICAgICAgIGlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFSU5WQUwpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImJpbmQoKSB3aXRoIGludmFsaWQgYWRkcmVzcyBsZW5ndGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJiaW5kKCkgd2l0aCBpbnZhbGlkIGFkZHJlc3MgbGVuZ3RoIC0gRUlOVkFMIik7CisKKwkvKmJpbmQoKSBURVNUNjogSW52YWxpZCBzb2NrZXQgZGVzY3JpcHRvciwgRU5PVFNPQ0sgRXhwZWN0IEVycm9yKi8KKwlzdHJjcHkoZmlsZW5hbWUsICIvdG1wL3NjdHB0ZXN0LlhYWFhYWCIpOworCWZkID0gbWtzdGVtcChmaWxlbmFtZSk7CisJaWYgKGZkID09IC0xKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJGYWlsZWQgdG8gbWtzdGVtcCAlczogJXMiLAorCQkJCWZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCWVycm9yID0gYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYmluZF9hZGRyLCBzaXplb2YoYmluZF9hZGRyKSk7CisJaWYgKGVycm9yID09IC0xKQorCQllcnJfbm8gPSBlcnJubzsKKwljbG9zZShmZCk7CisJdW5saW5rKGZpbGVuYW1lKTsKKwlpZiAoZXJyb3IgIT0gLTEgfHwgZXJyX25vICE9IEVOT1RTT0NLKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJiaW5kKCkgd2l0aCBpbnZhbGlkIHNvY2tldCAiCisJCQkgImRlc2NyaXB0b3IgZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycl9ubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImJpbmQoKSB3aXRoIGludmFsaWQgc29ja2V0IGRlc2NyaXB0b3IgLSBFTk9UU09DSyIpOworCisJLypiaW5kKCkgVEVTVDc6IEludmFsaWQgaG9zdCBuYW1lLCBFQUREUk5PVEFWQUlMIEV4cGVjdCBFcnJvciovCisJLypBc3NpZ25pbmcgaW52YWxpZCBob3N0IG5hbWUqLworCWJpbmRfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoU0NUUF9JTlZfTE9PUEJBQ0spOworCWVycm9yID0gYmluZChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYmluZF9hZGRyLCBzaXplb2YoYmluZF9hZGRyKSk7CisgICAgICAgIGlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFQUREUk5PVEFWQUlMKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJiaW5kKCkgd2l0aCBpbnZhbGlkIGxvY2FsICIKKwkJCSAiYWRkcmVzcyBlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJiaW5kKCkgd2l0aCBpbnZhbGlkIGxvY2FsIGFkZHJlc3MgLSBFQUREUk5PVEFWQUlMIik7CisKKwkvKmJpbmQoKSBURVNUODogQmluZCBvbiBhIHNvY2tldCB0aGF0IGhhcyBhbHJlYWR5IGNhbGxlZCBiaW5kCisJRUlOQVZMLCBFeHBlY3RlZCBlcnJvciovCisJYmluZF9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisJLypDYWxsaW5nIGJpbmQgZmlyc3QgdGltZSwgaXQgc2hvdWxkIHBhc3MqLworCXRlc3RfYmluZChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYmluZF9hZGRyLCBzaXplb2YoYmluZF9hZGRyKSk7CisKKwllcnJvciA9IGJpbmQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmJpbmRfYWRkciwgc2l6ZW9mKGJpbmRfYWRkcikpOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFSU5WQUwpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImJpbmQoKSBvbiBhbiBhbHJlYWR5IGJvdW5kIHNvY2tldCAiCisJCQkgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImJpbmQoKSBvbiBhbiBhbHJlYWR5IGJvdW5kIHNvY2tldCAtIEVJTlZBTCIpOworCisJLypDbG9zaW5nIHRoZSBzb2NrZXQgd2hpY2ggc3VjY2VlZCBpbiBiaW5kKCkgKi8KKwljbG9zZShzayk7CisKKwkvKk9wZW5pbmcgdGhlIHNvY2tldCBhZ2FpbiBmb3IgZnVydGhlciB0ZXN0Ki8KKwlzayA9IHNvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwkvKmJpbmQoKSBURVNUOTogQmluZCBvbiByZXNlcnZlZCBwb3J0cyBFQUNDRVMsIEV4cGVjdGVkIGVycm9yKi8KKwkvKkFzc2lnbmluZyBhIHJlc2VydmVkIHBvcnQqLworCXVpZCA9IGdldHVpZCgpOworCWlmICh1aWQgIT0gMCkgeworCQliaW5kX2FkZHIuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1JFU0VSVkVEX1BPUlQpOwkKKwkJZXJyb3IgPSBiaW5kKHNrLCAoc3RydWN0IHNvY2thZGRyICopICZiaW5kX2FkZHIsCisJCQkgICAgIHNpemVvZihiaW5kX2FkZHIpKTsKKwkJaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVBQ0NFUykKKwkJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImJpbmQoKSBvbiByZXNlcnZlcmQgcG9ydCAiCisJCQkgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwkJdHN0X3Jlc20oVFBBU1MsICJiaW5kKCkgb24gcmVzZXJ2ZWQgcG9ydCAtIEVBQ0NFU1MiKTsKKwl9CisKKwkvKmJpbmQoKSBURVNUMTA6IElOQUREUl9BTlkgYWRkcmVzcyBhbmQgbm9uLXplcm8gcG9ydCwgYmluZCgpIHNob3VsZCAKKwlzdWNjZWVkKi8KKwliaW5kX2FkZHIuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyAgICAgICAgYmluZF9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKwllcnJvciA9IGJpbmQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmJpbmRfYWRkcixzaXplb2YoYmluZF9hZGRyKSk7CisJaWYgKCBlcnJvciA8IDAgKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJiaW5kKCkgd2l0aCBJTkFERFJfQU5ZIGFkZHJlc3MgYW5kICIKKwkJCSAibm9uLXplcm8gcG9ydCBlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJiaW5kKCkgd2l0aCBJTkFERFJfQU5ZIGFkZHJlc3MgYW5kIG5vbi16ZXJvIHBvcnQgLSAiCisJCSAiU1VDQ0VTUyIpOworCQorCS8qQ2xvc2luZyB0aGUgc29ja2V0IHdoaWNoIHN1Y2NlZWQgaW4gYmluZCgpICovCisJY2xvc2Uoc2spOworCisJLypPcGVuaW5nIHRoZSBzb2NrZXQgYWdhaW4gZm9yIGZ1cnRoZXIgdGVzdCovCisJc2sgPSBzb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJLypiaW5kKCkgVEVTVDExOiBJTkFERFJfQU5ZIGFkZHJlc3MgYW5kIHplcm8gcG9ydCwgYmluZCgpIHNob3VsZCAKKwlzdWNjZWVkKi8KKyAgICAgICAgYmluZF9hZGRyLnNpbl9wb3J0ID0gMDsKKwllcnJvciA9IGJpbmQoc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmJpbmRfYWRkcixzaXplb2YoYmluZF9hZGRyKSk7CisJaWYgKCBlcnJvciA8IDAgKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJiaW5kKCkgd2l0aCBJTkFERFJfQU5ZIGFkZHJlc3MgYW5kICIKKwkJCSAiemVybyBwb3J0IGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImJpbmQoKSB3aXRoIElOQUREUl9BTlkgYWRkcmVzcyBhbmQgemVybyBwb3J0IC0gIgorCQkgIlNVQ0NFU1MiKTsKKworCS8qQ2xvc2luZyB0aGUgc29ja2V0IHdoaWNoIHN1Y2NlZWQgaW4gYmluZCgpICovCisJY2xvc2Uoc2spOworCisJLypPcGVuaW5nIHRoZSBzb2NrZXQgYWdhaW4gZm9yIGZ1cnRoZXIgdGVzdCovCisJc2sgPSBzb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJLypiaW5kKCkgVEVTVDEyOiBsb2NhbCBhZGRyZXNzIGFuZCB6ZXJvIHBvcnQsIGJpbmQoKSBzaG91bGQgCisJc3VjY2VlZCovCisgICAgICAgIGJpbmRfYWRkci5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworICAgICAgICBiaW5kX2FkZHIuc2luX3BvcnQgPSAwOworCWVycm9yID0gYmluZChzaywgKHN0cnVjdCBzb2NrYWRkciAqKSAmYmluZF9hZGRyLHNpemVvZihiaW5kX2FkZHIpKTsKKwlpZiAoIGVycm9yIDwgMCApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImJpbmQoKSB3aXRoIGxvY2FsIGFkZHJlc3MgYW5kICIKKwkJCSAiemVybyBwb3J0IGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImJpbmQoKSB3aXRoIGxvY2FsIGFkZHJlc3MgYW5kIHplcm8gcG9ydCAtICIKKwkJICJTVUNDRVNTIik7CisKKwkvKmxpc3RlbigpIFRFU1QxMzogQmFkIHNvY2tldCBkZXNjcmlwdG9yIEVCQURGLCBFeHBlY3RlZCBlcnJvciovCisJZXJyb3IgPSBsaXN0ZW4oLTEsIDMpOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFQkFERikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAibGlzdGVuKCkgd2l0aCBiYWQgc29ja2V0IGRlc2NyaXB0b3IgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJsaXN0ZW4oKSB3aXRoIGJhZCBzb2NrZXQgZGVzY3JpcHRvciAtIEVCQURGIik7CisKKwkvKmxpc3RlbigpIFRFU1QxNDogSW52YWxpZCBzb2NrZXQgRU5PVFNPQ0ssIEV4cGVjdGVkIGVycm9yKi8KKwlzdHJjcHkoZmlsZW5hbWUsICIvdG1wL3NjdHB0ZXN0LlhYWFhYWCIpOworCWZkID0gbWtzdGVtcChmaWxlbmFtZSk7CisJaWYgKGZkID09IC0xKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJGYWlsZWQgdG8gbWtzdGVtcCAlczogJXMiLAorCQkJCWZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCWVycm9yID0gbGlzdGVuKGZkLCAzKTsKKwlpZiAoZXJyb3IgPT0gLTEpCisJCWVycl9ubyA9IGVycm5vOworCWNsb3NlKGZkKTsKKwl1bmxpbmsoZmlsZW5hbWUpOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJfbm8gIT0gRU5PVFNPQ0spCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImxpc3RlbigpIHdpdGggaW52YWxpZCBzb2NrZXQgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJyX25vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAibGlzdGVuKCkgd2l0aCBpbnZhbGlkIHNvY2tldCAtIEVOT1RTT0NLIik7CisKKwkvKmxpc3RlbigpIFRFU1QxNTpsaXN0ZW4gb24gYSBib3VuZCBzb2NrZXQsIHNob3VsZCBzdWNjZWVkKi8KKwllcnJvciA9IGxpc3RlbihzaywgMyk7CisJaWYgKCBlcnJvciA8IDAgKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJsaXN0ZW4oKSBvbiBhIGJvdW5kIHNvY2tldCAiCisJCQkgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImxpc3RlbigpIG9uIGEgYm91bmQgc29ja2V0IC0gU1VDQ0VTUyIpOworCisJY2xvc2Uoc2spOworCQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfc29ja29wdC5jIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfc29ja29wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjRlYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZnVuY190ZXN0cy90ZXN0XzFfdG9fMV9zb2Nrb3B0LmMKQEAgLTAsMCArMSw0MzQgQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgSGV3bGV0dC1QYWNrYXJkIERldmVsb3BtZW50IENvbXBhbnksIEwuUAorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNAorICoKKyAqIFRoaXMgZmlsZSBoYXMgdGVzdCBjYXNlcyB0byB0ZXN0IG5lZ2F0aXZlIHNjZW5hcmlvcyBmb3IgZ2V0c29ja29wdCAoKQorICogc2V0c29ja29wdCAoKSBjYWxsIGZvciAxLTEgc3R5bGUgc29ja2V0cworICoKKyAqIHNldHNvY2tvcHQgKCkgVGVzdHM6CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBURVNUMTogc2V0c29ja29wdDogQmFkIHNvY2tldCBkZXNjcmlwdG9yCisgKiBURVNUMjogc2V0c29ja29wdDogSW52YWxpZCBzb2NrZXQKKyAqIFRFU1QzOiBzZXRzb2Nrb3B0OiBJbnZhbGlkIGxldmVsCisgKiBURVNUNDogc2V0c29ja29wdDogSW52YWxpZCBvcHRpb24gYnVmZmVyCisgKiBURVNUNTogc2V0c29ja29wdDogSW52YWxpZCBvcHRpb24gbmFtZQorICogVEVTVDY6IGdldHNvY2tvcHQ6IEJhZCBzb2NrZXQgZGVzY3JpcHRvcgorICogVEVTVDc6IGdldHNvY2tvcHQ6IEludmFsaWQgc29ja2V0CisgKiBURVNUODogZ2V0c29ja29wdDogSW52YWxpZCBvcHRpb24gYnVmZmVyCisgKiBURVNUOTogZ2V0c29ja29wdDogSW52YWxpZCBvcHRpb24gbmFtZQorICoKKyAqIFRFU1QxMDogZ2V0c29ja29wdDogU0NUUF9JTklUTVNHCisgKiBURVNUMTE6IHNldHNvY2tvcHQ6IFNDVFBfSU5JVE1TRworICogVEVTVDEyOiBzZXRzb2Nrb3B0OiBTT19MSU5HRVIKKyAqIFRFU1QxMzogZ2V0c29ja29wdDogU09fTElOR0VSCisgKiBURVNUMTQ6IGdldHNvY2tvcHQ6IFNPX1JDVkJVRgorICogVEVTVDE1OiBnZXRzb2Nrb3B0OiBTQ1RQX1NUQVRVUworICogVEVTVDE2OiBzZXRzb2Nrb3B0OiBTT19SQ1ZCVUYKKyAqIFRFU1QxNzogc2V0c29ja29wdDogU09fU05EQlVGCisgKiBURVNUMTg6IGdldHNvY2tvcHQ6IFNPX1NOREJVRgorICogVEVTVDE5OiBnZXRzb2Nrb3B0OiBTQ1RQX1BSSU1BUllfQUREUgorICogVEVTVDIwOiBzZXRzb2Nrb3B0OiBTQ1RQX1BSSU1BUllfQUREUgorICogVEVTVDIxOiBnZXRzb2Nrb3B0OiBTQ1RQX0FTU09DSU5GTworICogVEVTVDIyOiBzZXRzb2Nrb3B0OiBTQ1RQX0FTU09DSU5GTworICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKiAKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqCisgKi8gCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorCitjaGFyICpUQ0lEID0gX19GSUxFX187CitpbnQgVFNUX1RPVEFMID0gMjI7CitpbnQgVFNUX0NOVCA9IDA7CisKK2ludAorbWFpbih2b2lkKQoreworCWludCBlcnJvcjsKKwlzb2NrbGVuX3QgbGVuOworCWludCBzaywgc2sxLCBzazIsIGFjcHRfc2ssIHBmX2NsYXNzOworCXN0cnVjdCBzY3RwX3J0b2luZm8gZ3J0aW5mbzsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gbHN0bl9hZGRyLCBjb25uX2FkZHI7CisJc3RydWN0IHNjdHBfaW5pdG1zZyBnaW5tc2c7IC8qZ2V0IHRoZSB2YWx1ZSBmb3IgU0NUUF9JTklUTVNHKi8KKwlzdHJ1Y3Qgc2N0cF9pbml0bXNnIHNpbm1zZzsgLypzZXQgdGhlIHZhbHVlIGZvciBTQ1RQX0lOSVRNU0cqLworCXN0cnVjdCBsaW5nZXIgc2xpbmdlcjsgLypTT19MSU5HRVIgc3RydWN0dXJlKi8KKwlzdHJ1Y3QgbGluZ2VyIGdsaW5nZXI7IC8qU09fTElOR0VSIHN0cnVjdHVyZSovCisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJc3RydWN0IHNvY2thZGRyX2luICpnYWRkcjsKKwlzdHJ1Y3Qgc2N0cF9zdGF0dXMgZ3N0YXR1czsgLypTQ1RQX1NUQVRVUyBvcHRpb24qLworCWludCByY3ZidWZfdmFsX2dldCwgcmN2YnVmX3ZhbF9zZXQ7IC8qZ2V0IGFuZCBzZXQgdmFyIGZvciBTT19SQ1ZCVUYqLworCWludCBzbmRidWZfdmFsX2dldCwgc25kYnVmX3ZhbF9zZXQ7LypnZXQgYW5kIHNldCB2YXIgZm9yIFNPX1NOREJVRiovCisJc3RydWN0IHNjdHBfcHJpbSBncHJpbWFkZHI7LypTQ1RQX1BSSU1BUllfQUREUiBnZXQqLworCXN0cnVjdCBzY3RwX3ByaW0gc3ByaW1hZGRyOy8qU0NUUF9QUklNQVJZX0FERFIgc2V0Ki8KKwlzdHJ1Y3Qgc2N0cF9hc3NvY3BhcmFtcyBzYXNzb2NwYXJhbXM7ICAvKiBTQ1RQX0FTU09DUEFSQU1TIHNldCAqLworCXN0cnVjdCBzY3RwX2Fzc29jcGFyYW1zIGdhc3NvY3BhcmFtczsgIC8qIFNDVFBfQVNTT0NQQVJBTVMgZ2V0ICovCisJaW50IGZkLCBlcnJfbm8gPSAwOworCWNoYXIgZmlsZW5hbWVbMjFdOworCisJLyogUmF0aGVyIHRoYW4gZmZsdXNoKCkgdGhyb3VnaG91dCB0aGUgY29kZSwgc2V0IHN0ZG91dCB0bworICAgICAgICAgKiBiZSB1bmJ1ZmZlcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgMCk7CisgICAgICAgIHNldHZidWYoc3RkZXJyLCBOVUxMLCBfSU9OQkYsIDApOworCisJcGZfY2xhc3MgPSBQRl9JTkVUOworCisJc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwkvKnNldHNvY2tvcHQoKSBURVNUMTogQmFkIHNvY2tldCBkZXNjcmlwdG9yIEVCQURGLCBFeHBlY3RlZCBlcnJvciovCisgICAgICAgIGVycm9yID0gc2V0c29ja29wdCgtMSwgSVBQUk9UT19TQ1RQLCAwLCAwLCAwKTsKKwlpZiAoZXJyb3IgIT0gLTEgfHwgZXJybm8gIT0gRUJBREYpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNldHNvY2tvcHQgd2l0aCBhIGJhZCBzb2NrZXQgIgorCQkJICJkZXNjcmlwdG9yIGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoKSB3aXRoIGEgYmFkIHNvY2tldCBkZXNjcmlwdG9yIC0gRUJBREYiKTsKKworCS8qc2V0c29ja29wdCgpIFRFU1QyOiBJbnZhbGlkIHNvY2tldCBFTk9UU09DSywgRXhwZWN0ZWQgZXJyb3IqLworCXN0cmNweShmaWxlbmFtZSwgIi90bXAvc2N0cHRlc3QuWFhYWFhYIik7CisJZmQgPSBta3N0ZW1wKGZpbGVuYW1lKTsKKwlpZiAoZmQgPT0gLTEpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIkZhaWxlZCB0byBta3N0ZW1wICVzOiAlcyIsCisJCQkJZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJZXJyb3IgPSBzZXRzb2Nrb3B0KGZkLCBJUFBST1RPX1NDVFAsIDAsIDAsIDApOworCWlmIChlcnJvciA9PSAtMSkKKwkJZXJyX25vID0gZXJybm87CisJY2xvc2UoZmQpOworCXVubGluayhmaWxlbmFtZSk7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycl9ubyAhPSBFTk9UU09DSykKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2V0c29ja29wdCB3aXRoIGFuIGludmFsaWQgc29ja2V0ICIKKwkJCSAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycl9ubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoKSB3aXRoIGFuIGludmFsaWQgc29ja2V0IC0gRU5PVFNPQ0siKTsKKworCS8qc2V0c29ja29wdCgpIFRFU1QzOiBJbnZhbGlkIGxldmVsIEVOT1BST1RPT1BULCBFeHBlY3RlZCBlcnJvciovCisgICAgICAgIGVycm9yID0gc2V0c29ja29wdChzaywgLTEsIFNDVFBfUlRPSU5GTywgMCwgMCk7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVOT1BST1RPT1BUKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0IHdpdGggaW52YWxpZCBsZXZlbCAiCisJCQkgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoKSB3aXRoIGFuIGludmFsaWQgbGV2ZWwgLSBFTk9QUk9UT09QVCIpOworCisJLypzZXRzb2Nrb3B0KCkgVEVTVDQ6IEludmFsaWQgb3B0aW9uIGJ1ZmZlciBFRkFVTFQsIEV4cGVjdGVkIGVycm9yKi8KKyAgICAgICAgZXJyb3IgPSBzZXRzb2Nrb3B0KHNrLCBJUFBST1RPX1NDVFAsIFNDVFBfUlRPSU5GTywgCisJCShjb25zdCBzdHJ1Y3Qgc2N0cF9ydG9pbmZvICopLTEsIHNpemVvZihzdHJ1Y3Qgc2N0cF9ydG9pbmZvKSk7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVGQVVMVCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2V0c29ja29wdCB3aXRoIGludmFsaWQgb3B0aW9uICIKKwkJCSAiYnVmZmVyIGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoKSB3aXRoIGludmFsaWQgb3B0aW9uIGJ1ZmZlciAtIEVGQVVMVCIpOworCisJLypzZXRzb2Nrb3B0KCkgVEVTVDU6IEludmFsaWQgb3B0aW9uIE5hbWUgRU9QTk9UU1VQUCwgRXhwZWN0ZWQgZXJyb3IqLworICAgICAgICBlcnJvciA9IHNldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9BVVRPQ0xPU0UsIDAsIDApOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFT1BOT1RTVVBQKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0IHdpdGggaW52YWxpZCBvcHRpb24gIgorCQkJICJuYW1lIGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoKSB3aXRoIGludmFsaWQgb3B0aW9uIG5hbWUgLSBFT1BOT1RTVVBQIik7CisKKwkvKmdldHNvY2tvcHQoKSBURVNUNjogQmFkIHNvY2tldCBkZXNjcmlwdG9yIEVCQURGLCBFeHBlY3RlZCBlcnJvciovCisgICAgICAgIGVycm9yID0gZ2V0c29ja29wdCgtMSwgSVBQUk9UT19TQ1RQLCAwLCAwLCAwKTsKKwlpZiAoZXJyb3IgIT0gLTEgfHwgZXJybm8gIT0gRUJBREYpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImdldHNvY2tvcHQgd2l0aCBhIGJhZCBzb2NrZXQgIgorCQkJICJkZXNjcmlwdG9yIGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tvcHQoKSB3aXRoIGEgYmFkIHNvY2tldCBkZXNjcmlwdG9yIC0gRUJBREYiKTsKKworCS8qZ2V0c29ja29wdCgpIFRFU1Q3OiBJbnZhbGlkIHNvY2tldCBFTk9UU09DSywgRXhwZWN0ZWQgZXJyb3IqLworCXN0cmNweShmaWxlbmFtZSwgIi90bXAvc2N0cHRlc3QuWFhYWFhYIik7CisJZmQgPSBta3N0ZW1wKGZpbGVuYW1lKTsKKwlpZiAoZmQgPT0gLTEpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIkZhaWxlZCB0byBta3N0ZW1wICVzOiAlcyIsCisJCQkJZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJZXJyb3IgPSBnZXRzb2Nrb3B0KGZkLCBJUFBST1RPX1NDVFAsIDAsIDAsIDApOworCWlmIChlcnJvciA9PSAtMSkKKwkJZXJyX25vID0gZXJybm87CisJY2xvc2UoZmQpOworCXVubGluayhmaWxlbmFtZSk7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycl9ubyAhPSBFTk9UU09DSykKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdCB3aXRoIGFuIGludmFsaWQgc29ja2V0ICIKKwkJCSAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycl9ubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tvcHQoKSB3aXRoIGFuIGludmFsaWQgc29ja2V0IC0gRU5PVFNPQ0siKTsKKyNpZiAwCisJLypnZXRzb2Nrb3B0KCkgVEVTVDM6IEludmFsaWQgbGV2ZWwgRU5PUFJPVE9PUFQsIEV4cGVjdGVkIGVycm9yKi8KKwkvKkkgaGF2ZSBjb21tZW50ZWQgdGhpcyB0ZXN0IGNhc2UgYmVjYXVzZSBpdCBpcyByZXR1cm5pbmcgRU9QTk9UU1VQUC4KKwlXaGVuIEkgY2hlY2tlZCB0aGUgY29kZSB0aGVyZSBhbHNvIGl0IGlzIHJldHVybmluZyBFT1BOT1RTVVBQLiBBcyB0aGlzCisJaXMgbm90IHNwZWNpZmljIHRvIFRDUCBzdHlsZSwgSSBkbyBub3Qgd2FudCB0byBkbyB0aGUgY29kZSBjaGFuZ2UqLworCQorICAgICAgICBlcnJvciA9IGdldHNvY2tvcHQoc2ssIC0xLCBTQ1RQX1JUT0lORk8sIDAsIDApOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFTk9QUk9UT09QVCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdCB3aXRoIGludmFsaWQgbGV2ZWwgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRzb2Nrb3B0KCkgd2l0aCBhbiBpbnZhbGlkIGxldmVsIC0gRU5PUFJPVE9PUFQiKTsKKyNlbmRpZgorCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9ydG9pbmZvKTsKKworCS8qZ2V0c29ja29wdCgpIFRFU1Q4OiBJbnZhbGlkIG9wdGlvbiBidWZmZXIgRUZBVUxULCBFeHBlY3RlZCBlcnJvciovCisgICAgICAgIGVycm9yID0gZ2V0c29ja29wdChzaywgSVBQUk9UT19TQ1RQLCBTQ1RQX1JUT0lORk8sIAorCQkJICAgKHN0cnVjdCBzY3RwX3J0b2luZm8gKiktMSwgJmxlbik7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVGQVVMVCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdCB3aXRoIGludmFsaWQgb3B0aW9uICIKKwkJCSAiYnVmZmVyIGVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tvcHQoKSB3aXRoIGludmFsaWQgb3B0aW9uIGJ1ZmZlciAtIEVGQVVMVCIpOworCisJLypnZXRzb2Nrb3B0KCkgVEVTVDk6IEludmFsaWQgb3B0aW9uIE5hbWUgRU9QTk9UU1VQUCwgRXhwZWN0ZWQgZXJyb3IqLworICAgICAgICBlcnJvciA9IGdldHNvY2tvcHQoc2ssIElQUFJPVE9fU0NUUCwgU0NUUF9BVVRPQ0xPU0UsICZncnRpbmZvLCAmbGVuKTsKKwlpZiAoZXJyb3IgIT0gLTEgfHwgZXJybm8gIT0gRU9QTk9UU1VQUCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdCB3aXRoIGludmFsaWQgb3B0aW9uICIKKwkJCSAibmFtZSBlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRzb2Nrb3B0KCkgd2l0aCBpbnZhbGlkIG9wdGlvbiBuYW1lIC0gRU9QTk9UU1VQUCIpOworCisJY2xvc2Uoc2spOworCisJc2sxID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCXNrMiA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKworCWxzdG5fYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgbHN0bl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisgICAgICAgIGxzdG5fYWRkci5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKwljb25uX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGNvbm5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworICAgICAgICBjb25uX2FkZHIuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCisgICAgICAgIGxlbiA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9pbml0bXNnKTsKKworCS8qIFRFU1QxMDogVGVzdCBjYXNlcyBmb3IgZ2V0c29ja29wdCBTQ1RQX0lOSVRNU0cgKi8KKwl0ZXN0X2dldHNvY2tvcHQoc2sxLCBTQ1RQX0lOSVRNU0csICZnaW5tc2csICZsZW4pOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRzb2Nrb3B0KCkgU0NUUF9JTklUTVNHIC0gU1VDQ0VTUyIpOworCisJc2lubXNnLnNpbml0X251bV9vc3RyZWFtcyA9IDU7CisgICAgICAgIHNpbm1zZy5zaW5pdF9tYXhfaW5zdHJlYW1zID0gNTsKKyAgICAgICAgc2lubXNnLnNpbml0X21heF9hdHRlbXB0cyA9IDM7CisgICAgICAgIHNpbm1zZy5zaW5pdF9tYXhfaW5pdF90aW1lbyA9IDMwOworCS8qIFRFU1QxMTogVGVzdCBjYXNlIGZvciBzZXRzb2Nrb3B0IFNDVFBfSU5JVE1TRyAqLworCXRlc3Rfc2V0c29ja29wdChzazEsIFNDVFBfSU5JVE1TRywgJnNpbm1zZywgc2l6ZW9mKHNpbm1zZykpOworCisJdGVzdF9nZXRzb2Nrb3B0KHNrMSwgU0NUUF9JTklUTVNHLCAmZ2lubXNnLCAmbGVuKTsKKworCWlmIChzaW5tc2cuc2luaXRfbnVtX29zdHJlYW1zICE9IGdpbm1zZy5zaW5pdF9udW1fb3N0cmVhbXMgJiYKKwkgICAgc2lubXNnLnNpbml0X21heF9pbnN0cmVhbXMgIT0gZ2lubXNnLnNpbml0X21heF9pbnN0cmVhbXMgJiYKKwkgICAgc2lubXNnLnNpbml0X21heF9hdHRlbXB0cyAhPSBnaW5tc2cuc2luaXRfbWF4X2F0dGVtcHRzICYmCisJICAgIHNpbm1zZy5zaW5pdF9tYXhfaW5pdF90aW1lbyAhPSBnaW5tc2cuc2luaXRfbWF4X2luaXRfdGltZW8pCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNldHNvY2tvcHQvZ2V0c29ja29wdCBTQ1RQX0lOSVRNU0cgIgorCQkJICJjb21wYXJlIGZhaWxlZCIpOworCisJdHN0X3Jlc20oVFBBU1MsICJzZXRzb2Nrb3B0KCkgU0NUUF9JTklUTVNHIC0gU1VDQ0VTUyIpOworCisJLypOb3cgZ2V0IHRoZSB2YWx1ZXMgb24gZGlmZmVyZW50IGVuZHBvaW50Ki8KKwl0ZXN0X2dldHNvY2tvcHQoc2syLCBTQ1RQX0lOSVRNU0csICZnaW5tc2csICZsZW4pOworCisJLypDb21wYXJpc29uIHNob3VsZCBub3Qgc3VjY2VlZCBoZXJlKi8KKwlpZiAoc2lubXNnLnNpbml0X251bV9vc3RyZWFtcyA9PSBnaW5tc2cuc2luaXRfbnVtX29zdHJlYW1zICYmCisJICAgIHNpbm1zZy5zaW5pdF9tYXhfaW5zdHJlYW1zID09IGdpbm1zZy5zaW5pdF9tYXhfaW5zdHJlYW1zICYmCisJICAgIHNpbm1zZy5zaW5pdF9tYXhfYXR0ZW1wdHMgPT0gZ2lubXNnLnNpbml0X21heF9hdHRlbXB0cyAmJgorCSAgICBzaW5tc2cuc2luaXRfbWF4X2luaXRfdGltZW8gPT0gZ2lubXNnLnNpbml0X21heF9pbml0X3RpbWVvKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0L2dldHNvY2tvcHQgU0NUUF9JTklUTVNHICIKKwkJCSAidW5leHBlY3RlZCBjb21wYXJlIHN1Y2Nlc3MiKTsKKworCS8qIFNPX0xJTkdFUiBUZXN0IHdpdGggbF9vbmZmID0gMCBhbmQgbF9saW5nZXIgPSAwICovCisJc2xpbmdlci5sX29ub2ZmID0gMDsKKwlzbGluZ2VyLmxfbGluZ2VyID0gMDsKKwl0ZXN0X2JpbmQoc2sxLCAoc3RydWN0IHNvY2thZGRyICopICZsc3RuX2FkZHIsIHNpemVvZihsc3RuX2FkZHIpKTsKKwl0ZXN0X2xpc3RlbihzazEsIDEwICk7CisJbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJdGVzdF9jb25uZWN0KHNrMiwgKHN0cnVjdCBzb2NrYWRkciAqKSAmY29ubl9hZGRyLCBsZW4pOworCisJYWNwdF9zayA9IHRlc3RfYWNjZXB0KHNrMSwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCAmbGVuKTsKKworICAgICAgICBsZW4gPSBzaXplb2Yoc3RydWN0IGxpbmdlcik7CisJLyogVEVTVDEyOiBUZXN0IGNhc2UgZm9yIHNldHNvY2tvcHQgU09fTElOR0VSICovCisJZXJyb3IgPSBzZXRzb2Nrb3B0KHNrMiwgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAmc2xpbmdlciwgbGVuKTsKKwlpZiAoZXJyb3IgPCAwKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0IFNPX0xJTkdFUiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoKSBTT19MSU5HRVIgLSBTVUNDRVNTIik7CisKKwkvKiBURVNUMTM6IFRlc3QgY2FzZSBmb3IgZ2V0c29ja29wdCBTT19MSU5HRVIgKi8KKwllcnJvciA9IGdldHNvY2tvcHQoc2syLCBTT0xfU09DS0VULCBTT19MSU5HRVIsICZnbGluZ2VyLCAmbGVuKTsKKwlpZiAoZXJyb3IgPCAwKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRzb2Nrb3B0IFNPX0xJTkdFUiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tvcHQoKSBTT19MSU5HRVIgLSBTVUNDRVNTIik7CisKKwlpZiAoc2xpbmdlci5sX29ub2ZmICE9IGdsaW5nZXIubF9vbm9mZiB8fCAKKwkgICAgc2xpbmdlci5sX2xpbmdlciAhPSBnbGluZ2VyLmxfbGluZ2VyKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0L2dldHNvY2tvcHQgU09fTElOR0VSICIKKwkJCSAiY29tcGFyZSBmYWlsZWQiKTsKKwkKKwkvKkZpcnN0IGdldHMgdGhlIGRlZmF1bHQgU09fUkNWQlVGIHZhbHVlIGFuZCBjb21hcHJlcyB3aXRoIHRoZQorCXZhbHVlIG9idGFpbmVkIGZyb20gU0NUUF9TVEFUVVMqLworCWxlbiA9IHNpemVvZihpbnQpOworCS8qIFRFU1QxNDogVGVzdCBjYXNlIGZvciBnZXRzb2Nrb3B0IFNPX1JDVkJVRiAqLworCWVycm9yID0gZ2V0c29ja29wdChzazIsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJnJjdmJ1Zl92YWxfZ2V0LCAmbGVuKTsKKwlpZiAoZXJyb3IgPCAwKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRzb2Nrb3B0IFNPX1JDVkJVRiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tvcHQoKSBTT19SQ1ZCVUYgLSBTVUNDRVNTIik7CisKKwlsZW4gPSBzaXplb2Yoc3RydWN0IHNjdHBfc3RhdHVzKTsKKwkvKiBURVNUMTU6IFRlc3QgY2FzZSBmb3IgZ2V0c29ja29wdCBTQ1RQX1NUQVRVUyAqLworCWVycm9yID0gZ2V0c29ja29wdChzazIsIElQUFJPVE9fU0NUUCwgU0NUUF9TVEFUVVMsICZnc3RhdHVzLCAmbGVuKTsKKwlpZiAoZXJyb3IgPCAwKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRzb2Nrb3B0IFNDVFBfU1RBVFVTICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiZ2V0c29ja29wdCgpIFNDVFBfU1RBVFVTIC0gU1VDQ0VTUyIpOworCisJLyogUmVkdWNpbmcgdGhlIFNPX1JDVkJVRiB2YWx1ZSB1c2luZyBzZXRzb2Nrb3B0KCkgKi8KKwkvKiBVcHN0cmVhbSBoYXMgY2hhbmdlZCB0aGUgTUlOX1JDVkJVRiAoMjA0OCArIHNpemVvZihzdHJ1Y3Qgc2tfYnVmZikpICovCisJbGVuID0gc2l6ZW9mKGludCk7CisJcmN2YnVmX3ZhbF9zZXQgPSAyMDQ4OworCS8qIFRFU1QxNjogVGVzdCBjYXNlIGZvciBzZXRzb2Nrb3B0IFNPX1JDVkJVRiAqLworCWVycm9yID0gc2V0c29ja29wdChzazIsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJnJjdmJ1Zl92YWxfc2V0LCBsZW4pOworCWlmIChlcnJvciA8IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNldHNvY2tvcHQgU09fUkNWQlVGICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2V0c29ja29wdCgpIFNPX1JDVkJVRiAtIFNVQ0NFU1MiKTsKKworCWVycm9yID0gZ2V0c29ja29wdChzazIsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJnJjdmJ1Zl92YWxfZ2V0LCAmbGVuKTsKKwlpZiAoZXJyb3IgPCAwKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRzb2Nrb3B0IFNPX1JDVkJVRiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwlpZiAoKDIgKiByY3ZidWZfdmFsX3NldCkgIT0gcmN2YnVmX3ZhbF9nZXQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIkNvbXBhcmlzb24gZmFpbGVkOlNldCB2YWx1ZSBhbmQgIgorCQkJICJnb3QgdmFsdWUgZGlmZmVycyBTZXQgVmFsdWU9JWQgR2V0IFZhbHVlPSVkIiwKKwkJCSAoMipyY3ZidWZfdmFsX3NldCksIHJjdmJ1Zl92YWxfZ2V0KTsKKworCXNuZGJ1Zl92YWxfc2V0ID0gMjMwNDsKKwkvKiBURVNUMTc6IFRlc3QgY2FzZSBmb3Igc2V0c29ja29wdCBTT19TTkRCVUYgKi8KKwllcnJvciA9IHNldHNvY2tvcHQoc2syLCBTT0xfU09DS0VULCBTT19TTkRCVUYsICZzbmRidWZfdmFsX3NldCwgbGVuKTsKKwlpZiAoZXJyb3IgPCAwKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0IFNPX1NOREJVRiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoKSBTT19TTkRCVUYgLSBTVUNDRVNTIik7CisKKwkvKiBURVNUMTg6IFRlc3QgY2FzZSBmb3IgZ2V0c29ja29wdCBTT19TTkRCVUYgKi8KKwllcnJvciA9IGdldHNvY2tvcHQoc2syLCBTT0xfU09DS0VULCBTT19TTkRCVUYsICZzbmRidWZfdmFsX2dldCwgJmxlbik7CisJaWYgKGVycm9yIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdCBTT19TTkRCVUYgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRzb2Nrb3B0KCkgU09fU05EQlVGIC0gU1VDQ0VTUyIpOworCisJaWYgKCgyICogc25kYnVmX3ZhbF9zZXQpICE9IHNuZGJ1Zl92YWxfZ2V0KQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJDb21wYXJpc29uIGZhaWxlZDpTZXQgdmFsdWUgYW5kICIKKwkJCSAiZ290IHZhbHVlIGRpZmZlcnMgU2V0IFZhbHVlPSVkIEdldCBWYWx1ZT0lZFxuIiwKKwkJCSAoMipzbmRidWZfdmFsX3NldCksIHNuZGJ1Zl92YWxfZ2V0KTsKKworICAgICAgICAgICAgCisJLyogR2V0dGluZyB0aGUgcHJpbWFyeSBhZGRyZXNzIHVzaW5nIFNDVFBfUFJJTUFSWV9BRERSICovCisgICAgICAgIGxlbiA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9wcmltKTsKKwkvKiBURVNUMTk6IFRlc3QgY2FzZSBmb3IgZ2V0c29ja29wdCBTQ1RQX1BSSU1BUllfQUREUiAqLworCWVycm9yID0gZ2V0c29ja29wdChzazIsSVBQUk9UT19TQ1RQLCBTQ1RQX1BSSU1BUllfQUREUiwgJmdwcmltYWRkciwKKwkJCSAgICZsZW4pOworCWlmIChlcnJvciA8IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImdldHNvY2tvcHQgU0NUUF9QUklNQVJZX0FERFIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRzb2Nrb3B0KCkgU0NUUF9QUklNQVJZX0FERFIgLSBTVUNDRVNTIik7CisKKwlnYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJmdwcmltYWRkci5zc3BfYWRkcjsKKwlpZihodG9ucyhnYWRkci0+c2luX3BvcnQpICE9IGxzdG5fYWRkci5zaW5fcG9ydCAmJgorCSAgIGdhZGRyLT5zaW5fZmFtaWx5ICE9IGxzdG5fYWRkci5zaW5fZmFtaWx5ICYmCisJICAgZ2FkZHItPnNpbl9hZGRyLnNfYWRkciAhPSBsc3RuX2FkZHIuc2luX2FkZHIuc19hZGRyKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRzb2Nrb3B0IFNDVFBfUFJJTUFSWV9BRERSIHZhbHVlICIKKwkJCSAibWlzbWF0Y2giKTsKKworCW1lbWNweSgmc3ByaW1hZGRyLCAmZ3ByaW1hZGRyLCBzaXplb2Yoc3RydWN0IHNjdHBfcHJpbSkpOworCisJLyogVEVTVDIwOiBUZXN0IGNhc2UgZm9yIHNldHNvY2tvcHQgU0NUUF9QUklNQVJZX0FERFIgKi8KKwllcnJvciA9IHNldHNvY2tvcHQoc2syLElQUFJPVE9fU0NUUCwgU0NUUF9QUklNQVJZX0FERFIsICZzcHJpbWFkZHIsCisJCQkgICBsZW4pOworCWlmIChlcnJvciA8IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNldHNvY2tvcHQgU0NUUF9QUklNQVJZX0FERFIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZXRzb2Nrb3B0KCkgU0NUUF9QUklNQVJZX0FERFIgLSBTVUNDRVNTIik7CisKKwkvKiBURVNUMjE6IFRlc3QgY2FzZSBmb3IgZ2V0c29ja29wdCBTQ1RQX1BSSU1BUllfQUREUiAqLworCS8qIEdldHRpbmcgdGhlIGFzc29jaWF0aW9uIGluZm8gdXNpbmcgU0NUUF9BU1NPQ0lORk8gKi8KKyAgICAgICAgbGVuID0gc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jcGFyYW1zKTsKKwllcnJvciA9IGdldHNvY2tvcHQoc2syLCBJUFBST1RPX1NDVFAsIFNDVFBfQVNTT0NJTkZPLCAmZ2Fzc29jcGFyYW1zLAorCQkJICAgJmxlbik7CisJaWYgKGVycm9yIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdCBTQ1RQX0FTU09DSU5GTyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tvcHQoKSBTQ1RQX0FTU09DSU5GTyAtIFNVQ0NFU1MiKTsKKworCS8qIFRFU1QyMTogVGVzdCBjYXNlIGZvciBzZXRzb2Nrb3B0IFNDVFBfQVNTT0NJTkZPICovCisJbWVtY3B5KCZzYXNzb2NwYXJhbXMsICZnYXNzb2NwYXJhbXMsIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY3BhcmFtcykpOworCXNhc3NvY3BhcmFtcy5zYXNvY19hc29jbWF4cnh0ICs9IDU7CisJc2Fzc29jcGFyYW1zLnNhc29jX2Nvb2tpZV9saWZlICs9IDEwOworCisJZXJyb3IgPSBzZXRzb2Nrb3B0KHNrMiwgSVBQUk9UT19TQ1RQLCBTQ1RQX0FTU09DSU5GTywgJnNhc3NvY3BhcmFtcywKKwkJCSAgIGxlbik7CisJaWYgKGVycm9yIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2V0c29ja29wdCBTQ1RQX0FTU09DSU5GTyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwllcnJvciA9IGdldHNvY2tvcHQoc2syLCBJUFBST1RPX1NDVFAsIFNDVFBfQVNTT0NJTkZPLCAmZ2Fzc29jcGFyYW1zLAorCQkJICAgJmxlbik7CisJaWYgKGVycm9yIDwgMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdCBTQ1RQX0FTU09DSU5GTyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwlpZiAoc2Fzc29jcGFyYW1zLnNhc29jX2Fzb2NtYXhyeHQgIT0gZ2Fzc29jcGFyYW1zLnNhc29jX2Fzb2NtYXhyeHQgfHwKKwkgICAgc2Fzc29jcGFyYW1zLnNhc29jX2Nvb2tpZV9saWZlICE9IGdhc3NvY3BhcmFtcy5zYXNvY19jb29raWVfbGlmZSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdCBTQ1RQX0FTU09DSU5GTyB2YWx1ZSAiCisJCQkgIm1pc21hdGNoIik7CisJdHN0X3Jlc20oVFBBU1MsICJzZXRzb2Nrb3B0KCkgU0NUUF9BU1NPQ0lORk8gLSBTVUNDRVNTIik7CisKKwljbG9zZShzazIpOworCWNsb3NlKHNrMSk7CisJY2xvc2UoYWNwdF9zayk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX3RocmVhZHMuYyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfMV90b18xX3RocmVhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmE3ZWVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF8xX3RvXzFfdGhyZWFkcy5jCkBAIC0wLDAgKzEsMTk2IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDAzIEhld2xldHQtUGFja2FyZCBEZXZlbG9wbWVudCBDb21wYW55LCBMLlAKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQKKyAqCisgKiBUaGlzIGZpbGUgZG9lcyBzZW5kIGFuZCByZWNlaXZlIGZvciA1MDAgdGhyZWFkcyBvbiBhIHVuaXF1ZSBhc3NvY2lhdGlvbiBmb3IKKyAqIFRIUkVBRF9TTkRfUkNWX0xPT1BTID0gMTAgbWFueSB0aW1lcy4gVG8gY2hhbmdlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyAKKyAqIGNoYW5nZSB0aGUgVEhSRUFEUyB2YWx1ZW4gYW5kIGxvb3AgY2hhbmdlIHRoZSBUSFJFQURfU05EX1JDVl9MT09QUy4KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIGdpdmVuIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZQorICoKKyAqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4gICAgICAgICAvKiBmb3Igc29ja2FkZHJfaW4gKi8KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorCisjZGVmaW5lIFRIUkVBRFMgMTAgICAgLyogRklYTUUgc2hvdWxkIGJlIDUwMCBpbnN0ZWFkIG9mIDEwICovCisjZGVmaW5lIFRIUkVBRF9TTkRfUkNWX0xPT1BTIDEwCisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSAxOworaW50IFRTVF9DTlQgPSAwOworCitpbnQgY2xpZW50X3NrOworaW50IHNlcnZlcl9zazsKK2ludCBhY3B0X3NrOworc3RydWN0IHNvY2thZGRyX2luICBjb25uX2FkZHI7CitjaGFyICptZXNzYWdlID0gImhlbGxvLCB3b3JsZCFcbiI7CisKK3ZvaWQgCit0X3JlY3Yodm9pZCkgeworCWludCBjbnQ7CisJc3RydWN0IG1zZ2hkciBpbm1lc3NhZ2U7CisJc3RydWN0IGlvdmVjIGlvdjsKKyAgICAgICAgY2hhciBpbmNtc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpXTsKKyAgICAgICAgY2hhciAqIGJ1ZmZlcjsKKworCW1lbXNldCgmaW5tZXNzYWdlLCAwLCBzaXplb2YoaW5tZXNzYWdlKSk7CisgICAgICAgIGJ1ZmZlciA9IG1hbGxvYygxMDApOworCisgICAgICAgIGlvdi5pb3ZfYmFzZSA9IGJ1ZmZlcjsKKyAgICAgICAgaW92Lmlvdl9sZW4gPSAxMDA7CisgICAgICAgIGlubWVzc2FnZS5tc2dfaW92ID0gJmlvdjsKKyAgICAgICAgaW5tZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworICAgICAgICBpbm1lc3NhZ2UubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisgICAgICAgIGlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCisJY250ID0gdGVzdF9yZWN2bXNnKGFjcHRfc2ssJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworICAgICAgICB0ZXN0X2NoZWNrX21zZ19kYXRhKCZpbm1lc3NhZ2UsIGNudCwgc3RybGVuKG1lc3NhZ2UpICsgMSwgTVNHX0VPUiwKKwkJCSAgICAwLCAwKTsKK30KKwordm9pZAordF9zZW5kKHZvaWQpIHsKKyAgICAgICAgc3RydWN0IG1zZ2hkciBvdXRtZXNzYWdlOworICAgICAgICBzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbzsKKyAgICAgICAgc3RydWN0IGNtc2doZHIgKmNtc2c7CisgICAgICAgIHN0cnVjdCBpb3ZlYyBvdXRfaW92OworICAgICAgICBjaGFyIG91dGNtc2dbQ01TR19TUEFDRShzaXplb2Yoc2N0cF9jbXNnX2RhdGFfdCkpXTsKKworICAgICAgICBtZW1zZXQoJm91dG1lc3NhZ2UsIDAsIHNpemVvZihvdXRtZXNzYWdlKSk7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX25hbWUgPSAmY29ubl9hZGRyOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19uYW1lbGVuID0gc2l6ZW9mKGNvbm5fYWRkcik7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2lvdiA9ICZvdXRfaW92OworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19jb250cm9sID0gb3V0Y21zZzsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihvdXRjbXNnKTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfZmxhZ3MgPSAwOworCisgICAgICAgIGNtc2cgPSBDTVNHX0ZJUlNUSERSKCZvdXRtZXNzYWdlKTsKKwljbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworICAgICAgICBjbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKyAgICAgICAgY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47CisKKyAgICAgICAgc2luZm8gPSAoc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqKUNNU0dfREFUQShjbXNnKTsKKyAgICAgICAgbWVtc2V0KHNpbmZvLCAweDAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9iYXNlID0gbWVzc2FnZTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfbGVuID0gKHN0cmxlbihtZXNzYWdlKSArIDEpOworCisgICAgICAgIHRlc3Rfc2VuZG1zZyhjbGllbnRfc2ssICZvdXRtZXNzYWdlLCAwLCBzdHJsZW4obWVzc2FnZSkrMSk7Cit9CisKK3ZvaWQgKnJlbGF5KHZvaWQgKmFyZykKK3sKKwlpbnQgaWQgPSAqKGludCAqKSBhcmc7CisKKwlpZiAoaWQgPT0gMCkgeworCQl0X3NlbmQoKTsKKwl9IGVsc2UgeworCQl0X3JlY3YoKTsKKwkJdF9zZW5kKCk7CisJfQorCisJcHRocmVhZF9leGl0KE5VTEwpOworfQorCitpbnQgCittYWluKHZvaWQpIAoreworCisJaW50ICAgICAgY250LGk7CisJaW50ICAgICAgcHRoW1RIUkVBRFNdOworCXB0aHJlYWRfdCAgICAgICB0aHJlYWRbVEhSRUFEU107CisJaW50ICBzdGF0dXM7CisJaW50ICBleGl0X3N0YXR1czsKKwl2b2lkICogICAgICByZXN1bHQ7CisJcHRocmVhZF9hdHRyX3QgYXR0cjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gbHN0bl9hZGRyOworCXNvY2tsZW5fdCBsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc3ZyX2FkZHI7CisKKwlwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisJcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CisJCisJc2VydmVyX3NrID0gdGVzdF9zb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisJY2xpZW50X3NrID0gdGVzdF9zb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisKKwlsc3RuX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGxzdG5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCWxzdG5fYWRkci5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKwljb25uX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGNvbm5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCWNvbm5fYWRkci5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKwl0ZXN0X2JpbmQoc2VydmVyX3NrLCAoc3RydWN0IHNvY2thZGRyICopJmxzdG5fYWRkciwKKwkJIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKworCXRlc3RfbGlzdGVuKHNlcnZlcl9zaywxMCk7CisKKwl0ZXN0X2Nvbm5lY3QoY2xpZW50X3NrLChzdHJ1Y3Qgc29ja2FkZHIgKikmY29ubl9hZGRyLGxlbik7CisKKwlhY3B0X3NrID0gdGVzdF9hY2NlcHQoc2VydmVyX3NrLCAoc3RydWN0IHNvY2thZGRyICopJnN2cl9hZGRyLCAmbGVuKTsKKworCWZvciAoIGkgPSAwOyBpIDwgVEhSRUFEX1NORF9SQ1ZfTE9PUFM7IGkrKyApIHsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBUSFJFQURTOyBjbnQrKykgeworCQkJcHRoW2NudF0gPSBjbnQ7CisJCQlzdGF0dXMgPSBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkW2NudF0sICZhdHRyLCByZWxheSwgJnB0aFtjbnRdKTsKKwkJCWlmIChzdGF0dXMpCisJCQkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicHRocmVhZF9jcmVhdGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIAkJICJmYWlsZWQgc3RhdHVzOiVkLCBlcnJubzolZCIsIHN0YXR1cywKKwkJCQkJIGVycm5vKTsKKwkJfQorCisJCXB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBUSFJFQURTIDsgY250KyspIHsKKwkJCWV4aXRfc3RhdHVzID0gcHRocmVhZF9qb2luICh0aHJlYWRbY250XSwgJnJlc3VsdCk7CisJCQlpZiAoZXhpdF9zdGF0dXMgPT0gLTEpCisJCQkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicHRocmVhZF9qb2luICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAJCSAiVGhyZWFkICMlZCBleGl0ZWQgd2l0aCBzdGF0dXM6JWQiLAorCQkJCQkgY250LCBleGl0X3N0YXR1cyk7CisJCX0KKwl9CisKKwl0c3RfcmVzbShUUEFTUywgInNlbmQgYW5kIHJlY2VpdmUgZGF0YSBhY3Jvc3MgbXVsdGlwbGUgdGhyZWFkcyAtICIKKwkJICJTVUNDRVNTIik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfYXNzb2NfYWJvcnQuYyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfYXNzb2NfYWJvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODAxOWM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF9hc3NvY19hYm9ydC5jCkBAIC0wLDAgKzEsMjQzIEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwMworICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBOb2tpYSwgSW5jLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBBcmRlbGxlIEZhbiA8YXJkZWxsZS5mYW5AaW50bGUuY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgPHNyaUB1cy5pYm0uY29tPgorICovCisKKy8qIFRoaXMgaXMgYSBmdW5jdGlvbmFsIHRlc3QgdG8gdmVyaWZ5IHRoZSB1bmdyYWNlZnVsIGFib3J0IG9mIGFuCisgKiBhc3NvY2lhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHNjdHB1dGlsLmg+CisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSAxOworaW50IFRTVF9DTlQgPSAwOworCisjZGVmaW5lIE1BWF9DTElFTlRTIDEwCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBzdnJfc2ssIGNsdF9za1tNQVhfQ0xJRU5UU107CisJc29ja2FkZHJfc3RvcmFnZV90IHN2cl9sb29wLCBjbHRfbG9vcFtNQVhfQ0xJRU5UU107CisJc2N0cF9hc3NvY190IHN2cl9hc3NvY2lkW01BWF9DTElFTlRTXTsKKwlzdHJ1Y3QgaW92ZWMgaW92OworCXN0cnVjdCBtc2doZHIgaW5tZXNzYWdlOworCXN0cnVjdCBtc2doZHIgb3V0bWVzc2FnZTsKKwljaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzY3RwX2Ntc2dfZGF0YV90KSldOworCWNoYXIgb3V0Y21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSldOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvOworICAgICAgICBzdHJ1Y3QgaW92ZWMgb3V0X2lvdjsKKyAgICAgICAgaW50IGVycm9yOworCXVpbnQzMl90IHBwaWQ7CisJdWludDMyX3Qgc3RyZWFtOworCXN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSAqc2FjOworCWNoYXIgKmJpZ19idWZmZXI7CisJaW50IGk7CisgICAgICAgIGNoYXIgKm1lc3NhZ2UgPSAiaGVsbG8sIHdvcmxkIVxuIjsKKwlzdHJ1Y3Qgc2N0cF9zdGF0dXMgc3RhdHVzOworCXNvY2tsZW5fdCBzdGF0dXNfbGVuOworCisgICAgICAgIC8qIFJhdGhlciB0aGFuIGZmbHVzaCgpIHRocm91Z2hvdXQgdGhlIGNvZGUsIHNldCBzdGRvdXQgdG8gCisJICogYmUgdW5idWZmZXJlZC4gIAorCSAqLyAKKwlzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsgCisKKwkvKiBDcmVhdGUgYW5kIGJpbmQgdGhlIHNlcnZlciBzb2NrZXQuICAqLworICAgICAgICBzdnJfc2sgPSB0ZXN0X3NvY2tldChBRl9JTkVULCBTT0NLX1NFUVBBQ0tFVCwgSVBQUk9UT19TQ1RQKTsKKwlzdnJfbG9vcC52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzdnJfbG9vcC52NC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCXN2cl9sb29wLnY0LnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKwl0ZXN0X2JpbmQoc3ZyX3NrLCAmc3ZyX2xvb3Auc2EsIHNpemVvZihzdnJfbG9vcCkpOworCisJLyogRW5hYmxlIEFTU09DX0NIQU5HRSBhbmQgU05EUkNWSU5GTyBub3RpZmljYXRpb25zLiAqLworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZShzdnJfc2spOworCisJLyogTWFyayBzZXJ2ZXIgc29ja2V0IGFzIGJlaW5nIGFibGUgdG8gYWNjZXB0IG5ldyBhc3NvY2lhdGlvbnMuICAqLworCXRlc3RfbGlzdGVuKHN2cl9zaywgMSk7CisKKwkvKiBDcmVhdGUgYW5kIGJpbmQgYWxsIHRoZSBjbGllbnQgc29ja2V0cy4gICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9DTElFTlRTOyBpKyspIHsKKwkJY2x0X3NrW2ldID0gdGVzdF9zb2NrZXQoQUZfSU5FVCwgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisKKwkJY2x0X2xvb3BbaV0udjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCWNsdF9sb29wW2ldLnY0LnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisJCWNsdF9sb29wW2ldLnY0LnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8yICsgaSk7CisJCXRlc3RfYmluZChjbHRfc2tbaV0sICZjbHRfbG9vcFtpXS5zYSwgc2l6ZW9mKGNsdF9sb29wW2ldKSk7CisKKwkJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKGNsdF9za1tpXSk7CisJfQorCisJLyogQnVpbGQgdXAgYSBtc2doZHIgc3RydWN0dXJlIHdlIGNhbiB1c2UgZm9yIGFsbCBzZW5kaW5nLiAgKi8KKwlvdXRtZXNzYWdlLm1zZ19uYW1lID0gJnN2cl9sb29wOworCW91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2Yoc3ZyX2xvb3ApOworCW91dG1lc3NhZ2UubXNnX2lvdiA9ICZvdXRfaW92OworCW91dG1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbCA9IG91dGNtc2c7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihvdXRjbXNnKTsKKwlvdXRtZXNzYWdlLm1zZ19mbGFncyA9IDA7CisJY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1lc3NhZ2UpOworCWNtc2ctPmNtc2dfbGV2ZWwgPSBJUFBST1RPX1NDVFA7CisJY21zZy0+Y21zZ190eXBlID0gU0NUUF9TTkRSQ1Y7CisJY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCW91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKKwlzaW5mbyA9IChzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICopQ01TR19EQVRBKGNtc2cpOworCW1lbXNldChzaW5mbywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlwcGlkID0gcmFuZCgpOyAvKiBDaG9vc2UgYW4gYXJiaXRyYXJ5IHZhbHVlLiAqLworCXN0cmVhbSA9IDE7IAorCXNpbmZvLT5zaW5mb19wcGlkID0gcHBpZDsKKwlzaW5mby0+c2luZm9fc3RyZWFtID0gc3RyZWFtOworCW91dF9pb3YuaW92X2Jhc2UgPSBtZXNzYWdlOworCW91dF9pb3YuaW92X2xlbiA9IHN0cmxlbihtZXNzYWdlKSArIDE7CisJCisgICAgICAgIC8qIFNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UgZnJvbSBhbGwgdGhlIGNsaWVudHMgdG8gdGhlIHNlcnZlci4gIFRoaXMgCisJICogd2lsbCBjcmVhdGUgdGhlIGFzc29jaWF0aW9ucy4gIAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKQorCQl0ZXN0X3NlbmRtc2coY2x0X3NrW2ldLCAmb3V0bWVzc2FnZSwgMCwgc3RybGVuKG1lc3NhZ2UpICsgMSk7CisgICAgICAgIAorCS8qIEluaXRpYWxpemUgaW5tZXNzYWdlIGZvciBhbGwgcmVjZWl2ZXMuICovCisJYmlnX2J1ZmZlciA9IHRlc3RfbWFsbG9jKFJFQUxMWV9CSUcpOworICAgICAgICBtZW1zZXQoJmlubWVzc2FnZSwgMCwgc2l6ZW9mKGlubWVzc2FnZSkpOwkKKwlpb3YuaW92X2Jhc2UgPSBiaWdfYnVmZmVyOworCWlvdi5pb3ZfbGVuID0gUkVBTExZX0JJRzsKKwlpbm1lc3NhZ2UubXNnX2lvdiA9ICZpb3Y7CisJaW5tZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworCWlubWVzc2FnZS5tc2dfY29udHJvbCA9IGluY21zZzsKKworCS8qIEdldCB0aGUgY29tbXVuaWNhdGlvbiB1cCBtZXNzYWdlIG9uIGFsbCBjbGllbnQgc29ja2V0cy4gICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9DTElFTlRTOyBpKyspIHsKKwkJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJCWVycm9yID0gdGVzdF9yZWN2bXNnKGNsdF9za1tpXSwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCQl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOwkKKwl9CisKKwkvKiBHZXQgdGhlIGNvbW11bmljYXRpb24gdXAgbWVzc2FnZSBhbmQgdGhlIGRhdGEgbWVzc2FnZSBvbiB0aGUKKwkgKiBzZXJ2ZXIgc29ja2V0cyBmb3IgYWxsIHRoZSBjbGllbnRzLiAgCisJICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9DTElFTlRTOyBpKyspIHsKKwkJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJCWVycm9yID0gdGVzdF9yZWN2bXNnKHN2cl9zaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCQl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOwkKKworCQlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwkJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc3ZyX3NrLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJCXRlc3RfY2hlY2tfbXNnX2RhdGEoJmlubWVzc2FnZSwgZXJyb3IsIHN0cmxlbihtZXNzYWdlKSArIDEsIAorCQkJCSAgICBNU0dfRU9SLCBzdHJlYW0sIHBwaWQpOworCQlzYWMgPSAoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICopaW92Lmlvdl9iYXNlOworCQlzdnJfYXNzb2NpZFtpXSA9IHNhYy0+c2FjX2Fzc29jX2lkOworCX0KKworCW91dG1lc3NhZ2UubXNnX25hbWUgPSBOVUxMOworCW91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSAwOworCW91dG1lc3NhZ2UubXNnX2lvdiA9IE5VTEw7CisJb3V0bWVzc2FnZS5tc2dfaW92bGVuID0gMDsKKwlvdXRtZXNzYWdlLm1zZ19jb250cm9sID0gb3V0Y21zZzsKKwlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKG91dGNtc2cpOworCW91dG1lc3NhZ2UubXNnX2ZsYWdzID0gMDsKKwljbXNnID0gQ01TR19GSVJTVEhEUigmb3V0bWVzc2FnZSk7CisJY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKKwljbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKwljbXNnLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworCXNpbmZvID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7CisJbWVtc2V0KHNpbmZvLCAweDAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCXNpbmZvLT5zaW5mb19mbGFncyB8PSBTQ1RQX0FCT1JUOworCisJLyogU2h1dGRvd24gYWxsIHRoZSBhc3NvY2lhdGlvbnMgb2YgdGhlIHNlcnZlciBzb2NrZXQgaW4gYSBsb29wLiAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykgeworCQlzaW5mby0+c2luZm9fYXNzb2NfaWQgPSBzdnJfYXNzb2NpZFtpXTsKKworCQkvKiBWZXJpZnkgdGhhdCB0aGUgYXNzb2NpYXRpb24gaXMgcHJlc2VudC4gKi8KKwkJbWVtc2V0KCZzdGF0dXMsIDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zdGF0dXMpKTsKKwkJc3RhdHVzLnNzdGF0X2Fzc29jX2lkID0gc2luZm8tPnNpbmZvX2Fzc29jX2lkOworCQlzdGF0dXNfbGVuID0gc2l6ZW9mKHN0cnVjdCBzY3RwX3N0YXR1cyk7CisJCWVycm9yID0gZ2V0c29ja29wdChzdnJfc2ssIFNPTF9TQ1RQLCBTQ1RQX1NUQVRVUywKKwkJCQkgICAmc3RhdHVzLCAmc3RhdHVzX2xlbik7CisJCWlmIChlcnJvcikKKwkJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwKKwkJCQkgImdldHNvY2tvcHQoU0NUUF9TVEFUVVMpOiAlcyIsCisJCQkJIHN0cmVycm9yKGVycm5vKSk7CisKKwkJLyogQ2FsbCBzZW5kbXNnKCkgdG8gYWJvcnQgdGhlIGFzc29jaWF0aW9uLiAgKi8KKwkJdGVzdF9zZW5kbXNnKHN2cl9zaywgJm91dG1lc3NhZ2UsIDAsIDApOworCisJCS8qIFZlcmlmeSB0aGF0IHRoZSBhc3NvY2lhdGlvbiBpcyBubyBsb25nZXIgcHJlc2VudC4gICovCisJCW1lbXNldCgmc3RhdHVzLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc3RhdHVzKSk7CisJCXN0YXR1cy5zc3RhdF9hc3NvY19pZCA9IHNpbmZvLT5zaW5mb19hc3NvY19pZDsKKwkJc3RhdHVzX2xlbiA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9zdGF0dXMpOworCQllcnJvciA9IGdldHNvY2tvcHQoc3ZyX3NrLCBTT0xfU0NUUCwgU0NUUF9TVEFUVVMsIAorCQkJCSAgICZzdGF0dXMsICZzdGF0dXNfbGVuKTsKKwkJaWYgKChlcnJvciAhPSAtMSkgJiYgKGVycm5vICE9IEVJTlZBTCkpCisJCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsCisJCQkJICJnZXRzb2Nrb3B0KFNDVFBfU1RBVFVTKSAiCisJCQkJICJlcnJvcjolZCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisJfQorCisJY2xvc2Uoc3ZyX3NrKTsKKworICAgICAgICAvKiBHZXQgdGhlIENPTU1fTE9TVCBub3RpZmljYXRpb24uICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9DTElFTlRTOyBpKyspIHsKKwkJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJCWVycm9yID0gdGVzdF9yZWN2bXNnKGNsdF9za1tpXSwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCQl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSs0LAorCQkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfQ09NTV9MT1NUKTsJCisKKwkJY2xvc2UoY2x0X3NrW2ldKTsKKwl9CisKKwl0c3RfcmVzbShUUEFTUywgIkFCT1JUIGFuIGFzc29jaWF0aW9uIHVzaW5nIFNDVFBfQUJPUlQiKTsgCisKKyAgICAgICAgLyogSW5kaWNhdGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLiAgKi8KKyAgICAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvZnVuY190ZXN0cy90ZXN0X2Fzc29jX3NodXRkb3duLmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0X2Fzc29jX3NodXRkb3duLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwNzExNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfYXNzb2Nfc2h1dGRvd24uYwpAQCAtMCwwICsxLDI0NSBAQAorLyogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24KKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEsIDIwMDMKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIENpc2NvLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBNb3Rvcm9sYSwgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTm9raWEsIEluYy4KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgPHNyaUB1cy5pYm0uY29tPgorICovCisKKy8qIFRoaXMgaXMgYSBmdW5jdGlvbmFsIHRlc3QgdG8gdmVyaWZ5IHRoZSBncmFjZWZ1bCBzaHV0ZG93biBvZiBhbgorICogYXNzb2NpYXRpb24uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorCitjaGFyICpUQ0lEID0gX19GSUxFX187CitpbnQgVFNUX1RPVEFMID0gMTsKK2ludCBUU1RfQ05UID0gMDsKKworI2RlZmluZSBNQVhfQ0xJRU5UUyAxMAorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgc3ZyX3NrLCBjbHRfc2tbTUFYX0NMSUVOVFNdOworCXNjdHBfYXNzb2NfdCBzdnJfYXNzb2NpZFtNQVhfQ0xJRU5UU107CisJc29ja2FkZHJfc3RvcmFnZV90IHN2cl9sb29wLCBjbHRfbG9vcFtNQVhfQ0xJRU5UU107CisJc3RydWN0IGlvdmVjIGlvdjsKKwlzdHJ1Y3QgbXNnaGRyIGlubWVzc2FnZTsKKwlzdHJ1Y3QgbXNnaGRyIG91dG1lc3NhZ2U7CisJY2hhciBpbmNtc2dbQ01TR19TUEFDRShzaXplb2Yoc2N0cF9jbXNnX2RhdGFfdCkpXTsKKwljaGFyIG91dGNtc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpXTsKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbzsKKyAgICAgICAgc3RydWN0IGlvdmVjIG91dF9pb3Y7CisgICAgICAgIGludCBlcnJvcjsKKwl1aW50MzJfdCBwcGlkOworCXVpbnQzMl90IHN0cmVhbTsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKnNhYzsKKwljaGFyICpiaWdfYnVmZmVyOworCWludCBpOworICAgICAgICBjaGFyICptZXNzYWdlID0gImhlbGxvLCB3b3JsZCFcbiI7CisJc3RydWN0IHNjdHBfc3RhdHVzIHN0YXR1czsKKwlzb2NrbGVuX3Qgc3RhdHVzX2xlbjsKKworICAgICAgICAvKiBSYXRoZXIgdGhhbiBmZmx1c2goKSB0aHJvdWdob3V0IHRoZSBjb2RlLCBzZXQgc3Rkb3V0IHRvIAorCSAqIGJlIHVuYnVmZmVyZWQuICAKKwkgKi8gCisJc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgMCk7IAorCisJLyogQ3JlYXRlIGFuZCBiaW5kIHRoZSBzZXJ2ZXIgc29ja2V0LiAgKi8KKyAgICAgICAgc3ZyX3NrID0gdGVzdF9zb2NrZXQoQUZfSU5FVCwgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisKKwlzdnJfbG9vcC52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzdnJfbG9vcC52NC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCXN2cl9sb29wLnY0LnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKwl0ZXN0X2JpbmQoc3ZyX3NrLCAmc3ZyX2xvb3Auc2EsIHNpemVvZihzdnJfbG9vcCkpOworCisJLyogRW5hYmxlIEFTU09DX0NIQU5HRSBhbmQgU05EUkNWSU5GTyBub3RpZmljYXRpb25zLiAqLworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZShzdnJfc2spOworCisJLyogTWFyayBzZXJ2ZXIgc29ja2V0IGFzIGJlaW5nIGFibGUgdG8gYWNjZXB0IG5ldyBhc3NvY2lhdGlvbnMuICAqLworCXRlc3RfbGlzdGVuKHN2cl9zaywgMSk7CisKKwkvKiBDcmVhdGUgYW5kIGJpbmQgYWxsIHRoZSBjbGllbnQgc29ja2V0cy4gICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9DTElFTlRTOyBpKyspIHsKKwkJY2x0X3NrW2ldID0gdGVzdF9zb2NrZXQoQUZfSU5FVCwgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisKKwkJY2x0X2xvb3BbaV0udjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCWNsdF9sb29wW2ldLnY0LnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisJCWNsdF9sb29wW2ldLnY0LnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8yICsgaSk7CisJCXRlc3RfYmluZChjbHRfc2tbaV0sICZjbHRfbG9vcFtpXS5zYSwgc2l6ZW9mKGNsdF9sb29wW2ldKSk7CisKKwkJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKGNsdF9za1tpXSk7CisJfQorCisJLyogQnVpbGQgdXAgYSBtc2doZHIgc3RydWN0dXJlIHdlIGNhbiB1c2UgZm9yIGFsbCBzZW5kaW5nLiAgKi8KKwlvdXRtZXNzYWdlLm1zZ19uYW1lID0gJnN2cl9sb29wOworCW91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2Yoc3ZyX2xvb3ApOworCW91dG1lc3NhZ2UubXNnX2lvdiA9ICZvdXRfaW92OworCW91dG1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbCA9IG91dGNtc2c7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihvdXRjbXNnKTsKKwlvdXRtZXNzYWdlLm1zZ19mbGFncyA9IDA7CisJY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1lc3NhZ2UpOworCWNtc2ctPmNtc2dfbGV2ZWwgPSBJUFBST1RPX1NDVFA7CisJY21zZy0+Y21zZ190eXBlID0gU0NUUF9TTkRSQ1Y7CisJY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCW91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKKwlzaW5mbyA9IChzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICopQ01TR19EQVRBKGNtc2cpOworCW1lbXNldChzaW5mbywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlwcGlkID0gcmFuZCgpOyAvKiBDaG9vc2UgYW4gYXJiaXRyYXJ5IHZhbHVlLiAqLworCXN0cmVhbSA9IDE7IAorCXNpbmZvLT5zaW5mb19wcGlkID0gcHBpZDsKKwlzaW5mby0+c2luZm9fc3RyZWFtID0gc3RyZWFtOworCW91dF9pb3YuaW92X2Jhc2UgPSBtZXNzYWdlOworCW91dF9pb3YuaW92X2xlbiA9IHN0cmxlbihtZXNzYWdlKSArIDE7CisJCisgICAgICAgIC8qIFNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UgZnJvbSBhbGwgdGhlIGNsaWVudHMgdG8gdGhlIHNlcnZlci4gIFRoaXMgCisJICogd2lsbCBjcmVhdGUgdGhlIGFzc29jaWF0aW9ucy4gIAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKQorCQl0ZXN0X3NlbmRtc2coY2x0X3NrW2ldLCAmb3V0bWVzc2FnZSwgMCwgc3RybGVuKG1lc3NhZ2UpKzEpOworICAgICAgICAKKwkvKiBJbml0aWFsaXplIGlubWVzc2FnZSBmb3IgYWxsIHJlY2VpdmVzLiAqLworCWJpZ19idWZmZXIgPSB0ZXN0X21hbGxvYyhSRUFMTFlfQklHKTsKKyAgICAgICAgbWVtc2V0KCZpbm1lc3NhZ2UsIDAsIHNpemVvZihpbm1lc3NhZ2UpKTsJCisJaW92Lmlvdl9iYXNlID0gYmlnX2J1ZmZlcjsKKwlpb3YuaW92X2xlbiA9IFJFQUxMWV9CSUc7CisJaW5tZXNzYWdlLm1zZ19pb3YgPSAmaW92OworCWlubWVzc2FnZS5tc2dfaW92bGVuID0gMTsKKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisKKwkvKiBHZXQgdGhlIGNvbW11bmljYXRpb24gdXAgbWVzc2FnZSBvbiBhbGwgY2xpZW50IHNvY2tldHMuICAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKSB7CisJCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCQllcnJvciA9IHRlc3RfcmVjdm1zZyhjbHRfc2tbaV0sICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwkJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9DT01NX1VQKTsJCisJfQorCisJLyogR2V0IHRoZSBjb21tdW5pY2F0aW9uIHVwIG1lc3NhZ2UgYW5kIHRoZSBkYXRhIG1lc3NhZ2Ugb24gdGhlCisJICogc2VydmVyIHNvY2tldHMgZm9yIGFsbCB0aGUgY2xpZW50cy4gIAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKSB7CisJCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCQllcnJvciA9IHRlc3RfcmVjdm1zZyhzdnJfc2ssICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwkJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9DT01NX1VQKTsJCQorCisJCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCQllcnJvciA9IHRlc3RfcmVjdm1zZyhzdnJfc2ssICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwkJdGVzdF9jaGVja19tc2dfZGF0YSgmaW5tZXNzYWdlLCBlcnJvciwgc3RybGVuKG1lc3NhZ2UpKzEsCisJCQkJICAgIE1TR19FT1IsIHN0cmVhbSwgcHBpZCk7CisJCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKilpb3YuaW92X2Jhc2U7CisJCXN2cl9hc3NvY2lkW2ldID0gc2FjLT5zYWNfYXNzb2NfaWQ7CisJfQorCisJLyogQnVpbGQgdXAgYSBtc2doZHIgc3RydWN0dXJlIHdlIGNhbiB1c2UgZm9yIGFsbCBzZW5kaW5nLiAgKi8KKwlvdXRtZXNzYWdlLm1zZ19uYW1lID0gTlVMTDsKKwlvdXRtZXNzYWdlLm1zZ19uYW1lbGVuID0gMDsKKwlvdXRtZXNzYWdlLm1zZ19pb3YgPSBOVUxMOworCW91dG1lc3NhZ2UubXNnX2lvdmxlbiA9IDA7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbCA9IG91dGNtc2c7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihvdXRjbXNnKTsKKwlvdXRtZXNzYWdlLm1zZ19mbGFncyA9IDA7CisJY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1lc3NhZ2UpOworCWNtc2ctPmNtc2dfbGV2ZWwgPSBJUFBST1RPX1NDVFA7CisJY21zZy0+Y21zZ190eXBlID0gU0NUUF9TTkRSQ1Y7CisJY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCW91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKKwlzaW5mbyA9IChzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICopQ01TR19EQVRBKGNtc2cpOworCW1lbXNldChzaW5mbywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlzaW5mby0+c2luZm9fZmxhZ3MgfD0gU0NUUF9FT0Y7CisKKwkvKiBTaHV0ZG93biBhbGwgdGhlIGFzc29jaWF0aW9ucyBvZiB0aGUgc2VydmVyIHNvY2tldCBpbiBhIGxvb3AuICAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKSB7CisJCXNpbmZvLT5zaW5mb19hc3NvY19pZCA9IHN2cl9hc3NvY2lkW2ldOworCisJCS8qIFZlcmlmeSB0aGF0IHRoZSBhc3NvY2lhdGlvbiBpcyBwcmVzZW50LiAqLworCQltZW1zZXQoJnN0YXR1cywgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3N0YXR1cykpOworCQlzdGF0dXMuc3N0YXRfYXNzb2NfaWQgPSBzaW5mby0+c2luZm9fYXNzb2NfaWQ7CisJCXN0YXR1c19sZW4gPSBzaXplb2Yoc3RydWN0IHNjdHBfc3RhdHVzKTsKKwkJZXJyb3IgPSBnZXRzb2Nrb3B0KHN2cl9zaywgU09MX1NDVFAsIFNDVFBfU1RBVFVTLAorCQkJCSAgICZzdGF0dXMsICZzdGF0dXNfbGVuKTsKKwkJaWYgKGVycm9yKQorCQkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LAorCQkJCSAiZ2V0c29ja29wdChTQ1RQX1NUQVRVUyk6ICVzIiwKKwkJCQkgc3RyZXJyb3IoZXJybm8pKTsKKworCQkvKiBDYWxsIHNlbmRtc2coKSB0byBzaHV0ZG93biB0aGUgYXNzb2NpYXRpb24uICAqLworCQl0ZXN0X3NlbmRtc2coc3ZyX3NrLCAmb3V0bWVzc2FnZSwgMCwgMCk7CisKKwkJLyogVmVyaWZ5IHRoYXQgdGhlIGFzc29jaWF0aW9uIGlzIG5vIGxvbmdlciBwcmVzZW50LiAgKi8KKwkJbWVtc2V0KCZzdGF0dXMsIDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zdGF0dXMpKTsKKwkJc3RhdHVzLnNzdGF0X2Fzc29jX2lkID0gc2luZm8tPnNpbmZvX2Fzc29jX2lkOworCQlzdGF0dXNfbGVuID0gc2l6ZW9mKHN0cnVjdCBzY3RwX3N0YXR1cyk7CisJCWVycm9yID0gZ2V0c29ja29wdChzdnJfc2ssIFNPTF9TQ1RQLCBTQ1RQX1NUQVRVUywgCisJCQkJICAgJnN0YXR1cywgJnN0YXR1c19sZW4pOworCQlpZiAoKGVycm9yICE9IC0xKSAmJiAoZXJybm8gIT0gRUlOVkFMKSkKKwkJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwKKwkJCQkgImdldHNvY2tvcHQoU0NUUF9TVEFUVVMpICIKKwkJCQkgImVycm9yOiVkIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKwl9CisKKwljbG9zZShzdnJfc2spOworCisgICAgICAgIC8qIEdldCB0aGUgc2h1dGRvd24gY29tcGxldGUgbm90aWZpY2F0aW9uLiAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKSB7CisJCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCQllcnJvciA9IHRlc3RfcmVjdm1zZyhjbHRfc2tbaV0sICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwkJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwKKwkJCQkJICAgIFNDVFBfU0hVVERPV05fQ09NUCk7CisKKwkJY2xvc2UoY2x0X3NrW2ldKTsKKwl9CisKKwl0c3RfcmVzbShUUEFTUywgIkdyYWNlZnVsIHNodXRkb3duIG9mIGFzc29jaWF0aW9ucyB1c2luZyBTQ1RQX0VPRiIpOyAKKworICAgICAgICAvKiBJbmRpY2F0ZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24uICAqLworICAgICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfYXV0b2Nsb3NlLmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0X2F1dG9jbG9zZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NWZhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZnVuY190ZXN0cy90ZXN0X2F1dG9jbG9zZS5jCkBAIC0wLDAgKzEsMTY3IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwMworICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBOb2tpYSwgSW5jLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiBTcmlkaGFyIFNhbXVkcmFsYSA8c3JpQHVzLmlibS5jb20+CisgKi8KKworLyogVGhpcyBpcyBhIEZ1bmN0aW9uYWwgVGVzdCB0byB2ZXJpZnkgYXV0b2Nsb3NlIGZ1bmN0aW9uYWxpdHkgYW5kIHRoZQorICogc29ja2V0IG9wdGlvbiBTQ1RQX0FVVE9DTE9TRSB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGR1cmF0aW9uIGluCisgKiB3aGljaCBhbiBpZGxlIGFzc29jaWF0aW9uIGlzIGF1dG9tYXRpY2FsbHkgY2xvc2VkLiAKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHNjdHB1dGlsLmg+CisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSAxOworaW50IFRTVF9DTlQgPSAwOworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgc2sxLCBzazI7CisJc29ja2FkZHJfc3RvcmFnZV90IGxvb3AxLCBsb29wMjsKKwlzdHJ1Y3QgbXNnaGRyIGlubWVzc2FnZSwgb3V0bWVzc2FnZTsKKwlzdHJ1Y3QgaW92ZWMgaW92LCBvdXRfaW92OworCWludCBlcnJvcjsKKwljaGFyICpiaWdfYnVmZmVyOworCWNoYXIgKm1lc3NhZ2UgPSAiaGVsbG8sIHdvcmxkIVxuIjsKKwl1aW50MzJfdCBhdXRvY2xvc2U7CisKKwkvKiBSYXRoZXIgdGhhbiBmZmx1c2goKSB0aHJvdWdob3V0IHRoZSBjb2RlLCBzZXQgc3Rkb3V0IHRvIAorCSAqIGJlIHVuYnVmZmVyZWQuIAorCSAqLworCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOyAKKworCWxvb3AxLnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWxvb3AxLnY0LnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisJbG9vcDEudjQuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCisJbG9vcDIudjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJbG9vcDIudjQuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKwlsb29wMi52NC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMik7CisKKwkvKiBDcmVhdGUgdGhlIHR3byBlbmRwb2ludHMgd2hpY2ggd2lsbCB0YWxrIHRvIGVhY2ggb3RoZXIuICAqLworCXNrMSA9IHRlc3Rfc29ja2V0KEFGX0lORVQsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCXNrMiA9IHRlc3Rfc29ja2V0KEFGX0lORVQsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCisJLyogRW5hYmxlIEFTU09DX0NIQU5HRSBhbmQgU05EUkNWSU5GTyBub3RpZmljYXRpb25zLiAqLworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZShzazEpOworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZShzazIpOworCisJLyogQmluZCB0aGVzZSBzb2NrZXRzIHRvIHRoZSB0ZXN0IHBvcnRzLiAgKi8KKwl0ZXN0X2JpbmQoc2sxLCAmbG9vcDEuc2EsIHNpemVvZihsb29wMSkpOworCXRlc3RfYmluZChzazIsICZsb29wMi5zYSwgc2l6ZW9mKGxvb3AyKSk7CisKKwkvKiBNYXJrIHNrMiBhcyBiZWluZyBhYmxlIHRvIGFjY2VwdCBuZXcgYXNzb2NpYXRpb25zLiAgKi8KKwl0ZXN0X2xpc3RlbihzazIsIDEpOworCisJLyogU2V0IHRoZSBhdXRvY2xvc2UgZHVyYXRpb24gZm9yIHRoZSBhc3NvY2lhdGlvbnMgY3JlYXRlZCBvbiBzazEgCisJICogYW5kIHNrMiB0byBiZSA1IHNlY29uZHMuICAKKwkgKi8gCisJYXV0b2Nsb3NlID0gNTsKKwl0ZXN0X3NldHNvY2tvcHQoc2sxLCBTQ1RQX0FVVE9DTE9TRSwgJmF1dG9jbG9zZSwgc2l6ZW9mKGF1dG9jbG9zZSkpOworCXRlc3Rfc2V0c29ja29wdChzazIsIFNDVFBfQVVUT0NMT1NFLCAmYXV0b2Nsb3NlLCBzaXplb2YoYXV0b2Nsb3NlKSk7CisKKwkvKiBTZW5kIHRoZSBmaXJzdCBtZXNzYWdlLiAgVGhpcyB3aWxsIGNyZWF0ZSB0aGUgYXNzb2NpYXRpb24uICAqLworCW1lbXNldCgmb3V0bWVzc2FnZSwgMCwgc2l6ZW9mKG91dG1lc3NhZ2UpKTsJCisJb3V0bWVzc2FnZS5tc2dfbmFtZSA9ICZsb29wMjsKKwlvdXRtZXNzYWdlLm1zZ19uYW1lbGVuID0gc2l6ZW9mKGxvb3AyKTsKKwlvdXRtZXNzYWdlLm1zZ19pb3YgPSAmb3V0X2lvdjsKKwlvdXRtZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworCW91dG1lc3NhZ2UubXNnX2lvdi0+aW92X2Jhc2UgPSBtZXNzYWdlOworCW91dG1lc3NhZ2UubXNnX2lvdi0+aW92X2xlbiA9IHN0cmxlbihtZXNzYWdlKSArIDE7CisKKwl0ZXN0X3NlbmRtc2coc2sxLCAmb3V0bWVzc2FnZSwgMCwgc3RybGVuKG1lc3NhZ2UpKzEpOworCisJLyogSW5pdGlhbGl6ZSBpbm1lc3NhZ2UgZm9yIGFsbCByZWNlaXZlcy4gKi8KKwliaWdfYnVmZmVyID0gdGVzdF9tYWxsb2MoUkVBTExZX0JJRyk7CisgICAgICAgIG1lbXNldCgmaW5tZXNzYWdlLCAwLCBzaXplb2YoaW5tZXNzYWdlKSk7CQorCWlvdi5pb3ZfYmFzZSA9IGJpZ19idWZmZXI7CisJaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworCWlubWVzc2FnZS5tc2dfaW92ID0gJmlvdjsKKwlpbm1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisJaW5tZXNzYWdlLm1zZ19jb250cm9sID0gTlVMTDsKKworCS8qIEdldCB0aGUgY29tbXVuaWNhdGlvbiB1cCBtZXNzYWdlIG9uIHNrMi4gICovCisJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc2syLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfQ09NTV9VUCk7CQorCisJLyogR2V0IHRoZSBjb21tdW5pY2F0aW9uIHVwIG1lc3NhZ2Ugb24gc2sxLiAgKi8KKwllcnJvciA9IHRlc3RfcmVjdm1zZyhzazEsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9DT01NX1VQKTsJCisKKwkvKiBHZXQgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggd2FzIHNlbnQuICAqLworCWVycm9yID0gdGVzdF9yZWN2bXNnKHNrMiwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX2RhdGEoJmlubWVzc2FnZSwgZXJyb3IsIHN0cmxlbihtZXNzYWdlKSArIDEsCisJCQkgICAgTVNHX0VPUnxNU0dfQ1RSVU5DLCAwLCAwKTsKKworCXRzdF9yZXNtKFRJTkZPLCAiV2FpdGluZyBmb3IgdGhlIGFzc29jaWF0aW9ucyB0byBjbG9zZSBhdXRvbWF0aWNhbGx5ICIKKwkJICJpbiA1IHNlY3MiKTsKKworCS8qIEdldCB0aGUgc2h1dGRvd24gY29tcGxldGUgbm90aWZpY2F0aW9uIGZyb20gc2sxLiAqLworCWVycm9yID0gdGVzdF9yZWN2bXNnKHNrMSwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX1NIVVRET1dOX0NPTVApOwkKKwkJCQkKKwkvKiBHZXQgdGhlIHNodXRkb3duIGNvbXBsZXRlIG5vdGlmaWNhdGlvbiBmcm9tIHNrMi4gKi8KKwllcnJvciA9IHRlc3RfcmVjdm1zZyhzazIsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9TSFVURE9XTl9DT01QKTsJCisKKwl0c3RfcmVzbShUUEFTUywgIkF1dG9jbG9zZSBvZiBhc3NvY2lhdGlvbnMiKTsKKworCS8qIFNodXQgZG93biB0aGUgbGluay4gICovCisJY2xvc2Uoc2sxKTsKKwljbG9zZShzazIpOworCisJLyogSW5kaWNhdGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLiAgKi8KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfYmFzaWMuYyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfYmFzaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjI4OGIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF9iYXNpYy5jCkBAIC0wLDAgKzEsNDU1IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwMworICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBOb2tpYSwgSW5jLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBMYSBNb250ZSBILlAuIFlhcnJvbGwgPHBpZ2d5QGFjbS5vcmc+CisgKiAgICBLYXJsIEtudXRzb24gPGthcmxAYXRoZW5hLmNoaWNhZ28uaWwudXM+CisgKiAgICBIdWkgSHVhbmcgPGh1aS5odWFuZ0Bub2tpYS5jb20+CisgKiAgICBKb24gR3JpbW0gPGpncmltbUB1cy5pYm0uY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgPHNhbXVkcmFsYUB1cy5pYm0uY29tPgorICovCisKKy8qIFRoaXMgaXMgYSBiYXNpYyBmdW5jdGlvbmFsIHRlc3QgZm9yIHRoZSBTQ1RQIGtlcm5lbAorICogaW1wbGVtZW50YXRpb24gc3RhdGUgbWFjaGluZS4KKyAqLyAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorCitjaGFyICpUQ0lEID0gX19GSUxFX187CitpbnQgVFNUX1RPVEFMID0gMTU7CitpbnQgVFNUX0NOVCA9IDA7CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgICAgIGludCBzazEsIHNrMjsKKyAgICAgICAgc29ja2FkZHJfc3RvcmFnZV90IGxvb3AxOworICAgICAgICBzb2NrYWRkcl9zdG9yYWdlX3QgbG9vcDI7CisJc29ja2FkZHJfc3RvcmFnZV90IG1zZ25hbWU7CisgICAgICAgIHN0cnVjdCBpb3ZlYyBpb3Y7CisgICAgICAgIHN0cnVjdCBtc2doZHIgaW5tZXNzYWdlOworCXN0cnVjdCBtc2doZHIgb3V0bWVzc2FnZTsKKwljaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzY3RwX2Ntc2dfZGF0YV90KSldOworCWNoYXIgb3V0Y21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSldOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvOworICAgICAgICBzdHJ1Y3QgaW92ZWMgb3V0X2lvdjsKKyAgICAgICAgY2hhciAqbWVzc2FnZSA9ICJoZWxsbywgd29ybGQhXG4iOworICAgICAgICBjaGFyICp0ZWxlcGhvbmUgPSAiV2F0c29uLCBjb21lIGhlcmUhICBJIG5lZWQgeW91IVxuIjsKKyAgICAgICAgY2hhciAqdGVsZXBob25lX3Jlc3AgPSAiSSBhbHJlYWR5IGJyb3VnaHQgeW91ciBjb2ZmZWUuLi5cbiI7CisgICAgICAgIGludCBlcnJvciwgYnl0ZXNfc2VudDsKKwlpbnQgcGZfY2xhc3M7CisJdWludDMyX3QgcHBpZDsKKwl1aW50MzJfdCBzdHJlYW07CisJc2N0cF9hc3NvY190IGFzc29jaWQxLCBhc3NvY2lkMjsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKnNhYzsKKwljaGFyICpiaWdfYnVmZmVyOworCXN0cnVjdCBzb2NrYWRkciAqbGFkZHJzLCAqcGFkZHJzOworCWludCBuX2xhZGRycywgbl9wYWRkcnMsIGk7CisJc3RydWN0IHNvY2thZGRyICpzYV9hZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqaW5fYWRkcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42ICppbjZfYWRkcjsKKwl2b2lkICphZGRyX2J1ZjsKKworICAgICAgICAvKiBSYXRoZXIgdGhhbiBmZmx1c2goKSB0aHJvdWdob3V0IHRoZSBjb2RlLCBzZXQgc3Rkb3V0IHRvIAorCSAqIGJlIHVuYnVmZmVyZWQuIAorCSAqLworCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOyAKKworCS8qIFNldCBzb21lIGJhc2ljIHZhbHVlcyB3aGljaCBkZXBlbmQgb24gdGhlIGFkZHJlc3MgZmFtaWx5LiAqLworI2lmIFRFU1RfVjYKKwlwZl9jbGFzcyA9IFBGX0lORVQ2OworCisgICAgICAgIGxvb3AxLnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgICAgICAgIGxvb3AxLnY2LnNpbjZfYWRkciA9IChzdHJ1Y3QgaW42X2FkZHIpU0NUUF9JTjZBRERSX0FOWV9JTklUOworICAgICAgICBsb29wMS52Ni5zaW42X3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCisgICAgICAgIGxvb3AyLnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgICAgICAgIGxvb3AyLnY2LnNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7CisgICAgICAgIGxvb3AyLnY2LnNpbjZfcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMik7CisjZWxzZQorCXBmX2NsYXNzID0gUEZfSU5FVDsKKworICAgICAgICBsb29wMS52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgbG9vcDEudjQuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKyAgICAgICAgbG9vcDEudjQuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCisgICAgICAgIGxvb3AyLnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBsb29wMi52NC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworICAgICAgICBsb29wMi52NC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMik7CisjZW5kaWYgLyogVEVTVF9WNiAqLworCisgICAgICAgIC8qIENyZWF0ZSB0aGUgdHdvIGVuZHBvaW50cyB3aGljaCB3aWxsIHRhbGsgdG8gZWFjaCBvdGhlci4gICovCisgICAgICAgIHNrMSA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NFUVBBQ0tFVCwgSVBQUk9UT19TQ1RQKTsKKyAgICAgICAgc2syID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCisJdHN0X3Jlc20oVFBBU1MsICJzb2NrZXQiKTsKKworICAgICAgICAvKiBCaW5kIHRoZXNlIHNvY2tldHMgdG8gdGhlIHRlc3QgcG9ydHMuICAqLworICAgICAgICB0ZXN0X2JpbmQoc2sxLCAmbG9vcDEuc2EsIHNpemVvZihsb29wMSkpOworICAgICAgICB0ZXN0X2JpbmQoc2syLCAmbG9vcDIuc2EsIHNpemVvZihsb29wMikpOworCisJdHN0X3Jlc20oVFBBU1MsICJiaW5kIik7CisKKwkvKiBFbmFibGUgQVNTT0NfQ0hBTkdFIGFuZCBTTkRSQ1ZJTkZPIG5vdGlmaWNhdGlvbnMuICovCisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKHNrMSk7CisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKHNrMik7CisKKyAgICAgICAgLyogSW5pdGlhbGl6ZSBpbm1lc3NhZ2UgZm9yIGFsbCByZWNlaXZlcy4gKi8KKwliaWdfYnVmZmVyID0gdGVzdF9tYWxsb2MoUkVBTExZX0JJRyk7CisJbWVtc2V0KCZpbm1lc3NhZ2UsIDAsIHNpemVvZihpbm1lc3NhZ2UpKTsJCisgICAgICAgIGlvdi5pb3ZfYmFzZSA9IGJpZ19idWZmZXI7CisgICAgICAgIGlvdi5pb3ZfbGVuID0gUkVBTExZX0JJRzsKKyAgICAgICAgaW5tZXNzYWdlLm1zZ19pb3YgPSAmaW92OworICAgICAgICBpbm1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisgICAgICAgIGlubWVzc2FnZS5tc2dfY29udHJvbCA9IGluY21zZzsKKwlpbm1lc3NhZ2UubXNnX25hbWUgPSAmbXNnbmFtZTsKKworICAgICAgICAvKiBUcnkgdG8gcmVhZCBvbiBzb2NrZXQgMi4gIFRoaXMgc2hvdWxkIGZhaWwgc2luY2Ugd2UgYXJlCisJICogbmVpdGhlciBsaXN0ZW5pbmcsIG5vciBlc3RhYmxpc2hlZC4gCisJICovCisgICAgICAgIGlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworICAgICAgICBlcnJvciA9IHJlY3Ztc2coc2syLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisgICAgICAgIGlmIChlcnJvciA+IDApCisgICAgICAgICAgICAgICAgdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicmVjdm1zZyBvbiBhIHNvY2tldCBuZWl0aGVyIgorCQkJICJsaXN0ZW5pbmcgbm9yIGVzdGFibGlzaGVkIGVycm9yOiAlZCIsIGVycm9yKTsKKworCXRzdF9yZXNtKFRQQVNTLCAicmVjdm1zZyBvbiBhIHNvY2tldCBuZWl0aGVyIGxpc3RlbmluZyBub3IgIgorCQkgImVzdGFibGlzaGVkIik7CisKKyAgICAgICAvKiBNYXJrIHNrMiBhcyBiZWluZyBhYmxlIHRvIGFjY2VwdCBuZXcgYXNzb2NpYXRpb25zLiAgKi8KKwllcnJvciA9IHRlc3RfbGlzdGVuKHNrMiwgMSk7CisgICAgICAgIAorCXRzdF9yZXNtKFRQQVNTLCAibGlzdGVuIik7CisKKyAgICAgICAgLyogU2VuZCB0aGUgZmlyc3QgbWVzc2FnZS4gIFRoaXMgd2lsbCBjcmVhdGUgdGhlIGFzc29jaWF0aW9uLiAgKi8KKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfbmFtZSA9ICZsb29wMjsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfbmFtZWxlbiA9IHNpemVvZihsb29wMik7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2lvdiA9ICZvdXRfaW92OworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19jb250cm9sID0gb3V0Y21zZzsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihvdXRjbXNnKTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfZmxhZ3MgPSAwOworCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZvdXRtZXNzYWdlKTsKKwljbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworCWNtc2ctPmNtc2dfdHlwZSA9IFNDVFBfU05EUkNWOworCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47CisJc2luZm8gPSAoc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqKUNNU0dfREFUQShjbXNnKTsKKwltZW1zZXQoc2luZm8sIDB4MDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJcHBpZCA9IHJhbmQoKTsgLyogQ2hvb3NlIGFuIGFyYml0cmFyeSB2YWx1ZS4gKi8KKwlzdHJlYW0gPSAxOyAKKwlzaW5mby0+c2luZm9fcHBpZCA9IHBwaWQ7CisJc2luZm8tPnNpbmZvX3N0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfYmFzZSA9IG1lc3NhZ2U7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2lvdi0+aW92X2xlbiA9IHN0cmxlbihtZXNzYWdlKSArIDE7CisgICAgICAgIHRlc3Rfc2VuZG1zZyhzazEsICZvdXRtZXNzYWdlLCAwLCBzdHJsZW4obWVzc2FnZSkrMSk7CisgICAgICAgIAorCXRzdF9yZXNtKFRQQVNTLCAic2VuZG1zZyB3aXRoIGEgdmFsaWQgbXNnX25hbWUiKTsKKworICAgICAgICAvKiBHZXQgdGhlIGNvbW11bmljYXRpb24gdXAgbWVzc2FnZSBvbiBzazIuICAqLworICAgICAgICBpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwlpbm1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2YobXNnbmFtZSk7CisgICAgICAgIGVycm9yID0gdGVzdF9yZWN2bXNnKHNrMiwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOwkKKyNpZiBURVNUX1Y2CisKKwlpZiAoaW5tZXNzYWdlLm1zZ19uYW1lbGVuICE9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KSkgeworCQlEVU1QX0NPUkU7CisJfQorCWlmIChtc2duYW1lLnY2LnNpbjZfcG9ydCAhPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpKSB7CisJCURVTVBfQ09SRTsKKwl9CisKKwlpZiAobXNnbmFtZS52Ni5zaW42X2ZhbWlseSAhPSBBRl9JTkVUNikgeworCQlEVU1QX0NPUkU7CisJfQorCisJaWYgKG1lbWNtcCgmbXNnbmFtZS52Ni5zaW42X2FkZHIsICZpbjZhZGRyX2xvb3BiYWNrLCAKKwkJICAgc2l6ZW9mKG1zZ25hbWUudjYuc2luNl9hZGRyKSkpIHsKKwkJRFVNUF9DT1JFOworCX0KKyNlbHNlIAorCWlmIChpbm1lc3NhZ2UubXNnX25hbWVsZW4gIT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpIHsKKwkJRFVNUF9DT1JFOworCX0KKwlpZiAobXNnbmFtZS52NC5zaW5fcG9ydCAhPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpKSB7CisJCURVTVBfQ09SRTsKKwl9CisKKwlpZiAobXNnbmFtZS52NC5zaW5fZmFtaWx5ICE9IEFGX0lORVQpIHsKKwkJRFVNUF9DT1JFOworCX0KKwlpZiAobXNnbmFtZS52NC5zaW5fYWRkci5zX2FkZHIgIT0gU0NUUF9JUF9MT09QQkFDSykgeworCQlEVU1QX0NPUkU7CisJfQorI2VuZGlmCisJc2FjID0gKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSAqKWlvdi5pb3ZfYmFzZTsKKwlhc3NvY2lkMiA9IHNhYy0+c2FjX2Fzc29jX2lkOworCisgICAgICAgIC8qIEdldCB0aGUgY29tbXVuaWNhdGlvbiB1cCBtZXNzYWdlIG9uIHNrMS4gICovCisJaW92Lmlvdl9iYXNlID0gYmlnX2J1ZmZlcjsKKyAgICAgICAgaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworICAgICAgICBpbm1lc3NhZ2UubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisgICAgICAgIGlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworICAgICAgICBlcnJvciA9IHRlc3RfcmVjdm1zZyhzazEsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsIAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfQ09NTV9VUCk7CQorCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKilpb3YuaW92X2Jhc2U7CisJYXNzb2NpZDEgPSBzYWMtPnNhY19hc3NvY19pZDsKKworCXRzdF9yZXNtKFRQQVNTLCAicmVjdm1zZyBDT01NX1VQIG5vdGlmaWNhdGlvbnMiKTsKKworICAgICAgICAvKiBHZXQgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggd2FzIHNlbnQuICAqLworICAgICAgICBpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwlpbm1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2YobXNnbmFtZSk7CisJbWVtc2V0KCZtc2duYW1lLCAwLCBzaXplb2YobXNnbmFtZSkpOworICAgICAgICBlcnJvciA9IHRlc3RfcmVjdm1zZyhzazIsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKyAgICAgICAgdGVzdF9jaGVja19tc2dfZGF0YSgmaW5tZXNzYWdlLCBlcnJvciwgc3RybGVuKG1lc3NhZ2UpICsgMSwKKwkJCSAgICBNU0dfRU9SLCBzdHJlYW0sIHBwaWQpOworI2lmIFRFU1RfVjYKKworCWlmIChpbm1lc3NhZ2UubXNnX25hbWVsZW4gIT0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpKSB7CisJCURVTVBfQ09SRTsKKwl9CisJaWYgKG1zZ25hbWUudjYuc2luNl9wb3J0ICE9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSkpIHsKKwkJRFVNUF9DT1JFOworCX0KKworCWlmIChtc2duYW1lLnY2LnNpbjZfZmFtaWx5ICE9IEFGX0lORVQ2KSB7CisJCURVTVBfQ09SRTsKKwl9CisKKwlpZiAobWVtY21wKCZtc2duYW1lLnY2LnNpbjZfYWRkciwgJmluNmFkZHJfbG9vcGJhY2ssIAorCQkgICBzaXplb2YobXNnbmFtZS52Ni5zaW42X2FkZHIpKSkgeworCQlEVU1QX0NPUkU7CisJfQorI2Vsc2UgCisJaWYgKGlubWVzc2FnZS5tc2dfbmFtZWxlbiAhPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSkgeworCQlEVU1QX0NPUkU7CisJfQorCWlmIChtc2duYW1lLnY0LnNpbl9wb3J0ICE9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSkpIHsKKwkJRFVNUF9DT1JFOworCX0KKwlpZiAobXNnbmFtZS52NC5zaW5fZmFtaWx5ICE9IEFGX0lORVQpIHsKKwkJRFVNUF9DT1JFOworCX0KKwlpZiAobXNnbmFtZS52NC5zaW5fYWRkci5zX2FkZHIgIT0gU0NUUF9JUF9MT09QQkFDSykgeworCQlEVU1QX0NPUkU7CisJfQorI2VuZGlmCisKKwkvKiBUcnkgdG8gc2VuZCBhIG1lc3NhZ2Ugd2l0aCBOVUxMIG1zZ19uYW1lIGFuZCBhc3NvY2lkLCBzaG91bGQgZmFpbCAqLworICAgICAgICBvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKG91dGNtc2cpOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19mbGFncyA9IDA7CisJY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1lc3NhZ2UpOworCWNtc2ctPmNtc2dfbGV2ZWwgPSBJUFBST1RPX1NDVFA7CisJY21zZy0+Y21zZ190eXBlID0gU0NUUF9TTkRSQ1Y7CisJY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCW91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKKwlzaW5mbyA9IChzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICopQ01TR19EQVRBKGNtc2cpOworCW1lbXNldChzaW5mbywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlwcGlkKys7CisJc3RyZWFtKys7CisJc2luZm8tPnNpbmZvX3BwaWQgPSBwcGlkOworCXNpbmZvLT5zaW5mb19zdHJlYW0gPSBzdHJlYW07CisJb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfYmFzZSA9IHRlbGVwaG9uZTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfbGVuID0gc3RybGVuKHRlbGVwaG9uZSkgKyAxOworCW91dG1lc3NhZ2UubXNnX25hbWUgPSBOVUxMOworCW91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSAwOworCWJ5dGVzX3NlbnQgPSBzZW5kbXNnKHNrMSwgJm91dG1lc3NhZ2UsIE1TR19OT1NJR05BTCk7CisJaWYgKChieXRlc19zZW50ID4gMCkgfHwgKEVQSVBFICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2VuZG1zZyB3aXRoIE5VTEwgYXNzb2NpZCBhbmQgIgorCQkJICJOVUxMIG1zZ19uYW1lIGVycm9yOiVkIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2VuZG1zZyB3aXRoIE5VTEwgYXNzb2NpZCBhbmQgTlVMTCBtc2dfbmFtZSIpOworCisJLyogRmlsbCBpbiBhIGluY29ycmVjdCBhc3NvY19pZCwgd2hpY2ggc2hvdWxkIGNhdXNlIGFuIGVycm9yLiAqLworCXNpbmZvLT5zaW5mb19hc3NvY19pZCA9IGFzc29jaWQyOworCWJ5dGVzX3NlbnQgPSBzZW5kbXNnKHNrMSwgJm91dG1lc3NhZ2UsIE1TR19OT1NJR05BTCk7CisJaWYgKChieXRlc19zZW50ID4gMCkgfHwgKEVQSVBFICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2VuZG1zZyB3aXRoIGluY29ycmVjdCBhc3NvY2lkICIKKwkJCSAiZXJyb3I6JWQgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kbXNnIHdpdGggaW5jb3JyZWN0IGFzc29jaWQiKTsKKworCS8qIEZpbGwgaW4gYSBjb3JyZWN0IGFzc29jX2lkIGFuZCBnZXQgYmFjayB0byB0aGUgbm9ybWFsIHRlc3RpbmcuICovCisJc2luZm8tPnNpbmZvX2Fzc29jX2lkID0gYXNzb2NpZDE7CisgICAgICAgIC8qIFNlbmQgdHdvIG1vcmUgbWVzc2FnZXMsIHRvIGNhdXNlIGEgc2Vjb25kIFNBQ0suICAqLworCXRlc3Rfc2VuZG1zZyhzazEsICZvdXRtZXNzYWdlLCAwLCBzdHJsZW4odGVsZXBob25lKSsxKTsKKworCW91dG1lc3NhZ2UubXNnX25hbWUgPSAmbG9vcDI7CisJb3V0bWVzc2FnZS5tc2dfbmFtZWxlbiA9IHNpemVvZihsb29wMik7CisJb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfYmFzZSA9IHRlbGVwaG9uZV9yZXNwOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9sZW4gPSBzdHJsZW4odGVsZXBob25lX3Jlc3ApICsgMTsKKwl0ZXN0X3NlbmRtc2coc2sxLCAmb3V0bWVzc2FnZSwgMCwgc3RybGVuKHRlbGVwaG9uZV9yZXNwKSsxKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2VuZG1zZyB3aXRoIHZhbGlkIGFzc29jaWQiKTsKKworICAgICAgICAvKiBHZXQgdGhvc2UgdHdvIG1lc3NhZ2VzLiAgKi8KKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKyAgICAgICAgZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc2syLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisgICAgICAgIHRlc3RfY2hlY2tfbXNnX2RhdGEoJmlubWVzc2FnZSwgZXJyb3IsIHN0cmxlbih0ZWxlcGhvbmUpICsgMSwKKwkJCSAgICBNU0dfRU9SLCBzdHJlYW0sIHBwaWQpOworCisJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisgICAgICAgIGVycm9yID0gdGVzdF9yZWN2bXNnKHNrMiwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworICAgICAgICB0ZXN0X2NoZWNrX21zZ19kYXRhKCZpbm1lc3NhZ2UsIGVycm9yLCBzdHJsZW4odGVsZXBob25lX3Jlc3ApICsgMSwKKwkJCSAgICBNU0dfRU9SLCBzdHJlYW0sIHBwaWQpOworICAgICAgIAorCXRzdF9yZXNtKFRQQVNTLCAicmVjdm1zZyIpOworCisJbl9sYWRkcnMgPSBzY3RwX2dldGxhZGRycyhzazEsIGFzc29jaWQxLCAmbGFkZHJzKTsgCisJaWYgKG5fbGFkZHJzIDw9IDApCisgICAgICAgICAgICAgICAgdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2N0cF9nZXRsYWRkcnM6ICVzIiwKKwkJCSBzdHJlcnJvcihlcnJubykpOworCisJdHN0X3Jlc20oVFBBU1MsICJzY3RwX2dldGxhZGRycyIpOworCisJYWRkcl9idWYgPSAodm9pZCAqKWxhZGRyczsKKwlmb3IgKGkgPSAwOyBpIDwgbl9sYWRkcnM7IGkrKykgeworCQlzYV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJfYnVmOworCQlpZiAoQUZfSU5FVCA9PSBzYV9hZGRyLT5zYV9mYW1pbHkpIHsKKwkJCWluX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopc2FfYWRkcjsKKwkJCXRzdF9yZXNtKFRJTkZPLCAiTE9DQUwgQUREUiAlZC4lZC4lZC4lZCBQT1JUICVkIiwKKwkJCQkgTklQUVVBRChpbl9hZGRyLT5zaW5fYWRkciksCisJCQkJIG50b2hzKGluX2FkZHItPnNpbl9wb3J0KSk7CisJCQlhZGRyX2J1ZiArPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwkJfSBlbHNlIHsKKwkJCWluNl9hZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYV9hZGRyOworCQkJdHN0X3Jlc20oVElORk8sCisJCSAiTE9DQUwgQUREUiAlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHggUE9SVCAlZCIsCisJCQkgICAgICAgTklQNihpbjZfYWRkci0+c2luNl9hZGRyKSwKKwkJCSAgICAgICBudG9ocyhpbjZfYWRkci0+c2luNl9wb3J0KSk7CisJCQlhZGRyX2J1ZiArPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCX0KKwl9CisKKwlzY3RwX2ZyZWVsYWRkcnMobGFkZHJzKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9mcmVlbGFkZHJzIik7CisKKwluX3BhZGRycyA9IHNjdHBfZ2V0cGFkZHJzKHNrMSwgYXNzb2NpZDEsICZwYWRkcnMpOyAKKwlpZiAobl9wYWRkcnMgPD0gMCkKKyAgICAgICAgICAgICAgICB0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX2dldHBhZGRyczogJXMiLAorCQkJIHN0cmVycm9yKGVycm5vKSk7CisKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfZ2V0cGFkZHJzIik7CisKKwlhZGRyX2J1ZiA9ICh2b2lkICopcGFkZHJzOworCWZvciAoaSA9IDA7IGkgPCBuX3BhZGRyczsgaSsrKSB7CisJCXNhX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopYWRkcl9idWY7CisJCWlmIChBRl9JTkVUID09IHNhX2FkZHItPnNhX2ZhbWlseSkgeworCQkJaW5fYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYV9hZGRyOworCQkJdHN0X3Jlc20oVElORk8sICJQRUVSIEFERFIgJWQuJWQuJWQuJWQgUE9SVCAlZCIsCisJCQkJIE5JUFFVQUQoaW5fYWRkci0+c2luX2FkZHIpLAorCQkJCSBudG9ocyhpbl9hZGRyLT5zaW5fcG9ydCkpOworCQkJYWRkcl9idWYgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCX0gZWxzZSB7CisJCQlpbjZfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2FfYWRkcjsKKwkJCXRzdF9yZXNtKFRJTkZPLAorCQkgIlBFRVIgQUREUiAlMDR4OiUwNHg6JTA0eDolMDR4OiUwNHg6JTA0eDolMDR4OiUwNHggUE9SVCAlZCIsCisJCQkgICAgICAgTklQNihpbjZfYWRkci0+c2luNl9hZGRyKSwKKwkJCSAgICAgICBudG9ocyhpbjZfYWRkci0+c2luNl9wb3J0KSk7CisJCQlhZGRyX2J1ZiArPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCX0KKwl9CisKKwlzY3RwX2ZyZWVwYWRkcnMocGFkZHJzKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9mcmVlcGFkZHJzIik7CisKKyAgICAgICAgLyogU2h1dCBkb3duIHRoZSBsaW5rLiAgKi8KKyAgICAgICAgY2xvc2Uoc2sxKTsKKworICAgICAgICAvKiBHZXQgdGhlIHNodXRkb3duIGNvbXBsZXRlIG5vdGlmaWNhdGlvbi4gKi8KKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwlpbm1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2YobXNnbmFtZSk7CisJbWVtc2V0KCZtc2duYW1lLCAwLCBzaXplb2YobXNnbmFtZSkpOworICAgICAgICBlcnJvciA9IHRlc3RfcmVjdm1zZyhzazIsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9TSFVURE9XTl9DT01QKTsJCisjaWYgVEVTVF9WNgorCisJaWYgKGlubWVzc2FnZS5tc2dfbmFtZWxlbiAhPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpIHsKKwkJRFVNUF9DT1JFOworCX0KKwlpZiAobXNnbmFtZS52Ni5zaW42X3BvcnQgIT0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKSkgeworCQlEVU1QX0NPUkU7CisJfQorCisJaWYgKG1zZ25hbWUudjYuc2luNl9mYW1pbHkgIT0gQUZfSU5FVDYpIHsKKwkJRFVNUF9DT1JFOworCX0KKworCWlmIChtZW1jbXAoJm1zZ25hbWUudjYuc2luNl9hZGRyLCAmaW42YWRkcl9sb29wYmFjaywgCisJCSAgIHNpemVvZihtc2duYW1lLnY2LnNpbjZfYWRkcikpKSB7CisJCURVTVBfQ09SRTsKKwl9CisjZWxzZSAKKwlpZiAoaW5tZXNzYWdlLm1zZ19uYW1lbGVuICE9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKSB7CisJCURVTVBfQ09SRTsKKwl9CisJaWYgKG1zZ25hbWUudjQuc2luX3BvcnQgIT0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKSkgeworCQlEVU1QX0NPUkU7CisJfQorCisJaWYgKG1zZ25hbWUudjQuc2luX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisJCURVTVBfQ09SRTsKKwl9CisJaWYgKG1zZ25hbWUudjQuc2luX2FkZHIuc19hZGRyICE9IFNDVFBfSVBfTE9PUEJBQ0spIHsKKwkJRFVNUF9DT1JFOworCX0KKyNlbmRpZgorCQkJCQorCXRzdF9yZXNtKFRQQVNTLCAicmVjdm1zZyBTSFVURE9XTl9DT01QIG5vdGlmaWNhdGlvbiIpOworCisgICAgICAgIGNsb3NlKHNrMik7CisKKyAgICAgICAgLyogSW5kaWNhdGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLiAgKi8KKyAgICAgICAJcmV0dXJuIDA7IAorfQpkaWZmIC0tZ2l0IGEvc3JjL2Z1bmNfdGVzdHMvdGVzdF9jb25uZWN0LmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0X2Nvbm5lY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzNjMjgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF9jb25uZWN0LmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBNb3Rvcm9sYSwgSW5jLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBTcmlkaGFyIFNhbXVkcmFsYQkJPHNyaUB1cy5pYm0uY29tPgorICovCisKKy8qIFRoaXMgaXMgYSBrZXJuZWwgdGVzdCB0byB2ZXJpZnkgdGhlIG9uZS10by1tYW55IHN0eWxlIGNvbm5lY3QoKSBpbiBibG9ja2luZworICogYW5kIG5vbi1ibG9ja2luZyBtb2Rlcy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9zY3RwLmg+CisjaW5jbHVkZSA8c2N0cHV0aWwuaD4KKworY2hhciAqVENJRCA9IF9fRklMRV9fOworaW50IFRTVF9UT1RBTCA9IDU7CitpbnQgVFNUX0NOVCA9IDA7CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBzdnJfc2ssIGNsdF9zazEsIGNsdF9zazIsIHBlZWxvZmZfc2s7CisJc2N0cF9hc3NvY190IHN2cl9hc3NvY2lkMTsKKwlzb2NrYWRkcl9zdG9yYWdlX3Qgc3ZyX2xvb3AsIGNsdF9sb29wMSwgY2x0X2xvb3AyLCBjbHRfbG9vcDM7CisJc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICpzYWM7CisJc3RydWN0IGlvdmVjIGlvdjsKKwlzdHJ1Y3QgbXNnaGRyIGlubWVzc2FnZTsKKwlpbnQgZXJyb3I7CisJY2hhciAqYmlnX2J1ZmZlcjsKKwlpbnQgZmxhZ3M7CisKKyAgICAgICAgLyogUmF0aGVyIHRoYW4gZmZsdXNoKCkgdGhyb3VnaG91dCB0aGUgY29kZSwgc2V0IHN0ZG91dCB0byAKKwkgKiBiZSB1bmJ1ZmZlcmVkLiAgCisJICovIAorCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOyAKKworCS8qIEluaXRpYWxpemUgdGhlIHNlcnZlciBhbmQgY2xpZW50IGFkZHJlc3Nlcy4gKi8gCisJc3ZyX2xvb3AudjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc3ZyX2xvb3AudjQuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKwlzdnJfbG9vcC52NC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisJY2x0X2xvb3AxLnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWNsdF9sb29wMS52NC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCWNsdF9sb29wMS52NC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMik7CisJY2x0X2xvb3AyLnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWNsdF9sb29wMi52NC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCWNsdF9sb29wMi52NC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMisxKTsKKwljbHRfbG9vcDMudjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJY2x0X2xvb3AzLnY0LnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisJY2x0X2xvb3AzLnY0LnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8yKzIpOworCisJLyogQ3JlYXRlIGFuZCBiaW5kIHRoZSBzZXJ2ZXIgc29ja2V0LiAgKi8KKyAgICAgICAgc3ZyX3NrID0gdGVzdF9zb2NrZXQoQUZfSU5FVCwgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisJdGVzdF9iaW5kKHN2cl9zaywgJnN2cl9sb29wLnNhLCBzaXplb2Yoc3ZyX2xvb3ApKTsKKworCS8qIE1hcmsgc2VydmVyIHNvY2tldCBhcyBiZWluZyBhYmxlIHRvIGFjY2VwdCBuZXcgYXNzb2NpYXRpb25zLiAgKi8KKwl0ZXN0X2xpc3RlbihzdnJfc2ssIDEpOworCisJLyogQ3JlYXRlIGFuZCBiaW5kIHRoZSBjbGllbnQgc29ja2V0cy4gICovCisJY2x0X3NrMSA9IHRlc3Rfc29ja2V0KEFGX0lORVQsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCXRlc3RfYmluZChjbHRfc2sxLCAmY2x0X2xvb3AxLnNhLCBzaXplb2YoY2x0X2xvb3AxKSk7CisJY2x0X3NrMiA9IHRlc3Rfc29ja2V0KEFGX0lORVQsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCXRlc3RfYmluZChjbHRfc2syLCAmY2x0X2xvb3AyLnNhLCBzaXplb2YoY2x0X2xvb3AyKSk7CisKKwkvKiBFbmFibGUgQVNTT0NfQ0hBTkdFIGFuZCBTTkRSQ1ZJTkZPIG5vdGlmaWNhdGlvbnMuICovCisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKHN2cl9zayk7CisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKGNsdF9zazEpOworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZShjbHRfc2syKTsKKworCS8qIFNldCBjbHRfc2sxIGFzIG5vbi1ibG9ja2luZy4gKi8KKwlmbGFncyA9IGZjbnRsKGNsdF9zazEsIEZfR0VURkwsIDApOworCWlmIChmbGFncyA8IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImZjbnRsIEZfR0VURkw6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoZmNudGwoY2x0X3NrMSwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSA8IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImZjbnRsIEZfU0VURkw6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qIERvIGEgbm9uLWJsb2NraW5nIGNvbm5lY3QgZnJvbSBjbHRfc2sxIHRvIHN2cl9zayAqLyAgICAgIAorCWVycm9yID0gY29ubmVjdChjbHRfc2sxLCAmc3ZyX2xvb3Auc2EsIHNpemVvZihzdnJfbG9vcCkpOworCS8qIE5vbi1ibG9ja2luZyBjb25uZWN0IHNob3VsZCByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aCBFSU5QUk9HUkVTUy4gKi8KKwlpZiAoKGVycm9yICE9IC0xKSB8fCAoRUlOUFJPR1JFU1MgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJub24tYmxvY2tpbmcgY29ubmVjdCBlcnJvcjogJWQiCisJCQkgImVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAibm9uLWJsb2NraW5nIGNvbm5lY3QiKTsKKworCS8qIERvaW5nIGEgY29ubmVjdCBvbiBhIHNvY2tldCB0byBjcmVhdGUgYW4gYXNzb2NpYXRpb24gdGhhdCBpcworCSAqIGlzIGFscmVhZHkgZXN0YWJsaXNoZWQgc2hvdWxkIHJldHVybiBFSVNDT05OLgorCSAqLworCWVycm9yID0gY29ubmVjdChjbHRfc2sxLCAmc3ZyX2xvb3Auc2EsIHNpemVvZihzdnJfbG9vcCkpOworCWlmICgoZXJyb3IgIT0gLTEpIHx8IChFSVNDT05OICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiY29ubmVjdCBvbiBhIHNvY2tldCB0byBjcmVhdGUgYW4gIgorCQkJICJhc3NvYyB0aGF0IGlzIGFscmVhZHkgZXN0YWJsaXNoZWQgZXJyb3I6JWQgZXJybm86JWQiLAorCQkJIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImNvbm5lY3Qgb24gYSBzb2NrZXQgdG8gY3JlYXRlIGFuIGFzc29jIHRoYXQgaXMgIgorCQkgImFscmVhZHkgZXN0YWJsaXNoZWQiKTsKKworCS8qIEluaXRpYWxpemUgaW5tZXNzYWdlIGZvciBhbGwgcmVjZWl2ZXMuICovCisgICAgICAgIG1lbXNldCgmaW5tZXNzYWdlLCAwLCBzaXplb2YoaW5tZXNzYWdlKSk7CisJYmlnX2J1ZmZlciA9IHRlc3RfbWFsbG9jKFJFQUxMWV9CSUcpOworCWlvdi5pb3ZfYmFzZSA9IGJpZ19idWZmZXI7CisJaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworCWlubWVzc2FnZS5tc2dfaW92ID0gJmlvdjsKKwlpbm1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisJaW5tZXNzYWdlLm1zZ19jb250cm9sID0gTlVMTDsKKworCS8qIEdldCBDT01NX1VQIG9uIGNsdF9zazEgKi8KKwllcnJvciA9IHRlc3RfcmVjdm1zZyhjbHRfc2sxLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfQ09NTV9VUCk7CisjaWYgMAorCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKilpb3YuaW92X2Jhc2U7CisJY2x0X2Fzc29jaWQxID0gc2FjLT5zYWNfYXNzb2NfaWQ7CisjZW5kaWYKKworCS8qIEdldCBDT01NX1VQIG9uIHN2cl9zayAqLworCWVycm9yID0gdGVzdF9yZWN2bXNnKHN2cl9zaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOworCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKilpb3YuaW92X2Jhc2U7CisJc3ZyX2Fzc29jaWQxID0gc2FjLT5zYWNfYXNzb2NfaWQ7CisKKwkvKiBEbyBhIGJsb2NraW5nIGNvbm5lY3QgZnJvbSBjbHRfc2syIHRvIHN2cl9zay4gCisJICogQmxvY2tpbmcgY29ubmVjdCBzaG91bGQgYmxvY2sgdW50aWwgdGhlIGFzc29jaWF0aW9uIGlzIGVzdGFibGlzaGVkCisJICogYW5kIHJldHVybiBzdWNjZXNzLgorCSAqLworCXRlc3RfY29ubmVjdChjbHRfc2syLCAmc3ZyX2xvb3Auc2EsIHNpemVvZihzdnJfbG9vcCkpOworCisJLyogR2V0IENPTU1fVVAgb24gY2x0X3NrMiAqLworCWVycm9yID0gdGVzdF9yZWN2bXNnKGNsdF9zazIsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9DT01NX1VQKTsKKyNpZiAwCisJc2FjID0gKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSAqKWlvdi5pb3ZfYmFzZTsKKwljbHRfYXNzb2NpZDIgPSBzYWMtPnNhY19hc3NvY19pZDsKKyNlbmRpZgorCisJLyogR2V0IENPTU1fVVAgb24gc3ZyX3NrICovCisJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc3ZyX3NrLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfQ09NTV9VUCk7CisjaWYgMAorCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKilpb3YuaW92X2Jhc2U7CisJc3ZyX2Fzc29jaWQyID0gc2FjLT5zYWNfYXNzb2NfaWQ7CisjZW5kaWYKKworCXRzdF9yZXNtKFRQQVNTLCAiYmxvY2tpbmcgY29ubmVjdCIpOworCisJcGVlbG9mZl9zayA9IHRlc3Rfc2N0cF9wZWVsb2ZmKHN2cl9zaywgc3ZyX2Fzc29jaWQxKTsgCisKKwkvKiBEb2luZyBhIGNvbm5lY3Qgb24gYSBwZWVsZWQgb2ZmIHNvY2tldCBzaG91bGQgZmFpbC4gKi8KKwllcnJvciA9IGNvbm5lY3QocGVlbG9mZl9zaywgJmNsdF9sb29wMy5zYSwgc2l6ZW9mKGNsdF9sb29wMykpOworCWlmICgoZXJyb3IgIT0gLTEpIHx8IChFSVNDT05OICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiY29ubmVjdCBvbiBhIHBlZWxlZCBvZmYgc29ja2V0ICIKKwkJCSAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiY29ubmVjdCBvbiBhIHBlZWxlZCBvZmYgc29ja2V0Iik7CisKKwkvKiBUcnlpbmcgdG8gY3JlYXRlIGFuIGFzc29jaWF0aW9uIG9uIGEgc29ja2V0IHRoYXQgbWF0Y2hlcyBhbiAKKwkgKiBleGlzdGluZyBwZWVsZWQtb2ZmIGFzc29jaWF0aW9uIHNob3VsZCBmYWlsLgorCSAqLworCWVycm9yID0gY29ubmVjdChzdnJfc2ssICZjbHRfbG9vcDEuc2EsIHNpemVvZihjbHRfbG9vcDEpKTsKKwlpZiAoKGVycm9yICE9IC0xKSB8fCAoRUFERFJOT1RBVkFJTCAhPSBlcnJubykpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImNvbm5lY3QgdG8gY3JlYXRlIGFuIGFzc29jIHRoYXQgIgorCQkJICJtYXRjaGVzIGEgcGVlbGVkIG9mZiBhc3NvYyBlcnJvcjolZCBlcnJubzolZCIsCisJCQkgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiY29ubmVjdCB0byBjcmVhdGUgYW4gYXNzb2MgdGhhdCBtYXRjaGVzIGEgcGVlbGVkIG9mZiAiCisJCSAiYXNzb2MiKTsKKworCWNsb3NlKHN2cl9zayk7CisJY2xvc2UoY2x0X3NrMSk7CisJY2xvc2UoY2x0X3NrMik7CisJY2xvc2UocGVlbG9mZl9zayk7CisKKyAgICAgICAgLyogSW5kaWNhdGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLiAgKi8KKyAgICAgICAJcmV0dXJuIDA7IAorfQpkaWZmIC0tZ2l0IGEvc3JjL2Z1bmNfdGVzdHMvdGVzdF9jb25uZWN0eC5jIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF9jb25uZWN0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NzcyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZnVuY190ZXN0cy90ZXN0X2Nvbm5lY3R4LmMKQEAgLTAsMCArMSwyNzAgQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBNb3Rvcm9sYSwgSW5jLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgZ2l2ZW4gdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBTcmlkaGFyIFNhbXVkcmFsYQkJPHNyaUB1cy5pYm0uY29tPgorICovCisKKy8qIFRoaXMgaXMgYSBrZXJuZWwgdGVzdCB0byB2ZXJpZnkgdGhlIG9uZS10by1tYW55IHN0eWxlIHNjdHBfY29ubmVjdHgoKQorICogaW4gYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZyBtb2Rlcy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9zY3RwLmg+CisjaW5jbHVkZSA8c2N0cHV0aWwuaD4KKworY2hhciAqVENJRCA9IF9fRklMRV9fOworaW50IFRTVF9UT1RBTCA9IDk7CitpbnQgVFNUX0NOVCA9IDA7CisKKyNkZWZpbmUgTlVNQUREUiA2CisjZGVmaW5lIFNDVFBfSVBfTE9PUEJBQ0tfSShJKSAgaHRvbmwoMHg3ZjAwMDAwMSArIEkpCisKKyNkZWZpbmUgTklQUVVBRChhZGRyKSBcCisJKCh1bnNpZ25lZCBjaGFyICopJmFkZHIpWzBdLCBcCisJKCh1bnNpZ25lZCBjaGFyICopJmFkZHIpWzFdLCBcCisJKCh1bnNpZ25lZCBjaGFyICopJmFkZHIpWzJdLCBcCisJKCh1bnNpZ25lZCBjaGFyICopJmFkZHIpWzNdCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBzdnJfc2ssIGNsdF9zazEsIGNsdF9zazIsIHBlZWxvZmZfc2s7CisJc2N0cF9hc3NvY190IGFzc29jaWQsIHN2cl9hc3NvY2lkMSwgc3ZyX2Fzc29jaWQyLCBjbHRfYXNzb2NpZDEsIGNsdF9hc3NvY2lkMjsKKwlzdHJ1Y3QgaW92ZWMgaW92OworCXN0cnVjdCBtc2doZHIgaW5tZXNzYWdlOworCWludCBlcnJvciwgaTsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKnNhYzsKKwljaGFyICpiaWdfYnVmZmVyOworCWludCBmbGFnczsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc3ZyX2xvb3BbTlVNQUREUl07CisJc3RydWN0IHNvY2thZGRyX2luIHN2cl90cnlbTlVNQUREUl07CisJc3RydWN0IHNvY2thZGRyX2luIGNsdF9sb29wMVtOVU1BRERSXTsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gY2x0X2xvb3AyW05VTUFERFJdOworCXN0cnVjdCBzb2NrYWRkcl9pbiBjbHRfbG9vcDNbTlVNQUREUl07CisJc29ja2FkZHJfc3RvcmFnZV90IHN2cl90ZXN0W05VTUFERFJdLCBjbHRfdGVzdDFbTlVNQUREUl0sIGNsdF90ZXN0MltOVU1BRERSXTsKKworCS8qIFJhdGhlciB0aGFuIGZmbHVzaCgpIHRocm91Z2hvdXQgdGhlIGNvZGUsIHNldCBzdGRvdXQgdG8gCisJICogYmUgdW5idWZmZXJlZC4gIAorCSAqLyAKKwlzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsgCisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNQUREUjsgaSsrKSB7CisJCS8qIEluaXRpYWxpemUgdGhlIHNlcnZlciBhbmQgY2xpZW50IGFkZHJlc3Nlcy4gKi8gCisJCXN2cl9sb29wW2ldLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlzdnJfbG9vcFtpXS5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLX0koaSk7CisJCXN2cl9sb29wW2ldLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKwkJc3ZyX3Rlc3RbaV0udjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCXN2cl90ZXN0W2ldLnY0LnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0tfSShpKTsKKwkJc3ZyX3Rlc3RbaV0udjQuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCQlzdnJfdHJ5W2ldLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQlpZiAoaSA8IChOVU1BRERSLTEpKSB7CisJCQlzdnJfdHJ5W2ldLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0tfSShpKTsKKwkJfSBlbHNlIHsKKwkJCS8qIE1ha2UgbGFzdCBhZGRyZXNzIGludmFsaWQuICovCisJCQlzdnJfdHJ5W2ldLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0tfSShpICsgMHg0MDApOworCQl9CisJCXN2cl90cnlbaV0uc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCQljbHRfbG9vcDFbaV0uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCWNsdF9sb29wMVtpXS5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLX0koaSArIDB4MTAwKTsKKwkJY2x0X2xvb3AxW2ldLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8yKTsKKwkJY2x0X3Rlc3QxW2ldLnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQljbHRfdGVzdDFbaV0udjQuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDS19JKGkgKyAweDEwMCk7CisJCWNsdF90ZXN0MVtpXS52NC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMik7CisJCWNsdF9sb29wMltpXS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJY2x0X2xvb3AyW2ldLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0tfSShpICsgMHgyMDApOworCQljbHRfbG9vcDJbaV0uc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzIrMSk7CisJCWNsdF90ZXN0MltpXS52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJY2x0X3Rlc3QyW2ldLnY0LnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0tfSShpICsgMHgyMDApOworCQljbHRfdGVzdDJbaV0udjQuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzIrMSk7CisJCWNsdF9sb29wM1tpXS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJY2x0X2xvb3AzW2ldLnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0tfSShpICsgMHgzMDApOworCQljbHRfbG9vcDNbaV0uc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzIrMik7CisJfQorCisJLyogQ3JlYXRlIGFuZCBiaW5kIHRoZSBzZXJ2ZXIgc29ja2V0LiAgKi8KKwlzdnJfc2sgPSB0ZXN0X3NvY2tldChBRl9JTkVULCBTT0NLX1NFUVBBQ0tFVCwgSVBQUk9UT19TQ1RQKTsKKwl0ZXN0X2JpbmQoc3ZyX3NrLCAoc3RydWN0IHNvY2thZGRyICopJnN2cl9sb29wWzBdLCBzaXplb2Yoc3ZyX2xvb3BbMF0pKTsKKwl0ZXN0X2JpbmR4X2FkZChzdnJfc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3ZyX2xvb3BbMV0sIE5VTUFERFItMSk7CisKKwkvKiBNYXJrIHNlcnZlciBzb2NrZXQgYXMgYmVpbmcgYWJsZSB0byBhY2NlcHQgbmV3IGFzc29jaWF0aW9ucy4gICovCisJdGVzdF9saXN0ZW4oc3ZyX3NrLCAxKTsKKworCS8qIENyZWF0ZSBhbmQgYmluZCB0aGUgY2xpZW50IHNvY2tldHMuICAqLworCWNsdF9zazEgPSB0ZXN0X3NvY2tldChBRl9JTkVULCBTT0NLX1NFUVBBQ0tFVCwgSVBQUk9UT19TQ1RQKTsKKwl0ZXN0X2JpbmQoY2x0X3NrMSwgKHN0cnVjdCBzb2NrYWRkciAqKSZjbHRfbG9vcDFbMF0sIHNpemVvZihjbHRfbG9vcDEpKTsKKwl0ZXN0X2JpbmR4X2FkZChjbHRfc2sxLCAoc3RydWN0IHNvY2thZGRyICopJmNsdF9sb29wMVsxXSwgTlVNQUREUi0xKTsKKwljbHRfc2syID0gdGVzdF9zb2NrZXQoQUZfSU5FVCwgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisJdGVzdF9iaW5kKGNsdF9zazIsIChzdHJ1Y3Qgc29ja2FkZHIgKikmY2x0X2xvb3AyWzBdLCBzaXplb2YoY2x0X2xvb3AyKSk7CisJdGVzdF9iaW5keF9hZGQoY2x0X3NrMiwgKHN0cnVjdCBzb2NrYWRkciAqKSZjbHRfbG9vcDJbMV0sIE5VTUFERFItMSk7CisKKwkvKiBFbmFibGUgQVNTT0NfQ0hBTkdFIGFuZCBTTkRSQ1ZJTkZPIG5vdGlmaWNhdGlvbnMuICovCisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKHN2cl9zayk7CisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKGNsdF9zazEpOworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZShjbHRfc2syKTsKKworCS8qIFNldCBjbHRfc2sxIGFzIG5vbi1ibG9ja2luZy4gKi8KKwlmbGFncyA9IGZjbnRsKGNsdF9zazEsIEZfR0VURkwsIDApOworCWlmIChmbGFncyA8IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImZjbnRsIEZfR0VURkw6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAoZmNudGwoY2x0X3NrMSwgRl9TRVRGTCwgZmxhZ3MgfCBPX05PTkJMT0NLKSA8IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImZjbnRsIEZfU0VURkw6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCS8qIERvIGEgbm9uLWJsb2NraW5nIGNvbm5lY3R4IGZyb20gY2x0X3NrMSB0byBzdnJfc2sgKi8gICAgICAKKwllcnJvciA9IHNjdHBfY29ubmVjdHgoY2x0X3NrMSwgKHN0cnVjdCBzb2NrYWRkciAqKXN2cl90cnksIE5VTUFERFIsCisJCQkgICAgICAmYXNzb2NpZCk7CisJLyogTm9uLWJsb2NraW5nIGNvbm5lY3R4IHNob3VsZCByZXR1cm4gaW1tZWRpYXRlbHkgd2l0aCBFSU5QUk9HUkVTUy4gKi8KKwlpZiAoKGVycm9yICE9IC0xKSB8fCAoRUlOUFJPR1JFU1MgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJub24tYmxvY2tpbmcgY29ubmVjdHggZXJyb3I6ICVkIgorCQkJICJlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgIm5vbi1ibG9ja2luZyBjb25uZWN0eCIpOworCisJLyogRG9pbmcgYSBjb25uZWN0eCBvbiBhIHNvY2tldCB0byBjcmVhdGUgYW4gYXNzb2NpYXRpb24gdGhhdCBpcworCSAqIGlzIGFscmVhZHkgZXN0YWJsaXNoZWQgc2hvdWxkIHJldHVybiBFSVNDT05OLgorCSAqLworCWVycm9yID0gc2N0cF9jb25uZWN0eChjbHRfc2sxLCAoc3RydWN0IHNvY2thZGRyICopc3ZyX3RyeSwgTlVNQUREUiwKKwkJCSAgICAgIE5VTEwpOworCWlmICgoZXJyb3IgIT0gLTEpIHx8IChFSVNDT05OICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiY29ubmVjdHggb24gYSBzb2NrZXQgdG8gY3JlYXRlIGFuICIKKwkJCSAiYXNzb2MgdGhhdCBpcyBhbHJlYWR5IGVzdGFibGlzaGVkIGVycm9yOiVkIGVycm5vOiVkIiwKKwkJCSBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJjb25uZWN0eCBvbiBhIHNvY2tldCB0byBjcmVhdGUgYW4gYXNzb2MgdGhhdCBpcyAiCisJCSAiYWxyZWFkeSBlc3RhYmxpc2hlZCIpOworCisJLyogSW5pdGlhbGl6ZSBpbm1lc3NhZ2UgZm9yIGFsbCByZWNlaXZlcy4gKi8KKwltZW1zZXQoJmlubWVzc2FnZSwgMCwgc2l6ZW9mKGlubWVzc2FnZSkpOworCWJpZ19idWZmZXIgPSB0ZXN0X21hbGxvYyhSRUFMTFlfQklHKTsKKwlpb3YuaW92X2Jhc2UgPSBiaWdfYnVmZmVyOworCWlvdi5pb3ZfbGVuID0gUkVBTExZX0JJRzsKKwlpbm1lc3NhZ2UubXNnX2lvdiA9ICZpb3Y7CisJaW5tZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworCWlubWVzc2FnZS5tc2dfY29udHJvbCA9IE5VTEw7CisKKwkvKiBHZXQgQ09NTV9VUCBvbiBjbHRfc2sxICovCisJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coY2x0X3NrMSwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOwkKKwlzYWMgPSAoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICopaW92Lmlvdl9iYXNlOworCWNsdF9hc3NvY2lkMSA9IHNhYy0+c2FjX2Fzc29jX2lkOworCisJaWYgKGFzc29jaWQpIHsKKwkJaWYgKGFzc29jaWQgIT0gY2x0X2Fzc29jaWQxKQorCQkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiQXNzb2NpYXRpb24gaWQgbWlzbWF0Y2g6ICIKKwkJCSAiY29ubmVjdHggcmV0dXJuZWQgJWQsIG5vdGlmaWNhdGlvbiByZXR1cm5lZDolZCIsCisJCQkgYXNzb2NpZCwgY2x0X2Fzc29jaWQxKTsKKwkJdHN0X3Jlc20oVFBBU1MsICJBc3NvY2lhdGlvbiBpZCBtYXRjaCBiZXR3ZWVuIHNjdHBfY29ubmVjdHgoKSIKKwkJCQkiIGFuZCBub3RpZmljYXRpb24uIik7CisJfQorCisJLyogR2V0IENPTU1fVVAgb24gc3ZyX3NrICovCisJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc3ZyX3NrLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfQ09NTV9VUCk7CQorCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKilpb3YuaW92X2Jhc2U7CisJc3ZyX2Fzc29jaWQxID0gc2FjLT5zYWNfYXNzb2NfaWQ7CisKKwkvKiBEbyBhIGJsb2NraW5nIGNvbm5lY3R4IGZyb20gY2x0X3NrMiB0byBzdnJfc2suIAorCSAqIEJsb2NraW5nIGNvbm5lY3R4IHNob3VsZCBibG9jayB1bnRpbCB0aGUgYXNzb2NpYXRpb24gaXMgZXN0YWJsaXNoZWQKKwkgKiBhbmQgcmV0dXJuIHN1Y2Nlc3MuCisJICovCisJdGVzdF9jb25uZWN0eChjbHRfc2syLCAoc3RydWN0IHNvY2thZGRyICopc3ZyX3RyeSwgTlVNQUREUik7CisKKwkvKiBHZXQgQ09NTV9VUCBvbiBjbHRfc2syICovCisJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coY2x0X3NrMiwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOwkKKwlzYWMgPSAoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICopaW92Lmlvdl9iYXNlOworCWNsdF9hc3NvY2lkMiA9IHNhYy0+c2FjX2Fzc29jX2lkOworCisJLyogR2V0IENPTU1fVVAgb24gc3ZyX3NrICovCisJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc3ZyX3NrLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfQ09NTV9VUCk7CQorCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKilpb3YuaW92X2Jhc2U7CisJc3ZyX2Fzc29jaWQyID0gc2FjLT5zYWNfYXNzb2NfaWQ7CisKKwl0c3RfcmVzbShUUEFTUywgImJsb2NraW5nIGNvbm5lY3R4Iik7CisKKwlwZWVsb2ZmX3NrID0gdGVzdF9zY3RwX3BlZWxvZmYoc3ZyX3NrLCBzdnJfYXNzb2NpZDEpOyAKKworCS8qIERvaW5nIGEgY29ubmVjdHggb24gYSBwZWVsZWQgb2ZmIHNvY2tldCBzaG91bGQgZmFpbC4gKi8KKwllcnJvciA9IHNjdHBfY29ubmVjdHgocGVlbG9mZl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKWNsdF9sb29wMywgTlVNQUREUiwKKwkJCSAgICAgIE5VTEwpOworCWlmICgoZXJyb3IgIT0gLTEpIHx8IChFSVNDT05OICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiY29ubmVjdHggb24gYSBwZWVsZWQgb2ZmIHNvY2tldCAiCisJCQkgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImNvbm5lY3R4IG9uIGEgcGVlbGVkIG9mZiBzb2NrZXQiKTsKKworCS8qIFRyeWluZyB0byBjcmVhdGUgYW4gYXNzb2NpYXRpb24gb24gYSBzb2NrZXQgdGhhdCBtYXRjaGVzIGFuIAorCSAqIGV4aXN0aW5nIHBlZWxlZC1vZmYgYXNzb2NpYXRpb24gc2hvdWxkIGZhaWwuCisJICovCisJZXJyb3IgPSBzY3RwX2Nvbm5lY3R4KHN2cl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKWNsdF9sb29wMSwgTlVNQUREUiwKKwkJCSAgICAgIE5VTEwpOworCWlmICgoZXJyb3IgIT0gLTEpIHx8IChFQUREUk5PVEFWQUlMICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiY29ubmVjdHggdG8gY3JlYXRlIGFuIGFzc29jIHRoYXQgIgorCQkJICJtYXRjaGVzIGEgcGVlbGVkIG9mZiBhc3NvYyBlcnJvcjolZCBlcnJubzolZCIsCisJCQkgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiY29ubmVjdHggdG8gY3JlYXRlIGFuIGFzc29jIHRoYXQgbWF0Y2hlcyBhIHBlZWxlZCBvZmYgIgorCQkgImFzc29jIik7CisKKwl0ZXN0X3BlZXJfYWRkcihwZWVsb2ZmX3NrLCBzdnJfYXNzb2NpZDEsIGNsdF90ZXN0MSwgTlVNQUREUik7CisJdHN0X3Jlc20oVFBBU1MsICJzZXJ2ZXIgYXNzb2NpYXRpb24gMSBwZWVycyBvayIpOworCXRlc3RfcGVlcl9hZGRyKHN2cl9zaywgc3ZyX2Fzc29jaWQyLCBjbHRfdGVzdDIsIE5VTUFERFIpOworCXRzdF9yZXNtKFRQQVNTLCAic2VydmVyIGFzc29jaWF0aW9uIDIgcGVlcnMgb2siKTsKKwl0ZXN0X3BlZXJfYWRkcihjbHRfc2sxLCBjbHRfYXNzb2NpZDEsIHN2cl90ZXN0LCBOVU1BRERSKTsKKwl0c3RfcmVzbShUUEFTUywgImNsaWVudCBhc3NvY2lhdGlvbiAxIHBlZXJzIG9rIik7CisJdGVzdF9wZWVyX2FkZHIoY2x0X3NrMiwgY2x0X2Fzc29jaWQyLCBzdnJfdGVzdCwgTlVNQUREUik7CisJdHN0X3Jlc20oVFBBU1MsICJjbGllbnQgYXNzb2NpYXRpb24gMiBwZWVycyBvayIpOworCWNsb3NlKHN2cl9zayk7CisJY2xvc2UoY2x0X3NrMSk7CisJY2xvc2UoY2x0X3NrMik7CisJY2xvc2UocGVlbG9mZl9zayk7CisKKwkvKiBJbmRpY2F0ZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24uICAqLworCXJldHVybiAwOyAKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfZnJhZ21lbnRzLmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0X2ZyYWdtZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZWIyYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZnVuY190ZXN0cy90ZXN0X2ZyYWdtZW50cy5jCkBAIC0wLDAgKzEsMjk3IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwMworICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBOb2tpYSwgSW5jLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBMYSBNb250ZSBILlAuIFlhcnJvbGwgPHBpZ2d5QGFjbS5vcmc+CisgKiAgICBLYXJsIEtudXRzb24gPGthcmxAYXRoZW5hLmNoaWNhZ28uaWwudXM+CisgKiAgICBIdWkgSHVhbmcgPGh1aS5odWFuZ0Bub2tpYS5jb20+CisgKiAgICBKb24gR3JpbW0gPGpncmltbUB1cy5pYm0uY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgPHNyaUB1cy5pYm0uY29tPgorICovCisKKy8qIFRoaXMgaXMgYSBmdW5jdGlvbmFsIHRlc3QgdG8gdmVyaWZ5IHRoZSBkYXRhIGZyYWdtZW50YXRpb24sIHJlYXNzZW1ibHkgCisgKiBzdXBwb3J0IGFuZCBTQ1RQX0RJU0FCTEVfRlJBR01FTlRTIHNvY2tldCBvcHRpb24uIAorICogVGhlIGZvbGxvd2luZyB0ZXN0cyBhcmUgZG9uZSBpbiBzZXF1ZW5jZS4KKyAqIC0gVmVyaWZ5IFNDVFBfRElTQUJMRV9GUkFHTUVOVFMgc29ja2V0IG9wdGlvbiBieSBkb2luZyBhIHNldHNvY2tvcHQoKQorICogICBmb2xsb3dlZCBieSBhIGdldHNvY2tvcHQoKS4KKyAqIC0gVmVyaWZ5IHRoYXQgYSBtZXNzYWdlIHNpemUgZXhjZWVkaW5nIHRoZSBhc3NvY2lhdGlvbiBmcmFnbWVudGF0aW9uCisgKiAgIHBvaW50IGNhbm5vdCBiZSBzZW50IHdoZW4gZnJhZ21lbnRhdGlvbiBpcyBkaXNhYmxlZC4KKyAqIC0gU2VuZCBhbmQgcmVjZWl2ZSBhIHNldCBvZiBtZXNzYWdlcyB0aGF0IGFyZSBiaWdnZXIgdGhhbiB0aGUgcGF0aCBtdHUuIAorICogICBUaGUgZGlmZmVyZW50IG1lc3NhZ2Ugc2l6ZXMgdG8gYmUgdGVzdGVkIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGFycmF5IAorICogICBtc2dfc2l6ZXNbXS4gCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorCitjaGFyICpUQ0lEID0gX19GSUxFX187CitpbnQgVFNUX1RPVEFMID0gNDsKK2ludCBUU1RfQ05UID0gMDsKKworaW50IG1zZ19zaXplc1tdID0gezEzNTMsIDIwMDAsIDUwMDAsIDEwMDAwLCAyMDAwMCwgMzI3Njh9OworCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICAgICAgaW50IHNrMSwgc2syOworICAgICAgICBzb2NrYWRkcl9zdG9yYWdlX3QgbG9vcDE7CisgICAgICAgIHNvY2thZGRyX3N0b3JhZ2VfdCBsb29wMjsKKyAgICAgICAgc3RydWN0IGlvdmVjIGlvdjsKKyAgICAgICAgc3RydWN0IG1zZ2hkciBpbm1lc3NhZ2U7CisJc3RydWN0IG1zZ2hkciBvdXRtZXNzYWdlOworCWNoYXIgaW5jbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHNjdHBfY21zZ19kYXRhX3QpKV07CisJY2hhciBvdXRjbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKV07CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm87CisgICAgICAgIHN0cnVjdCBpb3ZlYyBvdXRfaW92OworICAgICAgICBpbnQgZXJyb3IsIGJ5dGVzX3NlbnQ7CisJaW50IHBmX2NsYXNzOworCXVpbnQzMl90IHBwaWQ7CisJdWludDMyX3Qgc3RyZWFtOworCWNoYXIgKmJpZ19idWZmZXI7CisJaW50IG1zZ19sZW4sIG1zZ19jbnQsIGk7CisJdm9pZCAqbXNnX2J1ZjsKKwlpbnQgZGlzYWJsZV9mcmFnOworCXNvY2tsZW5fdCBvcHRsZW47CisKKyAgICAgICAgLyogUmF0aGVyIHRoYW4gZmZsdXNoKCkgdGhyb3VnaG91dCB0aGUgY29kZSwgc2V0IHN0ZG91dCB0byAKKwkgKiBiZSB1bmJ1ZmZlcmVkLiAKKwkgKi8KKwlzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsgCisKKwkvKiBTZXQgc29tZSBiYXNpYyB2YWx1ZXMgd2hpY2ggZGVwZW5kIG9uIHRoZSBhZGRyZXNzIGZhbWlseS4gKi8KKyNpZiBURVNUX1Y2CisJcGZfY2xhc3MgPSBQRl9JTkVUNjsKKworICAgICAgICBsb29wMS52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICBsb29wMS52Ni5zaW42X2FkZHIgPSBpbjZhZGRyX2xvb3BiYWNrOworICAgICAgICBsb29wMS52Ni5zaW42X3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCisgICAgICAgIGxvb3AyLnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgICAgICAgIGxvb3AyLnY2LnNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7CisgICAgICAgIGxvb3AyLnY2LnNpbjZfcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMik7CisjZWxzZQorCXBmX2NsYXNzID0gUEZfSU5FVDsKKworICAgICAgICBsb29wMS52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgbG9vcDEudjQuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgbG9vcDEudjQuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworCisgICAgICAgIGxvb3AyLnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICBsb29wMi52NC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworICAgICAgICBsb29wMi52NC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMik7CisjZW5kaWYgLyogVEVTVF9WNiAqLworCisgICAgICAgIC8qIENyZWF0ZSB0aGUgdHdvIGVuZHBvaW50cyB3aGljaCB3aWxsIHRhbGsgdG8gZWFjaCBvdGhlci4gICovCisgICAgICAgIHNrMSA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NFUVBBQ0tFVCwgSVBQUk9UT19TQ1RQKTsKKyAgICAgICAgc2syID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCisJLyogRW5hYmxlIEFTU09DX0NIQU5HRSBhbmQgU05EUkNWSU5GTyBub3RpZmljYXRpb25zLiAqLworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZShzazEpOworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZShzazIpOworCisgICAgICAgIC8qIEJpbmQgdGhlc2Ugc29ja2V0cyB0byB0aGUgdGVzdCBwb3J0cy4gICovCisgICAgICAgIHRlc3RfYmluZChzazEsICZsb29wMS5zYSwgc2l6ZW9mKGxvb3AxKSk7CisgICAgICAgIHRlc3RfYmluZChzazIsICZsb29wMi5zYSwgc2l6ZW9mKGxvb3AyKSk7CisKKyAgICAgICAvKiBNYXJrIHNrMiBhcyBiZWluZyBhYmxlIHRvIGFjY2VwdCBuZXcgYXNzb2NpYXRpb25zLiAgKi8KKwl0ZXN0X2xpc3RlbihzazIsIDEpOworCisgICAgICAgIC8qIFNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UuICBUaGlzIHdpbGwgY3JlYXRlIHRoZSBhc3NvY2lhdGlvbi4gICovCisgICAgICAgIG91dG1lc3NhZ2UubXNnX25hbWUgPSAmbG9vcDI7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2YobG9vcDIpOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YgPSAmb3V0X2lvdjsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92bGVuID0gMTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfY29udHJvbCA9IG91dGNtc2c7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2Yob3V0Y21zZyk7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2ZsYWdzID0gMDsKKwljbXNnID0gQ01TR19GSVJTVEhEUigmb3V0bWVzc2FnZSk7CisJY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKKwljbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKwljbXNnLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworCXNpbmZvID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7CisJbWVtc2V0KHNpbmZvLCAweDAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCXBwaWQgPSByYW5kKCk7IC8qIENob29zZSBhbiBhcmJpdHJhcnkgdmFsdWUuICovCisJc3RyZWFtID0gMTsgCisJc2luZm8tPnNpbmZvX3BwaWQgPSBwcGlkOworCXNpbmZvLT5zaW5mb19zdHJlYW0gPSBzdHJlYW07CisJbXNnX2xlbiA9IDEwOwkKKwltc2dfYnVmID0gdGVzdF9idWlsZF9tc2coMTApOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9iYXNlID0gbXNnX2J1ZjsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfbGVuID0gbXNnX2xlbjsKKyAgICAgICAgdGVzdF9zZW5kbXNnKHNrMSwgJm91dG1lc3NhZ2UsIDAsIG1zZ19sZW4pOworICAgICAgICAKKworCS8qIEluaXRpYWxpemUgaW5tZXNzYWdlIGZvciBhbGwgcmVjZWl2ZXMuICovCisJYmlnX2J1ZmZlciA9IHRlc3RfbWFsbG9jKFJFQUxMWV9CSUcpOworICAgICAgICBtZW1zZXQoJmlubWVzc2FnZSwgMCwgc2l6ZW9mKGlubWVzc2FnZSkpOwkKKyAgICAgICAgaW92Lmlvdl9iYXNlID0gYmlnX2J1ZmZlcjsKKyAgICAgICAgaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworICAgICAgICBpbm1lc3NhZ2UubXNnX2lvdiA9ICZpb3Y7CisgICAgICAgIGlubWVzc2FnZS5tc2dfaW92bGVuID0gMTsKKyAgICAgICAgaW5tZXNzYWdlLm1zZ19jb250cm9sID0gaW5jbXNnOworCisgICAgICAgIC8qIEdldCB0aGUgY29tbXVuaWNhdGlvbiB1cCBtZXNzYWdlIG9uIHNrMi4gICovCisgICAgICAgIGlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworICAgICAgICBlcnJvciA9IHRlc3RfcmVjdm1zZyhzazIsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9DT01NX1VQKTsKKyNpZiAwCisJc2FjID0gKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSAqKWlvdi5pb3ZfYmFzZTsKKwlhc3NvY2lkMiA9IHNhYy0+c2FjX2Fzc29jX2lkOworI2VuZGlmCisgICAgICAgIC8qIEdldCB0aGUgY29tbXVuaWNhdGlvbiB1cCBtZXNzYWdlIG9uIHNrMS4gICovCisgICAgICAgIGlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworICAgICAgICBlcnJvciA9IHRlc3RfcmVjdm1zZyhzazEsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9DT01NX1VQKTsJCisjaWYgMAorCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKilpb3YuaW92X2Jhc2U7CisJYXNzb2NpZDEgPSBzYWMtPnNhY19hc3NvY19pZDsKKyNlbmRpZgorICAgICAgICAvKiBHZXQgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggd2FzIHNlbnQuICAqLworICAgICAgICBpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKyAgICAgICAgZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc2syLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisgICAgICAgIHRlc3RfY2hlY2tfbXNnX2RhdGEoJmlubWVzc2FnZSwgZXJyb3IsIG1zZ19sZW4sIE1TR19FT1IsIHN0cmVhbSwgcHBpZCk7CisKKwlmcmVlKG1zZ19idWYpOworCisJLyogRGlzYWJsZSBmcmFnbWVudGF0aW9uLiAqLworCWRpc2FibGVfZnJhZyA9IDE7CisJdGVzdF9zZXRzb2Nrb3B0KHNrMSwgU0NUUF9ESVNBQkxFX0ZSQUdNRU5UUywgJmRpc2FibGVfZnJhZywKKwkJCXNpemVvZihkaXNhYmxlX2ZyYWcpKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2V0c29ja29wdChTQ1RQX0RJU0FCTEVfRlJBR01FTlRTKSIpOworCisJLyogRG8gYSBnZXRzb2Nrb3B0KCkgYW5kIHZlcmlmeSB0aGF0IGZyYWdtZW50YXRpb24gaXMgZGlzYWJsZWQuICovIAorCWRpc2FibGVfZnJhZyA9IDA7CisJb3B0bGVuID0gc2l6ZW9mKGRpc2FibGVfZnJhZyk7CisJZXJyb3IgPSB0ZXN0X2dldHNvY2tvcHQoc2sxLCBTQ1RQX0RJU0FCTEVfRlJBR01FTlRTLCAmZGlzYWJsZV9mcmFnLAorCQkJCSZvcHRsZW4pOworCWlmICgoZXJyb3IgIT0gMCkgJiYgKGRpc2FibGVfZnJhZyAhPSAxKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdChTQ1RQX0RJU0FCTEVfRlJBR01FTlRTKSAiCisJCQkgImVycm9yOiVkIGVycm5vOiVkIGRpc2FibGVfZnJhZzolZCIsCisJCQkgZXJyb3IsIGVycm5vLCBkaXNhYmxlX2ZyYWcpOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRzb2Nrb3B0KFNDVFBfRElTQUJMRV9GUkFHTUVOVFMpIik7CisKKwkvKiBUcnkgdG8gc2VuZCBhIG1lc3NzYWdlIHRoYXQgZXhjZWVkcyBhc3NvY2lhdGlvbiBmcmFnbWVudGF0aW9uIHBvaW50CisJICogYW5kIHZlcmlmeSB0aGF0IGl0IGZhaWxzLgorCSAqLworCW1zZ19sZW4gPSAxMDAwMDA7CisJbXNnX2J1ZiA9IHRlc3RfYnVpbGRfbXNnKG1zZ19sZW4pOworCW91dG1lc3NhZ2UubXNnX2lvdi0+aW92X2Jhc2UgPSBtc2dfYnVmOworCW91dG1lc3NhZ2UubXNnX2lvdi0+aW92X2xlbiA9IG1zZ19sZW47CisJZXJyb3IgPSBzZW5kbXNnKHNrMSwgJm91dG1lc3NhZ2UsIDApOworCWlmICgoZXJyb3IgIT0gLTEpIHx8IChlcnJubyAhPSBFTVNHU0laRSkpCisgICAgICAgCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJTZW5kIGEgbWVzc2FnZSB0aGF0IGV4Y2VlZHMgIgorCQkJICJhc3NvYyBmcmFnIHBvaW50IGVycm9yOiVkIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiU2VuZCBhIG1lc3NhZ2UgdGhhdCBleGNlZWRzIGFzc29jIGZyYWcgcG9pbnQiKTsKKworCS8qIEVuYWJsZSBGcmFnbWVudGF0aW9uLiAqLworCWRpc2FibGVfZnJhZyA9IDA7CisJdGVzdF9zZXRzb2Nrb3B0KHNrMSwgU0NUUF9ESVNBQkxFX0ZSQUdNRU5UUywgJmRpc2FibGVfZnJhZywKKwkJCXNpemVvZihkaXNhYmxlX2ZyYWcpKTsKKworCW1zZ19jbnQgPSBzaXplb2YobXNnX3NpemVzKSAvIHNpemVvZihpbnQpOworCisJLyogU2VuZCBhbmQgcmVjZWl2ZSB0aGUgbWVzc2FnZXMgb2YgZGlmZmVyZW50IHNpemVzIHNwZWNpZmllZCBpbiB0aGUKKwkgKiBtc2dfc2l6ZXMgYXJyYXkgaW4gYSBsb29wLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBtc2dfY250OyBpKyspIHsKKworCQltc2dfbGVuID0gbXNnX3NpemVzW2ldOworCQltc2dfYnVmID0gdGVzdF9idWlsZF9tc2cobXNnX2xlbik7CisgICAgICAgIAlvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9iYXNlID0gbXNnX2J1ZjsKKyAgICAgICAgCW91dG1lc3NhZ2UubXNnX2lvdi0+aW92X2xlbiA9IG1zZ19sZW47CisgICAgICAgIAlieXRlc19zZW50ID0gdGVzdF9zZW5kbXNnKHNrMSwgJm91dG1lc3NhZ2UsIDAsIG1zZ19sZW4pOworCQkKKwkJdHN0X3Jlc20oVElORk8sICJTZW50ICVkIGJ5dGUgbWVzc2FnZSIsIGJ5dGVzX3NlbnQpOworCisgICAgICAgIAlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKyAgICAgICAgCWVycm9yID0gdGVzdF9yZWN2bXNnKHNrMiwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCQkvKiBIYW5kbGUgUGFydGlhbCBSZWFkcy4gKi8gCisJCWlmIChpbm1lc3NhZ2UubXNnX2ZsYWdzICYgTVNHX0VPUikgeworCSAgICAgICAgCXRlc3RfY2hlY2tfbXNnX2RhdGEoJmlubWVzc2FnZSwgZXJyb3IsIGJ5dGVzX3NlbnQsCisJCQkJCSAgICBNU0dfRU9SLCBzdHJlYW0sIHBwaWQpOworCQkJdHN0X3Jlc20oVElORk8sICJSZWNlaXZlZCAlZCBieXRlIG1lc3NhZ2UiLCBlcnJvcik7CisJCX0gZWxzZSB7CisJCQlpbnQgcmVtYWluOworCisJICAgICAgICAJdGVzdF9jaGVja19tc2dfZGF0YSgmaW5tZXNzYWdlLCBlcnJvciwgZXJyb3IsIDAsCisJCQkJCSAgICBzdHJlYW0sIHBwaWQpOworCQkJdHN0X3Jlc20oVElORk8sICJSZWNlaXZlZCAlZCBieXRlIG1lc3NhZ2UiLCBlcnJvcik7CisKKwkJCS8qIFJlYWQgdGhlIHJlbWFpbmluZyBtZXNzYWdlLiAqLworCQkJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJCQlyZW1haW4gPSB0ZXN0X3JlY3Ztc2coc2syLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJICAgICAgICAJdGVzdF9jaGVja19tc2dfZGF0YSgmaW5tZXNzYWdlLCByZW1haW4sCisJCQkJCSAgICBieXRlc19zZW50IC0gZXJyb3IsCisJCQkJCSAgICBNU0dfRU9SLCBzdHJlYW0sIHBwaWQpOworCQkJdHN0X3Jlc20oVElORk8sICJSZWNlaXZlZCAlZCBieXRlIG1lc3NhZ2UiLCBlcnJvcik7CisJCX0KKworCQlmcmVlKG1zZ19idWYpOworCX0KKworCXRzdF9yZXNtKFRQQVNTLCAiU2VuZC9SZWNlaXZlIGZyYWdtZW50ZWQgbWVzc2FnZXMiKTsKKworICAgICAgICAvKiBTaHV0IGRvd24gdGhlIGxpbmsuICAqLworICAgICAgICBjbG9zZShzazEpOworCisgICAgICAgIC8qIEdldCB0aGUgc2h1dGRvd24gY29tcGxldGUgbm90aWZpY2F0aW9uLiAqLworCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworICAgICAgICBlcnJvciA9IHRlc3RfcmVjdm1zZyhzazIsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9TSFVURE9XTl9DT01QKTsKKwkJCQkKKyAgICAgICAgY2xvc2Uoc2syKTsKKworICAgICAgICAvKiBJbmRpY2F0ZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24uICAqLworICAgICAgIAlyZXR1cm4gMDsgCit9CmRpZmYgLS1naXQgYS9zcmMvZnVuY190ZXN0cy90ZXN0X2dldG5hbWUuYyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfZ2V0bmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzRiM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZnVuY190ZXN0cy90ZXN0X2dldG5hbWUuYwpAQCAtMCwwICsxLDI3OCBAQAorLyogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24KKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDQKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCBnaXZlbiB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgIFNyaWRoYXIgU2FtdWRyYWxhCQk8c3JpQHVzLmlibS5jb20+CisgKi8KKworLyogVGhpcyBpcyBhIGtlcm5lbCB0ZXN0IHRvIHZlcmlmeSBnZXRzb2NrbmFtZSgpIGFuZCBnZXRwZWVybmFtZSgpIGludGVyZmFjZXMKKyAqIGZvciBzaW5nbGUtaG9tZWQgb25lLXRvLW9uZSBzdHlsZSBzb2NrZXRzLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorCitjaGFyICpUQ0lEID0gX19GSUxFX187CitpbnQgVFNUX1RPVEFMID0gMTM7CitpbnQgVFNUX0NOVCA9IDA7CisKKyNkZWZpbmUgTUFYX0NMSUVOVFMgMTAKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGNsdF9zaywgc3ZyX3NrLCBhY2NlcHRfc2s7CisJc29ja2FkZHJfc3RvcmFnZV90IHN2cl9sb29wLCBhY2NlcHRfbG9vcDsKKwlzb2NrYWRkcl9zdG9yYWdlX3Qgc3ZyX2xvY2FsX2FkZHIsIHN2cl9wZWVyX2FkZHI7CisJc29ja2FkZHJfc3RvcmFnZV90IGNsdF9sb2NhbF9hZGRyLCBjbHRfcGVlcl9hZGRyOworCXNvY2tsZW5fdCBsZW47CisJaW50IGVycm9yOworCWludCBwZl9jbGFzczsKKwlpbnQgZmQsIGVycl9ubyA9IDA7CisJY2hhciBmaWxlbmFtZVsyMV07CisKKyAgICAgICAgLyogUmF0aGVyIHRoYW4gZmZsdXNoKCkgdGhyb3VnaG91dCB0aGUgY29kZSwgc2V0IHN0ZG91dCB0byAKKwkgKiBiZSB1bmJ1ZmZlcmVkLiAgCisJICovIAorCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOyAKKworCS8qIEluaXRpYWxpemUgdGhlIHNlcnZlciBhbmQgY2xpZW50IGFkZHJlc3Nlcy4gKi8gCisjaWYgVEVTVF9WNgorCXBmX2NsYXNzID0gUEZfSU5FVDY7CisgICAgICAgIHN2cl9sb29wLnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgICAgICAgIHN2cl9sb29wLnY2LnNpbjZfYWRkciA9IChzdHJ1Y3QgaW42X2FkZHIpU0NUUF9JTjZBRERSX0FOWV9JTklUOworICAgICAgICBzdnJfbG9vcC52Ni5zaW42X3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzEpOworI2Vsc2UKKwlwZl9jbGFzcyA9IFBGX0lORVQ7CisJc3ZyX2xvb3AudjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc3ZyX2xvb3AudjQuc2luX2FkZHIuc19hZGRyID0gSU5BRERSX0FOWTsKKwlzdnJfbG9vcC52NC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisjZW5kaWYKKworCS8qIENyZWF0ZSBhbmQgYmluZCB0aGUgbGlzdGVuaW5nIHNlcnZlciBzb2NrZXQuICAqLworICAgICAgICBzdnJfc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TVFJFQU0sIElQUFJPVE9fU0NUUCk7CisJdGVzdF9iaW5kKHN2cl9zaywgJnN2cl9sb29wLnNhLCBzaXplb2Yoc3ZyX2xvb3ApKTsKKworCW1lbXNldCgmc3ZyX2xvY2FsX2FkZHIsIDB4MDAsIHNpemVvZihzdnJfbG9jYWxfYWRkcikpOworCWxlbiA9IHNpemVvZihzdnJfbG9jYWxfYWRkcik7CisJLyogVmVyaWZ5IHRoYXQgZ2V0c29ja25hbWUoKSBvbiBhbiB1bmNvbm5lY3RlZCBzb2NrZXQgd29ya3MgZmluZS4gKi8KKwllcnJvciA9IGdldHNvY2tuYW1lKHN2cl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzdnJfbG9jYWxfYWRkciwgJmxlbik7CisJaWYgKDAgIT0gZXJyb3IpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImdldHNvY2tuYW1lOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tuYW1lIG9uIGFuIHVuY29ubmVjdGVkIHNvY2tldCIpOworCisJbWVtc2V0KCZzdnJfcGVlcl9hZGRyLCAweDAwLCBzaXplb2Yoc3ZyX3BlZXJfYWRkcikpOworCWxlbiA9IHNpemVvZihzdnJfcGVlcl9hZGRyKTsKKwkvKiBWZXJpZnkgdGhhdCBnZXRwZWVybmFtZSgpIG9uIGFuIHVuY29ubmVjdGVkIHNvY2tldCBmYWlscy4gKi8KKwllcnJvciA9IGdldHBlZXJuYW1lKHN2cl9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzdnJfcGVlcl9hZGRyLCAmbGVuKTsKKwlpZiAoKC0xICE9IGVycm9yKSB8fCAoRU5PVENPTk4gIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRwZWVybmFtZSBvbiBhbiB1bmNvbm5lY3RlZCAiCisJCQkgInNvY2tldCBlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRwZWVybmFtZSBvbiBhbiB1bmNvbm5lY3RlZCBzb2NrZXQiKTsKKworCS8qIE1hcmsgc3ZyX3NrIGFzIGJlaW5nIGFibGUgdG8gYWNjZXB0IG5ldyBhc3NvY2lhdGlvbnMuICAqLworCXRlc3RfbGlzdGVuKHN2cl9zaywgNSk7CisKKwkvKiBDcmVhdGUgdGhlIGNsaWVudCBzb2NrZXQuICAqLworCWNsdF9zayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKwkKKwkvKiBEbyBhIGJsb2NraW5nIGNvbm5lY3QgZnJvbSBjbHRfc2sgdG8gc3ZyX3NrICovICAgICAgCisjaWYgVEVTVF9WNgorCXN2cl9sb29wLnY2LnNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7CisjZWxzZQorCXN2cl9sb29wLnY0LnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisjZW5kaWYKKwl0ZXN0X2Nvbm5lY3QoY2x0X3NrLCAmc3ZyX2xvb3Auc2EsIHNpemVvZihzdnJfbG9vcCkpOworCisJbWVtc2V0KCZjbHRfbG9jYWxfYWRkciwgMHgwMCwgc2l6ZW9mKGNsdF9sb2NhbF9hZGRyKSk7CisJbGVuID0gc2l6ZW9mKGNsdF9sb2NhbF9hZGRyKTsKKwkvKiBHZXQgdGhlIGNsaWVudCdzIGxvY2FsIGFkZHJlc3MuICovCisJZXJyb3IgPSBnZXRzb2NrbmFtZShjbHRfc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmY2x0X2xvY2FsX2FkZHIsICZsZW4pOworCWlmICgwICE9IGVycm9yKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRzb2NrbmFtZSBvbiBhIGNvbm5lY3RlZCBjbGllbnQgIgorCQkJICJzb2NrZXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiZ2V0c29ja25hbWUgb24gYSBjb25uZWN0ZWQgY2xpZW50IHNvY2tldCIpOworCisJbWVtc2V0KCZjbHRfcGVlcl9hZGRyLCAweDAwLCBzaXplb2YoY2x0X3BlZXJfYWRkcikpOworCWxlbiA9IHNpemVvZihjbHRfcGVlcl9hZGRyKTsKKwkvKiBHZXQgdGhlIGNsaWVudCdzIHBlZXIgYWRkcmVzcy4gKi8KKwllcnJvciA9IGdldHBlZXJuYW1lKGNsdF9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSZjbHRfcGVlcl9hZGRyLCAmbGVuKTsKKwlpZiAoMCAhPSBlcnJvcikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0cGVlcm5hbWUgb24gYSBjb25uZWN0ZWQgY2xpZW50ICIKKwkJCSAic29ja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHBlZXJuYW1lIG9uIGEgY29ubmVjdGVkIGNsaWVudCBzb2NrZXQiKTsKKworCS8qIEV4dHJhY3QgdGhlIGFzc29jaWF0aW9uIG9uIHRoZSBsaXN0ZW5pbmcgc29ja2V0IGFzIGEgbmV3IHNvY2tldC4gKi8KKwlsZW4gPSBzaXplb2YoYWNjZXB0X2xvb3ApOworCWFjY2VwdF9zayA9IHRlc3RfYWNjZXB0KHN2cl9zaywgJmFjY2VwdF9sb29wLnNhLCAmbGVuKTsgCisKKwltZW1zZXQoJnN2cl9sb2NhbF9hZGRyLCAweDAwLCBzaXplb2Yoc3ZyX2xvY2FsX2FkZHIpKTsKKwlsZW4gPSBzaXplb2Yoc3ZyX2xvY2FsX2FkZHIpOworCS8qIEdldCB0aGUgc2VydmVyJ3MgbG9jYWwgYWRkcmVzcy4gKi8KKwllcnJvciA9IGdldHNvY2tuYW1lKGFjY2VwdF9zaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzdnJfbG9jYWxfYWRkciwKKwkJCQkmbGVuKTsKKwlpZiAoMCAhPSBlcnJvcikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja25hbWUgb24gYSBjb25uZWN0ZWQgc2VydmVyICIKKwkJCSAic29ja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tuYW1lIG9uIGEgY29ubmVjdGVkIHNlcnZlciBzb2NrZXQiKTsKKworCW1lbXNldCgmc3ZyX3BlZXJfYWRkciwgMHgwMCwgc2l6ZW9mKHN2cl9wZWVyX2FkZHIpKTsKKwlsZW4gPSBzaXplb2Yoc3ZyX3BlZXJfYWRkcik7CisJLyogR2V0IHRoZSBzZXJ2ZXIncyBwZWVyIGFkZHJlc3MuICovCisJZXJyb3IgPSBnZXRwZWVybmFtZShhY2NlcHRfc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3ZyX3BlZXJfYWRkciwKKwkJCQkmbGVuKTsKKwlpZiAoMCAhPSBlcnJvcikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0cGVlcm5hbWUgb24gYSBjb25uZWN0ZWQgc2VydmVyICIKKwkJCSAic29ja2V0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHBlZXJuYW1lIG9uIGEgY29ubmVjdGVkIHNlcnZlciBzb2NrZXQiKTsKKworCWlmIChzdnJfbG9jYWxfYWRkci52NC5zaW5fcG9ydCAhPSBjbHRfcGVlcl9hZGRyLnY0LnNpbl9wb3J0KQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJTZXJ2ZXIncyBsb2NhbCBwb3J0KCVkKSBkb2Vzbid0ICIKKwkJCSAibWF0Y2ggQ2xpZW50J3MgcGVlciBwb3J0KCVkKVxuIiwKKwkJCSBzdnJfbG9jYWxfYWRkci52NC5zaW5fcG9ydCwgY2x0X3BlZXJfYWRkci52NC5zaW5fcG9ydCk7CisKKwlpZiAoc3ZyX3BlZXJfYWRkci52NC5zaW5fcG9ydCAhPSBjbHRfbG9jYWxfYWRkci52NC5zaW5fcG9ydCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiU2VydmVyJ3MgcGVlciBwb3J0KCVkKSBkb2Vzbid0ICIKKwkJCSAibWF0Y2ggQ2xpZW50J3MgbG9jYWwgcG9ydCglZClcbiIsCisJCQkgc3ZyX3BlZXJfYWRkci52NC5zaW5fcG9ydCwgY2x0X2xvY2FsX2FkZHIudjQuc2luX3BvcnQpOworI2lmIFRFU1RfVjYKKwlpZiAobWVtY21wKCZzdnJfbG9jYWxfYWRkciwgJmNsdF9wZWVyX2FkZHIsIGxlbikgIT0gMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiU2VydmVyJ3MgbG9jYWwgYWRkcmVzcyBhbmQgY2xpZW50J3MgIgorCQkJICJwZWVyIGFkZHJlc3NlcyBkbyBub3QgbWF0Y2hcbiIpOworCisJaWYgKG1lbWNtcCgmc3ZyX3BlZXJfYWRkciwgJmNsdF9sb2NhbF9hZGRyLCBsZW4pICE9IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIlNlcnZlcidzIHBlZXIgYWRkcmVzcyBhbmQgY2xpZW50J3MgIgorCQkJICJsb2NhbCBhZGRyZXNzZXMgZG8gbm90IG1hdGNoXG4iKTsKKyNlbHNlCisJaWYgKHN2cl9sb2NhbF9hZGRyLnY0LnNpbl9hZGRyLnNfYWRkciAhPQorCQkgCQljbHRfcGVlcl9hZGRyLnY0LnNpbl9hZGRyLnNfYWRkcikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiU2VydmVyJ3MgbG9jYWwgYWRkcmVzcyBhbmQgY2xpZW50J3MgIgorCQkJICJwZWVyIGFkZHJlc3NlcyBkbyBub3QgbWF0Y2hcbiIpOworCWlmIChzdnJfcGVlcl9hZGRyLnY0LnNpbl9hZGRyLnNfYWRkciAhPQorCQkgCQljbHRfbG9jYWxfYWRkci52NC5zaW5fYWRkci5zX2FkZHIpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIlNlcnZlcidzIHBlZXIgYWRkcmVzcyBhbmQgY2xpZW50J3MgIgorCQkJICJsb2NhbCBhZGRyZXNzZXMgZG8gbm90IG1hdGNoXG4iKTsKKyNlbmRpZgorCXRzdF9yZXNtKFRQQVNTLCAiZ2V0c29ja25hbWUvZ2V0cGVlcm5hbWUgc2VydmVyL2NsaWVudCBtYXRjaCIpOworCisJbWVtc2V0KCZjbHRfbG9jYWxfYWRkciwgMHgwMCwgc2l6ZW9mKGNsdF9sb2NhbF9hZGRyKSk7CisJbGVuID0gc2l6ZW9mKGNsdF9sb2NhbF9hZGRyKTsKKwkvKmdldHNvY2tuYW1lKCk6ICBCYWQgc29ja2V0IGRlc2NyaXB0b3IsIEVCQURGIGV4cGVjdGVkIGVycm9yKi8KKwllcnJvciA9IGdldHNvY2tuYW1lKC0xLCAoc3RydWN0IHNvY2thZGRyICopJmNsdF9sb2NhbF9hZGRyLCAmbGVuKTsKKwlpZiAoZXJyb3IgIT0gLTEgfHwgZXJybm8gIT0gRUJBREYpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImdldHNvY2tuYW1lIG9uIGEgYmFkIHNvY2tldCAiCisJCQkgImRlc2NyaXB0b3IuIGVycm9yOiVkIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiZ2V0c29ja25hbWUgb24gYSBiYWQgc29ja2V0IGRlc2NyaXB0b3IgLSBFQkFERiIpOworCisJLypnZXRzb2NrbmFtZSgpOiBJbnZhbGlkIHNvY2tldCwgRU5PVFNPQ0sgZXhwZWN0ZWQgZXJyb3IqLworCXN0cmNweShmaWxlbmFtZSwgIi90bXAvc2N0cHRlc3QuWFhYWFhYIik7CisJZmQgPSBta3N0ZW1wKGZpbGVuYW1lKTsKKwlpZiAoZmQgPT0gLTEpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIkZhaWxlZCB0byBta3N0ZW1wICVzOiAlcyIsCisJCQkJZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisJZXJyb3IgPSBnZXRzb2NrbmFtZShmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZjbHRfbG9jYWxfYWRkciwgJmxlbik7CisJaWYgKGVycm9yID09IC0xKQorCQllcnJfbm8gPSBlcnJubzsKKwljbG9zZShmZCk7CisJdW5saW5rKGZpbGVuYW1lKTsKKwlpZiAoZXJyb3IgIT0gLTEgfHwgZXJyX25vICE9IEVOT1RTT0NLKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRzb2NrbmFtZSBvbiBhbiBpbnZhbGlkIHNvY2tldCAiCisJCQkgImVycm9yOiVkIGVycm5vOiVkIiwgZXJyb3IsIGVycl9ubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tuYW1lIG9uIGFuIGludmFsaWQgc29ja2V0IC0gRU5PVFNPQ0siKTsKKworCS8qZ2V0c29ja25hbWUoKTogSW52YWxpZCBzdHJ1Y3R1cmUsIEVGQVVMVCBleHBlY3RlZCBlcnJvciovCisJZXJyb3IgPSBnZXRzb2NrbmFtZShjbHRfc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKiktMSwgJmxlbik7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVGQVVMVCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja25hbWUgd2l0aCBpbnZhbGlkIGJ1ZmZlciAiCisJCQkgImVycm9yOiVkIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiZ2V0c29ja25hbWUgd2l0aCBpbnZhbGlkIGJ1ZmZlciAtIEVGQVVMVCIpOworIAorCW1lbXNldCgmY2x0X3BlZXJfYWRkciwgMHgwMCwgc2l6ZW9mKGNsdF9wZWVyX2FkZHIpKTsKKwlsZW4gPSBzaXplb2YoY2x0X3BlZXJfYWRkcik7CisJLypnZXRwZWVybmFtZSgpOiAgQmFkIHNvY2tldCBkZXNjcmlwdG9yLCBFQkFERiBleHBlY3RlZCBlcnJvciovCisJZXJyb3IgPSBnZXRwZWVybmFtZSgtMSwgKHN0cnVjdCBzb2NrYWRkciAqKSZjbHRfbG9jYWxfYWRkciwgJmxlbik7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycm5vICE9IEVCQURGKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRwZWVybmFtZSBvbiBhIGJhZCBzb2NrZXQgIgorCQkJICJkZXNjcmlwdG9yLiBlcnJvcjolZCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHBlZXJuYW1lIG9uIGEgYmFkIHNvY2tldCBkZXNjcmlwdG9yIC0gRUJBREYiKTsKKworCS8qZ2V0cGVlcm5hbWUoKTogSW52YWxpZCBzb2NrZXQsIEVOT1RTT0NLIGV4cGVjdGVkIGVycm9yKi8KKwlzdHJjcHkoZmlsZW5hbWUsICIvdG1wL3NjdHB0ZXN0LlhYWFhYWCIpOworCWZkID0gbWtzdGVtcChmaWxlbmFtZSk7CisJaWYgKGZkID09IC0xKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJGYWlsZWQgdG8gbWtzdGVtcCAlczogJXMiLAorCQkJCWZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCWVycm9yID0gZ2V0cGVlcm5hbWUoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmY2x0X2xvY2FsX2FkZHIsICZsZW4pOworCWlmIChlcnJvciA9PSAtMSkKKwkJZXJyX25vID0gZXJybm87CisJY2xvc2UoZmQpOworCXVubGluayhmaWxlbmFtZSk7CisJaWYgKGVycm9yICE9IC0xIHx8IGVycl9ubyAhPSBFTk9UU09DSykKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0cGVlcm5hbWUgb24gYW4gaW52YWxpZCBzb2NrZXQgIgorCQkJICJlcnJvcjolZCBlcnJubzolZCIsIGVycm9yLCBlcnJfbm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRwZWVybmFtZSBvbiBhbiBpbnZhbGlkIHNvY2tldCAtIEVOT1RTT0NLIik7CisKKwkvKmdldHBlZXJuYW1lKCk6IEludmFsaWQgc3RydWN0dXJlLCBFRkFVTFQgZXhwZWN0ZWQgZXJyb3IqLworCWVycm9yID0gZ2V0cGVlcm5hbWUoY2x0X3NrLCAoc3RydWN0IHNvY2thZGRyICopLTEsICZsZW4pOworCWlmIChlcnJvciAhPSAtMSB8fCBlcnJubyAhPSBFRkFVTFQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImdldHBlZXJuYW1lIHdpdGggaW52YWxpZCBidWZmZXIgIgorCQkJICJlcnJvcjolZCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHBlZXJuYW1lIHdpdGggaW52YWxpZCBidWZmZXIgLSBFRkFVTFQiKTsKKyAKKwljbG9zZShjbHRfc2spOworCWNsb3NlKHN2cl9zayk7CisJY2xvc2UoYWNjZXB0X3NrKTsKKworICAgICAgICAvKiBJbmRpY2F0ZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24uICAqLworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2Z1bmNfdGVzdHMvdGVzdF9pbmFkZHJfYW55LmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0X2luYWRkcl9hbnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjJhNzAyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF9pbmFkZHJfYW55LmMKQEAgLTAsMCArMSwyNTEgQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBDaXNjbywgSW5jLgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgTW90b3JvbGEsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChjKSAyMDAxIE5va2lhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTGEgTW9udGUgSC5QLiBZYXJyb2xsCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgIExhIE1vbnRlIEguUC4gWWFycm9sbCA8cGlnZ3lAYWNtLm9yZz4KKyAqICAgIEthcmwgS251dHNvbiA8a2FybEBhdGhlbmEuY2hpY2Fnby5pbC51cz4KKyAqICAgIEpvbiBHcmltbSA8amdyaW1tQHVzLmlibS5jb20+CisgKiAgICBTcmlkaGFyIFNhbXVkcmFsYSA8c3JpQHVzLmlibS5jb20+CisgKiAgICBEYWlzeSBDaGFuZyA8ZGFpc3ljQHVzLmlibS5jb20+CisgKi8KKworLyogVGhpcyBpcyBhIGZ1bmN0aW9uYWwgdGVzdCB0byB2ZXJpZnkgYmluZGluZyBhIHNvY2tldCB3aXRoIElOQUREUllfQU5ZCisgKiBhZGRyZXNzIGFuZCBzZW5kIG1lc3NhZ2VzLgorICovIAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHNjdHB1dGlsLmg+CisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSAyOworaW50IFRTVF9DTlQgPSAwOworCitpbnQKK21haW4odm9pZCkKK3sKKyAgICAgICAgaW50IHNrMSwgc2syOworICAgICAgICBzb2NrYWRkcl9zdG9yYWdlX3QgbG9vcDsKKyAgICAgICAgc29ja2FkZHJfc3RvcmFnZV90IGFueWFkZHI7CisgICAgICAgIHN0cnVjdCBtc2doZHIgb3V0bWVzc2FnZTsKKwljaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzY3RwX2Ntc2dfZGF0YV90KSldOworCWNoYXIgb3V0Y21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSldOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvOworICAgICAgICBzdHJ1Y3QgaW92ZWMgb3V0X2lvdjsKKyAgICAgICAgc3RydWN0IGlvdmVjIGlvdjsKKyAgICAgICAgc3RydWN0IG1zZ2hkciBpbm1lc3NhZ2U7CisgICAgICAgIGNoYXIgKm1lc3NhZ2UgPSAiaGVsbG8sIHdvcmxkIVxuIjsKKyAgICAgICAgY2hhciAqdGVsZXBob25lID0gIldhdHNvbiwgY29tZSBoZXJlISAgSSBuZWVkIHlvdSFcbiI7CisgICAgICAgIGNoYXIgKnRlbGVwaG9uZV9yZXNwID0gIkkgYWxyZWFkeSBicm91Z2h0IHlvdXIgY29mZmVlLi4uXG4iOworICAgICAgICBpbnQgZXJyb3I7CisJaW50IHBmX2NsYXNzOworCXVpbnQzMl90IHBwaWQ7CisJdWludDMyX3Qgc3RyZWFtOworCXNvY2tsZW5fdCBuYW1lbGVuOworCisgICAgICAgIC8qIFJhdGhlciB0aGFuIGZmbHVzaCgpIHRocm91Z2hvdXQgdGhlIGNvZGUsIHNldCBzdGRvdXQgdG8gCisJICogYmUgdW5idWZmZXJlZC4gCisJICovCisJc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgMCk7IAorCisJLyogU2V0IHNvbWUgYmFzaWMgdmFsdWVzIHdoaWNoIGRlcGVuZCBvbiB0aGUgYWRkcmVzcyBmYW1pbHkuICovCisjaWYgVEVTVF9WNgorCXBmX2NsYXNzID0gUEZfSU5FVDY7CisKKyAgICAgICAgbG9vcC52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICBsb29wLnY2LnNpbjZfYWRkciA9IChzdHJ1Y3QgaW42X2FkZHIpU0NUUF9JTjZBRERSX0xPT1BCQUNLX0lOSVQ7CisgICAgICAgIGxvb3AudjYuc2luNl9wb3J0ID0gMDsKKworICAgICAgICBhbnlhZGRyLnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgICAgICAgIGFueWFkZHIudjYuc2luNl9hZGRyID0gKHN0cnVjdCBpbjZfYWRkcilTQ1RQX0lONkFERFJfQU5ZX0lOSVQ7CisgICAgICAgIGFueWFkZHIudjYuc2luNl9wb3J0ID0gMDsKKyNlbHNlCisJcGZfY2xhc3MgPSBQRl9JTkVUOworCisgICAgICAgIGxvb3AudjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGxvb3AudjQuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgbG9vcC52NC5zaW5fcG9ydCA9IDA7CisKKyAgICAgICAgYW55YWRkci52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgYW55YWRkci52NC5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworICAgICAgICBhbnlhZGRyLnY0LnNpbl9wb3J0ID0gMDsKKyNlbmRpZiAvKiBURVNUX1Y2ICovCisKKyAgICAgICAgLyogQ3JlYXRlIHRoZSB0d28gZW5kcG9pbnRzIHdoaWNoIHdpbGwgdGFsayB0byBlYWNoIG90aGVyLiAgKi8KKyAgICAgICAgc2sxID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworICAgICAgICBzazIgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisKKwkvKiBFbmFibGUgQVNTT0NfQ0hBTkdFIGFuZCBTTkRSQ1ZJTkZPIG5vdGlmaWNhdGlvbnMuICovCisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKHNrMSk7CisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKHNrMik7CisKKyAgICAgICAgLyogQmluZCB0aGVzZSBzb2NrZXRzIHRvIHRoZSB0ZXN0IHBvcnRzLiAgKi8KKyAgICAgICAgdGVzdF9iaW5kKHNrMSwgJmxvb3Auc2EsIHNpemVvZihsb29wKSk7CisgICAgICAgIHRlc3RfYmluZChzazIsICZhbnlhZGRyLnNhLCBzaXplb2YoYW55YWRkcikpOworCisJdHN0X3Jlc20oVFBBU1MsICJiaW5kIElOQUREUl9BTlkgYWRkcmVzcyIpOworCisgCS8qIE1hcmsgc2syIGFzIGJlaW5nIGFibGUgdG8gYWNjZXB0IG5ldyBhc3NvY2lhdGlvbnMgKi8KKwl0ZXN0X2xpc3RlbihzazIsIDEpOworCisJLyogTm93IHVzZSBnZXRzb2NrYW5hbWUoKSB0byByZXRyaWV2ZSB0aGUgZXBobWVyYWwgcG9ydHMuICovCisJbmFtZWxlbiA9IHNpemVvZihsb29wKTsKKwllcnJvciA9IGdldHNvY2tuYW1lKHNrMSwgJmxvb3Auc2EsICZuYW1lbGVuKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja25hbWU6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKworCW5hbWVsZW4gPSBzaXplb2YoYW55YWRkcik7CisJZXJyb3IgPSBnZXRzb2NrbmFtZShzazIsICZhbnlhZGRyLnNhLCAmbmFtZWxlbik7CisJaWYgKGVycm9yICE9IDApCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImdldHNvY2tuYW1lOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIAorI2lmIFRFU1RfVjYKKwlsb29wLnY2LnNpbjZfcG9ydCA9IGFueWFkZHIudjYuc2luNl9wb3J0OworI2Vsc2UKKyAgICAgICAgbG9vcC52NC5zaW5fcG9ydCA9IGFueWFkZHIudjQuc2luX3BvcnQ7CisjZW5kaWYKKworICAgICAgICAvKiBTZW5kIHRoZSBmaXJzdCBtZXNzYWdlLiAgVGhpcyB3aWxsIGNyZWF0ZSB0aGUgYXNzb2NpYXRpb24uICAqLworICAgICAgICBvdXRtZXNzYWdlLm1zZ19uYW1lID0gJmxvb3A7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2YobG9vcCk7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2lvdiA9ICZvdXRfaW92OworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19jb250cm9sID0gb3V0Y21zZzsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihvdXRjbXNnKTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfZmxhZ3MgPSAwOworCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZvdXRtZXNzYWdlKTsKKwljbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworCWNtc2ctPmNtc2dfdHlwZSA9IFNDVFBfU05EUkNWOworCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47CisJc2luZm8gPSAoc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqKUNNU0dfREFUQShjbXNnKTsKKwltZW1zZXQoc2luZm8sIDB4MDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJcHBpZCA9IHJhbmQoKTsgLyogQ2hvb3NlIGFuIGFyYml0cmFyeSB2YWx1ZS4gKi8KKwlzdHJlYW0gPSAxOyAKKwlzaW5mby0+c2luZm9fcHBpZCA9IHBwaWQ7CisJc2luZm8tPnNpbmZvX3N0cmVhbSA9IHN0cmVhbTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfYmFzZSA9IG1lc3NhZ2U7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2lvdi0+aW92X2xlbiA9IHN0cmxlbihtZXNzYWdlKSArIDE7CisgICAgICAgIHRlc3Rfc2VuZG1zZyhzazEsICZvdXRtZXNzYWdlLCAwLCBzdHJsZW4obWVzc2FnZSkrMSk7CisKKwkvKiBJbml0aWFsaXplIGlubWVzc2FnZSBmb3IgYWxsIHJlY2VpdmVzLiAqLworICAgICAgICBtZW1zZXQoJmlubWVzc2FnZSwgMCwgc2l6ZW9mKGlubWVzc2FnZSkpOworICAgICAgICBpb3YuaW92X2Jhc2UgPSB0ZXN0X21hbGxvYyhSRUFMTFlfQklHKTsKKyAgICAgICAgaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworICAgICAgICBpbm1lc3NhZ2UubXNnX2lvdiA9ICZpb3Y7CisgICAgICAgIGlubWVzc2FnZS5tc2dfaW92bGVuID0gMTsKKyAgICAgICAgaW5tZXNzYWdlLm1zZ19jb250cm9sID0gaW5jbXNnOworCisgICAgICAgIC8qIEdldCB0aGUgY29tbXVuaWNhdGlvbiB1cCBtZXNzYWdlIG9uIHNrMi4gICovCisgICAgICAgIGlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworICAgICAgICBlcnJvciA9IHRlc3RfcmVjdm1zZyhzazIsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9DT01NX1VQKTsJCisKKyAgICAgICAgLyogR2V0IHRoZSBjb21tdW5pY2F0aW9uIHVwIG1lc3NhZ2Ugb24gc2sxLiAgKi8KKyAgICAgICAgaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisgICAgICAgIGVycm9yID0gdGVzdF9yZWN2bXNnKHNrMSwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOwkKKworICAgICAgICAvKiBHZXQgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggd2FzIHNlbnQuICAqLworICAgICAgICBpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKyAgICAgICAgZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc2syLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisgICAgICAgIHRlc3RfY2hlY2tfbXNnX2RhdGEoJmlubWVzc2FnZSwgZXJyb3IsIHN0cmxlbihtZXNzYWdlKSArIDEsIAorCQkJICAgIE1TR19FT1IsIHN0cmVhbSwgcHBpZCk7CisKKyAgICAgICAvKiBTZW5kIDIgbWVzc2FnZXMuICAqLworICAgICAgICBvdXRtZXNzYWdlLm1zZ19uYW1lID0gJmxvb3A7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2YobG9vcCk7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2Yob3V0Y21zZyk7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2ZsYWdzID0gMDsKKwljbXNnID0gQ01TR19GSVJTVEhEUigmb3V0bWVzc2FnZSk7CisJY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKKwljbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKwljbXNnLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworCXNpbmZvID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7CisJbWVtc2V0KHNpbmZvLCAweDAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCXBwaWQrKzsKKwlzdHJlYW0rKzsKKwlzaW5mby0+c2luZm9fcHBpZCA9IHBwaWQ7CisJc2luZm8tPnNpbmZvX3N0cmVhbSA9IHN0cmVhbTsKKwlvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9iYXNlID0gdGVsZXBob25lOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9sZW4gPSBzdHJsZW4odGVsZXBob25lKSArIDE7CisJdGVzdF9zZW5kbXNnKHNrMSwgJm91dG1lc3NhZ2UsIDAsIHN0cmxlbih0ZWxlcGhvbmUpKzEpOworCisJb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfYmFzZSA9IHRlbGVwaG9uZV9yZXNwOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9sZW4gPSBzdHJsZW4odGVsZXBob25lX3Jlc3ApICsgMTsKKwl0ZXN0X3NlbmRtc2coc2sxLCAmb3V0bWVzc2FnZSwgMCwgc3RybGVuKHRlbGVwaG9uZV9yZXNwKSsxKTsKKyAgICAgICAgCisgICAgICAgIC8qIEdldCB0aG9zZSB0d28gbWVzc2FnZXMuICAqLworCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworICAgICAgICBlcnJvciA9IHRlc3RfcmVjdm1zZyhzazIsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKyAgICAgICAgdGVzdF9jaGVja19tc2dfZGF0YSgmaW5tZXNzYWdlLCBlcnJvciwgc3RybGVuKHRlbGVwaG9uZSkgKyAxLCAKKwkJCSAgICBNU0dfRU9SLCBzdHJlYW0sIHBwaWQpOworCisJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisgICAgICAgIGVycm9yID0gdGVzdF9yZWN2bXNnKHNrMiwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworICAgICAgICB0ZXN0X2NoZWNrX21zZ19kYXRhKCZpbm1lc3NhZ2UsIGVycm9yLCBzdHJsZW4odGVsZXBob25lX3Jlc3ApICsgMSwgCisJCQkgICAgTVNHX0VPUiwgc3RyZWFtLCBwcGlkKTsKKyAgICAgICAgCisgICAgICAgIC8qIFNodXQgZG93biB0aGUgbGluay4gICovCisgICAgICAgIGNsb3NlKHNrMSk7CisKKyAgICAgICAgLyogR2V0IHRoZSBzaHV0ZG93biBjb21wbGV0ZSBub3RpZmljYXRpb24uICovCisJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisgICAgICAgIGVycm9yID0gdGVzdF9yZWN2bXNnKHNrMiwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX1NIVVRET1dOX0NPTVApOworCisgICAgICAgIGNsb3NlKHNrMik7CisKKwl0c3RfcmVzbShUUEFTUywgInNlbmQgbXNncyBmcm9tIGEgc29ja2V0IHdpdGggSU5BRERSX0FOWSBiaW5kIGFkZHJlc3MiKTsKKworICAgICAgICAvKiBJbmRpY2F0ZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24uICAqLworICAgICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfcGVlbG9mZi5jIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF9wZWVsb2ZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiN2EwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfcGVlbG9mZi5jCkBAIC0wLDAgKzEsMjk5IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwMworICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBOb2tpYSwgSW5jLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBTcmlkaGFyIFNhbXVkcmFsYSA8c3JpQHVzLmlibS5jb20+CisgKi8KKworLyogVGhpcyBpcyBhIEZ1bmN0aW9uYWwgdGVzdCB0byB2ZXJpZnkgdGhlIG5ldyBTQ1RQIGludGVyZmFjZSBzY3RwX3BlZWxvZmYoKSAKKyAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnJhbmNoIG9mZiBhbiBhc3NvY2lhdGlvbiBpbnRvIGEgc2VwYXJhdGUgc29ja2V0LiAKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHNjdHB1dGlsLmg+CisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSA2OworaW50IFRTVF9DTlQgPSAwOworCisjZGVmaW5lIE1BWF9DTElFTlRTIDEwCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBzdnJfc2ssIGNsdF9za1tNQVhfQ0xJRU5UU10sIHBlZWxvZmZfc2tbTUFYX0NMSUVOVFNdOworCXNjdHBfYXNzb2NfdCBzdnJfYXNzb2NpZFtNQVhfQ0xJRU5UU107CisJc29ja2FkZHJfc3RvcmFnZV90IHN2cl9sb29wLCBjbHRfbG9vcFtNQVhfQ0xJRU5UU107CisJc3RydWN0IGlvdmVjIGlvdjsKKwlzdHJ1Y3QgbXNnaGRyIGlubWVzc2FnZTsKKwlzdHJ1Y3QgbXNnaGRyIG91dG1lc3NhZ2U7CisJY2hhciBpbmNtc2dbQ01TR19TUEFDRShzaXplb2Yoc2N0cF9jbXNnX2RhdGFfdCkpXTsKKwljaGFyIG91dGNtc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpXTsKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbzsKKwlzdHJ1Y3QgaW92ZWMgb3V0X2lvdjsKKwlpbnQgZXJyb3I7CisJdWludDMyX3QgcHBpZDsKKwl1aW50MzJfdCBzdHJlYW07CisJc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICpzYWM7CisJY2hhciAqYmlnX2J1ZmZlcjsKKwlpbnQgaTsKKyAgICAgICAgY2hhciAqbWVzc2FnZSA9ICJoZWxsbywgd29ybGQhXG4iOworCWludCBwZl9jbGFzczsKKworICAgICAgICAvKiBSYXRoZXIgdGhhbiBmZmx1c2goKSB0aHJvdWdob3V0IHRoZSBjb2RlLCBzZXQgc3Rkb3V0IHRvIAorCSAqIGJlIHVuYnVmZmVyZWQuICAKKwkgKi8gCisJc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgMCk7IAorCisjaWYgVEVTVF9WNgorCXBmX2NsYXNzID0gUEZfSU5FVDY7CisgICAgICAgIHN2cl9sb29wLnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgICAgICAgIHN2cl9sb29wLnY2LnNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7CisgICAgICAgIHN2cl9sb29wLnY2LnNpbjZfcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisjZWxzZQorCXBmX2NsYXNzID0gUEZfSU5FVDsKKwlzdnJfbG9vcC52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzdnJfbG9vcC52NC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCXN2cl9sb29wLnY0LnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKyNlbmRpZgorCisJLyogQ3JlYXRlIGFuZCBiaW5kIHRoZSBzZXJ2ZXIgc29ja2V0LiAgKi8KKyAgICAgICAgc3ZyX3NrID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCXRlc3RfYmluZChzdnJfc2ssICZzdnJfbG9vcC5zYSwgc2l6ZW9mKHN2cl9sb29wKSk7CisKKwkvKiBFbmFibGUgQVNTT0NfQ0hBTkdFIGFuZCBTTkRSQ1ZJTkZPIG5vdGlmaWNhdGlvbnMuICovCisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKHN2cl9zayk7CisKKwkvKiBNYXJrIHNlcnZlciBzb2NrZXQgYXMgYmVpbmcgYWJsZSB0byBhY2NlcHQgbmV3IGFzc29jaWF0aW9ucy4gICovCisJdGVzdF9saXN0ZW4oc3ZyX3NrLCAxKTsKKworCS8qIENyZWF0ZSBhbmQgYmluZCBhbGwgdGhlIGNsaWVudCBzb2NrZXRzLiAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykgeworCQljbHRfc2tbaV0gPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisjaWYgVEVTVF9WNgorICAgICAgICAJY2x0X2xvb3BbaV0udjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgICAgICAgCWNsdF9sb29wW2ldLnY2LnNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7CisgICAgICAgIAljbHRfbG9vcFtpXS52Ni5zaW42X3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzIgKyBpKTsKKyNlbHNlCisJCWNsdF9sb29wW2ldLnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQljbHRfbG9vcFtpXS52NC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCQljbHRfbG9vcFtpXS52NC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMiArIGkpOworI2VuZGlmCisJCXRlc3RfYmluZChjbHRfc2tbaV0sICZjbHRfbG9vcFtpXS5zYSwgc2l6ZW9mKGNsdF9sb29wW2ldKSk7CisKKwkJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKGNsdF9za1tpXSk7CisJfQorCisgICAgICAgIC8qIFNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UgZnJvbSBhbGwgdGhlIGNsaWVudHMgdG8gdGhlIHNlcnZlci4gIFRoaXMgCisJICogd2lsbCBjcmVhdGUgdGhlIGFzc29jaWF0aW9ucy4gIAorCSAqLworCW91dG1lc3NhZ2UubXNnX25hbWUgPSAmc3ZyX2xvb3A7CisJb3V0bWVzc2FnZS5tc2dfbmFtZWxlbiA9IHNpemVvZihzdnJfbG9vcCk7CisJb3V0bWVzc2FnZS5tc2dfaW92ID0gJm91dF9pb3Y7CisJb3V0bWVzc2FnZS5tc2dfaW92bGVuID0gMTsKKwlvdXRtZXNzYWdlLm1zZ19jb250cm9sID0gb3V0Y21zZzsKKwlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKG91dGNtc2cpOworCW91dG1lc3NhZ2UubXNnX2ZsYWdzID0gMDsKKwljbXNnID0gQ01TR19GSVJTVEhEUigmb3V0bWVzc2FnZSk7CisJY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKKwljbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKwljbXNnLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworCXNpbmZvID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7CisJbWVtc2V0KHNpbmZvLCAweDAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCXBwaWQgPSByYW5kKCk7IC8qIENob29zZSBhbiBhcmJpdHJhcnkgdmFsdWUuICovCisJc3RyZWFtID0gMTsgCisJc2luZm8tPnNpbmZvX3BwaWQgPSBwcGlkOworCXNpbmZvLT5zaW5mb19zdHJlYW0gPSBzdHJlYW07CisJb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfYmFzZSA9IG1lc3NhZ2U7CisJb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfbGVuID0gc3RybGVuKG1lc3NhZ2UpICsgMTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykKKwkJdGVzdF9zZW5kbXNnKGNsdF9za1tpXSwgJm91dG1lc3NhZ2UsIDAsCisJCQkJCSAgc3RybGVuKG1lc3NhZ2UpKzEpOworICAgICAgIAorCS8qIEluaXRpYWxpemUgaW5tZXNzYWdlIGZvciBhbGwgcmVjZWl2ZXMuICovIAorCWJpZ19idWZmZXIgPSB0ZXN0X21hbGxvYyhSRUFMTFlfQklHKTsKKwltZW1zZXQoJmlubWVzc2FnZSwgMCwgc2l6ZW9mKGlubWVzc2FnZSkpOwkKKwlpb3YuaW92X2Jhc2UgPSBiaWdfYnVmZmVyOworCWlvdi5pb3ZfbGVuID0gUkVBTExZX0JJRzsKKwlpbm1lc3NhZ2UubXNnX2lvdiA9ICZpb3Y7CisJaW5tZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworCWlubWVzc2FnZS5tc2dfY29udHJvbCA9IGluY21zZzsKKworCS8qIEdldCB0aGUgY29tbXVuaWNhdGlvbiB1cCBtZXNzYWdlIG9uIGFsbCBjbGllbnQgc29ja2V0cy4gICovCisJZm9yIChpID0gMDsgaSA8IE1BWF9DTElFTlRTOyBpKyspIHsKKwkJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJCWVycm9yID0gdGVzdF9yZWN2bXNnKGNsdF9za1tpXSwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCQl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOworI2lmIDAKKwkJc2FjID0gKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSAqKWlvdi5pb3ZfYmFzZTsKKwkJY2x0X2Fzc29jaWRbaV0gPSBzYWMtPnNhY19hc3NvY19pZDsKKyNlbmRpZgorCX0KKworCS8qIEdldCB0aGUgY29tbXVuaWNhdGlvbiB1cCBtZXNzYWdlIGFuZCB0aGUgZGF0YSBtZXNzYWdlIG9uIHRoZQorCSAqIHNlcnZlciBzb2NrZXRzIGZvciBhbGwgdGhlIGNsaWVudHMuICAKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykgeworCQlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwkJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc3ZyX3NrLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfQ09NTV9VUCk7CQorCQlzYWMgPSAoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICopaW92Lmlvdl9iYXNlOworCQlzdnJfYXNzb2NpZFtpXSA9IHNhYy0+c2FjX2Fzc29jX2lkOworCisJCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCQllcnJvciA9IHRlc3RfcmVjdm1zZyhzdnJfc2ssICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwkJdGVzdF9jaGVja19tc2dfZGF0YSgmaW5tZXNzYWdlLCBlcnJvciwgc3RybGVuKG1lc3NhZ2UpICsgMSwKKwkJCQkgICAgTVNHX0VPUiwgc3RyZWFtLCBwcGlkKTsKKwl9CisKKwkvKiBCcmFuY2ggb2ZmIGFsbCB0aGUgYXNzb2NpYXRpb25zIG9uIHRoZSBzZXJ2ZXIgc29ja2V0IHRvIHNlcGFyYXRlCisJICogaW5kaXZpZHVhbCBzb2NrZXRzLgorCSAqLyAKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykKKwkJcGVlbG9mZl9za1tpXSA9IHRlc3Rfc2N0cF9wZWVsb2ZmKHN2cl9zaywgc3ZyX2Fzc29jaWRbaV0pOyAKKworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9wZWVsb2ZmIik7CisKKwllcnJubyA9IDA7CisJLyogVmVyaWZ5IHRoYXQgYSBwZWVsZWQgb2ZmIHNvY2tldCBpcyBub3QgYWxsb3dlZCB0byBkbyBhIGxpc3RlbigpLiAgKi8KKwllcnJvciA9IGxpc3RlbihwZWVsb2ZmX3NrWzBdLCAxKTsKKwlpZiAoZXJyb3IgIT0gLTEpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImxpc3RlbiBvbiBhIHBlZWxlZCBvZmYgc29ja2V0ICIKKwkJCSAiZXJyb3I6ICVkLCBlcnJubzogJWQiLCBlcnJvciwgZXJybm8pOyAKKworCXRzdF9yZXNtKFRQQVNTLCAibGlzdGVuIG9uIGEgcGVlbGVkIG9mZiBzb2NrZXQiKTsKKworCWVycm5vID0gMDsKKwkvKiBWZXJpZnkgdGhhdCBhbiBhc3NvY2lhdGlvbiBjYW5ub3QgYmUgYnJhbmNoZWQgb2ZmIGFuIGFscmVhZHkKKwkgKiBwZWVsZWQtb2ZmIHNvY2tldC4KKwkgKi8KKwlpZiAoKC0xICE9IHNjdHBfcGVlbG9mZihwZWVsb2ZmX3NrWzBdLCBzdnJfYXNzb2NpZFswXSkpIHx8CisJICAgIChFSU5WQUwgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX3BlZWxvZmYgb24gYSBwZWVsZWQgb2ZmICIKKwkJCSAic29ja2V0IGVycm9yOiVkLCBlcnJubzolZCIsCisJCQkgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9wZWVsb2ZmIG9uIGEgcGVlbGVkIG9mZiBzb2NrZXQiKTsKKworCS8qIFNlbmQgYSBtZXNzYWdlIGZyb20gYWxsIHRoZSBjbGllbnQgc29ja2V0cyB0byB0aGUgc2VydmVyIHNvY2tldC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykKKwkJdGVzdF9zZW5kbXNnKGNsdF9za1tpXSwgJm91dG1lc3NhZ2UsIDAsIHN0cmxlbihtZXNzYWdlKSsxKTsKKworCS8qIFJlY2VpdmUgdGhlIHNlbnQgbWVzc2FnZXMgb24gdGhlIHBlZWxlZCBvZmYgc2VydmVyIHNvY2tldHMuICAqLyAgICAKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykgeworCQlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwkJZXJyb3IgPSB0ZXN0X3JlY3Ztc2cocGVlbG9mZl9za1tpXSwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCQl0ZXN0X2NoZWNrX21zZ19kYXRhKCZpbm1lc3NhZ2UsIGVycm9yLCBzdHJsZW4obWVzc2FnZSkgKyAxLAorCQkJCSAgICBNU0dfRU9SLCBzdHJlYW0sIHBwaWQpOworCX0KKworCXRzdF9yZXNtKFRQQVNTLCAiUmVjZWl2ZSBtc2dzIG9uIHBlZWxlZCBvZmYgc29ja2V0cyIpOworCisJLyogU2VuZCBhIG1lc3NhZ2UgZnJvbSBhbGwgdGhlIHBlZWxlZCBvZmYgc2VydmVyIHNvY2tldHMgdG8gdGhlIGNsaWVudCAKKwkgKiBzb2NrZXRzLiAKKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykgeworCQlvdXRtZXNzYWdlLm1zZ19uYW1lID0gJmNsdF9sb29wW2ldOworCQlvdXRtZXNzYWdlLm1zZ19uYW1lbGVuID0gc2l6ZW9mKGNsdF9sb29wW2ldKTsKKwkJdGVzdF9zZW5kbXNnKHBlZWxvZmZfc2tbaV0sICZvdXRtZXNzYWdlLCAwLCBzdHJsZW4obWVzc2FnZSkrMSk7CisJfQorCisJLyogUmVjZWl2ZSB0aGUgbWVzc2FnZXMgc2VudCBmcm9tIHRoZSBwZWVsZWQgb2Ygc2VydmVyIHNvY2tldHMgb24gCisJICogdGhlIGNsaWVudCBzb2NrZXRzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKSB7CisJCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCQllcnJvciA9IHRlc3RfcmVjdm1zZyhjbHRfc2tbaV0sICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwkJdGVzdF9jaGVja19tc2dfZGF0YSgmaW5tZXNzYWdlLCBlcnJvciwgc3RybGVuKG1lc3NhZ2UpICsgMSwKKwkJCQkgICAgTVNHX0VPUiwgc3RyZWFtLCBwcGlkKTsKKwl9CisKKwl0c3RfcmVzbShUUEFTUywgIlNlbmQgbXNncyBvbiBwZWVsZWQgb2ZmIHNvY2tldHMiKTsKKworCWVycm5vID0gMDsKKwkvKiBWZXJpZnkgdGhhdCBhIHBlZWxlZC1vZmYgc29ja2V0IGNhbm5vdCBpbml0aWFsaXplIGEgbmV3IAorCSAqIGFzc29jaWF0aW9uIGJ5IHRyeWluZyB0byBzZW5kIGEgbWVzc2FnZSB0byBhIGNsaWVudCB0aGF0IGlzIG5vdAorCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGVlbGVkLW9mZiBzb2NrZXQuCisJICogVGhlIG1lc3NhZ2UgaXMgc2VudCB0byB0aGUgY2xpZW50IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQorCSAqIHNvY2tldC4KKwkgKi8gCisJb3V0bWVzc2FnZS5tc2dfbmFtZSA9ICZjbHRfbG9vcFsxXTsKKwlvdXRtZXNzYWdlLm1zZ19uYW1lbGVuID0gc2l6ZW9mKGNsdF9sb29wWzFdKTsKKwl0ZXN0X3NlbmRtc2cocGVlbG9mZl9za1swXSwgJm91dG1lc3NhZ2UsIDAsIHN0cmxlbihtZXNzYWdlKSsxKTsKKworCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCWVycm9yID0gdGVzdF9yZWN2bXNnKGNsdF9za1swXSwgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX2RhdGEoJmlubWVzc2FnZSwgZXJyb3IsIHN0cmxlbihtZXNzYWdlKSArIDEsCisJCQkgICAgTVNHX0VPUiwgc3RyZWFtLCBwcGlkKTsKKworCXRzdF9yZXNtKFRQQVNTLCAicGVlbGVkIG9mZiBzb2NrZXQgY2Fubm90IGluaXRpYWxpemUgYSBuZXcgYXNzb2MiKTsKKworCWNsb3NlKHN2cl9zayk7CisKKwkvKiBDbG9zZSBhbGwgdGhlIHBlZWxlZCBvZmYgc2VydmVyIHNvY2tldHMuICAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKQorCQljbG9zZShwZWVsb2ZmX3NrW2ldKTsKKworCS8qIEdldCB0aGUgc2h1dGRvd24gY29tcGxldGUgbm90aWZpY2F0aW9uIGZyb20gYWxsIHRoZSBjbGllbnQgCisJICogc29ja2V0cy4gIAorCSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKSB7CisJCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCQllcnJvciA9IHRlc3RfcmVjdm1zZyhjbHRfc2tbaV0sICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwkJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwKKwkJCQkJICAgIFNDVFBfU0hVVERPV05fQ09NUCk7CQorCisJCWNsb3NlKGNsdF9za1tpXSk7CisJfQorCisgICAgICAgIC8qIEluZGljYXRlIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4gICovCisgICAgICAgCXJldHVybiAwOyAKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfcmVjdm1zZy5jIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF9yZWN2bXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2Y2NlYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfcmVjdm1zZy5jCkBAIC0wLDAgKzEsMTYwIEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMworICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgTW90b3JvbGEsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBTcmlkaGFyIFNhbXVkcmFsYQkJPHNyaUB1cy5pYm0uY29tPgorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqLworCisvKiBUaGlzIGlzIGEga2VybmVsIHRlc3QgdG8gdmVyaWZ5CisgKiAxLiBNU0dfRU9SIGZsYWcgaXMgc2V0IGNvcnJlY3RseSB3aGVuIGEgc2luZ2xlIG1lc3NhZ2UgaXMgcmVhZCB1c2luZyBtdWx0aXBsZQorICogICAgcmVjdm1zZygpIGNhbGxzLiAKKyAqIDIuIE1TR19QRUVLIHN1cHBvcnQuIAorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorCitjaGFyICpUQ0lEID0gX19GSUxFX187CitpbnQgVFNUX1RPVEFMID0gMjsKK2ludCBUU1RfQ05UID0gMDsKKworaW50CittYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IHN2cl9zaywgY2x0X3NrOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzdnJfbG9vcCwgY2x0X2xvb3A7CisJc3RydWN0IGlvdmVjIGlvdiwgb3V0X2lvdjsKKwlzdHJ1Y3QgbXNnaGRyIGlubWVzc2FnZSwgb3V0bWVzc2FnZTsKKwljaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzY3RwX2Ntc2dfZGF0YV90KSldOworCWludCBlcnJvciwgbXNnbGVuLCBpOworCWNoYXIgKmJpZ19idWZmZXI7CisJdm9pZCAqbXNnX2J1ZjsKKworICAgICAgICAvKiBSYXRoZXIgdGhhbiBmZmx1c2goKSB0aHJvdWdob3V0IHRoZSBjb2RlLCBzZXQgc3Rkb3V0IHRvIAorCSAqIGJlIHVuYnVmZmVyZWQuICAKKwkgKi8gCisJc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgMCk7IAorCisJLyogSW5pdGlhbGl6ZSB0aGUgc2VydmVyIGFuZCBjbGllbnQgYWRkcmVzc2VzLiAqLyAKKwlzdnJfbG9vcC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzdnJfbG9vcC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCXN2cl9sb29wLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKwljbHRfbG9vcC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwljbHRfbG9vcC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCWNsdF9sb29wLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8yKTsKKworCS8qIENyZWF0ZSBhbmQgYmluZCB0aGUgc2VydmVyIHNvY2tldC4gICovCisgICAgICAgIHN2cl9zayA9IHRlc3Rfc29ja2V0KEFGX0lORVQsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCXRlc3RfYmluZChzdnJfc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmc3ZyX2xvb3AsIHNpemVvZihzdnJfbG9vcCkpOworCisJLyogTWFyayBzZXJ2ZXIgc29ja2V0IGFzIGJlaW5nIGFibGUgdG8gYWNjZXB0IG5ldyBhc3NvY2lhdGlvbnMuICAqLworCXRlc3RfbGlzdGVuKHN2cl9zaywgMSk7CisKKwkvKiBDcmVhdGUgYW5kIGJpbmQgdGhlIGNsaWVudCBzb2NrZXRzLiAgKi8KKwljbHRfc2sgPSB0ZXN0X3NvY2tldChBRl9JTkVULCBTT0NLX1NFUVBBQ0tFVCwgSVBQUk9UT19TQ1RQKTsKKwl0ZXN0X2JpbmQoY2x0X3NrLCAoc3RydWN0IHNvY2thZGRyICopJmNsdF9sb29wLCBzaXplb2YoY2x0X2xvb3ApKTsKKworCS8qIEVuYWJsZSBBU1NPQ19DSEFOR0UgYW5kIFNORFJDVklORk8gbm90aWZpY2F0aW9ucy4gKi8KKwl0ZXN0X2VuYWJsZV9hc3NvY19jaGFuZ2Uoc3ZyX3NrKTsKKwl0ZXN0X2VuYWJsZV9hc3NvY19jaGFuZ2UoY2x0X3NrKTsKKworCS8qIFNlbmQgYSBtZXNzYWdlLiBUaGlzIHdpbGwgY3JlYXRlIHRoZSBhc3NvY2lhdGlvbi4gICovCisJbWVtc2V0KCZvdXRtZXNzYWdlLCAwLCBzaXplb2Yob3V0bWVzc2FnZSkpOwkKKwlvdXRtZXNzYWdlLm1zZ19uYW1lID0gJnN2cl9sb29wOworCW91dG1lc3NhZ2UubXNnX25hbWVsZW4gPSBzaXplb2Yoc3ZyX2xvb3ApOworCW91dG1lc3NhZ2UubXNnX2lvdiA9ICZvdXRfaW92OworCW91dG1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisJbXNnX2J1ZiA9IHRlc3RfYnVpbGRfbXNnKDMwMDAwKTsKKwlvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9iYXNlID0gbXNnX2J1ZjsKKwlvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9sZW4gPSAzMDAwMDsKKwl0ZXN0X3NlbmRtc2coY2x0X3NrLCAmb3V0bWVzc2FnZSwgMCwgMzAwMDApOworCisJLyogSW5pdGlhbGl6ZSBpbm1lc3NhZ2UgZm9yIGFsbCByZWNlaXZlcy4gKi8KKwliaWdfYnVmZmVyID0gdGVzdF9tYWxsb2MoUkVBTExZX0JJRyk7CisgICAgICAgIG1lbXNldCgmaW5tZXNzYWdlLCAwLCBzaXplb2YoaW5tZXNzYWdlKSk7CisJaW92Lmlvdl9iYXNlID0gYmlnX2J1ZmZlcjsKKwlpb3YuaW92X2xlbiA9IDIwMDA7CisJaW5tZXNzYWdlLm1zZ19pb3YgPSAmaW92OworCWlubWVzc2FnZS5tc2dfaW92bGVuID0gMTsKKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisKKwkvKiBSZWNlaXZlIENPTU1fVVAgb24gY2x0X3NrLiAqLworCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCWVycm9yID0gdGVzdF9yZWN2bXNnKGNsdF9zaywgJmlubWVzc2FnZSwgMCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfQ09NTV9VUCk7CQorCisJLyogUmVjZWl2ZSBDT01NX1VQIG9uIHN2cl9zay4gKi8KKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwllcnJvciA9IHRlc3RfcmVjdm1zZyhzdnJfc2ssICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9DT01NX1VQKTsJCisKKwkvKiBSZWFkIHRoZSAzMDAwMCBieXRlIG1lc3NhZ2UgdXNpbmcgbXVsdGlwbGUgcmVjdm1zZygpIGNhbGxzIGluIGEKKwkgKiBsb29wIHdpdGggMjAwMCBieXRlcyBwZXIgcmVhZC4gCisJICovCisJZm9yIChpID0gMCwgbXNnbGVuID0gMzAwMDA7IGkgPCAxNTsgaSsrLCBtc2dsZW4tPTIwMDApIHsKKwkJaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworCQlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwkJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc3ZyX3NrLCAmaW5tZXNzYWdlLCBNU0dfUEVFSyk7CisJCXRlc3RfY2hlY2tfbXNnX2RhdGEoJmlubWVzc2FnZSwgZXJyb3IsIG1zZ2xlbiwKKwkJCQkgICAgTVNHX0VPUiwgMCwgMCk7CisKKwkJaW92Lmlvdl9sZW4gPSAyMDAwOworCQlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwkJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc3ZyX3NrLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJCXRlc3RfY2hlY2tfbXNnX2RhdGEoJmlubWVzc2FnZSwgZXJyb3IsIDIwMDAsCisJCQkJICAgICgoaT09MTQpP01TR19FT1I6MCksIDAsIDApOworCX0KKworCXRzdF9yZXNtKFRQQVNTLCAicmVjdm1zZyB3aXRoIE1TR19QRUVLIGZsYWciKTsKKwl0c3RfcmVzbShUUEFTUywgIk1TR19FT1IgaW4gbXNnX2ZsYWdzIHNldCBjb3JyZWN0bHkiKTsKKworCWNsb3NlKHN2cl9zayk7CisJY2xvc2UoY2x0X3NrKTsKKworICAgICAgICAvKiBJbmRpY2F0ZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24uICAqLworICAgICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3Rfc2N0cF9zZW5kcmVjdm1zZy5jIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF9zY3RwX3NlbmRyZWN2bXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjY2Q1YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3Rfc2N0cF9zZW5kcmVjdm1zZy5jCkBAIC0wLDAgKzEsMzcwIEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMworICogQ29weXJpZ2h0IChjKSAyMDAzIEludGVsIENvcnAuCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsKKyAqIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mCisgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0CisgKiB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQKKyAqICAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogUGxlYXNlIHNlbmQgYW55IGJ1ZyByZXBvcnRzIG9yIGZpeGVzIHlvdSBtYWtlIHRvIHRoZQorICogZW1haWwgYWRkcmVzcyhlcyk6CisgKiAgICBsa3NjdHAgZGV2ZWxvcGVycyA8bGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIE9yIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHdlYnNpdGU6CisgKiAgICBodHRwOi8vd3d3LnNmLm5ldC9wcm9qZWN0cy9sa3NjdHAKKyAqCisgKiBBbnkgYnVncyByZXBvcnRlZCB0byB1cyB3ZSB3aWxsIHRyeSB0byBmaXguLi4gYW55IGZpeGVzIHNoYXJlZCB3aWxsCisgKiBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBTQ1RQIHJlbGVhc2UuCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqIFRvIGNvbXBpbGUgdGhlIHY2IHZlcnNpb24sIHNldCB0aGUgc3ltYm9sIFRFU1RfVjYgdG8gMS4KKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgQXJkZWxsZSBGYW4JCTxhcmRlbGxlLmZhbkBpbnRlbC5jb20+CisgKiAgICBTcmlkaGFyIFNhbXVkcmFsYQkgCTxzcmlAdXMuaWJtLmNvbT4KKyAqLworCisvKiBUaGlzIGlzIGEgYmFzaWMgZnVuY3Rpb25hbCB0ZXN0IGZvciB0aGUgU0NUUCBuZXcgbGlicmFyeSBBUElzCisgKiBzY3RwX3NlbmRtc2coKSBhbmQgc2N0cF9yZWN2bXNnKCkuIHRlc3RfdGltZXRvbGl2ZS5jIGlzIHJld3JpdHRlbiB1c2luZworICogdGhlc2UgbmV3IEFQSXMuIAorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9zY3RwLmg+CisjaW5jbHVkZSA8c2N0cHV0aWwuaD4KKworY2hhciAqVENJRCA9IF9fRklMRV9fOworaW50IFRTVF9UT1RBTCA9IDEwOworaW50IFRTVF9DTlQgPSAwOworCisvKiBSQ1ZCVUYgdmFsdWUsIGFuZCBpbmRpcmVjdGx5IFJXTkQqMiAqLworI2RlZmluZSBTTUFMTF9SQ1ZCVUYgMzAwMAorI2RlZmluZSBTTUFMTF9NQVhTRUcgNTAwCisvKiBUaGlzIGlzIGV4dHJhIGRhdGEgbGVuZ3RoIHRvIGVuc3VyZSByd25kIGNsb3NlcyAqLworI2RlZmluZSBSV05EX1NMT1AgICAgMTAwCitzdGF0aWMgY2hhciAqZmlsbG1zZyA9IE5VTEw7CitzdGF0aWMgY2hhciAqdHRsbXNnID0gIlRoaXMgc2hvdWxkIHRpbWUgb3V0IVxuIjsKK3N0YXRpYyBjaGFyICpub3R0bG1zZyA9ICJUaGlzIHNob3VsZCBOT1QgdGltZSBvdXQhXG4iOworc3RhdGljIGNoYXIgdHRsZnJhZ1tTTUFMTF9NQVhTRUcqM10gPSB7MH07CitzdGF0aWMgY2hhciAqbWVzc2FnZSA9ICJIZWxsbyB3b3JsZFxuIjsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgc2sxLCBzazI7CisJc29ja2FkZHJfc3RvcmFnZV90IGxvb3AxOworCXNvY2thZGRyX3N0b3JhZ2VfdCBsb29wMjsKKwlzb2NrYWRkcl9zdG9yYWdlX3QgbXNnbmFtZTsKKwlpbnQgZXJyb3I7CisJaW50IHBmX2NsYXNzOworCXVpbnQzMl90IHBwaWQ7CisJdWludDMyX3Qgc3RyZWFtOworCXN0cnVjdCBzY3RwX2V2ZW50X3N1YnNjcmliZSBzdWJzY3JpYmU7CisJY2hhciAqYmlnX2J1ZmZlcjsKKwlpbnQgb2Zmc2V0LCBtc2dfZmxhZ3M7CisJc29ja2xlbl90IG1zZ25hbWVfbGVuOworCXNpemVfdCBidWZsZW47CisJc3RydWN0IHNjdHBfc2VuZF9mYWlsZWQgKnNzZjsKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvIHNpbmZvOworCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gc25kX3NpbmZvOworCXNjdHBfYXNzb2NfdCBhc3NvY2lkMTsKKwlzb2NrbGVuX3QgbGVuLCBvbGRsZW47CisJc3RydWN0IHNjdHBfc3RhdHVzIGdzdGF0dXM7CisKKwkvKiBSYXRoZXIgdGhhbiBmZmx1c2goKSB0aHJvdWdob3V0IHRoZSBjb2RlLCBzZXQgc3Rkb3V0IHRvCisJICogYmUgdW5idWZmZXJlZC4KKwkgKi8KKwlzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsKKworCS8qIFNldCBzb21lIGJhc2ljIHZhbHVlcyB3aGljaCBkZXBlbmQgb24gdGhlIGFkZHJlc3MgZmFtaWx5LiAqLworI2lmIFRFU1RfVjYKKwlwZl9jbGFzcyA9IFBGX0lORVQ2OworCisJbG9vcDEudjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwlsb29wMS52Ni5zaW42X2FkZHIgPSBpbjZhZGRyX2xvb3BiYWNrOworCWxvb3AxLnY2LnNpbjZfcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKwlsb29wMi52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCWxvb3AyLnY2LnNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7CisJbG9vcDIudjYuc2luNl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8yKTsKKyNlbHNlCisJcGZfY2xhc3MgPSBQRl9JTkVUOworCisJbG9vcDEudjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJbG9vcDEudjQuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKwlsb29wMS52NC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKwlsb29wMi52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlsb29wMi52NC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCWxvb3AyLnY0LnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8yKTsKKyNlbmRpZiAvKiBURVNUX1Y2ICovCisKKwkvKiBDcmVhdGUgdGhlIHR3byBlbmRwb2ludHMgd2hpY2ggd2lsbCB0YWxrIHRvIGVhY2ggb3RoZXIuICAqLworCXNrMSA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NFUVBBQ0tFVCwgSVBQUk9UT19TQ1RQKTsKKyAgICAgICAgc2syID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCisJLyogU2V0IHRoZSBNQVhTRUcgdG8gc29tZXRoaW5nIHNtYWxsaXNoLiAqLworCXsKKwkJaW50IHZhbCA9IFNNQUxMX01BWFNFRzsKKwkJdGVzdF9zZXRzb2Nrb3B0KHNrMSwgU0NUUF9NQVhTRUcsICZ2YWwsIHNpemVvZih2YWwpKTsKKwl9CisKKwltZW1zZXQoJnN1YnNjcmliZSwgMCwgc2l6ZW9mKHN1YnNjcmliZSkpOworCXN1YnNjcmliZS5zY3RwX2RhdGFfaW9fZXZlbnQgPSAxOworCXN1YnNjcmliZS5zY3RwX2Fzc29jaWF0aW9uX2V2ZW50ID0gMTsKKwlzdWJzY3JpYmUuc2N0cF9zZW5kX2ZhaWx1cmVfZXZlbnQgPSAxOworCXRlc3Rfc2V0c29ja29wdChzazEsIFNDVFBfRVZFTlRTLCAmc3Vic2NyaWJlLCBzaXplb2Yoc3Vic2NyaWJlKSk7CisJdGVzdF9zZXRzb2Nrb3B0KHNrMiwgU0NUUF9FVkVOVFMsICZzdWJzY3JpYmUsIHNpemVvZihzdWJzY3JpYmUpKTsKKworICAgICAgICAvKiBCaW5kIHRoZXNlIHNvY2tldHMgdG8gdGhlIHRlc3QgcG9ydHMuICAqLworICAgICAgICB0ZXN0X2JpbmQoc2sxLCAmbG9vcDEuc2EsIHNpemVvZihsb29wMSkpOworICAgICAgICB0ZXN0X2JpbmQoc2syLCAmbG9vcDIuc2EsIHNpemVvZihsb29wMikpOworCisJLyoKKwkgKiBTZXQgdGhlIFJXTkQgc21hbGwgc28gd2UgY2FuIGZpbGwgaXQgdXAgZWFzaWx5LgorCSAqLworCWxlbiA9IHNpemVvZihpbnQpOworCWVycm9yID0gZ2V0c29ja29wdChzazIsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJm9sZGxlbiwgJmxlbik7CisgICAgICAgCisJaWYgKGVycm9yKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJjYW4ndCBnZXQgcmN2YnVmIHNpemU6ICVzIiwKKwkJCSBzdHJlcnJvcihlcnJubykpOworCisJbGVuID0gU01BTExfUkNWQlVGOyAvKiBSZWFsbHkgYmVjb21lcyAyeGxlbiB3aGVuIHNldC4gKi8KKworCWVycm9yID0gc2V0c29ja29wdChzazIsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJmxlbiwgc2l6ZW9mKGxlbikpOworCWlmIChlcnJvcikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2V0c29ja29wdChTT19SQ1ZCVUYpOiAlcyIsCisJCQkgc3RyZXJyb3IoZXJybm8pKTsKKworICAgICAgIC8qIE1hcmsgc2syIGFzIGJlaW5nIGFibGUgdG8gYWNjZXB0IG5ldyBhc3NvY2lhdGlvbnMuICAqLworCXRlc3RfbGlzdGVuKHNrMiwgMSk7CisKKwkvKiBTZW5kIHRoZSBmaXJzdCBtZXNzYWdlLiAgVGhpcyB3aWxsIGNyZWF0ZSB0aGUgYXNzb2NpYXRpb24uICAqLworCXBwaWQgPSByYW5kKCk7CisJc3RyZWFtID0gMTsKKwl0ZXN0X3NjdHBfc2VuZG1zZyhzazEsIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSArIDEsCisJCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmbG9vcDIsIHNpemVvZihsb29wMiksCisJCQkgIHBwaWQsIDAsIHN0cmVhbSwgMCwgMCk7CisKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfc2VuZG1zZyIpOworCisJLyogR2V0IHRoZSBjb21tdW5pY2F0aW9uIHVwIG1lc3NhZ2Ugb24gc2syLiAgKi8KKwlidWZsZW4gPSBSRUFMTFlfQklHOworCWJpZ19idWZmZXIgPSB0ZXN0X21hbGxvYyhidWZsZW4pOworCW1zZ25hbWVfbGVuID0gc2l6ZW9mKG1zZ25hbWUpOworCW1zZ19mbGFncyA9IDA7CisJZXJyb3IgPSB0ZXN0X3NjdHBfcmVjdm1zZyhzazIsIGJpZ19idWZmZXIsIGJ1ZmxlbiwKKwkJCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmbXNnbmFtZSwgJm1zZ25hbWVfbGVuLAorCQkJCSAgJnNpbmZvLCAmbXNnX2ZsYWdzKTsKKyNpZiAwCisJYXNzb2NpZDIgPSAoKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSAqKWJpZ19idWZmZXIpLT5zYWNfYXNzb2NfaWQ7CisjZW5kaWYKKwl0ZXN0X2NoZWNrX2J1Zl9ub3RpZmljYXRpb24oYmlnX2J1ZmZlciwgZXJyb3IsIG1zZ19mbGFncywKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOworCisKKwkvKiBHZXQgdGhlIGNvbW11bmljYXRpb24gdXAgbWVzc2FnZSBvbiBzazEuICAqLworCWJ1ZmxlbiA9IFJFQUxMWV9CSUc7CisJbXNnbmFtZV9sZW4gPSBzaXplb2YobXNnbmFtZSk7CisJbXNnX2ZsYWdzID0gMDsKKwllcnJvciA9IHRlc3Rfc2N0cF9yZWN2bXNnKHNrMSwgYmlnX2J1ZmZlciwgYnVmbGVuLAorCQkJCSAgKHN0cnVjdCBzb2NrYWRkciAqKSZtc2duYW1lLCAmbXNnbmFtZV9sZW4sCisJCQkJICAmc2luZm8sICZtc2dfZmxhZ3MpOyAKKwlhc3NvY2lkMSA9ICgoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICopYmlnX2J1ZmZlciktPnNhY19hc3NvY19pZDsKKwl0ZXN0X2NoZWNrX2J1Zl9ub3RpZmljYXRpb24oYmlnX2J1ZmZlciwgZXJyb3IsIG1zZ19mbGFncywKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOworCisJdHN0X3Jlc20oVFBBU1MsICJzY3RwX3JlY3Ztc2cgU0NUUF9DT01NX1VQIG5vdGlmaWNhdGlvbiIpOworCisJLyogR2V0IHRoZSBmaXJzdCBtZXNzYWdlIHdoaWNoIHdhcyBzZW50LiAgKi8KKwlidWZsZW4gPSBSRUFMTFlfQklHOworCW1zZ25hbWVfbGVuID0gc2l6ZW9mKG1zZ25hbWUpOworCW1zZ19mbGFncyA9IDA7CisJZXJyb3IgPSB0ZXN0X3NjdHBfcmVjdm1zZyhzazIsIGJpZ19idWZmZXIsIGJ1ZmxlbiwKKwkJCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmbXNnbmFtZSwgJm1zZ25hbWVfbGVuLAorCQkJCSAgJnNpbmZvLCAmbXNnX2ZsYWdzKTsgCisJdGVzdF9jaGVja19idWZfZGF0YShiaWdfYnVmZmVyLCBlcnJvciwgbXNnX2ZsYWdzLCAmc2luZm8sCisJCQkgICAgc3RybGVuKG1lc3NhZ2UpICsgMSwgTVNHX0VPUiwgc3RyZWFtLCBwcGlkKTsgCisKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfcmVjdm1zZyBkYXRhIik7CisKKwkvKiBGaWd1cmUgb3V0IGhvdyBiaWcgdG8gbWFrZSBvdXIgZmlsbG1zZyAqLworCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9zdGF0dXMpOworCW1lbXNldCgmZ3N0YXR1cywwLHNpemVvZihzdHJ1Y3Qgc2N0cF9zdGF0dXMpKTsKKwlnc3RhdHVzLnNzdGF0X2Fzc29jX2lkID0gYXNzb2NpZDE7CisJZXJyb3IgPSBnZXRzb2Nrb3B0KHNrMSwgSVBQUk9UT19TQ1RQLCBTQ1RQX1NUQVRVUywgJmdzdGF0dXMsICZsZW4pOworCisJaWYgKGVycm9yKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJjYW4ndCBnZXQgcnduZCBzaXplOiAlcyIsCisJCQlzdHJlcnJvcihlcnJubykpOworCXRzdF9yZXNtKFRJTkZPLCAiY3JlYXRpbmcgYSBmaWxsbXNnIG9mIHNpemUgJWQiLAorCQlnc3RhdHVzLnNzdGF0X3J3bmQrUldORF9TTE9QKTsKKyAgICAgICAgZmlsbG1zZyA9IG1hbGxvYyhnc3RhdHVzLnNzdGF0X3J3bmQrUldORF9TTE9QKTsKKworCS8qIFNlbmQgYSBmaWxsbXNnICovCisJbWVtc2V0KGZpbGxtc2csICdYJywgZ3N0YXR1cy5zc3RhdF9yd25kK1JXTkRfU0xPUCk7CisJZmlsbG1zZ1tnc3RhdHVzLnNzdGF0X3J3bmQrUldORF9TTE9QLTFdID0gJ1wwJzsKKwlwcGlkKys7CisJc3RyZWFtKys7CisJdGVzdF9zY3RwX3NlbmRtc2coc2sxLCBmaWxsbXNnLCBnc3RhdHVzLnNzdGF0X3J3bmQrUldORF9TTE9QLCAKKwkJCSAgKHN0cnVjdCBzb2NrYWRkciAqKSZsb29wMiwgc2l6ZW9mKGxvb3AyKSwKKwkJCSAgcHBpZCwgMCwgc3RyZWFtLCAwLCAwKTsKKworCS8qIE5vdyBzZW5kIGEgbWVzc2FnZSB0aGF0IHdpbGwgdGltZW91dC4gKi8KKwl0ZXN0X3NjdHBfc2VuZG1zZyhzazEsIHR0bG1zZywgc3RybGVuKHR0bG1zZykgKyAxLAorCQkJICAoc3RydWN0IHNvY2thZGRyICopJmxvb3AyLCBzaXplb2YobG9vcDIpLAorCQkJICBwcGlkLCAwLCBzdHJlYW0sIDIwMDAsIDApOworCisJdHN0X3Jlc20oVFBBU1MsICJzY3RwX3NlbmRtc2cgd2l0aCB0dGwiKTsKKworCS8qIE5leHQgc2VuZCBhIG1lc3NhZ2UgdGhhdCB3b24ndCB0aW1lIG91dC4gKi8KKwl0ZXN0X3NjdHBfc2VuZG1zZyhzazEsIG5vdHRsbXNnLCBzdHJsZW4obm90dGxtc2cpICsgMSwKKwkJCSAgKHN0cnVjdCBzb2NrYWRkciAqKSZsb29wMiwgc2l6ZW9mKGxvb3AyKSwKKwkJCSAgcHBpZCwgMCwgc3RyZWFtLCAwLCAwKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9zZW5kbXNnIHdpdGggemVybyB0dGwiKTsKKworCS8qIEFuZCBmaW5hbGx5IGEgZnJhZ21lbnRlZCBtZXNzYWdlIHRoYXQgd2lsbCB0aW1lIG91dC4gKi8KKwltZW1zZXQodHRsZnJhZywgNDgsIHNpemVvZih0dGxmcmFnKSk7IC8qIDQ4IGlzIHRoZSBhc2NpaSBvZiAnMCcgKi8KKwl0dGxmcmFnW3NpemVvZih0dGxmcmFnKS0xXSA9ICdcMCc7CisJdGVzdF9zY3RwX3NlbmRtc2coc2sxLCB0dGxmcmFnLCBzaXplb2YodHRsZnJhZyksCisJCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmbG9vcDIsIHNpemVvZihsb29wMiksCisJCQkgIHBwaWQsIDAsIHN0cmVhbSwgMjAwMCwgMCk7CisKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfc2VuZG1zZyBmcmFnbWVudGVkIG1zZyB3aXRoIHR0bCIpOworCisJLyogU2xlZXAgd2FpdGluZyBmb3IgdGhlIG1lc3NhZ2UgdG8gdGltZSBvdXQuICovCisJdHN0X3Jlc20oVElORk8sICIqKiAgU0xFRVBJTkcgZm9yIDMgc2Vjb25kcyAqKiIpOworCXNsZWVwKDMpOworCisJLyogR2V0IHRoZSBmaWxsbXNnLiAqLworCWRvIHsKKwkJYnVmbGVuID0gUkVBTExZX0JJRzsKKwkJbXNnbmFtZV9sZW4gPSBzaXplb2YobXNnbmFtZSk7CisJCW1zZ19mbGFncyA9IDA7CisJCXRlc3Rfc2N0cF9yZWN2bXNnKHNrMiwgYmlnX2J1ZmZlciwgYnVmbGVuLAorCQkJICAoc3RydWN0IHNvY2thZGRyICopJm1zZ25hbWUsICZtc2duYW1lX2xlbiwKKwkJCSAgJnNpbmZvLCAmbXNnX2ZsYWdzKTsgCisJfSB3aGlsZSAoIShtc2dfZmxhZ3MgJiBNU0dfRU9SKSk7CisKKwkvKiBHZXQgdGhlIG1lc3NhZ2UgdGhhdCBkaWQgTk9UIHRpbWUgb3V0LiAqLworCWJ1ZmxlbiA9IFJFQUxMWV9CSUc7CisJbXNnbmFtZV9sZW4gPSBzaXplb2YobXNnbmFtZSk7CisJbXNnX2ZsYWdzID0gMDsKKwllcnJvciA9IHRlc3Rfc2N0cF9yZWN2bXNnKHNrMiwgYmlnX2J1ZmZlciwgYnVmbGVuLAorCQkJICAoc3RydWN0IHNvY2thZGRyICopJm1zZ25hbWUsICZtc2duYW1lX2xlbiwKKwkJCSAgJnNpbmZvLCAmbXNnX2ZsYWdzKTsgCisJdGVzdF9jaGVja19idWZfZGF0YShiaWdfYnVmZmVyLCBlcnJvciwgbXNnX2ZsYWdzLCAmc2luZm8sCisJCQkgICAgc3RybGVuKG5vdHRsbXNnKSArIDEsIE1TR19FT1IsIHN0cmVhbSwgcHBpZCk7IAorCWlmICgwICE9IHN0cm5jbXAoYmlnX2J1ZmZlciwgbm90dGxtc2csIHN0cmxlbihub3R0bG1zZykpKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX3JlY3Ztc2c6IFdyb25nIE1lc3NhZ2UgISEhIik7CisKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfcmVjdm1zZyBtc2cgd2l0aCB6ZXJvIHR0bCIpOworCisJLyogR2V0IHRoZSBTRU5EX0ZBSUxFRCBub3RpZmljYXRpb24gZm9yIHRoZSBtZXNzYWdlIHRoYXQgRElECisJICogdGltZSBvdXQuCisJICovCisJYnVmbGVuID0gUkVBTExZX0JJRzsKKwltc2duYW1lX2xlbiA9IHNpemVvZihtc2duYW1lKTsKKwltc2dfZmxhZ3MgPSAwOworCWVycm9yID0gdGVzdF9zY3RwX3JlY3Ztc2coc2sxLCBiaWdfYnVmZmVyLCBidWZsZW4sCisJCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmbXNnbmFtZSwgJm1zZ25hbWVfbGVuLAorCQkJICAmc2luZm8sICZtc2dfZmxhZ3MpOyAKKwl0ZXN0X2NoZWNrX2J1Zl9ub3RpZmljYXRpb24oYmlnX2J1ZmZlciwgZXJyb3IsIG1zZ19mbGFncywKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX3NlbmRfZmFpbGVkKSArCisJCQkJCQkJc3RybGVuKHR0bG1zZykgKyAxLAorCQkJCSAgICBTQ1RQX1NFTkRfRkFJTEVELCAwKTsKKwlzc2YgPSAoc3RydWN0IHNjdHBfc2VuZF9mYWlsZWQgKiliaWdfYnVmZmVyOworCWlmICgwICE9IHN0cm5jbXAodHRsbXNnLCAoY2hhciAqKXNzZi0+c3NmX2RhdGEsIHN0cmxlbih0dGxtc2cpICsgMSkpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIlNFTkRfRkFJTEVEIGRhdGEgbWlzbWF0Y2giKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9yZWN2bXNnIFNFTkRfRkFJTEVEIGZvciBtZXNzYWdlIHdpdGggdHRsIik7CisKKwlvZmZzZXQgPSAwOworCisJLyogR2V0IHRoZSBTRU5EX0ZBSUxFRCBub3RpZmljYXRpb25zIGZvciB0aGUgZnJhZ21lbnRlZCBtZXNzYWdlIHRoYXQgCisJICogdGltZWQgb3V0LgorCSAqLworCWRvIHsKKwkJYnVmbGVuID0gUkVBTExZX0JJRzsKKwkJbXNnbmFtZV9sZW4gPSBzaXplb2YobXNnbmFtZSk7CisJCW1zZ19mbGFncyA9IDA7CisJCWVycm9yID0gdGVzdF9zY3RwX3JlY3Ztc2coc2sxLCBiaWdfYnVmZmVyLCBidWZsZW4sCisJCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmbXNnbmFtZSwgJm1zZ25hbWVfbGVuLAorCQkJICAmc2luZm8sICZtc2dfZmxhZ3MpOyAKKwkJdGVzdF9jaGVja19idWZfbm90aWZpY2F0aW9uKGJpZ19idWZmZXIsIGVycm9yLCBtc2dfZmxhZ3MsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfc2VuZF9mYWlsZWQpICsKKwkJCQkJCQkgICAgICAgICAgU01BTExfTUFYU0VHLAorCQkJCQkgICAgU0NUUF9TRU5EX0ZBSUxFRCwgMCk7CisJCXNzZiA9IChzdHJ1Y3Qgc2N0cF9zZW5kX2ZhaWxlZCAqKWJpZ19idWZmZXI7CisJCWlmICgwICE9IHN0cm5jbXAoJnR0bGZyYWdbb2Zmc2V0XSwgKGNoYXIgKilzc2YtPnNzZl9kYXRhLAorCQkJCSBTTUFMTF9NQVhTRUcpKQorCQkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiU0VORF9GQUlMRUQgZGF0YSBtaXNtYXRjaCIpOworCQlvZmZzZXQgKz0gU01BTExfTUFYU0VHOworCX0gd2hpbGUgKCEoc3NmLT5zc2ZfaW5mby5zaW5mb19mbGFncyAmIDB4MDEpKTsgLyogTEFTVCBGUkFHICovCisKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfcmVjdm1zZyBTRU5EX0ZBSUxFRCBmb3IgZnJhZ21lbnRlZCBtZXNzYWdlIHdpdGggIgorCQkgInR0bCIpOworCisJc25kX3NpbmZvLnNpbmZvX3BwaWQgPSByYW5kKCk7CisJc25kX3NpbmZvLnNpbmZvX2ZsYWdzID0gMDsgCisJc25kX3NpbmZvLnNpbmZvX3N0cmVhbSA9IDI7IAorCXNuZF9zaW5mby5zaW5mb190aW1ldG9saXZlID0gMDsgCisJc25kX3NpbmZvLnNpbmZvX2Fzc29jX2lkID0gYXNzb2NpZDE7IAorCXRlc3Rfc2N0cF9zZW5kKHNrMSwgbWVzc2FnZSwgc3RybGVuKG1lc3NhZ2UpICsgMSwgJnNuZF9zaW5mbywKKwkJICAgICAgIE1TR19OT1NJR05BTCk7CisKKwlidWZsZW4gPSBSRUFMTFlfQklHOworCW1zZ25hbWVfbGVuID0gc2l6ZW9mKG1zZ25hbWUpOworCW1zZ19mbGFncyA9IDA7CisJZXJyb3IgPSB0ZXN0X3NjdHBfcmVjdm1zZyhzazIsIGJpZ19idWZmZXIsIGJ1ZmxlbiwKKwkJCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmbXNnbmFtZSwgJm1zZ25hbWVfbGVuLAorCQkJCSAgJnNpbmZvLCAmbXNnX2ZsYWdzKTsgCisJdGVzdF9jaGVja19idWZfZGF0YShiaWdfYnVmZmVyLCBlcnJvciwgbXNnX2ZsYWdzLCAmc2luZm8sCisJCQkgICAgc3RybGVuKG1lc3NhZ2UpICsgMSwgTVNHX0VPUiwgc25kX3NpbmZvLnNpbmZvX3N0cmVhbSwKKwkJCSAgICBzbmRfc2luZm8uc2luZm9fcHBpZCk7IAorCisJdHN0X3Jlc20oVFBBU1MsICJzY3RwX3NlbmQiKTsKKworCS8qIFNodXQgZG93biB0aGUgbGluay4gICovCisJY2xvc2Uoc2sxKTsKKworCS8qIEdldCB0aGUgc2h1dGRvd24gY29tcGxldGUgbm90aWZpY2F0aW9uLiAqLworCWJ1ZmxlbiA9IFJFQUxMWV9CSUc7CisJbXNnbmFtZV9sZW4gPSBzaXplb2YobXNnbmFtZSk7CisJbXNnX2ZsYWdzID0gMDsKKwllcnJvciA9IHRlc3Rfc2N0cF9yZWN2bXNnKHNrMiwgYmlnX2J1ZmZlciwgYnVmbGVuLAorCQkgIChzdHJ1Y3Qgc29ja2FkZHIgKikmbXNnbmFtZSwgJm1zZ25hbWVfbGVuLAorCQkgICZzaW5mbywgJm1zZ19mbGFncyk7IAorCXRlc3RfY2hlY2tfYnVmX25vdGlmaWNhdGlvbihiaWdfYnVmZmVyLCBlcnJvciwgbXNnX2ZsYWdzLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfU0hVVERPV05fQ09NUCk7CisKKwljbG9zZShzazIpOworCisJLyogSW5kaWNhdGUgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLiAgKi8KKwlyZXR1cm4gMDsJCit9CmRpZmYgLS1naXQgYS9zcmMvZnVuY190ZXN0cy90ZXN0X3NjdHBfc2VuZHZyZWN2di5jIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF9zY3RwX3NlbmR2cmVjdnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTkxZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF9zY3RwX3NlbmR2cmVjdnYuYwpAQCAtMCwwICsxLDI3MCBAQAorLyogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24KKyAqIChDKSBDb3B5cmlnaHQgUkVESEFUIENvcnAuIDIwMTgKKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiBUbyBjb21waWxlIHRoZSB2NiB2ZXJzaW9uLCBzZXQgdGhlIHN5bWJvbCBURVNUX1Y2IHRvIDEuCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgIFhpbiBMb25nCQk8bHVjaWVuLnhpbkBnbWFpbC5jb20+CisgKi8KKworLyogVGhpcyBpcyBhIGJhc2ljIGZ1bmN0aW9uYWwgdGVzdCBmb3IgdGhlIFNDVFAgbmV3IGxpYnJhcnkgQVBJcworICogc2N0cF9zZW5kdigpIGFuZCBzY3RwX3JlY3Z2KCkuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKyNpbmNsdWRlIDxzY3RwdXRpbC5oPgorCitjaGFyICpUQ0lEID0gX19GSUxFX187CitpbnQgVFNUX1RPVEFMID0gMTA7CitpbnQgVFNUX0NOVDsKKworLyogUkNWQlVGIHZhbHVlLCBhbmQgaW5kaXJlY3RseSBSV05EKjIgKi8KKyNkZWZpbmUgU01BTExfUkNWQlVGIDMwMDAKKyNkZWZpbmUgU01BTExfTUFYU0VHIDUwMAorLyogVGhpcyBpcyBleHRyYSBkYXRhIGxlbmd0aCB0byBlbnN1cmUgcnduZCBjbG9zZXMgKi8KKyNkZWZpbmUgUldORF9TTE9QICAgIDEwMAorc3RhdGljIGNoYXIgKm1lc3NhZ2UgPSAiSGVsbG8gd29ybGRcbiI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc29ja2FkZHJfc3RvcmFnZV90IGxvb3AxLCBsb29wMiwgbXNnbmFtZTsKKwlpbnQgc2sxLCBzazIsIGVycm9yLCBidWZsZW4sIGksIGFkZHJjbnQ7CisJc29ja2xlbl90IG1zZ25hbWVfbGVuLCBybl9sZW47CisJc3RydWN0IHNjdHBfYXV0aGluZm8gYXV0aGluZm87CisJc3RydWN0IHNjdHBfc25kaW5mbyBzbmRpbmZvOworCXN0cnVjdCBzb2NrYWRkciAqYWRkcl9saXN0OworCXN0cnVjdCBzY3RwX3NlbmR2X3NwYSBzcGE7CisJdWludDMyX3QgaW5mb3R5cGUsIHN0cmVhbTsKKwlzdHJ1Y3QgaW92ZWMgaW92LCBpb3Z4WzNdOworCXN0cnVjdCBzY3RwX3ByaW5mbyBwcmluZm87CisJc3RydWN0IHNjdHBfcmVjdnZfcm4gcm47CisJaW50IHBmX2NsYXNzLCBtc2dfZmxhZ3M7CisJc29ja2xlbl90IHZhbCA9IDE7CisJY2hhciBhZGRyX3N0cls2NF07CisKKwkvKiBTZXQgc29tZSBiYXNpYyB2YWx1ZXMgd2hpY2ggZGVwZW5kIG9uIHRoZSBhZGRyZXNzIGZhbWlseS4gKi8KKyNpZiBURVNUX1Y2CisJc3RydWN0IHNvY2thZGRyX2luNiAqdjZhZGRyczsKKworCXBmX2NsYXNzID0gUEZfSU5FVDY7CisKKwlsb29wMS52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworCWxvb3AxLnY2LnNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7CisJbG9vcDEudjYuc2luNl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCWxvb3AyLnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJbG9vcDIudjYuc2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjazsKKwlsb29wMi52Ni5zaW42X3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzIpOworCisJYWRkcmNudCA9IDU7CisJdjZhZGRycyA9IHRlc3RfbWFsbG9jKHNpemVvZigqdjZhZGRycykgKiBhZGRyY250KTsKKwl2NmFkZHJzWzBdLnNpbjZfZmFtaWx5ID0gUEZfSU5FVDY7CisJdjZhZGRyc1swXS5zaW42X2FkZHIgPSBpbjZhZGRyX2xvb3BiYWNrOworCXY2YWRkcnNbMF0uc2luNl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8yKTsKKwlmb3IgKGkgPSAxOyBpIDwgYWRkcmNudDsgaSsrKSB7CisJCXNwcmludGYoYWRkcl9zdHIsICIyMDIwOjolZCIsIGkpOworCQl2NmFkZHJzW2ldLnNpbjZfZmFtaWx5ID0gUEZfSU5FVDY7CisJCWluZXRfcHRvbihQRl9JTkVUNiwgYWRkcl9zdHIsICZ2NmFkZHJzW2ldLnNpbjZfYWRkcik7CisJfQorCWFkZHJfbGlzdCA9IChzdHJ1Y3Qgc29ja2FkZHIgKil2NmFkZHJzOworI2Vsc2UKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnY0YWRkcnM7CisKKwlwZl9jbGFzcyA9IFBGX0lORVQ7CisKKwlsb29wMS52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlsb29wMS52NC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworCWxvb3AxLnY0LnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworCWxvb3AyLnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWxvb3AyLnY0LnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisJbG9vcDIudjQuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzIpOworCisJYWRkcmNudCA9IDU7CisJdjRhZGRycyA9IHRlc3RfbWFsbG9jKHNpemVvZigqdjRhZGRycykgKiBhZGRyY250KTsKKwl2NGFkZHJzWzBdLnNpbl9mYW1pbHkgPSBQRl9JTkVUOworCXY0YWRkcnNbMF0uc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKwl2NGFkZHJzWzBdLnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8yKTsKKwlmb3IgKGkgPSAxOyBpIDwgYWRkcmNudDsgaSsrKSB7CisJCXNwcmludGYoYWRkcl9zdHIsICIxNzIuMTYuMS4lZCIsIGkpOworCQl2NGFkZHJzW2ldLnNpbl9mYW1pbHkgPSBQRl9JTkVUOworCQl2NGFkZHJzW2ldLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihhZGRyX3N0cik7CisJfQorCWFkZHJfbGlzdCA9IChzdHJ1Y3Qgc29ja2FkZHIgKil2NGFkZHJzOworI2VuZGlmIC8qIFRFU1RfVjYgKi8KKworCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworCisJLyogQ3JlYXRlIHRoZSB0d28gZW5kcG9pbnRzIHdoaWNoIHdpbGwgdGFsayB0byBlYWNoIG90aGVyLiAgKi8KKwlzazEgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisJc2syID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCisJLyogQmluZCB0aGVzZSBzb2NrZXRzIHRvIHRoZSB0ZXN0IHBvcnRzLiAgKi8KKwl0ZXN0X2JpbmQoc2sxLCAmbG9vcDEuc2EsIHNpemVvZihsb29wMSkpOworCXRlc3RfYmluZChzazIsICZsb29wMi5zYSwgc2l6ZW9mKGxvb3AyKSk7CisKKwkvKiBNYXJrIHNrMiBhcyBiZWluZyBhYmxlIHRvIGFjY2VwdCBuZXcgYXNzb2NpYXRpb25zLiAgKi8KKwl0ZXN0X2xpc3RlbihzazIsIDEpOworCisKKwkvKiBUZXN0aW5nIGZvciBzY3RwX3NlbmR2ICovCisJaW92Lmlvdl9iYXNlID0gbWVzc2FnZTsKKwlpb3YuaW92X2xlbiA9IHN0cmxlbihtZXNzYWdlKSArIDE7CisJdGVzdF9zY3RwX3NlbmR2KHNrMSwgJmlvdiwgMSwgYWRkcl9saXN0LCBhZGRyY250LCBOVUxMLCAwLCAwLCAwKTsKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfc2VuZHYgYWRkciBpbmZvIik7CisKKwlzdHJlYW0gPSAxOworCW1lbXNldCgmc25kaW5mbywgMCwgc2l6ZW9mKHNuZGluZm8pKTsKKwlzbmRpbmZvLnNuZF9mbGFncyA9IFNDVFBfVU5PUkRFUkVEOworCXNuZGluZm8uc25kX3NpZCA9IHN0cmVhbTsKKwl0ZXN0X3NjdHBfc2VuZHYoc2sxLCAmaW92LCAxLCBhZGRyX2xpc3QsIGFkZHJjbnQsICZzbmRpbmZvLAorCQkJc2l6ZW9mKHNuZGluZm8pLCBTQ1RQX1NFTkRWX1NORElORk8sIDApOworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9zZW5kdiBzbmRpbmZvIHdpdGggc3RyZWFtICVkIiwgc3RyZWFtKTsKKworCWlvdnhbMF0uaW92X2Jhc2UgPSBtZXNzYWdlOworCWlvdnhbMF0uaW92X2xlbiA9IHN0cmxlbihtZXNzYWdlKSArIDE7CisJaW92eFsxXS5pb3ZfYmFzZSA9IG1lc3NhZ2U7CisJaW92eFsxXS5pb3ZfbGVuID0gc3RybGVuKG1lc3NhZ2UpICsgMTsKKwlpb3Z4WzJdLmlvdl9iYXNlID0gbWVzc2FnZTsKKwlpb3Z4WzJdLmlvdl9sZW4gPSBzdHJsZW4obWVzc2FnZSkgKyAxOworCisJc3RyZWFtID0gMjsKKwlzbmRpbmZvLnNuZF9zaWQgPSBzdHJlYW07CisJdGVzdF9zY3RwX3NlbmR2KHNrMSwgaW92eCwgMywgYWRkcl9saXN0LCBhZGRyY250LCAmc25kaW5mbywKKwkJCXNpemVvZihzbmRpbmZvKSwgU0NUUF9TRU5EVl9TTkRJTkZPLCAwKTsKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfc2VuZHYgc25kaW5mbyB3aXRoIHN0cmVhbSAlZCIsIHN0cmVhbSk7CisKKwlwcmluZm8ucHJfcG9saWN5ID0gU0NUUF9QUl9TQ1RQX1JUWDsKKwlwcmluZm8ucHJfdmFsdWUgPSAxMDsKKwl0ZXN0X3NjdHBfc2VuZHYoc2sxLCBpb3Z4LCAzLCBhZGRyX2xpc3QsIGFkZHJjbnQsICZwcmluZm8sCisJCQlzaXplb2YocHJpbmZvKSwgU0NUUF9TRU5EVl9QUklORk8sIDApOworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9zZW5kdiBwcmluZm8iKTsKKworCWF1dGhpbmZvLmF1dGhfa2V5bnVtYmVyID0gMDsKKwl0ZXN0X3NjdHBfc2VuZHYoc2sxLCBpb3Z4LCAzLCBhZGRyX2xpc3QsIGFkZHJjbnQsICZhdXRoaW5mbywKKwkJCXNpemVvZihhdXRoaW5mbyksIFNDVFBfU0VORFZfQVVUSElORk8sIDApOworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9zZW5kdiBhdXRoaW5mbyIpOworCisKKwlzcGEuc2VuZHZfc25kaW5mbyA9IHNuZGluZm87CisJc3BhLnNlbmR2X3ByaW5mbyA9IHByaW5mbzsKKwlzcGEuc2VuZHZfYXV0aGluZm8gPSBhdXRoaW5mbzsKKworCXN0cmVhbSA9IDM7CisJc3BhLnNlbmR2X3NuZGluZm8uc25kX3NpZCA9IHN0cmVhbTsKKwlzcGEuc2VuZHZfZmxhZ3MgPSBTQ1RQX1NFTkRfU05ESU5GT19WQUxJRCB8IFNDVFBfU0VORF9QUklORk9fVkFMSUQ7CisJdGVzdF9zY3RwX3NlbmR2KHNrMSwgaW92eCwgMywgYWRkcl9saXN0LCBhZGRyY250LCAmc3BhLAorCQkJc2l6ZW9mKHNwYSksIFNDVFBfU0VORFZfU1BBLCAwKTsKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfc2VuZHYgc3BhIHdpdGggc3RyZWFtICVkIiwgc3RyZWFtKTsKKworCXN0cmVhbSA9IDQ7CisJc3BhLnNlbmR2X3NuZGluZm8uc25kX3NpZCA9IHN0cmVhbTsKKwlzcGEuc2VuZHZfZmxhZ3MgPSBTQ1RQX1NFTkRfU05ESU5GT19WQUxJRCB8IFNDVFBfU0VORF9QUklORk9fVkFMSUQgfAorCQkJICBTQ1RQX1NFTkRfQVVUSElORk9fVkFMSUQ7CisJdGVzdF9zY3RwX3NlbmR2KHNrMSwgaW92eCwgMywgYWRkcl9saXN0LCBhZGRyY250LCAmc3BhLAorCQkJc2l6ZW9mKHNwYSksIFNDVFBfU0VORFZfU1BBLCAwKTsKKwl0c3RfcmVzbShUUEFTUywgInNjdHBfc2VuZHYgc3BhIHdpdGggc3RyZWFtICVkIiwgc3RyZWFtKTsKKworCS8qIFRlc3RpbmcgZm9yIHNjdHBfcmVjdnYgKi8KKwlidWZsZW4gPSBSRUFMTFlfQklHOworCW1zZ25hbWVfbGVuID0gc2l6ZW9mKG1zZ25hbWUpOworCW1zZ19mbGFncyA9IDA7CisJaW92Lmlvdl9iYXNlID0gdGVzdF9tYWxsb2MoYnVmbGVuKTsKKwlpb3YuaW92X2xlbiA9IGJ1ZmxlbjsKKwlybl9sZW4gPSBzaXplb2Yocm4pOworCisJZXJyb3IgPSB0ZXN0X3NjdHBfcmVjdnYoc2syLCAmaW92LCAxLCAoc3RydWN0IHNvY2thZGRyICopJm1zZ25hbWUsCisJCQkJJm1zZ25hbWVfbGVuLCAmcm4sICZybl9sZW4sICZpbmZvdHlwZSwKKwkJCQkmbXNnX2ZsYWdzKTsKKwlpZiAoaW5mb3R5cGUgIT0gU0NUUF9SRUNWVl9OT0lORk8pCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNjdHBfcmVjdnYgaW5mb3R5cGUgJWQgIT0gJWQiLAorCQkJIGluZm90eXBlLCBTQ1RQX1JFQ1ZWX05PSU5GTyk7CisJdHN0X3Jlc20oVFBBU1MsICJzY3RwX3JlY3Z2IFNDVFBfUkVDVlZfTk9JTkZPIik7CisKKwllcnJvciA9IHNldHNvY2tvcHQoc2syLCBTT0xfU0NUUCwgU0NUUF9SRUNWUkNWSU5GTywKKwkJCSAgICZ2YWwsIHNpemVvZih2YWwpKTsKKwlpZiAoZXJyb3IpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNldHNvY2tvcHQoU0NUUF9SRUNWUkNWSU5GTyk6ICVzIiwKKwkJCSBzdHJlcnJvcihlcnJubykpOworCisJZXJyb3IgPSB0ZXN0X3NjdHBfcmVjdnYoc2syLCAmaW92LCAxLCAoc3RydWN0IHNvY2thZGRyICopJm1zZ25hbWUsCisJCQkJJm1zZ25hbWVfbGVuLCAmcm4sICZybl9sZW4sICZpbmZvdHlwZSwKKwkJCQkmbXNnX2ZsYWdzKTsKKwlpZiAoaW5mb3R5cGUgIT0gU0NUUF9SRUNWVl9SQ1ZJTkZPIHx8CisJICAgIHJuLnJlY3Z2X3JjdmluZm8ucmN2X3NpZCAhPSAxKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX3JlY3Z2IGluZm90eXBlICVkICE9ICVkIiwKKwkJCSBpbmZvdHlwZSwgU0NUUF9SRUNWVl9OT0lORk8pOworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9yZWN2diBTQ1RQX1JFQ1ZWX1JDVklORk8iKTsKKworCWVycm9yID0gc2V0c29ja29wdChzazIsIFNPTF9TQ1RQLCBTQ1RQX1JFQ1ZOWFRJTkZPLAorCQkJICAgJnZhbCwgc2l6ZW9mKHZhbCkpOworCWlmIChlcnJvcikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2V0c29ja29wdChTQ1RQX1JFQ1ZOWFRJTkZPKTogJXMiLAorCQkJIHN0cmVycm9yKGVycm5vKSk7CisKKwlybl9sZW4gPSAxOworCWVycm9yID0gdGVzdF9zY3RwX3JlY3Z2KHNrMiwgJmlvdiwgMSwgKHN0cnVjdCBzb2NrYWRkciAqKSZtc2duYW1lLAorCQkJCSZtc2duYW1lX2xlbiwgJnJuLCAmcm5fbGVuLCAmaW5mb3R5cGUsCisJCQkJJm1zZ19mbGFncyk7CisJaWYgKGluZm90eXBlICE9IFNDVFBfUkVDVlZfTk9JTkZPKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX3JlY3Z2IGluZm90eXBlICVkICE9ICVkIiwKKwkJCSBpbmZvdHlwZSwgU0NUUF9SRUNWVl9OT0lORk8pOworCXRzdF9yZXNtKFRQQVNTLCAic2N0cF9yZWN2diBTQ1RQX1JFQ1ZWX05PSU5GTyBkdWUgdG8gc21hbGwgc2l6ZSIpOworCisJcm5fbGVuID0gc2l6ZW9mKHN0cnVjdCBzY3RwX254dGluZm8pOworCWVycm9yID0gdGVzdF9zY3RwX3JlY3Z2KHNrMiwgJmlvdiwgMSwgKHN0cnVjdCBzb2NrYWRkciAqKSZtc2duYW1lLAorCQkJCSZtc2duYW1lX2xlbiwgJnJuLCAmcm5fbGVuLCAmaW5mb3R5cGUsCisJCQkJJm1zZ19mbGFncyk7CisJaWYgKGluZm90eXBlICE9IFNDVFBfUkVDVlZfTlhUSU5GTykKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2N0cF9yZWN2diBpbmZvdHlwZSAlZCAhPSAlZCIsCisJCQkgaW5mb3R5cGUsIFNDVFBfUkVDVlZfTlhUSU5GTyk7CisJdHN0X3Jlc20oVFBBU1MsICJzY3RwX3JlY3Z2IFNDVFBfUkVDVlZfTlhUSU5GTyBkdWUgdG8gc21hbGwgc2l6ZSIpOworCisJcm5fbGVuID0gc2l6ZW9mKHJuKTsKKwllcnJvciA9IHRlc3Rfc2N0cF9yZWN2dihzazIsICZpb3YsIDEsIChzdHJ1Y3Qgc29ja2FkZHIgKikmbXNnbmFtZSwKKwkJCQkmbXNnbmFtZV9sZW4sICZybiwgJnJuX2xlbiwgJmluZm90eXBlLAorCQkJCSZtc2dfZmxhZ3MpOworCWlmIChpbmZvdHlwZSAhPSBTQ1RQX1JFQ1ZWX1JOIHx8CisJICAgIHJuLnJlY3Z2X3JjdmluZm8ucmN2X3NpZCAhPSAwIHx8IHJuLnJlY3Z2X254dGluZm8ubnh0X3NpZCAhPSAzKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX3JlY3Z2IGluZm90eXBlICVkICE9ICVkIiwKKwkJCSBpbmZvdHlwZSwgU0NUUF9SRUNWVl9STik7CisJdHN0X3Jlc20oVFBBU1MsICJzY3RwX3JlY3Z2IFNDVFBfUkVDVlZfUk4iKTsKKworCWNsb3NlKHNrMSk7CisJY2xvc2Uoc2syKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2Z1bmNfdGVzdHMvdGVzdF9zb2Nrb3B0LmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0X3NvY2tvcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmQxMDk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Z1bmNfdGVzdHMvdGVzdF9zb2Nrb3B0LmMKQEAgLTAsMCArMSwxMTQ3IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwNAorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAgQ2lzY28sIEluYy4KKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAxIE1vdG9yb2xhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBOb2tpYSwgSW5jLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBMYSBNb250ZSBILlAuIFlhcnJvbGwgPHBpZ2d5QGFjbS5vcmc+CisgKiAgICBLYXJsIEtudXRzb24gPGthcmxAYXRoZW5hLmNoaWNhZ28uaWwudXM+CisgKiAgICBIdWkgSHVhbmcgPGh1aS5odWFuZ0Bub2tpYS5jb20+CisgKiAgICBKb24gR3JpbW0gPGpncmltbUB1cy5pYm0uY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgPHNhbXVkcmFsYUB1cy5pYm0uY29tPgorICovCisKKy8qIFRoaXMgaXMgYSBmdW5jdGlvbmFsIHRlc3QgdG8gdmVyaWZ5IHRoZSB2YXJpb3VzIFNDVFAgbGV2ZWwgc29ja2V0CisgKiBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGV4aXN0aW5nIFNDVFAKKyAqIGFzc29jaWF0aW9ucyBhbmQgdG8gY29uZmlndXJlIGNlcnRhaW4gcGFyYW1ldGVycy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHNjdHB1dGlsLmg+CisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSAyOTsKK2ludCBUU1RfQ05UID0gMDsKKworaW50CittYWluKHZvaWQpCit7CisJaW50IHVkcF9zdnJfc2ssIHVkcF9jbHRfc2ssIHRjcF9zdnJfc2ssIHRjcF9jbHRfc2s7CisJaW50IGFjY2VwdF9zaywgcGVlbG9mZl9zazsKKyAgICAgICAgc29ja2FkZHJfc3RvcmFnZV90IHVkcF9zdnJfbG9vcCwgdWRwX2NsdF9sb29wOworICAgICAgICBzb2NrYWRkcl9zdG9yYWdlX3QgdGNwX3N2cl9sb29wLCB0Y3BfY2x0X2xvb3A7CisgICAgICAgIHN0cnVjdCBpb3ZlYyBpb3Y7CisgICAgICAgIHN0cnVjdCBtc2doZHIgaW5tZXNzYWdlOworCXN0cnVjdCBtc2doZHIgb3V0bWVzc2FnZTsKKwljaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzY3RwX2Ntc2dfZGF0YV90KSldOworCWNoYXIgb3V0Y21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSldOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvOworICAgICAgICBzdHJ1Y3QgaW92ZWMgb3V0X2lvdjsKKyAgICAgICAgY2hhciAqbWVzc2FnZSA9ICJoZWxsbywgd29ybGQhXG4iOworICAgICAgICBpbnQgZXJyb3I7CisJaW50IHBmX2NsYXNzOworCXVpbnQzMl90IHBwaWQ7CisJdWludDMyX3Qgc3RyZWFtOworCXNjdHBfYXNzb2NfdCB1ZHBfc3ZyX2Fzc29jaWQsIHVkcF9jbHRfYXNzb2NpZDsKKwlzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKnNhYzsKKwljaGFyICpiaWdfYnVmZmVyOworCXN0cnVjdCBzY3RwX2V2ZW50X3N1YnNjcmliZSBzdWJzY3JpYmU7CisJc3RydWN0IHNjdHBfaW5pdG1zZyBpbml0bXNnOworCXN0cnVjdCBzY3RwX3BhZGRycGFyYW1zIHBhZGRycGFyYW1zOworCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gc2V0X3VkcF9za19kZmx0X3BhcmFtLCBnZXRfdWRwX3NrX2RmbHRfcGFyYW07IAorCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gc2V0X3RjcF9za19kZmx0X3BhcmFtLCBnZXRfdGNwX3NrX2RmbHRfcGFyYW07IAorCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gc2V0X3VkcF9hc3NvY19kZmx0X3BhcmFtOworCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gZ2V0X3VkcF9hc3NvY19kZmx0X3BhcmFtOyAKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvIHNldF90Y3BfYXNzb2NfZGZsdF9wYXJhbTsKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvIGdldF90Y3BfYXNzb2NfZGZsdF9wYXJhbTsgCisJc3RydWN0IHNjdHBfc25kcmN2aW5mbyBnZXRfcGVlbG9mZl9hc3NvY19kZmx0X3BhcmFtOyAKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvIGdldF9hY2NlcHRfYXNzb2NfZGZsdF9wYXJhbTsgCisJc3RydWN0IHNjdHBfcGFkZHJpbmZvIHBpbmZvOworCWludCBkZmx0X3BhdGhtYXhyeHQ7CisJc29ja2xlbl90IG9wdGxlbiwgYWRkcmxlbjsKKwlzdHJ1Y3Qgc2N0cF9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBzY3RwX2Fzc29jX3ZhbHVlIHZhbHVlOworCisgICAgICAgIC8qIFJhdGhlciB0aGFuIGZmbHVzaCgpIHRocm91Z2hvdXQgdGhlIGNvZGUsIHNldCBzdGRvdXQgdG8KKwkgKiBiZSB1bmJ1ZmZlcmVkLgorCSAqLworCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworCisJLyogU2V0IHNvbWUgYmFzaWMgdmFsdWVzIHdoaWNoIGRlcGVuZCBvbiB0aGUgYWRkcmVzcyBmYW1pbHkuICovCisjaWYgVEVTVF9WNgorCXBmX2NsYXNzID0gUEZfSU5FVDY7CisKKyAgICAgICAgdWRwX3N2cl9sb29wLnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgICAgICAgIHVkcF9zdnJfbG9vcC52Ni5zaW42X2FkZHIgPSBpbjZhZGRyX2xvb3BiYWNrOworICAgICAgICB1ZHBfc3ZyX2xvb3AudjYuc2luNl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworICAgICAgICB1ZHBfY2x0X2xvb3AudjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgICAgICAgdWRwX2NsdF9sb29wLnY2LnNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7CisgICAgICAgIHVkcF9jbHRfbG9vcC52Ni5zaW42X3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzErMSk7CisKKyAgICAgICAgdGNwX3N2cl9sb29wLnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisgICAgICAgIHRjcF9zdnJfbG9vcC52Ni5zaW42X2FkZHIgPSBpbjZhZGRyX2xvb3BiYWNrOworICAgICAgICB0Y3Bfc3ZyX2xvb3AudjYuc2luNl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKzIpOworCisgICAgICAgIHRjcF9jbHRfbG9vcC52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICB0Y3BfY2x0X2xvb3AudjYuc2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjazsKKyAgICAgICAgdGNwX2NsdF9sb29wLnY2LnNpbjZfcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSszKTsKKyNlbHNlCisJcGZfY2xhc3MgPSBQRl9JTkVUOworCisgICAgICAgIHVkcF9zdnJfbG9vcC52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgdWRwX3N2cl9sb29wLnY0LnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisgICAgICAgIHVkcF9zdnJfbG9vcC52NC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisKKyAgICAgICAgdWRwX2NsdF9sb29wLnY0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworICAgICAgICB1ZHBfY2x0X2xvb3AudjQuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgdWRwX2NsdF9sb29wLnY0LnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKzEpOworCisgICAgICAgIHRjcF9zdnJfbG9vcC52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgdGNwX3N2cl9sb29wLnY0LnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisgICAgICAgIHRjcF9zdnJfbG9vcC52NC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSsyKTsKKworICAgICAgICB0Y3BfY2x0X2xvb3AudjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIHRjcF9jbHRfbG9vcC52NC5zaW5fYWRkci5zX2FkZHIgPSBTQ1RQX0lQX0xPT1BCQUNLOworICAgICAgICB0Y3BfY2x0X2xvb3AudjQuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzIrMyk7CisjZW5kaWYgLyogVEVTVF9WNiAqLworCisgICAgICAgIC8qIENyZWF0ZSB0aGUgdHdvIGVuZHBvaW50cyB3aGljaCB3aWxsIHRhbGsgdG8gZWFjaCBvdGhlci4gICovCisgICAgICAgIHVkcF9zdnJfc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisgICAgICAgIHVkcF9jbHRfc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisKKwkvKiBFbmFibGUgQVNTT0NfQ0hBTkdFIGFuZCBTTkRSQ1ZJTkZPIG5vdGlmaWNhdGlvbnMuICovCisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKHVkcF9zdnJfc2spOworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZSh1ZHBfY2x0X3NrKTsKKworICAgICAgICAvKiBCaW5kIHRoZXNlIHNvY2tldHMgdG8gdGhlIHRlc3QgcG9ydHMuICAqLworICAgICAgICB0ZXN0X2JpbmQodWRwX3N2cl9zaywgJnVkcF9zdnJfbG9vcC5zYSwgc2l6ZW9mKHVkcF9zdnJfbG9vcCkpOworICAgICAgICB0ZXN0X2JpbmQodWRwX2NsdF9zaywgJnVkcF9jbHRfbG9vcC5zYSwgc2l6ZW9mKHVkcF9jbHRfbG9vcCkpOworCisgICAgICAgLyogTWFyayB1ZHBfc3ZyX3NrIGFzIGJlaW5nIGFibGUgdG8gYWNjZXB0IG5ldyBhc3NvY2lhdGlvbnMuICAqLworCXRlc3RfbGlzdGVuKHVkcF9zdnJfc2ssIDEpOworCisJLyogVEVTVCAjMTogU0NUUF9TVEFUVVMgc29ja2V0IG9wdGlvbi4gKi8KKwkvKiBNYWtlIHN1cmUgdGhhdCBTQ1RQX1NUQVRVUyBnZXRzb2Nrb3B0IG9uIGEgc29ja2V0IHdpdGggbm8KKwkgKiBhc3NvY2lhdGlvbiBmYWlscy4KKwkgKi8KKwlvcHRsZW4gPSBzaXplb2Yoc3RydWN0IHNjdHBfc3RhdHVzKTsKKwltZW1zZXQoJnN0YXR1cywgMCwgb3B0bGVuKTsKKwllcnJvciA9IGdldHNvY2tvcHQodWRwX3N2cl9zaywgU09MX1NDVFAsIFNDVFBfU1RBVFVTLCAmc3RhdHVzLAorCQkJICAgJm9wdGxlbik7CisJaWYgKChlcnJvciAhPSAtMSkgJiYgKGVycm5vICE9IEVJTlZBTCkpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImdldHNvY2tvcHQoU0NUUF9TVEFUVVMpIG9uIGEgIgorCQkJICJzb2NrZXQgd2l0aCBubyBhc3NvYyBlcnJvcjolZCBlcnJubzolZCIsCisJCQkgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiZ2V0c29ja29wdChTQ1RQX1NUQVRVUykgb24gYSBzb2NrZXQgd2l0aCBubyBhc3NvYyIpOworCisgICAgICAgIC8qIFNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UuICBUaGlzIHdpbGwgY3JlYXRlIHRoZSBhc3NvY2lhdGlvbi4gICovCisgICAgICAgIG91dG1lc3NhZ2UubXNnX25hbWUgPSAmdWRwX3N2cl9sb29wOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHVkcF9zdnJfbG9vcCk7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2lvdiA9ICZvdXRfaW92OworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19jb250cm9sID0gb3V0Y21zZzsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihvdXRjbXNnKTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfZmxhZ3MgPSAwOworCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZvdXRtZXNzYWdlKTsKKwljbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworCWNtc2ctPmNtc2dfdHlwZSA9IFNDVFBfU05EUkNWOworCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47CisJc2luZm8gPSAoc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqKUNNU0dfREFUQShjbXNnKTsKKwltZW1zZXQoc2luZm8sIDB4MDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJcHBpZCA9IHJhbmQoKTsgLyogQ2hvb3NlIGFuIGFyYml0cmFyeSB2YWx1ZS4gKi8KKwlzdHJlYW0gPSAxOworCXNpbmZvLT5zaW5mb19wcGlkID0gcHBpZDsKKwlzaW5mby0+c2luZm9fc3RyZWFtID0gc3RyZWFtOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9iYXNlID0gbWVzc2FnZTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfbGVuID0gc3RybGVuKG1lc3NhZ2UpICsgMTsKKyAgICAgICAgdGVzdF9zZW5kbXNnKHVkcF9jbHRfc2ssICZvdXRtZXNzYWdlLCAwLCBzdHJsZW4obWVzc2FnZSkrMSk7CisKKwkvKiBJbml0aWFsaXplIGlubWVzc2FnZSBmb3IgYWxsIHJlY2VpdmVzLiAqLworCWJpZ19idWZmZXIgPSB0ZXN0X21hbGxvYyhSRUFMTFlfQklHKTsKKyAgICAgICAgbWVtc2V0KCZpbm1lc3NhZ2UsIDAsIHNpemVvZihpbm1lc3NhZ2UpKTsKKyAgICAgICAgaW92Lmlvdl9iYXNlID0gYmlnX2J1ZmZlcjsKKyAgICAgICAgaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworICAgICAgICBpbm1lc3NhZ2UubXNnX2lvdiA9ICZpb3Y7CisgICAgICAgIGlubWVzc2FnZS5tc2dfaW92bGVuID0gMTsKKyAgICAgICAgaW5tZXNzYWdlLm1zZ19jb250cm9sID0gaW5jbXNnOworCisgICAgICAgIC8qIEdldCB0aGUgY29tbXVuaWNhdGlvbiB1cCBtZXNzYWdlIG9uIHVkcF9zdnJfc2suICAqLworICAgICAgICBpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKyAgICAgICAgZXJyb3IgPSB0ZXN0X3JlY3Ztc2codWRwX3N2cl9zaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOwkKKwlzYWMgPSAoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICopaW92Lmlvdl9iYXNlOworCXVkcF9zdnJfYXNzb2NpZCA9IHNhYy0+c2FjX2Fzc29jX2lkOworCisgICAgICAgIC8qIEdldCB0aGUgY29tbXVuaWNhdGlvbiB1cCBtZXNzYWdlIG9uIHVkcF9jbHRfc2suICAqLworICAgICAgICBpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKyAgICAgICAgZXJyb3IgPSB0ZXN0X3JlY3Ztc2codWRwX2NsdF9zaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOwkKKwlzYWMgPSAoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICopaW92Lmlvdl9iYXNlOworCXVkcF9jbHRfYXNzb2NpZCA9IHNhYy0+c2FjX2Fzc29jX2lkOworCisgICAgICAgIC8qIEdldCB0aGUgZmlyc3QgbWVzc2FnZSB3aGljaCB3YXMgc2VudC4gICovCisgICAgICAgIGlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworICAgICAgICBlcnJvciA9IHRlc3RfcmVjdm1zZyh1ZHBfc3ZyX3NrLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisgICAgICAgIHRlc3RfY2hlY2tfbXNnX2RhdGEoJmlubWVzc2FnZSwgZXJyb3IsIHN0cmxlbihtZXNzYWdlKSArIDEsCisJCQkgICAgTVNHX0VPUiwgc3RyZWFtLCBwcGlkKTsKKworCS8qIEdldCBTQ1RQX1NUQVRVUyBmb3IgdWRwX2NsdF9zaydzIGdpdmVuIGFzc29jaWF0aW9uLiAqLworCW9wdGxlbiA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9zdGF0dXMpOworCW1lbXNldCgmc3RhdHVzLCAwLCBvcHRsZW4pOworCXN0YXR1cy5zc3RhdF9hc3NvY19pZCA9IHVkcF9jbHRfYXNzb2NpZDsKKwl0ZXN0X2dldHNvY2tvcHQodWRwX2NsdF9zaywgU0NUUF9TVEFUVVMsICZzdGF0dXMsICZvcHRsZW4pOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRzb2Nrb3B0KFNDVFBfU1RBVFVTKSIpOworCisJLyogTWFrZSBzdXJlIHRoYXQgU0NUUF9TVEFUVVMgZ2V0c29ja29wdCB3aXRoIGludmFsaWQgYXNzb2NpZCBmYWlscy4gKi8KKwlvcHRsZW4gPSBzaXplb2Yoc3RydWN0IHNjdHBfc3RhdHVzKTsKKwltZW1zZXQoJnN0YXR1cywgMCwgb3B0bGVuKTsKKwlzdGF0dXMuc3N0YXRfYXNzb2NfaWQgPSB1ZHBfc3ZyX2Fzc29jaWQ7CisJZXJyb3IgPSBnZXRzb2Nrb3B0KHVkcF9jbHRfc2ssIFNPTF9TQ1RQLCBTQ1RQX1NUQVRVUywgJnN0YXR1cywKKwkJCSAgICZvcHRsZW4pOyAKKwlpZiAoKGVycm9yICE9IC0xKSAmJiAoZXJybm8gIT0gRUlOVkFMKSkKKyAgICAgICAgCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImdldHNvY2tvcHQoU0NUUF9TVEFUVVMpIHdpdGggIgorCQkJICJhc3NvY2lkIGVycm9yOiAlZCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tvcHQoU0NUUF9TVEFUVVMpIHdpdGggaW52YWxpZCBhc3NvY2lkIik7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCBTQ1RQX1NUQVRVUyBnZXRzb2Nrb3B0IHdpdGggTlVMTCBhc3NvY2lkIGZhaWxzLiAqLworCW9wdGxlbiA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9zdGF0dXMpOworCW1lbXNldCgmc3RhdHVzLCAwLCBvcHRsZW4pOworCXN0YXR1cy5zc3RhdF9hc3NvY19pZCA9IDA7CisJZXJyb3IgPSBnZXRzb2Nrb3B0KHVkcF9zdnJfc2ssIFNPTF9TQ1RQLCBTQ1RQX1NUQVRVUywgJnN0YXR1cywKKwkJCSAgICZvcHRsZW4pOworCWlmICgoZXJyb3IgIT0gLTEpICYmIChlcnJubyAhPSBFSU5WQUwpKQorICAgICAgICAJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdChTQ1RQX1NUQVRVUykgd2l0aCAiCisJCQkgIk5VTEwgYXNzb2NpZCBlcnJvcjogJWQgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRzb2Nrb3B0KFNDVFBfU1RBVFVTKSB3aXRoIE5VTEwgYXNzb2NpZCIpOworCisgICAgICAgIC8qIFNodXQgZG93biB0aGUgbGluay4gICovCisgICAgICAgIGNsb3NlKHVkcF9jbHRfc2spOworCisgICAgICAgIC8qIEdldCB0aGUgc2h1dGRvd24gY29tcGxldGUgbm90aWZpY2F0aW9uLiAqLworCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworICAgICAgICBlcnJvciA9IHRlc3RfcmVjdm1zZyh1ZHBfc3ZyX3NrLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfU0hVVERPV05fQ09NUCk7CQorCQkJCQorCWVycm9yID0gMDsKKyAgICAgICAgY2xvc2UodWRwX3N2cl9zayk7CisKKwkvKiBURVNUICMyOiBTQ1RQX0VWRU5UUyBzb2NrZXQgb3B0aW9uIGFuZCBTQ1RQX1NIVVRET1dOX0VWRU5UCisJICogbm90aWZpY2F0aW9uLgorCSAqLworICAgICAgICAvKiBDcmVhdGUgdGhlIHR3byBlbmRwb2ludHMgd2hpY2ggd2lsbCB0YWxrIHRvIGVhY2ggb3RoZXIuICAqLworCXVkcF9zdnJfc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisJdWRwX2NsdF9zayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NFUVBBQ0tFVCwgSVBQUk9UT19TQ1RQKTsKKworCS8qIEVuYWJsZSBBU1NPQ19DSEFOR0UgYW5kIFNORFJDVklORk8gbm90aWZpY2F0aW9ucy4gKi8KKwl0ZXN0X2VuYWJsZV9hc3NvY19jaGFuZ2UodWRwX3N2cl9zayk7CisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKHVkcF9jbHRfc2spOworCisJLyogQmluZCB0aGVzZSBzb2NrZXRzIHRvIHRoZSB0ZXN0IHBvcnRzLiAgKi8KKwl0ZXN0X2JpbmQodWRwX3N2cl9zaywgJnVkcF9zdnJfbG9vcC5zYSwgc2l6ZW9mKHVkcF9zdnJfbG9vcCkpOworCXRlc3RfYmluZCh1ZHBfY2x0X3NrLCAmdWRwX2NsdF9sb29wLnNhLCBzaXplb2YodWRwX2NsdF9sb29wKSk7CisKKwkvKiBNYXJrIHVkcF9zdnJfc2sgYXMgYmVpbmcgYWJsZSB0byBhY2NlcHQgbmV3IGFzc29jaWF0aW9ucy4gICovCisJdGVzdF9saXN0ZW4odWRwX3N2cl9zaywgMSk7CisKKwkvKiBHZXQgdGhlIGRlZmF1bHQgZXZlbnRzIHRoYXQgYXJlIGVuYWJsZWQgb24gdWRwX3N2cl9zay4gKi8KKwlvcHRsZW4gPSBzaXplb2Yoc3Vic2NyaWJlKTsKKwl0ZXN0X2dldHNvY2tvcHQodWRwX3N2cl9zaywgU0NUUF9FVkVOVFMsICZzdWJzY3JpYmUsICZvcHRsZW4pOworCisJLyogR2V0IHRoZSBkZWZhdWx0IGV2ZW50cyB0aGF0IGFyZSBlbmFibGVkIG9uIHVkcF9jbHRfc2suICovCisJb3B0bGVuID0gc2l6ZW9mKHN1YnNjcmliZSk7CisJdGVzdF9nZXRzb2Nrb3B0KHVkcF9jbHRfc2ssIFNDVFBfRVZFTlRTLCAmc3Vic2NyaWJlLCAmb3B0bGVuKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiZ2V0c29ja29wdChTQ1RQX0VWRU5UUykiKTsKKworCS8qIERpc2FibGUgYWxsIHRoZSBldmVudHMgb24gdWRwX3N2cl9zayBhbmQgdWRwX2NsdF9zay4gKi8KKwltZW1zZXQoJnN1YnNjcmliZSwgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX2V2ZW50X3N1YnNjcmliZSkpOworCXRlc3Rfc2V0c29ja29wdCh1ZHBfc3ZyX3NrLCBTQ1RQX0VWRU5UUywgJnN1YnNjcmliZSwKKwkJCXNpemVvZihzdWJzY3JpYmUpKTsKKwl0ZXN0X3NldHNvY2tvcHQodWRwX2NsdF9zaywgU0NUUF9FVkVOVFMsICZzdWJzY3JpYmUsCisJCQlzaXplb2Yoc3Vic2NyaWJlKSk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoU0NUUF9FVkVOVFMpIik7CisKKwkvKiBHZXQgdGhlIHVwZGF0ZWQgbGlzdCBvZiBlbmFibGVkIGV2ZW50cyBvbiB1ZHBfc3ZyX3NrIGFuZAorCSAqIHVkcF9jbHRfc2suCisJICovCisJb3B0bGVuID0gc2l6ZW9mKHN1YnNjcmliZSk7CisJdGVzdF9nZXRzb2Nrb3B0KHVkcF9zdnJfc2ssIFNDVFBfRVZFTlRTLCAmc3Vic2NyaWJlLCAmb3B0bGVuKTsKKwlvcHRsZW4gPSBzaXplb2Yoc3Vic2NyaWJlKTsKKwl0ZXN0X2dldHNvY2tvcHQodWRwX2NsdF9zaywgU0NUUF9FVkVOVFMsICZzdWJzY3JpYmUsICZvcHRsZW4pOworCisJLyogU2VuZCBhIG1lc3NhZ2UuICBUaGlzIHdpbGwgY3JlYXRlIHRoZSBhc3NvY2lhdGlvbi4gICovCisJb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfYmFzZSA9IG1lc3NhZ2U7CisJb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfbGVuID0gc3RybGVuKG1lc3NhZ2UpICsgMTsKKwl0ZXN0X3NlbmRtc2codWRwX2NsdF9zaywgJm91dG1lc3NhZ2UsIDAsIHN0cmxlbihtZXNzYWdlKSsxKTsKKworCS8qIEdldCB0aGUgbWVzc2FnZSB3aGljaCB3YXMgc2VudC4gICovCisJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJZXJyb3IgPSB0ZXN0X3JlY3Ztc2codWRwX3N2cl9zaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworICAgICAgICB0ZXN0X2NoZWNrX21zZ19kYXRhKCZpbm1lc3NhZ2UsIGVycm9yLCBzdHJsZW4obWVzc2FnZSkgKyAxLAorCQkJICAgIE1TR19FT1IsIDAsIDApOworCS8qIFZlcmlmeSB0aGF0IHdlIHJlY2VpdmVkIHRoZSBtc2cgd2l0aG91dCBhbnkgYW5jaWxsYXJ5IGRhdGEuICovCisJaWYgKGlubWVzc2FnZS5tc2dfY29udHJvbGxlbiAhPSAwKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJSZWNlaXZlIHVuZXhwZWN0ZWQgYW5jaWxsYXJ5IgorCQkJICJkYXRhIik7CisKKwkvKiBFbmFibGUgU0NUUF9TSFVURE9XTl9FVkVOVHMgb24gdWRwX3N2cl9zay4gKi8KKwltZW1zZXQoJnN1YnNjcmliZSwgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX2V2ZW50X3N1YnNjcmliZSkpOworCXN1YnNjcmliZS5zY3RwX3NodXRkb3duX2V2ZW50ID0gMTsKKwl0ZXN0X3NldHNvY2tvcHQodWRwX3N2cl9zaywgU0NUUF9FVkVOVFMsICZzdWJzY3JpYmUsCisJCQlzaXplb2Yoc3Vic2NyaWJlKSk7CisKKwllcnJvciA9IDA7CisgICAgICAgIC8qIFNodXQgZG93biB0aGUgbGluay4gICovCisgICAgICAgIGNsb3NlKHVkcF9jbHRfc2spOworCisJLyogR2V0IHRoZSBTSFVURE9XTl9FVkVOVCBub3RpZmljYXRpb24gb24gdWRwX3N2cl9zay4gKi8KKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwllcnJvciA9IHRlc3RfcmVjdm1zZyh1ZHBfc3ZyX3NrLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfc2h1dGRvd25fZXZlbnQpLAorCQkJCSAgICBTQ1RQX1NIVVRET1dOX0VWRU5ULCAwKTsJCisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoU0NUUF9FVkVOVFMpIC0gU0NUUF9TSFVURE9XTl9FVkVOVCIpOworIAorICAgICAgICBjbG9zZSh1ZHBfc3ZyX3NrKTsKKworCS8qIFRFU1QgIzM6IHdoZXRoZXIgc2N0cF9vcHRfaW5mbyBlcXVhbHMgKi8KKyAgICAgICAgLyogQ3JlYXRlIHRoZSB0d28gZW5kcG9pbnRzIHdoaWNoIHdpbGwgdGFsayB0byBlYWNoIG90aGVyLiAgKi8KKwl1ZHBfc3ZyX3NrID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCXVkcF9jbHRfc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisKKwkvKiBFbmFibGUgQVNTT0NfQ0hBTkdFIGFuZCBTTkRSQ1ZJTkZPIG5vdGlmaWNhdGlvbnMuICovCisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKHVkcF9zdnJfc2spOworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZSh1ZHBfY2x0X3NrKTsKKworCS8qIEJpbmQgdGhlc2Ugc29ja2V0cyB0byB0aGUgdGVzdCBwb3J0cy4gICovCisJdGVzdF9iaW5kKHVkcF9zdnJfc2ssICZ1ZHBfc3ZyX2xvb3Auc2EsIHNpemVvZih1ZHBfc3ZyX2xvb3ApKTsKKwl0ZXN0X2JpbmQodWRwX2NsdF9zaywgJnVkcF9jbHRfbG9vcC5zYSwgc2l6ZW9mKHVkcF9jbHRfbG9vcCkpOworCisJLyogTWFyayB1ZHBfc3ZyX3NrIGFzIGJlaW5nIGFibGUgdG8gYWNjZXB0IG5ldyBhc3NvY2lhdGlvbnMuICAqLworCXRlc3RfbGlzdGVuKHVkcF9zdnJfc2ssIDEpOworCisgICAgICAgIC8qIFNlbmQgdGhlIGZpcnN0IG1lc3NhZ2UuICBUaGlzIHdpbGwgY3JlYXRlIHRoZSBhc3NvY2lhdGlvbi4gICovCisgICAgICAgIG91dG1lc3NhZ2UubXNnX25hbWUgPSAmdWRwX3N2cl9sb29wOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHVkcF9zdnJfbG9vcCk7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2lvdiA9ICZvdXRfaW92OworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3ZsZW4gPSAxOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19jb250cm9sID0gb3V0Y21zZzsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihvdXRjbXNnKTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfZmxhZ3MgPSAwOworCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZvdXRtZXNzYWdlKTsKKwljbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworCWNtc2ctPmNtc2dfdHlwZSA9IFNDVFBfU05EUkNWOworCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47CisJc2luZm8gPSAoc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqKUNNU0dfREFUQShjbXNnKTsKKwltZW1zZXQoc2luZm8sIDB4MDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJcHBpZCA9IHJhbmQoKTsgLyogQ2hvb3NlIGFuIGFyYml0cmFyeSB2YWx1ZS4gKi8KKwlzdHJlYW0gPSAxOworCXNpbmZvLT5zaW5mb19wcGlkID0gcHBpZDsKKwlzaW5mby0+c2luZm9fc3RyZWFtID0gc3RyZWFtOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9iYXNlID0gbWVzc2FnZTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfbGVuID0gc3RybGVuKG1lc3NhZ2UpICsgMTsKKyAgICAgICAgdGVzdF9zZW5kbXNnKHVkcF9jbHRfc2ssICZvdXRtZXNzYWdlLCAwLCBzdHJsZW4obWVzc2FnZSkrMSk7CisJCisgICAgICAgIC8qIEdldCB0aGUgY29tbXVuaWNhdGlvbiB1cCBtZXNzYWdlIG9uIHVkcF9jbHRfc2suICAqLworICAgICAgICBpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKyAgICAgICAgZXJyb3IgPSB0ZXN0X3JlY3Ztc2codWRwX2NsdF9zaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOwkKKwlzYWMgPSAoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICopaW92Lmlvdl9iYXNlOworCXVkcF9jbHRfYXNzb2NpZCA9IHNhYy0+c2FjX2Fzc29jX2lkOworCisJLyogQ29tcGFyZSB0aGUgU0NUUF9TVEFUVVMgcmVzdWx0IGJldHdlZW4gc2N0cF9vcHRfaW5mbyBhbmQgCisJICogZ2V0c29ja29wdAorCSAqLworCXsKKwkJc3RydWN0IHNjdHBfc3RhdHVzIHN0YXR1czEsIHN0YXR1czI7CisKKwkJbWVtc2V0KCZzdGF0dXMxLCAwLCBzaXplb2Yoc3RhdHVzMSkpOworCQltZW1zZXQoJnN0YXR1czIsIDAsIHNpemVvZihzdGF0dXMyKSk7CisJCW9wdGxlbiA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9zdGF0dXMpOworCisJCS8qIFRlc3QgU0NUUF9TVEFUVVMgZm9yIHVkcF9jbHRfc2sncyBnaXZlbiBhc3NvY2lhdGlvbi4gKi8JCisJCWVycm9yID0gc2N0cF9vcHRfaW5mbyh1ZHBfY2x0X3NrLHVkcF9jbHRfYXNzb2NpZCxTQ1RQX1NUQVRVUywKKwkJCQkoY2hhciAqKSZzdGF0dXMxLCAmb3B0bGVuKTsKKwkJaWYgKGVycm9yICE9IDApCisJICAgICAgICAgICAgICAgIHRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwKKwkJCQkgInNjdHBfb3B0X2luZm8oU0NUUF9TVEFUVVMpOiAlcyIsIAorCQkJCSBzdHJlcnJvcihlcnJubykpOworCisJCXN0YXR1czIuc3N0YXRfYXNzb2NfaWQgPSB1ZHBfY2x0X2Fzc29jaWQ7CisJCWVycm9yID0gZ2V0c29ja29wdCh1ZHBfY2x0X3NrLCBJUFBST1RPX1NDVFAsIFNDVFBfU1RBVFVTLAorICAgICAgICAgICAgICAgIAkJKGNoYXIgKikmc3RhdHVzMiwgJm9wdGxlbik7CisJCWlmIChlcnJvciAhPSAwKQorCSAgICAgICAgICAgICAgICB0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsCisJCQkJICJnZXRzb2Nrb3B0KFNDVFBfU1RBVFVTKTogJXMiLCAKKwkJCQkgc3RyZXJyb3IoZXJybm8pKTsKKwkJaWYgKHN0cm5jbXAoKGNoYXIgKikmc3RhdHVzMSwgKGNoYXIgKikmc3RhdHVzMiwgb3B0bGVuKSkKKwkgICAgICAgICAgICAgICAgdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2N0cF9vcHRfaW5mbyhTQ1RQX1NUQVVTKSIKKwkJCSAgICAgICAiZG9lc24ndCBtYXRjaCBnZXRzb2Nrb3B0KFNDVFBfU1RBVFVTKSIpOworCisgICAgICAgICAgICAgICAgdHN0X3Jlc20oVFBBU1MsICJzY3RwX29wdF9pbmZvKFNDVFBfU1RBVFVTKSIpOworCX0KKwllcnJvciA9IDA7CisgICAgICAgIC8qIFNodXQgZG93biB0aGUgbGluay4gICovCisgICAgICAgIGNsb3NlKHVkcF9zdnJfc2spOworICAgICAgICBjbG9zZSh1ZHBfY2x0X3NrKTsKKworCS8qIFRFU1QgIzQ6IFNDVFBfSU5JVE1TRyBzb2NrZXQgb3B0aW9uLiAqLworICAgICAgICAvKiBDcmVhdGUgYSBzb2NrZXQuICAqLworCXVkcF9zdnJfc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisKKwkvKiBCaW5kIHRoaXMgc29ja2V0IHRvIHRoZSB0ZXN0IHBvcnQuICAqLworCXRlc3RfYmluZCh1ZHBfc3ZyX3NrLCAmdWRwX3N2cl9sb29wLnNhLCBzaXplb2YodWRwX3N2cl9sb29wKSk7CisKKwkvKiBFbmFibGUgQVNTT0NfQ0hBTkdFIGFuZCBTTkRSQ1ZJTkZPIG5vdGlmaWNhdGlvbnMuICovCisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKHVkcF9zdnJfc2spOworCisJLyogR2V0IHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgZm9yIGFzc29jaWF0aW9uIGluaXRpYWxpemF0aW9uLiAqLworCW9wdGxlbiA9IHNpemVvZihpbml0bXNnKTsKKwl0ZXN0X2dldHNvY2tvcHQodWRwX3N2cl9zaywgU0NUUF9JTklUTVNHLCAmaW5pdG1zZywgJm9wdGxlbik7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tvcHQoU0NUUF9JTklUTVNHKSIpOworCisJLyogQ2hhbmdlIHRoZSBwYXJhbWV0ZXJzIGZvciBhc3NvY2lhdGlvbiBpbml0aWFsaXphdGlvbi4gKi8KKwlpbml0bXNnLnNpbml0X251bV9vc3RyZWFtcyA9IDU7CisJaW5pdG1zZy5zaW5pdF9tYXhfaW5zdHJlYW1zID0gNTsKKwlpbml0bXNnLnNpbml0X21heF9hdHRlbXB0cyA9IDM7CisJaW5pdG1zZy5zaW5pdF9tYXhfaW5pdF90aW1lbyA9IDMwOworCXRlc3Rfc2V0c29ja29wdCh1ZHBfc3ZyX3NrLCBTQ1RQX0lOSVRNU0csICZpbml0bXNnLCBzaXplb2YoaW5pdG1zZykpOworCisJdHN0X3Jlc20oVFBBU1MsICJzZXRzb2Nrb3B0KFNDVFBfSU5JVE1TRykiKTsKKworCS8qIEdldCB0aGUgdXBkYXRlZCBwYXJhbWV0ZXJzIGZvciBhc3NvY2lhdGlvbiBpbml0aWFsaXphdGlvbi4gKi8KKwlvcHRsZW4gPSBzaXplb2YoaW5pdG1zZyk7CisJdGVzdF9nZXRzb2Nrb3B0KHVkcF9zdnJfc2ssIFNDVFBfSU5JVE1TRywgJmluaXRtc2csICZvcHRsZW4pOworCQorCWNsb3NlKHVkcF9zdnJfc2spOworCisJLyogVEVTVCAjNTogU0NUUF9QRUVSX0FERFJfUEFSQU1TIHNvY2tldCBvcHRpb24uICovCisgICAgICAgIC8qIENyZWF0ZSBhIHNvY2tldC4gICovCisJdWRwX3N2cl9zayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NFUVBBQ0tFVCwgSVBQUk9UT19TQ1RQKTsKKworCS8qIEdldCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzIGZvciB0aGlzIGVuZHBvaW50ICovCisJb3B0bGVuID0gc2l6ZW9mKHBhZGRycGFyYW1zKTsKKwltZW1zZXQoJnBhZGRycGFyYW1zLCAwLCBzaXplb2YocGFkZHJwYXJhbXMpKTsKKwlwYWRkcnBhcmFtcy5zcHBfYWRkcmVzcy5zc19mYW1pbHkgPSBBRl9JTkVUOworCXRlc3RfZ2V0c29ja29wdCh1ZHBfc3ZyX3NrLCBTQ1RQX1BFRVJfQUREUl9QQVJBTVMsICZwYWRkcnBhcmFtcywKKwkJCQkJCQkJJm9wdGxlbik7CisKKwlkZmx0X3BhdGhtYXhyeHQgPSBwYWRkcnBhcmFtcy5zcHBfcGF0aG1heHJ4dDsKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tvcHQoU0NUUF9QRUVSX0FERFJfUEFSQU1TKSIpOworCisJLyogQ2hhbmdlIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgZm9yIHRoaXMgZW5kcG9pbnQgKHNvY2tldCkgKi8KKwlwYWRkcnBhcmFtcy5zcHBfaGJpbnRlcnZhbCA9IDEwMDA7CisJcGFkZHJwYXJhbXMuc3BwX3BhdGhtYXhyeHQgPSBkZmx0X3BhdGhtYXhyeHQrMTsKKwlwYWRkcnBhcmFtcy5zcHBfc2Fja2RlbGF5ID0gMTAwOworCXRlc3Rfc2V0c29ja29wdCh1ZHBfc3ZyX3NrLCBTQ1RQX1BFRVJfQUREUl9QQVJBTVMsICZwYWRkcnBhcmFtcywKKwkJCQkJCQlzaXplb2YocGFkZHJwYXJhbXMpKTsKKworCXBhZGRycGFyYW1zLnNwcF9wYXRobWF4cnh0ID0gMDsKKworCS8qIEdldCB0aGUgdXBkYXRlZCBkZWZhdWx0IHBhcmFtZXRlcnMgZm9yIHRoaXMgZW5kcG9pbnQuICovCisJb3B0bGVuID0gc2l6ZW9mKHBhZGRycGFyYW1zKTsKKwl0ZXN0X2dldHNvY2tvcHQodWRwX3N2cl9zaywgU0NUUF9QRUVSX0FERFJfUEFSQU1TLCAmcGFkZHJwYXJhbXMsCisJCQkJCQkJCSZvcHRsZW4pOworCWlmIChwYWRkcnBhcmFtcy5zcHBfcGF0aG1heHJ4dCAhPSBkZmx0X3BhdGhtYXhyeHQrMSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2V0c29ja29wdChTQ1RQX1BFRVJfQUREUl9QQVJBTVMpICIKKwkJCSAibWlzbWF0Y2giKTsKKworCXZhbHVlLmFzc29jX2lkID0gMDsKKwlvcHRsZW4gPSBzaXplb2YodmFsdWUpOworCXRlc3RfZ2V0c29ja29wdCh1ZHBfc3ZyX3NrLCBTQ1RQX0RFTEFZRURfQUNLX1RJTUUsICZ2YWx1ZSwKKwkJCQkJCQkJJm9wdGxlbik7CisJaWYgKHZhbHVlLmFzc29jX3ZhbHVlICE9IDEwMCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdChTQ1RQX0RFTEFZRURfQUNLX1RJTUUpICIKKwkJCSAibWlzbWF0Y2giKTsKKworCXZhbHVlLmFzc29jX2lkICAgID0gMDsKKwl2YWx1ZS5hc3NvY192YWx1ZSA9IDI1MDsKKwl0ZXN0X3NldHNvY2tvcHQodWRwX3N2cl9zaywgU0NUUF9ERUxBWUVEX0FDS19USU1FLCAmdmFsdWUsCisJCQkJCQkJc2l6ZW9mKHZhbHVlKSk7CisJb3B0bGVuID0gc2l6ZW9mKHBhZGRycGFyYW1zKTsKKwl0ZXN0X2dldHNvY2tvcHQodWRwX3N2cl9zaywgU0NUUF9QRUVSX0FERFJfUEFSQU1TLCAmcGFkZHJwYXJhbXMsCisJCQkJCQkJCSZvcHRsZW4pOworCWlmIChwYWRkcnBhcmFtcy5zcHBfc2Fja2RlbGF5ICE9IDI1MCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2V0c29ja29wdChTQ1RQX0RFTEFZRURfQUNLX1RJTUUpICIKKwkJCSAibWlzbWF0Y2giKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2V0c29ja29wdChTQ1RQX0RFTEFZRURfQUNLX1RJTUUpIik7CisKKworCS8qIEVuc3VyZSB0aGF0IHByaW9yIGRlZmF1bHRzIGFyZSBwcmVzZXJ2ZWQgZm9yIGEgbmV3IGVuZHBvaW50ICovCisJdWRwX2NsdF9zayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NFUVBBQ0tFVCwgSVBQUk9UT19TQ1RQKTsKKwlvcHRsZW4gPSBzaXplb2YocGFkZHJwYXJhbXMpOworCW1lbXNldCgmcGFkZHJwYXJhbXMsIDAsIHNpemVvZihwYWRkcnBhcmFtcykpOworCXBhZGRycGFyYW1zLnNwcF9hZGRyZXNzLnNzX2ZhbWlseSA9IEFGX0lORVQ7CisJdGVzdF9nZXRzb2Nrb3B0KHVkcF9jbHRfc2ssIFNDVFBfUEVFUl9BRERSX1BBUkFNUywgJnBhZGRycGFyYW1zLAorCQkJCQkJCQkmb3B0bGVuKTsKKwlpZiAocGFkZHJwYXJhbXMuc3BwX3BhdGhtYXhyeHQgIT0gZGZsdF9wYXRobWF4cnh0KQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRzb2Nrb3B0KFNDVFBfUEVFUl9BRERSX1BBUkFNUykgIgorCQkJICJtaXNtYXRjaCIpOworCisJCisJdHN0X3Jlc20oVFBBU1MsICJzZXRzb2Nrb3B0KFNDVFBfUEVFUl9BRERSX1BBUkFNUykiKTsKKworICAgICAgIAkvKiBJbnZhbGlkIGFzc29jIGlkICovCisJcGFkZHJwYXJhbXMuc3BwX2Fzc29jX2lkID0gMTIzNDsKKyAgICAgICAgZXJyb3IgPSBzZXRzb2Nrb3B0KHVkcF9jbHRfc2ssIFNPTF9TQ1RQLCBTQ1RQX1BFRVJfQUREUl9QQVJBTVMsCisJCQkgICAmcGFkZHJwYXJhbXMsCisJCQkgICBzaXplb2YocGFkZHJwYXJhbXMpKTsKKwlpZiAoKC0xICE9IGVycm9yKSB8fCAoRUlOVkFMICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2V0c29ja29wdChTQ1RQX1BFRVJfQUREUl9QQVJBTVMpICIKKwkJCSAiaW52YWxpZCBhc3NvY2lkIGVycm9yOiVkLCBlcnJubzolZFxuIiwKKwkJCSBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZXRzb2Nrb3B0KFNDVFBfUEVFUl9BRERSX1BBUkFNUykgIgorCQkgIi0gb25lLXRvLW1hbnkgc3R5bGUgaW52YWxpZCBhc3NvY2lkIik7CisKKwl0ZXN0X2JpbmQodWRwX3N2cl9zaywgJnVkcF9zdnJfbG9vcC5zYSwgc2l6ZW9mKHVkcF9zdnJfbG9vcCkpOworCXRlc3RfYmluZCh1ZHBfY2x0X3NrLCAmdWRwX2NsdF9sb29wLnNhLCBzaXplb2YodWRwX2NsdF9sb29wKSk7CisKKwl0ZXN0X2xpc3Rlbih1ZHBfc3ZyX3NrLCA1KTsKKworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZSh1ZHBfc3ZyX3NrKTsKKwl0ZXN0X2VuYWJsZV9hc3NvY19jaGFuZ2UodWRwX2NsdF9zayk7CisKKwkvKiBEbyBhIGNvbm5lY3Qgb24gYSBVRFAtc3R5bGUgc29ja2V0IGFuZCBlc3RhYmxpc2ggYW4gYXNzb2NpYXRpb24uICovCisJdGVzdF9jb25uZWN0KHVkcF9jbHRfc2ssICZ1ZHBfc3ZyX2xvb3Auc2EsIHNpemVvZih1ZHBfc3ZyX2xvb3ApKTsKKworCS8qIFJlY2VpdmUgdGhlIENPTU1fVVAgbm90aWZpY2F0aW9ucyBhbmQgZ2V0IHRoZSBhc3NvY2lkJ3MgKi8KKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwllcnJvciA9IHRlc3RfcmVjdm1zZyh1ZHBfc3ZyX3NrLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfQ09NTV9VUCk7CQorCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKilpb3YuaW92X2Jhc2U7CisKKwlwYWRkcnBhcmFtcy5zcHBfYXNzb2NfaWQgPSBzYWMtPnNhY19hc3NvY19pZDsKKwltZW1jcHkoJnBhZGRycGFyYW1zLnNwcF9hZGRyZXNzLCAmdWRwX2NsdF9sb29wLCBzaXplb2YodWRwX2NsdF9sb29wKSk7CisJcGFkZHJwYXJhbXMuc3BwX2hiaW50ZXJ2YWwgPSAxMDAwOworCXBhZGRycGFyYW1zLnNwcF9wYXRobWF4cnh0ID0gZGZsdF9wYXRobWF4cnh0KzE7CisJdGVzdF9zZXRzb2Nrb3B0KHVkcF9zdnJfc2ssIFNDVFBfUEVFUl9BRERSX1BBUkFNUywgJnBhZGRycGFyYW1zLAorCQkJCQkJCXNpemVvZihwYWRkcnBhcmFtcykpOworCXRzdF9yZXNtKFRQQVNTLCAic2V0c29ja29wdChTQ1RQX1BFRVJfQUREUl9QQVJBTVMpIC0gIgorCQkgIm9uZS10by1tYW55IHN0eWxlIHZhbGlkIGFzc29jaWQgdmFsaWQgYWRkcmVzcyIpOworCisJcGFkZHJwYXJhbXMuc3BwX2Fzc29jX2lkID0gc2FjLT5zYWNfYXNzb2NfaWQ7CisJbWVtY3B5KCZwYWRkcnBhcmFtcy5zcHBfYWRkcmVzcywgJnVkcF9zdnJfbG9vcCwgc2l6ZW9mKHVkcF9zdnJfbG9vcCkpOworCXBhZGRycGFyYW1zLnNwcF9oYmludGVydmFsID0gMTAwMDsKKwlwYWRkcnBhcmFtcy5zcHBfcGF0aG1heHJ4dCA9IGRmbHRfcGF0aG1heHJ4dCsxOworCQorICAgICAgICBlcnJvciA9IHNldHNvY2tvcHQodWRwX2NsdF9zaywgU09MX1NDVFAsIFNDVFBfUEVFUl9BRERSX1BBUkFNUywKKwkJCSAgICZwYWRkcnBhcmFtcywKKwkJCSAgIHNpemVvZihwYWRkcnBhcmFtcykpOworCWlmICgoLTEgIT0gZXJyb3IpIHx8IChFSU5WQUwgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0KFNDVFBfUEVFUl9BRERSX1BBUkFNUykgIgorCQkJICJpbnZhbGlkIHRyYW5zcG9ydCBlcnJvcjolZCwgZXJybm86JWRcbiIsCisJCQkgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2V0c29ja29wdChTQ1RQX1BFRVJfQUREUl9QQVJBTVMpICIKKwkJICItIG9uZS10by1tYW55IHN0eWxlIGludmFsaWQgdHJhbnNwb3J0Iik7CisKKwlwYWRkcnBhcmFtcy5zcHBfYXNzb2NfaWQgPSBzYWMtPnNhY19hc3NvY19pZDsKKwltZW1jcHkoJnBhZGRycGFyYW1zLnNwcF9hZGRyZXNzLCAmdWRwX2NsdF9sb29wLCBzaXplb2YodWRwX2NsdF9sb29wKSk7CisJcGFkZHJwYXJhbXMuc3BwX2hiaW50ZXJ2YWwgPSAxMDAwOworCXBhZGRycGFyYW1zLnNwcF9wYXRobWF4cnh0ID0gZGZsdF9wYXRobWF4cnh0KzE7CisKKyAgICAgICAgZXJyb3IgPSBzZXRzb2Nrb3B0KHVkcF9jbHRfc2ssIFNPTF9TQ1RQLCBTQ1RQX1BFRVJfQUREUl9QQVJBTVMsCisJCQkgICAmcGFkZHJwYXJhbXMsCisJCQkgICBzaXplb2YocGFkZHJwYXJhbXMpIC0gMSk7CisJaWYgKCgtMSAhPSBlcnJvcikgfHwgKEVJTlZBTCAhPSBlcnJubykpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNldHNvY2tvcHQoU0NUUF9QRUVSX0FERFJfUEFSQU1TKSAiCisJCQkgImludmFsaWQgcGFyYW1ldGVyIGxlbmd0aCBlcnJvcjolZCwgZXJybm86JWRcbiIsCisJCQkgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2V0c29ja29wdChTQ1RQX1BFRVJfQUREUl9QQVJBTVMpICIKKwkJICItIG9uZS10by1tYW55IHN0eWxlIGludmFsaWQgcGFyYW1ldGVyIGxlbmd0aCIpOworCisgICAgICAgIGVycm9yID0gc2V0c29ja29wdCh1ZHBfY2x0X3NrLCBTT0xfU0NUUCwgU0NUUF9ERUxBWUVEX0FDS19USU1FLAorCQkJICAgJnZhbHVlLAorCQkJICAgc2l6ZW9mKHZhbHVlKSAtIDEpOworCWlmICgoLTEgIT0gZXJyb3IpIHx8IChFSU5WQUwgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0KFNDVFBfREVMQVlFRF9BQ0tfVElNRSkgIgorCQkJICJpbnZhbGlkIHBhcmFtZXRlciBsZW5ndGggZXJyb3I6JWQsIGVycm5vOiVkXG4iLAorCQkJIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoU0NUUF9ERUxBWUVEX0FDS19USU1FKSAiCisJCSAiLSBvbmUtdG8tbWFueSBzdHlsZSBpbnZhbGlkIHBhcmFtZXRlciBsZW5ndGgiKTsKKworCW1lbXNldCgmcGFkZHJwYXJhbXMsIDAsIHNpemVvZihwYWRkcnBhcmFtcykpOworCXBhZGRycGFyYW1zLnNwcF9hc3NvY19pZCA9IHNhYy0+c2FjX2Fzc29jX2lkOworCW1lbWNweSgmcGFkZHJwYXJhbXMuc3BwX2FkZHJlc3MsICZ1ZHBfY2x0X2xvb3AsIHNpemVvZih1ZHBfY2x0X2xvb3ApKTsKKwlwYWRkcnBhcmFtcy5zcHBfc2Fja2RlbGF5ID0gNTAxOworCisgICAgICAgIGVycm9yID0gc2V0c29ja29wdCh1ZHBfY2x0X3NrLCBTT0xfU0NUUCwgU0NUUF9QRUVSX0FERFJfUEFSQU1TLAorCQkJICAgJnBhZGRycGFyYW1zLAorCQkJICAgc2l6ZW9mKHBhZGRycGFyYW1zKSk7CisJaWYgKCgtMSAhPSBlcnJvcikgfHwgKEVJTlZBTCAhPSBlcnJubykpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNldHNvY2tvcHQoU0NUUF9QRUVSX0FERFJfUEFSQU1TKSAiCisJCQkgImludmFsaWQgc2FjayBkZWxheSBlcnJvcjolZCwgZXJybm86JWRcbiIsCisJCQkgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2V0c29ja29wdChTQ1RQX1BFRVJfQUREUl9QQVJBTVMpICIKKwkJICItIG9uZS10by1tYW55IHN0eWxlIGludmFsaWQgc2FjayBkZWxheSIpOworCisJdmFsdWUuYXNzb2NfaWQgICAgPSBzYWMtPnNhY19hc3NvY19pZDsKKwl2YWx1ZS5hc3NvY192YWx1ZSA9IDUwMTsKKworICAgICAgICBlcnJvciA9IHNldHNvY2tvcHQodWRwX2NsdF9zaywgU09MX1NDVFAsIFNDVFBfREVMQVlFRF9BQ0tfVElNRSwKKwkJCSAgICZ2YWx1ZSwKKwkJCSAgIHNpemVvZih2YWx1ZSkpOworCWlmICgoLTEgIT0gZXJyb3IpIHx8IChFSU5WQUwgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0KFNDVFBfREVMQVlFRF9BQ0tfVElNRSkgIgorCQkJICJpbnZhbGlkIHNhY2sgZGVsYXkgZXJyb3I6JWQsIGVycm5vOiVkXG4iLAorCQkJIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoU0NUUF9ERUxBWUVEX0FDS19USU1FKSAiCisJCSAiLSBvbmUtdG8tbWFueSBzdHlsZSBpbnZhbGlkIHNhY2sgZGVsYXkiKTsKKworCW1lbXNldCgmcGFkZHJwYXJhbXMsIDAsIHNpemVvZihwYWRkcnBhcmFtcykpOworCXBhZGRycGFyYW1zLnNwcF9hc3NvY19pZCA9IHNhYy0+c2FjX2Fzc29jX2lkOworCW1lbWNweSgmcGFkZHJwYXJhbXMuc3BwX2FkZHJlc3MsICZ1ZHBfY2x0X2xvb3AsIHNpemVvZih1ZHBfY2x0X2xvb3ApKTsKKwlwYWRkcnBhcmFtcy5zcHBfcGF0aG10dSA9IDUxMTsKKworICAgICAgICBlcnJvciA9IHNldHNvY2tvcHQodWRwX2NsdF9zaywgU09MX1NDVFAsIFNDVFBfUEVFUl9BRERSX1BBUkFNUywKKwkJCSAgICZwYWRkcnBhcmFtcywKKwkJCSAgIHNpemVvZihwYWRkcnBhcmFtcykpOworCWlmICgoLTEgIT0gZXJyb3IpIHx8IChFSU5WQUwgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0KFNDVFBfUEVFUl9BRERSX1BBUkFNUykgIgorCQkJICJpbnZhbGlkIHBhdGggTVRVIGVycm9yOiVkLCBlcnJubzolZFxuIiwKKwkJCSBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZXRzb2Nrb3B0KFNDVFBfUEVFUl9BRERSX1BBUkFNUykgIgorCQkgIi0gb25lLXRvLW1hbnkgc3R5bGUgaW52YWxpZCBwYXRoIE1UVSIpOworCisJbWVtc2V0KCZwYWRkcnBhcmFtcywgMCwgc2l6ZW9mKHBhZGRycGFyYW1zKSk7CisJcGFkZHJwYXJhbXMuc3BwX2Fzc29jX2lkID0gc2FjLT5zYWNfYXNzb2NfaWQ7CisJbWVtY3B5KCZwYWRkcnBhcmFtcy5zcHBfYWRkcmVzcywgJnVkcF9jbHRfbG9vcCwgc2l6ZW9mKHVkcF9jbHRfbG9vcCkpOworCXBhZGRycGFyYW1zLnNwcF9mbGFncyA9IFNQUF9IQl9FTkFCTEUgfCBTUFBfSEJfRElTQUJMRTsKKworICAgICAgICBlcnJvciA9IHNldHNvY2tvcHQodWRwX2NsdF9zaywgU09MX1NDVFAsIFNDVFBfUEVFUl9BRERSX1BBUkFNUywKKwkJCSAgICZwYWRkcnBhcmFtcywKKwkJCSAgIHNpemVvZihwYWRkcnBhcmFtcykpOworCWlmICgoLTEgIT0gZXJyb3IpIHx8IChFSU5WQUwgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0KFNDVFBfUEVFUl9BRERSX1BBUkFNUykgIgorCQkJICJpbnZhbGlkIGhiIGVuYWJsZSBmbGFncyBlcnJvcjolZCwgZXJybm86JWRcbiIsCisJCQkgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2V0c29ja29wdChTQ1RQX1BFRVJfQUREUl9QQVJBTVMpICIKKwkJICItIG9uZS10by1tYW55IHN0eWxlIGludmFsaWQgaGIgZW5hYmxlIGZsYWdzIik7CisKKwltZW1zZXQoJnBhZGRycGFyYW1zLCAwLCBzaXplb2YocGFkZHJwYXJhbXMpKTsKKwlwYWRkcnBhcmFtcy5zcHBfYXNzb2NfaWQgPSBzYWMtPnNhY19hc3NvY19pZDsKKwltZW1jcHkoJnBhZGRycGFyYW1zLnNwcF9hZGRyZXNzLCAmdWRwX2NsdF9sb29wLCBzaXplb2YodWRwX2NsdF9sb29wKSk7CisJcGFkZHJwYXJhbXMuc3BwX2ZsYWdzID0gU1BQX1BNVFVEX0VOQUJMRSB8IFNQUF9QTVRVRF9ESVNBQkxFOworCisgICAgICAgIGVycm9yID0gc2V0c29ja29wdCh1ZHBfY2x0X3NrLCBTT0xfU0NUUCwgU0NUUF9QRUVSX0FERFJfUEFSQU1TLAorCQkJICAgJnBhZGRycGFyYW1zLAorCQkJICAgc2l6ZW9mKHBhZGRycGFyYW1zKSk7CisJaWYgKCgtMSAhPSBlcnJvcikgfHwgKEVJTlZBTCAhPSBlcnJubykpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNldHNvY2tvcHQoU0NUUF9QRUVSX0FERFJfUEFSQU1TKSAiCisJCQkgImludmFsaWQgUE1UVSBkaXNjb3ZlcnkgZW5hYmxlIGZsYWdzIGVycm9yOiVkLCBlcnJubzolZFxuIiwKKwkJCSBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZXRzb2Nrb3B0KFNDVFBfUEVFUl9BRERSX1BBUkFNUykgIgorCQkgIi0gb25lLXRvLW1hbnkgc3R5bGUgaW52YWxpZCBQTVRVIGRpc2NvdmVyeSBlbmFibGUgZmxhZ3MiKTsKKworCW1lbXNldCgmcGFkZHJwYXJhbXMsIDAsIHNpemVvZihwYWRkcnBhcmFtcykpOworCXBhZGRycGFyYW1zLnNwcF9hc3NvY19pZCA9IHNhYy0+c2FjX2Fzc29jX2lkOworCW1lbWNweSgmcGFkZHJwYXJhbXMuc3BwX2FkZHJlc3MsICZ1ZHBfY2x0X2xvb3AsIHNpemVvZih1ZHBfY2x0X2xvb3ApKTsKKwlwYWRkcnBhcmFtcy5zcHBfZmxhZ3MgPSBTUFBfU0FDS0RFTEFZX0VOQUJMRSB8IFNQUF9TQUNLREVMQVlfRElTQUJMRTsKKworICAgICAgICBlcnJvciA9IHNldHNvY2tvcHQodWRwX2NsdF9zaywgU09MX1NDVFAsIFNDVFBfUEVFUl9BRERSX1BBUkFNUywKKwkJCSAgICZwYWRkcnBhcmFtcywKKwkJCSAgIHNpemVvZihwYWRkcnBhcmFtcykpOworCWlmICgoLTEgIT0gZXJyb3IpIHx8IChFSU5WQUwgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0KFNDVFBfUEVFUl9BRERSX1BBUkFNUykgIgorCQkJICJpbnZhbGlkIHNhY2sgZGVsYXkgZW5hYmxlIGZsYWdzIGVycm9yOiVkLCBlcnJubzolZFxuIiwKKwkJCSBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZXRzb2Nrb3B0KFNDVFBfUEVFUl9BRERSX1BBUkFNUykgIgorCQkgIi0gb25lLXRvLW1hbnkgc3R5bGUgaW52YWxpZCBzYWNrIGRlbGF5IGVuYWJsZSBmbGFncyIpOworCisJbWVtc2V0KCZwYWRkcnBhcmFtcywgMCwgc2l6ZW9mKHBhZGRycGFyYW1zKSk7CisJcGFkZHJwYXJhbXMuc3BwX2ZsYWdzID0gU1BQX0hCX0RFTUFORDsKKworICAgICAgICBlcnJvciA9IHNldHNvY2tvcHQodWRwX2NsdF9zaywgU09MX1NDVFAsIFNDVFBfUEVFUl9BRERSX1BBUkFNUywKKwkJCSAgICZwYWRkcnBhcmFtcywKKwkJCSAgIHNpemVvZihwYWRkcnBhcmFtcykpOworCWlmICgoLTEgIT0gZXJyb3IpIHx8IChFSU5WQUwgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0KFNDVFBfUEVFUl9BRERSX1BBUkFNUykgIgorCQkJICJpbnZhbGlkIGhiIGRlbWFuZCBlcnJvcjolZCwgZXJybm86JWRcbiIsCisJCQkgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAic2V0c29ja29wdChTQ1RQX1BFRVJfQUREUl9QQVJBTVMpICIKKwkJICItIG9uZS10by1tYW55IHN0eWxlIGludmFsaWQgaGIgZGVtYW5kIik7CisKKwljbG9zZSh1ZHBfc3ZyX3NrKTsKKwljbG9zZSh1ZHBfY2x0X3NrKTsKKworCisJLyogVEVTVCAjNjogU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0gc29ja2V0IG9wdGlvbi4gKi8KKwkvKiBDcmVhdGUgYW5kIGJpbmQgMiBVRFAtc3R5bGUgc29ja2V0cyh1ZHBfc3ZyX3NrLCB1ZHBfY2x0X3NrKSBhbmQKKwkgKiAyIFRDUC1zdHlsZSBzb2NrZXRzLiAodGNwX3N2cl9zaywgdGNwX2NsdF9zaykKKwkgKi8KKwl1ZHBfc3ZyX3NrID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU0VRUEFDS0VULCBJUFBST1RPX1NDVFApOworCXVkcF9jbHRfc2sgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisJdGNwX3N2cl9zayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKwl0Y3BfY2x0X3NrID0gdGVzdF9zb2NrZXQocGZfY2xhc3MsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1NDVFApOworCisJLyogRW5hYmxlIEFTU09DX0NIQU5HRSBhbmQgU05EUkNWSU5GTyBub3RpZmljYXRpb25zLiAqLworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZSh1ZHBfc3ZyX3NrKTsKKwl0ZXN0X2VuYWJsZV9hc3NvY19jaGFuZ2UodWRwX2NsdF9zayk7CisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKHRjcF9zdnJfc2spOworCXRlc3RfZW5hYmxlX2Fzc29jX2NoYW5nZSh0Y3BfY2x0X3NrKTsKKworCXRlc3RfYmluZCh1ZHBfc3ZyX3NrLCAmdWRwX3N2cl9sb29wLnNhLCBzaXplb2YodWRwX3N2cl9sb29wKSk7CisJdGVzdF9iaW5kKHVkcF9jbHRfc2ssICZ1ZHBfY2x0X2xvb3Auc2EsIHNpemVvZih1ZHBfY2x0X2xvb3ApKTsKKwl0ZXN0X2JpbmQodGNwX3N2cl9zaywgJnRjcF9zdnJfbG9vcC5zYSwgc2l6ZW9mKHRjcF9zdnJfbG9vcCkpOworCXRlc3RfYmluZCh0Y3BfY2x0X3NrLCAmdGNwX2NsdF9sb29wLnNhLCBzaXplb2YodGNwX2NsdF9sb29wKSk7CisKKwkvKiBNYXJrIHVkcF9zdnJfc2sgYW5kIHRjcF9zdnJfc2sgYXMgYmVpbmcgYWJsZSB0byBhY2NlcHQgbmV3CisJICogYXNzb2NpYXRpb25zLgorCSAqLworCXRlc3RfbGlzdGVuKHVkcF9zdnJfc2ssIDUpOworCXRlc3RfbGlzdGVuKHRjcF9zdnJfc2ssIDUpOworCisJLyogU2V0IGRlZmF1bHQgc2VuZCBwYXJhbWV0ZXJzIG9uIHRoZSB1bmNvbm5lY3RlZCBVRFAtc3R5bGUgc29ja2V0cy4gKi8KKwltZW1zZXQoJnNldF91ZHBfc2tfZGZsdF9wYXJhbSwgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlzZXRfdWRwX3NrX2RmbHRfcGFyYW0uc2luZm9fcHBpZCA9IDEwMDA7CisJdGVzdF9zZXRzb2Nrb3B0KHVkcF9zdnJfc2ssIFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNLAorCQkJJnNldF91ZHBfc2tfZGZsdF9wYXJhbSwgc2l6ZW9mKHNldF91ZHBfc2tfZGZsdF9wYXJhbSkpOworCW1lbXNldCgmc2V0X3VkcF9za19kZmx0X3BhcmFtLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCXNldF91ZHBfc2tfZGZsdF9wYXJhbS5zaW5mb19wcGlkID0gMTAwMDsKKwl0ZXN0X3NldHNvY2tvcHQodWRwX2NsdF9zaywgU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0sCisJCQkmc2V0X3VkcF9za19kZmx0X3BhcmFtLCBzaXplb2Yoc2V0X3VkcF9za19kZmx0X3BhcmFtKSk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0pIC0gIgorCQkgIm9uZS10by1tYW55IHN0eWxlIHNvY2tldCIpOworCisJLyogR2V0IGRlZmF1bHQgc2VuZCBwYXJhbWV0ZXJzIG9uIHRoZSB1bmNvbm5lY3RlZCBVRFAtc3R5bGUgc29ja2V0LiAqLworCW1lbXNldCgmZ2V0X3VkcF9za19kZmx0X3BhcmFtLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCW9wdGxlbiA9IHNpemVvZihnZXRfdWRwX3NrX2RmbHRfcGFyYW0pOworCXRlc3RfZ2V0c29ja29wdCh1ZHBfc3ZyX3NrLCBTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSwKKwkJCSZnZXRfdWRwX3NrX2RmbHRfcGFyYW0sICZvcHRsZW4pOworCisJLyogVmVyaWZ5IHRoYXQgdGhlIGdldCBwYXJhbSBtYXRjaGVzIHNldCBwYXJhbS4gKi8KKwlpZiAoc2V0X3VkcF9za19kZmx0X3BhcmFtLnNpbmZvX3BwaWQgIT0KKwkJCWdldF91ZHBfc2tfZGZsdF9wYXJhbS5zaW5mb19wcGlkKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRzb2Nrb3B0KFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNKSAiCisJCQkgIm1pc21hdGNoLiIpOworCisJLyogR2V0IGRlZmF1bHQgc2VuZCBwYXJhbWV0ZXJzIG9uIHRoZSB1bmNvbm5lY3RlZCBVRFAtc3R5bGUgc29ja2V0LiAqLworCW1lbXNldCgmZ2V0X3VkcF9za19kZmx0X3BhcmFtLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCW9wdGxlbiA9IHNpemVvZihnZXRfdWRwX3NrX2RmbHRfcGFyYW0pOworCXRlc3RfZ2V0c29ja29wdCh1ZHBfY2x0X3NrLCBTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSwKKwkJICAgICAgICZnZXRfdWRwX3NrX2RmbHRfcGFyYW0sICZvcHRsZW4pOworCisJLyogVmVyaWZ5IHRoYXQgdGhlIGdldCBwYXJhbSBtYXRjaGVzIHNldCBwYXJhbS4gKi8KKwlpZiAoc2V0X3VkcF9za19kZmx0X3BhcmFtLnNpbmZvX3BwaWQgIT0KKwkJCWdldF91ZHBfc2tfZGZsdF9wYXJhbS5zaW5mb19wcGlkKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRzb2Nrb3B0KFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNKSAiCisJCQkgIm1pc21hdGNoLiIpOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRzb2Nrb3B0KFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNKSAtICIKKwkJICJvbmUtdG8tbWFueSBzdHlsZSBzb2NrZXQiKTsKKworCS8qIFZlcmlmeSB0aGF0IHRyeWluZyB0byBzZXQgc2VuZCBwYXJhbXMgd2l0aCBhbiBpbnZhbGlkIGFzc29jIGlkCisJICogb24gYW4gVURQLXN0eWxlIHNvY2tldCBmYWlscy4KKwkgKi8KKwltZW1zZXQoJnNldF91ZHBfc2tfZGZsdF9wYXJhbSwgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlzZXRfdWRwX3NrX2RmbHRfcGFyYW0uc2luZm9fcHBpZCA9IDEwMDA7CisgICAgICAgCS8qIEludmFsaWQgYXNzb2MgaWQgKi8KKwlzZXRfdWRwX3NrX2RmbHRfcGFyYW0uc2luZm9fYXNzb2NfaWQgPSAxMjM0OworICAgICAgICBlcnJvciA9IHNldHNvY2tvcHQodWRwX2NsdF9zaywgU09MX1NDVFAsIFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNLAorCQkJICAgJnNldF91ZHBfc2tfZGZsdF9wYXJhbSwKKwkJCSAgIHNpemVvZihzZXRfdWRwX3NrX2RmbHRfcGFyYW0pKTsKKwlpZiAoKC0xICE9IGVycm9yKSB8fCAoRUlOVkFMICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2V0c29ja29wdChTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSkgIgorCQkJICJpbnZhbGlkIGFzc29jaWQgZXJyb3I6JWQsIGVycm5vOiVkXG4iLAorCQkJIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0pICIKKwkJICItIG9uZS10by1tYW55IHN0eWxlIGludmFsaWQgYXNzb2NpZCIpOworCisJLyogRG8gYSBjb25uZWN0IG9uIGEgVURQLXN0eWxlIHNvY2tldCBhbmQgZXN0YWJsaXNoIGFuIGFzc29jaWF0aW9uLiAqLworCXRlc3RfY29ubmVjdCh1ZHBfY2x0X3NrLCAmdWRwX3N2cl9sb29wLnNhLCBzaXplb2YodWRwX3N2cl9sb29wKSk7CisKKwkvKiBSZWNlaXZlIHRoZSBDT01NX1VQIG5vdGlmaWNhdGlvbnMgYW5kIGdldCB0aGUgYXNzb2NpZCdzICovCisJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJZXJyb3IgPSB0ZXN0X3JlY3Ztc2codWRwX3N2cl9zaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOwkKKwlzYWMgPSAoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICopaW92Lmlvdl9iYXNlOworCXVkcF9zdnJfYXNzb2NpZCA9IHNhYy0+c2FjX2Fzc29jX2lkOworCisJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJZXJyb3IgPSB0ZXN0X3JlY3Ztc2codWRwX2NsdF9zaywgJmlubWVzc2FnZSwgTVNHX1dBSVRBTEwpOworCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX2Fzc29jX2NoYW5nZSksCisJCQkJICAgIFNDVFBfQVNTT0NfQ0hBTkdFLCBTQ1RQX0NPTU1fVVApOwkKKwlzYWMgPSAoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICopaW92Lmlvdl9iYXNlOworCXVkcF9jbHRfYXNzb2NpZCA9IHNhYy0+c2FjX2Fzc29jX2lkOworCisJLyogVmVyaWZ5IHRoYXQgdHJ5aW5nIHRvIHNldCBzZW5kIHBhcmFtcyB3aXRoIGFuIGFzc29jIGlkIG5vdCAKKwkgKiBiZWxvbmdpbmcgdG8gdGhlIHNvY2tldCBvbiBhbiBVRFAtc3R5bGUgc29ja2V0IGZhaWxzLgorCSAqLworCW1lbXNldCgmc2V0X3VkcF9hc3NvY19kZmx0X3BhcmFtLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCXNldF91ZHBfYXNzb2NfZGZsdF9wYXJhbS5zaW5mb19wcGlkID0gMzAwMDsKKwlzZXRfdWRwX2Fzc29jX2RmbHRfcGFyYW0uc2luZm9fYXNzb2NfaWQgPSB1ZHBfY2x0X2Fzc29jaWQ7CisJZXJyb3IgPSBzZXRzb2Nrb3B0KHVkcF9zdnJfc2ssIFNPTF9TQ1RQLCBTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSwKKwkJCSAgICZzZXRfdWRwX2Fzc29jX2RmbHRfcGFyYW0sCisJCQkgICBzaXplb2Yoc2V0X3VkcF9hc3NvY19kZmx0X3BhcmFtKSk7CisJaWYgKCgtMSAhPSBlcnJvcikgfHwgKEVJTlZBTCAhPSBlcnJubykpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNldHNvY2tvcHQoU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0pICIKKwkJCSAiYXNzb2NpZCBiZWxvbmdpbmcgdG8gYW5vdGhlciBzb2NrZXQgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZXRzb2Nrb3B0KFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNKSAtICIKKwkJICJvbmUtdG8tbWFueSBzdHlsZSBhc3NvY2lkIGJlbG9uZ2luZyB0byBhbm90aGVyIHNvY2tldCIpOworCisJLyogU2V0IGRlZmF1bHQgc2VuZCBwYXJhbWV0ZXJzIG9mIGFuIGFzc29jaWF0aW9uIG9uIHRoZSBsaXN0ZW5pbmcgCisJICogVURQLXN0eWxlIHNvY2tldCB3aXRoIGEgdmFsaWQgYXNzb2NpZC4KKwkgKi8gCisJbWVtc2V0KCZzZXRfdWRwX2Fzc29jX2RmbHRfcGFyYW0sIDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJc2V0X3VkcF9hc3NvY19kZmx0X3BhcmFtLnNpbmZvX3BwaWQgPSAzMDAwOworCXNldF91ZHBfYXNzb2NfZGZsdF9wYXJhbS5zaW5mb19hc3NvY19pZCA9IHVkcF9zdnJfYXNzb2NpZDsKKwl0ZXN0X3NldHNvY2tvcHQodWRwX3N2cl9zaywgU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0sCisJCQkmc2V0X3VkcF9hc3NvY19kZmx0X3BhcmFtLAorCQkJc2l6ZW9mKHNldF91ZHBfYXNzb2NfZGZsdF9wYXJhbSkpOworCisJdHN0X3Jlc20oVFBBU1MsICJzZXRzb2Nrb3B0KFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNKSAtICIKKwkJICJvbmUtdG8tbWFueSBzdHlsZSB2YWxpZCBhc3NvY2lkIik7CisKKwkvKiBHZXQgZGVmYXVsdCBzZW5kIHBhcmFtZXRlcnMgb2YgYW4gYXNzb2NpYXRpb24gb24gdGhlIGxpc3RlbmluZyAKKwkgKiBVRFAtc3R5bGUgc29ja2V0IHdpdGggYSB2YWxpZCBhc3NvY2lkLgorCSAqLyAKKwltZW1zZXQoJmdldF91ZHBfYXNzb2NfZGZsdF9wYXJhbSwgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlnZXRfdWRwX2Fzc29jX2RmbHRfcGFyYW0uc2luZm9fYXNzb2NfaWQgPSB1ZHBfc3ZyX2Fzc29jaWQgOworCW9wdGxlbiA9IHNpemVvZihnZXRfdWRwX2Fzc29jX2RmbHRfcGFyYW0pOworCXRlc3RfZ2V0c29ja29wdCh1ZHBfc3ZyX3NrLCBTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSwKKwkJCSZnZXRfdWRwX2Fzc29jX2RmbHRfcGFyYW0sICZvcHRsZW4pOworCisJLyogVmVyaWZ5IHRoYXQgdGhlIGdldCBwYXJhbSBtYXRjaGVzIHRoZSBzZXQgcGFyYW0uICovCisJaWYgKGdldF91ZHBfYXNzb2NfZGZsdF9wYXJhbS5zaW5mb19wcGlkICE9CisJCQlzZXRfdWRwX2Fzc29jX2RmbHRfcGFyYW0uc2luZm9fcHBpZCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdChTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSkgIgorCQkJICJtaXNtYXRjaC4iKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiZ2V0c29ja29wdChTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSkgLSAiCisJCSAib25lLXRvLW1hbnkgc3R5bGUgdmFsaWQgYXNzb2NpZCIpOworCisJLyogR2V0IGRlZmF1bHQgc2VuZCBwYXJhbWV0ZXJzIG9mIGFuIGFzc29jaWF0aW9uIG9uIHRoZSBjb25uZWN0ZWQgCisJICogVURQLXN0eWxlIHNvY2tldCB3aXRoIHplcm8gYXNzb2NpZC4gVGhpcyBzaG91bGQgcmV0dXJuIHRoZQorCSAqIHNvY2tldCB3aWRlIGRlZmF1bHQgcGFyYW1ldGVycy4KKwkgKi8gCisJbWVtc2V0KCZnZXRfdWRwX3NrX2RmbHRfcGFyYW0sIDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJZ2V0X3VkcF9za19kZmx0X3BhcmFtLnNpbmZvX2Fzc29jX2lkID0gMCA7CisJb3B0bGVuID0gc2l6ZW9mKGdldF91ZHBfc2tfZGZsdF9wYXJhbSk7CisJdGVzdF9nZXRzb2Nrb3B0KHVkcF9jbHRfc2ssIFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNLAorCQkJJmdldF91ZHBfc2tfZGZsdF9wYXJhbSwgJm9wdGxlbik7CisKKwkvKiBWZXJpZnkgdGhhdCB0aGUgZ2V0IHBhcmFtIG1hdGNoZXMgdGhlIHNvY2tldC13aWRlIHNldCBwYXJhbS4gKi8KKwlpZiAoZ2V0X3VkcF9za19kZmx0X3BhcmFtLnNpbmZvX3BwaWQgIT0KKwkJCXNldF91ZHBfc2tfZGZsdF9wYXJhbS5zaW5mb19wcGlkKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRzb2Nrb3B0KFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNKSAiCisJCQkgIm1pc21hdGNoLiIpOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRzb2Nrb3B0KFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNKSAtICIKKwkJICJvbmUtdG8tbWFueSBzdHlsZSB6ZXJvIGFzc29jaWQiKTsKKworCXBlZWxvZmZfc2sgPSB0ZXN0X3NjdHBfcGVlbG9mZih1ZHBfc3ZyX3NrLCB1ZHBfc3ZyX2Fzc29jaWQpOyAKKworCS8qIEdldCBkZWZhdWx0IHNlbmQgcGFyYW1ldGVycyBvZiBhbiBhc3NvY2lhdGlvbiBvbiB0aGUgcGVlbGVkIG9mZiAKKwkgKiBVRFAtc3R5bGUgc29ja2V0LiBUaGlzIHNob3VsZCByZXR1cm4gdGhlIGFzc29jaWF0aW9uJ3MgZGVmYXVsdAorCSAqIHBhcmFtZXRlcnMuCisJICovIAorCW1lbXNldCgmZ2V0X3BlZWxvZmZfYXNzb2NfZGZsdF9wYXJhbSwgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlnZXRfcGVlbG9mZl9hc3NvY19kZmx0X3BhcmFtLnNpbmZvX2Fzc29jX2lkID0gMCA7CisJb3B0bGVuID0gc2l6ZW9mKGdldF9wZWVsb2ZmX2Fzc29jX2RmbHRfcGFyYW0pOworCXRlc3RfZ2V0c29ja29wdChwZWVsb2ZmX3NrLCBTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSwKKwkJCSZnZXRfcGVlbG9mZl9hc3NvY19kZmx0X3BhcmFtLCAmb3B0bGVuKTsKKworCS8qIFZlcmlmeSB0aGF0IHRoZSBnZXQgcGFyYW0gbWF0Y2hlcyB0aGUgYXNzb2NpYXRpb24ncyBzZXQgcGFyYW0uICovCisJaWYgKGdldF9wZWVsb2ZmX2Fzc29jX2RmbHRfcGFyYW0uc2luZm9fcHBpZCAhPQorCQkJc2V0X3VkcF9hc3NvY19kZmx0X3BhcmFtLnNpbmZvX3BwaWQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImdldHNvY2tvcHQoU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0pICIKKwkJCSAibWlzbWF0Y2guIik7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tvcHQoU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0pIC0gIgorCQkgIm9uZS10by1tYW55IHN0eWxlIHBlZWxlZCBvZmYgc29ja2V0Iik7CisKKwkvKiBTZXQgZGVmYXVsdCBzZW5kIHBhcmFtZXRlcnMgb24gdGhlIHVuY29ubmVjdGVkIFRDUC1zdHlsZSBzb2NrZXRzLiAqLworCW1lbXNldCgmc2V0X3RjcF9za19kZmx0X3BhcmFtLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCXNldF90Y3Bfc2tfZGZsdF9wYXJhbS5zaW5mb19wcGlkID0gMjAwMDsKKwkvKiBJbnZhbGlkIGFzc29jIGlkLCBpZ25vcmVkIG9uIGEgVENQLXN0eWxlIHNvY2tldC4gKi8KKwlzZXRfdGNwX3NrX2RmbHRfcGFyYW0uc2luZm9fYXNzb2NfaWQgPSAxMjM0OworCXRlc3Rfc2V0c29ja29wdCh0Y3Bfc3ZyX3NrLCBTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSwKKwkJCSZzZXRfdGNwX3NrX2RmbHRfcGFyYW0sCisJCQlzaXplb2Yoc2V0X3RjcF9za19kZmx0X3BhcmFtKSk7CisKKwkvKiBTZXQgZGVmYXVsdCBzZW5kIHBhcmFtZXRlcnMgb24gdGhlIHVuY29ubmVjdGVkIFRDUC1zdHlsZSBzb2NrZXRzLiAqLworCW1lbXNldCgmc2V0X3RjcF9za19kZmx0X3BhcmFtLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCXNldF90Y3Bfc2tfZGZsdF9wYXJhbS5zaW5mb19wcGlkID0gMjAwMDsKKwkvKiBJbnZhbGlkIGFzc29jIGlkLCBpZ25vcmVkIG9uIGEgVENQLXN0eWxlIHNvY2tldC4gKi8KKwlzZXRfdGNwX3NrX2RmbHRfcGFyYW0uc2luZm9fYXNzb2NfaWQgPSAxMjM0OworCXRlc3Rfc2V0c29ja29wdCh0Y3BfY2x0X3NrLCBTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSwKKwkJCSZzZXRfdGNwX3NrX2RmbHRfcGFyYW0sCisJCQlzaXplb2Yoc2V0X3RjcF9za19kZmx0X3BhcmFtKSk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0pIC0gIgorCQkgIm9uZS10by1vbmUgc3R5bGUgc29ja2V0Iik7CisKKwkvKiBHZXQgZGVmYXVsdCBzZW5kIHBhcmFtZXRlcnMgb24gdGhlIHVuY29ubmVjdGVkIFRDUC1zdHlsZSBzb2NrZXQuICovCisJbWVtc2V0KCZnZXRfdGNwX3NrX2RmbHRfcGFyYW0sIDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJb3B0bGVuID0gc2l6ZW9mKGdldF90Y3Bfc2tfZGZsdF9wYXJhbSk7CisJdGVzdF9nZXRzb2Nrb3B0KHRjcF9zdnJfc2ssIFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNLAorCQkJJmdldF90Y3Bfc2tfZGZsdF9wYXJhbSwgJm9wdGxlbik7CisKKwkvKiBWZXJpZnkgdGhhdCB0aGUgZ2V0IHBhcmFtIG1hdGNoZXMgc2V0IHBhcmFtLiAqLworCWlmIChzZXRfdGNwX3NrX2RmbHRfcGFyYW0uc2luZm9fcHBpZCAhPQorCQkJZ2V0X3RjcF9za19kZmx0X3BhcmFtLnNpbmZvX3BwaWQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImdldHNvY2tvcHQoU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0pICIKKwkJCSAibWlzbWF0Y2guIik7CisKKwkvKiBHZXQgZGVmYXVsdCBzZW5kIHBhcmFtZXRlcnMgb24gdGhlIHVuY29ubmVjdGVkIFRDUC1zdHlsZSBzb2NrZXQuICovCisJbWVtc2V0KCZnZXRfdGNwX3NrX2RmbHRfcGFyYW0sIDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJb3B0bGVuID0gc2l6ZW9mKGdldF90Y3Bfc2tfZGZsdF9wYXJhbSk7CisJdGVzdF9nZXRzb2Nrb3B0KHRjcF9jbHRfc2ssIFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNLAorCQkJJmdldF90Y3Bfc2tfZGZsdF9wYXJhbSwgJm9wdGxlbik7CisKKwkvKiBWZXJpZnkgdGhhdCB0aGUgZ2V0IHBhcmFtIG1hdGNoZXMgc2V0IHBhcmFtLiAqLworCWlmIChzZXRfdGNwX3NrX2RmbHRfcGFyYW0uc2luZm9fcHBpZCAhPQorCQkJZ2V0X3RjcF9za19kZmx0X3BhcmFtLnNpbmZvX3BwaWQpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImdldHNvY2tvcHQoU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0pICIKKwkJCSAibWlzbWF0Y2guIik7CisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tvcHQoU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0pIC0gIgorCQkgIm9uZS10by1vbmUgc3R5bGUgc29ja2V0Iik7CisKKwkvKiBEbyBhIGNvbm5lY3Qgb24gYSBUQ1Atc3R5bGUgc29ja2V0IGFuZCBlc3RhYmxpc2ggYW4gYXNzb2NpYXRpb24uICovCisJdGVzdF9jb25uZWN0KHRjcF9jbHRfc2ssICZ0Y3Bfc3ZyX2xvb3Auc2EsIHNpemVvZih0Y3Bfc3ZyX2xvb3ApKTsKKworCS8qIFNldCBkZWZhdWx0IHNlbmQgcGFyYW1ldGVycyBvZiBhbiBhc3NvY2lhdGlvbiBvbiB0aGUgY29ubmVjdGVkIAorCSAqIFRDUC1zdHlsZSBzb2NrZXQuCisJICovIAorCW1lbXNldCgmc2V0X3RjcF9hc3NvY19kZmx0X3BhcmFtLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCXNldF90Y3BfYXNzb2NfZGZsdF9wYXJhbS5zaW5mb19wcGlkID0gNDAwMDsKKwlzZXRfdGNwX2Fzc29jX2RmbHRfcGFyYW0uc2luZm9fYXNzb2NfaWQgPSAwOworCXRlc3Rfc2V0c29ja29wdCh0Y3BfY2x0X3NrLCBTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSwKKwkJCSZzZXRfdGNwX2Fzc29jX2RmbHRfcGFyYW0sCisJCQlzaXplb2Yoc2V0X3RjcF9hc3NvY19kZmx0X3BhcmFtKSk7CisKKwl0c3RfcmVzbShUUEFTUywgInNldHNvY2tvcHQoU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0pIC0gIgorCQkgIm9uZS10by1vbmUgc3R5bGUgYXNzb2MiKTsKKworCS8qIEdldCBkZWZhdWx0IHNlbmQgcGFyYW1ldGVycyBvZiBhbiBhc3NvY2lhdGlvbiBvbiB0aGUgY29ubmVjdGVkIAorCSAqIFRDUC1zdHlsZSBzb2NrZXQuCisJICovIAorCW1lbXNldCgmZ2V0X3RjcF9hc3NvY19kZmx0X3BhcmFtLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCW9wdGxlbiA9IHNpemVvZihnZXRfdGNwX2Fzc29jX2RmbHRfcGFyYW0pOworCXRlc3RfZ2V0c29ja29wdCh0Y3BfY2x0X3NrLCBTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSwKKwkJCSZnZXRfdGNwX2Fzc29jX2RmbHRfcGFyYW0sICZvcHRsZW4pOworCisJaWYgKHNldF90Y3BfYXNzb2NfZGZsdF9wYXJhbS5zaW5mb19wcGlkICE9CisJCQlnZXRfdGNwX2Fzc29jX2RmbHRfcGFyYW0uc2luZm9fcHBpZCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdChTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSkgIgorCQkJICJtaXNtYXRjaC4iKTsKKworCS8qIEdldCBkZWZhdWx0IHNlbmQgcGFyYW1ldGVycyBvbiB0aGUgY29ubmVjdGVkIFRDUC1zdHlsZSBzb2NrZXQuICAqLyAKKwltZW1zZXQoJmdldF90Y3Bfc2tfZGZsdF9wYXJhbSwgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlvcHRsZW4gPSBzaXplb2YoZ2V0X3RjcF9za19kZmx0X3BhcmFtKTsKKwl0ZXN0X2dldHNvY2tvcHQodGNwX2NsdF9zaywgU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0sCisJCQkmZ2V0X3RjcF9za19kZmx0X3BhcmFtLCAmb3B0bGVuKTsKKworCS8qIFZlcmlmeSB0aGF0IHRoZSBnZXQgcGFyYW1ldGVycyByZXR1cm5lZCBtYXRjaGVzIHRoZSBzZXQgcGFyYW0KKwkgKiBzZXQgZm9yIHRoZSBhc3NvY2lhdGlvbiwgbm90IHRoZSBzb2NrZXQtd2lkZSBwYXJhbS4KKwkgKi8gCisJaWYgKChnZXRfdGNwX3NrX2RmbHRfcGFyYW0uc2luZm9fcHBpZCA9PQorCQkJc2V0X3RjcF9za19kZmx0X3BhcmFtLnNpbmZvX3BwaWQpIHx8CisJICAgIChnZXRfdGNwX3NrX2RmbHRfcGFyYW0uc2luZm9fcHBpZCAhPQorCSAgICAJCXNldF90Y3BfYXNzb2NfZGZsdF9wYXJhbS5zaW5mb19wcGlkKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdChTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSkgIgorCQkJICJtaXNtYXRjaC4iKTsKKworCS8qIEdldCBkZWZhdWx0IHNlbmQgcGFyYW1ldGVycyBvbiB0aGUgbGlzdGVuaW5nIFRDUC1zdHlsZSBzb2NrZXQuICAqLyAKKwltZW1zZXQoJmdldF90Y3Bfc2tfZGZsdF9wYXJhbSwgMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlvcHRsZW4gPSBzaXplb2YoZ2V0X3RjcF9za19kZmx0X3BhcmFtKTsKKwl0ZXN0X2dldHNvY2tvcHQodGNwX3N2cl9zaywgU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0sCisJCQkmZ2V0X3RjcF9za19kZmx0X3BhcmFtLCAmb3B0bGVuKTsKKworCS8qIFZlcmlmeSB0aGF0IHRoZSBnZXQgcGFyYW1ldGVycyByZXR1cm5lZCBtYXRjaGVzIHRoZSBzb2NrZXQtd2lkZSAKKwkgKiBzZXQgcGFyYW0uCisJICovCisJaWYgKGdldF90Y3Bfc2tfZGZsdF9wYXJhbS5zaW5mb19wcGlkICE9CisJCQlzZXRfdGNwX3NrX2RmbHRfcGFyYW0uc2luZm9fcHBpZCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdChTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSkgIgorCQkJICJtaXNtYXRjaC4iKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiZ2V0c29ja29wdChTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSkgLSAiCisJCSAib25lLXRvLW9uZSBzdHlsZSBhc3NvYyIpOworCisJYWNjZXB0X3NrID0gdGVzdF9hY2NlcHQodGNwX3N2cl9zaywgTlVMTCwgJmFkZHJsZW4pOyAKKworCS8qIEdldCBkZWZhdWx0IHNlbmQgcGFyYW1ldGVycyBvZiBhbiBhc3NvY2lhdGlvbiBvbiB0aGUgYWNjZXB0ZWQgCisJICogVENQLXN0eWxlIHNvY2tldC4KKwkgKi8gCisJbWVtc2V0KCZnZXRfYWNjZXB0X2Fzc29jX2RmbHRfcGFyYW0sIDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJb3B0bGVuID0gc2l6ZW9mKGdldF9hY2NlcHRfYXNzb2NfZGZsdF9wYXJhbSk7CisJdGVzdF9nZXRzb2Nrb3B0KGFjY2VwdF9zaywgU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU0sCisJCQkmZ2V0X2FjY2VwdF9hc3NvY19kZmx0X3BhcmFtLCAmb3B0bGVuKTsKKworCWVycm9yID0gMDsKKworCS8qIFZlcmlmeSB0aGF0IHRoZSBnZXQgcGFyYW1ldGVycyByZXR1cm5lZCBtYXRjaGVzIHRoZSBzb2NrZXQtd2lkZSAKKwkgKiBzZXQgcGFyYW0uCisJICovCisJaWYgKGdldF90Y3Bfc2tfZGZsdF9wYXJhbS5zaW5mb19wcGlkICE9CisJCQlzZXRfdGNwX3NrX2RmbHRfcGFyYW0uc2luZm9fcHBpZCkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdChTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSkgIgorCQkJICJtaXNtYXRjaC4iKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiZ2V0c29ja29wdChTQ1RQX0RFRkFVTFRfU0VORF9QQVJBTSkgLSAiCisJCSAib25lLXRvLW9uZSBzdHlsZSBhY2NlcHRlZCBzb2NrZXQiKTsKKworCS8qIFRFU1QgIzc6IFNDVFBfR0VUX1BFRVJfQUREUl9JTkZPIHNvY2tldCBvcHRpb24uICovCisJLyogVHJ5IDAgYXNzb2NpZCBhbmQgMCBhZGRyICovCisJbWVtc2V0KCZwaW5mbywgMCwgc2l6ZW9mKHBpbmZvKSk7CisJb3B0bGVuID0gc2l6ZW9mKHBpbmZvKTsKKwllcnJvciA9IGdldHNvY2tvcHQodWRwX2NsdF9zaywgU09MX1NDVFAsIFNDVFBfR0VUX1BFRVJfQUREUl9JTkZPLAorCQkJICAgJnBpbmZvLCAmb3B0bGVuKTsJCQkgICAKKwlpZiAoKC0xICE9IGVycm9yKSB8fCAoRUlOVkFMICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdChTQ1RQX0dFVF9QRUVSX0FERFJfSU5GTykgIgorCQkJICJudWxsIGFzc29jaWQsIG51bGwgYWRkciBlcnJvcjolZCwgZXJybm86JWRcbiIsCisJCQllcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRzb2Nrb3B0KFNDVFBfR0VUX1BFRVJfQUREUl9JTkZPKSAtICIKKwkJICJudWxsIGFzc29jaWQgYW5kIG51bGwgYWRkciIpOworCisJLyogVHJ5IHZhbGlkIGFzc29jaWQsIGJ1dCAwIGFkZHIgKi8KKwltZW1zZXQoJnBpbmZvLCAwLCBzaXplb2YocGluZm8pKTsKKwlvcHRsZW4gPSBzaXplb2YocGluZm8pOworCXBpbmZvLnNwaW5mb19hc3NvY19pZCA9IHVkcF9jbHRfYXNzb2NpZDsKKwllcnJvciA9IGdldHNvY2tvcHQodWRwX2NsdF9zaywgU09MX1NDVFAsIFNDVFBfR0VUX1BFRVJfQUREUl9JTkZPLAorCQkJICAgJnBpbmZvLCAmb3B0bGVuKTsJCQkgICAKKwlpZiAoKC0xICE9IGVycm9yKSB8fCAoRUlOVkFMICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdChTQ1RQX0dFVF9QRUVSX0FERFJfSU5GTykgIgorCQkJICJ2YWxpZCBhc3NvY2lkLCBudWxsIGFkZHIgZXJyb3I6JWQsIGVycm5vOiVkXG4iLAorCQkJZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiZ2V0c29ja29wdChTQ1RQX0dFVF9QRUVSX0FERFJfSU5GTykgLSAiCisJCSAidmFsaWQgYXNzb2NpZCBhbmQgbnVsbCBhZGRyIik7CisKKwkvKiBUcnkgdmFsaWQgYXNzb2NpZCwgaW52YWxpZCBhZGRyICovCisJbWVtc2V0KCZwaW5mbywgMCwgc2l6ZW9mKHBpbmZvKSk7CisJb3B0bGVuID0gc2l6ZW9mKHBpbmZvKTsKKwlwaW5mby5zcGluZm9fYXNzb2NfaWQgPSB1ZHBfY2x0X2Fzc29jaWQ7CisJbWVtY3B5KCZwaW5mby5zcGluZm9fYWRkcmVzcywgJnVkcF9jbHRfbG9vcCwgc2l6ZW9mKHVkcF9jbHRfbG9vcCkpOworCWVycm9yID0gZ2V0c29ja29wdCh1ZHBfY2x0X3NrLCBTT0xfU0NUUCwgU0NUUF9HRVRfUEVFUl9BRERSX0lORk8sCisJCQkgICAmcGluZm8sICZvcHRsZW4pOwkJCSAgIAorCWlmICgoLTEgIT0gZXJyb3IpIHx8IChFSU5WQUwgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJnZXRzb2Nrb3B0KFNDVFBfR0VUX1BFRVJfQUREUl9JTkZPKSAiCisJCQkgInZhbGlkIGFzc29jaWQsIGludmFsaWQgYWRkciBlcnJvcjolZCwgZXJybm86JWRcbiIsCisJCQllcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJnZXRzb2Nrb3B0KFNDVFBfR0VUX1BFRVJfQUREUl9JTkZPKSAtICIKKwkJICJ2YWxpZCBhc3NvY2lkIGFuZCBpbnZhbGlkIGFkZHIiKTsKKworCS8qIFRyeSB2YWxpZCBhc3NvY2lkLCB2YWxpZCBhZGRyICovCisJbWVtc2V0KCZwaW5mbywgMCwgc2l6ZW9mKHBpbmZvKSk7CisJb3B0bGVuID0gc2l6ZW9mKHBpbmZvKTsKKwlwaW5mby5zcGluZm9fYXNzb2NfaWQgPSB1ZHBfY2x0X2Fzc29jaWQ7CisJbWVtY3B5KCZwaW5mby5zcGluZm9fYWRkcmVzcywgJnVkcF9zdnJfbG9vcCwgc2l6ZW9mKHVkcF9zdnJfbG9vcCkpOworCXRlc3RfZ2V0c29ja29wdCh1ZHBfY2x0X3NrLCBTQ1RQX0dFVF9QRUVSX0FERFJfSU5GTywgJnBpbmZvLCAmb3B0bGVuKTsJCQkgICAKKworCXRzdF9yZXNtKFRQQVNTLCAiZ2V0c29ja29wdChTQ1RQX0dFVF9QRUVSX0FERFJfSU5GTykgLSAiCisJCSAidmFsaWQgYXNzb2NpZCBhbmQgdmFsaWQgYWRkciIpOworCisJLyogVHJ5IHZhbGlkIGFkZHIsIHBlZWxlZCBvZmYgc29ja2V0ICovCisJbWVtc2V0KCZwaW5mbywgMCwgc2l6ZW9mKHBpbmZvKSk7CisJb3B0bGVuID0gc2l6ZW9mKHBpbmZvKTsKKwlwaW5mby5zcGluZm9fYXNzb2NfaWQgPSAwOworCW1lbWNweSgmcGluZm8uc3BpbmZvX2FkZHJlc3MsICZ1ZHBfY2x0X2xvb3AsIHNpemVvZih1ZHBfY2x0X2xvb3ApKTsKKwl0ZXN0X2dldHNvY2tvcHQocGVlbG9mZl9zaywgU0NUUF9HRVRfUEVFUl9BRERSX0lORk8sICZwaW5mbywgJm9wdGxlbik7CQkJICAgCisKKwl0c3RfcmVzbShUUEFTUywgImdldHNvY2tvcHQoU0NUUF9HRVRfUEVFUl9BRERSX0lORk8pIC0gIgorCQkgInZhbGlkIGFzc29jaWQgYW5kIHZhbGlkIGFkZHIgcGVlbGVkIG9mZiBzb2NrZXQiKTsKKworCS8qIFRyeSB2YWxpZCBhZGRyLCBUQ1Atc3R5bGUgYWNjZXB0IHNvY2tldCAqLworCW1lbXNldCgmcGluZm8sIDAsIHNpemVvZihwaW5mbykpOworCW9wdGxlbiA9IHNpemVvZihwaW5mbyk7CisJcGluZm8uc3BpbmZvX2Fzc29jX2lkID0gMDsKKwltZW1jcHkoJnBpbmZvLnNwaW5mb19hZGRyZXNzLCAmdGNwX2NsdF9sb29wLCBzaXplb2YodGNwX2NsdF9sb29wKSk7CisJZXJyb3IgPSB0ZXN0X2dldHNvY2tvcHQoYWNjZXB0X3NrLCBTQ1RQX0dFVF9QRUVSX0FERFJfSU5GTywgJnBpbmZvLAorCQkJCSZvcHRsZW4pOwkJCSAgIAorCisJdHN0X3Jlc20oVFBBU1MsICJnZXRzb2Nrb3B0KFNDVFBfR0VUX1BFRVJfQUREUl9JTkZPKSAtICIKKwkJICJ2YWxpZCBhc3NvY2lkIGFuZCB2YWxpZCBhZGRyIGFjY2VwdGVkIHNvY2tldCIpOworCisJY2xvc2UodWRwX3N2cl9zayk7CisJY2xvc2UodWRwX2NsdF9zayk7CisJY2xvc2UodGNwX3N2cl9zayk7CisJY2xvc2UodGNwX2NsdF9zayk7CisJY2xvc2UoYWNjZXB0X3NrKTsKKwljbG9zZShwZWVsb2ZmX3NrKTsKKworICAgICAgICAvKiBJbmRpY2F0ZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24uICAqLworICAgICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfdGNwX3N0eWxlLmMgYi9zcmMvZnVuY190ZXN0cy90ZXN0X3RjcF9zdHlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZjgzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZnVuY190ZXN0cy90ZXN0X3RjcF9zdHlsZS5jCkBAIC0wLDAgKzEsNDYzIEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMworICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgTW90b3JvbGEsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgU3JpZGhhciBTYW11ZHJhbGEJCTxzcmlAdXMuaWJtLmNvbT4KKyAqLworCisvKiBUaGlzIGlzIGEga2VybmVsIHRlc3QgdG8gdmVyaWZ5IHRoZSBUQ1Atc3R5bGUgc29ja2V0IGludGVyZmFjZXMuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxzeXMvcG9sbC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHNjdHB1dGlsLmg+CisKK2NoYXIgKlRDSUQgPSBfX0ZJTEVfXzsKK2ludCBUU1RfVE9UQUwgPSAyMjsKK2ludCBUU1RfQ05UID0gMDsKKworI2RlZmluZSBNQVhfQ0xJRU5UUyAxMAorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgY2x0X3NrW01BWF9DTElFTlRTXSwgYWNjZXB0X3NrW01BWF9DTElFTlRTXTsKKwlpbnQgbGlzdGVuX3NrLCBjbHQyX3NrLCBhY2NlcHQyX3NrOworCXNvY2thZGRyX3N0b3JhZ2VfdCBjbHRfbG9vcFtNQVhfQ0xJRU5UU107CisJc29ja2FkZHJfc3RvcmFnZV90IHN2cl9sb29wLCBhY2NlcHRfbG9vcCwgY2x0Ml9sb29wOworCXNvY2tsZW5fdCBhZGRybGVuOworCWludCBlcnJvciwgaTsKKyAgICAgICAgY2hhciAqbWVzc2FnZSA9ICJoZWxsbywgd29ybGQhXG4iOworCWNoYXIgbXNnYnVmWzEwMF07CisJaW50IHBmX2NsYXNzOworCXN0cnVjdCBwb2xsZmQgcG9sbF9mZDsKKwlmZF9zZXQgc2V0OworCXN0cnVjdCBtc2doZHIgb3V0bWVzc2FnZTsKKwljaGFyIG91dGNtc2dbQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpXTsKKwlzdHJ1Y3QgaW92ZWMgb3V0X2lvdjsKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwlzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbzsKKwlzdHJ1Y3QgbXNnaGRyIGlubWVzc2FnZTsKKwljaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzY3RwX2Ntc2dfZGF0YV90KSldOworCWNoYXIgKmJpZ19idWZmZXI7CisJc3RydWN0IGlvdmVjIGlvdjsKKworICAgICAgICAvKiBSYXRoZXIgdGhhbiBmZmx1c2goKSB0aHJvdWdob3V0IHRoZSBjb2RlLCBzZXQgc3Rkb3V0IHRvIAorCSAqIGJlIHVuYnVmZmVyZWQuICAKKwkgKi8gCisJc2V0dmJ1ZihzdGRvdXQsIE5VTEwsIF9JT05CRiwgMCk7IAorCisJLyogSW5pdGlhbGl6ZSB0aGUgc2VydmVyIGFuZCBjbGllbnQgYWRkcmVzc2VzLiAqLyAKKyNpZiBURVNUX1Y2CisJcGZfY2xhc3MgPSBQRl9JTkVUNjsKKyAgICAgICAgc3ZyX2xvb3AudjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgICAgICAgc3ZyX2xvb3AudjYuc2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjazsKKyAgICAgICAgc3ZyX2xvb3AudjYuc2luNl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykgeworICAgICAgICAJY2x0X2xvb3BbaV0udjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgICAgICAgCWNsdF9sb29wW2ldLnY2LnNpbjZfYWRkciA9IGluNmFkZHJfbG9vcGJhY2s7CisgICAgICAgIAljbHRfbG9vcFtpXS52Ni5zaW42X3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzIgKyBpKTsKKwl9CisgICAgICAgIGNsdDJfbG9vcC52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICBjbHQyX2xvb3AudjYuc2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjazsKKyAgICAgICAgY2x0Ml9sb29wLnY2LnNpbjZfcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMiArIGkpOworI2Vsc2UKKwlwZl9jbGFzcyA9IFBGX0lORVQ7CisJc3ZyX2xvb3AudjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc3ZyX2xvb3AudjQuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKwlzdnJfbG9vcC52NC5zaW5fcG9ydCA9IGh0b25zKFNDVFBfVEVTVFBPUlRfMSk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9DTElFTlRTOyBpKyspIHsKKwkJY2x0X2xvb3BbaV0udjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCWNsdF9sb29wW2ldLnY0LnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisJCWNsdF9sb29wW2ldLnY0LnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8yICsgaSk7CisJfQorCWNsdDJfbG9vcC52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwljbHQyX2xvb3AudjQuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKwljbHQyX2xvb3AudjQuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzIgKyBpKTsKKyNlbmRpZgorCisJLyogQ3JlYXRlIGFuZCBiaW5kIHRoZSBsaXN0ZW5pbmcgc2VydmVyIHNvY2tldC4gICovCisgICAgICAgIGxpc3Rlbl9zayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKwl0ZXN0X2JpbmQobGlzdGVuX3NrLCAmc3ZyX2xvb3Auc2EsIHNpemVvZihzdnJfbG9vcCkpOworCisJLyogTWFyayBsaXN0ZW5fc2sgYXMgYmVpbmcgYWJsZSB0byBhY2NlcHQgbmV3IGFzc29jaWF0aW9ucy4gICovCisJdGVzdF9saXN0ZW4obGlzdGVuX3NrLCBNQVhfQ0xJRU5UUy0xKTsKKworCS8qIENyZWF0ZSBhbmQgYmluZCB0aGUgY2xpZW50IHNvY2tldHMuICAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKSB7CisJCWNsdF9za1tpXSA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKwkJdGVzdF9iaW5kKGNsdF9za1tpXSwgJmNsdF9sb29wW2ldLnNhLCBzaXplb2YoY2x0X2xvb3BbaV0pKTsKKwl9CisJY2x0Ml9zayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKwl0ZXN0X2JpbmQoY2x0Ml9zaywgJmNsdDJfbG9vcC5zYSwgc2l6ZW9mKGNsdDJfbG9vcCkpOworCisJYWRkcmxlbiA9IHNpemVvZihhY2NlcHRfbG9vcCk7CisJLyogVHJ5IHRvIGRvIGFjY2VwdCBvbiBhIG5vbi1saXN0ZW5pbmcgc29ja2V0LiBJdCBzaG91bGQgZmFpbC4gKi8KKwllcnJvciA9IGFjY2VwdChjbHRfc2tbMF0sICZhY2NlcHRfbG9vcC5zYSwgJmFkZHJsZW4pOworCWlmICgoLTEgIT0gZXJyb3IpICYmIChFSU5WQUwgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJhY2NlcHQgb24gbm9uLWxpc3RlbmluZyBzb2NrZXQgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJhY2NlcHQgb24gbm9uLWxpc3RlbmluZyBzb2NrZXQiKTsKKworCS8qIFRyeSB0byBkbyBhIGNvbm5lY3QgZnJvbSBhIGxpc3RlbmluZyBzb2NrZXQuIEl0IHNob3VsZCBmYWlsLiAqLworCWVycm9yID0gY29ubmVjdChsaXN0ZW5fc2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikmY2x0X2xvb3BbMF0sCisJCQlzaXplb2YoY2x0X2xvb3BbMF0pKTsKKwlpZiAoKC0xICE9IGVycm9yKSAmJiAoRUlTQ09OTiAhPSBlcnJubykpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImNvbm5lY3QgdG8gbm9uLWxpc3RlbmluZyBzb2NrZXQgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJjb25uZWN0IHRvIG5vbi1saXN0ZW5pbmcgc29ja2V0Iik7CisKKwkvKiBEbyBhIGJsb2NraW5nIGNvbm5lY3QgZnJvbSBjbHRfc2sncyB0byBsaXN0ZW5fc2sgKi8gICAgICAKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykKKwkJdGVzdF9jb25uZWN0KGNsdF9za1tpXSwgJnN2cl9sb29wLnNhLCBzaXplb2Yoc3ZyX2xvb3ApKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiY29ubmVjdCB0byBsaXN0ZW5pbmcgc29ja2V0Iik7CisKKwkvKiBWZXJpZnkgdGhhdCBubyBtb3JlIGNvbm5lY3QncyBjYW4gYmUgZG9uZSBhZnRlciB0aGUgYWNjZXB0cQorCSAqIGJhY2tsb2cgaGFzIHJlYWNoZWQgdGhlIG1heCB2YWx1ZS4KKwkgKi8KKwllcnJvciA9IGNvbm5lY3QoY2x0Ml9zaywgJnN2cl9sb29wLnNhLCBzaXplb2Yoc3ZyX2xvb3ApKTsKKwlpZiAoKC0xICE9IGVycm9yKSAmJiAoRUNPTk5SRUZVU0VEICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiY29ubmVjdCBhZnRlciBtYXggYmFja2xvZyAiCisJCQkgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImNvbm5lY3QgYWZ0ZXIgbWF4IGJhY2tsb2ciKTsKKworCS8qIEV4dHJhY3QgdGhlIGFzc29jaWF0aW9ucyBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldCBhcyBuZXcgc29ja2V0cy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykgeworCQlwb2xsX2ZkLmZkID0gbGlzdGVuX3NrOworCQlwb2xsX2ZkLmV2ZW50cyA9IFBPTExJTjsKKwkJcG9sbF9mZC5yZXZlbnRzID0gMDsKKwkJZXJyb3IgPSBwb2xsKCZwb2xsX2ZkLCAxLCAtMSk7CisJCWlmICgoMSAhPSBlcnJvcikgJiYgKDEgIT0gcG9sbF9mZC5yZXZlbnRzKSkKKwkJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIlVuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlICIKKwkJCQkgIndpdGggcG9sbCwgZXJyb3I6JWQgZXJybm86JWQsIHJldmVudHM6JWQiLAorCQkJCSBlcnJvciwgZXJybm8sIHBvbGxfZmQucmV2ZW50cyk7CisKKwkJYWRkcmxlbiA9IHNpemVvZihhY2NlcHRfbG9vcCk7CisJCWFjY2VwdF9za1tpXSA9IHRlc3RfYWNjZXB0KGxpc3Rlbl9zaywgJmFjY2VwdF9sb29wLnNhLAorCQkJCQkgICAmYWRkcmxlbik7IAorCX0KKworCXRzdF9yZXNtKFRQQVNTLCAiYWNjZXB0IGZyb20gbGlzdGVuaW5nIHNvY2tldCIpOworCisJLyogVHJ5IHRvIGRvIGEgY29ubmVjdCBvbiBhbiBlc3RhYmxpc2hlZCBzb2NrZXQuIEl0IHNob3VsZCBmYWlsLiAqLworCWVycm9yID0gY29ubmVjdChhY2NlcHRfc2tbMF0sICZjbHRfbG9vcFswXS5zYSwgc2l6ZW9mKGNsdF9sb29wWzBdKSk7CisJaWYgKCgtMSAhPSBlcnJvcikgfHwgKEVJU0NPTk4gIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJjb25uZWN0IG9uIGFuIGVzdGFibGlzaGVkIHNvY2tldCAiCisJCQkgImVycm9yOiVkIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiY29ubmVjdCBvbiBhbiBlc3RhYmxpc2hlZCBzb2NrZXQiKTsKKworCS8qIFRyeSB0byBkbyBhY2NlcHQgb24gYW4gZXN0YWJsaXNoZWQgc29ja2V0LiBJdCBzaG91bGQgZmFpbC4gKi8KKwllcnJvciA9IGFjY2VwdChhY2NlcHRfc2tbMF0sICZhY2NlcHRfbG9vcC5zYSwgJmFkZHJsZW4pOworCWlmICgoLTEgIT0gZXJyb3IpICYmIChFSU5WQUwgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJhY2NlcHQgb24gYW4gZXN0YWJsaXNoZWQgc29ja2V0ICIKKwkJCSAiZXJyb3I6JWQgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJZXJyb3IgPSBhY2NlcHQoY2x0X3NrWzBdLCAmYWNjZXB0X2xvb3Auc2EsICZhZGRybGVuKTsKKwlpZiAoKC0xICE9IGVycm9yKSAmJiAoRUlOVkFMICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiYWNjZXB0IG9uIGFuIGVzdGFibGlzaGVkIHNvY2tldCAiCisJCQkgImZhaWx1cmU6IGVycm9yOiVkIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiYWNjZXB0IG9uIGFuIGVzdGFibGlzaGVkIHNvY2tldCIpOworCisJLyogU2VuZCBhbmQgcmVjZWl2ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgY2xpZW50IHNvY2tldHMgdG8gdGhlIGFjY2VwdGVkCisJICogc29ja2V0cy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykgeworCQl0ZXN0X3NlbmQoY2x0X3NrW2ldLCBtZXNzYWdlLCBzdHJsZW4obWVzc2FnZSksIDApOworCQl0ZXN0X3JlY3YoYWNjZXB0X3NrW2ldLCBtc2didWYsIDEwMCwgMCk7CisJfQorCisJdHN0X3Jlc20oVFBBU1MsICJjbGllbnQgc29ja2V0cyAtPiBhY2NlcHRlZCBzb2NrZXRzIik7CisKKwkvKiBTZW5kIGFuZCByZWNlaXZlIGEgbWVzc2FnZSBmcm9tIHRoZSBhY2NlcHRlZCBzb2NrZXRzIHRvIHRoZSBjbGllbnQKKwkgKiBzb2NrZXRzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKSB7CisJCXRlc3Rfc2VuZChhY2NlcHRfc2tbaV0sIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSwgMCk7CisJCXRlc3RfcmVjdihjbHRfc2tbaV0sIG1zZ2J1ZiwgMTAwLCAwKTsKKwl9CisKKwl0c3RfcmVzbShUUEFTUywgImFjY2VwdGVkIHNvY2tldHMgLT4gY2xpZW50IHNvY2tldHMiKTsKKworCS8qIFNlbmRpbmcgYSBtZXNzYWdlIG9uIGEgbGlzdGVuaW5nIHNvY2tldCBzaG91bGQgZmFpbC4gKi8KKwllcnJvciA9IHNlbmQobGlzdGVuX3NrLCBtZXNzYWdlLCBzdHJsZW4obWVzc2FnZSksIE1TR19OT1NJR05BTCk7CisJaWYgKCgtMSAhPSBlcnJvcikgfHwgKEVQSVBFICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2VuZCBvbiBhIGxpc3RlbmluZyBzb2NrZXQgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kIG9uIGEgbGlzdGVuaW5nIHNvY2tldCIpOworCisJLyogVHJ5aW5nIHRvIHJlY2VpdmUgYSBtZXNzYWdlIG9uIGEgbGlzdGVuaW5nIHNvY2tldCBzaG91bGQgZmFpbC4gKi8KKwllcnJvciA9IHJlY3YobGlzdGVuX3NrLCBtc2didWYsIDEwMCwgMCk7CisJaWYgKCgtMSAhPSBlcnJvcikgfHwgKEVOT1RDT05OICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicmVjdiBvbiBhIGxpc3RlbmluZyBzb2NrZXQgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJyZWN2IG9uIGEgbGlzdGVuaW5nIHNvY2tldCIpOworCisJLyogVEVTVENBU0VTIGZvciBzaHV0ZG93bigpICovCisJZXJybm8gPSAwOworCXRlc3Rfc2VuZChhY2NlcHRfc2tbMF0sIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSwgMCk7CisKKwkvKiBFbmFibGUgQVNTT0NfQ0hBTkdFIGFuZCBTTkRSQ1ZJTkZPIG5vdGlmaWNhdGlvbnMuICovCisJdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKGNsdF9za1swXSk7CisKKwkvKiBEbyBhIFNIVVRfV1Igb24gY2x0X3NrWzBdIHRvIGRpc2FibGUgYW55IG5ldyBzZW5kcy4gKi8KKwl0ZXN0X3NodXRkb3duKGNsdF9za1swXSwgU0hVVF9XUik7CisKKwkvKiBSZWFkaW5nIG9uIGEgc29ja2V0IHRoYXQgaGFzIHJlY2VpdmVkIFNIVVRET1dOIHNob3VsZCByZXR1cm4gMCAKKwkgKiBpbmRpY2F0aW5nIEVPRi4KKwkgKi8KKwllcnJvciA9IHJlY3YoYWNjZXB0X3NrWzBdLCBtc2didWYsIDEwMCwgMCk7CisJaWYgKCgwICE9IGVycm9yKSB8fCAoMCAhPSBlcnJubykpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInJlY3Ygb24gYSBTSFVURE9XTiByZWNlaXZlZCBzb2NrZXQgIgorCQkJICJlcnJvcjolZCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInJlY3Ygb24gYSBTSFVURE9XTiByZWNlaXZlZCBzb2NrZXQiKTsKKworCS8qIFJlYWQgdGhlIHBlbmRpbmcgbWVzc2FnZSBvbiBjbHRfc2tbMF0gdGhhdCB3YXMgcmVjZWl2ZWQgYmVmb3JlCisJICogU0hVVERPV04gY2FsbC4KKwkgKi8gIAorCXRlc3RfcmVjdihjbHRfc2tbMF0sIG1zZ2J1ZiwgMTAwLCAwKTsKKworCS8qIEluaXRpYWxpemUgaW5tZXNzYWdlIGZvciBhbGwgcmVjZWl2ZXMuICovCisJYmlnX2J1ZmZlciA9IHRlc3RfbWFsbG9jKFJFQUxMWV9CSUcpOworCW1lbXNldCgmaW5tZXNzYWdlLCAwLCBzaXplb2YoaW5tZXNzYWdlKSk7CQorCWlvdi5pb3ZfYmFzZSA9IGJpZ19idWZmZXI7CisJaW92Lmlvdl9sZW4gPSBSRUFMTFlfQklHOworCWlubWVzc2FnZS5tc2dfaW92ID0gJmlvdjsKKwlpbm1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisJaW5tZXNzYWdlLm1zZ19jb250cm9sID0gaW5jbXNnOworCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCisJLyogUmVjZWl2ZSB0aGUgU0hVVERPV05fQ09NUCBub3RpZmljYXRpb24gYXMgdGhleSBhcmUgZW5hYmxlZC4gKi8KKwllcnJvciA9IHRlc3RfcmVjdm1zZyhjbHRfc2tbMF0sICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9TSFVURE9XTl9DT01QKTsKKworCXRzdF9yZXNtKFRQQVNTLCAicmVjdiBTSFVURE9XTl9DT01QIG5vdGlmaWNhdGlvbiBvbiBhIFNIVVRfV1Igc29ja2V0Iik7CisKKwkvKiBObyBtb3JlIG1lc3NhZ2VzIGFuZCB0aGUgYXNzb2NpYXRpb24gaXMgU0hVVERPV04sIHNob3VsZCBmYWlsLiAqLworCWVycm9yID0gcmVjdihjbHRfc2tbMF0sIG1zZ2J1ZiwgMTAwLCAwKTsKKwlpZiAoKC0xICE9IGVycm9yKSB8fCAoRU5PVENPTk4gIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJyZWN2IG9uIGEgU0hVVERPV04gc2VudCBzb2NrZXQgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJyZWN2IG9uIGEgU0hVVERPV04gc2VudCBzb2NrZXQiKTsKKworCWVycm5vID0gMDsKKworCS8qIERvIGEgU0hVVF9SRCBvbiBjbHRfc2tbMV0gdG8gZGlzYWJsZSBhbnkgbmV3IHJlY2VpdmVzLiAqLworCXRlc3Rfc2h1dGRvd24oY2x0X3NrWzFdLCBTSFVUX1JEKTsKKworCWVycm9yID0gcmVjdihjbHRfc2tbMV0sIG1zZ2J1ZiwgMTAwLCAwKTsKKwlpZiAoKDAgIT0gZXJyb3IpIHx8ICgwICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicmVjdiBvbiBhIFNIVVRfUkQgc29ja2V0ICIKKwkJCSAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCS8qIFNlbmRpbmcgYSBtZXNzYWdlIG9uIFNIVVRfUkQgc29ja2V0LiAqLworCXRlc3Rfc2VuZChjbHRfc2tbMV0sIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSwgMCk7CisKKwkvKiBSZWNlaXZlIHRoZSBtZXNzYWdlIHNlbnQgb24gU0hVVF9SRCBzb2NrZXQuICovCisJdGVzdF9yZWN2KGFjY2VwdF9za1sxXSwgbXNnYnVmLCAxMDAsIDApOworCisJLyogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIFNIVVRfUkQgc29ja2V0LiAqLworCXRlc3Rfc2VuZChhY2NlcHRfc2tbMV0sIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSwgMCk7CisKKwkvKiBXZSBzaG91bGQgbm90IHJlY2VpdmUgdGhlIG1lc3NhZ2UgYXMgdGhlIHNvY2tldCBpcyBTSFVUX1JEICovIAorCWVycm9yID0gcmVjdihjbHRfc2tbMV0sIG1zZ2J1ZiwgMTAwLCAwKTsKKwlpZiAoKDAgIT0gZXJyb3IpIHx8ICgwICE9IGVycm5vKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicmVjdiBvbiBhIFNIVVRfUkQgc29ja2V0ICIKKwkJCSAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAicmVjdiBvbiBhIFNIVVRfUkQgc29ja2V0Iik7CisKKwkvKiBEbyBhIFNIVVRfUkRXUiBvbiBjbHRfc2tbMl0gdG8gZGlzYWJsZSBhbnkgbmV3IHNlbmRzL3JlY2VpdmVzLiAqLworCXRlc3Rfc2h1dGRvd24oY2x0X3NrWzJdLCBTSFVUX1JEV1IpOworCisJZXJyb3IgPSByZWN2KGFjY2VwdF9za1syXSwgbXNnYnVmLCAxMDAsIDApOworCWlmICgoMCAhPSBlcnJvcikgfHwgKDAgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJyZWN2IG9uIGEgU0hVVF9SRFdSIHNvY2tldCAiCisJCQkgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwllcnJvciA9IHJlY3YoY2x0X3NrWzJdLCBtc2didWYsIDEwMCwgMCk7CisJaWYgKCgwICE9IGVycm9yKSB8fCAoMCAhPSBlcnJubykpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInJlY3Ygb24gYSBTSFVUX1JEV1Igc29ja2V0ICIKKwkJCSAiZXJyb3I6JWQsIGVycm5vOiVkIiwgZXJyb3IsIGVycm5vKTsKKworCXRzdF9yZXNtKFRQQVNTLCAicmVjdiBvbiBhIFNIVVRfUkRXUiBzb2NrZXQiKTsKKworCWVycm9yID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKQorCQljbG9zZShjbHRfc2tbaV0pOworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKQorCQljbG9zZShhY2NlcHRfc2tbaV0pOworCisJLyogVGVzdCBjYXNlIHRvIHZlcmlmeSBhY2NlcHQgb2YgYSBDTE9TRUQgYXNzb2NpYXRpb24uICovCisJLyogRG8gYSBjb25uZWN0LCBzZW5kIGFuZCBhIGNsb3NlIHRvIEVTVEFCTElTSCBhbmQgQ0xPU0UgYW4KKwkgKiBhc3NvY2lhdGlvbiBvbiB0aGUgbGlzdGVuaW5nIHNvY2tldC4KKwkgKi8KKwl0ZXN0X2Nvbm5lY3QoY2x0Ml9zaywgJnN2cl9sb29wLnNhLCBzaXplb2Yoc3ZyX2xvb3ApKTsKKworCXRlc3Rfc2VuZChjbHQyX3NrLCBtZXNzYWdlLCBzdHJsZW4obWVzc2FnZSksIDApOworCisJY2xvc2UoY2x0Ml9zayk7CisKKwlGRF9aRVJPKCZzZXQpOworCUZEX1NFVChsaXN0ZW5fc2ssICZzZXQpOworCisJZXJyb3IgPSBzZWxlY3QobGlzdGVuX3NrICsgMSwgJnNldCwgTlVMTCwgTlVMTCwgTlVMTCk7CisJaWYgKDEgIT0gZXJyb3IpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbGVjdCBlcnJvcjolZCwgIgorCQkJICJlcnJubzogJWQiLCBlcnJvciwgZXJybm8pOworCisJLyogTm93IGFjY2VwdCB0aGUgQ0xPU0VEIGFzc29jaWF0aW9uIHdhaXRpbmcgb24gdGhlIGxpc3RlbmluZyAKKwkgKiBzb2NrZXQuCisJICovICAKKwlhY2NlcHQyX3NrID0gdGVzdF9hY2NlcHQobGlzdGVuX3NrLCAmYWNjZXB0X2xvb3Auc2EsICZhZGRybGVuKTsgCisKKwkvKiBSZWNlaXZlIHRoZSBtZXNzYWdlIHNlbnQgYmVmb3JlIGRvaW5nIGEgY2xvc2UuICovCisJdGVzdF9yZWN2KGFjY2VwdDJfc2ssIG1zZ2J1ZiwgMTAwLCAwKTsKKworCS8qIFJlY2VpdmUgRU9GIGluZGljYXRpb24gYXMgdGhlcmUgYXJlIG5vIG1vcmUgbWVzc2FnZXMgYW5kIHRoZQorCSAqIHNvY2tldCBpcyBTSFVURE9XTi4KKwkgKi8KKwllcnJvciA9IHJlY3YoYWNjZXB0Ml9zaywgbXNnYnVmLCAxMDAsIDApOworCWlmICgoMCAhPSBlcnJvcikgfHwgKDAgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJVbmV4cGVjdGVkIGVycm9yIHJldHVybiBvbiAiCisJCQkgInJlY3YoZXJyb3I6JWQsIGVycm5vOiVkKSIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgImFjY2VwdCBvZiBhIENMT1NFRCBhc3NvY2lhdGlvbiIpOworCisJLyogVHJ5aW5nIHRvIHNlbmQgYSBtZXNzYWdlIG92ZXIgdGhlIENMT1NFRCBhc3NvY2lhdGlvbiBzaG91bGQKKwkgKiBnZW5lcmF0ZSBFUElQRS4KKwkgKi8KKwllcnJvciA9IHNlbmQoYWNjZXB0Ml9zaywgbWVzc2FnZSwgc3RybGVuKG1lc3NhZ2UpLCBNU0dfTk9TSUdOQUwpOworCWlmICgoLTEgIT0gZXJyb3IpIHx8IChFUElQRSAhPSBlcnJubykpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmQgdG8gYSBDTE9TRUQgYXNzb2NpYXRpb24gIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kIHRvIGEgQ0xPU0VEIGFzc29jaWF0aW9uIik7CisKKwllcnJvciA9IDA7CisJY2xvc2UoYWNjZXB0Ml9zayk7CisKKwkvKiBWZXJpZnkgdGhhdCBhdXRvLWNvbm5lY3QgY2FuIGJlIGRvbmUgb24gYSBUQ1Atc3R5bGUgc29ja2V0IHVzaW5nCisJICogc2VuZHRvL3NlbmRtc2cuCisJICovCisJY2x0Ml9zayA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NUUkVBTSwgSVBQUk9UT19TQ1RQKTsKKwl0ZXN0X2JpbmQoY2x0Ml9zaywgJmNsdDJfbG9vcC5zYSwgc2l6ZW9mKGNsdDJfbG9vcCkpOworCisJLyogRG8gYSBzZW5kdG8oKSB3aXRob3V0IGEgY29ubmVjdCgpICovCisJdGVzdF9zZW5kdG8oY2x0Ml9zaywgbWVzc2FnZSwgc3RybGVuKG1lc3NhZ2UpLCAwLCAmc3ZyX2xvb3Auc2EsCisJCSAgICBzaXplb2Yoc3ZyX2xvb3ApKTsKKworCWFjY2VwdDJfc2sgPSB0ZXN0X2FjY2VwdChsaXN0ZW5fc2ssICZhY2NlcHRfbG9vcC5zYSwgJmFkZHJsZW4pOyAKKworCXRlc3RfcmVjdihhY2NlcHQyX3NrLCBtc2didWYsIDEwMCwgMCk7CisKKwl0c3RfcmVzbShUUEFTUywgImF1dG8tY29ubmVjdCB1c2luZyBzZW5kdG8iKTsKKworCW91dG1lc3NhZ2UubXNnX25hbWUgPSAmc3ZyX2xvb3A7CisJb3V0bWVzc2FnZS5tc2dfbmFtZWxlbiA9IHNpemVvZihzdnJfbG9vcCk7CisJb3V0bWVzc2FnZS5tc2dfaW92ID0gTlVMTDsKKwlvdXRtZXNzYWdlLm1zZ19pb3ZsZW4gPSAwOworCW91dG1lc3NhZ2UubXNnX2NvbnRyb2wgPSBvdXRjbXNnOworCW91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2Yob3V0Y21zZyk7CisJb3V0bWVzc2FnZS5tc2dfZmxhZ3MgPSAwOworCisJY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1lc3NhZ2UpOworCWNtc2ctPmNtc2dfbGV2ZWwgPSBJUFBST1RPX1NDVFA7CisJY21zZy0+Y21zZ190eXBlID0gU0NUUF9TTkRSQ1Y7CisJY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCW91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKKwlzaW5mbyA9IChzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICopQ01TR19EQVRBKGNtc2cpOworCW1lbXNldChzaW5mbywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKworCS8qIFZlcmlmeSB0aGF0IFNDVFBfRU9GIGNhbm5vdCBiZSB1c2VkIHRvIHNodXRkb3duIGFuIGFzc29jaWF0aW9uCisJICogb24gYSBUQ1Atc3R5bGUgc29ja2V0LgorCSAqLworCXNpbmZvLT5zaW5mb19mbGFncyB8PSBTQ1RQX0VPRjsKKwllcnJvciA9IHNlbmRtc2coY2x0Ml9zaywgJm91dG1lc3NhZ2UsIDApOworCWlmICgoLTEgIT0gZXJyb3IpIHx8IChFSU5WQUwgIT0gZXJybm8pKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZW5kbXNnIHdpdGggU0NUUF9FT0YgZmxhZyAiCisJCQkgImVycm9yOiVkLCBlcnJubzolZCIsIGVycm9yLCBlcnJubyk7CisKKwl0c3RfcmVzbShUUEFTUywgInNlbmRtc2cgd2l0aCBTQ1RQX0VPRiBmbGFnIik7CisKKwkvKiBWZXJpZnkgdGhhdCBTQ1RQX0FCT1JUIGNhbm5vdCBiZSB1c2VkIHRvIGFib3J0IGFuIGFzc29jaWF0aW9uCisJICogb24gYSBUQ1Atc3R5bGUgc29ja2V0LgorCSAqLworCXNpbmZvLT5zaW5mb19mbGFncyB8PSBTQ1RQX0FCT1JUOworCWVycm9yID0gc2VuZG1zZyhjbHQyX3NrLCAmb3V0bWVzc2FnZSwgMCk7CisJaWYgKCgtMSAhPSBlcnJvcikgfHwgKEVJTlZBTCAhPSBlcnJubykpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmRtc2cgd2l0aCBTQ1RQX0FCT1JUIGZsYWcgIgorCQkJICJlcnJvcjolZCwgZXJybm86JWQiLCBlcnJvciwgZXJybm8pOworCisJdHN0X3Jlc20oVFBBU1MsICJzZW5kbXNnIHdpdGggU0NUUF9BQk9SVCBmbGFnIik7CisKKwkvKiBWZXJpZnkgdGhhdCBhIG5vcm1hbCBtZXNzYWdlIGNhbiBiZSBzZW50IHVzaW5nIHNlbmRtc2cuICovCisJb3V0bWVzc2FnZS5tc2dfaW92ID0gJm91dF9pb3Y7CisJb3V0bWVzc2FnZS5tc2dfaW92bGVuID0gMTsKKwlvdXRfaW92Lmlvdl9iYXNlID0gbWVzc2FnZTsKKwlvdXRfaW92Lmlvdl9sZW4gPSBzdHJsZW4obWVzc2FnZSkgKyAxOworCXNpbmZvLT5zaW5mb19mbGFncyA9IDA7CisJdGVzdF9zZW5kbXNnKGNsdDJfc2ssICZvdXRtZXNzYWdlLCAwLCBzdHJsZW4obWVzc2FnZSkrMSk7CisKKwl0ZXN0X3JlY3YoYWNjZXB0Ml9zaywgbXNnYnVmLCAxMDAsIDApOworCQorCXRzdF9yZXNtKFRQQVNTLCAic2VuZG1zZyB3aXRoIG5vIGZsYWdzIik7CisKKwljbG9zZShjbHQyX3NrKTsKKwljbG9zZShhY2NlcHQyX3NrKTsKKwljbG9zZShsaXN0ZW5fc2spOworCisgICAgICAgIC8qIEluZGljYXRlIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4gICovCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvZnVuY190ZXN0cy90ZXN0X3RpbWV0b2xpdmUuYyBiL3NyYy9mdW5jX3Rlc3RzL3Rlc3RfdGltZXRvbGl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDc2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvZnVuY190ZXN0cy90ZXN0X3RpbWV0b2xpdmUuYwpAQCAtMCwwICsxLDM5NSBAQAorLyogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24KKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEsIDIwMDMKKyAqIENvcHlyaWdodCAoYykgMTk5OS0yMDAwIENpc2NvLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSBNb3Rvcm9sYSwgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDAxIEludGVsIENvcnAuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTm9raWEsIEluYy4KKyAqCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgSm9uIEdyaW1tCQkgPGpncmltbUB1cy5pYm0uY29tPgorICogICAgU3JpZGhhciBTYW11ZHJhbGEgIDxzcmlAdXMuaWJtLmNvbT4KKyAqLworCisvKgorICogVGhpcyBpcyBhIGJhc2ljIGZ1bmN0aW9uYWwgdGVzdCBmb3IgdGhlIFNDVFAga2VybmVsIAorICogaW1wbGVtZW50YXRpb24gb2Ygc25kcmN2aW5mby5zaW5mb190aW1ldG9saXZlLgorICoKKyAqIDEpIENyZWF0ZSB0d28gc29ja2V0cywgdGhlIGxpc3RlbmluZyBzb2NrZXQgc2V0cyBpdHMgUkVDVkJVRiBzbWFsbAorICogMikgQ3JlYXRlIGEgY29ubmVjdGlvbi4gIFNlbmQgZW5vdWdoIGRhdGEgdG8gdGhlIG5vbi1yZWFkaW5nIGxpc3RlbmVyCisgKiB0byBmaWxsIHRoZSBSQ1ZCVUYuCisgKiA1KSBTZXQgc2luZm9fdGltZXRvbGl2ZSBvbiBhIG1lc3NhZ2UgYW5kIHNlbmQuCisgKiA2KSBEaXNhYmxlIHNpbmZvX3RpbWV0b2xpdmUgb24gYSBtZXNzYWdlIGFuZCBzZW5kLgorICogNykgV2FpdCBzaW5mb190aW1ldG9saXZlLgorICogOCkgUmVhZCBvdXQgYWxsIHRoZSBkYXRhIGF0IHRoZSByZWNlaXZlci4KKyAqIDkpIE1ha2Ugc3VyZSB0aW1lZCBvdXQgbWVzc2FnZSBkaWQgbm90IG1ha2UgaXQuCisgKiAxMCkgTWFrZSBzdXJlIHRoYXQgdGhlIG1lc3NhZ2Ugd2l0aCBubyB0aW1lb3V0IG1ha2VzIGl0IHRvIHRoZSByZWNlaXZlci4KKyAqCisgKiBBbHNvIHRlc3Qgd2l0aCBTRU5EX0ZBSUxFRCBub3RpZmljYXRpb25zLiAgQWxzbywgdXNlIGEgZnJhZ21lbnRlZAorICogbWVzc2FnZSBzbyBhcyB0byBhbHNvIGV4ZXJjaXNlIHRoZSBTRU5EX0ZBSUxFRCBvZiBmcmFnbWVudGF0aW9uCisgKiBjb2RlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9zY3RwLmg+CisjaW5jbHVkZSA8c2N0cHV0aWwuaD4KKworY2hhciAqVENJRCA9IF9fRklMRV9fOworaW50IFRTVF9UT1RBTCA9IDY7CitpbnQgVFNUX0NOVCA9IDA7CisKKy8qIFRoaXMgaXMgdGhlIHNpemUgb2Ygb3VyIFJDVkJVRiAqLworI2RlZmluZSBTTUFMTF9SQ1ZCVUYgMzAwMAorCisvKiBNQVggc2VnbWVudCBzaXplICovCisjZGVmaW5lIFNNQUxMX01BWFNFRyA1MDAKKworLyogUldORF9TTE9QIGlzIHRoZSBleHRyYSBkYXRhIHRoYXQgZmlsbHMgdXAgdGhlIHJ3bmQgKi8KKyNkZWZpbmUgUldORF9TTE9QIDEwMAorc3RhdGljIGNoYXIgKmZpbGxtc2cgPSBOVUxMOworc3RhdGljIGNoYXIgKnR0bG1zZyA9ICJUaGlzIHNob3VsZCB0aW1lIG91dCFcbiI7CitzdGF0aWMgY2hhciAqbm90dGxtc2cgPSAiVGhpcyBzaG91bGQgTk9UIHRpbWUgb3V0IVxuIjsKK3N0YXRpYyBjaGFyIHR0bGZyYWdbU01BTExfTUFYU0VHKjNdID0gezB9Oworc3RhdGljIGNoYXIgKm1lc3NhZ2UgPSAiSGVsbG8gd29ybGRcbiI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgICAgIGludCBzazEsIHNrMjsKKyAgICAgICAgc29ja2FkZHJfc3RvcmFnZV90IGxvb3AxOworICAgICAgICBzb2NrYWRkcl9zdG9yYWdlX3QgbG9vcDI7CisgICAgICAgIHN0cnVjdCBpb3ZlYyBpb3Y7CisgICAgICAgIHN0cnVjdCBtc2doZHIgaW5tZXNzYWdlOworCXN0cnVjdCBtc2doZHIgb3V0bWVzc2FnZTsKKwljaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzY3RwX2Ntc2dfZGF0YV90KSldOworCWNoYXIgb3V0Y21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSldOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCXN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvOworICAgICAgICBzdHJ1Y3QgaW92ZWMgb3V0X2lvdjsKKyAgICAgICAgaW50IGVycm9yOworCWludCBwZl9jbGFzczsKKwl1aW50MzJfdCBwcGlkOworCXVpbnQzMl90IHN0cmVhbTsKKwlzY3RwX2Fzc29jX3QgYXNzb2NpZDE7CisJc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICpzYWM7CisJc3RydWN0IHNjdHBfZXZlbnRfc3Vic2NyaWJlIHN1YnNjcmliZTsKKwljaGFyICpiaWdfYnVmZmVyOworCWludCBvZmZzZXQ7CisJc3RydWN0IHNjdHBfc2VuZF9mYWlsZWQgKnNzZjsKKwlzb2NrbGVuX3QgbGVuOyAvKiBSZWFsbHkgYmVjb21lcyAyeGxlbiB3aGVuIHNldC4gKi8KKwlpbnQgb3JpZ19sZW47IAorCXN0cnVjdCBzY3RwX3N0YXR1cyBnc3RhdHVzOworCisgICAgICAgIC8qIFJhdGhlciB0aGFuIGZmbHVzaCgpIHRocm91Z2hvdXQgdGhlIGNvZGUsIHNldCBzdGRvdXQgdG8KKwkgKiBiZSB1bmJ1ZmZlcmVkLgorCSAqLworCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworCisJLyogU2V0IHNvbWUgYmFzaWMgdmFsdWVzIHdoaWNoIGRlcGVuZCBvbiB0aGUgYWRkcmVzcyBmYW1pbHkuICovCisjaWYgVEVTVF9WNgorCXBmX2NsYXNzID0gUEZfSU5FVDY7CisKKyAgICAgICAgbG9vcDEudjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKyAgICAgICAgbG9vcDEudjYuc2luNl9hZGRyID0gaW42YWRkcl9sb29wYmFjazsKKyAgICAgICAgbG9vcDEudjYuc2luNl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworICAgICAgICBsb29wMi52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OworICAgICAgICBsb29wMi52Ni5zaW42X2FkZHIgPSBpbjZhZGRyX2xvb3BiYWNrOworICAgICAgICBsb29wMi52Ni5zaW42X3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzIpOworI2Vsc2UKKwlwZl9jbGFzcyA9IFBGX0lORVQ7CisKKyAgICAgICAgbG9vcDEudjQuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisgICAgICAgIGxvb3AxLnY0LnNpbl9hZGRyLnNfYWRkciA9IFNDVFBfSVBfTE9PUEJBQ0s7CisgICAgICAgIGxvb3AxLnY0LnNpbl9wb3J0ID0gaHRvbnMoU0NUUF9URVNUUE9SVF8xKTsKKworICAgICAgICBsb29wMi52NC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKyAgICAgICAgbG9vcDIudjQuc2luX2FkZHIuc19hZGRyID0gU0NUUF9JUF9MT09QQkFDSzsKKyAgICAgICAgbG9vcDIudjQuc2luX3BvcnQgPSBodG9ucyhTQ1RQX1RFU1RQT1JUXzIpOworI2VuZGlmIC8qIFRFU1RfVjYgKi8KKworICAgICAgICAvKiBDcmVhdGUgdGhlIHR3byBlbmRwb2ludHMgd2hpY2ggd2lsbCB0YWxrIHRvIGVhY2ggb3RoZXIuICAqLworICAgICAgICBzazEgPSB0ZXN0X3NvY2tldChwZl9jbGFzcywgU09DS19TRVFQQUNLRVQsIElQUFJPVE9fU0NUUCk7CisgICAgICAgIHNrMiA9IHRlc3Rfc29ja2V0KHBmX2NsYXNzLCBTT0NLX1NFUVBBQ0tFVCwgSVBQUk9UT19TQ1RQKTsKKworCWxlbiA9IHNpemVvZihpbnQpOworCWVycm9yID0gZ2V0c29ja29wdChzazIsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJm9yaWdfbGVuLAorCQkJICAgJmxlbik7CisJaWYgKGVycm9yKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJjYW4ndCBnZXQgcmN2YnVmIHNpemU6ICVzIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJLyogU2V0IHRoZSBNQVhTRUcgdG8gc29tZXRoaW5nIHNtYWxsaXNoLiAqLworCXsKKwkJaW50IHZhbCA9IFNNQUxMX01BWFNFRzsKKwkJdGVzdF9zZXRzb2Nrb3B0KHNrMSwgU0NUUF9NQVhTRUcsICZ2YWwsIHNpemVvZih2YWwpKTsKKwl9CisKKwltZW1zZXQoJnN1YnNjcmliZSwgMCwgc2l6ZW9mKHN1YnNjcmliZSkpOworCXN1YnNjcmliZS5zY3RwX2RhdGFfaW9fZXZlbnQgPSAxOworCXN1YnNjcmliZS5zY3RwX2Fzc29jaWF0aW9uX2V2ZW50ID0gMTsKKwlzdWJzY3JpYmUuc2N0cF9zZW5kX2ZhaWx1cmVfZXZlbnQgPSAxOworCXRlc3Rfc2V0c29ja29wdChzazEsIFNDVFBfRVZFTlRTLCAmc3Vic2NyaWJlLCBzaXplb2Yoc3Vic2NyaWJlKSk7CisJdGVzdF9zZXRzb2Nrb3B0KHNrMiwgU0NUUF9FVkVOVFMsICZzdWJzY3JpYmUsIHNpemVvZihzdWJzY3JpYmUpKTsKKworICAgICAgICAvKiBCaW5kIHRoZXNlIHNvY2tldHMgdG8gdGhlIHRlc3QgcG9ydHMuICAqLworICAgICAgICB0ZXN0X2JpbmQoc2sxLCAmbG9vcDEuc2EsIHNpemVvZihsb29wMSkpOworICAgICAgICB0ZXN0X2JpbmQoc2syLCAmbG9vcDIuc2EsIHNpemVvZihsb29wMikpOworCisJLyoKKwkgKiBUaGlzIGNvZGUgc2V0cyB0aGUgYXNzb2NpYXRpb25zIFJXTkQgdmVyeSBzbWFsbCBzbyB3ZSBjYW4KKwkgKiBmaWxsIGl0LiAgSXQgZG9lcyB0aGlzIGJ5IG1hbmlwdWxhdGluZyB0aGUgcmN2YnVmIGFzIGZvbGxvd3M6CisJICogMSkgUmVkdWNlIHRoZSByY3ZidWYgc2l6ZSBvbiB0aGUgc29ja2V0CisJICogMikgY3JlYXRlIGFuIGFzc29jaWF0aW9uIHNvIHRoYXQgd2UgYWR2ZXJ0aXNlIHJjdmJ1Zi8yIGFzCisJICogICAgb3VyIGluaXRpYWwgcnduZAorCSAqLworCWxlbiA9IFNNQUxMX1JDVkJVRjsKKwllcnJvciA9IHNldHNvY2tvcHQoc2syLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZsZW4sCisJCQkgICBzaXplb2YobGVuKSk7CisJaWYgKGVycm9yKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZXRzb2Nrb3B0KFNPX1JDVkJVRik6ICVzIiwKKwkJCSBzdHJlcnJvcihlcnJubykpOworCisgICAgICAgLyogTWFyayBzazIgYXMgYmVpbmcgYWJsZSB0byBhY2NlcHQgbmV3IGFzc29jaWF0aW9ucy4gICovCisJdGVzdF9saXN0ZW4oc2syLCAxKTsKKworICAgICAgICAvKiBTZW5kIHRoZSBmaXJzdCBtZXNzYWdlLiAgVGhpcyB3aWxsIGNyZWF0ZSB0aGUgYXNzb2NpYXRpb24uICAqLworICAgICAgICBvdXRtZXNzYWdlLm1zZ19uYW1lID0gJmxvb3AyOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19uYW1lbGVuID0gc2l6ZW9mKGxvb3AyKTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfaW92ID0gJm91dF9pb3Y7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2NvbnRyb2wgPSBvdXRjbXNnOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKG91dGNtc2cpOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19mbGFncyA9IDA7CisJY21zZyA9IENNU0dfRklSU1RIRFIoJm91dG1lc3NhZ2UpOworCWNtc2ctPmNtc2dfbGV2ZWwgPSBJUFBST1RPX1NDVFA7CisJY21zZy0+Y21zZ190eXBlID0gU0NUUF9TTkRSQ1Y7CisJY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCW91dG1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBjbXNnLT5jbXNnX2xlbjsKKwlzaW5mbyA9IChzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICopQ01TR19EQVRBKGNtc2cpOworCW1lbXNldChzaW5mbywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlwcGlkID0gcmFuZCgpOyAvKiBDaG9vc2UgYW4gYXJiaXRyYXJ5IHZhbHVlLiAqLworCXN0cmVhbSA9IDE7CisJc2luZm8tPnNpbmZvX3BwaWQgPSBwcGlkOworCXNpbmZvLT5zaW5mb19zdHJlYW0gPSBzdHJlYW07CisgICAgICAgIG91dG1lc3NhZ2UubXNnX2lvdi0+aW92X2Jhc2UgPSBtZXNzYWdlOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9sZW4gPSBzdHJsZW4obWVzc2FnZSkgKyAxOworICAgICAgICB0ZXN0X3NlbmRtc2coc2sxLCAmb3V0bWVzc2FnZSwgMCwgc3RybGVuKG1lc3NhZ2UpKzEpOworCisJLyogSW5pdGlhbGl6ZSBpbm1lc3NhZ2UgZm9yIGFsbCByZWNlaXZlcy4gKi8KKwliaWdfYnVmZmVyID0gdGVzdF9tYWxsb2MoUkVBTExZX0JJRyk7CisgICAgICAgIG1lbXNldCgmaW5tZXNzYWdlLCAwLCBzaXplb2YoaW5tZXNzYWdlKSk7CisgICAgICAgIGlvdi5pb3ZfYmFzZSA9IGJpZ19idWZmZXI7CisgICAgICAgIGlvdi5pb3ZfbGVuID0gUkVBTExZX0JJRzsKKyAgICAgICAgaW5tZXNzYWdlLm1zZ19pb3YgPSAmaW92OworICAgICAgICBpbm1lc3NhZ2UubXNnX2lvdmxlbiA9IDE7CisgICAgICAgIGlubWVzc2FnZS5tc2dfY29udHJvbCA9IGluY21zZzsKKworICAgICAgICAvKiBHZXQgdGhlIGNvbW11bmljYXRpb24gdXAgbWVzc2FnZSBvbiBzazIuICAqLworICAgICAgICBpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKyAgICAgICAgZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc2syLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfQ09NTV9VUCk7CisjaWYgMAorCXNhYyA9IChzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UgKilpb3YuaW92X2Jhc2U7CisJYXNzb2NpZDIgPSBzYWMtPnNhY19hc3NvY19pZDsKKyNlbmRpZgorCisgICAgICAgIC8qIEdldCB0aGUgY29tbXVuaWNhdGlvbiB1cCBtZXNzYWdlIG9uIHNrMS4gICovCisgICAgICAgIGlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworICAgICAgICBlcnJvciA9IHRlc3RfcmVjdm1zZyhzazEsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oJmlubWVzc2FnZSwgZXJyb3IsCisJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY19jaGFuZ2UpLAorCQkJCSAgICBTQ1RQX0FTU09DX0NIQU5HRSwgU0NUUF9DT01NX1VQKTsKKwlzYWMgPSAoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlICopaW92Lmlvdl9iYXNlOworCWFzc29jaWQxID0gc2FjLT5zYWNfYXNzb2NfaWQ7CisKKyAgICAgICAgLyogR2V0IHRoZSBmaXJzdCBkYXRhIG1lc3NhZ2Ugd2hpY2ggd2FzIHNlbnQuICAqLworICAgICAgICBpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKyAgICAgICAgZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc2syLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisgICAgICAgIHRlc3RfY2hlY2tfbXNnX2RhdGEoJmlubWVzc2FnZSwgZXJyb3IsIHN0cmxlbihtZXNzYWdlKSArIDEsCisJCQkgICAgTVNHX0VPUiwgc3RyZWFtLCBwcGlkKTsKKworCS8qIEZpZ3VyZSBvdXQgaG93IGJpZyB0byBtYWtlIG91ciBmaWxsbXNnICovCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBzY3RwX3N0YXR1cyk7CisJbWVtc2V0KCZnc3RhdHVzLDAsc2l6ZW9mKHN0cnVjdCBzY3RwX3N0YXR1cykpOworCWdzdGF0dXMuc3N0YXRfYXNzb2NfaWQgPSBhc3NvY2lkMTsKKwllcnJvciA9IGdldHNvY2tvcHQoc2sxLCBJUFBST1RPX1NDVFAsIFNDVFBfU1RBVFVTLCAmZ3N0YXR1cywgJmxlbik7CisJCisJaWYgKGVycm9yKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJjYW4ndCBnZXQgcnduZCBzaXplOiAlcyIsCisJCQlzdHJlcnJvcihlcnJubykpOworCXRzdF9yZXNtKFRJTkZPLCAiQ3JlYXRpbmcgZmlsbG1zZyBvZiBzaXplICVkIiwKKwkJIGdzdGF0dXMuc3N0YXRfcnduZCtSV05EX1NMT1ApOworCWZpbGxtc2cgPSBtYWxsb2MoZ3N0YXR1cy5zc3RhdF9yd25kK1JXTkRfU0xPUCk7CQorCisJLyogU2VuZCBhIGZpbGxtc2cgKi8KKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihvdXRjbXNnKTsKKyAgICAgICAgb3V0bWVzc2FnZS5tc2dfZmxhZ3MgPSAwOworCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZvdXRtZXNzYWdlKTsKKwljbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworCWNtc2ctPmNtc2dfdHlwZSA9IFNDVFBfU05EUkNWOworCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwlvdXRtZXNzYWdlLm1zZ19jb250cm9sbGVuID0gY21zZy0+Y21zZ19sZW47CisJc2luZm8gPSAoc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqKUNNU0dfREFUQShjbXNnKTsKKwltZW1zZXQoc2luZm8sIDB4MDAsIHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSk7CisJcHBpZCsrOworCXN0cmVhbSsrOworCXNpbmZvLT5zaW5mb19wcGlkID0gcHBpZDsKKwlzaW5mby0+c2luZm9fc3RyZWFtID0gc3RyZWFtOworCW1lbXNldChmaWxsbXNnLCAnWCcsIGdzdGF0dXMuc3N0YXRfcnduZCtSV05EX1NMT1ApOworCWZpbGxtc2dbZ3N0YXR1cy5zc3RhdF9yd25kK1JXTkRfU0xPUC0xXSA9ICdcMCc7CisJb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfYmFzZSA9IGZpbGxtc2c7CisJb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfbGVuID0gZ3N0YXR1cy5zc3RhdF9yd25kK1JXTkRfU0xPUDsKKwlvdXRtZXNzYWdlLm1zZ19uYW1lID0gTlVMTDsKKwlvdXRtZXNzYWdlLm1zZ19uYW1lbGVuID0gMDsKKwlzaW5mby0+c2luZm9fYXNzb2NfaWQgPSBhc3NvY2lkMTsKKwlzaW5mby0+c2luZm9fdGltZXRvbGl2ZSA9IDA7CisJdGVzdF9zZW5kbXNnKHNrMSwgJm91dG1lc3NhZ2UsIE1TR19OT1NJR05BTCwKKwkJCSBnc3RhdHVzLnNzdGF0X3J3bmQrUldORF9TTE9QKTsKKworCS8qIE5vdyBzZW5kIHRoZSBtZXNzYWdlIHdpdGggdGltZW91dC4gKi8KKwlzaW5mby0+c2luZm9fcHBpZCA9IHBwaWQ7CisJc2luZm8tPnNpbmZvX3N0cmVhbSA9IHN0cmVhbTsKKwlvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9iYXNlID0gdHRsbXNnOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9sZW4gPSBzdHJsZW4odHRsbXNnKSArIDE7CisJb3V0bWVzc2FnZS5tc2dfbmFtZSA9IE5VTEw7CisJb3V0bWVzc2FnZS5tc2dfbmFtZWxlbiA9IDA7CisJc2luZm8tPnNpbmZvX2Fzc29jX2lkID0gYXNzb2NpZDE7CisJc2luZm8tPnNpbmZvX3RpbWV0b2xpdmUgPSAyMDAwOworCXRlc3Rfc2VuZG1zZyhzazEsICZvdXRtZXNzYWdlLCBNU0dfTk9TSUdOQUwsIHN0cmxlbih0dGxtc2cpICsgMSk7CisKKwl0c3RfcmVzbShUUEFTUywgIlNlbmQgYSBtZXNzYWdlIHdpdGggdGltZW91dCIpOworCisJLyogTmV4dCBzZW5kIGEgbWVzc2FnZSB3aXRoIG5vIHRpbWVvdXQuICovCisJc2luZm8tPnNpbmZvX3BwaWQgPSBwcGlkOworCXNpbmZvLT5zaW5mb19zdHJlYW0gPSBzdHJlYW07CisJb3V0bWVzc2FnZS5tc2dfaW92LT5pb3ZfYmFzZSA9IG5vdHRsbXNnOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9sZW4gPSBzdHJsZW4obm90dGxtc2cpICsgMTsKKwlvdXRtZXNzYWdlLm1zZ19uYW1lID0gTlVMTDsKKwlvdXRtZXNzYWdlLm1zZ19uYW1lbGVuID0gMDsKKwlzaW5mby0+c2luZm9fYXNzb2NfaWQgPSBhc3NvY2lkMTsKKwlzaW5mby0+c2luZm9fdGltZXRvbGl2ZSA9IDA7CisJdGVzdF9zZW5kbXNnKHNrMSwgJm91dG1lc3NhZ2UsIE1TR19OT1NJR05BTCwgc3RybGVuKG5vdHRsbXNnKSsxKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiU2VuZCBhIG1lc3NhZ2Ugd2l0aCBubyB0aW1lb3V0Iik7CisKKwkvKiBBbmQgZmluYWxseSBhIGZyYWdtZW50ZWQgbWVzc2FnZSB0aGF0IHdpbGwgdGltZSBvdXQuICovCisJc2luZm8tPnNpbmZvX3BwaWQgPSBwcGlkOworCXNpbmZvLT5zaW5mb19zdHJlYW0gPSBzdHJlYW07CisJbWVtc2V0KHR0bGZyYWcsIDQ4LCBzaXplb2YodHRsZnJhZykpOyAvKiA0OCBpcyB0aGUgYXNjaWkgb2YgJzAnICovCisJdHRsZnJhZ1tzaXplb2YodHRsZnJhZyktMV0gPSAnXDAnOworCW91dG1lc3NhZ2UubXNnX2lvdi0+aW92X2Jhc2UgPSB0dGxmcmFnOworICAgICAgICBvdXRtZXNzYWdlLm1zZ19pb3YtPmlvdl9sZW4gPSBzaXplb2YodHRsZnJhZyk7CisJb3V0bWVzc2FnZS5tc2dfbmFtZSA9IE5VTEw7CisJb3V0bWVzc2FnZS5tc2dfbmFtZWxlbiA9IDA7CisJc2luZm8tPnNpbmZvX2Fzc29jX2lkID0gYXNzb2NpZDE7CisJc2luZm8tPnNpbmZvX3RpbWV0b2xpdmUgPSAyMDAwOworCXRlc3Rfc2VuZG1zZyhzazEsICZvdXRtZXNzYWdlLCBNU0dfTk9TSUdOQUwsIHNpemVvZih0dGxmcmFnKSk7CisKKwl0c3RfcmVzbShUUEFTUywgIlNlbmQgYSBmcmFnbWVudGVkIG1lc3NhZ2Ugd2l0aCB0aW1lb3V0Iik7CisKKwkvKiBTbGVlcCB3YWl0aW5nIGZvciB0aGUgbWVzc2FnZSB0byB0aW1lIG91dC4gKi8KKwl0c3RfcmVzbShUSU5GTywgIiAqKiAgU0xFRVBJTkcgZm9yIDMgc2Vjb25kcyAqKiIpOworCXNsZWVwKDMpOworCisJLyogUmVhZCB0aGUgZmlsbG1zZyBzbnVjayBpbiBiZXR3ZWVuIHRoZSB0dGwnZCBtZXNzYWdlcy4gKi8KKwlkbyB7CisJCWlubWVzc2FnZS5tc2dfY29udHJvbGxlbiA9IHNpemVvZihpbmNtc2cpOworCQllcnJvciA9IHRlc3RfcmVjdm1zZyhzazIsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl9IHdoaWxlICghKGlubWVzc2FnZS5tc2dfZmxhZ3MgJiBNU0dfRU9SKSk7CisKKwkvKiBOb3cgZ2V0IHRoZSBtZXNzYWdlIHRoYXQgZGlkIE5PVCB0aW1lIG91dC4gKi8KKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwllcnJvciA9IHRlc3RfcmVjdm1zZyhzazIsICZpbm1lc3NhZ2UsIE1TR19XQUlUQUxMKTsKKwl0ZXN0X2NoZWNrX21zZ19kYXRhKCZpbm1lc3NhZ2UsIGVycm9yLCBzdHJsZW4obm90dGxtc2cpICsgMSwKKwkJCSAgICBNU0dfRU9SLCBzdHJlYW0sIHBwaWQpOworCWlmICgwICE9IHN0cm5jbXAoaW92Lmlvdl9iYXNlLCBub3R0bG1zZywgc3RybGVuKG5vdHRsbXNnKSsxKSkKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiUmVjZWl2ZWQgV3JvbmcgTWVzc2FnZSAhISEiKTsKKworCXRzdF9yZXNtKFRQQVNTLCAiUmVjZWl2ZSBtZXNzYWdlIHdpdGggbm8gdGltZW91dCIpOworCisJLyogR2V0IHRoZSBTRU5EX0ZBSUxFRCBub3RpZmljYXRpb24gZm9yIHRoZSBtZXNzYWdlIHRoYXQgRElECisJICogdGltZSBvdXQuCisJICovCisJaW5tZXNzYWdlLm1zZ19jb250cm9sbGVuID0gc2l6ZW9mKGluY21zZyk7CisJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc2sxLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfc2VuZF9mYWlsZWQpICsKKwkJCQkJCQlzdHJsZW4odHRsbXNnKSArIDEsCisJCQkJICAgIFNDVFBfU0VORF9GQUlMRUQsIDApOworCXNzZiA9IChzdHJ1Y3Qgc2N0cF9zZW5kX2ZhaWxlZCAqKWlvdi5pb3ZfYmFzZTsKKwlpZiAoMCAhPSBzdHJuY21wKHR0bG1zZywgKGNoYXIgKilzc2YtPnNzZl9kYXRhLCBzdHJsZW4odHRsbXNnKSArIDEpKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJTRU5EX0ZBSUxFRCBkYXRhIG1pc21hdGNoIik7CisKKwl0c3RfcmVzbShUUEFTUywgIlJlY2VpdmUgU0VORF9GQUlMRUQgZm9yIG1lc3NhZ2Ugd2l0aCB0aW1lb3V0Iik7CisKKwkvKiBHZXQgdGhlIFNFTkRfRkFJTEVEIG5vdGlmaWNhdGlvbiBmb3IgdGhlIGZyYWdtZW50ZWQgbWVzc2FnZSB0aGF0CisJICogRElEIHRpbWUgb3V0LgorCSAqLworCW9mZnNldCA9IDA7CisJZG8geworCQlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKwkJZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc2sxLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJCXRlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbigmaW5tZXNzYWdlLCBlcnJvciwKKwkJCQkJICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9zZW5kX2ZhaWxlZCkgKworCQkJCQkJCQkgIFNNQUxMX01BWFNFRywKKwkJCQkJICAgIFNDVFBfU0VORF9GQUlMRUQsIDApOworCQlzc2YgPSAoc3RydWN0IHNjdHBfc2VuZF9mYWlsZWQgKilpb3YuaW92X2Jhc2U7CisJCWlmICgwICE9IHN0cm5jbXAoJnR0bGZyYWdbb2Zmc2V0XSwgKGNoYXIgKilzc2YtPnNzZl9kYXRhLAorCQkJCSBTTUFMTF9NQVhTRUcpKQorCQkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiU0VORF9GQUlMRUQgZGF0YSBtaXNtYXRjaCIpOworCQlvZmZzZXQgKz0gU01BTExfTUFYU0VHOworCX0gd2hpbGUgKCEoc3NmLT5zc2ZfaW5mby5zaW5mb19mbGFncyAmIDB4MDEpKTsgLyogTEFTVF9GUkFHICovCisKKwl0c3RfcmVzbShUUEFTUywgIlJlY2VpdmUgU0VORF9GQUlMRUQgZm9yIGZyYWdtZW50ZWQgbWVzc2FnZSB3aXRoICIKKwkJICJ0aW1lb3V0Iik7CisKKyAgICAgICAgLyogU2h1dCBkb3duIHRoZSBsaW5rLiAgKi8KKyAgICAgICAgY2xvc2Uoc2sxKTsKKworICAgICAgICAvKiBHZXQgdGhlIHNodXRkb3duIGNvbXBsZXRlIG5vdGlmaWNhdGlvbi4gKi8KKwlpbm1lc3NhZ2UubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKyAgICAgICAgZXJyb3IgPSB0ZXN0X3JlY3Ztc2coc2syLCAmaW5tZXNzYWdlLCBNU0dfV0FJVEFMTCk7CisJdGVzdF9jaGVja19tc2dfbm90aWZpY2F0aW9uKCZpbm1lc3NhZ2UsIGVycm9yLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfY2hhbmdlKSwKKwkJCQkgICAgU0NUUF9BU1NPQ19DSEFOR0UsIFNDVFBfU0hVVERPV05fQ09NUCk7CisKKyAgICAgICAgY2xvc2Uoc2syKTsKKworICAgICAgICAvKiBJbmRpY2F0ZSBzdWNjZXNzZnVsIGNvbXBsZXRpb24uICAqLworICAgICAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL01ha2VmaWxlLmFtIGIvc3JjL2luY2x1ZGUvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhhYmFlYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9pbmNsdWRlL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsNSBAQAorCitpbmNsdWRlICQodG9wX3NyY2RpcikvTWFrZWZpbGUudmFycworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLnJ1bGVzCisKK1NVQkRJUlMgPSBuZXRpbmV0CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9uZXRpbmV0L01ha2VmaWxlLmFtIGIvc3JjL2luY2x1ZGUvbmV0aW5ldC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjVkYjhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2luY2x1ZGUvbmV0aW5ldC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE0IEBACisKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS52YXJzCitpbmNsdWRlICQodG9wX3NyY2RpcikvTWFrZWZpbGUucnVsZXMKKworbGliY25ldGluZXRkaXIgPSAkKGluY2x1ZGVkaXIpL25ldGluZXQKKworCisjIyBGSVhNRTogWW91ciBzdHVmZiBoZXJlCisKKyMgU3VwcG9zaW5nIHRoaXMgaXMgcGFydCBvZiB0aGUgZGV2ZWxvcG1lbnQgcGFja2FnZSwgaGVhZGVyIGZvciBvdXIKKyMgQVBJLgoraW5jbHVkZV9IRUFERVJTID0KKworbGliY25ldGluZXRfSEVBREVSUyA9IHNjdHAuaApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbmV0aW5ldC9zY3RwLmguaW4gYi9zcmMvaW5jbHVkZS9uZXRpbmV0L3NjdHAuaC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDA5ZjFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2luY2x1ZGUvbmV0aW5ldC9zY3RwLmguaW4KQEAgLTAsMCArMSwxODggQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uOiBVc2VyIEFQSSBleHRlbnNpb25zLgorICoKKyAqIHNjdHAuaAorICoKKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTEdQTCB2Mi4xIGFzIGRlc2NyaWJlZCBpbgorICogICAgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci50eHQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgdXNlciBsaWJyYXJ5IHRoYXQgb2ZmZXJzIHN1cHBvcnQgZm9yIHRoZQorICogTGludXggS2VybmVsIFNDVFAgSW1wbGVtZW50YXRpb24uIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcworICogY29kZSBpcyB0byBwcm92aWRlIHRoZSBTQ1RQIFNvY2tldCBBUEkgbWFwcGluZ3MgZm9yIHVzZXIKKyAqIGFwcGxpY2F0aW9uIHRvIGludGVyZmFjZSB3aXRoIFNDVFAgaW4ga2VybmVsLgorICoKKyAqIFRoaXMgaGVhZGVyIHJlcHJlc2VudHMgdGhlIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cyBuZWVkZWQgdG8gc3VwcG9ydAorICogdGhlIFNDVFAgRXh0ZW5zaW9uIHRvIHRoZSBTb2NrZXRzIEFQSS4KKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxLCAyMDA0CisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBDaXNjbywgSW5jLgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgTW90b3JvbGEsIEluYy4KKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgTGEgTW9udGUgSC5QLiBZYXJyb2xsICAgIDxwaWdneUBhY20ub3JnPgorICogICAgUi4gU3Rld2FydCAgICAgICAgICAgICAgIDxyYW5kYWxsQHNjdHAuY2hpY2Fnby5pbC51cz4KKyAqICAgIEsuIE1vcm5lYXUgICAgICAgICAgICAgICA8a21vcm5lYXVAY2lzY28uY29tPgorICogICAgUS4gWGllICAgICAgICAgICAgICAgICAgIDxxeGllMUBlbWFpbC5tb3QuY29tPgorICogICAgS2FybCBLbnV0c29uICAgICAgICAgICAgIDxrYXJsQGF0aGVuYS5jaGljYWdvLmlsLnVzPgorICogICAgSm9uIEdyaW1tICAgICAgICAgICAgICAgIDxqZ3JpbW1AYXVzdGluLmlibS5jb20+CisgKiAgICBEYWlzeSBDaGFuZyAgICAgICAgICAgICAgPGRhaXN5Y0B1cy5pYm0uY29tPgorICogICAgSW5ha3kgUGVyZXotR29uemFsZXogICAgIDxpbmFreS5nb256YWxlekBpbnRlbC5jb20+CisgKiAgICBTcmlkaGFyIFNhbXVkcmFsYSAgICAgICAgPHNyaUB1cy5pYm0uY29tPgorICogICAgVmxhZCBZYXNldmljaAkJPHZsYWRpc2xhdi55YXNldmljaEBocC5jb20+CisgKi8KKworI2lmbmRlZiBfX2xpbnV4X3NjdHBfaF9fCisjZGVmaW5lIF9fbGludXhfc2N0cF9oX18KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjdHAuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBTb2NrZXQgb3B0aW9uIGxheWVyIGZvciBTQ1RQICovCisjaWZuZGVmIFNPTF9TQ1RQCisjZGVmaW5lIFNPTF9TQ1RQCTEzMgorI2VuZGlmCisKKyNpZm5kZWYgSVBQUk9UT19TQ1RQCisjZGVmaW5lIElQUFJPVE9fU0NUUCAgICAxMzIKKyNlbmRpZgorCisvKiA5LiBQcmVwcm9jZXNzb3IgY29uc3RhbnRzICovCisjZGVmaW5lIEhBVkVfU0NUUAorI2RlZmluZSBIQVZFX0tFUk5FTF9TQ1RQCisjZGVmaW5lIEhBVkVfU0NUUF9NVUxUSUJVRgorI2RlZmluZSBIQVZFX1NDVFBfTk9DT05ORUNUCisjZGVmaW5lIEhBVkVfU0NUUF9QUlNDVFAKKyNkZWZpbmUgSEFWRV9TQ1RQX0FERElQCisjZGVmaW5lIEhBVkVfU0NUUF9DQU5TRVRfUFJJTUFSWQorCisjdW5kZWYgSEFWRV9TQ1RQX1NUUkVBTV9SRVNFVF9FVkVOVAorI3VuZGVmIEhBVkVfU0NUUF9TVFJFQU1fUkVDT05GSUcKKyN1bmRlZiBIQVZFX1NDVFBfUEVFTE9GRl9GTEFHUworI3VuZGVmIEhBVkVfU0NUUF9QREFQSV9FVkVOVF9QREFQSV9TVFJFQU0KKyN1bmRlZiBIQVZFX1NDVFBfUERBUElfRVZFTlRfUERBUElfU0VRCisjdW5kZWYgSEFWRV9TQ1RQX1NFTkRWCisjdW5kZWYgSEFWRV9TQ1RQX0FVVEhfTk9fQVVUSAorI3VuZGVmIEhBVkVfU0NUUF9TUFBfSVBWNl9GTE9XTEFCRUwKKyN1bmRlZiBIQVZFX1NDVFBfU1BQX0RTQ1AKKworaW50IHNjdHBfYmluZHgoaW50IHNkLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJzLCBpbnQgYWRkcmNudCwgaW50IGZsYWdzKTsKKworaW50IHNjdHBfY29ubmVjdHgoaW50IHNkLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJzLCBpbnQgYWRkcmNudCwKKwkJICBzY3RwX2Fzc29jX3QgKmlkKTsKKworaW50IHNjdHBfcGVlbG9mZihpbnQgc2QsIHNjdHBfYXNzb2NfdCBhc3NvY19pZCk7CitpbnQgc2N0cF9wZWVsb2ZmX2ZsYWdzKGludCBzZCwgc2N0cF9hc3NvY190IGFzc29jX2lkLCB1bnNpZ25lZCBmbGFncyk7CisKKy8qIFByb3RvdHlwZSBmb3IgdGhlIGxpYnJhcnkgZnVuY3Rpb24gc2N0cF9vcHRfaW5mbyBkZWZpbmVkIGluCisgKiBBUEkgNy4gU29ja2V0IE9wdGlvbnMuCisgKi8KK2ludCBzY3RwX29wdF9pbmZvKGludCBzZCwgc2N0cF9hc3NvY190IGlkLCBpbnQgb3B0LCB2b2lkICphcmcsIHNvY2tsZW5fdCAqc2l6ZSk7CisKKy8qIEdldCBhbGwgcGVlciBhZGRyZXNzIG9uIGEgc29ja2V0LiAgVGhpcyBpcyBhIG5ldyBTQ1RQIEFQSQorICogZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIDguMyBvZiB0aGUgU29ja2V0cyBBUEkgRXh0ZW5zaW9ucyBmb3IgU0NUUC4KKyAqIFRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIGdldHNvY2tvcHQoKSBpbnRlcmZhY2UuCisgKi8KK2ludCBzY3RwX2dldHBhZGRycyhpbnQgc2QsIHNjdHBfYXNzb2NfdCBpZCwgc3RydWN0IHNvY2thZGRyICoqYWRkcnMpOworCisvKiBGcmVlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBzY3RwX2dldHBhZGRycygpLiAgVGhpcyBpcyBhIG5ldyBTQ1RQIEFQSQorICogZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIDguNCBvZiB0aGUgU29ja2V0cyBBUEkgRXh0ZW5zaW9ucyBmb3IgU0NUUC4KKyAqLworaW50IHNjdHBfZnJlZXBhZGRycyhzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJzKTsKKworLyogR2V0IGFsbCBsb2NhbGx5IGJvdW5kIGFkZHJlc3Mgb24gYSBzb2NrZXQuICBUaGlzIGlzIGEgbmV3IFNDVFAgQVBJCisgKiBkZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gOC41IG9mIHRoZSBTb2NrZXRzIEFQSSBFeHRlbnNpb25zIGZvciBTQ1RQLgorICogVGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgZ2V0c29ja29wdCgpIGludGVyZmFjZS4KKyAqLworaW50IHNjdHBfZ2V0bGFkZHJzKGludCBzZCwgc2N0cF9hc3NvY190IGlkLCBzdHJ1Y3Qgc29ja2FkZHIgKiphZGRycyk7CisKKy8qIEZyZWVzIGFsbCByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IHNjdHBfZ2V0bGFkZHJzKCkuICBUaGlzIGlzIGEgbmV3IFNDVFAgQVBJCisgKiBkZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gOC42IG9mIHRoZSBTb2NrZXRzIEFQSSBFeHRlbnNpb25zIGZvciBTQ1RQLgorICovCitpbnQgc2N0cF9mcmVlbGFkZHJzKHN0cnVjdCBzb2NrYWRkciAqYWRkcnMpOworCisvKiBUaGlzIGxpYnJhcnkgZnVuY3Rpb24gYXNzaXN0cyB0aGUgdXNlciB3aXRoIHRoZSBhZHZhbmNlZCBmZWF0dXJlcworICogb2YgU0NUUC4gIFRoaXMgaXMgYSBuZXcgU0NUUCBBUEkgZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIDguNyBvZiB0aGUKKyAqIFNvY2tldHMgQVBJIEV4dGVuc2lvbnMgZm9yIFNDVFAuIFRoaXMgaXMgaW1wbGVtZW50ZWQgdXNpbmcgdGhlCisgKiBzZW5kbXNnKCkgaW50ZXJmYWNlLgorICovCitpbnQgc2N0cF9zZW5kbXNnKGludCBzLCBjb25zdCB2b2lkICptc2csIHNpemVfdCBsZW4sIHN0cnVjdCBzb2NrYWRkciAqdG8sCisJCSBzb2NrbGVuX3QgdG9sZW4sIHVpbnQzMl90IHBwaWQsIHVpbnQzMl90IGZsYWdzLAorCQkgdWludDE2X3Qgc3RyZWFtX25vLCB1aW50MzJfdCB0aW1ldG9saXZlLCB1aW50MzJfdCBjb250ZXh0KTsKKworLyogVGhpcyBsaWJyYXJ5IGZ1bmN0aW9uIGFzc2lzdCB0aGUgdXNlciB3aXRoIHNlbmRpbmcgYSBtZXNzYWdlIHdpdGhvdXQKKyAqIGRlYWxpbmcgZGlyZWN0bHkgd2l0aCB0aGUgQ01TRyBoZWFkZXIuCisgKi8KK2ludCBzY3RwX3NlbmQoaW50IHMsIGNvbnN0IHZvaWQgKm1zZywgc2l6ZV90IGxlbiwKKyAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm8sIGludCBmbGFncyk7CisKKy8qIFRoaXMgbGlicmFyeSBmdW5jdGlvbiBhc3Npc3RzIHRoZSB1c2VyIHdpdGggdGhlIGFkdmFuY2VkIGZlYXR1cmVzCisgKiBvZiBTQ1RQLiAgVGhpcyBpcyBhIG5ldyBTQ1RQIEFQSSBkZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gOC44IG9mIHRoZQorICogU29ja2V0cyBBUEkgRXh0ZW5zaW9ucyBmb3IgU0NUUC4gVGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUKKyAqIHJlY3Ztc2coKSBpbnRlcmZhY2UuCisgKi8KK2ludCBzY3RwX3JlY3Ztc2coaW50IHMsIHZvaWQgKm1zZywgc2l6ZV90IGxlbiwgc3RydWN0IHNvY2thZGRyICpmcm9tLAorCQkgc29ja2xlbl90ICpmcm9tbGVuLCBzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbywKKwkJIGludCAqbXNnX2ZsYWdzKTsKKworLyogUmV0dXJuIHRoZSBhZGRyZXNzIGxlbmd0aCBmb3IgYW4gYWRkcmVzcyBmYW1pbHkuICovCitpbnQgc2N0cF9nZXRhZGRybGVuKHNhX2ZhbWlseV90IGZhbWlseSk7CisKKworI2lmZGVmIEhBVkVfU0NUUF9TRU5EVgorLyogc2VuZHYgaW5mb3R5cGUgKi8KK2VudW0geworCVNDVFBfU0VORFZfTk9JTkZPLAorCVNDVFBfU0VORFZfU05ESU5GTywKKwlTQ1RQX1NFTkRWX1BSSU5GTywKKwlTQ1RQX1NFTkRWX0FVVEhJTkZPLAorCVNDVFBfU0VORFZfU1BBCit9OworCisvKiBzZW5kdl9mbGFncyAqLworI2RlZmluZSBTQ1RQX1NFTkRfU05ESU5GT19WQUxJRAkJMHgxCisjZGVmaW5lIFNDVFBfU0VORF9QUklORk9fVkFMSUQJCTB4MgorI2RlZmluZSBTQ1RQX1NFTkRfQVVUSElORk9fVkFMSUQJMHg0CisjZW5kaWYKKworc3RydWN0IHNjdHBfc2VuZHZfc3BhIHsKKwl1aW50MzJfdCBzZW5kdl9mbGFnczsKKwlzdHJ1Y3Qgc2N0cF9zbmRpbmZvIHNlbmR2X3NuZGluZm87CisjaWZkZWYgSEFWRV9TQ1RQX1NFTkRWCisJc3RydWN0IHNjdHBfcHJpbmZvIHNlbmR2X3ByaW5mbzsKKwlzdHJ1Y3Qgc2N0cF9hdXRoaW5mbyBzZW5kdl9hdXRoaW5mbzsKKyNlbmRpZgorfTsKKworI2lmZGVmIEhBVkVfU0NUUF9TRU5EVgoraW50IHNjdHBfc2VuZHYoaW50IHMsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBpbnQgaW92Y250LAorCSAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJzLCBpbnQgYWRkcmNudCwgdm9pZCAqaW5mbywKKwkgICAgICAgc29ja2xlbl90IGluZm9sZW4sIHVuc2lnbmVkIGludCBpbmZvdHlwZSwgaW50IGZsYWdzKTsKKworLyogcmVjdnYgaW5mb3R5cGUgKi8KK2VudW0geworCVNDVFBfUkVDVlZfTk9JTkZPLAorCVNDVFBfUkVDVlZfUkNWSU5GTywKKwlTQ1RQX1JFQ1ZWX05YVElORk8sCisJU0NUUF9SRUNWVl9STgorfTsKKworc3RydWN0IHNjdHBfcmVjdnZfcm4geworCXN0cnVjdCBzY3RwX3JjdmluZm8gcmVjdnZfcmN2aW5mbzsKKwlzdHJ1Y3Qgc2N0cF9ueHRpbmZvIHJlY3Z2X254dGluZm87Cit9OworCitpbnQgc2N0cF9yZWN2dihpbnQgcywgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZsZW4sCisJICAgICAgIHN0cnVjdCBzb2NrYWRkciAqZnJvbSwgc29ja2xlbl90ICpmcm9tbGVuLCB2b2lkICppbmZvLAorCSAgICAgICBzb2NrbGVuX3QgKmluZm9sZW4sIHVuc2lnbmVkIGludCAqaW5mb3R5cGUsIGludCAqZmxhZ3MpOworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX2xpbnV4X3NjdHBfaF9fICovCmRpZmYgLS1naXQgYS9zcmMvbGliL01ha2VmaWxlLmFtIGIvc3JjL2xpYi9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjk2Y2FhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xpYi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACisjIEluY2x1ZGUgdGhlc2UgdHdvIGluIGFsbCB0aGUgTWFrZWZpbGUuYW0ncyEhIQoraW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLnZhcnMKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5ydWxlcworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLmRpcnMKKworIyBHZW5lcmFsIGNvbXBpbGF0aW9uIGZsYWdzCitBTV9DUFBGTEFHUyA9IC1JJCh0b3BfYnVpbGRkaXIpL3NyYy9pbmNsdWRlCisKK2xpYl9MVExJQlJBUklFUyA9IGxpYnNjdHAubGEKKworbGlic2N0cF9sYV9TT1VSQ0VTID0gYmluZHguYyBjb25uZWN0eC5jIHBlZWxvZmYuYyBvcHRfaW5mby5jIFwKKwkJYWRkcnMuYyBzZW5kbXNnLmMgcmVjdm1zZy5jIFZlcnNpb25zLm1hcAorbGlic2N0cF9sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyBcCisJCUBMSUJTQ1RQX0NVUlJFTlRAOkBMSUJTQ1RQX1JFVklTSU9OQDpATElCU0NUUF9BR0VAIFwKKwkJLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JChzcmNkaXIpL1ZlcnNpb25zLm1hcApkaWZmIC0tZ2l0IGEvc3JjL2xpYi9WZXJzaW9ucy5tYXAgYi9zcmMvbGliL1ZlcnNpb25zLm1hcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmFhZDVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xpYi9WZXJzaW9ucy5tYXAKQEAgLTAsMCArMSwyOCBAQAorVkVSU18xIHsKKwlnbG9iYWw6CisJCXNjdHBfZ2V0cGFkZHJzOworCQlzY3RwX2ZyZWVwYWRkcnM7CisJCXNjdHBfZ2V0bGFkZHJzOworCQlzY3RwX2ZyZWVsYWRkcnM7CisJCXNjdHBfZ2V0YWRkcmxlbjsKKwkJc2N0cF9iaW5keDsKKwkJc2N0cF9jb25uZWN0eDsKKwkJc2N0cF9vcHRfaW5mbzsKKwkJc2N0cF9wZWVsb2ZmOworCQlzY3RwX3JlY3Ztc2c7CisJCXNjdHBfcmVjdnY7CisJCXNjdHBfc2VuZG1zZzsKKwkJc2N0cF9zZW5kdjsKKwkJc2N0cF9zZW5kOworCisJbG9jYWw6CisJCSo7Cit9OworCitWRVJTXzIgeworCWdsb2JhbDoJc2N0cF9jb25uZWN0eDsKK30gVkVSU18xOworCitWRVJTXzMgeworCWdsb2JhbDoJc2N0cF9jb25uZWN0eDsKK30gVkVSU18yOwpkaWZmIC0tZ2l0IGEvc3JjL2xpYi9hZGRycy5jIGIvc3JjL2xpYi9hZGRycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZjUyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbGliL2FkZHJzLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uOiBVc2VyIEFQSSBleHRlbnNpb25zLgorICoKKyAqIGFkZHJzLmMKKyAqCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIExHUEwgdjIuMSBhcyBkZXNjcmliZWQgaW4KKyAqICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9sZXNzZXIudHh0IAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSB1c2VyIGxpYnJhcnkgdGhhdCBvZmZlcnMgc3VwcG9ydCBmb3IgdGhlCisgKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbi4gVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzCisgKiBjb2RlIGlzIHRvIHByb3ZpZGUgdGhlIFNDVFAgU29ja2V0IEFQSSBtYXBwaW5ncyBmb3IgdXNlcgorICogYXBwbGljYXRpb24gdG8gaW50ZXJmYWNlIHdpdGggdGhlIFNDVFAgaW4ga2VybmVsLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIFNvY2tldCBBUEkgRXh0ZW5zaW9ucyBmb3IgU0NUUAorICogZGVmaW5lZCBpbiA8ZHJhZnQtaWV0Zi10c3Z3Zy1zY3Rwc29ja2V0LTEwLnR4dC4KKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBJbnRlbCBDb3JwLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgQXJkZWxsZSBGYW4gICAgIDxhcmRlbGxlLmZhbkBpbnRlbC5jb20+CisgKiAgU3JpZGhhciBTYW11ZHJhbGEgPHNyaUB1cy5pYm0uY29tPgorICogIEl2YW4gU2t5dHRlIErDuHJnZW5zZW4gPGlzai1zY3RwQGkxLmRrPgorICovCisKKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9zY3RwLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworLyogCisgKiBDb21tb24gZ2V0c29ja29wdCgpIGxheWVyIAorICogSWYgdGhlIE5FVyBnZXRzb2Nrb3B0KCkgQVBJIGZhaWxzIHRoaXMgZnVuY3Rpb24gd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcKKyAqIHRoZSBvbGQgQVBJCisgKi8KK3N0YXRpYyBpbnQKK3NjdHBfZ2V0YWRkcnMoaW50IHNkLCBzY3RwX2Fzc29jX3QgaWQsIGludCBvcHRuYW1lX25ldywKKwkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKiphZGRycykKK3sKKwlpbnQgY250LCBlcnI7CisJc29ja2xlbl90IGxlbjsKKwlzaXplX3QgYnVmc2l6ZSA9IDQwOTY7IC8qZW5vdWdoIGZvciBtb3N0IGNhc2VzKi8KKworCXN0cnVjdCBzY3RwX2dldGFkZHJzICpnZXRhZGRycyA9IChzdHJ1Y3Qgc2N0cF9nZXRhZGRycyopbWFsbG9jKGJ1ZnNpemUpOworCWlmKCFnZXRhZGRycykKKwkJcmV0dXJuIC0xOworCQorCWZvcig7OykgeworCQljaGFyICpuZXdfYnVmOworCisJCWxlbiA9IGJ1ZnNpemU7CisJCWdldGFkZHJzLT5hc3NvY19pZCA9IGlkOworCQllcnIgPSBnZXRzb2Nrb3B0KHNkLCBTT0xfU0NUUCwgb3B0bmFtZV9uZXcsIGdldGFkZHJzLCAmbGVuKTsKKwkJaWYgKGVyciA9PSAwKSB7CisJCQkvKmdvdCBpdCovCisJCQlicmVhazsKKwkJfQorCQlpZiAoZXJybm8gIT0gRU5PTUVNICkgeworCQkJLyp1bmtub3duIGVycm9yKi8KKwkJCWZyZWUoZ2V0YWRkcnMpOworCQkJcmV0dXJuIC0xOworCQl9CisJCS8qZXhwYW5kIGJ1ZmZlciovCisJCWlmIChidWZzaXplID4gMTI4KjEwMjQpIHsKKwkJCS8qdGhpcyBpcyBnZXR0aW5nIHJpZGljdWxvdXMqLworCQkJZnJlZShnZXRhZGRycyk7CisJCQllcnJubyA9IEVOT0JVRlM7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbmV3X2J1ZiA9IHJlYWxsb2MoZ2V0YWRkcnMsIGJ1ZnNpemUrNDA5Nik7CisJCWlmICghbmV3X2J1ZikgeworCQkJZnJlZShnZXRhZGRycyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnVmc2l6ZSArPSA0MDk2OworCQlnZXRhZGRycyA9IChzdHJ1Y3Qgc2N0cF9nZXRhZGRycyopbmV3X2J1ZjsKKwl9CisKKwkvKiB3ZSBza2lwIHRyYXZlcnNpbmcgdGhlIGxpc3QsIGFsbG9jYXRpbmcgYSBuZXcgYnVmZmVyIGV0Yy4gYW5kIGVuam95CisJICogYSBzaW1wbGUgaGFjayovCisJY250ID0gZ2V0YWRkcnMtPmFkZHJfbnVtOworCW1lbW1vdmUoZ2V0YWRkcnMsIGdldGFkZHJzICsgMSwgbGVuKTsKKwkqYWRkcnMgPSAoc3RydWN0IHNvY2thZGRyKilnZXRhZGRyczsKKworCXJldHVybiBjbnQ7Cit9IC8qIHNjdHBfZ2V0YWRkcnMoKSAqLworCisvKiBHZXQgYWxsIHBlZXIgYWRkcmVzcyBvbiBhIHNvY2tldC4gIFRoaXMgaXMgYSBuZXcgU0NUUCBBUEkKKyAqIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA4LjMgb2YgdGhlIFNvY2tldHMgQVBJIEV4dGVuc2lvbnMgZm9yIFNDVFAuCisgKiBUaGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBnZXRzb2Nrb3B0KCkgaW50ZXJmYWNlLgorICovCitpbnQKK3NjdHBfZ2V0cGFkZHJzKGludCBzZCwgc2N0cF9hc3NvY190IGlkLCBzdHJ1Y3Qgc29ja2FkZHIgKiphZGRycykKK3sKKwlyZXR1cm4gc2N0cF9nZXRhZGRycyhzZCwgaWQsCisJCQkgICAgIFNDVFBfR0VUX1BFRVJfQUREUlMsCisJCQkgICAgIGFkZHJzKTsKK30gLyogc2N0cF9nZXRwYWRkcnMoKSAqLworCisvKiBGcmVlcyBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBzY3RwX2dldHBhZGRycygpLiAgVGhpcyBpcyBhIG5ldyBTQ1RQIEFQSQorICogZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIDguNCBvZiB0aGUgU29ja2V0cyBBUEkgRXh0ZW5zaW9ucyBmb3IgU0NUUC4KKyAqLworaW50CitzY3RwX2ZyZWVwYWRkcnMoc3RydWN0IHNvY2thZGRyICphZGRycykKK3sKKwlmcmVlKGFkZHJzKTsKKwlyZXR1cm4gMDsKKworfSAvKiBzY3RwX2ZyZWVwYWRkcnMoKSAqLworCisvKiBHZXQgYWxsIGxvY2FsbHkgYm91bmQgYWRkcmVzcyBvbiBhIHNvY2tldC4gIFRoaXMgaXMgYSBuZXcgU0NUUCBBUEkKKyAqIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA4LjUgb2YgdGhlIFNvY2tldHMgQVBJIEV4dGVuc2lvbnMgZm9yIFNDVFAuCisgKiBUaGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBnZXRzb2Nrb3B0KCkgaW50ZXJmYWNlLgorICovCitpbnQKK3NjdHBfZ2V0bGFkZHJzKGludCBzZCwgc2N0cF9hc3NvY190IGlkLCBzdHJ1Y3Qgc29ja2FkZHIgKiphZGRycykKK3sKKwlyZXR1cm4gc2N0cF9nZXRhZGRycyhzZCwgaWQsCisJCQkgICAgIFNDVFBfR0VUX0xPQ0FMX0FERFJTLAorCQkJICAgICBhZGRycyk7Cit9IC8qIHNjdHBfZ2V0bGFkZHJzKCkgKi8KKworLyogRnJlZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgc2N0cF9nZXRsYWRkcnMoKS4gIFRoaXMgaXMgYSBuZXcgU0NUUCBBUEkKKyAqIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbiA4LjYgb2YgdGhlIFNvY2tldHMgQVBJIEV4dGVuc2lvbnMgZm9yIFNDVFAuCisgKi8KK2ludAorc2N0cF9mcmVlbGFkZHJzKHN0cnVjdCBzb2NrYWRkciAqYWRkcnMpCit7CisJZnJlZShhZGRycyk7CisJcmV0dXJuIDA7CisKK30gLyogc2N0cF9mcmVlbGFkZHJzKCkgKi8KKworaW50CitzY3RwX2dldGFkZHJsZW4oc2FfZmFtaWx5X3QgZmFtaWx5KQoreworCS8qIFdlIGNvdWxkIGNhbGwgaW50byB0aGUga2VybmVsIHRvIHNlZSB3aGF0IGl0IHRoaW5rcyB0aGUgc2l6ZSBzaG91bGQKKwkgKiBiZSwgYnV0IGhhcmRjb2RpbmcgdGhlIGFkZHJlc3MgZmFtaWxpZXMgaGVyZSBpczogKGEpIGZhc3RlciwKKwkgKiAoYikgZWFzaWVyLCBhbmQgKGMpIHByb2JhYmx5IGdvb2QgZW5vdWdoIGZvciBmb3JzZWVhYmxlIGZ1dHVyZS4KKwkgKi8KKwlzd2l0Y2goZmFtaWx5KSB7CisJY2FzZSBBRl9JTkVUOgorCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJY2FzZSBBRl9JTkVUNjoKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwlkZWZhdWx0OgorCQkvKiBDdXJyZW50bHkgdGhlcmUgaXMgbm8gZGVmaW5lZCBlcnJvciBoYW5kbGluZyBpbgorCQkgKiBkcmFmdC1pZXRmLXRzdndnLXNjdHBzb2NrZXQtMTMudHh0LgorCQkgKiAtMSBtaWdodCBjYXVzZSB0aGUgYXBwbGljYXRpb24gdG8gb3ZlcndyaXRlIGJ1ZmZlcgorCQkgKiBvciBtaXNpbnRlcnByZXQgZGF0YS4gMCBpcyBtb3JlIGxpa2VseSB0byBjYXVzZQorCQkgKiBhbiBlbmRsZXNzIGxvb3AuCisJCSAqLworCQlyZXR1cm4gMDsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvbGliL2JpbmR4LmMgYi9zcmMvbGliL2JpbmR4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0NDg3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9saWIvYmluZHguYwpAQCAtMCwwICsxLDc4IEBACisvKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbjogVXNlciBBUEkgZXh0ZW5zaW9ucy4KKyAqCisgKiBiaW5keC5jCisgKgorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBMR1BMIHYyLjEgYXMgZGVzY3JpYmVkIGluCisgKiAgICBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvbGVzc2VyLnR4dCAKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgdXNlciBsaWJyYXJ5IHRoYXQgb2ZmZXJzIHN1cHBvcnQgZm9yIHRoZQorICogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24uIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcworICogY29kZSBpcyB0byBwcm92aWRlIHRoZSBTQ1RQIFNvY2tldCBBUEkgbWFwcGluZ3MgZm9yIHVzZXIKKyAqIGFwcGxpY2F0aW9uIHRvIGludGVyZmFjZSB3aXRoIHRoZSBTQ1RQIGluIGtlcm5lbC4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBTb2NrZXQgQVBJIEV4dGVuc2lvbnMgZm9yIFNDVFAKKyAqIGRlZmluZWQgaW4gPGRyYWZ0LWlldGYtdHN2d2ctc2N0cHNvY2tldC0xMC50eHQuCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwMworICogQ29weXJpZ2h0IChjKSAyMDAyIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgIExhIE1vbnRlIEguUC4gWWFycm9sbCA8cGlnZ3lAYWNtLm9yZz4KKyAqICAgRGFpc3kgQ2hhbmcgICAgICAgICAgIDxkYWlzeWNAdXMuaWJtLmNvbT4KKyAqICAgSW5ha3kgUGVyZXotR29uemFsZXogIDxpbmFreS5nb256YWxlekBpbnRlbC5jb20+CisgKiAgIFNyaWRoYXIgU2FtdWRyYWxhICAgICA8c3JpQHVzLmlibS5jb20+CisgKi8KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4gICAvKiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSwgc2V0c29ja29wdCgpICovCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPiAvKiBTQ1RQX1NPQ0tPUFRfQklORFhfKiAqLworI2luY2x1ZGUgPGVycm5vLmg+CisKKy8qIFN1cHBvcnQgdGhlIHNjdHBfYmluZHgoKSBpbnRlcmZhY2UuCisgKgorICogU2VlIFNvY2tldHMgQVBJIEV4dGVuc2lvbnMgZm9yIFNDVFAuIFNlY3Rpb24gOC4xLgorICoKKyAqIEluc3RlYWQgb2YgaW1wbGVtZW50aW5nIHRocm91Z2ggYSBzb2NrZXQgY2FsbCBpbiBzeXNfc29ja2V0Y2FsbCgpLAorICogdHVubmVsIHRoZSByZXF1ZXN0IHRocm91Z2ggc2V0c29ja29wdCgpLgorICovCitpbnQKK3NjdHBfYmluZHgoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJzLCBpbnQgYWRkcmNudCwgaW50IGZsYWdzKQoreworCWludCBzZXRzb2NrX29wdGlvbiA9IDA7CisJY29uc3QgY2hhciAqYWRkcmJ1ZjsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhX2FkZHI7CisJc29ja2xlbl90IGFkZHJzX3NpemUgPSAwOworCWludCBpOworCisJc3dpdGNoIChmbGFncykgeworCWNhc2UgU0NUUF9CSU5EWF9BRERfQUREUjoKKwkJc2V0c29ja19vcHRpb24gPSBTQ1RQX1NPQ0tPUFRfQklORFhfQUREOworCQlicmVhazsKKwljYXNlIFNDVFBfQklORFhfUkVNX0FERFI6CisJCXNldHNvY2tfb3B0aW9uID0gU0NUUF9TT0NLT1BUX0JJTkRYX1JFTTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldHVybiAtMTsKKwl9CisKKwlhZGRyYnVmID0gKGNoYXIqKWFkZHJzOworCWZvciAoaSA9IDA7IGkgPCBhZGRyY250OyBpKyspIHsKKwkJc2FfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyYnVmOworCQlzd2l0Y2ggKHNhX2FkZHItPnNhX2ZhbWlseSkgeworCQljYXNlIEFGX0lORVQ6CisJCQlhZGRyc19zaXplICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJYWRkcmJ1ZiArPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwkJCWJyZWFrOworCQljYXNlIEFGX0lORVQ2OgorCQkJYWRkcnNfc2l6ZSArPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisJCQlhZGRyYnVmICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJybm8gPSBFSU5WQUw7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJCQkKKwlyZXR1cm4gc2V0c29ja29wdChmZCwgU09MX1NDVFAsIHNldHNvY2tfb3B0aW9uLCBhZGRycywgYWRkcnNfc2l6ZSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvbGliL2Nvbm5lY3R4LmMgYi9zcmMvbGliL2Nvbm5lY3R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0NTUyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9saWIvY29ubmVjdHguYwpAQCAtMCwwICsxLDE5MCBAQAorLyogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb246IFVzZXIgQVBJIGV4dGVuc2lvbnMuCisgKgorICogY29ubmVjdHguYworICoKKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTEdQTCB2Mi4xIGFzIGRlc2NyaWJlZCBpbgorICogaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci50eHQuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHVzZXIgbGlicmFyeSB0aGF0IG9mZmVycyBzdXBwb3J0IGZvciB0aGUKKyAqIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uLiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMKKyAqIGNvZGUgaXMgdG8gcHJvdmlkZSB0aGUgU0NUUCBTb2NrZXQgQVBJIG1hcHBpbmdzIGZvciB1c2VyCisgKiBhcHBsaWNhdGlvbiB0byBpbnRlcmZhY2Ugd2l0aCB0aGUgU0NUUCBpbiBrZXJuZWwuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgU29ja2V0IEFQSSBFeHRlbnNpb25zIGZvciBTQ1RQCisgKiBkZWZpbmVkIGluIDxkcmFmdC1pZXRmLXRzdndnLXNjdHBzb2NrZXQtMTAudHh0LgorICoKKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEsIDIwMDUKKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICBGcmFuayBGaWx6ICAgICA8ZmZpbHpAdXMuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAgIC8qIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlLCBzZXRzb2Nrb3B0KCkgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9zY3RwLmg+IC8qIFNDVFBfU09DS09QVF9DT05ORUNUWF8qICovCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisvKiBTdXBwb3J0IHRoZSBzY3RwX2Nvbm5lY3R4KCkgaW50ZXJmYWNlLgorICoKKyAqIFNlZSBTb2NrZXRzIEFQSSBFeHRlbnNpb25zIGZvciBTQ1RQLiBTZWN0aW9uIDguMS4KKyAqCisgKiBJbnN0ZWFkIG9mIGltcGxlbWVudGluZyB0aHJvdWdoIGEgc29ja2V0IGNhbGwgaW4gc3lzX3NvY2tldGNhbGwoKSwKKyAqIHR1bm5lbCB0aGUgcmVxdWVzdCB0aHJvdWdoIHNldHNvY2tvcHQoKS4KKyAqLworc3RhdGljIGludCBfX2Nvbm5lY3R4X2FkZHJzaXplKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkcnMsCisJCQkJY29uc3QgaW50IGFkZHJjbnQpCit7CisJY29uc3QgY2hhciAqYWRkcmJ1ZjsKKwljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhX2FkZHI7CisJaW50IGFkZHJzX3NpemUgPSAwOworCWludCBpOworCisJYWRkcmJ1ZiA9IChjaGFyICopYWRkcnM7CisJZm9yIChpID0gMDsgaSA8IGFkZHJjbnQ7IGkrKykgeworCQlzYV9hZGRyID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKWFkZHJidWY7CisJCXN3aXRjaCAoc2FfYWRkci0+c2FfZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCWFkZHJzX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCQlhZGRyYnVmICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJYnJlYWs7CisJCWNhc2UgQUZfSU5FVDY6CisJCQlhZGRyc19zaXplICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJCWFkZHJidWYgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJubyA9IEVJTlZBTDsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiBhZGRyc19zaXplOworfQorCQkJCisKK2ludCBfX3NjdHBfY29ubmVjdHgoaW50IGZkLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJzLCBpbnQgYWRkcmNudCkKK3sKKwlpbnQgYWRkcnNfc2l6ZSA9IF9fY29ubmVjdHhfYWRkcnNpemUoYWRkcnMsIGFkZHJjbnQpOworCisJaWYgKGFkZHJzX3NpemUgPCAwKQorCQlyZXR1cm4gYWRkcnNfc2l6ZTsKKworCXJldHVybiBzZXRzb2Nrb3B0KGZkLCBTT0xfU0NUUCwgU0NUUF9TT0NLT1BUX0NPTk5FQ1RYX09MRCwgYWRkcnMsCisJCQkgICAgYWRkcnNfc2l6ZSk7Cit9CisKK2V4dGVybiBpbnQgc2N0cF9jb25uZWN0eF9vcmlnIChpbnQpCisJX19hdHRyaWJ1dGUgKChhbGlhcyAoIl9fc2N0cF9jb25uZWN0eCIpKSk7CisKKworc3RhdGljIGludCBfX2Nvbm5lY3R4KGludCBmZCwgc3RydWN0IHNvY2thZGRyICphZGRycywgc29ja2xlbl90IGFkZHJzX3NpemUsCisJCQlzY3RwX2Fzc29jX3QgKmlkKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoaWQpCisJCSppZCA9IDA7CisKKwlzdGF0dXMgPSBzZXRzb2Nrb3B0KGZkLCBTT0xfU0NUUCwgU0NUUF9TT0NLT1BUX0NPTk5FQ1RYLCBhZGRycywKKwkJCSAgICBhZGRyc19zaXplKTsKKworCS8qIE5vcm1hbGl6ZSBzdGF0dXMgYW5kIHNldCBhc3NvY2lhdGlvbiBpZCAqLworCWlmIChzdGF0dXMgPiAwKSB7CisJCWlmIChpZCkKKwkJCSppZCA9IHN0YXR1czsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVGhlIGVycm9yIGlzIHNvbWV0aGluZyBvdGhlciB0aGVuICJPcHRpb24gbm90IHN1cHBvcnRlZCIgKi8KKwlpZiAoc3RhdHVzIDwgMCAmJiBlcnJubyAhPSBFTk9QUk9UT09QVCkKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIEF0IHRoaXMgcG9pbnQsIGlmIHRoZSBhcHBsaWNhdGlvbiB3YW50ZWQgdGhlIGlkLCB3ZSBjYW4ndAorCSAqIHJlYWxseSBwcm92aWRlIGl0LCBzbyB3ZSBjYW4gcmV0dXJuIEVOT1BST1RPT1BULgorCSAqLworCWlmIChpZCkgeworCQllcnJubyA9IEVOT1BST1RPT1BUOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogRmluYWxseSwgdHJ5IHRoZSBvbGQgQVBJICovCisJcmV0dXJuIHNldHNvY2tvcHQoZmQsIFNPTF9TQ1RQLCBTQ1RQX1NPQ0tPUFRfQ09OTkVDVFhfT0xELAorCQkJICBhZGRycywgYWRkcnNfc2l6ZSk7Cit9CisKK2ludCBzY3RwX2Nvbm5lY3R4MihpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciAqYWRkcnMsIGludCBhZGRyY250LAorCQkgICAgICBzY3RwX2Fzc29jX3QgKmlkKQoreworCWludCBhZGRyc19zaXplID0gX19jb25uZWN0eF9hZGRyc2l6ZShhZGRycywgYWRkcmNudCk7CisKKwlpZiAoYWRkcnNfc2l6ZSA8IDApCisJCXJldHVybiBhZGRyc19zaXplOworCisJcmV0dXJuIF9fY29ubmVjdHgoZmQsIGFkZHJzLCBhZGRyc19zaXplLCBpZCk7Cit9CisKK2ludCBzY3RwX2Nvbm5lY3R4MyhpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciAqYWRkcnMsIGludCBhZGRyY250LAorCQkgICAgICBzY3RwX2Fzc29jX3QgKmlkKQoreworCWludCBhZGRyc19zaXplID0gX19jb25uZWN0eF9hZGRyc2l6ZShhZGRycywgYWRkcmNudCk7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3Qgc2N0cF9nZXRhZGRyc19vbGQgcGFyYW07CisJc29ja2xlbl90IG9wdF9sZW4gPSBzaXplb2YocGFyYW0pOworCisJaWYgKGFkZHJzX3NpemUgPCAwKQorCQlyZXR1cm4gYWRkcnNfc2l6ZTsKKworCS8qIEZpcnN0IHRyeSB0aGUgbmV3IHNvY2tldCBhcGkKKwkgKiBCZWNhdXNlIHRoZSBpZCBpcyByZXR1cm5lZCBpbiB0aGUgb3B0aW9uIGJ1ZmZlciB3ZSBoYXZlIHByZXBlbmQKKwkgKiAzMmJpdCB0byBpdCBmb3IgdGhlIHJldHVybmVkIGFzc29jaWF0aW9uIGlkCisJICovCisJcGFyYW0uYXNzb2NfaWQgPSAwOworCXBhcmFtLmFkZHJfbnVtID0gYWRkcnNfc2l6ZTsKKwlwYXJhbS5hZGRycyA9IGFkZHJzOworCXN0YXR1cyA9IGdldHNvY2tvcHQoZmQsIFNPTF9TQ1RQLCBTQ1RQX1NPQ0tPUFRfQ09OTkVDVFgzLAorCQkgICAgICAgICAgICAmcGFyYW0sICZvcHRfbGVuKTsKKwlpZiAoc3RhdHVzID09IDAgfHwgZXJybm8gPT0gRUlOUFJPR1JFU1MpIHsKKwkJLyogU3VjY2VlZGVkIGltbWVkaWF0ZWx5LCBvciBpbml0aWF0ZWQgb24gbm9uLWJsb2NraW5nCisJCSAqIHNvY2tldC4KKwkJICovCisJCWlmIChpZCkKKwkJCSppZCA9IHBhcmFtLmFzc29jX2lkOworCX0KKworCWlmIChlcnJubyAhPSBFTk9QUk9UT09QVCkgeworCQkvKiBObyBwb2ludCBpbiB0cnlpbmcgdGhlIGZhbGxiYWNrcyovCisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogVGhlIGZpcnN0IGluY2FybmF0aW9uIG9mIHVwZGF0ZWQgY29ubmVjdHggYXBpIGRpZG4ndCB3b3JrIGZvcgorCSAqIG5vbi1ibG9ja2luZyBzb2NrZXRzLiAgU28gaWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRoZSBhc3NvY2lhdGlvbgorCSAqIGlkIGFuZCB0aGUgc29ja2V0IGlzIG5vbi1ibG9ja2luZywgd2UgY2FuJ3QgcmVhbGx5IGRvIGFueXRoaW5nLgorCSAqLworCWlmIChpZCkgeworCQkvKiBQcm9ncmFtIHdhbnRzIHRoZSBhc3NvY2lhdGlvbi1pZCByZXR1cm5lZC4gV2UgY2FuIG9ubHkgZG8KKwkJICogdGhhdCBpZiB0aGUgc29ja2V0IGlzIGJsb2NraW5nICovCisJCXN0YXR1cyA9IGZjbnRsKGZkLCBGX0dFVEZMKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlyZXR1cm4gc3RhdHVzOworCisJCWlmIChzdGF0dXMgJiBPX05PTkJMT0NLKSB7CisJCQkvKiBTb2NrZXQgaXMgbm9uLWJsb2NraW5nLiBGYWlsICovCisJCQllcnJubyA9IEVOT1BST1RPT1BUOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIF9fY29ubmVjdHgoZmQsIGFkZHJzLCBhZGRyc19zaXplLCBpZCk7Cit9CisKKyNkZWZpbmUgX19TWU1QRlgocGZ4LCBzeW0pICNwZnggc3ltCisjZGVmaW5lIF9TWU1QRlgocGZ4LCBzeW0pIF9fU1lNUEZYKHBmeCwgc3ltKQorI2RlZmluZSBTWU1QRlgoc3ltKSBfU1lNUEZYKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgI3N5bSkKKyNkZWZpbmUgU1lNVkVSKG5hbWUsIG5hbWUyKSBfX2FzbV9fKCIuc3ltdmVyICIgU1lNUEZYKG5hbWUpICIsIiBTWU1QRlgobmFtZTIpKQorCitTWU1WRVIoX19zY3RwX2Nvbm5lY3R4LCBzY3RwX2Nvbm5lY3R4QCk7CitTWU1WRVIoc2N0cF9jb25uZWN0eF9vcmlnLCBzY3RwX2Nvbm5lY3R4QFZFUlNfMSk7CitTWU1WRVIoc2N0cF9jb25uZWN0eDIsIHNjdHBfY29ubmVjdHhAVkVSU18yKTsKK1NZTVZFUihzY3RwX2Nvbm5lY3R4Mywgc2N0cF9jb25uZWN0eEBAVkVSU18zKTsKZGlmZiAtLWdpdCBhL3NyYy9saWIvb3B0X2luZm8uYyBiL3NyYy9saWIvb3B0X2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWM4MzA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xpYi9vcHRfaW5mby5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uOiBVc2VyIEFQSSBleHRlbnNpb25zLgorICoKKyAqIG9wdF9pbmZvLmMKKyAqCisgKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIExHUEwgdjIuMSBhcyBkZXNjcmliZWQgaW4KKyAqICAgIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9sZXNzZXIudHh0IAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSB1c2VyIGxpYnJhcnkgdGhhdCBvZmZlcnMgc3VwcG9ydCBmb3IgdGhlCisgKiBTQ1RQIGtlcm5lbCBJbXBsZW1lbnRhdGlvbi4gVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzCisgKiBjb2RlIGlmIHRvIHByb3ZpZGUgdGhlIFNDVFAgU29ja2V0IEFQSSBtYXBwaW5ncyBmb3IgdXNlcgorICogYXBwbGljYXRpb24gdG8gaW50ZXJmYWNlIHdpdGggdGhlIFNDVFAgaW4ga2VybmVsLgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIFNvY2tldCBBUEkgRXh0ZW5zaW9ucyBmb3IgU0NUUAorICogZGVmaW5lZCBpbiA8ZHJhZnQtaWV0Zi10c3Z3Zy1zY3Rwc29ja2V0LTEwLnR4dC4KKyAqCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICAgQXJkZWxsZSBGYW4gPGFyZGVsbGUuZmFuQGludGVsLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAgIC8qIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlLCBzZXRzb2Nrb3B0KCkgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4gLyogU0NUUF9TT0NLT1BUX0JJTkRYXyogKi8KKyNpbmNsdWRlIDxlcnJuby5oPgorCisvKiBTdXBwb3J0IHRoZSBzY3RwX29wdF9pbmZvKCkgaW50ZXJmYWNlLgorICoKKyAqIFNlZSBTb2NrZXRzIEFQSSBFeHRlbnNpb25zIGZvciBTQ1RQLiBTZWN0aW9uIDcuCisgKgorICogUGFzcyBzY3RwIG9wdGlvbiBpbmZvcm1hdGlvbiBwYXNzIGJvdGggaW4gdG8gYW5kIG91dCBvZiB0aGUgU0NUUCBzdGFjay4KKyAqIFRoaXMgaXMgYSBuZXcgU0NUUCBBUEkgZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIDcgb2YgdGhlIFNvY2tldHMgQVBJCisgKiBFeHRlbnNpb25zIGZvciBTQ1RQLiBUaGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBnZXRzb2Nrb3B0KCkgaW50ZXJmYWNlLgorICovCitpbnQKK3NjdHBfb3B0X2luZm8oaW50IHNkLCBzY3RwX2Fzc29jX3QgaWQsIGludCBvcHQsIHZvaWQgKmFyZywgc29ja2xlbl90ICpzaXplKQoreworCXN3aXRjaCAob3B0KSB7CisJY2FzZSBTQ1RQX1JUT0lORk86CisJY2FzZSBTQ1RQX0FTU09DSU5GTzoKKwljYXNlIFNDVFBfSU5JVE1TRzoKKwljYXNlIFNDVFBfTk9ERUxBWToKKwljYXNlIFNDVFBfQVVUT0NMT1NFOgorCWNhc2UgU0NUUF9QUklNQVJZX0FERFI6CisJY2FzZSBTQ1RQX0RJU0FCTEVfRlJBR01FTlRTOgorCWNhc2UgU0NUUF9QRUVSX0FERFJfUEFSQU1TOgorCWNhc2UgU0NUUF9ERUZBVUxUX1NFTkRfUEFSQU06CisJY2FzZSBTQ1RQX0VWRU5UUzoKKwljYXNlIFNDVFBfSV9XQU5UX01BUFBFRF9WNF9BRERSOgorCWNhc2UgU0NUUF9NQVhTRUc6CisJY2FzZSBTQ1RQX1NUQVRVUzoKKwljYXNlIFNDVFBfR0VUX1BFRVJfQUREUl9JTkZPOgorCWNhc2UgU0NUUF9BVVRIX0FDVElWRV9LRVk6CisJY2FzZSBTQ1RQX1BFRVJfQVVUSF9DSFVOS1M6CisJY2FzZSBTQ1RQX0xPQ0FMX0FVVEhfQ0hVTktTOgorCQkqKHNjdHBfYXNzb2NfdCAqKWFyZyA9IGlkOworCQlyZXR1cm4gZ2V0c29ja29wdChzZCwgSVBQUk9UT19TQ1RQLCBvcHQsIGFyZywgc2l6ZSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIEVOT1RTVVA7CisJfQorCit9IC8qIHNjdHBfb3B0X2luZm8oKSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2xpYi9wZWVsb2ZmLmMgYi9zcmMvbGliL3BlZWxvZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGUxZWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xpYi9wZWVsb2ZmLmMKQEAgLTAsMCArMSw3MiBAQAorLyogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb246IFVzZXIgQVBJIGV4dGVuc2lvbnMuCisgKgorICogcGVlbG9mZi5jCisgKgorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBMR1BMIHYyLjEgYXMgZGVzY3JpYmVkIGluCisgKiAgICBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvbGVzc2VyLnR4dCAKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgdXNlciBsaWJyYXJ5IHRoYXQgb2ZmZXJzIHN1cHBvcnQgZm9yIHRoZQorICogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24uIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcworICogY29kZSBpcyB0byBwcm92aWRlIHRoZSBTQ1RQIFNvY2tldCBBUEkgbWFwcGluZ3MgZm9yIHVzZXIKKyAqIGFwcGxpY2F0aW9uIHRvIGludGVyZmFjZSB3aXRoIHRoZSBTQ1RQIGluIGtlcm5lbC4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBTb2NrZXQgQVBJIEV4dGVuc2lvbnMgZm9yIFNDVFAKKyAqIGRlZmluZWQgaW4gPGRyYWZ0LWlldGYtdHN2d2ctc2N0cHNvY2tldC0xMC50eHQuCisgKgorICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwMworICogCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OiAKKyAqICBTcmlkaGFyIFNhbXVkcmFsYSAgICAgPHNyaUB1cy5pYm0uY29tPgorICovCisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+ICAgLyogc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UsIHNldHNvY2tvcHQoKSAqLworI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPiAvKiBTQ1RQX1NPQ0tPUFRfQklORFhfKiAqLworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpZmRlZiBIQVZFX1NDVFBfUEVFTE9GRl9GTEFHUworaW50CitzY3RwX3BlZWxvZmZfZmxhZ3MoaW50IGZkLCBzY3RwX2Fzc29jX3QgYXNzb2NpZCwgdW5zaWduZWQgZmxhZ3MpCit7CisJc29ja2xlbl90IHBlZWxvZmZfc2l6ZSA9IHNpemVvZihzY3RwX3BlZWxvZmZfZmxhZ3NfYXJnX3QpOworCXNjdHBfcGVlbG9mZl9mbGFnc19hcmdfdCBwZWVsb2ZmOworCWludCBlcnI7CisKKwlpZiAoIWZsYWdzKQorCQlyZXR1cm4gc2N0cF9wZWVsb2ZmKGZkLCBhc3NvY2lkKTsKKworCXBlZWxvZmYucF9hcmcuYXNzb2NpZCA9IGFzc29jaWQ7CisJcGVlbG9mZi5wX2FyZy5zZCA9IDA7CisJcGVlbG9mZi5mbGFncyA9IGZsYWdzOworCisJZXJyID0gZ2V0c29ja29wdChmZCwgU09MX1NDVFAsIFNDVFBfU09DS09QVF9QRUVMT0ZGX0ZMQUdTLCAmcGVlbG9mZiwKKwkJCSAmcGVlbG9mZl9zaXplKTsKKworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHBlZWxvZmYucF9hcmcuc2Q7Cit9CisjZW5kaWYKKworLyogQnJhbmNoIG9mZiBhbiBhc3NvY2lhdGlvbiBpbnRvIGEgc2VwZXJhdGUgc29ja2V0LiAgVGhpcyBpcyBhIG5ldyBTQ1RQIEFQSQorICogZGVzY3JpYmVkIGluIHRoZSBzZWN0aW9uIDguMiBvZiB0aGUgU29ja2V0cyBBUEkgRXh0ZW5zaW9ucyBmb3IgU0NUUC4gCisgKiBUaGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBnZXRzb2Nrb3B0KCkgaW50ZXJmYWNlLgorICovCitpbnQKK3NjdHBfcGVlbG9mZihpbnQgZmQsIHNjdHBfYXNzb2NfdCBhc3NvY2lkKQoreworCXNvY2tsZW5fdCBwZWVsb2ZmX3NpemUgPSBzaXplb2Yoc2N0cF9wZWVsb2ZmX2FyZ190KTsKKwlzY3RwX3BlZWxvZmZfYXJnX3QgcGVlbG9mZjsKKwlpbnQgZXJyOworCisJcGVlbG9mZi5hc3NvY2lkID0gYXNzb2NpZDsKKwlwZWVsb2ZmLnNkID0gMDsKKworCWVyciA9IGdldHNvY2tvcHQoZmQsIFNPTF9TQ1RQLCBTQ1RQX1NPQ0tPUFRfUEVFTE9GRiwgJnBlZWxvZmYsCisJCQkgJnBlZWxvZmZfc2l6ZSk7CisKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBwZWVsb2ZmLnNkOworfQpkaWZmIC0tZ2l0IGEvc3JjL2xpYi9yZWN2bXNnLmMgYi9zcmMvbGliL3JlY3Ztc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGZlMDYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xpYi9yZWN2bXNnLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uOiBVc2VyIEFQSSBleHRlbnNpb25zLgorICoKKyAqIHNjdHBfcmVjdm1zZy5jCisgKgorICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBMR1BMIHYyLjEgYXMgZGVzY3JpYmVkIGluCisgKiAgICBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvbGVzc2VyLnR4dCAKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgdXNlciBsaWJyYXJ5IHRoYXQgb2ZmZXJzIHN1cHBvcnQgZm9yIHRoZQorICogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24uIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhpcworICogY29kZSBpcyB0byBwcm92aWRlIHRoZSBTQ1RQIFNvY2tldCBBUEkgbWFwcGluZ3MgZm9yIHVzZXIKKyAqIGFwcGxpY2F0aW9uIHRvIGludGVyZmFjZSB3aXRoIHRoZSBTQ1RQIGluIGtlcm5lbC4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBTb2NrZXQgQVBJIEV4dGVuc2lvbnMgZm9yIFNDVFAKKyAqIGRlZmluZWQgaW4gPGRyYWZ0LWlldGYtdHN2d2ctc2N0cHNvY2tldC0xMC50eHQ+CisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMsIENvcnAuCisgKgorICogV3JpdHRlbiBvciBtb2RpZmllZCBieToKKyAqICBSeWFuIExheWVyCTxybWxheWVyQHVzLmlibS5jb20+CisgKgorICogQW4gaW1wbGVtZW50YXRpb24gbWF5IHByb3ZpZGUgYSBsaWJyYXJ5IGZ1bmN0aW9uIChvciBwb3NzaWJseSBzeXN0ZW0KKyAqIGNhbGwpIHRvIGFzc2lzdCB0aGUgdXNlciB3aXRoIHRoZSBhZHZhbmNlZCBmZWF0dXJlcyBvZiBTQ1RQLiBOb3RlCisgKiB0aGF0IGluIG9yZGVyIGZvciB0aGUgc2N0cF9zbmRyY3ZpbmZvIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgaW4gYnkKKyAqIHNjdHBfcmVjdm1zZygpIHRoZSBjYWxsZXIgbXVzdCBlbmFibGUgdGhlIHNjdHBfZGF0YV9pb19ldmVudHMgd2l0aAorICogdGhlIFNDVFBfRVZFTlRTIG9wdGlvbi4KKyAqIAorICogc2N0cF9yZWN2bXNnKCkuIEl0cyBzeW50YXggaXMsCisgKiAKKyAqIGludCBzY3RwX3JlY3Ztc2coaW50IHMsCisgKgkJICAgIHZvaWQgKm1zZywKKyAqCQkgICAgc2l6ZV90IGxlbiwKKyAqCQkgICAgc3RydWN0IHNvY2thZGRyICpmcm9tLAorICoJCSAgICBzb2NrbGVuX3QgKmZyb21sZW4sCisgKgkJICAgIHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvLAorICoJCSAgICBpbnQgKm1zZ19mbGFncykKKyAqIAorICogCisgKiBzICAgICAgICAgIC0gaXMgdGhlIHNvY2tldCBkZXNjcmlwdG9yCisgKiBtc2cgICAgICAgIC0gaXMgYSBtZXNzYWdlIGJ1ZmZlciB0byBiZSBmaWxsZWQuCisgKiBsZW4gICAgICAgIC0gaXMgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZSBidWZmZXIuCisgKiBmcm9tICAgICAgIC0gaXMgYSBwb2ludGVyIHRvIGEgYWRkcmVzcyB0byBiZSBmaWxsZWQgd2l0aAorICoJCXRoZSBzZW5kZXIgb2YgdGhpcyBtZXNzYWdlcyBhZGRyZXNzLgorICogZnJvbWxlbiAgICAtIGlzIHRoZSBmcm9tIGxlbmd0aC4KKyAqIHNpbmZvICAgICAgLSBBIHBvaW50ZXIgdG8gYSBzY3RwX3NuZHJjdmluZm8gc3RydWN0dXJlCisgKgkJdG8gYmUgZmlsbGVkIHVwb24gcmVjZWlwdCBvZiB0aGUgbWVzc2FnZS4KKyAqIG1zZ19mbGFncyAgLSBBIHBvaW50ZXIgdG8gYSBpbnRlZ2VyIHRvIGJlIGZpbGxlZCB3aXRoCisgKgkJYW55IG1lc3NhZ2UgZmxhZ3MgKGUuZy4gTVNHX05PVElGSUNBVElPTikuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAgIC8qIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlLCBzZXRzb2Nrb3B0KCkgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L3NjdHAuaD4KKworaW50IHNjdHBfcmVjdm1zZyhpbnQgcywgdm9pZCAqbXNnLCBzaXplX3QgbGVuLCBzdHJ1Y3Qgc29ja2FkZHIgKmZyb20sCisJCSBzb2NrbGVuX3QgKmZyb21sZW4sIHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvLAorCQkgaW50ICptc2dfZmxhZ3MpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJc3RydWN0IG1zZ2hkciBpbm1zZzsKKwljaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSldOworCXN0cnVjdCBjbXNnaGRyICpjbXNnID0gTlVMTDsKKworCW1lbXNldCgmaW5tc2csIDAsIHNpemVvZiAoaW5tc2cpKTsKKworCWlvdi5pb3ZfYmFzZSA9IG1zZzsKKwlpb3YuaW92X2xlbiA9IGxlbjsKKworCWlubXNnLm1zZ19uYW1lID0gZnJvbTsKKwlpbm1zZy5tc2dfbmFtZWxlbiA9IGZyb21sZW4gPyAqZnJvbWxlbiA6IDA7CisJaW5tc2cubXNnX2lvdiA9ICZpb3Y7CisJaW5tc2cubXNnX2lvdmxlbiA9IDE7CisJaW5tc2cubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisJaW5tc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKworCWVycm9yID0gcmVjdm1zZyhzLCAmaW5tc2csIG1zZ19mbGFncyA/ICptc2dfZmxhZ3MgOiAwKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoZnJvbWxlbikKKwkJKmZyb21sZW4gPSBpbm1zZy5tc2dfbmFtZWxlbjsKKwlpZiAobXNnX2ZsYWdzKQorCQkqbXNnX2ZsYWdzID0gaW5tc2cubXNnX2ZsYWdzOworCisJaWYgKCFzaW5mbykKKwkJcmV0dXJuIGVycm9yOworCisJZm9yIChjbXNnID0gQ01TR19GSVJTVEhEUigmaW5tc2cpOyBjbXNnICE9IE5VTEw7CisJCQkJIGNtc2cgPSBDTVNHX05YVEhEUigmaW5tc2csIGNtc2cpKXsKKwkJaWYgKChJUFBST1RPX1NDVFAgPT0gY21zZy0+Y21zZ19sZXZlbCkgJiYKKwkJICAgIChTQ1RQX1NORFJDViA9PSBjbXNnLT5jbXNnX3R5cGUpKQorCQkJYnJlYWs7CisJfQorCisgICAgICAgIC8qIENvcHkgc2luZm8uICovCisJaWYgKGNtc2cpCisJCW1lbWNweShzaW5mbywgQ01TR19EQVRBKGNtc2cpLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCisJcmV0dXJuIChlcnJvcik7Cit9CisKKyNpZmRlZiBIQVZFX1NDVFBfU0VORFYKK2ludCBzY3RwX3JlY3Z2KGludCBzLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdmxlbiwKKwkgICAgICAgc3RydWN0IHNvY2thZGRyICpmcm9tLCBzb2NrbGVuX3QgKmZyb21sZW4sIHZvaWQgKmluZm8sCisJICAgICAgIHNvY2tsZW5fdCAqaW5mb2xlbiwgdW5zaWduZWQgaW50ICppbmZvdHlwZSwgaW50ICpmbGFncykKK3sKKwljaGFyIGluY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9yY3ZpbmZvKSArCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX254dGluZm8pKV07CisJaW50IGVycm9yLCBsZW4sIF9pbmZvbGVuOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCXN0cnVjdCBtc2doZHIgaW5tc2c7CisKKwltZW1zZXQoJmlubXNnLCAwLCBzaXplb2YoaW5tc2cpKTsKKworCS8qIHNldCBmcm9tIGFuZCBpb3YgKi8KKwlpbm1zZy5tc2dfbmFtZSA9IGZyb207CisJaW5tc2cubXNnX25hbWVsZW4gPSBmcm9tbGVuID8gKmZyb21sZW4gOiAwOworCWlubXNnLm1zZ19pb3YgPSAoc3RydWN0IGlvdmVjICopaW92OworCWlubXNnLm1zZ19pb3ZsZW4gPSBpb3ZsZW47CisJaW5tc2cubXNnX2NvbnRyb2wgPSBpbmNtc2c7CisJaW5tc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2YoaW5jbXNnKTsKKworCWVycm9yID0gcmVjdm1zZyhzLCAmaW5tc2csIGZsYWdzID8gKmZsYWdzIDogMCk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJLyogc2V0IGZyb21sZW4sIGZyYWdzICovCisJaWYgKGZyb21sZW4pCisJCSpmcm9tbGVuID0gaW5tc2cubXNnX25hbWVsZW47CisKKwlpZiAoZmxhZ3MpCisJCSpmbGFncyA9IGlubXNnLm1zZ19mbGFnczsKKworCWlmICghaW5mbyB8fCAhaW5mb3R5cGUgfHwgIWluZm9sZW4pCisJCXJldHVybiBlcnJvcjsKKworCSppbmZvdHlwZSA9IFNDVFBfUkVDVlZfTk9JTkZPOworCV9pbmZvbGVuID0gKmluZm9sZW47CisKKwkvKiBzZXQgaW5mbyBhbmQgaW5mb3R5cGUgKi8KKwlmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKCZpbm1zZyk7IGNtc2cgIT0gTlVMTDsKKwkJCQljbXNnID0gQ01TR19OWFRIRFIoJmlubXNnLCBjbXNnKSkgeworCQlpZiAoY21zZy0+Y21zZ19sZXZlbCAhPSBJUFBST1RPX1NDVFApCisJCQljb250aW51ZTsKKworCQlpZiAoY21zZy0+Y21zZ190eXBlID09IFNDVFBfUkNWSU5GTykgeworCQkJbGVuID0gc2l6ZW9mKHN0cnVjdCBzY3RwX3JjdmluZm8pOworCQkJaWYgKCppbmZvdHlwZSA9PSBTQ1RQX1JFQ1ZWX05PSU5GTykgeworCQkJCWlmIChfaW5mb2xlbiA8IGxlbikKKwkJCQkJYnJlYWs7CisJCQkJbWVtY3B5KGluZm8sIENNU0dfREFUQShjbXNnKSwgbGVuKTsKKwkJCQkqaW5mb3R5cGUgPSBTQ1RQX1JFQ1ZWX1JDVklORk87CisJCQkJKmluZm9sZW4gPSBsZW47CisJCQl9IGVsc2UgaWYgKCppbmZvdHlwZSA9PSBTQ1RQX1JFQ1ZWX05YVElORk8pIHsKKwkJCQlpZiAoX2luZm9sZW4gPCBsZW4gKworCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX254dGluZm8pKQorCQkJCQlicmVhazsKKwkJCQltZW1jcHkoaW5mbyArIGxlbiwgaW5mbywKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY3RwX254dGluZm8pKTsKKwkJCQltZW1jcHkoaW5mbywgQ01TR19EQVRBKGNtc2cpLCBsZW4pOworCQkJCSppbmZvdHlwZSA9IFNDVFBfUkVDVlZfUk47CisJCQkJKmluZm9sZW4gPSBsZW4gKyBzaXplb2Yoc3RydWN0IHNjdHBfbnh0aW5mbyk7CisJCQl9IGVsc2UgeworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgaWYgKGNtc2ctPmNtc2dfdHlwZSA9PSBTQ1RQX05YVElORk8pIHsKKwkJCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9ueHRpbmZvKTsKKwkJCWlmICgqaW5mb3R5cGUgPT0gU0NUUF9SRUNWVl9OT0lORk8pIHsKKwkJCQlpZiAoX2luZm9sZW4gPCBsZW4pCisJCQkJCWJyZWFrOworCQkJCW1lbWNweShpbmZvLCBDTVNHX0RBVEEoY21zZyksIGxlbik7CisJCQkJKmluZm90eXBlID0gU0NUUF9SRUNWVl9OWFRJTkZPOworCQkJCSppbmZvbGVuID0gbGVuOworCQkJfSBlbHNlIGlmICgqaW5mb3R5cGUgPT0gU0NUUF9SRUNWVl9SQ1ZJTkZPKSB7CisJCQkJaWYgKF9pbmZvbGVuIDwgbGVuICsKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2N0cF9yY3ZpbmZvKSkKKwkJCQkJYnJlYWs7CisJCQkJbWVtY3B5KGluZm8gKyBzaXplb2Yoc3RydWN0IHNjdHBfcmN2aW5mbyksCisJCQkJICAgICAgIENNU0dfREFUQShjbXNnKSwgbGVuKTsKKwkJCQkqaW5mb3R5cGUgPSBTQ1RQX1JFQ1ZWX1JOOworCQkJCSppbmZvbGVuID0gbGVuICsgc2l6ZW9mKHN0cnVjdCBzY3RwX3JjdmluZm8pOworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBlcnJvcjsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2xpYi9zZW5kbXNnLmMgYi9zcmMvbGliL3NlbmRtc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzkwYjA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2xpYi9zZW5kbXNnLmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uOiBVc2VyIEFQSSBleHRlbnNpb25zLgorICoKKyAqIHNlbmRtc2cuYworICoKKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTEdQTCB2Mi4xIGFzIGRlc2NyaWJlZCBpbgorICogICAgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci50eHQgCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHVzZXIgbGlicmFyeSB0aGF0IG9mZmVycyBzdXBwb3J0IGZvciB0aGUKKyAqIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uLiBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMKKyAqIGNvZGUgaXMgdG8gcHJvdmlkZSB0aGUgU0NUUCBTb2NrZXQgQVBJIG1hcHBpbmdzIGZvciB1c2VyCisgKiBhcHBsaWNhdGlvbiB0byBpbnRlcmZhY2Ugd2l0aCB0aGUgU0NUUCBpbiBrZXJuZWwuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiB0aGUgU29ja2V0IEFQSSBFeHRlbnNpb25zIGZvciBTQ1RQCisgKiBkZWZpbmVkIGluIDxkcmFmdC1pZXRmLXRzdndnLXNjdHBzb2NrZXQtMTAudHh0PgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBJbnRlbCBDb3JwLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgQXJkZWxsZSBGYW4gICAgIDxhcmRlbGxlLmZhbkBpbnRlbC5jb20+CisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4gICAvKiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSwgc2V0c29ja29wdCgpICovCisjaW5jbHVkZSA8bmV0aW5ldC9zY3RwLmg+CisKKy8qIFRoaXMgbGlicmFyeSBmdW5jdGlvbiBhc3Npc3RzIHRoZSB1c2VyIHdpdGggdGhlIGFkdmFuY2VkIGZlYXR1cmVzCisgKiBvZiBTQ1RQLiAgVGhpcyBpcyBhIG5ldyBTQ1RQIEFQSSBkZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gOC43IG9mIHRoZQorICogU29ja2V0cyBBUEkgRXh0ZW5zaW9ucyBmb3IgU0NUUC4gVGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUKKyAqIHNlbmRtc2coKSBpbnRlcmZhY2UuCisgKi8KK2ludAorc2N0cF9zZW5kbXNnKGludCBzLCBjb25zdCB2b2lkICptc2csIHNpemVfdCBsZW4sIHN0cnVjdCBzb2NrYWRkciAqdG8sCisJICAgICBzb2NrbGVuX3QgdG9sZW4sIHVpbnQzMl90IHBwaWQsIHVpbnQzMl90IGZsYWdzLAorCSAgICAgdWludDE2X3Qgc3RyZWFtX25vLCB1aW50MzJfdCB0aW1ldG9saXZlLCB1aW50MzJfdCBjb250ZXh0KQoreworCXN0cnVjdCBtc2doZHIgb3V0bXNnOworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJY2hhciBvdXRjbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKV07CisJc3RydWN0IGNtc2doZHIgKmNtc2c7CisJc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm87CisKKwlvdXRtc2cubXNnX25hbWUgPSB0bzsKKwlvdXRtc2cubXNnX25hbWVsZW4gPSB0b2xlbjsKKwlvdXRtc2cubXNnX2lvdiA9ICZpb3Y7CisJaW92Lmlvdl9iYXNlID0gKHZvaWQgKiltc2c7CisJaW92Lmlvdl9sZW4gPSBsZW47CisJb3V0bXNnLm1zZ19pb3ZsZW4gPSAxOworCisJb3V0bXNnLm1zZ19jb250cm9sID0gb3V0Y21zZzsKKwlvdXRtc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2Yob3V0Y21zZyk7CisJb3V0bXNnLm1zZ19mbGFncyA9IDA7CisKKwljbXNnID0gQ01TR19GSVJTVEhEUigmb3V0bXNnKTsKKwljbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworCWNtc2ctPmNtc2dfdHlwZSA9IFNDVFBfU05EUkNWOworCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4oc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKworCW91dG1zZy5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworCXNpbmZvID0gKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKilDTVNHX0RBVEEoY21zZyk7CisJbWVtc2V0KHNpbmZvLCAwLCBzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCXNpbmZvLT5zaW5mb19wcGlkID0gcHBpZDsKKwlzaW5mby0+c2luZm9fZmxhZ3MgPSBmbGFnczsKKwlzaW5mby0+c2luZm9fc3RyZWFtID0gc3RyZWFtX25vOworCXNpbmZvLT5zaW5mb190aW1ldG9saXZlID0gdGltZXRvbGl2ZTsKKwlzaW5mby0+c2luZm9fY29udGV4dCA9IGNvbnRleHQ7CisKKwlyZXR1cm4gc2VuZG1zZyhzLCAmb3V0bXNnLCAwKTsKK30KKworLyogVGhpcyBsaWJyYXJ5IGZ1bmN0aW9uIGFzc2lzdCB0aGUgdXNlciB3aXRoIHNlbmRpbmcgYSBtZXNzYWdlIHdpdGhvdXQKKyAqIGRlYWxpbmcgZGlyZWN0bHkgd2l0aCB0aGUgQ01TRyBoZWFkZXIuCisgKi8KK2ludAorc2N0cF9zZW5kKGludCBzLCBjb25zdCB2b2lkICptc2csIHNpemVfdCBsZW4sCisgICAgICAgICAgY29uc3Qgc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm8sIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgbXNnaGRyIG91dG1zZzsKKwlzdHJ1Y3QgaW92ZWMgaW92OworCWNoYXIgb3V0Y21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSldOworCisJb3V0bXNnLm1zZ19uYW1lID0gTlVMTDsKKwlvdXRtc2cubXNnX25hbWVsZW4gPSAwOworCW91dG1zZy5tc2dfaW92ID0gJmlvdjsKKwlpb3YuaW92X2Jhc2UgPSAodm9pZCAqKW1zZzsKKwlpb3YuaW92X2xlbiA9IGxlbjsKKwlvdXRtc2cubXNnX2lvdmxlbiA9IDE7CisJb3V0bXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwlvdXRtc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCisJaWYgKHNpbmZvKSB7CQorCQlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKworCQlvdXRtc2cubXNnX2NvbnRyb2wgPSBvdXRjbXNnOworCQlvdXRtc2cubXNnX2NvbnRyb2xsZW4gPSBzaXplb2Yob3V0Y21zZyk7CisJCW91dG1zZy5tc2dfZmxhZ3MgPSAwOworCisJCWNtc2cgPSBDTVNHX0ZJUlNUSERSKCZvdXRtc2cpOworCQljbXNnLT5jbXNnX2xldmVsID0gSVBQUk9UT19TQ1RQOworCQljbXNnLT5jbXNnX3R5cGUgPSBTQ1RQX1NORFJDVjsKKwkJY21zZy0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IHNjdHBfc25kcmN2aW5mbykpOworCisJCW91dG1zZy5tc2dfY29udHJvbGxlbiA9IGNtc2ctPmNtc2dfbGVuOworCQltZW1jcHkoQ01TR19EQVRBKGNtc2cpLCBzaW5mbywgc2l6ZW9mKHN0cnVjdCBzY3RwX3NuZHJjdmluZm8pKTsKKwl9CisKKwlyZXR1cm4gc2VuZG1zZyhzLCAmb3V0bXNnLCBmbGFncyk7Cit9CisKKyNpZmRlZiBIQVZFX1NDVFBfU0VORFYKK3N0YXRpYyBzdHJ1Y3QgY21zZ2hkciAqc2N0cF9zZW5kdl9zdG9yZV9jbXNnKHN0cnVjdCBjbXNnaGRyICpjbXNnLCBpbnQgKmNtc2dsZW4sCisJCQkJCSAgICAgaW50IHR5cGUsIGludCBsZW4sIHZvaWQgKmRhdGEpCit7CisJY21zZy0+Y21zZ19sZXZlbCA9IElQUFJPVE9fU0NUUDsKKwljbXNnLT5jbXNnX3R5cGUgPSB0eXBlOworCWNtc2ctPmNtc2dfbGVuID0gQ01TR19MRU4obGVuKTsKKwltZW1jcHkoQ01TR19EQVRBKGNtc2cpLCBkYXRhLCBsZW4pOworCisJKmNtc2dsZW4gKz0gQ01TR19TUEFDRShsZW4pOworCisJcmV0dXJuIChzdHJ1Y3QgY21zZ2hkciAqKSgoY2hhciAqKWNtc2cgKyBDTVNHX1NQQUNFKGxlbikpOworfQorCitpbnQgc2N0cF9zZW5kdihpbnQgcywgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZjbnQsCisJICAgICAgIHN0cnVjdCBzb2NrYWRkciAqYWRkcnMsIGludCBhZGRyY250LCB2b2lkICppbmZvLAorCSAgICAgICBzb2NrbGVuX3QgaW5mb2xlbiwgdW5zaWduZWQgaW50IGluZm90eXBlLCBpbnQgZmxhZ3MpCit7CisJY2hhciBfY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3Qgc2N0cF9zZW5kdl9zcGEpKV07CisJc3RydWN0IGNtc2doZHIgKmNtc2cgPSAoc3RydWN0IGNtc2doZHIgKilfY21zZzsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHI7CisJc3RydWN0IG1zZ2hkciBvdXRtc2c7CisJaW50IGxlbiwgY21zZ2xlbiA9IDA7CisJaW50IGVyciwgdHlwZSwgaTsKKwljaGFyICphZGRyYnVmOworCisJLyogc2V0IG1zZ19pb3YsIG1zZ19pb3ZsZW4sIG1zZ19mbGFncyAqLworCW1lbXNldCgmb3V0bXNnLCAweDAwLCBzaXplb2Yob3V0bXNnKSk7CisJb3V0bXNnLm1zZ19pb3YgPSAoc3RydWN0IGlvdmVjICopaW92OworCW91dG1zZy5tc2dfaW92bGVuID0gaW92Y250OworCW91dG1zZy5tc2dfZmxhZ3MgPSBmbGFnczsKKworCS8qIHNldCBtc2dfbmFtZSBhbmQgbXNnX25hbWVsZW4gKi8KKwlpZiAoYWRkcnMgJiYgYWRkcmNudCkgeworCQlvdXRtc2cubXNnX25hbWUgPSBhZGRyczsKKwkJaWYgKGFkZHJzLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJCW91dG1zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQllbHNlIGlmIChhZGRycy0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJb3V0bXNnLm1zZ19uYW1lbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWRkcmNudCAtPSAxOworCQlhZGRyYnVmID0gKGNoYXIgKilhZGRyczsKKwkJYWRkcnMgPSAoc3RydWN0IHNvY2thZGRyICopKGFkZHJidWYgKyBvdXRtc2cubXNnX25hbWVsZW4pOworCX0KKworCS8qIGFsbG9jIG1lbW9yeSBvbmx5IHdoZW4gaXQncyBtdWx0aS1hZGRyZXNzICovCisJaWYgKGFkZHJjbnQpIHsKKwkJbGVuID0gQ01TR19TUEFDRShzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpICogYWRkcmNudDsKKwkJY21zZyA9IG1hbGxvYyhzaXplb2YoX2Ntc2cpICsgbGVuKTsKKwkJaWYgKCFjbXNnKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJb3V0bXNnLm1zZ19jb250cm9sID0gY21zZzsKKworCS8qIGFkZCBjbXNnIGluZm8gZm9yIGFkZHIgaW5mbyAqLworCWZvciAoaSA9IDAsIGFkZHJidWYgPSAoY2hhciAqKWFkZHJzOyBpIDwgYWRkcmNudDsgaSsrKSB7CisJCXZvaWQgKmFpbmZvOworCisJCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyICopYWRkcmJ1ZjsKKwkJaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmEgPSAoc3RydWN0IHNvY2thZGRyX2luICopYWRkcmJ1ZjsKKworCQkJbGVuID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKKwkJCXR5cGUgPSBTQ1RQX0RTVEFERFJWNDsKKwkJCWFpbmZvID0gJmEtPnNpbl9hZGRyOworCQkJYWRkcmJ1ZiArPSBzaXplb2YoKmEpOworCQl9IGVsc2UgaWYgKGFkZHItPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQkJc3RydWN0IHNvY2thZGRyX2luNiAqYSA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkcmJ1ZjsKKworCQkJbGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7CisJCQl0eXBlID0gU0NUUF9EU1RBRERSVjY7CisJCQlhaW5mbyA9ICZhLT5zaW42X2FkZHI7CisJCQlhZGRyYnVmICs9IHNpemVvZigqYSk7CisJCX0gZWxzZSB7CisJCQlmcmVlKG91dG1zZy5tc2dfY29udHJvbCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWNtc2cgPSBzY3RwX3NlbmR2X3N0b3JlX2Ntc2coY21zZywgJmNtc2dsZW4sIHR5cGUsIGxlbiwgYWluZm8pOworCX0KKwkvKiBhZGQgY21zZyBpbmZvIGZvciBhZGRyIGluZm8gZm9yIHNuZC9wci9hdXRoIGluZm8gKi8KKwlpZiAoaW5mb3R5cGUgPT0gU0NUUF9TRU5EVl9TUEEpIHsKKwkJc3RydWN0IHNjdHBfc2VuZHZfc3BhICpzcGEgPSBpbmZvOworCisJCWlmIChzcGEtPnNlbmR2X2ZsYWdzICYgU0NUUF9TRU5EX1NORElORk9fVkFMSUQpIHsKKwkJCXR5cGUgPSBTQ1RQX1NORElORk87CisJCQlsZW4gPSBzaXplb2Yoc3RydWN0IHNjdHBfc25kaW5mbyk7CisJCQljbXNnID0gc2N0cF9zZW5kdl9zdG9yZV9jbXNnKGNtc2csICZjbXNnbGVuLCB0eXBlLCBsZW4sCisJCQkJCQkgICAgICZzcGEtPnNlbmR2X3NuZGluZm8pOworCQl9CisJCWlmIChzcGEtPnNlbmR2X2ZsYWdzICYgU0NUUF9TRU5EX1BSSU5GT19WQUxJRCkgeworCQkJdHlwZSA9IFNDVFBfUFJJTkZPOworCQkJbGVuID0gc2l6ZW9mKHN0cnVjdCBzY3RwX3ByaW5mbyk7CisJCQljbXNnID0gc2N0cF9zZW5kdl9zdG9yZV9jbXNnKGNtc2csICZjbXNnbGVuLCB0eXBlLCBsZW4sCisJCQkJCQkgICAgICZzcGEtPnNlbmR2X3ByaW5mbyk7CisJCX0KKwkJaWYgKHNwYS0+c2VuZHZfZmxhZ3MgJiBTQ1RQX1NFTkRfQVVUSElORk9fVkFMSUQpIHsKKwkJCXR5cGUgPSBTQ1RQX0FVVEhJTkZPOworCQkJbGVuID0gc2l6ZW9mKHN0cnVjdCBzY3RwX2F1dGhpbmZvKTsKKwkJCXNjdHBfc2VuZHZfc3RvcmVfY21zZyhjbXNnLCAmY21zZ2xlbiwgdHlwZSwgbGVuLAorCQkJCQkgICAgICAmc3BhLT5zZW5kdl9hdXRoaW5mbyk7CisJCX0KKwl9IGVsc2UgaWYgKGluZm90eXBlID09IFNDVFBfU0VORFZfU05ESU5GTykgeworCQl0eXBlID0gU0NUUF9TTkRJTkZPOworCQlsZW4gPSBzaXplb2Yoc3RydWN0IHNjdHBfc25kaW5mbyk7CisJCXNjdHBfc2VuZHZfc3RvcmVfY21zZyhjbXNnLCAmY21zZ2xlbiwgdHlwZSwgbGVuLCBpbmZvKTsKKwl9IGVsc2UgaWYgKGluZm90eXBlID09IFNDVFBfU0VORFZfUFJJTkZPKSB7CisJCXR5cGUgPSBTQ1RQX1BSSU5GTzsKKwkJbGVuID0gc2l6ZW9mKHN0cnVjdCBzY3RwX3ByaW5mbyk7CisJCXNjdHBfc2VuZHZfc3RvcmVfY21zZyhjbXNnLCAmY21zZ2xlbiwgdHlwZSwgbGVuLCBpbmZvKTsKKwl9IGVsc2UgaWYgKGluZm90eXBlID09IFNDVFBfU0VORFZfQVVUSElORk8pIHsKKwkJdHlwZSA9IFNDVFBfQVVUSElORk87CisJCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc2N0cF9hdXRoaW5mbyk7CisJCXNjdHBfc2VuZHZfc3RvcmVfY21zZyhjbXNnLCAmY21zZ2xlbiwgdHlwZSwgbGVuLCBpbmZvKTsKKwl9CisKKwlvdXRtc2cubXNnX2NvbnRyb2xsZW4gPSBjbXNnbGVuOworCisJZXJyID0gc2VuZG1zZyhzLCAmb3V0bXNnLCAwKTsKKworCWlmIChvdXRtc2cubXNnX2NvbnRyb2wgIT0gX2Ntc2cpCisJCWZyZWUob3V0bXNnLm1zZ19jb250cm9sKTsKKworCXJldHVybiBlcnI7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90ZXN0bGliL01ha2VmaWxlLmFtIGIvc3JjL3Rlc3RsaWIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk0OTYxMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0bGliL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTIgQEAKKyMgSW5jbHVkZSB0aGVzZSB0d28gaW4gYWxsIHRoZSBNYWtlZmlsZS5hbSdzISEhCitpbmNsdWRlICQodG9wX3NyY2RpcikvTWFrZWZpbGUudmFycworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLnJ1bGVzCisKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5kaXJzCisKKyMgR2VuZXJhbCBjb21waWxhdGlvbiBmbGFncworQU1fQ1BQRkxBR1MgPSAtSSQodG9wX2J1aWxkZGlyKS9zcmMvaW5jbHVkZQorCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJzY3RwdXRpbC5sYQorbGlic2N0cHV0aWxfbGFfU09VUkNFUyA9IHNjdHB1dGlsLmMgc2N0cHV0aWwuaAorbGlic2N0cHV0aWxfbGFfTERGTEFHUyA9CmRpZmYgLS1naXQgYS9zcmMvdGVzdGxpYi9zY3RwdXRpbC5jIGIvc3JjL3Rlc3RsaWIvc2N0cHV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGYzMDVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3RsaWIvc2N0cHV0aWwuYwpAQCAtMCwwICsxLDQxNyBAQAorLyogU0NUUCBrZXJuZWwgSW1wbGVtZW50YXRpb24KKyAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEsIDIwMDMKKyAqIENvcHlyaWdodCAoQykgMTk5OSBDaXNjbworICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDAgTW90b3JvbGEKKyAjIENvcHlyaWdodCAoQykgMjAwMSBOb2tpYQorICogQ29weXJpZ2h0IChDKSAyMDAxIExhIE1vbnRlIEguUC4gWWFycm9sbAorICogCisgKiBUaGUgU0NUUCBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHNvZnR3YXJlOworICogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YKKyAqIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQKKyAqIHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZAorICogICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKgorICogd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICogU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBQbGVhc2Ugc2VuZCBhbnkgYnVnIHJlcG9ydHMgb3IgZml4ZXMgeW91IG1ha2UgdG8gdGhlCisgKiBlbWFpbCBhZGRyZXNzKGVzKToKKyAqICAgIGxrc2N0cCBkZXZlbG9wZXJzIDxsa3NjdHAtZGV2ZWxvcGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ+CisgKgorICogT3Igc3VibWl0IGEgYnVnIHJlcG9ydCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgd2Vic2l0ZToKKyAqICAgIGh0dHA6Ly93d3cuc2YubmV0L3Byb2plY3RzL2xrc2N0cAorICoKKyAqIEFueSBidWdzIHJlcG9ydGVkIHRvIHVzIHdlIHdpbGwgdHJ5IHRvIGZpeC4uLiBhbnkgZml4ZXMgc2hhcmVkIHdpbGwKKyAqIGJlIGluY29ycG9yYXRlZCBpbnRvIHRoZSBuZXh0IFNDVFAgcmVsZWFzZS4KKyAqCisgKiBXcml0dGVuIG9yIG1vZGlmaWVkIGJ5OgorICogICAgTGEgTW9udGUgSC5QLiBZYXJyb2xsIDxwaWdneUBhY20ub3JnPgorICogICAgTmFyYXNpbWhhIEJ1ZGloYWwgPG5hcnNpQHJlZmNvZGUub3JnPgorICogICAgS2FybCBLbnV0c29uIDxrYXJsQGF0aGVuYS5jaGljYWdvLmlsLnVzPgorICogICAgSm9uIEdyaW1tIDxqZ3JpbW1AdXMuaWJtLmNvbT4KKyAqICAgIERhaXN5IENoYW5nIDxkYWlzeWNAdXMuaWJtLmNvbT4KKyAqICAgIFNyaWRoYXIgU2FtdWRyYWxhIDxzcmlAdXMuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPiAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorI2luY2x1ZGUgPHNjdHB1dGlsLmg+CisKKy8qIFRoaXMgZnVuY3Rpb24gcHJpbnRzIHRoZSBjbXNnIGRhdGEuICovCit2b2lkCit0ZXN0X3ByaW50X2Ntc2coc2N0cF9jbXNnX3QgdHlwZSwgc2N0cF9jbXNnX2RhdGFfdCAqZGF0YSkKK3sKKwlzd2l0Y2godHlwZSkgeworCWNhc2UgU0NUUF9JTklUOgorCQlwcmludGYoIklOSVRcbiIpOworCQlwcmludGYoIiAgIHNpbml0X251bV9vc3RyZWFtcyAlZFxuIiwKKwkJICAgICAgIGRhdGEtPmluaXQuc2luaXRfbnVtX29zdHJlYW1zKTsKKwkJcHJpbnRmKCIgICBzaW5pdF9tYXhfaW5zdHJlYW1zICVkXG4iLAorCQkgICAgICAgZGF0YS0+aW5pdC5zaW5pdF9tYXhfaW5zdHJlYW1zKTsKKwkJcHJpbnRmKCIgICBzaW5pdF9tYXhfYXR0ZW1wdHMgJWRcbiIsCisJCSAgICAgICBkYXRhLT5pbml0LnNpbml0X21heF9hdHRlbXB0cyk7CisJCXByaW50ZigiICAgc2luaXRfbWF4X2luaXRfdGltZW8gJWRcbiIsCisJCSAgICAgICBkYXRhLT5pbml0LnNpbml0X21heF9pbml0X3RpbWVvKTsKKwkJCisJCWJyZWFrOworCWNhc2UgU0NUUF9TTkRSQ1Y6CisJCXByaW50ZigiU05EUkNWXG4iKTsKKwkJcHJpbnRmKCIgICBzaW5mb19zdHJlYW0gJXVcbiIsCWRhdGEtPnNuZHJjdi5zaW5mb19zdHJlYW0pOworCQlwcmludGYoIiAgIHNpbmZvX3NzbiAldVxuIiwJZGF0YS0+c25kcmN2LnNpbmZvX3Nzbik7CisJCXByaW50ZigiICAgc2luZm9fZmxhZ3MgMHgleFxuIiwJZGF0YS0+c25kcmN2LnNpbmZvX2ZsYWdzKTsKKwkJcHJpbnRmKCIgICBzaW5mb19wcGlkICV1XG4iLAlkYXRhLT5zbmRyY3Yuc2luZm9fcHBpZCk7CisJCXByaW50ZigiICAgc2luZm9fY29udGV4dCAleFxuIiwJZGF0YS0+c25kcmN2LnNpbmZvX2NvbnRleHQpOworCQlwcmludGYoIiAgIHNpbmZvX3RzbiAgICAgJXVcbiIsICAgIGRhdGEtPnNuZHJjdi5zaW5mb190c24pOworCQlwcmludGYoIiAgIHNpbmZvX2N1bXRzbiAgJXVcbiIsICAgIGRhdGEtPnNuZHJjdi5zaW5mb19jdW10c24pOworCQlwcmludGYoIiAgIHNpbmZvX2Fzc29jX2lkICAldVxuIiwgZGF0YS0+c25kcmN2LnNpbmZvX2Fzc29jX2lkKTsKKwkJCisJCWJyZWFrOworCQkKKwlkZWZhdWx0OgorCQlwcmludGYoIlVOS05PV04gQ01TRzogJWRcbiIsIHR5cGUpOworCQlicmVhazsKKwl9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcHJpbnRzIHRoZSBtZXNzYWdlLiAqLwordm9pZAordGVzdF9wcmludF9tZXNzYWdlKGludCBzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbXNnX2xlbikgCit7CisJc2N0cF9jbXNnX2RhdGFfdCAqZGF0YTsKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZzsKKwlpbnQgaTsKKwlpbnQgZG9uZSA9IDA7CisJY2hhciBzYXZlOworCXVuaW9uIHNjdHBfbm90aWZpY2F0aW9uICpzbjsKKworCWZvciAoY21zZyA9IENNU0dfRklSU1RIRFIobXNnKTsKKwkgICAgIGNtc2cgIT0gTlVMTDsKKwkgICAgIGNtc2cgPSBDTVNHX05YVEhEUihtc2csIGNtc2cpKSB7CisJCSAgICAgZGF0YSA9IChzY3RwX2Ntc2dfZGF0YV90ICopQ01TR19EQVRBKGNtc2cpOworCQkgICAgIHRlc3RfcHJpbnRfY21zZyhjbXNnLT5jbXNnX3R5cGUsIGRhdGEpOworCX0KKworCWlmICghKE1TR19OT1RJRklDQVRJT04gJiBtc2ctPm1zZ19mbGFncykpIHsKKwkJaW50IGluZGV4ID0gMDsKKwkJLyogTWFrZSBzdXJlIHRoYXQgZXZlcnl0aGluZyBpcyBwcmludGFibGUgYW5kIHRoYXQgd2UKKwkJICogYXJlIE5VTCB0ZXJtaW5hdGVkLi4uCisJCSAqLworCQlwcmludGYoIkRBVEEoJWx1KTogICIsIG1zZ19sZW4pOworCQl3aGlsZSAoIG1zZ19sZW4gPiAwICkgeworCQkJY2hhciAqdGV4dDsKKwkJCWludCBsZW47CisKKwkJCXRleHQgPSBtc2ctPm1zZ19pb3ZbaW5kZXhdLmlvdl9iYXNlOworCQkJbGVuID0gbXNnLT5tc2dfaW92W2luZGV4XS5pb3ZfbGVuOworCisgICAgICAgICAgICAgICAgICAgICAgICBzYXZlID0gdGV4dFttc2dfbGVuLTFdOworCQkJaWYgKCBsZW4gPiBtc2dfbGVuICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0WyhsZW4gPSBtc2dfbGVuKSAtIDFdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCQkJaWYgKCAobXNnX2xlbiAtPSBsZW4pID4gMCApIHsgaW5kZXgrKzsgfQorCisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNwcmludCh0ZXh0W2ldKSkgdGV4dFtpXSA9ICcuJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCisJCQlwcmludGYoIiVzIiwgdGV4dCk7CisJCQl0ZXh0W21zZ19sZW4tMV0gPSBzYXZlOworCisJCQlpZiAoIChkb25lID0gIXN0cmNtcCh0ZXh0LCAiZXhpdCIpKSApIHsgYnJlYWs7IH0KKwkJfQorCX0gZWxzZSB7CisJCXByaW50ZigiTk9USUZJQ0FUSU9OOiAiKTsKKwkJc24gPSAodW5pb24gc2N0cF9ub3RpZmljYXRpb24gKiltc2ctPm1zZ19pb3ZbMF0uaW92X2Jhc2U7CisJCXN3aXRjaCAoc24tPnNuX2hlYWRlci5zbl90eXBlKSB7CisJCWNhc2UgU0NUUF9BU1NPQ19DSEFOR0U6CisJCQlzd2l0Y2ggKHNuLT5zbl9hc3NvY19jaGFuZ2Uuc2FjX3N0YXRlKSB7CisJCQljYXNlIFNDVFBfQ09NTV9VUDoKKwkJCQlwcmludGYoIkFTU09DX0NIQU5HRSAtIENPTU1fVVAiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0NUUF9DT01NX0xPU1Q6CisJCQkJcHJpbnRmKCJBU1NPQ19DSEFOR0UgLSBDT01NX0xPU1QiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU0NUUF9SRVNUQVJUOgorCQkJCXByaW50ZigiQVNTT0NfQ0hBTkdFIC0gUkVTVEFSVCIpOworCQkJCWJyZWFrOworCQkJY2FzZSBTQ1RQX1NIVVRET1dOX0NPTVA6CisJCQkJcHJpbnRmKCJBU1NPQ19DSEFOR0UgLSBTSFVURE9XTl9DT01QIik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNDVFBfQ0FOVF9TVFJfQVNTT0M6CisJCQkJcHJpbnRmKCJBU1NPQ19DSEFOR0UgLSBDQU5UX1NUUl9BU1NPQyIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoIkFTU09DX0NIQU5HRSAtIFVORVhQRUNURUQoJWQpIiwKKwkJCQkgICAgICAgc24tPnNuX2Fzc29jX2NoYW5nZS5zYWNfc3RhdGUpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGYoIiVkIiwgc24tPnNuX2hlYWRlci5zbl90eXBlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcHJpbnRmKCJcbiIpOworfQorCisvKiBDaGVjayBpZiBhIGJ1Zi9tc2dfZmxhZ3MgbWF0Y2hlcyBhIG5vdGlmaWNhdGlvbiwgaXRzIHR5cGUsIGFuZCBwb3NzaWJseSBhbgorICogYWRkaXRpb25hbCBmaWVsZCBpbiB0aGUgY29ycmVzcG9uZGluZyBub3RpZmljYXRpb24gc3RydWN0dXJlLgorICovCit2b2lkIAordGVzdF9jaGVja19idWZfbm90aWZpY2F0aW9uKHZvaWQgKmJ1ZiwgaW50IGRhdGFsZW4sIGludCBtc2dfZmxhZ3MsCisJCQkgICAgaW50IGV4cGVjdGVkX2RhdGFsZW4sIHVpbnQxNl90IGV4cGVjdGVkX3NuX3R5cGUsCisJCQkgICAgdWludDMyX3QgZXhwZWN0ZWRfYWRkaXRpb25hbCkKK3sKKwl1bmlvbiBzY3RwX25vdGlmaWNhdGlvbiAqc247CisJCisJaWYgKCEobXNnX2ZsYWdzICYgTVNHX05PVElGSUNBVElPTikpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIkdvdCBhIGRhdGFtc2csIGV4cGVjdGluZyAiCisJCQkgIm5vdGlmaWNhdGlvbiIpOworCQorCWlmIChleHBlY3RlZF9kYXRhbGVuIDw9IDApCisJCXJldHVybjsKKworCWlmIChkYXRhbGVuICE9IGV4cGVjdGVkX2RhdGFsZW4pCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIkdvdCBhIG5vdGlmaWNhdGlvbiBvZiB1bmV4cGVjdGVkICIKKwkJCSAibGVuZ3RoOiVkLCBleHBlY3RlZCBsZW5ndGg6JWQiLCBkYXRhbGVuLAorCQkJIGV4cGVjdGVkX2RhdGFsZW4pOworCQkKKwlzbiA9ICh1bmlvbiBzY3RwX25vdGlmaWNhdGlvbiAqKWJ1ZjsKKwlpZiAoc24tPnNuX2hlYWRlci5zbl90eXBlICE9IGV4cGVjdGVkX3NuX3R5cGUpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIlVuZXhwZWN0ZWQgbm90aWZpY2F0aW9uOiVkIgorCQkJICJleHBlY3RlZDolZCIsIHNuLT5zbl9oZWFkZXIuc25fdHlwZSwKKwkJCSAgZXhwZWN0ZWRfc25fdHlwZSk7CisJCisJc3dpdGNoKHNuLT5zbl9oZWFkZXIuc25fdHlwZSl7CisJY2FzZSBTQ1RQX0FTU09DX0NIQU5HRToKKwkJaWYgKHNuLT5zbl9hc3NvY19jaGFuZ2Uuc2FjX3N0YXRlICE9IGV4cGVjdGVkX2FkZGl0aW9uYWwpCisJCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJVbmV4cGVjdGVkIHNhY19zdGF0ZTolZCAiCisJCQkJICJleHBlY3RlZDolZCIsIHNuLT5zbl9hc3NvY19jaGFuZ2Uuc2FjX3N0YXRlLAorCQkJCSAgZXhwZWN0ZWRfYWRkaXRpb25hbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworLyogQ2hlY2sgaWYgYSBtZXNzYWdlIG1hdGNoZXMgYSBub3RpZmljYXRpb24sIGl0cyB0eXBlLCBhbmQgcG9zc2libHkgYW4KKyAqIGFkZGl0aW9uYWwgZmllbGQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgbm90aWZpY2F0aW9uIHN0cnVjdHVyZS4KKyAqLwordm9pZCAKK3Rlc3RfY2hlY2tfbXNnX25vdGlmaWNhdGlvbihzdHJ1Y3QgbXNnaGRyICptc2csIGludCBkYXRhbGVuLAorCQkJICAgIGludCBleHBlY3RlZF9kYXRhbGVuLCB1aW50MTZfdCBleHBlY3RlZF9zbl90eXBlLAorCQkJICAgIHVpbnQzMl90IGV4cGVjdGVkX2FkZGl0aW9uYWwpCit7CisJdGVzdF9jaGVja19idWZfbm90aWZpY2F0aW9uKG1zZy0+bXNnX2lvdlswXS5pb3ZfYmFzZSwgZGF0YWxlbiwKKwkJCQkgICAgbXNnLT5tc2dfZmxhZ3MsIGV4cGVjdGVkX2RhdGFsZW4sCisJCQkJICAgIGV4cGVjdGVkX3NuX3R5cGUsIGV4cGVjdGVkX2FkZGl0aW9uYWwpOworfQorCisvKiBDaGVjayBpZiBhIGJ1Zi9tc2dfZmxhZ3Mvc2luZm8gY29ycmVzcG9uZHMgdG8gZGF0YSwgaXRzIGxlbmd0aCwgbXNnX2ZsYWdzLAorICogc3RyZWFtIGFuZCBwcGlkLgorICovCit2b2lkCit0ZXN0X2NoZWNrX2J1Zl9kYXRhKHZvaWQgKmJ1ZiwgaW50IGRhdGFsZW4sIGludCBtc2dfZmxhZ3MsCisJCSAgICBzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbywgaW50IGV4cGVjdGVkX2RhdGFsZW4sCisJCSAgICBpbnQgZXhwZWN0ZWRfbXNnX2ZsYWdzLCB1aW50MTZfdCBleHBlY3RlZF9zdHJlYW0sCisJCSAgICB1aW50MzJfdCBleHBlY3RlZF9wcGlkKQoreworCWlmIChtc2dfZmxhZ3MgJiBNU0dfTk9USUZJQ0FUSU9OKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJHb3QgYSBub3RpZmljYXRpb24sIGV4cGVjdGluZyBhIgorCQkJICJkYXRhbXNnIik7CisKKwlpZiAoZXhwZWN0ZWRfZGF0YWxlbiA8PSAwKQorCQlyZXR1cm47CisKKwlpZiAoZGF0YWxlbiAhPSBleHBlY3RlZF9kYXRhbGVuKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJHb3QgYSBkYXRhbXNnIG9mIHVuZXhwZWN0ZWQgIgorCQkJICJsZW5ndGg6JWQsIGV4cGVjdGVkIGxlbmd0aDolZCIsIGRhdGFsZW4sCisJCQkgZXhwZWN0ZWRfZGF0YWxlbik7CisKKwlpZiAoKG1zZ19mbGFncyAmIH4weDgwMDAwMDAwKSAhPSBleHBlY3RlZF9tc2dfZmxhZ3MpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgIlVuZXhwZWN0ZWQgbXNnX2ZsYWdzOjB4JXggIgorCQkJICJleHBlY3Rpbmc6MHgleCIsIG1zZ19mbGFncywgZXhwZWN0ZWRfbXNnX2ZsYWdzKTsKKworCWlmICgoMCA9PSBleHBlY3RlZF9zdHJlYW0pICYmICgwID09IGV4cGVjdGVkX3BwaWQpKQorCQlyZXR1cm47IAorCisJaWYgKCFzaW5mbykKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiTnVsbCBzaW5mbywgYnV0IGV4cGVjdGVkICIKKwkJCSAic3RyZWFtOiVkIGV4cGVjdGVkIHBwaWQ6JWQiLCBleHBlY3RlZF9zdHJlYW0sCisJCQkgZXhwZWN0ZWRfcHBpZCk7CisKKwlpZiAoc2luZm8tPnNpbmZvX3N0cmVhbSAhPSBleHBlY3RlZF9zdHJlYW0pCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInN0cmVhbSBtaXNtYXRjaDogZXhwZWN0ZWQ6JXggIgorCQkJICJnb3Q6JXgiLCBleHBlY3RlZF9zdHJlYW0sIHNpbmZvLT5zaW5mb19zdHJlYW0pOworCWlmIChzaW5mby0+c2luZm9fcHBpZCAhPSBleHBlY3RlZF9wcGlkKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJwcGlkIG1pc21hdGNoOiBleHBlY3RlZDoleCAiCisJCQkgImdvdDoleFxuIiwgZXhwZWN0ZWRfcHBpZCwgc2luZm8tPnNpbmZvX3BwaWQpOworfQorCisvKiBDaGVjayBpZiBhIG1lc3NhZ2UgY29ycmVzcG9uZHMgdG8gZGF0YSwgaXRzIGxlbmd0aCwgbXNnX2ZsYWdzLCBzdHJlYW0gYW5kCisgKiBwcGlkLgorICovCit2b2lkCit0ZXN0X2NoZWNrX21zZ19kYXRhKHN0cnVjdCBtc2doZHIgKm1zZywgaW50IGRhdGFsZW4sIGludCBleHBlY3RlZF9kYXRhbGVuLAorCQkgICAgaW50IGV4cGVjdGVkX21zZ19mbGFncywgdWludDE2X3QgZXhwZWN0ZWRfc3RyZWFtLAorCQkgICAgdWludDMyX3QgZXhwZWN0ZWRfcHBpZCkKK3sKKwlzdHJ1Y3QgY21zZ2hkciAqY21zZyA9IE5VTEw7CisJc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqc2luZm8gPSBOVUxMOworCisJLyogUmVjZWl2ZSBhdXhpbGlhcnkgZGF0YSBpbiBtc2doLiAqLworCWZvciAoY21zZyA9IENNU0dfRklSU1RIRFIobXNnKTsgY21zZyAhPSBOVUxMOworCQkJCSBjbXNnID0gQ01TR19OWFRIRFIobXNnLCBjbXNnKSl7CisJCWlmIChJUFBST1RPX1NDVFAgPT0gY21zZy0+Y21zZ19sZXZlbCAmJgorCQkgICAgU0NUUF9TTkRSQ1YgPT0gY21zZy0+Y21zZ190eXBlKQorCQkJYnJlYWs7CisJfSAvKiBmb3IoIGFsbCBjbXNncykgKi8KKworCWlmICgoIWNtc2cpIHx8CisJICAgIChjbXNnLT5jbXNnX2xlbiA8IENNU0dfTEVOKHNpemVvZihzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvKSkpKQorCQlzaW5mbyA9IE5VTEw7CisJZWxzZQorCQlzaW5mbyA9IChzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICopQ01TR19EQVRBKGNtc2cpOworCisJdGVzdF9jaGVja19idWZfZGF0YShtc2ctPm1zZ19pb3ZbMF0uaW92X2Jhc2UsIGRhdGFsZW4sIG1zZy0+bXNnX2ZsYWdzLAorCQkJICAgIHNpbmZvLCBleHBlY3RlZF9kYXRhbGVuLCBleHBlY3RlZF9tc2dfZmxhZ3MsCisJCQkgICAgZXhwZWN0ZWRfc3RyZWFtLCBleHBlY3RlZF9wcGlkKTsKKworfQorCisKKy8qIEFsbG9jYXRlIGEgYnVmZmVyIG9mIHJlcXVlc3RlZCBsZW4gYW5kIGZpbGwgaW4gd2l0aCBkYXRhLiAqLwordm9pZCAqCit0ZXN0X2J1aWxkX21zZyhpbnQgbGVuKQoreworCWludCBpID0gbGVuIC0gMTsKKwlpbnQgbjsKKwl1bnNpZ25lZCBjaGFyIG1zZ1tdID0gCisJCSIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiOworCWNoYXIgKm1zZ19idWYsICpwOworCisJbXNnX2J1ZiA9IChjaGFyICopbWFsbG9jKGxlbik7CisJaWYgKCFtc2dfYnVmKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJtYWxsb2MgZmFpbGVkIik7CisKKwlwID0gbXNnX2J1ZjsKKworCWRvIHsKKwkJbiA9ICgoaSA+IDUwKT81MDppKTsKKwkJbWVtY3B5KHAsIG1zZywgKChpID4gNTApPzUwOmkpKTsKKwkJcCArPSBuOworCQlpIC09IG47CisJfSB3aGlsZSAoaSA+IDApOyAKKworCW1zZ19idWZbbGVuLTFdID0gJ1wwJzsgCisKKwlyZXR1cm4obXNnX2J1Zik7Cit9CisKKy8qIEVuYWJsZSBBU1NPQ19DSEFOR0UgYW5kIFNORFJDVklORk8gbm90aWZpY2F0aW9ucy4gKi8KK3ZvaWQgdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKGludCBmZCkKK3sKKwlzdHJ1Y3Qgc2N0cF9ldmVudF9zdWJzY3JpYmUgc3Vic2NyaWJlOworCisJbWVtc2V0KCZzdWJzY3JpYmUsIDAsIHNpemVvZihzdWJzY3JpYmUpKTsKKwlzdWJzY3JpYmUuc2N0cF9kYXRhX2lvX2V2ZW50ID0gMTsKKwlzdWJzY3JpYmUuc2N0cF9hc3NvY2lhdGlvbl9ldmVudCA9IDE7CisJdGVzdF9zZXRzb2Nrb3B0KGZkLCBTQ1RQX0VWRU5UUywgKGNoYXIgKikmc3Vic2NyaWJlLAorCQkgICAgICAgIHNpemVvZihzdWJzY3JpYmUpKTsKK30KKworc3RhdGljIGludCBjbXBfYWRkcihzb2NrYWRkcl9zdG9yYWdlX3QgKmFkZHIxLCBzb2NrYWRkcl9zdG9yYWdlX3QgKmFkZHIyKQoreworCWlmIChhZGRyMS0+c2Euc2FfZmFtaWx5ICE9IGFkZHIyLT5zYS5zYV9mYW1pbHkpCisJCXJldHVybiAwOworCXN3aXRjaCAoYWRkcjEtPnNhLnNhX2ZhbWlseSkgeworCWNhc2UgQUZfSU5FVDY6CisJCWlmIChhZGRyMS0+djYuc2luNl9wb3J0ICE9IGFkZHIyLT52Ni5zaW42X3BvcnQpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiBtZW1jbXAoJmFkZHIxLT52Ni5zaW42X2FkZHIsICZhZGRyMi0+djYuc2luNl9hZGRyLAorCQkJICAgICAgc2l6ZW9mKGFkZHIxLT52Ni5zaW42X2FkZHIpKTsKKwljYXNlIEFGX0lORVQ6CisJCWlmIChhZGRyMS0+djQuc2luX3BvcnQgIT0gYWRkcjItPnY0LnNpbl9wb3J0KQorCQkJcmV0dXJuIDA7CisJCXJldHVybiBtZW1jbXAoJmFkZHIxLT52NC5zaW5fYWRkciwgJmFkZHIyLT52NC5zaW5fYWRkciwKKwkJCSAgICAgIHNpemVvZihhZGRyMS0+djQuc2luX2FkZHIpKTsKKwlkZWZhdWx0OgorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJpbnZhbGlkIGFkZHJlc3MgdHlwZSAlZCIsCisJCQkgYWRkcjEtPnNhLnNhX2ZhbWlseSk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKKy8qIFRlc3QgcGVlciBhZGRyZXNzZXMgZm9yIGFzc29jaWF0aW9uLiAqLworaW50IHRlc3RfcGVlcl9hZGRyKGludCBzaywgc2N0cF9hc3NvY190IGFzb2MsIHNvY2thZGRyX3N0b3JhZ2VfdCAqcGVlcnMsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJzOworCWludCBlcnJvciwgaSwgajsKKwlzdHJ1Y3Qgc29ja2FkZHIgKnNhX2FkZHI7CisJc29ja2xlbl90IGFkZHJzX3NpemUgPSAwOworCXZvaWQgKmFkZHJidWY7CisJY2hhciAqZm91bmQgPSAoY2hhciAqKSBtYWxsb2MoY291bnQpOworCW1lbXNldChmb3VuZCwgMCwgY291bnQpOworCisJZXJyb3IgPSBzY3RwX2dldHBhZGRycyhzaywgYXNvYywgJmFkZHJzKTsKKwlpZiAoLTEgPT0gZXJyb3IpIHsKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2N0cF9nZXRwYWRkcnM6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlpZiAoZXJyb3IgIT0gY291bnQpIHsKKwkJc2N0cF9mcmVlcGFkZHJzKGFkZHJzKTsKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAicGVlciBjb3VudCAlZCBtaXNtYXRjaCwgZXhwZWN0ZWQgJWQiLAorCQkJIGVycm9yLCBjb3VudCk7CisJfQorCWFkZHJidWYgPSBhZGRyczsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlzYV9hZGRyID0gKHN0cnVjdCBzb2NrYWRkciAqKWFkZHJidWY7CisJCXN3aXRjaCAoc2FfYWRkci0+c2FfZmFtaWx5KSB7CisJCWNhc2UgQUZfSU5FVDoKKwkJCWFkZHJzX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJCQlhZGRyYnVmICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJYnJlYWs7CisJCWNhc2UgQUZfSU5FVDY6CisJCQlhZGRyc19zaXplICs9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwkJCWFkZHJidWYgKz0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJubyA9IEVJTlZBTDsKKwkJCXNjdHBfZnJlZXBhZGRycyhhZGRycyk7CisJCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX2dldHBhZGRyczogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWZvciAoaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CisJCQlpZiAoY21wX2FkZHIoKHNvY2thZGRyX3N0b3JhZ2VfdCAqKXNhX2FkZHIsCisJCQkJICAgICAmcGVlcnNbal0pID09IDApIHsKKwkJCQlmb3VuZFtqXSA9IDE7CisJCQl9CisJCX0KKwl9CisJZm9yIChqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKKwkJaWYgKGZvdW5kW2pdID09IDApIHsKKwkJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInBlZXIgYWRkcmVzcyAlZCBub3QgZm91bmQiLCBqKTsKKwkJfQorCX0KKwlzY3RwX2ZyZWVwYWRkcnMoYWRkcnMpOworCWZyZWUoZm91bmQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RsaWIvc2N0cHV0aWwuaCBiL3NyYy90ZXN0bGliL3NjdHB1dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiYWJkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0bGliL3NjdHB1dGlsLmgKQEAgLTAsMCArMSwzNTggQEAKKy8qIFNDVFAga2VybmVsIEltcGxlbWVudGF0aW9uCisgKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxLCAyMDAzCisgKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCBDaXNjbywgSW5jLgorICogQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEgTW90b3JvbGEsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwMSBJbnRlbCBDb3JwLgorICogQ29weXJpZ2h0IChjKSAyMDAxIE5va2lhLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgTGEgTW9udGUgSC5QLiBZYXJyb2xsCisgKiAKKyAqIFRoZSBTQ1RQIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgc29mdHdhcmU7CisgKiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhlIFNDVFAgaW1wbGVtZW50YXRpb24gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdAorICogd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgKiAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIFBsZWFzZSBzZW5kIGFueSBidWcgcmVwb3J0cyBvciBmaXhlcyB5b3UgbWFrZSB0byB0aGUKKyAqIGVtYWlsIGFkZHJlc3MoZXMpOgorICogICAgbGtzY3RwIGRldmVsb3BlcnMgPGxrc2N0cC1kZXZlbG9wZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldD4KKyAqCisgKiBPciBzdWJtaXQgYSBidWcgcmVwb3J0IHRocm91Z2ggdGhlIGZvbGxvd2luZyB3ZWJzaXRlOgorICogICAgaHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGtzY3RwCisgKgorICogQW55IGJ1Z3MgcmVwb3J0ZWQgdG8gdXMgd2Ugd2lsbCB0cnkgdG8gZml4Li4uIGFueSBmaXhlcyBzaGFyZWQgd2lsbAorICogYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG5leHQgU0NUUCByZWxlYXNlLgorICoKKyAqIFdyaXR0ZW4gb3IgbW9kaWZpZWQgYnk6CisgKiAgICBMYSBNb250ZSBILlAuIFlhcnJvbGwgPHBpZ2d5QGFjbS5vcmc+CisgKiAgICBLYXJsIEtudXRzb24gPGthcmxAYXRoZW5hLmNoaWNhZ28uaWwudXM+CisgKiAgICBSYW5kYWxsIFN0ZXdhcnQgPHJhbmRhbGxAc3Rld2FydC5jaGljYWdvLmlsLnVzPgorICogICAgS2VuIE1vcm5lYXUgPGttb3JuZWF1QGNpc2NvLmNvbT4KKyAqICAgIFFpYW9iaW5nIFhpZSA8cXhpZTFAbW90b3JvbGEuY29tPgorICogICAgRGFpc3kgQ2hhbmcgPGRhaXN5Y0B1cy5pYm0uY29tPgorICogICAgSm9uIEdyaW1tIDxqZ3JpbW1AdXMuaWJtLmNvbT4KKyAqICAgIFNyaWRoYXIgU2FtdWRyYWxhIDxzYW11ZHJhbGFAdXMuaWJtLmNvbT4KKyAqICAgIEh1aSBIdWFuZyA8aHVpLmh1YW5nQG5va2lhLmNvbT4KKyAqLworCisjaWZuZGVmIF9fc2N0cHV0aWxfaF9fCisjZGVmaW5lIF9fc2N0cHV0aWxfaF9fCisKKyNpZmRlZiBMVFAKKyNpbmNsdWRlIDx0ZXN0Lmg+CisjaW5jbHVkZSA8dXNjdGVzdC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKwordHlwZWRlZiB1bmlvbiB7CisJc3RydWN0IHNvY2thZGRyX2luIHY0OwkKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHY2OworCXN0cnVjdCBzb2NrYWRkciBzYTsJCit9IHNvY2thZGRyX3N0b3JhZ2VfdDsKKworCisjZGVmaW5lIFJFQUxMWV9CSUcgNjU1MzYKKworLyogTGl0ZXJhbCBkZWZpbmVzLiAgKi8KKyNpZmRlZiBQUk9UX1NPQ0sKKyNkZWZpbmUgU0NUUF9URVNUUE9SVF8xIFBST1RfU09DSworI2Vsc2UKKyNkZWZpbmUgU0NUUF9URVNUUE9SVF8xIDEwMjQgCisjZW5kaWYKKyNkZWZpbmUgU0NUUF9URVNUUE9SVF8yIChTQ1RQX1RFU1RQT1JUXzErMSkKKworI2RlZmluZSBTQ1RQX0lQX0JDQVNUICAJaHRvbmwoMHhmZmZmZmZmZikKKyNkZWZpbmUgU0NUUF9JUF9MT09QQkFDSyAgaHRvbmwoMHg3ZjAwMDAwMSkKKworLyogVGhlc2UgYXJlIHN0b2xlbiBmcm9tIDxuZXRpbmV0L2luLmg+LiAgKi8KKyNkZWZpbmUgU0NUUF9JTjZBRERSX0FOWV9JTklUIHsgeyB7IDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgfSB9IH0KKyNkZWZpbmUgU0NUUF9JTjZBRERSX0xPT1BCQUNLX0lOSVQgeyB7IHsgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSB9IH0gfQorCisvKiBEaXNwbGF5IGFuIElQdjQgYWRkcmVzcyBpbiByZWFkYWJsZSBmb3JtYXQuICAqLworI2RlZmluZSBOSVBRVUFEKGFkZHIpIFwKKyAgICAgICAgKCh1bnNpZ25lZCBjaGFyICopJmFkZHIpWzBdLCBcCisgICAgICAgICgodW5zaWduZWQgY2hhciAqKSZhZGRyKVsxXSwgXAorICAgICAgICAoKHVuc2lnbmVkIGNoYXIgKikmYWRkcilbMl0sIFwKKyAgICAgICAgKCh1bnNpZ25lZCBjaGFyICopJmFkZHIpWzNdCisKKy8qIERpc3BsYXkgYW4gSVB2NiBhZGRyZXNzIGluIHJlYWRhYmxlIGZvcm1hdC4gICovCisjZGVmaW5lIE5JUDYoYWRkcikgXAorICAgICAgICBudG9ocygoYWRkcikuczZfYWRkcjE2WzBdKSwgXAorICAgICAgICBudG9ocygoYWRkcikuczZfYWRkcjE2WzFdKSwgXAorICAgICAgICBudG9ocygoYWRkcikuczZfYWRkcjE2WzJdKSwgXAorICAgICAgICBudG9ocygoYWRkcikuczZfYWRkcjE2WzNdKSwgXAorICAgICAgICBudG9ocygoYWRkcikuczZfYWRkcjE2WzRdKSwgXAorICAgICAgICBudG9ocygoYWRkcikuczZfYWRkcjE2WzVdKSwgXAorICAgICAgICBudG9ocygoYWRkcikuczZfYWRkcjE2WzZdKSwgXAorICAgICAgICBudG9ocygoYWRkcikuczZfYWRkcjE2WzddKQorCisjZGVmaW5lIERVTVBfQ09SRSB7IAkJCQkJIFwKKwljaGFyICpkaWVkaWVkaWUgPSAwOwkJCQkgXAorCXByaW50ZigiRFVNUF9DT1JFICVzOiAlZFxuIiwgX19GSUxFX18sIF9fTElORV9fKTtcCisJKmRpZWRpZWRpZSA9IDA7CQkJCQkgXAorfQorCisjaWZuZGVmIExUUAorZW51bSB7CisJVFBBU1MsCisJVElORk8sCit9OworCitleHRlcm4gY2hhciAqVENJRDsKK2V4dGVybiBpbnQgVFNUX1RPVEFMOworZXh0ZXJuIGludCBUU1RfQ05UOworCisjZGVmaW5lIHRzdF9icmttKGExLCBhMiwgd2hhdGV2ZXIuLi4pIFwKKwl7IFwKKwkJcHJpbnRmKCIlcyAlMmQgQlJPSyA6ICIsIFRDSUQsICsrVFNUX0NOVCk7IFwKKwkJcHJpbnRmKHdoYXRldmVyKTsgXAorCQlwcmludGYoIlxuIik7IFwKKwkJRFVNUF9DT1JFIFwKKwl9CisjZGVmaW5lIHRzdF9yZXNtKGExLCB3aGF0ZXZlci4uLikgXAorCXsgXAorCQlwcmludGYoIiVzICUyZCAlcyA6ICIsIFRDSUQsIFwKKwkJCSAoYTEgPT0gVFBBU1MpPysrVFNUX0NOVDowLCBcCisJCQkgKGExID09IFRQQVNTKT8iUEFTUyI6IklORk8iKTsgXAorCQlwcmludGYod2hhdGV2ZXIpOyBcCisJCXByaW50ZigiXG4iKTsgXAorCX0KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X3NvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQoreworCWludCBzayA9IHNvY2tldChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKyAgICAgICAgaWYgKC0xID09IHNrKQorICAgICAgICAgICAgICAgIHRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNvY2tldDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiBzazsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9iaW5kKGludCBzaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgYWRkcmxlbikKK3sKKwlpbnQgZXJyb3IgPSBiaW5kKHNrLCBhZGRyLCBhZGRybGVuKTsKKyAgICAgICAgaWYgKC0xID09IGVycm9yKQorICAgICAgICAgICAgICAgIHRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImJpbmQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfYmluZHhfYWRkKGludCBzaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgY291bnQpCit7CisJaW50IGVycm9yID0gc2N0cF9iaW5keChzaywgYWRkciwgY291bnQsIFNDVFBfQklORFhfQUREX0FERFIpOworICAgICAgICBpZiAoLTEgPT0gZXJyb3IpCisgICAgICAgICAgICAgICAgdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiYmluZHggKGFkZCk6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfbGlzdGVuKGludCBzaywgaW50IGJhY2tsb2cpCit7CisJaW50IGVycm9yID0gbGlzdGVuKHNrLCBiYWNrbG9nKTsKKyAgICAgICAgaWYgKC0xID09IGVycm9yKQorICAgICAgICAgICAgICAgIHRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImxpc3RlbjogJXMiLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9jb25uZWN0KGludCBzaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBzb2NrbGVuX3QgYWRkcmxlbikKK3sKKwlpbnQgZXJyb3IgPSBjb25uZWN0KHNrLCBhZGRyLCBhZGRybGVuKTsKKyAgICAgICAgaWYgKC0xID09IGVycm9yKQorICAgICAgICAgICAgICAgIHRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgImNvbm5lY3Q6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfY29ubmVjdHgoaW50IHNrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBjb3VudCkKK3sKKwlpbnQgZXJyb3IgPSBzY3RwX2Nvbm5lY3R4KHNrLCBhZGRyLCBjb3VudCwgTlVMTCk7CisgICAgICAgIGlmICgtMSA9PSBlcnJvcikKKyAgICAgICAgICAgICAgICB0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJjb25uZWN0eDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hY2NlcHQoaW50IHNrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNvY2tsZW5fdCAqYWRkcmxlbikKK3sKKwlpbnQgZXJyb3IgPSBhY2NlcHQoc2ssIGFkZHIsIGFkZHJsZW4pOworICAgICAgICBpZiAoLTEgPT0gZXJyb3IpCisgICAgICAgICAgICAgICAgdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiYWNjZXB0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X3NlbmQoaW50IHNrLCBjb25zdCB2b2lkICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncykKK3sKKwlpbnQgZXJyb3IgPSBzZW5kKHNrLCBtc2csIGxlbiwgZmxhZ3MpOworICAgICAgICBpZiAobGVuICE9IGVycm9yKQorICAgICAgICAgICAgICAgIHRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNlbmQ6IGVycm9yOiVkIGVycm5vOiVkIiwKKwkJCSBlcnJvciwgZXJybm8pOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9zZW5kdG8oaW50IHNrLCBjb25zdCB2b2lkICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncywKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqdG8sIHNvY2tsZW5fdCB0b2xlbikKK3sKKwlpbnQgZXJyb3IgPSBzZW5kdG8oc2ssIG1zZywgbGVuLCBmbGFncywgdG8sIHRvbGVuKTsKKyAgICAgICAgaWYgKGxlbiAhPSBlcnJvcikKKyAgICAgICAgICAgICAgICB0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZW5kdG86IGVycm9yOiVkIGVycm5vOiVkIiwKKwkJCSBlcnJvciwgZXJybm8pOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9zZW5kbXNnKGludCBzaywgY29uc3Qgc3RydWN0IG1zZ2hkciAqbXNnLCBpbnQgZmxhZ3MsCisJCQkgICAgICAgaW50IG1zZ2xlbikKK3sKKwlpbnQgZXJyb3IgPSBzZW5kbXNnKHNrLCBtc2csIGZsYWdzKTsKKyAgICAgICAgaWYgKG1zZ2xlbiAhPSBlcnJvcikKKyAgICAgICAgICAgICAgICB0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzZW5kbXNnOiBlcnJvcjolZCBlcnJubzolZCIsCisJCQkgZXJyb3IsIGVycm5vKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfcmVjdihpbnQgc2ssIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgaW50IGZsYWdzKQoreworCWludCBlcnJvciA9IHJlY3Yoc2ssIGJ1ZiwgbGVuLCBmbGFncyk7CisgICAgICAgIGlmICgtMSA9PSBlcnJvcikKKyAgICAgICAgICAgICAgICB0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJyZWN2OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X3JlY3Ztc2coaW50IHNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIGludCBmbGFncykKK3sKKwlpbnQgZXJyb3IgPSByZWN2bXNnKHNrLCBtc2csIGZsYWdzKTsKKyAgICAgICAgaWYgKC0xID09IGVycm9yKQorICAgICAgICAgICAgICAgIHRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInJlY3Ztc2c6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3Rfc2h1dGRvd24oaW50IHNrLCBpbnQgaG93KQoreworCWludCBlcnJvciA9IHNodXRkb3duKHNrLCBob3cpOworICAgICAgICBpZiAoLTEgPT0gZXJyb3IpCisgICAgICAgICAgICAgICAgdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2h1dGRvd246ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3RfZ2V0c29ja29wdChpbnQgc2ssIGludCBvcHRuYW1lLCB2b2lkICpvcHR2YWwsCisJCQkJICBzb2NrbGVuX3QgKm9wdGxlbikKK3sKKwlpbnQgZXJyb3IgPSBnZXRzb2Nrb3B0KHNrLCBTT0xfU0NUUCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworCWlmIChlcnJvcikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAiZ2V0c29ja29wdCglZCk6ICVzIiwgb3B0bmFtZSwKKwkJCSBzdHJlcnJvcihlcnJubykpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9zZXRzb2Nrb3B0KGludCBzaywgaW50IG9wdG5hbWUsIGNvbnN0IHZvaWQgKm9wdHZhbCwKKwkJCQkgIHNvY2tsZW5fdCBvcHRsZW4pCit7CisJaW50IGVycm9yID0gc2V0c29ja29wdChzaywgU09MX1NDVFAsIG9wdG5hbWUsIG9wdHZhbCwgb3B0bGVuKTsKKwlpZiAoZXJyb3IpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNldHNvY2tvcHQoJWQpOiAlcyIsIG9wdG5hbWUsCisJCQkgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3Rfc2N0cF9wZWVsb2ZmKGludCBzaywgc2N0cF9hc3NvY190IGFzc29jX2lkKQoreworCWludCBlcnJvciA9IHNjdHBfcGVlbG9mZihzaywgYXNzb2NfaWQpOworICAgICAgICBpZiAoLTEgPT0gZXJyb3IpCisgICAgICAgICAgICAgICAgdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2N0cF9wZWVsb2ZmOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X3NjdHBfc2VuZG1zZyhpbnQgcywgY29uc3Qgdm9pZCAqbXNnLCBzaXplX3QgbGVuLAorCQkJCSAgICBzdHJ1Y3Qgc29ja2FkZHIgKnRvLCBzb2NrbGVuX3QgdG9sZW4sCisJCQkJICAgIHVpbnQzMl90IHBwaWQsIHVpbnQzMl90IGZsYWdzLAorCQkJCSAgICB1aW50MTZfdCBzdHJlYW1fbm8sIHVpbnQzMl90IHRpbWV0b2xpdmUsCisJCQkJICAgIHVpbnQzMl90IGNvbnRleHQpCit7CisJaW50IGVycm9yID0gc2N0cF9zZW5kbXNnKHMsIG1zZywgbGVuLCB0bywgdG9sZW4sIHBwaWQsIGZsYWdzLCBzdHJlYW1fbm8sCisJICAJCSAgICAgICAgIHRpbWV0b2xpdmUsIGNvbnRleHQpOworCWlmIChsZW4gIT0gZXJyb3IpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNjdHBfc2VuZG1zZzogZXJyb3I6JWQgZXJybm86JWQiLAorCQkJIGVycm9yLCBlcnJubyk7CisJcmV0dXJuIGVycm9yOwkJCQorfQorCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X3NjdHBfc2VuZChpbnQgcywgY29uc3Qgdm9pZCAqbXNnLCBzaXplX3QgbGVuLAorCQkJCSBjb25zdCBzdHJ1Y3Qgc2N0cF9zbmRyY3ZpbmZvICpzaW5mbywgCisJCQkJIGludCBmbGFncykKK3sKKwlpbnQgZXJyb3IgPSBzY3RwX3NlbmQocywgbXNnLCBsZW4sIHNpbmZvLCBmbGFncyk7CisJaWYgKGxlbiAhPSBlcnJvcikKKwkJdHN0X2Jya20oVEJST0ssIHRzdF9leGl0LCAic2N0cF9zZW5kOiBlcnJvcjolZCBlcnJubzolZCIsCisJCQkgZXJyb3IsIGVycm5vKTsKKwlyZXR1cm4gZXJyb3I7CQkJCit9CisKKyNpZmRlZiBIQVZFX1NDVFBfU0VORFYKK3N0YXRpYyBpbmxpbmUgaW50IHRlc3Rfc2N0cF9zZW5kdihpbnQgcywgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGludCBpb3ZjbnQsCisJCQkJICBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHJzLCBpbnQgYWRkcmNudCwKKwkJCQkgIHZvaWQgKmluZm8sIHNvY2tsZW5fdCBpbmZvbGVuLAorCQkJCSAgdW5zaWduZWQgaW50IGluZm90eXBlLCBpbnQgZmxhZ3MpCit7CisJaW50IGVycm9yID0gc2N0cF9zZW5kdihzLCBpb3YsIGlvdmNudCwgYWRkcnMsIGFkZHJjbnQsIGluZm8sIGluZm9sZW4sCisJCQkgICAgICAgaW5mb3R5cGUsIGZsYWdzKTsKKwlpbnQgaSwgdGxlbiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW92Y250OyBpKyspCisJCXRsZW4gKz0gaW92LT5pb3ZfbGVuOworCisJaWYgKHRsZW4gIT0gZXJyb3IpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNjdHBfc2VuZHY6IGVycm9yOiVkIGVycm5vOiVkIiwKKwkJCSBlcnJvciwgZXJybm8pOworCXJldHVybiBlcnJvcjsKK30KKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X3NjdHBfcmVjdm1zZyhpbnQgc2ssIHZvaWQgKm1zZywgc2l6ZV90IGxlbiwKKwkJCQkgICAgc3RydWN0IHNvY2thZGRyICpmcm9tLCBzb2NrbGVuX3QgKmZyb21sZW4sCisJCQkJICAgIHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gKnNpbmZvLAorCQkJCSAgICBpbnQgKm1zZ19mbGFncykKK3sKKwlpbnQgZXJyb3IgPSBzY3RwX3JlY3Ztc2coc2ssIG1zZywgbGVuLCBmcm9tLCBmcm9tbGVuLCBzaW5mbywgbXNnX2ZsYWdzKTsKKwlpZiAoLTEgPT0gZXJyb3IpCisJCXRzdF9icmttKFRCUk9LLCB0c3RfZXhpdCwgInNjdHBfcmVjdm1zZzogJXMiLCBzdHJlcnJvcihlcnJubykpOworCXJldHVybiBlcnJvcjsJCQkKK30KKworI2lmZGVmIEhBVkVfU0NUUF9TRU5EVgorc3RhdGljIGlubGluZSBpbnQgdGVzdF9zY3RwX3JlY3Z2KGludCBzLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdmxlbiwKKwkJCQkgIHN0cnVjdCBzb2NrYWRkciAqZnJvbSwgc29ja2xlbl90ICpmcm9tbGVuLAorCQkJCSAgdm9pZCAqaW5mbywgc29ja2xlbl90ICppbmZvbGVuLAorCQkJCSAgdW5zaWduZWQgaW50ICppbmZvdHlwZSwgaW50ICpmbGFncykKK3sKKwlpbnQgZXJyb3IgPSBzY3RwX3JlY3Z2KHMsIGlvdiwgaW92bGVuLCBmcm9tLCBmcm9tbGVuLCBpbmZvLCBpbmZvbGVuLAorCQkJICAgICAgIGluZm90eXBlLCBmbGFncyk7CisJaWYgKC0xID09IGVycm9yKQorCQl0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJzY3RwX3JlY3Ztc2c6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkICp0ZXN0X21hbGxvYyhzaXplX3Qgc2l6ZSkKK3sKKwl2b2lkICpidWYgPSBtYWxsb2Moc2l6ZSk7CisgICAgICAgIGlmIChOVUxMID09IGJ1ZikKKyAgICAgICAgICAgICAgICB0c3RfYnJrbShUQlJPSywgdHN0X2V4aXQsICJtYWxsb2MgZmFpbGVkIik7CisJcmV0dXJuIGJ1ZjsKK30KKwordm9pZCB0ZXN0X2NoZWNrX21zZ19ub3RpZmljYXRpb24oc3RydWN0IG1zZ2hkciAqLCBpbnQsIGludCwgdWludDE2X3QsIHVpbnQzMl90KTsKK3ZvaWQgdGVzdF9jaGVja19idWZfbm90aWZpY2F0aW9uKHZvaWQgKiwgaW50LCBpbnQsIGludCwgdWludDE2X3QsIHVpbnQzMl90KTsKK3ZvaWQgdGVzdF9jaGVja19tc2dfZGF0YShzdHJ1Y3QgbXNnaGRyICosIGludCwgaW50LCBpbnQsIHVpbnQxNl90LCB1aW50MzJfdCk7Cit2b2lkIHRlc3RfY2hlY2tfYnVmX2RhdGEodm9pZCAqLCBpbnQsIGludCwgc3RydWN0IHNjdHBfc25kcmN2aW5mbyAqLCBpbnQsIGludCwKKwkJCSB1aW50MTZfdCwgdWludDMyX3QpOwordm9pZCAqdGVzdF9idWlsZF9tc2coaW50KTsKK3ZvaWQgdGVzdF9lbmFibGVfYXNzb2NfY2hhbmdlKGludCk7Cit2b2lkIHRlc3RfcHJpbnRfbWVzc2FnZShpbnQgc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IG1zZ19sZW4pOworaW50IHRlc3RfcGVlcl9hZGRyKGludCBzaywgc2N0cF9hc3NvY190IGFzb2MsIHNvY2thZGRyX3N0b3JhZ2VfdCAqcGVlcnMsIGludCBjb3VudCk7CisKKyNlbmRpZiAvKiBfX3NjdHB1dGlsX2hfXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3dpdGhzY3RwLy5naXRpZ25vcmUgYi9zcmMvd2l0aHNjdHAvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OThlNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpdGhzY3RwLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyIEBACitjaGVja3NjdHAKK3dpdGhzY3RwCmRpZmYgLS1naXQgYS9zcmMvd2l0aHNjdHAvTWFrZWZpbGUuYW0gYi9zcmMvd2l0aHNjdHAvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1NzU4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93aXRoc2N0cC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDI4IEBACisjIC0qLSBNYWtlZmlsZSAtKi0KKyMKKyMgVGhlIGF1dGhvciAoTGEgTW9udGUgSC5QLiBZYXJyb2xsKSBkaXNjbGFpbXMgY29weXJpZ2h0IG9uIHRoaXMgZmlsZS4KKyMKKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL01ha2VmaWxlLnZhcnMKK2luY2x1ZGUgJCh0b3Bfc3JjZGlyKS9NYWtlZmlsZS5kaXJzCitpbmNsdWRlICQodG9wX3NyY2RpcikvTWFrZWZpbGUucnVsZXMKKworYmluX1BST0dSQU1TID0gY2hlY2tzY3RwCitiaW5fU0NSSVBUUyA9IHdpdGhzY3RwCisKK0FNX0NQUEZMQUdTPS1JJCh0b3BfYnVpbGRkaXIpL3NyYy9pbmNsdWRlCitwa2dsaWJfTFRMSUJSQVJJRVMgPSBsaWJ3aXRoc2N0cC5sYQorbGlid2l0aHNjdHBfbGFfU09VUkNFUyA9IHNjdHBfbG9hZF9saWJzLmMgc2N0cF9zb2NrZXQuYyBzY3RwX2JpbmQuYyBcCisJc2N0cF9zb2Nrb3B0LmMgc2N0cF9zb2NrZXQuaAorbGlid2l0aHNjdHBfbGFfTERGTEFHUyA9IC12ZXJzaW9uLWluZm8gXAorCUBMSUJXSVRIU0NUUF9DVVJSRU5UQDpATElCV0lUSFNDVFBfUkVWSVNJT05AOkBMSUJXSVRIU0NUUF9BR0VAIC1sZGwKKworcGtnZG9jX0RBVEEgPSBzY3RwX2xvYWRfbGlicy5jIHNjdHBfc29ja2V0LmMgc2N0cF9iaW5kLmMgXAorCXNjdHBfc29ja29wdC5jIHNjdHBfc29ja2V0LmggY2hlY2tzY3RwLmMKKword2l0aHNjdHA6IHdpdGhzY3RwLmluCisJJChlZGl0KSAkPCA+JEAKKworRVhUUkFfRElTVCArPSB3aXRoc2N0cC5pbgorCitDTEVBTkZJTEVTICs9IHdpdGhzY3RwCmRpZmYgLS1naXQgYS9zcmMvd2l0aHNjdHAvUkVBRE1FIGIvc3JjL3dpdGhzY3RwL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2Q4Yjk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpdGhzY3RwL1JFQURNRQpAQCAtMCwwICsxLDE1IEBACitUaGlzIGlzIGEgcGFja2FnZSB0byBsZXQgeW91IHVzZSBTQ1RQIHdpdGggeW91ciBleGlzdGluZyBUQ1AtYmFzZWQgYmluYXJpZXMuCisKK3VzYWdlOgorCiskIHdpdGhzY3RwIHhpbmV0ZAkjIFN0YXJ0IHhpbmV0ZCBzdHJlYW0gc2VydmljZXMgb24gU0NUUC4KKyQgd2l0aHNjdHAgdGVsbmV0IGxvY2FsaG9zdAkjIE1ha2UgYSB0ZWxuZXQgb3ZlciBTQ1RQL0lQIGNvbm5lY3Rpb24uCisKK1RvIGluc3RhbGwsIGVkaXQgdGhlIHRvcCBvZiBNYWtlZmlsZSB0byBzZXQgeW91ciBpbnN0YWxsIHBhdGgocykgYW5kIHRoZW4KKworJCBtYWtlIGFsbAorIyBtYWtlIGluc3RhbGwKKworVGhpcyBwYWNrYWdlIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBMYSBNb250ZSBILlAuIFlhcnJvbGwgPHBpZ2d5QGFjbS5vcmc+LgorVG8gc3VibWl0IGZpeGVzIG9yIGJ1ZyByZXBvcnRzIHNlZSBsa3NjdHAuc291cmNlZm9yZ2V0Lm5ldC4KK1lvdSBjYW4gdHJ5IHRoZSBhdXRob3Igb3IgbGtzY3RwLWRldmVsb3BlcnNAbGlzdHMuc291cmNlZm9yZ2V0Lm5ldCBmb3Igc3VwcG9ydC4KZGlmZiAtLWdpdCBhL3NyYy93aXRoc2N0cC9jaGVja3NjdHAuYyBiL3NyYy93aXRoc2N0cC9jaGVja3NjdHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGE5YzFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpdGhzY3RwL2NoZWNrc2N0cC5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIERvZXMgdGhpcyBob3N0IGhhdmUgU0NUUD8KKyAqCisgKiBDb3B5cmlnaHQgMjAwMyBMYSBNb250ZSBIUCBZYXJyb2xsIDxwaWdneUBhY20ub3JnPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoCisgKiB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICogT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisvKiBJUFBST1RPX1NDVFAgU0hPVUxEIGJlIGRlZmluZWQgaW4KKyAqIC91c3IvaW5jbHVkZS9saW51eC9pbi5oIGJ1dCBwcm9iYWJseSBpc24ndC4KKyAqIEl0IGlzIGFuIGVudW0gZWxlbWVudCwgbm90IGEgI2RlZmluZSwgc28gd2UgY2FuJ3QgZWFzaWx5IGNoZWNrLgorICovCisjZGVmaW5lIFNIT1VMRF9JUFBST1RPX1NDVFAgMTMyCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGZkOworCisgICAgZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19TVFJFQU0sIFNIT1VMRF9JUFBST1RPX1NDVFApOworCisgICAgaWYgKGZkIDw9IDApIHsKKwlwZXJyb3IoImNoZWNrc2N0cCIpOworCWV4aXQoMSk7CisgICAgfSBlbHNlIHsKKwlmcHJpbnRmKHN0ZGVyciwgIlNDVFAgc3VwcG9ydGVkXG4iKTsKKyAgICB9CisKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvd2l0aHNjdHAvbm90ZXMudHh0IGIvc3JjL3dpdGhzY3RwL25vdGVzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjUzMmVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpdGhzY3RwL25vdGVzLnR4dApAQCAtMCwwICsxLDYgQEAKK0ZyaSBEZWMgMjYgMTY6MjA6MzYgRVNUIDIwMDMKKworSXQgd291bGQgYmUgbmljZSBmb3Igd2l0aHNjdHAgdG8gcHJvdmlkZSBtb3JlIGZhY2lsaXRpZXMuCisKK1BlcmhhcHMgd2UgY291bGQgY2FwdHVyZSB0aGUgYmluZCBjYWxsIGFuZCBhbGxvdyBzdWJzdGl0dXRpb24gc3VjaCBhcyB0aGUKK2FyZ3VtZW50cyB0byBzY3RwX2Rhcm4uCmRpZmYgLS1naXQgYS9zcmMvd2l0aHNjdHAvc2N0cF9iaW5kLmMgYi9zcmMvd2l0aHNjdHAvc2N0cF9iaW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0NDI3MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93aXRoc2N0cC9zY3RwX2JpbmQuYwpAQCAtMCwwICsxLDU4IEBACisvKiBXcmFwIGJpbmQoKSB0byBmb3JjZSB0aGUgcHJvdG9jb2wgZm9yIFNUUkVBTSBjb25uZWN0aW9ucyB0byBTQ1RQLgorICogCisgKiBUaGFua3MgdG8gTWlkZ2FyZCBTZWN1cml0eSBTZXJ2aWNlcyBmb3IKKyAqIGh0dHA6Ly93d3cuc2VjdXJpdGVhbS5jb20vdG9vbHMvM0Q1UFRSNVFBRS5odG1sCisgKiBmcm9tIHdoZW5jZSBJIGNyaWJiZWQgdGhlIGNvZGUgdG8gZmluZCB0aGUgb2xkIGJpbmQoKS4KKyAqIAorICogZ2NjIHNjdHBfc29ja2V0LmMgc2N0cF9iaW5kLmMgLW8gc2N0cF9zb2NrZXQuc28gLWxkbCAtc2hhcmVkIC1PMiAtcworICogZXhwb3J0IExEX1BSRUxPQUQ9Li9zY3RwX3NvY2tldC5zbworICogCisgKiBDb3B5cmlnaHQgMjAwMyBMYSBNb250ZSBIUCBZYXJyb2xsIDxwaWdneUBhY20ub3JnPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoCisgKiB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICogT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+IC8qIGZvciBzdHJuY21wKCkgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInNjdHBfc29ja2V0LmgiCisKKy8qIElQUFJPVE9fU0NUUCBTSE9VTEQgYmUgZGVmaW5lZCBpbgorICogL3Vzci9pbmNsdWRlL2xpbnV4L2luLmggYnV0IHByb2JhYmx5IGlzbid0LgorICogSXQgaXMgYW4gZW51bSBlbGVtZW50LCBub3QgYSAjZGVmaW5lLCBzbyB3ZSBjYW4ndCBlYXNpbHkgY2hlY2suCisgKi8KKyNkZWZpbmUgU0hPVUxEX0lQUFJPVE9fU0NUUCAxMzIKKworaW50CitiaW5kKGludCBzb2NrZmQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqbXlfYWRkciwgc29ja2xlbl90IGFkZHJsZW4pCit7CisgICAgX3NjdHBfbG9hZF9saWJzKCk7CisKKyAgICAvKiBTVFVCLiAgVGhlIGludGVudCBpcyB0byBhbGxvdyB1cyB0byBzdWJzdGl0dXRlIGFuIGVsYWJvcmF0ZSBjYWxsIHRvCisgICAgICogYmluZHgoKSBmb3IgdGhlIGluaXRpYWwgY2FsbCB0byBiaW5kKCkuICBUQkQuCisgICAgICovCisKKyAgICByZXR1cm4gKHJlYWxfYmluZCkoc29ja2ZkLCBteV9hZGRyLCBhZGRybGVuKTsKK30KZGlmZiAtLWdpdCBhL3NyYy93aXRoc2N0cC9zY3RwX2xvYWRfbGlicy5jIGIvc3JjL3dpdGhzY3RwL3NjdHBfbG9hZF9saWJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhNTIxZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93aXRoc2N0cC9zY3RwX2xvYWRfbGlicy5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIExvYWQgdGhlIHJlYWwgdW5kZXJseWluZyBmdW5jdGlvbnMgZm9yIHdpdGhzY3RwIGFuZCByZWxhdGVkIHNjcmlwdHMuCisgKgorICogQ29weXJpZ2h0IDIwMDMgTGEgTW9udGUgSFAgWWFycm9sbCA8cGlnZ3lAYWNtLm9yZz4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aAorICogdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAic2N0cF9zb2NrZXQuaCIKKworaW50ICgqcmVhbF9iaW5kKShpbnQgIHNvY2tmZCwgY29uc3Qgc3RydWN0IHNvY2thZGRyICpteV9hZGRyLCBzb2NrbGVuX3QgYWRkcmxlbik7CitpbnQgKCpyZWFsX3NvY2tldCkoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCk7CitpbnQgKCpyZWFsX3NldHNvY2tvcHQpKGludCBzLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjb25zdCB2b2lkICpvcHR2YWwsCisJCSAgICAgICBzb2NrbGVuX3Qgb3B0bGVuKTsJCitzdGF0aWMgdm9pZCAqbGliX2hhbmRsZSA9IE5VTEw7CisKK3ZvaWQKK19zY3RwX2xvYWRfbGlicyh2b2lkKQoreworICAgIGlmIChOVUxMICE9IGxpYl9oYW5kbGUpIHJldHVybjsgLyogT25seSBpbml0IG9uY2UuICAqLworCisgICAgaWYgKCEobGliX2hhbmRsZSA9IGRsb3BlbigibGliYy5zbyIsIFJUTERfTEFaWSkpKSB7CisJaWYgKCEobGliX2hhbmRsZSA9IGRsb3BlbigibGliYy5zby42IiwgUlRMRF9MQVpZKSkpIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJlcnJvciBsb2FkaW5nIGxpYmMhXG4iKTsKKwkgICAgZXhpdCAoMSk7CisJfQorICAgIH0KKyAgICAKKyAgICBpZiAoIShyZWFsX3NvY2tldCA9IGRsc3ltKGxpYl9oYW5kbGUsICJzb2NrZXQiKSkpIHsKKwlmcHJpbnRmKHN0ZGVyciwgInNvY2tldCgpIG5vdCBmb3VuZCBpbiBsaWJjIVxuIik7CisJZXhpdCAoMSk7CisgICAgfQorCisgICAgaWYgKCEocmVhbF9iaW5kID0gZGxzeW0obGliX2hhbmRsZSwgImJpbmQiKSkpIHsKKwlmcHJpbnRmKHN0ZGVyciwgImJpbmQoKSBub3QgZm91bmQgaW4gbGliYyFcbiIpOworCWV4aXQgKDEpOworICAgIH0KKworICAgIGlmICghKHJlYWxfc2V0c29ja29wdCA9IGRsc3ltKGxpYl9oYW5kbGUsICJzZXRzb2Nrb3B0IikpKSB7CisJZnByaW50ZihzdGRlcnIsICJzZXRzb2Nrb3B0KCkgbm90IGZvdW5kIGluIGxpYmMhXG4iKTsKKwlleGl0ICgxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvd2l0aHNjdHAvc2N0cF9zb2NrZXQuYyBiL3NyYy93aXRoc2N0cC9zY3RwX3NvY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZDczYWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvd2l0aHNjdHAvc2N0cF9zb2NrZXQuYwpAQCAtMCwwICsxLDU5IEBACisvKiBXcmFwIHNvY2tldCgpIHRvIGZvcmNlIHRoZSBwcm90b2NvbCB0byBTQ1RQIGZvciBTVFJFQU0gY29ubmVjdGlvbnMuCisgKiAKKyAqIFRoYW5rcyB0byBNaWRnYXJkIFNlY3VyaXR5IFNlcnZpY2VzIGZvcgorICogaHR0cDovL3d3dy5zZWN1cml0ZWFtLmNvbS90b29scy8zRDVQVFI1UUFFLmh0bWwKKyAqIGZyb20gd2hlbmNlIEkgY3JpYmJlZCB0aGUgY29kZSB0byBmaW5kIHRoZSBvbGQgc29ja2V0KCkuCisgKiAKKyAqIGdjYyBzY3RwX3NvY2tldC5jIC1vIHNjdHBfc29ja2V0LnNvIC1sZGwgLXNoYXJlZCAtTzIgLXMKKyAqIGV4cG9ydCBMRF9QUkVMT0FEPS4vc2N0cF9zb2NrZXQuc28KKyAqIAorICogQ29weXJpZ2h0IDIwMDMgTGEgTW9udGUgSFAgWWFycm9sbCA8cGlnZ3lAYWNtLm9yZz4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aAorICogdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworI2luY2x1ZGUgPHN0cmluZy5oPiAvKiBmb3Igc3RybmNtcCgpICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzY3RwX3NvY2tldC5oIgorCisvKiBJUFBST1RPX1NDVFAgU0hPVUxEIGJlIGRlZmluZWQgaW4KKyAqIC91c3IvaW5jbHVkZS9saW51eC9pbi5oIGJ1dCBwcm9iYWJseSBpc24ndC4KKyAqIEl0IGlzIGFuIGVudW0gZWxlbWVudCwgbm90IGEgI2RlZmluZSwgc28gd2UgY2FuJ3QgZWFzaWx5IGNoZWNrLgorICovCisjZGVmaW5lIFNIT1VMRF9JUFBST1RPX1NDVFAgMTMyCisKK2ludCAKK3NvY2tldChpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKQoreworICAgIF9zY3RwX2xvYWRfbGlicygpOworCisgICAgaWYgKCgoUEZfSU5FVCA9PSBkb21haW4pIHx8IChQRl9JTkVUNiA9PSBkb21haW4pKQorCSYmIChTT0NLX1NUUkVBTSA9PSB0eXBlKSkgeworCXByb3RvY29sID0gU0hPVUxEX0lQUFJPVE9fU0NUUDsKKyAgICB9CisKKyAgICByZXR1cm4gKHJlYWxfc29ja2V0KShkb21haW4sIHR5cGUsIHByb3RvY29sKTsKK30KZGlmZiAtLWdpdCBhL3NyYy93aXRoc2N0cC9zY3RwX3NvY2tldC5oIGIvc3JjL3dpdGhzY3RwL3NjdHBfc29ja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjODIyNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy93aXRoc2N0cC9zY3RwX3NvY2tldC5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIFByZXByb2Nlc3NvciBkZWZpbml0aW9ucyBmb3Igd2l0aHNjdHAgYW5kIHN1cHBvcnRpbmcgc2NyaXB0cy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMyBMYSBNb250ZSBIUCBZYXJyb2xsIDxwaWdneUBhY20ub3JnPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoCisgKiB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqIHBlcm1pc3Npb24uCisgKiAKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorICogR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorICogT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgorICogSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICogQ29weXJpZ2h0IDIwMDMgTGEgTW9udGUgSFAgWWFycm9sbCA8cGlnZ3lAYWNtLm9yZz4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aAorICogdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworI2luY2x1ZGUgPGRsZmNuLmg+IC8qIGZvciBkbG9wZW4oKSBhbmQgY29tcGFueSAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9zY3RwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKworZXh0ZXJuIGludCAoKnJlYWxfYmluZCkoaW50ICBzb2NrZmQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqbXlfYWRkciwgc29ja2xlbl90IGFkZHJsZW4pOworZXh0ZXJuIGludCAoKnJlYWxfc29ja2V0KShpbnQgZG9tYWluLCBpbnQgdHlwZSwgaW50IHByb3RvY29sKTsKK2V4dGVybiBpbnQgKCpyZWFsX3NldHNvY2tvcHQpKGludCBzLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBjb25zdCB2b2lkICpvcHR2YWwsCisJCQkgICAgICBzb2NrbGVuX3Qgb3B0bGVuKTsKK2V4dGVybiB2b2lkIF9zY3RwX2xvYWRfbGlicyh2b2lkKTsKZGlmZiAtLWdpdCBhL3NyYy93aXRoc2N0cC9zY3RwX3NvY2tvcHQuYyBiL3NyYy93aXRoc2N0cC9zY3RwX3NvY2tvcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWI4MzA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3dpdGhzY3RwL3NjdHBfc29ja29wdC5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIFdyYXAgc29ja2V0KCkgdG8gZm9yY2UgdGhlIHByb3RvY29sIHRvIFNDVFAgZm9yIFNUUkVBTSBjb25uZWN0aW9ucy4KKyAqIAorICogVGhhbmtzIHRvIE1pZGdhcmQgU2VjdXJpdHkgU2VydmljZXMgZm9yCisgKiBodHRwOi8vd3d3LnNlY3VyaXRlYW0uY29tL3Rvb2xzLzNENVBUUjVRQUUuaHRtbAorICogZnJvbSB3aGVuY2UgSSBjcmliYmVkIHRoZSBjb2RlIHRvIGZpbmQgdGhlIG9sZCBzb2NrZXQoKS4KKyAqIAorICogQ29weXJpZ2h0IDIwMDMgTGEgTW9udGUgSFAgWWFycm9sbCA8cGlnZ3lAYWNtLm9yZz4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aAorICogdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCisgKiBwZXJtaXNzaW9uLgorICogCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgorICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKKyAqIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKKyAqIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KKyAqIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworI2luY2x1ZGUgPHN0cmluZy5oPiAvKiBmb3Igc3RybmNtcCgpICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJzY3RwX3NvY2tldC5oIgorCisvKiBJUFBST1RPX1NDVFAgU0hPVUxEIGJlIGRlZmluZWQgaW4KKyAqIC91c3IvaW5jbHVkZS9saW51eC9pbi5oIGJ1dCBwcm9iYWJseSBpc24ndC4KKyAqIEl0IGlzIGFuIGVudW0gZWxlbWVudCwgbm90IGEgI2RlZmluZSwgc28gd2UgY2FuJ3QgZWFzaWx5IGNoZWNrLgorICovCisjZGVmaW5lIFNIT1VMRF9JUFBST1RPX1NDVFAgMTMyCisKK2ludCAKK3NldHNvY2tvcHQoaW50IHMsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGNvbnN0IHZvaWQgKm9wdHZhbCwgc29ja2xlbl90IG9wdGxlbikKK3sKKyAgICBfc2N0cF9sb2FkX2xpYnMoKTsKKworICAgIGlmICgoSVBQUk9UT19UQ1AgPT0gbGV2ZWwpICYmIChUQ1BfTk9ERUxBWSA9PSBvcHRuYW1lKSkgeworCWxldmVsID0gU0hPVUxEX0lQUFJPVE9fU0NUUDsKKwlvcHRuYW1lID0gU0NUUF9OT0RFTEFZOworICAgIH0KKworICAgIHJldHVybiAocmVhbF9zZXRzb2Nrb3B0KShzLCBsZXZlbCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOworfQpkaWZmIC0tZ2l0IGEvc3JjL3dpdGhzY3RwL3dpdGhzY3RwLmluIGIvc3JjL3dpdGhzY3RwL3dpdGhzY3RwLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNGY3YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvd2l0aHNjdHAvd2l0aHNjdHAuaW4KQEAgLTAsMCArMSwxMyBAQAorIyEvYmluL3NoCisjIC0qLSBzaCAtKi0KK0xJQkRJUj1AbGliZGlyQC9AUEFDS0FHRUAKK0JJTkRJUj1AYmluZGlyQAorTElCVkVSPUBMSUJXSVRIU0NUUF9DVVJSRU5UQC5ATElCV0lUSFNDVFBfQUdFQC5ATElCV0lUSFNDVFBfUkVWSVNJT05ACitleHBvcnQgTERfUFJFTE9BRD0ke0xJQkRJUn0vbGlid2l0aHNjdHAuc28uJHtMSUJWRVJ9CitpZiAhICR7QklORElSfS9jaGVja3NjdHAgMj4gL2Rldi9udWxsCit0aGVuCisgICAgJHtCSU5ESVJ9L2NoZWNrc2N0cDsKKyAgICBleGl0IDE7CitmaQorCitleGVjICIkQCIK