From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jerome Anand Subject: [RFC PATCH v2 3/8] ALSA: Add support for hdmi audio driver Date: Sat, 1 Oct 2016 05:52:37 +0530 Message-ID: <20161001002242.31025-4-jerome.anand@intel.com> References: <20161001002242.31025-1-jerome.anand@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8F56989973 for ; Wed, 12 Oct 2016 16:26:46 +0000 (UTC) Resent-Message-ID: <20161012162640.GF4329@intel.com> Resent-To: intel-gfx@lists.freedesktop.org In-Reply-To: <20161001002242.31025-1-jerome.anand@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org Cc: tiwai@suse.de, broonie@opensource.wolfsonmicro.com List-Id: intel-gfx@lists.freedesktop.org SGRtaSBhdWRpbyBkcml2ZXIgYmFzZWQgb24gdGhlIGNoaWxkIHBsYXRmb3JtIGRldmljZQpjcmVh dGVkIGJ5IGdmeCBkcml2ZXIgaXMgaW1wbGVtZW50ZWQuCgpUaGlzIGF1ZGlvIGRyaXZlciBpcyBk ZXJpdmVkIGZyb20gbGVnYWN5IGludGVsCmhkbWkgYXVkaW8gZHJpdmVyLgpUaGUgaW50ZXJmYWNl cyBmb3IgaW50ZXJhY3Rpb24gYmV0d2VlbiBnZnggYW5kIGF1ZGlvCmFyZSB1cGRhdGVkIGFuZCB0 aGUgZHJpdmVyIGltcGxlbWVudGF0aW9uIHVwZGF0ZWQgdG8KZGVyaXZlIGludGVycnVwdHMgaW4g aXRzIG93biBhZGRyZXNzIHNwYWNlIGJhc2VkIG9uCmlycSBjaGlwIGZyYW1ld29yawoKU2lnbmVk LW9mZi1ieTogSmVyb21lIEFuYW5kIDxqZXJvbWUuYW5hbmRAaW50ZWwuY29tPgotLS0KIHNvdW5k L3g4Ni9NYWtlZmlsZSAgICAgICAgICAgICAgIHwgICAgMiArCiBzb3VuZC94ODYvaW50ZWxfaGRt aV9hdWRpby5jICAgICB8IDE5MDQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysKIHNvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvLmggICAgIHwgIDIwMSArKysrCiBzb3VuZC94 ODYvaW50ZWxfaGRtaV9hdWRpb19pZi5jICB8ICA1NTEgKysrKysrKysrKysKIHNvdW5kL3g4Ni9p bnRlbF9oZG1pX2xwZV9hdWRpby5jIHwgICAxNiArLQogNSBmaWxlcyBjaGFuZ2VkLCAyNjY4IGlu c2VydGlvbnMoKyksIDYgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc291bmQveDg2 L2ludGVsX2hkbWlfYXVkaW8uYwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNvdW5kL3g4Ni9pbnRlbF9o ZG1pX2F1ZGlvLmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzb3VuZC94ODYvaW50ZWxfaGRtaV9hdWRp b19pZi5jCgpkaWZmIC0tZ2l0IGEvc291bmQveDg2L01ha2VmaWxlIGIvc291bmQveDg2L01ha2Vm aWxlCmluZGV4IDc4YjJhZTEuLmJjMDc0ZDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3g4Ni9NYWtlZmls ZQorKysgYi9zb3VuZC94ODYvTWFrZWZpbGUKQEAgLTMsNiArMyw4IEBAIERSSVZFUl9OQU1FIDo9 IGhkbWlfbHBlX2F1ZGlvCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL2dwdS9kcm0vaTkxNQogCiAk KERSSVZFUl9OQU1FKS1vYmpzICs9IFwKKwlpbnRlbF9oZG1pX2F1ZGlvLm8gXAorCWludGVsX2hk bWlfYXVkaW9faWYubyBcCiAJaW50ZWxfaGRtaV9scGVfYXVkaW8ubwogCiBvYmotJChDT05GSUdf SERNSV9MUEVfQVVESU8pICs9ICQoRFJJVkVSX05BTUUpLm8KZGlmZiAtLWdpdCBhL3NvdW5kL3g4 Ni9pbnRlbF9oZG1pX2F1ZGlvLmMgYi9zb3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpby5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzA4ODEKLS0tIC9kZXYvbnVsbAorKysg Yi9zb3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpby5jCkBAIC0wLDAgKzEsMTkwNCBAQAorLyoKKyAq ICAgaW50ZWxfaGRtaV9hdWRpby5jIC0gSW50ZWwgSERNSSBhdWRpbyBkcml2ZXIKKyAqCisgKiAg Q29weXJpZ2h0IChDKSAyMDE2IEludGVsIENvcnAKKyAqICBBdXRob3JzOglTYWlsYWphIEJhbmRh cnVwYWxsaSA8c2FpbGFqYS5iYW5kYXJ1cGFsbGlAaW50ZWwuY29tPgorICoJCVJhbWVzaCBCYWJ1 IEsgVgk8cmFtZXNoLmJhYnVAaW50ZWwuY29tPgorICoJCVZhaWJoYXYgQWdhcndhbCA8dmFpYmhh di5hZ2Fyd2FsQGludGVsLmNvbT4KKyAqCQlKZXJvbWUgQW5hbmQgPGplcm9tZS5hbmFuZEBpbnRl bC5jb20+CisgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZy ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBv ZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRo ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJB TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFC SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQor ICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiB+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fgorICogQUxTQSBkcml2ZXIgZm9yIEludGVsIEhETUkgYXVkaW8KKyAqLwor CisjZGVmaW5lIHByX2ZtdChmbXQpCSJoYWQ6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9wbGF0 Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3Ns YWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+ CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNp bmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2lu Y2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb250cm9sLmg+CisjaW5j bHVkZSA8c291bmQvaW5pdHZhbC5oPgorI2luY2x1ZGUgImludGVsX2hkbWlfYXVkaW8uaCIKKwor c3RhdGljIERFRklORV9NVVRFWChoYWRfbXV0ZXgpOworCisvKnN0YW5kYXJkIG1vZHVsZSBvcHRp b25zIGZvciBBTFNBLiBUaGlzIG1vZHVsZSBzdXBwb3J0cyBvbmx5IG9uZSBjYXJkKi8KK3N0YXRp YyBpbnQgaGRtaV9jYXJkX2luZGV4ID0gU05EUlZfREVGQVVMVF9JRFgxOworc3RhdGljIGNoYXIg KmhkbWlfY2FyZF9pZCA9IFNORFJWX0RFRkFVTFRfU1RSMTsKK3N0YXRpYyBzdHJ1Y3Qgc25kX2lu dGVsaGFkICpoYWRfZGF0YTsKKworbW9kdWxlX3BhcmFtKGhkbWlfY2FyZF9pbmRleCwgaW50LCAw NDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaGRtaV9jYXJkX2luZGV4LAorCQkiSW5kZXggdmFsdWUg Zm9yIElOVEVMIEludGVsIEhETUkgQXVkaW8gY29udHJvbGxlci4iKTsKK21vZHVsZV9wYXJhbSho ZG1pX2NhcmRfaWQsIGNoYXJwLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoaGRtaV9jYXJkX2lk LAorCQkiSUQgc3RyaW5nIGZvciBJTlRFTCBJbnRlbCBIRE1JIEF1ZGlvIGNvbnRyb2xsZXIuIik7 CisKKy8qCisgKiBFTEQgU0EgYml0cyBpbiB0aGUgQ0VBIFNwZWFrZXIgQWxsb2NhdGlvbiBkYXRh IGJsb2NrCisqLworc3RhdGljIGludCBlbGRfc3BlYWtlcl9hbGxvY2F0aW9uX2JpdHNbXSA9IHsK KwlbMF0gPSBGTCB8IEZSLAorCVsxXSA9IExGRSwKKwlbMl0gPSBGQywKKwlbM10gPSBSTCB8IFJS LAorCVs0XSA9IFJDLAorCVs1XSA9IEZMQyB8IEZSQywKKwlbNl0gPSBSTEMgfCBSUkMsCisJLyog dGhlIGZvbGxvd2luZyBhcmUgbm90IGRlZmluZWQgaW4gRUxEIHlldCAqLworCVs3XSA9IDAsCit9 OworCisvKgorICogVGhpcyBpcyBhbiBvcmRlcmVkIGxpc3QhCisgKgorICogVGhlIHByZWNlZGlu ZyBvbmVzIGhhdmUgYmV0dGVyIGNoYW5jZXMgdG8gYmUgc2VsZWN0ZWQgYnkKKyAqIGhkbWlfY2hh bm5lbF9hbGxvY2F0aW9uKCkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2VhX2NoYW5uZWxfc3BlYWtl cl9hbGxvY2F0aW9uIGNoYW5uZWxfYWxsb2NhdGlvbnNbXSA9IHsKKy8qICAgICAgICAgICAgICAg ICAgICAgICAgY2hhbm5lbDogICA3ICAgICA2ICAgIDUgICAgNCAgICAzICAgICAyICAgIDEgICAg MCAgKi8KK3sgLmNhX2luZGV4ID0gMHgwMCwgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgIDAs ICAgMCwgICAwLCAgICAwLCAgRlIsICBGTCB9IH0sCisJCQkJLyogMi4xICovCit7IC5jYV9pbmRl eCA9IDB4MDEsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgIExGRSwg IEZSLCAgRkwgfSB9LAorCQkJCS8qIERvbGJ5IFN1cnJvdW5kICovCit7IC5jYV9pbmRleCA9IDB4 MDIsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgIDAsICBGQywgICAgMCwgIEZSLCAg RkwgfSB9LAorCQkJCS8qIHN1cnJvdW5kNDAgKi8KK3sgLmNhX2luZGV4ID0gMHgwOCwgIC5zcGVh a2VycyA9IHsgICAwLCAgICAwLCAgUlIsICBSTCwgICAwLCAgICAwLCAgRlIsICBGTCB9IH0sCisJ CQkJLyogc3Vycm91bmQ0MSAqLworeyAuY2FfaW5kZXggPSAweDA5LCAgLnNwZWFrZXJzID0geyAg IDAsICAgIDAsICBSUiwgIFJMLCAgIDAsICBMRkUsICBGUiwgIEZMIH0gfSwKKwkJCQkvKiBzdXJy b3VuZDUwICovCit7IC5jYV9pbmRleCA9IDB4MGEsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwg IFJSLCAgUkwsICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAorCQkJCS8qIHN1cnJvdW5kNTEgKi8K K3sgLmNhX2luZGV4ID0gMHgwYiwgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgUlIsICBSTCwg IEZDLCAgTEZFLCAgRlIsICBGTCB9IH0sCisJCQkJLyogNi4xICovCit7IC5jYV9pbmRleCA9IDB4 MGYsICAuc3BlYWtlcnMgPSB7ICAgMCwgICBSQywgIFJSLCAgUkwsICBGQywgIExGRSwgIEZSLCAg RkwgfSB9LAorCQkJCS8qIHN1cnJvdW5kNzEgKi8KK3sgLmNhX2luZGV4ID0gMHgxMywgIC5zcGVh a2VycyA9IHsgUlJDLCAgUkxDLCAgUlIsICBSTCwgIEZDLCAgTEZFLCAgRlIsICBGTCB9IH0sCisK K3sgLmNhX2luZGV4ID0gMHgwMywgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgIDAsICAgMCwg IEZDLCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MDQsICAuc3BlYWtlcnMg PSB7ICAgMCwgICAgMCwgICAwLCAgUkMsICAgMCwgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2Ff aW5kZXggPSAweDA1LCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICAgMCwgIFJDLCAgIDAsICBM RkUsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgwNiwgIC5zcGVha2VycyA9IHsgICAw LCAgICAwLCAgIDAsICBSQywgIEZDLCAgICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9 IDB4MDcsICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgICAwLCAgUkMsICBGQywgIExGRSwgIEZS LCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDBjLCAgLnNwZWFrZXJzID0geyAgIDAsICAgUkMs ICBSUiwgIFJMLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgwZCwg IC5zcGVha2VycyA9IHsgICAwLCAgIFJDLCAgUlIsICBSTCwgICAwLCAgTEZFLCAgRlIsICBGTCB9 IH0sCit7IC5jYV9pbmRleCA9IDB4MGUsICAuc3BlYWtlcnMgPSB7ICAgMCwgICBSQywgIFJSLCAg UkwsICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDEwLCAgLnNwZWFr ZXJzID0geyBSUkMsICBSTEMsICBSUiwgIFJMLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sg LmNhX2luZGV4ID0gMHgxMSwgIC5zcGVha2VycyA9IHsgUlJDLCAgUkxDLCAgUlIsICBSTCwgICAw LCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MTIsICAuc3BlYWtlcnMgPSB7 IFJSQywgIFJMQywgIFJSLCAgUkwsICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5k ZXggPSAweDE0LCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICAgMCwgICAwLCAgIDAsICAgIDAs ICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxNSwgIC5zcGVha2VycyA9IHsgRlJDLCAg RkxDLCAgIDAsICAgMCwgICAwLCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4 MTYsICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgICAwLCAgIDAsICBGQywgICAgMCwgIEZSLCAg RkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDE3LCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICAg MCwgICAwLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxOCwgIC5z cGVha2VycyA9IHsgRlJDLCAgRkxDLCAgIDAsICBSQywgICAwLCAgICAwLCAgRlIsICBGTCB9IH0s Cit7IC5jYV9pbmRleCA9IDB4MTksICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgICAwLCAgUkMs ICAgMCwgIExGRSwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDFhLCAgLnNwZWFrZXJz ID0geyBGUkMsICBGTEMsICAgMCwgIFJDLCAgRkMsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sgLmNh X2luZGV4ID0gMHgxYiwgIC5zcGVha2VycyA9IHsgRlJDLCAgRkxDLCAgIDAsICBSQywgIEZDLCAg TEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MWMsICAuc3BlYWtlcnMgPSB7IEZS QywgIEZMQywgIFJSLCAgUkwsICAgMCwgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXgg PSAweDFkLCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICBSUiwgIFJMLCAgIDAsICBMRkUsICBG UiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxZSwgIC5zcGVha2VycyA9IHsgRlJDLCAgRkxD LCAgUlIsICBSTCwgIEZDLCAgICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MWYs ICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgIFJSLCAgUkwsICBGQywgIExGRSwgIEZSLCAgRkwg fSB9LAorfTsKKworc3RhdGljIHN0cnVjdCBjaGFubmVsX21hcF90YWJsZSBtYXBfdGFibGVzW10g PSB7CisJeyBTTkRSVl9DSE1BUF9GTCwgICAgICAgMHgwMCwgICBGTCB9LAorCXsgU05EUlZfQ0hN QVBfRlIsICAgICAgIDB4MDEsICAgRlIgfSwKKwl7IFNORFJWX0NITUFQX1JMLCAgICAgICAweDA0 LCAgIFJMIH0sCisJeyBTTkRSVl9DSE1BUF9SUiwgICAgICAgMHgwNSwgICBSUiB9LAorCXsgU05E UlZfQ0hNQVBfTEZFLCAgICAgIDB4MDIsICAgTEZFIH0sCisJeyBTTkRSVl9DSE1BUF9GQywgICAg ICAgMHgwMywgICBGQyB9LAorCXsgU05EUlZfQ0hNQVBfUkxDLCAgICAgIDB4MDYsICAgUkxDIH0s CisJeyBTTkRSVl9DSE1BUF9SUkMsICAgICAgMHgwNywgICBSUkMgfSwKKwl7fSAvKiB0ZXJtaW5h dG9yICovCit9OworCisvKiBoYXJkd2FyZSBjYXBhYmlsaXR5IHN0cnVjdHVyZSAqLworc3RhdGlj IGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNuZF9pbnRlbF9oYWRzdHJlYW0gPSB7CisJ LmluZm8gPQkoU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQlTTkRSVl9QQ01fSU5GT19E T1VCTEUgfAorCQlTTkRSVl9QQ01fSU5GT19NTUFQfAorCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZB TElEIHwKKwkJU05EUlZfUENNX0lORk9fQkFUQ0gpLAorCS5mb3JtYXRzID0gKFNORFJWX1BDTV9G TVRCSVRfUzI0IHwKKwkJU05EUlZfUENNX0ZNVEJJVF9VMjQpLAorCS5yYXRlcyA9IFNORFJWX1BD TV9SQVRFXzMyMDAwIHwKKwkJU05EUlZfUENNX1JBVEVfNDQxMDAgfAorCQlTTkRSVl9QQ01fUkFU RV80ODAwMCB8CisJCVNORFJWX1BDTV9SQVRFXzg4MjAwIHwKKwkJU05EUlZfUENNX1JBVEVfOTYw MDAgfAorCQlTTkRSVl9QQ01fUkFURV8xNzY0MDAgfAorCQlTTkRSVl9QQ01fUkFURV8xOTIwMDAs CisJLnJhdGVfbWluID0gSEFEX01JTl9SQVRFLAorCS5yYXRlX21heCA9IEhBRF9NQVhfUkFURSwK KwkuY2hhbm5lbHNfbWluID0gSEFEX01JTl9DSEFOTkVMLAorCS5jaGFubmVsc19tYXggPSBIQURf TUFYX0NIQU5ORUwsCisJLmJ1ZmZlcl9ieXRlc19tYXggPSBIQURfTUFYX0JVRkZFUiwKKwkucGVy aW9kX2J5dGVzX21pbiA9IEhBRF9NSU5fUEVSSU9EX0JZVEVTLAorCS5wZXJpb2RfYnl0ZXNfbWF4 ID0gSEFEX01BWF9QRVJJT0RfQllURVMsCisJLnBlcmlvZHNfbWluID0gSEFEX01JTl9QRVJJT0RT LAorCS5wZXJpb2RzX21heCA9IEhBRF9NQVhfUEVSSU9EUywKKwkuZmlmb19zaXplID0gSEFEX0ZJ Rk9fU0laRSwKK307CisKKy8qIFJlZ2lzdGVyIGFjY2VzcyBmdW5jdGlvbnMgKi8KKworaW5saW5l IGludCBoYWRfZ2V0X2h3c3RhdGUoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQor eworCS8qIENoZWNrIGZvciBkZXZpY2UgcHJlc2VuY2UgLVNXIHN0YXRlICovCisJaWYgKGludGVs aGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX0RJU0NPTk5FQ1RFRCkgeworCQlwcl9kZWJ1 ZygiJXM6RGV2aWNlIG5vdCBjb25uZWN0ZWQ6JWRcbiIsIF9fZnVuY19fLAorCQkJCWludGVsaGFk ZGF0YS0+ZHJ2X3N0YXR1cyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOwor fQorCitpbmxpbmUgaW50IGhhZF9nZXRfY2FwcyhlbnVtIGhhZF9jYXBzX2xpc3QgcXVlcnksIHZv aWQgKmNhcHMpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhh ZGRhdGEgPSBoYWRfZGF0YTsKKworCXJldHZhbCA9IGhhZF9nZXRfaHdzdGF0ZShpbnRlbGhhZGRh dGEpOworCWlmICghcmV0dmFsKQorCQlyZXR2YWwgPSBpbnRlbGhhZGRhdGEtPnF1ZXJ5X29wcy5o ZG1pX2F1ZGlvX2dldF9jYXBzKHF1ZXJ5LAorCQkJCWNhcHMpOworCisJcmV0dXJuIHJldHZhbDsK K30KKworaW5saW5lIGludCBoYWRfc2V0X2NhcHMoZW51bSBoYWRfY2Fwc19saXN0IHNldF9lbGVt ZW50LCB2b2lkICpjYXBzKQoreworCWludCByZXR2YWw7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAq aW50ZWxoYWRkYXRhID0gaGFkX2RhdGE7CisKKwlyZXR2YWwgPSBoYWRfZ2V0X2h3c3RhdGUoaW50 ZWxoYWRkYXRhKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gaW50ZWxoYWRkYXRhLT5xdWVy eV9vcHMuaGRtaV9hdWRpb19zZXRfY2FwcygKKwkJCQlzZXRfZWxlbWVudCwgY2Fwcyk7CisKKwly ZXR1cm4gcmV0dmFsOworfQorCitpbmxpbmUgaW50IGhhZF9yZWFkX3JlZ2lzdGVyKHVpbnQzMl90 IG9mZnNldCwgdWludDMyX3QgKmRhdGEpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgc25kX2lu dGVsaGFkICppbnRlbGhhZGRhdGEgPSBoYWRfZGF0YTsKKworCXJldHZhbCA9IGhhZF9nZXRfaHdz dGF0ZShpbnRlbGhhZGRhdGEpOworCWlmICghcmV0dmFsKQorCQlyZXR2YWwgPSBpbnRlbGhhZGRh dGEtPnJlZ19vcHMuaGRtaV9hdWRpb19yZWFkX3JlZ2lzdGVyKAorCQkJCW9mZnNldCArIGludGVs aGFkZGF0YS0+YXVkaW9fY2ZnX29mZnNldCwgZGF0YSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQor CitpbmxpbmUgaW50IGhhZF93cml0ZV9yZWdpc3Rlcih1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90 IGRhdGEpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRh dGEgPSBoYWRfZGF0YTsKKworCXJldHZhbCA9IGhhZF9nZXRfaHdzdGF0ZShpbnRlbGhhZGRhdGEp OworCWlmICghcmV0dmFsKQorCQlyZXR2YWwgPSBpbnRlbGhhZGRhdGEtPnJlZ19vcHMuaGRtaV9h dWRpb193cml0ZV9yZWdpc3RlcigKKwkJCQlvZmZzZXQgKyBpbnRlbGhhZGRhdGEtPmF1ZGlvX2Nm Z19vZmZzZXQsIGRhdGEpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworaW5saW5lIGludCBoYWRf cmVhZF9tb2RpZnkodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBkYXRhLCB1aW50MzJfdCBtYXNr KQoreworCWludCByZXR2YWw7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0g aGFkX2RhdGE7CisKKwlyZXR2YWwgPSBoYWRfZ2V0X2h3c3RhdGUoaW50ZWxoYWRkYXRhKTsKKwlp ZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gaW50ZWxoYWRkYXRhLT5yZWdfb3BzLmhkbWlfYXVkaW9f cmVhZF9tb2RpZnkoCisJCQkJb2Zmc2V0ICsgaW50ZWxoYWRkYXRhLT5hdWRpb19jZmdfb2Zmc2V0 LAorCQkJCWRhdGEsIG1hc2spOworCisJcmV0dXJuIHJldHZhbDsKK30KKy8qKgorICogaGFkX3Jl YWRfbW9kaWZ5X2F1ZF9jb25maWdfdjIgLSBTcGVjaWZpYyBmdW5jdGlvbiB0byByZWFkLW1vZGlm eQorICogQVVEX0NPTkZJRyByZWdpc3RlciBvbiBWTFYyLlRoZSBoYWRfcmVhZF9tb2RpZnkoKSBm dW5jdGlvbiBzaG91bGQgbm90CisgKiBkaXJlY3RseSBiZSB1c2VkIG9uIFZMVjIgZm9yIHVwZGF0 aW5nIEFVRF9DT05GSUcgcmVnaXN0ZXIuCisgKiBUaGlzIGlzIGJlY2F1c2U6CisgKiBCaXQ2IG9m IEFVRF9DT05GSUcgcmVnaXN0ZXIgaXMgd3JpdGVvbmx5IGR1ZSB0byBhIHNpbGljb24gYnVnIG9u IFZMVjIKKyAqIEhETUkgSVAuIEFzIGEgcmVzdWx0IGEgcmVhZC1tb2RpZnkgb2YgQVVEX0NPTkZJ RyByZWdpdGVyIHdpbGwgYWx3YXlzCisgKiBjbGVhciBiaXQ2LiBBVURfQ09ORklHWzY6NF0gcmVw cmVzZW50cyB0aGUgImNoYW5uZWxzIiBmaWVsZCBvZiB0aGUKKyAqIHJlZ2lzdGVyLiBUaGlzIGZp ZWxkIHNob3VsZCBiZSAxeHkgYmluYXJ5IGZvciBjb25maWd1cmF0aW9uIHdpdGggNiBvcgorICog bW9yZSBjaGFubmVscy4gUmVhZC1tb2RpZnkgb2YgQVVEX0NPTkZJRyAoRWcuIGZvciBlbmFibGlu ZyBhdWRpbykKKyAqIGNhdXNlcyB0aGUgImNoYW5uZWxzIiBmaWVsZCB0byBiZSB1cGRhdGVkIGFz IDB4eSBiaW5hcnkgcmVzdWx0aW5nIGluCisgKiBiYWQgYXVkaW8uIFRoZSBmaXggaXMgdG8gYWx3 YXlzIHdyaXRlIHRoZSBBVURfQ09ORklHWzY6NF0gd2l0aAorICogYXBwcm9wcmlhdGUgdmFsdWUg d2hlbiBkb2luZyByZWFkLW1vZGlmeSBvZiBBVURfQ09ORklHIHJlZ2lzdGVyLgorICoKKyAqIEBz dWJzdHJlYW06IHRoZSBjdXJyZW50IHN1YnN0cmVhbSBvciBOVUxMIGlmIG5vIGFjdGl2ZSBzdWJz dHJlYW0KKyAqIEBkYXRhIDogZGF0YSB0byBiZSB3cml0dGVuCisgKiBAbWFzayA6IG1hc2sKKyAq CisgKi8KK2lubGluZSBpbnQgaGFkX3JlYWRfbW9kaWZ5X2F1ZF9jb25maWdfdjIoc3RydWN0IHNu ZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCXVpbnQzMl90IGRhdGEsIHVpbnQzMl90 IG1hc2spCit7CisJdW5pb24gYXVkX2NmZyBjZmdfdmFsID0gey5jZmdfcmVndmFsID0gMH07CisJ dTggY2hhbm5lbHM7CisKKwkvKgorCSAqIElmIHN1YnN0cmVhbSBpcyBOVUxMLCB0aGVyZSBpcyBu byBhY3RpdmUgc3RyZWFtLgorCSAqIEluIHRoaXMgY2FzZSBqdXN0IHNldCBjaGFubmVscyB0byAy CisJICovCisJaWYgKHN1YnN0cmVhbSkKKwkJY2hhbm5lbHMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUt PmNoYW5uZWxzOworCWVsc2UKKwkJY2hhbm5lbHMgPSAyOworCWNmZ192YWwuY2ZnX3JlZ3hfdjIu bnVtX2NoID0gY2hhbm5lbHMgLSAyOworCisJZGF0YSA9IGRhdGEgfCBjZmdfdmFsLmNmZ19yZWd2 YWw7CisJbWFzayA9IG1hc2sgfCBBVURfQ09ORklHX0NIX01BU0tfVjI7CisKKwlwcl9kZWJ1Zygi JXMgOiBkYXRhID0gJXgsIG1hc2sgPSV4XG4iLCBfX2Z1bmNfXywgZGF0YSwgbWFzayk7CisKKwly ZXR1cm4gaGFkX3JlYWRfbW9kaWZ5KEFVRF9DT05GSUcsIGRhdGEsIG1hc2spOworfQorCisvKioK KyAqIHNuZF9pbnRlbGhhZF9lbmFibGVfYXVkaW9fdjEgLSB0byBlbmFibGUgYXVkaW8KKyAqCisg KiBAc3Vic3RyZWFtOiBDdXJyZW50IHN1YnN0cmVhbSBvciBOVUxMIGlmIG5vIGFjdGl2ZSBzdWJz dHJlYW0uCisgKiBAZW5hYmxlOiAxIGlmIGF1ZGlvIGlzIHRvIGJlIGVuYWJsZWQ7IDAgaWYgYXVk aW8gaXMgdG8gYmUgZGlzYWJsZWQuCisgKgorICovCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRf ZW5hYmxlX2F1ZGlvX3YxKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJ CQl1OCBlbmFibGUpCit7CisJaGFkX3JlYWRfbW9kaWZ5KEFVRF9DT05GSUcsIGVuYWJsZSwgQklU KDApKTsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfZW5hYmxlX2F1ZGlvX3YyIC0gdG8gZW5h YmxlIGF1ZGlvCisgKgorICogQHN1YnN0cmVhbTogQ3VycmVudCBzdWJzdHJlYW0gb3IgTlVMTCBp ZiBubyBhY3RpdmUgc3Vic3RyZWFtLgorICogQGVuYWJsZTogMSBpZiBhdWRpbyBpcyB0byBiZSBl bmFibGVkOyAwIGlmIGF1ZGlvIGlzIHRvIGJlIGRpc2FibGVkLgorICovCitzdGF0aWMgdm9pZCBz bmRfaW50ZWxoYWRfZW5hYmxlX2F1ZGlvX3YyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vi c3RyZWFtLAorCQkJCQl1OCBlbmFibGUpCit7CisJaGFkX3JlYWRfbW9kaWZ5X2F1ZF9jb25maWdf djIoc3Vic3RyZWFtLCBlbmFibGUsIEJJVCgwKSk7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFk X3Jlc2V0X2F1ZGlvX3YxIC0gdG8gcmVzZXQgYXVkaW8gc3Vic3lzdGVtCisgKgorICogQHJlc2V0 OiAxIHRvIHJlc2V0IGF1ZGlvOyAwIHRvIGJyaW5nIGF1ZGlvIG91dCBvZiByZXNldC4KKyAqCisg Ki8KK3N0YXRpYyB2b2lkIHNuZF9pbnRlbGhhZF9yZXNldF9hdWRpb192MSh1OCByZXNldCkKK3sK KwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTLCByZXNldCk7Cit9CisKKy8qKgor ICogc25kX2ludGVsaGFkX3Jlc2V0X2F1ZGlvX3YyIC0gdG8gcmVzZXQgYXVkaW8gc3Vic3lzdGVt CisgKgorICogQHJlc2V0OiAxIHRvIHJlc2V0IGF1ZGlvOyAwIHRvIGJyaW5nIGF1ZGlvIG91dCBv ZiByZXNldC4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9pbnRlbGhhZF9yZXNldF9hdWRpb192 Mih1OCByZXNldCkKK3sKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTX3YyLCBy ZXNldCk7Cit9CisKKy8qKgorICogaGFkX3Byb2dfc3RhdHVzX3JlZyAtIHRvIGluaXRpYWxpemUg YXVkaW8gY2hhbm5lbCBzdGF0dXMgcmVnaXN0ZXJzCisgKgorICogQHN1YnN0cmVhbTpzdWJzdHJl YW0gZm9yIHdoaWNoIHRoZSBwcmVwYXJlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogQGludGVsaGFk ZGF0YTpzdWJzdHJlYW0gcHJpdmF0ZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxs ZWQgaW4gdGhlIHByZXBhcmUgY2FsbGJhY2sKKyAqLworc3RhdGljIGludCBoYWRfcHJvZ19zdGF0 dXNfcmVnKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJc3RydWN0IHNu ZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXVuaW9uIGF1ZF9jaF9zdGF0dXNfMCBjaF9z dGF0MCA9IHsuc3RhdHVzXzBfcmVndmFsID0gMH07CisJdW5pb24gYXVkX2NoX3N0YXR1c18xIGNo X3N0YXQxID0gey5zdGF0dXNfMV9yZWd2YWwgPSAwfTsKKwlpbnQgZm9ybWF0OworCisJcHJfZGVi dWcoIkVudHJ5ICVzXG4iLCBfX2Z1bmNfXyk7CisKKwljaF9zdGF0MC5zdGF0dXNfMF9yZWd4Lmxw Y21faWQgPSAoaW50ZWxoYWRkYXRhLT5hZXNfYml0cyAmCisJCQkJCQlJRUM5NThfQUVTMF9OT05B VURJTyk+PjE7CisJY2hfc3RhdDAuc3RhdHVzXzBfcmVneC5jbGtfYWNjID0gKGludGVsaGFkZGF0 YS0+YWVzX2JpdHMgJgorCQkJCQkJSUVDOTU4X0FFUzNfQ09OX0NMT0NLKT4+NDsKKworCXN3aXRj aCAoc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKSB7CisJY2FzZSBBVURfU0FNUExFX1JBVEVfMzI6 CisJCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVTX01BUF8zMktI WjsKKwkJYnJlYWs7CisKKwljYXNlIEFVRF9TQU1QTEVfUkFURV80NF8xOgorCQljaF9zdGF0MC5z dGF0dXNfMF9yZWd4LnNhbXBfZnJlcSA9IENIX1NUQVRVU19NQVBfNDRLSFo7CisJCWJyZWFrOwor CWNhc2UgQVVEX1NBTVBMRV9SQVRFXzQ4OgorCQljaF9zdGF0MC5zdGF0dXNfMF9yZWd4LnNhbXBf ZnJlcSA9IENIX1NUQVRVU19NQVBfNDhLSFo7CisJCWJyZWFrOworCWNhc2UgQVVEX1NBTVBMRV9S QVRFXzg4XzI6CisJCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVT X01BUF84OEtIWjsKKwkJYnJlYWs7CisJY2FzZSBBVURfU0FNUExFX1JBVEVfOTY6CisJCWNoX3N0 YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVTX01BUF85NktIWjsKKwkJYnJl YWs7CisJY2FzZSBBVURfU0FNUExFX1JBVEVfMTc2XzQ6CisJCWNoX3N0YXQwLnN0YXR1c18wX3Jl Z3guc2FtcF9mcmVxID0gQ0hfU1RBVFVTX01BUF8xNzZLSFo7CisJCWJyZWFrOworCWNhc2UgQVVE X1NBTVBMRV9SQVRFXzE5MjoKKwkJY2hfc3RhdDAuc3RhdHVzXzBfcmVneC5zYW1wX2ZyZXEgPSBD SF9TVEFUVVNfTUFQXzE5MktIWjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBjb250cm9s IHNob3VsZCBuZXZlciBjb21lIGhlcmUgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJYnJlYWs7CisK Kwl9CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DSF9TVEFUVVNfMCwgY2hfc3RhdDAuc3RhdHVz XzBfcmVndmFsKTsKKworCWZvcm1hdCA9IHN1YnN0cmVhbS0+cnVudGltZS0+Zm9ybWF0OworCisJ aWYgKGZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSkgeworCQljaF9zdGF0MS5zdGF0 dXNfMV9yZWd4Lm1heF93cmRfbGVuID0gTUFYX1NNUExfV0lEVEhfMjA7CisJCWNoX3N0YXQxLnN0 YXR1c18xX3JlZ3gud3JkX2xlbiA9IFNNUExfV0lEVEhfMTZCSVRTOworCX0gZWxzZSBpZiAoZm9y bWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKSB7CisJCWNoX3N0YXQxLnN0YXR1c18xX3Jl Z3gubWF4X3dyZF9sZW4gPSBNQVhfU01QTF9XSURUSF8yNDsKKwkJY2hfc3RhdDEuc3RhdHVzXzFf cmVneC53cmRfbGVuID0gU01QTF9XSURUSF8yNEJJVFM7CisJfSBlbHNlIHsKKwkJY2hfc3RhdDEu c3RhdHVzXzFfcmVneC5tYXhfd3JkX2xlbiA9IDA7CisJCWNoX3N0YXQxLnN0YXR1c18xX3JlZ3gu d3JkX2xlbiA9IDA7CisJfQorCWhhZF93cml0ZV9yZWdpc3RlcihBVURfQ0hfU1RBVFVTXzEsIGNo X3N0YXQxLnN0YXR1c18xX3JlZ3ZhbCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc25kX2lu dGVsaGFkX3Byb2dfYXVkaW9fY3RybF92MiAtIHRvIGluaXRpYWxpemUgYXVkaW8KKyAqIHJlZ2lz dGVycyBhbmQgYnVmZmVyIGNvbmZnaXVyYXRpb24gcmVnaXN0ZXJzCisgKgorICogQHN1YnN0cmVh bTpzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBwcmVwYXJlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICog QGludGVsaGFkZGF0YTpzdWJzdHJlYW0gcHJpdmF0ZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlv biBpcyBjYWxsZWQgaW4gdGhlIHByZXBhcmUgY2FsbGJhY2sKKyAqLworaW50IHNuZF9pbnRlbGhh ZF9wcm9nX2F1ZGlvX2N0cmxfdjIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0s CisJCQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwl1bmlvbiBhdWRf Y2ZnIGNmZ192YWwgPSB7LmNmZ19yZWd2YWwgPSAwfTsKKwl1bmlvbiBhdWRfYnVmX2NvbmZpZyBi dWZfY2ZnID0gey5idWZfY2ZndmFsID0gMH07CisJdTggY2hhbm5lbHM7CisKKwloYWRfcHJvZ19z dGF0dXNfcmVnKHN1YnN0cmVhbSwgaW50ZWxoYWRkYXRhKTsKKworCWJ1Zl9jZmcuYnVmX2NmZ19y ZWd4X3YyLmF1ZGlvX2ZpZm9fd2F0ZXJtYXJrID0gRklGT19USFJFU0hPTEQ7CisJYnVmX2NmZy5i dWZfY2ZnX3JlZ3hfdjIuZG1hX2ZpZm9fd2F0ZXJtYXJrID0gRE1BX0ZJRk9fVEhSRVNIT0xEOwor CWJ1Zl9jZmcuYnVmX2NmZ19yZWd4X3YyLmF1ZF9kZWxheSA9IDA7CisJaGFkX3dyaXRlX3JlZ2lz dGVyKEFVRF9CVUZfQ09ORklHLCBidWZfY2ZnLmJ1Zl9jZmd2YWwpOworCisJY2hhbm5lbHMgPSBz dWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzOworCWNmZ192YWwuY2ZnX3JlZ3hfdjIubnVtX2No ID0gY2hhbm5lbHMgLSAyOworCWlmIChjaGFubmVscyA8PSAyKQorCQljZmdfdmFsLmNmZ19yZWd4 X3YyLmxheW91dCA9IExBWU9VVDA7CisJZWxzZQorCQljZmdfdmFsLmNmZ19yZWd4X3YyLmxheW91 dCA9IExBWU9VVDE7CisKKwljZmdfdmFsLmNmZ19yZWd4X3YyLnZhbF9iaXQgPSAxOworCWhhZF93 cml0ZV9yZWdpc3RlcihBVURfQ09ORklHLCBjZmdfdmFsLmNmZ19yZWd2YWwpOworCXJldHVybiAw OworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9wcm9nX2F1ZGlvX2N0cmxfdjEgLSB0byBpbml0 aWFsaXplIGF1ZGlvCisgKiByZWdpc3RlcnMgYW5kIGJ1ZmZlciBjb25mZ2l1cmF0aW9uIHJlZ2lz dGVycworICoKKyAqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgcHJlcGFyZSBm dW5jdGlvbiBpcyBjYWxsZWQKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3RyZWFtIHByaXZhdGUgZGF0 YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwcmVwYXJlIGNhbGxiYWNr CisgKi8KK2ludCBzbmRfaW50ZWxoYWRfcHJvZ19hdWRpb19jdHJsX3YxKHN0cnVjdCBzbmRfcGNt X3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhh ZGRhdGEpCit7CisJdW5pb24gYXVkX2NmZyBjZmdfdmFsID0gey5jZmdfcmVndmFsID0gMH07CisJ dW5pb24gYXVkX2J1Zl9jb25maWcgYnVmX2NmZyA9IHsuYnVmX2NmZ3ZhbCA9IDB9OworCXU4IGNo YW5uZWxzOworCisJaGFkX3Byb2dfc3RhdHVzX3JlZyhzdWJzdHJlYW0sIGludGVsaGFkZGF0YSk7 CisKKwlidWZfY2ZnLmJ1Zl9jZmdfcmVneC5maWZvX3dpZHRoID0gRklGT19USFJFU0hPTEQ7CisJ YnVmX2NmZy5idWZfY2ZnX3JlZ3guYXVkX2RlbGF5ID0gMDsKKwloYWRfd3JpdGVfcmVnaXN0ZXIo QVVEX0JVRl9DT05GSUcsIGJ1Zl9jZmcuYnVmX2NmZ3ZhbCk7CisKKwljaGFubmVscyA9IHN1YnN0 cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CisKKwlzd2l0Y2ggKGNoYW5uZWxzKSB7CisJY2FzZSAx OgorCWNhc2UgMjoKKwkJY2ZnX3ZhbC5jZmdfcmVneC5udW1fY2ggPSBDSF9TVEVSRU87CisJCWNm Z192YWwuY2ZnX3JlZ3gubGF5b3V0ID0gTEFZT1VUMDsKKwlicmVhazsKKworCWNhc2UgMzoKKwlj YXNlIDQ6CisJCWNmZ192YWwuY2ZnX3JlZ3gubnVtX2NoID0gQ0hfVEhSRUVfRk9VUjsKKwkJY2Zn X3ZhbC5jZmdfcmVneC5sYXlvdXQgPSBMQVlPVVQxOworCWJyZWFrOworCisJY2FzZSA1OgorCWNh c2UgNjoKKwkJY2ZnX3ZhbC5jZmdfcmVneC5udW1fY2ggPSBDSF9GSVZFX1NJWDsKKwkJY2ZnX3Zh bC5jZmdfcmVneC5sYXlvdXQgPSBMQVlPVVQxOworCWJyZWFrOworCisJY2FzZSA3OgorCWNhc2Ug ODoKKwkJY2ZnX3ZhbC5jZmdfcmVneC5udW1fY2ggPSBDSF9TRVZFTl9FSUdIVDsKKwkJY2ZnX3Zh bC5jZmdfcmVneC5sYXlvdXQgPSBMQVlPVVQxOworCWJyZWFrOworCisJfQorCisJY2ZnX3ZhbC5j ZmdfcmVneC52YWxfYml0ID0gMTsKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0NPTkZJRywgY2Zn X3ZhbC5jZmdfcmVndmFsKTsKKwlyZXR1cm4gMDsKK30KKy8qCisgKiBDb21wdXRlIGRlcml2ZWQg dmFsdWVzIGluIGNoYW5uZWxfYWxsb2NhdGlvbnNbXS4KKyAqLworc3RhdGljIHZvaWQgaW5pdF9j aGFubmVsX2FsbG9jYXRpb25zKHZvaWQpCit7CisJaW50IGksIGo7CisJc3RydWN0IGNlYV9jaGFu bmVsX3NwZWFrZXJfYWxsb2NhdGlvbiAqcDsKKworCXByX2RlYnVnKCIlczogRW50ZXJcbiIsIF9f ZnVuY19fKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoYW5uZWxfYWxsb2NhdGlv bnMpOyBpKyspIHsKKwkJcCA9IGNoYW5uZWxfYWxsb2NhdGlvbnMgKyBpOworCQlwLT5jaGFubmVs cyA9IDA7CisJCXAtPnNwa19tYXNrID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUo cC0+c3BlYWtlcnMpOyBqKyspCisJCQlpZiAocC0+c3BlYWtlcnNbal0pIHsKKwkJCQlwLT5jaGFu bmVscysrOworCQkJCXAtPnNwa19tYXNrIHw9IHAtPnNwZWFrZXJzW2pdOworCQkJfQorCX0KK30K KworLyoKKyAqIFRoZSB0cmFuc2Zvcm1hdGlvbiB0YWtlcyB0d28gc3RlcHM6CisgKgorICogICAg ICBlbGQtPnNwa19hbGxvYyA9PiAoZWxkX3NwZWFrZXJfYWxsb2NhdGlvbl9iaXRzW10pID0+IHNw a19tYXNrCisgKiAgICAgICAgICAgIHNwa19tYXNrID0+IChjaGFubmVsX2FsbG9jYXRpb25zW10p ICAgICAgICAgPT4gYWktPkNBCisgKgorICogVE9ETzogaXQgY291bGQgc2VsZWN0IHRoZSB3cm9u ZyBDQSBmcm9tIG11bHRpcGxlIGNhbmRpZGF0ZXMuCisqLworc3RhdGljIGludCBzbmRfaW50ZWxo YWRfY2hhbm5lbF9hbGxvY2F0aW9uKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSwK KwkJCQkJaW50IGNoYW5uZWxzKQoreworCWludCBpOworCWludCBjYSA9IDA7CisJaW50IHNwa19t YXNrID0gMDsKKworCS8qCisJKiBDQSBkZWZhdWx0cyB0byAwIGZvciBiYXNpYyBzdGVyZW8gYXVk aW8KKwkqLworCWlmIChjaGFubmVscyA8PSAyKQorCQlyZXR1cm4gMDsKKworCS8qCisJKiBleHBh bmQgRUxEJ3Mgc3BlYWtlciBhbGxvY2F0aW9uIG1hc2sKKwkqCisJKiBFTEQgdGVsbHMgdGhlIHNw ZWFrZXIgbWFzayBpbiBhIGNvbXBhY3QocGFpcmVkKSBmb3JtLAorCSogZXhwYW5kIEVMRCdzIG5v dGlvbnMgdG8gbWF0Y2ggdGhlIG9uZXMgdXNlZCBieSBBdWRpbyBJbmZvRnJhbWUuCisJKi8KKwor CWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVsZF9zcGVha2VyX2FsbG9jYXRpb25fYml0cyk7 IGkrKykgeworCQlpZiAoaW50ZWxoYWRkYXRhLT5lZWxkLnNwZWFrZXJfYWxsb2NhdGlvbl9ibG9j ayAmICgxIDw8IGkpKQorCQkJc3BrX21hc2sgfD0gZWxkX3NwZWFrZXJfYWxsb2NhdGlvbl9iaXRz W2ldOworCX0KKworCS8qIHNlYXJjaCBmb3IgdGhlIGZpcnN0IHdvcmtpbmcgbWF0Y2ggaW4gdGhl IENBIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbm5lbF9hbGxvY2F0 aW9ucyk7IGkrKykgeworCQlpZiAoY2hhbm5lbHMgPT0gY2hhbm5lbF9hbGxvY2F0aW9uc1tpXS5j aGFubmVscyAmJgorCQkoc3BrX21hc2sgJiBjaGFubmVsX2FsbG9jYXRpb25zW2ldLnNwa19tYXNr KSA9PQorCQkJCWNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uc3BrX21hc2spIHsKKwkJCWNhID0gY2hh bm5lbF9hbGxvY2F0aW9uc1tpXS5jYV9pbmRleDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcHJf ZGVidWcoIkhETUk6IHNlbGVjdCBDQSAweCV4IGZvciAlZFxuIiwgY2EsIGNoYW5uZWxzKTsKKwor CXJldHVybiBjYTsKK30KKworLyogZnJvbSBzcGVha2VyIGJpdCBtYXNrIHRvIEFMU0EgQVBJIGNo YW5uZWwgcG9zaXRpb24gKi8KK3N0YXRpYyBpbnQgc3BrX3RvX2NobWFwKGludCBzcGspCit7CisJ c3RydWN0IGNoYW5uZWxfbWFwX3RhYmxlICp0ID0gbWFwX3RhYmxlczsKKworCWZvciAoOyB0LT5t YXA7IHQrKykgeworCQlpZiAodC0+c3BrX21hc2sgPT0gc3BrKQorCQkJcmV0dXJuIHQtPm1hcDsK Kwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGFkX2J1aWxkX2NoYW5uZWxfYWxsb2NhdGlvbl9t YXAoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCWludCBpID0gMCwgYyA9 IDA7CisJaW50IHNwa19tYXNrID0gMDsKKwlzdHJ1Y3Qgc25kX3BjbV9jaG1hcF9lbGVtICpjaG1h cDsKKwl1aW50OF90IGVsZF9oaWdoLCBlbGRfaGlnaF9tYXNrID0gMHhGMDsKKwl1aW50OF90IGhp Z2hfbXNiOworCisJY2htYXAgPSBremFsbG9jKHNpemVvZigqY2htYXApLCBHRlBfS0VSTkVMKTsK KwlpZiAoY2htYXAgPT0gTlVMTCkgeworCQlpbnRlbGhhZGRhdGEtPmNobWFwLT5jaG1hcCA9IE5V TEw7CisJCXJldHVybjsKKwl9CisKKwloYWRfZ2V0X2NhcHMoSEFEX0dFVF9FTEQsICZpbnRlbGhh ZGRhdGEtPmVlbGQpOworCisJcHJfZGVidWcoImVlbGQuc3BlYWtlcl9hbGxvY2F0aW9uX2Jsb2Nr ID0gJXhcbiIsCisJCQlpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9hbGxvY2F0aW9uX2Jsb2Nr KTsKKworCS8qIFdBOiBGaXggdGhlIG1heCBjaGFubmVsIHN1cHBvcnRlZCB0byA4ICovCisKKwkv KgorCSAqIFNpbmsgbWF5IHN1cHBvcnQgbW9yZSB0aGFuIDggY2hhbm5lbHMsIGlmIGVsZF9oaWdo IGhhcyBtb3JlIHRoYW4KKwkgKiBvbmUgYml0IHNldC4gU09DIHN1cHBvcnRzIG1heCA4IGNoYW5u ZWxzLgorCSAqIFJlZmVyIGVsZF9zcGVha2VyX2FsbG9jYXRpb25fYml0cywgZm9yIHNpbmsgc3Bl YWtlciBhbGxvY2F0aW9uCisJICovCisKKwkvKiBpZiAweDJGIDwgZWxkIDwgMHg0RiBmYWxsIGJh Y2sgdG8gMHgyZiwgZWxzZSBmYWxsIGJhY2sgdG8gMHg0RiAqLworCWVsZF9oaWdoID0gaW50ZWxo YWRkYXRhLT5lZWxkLnNwZWFrZXJfYWxsb2NhdGlvbl9ibG9jayAmIGVsZF9oaWdoX21hc2s7CisJ aWYgKChlbGRfaGlnaCAmIChlbGRfaGlnaC0xKSkgJiYgKGVsZF9oaWdoID4gMHgxRikpIHsKKwkJ LyogZWxkX2hpZ2ggJiAoZWxkX2hpZ2gtMSk6IGlmIG1vcmUgdGhhbiAxIGJpdCBzZXQgKi8KKwkJ LyogMHgxRjogNyBjaGFubmVscyAqLworCQlmb3IgKGkgPSAxOyBpIDwgNDsgaSsrKSB7CisJCQlo aWdoX21zYiA9IGVsZF9oaWdoICYgKDB4ODAgPj4gaSk7CisJCQlpZiAoaGlnaF9tc2IpIHsKKwkJ CQlpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9hbGxvY2F0aW9uX2Jsb2NrICY9CisJCQkJCWhp Z2hfbXNiIHwgMHhGOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJZm9yIChpID0gMDsg aSA8IEFSUkFZX1NJWkUoZWxkX3NwZWFrZXJfYWxsb2NhdGlvbl9iaXRzKTsgaSsrKSB7CisJCWlm IChpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9hbGxvY2F0aW9uX2Jsb2NrICYgKDEgPDwgaSkp CisJCQlzcGtfbWFzayB8PSBlbGRfc3BlYWtlcl9hbGxvY2F0aW9uX2JpdHNbaV07CisJfQorCisJ Zm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbm5lbF9hbGxvY2F0aW9ucyk7IGkrKykgewor CQlpZiAoc3BrX21hc2sgPT0gY2hhbm5lbF9hbGxvY2F0aW9uc1tpXS5zcGtfbWFzaykgeworCQkJ Zm9yIChjID0gMDsgYyA8IGNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uY2hhbm5lbHM7IGMrKykgewor CQkJCWNobWFwLT5tYXBbY10gPSBzcGtfdG9fY2htYXAoCisJCQkJCWNoYW5uZWxfYWxsb2NhdGlv bnNbaV0uc3BlYWtlcnNbCisJCQkJCQkoTUFYX1NQRUFLRVJTIC0gMSktY10pOworCQkJfQorCQkJ Y2htYXAtPmNoYW5uZWxzID0gY2hhbm5lbF9hbGxvY2F0aW9uc1tpXS5jaGFubmVsczsKKwkJCWlu dGVsaGFkZGF0YS0+Y2htYXAtPmNobWFwID0gY2htYXA7CisJCQlicmVhazsKKwkJfQorCX0KKwlp ZiAoaSA+PSBBUlJBWV9TSVpFKGNoYW5uZWxfYWxsb2NhdGlvbnMpKSB7CisJCWludGVsaGFkZGF0 YS0+Y2htYXAtPmNobWFwID0gTlVMTDsKKwkJa2ZyZWUoY2htYXApOworCX0KK30KKworLyoKKyAq KiBBTFNBIEFQSSBjaGFubmVsLW1hcCBjb250cm9sIGNhbGxiYWNrcworICoqLworc3RhdGljIGlu dCBoYWRfY2htYXBfY3RsX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJ c3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9jaG1h cCAqaW5mbyA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX2ludGVs aGFkICppbnRlbGhhZGRhdGEgPSBpbmZvLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoaW50ZWxoYWRk YXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZfRElTQ09OTkVDVEVEKQorCQlyZXR1cm4gLUVOT0RF VjsKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+ Y291bnQgPSBIQURfTUFYX0NIQU5ORUw7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWluID0gMDsK Kwl1aW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSBTTkRSVl9DSE1BUF9MQVNUOworCXJldHVybiAw OworfQorCisjaWZuZGVmIFVTRV9BTFNBX0RFRkFVTFRfVExWCitzdGF0aWMgaW50IGhhZF9jaG1h cF9jdGxfdGx2KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgb3BfZmxhZywKKwkJ CQl1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IF9fdXNlciAqdGx2KQoreworCXN0cnVj dCBzbmRfcGNtX2NobWFwICppbmZvID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0 cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IGluZm8tPnByaXZhdGVfZGF0YTsKKwor CWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPT0gSEFEX0RSVl9ESVNDT05ORUNURUQpCisJ CXJldHVybiAtRU5PREVWOworCisJLyogVE9ETzogRml4IGZvciBxdWVyeSBjaGFubmVsIG1hcCAq LworCXJldHVybiAtRVBFUk07Cit9CisjZW5kaWYKKworc3RhdGljIGludCBoYWRfY2htYXBfY3Rs X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9l bGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9jaG1hcCAqaW5mbyA9IHNu ZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhh ZGRhdGEgPSBpbmZvLT5wcml2YXRlX2RhdGE7CisJaW50IGkgPSAwOworCWNvbnN0IHN0cnVjdCBz bmRfcGNtX2NobWFwX2VsZW0gKmNobWFwOworCisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1 cyA9PSBIQURfRFJWX0RJU0NPTk5FQ1RFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGludGVs aGFkZGF0YS0+Y2htYXAtPmNobWFwID09ICBOVUxMKQorCQlyZXR1cm4gLUVOT0RBVEE7CisJY2ht YXAgPSBpbnRlbGhhZGRhdGEtPmNobWFwLT5jaG1hcDsKKwlmb3IgKGkgPSAwOyBpIDwgY2htYXAt PmNoYW5uZWxzOyBpKyspIHsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbaV0gPSBj aG1hcC0+bWFwW2ldOworCQlwcl9kZWJ1ZygiY2htYXAtPm1hcFslZF0gPSAlZFxuIiwgaSwgY2ht YXAtPm1hcFtpXSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFkX2NobWFw X2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9j dGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJLyogVE9ETzogR2V0IGNoYW5uZWwgbWFwIGFu ZCBzZXQgc3dhcCByZWdpc3RlciAqLworCXJldHVybiAtRVBFUk07Cit9CisKK3N0YXRpYyBpbnQg aGFkX3JlZ2lzdGVyX2NobWFwX2N0bHMoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRh LAorCQkJCQkJc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWVyciA9 IHNuZF9wY21fYWRkX2NobWFwX2N0bHMocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLAor CQkJTlVMTCwgMCwgKHVuc2lnbmVkIGxvbmcpaW50ZWxoYWRkYXRhLAorCQkJJmludGVsaGFkZGF0 YS0+Y2htYXApOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaW50ZWxoYWRkYXRh LT5jaG1hcC0+cHJpdmF0ZV9kYXRhID0gaW50ZWxoYWRkYXRhOworCWludGVsaGFkZGF0YS0+a2N0 bCA9IGludGVsaGFkZGF0YS0+Y2htYXAtPmtjdGw7CisJaW50ZWxoYWRkYXRhLT5rY3RsLT5pbmZv ID0gaGFkX2NobWFwX2N0bF9pbmZvOworCWludGVsaGFkZGF0YS0+a2N0bC0+Z2V0ID0gaGFkX2No bWFwX2N0bF9nZXQ7CisJaW50ZWxoYWRkYXRhLT5rY3RsLT5wdXQgPSBoYWRfY2htYXBfY3RsX3B1 dDsKKyNpZm5kZWYgVVNFX0FMU0FfREVGQVVMVF9UTFYKKwlpbnRlbGhhZGRhdGEtPmtjdGwtPnRs di5jID0gaGFkX2NobWFwX2N0bF90bHY7CisjZW5kaWYKKwlpbnRlbGhhZGRhdGEtPmNobWFwLT5j aG1hcCA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX3Byb2df ZGlwX3YxIC0gdG8gaW5pdGlhbGl6ZSBEYXRhIElzbGFuZCBQYWNrZXRzIHJlZ2lzdGVycworICoK KyAqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgcHJlcGFyZSBmdW5jdGlvbiBp cyBjYWxsZWQKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3RyZWFtIHByaXZhdGUgZGF0YQorICoKKyAq IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwcmVwYXJlIGNhbGxiYWNrCisgKi8KK3N0 YXRpYyB2b2lkIHNuZF9pbnRlbGhhZF9wcm9nX2RpcF92MShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJl YW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7 CisJaW50IGk7CisJdW5pb24gYXVkX2N0cmxfc3QgY3RybF9zdGF0ZSA9IHsuY3RybF92YWwgPSAw fTsKKwl1bmlvbiBhdWRfaW5mb19mcmFtZTIgZnJhbWUyID0gey5mcjJfdmFsID0gMH07CisJdW5p b24gYXVkX2luZm9fZnJhbWUzIGZyYW1lMyA9IHsuZnIzX3ZhbCA9IDB9OworCXU4IGNoZWNrc3Vt ID0gMDsKKwlpbnQgY2hhbm5lbHM7CisKKwljaGFubmVscyA9IHN1YnN0cmVhbS0+cnVudGltZS0+ Y2hhbm5lbHM7CisKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0NOVExfU1QsIGN0cmxfc3RhdGUu Y3RybF92YWwpOworCisJZnJhbWUyLmZyMl9yZWd4LmNobmxfY250ID0gc3Vic3RyZWFtLT5ydW50 aW1lLT5jaGFubmVscyAtIDE7CisKKwlmcmFtZTMuZnIzX3JlZ3guY2hubF9hbGxvYyA9IHNuZF9p bnRlbGhhZF9jaGFubmVsX2FsbG9jYXRpb24oCisJCQkJCWludGVsaGFkZGF0YSwgY2hhbm5lbHMp OworCisJLypDYWxjdWx0ZSB0aGUgYnl0ZSB3aWRlIGNoZWNrc3VtIGZvciBhbGwgdmFsaWQgRElQ IHdvcmRzKi8KKwlmb3IgKGkgPSAwOyBpIDwgQllURVNfUEVSX1dPUkQ7IGkrKykKKwkJY2hlY2tz dW0gKz0gKElORk9fRlJBTUVfV09SRDEgPj4gaSpCSVRTX1BFUl9CWVRFKSAmIE1BU0tfQllURTA7 CisJZm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBpKyspCisJCWNoZWNrc3VtICs9IChm cmFtZTIuZnIyX3ZhbCA+PiBpKkJJVFNfUEVSX0JZVEUpICYgTUFTS19CWVRFMDsKKwlmb3IgKGkg PSAwOyBpIDwgQllURVNfUEVSX1dPUkQ7IGkrKykKKwkJY2hlY2tzdW0gKz0gKGZyYW1lMy5mcjNf dmFsID4+IGkqQklUU19QRVJfQllURSkgJiBNQVNLX0JZVEUwOworCisJZnJhbWUyLmZyMl9yZWd4 LmNoa3N1bSA9IC0oY2hlY2tzdW0pOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JV19J TkZPRlIsIElORk9fRlJBTUVfV09SRDEpOworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSVdf SU5GT0ZSLCBmcmFtZTIuZnIyX3ZhbCk7CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JV19J TkZPRlIsIGZyYW1lMy5mcjNfdmFsKTsKKworCS8qIHByb2dyYW0gcmVtYWluaW5nIERJUCB3b3Jk cyB3aXRoIHplcm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgSEFEX01BWF9ESVBfV09SRFMtVkFMSURf RElQX1dPUkRTOyBpKyspCisJCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSVdfSU5GT0ZSLCAw eDApOworCisJY3RybF9zdGF0ZS5jdHJsX3JlZ3guZGlwX2ZyZXEgPSAxOworCWN0cmxfc3RhdGUu Y3RybF9yZWd4LmRpcF9lbl9zdGEgPSAxOworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfQ05UTF9T VCwgY3RybF9zdGF0ZS5jdHJsX3ZhbCk7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX3Byb2df ZGlwX3YyIC0gdG8gaW5pdGlhbGl6ZSBEYXRhIElzbGFuZCBQYWNrZXRzIHJlZ2lzdGVycworICoK KyAqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgcHJlcGFyZSBmdW5jdGlvbiBp cyBjYWxsZWQKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3RyZWFtIHByaXZhdGUgZGF0YQorICoKKyAq IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwcmVwYXJlIGNhbGxiYWNrCisgKi8KK3N0 YXRpYyB2b2lkIHNuZF9pbnRlbGhhZF9wcm9nX2RpcF92MihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJl YW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7 CisJaW50IGk7CisJdW5pb24gYXVkX2N0cmxfc3QgY3RybF9zdGF0ZSA9IHsuY3RybF92YWwgPSAw fTsKKwl1bmlvbiBhdWRfaW5mb19mcmFtZTIgZnJhbWUyID0gey5mcjJfdmFsID0gMH07CisJdW5p b24gYXVkX2luZm9fZnJhbWUzIGZyYW1lMyA9IHsuZnIzX3ZhbCA9IDB9OworCXU4IGNoZWNrc3Vt ID0gMDsKKwlpbnQgY2hhbm5lbHM7CisKKwljaGFubmVscyA9IHN1YnN0cmVhbS0+cnVudGltZS0+ Y2hhbm5lbHM7CisKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0NOVExfU1QsIGN0cmxfc3RhdGUu Y3RybF92YWwpOworCisJZnJhbWUyLmZyMl9yZWd4LmNobmxfY250ID0gc3Vic3RyZWFtLT5ydW50 aW1lLT5jaGFubmVscyAtIDE7CisKKwlmcmFtZTMuZnIzX3JlZ3guY2hubF9hbGxvYyA9IHNuZF9p bnRlbGhhZF9jaGFubmVsX2FsbG9jYXRpb24oCisJCQkJCWludGVsaGFkZGF0YSwgY2hhbm5lbHMp OworCisJLypDYWxjdWx0ZSB0aGUgYnl0ZSB3aWRlIGNoZWNrc3VtIGZvciBhbGwgdmFsaWQgRElQ IHdvcmRzKi8KKwlmb3IgKGkgPSAwOyBpIDwgQllURVNfUEVSX1dPUkQ7IGkrKykKKwkJY2hlY2tz dW0gKz0gKElORk9fRlJBTUVfV09SRDEgPj4gaSpCSVRTX1BFUl9CWVRFKSAmIE1BU0tfQllURTA7 CisJZm9yIChpID0gMDsgaSA8IEJZVEVTX1BFUl9XT1JEOyBpKyspCisJCWNoZWNrc3VtICs9IChm cmFtZTIuZnIyX3ZhbCA+PiBpKkJJVFNfUEVSX0JZVEUpICYgTUFTS19CWVRFMDsKKwlmb3IgKGkg PSAwOyBpIDwgQllURVNfUEVSX1dPUkQ7IGkrKykKKwkJY2hlY2tzdW0gKz0gKGZyYW1lMy5mcjNf dmFsID4+IGkqQklUU19QRVJfQllURSkgJiBNQVNLX0JZVEUwOworCisJZnJhbWUyLmZyMl9yZWd4 LmNoa3N1bSA9IC0oY2hlY2tzdW0pOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JV19J TkZPRlJfdjIsIElORk9fRlJBTUVfV09SRDEpOworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERN SVdfSU5GT0ZSX3YyLCBmcmFtZTIuZnIyX3ZhbCk7CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9I RE1JV19JTkZPRlJfdjIsIGZyYW1lMy5mcjNfdmFsKTsKKworCS8qIHByb2dyYW0gcmVtYWluaW5n IERJUCB3b3JkcyB3aXRoIHplcm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgSEFEX01BWF9ESVBfV09S RFMtVkFMSURfRElQX1dPUkRTOyBpKyspCisJCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSVdf SU5GT0ZSX3YyLCAweDApOworCisJY3RybF9zdGF0ZS5jdHJsX3JlZ3guZGlwX2ZyZXEgPSAxOwor CWN0cmxfc3RhdGUuY3RybF9yZWd4LmRpcF9lbl9zdGEgPSAxOworCWhhZF93cml0ZV9yZWdpc3Rl cihBVURfQ05UTF9TVCwgY3RybF9zdGF0ZS5jdHJsX3ZhbCk7Cit9CisKKy8qKgorICogc25kX2lu dGVsaGFkX3Byb2dfYnVmZmVyIC0gcHJvZ3JhbXMgYnVmZmVyCisgKiBhZGRyZXNzIGFuZCBsZW5n dGggcmVnaXN0ZXJzCisgKgorICogQHN1YnN0cmVhbTpzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBw cmVwYXJlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogQGludGVsaGFkZGF0YTpzdWJzdHJlYW0gcHJp dmF0ZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBwcm9ncmFtcyByaW5nIGJ1ZmZlciBhZGRy ZXNzIGFuZCBsZW5ndGggaW50byByZWdpc3RlcnMuCisgKi8KK2ludCBzbmRfaW50ZWxoYWRfcHJv Z19idWZmZXIoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhLAorCQkJCQlpbnQgc3Rh cnQsIGludCBlbmQpCit7CisJdTMyIHJpbmdfYnVmX2FkZHIsIHJpbmdfYnVmX3NpemUsIHBlcmlv ZF9ieXRlczsKKwl1OCBpLCBudW1fcGVyaW9kczsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0g KnN1YnN0cmVhbTsKKworCXN1YnN0cmVhbSA9IGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uaGFk X3N1YnN0cmVhbTsKKwlpZiAoIXN1YnN0cmVhbSkgeworCQlwcl9lcnIoInN1YnN0cmVhbSBpcyBO VUxMXG4iKTsKKwkJZHVtcF9zdGFjaygpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyaW5nX2J1Zl9h ZGRyID0gc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYWRkcjsKKwlyaW5nX2J1Zl9zaXplID0gc25k X3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJaW50ZWxoYWRkYXRhLT5zdHJlYW1f aW5mby5yaW5nX2J1Zl9zaXplID0gcmluZ19idWZfc2l6ZTsKKwlwZXJpb2RfYnl0ZXMgPSBmcmFt ZXNfdG9fYnl0ZXMoc3Vic3RyZWFtLT5ydW50aW1lLAorCQkJCXN1YnN0cmVhbS0+cnVudGltZS0+ cGVyaW9kX3NpemUpOworCW51bV9wZXJpb2RzID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2Rz OworCisJLyoKKwkgKiBidWZmZXIgYWRkciBzaG91bGQgIGJlIDY0IGJ5dGUgYWxpZ25lZCwgcGVy aW9kIGJ5dGVzCisJICogd2lsbCBiZSB1c2VkIHRvIGNhbGN1bGF0ZSBhZGRyIG9mZnNldAorCSAq LworCXBlcmlvZF9ieXRlcyAmPSB+MHgzRjsKKworCS8qIEhhcmR3YXJlIHN1cHBvcnRzIE1BWF9Q RVJJT0RTIGJ1ZmZlcnMgKi8KKwlpZiAoZW5kID49IEhBRF9NQVhfUEVSSU9EUykKKwkJcmV0dXJu IC1FSU5WQUw7CisKKwlmb3IgKGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykgeworCQkvKiBQcm9n cmFtIHRoZSBidWYgcmVnaXN0ZXJzIHdpdGggYWRkciBhbmQgbGVuICovCisJCWludGVsaGFkZGF0 YS0+YnVmX2luZm9baV0uYnVmX2FkZHIgPSByaW5nX2J1Zl9hZGRyICsKKwkJCQkJCQkgKGkgKiBw ZXJpb2RfYnl0ZXMpOworCQlpZiAoaSA8IG51bV9wZXJpb2RzLTEpCisJCQlpbnRlbGhhZGRhdGEt PmJ1Zl9pbmZvW2ldLmJ1Zl9zaXplID0gcGVyaW9kX2J5dGVzOworCQllbHNlCisJCQlpbnRlbGhh ZGRhdGEtPmJ1Zl9pbmZvW2ldLmJ1Zl9zaXplID0gcmluZ19idWZfc2l6ZSAtCisJCQkJCQkJKHBl cmlvZF9ieXRlcyppKTsKKworCQloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9BX0FERFIgKyAo aSAqIEhBRF9SRUdfV0lEVEgpLAorCQkJCQlpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2ldLmJ1Zl9h ZGRyIHwKKwkJCQkJQklUKDApIHwgQklUKDEpKTsKKwkJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9C VUZfQV9MRU5HVEggKyAoaSAqIEhBRF9SRUdfV0lEVEgpLAorCQkJCQlwZXJpb2RfYnl0ZXMpOwor CQlpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2ldLmlzX3ZhbGlkID0gdHJ1ZTsKKwl9CisJcHJfZGVi dWcoIiVzOmJ1ZlslZC0lZF0gYWRkcj0lI3ggIGFuZCBzaXplPSVkXG4iLCBfX2Z1bmNfXywgc3Rh cnQsIGVuZCwKKwkJCWludGVsaGFkZGF0YS0+YnVmX2luZm9bc3RhcnRdLmJ1Zl9hZGRyLAorCQkJ aW50ZWxoYWRkYXRhLT5idWZfaW5mb1tzdGFydF0uYnVmX3NpemUpOworCWludGVsaGFkZGF0YS0+ dmFsaWRfYnVmX2NudCA9IG51bV9wZXJpb2RzOworCXJldHVybiAwOworfQorCitpbmxpbmUgaW50 IHNuZF9pbnRlbGhhZF9yZWFkX2xlbihzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEp Cit7CisJaW50IGksIHJldHZhbCA9IDA7CisJdTMyIGxlbls0XTsKKworCWZvciAoaSA9IDA7IGkg PCA0IDsgaSsrKSB7CisJCWhhZF9yZWFkX3JlZ2lzdGVyKEFVRF9CVUZfQV9MRU5HVEggKyAoaSAq IEhBRF9SRUdfV0lEVEgpLAorCQkJCQkmbGVuW2ldKTsKKwkJaWYgKCFsZW5baV0pCisJCQlyZXR2 YWwrKzsKKwl9CisJaWYgKHJldHZhbCAhPSAxKSB7CisJCWZvciAoaSA9IDA7IGkgPCA0IDsgaSsr KQorCQkJcHJfZGVidWcoImJ1ZlslZF0gc2l6ZT0lZFxuIiwgaSwgbGVuW2ldKTsKKwl9CisKKwly ZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9wcm9nX2N0c192MSAtIFBy b2dyYW0gSERNSSBhdWRpbyBDVFMgdmFsdWUKKyAqCisgKiBAYXVkX3NhbXBfZnJlcTogc2FtcGxp bmcgZnJlcXVlbmN5IG9mIGF1ZGlvIGRhdGEKKyAqIEB0bWRzOiBzYW1wbGluZyBmcmVxdWVuY3kg b2YgdGhlIGRpc3BsYXkgZGF0YQorICogQG5fcGFyYW06IE4gdmFsdWUsIGRlcGVuZHMgb24gYXVk X3NhbXBfZnJlcQorICogQGludGVsaGFkZGF0YTpzdWJzdHJlYW0gcHJpdmF0ZSBkYXRhCisgKgor ICogUHJvZ3JhbSBDVFMgcmVnaXN0ZXIgYmFzZWQgb24gdGhlIGF1ZGlvIGFuZCBkaXNwbGF5IHNh bXBsaW5nIGZyZXF1ZW5jeQorICovCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRfcHJvZ19jdHNf djEodTMyIGF1ZF9zYW1wX2ZyZXEsIHUzMiB0bWRzLCB1MzIgbl9wYXJhbSwKKwkJCQlzdHJ1Y3Qg c25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJdTMyIGN0c192YWw7CisJdTY0IGRpdmlk ZW5kLCBkaXZpc29yOworCisJLyogQ2FsY3VsYXRlIENUUyBhY2NvcmRpbmcgdG8gSERNSSAxLjNh IHNwZWMqLworCWRpdmlkZW5kID0gKHU2NCl0bWRzICogbl9wYXJhbSoxMDAwOworCWRpdmlzb3Ig PSAxMjggKiBhdWRfc2FtcF9mcmVxOworCWN0c192YWwgPSBkaXY2NF91NjQoZGl2aWRlbmQsIGRp dmlzb3IpOworCXByX2RlYnVnKCJUTURTIHZhbHVlPSVkLCBOIHZhbHVlPSVkLCBDVFMgVmFsdWU9 JWRcbiIsCisJCQl0bWRzLCBuX3BhcmFtLCBjdHNfdmFsKTsKKwloYWRfd3JpdGVfcmVnaXN0ZXIo QVVEX0hETUlfQ1RTLCAoQklUKDIwKSB8IGN0c192YWwpKTsKK30KKworLyoqCisgKiBzbmRfaW50 ZWxoYWRfcHJvZ19jdHNfdjIgLSBQcm9ncmFtIEhETUkgYXVkaW8gQ1RTIHZhbHVlCisgKgorICog QGF1ZF9zYW1wX2ZyZXE6IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiBhdWRpbyBkYXRhCisgKiBAdG1k czogc2FtcGxpbmcgZnJlcXVlbmN5IG9mIHRoZSBkaXNwbGF5IGRhdGEKKyAqIEBuX3BhcmFtOiBO IHZhbHVlLCBkZXBlbmRzIG9uIGF1ZF9zYW1wX2ZyZXEKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3Ry ZWFtIHByaXZhdGUgZGF0YQorICoKKyAqIFByb2dyYW0gQ1RTIHJlZ2lzdGVyIGJhc2VkIG9uIHRo ZSBhdWRpbyBhbmQgZGlzcGxheSBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworc3RhdGljIHZvaWQg c25kX2ludGVsaGFkX3Byb2dfY3RzX3YyKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgdG1kcywgdTMy IG5fcGFyYW0sCisJCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXUz MiBjdHNfdmFsOworCXU2NCBkaXZpZGVuZCwgZGl2aXNvcjsKKworCS8qIENhbGN1bGF0ZSBDVFMg YWNjb3JkaW5nIHRvIEhETUkgMS4zYSBzcGVjKi8KKwlkaXZpZGVuZCA9ICh1NjQpdG1kcyAqIG5f cGFyYW0qMTAwMDsKKwlkaXZpc29yID0gMTI4ICogYXVkX3NhbXBfZnJlcTsKKwljdHNfdmFsID0g ZGl2NjRfdTY0KGRpdmlkZW5kLCBkaXZpc29yKTsKKwlwcl9kZWJ1ZygiVE1EUyB2YWx1ZT0lZCwg TiB2YWx1ZT0lZCwgQ1RTIFZhbHVlPSVkXG4iLAorCQkJdG1kcywgbl9wYXJhbSwgY3RzX3ZhbCk7 CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX0NUUywgKEJJVCgyNCkgfCBjdHNfdmFsKSk7 Cit9CisKK3N0YXRpYyBpbnQgaGFkX2NhbGN1bGF0ZV9uX3ZhbHVlKHUzMiBhdWRfc2FtcF9mcmVx KQoreworCXMzMiBuX3ZhbDsKKworCS8qIFNlbGVjdCBOIGFjY29yZGluZyB0byBIRE1JIDEuM2Eg c3BlYyovCisJc3dpdGNoIChhdWRfc2FtcF9mcmVxKSB7CisJY2FzZSBBVURfU0FNUExFX1JBVEVf MzI6CisJCW5fdmFsID0gNDA5NjsKKwlicmVhazsKKworCWNhc2UgQVVEX1NBTVBMRV9SQVRFXzQ0 XzE6CisJCW5fdmFsID0gNjI3MjsKKwlicmVhazsKKworCWNhc2UgQVVEX1NBTVBMRV9SQVRFXzQ4 OgorCQluX3ZhbCA9IDYxNDQ7CisJYnJlYWs7CisKKwljYXNlIEFVRF9TQU1QTEVfUkFURV84OF8y OgorCQluX3ZhbCA9IDEyNTQ0OworCWJyZWFrOworCisJY2FzZSBBVURfU0FNUExFX1JBVEVfOTY6 CisJCW5fdmFsID0gMTIyODg7CisJYnJlYWs7CisKKwljYXNlIEFVRF9TQU1QTEVfUkFURV8xNzZf NDoKKwkJbl92YWwgPSAyNTA4ODsKKwlicmVhazsKKworCWNhc2UgSEFEX01BWF9SQVRFOgorCQlu X3ZhbCA9IDI0NTc2OworCWJyZWFrOworCisJZGVmYXVsdDoKKwkJbl92YWwgPSAtRUlOVkFMOwor CWJyZWFrOworCX0KKwlyZXR1cm4gbl92YWw7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX3By b2dfbl92MSAtIFByb2dyYW0gSERNSSBhdWRpbyBOIHZhbHVlCisgKgorICogQGF1ZF9zYW1wX2Zy ZXE6IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiBhdWRpbyBkYXRhCisgKiBAbl9wYXJhbTogTiB2YWx1 ZSwgZGVwZW5kcyBvbiBhdWRfc2FtcF9mcmVxCisgKiBAaW50ZWxoYWRkYXRhOnN1YnN0cmVhbSBw cml2YXRlIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgcHJlcGFy ZSBjYWxsYmFjay4KKyAqIEl0IHByb2dyYW1zIGJhc2VkIG9uIHRoZSBhdWRpbyBhbmQgZGlzcGxh eSBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCBzbmRfaW50ZWxoYWRfcHJvZ19u X3YxKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgKm5fcGFyYW0sCisJCQkJc3RydWN0IHNuZF9pbnRl bGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXMzMiBuX3ZhbDsKKworCW5fdmFsID0JaGFkX2NhbGN1 bGF0ZV9uX3ZhbHVlKGF1ZF9zYW1wX2ZyZXEpOworCisJaWYgKG5fdmFsIDwgMCkKKwkJcmV0dXJu IG5fdmFsOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9OX0VOQUJMRSwgKEJJVCgyMCkgfCBu X3ZhbCkpOworCSpuX3BhcmFtID0gbl92YWw7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc25k X2ludGVsaGFkX3Byb2dfbl92MiAtIFByb2dyYW0gSERNSSBhdWRpbyBOIHZhbHVlCisgKgorICog QGF1ZF9zYW1wX2ZyZXE6IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiBhdWRpbyBkYXRhCisgKiBAbl9w YXJhbTogTiB2YWx1ZSwgZGVwZW5kcyBvbiBhdWRfc2FtcF9mcmVxCisgKiBAaW50ZWxoYWRkYXRh OnN1YnN0cmVhbSBwcml2YXRlIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBp biB0aGUgcHJlcGFyZSBjYWxsYmFjay4KKyAqIEl0IHByb2dyYW1zIGJhc2VkIG9uIHRoZSBhdWRp byBhbmQgZGlzcGxheSBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworc3RhdGljIGludCBzbmRfaW50 ZWxoYWRfcHJvZ19uX3YyKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgKm5fcGFyYW0sCisJCQkJc3Ry dWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXMzMiBuX3ZhbDsKKworCW5fdmFs ID0JaGFkX2NhbGN1bGF0ZV9uX3ZhbHVlKGF1ZF9zYW1wX2ZyZXEpOworCisJaWYgKG5fdmFsIDwg MCkKKwkJcmV0dXJuIG5fdmFsOworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9OX0VOQUJMRSwg KEJJVCgyNCkgfCBuX3ZhbCkpOworCSpuX3BhcmFtID0gbl92YWw7CisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyB2b2lkIGhhZF9jbGVhcl91bmRlcnJ1bl9pbnRyX3YxKHN0cnVjdCBzbmRfaW50ZWxo YWQgKmludGVsaGFkZGF0YSkKK3sKKwl1MzIgaGRtaV9zdGF0dXMsIGkgPSAwOworCisJLyogSGFu ZGxlIFVuZGVycnVuIGludGVycnVwdCB3aXRoaW4gQXVkaW8gVW5pdCAqLworCWhhZF93cml0ZV9y ZWdpc3RlcihBVURfQ09ORklHLCAwKTsKKwkvKiBSZXNldCBidWZmZXIgcG9pbnRlcnMgKi8KKwlo YWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTLCAxKTsKKwloYWRfd3JpdGVfcmVnaXN0 ZXIoQVVEX0hETUlfU1RBVFVTLCAwKTsKKwkvKioKKwkgKiBUaGUgaW50ZXJydXB0IHN0YXR1cyAn c3RpY2t5JyBiaXRzIG1pZ2h0IG5vdCBiZSBjbGVhcmVkIGJ5CisJICogc2V0dGluZyAnMScgdG8g dGhhdCBiaXQgb25jZS4uLgorCSAqLworCWRvIHsgLyogY2xlYXIgYml0MzAsIDMxIEFVRF9IRE1J X1NUQVRVUyAqLworCQloYWRfcmVhZF9yZWdpc3RlcihBVURfSERNSV9TVEFUVVMsICZoZG1pX3N0 YXR1cyk7CisJCXByX2RlYnVnKCJIRE1JIHN0YXR1cyA9MHgleFxuIiwgaGRtaV9zdGF0dXMpOwor CQlpZiAoaGRtaV9zdGF0dXMgJiBBVURfQ09ORklHX01BU0tfVU5ERVJSVU4pIHsKKwkJCWkrKzsK KwkJCWhkbWlfc3RhdHVzICY9IChBVURfQ09ORklHX01BU0tfU1JEQkcgfAorCQkJCQlBVURfQ09O RklHX01BU0tfRlVOQ1JTVCk7CisJCQloZG1pX3N0YXR1cyB8PSB+QVVEX0NPTkZJR19NQVNLX1VO REVSUlVOOworCQkJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX1NUQVRVUywgaGRtaV9zdGF0 dXMpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0gd2hpbGUgKGkgPCBNQVhfQ05UKTsKKwlpZiAo aSA+PSBNQVhfQ05UKQorCQlwcl9lcnIoIlVuYWJsZSB0byBjbGVhciBVTkRFUlJVTiBiaXRzXG4i KTsKK30KKworc3RhdGljIHZvaWQgaGFkX2NsZWFyX3VuZGVycnVuX2ludHJfdjIoc3RydWN0IHNu ZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXUzMiBoZG1pX3N0YXR1cywgaSA9IDA7CisK KwkvKiBIYW5kbGUgVW5kZXJydW4gaW50ZXJydXB0IHdpdGhpbiBBdWRpbyBVbml0ICovCisJaGFk X3dyaXRlX3JlZ2lzdGVyKEFVRF9DT05GSUcsIDApOworCS8qIFJlc2V0IGJ1ZmZlciBwb2ludGVy cyAqLworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSV9TVEFUVVNfdjIsIDEpOworCWhhZF93 cml0ZV9yZWdpc3RlcihBVURfSERNSV9TVEFUVVNfdjIsIDApOworCS8qKgorCSAqIFRoZSBpbnRl cnJ1cHQgc3RhdHVzICdzdGlja3knIGJpdHMgbWlnaHQgbm90IGJlIGNsZWFyZWQgYnkKKwkgKiBz ZXR0aW5nICcxJyB0byB0aGF0IGJpdCBvbmNlLi4uCisJICovCisJZG8geyAvKiBjbGVhciBiaXQz MCwgMzEgQVVEX0hETUlfU1RBVFVTICovCisJCWhhZF9yZWFkX3JlZ2lzdGVyKEFVRF9IRE1JX1NU QVRVU192MiwgJmhkbWlfc3RhdHVzKTsKKwkJcHJfZGVidWcoIkhETUkgc3RhdHVzID0weCV4XG4i LCBoZG1pX3N0YXR1cyk7CisJCWlmIChoZG1pX3N0YXR1cyAmIEFVRF9DT05GSUdfTUFTS19VTkRF UlJVTikgeworCQkJaSsrOworCQkJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX1NUQVRVU192 MiwgaGRtaV9zdGF0dXMpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0gd2hpbGUgKGkgPCBNQVhf Q05UKTsKKwlpZiAoaSA+PSBNQVhfQ05UKQorCQlwcl9lcnIoIlVuYWJsZSB0byBjbGVhciBVTkRF UlJVTiBiaXRzXG4iKTsKK30KKworLyoqCisqIHNuZF9pbnRlbGhhZF9vcGVuIC0gc3RyZWFtIGlu aXRpYWxpemF0aW9ucyBhcmUgZG9uZSBoZXJlCisqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3 aGljaCB0aGUgc3RyZWFtIGZ1bmN0aW9uIGlzIGNhbGxlZAorKgorKiBUaGlzIGZ1bmN0aW9uIGlz IGNhbGxlZCB3aGVuZXZlciBhIFBDTSBzdHJlYW0gaXMgb3BlbmVkCisqLworc3RhdGljIGludCBz bmRfaW50ZWxoYWRfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sK KwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisJc3RydWN0IHNuZF9wY21fcnVu dGltZSAqcnVudGltZTsKKwlzdHJ1Y3QgaGFkX3N0cmVhbV9wdnQgKnN0cmVhbTsKKwlzdHJ1Y3Qg aGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCWludCByZXR2YWw7CisKKwlwcl9kZWJ1Zygic25k X2ludGVsaGFkX29wZW4gY2FsbGVkXG4iKTsKKwlpbnRlbGhhZGRhdGEgPSBzbmRfcGNtX3N1YnN0 cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0YS0+cHJpdmF0 ZV9kYXRhOworCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlwbV9ydW50aW1lX2dl dChpbnRlbGhhZGRhdGEtPmRldik7CisKKwlpZiAoaGFkX2dldF9od3N0YXRlKGludGVsaGFkZGF0 YSkpIHsKKwkJcHJfZXJyKCIlczogSERNSSBjYWJsZSBwbHVnZ2VkLW91dFxuIiwgX19mdW5jX18p OworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXRfcHV0X2hhbmRsZTsKKwl9CisKKwkv KiBDaGVjaywgaWYgZGV2aWNlIGFscmVhZHkgaW4gdXNlICovCisJaWYgKHJ1bnRpbWUtPnByaXZh dGVfZGF0YSkgeworCQlwcl9lcnIoIkRldmljZSBhbHJlYWR5IGluIHVzZVxuIik7CisJCXJldHZh bCA9IC1FQlVTWTsKKwkJZ290byBleGl0X3B1dF9oYW5kbGU7CisJfQorCisJLyogc2V0IHRoZSBy dW50aW1lIGh3IHBhcmFtZXRlciB3aXRoIGxvY2FsIHNuZF9wY21faGFyZHdhcmUgc3RydWN0ICov CisJcnVudGltZS0+aHcgPSBzbmRfaW50ZWxfaGFkc3RyZWFtOworCisJc3RyZWFtID0ga3phbGxv YyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOworCWlmICghc3RyZWFtKSB7CisJCXJldHZh bCA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF9wdXRfaGFuZGxlOworCX0KKwlzdHJlYW0tPnN0cmVh bV9zdGF0dXMgPSBTVFJFQU1fSU5JVDsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEgPSBzdHJlYW07 CisKKwlyZXR2YWwgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAorCQkJ IFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBl eGl0X2VycjsKKworCS8qIE1ha2Ugc3VyZSwgdGhhdCB0aGUgcGVyaW9kIHNpemUgaXMgYWx3YXlz IGFsaWduZWQKKwkgKiA2NGJ5dGUgYm91bmRhcnkKKwkgKi8KKwlyZXR2YWwgPSBzbmRfcGNtX2h3 X2NvbnN0cmFpbnRfc3RlcChzdWJzdHJlYW0tPnJ1bnRpbWUsIDAsCisJCQlTTkRSVl9QQ01fSFdf UEFSQU1fUEVSSU9EX0JZVEVTLCA2NCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcHJfZXJyKCIl czpzdGVwX3NpemU9NjQgZmFpbGVkLGVycj0lZFxuIiwgX19mdW5jX18sIHJldHZhbCk7CisJCWdv dG8gZXhpdF9lcnI7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK2V4aXRfZXJyOgorCWtmcmVlKHN0 cmVhbSk7CitleGl0X3B1dF9oYW5kbGU6CisJcG1fcnVudGltZV9wdXQoaW50ZWxoYWRkYXRhLT5k ZXYpOworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcmV0dXJuIHJldHZhbDsKK30K KworLyoqCisqIGhhZF9wZXJpb2RfZWxhcHNlZCAtIHVwZGF0ZXMgdGhlIGhhcmR3YXJlIHBvaW50 ZXIgc3RhdHVzCisqIEBoYWRfc3Vic3RyZWFtOnN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIHN0cmVh bSBmdW5jdGlvbiBpcyBjYWxsZWQKKyoKKyovCitzdGF0aWMgdm9pZCBoYWRfcGVyaW9kX2VsYXBz ZWQodm9pZCAqaGFkX3N1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1 YnN0cmVhbSA9IGhhZF9zdWJzdHJlYW07CisJc3RydWN0IGhhZF9zdHJlYW1fcHZ0ICpzdHJlYW07 CisKKwkvKiBwcl9kZWJ1ZygiaGFkX3BlcmlvZF9lbGFwc2VkIGNhbGxlZFxuIik7ICovCisKKwlp ZiAoIXN1YnN0cmVhbSB8fCAhc3Vic3RyZWFtLT5ydW50aW1lKQorCQlyZXR1cm47CisJc3RyZWFt ID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJaWYgKCFzdHJlYW0pCisJCXJl dHVybjsKKworCWlmIChzdHJlYW0tPnN0cmVhbV9zdGF0dXMgIT0gU1RSRUFNX1JVTk5JTkcpCisJ CXJldHVybjsKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Cit9CisKKy8qKgor KiBzbmRfaW50ZWxoYWRfaW5pdF9zdHJlYW0gLSBpbnRlcm5hbCBmdW5jdGlvbiB0byBpbml0aWFs aXplIHN0cmVhbSBpbmZvCisqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgc3Ry ZWFtIGZ1bmN0aW9uIGlzIGNhbGxlZAorKgorKi8KK3N0YXRpYyBpbnQgc25kX2ludGVsaGFkX2lu aXRfc3RyZWFtKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVj dCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vi c3RyZWFtKTsKKworCXByX2RlYnVnKCJzbmRfaW50ZWxoYWRfaW5pdF9zdHJlYW0gY2FsbGVkXG4i KTsKKworCXByX2RlYnVnKCJzZXR0aW5nIGJ1ZmZlciBwdHIgcGFyYW1cbiIpOworCWludGVsaGFk ZGF0YS0+c3RyZWFtX2luZm8ucGVyaW9kX2VsYXBzZWQgPSBoYWRfcGVyaW9kX2VsYXBzZWQ7CisJ aW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFtID0gc3Vic3RyZWFtOworCWlu dGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3B0ciA9IDA7CisJaW50ZWxoYWRkYXRhLT5z dHJlYW1faW5mby5idWZmZXJfcmVuZGVyZWQgPSAwOworCWludGVsaGFkZGF0YS0+c3RyZWFtX2lu Zm8uc2ZyZXEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGU7CisJcmV0dXJuIDA7Cit9CisKKy8q KgorICogc25kX2ludGVsaGFkX2Nsb3NlLSB0byBmcmVlIHBhcmFtZXRlcmVzIHdoZW4gc3RyZWFt IGlzIHN0b3BwZWQKKyAqCisgKiBAc3Vic3RyZWFtOiAgc3Vic3RyZWFtIGZvciB3aGljaCB0aGUg ZnVuY3Rpb24gaXMgY2FsbGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQUxT QSBmcmFtZXdvcmsgd2hlbiBzdHJlYW0gaXMgc3RvcHBlZAorICovCitzdGF0aWMgaW50IHNuZF9p bnRlbGhhZF9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlz dHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisJc3RydWN0IHNuZF9wY21fcnVudGlt ZSAqcnVudGltZTsKKworCXByX2RlYnVnKCJzbmRfaW50ZWxoYWRfY2xvc2UgY2FsbGVkXG4iKTsK KworCWludGVsaGFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwly dW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCisJaWYgKCFydW50aW1lLT5wcml2YXRlX2Rh dGEpIHsKKwkJcHJfZGVidWcoImNsb3NlKCkgbWlnaHQgaGF2ZSBjYWxsZWQgYWZ0ZXIgZmFpbGVk IG9wZW4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5i dWZmZXJfcmVuZGVyZWQgPSAwOworCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3B0 ciA9IDA7CisJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5zdHJfaWQgPSAwOworCWludGVsaGFk ZGF0YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVhbSA9IE5VTEw7CisKKwkvKiBDaGVjayBpZiBm b2xsb3dpbmcgZHJ2X3N0YXR1cyBtb2RpZmljYXRpb24gaXMgcmVxdWlyZWQgLSBWQSAqLworCWlm IChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgIT0gSEFEX0RSVl9ESVNDT05ORUNURUQpIHsKKwkJ aW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID0gSEFEX0RSVl9DT05ORUNURUQ7CisJCXByX2RlYnVn KCIlcyBAICVkOkRFQlVHIFBMVUcvVU5QTFVHIDogSEFEX0RSVl9DT05ORUNURURcbiIsCisJCQlf X2Z1bmNfXywgX19MSU5FX18pOworCX0KKwlrZnJlZShydW50aW1lLT5wcml2YXRlX2RhdGEpOwor CXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcG1fcnVudGltZV9wdXQoaW50ZWxoYWRk YXRhLT5kZXYpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9od19wYXJh bXMtIHRvIHNldHVwIHRoZSBoYXJkd2FyZSBwYXJhbWV0ZXJzCisgKiBsaWtlIGFsbG9jYXRpbmcg dGhlIGJ1ZmZlcnMKKyAqCisgKiBAc3Vic3RyZWFtOiAgc3Vic3RyZWFtIGZvciB3aGljaCB0aGUg ZnVuY3Rpb24gaXMgY2FsbGVkCisgKiBAaHdfcGFyYW1zOiBoYXJkd2FyZSBwYXJhbWV0ZXJzCisg KgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQUxTQSBmcmFtZXdvcmsgd2hlbiBoYXJk d2FyZSBwYXJhbXMgYXJlIHNldAorICovCitzdGF0aWMgaW50IHNuZF9pbnRlbGhhZF9od19wYXJh bXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJICAgIHN0cnVjdCBz bmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlp bnQgcGFnZXMsIGJ1Zl9zaXplLCByZXR2YWw7CisKKwlwcl9kZWJ1Zygic25kX2ludGVsaGFkX2h3 X3BhcmFtcyBjYWxsZWRcbiIpOworCisJQlVHX09OKCFod19wYXJhbXMpOworCisJYnVmX3NpemUg PSBwYXJhbXNfYnVmZmVyX2J5dGVzKGh3X3BhcmFtcyk7CisJcmV0dmFsID0gc25kX3BjbV9saWJf bWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgYnVmX3NpemUpOworCWlmIChyZXR2YWwgPCAwKQorCQly ZXR1cm4gcmV0dmFsOworCXByX2RlYnVnKCIlczphbGxvY2F0ZWQgbWVtb3J5ID0gJWRcbiIsIF9f ZnVuY19fLCBidWZfc2l6ZSk7CisJLyogbWFyayB0aGUgcGFnZXMgYXMgdW5jYWNoZWQgcmVnaW9u ICovCisJYWRkciA9ICh1bnNpZ25lZCBsb25nKSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVh OworCXBhZ2VzID0gKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2J5dGVzICsgUEFHRV9TSVpFIC0g MSkgLyBQQUdFX1NJWkU7CisJcmV0dmFsID0gc2V0X21lbW9yeV91YyhhZGRyLCBwYWdlcyk7CisJ aWYgKHJldHZhbCkgeworCQlwcl9lcnIoInNldF9tZW1vcnlfdWMgZmFpbGVkLkVycm9yOiVkXG4i LCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwltZW1zZXQoc3Vic3RyZWFtLT5ydW50 aW1lLT5kbWFfYXJlYSwgMCwgYnVmX3NpemUpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoq CisgKiBzbmRfaW50ZWxoYWRfaHdfZnJlZS0gdG8gcmVsZWFzZSB0aGUgcmVzb3VyY2VzIGFsbG9j YXRlZCBkdXJpbmcKKyAqIGhhcmR3YXJlIHBhcmFtcyBzZXR1cAorICoKKyAqIEBzdWJzdHJlYW06 ICBzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqCisgKiBUaGlz IGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBBTFNBIGZyYW1ld29yayBiZWZvcmUgY2xvc2UgY2FsbGJh Y2suCisgKgorICovCitzdGF0aWMgaW50IHNuZF9pbnRlbGhhZF9od19mcmVlKHN0cnVjdCBzbmRf cGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1MzIg cGFnZXM7CisKKwlwcl9kZWJ1Zygic25kX2ludGVsaGFkX2h3X2ZyZWUgY2FsbGVkXG4iKTsKKwor CS8qIG1hcmsgYmFjayB0aGUgcGFnZXMgYXMgY2FjaGVkL3dyaXRlYmFjayByZWdpb24gYmVmb3Jl IHRoZSBmcmVlICovCisJaWYgKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEgIT0gTlVMTCkg eworCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWE7 CisJCXBhZ2VzID0gKHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2J5dGVzICsgUEFHRV9TSVpFIC0g MSkgLworCQkJCQkJCQlQQUdFX1NJWkU7CisJCXNldF9tZW1vcnlfd2IoYWRkciwgcGFnZXMpOwor CQlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCX0KKwlyZXR1cm4g MDsKK30KKworLyoqCisqIHNuZF9pbnRlbGhhZF9wY21fdHJpZ2dlciAtIHN0cmVhbSBhY3Rpdml0 aWVzIGFyZSBoYW5kbGVkIGhlcmUKKyogQHN1YnN0cmVhbTpzdWJzdHJlYW0gZm9yIHdoaWNoIHRo ZSBzdHJlYW0gZnVuY3Rpb24gaXMgY2FsbGVkCisqIEBjbWQ6dGhlIHN0cmVhbSBjb21tYW1kIHRo YXRzIHJlcXVlc3RlZCBmcm9tIHVwcGVyIGxheWVyCisqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVk IHdoZW5ldmVyIGFuIGEgc3RyZWFtIGFjdGl2aXR5IGlzIGludm9rZWQKKyovCitzdGF0aWMgaW50 IHNuZF9pbnRlbGhhZF9wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0 cmVhbSwKKwkJCQkJaW50IGNtZCkKK3sKKwlpbnQgY2FwcywgcmV0dmFsID0gMDsKKwl1bnNpZ25l ZCBsb25nIGZsYWdfaXJxOworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YTsKKwlz dHJ1Y3QgaGFkX3N0cmVhbV9wdnQgKnN0cmVhbTsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRf c3RyZWFtOworCisJcHJfZGVidWcoInNuZF9pbnRlbGhhZF9wY21fdHJpZ2dlciBjYWxsZWRcbiIp OworCisJaW50ZWxoYWRkYXRhID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwor CXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCWhhZF9zdHJlYW0g PSBpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBT TkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJcHJfZGVidWcoIlRyaWdnZXIgU3RhcnRcbiIpOwor CisJCS8qIERpc2FibGUgbG9jYWwgSU5UUnMgdGlsbCByZWdpc3RlciBwcmdtbmcgaXMgZG9uZSAq LworCQlpZiAoaGFkX2dldF9od3N0YXRlKGludGVsaGFkZGF0YSkpIHsKKwkJCXByX2VycigiX1NU QVJUOiBIRE1JIGNhYmxlIHBsdWdnZWQtb3V0XG4iKTsKKwkJCXJldHZhbCA9IC1FTk9ERVY7CisJ CQlicmVhazsKKwkJfQorCQlzdHJlYW0tPnN0cmVhbV9zdGF0dXMgPSBTVFJFQU1fUlVOTklORzsK KworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdf aXJxKTsKKwkJaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGUgPSBIQURfUlVOTklOR19TVFJFQU07CisJ CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFn X2lycSk7CisKKwkJLyogRW5hYmxlIEF1ZGlvICovCisJCS8qCisJCSAqIFRvRG86IE5lZWQgdG8g ZW5hYmxlIFVOREVSUlVOIGludGVycnVwdHMgYXMgd2VsbAorCQkgKiAgIGNhcHMgPSBIRE1JX0FV RElPX1VOREVSUlVOIHwgSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwkJICovCisJCWNhcHMgPSBI RE1JX0FVRElPX0JVRkZFUl9ET05FOworCQlyZXR2YWwgPSBoYWRfc2V0X2NhcHMoSEFEX1NFVF9F TkFCTEVfQVVESU9fSU5ULCAmY2Fwcyk7CisJCXJldHZhbCA9IGhhZF9zZXRfY2FwcyhIQURfU0VU X0VOQUJMRV9BVURJTywgTlVMTCk7CisJCWludGVsaGFkZGF0YS0+b3BzLT5lbmFibGVfYXVkaW8o c3Vic3RyZWFtLCAxKTsKKworCQlwcl9kZWJ1ZygiUHJvY2Vzc2VkIF9TdGFydFxuIik7CisKKwkJ YnJlYWs7CisKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXByX2RlYnVnKCJUcmln Z2VyIFN0b3BcbiIpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3Bp bmxvY2ssIGZsYWdfaXJxKTsKKwkJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5zdHJfaWQgPSAw OworCQlpbnRlbGhhZGRhdGEtPmN1cnJfYnVmID0gMDsKKworCQkvKiBTdG9wIHJlcG9ydGluZyBC VUZGRVJfRE9ORS9VTkRFUlJVTiB0byBhYm92ZSBsYXllcnMqLworCisJCWhhZF9zdHJlYW0tPnN0 cmVhbV90eXBlID0gSEFEX0lOSVQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFk ZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycSk7CisJCS8qIERpc2FibGUgQXVkaW8gKi8KKwkJ LyoKKwkJICogVG9EbzogTmVlZCB0byBkaXNhYmxlIFVOREVSUlVOIGludGVycnVwdHMgYXMgd2Vs bAorCQkgKiAgIGNhcHMgPSBIRE1JX0FVRElPX1VOREVSUlVOIHwgSERNSV9BVURJT19CVUZGRVJf RE9ORTsKKwkJICovCisJCWNhcHMgPSBIRE1JX0FVRElPX0JVRkZFUl9ET05FOworCQloYWRfc2V0 X2NhcHMoSEFEX1NFVF9ESVNBQkxFX0FVRElPX0lOVCwgJmNhcHMpOworCQlpbnRlbGhhZGRhdGEt Pm9wcy0+ZW5hYmxlX2F1ZGlvKHN1YnN0cmVhbSwgMCk7CisJCS8qIFJlc2V0IGJ1ZmZlciBwb2lu dGVycyAqLworCQlpbnRlbGhhZGRhdGEtPm9wcy0+cmVzZXRfYXVkaW8oMSk7CisJCWludGVsaGFk ZGF0YS0+b3BzLT5yZXNldF9hdWRpbygwKTsKKwkJc3RyZWFtLT5zdHJlYW1fc3RhdHVzID0gU1RS RUFNX0RST1BQRUQ7CisJCWhhZF9zZXRfY2FwcyhIQURfU0VUX0RJU0FCTEVfQVVESU8sIE5VTEwp OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHZhbCA9IC1FSU5WQUw7CisJfQorCXJldHVy biByZXR2YWw7Cit9CisKKy8qKgorKiBzbmRfaW50ZWxoYWRfcGNtX3ByZXBhcmUtIGludGVybmFs IHByZXBhcmF0aW9uIGJlZm9yZSBzdGFydGluZyBhIHN0cmVhbQorKgorKiBAc3Vic3RyZWFtOiAg c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkCisqCisqIFRoaXMgZnVu Y3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgc3RhcnRlZCBmb3IgaW50ZXJuYWwgcHJl cGFyYXRpb24uCisqLworc3RhdGljIGludCBzbmRfaW50ZWxoYWRfcGNtX3ByZXBhcmUoc3RydWN0 IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJaW50IHJldHZhbDsKKwl1MzIgZGlz cF9zYW1wX2ZyZXEsIG5fcGFyYW07CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRh OworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWU7CisJc3RydWN0IGhhZF9wdnRfZGF0 YSAqaGFkX3N0cmVhbTsKKworCXByX2RlYnVnKCJzbmRfaW50ZWxoYWRfcGNtX3ByZXBhcmUgY2Fs bGVkXG4iKTsKKworCWludGVsaGFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3Ry ZWFtKTsKKwlydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCWhhZF9zdHJlYW0gPSBpbnRl bGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKworCWlmIChoYWRfZ2V0X2h3c3RhdGUoaW50ZWxoYWRk YXRhKSkgeworCQlwcl9lcnIoIiVzOiBIRE1JIGNhYmxlIHBsdWdnZWQtb3V0XG4iLCBfX2Z1bmNf Xyk7CisJCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9ESVNDT05ORUNU RUQpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIHByZXBfZW5kOworCX0KKworCXByX2Rl YnVnKCJwZXJpb2Rfc2l6ZT0lZFxuIiwKKwkJKGludClmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwg cnVudGltZS0+cGVyaW9kX3NpemUpKTsKKwlwcl9kZWJ1ZygicGVyaW9kcz0lZFxuIiwgcnVudGlt ZS0+cGVyaW9kcyk7CisJcHJfZGVidWcoImJ1ZmZlcl9zaXplPSVkXG4iLCAoaW50KXNuZF9wY21f bGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pKTsKKwlwcl9kZWJ1ZygicmF0ZT0lZFxuIiwgcnVu dGltZS0+cmF0ZSk7CisJcHJfZGVidWcoImNoYW5uZWxzPSVkXG4iLCBydW50aW1lLT5jaGFubmVs cyk7CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5zdHJfaWQpIHsKKwkJcHJfZGVi dWcoIl9wcmVwYXJlIGlzIGNhbGxlZCBmb3IgZXhpc3Rpbmcgc3RyX2lkIyVkXG4iLAorCQkJCQlp bnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLnN0cl9pZCk7CisJCXJldHZhbCA9IHNuZF9pbnRlbGhh ZF9wY21fdHJpZ2dlcihzdWJzdHJlYW0sCisJCQkJCQlTTkRSVl9QQ01fVFJJR0dFUl9TVE9QKTsK KwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR2YWwgPSBzbmRfaW50ZWxoYWRfaW5pdF9zdHJl YW0oc3Vic3RyZWFtKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIHByZXBfZW5kOworCisKKwkvKiBH ZXQgTiB2YWx1ZSBpbiBLSHogKi8KKwlyZXR2YWwgPSBoYWRfZ2V0X2NhcHMoSEFEX0dFVF9ESVNQ TEFZX1JBVEUsICZkaXNwX3NhbXBfZnJlcSk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoInF1 ZXJ5aW5nIGRpc3BsYXkgc2FtcGxpbmcgZnJlcSBmYWlsZWQgJSN4XG4iLCByZXR2YWwpOworCQln b3RvIHByZXBfZW5kOworCX0KKworCWhhZF9nZXRfY2FwcyhIQURfR0VUX0VMRCwgJmludGVsaGFk ZGF0YS0+ZWVsZCk7CisKKwlyZXR2YWwgPSBpbnRlbGhhZGRhdGEtPm9wcy0+cHJvZ19uKHN1YnN0 cmVhbS0+cnVudGltZS0+cmF0ZSwgJm5fcGFyYW0sCisJCQkJCQkJCWludGVsaGFkZGF0YSk7CisJ aWYgKHJldHZhbCkgeworCQlwcl9lcnIoInByb2dyYW1taW5nIE4gdmFsdWUgZmFpbGVkICUjeFxu IiwgcmV0dmFsKTsKKwkJZ290byBwcmVwX2VuZDsKKwl9CisJaW50ZWxoYWRkYXRhLT5vcHMtPnBy b2dfY3RzKHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZSwKKwkJCQkJZGlzcF9zYW1wX2ZyZXEsIG5f cGFyYW0sIGludGVsaGFkZGF0YSk7CisKKwlpbnRlbGhhZGRhdGEtPm9wcy0+cHJvZ19kaXAoc3Vi c3RyZWFtLCBpbnRlbGhhZGRhdGEpOworCisJcmV0dmFsID0gaW50ZWxoYWRkYXRhLT5vcHMtPmF1 ZGlvX2N0cmwoc3Vic3RyZWFtLCBpbnRlbGhhZGRhdGEpOworCisJLyogUHJvZyBidWZmZXIgYWRk cmVzcyAqLworCXJldHZhbCA9IHNuZF9pbnRlbGhhZF9wcm9nX2J1ZmZlcihpbnRlbGhhZGRhdGEs CisJCQlIQURfQlVGX1RZUEVfQSwgSEFEX0JVRl9UWVBFX0QpOworCisJLyoKKwkgKiBQcm9ncmFt IGNoYW5uZWwgbWFwcGluZyBpbiBmb2xsb3dpbmcgb3JkZXI6CisJICogRkwsIEZSLCBDLCBMRkUs IFJMLCBSUgorCSAqLworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9CVUZfQ0hfU1dBUCwgU1dB UF9MRkVfQ0VOVEVSKTsKKworcHJlcF9lbmQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisg KiBzbmRfaW50ZWxoYWRfcGNtX3BvaW50ZXItIHRvIHNlbmQgdGhlIGN1cnJlbnQgYnVmZmVyIHBv aW50ZXJwcm9jZXNzZWQgYnkgaHcKKyAqCisgKiBAc3Vic3RyZWFtOiAgc3Vic3RyZWFtIGZvciB3 aGljaCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxs ZWQgYnkgQUxTQSBmcmFtZXdvcmsgdG8gZ2V0IHRoZSBjdXJyZW50IGh3IGJ1ZmZlciBwdHIKKyAq IHdoZW4gYSBwZXJpb2QgaXMgZWxhcHNlZAorICovCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qg c25kX2ludGVsaGFkX3BjbV9wb2ludGVyKAorCQkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0g KnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisJdTMy IGJ5dGVzX3JlbmRlcmVkID0gMDsKKworCS8qIHByX2RlYnVnKCJzbmRfaW50ZWxoYWRfcGNtX3Bv aW50ZXIgY2FsbGVkXG4iKTsgKi8KKworCWludGVsaGFkZGF0YSA9IHNuZF9wY21fc3Vic3RyZWFt X2NoaXAoc3Vic3RyZWFtKTsKKworCWlmIChpbnRlbGhhZGRhdGEtPmZsYWdfdW5kZXJydW4pIHsK KwkJaW50ZWxoYWRkYXRhLT5mbGFnX3VuZGVycnVuID0gMDsKKwkJcmV0dXJuIFNORFJWX1BDTV9Q T1NfWFJVTjsKKwl9CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5idWZmZXJfcmVu ZGVyZWQpCisJCWRpdl91NjRfcmVtKGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uYnVmZmVyX3Jl bmRlcmVkLAorCQkJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5yaW5nX2J1Zl9zaXplLAorCQkJ JihieXRlc19yZW5kZXJlZCkpOworCisJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5idWZmZXJf cHRyID0gYnl0ZXNfdG9fZnJhbWVzKAorCQkJCQkJc3Vic3RyZWFtLT5ydW50aW1lLAorCQkJCQkJ Ynl0ZXNfcmVuZGVyZWQpOworCXJldHVybiBpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmJ1ZmZl cl9wdHI7Cit9CisKKy8qKgorKiBzbmRfaW50ZWxoYWRfcGNtX21tYXAtIG1tYXBzIGEga2VybmVs IGJ1ZmZlciB0byB1c2VyIHNwYWNlIGZvciBjb3B5aW5nIGRhdGEKKyoKKyogQHN1YnN0cmVhbTog IHN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZAorKiBAdm1hOgkJc3Ry dWN0IGluc3RhbmNlIG9mIG1lbW9yeSBWTU0gbWVtb3J5IGFyZWEKKyoKKyogVGhpcyBmdW5jdGlv biBpcyBjYWxsZWQgYnkgT1Mgd2hlbiBhIHVzZXIgc3BhY2UgY29tcG9uZW50CisqIHRyaWVzIHRv IGdldCBtbWFwIG1lbW9yeSBmcm9tIGRyaXZlcgorKi8KK3N0YXRpYyBpbnQgc25kX2ludGVsaGFk X3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCB2 bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCisJcHJfZGVidWcoInNuZF9pbnRlbGhhZF9wY21fbW1h cCBjYWxsZWRcbiIpOworCisJcHJfZGVidWcoImVudHJ5IHdpdGggcHJvdDolc1xuIiwgX19mdW5j X18pOworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2Vf cHJvdCk7CisJcmV0dXJuIHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQlz dWJzdHJlYW0tPmRtYV9idWZmZXIuYWRkciA+PiBQQUdFX1NISUZULAorCQkJdm1hLT52bV9lbmQg LSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK2ludCBoZG1pX2F1ZGlv X21vZGVfY2hhbmdlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCWlu dCByZXR2YWwgPSAwOworCXUzMiBkaXNwX3NhbXBfZnJlcSwgbl9wYXJhbTsKKwlzdHJ1Y3Qgc25k X2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisKKwlpbnRlbGhhZGRhdGEgPSBzbmRfcGNtX3N1YnN0 cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwkvKiBEaXNhYmxlIEF1ZGlvICovCisJaW50ZWxoYWRk YXRhLT5vcHMtPmVuYWJsZV9hdWRpbyhzdWJzdHJlYW0sIDApOworCisJLyogVXBkYXRlIENUUyB2 YWx1ZSAqLworCXJldHZhbCA9IGhhZF9nZXRfY2FwcyhIQURfR0VUX0RJU1BMQVlfUkFURSwgJmRp c3Bfc2FtcF9mcmVxKTsKKwlpZiAocmV0dmFsKSB7CisJCXByX2VycigicXVlcnlpbmcgZGlzcGxh eSBzYW1wbGluZyBmcmVxIGZhaWxlZCAlI3hcbiIsIHJldHZhbCk7CisJCWdvdG8gb3V0OworCX0K KworCXJldHZhbCA9IGludGVsaGFkZGF0YS0+b3BzLT5wcm9nX24oc3Vic3RyZWFtLT5ydW50aW1l LT5yYXRlLCAmbl9wYXJhbSwKKwkJCQkJCQkJaW50ZWxoYWRkYXRhKTsKKwlpZiAocmV0dmFsKSB7 CisJCXByX2VycigicHJvZ3JhbW1pbmcgTiB2YWx1ZSBmYWlsZWQgJSN4XG4iLCByZXR2YWwpOwor CQlnb3RvIG91dDsKKwl9CisJaW50ZWxoYWRkYXRhLT5vcHMtPnByb2dfY3RzKHN1YnN0cmVhbS0+ cnVudGltZS0+cmF0ZSwKKwkJCQkJZGlzcF9zYW1wX2ZyZXEsIG5fcGFyYW0sIGludGVsaGFkZGF0 YSk7CisKKwkvKiBFbmFibGUgQXVkaW8gKi8KKwlpbnRlbGhhZGRhdGEtPm9wcy0+ZW5hYmxlX2F1 ZGlvKHN1YnN0cmVhbSwgMSk7CisKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKlBDTSBv cGVyYXRpb25zIHN0cnVjdHVyZSBhbmQgdGhlIGNhbGxzIGJhY2sgZm9yIHRoZSBzYW1lICovCitz dHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ludGVsaGFkX3BsYXliYWNrX29wcyA9IHsKKwkub3BlbiA9 CQlzbmRfaW50ZWxoYWRfb3BlbiwKKwkuY2xvc2UgPQlzbmRfaW50ZWxoYWRfY2xvc2UsCisJLmlv Y3RsID0Jc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcyA9CXNuZF9pbnRlbGhhZF9od19w YXJhbXMsCisJLmh3X2ZyZWUgPQlzbmRfaW50ZWxoYWRfaHdfZnJlZSwKKwkucHJlcGFyZSA9CXNu ZF9pbnRlbGhhZF9wY21fcHJlcGFyZSwKKwkudHJpZ2dlciA9CXNuZF9pbnRlbGhhZF9wY21fdHJp Z2dlciwKKwkucG9pbnRlciA9CXNuZF9pbnRlbGhhZF9wY21fcG9pbnRlciwKKwkubW1hcCA9CXNu ZF9pbnRlbGhhZF9wY21fbW1hcCwKK307CisKKy8qKgorICogc25kX2ludGVsaGFkX2NyZWF0ZSAt IHRvIGNyZXRlIGFsc2EgY2FyZCBpbnN0YW5jZQorICoKKyAqIEBpbnRlbGhhZGRhdGE6IHBvaW50 ZXIgdG8gaW50ZXJuYWwgY29udGV4dAorICogQGNhcmQ6IHBvaW50ZXIgdG8gY2FyZAorICoKKyAq IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGhkbWkgY2FibGUgaXMgcGx1Z2dlZCBp bgorICovCitzdGF0aWMgaW50IHNuZF9pbnRlbGhhZF9jcmVhdGUoCisJCXN0cnVjdCBzbmRfaW50 ZWxoYWQgKmludGVsaGFkZGF0YSwKKwkJc3RydWN0IHNuZF9jYXJkICpjYXJkKQoreworCWludCBy ZXR2YWw7CisJc3RhdGljIHN0cnVjdCBzbmRfZGV2aWNlX29wcyBvcHMgPSB7CisJfTsKKworCXBy X2RlYnVnKCJzbmRfaW50ZWxoYWRfY3JlYXRlIGNhbGxlZFxuIik7CisKKwlCVUdfT04oIWludGVs aGFkZGF0YSk7CisJLyogQUxTQSBhcGkgdG8gcmVnaXN0ZXIgdGhlIGRldmljZSAqLworCXJldHZh bCA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9MT1dMRVZFTCwgaW50ZWxoYWRkYXRh LCAmb3BzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorLyoqCisgKiBzbmRfaW50ZWxoYWRfcGNtX2Zy ZWUgLSB0byBmcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkCisgKgorICogQHBjbTogcG9pbnRlciB0 byBwY20gaW5zdGFuY2UKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGRldmlj ZSBpcyByZW1vdmVkCisgKi8KK3N0YXRpYyB2b2lkIHNuZF9pbnRlbGhhZF9wY21fZnJlZShzdHJ1 Y3Qgc25kX3BjbSAqcGNtKQoreworCXByX2RlYnVnKCJGcmVlaW5nIFBDTSBwcmVhbGxvY2F0ZWQg cGFnZXNcbiIpOworCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbChwY20pOwor fQorCitzdGF0aWMgaW50IGhhZF9pZWM5NThfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29u dHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50 eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JRUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYWRfaWVjOTU4X2dldChzdHJ1Y3Qgc25kX2tjb250 cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkK K3sKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBzbmRfa2NvbnRyb2xfY2hp cChrY29udHJvbCk7CisKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IChpbnRl bGhhZGRhdGEtPmFlc19iaXRzID4+IDApICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4 LnN0YXR1c1sxXSA9IChpbnRlbGhhZGRhdGEtPmFlc19iaXRzID4+IDgpICYgMHhmZjsKKwl1Y29u dHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1syXSA9CisJCQkJCShpbnRlbGhhZGRhdGEtPmFlc19i aXRzID4+IDE2KSAmIDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPQor CQkJCQkoaW50ZWxoYWRkYXRhLT5hZXNfYml0cyA+PiAyNCkgJiAweGZmOworCXJldHVybiAwOwor fQorc3RhdGljIGludCBoYWRfaWVjOTU4X21hc2tfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtj b250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVj b250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUu aWVjOTU4LnN0YXR1c1sxXSA9IDB4ZmY7CisJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNb Ml0gPSAweGZmOworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzNdID0gMHhmZjsKKwly ZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgaGFkX2llYzk1OF9wdXQoc3RydWN0IHNuZF9rY29udHJv bCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7 CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEg PSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwlwcl9kZWJ1ZygiZW50ZXJlZCBoYWRf aWVjOTU4X3B1dFxuIik7CisJdmFsID0gKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBd IDw8IDApIHwKKwkJKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzFdIDw8IDgpIHwKKwkJ KHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzJdIDw8IDE2KSB8CisJCSh1Y29udHJvbC0+ dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA8PCAyNCk7CisJaWYgKGludGVsaGFkZGF0YS0+YWVzX2Jp dHMgIT0gdmFsKSB7CisJCWludGVsaGFkZGF0YS0+YWVzX2JpdHMgPSB2YWw7CisJCXJldHVybiAx OworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhh ZF9jb250cm9sX2llYzk1OF9tYXNrID0geworCS5hY2Nlc3MgPSAgIFNORFJWX0NUTF9FTEVNX0FD Q0VTU19SRUFELAorCS5pZmFjZSA9ICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFt ZSA9ICAgICBTTkRSVl9DVExfTkFNRV9JRUM5NTgoIiIsIFBMQVlCQUNLLCBNQVNLKSwKKwkuaW5m byA9ICAgICBoYWRfaWVjOTU4X2luZm8sIC8qIHNoYXJlZCAqLworCS5nZXQgPSAgICAgIGhhZF9p ZWM5NThfbWFza19nZXQsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGFk X2NvbnRyb2xfaWVjOTU4ID0geworCS5pZmFjZSA9ICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX1BD TSwKKwkubmFtZSA9ICAgICAgICAgU05EUlZfQ1RMX05BTUVfSUVDOTU4KCIiLCBQTEFZQkFDSywg REVGQVVMVCksCisJLmluZm8gPSAgICAgICAgIGhhZF9pZWM5NThfaW5mbywKKwkuZ2V0ID0gICAg ICAgICAgaGFkX2llYzk1OF9nZXQsCisJLnB1dCA9ICAgICAgICAgIGhhZF9pZWM5NThfcHV0Cit9 OworCitzdGF0aWMgc3RydWN0IHNuZF9pbnRlbF9oYWRfaW50ZXJmYWNlIGhhZF9pbnRlcmZhY2Ug PSB7CisJLm5hbWUgPSAgICAgICAgICJoZG1pLWF1ZGlvIiwKKwkucXVlcnkgPSAgICAgICAgaGRt aV9hdWRpb19xdWVyeSwKKwkuc3VzcGVuZCA9ICAgICAgaGRtaV9hdWRpb19zdXNwZW5kLAorCS5y ZXN1bWUgPSAgICAgICBoZG1pX2F1ZGlvX3Jlc3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGFk X29wcyBoYWRfb3BzX3YxID0geworCS5lbmFibGVfYXVkaW8gPSBzbmRfaW50ZWxoYWRfZW5hYmxl X2F1ZGlvX3YxLAorCS5yZXNldF9hdWRpbyA9IHNuZF9pbnRlbGhhZF9yZXNldF9hdWRpb192MSwK KwkucHJvZ19uID0Jc25kX2ludGVsaGFkX3Byb2dfbl92MSwKKwkucHJvZ19jdHMgPQlzbmRfaW50 ZWxoYWRfcHJvZ19jdHNfdjEsCisJLmF1ZGlvX2N0cmwgPQlzbmRfaW50ZWxoYWRfcHJvZ19hdWRp b19jdHJsX3YxLAorCS5wcm9nX2RpcCA9CXNuZF9pbnRlbGhhZF9wcm9nX2RpcF92MSwKKwkuaGFu ZGxlX3VuZGVycnVuID0gIGhhZF9jbGVhcl91bmRlcnJ1bl9pbnRyX3YxLAorfTsKKworc3RhdGlj IHN0cnVjdCBoYWRfb3BzIGhhZF9vcHNfdjIgPSB7CisJLmVuYWJsZV9hdWRpbyA9IHNuZF9pbnRl bGhhZF9lbmFibGVfYXVkaW9fdjIsCisJLnJlc2V0X2F1ZGlvID0gc25kX2ludGVsaGFkX3Jlc2V0 X2F1ZGlvX3YyLAorCS5wcm9nX24gPQlzbmRfaW50ZWxoYWRfcHJvZ19uX3YyLAorCS5wcm9nX2N0 cyA9CXNuZF9pbnRlbGhhZF9wcm9nX2N0c192MiwKKwkuYXVkaW9fY3RybCA9CXNuZF9pbnRlbGhh ZF9wcm9nX2F1ZGlvX2N0cmxfdjIsCisJLnByb2dfZGlwID0Jc25kX2ludGVsaGFkX3Byb2dfZGlw X3YyLAorCS5oYW5kbGVfdW5kZXJydW4gPSBoYWRfY2xlYXJfdW5kZXJydW5faW50cl92MiwKK307 CisvKioKKyAqIGhkbWlfYXVkaW9fcHJvYmUgLSB0byBjcmVhdGUgc291bmQgY2FyZCBpbnN0YW5j ZSBmb3IgSERNSSBhdWRpbyBwbGF5YWJjaworICoKKyAqQGhhZGRhdGE6IHBvaW50ZXIgdG8gSEFE IHByaXZhdGUgZGF0YQorICpAY2FyZF9pZDogY2FyZCBmb3Igd2hpY2ggcHJvYmUgaXMgY2FsbGVk CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgaGRtaSBjYWJsZSBpcyBw bHVnZ2VkIGluLiBUaGlzIGZ1bmN0aW9uCisgKiBjcmVhdGVzIGFuZCByZWdpc3RlcnMgdGhlIHNv dW5kIGNhcmQgd2l0aCBBTFNBCisgKi8KK2ludCBoZG1pX2F1ZGlvX3Byb2JlKHZvaWQgKmRldmlj ZXB0cikKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBzbmRfcGNtICpwY207CisJc3RydWN0IHNu ZF9jYXJkICpjYXJkOworCXN0cnVjdCBoYWRfY2FsbGJhY2tfb3BzIG9wc19jYjsKKwlzdHJ1Y3Qg c25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0 cmVhbTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZwdHIgPSBkZXZpY2VwdHI7CisKKwlw cl9kZWJ1ZygiRW50ZXIgJXNcbiIsIF9fZnVuY19fKTsKKworCXByX2RlYnVnKCJoZG1pX2F1ZGlv X3Byb2JlIGRtYV9tYXNrOiAlcFxuIiwgZGV2cHRyLT5kZXYuZG1hX21hc2spOworCisJLyogYWxs b2NhdGUgbWVtb3J5IGZvciBzYXZpbmcgaW50ZXJuYWwgY29udGV4dCBhbmQgd29ya2luZyAqLwor CWludGVsaGFkZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCppbnRlbGhhZGRhdGEpLCBHRlBfS0VSTkVM KTsKKwlpZiAoIWludGVsaGFkZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloYWRfc3RyZWFt ID0ga3phbGxvYyhzaXplb2YoKmhhZF9zdHJlYW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhhZF9z dHJlYW0pIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBmcmVlX2hhZGRhdGE7CisJfQor CisJaGFkX2RhdGEgPSBpbnRlbGhhZGRhdGE7CisJb3BzX2NiLmludGVsX2hhZF9ldmVudF9jYWxs X2JhY2sgPSBoYWRfZXZlbnRfaGFuZGxlcjsKKworCS8qIHJlZ2lzdGVyaW5nIHdpdGggZGlzcGxh eSBkcml2ZXIgdG8gZ2V0IGFjY2VzcyB0byBkaXNwbGF5IEFQSXMgKi8KKworCXJldHZhbCA9IG1p ZF9oZG1pX2F1ZGlvX3NldHVwKAorCQkJb3BzX2NiLmludGVsX2hhZF9ldmVudF9jYWxsX2JhY2ss CisJCQkmKGludGVsaGFkZGF0YS0+cmVnX29wcyksCisJCQkmKGludGVsaGFkZGF0YS0+cXVlcnlf b3BzKSk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoInF1ZXJ5aW5nIGRpc3BsYXkgZHJpdmVy IEFQSXMgZmFpbGVkICUjeFxuIiwgcmV0dmFsKTsKKwkJZ290byBmcmVlX2hhZHN0cmVhbTsKKwl9 CisJbXV0ZXhfbG9jaygmaGFkX211dGV4KTsKKwlzcGluX2xvY2tfaW5pdCgmaW50ZWxoYWRkYXRh LT5oYWRfc3BpbmxvY2spOworCWludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9IEhBRF9EUlZfRElT Q09OTkVDVEVEOworCXByX2RlYnVnKCIlcyBAICVkOkRFQlVHIFBMVUcvVU5QTFVHIDogSEFEX0RS Vl9ESVNDT05ORUNURURcbiIsCisJCQlfX2Z1bmNfXywgX19MSU5FX18pOworCisJLyogY3JlYXRl IGEgY2FyZCBpbnN0YW5jZSB3aXRoIEFMU0EgZnJhbWV3b3JrICovCisJcmV0dmFsID0gc25kX2Nh cmRfbmV3KCZkZXZwdHItPmRldiwgaGRtaV9jYXJkX2luZGV4LCBoZG1pX2NhcmRfaWQsCisJCQkJ VEhJU19NT0RVTEUsIDAsICZjYXJkKTsKKworCWlmIChyZXR2YWwpCisJCWdvdG8gdW5sb2NrX211 dGV4OworCWludGVsaGFkZGF0YS0+Y2FyZCA9IGNhcmQ7CisJaW50ZWxoYWRkYXRhLT5jYXJkX2lk ID0gaGRtaV9jYXJkX2lkOworCWludGVsaGFkZGF0YS0+Y2FyZF9pbmRleCA9IGNhcmQtPm51bWJl cjsKKwlpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YSA9IGhhZF9zdHJlYW07CisJaW50ZWxoYWRk YXRhLT5mbGFnX3VuZGVycnVuID0gMDsKKwlpbnRlbGhhZGRhdGEtPmFlc19iaXRzID0gU05EUlZf UENNX0RFRkFVTFRfQ09OX1NQRElGOworCXN0cm5jcHkoY2FyZC0+ZHJpdmVyLCBJTlRFTF9IQUQs IHN0cmxlbihJTlRFTF9IQUQpKTsKKwlzdHJuY3B5KGNhcmQtPnNob3J0bmFtZSwgSU5URUxfSEFE LCBzdHJsZW4oSU5URUxfSEFEKSk7CisKKwlyZXR2YWwgPSBzbmRfcGNtX25ldyhjYXJkLCBJTlRF TF9IQUQsIFBDTV9JTkRFWCwgTUFYX1BCX1NUUkVBTVMsCisJCQkJCQlNQVhfQ0FQX1NUUkVBTVMs ICZwY20pOworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyOworCisJLyogc2V0dXAgcHJpdmF0ZSBk YXRhIHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgd2hlbiByZXF1aXJlZCAqLworCXBjbS0+cHJpdmF0 ZV9kYXRhID0gaW50ZWxoYWRkYXRhOworCXBjbS0+cHJpdmF0ZV9mcmVlID0gc25kX2ludGVsaGFk X3BjbV9mcmVlOworCXBjbS0+aW5mb19mbGFncyA9IDA7CisJc3RybmNweShwY20tPm5hbWUsIGNh cmQtPnNob3J0bmFtZSwgc3RybGVuKGNhcmQtPnNob3J0bmFtZSkpOworCS8qIHNldHVwIHRoZSBv cHMgZm9yIHBhbHlhYmNrICovCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVB TV9QTEFZQkFDSywKKwkJCSAgICAmc25kX2ludGVsaGFkX3BsYXliYWNrX29wcyk7CisJLyogYWxs b2NhdGUgZG1hIHBhZ2VzIGZvciBBTFNBIHN0cmVhbSBvcGVyYXRpb25zCisJICogbWVtb3J5IGFs bG9jYXRlZCBpcyBiYXNlZCBvbiBzaXplLCBub3QgbWF4IHZhbHVlCisJICogdGh1cyB1c2luZyBz YW1lIGFyZ3VtZW50IGZvciBtYXggJiBzaXplCisJICovCisJcmV0dmFsID0gc25kX3BjbV9saWJf cHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sCisJCQlTTkRSVl9ETUFfVFlQRV9ERVYsIE5V TEwsCisJCQlIQURfTUFYX0JVRkZFUiwgSEFEX01BWF9CVUZGRVIpOworCisJaWYgKGNhcmQtPmRl diA9PSBOVUxMKQorCQlwcl9kZWJ1ZygiY2FyZC0+ZGV2IGlzIE5VTEwhISEhISBTaG91bGQgbm90 IGJlIHRoaXMgY2FzZVxuIik7CisJZWxzZSBpZiAoY2FyZC0+ZGV2LT5kbWFfbWFzayA9PSBOVUxM KQorCQlwcl9kZWJ1ZygiaGRtaV9hdWRpb19wcm9iZSBkbWFfbWFzayBpcyBOVUxMISEhISFcbiIp OworCWVsc2UKKwkJcHJfZGVidWcoImhkbWlfYXVkaW9fcHJvYmUgZG1hX21hc2sgaXMgOiAlcFxu IiwKKwkJCQljYXJkLT5kZXYtPmRtYV9tYXNrKTsKKworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJy OworCisJLyogaW50ZXJuYWwgZnVuY3Rpb24gY2FsbCB0byByZWdpc3RlciBkZXZpY2Ugd2l0aCBB TFNBICovCisJcmV0dmFsID0gc25kX2ludGVsaGFkX2NyZWF0ZShpbnRlbGhhZGRhdGEsIGNhcmQp OworCWlmIChyZXR2YWwpCisJCWdvdG8gZXJyOworCisJY2FyZC0+cHJpdmF0ZV9kYXRhID0gJmlu dGVsaGFkZGF0YTsKKwlyZXR2YWwgPSBzbmRfY2FyZF9yZWdpc3RlcihjYXJkKTsKKwlpZiAocmV0 dmFsKQorCQlnb3RvIGVycjsKKworCS8qIElFQzk1OCBjb250cm9scyAqLworCXJldHZhbCA9IHNu ZF9jdGxfYWRkKGNhcmQsIHNuZF9jdGxfbmV3MSgmaGFkX2NvbnRyb2xfaWVjOTU4X21hc2ssCisJ CQkJCQlpbnRlbGhhZGRhdGEpKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlcnI7CisJcmV0 dmFsID0gc25kX2N0bF9hZGQoY2FyZCwgc25kX2N0bF9uZXcxKCZoYWRfY29udHJvbF9pZWM5NTgs CisJCQkJCQlpbnRlbGhhZGRhdGEpKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBlcnI7CisK Kwlpbml0X2NoYW5uZWxfYWxsb2NhdGlvbnMoKTsKKworCS8qIFJlZ2lzdGVyIGNoYW5uZWwgbWFw IGNvbnRyb2xzICovCisJcmV0dmFsID0gaGFkX3JlZ2lzdGVyX2NobWFwX2N0bHMoaW50ZWxoYWRk YXRhLCBwY20pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycjsKKworCWludGVsaGFkZGF0 YS0+ZGV2ID0gJmRldnB0ci0+ZGV2OworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShpbnRlbGhhZGRh dGEtPmRldik7CisJcG1fcnVudGltZV9lbmFibGUoaW50ZWxoYWRkYXRhLT5kZXYpOworCisJbXV0 ZXhfdW5sb2NrKCZoYWRfbXV0ZXgpOworCXJldHZhbCA9IG1pZF9oZG1pX2F1ZGlvX3JlZ2lzdGVy KCZoYWRfaW50ZXJmYWNlLCBpbnRlbGhhZGRhdGEpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJy KCJyZWdpc3RlcmluZyB3aXRoIGRpc3BsYXkgZHJpdmVyIGZhaWxlZCAlI3hcbiIsIHJldHZhbCk7 CisJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CisJCWdvdG8gZnJlZV9oYWRzdHJlYW07CisJfQorCisJ aW50ZWxoYWRkYXRhLT5od19zaWxlbmNlID0gMTsKKwloYWRfb3BzX3YxID0gaGFkX29wc192MTsJ LyogdW51c2VkICovCisJaW50ZWxoYWRkYXRhLT5vcHMgPSAmaGFkX29wc192MjsKKworCXJldHVy biByZXR2YWw7CitlcnI6CisJc25kX2NhcmRfZnJlZShjYXJkKTsKK3VubG9ja19tdXRleDoKKwlt dXRleF91bmxvY2soJmhhZF9tdXRleCk7CitmcmVlX2hhZHN0cmVhbToKKwlrZnJlZShoYWRfc3Ry ZWFtKTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoaW50ZWxoYWRkYXRhLT5kZXYpOworCWludGVsaGFk ZGF0YS0+ZGV2ID0gTlVMTDsKK2ZyZWVfaGFkZGF0YToKKwlrZnJlZShpbnRlbGhhZGRhdGEpOwor CWludGVsaGFkZGF0YSA9IE5VTEw7CisJcHJfZXJyKCJFcnJvciByZXR1cm5lZCBmcm9tICVzIGFw aSAlI3hcbiIsIF9fZnVuY19fLCByZXR2YWwpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgor ICogaGRtaV9hdWRpb19yZW1vdmUgLSByZW1vdmVzIHRoZSBhbHNhIGNhcmQKKyAqCisgKkBoYWRk YXRhOiBwb2ludGVyIHRvIEhBRCBwcml2YXRlIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlz IGNhbGxlZCB3aGVuIHRoZSBoZG1pIGNhYmxlIGlzIHVuLXBsdWdnZWQuIFRoaXMgZnVuY3Rpb24K KyAqIGZyZWUgdGhlIHNvdW5kIGNhcmQuCisgKi8KK2ludCBoZG1pX2F1ZGlvX3JlbW92ZSh2b2lk ICpwZGV2cHRyKQoreworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IGhhZF9k YXRhOworCWludCBjYXBzOworCisJcHJfZGVidWcoIkVudGVyICVzXG4iLCBfX2Z1bmNfXyk7CisK KwlpZiAoIWludGVsaGFkZGF0YSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5k cnZfc3RhdHVzICE9IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7CisJCWNhcHMgPSBIRE1JX0FVRElP X1VOREVSUlVOIHwgSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwkJaGFkX3NldF9jYXBzKEhBRF9T RVRfRElTQUJMRV9BVURJT19JTlQsICZjYXBzKTsKKwkJaGFkX3NldF9jYXBzKEhBRF9TRVRfRElT QUJMRV9BVURJTywgTlVMTCk7CisJfQorCXNuZF9jYXJkX2ZyZWUoaW50ZWxoYWRkYXRhLT5jYXJk KTsKKwlrZnJlZShpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YSk7CisJa2ZyZWUoaW50ZWxoYWRk YXRhKTsKKwlyZXR1cm4gMDsKK30KKworTU9EVUxFX0FVVEhPUigiU2FpbGFqYSBCYW5kYXJ1cGFs bGkgPHNhaWxhamEuYmFuZGFydXBhbGxpQGludGVsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlJh bWVzaCBCYWJ1IEsgViA8cmFtZXNoLmJhYnVAaW50ZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigi VmFpYmhhdiBBZ2Fyd2FsIDx2YWliaGF2LmFnYXJ3YWxAaW50ZWwuY29tPiIpOworTU9EVUxFX0FV VEhPUigiSmVyb21lIEFuYW5kIDxqZXJvbWUuYW5hbmRAaW50ZWwuY29tPiIpOworTU9EVUxFX0RF U0NSSVBUSU9OKCJJbnRlbCBIRE1JIEF1ZGlvIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQ TCB2MiIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIntJbnRlbCxJbnRlbF9IQUR9Iik7CitN T0RVTEVfVkVSU0lPTihIQURfRFJJVkVSX1ZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvc291bmQveDg2 L2ludGVsX2hkbWlfYXVkaW8uaCBiL3NvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvLmgKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmMjViNgotLS0gL2Rldi9udWxsCisrKyBi L3NvdW5kL3g4Ni9pbnRlbF9oZG1pX2F1ZGlvLmgKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBD b3B5cmlnaHQgKEMpIDIwMTYgSW50ZWwgQ29ycG9yYXRpb24KKyAqICBBdXRob3JzOglTYWlsYWph IEJhbmRhcnVwYWxsaSA8c2FpbGFqYS5iYW5kYXJ1cGFsbGlAaW50ZWwuY29tPgorICoJCVJhbWVz aCBCYWJ1IEsgVgk8cmFtZXNoLmJhYnVAaW50ZWwuY29tPgorICoJCVZhaWJoYXYgQWdhcndhbCA8 dmFpYmhhdi5hZ2Fyd2FsQGludGVsLmNvbT4KKyAqCQlKZXJvbWUgQW5hbmQgPGplcm9tZS5hbmFu ZEBpbnRlbC5jb20+CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBv ZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0 d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzCisgKiAodGhlICJTb2Z0d2Fy ZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLAorICogaW5j bHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5 LCBtZXJnZSwKKyAqIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxs IGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hv bSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLAorICogc3ViamVjdCB0byB0aGUg Zm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2Ug YW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKKyAqIG5leHQgcGFyYWdy YXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsCisgKiBw b3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVE ICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElN UExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAq IE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisg KiBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZ UklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RI RVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQg T1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBX SVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICog U09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBfSU5URUxfSERNSV9BVURJT19IXworI2RlZmluZSBf SU5URUxfSERNSV9BVURJT19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRl IDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUg PGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxzb3VuZC9hc291bmRlZi5oPgorI2luY2x1 ZGUgPHNvdW5kL2NvbnRyb2wuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlICJp bnRlbF9oZG1pX2xwZV9hdWRpby5oIgorCisjZGVmaW5lIFBDTV9JTkRFWAkJMAorI2RlZmluZSBN QVhfUEJfU1RSRUFNUwkJMQorI2RlZmluZSBNQVhfQ0FQX1NUUkVBTVMJCTAKKyNkZWZpbmUgSERN SV9BVURJT19EUklWRVIJImhkbWktYXVkaW8iCisKKyNkZWZpbmUgSU5GT19GUkFNRV9XT1JEMQkw eDAwMGEwMTg0CisjZGVmaW5lIEZJRk9fVEhSRVNIT0xECQkweEZFCisjZGVmaW5lIERNQV9GSUZP X1RIUkVTSE9MRAkweDcKKyNkZWZpbmUgQllURVNfUEVSX1dPUkQJCTB4NAorCisvKiBTYW1wbGlu ZyByYXRlIGFzIHBlciBJRUM2MDk1OCBWZXIgMyAqLworI2RlZmluZSBDSF9TVEFUVVNfTUFQXzMy S0haCTB4MworI2RlZmluZSBDSF9TVEFUVVNfTUFQXzQ0S0haCTB4MAorI2RlZmluZSBDSF9TVEFU VVNfTUFQXzQ4S0haCTB4MgorI2RlZmluZSBDSF9TVEFUVVNfTUFQXzg4S0haCTB4OAorI2RlZmlu ZSBDSF9TVEFUVVNfTUFQXzk2S0haCTB4QQorI2RlZmluZSBDSF9TVEFUVVNfTUFQXzE3NktIWgkw eEMKKyNkZWZpbmUgQ0hfU1RBVFVTX01BUF8xOTJLSFoJMHhFCisKKyNkZWZpbmUgTUFYX1NNUExf V0lEVEhfMjAJMHgwCisjZGVmaW5lIE1BWF9TTVBMX1dJRFRIXzI0CTB4MQorI2RlZmluZSBTTVBM X1dJRFRIXzE2QklUUwkweDEKKyNkZWZpbmUgU01QTF9XSURUSF8yNEJJVFMJMHg1CisjZGVmaW5l IENIQU5ORUxfQUxMT0NBVElPTgkweDFGCisjZGVmaW5lIE1BU0tfQllURTAJCTB4MDAwMDAwRkYK KyNkZWZpbmUgVkFMSURfRElQX1dPUkRTCQkzCisjZGVmaW5lIExBWU9VVDAJCQkwCisjZGVmaW5l IExBWU9VVDEJCQkxCisjZGVmaW5lIFNXQVBfTEZFX0NFTlRFUgkJMHgwMGZhYzRjOAorI2RlZmlu ZSBBVURfQ09ORklHX0NIX01BU0tfVjIJMHg3MAorCitzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvIHsK KwlpbnQJCXN0cl9pZDsKKwl2b2lkCSpoYWRfc3Vic3RyZWFtOworCXZvaWQJKCpwZXJpb2RfZWxh cHNlZCkodm9pZCAqaGFkX3N1YnN0cmVhbSk7CisJdTMyCQlidWZmZXJfcHRyOworCXU2NAkJYnVm ZmVyX3JlbmRlcmVkOworCXUzMgkJcmluZ19idWZfc2l6ZTsKKwlpbnQJCXNmcmVxOworfTsKKwor c3RydWN0IHJpbmdfYnVmX2luZm8geworCXVpbnQzMl90CWJ1Zl9hZGRyOworCXVpbnQzMl90CWJ1 Zl9zaXplOworCXVpbnQ4X3QJCWlzX3ZhbGlkOworfTsKKworc3RydWN0IGhhZF9zdHJlYW1fcHZ0 IHsKKwllbnVtIGhhZF9zdHJlYW1fc3RhdHVzCQlzdHJlYW1fc3RhdHVzOworCWludAkJCQlzdHJl YW1fb3BzOworCXNzaXplX3QJCQkJZGJnX2N1bV9ieXRlczsKK307CisKK3N0cnVjdCBoYWRfcHZ0 X2RhdGEgeworCWVudW0gaGFkX3N0YXR1c19zdHJlYW0JCXN0cmVhbV90eXBlOworfTsKKworc3Ry dWN0IGhhZF9jYWxsYmFja19vcHMgeworCWhhZF9ldmVudF9jYWxsX2JhY2sgaW50ZWxfaGFkX2V2 ZW50X2NhbGxfYmFjazsKK307CisKKy8qKgorICogc3RydWN0IHNuZF9pbnRlbGhhZCAtIGludGVs aGFkIGRyaXZlciBzdHJ1Y3R1cmUKKyAqCisgKiBAY2FyZDogcHRyIHRvIGhvbGQgY2FyZCBkZXRh aWxzCisgKiBAY2FyZF9pbmRleDogc291bmQgY2FyZCBpbmRleAorICogQGNhcmRfaWQ6IGRldGVj dGVkIHNvdW5kIGNhcmQgaWQKKyAqIEByZWdfb3BzOiByZWdpc3RlciBvcGVyYXRpb25zIHRvIHBy b2dyYW0gcmVnaXN0ZXJzCisgKiBAcXVlcnlfb3BzOiBjYXBzIGNhbGwgYmFja3MgZm9yIGdldC9z ZXQgb3BlcmF0aW9ucworICogQGRydl9zdGF0dXM6IGRyaXZlciBzdGF0dXMKKyAqIEBidWZfaW5m bzogcmluZyBidWZmZXIgaW5mbworICogQHN0cmVhbV9pbmZvOiBzdHJlYW0gaW5mb3JtYXRpb24K KyAqIEBlZWxkOiBob2xkcyBFRUxEIGluZm8KKyAqIEBjdXJyX2J1ZjogcG9pbnRlciB0byBob2xk IGN1cnJlbnQgYWN0aXZlIHJpbmcgYnVmCisgKiBAdmFsaWRfYnVmX2NudDogcmluZyBidWZmZXIg Y291bnQgZm9yIHN0cmVhbQorICogQGhhZF9zcGlubG9jazogZHJpdmVyIGxvY2sKKyAqIEBhZXNf Yml0czogSUVDOTU4IHN0YXR1cyBiaXRzCisgKiBAYnVmZl9kb25lOiBpZCBvZiBjdXJyZW50IGJ1 ZmZlciBkb25lIGludHIKKyAqIEBkZXY6IHBsYXRvZm9ybSBkZXZpY2UgaGFuZGxlCisgKiBAa2N0 bDogaG9sZHMga2N0bCBwdHJzIHVzZWQgZm9yIGNoYW5uZWwgbWFwCisgKiBAY2htYXA6IGhvbGRz IGNoYW5uZWwgbWFwIGluZm8KKyAqIEBhdWRpb19yZWdfYmFzZTogaGRtaSBhdWRpbyByZWdpc3Rl ciBiYXNlIG9mZnNldAorICogQGh3X3NpbGVuY2U6IGZsYWcgaW5kaWNhdGVzIFNvQyBzdXBwb3J0 IGZvciBIVyBzaWxlbmNlL0tlZXAgYWxpdmUKKyAqIEBvcHM6IGhvbGRzIG9wcyBmdW5jdGlvbnMg YmFzZWQgb24gcGxhdGZvcm0KKyAqLworc3RydWN0IHNuZF9pbnRlbGhhZCB7CisJc3RydWN0IHNu ZF9jYXJkCSpjYXJkOworCWludAkJY2FyZF9pbmRleDsKKwljaGFyCQkqY2FyZF9pZDsKKwlzdHJ1 Y3QgaGRtaV9hdWRpb19yZWdpc3RlcnNfb3BzCXJlZ19vcHM7CisJc3RydWN0IGhkbWlfYXVkaW9f cXVlcnlfc2V0X29wcwlxdWVyeV9vcHM7CisJZW51bSBoYWRfZHJ2X3N0YXR1cwlkcnZfc3RhdHVz OworCXN0cnVjdAkJcmluZ19idWZfaW5mbyBidWZfaW5mb1tIQURfTlVNX09GX1JJTkdfQlVGU107 CisJc3RydWN0CQlwY21fc3RyZWFtX2luZm8gc3RyZWFtX2luZm87CisJdW5pb24gb3RtX2hkbWlf ZWxkX3QJZWVsZDsKKwllbnVtCQlpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIGN1cnJfYnVmOworCWlu dAkJdmFsaWRfYnVmX2NudDsKKwl1bnNpZ25lZCBpbnQJYWVzX2JpdHM7CisJaW50IGZsYWdfdW5k ZXJydW47CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqcHJpdmF0ZV9kYXRhOworCXNwaW5sb2NrX3Qg aGFkX3NwaW5sb2NrOworCWVudW0JCWludGVsX2hhZF9hdWRfYnVmX3R5cGUgYnVmZl9kb25lOwor CXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOworCXN0cnVj dCBzbmRfcGNtX2NobWFwICpjaG1hcDsKKwl1bnNpZ25lZCBpbnQJKmF1ZGlvX3JlZ19iYXNlOwor CXVuc2lnbmVkIGludAlhdWRpb19jZmdfb2Zmc2V0OworCWJvb2wJCWh3X3NpbGVuY2U7CisJc3Ry dWN0IGhhZF9vcHMJKm9wczsKK307CisKK3N0cnVjdCBoYWRfb3BzIHsKKwl2b2lkICgqZW5hYmxl X2F1ZGlvKShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCXU4IGVuYWJs ZSk7CisJdm9pZCAoKnJlc2V0X2F1ZGlvKSh1OCByZXNldCk7CisJaW50ICgqcHJvZ19uKSh1MzIg YXVkX3NhbXBfZnJlcSwgdTMyICpuX3BhcmFtLAorCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50 ZWxoYWRkYXRhKTsKKwl2b2lkICgqcHJvZ19jdHMpKHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgdG1k cywgdTMyIG5fcGFyYW0sCisJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpOwor CWludCAoKmF1ZGlvX2N0cmwpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAor CQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSk7CisJdm9pZCAoKnByb2dfZGlw KShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX2lu dGVsaGFkICppbnRlbGhhZGRhdGEpOworCXZvaWQgKCpoYW5kbGVfdW5kZXJydW4pKHN0cnVjdCBz bmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSk7Cit9OworCisKK2ludCBoYWRfZXZlbnRfaGFuZGxl cihlbnVtIGhhZF9ldmVudF90eXBlIGV2ZW50X3R5cGUsIHZvaWQgKmRhdGEpOworCitpbnQgaGRt aV9hdWRpb19xdWVyeSh2b2lkICpkcnZfZGF0YSwgc3RydWN0IGhkbWlfYXVkaW9fZXZlbnQgZXZl bnQpOworaW50IGhkbWlfYXVkaW9fc3VzcGVuZCh2b2lkICpkcnZfZGF0YSwgc3RydWN0IGhkbWlf YXVkaW9fZXZlbnQgZXZlbnQpOworaW50IGhkbWlfYXVkaW9fcmVzdW1lKHZvaWQgKmRydl9kYXRh KTsKK2ludCBoZG1pX2F1ZGlvX21vZGVfY2hhbmdlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAq c3Vic3RyZWFtKTsKK2V4dGVybiBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2ludGVsaGFkX3BsYXli YWNrX29wczsKKworaW50IHNuZF9pbnRlbGhhZF9pbml0X2F1ZGlvX2N0cmwoc3RydWN0IHNuZF9w Y21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVs aGFkZGF0YSwKKwkJCQkJaW50IGZsYWdfc2lsZW5jZSk7CitpbnQgc25kX2ludGVsaGFkX3Byb2df YnVmZmVyKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSwKKwkJCQkJaW50IHN0YXJ0 LCBpbnQgZW5kKTsKK2ludCBzbmRfaW50ZWxoYWRfaW52ZF9idWZmZXIoaW50IHN0YXJ0LCBpbnQg ZW5kKTsKK2lubGluZSBpbnQgc25kX2ludGVsaGFkX3JlYWRfbGVuKHN0cnVjdCBzbmRfaW50ZWxo YWQgKmludGVsaGFkZGF0YSk7Cit2b2lkIGhhZF9idWlsZF9jaGFubmVsX2FsbG9jYXRpb25fbWFw KHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSk7CisKKy8qIFJlZ2lzdGVyIGFjY2Vz cyBmdW5jdGlvbnMgKi8KK2lubGluZSBpbnQgaGFkX2dldF9od3N0YXRlKHN0cnVjdCBzbmRfaW50 ZWxoYWQgKmludGVsaGFkZGF0YSk7CitpbmxpbmUgaW50IGhhZF9nZXRfY2FwcyhlbnVtIGhhZF9j YXBzX2xpc3QgcXVlcnlfZWxlbWVudCwKKwkJCQkJCXZvaWQgKmNhcGFiaWx0aWVzKTsKK2lubGlu ZSBpbnQgaGFkX3NldF9jYXBzKGVudW0gaGFkX2NhcHNfbGlzdCBzZXRfZWxlbWVudCwKKwkJCQkJ CXZvaWQgKmNhcGFiaWx0aWVzKTsKK2lubGluZSBpbnQgaGFkX3JlYWRfcmVnaXN0ZXIodWludDMy X3QgcmVnX2FkZHIsIHVpbnQzMl90ICpkYXRhKTsKK2lubGluZSBpbnQgaGFkX3dyaXRlX3JlZ2lz dGVyKHVpbnQzMl90IHJlZ19hZGRyLCB1aW50MzJfdCBkYXRhKTsKK2lubGluZSBpbnQgaGFkX3Jl YWRfbW9kaWZ5KHVpbnQzMl90IHJlZ19hZGRyLCB1aW50MzJfdCBkYXRhLAorCQkJCQkJCXVpbnQz Ml90IG1hc2spOworCisvKiovCitpbnQgaGRtaV9hdWRpb19wcm9iZSh2b2lkICpkZXZwdHIpOwor aW50IGhkbWlfYXVkaW9fcmVtb3ZlKHZvaWQgKnBkZXYpOworCisjZW5kaWYgLyogX0lOVEVMX0hE TUlfQVVESU9fICovCmRpZmYgLS1naXQgYS9zb3VuZC94ODYvaW50ZWxfaGRtaV9hdWRpb19pZi5j IGIvc291bmQveDg2L2ludGVsX2hkbWlfYXVkaW9faWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwLi5jNjUwYmE0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQveDg2L2ludGVs X2hkbWlfYXVkaW9faWYuYwpAQCAtMCwwICsxLDU1MSBAQAorLyoKKyAqICAgaW50ZWxfaGRtaV9h dWRpb19pZi5jIC0gSW50ZWwgSERNSSBhdWRpbyBkcml2ZXIgZm9yIE1JRAorICoKKyAqICBDb3B5 cmlnaHQgKEMpIDIwMTYgSW50ZWwgQ29ycAorICogIEF1dGhvcnM6CVNhaWxhamEgQmFuZGFydXBh bGxpIDxzYWlsYWphLmJhbmRhcnVwYWxsaUBpbnRlbC5jb20+CisgKgkJUmFtZXNoIEJhYnUgSyBW IDxyYW1lc2guYmFidUBpbnRlbC5jb20+CisgKgkJVmFpYmhhdiBBZ2Fyd2FsIDx2YWliaGF2LmFn YXJ3YWxAaW50ZWwuY29tPgorICoJCUplcm9tZSBBbmFuZCA8amVyb21lLmFuYW5kQGludGVsLmNv bT4KKyAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRo ZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7 IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElU WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIH5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+CisgKiBBTFNBIGRyaXZlciBmb3IgSW50ZWwgTUlEIEhETUkgYXVkaW8gY29udHJv bGxlci4gIFRoaXMgZmlsZSBjb250YWlucworICogaW50ZXJmYWNlIGZ1bmN0aW9ucyBleHBvc2Vk IHRvIEhETUkgRGlzcGxheSBkcml2ZXIgYW5kIGNvZGUgdG8gcmVnaXN0ZXIKKyAqIHdpdGggQUxT QSBmcmFtZXdvcmsuLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkJCSJoYWQ6ICIgZm10CisK KyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNs dWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291 bmQvY29yZS5oPgorI2luY2x1ZGUgImludGVsX2hkbWlfYXVkaW8uaCIKKyNpbmNsdWRlICJpbnRl bF9oZG1pX2xwZV9hdWRpby5oIgorCisvKioKKyAqIGhkbWlfYXVkaW9fcXVlcnkgLSBoZG1pIGF1 ZGlvIHF1ZXJ5IGZ1bmN0aW9uCisgKgorICpAaGFkZGF0YTogcG9pbnRlciB0byBIQUQgcHJpdmF0 ZSBkYXRhCisgKkBldmVudDogYXVkaW8gZXZlbnQgZm9yIHdoaWNoIHRoaXMgbWV0aG9kIGlzIGlu dm9rZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBjbGllbnQgZHJpdmVyIHRv IHF1ZXJ5IHRoZQorICogaGRtaSBhdWRpby4KKyAqLworaW50IGhkbWlfYXVkaW9fcXVlcnkodm9p ZCAqaGFkZGF0YSwgc3RydWN0IGhkbWlfYXVkaW9fZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IHNu ZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBOVUxMOworCXN0cnVjdCBoYWRfcHZ0X2RhdGEg KmhhZF9zdHJlYW07CisJdW5zaWduZWQgbG9uZyBmbGFnX2lycXM7CisJc3RydWN0IHNuZF9pbnRl bGhhZCAqaW50ZWxoYWRkYXRhID0gKHN0cnVjdCBzbmRfaW50ZWxoYWQgKiloYWRkYXRhOworCisJ aWYgKGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVhbSkKKwkJc3Vic3RyZWFt ID0gaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFtOworCWhhZF9zdHJlYW0g PSBpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKwlzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKwlj YXNlIEhBRF9FVkVOVF9RVUVSWV9JU19BVURJT19CVVNZOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgm aW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisKKwkJaWYgKChoYWRfc3Ry ZWFtLT5zdHJlYW1fdHlwZSA9PSBIQURfUlVOTklOR19TVFJFQU0pIHx8CisJCQlzdWJzdHJlYW0p IHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2Nr LAorCQkJCQkJZmxhZ19pcnFzKTsKKwkJCXByX2RlYnVnKCJBdWRpbyBzdHJlYW0gYWN0aXZlXG4i KTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50 ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJYnJlYWs7CisKKwljYXNlIEhB RF9FVkVOVF9RVUVSWV9JU19BVURJT19TVVNQRU5ERUQ6CisJCXNwaW5fbG9ja19pcnFzYXZlKCZp bnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJaWYgKGludGVsaGFkZGF0 YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX1NVU1BFTkRFRCkgeworCQkJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssCisJCQkJCQlmbGFnX2lycXMpOwor CQkJcHJfZGVidWcoIkF1ZGlvIGlzIHN1c3BlbmRlZFxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQor CQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxh Z19pcnFzKTsKKwlicmVhazsKKworCWRlZmF1bHQ6CisJCXByX2RlYnVnKCJlcnJvciB1bi1oYW5k bGVkIGV2ZW50ICEhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJYnJlYWs7CisKKwl9CisKKwly ZXR1cm4gMDsKK30KKworLyoqCisgKiBoZG1pX2F1ZGlvX3N1c3BlbmQgLSBwb3dlciBtYW5hZ2Vt ZW50IHN1c3BlbmQgZnVuY3Rpb24KKyAqCisgKkBoYWRkYXRhOiBwb2ludGVyIHRvIEhBRCBwcml2 YXRlIGRhdGEKKyAqQGV2ZW50OiBwbSBldmVudCBmb3Igd2hpY2ggdGhpcyBtZXRob2QgaXMgaW52 b2tlZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGNsaWVudCBkcml2ZXIgdG8g c3VzcGVuZCB0aGUKKyAqIGhkbWkgYXVkaW8uCisgKi8KK2ludCBoZG1pX2F1ZGlvX3N1c3BlbmQo dm9pZCAqaGFkZGF0YSwgc3RydWN0IGhkbWlfYXVkaW9fZXZlbnQgZXZlbnQpCit7CisJaW50IGNh cHMsIHJldHZhbCA9IDA7CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKwl1bnNp Z25lZCBsb25nIGZsYWdfaXJxczsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVh bTsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSAoc3RydWN0IHNuZF9pbnRl bGhhZCAqKWhhZGRhdGE7CisKKwlwcl9kZWJ1ZygiRW50ZXI6JXNcbiIsIF9fZnVuY19fKTsKKwor CWhhZF9zdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKwlzdWJzdHJlYW0gPSBp bnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW07CisKKwlpZiAoaW50ZWxoYWRk YXRhLT5kZXYtPnBvd2VyLnJ1bnRpbWVfc3RhdHVzICE9IFJQTV9TVVNQRU5ERUQpIHsKKwkJcHJf ZXJyKCJhdWRpbyBzdHJlYW0gaXMgYWN0aXZlXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQor CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdf aXJxcyk7CisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX0RJU0NPTk5F Q1RFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlu bG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZGVidWcoImhhZCBub3QgY29ubmVjdGVkXG4iKTsKKwkJ cmV0dXJuIHJldHZhbDsKKwl9CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID09IEhB RF9EUlZfU1VTUEVOREVEKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0 YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlwcl9kZWJ1ZygiaGFkIGFscmVhZHkgc3Vz cGVuZGVkXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlpbnRlbGhhZGRhdGEtPmRydl9z dGF0dXMgPSBIQURfRFJWX1NVU1BFTkRFRDsKKwlwcl9kZWJ1ZygiJXMgQCAlZDpERUJVRyBQTFVH L1VOUExVRyA6IEhBRF9EUlZfU1VTUEVOREVEXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsK KworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBm bGFnX2lycXMpOworCS8qCisJICogVG9EbzogTmVlZCB0byBkaXNhYmxlIFVOREVSUlVOIGludGVy cnVwdHMgYXMgd2VsbAorCSAqICBjYXBzID0gSERNSV9BVURJT19VTkRFUlJVTiB8IEhETUlfQVVE SU9fQlVGRkVSX0RPTkU7CisJICovCisJY2FwcyA9IEhETUlfQVVESU9fQlVGRkVSX0RPTkU7CisJ aGFkX3NldF9jYXBzKEhBRF9TRVRfRElTQUJMRV9BVURJT19JTlQsICZjYXBzKTsKKwloYWRfc2V0 X2NhcHMoSEFEX1NFVF9ESVNBQkxFX0FVRElPLCBOVUxMKTsKKwlwcl9kZWJ1ZygiRXhpdDolcyIs IF9fZnVuY19fKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGhkbWlfYXVkaW9fcmVz dW1lIC0gcG93ZXIgbWFuYWdlbWVudCByZXN1bWUgZnVuY3Rpb24KKyAqCisgKkBoYWRkYXRhOiBw b2ludGVyIHRvIEhBRCBwcml2YXRlIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxl ZCBieSBjbGllbnQgZHJpdmVyIHRvIHJlc3VtZSB0aGUKKyAqIGhkbWkgYXVkaW8uCisgKi8KK2lu dCBoZG1pX2F1ZGlvX3Jlc3VtZSh2b2lkICpoYWRkYXRhKQoreworCWludCBjYXBzLCByZXR2YWwg PSAwOworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IChzdHJ1Y3Qgc25kX2lu dGVsaGFkICopaGFkZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxczsKKworCXByX2RlYnVn KCJFbnRlcjolc1xuIiwgX19mdW5jX18pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFk ZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCWlmIChpbnRlbGhhZGRhdGEtPmRydl9z dGF0dXMgPT0gSEFEX0RSVl9ESVNDT05ORUNURUQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJCXByX2RlYnVnKCJo YWQgbm90IGNvbm5lY3RlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChpbnRlbGhhZGRh dGEtPmRydl9zdGF0dXMgIT0gSEFEX0RSVl9TVVNQRU5ERUQpIHsKKwkJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJCXByX2Vy cigiaGFkIGlzIG5vdCBpbiBzdXNwZW5kZWQgc3RhdGVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisK KwlpZiAoaGFkX2dldF9od3N0YXRlKGludGVsaGFkZGF0YSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJCXByX2Vy cigiRmFpbGVkIHRvIHJlc3VtZS4gRGV2aWNlIG5vdCBhY2Nlc3NpYmxlXG4iKTsKKwkJcmV0dXJu IC1FTk9ERVY7CisJfQorCisJaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID0gSEFEX0RSVl9DT05O RUNURUQ7CisJcHJfZGVidWcoIiVzIEAgJWQ6REVCVUcgUExVRy9VTlBMVUcgOiBIQURfRFJWX0RJ U0NPTk5FQ1RFRFxuIiwKKwkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJLyoKKwkg KiBUb0RvOiBOZWVkIHRvIGVuYWJsZSBVTkRFUlJVTiBpbnRlcnJ1cHRzIGFzIHdlbGwKKwkgKiBj YXBzID0gSERNSV9BVURJT19VTkRFUlJVTiB8IEhETUlfQVVESU9fQlVGRkVSX0RPTkU7CisJICov CisJY2FwcyA9IEhETUlfQVVESU9fQlVGRkVSX0RPTkU7CisJcmV0dmFsID0gaGFkX3NldF9jYXBz KEhBRF9TRVRfRU5BQkxFX0FVRElPX0lOVCwgJmNhcHMpOworCXJldHZhbCA9IGhhZF9zZXRfY2Fw cyhIQURfU0VUX0VOQUJMRV9BVURJTywgTlVMTCk7CisJcHJfZGVidWcoIkV4aXQ6JXMiLCBfX2Z1 bmNfXyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGFkX2Noa19p bnRybWlzcyhzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEsCisJCWVudW0gaW50ZWxf aGFkX2F1ZF9idWZfdHlwZSBidWZfaWQpCit7CisJaW50IGksIGludHJfY291bnQgPSAwOworCWVu dW0gaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZmX2RvbmU7CisJdTMyIGJ1Zl9zaXplLCBidWZf YWRkcjsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCXVuc2lnbmVkIGxvbmcg ZmxhZ19pcnFzOworCisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0YS0+cHJpdmF0ZV9kYXRhOwor CisJYnVmZl9kb25lID0gYnVmX2lkOworCisJaW50cl9jb3VudCA9IHNuZF9pbnRlbGhhZF9yZWFk X2xlbihpbnRlbGhhZGRhdGEpOworCWlmIChpbnRyX2NvdW50ID4gMSkgeworCQkvKiBJbiBjYXNl IG9mIGFjdGl2ZSBwbGF5YmFjayAqLworCQlwcl9lcnIoIkRyaXZlciBkZXRlY3RlZCAlZCBtaXNz ZWQgYnVmZmVyIGRvbmUgaW50ZXJydXB0KHMpISEhIVxuIiwKKwkJCQkoaW50cl9jb3VudCAtIDEp KTsKKwkJaWYgKGludHJfY291bnQgPiAzKQorCQkJcmV0dXJuIGludHJfY291bnQ7CisKKwkJYnVm X2lkICs9IChpbnRyX2NvdW50IC0gMSk7CisJCS8qIFJlcHJvZ3JhbSByZWdpc3RlcnMqLworCQlm b3IgKGkgPSBidWZmX2RvbmU7IGkgPCBidWZfaWQ7IGkrKykgeworCQkJaW50IGogPSBpICUgNDsK KworCQkJYnVmX3NpemUgPSBpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2pdLmJ1Zl9zaXplOworCQkJ YnVmX2FkZHIgPSBpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2pdLmJ1Zl9hZGRyOworCQkJaGFkX3dy aXRlX3JlZ2lzdGVyKEFVRF9CVUZfQV9MRU5HVEggKworCQkJCQkoaiAqIEhBRF9SRUdfV0lEVEgp LCBidWZfc2l6ZSk7CisJCQloYWRfd3JpdGVfcmVnaXN0ZXIoCisJCQkJCUFVRF9CVUZfQV9BRERS KyhqICogSEFEX1JFR19XSURUSCksCisJCQkJCShidWZfYWRkciB8IEJJVCgwKSB8IEJJVCgxKSkp OworCQl9CisJCWJ1Zl9pZCA9IGJ1Zl9pZCAlIDQ7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRl bGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJaW50ZWxoYWRkYXRhLT5idWZm X2RvbmUgPSBidWZfaWQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+ aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCX0KKworCXJldHVybiBpbnRyX2NvdW50OworfQor CitpbnQgaGFkX3Byb2Nlc3NfYnVmZmVyX2RvbmUoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxo YWRkYXRhKQoreworCWludCByZXR2YWwgPSAwOworCXUzMiBsZW4gPSAxOworCWVudW0gaW50ZWxf aGFkX2F1ZF9idWZfdHlwZSBidWZfaWQ7CisJZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIGJ1 ZmZfZG9uZTsKKwlzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICpzdHJlYW07CisJdTMyIGJ1Zl9zaXpl OworCXN0cnVjdCBoYWRfcHZ0X2RhdGEgKmhhZF9zdHJlYW07CisJaW50IGludHJfY291bnQ7CisJ ZW51bSBoYWRfc3RhdHVzX3N0cmVhbQkJc3RyZWFtX3R5cGU7CisJdW5zaWduZWQgbG9uZyBmbGFn X2lycXM7CisKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisJc3Ry ZWFtID0gJmludGVsaGFkZGF0YS0+c3RyZWFtX2luZm87CisJaW50cl9jb3VudCA9IDE7CisKKwlz cGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7 CisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX0RJU0NPTk5FQ1RFRCkg eworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywg ZmxhZ19pcnFzKTsKKwkJcHJfZXJyKCIlczpEZXZpY2UgYWxyZWFkeSBkaXNjb25uZWN0ZWRcbiIs IF9fZnVuY19fKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJYnVmX2lkID0gaW50ZWxoYWRkYXRh LT5jdXJyX2J1ZjsKKwlpbnRlbGhhZGRhdGEtPmJ1ZmZfZG9uZSA9IGJ1Zl9pZDsKKwlidWZmX2Rv bmUgPSBpbnRlbGhhZGRhdGEtPmJ1ZmZfZG9uZTsKKwlidWZfc2l6ZSA9IGludGVsaGFkZGF0YS0+ YnVmX2luZm9bYnVmX2lkXS5idWZfc2l6ZTsKKwlzdHJlYW1fdHlwZSA9IGhhZF9zdHJlYW0tPnN0 cmVhbV90eXBlOworCisJcHJfZGVidWcoIkVudGVyOiVzIGJ1Zl9pZD0lZFxuIiwgX19mdW5jX18s IGJ1Zl9pZCk7CisKKwkvKiBFdmVyeSBkZWJ1ZyBzdGF0ZW1lbnQgaGFzIGFuIGltcGxpY2F0aW9u CisJICogb2YgfjVtc2VjLiBUaHVzLCBhdm9pZCBoYXZpbmcgPjMgZGVidWcgc3RhdGVtZW50cwor CSAqIGZvciBlYWNoIGJ1ZmZlcl9kb25lIGhhbmRsaW5nLgorCSAqLworCisJLyogQ2hlY2sgZm9y IGFueSBpbnRyX21pc3MgaW4gY2FzZSBvZiBhY3RpdmUgcGxheWJhY2sgKi8KKwlpZiAoaGFkX3N0 cmVhbS0+c3RyZWFtX3R5cGUgPT0gSEFEX1JVTk5JTkdfU1RSRUFNKSB7CisJCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlp bnRyX2NvdW50ID0gaGFkX2Noa19pbnRybWlzcyhpbnRlbGhhZGRhdGEsIGJ1Zl9pZCk7CisJCWlm ICghaW50cl9jb3VudCB8fCAoaW50cl9jb3VudCA+IDMpKSB7CisJCQlwcl9lcnIoIkhBRCBTVyBz dGF0ZSBpbiBub24tcmVjb3ZlcmFibGUhISEgbW9kZVxuIik7CisJCQlwcl9lcnIoIkFscmVhZHkg cGxheWVkIHN0YWxlIGRhdGFcbiIpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlidWZfaWQg Kz0gKGludHJfY291bnQgLSAxKTsKKwkJYnVmX2lkID0gYnVmX2lkICUgNDsKKwkJc3Bpbl9sb2Nr X2lycXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCX0KKwor CWludGVsaGFkZGF0YS0+YnVmX2luZm9bYnVmX2lkXS5pc192YWxpZCA9IHRydWU7CisJaWYgKGlu dGVsaGFkZGF0YS0+dmFsaWRfYnVmX2NudC0xID09IGJ1Zl9pZCkgeworCQlpZiAoaGFkX3N0cmVh bS0+c3RyZWFtX3R5cGUgPj0gSEFEX1JVTk5JTkdfU1RSRUFNKQorCQkJaW50ZWxoYWRkYXRhLT5j dXJyX2J1ZiA9IEhBRF9CVUZfVFlQRV9BOworCX0gZWxzZQorCQlpbnRlbGhhZGRhdGEtPmN1cnJf YnVmID0gYnVmX2lkICsgMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0 YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCisJaWYgKGhhZF9nZXRfaHdzdGF0ZShpbnRl bGhhZGRhdGEpKSB7CisJCXByX2VycigiSERNSSBjYWJsZSBwbHVnZ2VkLW91dFxuIik7CisJCXJl dHVybiByZXR2YWw7CisJfQorCisJLypSZXByb2dyYW0gdGhlIHJlZ2lzdGVycyB3aXRoIGFkZHIg YW5kIGxlbmd0aCovCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9CVUZfQV9MRU5HVEggKworCQkJ KGJ1Zl9pZCAqIEhBRF9SRUdfV0lEVEgpLCBidWZfc2l6ZSk7CisJaGFkX3dyaXRlX3JlZ2lzdGVy KEFVRF9CVUZfQV9BRERSKyhidWZfaWQgKiBIQURfUkVHX1dJRFRIKSwKKwkJCWludGVsaGFkZGF0 YS0+YnVmX2luZm9bYnVmX2lkXS5idWZfYWRkcnwKKwkJCUJJVCgwKSB8IEJJVCgxKSk7CisKKwlo YWRfcmVhZF9yZWdpc3RlcihBVURfQlVGX0FfTEVOR1RIICsgKGJ1Zl9pZCAqIEhBRF9SRUdfV0lE VEgpLAorCQkJCQkmbGVuKTsKKwlwcl9kZWJ1ZygiJXM6RW5hYmxlZCBidWZbJWRdXG4iLCBfX2Z1 bmNfXywgYnVmX2lkKTsKKworCS8qIEluIGNhc2Ugb2YgYWN0dWFsIGRhdGEsCisJICogcmVwb3J0 IGJ1ZmZlcl9kb25lIHRvIGFib3ZlIEFMU0EgbGF5ZXIKKwkgKi8KKwlidWZfc2l6ZSA9ICBpbnRl bGhhZGRhdGEtPmJ1Zl9pbmZvW2J1Zl9pZF0uYnVmX3NpemU7CisJaWYgKHN0cmVhbV90eXBlID49 IEhBRF9SVU5OSU5HX1NUUkVBTSkgeworCQlpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmJ1ZmZl cl9yZW5kZXJlZCArPQorCQkJKGludHJfY291bnQgKiBidWZfc2l6ZSk7CisJCXN0cmVhbS0+cGVy aW9kX2VsYXBzZWQoc3RyZWFtLT5oYWRfc3Vic3RyZWFtKTsKKwl9CisKKwlyZXR1cm4gcmV0dmFs OworfQorCitpbnQgaGFkX3Byb2Nlc3NfYnVmZmVyX3VuZGVycnVuKHN0cnVjdCBzbmRfaW50ZWxo YWQgKmludGVsaGFkZGF0YSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwllbnVtIGludGVsX2hhZF9h dWRfYnVmX3R5cGUgYnVmX2lkOworCXN0cnVjdCBwY21fc3RyZWFtX2luZm8gKnN0cmVhbTsKKwlz dHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCWVudW0gaGFkX3N0YXR1c19zdHJlYW0g c3RyZWFtX3R5cGU7CisJdW5zaWduZWQgbG9uZyBmbGFnX2lycXM7CisJaW50IGRydl9zdGF0dXM7 CisKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisJc3RyZWFtID0g JmludGVsaGFkZGF0YS0+c3RyZWFtX2luZm87CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxo YWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJYnVmX2lkID0gaW50ZWxoYWRkYXRh LT5jdXJyX2J1ZjsKKwlzdHJlYW1fdHlwZSA9IGhhZF9zdHJlYW0tPnN0cmVhbV90eXBlOworCWlu dGVsaGFkZGF0YS0+YnVmZl9kb25lID0gYnVmX2lkOworCWRydl9zdGF0dXMgPSBpbnRlbGhhZGRh dGEtPmRydl9zdGF0dXM7CisJaWYgKHN0cmVhbV90eXBlID09IEhBRF9SVU5OSU5HX1NUUkVBTSkK KwkJaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZiA9IEhBRF9CVUZfVFlQRV9BOworCisJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisK Kwlwcl9kZWJ1ZygiRW50ZXI6JXMgYnVmX2lkPSVkLCBzdHJlYW1fdHlwZT0lZFxuIiwKKwkJCV9f ZnVuY19fLCBidWZfaWQsIHN0cmVhbV90eXBlKTsKKworCWludGVsaGFkZGF0YS0+b3BzLT5oYW5k bGVfdW5kZXJydW4oaW50ZWxoYWRkYXRhKTsKKworCWlmIChkcnZfc3RhdHVzID09IEhBRF9EUlZf RElTQ09OTkVDVEVEKSB7CisJCXByX2VycigiJXM6RGV2aWNlIGFscmVhZHkgZGlzY29ubmVjdGVk XG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJaWYgKHN0cmVhbV90eXBl ID09IEhBRF9SVU5OSU5HX1NUUkVBTSkgeworCQkvKiBSZXBvcnQgVU5ERVJSVU4gZXJyb3IgdG8g YWJvdmUgbGF5ZXJzICovCisJCWludGVsaGFkZGF0YS0+ZmxhZ191bmRlcnJ1biA9IDE7CisJCXN0 cmVhbS0+cGVyaW9kX2VsYXBzZWQoc3RyZWFtLT5oYWRfc3Vic3RyZWFtKTsKKwl9CisKKwlyZXR1 cm4gcmV0dmFsOworfQorCitpbnQgaGFkX3Byb2Nlc3NfaG90X3BsdWcoc3RydWN0IHNuZF9pbnRl bGhhZCAqaW50ZWxoYWRkYXRhKQoreworCWludCByZXR2YWwgPSAwOworCWVudW0gaW50ZWxfaGFk X2F1ZF9idWZfdHlwZSBidWZfaWQ7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJl YW07CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKwl1bnNpZ25lZCBsb25nIGZs YWdfaXJxczsKKworCXByX2RlYnVnKCJFbnRlcjolc1xuIiwgX19mdW5jX18pOworCisJc3Vic3Ry ZWFtID0gaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFtOworCWhhZF9zdHJl YW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVfZGF0YTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZp bnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwlpZiAoaW50ZWxoYWRkYXRh LT5kcnZfc3RhdHVzID09IEhBRF9EUlZfQ09OTkVDVEVEKSB7CisJCXByX2RlYnVnKCJEZXZpY2Ug YWxyZWFkeSBjb25uZWN0ZWRcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhh ZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJ YnVmX2lkID0gaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZjsKKwlpbnRlbGhhZGRhdGEtPmJ1ZmZfZG9u ZSA9IGJ1Zl9pZDsKKwlpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPSBIQURfRFJWX0NPTk5FQ1RF RDsKKwlwcl9kZWJ1ZygiJXMgQCAlZDpERUJVRyBQTFVHL1VOUExVRyA6IEhBRF9EUlZfQ09OTkVD VEVEXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKworCXByX2RlYnVnKCJQ cm9jZXNzaW5nIEhPVF9QTFVHLCBidWZfaWQgPSAlZFxuIiwgYnVmX2lkKTsKKworCSAvKiBRdWVy eSBkaXNwbGF5IGRyaXZlciBmb3IgYXVkaW8gcmVnaXN0ZXIgYmFzZSAqLworCWlmIChpbnRlbGhh ZGRhdGEtPnJlZ19vcHMuaGRtaV9hdWRpb19nZXRfcmVnaXN0ZXJfYmFzZSgKKwkJJmludGVsaGFk ZGF0YS0+YXVkaW9fcmVnX2Jhc2UsCisJCSZpbnRlbGhhZGRhdGEtPmF1ZGlvX2NmZ19vZmZzZXQp KSB7CisJCXByX2VycigiVW5hYmxlIHRvIGdldCBhdWRpbyByZWcgYmFzZSBmcm9tIERpc3BsYXkg ZHJpdmVyXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKGludGVsaGFkZGF0YS0+YXVkaW9f cmVnX2Jhc2UgPT0gTlVMTCkgeworCQlwcl9lcnIoImF1ZGlvIHJlZyBiYXNlIHZhbHVlIGlzIE5V TExcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlwcl9kZWJ1ZygiJXMgYXVkaW9fcmVnX2Jhc2Ug PSAweCVwXG4iLCBfX2Z1bmNfXywKKwkJCWludGVsaGFkZGF0YS0+YXVkaW9fcmVnX2Jhc2UpOwor CisJLyogU2FmZXR5IGNoZWNrICovCisJaWYgKHN1YnN0cmVhbSkgeworCQlwcl9kZWJ1ZygiVGhl cmUgc2hvdWxkIG5vdCBiZSBhY3RpdmUgUEIgZnJvbSBBTFNBXG4iKTsKKwkJcHJfZGVidWcoIlNp Z25pZmllcywgY2FibGUgaXMgcGx1Z2dlZC1pbiBldmVuIGJlZm9yZVxuIik7CisJCXByX2RlYnVn KCJwcm9jZXNzaW5nIHNuZF9wY21fZGlzY29ubmVjdFxuIik7CisJCS8qIFNldCBydW50aW1lLT5z dGF0ZSB0byBod19wYXJhbXMgZG9uZSAqLworCQlzbmRfcGNtX3N0b3Aoc3Vic3RyZWFtLCBTTkRS Vl9QQ01fU1RBVEVfU0VUVVApOworCX0KKworCWhhZF9idWlsZF9jaGFubmVsX2FsbG9jYXRpb25f bWFwKGludGVsaGFkZGF0YSk7CisKKwlyZXR1cm4gcmV0dmFsOworCitlcnI6CisJcG1fcnVudGlt ZV9kaXNhYmxlKGludGVsaGFkZGF0YS0+ZGV2KTsKKwlpbnRlbGhhZGRhdGEtPmRldiA9IE5VTEw7 CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGhhZF9wcm9jZXNzX2hvdF91bnBsdWcoc3RydWN0 IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCWludCBjYXBzLCByZXR2YWwgPSAwOwor CWVudW0gaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZfaWQ7CisJc3RydWN0IGhhZF9wdnRfZGF0 YSAqaGFkX3N0cmVhbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxczsKKworCXByX2RlYnVnKCJF bnRlcjolc1xuIiwgX19mdW5jX18pOworCisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0YS0+cHJp dmF0ZV9kYXRhOworCWJ1Zl9pZCA9IGludGVsaGFkZGF0YS0+Y3Vycl9idWY7CisKKwlzcGluX2xv Y2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisKKwlp ZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7CisJ CXByX2RlYnVnKCJEZXZpY2UgYWxyZWFkeSBkaXNjb25uZWN0ZWRcbiIpOworCQlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJ cmV0dXJuIHJldHZhbDsKKworCX0gZWxzZSB7CisJCS8qIERpc2FibGUgQXVkaW8gKi8KKwkJY2Fw cyA9IEhETUlfQVVESU9fQlVGRkVSX0RPTkU7CisJCXJldHZhbCA9IGhhZF9zZXRfY2FwcyhIQURf U0VUX0RJU0FCTEVfQVVESU9fSU5ULCAmY2Fwcyk7CisJCXJldHZhbCA9IGhhZF9zZXRfY2FwcyhI QURfU0VUX0RJU0FCTEVfQVVESU8sIE5VTEwpOworCQlpbnRlbGhhZGRhdGEtPm9wcy0+ZW5hYmxl X2F1ZGlvKAorCQkJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFtLCAwKTsK Kwl9CisKKwlpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPSBIQURfRFJWX0RJU0NPTk5FQ1RFRDsK Kwlwcl9kZWJ1ZygiJXMgQCAlZDpERUJVRyBQTFVHL1VOUExVRyA6IEhBRF9EUlZfRElTQ09OTkVD VEVEXG4iLAorCQkJX19mdW5jX18sIF9fTElORV9fKTsKKworCS8qIFJlcG9ydCB0byBhYm92ZSBB TFNBIGxheWVyICovCisJaWYgKGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVh bSAhPSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFk X3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlwcl9kZWJ1ZygiJXM6IHVubG9jayAtPiBzZW5kaW5n IHBjbV9zdG9wIC0+IGxvY2tcbiIsIF9fZnVuY19fKTsKKwkJc25kX3BjbV9zdG9wKGludGVsaGFk ZGF0YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVhbSwKKwkJCQlTTkRSVl9QQ01fU1RBVEVfRElT Q09OTkVDVEVEKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5s b2NrLCBmbGFnX2lycXMpOworCX0KKworCWhhZF9zdHJlYW0tPnN0cmVhbV90eXBlID0gSEFEX0lO SVQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ss IGZsYWdfaXJxcyk7CisJa2ZyZWUoaW50ZWxoYWRkYXRhLT5jaG1hcC0+Y2htYXApOworCWludGVs aGFkZGF0YS0+Y2htYXAtPmNobWFwID0gTlVMTDsKKwlpbnRlbGhhZGRhdGEtPmF1ZGlvX3JlZ19i YXNlID0gTlVMTDsKKwlwcl9kZWJ1ZygiJXM6IHVubG9ja2VkIC0+IHJldHVybmVkXG4iLCBfX2Z1 bmNfXyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGhhZF9ldmVudF9oYW5kbGVy IC0gQ2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBldmVudHMKKyAqCisgKiBAZXZlbnRfdHlw ZTogRXZlbnQgdHlwZSB0byBoYW5kbGUKKyAqIEBkYXRhOiBkYXRhIHJlbGF0ZWQgdG8gdGhlIGV2 ZW50X3R5cGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgdG8gaGFuZGxlIEhETUkg ZXZlbnRzIGZyb20gY2xpZW50IGRyaXZlci4KKyAqLworaW50IGhhZF9ldmVudF9oYW5kbGVyKGVu dW0gaGFkX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0dmFs ID0gMDsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBkYXRhOworCWVudW0g aW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZfaWQ7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFt ICpzdWJzdHJlYW07CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKwl1bnNpZ25l ZCBsb25nIGZsYWdfaXJxczsKKworCWJ1Zl9pZCA9IGludGVsaGFkZGF0YS0+Y3Vycl9idWY7CisJ aGFkX3N0cmVhbSA9IGludGVsaGFkZGF0YS0+cHJpdmF0ZV9kYXRhOworCisJLyogU3dpdGNoaW5n IHRvIGEgZnVuY3Rpb24gY2FuIGRyb3AgYXRvbWljaXR5IGV2ZW4gaW4gSU5UUiBjb250ZXh0Lgor CSAqIFRodXMsIGEgYmlnIGxvY2sgaXMgYWNxdWlyZWQgdG8gbWFpbnRhaW4gYXRvbWljaXR5Lgor CSAqIFRoaXMgY2FuIGJlIG9wdGltaXplZCBsYXRlci4KKwkgKiBDdXJyZW50bHksIG9ubHkgYnVm ZmVyX2RvbmUvX3VuZGVycnVuIGV4ZWN1dGVzIGluIElOVFIgY29udGV4dC4KKwkgKiBBbHNvLCBs b2NraW5nIGlzIGltcGxlbWVudGVkIHNlcGFyYXRlbHkgdG8gYXZvaWQgcmVhbCBjb250ZW50aW9u CisJICogb2YgZGF0YShzdHJ1Y3QgaW50ZWxoYWRkYXRhKSBiZXR3ZWVuIElSUS9TT0ZUX0lSUS9Q Uk9DRVNTIGNvbnRleHQuCisJICovCisJc3Vic3RyZWFtID0gaW50ZWxoYWRkYXRhLT5zdHJlYW1f aW5mby5oYWRfc3Vic3RyZWFtOworCXN3aXRjaCAoZXZlbnRfdHlwZSkgeworCWNhc2UgSEFEX0VW RU5UX0FVRElPX0JVRkZFUl9ET05FOgorCQlyZXR2YWwgPSBoYWRfcHJvY2Vzc19idWZmZXJfZG9u ZShpbnRlbGhhZGRhdGEpOworCWJyZWFrOworCisJY2FzZSBIQURfRVZFTlRfQVVESU9fQlVGRkVS X1VOREVSUlVOOgorCQlyZXR2YWwgPSBoYWRfcHJvY2Vzc19idWZmZXJfdW5kZXJydW4oaW50ZWxo YWRkYXRhKTsKKwlicmVhazsKKworCWNhc2UgSEFEX0VWRU5UX0hPVF9QTFVHOgorCQlyZXR2YWwg PSBoYWRfcHJvY2Vzc19ob3RfcGx1ZyhpbnRlbGhhZGRhdGEpOworCWJyZWFrOworCisJY2FzZSBI QURfRVZFTlRfSE9UX1VOUExVRzoKKwkJcmV0dmFsID0gaGFkX3Byb2Nlc3NfaG90X3VucGx1Zyhp bnRlbGhhZGRhdGEpOworCWJyZWFrOworCisJY2FzZSBIQURfRVZFTlRfTU9ERV9DSEFOR0lORzoK KwkJcHJfZGVidWcoIiBjYWxsZWQgX2V2ZW50X2hhbmRsZXIgd2l0aCBfTU9ERV9DSEFOR0UgZXZl bnRcbiIpOworCQkvKiBQcm9jZXNzIG9ubHkgaWYgc3RyZWFtIGlzIGFjdGl2ZSAmIGNhYmxlIFBs dWdnZWQtaW4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5s b2NrLCBmbGFnX2lycXMpOworCQlpZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID49IEhBRF9E UlZfRElTQ09OTkVDVEVEKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRh dGEtPmhhZF9zcGlubG9jaywKKwkJCQkJZmxhZ19pcnFzKTsKKwkJCWJyZWFrOworCQl9CisJCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2ly cXMpOworCQlpZiAoKGhhZF9zdHJlYW0tPnN0cmVhbV90eXBlID09IEhBRF9SVU5OSU5HX1NUUkVB TSkKKwkJCQkmJiBzdWJzdHJlYW0pCisJCQlyZXR2YWwgPSBoZG1pX2F1ZGlvX21vZGVfY2hhbmdl KHN1YnN0cmVhbSk7CisJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcl9kZWJ1ZygiZXJyb3IgdW4t aGFuZGxlZCBldmVudCAhIVxuIik7CisJCXJldHZhbCA9IC1FSU5WQUw7CisJYnJlYWs7CisKKwl9 CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3g4Ni9pbnRlbF9oZG1pX2xw ZV9hdWRpby5jIGIvc291bmQveDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlvLmMKaW5kZXggZjMxYWI3 Mi4uMTYxOTRjNiAxMDA2NDQKLS0tIGEvc291bmQveDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlvLmMK KysrIGIvc291bmQveDg2L2ludGVsX2hkbWlfbHBlX2F1ZGlvLmMKQEAgLTM2LDYgKzM2LDcgQEAK ICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8ZHJtL2ludGVsX2xwZV9hdWRp by5oPgogI2luY2x1ZGUgImludGVsX2hkbWlfbHBlX2F1ZGlvLmgiCisjaW5jbHVkZSAiaW50ZWxf aGRtaV9hdWRpby5oIgogCiAvKiBnbG9iYWxzKi8KIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmdw ZGV2OwpAQCAtNDYxLDkgKzQ2Miw5IEBAIHN0YXRpYyB2b2lkIG5vdGlmeV9hdWRpb19scGUodm9p ZCAqYXVkaW9fcHRyKQogLyoqCiAgKiBoZG1pX2xwZV9hdWRpb19wcm9iZSAtIHN0YXJ0IGJyaWRn ZSB3aXRoIGk5MTUKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBpOTE1 IGRyaXZlciBjcmVhdGVzIHRoZSBoZG1pLWxwZS1hdWRpbwotICogcGxhdGZvcm0gZGV2aWNlLiBD YXJkIGNyZWF0aW9uIGlzIGRlZmVycmVkIHVudGlsIGEgaG90IHBsdWcgZXZlbnQgaXMKLSAqIHJl Y2VpdmVkCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBpOTE1IGRyaXZlciBj cmVhdGVzIHRoZQorICogaGRtaS1scGUtYXVkaW8gcGxhdGZvcm0gZGV2aWNlLiBDYXJkIGNyZWF0 aW9uIGlzIGRlZmVycmVkIHVudGlsIGEKKyAqIGhvdCBwbHVnIGV2ZW50IGlzIHJlY2VpdmVkCiAg Ki8KIHN0YXRpYyBpbnQgaGRtaV9scGVfYXVkaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKIHsKQEAgLTUwNSw4ICs1MDYsOCBAQCBzdGF0aWMgaW50IGhkbWlfbHBlX2F1ZGlv X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAJCSh1bnNpZ25lZCBpbnQpcmVz X21taW8tPnN0YXJ0LCAodW5zaWduZWQgaW50KXJlc19tbWlvLT5lbmQpOwogCiAJbW1pb19zdGFy dCA9IGlvcmVtYXBfbm9jYWNoZShyZXNfbW1pby0+c3RhcnQsCi0JCQkJKHNpemVfdCkoKHJlc19t bWlvLT5lbmQgLSByZXNfbW1pby0+c3RhcnQpCi0JCQkJCQkrIDEpKTsKKwkJCQkoc2l6ZV90KSgo cmVzX21taW8tPmVuZCAtCisJCQkJCXJlc19tbWlvLT5zdGFydCkgKyAxKSk7CiAJaWYgKCFtbWlv X3N0YXJ0KSB7CiAJCXByX2VycigiQ291bGQgbm90IGdldCBpb3JlbWFwXG4iKTsKIAkJcmV0dXJu IC1FQUNDRVM7CkBAIC01NTYsMTEgKzU1NywxMiBAQCBzdGF0aWMgaW50IGhkbWlfbHBlX2F1ZGlv X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiAKIAlwbGF0Zm9ybV9zZXRfZHJ2 ZGF0YShwZGV2LCBjdHgpOwogCisJcmV0ID0gaGRtaV9hdWRpb19wcm9iZSgodm9pZCAqKXBkZXYp OworCiAJcHJfZGVidWcoImhkbWkgbHBlIGF1ZGlvOiBzZXR0aW5nIHBpbiBlbGQgbm90aWZ5IGNh bGxiYWNrXG4iKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwZGF0YS0+bHBlX2F1ZGlvX3Nsb2Nr LCBmbGFnX2lycSk7CiAJcGRhdGEtPm5vdGlmeV9hdWRpb19scGUgPSBub3RpZnlfYXVkaW9fbHBl OwotCiAJaWYgKHBkYXRhLT5ub3RpZnlfcGVuZGluZykgewogCiAJCXByX2RlYnVnKCIlczogaGFu ZGxlIHBlbmRpbmcgbm90aWZpY2F0aW9uXG4iLCBfX2Z1bmNfXyk7CkBAIC01ODQsNiArNTg2LDgg QEAgc3RhdGljIGludCBoZG1pX2xwZV9hdWRpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKIAogCXByX2RlYnVnKCJFbnRlciAlc1xuIiwgX19mdW5jX18pOwogCisJaGRtaV9h dWRpb19yZW1vdmUocGRldik7CisKIAkvKiBnZXQgY29udGV4dCwgcmVsZWFzZSByZXNvdXJjZXMg Ki8KIAljdHggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpb3VubWFwKGN0eC0+bW1p b19zdGFydCk7Ci0tIAoyLjkuMwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVz a3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9p bnRlbC1nZngK