From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753774AbZBOEI7 (ORCPT ); Sat, 14 Feb 2009 23:08:59 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752851AbZBOEIu (ORCPT ); Sat, 14 Feb 2009 23:08:50 -0500 Received: from an-out-0708.google.com ([209.85.132.240]:11568 "EHLO an-out-0708.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752800AbZBOEIt (ORCPT ); Sat, 14 Feb 2009 23:08:49 -0500 MIME-Version: 1.0 Date: Sat, 14 Feb 2009 23:08:46 -0500 X-Google-Sender-Auth: 347e845b89e634a7 Message-ID: <5aa163d00902142008g138826br80d3ea989e7af691@mail.gmail.com> Subject: [PATCH] input: xpad.c - Xbox 360 wireless and sysfs support From: Mike Murphy To: linux-kernel@vger.kernel.org Content-Type: multipart/mixed; boundary=0016e6470ef80222c90462ed3ad8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --0016e6470ef80222c90462ed3ad8 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Greetings, The attached patch is a result of a few days of hacking to get better Linux support for Xbox 360 wireless controllers. Major functional improvements include support for the LEDs on the wireless controllers (which are auto-set to the controller number as they are on the official console), added support for rumble effects on wireless controllers, added support for dead zones on all supported controllers, and added support for a square axis mapping for the left stick on all supported controllers. A large amount of the bulk in this patch is from the addition of a sysfs interface to retrieve information and adjust the dead zone/square axis settings. I also fixed a few bugs: - Removed the bulk urb altogether for setting the LED display. This operation is now done using the irq_out urb in xpad_send_led_command (via a shared work queue task to get out of the interrupt handler when processing the presence change packet). - Submission of urbs while holding a mutex is now GFP_ATOMIC - The odata_mutex is now locked when changing the odata for sending a force feedback effect. There is still a bug somewhere in the force feedback code, I believe in either ff-memless or lower, that causes a "warn_on_slowpath" message in the log and an occasional "scheduling while atomic" BUG. I have thus far been unable to isolate it. This code has been tested only with a wireless 360 receiver, 4 controllers (individually and concurrently), and a RedOctane wireless guitar. It needs more testing with a broader range of devices, especially wired devices. Patch generated against 2.6.28.2 (no changes in relevant in-kernel driver from 2.6.28.2 to 2.6.28.5, so should apply against latest stable). Comments are appreciated. I am _NOT_ subscribed to the LKML, so please CC me directly. Thanks, Mike -- Mike Murphy Ph.D. Candidate and NSF Graduate Research Fellow Clemson University School of Computing 120 McAdams Hall Clemson, SC 29634-0974 USA Tel: +1 864.656.2838 Fax: +1 864.656.0145 http://cirg.cs.clemson.edu/~mamurph --0016e6470ef80222c90462ed3ad8 Content-Type: text/x-patch; charset=US-ASCII; name="xpad.patch" Content-Disposition: attachment; filename="xpad.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fr76h2je0 LS0tIG9yaWdkcnYvZHJpdmVycy9pbnB1dC9qb3lzdGljay94cGFkLmMJMjAwOS0wMi0xNCAyMjoz OToyMC4wMDAwMDAwMDAgLTA1MDAKKysrIG5ld2Rydi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL3hw YWQuYwkyMDA5LTAyLTE0IDIyOjQxOjI3LjAwMDAwMDAwMCAtMDUwMApAQCAtMSw1ICsxLDggQEAK IC8qCi0gKiBYLUJveCBnYW1lcGFkIGRyaXZlcgorICogWGJveCBnYW1lcGFkIGRyaXZlciB3aXRo IFhib3ggMzYwIHdpcmVkL3dpcmVsZXNzIHN1cHBvcnQKKyAqCisgKiBMYXN0IE1vZGlmaWVkOgkx NCBGZWJydWFyeSAyMDA5CisgKgkJCU1pa2UgTXVycGh5IDxtYW11cnBoQGNzLmNsZW1zb24uZWR1 PgogICoKICAqIENvcHlyaWdodCAoYykgMjAwMiBNYXJrbyBGcmllZGVtYW5uIDxtZnJAYm14LWNo ZW1uaXR6LmRlPgogICogICAgICAgICAgICAgICAyMDA0IE9saXZlciBTY2h3YXJ0eiA8T2xpdmVy LlNjaHdhcnR6QGdteC5kZT4sCkBAIC05LDYgKzEyLDcgQEAKICAqICAgICAgICAgICAgICAgMjAw NSBEb21pbmljIENlcnF1ZXR0aSA8YmluYXJ5MTIzMEB5YWhvby5jb20+CiAgKiAgICAgICAgICAg ICAgIDIwMDYgQWRhbSBCdWNoYmluZGVyIDxhZGFtLmJ1Y2hiaW5kZXJAZ21haWwuY29tPgogICog ICAgICAgICAgICAgICAyMDA3IEphbiBLcmF0b2NodmlsIDxob256YUBqaWtvcy5jej4KKyAqICAg ICAgICAgICAgICAgMjAwOSBDbGVtc29uIFVuaXZlcnNpdHkKICAqCiAgKiBUaGlzIHByb2dyYW0g aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2Rp ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cwpAQCAtMzAsNiArMzQsNyBAQAogICogIC0gdGhlIGlGb3JjZSBkcml2ZXIgICAgZHJpdmVycy9j aGFyL2pveXN0aWNrL2lmb3JjZS5jCiAgKiAgLSB0aGUgc2tlbGV0b24tZHJpdmVyICBkcml2ZXJz L3VzYi91c2Itc2tlbGV0b24uYwogICogIC0gWGJveCAzNjAgaW5mb3JtYXRpb24gaHR0cDovL3d3 dy5mcmVlNjAub3JnL3dpa2kvR2FtZXBhZAorICogIC0geGJveGRydiBkb2NzICAgICAgICAgaHR0 cDovL3Bpbmd1cy5zZXVsLm9yZy9+Z3J1bWJlbC94Ym94ZHJ2LwogICoKICAqIFRoYW5rcyB0bzoK ICAqICAtIElUTyBUYWtheXVraSBmb3IgcHJvdmlkaW5nIGVzc2VudGlhbCB4cGFkIGluZm9ybWF0 aW9uIG9uIGhpcyB3ZWJzaXRlCkBAIC0zOCwxMCArNDMsMTYgQEAKICAqICAtIFhCT1ggTGludXgg cHJvamVjdCAtIGV4dHJhIFVTQiBpZCdzCiAgKgogICogVE9ETzoKLSAqICAtIGZpbmUgdHVuZSBh eGVzIChlc3BlY2lhbGx5IHRyaWdnZXIgYXhlcykKICAqICAtIGZpeCAiYW5hbG9nIiBidXR0b25z IChyZXBvcnRlZCBhcyBkaWdpdGFsIG5vdykKLSAqICAtIGdldCBydW1ibGUgd29ya2luZwogICog IC0gbmVlZCBVU0IgSURzIGZvciBvdGhlciBkYW5jZSBwYWRzCisgKiAgLSBmaXggaW5wdXQgZGVz Y3JpcHRvciBsZWFrIChyZXF1aXJlcyBmaW5kaW5nIGNhdXNlKQorICogICAgLSB0byByZXByb2R1 Y2UgYmVoYXZpb3I6CisgKiAgICAgICQgbHMgL3N5cy9jbGFzcy9pbnB1dAorICogICAgICAjIHJt bW9kIHhwYWQKKyAqICAgICAgIyBpbnNtb2QgLi94cGFkLmtvCisgKiAgICAgICQgbHMgL3N5cy9j bGFzcy9pbnB1dAorICogIC0gZml4IHdhcm5fb25fc2xvd3BhdGggYW5kIG9jY2FzaW9uYWwgc2No ZWR1bGluZyB3aGlsZSBhdG9taWMgQlVHcyB3aGVuCisgKiAgICB1c2luZyBydW1ibGUgKGJ1ZyBy ZXN1bHRzIGZyb20gdXNlIG9mIGEgdGltZXIgc29tZXdoZXJlIGluIGZmLW1lbWxlc3MpLgogICoK ICAqIEhpc3Rvcnk6CiAgKgpAQCAtNjksNyArODAsMzQgQEAKICAqICAtIHBhc3MgdGhlIG1vZHVs ZSBwYXJhbWF0ZXIgJ2RwYWRfdG9fYnV0dG9ucycgdG8gZm9yY2UKICAqICAgIHRoZSBELVBBRCB0 byBtYXAgdG8gYnV0dG9ucyBpZiB5b3VyIHBhZCBpcyBub3QgZGV0ZWN0ZWQKICAqCi0gKiBMYXRl ciBjaGFuZ2VzIGNhbiBiZSB0cmFja2VkIGluIFNDTS4KKyAqIDIwMDktMDItMDIgOiBXaXJlbGVz cyAzNjAgY29udHJvbGxlciBmaXhlcworICogIC0gZm9sbG93ZWQgUFJPVE9DT0wgZGVzY3JpcHRp b24gZnJvbSB4Ym94ZHJ2IHVzZXJzcGFjZSBkcml2ZXIKKyAqICAtIExFRCBhbmQgcnVtYmxlIHN1 cHBvcnQgYWRkZWQgZm9yIHdpcmVsZXNzIDM2MCBjb250cm9sbGVyIChwcm90b2NvbAorICogICAg aXMgZGlmZmVyZW50IGZyb20gd2lyZWQhKQorICoKKyAqIDIwMDktMDItMDYgOiBBeGlzIGhhbmRs aW5nIGltcHJvdmVtZW50cworICogIC0gdW5pZmllZCBoYW5kbGVyIGZvciBsZWZ0IGFuZCByaWdo dCBzdGlja3MKKyAqICAtIGluaXRpYWwgc3VwcG9ydCBmb3IgZGVhZCB6b25lcworICoKKyAqIDIw MDktMDItMDcgOiBNb3JlIHdpcmVsZXNzIDM2MCBjb250cm9sbGVyIGZpeGVzCisgKiAgLSByZW1v dmVkIGJ1bGsgdXJiIGNvbXBsZXRlbHkKKyAqICAtIHVzZSB4cGFkX3NlbmRfbGVkX2NvbW1hbmQg dG8gc2V0IGNvbnRyb2xsZXIgbnVtYmVyIG9uIExFRCBkaXNwbGF5CisgKiAgICAod2lyZWxlc3Mg MzYwIGNvbnRyb2xsZXIpCisgKiAgLSBmaXhlZCB1cmIgc3VibWlzc2lvbiB3aGlsZSBob2xkaW5n IG11dGV4IHRvIEdGUF9BVE9NSUMKKyAqICAtIGRlYWRfem9uZSBpcyBub3cgYW4gYWRqdXN0YWJs ZSBtb2R1bGUgcGFyYW1ldGVyCisgKgorICogMjAwOS0wMi0xMiA6IFNjYWxpbmcgZm9yIGRlYWQg em9uZSBhbmQgc3F1YXJlIGF4aXMgc3VwcG9ydAorICogIC0gYXhlcyBub3cgc2NhbGUgZnJvbSAw IHRvIDMyNzY3IHN0YXJ0aW5nIGF0IGVkZ2Ugb2YgZGVhZCB6b25lCisgKiAgLSBpbmNyZWFzZWQg ZGVmYXVsdCBkZWFkIHpvbmUgdG8gODE5MgorICogIC0gaW5pdGlhbCBzcXVhcmUgYXhpcyBzdXBw b3J0IChyZWxpYWJsZSBvbmx5IHdpdGggbGVmdCBzdGljaykKKyAqCisgKiAyMDA5LTAyLTEzIDog RGlzYWJsZSBzcXVhcmUgYXhpcyBmb3IgcmlnaHQgc3RpY2sKKyAqICAtIHNxdWFyZSBheGlzIGFw cGxpZXMgdG8gbGVmdCBzdGljayBvbmx5CisgKgorICogMjAwOS0wMi0xNCA6IEFkZGVkIHN5c2Zz IGludGVyZmFjZQorICogIC0gZGVhZCB6b25lcyBhbmQgc3F1YXJlIGF4aXMgc2V0dGluZ3MgY2Fu IG5vdyBiZSBtYWRlIHBlci1jb250cm9sbGVyCisgKiAgLSByZW1vdmVkIGRlYWRfem9uZSBhbmQg c3F1YXJlX2F4aXMgbW9kdWxlIHBhcmFtZXRlcnMgKHVzZSBzeXNmcykKKyAqICAtIG5ldyBzcXVh cmUgYXhpcyBhbGdvcml0aG0KICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC03 OCw5ICsxMTYsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgv bW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgv d29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4 L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKIAogI2RlZmluZSBEUklWRVJf QVVUSE9SICJNYXJrbyBGcmllZGVtYW5uIDxtZnJAYm14LWNoZW1uaXR6LmRlPiIKLSNkZWZpbmUg RFJJVkVSX0RFU0MgIlgtQm94IHBhZCBkcml2ZXIiCisjZGVmaW5lIERSSVZFUl9ERVNDICJYLUJv eC8zNjAgcGFkIGRyaXZlciIKIAogI2RlZmluZSBYUEFEX1BLVF9MRU4gMzIKIApAQCAtOTAsNjIg KzEzMywxMjcgQEAKICNkZWZpbmUgTUFQX0RQQURfVE9fQVhFUyAgICAgICAxCiAjZGVmaW5lIE1B UF9EUEFEX1VOS05PV04gICAgICAgMgogCisvKiBUeXBlIG9mIGNvbnRyb2xsZXIgKmludGVyZmFj ZSogKG9yaWdpbmFsLCB3aXJlZCAzNjAsIHdpcmVsZXNzIDM2MCkgKi8KICNkZWZpbmUgWFRZUEVf WEJPWCAgICAgICAgMAogI2RlZmluZSBYVFlQRV9YQk9YMzYwICAgICAxCiAjZGVmaW5lIFhUWVBF X1hCT1gzNjBXICAgIDIKICNkZWZpbmUgWFRZUEVfVU5LTk9XTiAgICAgMwogCi1zdGF0aWMgaW50 IGRwYWRfdG9fYnV0dG9uczsKKy8qIFR5cGUgb2YgY29udHJvbGxlciAoZS5nLiBwYWQsIGd1aXRh ciwgb3RoZXIgaW5wdXQgZGV2aWNlKSAqLworI2RlZmluZSBYQ09OVFJPTExFUl9UWVBFX05PTkUJ CTAKKyNkZWZpbmUgWENPTlRST0xMRVJfVFlQRV9QQUQJCTEKKyNkZWZpbmUgWENPTlRST0xMRVJf VFlQRV9HVUlUQVIJCTIKKyNkZWZpbmUgWENPTlRST0xMRVJfVFlQRV9EQU5DRV9QQUQJMworI2Rl ZmluZSBYQ09OVFJPTExFUl9UWVBFX09USEVSCQkyNTUKKworCisvKiBUaGUgWGJveCAzNjAgY29u dHJvbGxlcnMgaGF2ZSBzZW5zaXRpdmUgc3RpY2tzIHRoYXQgb2Z0ZW4gZG8gbm90IGNlbnRlcgor ICogZXhhY3RseS4gQSBkZWFkIHpvbmUgY2F1c2VzIHN0aWNrIGV2ZW50cyBiZWxvdyBhIGNlcnRh aW4gdGhyZXNoaG9sZCB0byBiZQorICogcmVwb3J0ZWQgYXMgemVyby4KKyAqCisgKiBUaGUgZGVm YXVsdCBkZWFkIHpvbmUgc2l6ZSBpcyA4MTkyLCB3aGljaCB3YXMgb2J0YWluZWQgYnkgdGVzdGlu ZyBhCisgKiB3aXJlbGVzcyAzNjAgY29udHJvbGxlciB3aXRoIGpzdGVzdCgxKSBhbmQgY29uc3Vs dGluZyBnYW1pbmcgZm9ydW1zIGZvcgorICogYSByZWNvbW1lbmRlZCBkZWFkIHpvbmUgZm9yIHRo aXMgY29udHJvbGxlci4gVGhlIGNvbnNlbnN1cyBvcGluaW9uIHdhcworICogMC4yNSAob24gYSBz Y2FsZSBmcm9tIDAgdG8gMSksIHdoaWNoIGNvcnJlc3BvbmRzIHRvIDgxOTIgKG91dCBvZiAzMjc2 NykuCisgKi8KKyNkZWZpbmUgWERFQURfWk9ORV9ERUZBVUxUICAgODE5MgorCisvKiBEZWZhdWx0 IGF4ZXMgZm9yIHRoZSBzdGlja3MgYXJlIHJhZGlhbCAqLworI2RlZmluZSBYU1FVQVJFX0FYSVNf REVGQVVMVCAwCisKK3N0YXRpYyBpbnQgZHBhZF90b19idXR0b25zID0gMDsKIG1vZHVsZV9wYXJh bShkcGFkX3RvX2J1dHRvbnMsIGJvb2wsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhkcGFk X3RvX2J1dHRvbnMsICJNYXAgRC1QQUQgdG8gYnV0dG9ucyByYXRoZXIgdGhhbiBheGVzIGZvciB1 bmtub3duIHBhZHMiKTsKIAorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHhwYWRfZGV2aWNlIHsKIAl1 MTYgaWRWZW5kb3I7CiAJdTE2IGlkUHJvZHVjdDsKIAljaGFyICpuYW1lOwogCXU4IGRwYWRfbWFw cGluZzsKIAl1OCB4dHlwZTsKKwl1OCBjb250cm9sbGVyX3R5cGU7CiB9IHhwYWRfZGV2aWNlW10g PSB7Ci0JeyAweDA0NWUsIDB4MDIwMiwgIk1pY3Jvc29mdCBYLUJveCBwYWQgdjEgKFVTKSIsIE1B UF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1ggfSwKLQl7IDB4MDQ1ZSwgMHgwMjg5LCAiTWljcm9z b2Z0IFgtQm94IHBhZCB2MiAoVVMpIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWCB9LAot CXsgMHgwNDVlLCAweDAyODUsICJNaWNyb3NvZnQgWC1Cb3ggcGFkIChKYXBhbikiLCBNQVBfRFBB RF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCi0JeyAweDA0NWUsIDB4MDI4NywgIk1pY3Jvc29mdCBY Ym94IENvbnRyb2xsZXIgUyIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1ggfSwKLQl7IDB4 MDQ1ZSwgMHgwNzE5LCAiWGJveCAzNjAgV2lyZWxlc3MgUmVjZWl2ZXIiLCBNQVBfRFBBRF9UT19C VVRUT05TLCBYVFlQRV9YQk9YMzYwVyB9LAotCXsgMHgwYzEyLCAweDg4MDksICJSZWRPY3RhbmUg WGJveCBEYW5jZSBQYWQiLCBNQVBfRFBBRF9UT19CVVRUT05TLCBYVFlQRV9YQk9YIH0sCi0JeyAw eDA0NGYsIDB4MGYwNywgIlRocnVzdG1hc3RlciwgSW5jLiBDb250cm9sbGVyIiwgTUFQX0RQQURf VE9fQVhFUywgWFRZUEVfWEJPWCB9LAotCXsgMHgwNDZkLCAweGMyNDIsICJMb2dpdGVjaCBDaGls bHN0cmVhbSBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWDM2MCB9LAot CXsgMHgwNDZkLCAweGNhODQsICJMb2dpdGVjaCBYYm94IENvcmRsZXNzIENvbnRyb2xsZXIiLCBN QVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCi0JeyAweDA0NmQsIDB4Y2E4OCwgIkxvZ2l0 ZWNoIENvbXBhY3QgQ29udHJvbGxlciBmb3IgWGJveCIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBF X1hCT1ggfSwKLQl7IDB4MDVmZCwgMHgxMDA3LCAiTWFkIENhdHogQ29udHJvbGxlciAodW52ZXJp ZmllZCkiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCi0JeyAweDA1ZmQsIDB4MTA3 YSwgIkludGVyQWN0ICdQb3dlclBhZCBQcm8nIFgtQm94IHBhZCAoR2VybWFueSkiLCBNQVBfRFBB RF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCi0JeyAweDA3MzgsIDB4NDUxNiwgIk1hZCBDYXR6IENv bnRyb2wgUGFkIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWCB9LAotCXsgMHgwNzM4LCAw eDQ1MjIsICJNYWQgQ2F0eiBMdW1pQ09OIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWCB9 LAotCXsgMHgwNzM4LCAweDQ1MjYsICJNYWQgQ2F0eiBDb250cm9sIFBhZCBQcm8iLCBNQVBfRFBB RF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCi0JeyAweDA3MzgsIDB4NDUzNiwgIk1hZCBDYXR6IE1p Y3JvQ09OIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWCB9LAotCXsgMHgwNzM4LCAweDQ1 NDAsICJNYWQgQ2F0eiBCZWF0IFBhZCIsIE1BUF9EUEFEX1RPX0JVVFRPTlMsIFhUWVBFX1hCT1gg fSwKLQl7IDB4MDczOCwgMHg0NTU2LCAiTWFkIENhdHogTHlueCBXaXJlbGVzcyBDb250cm9sbGVy IiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWCB9LAotCXsgMHgwNzM4LCAweDQ3MTYsICJN YWQgQ2F0eiBXaXJlZCBYYm94IDM2MCBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZ UEVfWEJPWDM2MCB9LAotCXsgMHgwNzM4LCAweDYwNDAsICJNYWQgQ2F0eiBCZWF0IFBhZCBQcm8i LCBNQVBfRFBBRF9UT19CVVRUT05TLCBYVFlQRV9YQk9YIH0sCi0JeyAweDBjMTIsIDB4ODgwMiwg Ilplcm9wbHVzIFhib3ggQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1gg fSwKLQl7IDB4MGMxMiwgMHg4ODBhLCAiUGVsaWNhbiBFY2xpcHNlIFBMLTIwMjMiLCBNQVBfRFBB RF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCi0JeyAweDBjMTIsIDB4ODgxMCwgIlplcm9wbHVzIFhi b3ggQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1ggfSwKLQl7IDB4MGMx MiwgMHg5OTAyLCAiSEFNQSBWaWJyYVggLSAqRkFVTFRZIEhBUkRXQVJFKiIsIE1BUF9EUEFEX1RP X0FYRVMsIFhUWVBFX1hCT1ggfSwKLQl7IDB4MGU0YywgMHgxMDk3LCAiUmFkaWNhIEdhbWVzdGVy IENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCi0JeyAweDBlNGMs IDB4MjM5MCwgIlJhZGljYSBHYW1lcyBKdGVjaCBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhF UywgWFRZUEVfWEJPWCB9LAotCXsgMHgwZTZmLCAweDAwMDMsICJMb2dpYzMgRnJlZWJpcmQgd2ly ZWxlc3MgQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1ggfSwKLQl7IDB4 MGU2ZiwgMHgwMDA1LCAiRWNsaXBzZSB3aXJlbGVzcyBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9f QVhFUywgWFRZUEVfWEJPWCB9LAotCXsgMHgwZTZmLCAweDAwMDYsICJFZGdlIHdpcmVsZXNzIENv bnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCi0JeyAweDBlNmYsIDB4 MDAwNiwgIlBlbGljYW4gJ1RTWicgV2lyZWQgWGJveCAzNjAgQ29udHJvbGxlciIsIE1BUF9EUEFE X1RPX0FYRVMsIFhUWVBFX1hCT1gzNjAgfSwKLQl7IDB4MGU4ZiwgMHgwMjAxLCAiU21hcnRKb3kg RnJhZyBYcGFkL1BTMiBhZGFwdG9yIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWCB9LAot CXsgMHgwZjMwLCAweDAyMDIsICJKb3l0ZWNoIEFkdmFuY2VkIENvbnRyb2xsZXIiLCBNQVBfRFBB RF9UT19BWEVTLCBYVFlQRV9YQk9YIH0sCi0JeyAweDBmMzAsIDB4ODg4OCwgIkJpZ0JlbiBYQk1p bmlQYWQgQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1ggfSwKLQl7IDB4 MTAyYywgMHhmZjBjLCAiSm95dGVjaCBXaXJlbGVzcyBBZHZhbmNlZCBDb250cm9sbGVyIiwgTUFQ X0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWCB9LAotCXsgMHgxMmFiLCAweDg4MDksICJYYm94IERE UiBkYW5jZXBhZCIsIE1BUF9EUEFEX1RPX0JVVFRPTlMsIFhUWVBFX1hCT1ggfSwKLQl7IDB4MTQz MCwgMHg0NzQ4LCAiUmVkT2N0YW5lIEd1aXRhciBIZXJvIFgtcGxvcmVyIiwgTUFQX0RQQURfVE9f QVhFUywgWFRZUEVfWEJPWDM2MCB9LAotCXsgMHgxNDMwLCAweDg4ODgsICJUWDY1MDArIERhbmNl IFBhZCAoZmlyc3QgZ2VuZXJhdGlvbikiLCBNQVBfRFBBRF9UT19CVVRUT05TLCBYVFlQRV9YQk9Y IH0sCi0JeyAweDA0NWUsIDB4MDI4ZSwgIk1pY3Jvc29mdCBYLUJveCAzNjAgcGFkIiwgTUFQX0RQ QURfVE9fQVhFUywgWFRZUEVfWEJPWDM2MCB9LAotCXsgMHhmZmZmLCAweGZmZmYsICJDaGluZXNl LW1hZGUgWGJveCBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWCB9LAot CXsgMHgwMDAwLCAweDAwMDAsICJHZW5lcmljIFgtQm94IHBhZCIsIE1BUF9EUEFEX1VOS05PV04s IFhUWVBFX1VOS05PV04gfQorCXsgMHgwNDVlLCAweDAyMDIsICJNaWNyb3NvZnQgWC1Cb3ggcGFk IHYxIChVUykiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9U WVBFX1BBRCB9LAorCXsgMHgwNDVlLCAweDAyODksICJNaWNyb3NvZnQgWC1Cb3ggcGFkIHYyIChV UykiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBFX1BB RCB9LAorCXsgMHgwNDVlLCAweDAyODUsICJNaWNyb3NvZnQgWC1Cb3ggcGFkIChKYXBhbikiLCBN QVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBFX1BBRCB9LAor CXsgMHgwNDVlLCAweDAyODcsICJNaWNyb3NvZnQgWGJveCBDb250cm9sbGVyIFMiLCBNQVBfRFBB RF9UT19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBFX1BBRCB9LAorCXsgMHgw NDVlLCAweDA3MTksICJYYm94IDM2MCBXaXJlbGVzcyBSZWNlaXZlciIsIE1BUF9EUEFEX1RPX0JV VFRPTlMsIFhUWVBFX1hCT1gzNjBXLAorCQlYQ09OVFJPTExFUl9UWVBFX05PTkUgfSwKKwl7IDB4 MGMxMiwgMHg4ODA5LCAiUmVkT2N0YW5lIFhib3ggRGFuY2UgUGFkIiwgTUFQX0RQQURfVE9fQlVU VE9OUywgWFRZUEVfWEJPWCwKKwkJWENPTlRST0xMRVJfVFlQRV9EQU5DRV9QQUQgfSwKKwl7IDB4 MDQ0ZiwgMHgwZjA3LCAiVGhydXN0bWFzdGVyLCBJbmMuIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9U T19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBFX1BBRCB9LAorCXsgMHgwNDZk LCAweGMyNDIsICJMb2dpdGVjaCBDaGlsbHN0cmVhbSBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9f QVhFUywgWFRZUEVfWEJPWDM2MCwKKwkJWENPTlRST0xMRVJfVFlQRV9QQUQgfSwKKwl7IDB4MDQ2 ZCwgMHhjYTg0LCAiTG9naXRlY2ggWGJveCBDb3JkbGVzcyBDb250cm9sbGVyIiwgTUFQX0RQQURf VE9fQVhFUywgWFRZUEVfWEJPWCwKKwkJWENPTlRST0xMRVJfVFlQRV9QQUQgfSwKKwl7IDB4MDQ2 ZCwgMHhjYTg4LCAiTG9naXRlY2ggQ29tcGFjdCBDb250cm9sbGVyIGZvciBYYm94IiwgTUFQX0RQ QURfVE9fQVhFUywgWFRZUEVfWEJPWCwKKwkJWENPTlRST0xMRVJfVFlQRV9QQUQgfSwKKwl7IDB4 MDVmZCwgMHgxMDA3LCAiTWFkIENhdHogQ29udHJvbGxlciAodW52ZXJpZmllZCkiLCBNQVBfRFBB RF9UT19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBFX1BBRCB9LAorCXsgMHgw NWZkLCAweDEwN2EsICJJbnRlckFjdCAnUG93ZXJQYWQgUHJvJyBYLUJveCBwYWQgKEdlcm1hbnkp IiwgTUFQX0RQQURfVE9fQVhFUywKKwkJWFRZUEVfWEJPWCwgWENPTlRST0xMRVJfVFlQRV9QQUQg fSwKKwl7IDB4MDczOCwgMHg0NTE2LCAiTWFkIENhdHogQ29udHJvbCBQYWQiLCBNQVBfRFBBRF9U T19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBFX1BBRCB9LAorCXsgMHgwNzM4 LCAweDQ1MjIsICJNYWQgQ2F0eiBMdW1pQ09OIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJP WCwKKwkJWENPTlRST0xMRVJfVFlQRV9QQUQgfSwKKwl7IDB4MDczOCwgMHg0NTI2LCAiTWFkIENh dHogQ29udHJvbCBQYWQgUHJvIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWCwKKwkJWENP TlRST0xMRVJfVFlQRV9QQUQgfSwKKwl7IDB4MDczOCwgMHg0NTM2LCAiTWFkIENhdHogTWljcm9D T04iLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBFX1BB RCB9LAorCXsgMHgwNzM4LCAweDQ1NDAsICJNYWQgQ2F0eiBCZWF0IFBhZCIsIE1BUF9EUEFEX1RP X0JVVFRPTlMsIFhUWVBFX1hCT1gsCisJCVhDT05UUk9MTEVSX1RZUEVfREFOQ0VfUEFEIH0sCisJ eyAweDA3MzgsIDB4NDU1NiwgIk1hZCBDYXR6IEx5bnggV2lyZWxlc3MgQ29udHJvbGxlciIsIE1B UF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1gsCisJCVhDT05UUk9MTEVSX1RZUEVfUEFEIH0sCisJ eyAweDA3MzgsIDB4NDcxNiwgIk1hZCBDYXR6IFdpcmVkIFhib3ggMzYwIENvbnRyb2xsZXIiLCBN QVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YMzYwLAorCQlYQ09OVFJPTExFUl9UWVBFX1BBRCB9 LAorCXsgMHgwNzM4LCAweDYwNDAsICJNYWQgQ2F0eiBCZWF0IFBhZCBQcm8iLCBNQVBfRFBBRF9U T19CVVRUT05TLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBFX0RBTkNFX1BBRCB9LAor CXsgMHgwYzEyLCAweDg4MDIsICJaZXJvcGx1cyBYYm94IENvbnRyb2xsZXIiLCBNQVBfRFBBRF9U T19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBFX1BBRCB9LAorCXsgMHgwYzEy LCAweDg4MGEsICJQZWxpY2FuIEVjbGlwc2UgUEwtMjAyMyIsIE1BUF9EUEFEX1RPX0FYRVMsIFhU WVBFX1hCT1gsCisJCVhDT05UUk9MTEVSX1RZUEVfUEFEIH0sCisJeyAweDBjMTIsIDB4ODgxMCwg Ilplcm9wbHVzIFhib3ggQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1gs CisJCVhDT05UUk9MTEVSX1RZUEVfUEFEIH0sCisJeyAweDBjMTIsIDB4OTkwMiwgIkhBTUEgVmli cmFYIC0gKkZBVUxUWSBIQVJEV0FSRSoiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YLAor CQlYQ09OVFJPTExFUl9UWVBFX1BBRCB9LAorCXsgMHgwZTRjLCAweDEwOTcsICJSYWRpY2EgR2Ft ZXN0ZXIgQ29udHJvbGxlciIsIE1BUF9EUEFEX1RPX0FYRVMsIFhUWVBFX1hCT1gsCisJCVhDT05U Uk9MTEVSX1RZUEVfUEFEIH0sCisJeyAweDBlNGMsIDB4MjM5MCwgIlJhZGljYSBHYW1lcyBKdGVj aCBDb250cm9sbGVyIiwgTUFQX0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWCwKKwkJWENPTlRST0xM RVJfVFlQRV9QQUQgfSwKKwl7IDB4MGU2ZiwgMHgwMDAzLCAiTG9naWMzIEZyZWViaXJkIHdpcmVs ZXNzIENvbnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJP TExFUl9UWVBFX1BBRCB9LAorCXsgMHgwZTZmLCAweDAwMDUsICJFY2xpcHNlIHdpcmVsZXNzIENv bnRyb2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9U WVBFX1BBRCB9LAorCXsgMHgwZTZmLCAweDAwMDYsICJFZGdlIHdpcmVsZXNzIENvbnRyb2xsZXIi LCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBFX1BBRCB9 LAorCXsgMHgwZTZmLCAweDAwMDYsICJQZWxpY2FuICdUU1onIFdpcmVkIFhib3ggMzYwIENvbnRy b2xsZXIiLCBNQVBfRFBBRF9UT19BWEVTLAorCQlYVFlQRV9YQk9YMzYwLCBYQ09OVFJPTExFUl9U WVBFX1BBRCB9LAorCXsgMHgwZThmLCAweDAyMDEsICJTbWFydEpveSBGcmFnIFhwYWQvUFMyIGFk YXB0b3IiLCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBF X1BBRCB9LAorCXsgMHgwZjMwLCAweDAyMDIsICJKb3l0ZWNoIEFkdmFuY2VkIENvbnRyb2xsZXIi LCBNQVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBFX1BBRCB9 LAorCXsgMHgwZjMwLCAweDg4ODgsICJCaWdCZW4gWEJNaW5pUGFkIENvbnRyb2xsZXIiLCBNQVBf RFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBFX1BBRCB9LAorCXsg MHgxMDJjLCAweGZmMGMsICJKb3l0ZWNoIFdpcmVsZXNzIEFkdmFuY2VkIENvbnRyb2xsZXIiLCBN QVBfRFBBRF9UT19BWEVTLCBYVFlQRV9YQk9YLAorCQlYQ09OVFJPTExFUl9UWVBFX1BBRCB9LAor CXsgMHgxMmFiLCAweDg4MDksICJYYm94IEREUiBkYW5jZXBhZCIsIE1BUF9EUEFEX1RPX0JVVFRP TlMsIFhUWVBFX1hCT1gsCisJCVhDT05UUk9MTEVSX1RZUEVfREFOQ0VfUEFEIH0sCisJeyAweDE0 MzAsIDB4NDc0OCwgIlJlZE9jdGFuZSBHdWl0YXIgSGVybyBYLXBsb3JlciIsIE1BUF9EUEFEX1RP X0FYRVMsIFhUWVBFX1hCT1gzNjAsCisJCVhDT05UUk9MTEVSX1RZUEVfR1VJVEFSIH0sCisJeyAw eDE0MzAsIDB4ODg4OCwgIlRYNjUwMCsgRGFuY2UgUGFkIChmaXJzdCBnZW5lcmF0aW9uKSIsIE1B UF9EUEFEX1RPX0JVVFRPTlMsIFhUWVBFX1hCT1gsCisJCVhDT05UUk9MTEVSX1RZUEVfREFOQ0Vf UEFEIH0sCisJeyAweDA0NWUsIDB4MDI4ZSwgIk1pY3Jvc29mdCBYLUJveCAzNjAgcGFkIiwgTUFQ X0RQQURfVE9fQVhFUywgWFRZUEVfWEJPWDM2MCwKKwkJWENPTlRST0xMRVJfVFlQRV9QQUQgfSwK Kwl7IDB4ZmZmZiwgMHhmZmZmLCAiQ2hpbmVzZS1tYWRlIFhib3ggQ29udHJvbGxlciIsIE1BUF9E UEFEX1RPX0FYRVMsIFhUWVBFX1hCT1gsCisJCVhDT05UUk9MTEVSX1RZUEVfUEFEIH0sCisJeyAw eDAwMDAsIDB4MDAwMCwgIkdlbmVyaWMgWC1Cb3ggcGFkIiwgTUFQX0RQQURfVU5LTk9XTiwgWFRZ UEVfVU5LTk9XTiwKKwkJWENPTlRST0xMRVJfVFlQRV9QQUQgfQogfTsKIAogLyogYnV0dG9ucyBz aGFyZWQgd2l0aCB4Ym94IGFuZCB4Ym94MzYwICovCkBAIC0yMTMsMTkgKzMyMSw4MCBAQAogCiBN T0RVTEVfREVWSUNFX1RBQkxFICh1c2IsIHhwYWRfdGFibGUpOwogCisKKy8qIFdpcmVsZXNzIDM2 MCBkZXZpY2UgaWRlbnRpZmljYXRpb24uIFNlZSBsZW5ndGh5IG5vdGVzIGFib3V0IGtvYmplY3Qg ZGF0YQorICogYmVsb3cuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdzM2MF9pZCB7CisJdTMy IGlkX2J5dGVzOworCXU4IGNvbnRyb2xsZXJfdHlwZTsKK30gdzM2MF9pZFtdID0geworCXsgMHg0 MDQxNTAwMSwgWENPTlRST0xMRVJfVFlQRV9QQUQgfSwKKwl7IDB4NDQzMDUxMDcsIFhDT05UUk9M TEVSX1RZUEVfR1VJVEFSIH0sCisJeyAweDAwMDAwMDAwLCBYQ09OVFJPTExFUl9UWVBFX05PTkUg fQorfTsKKworCisvKiBrb2JqZWN0IGRhdGEgZm9yIHN5c2ZzLiBTb21lIG9mIHRoZXNlIGZpZWxk cyBhcmUgcmVhZC1vbmx5LCBtb3N0bHkgZm9yCisgKiBsYXRlciB1c2Ugd2l0aCB1c2Vyc3BhY2Ug YXBwbGljYXRpb25zIHRvIHJlY29nbml6ZSBpbmRpdmlkdWFsIGNvbnRyb2xsZXJzLgorICogVGhl IGRlYWRfem9uZSBhbmQgc3F1YXJlX2F4aXMgc2V0dGluZ3MgY2FuIGJlIGNoYW5nZWQgIm9uIHRo ZSBmbHkiIGFuZCBhcmUKKyAqIGVmZmVjdGl2ZSBpbW1lZGlhdGVseS4KKyAqCisgKiBNb3N0IG9m IHRoZSByZWFkLW9ubHkgZmllbGRzIGFyZSB0byBzdXBwb3J0ICp3aXJlbGVzcyogMzYwIGNvbnRy b2xsZXJzLgorICogVGhlIGNvbnRyb2xsZXJfbnVtYmVyIGlzIHVzZWQgdG8gc2V0IHRoZSBMRUQs IHdoaWxlIHBhZF9wcmVzZW50IHRyYWNrcworICogd2hldGhlciB0aGUgY29ycmVwc29uZGluZyBj b250cm9sbGVyIGlzIGNvbm5lY3RlZCB0byB0aGUgd2lyZWxlc3MgcmVjZWl2ZXIuCisgKiBDb250 cm9sbGVyIHR5cGUgYXBwbGllcyB0byBhbGwgbW9kZWxzICh3aXJlZCBhbmQgd2lyZWxlc3MpLCBh bmQgdHJhY2tzCisgKiB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgYSBwYWQsIGd1aXRhciwgZXRjLiBm b3IgbGF0ZXIgdXNlcnNwYWNlIHVzZS4KKyAqCisgKiBUaGUgY29udHJvbGxlcl91bmlxdWVfaWQg aXMgYSBmaWVsZCBvZiBiaXRzIGluIGEgcGFydGljdWxhciB3aXJlbGVzcworICogcGFja2V0IHRo YXQgU0VFTSB0byBjb3JyZXNwb25kIHRvIHNvbWUga2luZCBvZiB1bmlxdWUgSUQgYnVpbHQgaW50 byB0aGUKKyAqIGNvbnRyb2xsZXIuIFVzaW5nIHVzYm1vbiAoc2VlIERvY3VtZW50YXRpb24vdXNi L3VzYm1vbi50eHQpLCBJIHRyaWVkIDQKKyAqIGdhbWVwYWRzIGFuZCBhIGd1aXRhciwgYW5kIEkg Z290IHRoZSBmb2xsb3dpbmcgNSBwYWNrZXRzIGF0IGNvbm5lY3Rpb24KKyAqIHRpbWUgZm9yIGVh Y2ggZGV2aWNlLCByZXNwZWN0aXZlbHkuCisgKgorICogMDAwZjAwZjAgMDBjY2ZkMjcgMDA2MGUy MjYgNjM3MDAwMTAgMTNlMzIwMWQgMzAwMzQwMDEgNTAwMWZmZmYgZmYKKyAqIDAwMGYwMGYwIGYw Y2NmZDI3IDAwNjBkOGM0IGU5NjAwMDA5IDEzZTcyMDFkIDMwMDM0MDAxIDUwMDFmZmZmIGZmCisg KiAwMDBmMDBmMCAwMGNjZmQyNyAwMDYwNTc4YiA4MmYwMDAxMCAxM2UzMjAxZCAzMDAzNDAwMSA1 MDAxZmZmZiBmZgorICogMDAwZjAwZjAgZjBjY2ZkMjcgMDA2MGRhMWMgYjE1MDAwMDkgMTNlNzIw MWQgMzAwMzQwMDEgNTAwMWZmZmYgZmYKKyAqIDAwMGYwMGYwIGYwY2NmZDI3IDAwNjAwMmQxIDcx ZDEwMDAwIDEzZTMyMDFkIDMwMDM0NDMwIDUxMDdmZmZmIGZmCisgKgorICogRnJvbSB0aGlzIHRy YWNlIGRhdGEsIEkgY29uY29jdGVkIHRoZSBmb2xsb3dpbmcgKHBvdGVudGlhbGx5IGluY29ycmVj dCkKKyAqIHNjaGVtZSBmb3IgZGV0ZWN0aW5nIHR5cGUgYW5kIHVuaXF1ZSBJRDoKKyAqCisgKiAq KioqKioqKiB4eCoqKip4eCB4eHh4eHh4eCB4eHh4Kip4eCAqKnh4KioqKiAqKioqdHR0dCB0dHR0 KioqKiAqKgorICogICAgICAgICAgICAgICAgfCAgdW5pcXVlIGlkIHwgICAgICAgICAgICAgICAg ICAgIHwgIHR5cGUgfAorICoKKyAqIEZ1cnRoZXIgdGVzdGluZyBvdmVyIGEgd2lkZXIgdmFyaWV0 eSBvZiBkZXZpY2VzIGlzIHByb2JhYmx5IG5lZWRlZCB0bworICogZGV0ZXJtaW5lIGlmIGNoYW5n ZXMgbmVlZCB0byBiZSBtYWRlIHRvIHRoaXMgc2NoZW1lLgorICovCitzdHJ1Y3QgeHBhZF9kYXRh IHsKKwlzdHJ1Y3Qga29iamVjdCBrb2JqOwkJLyoga29iamVjdCBmb3Igc3lzZnMgKi8KKwlpbnQg Y29udHJvbGxlcl9udW1iZXI7CQkvKiBjb250cm9sbGVyIG51bWJlciAoMS00KSBmb3IgMzYwdy4g cm8gKi8KKwlpbnQgcGFkX3ByZXNlbnQ7ICAgICAgICAgICAgICAgIC8qIDM2MHcgcGFkIHByZXNl bmNlIGRldGVjdGlvbi4gcm8gKi8KKwlpbnQgY29udHJvbGxlcl90eXBlOyAgICAgICAgICAgIC8q IGNvbnRyb2xsZXIgdHlwZS4gcm8gKi8KKwljaGFyIGNvbnRyb2xsZXJfdW5pcXVlX2lkWzE3XTsg IC8qIHVuaXF1ZSBJRCBvZiBjb250cm9sbGVyICgzNjB3KS4gcm8gKi8KKwl1bnNpZ25lZCBpbnQg ZGVhZF96b25lOyAgICAgICAgIC8qIGRlYWQgem9uZSBmb3IgYm90aCBzdGlja3MuIHJ3ICovCisJ aW50IHNxdWFyZV9heGlzOyAgICAgICAgICAgICAgICAvKiBzcXVhcmUgYXhpcyBmb3IgbGVmdCBz dGljay4gcncgKi8KK307CisjZGVmaW5lIHRvX3hwYWRfZGF0YShrKSBjb250YWluZXJfb2Yoaywg c3RydWN0IHhwYWRfZGF0YSwga29iaikKKworLyogYXR0cmlidXRlIHN0cnVjdHVyZSBmb3Igc3lz ZnMgKi8KK3N0cnVjdCB4cGFkX2F0dHJpYnV0ZSB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwor CXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgeHBhZF9kYXRhICp4ZCwgc3RydWN0IHhwYWRfYXR0cmli dXRlICphdHRyLCBjaGFyICpidWYpOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IHhwYWRfZGF0 YSAqeGQsIHN0cnVjdCB4cGFkX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAorCQlz aXplX3QgY291bnQpOworfTsKKyNkZWZpbmUgdG9feHBhZF9hdHRyKGspIGNvbnRhaW5lcl9vZihr LCBzdHJ1Y3QgeHBhZF9hdHRyaWJ1dGUsIGF0dHIpCisKIHN0cnVjdCB1c2JfeHBhZCB7CiAJc3Ry dWN0IGlucHV0X2RldiAqZGV2OwkJLyogaW5wdXQgZGV2aWNlIGludGVyZmFjZSAqLwogCXN0cnVj dCB1c2JfZGV2aWNlICp1ZGV2OwkvKiB1c2IgZGV2aWNlICovCiAKLQlpbnQgcGFkX3ByZXNlbnQ7 Ci0KIAlzdHJ1Y3QgdXJiICppcnFfaW47CQkvKiB1cmIgZm9yIGludGVycnVwdCBpbiByZXBvcnQg Ki8KIAl1bnNpZ25lZCBjaGFyICppZGF0YTsJCS8qIGlucHV0IGRhdGEgKi8KIAlkbWFfYWRkcl90 IGlkYXRhX2RtYTsKIAotCXN0cnVjdCB1cmIgKmJ1bGtfb3V0OwotCXVuc2lnbmVkIGNoYXIgKmJk YXRhOwotCiAjaWYgZGVmaW5lZChDT05GSUdfSk9ZU1RJQ0tfWFBBRF9GRikgfHwgZGVmaW5lZChD T05GSUdfSk9ZU1RJQ0tfWFBBRF9MRURTKQogCXN0cnVjdCB1cmIgKmlycV9vdXQ7CQkvKiB1cmIg Zm9yIGludGVycnVwdCBvdXQgcmVwb3J0ICovCiAJdW5zaWduZWQgY2hhciAqb2RhdGE7CQkvKiBv dXRwdXQgZGF0YSAqLwpAQCAtMjQxLDggKzQxMCwyODYgQEAKIAogCWludCBkcGFkX21hcHBpbmc7 CQkvKiBtYXAgZC1wYWQgdG8gYnV0dG9ucyBvciB0byBheGVzICovCiAJaW50IHh0eXBlOwkJCS8q IHR5cGUgb2YgeGJveCBkZXZpY2UgKi8KKwkKKwkvKiBXb3JrIHN0cnVjdHVyZSBmb3IgbW92aW5n IHRoZSBjYWxsIHRvIHhwYWRfc2VuZF9sZWRfY29tbWFuZAorCSAqIG91dHNpZGUgdGhlIGludGVy cnVwdCBoYW5kbGVyIGZvciBwYWNrZXQgcHJvY2Vzc2luZyAqLworCXN0cnVjdCB3b3JrX3N0cnVj dCB3b3JrOworCQorCS8qIENvbnRyb2xsZXIgZGF0YSBpcyBub3cgaW4gYSBrb2JqZWN0IGZvciB1 c2Ugd2l0aCBzeXNmcyAqLworCXN0cnVjdCB4cGFkX2RhdGEgKmNvbnRyb2xsZXJfZGF0YTsKIH07 CiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogU3lzRnMgaW50ZXJmYWNlIGltcGxl bWVudGVkIHVzaW5nIERvY3VtZW50YXRpb24va29iamVjdC50eHQgYW5kIGV4YW1wbGVzIGluCisg KiBzYW1wbGVzL2tvYmplY3QuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHhwYWRfYXR0cl9zaG93KHN0 cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJ ICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IHhwYWRfYXR0cmlidXRlICphdHRyaWJ1dGU7CisJ c3RydWN0IHhwYWRfZGF0YSAqeGQ7CisKKwlhdHRyaWJ1dGUgPSB0b194cGFkX2F0dHIoYXR0cik7 CisJeGQgPSB0b194cGFkX2RhdGEoa29iaik7CisKKwlpZiAoIWF0dHJpYnV0ZS0+c2hvdykKKwkJ cmV0dXJuIC1FSU87CisKKwlyZXR1cm4gYXR0cmlidXRlLT5zaG93KHhkLCBhdHRyaWJ1dGUsIGJ1 Zik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHhwYWRfYXR0cl9zdG9yZShzdHJ1Y3Qga29iamVjdCAq a29iaiwKKwkJCSAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjb25zdCBj aGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHhwYWRfYXR0cmlidXRlICphdHRyaWJ1 dGU7CisJc3RydWN0IHhwYWRfZGF0YSAqeGQ7CisKKwlhdHRyaWJ1dGUgPSB0b194cGFkX2F0dHIo YXR0cik7CisJeGQgPSB0b194cGFkX2RhdGEoa29iaik7CisKKwlpZiAoIWF0dHJpYnV0ZS0+c3Rv cmUpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGF0dHJpYnV0ZS0+c3RvcmUoeGQsIGF0dHJp YnV0ZSwgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3RydWN0IHN5c2ZzX29wcyB4cGFkX3N5c2Zz X29wcyA9IHsKKwkuc2hvdyA9IHhwYWRfYXR0cl9zaG93LAorCS5zdG9yZSA9IHhwYWRfYXR0cl9z dG9yZSwKK307CisKK3N0YXRpYyB2b2lkIHhwYWRfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29i aikKK3sKKwlzdHJ1Y3QgeHBhZF9kYXRhICp4ZDsKKwl4ZCA9IHRvX3hwYWRfZGF0YShrb2JqKTsK KwlrZnJlZSh4ZCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHhwYWRfc2hvd19kZWFkX3pvbmUoc3Ry dWN0IHhwYWRfZGF0YSAqeGQsCisJc3RydWN0IHhwYWRfYXR0cmlidXRlICphdHRyLCBjaGFyICpi dWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHhkLT5kZWFkX3pvbmUpOworfQor CitzdGF0aWMgc3NpemVfdCB4cGFkX3N0b3JlX2RlYWRfem9uZShzdHJ1Y3QgeHBhZF9kYXRhICp4 ZCwKKwlzdHJ1Y3QgeHBhZF9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90 IGNvdW50KQoreworCWludCBuZXdkejsKKwlzc2NhbmYoYnVmLCAiJWQiLCAmbmV3ZHopOworCWlm ICgobmV3ZHogPj0gMCkgJiYgKG5ld2R6IDwgMzI3NjApKSB7CisJCXhkLT5kZWFkX3pvbmUgPSBu ZXdkejsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCB4cGFkX3Nob3df c3F1YXJlX2F4aXMoc3RydWN0IHhwYWRfZGF0YSAqeGQsCisJc3RydWN0IHhwYWRfYXR0cmlidXRl ICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHhkLT5z cXVhcmVfYXhpcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHhwYWRfc3RvcmVfc3F1YXJlX2F4aXMo c3RydWN0IHhwYWRfZGF0YSAqeGQsCisJc3RydWN0IHhwYWRfYXR0cmlidXRlICphdHRyLCBjb25z dCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgbmV3YXhpcyA9IDA7CisJc3NjYW5m KGJ1ZiwgIiVkIiwgJm5ld2F4aXMpOworCXhkLT5zcXVhcmVfYXhpcyA9IChuZXdheGlzKSA/IDEg OiAwOworCXJldHVybiBjb3VudDsKK30KKworLyogcmVhZC1vbmx5IGF0dHJzICovCitzdGF0aWMg c3NpemVfdCB4cGFkX3Nob3dfaW50KHN0cnVjdCB4cGFkX2RhdGEgKnhkLCBzdHJ1Y3QgeHBhZF9h dHRyaWJ1dGUgKmF0dHIsCisJY2hhciAqYnVmKQoreworCWludCB2YWx1ZTsKKwlpZiAoIXN0cmNt cChhdHRyLT5hdHRyLm5hbWUsICJjb250cm9sbGVyX251bWJlciIpKQorCQl2YWx1ZSA9IHhkLT5j b250cm9sbGVyX251bWJlcjsKKwllbHNlIGlmICghc3RyY21wKGF0dHItPmF0dHIubmFtZSwgInBh ZF9wcmVzZW50IikpCisJCXZhbHVlID0geGQtPnBhZF9wcmVzZW50OworCWVsc2UgaWYgKCFzdHJj bXAoYXR0ci0+YXR0ci5uYW1lLCAiY29udHJvbGxlcl90eXBlIikpCisJCXZhbHVlID0geGQtPmNv bnRyb2xsZXJfdHlwZTsKKwllbHNlCisJCXZhbHVlID0gMDsKKwlyZXR1cm4gc3ByaW50ZihidWYs ICIlZFxuIiwgdmFsdWUpOworfQorCitzdGF0aWMgc3NpemVfdCB4cGFkX3Nob3dfaWQoc3RydWN0 IHhwYWRfZGF0YSAqeGQsIHN0cnVjdCB4cGFkX2F0dHJpYnV0ZSAqYXR0ciwKKwljaGFyICpidWYp Cit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIHhkLT5jb250cm9sbGVyX3VuaXF1ZV9p ZCk7Cit9CisKKy8qIG1hcHMgKi8KK3N0YXRpYyBzdHJ1Y3QgeHBhZF9hdHRyaWJ1dGUgY29udHJv bGxlcl9udW1iZXJfYXR0ciA9CisJX19BVFRSKGNvbnRyb2xsZXJfbnVtYmVyLCAwNDQ0LCB4cGFk X3Nob3dfaW50LCBOVUxMKTsKK3N0YXRpYyBzdHJ1Y3QgeHBhZF9hdHRyaWJ1dGUgcGFkX3ByZXNl bnRfYXR0ciA9CisJX19BVFRSKHBhZF9wcmVzZW50LCAwNDQ0LCB4cGFkX3Nob3dfaW50LCBOVUxM KTsKK3N0YXRpYyBzdHJ1Y3QgeHBhZF9hdHRyaWJ1dGUgY29udHJvbGxlcl90eXBlX2F0dHIgPQor CV9fQVRUUihjb250cm9sbGVyX3R5cGUsIDA0NDQsIHhwYWRfc2hvd19pbnQsIE5VTEwpOworc3Rh dGljIHN0cnVjdCB4cGFkX2F0dHJpYnV0ZSBjb250cm9sbGVyX3VuaXF1ZV9pZF9hdHRyID0KKwlf X0FUVFIoY29udHJvbGxlcl91bmlxdWVfaWQsIDA0NDQsIHhwYWRfc2hvd19pZCwgTlVMTCk7CisK Ky8qIHJ3IG1hcHMgKi8KK3N0YXRpYyBzdHJ1Y3QgeHBhZF9hdHRyaWJ1dGUgZGVhZF96b25lX2F0 dHIgPQorCV9fQVRUUihkZWFkX3pvbmUsIDA2NjYsIHhwYWRfc2hvd19kZWFkX3pvbmUsIHhwYWRf c3RvcmVfZGVhZF96b25lKTsKK3N0YXRpYyBzdHJ1Y3QgeHBhZF9hdHRyaWJ1dGUgc3F1YXJlX2F4 aXNfYXR0ciA9CisJX19BVFRSKHNxdWFyZV9heGlzLCAwNjY2LCB4cGFkX3Nob3dfc3F1YXJlX2F4 aXMsIHhwYWRfc3RvcmVfc3F1YXJlX2F4aXMpOworCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRl ICp4cGFkX2RlZmF1bHRfYXR0cnNbXSA9IHsKKwkmY29udHJvbGxlcl9udW1iZXJfYXR0ci5hdHRy LAorCSZwYWRfcHJlc2VudF9hdHRyLmF0dHIsCisJJmNvbnRyb2xsZXJfdHlwZV9hdHRyLmF0dHIs CisJJmNvbnRyb2xsZXJfdW5pcXVlX2lkX2F0dHIuYXR0ciwKKwkmZGVhZF96b25lX2F0dHIuYXR0 ciwKKwkmc3F1YXJlX2F4aXNfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3Qg a29ial90eXBlIHhwYWRfa3R5cGUgPSB7CisJLnN5c2ZzX29wcyA9ICZ4cGFkX3N5c2ZzX29wcywK KwkucmVsZWFzZSA9IHhwYWRfcmVsZWFzZSwKKwkuZGVmYXVsdF9hdHRycyA9IHhwYWRfZGVmYXVs dF9hdHRycywKK307CisKK3N0YXRpYyBzdHJ1Y3QgeHBhZF9kYXRhICp4cGFkX2NyZWF0ZV9kYXRh KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBrb2JqZWN0ICpwYXJlbnQpIHsKKwlzdHJ1Y3QgeHBh ZF9kYXRhICpkYXRhID0gTlVMTDsKKwlpbnQgY2hlY2s7CisJCisJZGF0YSA9IGt6YWxsb2Moc2l6 ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gTlVMTDsKKwkK KwljaGVjayA9IGtvYmplY3RfaW5pdF9hbmRfYWRkKCZkYXRhLT5rb2JqLCAmeHBhZF9rdHlwZSwg cGFyZW50LCAiJXMiLCBuYW1lKTsKKwlpZiAoY2hlY2spIHsKKwkJa29iamVjdF9wdXQoJmRhdGEt PmtvYmopOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJa29iamVjdF91ZXZlbnQoJmRhdGEtPmtv YmosIEtPQkpfQUREKTsKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQgeHBhZF9kZXN0 cm95X2RhdGEoc3RydWN0IHhwYWRfZGF0YSAqZGF0YSkKK3sKKwlrb2JqZWN0X3B1dCgmZGF0YS0+ a29iaik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBOZWVkIHByb3RvdHlw ZSBkdWUgdG8gbW9kdWxlIG9yZGVyICovCitzdGF0aWMgdm9pZCB4cGFkX3NlbmRfbGVkX2NvbW1h bmQoc3RydWN0IHVzYl94cGFkICp4cGFkLCBpbnQgY29tbWFuZCk7CisKKworLyoKKyAqCXhwYWRf d29ya19jb250cm9sbGVyCisgKgorICoJU3VibWl0cyBjb21tYW5kIHRvIHNldCBwYWQgbnVtYmVy IG9uIExFRCBkaXNwbGF5IG9mIHdpcmVsZXNzIDM2MAorICoJY29udHJvbGxlcnMuIFRoZSBzaGFy ZWQgd29ya3F1ZXVlIGlzIHVzZWQgZm9yIHRoaXMgcHVycG9zZSwgc28gdGhhdAorICoJdGhlIGlu dGVycnVwdCBoYW5kbGVyIGlzIGtlcHQgc2hvcnQuCisgKi8KK3N0YXRpYyB2b2lkIHhwYWRfd29y a19jb250cm9sbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqdykKK3sKKyAgIHN0cnVjdCB1c2JfeHBh ZCAqIHhwYWQgPSBjb250YWluZXJfb2Yodywgc3RydWN0IHVzYl94cGFkLCB3b3JrKTsKKyAgIHhw YWRfc2VuZF9sZWRfY29tbWFuZCh4cGFkLCB4cGFkLT5jb250cm9sbGVyX2RhdGEtPmNvbnRyb2xs ZXJfbnVtYmVyICsgMSk7Cit9CisKKworLyoKKyAqCXhwYWRfcHJvY2Vzc19zdGlja3MKKyAqCisg KglIYW5kbGVzIHN0aWNrIGlucHV0LCBhY2NvdW50aW5nIGZvciBkZWFkIHpvbmVzIGFuZCBzcXVh cmUgYXhlcy4gQmFzZWQKKyAqCW9uIHRoZSBvcmlnaW5hbCBoYW5kbGVycyBmb3IgdGhlIFhib3gg YW5kIFhib3ggMzYwIGluCisgKgl4cGFkX3Byb2Nlc3NfcGFja2V0IGFuZCB4cGFkMzYwX3Byb2Nl c3NfcGFja2V0LCBidXQgdW5pZmllZCB0byBhdm9pZAorICoJZHVwbGljYXRpb24uCisgKgorICoJ V2hlbmV2ZXIgYSBkZWFkIHpvbmUgaXMgdXNlZCwgZWFjaCBheGlzIGlzIHNjYWxlZCBzbyB0aGF0 IG1vdmluZyB0aGUKKyAqCXN0aWNrIHNsaWdodGx5IG91dCBvZiB0aGUgZGVhZCB6b25lIHJhbmdl IHJlc3VsdHMgaW4gYSBsb3cgYXhpcworICoJdmFsdWUgaW4ganN0ZXN0KDEpLCB3aGlsZSBtb3Zp bmcgdGhlIHN0aWNrIHRvIHRoZSBtYXhpbXVtIHBvc2l0aW9uCisgKglhbG9uZyBhbnkgYXhpcyBz dGlsbCByZXN1bHRzIGluIDMyNzY3LgorICoKKyAqCVNxdWFyZSBheGlzIGFsZ29yaXRobTogZm9y IHRoZSBMRUZUIFNUSUNLIE9OTFkgKFggYW5kIFkgYXhlcyksIHRoZQorICoJY29vcmRpbmF0ZSBz eXN0ZW0gY2FuIGJlIHNldCB0byBiZSBtb3JlIGxpa2UgY2xhc3NpYyBjb250cm9sbGVycworICoJ YW5kIFBDIGpveXN0aWNrcy4gVGhpcyBtYXBwaW5nIGlzIGFjY29tcGxpc2hlZCBjb25jZXB0dWFs bHkgYnkKKyAqCWluc2NyaWJpbmcgYSBzcXVhcmUgaW5zaWRlIHRoZSByYWRpYWwgb3BlbmluZyBv ZiB0aGUgcGxhc3RpYyBjYXNlCisgKglvbiB0aGUgY29udHJvbGxlciwgd2hpY2ggaGFzIGEgcmFk aXVzIG9mIDEuMCBvbiBhIGZsb2F0aW5nLXBvaW50CisgKglzY2FsZSAoMjMxNzAgb24gdGhlIGlu dGVnZXIgc2NhbGUpLiBBcyBhIHJlc3VsdCwgdGhlIFggYW5kIFkgYXhpcworICoJd2lsbCBoYXZl IGEgc21hbGxlciByYW5nZSwgcmVhY2hpbmcgMzI3NjcgYXQgdGhlIHBvaW50IHRoYXQgd2FzCisg Kglmb3JtZXJseSAyMzE3MC4gSW4gcHJhY3RpY2UsIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBmYWly bHkgY29tcGxleAorICoJdG8gdW5kZXJzdGFuZCwgZHVlIHRvIHRoZSBuZWVkIHRvIGludGVncmF0 ZSBpdCB3aXRoIHRoZSBkZWFkCisgKgl6b25lIHNjYWxpbmcuCisgKi8KK3N0YXRpYyB2b2lkIHhw YWRfcHJvY2Vzc19zdGlja3Moc3RydWN0IHVzYl94cGFkICp4cGFkLCB1bnNpZ25lZCBjaGFyICpk YXRhKQoreworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHhwYWQtPmRldjsKKwlpbnQgY29vcmRz WzRdOyAgICAvKiB4LCB5LCByeCwgcnkgKi8KKwlpbnQgeF9vZmZzZXQsIHlfb2Zmc2V0LCByeF9v ZmZzZXQsIHJ5X29mZnNldDsKKwlpbnQgdG1wLCBhZGp1c3QsIGM7CisJaW50IGFic19tYWduaXR1 ZGU7CisJaW50IGRlYWRfem9uZSwgc3F1YXJlX2F4aXM7CisJCisJZGVhZF96b25lID0geHBhZC0+ Y29udHJvbGxlcl9kYXRhLT5kZWFkX3pvbmU7CisJc3F1YXJlX2F4aXMgPSB4cGFkLT5jb250cm9s bGVyX2RhdGEtPnNxdWFyZV9heGlzOworCQorCWlmICh4cGFkLT54dHlwZSA9PSBYVFlQRV9YQk9Y KSB7CisJCXhfb2Zmc2V0ID0gMTI7CisJCXlfb2Zmc2V0ID0gMTQ7CisJCXJ4X29mZnNldCA9IDE2 OworCQlyeV9vZmZzZXQgPSAxODsKKwl9CisJZWxzZSB7CisJCXhfb2Zmc2V0ID0gNjsKKwkJeV9v ZmZzZXQgPSA4OworCQlyeF9vZmZzZXQgPSAxMDsKKwkJcnlfb2Zmc2V0ID0gMTI7CisJfQorCQor CWNvb3Jkc1swXSA9IChfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIHhfb2Zm c2V0KSk7CisJY29vcmRzWzFdID0gfihfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0 YSArIHlfb2Zmc2V0KSk7CisJY29vcmRzWzJdID0gKF9fczE2KSBsZTE2X3RvX2NwdXAoKF9fbGUx NiAqKShkYXRhICsgcnhfb2Zmc2V0KSk7CisJY29vcmRzWzNdID0gfihfX3MxNikgbGUxNl90b19j cHVwKChfX2xlMTYgKikoZGF0YSArIHJ5X29mZnNldCkpOworCQorCS8qIEFkanVzdG1lbnQgZm9y IGRlYWQgem9uZSBhbmQgc3F1YXJlIGF4aXMgKi8KKwlmb3IgKGMgPSAwOyBjIDwgNDsgYysrKSB7 CisJCWFkanVzdCA9IDA7CisJCWFic19tYWduaXR1ZGUgPSAoaW50KSBjb29yZHNbY107CisJCWlm IChhYnNfbWFnbml0dWRlIDwgMCkKKwkJCWFic19tYWduaXR1ZGUgPSAtYWJzX21hZ25pdHVkZTsK KwkJCisJCWlmIChkZWFkX3pvbmUgfHwgc3F1YXJlX2F4aXMpIHsKKwkJCWFkanVzdCA9IChzcXVh cmVfYXhpcyAmJiAoYyA8IDIpKSA/IDIzMTcwIDogMzI3Njc7CisJCQkvKiBDYXJlZnVsOiByZW1v dmluZyB0aGUgZm9sbG93aW5nIGNoZWNrIHdpbGwgcmVzdWx0CisJCQkgKiBpbiBkaXZpc2lvbiBi eSB6ZXJvIGlmIHRoZSBkZWFkX3pvbmUgaXMgemVyby4uLiAqLworCQkJaWYgKGRlYWRfem9uZSkK KwkJCQlhZGp1c3QgPSAoYWRqdXN0IC0gZGVhZF96b25lKSAvIGRlYWRfem9uZTsKKwkJCWlmIChh ZGp1c3QgPCAwKSB7CisJCQkJYWRqdXN0ID0gMDsKKwkJCX0KKwkJfQorCQorCQlpZiAoYWJzX21h Z25pdHVkZSA8IGRlYWRfem9uZSkgeworCQkJY29vcmRzW2NdID0gMDsKKwkJfQorCQllbHNlIGlm IChhZGp1c3QpIHsKKwkJCXRtcCA9ICgoYWJzX21hZ25pdHVkZSAtIGRlYWRfem9uZSkgLyBhZGp1 c3QpICsgYWJzX21hZ25pdHVkZSAtIGRlYWRfem9uZTsKKwkJCWlmICh0bXAgPiAzMjc2Nykgewor CQkJCXRtcCA9IDMyNzY3OworCQkJfQorCQkJY29vcmRzW2NdID0gKGNvb3Jkc1tjXSA8IDApID8g LXRtcCA6IHRtcDsKKwkJfQorCX0KKwkKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1gsIChf X3MxNikgY29vcmRzWzBdKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1ksIChfX3MxNikg Y29vcmRzWzFdKTsKKwlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JYLCAoX19zMTYpIGNvb3Jk c1syXSk7CisJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19SWSwgKF9fczE2KSBjb29yZHNbM10p OworfQorCiAvKgogICoJeHBhZF9wcm9jZXNzX3BhY2tldAogICoKQEAgLTI1NiwxOCArNzAzLDkg QEAKIHN0YXRpYyB2b2lkIHhwYWRfcHJvY2Vzc19wYWNrZXQoc3RydWN0IHVzYl94cGFkICp4cGFk LCB1MTYgY21kLCB1bnNpZ25lZCBjaGFyICpkYXRhKQogewogCXN0cnVjdCBpbnB1dF9kZXYgKmRl diA9IHhwYWQtPmRldjsKLQotCS8qIGxlZnQgc3RpY2sgKi8KLQlpbnB1dF9yZXBvcnRfYWJzKGRl diwgQUJTX1gsCi0JCQkgKF9fczE2KSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKShkYXRhICsgMTIp KSk7Ci0JaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLAotCQkJIH4oX19zMTYpIGxlMTZfdG9f Y3B1cCgoX19sZTE2ICopKGRhdGEgKyAxNCkpKTsKLQotCS8qIHJpZ2h0IHN0aWNrICovCi0JaW5w dXRfcmVwb3J0X2FicyhkZXYsIEFCU19SWCwKLQkJCSAoX19zMTYpIGxlMTZfdG9fY3B1cCgoX19s ZTE2ICopKGRhdGEgKyAxNikpKTsKLQlpbnB1dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JZLAotCQkJ IH4oX19zMTYpIGxlMTZfdG9fY3B1cCgoX19sZTE2ICopKGRhdGEgKyAxOCkpKTsKKwkKKwkvKiBs ZWZ0IGFuZCByaWdodCBzdGlja3MgKi8KKwl4cGFkX3Byb2Nlc3Nfc3RpY2tzKHhwYWQsIGRhdGEp OwogCiAJLyogdHJpZ2dlcnMgbGVmdC9yaWdodCAqLwogCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBB QlNfWiwgZGF0YVsxMF0pOwpAQCAtMzUwLDE4ICs3ODgsOSBAQAogCWlucHV0X3JlcG9ydF9rZXko ZGV2LCBCVE5fVEwsCWRhdGFbM10gJiAweDAxKTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlRO X1RSLAlkYXRhWzNdICYgMHgwMik7CiAJaW5wdXRfcmVwb3J0X2tleShkZXYsIEJUTl9NT0RFLAlk YXRhWzNdICYgMHgwNCk7Ci0KLQkvKiBsZWZ0IHN0aWNrICovCi0JaW5wdXRfcmVwb3J0X2Ficyhk ZXYsIEFCU19YLAotCQkJIChfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDYp KSk7Ci0JaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFCU19ZLAotCQkJIH4oX19zMTYpIGxlMTZfdG9f Y3B1cCgoX19sZTE2ICopKGRhdGEgKyA4KSkpOwotCi0JLyogcmlnaHQgc3RpY2sgKi8KLQlpbnB1 dF9yZXBvcnRfYWJzKGRldiwgQUJTX1JYLAotCQkJIChfX3MxNikgbGUxNl90b19jcHVwKChfX2xl MTYgKikoZGF0YSArIDEwKSkpOwotCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUlksCi0JCQkg fihfX3MxNikgbGUxNl90b19jcHVwKChfX2xlMTYgKikoZGF0YSArIDEyKSkpOworCQorCS8qIGxl ZnQgYW5kIHJpZ2h0IHN0aWNrcyAqLworCXhwYWRfcHJvY2Vzc19zdGlja3MoeHBhZCwgZGF0YSk7 CiAKIAkvKiB0cmlnZ2VycyBsZWZ0L3JpZ2h0ICovCiAJaW5wdXRfcmVwb3J0X2FicyhkZXYsIEFC U19aLCBkYXRhWzRdKTsKQEAgLTM3OSw2ICs4MDgsNyBAQAogICogQnl0ZS5CaXQKICAqIDAwLjEg LSBTdGF0dXMgY2hhbmdlOiBUaGUgY29udHJvbGxlciBvciBoZWFkc2V0IGhhcyBjb25uZWN0ZWQv ZGlzY29ubmVjdGVkCiAgKiAgICAgICAgICAgICAgICAgICAgICAgQml0cyAwMS43IGFuZCAwMS42 IGFyZSB2YWxpZAorICogMDEuZiAtIFNvbWUga2luZCBvZiB1bmlxdWUgaWRlbnRpZmllciBtZXNz YWdlIChzZWUgYWJvdmUpCiAgKiAwMS43IC0gQ29udHJvbGxlciBwcmVzZW50CiAgKiAwMS42IC0g SGVhZHNldCBwcmVzZW50CiAgKiAwMS4xIC0gUGFkIHN0YXRlIChCeXRlcyA0KykgdmFsaWQKQEAg LTM4NywyMCArODE3LDUwIEBACiAKIHN0YXRpYyB2b2lkIHhwYWQzNjB3X3Byb2Nlc3NfcGFja2V0 KHN0cnVjdCB1c2JfeHBhZCAqeHBhZCwgdTE2IGNtZCwgdW5zaWduZWQgY2hhciAqZGF0YSkKIHsK LQkvKiBQcmVzZW5jZSBjaGFuZ2UgKi8KKwlpbnQgcGFkbnVtID0gMDsKKwl1MzIgaWQ7CisJaW50 IGk7CisKKwkvKiBQcmVzZW5jZSBjaGFuZ2UgKi8JCiAJaWYgKGRhdGFbMF0gJiAweDA4KSB7CisJ CXBhZG51bSA9IHhwYWQtPmNvbnRyb2xsZXJfZGF0YS0+Y29udHJvbGxlcl9udW1iZXI7CiAJCWlm IChkYXRhWzFdICYgMHg4MCkgewotCQkJeHBhZC0+cGFkX3ByZXNlbnQgPSAxOwotCQkJdXNiX3N1 Ym1pdF91cmIoeHBhZC0+YnVsa19vdXQsIEdGUF9BVE9NSUMpOwotCQl9IGVsc2UKLQkJCXhwYWQt PnBhZF9wcmVzZW50ID0gMDsKKwkJCXByaW50ayhLRVJOX0lORk8gIldpcmVsZXNzIFhib3ggMzYw IHBhZCAjJWQgcHJlc2VudFxuIiwgcGFkbnVtKTsKKwkJCXhwYWQtPmNvbnRyb2xsZXJfZGF0YS0+ cGFkX3ByZXNlbnQgPSAxOworCQkJCisJCQlJTklUX1dPUksoJnhwYWQtPndvcmssICZ4cGFkX3dv cmtfY29udHJvbGxlcik7CisJCQlzY2hlZHVsZV93b3JrKCZ4cGFkLT53b3JrKTsKKwkJfQorCQll bHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIldpcmVsZXNzIFhib3ggMzYwIHBhZCAjJWQgZGlz Y29ubmVjdGVkXG4iLCBwYWRudW0pOworCQkJeHBhZC0+Y29udHJvbGxlcl9kYXRhLT5wYWRfcHJl c2VudCA9IDA7CisJCQl4cGFkLT5jb250cm9sbGVyX2RhdGEtPmNvbnRyb2xsZXJfdW5pcXVlX2lk WzBdID0gJ1wwJzsKKwkJCXhwYWQtPmNvbnRyb2xsZXJfZGF0YS0+Y29udHJvbGxlcl90eXBlID0g WENPTlRST0xMRVJfVFlQRV9OT05FOworCQl9CiAJfQogCi0JLyogVmFsaWQgcGFkIGRhdGEgKi8K LQlpZiAoIShkYXRhWzFdICYgMHgxKSkKLQkJcmV0dXJuOwotCi0JeHBhZDM2MF9wcm9jZXNzX3Bh Y2tldCh4cGFkLCBjbWQsICZkYXRhWzRdKTsKKwkvKiBQcm9jZXNzIHBhY2tldHMgYWNjb3JkaW5n IHRvIHR5cGUgKi8KKwlpZiAoZGF0YVsxXSA9PSAweDBmKSB7CisJCWlmICghIHhwYWQtPmNvbnRy b2xsZXJfZGF0YS0+Y29udHJvbGxlcl91bmlxdWVfaWRbMF0pIHsKKwkJCXNucHJpbnRmKHhwYWQt PmNvbnRyb2xsZXJfZGF0YS0+Y29udHJvbGxlcl91bmlxdWVfaWQsIDE3LAorCQkJCSIlMDJ4JTAy eCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisJCQkJZGF0YVs4XSwgZGF0YVs5XSwgZGF0YVsx MF0sIGRhdGFbMTFdLAorCQkJCWRhdGFbMTJdLCBkYXRhWzEzXSwgZGF0YVsxNF0sIGRhdGFbMTVd KTsKKwkJCQorCQkJLyogSWRlbnRpZnkgY29udHJvbGxlciB0eXBlICovCisJCQlpZCA9IChkYXRh WzIyXSA8PCAyNCkgKyAoZGF0YVsyM10gPDwgMTYpICsgKGRhdGFbMjRdIDw8IDgpICsgZGF0YVsy NV07CisJCQl4cGFkLT5jb250cm9sbGVyX2RhdGEtPmNvbnRyb2xsZXJfdHlwZSA9IFhDT05UUk9M TEVSX1RZUEVfT1RIRVI7CisJCQlmb3IgKGkgPSAwOyB3MzYwX2lkW2ldLmlkX2J5dGVzOyBpKysp IHsKKwkJCQlpZiAoaWQgPT0gdzM2MF9pZFtpXS5pZF9ieXRlcykgeworCQkJCQl4cGFkLT5jb250 cm9sbGVyX2RhdGEtPmNvbnRyb2xsZXJfdHlwZSA9CisJCQkJCQl3MzYwX2lkW2ldLmNvbnRyb2xs ZXJfdHlwZTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAoZGF0YVsxXSAmIDB4MSkg eworCQl4cGFkMzYwX3Byb2Nlc3NfcGFja2V0KHhwYWQsIGNtZCwgJmRhdGFbNF0pOworCX0KIH0K IAogc3RhdGljIHZvaWQgeHBhZF9pcnFfaW4oc3RydWN0IHVyYiAqdXJiKQpAQCAtNDQ1LDIzICs5 MDUsNiBAQAogCQkgICAgIF9fZnVuY19fLCByZXR2YWwpOwogfQogCi1zdGF0aWMgdm9pZCB4cGFk X2J1bGtfb3V0KHN0cnVjdCB1cmIgKnVyYikKLXsKLQlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7Ci0J Y2FzZSAwOgotCQkvKiBzdWNjZXNzICovCi0JCWJyZWFrOwotCWNhc2UgLUVDT05OUkVTRVQ6Ci0J Y2FzZSAtRU5PRU5UOgotCWNhc2UgLUVTSFVURE9XTjoKLQkJLyogdGhpcyB1cmIgaXMgdGVybWlu YXRlZCwgY2xlYW4gdXAgKi8KLQkJZGJnKCIlcyAtIHVyYiBzaHV0dGluZyBkb3duIHdpdGggc3Rh dHVzOiAlZCIsIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0J CWRiZygiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkIiwgX19mdW5jX18sIHVy Yi0+c3RhdHVzKTsKLQl9Ci19Ci0KICNpZiBkZWZpbmVkKENPTkZJR19KT1lTVElDS19YUEFEX0ZG KSB8fCBkZWZpbmVkKENPTkZJR19KT1lTVElDS19YUEFEX0xFRFMpCiBzdGF0aWMgdm9pZCB4cGFk X2lycV9vdXQoc3RydWN0IHVyYiAqdXJiKQogewpAQCAtNDk4LDcgKzk0MSw3IEBACiAJc3RydWN0 IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9pcnFfb3V0OwogCWludCBlcnJvciA9IC1FTk9N RU07CiAKLQlpZiAoeHBhZC0+eHR5cGUgIT0gWFRZUEVfWEJPWDM2MCkKKwlpZiAoKHhwYWQtPnh0 eXBlICE9IFhUWVBFX1hCT1gzNjApICYmICh4cGFkLT54dHlwZSAhPSBYVFlQRV9YQk9YMzYwVykp CiAJCXJldHVybiAwOwogCiAJeHBhZC0+b2RhdGEgPSB1c2JfYnVmZmVyX2FsbG9jKHhwYWQtPnVk ZXYsIFhQQURfUEtUX0xFTiwKQEAgLTUyOCwxMyArOTcxLDEzIEBACiAKIHN0YXRpYyB2b2lkIHhw YWRfc3RvcF9vdXRwdXQoc3RydWN0IHVzYl94cGFkICp4cGFkKQogewotCWlmICh4cGFkLT54dHlw ZSA9PSBYVFlQRV9YQk9YMzYwKQorCWlmICgoeHBhZC0+eHR5cGUgPT0gWFRZUEVfWEJPWDM2MCkg fHwgKHhwYWQtPnh0eXBlID09IFhUWVBFX1hCT1gzNjBXKSkKIAkJdXNiX2tpbGxfdXJiKHhwYWQt PmlycV9vdXQpOwogfQogCiBzdGF0aWMgdm9pZCB4cGFkX2RlaW5pdF9vdXRwdXQoc3RydWN0IHVz Yl94cGFkICp4cGFkKQogewotCWlmICh4cGFkLT54dHlwZSA9PSBYVFlQRV9YQk9YMzYwKSB7CisJ aWYgKCh4cGFkLT54dHlwZSA9PSBYVFlQRV9YQk9YMzYwKSB8fCAoeHBhZC0+eHR5cGUgPT0gWFRZ UEVfWEJPWDM2MFcpKSB7CiAJCXVzYl9mcmVlX3VyYih4cGFkLT5pcnFfb3V0KTsKIAkJdXNiX2J1 ZmZlcl9mcmVlKHhwYWQtPnVkZXYsIFhQQURfUEtUX0xFTiwKIAkJCQl4cGFkLT5vZGF0YSwgeHBh ZC0+b2RhdGFfZG1hKTsKQEAgLTU0Nyw2ICs5OTAsMTEgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09O RklHX0pPWVNUSUNLX1hQQURfRkYKKworLyogUnVtYmxlIHN1cHBvcnQgZm9yIHdpcmVsZXNzIGNv bnRyb2xsZXJzIGZvbGxvd3MgcHJvdG9jb2wgZGVzY3JpcHRpb24KKyAqIGZyb20geGJveGRydiB1 c2Vyc3BhY2UgZHJpdmVyOgorICogICAgICAgaHR0cDovL3Bpbmd1cy5zZXVsLm9yZy9+Z3J1bWJl bC94Ym94ZHJ2LworICovCiBzdGF0aWMgaW50IHhwYWRfcGxheV9lZmZlY3Qoc3RydWN0IGlucHV0 X2RldiAqZGV2LCB2b2lkICpkYXRhLAogCQkJICAgIHN0cnVjdCBmZl9lZmZlY3QgKmVmZmVjdCkK IHsKQEAgLTU1NSwxNiArMTAwMywzNSBAQAogCWlmIChlZmZlY3QtPnR5cGUgPT0gRkZfUlVNQkxF KSB7CiAJCV9fdTE2IHN0cm9uZyA9IGVmZmVjdC0+dS5ydW1ibGUuc3Ryb25nX21hZ25pdHVkZTsK IAkJX191MTYgd2VhayA9IGVmZmVjdC0+dS5ydW1ibGUud2Vha19tYWduaXR1ZGU7Ci0JCXhwYWQt Pm9kYXRhWzBdID0gMHgwMDsKLQkJeHBhZC0+b2RhdGFbMV0gPSAweDA4OwotCQl4cGFkLT5vZGF0 YVsyXSA9IDB4MDA7Ci0JCXhwYWQtPm9kYXRhWzNdID0gc3Ryb25nIC8gMjU2OwotCQl4cGFkLT5v ZGF0YVs0XSA9IHdlYWsgLyAyNTY7Ci0JCXhwYWQtPm9kYXRhWzVdID0gMHgwMDsKLQkJeHBhZC0+ b2RhdGFbNl0gPSAweDAwOwotCQl4cGFkLT5vZGF0YVs3XSA9IDB4MDA7Ci0JCXhwYWQtPmlycV9v dXQtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSA4OwotCQl1c2Jfc3VibWl0X3VyYih4cGFkLT5p cnFfb3V0LCBHRlBfS0VSTkVMKTsKKwkJbXV0ZXhfbG9jaygmeHBhZC0+b2RhdGFfbXV0ZXgpOwor CQlpZiAoeHBhZC0+eHR5cGUgPT0gWFRZUEVfWEJPWDM2MFcpIHsKKwkJCXhwYWQtPm9kYXRhWzBd ID0gMHgwMDsKKwkJCXhwYWQtPm9kYXRhWzFdID0gMHgwMTsKKwkJCXhwYWQtPm9kYXRhWzJdID0g MHgwZjsKKwkJCXhwYWQtPm9kYXRhWzNdID0gMHhjMDsKKwkJCXhwYWQtPm9kYXRhWzRdID0gMHgw MDsKKwkJCXhwYWQtPm9kYXRhWzVdID0gc3Ryb25nIC8gMjU2OworCQkJeHBhZC0+b2RhdGFbNl0g PSB3ZWFrIC8gMjU2OworCQkJeHBhZC0+b2RhdGFbN10gPSAweDAwOworCQkJeHBhZC0+b2RhdGFb OF0gPSAweDAwOworCQkJeHBhZC0+b2RhdGFbOV0gPSAweDAwOworCQkJeHBhZC0+b2RhdGFbMTBd ID0gMHgwMDsKKwkJCXhwYWQtPm9kYXRhWzExXSA9IDB4MDA7CisJCQl4cGFkLT5pcnFfb3V0LT50 cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gMTI7CisJCX0KKwkJZWxzZSB7CisJCQl4cGFkLT5vZGF0 YVswXSA9IDB4MDA7CisJCQl4cGFkLT5vZGF0YVsxXSA9IDB4MDg7CisJCQl4cGFkLT5vZGF0YVsy XSA9IDB4MDA7CisJCQl4cGFkLT5vZGF0YVszXSA9IHN0cm9uZyAvIDI1NjsKKwkJCXhwYWQtPm9k YXRhWzRdID0gd2VhayAvIDI1NjsKKwkJCXhwYWQtPm9kYXRhWzVdID0gMHgwMDsKKwkJCXhwYWQt Pm9kYXRhWzZdID0gMHgwMDsKKwkJCXhwYWQtPm9kYXRhWzddID0gMHgwMDsKKwkJCXhwYWQtPmly cV9vdXQtPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSA4OworCQl9CisJCXVzYl9zdWJtaXRfdXJi KHhwYWQtPmlycV9vdXQsIEdGUF9BVE9NSUMpOworCQltdXRleF91bmxvY2soJnhwYWQtPm9kYXRh X211dGV4KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTU3Miw3ICsxMDM5LDcgQEAKIAogc3RhdGlj IGludCB4cGFkX2luaXRfZmYoc3RydWN0IHVzYl94cGFkICp4cGFkKQogewotCWlmICh4cGFkLT54 dHlwZSAhPSBYVFlQRV9YQk9YMzYwKQorCWlmICgoeHBhZC0+eHR5cGUgIT0gWFRZUEVfWEJPWDM2 MCkgJiYgKHhwYWQtPnh0eXBlICE9IFhUWVBFX1hCT1gzNjBXKSkKIAkJcmV0dXJuIDA7CiAKIAlp bnB1dF9zZXRfY2FwYWJpbGl0eSh4cGFkLT5kZXYsIEVWX0ZGLCBGRl9SVU1CTEUpOwpAQCAtNTkz LDE1ICsxMDYwLDM2IEBACiAJc3RydWN0IHVzYl94cGFkICp4cGFkOwogfTsKIAorLyogWEJveCAz NjAgd2lyZWxlc3MgY29udHJvbGxlciBmb2xsb3dzIHByb3RvY29sIGZyb20geGJveGRydiB1c2Vy c3BhY2UKKyAqIGRyaXZlcjoKKyAqICAgIGh0dHA6Ly9waW5ndXMuc2V1bC5vcmcvfmdydW1iZWwv eGJveGRydi8KKyAqLwogc3RhdGljIHZvaWQgeHBhZF9zZW5kX2xlZF9jb21tYW5kKHN0cnVjdCB1 c2JfeHBhZCAqeHBhZCwgaW50IGNvbW1hbmQpCiB7CiAJaWYgKGNvbW1hbmQgPj0gMCAmJiBjb21t YW5kIDwgMTQpIHsKIAkJbXV0ZXhfbG9jaygmeHBhZC0+b2RhdGFfbXV0ZXgpOwotCQl4cGFkLT5v ZGF0YVswXSA9IDB4MDE7Ci0JCXhwYWQtPm9kYXRhWzFdID0gMHgwMzsKLQkJeHBhZC0+b2RhdGFb Ml0gPSBjb21tYW5kOwotCQl4cGFkLT5pcnFfb3V0LT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0g MzsKLQkJdXNiX3N1Ym1pdF91cmIoeHBhZC0+aXJxX291dCwgR0ZQX0tFUk5FTCk7CisJCWlmICh4 cGFkLT54dHlwZSA9PSBYVFlQRV9YQk9YMzYwVykgeworCQkJeHBhZC0+b2RhdGFbMF0gPSAweDAw OworCQkJeHBhZC0+b2RhdGFbMV0gPSAweDAwOworCQkJeHBhZC0+b2RhdGFbMl0gPSAweDA4Owor CQkJeHBhZC0+b2RhdGFbM10gPSAweDQwICsgKGNvbW1hbmQgJSAweDBlKTsKKwkJCXhwYWQtPm9k YXRhWzRdID0gMHgwMDsKKwkJCXhwYWQtPm9kYXRhWzVdID0gMHgwMDsKKwkJCXhwYWQtPm9kYXRh WzZdID0gMHgwMDsKKwkJCXhwYWQtPm9kYXRhWzddID0gMHgwMDsKKwkJCXhwYWQtPm9kYXRhWzhd ID0gMHgwMDsKKwkJCXhwYWQtPm9kYXRhWzldID0gMHgwMDsKKwkJCXhwYWQtPm9kYXRhWzEwXSA9 IDB4MDA7CisJCQl4cGFkLT5vZGF0YVsxMV0gPSAweDAwOworCQkJeHBhZC0+aXJxX291dC0+dHJh bnNmZXJfYnVmZmVyX2xlbmd0aCA9IDEyOworCQl9CisJCWVsc2UgeworCQkJeHBhZC0+b2RhdGFb MF0gPSAweDAxOworCQkJeHBhZC0+b2RhdGFbMV0gPSAweDAzOworCQkJeHBhZC0+b2RhdGFbMl0g PSBjb21tYW5kOworCQkJeHBhZC0+aXJxX291dC0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IDM7 CisJCX0KKwkJdXNiX3N1Ym1pdF91cmIoeHBhZC0+aXJxX291dCwgR0ZQX0FUT01JQyk7CiAJCW11 dGV4X3VubG9jaygmeHBhZC0+b2RhdGFfbXV0ZXgpOwogCX0KIH0KQEAgLTYxNSw2ICsxMTAzLDcg QEAKIAl4cGFkX3NlbmRfbGVkX2NvbW1hbmQoeHBhZF9sZWQtPnhwYWQsIHZhbHVlKTsKIH0KIAor CiBzdGF0aWMgaW50IHhwYWRfbGVkX3Byb2JlKHN0cnVjdCB1c2JfeHBhZCAqeHBhZCkKIHsKIAlz dGF0aWMgYXRvbWljX3QgbGVkX3NlcQk9IEFUT01JQ19JTklUKDApOwpAQCAtNjIzLDcgKzExMTIs NyBAQAogCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2OwogCWludCBlcnJvcjsKIAotCWlm ICh4cGFkLT54dHlwZSAhPSBYVFlQRV9YQk9YMzYwKQorCWlmICgoeHBhZC0+eHR5cGUgIT0gWFRZ UEVfWEJPWDM2MCkgJiYgKHhwYWQtPnh0eXBlICE9IFhUWVBFX1hCT1gzNjBXKSkKIAkJcmV0dXJu IDA7CiAKIAl4cGFkLT5sZWQgPSBsZWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgeHBhZF9sZWQp LCBHRlBfS0VSTkVMKTsKQEAgLTcyMSw2ICsxMjEwLDcgQEAKIAlzdHJ1Y3QgdXNiX3hwYWQgKnhw YWQ7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OwogCXN0cnVjdCB1c2JfZW5kcG9pbnRf ZGVzY3JpcHRvciAqZXBfaXJxX2luOworCWludCBjb250cm9sbGVyX3R5cGU7CiAJaW50IGk7CiAJ aW50IGVycm9yID0gLUVOT01FTTsKIApAQCAtNzQ3LDYgKzEyMzcsNyBAQAogCXhwYWQtPnVkZXYg PSB1ZGV2OwogCXhwYWQtPmRwYWRfbWFwcGluZyA9IHhwYWRfZGV2aWNlW2ldLmRwYWRfbWFwcGlu ZzsKIAl4cGFkLT54dHlwZSA9IHhwYWRfZGV2aWNlW2ldLnh0eXBlOworCWNvbnRyb2xsZXJfdHlw ZSA9IHhwYWRfZGV2aWNlW2ldLmNvbnRyb2xsZXJfdHlwZTsKIAlpZiAoeHBhZC0+ZHBhZF9tYXBw aW5nID09IE1BUF9EUEFEX1VOS05PV04pCiAJCXhwYWQtPmRwYWRfbWFwcGluZyA9ICFkcGFkX3Rv X2J1dHRvbnM7CiAJaWYgKHhwYWQtPnh0eXBlID09IFhUWVBFX1VOS05PV04pIHsKQEAgLTgxOSw2 ICsxMzEwLDIyIEBACiAJCWdvdG8gZmFpbDQ7CiAKIAl1c2Jfc2V0X2ludGZkYXRhKGludGYsIHhw YWQpOworCQorCS8qIFNldCB1cCBkYXRhIG9iamVjdCAqLworCWlmICghKCZpbnB1dF9kZXYtPmRl di5rb2JqKSkgeworCQllcnJvciA9IDk5OworCQlnb3RvIGZhaWw1OworCX0KKwl4cGFkLT5jb250 cm9sbGVyX2RhdGEgPSB4cGFkX2NyZWF0ZV9kYXRhKCJ4cGFkIiwgJmlucHV0X2Rldi0+ZGV2Lmtv YmopOworCWlmICgheHBhZC0+Y29udHJvbGxlcl9kYXRhKSB7CisJCWVycm9yID0gMTAwOworCQln b3RvIGZhaWw1OworCX0KKwkKKwkvKiBTZXQgZGVmYXVsdHMgY29tbW9uIHRvIGFsbCBjb250cm9s bGVyIHR5cGVzICovCisJeHBhZC0+Y29udHJvbGxlcl9kYXRhLT5jb250cm9sbGVyX3R5cGUgPSBj b250cm9sbGVyX3R5cGU7CisJeHBhZC0+Y29udHJvbGxlcl9kYXRhLT5kZWFkX3pvbmUgPSBYREVB RF9aT05FX0RFRkFVTFQ7CisJeHBhZC0+Y29udHJvbGxlcl9kYXRhLT5zcXVhcmVfYXhpcyA9IFhT UVVBUkVfQVhJU19ERUZBVUxUOwogCiAJLyoKIAkgKiBTdWJtaXQgdGhlIGludCBVUkIgaW1tZWRp YXRseSByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciBvcGVuCkBAIC04MjgsNDggKzEzMzUsMjYgQEAK IAkgKiB3ZSdyZSB3YWl0aW5nIGZvci4KIAkgKi8KIAlpZiAoeHBhZC0+eHR5cGUgPT0gWFRZUEVf WEJPWDM2MFcpIHsKKwkJeHBhZC0+Y29udHJvbGxlcl9kYXRhLT5wYWRfcHJlc2VudCA9IDA7CisJ CXhwYWQtPmNvbnRyb2xsZXJfZGF0YS0+Y29udHJvbGxlcl91bmlxdWVfaWRbMF0gPSAnXDAnOwor CQl4cGFkLT5jb250cm9sbGVyX2RhdGEtPmNvbnRyb2xsZXJfbnVtYmVyID0KKwkJCShpbnRmLT5j dXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyIC8gMikgKyAxOwogCQl4cGFkLT5p cnFfaW4tPmRldiA9IHhwYWQtPnVkZXY7CiAJCWVycm9yID0gdXNiX3N1Ym1pdF91cmIoeHBhZC0+ aXJxX2luLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGVycm9yKQotCQkJZ290byBmYWlsNDsKLQotCQkv KgotCQkgKiBTZXR1cCB0aGUgbWVzc2FnZSB0byBzZXQgdGhlIExFRHMgb24gdGhlCi0JCSAqIGNv bnRyb2xsZXIgd2hlbiBpdCBzaG93cyB1cAotCQkgKi8KLQkJeHBhZC0+YnVsa19vdXQgPSB1c2Jf YWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOwotCQlpZigheHBhZC0+YnVsa19vdXQpCiAJCQlnb3Rv IGZhaWw1OwotCi0JCXhwYWQtPmJkYXRhID0ga3phbGxvYyhYUEFEX1BLVF9MRU4sIEdGUF9LRVJO RUwpOwotCQlpZigheHBhZC0+YmRhdGEpCi0JCQlnb3RvIGZhaWw2OwotCi0JCXhwYWQtPmJkYXRh WzJdID0gMHgwODsKLQkJc3dpdGNoIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJm YWNlTnVtYmVyKSB7Ci0JCWNhc2UgMDoKLQkJCXhwYWQtPmJkYXRhWzNdID0gMHg0MjsKLQkJCWJy ZWFrOwotCQljYXNlIDI6Ci0JCQl4cGFkLT5iZGF0YVszXSA9IDB4NDM7Ci0JCQlicmVhazsKLQkJ Y2FzZSA0OgotCQkJeHBhZC0+YmRhdGFbM10gPSAweDQ0OwotCQkJYnJlYWs7Ci0JCWNhc2UgNjoK LQkJCXhwYWQtPmJkYXRhWzNdID0gMHg0NTsKLQkJfQotCi0JCWVwX2lycV9pbiA9ICZpbnRmLT5j dXJfYWx0c2V0dGluZy0+ZW5kcG9pbnRbMV0uZGVzYzsKLQkJdXNiX2ZpbGxfYnVsa191cmIoeHBh ZC0+YnVsa19vdXQsIHVkZXYsCi0JCQkJdXNiX3NuZGJ1bGtwaXBlKHVkZXYsIGVwX2lycV9pbi0+ YkVuZHBvaW50QWRkcmVzcyksCi0JCQkJeHBhZC0+YmRhdGEsIFhQQURfUEtUX0xFTiwgeHBhZF9i dWxrX291dCwgeHBhZCk7CisJfQorCWVsc2UgeworCQl4cGFkLT5jb250cm9sbGVyX2RhdGEtPnBh ZF9wcmVzZW50ID0gMTsKKwkJc3RybmNweSh4cGFkLT5jb250cm9sbGVyX2RhdGEtPmNvbnRyb2xs ZXJfdW5pcXVlX2lkLCAid2lyZWQiLCAxNyk7CisJCXhwYWQtPmNvbnRyb2xsZXJfZGF0YS0+Y29u dHJvbGxlcl9udW1iZXIgPSAwOwogCX0KIAogCXJldHVybiAwOwogCi0gZmFpbDY6CXVzYl9mcmVl X3VyYih4cGFkLT5idWxrX291dCk7Ci0gZmFpbDU6CXVzYl9raWxsX3VyYih4cGFkLT5pcnFfaW4p OworIGZhaWw1OiB1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOworIAlpbnB1dF91bnJlZ2lz dGVyX2RldmljZSh4cGFkLT5kZXYpOworIAl4cGFkX2xlZF9kaXNjb25uZWN0KHhwYWQpOwogIGZh aWw0Ogl1c2JfZnJlZV91cmIoeHBhZC0+aXJxX2luKTsKICBmYWlsMzoJeHBhZF9kZWluaXRfb3V0 cHV0KHhwYWQpOwogIGZhaWwyOgl1c2JfYnVmZmVyX2ZyZWUodWRldiwgWFBBRF9QS1RfTEVOLCB4 cGFkLT5pZGF0YSwgeHBhZC0+aWRhdGFfZG1hKTsKQEAgLTg4NSwxNyArMTM3MCwxNyBAQAogCiAJ dXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlpZiAoeHBhZCkgeworCQl4cGFkX2Rlc3Ry b3lfZGF0YSh4cGFkLT5jb250cm9sbGVyX2RhdGEpOwogCQl4cGFkX2xlZF9kaXNjb25uZWN0KHhw YWQpOwogCQlpbnB1dF91bnJlZ2lzdGVyX2RldmljZSh4cGFkLT5kZXYpOwogCQl4cGFkX2RlaW5p dF9vdXRwdXQoeHBhZCk7CiAJCWlmICh4cGFkLT54dHlwZSA9PSBYVFlQRV9YQk9YMzYwVykgewot CQkJdXNiX2tpbGxfdXJiKHhwYWQtPmJ1bGtfb3V0KTsKLQkJCXVzYl9mcmVlX3VyYih4cGFkLT5i dWxrX291dCk7CiAJCQl1c2Jfa2lsbF91cmIoeHBhZC0+aXJxX2luKTsKIAkJfQogCQl1c2JfZnJl ZV91cmIoeHBhZC0+aXJxX2luKTsKIAkJdXNiX2J1ZmZlcl9mcmVlKHhwYWQtPnVkZXYsIFhQQURf UEtUX0xFTiwKIAkJCQl4cGFkLT5pZGF0YSwgeHBhZC0+aWRhdGFfZG1hKTsKKwkJaW5wdXRfZnJl ZV9kZXZpY2UoeHBhZC0+ZGV2KTsKIAkJa2ZyZWUoeHBhZCk7CiAJfQogfQo= --0016e6470ef80222c90462ed3ad8--