From mboxrd@z Thu Jan 1 00:00:00 1970 From: Brian Norris Subject: [PATCH v3 03/10] mtd: nand: add NAND driver for Broadcom STB NAND controller Date: Wed, 6 May 2015 10:59:47 -0700 Message-ID: <1430935194-7579-4-git-send-email-computersforpeace@gmail.com> References: <1430935194-7579-1-git-send-email-computersforpeace@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1430935194-7579-1-git-send-email-computersforpeace@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-mtd" Errors-To: linux-mtd-bounces+gldm-linux-mtd-36=gmane.org@lists.infradead.org To: linux-mtd@lists.infradead.org Cc: devicetree@vger.kernel.org, Florian Fainelli , Scott Branden , Kevin Cernekee , Corneliu Doban , Ray Jui , =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= , linux-kernel@vger.kernel.org, Dan Ehrenberg , Jonathan Richardson , Anatol Pomazao , Gregory Fong , bcm-kernel-feedback-list@broadcom.com, Brian Norris , Dmitry Torokhov List-Id: devicetree@vger.kernel.org VGhpcyBjb3JlIG9yaWdpbmF0ZWQgaW4gU2V0LVRvcCBCb3ggY2hpcHMgKEJDTTd4eHgpIGJ1dCBp cyB1c2VkIGluIGEKdmFyaWV0eSBvZiBvdGhlciBCcm9hZGNvbSBjaGlwcywgaW5jbHVkaW5nIHNv bWUgQkNNNjN4eHgsIEJDTTMzeHgsIGFuZAppUHJvYy9DeWdudXMuIEl0J3MgYmVlbiB1c2VkIG9u bHkgb24gQVJNIGFuZCBNSVBTIFNvQ3MsIHNvIHJlc3RyaWN0IGl0CnRvIHRob3NlIGFyY2hpdGVj dHVyZXMuCgpUaGVyZSBhcmUgbXVsdGlwbGUgcmV2aXNpb25zIG9mIHRoaXMgY29yZSB0aHJvdWdo b3V0IHRoZSB5ZWFycywgYW5kCmFsbW9zdCBldmVyeSB2ZXJzaW9uIGJyb2tlIHJlZ2lzdGVyIGNv bXBhdGliaWxpdHkgaW4gc29tZSBzbWFsbCB3YXksIGJ1dAp3aXRoIHNvbWUgZWZmb3J0LCB0aGlz IGRyaXZlciBpcyBhYmxlIHRvIHN1cHBvcnQgdjQuMCwgdjUuMCwgdjYueCwgdjcuMCwKYW5kIHY3 LjEuIEl0J3MgYmVlbiB0ZXN0ZWQgb24gdjUuMCwgdjYuMCwgdjcuMCwgYW5kIHY3LjEgcmVjZW50 bHksIHNvCnRoZXJlIGhvcGVmdWxseSBhcmUgbm8gbW9yZSBsdXJraW5nIGluY29uc2lzdGVuY2ll cy4KClNpZ25lZC1vZmYtYnk6IEJyaWFuIE5vcnJpcyA8Y29tcHV0ZXJzZm9ycGVhY2VAZ21haWwu Y29tPgotLS0KIGRyaXZlcnMvbXRkL25hbmQvS2NvbmZpZyAgICAgICAgfCAgICA4ICsKIGRyaXZl cnMvbXRkL25hbmQvTWFrZWZpbGUgICAgICAgfCAgICAxICsKIGRyaXZlcnMvbXRkL25hbmQvYnJj bXN0Yl9uYW5kLmMgfCAyMTk4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KwogMyBmaWxlcyBjaGFuZ2VkLCAyMjA3IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL210ZC9uYW5kL2JyY21zdGJfbmFuZC5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9t dGQvbmFuZC9LY29uZmlnIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCmluZGV4IDU4OTdkOGQ4 ZmE1YS4uMzU4NzAxN2IyMDlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL0tjb25maWcK KysrIGIvZHJpdmVycy9tdGQvbmFuZC9LY29uZmlnCkBAIC0zOTQsNiArMzk0LDE0IEBAIGNvbmZp ZyBNVERfTkFORF9HUE1JX05BTkQKIAkgYmxvY2ssIHN1Y2ggYXMgU0QgY2FyZC4gU28gcGF5IGF0 dGVudGlvbiB0byBpdCB3aGVuIHlvdSBlbmFibGUKIAkgdGhlIEdQTUkuCiAKK2NvbmZpZyBNVERf TkFORF9CUkNNU1RCCisJdHJpc3RhdGUgIkJyb2FkY29tIFNUQiBOQU5EIGNvbnRyb2xsZXIiCisJ ZGVwZW5kcyBvbiBBUk0gfHwgTUlQUworCWhlbHAKKwkgIEVuYWJsZXMgdGhlIEJyb2FkY29tIE5B TkQgY29udHJvbGxlciBkcml2ZXIuIFRoZSBjb250cm9sbGVyIHdhcworCSAgb3JpZ2luYWxseSBk ZXNpZ25lZCBmb3IgU2V0LVRvcCBCb3ggYnV0IGlzIHVzZWQgb24gdmFyaW91cyBCQ003eHh4LAor CSAgQkNNM3h4eCwgQkNNNjN4eHgsIGlQcm9jL0N5Z251cyBhbmQgbW9yZS4KKwogY29uZmlnIE1U RF9OQU5EX0JDTTQ3WFhORkxBU0gKIAl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgTkFORCBmbGFzaCBv biBCQ000NzA2IEJDTUEgYnVzIgogCWRlcGVuZHMgb24gQkNNQV9ORkxBU0gKZGlmZiAtLWdpdCBh L2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUgYi9kcml2ZXJzL210ZC9uYW5kL01ha2VmaWxlCmlu ZGV4IDU4MmJiZDA1YWZmNy4uM2IxYWRkZGM4M2RkIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9u YW5kL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvTWFrZWZpbGUKQEAgLTUyLDUgKzUy LDYgQEAgb2JqLSQoQ09ORklHX01URF9OQU5EX1hXQVkpCQkrPSB4d2F5X25hbmQubwogb2JqLSQo Q09ORklHX01URF9OQU5EX0JDTTQ3WFhORkxBU0gpCSs9IGJjbTQ3eHhuZmxhc2gvCiBvYmotJChD T05GSUdfTVREX05BTkRfU1VOWEkpCQkrPSBzdW54aV9uYW5kLm8KIG9iai0kKENPTkZJR19NVERf TkFORF9ISVNJNTA0KQkgICAgICAgICs9IGhpc2k1MDRfbmFuZC5vCitvYmotJChDT05GSUdfTVRE X05BTkRfQlJDTVNUQikJCSs9IGJyY21zdGJfbmFuZC5vCiAKIG5hbmQtb2JqcyA6PSBuYW5kX2Jh c2UubyBuYW5kX2JidC5vIG5hbmRfdGltaW5ncy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9u YW5kL2JyY21zdGJfbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9icmNtc3RiX25hbmQuYwpuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmVjNjVhNDhkMjQ4NwotLS0gL2Rl di9udWxsCisrKyBiL2RyaXZlcnMvbXRkL25hbmQvYnJjbXN0Yl9uYW5kLmMKQEAgLTAsMCArMSwy MTk4IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTAtMjAxNSBCcm9hZGNvbSBDb3Jwb3JhdGlv bgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1 dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBB TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVS Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhl CisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisK KyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cisj aW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVk ZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cisj aW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2lu Y2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Cisj aW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4K KyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNs dWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxp bnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbmFuZC5oPgorI2luY2x1ZGUgPGxp bnV4L210ZC9wYXJ0aXRpb25zLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxs aW51eC9vZl9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUg PGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgv bG9nMi5oPgorCisvKgorICogVGhpcyBmbGFnIGNvbnRyb2xzIGlmIFdQIHN0YXlzIG9uIGJldHdl ZW4gZXJhc2Uvd3JpdGUgY29tbWFuZHMgdG8gbWl0aWdhdGUKKyAqIGZsYXNoIGNvcnJ1cHRpb24g ZHVlIHRvIHBvd2VyIGdsaXRjaGVzLiBWYWx1ZXM6CisgKiAwOiBOQU5EX1dQIGlzIG5vdCB1c2Vk IG9yIG5vdCBhdmFpbGFibGUKKyAqIDE6IE5BTkRfV1AgaXMgc2V0IGJ5IGRlZmF1bHQsIGNsZWFy ZWQgZm9yIGVyYXNlL3dyaXRlIG9wZXJhdGlvbnMKKyAqIDI6IE5BTkRfV1AgaXMgYWx3YXlzIGNs ZWFyZWQKKyAqLworc3RhdGljIGludCB3cF9vbiA9IDE7Cittb2R1bGVfcGFyYW0od3Bfb24sIGlu dCwgMDQ0NCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRGVmaW5pdGlvbnMKKyAqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8KKworI2RlZmluZSBEUlZfTkFNRQkJCSJicmNtc3RiX25hbmQiCisKKyNkZWZpbmUgQ01E X05VTEwJCQkweDAwCisjZGVmaW5lIENNRF9QQUdFX1JFQUQJCQkweDAxCisjZGVmaW5lIENNRF9T UEFSRV9BUkVBX1JFQUQJCTB4MDIKKyNkZWZpbmUgQ01EX1NUQVRVU19SRUFECQkJMHgwMworI2Rl ZmluZSBDTURfUFJPR1JBTV9QQUdFCQkweDA0CisjZGVmaW5lIENNRF9QUk9HUkFNX1NQQVJFX0FS RUEJCTB4MDUKKyNkZWZpbmUgQ01EX0NPUFlfQkFDSwkJCTB4MDYKKyNkZWZpbmUgQ01EX0RFVklD RV9JRF9SRUFECQkweDA3CisjZGVmaW5lIENNRF9CTE9DS19FUkFTRQkJCTB4MDgKKyNkZWZpbmUg Q01EX0ZMQVNIX1JFU0VUCQkJMHgwOQorI2RlZmluZSBDTURfQkxPQ0tTX0xPQ0sJCQkweDBhCisj ZGVmaW5lIENNRF9CTE9DS1NfTE9DS19ET1dOCQkweDBiCisjZGVmaW5lIENNRF9CTE9DS1NfVU5M T0NLCQkweDBjCisjZGVmaW5lIENNRF9SRUFEX0JMT0NLU19MT0NLX1NUQVRVUwkweDBkCisjZGVm aW5lIENNRF9QQVJBTUVURVJfUkVBRAkJMHgwZQorI2RlZmluZSBDTURfUEFSQU1FVEVSX0NIQU5H RV9DT0wJMHgwZgorI2RlZmluZSBDTURfTE9XX0xFVkVMX09QCQkweDEwCisKK3N0cnVjdCBicmNt X25hbmRfZG1hX2Rlc2MgeworCXUzMiBuZXh0X2Rlc2M7CisJdTMyIG5leHRfZGVzY19leHQ7CisJ dTMyIGNtZF9pcnE7CisJdTMyIGRyYW1fYWRkcjsKKwl1MzIgZHJhbV9hZGRyX2V4dDsKKwl1MzIg dGZyX2xlbjsKKwl1MzIgdG90YWxfbGVuOworCXUzMiBmbGFzaF9hZGRyOworCXUzMiBmbGFzaF9h ZGRyX2V4dDsKKwl1MzIgY3M7CisJdTMyIHBhZDJbNV07CisJdTMyIHN0YXR1c192YWxpZDsKK30g X19wYWNrZWQ7CisKKy8qIEJpdGZpZWxkcyBmb3IgYnJjbV9uYW5kX2RtYV9kZXNjOjpzdGF0dXNf dmFsaWQgKi8KKyNkZWZpbmUgRkxBU0hfRE1BX0VDQ19FUlJPUgkoMSA8PCA4KQorI2RlZmluZSBG TEFTSF9ETUFfQ09SUl9FUlJPUgkoMSA8PCA5KQorCisvKiA1MTJCIGZsYXNoIGNhY2hlIGluIHRo ZSBOQU5EIGNvbnRyb2xsZXIgSFcgKi8KKyNkZWZpbmUgRkNfU0hJRlQJCTlVCisjZGVmaW5lIEZD X0JZVEVTCQk1MTJVCisjZGVmaW5lIEZDX1dPUkRTCQkoRkNfQllURVMgPj4gMikKKworI2RlZmlu ZSBCUkNNTkFORF9NSU5fUEFHRVNJWkUJNTEyCisjZGVmaW5lIEJSQ01OQU5EX01JTl9CTE9DS1NJ WkUJKDggKiAxMDI0KQorI2RlZmluZSBCUkNNTkFORF9NSU5fREVWU0laRQkoNFVMTCAqIDEwMjQg KiAxMDI0KQorCisvKiBDb250cm9sbGVyIGZlYXR1cmUgZmxhZ3MgKi8KK2VudW0geworCUJSQ01O QU5EX0hBU18xS19TRUNUT1JTCQkJPSBCSVQoMCksCisJQlJDTU5BTkRfSEFTX1BSRUZFVENICQkJ PSBCSVQoMSksCisJQlJDTU5BTkRfSEFTX0NBQ0hFX01PREUJCQk9IEJJVCgyKSwKKwlCUkNNTkFO RF9IQVNfV1AJCQkJPSBCSVQoMyksCit9OworCitzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxlciB7 CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlzdHJ1Y3QgbmFuZF9od19jb250cm9sCWNvbnRyb2xs ZXI7CisJdm9pZCBfX2lvbWVtCQkqbmFuZF9iYXNlOworCXZvaWQgX19pb21lbQkJKm5hbmRfZmM7 IC8qIGZsYXNoIGNhY2hlICovCisJdm9pZCBfX2lvbWVtCQkqZmxhc2hfZG1hX2Jhc2U7CisJdW5z aWduZWQgaW50CQlpcnE7CisJdW5zaWduZWQgaW50CQlkbWFfaXJxOworCWludAkJCW5hbmRfdmVy c2lvbjsKKworCWludAkJCWNtZF9wZW5kaW5nOworCWJvb2wJCQlkbWFfcGVuZGluZzsKKwlzdHJ1 Y3QgY29tcGxldGlvbglkb25lOworCXN0cnVjdCBjb21wbGV0aW9uCWRtYV9kb25lOworCisJLyog TGlzdCBvZiBOQU5EIGhvc3RzIChvbmUgZm9yIGVhY2ggY2hpcC1zZWxlY3QpICovCisJc3RydWN0 IGxpc3RfaGVhZCBob3N0X2xpc3Q7CisKKwlzdHJ1Y3QgYnJjbV9uYW5kX2RtYV9kZXNjICpkbWFf ZGVzYzsKKwlkbWFfYWRkcl90CQlkbWFfcGE7CisKKwkvKiBpbi1tZW1vcnkgY2FjaGUgb2YgdGhl IEZMQVNIX0NBQ0hFLCB1c2VkIG9ubHkgZm9yIHNvbWUgY29tbWFuZHMgKi8KKwl1MzIJCQlmbGFz aF9jYWNoZVtGQ19XT1JEU107CisKKwkvKiBDb250cm9sbGVyIHJldmlzaW9uIGRldGFpbHMgKi8K Kwljb25zdCB1MTYJCSpyZWdfb2Zmc2V0czsKKwl1bnNpZ25lZCBpbnQJCXJlZ19zcGFjaW5nOyAv KiBiZXR3ZWVuIENTMSwgQ1MyLCAuLi4gcmVncyAqLworCWNvbnN0IHU4CQkqY3Nfb2Zmc2V0czsg Lyogd2l0aGluIGVhY2ggY2hpcC1zZWxlY3QgKi8KKwljb25zdCB1OAkJKmNzMF9vZmZzZXRzOyAv KiB3aXRoaW4gQ1MwLCBpZiBkaWZmZXJlbnQgKi8KKwl1bnNpZ25lZCBpbnQJCW1heF9ibG9ja19z aXplOworCWNvbnN0IHVuc2lnbmVkIGludAkqYmxvY2tfc2l6ZXM7CisJdW5zaWduZWQgaW50CQlt YXhfcGFnZV9zaXplOworCWNvbnN0IHVuc2lnbmVkIGludAkqcGFnZV9zaXplczsKKwl1bnNpZ25l ZCBpbnQJCW1heF9vb2I7CisJdTMyCQkJZmVhdHVyZXM7CisKKwkvKiBmb3IgbG93LXBvd2VyIHN0 YW5kYnkvcmVzdW1lIG9ubHkgKi8KKwl1MzIJCQluYW5kX2NzX25hbmRfc2VsZWN0OworCXUzMgkJ CW5hbmRfY3NfbmFuZF94b3I7CisJdTMyCQkJY29ycl9zdGF0X3RocmVzaG9sZDsKKwl1MzIJCQlm bGFzaF9kbWFfbW9kZTsKK307CisKK3N0cnVjdCBicmNtbmFuZF9jZmcgeworCXU2NAkJCWRldmlj ZV9zaXplOworCXVuc2lnbmVkIGludAkJYmxvY2tfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJCXBhZ2Vf c2l6ZTsKKwl1bnNpZ25lZCBpbnQJCXNwYXJlX2FyZWFfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJCWRl dmljZV93aWR0aDsKKwl1bnNpZ25lZCBpbnQJCWNvbF9hZHJfYnl0ZXM7CisJdW5zaWduZWQgaW50 CQlibGtfYWRyX2J5dGVzOworCXVuc2lnbmVkIGludAkJZnVsX2Fkcl9ieXRlczsKKwl1bnNpZ25l ZCBpbnQJCXNlY3Rvcl9zaXplXzFrOworCXVuc2lnbmVkIGludAkJZWNjX2xldmVsOworCS8qIHVz ZSBmb3IgbG93LXBvd2VyIHN0YW5kYnkvcmVzdW1lIG9ubHkgKi8KKwl1MzIJCQlhY2NfY29udHJv bDsKKwl1MzIJCQljb25maWc7CisJdTMyCQkJY29uZmlnX2V4dDsKKwl1MzIJCQl0aW1pbmdfMTsK Kwl1MzIJCQl0aW1pbmdfMjsKK307CisKK3N0cnVjdCBicmNtbmFuZF9ob3N0IHsKKwlzdHJ1Y3Qg bGlzdF9oZWFkCW5vZGU7CisJc3RydWN0IGRldmljZV9ub2RlCSpvZl9ub2RlOworCisJc3RydWN0 IG5hbmRfY2hpcAljaGlwOworCXN0cnVjdCBtdGRfaW5mbwkJbXRkOworCXN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UJKnBkZXY7CisJaW50CQkJY3M7CisKKwl1bnNpZ25lZCBpbnQJCWxhc3RfY21kOwor CXVuc2lnbmVkIGludAkJbGFzdF9ieXRlOworCXU2NAkJCWxhc3RfYWRkcjsKKwlzdHJ1Y3QgYnJj bW5hbmRfY2ZnCWh3Y2ZnOworCXN0cnVjdCBicmNtbmFuZF9jb250cm9sbGVyICpjdHJsOworfTsK KworZW51bSBicmNtbmFuZF9yZWcgeworCUJSQ01OQU5EX0NNRF9TVEFSVCA9IDAsCisJQlJDTU5B TkRfQ01EX0VYVF9BRERSRVNTLAorCUJSQ01OQU5EX0NNRF9BRERSRVNTLAorCUJSQ01OQU5EX0lO VEZDX1NUQVRVUywKKwlCUkNNTkFORF9DU19TRUxFQ1QsCisJQlJDTU5BTkRfQ1NfWE9SLAorCUJS Q01OQU5EX0xMX09QLAorCUJSQ01OQU5EX0NTMF9CQVNFLAorCUJSQ01OQU5EX0NTMV9CQVNFLAkJ LyogQ1MxIHJlZ3MsIGlmIG5vbi1jb250aWd1b3VzICovCisJQlJDTU5BTkRfQ09SUl9USFJFU0hP TEQsCisJQlJDTU5BTkRfQ09SUl9USFJFU0hPTERfRVhULAorCUJSQ01OQU5EX1VOQ09SUl9DT1VO VCwKKwlCUkNNTkFORF9DT1JSX0NPVU5ULAorCUJSQ01OQU5EX0NPUlJfRVhUX0FERFIsCisJQlJD TU5BTkRfQ09SUl9BRERSLAorCUJSQ01OQU5EX1VOQ09SUl9FWFRfQUREUiwKKwlCUkNNTkFORF9V TkNPUlJfQUREUiwKKwlCUkNNTkFORF9TRU1BUEhPUkUsCisJQlJDTU5BTkRfSUQsCisJQlJDTU5B TkRfSURfRVhULAorCUJSQ01OQU5EX0xMX1JEQVRBLAorCUJSQ01OQU5EX09PQl9SRUFEX0JBU0Us CisJQlJDTU5BTkRfT09CX1JFQURfMTBfQkFTRSwJLyogb2Zmc2V0IDB4MTAsIGlmIG5vbi1jb250 aWd1b3VzICovCisJQlJDTU5BTkRfT09CX1dSSVRFX0JBU0UsCisJQlJDTU5BTkRfT09CX1dSSVRF XzEwX0JBU0UsCS8qIG9mZnNldCAweDEwLCBpZiBub24tY29udGlndW91cyAqLworCUJSQ01OQU5E X0ZDX0JBU0UsCit9OworCisvKiBCUkNNTkFORCB2NC4wICovCitzdGF0aWMgY29uc3QgdTE2IGJy Y21uYW5kX3JlZ3NfdjQwW10gPSB7CisJW0JSQ01OQU5EX0NNRF9TVEFSVF0JCT0gIDB4MDQsCisJ W0JSQ01OQU5EX0NNRF9FWFRfQUREUkVTU10JPSAgMHgwOCwKKwlbQlJDTU5BTkRfQ01EX0FERFJF U1NdCQk9ICAweDBjLAorCVtCUkNNTkFORF9JTlRGQ19TVEFUVVNdCQk9ICAweDZjLAorCVtCUkNN TkFORF9DU19TRUxFQ1RdCQk9ICAweDE0LAorCVtCUkNNTkFORF9DU19YT1JdCQk9ICAweDE4LAor CVtCUkNNTkFORF9MTF9PUF0JCT0gMHgxNzgsCisJW0JSQ01OQU5EX0NTMF9CQVNFXQkJPSAgMHg0 MCwKKwlbQlJDTU5BTkRfQ1MxX0JBU0VdCQk9ICAweGQwLAorCVtCUkNNTkFORF9DT1JSX1RIUkVT SE9MRF0JPSAgMHg4NCwKKwlbQlJDTU5BTkRfQ09SUl9USFJFU0hPTERfRVhUXQk9ICAgICAwLAor CVtCUkNNTkFORF9VTkNPUlJfQ09VTlRdCQk9ICAgICAwLAorCVtCUkNNTkFORF9DT1JSX0NPVU5U XQkJPSAgICAgMCwKKwlbQlJDTU5BTkRfQ09SUl9FWFRfQUREUl0JPSAgMHg3MCwKKwlbQlJDTU5B TkRfQ09SUl9BRERSXQkJPSAgMHg3NCwKKwlbQlJDTU5BTkRfVU5DT1JSX0VYVF9BRERSXQk9ICAw eDc4LAorCVtCUkNNTkFORF9VTkNPUlJfQUREUl0JCT0gIDB4N2MsCisJW0JSQ01OQU5EX1NFTUFQ SE9SRV0JCT0gIDB4NTgsCisJW0JSQ01OQU5EX0lEXQkJCT0gIDB4NjAsCisJW0JSQ01OQU5EX0lE X0VYVF0JCT0gIDB4NjQsCisJW0JSQ01OQU5EX0xMX1JEQVRBXQkJPSAweDE3YywKKwlbQlJDTU5B TkRfT09CX1JFQURfQkFTRV0JPSAgMHgyMCwKKwlbQlJDTU5BTkRfT09CX1JFQURfMTBfQkFTRV0J PSAweDEzMCwKKwlbQlJDTU5BTkRfT09CX1dSSVRFX0JBU0VdCT0gIDB4MzAsCisJW0JSQ01OQU5E X09PQl9XUklURV8xMF9CQVNFXQk9ICAgICAwLAorCVtCUkNNTkFORF9GQ19CQVNFXQkJPSAweDIw MCwKK307CisKKy8qIEJSQ01OQU5EIHY1LjAgKi8KK3N0YXRpYyBjb25zdCB1MTYgYnJjbW5hbmRf cmVnc192NTBbXSA9IHsKKwlbQlJDTU5BTkRfQ01EX1NUQVJUXQkJPSAgMHgwNCwKKwlbQlJDTU5B TkRfQ01EX0VYVF9BRERSRVNTXQk9ICAweDA4LAorCVtCUkNNTkFORF9DTURfQUREUkVTU10JCT0g IDB4MGMsCisJW0JSQ01OQU5EX0lOVEZDX1NUQVRVU10JCT0gIDB4NmMsCisJW0JSQ01OQU5EX0NT X1NFTEVDVF0JCT0gIDB4MTQsCisJW0JSQ01OQU5EX0NTX1hPUl0JCT0gIDB4MTgsCisJW0JSQ01O QU5EX0xMX09QXQkJPSAweDE3OCwKKwlbQlJDTU5BTkRfQ1MwX0JBU0VdCQk9ICAweDQwLAorCVtC UkNNTkFORF9DUzFfQkFTRV0JCT0gIDB4ZDAsCisJW0JSQ01OQU5EX0NPUlJfVEhSRVNIT0xEXQk9 ICAweDg0LAorCVtCUkNNTkFORF9DT1JSX1RIUkVTSE9MRF9FWFRdCT0gICAgIDAsCisJW0JSQ01O QU5EX1VOQ09SUl9DT1VOVF0JCT0gICAgIDAsCisJW0JSQ01OQU5EX0NPUlJfQ09VTlRdCQk9ICAg ICAwLAorCVtCUkNNTkFORF9DT1JSX0VYVF9BRERSXQk9ICAweDcwLAorCVtCUkNNTkFORF9DT1JS X0FERFJdCQk9ICAweDc0LAorCVtCUkNNTkFORF9VTkNPUlJfRVhUX0FERFJdCT0gIDB4NzgsCisJ W0JSQ01OQU5EX1VOQ09SUl9BRERSXQkJPSAgMHg3YywKKwlbQlJDTU5BTkRfU0VNQVBIT1JFXQkJ PSAgMHg1OCwKKwlbQlJDTU5BTkRfSURdCQkJPSAgMHg2MCwKKwlbQlJDTU5BTkRfSURfRVhUXQkJ PSAgMHg2NCwKKwlbQlJDTU5BTkRfTExfUkRBVEFdCQk9IDB4MTdjLAorCVtCUkNNTkFORF9PT0Jf UkVBRF9CQVNFXQk9ICAweDIwLAorCVtCUkNNTkFORF9PT0JfUkVBRF8xMF9CQVNFXQk9IDB4MTMw LAorCVtCUkNNTkFORF9PT0JfV1JJVEVfQkFTRV0JPSAgMHgzMCwKKwlbQlJDTU5BTkRfT09CX1dS SVRFXzEwX0JBU0VdCT0gMHgxNDAsCisJW0JSQ01OQU5EX0ZDX0JBU0VdCQk9IDB4MjAwLAorfTsK KworLyogQlJDTU5BTkQgdjYuMCAtIHY3LjEgKi8KK3N0YXRpYyBjb25zdCB1MTYgYnJjbW5hbmRf cmVnc192NjBbXSA9IHsKKwlbQlJDTU5BTkRfQ01EX1NUQVJUXQkJPSAgMHgwNCwKKwlbQlJDTU5B TkRfQ01EX0VYVF9BRERSRVNTXQk9ICAweDA4LAorCVtCUkNNTkFORF9DTURfQUREUkVTU10JCT0g IDB4MGMsCisJW0JSQ01OQU5EX0lOVEZDX1NUQVRVU10JCT0gIDB4MTQsCisJW0JSQ01OQU5EX0NT X1NFTEVDVF0JCT0gIDB4MTgsCisJW0JSQ01OQU5EX0NTX1hPUl0JCT0gIDB4MWMsCisJW0JSQ01O QU5EX0xMX09QXQkJPSAgMHgyMCwKKwlbQlJDTU5BTkRfQ1MwX0JBU0VdCQk9ICAweDUwLAorCVtC UkNNTkFORF9DUzFfQkFTRV0JCT0gICAgIDAsCisJW0JSQ01OQU5EX0NPUlJfVEhSRVNIT0xEXQk9 ICAweGMwLAorCVtCUkNNTkFORF9DT1JSX1RIUkVTSE9MRF9FWFRdCT0gIDB4YzQsCisJW0JSQ01O QU5EX1VOQ09SUl9DT1VOVF0JCT0gIDB4ZmMsCisJW0JSQ01OQU5EX0NPUlJfQ09VTlRdCQk9IDB4 MTAwLAorCVtCUkNNTkFORF9DT1JSX0VYVF9BRERSXQk9IDB4MTBjLAorCVtCUkNNTkFORF9DT1JS X0FERFJdCQk9IDB4MTEwLAorCVtCUkNNTkFORF9VTkNPUlJfRVhUX0FERFJdCT0gMHgxMTQsCisJ W0JSQ01OQU5EX1VOQ09SUl9BRERSXQkJPSAweDExOCwKKwlbQlJDTU5BTkRfU0VNQVBIT1JFXQkJ PSAweDE1MCwKKwlbQlJDTU5BTkRfSURdCQkJPSAweDE5NCwKKwlbQlJDTU5BTkRfSURfRVhUXQkJ PSAweDE5OCwKKwlbQlJDTU5BTkRfTExfUkRBVEFdCQk9IDB4MTljLAorCVtCUkNNTkFORF9PT0Jf UkVBRF9CQVNFXQk9IDB4MjAwLAorCVtCUkNNTkFORF9PT0JfUkVBRF8xMF9CQVNFXQk9ICAgICAw LAorCVtCUkNNTkFORF9PT0JfV1JJVEVfQkFTRV0JPSAweDI4MCwKKwlbQlJDTU5BTkRfT09CX1dS SVRFXzEwX0JBU0VdCT0gICAgIDAsCisJW0JSQ01OQU5EX0ZDX0JBU0VdCQk9IDB4NDAwLAorfTsK KworZW51bSBicmNtbmFuZF9jc19yZWcgeworCUJSQ01OQU5EX0NTX0NGR19FWFQgPSAwLAorCUJS Q01OQU5EX0NTX0NGRywKKwlCUkNNTkFORF9DU19BQ0NfQ09OVFJPTCwKKwlCUkNNTkFORF9DU19U SU1JTkcxLAorCUJSQ01OQU5EX0NTX1RJTUlORzIsCit9OworCisvKiBQZXIgY2hpcC1zZWxlY3Qg b2Zmc2V0cyBmb3IgdjcuMSAqLworc3RhdGljIGNvbnN0IHU4IGJyY21uYW5kX2NzX29mZnNldHNf djcxW10gPSB7CisJW0JSQ01OQU5EX0NTX0FDQ19DT05UUk9MXQk9IDB4MDAsCisJW0JSQ01OQU5E X0NTX0NGR19FWFRdCQk9IDB4MDQsCisJW0JSQ01OQU5EX0NTX0NGR10JCT0gMHgwOCwKKwlbQlJD TU5BTkRfQ1NfVElNSU5HMV0JCT0gMHgwYywKKwlbQlJDTU5BTkRfQ1NfVElNSU5HMl0JCT0gMHgx MCwKK307CisKKy8qIFBlciBjaGlwLXNlbGVjdCBvZmZzZXRzIGZvciBwcmUgdjcuMSwgZXhjZXB0 IENTMCBvbiA8PSB2NS4wICovCitzdGF0aWMgY29uc3QgdTggYnJjbW5hbmRfY3Nfb2Zmc2V0c1td ID0geworCVtCUkNNTkFORF9DU19BQ0NfQ09OVFJPTF0JPSAweDAwLAorCVtCUkNNTkFORF9DU19D RkdfRVhUXQkJPSAweDA0LAorCVtCUkNNTkFORF9DU19DRkddCQk9IDB4MDQsCisJW0JSQ01OQU5E X0NTX1RJTUlORzFdCQk9IDB4MDgsCisJW0JSQ01OQU5EX0NTX1RJTUlORzJdCQk9IDB4MGMsCit9 OworCisvKiBQZXIgY2hpcC1zZWxlY3Qgb2Zmc2V0IGZvciA8PSB2NS4wIG9uIENTMCBvbmx5ICov CitzdGF0aWMgY29uc3QgdTggYnJjbW5hbmRfY3Nfb2Zmc2V0c19jczBbXSA9IHsKKwlbQlJDTU5B TkRfQ1NfQUNDX0NPTlRST0xdCT0gMHgwMCwKKwlbQlJDTU5BTkRfQ1NfQ0ZHX0VYVF0JCT0gMHgw OCwKKwlbQlJDTU5BTkRfQ1NfQ0ZHXQkJPSAweDA4LAorCVtCUkNNTkFORF9DU19USU1JTkcxXQkJ PSAweDEwLAorCVtCUkNNTkFORF9DU19USU1JTkcyXQkJPSAweDE0LAorfTsKKworLyogQlJDTU5B TkRfSU5URkNfU1RBVFVTICovCitlbnVtIHsKKwlJTlRGQ19GTEFTSF9TVEFUVVMJCT0gR0VOTUFT Syg3LCAwKSwKKworCUlOVEZDX0VSQVNFRAkJCT0gQklUKDI3KSwKKwlJTlRGQ19PT0JfVkFMSUQJ CQk9IEJJVCgyOCksCisJSU5URkNfQ0FDSEVfVkFMSUQJCT0gQklUKDI5KSwKKwlJTlRGQ19GTEFT SF9SRUFEWQkJPSBCSVQoMzApLAorCUlOVEZDX0NUTFJfUkVBRFkJCT0gQklUKDMxKSwKK307CisK K3N0YXRpYyBpbmxpbmUgdTMyIG5hbmRfcmVhZHJlZyhzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxl ciAqY3RybCwgdTMyIG9mZnMpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGN0cmwtPm5hbmRfYmFz ZSArIG9mZnMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmFuZF93cml0ZXJlZyhzdHJ1Y3Qg YnJjbW5hbmRfY29udHJvbGxlciAqY3RybCwgdTMyIG9mZnMsCisJCQkJIHUzMiB2YWwpCit7CisJ X19yYXdfd3JpdGVsKHZhbCwgY3RybC0+bmFuZF9iYXNlICsgb2Zmcyk7Cit9CisKK3N0YXRpYyBp bnQgYnJjbW5hbmRfcmV2aXNpb25faW5pdChzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxlciAqY3Ry bCkKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGJsb2NrX3NpemVzX3Y2W10gPSB7IDgs IDE2LCAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCAwIH07CisJc3RhdGljIGNvbnN0IHVuc2ln bmVkIGludCBibG9ja19zaXplc192NFtdID0geyAxNiwgMTI4LCA4LCA1MTIsIDI1NiwgMTAyNCwg MjA0OCwgMCB9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGFnZV9zaXplc1tdID0geyA1 MTIsIDIwNDgsIDQwOTYsIDgxOTIsIDAgfTsKKworCWN0cmwtPm5hbmRfdmVyc2lvbiA9IG5hbmRf cmVhZHJlZyhjdHJsLCAwKSAmIDB4ZmZmZjsKKworCS8qIE9ubHkgc3VwcG9ydCB2NC4wKz8gKi8K KwlpZiAoY3RybC0+bmFuZF92ZXJzaW9uIDwgMHgwNDAwKSB7CisJCWRldl9lcnIoY3RybC0+ZGV2 LCAidmVyc2lvbiAlI3ggbm90IHN1cHBvcnRlZFxuIiwKKwkJCWN0cmwtPm5hbmRfdmVyc2lvbik7 CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFJlZ2lzdGVyIG9mZnNldHMgKi8KKwlpZiAo Y3RybC0+bmFuZF92ZXJzaW9uID49IDB4MDYwMCkKKwkJY3RybC0+cmVnX29mZnNldHMgPSBicmNt bmFuZF9yZWdzX3Y2MDsKKwllbHNlIGlmIChjdHJsLT5uYW5kX3ZlcnNpb24gPj0gMHgwNTAwKQor CQljdHJsLT5yZWdfb2Zmc2V0cyA9IGJyY21uYW5kX3JlZ3NfdjUwOworCWVsc2UgaWYgKGN0cmwt Pm5hbmRfdmVyc2lvbiA+PSAweDA0MDApCisJCWN0cmwtPnJlZ19vZmZzZXRzID0gYnJjbW5hbmRf cmVnc192NDA7CisKKwkvKiBDaGlwLXNlbGVjdCBzdHJpZGUgKi8KKwlpZiAoY3RybC0+bmFuZF92 ZXJzaW9uID49IDB4MDcwMSkKKwkJY3RybC0+cmVnX3NwYWNpbmcgPSAweDE0OworCWVsc2UKKwkJ Y3RybC0+cmVnX3NwYWNpbmcgPSAweDEwOworCisJLyogUGVyIGNoaXAtc2VsZWN0IHJlZ2lzdGVy cyAqLworCWlmIChjdHJsLT5uYW5kX3ZlcnNpb24gPj0gMHgwNzAxKSB7CisJCWN0cmwtPmNzX29m ZnNldHMgPSBicmNtbmFuZF9jc19vZmZzZXRzX3Y3MTsKKwl9IGVsc2UgeworCQljdHJsLT5jc19v ZmZzZXRzID0gYnJjbW5hbmRfY3Nfb2Zmc2V0czsKKworCQkvKiB2NS4wIGFuZCBlYXJsaWVyIGhh cyBhIGRpZmZlcmVudCBDUzAgb2Zmc2V0IGxheW91dCAqLworCQlpZiAoY3RybC0+bmFuZF92ZXJz aW9uIDw9IDB4MDUwMCkKKwkJCWN0cmwtPmNzMF9vZmZzZXRzID0gYnJjbW5hbmRfY3Nfb2Zmc2V0 c19jczA7CisJfQorCisJLyogUGFnZSAvIGJsb2NrIHNpemVzICovCisJaWYgKGN0cmwtPm5hbmRf dmVyc2lvbiA+PSAweDA3MDEpIHsKKwkJLyogPj0gdjcuMSB1c2UgbmljZSBwb3dlci1vZi0yIHZh bHVlcyEgKi8KKwkJY3RybC0+bWF4X3BhZ2Vfc2l6ZSA9IDE2ICogMTAyNDsKKwkJY3RybC0+bWF4 X2Jsb2NrX3NpemUgPSAyICogMTAyNCAqIDEwMjQ7CisJfSBlbHNlIHsKKwkJY3RybC0+cGFnZV9z aXplcyA9IHBhZ2Vfc2l6ZXM7CisJCWlmIChjdHJsLT5uYW5kX3ZlcnNpb24gPj0gMHgwNjAwKQor CQkJY3RybC0+YmxvY2tfc2l6ZXMgPSBibG9ja19zaXplc192NjsKKwkJZWxzZQorCQkJY3RybC0+ YmxvY2tfc2l6ZXMgPSBibG9ja19zaXplc192NDsKKworCQlpZiAoY3RybC0+bmFuZF92ZXJzaW9u IDwgMHgwNDAwKSB7CisJCQljdHJsLT5tYXhfcGFnZV9zaXplID0gNDA5NjsKKwkJCWN0cmwtPm1h eF9ibG9ja19zaXplID0gNTEyICogMTAyNDsKKwkJfQorCX0KKworCS8qIE1heGltdW0gc3BhcmUg YXJlYSBzZWN0b3Igc2l6ZSAocGVyIDUxMkIpICovCisJaWYgKGN0cmwtPm5hbmRfdmVyc2lvbiA+ PSAweDA2MDApCisJCWN0cmwtPm1heF9vb2IgPSA2NDsKKwllbHNlIGlmIChjdHJsLT5uYW5kX3Zl cnNpb24gPj0gMHgwNTAwKQorCQljdHJsLT5tYXhfb29iID0gMzI7CisJZWxzZQorCQljdHJsLT5t YXhfb29iID0gMTY7CisKKwkvKiB2Ni4wIGFuZCBuZXdlciAoZXhjZXB0IHY2LjEpIGhhdmUgcHJl ZmV0Y2ggc3VwcG9ydCAqLworCWlmIChjdHJsLT5uYW5kX3ZlcnNpb24gPj0gMHgwNjAwICYmIGN0 cmwtPm5hbmRfdmVyc2lvbiAhPSAweDA2MDEpCisJCWN0cmwtPmZlYXR1cmVzIHw9IEJSQ01OQU5E X0hBU19QUkVGRVRDSDsKKworCS8qCisJICogdjYueCBoYXMgY2FjaGUgbW9kZSwgYnV0IGl0J3Mg aW1wbGVtZW50ZWQgZGlmZmVyZW50bHkuIElnbm9yZSBpdCBmb3IKKwkgKiBub3cuCisJICovCisJ aWYgKGN0cmwtPm5hbmRfdmVyc2lvbiA+PSAweDA3MDApCisJCWN0cmwtPmZlYXR1cmVzIHw9IEJS Q01OQU5EX0hBU19DQUNIRV9NT0RFOworCisJaWYgKGN0cmwtPm5hbmRfdmVyc2lvbiA+PSAweDA1 MDApCisJCWN0cmwtPmZlYXR1cmVzIHw9IEJSQ01OQU5EX0hBU18xS19TRUNUT1JTOworCisJaWYg KGN0cmwtPm5hbmRfdmVyc2lvbiA+PSAweDA3MDApCisJCWN0cmwtPmZlYXR1cmVzIHw9IEJSQ01O QU5EX0hBU19XUDsKKwllbHNlIGlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woY3RybC0+ZGV2LT5v Zl9ub2RlLCAiYnJjbSxuYW5kLWhhcy13cCIpKQorCQljdHJsLT5mZWF0dXJlcyB8PSBCUkNNTkFO RF9IQVNfV1A7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1MzIgYnJjbW5hbmRf cmVhZF9yZWcoc3RydWN0IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0cmwsCisJCWVudW0gYnJjbW5h bmRfcmVnIHJlZykKK3sKKwl1MTYgb2ZmcyA9IGN0cmwtPnJlZ19vZmZzZXRzW3JlZ107CisKKwlp ZiAob2ZmcykKKwkJcmV0dXJuIG5hbmRfcmVhZHJlZyhjdHJsLCBvZmZzKTsKKwllbHNlCisJCXJl dHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYnJjbW5hbmRfd3JpdGVfcmVnKHN0cnVj dCBicmNtbmFuZF9jb250cm9sbGVyICpjdHJsLAorCQkJCSAgICAgIGVudW0gYnJjbW5hbmRfcmVn IHJlZywgdTMyIHZhbCkKK3sKKwl1MTYgb2ZmcyA9IGN0cmwtPnJlZ19vZmZzZXRzW3JlZ107CisK KwlpZiAob2ZmcykKKwkJbmFuZF93cml0ZXJlZyhjdHJsLCBvZmZzLCB2YWwpOworfQorCitzdGF0 aWMgaW5saW5lIHZvaWQgYnJjbW5hbmRfcm13X3JlZyhzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxl ciAqY3RybCwKKwkJCQkgICAgZW51bSBicmNtbmFuZF9yZWcgcmVnLCB1MzIgbWFzaywgdW5zaWdu ZWQKKwkJCQkgICAgaW50IHNoaWZ0LCB1MzIgdmFsKQoreworCXUzMiB0bXAgPSBicmNtbmFuZF9y ZWFkX3JlZyhjdHJsLCByZWcpOworCisJdG1wICY9IH5tYXNrOworCXRtcCB8PSB2YWwgPDwgc2hp ZnQ7CisJYnJjbW5hbmRfd3JpdGVfcmVnKGN0cmwsIHJlZywgdG1wKTsKK30KKworc3RhdGljIGlu bGluZSB1MzIgYnJjbW5hbmRfcmVhZF9mYyhzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxlciAqY3Ry bCwgaW50IHdvcmQpCit7CisJcmV0dXJuIF9fcmF3X3JlYWRsKGN0cmwtPm5hbmRfZmMgKyB3b3Jk ICogNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBicmNtbmFuZF93cml0ZV9mYyhzdHJ1Y3Qg YnJjbW5hbmRfY29udHJvbGxlciAqY3RybCwKKwkJCQkgICAgIGludCB3b3JkLCB1MzIgdmFsKQor eworCV9fcmF3X3dyaXRlbCh2YWwsIGN0cmwtPm5hbmRfZmMgKyB3b3JkICogNCk7Cit9CisKK3N0 YXRpYyBpbmxpbmUgdTE2IGJyY21uYW5kX2NzX29mZnNldChzdHJ1Y3QgYnJjbW5hbmRfY29udHJv bGxlciAqY3RybCwgaW50IGNzLAorCQkJCSAgICAgZW51bSBicmNtbmFuZF9jc19yZWcgcmVnKQor eworCXUxNiBvZmZzX2NzMCA9IGN0cmwtPnJlZ19vZmZzZXRzW0JSQ01OQU5EX0NTMF9CQVNFXTsK Kwl1MTYgb2Zmc19jczEgPSBjdHJsLT5yZWdfb2Zmc2V0c1tCUkNNTkFORF9DUzFfQkFTRV07CisJ dTggY3Nfb2ZmczsKKworCWlmIChjcyA9PSAwICYmIGN0cmwtPmNzMF9vZmZzZXRzKQorCQljc19v ZmZzID0gY3RybC0+Y3MwX29mZnNldHNbcmVnXTsKKwllbHNlCisJCWNzX29mZnMgPSBjdHJsLT5j c19vZmZzZXRzW3JlZ107CisKKwlpZiAoY3MgJiYgb2Zmc19jczEpCisJCXJldHVybiBvZmZzX2Nz MSArIChjcyAtIDEpICogY3RybC0+cmVnX3NwYWNpbmcgKyBjc19vZmZzOworCisJcmV0dXJuIG9m ZnNfY3MwICsgY3MgKiBjdHJsLT5yZWdfc3BhY2luZyArIGNzX29mZnM7Cit9CisKK3N0YXRpYyBp bmxpbmUgdTMyIGJyY21uYW5kX2NvdW50X2NvcnJlY3RlZChzdHJ1Y3QgYnJjbW5hbmRfY29udHJv bGxlciAqY3RybCkKK3sKKwlpZiAoY3RybC0+bmFuZF92ZXJzaW9uIDwgMHgwNjAwKQorCQlyZXR1 cm4gMTsKKwlyZXR1cm4gYnJjbW5hbmRfcmVhZF9yZWcoY3RybCwgQlJDTU5BTkRfQ09SUl9DT1VO VCk7Cit9CisKK3N0YXRpYyB2b2lkIGJyY21uYW5kX3dyX2NvcnJfdGhyZXNoKHN0cnVjdCBicmNt bmFuZF9ob3N0ICpob3N0LCB1OCB2YWwpCit7CisJc3RydWN0IGJyY21uYW5kX2NvbnRyb2xsZXIg KmN0cmwgPSBob3N0LT5jdHJsOworCXVuc2lnbmVkIGludCBzaGlmdCA9IDAsIGJpdHM7CisJZW51 bSBicmNtbmFuZF9yZWcgcmVnID0gQlJDTU5BTkRfQ09SUl9USFJFU0hPTEQ7CisJaW50IGNzID0g aG9zdC0+Y3M7CisKKwlpZiAoY3RybC0+bmFuZF92ZXJzaW9uID49IDB4MDYwMCkKKwkJYml0cyA9 IDY7CisJZWxzZSBpZiAoY3RybC0+bmFuZF92ZXJzaW9uID49IDB4MDUwMCkKKwkJYml0cyA9IDU7 CisJZWxzZQorCQliaXRzID0gNDsKKworCWlmIChjdHJsLT5uYW5kX3ZlcnNpb24gPj0gMHgwNjAw KSB7CisJCWlmIChjcyA+PSA1KQorCQkJcmVnID0gQlJDTU5BTkRfQ09SUl9USFJFU0hPTERfRVhU OworCQlzaGlmdCA9IChjcyAlIDUpICogYml0czsKKwl9CisJYnJjbW5hbmRfcm13X3JlZyhjdHJs LCByZWcsIChiaXRzIC0gMSkgPDwgc2hpZnQsIHNoaWZ0LCB2YWwpOworfQorCitzdGF0aWMgaW5s aW5lIGludCBicmNtbmFuZF9jbWRfc2hpZnQoc3RydWN0IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0 cmwpCit7CisJaWYgKGN0cmwtPm5hbmRfdmVyc2lvbiA8IDB4MDcwMCkKKwkJcmV0dXJuIDI0Owor CXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5BTkQgQUNDIENPTlRST0wgYml0 ZmllbGQKKyAqCisgKiBTb21lIGJpdHMgaGF2ZSByZW1haW5lZCBjb25zdGFudCB0aHJvdWdob3V0 IGhhcmR3YXJlIHJldmlzaW9uLCB3aGlsZQorICogb3RoZXJzIGhhdmUgc2hpZnRlZCBhcm91bmQu CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovCisKKy8qIENvbnN0YW50IGZvciBhbGwgdmVyc2lvbnMgKHdoZXJl IHN1cHBvcnRlZCkgKi8KK2VudW0geworCS8qIFNlZSBCUkNNTkFORF9IQVNfQ0FDSEVfTU9ERSAq LworCUFDQ19DT05UUk9MX0NBQ0hFX01PREUJCQkJPSBCSVQoMjIpLAorCisJLyogU2VlIEJSQ01O QU5EX0hBU19QUkVGRVRDSCAqLworCUFDQ19DT05UUk9MX1BSRUZFVENICQkJCT0gQklUKDIzKSwK KworCUFDQ19DT05UUk9MX1BBR0VfSElUCQkJCT0gQklUKDI0KSwKKwlBQ0NfQ09OVFJPTF9XUl9Q UkVFTVBUCQkJCT0gQklUKDI1KSwKKwlBQ0NfQ09OVFJPTF9QQVJUSUFMX1BBR0UJCQk9IEJJVCgy NiksCisJQUNDX0NPTlRST0xfUkRfRVJBU0VECQkJCT0gQklUKDI3KSwKKwlBQ0NfQ09OVFJPTF9G QVNUX1BHTV9SRElOCQkJPSBCSVQoMjgpLAorCUFDQ19DT05UUk9MX1dSX0VDQwkJCQk9IEJJVCgz MCksCisJQUNDX0NPTlRST0xfUkRfRUNDCQkJCT0gQklUKDMxKSwKK307CisKK3N0YXRpYyBpbmxp bmUgdTMyIGJyY21uYW5kX3NwYXJlX2FyZWFfbWFzayhzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxl ciAqY3RybCkKK3sKKwlpZiAoY3RybC0+bmFuZF92ZXJzaW9uID49IDB4MDYwMCkKKwkJcmV0dXJu IEdFTk1BU0soNiwgMCk7CisJZWxzZQorCQlyZXR1cm4gR0VOTUFTSyg1LCAwKTsKK30KKworI2Rl ZmluZSBOQU5EX0FDQ19DT05UUk9MX0VDQ19TSElGVAkxNgorCitzdGF0aWMgaW5saW5lIHUzMiBi cmNtbmFuZF9lY2NfbGV2ZWxfbWFzayhzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxlciAqY3RybCkK K3sKKwl1MzIgbWFzayA9IChjdHJsLT5uYW5kX3ZlcnNpb24gPj0gMHgwNjAwKSA/IDB4MWYgOiAw eDBmOworCisJcmV0dXJuIG1hc2sgPDwgTkFORF9BQ0NfQ09OVFJPTF9FQ0NfU0hJRlQ7Cit9CisK K3N0YXRpYyB2b2lkIGJyY21uYW5kX3NldF9lY2NfZW5hYmxlZChzdHJ1Y3QgYnJjbW5hbmRfaG9z dCAqaG9zdCwgaW50IGVuKQoreworCXN0cnVjdCBicmNtbmFuZF9jb250cm9sbGVyICpjdHJsID0g aG9zdC0+Y3RybDsKKwl1MTYgb2ZmcyA9IGJyY21uYW5kX2NzX29mZnNldChjdHJsLCBob3N0LT5j cywgQlJDTU5BTkRfQ1NfQUNDX0NPTlRST0wpOworCXUzMiBhY2NfY29udHJvbCA9IG5hbmRfcmVh ZHJlZyhjdHJsLCBvZmZzKTsKKwl1MzIgZWNjX2ZsYWdzID0gQUNDX0NPTlRST0xfV1JfRUNDIHwg QUNDX0NPTlRST0xfUkRfRUNDOworCisJaWYgKGVuKSB7CisJCWFjY19jb250cm9sIHw9IGVjY19m bGFnczsgLyogZW5hYmxlIFJEL1dSIEVDQyAqLworCQlhY2NfY29udHJvbCB8PSBob3N0LT5od2Nm Zy5lY2NfbGV2ZWwKKwkJCSAgICAgICA8PCBOQU5EX0FDQ19DT05UUk9MX0VDQ19TSElGVDsKKwl9 IGVsc2UgeworCQlhY2NfY29udHJvbCAmPSB+ZWNjX2ZsYWdzOyAvKiBkaXNhYmxlIFJEL1dSIEVD QyAqLworCQlhY2NfY29udHJvbCAmPSB+YnJjbW5hbmRfZWNjX2xldmVsX21hc2soY3RybCk7CisJ fQorCisJbmFuZF93cml0ZXJlZyhjdHJsLCBvZmZzLCBhY2NfY29udHJvbCk7Cit9CisKK3N0YXRp YyBpbmxpbmUgaW50IGJyY21uYW5kX3NlY3Rvcl8xa19zaGlmdChzdHJ1Y3QgYnJjbW5hbmRfY29u dHJvbGxlciAqY3RybCkKK3sKKwlpZiAoY3RybC0+bmFuZF92ZXJzaW9uID49IDB4MDYwMCkKKwkJ cmV0dXJuIDc7CisJZWxzZSBpZiAoY3RybC0+bmFuZF92ZXJzaW9uID49IDB4MDUwMCkKKwkJcmV0 dXJuIDY7CisJZWxzZQorCQlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgYnJjbW5hbmRfZ2V0 X3NlY3Rvcl9zaXplXzFrKHN0cnVjdCBicmNtbmFuZF9ob3N0ICpob3N0KQoreworCXN0cnVjdCBi cmNtbmFuZF9jb250cm9sbGVyICpjdHJsID0gaG9zdC0+Y3RybDsKKwlpbnQgc2hpZnQgPSBicmNt bmFuZF9zZWN0b3JfMWtfc2hpZnQoY3RybCk7CisJdTE2IGFjY19jb250cm9sX29mZnMgPSBicmNt bmFuZF9jc19vZmZzZXQoY3RybCwgaG9zdC0+Y3MsCisJCQkJCQkgIEJSQ01OQU5EX0NTX0FDQ19D T05UUk9MKTsKKworCWlmIChzaGlmdCA8IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIChuYW5k X3JlYWRyZWcoY3RybCwgYWNjX2NvbnRyb2xfb2ZmcykgPj4gc2hpZnQpICYgMHgxOworfQorCitz dGF0aWMgdm9pZCBicmNtbmFuZF9zZXRfc2VjdG9yX3NpemVfMWsoc3RydWN0IGJyY21uYW5kX2hv c3QgKmhvc3QsIGludCB2YWwpCit7CisJc3RydWN0IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0cmwg PSBob3N0LT5jdHJsOworCWludCBzaGlmdCA9IGJyY21uYW5kX3NlY3Rvcl8xa19zaGlmdChjdHJs KTsKKwl1MTYgYWNjX2NvbnRyb2xfb2ZmcyA9IGJyY21uYW5kX2NzX29mZnNldChjdHJsLCBob3N0 LT5jcywKKwkJCQkJCSAgQlJDTU5BTkRfQ1NfQUNDX0NPTlRST0wpOworCXUzMiB0bXA7CisKKwlp ZiAoc2hpZnQgPCAwKQorCQlyZXR1cm47CisKKwl0bXAgPSBuYW5kX3JlYWRyZWcoY3RybCwgYWNj X2NvbnRyb2xfb2Zmcyk7CisJdG1wICY9IH4oMSA8PCBzaGlmdCk7CisJdG1wIHw9ICghIXZhbCkg PDwgc2hpZnQ7CisJbmFuZF93cml0ZXJlZyhjdHJsLCBhY2NfY29udHJvbF9vZmZzLCB0bXApOwor fQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioKKyAqIENTX05BTkRfU0VMRUNUCisgKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiov CisKK2VudW0geworCUNTX1NFTEVDVF9OQU5EX1dQCQkJPSBCSVQoMjkpLAorCUNTX1NFTEVDVF9B VVRPX0RFVklDRV9JRF9DRkcJCT0gQklUKDMwKSwKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBi cmNtbmFuZF9zZXRfd3Aoc3RydWN0IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0cmwsIGJvb2wgZW4p Cit7CisJdTMyIHZhbCA9IGVuID8gQ1NfU0VMRUNUX05BTkRfV1AgOiAwOworCisJYnJjbW5hbmRf cm13X3JlZyhjdHJsLCBCUkNNTkFORF9DU19TRUxFQ1QsIENTX1NFTEVDVF9OQU5EX1dQLCAwLCB2 YWwpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZsYXNoIERNQQorICoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq LworCitlbnVtIGZsYXNoX2RtYV9yZWcgeworCUZMQVNIX0RNQV9SRVZJU0lPTgkJPSAweDAwLAor CUZMQVNIX0RNQV9GSVJTVF9ERVNDCQk9IDB4MDQsCisJRkxBU0hfRE1BX0ZJUlNUX0RFU0NfRVhU CT0gMHgwOCwKKwlGTEFTSF9ETUFfQ1RSTAkJCT0gMHgwYywKKwlGTEFTSF9ETUFfTU9ERQkJCT0g MHgxMCwKKwlGTEFTSF9ETUFfU1RBVFVTCQk9IDB4MTQsCisJRkxBU0hfRE1BX0lOVEVSUlVQVF9E RVNDCT0gMHgxOCwKKwlGTEFTSF9ETUFfSU5URVJSVVBUX0RFU0NfRVhUCT0gMHgxYywKKwlGTEFT SF9ETUFfRVJST1JfU1RBVFVTCQk9IDB4MjAsCisJRkxBU0hfRE1BX0NVUlJFTlRfREVTQwkJPSAw eDI0LAorCUZMQVNIX0RNQV9DVVJSRU5UX0RFU0NfRVhUCT0gMHgyOCwKK307CisKK3N0YXRpYyBp bmxpbmUgYm9vbCBoYXNfZmxhc2hfZG1hKHN0cnVjdCBicmNtbmFuZF9jb250cm9sbGVyICpjdHJs KQoreworCXJldHVybiBjdHJsLT5mbGFzaF9kbWFfYmFzZTsKK30KKworc3RhdGljIGlubGluZSBi b29sIGZsYXNoX2RtYV9idWZfb2soY29uc3Qgdm9pZCAqYnVmKQoreworCXJldHVybiBidWYgJiYg IWlzX3ZtYWxsb2NfYWRkcihidWYpICYmCisJCWxpa2VseShJU19BTElHTkVEKCh1aW50cHRyX3Qp YnVmLCA0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbGFzaF9kbWFfd3JpdGVsKHN0cnVj dCBicmNtbmFuZF9jb250cm9sbGVyICpjdHJsLCB1OCBvZmZzLAorCQkJCSAgICB1MzIgdmFsKQor eworCV9fcmF3X3dyaXRlbCh2YWwsIGN0cmwtPmZsYXNoX2RtYV9iYXNlICsgb2Zmcyk7Cit9CisK K3N0YXRpYyBpbmxpbmUgdTMyIGZsYXNoX2RtYV9yZWFkbChzdHJ1Y3QgYnJjbW5hbmRfY29udHJv bGxlciAqY3RybCwgdTggb2ZmcykKK3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoY3RybC0+Zmxhc2hf ZG1hX2Jhc2UgKyBvZmZzKTsKK30KKworLyogTG93LWxldmVsIG9wZXJhdGlvbiB0eXBlczogY29t bWFuZCwgYWRkcmVzcywgd3JpdGUsIG9yIHJlYWQgKi8KK2VudW0gYnJjbW5hbmRfbGxvcF90eXBl IHsKKwlMTF9PUF9DTUQsCisJTExfT1BfQUREUiwKKwlMTF9PUF9XUiwKKwlMTF9PUF9SRCwKK307 CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKgorICogSW50ZXJuYWwgc3VwcG9ydCBmdW5jdGlvbnMKKyAqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8KKworc3RhdGljIGlubGluZSBib29sIGlzX2hhbW1pbmdfZWNjKHN0cnVjdCBi cmNtbmFuZF9jZmcgKmNmZykKK3sKKwlyZXR1cm4gY2ZnLT5zZWN0b3Jfc2l6ZV8xayA9PSAwICYm IGNmZy0+c3BhcmVfYXJlYV9zaXplID09IDE2ICYmCisJCWNmZy0+ZWNjX2xldmVsID09IDE1Owor fQorCisvKgorICogUmV0dXJucyBhIG5hbmRfZWNjbGF5b3V0IHN0cnVjdXRyZSBmb3IgdGhlIGdp dmVuIGxheW91dC9jb25maWd1cmF0aW9uLgorICogUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCisg Ki8KK3N0YXRpYyBzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQgKmJyY21uYW5kX2NyZWF0ZV9sYXlvdXQo aW50IGVjY19sZXZlbCwKKwkJCQkJCSAgICAgc3RydWN0IGJyY21uYW5kX2hvc3QgKmhvc3QpCit7 CisJc3RydWN0IGJyY21uYW5kX2NmZyAqY2ZnID0gJmhvc3QtPmh3Y2ZnOworCWludCBpLCBqOwor CXN0cnVjdCBuYW5kX2VjY2xheW91dCAqbGF5b3V0OworCWludCByZXE7CisJaW50IHNlY3RvcnM7 CisJaW50IHNhczsKKwlpbnQgaWR4MSwgaWR4MjsKKworCWxheW91dCA9IGRldm1fa3phbGxvYygm aG9zdC0+cGRldi0+ZGV2LCBzaXplb2YoKmxheW91dCksIEdGUF9LRVJORUwpOworCWlmICghbGF5 b3V0KQorCQlyZXR1cm4gTlVMTDsKKworCXNlY3RvcnMgPSBjZmctPnBhZ2Vfc2l6ZSAvICg1MTIg PDwgY2ZnLT5zZWN0b3Jfc2l6ZV8xayk7CisJc2FzID0gY2ZnLT5zcGFyZV9hcmVhX3NpemUgPDwg Y2ZnLT5zZWN0b3Jfc2l6ZV8xazsKKworCS8qIEhhbW1pbmcgKi8KKwlpZiAoaXNfaGFtbWluZ19l Y2MoY2ZnKSkgeworCQlmb3IgKGkgPSAwLCBpZHgxID0gMCwgaWR4MiA9IDA7IGkgPCBzZWN0b3Jz OyBpKyspIHsKKwkJCS8qIEZpcnN0IHNlY3RvciBvZiBlYWNoIHBhZ2UgbWF5IGhhdmUgQkJJICov CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJbGF5b3V0LT5vb2JmcmVlW2lkeDJdLm9mZnNldCA9IGkg KiBzYXMgKyAxOworCQkJCS8qIFNtYWxsLXBhZ2UgTkFORCB1c2UgYnl0ZSA2IGZvciBCQkkgKi8K KwkJCQlpZiAoY2ZnLT5wYWdlX3NpemUgPT0gNTEyKQorCQkJCQlsYXlvdXQtPm9vYmZyZWVbaWR4 Ml0ub2Zmc2V0LS07CisJCQkJbGF5b3V0LT5vb2JmcmVlW2lkeDJdLmxlbmd0aCA9IDU7CisJCQl9 IGVsc2UgeworCQkJCWxheW91dC0+b29iZnJlZVtpZHgyXS5vZmZzZXQgPSBpICogc2FzOworCQkJ CWxheW91dC0+b29iZnJlZVtpZHgyXS5sZW5ndGggPSA2OworCQkJfQorCQkJaWR4MisrOworCQkJ bGF5b3V0LT5lY2Nwb3NbaWR4MSsrXSA9IGkgKiBzYXMgKyA2OworCQkJbGF5b3V0LT5lY2Nwb3Nb aWR4MSsrXSA9IGkgKiBzYXMgKyA3OworCQkJbGF5b3V0LT5lY2Nwb3NbaWR4MSsrXSA9IGkgKiBz YXMgKyA4OworCQkJbGF5b3V0LT5vb2JmcmVlW2lkeDJdLm9mZnNldCA9IGkgKiBzYXMgKyA5Owor CQkJbGF5b3V0LT5vb2JmcmVlW2lkeDJdLmxlbmd0aCA9IDc7CisJCQlpZHgyKys7CisJCQkvKiBM ZWF2ZSB6ZXJvLXRlcm1pbmF0ZWQgZW50cnkgZm9yIE9PQkZSRUUgKi8KKwkJCWlmIChpZHgxID49 IE1URF9NQVhfRUNDUE9TX0VOVFJJRVNfTEFSR0UgfHwKKwkJCQkgICAgaWR4MiA+PSBNVERfTUFY X09PQkZSRUVfRU5UUklFU19MQVJHRSAtIDEpCisJCQkJYnJlYWs7CisJCX0KKwkJZ290byBvdXQ7 CisJfQorCisJLyoKKwkgKiBDT05UUk9MTEVSX1ZFUlNJT046CisJICogICA8IHY1LjA6IEVDQ19S RVEgPSBjZWlsKEJDSF9UICogMTMvOCkKKwkgKiAgPj0gdjUuMDogRUNDX1JFUSA9IGNlaWwoQkNI X1QgKiAxNC84KQorCSAqIEJ1dCB3ZSB3aWxsIGp1c3QgYmUgY29uc2VydmF0aXZlLgorCSAqLwor CXJlcSA9IERJVl9ST1VORF9VUChlY2NfbGV2ZWwgKiAxNCwgOCk7CisJaWYgKHJlcSA+PSBzYXMp IHsKKwkJZGV2X2VycigmaG9zdC0+cGRldi0+ZGV2LAorCQkJImVycm9yOiBFQ0MgdG9vIGxhcmdl IGZvciBPT0IgKEVDQyBieXRlcyAlZCwgc3BhcmUgc2VjdG9yICVkKVxuIiwKKwkJCXJlcSwgc2Fz KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGF5b3V0LT5lY2NieXRlcyA9IHJlcSAqIHNlY3Rv cnM7CisJZm9yIChpID0gMCwgaWR4MSA9IDAsIGlkeDIgPSAwOyBpIDwgc2VjdG9yczsgaSsrKSB7 CisJCWZvciAoaiA9IHNhcyAtIHJlcTsgaiA8IHNhcyAmJiBpZHgxIDwKKwkJCQlNVERfTUFYX0VD Q1BPU19FTlRSSUVTX0xBUkdFOyBqKyssIGlkeDErKykKKwkJCWxheW91dC0+ZWNjcG9zW2lkeDFd ID0gaSAqIHNhcyArIGo7CisKKwkJLyogRmlyc3Qgc2VjdG9yIG9mIGVhY2ggcGFnZSBtYXkgaGF2 ZSBCQkkgKi8KKwkJaWYgKGkgPT0gMCkgeworCQkJaWYgKGNmZy0+cGFnZV9zaXplID09IDUxMiAm JiAoc2FzIC0gcmVxID49IDYpKSB7CisJCQkJLyogU21hbGwtcGFnZSBOQU5EIHVzZSBieXRlIDYg Zm9yIEJCSSAqLworCQkJCWxheW91dC0+b29iZnJlZVtpZHgyXS5vZmZzZXQgPSAwOworCQkJCWxh eW91dC0+b29iZnJlZVtpZHgyXS5sZW5ndGggPSA1OworCQkJCWlkeDIrKzsKKwkJCQlpZiAoc2Fz IC0gcmVxID4gNikgeworCQkJCQlsYXlvdXQtPm9vYmZyZWVbaWR4Ml0ub2Zmc2V0ID0gNjsKKwkJ CQkJbGF5b3V0LT5vb2JmcmVlW2lkeDJdLmxlbmd0aCA9CisJCQkJCQlzYXMgLSByZXEgLSA2Owor CQkJCQlpZHgyKys7CisJCQkJfQorCQkJfSBlbHNlIGlmIChzYXMgPiByZXEgKyAxKSB7CisJCQkJ bGF5b3V0LT5vb2JmcmVlW2lkeDJdLm9mZnNldCA9IGkgKiBzYXMgKyAxOworCQkJCWxheW91dC0+ b29iZnJlZVtpZHgyXS5sZW5ndGggPSBzYXMgLSByZXEgLSAxOworCQkJCWlkeDIrKzsKKwkJCX0K KwkJfSBlbHNlIGlmIChzYXMgPiByZXEpIHsKKwkJCWxheW91dC0+b29iZnJlZVtpZHgyXS5vZmZz ZXQgPSBpICogc2FzOworCQkJbGF5b3V0LT5vb2JmcmVlW2lkeDJdLmxlbmd0aCA9IHNhcyAtIHJl cTsKKwkJCWlkeDIrKzsKKwkJfQorCQkvKiBMZWF2ZSB6ZXJvLXRlcm1pbmF0ZWQgZW50cnkgZm9y IE9PQkZSRUUgKi8KKwkJaWYgKGlkeDEgPj0gTVREX01BWF9FQ0NQT1NfRU5UUklFU19MQVJHRSB8 fAorCQkJCWlkeDIgPj0gTVREX01BWF9PT0JGUkVFX0VOVFJJRVNfTEFSR0UgLSAxKQorCQkJYnJl YWs7CisJfQorb3V0OgorCS8qIFN1bSBhdmFpbGFibGUgT09CICovCisJZm9yIChpID0gMDsgaSA8 IE1URF9NQVhfT09CRlJFRV9FTlRSSUVTX0xBUkdFOyBpKyspCisJCWxheW91dC0+b29iYXZhaWwg Kz0gbGF5b3V0LT5vb2JmcmVlW2ldLmxlbmd0aDsKKwlyZXR1cm4gbGF5b3V0OworfQorCitzdGF0 aWMgc3RydWN0IG5hbmRfZWNjbGF5b3V0ICpicmNtc3RiX2Nob29zZV9lY2NfbGF5b3V0KAorCQlz dHJ1Y3QgYnJjbW5hbmRfaG9zdCAqaG9zdCkKK3sKKwlzdHJ1Y3QgbmFuZF9lY2NsYXlvdXQgKmxh eW91dDsKKwlzdHJ1Y3QgYnJjbW5hbmRfY2ZnICpwID0gJmhvc3QtPmh3Y2ZnOworCXVuc2lnbmVk IGludCBlY2NfbGV2ZWwgPSBwLT5lY2NfbGV2ZWw7CisKKwlpZiAocC0+c2VjdG9yX3NpemVfMWsp CisJCWVjY19sZXZlbCA8PD0gMTsKKworCWxheW91dCA9IGJyY21uYW5kX2NyZWF0ZV9sYXlvdXQo ZWNjX2xldmVsLCBob3N0KTsKKwlpZiAoIWxheW91dCkgeworCQlkZXZfZXJyKCZob3N0LT5wZGV2 LT5kZXYsCisJCQkJIm5vIHByb3BlciBlY2NfbGF5b3V0IGZvciB0aGlzIE5BTkQgY2ZnXG4iKTsK KwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGxheW91dDsKK30KKworc3RhdGljIHZvaWQg YnJjbW5hbmRfd3Aoc3RydWN0IG10ZF9pbmZvICptdGQsIGludCB3cCkKK3sKKwlzdHJ1Y3QgbmFu ZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBicmNtbmFuZF9ob3N0ICpob3N0ID0g Y2hpcC0+cHJpdjsKKwlzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxlciAqY3RybCA9IGhvc3QtPmN0 cmw7CisKKwlpZiAoKGN0cmwtPmZlYXR1cmVzICYgQlJDTU5BTkRfSEFTX1dQKSAmJiB3cF9vbiA9 PSAxKSB7CisJCXN0YXRpYyBpbnQgb2xkX3dwID0gLTE7CisKKwkJaWYgKG9sZF93cCAhPSB3cCkg eworCQkJZGV2X2RiZyhjdHJsLT5kZXYsICJXUCAlc1xuIiwgd3AgPyAib24iIDogIm9mZiIpOwor CQkJb2xkX3dwID0gd3A7CisJCX0KKwkJYnJjbW5hbmRfc2V0X3dwKGN0cmwsIHdwKTsKKwl9Cit9 CisKKy8qIEhlbHBlciBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgT09CIHJlZ2lz dGVycyAqLworc3RhdGljIGlubGluZSB1OCBvb2JfcmVnX3JlYWQoc3RydWN0IGJyY21uYW5kX2Nv bnRyb2xsZXIgKmN0cmwsIHUzMiBvZmZzKQoreworCXUxNiBvZmZzZXQwLCBvZmZzZXQxMCwgcmVn X29mZnM7CisKKwlvZmZzZXQwID0gY3RybC0+cmVnX29mZnNldHNbQlJDTU5BTkRfT09CX1JFQURf QkFTRV07CisJb2Zmc2V0MTAgPSBjdHJsLT5yZWdfb2Zmc2V0c1tCUkNNTkFORF9PT0JfUkVBRF8x MF9CQVNFXTsKKworCWlmIChvZmZzID49IGN0cmwtPm1heF9vb2IpCisJCXJldHVybiAweDc3Owor CisJaWYgKG9mZnMgPj0gMTYgJiYgb2Zmc2V0MTApCisJCXJlZ19vZmZzID0gb2Zmc2V0MTAgKyAo KG9mZnMgLSAweDEwKSAmIH4weDAzKTsKKwllbHNlCisJCXJlZ19vZmZzID0gb2Zmc2V0MCArIChv ZmZzICYgfjB4MDMpOworCisJcmV0dXJuIG5hbmRfcmVhZHJlZyhjdHJsLCByZWdfb2ZmcykgPj4g KDI0IC0gKChvZmZzICYgMHgwMykgPDwgMykpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgb29i X3JlZ193cml0ZShzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxlciAqY3RybCwgdTMyIG9mZnMsCisJ CQkJIHUzMiBkYXRhKQoreworCXUxNiBvZmZzZXQwLCBvZmZzZXQxMCwgcmVnX29mZnM7CisKKwlv ZmZzZXQwID0gY3RybC0+cmVnX29mZnNldHNbQlJDTU5BTkRfT09CX1dSSVRFX0JBU0VdOworCW9m ZnNldDEwID0gY3RybC0+cmVnX29mZnNldHNbQlJDTU5BTkRfT09CX1dSSVRFXzEwX0JBU0VdOwor CisJaWYgKG9mZnMgPj0gY3RybC0+bWF4X29vYikKKwkJcmV0dXJuOworCisJaWYgKG9mZnMgPj0g MTYgJiYgb2Zmc2V0MTApCisJCXJlZ19vZmZzID0gb2Zmc2V0MTAgKyAoKG9mZnMgLSAweDEwKSAm IH4weDAzKTsKKwllbHNlCisJCXJlZ19vZmZzID0gb2Zmc2V0MCArIChvZmZzICYgfjB4MDMpOwor CisJbmFuZF93cml0ZXJlZyhjdHJsLCByZWdfb2ZmcywgZGF0YSk7Cit9CisKKy8qCisgKiByZWFk X29vYl9mcm9tX3JlZ3MgLSByZWFkIGRhdGEgZnJvbSBPT0IgcmVnaXN0ZXJzCisgKiBAY3RybDog TkFORCBjb250cm9sbGVyCisgKiBAaTogc3ViLXBhZ2Ugc2VjdG9yIGluZGV4CisgKiBAb29iOiBi dWZmZXIgdG8gcmVhZCB0bworICogQHNhczogc3BhcmUgYXJlYSBzZWN0b3Igc2l6ZSAoaS5lLiwg T09CIHNpemUgcGVyIEZMQVNIX0NBQ0hFKQorICogQHNlY3Rvcl8xazogMSBmb3IgMUtpQiBzZWN0 b3JzLCAwIGZvciA1MTJCLCBvdGhlciB2YWx1ZXMgYXJlIGlsbGVnYWwKKyAqLworc3RhdGljIGlu dCByZWFkX29vYl9mcm9tX3JlZ3Moc3RydWN0IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0cmwsIGlu dCBpLCB1OCAqb29iLAorCQkJICAgICAgaW50IHNhcywgaW50IHNlY3Rvcl8xaykKK3sKKwlpbnQg dGJ5dGVzID0gc2FzIDw8IHNlY3Rvcl8xazsKKwlpbnQgajsKKworCS8qIEFkanVzdCBPT0IgdmFs dWVzIGZvciAxSyBzZWN0b3Igc2l6ZSAqLworCWlmIChzZWN0b3JfMWsgJiYgKGkgJiAweDAxKSkK KwkJdGJ5dGVzID0gbWF4KDAsIHRieXRlcyAtIChpbnQpY3RybC0+bWF4X29vYik7CisJdGJ5dGVz ID0gbWluX3QoaW50LCB0Ynl0ZXMsIGN0cmwtPm1heF9vb2IpOworCisJZm9yIChqID0gMDsgaiA8 IHRieXRlczsgaisrKQorCQlvb2Jbal0gPSBvb2JfcmVnX3JlYWQoY3RybCwgaik7CisJcmV0dXJu IHRieXRlczsKK30KKworLyoKKyAqIHdyaXRlX29vYl90b19yZWdzIC0gd3JpdGUgZGF0YSB0byBP T0IgcmVnaXN0ZXJzCisgKiBAaTogc3ViLXBhZ2Ugc2VjdG9yIGluZGV4CisgKiBAb29iOiBidWZm ZXIgdG8gd3JpdGUgZnJvbQorICogQHNhczogc3BhcmUgYXJlYSBzZWN0b3Igc2l6ZSAoaS5lLiwg T09CIHNpemUgcGVyIEZMQVNIX0NBQ0hFKQorICogQHNlY3Rvcl8xazogMSBmb3IgMUtpQiBzZWN0 b3JzLCAwIGZvciA1MTJCLCBvdGhlciB2YWx1ZXMgYXJlIGlsbGVnYWwKKyAqLworc3RhdGljIGlu dCB3cml0ZV9vb2JfdG9fcmVncyhzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxlciAqY3RybCwgaW50 IGksCisJCQkgICAgIGNvbnN0IHU4ICpvb2IsIGludCBzYXMsIGludCBzZWN0b3JfMWspCit7CisJ aW50IHRieXRlcyA9IHNhcyA8PCBzZWN0b3JfMWs7CisJaW50IGo7CisKKwkvKiBBZGp1c3QgT09C IHZhbHVlcyBmb3IgMUsgc2VjdG9yIHNpemUgKi8KKwlpZiAoc2VjdG9yXzFrICYmIChpICYgMHgw MSkpCisJCXRieXRlcyA9IG1heCgwLCB0Ynl0ZXMgLSAoaW50KWN0cmwtPm1heF9vb2IpOworCXRi eXRlcyA9IG1pbl90KGludCwgdGJ5dGVzLCBjdHJsLT5tYXhfb29iKTsKKworCWZvciAoaiA9IDA7 IGogPCB0Ynl0ZXM7IGogKz0gNCkKKwkJb29iX3JlZ193cml0ZShjdHJsLCBqLAorCQkJCShvb2Jb aiArIDBdIDw8IDI0KSB8CisJCQkJKG9vYltqICsgMV0gPDwgMTYpIHwKKwkJCQkob29iW2ogKyAy XSA8PCAgOCkgfAorCQkJCShvb2JbaiArIDNdIDw8ICAwKSk7CisJcmV0dXJuIHRieXRlczsKK30K Kworc3RhdGljIGlycXJldHVybl90IGJyY21uYW5kX2N0bHJkeV9pcnEoaW50IGlycSwgdm9pZCAq ZGF0YSkKK3sKKwlzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxlciAqY3RybCA9IGRhdGE7CisKKwkv KiBEaXNjYXJkIGFsbCBOQU5EX0NUTFJEWSBpbnRlcnJ1cHRzIGR1cmluZyBETUEgKi8KKwlpZiAo Y3RybC0+ZG1hX3BlbmRpbmcpCisJCXJldHVybiBJUlFfSEFORExFRDsKKworCWNvbXBsZXRlKCZj dHJsLT5kb25lKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5f dCBicmNtbmFuZF9kbWFfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJyY21u YW5kX2NvbnRyb2xsZXIgKmN0cmwgPSBkYXRhOworCisJY29tcGxldGUoJmN0cmwtPmRtYV9kb25l KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgYnJjbW5hbmRfc2Vu ZF9jbWQoc3RydWN0IGJyY21uYW5kX2hvc3QgKmhvc3QsIGludCBjbWQpCit7CisJc3RydWN0IGJy Y21uYW5kX2NvbnRyb2xsZXIgKmN0cmwgPSBob3N0LT5jdHJsOworCXUzMiBpbnRmYzsKKworCWRl dl9kYmcoY3RybC0+ZGV2LCAic2VuZCBuYXRpdmUgY21kICVkIGFkZHJfbG8gMHgleFxuIiwgY21k LAorCQlicmNtbmFuZF9yZWFkX3JlZyhjdHJsLCBCUkNNTkFORF9DTURfQUREUkVTUykpOworCUJV R19PTihjdHJsLT5jbWRfcGVuZGluZyAhPSAwKTsKKwljdHJsLT5jbWRfcGVuZGluZyA9IGNtZDsK KworCWludGZjID0gYnJjbW5hbmRfcmVhZF9yZWcoY3RybCwgQlJDTU5BTkRfSU5URkNfU1RBVFVT KTsKKwlCVUdfT04oIShpbnRmYyAmIElOVEZDX0NUTFJfUkVBRFkpKTsKKworCW1iKCk7IC8qIGZs dXNoIHByZXZpb3VzIHdyaXRlcyAqLworCWJyY21uYW5kX3dyaXRlX3JlZyhjdHJsLCBCUkNNTkFO RF9DTURfU1RBUlQsCisJCQkgICBjbWQgPDwgYnJjbW5hbmRfY21kX3NoaWZ0KGN0cmwpKTsKK30K KworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqCisgKiBOQU5EIE1URCBBUEk6IHJlYWQvcHJvZ3JhbS9lcmFzZQor ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBicmNtbmFuZF9jbWRfY3RybChzdHJ1Y3Qg bXRkX2luZm8gKm10ZCwgaW50IGRhdCwKKwl1bnNpZ25lZCBpbnQgY3RybCkKK3sKKwkvKiBpbnRl bnRpb25hbGx5IGxlZnQgYmxhbmsgKi8KK30KKworc3RhdGljIGludCBicmNtbmFuZF93YWl0ZnVu YyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hpcCAqdGhpcykKK3sKKwlzdHJ1 Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2OworCXN0cnVjdCBicmNtbmFuZF9ob3N0ICpo b3N0ID0gY2hpcC0+cHJpdjsKKwlzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxlciAqY3RybCA9IGhv c3QtPmN0cmw7CisJdW5zaWduZWQgbG9uZyB0aW1lbyA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsK KworCWRldl9kYmcoY3RybC0+ZGV2LCAid2FpdCBvbiBuYXRpdmUgY21kICVkXG4iLCBjdHJsLT5j bWRfcGVuZGluZyk7CisJaWYgKGN0cmwtPmNtZF9wZW5kaW5nICYmCisJCQl3YWl0X2Zvcl9jb21w bGV0aW9uX3RpbWVvdXQoJmN0cmwtPmRvbmUsIHRpbWVvKSA8PSAwKSB7CisJCXUzMiBjbWQgPSBi cmNtbmFuZF9yZWFkX3JlZyhjdHJsLCBCUkNNTkFORF9DTURfU1RBUlQpCisJCQkJCT4+IGJyY21u YW5kX2NtZF9zaGlmdChjdHJsKTsKKworCQlkZXZfZXJyX3JhdGVsaW1pdGVkKGN0cmwtPmRldiwK KwkJCSJ0aW1lb3V0IHdhaXRpbmcgZm9yIGNvbW1hbmQgJSMwMnhcbiIsIGNtZCk7CisJCWRldl9l cnJfcmF0ZWxpbWl0ZWQoY3RybC0+ZGV2LCAiaW50ZmMgc3RhdHVzICUwOHhcbiIsCisJCQlicmNt bmFuZF9yZWFkX3JlZyhjdHJsLCBCUkNNTkFORF9JTlRGQ19TVEFUVVMpKTsKKwl9CisJY3RybC0+ Y21kX3BlbmRpbmcgPSAwOworCXJldHVybiBicmNtbmFuZF9yZWFkX3JlZyhjdHJsLCBCUkNNTkFO RF9JTlRGQ19TVEFUVVMpICYKKwkJCQkgSU5URkNfRkxBU0hfU1RBVFVTOworfQorCitlbnVtIHsK KwlMTE9QX1JFCQkJCT0gQklUKDE2KSwKKwlMTE9QX1dFCQkJCT0gQklUKDE3KSwKKwlMTE9QX0FM RQkJCT0gQklUKDE4KSwKKwlMTE9QX0NMRQkJCT0gQklUKDE5KSwKKwlMTE9QX1JFVFVSTl9JRExF CQk9IEJJVCgzMSksCisKKwlMTE9QX0RBVEFfTUFTSwkJCT0gR0VOTUFTSygxNSwgMCksCit9Owor CitzdGF0aWMgaW50IGJyY21uYW5kX2xvd19sZXZlbF9vcChzdHJ1Y3QgYnJjbW5hbmRfaG9zdCAq aG9zdCwKKwkJCQkgZW51bSBicmNtbmFuZF9sbG9wX3R5cGUgdHlwZSwgdTMyIGRhdGEsCisJCQkJ IGJvb2wgbGFzdF9vcCkKK3sKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9ICZob3N0LT5tdGQ7CisJ c3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9ICZob3N0LT5jaGlwOworCXN0cnVjdCBicmNtbmFuZF9j b250cm9sbGVyICpjdHJsID0gaG9zdC0+Y3RybDsKKwl1MzIgdG1wOworCisJdG1wID0gZGF0YSAm IExMT1BfREFUQV9NQVNLOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgTExfT1BfQ01EOgorCQl0 bXAgfD0gTExPUF9XRSB8IExMT1BfQ0xFOworCQlicmVhazsKKwljYXNlIExMX09QX0FERFI6CisJ CS8qIFdFIHwgQUxFICovCisJCXRtcCB8PSBMTE9QX1dFIHwgTExPUF9BTEU7CisJCWJyZWFrOwor CWNhc2UgTExfT1BfV1I6CisJCS8qIFdFICovCisJCXRtcCB8PSBMTE9QX1dFOworCQlicmVhazsK KwljYXNlIExMX09QX1JEOgorCQkvKiBSRSAqLworCQl0bXAgfD0gTExPUF9SRTsKKwkJYnJlYWs7 CisJfQorCWlmIChsYXN0X29wKQorCQkvKiBSRVRVUk5fSURMRSAqLworCQl0bXAgfD0gTExPUF9S RVRVUk5fSURMRTsKKworCWRldl9kYmcoY3RybC0+ZGV2LCAibGxfb3AgY21kICUjeFxuIiwgdG1w KTsKKworCWJyY21uYW5kX3dyaXRlX3JlZyhjdHJsLCBCUkNNTkFORF9MTF9PUCwgdG1wKTsKKwko dm9pZClicmNtbmFuZF9yZWFkX3JlZyhjdHJsLCBCUkNNTkFORF9MTF9PUCk7CisKKwlicmNtbmFu ZF9zZW5kX2NtZChob3N0LCBDTURfTE9XX0xFVkVMX09QKTsKKwlyZXR1cm4gYnJjbW5hbmRfd2Fp dGZ1bmMobXRkLCBjaGlwKTsKK30KKworc3RhdGljIHZvaWQgYnJjbW5hbmRfY21kZnVuYyhzdHJ1 Y3QgbXRkX2luZm8gKm10ZCwgdW5zaWduZWQgY29tbWFuZCwKKwkJCSAgICAgaW50IGNvbHVtbiwg aW50IHBhZ2VfYWRkcikKK3sKKwlzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwID0gbXRkLT5wcml2Owor CXN0cnVjdCBicmNtbmFuZF9ob3N0ICpob3N0ID0gY2hpcC0+cHJpdjsKKwlzdHJ1Y3QgYnJjbW5h bmRfY29udHJvbGxlciAqY3RybCA9IGhvc3QtPmN0cmw7CisJdTY0IGFkZHIgPSAodTY0KXBhZ2Vf YWRkciA8PCBjaGlwLT5wYWdlX3NoaWZ0OworCWludCBuYXRpdmVfY21kID0gMDsKKworCWlmIChj b21tYW5kID09IE5BTkRfQ01EX1JFQURJRCB8fCBjb21tYW5kID09IE5BTkRfQ01EX1BBUkFNIHx8 CisJCQljb21tYW5kID09IE5BTkRfQ01EX1JORE9VVCkKKwkJYWRkciA9ICh1NjQpY29sdW1uOwor CS8qIEF2b2lkIHByb3BhZ2F0aW5nIGEgbmVnYXRpdmUsIGRvbid0LWNhcmUgYWRkcmVzcyAqLwor CWVsc2UgaWYgKHBhZ2VfYWRkciA8IDApCisJCWFkZHIgPSAwOworCisJZGV2X2RiZyhjdHJsLT5k ZXYsICJjbWQgMHgleCBhZGRyIDB4JWxseFxuIiwgY29tbWFuZCwKKwkJKHVuc2lnbmVkIGxvbmcg bG9uZylhZGRyKTsKKworCWhvc3QtPmxhc3RfY21kID0gY29tbWFuZDsKKwlob3N0LT5sYXN0X2J5 dGUgPSAwOworCWhvc3QtPmxhc3RfYWRkciA9IGFkZHI7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsK KwljYXNlIE5BTkRfQ01EX1JFU0VUOgorCQluYXRpdmVfY21kID0gQ01EX0ZMQVNIX1JFU0VUOwor CQlicmVhazsKKwljYXNlIE5BTkRfQ01EX1NUQVRVUzoKKwkJbmF0aXZlX2NtZCA9IENNRF9TVEFU VVNfUkVBRDsKKwkJYnJlYWs7CisJY2FzZSBOQU5EX0NNRF9SRUFESUQ6CisJCW5hdGl2ZV9jbWQg PSBDTURfREVWSUNFX0lEX1JFQUQ7CisJCWJyZWFrOworCWNhc2UgTkFORF9DTURfUkVBRE9PQjoK KwkJbmF0aXZlX2NtZCA9IENNRF9TUEFSRV9BUkVBX1JFQUQ7CisJCWJyZWFrOworCWNhc2UgTkFO RF9DTURfRVJBU0UxOgorCQluYXRpdmVfY21kID0gQ01EX0JMT0NLX0VSQVNFOworCQlicmNtbmFu ZF93cChtdGQsIDApOworCQlicmVhazsKKwljYXNlIE5BTkRfQ01EX1BBUkFNOgorCQluYXRpdmVf Y21kID0gQ01EX1BBUkFNRVRFUl9SRUFEOworCQlicmVhazsKKwljYXNlIE5BTkRfQ01EX1NFVF9G RUFUVVJFUzoKKwljYXNlIE5BTkRfQ01EX0dFVF9GRUFUVVJFUzoKKwkJYnJjbW5hbmRfbG93X2xl dmVsX29wKGhvc3QsIExMX09QX0NNRCwgY29tbWFuZCwgZmFsc2UpOworCQlicmNtbmFuZF9sb3df bGV2ZWxfb3AoaG9zdCwgTExfT1BfQUREUiwgY29sdW1uLCBmYWxzZSk7CisJCWJyZWFrOworCWNh c2UgTkFORF9DTURfUk5ET1VUOgorCQluYXRpdmVfY21kID0gQ01EX1BBUkFNRVRFUl9DSEFOR0Vf Q09MOworCQlhZGRyICY9IH4oKHU2NCkoRkNfQllURVMgLSAxKSk7CisJCS8qCisJCSAqIEhXIHF1 aXJrOiBQQVJBTUVURVJfQ0hBTkdFX0NPTCByZXF1aXJlcyBTRUNUT1JfU0laRV8xSz0wCisJCSAq IE5COiBod2NmZy5zZWN0b3Jfc2l6ZV8xayBtYXkgbm90IGJlIGluaXRpYWxpemVkIHlldAorCQkg Ki8KKwkJaWYgKGJyY21uYW5kX2dldF9zZWN0b3Jfc2l6ZV8xayhob3N0KSkgeworCQkJaG9zdC0+ aHdjZmcuc2VjdG9yX3NpemVfMWsgPQorCQkJCWJyY21uYW5kX2dldF9zZWN0b3Jfc2l6ZV8xayho b3N0KTsKKwkJCWJyY21uYW5kX3NldF9zZWN0b3Jfc2l6ZV8xayhob3N0LCAwKTsKKwkJfQorCQli cmVhazsKKwl9CisKKwlpZiAoIW5hdGl2ZV9jbWQpCisJCXJldHVybjsKKworCWJyY21uYW5kX3dy aXRlX3JlZyhjdHJsLCBCUkNNTkFORF9DTURfRVhUX0FERFJFU1MsCisJCShob3N0LT5jcyA8PCAx NikgfCAoKGFkZHIgPj4gMzIpICYgMHhmZmZmKSk7CisJKHZvaWQpYnJjbW5hbmRfcmVhZF9yZWco Y3RybCwgQlJDTU5BTkRfQ01EX0VYVF9BRERSRVNTKTsKKwlicmNtbmFuZF93cml0ZV9yZWcoY3Ry bCwgQlJDTU5BTkRfQ01EX0FERFJFU1MsIGxvd2VyXzMyX2JpdHMoYWRkcikpOworCSh2b2lkKWJy Y21uYW5kX3JlYWRfcmVnKGN0cmwsIEJSQ01OQU5EX0NNRF9BRERSRVNTKTsKKworCWJyY21uYW5k X3NlbmRfY21kKGhvc3QsIG5hdGl2ZV9jbWQpOworCWJyY21uYW5kX3dhaXRmdW5jKG10ZCwgY2hp cCk7CisKKwlpZiAobmF0aXZlX2NtZCA9PSBDTURfUEFSQU1FVEVSX1JFQUQgfHwKKwkJCW5hdGl2 ZV9jbWQgPT0gQ01EX1BBUkFNRVRFUl9DSEFOR0VfQ09MKSB7CisJCWludCBpOworCQkvKgorCQkg KiBNdXN0IGNhY2hlIHRoZSBGTEFTSF9DQUNIRSBub3csIHNpbmNlIGNoYW5nZXMgaW4KKwkJICog U0VDVE9SX1NJWkVfMUsgbWF5IGludmFsaWRhdGUgaXQKKwkJICovCisJCWZvciAoaSA9IDA7IGkg PCBGQ19XT1JEUzsgaSsrKQorCQkJY3RybC0+Zmxhc2hfY2FjaGVbaV0gPSBicmNtbmFuZF9yZWFk X2ZjKGN0cmwsIGkpOworCQkvKiBDbGVhbnVwIGZyb20gSFcgcXVpcms6IHJlc3RvcmUgU0VDVE9S X1NJWkVfMUsgKi8KKwkJaWYgKGhvc3QtPmh3Y2ZnLnNlY3Rvcl9zaXplXzFrKQorCQkJYnJjbW5h bmRfc2V0X3NlY3Rvcl9zaXplXzFrKGhvc3QsCisJCQkJCQkgICAgaG9zdC0+aHdjZmcuc2VjdG9y X3NpemVfMWspOworCX0KKworCS8qIFJlLWVuYWJsZSBwcm90ZWN0aW9uIGlzIG5lY2Vzc2FyeSBv bmx5IGFmdGVyIGVyYXNlICovCisJaWYgKGNvbW1hbmQgPT0gTkFORF9DTURfRVJBU0UxKQorCQli cmNtbmFuZF93cChtdGQsIDEpOworfQorCitzdGF0aWMgdWludDhfdCBicmNtbmFuZF9yZWFkX2J5 dGUoc3RydWN0IG10ZF9pbmZvICptdGQpCit7CisJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10 ZC0+cHJpdjsKKwlzdHJ1Y3QgYnJjbW5hbmRfaG9zdCAqaG9zdCA9IGNoaXAtPnByaXY7CisJc3Ry dWN0IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0cmwgPSBob3N0LT5jdHJsOworCXVpbnQ4X3QgcmV0 ID0gMDsKKwlpbnQgYWRkciwgb2ZmczsKKworCXN3aXRjaCAoaG9zdC0+bGFzdF9jbWQpIHsKKwlj YXNlIE5BTkRfQ01EX1JFQURJRDoKKwkJaWYgKGhvc3QtPmxhc3RfYnl0ZSA8IDQpCisJCQlyZXQg PSBicmNtbmFuZF9yZWFkX3JlZyhjdHJsLCBCUkNNTkFORF9JRCkgPj4KKwkJCQkoMjQgLSAoaG9z dC0+bGFzdF9ieXRlIDw8IDMpKTsKKwkJZWxzZSBpZiAoaG9zdC0+bGFzdF9ieXRlIDwgOCkKKwkJ CXJldCA9IGJyY21uYW5kX3JlYWRfcmVnKGN0cmwsIEJSQ01OQU5EX0lEX0VYVCkgPj4KKwkJCQko NTYgLSAoaG9zdC0+bGFzdF9ieXRlIDw8IDMpKTsKKwkJYnJlYWs7CisKKwljYXNlIE5BTkRfQ01E X1JFQURPT0I6CisJCXJldCA9IG9vYl9yZWdfcmVhZChjdHJsLCBob3N0LT5sYXN0X2J5dGUpOwor CQlicmVhazsKKworCWNhc2UgTkFORF9DTURfU1RBVFVTOgorCQlyZXQgPSBicmNtbmFuZF9yZWFk X3JlZyhjdHJsLCBCUkNNTkFORF9JTlRGQ19TVEFUVVMpICYKKwkJCQkJSU5URkNfRkxBU0hfU1RB VFVTOworCQlpZiAod3Bfb24pIC8qIGhpZGUgV1Agc3RhdHVzICovCisJCQlyZXQgfD0gTkFORF9T VEFUVVNfV1A7CisJCWJyZWFrOworCisJY2FzZSBOQU5EX0NNRF9QQVJBTToKKwljYXNlIE5BTkRf Q01EX1JORE9VVDoKKwkJYWRkciA9IGhvc3QtPmxhc3RfYWRkciArIGhvc3QtPmxhc3RfYnl0ZTsK KwkJb2ZmcyA9IGFkZHIgJiAoRkNfQllURVMgLSAxKTsKKworCQkvKiBBdCBGQ19CWVRFUyBib3Vu ZGFyeSwgc3dpdGNoIHRvIG5leHQgY29sdW1uICovCisJCWlmIChob3N0LT5sYXN0X2J5dGUgPiAw ICYmIG9mZnMgPT0gMCkKKwkJCWNoaXAtPmNtZGZ1bmMobXRkLCBOQU5EX0NNRF9STkRPVVQsIGFk ZHIsIC0xKTsKKworCQlyZXQgPSBjdHJsLT5mbGFzaF9jYWNoZVtvZmZzID4+IDJdID4+CisJCQkJ CSgyNCAtICgob2ZmcyAmIDB4MDMpIDw8IDMpKTsKKwkJYnJlYWs7CisJY2FzZSBOQU5EX0NNRF9H RVRfRkVBVFVSRVM6CisJCWlmIChob3N0LT5sYXN0X2J5dGUgPj0gT05GSV9TVUJGRUFUVVJFX1BB UkFNX0xFTikgeworCQkJcmV0ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWJvb2wgbGFzdCA9IGhvc3Qt Pmxhc3RfYnl0ZSA9PQorCQkJCU9ORklfU1VCRkVBVFVSRV9QQVJBTV9MRU4gLSAxOworCQkJYnJj bW5hbmRfbG93X2xldmVsX29wKGhvc3QsIExMX09QX1JELCAwLCBsYXN0KTsKKwkJCXJldCA9IGJy Y21uYW5kX3JlYWRfcmVnKGN0cmwsIEJSQ01OQU5EX0xMX1JEQVRBKSAmIDB4ZmY7CisJCX0KKwl9 CisKKwlkZXZfZGJnKGN0cmwtPmRldiwgInJlYWQgYnl0ZSA9IDB4JTAyeFxuIiwgcmV0KTsKKwlo b3N0LT5sYXN0X2J5dGUrKzsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGJyY21u YW5kX3JlYWRfYnVmKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCB1aW50OF90ICpidWYsIGludCBsZW4p Cit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyssIGJ1ZisrKQorCQkqYnVm ID0gYnJjbW5hbmRfcmVhZF9ieXRlKG10ZCk7Cit9CisKK3N0YXRpYyB2b2lkIGJyY21uYW5kX3dy aXRlX2J1ZihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3QgdWludDhfdCAqYnVmLAorCQkJCSAg IGludCBsZW4pCit7CisJaW50IGk7CisJc3RydWN0IG5hbmRfY2hpcCAqY2hpcCA9IG10ZC0+cHJp djsKKwlzdHJ1Y3QgYnJjbW5hbmRfaG9zdCAqaG9zdCA9IGNoaXAtPnByaXY7CisKKwlzd2l0Y2gg KGhvc3QtPmxhc3RfY21kKSB7CisJY2FzZSBOQU5EX0NNRF9TRVRfRkVBVFVSRVM6CisJCWZvciAo aSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCWJyY21uYW5kX2xvd19sZXZlbF9vcChob3N0LCBMTF9P UF9XUiwgYnVmW2ldLAorCQkJCQkJICAoaSArIDEpID09IGxlbik7CisJCWJyZWFrOworCWRlZmF1 bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogQ29uc3RydWN0IGEgRkxB U0hfRE1BIGRlc2NyaXB0b3IgYXMgcGFydCBvZiBhIGxpbmtlZCBsaXN0LiBZb3UgbXVzdCBrbm93 IHRoZQorICogZm9sbG93aW5nIGFoZWFkIG9mIHRpbWU6CisgKiAgLSBJcyB0aGlzIGRlc2NyaXB0 b3IgdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgYSBsaW5rZWQgbGlzdD8KKyAqICAtIFdoYXQgaXMg dGhlIChETUEpIGFkZHJlc3Mgb2YgdGhlIG5leHQgZGVzY3JpcHRvciBpbiB0aGUgbGlua2VkIGxp c3Q/CisgKi8KK3N0YXRpYyBpbnQgYnJjbW5hbmRfZmlsbF9kbWFfZGVzYyhzdHJ1Y3QgYnJjbW5h bmRfaG9zdCAqaG9zdCwKKwkJCQkgIHN0cnVjdCBicmNtX25hbmRfZG1hX2Rlc2MgKmRlc2MsIHU2 NCBhZGRyLAorCQkJCSAgZG1hX2FkZHJfdCBidWYsIHUzMiBsZW4sIHU4IGRtYV9jbWQsCisJCQkJ ICBib29sIGJlZ2luLCBib29sIGVuZCwKKwkJCQkgIGRtYV9hZGRyX3QgbmV4dF9kZXNjKQorewor CW1lbXNldChkZXNjLCAwLCBzaXplb2YoKmRlc2MpKTsKKwkvKiBEZXNjcmlwdG9ycyBhcmUgd3Jp dHRlbiBpbiBuYXRpdmUgYnl0ZSBvcmRlciAod29yZHdpc2UpICovCisJZGVzYy0+bmV4dF9kZXNj ID0gbG93ZXJfMzJfYml0cyhuZXh0X2Rlc2MpOworCWRlc2MtPm5leHRfZGVzY19leHQgPSB1cHBl cl8zMl9iaXRzKG5leHRfZGVzYyk7CisJZGVzYy0+Y21kX2lycSA9IChkbWFfY21kIDw8IDI0KSB8 CisJCShlbmQgPyAoMHgwMyA8PCA4KSA6IDApIHwgLyogSVJRIHwgU1RPUCAqLworCQkoISFiZWdp bikgfCAoKCEhZW5kKSA8PCAxKTsgLyogaGVhZCwgdGFpbCAqLworI2lmZGVmIENPTkZJR19DUFVf QklHX0VORElBTgorCWRlc2MtPmNtZF9pcnEgfD0gMHgwMSA8PCAxMjsKKyNlbmRpZgorCWRlc2Mt PmRyYW1fYWRkciA9IGxvd2VyXzMyX2JpdHMoYnVmKTsKKwlkZXNjLT5kcmFtX2FkZHJfZXh0ID0g dXBwZXJfMzJfYml0cyhidWYpOworCWRlc2MtPnRmcl9sZW4gPSBsZW47CisJZGVzYy0+dG90YWxf bGVuID0gbGVuOworCWRlc2MtPmZsYXNoX2FkZHIgPSBsb3dlcl8zMl9iaXRzKGFkZHIpOworCWRl c2MtPmZsYXNoX2FkZHJfZXh0ID0gdXBwZXJfMzJfYml0cyhhZGRyKTsKKwlkZXNjLT5jcyA9IGhv c3QtPmNzOworCWRlc2MtPnN0YXR1c192YWxpZCA9IDB4MDE7CisJcmV0dXJuIDA7Cit9CisKKy8q KgorICogS2ljayB0aGUgRkxBU0hfRE1BIGVuZ2luZSwgd2l0aCBhIGdpdmVuIERNQSBkZXNjcmlw dG9yCisgKi8KK3N0YXRpYyB2b2lkIGJyY21uYW5kX2RtYV9ydW4oc3RydWN0IGJyY21uYW5kX2hv c3QgKmhvc3QsIGRtYV9hZGRyX3QgZGVzYykKK3sKKwlzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxl ciAqY3RybCA9IGhvc3QtPmN0cmw7CisJdW5zaWduZWQgbG9uZyB0aW1lbyA9IG1zZWNzX3RvX2pp ZmZpZXMoMTAwKTsKKworCWZsYXNoX2RtYV93cml0ZWwoY3RybCwgRkxBU0hfRE1BX0ZJUlNUX0RF U0MsIGxvd2VyXzMyX2JpdHMoZGVzYykpOworCSh2b2lkKWZsYXNoX2RtYV9yZWFkbChjdHJsLCBG TEFTSF9ETUFfRklSU1RfREVTQyk7CisJZmxhc2hfZG1hX3dyaXRlbChjdHJsLCBGTEFTSF9ETUFf RklSU1RfREVTQ19FWFQsIHVwcGVyXzMyX2JpdHMoZGVzYykpOworCSh2b2lkKWZsYXNoX2RtYV9y ZWFkbChjdHJsLCBGTEFTSF9ETUFfRklSU1RfREVTQ19FWFQpOworCisJLyogU3RhcnQgRkxBU0hf RE1BIGVuZ2luZSAqLworCWN0cmwtPmRtYV9wZW5kaW5nID0gdHJ1ZTsKKwltYigpOyAvKiBmbHVz aCBwcmV2aW91cyB3cml0ZXMgKi8KKwlmbGFzaF9kbWFfd3JpdGVsKGN0cmwsIEZMQVNIX0RNQV9D VFJMLCAweDAzKTsgLyogd2FrZSB8IHJ1biAqLworCisJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25f dGltZW91dCgmY3RybC0+ZG1hX2RvbmUsIHRpbWVvKSA8PSAwKSB7CisJCWRldl9lcnIoY3RybC0+ ZGV2LAorCQkJCSJ0aW1lb3V0IHdhaXRpbmcgZm9yIERNQTsgc3RhdHVzICUjeCwgZXJyb3Igc3Rh dHVzICUjeFxuIiwKKwkJCQlmbGFzaF9kbWFfcmVhZGwoY3RybCwgRkxBU0hfRE1BX1NUQVRVUyks CisJCQkJZmxhc2hfZG1hX3JlYWRsKGN0cmwsIEZMQVNIX0RNQV9FUlJPUl9TVEFUVVMpKTsKKwl9 CisJY3RybC0+ZG1hX3BlbmRpbmcgPSBmYWxzZTsKKwlmbGFzaF9kbWFfd3JpdGVsKGN0cmwsIEZM QVNIX0RNQV9DVFJMLCAwKTsgLyogZm9yY2Ugc3RvcCAqLworfQorCitzdGF0aWMgaW50IGJyY21u YW5kX2RtYV90cmFucyhzdHJ1Y3QgYnJjbW5hbmRfaG9zdCAqaG9zdCwgdTY0IGFkZHIsIHUzMiAq YnVmLAorCQkJICAgICAgdTMyIGxlbiwgdTggZG1hX2NtZCkKK3sKKwlzdHJ1Y3QgYnJjbW5hbmRf Y29udHJvbGxlciAqY3RybCA9IGhvc3QtPmN0cmw7CisJZG1hX2FkZHJfdCBidWZfcGE7CisJaW50 IGRpciA9IGRtYV9jbWQgPT0gQ01EX1BBR0VfUkVBRCA/IERNQV9GUk9NX0RFVklDRSA6IERNQV9U T19ERVZJQ0U7CisKKwlidWZfcGEgPSBkbWFfbWFwX3NpbmdsZShjdHJsLT5kZXYsIGJ1ZiwgbGVu LCBkaXIpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihjdHJsLT5kZXYsIGJ1Zl9wYSkpIHsKKwkJ ZGV2X2VycihjdHJsLT5kZXYsICJ1bmFibGUgdG8gbWFwIGJ1ZmZlciBmb3IgRE1BXG4iKTsKKwkJ cmV0dXJuIC1FTk9NRU07CisJfQorCisJYnJjbW5hbmRfZmlsbF9kbWFfZGVzYyhob3N0LCBjdHJs LT5kbWFfZGVzYywgYWRkciwgYnVmX3BhLCBsZW4sCisJCQkJICAgZG1hX2NtZCwgdHJ1ZSwgdHJ1 ZSwgMCk7CisKKwlicmNtbmFuZF9kbWFfcnVuKGhvc3QsIGN0cmwtPmRtYV9wYSk7CisKKwlkbWFf dW5tYXBfc2luZ2xlKGN0cmwtPmRldiwgYnVmX3BhLCBsZW4sIGRpcik7CisKKwlpZiAoY3RybC0+ ZG1hX2Rlc2MtPnN0YXR1c192YWxpZCAmIEZMQVNIX0RNQV9FQ0NfRVJST1IpCisJCXJldHVybiAt RUJBRE1TRzsKKwllbHNlIGlmIChjdHJsLT5kbWFfZGVzYy0+c3RhdHVzX3ZhbGlkICYgRkxBU0hf RE1BX0NPUlJfRVJST1IpCisJCXJldHVybiAtRVVDTEVBTjsKKworCXJldHVybiAwOworfQorCisv KgorICogQXNzdW1lcyBwcm9wZXIgQ1MgaXMgYWxyZWFkeSBzZXQKKyAqLworc3RhdGljIGludCBi cmNtbmFuZF9yZWFkX2J5X3BpbyhzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgc3RydWN0IG5hbmRfY2hp cCAqY2hpcCwKKwkJCQl1NjQgYWRkciwgdW5zaWduZWQgaW50IHRyYW5zLCB1MzIgKmJ1ZiwKKwkJ CQl1OCAqb29iLCB1NjQgKmVycl9hZGRyKQoreworCXN0cnVjdCBicmNtbmFuZF9ob3N0ICpob3N0 ID0gY2hpcC0+cHJpdjsKKwlzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxlciAqY3RybCA9IGhvc3Qt PmN0cmw7CisJaW50IGksIGosIHJldCA9IDA7CisKKwkvKiBDbGVhciBlcnJvciBhZGRyZXNzZXMg Ki8KKwlicmNtbmFuZF93cml0ZV9yZWcoY3RybCwgQlJDTU5BTkRfVU5DT1JSX0FERFIsIDApOwor CWJyY21uYW5kX3dyaXRlX3JlZyhjdHJsLCBCUkNNTkFORF9DT1JSX0FERFIsIDApOworCisJYnJj bW5hbmRfd3JpdGVfcmVnKGN0cmwsIEJSQ01OQU5EX0NNRF9FWFRfQUREUkVTUywKKwkJCShob3N0 LT5jcyA8PCAxNikgfCAoKGFkZHIgPj4gMzIpICYgMHhmZmZmKSk7CisJKHZvaWQpYnJjbW5hbmRf cmVhZF9yZWcoY3RybCwgQlJDTU5BTkRfQ01EX0VYVF9BRERSRVNTKTsKKworCWZvciAoaSA9IDA7 IGkgPCB0cmFuczsgaSsrLCBhZGRyICs9IEZDX0JZVEVTKSB7CisJCWJyY21uYW5kX3dyaXRlX3Jl ZyhjdHJsLCBCUkNNTkFORF9DTURfQUREUkVTUywKKwkJCQkgICBsb3dlcl8zMl9iaXRzKGFkZHIp KTsKKwkJKHZvaWQpYnJjbW5hbmRfcmVhZF9yZWcoY3RybCwgQlJDTU5BTkRfQ01EX0FERFJFU1Mp OworCQkvKiBTUEFSRV9BUkVBX1JFQUQgZG9lcyBub3QgdXNlIEVDQywgc28ganVzdCB1c2UgUEFH RV9SRUFEICovCisJCWJyY21uYW5kX3NlbmRfY21kKGhvc3QsIENNRF9QQUdFX1JFQUQpOworCQli cmNtbmFuZF93YWl0ZnVuYyhtdGQsIGNoaXApOworCisJCWlmIChsaWtlbHkoYnVmKSkKKwkJCWZv ciAoaiA9IDA7IGogPCBGQ19XT1JEUzsgaisrLCBidWYrKykKKwkJCQkqYnVmID0gYnJjbW5hbmRf cmVhZF9mYyhjdHJsLCBqKTsKKworCQlpZiAob29iKQorCQkJb29iICs9IHJlYWRfb29iX2Zyb21f cmVncyhjdHJsLCBpLCBvb2IsCisJCQkJCW10ZC0+b29ic2l6ZSAvIHRyYW5zLAorCQkJCQlob3N0 LT5od2NmZy5zZWN0b3Jfc2l6ZV8xayk7CisKKwkJaWYgKCFyZXQpIHsKKwkJCSplcnJfYWRkciA9 IGJyY21uYW5kX3JlYWRfcmVnKGN0cmwsCisJCQkJCUJSQ01OQU5EX1VOQ09SUl9BRERSKSB8CisJ CQkJKCh1NjQpKGJyY21uYW5kX3JlYWRfcmVnKGN0cmwsCisJCQkJCQlCUkNNTkFORF9VTkNPUlJf RVhUX0FERFIpCisJCQkJCSYgMHhmZmZmKSA8PCAzMik7CisJCQlpZiAoKmVycl9hZGRyKQorCQkJ CXJldCA9IC1FQkFETVNHOworCQl9CisKKwkJaWYgKCFyZXQpIHsKKwkJCSplcnJfYWRkciA9IGJy Y21uYW5kX3JlYWRfcmVnKGN0cmwsCisJCQkJCUJSQ01OQU5EX0NPUlJfQUREUikgfAorCQkJCSgo dTY0KShicmNtbmFuZF9yZWFkX3JlZyhjdHJsLAorCQkJCQkJQlJDTU5BTkRfQ09SUl9FWFRfQURE UikKKwkJCQkJJiAweGZmZmYpIDw8IDMyKTsKKwkJCWlmICgqZXJyX2FkZHIpCisJCQkJcmV0ID0g LUVVQ0xFQU47CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJyY21u YW5kX3JlYWQoc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCisJ CQkgdTY0IGFkZHIsIHVuc2lnbmVkIGludCB0cmFucywgdTMyICpidWYsIHU4ICpvb2IpCit7CisJ c3RydWN0IGJyY21uYW5kX2hvc3QgKmhvc3QgPSBjaGlwLT5wcml2OworCXN0cnVjdCBicmNtbmFu ZF9jb250cm9sbGVyICpjdHJsID0gaG9zdC0+Y3RybDsKKwl1NjQgZXJyX2FkZHIgPSAwOworCWlu dCBlcnI7CisKKwlkZXZfZGJnKGN0cmwtPmRldiwgInJlYWQgJWxseCAtPiAlcFxuIiwgKHVuc2ln bmVkIGxvbmcgbG9uZylhZGRyLCBidWYpOworCisJYnJjbW5hbmRfd3JpdGVfcmVnKGN0cmwsIEJS Q01OQU5EX1VOQ09SUl9DT1VOVCwgMCk7CisKKwlpZiAoaGFzX2ZsYXNoX2RtYShjdHJsKSAmJiAh b29iICYmIGZsYXNoX2RtYV9idWZfb2soYnVmKSkgeworCQllcnIgPSBicmNtbmFuZF9kbWFfdHJh bnMoaG9zdCwgYWRkciwgYnVmLCB0cmFucyAqIEZDX0JZVEVTLAorCQkJCQkgICAgIENNRF9QQUdF X1JFQUQpOworCQlpZiAoZXJyKSB7CisJCQlpZiAobXRkX2lzX2JpdGZsaXBfb3JfZWNjZXJyKGVy cikpCisJCQkJZXJyX2FkZHIgPSBhZGRyOworCQkJZWxzZQorCQkJCXJldHVybiAtRUlPOworCQl9 CisJfSBlbHNlIHsKKwkJaWYgKG9vYikKKwkJCW1lbXNldChvb2IsIDB4OTksIG10ZC0+b29ic2l6 ZSk7CisKKwkJZXJyID0gYnJjbW5hbmRfcmVhZF9ieV9waW8obXRkLCBjaGlwLCBhZGRyLCB0cmFu cywgYnVmLAorCQkJCQkgICAgICAgb29iLCAmZXJyX2FkZHIpOworCX0KKworCWlmIChtdGRfaXNf ZWNjZXJyKGVycikpIHsKKwkJZGV2X2RiZyhjdHJsLT5kZXYsICJ1bmNvcnJlY3RhYmxlIGVycm9y IGF0IDB4JWxseFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZXJyX2FkZHIpOworCQltdGQt PmVjY19zdGF0cy5mYWlsZWQrKzsKKwkJLyogTkFORCBsYXllciBleHBlY3RzIHplcm8gb24gRUND IGVycm9ycyAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobXRkX2lzX2JpdGZsaXAoZXJyKSkg eworCQl1bnNpZ25lZCBpbnQgY29ycmVjdGVkID0gYnJjbW5hbmRfY291bnRfY29ycmVjdGVkKGN0 cmwpOworCisJCWRldl9kYmcoY3RybC0+ZGV2LCAiY29ycmVjdGVkIGVycm9yIGF0IDB4JWxseFxu IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZXJyX2FkZHIpOworCQltdGQtPmVjY19zdGF0cy5j b3JyZWN0ZWQgKz0gY29ycmVjdGVkOworCQkvKiBBbHdheXMgZXhjZWVkIHRoZSBzb2Z0d2FyZS1p bXBvc2VkIHRocmVzaG9sZCAqLworCQlyZXR1cm4gbWF4KG10ZC0+Yml0ZmxpcF90aHJlc2hvbGQs IGNvcnJlY3RlZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnJjbW5hbmRf cmVhZF9wYWdlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAor CQkJICAgICAgdWludDhfdCAqYnVmLCBpbnQgb29iX3JlcXVpcmVkLCBpbnQgcGFnZSkKK3sKKwlz dHJ1Y3QgYnJjbW5hbmRfaG9zdCAqaG9zdCA9IGNoaXAtPnByaXY7CisJdTggKm9vYiA9IG9vYl9y ZXF1aXJlZCA/ICh1OCAqKWNoaXAtPm9vYl9wb2kgOiBOVUxMOworCisJcmV0dXJuIGJyY21uYW5k X3JlYWQobXRkLCBjaGlwLCBob3N0LT5sYXN0X2FkZHIsCisJCQltdGQtPndyaXRlc2l6ZSA+PiBG Q19TSElGVCwgKHUzMiAqKWJ1Ziwgb29iKTsKK30KKworc3RhdGljIGludCBicmNtbmFuZF9yZWFk X3BhZ2VfcmF3KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAor CQkJCSAgdWludDhfdCAqYnVmLCBpbnQgb29iX3JlcXVpcmVkLCBpbnQgcGFnZSkKK3sKKwlzdHJ1 Y3QgYnJjbW5hbmRfaG9zdCAqaG9zdCA9IGNoaXAtPnByaXY7CisJdTggKm9vYiA9IG9vYl9yZXF1 aXJlZCA/ICh1OCAqKWNoaXAtPm9vYl9wb2kgOiBOVUxMOworCWludCByZXQ7CisKKwlicmNtbmFu ZF9zZXRfZWNjX2VuYWJsZWQoaG9zdCwgMCk7CisJcmV0ID0gYnJjbW5hbmRfcmVhZChtdGQsIGNo aXAsIGhvc3QtPmxhc3RfYWRkciwKKwkJCW10ZC0+d3JpdGVzaXplID4+IEZDX1NISUZULCAodTMy ICopYnVmLCBvb2IpOworCWJyY21uYW5kX3NldF9lY2NfZW5hYmxlZChob3N0LCAxKTsKKwlyZXR1 cm4gcmV0OworfQorCitzdGF0aWMgaW50IGJyY21uYW5kX3JlYWRfb29iKHN0cnVjdCBtdGRfaW5m byAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAorCQkJICAgICBpbnQgcGFnZSkKK3sKKwly ZXR1cm4gYnJjbW5hbmRfcmVhZChtdGQsIGNoaXAsICh1NjQpcGFnZSA8PCBjaGlwLT5wYWdlX3No aWZ0LAorCQkJbXRkLT53cml0ZXNpemUgPj4gRkNfU0hJRlQsCisJCQlOVUxMLCAodTggKiljaGlw LT5vb2JfcG9pKTsKK30KKworc3RhdGljIGludCBicmNtbmFuZF9yZWFkX29vYl9yYXcoc3RydWN0 IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCisJCQkJIGludCBwYWdlKQor eworCXN0cnVjdCBicmNtbmFuZF9ob3N0ICpob3N0ID0gY2hpcC0+cHJpdjsKKworCWJyY21uYW5k X3NldF9lY2NfZW5hYmxlZChob3N0LCAwKTsKKwlicmNtbmFuZF9yZWFkKG10ZCwgY2hpcCwgKHU2 NClwYWdlIDw8IGNoaXAtPnBhZ2Vfc2hpZnQsCisJCW10ZC0+d3JpdGVzaXplID4+IEZDX1NISUZU LAorCQlOVUxMLCAodTggKiljaGlwLT5vb2JfcG9pKTsKKwlicmNtbmFuZF9zZXRfZWNjX2VuYWJs ZWQoaG9zdCwgMSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnJjbW5hbmRfcmVhZF9z dWJwYWdlKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBzdHJ1Y3QgbmFuZF9jaGlwICpjaGlwLAorCQkJ CSB1aW50MzJfdCBkYXRhX29mZnMsIHVpbnQzMl90IHJlYWRsZW4sCisJCQkJIHVpbnQ4X3QgKmJ1 ZnBvaSwgaW50IHBhZ2UpCit7CisJc3RydWN0IGJyY21uYW5kX2hvc3QgKmhvc3QgPSBjaGlwLT5w cml2OworCisJcmV0dXJuIGJyY21uYW5kX3JlYWQobXRkLCBjaGlwLCBob3N0LT5sYXN0X2FkZHIg KyBkYXRhX29mZnMsCisJCQlyZWFkbGVuID4+IEZDX1NISUZULCAodTMyICopYnVmcG9pLCBOVUxM KTsKK30KKworc3RhdGljIGludCBicmNtbmFuZF93cml0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwg c3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKKwkJCSAgdTY0IGFkZHIsIGNvbnN0IHUzMiAqYnVmLCB1 OCAqb29iKQoreworCXN0cnVjdCBicmNtbmFuZF9ob3N0ICpob3N0ID0gY2hpcC0+cHJpdjsKKwlz dHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxlciAqY3RybCA9IGhvc3QtPmN0cmw7CisJdW5zaWduZWQg aW50IGksIGosIHRyYW5zID0gbXRkLT53cml0ZXNpemUgPj4gRkNfU0hJRlQ7CisJaW50IHN0YXR1 cywgcmV0ID0gMDsKKworCWRldl9kYmcoY3RybC0+ZGV2LCAid3JpdGUgJWxseCA8LSAlcFxuIiwg KHVuc2lnbmVkIGxvbmcgbG9uZylhZGRyLCBidWYpOworCisJaWYgKHVubGlrZWx5KCh1MzIpYnVm ICYgMHgwMykpIHsKKwkJZGV2X3dhcm4oY3RybC0+ZGV2LCAidW5hbGlnbmVkIGJ1ZmZlcjogJXBc biIsIGJ1Zik7CisJCWJ1ZiA9ICh1MzIgKikoKHUzMilidWYgJiB+MHgwMyk7CisJfQorCisJYnJj bW5hbmRfd3AobXRkLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBjdHJsLT5tYXhfb29iOyBpICs9 IDQpCisJCW9vYl9yZWdfd3JpdGUoY3RybCwgaSwgMHhmZmZmZmZmZik7CisKKwlpZiAoaGFzX2Zs YXNoX2RtYShjdHJsKSAmJiAhb29iICYmIGZsYXNoX2RtYV9idWZfb2soYnVmKSkgeworCQlpZiAo YnJjbW5hbmRfZG1hX3RyYW5zKGhvc3QsIGFkZHIsICh1MzIgKilidWYsCisJCQkJCW10ZC0+d3Jp dGVzaXplLCBDTURfUFJPR1JBTV9QQUdFKSkKKwkJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0Owor CX0KKworCWJyY21uYW5kX3dyaXRlX3JlZyhjdHJsLCBCUkNNTkFORF9DTURfRVhUX0FERFJFU1Ms CisJCQkoaG9zdC0+Y3MgPDwgMTYpIHwgKChhZGRyID4+IDMyKSAmIDB4ZmZmZikpOworCSh2b2lk KWJyY21uYW5kX3JlYWRfcmVnKGN0cmwsIEJSQ01OQU5EX0NNRF9FWFRfQUREUkVTUyk7CisKKwlm b3IgKGkgPSAwOyBpIDwgdHJhbnM7IGkrKywgYWRkciArPSBGQ19CWVRFUykgeworCQkvKiBmdWxs IGFkZHJlc3MgTVVTVCBiZSBzZXQgYmVmb3JlIHBvcHVsYXRpbmcgRkMgKi8KKwkJYnJjbW5hbmRf d3JpdGVfcmVnKGN0cmwsIEJSQ01OQU5EX0NNRF9BRERSRVNTLAorCQkJCSAgIGxvd2VyXzMyX2Jp dHMoYWRkcikpOworCQkodm9pZClicmNtbmFuZF9yZWFkX3JlZyhjdHJsLCBCUkNNTkFORF9DTURf QUREUkVTUyk7CisKKwkJaWYgKGJ1ZikKKwkJCWZvciAoaiA9IDA7IGogPCBGQ19XT1JEUzsgaisr LCBidWYrKykKKwkJCQlicmNtbmFuZF93cml0ZV9mYyhjdHJsLCBqLCAqYnVmKTsKKwkJZWxzZSBp ZiAob29iKQorCQkJZm9yIChqID0gMDsgaiA8IEZDX1dPUkRTOyBqKyspCisJCQkJYnJjbW5hbmRf d3JpdGVfZmMoY3RybCwgaiwgMHhmZmZmZmZmZik7CisKKwkJaWYgKG9vYikgeworCQkJb29iICs9 IHdyaXRlX29vYl90b19yZWdzKGN0cmwsIGksIG9vYiwKKwkJCQkJbXRkLT5vb2JzaXplIC8gdHJh bnMsCisJCQkJCWhvc3QtPmh3Y2ZnLnNlY3Rvcl9zaXplXzFrKTsKKwkJfQorCisJCS8qIHdlIGNh bm5vdCB1c2UgU1BBUkVfQVJFQV9QUk9HUkFNIHdoZW4gUEFSVElBTF9QQUdFX0VOPTAgKi8KKwkJ YnJjbW5hbmRfc2VuZF9jbWQoaG9zdCwgQ01EX1BST0dSQU1fUEFHRSk7CisJCXN0YXR1cyA9IGJy Y21uYW5kX3dhaXRmdW5jKG10ZCwgY2hpcCk7CisKKwkJaWYgKHN0YXR1cyAmIE5BTkRfU1RBVFVT X0ZBSUwpIHsKKwkJCWRldl9pbmZvKGN0cmwtPmRldiwgInByb2dyYW0gZmFpbGVkIGF0ICVsbHhc biIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylhZGRyKTsKKwkJCXJldCA9IC1FSU87CisJCQln b3RvIG91dDsKKwkJfQorCX0KK291dDoKKwlicmNtbmFuZF93cChtdGQsIDEpOworCXJldHVybiBy ZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnJjbW5hbmRfd3JpdGVfcGFnZShzdHJ1Y3QgbXRkX2luZm8g Km10ZCwgc3RydWN0IG5hbmRfY2hpcCAqY2hpcCwKKwkJCSAgICAgICBjb25zdCB1aW50OF90ICpi dWYsIGludCBvb2JfcmVxdWlyZWQpCit7CisJc3RydWN0IGJyY21uYW5kX2hvc3QgKmhvc3QgPSBj aGlwLT5wcml2OworCXZvaWQgKm9vYiA9IG9vYl9yZXF1aXJlZCA/IGNoaXAtPm9vYl9wb2kgOiBO VUxMOworCisJYnJjbW5hbmRfd3JpdGUobXRkLCBjaGlwLCBob3N0LT5sYXN0X2FkZHIsIChjb25z dCB1MzIgKilidWYsIG9vYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnJjbW5hbmRf d3JpdGVfcGFnZV9yYXcoc3RydWN0IG10ZF9pbmZvICptdGQsCisJCQkJICAgc3RydWN0IG5hbmRf Y2hpcCAqY2hpcCwgY29uc3QgdWludDhfdCAqYnVmLAorCQkJCSAgIGludCBvb2JfcmVxdWlyZWQp Cit7CisJc3RydWN0IGJyY21uYW5kX2hvc3QgKmhvc3QgPSBjaGlwLT5wcml2OworCXZvaWQgKm9v YiA9IG9vYl9yZXF1aXJlZCA/IGNoaXAtPm9vYl9wb2kgOiBOVUxMOworCisJYnJjbW5hbmRfc2V0 X2VjY19lbmFibGVkKGhvc3QsIDApOworCWJyY21uYW5kX3dyaXRlKG10ZCwgY2hpcCwgaG9zdC0+ bGFzdF9hZGRyLCAoY29uc3QgdTMyICopYnVmLCBvb2IpOworCWJyY21uYW5kX3NldF9lY2NfZW5h YmxlZChob3N0LCAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicmNtbmFuZF93cml0 ZV9vb2Ioc3RydWN0IG10ZF9pbmZvICptdGQsIHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCisJCQkJ ICBpbnQgcGFnZSkKK3sKKwlyZXR1cm4gYnJjbW5hbmRfd3JpdGUobXRkLCBjaGlwLCAodTY0KXBh Z2UgPDwgY2hpcC0+cGFnZV9zaGlmdCwKKwkJCQkgIE5VTEwsIGNoaXAtPm9vYl9wb2kpOworfQor CitzdGF0aWMgaW50IGJyY21uYW5kX3dyaXRlX29vYl9yYXcoc3RydWN0IG10ZF9pbmZvICptdGQs IHN0cnVjdCBuYW5kX2NoaXAgKmNoaXAsCisJCQkJICBpbnQgcGFnZSkKK3sKKwlzdHJ1Y3QgYnJj bW5hbmRfaG9zdCAqaG9zdCA9IGNoaXAtPnByaXY7CisJaW50IHJldDsKKworCWJyY21uYW5kX3Nl dF9lY2NfZW5hYmxlZChob3N0LCAwKTsKKwlyZXQgPSBicmNtbmFuZF93cml0ZShtdGQsIGNoaXAs ICh1NjQpcGFnZSA8PCBjaGlwLT5wYWdlX3NoaWZ0LCBOVUxMLAorCQkJCSAodTggKiljaGlwLT5v b2JfcG9pKTsKKwlicmNtbmFuZF9zZXRfZWNjX2VuYWJsZWQoaG9zdCwgMSk7CisKKwlyZXR1cm4g cmV0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBlci1DUyBzZXR1cCAoMSBOQU5EIGRldmlj ZSkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBicmNtbmFuZF9zZXRfY2ZnKHN0cnVj dCBicmNtbmFuZF9ob3N0ICpob3N0LAorCQkJICAgIHN0cnVjdCBicmNtbmFuZF9jZmcgKmNmZykK K3sKKwlzdHJ1Y3QgYnJjbW5hbmRfY29udHJvbGxlciAqY3RybCA9IGhvc3QtPmN0cmw7CisJc3Ry dWN0IG5hbmRfY2hpcCAqY2hpcCA9ICZob3N0LT5jaGlwOworCXUxNiBjZmdfb2ZmcyA9IGJyY21u YW5kX2NzX29mZnNldChjdHJsLCBob3N0LT5jcywgQlJDTU5BTkRfQ1NfQ0ZHKTsKKwl1MTYgY2Zn X2V4dF9vZmZzID0gYnJjbW5hbmRfY3Nfb2Zmc2V0KGN0cmwsIGhvc3QtPmNzLAorCQkJQlJDTU5B TkRfQ1NfQ0ZHX0VYVCk7CisJdTE2IGFjY19jb250cm9sX29mZnMgPSBicmNtbmFuZF9jc19vZmZz ZXQoY3RybCwgaG9zdC0+Y3MsCisJCQlCUkNNTkFORF9DU19BQ0NfQ09OVFJPTCk7CisJdTggYmxv Y2tfc2l6ZSA9IDAsIHBhZ2Vfc2l6ZSA9IDAsIGRldmljZV9zaXplID0gMDsKKwl1MzIgdG1wOwor CisJaWYgKGN0cmwtPmJsb2NrX3NpemVzKSB7CisJCWludCBpLCBmb3VuZDsKKworCQlmb3IgKGkg PSAwLCBmb3VuZCA9IDA7IGN0cmwtPmJsb2NrX3NpemVzW2ldOyBpKyspCisJCQlpZiAoY3RybC0+ YmxvY2tfc2l6ZXNbaV0gKiAxMDI0ID09IGNmZy0+YmxvY2tfc2l6ZSkgeworCQkJCWJsb2NrX3Np emUgPSBpOworCQkJCWZvdW5kID0gMTsKKwkJCX0KKwkJaWYgKCFmb3VuZCkgeworCQkJZGV2X3dh cm4oY3RybC0+ZGV2LCAiaW52YWxpZCBibG9jayBzaXplICV1XG4iLAorCQkJCQljZmctPmJsb2Nr X3NpemUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQlibG9ja19zaXpl ID0gZmZzKGNmZy0+YmxvY2tfc2l6ZSkgLSBmZnMoQlJDTU5BTkRfTUlOX0JMT0NLU0laRSk7CisJ fQorCisJaWYgKGNmZy0+YmxvY2tfc2l6ZSA8IEJSQ01OQU5EX01JTl9CTE9DS1NJWkUgfHwgKGN0 cmwtPm1heF9ibG9ja19zaXplICYmCisJCQkJY2ZnLT5ibG9ja19zaXplID4gY3RybC0+bWF4X2Js b2NrX3NpemUpKSB7CisJCWRldl93YXJuKGN0cmwtPmRldiwgImludmFsaWQgYmxvY2sgc2l6ZSAl dVxuIiwKKwkJCQljZmctPmJsb2NrX3NpemUpOworCQlibG9ja19zaXplID0gMDsKKwl9CisKKwlp ZiAoY3RybC0+cGFnZV9zaXplcykgeworCQlpbnQgaSwgZm91bmQ7CisKKwkJZm9yIChpID0gMCwg Zm91bmQgPSAwOyBjdHJsLT5wYWdlX3NpemVzW2ldOyBpKyspCisJCQlpZiAoY3RybC0+cGFnZV9z aXplc1tpXSA9PSBjZmctPnBhZ2Vfc2l6ZSkgeworCQkJCXBhZ2Vfc2l6ZSA9IGk7CisJCQkJZm91 bmQgPSAxOworCQkJfQorCQlpZiAoIWZvdW5kKSB7CisJCQlkZXZfd2FybihjdHJsLT5kZXYsICJp bnZhbGlkIHBhZ2Ugc2l6ZSAldVxuIiwKKwkJCQkJY2ZnLT5wYWdlX3NpemUpOworCQkJcmV0dXJu IC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQlwYWdlX3NpemUgPSBmZnMoY2ZnLT5wYWdlX3Np emUpIC0gZmZzKEJSQ01OQU5EX01JTl9QQUdFU0laRSk7CisJfQorCisJaWYgKGNmZy0+cGFnZV9z aXplIDwgQlJDTU5BTkRfTUlOX1BBR0VTSVpFIHx8IChjdHJsLT5tYXhfcGFnZV9zaXplICYmCisJ CQkJY2ZnLT5wYWdlX3NpemUgPiBjdHJsLT5tYXhfcGFnZV9zaXplKSkgeworCQlkZXZfd2Fybihj dHJsLT5kZXYsICJpbnZhbGlkIHBhZ2Ugc2l6ZSAldVxuIiwgY2ZnLT5wYWdlX3NpemUpOworCQly ZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZmxzNjQoY2ZnLT5kZXZpY2Vfc2l6ZSkgPCBmbHM2 NChCUkNNTkFORF9NSU5fREVWU0laRSkpIHsKKwkJZGV2X3dhcm4oY3RybC0+ZGV2LCAiaW52YWxp ZCBkZXZpY2Ugc2l6ZSAweCVsbHhcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWNmZy0+ZGV2 aWNlX3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2aWNlX3NpemUgPSBmbHM2NChj ZmctPmRldmljZV9zaXplKSAtIGZsczY0KEJSQ01OQU5EX01JTl9ERVZTSVpFKTsKKworCXRtcCA9 IChjZmctPmJsa19hZHJfYnl0ZXMgPDwgOCkgfAorCQkoY2ZnLT5jb2xfYWRyX2J5dGVzIDw8IDEy KSB8CisJCShjZmctPmZ1bF9hZHJfYnl0ZXMgPDwgMTYpIHwKKwkJKCEhKGNmZy0+ZGV2aWNlX3dp ZHRoID09IDE2KSA8PCAyMykgfAorCQkoZGV2aWNlX3NpemUgPDwgMjQpOworCWlmIChjZmdfb2Zm cyA9PSBjZmdfZXh0X29mZnMpIHsKKwkJdG1wIHw9IChwYWdlX3NpemUgPDwgMjApIHwgKGJsb2Nr X3NpemUgPDwgMjgpOworCQluYW5kX3dyaXRlcmVnKGN0cmwsIGNmZ19vZmZzLCB0bXApOworCX0g ZWxzZSB7CisJCW5hbmRfd3JpdGVyZWcoY3RybCwgY2ZnX29mZnMsIHRtcCk7CisJCXRtcCA9IHBh Z2Vfc2l6ZSB8IChibG9ja19zaXplIDw8IDQpOworCQluYW5kX3dyaXRlcmVnKGN0cmwsIGNmZ19l eHRfb2ZmcywgdG1wKTsKKwl9CisKKwl0bXAgPSBuYW5kX3JlYWRyZWcoY3RybCwgYWNjX2NvbnRy b2xfb2Zmcyk7CisJdG1wICY9IH5icmNtbmFuZF9lY2NfbGV2ZWxfbWFzayhjdHJsKTsKKwl0bXAg fD0gY2ZnLT5lY2NfbGV2ZWwgPDwgTkFORF9BQ0NfQ09OVFJPTF9FQ0NfU0hJRlQ7CisJdG1wICY9 IH5icmNtbmFuZF9zcGFyZV9hcmVhX21hc2soY3RybCk7CisJdG1wIHw9IGNmZy0+c3BhcmVfYXJl YV9zaXplOworCW5hbmRfd3JpdGVyZWcoY3RybCwgYWNjX2NvbnRyb2xfb2ZmcywgdG1wKTsKKwor CWJyY21uYW5kX3NldF9zZWN0b3Jfc2l6ZV8xayhob3N0LCBjZmctPnNlY3Rvcl9zaXplXzFrKTsK KworCS8qIHRocmVzaG9sZCA9IGNlaWwoQkNILWxldmVsICogMC43NSkgKi8KKwlicmNtbmFuZF93 cl9jb3JyX3RocmVzaChob3N0LCBESVZfUk9VTkRfVVAoY2hpcC0+ZWNjLnN0cmVuZ3RoICogMywg NCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJyY21uYW5kX3ByaW50X2NmZyhj aGFyICpidWYsIHN0cnVjdCBicmNtbmFuZF9jZmcgKmNmZykKK3sKKwlidWYgKz0gc3ByaW50Zihi dWYsCisJCSIlbGx1TWlCIHRvdGFsLCAldUtpQiBibG9ja3MsICV1JXMgcGFnZXMsICV1QiBPT0Is ICV1LWJpdCIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpY2ZnLT5kZXZpY2Vfc2l6ZSA+PiAyMCwK KwkJY2ZnLT5ibG9ja19zaXplID4+IDEwLAorCQljZmctPnBhZ2Vfc2l6ZSA+PSAxMDI0ID8gY2Zn LT5wYWdlX3NpemUgPj4gMTAgOiBjZmctPnBhZ2Vfc2l6ZSwKKwkJY2ZnLT5wYWdlX3NpemUgPj0g MTAyNCA/ICJLaUIiIDogIkIiLAorCQljZmctPnNwYXJlX2FyZWFfc2l6ZSwgY2ZnLT5kZXZpY2Vf d2lkdGgpOworCisJLyogQWNjb3VudCBmb3IgSGFtbWluZyBFQ0MgYW5kIGZvciBCQ0ggNTEyQiB2 cyAxS2lCIHNlY3RvcnMgKi8KKwlpZiAoaXNfaGFtbWluZ19lY2MoY2ZnKSkKKwkJc3ByaW50Zihi dWYsICIsIEhhbW1pbmcgRUNDIik7CisJZWxzZSBpZiAoY2ZnLT5zZWN0b3Jfc2l6ZV8xaykKKwkJ c3ByaW50ZihidWYsICIsIEJDSC0ldSAoMUtpQiBzZWN0b3IpIiwgY2ZnLT5lY2NfbGV2ZWwgPDwg MSk7CisJZWxzZQorCQlzcHJpbnRmKGJ1ZiwgIiwgQkNILSV1XG4iLCBjZmctPmVjY19sZXZlbCk7 Cit9CisKKy8qCisgKiBNaW5pbXVtIG51bWJlciBvZiBieXRlcyB0byBhZGRyZXNzIGEgcGFnZS4g Q2FsY3VsYXRlZCBhczoKKyAqICAgICByb3VuZHVwKGxvZzIoc2l6ZSAvIHBhZ2Utc2l6ZSkgLyA4 KQorICoKKyAqIE5COiB0aGUgZm9sbG93aW5nIGRvZXMgbm90ICJyb3VuZCB1cCIgZm9yIG5vbi1w b3dlci1vZi0yICdzaXplJzsgYnV0IHRoaXMgaXMKKyAqICAgICBPSyBiZWNhdXNlIG1hbnkgb3Ro ZXIgdGhpbmdzIHdpbGwgYnJlYWsgaWYgJ3NpemUnIGlzIGlycmVndWxhci4uLgorICovCitzdGF0 aWMgaW5saW5lIGludCBnZXRfYmxrX2Fkcl9ieXRlcyh1NjQgc2l6ZSwgdTMyIHdyaXRlc2l6ZSkK K3sKKwlyZXR1cm4gQUxJR04oaWxvZzIoc2l6ZSkgLSBpbG9nMih3cml0ZXNpemUpLCA4KSA+PiAz OworfQorCitzdGF0aWMgaW50IGJyY21uYW5kX3NldHVwX2RldihzdHJ1Y3QgYnJjbW5hbmRfaG9z dCAqaG9zdCkKK3sKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9ICZob3N0LT5tdGQ7CisJc3RydWN0 IG5hbmRfY2hpcCAqY2hpcCA9ICZob3N0LT5jaGlwOworCXN0cnVjdCBicmNtbmFuZF9jb250cm9s bGVyICpjdHJsID0gaG9zdC0+Y3RybDsKKwlzdHJ1Y3QgYnJjbW5hbmRfY2ZnICpjZmcgPSAmaG9z dC0+aHdjZmc7CisJY2hhciBtc2dbMTI4XTsKKwl1MzIgb2ZmcywgdG1wLCBvb2Jfc2VjdG9yOwor CWludCByZXQ7CisKKwltZW1zZXQoY2ZnLCAwLCBzaXplb2YoKmNmZykpOworCisJcmV0ID0gb2Zf cHJvcGVydHlfcmVhZF91MzIoY2hpcC0+ZG4sICJicmNtLG5hbmQtb29iLXNlY3Rvci1zaXplIiwK KwkJCQkgICAmb29iX3NlY3Rvcik7CisJaWYgKHJldCkgeworCQkvKiBVc2UgZGV0ZWN0ZWQgc2l6 ZSAqLworCQljZmctPnNwYXJlX2FyZWFfc2l6ZSA9IG10ZC0+b29ic2l6ZSAvCisJCQkJCShtdGQt PndyaXRlc2l6ZSA+PiBGQ19TSElGVCk7CisJfSBlbHNlIHsKKwkJY2ZnLT5zcGFyZV9hcmVhX3Np emUgPSBvb2Jfc2VjdG9yOworCX0KKwlpZiAoY2ZnLT5zcGFyZV9hcmVhX3NpemUgPiBjdHJsLT5t YXhfb29iKQorCQljZmctPnNwYXJlX2FyZWFfc2l6ZSA9IGN0cmwtPm1heF9vb2I7CisJLyoKKwkg KiBTZXQgb29ic2l6ZSB0byBiZSBjb25zaXN0ZW50IHdpdGggY29udHJvbGxlcidzIHNwYXJlX2Fy ZWFfc2l6ZSwgYXMKKwkgKiB0aGUgcmVzdCBpcyBpbmFjY2Vzc2libGUuCisJICovCisJbXRkLT5v b2JzaXplID0gY2ZnLT5zcGFyZV9hcmVhX3NpemUgKiAobXRkLT53cml0ZXNpemUgPj4gRkNfU0hJ RlQpOworCisJY2ZnLT5kZXZpY2Vfc2l6ZSA9IG10ZC0+c2l6ZTsKKwljZmctPmJsb2NrX3NpemUg PSBtdGQtPmVyYXNlc2l6ZTsKKwljZmctPnBhZ2Vfc2l6ZSA9IG10ZC0+d3JpdGVzaXplOworCWNm Zy0+ZGV2aWNlX3dpZHRoID0gKGNoaXAtPm9wdGlvbnMgJiBOQU5EX0JVU1dJRFRIXzE2KSA/IDE2 IDogODsKKwljZmctPmNvbF9hZHJfYnl0ZXMgPSAyOworCWNmZy0+YmxrX2Fkcl9ieXRlcyA9IGdl dF9ibGtfYWRyX2J5dGVzKG10ZC0+c2l6ZSwgbXRkLT53cml0ZXNpemUpOworCisJc3dpdGNoIChj aGlwLT5lY2Muc2l6ZSkgeworCWNhc2UgNTEyOgorCQlpZiAoY2hpcC0+ZWNjLnN0cmVuZ3RoID09 IDEpIC8qIEhhbW1pbmcgKi8KKwkJCWNmZy0+ZWNjX2xldmVsID0gMTU7CisJCWVsc2UKKwkJCWNm Zy0+ZWNjX2xldmVsID0gY2hpcC0+ZWNjLnN0cmVuZ3RoOworCQljZmctPnNlY3Rvcl9zaXplXzFr ID0gMDsKKwkJYnJlYWs7CisJY2FzZSAxMDI0OgorCQlpZiAoIShjdHJsLT5mZWF0dXJlcyAmIEJS Q01OQU5EX0hBU18xS19TRUNUT1JTKSkgeworCQkJZGV2X2VycihjdHJsLT5kZXYsICIxS0Igc2Vj dG9ycyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChj aGlwLT5lY2Muc3RyZW5ndGggJiAweDEpIHsKKwkJCWRldl9lcnIoY3RybC0+ZGV2LAorCQkJCSJv ZGQgRUNDIG5vdCBzdXBwb3J0ZWQgd2l0aCAxS0Igc2VjdG9yc1xuIik7CisJCQlyZXR1cm4gLUVJ TlZBTDsKKwkJfQorCisJCWNmZy0+ZWNjX2xldmVsID0gY2hpcC0+ZWNjLnN0cmVuZ3RoID4+IDE7 CisJCWNmZy0+c2VjdG9yX3NpemVfMWsgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZf ZXJyKGN0cmwtPmRldiwgInVuc3VwcG9ydGVkIEVDQyBzaXplOiAlZFxuIiwKKwkJCWNoaXAtPmVj Yy5zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2ZnLT5mdWxfYWRyX2J5dGVzID0g Y2ZnLT5ibGtfYWRyX2J5dGVzOworCWlmIChtdGQtPndyaXRlc2l6ZSA+IDUxMikKKwkJY2ZnLT5m dWxfYWRyX2J5dGVzICs9IGNmZy0+Y29sX2Fkcl9ieXRlczsKKwllbHNlCisJCWNmZy0+ZnVsX2Fk cl9ieXRlcyArPSAxOworCisJcmV0ID0gYnJjbW5hbmRfc2V0X2NmZyhob3N0LCBjZmcpOworCWlm IChyZXQpCisJCXJldHVybiByZXQ7CisKKwlicmNtbmFuZF9zZXRfZWNjX2VuYWJsZWQoaG9zdCwg MSk7CisKKwlicmNtbmFuZF9wcmludF9jZmcobXNnLCBjZmcpOworCWRldl9pbmZvKGN0cmwtPmRl diwgImRldGVjdGVkICVzXG4iLCBtc2cpOworCisJLyogQ29uZmlndXJlIEFDQ19DT05UUk9MICov CisJb2ZmcyA9IGJyY21uYW5kX2NzX29mZnNldChjdHJsLCBob3N0LT5jcywgQlJDTU5BTkRfQ1Nf QUNDX0NPTlRST0wpOworCXRtcCA9IG5hbmRfcmVhZHJlZyhjdHJsLCBvZmZzKTsKKwl0bXAgJj0g fkFDQ19DT05UUk9MX1BBUlRJQUxfUEFHRTsKKwl0bXAgJj0gfkFDQ19DT05UUk9MX1JEX0VSQVNF RDsKKwl0bXAgJj0gfkFDQ19DT05UUk9MX0ZBU1RfUEdNX1JESU47CisJaWYgKGN0cmwtPmZlYXR1 cmVzICYgQlJDTU5BTkRfSEFTX1BSRUZFVENIKSB7CisJCS8qCisJCSAqIEZJWE1FOiBGbGFzaCBE TUEgKyBwcmVmZXRjaCBtYXkgc2VlIHNwdXJpb3VzIGVyYXNlZC1wYWdlIEVDQworCQkgKiBlcnJv cnMKKwkJICovCisJCWlmIChoYXNfZmxhc2hfZG1hKGN0cmwpKQorCQkJdG1wICY9IH5BQ0NfQ09O VFJPTF9QUkVGRVRDSDsKKwkJZWxzZQorCQkJdG1wIHw9IEFDQ19DT05UUk9MX1BSRUZFVENIOwor CX0KKwluYW5kX3dyaXRlcmVnKGN0cmwsIG9mZnMsIHRtcCk7CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBicmNtbmFuZF9pbml0X2NzKHN0cnVjdCBicmNtbmFuZF9ob3N0ICpob3N0KQor eworCXN0cnVjdCBicmNtbmFuZF9jb250cm9sbGVyICpjdHJsID0gaG9zdC0+Y3RybDsKKwlzdHJ1 Y3QgZGV2aWNlX25vZGUgKmRuID0gaG9zdC0+b2Zfbm9kZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2ID0gaG9zdC0+cGRldjsKKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKKwlzdHJ1Y3Qg bmFuZF9jaGlwICpjaGlwOworCWludCByZXQgPSAwOworCXN0cnVjdCBtdGRfcGFydF9wYXJzZXJf ZGF0YSBwcGRhdGEgPSB7IC5vZl9ub2RlID0gZG4gfTsKKworCXJldCA9IG9mX3Byb3BlcnR5X3Jl YWRfdTMyKGRuLCAicmVnIiwgJmhvc3QtPmNzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBk ZXYtPmRldiwgImNhbid0IGdldCBjaGlwLXNlbGVjdFxuIik7CisJCXJldHVybiAtRU5YSU87CisJ fQorCisJbXRkID0gJmhvc3QtPm10ZDsKKwljaGlwID0gJmhvc3QtPmNoaXA7CisKKwljaGlwLT5k biA9IGRuOworCWNoaXAtPnByaXYgPSBob3N0OworCW10ZC0+cHJpdiA9IGNoaXA7CisJbXRkLT5u YW1lID0gZGV2bV9rYXNwcmludGYoJnBkZXYtPmRldiwgR0ZQX0tFUk5FTCwgImJyY21uYW5kLiVk IiwKKwkJCQkgICBob3N0LT5jcyk7CisJbXRkLT5vd25lciA9IFRISVNfTU9EVUxFOworCW10ZC0+ ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisKKwljaGlwLT5JT19BRERSX1IgPSAodm9pZCBfX2lv bWVtICopMHhkZWFkYmVlZjsKKwljaGlwLT5JT19BRERSX1cgPSAodm9pZCBfX2lvbWVtICopMHhk ZWFkYmVlZjsKKworCWNoaXAtPmNtZF9jdHJsID0gYnJjbW5hbmRfY21kX2N0cmw7CisJY2hpcC0+ Y21kZnVuYyA9IGJyY21uYW5kX2NtZGZ1bmM7CisJY2hpcC0+d2FpdGZ1bmMgPSBicmNtbmFuZF93 YWl0ZnVuYzsKKwljaGlwLT5yZWFkX2J5dGUgPSBicmNtbmFuZF9yZWFkX2J5dGU7CisJY2hpcC0+ cmVhZF9idWYgPSBicmNtbmFuZF9yZWFkX2J1ZjsKKwljaGlwLT53cml0ZV9idWYgPSBicmNtbmFu ZF93cml0ZV9idWY7CisKKwljaGlwLT5lY2MubW9kZSA9IE5BTkRfRUNDX0hXOworCWNoaXAtPmVj Yy5yZWFkX3BhZ2UgPSBicmNtbmFuZF9yZWFkX3BhZ2U7CisJY2hpcC0+ZWNjLnJlYWRfc3VicGFn ZSA9IGJyY21uYW5kX3JlYWRfc3VicGFnZTsKKwljaGlwLT5lY2Mud3JpdGVfcGFnZSA9IGJyY21u YW5kX3dyaXRlX3BhZ2U7CisJY2hpcC0+ZWNjLnJlYWRfcGFnZV9yYXcgPSBicmNtbmFuZF9yZWFk X3BhZ2VfcmF3OworCWNoaXAtPmVjYy53cml0ZV9wYWdlX3JhdyA9IGJyY21uYW5kX3dyaXRlX3Bh Z2VfcmF3OworCWNoaXAtPmVjYy53cml0ZV9vb2JfcmF3ID0gYnJjbW5hbmRfd3JpdGVfb29iX3Jh dzsKKwljaGlwLT5lY2MucmVhZF9vb2JfcmF3ID0gYnJjbW5hbmRfcmVhZF9vb2JfcmF3OworCWNo aXAtPmVjYy5yZWFkX29vYiA9IGJyY21uYW5kX3JlYWRfb29iOworCWNoaXAtPmVjYy53cml0ZV9v b2IgPSBicmNtbmFuZF93cml0ZV9vb2I7CisKKwljaGlwLT5jb250cm9sbGVyID0gJmN0cmwtPmNv bnRyb2xsZXI7CisKKwlpZiAobmFuZF9zY2FuX2lkZW50KG10ZCwgMSwgTlVMTCkpCisJCXJldHVy biAtRU5YSU87CisKKwljaGlwLT5vcHRpb25zIHw9IE5BTkRfTk9fU1VCUEFHRV9XUklURTsKKwkv KgorCSAqIEF2b2lkIChmb3IgaW5zdGFuY2UpIGttYXAoKSdkIGJ1ZmZlcnMgZnJvbSBKRkZTMiwg d2hpY2ggd2UgY2FuJ3QgRE1BCisJICogdG8vZnJvbSwgYW5kIGhhdmUgbmFuZF9iYXNlIHBhc3Mg dXMgYSBib3VuY2UgYnVmZmVyIGluc3RlYWQsIGFzCisJICogbmVlZGVkLgorCSAqLworCWNoaXAt Pm9wdGlvbnMgfD0gTkFORF9VU0VfQk9VTkNFX0JVRkZFUjsKKworCWlmIChvZl9nZXRfbmFuZF9v bl9mbGFzaF9iYnQoZG4pKQorCQljaGlwLT5iYnRfb3B0aW9ucyB8PSBOQU5EX0JCVF9VU0VfRkxB U0ggfCBOQU5EX0JCVF9OT19PT0I7CisKKwlpZiAoYnJjbW5hbmRfc2V0dXBfZGV2KGhvc3QpKQor CQlyZXR1cm4gLUVOWElPOworCisJY2hpcC0+ZWNjLnNpemUgPSBob3N0LT5od2NmZy5zZWN0b3Jf c2l6ZV8xayA/IDEwMjQgOiA1MTI7CisJLyogb25seSB1c2Ugb3VyIGludGVybmFsIEhXIHRocmVz aG9sZCAqLworCW10ZC0+Yml0ZmxpcF90aHJlc2hvbGQgPSAxOworCisJY2hpcC0+ZWNjLmxheW91 dCA9IGJyY21zdGJfY2hvb3NlX2VjY19sYXlvdXQoaG9zdCk7CisJaWYgKCFjaGlwLT5lY2MubGF5 b3V0KQorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKG5hbmRfc2Nhbl90YWlsKG10ZCkpCisJCXJl dHVybiAtRU5YSU87CisKKwlyZXR1cm4gbXRkX2RldmljZV9wYXJzZV9yZWdpc3RlcihtdGQsIE5V TEwsICZwcGRhdGEsIE5VTEwsIDApOworfQorCitzdGF0aWMgdm9pZCBicmNtbmFuZF9zYXZlX3Jl c3RvcmVfY3NfY29uZmlnKHN0cnVjdCBicmNtbmFuZF9ob3N0ICpob3N0LAorCQkJCQkgICAgaW50 IHJlc3RvcmUpCit7CisJc3RydWN0IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0cmwgPSBob3N0LT5j dHJsOworCXUxNiBjZmdfb2ZmcyA9IGJyY21uYW5kX2NzX29mZnNldChjdHJsLCBob3N0LT5jcywg QlJDTU5BTkRfQ1NfQ0ZHKTsKKwl1MTYgY2ZnX2V4dF9vZmZzID0gYnJjbW5hbmRfY3Nfb2Zmc2V0 KGN0cmwsIGhvc3QtPmNzLAorCQkJQlJDTU5BTkRfQ1NfQ0ZHX0VYVCk7CisJdTE2IGFjY19jb250 cm9sX29mZnMgPSBicmNtbmFuZF9jc19vZmZzZXQoY3RybCwgaG9zdC0+Y3MsCisJCQlCUkNNTkFO RF9DU19BQ0NfQ09OVFJPTCk7CisJdTE2IHQxX29mZnMgPSBicmNtbmFuZF9jc19vZmZzZXQoY3Ry bCwgaG9zdC0+Y3MsIEJSQ01OQU5EX0NTX1RJTUlORzEpOworCXUxNiB0Ml9vZmZzID0gYnJjbW5h bmRfY3Nfb2Zmc2V0KGN0cmwsIGhvc3QtPmNzLCBCUkNNTkFORF9DU19USU1JTkcyKTsKKworCWlm IChyZXN0b3JlKSB7CisJCW5hbmRfd3JpdGVyZWcoY3RybCwgY2ZnX29mZnMsIGhvc3QtPmh3Y2Zn LmNvbmZpZyk7CisJCWlmIChjZmdfb2ZmcyAhPSBjZmdfZXh0X29mZnMpCisJCQluYW5kX3dyaXRl cmVnKGN0cmwsIGNmZ19leHRfb2ZmcywKKwkJCQkgICAgICBob3N0LT5od2NmZy5jb25maWdfZXh0 KTsKKwkJbmFuZF93cml0ZXJlZyhjdHJsLCBhY2NfY29udHJvbF9vZmZzLCBob3N0LT5od2NmZy5h Y2NfY29udHJvbCk7CisJCW5hbmRfd3JpdGVyZWcoY3RybCwgdDFfb2ZmcywgaG9zdC0+aHdjZmcu dGltaW5nXzEpOworCQluYW5kX3dyaXRlcmVnKGN0cmwsIHQyX29mZnMsIGhvc3QtPmh3Y2ZnLnRp bWluZ18yKTsKKwl9IGVsc2UgeworCQlob3N0LT5od2NmZy5jb25maWcgPSBuYW5kX3JlYWRyZWco Y3RybCwgY2ZnX29mZnMpOworCQlpZiAoY2ZnX29mZnMgIT0gY2ZnX2V4dF9vZmZzKQorCQkJaG9z dC0+aHdjZmcuY29uZmlnX2V4dCA9CisJCQkJbmFuZF9yZWFkcmVnKGN0cmwsIGNmZ19leHRfb2Zm cyk7CisJCWhvc3QtPmh3Y2ZnLmFjY19jb250cm9sID0gbmFuZF9yZWFkcmVnKGN0cmwsIGFjY19j b250cm9sX29mZnMpOworCQlob3N0LT5od2NmZy50aW1pbmdfMSA9IG5hbmRfcmVhZHJlZyhjdHJs LCB0MV9vZmZzKTsKKwkJaG9zdC0+aHdjZmcudGltaW5nXzIgPSBuYW5kX3JlYWRyZWcoY3RybCwg dDJfb2Zmcyk7CisJfQorfQorCitzdGF0aWMgaW50IGJyY21uYW5kX3N1c3BlbmQoc3RydWN0IGRl dmljZSAqZGV2KQoreworCXN0cnVjdCBicmNtbmFuZF9jb250cm9sbGVyICpjdHJsID0gZGV2X2dl dF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJyY21uYW5kX2hvc3QgKmhvc3Q7CisKKwlsaXN0X2Zv cl9lYWNoX2VudHJ5KGhvc3QsICZjdHJsLT5ob3N0X2xpc3QsIG5vZGUpCisJCWJyY21uYW5kX3Nh dmVfcmVzdG9yZV9jc19jb25maWcoaG9zdCwgMCk7CisKKwljdHJsLT5uYW5kX2NzX25hbmRfc2Vs ZWN0ID0gYnJjbW5hbmRfcmVhZF9yZWcoY3RybCwgQlJDTU5BTkRfQ1NfU0VMRUNUKTsKKwljdHJs LT5uYW5kX2NzX25hbmRfeG9yID0gYnJjbW5hbmRfcmVhZF9yZWcoY3RybCwgQlJDTU5BTkRfQ1Nf WE9SKTsKKwljdHJsLT5jb3JyX3N0YXRfdGhyZXNob2xkID0KKwkJYnJjbW5hbmRfcmVhZF9yZWco Y3RybCwgQlJDTU5BTkRfQ09SUl9USFJFU0hPTEQpOworCisJaWYgKGhhc19mbGFzaF9kbWEoY3Ry bCkpCisJCWN0cmwtPmZsYXNoX2RtYV9tb2RlID0gZmxhc2hfZG1hX3JlYWRsKGN0cmwsIEZMQVNI X0RNQV9NT0RFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJyY21uYW5kX3Jlc3Vt ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0 cmwgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYnJjbW5hbmRfaG9zdCAqaG9zdDsK KworCWlmIChoYXNfZmxhc2hfZG1hKGN0cmwpKSB7CisJCWZsYXNoX2RtYV93cml0ZWwoY3RybCwg RkxBU0hfRE1BX01PREUsIGN0cmwtPmZsYXNoX2RtYV9tb2RlKTsKKwkJZmxhc2hfZG1hX3dyaXRl bChjdHJsLCBGTEFTSF9ETUFfRVJST1JfU1RBVFVTLCAwKTsKKwl9CisKKwlicmNtbmFuZF93cml0 ZV9yZWcoY3RybCwgQlJDTU5BTkRfQ1NfU0VMRUNULCBjdHJsLT5uYW5kX2NzX25hbmRfc2VsZWN0 KTsKKwlicmNtbmFuZF93cml0ZV9yZWcoY3RybCwgQlJDTU5BTkRfQ1NfWE9SLCBjdHJsLT5uYW5k X2NzX25hbmRfeG9yKTsKKwlicmNtbmFuZF93cml0ZV9yZWcoY3RybCwgQlJDTU5BTkRfQ09SUl9U SFJFU0hPTEQsCisJCQljdHJsLT5jb3JyX3N0YXRfdGhyZXNob2xkKTsKKworCWxpc3RfZm9yX2Vh Y2hfZW50cnkoaG9zdCwgJmN0cmwtPmhvc3RfbGlzdCwgbm9kZSkgeworCQlzdHJ1Y3QgbXRkX2lu Zm8gKm10ZCA9ICZob3N0LT5tdGQ7CisJCXN0cnVjdCBuYW5kX2NoaXAgKmNoaXAgPSBtdGQtPnBy aXY7CisKKwkJYnJjbW5hbmRfc2F2ZV9yZXN0b3JlX2NzX2NvbmZpZyhob3N0LCAxKTsKKworCQkv KiBSZXNldCB0aGUgY2hpcCwgcmVxdWlyZWQgYnkgc29tZSBjaGlwcyBhZnRlciBwb3dlci11cCAq LworCQljaGlwLT5jbWRmdW5jKG10ZCwgTkFORF9DTURfUkVTRVQsIC0xLCAtMSk7CisJfQorCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBicmNtbmFuZF9w bV9vcHMgPSB7CisJLnN1c3BlbmQJCT0gYnJjbW5hbmRfc3VzcGVuZCwKKwkucmVzdW1lCQkJPSBi cmNtbmFuZF9yZXN1bWUsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBsYXRmb3JtIGRyaXZl ciBzZXR1cCAocGVyIGNvbnRyb2xsZXIpCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQg YnJjbW5hbmRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4gPSBkZXYt Pm9mX25vZGUsICpjaGlsZDsKKwlzdGF0aWMgc3RydWN0IGJyY21uYW5kX2NvbnRyb2xsZXIgKmN0 cmw7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldDsKKworCS8qIFdlIG9ubHkgc3Vw cG9ydCBkZXZpY2UtdHJlZSBpbnN0YW50aWF0aW9uICovCisJaWYgKCFkbikKKwkJcmV0dXJuIC1F Tk9ERVY7CisKKwljdHJsID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjdHJsKSwgR0ZQX0tF Uk5FTCk7CisJaWYgKCFjdHJsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldl9zZXRfZHJ2ZGF0 YShkZXYsIGN0cmwpOworCWN0cmwtPmRldiA9IGRldjsKKworCWluaXRfY29tcGxldGlvbigmY3Ry bC0+ZG9uZSk7CisJaW5pdF9jb21wbGV0aW9uKCZjdHJsLT5kbWFfZG9uZSk7CisJc3Bpbl9sb2Nr X2luaXQoJmN0cmwtPmNvbnRyb2xsZXIubG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY3Ry bC0+Y29udHJvbGxlci53cSk7CisJSU5JVF9MSVNUX0hFQUQoJmN0cmwtPmhvc3RfbGlzdCk7CisK KwkvKiBOQU5EIHJlZ2lzdGVyIHJhbmdlICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNl KHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwljdHJsLT5uYW5kX2Jhc2UgPSBkZXZtX2lvcmVt YXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIoY3RybC0+bmFuZF9iYXNlKSkKKwkJ cmV0dXJuIFBUUl9FUlIoY3RybC0+bmFuZF9iYXNlKTsKKworCS8qIEluaXRpYWxpemUgTkFORCBy ZXZpc2lvbiAqLworCXJldCA9IGJyY21uYW5kX3JldmlzaW9uX2luaXQoY3RybCk7CisJaWYgKHJl dCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogTW9zdCBjaGlwcyBoYXZlIHRoaXMgY2FjaGUg YXQgYSBmaXhlZCBvZmZzZXQgd2l0aGluICduYW5kJyBibG9jay4KKwkgKiBTb21lIG11c3Qgc3Bl Y2lmeSB0aGlzIHJlZ2lvbiBzZXBhcmF0ZWx5LgorCSAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9y ZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJuYW5kLWNhY2hlIik7CisJaWYg KHJlcykgeworCQljdHJsLT5uYW5kX2ZjID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVz KTsKKwkJaWYgKElTX0VSUihjdHJsLT5uYW5kX2ZjKSkKKwkJCXJldHVybiBQVFJfRVJSKGN0cmwt Pm5hbmRfZmMpOworCX0gZWxzZSB7CisJCWN0cmwtPm5hbmRfZmMgPSBjdHJsLT5uYW5kX2Jhc2Ug KworCQkJCWN0cmwtPnJlZ19vZmZzZXRzW0JSQ01OQU5EX0ZDX0JBU0VdOworCX0KKworCS8qIEZM QVNIX0RNQSAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9S RVNPVVJDRV9NRU0sICJmbGFzaC1kbWEiKTsKKwlpZiAocmVzKSB7CisJCWN0cmwtPmZsYXNoX2Rt YV9iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwkJaWYgKElTX0VSUihj dHJsLT5mbGFzaF9kbWFfYmFzZSkpCisJCQlyZXR1cm4gUFRSX0VSUihjdHJsLT5mbGFzaF9kbWFf YmFzZSk7CisKKwkJZmxhc2hfZG1hX3dyaXRlbChjdHJsLCBGTEFTSF9ETUFfTU9ERSwgMSk7IC8q IGxpbmtlZC1saXN0ICovCisJCWZsYXNoX2RtYV93cml0ZWwoY3RybCwgRkxBU0hfRE1BX0VSUk9S X1NUQVRVUywgMCk7CisKKwkJLyogQWxsb2NhdGUgZGVzY3JpcHRvcihzKSAqLworCQljdHJsLT5k bWFfZGVzYyA9IGRtYW1fYWxsb2NfY29oZXJlbnQoZGV2LAorCQkJCQkJICAgICBzaXplb2YoKmN0 cmwtPmRtYV9kZXNjKSwKKwkJCQkJCSAgICAgJmN0cmwtPmRtYV9wYSwgR0ZQX0tFUk5FTCk7CisJ CWlmICghY3RybC0+ZG1hX2Rlc2MpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQljdHJsLT5kbWFf aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwkJaWYgKChpbnQpY3RybC0+ZG1hX2ly cSA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAibWlzc2luZyBGTEFTSF9ETUEgSVJRXG4iKTsKKwkJ CXJldHVybiAtRU5PREVWOworCQl9CisKKwkJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGN0 cmwtPmRtYV9pcnEsCisJCQkJYnJjbW5hbmRfZG1hX2lycSwgMCwgRFJWX05BTUUsCisJCQkJY3Ry bCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRldiwgImNhbid0IGFsbG9jYXRlIElS USAlZDogZXJyb3IgJWRcbiIsCisJCQkJCWN0cmwtPmRtYV9pcnEsIHJldCk7CisJCQlyZXR1cm4g cmV0OworCQl9CisKKwkJZGV2X2luZm8oZGV2LCAiZW5hYmxpbmcgRkxBU0hfRE1BXG4iKTsKKwl9 CisKKwkvKiBEaXNhYmxlIGF1dG9tYXRpYyBkZXZpY2UgSUQgY29uZmlnLCBkaXJlY3QgYWRkcmVz c2luZyAqLworCWJyY21uYW5kX3Jtd19yZWcoY3RybCwgQlJDTU5BTkRfQ1NfU0VMRUNULAorCQkJ IENTX1NFTEVDVF9BVVRPX0RFVklDRV9JRF9DRkcgfCAweGZmLCAwLCAwKTsKKwkvKiBEaXNhYmxl IFhPUiBhZGRyZXNzaW5nICovCisJYnJjbW5hbmRfcm13X3JlZyhjdHJsLCBCUkNNTkFORF9DU19Y T1IsIDB4ZmYsIDAsIDApOworCisJaWYgKGN0cmwtPmZlYXR1cmVzICYgQlJDTU5BTkRfSEFTX1dQ KSB7CisJCS8qIFBlcm1hbmVudGx5IGRpc2FibGUgd3JpdGUgcHJvdGVjdGlvbiAqLworCQlpZiAo d3Bfb24gPT0gMikKKwkJCWJyY21uYW5kX3NldF93cChjdHJsLCBmYWxzZSk7CisJfSBlbHNlIHsK KwkJd3Bfb24gPSAwOworCX0KKworCS8qIElSUSAqLworCWN0cmwtPmlycSA9IHBsYXRmb3JtX2dl dF9pcnEocGRldiwgMCk7CisJaWYgKChpbnQpY3RybC0+aXJxIDwgMCkgeworCQlkZXZfZXJyKGRl diwgIm5vIElSUSBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0ID0g ZGV2bV9yZXF1ZXN0X2lycShkZXYsIGN0cmwtPmlycSwgYnJjbW5hbmRfY3RscmR5X2lycSwgMCwK KwkJCURSVl9OQU1FLCBjdHJsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImNh bid0IGFsbG9jYXRlIElSUSAlZDogZXJyb3IgJWRcbiIsCisJCQljdHJsLT5pcnEsIHJldCk7CisJ CXJldHVybiByZXQ7CisJfQorCisJZm9yX2VhY2hfYXZhaWxhYmxlX2NoaWxkX29mX25vZGUoZG4s IGNoaWxkKSB7CisJCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShjaGlsZCwgImJyY20sbmFu ZGNzIikpIHsKKwkJCXN0cnVjdCBicmNtbmFuZF9ob3N0ICpob3N0OworCisJCQlob3N0ID0gZGV2 bV9remFsbG9jKGRldiwgc2l6ZW9mKCpob3N0KSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWhvc3Qp CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlob3N0LT5wZGV2ID0gcGRldjsKKwkJCWhvc3QtPmN0 cmwgPSBjdHJsOworCQkJaG9zdC0+b2Zfbm9kZSA9IGNoaWxkOworCisJCQlyZXQgPSBicmNtbmFu ZF9pbml0X2NzKGhvc3QpOworCQkJaWYgKHJldCkKKwkJCQljb250aW51ZTsgLyogVHJ5IGFsbCBj aGlwLXNlbGVjdHMgKi8KKworCQkJbGlzdF9hZGRfdGFpbCgmaG9zdC0+bm9kZSwgJmN0cmwtPmhv c3RfbGlzdCk7CisJCX0KKwl9CisKKwkvKiBObyBjaGlwLXNlbGVjdHMgY291bGQgaW5pdGlhbGl6 ZSBwcm9wZXJseSAqLworCWlmIChsaXN0X2VtcHR5KCZjdHJsLT5ob3N0X2xpc3QpKQorCQlyZXR1 cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJyY21uYW5kX3JlbW92 ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBicmNtbmFuZF9jb250 cm9sbGVyICpjdHJsID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBicmNt bmFuZF9ob3N0ICpob3N0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShob3N0LCAmY3RybC0+aG9z dF9saXN0LCBub2RlKQorCQluYW5kX3JlbGVhc2UoJmhvc3QtPm10ZCk7CisKKwlkZXZfc2V0X2Ry dmRhdGEoJnBkZXYtPmRldiwgTlVMTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0 IHN0cnVjdCBvZl9kZXZpY2VfaWQgYnJjbW5hbmRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRp YmxlID0gImJyY20sYnJjbW5hbmQtdjQuMCIgfSwKKwl7IC5jb21wYXRpYmxlID0gImJyY20sYnJj bW5hbmQtdjUuMCIgfSwKKwl7IC5jb21wYXRpYmxlID0gImJyY20sYnJjbW5hbmQtdjYuMCIgfSwK Kwl7IC5jb21wYXRpYmxlID0gImJyY20sYnJjbW5hbmQtdjYuMSIgfSwKKwl7IC5jb21wYXRpYmxl ID0gImJyY20sYnJjbW5hbmQtdjcuMCIgfSwKKwl7IC5jb21wYXRpYmxlID0gImJyY20sYnJjbW5h bmQtdjcuMSIgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBicmNtbmFuZF9v Zl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJyY21zdGJfbmFuZF9k cml2ZXIgPSB7CisJLnByb2JlCQkJPSBicmNtbmFuZF9wcm9iZSwKKwkucmVtb3ZlCQkJPSBicmNt bmFuZF9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJCT0gRFJWX05BTUUsCisJCS5wbQkJ PSAmYnJjbW5hbmRfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoYnJj bW5hbmRfb2ZfbWF0Y2gpLAorCX0KK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJyY21zdGJf bmFuZF9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9S KCJLZXZpbiBDZXJuZWtlZSIpOworTU9EVUxFX0FVVEhPUigiQnJpYW4gTm9ycmlzIik7CitNT0RV TEVfREVTQ1JJUFRJT04oIk5BTkQgZHJpdmVyIGZvciBCcm9hZGNvbSBTVEIgY2hpcHMiKTsKK01P RFVMRV9BTElBUygicGxhdGZvcm06YnJjbW5hbmQiKTsKLS0gCjEuOS4xCgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkxpbnV4IE1URCBkaXNj dXNzaW9uIG1haWxpbmcgbGlzdApodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2xpbnV4LW10ZC8K