From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hyun Kwon Subject: [PATCH v6 3/5] drm: xlnx: DRM KMS driver for Xilinx ZynqMP DP subsystem display Date: Fri, 16 Mar 2018 18:06:06 -0700 Message-ID: <1521248768-16202-3-git-send-email-hyun.kwon@xilinx.com> References: <1521248768-16202-1-git-send-email-hyun.kwon@xilinx.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from NAM02-SN1-obe.outbound.protection.outlook.com (mail-sn1nam02on0076.outbound.protection.outlook.com [104.47.36.76]) by gabe.freedesktop.org (Postfix) with ESMTPS id 02B876EC19 for ; Sat, 17 Mar 2018 01:06:35 +0000 (UTC) In-Reply-To: <1521248768-16202-1-git-send-email-hyun.kwon@xilinx.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org Cc: Daniel Vetter , Rob Herring , Michal Simek , Hyun Kwon , Laurent Pinchart List-Id: dri-devel@lists.freedesktop.org WGlsaW54IFp5bnFNUCBoYXMgYSBoYXJkZW5lZCBkaXNwbGF5IHBpcGVsaW5lLiBUaGUgcGlwZWxp bmUgY2FuCmJlIGxvZ2ljYWxseSBwYXJ0aXRpb25lZCBpbnRvIDIgcGFydHM6IGRpc3BsYXkgY29u dHJvbGxlciBhbmQKRGlzcGxheVBvcnQgZW5jb2RlciAvIHRyYW5zbWl0dGVyLiBUaGlzIGRyaXZl ciBoYW5kbGVzIHRoZSBkaXNwbGF5CmNvbnRyb2xsZXIgcGFydCBvZiB0aGUgcGlwZWxpbmUgdGhh dCBoYW5kbGVzIGJ1ZmZlciBtYW5hZ2VtZW50IGFuZApibGVuZGluZy4KClNpZ25lZC1vZmYtYnk6 IEh5dW4gS3dvbiA8aHl1bi5rd29uQHhpbGlueC5jb20+CkFja2VkLWJ5OiBEYW5pZWwgVmV0dGVy IDxkYW5pZWwudmV0dGVyQGZmd2xsLmNoPgotLS0KdjYKLSBVc2UgdGhlIG5ldyBjcnRjIG9wIHN0 cnVjdAotIENsZWFuIHVwIHRoZSBkdXBsaWNhdGVkIGxpY2Vuc2UgcGFyYWdyYXBocwotIERlY2xh cmUgZnVuY3Rpb24gcG9pbnRlciBzdHJ1Y3R1cmVzIGFzIHN0YXRpYyBjb25zdAotIERvIGNvbXBs ZXRlIGZvcndhcmQgZGVjbGFyYXRpb24gaW4gaGVhZGVycwp2NAotIFVzZSBkcm1fY3J0Y19mdW5j cyBmb3IgdmJsYW5rCi0gUmVtb3ZlIGNoaWxkIG5vZGVzIGZvciBsYXllcgp2MwotIEZpeCBhIHNt YWxsIHR5cG8KdjIKLSBVc2UgZHJtX2ZiX2NtYV9nZXRfZ2VtX2FkZHIoKQotIFVzZSBkcm1fY3J0 Y19hcm1fdmJsYW5rX2V2ZW50KCkKLSBTcGxpdCBkcm0gcHJvcGVydGllcyBpbnRvIGEgc2VwYXJh dGUgcGF0Y2gKLSBSZW1vdmUgZHVtbXkgZnVuY3MKLSBEb24ndCBhZGQgb2Zmc2V0IGFzIGl0J3Mg YWxyZWFkeSBkb25lIGJ5IGEgbmV3IGhlbHBlcgotIENoYW5nZSB0aGUgU1BEWCBpZGVudGlmaWVy IGZvcm1hdAotIE1pbm9yIGNoYW5nZSBvZiBhIGNvbW1pdCBtZXNzYWdlCi0tLQotLS0KIGRyaXZl cnMvZ3B1L2RybS94bG54L3p5bnFtcF9kaXNwLmMgfCAyNjcxICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKwogZHJpdmVycy9ncHUvZHJtL3hsbngvenlucW1wX2Rpc3AuaCB8ICAg MjkgKwogMiBmaWxlcyBjaGFuZ2VkLCAyNzAwIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEw MDY0NCBkcml2ZXJzL2dwdS9kcm0veGxueC96eW5xbXBfZGlzcC5jCiBjcmVhdGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9ncHUvZHJtL3hsbngvenlucW1wX2Rpc3AuaAoKZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS94bG54L3p5bnFtcF9kaXNwLmMgYi9kcml2ZXJzL2dwdS9kcm0veGxueC96eW5x bXBfZGlzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMTZjZGMKLS0t IC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0veGxueC96eW5xbXBfZGlzcC5jCkBAIC0w LDAgKzEsMjY3MSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisg KiBaeW5xTVAgRGlzcGxheSBDb250cm9sbGVyIERyaXZlcgorICoKKyAqICBDb3B5cmlnaHQgKEMp IDIwMTcgLSAyMDE4IFhpbGlueCwgSW5jLgorICoKKyAqICBBdXRob3I6IEh5dW4gV29vIEt3b24g PGh5dW4ua3dvbkB4aWxpbnguY29tPgorICovCisKKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgorI2lu Y2x1ZGUgPGRybS9kcm1fYXRvbWljLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9hdG9taWNfaGVscGVy Lmg+CisjaW5jbHVkZSA8ZHJtL2RybV9jcnRjLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hl bHBlci5oPgorI2luY2x1ZGUgPGRybS9kcm1fZmJfY21hX2hlbHBlci5oPgorI2luY2x1ZGUgPGRy bS9kcm1fZm91cmNjLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9wbGFuZV9oZWxwZXIuaD4KKworI2lu Y2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUg PGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1 ZGUgPGxpbnV4L2lycXJldHVybi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxp bnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZG1hLmg+CisjaW5jbHVkZSA8bGludXgvcGxh dGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUg PGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVk ZSAieGxueF9jcnRjLmgiCisjaW5jbHVkZSAieGxueF9mYi5oIgorI2luY2x1ZGUgInp5bnFtcF9k aXNwLmgiCisjaW5jbHVkZSAienlucW1wX2RwLmgiCisjaW5jbHVkZSAienlucW1wX2Rwc3ViLmgi CisKKy8qCisgKiBPdmVydmlldworICogLS0tLS0tLS0KKyAqCisgKiBUaGUgZGlzcGxheSBwYXJ0 IG9mIFp5bnFNUCBEUCBzdWJzeXN0ZW0uIEludGVybmFsbHksIHRoZSBkZXZpY2UKKyAqIGlzIHBh cnRpdGlvbmVkIGludG8gMyBibG9ja3M6IEFWIGJ1ZmZlciBtYW5hZ2VyLCBCbGVuZGVyLCBBdWRp by4KKyAqIFRoZSBkcml2ZXIgY3JlYXRlcyB0aGUgRFJNIGNydGMgYW5kIHBsYW5lIG9iamVjdGVz IGFuZCBtYXBzIHRoZSBEUk0KKyAqIGludGVyZmFjZSBpbnRvIHRob3NlIDMgYmxvY2tzLiBJbiBo aWdoIGxldmVsLCB0aGUgZHJpdmVyIGlzIGxheWVyZWQKKyAqIGluIHRoZSBmb2xsb3dpbmcgd2F5 OgorICoKKyAqIHp5bnFtcF9kaXNwX2NydGMgJiB6eW5xbXBfZGlzcF9wbGFuZQorICogfC0+enlu cW1wX2Rpc3AKKyAqCXwtPnp5bnFtcF9kaXNwX2F1ZAorICoJfC0+enlucW1wX2Rpc3BfYmxlbmQK KyAqCXwtPnp5bnFtcF9kaXNwX2F2X2J1ZgorICoKKyAqIFRoZSBkcml2ZXIgQVBJcyBhcmUgdXNl ZCBleHRlcm5hbGx5IGJ5CisgKiAtIHp5bnFtcF9kcHN1YjogVG9wIGxldmVsIFp5bnFNUCBEUCBz dWJzeXN0ZW0gZHJpdmVyCisgKiAtIHp5bnFtcF9kcDogWnlucU1QIERQIGRyaXZlcgorICogLSB4 bG54X2NydGM6IFhpbGlueCBEUk0gc3BlY2lmaWMgY3J0YyBmdW5jdGlvbnMKKyAqLworCisvKiBC bGVuZGVyIHJlZ2lzdGVycyAqLworI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0JHX0NMUl8w CQkJMHgwCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfQkdfQ0xSXzEJCQkweDQKKyNkZWZp bmUgWllOUU1QX0RJU1BfVl9CTEVORF9CR19DTFJfMgkJCTB4OAorI2RlZmluZSBaWU5RTVBfRElT UF9WX0JMRU5EX0JHX01BWAkJCTB4ZmZmCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfU0VU X0dMT0JBTF9BTFBIQQkJMHhjCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfU0VUX0dMT0JB TF9BTFBIQV9NQVNLCTB4MWZlCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfU0VUX0dMT0JB TF9BTFBIQV9NQVgJMHhmZgorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX09VVFBVVF9WSURf Rk1UCQkweDE0CisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfT1VUUFVUX1ZJRF9GTVRfUkdC CQkweDAKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9PVVRQVVRfVklEX0ZNVF9ZQ0JDUjQ0 NAkweDEKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9PVVRQVVRfVklEX0ZNVF9ZQ0JDUjQy MgkweDIKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9PVVRQVVRfVklEX0ZNVF9ZT05MWQkw eDMKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9PVVRQVVRfVklEX0ZNVF9YVllDQwkweDQK KyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9PVVRQVVRfRU5fRE9XTlNBTVBMRQlCSVQoNCkK KyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9MQVlFUl9DT05UUk9MCQkweDE4CisjZGVmaW5l IFpZTlFNUF9ESVNQX1ZfQkxFTkRfTEFZRVJfQ09OVFJPTF9FTl9VUwkJQklUKDApCisjZGVmaW5l IFpZTlFNUF9ESVNQX1ZfQkxFTkRfTEFZRVJfQ09OVFJPTF9SR0IJCUJJVCgxKQorI2RlZmluZSBa WU5RTVBfRElTUF9WX0JMRU5EX0xBWUVSX0NPTlRST0xfQllQQVNTCUJJVCg4KQorI2RlZmluZSBa WU5RTVBfRElTUF9WX0JMRU5EX05VTV9DT0VGRgkJCTkKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9C TEVORF9SR0IyWUNCQ1JfQ09FRkYwCQkweDIwCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRf UkdCMllDQkNSX0NPRUZGMQkJMHgyNAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX1JHQjJZ Q0JDUl9DT0VGRjIJCTB4MjgKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9SR0IyWUNCQ1Jf Q09FRkYzCQkweDJjCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfUkdCMllDQkNSX0NPRUZG NAkJMHgzMAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX1JHQjJZQ0JDUl9DT0VGRjUJCTB4 MzQKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9SR0IyWUNCQ1JfQ09FRkY2CQkweDM4Cisj ZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfUkdCMllDQkNSX0NPRUZGNwkJMHgzYworI2RlZmlu ZSBaWU5RTVBfRElTUF9WX0JMRU5EX1JHQjJZQ0JDUl9DT0VGRjgJCTB4NDAKKyNkZWZpbmUgWllO UU1QX0RJU1BfVl9CTEVORF9JTjFDU0NfQ09FRkYwCQkweDQ0CisjZGVmaW5lIFpZTlFNUF9ESVNQ X1ZfQkxFTkRfSU4xQ1NDX0NPRUZGMQkJMHg0OAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5E X0lOMUNTQ19DT0VGRjIJCTB4NGMKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9JTjFDU0Nf Q09FRkYzCQkweDUwCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfSU4xQ1NDX0NPRUZGNAkJ MHg1NAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0lOMUNTQ19DT0VGRjUJCTB4NTgKKyNk ZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9JTjFDU0NfQ09FRkY2CQkweDVjCisjZGVmaW5lIFpZ TlFNUF9ESVNQX1ZfQkxFTkRfSU4xQ1NDX0NPRUZGNwkJMHg2MAorI2RlZmluZSBaWU5RTVBfRElT UF9WX0JMRU5EX0lOMUNTQ19DT0VGRjgJCTB4NjQKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVO RF9OVU1fT0ZGU0VUCQkJMworI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0xVTUFfSU4xQ1ND X09GRlNFVAkJMHg2OAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0NSX0lOMUNTQ19PRkZT RVQJCTB4NmMKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9DQl9JTjFDU0NfT0ZGU0VUCQkw eDcwCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfTFVNQV9PVVRDU0NfT0ZGU0VUCQkweDc0 CisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfQ1JfT1VUQ1NDX09GRlNFVAkJMHg3OAorI2Rl ZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0NCX09VVENTQ19PRkZTRVQJCTB4N2MKKyNkZWZpbmUg WllOUU1QX0RJU1BfVl9CTEVORF9JTjJDU0NfQ09FRkYwCQkweDgwCisjZGVmaW5lIFpZTlFNUF9E SVNQX1ZfQkxFTkRfSU4yQ1NDX0NPRUZGMQkJMHg4NAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JM RU5EX0lOMkNTQ19DT0VGRjIJCTB4ODgKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9JTjJD U0NfQ09FRkYzCQkweDhjCisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfSU4yQ1NDX0NPRUZG NAkJMHg5MAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0lOMkNTQ19DT0VGRjUJCTB4OTQK KyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9JTjJDU0NfQ09FRkY2CQkweDk4CisjZGVmaW5l IFpZTlFNUF9ESVNQX1ZfQkxFTkRfSU4yQ1NDX0NPRUZGNwkJMHg5YworI2RlZmluZSBaWU5RTVBf RElTUF9WX0JMRU5EX0lOMkNTQ19DT0VGRjgJCTB4YTAKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9C TEVORF9MVU1BX0lOMkNTQ19PRkZTRVQJCTB4YTQKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVO RF9DUl9JTjJDU0NfT0ZGU0VUCQkweGE4CisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfQ0Jf SU4yQ1NDX09GRlNFVAkJMHhhYworI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0NIUk9NQV9L RVlfRU5BQkxFCQkweDFkMAorI2RlZmluZSBaWU5RTVBfRElTUF9WX0JMRU5EX0NIUk9NQV9LRVlf Q09NUDEJCTB4MWQ0CisjZGVmaW5lIFpZTlFNUF9ESVNQX1ZfQkxFTkRfQ0hST01BX0tFWV9DT01Q MgkJMHgxZDgKKyNkZWZpbmUgWllOUU1QX0RJU1BfVl9CTEVORF9DSFJPTUFfS0VZX0NPTVAzCQkw eDFkYworCisvKiBBViBidWZmZXIgbWFuYWdlciByZWdpc3RlcnMgKi8KKyNkZWZpbmUgWllOUU1Q X0RJU1BfQVZfQlVGX0ZNVAkJCQkweDAKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9O TF9WSURfU0hJRlQJCTAKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfTUFT SwkJKDB4MWYgPDwgMCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfVVlW WQkJKDAgPDwgMCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfVllVWQkJ KDEgPDwgMCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVZZVQkJKDIg PDwgMCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVVZVgkJKDMgPDwg MCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYxNgkJKDQgPDwgMCkK KyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYyNAkJKDUgPDwgMCkKKyNk ZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYxNkNJCQkoNiA8PCAwKQorI2Rl ZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9NT05PCQkoNyA8PCAwKQorI2RlZmlu ZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9ZVjE2Q0kyCQkoOCA8PCAwKQorI2RlZmlu ZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9ZVVY0NDQJCSg5IDw8IDApCisjZGVmaW5l IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1JHQjg4OAkJKDEwIDw8IDApCisjZGVmaW5l IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1JHQkE4ODgwCQkoMTEgPDwgMCkKKyNkZWZp bmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfUkdCODg4XzEwCQkoMTIgPDwgMCkKKyNk ZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVVWNDQ0XzEwCQkoMTMgPDwgMCkK KyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYxNkNJMl8xMAkoMTQgPDwg MCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYxNkNJXzEwCQkoMTUg PDwgMCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYxNl8xMAkJKDE2 IDw8IDApCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1lWMjRfMTAJCSgx NyA8PCAwKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9ZT05MWV8xMAkJ KDE4IDw8IDApCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1lWMTZfNDIw CQkoMTkgPDwgMCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYxNkNJ XzQyMAkoMjAgPDwgMCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYx NkNJMl80MjAJKDIxIDw8IDApCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklE X1lWMTZfNDIwXzEwCSgyMiA8PCAwKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05M X1ZJRF9ZVjE2Q0lfNDIwXzEwCSgyMyA8PCAwKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZf Rk1UX05MX1ZJRF9ZVjE2Q0kyXzQyMF8xMAkoMjQgPDwgMCkKKyNkZWZpbmUgWllOUU1QX0RJU1Bf QVZfQlVGX0ZNVF9OTF9HRlhfU0hJRlQJCTgKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZN VF9OTF9HRlhfTUFTSwkJKDB4ZiA8PCA4KQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1U X05MX0dGWF9SR0JBODg4OAkJKDAgPDwgOCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZN VF9OTF9HRlhfQUJHUjg4ODgJCSgxIDw8IDgpCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9G TVRfTkxfR0ZYX1JHQjg4OAkJKDIgPDwgOCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZN VF9OTF9HRlhfQkdSODg4CQkoMyA8PCA4KQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfRk1U X05MX0dGWF9SR0JBNTU1MQkJKDQgPDwgOCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZN VF9OTF9HRlhfUkdCQTQ0NDQJCSg1IDw8IDgpCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9G TVRfTkxfR0ZYX1JHQjU2NQkJKDYgPDwgOCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZN VF9OTF9HRlhfOEJQUAkJKDcgPDwgOCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9O TF9HRlhfNEJQUAkJKDggPDwgOCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9H RlhfMkJQUAkJKDkgPDwgOCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9HRlhf MUJQUAkJKDEwIDw8IDgpCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9OT05fTElWRV9MQVRF TkNZCQkweDgKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0NIQlVGCQkJMHgxMAorI2RlZmlu ZSBaWU5RTVBfRElTUF9BVl9CVUZfQ0hCVUZfRU4JCQlCSVQoMCkKKyNkZWZpbmUgWllOUU1QX0RJ U1BfQVZfQlVGX0NIQlVGX0ZMVVNICQkJQklUKDEpCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JV Rl9DSEJVRl9CVVJTVF9MRU5fU0hJRlQJMgorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfQ0hC VUZfQlVSU1RfTEVOX01BU0sJCSgweGYgPDwgMikKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVG X0NIQlVGX0JVUlNUX0xFTl9NQVgJCTB4ZgorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfQ0hC VUZfQlVSU1RfTEVOX0FVRF9NQVgJMHgzCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9TVEFU VVMJCQkweDI4CisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9TVENfQ1RSTAkJCTB4MmMKKyNk ZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX1NUQ19DVFJMX0VOCQkJQklUKDApCisjZGVmaW5lIFpZ TlFNUF9ESVNQX0FWX0JVRl9TVENfQ1RSTF9FVkVOVF9TSElGVAkJMQorI2RlZmluZSBaWU5RTVBf RElTUF9BVl9CVUZfU1RDX0NUUkxfRVZFTlRfRVhfVlNZTkMJMAorI2RlZmluZSBaWU5RTVBfRElT UF9BVl9CVUZfU1RDX0NUUkxfRVZFTlRfRVhfVklECTEKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZf QlVGX1NUQ19DVFJMX0VWRU5UX0VYX0FVRAkyCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9T VENfQ1RSTF9FVkVOVF9JTlRfVlNZTkMJMworI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfU1RD X0lOSVRfVkFMVUUwCQkweDMwCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9TVENfSU5JVF9W QUxVRTEJCTB4MzQKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX1NUQ19BREoJCQkweDM4Cisj ZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9TVENfVklEX1ZTWU5DX1RTMAkJMHgzYworI2RlZmlu ZSBaWU5RTVBfRElTUF9BVl9CVUZfU1RDX1ZJRF9WU1lOQ19UUzEJCTB4NDAKKyNkZWZpbmUgWllO UU1QX0RJU1BfQVZfQlVGX1NUQ19FWFRfVlNZTkNfVFMwCQkweDQ0CisjZGVmaW5lIFpZTlFNUF9E SVNQX0FWX0JVRl9TVENfRVhUX1ZTWU5DX1RTMQkJMHg0OAorI2RlZmluZSBaWU5RTVBfRElTUF9B Vl9CVUZfU1RDX0NVU1RPTV9FVkVOVF9UUzAJCTB4NGMKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZf QlVGX1NUQ19DVVNUT01fRVZFTlRfVFMxCQkweDUwCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JV Rl9TVENfQ1VTVE9NX0VWRU5UMl9UUzAJMHg1NAorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZf U1RDX0NVU1RPTV9FVkVOVDJfVFMxCTB4NTgKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX1NU Q19TTkFQU0hPVDAJCTB4NjAKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX1NUQ19TTkFQU0hP VDEJCTB4NjQKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVAkJCTB4NzAKKyNkZWZp bmUgWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVF9WSUQxX1NISUZUCQkwCisjZGVmaW5lIFpZTlFN UF9ESVNQX0FWX0JVRl9PVVRQVVRfVklEMV9NQVNLCQkoMHgzIDw8IDApCisjZGVmaW5lIFpZTlFN UF9ESVNQX0FWX0JVRl9PVVRQVVRfVklEMV9MSVZFCQkoMCA8PCAwKQorI2RlZmluZSBaWU5RTVBf RElTUF9BVl9CVUZfT1VUUFVUX1ZJRDFfTUVNCQkoMSA8PCAwKQorI2RlZmluZSBaWU5RTVBfRElT UF9BVl9CVUZfT1VUUFVUX1ZJRDFfUEFUVEVSTgkJKDIgPDwgMCkKKyNkZWZpbmUgWllOUU1QX0RJ U1BfQVZfQlVGX09VVFBVVF9WSUQxX05PTkUJCSgzIDw8IDApCisjZGVmaW5lIFpZTlFNUF9ESVNQ X0FWX0JVRl9PVVRQVVRfVklEMl9TSElGVAkJMgorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZf T1VUUFVUX1ZJRDJfTUFTSwkJKDB4MyA8PCAyKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZf T1VUUFVUX1ZJRDJfRElTQUJMRQkJKDAgPDwgMikKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVG X09VVFBVVF9WSUQyX01FTQkJKDEgPDwgMikKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX09V VFBVVF9WSUQyX0xJVkUJCSgyIDw8IDIpCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQ VVRfVklEMl9OT05FCQkoMyA8PCAyKQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVU X0FVRDFfU0hJRlQJCTQKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVF9BVUQxX01B U0sJCSgweDMgPDwgNCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVF9BVUQxX1BM CQkoMCA8PCA0KQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX0FVRDFfTUVNCQko MSA8PCA0KQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX0FVRDFfUEFUVEVSTgkJ KDIgPDwgNCkKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVF9BVUQxX0RJU0FCTEUJ CSgzIDw8IDQpCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfQVVEMl9FTgkJQklU KDYpCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9IQ09VTlRfVkNPVU5UX0lOVDAJCTB4NzQK KyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0hDT1VOVF9WQ09VTlRfSU5UMQkJMHg3OAorI2Rl ZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfUEFUVEVSTl9HRU5fU0VMRUNUCQkweDEwMAorI2RlZmlu ZSBaWU5RTVBfRElTUF9BVl9CVUZfQ0xLX1NSQwkJCTB4MTIwCisjZGVmaW5lIFpZTlFNUF9ESVNQ X0FWX0JVRl9DTEtfU1JDX1ZJRF9GUk9NX1BTCQlCSVQoMCkKKyNkZWZpbmUgWllOUU1QX0RJU1Bf QVZfQlVGX0NMS19TUkNfQVVEX0ZST01fUFMJCUJJVCgxKQorI2RlZmluZSBaWU5RTVBfRElTUF9B Vl9CVUZfQ0xLX1NSQ19WSURfSU5URVJOQUxfVElNSU5HCUJJVCgyKQorI2RlZmluZSBaWU5RTVBf RElTUF9BVl9CVUZfU1JTVF9SRUcJCQkweDEyNAorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZf U1JTVF9SRUdfVklEX1JTVAkJQklUKDEpCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9BVURJ T19DSF9DT05GSUcJCTB4MTJjCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9HRlhfQ09NUDBf U0YJCQkweDIwMAorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfR0ZYX0NPTVAxX1NGCQkJMHgy MDQKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0dGWF9DT01QMl9TRgkJCTB4MjA4CisjZGVm aW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9WSURfQ09NUDBfU0YJCQkweDIwYworI2RlZmluZSBaWU5R TVBfRElTUF9BVl9CVUZfVklEX0NPTVAxX1NGCQkJMHgyMTAKKyNkZWZpbmUgWllOUU1QX0RJU1Bf QVZfQlVGX1ZJRF9DT01QMl9TRgkJCTB4MjE0CisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9M SVZFX1ZJRF9DT01QMF9TRgkJMHgyMTgKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0xJVkVf VklEX0NPTVAxX1NGCQkweDIxYworI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfTElWRV9WSURf Q09NUDJfU0YJCTB4MjIwCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZFX1ZJRF9DT05G SUcJCTB4MjI0CisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZFX0dGWF9DT01QMF9TRgkJ MHgyMjgKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0xJVkVfR0ZYX0NPTVAxX1NGCQkweDIy YworI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfTElWRV9HRlhfQ09NUDJfU0YJCTB4MjMwCisj ZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZFX0dGWF9DT05GSUcJCTB4MjM0CisjZGVmaW5l IFpZTlFNUF9ESVNQX0FWX0JVRl80QklUX1NGCQkJMHgxMTExMQorI2RlZmluZSBaWU5RTVBfRElT UF9BVl9CVUZfNUJJVF9TRgkJCTB4MTA4NDIKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGXzZC SVRfU0YJCQkweDEwNDEwCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGCQkJMHgx MDEwMQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfMTBCSVRfU0YJCQkweDEwMDQwCisjZGVm aW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9OVUxMX1NGCQkJMAorI2RlZmluZSBaWU5RTVBfRElTUF9B Vl9CVUZfTlVNX1NGCQkJMworI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfTElWRV9DT05GSUdf QlBDXzYJCTB4MAorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfTElWRV9DT05GSUdfQlBDXzgJ CTB4MQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfTElWRV9DT05GSUdfQlBDXzEwCQkweDIK KyNkZWZpbmUgWllOUU1QX0RJU1BfQVZfQlVGX0xJVkVfQ09ORklHX0JQQ18xMgkJMHgzCisjZGVm aW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZFX0NPTkZJR19CUENfTUFTSwkJR0VOTUFTSygyLCAw KQorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfTElWRV9DT05GSUdfRk1UX1JHQgkJMHgwCisj ZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZFX0NPTkZJR19GTVRfWVVWNDQ0CTB4MQorI2Rl ZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfTElWRV9DT05GSUdfRk1UX1lVVjQyMgkweDIKKyNkZWZp bmUgWllOUU1QX0RJU1BfQVZfQlVGX0xJVkVfQ09ORklHX0ZNVF9ZT05MWQkweDMKKyNkZWZpbmUg WllOUU1QX0RJU1BfQVZfQlVGX0xJVkVfQ09ORklHX0ZNVF9NQVNLCQlHRU5NQVNLKDUsIDQpCisj ZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZFX0NPTkZJR19DQl9GSVJTVAkJQklUKDgpCisj ZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JVRl9QQUxFVFRFX01FTU9SWQkJMHg0MDAKKworLyogQXVk aW8gcmVnaXN0ZXJzICovCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FVRF9NSVhFUl9WT0xVTUUJCQkw eDAKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVVEX01JWEVSX1ZPTFVNRV9OT19TQ0FMRQkJMHgyMDAw MjAwMAorI2RlZmluZSBaWU5RTVBfRElTUF9BVURfTUlYRVJfTUVUQV9EQVRBCQkJMHg0CisjZGVm aW5lIFpZTlFNUF9ESVNQX0FVRF9DSF9TVEFUVVMwCQkJMHg4CisjZGVmaW5lIFpZTlFNUF9ESVNQ X0FVRF9DSF9TVEFUVVMxCQkJMHhjCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FVRF9DSF9TVEFUVVMy CQkJMHgxMAorI2RlZmluZSBaWU5RTVBfRElTUF9BVURfQ0hfU1RBVFVTMwkJCTB4MTQKKyNkZWZp bmUgWllOUU1QX0RJU1BfQVVEX0NIX1NUQVRVUzQJCQkweDE4CisjZGVmaW5lIFpZTlFNUF9ESVNQ X0FVRF9DSF9TVEFUVVM1CQkJMHgxYworI2RlZmluZSBaWU5RTVBfRElTUF9BVURfQ0hfQV9EQVRB MAkJCTB4MjAKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVVEX0NIX0FfREFUQTEJCQkweDI0CisjZGVm aW5lIFpZTlFNUF9ESVNQX0FVRF9DSF9BX0RBVEEyCQkJMHgyOAorI2RlZmluZSBaWU5RTVBfRElT UF9BVURfQ0hfQV9EQVRBMwkJCTB4MmMKKyNkZWZpbmUgWllOUU1QX0RJU1BfQVVEX0NIX0FfREFU QTQJCQkweDMwCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FVRF9DSF9BX0RBVEE1CQkJMHgzNAorI2Rl ZmluZSBaWU5RTVBfRElTUF9BVURfQ0hfQl9EQVRBMAkJCTB4MzgKKyNkZWZpbmUgWllOUU1QX0RJ U1BfQVVEX0NIX0JfREFUQTEJCQkweDNjCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FVRF9DSF9CX0RB VEEyCQkJMHg0MAorI2RlZmluZSBaWU5RTVBfRElTUF9BVURfQ0hfQl9EQVRBMwkJCTB4NDQKKyNk ZWZpbmUgWllOUU1QX0RJU1BfQVVEX0NIX0JfREFUQTQJCQkweDQ4CisjZGVmaW5lIFpZTlFNUF9E SVNQX0FVRF9DSF9CX0RBVEE1CQkJMHg0YworI2RlZmluZSBaWU5RTVBfRElTUF9BVURfU09GVF9S RVNFVAkJCTB4YzAwCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FVRF9TT0ZUX1JFU0VUX0FVRF9TUlNU CQlCSVQoMCkKKworI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfTlVNX1ZJRF9HRlhfQlVGRkVS UwkJNAorI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfTlVNX0JVRkZFUlMJCQk2CisKKyNkZWZp bmUgWllOUU1QX0RJU1BfTlVNX0xBWUVSUwkJCQkyCisjZGVmaW5lIFpZTlFNUF9ESVNQX01BWF9O VU1fU1VCX1BMQU5FUwkJCTMKKy8qCisgKiAzODQweDIxNjAgaXMgYWR2ZXJ0aXNlZCBtYXggcmVz b2x1dGlvbiwgYnV0IGFsbW9zdCBhbnkgcmVzb2x1dGlvbnMgdW5kZXIKKyAqIDMwME1oeiBwaXhl bCByYXRlIHdvdWxkIHdvcmsuIFRodXMgcHV0IDQwOTYgYXMgbWF4aW11bSB3aWR0aCBhbmQgaGVp Z2h0LgorICovCisjZGVmaW5lIFpZTlFNUF9ESVNQX01BWF9XSURUSAkJCQk0MDk2CisjZGVmaW5l IFpZTlFNUF9ESVNQX01BWF9IRUlHSFQJCQkJNDA5NgorLyogNDQgYml0IGFkZHJlc3NpbmcuIFRo aXMgaXMgYWN1dGFsbHkgRFBETUEgbGltaXRhdGlvbiAqLworI2RlZmluZSBaWU5RTVBfRElTUF9N QVhfRE1BX0JJVAkJCQk0NAorCisvKioKKyAqIGVudW0genlucW1wX2Rpc3BfbGF5ZXJfdHlwZSAt IExheWVyIHR5cGUgKGNhbiBiZSB1c2VkIGZvciBodyBJRCkKKyAqIEBaWU5RTVBfRElTUF9MQVlF Ul9WSUQ6IFZpZGVvIGxheWVyCisgKiBAWllOUU1QX0RJU1BfTEFZRVJfR0ZYOiBHcmFwaGljcyBs YXllcgorICovCitlbnVtIHp5bnFtcF9kaXNwX2xheWVyX3R5cGUgeworCVpZTlFNUF9ESVNQX0xB WUVSX1ZJRCwKKwlaWU5RTVBfRElTUF9MQVlFUl9HRlgKK307CisKKy8qKgorICogZW51bSB6eW5x bXBfZGlzcF9sYXllcl9tb2RlIC0gTGF5ZXIgbW9kZQorICogQFpZTlFNUF9ESVNQX0xBWUVSX05P TkxJVkU6IG5vbi1saXZlIChtZW1vcnkpIG1vZGUKKyAqIEBaWU5RTVBfRElTUF9MQVlFUl9MSVZF OiBsaXZlIChzdHJlYW0pIG1vZGUKKyAqLworZW51bSB6eW5xbXBfZGlzcF9sYXllcl9tb2RlIHsK KwlaWU5RTVBfRElTUF9MQVlFUl9OT05MSVZFLAorCVpZTlFNUF9ESVNQX0xBWUVSX0xJVkUKK307 CisKKy8qKgorICogc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyX2RtYSAtIHN0cnVjdCBmb3IgRE1B IGVuZ2luZQorICogQGNoYW46IERNQSBjaGFubmVsCisgKiBAaXNfYWN0aXZlOiBmbGFnIGlmIHRo ZSBETUEgaXMgYWN0aXZlCisgKiBAeHQ6IEludGVybGVhdmVkIGRlc2MgY29uZmlnIGNvbnRhaW5l cgorICogQHNnbDogRGF0YSBjaHVuayBmb3IgZG1hX2ludGVybGVhdmVkX3RlbXBsYXRlCisgKi8K K3N0cnVjdCB6eW5xbXBfZGlzcF9sYXllcl9kbWEgeworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbjsK Kwlib29sIGlzX2FjdGl2ZTsKKwlzdHJ1Y3QgZG1hX2ludGVybGVhdmVkX3RlbXBsYXRlIHh0Owor CXN0cnVjdCBkYXRhX2NodW5rIHNnbFsxXTsKK307CisKKy8qKgorICogc3RydWN0IHp5bnFtcF9k aXNwX2xheWVyIC0gRGlzcGxheSBzdWJzeXN0ZW0gbGF5ZXIKKyAqIEBwbGFuZTogRFJNIHBsYW5l CisgKiBAb2Zfbm9kZTogZGV2aWNlIG5vZGUKKyAqIEBkbWE6IHN0cnVjdCBmb3IgRE1BIGVuZ2lu ZQorICogQG51bV9jaGFuOiBOdW1iZXIgb2YgRE1BIGNoYW5uZWwKKyAqIEBpZDogTGF5ZXIgSUQK KyAqIEBvZmZzZXQ6IExheWVyIG9mZnNldCBpbiB0aGUgcmVnaXN0ZXIgc3BhY2UKKyAqIEBlbmFi bGVkOiBmbGFnIGlmIGVuYWJsZWQKKyAqIEBmbXQ6IEN1cnJlbnQgZm9ybWF0IGRlc2NyaXB0b3IK KyAqIEBkcm1fZm10czogQXJyYXkgb2Ygc3VwcG9ydGVkIERSTSBmb3JtYXRzCisgKiBAbnVtX2Zt dHM6IE51bWJlciBvZiBzdXBwb3J0ZWQgRFJNIGZvcm1hdHMKKyAqIEBidXNfZm10czogQXJyYXkg b2Ygc3VwcG9ydGVkIGJ1cyBmb3JtYXRzCisgKiBAbnVtX2J1c19mbXRzOiBOdW1iZXIgb2Ygc3Vw cG9ydGVkIGJ1cyBmb3JtYXRzCisgKiBAdzogV2lkdGgKKyAqIEBoOiBIZWlnaHQKKyAqIEBtb2Rl OiB0aGUgb3BlcmF0aW9uIG1vZGUKKyAqIEBvdGhlcjogb3RoZXIgbGF5ZXIKKyAqIEBkaXNwOiBi YWNrIHBvaW50ZXIgdG8gc3RydWN0IHp5bnFtcF9kaXNwCisgKi8KK3N0cnVjdCB6eW5xbXBfZGlz cF9sYXllciB7CisJc3RydWN0IGRybV9wbGFuZSBwbGFuZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUg Km9mX25vZGU7CisJc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyX2RtYSBkbWFbWllOUU1QX0RJU1Bf TUFYX05VTV9TVUJfUExBTkVTXTsKKwl1bnNpZ25lZCBpbnQgbnVtX2NoYW47CisJZW51bSB6eW5x bXBfZGlzcF9sYXllcl90eXBlIGlkOworCXUzMiBvZmZzZXQ7CisJdTggZW5hYmxlZDsKKwljb25z dCBzdHJ1Y3QgenlucW1wX2Rpc3BfZm10ICpmbXQ7CisJdTMyICpkcm1fZm10czsKKwl1bnNpZ25l ZCBpbnQgbnVtX2ZtdHM7CisJdTMyICpidXNfZm10czsKKwl1bnNpZ25lZCBpbnQgbnVtX2J1c19m bXRzOworCXUzMiB3OworCXUzMiBoOworCWVudW0genlucW1wX2Rpc3BfbGF5ZXJfbW9kZSBtb2Rl OworCXN0cnVjdCB6eW5xbXBfZGlzcF9sYXllciAqb3RoZXI7CisJc3RydWN0IHp5bnFtcF9kaXNw ICpkaXNwOworfTsKKworLyoqCisgKiBzdHJ1Y3QgenlucW1wX2Rpc3BfYmxlbmQgLSBCbGVuZGVy CisgKiBAYmFzZTogQmFzZSBhZGRyZXNzIG9mZnNldAorICovCitzdHJ1Y3QgenlucW1wX2Rpc3Bf YmxlbmQgeworCXZvaWQgX19pb21lbSAqYmFzZTsKK307CisKKy8qKgorICogc3RydWN0IHp5bnFt cF9kaXNwX2F2X2J1ZiAtIEFWIGJ1ZmZlciBtYW5hZ2VyCisgKiBAYmFzZTogQmFzZSBhZGRyZXNz IG9mZnNldAorICovCitzdHJ1Y3QgenlucW1wX2Rpc3BfYXZfYnVmIHsKKwl2b2lkIF9faW9tZW0g KmJhc2U7Cit9OworCisvKioKKyAqIHN0cnVjdCB6eW5xbXBfZGlzcF9hdWQgLSBBdWRpbworICog QGJhc2U6IEJhc2UgYWRkcmVzcyBvZmZzZXQKKyAqLworc3RydWN0IHp5bnFtcF9kaXNwX2F1ZCB7 CisJdm9pZCBfX2lvbWVtICpiYXNlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgenlucW1wX2Rpc3Ag LSBEaXNwbGF5IHN1YnN5c3RlbQorICogQHhsbnhfY3J0YzogWGlsaW54IERSTSBjcnRjCisgKiBA ZGV2OiBkZXZpY2Ugc3RydWN0dXJlCisgKiBAZHBzdWI6IERpc3BsYXkgc3Vic3lzdGVtCisgKiBA ZHJtOiBEUk0gY29yZQorICogQGVuYWJsZWQ6IGZsYWcgaWYgZW5hYmxlZAorICogQGJsZW5kOiBC bGVuZGVyIGJsb2NrCisgKiBAYXZfYnVmOiBBViBidWZmZXIgbWFuYWdlciBibG9jaworICogQGF1 ZDpBdWRpbyBibG9jaworICogQGxheWVyczogbGF5ZXJzCisgKiBAYWxwaGE6IGN1cnJlbnQgZ2xv YmFsIGFscGhhIHZhbHVlCisgKiBAYWxwaGFfZW46IGZsYWcgaWYgdGhlIGdsb2JhbCBhbHBoYSBp cyBlbmFibGVkCisgKiBAY29sb3I6IGN1cnJlbnQgb3V0cHV0IGNvbG9yIHZhbHVlCisgKiBAYmdf YzA6IGN1cnJlbnQgdmFsdWUgb2YgMXN0IGJhY2tncm91bmQgY29sb3IgY29tcG9uZW50CisgKiBA YmdfYzE6IGN1cnJlbnQgdmFsdWUgb2YgMm5kIGJhY2tncm91bmQgY29sb3IgY29tcG9uZW50Cisg KiBAYmdfYzI6IGN1cnJlbnQgdmFsdWUgb2YgM3JkIGJhY2tncm91bmQgY29sb3IgY29tcG9uZW50 CisgKiBAdHBnX29uOiBjdXJyZW50IFRQRyBtb2RlIHN0YXRlCisgKiBAZXZlbnQ6IHBlbmRpbmcg dmJsYW5rIGV2ZW50IHJlcXVlc3QKKyAqIEBfcHNfcGNsazogUGl4ZWwgY2xvY2sgZnJvbSBQUwor ICogQF9wbF9wY2xrOiBQaXhlbCBjbG9jayBmcm9tIFBMCisgKiBAcGNsazogUGl4ZWwgY2xvY2sK KyAqIEBwY2xrX2VuOiBGbGFnIGlmIHRoZSBwaXhlbCBjbG9jayBpcyBlbmFibGVkCisgKiBAX3Bz X2F1ZGNsazogQXVkaW8gY2xvY2sgZnJvbSBQUworICogQF9wbF9hdWRjbGs6IEF1ZGlvIGNsb2Nr IGZyb20gUEwKKyAqIEBhdWRjbGs6IEF1ZGlvIGNsb2NrCisgKiBAYXVkY2xrX2VuOiBGbGFnIGlm IHRoZSBhdWRpbyBjbG9jayBpcyBlbmFibGVkCisgKiBAYWNsazogQVBCIGNsb2NrCisgKiBAYWNs a19lbjogRmxhZyBpZiB0aGUgQVBCIGNsb2NrIGlzIGVuYWJsZWQKKyAqLworc3RydWN0IHp5bnFt cF9kaXNwIHsKKwlzdHJ1Y3QgeGxueF9jcnRjIHhsbnhfY3J0YzsKKwlzdHJ1Y3QgZGV2aWNlICpk ZXY7CisJc3RydWN0IHp5bnFtcF9kcHN1YiAqZHBzdWI7CisJc3RydWN0IGRybV9kZXZpY2UgKmRy bTsKKwlib29sIGVuYWJsZWQ7CisJc3RydWN0IHp5bnFtcF9kaXNwX2JsZW5kIGJsZW5kOworCXN0 cnVjdCB6eW5xbXBfZGlzcF9hdl9idWYgYXZfYnVmOworCXN0cnVjdCB6eW5xbXBfZGlzcF9hdWQg YXVkOworCXN0cnVjdCB6eW5xbXBfZGlzcF9sYXllciBsYXllcnNbWllOUU1QX0RJU1BfTlVNX0xB WUVSU107CisJdTMyIGFscGhhOworCWJvb2wgYWxwaGFfZW47CisJdW5zaWduZWQgaW50IGNvbG9y OworCXUzMiBiZ19jMDsKKwl1MzIgYmdfYzE7CisJdTMyIGJnX2MyOworCWJvb2wgdHBnX29uOwor CXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmV2ZW50OworCS8qIERvbid0IG9wZXJh dGUgZGlyZWN0bHkgb24gX3BzXyAqLworCXN0cnVjdCBjbGsgKl9wc19wY2xrOworCXN0cnVjdCBj bGsgKl9wbF9wY2xrOworCXN0cnVjdCBjbGsgKnBjbGs7CisJYm9vbCBwY2xrX2VuOworCXN0cnVj dCBjbGsgKl9wc19hdWRjbGs7CisJc3RydWN0IGNsayAqX3BsX2F1ZGNsazsKKwlzdHJ1Y3QgY2xr ICphdWRjbGs7CisJYm9vbCBhdWRjbGtfZW47CisJc3RydWN0IGNsayAqYWNsazsKKwlib29sIGFj bGtfZW47Cit9OworCisvKioKKyAqIHN0cnVjdCB6eW5xbXBfZGlzcF9mbXQgLSBEaXNwbGF5IHN1 YnN5c3RlbSBmb3JtYXQgbWFwcGluZworICogQGRybV9mbXQ6IGRybSBmb3JtYXQKKyAqIEBkaXNw X2ZtdDogRGlzcGxheSBzdWJzeXN0ZW0gZm9ybWF0CisgKiBAYnVzX2ZtdDogQnVzIGZvcm1hdHMg KGxpdmUgZm9ybWF0cykKKyAqIEByZ2I6IGZsYWcgZm9yIFJHQiBmb3JtYXRzCisgKiBAc3dhcDog ZmxhZyB0byBzd2FwIHIgJiBiIGZvciByZ2IgZm9ybWF0cywgYW5kIHUgJiB2IGZvciB5dXYgZm9y bWF0cworICogQGNocm9tYV9zdWI6IGZsYWcgZm9yIGNocm9tYSBzdWJzYW1wbGVkIGZvcm1hdHMK KyAqIEBzZjogc2NhbGluZyBmYWN0b3JzIGZvciB1cHRvIDMgY29sb3IgY29tcG9uZW50cworICov CitzdHJ1Y3QgenlucW1wX2Rpc3BfZm10IHsKKwl1MzIgZHJtX2ZtdDsKKwl1MzIgZGlzcF9mbXQ7 CisJdTMyIGJ1c19mbXQ7CisJYm9vbCByZ2I7CisJYm9vbCBzd2FwOworCWJvb2wgY2hyb21hX3N1 YjsKKwl1MzIgc2ZbM107Cit9OworCitzdGF0aWMgdm9pZCB6eW5xbXBfZGlzcF93cml0ZSh2b2lk IF9faW9tZW0gKmJhc2UsIGludCBvZmZzZXQsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgYmFz ZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB1MzIgenlucW1wX2Rpc3BfcmVhZCh2b2lkIF9faW9t ZW0gKmJhc2UsIGludCBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRsKGJhc2UgKyBvZmZzZXQpOwor fQorCitzdGF0aWMgdm9pZCB6eW5xbXBfZGlzcF9jbHIodm9pZCBfX2lvbWVtICpiYXNlLCBpbnQg b2Zmc2V0LCB1MzIgY2xyKQoreworCXp5bnFtcF9kaXNwX3dyaXRlKGJhc2UsIG9mZnNldCwgenlu cW1wX2Rpc3BfcmVhZChiYXNlLCBvZmZzZXQpICYgfmNscik7Cit9CisKK3N0YXRpYyB2b2lkIHp5 bnFtcF9kaXNwX3NldCh2b2lkIF9faW9tZW0gKmJhc2UsIGludCBvZmZzZXQsIHUzMiBzZXQpCit7 CisJenlucW1wX2Rpc3Bfd3JpdGUoYmFzZSwgb2Zmc2V0LCB6eW5xbXBfZGlzcF9yZWFkKGJhc2Us IG9mZnNldCkgfCBzZXQpOworfQorCisvKgorICogQ2xvY2sgZnVuY3Rpb25zCisgKi8KKworLyoq CisgKiB6eW5xbXBfZGlzcF9jbGtfZW5hYmxlIC0gRW5hYmxlIHRoZSBjbG9jayBpZiBuZWVkZWQK KyAqIEBjbGs6IGNsayBkZXZpY2UKKyAqIEBmbGFnOiBmbGFnIGlmIHRoZSBjbG9jayBpcyBlbmFi bGVkCisgKgorICogRW5hYmxlIHRoZSBjbG9jayBvbmx5IGlmIGl0J3Mgbm90IGVuYWJsZWQgQGZs YWcuCisgKgorICogUmV0dXJuOiB2YWx1ZSBmcm9tIGNsa19wcmVwYXJlX2VuYWJsZSgpLgorICov CitzdGF0aWMgaW50IHp5bnFtcF9kaXNwX2Nsa19lbmFibGUoc3RydWN0IGNsayAqY2xrLCBib29s ICpmbGFnKQoreworCWludCByZXQgPSAwOworCisJaWYgKCEqZmxhZykgeworCQlyZXQgPSBjbGtf cHJlcGFyZV9lbmFibGUoY2xrKTsKKwkJaWYgKCFyZXQpCisJCQkqZmxhZyA9IHRydWU7CisJfQor CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9jbGtfZW5hYmxlIC0gRW5h YmxlIHRoZSBjbG9jayBpZiBuZWVkZWQKKyAqIEBjbGs6IGNsayBkZXZpY2UKKyAqIEBmbGFnOiBm bGFnIGlmIHRoZSBjbG9jayBpcyBlbmFibGVkCisgKgorICogRGlzYWJsZSB0aGUgY2xvY2sgb25s eSBpZiBpdCdzIGVuYWJsZWQgQGZsYWcuCisgKi8KK3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNwX2Ns a19kaXNhYmxlKHN0cnVjdCBjbGsgKmNsaywgYm9vbCAqZmxhZykKK3sKKwlpZiAoKmZsYWcpIHsK KwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNsayk7CisJCSpmbGFnID0gZmFsc2U7CisJfQorfQor CisvKioKKyAqIHp5bnFtcF9kaXNwX2Nsa19lbmFibGUgLSBFbmFibGUgYW5kIGRpc2FibGUgdGhl IGNsb2NrCisgKiBAY2xrOiBjbGsgZGV2aWNlCisgKiBAZmxhZzogZmxhZyBpZiB0aGUgY2xvY2sg aXMgZW5hYmxlZAorICoKKyAqIFRoaXMgaXMgdG8gZW5zdXJlIHRoZSBjbG9jayBpcyBkaXNhYmxl ZC4gVGhlIGluaXRpYWwgaGFyZHdhcmUgc3RhdGUgaXMKKyAqIHVua25vd24sIGFuZCB0aGlzIG1h a2VzIHN1cmUgdGhhdCB0aGUgY2xvY2sgaXMgZGlzYWJsZWQuCisgKgorICogUmV0dXJuOiB2YWx1 ZSBmcm9tIGNsa19wcmVwYXJlX2VuYWJsZSgpLgorICovCitzdGF0aWMgaW50IHp5bnFtcF9kaXNw X2Nsa19lbmFibGVfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGssIGJvb2wgKmZsYWcpCit7CisJaW50 IHJldCA9IDA7CisKKwlpZiAoISpmbGFnKSB7CisJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShj bGspOworCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY2xrKTsKKwl9CisKKwlyZXR1cm4gcmV0Owor fQorCisvKgorICogQmxlbmRlciBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIHp5bnFtcF9kaXNw X2JsZW5kX3NldF9vdXRwdXRfZm10IC0gU2V0IHRoZSBvdXRwdXQgZm9ybWF0IG9mIHRoZSBibGVu ZAorICogQGJsZW5kOiBibGVuZCBvYmplY3QKKyAqIEBmbXQ6IG91dHB1dCBmb3JtYXQKKyAqCisg KiBTZXQgdGhlIG91dHB1dCBmb3JtYXQgdG8gQGZtdC4KKyAqLworc3RhdGljIHZvaWQKK3p5bnFt cF9kaXNwX2JsZW5kX3NldF9vdXRwdXRfZm10KHN0cnVjdCB6eW5xbXBfZGlzcF9ibGVuZCAqYmxl bmQsIHUzMiBmbXQpCit7CisJdTE2IHJlc2V0X2NvZWZmc1tdID0geyAweDEwMDAsIDB4MCwgMHgw LAorCQkJICAgICAgIDB4MCwgMHgxMDAwLCAweDAsCisJCQkgICAgICAgMHgwLCAweDAsIDB4MTAw MCB9OworCXUzMiByZXNldF9vZmZzZXRzW10gPSB7IDB4MCwgMHgwLCAweDAgfTsKKwl1MTYgc2R0 dl9jb2VmZnNbXSA9IHsgMHg0YzksIDB4ODY0LCAweDFkMywKKwkJCSAgICAgIDB4N2Q0ZCwgMHg3 YWIzLCAweDgwMCwKKwkJCSAgICAgIDB4ODAwLCAweDc5NGQsIDB4N2ViMyB9OworCXUzMiBmdWxs X3JhbmdlX29mZnNldHNbXSA9IHsgMHgwLCAweDgwMDAwMDAsIDB4ODAwMDAwMCB9OworCXUxNiAq Y29lZmZzOworCXUzMiAqb2Zmc2V0czsKKwl1MzIgb2Zmc2V0LCBpOworCisJenlucW1wX2Rpc3Bf d3JpdGUoYmxlbmQtPmJhc2UsIFpZTlFNUF9ESVNQX1ZfQkxFTkRfT1VUUFVUX1ZJRF9GTVQsIGZt dCk7CisJaWYgKGZtdCA9PSBaWU5RTVBfRElTUF9WX0JMRU5EX09VVFBVVF9WSURfRk1UX1JHQikg eworCQljb2VmZnMgPSByZXNldF9jb2VmZnM7CisJCW9mZnNldHMgPSByZXNldF9vZmZzZXRzOwor CX0gZWxzZSB7CisJCS8qIEhhcmRjb2RlIEZ1bGwtcmFuZ2UgU0RUViB2YWx1ZXMuIENhbiBiZSBy dW50aW1lIGNvbmZpZyAqLworCQljb2VmZnMgPSBzZHR2X2NvZWZmczsKKwkJb2Zmc2V0cyA9IGZ1 bGxfcmFuZ2Vfb2Zmc2V0czsKKwl9CisKKwlvZmZzZXQgPSBaWU5RTVBfRElTUF9WX0JMRU5EX1JH QjJZQ0JDUl9DT0VGRjA7CisJZm9yIChpID0gMDsgaSA8IFpZTlFNUF9ESVNQX1ZfQkxFTkRfTlVN X0NPRUZGOyBpKyspCisJCXp5bnFtcF9kaXNwX3dyaXRlKGJsZW5kLT5iYXNlLCBvZmZzZXQgKyBp ICogNCwgY29lZmZzW2ldKTsKKworCW9mZnNldCA9IFpZTlFNUF9ESVNQX1ZfQkxFTkRfTFVNQV9P VVRDU0NfT0ZGU0VUOworCWZvciAoaSA9IDA7IGkgPCBaWU5RTVBfRElTUF9WX0JMRU5EX05VTV9P RkZTRVQ7IGkrKykKKwkJenlucW1wX2Rpc3Bfd3JpdGUoYmxlbmQtPmJhc2UsIG9mZnNldCArIGkg KiA0LCBvZmZzZXRzW2ldKTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9ibGVuZF9sYXllcl9l bmFibGUgLSBFbmFibGUgYSBsYXllcgorICogQGJsZW5kOiBibGVuZCBvYmplY3QKKyAqIEBsYXll cjogbGF5ZXIgdG8gZW5hYmxlCisgKgorICogRW5hYmxlIGEgbGF5ZXIgQGxheWVyLgorICovCitz dGF0aWMgdm9pZCB6eW5xbXBfZGlzcF9ibGVuZF9sYXllcl9lbmFibGUoc3RydWN0IHp5bnFtcF9k aXNwX2JsZW5kICpibGVuZCwKKwkJCQkJICAgc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyICpsYXll cikKK3sKKwl1MzIgcmVnLCBvZmZzZXQsIGksIHMwLCBzMTsKKwl1MTYgc2R0dl9jb2VmZnNbXSA9 IHsgMHgxMDAwLCAweDE2NmYsIDB4MCwKKwkJCSAgICAgIDB4MTAwMCwgMHg3NDgzLCAweDdhN2Ys CisJCQkgICAgICAweDEwMDAsIDB4MCwgMHgxYzVhIH07CisJdTE2IHN3YXBfY29lZmZzW10gPSB7 IDB4MTAwMCwgMHgwLCAweDAsCisJCQkgICAgICAweDAsIDB4MTAwMCwgMHgwLAorCQkJICAgICAg MHgwLCAweDAsIDB4MTAwMCB9OworCXUxNiAqY29lZmZzOworCXUzMiBvZmZzZXRzW10gPSB7IDB4 MCwgMHgxODAwLCAweDE4MDAgfTsKKworCXJlZyA9IGxheWVyLT5mbXQtPnJnYiA/IFpZTlFNUF9E SVNQX1ZfQkxFTkRfTEFZRVJfQ09OVFJPTF9SR0IgOiAwOworCXJlZyB8PSBsYXllci0+Zm10LT5j aHJvbWFfc3ViID8KKwkgICAgICAgWllOUU1QX0RJU1BfVl9CTEVORF9MQVlFUl9DT05UUk9MX0VO X1VTIDogMDsKKworCXp5bnFtcF9kaXNwX3dyaXRlKGJsZW5kLT5iYXNlLAorCQkJICBaWU5RTVBf RElTUF9WX0JMRU5EX0xBWUVSX0NPTlRST0wgKyBsYXllci0+b2Zmc2V0LAorCQkJICByZWcpOwor CisJaWYgKGxheWVyLT5pZCA9PSBaWU5RTVBfRElTUF9MQVlFUl9WSUQpCisJCW9mZnNldCA9IFpZ TlFNUF9ESVNQX1ZfQkxFTkRfSU4xQ1NDX0NPRUZGMDsKKwllbHNlCisJCW9mZnNldCA9IFpZTlFN UF9ESVNQX1ZfQkxFTkRfSU4yQ1NDX0NPRUZGMDsKKworCWlmICghbGF5ZXItPmZtdC0+cmdiKSB7 CisJCWNvZWZmcyA9IHNkdHZfY29lZmZzOworCQlzMCA9IDE7CisJCXMxID0gMjsKKwl9IGVsc2Ug eworCQljb2VmZnMgPSBzd2FwX2NvZWZmczsKKwkJczAgPSAwOworCQlzMSA9IDI7CisKKwkJLyog Tm8gb2Zmc2V0IGZvciBSR0IgZm9ybWF0cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgWllOUU1QX0RJ U1BfVl9CTEVORF9OVU1fT0ZGU0VUOyBpKyspCisJCQlvZmZzZXRzW2ldID0gMDsKKwl9CisKKwlp ZiAobGF5ZXItPmZtdC0+c3dhcCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlj b2VmZnNbaSAqIDMgKyBzMF0gXj0gY29lZmZzW2kgKiAzICsgczFdOworCQkJY29lZmZzW2kgKiAz ICsgczFdIF49IGNvZWZmc1tpICogMyArIHMwXTsKKwkJCWNvZWZmc1tpICogMyArIHMwXSBePSBj b2VmZnNbaSAqIDMgKyBzMV07CisJCX0KKwl9CisKKwkvKiBQcm9ncmFtIGNvZWZmaWNpZW50cy4g Q2FuIGJlIHJ1bnRpbWUgY29uZmlndXJhYmxlICovCisJZm9yIChpID0gMDsgaSA8IFpZTlFNUF9E SVNQX1ZfQkxFTkRfTlVNX0NPRUZGOyBpKyspCisJCXp5bnFtcF9kaXNwX3dyaXRlKGJsZW5kLT5i YXNlLCBvZmZzZXQgKyBpICogNCwgY29lZmZzW2ldKTsKKworCWlmIChsYXllci0+aWQgPT0gWllO UU1QX0RJU1BfTEFZRVJfVklEKQorCQlvZmZzZXQgPSBaWU5RTVBfRElTUF9WX0JMRU5EX0xVTUFf SU4xQ1NDX09GRlNFVDsKKwllbHNlCisJCW9mZnNldCA9IFpZTlFNUF9ESVNQX1ZfQkxFTkRfTFVN QV9JTjJDU0NfT0ZGU0VUOworCisJLyogUHJvZ3JhbSBvZmZzZXRzLiBDYW4gYmUgcnVudGltZSBj b25maWd1cmFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgWllOUU1QX0RJU1BfVl9CTEVORF9OVU1f T0ZGU0VUOyBpKyspCisJCXp5bnFtcF9kaXNwX3dyaXRlKGJsZW5kLT5iYXNlLCBvZmZzZXQgKyBp ICogNCwgb2Zmc2V0c1tpXSk7Cit9CisKKy8qKgorICogenlucW1wX2Rpc3BfYmxlbmRfbGF5ZXJf ZGlzYWJsZSAtIERpc2FibGUgYSBsYXllcgorICogQGJsZW5kOiBibGVuZCBvYmplY3QKKyAqIEBs YXllcjogbGF5ZXIgdG8gZGlzYWJsZQorICoKKyAqIERpc2FibGUgYSBsYXllciBAbGF5ZXIuCisg Ki8KK3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNwX2JsZW5kX2xheWVyX2Rpc2FibGUoc3RydWN0IHp5 bnFtcF9kaXNwX2JsZW5kICpibGVuZCwKKwkJCQkJICAgIHN0cnVjdCB6eW5xbXBfZGlzcF9sYXll ciAqbGF5ZXIpCit7CisJdTMyIG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXp5bnFtcF9k aXNwX3dyaXRlKGJsZW5kLT5iYXNlLAorCQkJICBaWU5RTVBfRElTUF9WX0JMRU5EX0xBWUVSX0NP TlRST0wgKyBsYXllci0+b2Zmc2V0LCAwKTsKKworCWlmIChsYXllci0+aWQgPT0gWllOUU1QX0RJ U1BfTEFZRVJfVklEKQorCQlvZmZzZXQgPSBaWU5RTVBfRElTUF9WX0JMRU5EX0lOMUNTQ19DT0VG RjA7CisJZWxzZQorCQlvZmZzZXQgPSBaWU5RTVBfRElTUF9WX0JMRU5EX0lOMkNTQ19DT0VGRjA7 CisJZm9yIChpID0gMDsgaSA8IFpZTlFNUF9ESVNQX1ZfQkxFTkRfTlVNX0NPRUZGOyBpKyspCisJ CXp5bnFtcF9kaXNwX3dyaXRlKGJsZW5kLT5iYXNlLCBvZmZzZXQgKyBpICogNCwgMCk7CisKKwlp ZiAobGF5ZXItPmlkID09IFpZTlFNUF9ESVNQX0xBWUVSX1ZJRCkKKwkJb2Zmc2V0ID0gWllOUU1Q X0RJU1BfVl9CTEVORF9MVU1BX0lOMUNTQ19PRkZTRVQ7CisJZWxzZQorCQlvZmZzZXQgPSBaWU5R TVBfRElTUF9WX0JMRU5EX0xVTUFfSU4yQ1NDX09GRlNFVDsKKworCWZvciAoaSA9IDA7IGkgPCBa WU5RTVBfRElTUF9WX0JMRU5EX05VTV9PRkZTRVQ7IGkrKykKKwkJenlucW1wX2Rpc3Bfd3JpdGUo YmxlbmQtPmJhc2UsIG9mZnNldCArIGkgKiA0LCAwKTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlz cF9ibGVuZF9zZXRfYmdfY29sb3IgLSBTZXQgdGhlIGJhY2tncm91bmQgY29sb3IKKyAqIEBibGVu ZDogYmxlbmQgb2JqZWN0CisgKiBAYzA6IGNvbG9yIGNvbXBvbmVudCAwCisgKiBAYzE6IGNvbG9y IGNvbXBvbmVudCAxCisgKiBAYzI6IGNvbG9yIGNvbXBvbmVudCAyCisgKgorICogU2V0IHRoZSBi YWNrZ3JvdW5kIGNvbG9yLgorICovCitzdGF0aWMgdm9pZCB6eW5xbXBfZGlzcF9ibGVuZF9zZXRf YmdfY29sb3Ioc3RydWN0IHp5bnFtcF9kaXNwX2JsZW5kICpibGVuZCwKKwkJCQkJICAgdTMyIGMw LCB1MzIgYzEsIHUzMiBjMikKK3sKKwl6eW5xbXBfZGlzcF93cml0ZShibGVuZC0+YmFzZSwgWllO UU1QX0RJU1BfVl9CTEVORF9CR19DTFJfMCwgYzApOworCXp5bnFtcF9kaXNwX3dyaXRlKGJsZW5k LT5iYXNlLCBaWU5RTVBfRElTUF9WX0JMRU5EX0JHX0NMUl8xLCBjMSk7CisJenlucW1wX2Rpc3Bf d3JpdGUoYmxlbmQtPmJhc2UsIFpZTlFNUF9ESVNQX1ZfQkxFTkRfQkdfQ0xSXzIsIGMyKTsKK30K KworLyoqCisgKiB6eW5xbXBfZGlzcF9ibGVuZF9zZXRfYWxwaGEgLSBTZXQgdGhlIGFscGhhIGZv ciBibGVuZGluZworICogQGJsZW5kOiBibGVuZCBvYmplY3QKKyAqIEBhbHBoYTogYWxwaGEgdmFs dWUgdG8gYmUgdXNlZAorICoKKyAqIFNldCB0aGUgYWxwaGEgZm9yIGJsZW5kaW5nLgorICovCitz dGF0aWMgdm9pZAorenlucW1wX2Rpc3BfYmxlbmRfc2V0X2FscGhhKHN0cnVjdCB6eW5xbXBfZGlz cF9ibGVuZCAqYmxlbmQsIHUzMiBhbHBoYSkKK3sKKwl1MzIgcmVnOworCisJcmVnID0genlucW1w X2Rpc3BfcmVhZChibGVuZC0+YmFzZSwKKwkJCSAgICAgICBaWU5RTVBfRElTUF9WX0JMRU5EX1NF VF9HTE9CQUxfQUxQSEEpOworCXJlZyAmPSB+WllOUU1QX0RJU1BfVl9CTEVORF9TRVRfR0xPQkFM X0FMUEhBX01BU0s7CisJcmVnIHw9IGFscGhhIDw8IDE7CisJenlucW1wX2Rpc3Bfd3JpdGUoYmxl bmQtPmJhc2UsIFpZTlFNUF9ESVNQX1ZfQkxFTkRfU0VUX0dMT0JBTF9BTFBIQSwKKwkJCSAgcmVn KTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9ibGVuZF9lbmFibGVfYWxwaGEgLSBFbmFibGUv ZGlzYWJsZSB0aGUgZ2xvYmFsIGFscGhhCisgKiBAYmxlbmQ6IGJsZW5kIG9iamVjdAorICogQGVu YWJsZTogZmxhZyB0byBlbmFibGUgb3IgZGlzYWJsZSBhbHBoYSBibGVuZGluZworICoKKyAqIEVu YWJsZS9kaXNhYmxlIHRoZSBnbG9iYWwgYWxwaGEgYmxlbmRpbmcgYmFzZWQgb24gQGVuYWJsZS4K KyAqLworc3RhdGljIHZvaWQKK3p5bnFtcF9kaXNwX2JsZW5kX2VuYWJsZV9hbHBoYShzdHJ1Y3Qg enlucW1wX2Rpc3BfYmxlbmQgKmJsZW5kLCBib29sIGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKQor CQl6eW5xbXBfZGlzcF9zZXQoYmxlbmQtPmJhc2UsCisJCQkJWllOUU1QX0RJU1BfVl9CTEVORF9T RVRfR0xPQkFMX0FMUEhBLCBCSVQoMCkpOworCWVsc2UKKwkJenlucW1wX2Rpc3BfY2xyKGJsZW5k LT5iYXNlLAorCQkJCVpZTlFNUF9ESVNQX1ZfQkxFTkRfU0VUX0dMT0JBTF9BTFBIQSwgQklUKDAp KTsKK30KKworLyogTGlzdCBvZiBibGVuZCBvdXRwdXQgZm9ybWF0cyAqLworLyogVGhlIGlkIC8g b3JkZXIgc2hvdWxkIGJlIGFsaWduZWQgd2l0aCB6eW5xbXBfZGlzcF9jb2xvcl9lbnVtICovCitz dGF0aWMgY29uc3Qgc3RydWN0IHp5bnFtcF9kaXNwX2ZtdCBibGVuZF9vdXRwdXRfZm10c1tdID0g eworCXsKKwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1BfVl9CTEVORF9PVVRQVVRfVklEX0ZNVF9S R0IsCisJfSwgeworCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9WX0JMRU5EX09VVFBVVF9WSURf Rk1UX1lDQkNSNDQ0LAorCX0sIHsKKwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1BfVl9CTEVORF9P VVRQVVRfVklEX0ZNVF9ZQ0JDUjQyMiwKKwl9LCB7CisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQ X1ZfQkxFTkRfT1VUUFVUX1ZJRF9GTVRfWU9OTFksCisJfQorfTsKKworLyoKKyAqIEFWIGJ1ZmZl ciBtYW5hZ2VyIGZ1bmN0aW9ucworICovCisKKy8qIExpc3Qgb2YgdmlkZW8gbGF5ZXIgZm9ybWF0 cyAqLworI2RlZmluZSBaWU5RTVBfRElTUF9BVl9CVUZfVklEX0ZNVF9ZVVlWCTIKK3N0YXRpYyBj b25zdCBzdHJ1Y3QgenlucW1wX2Rpc3BfZm10IGF2X2J1Zl92aWRfZm10c1tdID0geworCXsKKwkJ LmRybV9mbXQJPSBEUk1fRk9STUFUX1ZZVVksCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FW X0JVRl9GTVRfTkxfVklEX1ZZVVksCisJCS5yZ2IJCT0gZmFsc2UsCisJCS5zd2FwCQk9IHRydWUs CisJCS5jaHJvbWFfc3ViCT0gdHJ1ZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84 QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsy XQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJN X0ZPUk1BVF9VWVZZLAorCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJ RF9WWVVZLAorCQkucmdiCQk9IGZhbHNlLAorCQkuc3dhcAkJPSBmYWxzZSwKKwkJLmNocm9tYV9z dWIJPSB0cnVlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5z ZlsxXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9E SVNQX0FWX0JVRl84QklUX1NGLAorCX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX1lVWVYs CisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1lVWVYsCisJCS5y Z2IJCT0gZmFsc2UsCisJCS5zd2FwCQk9IGZhbHNlLAorCQkuY2hyb21hX3N1Ygk9IHRydWUsCisJ CS5zZlswXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFN UF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhC SVRfU0YsCisJfSwgeworCQkuZHJtX2ZtdAk9IERSTV9GT1JNQVRfWVZZVSwKKwkJLmRpc3BfZm10 CT0gWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVVZViwKKwkJLnJnYgkJPSBmYWxzZSwK KwkJLnN3YXAJCT0gdHJ1ZSwKKwkJLmNocm9tYV9zdWIJPSB0cnVlLAorCQkuc2ZbMF0JCT0gWllO UU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsxXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZf OEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCX0sIHsK KwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX1lVVjQyMiwKKwkJLmRpc3BfZm10CT0gWllOUU1QX0RJ U1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYxNiwKKwkJLnJnYgkJPSBmYWxzZSwKKwkJLnN3YXAJCT0g ZmFsc2UsCisJCS5jaHJvbWFfc3ViCT0gdHJ1ZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FW X0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJ CS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7CisJCS5kcm1fZm10 CT0gRFJNX0ZPUk1BVF9ZVlU0MjIsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9G TVRfTkxfVklEX1lWMTYsCisJCS5yZ2IJCT0gZmFsc2UsCisJCS5zd2FwCQk9IHRydWUsCisJCS5j aHJvbWFfc3ViCT0gdHJ1ZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NG LAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJPSBa WU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1B VF9ZVVY0NDQsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1lW MjQsCisJCS5yZ2IJCT0gZmFsc2UsCisJCS5zd2FwCQk9IGZhbHNlLAorCQkuY2hyb21hX3N1Ygk9 IGZhbHNlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsx XQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQ X0FWX0JVRl84QklUX1NGLAorCX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX1lWVTQ0NCwK KwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYyNCwKKwkJLnJn YgkJPSBmYWxzZSwKKwkJLnN3YXAJCT0gdHJ1ZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwKKwkJ LnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1Q X0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJ VF9TRiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9OVjE2LAorCQkuZGlzcF9mbXQJ PSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9ZVjE2Q0ksCisJCS5yZ2IJCT0gZmFsc2Us CisJCS5zd2FwCQk9IGZhbHNlLAorCQkuY2hyb21hX3N1Ygk9IHRydWUsCisJCS5zZlswXQkJPSBa WU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JV Rl84QklUX1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJfSwg eworCQkuZHJtX2ZtdAk9IERSTV9GT1JNQVRfTlY2MSwKKwkJLmRpc3BfZm10CT0gWllOUU1QX0RJ U1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYxNkNJLAorCQkucmdiCQk9IGZhbHNlLAorCQkuc3dhcAkJ PSB0cnVlLAorCQkuY2hyb21hX3N1Ygk9IHRydWUsCisJCS5zZlswXQkJPSBaWU5RTVBfRElTUF9B Vl9CVUZfOEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAor CQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJfSwgeworCQkuZHJtX2Zt dAk9IERSTV9GT1JNQVRfQkdSODg4LAorCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZf Rk1UX05MX1ZJRF9SR0I4ODgsCisJCS5yZ2IJCT0gdHJ1ZSwKKwkJLnN3YXAJCT0gZmFsc2UsCisJ CS5jaHJvbWFfc3ViCT0gZmFsc2UsCisJCS5zZlswXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJ VF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMl0J CT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJfSwgeworCQkuZHJtX2ZtdAk9IERSTV9G T1JNQVRfUkdCODg4LAorCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJ RF9SR0I4ODgsCisJCS5yZ2IJCT0gdHJ1ZSwKKwkJLnN3YXAJCT0gdHJ1ZSwKKwkJLmNocm9tYV9z dWIJPSBmYWxzZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQku c2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBf RElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9YQkdS ODg4OCwKKwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfUkdCQTg4 ODAsCisJCS5yZ2IJCT0gdHJ1ZSwKKwkJLnN3YXAJCT0gZmFsc2UsCisJCS5jaHJvbWFfc3ViCT0g ZmFsc2UsCisJCS5zZlswXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzFd CQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1Bf QVZfQlVGXzhCSVRfU0YsCisJfSwgeworCQkuZHJtX2ZtdAk9IERSTV9GT1JNQVRfWFJHQjg4ODgs CisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1JHQkE4ODgwLAor CQkucmdiCQk9IHRydWUsCisJCS5zd2FwCQk9IHRydWUsCisJCS5jaHJvbWFfc3ViCT0gZmFsc2Us CisJCS5zZlswXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZ TlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVG XzhCSVRfU0YsCisJfSwgeworCQkuZHJtX2ZtdAk9IERSTV9GT1JNQVRfWEJHUjIxMDEwMTAsCisJ CS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1JHQjg4OF8xMCwKKwkJ LnJnYgkJPSB0cnVlLAorCQkuc3dhcAkJPSBmYWxzZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwK KwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl8xMEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZ TlFNUF9ESVNQX0FWX0JVRl8xMEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FWX0JV Rl8xMEJJVF9TRiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9YUkdCMjEwMTAxMCwK KwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfUkdCODg4XzEwLAor CQkucmdiCQk9IHRydWUsCisJCS5zd2FwCQk9IHRydWUsCisJCS5jaHJvbWFfc3ViCT0gZmFsc2Us CisJCS5zZlswXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfMTBCSVRfU0YsCisJCS5zZlsxXQkJPSBa WU5RTVBfRElTUF9BVl9CVUZfMTBCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9C VUZfMTBCSVRfU0YsCisJfSwgeworCQkuZHJtX2ZtdAk9IERSTV9GT1JNQVRfWVVWNDIwLAorCQku ZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX1ZJRF9ZVjE2XzQyMCwKKwkJLnJn YgkJPSBmYWxzZSwKKwkJLnN3YXAJCT0gZmFsc2UsCisJCS5jaHJvbWFfc3ViCT0gdHJ1ZSwKKwkJ LnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1Q X0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJ VF9TRiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9ZVlU0MjAsCisJCS5kaXNwX2Zt dAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfVklEX1lWMTZfNDIwLAorCQkucmdiCQk9IGZh bHNlLAorCQkuc3dhcAkJPSB0cnVlLAorCQkuY2hyb21hX3N1Ygk9IHRydWUsCisJCS5zZlswXQkJ PSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FW X0JVRl84QklUX1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJ fSwgeworCQkuZHJtX2ZtdAk9IERSTV9GT1JNQVRfTlYxMiwKKwkJLmRpc3BfZm10CT0gWllOUU1Q X0RJU1BfQVZfQlVGX0ZNVF9OTF9WSURfWVYxNkNJXzQyMCwKKwkJLnJnYgkJPSBmYWxzZSwKKwkJ LnN3YXAJCT0gZmFsc2UsCisJCS5jaHJvbWFfc3ViCT0gdHJ1ZSwKKwkJLnNmWzBdCQk9IFpZTlFN UF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhC SVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7CisJ CS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9OVjIxLAorCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9B Vl9CVUZfRk1UX05MX1ZJRF9ZVjE2Q0lfNDIwLAorCQkucmdiCQk9IGZhbHNlLAorCQkuc3dhcAkJ PSB0cnVlLAorCQkuY2hyb21hX3N1Ygk9IHRydWUsCisJCS5zZlswXQkJPSBaWU5RTVBfRElTUF9B Vl9CVUZfOEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAor CQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJfQorfTsKKworLyogTGlz dCBvZiBncmFwaGljcyBsYXllciBmb3JtYXRzICovCisjZGVmaW5lIFpZTlFNUF9ESVNQX0FWX0JV Rl9HRlhfRk1UX1JHQjU2NQkxMAorc3RhdGljIGNvbnN0IHN0cnVjdCB6eW5xbXBfZGlzcF9mbXQg YXZfYnVmX2dmeF9mbXRzW10gPSB7CisJeworCQkuZHJtX2ZtdAk9IERSTV9GT1JNQVRfQUJHUjg4 ODgsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfR0ZYX1JHQkE4ODg4 LAorCQkucmdiCQk9IHRydWUsCisJCS5zd2FwCQk9IGZhbHNlLAorCQkuY2hyb21hX3N1Ygk9IGZh bHNlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsxXQkJ PSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FW X0JVRl84QklUX1NGLAorCX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX0FSR0I4ODg4LAor CQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF9SR0JBODg4OCwKKwkJ LnJnYgkJPSB0cnVlLAorCQkuc3dhcAkJPSB0cnVlLAorCQkuY2hyb21hX3N1Ygk9IGZhbHNlLAor CQkuc2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsxXQkJPSBaWU5R TVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84 QklUX1NGLAorCX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX1JHQkE4ODg4LAorCQkuZGlz cF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF9BQkdSODg4OCwKKwkJLnJnYgkJ PSB0cnVlLAorCQkuc3dhcAkJPSBmYWxzZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwKKwkJLnNm WzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJ U1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9T RiwKKwl9LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9CR1JBODg4OCwKKwkJLmRpc3BfZm10 CT0gWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9HRlhfQUJHUjg4ODgsCisJCS5yZ2IJCT0gdHJ1 ZSwKKwkJLnN3YXAJCT0gdHJ1ZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwKKwkJLnNmWzBdCQk9 IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZf QlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9 LCB7CisJCS5kcm1fZm10CT0gRFJNX0ZPUk1BVF9CR1I4ODgsCisJCS5kaXNwX2ZtdAk9IFpZTlFN UF9ESVNQX0FWX0JVRl9GTVRfTkxfR0ZYX1JHQjg4OCwKKwkJLnJnYgkJPSB0cnVlLAorCQkuc3dh cAkJPSBmYWxzZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9E SVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRf U0YsCisJCS5zZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7CisJCS5k cm1fZm10CT0gRFJNX0ZPUk1BVF9SR0I4ODgsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FW X0JVRl9GTVRfTkxfR0ZYX0JHUjg4OCwKKwkJLnJnYgkJPSB0cnVlLAorCQkuc3dhcAkJPSBmYWxz ZSwKKwkJLmNocm9tYV9zdWIJPSBmYWxzZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JV Rl84QklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5z ZlsyXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7CisJCS5kcm1fZm10CT0g RFJNX0ZPUk1BVF9SR0JBNTU1MSwKKwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1BfQVZfQlVGX0ZN VF9OTF9HRlhfUkdCQTU1NTEsCisJCS5yZ2IJCT0gdHJ1ZSwKKwkJLnN3YXAJCT0gZmFsc2UsCisJ CS5jaHJvbWFfc3ViCT0gZmFsc2UsCisJCS5zZlswXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfNUJJ VF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl81QklUX1NGLAorCQkuc2ZbMl0J CT0gWllOUU1QX0RJU1BfQVZfQlVGXzVCSVRfU0YsCisJfSwgeworCQkuZHJtX2ZtdAk9IERSTV9G T1JNQVRfQkdSQTU1NTEsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxf R0ZYX1JHQkE1NTUxLAorCQkucmdiCQk9IHRydWUsCisJCS5zd2FwCQk9IHRydWUsCisJCS5jaHJv bWFfc3ViCT0gZmFsc2UsCisJCS5zZlswXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfNUJJVF9TRiwK KwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl81QklUX1NGLAorCQkuc2ZbMl0JCT0gWllO UU1QX0RJU1BfQVZfQlVGXzVCSVRfU0YsCisJfSwgeworCQkuZHJtX2ZtdAk9IERSTV9GT1JNQVRf UkdCQTQ0NDQsCisJCS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9GTVRfTkxfR0ZYX1JH QkE0NDQ0LAorCQkucmdiCQk9IHRydWUsCisJCS5zd2FwCQk9IGZhbHNlLAorCQkuY2hyb21hX3N1 Ygk9IGZhbHNlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzRCSVRfU0YsCisJCS5z ZlsxXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfNEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9E SVNQX0FWX0JVRl80QklUX1NGLAorCX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX0JHUkE0 NDQ0LAorCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfRk1UX05MX0dGWF9SR0JBNDQ0 NCwKKwkJLnJnYgkJPSB0cnVlLAorCQkuc3dhcAkJPSB0cnVlLAorCQkuY2hyb21hX3N1Ygk9IGZh bHNlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzRCSVRfU0YsCisJCS5zZlsxXQkJ PSBaWU5RTVBfRElTUF9BVl9CVUZfNEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FW X0JVRl80QklUX1NGLAorCX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX1JHQjU2NSwKKwkJ LmRpc3BfZm10CT0gWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9HRlhfUkdCNTY1LAorCQkucmdi CQk9IHRydWUsCisJCS5zd2FwCQk9IGZhbHNlLAorCQkuY2hyb21hX3N1Ygk9IGZhbHNlLAorCQku c2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzVCSVRfU0YsCisJCS5zZlsxXQkJPSBaWU5RTVBf RElTUF9BVl9CVUZfNkJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl81QklU X1NGLAorCX0sIHsKKwkJLmRybV9mbXQJPSBEUk1fRk9STUFUX0JHUjU2NSwKKwkJLmRpc3BfZm10 CT0gWllOUU1QX0RJU1BfQVZfQlVGX0ZNVF9OTF9HRlhfUkdCNTY1LAorCQkucmdiCQk9IHRydWUs CisJCS5zd2FwCQk9IHRydWUsCisJCS5jaHJvbWFfc3ViCT0gZmFsc2UsCisJCS5zZlswXQkJPSBa WU5RTVBfRElTUF9BVl9CVUZfNUJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFNUF9ESVNQX0FWX0JV Rl82QklUX1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzVCSVRfU0YsCisJfQor fTsKKworLyogTGlzdCBvZiBsaXZlIGZvcm1hdHMgKi8KKy8qIEZvcm1hdCBjYW4gYmUgY29tYmlu YXRpb24gb2YgY29sb3IsIGJwYywgYW5kIGNiLWNyIG9yZGVyLgorICogLSBDb2xvcjogUkdCIC8g WVVWNDQ0IC8gWVVWNDIyIC8gWSBvbmx5CisgKiAtIEJQQzogNiwgOCwgMTAsIDEyCisgKiAtIFN3 YXA6IENiIGFuZCBDciBzd2FwCisgKiB3aGljaCBjYW4gYmUgMzIgYnVzIGZvcm1hdHMuIE9ubHkg bGlzdCB0aGUgc3Vic2V0IG9mIHRob3NlIGZvciBub3cuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgenlucW1wX2Rpc3BfZm10IGF2X2J1Zl9saXZlX2ZtdHNbXSA9IHsKKwl7CisJCS5idXNfZm10 CT0gTUVESUFfQlVTX0ZNVF9SR0I2NjZfMVgxOCwKKwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1Bf QVZfQlVGX0xJVkVfQ09ORklHX0JQQ182IHx8CisJCQkJICBaWU5RTVBfRElTUF9BVl9CVUZfTElW RV9DT05GSUdfRk1UX1JHQiwKKwkJLnJnYgkJPSB0cnVlLAorCQkuc3dhcAkJPSBmYWxzZSwKKwkJ LmNocm9tYV9zdWIJPSBmYWxzZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl82QklU X1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzZCSVRfU0YsCisJCS5zZlsyXQkJ PSBaWU5RTVBfRElTUF9BVl9CVUZfNkJJVF9TRiwKKwl9LCB7CisJCS5idXNfZm10CT0gTUVESUFf QlVTX0ZNVF9SQkc4ODhfMVgyNCwKKwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1BfQVZfQlVGX0xJ VkVfQ09ORklHX0JQQ184IHx8CisJCQkJICBaWU5RTVBfRElTUF9BVl9CVUZfTElWRV9DT05GSUdf Rk1UX1JHQiwKKwkJLnJnYgkJPSB0cnVlLAorCQkuc3dhcAkJPSBmYWxzZSwKKwkJLmNocm9tYV9z dWIJPSBmYWxzZSwKKwkJLnNmWzBdCQk9IFpZTlFNUF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQku c2ZbMV0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsyXQkJPSBaWU5RTVBf RElTUF9BVl9CVUZfOEJJVF9TRiwKKwl9LCB7CisJCS5idXNfZm10CT0gTUVESUFfQlVTX0ZNVF9V WVZZOF8xWDE2LAorCQkuZGlzcF9mbXQJPSBaWU5RTVBfRElTUF9BVl9CVUZfTElWRV9DT05GSUdf QlBDXzggfHwKKwkJCQkgIFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZFX0NPTkZJR19GTVRfWVVWNDIy LAorCQkucmdiCQk9IGZhbHNlLAorCQkuc3dhcAkJPSBmYWxzZSwKKwkJLmNocm9tYV9zdWIJPSB0 cnVlLAorCQkuc2ZbMF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhCSVRfU0YsCisJCS5zZlsxXQkJ PSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzJdCQk9IFpZTlFNUF9ESVNQX0FW X0JVRl84QklUX1NGLAorCX0sIHsKKwkJLmJ1c19mbXQJPSBNRURJQV9CVVNfRk1UX1ZVWThfMVgy NCwKKwkJLmRpc3BfZm10CT0gWllOUU1QX0RJU1BfQVZfQlVGX0xJVkVfQ09ORklHX0JQQ184IHx8 CisJCQkJICBaWU5RTVBfRElTUF9BVl9CVUZfTElWRV9DT05GSUdfRk1UX1lVVjQ0NCwKKwkJLnJn YgkJPSBmYWxzZSwKKwkJLnN3YXAJCT0gZmFsc2UsCisJCS5jaHJvbWFfc3ViCT0gZmFsc2UsCisJ CS5zZlswXQkJPSBaWU5RTVBfRElTUF9BVl9CVUZfOEJJVF9TRiwKKwkJLnNmWzFdCQk9IFpZTlFN UF9ESVNQX0FWX0JVRl84QklUX1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzhC SVRfU0YsCisJfSwgeworCQkuYnVzX2ZtdAk9IE1FRElBX0JVU19GTVRfVVlWWTEwXzFYMjAsCisJ CS5kaXNwX2ZtdAk9IFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZFX0NPTkZJR19CUENfMTAgfHwKKwkJ CQkgIFpZTlFNUF9ESVNQX0FWX0JVRl9MSVZFX0NPTkZJR19GTVRfWVVWNDIyLAorCQkucmdiCQk9 IGZhbHNlLAorCQkuc3dhcAkJPSBmYWxzZSwKKwkJLmNocm9tYV9zdWIJPSB0cnVlLAorCQkuc2Zb MF0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzEwQklUX1NGLAorCQkuc2ZbMV0JCT0gWllOUU1QX0RJ U1BfQVZfQlVGXzEwQklUX1NGLAorCQkuc2ZbMl0JCT0gWllOUU1QX0RJU1BfQVZfQlVGXzEwQklU X1NGLAorCX0KK307CisKKy8qKgorICogenlucW1wX2Rpc3BfYXZfYnVmX3NldF9mbXQgLSBTZXQg dGhlIGlucHV0IGZvcm1hdHMKKyAqIEBhdl9idWY6IGF2IGJ1ZmZlciBtYW5hZ2VyCisgKiBAZm10 OiBmb3JtYXRzCisgKgorICogU2V0IHRoZSBhdiBidWZmZXIgbWFuYWdlciBmb3JtYXQgdG8gQGZt dC4gQGZtdCBzaG91bGQgaGF2ZSB2YWxpZCB2YWx1ZXMKKyAqIGZvciBib3RoIHZpZGVvIGFuZCBn cmFwaGljcyBsYXllci4KKyAqLworc3RhdGljIHZvaWQKK3p5bnFtcF9kaXNwX2F2X2J1Zl9zZXRf Zm10KHN0cnVjdCB6eW5xbXBfZGlzcF9hdl9idWYgKmF2X2J1ZiwgdTMyIGZtdCkKK3sKKwl6eW5x bXBfZGlzcF93cml0ZShhdl9idWYtPmJhc2UsIFpZTlFNUF9ESVNQX0FWX0JVRl9GTVQsIGZtdCk7 Cit9CisKKy8qKgorICogenlucW1wX2Rpc3BfYXZfYnVmX2dldF9mbXQgLSBHZXQgdGhlIGlucHV0 IGZvcm1hdHMKKyAqIEBhdl9idWY6IGF2IGJ1ZmZlciBtYW5hZ2VyCisgKgorICogR2V0IHRoZSBp bnB1dCBmb3JtYXRzICh3aGljaCBpbmNsdWRlIHZpZGVvIGFuZCBncmFwaGljcykgb2YKKyAqIGF2 IGJ1ZmZlciBtYW5hZ2VyLgorICoKKyAqIFJldHVybjogdmFsdWUgb2YgWllOUU1QX0RJU1BfQVZf QlVGX0ZNVCByZWdpc3Rlci4KKyAqLworc3RhdGljIHUzMgorenlucW1wX2Rpc3BfYXZfYnVmX2dl dF9mbXQoc3RydWN0IHp5bnFtcF9kaXNwX2F2X2J1ZiAqYXZfYnVmKQoreworCXJldHVybiB6eW5x bXBfZGlzcF9yZWFkKGF2X2J1Zi0+YmFzZSwgWllOUU1QX0RJU1BfQVZfQlVGX0ZNVCk7Cit9CisK Ky8qKgorICogenlucW1wX2Rpc3BfYXZfYnVmX3NldF92aWRfY2xvY2tfc3JjIC0gU2V0IHRoZSB2 aWRlbyBjbG9jayBzb3VyY2UKKyAqIEBhdl9idWY6IGF2IGJ1ZmZlciBtYW5hZ2VyCisgKiBAZnJv bV9wczogZmxhZyBpZiB0aGUgdmlkZW8gY2xvY2sgaXMgZnJvbSBwcworICoKKyAqIFNldCB0aGUg dmlkZW8gY2xvY2sgc291cmNlIGJhc2VkIG9uIEBmcm9tX3BzLiBJdCBjYW4gY29tZSBmcm9tIGVp dGhlciBQUyBvcgorICogUEwuCisgKi8KK3N0YXRpYyB2b2lkCit6eW5xbXBfZGlzcF9hdl9idWZf c2V0X3ZpZF9jbG9ja19zcmMoc3RydWN0IHp5bnFtcF9kaXNwX2F2X2J1ZiAqYXZfYnVmLAorCQkJ CSAgICAgYm9vbCBmcm9tX3BzKQoreworCXUzMiByZWcgPSB6eW5xbXBfZGlzcF9yZWFkKGF2X2J1 Zi0+YmFzZSwgWllOUU1QX0RJU1BfQVZfQlVGX0NMS19TUkMpOworCisJaWYgKGZyb21fcHMpCisJ CXJlZyB8PSBaWU5RTVBfRElTUF9BVl9CVUZfQ0xLX1NSQ19WSURfRlJPTV9QUzsKKwllbHNlCisJ CXJlZyAmPSB+WllOUU1QX0RJU1BfQVZfQlVGX0NMS19TUkNfVklEX0ZST01fUFM7CisJenlucW1w X2Rpc3Bfd3JpdGUoYXZfYnVmLT5iYXNlLCBaWU5RTVBfRElTUF9BVl9CVUZfQ0xLX1NSQywgcmVn KTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9hdl9idWZfc2V0X3ZpZF90aW1pbmdfc3JjIC0g U2V0IHRoZSB2aWRlbyB0aW1pbmcgc291cmNlCisgKiBAYXZfYnVmOiBhdiBidWZmZXIgbWFuYWdl cgorICogQGludGVybmFsOiBmbGFnIGlmIHRoZSB2aWRlbyB0aW1pbmcgaXMgZ2VuZXJhdGVkIGlu dGVybmFsbHkKKyAqCisgKiBTZXQgdGhlIHZpZGVvIHRpbWluZyBzb3VyY2UgYmFzZWQgb24gQGlu dGVybmFsLiBJdCBjYW4gY29tZSBleHRlcm5hbGx5IG9yCisgKiBiZSBnZW5lcmF0ZWQgaW50ZXJu YWxseS4KKyAqLworc3RhdGljIHZvaWQKK3p5bnFtcF9kaXNwX2F2X2J1Zl9zZXRfdmlkX3RpbWlu Z19zcmMoc3RydWN0IHp5bnFtcF9kaXNwX2F2X2J1ZiAqYXZfYnVmLAorCQkJCSAgICAgIGJvb2wg aW50ZXJuYWwpCit7CisJdTMyIHJlZyA9IHp5bnFtcF9kaXNwX3JlYWQoYXZfYnVmLT5iYXNlLCBa WU5RTVBfRElTUF9BVl9CVUZfQ0xLX1NSQyk7CisKKwlpZiAoaW50ZXJuYWwpCisJCXJlZyB8PSBa WU5RTVBfRElTUF9BVl9CVUZfQ0xLX1NSQ19WSURfSU5URVJOQUxfVElNSU5HOworCWVsc2UKKwkJ cmVnICY9IH5aWU5RTVBfRElTUF9BVl9CVUZfQ0xLX1NSQ19WSURfSU5URVJOQUxfVElNSU5HOwor CXp5bnFtcF9kaXNwX3dyaXRlKGF2X2J1Zi0+YmFzZSwgWllOUU1QX0RJU1BfQVZfQlVGX0NMS19T UkMsIHJlZyk7Cit9CisKKy8qKgorICogenlucW1wX2Rpc3BfYXZfYnVmX3NldF9hdWRfY2xvY2tf c3JjIC0gU2V0IHRoZSBhdWRpbyBjbG9jayBzb3VyY2UKKyAqIEBhdl9idWY6IGF2IGJ1ZmZlciBt YW5hZ2VyCisgKiBAZnJvbV9wczogZmxhZyBpZiB0aGUgdmlkZW8gY2xvY2sgaXMgZnJvbSBwcwor ICoKKyAqIFNldCB0aGUgYXVkaW8gY2xvY2sgc291cmNlIGJhc2VkIG9uIEBmcm9tX3BzLiBJdCBj YW4gY29tZSBmcm9tIGVpdGhlciBQUyBvcgorICogUEwuCisgKi8KK3N0YXRpYyB2b2lkCit6eW5x bXBfZGlzcF9hdl9idWZfc2V0X2F1ZF9jbG9ja19zcmMoc3RydWN0IHp5bnFtcF9kaXNwX2F2X2J1 ZiAqYXZfYnVmLAorCQkJCSAgICAgYm9vbCBmcm9tX3BzKQoreworCXUzMiByZWcgPSB6eW5xbXBf ZGlzcF9yZWFkKGF2X2J1Zi0+YmFzZSwgWllOUU1QX0RJU1BfQVZfQlVGX0NMS19TUkMpOworCisJ aWYgKGZyb21fcHMpCisJCXJlZyB8PSBaWU5RTVBfRElTUF9BVl9CVUZfQ0xLX1NSQ19BVURfRlJP TV9QUzsKKwllbHNlCisJCXJlZyAmPSB+WllOUU1QX0RJU1BfQVZfQlVGX0NMS19TUkNfQVVEX0ZS T01fUFM7CisJenlucW1wX2Rpc3Bfd3JpdGUoYXZfYnVmLT5iYXNlLCBaWU5RTVBfRElTUF9BVl9C VUZfQ0xLX1NSQywgcmVnKTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9hdl9idWZfZW5hYmxl X2J1ZiAtIEVuYWJsZSBidWZmZXJzCisgKiBAYXZfYnVmOiBhdiBidWZmZXIgbWFuYWdlcgorICoK KyAqIEVuYWJsZSBhbGwgKHZpZGVvIGFuZCBhdWRpbykgYnVmZmVycy4KKyAqLworc3RhdGljIHZv aWQKK3p5bnFtcF9kaXNwX2F2X2J1Zl9lbmFibGVfYnVmKHN0cnVjdCB6eW5xbXBfZGlzcF9hdl9i dWYgKmF2X2J1ZikKK3sKKwl1MzIgcmVnLCBpOworCisJcmVnID0gWllOUU1QX0RJU1BfQVZfQlVG X0NIQlVGX0VOOworCXJlZyB8PSBaWU5RTVBfRElTUF9BVl9CVUZfQ0hCVUZfQlVSU1RfTEVOX01B WCA8PAorCSAgICAgICBaWU5RTVBfRElTUF9BVl9CVUZfQ0hCVUZfQlVSU1RfTEVOX1NISUZUOwor CisJZm9yIChpID0gMDsgaSA8IFpZTlFNUF9ESVNQX0FWX0JVRl9OVU1fVklEX0dGWF9CVUZGRVJT OyBpKyspCisJCXp5bnFtcF9kaXNwX3dyaXRlKGF2X2J1Zi0+YmFzZSwKKwkJCQkgIFpZTlFNUF9E SVNQX0FWX0JVRl9DSEJVRiArIGkgKiA0LCByZWcpOworCisJcmVnID0gWllOUU1QX0RJU1BfQVZf QlVGX0NIQlVGX0VOOworCXJlZyB8PSBaWU5RTVBfRElTUF9BVl9CVUZfQ0hCVUZfQlVSU1RfTEVO X0FVRF9NQVggPDwKKwkgICAgICAgWllOUU1QX0RJU1BfQVZfQlVGX0NIQlVGX0JVUlNUX0xFTl9T SElGVDsKKworCWZvciAoOyBpIDwgWllOUU1QX0RJU1BfQVZfQlVGX05VTV9CVUZGRVJTOyBpKysp CisJCXp5bnFtcF9kaXNwX3dyaXRlKGF2X2J1Zi0+YmFzZSwKKwkJCQkgIFpZTlFNUF9ESVNQX0FW X0JVRl9DSEJVRiArIGkgKiA0LCByZWcpOworfQorCisvKioKKyAqIHp5bnFtcF9kaXNwX2F2X2J1 Zl9kaXNhYmxlX2J1ZiAtIERpc2FibGUgYnVmZmVycworICogQGF2X2J1ZjogYXYgYnVmZmVyIG1h bmFnZXIKKyAqCisgKiBEaXNhYmxlIGFsbCAodmlkZW8gYW5kIGF1ZGlvKSBidWZmZXJzLgorICov CitzdGF0aWMgdm9pZAorenlucW1wX2Rpc3BfYXZfYnVmX2Rpc2FibGVfYnVmKHN0cnVjdCB6eW5x bXBfZGlzcF9hdl9idWYgKmF2X2J1ZikKK3sKKwl1MzIgcmVnLCBpOworCisJcmVnID0gWllOUU1Q X0RJU1BfQVZfQlVGX0NIQlVGX0ZMVVNIICYgflpZTlFNUF9ESVNQX0FWX0JVRl9DSEJVRl9FTjsK Kwlmb3IgKGkgPSAwOyBpIDwgWllOUU1QX0RJU1BfQVZfQlVGX05VTV9CVUZGRVJTOyBpKyspCisJ CXp5bnFtcF9kaXNwX3dyaXRlKGF2X2J1Zi0+YmFzZSwKKwkJCQkgIFpZTlFNUF9ESVNQX0FWX0JV Rl9DSEJVRiArIGkgKiA0LCByZWcpOworfQorCisvKioKKyAqIHp5bnFtcF9kaXNwX2F2X2J1Zl9l bmFibGVfYXVkIC0gRW5hYmxlIGF1ZGlvCisgKiBAYXZfYnVmOiBhdiBidWZmZXIgbWFuYWdlcgor ICoKKyAqIEVuYWJsZSBhbGwgYXVkaW8gYnVmZmVycy4KKyAqLworc3RhdGljIHZvaWQKK3p5bnFt cF9kaXNwX2F2X2J1Zl9lbmFibGVfYXVkKHN0cnVjdCB6eW5xbXBfZGlzcF9hdl9idWYgKmF2X2J1 ZikKK3sKKwl1MzIgcmVnOworCisJcmVnID0genlucW1wX2Rpc3BfcmVhZChhdl9idWYtPmJhc2Us IFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVQpOworCXJlZyAmPSB+WllOUU1QX0RJU1BfQVZfQlVG X09VVFBVVF9BVUQxX01BU0s7CisJcmVnIHw9IFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfQVVE MV9NRU07CisJcmVnIHw9IFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfQVVEMl9FTjsKKwl6eW5x bXBfZGlzcF93cml0ZShhdl9idWYtPmJhc2UsIFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVQsIHJl Zyk7Cit9CisKKy8qKgorICogenlucW1wX2Rpc3BfYXZfYnVmX2VuYWJsZSAtIEVuYWJsZSB0aGUg dmlkZW8gcGlwZQorICogQGF2X2J1ZjogYXYgYnVmZmVyIG1hbmFnZXIKKyAqCisgKiBEZS1hc3Nl cnQgdGhlIHZpZGVvIHBpcGUgcmVzZXQKKyAqLworc3RhdGljIHZvaWQKK3p5bnFtcF9kaXNwX2F2 X2J1Zl9lbmFibGUoc3RydWN0IHp5bnFtcF9kaXNwX2F2X2J1ZiAqYXZfYnVmKQoreworCXp5bnFt cF9kaXNwX3dyaXRlKGF2X2J1Zi0+YmFzZSwgWllOUU1QX0RJU1BfQVZfQlVGX1NSU1RfUkVHLCAw KTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9hdl9idWZfZGlzYWJsZSAtIERpc2FibGUgdGhl IHZpZGVvIHBpcGUKKyAqIEBhdl9idWY6IGF2IGJ1ZmZlciBtYW5hZ2VyCisgKgorICogQXNzZXJ0 IHRoZSB2aWRlbyBwaXBlIHJlc2V0CisgKi8KK3N0YXRpYyB2b2lkCit6eW5xbXBfZGlzcF9hdl9i dWZfZGlzYWJsZShzdHJ1Y3QgenlucW1wX2Rpc3BfYXZfYnVmICphdl9idWYpCit7CisJenlucW1w X2Rpc3Bfd3JpdGUoYXZfYnVmLT5iYXNlLCBaWU5RTVBfRElTUF9BVl9CVUZfU1JTVF9SRUcsCisJ CQkgIFpZTlFNUF9ESVNQX0FWX0JVRl9TUlNUX1JFR19WSURfUlNUKTsKK30KKworLyoqCisgKiB6 eW5xbXBfZGlzcF9hdl9idWZfZGlzYWJsZV9hdWQgLSBEaXNhYmxlIGF1ZGlvCisgKiBAYXZfYnVm OiBhdiBidWZmZXIgbWFuYWdlcgorICoKKyAqIERpc2FibGUgYWxsIGF1ZGlvIGJ1ZmZlcnMuCisg Ki8KK3N0YXRpYyB2b2lkCit6eW5xbXBfZGlzcF9hdl9idWZfZGlzYWJsZV9hdWQoc3RydWN0IHp5 bnFtcF9kaXNwX2F2X2J1ZiAqYXZfYnVmKQoreworCXUzMiByZWc7CisKKwlyZWcgPSB6eW5xbXBf ZGlzcF9yZWFkKGF2X2J1Zi0+YmFzZSwgWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVCk7CisJcmVn ICY9IH5aWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX0FVRDFfTUFTSzsKKwlyZWcgfD0gWllOUU1Q X0RJU1BfQVZfQlVGX09VVFBVVF9BVUQxX0RJU0FCTEU7CisJcmVnICY9IH5aWU5RTVBfRElTUF9B Vl9CVUZfT1VUUFVUX0FVRDJfRU47CisJenlucW1wX2Rpc3Bfd3JpdGUoYXZfYnVmLT5iYXNlLCBa WU5RTVBfRElTUF9BVl9CVUZfT1VUUFVULCByZWcpOworfQorCisvKioKKyAqIHp5bnFtcF9kaXNw X2F2X2J1Zl9zZXRfdHBnIC0gU2V0IFRQRyBtb2RlCisgKiBAYXZfYnVmOiBhdiBidWZmZXIgbWFu YWdlcgorICogQHRwZ19vbjogaWYgVFBHIHNob3VsZCBiZSBvbgorICoKKyAqIFNldCB0aGUgVFBH IG1vZGUgYmFzZWQgb24gQHRwZ19vbi4KKyAqLworc3RhdGljIHZvaWQgenlucW1wX2Rpc3BfYXZf YnVmX3NldF90cGcoc3RydWN0IHp5bnFtcF9kaXNwX2F2X2J1ZiAqYXZfYnVmLAorCQkJCSAgICAg ICBib29sIHRwZ19vbikKK3sKKwl1MzIgcmVnOworCisJcmVnID0genlucW1wX2Rpc3BfcmVhZChh dl9idWYtPmJhc2UsIFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVQpOworCXJlZyAmPSB+WllOUU1Q X0RJU1BfQVZfQlVGX09VVFBVVF9WSUQxX01BU0s7CisJaWYgKHRwZ19vbikKKwkJcmVnIHw9IFpZ TlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfVklEMV9QQVRURVJOOworCWVsc2UKKwkJcmVnICY9IH5a WU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX1ZJRDFfUEFUVEVSTjsKKwl6eW5xbXBfZGlzcF93cml0 ZShhdl9idWYtPmJhc2UsIFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVQsIHJlZyk7Cit9CisKKy8q KgorICogenlucW1wX2Rpc3BfYXZfYnVmX2VuYWJsZV92aWQgLSBFbmFibGUgdGhlIHZpZGVvIGxh eWVyIGJ1ZmZlcgorICogQGF2X2J1ZjogYXYgYnVmZmVyIG1hbmFnZXIKKyAqIEBsYXllcjogbGF5 ZXIgdG8gZW5hYmxlCisgKiBAbW9kZTogb3BlcmF0aW9uIG1vZGUgb2YgbGF5ZXIKKyAqCisgKiBF bmFibGUgdGhlIHZpZGVvL2dyYXBoaWNzIGJ1ZmZlciBmb3IgQGxheWVyLgorICovCitzdGF0aWMg dm9pZCB6eW5xbXBfZGlzcF9hdl9idWZfZW5hYmxlX3ZpZChzdHJ1Y3QgenlucW1wX2Rpc3BfYXZf YnVmICphdl9idWYsCisJCQkJCSAgc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyICpsYXllciwKKwkJ CQkJICBlbnVtIHp5bnFtcF9kaXNwX2xheWVyX21vZGUgbW9kZSkKK3sKKwl1MzIgcmVnOworCisJ cmVnID0genlucW1wX2Rpc3BfcmVhZChhdl9idWYtPmJhc2UsIFpZTlFNUF9ESVNQX0FWX0JVRl9P VVRQVVQpOworCWlmIChsYXllci0+aWQgPT0gWllOUU1QX0RJU1BfTEFZRVJfVklEKSB7CisJCXJl ZyAmPSB+WllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVF9WSUQxX01BU0s7CisJCWlmIChtb2RlID09 IFpZTlFNUF9ESVNQX0xBWUVSX05PTkxJVkUpCisJCQlyZWcgfD0gWllOUU1QX0RJU1BfQVZfQlVG X09VVFBVVF9WSUQxX01FTTsKKwkJZWxzZQorCQkJcmVnIHw9IFpZTlFNUF9ESVNQX0FWX0JVRl9P VVRQVVRfVklEMV9MSVZFOworCX0gZWxzZSB7CisJCXJlZyAmPSB+WllOUU1QX0RJU1BfQVZfQlVG X09VVFBVVF9WSUQyX01BU0s7CisJCXJlZyB8PSBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX1ZJ RDJfTUVNOworCQlpZiAobW9kZSA9PSBaWU5RTVBfRElTUF9MQVlFUl9OT05MSVZFKQorCQkJcmVn IHw9IFpZTlFNUF9ESVNQX0FWX0JVRl9PVVRQVVRfVklEMl9NRU07CisJCWVsc2UKKwkJCXJlZyB8 PSBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX1ZJRDJfTElWRTsKKwl9CisJenlucW1wX2Rpc3Bf d3JpdGUoYXZfYnVmLT5iYXNlLCBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVULCByZWcpOworfQor CisvKioKKyAqIHp5bnFtcF9kaXNwX2F2X2J1Zl9kaXNhYmxlX3ZpZCAtIERpc2FibGUgdGhlIHZp ZGVvIGxheWVyIGJ1ZmZlcgorICogQGF2X2J1ZjogYXYgYnVmZmVyIG1hbmFnZXIKKyAqIEBsYXll cjogbGF5ZXIgdG8gZGlzYWJsZQorICoKKyAqIERpc2FibGUgdGhlIHZpZGVvL2dyYXBoaWNzIGJ1 ZmZlciBmb3IgQGxheWVyLgorICovCitzdGF0aWMgdm9pZAorenlucW1wX2Rpc3BfYXZfYnVmX2Rp c2FibGVfdmlkKHN0cnVjdCB6eW5xbXBfZGlzcF9hdl9idWYgKmF2X2J1ZiwKKwkJCSAgICAgICBz dHJ1Y3QgenlucW1wX2Rpc3BfbGF5ZXIgKmxheWVyKQoreworCXUzMiByZWc7CisKKwlyZWcgPSB6 eW5xbXBfZGlzcF9yZWFkKGF2X2J1Zi0+YmFzZSwgWllOUU1QX0RJU1BfQVZfQlVGX09VVFBVVCk7 CisJaWYgKGxheWVyLT5pZCA9PSBaWU5RTVBfRElTUF9MQVlFUl9WSUQpIHsKKwkJcmVnICY9IH5a WU5RTVBfRElTUF9BVl9CVUZfT1VUUFVUX1ZJRDFfTUFTSzsKKwkJcmVnIHw9IFpZTlFNUF9ESVNQ X0FWX0JVRl9PVVRQVVRfVklEMV9OT05FOworCX0gZWxzZSB7CisJCXJlZyAmPSB+WllOUU1QX0RJ U1BfQVZfQlVGX09VVFBVVF9WSUQyX01BU0s7CisJCXJlZyB8PSBaWU5RTVBfRElTUF9BVl9CVUZf T1VUUFVUX1ZJRDJfRElTQUJMRTsKKwl9CisJenlucW1wX2Rpc3Bfd3JpdGUoYXZfYnVmLT5iYXNl LCBaWU5RTVBfRElTUF9BVl9CVUZfT1VUUFVULCByZWcpOworfQorCisvKioKKyAqIHp5bnFtcF9k aXNwX2F2X2J1Zl9pbml0X3NmIC0gSW5pdGlhbGl6ZSBzY2FsaW5nIGZhY3RvcnMKKyAqIEBhdl9i dWY6IGF2IGJ1ZmZlciBtYW5hZ2VyCisgKiBAdmlkX2ZtdDogdmlkZW8gZm9ybWF0IGRlc2NyaXB0 b3IKKyAqIEBnZnhfZm10OiBncmFwaGljcyBmb3JtYXQgZGVzY3JpcHRvcgorICoKKyAqIEluaXRp YWxpemUgc2NhbGluZyBmYWN0b3JzIGZvciBib3RoIHZpZGVvIGFuZCBncmFwaGljcyBsYXllcnMu CisgKiBJZiB0aGUgZm9ybWF0IGRlc2NyaXB0b3IgaXMgTlVMTCwgdGhlIGZ1bmN0aW9uIHNraXBz IHRoZSBwcm9ncmFtbWluZy4KKyAqLworc3RhdGljIHZvaWQgenlucW1wX2Rpc3BfYXZfYnVmX2lu aXRfc2Yoc3RydWN0IHp5bnFtcF9kaXNwX2F2X2J1ZiAqYXZfYnVmLAorCQkJCSAgICAgICBjb25z dCBzdHJ1Y3QgenlucW1wX2Rpc3BfZm10ICp2aWRfZm10LAorCQkJCSAgICAgICBjb25zdCBzdHJ1 Y3QgenlucW1wX2Rpc3BfZm10ICpnZnhfZm10KQoreworCXVuc2lnbmVkIGludCBpOworCXUzMiBv ZmZzZXQ7CisKKwlpZiAoZ2Z4X2ZtdCkgeworCQlvZmZzZXQgPSBaWU5RTVBfRElTUF9BVl9CVUZf R0ZYX0NPTVAwX1NGOworCQlmb3IgKGkgPSAwOyBpIDwgWllOUU1QX0RJU1BfQVZfQlVGX05VTV9T RjsgaSsrKQorCQkJenlucW1wX2Rpc3Bfd3JpdGUoYXZfYnVmLT5iYXNlLCBvZmZzZXQgKyBpICog NCwKKwkJCQkJICBnZnhfZm10LT5zZltpXSk7CisJfQorCisJaWYgKHZpZF9mbXQpIHsKKwkJb2Zm c2V0ID0gWllOUU1QX0RJU1BfQVZfQlVGX1ZJRF9DT01QMF9TRjsKKwkJZm9yIChpID0gMDsgaSA8 IFpZTlFNUF9ESVNQX0FWX0JVRl9OVU1fU0Y7IGkrKykKKwkJCXp5bnFtcF9kaXNwX3dyaXRlKGF2 X2J1Zi0+YmFzZSwgb2Zmc2V0ICsgaSAqIDQsCisJCQkJCSAgdmlkX2ZtdC0+c2ZbaV0pOworCX0K K30KKworLyoKKyAqIEF1ZGlvIGZ1bmN0aW9ucworICovCisKKy8qKgorICogenlucW1wX2Rpc3Bf YXVkX2luaXQgLSBJbml0aWFsaXplIHRoZSBhdWRpbworICogQGF1ZDogYXVkaW8KKyAqCisgKiBJ bml0aWFsaXplIHRoZSBhdWRpbyB3aXRoIGRlZmF1bHQgbWl4ZXIgdm9sdW1lLiBUaGUgZGUtYXNz ZXJ0aW9uIHdpbGwKKyAqIGluaXRpYWxpemUgdGhlIGF1ZGlvIHN0YXRlcy4KKyAqLworc3RhdGlj IHZvaWQgenlucW1wX2Rpc3BfYXVkX2luaXQoc3RydWN0IHp5bnFtcF9kaXNwX2F1ZCAqYXVkKQor eworCS8qIENsZWFyIHRoZSBhdWRpbyBzb2Z0IHJlc2V0IHJlZ2lzdGVyIGFzIGl0J3MgYW4gbm9u LXJlc2V0IGZsb3AgKi8KKwl6eW5xbXBfZGlzcF93cml0ZShhdWQtPmJhc2UsIFpZTlFNUF9ESVNQ X0FVRF9TT0ZUX1JFU0VULCAwKTsKKwl6eW5xbXBfZGlzcF93cml0ZShhdWQtPmJhc2UsIFpZTlFN UF9ESVNQX0FVRF9NSVhFUl9WT0xVTUUsCisJCQkgIFpZTlFNUF9ESVNQX0FVRF9NSVhFUl9WT0xV TUVfTk9fU0NBTEUpOworfQorCisvKioKKyAqIHp5bnFtcF9kaXNwX2F1ZF9kZWluaXQgLSBEZS1p bml0aWFsaXplIHRoZSBhdWRpbworICogQGF1ZDogYXVkaW8KKyAqCisgKiBQdXQgdGhlIGF1ZGlv IGluIHJlc2V0LgorICovCitzdGF0aWMgdm9pZCB6eW5xbXBfZGlzcF9hdWRfZGVpbml0KHN0cnVj dCB6eW5xbXBfZGlzcF9hdWQgKmF1ZCkKK3sKKwl6eW5xbXBfZGlzcF9zZXQoYXVkLT5iYXNlLCBa WU5RTVBfRElTUF9BVURfU09GVF9SRVNFVCwKKwkJCVpZTlFNUF9ESVNQX0FVRF9TT0ZUX1JFU0VU X0FVRF9TUlNUKTsKK30KKworLyoKKyAqIFp5bnFNUCBEaXNwbGF5IGxheWVyIGZ1bmN0aW9ucwor ICovCisKKy8qKgorICogenlucW1wX2Rpc3BfbGF5ZXJfY2hlY2tfc2l6ZSAtIFZlcmlmeSB3aWR0 aCBhbmQgaGVpZ2h0IGZvciB0aGUgbGF5ZXIKKyAqIEBkaXNwOiBEaXNwbGF5IHN1YnN5c3RlbQor ICogQGxheWVyOiBsYXllcgorICogQHdpZHRoOiB3aWR0aAorICogQGhlaWdodDogaGVpZ2h0Cisg KgorICogVGhlIERpc3BsYXkgc3Vic3lzdGVtIGhhcyB0aGUgbGltaXRhdGlvbiB0aGF0IGJvdGgg bGF5ZXJzIHNob3VsZCBoYXZlCisgKiBpZGVudGljYWwgc2l6ZS4gVGhpcyBmdW5jdGlvbiBzdG9y ZXMgd2lkdGggYW5kIGhlaWdodCBvZiBAbGF5ZXIsIGFuZCB2ZXJpZmllcworICogaWYgdGhlIHNp emUgKHdpZHRoIGFuZCBoZWlnaHQpIGlzIHZhbGlkLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNj ZXNzLCBvciAtRUlOVkFMIGlmIHdpZHRoIG9yL2FuZCBoZWlnaHQgaXMgaW52YWxpZC4KKyAqLwor c3RhdGljIGludCB6eW5xbXBfZGlzcF9sYXllcl9jaGVja19zaXplKHN0cnVjdCB6eW5xbXBfZGlz cCAqZGlzcCwKKwkJCQkJc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyICpsYXllciwKKwkJCQkJdTMy IHdpZHRoLCB1MzIgaGVpZ2h0KQoreworCXN0cnVjdCB6eW5xbXBfZGlzcF9sYXllciAqb3RoZXIg PSBsYXllci0+b3RoZXI7CisKKwlpZiAob3RoZXItPmVuYWJsZWQgJiYgKG90aGVyLT53ICE9IHdp ZHRoIHx8IG90aGVyLT5oICE9IGhlaWdodCkpIHsKKwkJZGV2X2VycihkaXNwLT5kZXYsICJMYXll ciB3aWR0aDpoZWlnaHQgbXVzdCBiZSAlZDolZFxuIiwKKwkJCW90aGVyLT53LCBvdGhlci0+aCk7 CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxheWVyLT53ID0gd2lkdGg7CisJbGF5ZXItPmgg PSBoZWlnaHQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9tYXBfZm10 IC0gRmluZCB0aGUgRGlzcGxheSBzdWJzeXN0ZW0gZm9ybWF0IGZvciBnaXZlbiBkcm0gZm9ybWF0 CisgKiBAZm10czogZm9ybWF0IHRhYmxlIHRvIGxvb2sgdXAKKyAqIEBzaXplOiBzaXplIG9mIHRo ZSB0YWJsZSBAZm10cworICogQGRybV9mbXQ6IERSTSBmb3JtYXQgdG8gc2VhcmNoCisgKgorICog U2VhcmNoIGEgRGlzcGxheSBzdWJzeXN0ZW0gZm9ybWF0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdp dmVuIERSTSBmb3JtYXQKKyAqIEBkcm1fZm10LCBhbmQgcmV0dXJuIHRoZSBmb3JtYXQgZGVzY3Jp cHRvciB3aGljaCBjb250YWlucyB0aGUgRGlzcGxheQorICogc3Vic3lzdGVtIGZvcm1hdCB2YWx1 ZS4KKyAqCisgKiBSZXR1cm46IGEgRGlzcGxheSBzdWJzeXN0ZW0gZm9ybWF0IGRlc2NyaXB0b3Ig b24gc3VjY2Vzcywgb3IgTlVMTC4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB6eW5xbXBfZGlz cF9mbXQgKgorenlucW1wX2Rpc3BfbWFwX2ZtdChjb25zdCBzdHJ1Y3QgenlucW1wX2Rpc3BfZm10 IGZtdHNbXSwKKwkJICAgIHVuc2lnbmVkIGludCBzaXplLCB1aW50MzJfdCBkcm1fZm10KQorewor CXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJaWYgKGZt dHNbaV0uZHJtX2ZtdCA9PSBkcm1fZm10KQorCQkJcmV0dXJuICZmbXRzW2ldOworCisJcmV0dXJu IE5VTEw7Cit9CisKKy8qKgorICogenlucW1wX2Rpc3Bfc2V0X2ZtdCAtIFNldCB0aGUgZm9ybWF0 IG9mIHRoZSBsYXllcgorICogQGRpc3A6IERpc3BsYXkgc3Vic3lzdGVtCisgKiBAbGF5ZXI6IGxh eWVyIHRvIHNldCB0aGUgZm9ybWF0CisgKiBAZHJtX2ZtdDogRFJNIGZvcm1hdCB0byBzZXQKKyAq CisgKiBTZXQgdGhlIGZvcm1hdCBvZiB0aGUgZ2l2ZW4gbGF5ZXIgdG8gQGRybV9mbXQuCisgKgor ICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MuIC1FSU5WQUwgaWYgQGRybV9mbXQgaXMgbm90IHN1cHBv cnRlZCBieSB0aGUgbGF5ZXIuCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2Rpc3BfbGF5ZXJfc2V0 X2ZtdChzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3AsCisJCQkJICAgICBzdHJ1Y3QgenlucW1wX2Rp c3BfbGF5ZXIgKmxheWVyLAorCQkJCSAgICAgdWludDMyX3QgZHJtX2ZtdCkKK3sKKwljb25zdCBz dHJ1Y3QgenlucW1wX2Rpc3BfZm10ICpmbXQ7CisJY29uc3Qgc3RydWN0IHp5bnFtcF9kaXNwX2Zt dCAqdmlkX2ZtdCA9IE5VTEwsICpnZnhfZm10ID0gTlVMTDsKKwl1MzIgc2l6ZSwgZm10cywgbWFz azsKKworCWlmIChsYXllci0+aWQgPT0gWllOUU1QX0RJU1BfTEFZRVJfVklEKSB7CisJCXNpemUg PSBBUlJBWV9TSVpFKGF2X2J1Zl92aWRfZm10cyk7CisJCW1hc2sgPSB+WllOUU1QX0RJU1BfQVZf QlVGX0ZNVF9OTF9WSURfTUFTSzsKKwkJZm10ID0genlucW1wX2Rpc3BfbWFwX2ZtdChhdl9idWZf dmlkX2ZtdHMsIHNpemUsIGRybV9mbXQpOworCQl2aWRfZm10ID0gZm10OworCX0gZWxzZSB7CisJ CXNpemUgPSBBUlJBWV9TSVpFKGF2X2J1Zl9nZnhfZm10cyk7CisJCW1hc2sgPSB+WllOUU1QX0RJ U1BfQVZfQlVGX0ZNVF9OTF9HRlhfTUFTSzsKKwkJZm10ID0genlucW1wX2Rpc3BfbWFwX2ZtdChh dl9idWZfZ2Z4X2ZtdHMsIHNpemUsIGRybV9mbXQpOworCQlnZnhfZm10ID0gZm10OworCX0KKwor CWlmICghZm10KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZtdHMgPSB6eW5xbXBfZGlzcF9hdl9i dWZfZ2V0X2ZtdCgmZGlzcC0+YXZfYnVmKTsKKwlmbXRzICY9IG1hc2s7CisJZm10cyB8PSBmbXQt PmRpc3BfZm10OworCXp5bnFtcF9kaXNwX2F2X2J1Zl9zZXRfZm10KCZkaXNwLT5hdl9idWYsIGZt dHMpOworCXp5bnFtcF9kaXNwX2F2X2J1Zl9pbml0X3NmKCZkaXNwLT5hdl9idWYsIHZpZF9mbXQs IGdmeF9mbXQpOworCWxheWVyLT5mbXQgPSBmbXQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisg KiB6eW5xbXBfZGlzcF9zZXRfdHBnIC0gRW5hYmxlIG9yIGRpc2FibGUgVFBHCisgKiBAZGlzcDog RGlzcGxheSBzdWJzeXN0ZW0KKyAqIEBsYXllcjogVmlkZW8gbGF5ZXIKKyAqIEB0cGdfb246IGZs YWcgaWYgVFBHIG5lZWRzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQKKyAqCisgKiBFbmFibGUg LyBkaXNhYmxlIHRoZSBUUEcgbW9kZSBvbiB0aGUgdmlkZW8gbGF5ZXIgQGxheWVyIGRlcGVuZGlu ZyBvbgorICogQHRwZ19vbi4gVGhlIHZpZGVvIGxheWVyIHNob3VsZCBiZSBkaXNhYmxlZCBwcmlv ciB0byBlbmFibGUgcmVxdWVzdC4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcy4gLUVOT0RF ViBpZiBpdCdzIG5vdCB2aWRlbyBsYXllci4gLUVJTyBpZgorICogdGhlIHZpZGVvIGxheWVyIGlz IGVuYWJsZWQuCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2Rpc3BfbGF5ZXJfc2V0X3RwZyhzdHJ1 Y3QgenlucW1wX2Rpc3AgKmRpc3AsCisJCQkJICAgICBzdHJ1Y3QgenlucW1wX2Rpc3BfbGF5ZXIg KmxheWVyLAorCQkJCSAgICAgYm9vbCB0cGdfb24pCit7CisJaWYgKGxheWVyLT5pZCAhPSBaWU5R TVBfRElTUF9MQVlFUl9WSUQpIHsKKwkJZGV2X2VycihkaXNwLT5kZXYsCisJCQkib25seSB0aGUg dmlkZW8gbGF5ZXIgaGFzIHRoZSB0cGcgbW9kZVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0K KworCWlmIChsYXllci0+ZW5hYmxlZCkgeworCQlkZXZfZXJyKGRpc3AtPmRldiwKKwkJCSJ0aGUg dmlkZW8gbGF5ZXIgc2hvdWxkIGJlIGRpc2FibGVkIGZvciB0cGcgbW9kZVxuIik7CisJCXJldHVy biAtRUlPOworCX0KKworCXp5bnFtcF9kaXNwX2F2X2J1Zl9zZXRfdHBnKCZkaXNwLT5hdl9idWYs IHRwZ19vbik7CisJZGlzcC0+dHBnX29uID0gdHBnX29uOworCisJcmV0dXJuIDA7Cit9CisKKy8q KgorICogenlucW1wX2Rpc3BfZ2V0X2ZtdCAtIEdldCB0aGUgc3VwcG9ydGVkIERSTSBmb3JtYXRz IG9mIHRoZSBsYXllcgorICogQGRpc3A6IERpc3BsYXkgc3Vic3lzdGVtCisgKiBAbGF5ZXI6IGxh eWVyIHRvIGdldCB0aGUgZm9ybWF0cworICogQGRybV9mbXRzOiBwb2ludGVyIHRvIGFycmF5IG9m IERSTSBmb3JtYXQgc3RyaW5ncworICogQG51bV9mbXRzOiBwb2ludGVyIHRvIG51bWJlciBvZiBy ZXR1cm5lZCBEUk0gZm9ybWF0cworICoKKyAqIEdldCB0aGUgc3VwcG9ydGVkIERSTSBmb3JtYXRz IG9mIHRoZSBnaXZlbiBsYXllci4KKyAqLworc3RhdGljIHZvaWQgenlucW1wX2Rpc3BfbGF5ZXJf Z2V0X2ZtdHMoc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwLAorCQkJCSAgICAgICBzdHJ1Y3Qgenlu cW1wX2Rpc3BfbGF5ZXIgKmxheWVyLAorCQkJCSAgICAgICB1MzIgKipkcm1fZm10cywgdW5zaWdu ZWQgaW50ICpudW1fZm10cykKK3sKKwkqZHJtX2ZtdHMgPSBsYXllci0+ZHJtX2ZtdHM7CisJKm51 bV9mbXRzID0gbGF5ZXItPm51bV9mbXRzOworfQorCisvKioKKyAqIHp5bnFtcF9kaXNwX2xheWVy X2VuYWJsZSAtIEVuYWJsZSB0aGUgbGF5ZXIKKyAqIEBkaXNwOiBEaXNwbGF5IHN1YnN5c3RlbQor ICogQGxheWVyOiBsYXllciB0byBlc2FibGUKKyAqIEBtb2RlOiBvcGVyYXRpb24gbW9kZQorICoK KyAqIEVuYWJsZSB0aGUgbGF5ZXIgQGxheWVyLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNz LCBvdGhlcndpc2UgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCB6eW5xbXBfZGlzcF9sYXll cl9lbmFibGUoc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwLAorCQkJCSAgICBzdHJ1Y3QgenlucW1w X2Rpc3BfbGF5ZXIgKmxheWVyLAorCQkJCSAgICBlbnVtIHp5bnFtcF9kaXNwX2xheWVyX21vZGUg bW9kZSkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBkaXNwLT5kZXY7CisJc3RydWN0IGRtYV9h c3luY190eF9kZXNjcmlwdG9yICpkZXNjOworCWVudW0gZG1hX2N0cmxfZmxhZ3MgZmxhZ3M7CisJ dW5zaWduZWQgaW50IGk7CisKKwlpZiAobGF5ZXItPmVuYWJsZWQgJiYgbGF5ZXItPm1vZGUgIT0g bW9kZSkgeworCQlkZXZfZXJyKGRldiwgImxheWVyIGlzIGFscmVhZHkgZW5hYmxlZCBpbiBkaWZm ZXJlbnQgbW9kZVxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJenlucW1wX2Rpc3BfYXZf YnVmX2VuYWJsZV92aWQoJmRpc3AtPmF2X2J1ZiwgbGF5ZXIsIG1vZGUpOworCXp5bnFtcF9kaXNw X2JsZW5kX2xheWVyX2VuYWJsZSgmZGlzcC0+YmxlbmQsIGxheWVyKTsKKworCWxheWVyLT5lbmFi bGVkID0gdHJ1ZTsKKwlsYXllci0+bW9kZSA9IG1vZGU7CisKKwlpZiAobW9kZSA9PSBaWU5RTVBf RElTUF9MQVlFUl9MSVZFKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBaWU5RTVBf RElTUF9NQVhfTlVNX1NVQl9QTEFORVM7IGkrKykgeworCQlzdHJ1Y3QgenlucW1wX2Rpc3BfbGF5 ZXJfZG1hICpkbWEgPSAmbGF5ZXItPmRtYVtpXTsKKworCQlpZiAoZG1hLT5jaGFuICYmIGRtYS0+ aXNfYWN0aXZlKSB7CisJCQlmbGFncyA9IERNQV9DVFJMX0FDSyB8IERNQV9QUkVQX0lOVEVSUlVQ VDsKKwkJCWRlc2MgPSBkbWFlbmdpbmVfcHJlcF9pbnRlcmxlYXZlZF9kbWEoZG1hLT5jaGFuLAor CQkJCQkJCSAgICAgICZkbWEtPnh0LCBmbGFncyk7CisJCQlpZiAoIWRlc2MpIHsKKwkJCQlkZXZf ZXJyKGRldiwgImZhaWxlZCB0byBwcmVwIERNQSBkZXNjcmlwdG9yXG4iKTsKKwkJCQlyZXR1cm4g LUVOT01FTTsKKwkJCX0KKworCQkJZG1hZW5naW5lX3N1Ym1pdChkZXNjKTsKKwkJCWRtYV9hc3lu Y19pc3N1ZV9wZW5kaW5nKGRtYS0+Y2hhbik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwor LyoqCisgKiB6eW5xbXBfZGlzcF9sYXllcl9kaXNhYmxlIC0gRGlzYWJsZSB0aGUgbGF5ZXIKKyAq IEBkaXNwOiBEaXNwbGF5IHN1YnN5c3RlbQorICogQGxheWVyOiBsYXllciB0byBkaXNhYmxlCisg KiBAbW9kZTogb3BlcmF0aW9uIG1vZGUKKyAqCisgKiBEaXNhYmxlIHRoZSBsYXllciBAbGF5ZXIu CisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG9yIC1FQlVTWSBpZiB0aGUgbGF5ZXIgaXMg aW4gZGlmZmVyZW50IG1vZGUuCisgKi8KK3N0YXRpYyBpbnQgenlucW1wX2Rpc3BfbGF5ZXJfZGlz YWJsZShzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3AsCisJCQkJICAgICBzdHJ1Y3QgenlucW1wX2Rp c3BfbGF5ZXIgKmxheWVyLAorCQkJCSAgICAgZW51bSB6eW5xbXBfZGlzcF9sYXllcl9tb2RlIG1v ZGUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGlzcC0+ZGV2OworCXVuc2lnbmVkIGludCBp OworCisJaWYgKGxheWVyLT5tb2RlICE9IG1vZGUpIHsKKwkJZGV2X2VycihkZXYsICJ0aGUgbGF5 ZXIgaXMgb3BlcmF0aW5nIGluIGRpZmZlcmVudCBtb2RlXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsK Kwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgWllOUU1QX0RJU1BfTUFYX05VTV9TVUJfUExBTkVTOyBp KyspCisJCWlmIChsYXllci0+ZG1hW2ldLmNoYW4gJiYgbGF5ZXItPmRtYVtpXS5pc19hY3RpdmUp CisJCQlkbWFlbmdpbmVfdGVybWluYXRlX3N5bmMobGF5ZXItPmRtYVtpXS5jaGFuKTsKKworCXp5 bnFtcF9kaXNwX2F2X2J1Zl9kaXNhYmxlX3ZpZCgmZGlzcC0+YXZfYnVmLCBsYXllcik7CisJenlu cW1wX2Rpc3BfYmxlbmRfbGF5ZXJfZGlzYWJsZSgmZGlzcC0+YmxlbmQsIGxheWVyKTsKKwlsYXll ci0+ZW5hYmxlZCA9IGZhbHNlOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogenlucW1wX2Rp c3BfbGF5ZXJfcmVxdWVzdF9kbWEgLSBSZXF1ZXN0IERNQSBjaGFubmVscyBmb3IgYSBsYXllcgor ICogQGRpc3A6IERpc3BsYXkgc3Vic3lzdGVtCisgKiBAbGF5ZXI6IGxheWVyIHRvIHJlcXVlc3Qg RE1BIGNoYW5uZWxzCisgKiBAbmFtZTogaWRlbnRpZmllciBzdHJpbmcgZm9yIGxheWVyIHR5cGUK KyAqCisgKiBSZXF1ZXN0IERNQSBlbmdpbmUgY2hhbm5lbHMgZm9yIGNvcnJlc3BvbmRpbmcgbGF5 ZXIuCisgKgorICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MsIG9yIGVyciB2YWx1ZSBmcm9tIG9mX2Rt YV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWwoKS4KKyAqLworc3RhdGljIGludAorenlucW1wX2Rpc3Bf bGF5ZXJfcmVxdWVzdF9kbWEoc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwLAorCQkJICAgICAgc3Ry dWN0IHp5bnFtcF9kaXNwX2xheWVyICpsYXllciwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1 Y3QgenlucW1wX2Rpc3BfbGF5ZXJfZG1hICpkbWE7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJl dDsKKworCWZvciAoaSA9IDA7IGkgPCBsYXllci0+bnVtX2NoYW47IGkrKykgeworCQljaGFyIHRl bXBbMTZdOworCisJCWRtYSA9ICZsYXllci0+ZG1hW2ldOworCQlzbnByaW50Zih0ZW1wLCBzaXpl b2YodGVtcCksICIlcyVkIiwgbmFtZSwgaSk7CisJCWRtYS0+Y2hhbiA9IG9mX2RtYV9yZXF1ZXN0 X3NsYXZlX2NoYW5uZWwobGF5ZXItPm9mX25vZGUsCisJCQkJCQkJIHRlbXApOworCQlpZiAoSVNf RVJSKGRtYS0+Y2hhbikpIHsKKwkJCWRldl9lcnIoZGlzcC0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVl c3QgZG1hIGNoYW5uZWxcbiIpOworCQkJcmV0ID0gUFRSX0VSUihkbWEtPmNoYW4pOworCQkJZG1h LT5jaGFuID0gTlVMTDsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30K KworLyoqCisgKiB6eW5xbXBfZGlzcF9sYXllcl9yZWxlYXNlX2RtYSAtIFJlbGVhc2UgRE1BIGNo YW5uZWxzIGZvciBhIGxheWVyCisgKiBAZGlzcDogRGlzcGxheSBzdWJzeXN0ZW0KKyAqIEBsYXll cjogbGF5ZXIgdG8gcmVsZWFzZSBETUEgY2hhbm5lbHMKKyAqCisgKiBSZWxlYXNlIHRoZSBkbWEg Y2hhbm5lbHMgYXNzb2NpYXRlZCB3aXRoIEBsYXllci4KKyAqLworc3RhdGljIHZvaWQgenlucW1w X2Rpc3BfbGF5ZXJfcmVsZWFzZV9kbWEoc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwLAorCQkJCQkg IHN0cnVjdCB6eW5xbXBfZGlzcF9sYXllciAqbGF5ZXIpCit7CisJdW5zaWduZWQgaW50IGk7CisK Kwlmb3IgKGkgPSAwOyBpIDwgbGF5ZXItPm51bV9jaGFuOyBpKyspIHsKKwkJaWYgKGxheWVyLT5k bWFbaV0uY2hhbikgeworCQkJLyogTWFrZSBzdXJlIHRoZSBjaGFubmVsIGlzIHRlcm1pbmF0ZWQg YmVmb3JlIHJlbGVhc2UgKi8KKwkJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKGxheWVyLT5kbWFb aV0uY2hhbik7CisJCQlkbWFfcmVsZWFzZV9jaGFubmVsKGxheWVyLT5kbWFbaV0uY2hhbik7CisJ CX0KKwl9Cit9CisKKy8qKgorICogenlucW1wX2Rpc3BfbGF5ZXJfaXNfbGl2ZSAtIGlmIGFueSBs YXllciBpcyBsaXZlCisgKiBAZGlzcDogRGlzcGxheSBzdWJzeXN0ZW0KKyAqCisgKiBSZXR1cm46 IHRydWUgaWYgYW55IGxheWVyIGlzIGxpdmUKKyAqLworc3RhdGljIGJvb2wgenlucW1wX2Rpc3Bf bGF5ZXJfaXNfbGl2ZShzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3ApCit7CisJdW5zaWduZWQgaW50 IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgWllOUU1QX0RJU1BfTlVNX0xBWUVSUzsgaSsrKSB7CisJ CWlmIChkaXNwLT5sYXllcnNbaV0uZW5hYmxlZCAmJgorCQkgICAgZGlzcC0+bGF5ZXJzW2ldLm1v ZGUgPT0gWllOUU1QX0RJU1BfTEFZRVJfTElWRSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJl dHVybiBmYWxzZTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9sYXllcl9pc19lbmFibGVkIC0g aWYgYW55IGxheWVyIGlzIGVuYWJsZWQKKyAqIEBkaXNwOiBEaXNwbGF5IHN1YnN5c3RlbQorICoK KyAqIFJldHVybjogdHJ1ZSBpZiBhbnkgbGF5ZXIgaXMgZW5hYmxlZAorICovCitzdGF0aWMgYm9v bCB6eW5xbXBfZGlzcF9sYXllcl9pc19lbmFibGVkKHN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCkK K3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBaWU5RTVBfRElTUF9OVU1f TEFZRVJTOyBpKyspCisJCWlmIChkaXNwLT5sYXllcnNbaV0uZW5hYmxlZCkKKwkJCXJldHVybiB0 cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIHp5bnFtcF9kaXNwX2xheWVyX2Rl c3Ryb3kgLSBEZXN0cm95IGFsbCBsYXllcnMKKyAqIEBkaXNwOiBEaXNwbGF5IHN1YnN5c3RlbQor ICoKKyAqIERlc3Ryb3kgYWxsIGxheWVycy4KKyAqLworc3RhdGljIHZvaWQgenlucW1wX2Rpc3Bf bGF5ZXJfZGVzdHJveShzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3ApCit7CisJdW5zaWduZWQgaW50 IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgWllOUU1QX0RJU1BfTlVNX0xBWUVSUzsgaSsrKSB7CisJ CXp5bnFtcF9kaXNwX2xheWVyX3JlbGVhc2VfZG1hKGRpc3AsICZkaXNwLT5sYXllcnNbaV0pOwor CQlpZiAoZGlzcC0+bGF5ZXJzW2ldLm9mX25vZGUpCisJCQlvZl9ub2RlX3B1dChkaXNwLT5sYXll cnNbaV0ub2Zfbm9kZSk7CisJfQorfQorCisvKioKKyAqIHp5bnFtcF9kaXNwX2xheWVyX2NyZWF0 ZSAtIENyZWF0ZSBhbGwgbGF5ZXJzCisgKiBAZGlzcDogRGlzcGxheSBzdWJzeXN0ZW0KKyAqCisg KiBDcmVhdGUgYWxsIGxheWVycy4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2Vzcywgb3RoZXJ3 aXNlIGVycm9yIGNvZGUgZnJvbSBmYWlsZWQgZnVuY3Rpb24KKyAqLworc3RhdGljIGludCB6eW5x bXBfZGlzcF9sYXllcl9jcmVhdGUoc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwKQoreworCXN0cnVj dCB6eW5xbXBfZGlzcF9sYXllciAqbGF5ZXI7CisJdW5zaWduZWQgaW50IGk7CisJaW50IG51bV9j aGFuc1taWU5RTVBfRElTUF9OVU1fTEFZRVJTXSA9IHsgMywgMSB9OworCWNvbnN0IGNoYXIgKiBj b25zdCBkbWFfbmFtZVtdID0geyAidmlkIiwgImdmeCIgfTsKKwlpbnQgcmV0OworCisJZm9yIChp ID0gMDsgaSA8IFpZTlFNUF9ESVNQX05VTV9MQVlFUlM7IGkrKykgeworCQlsYXllciA9ICZkaXNw LT5sYXllcnNbaV07CisJCWxheWVyLT5pZCA9IGk7CisJCWxheWVyLT5vZmZzZXQgPSBpICogNDsK KwkJbGF5ZXItPm90aGVyID0gJmRpc3AtPmxheWVyc1shaV07CisJCWxheWVyLT5udW1fY2hhbiA9 IG51bV9jaGFuc1tpXTsKKwkJbGF5ZXItPm9mX25vZGUgPSBkaXNwLT5kZXYtPm9mX25vZGU7CisJ CXJldCA9IHp5bnFtcF9kaXNwX2xheWVyX3JlcXVlc3RfZG1hKGRpc3AsIGxheWVyLCBkbWFfbmFt ZVtpXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKwkJbGF5ZXItPmRpc3AgPSBkaXNwOwor CX0KKworCXJldHVybiAwOworCitlcnI6CisJenlucW1wX2Rpc3BfbGF5ZXJfZGVzdHJveShkaXNw KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogWnlucU1QIERpc3BsYXkgaW50ZXJuYWwgZnVu Y3Rpb25zCisgKi8KKworLyoKKyAqIE91dHB1dCBmb3JtYXQgZW51bWVyYXRpb24uCisgKiBUaGUg SUQgc2hvdWxkIGJlIGFsaWduZWQgd2l0aCBibGVuZF9vdXRwdXRfZm10cy4KKyAqIFRoZSBzdHJp bmcgc2hvdWxkIGJlIGFsaWduZWQgd2l0aCBob3cgenlucW1wX2RwX3NldF9jb2xvcigpIGRlY29k ZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHJtX3Byb3BfZW51bV9saXN0IHp5bnFtcF9kaXNwX2Nv bG9yX2VudW1bXSA9IHsKKwl7IDAsICJyZ2IiIH0sCisJeyAxLCAieWNyY2I0NDQiIH0sCisJeyAy LCAieWNyY2I0MjIiIH0sCisJeyAzLCAieW9ubHkiIH0sCit9OworCisvKioKKyAqIHp5bnFtcF9k aXNwX3NldF9vdXRwdXRfZm10IC0gU2V0IHRoZSBvdXRwdXQgZm9ybWF0CisgKiBAZGlzcDogRGlz cGxheSBzdWJzeXN0ZW0KKyAqIEBpZDogdGhlIGZvcm1hdCBJRC4gUmVmZXIgdG8genlucW1wX2Rp c3BfY29sb3JfZW51bVtdLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgb3V0cHV0IGZv cm1hdCBvZiB0aGUgZGlzcGxheSAvIGJsZW5kZXIgYXMgd2VsbCBhcworICogdGhlIGZvcm1hdCBv ZiBEUCBjb250cm9sbGVyLiBUaGUgQGlkIHNob3VsZCBiZSBhbGlnbmVkIHdpdGgKKyAqIHp5bnFt cF9kaXNwX2NvbG9yX2VudW0uCisgKi8KK3N0YXRpYyB2b2lkCit6eW5xbXBfZGlzcF9zZXRfb3V0 cHV0X2ZtdChzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3AsIHVuc2lnbmVkIGludCBpZCkKK3sKKwlj b25zdCBzdHJ1Y3QgenlucW1wX2Rpc3BfZm10ICpmbXQgPSAmYmxlbmRfb3V0cHV0X2ZtdHNbaWRd OworCisJenlucW1wX2RwX3NldF9jb2xvcihkaXNwLT5kcHN1Yi0+ZHAsIHp5bnFtcF9kaXNwX2Nv bG9yX2VudW1baWRdLm5hbWUpOworCXp5bnFtcF9kaXNwX2JsZW5kX3NldF9vdXRwdXRfZm10KCZk aXNwLT5ibGVuZCwgZm10LT5kaXNwX2ZtdCk7Cit9CisKKy8qKgorICogenlucW1wX2Rpc3Bfc2V0 X2JnX2NvbG9yIC0gU2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG9yCisgKiBAZGlzcDogRGlzcGxheSBz dWJzeXN0ZW0KKyAqIEBjMDogY29sb3IgY29tcG9uZW50IDAKKyAqIEBjMTogY29sb3IgY29tcG9u ZW50IDEKKyAqIEBjMjogY29sb3IgY29tcG9uZW50IDIKKyAqCisgKiBTZXQgdGhlIGJhY2tncm91 bmQgY29sb3Igd2l0aCBnaXZlbiBjb2xvciBjb21wb25lbnRzIChAYzAsIEBjMSwgQGMyKS4KKyAq Lworc3RhdGljIHZvaWQgenlucW1wX2Rpc3Bfc2V0X2JnX2NvbG9yKHN0cnVjdCB6eW5xbXBfZGlz cCAqZGlzcCwKKwkJCQkgICAgIHUzMiBjMCwgdTMyIGMxLCB1MzIgYzIpCit7CisJenlucW1wX2Rp c3BfYmxlbmRfc2V0X2JnX2NvbG9yKCZkaXNwLT5ibGVuZCwgYzAsIGMxLCBjMik7Cit9CisKKy8q KgorICogenlucW1wX2Rpc3Bfc2V0X2FscGhhIC0gU2V0IHRoZSBhbHBoYSB2YWx1ZQorICogQGRp c3A6IERpc3BsYXkgc3Vic3lzdGVtCisgKiBAYWxwaGE6IGFscGhhIHZhbHVlIHRvIHNldAorICoK KyAqIFNldCB0aGUgYWxwaGEgdmFsdWUgZm9yIGJsZW5kaW5nLgorICovCitzdGF0aWMgdm9pZCB6 eW5xbXBfZGlzcF9zZXRfYWxwaGEoc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwLCB1MzIgYWxwaGEp Cit7CisJZGlzcC0+YWxwaGEgPSBhbHBoYTsKKwl6eW5xbXBfZGlzcF9ibGVuZF9zZXRfYWxwaGEo JmRpc3AtPmJsZW5kLCBhbHBoYSk7Cit9CisKKy8qKgorICogenlucW1wX2Rpc3Bfc2V0X2dfYWxw aGEgLSBFbmFibGUvZGlzYWJsZSB0aGUgZ2xvYmFsIGFscGhhIGJsZW5kaW5nCisgKiBAZGlzcDog RGlzcGxheSBzdWJzeXN0ZW0KKyAqIEBlbmFibGU6IGZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUg YWxwaGEgYmxlbmRpbmcKKyAqCisgKiBTZXQgdGhlIGFscGhhIHZhbHVlIGZvciBibGVuZGluZy4K KyAqLworc3RhdGljIHZvaWQgenlucW1wX2Rpc3Bfc2V0X2dfYWxwaGEoc3RydWN0IHp5bnFtcF9k aXNwICpkaXNwLCBib29sIGVuYWJsZSkKK3sKKwlkaXNwLT5hbHBoYV9lbiA9IGVuYWJsZTsKKwl6 eW5xbXBfZGlzcF9ibGVuZF9lbmFibGVfYWxwaGEoJmRpc3AtPmJsZW5kLCBlbmFibGUpOworfQor CisvKioKKyAqIHp5bnFtcF9kaXNwX2VuYWJsZSAtIEVuYWJsZSB0aGUgRGlzcGxheSBzdWJzeXN0 ZW0KKyAqIEBkaXNwOiBEaXNwbGF5IHN1YnN5c3RlbQorICoKKyAqIEVuYWJsZSB0aGUgRGlzcGxh eSBzdWJzeXN0ZW0uCisgKi8KK3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNwX2VuYWJsZShzdHJ1Y3Qg enlucW1wX2Rpc3AgKmRpc3ApCit7CisJYm9vbCBsaXZlOworCisJaWYgKGRpc3AtPmVuYWJsZWQp CisJCXJldHVybjsKKworCXp5bnFtcF9kaXNwX2F2X2J1Zl9lbmFibGUoJmRpc3AtPmF2X2J1Zik7 CisJLyogQ2hvb3NlIGNsb2NrIHNvdXJjZSBiYXNlZCBvbiB0aGUgRFQgY2xvY2sgaGFuZGxlICov CisJenlucW1wX2Rpc3BfYXZfYnVmX3NldF92aWRfY2xvY2tfc3JjKCZkaXNwLT5hdl9idWYsICEh ZGlzcC0+X3BzX3BjbGspOworCXp5bnFtcF9kaXNwX2F2X2J1Zl9zZXRfYXVkX2Nsb2NrX3NyYygm ZGlzcC0+YXZfYnVmLCAhIWRpc3AtPl9wc19hdWRjbGspOworCWxpdmUgPSB6eW5xbXBfZGlzcF9s YXllcl9pc19saXZlKGRpc3ApOworCXp5bnFtcF9kaXNwX2F2X2J1Zl9zZXRfdmlkX3RpbWluZ19z cmMoJmRpc3AtPmF2X2J1ZiwgIWxpdmUpOworCXp5bnFtcF9kaXNwX2F2X2J1Zl9lbmFibGVfYnVm KCZkaXNwLT5hdl9idWYpOworCXp5bnFtcF9kaXNwX2F2X2J1Zl9lbmFibGVfYXVkKCZkaXNwLT5h dl9idWYpOworCXp5bnFtcF9kaXNwX2F1ZF9pbml0KCZkaXNwLT5hdWQpOworCWRpc3AtPmVuYWJs ZWQgPSB0cnVlOworfQorCisvKioKKyAqIHp5bnFtcF9kaXNwX2Rpc2FibGUgLSBEaXNhYmxlIHRo ZSBEaXNwbGF5IHN1YnN5c3RlbQorICogQGRpc3A6IERpc3BsYXkgc3Vic3lzdGVtCisgKiBAZm9y Y2U6IGZsYWcgdG8gZGlzYWJsZSBmb3JjZWZ1bGx5CisgKgorICogRGlzYWJsZSB0aGUgRGlzcGxh eSBzdWJzeXN0ZW0uCisgKi8KK3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNwX2Rpc2FibGUoc3RydWN0 IHp5bnFtcF9kaXNwICpkaXNwLCBib29sIGZvcmNlKQoreworCXN0cnVjdCBkcm1fY3J0YyAqY3J0 YyA9ICZkaXNwLT54bG54X2NydGMuY3J0YzsKKworCWlmICghZm9yY2UgJiYgKCFkaXNwLT5lbmFi bGVkIHx8IHp5bnFtcF9kaXNwX2xheWVyX2lzX2VuYWJsZWQoZGlzcCkpKQorCQlyZXR1cm47CisK Kwl6eW5xbXBfZGlzcF9hdWRfZGVpbml0KCZkaXNwLT5hdWQpOworCXp5bnFtcF9kaXNwX2F2X2J1 Zl9kaXNhYmxlX2F1ZCgmZGlzcC0+YXZfYnVmKTsKKwl6eW5xbXBfZGlzcF9hdl9idWZfZGlzYWJs ZV9idWYoJmRpc3AtPmF2X2J1Zik7CisJenlucW1wX2Rpc3BfYXZfYnVmX2Rpc2FibGUoJmRpc3At PmF2X2J1Zik7CisKKwkvKiBNYXJrIHRoZSBmbGlwIGlzIGRvbmUgYXMgY3J0YyBpcyBkaXNhYmxl ZCBhbnl3YXkgKi8KKwlpZiAoY3J0Yy0+c3RhdGUtPmV2ZW50KSB7CisJCWNvbXBsZXRlX2FsbChj cnRjLT5zdGF0ZS0+ZXZlbnQtPmJhc2UuY29tcGxldGlvbik7CisJCWNydGMtPnN0YXRlLT5ldmVu dCA9IE5VTEw7CisJfQorCisJZGlzcC0+ZW5hYmxlZCA9IGZhbHNlOworfQorCisvKgorICogWnlu cU1QIERpc3BsYXkgZXh0ZXJuYWwgZnVuY3Rpb25zIGZvciB6eW5xbXBfZHAKKyAqLworCisvKioK KyAqIHp5bnFtcF9kaXNwX2hhbmRsZV92YmxhbmsgLSBIYW5kbGUgdGhlIHZibGFuayBldmVudAor ICogQGRpc3A6IERpc3BsYXkgc3Vic3lzdGVtCisgKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVz IHRoZSB2YmxhbmsgaW50ZXJydXB0LCBhbmQgc2VuZHMgYW4gZXZlbnQgdG8KKyAqIENSVEMgb2Jq ZWN0LiBUaGlzIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBEUCB2YmxhbmsgaW50ZXJydXB0IGhhbmRs ZXIuCisgKi8KK3ZvaWQgenlucW1wX2Rpc3BfaGFuZGxlX3ZibGFuayhzdHJ1Y3QgenlucW1wX2Rp c3AgKmRpc3ApCit7CisJc3RydWN0IGRybV9jcnRjICpjcnRjID0gJmRpc3AtPnhsbnhfY3J0Yy5j cnRjOworCisJZHJtX2NydGNfaGFuZGxlX3ZibGFuayhjcnRjKTsKK30KKworLyoqCisgKiB6eW5x bXBfZGlzcF9nZXRfYXBiX2Nsa19yYXRlIC0gR2V0IHRoZSBjdXJyZW50IEFQQiBjbG9jayByYXRl CisgKiBAZGlzcDogRGlzcGxheSBzdWJzeXN0ZW0KKyAqCisgKiBSZXR1cm46IHRoZSBjdXJyZW50 IEFQQiBjbG9jayByYXRlLgorICovCit1bnNpZ25lZCBpbnQgenlucW1wX2Rpc3BfZ2V0X2FwYl9j bGtfcmF0ZShzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3ApCit7CisJcmV0dXJuIGNsa19nZXRfcmF0 ZShkaXNwLT5hY2xrKTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9hdWRfZW5hYmxlZCAtIElm IHRoZSBhdWRpbyBpcyBlbmFibGVkCisgKiBAZGlzcDogRGlzcGxheSBzdWJzeXN0ZW0KKyAqCisg KiBSZXR1cm4gaWYgdGhlIGF1ZGlvIGlzIGVuYWJsZWQgZGVwZW5kaW5nIG9uIHRoZSBhdWRpbyBj bG9jay4KKyAqCisgKiBSZXR1cm46IHRydWUgaWYgYXVkaW8gaXMgZW5hYmxlZCwgb3IgZmFsc2Uu CisgKi8KK2Jvb2wgenlucW1wX2Rpc3BfYXVkX2VuYWJsZWQoc3RydWN0IHp5bnFtcF9kaXNwICpk aXNwKQoreworCXJldHVybiAhIWRpc3AtPmF1ZGNsazsKK30KKworLyoqCisgKiB6eW5xbXBfZGlz cF9nZXRfYXVkX2Nsa19yYXRlIC0gR2V0IHRoZSBjdXJyZW50IGF1ZGlvIGNsb2NrIHJhdGUKKyAq IEBkaXNwOiBEaXNwbGF5IHN1YnN5c3RlbQorICoKKyAqIFJldHVybjogdGhlIGN1cnJlbnQgYXVk aW8gY2xvY2sgcmF0ZS4KKyAqLwordW5zaWduZWQgaW50IHp5bnFtcF9kaXNwX2dldF9hdWRfY2xr X3JhdGUoc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwKQoreworCWlmICh6eW5xbXBfZGlzcF9hdWRf ZW5hYmxlZChkaXNwKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGNsa19nZXRfcmF0ZShkaXNwLT5h Y2xrKTsKK30KKworLyoqCisgKiB6eW5xbXBfZGlzcF9nZXRfY3J0Y19tYXNrIC0gUmV0dXJuIHRo ZSBDUlRDIGJpdCBtYXNrCisgKiBAZGlzcDogRGlzcGxheSBzdWJzeXN0ZW0KKyAqCisgKiBSZXR1 cm46IHRoZSBjcnRjIG1hc2sgb2YgdGhlIHp5cW5tcF9kaXNwIENSVEMuCisgKi8KK3VpbnQzMl90 IHp5bnFtcF9kaXNwX2dldF9jcnRjX21hc2soc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwKQorewor CXJldHVybiBkcm1fY3J0Y19tYXNrKCZkaXNwLT54bG54X2NydGMuY3J0Yyk7Cit9CisKKy8qCisg KiBEUk0gcGxhbmUgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgenlucW1w X2Rpc3BfbGF5ZXIgKnBsYW5lX3RvX2xheWVyKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKQorewor CXJldHVybiBjb250YWluZXJfb2YocGxhbmUsIHN0cnVjdCB6eW5xbXBfZGlzcF9sYXllciwgcGxh bmUpOworfQorCitzdGF0aWMgaW50IHp5bnFtcF9kaXNwX3BsYW5lX2VuYWJsZShzdHJ1Y3QgZHJt X3BsYW5lICpwbGFuZSkKK3sKKwlzdHJ1Y3QgenlucW1wX2Rpc3BfbGF5ZXIgKmxheWVyID0gcGxh bmVfdG9fbGF5ZXIocGxhbmUpOworCXN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCA9IGxheWVyLT5k aXNwOworCWludCByZXQ7CisKKwl6eW5xbXBfZGlzcF9zZXRfZ19hbHBoYShkaXNwLCBkaXNwLT5h bHBoYV9lbik7CisJenlucW1wX2Rpc3Bfc2V0X2FscGhhKGRpc3AsIGRpc3AtPmFscGhhKTsKKwly ZXQgPSB6eW5xbXBfZGlzcF9sYXllcl9lbmFibGUobGF5ZXItPmRpc3AsIGxheWVyLAorCQkJCSAg ICAgICBaWU5RTVBfRElTUF9MQVlFUl9OT05MSVZFKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0 OworCisJaWYgKGxheWVyLT5pZCA9PSBaWU5RTVBfRElTUF9MQVlFUl9HRlggJiYgZGlzcC0+dHBn X29uKSB7CisJCWxheWVyID0gJmRpc3AtPmxheWVyc1taWU5RTVBfRElTUF9MQVlFUl9WSURdOwor CQl6eW5xbXBfZGlzcF9sYXllcl9zZXRfdHBnKGRpc3AsIGxheWVyLCBkaXNwLT50cGdfb24pOwor CX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHp5bnFtcF9kaXNwX3BsYW5lX2Rpc2Fi bGUoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCit7CisJc3RydWN0IHp5bnFtcF9kaXNwX2xheWVy ICpsYXllciA9IHBsYW5lX3RvX2xheWVyKHBsYW5lKTsKKwlzdHJ1Y3QgenlucW1wX2Rpc3AgKmRp c3AgPSBsYXllci0+ZGlzcDsKKworCXp5bnFtcF9kaXNwX2xheWVyX2Rpc2FibGUoZGlzcCwgbGF5 ZXIsIFpZTlFNUF9ESVNQX0xBWUVSX05PTkxJVkUpOworCWlmIChsYXllci0+aWQgPT0gWllOUU1Q X0RJU1BfTEFZRVJfVklEICYmIGRpc3AtPnRwZ19vbikKKwkJenlucW1wX2Rpc3BfbGF5ZXJfc2V0 X3RwZyhkaXNwLCBsYXllciwgZGlzcC0+dHBnX29uKTsKKworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IHp5bnFtcF9kaXNwX3BsYW5lX21vZGVfc2V0KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5l LAorCQkJCSAgICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAorCQkJCSAgICAgIGludCBj cnRjX3gsIGludCBjcnRjX3ksCisJCQkJICAgICAgdW5zaWduZWQgaW50IGNydGNfdywgdW5zaWdu ZWQgaW50IGNydGNfaCwKKwkJCQkgICAgICB1MzIgc3JjX3gsIHUzMiBzcmNfeSwKKwkJCQkgICAg ICB1MzIgc3JjX3csIHUzMiBzcmNfaCkKK3sKKwlzdHJ1Y3QgenlucW1wX2Rpc3BfbGF5ZXIgKmxh eWVyID0gcGxhbmVfdG9fbGF5ZXIocGxhbmUpOworCWNvbnN0IHN0cnVjdCBkcm1fZm9ybWF0X2lu Zm8gKmluZm8gPSBmYi0+Zm9ybWF0OworCXN0cnVjdCBkcm1fZm9ybWF0X25hbWVfYnVmIGZvcm1h dF9uYW1lOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGxheWVyLT5kaXNwLT5kZXY7CisJZG1hX2Fk ZHJfdCBwYWRkcjsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJaWYgKCFpbmZvKSB7 CisJCWRldl9lcnIoZGV2LCAidW5zdXBwb3J0ZWQgZnJhbWVidWZmZXIgZm9ybWF0ICVzXG4iLAor CQkJZHJtX2dldF9mb3JtYXRfbmFtZShpbmZvLT5mb3JtYXQsICZmb3JtYXRfbmFtZSkpOworCQly ZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSB6eW5xbXBfZGlzcF9sYXllcl9jaGVja19zaXpl KGxheWVyLT5kaXNwLCBsYXllciwgc3JjX3csIHNyY19oKTsKKwlpZiAocmV0KQorCQlyZXR1cm4g cmV0OworCisJZm9yIChpID0gMDsgaSA8IGluZm8tPm51bV9wbGFuZXM7IGkrKykgeworCQl1bnNp Z25lZCBpbnQgd2lkdGggPSBzcmNfdyAvIChpID8gaW5mby0+aHN1YiA6IDEpOworCQl1bnNpZ25l ZCBpbnQgaGVpZ2h0ID0gc3JjX2ggLyAoaSA/IGluZm8tPnZzdWIgOiAxKTsKKworCQlwYWRkciA9 IGRybV9mYl9jbWFfZ2V0X2dlbV9hZGRyKGZiLCBwbGFuZS0+c3RhdGUsIGkpOworCQlpZiAoIXBh ZGRyKSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgYSBwYWRkclxuIik7CisJCQly ZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWxheWVyLT5kbWFbaV0ueHQubnVtZiA9IGhlaWdodDsK KwkJbGF5ZXItPmRtYVtpXS5zZ2xbMF0uc2l6ZSA9IHdpZHRoICogaW5mby0+Y3BwW2ldOworCQls YXllci0+ZG1hW2ldLnNnbFswXS5pY2cgPSBmYi0+cGl0Y2hlc1tpXSAtCisJCQkJCSAgIGxheWVy LT5kbWFbaV0uc2dsWzBdLnNpemU7CisJCWxheWVyLT5kbWFbaV0ueHQuc3JjX3N0YXJ0ID0gcGFk ZHI7CisJCWxheWVyLT5kbWFbaV0ueHQuZnJhbWVfc2l6ZSA9IDE7CisJCWxheWVyLT5kbWFbaV0u eHQuZGlyID0gRE1BX01FTV9UT19ERVY7CisJCWxheWVyLT5kbWFbaV0ueHQuc3JjX3NnbCA9IHRy dWU7CisJCWxheWVyLT5kbWFbaV0ueHQuZHN0X3NnbCA9IGZhbHNlOworCQlsYXllci0+ZG1hW2ld LmlzX2FjdGl2ZSA9IHRydWU7CisJfQorCisJZm9yICg7IGkgPCBaWU5RTVBfRElTUF9NQVhfTlVN X1NVQl9QTEFORVM7IGkrKykKKwkJbGF5ZXItPmRtYVtpXS5pc19hY3RpdmUgPSBmYWxzZTsKKwor CXJldCA9IHp5bnFtcF9kaXNwX2xheWVyX3NldF9mbXQobGF5ZXItPmRpc3AsICBsYXllciwgaW5m by0+Zm9ybWF0KTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzZXQgZHBf c3ViIGxheWVyIGZtdFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB6eW5x bXBfZGlzcF9wbGFuZV9kZXN0cm95KHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lKQoreworCWRybV9w bGFuZV9jbGVhbnVwKHBsYW5lKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcGxhbmVf ZnVuY3MgenlucW1wX2Rpc3BfcGxhbmVfZnVuY3MgPSB7CisJLnVwZGF0ZV9wbGFuZQkJPSBkcm1f YXRvbWljX2hlbHBlcl91cGRhdGVfcGxhbmUsCisJLmRpc2FibGVfcGxhbmUJCT0gZHJtX2F0b21p Y19oZWxwZXJfZGlzYWJsZV9wbGFuZSwKKwkuZGVzdHJveQkJPSB6eW5xbXBfZGlzcF9wbGFuZV9k ZXN0cm95LAorCS5yZXNldAkJCT0gZHJtX2F0b21pY19oZWxwZXJfcGxhbmVfcmVzZXQsCisJLmF0 b21pY19kdXBsaWNhdGVfc3RhdGUJPSBkcm1fYXRvbWljX2hlbHBlcl9wbGFuZV9kdXBsaWNhdGVf c3RhdGUsCisJLmF0b21pY19kZXN0cm95X3N0YXRlCT0gZHJtX2F0b21pY19oZWxwZXJfcGxhbmVf ZGVzdHJveV9zdGF0ZSwKK307CisKK3N0YXRpYyB2b2lkCit6eW5xbXBfZGlzcF9wbGFuZV9hdG9t aWNfdXBkYXRlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAorCQkJCXN0cnVjdCBkcm1fcGxhbmVf c3RhdGUgKm9sZF9zdGF0ZSkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFwbGFuZS0+c3RhdGUtPmNy dGMgfHwgIXBsYW5lLT5zdGF0ZS0+ZmIpCisJCXJldHVybjsKKworCXJldCA9IHp5bnFtcF9kaXNw X3BsYW5lX21vZGVfc2V0KHBsYW5lLCBwbGFuZS0+c3RhdGUtPmZiLAorCQkJCQkgcGxhbmUtPnN0 YXRlLT5jcnRjX3gsCisJCQkJCSBwbGFuZS0+c3RhdGUtPmNydGNfeSwKKwkJCQkJIHBsYW5lLT5z dGF0ZS0+Y3J0Y193LAorCQkJCQkgcGxhbmUtPnN0YXRlLT5jcnRjX2gsCisJCQkJCSBwbGFuZS0+ c3RhdGUtPnNyY194ID4+IDE2LAorCQkJCQkgcGxhbmUtPnN0YXRlLT5zcmNfeSA+PiAxNiwKKwkJ CQkJIHBsYW5lLT5zdGF0ZS0+c3JjX3cgPj4gMTYsCisJCQkJCSBwbGFuZS0+c3RhdGUtPnNyY19o ID4+IDE2KTsKKwlpZiAocmV0KQorCQlyZXR1cm47CisKKwl6eW5xbXBfZGlzcF9wbGFuZV9lbmFi bGUocGxhbmUpOworfQorCitzdGF0aWMgdm9pZAorenlucW1wX2Rpc3BfcGxhbmVfYXRvbWljX2Rp c2FibGUoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCisJCQkJIHN0cnVjdCBkcm1fcGxhbmVfc3Rh dGUgKm9sZF9zdGF0ZSkKK3sKKwl6eW5xbXBfZGlzcF9wbGFuZV9kaXNhYmxlKHBsYW5lKTsKK30K Kworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcGxhbmVfaGVscGVyX2Z1bmNzIHp5bnFtcF9kaXNw X3BsYW5lX2hlbHBlcl9mdW5jcyA9IHsKKwkuYXRvbWljX3VwZGF0ZQk9IHp5bnFtcF9kaXNwX3Bs YW5lX2F0b21pY191cGRhdGUsCisJLmF0b21pY19kaXNhYmxlCT0genlucW1wX2Rpc3BfcGxhbmVf YXRvbWljX2Rpc2FibGUsCit9OworCitzdGF0aWMgaW50IHp5bnFtcF9kaXNwX2NyZWF0ZV9wbGFu ZShzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3ApCit7CisJc3RydWN0IHp5bnFtcF9kaXNwX2xheWVy ICpsYXllcjsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgKmZtdHMgPSBOVUxMOworCXVuc2lnbmVk IGludCBudW1fZm10cyA9IDA7CisJZW51bSBkcm1fcGxhbmVfdHlwZSB0eXBlOworCWludCByZXQ7 CisKKwkvKiBncmFwaGljcyBsYXllciBpcyBwcmltYXJ5LCBhbmQgdmlkZW8gbGF5ZXIgaXMgb3Zl cmFseSAqLworCXR5cGUgPSBEUk1fUExBTkVfVFlQRV9PVkVSTEFZOworCWZvciAoaSA9IDA7IGkg PCBaWU5RTVBfRElTUF9OVU1fTEFZRVJTOyBpKyspIHsKKwkJbGF5ZXIgPSAmZGlzcC0+bGF5ZXJz W2ldOworCQl6eW5xbXBfZGlzcF9sYXllcl9nZXRfZm10cyhkaXNwLCBsYXllciwgJmZtdHMsICZu dW1fZm10cyk7CisJCXJldCA9IGRybV91bml2ZXJzYWxfcGxhbmVfaW5pdChkaXNwLT5kcm0sICZs YXllci0+cGxhbmUsIDAsCisJCQkJCSAgICAgICAmenlucW1wX2Rpc3BfcGxhbmVfZnVuY3MsIGZt dHMsCisJCQkJCSAgICAgICBudW1fZm10cywgTlVMTCwgdHlwZSwgTlVMTCk7CisJCWlmIChyZXQp CisJCQlnb3RvIGVycl9wbGFuZTsKKwkJZHJtX3BsYW5lX2hlbHBlcl9hZGQoJmxheWVyLT5wbGFu ZSwKKwkJCQkgICAgICZ6eW5xbXBfZGlzcF9wbGFuZV9oZWxwZXJfZnVuY3MpOworCQl0eXBlID0g RFJNX1BMQU5FX1RZUEVfUFJJTUFSWTsKKwl9CisKKwlyZXR1cm4gcmV0OworCitlcnJfcGxhbmU6 CisJaWYgKGkpCisJCWRybV9wbGFuZV9jbGVhbnVwKCZkaXNwLT5sYXllcnNbMF0ucGxhbmUpOwor CXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHp5bnFtcF9kaXNwX2Rlc3Ryb3lfcGxhbmUo c3RydWN0IHp5bnFtcF9kaXNwICpkaXNwKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChp ID0gMDsgaSA8IFpZTlFNUF9ESVNQX05VTV9MQVlFUlM7IGkrKykKKwkJenlucW1wX2Rpc3BfcGxh bmVfZGVzdHJveSgmZGlzcC0+bGF5ZXJzW2ldLnBsYW5lKTsKK30KKworLyoKKyAqIFhsbnggY3J0 YyBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB6eW5xbXBfZGlzcCAqeGxu eF9jcnRjX3RvX2Rpc3Aoc3RydWN0IHhsbnhfY3J0YyAqeGxueF9jcnRjKQoreworCXJldHVybiBj b250YWluZXJfb2YoeGxueF9jcnRjLCBzdHJ1Y3QgenlucW1wX2Rpc3AsIHhsbnhfY3J0Yyk7Cit9 CisKK3N0YXRpYyBpbnQgenlucW1wX2Rpc3BfZ2V0X21heF93aWR0aChzdHJ1Y3QgeGxueF9jcnRj ICp4bG54X2NydGMpCit7CisJcmV0dXJuIFpZTlFNUF9ESVNQX01BWF9XSURUSDsKK30KKworc3Rh dGljIGludCB6eW5xbXBfZGlzcF9nZXRfbWF4X2hlaWdodChzdHJ1Y3QgeGxueF9jcnRjICp4bG54 X2NydGMpCit7CisJcmV0dXJuIFpZTlFNUF9ESVNQX01BWF9IRUlHSFQ7Cit9CisKK3N0YXRpYyB1 aW50MzJfdCB6eW5xbXBfZGlzcF9nZXRfZm9ybWF0KHN0cnVjdCB4bG54X2NydGMgKnhsbnhfY3J0 YykKK3sKKwlzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3AgPSB4bG54X2NydGNfdG9fZGlzcCh4bG54 X2NydGMpOworCisJcmV0dXJuIGRpc3AtPmxheWVyc1taWU5RTVBfRElTUF9MQVlFUl9HRlhdLmZt dC0+ZHJtX2ZtdDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB6eW5xbXBfZGlzcF9nZXRfYWxp Z24oc3RydWN0IHhsbnhfY3J0YyAqeGxueF9jcnRjKQoreworCXN0cnVjdCB6eW5xbXBfZGlzcCAq ZGlzcCA9IHhsbnhfY3J0Y190b19kaXNwKHhsbnhfY3J0Yyk7CisJc3RydWN0IHp5bnFtcF9kaXNw X2xheWVyICpsYXllciA9ICZkaXNwLT5sYXllcnNbWllOUU1QX0RJU1BfTEFZRVJfVklEXTsKKwor CXJldHVybiAxIDw8IGxheWVyLT5kbWEtPmNoYW4tPmRldmljZS0+Y29weV9hbGlnbjsKK30KKwor c3RhdGljIHU2NCB6eW5xbXBfZGlzcF9nZXRfZG1hX21hc2soc3RydWN0IHhsbnhfY3J0YyAqeGxu eF9jcnRjKQoreworCXJldHVybiBETUFfQklUX01BU0soWllOUU1QX0RJU1BfTUFYX0RNQV9CSVQp OworfQorCisvKgorICogRFJNIGNydGMgZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGlubGluZSBz dHJ1Y3QgenlucW1wX2Rpc3AgKmNydGNfdG9fZGlzcChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7 CisJc3RydWN0IHhsbnhfY3J0YyAqeGxueF9jcnRjID0gdG9feGxueF9jcnRjKGNydGMpOworCisJ cmV0dXJuIHhsbnhfY3J0Y190b19kaXNwKHhsbnhfY3J0Yyk7Cit9CisKK3N0YXRpYyBpbnQgenlu cW1wX2Rpc3BfY3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJICAgICBz dHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQkgICAgIHN0cnVjdCBkcm1fZGlzcGxh eV9tb2RlICphZGp1c3RlZF9tb2RlLAorCQkJCSAgICAgaW50IHgsIGludCB5LAorCQkJCSAgICAg c3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqb2xkX2ZiKQoreworCXN0cnVjdCB6eW5xbXBfZGlzcCAq ZGlzcCA9IGNydGNfdG9fZGlzcChjcnRjKTsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisJbG9uZyBk aWZmOworCWludCByZXQ7CisKKwl6eW5xbXBfZGlzcF9jbGtfZGlzYWJsZShkaXNwLT5wY2xrLCAm ZGlzcC0+cGNsa19lbik7CisJcmV0ID0gY2xrX3NldF9yYXRlKGRpc3AtPnBjbGssIGFkanVzdGVk X21vZGUtPmNsb2NrICogMTAwMCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRpc3AtPmRldiwg ImZhaWxlZCB0byBzZXQgYSBwaXhlbCBjbG9ja1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJ cmF0ZSA9IGNsa19nZXRfcmF0ZShkaXNwLT5wY2xrKTsKKwlkaWZmID0gcmF0ZSAtIGFkanVzdGVk X21vZGUtPmNsb2NrICogMTAwMDsKKwlpZiAoYWJzKGRpZmYpID4gKGFkanVzdGVkX21vZGUtPmNs b2NrICogMTAwMCkgLyAyMCkgeworCQlkZXZfaW5mbyhkaXNwLT5kZXYsICJyZXF1ZXN0IHBpeGVs IHJhdGU6ICVkIGFjdHVhbCByYXRlOiAlbHVcbiIsCisJCQkgYWRqdXN0ZWRfbW9kZS0+Y2xvY2ss IHJhdGUpOworCX0gZWxzZSB7CisJCWRldl9kYmcoZGlzcC0+ZGV2LCAicmVxdWVzdCBwaXhlbCBy YXRlOiAlZCBhY3R1YWwgcmF0ZTogJWx1XG4iLAorCQkJYWRqdXN0ZWRfbW9kZS0+Y2xvY2ssIHJh dGUpOworCX0KKworCS8qIFRoZSB0aW1pbmcgcmVnaXN0ZXIgc2hvdWxkIGJlIHByb2dyYW1tZWQg YWx3YXlzICovCisJenlucW1wX2RwX2VuY29kZXJfbW9kZV9zZXRfc3RyZWFtKGRpc3AtPmRwc3Vi LT5kcCwgYWRqdXN0ZWRfbW9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3p5 bnFtcF9kaXNwX2NydGNfYXRvbWljX2VuYWJsZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkg ICAgICAgc3RydWN0IGRybV9jcnRjX3N0YXRlICpvbGRfY3J0Y19zdGF0ZSkKK3sKKwlzdHJ1Y3Qg enlucW1wX2Rpc3AgKmRpc3AgPSBjcnRjX3RvX2Rpc3AoY3J0Yyk7CisJc3RydWN0IGRybV9kaXNw bGF5X21vZGUgKmFkanVzdGVkX21vZGUgPSAmY3J0Yy0+c3RhdGUtPmFkanVzdGVkX21vZGU7CisJ aW50IHJldCwgdnJlZnJlc2g7CisKKwl6eW5xbXBfZGlzcF9jcnRjX21vZGVfc2V0KGNydGMsICZj cnRjLT5zdGF0ZS0+bW9kZSwKKwkJCQkgIGFkanVzdGVkX21vZGUsIGNydGMtPngsIGNydGMtPnks IE5VTEwpOworCisJcG1fcnVudGltZV9nZXRfc3luYyhkaXNwLT5kZXYpOworCXJldCA9IHp5bnFt cF9kaXNwX2Nsa19lbmFibGUoZGlzcC0+cGNsaywgJmRpc3AtPnBjbGtfZW4pOworCWlmIChyZXQp IHsKKwkJZGV2X2VycihkaXNwLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGEgcGl4ZWwgY2xvY2tc biIpOworCQlyZXR1cm47CisJfQorCXp5bnFtcF9kaXNwX3NldF9vdXRwdXRfZm10KGRpc3AsIGRp c3AtPmNvbG9yKTsKKwl6eW5xbXBfZGlzcF9zZXRfYmdfY29sb3IoZGlzcCwgZGlzcC0+YmdfYzAs IGRpc3AtPmJnX2MxLCBkaXNwLT5iZ19jMik7CisJenlucW1wX2Rpc3BfZW5hYmxlKGRpc3ApOwor CS8qIERlbGF5IG9mIDMgdmJsYW5rIGludGVydmFscyBmb3IgdGltaW5nIGdlbiB0byBiZSBzdGFi bGUgKi8KKwl2cmVmcmVzaCA9IChhZGp1c3RlZF9tb2RlLT5jbG9jayAqIDEwMDApIC8KKwkJICAg KGFkanVzdGVkX21vZGUtPnZ0b3RhbCAqIGFkanVzdGVkX21vZGUtPmh0b3RhbCk7CisJbXNsZWVw KDMgKiAxMDAwIC8gdnJlZnJlc2gpOworfQorCitzdGF0aWMgdm9pZAorenlucW1wX2Rpc3BfY3J0 Y19hdG9taWNfZGlzYWJsZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJc3RydWN0IGRybV9j cnRjX3N0YXRlICpvbGRfY3J0Y19zdGF0ZSkKK3sKKwlzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3Ag PSBjcnRjX3RvX2Rpc3AoY3J0Yyk7CisKKwl6eW5xbXBfZGlzcF9jbGtfZGlzYWJsZShkaXNwLT5w Y2xrLCAmZGlzcC0+cGNsa19lbik7CisJenlucW1wX2Rpc3BfcGxhbmVfZGlzYWJsZShjcnRjLT5w cmltYXJ5KTsKKwl6eW5xbXBfZGlzcF9kaXNhYmxlKGRpc3AsIHRydWUpOworCXBtX3J1bnRpbWVf cHV0X3N5bmMoZGlzcC0+ZGV2KTsKK30KKworc3RhdGljIGludCB6eW5xbXBfZGlzcF9jcnRjX2F0 b21pY19jaGVjayhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkJCSBzdHJ1Y3QgZHJtX2NydGNf c3RhdGUgKnN0YXRlKQoreworCXJldHVybiBkcm1fYXRvbWljX2FkZF9hZmZlY3RlZF9wbGFuZXMo c3RhdGUtPnN0YXRlLCBjcnRjKTsKK30KKworc3RhdGljIHZvaWQKK3p5bnFtcF9kaXNwX2NydGNf YXRvbWljX2JlZ2luKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCSAgICAgIHN0cnVjdCBkcm1f Y3J0Y19zdGF0ZSAqb2xkX2NydGNfc3RhdGUpCit7CisJLyogRG9uJ3QgcmVseSBvbiB2Ymxhbmsg d2hlbiBkaXNhYmxpbmcgY3J0YyAqLworCXNwaW5fbG9ja19pcnEoJmNydGMtPmRldi0+ZXZlbnRf bG9jayk7CisJaWYgKGNydGMtPnByaW1hcnktPnN0YXRlLT5mYiAmJiBjcnRjLT5zdGF0ZS0+ZXZl bnQpIHsKKwkJLyogQ29uc3VtZSB0aGUgZmxpcF9kb25lIGV2ZW50IGZyb20gYXRvbWljIGhlbHBl ciAqLworCQljcnRjLT5zdGF0ZS0+ZXZlbnQtPnBpcGUgPSBkcm1fY3J0Y19pbmRleChjcnRjKTsK KwkJV0FSTl9PTihkcm1fY3J0Y192YmxhbmtfZ2V0KGNydGMpICE9IDApOworCQlkcm1fY3J0Y19h cm1fdmJsYW5rX2V2ZW50KGNydGMsIGNydGMtPnN0YXRlLT5ldmVudCk7CisJCWNydGMtPnN0YXRl LT5ldmVudCA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY3J0Yy0+ZGV2LT5ldmVudF9s b2NrKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY3J0Y19oZWxwZXJfZnVuY3Mgenlu cW1wX2Rpc3BfY3J0Y19oZWxwZXJfZnVuY3MgPSB7CisJLmF0b21pY19lbmFibGUJPSB6eW5xbXBf ZGlzcF9jcnRjX2F0b21pY19lbmFibGUsCisJLmF0b21pY19kaXNhYmxlCT0genlucW1wX2Rpc3Bf Y3J0Y19hdG9taWNfZGlzYWJsZSwKKwkuYXRvbWljX2NoZWNrCT0genlucW1wX2Rpc3BfY3J0Y19h dG9taWNfY2hlY2ssCisJLmF0b21pY19iZWdpbgk9IHp5bnFtcF9kaXNwX2NydGNfYXRvbWljX2Jl Z2luLAorfTsKKworc3RhdGljIHZvaWQgenlucW1wX2Rpc3BfY3J0Y19kZXN0cm95KHN0cnVjdCBk cm1fY3J0YyAqY3J0YykKK3sKKwl6eW5xbXBfZGlzcF9jcnRjX2F0b21pY19kaXNhYmxlKGNydGMs IE5VTEwpOworCWRybV9jcnRjX2NsZWFudXAoY3J0Yyk7Cit9CisKK3N0YXRpYyBpbnQgenlucW1w X2Rpc3BfY3J0Y19lbmFibGVfdmJsYW5rKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1 Y3QgenlucW1wX2Rpc3AgKmRpc3AgPSBjcnRjX3RvX2Rpc3AoY3J0Yyk7CisKKwl6eW5xbXBfZHBf ZW5hYmxlX3ZibGFuayhkaXNwLT5kcHN1Yi0+ZHApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyB2b2lkIHp5bnFtcF9kaXNwX2NydGNfZGlzYWJsZV92Ymxhbmsoc3RydWN0IGRybV9jcnRjICpj cnRjKQoreworCXN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCA9IGNydGNfdG9fZGlzcChjcnRjKTsK KworCXp5bnFtcF9kcF9kaXNhYmxlX3ZibGFuayhkaXNwLT5kcHN1Yi0+ZHApOworfQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IGRybV9jcnRjX2Z1bmNzIHp5bnFtcF9kaXNwX2NydGNfZnVuY3MgPSB7 CisJLmRlc3Ryb3kJCT0genlucW1wX2Rpc3BfY3J0Y19kZXN0cm95LAorCS5zZXRfY29uZmlnCQk9 IGRybV9hdG9taWNfaGVscGVyX3NldF9jb25maWcsCisJLnBhZ2VfZmxpcAkJPSBkcm1fYXRvbWlj X2hlbHBlcl9wYWdlX2ZsaXAsCisJLnJlc2V0CQkJPSBkcm1fYXRvbWljX2hlbHBlcl9jcnRjX3Jl c2V0LAorCS5hdG9taWNfZHVwbGljYXRlX3N0YXRlCT0gZHJtX2F0b21pY19oZWxwZXJfY3J0Y19k dXBsaWNhdGVfc3RhdGUsCisJLmF0b21pY19kZXN0cm95X3N0YXRlCT0gZHJtX2F0b21pY19oZWxw ZXJfY3J0Y19kZXN0cm95X3N0YXRlLAorCS5lbmFibGVfdmJsYW5rCQk9IHp5bnFtcF9kaXNwX2Ny dGNfZW5hYmxlX3ZibGFuaywKKwkuZGlzYWJsZV92YmxhbmsJCT0genlucW1wX2Rpc3BfY3J0Y19k aXNhYmxlX3ZibGFuaywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeGxueF9jcnRjX29wcyB6 eW5xbXBfZGlzcF94bG54X2NydGNfb3BzID0geworCS5nZXRfbWF4X3dpZHRoCT0gJnp5bnFtcF9k aXNwX2dldF9tYXhfd2lkdGgsCisJLmdldF9tYXhfaGVpZ2h0CT0gJnp5bnFtcF9kaXNwX2dldF9t YXhfaGVpZ2h0LAorCS5nZXRfZm9ybWF0CT0gJnp5bnFtcF9kaXNwX2dldF9mb3JtYXQsCisJLmdl dF9hbGlnbgk9ICZ6eW5xbXBfZGlzcF9nZXRfYWxpZ24sCisJLmdldF9kbWFfbWFzawk9ICZ6eW5x bXBfZGlzcF9nZXRfZG1hX21hc2ssCit9OworCitzdGF0aWMgdm9pZCB6eW5xbXBfZGlzcF9jcmVh dGVfY3J0YyhzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3ApCit7CisJc3RydWN0IGRybV9wbGFuZSAq cGxhbmUgPSAmZGlzcC0+bGF5ZXJzW1pZTlFNUF9ESVNQX0xBWUVSX0dGWF0ucGxhbmU7CisJaW50 IHJldDsKKworCXJldCA9IGRybV9jcnRjX2luaXRfd2l0aF9wbGFuZXMoZGlzcC0+ZHJtLCAmZGlz cC0+eGxueF9jcnRjLmNydGMsIHBsYW5lLAorCQkJCQlOVUxMLCAmenlucW1wX2Rpc3BfY3J0Y19m dW5jcywgTlVMTCk7CisJZHJtX2NydGNfaGVscGVyX2FkZCgmZGlzcC0+eGxueF9jcnRjLmNydGMs CisJCQkgICAgJnp5bnFtcF9kaXNwX2NydGNfaGVscGVyX2Z1bmNzKTsKKworCWRpc3AtPnhsbnhf Y3J0Yy5vcHMgPSAmenlucW1wX2Rpc3BfeGxueF9jcnRjX29wczsKKwl4bG54X2NydGNfcmVnaXN0 ZXIoZGlzcC0+ZHJtLCAmZGlzcC0+eGxueF9jcnRjKTsKK30KKworc3RhdGljIHZvaWQgenlucW1w X2Rpc3BfZGVzdHJveV9jcnRjKHN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCkKK3sKKwl4bG54X2Ny dGNfdW5yZWdpc3RlcihkaXNwLT5kcm0sICZkaXNwLT54bG54X2NydGMpOworCXp5bnFtcF9kaXNw X2NydGNfZGVzdHJveSgmZGlzcC0+eGxueF9jcnRjLmNydGMpOworfQorCitzdGF0aWMgdm9pZCB6 eW5xbXBfZGlzcF9tYXBfY3J0Y190b19wbGFuZShzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3ApCit7 CisJdTMyIHBvc3NpYmxlX2NydGNzID0gZHJtX2NydGNfbWFzaygmZGlzcC0+eGxueF9jcnRjLmNy dGMpOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IFpZTlFNUF9ESVNQX05V TV9MQVlFUlM7IGkrKykKKwkJZGlzcC0+bGF5ZXJzW2ldLnBsYW5lLnBvc3NpYmxlX2NydGNzID0g cG9zc2libGVfY3J0Y3M7Cit9CisKKy8qCisgKiBDb21wb25lbnQgZnVuY3Rpb25zCisgKi8KKwor aW50IHp5bnFtcF9kaXNwX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpt YXN0ZXIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHp5bnFtcF9kcHN1YiAqZHBzdWIgPSBkZXZf Z2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3AgPSBkcHN1Yi0+ZGlz cDsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtID0gZGF0YTsKKwlpbnQgcmV0OworCisJZGlzcC0+ ZHJtID0gZHJtOworCisJcmV0ID0genlucW1wX2Rpc3BfY3JlYXRlX3BsYW5lKGRpc3ApOworCWlm IChyZXQpCisJCXJldHVybiByZXQ7CisJenlucW1wX2Rpc3BfY3JlYXRlX2NydGMoZGlzcCk7CisJ enlucW1wX2Rpc3BfbWFwX2NydGNfdG9fcGxhbmUoZGlzcCk7CisKKwlyZXR1cm4gMDsKK30KKwor dm9pZCB6eW5xbXBfZGlzcF91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNl ICptYXN0ZXIsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHp5bnFtcF9kcHN1YiAqZHBzdWIgPSBk ZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3AgPSBkcHN1Yi0+ ZGlzcDsKKworCXp5bnFtcF9kaXNwX2Rlc3Ryb3lfY3J0YyhkaXNwKTsKKwl6eW5xbXBfZGlzcF9k ZXN0cm95X3BsYW5lKGRpc3ApOworfQorCisvKgorICogUGxhdGZvcm0gaW5pdGlhbGl6YXRpb24g ZnVuY3Rpb25zCisgKi8KKworc3RhdGljIGludCB6eW5xbXBfZGlzcF9lbnVtZXJhdGVfZm10cyhz dHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3ApCit7CisJc3RydWN0IHp5bnFtcF9kaXNwX2xheWVyICps YXllcjsKKwl1MzIgKmJ1c19mbXRzOworCXUzMiBpLCBzaXplLCBudW1fYnVzX2ZtdHM7CisKKwlu dW1fYnVzX2ZtdHMgPSBBUlJBWV9TSVpFKGF2X2J1Zl9saXZlX2ZtdHMpOworCWJ1c19mbXRzID0g ZGV2bV9remFsbG9jKGRpc3AtPmRldiwgc2l6ZW9mKCpidXNfZm10cykgKiBudW1fYnVzX2ZtdHMs CisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFidXNfZm10cykKKwkJcmV0dXJuIC1FTk9NRU07CisJ Zm9yIChpID0gMDsgaSA8IG51bV9idXNfZm10czsgaSsrKQorCQlidXNfZm10c1tpXSA9IGF2X2J1 Zl9saXZlX2ZtdHNbaV0uYnVzX2ZtdDsKKworCWxheWVyID0gJmRpc3AtPmxheWVyc1taWU5RTVBf RElTUF9MQVlFUl9WSURdOworCWxheWVyLT5udW1fYnVzX2ZtdHMgPSBudW1fYnVzX2ZtdHM7CisJ bGF5ZXItPmJ1c19mbXRzID0gYnVzX2ZtdHM7CisJc2l6ZSA9IEFSUkFZX1NJWkUoYXZfYnVmX3Zp ZF9mbXRzKTsKKwlsYXllci0+bnVtX2ZtdHMgPSBzaXplOworCWxheWVyLT5kcm1fZm10cyA9IGRl dm1fa3phbGxvYyhkaXNwLT5kZXYsCisJCQkJICAgICAgIHNpemVvZigqbGF5ZXItPmRybV9mbXRz KSAqIHNpemUsCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghbGF5ZXItPmRybV9mbXRz KQorCQlyZXR1cm4gLUVOT01FTTsKKwlmb3IgKGkgPSAwOyBpIDwgbGF5ZXItPm51bV9mbXRzOyBp KyspCisJCWxheWVyLT5kcm1fZm10c1tpXSA9IGF2X2J1Zl92aWRfZm10c1tpXS5kcm1fZm10Owor CWxheWVyLT5mbXQgPSAmYXZfYnVmX3ZpZF9mbXRzW1pZTlFNUF9ESVNQX0FWX0JVRl9WSURfRk1U X1lVWVZdOworCisJbGF5ZXIgPSAmZGlzcC0+bGF5ZXJzW1pZTlFNUF9ESVNQX0xBWUVSX0dGWF07 CisJbGF5ZXItPm51bV9idXNfZm10cyA9IG51bV9idXNfZm10czsKKwlsYXllci0+YnVzX2ZtdHMg PSBidXNfZm10czsKKwlzaXplID0gQVJSQVlfU0laRShhdl9idWZfZ2Z4X2ZtdHMpOworCWxheWVy LT5udW1fZm10cyA9IHNpemU7CisJbGF5ZXItPmRybV9mbXRzID0gZGV2bV9remFsbG9jKGRpc3At PmRldiwKKwkJCQkgICAgICAgc2l6ZW9mKCpsYXllci0+ZHJtX2ZtdHMpICogc2l6ZSwKKwkJCQkg ICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFsYXllci0+ZHJtX2ZtdHMpCisJCXJldHVybiAtRU5P TUVNOworCisJZm9yIChpID0gMDsgaSA8IGxheWVyLT5udW1fZm10czsgaSsrKQorCQlsYXllci0+ ZHJtX2ZtdHNbaV0gPSBhdl9idWZfZ2Z4X2ZtdHNbaV0uZHJtX2ZtdDsKKwlsYXllci0+Zm10ID0g JmF2X2J1Zl9nZnhfZm10c1taWU5RTVBfRElTUF9BVl9CVUZfR0ZYX0ZNVF9SR0I1NjVdOworCisJ cmV0dXJuIDA7Cit9CisKK2ludCB6eW5xbXBfZGlzcF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2KQoreworCXN0cnVjdCB6eW5xbXBfZHBzdWIgKmRwc3ViOworCXN0cnVjdCB6eW5x bXBfZGlzcCAqZGlzcDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0OworCisJZGlz cCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRpc3ApLCBHRlBfS0VSTkVMKTsK KwlpZiAoIWRpc3ApCisJCXJldHVybiAtRU5PTUVNOworCWRpc3AtPmRldiA9ICZwZGV2LT5kZXY7 CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0Vf TUVNLCAiYmxlbmQiKTsKKwlkaXNwLT5ibGVuZC5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNl KCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihkaXNwLT5ibGVuZC5iYXNlKSkKKwkJcmV0 dXJuIFBUUl9FUlIoZGlzcC0+YmxlbmQuYmFzZSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVz b3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiYXZfYnVmIik7CisJZGlzcC0+YXZf YnVmLmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAo SVNfRVJSKGRpc3AtPmF2X2J1Zi5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGlzcC0+YXZfYnVm LmJhc2UpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JF U09VUkNFX01FTSwgImF1ZCIpOworCWRpc3AtPmF1ZC5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291 cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihkaXNwLT5hdWQuYmFzZSkpCisJCXJl dHVybiBQVFJfRVJSKGRpc3AtPmF1ZC5iYXNlKTsKKworCWRwc3ViID0gcGxhdGZvcm1fZ2V0X2Ry dmRhdGEocGRldik7CisJZHBzdWItPmRpc3AgPSBkaXNwOworCWRpc3AtPmRwc3ViID0gZHBzdWI7 CisKKwlyZXQgPSB6eW5xbXBfZGlzcF9lbnVtZXJhdGVfZm10cyhkaXNwKTsKKwlpZiAocmV0KQor CQlyZXR1cm4gcmV0OworCisJLyogVHJ5IHRoZSBsaXZlIFBMIHZpZGVvIGNsb2NrICovCisJZGlz cC0+X3BsX3BjbGsgPSBkZXZtX2Nsa19nZXQoZGlzcC0+ZGV2LCAiZHBfbGl2ZV92aWRlb19pbl9j bGsiKTsKKwlpZiAoIUlTX0VSUihkaXNwLT5fcGxfcGNsaykpIHsKKwkJZGlzcC0+cGNsayA9IGRp c3AtPl9wbF9wY2xrOworCQlyZXQgPSB6eW5xbXBfZGlzcF9jbGtfZW5hYmxlX2Rpc2FibGUoZGlz cC0+cGNsaywKKwkJCQkJCSAgICAgJmRpc3AtPnBjbGtfZW4pOworCQlpZiAocmV0KQorCQkJZGlz cC0+cGNsayA9IE5VTEw7CisJfSBlbHNlIGlmIChQVFJfRVJSKGRpc3AtPl9wbF9wY2xrKSA9PSAt RVBST0JFX0RFRkVSKSB7CisJCXJldHVybiBQVFJfRVJSKGRpc3AtPl9wbF9wY2xrKTsKKwl9CisK KwkvKiBJZiB0aGUgbGl2ZSBQTCB2aWRlbyBjbG9jayBpcyBub3QgdmFsaWQsIGZhbGwgYmFjayB0 byBQUyBjbG9jayAqLworCWlmICghZGlzcC0+cGNsaykgeworCQlkaXNwLT5fcHNfcGNsayA9IGRl dm1fY2xrX2dldChkaXNwLT5kZXYsICJkcF92dGNfcGl4ZWxfY2xrX2luIik7CisJCWlmIChJU19F UlIoZGlzcC0+X3BzX3BjbGspKSB7CisJCQlkZXZfZXJyKGRpc3AtPmRldiwgImZhaWxlZCB0byBp bml0IGFueSB2aWRlbyBjbG9ja1xuIik7CisJCQlyZXR1cm4gUFRSX0VSUihkaXNwLT5fcHNfcGNs ayk7CisJCX0KKwkJZGlzcC0+cGNsayA9IGRpc3AtPl9wc19wY2xrOworCQlyZXQgPSB6eW5xbXBf ZGlzcF9jbGtfZW5hYmxlX2Rpc2FibGUoZGlzcC0+cGNsaywKKwkJCQkJCSAgICAgJmRpc3AtPnBj bGtfZW4pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRpc3AtPmRldiwgImZhaWxlZCB0byBp bml0IGFueSB2aWRlbyBjbG9ja1xuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJZGlz cC0+YWNsayA9IGRldm1fY2xrX2dldChkaXNwLT5kZXYsICJkcF9hcGJfY2xrIik7CisJaWYgKElT X0VSUihkaXNwLT5hY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGlzcC0+YWNsayk7CisJcmV0ID0g enlucW1wX2Rpc3BfY2xrX2VuYWJsZShkaXNwLT5hY2xrLCAmZGlzcC0+YWNsa19lbik7CisJaWYg KHJldCkgeworCQlkZXZfZXJyKGRpc3AtPmRldiwgImZhaWxlZCB0byBlbmFibGUgdGhlIEFQQiBj bGtcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFRyeSB0aGUgbGl2ZSBQTCBhdWRpbyBj bG9jayAqLworCWRpc3AtPl9wbF9hdWRjbGsgPSBkZXZtX2Nsa19nZXQoZGlzcC0+ZGV2LCAiZHBf bGl2ZV9hdWRpb19hY2xrIik7CisJaWYgKCFJU19FUlIoZGlzcC0+X3BsX2F1ZGNsaykpIHsKKwkJ ZGlzcC0+YXVkY2xrID0gZGlzcC0+X3BsX2F1ZGNsazsKKwkJcmV0ID0genlucW1wX2Rpc3BfY2xr X2VuYWJsZV9kaXNhYmxlKGRpc3AtPmF1ZGNsaywKKwkJCQkJCSAgICAgJmRpc3AtPmF1ZGNsa19l bik7CisJCWlmIChyZXQpCisJCQlkaXNwLT5hdWRjbGsgPSBOVUxMOworCX0KKworCS8qIElmIHRo ZSBsaXZlIFBMIGF1ZGlvIGNsb2NrIGlzIG5vdCB2YWxpZCwgZmFsbCBiYWNrIHRvIFBTIGNsb2Nr ICovCisJaWYgKCFkaXNwLT5hdWRjbGspIHsKKwkJZGlzcC0+X3BzX2F1ZGNsayA9IGRldm1fY2xr X2dldChkaXNwLT5kZXYsICJkcF9hdWRfY2xrIik7CisJCWlmICghSVNfRVJSKGRpc3AtPl9wc19h dWRjbGspKSB7CisJCQlkaXNwLT5hdWRjbGsgPSBkaXNwLT5fcHNfYXVkY2xrOworCQkJcmV0ID0g enlucW1wX2Rpc3BfY2xrX2VuYWJsZV9kaXNhYmxlKGRpc3AtPmF1ZGNsaywKKwkJCQkJCQkgICAg ICZkaXNwLT5hdWRjbGtfZW4pOworCQkJaWYgKHJldCkKKwkJCQlkaXNwLT5hdWRjbGsgPSBOVUxM OworCQl9CisKKwkJaWYgKCFkaXNwLT5hdWRjbGspIHsKKwkJCWRldl9lcnIoZGlzcC0+ZGV2LAor CQkJCSJhdWRpbyBpcyBkaXNhYmxlZCBkdWUgdG8gY2xvY2sgZmFpbHVyZVxuIik7CisJCX0KKwl9 CisKKwlyZXQgPSB6eW5xbXBfZGlzcF9sYXllcl9jcmVhdGUoZGlzcCk7CisJaWYgKHJldCkKKwkJ Z290byBlcnJvcl9hY2xrOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2FjbGs6CisJenlucW1wX2Rp c3BfY2xrX2Rpc2FibGUoZGlzcC0+YWNsaywgJmRpc3AtPmFjbGtfZW4pOworCXJldHVybiByZXQ7 Cit9CisKK2ludCB6eW5xbXBfZGlzcF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRl dikKK3sKKwlzdHJ1Y3QgenlucW1wX2Rwc3ViICpkcHN1YiA9IHBsYXRmb3JtX2dldF9kcnZkYXRh KHBkZXYpOworCXN0cnVjdCB6eW5xbXBfZGlzcCAqZGlzcCA9IGRwc3ViLT5kaXNwOworCisJenlu cW1wX2Rpc3BfbGF5ZXJfZGVzdHJveShkaXNwKTsKKwlpZiAoZGlzcC0+YXVkY2xrKQorCQl6eW5x bXBfZGlzcF9jbGtfZGlzYWJsZShkaXNwLT5hdWRjbGssICZkaXNwLT5hdWRjbGtfZW4pOworCXp5 bnFtcF9kaXNwX2Nsa19kaXNhYmxlKGRpc3AtPmFjbGssICZkaXNwLT5hY2xrX2VuKTsKKwl6eW5x bXBfZGlzcF9jbGtfZGlzYWJsZShkaXNwLT5wY2xrLCAmZGlzcC0+cGNsa19lbik7CisJZHBzdWIt PmRpc3AgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0veGxueC96eW5xbXBfZGlzcC5oIGIvZHJpdmVycy9ncHUvZHJtL3hsbngvenlucW1wX2Rpc3Au aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTRjYzc4Ci0tLSAvZGV2L251 bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL3hsbngvenlucW1wX2Rpc3AuaApAQCAtMCwwICsxLDI5 IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIFp5bnFNUCBE aXNwbGF5IERyaXZlcgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTcgLSAyMDE4IFhpbGlueCwg SW5jLgorICoKKyAqICBBdXRob3I6IEh5dW4gV29vIEt3b24gPGh5dW4ua3dvbkB4aWxpbnguY29t PgorICovCisKKyNpZm5kZWYgX1pZTlFNUF9ESVNQX0hfCisjZGVmaW5lIF9aWU5RTVBfRElTUF9I XworCitzdHJ1Y3QgZGV2aWNlOworc3RydWN0IHBsYXRmb3JtX2RldmljZTsKK3N0cnVjdCB6eW5x bXBfZGlzcDsKKwordm9pZCB6eW5xbXBfZGlzcF9oYW5kbGVfdmJsYW5rKHN0cnVjdCB6eW5xbXBf ZGlzcCAqZGlzcCk7Cit1bnNpZ25lZCBpbnQgenlucW1wX2Rpc3BfZ2V0X2FwYl9jbGtfcmF0ZShz dHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3ApOworYm9vbCB6eW5xbXBfZGlzcF9hdWRfZW5hYmxlZChz dHJ1Y3QgenlucW1wX2Rpc3AgKmRpc3ApOwordW5zaWduZWQgaW50IHp5bnFtcF9kaXNwX2dldF9h dWRfY2xrX3JhdGUoc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwKTsKK3VpbnQzMl90IHp5bnFtcF9k aXNwX2dldF9jcnRjX21hc2soc3RydWN0IHp5bnFtcF9kaXNwICpkaXNwKTsKKworaW50IHp5bnFt cF9kaXNwX2JpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZv aWQgKmRhdGEpOwordm9pZCB6eW5xbXBfZGlzcF91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBz dHJ1Y3QgZGV2aWNlICptYXN0ZXIsIHZvaWQgKmRhdGEpOworCitpbnQgenlucW1wX2Rpc3BfcHJv YmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CitpbnQgenlucW1wX2Rpc3BfcmVtb3Zl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOworCisjZW5kaWYgLyogX1pZTlFNUF9ESVNQ X0hfICovCi0tIAoyLjcuNAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJp LWRldmVsCg==