From mboxrd@z Thu Jan 1 00:00:00 1970 From: Pierre-Louis Bossart Subject: [RFC 09/15] ALSA: Intel: Atom: add Atom non-HDAudio HDMI interface Date: Fri, 4 Mar 2016 20:50:46 -0600 Message-ID: <1457146252-4577-10-git-send-email-pierre-louis.bossart@linux.intel.com> References: <1457146252-4577-1-git-send-email-pierre-louis.bossart@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTP id 108F96E1DE for ; Sat, 5 Mar 2016 02:54:33 +0000 (UTC) In-Reply-To: <1457146252-4577-1-git-send-email-pierre-louis.bossart@linux.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: mengdong.lin@linux.intel.com, tiwai@suse.de, liam.r.girdwood@linux.intel.com, vinod.koul@intel.com, broonie@kernel.org, rakesh.a.ughreja@intel.com, David Henningsson List-Id: intel-gfx@lists.freedesktop.org QWRkIHN1cHBvcnQgaW50ZXJmYWNlIGF2YWlsYWJsZSBvbiBCYXl0cmFpbCBhbmQgQ2hlcnJ5VHJh aWwKCkluaXRpYWwgY29kZSB3YXMgZG93bmxvYWRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS8w MW9yZy9iYXl0cmFpbGF1ZGlvLwouLi5hbmQgaGFkIHRoZSBjaGFuZ2VzIHRvIC5jb25maWcgc3Ry aXBwZWQgYW5kIHRoZSByZXZlcnQgb24gc291bmQvaW5pdC5jCmFuZCBwcmludGstPnByX2RlYnVn IGRvbmUgYnkgRGF2aWQgSGVubmluZ3NvbgoKQ2xlYW4tdXAsIHBvcnQgdG8gNC40IGFuZCBpbnRl bC1kcm0gYnkgUGllcnJlIEJvc3NhcnQKClNpZ25lZC1vZmYtYnk6IERhdmlkIEhlbm5pbmdzc29u IDxkYXZpZC5oZW5uaW5nc3NvbkBjYW5vbmljYWwuY29tPgpTaWduZWQtb2ZmLWJ5OiBQaWVycmUt TG91aXMgQm9zc2FydCA8cGllcnJlLWxvdWlzLmJvc3NhcnRAbGludXguaW50ZWwuY29tPgotLS0K IHNvdW5kL0tjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDggKwogc291 bmQvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBzb3VuZC9o ZG1pX2F1ZGlvL01ha2VmaWxlICAgICAgICAgICAgICAgICAgfCAgICA5ICsKIHNvdW5kL2hkbWlf YXVkaW8vaW50ZWxfbWlkX2hkbWlfYXVkaW8uYyAgICB8IDIwMjkgKysrKysrKysrKysrKysrKysr KysrKysrKysrKwogc291bmQvaGRtaV9hdWRpby9pbnRlbF9taWRfaGRtaV9hdWRpby5oICAgIHwg IDc0MCArKysrKysrKysrCiBzb3VuZC9oZG1pX2F1ZGlvL2ludGVsX21pZF9oZG1pX2F1ZGlvX2lm LmMgfCAgNTE0ICsrKysrKysKIDYgZmlsZXMgY2hhbmdlZCwgMzMwMSBpbnNlcnRpb25zKCspCiBj cmVhdGUgbW9kZSAxMDA2NDQgc291bmQvaGRtaV9hdWRpby9NYWtlZmlsZQogY3JlYXRlIG1vZGUg MTAwNjQ0IHNvdW5kL2hkbWlfYXVkaW8vaW50ZWxfbWlkX2hkbWlfYXVkaW8uYwogY3JlYXRlIG1v ZGUgMTAwNjQ0IHNvdW5kL2hkbWlfYXVkaW8vaW50ZWxfbWlkX2hkbWlfYXVkaW8uaAogY3JlYXRl IG1vZGUgMTAwNjQ0IHNvdW5kL2hkbWlfYXVkaW8vaW50ZWxfbWlkX2hkbWlfYXVkaW9faWYuYwoK ZGlmZiAtLWdpdCBhL3NvdW5kL0tjb25maWcgYi9zb3VuZC9LY29uZmlnCmluZGV4IDVhMjQwZTAu Ljc1YzY3OWUgMTAwNjQ0Ci0tLSBhL3NvdW5kL0tjb25maWcKKysrIGIvc291bmQvS2NvbmZpZwpA QCAtMTM0LDMgKzEzNCwxMSBAQCBjb25maWcgQUM5N19CVVMKIAkgIHNvdW5kIHN1YnN5c3RlbSBh bmQgb3RoZXIgZnVuY3Rpb24gZHJpdmVycyBjb21wbGV0ZWx5IHVucmVsYXRlZCB0bwogCSAgc291 bmQgYWx0aG91Z2ggdGhleSdyZSBzaGFyaW5nIHRoZSBBQzk3IGJ1cy4gQ29uY2VybmVkIGRyaXZl cnMKIAkgIHNob3VsZCAic2VsZWN0IiB0aGlzLgorCitjb25maWcgU1VQUE9SVF9IRE1JCisgICAg ICAgIGJvb2wgIlNVUFBPUlRfSERNSSIKKyAgICAgICAgZGVwZW5kcyBvbiBEUk1fSTkxNQorICAg ICAgICBkZWZhdWx0IG4KKyAgICAgICAgaGVscAorICAgICAgICAgIENob29zZSB0aGlzIG9wdGlv biB0byBzdXBwb3J0IEhETUkuCisKZGlmZiAtLWdpdCBhL3NvdW5kL01ha2VmaWxlIGIvc291bmQv TWFrZWZpbGUKaW5kZXggNzczMjA3MC4uZjJjNWU4MiAxMDA2NDQKLS0tIGEvc291bmQvTWFrZWZp bGUKKysrIGIvc291bmQvTWFrZWZpbGUKQEAgLTgsNiArOCw3IEBAIG9iai0kKENPTkZJR19ETUFT T1VORCkgKz0gb3NzLwogb2JqLSQoQ09ORklHX1NORCkgKz0gY29yZS8gaTJjLyBkcml2ZXJzLyBp c2EvIHBjaS8gcHBjLyBhcm0vIHNoLyBzeW50aC8gdXNiLyBcCiAJZmlyZXdpcmUvIHNwYXJjLyBz cGkvIHBhcmlzYy8gcGNtY2lhLyBtaXBzLyBzb2MvIGF0bWVsLyBoZGEvCiBvYmotJChDT05GSUdf U05EX0FPQSkgKz0gYW9hLworb2JqLSQoQ09ORklHX1NVUFBPUlRfSERNSSkgKz0gaGRtaV9hdWRp by8KIAogIyBUaGlzIG9uZSBtdXN0IGJlIGNvbXBpbGFibGUgZXZlbiBpZiBzb3VuZCBpcyBjb25m aWd1cmVkIG91dAogb2JqLSQoQ09ORklHX0FDOTdfQlVTKSArPSBhYzk3X2J1cy5vCmRpZmYgLS1n aXQgYS9zb3VuZC9oZG1pX2F1ZGlvL01ha2VmaWxlIGIvc291bmQvaGRtaV9hdWRpby9NYWtlZmls ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjhlYjNiCi0tLSAvZGV2L251 bGwKKysrIGIvc291bmQvaGRtaV9hdWRpby9NYWtlZmlsZQpAQCAtMCwwICsxLDkgQEAKK0RSSVZF Ul9OQU1FIDo9IGhkbWlfYXVkaW8KKworY2NmbGFncy15ICs9IC1JZHJpdmVycy9ncHUvZHJtL2k5 MTUKKworJChEUklWRVJfTkFNRSktb2JqcyArPSBcCisJaW50ZWxfbWlkX2hkbWlfYXVkaW8ubyBc CisJaW50ZWxfbWlkX2hkbWlfYXVkaW9faWYubworCitvYmotbSArPSAkKERSSVZFUl9OQU1FKS5v CmRpZmYgLS1naXQgYS9zb3VuZC9oZG1pX2F1ZGlvL2ludGVsX21pZF9oZG1pX2F1ZGlvLmMgYi9z b3VuZC9oZG1pX2F1ZGlvL2ludGVsX21pZF9oZG1pX2F1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMC4uZjM5NzQzNQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2hkbWlf YXVkaW8vaW50ZWxfbWlkX2hkbWlfYXVkaW8uYwpAQCAtMCwwICsxLDIwMjkgQEAKKy8qCisgKiAg IGludGVsX21pZF9oZG1pX2F1ZGlvLmMgLSBJbnRlbCBIRE1JIGF1ZGlvIGRyaXZlciBmb3IgTUlE CisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBJbnRlbCBDb3JwCisgKiAgQXV0aG9yczoJU2Fp bGFqYSBCYW5kYXJ1cGFsbGkgPHNhaWxhamEuYmFuZGFydXBhbGxpQGludGVsLmNvbT4KKyAqCQlS YW1lc2ggQmFidSBLIFYJPHJhbWVzaC5iYWJ1QGludGVsLmNvbT4KKyAqCQlWYWliaGF2IEFnYXJ3 YWwgPHZhaWJoYXYuYWdhcndhbEBpbnRlbC5jb20+CisgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAq CisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9n cmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1 dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy cmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v cmUgZGV0YWlscy4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICogQUxTQSBkcml2ZXIgZm9y IEludGVsIE1JRCBIRE1JIGF1ZGlvIGNvbnRyb2xsZXIKKyAqLworCisjZGVmaW5lIHByX2ZtdChm bXQpCSJoYWQ6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNp bmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxs aW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8c291bmQv cGNtLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJh bXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CisjaW5jbHVkZSA8c291bmQvY29udHJv bC5oPgorI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KKworI2luY2x1ZGUgImludGVsX21pZF9o ZG1pX2F1ZGlvLmgiCisKKyNkZWZpbmUgUENNX0lOREVYCQkwCisjZGVmaW5lIE1BWF9QQl9TVFJF QU1TCQkxCisjZGVmaW5lIE1BWF9DQVBfU1RSRUFNUwkJMAorI2RlZmluZSBIRE1JX0FVRElPX0RS SVZFUgkiaGRtaS1hdWRpbyIKK3N0YXRpYyBERUZJTkVfTVVURVgoaGFkX211dGV4KTsKKworLypz dGFuZGFyZCBtb2R1bGUgb3B0aW9ucyBmb3IgQUxTQS4gVGhpcyBtb2R1bGUgc3VwcG9ydHMgb25s eSBvbmUgY2FyZCovCitzdGF0aWMgaW50IGhkbWlfY2FyZF9pbmRleCA9IFNORFJWX0RFRkFVTFRf SURYMTsKK3N0YXRpYyBjaGFyICpoZG1pX2NhcmRfaWQgPSBTTkRSVl9ERUZBVUxUX1NUUjE7Citz dGF0aWMgc3RydWN0IHNuZF9pbnRlbGhhZCAqaGFkX2RhdGE7CisKK21vZHVsZV9wYXJhbShoZG1p X2NhcmRfaW5kZXgsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGhkbWlfY2FyZF9pbmRl eCwKKwkJIkluZGV4IHZhbHVlIGZvciBJTlRFTCBJbnRlbCBIRE1JIEF1ZGlvIGNvbnRyb2xsZXIu Iik7Cittb2R1bGVfcGFyYW0oaGRtaV9jYXJkX2lkLCBjaGFycCwgMDQ0NCk7CitNT0RVTEVfUEFS TV9ERVNDKGhkbWlfY2FyZF9pZCwKKwkJIklEIHN0cmluZyBmb3IgSU5URUwgSW50ZWwgSERNSSBB dWRpbyBjb250cm9sbGVyLiIpOworTU9EVUxFX0FVVEhPUigiU2FpbGFqYSBCYW5kYXJ1cGFsbGkg PHNhaWxhamEuYmFuZGFydXBhbGxpQGludGVsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlJhbWVz aCBCYWJ1IEsgViA8cmFtZXNoLmJhYnVAaW50ZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiVmFp YmhhdiBBZ2Fyd2FsIDx2YWliaGF2LmFnYXJ3YWxAaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NS SVBUSU9OKCJJbnRlbCBIRE1JIEF1ZGlvIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2 MiIpOworTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIntJbnRlbCxJbnRlbF9IQUR9Iik7CitNT0RV TEVfVkVSU0lPTihIQURfRFJJVkVSX1ZFUlNJT04pOworCisjZGVmaW5lIElORk9fRlJBTUVfV09S RDEJMHgwMDBhMDE4NAorI2RlZmluZSBGSUZPX1RIUkVTSE9MRAkJMHhGRQorI2RlZmluZSBETUFf RklGT19USFJFU0hPTEQJMHg3CisjZGVmaW5lIEJZVEVTX1BFUl9XT1JECQkweDQKKworLyogU2Ft cGxpbmcgcmF0ZSBhcyBwZXIgSUVDNjA5NTggVmVyIDMgKi8KKyNkZWZpbmUgQ0hfU1RBVFVTX01B UF8zMktIWgkweDMKKyNkZWZpbmUgQ0hfU1RBVFVTX01BUF80NEtIWgkweDAKKyNkZWZpbmUgQ0hf U1RBVFVTX01BUF80OEtIWgkweDIKKyNkZWZpbmUgQ0hfU1RBVFVTX01BUF84OEtIWgkweDgKKyNk ZWZpbmUgQ0hfU1RBVFVTX01BUF85NktIWgkweEEKKyNkZWZpbmUgQ0hfU1RBVFVTX01BUF8xNzZL SFoJMHhDCisjZGVmaW5lIENIX1NUQVRVU19NQVBfMTkyS0haCTB4RQorCisjZGVmaW5lIE1BWF9T TVBMX1dJRFRIXzIwCTB4MAorI2RlZmluZSBNQVhfU01QTF9XSURUSF8yNAkweDEKKyNkZWZpbmUg U01QTF9XSURUSF8xNkJJVFMJMHgxCisjZGVmaW5lIFNNUExfV0lEVEhfMjRCSVRTCTB4NQorI2Rl ZmluZSBDSEFOTkVMX0FMTE9DQVRJT04JMHgxRgorI2RlZmluZSBNQVNLX0JZVEUwCQkweDAwMDAw MEZGCisjZGVmaW5lIFZBTElEX0RJUF9XT1JEUwkJMworI2RlZmluZSBMQVlPVVQwCQkJMAorI2Rl ZmluZSBMQVlPVVQxCQkJMQorI2RlZmluZSBTV0FQX0xGRV9DRU5URVIJCTB4MDBmYWM0YzgKKyNk ZWZpbmUgQVVEX0NPTkZJR19DSF9NQVNLX1YyCTB4NzAKKworLyoKKyAqIEVMRCBTQSBiaXRzIGlu IHRoZSBDRUEgU3BlYWtlciBBbGxvY2F0aW9uIGRhdGEgYmxvY2sKKyovCitzdGF0aWMgaW50IGVs ZF9zcGVha2VyX2FsbG9jYXRpb25fYml0c1tdID0geworCVswXSA9IEZMIHwgRlIsCisJWzFdID0g TEZFLAorCVsyXSA9IEZDLAorCVszXSA9IFJMIHwgUlIsCisJWzRdID0gUkMsCisJWzVdID0gRkxD IHwgRlJDLAorCVs2XSA9IFJMQyB8IFJSQywKKwkvKiB0aGUgZm9sbG93aW5nIGFyZSBub3QgZGVm aW5lZCBpbiBFTEQgeWV0ICovCisJWzddID0gMCwKK307CisKKy8qCisgKiBUaGlzIGlzIGFuIG9y ZGVyZWQgbGlzdCEKKyAqCisgKiBUaGUgcHJlY2VkaW5nIG9uZXMgaGF2ZSBiZXR0ZXIgY2hhbmNl cyB0byBiZSBzZWxlY3RlZCBieQorICogaGRtaV9jaGFubmVsX2FsbG9jYXRpb24oKS4KKyAqLwor c3RhdGljIHN0cnVjdCBjZWFfY2hhbm5lbF9zcGVha2VyX2FsbG9jYXRpb24gY2hhbm5lbF9hbGxv Y2F0aW9uc1tdID0geworLyogICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsOiAgIDcgICAg IDYgICAgNSAgICA0ICAgIDMgICAgIDIgICAgMSAgICAwICAqLworeyAuY2FfaW5kZXggPSAweDAw LCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICBGUiwgIEZM IH0gfSwKKwkJCQkvKiAyLjEgKi8KK3sgLmNhX2luZGV4ID0gMHgwMSwgIC5zcGVha2VycyA9IHsg ICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgTEZFLCAgRlIsICBGTCB9IH0sCisJCQkJLyogRG9s YnkgU3Vycm91bmQgKi8KK3sgLmNhX2luZGV4ID0gMHgwMiwgIC5zcGVha2VycyA9IHsgICAwLCAg ICAwLCAgIDAsICAgMCwgIEZDLCAgICAwLCAgRlIsICBGTCB9IH0sCisJCQkJLyogc3Vycm91bmQ0 MCAqLworeyAuY2FfaW5kZXggPSAweDA4LCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICBSUiwg IFJMLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKKwkJCQkvKiBzdXJyb3VuZDQxICovCit7IC5j YV9pbmRleCA9IDB4MDksICAuc3BlYWtlcnMgPSB7ICAgMCwgICAgMCwgIFJSLCAgUkwsICAgMCwg IExGRSwgIEZSLCAgRkwgfSB9LAorCQkJCS8qIHN1cnJvdW5kNTAgKi8KK3sgLmNhX2luZGV4ID0g MHgwYSwgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgUlIsICBSTCwgIEZDLCAgICAwLCAgRlIs ICBGTCB9IH0sCisJCQkJLyogc3Vycm91bmQ1MSAqLworeyAuY2FfaW5kZXggPSAweDBiLCAgLnNw ZWFrZXJzID0geyAgIDAsICAgIDAsICBSUiwgIFJMLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwK KwkJCQkvKiA2LjEgKi8KK3sgLmNhX2luZGV4ID0gMHgwZiwgIC5zcGVha2VycyA9IHsgICAwLCAg IFJDLCAgUlIsICBSTCwgIEZDLCAgTEZFLCAgRlIsICBGTCB9IH0sCisJCQkJLyogc3Vycm91bmQ3 MSAqLworeyAuY2FfaW5kZXggPSAweDEzLCAgLnNwZWFrZXJzID0geyBSUkMsICBSTEMsICBSUiwg IFJMLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwKKworeyAuY2FfaW5kZXggPSAweDAzLCAgLnNw ZWFrZXJzID0geyAgIDAsICAgIDAsICAgMCwgICAwLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwK K3sgLmNhX2luZGV4ID0gMHgwNCwgIC5zcGVha2VycyA9IHsgICAwLCAgICAwLCAgIDAsICBSQywg ICAwLCAgICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MDUsICAuc3BlYWtlcnMg PSB7ICAgMCwgICAgMCwgICAwLCAgUkMsICAgMCwgIExGRSwgIEZSLCAgRkwgfSB9LAoreyAuY2Ff aW5kZXggPSAweDA2LCAgLnNwZWFrZXJzID0geyAgIDAsICAgIDAsICAgMCwgIFJDLCAgRkMsICAg IDAsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgwNywgIC5zcGVha2VycyA9IHsgICAw LCAgICAwLCAgIDAsICBSQywgIEZDLCAgTEZFLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9 IDB4MGMsICAuc3BlYWtlcnMgPSB7ICAgMCwgICBSQywgIFJSLCAgUkwsICAgMCwgICAgMCwgIEZS LCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDBkLCAgLnNwZWFrZXJzID0geyAgIDAsICAgUkMs ICBSUiwgIFJMLCAgIDAsICBMRkUsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgwZSwg IC5zcGVha2VycyA9IHsgICAwLCAgIFJDLCAgUlIsICBSTCwgIEZDLCAgICAwLCAgRlIsICBGTCB9 IH0sCit7IC5jYV9pbmRleCA9IDB4MTAsICAuc3BlYWtlcnMgPSB7IFJSQywgIFJMQywgIFJSLCAg UkwsICAgMCwgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDExLCAgLnNwZWFr ZXJzID0geyBSUkMsICBSTEMsICBSUiwgIFJMLCAgIDAsICBMRkUsICBGUiwgIEZMIH0gfSwKK3sg LmNhX2luZGV4ID0gMHgxMiwgIC5zcGVha2VycyA9IHsgUlJDLCAgUkxDLCAgUlIsICBSTCwgIEZD LCAgICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MTQsICAuc3BlYWtlcnMgPSB7 IEZSQywgIEZMQywgICAwLCAgIDAsICAgMCwgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5k ZXggPSAweDE1LCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICAgMCwgICAwLCAgIDAsICBMRkUs ICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxNiwgIC5zcGVha2VycyA9IHsgRlJDLCAg RkxDLCAgIDAsICAgMCwgIEZDLCAgICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4 MTcsICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgICAwLCAgIDAsICBGQywgIExGRSwgIEZSLCAg RkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDE4LCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICAg MCwgIFJDLCAgIDAsICAgIDAsICBGUiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxOSwgIC5z cGVha2VycyA9IHsgRlJDLCAgRkxDLCAgIDAsICBSQywgICAwLCAgTEZFLCAgRlIsICBGTCB9IH0s Cit7IC5jYV9pbmRleCA9IDB4MWEsICAuc3BlYWtlcnMgPSB7IEZSQywgIEZMQywgICAwLCAgUkMs ICBGQywgICAgMCwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXggPSAweDFiLCAgLnNwZWFrZXJz ID0geyBGUkMsICBGTEMsICAgMCwgIFJDLCAgRkMsICBMRkUsICBGUiwgIEZMIH0gfSwKK3sgLmNh X2luZGV4ID0gMHgxYywgIC5zcGVha2VycyA9IHsgRlJDLCAgRkxDLCAgUlIsICBSTCwgICAwLCAg ICAwLCAgRlIsICBGTCB9IH0sCit7IC5jYV9pbmRleCA9IDB4MWQsICAuc3BlYWtlcnMgPSB7IEZS QywgIEZMQywgIFJSLCAgUkwsICAgMCwgIExGRSwgIEZSLCAgRkwgfSB9LAoreyAuY2FfaW5kZXgg PSAweDFlLCAgLnNwZWFrZXJzID0geyBGUkMsICBGTEMsICBSUiwgIFJMLCAgRkMsICAgIDAsICBG UiwgIEZMIH0gfSwKK3sgLmNhX2luZGV4ID0gMHgxZiwgIC5zcGVha2VycyA9IHsgRlJDLCAgRkxD LCAgUlIsICBSTCwgIEZDLCAgTEZFLCAgRlIsICBGTCB9IH0sCit9OworCitzdGF0aWMgc3RydWN0 IGNoYW5uZWxfbWFwX3RhYmxlIG1hcF90YWJsZXNbXSA9IHsKKwl7IFNORFJWX0NITUFQX0ZMLCAg ICAgICAweDAwLCAgIEZMIH0sCisJeyBTTkRSVl9DSE1BUF9GUiwgICAgICAgMHgwMSwgICBGUiB9 LAorCXsgU05EUlZfQ0hNQVBfUkwsICAgICAgIDB4MDQsICAgUkwgfSwKKwl7IFNORFJWX0NITUFQ X1JSLCAgICAgICAweDA1LCAgIFJSIH0sCisJeyBTTkRSVl9DSE1BUF9MRkUsICAgICAgMHgwMiwg ICBMRkUgfSwKKwl7IFNORFJWX0NITUFQX0ZDLCAgICAgICAweDAzLCAgIEZDIH0sCisJeyBTTkRS Vl9DSE1BUF9STEMsICAgICAgMHgwNiwgICBSTEMgfSwKKwl7IFNORFJWX0NITUFQX1JSQywgICAg ICAweDA3LCAgIFJSQyB9LAorCXt9IC8qIHRlcm1pbmF0b3IgKi8KK307CisKKy8qIGhhcmR3YXJl IGNhcGFiaWxpdHkgc3RydWN0dXJlICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFy ZHdhcmUgc25kX2ludGVsX2hhZHN0cmVhbSA9IHsKKwkuaW5mbyA9CShTTkRSVl9QQ01fSU5GT19J TlRFUkxFQVZFRCB8CisJCVNORFJWX1BDTV9JTkZPX0RPVUJMRSB8CisJCVNORFJWX1BDTV9JTkZP X01NQVB8CisJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQlTTkRSVl9QQ01fSU5GT19C QVRDSCksCisJLmZvcm1hdHMgPSAoU05EUlZfUENNX0ZNVEJJVF9TMjQgfAorCQlTTkRSVl9QQ01f Rk1UQklUX1UyNCksCisJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfMzIwMDAgfAorCQlTTkRSVl9Q Q01fUkFURV80NDEwMCB8CisJCVNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKKwkJU05EUlZfUENNX1JB VEVfODgyMDAgfAorCQlTTkRSVl9QQ01fUkFURV85NjAwMCB8CisJCVNORFJWX1BDTV9SQVRFXzE3 NjQwMCB8CisJCVNORFJWX1BDTV9SQVRFXzE5MjAwMCwKKwkucmF0ZV9taW4gPSBIQURfTUlOX1JB VEUsCisJLnJhdGVfbWF4ID0gSEFEX01BWF9SQVRFLAorCS5jaGFubmVsc19taW4gPSBIQURfTUlO X0NIQU5ORUwsCisJLmNoYW5uZWxzX21heCA9IEhBRF9NQVhfQ0hBTk5FTCwKKwkuYnVmZmVyX2J5 dGVzX21heCA9IEhBRF9NQVhfQlVGRkVSLAorCS5wZXJpb2RfYnl0ZXNfbWluID0gSEFEX01JTl9Q RVJJT0RfQllURVMsCisJLnBlcmlvZF9ieXRlc19tYXggPSBIQURfTUFYX1BFUklPRF9CWVRFUywK KwkucGVyaW9kc19taW4gPSBIQURfTUlOX1BFUklPRFMsCisJLnBlcmlvZHNfbWF4ID0gSEFEX01B WF9QRVJJT0RTLAorCS5maWZvX3NpemUgPSBIQURfRklGT19TSVpFLAorfTsKKworLyogUmVnaXN0 ZXIgYWNjZXNzIGZ1bmN0aW9ucyAqLworCitpbmxpbmUgaW50IGhhZF9nZXRfaHdzdGF0ZShzdHJ1 Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJLyogQ2hlY2sgZm9yIGRldmljZSBw cmVzZW5jZSAtU1cgc3RhdGUgKi8KKwlpZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID09IEhB RF9EUlZfRElTQ09OTkVDVEVEKSB7CisJCXByX2RlYnVnKCIlczpEZXZpY2Ugbm90IGNvbm5lY3Rl ZDolZFxuIiwgX19mdW5jX18sCisJCQkJaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzKTsKKwkJcmV0 dXJuIC1FTk9ERVY7CisJfQorCisJLyogQ2hlY2sgZm9yIGRldmljZSBwcmVzZW5jZSAtSFcgc3Rh dGUgKi8KKwlpZiAoIW9zcG1fcG93ZXJfaXNfaHdfb24oT1NQTV9ESVNQTEFZX0lTTEFORCkpIHsK KwkJcHJfZXJyKCIlczpEZXZpY2Ugbm90IGNvbm5lY3RlZFxuIiwgX19mdW5jX18pOworCQkvKiBI T1RfVU5QTFVHIGV2ZW50IGNhbiBiZSBzZW50IHRvCisJCSAqIG1haW50YWluIGNvcnJlY3Qgc3Rh dGUgd2l0aGluIEhBRAorCQkgKiBoYWRfZXZlbnRfaGFuZGxlcihIQURfRVZFTlRfSE9UX1VOUExV RywgaW50ZWxoYWRkYXRhKTsKKwkJICogRHJvcCBhbGwgYWN1aXJlZCBsb2NrcyBiZWZvcmUgZXhl Y3V0aW5nIHRoaXMuCisJCSAqLworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsK K30KKworaW5saW5lIGludCBoYWRfZ2V0X2NhcHMoZW51bSBoYWRfY2Fwc19saXN0IHF1ZXJ5LCB2 b2lkICpjYXBzKQoreworCWludCByZXR2YWw7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxo YWRkYXRhID0gaGFkX2RhdGE7CisKKwlyZXR2YWwgPSBoYWRfZ2V0X2h3c3RhdGUoaW50ZWxoYWRk YXRhKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gaW50ZWxoYWRkYXRhLT5xdWVyeV9vcHMu aGRtaV9hdWRpb19nZXRfY2FwcyhxdWVyeSwKKwkJCQljYXBzKTsKKworCXJldHVybiByZXR2YWw7 Cit9CisKK2lubGluZSBpbnQgaGFkX3NldF9jYXBzKGVudW0gaGFkX2NhcHNfbGlzdCBzZXRfZWxl bWVudCwgdm9pZCAqY2FwcykKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBzbmRfaW50ZWxoYWQg KmludGVsaGFkZGF0YSA9IGhhZF9kYXRhOworCisJcmV0dmFsID0gaGFkX2dldF9od3N0YXRlKGlu dGVsaGFkZGF0YSk7CisJaWYgKCFyZXR2YWwpCisJCXJldHZhbCA9IGludGVsaGFkZGF0YS0+cXVl cnlfb3BzLmhkbWlfYXVkaW9fc2V0X2NhcHMoCisJCQkJc2V0X2VsZW1lbnQsIGNhcHMpOworCisJ cmV0dXJuIHJldHZhbDsKK30KKworaW5saW5lIGludCBoYWRfcmVhZF9yZWdpc3Rlcih1aW50MzJf dCBvZmZzZXQsIHVpbnQzMl90ICpkYXRhKQoreworCWludCByZXR2YWw7CisJc3RydWN0IHNuZF9p bnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gaGFkX2RhdGE7CisJdTMyIGJhc2VfYWRkciA9IGludGVs aGFkZGF0YS0+YXVkaW9fcmVnX2Jhc2U7CisKKwlyZXR2YWwgPSBoYWRfZ2V0X2h3c3RhdGUoaW50 ZWxoYWRkYXRhKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gaW50ZWxoYWRkYXRhLT5yZWdf b3BzLmhkbWlfYXVkaW9fcmVhZF9yZWdpc3RlcigKKwkJCQliYXNlX2FkZHIgKyBvZmZzZXQsIGRh dGEpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworaW5saW5lIGludCBoYWRfd3JpdGVfcmVnaXN0 ZXIodWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBkYXRhKQoreworCWludCByZXR2YWw7CisJc3Ry dWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gaGFkX2RhdGE7CisJdTMyIGJhc2VfYWRk ciA9IGludGVsaGFkZGF0YS0+YXVkaW9fcmVnX2Jhc2U7CisKKwlyZXR2YWwgPSBoYWRfZ2V0X2h3 c3RhdGUoaW50ZWxoYWRkYXRhKTsKKwlpZiAoIXJldHZhbCkKKwkJcmV0dmFsID0gaW50ZWxoYWRk YXRhLT5yZWdfb3BzLmhkbWlfYXVkaW9fd3JpdGVfcmVnaXN0ZXIoCisJCQkJYmFzZV9hZGRyICsg b2Zmc2V0LCBkYXRhKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2lubGluZSBpbnQgaGFkX3Jl YWRfbW9kaWZ5KHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgZGF0YSwgdWludDMyX3QgbWFzaykK K3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IGhh ZF9kYXRhOworCXUzMiBiYXNlX2FkZHIgPSBpbnRlbGhhZGRhdGEtPmF1ZGlvX3JlZ19iYXNlOwor CisJcmV0dmFsID0gaGFkX2dldF9od3N0YXRlKGludGVsaGFkZGF0YSk7CisJaWYgKCFyZXR2YWwp CisJCXJldHZhbCA9IGludGVsaGFkZGF0YS0+cmVnX29wcy5oZG1pX2F1ZGlvX3JlYWRfbW9kaWZ5 KAorCQkJCWJhc2VfYWRkciArIG9mZnNldCwgZGF0YSwgbWFzayk7CisKKwlyZXR1cm4gcmV0dmFs OworfQorLyoqCisgKiBoYWRfcmVhZF9tb2RpZnlfYXVkX2NvbmZpZ192MiAtIFNwZWNpZmljIGZ1 bmN0aW9uIHRvIHJlYWQtbW9kaWZ5IEFVRF9DT05GSUcKKyAqIHJlZ2lzdGVyIG9uIFZMVjIuVGhl IGhhZF9yZWFkX21vZGlmeSgpIGZ1bmN0aW9uIHNob3VsZCBub3QgZGlyZWN0bHkgYmUgdXNlZAor ICogb24gVkxWMiBmb3IgdXBkYXRpbmcgQVVEX0NPTkZJRyByZWdpc3Rlci4KKyAqIFRoaXMgaXMg YmVjYXVzZToKKyAqIEJpdDYgb2YgQVVEX0NPTkZJRyByZWdpc3RlciBpcyB3cml0ZW9ubHkgZHVl IHRvIGEgc2lsaWNvbiBidWcgb24gVkxWMiBIRE1JIElQLgorICogQXMgYSByZXN1bHQgYSByZWFk LW1vZGlmeSBvZiBBVURfQ09ORklHIHJlZ2l0ZXIgd2lsbCBhbHdheXMgY2xlYXIgYml0Ni4KKyAq IEFVRF9DT05GSUdbNjo0XSByZXByZXNlbnRzIHRoZSAiY2hhbm5lbHMiIGZpZWxkIG9mIHRoZSBy ZWdpc3Rlci4KKyAqIFRoaXMgZmllbGQgc2hvdWxkIGJlIDF4eSBiaW5hcnkgZm9yIGNvbmZpZ3Vy YXRpb24gd2l0aCA2IG9yIG1vcmUgY2hhbm5lbHMuCisgKiBSZWFkLW1vZGlmeSBvZiBBVURfQ09O RklHIChFZy4gZm9yIGVuYWJsaW5nIGF1ZGlvKSBjYXVzZXMgdGhlICJjaGFubmVscyIgZmllbGQK KyAqIHRvIGJlIHVwZGF0ZWQgYXMgMHh5IGJpbmFyeSByZXN1bHRpbmcgaW4gYmFkIGF1ZGlvLgor ICogVGhlIGZpeCBpcyB0byBhbHdheXMgd3JpdGUgdGhlIEFVRF9DT05GSUdbNjo0XSB3aXRoIGFw cHJvcHJpYXRlIHZhbHVlIHdoZW4KKyAqIGRvaW5nIHJlYWQtbW9kaWZ5IG9mIEFVRF9DT05GSUcg cmVnaXN0ZXIuCisgKgorICogQHN1YnN0cmVhbTogdGhlIGN1cnJlbnQgc3Vic3RyZWFtIG9yIE5V TEwgaWYgbm8gYWN0aXZlIHN1YnN0cmVhbQorICogQGRhdGEgOiBkYXRhIHRvIGJlIHdyaXR0ZW4K KyAqIEBtYXNrIDogbWFzaworICoKKyAqLworaW5saW5lIGludCBoYWRfcmVhZF9tb2RpZnlfYXVk X2NvbmZpZ192MihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJdWlu dDMyX3QgZGF0YSwgdWludDMyX3QgbWFzaykKK3sKKwl1bmlvbiBhdWRfY2ZnIGNmZ192YWwgPSB7 LmNmZ19yZWd2YWwgPSAwfTsKKwl1OCBjaGFubmVsczsKKworCS8qCisJICogSWYgc3Vic3RyZWFt IGlzIE5VTEwsIHRoZXJlIGlzIG5vIGFjdGl2ZSBzdHJlYW0uCisJICogSW4gdGhpcyBjYXNlIGp1 c3Qgc2V0IGNoYW5uZWxzIHRvIDIKKwkgKi8KKwlpZiAoc3Vic3RyZWFtKQorCQljaGFubmVscyA9 IHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CisJZWxzZQorCQljaGFubmVscyA9IDI7CisJ Y2ZnX3ZhbC5jZmdfcmVneF92Mi5udW1fY2ggPSBjaGFubmVscyAtIDI7CisKKwlkYXRhID0gZGF0 YSB8IGNmZ192YWwuY2ZnX3JlZ3ZhbDsKKwltYXNrID0gbWFzayB8IEFVRF9DT05GSUdfQ0hfTUFT S19WMjsKKworCXByX2RlYnVnKCIlcyA6IGRhdGEgPSAleCwgbWFzayA9JXhcbiIsIF9fZnVuY19f LCBkYXRhLCBtYXNrKTsKKworCXJldHVybiBoYWRfcmVhZF9tb2RpZnkoQVVEX0NPTkZJRywgZGF0 YSwgbWFzayk7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX2VuYWJsZV9hdWRpb192MSAtIHRv IGVuYWJsZSBhdWRpbworICoKKyAqIEBzdWJzdHJlYW06IEN1cnJlbnQgc3Vic3RyZWFtIG9yIE5V TEwgaWYgbm8gYWN0aXZlIHN1YnN0cmVhbS4KKyAqIEBlbmFibGU6IDEgaWYgYXVkaW8gaXMgdG8g YmUgZW5hYmxlZDsgMCBpZiBhdWRpbyBpcyB0byBiZSBkaXNhYmxlZC4KKyAqCisgKi8KK3N0YXRp YyB2b2lkIHNuZF9pbnRlbGhhZF9lbmFibGVfYXVkaW9fdjEoc3RydWN0IHNuZF9wY21fc3Vic3Ry ZWFtICpzdWJzdHJlYW0sCisJCQkJCXU4IGVuYWJsZSkKK3sKKwloYWRfcmVhZF9tb2RpZnkoQVVE X0NPTkZJRywgZW5hYmxlLCBCSVQoMCkpOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9lbmFi bGVfYXVkaW9fdjIgLSB0byBlbmFibGUgYXVkaW8KKyAqCisgKiBAc3Vic3RyZWFtOiBDdXJyZW50 IHN1YnN0cmVhbSBvciBOVUxMIGlmIG5vIGFjdGl2ZSBzdWJzdHJlYW0uCisgKiBAZW5hYmxlOiAx IGlmIGF1ZGlvIGlzIHRvIGJlIGVuYWJsZWQ7IDAgaWYgYXVkaW8gaXMgdG8gYmUgZGlzYWJsZWQu CisgKi8KK3N0YXRpYyB2b2lkIHNuZF9pbnRlbGhhZF9lbmFibGVfYXVkaW9fdjIoc3RydWN0IHNu ZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCXU4IGVuYWJsZSkKK3sKKwloYWRfcmVh ZF9tb2RpZnlfYXVkX2NvbmZpZ192MihzdWJzdHJlYW0sIGVuYWJsZSwgQklUKDApKTsKK30KKwor LyoqCisgKiBzbmRfaW50ZWxoYWRfcmVzZXRfYXVkaW9fdjEgLSB0byByZXNldCBhdWRpbyBzdWJz eXN0ZW0KKyAqCisgKiBAcmVzZXQ6IDEgdG8gcmVzZXQgYXVkaW87IDAgdG8gYnJpbmcgYXVkaW8g b3V0IG9mIHJlc2V0LgorICoKKyAqLworc3RhdGljIHZvaWQgc25kX2ludGVsaGFkX3Jlc2V0X2F1 ZGlvX3YxKHU4IHJlc2V0KQoreworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSV9TVEFUVVMs IHJlc2V0KTsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfcmVzZXRfYXVkaW9fdjIgLSB0byBy ZXNldCBhdWRpbyBzdWJzeXN0ZW0KKyAqCisgKiBAcmVzZXQ6IDEgdG8gcmVzZXQgYXVkaW87IDAg dG8gYnJpbmcgYXVkaW8gb3V0IG9mIHJlc2V0LgorICoKKyAqLworc3RhdGljIHZvaWQgc25kX2lu dGVsaGFkX3Jlc2V0X2F1ZGlvX3YyKHU4IHJlc2V0KQoreworCWhhZF93cml0ZV9yZWdpc3RlcihB VURfSERNSV9TVEFUVVNfdjIsIHJlc2V0KTsKK30KKworLyoqCisgKiBoYWRfcHJvZ19zdGF0dXNf cmVnIC0gdG8gaW5pdGlhbGl6ZSBhdWRpbyBjaGFubmVsIHN0YXR1cyByZWdpc3RlcnMKKyAqCisg KiBAc3Vic3RyZWFtOnN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIHByZXBhcmUgZnVuY3Rpb24gaXMg Y2FsbGVkCisgKiBAaW50ZWxoYWRkYXRhOnN1YnN0cmVhbSBwcml2YXRlIGRhdGEKKyAqCisgKiBU aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgcHJlcGFyZSBjYWxsYmFjaworICovCitzdGF0 aWMgaW50IGhhZF9wcm9nX3N0YXR1c19yZWcoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJz dHJlYW0sCisJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJdW5pb24g YXVkX2NoX3N0YXR1c18wIGNoX3N0YXQwID0gey5zdGF0dXNfMF9yZWd2YWwgPSAwfTsKKwl1bmlv biBhdWRfY2hfc3RhdHVzXzEgY2hfc3RhdDEgPSB7LnN0YXR1c18xX3JlZ3ZhbCA9IDB9OworCWlu dCBmb3JtYXQ7CisKKwlwcl9kZWJ1ZygiRW50cnkgJXNcbiIsIF9fZnVuY19fKTsKKworCWNoX3N0 YXQwLnN0YXR1c18wX3JlZ3gubHBjbV9pZCA9IChpbnRlbGhhZGRhdGEtPmFlc19iaXRzICYKKwkJ CQkJCUlFQzk1OF9BRVMwX05PTkFVRElPKT4+MTsKKwljaF9zdGF0MC5zdGF0dXNfMF9yZWd4LmNs a19hY2MgPSAoaW50ZWxoYWRkYXRhLT5hZXNfYml0cyAmCisJCQkJCQlJRUM5NThfQUVTM19DT05f Q0xPQ0spPj40OworCXN3aXRjaCAoc3Vic3RyZWFtLT5ydW50aW1lLT5yYXRlKSB7CisJY2FzZSBB VURfU0FNUExFX1JBVEVfMzI6CisJCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0g Q0hfU1RBVFVTX01BUF8zMktIWjsKKwkJYnJlYWs7CisKKwljYXNlIEFVRF9TQU1QTEVfUkFURV80 NF8xOgorCQljaF9zdGF0MC5zdGF0dXNfMF9yZWd4LnNhbXBfZnJlcSA9IENIX1NUQVRVU19NQVBf NDRLSFo7CisJCWJyZWFrOworCWNhc2UgQVVEX1NBTVBMRV9SQVRFXzQ4OgorCQljaF9zdGF0MC5z dGF0dXNfMF9yZWd4LnNhbXBfZnJlcSA9IENIX1NUQVRVU19NQVBfNDhLSFo7CisJCWJyZWFrOwor CWNhc2UgQVVEX1NBTVBMRV9SQVRFXzg4XzI6CisJCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guc2Ft cF9mcmVxID0gQ0hfU1RBVFVTX01BUF84OEtIWjsKKwkJYnJlYWs7CisJY2FzZSBBVURfU0FNUExF X1JBVEVfOTY6CisJCWNoX3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVT X01BUF85NktIWjsKKwkJYnJlYWs7CisJY2FzZSBBVURfU0FNUExFX1JBVEVfMTc2XzQ6CisJCWNo X3N0YXQwLnN0YXR1c18wX3JlZ3guc2FtcF9mcmVxID0gQ0hfU1RBVFVTX01BUF8xNzZLSFo7CisJ CWJyZWFrOworCWNhc2UgQVVEX1NBTVBMRV9SQVRFXzE5MjoKKwkJY2hfc3RhdDAuc3RhdHVzXzBf cmVneC5zYW1wX2ZyZXEgPSBDSF9TVEFUVVNfTUFQXzE5MktIWjsKKwkJYnJlYWs7CisKKwlkZWZh dWx0OgorCQkvKiBjb250cm9sIHNob3VsZCBuZXZlciBjb21lIGhlcmUgKi8KKwkJcmV0dXJuIC1F SU5WQUw7CisJYnJlYWs7CisKKwl9CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DSF9TVEFUVVNf MCwgY2hfc3RhdDAuc3RhdHVzXzBfcmVndmFsKTsKKworCWZvcm1hdCA9IHN1YnN0cmVhbS0+cnVu dGltZS0+Zm9ybWF0OworCisJaWYgKGZvcm1hdCA9PSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSkg eworCQljaF9zdGF0MS5zdGF0dXNfMV9yZWd4Lm1heF93cmRfbGVuID0gTUFYX1NNUExfV0lEVEhf MjA7CisJCWNoX3N0YXQxLnN0YXR1c18xX3JlZ3gud3JkX2xlbiA9IFNNUExfV0lEVEhfMTZCSVRT OworCX0gZWxzZSBpZiAoZm9ybWF0ID09IFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKSB7CisJCWNo X3N0YXQxLnN0YXR1c18xX3JlZ3gubWF4X3dyZF9sZW4gPSBNQVhfU01QTF9XSURUSF8yNDsKKwkJ Y2hfc3RhdDEuc3RhdHVzXzFfcmVneC53cmRfbGVuID0gU01QTF9XSURUSF8yNEJJVFM7CisJfSBl bHNlIHsKKwkJY2hfc3RhdDEuc3RhdHVzXzFfcmVneC5tYXhfd3JkX2xlbiA9IDA7CisJCWNoX3N0 YXQxLnN0YXR1c18xX3JlZ3gud3JkX2xlbiA9IDA7CisJfQorCWhhZF93cml0ZV9yZWdpc3RlcihB VURfQ0hfU1RBVFVTXzEsIGNoX3N0YXQxLnN0YXR1c18xX3JlZ3ZhbCk7CisJcmV0dXJuIDA7Cit9 CisKKy8qKgorICogc25kX2ludGVsaGFkX3Byb2dfYXVkaW9fY3RybF92MiAtIHRvIGluaXRpYWxp emUgYXVkaW8KKyAqIHJlZ2lzdGVycyBhbmQgYnVmZmVyIGNvbmZnaXVyYXRpb24gcmVnaXN0ZXJz CisgKgorICogQHN1YnN0cmVhbTpzdWJzdHJlYW0gZm9yIHdoaWNoIHRoZSBwcmVwYXJlIGZ1bmN0 aW9uIGlzIGNhbGxlZAorICogQGludGVsaGFkZGF0YTpzdWJzdHJlYW0gcHJpdmF0ZSBkYXRhCisg KgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIHByZXBhcmUgY2FsbGJhY2sKKyAq LworaW50IHNuZF9pbnRlbGhhZF9wcm9nX2F1ZGlvX2N0cmxfdjIoc3RydWN0IHNuZF9wY21fc3Vi c3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0 YSkKK3sKKwl1bmlvbiBhdWRfY2ZnIGNmZ192YWwgPSB7LmNmZ19yZWd2YWwgPSAwfTsKKwl1bmlv biBhdWRfYnVmX2NvbmZpZyBidWZfY2ZnID0gey5idWZfY2ZndmFsID0gMH07CisJdTggY2hhbm5l bHM7CisKKwloYWRfcHJvZ19zdGF0dXNfcmVnKHN1YnN0cmVhbSwgaW50ZWxoYWRkYXRhKTsKKwor CWJ1Zl9jZmcuYnVmX2NmZ19yZWd4X3YyLmF1ZGlvX2ZpZm9fd2F0ZXJtYXJrID0gRklGT19USFJF U0hPTEQ7CisJYnVmX2NmZy5idWZfY2ZnX3JlZ3hfdjIuZG1hX2ZpZm9fd2F0ZXJtYXJrID0gRE1B X0ZJRk9fVEhSRVNIT0xEOworCWJ1Zl9jZmcuYnVmX2NmZ19yZWd4X3YyLmF1ZF9kZWxheSA9IDA7 CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9CVUZfQ09ORklHLCBidWZfY2ZnLmJ1Zl9jZmd2YWwp OworCisJY2hhbm5lbHMgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzOworCWNmZ192YWwu Y2ZnX3JlZ3hfdjIubnVtX2NoID0gY2hhbm5lbHMgLSAyOworCWlmIChjaGFubmVscyA8PSAyKQor CQljZmdfdmFsLmNmZ19yZWd4X3YyLmxheW91dCA9IExBWU9VVDA7CisJZWxzZQorCQljZmdfdmFs LmNmZ19yZWd4X3YyLmxheW91dCA9IExBWU9VVDE7CisKKwljZmdfdmFsLmNmZ19yZWd4X3YyLnZh bF9iaXQgPSAxOworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfQ09ORklHLCBjZmdfdmFsLmNmZ19y ZWd2YWwpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9wcm9nX2F1ZGlv X2N0cmxfdjEgLSB0byBpbml0aWFsaXplIGF1ZGlvCisgKiByZWdpc3RlcnMgYW5kIGJ1ZmZlciBj b25mZ2l1cmF0aW9uIHJlZ2lzdGVycworICoKKyAqIEBzdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3 aGljaCB0aGUgcHJlcGFyZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqIEBpbnRlbGhhZGRhdGE6c3Vi c3RyZWFtIHByaXZhdGUgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRo ZSBwcmVwYXJlIGNhbGxiYWNrCisgKi8KK2ludCBzbmRfaW50ZWxoYWRfcHJvZ19hdWRpb19jdHJs X3YxKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQlzdHJ1Y3Qgc25k X2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJdW5pb24gYXVkX2NmZyBjZmdfdmFsID0gey5j ZmdfcmVndmFsID0gMH07CisJdW5pb24gYXVkX2J1Zl9jb25maWcgYnVmX2NmZyA9IHsuYnVmX2Nm Z3ZhbCA9IDB9OworCXU4IGNoYW5uZWxzOworCisJaGFkX3Byb2dfc3RhdHVzX3JlZyhzdWJzdHJl YW0sIGludGVsaGFkZGF0YSk7CisKKwlidWZfY2ZnLmJ1Zl9jZmdfcmVneC5maWZvX3dpZHRoID0g RklGT19USFJFU0hPTEQ7CisJYnVmX2NmZy5idWZfY2ZnX3JlZ3guYXVkX2RlbGF5ID0gMDsKKwlo YWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9DT05GSUcsIGJ1Zl9jZmcuYnVmX2NmZ3ZhbCk7CisK KwljaGFubmVscyA9IHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CisKKwlzd2l0Y2ggKGNo YW5uZWxzKSB7CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJY2ZnX3ZhbC5jZmdfcmVneC5udW1fY2gg PSBDSF9TVEVSRU87CisJCWNmZ192YWwuY2ZnX3JlZ3gubGF5b3V0ID0gTEFZT1VUMDsKKwlicmVh azsKKworCWNhc2UgMzoKKwljYXNlIDQ6CisJCWNmZ192YWwuY2ZnX3JlZ3gubnVtX2NoID0gQ0hf VEhSRUVfRk9VUjsKKwkJY2ZnX3ZhbC5jZmdfcmVneC5sYXlvdXQgPSBMQVlPVVQxOworCWJyZWFr OworCisJY2FzZSA1OgorCWNhc2UgNjoKKwkJY2ZnX3ZhbC5jZmdfcmVneC5udW1fY2ggPSBDSF9G SVZFX1NJWDsKKwkJY2ZnX3ZhbC5jZmdfcmVneC5sYXlvdXQgPSBMQVlPVVQxOworCWJyZWFrOwor CisJY2FzZSA3OgorCWNhc2UgODoKKwkJY2ZnX3ZhbC5jZmdfcmVneC5udW1fY2ggPSBDSF9TRVZF Tl9FSUdIVDsKKwkJY2ZnX3ZhbC5jZmdfcmVneC5sYXlvdXQgPSBMQVlPVVQxOworCWJyZWFrOwor CisJfQorCisJY2ZnX3ZhbC5jZmdfcmVneC52YWxfYml0ID0gMTsKKwloYWRfd3JpdGVfcmVnaXN0 ZXIoQVVEX0NPTkZJRywgY2ZnX3ZhbC5jZmdfcmVndmFsKTsKKwlyZXR1cm4gMDsKK30KKy8qCisg KiBDb21wdXRlIGRlcml2ZWQgdmFsdWVzIGluIGNoYW5uZWxfYWxsb2NhdGlvbnNbXS4KKyAqLwor c3RhdGljIHZvaWQgaW5pdF9jaGFubmVsX2FsbG9jYXRpb25zKHZvaWQpCit7CisJaW50IGksIGo7 CisJc3RydWN0IGNlYV9jaGFubmVsX3NwZWFrZXJfYWxsb2NhdGlvbiAqcDsKKworCXByX2RlYnVn KCIlczogRW50ZXJcbiIsIF9fZnVuY19fKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpF KGNoYW5uZWxfYWxsb2NhdGlvbnMpOyBpKyspIHsKKwkJcCA9IGNoYW5uZWxfYWxsb2NhdGlvbnMg KyBpOworCQlwLT5jaGFubmVscyA9IDA7CisJCXAtPnNwa19tYXNrID0gMDsKKwkJZm9yIChqID0g MDsgaiA8IEFSUkFZX1NJWkUocC0+c3BlYWtlcnMpOyBqKyspCisJCQlpZiAocC0+c3BlYWtlcnNb al0pIHsKKwkJCQlwLT5jaGFubmVscysrOworCQkJCXAtPnNwa19tYXNrIHw9IHAtPnNwZWFrZXJz W2pdOworCQkJfQorCX0KK30KKworLyoKKyAqIFRoZSB0cmFuc2Zvcm1hdGlvbiB0YWtlcyB0d28g c3RlcHM6CisgKgorICogICAgICBlbGQtPnNwa19hbGxvYyA9PiAoZWxkX3NwZWFrZXJfYWxsb2Nh dGlvbl9iaXRzW10pID0+IHNwa19tYXNrCisgKiAgICAgICAgICAgIHNwa19tYXNrID0+IChjaGFu bmVsX2FsbG9jYXRpb25zW10pICAgICAgICAgPT4gYWktPkNBCisgKgorICogVE9ETzogaXQgY291 bGQgc2VsZWN0IHRoZSB3cm9uZyBDQSBmcm9tIG11bHRpcGxlIGNhbmRpZGF0ZXMuCisqLworc3Rh dGljIGludCBzbmRfaW50ZWxoYWRfY2hhbm5lbF9hbGxvY2F0aW9uKHN0cnVjdCBzbmRfaW50ZWxo YWQgKmludGVsaGFkZGF0YSwKKwkJCQkJaW50IGNoYW5uZWxzKQoreworCWludCBpOworCWludCBj YSA9IDA7CisJaW50IHNwa19tYXNrID0gMDsKKworCS8qCisJKiBDQSBkZWZhdWx0cyB0byAwIGZv ciBiYXNpYyBzdGVyZW8gYXVkaW8KKwkqLworCWlmIChjaGFubmVscyA8PSAyKQorCQlyZXR1cm4g MDsKKworCS8qCisJKiBleHBhbmQgRUxEJ3Mgc3BlYWtlciBhbGxvY2F0aW9uIG1hc2sKKwkqCisJ KiBFTEQgdGVsbHMgdGhlIHNwZWFrZXIgbWFzayBpbiBhIGNvbXBhY3QocGFpcmVkKSBmb3JtLAor CSogZXhwYW5kIEVMRCdzIG5vdGlvbnMgdG8gbWF0Y2ggdGhlIG9uZXMgdXNlZCBieSBBdWRpbyBJ bmZvRnJhbWUuCisJKi8KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVsZF9zcGVha2Vy X2FsbG9jYXRpb25fYml0cyk7IGkrKykgeworCQlpZiAoaW50ZWxoYWRkYXRhLT5lZWxkLnNwZWFr ZXJfYWxsb2NhdGlvbl9ibG9jayAmICgxIDw8IGkpKQorCQkJc3BrX21hc2sgfD0gZWxkX3NwZWFr ZXJfYWxsb2NhdGlvbl9iaXRzW2ldOworCX0KKworCS8qIHNlYXJjaCBmb3IgdGhlIGZpcnN0IHdv cmtpbmcgbWF0Y2ggaW4gdGhlIENBIHRhYmxlICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJ WkUoY2hhbm5lbF9hbGxvY2F0aW9ucyk7IGkrKykgeworCQlpZiAoY2hhbm5lbHMgPT0gY2hhbm5l bF9hbGxvY2F0aW9uc1tpXS5jaGFubmVscyAmJgorCQkoc3BrX21hc2sgJiBjaGFubmVsX2FsbG9j YXRpb25zW2ldLnNwa19tYXNrKSA9PQorCQkJCWNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uc3BrX21h c2spIHsKKwkJCWNhID0gY2hhbm5lbF9hbGxvY2F0aW9uc1tpXS5jYV9pbmRleDsKKwkJCWJyZWFr OworCQl9CisJfQorCisJcHJfZGVidWcoIkhETUk6IHNlbGVjdCBDQSAweCV4IGZvciAlZFxuIiwg Y2EsIGNoYW5uZWxzKTsKKworCXJldHVybiBjYTsKK30KKworLyogZnJvbSBzcGVha2VyIGJpdCBt YXNrIHRvIEFMU0EgQVBJIGNoYW5uZWwgcG9zaXRpb24gKi8KK3N0YXRpYyBpbnQgc3BrX3RvX2No bWFwKGludCBzcGspCit7CisJc3RydWN0IGNoYW5uZWxfbWFwX3RhYmxlICp0ID0gbWFwX3RhYmxl czsKKworCWZvciAoOyB0LT5tYXA7IHQrKykgeworCQlpZiAodC0+c3BrX21hc2sgPT0gc3BrKQor CQkJcmV0dXJuIHQtPm1hcDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGFkX2J1aWxkX2No YW5uZWxfYWxsb2NhdGlvbl9tYXAoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQor eworCWludCBpID0gMCwgYyA9IDA7CisJaW50IHNwa19tYXNrID0gMDsKKwlzdHJ1Y3Qgc25kX3Bj bV9jaG1hcF9lbGVtICpjaG1hcDsKKwl1aW50OF90IGVsZF9oaWdoLCBlbGRfaGlnaF9tYXNrID0g MHhGMDsKKwl1aW50OF90IGhpZ2hfbXNiOworCisJY2htYXAgPSBremFsbG9jKHNpemVvZigqY2ht YXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2htYXAgPT0gTlVMTCkgeworCQlwcl9lcnIoImt6YWxs b2MgcmV0dXJuZWQgbnVsbCBpbiAlc1xuIiwgX19mdW5jX18pOworCQlpbnRlbGhhZGRhdGEtPmNo bWFwLT5jaG1hcCA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKKwloYWRfZ2V0X2NhcHMoSEFEX0dF VF9FTEQsICZpbnRlbGhhZGRhdGEtPmVlbGQpOworCisJcHJfZGVidWcoImVlbGQuc3BlYWtlcl9h bGxvY2F0aW9uX2Jsb2NrID0gJXhcbiIsCisJCQlpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9h bGxvY2F0aW9uX2Jsb2NrKTsKKworCS8qIFdBOiBGaXggdGhlIG1heCBjaGFubmVsIHN1cHBvcnRl ZCB0byA4ICovCisKKwkvKgorCSAqIFNpbmsgbWF5IHN1cHBvcnQgbW9yZSB0aGFuIDggY2hhbm5l bHMsIGlmIGVsZF9oaWdoIGhhcyBtb3JlIHRoYW4KKwkgKiBvbmUgYml0IHNldC4gU09DIHN1cHBv cnRzIG1heCA4IGNoYW5uZWxzLgorCSAqIFJlZmVyIGVsZF9zcGVha2VyX2FsbG9jYXRpb25fYml0 cywgZm9yIHNpbmsgc3BlYWtlciBhbGxvY2F0aW9uCisJICovCisKKwkvKiBpZiAweDJGIDwgZWxk IDwgMHg0RiBmYWxsIGJhY2sgdG8gMHgyZiwgZWxzZSBmYWxsIGJhY2sgdG8gMHg0RiAqLworCWVs ZF9oaWdoID0gaW50ZWxoYWRkYXRhLT5lZWxkLnNwZWFrZXJfYWxsb2NhdGlvbl9ibG9jayAmIGVs ZF9oaWdoX21hc2s7CisJaWYgKChlbGRfaGlnaCAmIChlbGRfaGlnaC0xKSkgJiYgKGVsZF9oaWdo ID4gMHgxRikpIHsKKwkJLyogZWxkX2hpZ2ggJiAoZWxkX2hpZ2gtMSk6IGlmIG1vcmUgdGhhbiAx IGJpdCBzZXQgKi8KKwkJLyogMHgxRjogNyBjaGFubmVscyAqLworCQlmb3IgKGkgPSAxOyBpIDwg NDsgaSsrKSB7CisJCQloaWdoX21zYiA9IGVsZF9oaWdoICYgKDB4ODAgPj4gaSk7CisJCQlpZiAo aGlnaF9tc2IpIHsKKwkJCQlpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9hbGxvY2F0aW9uX2Js b2NrICY9CisJCQkJCWhpZ2hfbXNiIHwgMHhGOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQor CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZWxkX3NwZWFrZXJfYWxsb2NhdGlvbl9iaXRz KTsgaSsrKSB7CisJCWlmIChpbnRlbGhhZGRhdGEtPmVlbGQuc3BlYWtlcl9hbGxvY2F0aW9uX2Js b2NrICYgKDEgPDwgaSkpCisJCQlzcGtfbWFzayB8PSBlbGRfc3BlYWtlcl9hbGxvY2F0aW9uX2Jp dHNbaV07CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbm5lbF9hbGxvY2F0 aW9ucyk7IGkrKykgeworCQlpZiAoc3BrX21hc2sgPT0gY2hhbm5lbF9hbGxvY2F0aW9uc1tpXS5z cGtfbWFzaykgeworCQkJZm9yIChjID0gMDsgYyA8IGNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uY2hh bm5lbHM7IGMrKykgeworCQkJCWNobWFwLT5tYXBbY10gPSBzcGtfdG9fY2htYXAoCisJCQkJCWNo YW5uZWxfYWxsb2NhdGlvbnNbaV0uc3BlYWtlcnNbKE1BWF9TUEVBS0VSUyAtIDEpLWNdKTsKKwkJ CX0KKwkJCWNobWFwLT5jaGFubmVscyA9IGNoYW5uZWxfYWxsb2NhdGlvbnNbaV0uY2hhbm5lbHM7 CisJCQlpbnRlbGhhZGRhdGEtPmNobWFwLT5jaG1hcCA9IGNobWFwOworCQkJYnJlYWs7CisJCX0K Kwl9CisJaWYgKGkgPj0gQVJSQVlfU0laRShjaGFubmVsX2FsbG9jYXRpb25zKSkKKwkJa2ZyZWUo Y2htYXApOworfQorCisvKgorICoqIEFMU0EgQVBJIGNoYW5uZWwtbWFwIGNvbnRyb2wgY2FsbGJh Y2tzCisgKiovCitzdGF0aWMgaW50IGhhZF9jaG1hcF9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250 cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQorewor CXN0cnVjdCBzbmRfcGNtX2NobWFwICppbmZvID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wp OworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IGluZm8tPnByaXZhdGVfZGF0 YTsKKworCWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPT0gSEFEX0RSVl9ESVNDT05ORUNU RUQpCisJCXJldHVybiAtRU5PREVWOworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQ RV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IEhBRF9NQVhfQ0hBTk5FTDsKKwl1aW5mby0+dmFs dWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IFNORFJWX0NI TUFQX0xBU1Q7CisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgVVNFX0FMU0FfREVGQVVMVF9UTFYK K3N0YXRpYyBpbnQgaGFkX2NobWFwX2N0bF90bHYoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRy b2wsIGludCBvcF9mbGFnLAorCQkJCXVuc2lnbmVkIGludCBzaXplLCB1bnNpZ25lZCBpbnQgX191 c2VyICp0bHYpCit7CisJc3RydWN0IHNuZF9wY21fY2htYXAgKmluZm8gPSBzbmRfa2NvbnRyb2xf Y2hpcChrY29udHJvbCk7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gaW5m by0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURf RFJWX0RJU0NPTk5FQ1RFRCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBUT0RPOiBGaXggZm9y IHF1ZXJ5IGNoYW5uZWwgbWFwICovCisJcmV0dXJuIC1FUEVSTTsKK30KKyNlbmRpZgorCitzdGF0 aWMgaW50IGhhZF9jaG1hcF9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAor CQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRf cGNtX2NobWFwICppbmZvID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCBz bmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IGluZm8tPnByaXZhdGVfZGF0YTsKKwlpbnQgaSA9 IDA7CisJY29uc3Qgc3RydWN0IHNuZF9wY21fY2htYXBfZWxlbSAqY2htYXA7CisKKwlpZiAoaW50 ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZfRElTQ09OTkVDVEVEKQorCQlyZXR1cm4g LUVOT0RFVjsKKwlpZiAoaW50ZWxoYWRkYXRhLT5jaG1hcC0+Y2htYXAgPT0gIE5VTEwpCisJCXJl dHVybiAtRU5PREFUQTsKKwljaG1hcCA9IGludGVsaGFkZGF0YS0+Y2htYXAtPmNobWFwOworCWZv ciAoaSA9IDA7IGkgPCBjaG1hcC0+Y2hhbm5lbHM7IGkrKykgeworCQl1Y29udHJvbC0+dmFsdWUu aW50ZWdlci52YWx1ZVtpXSA9IGNobWFwLT5tYXBbaV07CisJCXByX2RlYnVnKCJjaG1hcC0+bWFw WyVkXSA9ICVkXG4iLCBpLCBjaG1hcC0+bWFwW2ldKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBoYWRfY2htYXBfY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJv bCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwkvKiBUT0RP OiBHZXQgY2hhbm5lbCBtYXAgYW5kIHNldCBzd2FwIHJlZ2lzdGVyICovCisJcmV0dXJuIC1FUEVS TTsKK30KKworc3RhdGljIGludCBoYWRfcmVnaXN0ZXJfY2htYXBfY3RscyhzdHJ1Y3Qgc25kX2lu dGVsaGFkICppbnRlbGhhZGRhdGEsCisJCQkJCQlzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCWlu dCBlcnIgPSAwOworCisJZXJyID0gc25kX3BjbV9hZGRfY2htYXBfY3RscyhwY20sIFNORFJWX1BD TV9TVFJFQU1fUExBWUJBQ0ssCisJCQlOVUxMLCAwLCAodW5zaWduZWQgbG9uZylpbnRlbGhhZGRh dGEsCisJCQkmaW50ZWxoYWRkYXRhLT5jaG1hcCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBl cnI7CisKKwlpbnRlbGhhZGRhdGEtPmNobWFwLT5wcml2YXRlX2RhdGEgPSBpbnRlbGhhZGRhdGE7 CisJaW50ZWxoYWRkYXRhLT5rY3RsID0gaW50ZWxoYWRkYXRhLT5jaG1hcC0+a2N0bDsKKwlpbnRl bGhhZGRhdGEtPmtjdGwtPmluZm8gPSBoYWRfY2htYXBfY3RsX2luZm87CisJaW50ZWxoYWRkYXRh LT5rY3RsLT5nZXQgPSBoYWRfY2htYXBfY3RsX2dldDsKKwlpbnRlbGhhZGRhdGEtPmtjdGwtPnB1 dCA9IGhhZF9jaG1hcF9jdGxfcHV0OworI2lmbmRlZiBVU0VfQUxTQV9ERUZBVUxUX1RMVgorCWlu dGVsaGFkZGF0YS0+a2N0bC0+dGx2LmMgPSBoYWRfY2htYXBfY3RsX3RsdjsKKyNlbmRpZgorCWlu dGVsaGFkZGF0YS0+Y2htYXAtPmNobWFwID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisg KiBzbmRfaW50ZWxoYWRfcHJvZ19kaXBfdjEgLSB0byBpbml0aWFsaXplIERhdGEgSXNsYW5kIFBh Y2tldHMgcmVnaXN0ZXJzCisgKgorICogQHN1YnN0cmVhbTpzdWJzdHJlYW0gZm9yIHdoaWNoIHRo ZSBwcmVwYXJlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogQGludGVsaGFkZGF0YTpzdWJzdHJlYW0g cHJpdmF0ZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIHByZXBh cmUgY2FsbGJhY2sKKyAqLworc3RhdGljIHZvaWQgc25kX2ludGVsaGFkX3Byb2dfZGlwX3YxKHN0 cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfaW50ZWxo YWQgKmludGVsaGFkZGF0YSkKK3sKKwlpbnQgaTsKKwl1bmlvbiBhdWRfY3RybF9zdCBjdHJsX3N0 YXRlID0gey5jdHJsX3ZhbCA9IDB9OworCXVuaW9uIGF1ZF9pbmZvX2ZyYW1lMiBmcmFtZTIgPSB7 LmZyMl92YWwgPSAwfTsKKwl1bmlvbiBhdWRfaW5mb19mcmFtZTMgZnJhbWUzID0gey5mcjNfdmFs ID0gMH07CisJdTggY2hlY2tzdW0gPSAwOworCWludCBjaGFubmVsczsKKworCWNoYW5uZWxzID0g c3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVsczsKKworCWhhZF93cml0ZV9yZWdpc3RlcihBVURf Q05UTF9TVCwgY3RybF9zdGF0ZS5jdHJsX3ZhbCk7CisKKwlmcmFtZTIuZnIyX3JlZ3guY2hubF9j bnQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzIC0gMTsKKworCWZyYW1lMy5mcjNfcmVn eC5jaG5sX2FsbG9jID0gc25kX2ludGVsaGFkX2NoYW5uZWxfYWxsb2NhdGlvbigKKwkJCQkJaW50 ZWxoYWRkYXRhLCBjaGFubmVscyk7CisKKwkvKkNhbGN1bHRlIHRoZSBieXRlIHdpZGUgY2hlY2tz dW0gZm9yIGFsbCB2YWxpZCBESVAgd29yZHMqLworCWZvciAoaSA9IDA7IGkgPCBCWVRFU19QRVJf V09SRDsgaSsrKQorCQljaGVja3N1bSArPSAoSU5GT19GUkFNRV9XT1JEMSA+PiBpKkJJVFNfUEVS X0JZVEUpICYgTUFTS19CWVRFMDsKKwlmb3IgKGkgPSAwOyBpIDwgQllURVNfUEVSX1dPUkQ7IGkr KykKKwkJY2hlY2tzdW0gKz0gKGZyYW1lMi5mcjJfdmFsID4+IGkqQklUU19QRVJfQllURSkgJiBN QVNLX0JZVEUwOworCWZvciAoaSA9IDA7IGkgPCBCWVRFU19QRVJfV09SRDsgaSsrKQorCQljaGVj a3N1bSArPSAoZnJhbWUzLmZyM192YWwgPj4gaSpCSVRTX1BFUl9CWVRFKSAmIE1BU0tfQllURTA7 CisKKwlmcmFtZTIuZnIyX3JlZ3guY2hrc3VtID0gLShjaGVja3N1bSk7CisKKwloYWRfd3JpdGVf cmVnaXN0ZXIoQVVEX0hETUlXX0lORk9GUiwgSU5GT19GUkFNRV9XT1JEMSk7CisJaGFkX3dyaXRl X3JlZ2lzdGVyKEFVRF9IRE1JV19JTkZPRlIsIGZyYW1lMi5mcjJfdmFsKTsKKwloYWRfd3JpdGVf cmVnaXN0ZXIoQVVEX0hETUlXX0lORk9GUiwgZnJhbWUzLmZyM192YWwpOworCisJLyogcHJvZ3Jh bSByZW1haW5pbmcgRElQIHdvcmRzIHdpdGggemVybyAqLworCWZvciAoaSA9IDA7IGkgPCBIQURf TUFYX0RJUF9XT1JEUy1WQUxJRF9ESVBfV09SRFM7IGkrKykKKwkJaGFkX3dyaXRlX3JlZ2lzdGVy KEFVRF9IRE1JV19JTkZPRlIsIDB4MCk7CisKKwljdHJsX3N0YXRlLmN0cmxfcmVneC5kaXBfZnJl cSA9IDE7CisJY3RybF9zdGF0ZS5jdHJsX3JlZ3guZGlwX2VuX3N0YSA9IDE7CisJaGFkX3dyaXRl X3JlZ2lzdGVyKEFVRF9DTlRMX1NULCBjdHJsX3N0YXRlLmN0cmxfdmFsKTsKK30KKworLyoqCisg KiBzbmRfaW50ZWxoYWRfcHJvZ19kaXBfdjIgLSB0byBpbml0aWFsaXplIERhdGEgSXNsYW5kIFBh Y2tldHMgcmVnaXN0ZXJzCisgKgorICogQHN1YnN0cmVhbTpzdWJzdHJlYW0gZm9yIHdoaWNoIHRo ZSBwcmVwYXJlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogQGludGVsaGFkZGF0YTpzdWJzdHJlYW0g cHJpdmF0ZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gdGhlIHByZXBh cmUgY2FsbGJhY2sKKyAqLworc3RhdGljIHZvaWQgc25kX2ludGVsaGFkX3Byb2dfZGlwX3YyKHN0 cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfaW50ZWxo YWQgKmludGVsaGFkZGF0YSkKK3sKKwlpbnQgaTsKKwl1bmlvbiBhdWRfY3RybF9zdCBjdHJsX3N0 YXRlID0gey5jdHJsX3ZhbCA9IDB9OworCXVuaW9uIGF1ZF9pbmZvX2ZyYW1lMiBmcmFtZTIgPSB7 LmZyMl92YWwgPSAwfTsKKwl1bmlvbiBhdWRfaW5mb19mcmFtZTMgZnJhbWUzID0gey5mcjNfdmFs ID0gMH07CisJdTggY2hlY2tzdW0gPSAwOworCWludCBjaGFubmVsczsKKworCWNoYW5uZWxzID0g c3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVsczsKKworCWhhZF93cml0ZV9yZWdpc3RlcihBVURf Q05UTF9TVCwgY3RybF9zdGF0ZS5jdHJsX3ZhbCk7CisKKwlmcmFtZTIuZnIyX3JlZ3guY2hubF9j bnQgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzIC0gMTsKKworCWZyYW1lMy5mcjNfcmVn eC5jaG5sX2FsbG9jID0gc25kX2ludGVsaGFkX2NoYW5uZWxfYWxsb2NhdGlvbigKKwkJCQkJaW50 ZWxoYWRkYXRhLCBjaGFubmVscyk7CisKKwkvKkNhbGN1bHRlIHRoZSBieXRlIHdpZGUgY2hlY2tz dW0gZm9yIGFsbCB2YWxpZCBESVAgd29yZHMqLworCWZvciAoaSA9IDA7IGkgPCBCWVRFU19QRVJf V09SRDsgaSsrKQorCQljaGVja3N1bSArPSAoSU5GT19GUkFNRV9XT1JEMSA+PiBpKkJJVFNfUEVS X0JZVEUpICYgTUFTS19CWVRFMDsKKwlmb3IgKGkgPSAwOyBpIDwgQllURVNfUEVSX1dPUkQ7IGkr KykKKwkJY2hlY2tzdW0gKz0gKGZyYW1lMi5mcjJfdmFsID4+IGkqQklUU19QRVJfQllURSkgJiBN QVNLX0JZVEUwOworCWZvciAoaSA9IDA7IGkgPCBCWVRFU19QRVJfV09SRDsgaSsrKQorCQljaGVj a3N1bSArPSAoZnJhbWUzLmZyM192YWwgPj4gaSpCSVRTX1BFUl9CWVRFKSAmIE1BU0tfQllURTA7 CisKKwlmcmFtZTIuZnIyX3JlZ3guY2hrc3VtID0gLShjaGVja3N1bSk7CisKKwloYWRfd3JpdGVf cmVnaXN0ZXIoQVVEX0hETUlXX0lORk9GUl92MiwgSU5GT19GUkFNRV9XT1JEMSk7CisJaGFkX3dy aXRlX3JlZ2lzdGVyKEFVRF9IRE1JV19JTkZPRlJfdjIsIGZyYW1lMi5mcjJfdmFsKTsKKwloYWRf d3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlXX0lORk9GUl92MiwgZnJhbWUzLmZyM192YWwpOworCisJ LyogcHJvZ3JhbSByZW1haW5pbmcgRElQIHdvcmRzIHdpdGggemVybyAqLworCWZvciAoaSA9IDA7 IGkgPCBIQURfTUFYX0RJUF9XT1JEUy1WQUxJRF9ESVBfV09SRFM7IGkrKykKKwkJaGFkX3dyaXRl X3JlZ2lzdGVyKEFVRF9IRE1JV19JTkZPRlJfdjIsIDB4MCk7CisKKwljdHJsX3N0YXRlLmN0cmxf cmVneC5kaXBfZnJlcSA9IDE7CisJY3RybF9zdGF0ZS5jdHJsX3JlZ3guZGlwX2VuX3N0YSA9IDE7 CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DTlRMX1NULCBjdHJsX3N0YXRlLmN0cmxfdmFsKTsK K30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfcHJvZ19idWZmZXIgLSBwcm9ncmFtcyBidWZmZXIK KyAqIGFkZHJlc3MgYW5kIGxlbmd0aCByZWdpc3RlcnMKKyAqCisgKiBAc3Vic3RyZWFtOnN1YnN0 cmVhbSBmb3Igd2hpY2ggdGhlIHByZXBhcmUgZnVuY3Rpb24gaXMgY2FsbGVkCisgKiBAaW50ZWxo YWRkYXRhOnN1YnN0cmVhbSBwcml2YXRlIGRhdGEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb2dy YW1zIHJpbmcgYnVmZmVyIGFkZHJlc3MgYW5kIGxlbmd0aCBpbnRvIHJlZ2lzdGVycy4KKyAqLwor aW50IHNuZF9pbnRlbGhhZF9wcm9nX2J1ZmZlcihzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhh ZGRhdGEsCisJCQkJCWludCBzdGFydCwgaW50IGVuZCkKK3sKKwl1MzIgcmluZ19idWZfYWRkciwg cmluZ19idWZfc2l6ZSwgcGVyaW9kX2J5dGVzOworCXU4IGksIG51bV9wZXJpb2RzOworCXN0cnVj dCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCisJc3Vic3RyZWFtID0gaW50ZWxoYWRk YXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFtOworCWlmICghc3Vic3RyZWFtKSB7CisJCXBy X2Vycigic3Vic3RyZWFtIGlzIE5VTExcbiIpOworCQlkdW1wX3N0YWNrKCk7CisJCXJldHVybiAw OworCX0KKworCXJpbmdfYnVmX2FkZHIgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyOwor CXJpbmdfYnVmX3NpemUgPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKKwlp bnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLnJpbmdfYnVmX3NpemUgPSByaW5nX2J1Zl9zaXplOwor CXBlcmlvZF9ieXRlcyA9IGZyYW1lc190b19ieXRlcyhzdWJzdHJlYW0tPnJ1bnRpbWUsCisJCQkJ c3Vic3RyZWFtLT5ydW50aW1lLT5wZXJpb2Rfc2l6ZSk7CisJbnVtX3BlcmlvZHMgPSBzdWJzdHJl YW0tPnJ1bnRpbWUtPnBlcmlvZHM7CisKKwkvKgorCSAqIGJ1ZmZlciBhZGRyIHNob3VsZCAgYmUg NjQgYnl0ZSBhbGlnbmVkLCBwZXJpb2QgYnl0ZXMKKwkgKiB3aWxsIGJlIHVzZWQgdG8gY2FsY3Vs YXRlIGFkZHIgb2Zmc2V0CisJICovCisJcGVyaW9kX2J5dGVzICY9IH4weDNGOworCisJLyogSGFy ZHdhcmUgc3VwcG9ydHMgTUFYX1BFUklPRFMgYnVmZmVycyAqLworCWlmIChlbmQgPj0gSEFEX01B WF9QRVJJT0RTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IHN0YXJ0OyBpIDw9IGVu ZDsgaSsrKSB7CisJCS8qIFByb2dyYW0gdGhlIGJ1ZiByZWdpc3RlcnMgd2l0aCBhZGRyIGFuZCBs ZW4gKi8KKwkJaW50ZWxoYWRkYXRhLT5idWZfaW5mb1tpXS5idWZfYWRkciA9IHJpbmdfYnVmX2Fk ZHIgKworCQkJCQkJCSAoaSAqIHBlcmlvZF9ieXRlcyk7CisJCWlmIChpIDwgbnVtX3BlcmlvZHMt MSkKKwkJCWludGVsaGFkZGF0YS0+YnVmX2luZm9baV0uYnVmX3NpemUgPSBwZXJpb2RfYnl0ZXM7 CisJCWVsc2UKKwkJCWludGVsaGFkZGF0YS0+YnVmX2luZm9baV0uYnVmX3NpemUgPSByaW5nX2J1 Zl9zaXplIC0KKwkJCQkJCQkocGVyaW9kX2J5dGVzKmkpOworCisJCWhhZF93cml0ZV9yZWdpc3Rl cihBVURfQlVGX0FfQUREUiArIChpICogSEFEX1JFR19XSURUSCksCisJCQkJCWludGVsaGFkZGF0 YS0+YnVmX2luZm9baV0uYnVmX2FkZHIgfAorCQkJCQlCSVQoMCkgfCBCSVQoMSkpOworCQloYWRf d3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9BX0xFTkdUSCArIChpICogSEFEX1JFR19XSURUSCksCisJ CQkJCXBlcmlvZF9ieXRlcyk7CisJCWludGVsaGFkZGF0YS0+YnVmX2luZm9baV0uaXNfdmFsaWQg PSB0cnVlOworCX0KKwlwcl9kZWJ1ZygiJXM6YnVmWyVkLSVkXSBhZGRyPSUjeCAgYW5kIHNpemU9 JWRcbiIsIF9fZnVuY19fLCBzdGFydCwgZW5kLAorCQkJaW50ZWxoYWRkYXRhLT5idWZfaW5mb1tz dGFydF0uYnVmX2FkZHIsCisJCQlpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW3N0YXJ0XS5idWZfc2l6 ZSk7CisJaW50ZWxoYWRkYXRhLT52YWxpZF9idWZfY250ID0gbnVtX3BlcmlvZHM7CisJcmV0dXJu IDA7Cit9CisKK2lubGluZSBpbnQgc25kX2ludGVsaGFkX3JlYWRfbGVuKHN0cnVjdCBzbmRfaW50 ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwlpbnQgaSwgcmV0dmFsID0gMDsKKwl1MzIgbGVuWzRd OworCisJZm9yIChpID0gMDsgaSA8IDQgOyBpKyspIHsKKwkJaGFkX3JlYWRfcmVnaXN0ZXIoQVVE X0JVRl9BX0xFTkdUSCArIChpICogSEFEX1JFR19XSURUSCksCisJCQkJCSZsZW5baV0pOworCQlp ZiAoIWxlbltpXSkKKwkJCXJldHZhbCsrOworCX0KKwlpZiAocmV0dmFsICE9IDEpIHsKKwkJZm9y IChpID0gMDsgaSA8IDQgOyBpKyspCisJCQlwcl9kZWJ1ZygiYnVmWyVkXSBzaXplPSVkXG4iLCBp LCBsZW5baV0pOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogc25kX2ludGVs aGFkX3Byb2dfY3RzX3YxIC0gUHJvZ3JhbSBIRE1JIGF1ZGlvIENUUyB2YWx1ZQorICoKKyAqIEBh dWRfc2FtcF9mcmVxOiBzYW1wbGluZyBmcmVxdWVuY3kgb2YgYXVkaW8gZGF0YQorICogQHRtZHM6 IHNhbXBsaW5nIGZyZXF1ZW5jeSBvZiB0aGUgZGlzcGxheSBkYXRhCisgKiBAbl9wYXJhbTogTiB2 YWx1ZSwgZGVwZW5kcyBvbiBhdWRfc2FtcF9mcmVxCisgKiBAaW50ZWxoYWRkYXRhOnN1YnN0cmVh bSBwcml2YXRlIGRhdGEKKyAqCisgKiBQcm9ncmFtIENUUyByZWdpc3RlciBiYXNlZCBvbiB0aGUg YXVkaW8gYW5kIGRpc3BsYXkgc2FtcGxpbmcgZnJlcXVlbmN5CisgKi8KK3N0YXRpYyB2b2lkIHNu ZF9pbnRlbGhhZF9wcm9nX2N0c192MSh1MzIgYXVkX3NhbXBfZnJlcSwgdTMyIHRtZHMsIHUzMiBu X3BhcmFtLAorCQkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwl1MzIg Y3RzX3ZhbDsKKwl1NjQgZGl2aWRlbmQsIGRpdmlzb3I7CisKKwkvKiBDYWxjdWxhdGUgQ1RTIGFj Y29yZGluZyB0byBIRE1JIDEuM2Egc3BlYyovCisJZGl2aWRlbmQgPSAodTY0KXRtZHMgKiBuX3Bh cmFtKjEwMDA7CisJZGl2aXNvciA9IDEyOCAqIGF1ZF9zYW1wX2ZyZXE7CisJY3RzX3ZhbCA9IGRp djY0X3U2NChkaXZpZGVuZCwgZGl2aXNvcik7CisJcHJfZGVidWcoIlRNRFMgdmFsdWU9JWQsIE4g dmFsdWU9JWQsIENUUyBWYWx1ZT0lZFxuIiwKKwkJCXRtZHMsIG5fcGFyYW0sIGN0c192YWwpOwor CWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSV9DVFMsIChCSVQoMjApIHwgY3RzX3ZhbCkpOwor fQorCisvKioKKyAqIHNuZF9pbnRlbGhhZF9wcm9nX2N0c192MiAtIFByb2dyYW0gSERNSSBhdWRp byBDVFMgdmFsdWUKKyAqCisgKiBAYXVkX3NhbXBfZnJlcTogc2FtcGxpbmcgZnJlcXVlbmN5IG9m IGF1ZGlvIGRhdGEKKyAqIEB0bWRzOiBzYW1wbGluZyBmcmVxdWVuY3kgb2YgdGhlIGRpc3BsYXkg ZGF0YQorICogQG5fcGFyYW06IE4gdmFsdWUsIGRlcGVuZHMgb24gYXVkX3NhbXBfZnJlcQorICog QGludGVsaGFkZGF0YTpzdWJzdHJlYW0gcHJpdmF0ZSBkYXRhCisgKgorICogUHJvZ3JhbSBDVFMg cmVnaXN0ZXIgYmFzZWQgb24gdGhlIGF1ZGlvIGFuZCBkaXNwbGF5IHNhbXBsaW5nIGZyZXF1ZW5j eQorICovCitzdGF0aWMgdm9pZCBzbmRfaW50ZWxoYWRfcHJvZ19jdHNfdjIodTMyIGF1ZF9zYW1w X2ZyZXEsIHUzMiB0bWRzLCB1MzIgbl9wYXJhbSwKKwkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICpp bnRlbGhhZGRhdGEpCit7CisJdTMyIGN0c192YWw7CisJdTY0IGRpdmlkZW5kLCBkaXZpc29yOwor CisJLyogQ2FsY3VsYXRlIENUUyBhY2NvcmRpbmcgdG8gSERNSSAxLjNhIHNwZWMqLworCWRpdmlk ZW5kID0gKHU2NCl0bWRzICogbl9wYXJhbSoxMDAwOworCWRpdmlzb3IgPSAxMjggKiBhdWRfc2Ft cF9mcmVxOworCWN0c192YWwgPSBkaXY2NF91NjQoZGl2aWRlbmQsIGRpdmlzb3IpOworCXByX2Rl YnVnKCJUTURTIHZhbHVlPSVkLCBOIHZhbHVlPSVkLCBDVFMgVmFsdWU9JWRcbiIsCisJCQl0bWRz LCBuX3BhcmFtLCBjdHNfdmFsKTsKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hETUlfQ1RTLCAo QklUKDI0KSB8IGN0c192YWwpKTsKK30KKworc3RhdGljIGludCBoYWRfY2FsY3VsYXRlX25fdmFs dWUodTMyIGF1ZF9zYW1wX2ZyZXEpCit7CisJczMyIG5fdmFsOworCisJLyogU2VsZWN0IE4gYWNj b3JkaW5nIHRvIEhETUkgMS4zYSBzcGVjKi8KKwlzd2l0Y2ggKGF1ZF9zYW1wX2ZyZXEpIHsKKwlj YXNlIEFVRF9TQU1QTEVfUkFURV8zMjoKKwkJbl92YWwgPSA0MDk2OworCWJyZWFrOworCisJY2Fz ZSBBVURfU0FNUExFX1JBVEVfNDRfMToKKwkJbl92YWwgPSA2MjcyOworCWJyZWFrOworCisJY2Fz ZSBBVURfU0FNUExFX1JBVEVfNDg6CisJCW5fdmFsID0gNjE0NDsKKwlicmVhazsKKworCWNhc2Ug QVVEX1NBTVBMRV9SQVRFXzg4XzI6CisJCW5fdmFsID0gMTI1NDQ7CisJYnJlYWs7CisKKwljYXNl IEFVRF9TQU1QTEVfUkFURV85NjoKKwkJbl92YWwgPSAxMjI4ODsKKwlicmVhazsKKworCWNhc2Ug QVVEX1NBTVBMRV9SQVRFXzE3Nl80OgorCQluX3ZhbCA9IDI1MDg4OworCWJyZWFrOworCisJY2Fz ZSBIQURfTUFYX1JBVEU6CisJCW5fdmFsID0gMjQ1NzY7CisJYnJlYWs7CisKKwlkZWZhdWx0Ogor CQluX3ZhbCA9IC1FSU5WQUw7CisJYnJlYWs7CisJfQorCXJldHVybiBuX3ZhbDsKK30KKworLyoq CisgKiBzbmRfaW50ZWxoYWRfcHJvZ19uX3YxIC0gUHJvZ3JhbSBIRE1JIGF1ZGlvIE4gdmFsdWUK KyAqCisgKiBAYXVkX3NhbXBfZnJlcTogc2FtcGxpbmcgZnJlcXVlbmN5IG9mIGF1ZGlvIGRhdGEK KyAqIEBuX3BhcmFtOiBOIHZhbHVlLCBkZXBlbmRzIG9uIGF1ZF9zYW1wX2ZyZXEKKyAqIEBpbnRl bGhhZGRhdGE6c3Vic3RyZWFtIHByaXZhdGUgZGF0YQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMg Y2FsbGVkIGluIHRoZSBwcmVwYXJlIGNhbGxiYWNrLgorICogSXQgcHJvZ3JhbXMgYmFzZWQgb24g dGhlIGF1ZGlvIGFuZCBkaXNwbGF5IHNhbXBsaW5nIGZyZXF1ZW5jeQorICovCitzdGF0aWMgaW50 IHNuZF9pbnRlbGhhZF9wcm9nX25fdjEodTMyIGF1ZF9zYW1wX2ZyZXEsIHUzMiAqbl9wYXJhbSwK KwkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJczMyIG5fdmFsOwor CisJbl92YWwgPQloYWRfY2FsY3VsYXRlX25fdmFsdWUoYXVkX3NhbXBfZnJlcSk7CisKKwlpZiAo bl92YWwgPCAwKQorCQlyZXR1cm4gbl92YWw7CisKKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX05f RU5BQkxFLCAoQklUKDIwKSB8IG5fdmFsKSk7CisJKm5fcGFyYW0gPSBuX3ZhbDsKKwlyZXR1cm4g MDsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfcHJvZ19uX3YyIC0gUHJvZ3JhbSBIRE1JIGF1 ZGlvIE4gdmFsdWUKKyAqCisgKiBAYXVkX3NhbXBfZnJlcTogc2FtcGxpbmcgZnJlcXVlbmN5IG9m IGF1ZGlvIGRhdGEKKyAqIEBuX3BhcmFtOiBOIHZhbHVlLCBkZXBlbmRzIG9uIGF1ZF9zYW1wX2Zy ZXEKKyAqIEBpbnRlbGhhZGRhdGE6c3Vic3RyZWFtIHByaXZhdGUgZGF0YQorICoKKyAqIFRoaXMg ZnVuY3Rpb24gaXMgY2FsbGVkIGluIHRoZSBwcmVwYXJlIGNhbGxiYWNrLgorICogSXQgcHJvZ3Jh bXMgYmFzZWQgb24gdGhlIGF1ZGlvIGFuZCBkaXNwbGF5IHNhbXBsaW5nIGZyZXF1ZW5jeQorICov CitzdGF0aWMgaW50IHNuZF9pbnRlbGhhZF9wcm9nX25fdjIodTMyIGF1ZF9zYW1wX2ZyZXEsIHUz MiAqbl9wYXJhbSwKKwkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJ czMyIG5fdmFsOworCisJbl92YWwgPQloYWRfY2FsY3VsYXRlX25fdmFsdWUoYXVkX3NhbXBfZnJl cSk7CisKKwlpZiAobl92YWwgPCAwKQorCQlyZXR1cm4gbl92YWw7CisKKwloYWRfd3JpdGVfcmVn aXN0ZXIoQVVEX05fRU5BQkxFLCAoQklUKDI0KSB8IG5fdmFsKSk7CisJKm5fcGFyYW0gPSBuX3Zh bDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGFkX2NsZWFyX3VuZGVycnVuX2ludHJf djEoc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCXUzMiBoZG1pX3N0YXR1 cywgaSA9IDA7CisKKwkvKiBIYW5kbGUgVW5kZXJydW4gaW50ZXJydXB0IHdpdGhpbiBBdWRpbyBV bml0ICovCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9DT05GSUcsIDApOworCS8qIFJlc2V0IGJ1 ZmZlciBwb2ludGVycyAqLworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSV9TVEFUVVMsIDEp OworCWhhZF93cml0ZV9yZWdpc3RlcihBVURfSERNSV9TVEFUVVMsIDApOworCS8qKgorCSAqIFRo ZSBpbnRlcnJ1cHQgc3RhdHVzICdzdGlja3knIGJpdHMgbWlnaHQgbm90IGJlIGNsZWFyZWQgYnkK KwkgKiBzZXR0aW5nICcxJyB0byB0aGF0IGJpdCBvbmNlLi4uCisJICovCisJZG8geyAvKiBjbGVh ciBiaXQzMCwgMzEgQVVEX0hETUlfU1RBVFVTICovCisJCWhhZF9yZWFkX3JlZ2lzdGVyKEFVRF9I RE1JX1NUQVRVUywgJmhkbWlfc3RhdHVzKTsKKwkJcHJfZGVidWcoIkhETUkgc3RhdHVzID0weCV4 XG4iLCBoZG1pX3N0YXR1cyk7CisJCWlmIChoZG1pX3N0YXR1cyAmIEFVRF9DT05GSUdfTUFTS19V TkRFUlJVTikgeworCQkJaSsrOworCQkJaGRtaV9zdGF0dXMgJj0gKEFVRF9DT05GSUdfTUFTS19T UkRCRyB8CisJCQkJCUFVRF9DT05GSUdfTUFTS19GVU5DUlNUKTsKKwkJCWhkbWlfc3RhdHVzIHw9 IH5BVURfQ09ORklHX01BU0tfVU5ERVJSVU47CisJCQloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0hE TUlfU1RBVFVTLCBoZG1pX3N0YXR1cyk7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfSB3aGlsZSAo aSA8IE1BWF9DTlQpOworCWlmIChpID49IE1BWF9DTlQpCisJCXByX2VycigiVW5hYmxlIHRvIGNs ZWFyIFVOREVSUlVOIGJpdHNcbiIpOworfQorCitzdGF0aWMgdm9pZCBoYWRfY2xlYXJfdW5kZXJy dW5faW50cl92MihzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpCit7CisJdTMyIGhk bWlfc3RhdHVzLCBpID0gMDsKKworCS8qIEhhbmRsZSBVbmRlcnJ1biBpbnRlcnJ1cHQgd2l0aGlu IEF1ZGlvIFVuaXQgKi8KKwloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0NPTkZJRywgMCk7CisJLyog UmVzZXQgYnVmZmVyIHBvaW50ZXJzICovCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX1NU QVRVU192MiwgMSk7CisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1JX1NUQVRVU192MiwgMCk7 CisJLyoqCisJICogVGhlIGludGVycnVwdCBzdGF0dXMgJ3N0aWNreScgYml0cyBtaWdodCBub3Qg YmUgY2xlYXJlZCBieQorCSAqIHNldHRpbmcgJzEnIHRvIHRoYXQgYml0IG9uY2UuLi4KKwkgKi8K KwlkbyB7IC8qIGNsZWFyIGJpdDMwLCAzMSBBVURfSERNSV9TVEFUVVMgKi8KKwkJaGFkX3JlYWRf cmVnaXN0ZXIoQVVEX0hETUlfU1RBVFVTX3YyLCAmaGRtaV9zdGF0dXMpOworCQlwcl9kZWJ1Zygi SERNSSBzdGF0dXMgPTB4JXhcbiIsIGhkbWlfc3RhdHVzKTsKKwkJaWYgKGhkbWlfc3RhdHVzICYg QVVEX0NPTkZJR19NQVNLX1VOREVSUlVOKSB7CisJCQlpKys7CisJCQloZG1pX3N0YXR1cyAmPSB+ QVVEX0NPTkZJR19NQVNLX1VOREVSUlVOOworCQkJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9IRE1J X1NUQVRVU192MiwgaGRtaV9zdGF0dXMpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0gd2hpbGUg KGkgPCBNQVhfQ05UKTsKKwlpZiAoaSA+PSBNQVhfQ05UKQorCQlwcl9lcnIoIlVuYWJsZSB0byBj bGVhciBVTkRFUlJVTiBiaXRzXG4iKTsKK30KKworLyoqCisqIHNuZF9pbnRlbGhhZF9vcGVuIC0g c3RyZWFtIGluaXRpYWxpemF0aW9ucyBhcmUgZG9uZSBoZXJlCisqIEBzdWJzdHJlYW06c3Vic3Ry ZWFtIGZvciB3aGljaCB0aGUgc3RyZWFtIGZ1bmN0aW9uIGlzIGNhbGxlZAorKgorKiBUaGlzIGZ1 bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhIFBDTSBzdHJlYW0gaXMgb3BlbmVkCisqLworc3Rh dGljIGludCBzbmRfaW50ZWxoYWRfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0 cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisJc3RydWN0IHNu ZF9wY21fcnVudGltZSAqcnVudGltZTsKKwlzdHJ1Y3QgaGFkX3N0cmVhbV9wdnQgKnN0cmVhbTsK KwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCWludCByZXR2YWw7CisKKwlwcl9k ZWJ1Zygic25kX2ludGVsaGFkX29wZW4gY2FsbGVkXG4iKTsKKwlpbnRlbGhhZGRhdGEgPSBzbmRf cGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0 YS0+cHJpdmF0ZV9kYXRhOworCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlwbV9y dW50aW1lX2dldChpbnRlbGhhZGRhdGEtPmRldik7CisKKwkvKgorCSAqIEhETUkgZHJpdmVyIG1p Z2h0IHN1c3BlbmQgdGhlIGRldmljZSBhbHJlYWR5LAorCSAqIHNvIHdlIHJldHVybiBpdCBvbgor CSAqLworCWlmICghb3NwbV9wb3dlcl91c2luZ19od19iZWdpbihPU1BNX0RJU1BMQVlfSVNMQU5E LAorCQkJT1NQTV9VSEJfRk9SQ0VfUE9XRVJfT04pKSB7CisJCXByX2VycigiSERNSSBkZXZpY2Ug Y2FuJ3QgYmUgdHVybmVkIG9uXG4iKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBleGl0 X3B1dF9oYW5kbGU7CisJfQorCisJaWYgKGhhZF9nZXRfaHdzdGF0ZShpbnRlbGhhZGRhdGEpKSB7 CisJCXByX2VycigiJXM6IEhETUkgY2FibGUgcGx1Z2dlZC1vdXRcbiIsIF9fZnVuY19fKTsKKwkJ cmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBleGl0X29zcG1faGFuZGxlOworCX0KKworCS8qIENo ZWNrLCBpZiBkZXZpY2UgYWxyZWFkeSBpbiB1c2UgKi8KKwlpZiAocnVudGltZS0+cHJpdmF0ZV9k YXRhKSB7CisJCXByX2VycigiRGV2aWNlIGFscmVhZHkgaW4gdXNlXG4iKTsKKwkJcmV0dmFsID0g LUVCVVNZOworCQlnb3RvIGV4aXRfb3NwbV9oYW5kbGU7CisJfQorCisJLyogc2V0IHRoZSBydW50 aW1lIGh3IHBhcmFtZXRlciB3aXRoIGxvY2FsIHNuZF9wY21faGFyZHdhcmUgc3RydWN0ICovCisJ cnVudGltZS0+aHcgPSBzbmRfaW50ZWxfaGFkc3RyZWFtOworCisJc3RyZWFtID0ga3phbGxvYyhz aXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOworCWlmICghc3RyZWFtKSB7CisJCXJldHZhbCA9 IC1FTk9NRU07CisJCWdvdG8gZXhpdF9vc3BtX2hhbmRsZTsKKwl9CisJc3RyZWFtLT5zdHJlYW1f c3RhdHVzID0gU1RSRUFNX0lOSVQ7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gc3RyZWFtOwor CisJcmV0dmFsID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwKKwkJCSBT TkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EUyk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJZ290byBl eGl0X2VycjsKKwl9CisKKwkvKiBNYWtlIHN1cmUsIHRoYXQgdGhlIHBlcmlvZCBzaXplIGlzIGFs d2F5cyBhbGlnbmVkCisJICogNjRieXRlIGJvdW5kYXJ5CisJICovCisJcmV0dmFsID0gc25kX3Bj bV9od19jb25zdHJhaW50X3N0ZXAoc3Vic3RyZWFtLT5ydW50aW1lLCAwLAorCQkJU05EUlZfUENN X0hXX1BBUkFNX1BFUklPRF9CWVRFUywgNjQpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXByX2Vy cigiJXM6c3RlcF9zaXplPTY0IGZhaWxlZCxlcnI9JWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOwor CQlnb3RvIGV4aXRfZXJyOworCX0KKworCXJldHVybiByZXR2YWw7CitleGl0X2VycjoKKwlrZnJl ZShzdHJlYW0pOworZXhpdF9vc3BtX2hhbmRsZToKKwlvc3BtX3Bvd2VyX3VzaW5nX2h3X2VuZChP U1BNX0RJU1BMQVlfSVNMQU5EKTsKK2V4aXRfcHV0X2hhbmRsZToKKwlwbV9ydW50aW1lX3B1dChp bnRlbGhhZGRhdGEtPmRldik7CisJcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlyZXR1 cm4gcmV0dmFsOworfQorCisvKioKKyogaGFkX3BlcmlvZF9lbGFwc2VkIC0gdXBkYXRlcyB0aGUg aGFyZHdhcmUgcG9pbnRlciBzdGF0dXMKKyogQGhhZF9zdWJzdHJlYW06c3Vic3RyZWFtIGZvciB3 aGljaCB0aGUgc3RyZWFtIGZ1bmN0aW9uIGlzIGNhbGxlZAorKgorKi8KK3N0YXRpYyB2b2lkIGhh ZF9wZXJpb2RfZWxhcHNlZCh2b2lkICpoYWRfc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNt X3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gaGFkX3N1YnN0cmVhbTsKKwlzdHJ1Y3QgaGFkX3N0cmVh bV9wdnQgKnN0cmVhbTsKKworCS8qIHByX2RlYnVnKCJoYWRfcGVyaW9kX2VsYXBzZWQgY2FsbGVk XG4iKTsgKi8KKworCWlmICghc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnJ1bnRpbWUpCisJCXJl dHVybjsKKwlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpZiAo IXN0cmVhbSkKKwkJcmV0dXJuOworCisJaWYgKHN0cmVhbS0+c3RyZWFtX3N0YXR1cyAhPSBTVFJF QU1fUlVOTklORykKKwkJcmV0dXJuOworCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFt KTsKK30KKworLyoqCisqIHNuZF9pbnRlbGhhZF9pbml0X3N0cmVhbSAtIGludGVybmFsIGZ1bmN0 aW9uIHRvIGluaXRpYWxpemUgc3RyZWFtIGluZm8KKyogQHN1YnN0cmVhbTpzdWJzdHJlYW0gZm9y IHdoaWNoIHRoZSBzdHJlYW0gZnVuY3Rpb24gaXMgY2FsbGVkCisqCisqLworc3RhdGljIGludCBz bmRfaW50ZWxoYWRfaW5pdF9zdHJlYW0oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJl YW0pCit7CisJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhID0gc25kX3BjbV9zdWJz dHJlYW1fY2hpcChzdWJzdHJlYW0pOworCisJcHJfZGVidWcoInNuZF9pbnRlbGhhZF9pbml0X3N0 cmVhbSBjYWxsZWRcbiIpOworCisJcHJfZGVidWcoInNldHRpbmcgYnVmZmVyIHB0ciBwYXJhbVxu Iik7CisJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5wZXJpb2RfZWxhcHNlZCA9IGhhZF9wZXJp b2RfZWxhcHNlZDsKKwlpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW0gPSBz dWJzdHJlYW07CisJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5idWZmZXJfcHRyID0gMDsKKwlp bnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmJ1ZmZlcl9yZW5kZXJlZCA9IDA7CisJaW50ZWxoYWRk YXRhLT5zdHJlYW1faW5mby5zZnJlcSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZTsKKwlyZXR1 cm4gMDsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfY2xvc2UtIHRvIGZyZWUgcGFyYW1ldGVy ZXMgd2hlbiBzdHJlYW0gaXMgc3RvcHBlZAorICoKKyAqIEBzdWJzdHJlYW06ICBzdWJzdHJlYW0g Zm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlz IGNhbGxlZCBieSBBTFNBIGZyYW1ld29yayB3aGVuIHN0cmVhbSBpcyBzdG9wcGVkCisgKi8KK3N0 YXRpYyBpbnQgc25kX2ludGVsaGFkX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vi c3RyZWFtKQoreworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YTsKKwlzdHJ1Y3Qg c25kX3BjbV9ydW50aW1lICpydW50aW1lOworCisJcHJfZGVidWcoInNuZF9pbnRlbGhhZF9jbG9z ZSBjYWxsZWRcbiIpOworCisJaW50ZWxoYWRkYXRhID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChz dWJzdHJlYW0pOworCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlpZiAoIXJ1bnRp bWUtPnByaXZhdGVfZGF0YSkgeworCQlwcl9kZWJ1ZygiY2xvc2UoKSBtaWdodCBoYXZlIGNhbGxl ZCBhZnRlciBmYWlsZWQgb3BlbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpbnRlbGhhZGRhdGEt PnN0cmVhbV9pbmZvLmJ1ZmZlcl9yZW5kZXJlZCA9IDA7CisJaW50ZWxoYWRkYXRhLT5zdHJlYW1f aW5mby5idWZmZXJfcHRyID0gMDsKKwlpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLnN0cl9pZCA9 IDA7CisJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFtID0gTlVMTDsKKwor CS8qIENoZWNrIGlmIGZvbGxvd2luZyBkcnZfc3RhdHVzIG1vZGlmaWNhdGlvbiBpcyByZXF1aXJl ZCAtIFZBICovCisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyAhPSBIQURfRFJWX0RJU0NP Tk5FQ1RFRCkKKwkJaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID0gSEFEX0RSVl9DT05ORUNURUQ7 CisJa2ZyZWUocnVudGltZS0+cHJpdmF0ZV9kYXRhKTsKKwlydW50aW1lLT5wcml2YXRlX2RhdGEg PSBOVUxMOworCW9zcG1fcG93ZXJfdXNpbmdfaHdfZW5kKE9TUE1fRElTUExBWV9JU0xBTkQpOwor CXBtX3J1bnRpbWVfcHV0KGludGVsaGFkZGF0YS0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworLyoq CisgKiBzbmRfaW50ZWxoYWRfaHdfcGFyYW1zLSB0byBzZXR1cCB0aGUgaGFyZHdhcmUgcGFyYW1l dGVycworICogbGlrZSBhbGxvY2F0aW5nIHRoZSBidWZmZXJzCisgKgorICogQHN1YnN0cmVhbTog IHN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZAorICogQGh3X3BhcmFt czogaGFyZHdhcmUgcGFyYW1ldGVycworICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5 IEFMU0EgZnJhbWV3b3JrIHdoZW4gaGFyZHdhcmUgcGFyYW1zIGFyZSBzZXQKKyAqLworc3RhdGlj IGludCBzbmRfaW50ZWxoYWRfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vi c3RyZWFtLAorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKK3sK Kwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IHBhZ2VzLCBidWZfc2l6ZSwgcmV0dmFsOworCisJ cHJfZGVidWcoInNuZF9pbnRlbGhhZF9od19wYXJhbXMgY2FsbGVkXG4iKTsKKworCUJVR19PTigh aHdfcGFyYW1zKTsKKworCWJ1Zl9zaXplID0gcGFyYW1zX2J1ZmZlcl9ieXRlcyhod19wYXJhbXMp OworCXJldHZhbCA9IHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIGJ1Zl9zaXpl KTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKwlwcl9kZWJ1ZygiJXM6YWxs b2NhdGVkIG1lbW9yeSA9ICVkXG4iLCBfX2Z1bmNfXywgYnVmX3NpemUpOworCS8qIG1hcmsgdGhl IHBhZ2VzIGFzIHVuY2FjaGVkIHJlZ2lvbiAqLworCWFkZHIgPSAodW5zaWduZWQgbG9uZykgc3Vi c3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYTsKKwlwYWdlcyA9IChzdWJzdHJlYW0tPnJ1bnRpbWUt PmRtYV9ieXRlcyArIFBBR0VfU0laRSAtIDEpIC8gUEFHRV9TSVpFOworCXJldHZhbCA9IHNldF9t ZW1vcnlfdWMoYWRkciwgcGFnZXMpOworCWlmIChyZXR2YWwpIHsKKwkJcHJfZXJyKCJzZXRfbWVt b3J5X3VjIGZhaWxlZC5FcnJvcjolZFxuIiwgcmV0dmFsKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9 CisJbWVtc2V0KHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEsIDAsIGJ1Zl9zaXplKTsKKwor CXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogc25kX2ludGVsaGFkX2h3X2ZyZWUtIHRvIHJl bGVhc2UgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQgZHVyaW5nCisgKiBoYXJkd2FyZSBwYXJhbXMg c2V0dXAKKyAqCisgKiBAc3Vic3RyZWFtOiAgc3Vic3RyZWFtIGZvciB3aGljaCB0aGUgZnVuY3Rp b24gaXMgY2FsbGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQUxTQSBmcmFt ZXdvcmsgYmVmb3JlIGNsb3NlIGNhbGxiYWNrLgorICoKKyAqLworc3RhdGljIGludCBzbmRfaW50 ZWxoYWRfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwl1 bnNpZ25lZCBsb25nIGFkZHI7CisJdTMyIHBhZ2VzOworCisJcHJfZGVidWcoInNuZF9pbnRlbGhh ZF9od19mcmVlIGNhbGxlZFxuIik7CisKKwkvKiBtYXJrIGJhY2sgdGhlIHBhZ2VzIGFzIGNhY2hl ZC93cml0ZWJhY2sgcmVnaW9uIGJlZm9yZSB0aGUgZnJlZSAqLworCWlmIChzdWJzdHJlYW0tPnJ1 bnRpbWUtPmRtYV9hcmVhICE9IE5VTEwpIHsKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKSBzdWJz dHJlYW0tPnJ1bnRpbWUtPmRtYV9hcmVhOworCQlwYWdlcyA9IChzdWJzdHJlYW0tPnJ1bnRpbWUt PmRtYV9ieXRlcyArIFBBR0VfU0laRSAtIDEpIC8KKwkJCQkJCQkJUEFHRV9TSVpFOworCQlzZXRf bWVtb3J5X3diKGFkZHIsIHBhZ2VzKTsKKwkJcmV0dXJuIHNuZF9wY21fbGliX2ZyZWVfcGFnZXMo c3Vic3RyZWFtKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorKiBzbmRfaW50ZWxoYWRfcGNt X3RyaWdnZXIgLSBzdHJlYW0gYWN0aXZpdGllcyBhcmUgaGFuZGxlZCBoZXJlCisqIEBzdWJzdHJl YW06c3Vic3RyZWFtIGZvciB3aGljaCB0aGUgc3RyZWFtIGZ1bmN0aW9uIGlzIGNhbGxlZAorKiBA Y21kOnRoZSBzdHJlYW0gY29tbWFtZCB0aGF0cyByZXF1ZXN0ZWQgZnJvbSB1cHBlciBsYXllcgor KiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhbiBhIHN0cmVhbSBhY3Rpdml0eSBp cyBpbnZva2VkCisqLworc3RhdGljIGludCBzbmRfaW50ZWxoYWRfcGNtX3RyaWdnZXIoc3RydWN0 IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCWludCBjbWQpCit7CisJaW50IGNh cHMsIHJldHZhbCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnX2lycTsKKwlzdHJ1Y3Qgc25kX2lu dGVsaGFkICppbnRlbGhhZGRhdGE7CisJc3RydWN0IGhhZF9zdHJlYW1fcHZ0ICpzdHJlYW07CisJ c3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKworCXByX2RlYnVnKCJzbmRfaW50ZWxo YWRfcGNtX3RyaWdnZXIgY2FsbGVkXG4iKTsKKworCWludGVsaGFkZGF0YSA9IHNuZF9wY21fc3Vi c3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKwlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnBy aXZhdGVfZGF0YTsKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisK Kwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCXByX2Rl YnVnKCJUcmlnZ2VyIFN0YXJ0XG4iKTsKKworCQkvKiBEaXNhYmxlIGxvY2FsIElOVFJzIHRpbGwg cmVnaXN0ZXIgcHJnbW5nIGlzIGRvbmUgKi8KKwkJaWYgKGhhZF9nZXRfaHdzdGF0ZShpbnRlbGhh ZGRhdGEpKSB7CisJCQlwcl9lcnIoIl9TVEFSVDogSERNSSBjYWJsZSBwbHVnZ2VkLW91dFxuIik7 CisJCQlyZXR2YWwgPSAtRU5PREVWOworCQkJYnJlYWs7CisJCX0KKwkJc3RyZWFtLT5zdHJlYW1f c3RhdHVzID0gU1RSRUFNX1JVTk5JTkc7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFk ZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycSk7CisJCWhhZF9zdHJlYW0tPnN0cmVhbV90eXBl ID0gSEFEX1JVTk5JTkdfU1RSRUFNOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhh ZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnEpOworCisJCS8qIEVuYWJsZSBBdWRpbyAqLwor CQkvKgorCQkgKiBUb0RvOiBOZWVkIHRvIGVuYWJsZSBVTkRFUlJVTiBpbnRlcnJ1cHRzIGFzIHdl bGwKKwkJICogICBjYXBzID0gSERNSV9BVURJT19VTkRFUlJVTiB8IEhETUlfQVVESU9fQlVGRkVS X0RPTkU7CisJCSAqLworCQljYXBzID0gSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwkJcmV0dmFs ID0gaGFkX3NldF9jYXBzKEhBRF9TRVRfRU5BQkxFX0FVRElPX0lOVCwgJmNhcHMpOworCQlyZXR2 YWwgPSBoYWRfc2V0X2NhcHMoSEFEX1NFVF9FTkFCTEVfQVVESU8sIE5VTEwpOworCQlpbnRlbGhh ZGRhdGEtPm9wcy0+ZW5hYmxlX2F1ZGlvKHN1YnN0cmVhbSwgMSk7CisKKwkJcHJfZGVidWcoIlBy b2Nlc3NlZCBfU3RhcnRcbiIpOworCisJCWJyZWFrOworCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dF Ul9TVE9QOgorCQlwcl9kZWJ1ZygiVHJpZ2dlciBTdG9wXG4iKTsKKwkJc3Bpbl9sb2NrX2lycXNh dmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycSk7CisJCWludGVsaGFkZGF0 YS0+c3RyZWFtX2luZm8uc3RyX2lkID0gMDsKKwkJaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZiA9IDA7 CisKKwkJLyogU3RvcCByZXBvcnRpbmcgQlVGRkVSX0RPTkUvVU5ERVJSVU4gdG8gYWJvdmUgbGF5 ZXJzKi8KKworCQloYWRfc3RyZWFtLT5zdHJlYW1fdHlwZSA9IEhBRF9JTklUOworCQlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnEpOwor CQkvKiBEaXNhYmxlIEF1ZGlvICovCisJCS8qCisJCSAqIFRvRG86IE5lZWQgdG8gZGlzYWJsZSBV TkRFUlJVTiBpbnRlcnJ1cHRzIGFzIHdlbGwKKwkJICogICBjYXBzID0gSERNSV9BVURJT19VTkRF UlJVTiB8IEhETUlfQVVESU9fQlVGRkVSX0RPTkU7CisJCSAqLworCQljYXBzID0gSERNSV9BVURJ T19CVUZGRVJfRE9ORTsKKwkJaGFkX3NldF9jYXBzKEhBRF9TRVRfRElTQUJMRV9BVURJT19JTlQs ICZjYXBzKTsKKwkJaW50ZWxoYWRkYXRhLT5vcHMtPmVuYWJsZV9hdWRpbyhzdWJzdHJlYW0sIDAp OworCQkvKiBSZXNldCBidWZmZXIgcG9pbnRlcnMgKi8KKwkJaW50ZWxoYWRkYXRhLT5vcHMtPnJl c2V0X2F1ZGlvKDEpOworCQlpbnRlbGhhZGRhdGEtPm9wcy0+cmVzZXRfYXVkaW8oMCk7CisJCXN0 cmVhbS0+c3RyZWFtX3N0YXR1cyA9IFNUUkVBTV9EUk9QUEVEOworCQloYWRfc2V0X2NhcHMoSEFE X1NFVF9ESVNBQkxFX0FVRElPLCBOVUxMKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR2 YWwgPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyogc25kX2ludGVs aGFkX3BjbV9wcmVwYXJlLSBpbnRlcm5hbCBwcmVwYXJhdGlvbiBiZWZvcmUgc3RhcnRpbmcgYSBz dHJlYW0KKyoKKyogQHN1YnN0cmVhbTogIHN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9u IGlzIGNhbGxlZAorKgorKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgc3RyZWFtIGlz IHN0YXJ0ZWQgZm9yIGludGVybmFsIHByZXBhcmF0aW9uLgorKi8KK3N0YXRpYyBpbnQgc25kX2lu dGVsaGFkX3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQor eworCWludCByZXR2YWw7CisJdTMyIGRpc3Bfc2FtcF9mcmVxLCBuX3BhcmFtOworCXN0cnVjdCBz bmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50 aW1lOworCXN0cnVjdCBoYWRfcHZ0X2RhdGEgKmhhZF9zdHJlYW07CisKKwlwcl9kZWJ1Zygic25k X2ludGVsaGFkX3BjbV9wcmVwYXJlIGNhbGxlZFxuIik7CisKKwlpbnRlbGhhZGRhdGEgPSBzbmRf cGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVu dGltZTsKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisKKwlpZiAo aGFkX2dldF9od3N0YXRlKGludGVsaGFkZGF0YSkpIHsKKwkJcHJfZXJyKCIlczogSERNSSBjYWJs ZSBwbHVnZ2VkLW91dFxuIiwgX19mdW5jX18pOworCQlzbmRfcGNtX3N0b3Aoc3Vic3RyZWFtLCBT TkRSVl9QQ01fU1RBVEVfRElTQ09OTkVDVEVEKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290 byBwcmVwX2VuZDsKKwl9CisKKwlwcl9kZWJ1ZygicGVyaW9kX3NpemU9JWRcbiIsCisJCQkJZnJh bWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHJ1bnRpbWUtPnBlcmlvZF9zaXplKSk7CisJcHJfZGVidWco InBlcmlvZHM9JWRcbiIsIHJ1bnRpbWUtPnBlcmlvZHMpOworCXByX2RlYnVnKCJidWZmZXJfc2l6 ZT0lZFxuIiwgc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSkpOworCXByX2RlYnVn KCJyYXRlPSVkXG4iLCBydW50aW1lLT5yYXRlKTsKKwlwcl9kZWJ1ZygiY2hhbm5lbHM9JWRcbiIs IHJ1bnRpbWUtPmNoYW5uZWxzKTsKKworCWlmIChpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLnN0 cl9pZCkgeworCQlwcl9kZWJ1ZygiX3ByZXBhcmUgaXMgY2FsbGVkIGZvciBleGlzdGluZyBzdHJf aWQjJWRcbiIsCisJCQkJCWludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uc3RyX2lkKTsKKwkJcmV0 dmFsID0gc25kX2ludGVsaGFkX3BjbV90cmlnZ2VyKHN1YnN0cmVhbSwKKwkJCQkJCVNORFJWX1BD TV9UUklHR0VSX1NUT1ApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXJldHZhbCA9IHNuZF9p bnRlbGhhZF9pbml0X3N0cmVhbShzdWJzdHJlYW0pOworCWlmIChyZXR2YWwpCisJCWdvdG8gcHJl cF9lbmQ7CisKKworCS8qIEdldCBOIHZhbHVlIGluIEtIeiAqLworCXJldHZhbCA9IGhhZF9nZXRf Y2FwcyhIQURfR0VUX1NBTVBMSU5HX0ZSRVEsICZkaXNwX3NhbXBfZnJlcSk7CisJaWYgKHJldHZh bCkgeworCQlwcl9lcnIoInF1ZXJ5aW5nIGRpc3BsYXkgc2FtcGxpbmcgZnJlcSBmYWlsZWQgJSN4 XG4iLCByZXR2YWwpOworCQlnb3RvIHByZXBfZW5kOworCX0KKworCWhhZF9nZXRfY2FwcyhIQURf R0VUX0VMRCwgJmludGVsaGFkZGF0YS0+ZWVsZCk7CisKKwlyZXR2YWwgPSBpbnRlbGhhZGRhdGEt Pm9wcy0+cHJvZ19uKHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZSwgJm5fcGFyYW0sCisJCQkJCQkJ CWludGVsaGFkZGF0YSk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoInByb2dyYW1taW5nIE4g dmFsdWUgZmFpbGVkICUjeFxuIiwgcmV0dmFsKTsKKwkJZ290byBwcmVwX2VuZDsKKwl9CisJaW50 ZWxoYWRkYXRhLT5vcHMtPnByb2dfY3RzKHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZSwKKwkJCQkJ ZGlzcF9zYW1wX2ZyZXEsIG5fcGFyYW0sIGludGVsaGFkZGF0YSk7CisKKwlpbnRlbGhhZGRhdGEt Pm9wcy0+cHJvZ19kaXAoc3Vic3RyZWFtLCBpbnRlbGhhZGRhdGEpOworCisJcmV0dmFsID0gaW50 ZWxoYWRkYXRhLT5vcHMtPmF1ZGlvX2N0cmwoc3Vic3RyZWFtLCBpbnRlbGhhZGRhdGEpOworCisJ LyogUHJvZyBidWZmZXIgYWRkcmVzcyAqLworCXJldHZhbCA9IHNuZF9pbnRlbGhhZF9wcm9nX2J1 ZmZlcihpbnRlbGhhZGRhdGEsCisJCQlIQURfQlVGX1RZUEVfQSwgSEFEX0JVRl9UWVBFX0QpOwor CisJLyoKKwkgKiBQcm9ncmFtIGNoYW5uZWwgbWFwcGluZyBpbiBmb2xsb3dpbmcgb3JkZXI6CisJ ICogRkwsIEZSLCBDLCBMRkUsIFJMLCBSUgorCSAqLworCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFV RF9CVUZfQ0hfU1dBUCwgU1dBUF9MRkVfQ0VOVEVSKTsKKworcHJlcF9lbmQ6CisJcmV0dXJuIHJl dHZhbDsKK30KKworLyoqCisgKiBzbmRfaW50ZWxoYWRfcGNtX3BvaW50ZXItIHRvIHNlbmQgdGhl IGN1cnJlbnQgYnVmZmVyIHBvaW50ZXJwcm9jZXNzZWQgYnkgaHcKKyAqCisgKiBAc3Vic3RyZWFt OiAgc3Vic3RyZWFtIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkCisgKgorICogVGhp cyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQUxTQSBmcmFtZXdvcmsgdG8gZ2V0IHRoZSBjdXJyZW50 IGh3IGJ1ZmZlciBwdHIKKyAqIHdoZW4gYSBwZXJpb2QgaXMgZWxhcHNlZAorICovCitzdGF0aWMg c25kX3BjbV91ZnJhbWVzX3Qgc25kX2ludGVsaGFkX3BjbV9wb2ludGVyKAorCQkJCQlzdHJ1Y3Qg c25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICpp bnRlbGhhZGRhdGE7CisJdTMyIGJ5dGVzX3JlbmRlcmVkID0gMDsKKworCS8qIHByX2RlYnVnKCJz bmRfaW50ZWxoYWRfcGNtX3BvaW50ZXIgY2FsbGVkXG4iKTsgKi8KKworCWludGVsaGFkZGF0YSA9 IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKKworCWlmIChpbnRlbGhhZGRhdGEt PmZsYWdfdW5kZXJydW4pIHsKKwkJaW50ZWxoYWRkYXRhLT5mbGFnX3VuZGVycnVuID0gMDsKKwkJ cmV0dXJuIFNORFJWX1BDTV9QT1NfWFJVTjsKKwl9CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5zdHJl YW1faW5mby5idWZmZXJfcmVuZGVyZWQpCisJCWRpdl91NjRfcmVtKGludGVsaGFkZGF0YS0+c3Ry ZWFtX2luZm8uYnVmZmVyX3JlbmRlcmVkLAorCQkJaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mby5y aW5nX2J1Zl9zaXplLAorCQkJJihieXRlc19yZW5kZXJlZCkpOworCisJaW50ZWxoYWRkYXRhLT5z dHJlYW1faW5mby5idWZmZXJfcHRyID0gYnl0ZXNfdG9fZnJhbWVzKAorCQkJCQkJc3Vic3RyZWFt LT5ydW50aW1lLAorCQkJCQkJYnl0ZXNfcmVuZGVyZWQpOworCXJldHVybiBpbnRlbGhhZGRhdGEt PnN0cmVhbV9pbmZvLmJ1ZmZlcl9wdHI7Cit9CisKKy8qKgorKiBzbmRfaW50ZWxoYWRfcGNtX21t YXAtIG1tYXBzIGEga2VybmVsIGJ1ZmZlciB0byB1c2VyIHNwYWNlIGZvciBjb3B5aW5nIGRhdGEK KyoKKyogQHN1YnN0cmVhbTogIHN1YnN0cmVhbSBmb3Igd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGNh bGxlZAorKiBAdm1hOgkJc3RydWN0IGluc3RhbmNlIG9mIG1lbW9yeSBWTU0gbWVtb3J5IGFyZWEK KyoKKyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgT1Mgd2hlbiBhIHVzZXIgc3BhY2UgY29t cG9uZW50CisqIHRyaWVzIHRvIGdldCBtbWFwIG1lbW9yeSBmcm9tIGRyaXZlcgorKi8KK3N0YXRp YyBpbnQgc25kX2ludGVsaGFkX3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vi c3RyZWFtLAorCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCisJcHJfZGVidWcoInNu ZF9pbnRlbGhhZF9wY21fbW1hcCBjYWxsZWRcbiIpOworCisJcHJfZGVidWcoImVudHJ5IHdpdGgg cHJvdDolc1xuIiwgX19mdW5jX18pOworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNh Y2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJcmV0dXJuIHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZt YS0+dm1fc3RhcnQsCisJCQlzdWJzdHJlYW0tPmRtYV9idWZmZXIuYWRkciA+PiBQQUdFX1NISUZU LAorCQkJdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9 CisKK2ludCBoZG1pX2F1ZGlvX21vZGVfY2hhbmdlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAq c3Vic3RyZWFtKQoreworCWludCByZXR2YWwgPSAwOworCXUzMiBkaXNwX3NhbXBfZnJlcSwgbl9w YXJhbTsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisKKwlpbnRlbGhhZGRh dGEgPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisKKwkvKiBEaXNhYmxlIEF1 ZGlvICovCisJaW50ZWxoYWRkYXRhLT5vcHMtPmVuYWJsZV9hdWRpbyhzdWJzdHJlYW0sIDApOwor CisJLyogVXBkYXRlIENUUyB2YWx1ZSAqLworCXJldHZhbCA9IGhhZF9nZXRfY2FwcyhIQURfR0VU X1NBTVBMSU5HX0ZSRVEsICZkaXNwX3NhbXBfZnJlcSk7CisJaWYgKHJldHZhbCkgeworCQlwcl9l cnIoInF1ZXJ5aW5nIGRpc3BsYXkgc2FtcGxpbmcgZnJlcSBmYWlsZWQgJSN4XG4iLCByZXR2YWwp OworCQlnb3RvIG91dDsKKwl9CisKKwlyZXR2YWwgPSBpbnRlbGhhZGRhdGEtPm9wcy0+cHJvZ19u KHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZSwgJm5fcGFyYW0sCisJCQkJCQkJCWludGVsaGFkZGF0 YSk7CisJaWYgKHJldHZhbCkgeworCQlwcl9lcnIoInByb2dyYW1taW5nIE4gdmFsdWUgZmFpbGVk ICUjeFxuIiwgcmV0dmFsKTsKKwkJZ290byBvdXQ7CisJfQorCWludGVsaGFkZGF0YS0+b3BzLT5w cm9nX2N0cyhzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGUsCisJCQkJCWRpc3Bfc2FtcF9mcmVxLCBu X3BhcmFtLCBpbnRlbGhhZGRhdGEpOworCisJLyogRW5hYmxlIEF1ZGlvICovCisJaW50ZWxoYWRk YXRhLT5vcHMtPmVuYWJsZV9hdWRpbyhzdWJzdHJlYW0sIDEpOworCitvdXQ6CisJcmV0dXJuIHJl dHZhbDsKK30KKworLypQQ00gb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgYW5kIHRoZSBjYWxscyBiYWNr IGZvciB0aGUgc2FtZSAqLworc3RydWN0IHNuZF9wY21fb3BzIHNuZF9pbnRlbGhhZF9wbGF5YmFj a19vcHMgPSB7CisJLm9wZW4gPQkJc25kX2ludGVsaGFkX29wZW4sCisJLmNsb3NlID0Jc25kX2lu dGVsaGFkX2Nsb3NlLAorCS5pb2N0bCA9CXNuZF9wY21fbGliX2lvY3RsLAorCS5od19wYXJhbXMg PQlzbmRfaW50ZWxoYWRfaHdfcGFyYW1zLAorCS5od19mcmVlID0Jc25kX2ludGVsaGFkX2h3X2Zy ZWUsCisJLnByZXBhcmUgPQlzbmRfaW50ZWxoYWRfcGNtX3ByZXBhcmUsCisJLnRyaWdnZXIgPQlz bmRfaW50ZWxoYWRfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPQlzbmRfaW50ZWxoYWRfcGNtX3Bv aW50ZXIsCisJLm1tYXAgPQlzbmRfaW50ZWxoYWRfcGNtX21tYXAsCit9OworCisvKioKKyAqIHNu ZF9pbnRlbGhhZF9jcmVhdGUgLSB0byBjcmV0ZSBhbHNhIGNhcmQgaW5zdGFuY2UKKyAqCisgKiBA aW50ZWxoYWRkYXRhOiBwb2ludGVyIHRvIGludGVybmFsIGNvbnRleHQKKyAqIEBjYXJkOiBwb2lu dGVyIHRvIGNhcmQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBoZG1p IGNhYmxlIGlzIHBsdWdnZWQgaW4KKyAqLworc3RhdGljIGludCBzbmRfaW50ZWxoYWRfY3JlYXRl KAorCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEsCisJCXN0cnVjdCBzbmRfY2Fy ZCAqY2FyZCkKK3sKKwlpbnQgcmV0dmFsOworCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMg b3BzID0geworCX07CisKKwlCVUdfT04oIWludGVsaGFkZGF0YSk7CisJLyogQUxTQSBhcGkgdG8g cmVnaXN0ZXIgdGhlIGRldmljZSAqLworCXJldHZhbCA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNO RFJWX0RFVl9MT1dMRVZFTCwgaW50ZWxoYWRkYXRhLCAmb3BzKTsKKwlyZXR1cm4gcmV0dmFsOwor fQorLyoqCisgKiBzbmRfaW50ZWxoYWRfcGNtX2ZyZWUgLSB0byBmcmVlIHRoZSBtZW1vcnkgYWxs b2NhdGVkCisgKgorICogQHBjbTogcG9pbnRlciB0byBwY20gaW5zdGFuY2UKKyAqIFRoaXMgZnVu Y3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIGRldmljZSBpcyByZW1vdmVkCisgKi8KK3N0YXRpYyB2 b2lkIHNuZF9pbnRlbGhhZF9wY21fZnJlZShzdHJ1Y3Qgc25kX3BjbSAqcGNtKQoreworCXByX2Rl YnVnKCJGcmVlaW5nIFBDTSBwcmVhbGxvY2F0ZWQgcGFnZXNcbiIpOworCXNuZF9wY21fbGliX3By ZWFsbG9jYXRlX2ZyZWVfZm9yX2FsbChwY20pOworfQorCitzdGF0aWMgaW50IGhhZF9pZWM5NThf aW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9l bGVtX2luZm8gKnVpbmZvKQoreworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9J RUM5NTg7CisJdWluZm8tPmNvdW50ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBo YWRfaWVjOTU4X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qg c25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICpp bnRlbGhhZGRhdGEgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl1Y29udHJvbC0+ dmFsdWUuaWVjOTU4LnN0YXR1c1swXSA9IChpbnRlbGhhZGRhdGEtPmFlc19iaXRzID4+IDApICYg MHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IChpbnRlbGhhZGRhdGEt PmFlc19iaXRzID4+IDgpICYgMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sy XSA9CisJCQkJCShpbnRlbGhhZGRhdGEtPmFlc19iaXRzID4+IDE2KSAmIDB4ZmY7CisJdWNvbnRy b2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbM10gPQorCQkJCQkoaW50ZWxoYWRkYXRhLT5hZXNfYml0 cyA+PiAyNCkgJiAweGZmOworCXJldHVybiAwOworfQorc3RhdGljIGludCBoYWRfaWVjOTU4X21h c2tfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3Rs X2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVz WzBdID0gMHhmZjsKKwl1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1sxXSA9IDB4ZmY7CisJ dWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMl0gPSAweGZmOworCXVjb250cm9sLT52YWx1 ZS5pZWM5NTguc3RhdHVzWzNdID0gMHhmZjsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgaGFk X2llYzk1OF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNu ZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1 Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJv bCk7CisKKwlwcl9kZWJ1ZygiZW50ZXJlZCBoYWRfaWVjOTU4X3B1dFxuIik7CisJdmFsID0gKHVj b250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdIDw8IDApIHwKKwkJKHVjb250cm9sLT52YWx1 ZS5pZWM5NTguc3RhdHVzWzFdIDw8IDgpIHwKKwkJKHVjb250cm9sLT52YWx1ZS5pZWM5NTguc3Rh dHVzWzJdIDw8IDE2KSB8CisJCSh1Y29udHJvbC0+dmFsdWUuaWVjOTU4LnN0YXR1c1szXSA8PCAy NCk7CisJaWYgKGludGVsaGFkZGF0YS0+YWVzX2JpdHMgIT0gdmFsKSB7CisJCWludGVsaGFkZGF0 YS0+YWVzX2JpdHMgPSB2YWw7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMTsKK30KKworc3Rh dGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhhZF9jb250cm9sX2llYzk1OF9tYXNrID0gewor CS5hY2Nlc3MgPSAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFELAorCS5pZmFjZSA9ICAgIFNO RFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFtZSA9ICAgICBTTkRSVl9DVExfTkFNRV9JRUM5 NTgoIiIsIFBMQVlCQUNLLCBNQVNLKSwKKwkuaW5mbyA9ICAgICBoYWRfaWVjOTU4X2luZm8sIC8q IHNoYXJlZCAqLworCS5nZXQgPSAgICAgIGhhZF9pZWM5NThfbWFza19nZXQsCit9OworCitzdGF0 aWMgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaGFkX2NvbnRyb2xfaWVjOTU4ID0geworCS5pZmFj ZSA9ICAgIFNORFJWX0NUTF9FTEVNX0lGQUNFX1BDTSwKKwkubmFtZSA9ICAgICAgICAgU05EUlZf Q1RMX05BTUVfSUVDOTU4KCIiLCBQTEFZQkFDSywgREVGQVVMVCksCisJLmluZm8gPSAgICAgICAg IGhhZF9pZWM5NThfaW5mbywKKwkuZ2V0ID0gICAgICAgICAgaGFkX2llYzk1OF9nZXQsCisJLnB1 dCA9ICAgICAgICAgIGhhZF9pZWM5NThfcHV0Cit9OworCitzdGF0aWMgc3RydWN0IHNuZF9pbnRl bF9oYWRfaW50ZXJmYWNlIGhhZF9pbnRlcmZhY2UgPSB7CisJLm5hbWUgPSAgICAgICAgICJoZG1p LWF1ZGlvIiwKKwkucXVlcnkgPSAgICAgICAgaGRtaV9hdWRpb19xdWVyeSwKKwkuc3VzcGVuZCA9 ICAgICAgaGRtaV9hdWRpb19zdXNwZW5kLAorCS5yZXN1bWUgPSAgICAgICBoZG1pX2F1ZGlvX3Jl c3VtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaGFkX29wcyBoYWRfb3BzX3YxID0geworCS5lbmFi bGVfYXVkaW8gPSBzbmRfaW50ZWxoYWRfZW5hYmxlX2F1ZGlvX3YxLAorCS5yZXNldF9hdWRpbyA9 IHNuZF9pbnRlbGhhZF9yZXNldF9hdWRpb192MSwKKwkucHJvZ19uID0Jc25kX2ludGVsaGFkX3By b2dfbl92MSwKKwkucHJvZ19jdHMgPQlzbmRfaW50ZWxoYWRfcHJvZ19jdHNfdjEsCisJLmF1ZGlv X2N0cmwgPQlzbmRfaW50ZWxoYWRfcHJvZ19hdWRpb19jdHJsX3YxLAorCS5wcm9nX2RpcCA9CXNu ZF9pbnRlbGhhZF9wcm9nX2RpcF92MSwKKwkuaGFuZGxlX3VuZGVycnVuID0gIGhhZF9jbGVhcl91 bmRlcnJ1bl9pbnRyX3YxLAorfTsKKworc3RhdGljIHN0cnVjdCBoYWRfb3BzIGhhZF9vcHNfdjIg PSB7CisJLmVuYWJsZV9hdWRpbyA9IHNuZF9pbnRlbGhhZF9lbmFibGVfYXVkaW9fdjIsCisJLnJl c2V0X2F1ZGlvID0gc25kX2ludGVsaGFkX3Jlc2V0X2F1ZGlvX3YyLAorCS5wcm9nX24gPQlzbmRf aW50ZWxoYWRfcHJvZ19uX3YyLAorCS5wcm9nX2N0cyA9CXNuZF9pbnRlbGhhZF9wcm9nX2N0c192 MiwKKwkuYXVkaW9fY3RybCA9CXNuZF9pbnRlbGhhZF9wcm9nX2F1ZGlvX2N0cmxfdjIsCisJLnBy b2dfZGlwID0Jc25kX2ludGVsaGFkX3Byb2dfZGlwX3YyLAorCS5oYW5kbGVfdW5kZXJydW4gPSBo YWRfY2xlYXJfdW5kZXJydW5faW50cl92MiwKK307CisvKioKKyAqIGhkbWlfYXVkaW9fcHJvYmUg LSB0byBjcmVhdGUgc291bmQgY2FyZCBpbnN0YW5jZSBmb3IgSERNSSBhdWRpbyBwbGF5YWJjawor ICoKKyAqQGhhZGRhdGE6IHBvaW50ZXIgdG8gSEFEIHByaXZhdGUgZGF0YQorICpAY2FyZF9pZDog Y2FyZCBmb3Igd2hpY2ggcHJvYmUgaXMgY2FsbGVkCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBj YWxsZWQgd2hlbiB0aGUgaGRtaSBjYWJsZSBpcyBwbHVnZ2VkIGluLiBUaGlzIGZ1bmN0aW9uCisg KiBjcmVhdGVzIGFuZCByZWdpc3RlcnMgdGhlIHNvdW5kIGNhcmQgd2l0aCBBTFNBCisgKi8KK3N0 YXRpYyBpbnQgaGRtaV9hdWRpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXZwdHIp Cit7CisKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBzbmRfcGNtICpwY207CisJc3RydWN0IHNuZF9j YXJkICpjYXJkOworCXN0cnVjdCBoYWRfY2FsbGJhY2tfb3BzIG9wc19jYjsKKwlzdHJ1Y3Qgc25k X2ludGVsaGFkICppbnRlbGhhZGRhdGE7CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVh bTsKKworCXByX2RlYnVnKCJFbnRlciAlc1xuIiwgX19mdW5jX18pOworCisJcHJfZGVidWcoImhk bWlfYXVkaW9fcHJvYmUgZG1hX21hc2s6ICVkXG4iLCBkZXZwdHItPmRldi5kbWFfbWFzayk7CisK KwkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNhdmluZyBpbnRlcm5hbCBjb250ZXh0IGFuZCB3b3Jr aW5nICovCisJaW50ZWxoYWRkYXRhID0ga3phbGxvYyhzaXplb2YoKmludGVsaGFkZGF0YSksIEdG UF9LRVJORUwpOworCWlmICghaW50ZWxoYWRkYXRhKSB7CisJCXByX2VycigibWVtIGFsbG9jIGZh aWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWhhZF9zdHJlYW0gPSBremFsbG9j KHNpemVvZigqaGFkX3N0cmVhbSksIEdGUF9LRVJORUwpOworCWlmICghaGFkX3N0cmVhbSkgewor CQlwcl9lcnIoIm1lbSBhbGxvYyBmYWlsZWRcbiIpOworCQlyZXR2YWwgPSAtRU5PTUVNOworCQln b3RvIGZyZWVfaGFkZGF0YTsKKwl9CisKKwloYWRfZGF0YSA9IGludGVsaGFkZGF0YTsKKwlvcHNf Y2IuaW50ZWxfaGFkX2V2ZW50X2NhbGxfYmFjayA9IGhhZF9ldmVudF9oYW5kbGVyOworCisJLyog cmVnaXN0ZXJpbmcgd2l0aCBkaXNwbGF5IGRyaXZlciB0byBnZXQgYWNjZXNzIHRvIGRpc3BsYXkg QVBJcyAqLworCisJcmV0dmFsID0gbWlkX2hkbWlfYXVkaW9fc2V0dXAoCisJCQlvcHNfY2IuaW50 ZWxfaGFkX2V2ZW50X2NhbGxfYmFjaywKKwkJCSYoaW50ZWxoYWRkYXRhLT5yZWdfb3BzKSwKKwkJ CSYoaW50ZWxoYWRkYXRhLT5xdWVyeV9vcHMpKTsKKwlpZiAocmV0dmFsKSB7CisJCXByX2Vycigi cXVlcnlpbmcgZGlzcGxheSBkcml2ZXIgQVBJcyBmYWlsZWQgJSN4XG4iLCByZXR2YWwpOworCQln b3RvIGZyZWVfaGFkc3RyZWFtOworCX0KKwltdXRleF9sb2NrKCZoYWRfbXV0ZXgpOworCXNwaW5f bG9ja19pbml0KCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jayk7CisJaW50ZWxoYWRkYXRhLT5k cnZfc3RhdHVzID0gSEFEX0RSVl9ESVNDT05ORUNURUQ7CisJLyogY3JlYXRlIGEgY2FyZCBpbnN0 YW5jZSB3aXRoIEFMU0EgZnJhbWV3b3JrICovCisJcmV0dmFsID0gc25kX2NhcmRfbmV3KCZkZXZw dHItPmRldiwgaGRtaV9jYXJkX2luZGV4LCBoZG1pX2NhcmRfaWQsCisJCQkJVEhJU19NT0RVTEUs IDAsICZjYXJkKTsKKworCWlmIChyZXR2YWwpCisJCWdvdG8gdW5sb2NrX211dGV4OworCWludGVs aGFkZGF0YS0+Y2FyZCA9IGNhcmQ7CisJaW50ZWxoYWRkYXRhLT5jYXJkX2lkID0gaGRtaV9jYXJk X2lkOworCWludGVsaGFkZGF0YS0+Y2FyZF9pbmRleCA9IGNhcmQtPm51bWJlcjsKKwlpbnRlbGhh ZGRhdGEtPnByaXZhdGVfZGF0YSA9IGhhZF9zdHJlYW07CisJaW50ZWxoYWRkYXRhLT5mbGFnX3Vu ZGVycnVuID0gMDsKKwlpbnRlbGhhZGRhdGEtPmFlc19iaXRzID0gU05EUlZfUENNX0RFRkFVTFRf Q09OX1NQRElGOworCXN0cm5jcHkoY2FyZC0+ZHJpdmVyLCBJTlRFTF9IQUQsIHN0cmxlbihJTlRF TF9IQUQpKTsKKwlzdHJuY3B5KGNhcmQtPnNob3J0bmFtZSwgSU5URUxfSEFELCBzdHJsZW4oSU5U RUxfSEFEKSk7CisKKwlyZXR2YWwgPSBzbmRfcGNtX25ldyhjYXJkLCBJTlRFTF9IQUQsIFBDTV9J TkRFWCwgTUFYX1BCX1NUUkVBTVMsCisJCQkJCQlNQVhfQ0FQX1NUUkVBTVMsICZwY20pOworCWlm IChyZXR2YWwpCisJCWdvdG8gZXJyOworCisJLyogc2V0dXAgcHJpdmF0ZSBkYXRhIHdoaWNoIGNh biBiZSByZXRyaWV2ZWQgd2hlbiByZXF1aXJlZCAqLworCXBjbS0+cHJpdmF0ZV9kYXRhID0gaW50 ZWxoYWRkYXRhOworCXBjbS0+cHJpdmF0ZV9mcmVlID0gc25kX2ludGVsaGFkX3BjbV9mcmVlOwor CXBjbS0+aW5mb19mbGFncyA9IDA7CisJc3RybmNweShwY20tPm5hbWUsIGNhcmQtPnNob3J0bmFt ZSwgc3RybGVuKGNhcmQtPnNob3J0bmFtZSkpOworCS8qIHNldHVwIHRoZSBvcHMgZm9yIHBhbHlh YmNrICovCisJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywK KwkJCSAgICAmc25kX2ludGVsaGFkX3BsYXliYWNrX29wcyk7CisJLyogYWxsb2NhdGUgZG1hIHBh Z2VzIGZvciBBTFNBIHN0cmVhbSBvcGVyYXRpb25zCisJICogbWVtb3J5IGFsbG9jYXRlZCBpcyBi YXNlZCBvbiBzaXplLCBub3QgbWF4IHZhbHVlCisJICogdGh1cyB1c2luZyBzYW1lIGFyZ3VtZW50 IGZvciBtYXggJiBzaXplCisJICovCisJcmV0dmFsID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVf cGFnZXNfZm9yX2FsbChwY20sCisJCQlTTkRSVl9ETUFfVFlQRV9ERVYsIE5VTEwsCisJCQlIQURf TUFYX0JVRkZFUiwgSEFEX01BWF9CVUZGRVIpOworCisJaWYgKGNhcmQtPmRldiA9PSBOVUxMKQor CQlwcl9kZWJ1ZygiY2FyZC0+ZGV2IGlzIE5VTEwhISEhISBTaG91bGQgbm90IGJlIHRoaXMgY2Fz ZVxuIik7CisJZWxzZSBpZiAoY2FyZC0+ZGV2LT5kbWFfbWFzayA9PSBOVUxMKQorCQlwcl9kZWJ1 ZygiaGRtaV9hdWRpb19wcm9iZSBkbWFfbWFzayBpcyBOVUxMISEhISFcbiIpOworCWVsc2UKKwkJ cHJfZGVidWcoImhkbWlfYXVkaW9fcHJvYmUgZG1hX21hc2sgaXMgOiAlZFxuIiwgY2FyZC0+ZGV2 LT5kbWFfbWFzayk7CisKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycjsKKworCS8qIGludGVybmFs IGZ1bmN0aW9uIGNhbGwgdG8gcmVnaXN0ZXIgZGV2aWNlIHdpdGggQUxTQSAqLworCXJldHZhbCA9 IHNuZF9pbnRlbGhhZF9jcmVhdGUoaW50ZWxoYWRkYXRhLCBjYXJkKTsKKwlpZiAocmV0dmFsKQor CQlnb3RvIGVycjsKKworCWNhcmQtPnByaXZhdGVfZGF0YSA9ICZpbnRlbGhhZGRhdGE7CisJcmV0 dmFsID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnI7 CisKKwkvKiBJRUM5NTggY29udHJvbHMgKi8KKwlyZXR2YWwgPSBzbmRfY3RsX2FkZChjYXJkLCBz bmRfY3RsX25ldzEoJmhhZF9jb250cm9sX2llYzk1OF9tYXNrLAorCQkJCQkJaW50ZWxoYWRkYXRh KSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZXJyOworCXJldHZhbCA9IHNuZF9jdGxfYWRk KGNhcmQsIHNuZF9jdGxfbmV3MSgmaGFkX2NvbnRyb2xfaWVjOTU4LAorCQkJCQkJaW50ZWxoYWRk YXRhKSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gZXJyOworCisJaW5pdF9jaGFubmVsX2Fs bG9jYXRpb25zKCk7CisKKwkvKiBSZWdpc3RlciBjaGFubmVsIG1hcCBjb250cm9scyAqLworCXJl dHZhbCA9IGhhZF9yZWdpc3Rlcl9jaG1hcF9jdGxzKGludGVsaGFkZGF0YSwgcGNtKTsKKwlpZiAo cmV0dmFsIDwgMCkKKwkJZ290byBlcnI7CisKKwlpbnRlbGhhZGRhdGEtPmRldiA9ICZkZXZwdHIt PmRldjsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoaW50ZWxoYWRkYXRhLT5kZXYpOworCXBtX3J1 bnRpbWVfZW5hYmxlKGludGVsaGFkZGF0YS0+ZGV2KTsKKworCW11dGV4X3VubG9jaygmaGFkX211 dGV4KTsKKwlyZXR2YWwgPSBtaWRfaGRtaV9hdWRpb19yZWdpc3RlcigmaGFkX2ludGVyZmFjZSwg aW50ZWxoYWRkYXRhKTsKKwlpZiAocmV0dmFsKSB7CisJCXByX2VycigicmVnaXN0ZXJpbmcgd2l0 aCBkaXNwbGF5IGRyaXZlciBmYWlsZWQgJSN4XG4iLCByZXR2YWwpOworCQlzbmRfY2FyZF9mcmVl KGNhcmQpOworCQlnb3RvIGZyZWVfaGFkc3RyZWFtOworCX0KKworCWludGVsaGFkZGF0YS0+aHdf c2lsZW5jZSA9IDE7CisJLyogUElQRSBBIGlzIHVzZWQgZm9yIEhETUkqLworCWludGVsaGFkZGF0 YS0+YXVkaW9fcmVnX2Jhc2UgPSAweDY1MDAwOworCWludGVsaGFkZGF0YS0+b3BzID0gJmhhZF9v cHNfdjI7CisKKwlyZXR1cm4gcmV0dmFsOworZXJyOgorCXNuZF9jYXJkX2ZyZWUoY2FyZCk7Cit1 bmxvY2tfbXV0ZXg6CisJbXV0ZXhfdW5sb2NrKCZoYWRfbXV0ZXgpOworZnJlZV9oYWRzdHJlYW06 CisJa2ZyZWUoaGFkX3N0cmVhbSk7CisJcG1fcnVudGltZV9kaXNhYmxlKGludGVsaGFkZGF0YS0+ ZGV2KTsKKwlpbnRlbGhhZGRhdGEtPmRldiA9IE5VTEw7CitmcmVlX2hhZGRhdGE6CisJa2ZyZWUo aW50ZWxoYWRkYXRhKTsKKwlpbnRlbGhhZGRhdGEgPSBOVUxMOworCXByX2VycigiRXJyb3IgcmV0 dXJuZWQgZnJvbSAlcyBhcGkgJSN4XG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKKwlyZXR1cm4gcmV0 dmFsOworfQorCisvKioKKyAqIGhkbWlfYXVkaW9fcmVtb3ZlIC0gcmVtb3ZlcyB0aGUgYWxzYSBj YXJkCisgKgorICpAaGFkZGF0YTogcG9pbnRlciB0byBIQUQgcHJpdmF0ZSBkYXRhCisgKgorICog VGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgaGRtaSBjYWJsZSBpcyB1bi1wbHVnZ2Vk LiBUaGlzIGZ1bmN0aW9uCisgKiBmcmVlIHRoZSBzb3VuZCBjYXJkLgorICovCitzdGF0aWMgaW50 IGhkbWlfYXVkaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldnB0cikKK3sKKwlz dHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSBoYWRfZGF0YTsKKwlpbnQgY2FwczsK KworCXByX2RlYnVnKCJFbnRlciAlc1xuIiwgX19mdW5jX18pOworCisJaWYgKCFpbnRlbGhhZGRh dGEpCisJCXJldHVybiAwOworCisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyAhPSBIQURf RFJWX0RJU0NPTk5FQ1RFRCkgeworCQljYXBzID0gSERNSV9BVURJT19VTkRFUlJVTiB8IEhETUlf QVVESU9fQlVGRkVSX0RPTkU7CisJCWhhZF9zZXRfY2FwcyhIQURfU0VUX0RJU0FCTEVfQVVESU9f SU5ULCAmY2Fwcyk7CisJCWhhZF9zZXRfY2FwcyhIQURfU0VUX0RJU0FCTEVfQVVESU8sIE5VTEwp OworCX0KKwlzbmRfY2FyZF9mcmVlKGludGVsaGFkZGF0YS0+Y2FyZCk7CisJa2ZyZWUoaW50ZWxo YWRkYXRhLT5wcml2YXRlX2RhdGEpOworCWtmcmVlKGludGVsaGFkZGF0YSk7CisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgaGFkX3BtX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpk ZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFkX3BtX3J1bnRpbWVfcmVzdW1l KHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYWRf cG1fcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gcG1fc2NoZWR1 bGVfc3VzcGVuZChkZXYsIEhBRF9TVVNQRU5EX0RFTEFZKTsKK30KKworY29uc3Qgc3RydWN0IGRl dl9wbV9vcHMgaGFkX3BtX29wcyA9IHsKKwkucnVudGltZV9pZGxlID0gaGFkX3BtX3J1bnRpbWVf aWRsZSwKKwkucnVudGltZV9zdXNwZW5kID0gaGFkX3BtX3J1bnRpbWVfc3VzcGVuZCwKKwkucnVu dGltZV9yZXN1bWUgPSBoYWRfcG1fcnVudGltZV9yZXN1bWUsCit9OworCitzdGF0aWMgY29uc3Qg c3RydWN0IGFjcGlfZGV2aWNlX2lkIGhhZF9hY3BpX2lkc1tdID0geworCXsgIkhBRDBGMjgiLCAw IH0sCisJeyAiSEFEMDIyQTgiLCAwIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShh Y3BpLCBoYWRfYWNwaV9pZHMpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoYWRf ZHJpdmVyID0geworCS5wcm9iZSA9ICAgICAgICBoZG1pX2F1ZGlvX3Byb2JlLAorCS5yZW1vdmUJ CT0gaGRtaV9hdWRpb19yZW1vdmUsCisJLnN1c3BlbmQgPSAgICAgIE5VTEwsCisJLnJlc3VtZSA9 ICAgICAgIE5VTEwsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gSERNSV9BVURJT19EUklWRVIs CisjaWZkZWYgQ09ORklHX1BNCisJCS5wbQk9ICZoYWRfcG1fb3BzLAorI2VuZGlmCisJCS5hY3Bp X21hdGNoX3RhYmxlID0gQUNQSV9QVFIoaGFkX2FjcGlfaWRzKSwKKwl9LAorfTsKKworLyoKKyog YWxzYV9jYXJkX2ludGVsaGFkX2luaXQtIGRyaXZlciBpbml0IGZ1bmN0aW9uCisqIFRoaXMgZnVu Y3Rpb24gaXMgY2FsbGVkIHdoZW4gZHJpdmVyIG1vZHVsZSBpcyBpbnNlcnRlZAorKi8KK3N0YXRp YyBpbnQgX19pbml0IGFsc2FfY2FyZF9pbnRlbGhhZF9pbml0KHZvaWQpCit7CisJaW50IHJldHZh bDsKKworCXByX2RlYnVnKCJFbnRlciAlc1xuIiwgX19mdW5jX18pOworCisJcHJfaW5mbygiKioq KioqKiogSEFEIERSSVZFUiBsb2FkaW5nLi4gVmVyOiAlc1xuIiwKKwkJCQkJSEFEX0RSSVZFUl9W RVJTSU9OKTsKKworCXJldHZhbCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaGFkX2RyaXZl cik7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcHJfZXJyKCJQbGF0Zm9ybSBkcml2ZXIgcmVnaXN0 ZXIgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlwcl9kZWJ1ZygiaW5pdCBj b21wbGV0ZVxuIik7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisqIGFsc2FfY2FyZF9pbnRl bGhhZF9leGl0LSBkcml2ZXIgZXhpdCBmdW5jdGlvbgorKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxl ZCB3aGVuIGRyaXZlciBtb2R1bGUgaXMgcmVtb3ZlZAorKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBh bHNhX2NhcmRfaW50ZWxoYWRfZXhpdCh2b2lkKQoreworCXByX2RlYnVnKCJoYWRfZXhpdCBjYWxs ZWRcbiIpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZoYWRfZHJpdmVyKTsKK30KK2xh dGVfaW5pdGNhbGwoYWxzYV9jYXJkX2ludGVsaGFkX2luaXQpOworbW9kdWxlX2V4aXQoYWxzYV9j YXJkX2ludGVsaGFkX2V4aXQpOwpkaWZmIC0tZ2l0IGEvc291bmQvaGRtaV9hdWRpby9pbnRlbF9t aWRfaGRtaV9hdWRpby5oIGIvc291bmQvaGRtaV9hdWRpby9pbnRlbF9taWRfaGRtaV9hdWRpby5o Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNTRiOTcKLS0tIC9kZXYvbnVs bAorKysgYi9zb3VuZC9oZG1pX2F1ZGlvL2ludGVsX21pZF9oZG1pX2F1ZGlvLmgKQEAgLTAsMCAr MSw3NDAgQEAKKy8qCisgKiAgIGludGVsX21pZF9oZG1pX2F1ZGlvLmggLSBJbnRlbCBIRE1JIGF1 ZGlvIGRyaXZlciBmb3IgTUlECisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBJbnRlbCBDb3Jw CisgKiAgQXV0aG9yczoJU2FpbGFqYSBCYW5kYXJ1cGFsbGkgPHNhaWxhamEuYmFuZGFydXBhbGxp QGludGVsLmNvbT4KKyAqCQlSYW1lc2ggQmFidSBLIFYJPHJhbWVzaC5iYWJ1QGludGVsLmNvbT4K KyAqCQlWYWliaGF2IEFnYXJ3YWwgPHZhaWJoYXYuYWdhcndhbEBpbnRlbC5jb20+CisgKiAgfn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICog IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4K KyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg d2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2 ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgor ICogQUxTQSBkcml2ZXIgZm9yIEludGVsIE1JRCBIRE1JIGF1ZGlvIGNvbnRyb2xsZXIKKyAqLwor I2lmbmRlZiBfX0lOVEVMX01JRF9IRE1JX0FVRElPX0gKKyNkZWZpbmUgX19JTlRFTF9NSURfSERN SV9BVURJT19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPHNvdW5kL2lu aXR2YWwuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvcG1f cnVudGltZS5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZGVmLmg+CisjaW5jbHVkZSA8c291bmQv Y29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPGhkbWlfYXVkaW9f aWYuaD4KKworI2RlZmluZSBPU1BNX0RJU1BMQVlfSVNMQU5ECTB4NDAKKwordHlwZWRlZiBlbnVt IF9VSEJVc2FnZSB7CisJT1NQTV9VSEJfT05MWV9JRl9PTiA9IDAsCisJT1NQTV9VSEJfRk9SQ0Vf UE9XRVJfT04sCit9IFVIQlVzYWdlOworCitib29sIG9zcG1fcG93ZXJfdXNpbmdfaHdfYmVnaW4o aW50IGh3X2lzbGFuZCwgVUhCVXNhZ2UgdXNhZ2UpOwordm9pZCBvc3BtX3Bvd2VyX3VzaW5nX2h3 X2VuZChpbnQgaHdfaXNsYW5kKTsKKworLyoKKyAqIFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGRvIGFu IGluc3RhbnRhbmVvdXMgY2hlY2sgZm9yIGlmIHRoZSBodyBpcyBvbi4KKyAqIE9ubHkgdXNlIHRo aXMgaW4gY2FzZXMgd2hlcmUgeW91IGtub3cgdGhlIGdfc3RhdGVfY2hhbmdlX211dGV4CisgKiBp cyBhbHJlYWR5IGhlbGQgc3VjaCBhcyBpbiBpcnEgaW5zdGFsbC91bmluc3RhbGwgYW5kIHlvdSBu ZWVkIHRvCisgKiBwcmV2ZW50IGEgZGVhZGxvY2sgc2l0dWF0aW9uLiAgT3RoZXJ3aXNlIHVzZSBv c3BtX3Bvd2VyX3VzaW5nX2h3X2JlZ2luKCkuCisgKi8KK2Jvb2wgb3NwbV9wb3dlcl9pc19od19v bihpbnQgaHdfaXNsYW5kcyk7CisKKyNkZWZpbmUgSEFEX0RSSVZFUl9WRVJTSU9OCSIwLjAxLjAw MyIKKyNkZWZpbmUgSEFEX01BWF9ERVZJQ0VTCQkxCisjZGVmaW5lIEhBRF9NSU5fQ0hBTk5FTAkJ MgorI2RlZmluZSBIQURfTUFYX0NIQU5ORUwJCTgKKyNkZWZpbmUgSEFEX05VTV9PRl9SSU5HX0JV RlMJNAorCisvKiBBc3N1bWUgMTkyS0h6LCA4Y2hhbm5lbCwgMjVtc2VjIHBlcmlvZCAqLworI2Rl ZmluZSBIQURfTUFYX0JVRkZFUgkJKDYwMCoxMDI0KQorI2RlZmluZSBIQURfTUlOX0JVRkZFUgkJ KDMyKjEwMjQpCisjZGVmaW5lIEhBRF9NQVhfUEVSSU9EUwkJNAorI2RlZmluZSBIQURfTUlOX1BF UklPRFMJCTQKKyNkZWZpbmUgSEFEX01BWF9QRVJJT0RfQllURVMJKEhBRF9NQVhfQlVGRkVSL0hB RF9NSU5fUEVSSU9EUykKKyNkZWZpbmUgSEFEX01JTl9QRVJJT0RfQllURVMJMjU2CisjZGVmaW5l IEhBRF9GSUZPX1NJWkUJCTAgLyogZmlmbyBub3QgYmVpbmcgdXNlZCAqLworI2RlZmluZSBNQVhf U1BFQUtFUlMJCTgKKy8qIFRPRE86IEFkZCBvd24gdGx2IHdoZW4gY2hhbm5lbCBtYXAgaXMgcG9y dGVkIGZvciB1c2VyIHNwYWNlICovCisjZGVmaW5lIFVTRV9BTFNBX0RFRkFVTFRfVExWCisKKyNk ZWZpbmUgQVVEX1NBTVBMRV9SQVRFXzMyCTMyMDAwCisjZGVmaW5lIEFVRF9TQU1QTEVfUkFURV80 NF8xCTQ0MTAwCisjZGVmaW5lIEFVRF9TQU1QTEVfUkFURV80OAk0ODAwMAorI2RlZmluZSBBVURf U0FNUExFX1JBVEVfODhfMgk4ODIwMAorI2RlZmluZSBBVURfU0FNUExFX1JBVEVfOTYJOTYwMDAK KyNkZWZpbmUgQVVEX1NBTVBMRV9SQVRFXzE3Nl80CTE3NjQwMAorI2RlZmluZSBBVURfU0FNUExF X1JBVEVfMTkyCTE5MjAwMAorCisjZGVmaW5lIEhBRF9NSU5fUkFURQkJQVVEX1NBTVBMRV9SQVRF XzMyCisjZGVmaW5lIEhBRF9NQVhfUkFURQkJQVVEX1NBTVBMRV9SQVRFXzE5MgorCisjZGVmaW5l IERSSVZFUl9OQU1FCQkiaW50ZWxtaWRfaGRtaV9hdWRpbyIKKyNkZWZpbmUgRElTX1NBTVBMRV9S QVRFXzI1XzIJMjUyMDAKKyNkZWZpbmUgRElTX1NBTVBMRV9SQVRFXzI3CTI3MDAwCisjZGVmaW5l IERJU19TQU1QTEVfUkFURV81NAk1NDAwMAorI2RlZmluZSBESVNfU0FNUExFX1JBVEVfNzRfMjUJ NzQyNTAKKyNkZWZpbmUgRElTX1NBTVBMRV9SQVRFXzE0OF81CTE0ODUwMAorI2RlZmluZSBIQURf UkVHX1dJRFRICQkweDA4CisjZGVmaW5lIEhBRF9NQVhfSFdfQlVGUwkJMHgwNAorI2RlZmluZSBI QURfTUFYX0RJUF9XT1JEUwkJMTYKKyNkZWZpbmUgSU5URUxfSEFECQkiSW50ZWxIRE1JIgorCisv KiBfQVVEX0NPTkZJRyByZWdpc3RlciBNQVNLICovCisjZGVmaW5lIEFVRF9DT05GSUdfTUFTS19V TkRFUlJVTgkweEMwMDAwMDAwCisjZGVmaW5lIEFVRF9DT05GSUdfTUFTS19TUkRCRwkJMHgwMDAw MDAwMgorI2RlZmluZSBBVURfQ09ORklHX01BU0tfRlVOQ1JTVAkJMHgwMDAwMDAwMQorCisjZGVm aW5lIE1BWF9DTlQJCQkweEZGCisjZGVmaW5lIEhBRF9TVVNQRU5EX0RFTEFZCTEwMDAKKworI2Rl ZmluZSBPVE1fSERNSV9FTERfU0laRSA4NAorCit0eXBlZGVmIHVuaW9uIHsKKwl1aW50OF90IGVs ZF9kYXRhW09UTV9IRE1JX0VMRF9TSVpFXTsKKwkjcHJhZ21hIHBhY2soMSkKKwlzdHJ1Y3Qgewor CQkvKiBCeXRlWzBdID0gRUxEIFZlcnNpb24gTnVtYmVyICovCisJCXVuaW9uIHsKKwkJCXVpbnQ4 X3QgICBieXRlMDsKKwkJCXN0cnVjdCB7CisJCQkJdWludDhfdCByZXNlcnZlZDozOyAvKiBSZXNl cmYgKi8KKwkJCQl1aW50OF90IGVsZF92ZXI6NTsgLyogRUxEIFZlcnNpb24gTnVtYmVyICovCisJ CQkJCQkvKiAwMDAwMGIgLSByZXNlcnZlZAorCQkJCQkJICogMDAwMDFiIC0gZmlyc3QgcmV2LCBv YnNvbGV0ZWQKKwkJCQkJCSAqIDAwMDEwYiAtIHZlcnNpb24gMiwgc3VwcG9ydGluZyBDRUEgdmVy c2lvbiA4NjFEIG9yIGJlbG93CisJCQkJCQkgKiAwMDAxMWI6MTExMTFiIC0gcmVzZXJ2ZWQKKwkJ CQkJCSAqIGZvciBmdXR1cmUKKwkJCQkJCSAqLworCQkJfTsKKwkJfTsKKworCQkvKiBCeXRlWzFd ID0gVmVuZG9yIFZlcnNpb24gRmllbGQgKi8KKwkJdW5pb24geworCQkJdWludDhfdCB2ZW5kb3Jf dmVyc2lvbjsKKwkJCXN0cnVjdCB7CisJCQkJdWludDhfdCByZXNlcnZlZDE6MzsKKwkJCQl1aW50 OF90IHZlbGRfdmVyOjU7IC8qIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBFTEQKKwkJCQkJCSAgICAg KiBleHRlbnNpb24uIFRoaXMgdmFsdWUgaXMKKwkJCQkJCSAgICAgKiBwcm92aXNpb25lZCBhbmQg dW5pcXVlIHRvCisJCQkJCQkgICAgICogZWFjaCB2ZW5kb3IuCisJCQkJCQkgICAgICovCisJCQl9 OworCQl9OworCisJCS8qIEJ5dGVbMl0gPSBCYXNlbGluZSBMZW5ndGggZmllbGQgKi8KKwkJdWlu dDhfdCBiYXNlbGluZV9lbGRfbGVuZ3RoOyAvKiBMZW5ndGggb2YgdGhlIEJhc2VsaW5lIHN0cnVj dHVyZQorCQkJCQkgICAgICAqCWRpdmlkZWQgYnkgRm91ci4KKwkJCQkJICAgICAgKi8KKworCQkv KiBCeXRlIFszXSA9IFJlc2VydmVkIGZvciBmdXR1cmUgdXNlICovCisJCXVpbnQ4X3QgYnl0ZTM7 CisKKwkJLyogU3RhcnRpbmcgb2YgdGhlIEJhc2VMaW5lIEVFTEQgc3RydWN0dXJlCisJCSAqIEJ5 dGVbNF0gPSBNb25pdG9yIE5hbWUgTGVuZ3RoCisJCSAqLworCQl1bmlvbiB7CisJCQl1aW50OF90 IGJ5dGU0OworCQkJc3RydWN0IHsKKwkJCQl1aW50OF90IG1ubDo1OworCQkJCXVpbnQ4X3QgY2Vh X2VkaWRfcmV2X2lkOjM7CisJCQl9OworCQl9OworCisJCS8qIEJ5dGVbNV0gPSBDYXBhYmlsaXRp ZXMgKi8KKwkJdW5pb24geworCQkJdWludDhfdCBjYXBhYmlsaXRpZXM7CisJCQlzdHJ1Y3Qgewor CQkJCXVpbnQ4X3QgaGRjcDoxOyAvKiBIRENQIHN1cHBvcnQgKi8KKwkJCQl1aW50OF90IGFpX3N1 cHBvcnQ6MTsgICAvKiBBSSBzdXBwb3J0ICovCisJCQkJdWludDhfdCBjb25uZWN0aW9uX3R5cGU6 MjsgLyogQ29ubmVjdGlvbiB0eXBlCisJCQkJCQkJICAgICogMDAgLSBIRE1JCisJCQkJCQkJICAg ICogMDEgLSBEUAorCQkJCQkJCSAgICAqIDEwIC0xMSAgUmVzZXJ2ZWQKKwkJCQkJCQkgICAgKiBm b3IgZnV0dXJlCisJCQkJCQkJICAgICogY29ubmVjdGlvbiB0eXBlcworCQkJCQkJCSAgICAqLwor CQkJCXVpbnQ4X3Qgc2FkYzo0OyAvKiBJbmRpY2F0ZXMgbnVtYmVyIG9mIDMgYnl0ZXMKKwkJCQkJ CSAqIFNob3J0IEF1ZGlvIERlc2NyaXB0b3JzLgorCQkJCQkJICovCisJCQl9OworCQl9OworCisJ CS8qIEJ5dGVbNl0gPSBBdWRpbyBTeW5jaCBEZWxheSAqLworCQl1aW50OF90IGF1ZGlvX3N5bmNo X2RlbGF5OyAvKiBBbW91bnQgb2YgdGltZSByZXBvcnRlZCBieSB0aGUKKwkJCQkJICAgICogc2lu ayB0aGF0IHRoZSB2aWRlbyB0cmFpbHMgYXVkaW8KKwkJCQkJICAgICogaW4gbWlsbGlzZWNvbmRz LgorCQkJCQkgICAgKi8KKworCQkvKiBCeXRlWzddID0gU3BlYWtlciBBbGxvY2F0aW9uIEJsb2Nr ICovCisJCXVuaW9uIHsKKwkJCXVpbnQ4X3Qgc3BlYWtlcl9hbGxvY2F0aW9uX2Jsb2NrOworCQkJ c3RydWN0IHsKKwkJCQl1aW50OF90IGZscjoxOyAvKkZyb250IExlZnQgYW5kIFJpZ2h0IGNoYW5u ZWxzKi8KKwkJCQl1aW50OF90IGxmZToxOyAvKkxvdyBGcmVxdWVuY3kgRWZmZWN0IGNoYW5uZWwq LworCQkJCXVpbnQ4X3QgZmM6MTsgIC8qQ2VudGVyIHRyYW5zbWlzc2lvbiBjaGFubmVsKi8KKwkJ CQl1aW50OF90IHJscjoxOyAvKlJlYXIgTGVmdCBhbmQgUmlnaHQgY2hhbm5lbHMqLworCQkJCXVp bnQ4X3QgcmM6MTsgLypSZWFyIENlbnRlciBjaGFubmVsKi8KKwkJCQl1aW50OF90IGZscmM6MTsg LypGcm9udCBsZWZ0IGFuZCBSaWdodCBvZiBDZW50ZXIKKwkJCQkJCSAqdHJhbnNtaXNzaW9uIGNo YW5uZWxzCisJCQkJCQkgKi8KKwkJCQl1aW50OF90IHJscmM6MTsgLypSZWFyIGxlZnQgYW5kIFJp Z2h0IG9mIENlbnRlcgorCQkJCQkJICp0cmFuc21pc3Npb24gY2hhbm5lbHMKKwkJCQkJCSAqLwor CQkJCXVpbnQ4X3QgcmVzZXJ2ZWQzOjE7IC8qIFJlc2VydmVkICovCisJCQl9OworCQl9OworCisJ CS8qIEJ5dGVbOCAtIDE1XSAtIDggQnl0ZSBwb3J0IGlkZW50aWZpY2F0aW9uIHZhbHVlICovCisJ CXVpbnQ4X3QgcG9ydF9pZF92YWx1ZVs4XTsKKworCQkvKiBCeXRlWzE2IC0gMTddIC0gMiBCeXRl IE1hbnVmYWN0dXJlciBJRCAqLworCQl1aW50OF90IG1hbnVmYWN0dXJlcl9pZFsyXTsKKworCQkv KiBCeXRlWzE4IC0gMTldIC0gMiBCeXRlIFByb2R1Y3QgSUQgKi8KKwkJdWludDhfdCBwcm9kdWN0 X2lkWzJdOworCisJCS8qIEJ5dGUgWzIwLTgzXSAtIDY0IEJ5dGVzIG9mIEJhc2VMaW5lIERhdGEg Ki8KKwkJdWludDhfdCBtbl9zYW5kX3NhZHNbNjRdOyAvKiBUaGlzIHdpbGwgaW5jbHVkZQorCQkJ CQkgICAqIC0gQVNDSUkgc3RyaW5nIG9mIE1vbml0b3IgbmFtZQorCQkJCQkgICAqIC0gTGlzdCBv ZiAzIGJ5dGUgU0FEcworCQkJCQkgICAqIC0gWmVybyBwYWRkaW5nCisJCQkJCSAgICovCisKKwkJ LyogVmVuZG9yIEVMRCBCbG9jayBzaG91bGQgY29udGludWUgaGVyZSEKKwkJICogTm8gVmVuZG9y IEVMRCBibG9jayBkZWZpbmVkIGFzIG9mIG5vdy4KKwkJICovCisJfTsKKwkjcHJhZ21hIHBhY2so KQorfSBvdG1faGRtaV9lbGRfdDsKKworLyoqCisgKiBlbnVtIGhhZF9zdGF0dXMgLSBBdWRpbyBz dHJlYW0gc3RhdGVzCisgKgorICogQFNUUkVBTV9JTklUOiBTdHJlYW0gaW5pdGlhbGl6ZWQKKyAq IEBTVFJFQU1fUlVOTklORzogU3RyZWFtIHJ1bm5pbmcKKyAqIEBTVFJFQU1fUEFVU0VEOiBTdHJl YW0gcGF1c2VkCisgKiBAU1RSRUFNX0RST1BQRUQ6IFN0cmVhbSBkcm9wcGVkCisgKi8KK2VudW0g aGFkX3N0cmVhbV9zdGF0dXMgeworCVNUUkVBTV9JTklUID0gMCwKKwlTVFJFQU1fUlVOTklORyA9 IDEsCisJU1RSRUFNX1BBVVNFRCA9IDIsCisJU1RSRUFNX0RST1BQRUQgPSAzCit9OworCisvKioK KyAqIGVudW0gaGFkX3N0YXR1c19zdHJlYW0gLSBIQUQgc3RyZWFtIHN0YXRlcworICovCitlbnVt IGhhZF9zdGF0dXNfc3RyZWFtIHsKKwlIQURfSU5JVCA9IDAsCisJSEFEX1JVTk5JTkdfU1RSRUFN LAorfTsKKworZW51bSBoYWRfZHJ2X3N0YXR1cyB7CisJSEFEX0RSVl9DT05ORUNURUQsCisJSEFE X0RSVl9SVU5OSU5HLAorCUhBRF9EUlZfRElTQ09OTkVDVEVELAorCUhBRF9EUlZfU1VTUEVOREVE LAorCUhBRF9EUlZfRVJSLAorfTsKKworLyogZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIC0g SERNSSBjb250cm9sbGVyIHJpbmcgYnVmZmVyIHR5cGVzICovCitlbnVtIGludGVsX2hhZF9hdWRf YnVmX3R5cGUgeworCUhBRF9CVUZfVFlQRV9BID0gMCwKKwlIQURfQlVGX1RZUEVfQiA9IDEsCisJ SEFEX0JVRl9UWVBFX0MgPSAyLAorCUhBRF9CVUZfVFlQRV9EID0gMywKK307CisKK2VudW0gbnVt X2F1ZF9jaCB7CisJQ0hfU1RFUkVPID0gMCwKKwlDSF9USFJFRV9GT1VSID0gMSwKKwlDSF9GSVZF X1NJWCA9IDIsCisJQ0hfU0VWRU5fRUlHSFQgPSAzCit9OworCisKKy8qIEhETUkgY29udHJvbGxl ciByZWdpc3RlciBvZmZzZXRzICovCitlbnVtIGhkbWlfY3RybF9yZWdfb2Zmc2V0X3YxIHsKKwlB VURfQ09ORklHCQk9IDB4MCwKKwlBVURfQ0hfU1RBVFVTXzAJCT0gMHgwOCwKKwlBVURfQ0hfU1RB VFVTXzEJCT0gMHgwQywKKwlBVURfSERNSV9DVFMJCT0gMHgxMCwKKwlBVURfTl9FTkFCTEUJCT0g MHgxNCwKKwlBVURfU0FNUExFX1JBVEUJCT0gMHgxOCwKKwlBVURfQlVGX0NPTkZJRwkJPSAweDIw LAorCUFVRF9CVUZfQ0hfU1dBUAkJPSAweDI0LAorCUFVRF9CVUZfQV9BRERSCQk9IDB4NDAsCisJ QVVEX0JVRl9BX0xFTkdUSAk9IDB4NDQsCisJQVVEX0JVRl9CX0FERFIJCT0gMHg0OCwKKwlBVURf QlVGX0JfTEVOR1RICT0gMHg0YywKKwlBVURfQlVGX0NfQUREUgkJPSAweDUwLAorCUFVRF9CVUZf Q19MRU5HVEgJPSAweDU0LAorCUFVRF9CVUZfRF9BRERSCQk9IDB4NTgsCisJQVVEX0JVRl9EX0xF TkdUSAk9IDB4NWMsCisJQVVEX0NOVExfU1QJCT0gMHg2MCwKKwlBVURfSERNSV9TVEFUVVMJCT0g MHg2OCwKKwlBVURfSERNSVdfSU5GT0ZSCT0gMHgxMTQsCit9OworCisvKgorICogRGVsdGEgY2hh bmdlcyBpbiBIRE1JIGNvbnRyb2xsZXIgcmVnaXN0ZXIgb2Zmc2V0cworICogY29tcGFyZSB0byB2 MSB2ZXJzaW9uCisgKi8KKworZW51bSBoZG1pX2N0cmxfcmVnX29mZnNldF92MiB7CisJQVVEX0hE TUlfU1RBVFVTX3YyCT0gMHg2NCwKKwlBVURfSERNSVdfSU5GT0ZSX3YyCT0gMHg2OCwKK307CisK Ky8qCisgKiBDRUEgc3BlYWtlciBwbGFjZW1lbnQ6CisgKgorICogIEZMICBGTEMgICBGQyAgIEZS QyAgIEZSCisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgTEZFCisgKgorICogIFJMICBS TEMgICBSQyAgIFJSQyAgIFJSCisgKgorICogVGhlIExlZnQvUmlnaHQgU3Vycm91bmQgY2hhbm5l bCBfbm90aW9uc18gTFMvUlMgaW4gU01QVEUgMzIwTSBjb3JyZXNwb25kcyB0bworICogQ0VBIFJM L1JSOyBUaGUgU01QVEUgY2hhbm5lbCBfYXNzaWdubWVudF8gQy9MRkUgaXMgc3dhcHBlZCB0byBD RUEgTEZFL0ZDLgorICovCitlbnVtIGNlYV9zcGVha2VyX3BsYWNlbWVudCB7CisJRkwgID0gKDEg PDwgIDApLCAgICAgICAgLyogRnJvbnQgTGVmdCAgICAgICAgICAgKi8KKwlGQyAgPSAoMSA8PCAg MSksICAgICAgICAvKiBGcm9udCBDZW50ZXIgICAgICAgICAqLworCUZSICA9ICgxIDw8ICAyKSwg ICAgICAgIC8qIEZyb250IFJpZ2h0ICAgICAgICAgICovCisJRkxDID0gKDEgPDwgIDMpLCAgICAg ICAgLyogRnJvbnQgTGVmdCBDZW50ZXIgICAgKi8KKwlGUkMgPSAoMSA8PCAgNCksICAgICAgICAv KiBGcm9udCBSaWdodCBDZW50ZXIgICAqLworCVJMICA9ICgxIDw8ICA1KSwgICAgICAgIC8qIFJl YXIgTGVmdCAgICAgICAgICAgICovCisJUkMgID0gKDEgPDwgIDYpLCAgICAgICAgLyogUmVhciBD ZW50ZXIgICAgICAgICAgKi8KKwlSUiAgPSAoMSA8PCAgNyksICAgICAgICAvKiBSZWFyIFJpZ2h0 ICAgICAgICAgICAqLworCVJMQyA9ICgxIDw8ICA4KSwgICAgICAgIC8qIFJlYXIgTGVmdCBDZW50 ZXIgICAgICovCisJUlJDID0gKDEgPDwgIDkpLCAgICAgICAgLyogUmVhciBSaWdodCBDZW50ZXIg ICAgKi8KKwlMRkUgPSAoMSA8PCAxMCksICAgICAgICAvKiBMb3cgRnJlcXVlbmN5IEVmZmVjdCAq LworfTsKKworc3RydWN0IGNlYV9jaGFubmVsX3NwZWFrZXJfYWxsb2NhdGlvbiB7CisJaW50IGNh X2luZGV4OworCWludCBzcGVha2Vyc1s4XTsKKworCS8qIGRlcml2ZWQgdmFsdWVzLCBqdXN0IGZv ciBjb252ZW5pZW5jZSAqLworCWludCBjaGFubmVsczsKKwlpbnQgc3BrX21hc2s7Cit9OworCitz dHJ1Y3QgY2hhbm5lbF9tYXBfdGFibGUgeworCXVuc2lnbmVkIGNoYXIgbWFwOyAgICAgICAgICAg ICAgLyogQUxTQSBBUEkgY2hhbm5lbCBtYXAgcG9zaXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyIGNl YV9zbG90OyAgICAgICAgIC8qIENFQSBzbG90IHZhbHVlICovCisJaW50IHNwa19tYXNrOyAgICAg ICAgICAgICAgICAgICAvKiBzcGVha2VyIHBvc2l0aW9uIGJpdCBtYXNrICovCit9OworCisvKioK KyAqIHVuaW9uIGF1ZF9jZmcgLSBBdWRpbyBjb25maWd1cmF0aW9uCisgKgorICogQGNmZ19yZWd4 OiBpbmRpdmlkdWFsIHJlZ2lzdGVyIGJpdHMKKyAqIEBjZmdfcmVndmFsOiBmdWxsIHJlZ2lzdGVy IHZhbHVlCisgKgorICovCit1bmlvbiBhdWRfY2ZnIHsKKwlzdHJ1Y3QgeworCQl1MzIgYXVkX2Vu OjE7CisJCXUzMiBsYXlvdXQ6MTsKKwkJdTMyIGZtdDoyOworCQl1MzIgbnVtX2NoOjI7CisJCXUz MiByc3ZkMDoxOworCQl1MzIgc2V0OjE7CisJCXUzMiBmbGF0OjE7CisJCXUzMiB2YWxfYml0OjE7 CisJCXUzMiB1c2VyX2JpdDoxOworCQl1MzIgdW5kZXJydW46MTsKKwkJdTMyIHJzdmQxOjIwOwor CX0gY2ZnX3JlZ3g7CisJc3RydWN0IHsKKwkJdTMyIGF1ZF9lbjoxOworCQl1MzIgbGF5b3V0OjE7 CisJCXUzMiBmbXQ6MjsKKwkJdTMyIG51bV9jaDozOworCQl1MzIgc2V0OjE7CisJCXUzMiBmbGF0 OjE7CisJCXUzMiB2YWxfYml0OjE7CisJCXUzMiB1c2VyX2JpdDoxOworCQl1MzIgdW5kZXJydW46 MTsKKwkJdTMyIHBhY2tldF9tb2RlOjE7CisJCXUzMiBsZWZ0X2FsaWduOjE7CisJCXUzMiBib2d1 c19zYW1wbGU6MTsKKwkJdTMyIGRwX21vZGVpOjE7CisJCXUzMiByc3ZkOjE2OworCX0gY2ZnX3Jl Z3hfdjI7CisJdTMyIGNmZ19yZWd2YWw7Cit9OworCisvKioKKyAqIHVuaW9uIGF1ZF9jaF9zdGF0 dXNfMCAtIEF1ZGlvIENoYW5uZWwgU3RhdHVzIDAgQXR0cmlidXRlcworICoKKyAqIEBzdGF0dXNf MF9yZWd4OmluZGl2aWR1YWwgcmVnaXN0ZXIgYml0cworICogQHN0YXR1c18wX3JlZ3ZhbDpmdWxs IHJlZ2lzdGVyIHZhbHVlCisgKgorICovCit1bmlvbiBhdWRfY2hfc3RhdHVzXzAgeworCXN0cnVj dCB7CisJCXUzMiBjaF9zdGF0dXM6MTsKKwkJdTMyIGxwY21faWQ6MTsKKwkJdTMyIGNwX2luZm86 MTsKKwkJdTMyIGZvcm1hdDozOworCQl1MzIgbW9kZToyOworCQl1MzIgY3RnX2NvZGU6ODsKKwkJ dTMyIHNyY19udW06NDsKKwkJdTMyIGNoX251bTo0OworCQl1MzIgc2FtcF9mcmVxOjQ7CisJCXUz MiBjbGtfYWNjOjI7CisJCXUzMiByc3ZkOjI7CisJfSBzdGF0dXNfMF9yZWd4OworCXUzMiBzdGF0 dXNfMF9yZWd2YWw7Cit9OworCisvKioKKyAqIHVuaW9uIGF1ZF9jaF9zdGF0dXNfMSAtIEF1ZGlv IENoYW5uZWwgU3RhdHVzIDEgQXR0cmlidXRlcworICoKKyAqIEBzdGF0dXNfMV9yZWd4OiBpbmRp dmlkdWFsIHJlZ2lzdGVyIGJpdHMKKyAqIEBzdGF0dXNfMV9yZWd2YWw6IGZ1bGwgcmVnaXN0ZXIg dmFsdWUKKyAqCisgKi8KK3VuaW9uIGF1ZF9jaF9zdGF0dXNfMSB7CisJc3RydWN0IHsKKwkJdTMy IG1heF93cmRfbGVuOjE7CisJCXUzMiB3cmRfbGVuOjM7CisJCXUzMiByc3ZkOjI4OworCQl9IHN0 YXR1c18xX3JlZ3g7CisJdTMyIHN0YXR1c18xX3JlZ3ZhbDsKK307CisKKy8qKgorICogdW5pb24g YXVkX2hkbWlfY3RzIC0gQ1RTIHJlZ2lzdGVyCisgKgorICogQGN0c19yZWd4OiBpbmRpdmlkdWFs IHJlZ2lzdGVyIGJpdHMKKyAqIEBjdHNfcmVndmFsOiBmdWxsIHJlZ2lzdGVyIHZhbHVlCisgKgor ICovCit1bmlvbiBhdWRfaGRtaV9jdHMgeworCXN0cnVjdCB7CisJCXUzMiBjdHNfdmFsOjIwOwor CQl1MzIgZW5fY3RzX3Byb2c6MTsKKwkJdTMyIHJzdmQ6MTE7CisJfSBjdHNfcmVneDsKKwlzdHJ1 Y3QgeworCQl1MzIgY3RzX3ZhbDoyNDsKKwkJdTMyIGVuX2N0c19wcm9nOjE7CisJCXUzMiByc3Zk Ojc7CisJfSBjdHNfcmVneF92MjsKKwl1MzIgY3RzX3JlZ3ZhbDsKK307CisKKy8qKgorICogdW5p b24gYXVkX2hkbWlfbl9lbmFibGUgLSBOIHJlZ2lzdGVyCisgKgorICogQG5fcmVneDogaW5kaXZp ZHVhbCByZWdpc3RlciBiaXRzCisgKiBAbl9yZWd2YWw6IGZ1bGwgcmVnaXN0ZXIgdmFsdWUKKyAq CisgKi8KK3VuaW9uIGF1ZF9oZG1pX25fZW5hYmxlIHsKKwlzdHJ1Y3QgeworCQl1MzIgbl92YWw6 MjA7CisJCXUzMiBlbl9uX3Byb2c6MTsKKwkJdTMyIHJzdmQ6MTE7CisJfSBuX3JlZ3g7CisJc3Ry dWN0IHsKKwkJdTMyIG5fdmFsOjI0OworCQl1MzIgZW5fbl9wcm9nOjE7CisJCXUzMiByc3ZkOjc7 CisJfSBuX3JlZ3hfdjI7CisJdTMyIG5fcmVndmFsOworfTsKKworLyoqCisgKiB1bmlvbiBhdWRf YnVmX2NvbmZpZyAtICBBdWRpbyBCdWZmZXIgY29uZmlndXJhdGlvbnMKKyAqCisgKiBAYnVmX2Nm Z19yZWd4OiBpbmRpdmlkdWFsIHJlZ2lzdGVyIGJpdHMKKyAqIEBidWZfY2ZndmFsOiBmdWxsIHJl Z2lzdGVyIHZhbHVlCisgKgorICovCit1bmlvbiBhdWRfYnVmX2NvbmZpZyB7CisJc3RydWN0IHsK KwkJdTMyIGZpZm9fd2lkdGg6ODsKKwkJdTMyIHJzdmQwOjg7CisJCXUzMiBhdWRfZGVsYXk6ODsK KwkJdTMyIHJzdmQxOjg7CisJfSBidWZfY2ZnX3JlZ3g7CisJc3RydWN0IHsKKwkJdTMyIGF1ZGlv X2ZpZm9fd2F0ZXJtYXJrOjg7CisJCXUzMiBkbWFfZmlmb193YXRlcm1hcms6MzsKKwkJdTMyIHJz dmQwOjU7CisJCXUzMiBhdWRfZGVsYXk6ODsKKwkJdTMyIHJzdmQxOjg7CisJfSBidWZfY2ZnX3Jl Z3hfdjI7CisJdTMyIGJ1Zl9jZmd2YWw7Cit9OworCisvKioKKyAqIHVuaW9uIGF1ZF9idWZfY2hf c3dhcCAtIEF1ZGlvIFNhbXBsZSBTd2FwcGluZyBvZmZzZXQKKyAqCisgKiBAYnVmX2NoX3N3YXBf cmVneDogaW5kaXZpZHVhbCByZWdpc3RlciBiaXRzCisgKiBAYnVmX2NoX3N3YXBfdmFsOiBmdWxs IHJlZ2lzdGVyIHZhbHVlCisgKgorICovCit1bmlvbiBhdWRfYnVmX2NoX3N3YXAgeworCXN0cnVj dCB7CisJCXUzMiBmaXJzdF8wOjM7CisJCXUzMiBzZWNvbmRfMDozOworCQl1MzIgZmlyc3RfMToz OworCQl1MzIgc2Vjb25kXzE6MzsKKwkJdTMyIGZpcnN0XzI6MzsKKwkJdTMyIHNlY29uZF8yOjM7 CisJCXUzMiBmaXJzdF8zOjM7CisJCXUzMiBzZWNvbmRfMzozOworCQl1MzIgcnN2ZDo4OworCX0g YnVmX2NoX3N3YXBfcmVneDsKKwl1MzIgYnVmX2NoX3N3YXBfdmFsOworfTsKKworLyoqCisgKiB1 bmlvbiBhdWRfYnVmX2FkZHIgLSBBZGRyZXNzIGZvciBBdWRpbyBCdWZmZXIKKyAqCisgKiBAYnVm X2FkZHJfcmVneDogaW5kaXZpZHVhbCByZWdpc3RlciBiaXRzCisgKiBAYnVmX2FkZHJfdmFsOiBm dWxsIHJlZ2lzdGVyIHZhbHVlCisgKgorICovCit1bmlvbiBhdWRfYnVmX2FkZHIgeworCXN0cnVj dCB7CisJCXUzMiB2YWxpZDoxOworCQl1MzIgaW50cl9lbjoxOworCQl1MzIgcnN2ZDo0OworCQl1 MzIgYWRkcjoyNjsKKwl9IGJ1Zl9hZGRyX3JlZ3g7CisJdTMyIGJ1Zl9hZGRyX3ZhbDsKK307CisK Ky8qKgorICogdW5pb24gYXVkX2J1Zl9sZW4gLSBMZW5ndGggb2YgQXVkaW8gQnVmZmVyCisgKgor ICogQGJ1Zl9sZW5fcmVneDogaW5kaXZpZHVhbCByZWdpc3RlciBiaXRzCisgKiBAYnVmX2xlbl92 YWw6IGZ1bGwgcmVnaXN0ZXIgdmFsdWUKKyAqCisgKi8KK3VuaW9uIGF1ZF9idWZfbGVuIHsKKwlz dHJ1Y3QgeworCQl1MzIgYnVmX2xlbjoyMDsKKwkJdTMyIHJzdmQ6MTI7CisJfSBidWZfbGVuX3Jl Z3g7CisJdTMyIGJ1Zl9sZW5fdmFsOworfTsKKworLyoqCisgKiB1bmlvbiBhdWRfY3RybF9zdCAt IEF1ZGlvIENvbnRyb2wgU3RhdGUgUmVnaXN0ZXIgb2Zmc2V0CisgKgorICogQGN0cmxfcmVneDog aW5kaXZpZHVhbCByZWdpc3RlciBiaXRzCisgKiBAY3RybF92YWw6IGZ1bGwgcmVnaXN0ZXIgdmFs dWUKKyAqCisgKi8KK3VuaW9uIGF1ZF9jdHJsX3N0IHsKKwlzdHJ1Y3QgeworCQl1MzIgcmFtX2Fk ZHI6NDsKKwkJdTMyIGVsZF9hY2s6MTsKKwkJdTMyIGVsZF9hZGRyOjQ7CisJCXUzMiBlbGRfYnVm X3NpemU6NTsKKwkJdTMyIGVsZF92YWxpZDoxOworCQl1MzIgY3BfcmVhZHk6MTsKKwkJdTMyIGRp cF9mcmVxOjI7CisJCXUzMiBkaXBfaWR4OjM7CisJCXUzMiBkaXBfZW5fc3RhOjQ7CisJCXUzMiBy c3ZkOjc7CisJfSBjdHJsX3JlZ3g7CisJdTMyIGN0cmxfdmFsOworfTsKKworLyoqCisgKiB1bmlv biBhdWRfaW5mb19mcmFtZTEgLSBBdWRpbyBIRE1JIFdpZGdldCBEYXRhIElzbGFuZCBQYWNrZXQg b2Zmc2V0CisgKgorICogQGZyMV9yZWd4OiBpbmRpdmlkdWFsIHJlZ2lzdGVyIGJpdHMKKyAqIEBm cjFfdmFsOiBmdWxsIHJlZ2lzdGVyIHZhbHVlCisgKgorICovCit1bmlvbiBhdWRfaW5mb19mcmFt ZTEgeworCXN0cnVjdCB7CisJCXUzMiBwa3RfdHlwZTo4OworCQl1MzIgdmVyX251bTo4OworCQl1 MzIgbGVuOjU7CisJCXUzMiByc3ZkOjExOworCX0gZnIxX3JlZ3g7CisJdTMyIGZyMV92YWw7Cit9 OworCisvKioKKyAqIHVuaW9uIGF1ZF9pbmZvX2ZyYW1lMiAtIERJUCBmcmFtZSAyCisgKgorICog QGZyMl9yZWd4OiBpbmRpdmlkdWFsIHJlZ2lzdGVyIGJpdHMKKyAqIEBmcjJfdmFsOiBmdWxsIHJl Z2lzdGVyIHZhbHVlCisgKgorICovCit1bmlvbiBhdWRfaW5mb19mcmFtZTIgeworCXN0cnVjdCB7 CisJCXUzMiBjaGtzdW06ODsKKwkJdTMyIGNobmxfY250OjM7CisJCXUzMiByc3ZkMDoxOworCQl1 MzIgY29kaW5nX3R5cGU6NDsKKwkJdTMyIHNtcGxfc2l6ZToyOworCQl1MzIgc21wbF9mcmVxOjM7 CisJCXUzMiByc3ZkMTozOworCQl1MzIgZm9ybWF0Ojg7CisJfSBmcjJfcmVneDsKKwl1MzIgZnIy X3ZhbDsKK307CisKKy8qKgorICogdW5pb24gYXVkX2luZm9fZnJhbWUzIC0gRElQIGZyYW1lIDMK KyAqCisgKiBAZnIzX3JlZ3g6IGluZGl2aWR1YWwgcmVnaXN0ZXIgYml0cworICogQGZyM192YWw6 IGZ1bGwgcmVnaXN0ZXIgdmFsdWUKKyAqCisgKi8KK3VuaW9uIGF1ZF9pbmZvX2ZyYW1lMyB7CisJ c3RydWN0IHsKKwkJdTMyIGNobmxfYWxsb2M6ODsKKwkJdTMyIHJzdmQwOjM7CisJCXUzMiBsc3Y6 NDsKKwkJdTMyIGRtX2luaDoxOworCQl1MzIgcnN2ZDE6MTY7CisJfSBmcjNfcmVneDsKKwl1MzIg ZnIzX3ZhbDsKK307CisKKworc3RydWN0IHBjbV9zdHJlYW1faW5mbyB7CisJaW50CQlzdHJfaWQ7 CisJdm9pZAkJKmhhZF9zdWJzdHJlYW07CisJdm9pZAkJKCpwZXJpb2RfZWxhcHNlZCkodm9pZCAq aGFkX3N1YnN0cmVhbSk7CisJdTMyCQlidWZmZXJfcHRyOworCXU2NAkJYnVmZmVyX3JlbmRlcmVk OworCXUzMgkJcmluZ19idWZfc2l6ZTsKKwlpbnQJCXNmcmVxOworfTsKKworc3RydWN0IHJpbmdf YnVmX2luZm8geworCXVpbnQzMl90CWJ1Zl9hZGRyOworCXVpbnQzMl90CWJ1Zl9zaXplOworCXVp bnQ4X3QJCWlzX3ZhbGlkOworfTsKKworc3RydWN0IGhhZF9zdHJlYW1fcHZ0IHsKKwllbnVtIGhh ZF9zdHJlYW1fc3RhdHVzCQlzdHJlYW1fc3RhdHVzOworCWludAkJCQlzdHJlYW1fb3BzOworCXNz aXplX3QJCQkJZGJnX2N1bV9ieXRlczsKK307CisKK3N0cnVjdCBoYWRfcHZ0X2RhdGEgeworCWVu dW0gaGFkX3N0YXR1c19zdHJlYW0JCXN0cmVhbV90eXBlOworfTsKKworc3RydWN0IGhhZF9jYWxs YmFja19vcHMgeworCWhhZF9ldmVudF9jYWxsX2JhY2sgaW50ZWxfaGFkX2V2ZW50X2NhbGxfYmFj azsKK307CisKKy8qKgorICogc3RydWN0IHNuZF9pbnRlbGhhZCAtIGludGVsaGFkIGRyaXZlciBz dHJ1Y3R1cmUKKyAqCisgKiBAY2FyZDogcHRyIHRvIGhvbGQgY2FyZCBkZXRhaWxzCisgKiBAY2Fy ZF9pbmRleDogc291bmQgY2FyZCBpbmRleAorICogQGNhcmRfaWQ6IGRldGVjdGVkIHNvdW5kIGNh cmQgaWQKKyAqIEByZWdfb3BzOiByZWdpc3RlciBvcGVyYXRpb25zIHRvIHByb2dyYW0gcmVnaXN0 ZXJzCisgKiBAcXVlcnlfb3BzOiBjYXBzIGNhbGwgYmFja3MgZm9yIGdldC9zZXQgb3BlcmF0aW9u cworICogQGRydl9zdGF0dXM6IGRyaXZlciBzdGF0dXMKKyAqIEBidWZfaW5mbzogcmluZyBidWZm ZXIgaW5mbworICogQHN0cmVhbV9pbmZvOiBzdHJlYW0gaW5mb3JtYXRpb24KKyAqIEBlZWxkOiBo b2xkcyBFRUxEIGluZm8KKyAqIEBjdXJyX2J1ZjogcG9pbnRlciB0byBob2xkIGN1cnJlbnQgYWN0 aXZlIHJpbmcgYnVmCisgKiBAdmFsaWRfYnVmX2NudDogcmluZyBidWZmZXIgY291bnQgZm9yIHN0 cmVhbQorICogQGhhZF9zcGlubG9jazogZHJpdmVyIGxvY2sKKyAqIEBhZXNfYml0czogSUVDOTU4 IHN0YXR1cyBiaXRzCisgKiBAYnVmZl9kb25lOiBpZCBvZiBjdXJyZW50IGJ1ZmZlciBkb25lIGlu dHIKKyAqIEBkZXY6IHBsYXRvZm9ybSBkZXZpY2UgaGFuZGxlCisgKiBAa2N0bDogaG9sZHMga2N0 bCBwdHJzIHVzZWQgZm9yIGNoYW5uZWwgbWFwCisgKiBAY2htYXA6IGhvbGRzIGNoYW5uZWwgbWFw IGluZm8KKyAqIEBhdWRpb19yZWdfYmFzZTogaGRtaSBhdWRpbyByZWdpc3RlciBiYXNlIG9mZnNl dAorICogQGh3X3NpbGVuY2U6IGZsYWcgaW5kaWNhdGVzIFNvQyBzdXBwb3J0IGZvciBIVyBzaWxl bmNlL0tlZXAgYWxpdmUKKyAqIEBvcHM6IGhvbGRzIG9wcyBmdW5jdGlvbnMgYmFzZWQgb24gcGxh dGZvcm0KKyAqLworc3RydWN0IHNuZF9pbnRlbGhhZCB7CisJc3RydWN0IHNuZF9jYXJkCSpjYXJk OworCWludAkJY2FyZF9pbmRleDsKKwljaGFyCQkqY2FyZF9pZDsKKwlzdHJ1Y3QgaGRtaV9hdWRp b19yZWdpc3RlcnNfb3BzCXJlZ19vcHM7CisJc3RydWN0IGhkbWlfYXVkaW9fcXVlcnlfc2V0X29w cwlxdWVyeV9vcHM7CisJZW51bSBoYWRfZHJ2X3N0YXR1cwlkcnZfc3RhdHVzOworCXN0cnVjdAkJ cmluZ19idWZfaW5mbyBidWZfaW5mb1tIQURfTlVNX09GX1JJTkdfQlVGU107CisJc3RydWN0CQlw Y21fc3RyZWFtX2luZm8gc3RyZWFtX2luZm87CisJb3RtX2hkbWlfZWxkX3QJZWVsZDsKKwllbnVt CQlpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIGN1cnJfYnVmOworCWludAkJdmFsaWRfYnVmX2NudDsK Kwl1bnNpZ25lZCBpbnQJYWVzX2JpdHM7CisJaW50IGZsYWdfdW5kZXJydW47CisJc3RydWN0IGhh ZF9wdnRfZGF0YSAqcHJpdmF0ZV9kYXRhOworCXNwaW5sb2NrX3QgaGFkX3NwaW5sb2NrOworCWVu dW0JCWludGVsX2hhZF9hdWRfYnVmX3R5cGUgYnVmZl9kb25lOworCXN0cnVjdCBkZXZpY2UgKmRl djsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsOworCXN0cnVjdCBzbmRfcGNtX2NobWFwICpj aG1hcDsKKwl1bnNpZ25lZCBpbnQJYXVkaW9fcmVnX2Jhc2U7CisJYm9vbAkJaHdfc2lsZW5jZTsK KwlzdHJ1Y3QgaGFkX29wcwkqb3BzOworfTsKKworc3RydWN0IGhhZF9vcHMgeworCXZvaWQgKCpl bmFibGVfYXVkaW8pKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJdTgg ZW5hYmxlKTsKKwl2b2lkICgqcmVzZXRfYXVkaW8pKHU4IHJlc2V0KTsKKwlpbnQgKCpwcm9nX24p KHUzMiBhdWRfc2FtcF9mcmVxLCB1MzIgKm5fcGFyYW0sCisJCQlzdHJ1Y3Qgc25kX2ludGVsaGFk ICppbnRlbGhhZGRhdGEpOworCXZvaWQgKCpwcm9nX2N0cykodTMyIGF1ZF9zYW1wX2ZyZXEsIHUz MiB0bWRzLCB1MzIgbl9wYXJhbSwKKwkJCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0 YSk7CisJaW50ICgqYXVkaW9fY3RybCkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJl YW0sCisJCQkJc3RydWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKTsKKwl2b2lkICgqcHJv Z19kaXApKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBz bmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSk7CisJdm9pZCAoKmhhbmRsZV91bmRlcnJ1bikoc3Ry dWN0IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKTsKK307CisKKworaW50IGhhZF9ldmVudF9o YW5kbGVyKGVudW0gaGFkX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSwgdm9pZCAqZGF0YSk7CisKK2lu dCBoZG1pX2F1ZGlvX3F1ZXJ5KHZvaWQgKmRydl9kYXRhLCBoZG1pX2F1ZGlvX2V2ZW50X3QgZXZl bnQpOworaW50IGhkbWlfYXVkaW9fc3VzcGVuZCh2b2lkICpkcnZfZGF0YSwgaGRtaV9hdWRpb19l dmVudF90IGV2ZW50KTsKK2ludCBoZG1pX2F1ZGlvX3Jlc3VtZSh2b2lkICpkcnZfZGF0YSk7Citp bnQgaGRtaV9hdWRpb19tb2RlX2NoYW5nZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0 cmVhbSk7CitleHRlcm4gc3RydWN0IHNuZF9wY21fb3BzIHNuZF9pbnRlbGhhZF9wbGF5YmFja19v cHM7CisKK2ludCBzbmRfaW50ZWxoYWRfaW5pdF9hdWRpb19jdHJsKHN0cnVjdCBzbmRfcGNtX3N1 YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRh dGEsCisJCQkJCWludCBmbGFnX3NpbGVuY2UpOworaW50IHNuZF9pbnRlbGhhZF9wcm9nX2J1ZmZl cihzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEsCisJCQkJCWludCBzdGFydCwgaW50 IGVuZCk7CitpbnQgc25kX2ludGVsaGFkX2ludmRfYnVmZmVyKGludCBzdGFydCwgaW50IGVuZCk7 CitpbmxpbmUgaW50IHNuZF9pbnRlbGhhZF9yZWFkX2xlbihzdHJ1Y3Qgc25kX2ludGVsaGFkICpp bnRlbGhhZGRhdGEpOwordm9pZCBoYWRfYnVpbGRfY2hhbm5lbF9hbGxvY2F0aW9uX21hcChzdHJ1 Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEpOworCisvKiBSZWdpc3RlciBhY2Nlc3MgZnVu Y3Rpb25zICovCitpbmxpbmUgaW50IGhhZF9nZXRfaHdzdGF0ZShzdHJ1Y3Qgc25kX2ludGVsaGFk ICppbnRlbGhhZGRhdGEpOworaW5saW5lIGludCBoYWRfZ2V0X2NhcHMoZW51bSBoYWRfY2Fwc19s aXN0IHF1ZXJ5X2VsZW1lbnQsIHZvaWQgKmNhcGFiaWx0aWVzKTsKK2lubGluZSBpbnQgaGFkX3Nl dF9jYXBzKGVudW0gaGFkX2NhcHNfbGlzdCBzZXRfZWxlbWVudCwgdm9pZCAqY2FwYWJpbHRpZXMp OworaW5saW5lIGludCBoYWRfcmVhZF9yZWdpc3Rlcih1aW50MzJfdCByZWdfYWRkciwgdWludDMy X3QgKmRhdGEpOworaW5saW5lIGludCBoYWRfd3JpdGVfcmVnaXN0ZXIodWludDMyX3QgcmVnX2Fk ZHIsIHVpbnQzMl90IGRhdGEpOworaW5saW5lIGludCBoYWRfcmVhZF9tb2RpZnkodWludDMyX3Qg cmVnX2FkZHIsIHVpbnQzMl90IGRhdGEsIHVpbnQzMl90IG1hc2spOworI2VuZGlmCmRpZmYgLS1n aXQgYS9zb3VuZC9oZG1pX2F1ZGlvL2ludGVsX21pZF9oZG1pX2F1ZGlvX2lmLmMgYi9zb3VuZC9o ZG1pX2F1ZGlvL2ludGVsX21pZF9oZG1pX2F1ZGlvX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMC4uOTYzMTY0MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2hkbWlfYXVk aW8vaW50ZWxfbWlkX2hkbWlfYXVkaW9faWYuYwpAQCAtMCwwICsxLDUxNCBAQAorLyoKKyAqICAg aW50ZWxfbWlkX2hkbWlfYXVkaW9faWYuYyAtIEludGVsIEhETUkgYXVkaW8gZHJpdmVyIGZvciBN SUQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEludGVsIENvcnAKKyAqICBBdXRob3JzOglT YWlsYWphIEJhbmRhcnVwYWxsaSA8c2FpbGFqYS5iYW5kYXJ1cGFsbGlAaW50ZWwuY29tPgorICoJ CVJhbWVzaCBCYWJ1IEsgViA8cmFtZXNoLmJhYnVAaW50ZWwuY29tPgorICoJCVZhaWJoYXYgQWdh cndhbCA8dmFpYmhhdi5hZ2Fyd2FsQGludGVsLmNvbT4KKyAqICB+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgor ICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1 dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHBy b2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwg YnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3 YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig bW9yZSBkZXRhaWxzLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKiBBTFNBIGRyaXZlciBm b3IgSW50ZWwgTUlEIEhETUkgYXVkaW8gY29udHJvbGxlci4gIFRoaXMgZmlsZSBjb250YWlucwor ICogaW50ZXJmYWNlIGZ1bmN0aW9ucyBleHBvc2VkIHRvIEhETUkgRGlzcGxheSBkcml2ZXIgYW5k IGNvZGUgdG8gcmVnaXN0ZXIKKyAqIHdpdGggQUxTQSBmcmFtZXdvcmsuLgorICovCisKKyNkZWZp bmUgcHJfZm10KGZtdCkJCSJoYWQ6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2lu Y2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRl IDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSAiaW50ZWxfbWlkX2hkbWlfYXVkaW8uaCIKKworCisv KioKKyAqIGhkbWlfYXVkaW9fcXVlcnkgLSBoZG1pIGF1ZGlvIHF1ZXJ5IGZ1bmN0aW9uCisgKgor ICpAaGFkZGF0YTogcG9pbnRlciB0byBIQUQgcHJpdmF0ZSBkYXRhCisgKkBldmVudDogYXVkaW8g ZXZlbnQgZm9yIHdoaWNoIHRoaXMgbWV0aG9kIGlzIGludm9rZWQKKyAqCisgKiBUaGlzIGZ1bmN0 aW9uIGlzIGNhbGxlZCBieSBjbGllbnQgZHJpdmVyIHRvIHF1ZXJ5IHRoZQorICogaGRtaSBhdWRp by4KKyAqLworaW50IGhkbWlfYXVkaW9fcXVlcnkodm9pZCAqaGFkZGF0YSwgaGRtaV9hdWRpb19l dmVudF90IGV2ZW50KQoreworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0g TlVMTDsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCXVuc2lnbmVkIGxvbmcg ZmxhZ19pcnFzOworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSA9IChzdHJ1Y3Qg c25kX2ludGVsaGFkICopaGFkZGF0YTsKKworCWlmIChpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZv LmhhZF9zdWJzdHJlYW0pCisJCXN1YnN0cmVhbSA9IGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8u aGFkX3N1YnN0cmVhbTsKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7 CisJc3dpdGNoIChldmVudC50eXBlKSB7CisJY2FzZSBIQURfRVZFTlRfUVVFUllfSVNfQVVESU9f QlVTWToKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBm bGFnX2lycXMpOworCisJCWlmICgoaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGUgPT0gSEFEX1JVTk5J TkdfU1RSRUFNKSB8fAorCQkJc3Vic3RyZWFtKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywKKwkJCQkJCWZsYWdfaXJxcyk7CisJCQlwcl9k ZWJ1ZygiQXVkaW8gc3RyZWFtIGFjdGl2ZVxuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJ CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFn X2lycXMpOworCWJyZWFrOworCisJY2FzZSBIQURfRVZFTlRfUVVFUllfSVNfQVVESU9fU1VTUEVO REVEOgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZs YWdfaXJxcyk7CisJCWlmIChpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPT0gSEFEX0RSVl9TVVNQ RU5ERUQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3Nw aW5sb2NrLAorCQkJCQkJZmxhZ19pcnFzKTsKKwkJCXByX2RlYnVnKCJBdWRpbyBpcyBzdXNwZW5k ZWRcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50 ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJYnJlYWs7CisKKwlkZWZhdWx0 OgorCQlwcl9kZWJ1ZygiZXJyb3IgdW4taGFuZGxlZCBldmVudCAhIVxuIik7CisJCXJldHVybiAt RUlOVkFMOworCWJyZWFrOworCisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaGRtaV9h dWRpb19zdXNwZW5kIC0gcG93ZXIgbWFuYWdlbWVudCBzdXNwZW5kIGZ1bmN0aW9uCisgKgorICpA aGFkZGF0YTogcG9pbnRlciB0byBIQUQgcHJpdmF0ZSBkYXRhCisgKkBldmVudDogcG0gZXZlbnQg Zm9yIHdoaWNoIHRoaXMgbWV0aG9kIGlzIGludm9rZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlz IGNhbGxlZCBieSBjbGllbnQgZHJpdmVyIHRvIHN1c3BlbmQgdGhlCisgKiBoZG1pIGF1ZGlvLgor ICovCitpbnQgaGRtaV9hdWRpb19zdXNwZW5kKHZvaWQgKmhhZGRhdGEsIGhkbWlfYXVkaW9fZXZl bnRfdCBldmVudCkKK3sKKwlpbnQgY2FwcywgcmV0dmFsID0gMDsKKwlzdHJ1Y3QgaGFkX3B2dF9k YXRhICpoYWRfc3RyZWFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ19pcnFzOworCXN0cnVjdCBzbmRf cGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFk ZGF0YSA9IChzdHJ1Y3Qgc25kX2ludGVsaGFkICopaGFkZGF0YTsKKworCXByX2RlYnVnKCJFbnRl cjolcyIsIF9fZnVuY19fKTsKKworCWhhZF9zdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVf ZGF0YTsKKwlzdWJzdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJl YW07CisKKwlpZiAoaW50ZWxoYWRkYXRhLT5kZXYtPnBvd2VyLnJ1bnRpbWVfc3RhdHVzICE9IFJQ TV9TVVNQRU5ERUQpIHsKKwkJcHJfZXJyKCJhdWRpbyBzdHJlYW0gaXMgYWN0aXZlXG4iKTsKKwkJ cmV0dXJuIC1FQUdBSU47CisJfQorCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRh LT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1 cyA9PSBIQURfRFJWX0RJU0NPTk5FQ1RFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZp bnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZGVidWcoImhhZCBu b3QgY29ubmVjdGVkXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlpZiAoaW50ZWxoYWRk YXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZfU1VTUEVOREVEKSB7CisJCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlwcl9k ZWJ1ZygiaGFkIGFscmVhZHkgc3VzcGVuZGVkXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisK KwlpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPSBIQURfRFJWX1NVU1BFTkRFRDsKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsK KwkvKgorCSAqIFRvRG86IE5lZWQgdG8gZGlzYWJsZSBVTkRFUlJVTiBpbnRlcnJ1cHRzIGFzIHdl bGwKKwkgKiAgY2FwcyA9IEhETUlfQVVESU9fVU5ERVJSVU4gfCBIRE1JX0FVRElPX0JVRkZFUl9E T05FOworCSAqLworCWNhcHMgPSBIRE1JX0FVRElPX0JVRkZFUl9ET05FOworCWhhZF9zZXRfY2Fw cyhIQURfU0VUX0RJU0FCTEVfQVVESU9fSU5ULCAmY2Fwcyk7CisJaGFkX3NldF9jYXBzKEhBRF9T RVRfRElTQUJMRV9BVURJTywgTlVMTCk7CisJcHJfZGVidWcoIkV4aXQ6JXMiLCBfX2Z1bmNfXyk7 CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBoZG1pX2F1ZGlvX3Jlc3VtZSAtIHBvd2Vy IG1hbmFnZW1lbnQgcmVzdW1lIGZ1bmN0aW9uCisgKgorICpAaGFkZGF0YTogcG9pbnRlciB0byBI QUQgcHJpdmF0ZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgY2xpZW50 IGRyaXZlciB0byByZXN1bWUgdGhlCisgKiBoZG1pIGF1ZGlvLgorICovCitpbnQgaGRtaV9hdWRp b19yZXN1bWUodm9pZCAqaGFkZGF0YSkKK3sKKwlpbnQgY2FwcywgcmV0dmFsID0gMDsKKwlzdHJ1 Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEgPSAoc3RydWN0IHNuZF9pbnRlbGhhZCAqKWhh ZGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnX2lycXM7CisKKwlwcl9kZWJ1ZygiRW50ZXI6JXMi LCBfX2Z1bmNfXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3Bp bmxvY2ssIGZsYWdfaXJxcyk7CisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURf RFJWX0RJU0NPTk5FQ1RFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRh dGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZGVidWcoImhhZCBub3QgY29ubmVj dGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGludGVsaGFkZGF0YS0+ZHJ2X3N0YXR1 cyAhPSBIQURfRFJWX1NVU1BFTkRFRCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRl bGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZXJyKCJoYWQgaXMgbm90 IGluIHN1c3BlbmRlZCBzdGF0ZVxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChoYWRfZ2V0 X2h3c3RhdGUoaW50ZWxoYWRkYXRhKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRl bGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcHJfZXJyKCJGYWlsZWQgdG8g cmVzdW1lLiBEZXZpY2Ugbm90IGFjY2Vzc2libGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9 CisKKwlpbnRlbGhhZGRhdGEtPmRydl9zdGF0dXMgPSBIQURfRFJWX0NPTk5FQ1RFRDsKKwlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFz KTsKKwkvKgorCSAqIFRvRG86IE5lZWQgdG8gZW5hYmxlIFVOREVSUlVOIGludGVycnVwdHMgYXMg d2VsbAorCSAqIGNhcHMgPSBIRE1JX0FVRElPX1VOREVSUlVOIHwgSERNSV9BVURJT19CVUZGRVJf RE9ORTsKKwkgKi8KKwljYXBzID0gSERNSV9BVURJT19CVUZGRVJfRE9ORTsKKwlyZXR2YWwgPSBo YWRfc2V0X2NhcHMoSEFEX1NFVF9FTkFCTEVfQVVESU9fSU5ULCAmY2Fwcyk7CisJcmV0dmFsID0g aGFkX3NldF9jYXBzKEhBRF9TRVRfRU5BQkxFX0FVRElPLCBOVUxMKTsKKwlwcl9kZWJ1ZygiRXhp dDolcyIsIF9fZnVuY19fKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIGlu dCBoYWRfY2hrX2ludHJtaXNzKHN0cnVjdCBzbmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSwKKwkJ ZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIGJ1Zl9pZCkKK3sKKwlpbnQgaSwgaW50cl9jb3Vu dCA9IDA7CisJZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIGJ1ZmZfZG9uZTsKKwl1MzIgYnVm X3NpemUsIGJ1Zl9hZGRyOworCXN0cnVjdCBoYWRfcHZ0X2RhdGEgKmhhZF9zdHJlYW07CisJdW5z aWduZWQgbG9uZyBmbGFnX2lycXM7CisKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2 YXRlX2RhdGE7CisKKwlidWZmX2RvbmUgPSBidWZfaWQ7CisKKwlpbnRyX2NvdW50ID0gc25kX2lu dGVsaGFkX3JlYWRfbGVuKGludGVsaGFkZGF0YSk7CisJaWYgKGludHJfY291bnQgPiAxKSB7CisJ CS8qIEluIGNhc2Ugb2YgYWN0aXZlIHBsYXliYWNrICovCisJCXByX2VycigiRHJpdmVyIGRldGVj dGVkICVkIG1pc3NlZCBidWZmZXIgZG9uZSBpbnRlcnJ1cHQocykhISEhXG4iLAorCQkJCShpbnRy X2NvdW50IC0gMSkpOworCQlpZiAoaW50cl9jb3VudCA+IDMpCisJCQlyZXR1cm4gaW50cl9jb3Vu dDsKKworCQlidWZfaWQgKz0gKGludHJfY291bnQgLSAxKTsKKwkJLyogUmVwcm9ncmFtIHJlZ2lz dGVycyovCisJCWZvciAoaSA9IGJ1ZmZfZG9uZTsgaSA8IGJ1Zl9pZDsgaSsrKSB7CisJCQlpbnQg aiA9IGkgJSA0OworCisJCQlidWZfc2l6ZSA9IGludGVsaGFkZGF0YS0+YnVmX2luZm9bal0uYnVm X3NpemU7CisJCQlidWZfYWRkciA9IGludGVsaGFkZGF0YS0+YnVmX2luZm9bal0uYnVmX2FkZHI7 CisJCQloYWRfd3JpdGVfcmVnaXN0ZXIoQVVEX0JVRl9BX0xFTkdUSCArCisJCQkJCShqICogSEFE X1JFR19XSURUSCksIGJ1Zl9zaXplKTsKKwkJCWhhZF93cml0ZV9yZWdpc3RlcigKKwkJCQkJQVVE X0JVRl9BX0FERFIrKGogKiBIQURfUkVHX1dJRFRIKSwKKwkJCQkJKGJ1Zl9hZGRyIHwgQklUKDAp IHwgQklUKDEpKSk7CisJCX0KKwkJYnVmX2lkID0gYnVmX2lkICUgNDsKKwkJc3Bpbl9sb2NrX2ly cXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlpbnRlbGhh ZGRhdGEtPmJ1ZmZfZG9uZSA9IGJ1Zl9pZDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50 ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJfQorCisJcmV0dXJuIGludHJf Y291bnQ7Cit9CisKK2ludCBoYWRfcHJvY2Vzc19idWZmZXJfZG9uZShzdHJ1Y3Qgc25kX2ludGVs aGFkICppbnRlbGhhZGRhdGEpCit7CisJaW50IHJldHZhbCA9IDA7CisJdTMyIGxlbiA9IDE7CisJ ZW51bSBpbnRlbF9oYWRfYXVkX2J1Zl90eXBlIGJ1Zl9pZDsKKwllbnVtIGludGVsX2hhZF9hdWRf YnVmX3R5cGUgYnVmZl9kb25lOworCXN0cnVjdCBwY21fc3RyZWFtX2luZm8gKnN0cmVhbTsKKwl1 MzIgYnVmX3NpemU7CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKwlpbnQgaW50 cl9jb3VudDsKKwllbnVtIGhhZF9zdGF0dXNfc3RyZWFtCQlzdHJlYW1fdHlwZTsKKwl1bnNpZ25l ZCBsb25nIGZsYWdfaXJxczsKKworCWhhZF9zdHJlYW0gPSBpbnRlbGhhZGRhdGEtPnByaXZhdGVf ZGF0YTsKKwlzdHJlYW0gPSAmaW50ZWxoYWRkYXRhLT5zdHJlYW1faW5mbzsKKwlpbnRyX2NvdW50 ID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywg ZmxhZ19pcnFzKTsKKwlpZiAoaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID09IEhBRF9EUlZfRElT Q09OTkVDVEVEKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFk X3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlwcl9lcnIoIiVzOkRldmljZSBhbHJlYWR5IGRpc2Nv bm5lY3RlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlidWZfaWQgPSBp bnRlbGhhZGRhdGEtPmN1cnJfYnVmOworCWludGVsaGFkZGF0YS0+YnVmZl9kb25lID0gYnVmX2lk OworCWJ1ZmZfZG9uZSA9IGludGVsaGFkZGF0YS0+YnVmZl9kb25lOworCWJ1Zl9zaXplID0gaW50 ZWxoYWRkYXRhLT5idWZfaW5mb1tidWZfaWRdLmJ1Zl9zaXplOworCXN0cmVhbV90eXBlID0gaGFk X3N0cmVhbS0+c3RyZWFtX3R5cGU7CisKKwlwcl9kZWJ1ZygiRW50ZXI6JXMgYnVmX2lkPSVkIiwg X19mdW5jX18sIGJ1Zl9pZCk7CisKKwkvKiBFdmVyeSBkZWJ1ZyBzdGF0ZW1lbnQgaGFzIGFuIGlt cGxpY2F0aW9uCisJICogb2YgfjVtc2VjLiBUaHVzLCBhdm9pZCBoYXZpbmcgPjMgZGVidWcgc3Rh dGVtZW50cworCSAqIGZvciBlYWNoIGJ1ZmZlcl9kb25lIGhhbmRsaW5nLgorCSAqLworCisJLyog Q2hlY2sgZm9yIGFueSBpbnRyX21pc3MgaW4gY2FzZSBvZiBhY3RpdmUgcGxheWJhY2sgKi8KKwlp ZiAoaGFkX3N0cmVhbS0+c3RyZWFtX3R5cGUgPT0gSEFEX1JVTk5JTkdfU1RSRUFNKSB7CisJCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2ly cXMpOworCQlpbnRyX2NvdW50ID0gaGFkX2Noa19pbnRybWlzcyhpbnRlbGhhZGRhdGEsIGJ1Zl9p ZCk7CisJCWlmICghaW50cl9jb3VudCB8fCAoaW50cl9jb3VudCA+IDMpKSB7CisJCQlwcl9lcnIo IkhBRCBTVyBzdGF0ZSBpbiBub24tcmVjb3ZlcmFibGUhISEgbW9kZVxuIik7CisJCQlwcl9lcnIo IkFscmVhZHkgcGxheWVkIHN0YWxlIGRhdGFcbiIpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQor CQlidWZfaWQgKz0gKGludHJfY291bnQgLSAxKTsKKwkJYnVmX2lkID0gYnVmX2lkICUgNDsKKwkJ c3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMp OworCX0KKworCWludGVsaGFkZGF0YS0+YnVmX2luZm9bYnVmX2lkXS5pc192YWxpZCA9IHRydWU7 CisJaWYgKGludGVsaGFkZGF0YS0+dmFsaWRfYnVmX2NudC0xID09IGJ1Zl9pZCkgeworCQlpZiAo aGFkX3N0cmVhbS0+c3RyZWFtX3R5cGUgPj0gSEFEX1JVTk5JTkdfU1RSRUFNKQorCQkJaW50ZWxo YWRkYXRhLT5jdXJyX2J1ZiA9IEhBRF9CVUZfVFlQRV9BOworCX0gZWxzZQorCQlpbnRlbGhhZGRh dGEtPmN1cnJfYnVmID0gYnVmX2lkICsgMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlu dGVsaGFkZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCisJaWYgKGhhZF9nZXRfaHdz dGF0ZShpbnRlbGhhZGRhdGEpKSB7CisJCXByX2VycigiSERNSSBjYWJsZSBwbHVnZ2VkLW91dFxu Iik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJLypSZXByb2dyYW0gdGhlIHJlZ2lzdGVycyB3 aXRoIGFkZHIgYW5kIGxlbmd0aCovCisJaGFkX3dyaXRlX3JlZ2lzdGVyKEFVRF9CVUZfQV9MRU5H VEggKworCQkJKGJ1Zl9pZCAqIEhBRF9SRUdfV0lEVEgpLCBidWZfc2l6ZSk7CisJaGFkX3dyaXRl X3JlZ2lzdGVyKEFVRF9CVUZfQV9BRERSKyhidWZfaWQgKiBIQURfUkVHX1dJRFRIKSwKKwkJCWlu dGVsaGFkZGF0YS0+YnVmX2luZm9bYnVmX2lkXS5idWZfYWRkcnwKKwkJCUJJVCgwKSB8IEJJVCgx KSk7CisKKwloYWRfcmVhZF9yZWdpc3RlcihBVURfQlVGX0FfTEVOR1RIICsgKGJ1Zl9pZCAqIEhB RF9SRUdfV0lEVEgpLAorCQkJCQkmbGVuKTsKKwlwcl9kZWJ1ZygiJXM6RW5hYmxlZCBidWZbJWRd XG4iLCBfX2Z1bmNfXywgYnVmX2lkKTsKKworCS8qIEluIGNhc2Ugb2YgYWN0dWFsIGRhdGEsCisJ ICogcmVwb3J0IGJ1ZmZlcl9kb25lIHRvIGFib3ZlIEFMU0EgbGF5ZXIKKwkgKi8KKwlidWZfc2l6 ZSA9ICBpbnRlbGhhZGRhdGEtPmJ1Zl9pbmZvW2J1Zl9pZF0uYnVmX3NpemU7CisJaWYgKHN0cmVh bV90eXBlID49IEhBRF9SVU5OSU5HX1NUUkVBTSkgeworCQlpbnRlbGhhZGRhdGEtPnN0cmVhbV9p bmZvLmJ1ZmZlcl9yZW5kZXJlZCArPQorCQkJKGludHJfY291bnQgKiBidWZfc2l6ZSk7CisJCXN0 cmVhbS0+cGVyaW9kX2VsYXBzZWQoc3RyZWFtLT5oYWRfc3Vic3RyZWFtKTsKKwl9CisKKwlyZXR1 cm4gcmV0dmFsOworfQorCitpbnQgaGFkX3Byb2Nlc3NfYnVmZmVyX3VuZGVycnVuKHN0cnVjdCBz bmRfaW50ZWxoYWQgKmludGVsaGFkZGF0YSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwllbnVtIGlu dGVsX2hhZF9hdWRfYnVmX3R5cGUgYnVmX2lkOworCXN0cnVjdCBwY21fc3RyZWFtX2luZm8gKnN0 cmVhbTsKKwlzdHJ1Y3QgaGFkX3B2dF9kYXRhICpoYWRfc3RyZWFtOworCWVudW0gaGFkX3N0YXR1 c19zdHJlYW0gc3RyZWFtX3R5cGU7CisJdW5zaWduZWQgbG9uZyBmbGFnX2lycXM7CisJaW50IGRy dl9zdGF0dXM7CisKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisJ c3RyZWFtID0gJmludGVsaGFkZGF0YS0+c3RyZWFtX2luZm87CisKKwlzcGluX2xvY2tfaXJxc2F2 ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJYnVmX2lkID0gaW50 ZWxoYWRkYXRhLT5jdXJyX2J1ZjsKKwlzdHJlYW1fdHlwZSA9IGhhZF9zdHJlYW0tPnN0cmVhbV90 eXBlOworCWludGVsaGFkZGF0YS0+YnVmZl9kb25lID0gYnVmX2lkOworCWRydl9zdGF0dXMgPSBp bnRlbGhhZGRhdGEtPmRydl9zdGF0dXM7CisJaWYgKHN0cmVhbV90eXBlID09IEhBRF9SVU5OSU5H X1NUUkVBTSkKKwkJaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZiA9IEhBRF9CVUZfVFlQRV9BOworCisJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdf aXJxcyk7CisKKwlwcl9kZWJ1ZygiRW50ZXI6JXMgYnVmX2lkPSVkLCBzdHJlYW1fdHlwZT0lZFxu IiwKKwkJCV9fZnVuY19fLCBidWZfaWQsIHN0cmVhbV90eXBlKTsKKworCWludGVsaGFkZGF0YS0+ b3BzLT5oYW5kbGVfdW5kZXJydW4oaW50ZWxoYWRkYXRhKTsKKworCWlmIChkcnZfc3RhdHVzID09 IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7CisJCXByX2VycigiJXM6RGV2aWNlIGFscmVhZHkgZGlz Y29ubmVjdGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJaWYgKHN0 cmVhbV90eXBlID09IEhBRF9SVU5OSU5HX1NUUkVBTSkgeworCQkvKiBSZXBvcnQgVU5ERVJSVU4g ZXJyb3IgdG8gYWJvdmUgbGF5ZXJzICovCisJCWludGVsaGFkZGF0YS0+ZmxhZ191bmRlcnJ1biA9 IDE7CisJCXN0cmVhbS0+cGVyaW9kX2VsYXBzZWQoc3RyZWFtLT5oYWRfc3Vic3RyZWFtKTsKKwl9 CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgaGFkX3Byb2Nlc3NfaG90X3BsdWcoc3RydWN0 IHNuZF9pbnRlbGhhZCAqaW50ZWxoYWRkYXRhKQoreworCWludCByZXR2YWwgPSAwOworCWVudW0g aW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZfaWQ7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFt ICpzdWJzdHJlYW07CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0cmVhbTsKKwl1bnNpZ25l ZCBsb25nIGZsYWdfaXJxczsKKworCXByX2RlYnVnKCJFbnRlcjolcyIsIF9fZnVuY19fKTsKKwor CXN1YnN0cmVhbSA9IGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVhbTsKKwlo YWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisKKwlzcGluX2xvY2tfaXJx c2F2ZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJaWYgKGludGVs aGFkZGF0YS0+ZHJ2X3N0YXR1cyA9PSBIQURfRFJWX0NPTk5FQ1RFRCkgeworCQlwcl9kZWJ1Zygi RGV2aWNlIGFscmVhZHkgY29ubmVjdGVkXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm aW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZsYWdfaXJxcyk7CisJCXJldHVybiByZXR2YWw7 CisJfQorCWJ1Zl9pZCA9IGludGVsaGFkZGF0YS0+Y3Vycl9idWY7CisJaW50ZWxoYWRkYXRhLT5i dWZmX2RvbmUgPSBidWZfaWQ7CisJaW50ZWxoYWRkYXRhLT5kcnZfc3RhdHVzID0gSEFEX0RSVl9D T05ORUNURUQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3Bp bmxvY2ssIGZsYWdfaXJxcyk7CisKKwlwcl9kZWJ1ZygiUHJvY2Vzc2luZyBIT1RfUExVRywgYnVm X2lkID0gJWRcbiIsIGJ1Zl9pZCk7CisKKwkvKiBTYWZldHkgY2hlY2sgKi8KKwlpZiAoc3Vic3Ry ZWFtKSB7CisJCXByX2RlYnVnKCJUaGVyZSBzaG91bGQgbm90IGJlIGFjdGl2ZSBQQiBmcm9tIEFM U0FcbiIpOworCQlwcl9kZWJ1ZygiU2lnbmlmaWVzLCBjYWJsZSBpcyBwbHVnZ2VkLWluIGV2ZW4g YmVmb3JlXG4iKTsKKwkJcHJfZGVidWcoInByb2Nlc3Npbmcgc25kX3BjbV9kaXNjb25uZWN0XG4i KTsKKwkJLyogU2V0IHJ1bnRpbWUtPnN0YXRlIHRvIGh3X3BhcmFtcyBkb25lICovCisJCXNuZF9w Y21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9TRVRVUCk7CisJfQorCisJaGFkX2J1 aWxkX2NoYW5uZWxfYWxsb2NhdGlvbl9tYXAoaW50ZWxoYWRkYXRhKTsKKworCXJldHVybiByZXR2 YWw7Cit9CisKK2ludCBoYWRfcHJvY2Vzc19ob3RfdW5wbHVnKHN0cnVjdCBzbmRfaW50ZWxoYWQg KmludGVsaGFkZGF0YSkKK3sKKwlpbnQgY2FwcywgcmV0dmFsID0gMDsKKwllbnVtIGludGVsX2hh ZF9hdWRfYnVmX3R5cGUgYnVmX2lkOworCXN0cnVjdCBoYWRfcHZ0X2RhdGEgKmhhZF9zdHJlYW07 CisJdW5zaWduZWQgbG9uZyBmbGFnX2lycXM7CisKKwlwcl9kZWJ1ZygiRW50ZXI6JXMiLCBfX2Z1 bmNfXyk7CisKKwloYWRfc3RyZWFtID0gaW50ZWxoYWRkYXRhLT5wcml2YXRlX2RhdGE7CisJYnVm X2lkID0gaW50ZWxoYWRkYXRhLT5jdXJyX2J1ZjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbnRl bGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwlpZiAoaW50ZWxoYWRkYXRhLT5k cnZfc3RhdHVzID09IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7CisJCXByX2RlYnVnKCJEZXZpY2Ug YWxyZWFkeSBkaXNjb25uZWN0ZWRcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnRl bGhhZGRhdGEtPmhhZF9zcGlubG9jaywgZmxhZ19pcnFzKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9 IGVsc2UgeworCQkvKiBEaXNhYmxlIEF1ZGlvICovCisJCWNhcHMgPSBIRE1JX0FVRElPX0JVRkZF Ul9ET05FOworCQlyZXR2YWwgPSBoYWRfc2V0X2NhcHMoSEFEX1NFVF9ESVNBQkxFX0FVRElPX0lO VCwgJmNhcHMpOworCQlyZXR2YWwgPSBoYWRfc2V0X2NhcHMoSEFEX1NFVF9ESVNBQkxFX0FVRElP LCBOVUxMKTsKKwkJaW50ZWxoYWRkYXRhLT5vcHMtPmVuYWJsZV9hdWRpbyhpbnRlbGhhZGRhdGEt PnN0cmVhbV9pbmZvLmhhZF9zdWJzdHJlYW0sIDApOworCX0KKworCWludGVsaGFkZGF0YS0+ZHJ2 X3N0YXR1cyA9IEhBRF9EUlZfRElTQ09OTkVDVEVEOworCS8qIFJlcG9ydCB0byBhYm92ZSBBTFNB IGxheWVyICovCisJaWYgKGludGVsaGFkZGF0YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVhbSAh PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3Nw aW5sb2NrLCBmbGFnX2lycXMpOworCQlwcl9kZWJ1ZygiJXM6IHVubG9jayAtPiBzZW5kaW5nIHBj bV9zdG9wIC0+IGxvY2tcbiIsIF9fZnVuY19fKTsKKwkJc25kX3BjbV9zdG9wKGludGVsaGFkZGF0 YS0+c3RyZWFtX2luZm8uaGFkX3N1YnN0cmVhbSwKKwkJCQlTTkRSVl9QQ01fU1RBVEVfRElTQ09O TkVDVEVEKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFkZGF0YS0+aGFkX3NwaW5sb2Nr LCBmbGFnX2lycXMpOworCX0KKworCWhhZF9zdHJlYW0tPnN0cmVhbV90eXBlID0gSEFEX0lOSVQ7 CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW50ZWxoYWRkYXRhLT5oYWRfc3BpbmxvY2ssIGZs YWdfaXJxcyk7CisJa2ZyZWUoaW50ZWxoYWRkYXRhLT5jaG1hcC0+Y2htYXApOworCWludGVsaGFk ZGF0YS0+Y2htYXAtPmNobWFwID0gTlVMTDsKKwlwcl9kZWJ1ZygiJXM6IHVubG9ja2VkIC0+IHJl dHVybmVkXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIGhh ZF9ldmVudF9oYW5kbGVyIC0gQ2FsbCBiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSBldmVudHMKKyAq CisgKiBAZXZlbnRfdHlwZTogRXZlbnQgdHlwZSB0byBoYW5kbGUKKyAqIEBkYXRhOiBkYXRhIHJl bGF0ZWQgdG8gdGhlIGV2ZW50X3R5cGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQg dG8gaGFuZGxlIEhETUkgZXZlbnRzIGZyb20gY2xpZW50IGRyaXZlci4KKyAqLworaW50IGhhZF9l dmVudF9oYW5kbGVyKGVudW0gaGFkX2V2ZW50X3R5cGUgZXZlbnRfdHlwZSwgdm9pZCAqZGF0YSkK K3sKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3Qgc25kX2ludGVsaGFkICppbnRlbGhhZGRhdGEg PSBkYXRhOworCWVudW0gaW50ZWxfaGFkX2F1ZF9idWZfdHlwZSBidWZfaWQ7CisJc3RydWN0IHNu ZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IGhhZF9wdnRfZGF0YSAqaGFkX3N0 cmVhbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdfaXJxczsKKworCWJ1Zl9pZCA9IGludGVsaGFkZGF0 YS0+Y3Vycl9idWY7CisJaGFkX3N0cmVhbSA9IGludGVsaGFkZGF0YS0+cHJpdmF0ZV9kYXRhOwor CisJLyogU3dpdGNoaW5nIHRvIGEgZnVuY3Rpb24gY2FuIGRyb3AgYXRvbWljaXR5IGV2ZW4gaW4g SU5UUiBjb250ZXh0LgorCSAqIFRodXMsIGEgYmlnIGxvY2sgaXMgYWNxdWlyZWQgdG8gbWFpbnRh aW4gYXRvbWljaXR5LgorCSAqIFRoaXMgY2FuIGJlIG9wdGltaXplZCBsYXRlci4KKwkgKiBDdXJy ZW50bHksIG9ubHkgYnVmZmVyX2RvbmUvX3VuZGVycnVuIGV4ZWN1dGVzIGluIElOVFIgY29udGV4 dC4KKwkgKiBBbHNvLCBsb2NraW5nIGlzIGltcGxlbWVudGVkIHNlcGFyYXRlbHkgdG8gYXZvaWQg cmVhbCBjb250ZW50aW9uCisJICogb2YgZGF0YShzdHJ1Y3QgaW50ZWxoYWRkYXRhKSBiZXR3ZWVu IElSUS9TT0ZUX0lSUS9QUk9DRVNTIGNvbnRleHQuCisJICovCisJc3Vic3RyZWFtID0gaW50ZWxo YWRkYXRhLT5zdHJlYW1faW5mby5oYWRfc3Vic3RyZWFtOworCXN3aXRjaCAoZXZlbnRfdHlwZSkg eworCWNhc2UgSEFEX0VWRU5UX0FVRElPX0JVRkZFUl9ET05FOgorCQlyZXR2YWwgPSBoYWRfcHJv Y2Vzc19idWZmZXJfZG9uZShpbnRlbGhhZGRhdGEpOworCWJyZWFrOworCisJY2FzZSBIQURfRVZF TlRfQVVESU9fQlVGRkVSX1VOREVSUlVOOgorCQlyZXR2YWwgPSBoYWRfcHJvY2Vzc19idWZmZXJf dW5kZXJydW4oaW50ZWxoYWRkYXRhKTsKKwlicmVhazsKKworCWNhc2UgSEFEX0VWRU5UX0hPVF9Q TFVHOgorCQlyZXR2YWwgPSBoYWRfcHJvY2Vzc19ob3RfcGx1ZyhpbnRlbGhhZGRhdGEpOworCWJy ZWFrOworCisJY2FzZSBIQURfRVZFTlRfSE9UX1VOUExVRzoKKwkJcmV0dmFsID0gaGFkX3Byb2Nl c3NfaG90X3VucGx1ZyhpbnRlbGhhZGRhdGEpOworCWJyZWFrOworCisJY2FzZSBIQURfRVZFTlRf TU9ERV9DSEFOR0lORzoKKwkJcHJfZGVidWcoIiBjYWxsZWQgX2V2ZW50X2hhbmRsZXIgd2l0aCBf TU9ERV9DSEFOR0UgZXZlbnRcbiIpOworCQkvKiBQcm9jZXNzIG9ubHkgaWYgc3RyZWFtIGlzIGFj dGl2ZSAmIGNhYmxlIFBsdWdnZWQtaW4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmludGVsaGFk ZGF0YS0+aGFkX3NwaW5sb2NrLCBmbGFnX2lycXMpOworCQlpZiAoaW50ZWxoYWRkYXRhLT5kcnZf c3RhdHVzID49IEhBRF9EUlZfRElTQ09OTkVDVEVEKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZpbnRlbGhhZGRhdGEtPmhhZF9zcGlubG9jaywKKwkJCQkJZmxhZ19pcnFzKTsKKwkJCWJy ZWFrOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmludGVsaGFkZGF0YS0+aGFkX3Nw aW5sb2NrLCBmbGFnX2lycXMpOworCQlpZiAoKGhhZF9zdHJlYW0tPnN0cmVhbV90eXBlID09IEhB RF9SVU5OSU5HX1NUUkVBTSkKKwkJCQkmJiBzdWJzdHJlYW0pCisJCQlyZXR2YWwgPSBoZG1pX2F1 ZGlvX21vZGVfY2hhbmdlKHN1YnN0cmVhbSk7CisJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcl9k ZWJ1ZygiZXJyb3IgdW4taGFuZGxlZCBldmVudCAhIVxuIik7CisJCXJldHZhbCA9IC1FSU5WQUw7 CisJYnJlYWs7CisKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KLS0gCjEuOS4xCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBs aXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK