ZGlmZiAtLWdpdCBhL25ldC9pcmRhL2lyaWFwLmMgYi9uZXQvaXJkYS9pcmlhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YmI3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXJkYS9pcmlhcC5jCkBAIC0wLDAgKzEsMTA4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEZpbGVuYW1lOiAgICAgIGlyaWFwLmMKKyAqIFZlcnNpb246ICAgICAgIDAuOAorICogRGVzY3JpcHRpb246ICAgSW5mb3JtYXRpb24gQWNjZXNzIFByb3RvY29sIChJQVApCisgKiBTdGF0dXM6ICAgICAgICBFeHBlcmltZW50YWwuCisgKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CisgKiBDcmVhdGVkIGF0OiAgICBUaHUgQXVnIDIxIDAwOjAyOjA3IDE5OTcKKyAqIE1vZGlmaWVkIGF0OiAgIFNhdCBEZWMgMjUgMTY6NDI6NDIgMTk5OQorICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgorICoKKyAqICAgICBDb3B5cmlnaHQgKGMpIDE5OTgtMTk5OSBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+LAorICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiAgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgSmVhbiBUb3VycmlsaGVzIDxqdEBocGwuaHAuY29tPgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCisgKiAgICAgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuIFRoaXMgbWF0ZXJpYWwgaXMKKyAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmRhLmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJ0dHAuaD4KKyNpbmNsdWRlIDxuZXQvaXJkYS9pcmxtcC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFzX29iamVjdC5oPgorI2luY2x1ZGUgPG5ldC9pcmRhL2lyaWFwX2V2ZW50Lmg+CisjaW5jbHVkZSA8bmV0L2lyZGEvaXJpYXAuaD4KKworI2lmZGVmIENPTkZJR19JUkRBX0RFQlVHCisvKiBGSVhNRTogVGhpcyBvbmUgc2hvdWxkIGdvIGluIGlybG1wLmMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICppYXNfY2hhcnNldF90eXBlc1tdID0geworCSJDU19BU0NJSSIsCisJIkNTX0lTT184ODU5XzEiLAorCSJDU19JU09fODg1OV8yIiwKKwkiQ1NfSVNPXzg4NTlfMyIsCisJIkNTX0lTT184ODU5XzQiLAorCSJDU19JU09fODg1OV81IiwKKwkiQ1NfSVNPXzg4NTlfNiIsCisJIkNTX0lTT184ODU5XzciLAorCSJDU19JU09fODg1OV84IiwKKwkiQ1NfSVNPXzg4NTlfOSIsCisJIkNTX1VOSUNPREUiCit9OworI2VuZGlmCS8qIENPTkZJR19JUkRBX0RFQlVHICovCisKK3N0YXRpYyBoYXNoYmluX3QgKmlyaWFwID0gTlVMTDsKK3N0YXRpYyB2b2lkICpzZXJ2aWNlX2hhbmRsZTsKKworc3RhdGljIHZvaWQgX19pcmlhcF9jbG9zZShzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYpOworc3RhdGljIGludCBpcmlhcF9yZWdpc3Rlcl9sc2FwKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgX191OCBzbHNhcF9zZWwsIGludCBtb2RlKTsKK3N0YXRpYyB2b2lkIGlyaWFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCQlMTV9SRUFTT04gcmVhc29uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyB2b2lkIGlyaWFwX2Nvbm5lY3RfaW5kaWNhdGlvbih2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLAorCQkJCSAgICAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZHVfc2l6ZSwKKwkJCQkgICAgIF9fdTggbWF4X2hlYWRlcl9zaXplLAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgdm9pZCBpcmlhcF9jb25uZWN0X2NvbmZpcm0odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLAorCQkJCSAgX191MzIgbWF4X3NkdV9zaXplLCBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpOworc3RhdGljIGludCBpcmlhcF9kYXRhX2luZGljYXRpb24odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKK3N0YXRpYyB2b2lkIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQodm9pZCAqZGF0YSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcmlhcF9zdGFydF93YXRjaGRvZ190aW1lcihzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsIAorCQkJCQkgICAgICBpbnQgdGltZW91dCkgCit7CisJaXJkYV9zdGFydF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIsIHRpbWVvdXQsIHNlbGYsIAorCQkJIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQpOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXBfaW5pdCAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplcyB0aGUgSXJJQVAgbGF5ZXIsIGNhbGxlZCBieSB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGNvZGUKKyAqICAgIGluIGlybW9kLmMKKyAqLworaW50IF9faW5pdCBpcmlhcF9pbml0KHZvaWQpCit7CisJc3RydWN0IGlhc19vYmplY3QgKm9iajsKKwlzdHJ1Y3QgaXJpYXBfY2IgKnNlcnZlcjsKKwlfX3U4IG9jdF9zZXFbNl07CisJX191MTYgaGludHM7CisKKwkvKiBBbGxvY2F0ZSBtYXN0ZXIgYXJyYXkgKi8KKwlpcmlhcCA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOworCWlmICghaXJpYXApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogT2JqZWN0IHJlcG9zaXRvcnkgLSBkZWZpbmVkIGluIGlyaWFzX29iamVjdC5jICovCisJaXJpYXNfb2JqZWN0cyA9IGhhc2hiaW5fbmV3KEhCX0xPQ0spOworCWlmICghaXJpYXNfb2JqZWN0cykgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBDYW4ndCBhbGxvY2F0ZSBpcmlhc19vYmplY3RzIGhhc2hiaW4hXG4iLAorCQkJICAgICBfX0ZVTkNUSU9OX18pOworCQloYXNoYmluX2RlbGV0ZShpcmlhcCwgTlVMTCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogIFJlZ2lzdGVyIHNvbWUgZGVmYXVsdCBzZXJ2aWNlcyBmb3IgSXJMTVAKKwkgKi8KKwloaW50cyAgPSBpcmxtcF9zZXJ2aWNlX3RvX2hpbnQoU19DT01QVVRFUik7CisJc2VydmljZV9oYW5kbGUgPSBpcmxtcF9yZWdpc3Rlcl9zZXJ2aWNlKGhpbnRzKTsKKworCS8qIFJlZ2lzdGVyIHRoZSBEZXZpY2Ugb2JqZWN0IHdpdGggTE0tSUFTICovCisJb2JqID0gaXJpYXNfbmV3X29iamVjdCgiRGV2aWNlIiwgSUFTX0RFVklDRV9JRCk7CisJaXJpYXNfYWRkX3N0cmluZ19hdHRyaWIob2JqLCAiRGV2aWNlTmFtZSIsICJMaW51eCIsIElBU19LRVJORUxfQVRUUik7CisKKwlvY3Rfc2VxWzBdID0gMHgwMTsgIC8qIFZlcnNpb24gMSAqLworCW9jdF9zZXFbMV0gPSAweDAwOyAgLyogSUFTIHN1cHBvcnQgYml0cyAqLworCW9jdF9zZXFbMl0gPSAweDAwOyAgLyogTE0tTVVYIHN1cHBvcnQgYml0cyAqLworI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCisJb2N0X3NlcVsyXSB8PSAweDA0OyAvKiBDb25uZWN0aW9ubGVzcyBEYXRhIHN1cHBvcnQgKi8KKyNlbmRpZgorCWlyaWFzX2FkZF9vY3RzZXFfYXR0cmliKG9iaiwgIklyTE1QU3VwcG9ydCIsIG9jdF9zZXEsIDMsCisJCQkJSUFTX0tFUk5FTF9BVFRSKTsKKwlpcmlhc19pbnNlcnRfb2JqZWN0KG9iaik7CisKKwkvKgorCSAqICBSZWdpc3RlciBzZXJ2ZXIgc3VwcG9ydCB3aXRoIElyTE1QIHNvIHdlIGNhbiBhY2NlcHQgaW5jb21pbmcKKwkgKiAgY29ubmVjdGlvbnMKKwkgKi8KKwlzZXJ2ZXIgPSBpcmlhcF9vcGVuKExTQVBfSUFTLCBJQVNfU0VSVkVSLCBOVUxMLCBOVUxMKTsKKwlpZiAoIXNlcnZlcikgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCB1bmFibGUgdG8gb3BlbiBzZXJ2ZXJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCXJldHVybiAtMTsKKwl9CisJaXJpYXBfcmVnaXN0ZXJfbHNhcChzZXJ2ZXIsIExTQVBfSUFTLCBJQVNfU0VSVkVSKTsKKworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXBfY2xlYW51cCAodm9pZCkKKyAqCisgKiAgICBJbml0aWFsaXplcyB0aGUgSXJJQVAgbGF5ZXIsIGNhbGxlZCBieSB0aGUgbW9kdWxlIGNsZWFudXAgY29kZSBpbgorICogICAgaXJtb2QuYworICovCit2b2lkIF9fZXhpdCBpcmlhcF9jbGVhbnVwKHZvaWQpCit7CisJaXJsbXBfdW5yZWdpc3Rlcl9zZXJ2aWNlKHNlcnZpY2VfaGFuZGxlKTsKKworCWhhc2hiaW5fZGVsZXRlKGlyaWFwLCAoRlJFRV9GVU5DKSBfX2lyaWFwX2Nsb3NlKTsKKwloYXNoYmluX2RlbGV0ZShpcmlhc19vYmplY3RzLCAoRlJFRV9GVU5DKSBfX2lyaWFzX2RlbGV0ZV9vYmplY3QpOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXBfb3BlbiAodm9pZCkKKyAqCisgKiAgICBPcGVucyBhbiBpbnN0YW5jZSBvZiB0aGUgSXJJQVAgbGF5ZXIsIGFuZCByZWdpc3RlcnMgd2l0aCBJckxNUAorICovCitzdHJ1Y3QgaXJpYXBfY2IgKmlyaWFwX29wZW4oX191OCBzbHNhcF9zZWwsIGludCBtb2RlLCB2b2lkICpwcml2LAorCQkJICAgIENPTkZJUk1fQ0FMTEJBQ0sgY2FsbGJhY2spCit7CisJc3RydWN0IGlyaWFwX2NiICpzZWxmOworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCXNlbGYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXJpYXBfY2IpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNlbGYpIHsKKwkJSVJEQV9XQVJOSU5HKCIlczogVW5hYmxlIHRvIGttYWxsb2MhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqICBJbml0aWFsaXplIGluc3RhbmNlCisJICovCisJbWVtc2V0KHNlbGYsIDAsIHNpemVvZihzdHJ1Y3QgaXJpYXBfY2IpKTsKKworCXNlbGYtPm1hZ2ljID0gSUFTX01BR0lDOworCXNlbGYtPm1vZGUgPSBtb2RlOworCWlmIChtb2RlID09IElBU19DTElFTlQpCisJCWlyaWFwX3JlZ2lzdGVyX2xzYXAoc2VsZiwgc2xzYXBfc2VsLCBtb2RlKTsKKworCXNlbGYtPmNvbmZpcm0gPSBjYWxsYmFjazsKKwlzZWxmLT5wcml2ID0gcHJpdjsKKworCS8qIGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KCkgd2lsbCBjb25zdHJ1Y3QgcGFja2V0cyBiZWZvcmUKKwkgKiB3ZSBjb25uZWN0LCBzbyB0aGlzIG11c3QgaGF2ZSBhIHNhbmUgdmFsdWUuLi4gSmVhbiBJSSAqLworCXNlbGYtPm1heF9oZWFkZXJfc2l6ZSA9IExNUF9NQVhfSEVBREVSOworCisJaW5pdF90aW1lcigmc2VsZi0+d2F0Y2hkb2dfdGltZXIpOworCisJaGFzaGJpbl9pbnNlcnQoaXJpYXAsIChpcmRhX3F1ZXVlX3QgKikgc2VsZiwgKGxvbmcpIHNlbGYsIE5VTEwpOworCisJLyogSW5pdGlhbGl6ZSBzdGF0ZSBtYWNoaW5lcyAqLworCWlyaWFwX25leHRfY2xpZW50X3N0YXRlKHNlbGYsIFNfRElTQ09OTkVDVCk7CisJaXJpYXBfbmV4dF9jYWxsX3N0YXRlKHNlbGYsIFNfTUFLRV9DQUxMKTsKKwlpcmlhcF9uZXh0X3NlcnZlcl9zdGF0ZShzZWxmLCBSX0RJU0NPTk5FQ1QpOworCWlyaWFwX25leHRfcl9jb25uZWN0X3N0YXRlKHNlbGYsIFJfV0FJVElORyk7CisKKwlyZXR1cm4gc2VsZjsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXBfb3Blbik7CisKKy8qCisgKiBGdW5jdGlvbiBfX2lyaWFwX2Nsb3NlIChzZWxmKQorICoKKyAqICAgIFJlbW92ZXMgKGRlYWxsb2NhdGVzKSB0aGUgSXJJQVAgaW5zdGFuY2UKKyAqCisgKi8KK3N0YXRpYyB2b2lkIF9faXJpYXBfY2xvc2Uoc3RydWN0IGlyaWFwX2NiICpzZWxmKQoreworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisKKwlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKworCWlmIChzZWxmLT5yZXF1ZXN0X3NrYikKKwkJZGV2X2tmcmVlX3NrYihzZWxmLT5yZXF1ZXN0X3NrYik7CisKKwlzZWxmLT5tYWdpYyA9IDA7CisKKwlrZnJlZShzZWxmKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2Nsb3NlICh2b2lkKQorICoKKyAqICAgIENsb3NlcyBJcklBUCBhbmQgZGVyZWdpc3RlcnMgd2l0aCBJckxNUAorICovCit2b2lkIGlyaWFwX2Nsb3NlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZikKK3sKKwlzdHJ1Y3QgaXJpYXBfY2IgKmVudHJ5OworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCWlmIChzZWxmLT5sc2FwKSB7CisJCWlybG1wX2Nsb3NlX2xzYXAoc2VsZi0+bHNhcCk7CisJCXNlbGYtPmxzYXAgPSBOVUxMOworCX0KKworCWVudHJ5ID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBoYXNoYmluX3JlbW92ZShpcmlhcCwgKGxvbmcpIHNlbGYsIE5VTEwpOworCUlSREFfQVNTRVJUKGVudHJ5ID09IHNlbGYsIHJldHVybjspOworCisJX19pcmlhcF9jbG9zZShzZWxmKTsKK30KK0VYUE9SVF9TWU1CT0woaXJpYXBfY2xvc2UpOworCitzdGF0aWMgaW50IGlyaWFwX3JlZ2lzdGVyX2xzYXAoc3RydWN0IGlyaWFwX2NiICpzZWxmLCBfX3U4IHNsc2FwX3NlbCwgaW50IG1vZGUpCit7CisJbm90aWZ5X3Qgbm90aWZ5OworCisJSVJEQV9ERUJVRygyLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCWlyZGFfbm90aWZ5X2luaXQoJm5vdGlmeSk7CisJbm90aWZ5LmNvbm5lY3RfY29uZmlybSAgICAgICA9IGlyaWFwX2Nvbm5lY3RfY29uZmlybTsKKwlub3RpZnkuY29ubmVjdF9pbmRpY2F0aW9uICAgID0gaXJpYXBfY29ubmVjdF9pbmRpY2F0aW9uOworCW5vdGlmeS5kaXNjb25uZWN0X2luZGljYXRpb24gPSBpcmlhcF9kaXNjb25uZWN0X2luZGljYXRpb247CisJbm90aWZ5LmRhdGFfaW5kaWNhdGlvbiAgICAgICA9IGlyaWFwX2RhdGFfaW5kaWNhdGlvbjsKKwlub3RpZnkuaW5zdGFuY2UgPSBzZWxmOworCWlmIChtb2RlID09IElBU19DTElFTlQpCisJCXN0cmNweShub3RpZnkubmFtZSwgIklySUFTIGNsaSIpOworCWVsc2UKKwkJc3RyY3B5KG5vdGlmeS5uYW1lLCAiSXJJQVMgc3J2Iik7CisKKwlzZWxmLT5sc2FwID0gaXJsbXBfb3Blbl9sc2FwKHNsc2FwX3NlbCwgJm5vdGlmeSwgMCk7CisJaWYgKHNlbGYtPmxzYXAgPT0gTlVMTCkgeworCQlJUkRBX0VSUk9SKCIlczogVW5hYmxlIHRvIGFsbG9jYXRlZCBMU0FQIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZWxmLT5zbHNhcF9zZWwgPSBzZWxmLT5sc2FwLT5zbHNhcF9zZWw7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2Rpc2Nvbm5lY3RfaW5kaWNhdGlvbiAoaGFuZGxlLCByZWFzb24pCisgKgorICogICAgR290IGRpc2Nvbm5lY3QsIHNvIGNsZWFuIHVwIGV2ZXJ5dGhpbmcgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29ubmVjdGlvbgorICoKKyAqLworc3RhdGljIHZvaWQgaXJpYXBfZGlzY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJCUxNX1JFQVNPTiByZWFzb24sCisJCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyaWFwX2NiICpzZWxmOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgcmVhc29uPSVzXG4iLCBfX0ZVTkNUSU9OX18sIGlybG1wX3JlYXNvbnNbcmVhc29uXSk7CisKKwlzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKworCUlSREFfQVNTRVJUKGlyaWFwICE9IE5VTEwsIHJldHVybjspOworCisJZGVsX3RpbWVyKCZzZWxmLT53YXRjaGRvZ190aW1lcik7CisKKwkvKiBOb3QgbmVlZGVkICovCisJaWYgKHNrYikKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCisJaWYgKHNlbGYtPm1vZGUgPT0gSUFTX0NMSUVOVCkgeworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBkaXNjb25uZWN0IGFzIGNsaWVudFxuIiwgX19GVU5DVElPTl9fKTsKKworCisJCWlyaWFwX2RvX2NsaWVudF9ldmVudChzZWxmLCBJQVBfTE1fRElTQ09OTkVDVF9JTkRJQ0FUSU9OLAorCQkJCSAgICAgIE5VTEwpOworCQkvKgorCQkgKiBJbmZvcm0gc2VydmljZSB1c2VyIHRoYXQgdGhlIHJlcXVlc3QgZmFpbGVkIGJ5IHNlbmRpbmcKKwkJICogaXQgYSBOVUxMIHZhbHVlLiBXYXJuaW5nLCB0aGUgY2xpZW50IG1pZ2h0IGNsb3NlIHVzLCBzbworCQkgKiByZW1lbWJlciBubyB0byB1c2Ugc2VsZiBhbnltb3JlIGFmdGVyIGNhbGxpbmcgY29uZmlybQorCQkgKi8KKwkJaWYgKHNlbGYtPmNvbmZpcm0pCisJCQlzZWxmLT5jb25maXJtKElBU19ESVNDT05ORUNULCAwLCBOVUxMLCBzZWxmLT5wcml2KTsKKwl9IGVsc2UgeworCQlJUkRBX0RFQlVHKDQsICIlcygpLCBkaXNjb25uZWN0IGFzIHNlcnZlclxuIiwgX19GVU5DVElPTl9fKTsKKwkJaXJpYXBfZG9fc2VydmVyX2V2ZW50KHNlbGYsIElBUF9MTV9ESVNDT05ORUNUX0lORElDQVRJT04sCisJCQkJICAgICAgTlVMTCk7CisJCWlyaWFwX2Nsb3NlKHNlbGYpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2Rpc2Nvbm5lY3RfcmVxdWVzdCAoaGFuZGxlKQorICovCitzdGF0aWMgdm9pZCBpcmlhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlyaWFwX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJaWYgKHR4X3NrYiA9PSBOVUxMKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIENvdWxkIG5vdCBhbGxvY2F0ZSBhbiBza19idWZmIG9mIGxlbmd0aCAlZFxuIiwgCisJCQlfX0ZVTkNUSU9OX18sIDY0KTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogIFJlc2VydmUgc3BhY2UgZm9yIE1VWCBjb250cm9sIGFuZCBMQVAgaGVhZGVyCisJICovCisJc2tiX3Jlc2VydmUodHhfc2tiLCBMTVBfTUFYX0hFQURFUik7CisKKwlpcmxtcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZi0+bHNhcCwgdHhfc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2dldHZhbHVlYnljbGFzcyAoYWRkciwgbmFtZSwgYXR0cikKKyAqCisgKiAgICBSZXRyZWl2ZSBhbGwgdmFsdWVzIGZyb20gYXR0cmlidXRlIGluIGFsbCBvYmplY3RzIHdpdGggZ2l2ZW4gY2xhc3MKKyAqICAgIG5hbWUKKyAqLworaW50IGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwKKwkJCQkgIF9fdTMyIHNhZGRyLCBfX3UzMiBkYWRkciwKKwkJCQkgIGNoYXIgKm5hbWUsIGNoYXIgKmF0dHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnR4X3NrYjsKKwlpbnQgbmFtZV9sZW4sIGF0dHJfbGVuLCBza2JfbGVuOworCV9fdTggKmZyYW1lOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm4gLTE7KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybiAtMTspOworCisJLyogQ2xpZW50IG11c3Qgc3VwcGx5IHRoZSBkZXN0aW5hdGlvbiBkZXZpY2UgYWRkcmVzcyAqLworCWlmICghZGFkZHIpCisJCXJldHVybiAtMTsKKworCXNlbGYtPmRhZGRyID0gZGFkZHI7CisJc2VsZi0+c2FkZHIgPSBzYWRkcjsKKworCS8qCisJICogIFNhdmUgb3BlcmF0aW9uLCBzbyB3ZSBrbm93IHdoYXQgdGhlIGxhdGVyIGluZGljYXRpb24gaXMgYWJvdXQKKwkgKi8KKwlzZWxmLT5vcGVyYXRpb24gPSBHRVRfVkFMVUVfQllfQ0xBU1M7CisKKwkvKiBHaXZlIG91cnNlbHZlcyAxMCBzZWNzIHRvIGZpbmlzaCB0aGlzIG9wZXJhdGlvbiAqLworCWlyaWFwX3N0YXJ0X3dhdGNoZG9nX3RpbWVyKHNlbGYsIDEwKkhaKTsKKworCW5hbWVfbGVuID0gc3RybGVuKG5hbWUpOwkvKiBVcCB0byBJQVNfTUFYX0NMQVNTTkFNRSA9IDYwICovCisJYXR0cl9sZW4gPSBzdHJsZW4oYXR0cik7CS8qIFVwIHRvIElBU19NQVhfQVRUUklCTkFNRSA9IDYwICovCisKKwlza2JfbGVuID0gc2VsZi0+bWF4X2hlYWRlcl9zaXplKzIrbmFtZV9sZW4rMSthdHRyX2xlbis0OworCXR4X3NrYiA9IGRldl9hbGxvY19za2Ioc2tiX2xlbik7CisJaWYgKCF0eF9za2IpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGFuZCBMQVAgaGVhZGVyICovCisJc2tiX3Jlc2VydmUodHhfc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOworCXNrYl9wdXQodHhfc2tiLCAzK25hbWVfbGVuK2F0dHJfbGVuKTsKKwlmcmFtZSA9IHR4X3NrYi0+ZGF0YTsKKworCS8qIEJ1aWxkIGZyYW1lICovCisJZnJhbWVbMF0gPSBJQVBfTFNUIHwgR0VUX1ZBTFVFX0JZX0NMQVNTOworCWZyYW1lWzFdID0gbmFtZV9sZW47ICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnNlcnQgbGVuZ3RoIG9mIG5hbWUgKi8KKwltZW1jcHkoZnJhbWUrMiwgbmFtZSwgbmFtZV9sZW4pOyAgICAgICAgICAgLyogSW5zZXJ0IG5hbWUgKi8KKwlmcmFtZVsyK25hbWVfbGVuXSA9IGF0dHJfbGVuOyAgICAgICAgICAgICAgLyogSW5zZXJ0IGxlbmd0aCBvZiBhdHRyICovCisJbWVtY3B5KGZyYW1lKzMrbmFtZV9sZW4sIGF0dHIsIGF0dHJfbGVuKTsgIC8qIEluc2VydCBhdHRyICovCisKKwlpcmlhcF9kb19jbGllbnRfZXZlbnQoc2VsZiwgSUFQX0NBTExfUkVRVUVTVF9HVkJDLCB0eF9za2IpOworCisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgc3RhdGVfc19kaXNjb25uZWN0KCkuICovCisJZGV2X2tmcmVlX3NrYih0eF9za2IpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXF1ZXN0KTsKKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2dldHZhbHVlYnljbGFzc19jb25maXJtIChzZWxmLCBza2IpCisgKgorICogICAgR290IHJlc3VsdCBmcm9tIEdldFZhbHVlQnlDbGFzcyBjb21tYW5kLiBQYXJzZSBpdCBhbmQgcmV0dXJuIHJlc3VsdAorICogICAgdG8gc2VydmljZSB1c2VyLgorICoKKyAqLworc3RhdGljIHZvaWQgaXJpYXBfZ2V0dmFsdWVieWNsYXNzX2NvbmZpcm0oc3RydWN0IGlyaWFwX2NiICpzZWxmLAorCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlhc192YWx1ZSAqdmFsdWU7CisJaW50IGNoYXJzZXQ7CisJX191MzIgdmFsdWVfbGVuOworCV9fdTMyIHRtcF9jcHUzMjsKKwlfX3UxNiBvYmpfaWQ7CisJX191MTYgbGVuOworCV9fdTggIHR5cGU7CisJX191OCAqZnA7CisJaW50IG47CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCisJLyogSW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlmcCA9IHNrYi0+ZGF0YTsKKwluID0gMjsKKworCS8qIEdldCBsZW5ndGgsIE1TQiBmaXJzdCAqLworCWxlbiA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fdTE2ICopKGZwK24pKSk7IG4gKz0gMjsKKworCUlSREFfREVCVUcoNCwgIiVzKCksIGxlbj0lZFxuIiwgX19GVU5DVElPTl9fLCBsZW4pOworCisJLyogR2V0IG9iamVjdCBJRCwgTVNCIGZpcnN0ICovCisJb2JqX2lkID0gYmUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX191MTYgKikoZnArbikpKTsgbiArPSAyOworCisJdHlwZSA9IGZwW24rK107CisJSVJEQV9ERUJVRyg0LCAiJXMoKSwgVmFsdWUgdHlwZSA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHR5cGUpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJQVNfSU5URUdFUjoKKwkJbWVtY3B5KCZ0bXBfY3B1MzIsIGZwK24sIDQpOyBuICs9IDQ7CisJCWJlMzJfdG9fY3B1cygmdG1wX2NwdTMyKTsKKwkJdmFsdWUgPSBpcmlhc19uZXdfaW50ZWdlcl92YWx1ZSh0bXBfY3B1MzIpOworCisJCS8qICBMZWdhbCB2YWx1ZXMgcmVzdHJpY3RlZCB0byAweDAxLTB4NmYsIHBhZ2UgMTUgaXJ0dHAgKi8KKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgbHNhcD0lZFxuIiwgX19GVU5DVElPTl9fLCB2YWx1ZS0+dC5pbnRlZ2VyKTsKKwkJYnJlYWs7CisJY2FzZSBJQVNfU1RSSU5HOgorCQljaGFyc2V0ID0gZnBbbisrXTsKKworCQlzd2l0Y2ggKGNoYXJzZXQpIHsKKwkJY2FzZSBDU19BU0NJSToKKwkJCWJyZWFrOworLyoJCWNhc2UgQ1NfSVNPXzg4NTlfMTogKi8KKy8qCQljYXNlIENTX0lTT184ODU5XzI6ICovCisvKgkJY2FzZSBDU19JU09fODg1OV8zOiAqLworLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNDogKi8KKy8qCQljYXNlIENTX0lTT184ODU5XzU6ICovCisvKgkJY2FzZSBDU19JU09fODg1OV82OiAqLworLyoJCWNhc2UgQ1NfSVNPXzg4NTlfNzogKi8KKy8qCQljYXNlIENTX0lTT184ODU5Xzg6ICovCisvKgkJY2FzZSBDU19JU09fODg1OV85OiAqLworLyoJCWNhc2UgQ1NfVU5JQ09ERTogKi8KKwkJZGVmYXVsdDoKKwkJCUlSREFfREVCVUcoMCwgIiVzKCksIGNoYXJzZXQgJXMsIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJICAgX19GVU5DVElPTl9fLCBpYXNfY2hhcnNldF90eXBlc1tjaGFyc2V0XSk7CisKKwkJCS8qIEFib3J0aW5nLCBjbG9zZSBjb25uZWN0aW9uISAqLworCQkJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOworCQkJcmV0dXJuOworCQkJLyogYnJlYWs7ICovCisJCX0KKwkJdmFsdWVfbGVuID0gZnBbbisrXTsKKwkJSVJEQV9ERUJVRyg0LCAiJXMoKSwgc3RybGVuPSVkXG4iLCBfX0ZVTkNUSU9OX18sIHZhbHVlX2xlbik7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBzdHJpbmcgaXMgbnVsbC10ZXJtaW5hdGVkICovCisJCWZwW24rdmFsdWVfbGVuXSA9IDB4MDA7CisJCUlSREFfREVCVUcoNCwgIkdvdCBzdHJpbmcgJXNcbiIsIGZwK24pOworCisJCS8qIFdpbGwgdHJ1bmNhdGUgdG8gSUFTX01BWF9TVFJJTkcgYnl0ZXMgKi8KKwkJdmFsdWUgPSBpcmlhc19uZXdfc3RyaW5nX3ZhbHVlKGZwK24pOworCQlicmVhazsKKwljYXNlIElBU19PQ1RfU0VROgorCQl2YWx1ZV9sZW4gPSBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX3UxNiAqKShmcCtuKSkpOworCQluICs9IDI7CisKKwkJLyogV2lsbCB0cnVuY2F0ZSB0byBJQVNfTUFYX09DVEVUX1NUUklORyBieXRlcyAqLworCQl2YWx1ZSA9IGlyaWFzX25ld19vY3RzZXFfdmFsdWUoZnArbiwgdmFsdWVfbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsdWUgPSBpcmlhc19uZXdfbWlzc2luZ192YWx1ZSgpOworCQlicmVhazsKKwl9CisKKwkvKiBGaW5pc2hlZCwgY2xvc2UgY29ubmVjdGlvbiEgKi8KKwlpcmlhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZik7CisKKwkvKiBXYXJuaW5nLCB0aGUgY2xpZW50IG1pZ2h0IGNsb3NlIHVzLCBzbyByZW1lbWJlciBubyB0byB1c2Ugc2VsZgorCSAqIGFueW1vcmUgYWZ0ZXIgY2FsbGluZyBjb25maXJtCisJICovCisJaWYgKHNlbGYtPmNvbmZpcm0pCisJCXNlbGYtPmNvbmZpcm0oSUFTX1NVQ0NFU1MsIG9ial9pZCwgdmFsdWUsIHNlbGYtPnByaXYpOworCWVsc2UgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBtaXNzaW5nIGhhbmRsZXIhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlpcmlhc19kZWxldGVfdmFsdWUodmFsdWUpOworCX0KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZSAoKQorICoKKyAqICAgIFNlbmQgYW5zd2VyIGJhY2sgdG8gcmVtb3RlIExNLUlBUworICoKKyAqLworc3RhdGljIHZvaWQgaXJpYXBfZ2V0dmFsdWVieWNsYXNzX3Jlc3BvbnNlKHN0cnVjdCBpcmlhcF9jYiAqc2VsZiwKKwkJCQkJICAgX191MTYgb2JqX2lkLAorCQkJCQkgICBfX3U4IHJldF9jb2RlLAorCQkJCQkgICBzdHJ1Y3QgaWFzX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqdHhfc2tiOworCWludCBuOworCV9fdTMyIHRtcF9iZTMyLCB0bXBfYmUxNjsKKwlfX3U4ICpmcDsKKworCUlSREFfREVCVUcoNCwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQodmFsdWUgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQodmFsdWUtPmxlbiA8PSAxMDI0LCByZXR1cm47KTsKKworCS8qIEluaXRpYWxpemUgdmFyaWFibGVzICovCisJbiA9IDA7CisKKwkvKgorCSAqICBXZSBtdXN0IGFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgcmVzcG9uc2UgYWZ0ZXIgdGhlIGxlbmd0aCBvZiB0aGUKKwkgKiAgdmFsdWUuIFdlIGFkZCAzMiBieXRlcyBiZWNhdXNlIG9mIHRoZSA2IGJ5dGVzIGZvciB0aGUgZnJhbWUgYW5kCisJICogIG1heCA1IGJ5dGVzIGZvciB0aGUgdmFsdWUgY29kaW5nLgorCSAqLworCXR4X3NrYiA9IGRldl9hbGxvY19za2IodmFsdWUtPmxlbiArIHNlbGYtPm1heF9oZWFkZXJfc2l6ZSArIDMyKTsKKwlpZiAoIXR4X3NrYikKKwkJcmV0dXJuOworCisJLyogUmVzZXJ2ZSBzcGFjZSBmb3IgTVVYIGFuZCBMQVAgaGVhZGVyICovCisJc2tiX3Jlc2VydmUodHhfc2tiLCBzZWxmLT5tYXhfaGVhZGVyX3NpemUpOworCXNrYl9wdXQodHhfc2tiLCA2KTsKKworCWZwID0gdHhfc2tiLT5kYXRhOworCisJLyogQnVpbGQgZnJhbWUgKi8KKwlmcFtuKytdID0gR0VUX1ZBTFVFX0JZX0NMQVNTIHwgSUFQX0xTVDsKKwlmcFtuKytdID0gcmV0X2NvZGU7CisKKwkvKiBJbnNlcnQgbGlzdCBsZW5ndGggKE1TQiBmaXJzdCkgKi8KKwl0bXBfYmUxNiA9IF9fY29uc3RhbnRfaHRvbnMoMHgwMDAxKTsKKwltZW1jcHkoZnArbiwgJnRtcF9iZTE2LCAyKTsgIG4gKz0gMjsKKworCS8qIEluc2VydCBvYmplY3QgaWRlbnRpZmllciAoIE1TQiBmaXJzdCkgKi8KKwl0bXBfYmUxNiA9IGNwdV90b19iZTE2KG9ial9pZCk7CisJbWVtY3B5KGZwK24sICZ0bXBfYmUxNiwgMik7IG4gKz0gMjsKKworCXN3aXRjaCAodmFsdWUtPnR5cGUpIHsKKwljYXNlIElBU19TVFJJTkc6CisJCXNrYl9wdXQodHhfc2tiLCAzICsgdmFsdWUtPmxlbik7CisJCWZwW24rK10gPSB2YWx1ZS0+dHlwZTsKKwkJZnBbbisrXSA9IDA7IC8qIEFTQ0lJICovCisJCWZwW24rK10gPSAoX191OCkgdmFsdWUtPmxlbjsKKwkJbWVtY3B5KGZwK24sIHZhbHVlLT50LnN0cmluZywgdmFsdWUtPmxlbik7IG4rPXZhbHVlLT5sZW47CisJCWJyZWFrOworCWNhc2UgSUFTX0lOVEVHRVI6CisJCXNrYl9wdXQodHhfc2tiLCA1KTsKKwkJZnBbbisrXSA9IHZhbHVlLT50eXBlOworCisJCXRtcF9iZTMyID0gY3B1X3RvX2JlMzIodmFsdWUtPnQuaW50ZWdlcik7CisJCW1lbWNweShmcCtuLCAmdG1wX2JlMzIsIDQpOyBuICs9IDQ7CisJCWJyZWFrOworCWNhc2UgSUFTX09DVF9TRVE6CisJCXNrYl9wdXQodHhfc2tiLCAzICsgdmFsdWUtPmxlbik7CisJCWZwW24rK10gPSB2YWx1ZS0+dHlwZTsKKworCQl0bXBfYmUxNiA9IGNwdV90b19iZTE2KHZhbHVlLT5sZW4pOworCQltZW1jcHkoZnArbiwgJnRtcF9iZTE2LCAyKTsgbiArPSAyOworCQltZW1jcHkoZnArbiwgdmFsdWUtPnQub2N0X3NlcSwgdmFsdWUtPmxlbik7IG4rPXZhbHVlLT5sZW47CisJCWJyZWFrOworCWNhc2UgSUFTX01JU1NJTkc6CisJCUlSREFfREVCVUcoIDMsICIlczogc2VuZGluZyBJQVNfTUlTU0lOR1xuIiwgX19GVU5DVElPTl9fKTsKKwkJc2tiX3B1dCh0eF9za2IsIDEpOworCQlmcFtuKytdID0gdmFsdWUtPnR5cGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlSREFfREVCVUcoMCwgIiVzKCksIHR5cGUgbm90IGltcGxlbWVudGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJYnJlYWs7CisJfQorCWlyaWFwX2RvX3JfY29ubmVjdF9ldmVudChzZWxmLCBJQVBfQ0FMTF9SRVNQT05TRSwgdHhfc2tiKTsKKworCS8qIERyb3AgcmVmZXJlbmNlIGNvdW50IC0gc2VlIHN0YXRlX3JfZXhlY3V0ZSgpLiAqLworCWRldl9rZnJlZV9za2IodHhfc2tiKTsKK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX2dldHZhbHVlYnljbGFzc19pbmRpY2F0aW9uIChzZWxmLCBza2IpCisgKgorICogICAgZ2V0dmFsdWVieWNsYXNzIGlzIHJlcXVlc3RlZCBmcm9tIHBlZXIgTE0tSUFTCisgKgorICovCitzdGF0aWMgdm9pZCBpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfaW5kaWNhdGlvbihzdHJ1Y3QgaXJpYXBfY2IgKnNlbGYsCisJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWFzX29iamVjdCAqb2JqOworCXN0cnVjdCBpYXNfYXR0cmliICphdHRyaWI7CisJaW50IG5hbWVfbGVuOworCWludCBhdHRyX2xlbjsKKwljaGFyIG5hbWVbSUFTX01BWF9DTEFTU05BTUUgKyAxXTsJLyogNjAgYnl0ZXMgKi8KKwljaGFyIGF0dHJbSUFTX01BWF9BVFRSSUJOQU1FICsgMV07CS8qIDYwIGJ5dGVzICovCisJX191OCAqZnA7CisJaW50IG47CisKKwlJUkRBX0RFQlVHKDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKworCWZwID0gc2tiLT5kYXRhOworCW4gPSAxOworCisJbmFtZV9sZW4gPSBmcFtuKytdOworCW1lbWNweShuYW1lLCBmcCtuLCBuYW1lX2xlbik7IG4rPW5hbWVfbGVuOworCW5hbWVbbmFtZV9sZW5dID0gJ1wwJzsKKworCWF0dHJfbGVuID0gZnBbbisrXTsKKwltZW1jcHkoYXR0ciwgZnArbiwgYXR0cl9sZW4pOyBuKz1hdHRyX2xlbjsKKwlhdHRyW2F0dHJfbGVuXSA9ICdcMCc7CisKKwlJUkRBX0RFQlVHKDQsICJMTS1JQVM6IExvb2tpbmcgdXAgJXM6ICVzXG4iLCBuYW1lLCBhdHRyKTsKKwlvYmogPSBpcmlhc19maW5kX29iamVjdChuYW1lKTsKKworCWlmIChvYmogPT0gTlVMTCkgeworCQlJUkRBX0RFQlVHKDIsICJMTS1JQVM6IE9iamVjdCAlcyBub3QgZm91bmRcbiIsIG5hbWUpOworCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfcmVzcG9uc2Uoc2VsZiwgMHgxMjM1LCBJQVNfQ0xBU1NfVU5LTk9XTiwKKwkJCQkJICAgICAgICZpcmlhc19taXNzaW5nKTsKKwkJcmV0dXJuOworCX0KKwlJUkRBX0RFQlVHKDQsICJMTS1JQVM6IGZvdW5kICVzLCBpZD0lZFxuIiwgb2JqLT5uYW1lLCBvYmotPmlkKTsKKworCWF0dHJpYiA9IGlyaWFzX2ZpbmRfYXR0cmliKG9iaiwgYXR0cik7CisJaWYgKGF0dHJpYiA9PSBOVUxMKSB7CisJCUlSREFfREVCVUcoMiwgIkxNLUlBUzogQXR0cmlidXRlICVzIG5vdCBmb3VuZFxuIiwgYXR0cik7CisJCWlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZShzZWxmLCBvYmotPmlkLAorCQkJCQkgICAgICAgSUFTX0FUVFJJQl9VTktOT1dOLCAKKwkJCQkJICAgICAgICZpcmlhc19taXNzaW5nKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdlIGhhdmUgYSBtYXRjaDsgc2VuZCB0aGUgdmFsdWUuICAqLworCWlyaWFwX2dldHZhbHVlYnljbGFzc19yZXNwb25zZShzZWxmLCBvYmotPmlkLCBJQVNfU1VDQ0VTUywKKwkJCQkgICAgICAgYXR0cmliLT52YWx1ZSk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9zZW5kX2FjayAodm9pZCkKKyAqCisgKiAgICBDdXJyZW50bHkgbm90IHVzZWQKKyAqCisgKi8KK3ZvaWQgaXJpYXBfc2VuZF9hY2soc3RydWN0IGlyaWFwX2NiICpzZWxmKQoreworCXN0cnVjdCBza19idWZmICp0eF9za2I7CisJX191OCAqZnJhbWU7CisKKwlJUkRBX0RFQlVHKDIsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJdHhfc2tiID0gZGV2X2FsbG9jX3NrYig2NCk7CisJaWYgKCF0eF9za2IpCisJCXJldHVybjsKKworCS8qIFJlc2VydmUgc3BhY2UgZm9yIE1VWCBhbmQgTEFQIGhlYWRlciAqLworCXNrYl9yZXNlcnZlKHR4X3NrYiwgc2VsZi0+bWF4X2hlYWRlcl9zaXplKTsKKwlza2JfcHV0KHR4X3NrYiwgMSk7CisJZnJhbWUgPSB0eF9za2ItPmRhdGE7CisKKwkvKiBCdWlsZCBmcmFtZSAqLworCWZyYW1lWzBdID0gSUFQX0xTVCB8IElBUF9BQ0sgfCBzZWxmLT5vcGVyYXRpb247CisKKwlpcmxtcF9kYXRhX3JlcXVlc3Qoc2VsZi0+bHNhcCwgdHhfc2tiKTsKK30KKwordm9pZCBpcmlhcF9jb25uZWN0X3JlcXVlc3Qoc3RydWN0IGlyaWFwX2NiICpzZWxmKQoreworCWludCByZXQ7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisKKwlyZXQgPSBpcmxtcF9jb25uZWN0X3JlcXVlc3Qoc2VsZi0+bHNhcCwgTFNBUF9JQVMsCisJCQkJICAgIHNlbGYtPnNhZGRyLCBzZWxmLT5kYWRkciwKKwkJCQkgICAgTlVMTCwgTlVMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgY29ubmVjdCBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlzZWxmLT5jb25maXJtKElBU19ESVNDT05ORUNULCAwLCBOVUxMLCBzZWxmLT5wcml2KTsKKwl9Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9jb25uZWN0X2NvbmZpcm0gKGhhbmRsZSwgc2tiKQorICoKKyAqICAgIExTQVAgY29ubmVjdGlvbiBjb25maXJtZWQhCisgKgorICovCitzdGF0aWMgdm9pZCBpcmlhcF9jb25uZWN0X2NvbmZpcm0odm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwKKwkJCQkgIHN0cnVjdCBxb3NfaW5mbyAqcW9zLCBfX3UzMiBtYXhfc2VnX3NpemUsCisJCQkJICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyaWFwX2NiICpzZWxmOworCisJc2VsZiA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIHJldHVybjspOworCUlSREFfQVNTRVJUKHNlbGYtPm1hZ2ljID09IElBU19NQUdJQywgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2tiICE9IE5VTEwsIHJldHVybjspOworCisJc2VsZi0+bWF4X2RhdGFfc2l6ZSA9IG1heF9zZWdfc2l6ZTsKKwlzZWxmLT5tYXhfaGVhZGVyX3NpemUgPSBtYXhfaGVhZGVyX3NpemU7CisKKwlkZWxfdGltZXIoJnNlbGYtPndhdGNoZG9nX3RpbWVyKTsKKworCWlyaWFwX2RvX2NsaWVudF9ldmVudChzZWxmLCBJQVBfTE1fQ09OTkVDVF9DT05GSVJNLCBza2IpOworCisJLyogRHJvcCByZWZlcmVuY2UgY291bnQgLSBzZWUgc3RhdGVfc19tYWtlX2NhbGwoKS4gKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9jb25uZWN0X2luZGljYXRpb24gKCBoYW5kbGUsIHNrYikKKyAqCisgKiAgICBSZW1vdGUgTE0tSUFTIGlzIHJlcXVlc3RpbmcgY29ubmVjdGlvbgorICoKKyAqLworc3RhdGljIHZvaWQgaXJpYXBfY29ubmVjdF9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJICAgICBzdHJ1Y3QgcW9zX2luZm8gKnFvcywgX191MzIgbWF4X3NlZ19zaXplLAorCQkJCSAgICAgX191OCBtYXhfaGVhZGVyX3NpemUsCisJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpcmlhcF9jYiAqc2VsZiwgKm5ldzsKKworCUlSREFfREVCVUcoMSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwlzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBpbnN0YW5jZTsKKworCUlSREFfQVNTRVJUKHNrYiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIGdvdG8gb3V0Oyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCBnb3RvIG91dDspOworCisJLyogU3RhcnQgbmV3IHNlcnZlciAqLworCW5ldyA9IGlyaWFwX29wZW4oTFNBUF9JQVMsIElBU19TRVJWRVIsIE5VTEwsIE5VTEwpOworCWlmICghbmV3KSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCksIG9wZW4gZmFpbGVkXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBOb3cgYXR0YWNoIHVwIHRoZSBuZXcgInNvY2tldCIgKi8KKwluZXctPmxzYXAgPSBpcmxtcF9kdXAoc2VsZi0+bHNhcCwgbmV3KTsKKwlpZiAoIW5ldy0+bHNhcCkgeworCQlJUkRBX0RFQlVHKDAsICIlcygpLCBkdXAgZmFpbGVkIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJZ290byBvdXQ7CisJfQorCisJbmV3LT5tYXhfZGF0YV9zaXplID0gbWF4X3NlZ19zaXplOworCW5ldy0+bWF4X2hlYWRlcl9zaXplID0gbWF4X2hlYWRlcl9zaXplOworCisJLyogQ2xlYW4gdXAgdGhlIG9yaWdpbmFsIG9uZSB0byBrZWVwIGl0IGluIGxpc3RlbiBzdGF0ZSAqLworCWlybG1wX2xpc3RlbihzZWxmLT5sc2FwKTsKKworCWlyaWFwX2RvX3NlcnZlcl9ldmVudChuZXcsIElBUF9MTV9DT05ORUNUX0lORElDQVRJT04sIHNrYik7CisKK291dDoKKwkvKiBEcm9wIHJlZmVyZW5jZSBjb3VudCAtIHNlZSBzdGF0ZV9yX2Rpc2Nvbm5lY3QoKS4gKi8KKwlkZXZfa2ZyZWVfc2tiKHNrYik7Cit9CisKKy8qCisgKiBGdW5jdGlvbiBpcmlhcF9kYXRhX2luZGljYXRpb24gKGhhbmRsZSwgc2tiKQorICoKKyAqICAgIFJlY2VpdmVzIGRhdGEgZnJvbSBjb25uZWN0aW9uIGlkZW50aWZpZWQgYnkgaGFuZGxlIGZyb20gSXJMTVAKKyAqCisgKi8KK3N0YXRpYyBpbnQgaXJpYXBfZGF0YV9pbmRpY2F0aW9uKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsCisJCQkJIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlyaWFwX2NiICpzZWxmOworCV9fdTggICpmcmFtZTsKKwlfX3U4ICBvcGNvZGU7CisKKwlJUkRBX0RFQlVHKDMsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOworCisJc2VsZiA9IChzdHJ1Y3QgaXJpYXBfY2IgKikgaW5zdGFuY2U7CisKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuIDA7KTsKKwlJUkRBX0FTU0VSVChzZWxmICE9IE5VTEwsIGdvdG8gb3V0Oyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCBnb3RvIG91dDspOworCisJZnJhbWUgPSBza2ItPmRhdGE7CisKKwlpZiAoc2VsZi0+bW9kZSA9PSBJQVNfU0VSVkVSKSB7CisJCS8qIENhbGwgc2VydmVyICovCisJCUlSREFfREVCVUcoNCwgIiVzKCksIENhbGxpbmcgc2VydmVyIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJaXJpYXBfZG9fcl9jb25uZWN0X2V2ZW50KHNlbGYsIElBUF9SRUNWX0ZfTFNULCBza2IpOworCQlnb3RvIG91dDsKKwl9CisJb3Bjb2RlID0gZnJhbWVbMF07CisJaWYgKH5vcGNvZGUgJiBJQVBfTFNUKSB7CisJCUlSREFfV0FSTklORygiJXM6LCBJcklBUyBtdWx0aWZyYW1lIGNvbW1hbmRzIG9yICIKKwkJCSAgICAgInJlc3VsdHMgaXMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIENoZWNrIGZvciBhY2sgZnJhbWVzIHNpbmNlIHRoZXkgZG9uJ3QgY29udGFpbiBhbnkgZGF0YSAqLworCWlmIChvcGNvZGUgJiBJQVBfQUNLKSB7CisJCUlSREFfREVCVUcoMCwgIiVzKCkgR290IGFjayBmcmFtZSFcbiIsIF9fRlVOQ1RJT05fXyk7CisJCWdvdG8gb3V0OworCX0KKworCW9wY29kZSAmPSB+SUFQX0xTVDsgLyogTWFzayBhd2F5IExTVCBiaXQgKi8KKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBHRVRfSU5GT19CQVNFOgorCQlJUkRBX0RFQlVHKDAsICJJckxNUCBHZXRJbmZvQmFzZURldGFpbHMgbm90IGltcGxlbWVudGVkIVxuIik7CisJCWJyZWFrOworCWNhc2UgR0VUX1ZBTFVFX0JZX0NMQVNTOgorCQlpcmlhcF9kb19jYWxsX2V2ZW50KHNlbGYsIElBUF9SRUNWX0ZfTFNULCBOVUxMKTsKKworCQlzd2l0Y2ggKGZyYW1lWzFdKSB7CisJCWNhc2UgSUFTX1NVQ0NFU1M6CisJCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfY29uZmlybShzZWxmLCBza2IpOworCQkJYnJlYWs7CisJCWNhc2UgSUFTX0NMQVNTX1VOS05PV046CisJCQlJUkRBX0RFQlVHKDEsICIlcygpLCBObyBzdWNoIGNsYXNzIVxuIiwgX19GVU5DVElPTl9fKTsKKwkJCS8qIEZpbmlzaGVkLCBjbG9zZSBjb25uZWN0aW9uISAqLworCQkJaXJpYXBfZGlzY29ubmVjdF9yZXF1ZXN0KHNlbGYpOworCisJCQkvKgorCQkJICogV2FybmluZywgdGhlIGNsaWVudCBtaWdodCBjbG9zZSB1cywgc28gcmVtZW1iZXIKKwkJCSAqIG5vIHRvIHVzZSBzZWxmIGFueW1vcmUgYWZ0ZXIgY2FsbGluZyBjb25maXJtCisJCQkgKi8KKwkJCWlmIChzZWxmLT5jb25maXJtKQorCQkJCXNlbGYtPmNvbmZpcm0oSUFTX0NMQVNTX1VOS05PV04sIDAsIE5VTEwsCisJCQkJCSAgICAgIHNlbGYtPnByaXYpOworCQkJYnJlYWs7CisJCWNhc2UgSUFTX0FUVFJJQl9VTktOT1dOOgorCQkJSVJEQV9ERUJVRygxLCAiJXMoKSwgTm8gc3VjaCBhdHRyaWJ1dGUhXG4iLCBfX0ZVTkNUSU9OX18pOworCQkJLyogRmluaXNoZWQsIGNsb3NlIGNvbm5lY3Rpb24hICovCisJCQlpcmlhcF9kaXNjb25uZWN0X3JlcXVlc3Qoc2VsZik7CisKKwkJCS8qCisJCQkgKiBXYXJuaW5nLCB0aGUgY2xpZW50IG1pZ2h0IGNsb3NlIHVzLCBzbyByZW1lbWJlcgorCQkJICogbm8gdG8gdXNlIHNlbGYgYW55bW9yZSBhZnRlciBjYWxsaW5nIGNvbmZpcm0KKwkJCSAqLworCQkJaWYgKHNlbGYtPmNvbmZpcm0pCisJCQkJc2VsZi0+Y29uZmlybShJQVNfQVRUUklCX1VOS05PV04sIDAsIE5VTEwsCisJCQkJCSAgICAgIHNlbGYtPnByaXYpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSVJEQV9ERUJVRygwLCAiJXMoKSwgVW5rbm93biBvcC1jb2RlOiAlMDJ4XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgICBvcGNvZGUpOworCQlicmVhazsKKwl9CisKK291dDoKKwkvKiBDbGVhbnVwIC0gc3ViLWNhbGxzIHdpbGwgaGF2ZSBkb25lIHNrYl9nZXQoKSBhcyBuZWVkZWQuICovCisJZGV2X2tmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCisvKgorICogRnVuY3Rpb24gaXJpYXBfY2FsbF9pbmRpY2F0aW9uIChzZWxmLCBza2IpCisgKgorICogICAgUmVjZWl2ZWQgY2FsbCB0byBzZXJ2ZXIgZnJvbSBwZWVyIExNLUlBUworICoKKyAqLwordm9pZCBpcmlhcF9jYWxsX2luZGljYXRpb24oc3RydWN0IGlyaWFwX2NiICpzZWxmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fdTggKmZwOworCV9fdTggb3Bjb2RlOworCisJSVJEQV9ERUJVRyg0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKKworCUlSREFfQVNTRVJUKHNlbGYgIT0gTlVMTCwgcmV0dXJuOyk7CisJSVJEQV9BU1NFUlQoc2VsZi0+bWFnaWMgPT0gSUFTX01BR0lDLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChza2IgIT0gTlVMTCwgcmV0dXJuOyk7CisKKwlmcCA9IHNrYi0+ZGF0YTsKKworCW9wY29kZSA9IGZwWzBdOworCWlmICh+b3Bjb2RlICYgMHg4MCkgeworCQlJUkRBX1dBUk5JTkcoIiVzOiBJcklBUyBtdWx0aWZyYW1lIGNvbW1hbmRzIG9yIHJlc3VsdHMiCisJCQkgICAgICJpcyBub3QgaW1wbGVtZW50ZWQgeWV0IVxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuOworCX0KKwlvcGNvZGUgJj0gMHg3ZjsgLyogTWFzayBhd2F5IExTVCBiaXQgKi8KKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBHRVRfSU5GT19CQVNFOgorCQlJUkRBX1dBUk5JTkcoIiVzOiBHZXRJbmZvQmFzZURldGFpbHMgbm90IGltcGxlbWVudGVkIHlldCFcbiIsCisJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCWJyZWFrOworCWNhc2UgR0VUX1ZBTFVFX0JZX0NMQVNTOgorCQlpcmlhcF9nZXR2YWx1ZWJ5Y2xhc3NfaW5kaWNhdGlvbihzZWxmLCBza2IpOworCQlicmVhazsKKwl9CisJLyogc2tiIHdpbGwgYmUgY2xlYW5lZCB1cCBpbiBpcmlhcF9kYXRhX2luZGljYXRpb24gKi8KK30KKworLyoKKyAqIEZ1bmN0aW9uIGlyaWFwX3dhdGNoZG9nX3RpbWVyX2V4cGlyZWQgKGRhdGEpCisgKgorICogICAgUXVlcnkgaGFzIHRha2VuIHRvbyBsb25nIHRpbWUsIHNvIGFib3J0CisgKgorICovCitzdGF0aWMgdm9pZCBpcmlhcF93YXRjaGRvZ190aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlyaWFwX2NiICpzZWxmID0gKHN0cnVjdCBpcmlhcF9jYiAqKSBkYXRhOworCisJSVJEQV9BU1NFUlQoc2VsZiAhPSBOVUxMLCByZXR1cm47KTsKKwlJUkRBX0FTU0VSVChzZWxmLT5tYWdpYyA9PSBJQVNfTUFHSUMsIHJldHVybjspOworCisJLyogaXJpYXBfY2xvc2Uoc2VsZik7ICovCit9CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCitzdGF0aWMgY29uc3QgY2hhciAqaWFzX3ZhbHVlX3R5cGVzW10gPSB7CisJIklBU19NSVNTSU5HIiwKKwkiSUFTX0lOVEVHRVIiLAorCSJJQVNfT0NUX1NFUSIsCisJIklBU19TVFJJTkciCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpYXNfb2JqZWN0ICppcmlhc19zZXFfaWR4KGxvZmZfdCBwb3MpIAoreworCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmo7CisKKwlmb3IgKG9iaiA9IChzdHJ1Y3QgaWFzX29iamVjdCAqKSBoYXNoYmluX2dldF9maXJzdChpcmlhc19vYmplY3RzKTsKKwkgICAgIG9iajsgb2JqID0gKHN0cnVjdCBpYXNfb2JqZWN0ICopIGhhc2hiaW5fZ2V0X25leHQoaXJpYXNfb2JqZWN0cykpIHsKKwkJaWYgKHBvcy0tID09IDApCisJCQlicmVhazsKKwl9CisJCQorCXJldHVybiBvYmo7Cit9CisKK3N0YXRpYyB2b2lkICppcmlhc19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQoreworCXNwaW5fbG9ja19pcnEoJmlyaWFzX29iamVjdHMtPmhiX3NwaW5sb2NrKTsKKworCXJldHVybiAqcG9zID8gaXJpYXNfc2VxX2lkeCgqcG9zIC0gMSkgOiBTRVFfU1RBUlRfVE9LRU47Cit9CisKK3N0YXRpYyB2b2lkICppcmlhc19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKysqcG9zOworCisJcmV0dXJuICh2ID09IFNFUV9TVEFSVF9UT0tFTikgCisJCT8gKHZvaWQgKikgaGFzaGJpbl9nZXRfZmlyc3QoaXJpYXNfb2JqZWN0cykKKwkJOiAodm9pZCAqKSBoYXNoYmluX2dldF9uZXh0KGlyaWFzX29iamVjdHMpOworfQorCitzdGF0aWMgdm9pZCBpcmlhc19zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlzcGluX3VubG9ja19pcnEoJmlyaWFzX29iamVjdHMtPmhiX3NwaW5sb2NrKTsKK30KKworc3RhdGljIGludCBpcmlhc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCisJCXNlcV9wdXRzKHNlcSwgIkxNLUlBUyBPYmplY3RzOlxuIik7CisJZWxzZSB7CisJCXN0cnVjdCBpYXNfb2JqZWN0ICpvYmogPSB2OworCQlzdHJ1Y3QgaWFzX2F0dHJpYiAqYXR0cmliOworCisJCUlSREFfQVNTRVJUKG9iai0+bWFnaWMgPT0gSUFTX09CSkVDVF9NQUdJQywgcmV0dXJuIC1FSU5WQUw7KTsKKworCQlzZXFfcHJpbnRmKHNlcSwgIm5hbWU6ICVzLCBpZD0lZFxuIiwKKwkJCSAgIG9iai0+bmFtZSwgb2JqLT5pZCk7CisKKwkJLyogQ2FyZWZ1bCBmb3IgcHJpb3JpdHkgaW52ZXJzaW9ucyBoZXJlICEKKwkJICogQWxsIG90aGVyIHVzZXMgb2YgYXR0cmliIHNwaW5sb2NrIGFyZSBpbmRlcGVuZGVudCBvZgorCQkgKiB0aGUgb2JqZWN0IHNwaW5sb2NrLCBzbyB3ZSBhcmUgc2FmZS4gSmVhbiBJSSAqLworCQlzcGluX2xvY2soJm9iai0+YXR0cmlicy0+aGJfc3BpbmxvY2spOworCisJCS8qIExpc3QgYWxsIGF0dHJpYnV0ZXMgZm9yIHRoaXMgb2JqZWN0ICovCisJCWZvciAoYXR0cmliID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGhhc2hiaW5fZ2V0X2ZpcnN0KG9iai0+YXR0cmlicyk7CisJCSAgICAgYXR0cmliICE9IE5VTEw7CisJCSAgICAgYXR0cmliID0gKHN0cnVjdCBpYXNfYXR0cmliICopIGhhc2hiaW5fZ2V0X25leHQob2JqLT5hdHRyaWJzKSkgeworCQkgICAgIAorCQkJSVJEQV9BU1NFUlQoYXR0cmliLT5tYWdpYyA9PSBJQVNfQVRUUklCX01BR0lDLAorCQkJCSAgICBnb3RvIG91dGxvb3A7ICk7CisKKwkJCXNlcV9wcmludGYoc2VxLCAiIC0gQXR0cmlidXRlIG5hbWU6IFwiJXNcIiwgIiwKKwkJCQkgICBhdHRyaWItPm5hbWUpOworCQkJc2VxX3ByaW50ZihzZXEsICJ2YWx1ZVslc106ICIsCisJCQkJICAgaWFzX3ZhbHVlX3R5cGVzW2F0dHJpYi0+dmFsdWUtPnR5cGVdKTsKKworCQkJc3dpdGNoIChhdHRyaWItPnZhbHVlLT50eXBlKSB7CisJCQljYXNlIElBU19JTlRFR0VSOgorCQkJCXNlcV9wcmludGYoc2VxLCAiJWRcbiIsCisJCQkJCSAgIGF0dHJpYi0+dmFsdWUtPnQuaW50ZWdlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIElBU19TVFJJTkc6CisJCQkJc2VxX3ByaW50ZihzZXEsICJcIiVzXCJcbiIsCisJCQkJCSAgIGF0dHJpYi0+dmFsdWUtPnQuc3RyaW5nKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUFTX09DVF9TRVE6CisJCQkJc2VxX3ByaW50ZihzZXEsICJvY3RldCBzZXF1ZW5jZSAoJWQgYnl0ZXMpXG4iLCAKKwkJCQkJICAgYXR0cmliLT52YWx1ZS0+bGVuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUFTX01JU1NJTkc6CisJCQkJc2VxX3B1dHMoc2VxLCAibWlzc2luZ1xuIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXNlcV9wcmludGYoc2VxLCAidHlwZSAlZD9cbiIsIAorCQkJCQkgICBhdHRyaWItPnZhbHVlLT50eXBlKTsKKwkJCX0KKwkJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CisKKwkJfQorCUlSREFfQVNTRVJUX0xBQkVMKG91dGxvb3A6KQorCQlzcGluX3VubG9jaygmb2JqLT5hdHRyaWJzLT5oYl9zcGlubG9jayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaXJpYXNfc2VxX29wcyA9IHsKKwkuc3RhcnQgID0gaXJpYXNfc2VxX3N0YXJ0LAorCS5uZXh0ICAgPSBpcmlhc19zZXFfbmV4dCwKKwkuc3RvcCAgID0gaXJpYXNfc2VxX3N0b3AsCisJLnNob3cgICA9IGlyaWFzX3NlcV9zaG93LAorfTsKKworc3RhdGljIGludCBpcmlhc19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlJUkRBX0FTU0VSVCggaXJpYXNfb2JqZWN0cyAhPSBOVUxMLCByZXR1cm4gLUVJTlZBTDspOworCisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZpcmlhc19zZXFfb3BzKTsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcmlhc19zZXFfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4gICAgICAgICAgID0gaXJpYXNfc2VxX29wZW4sCisJLnJlYWQgICAgICAgICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgICAgICAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCisjZW5kaWYgLyogUFJPQ19GUyAqLwo=