From owner-freebsd-wireless@FreeBSD.ORG Sat Sep 14 03:52:28 2013 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id 490FAAD3; Sat, 14 Sep 2013 03:52:28 +0000 (UTC) (envelope-from qinchenchong@gmail.com) Received: from mail-vc0-x22e.google.com (mail-vc0-x22e.google.com [IPv6:2607:f8b0:400c:c03::22e]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id A40192E8C; Sat, 14 Sep 2013 03:52:27 +0000 (UTC) Received: by mail-vc0-f174.google.com with SMTP id gd11so1557287vcb.19 for ; Fri, 13 Sep 2013 20:52:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=5Klv4ugY1tdQsysl54F8VpO1bcaTj7U/8arApj5Wqwc=; b=Fvyis86Z39KUov4tOsCFtSYLN5hG9J2Le+ya/j4/DObYLMROhIvBmH1ajYgC/I2Dxl y1c4hBuIxsmxhnora9mZ4a1fIXVZVAkcjYFJyf1RpA3fSliJd5JKG6M0scm/dx4gMY8u zaosIRh/K0r1ZuG0VwQ6p/a0AjbzKHH8J/4TysrMuh8XDMVl4zo0KxD0OApUFEPzc1cx 2Ar7sZ0CNtceckcQmoIDusUfER75NsBwnmAo15fFNqwazIgU2qQCy4tJ4cZ+u705C5+Z 1UNqt6wnhraPUllB7+n3MDIIkGQ9/MDiQ+MdDKMz4wpspbo76ojyhKr836WGoYUi8kgG 7hHA== MIME-Version: 1.0 X-Received: by 10.52.34.40 with SMTP id w8mr12831376vdi.7.1379130746637; Fri, 13 Sep 2013 20:52:26 -0700 (PDT) Received: by 10.220.182.68 with HTTP; Fri, 13 Sep 2013 20:52:26 -0700 (PDT) In-Reply-To: References: Date: Sat, 14 Sep 2013 11:52:26 +0800 Message-ID: Subject: Re: Chenchong's work on net80211_ratectl From: Chenchong Qin To: Adrian Chadd Content-Type: multipart/mixed; boundary=20cf307cfec04094f304e64fe611 X-Content-Filtered-By: Mailman/MimeDel 2.1.14 Cc: "freebsd-wireless@freebsd.org" X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 14 Sep 2013 03:52:28 -0000 --20cf307cfec04094f304e64fe611 Content-Type: text/plain; charset=ISO-8859-1 Hi, Here is latest update. Per-device ratectl statistics is implemented in ath and attached when ath is attaching. Thanks! Chenchong On Sat, Sep 14, 2013 at 3:37 AM, Adrian Chadd wrote: > Sweet, thanks! > > > > -adrian > > > > On 13 September 2013 09:11, Chenchong Qin wrote: > >> Hi! >> >> Here is some updates. >> >> Another member is added to ieee80211_rc_info to record value of the >> maximum aggregate size. Then, in aggregation scenario, ratectl algo can >> inform aggregation selection code of proper maximum aggregate size. >> >> Per-vap ratectl statistics is exported through sysctl. When >> ieee80211_ratectl_init() is called, this statistics api is attached. It's >> convenient to implement the per-device api -- just traverse the vap list >> and call per-vap api for each vap. But, we know that ratectl of net80211 >> provides service to vap-granularity object, not to device directly. So, is >> it more suitable to implement the per-device api in device driver (i.e. >> attach per-device api when attaching the device)? >> >> Code will be posted later. >> >> Thanks! >> >> Chenchong >> >> >> On Thu, Sep 12, 2013 at 2:05 AM, Adrian Chadd wrote: >> >>> Hi, >>> >>> For now, yes, you have to assume that you won't always get a response >>> for a rate lookup. The buffer may be sent with NOACK set, it may be deleted >>> during a channel change or scan, etc. >>> >>> And yes - the rate control lookup stuff for aggregate frames is a bit >>> messy. It would be nice for the rate control code to return the rate _and_ >>> the maximum aggregate size, in case the aggregation selection wants to cap >>> how long frames are at the given choice. >>> >>> >>> >>> -adrian >>> >>> >>> >>> On 11 September 2013 10:29, Chenchong Qin wrote: >>> >>>> Hi! >>>> >>>> I've added some aggregation support here! >>>> >>>> At first I intend to pass subframe informations(nframes, per-subframe >>>> length etc.) >>>> to the ratectl api. But it seems to be a paradox that rate lookup must >>>> be performed >>>> before the ampdu is formed (aggregation limit based on the rate control >>>> decision >>>> is need) and subframe informations can be obtain only after the ampdu >>>> is formed. >>>> So, I add a new ieee80211_rc_info flag to ieee80211_ratectl to let it >>>> distinguish >>>> aggregation and non-aggregation scenarios. If rate lookup is called in >>>> an aggregation >>>> scenario, this flag is set. Then, ratectl algo knows that it's now >>>> finding rates for an >>>> ampdu and the framelen which records len of the first frame can be >>>> ignored. When >>>> it comes to complete period, tx status that shows number of subframes >>>> been sent >>>> and number of subframes been successfully received is passed to the >>>> ratectl api. >>>> >>>> I also get a question here - whether one tx that doesn't perform rate >>>> lookup will call >>>> the complete procedure? >>>> >>>> Thanks! >>>> >>>> Chenchong >>>> >>>> >>>> On Sun, Sep 8, 2013 at 11:18 PM, Chenchong Qin wrote: >>>> >>>>> Hi! >>>>> >>>>> I've added the common ratectl state as an mbuf tag! >>>>> >>>>> After days of frustration (compile errors, boot failed, kernel panics, >>>>> suddenly kernel freezing...), it seems that ath now can use 11n-aware >>>>> net80211 ratectl api to do rate control. Attachment[0] is the diff of >>>>> modifications to dev/ath. Changes to net80211 is minor this time. Just add >>>>> some debug msgs to it. Please reference my gsoc svn repo >>>>> . >>>>> >>>>> It's worth mentioning that sometimes the kernel will "freezing" (it >>>>> looks like all things stop working, screen is freezing, keyboard and mouse >>>>> are not responding) after wireless stuff start working for a while. At >>>>> first, I consider it caused by my modification to ath. But this strange >>>>> thing can also happen in a head kernel (r255382). Attachment[1] is some >>>>> useful messages just before it happens. By the way, I use a AR9227 device. >>>>> >>>>> And, I found that, for aggregation scenario, ath gathers tx >>>>> information and update the ratectl states. So, what we can do to net80211 >>>>> to let it support aggregation? >>>>> >>>>> Thanks! >>>>> >>>>> Chenchong >>>>> >>>>> >>>>> On Tue, Sep 3, 2013 at 9:29 AM, Chenchong Qin wrote: >>>>> >>>>>> OK! >>>>>> >>>>>> Thanks! :-) >>>>>> >>>>>> Chenchong >>>>>> >>>>>> >>>>>> On Tue, Sep 3, 2013 at 1:56 AM, Adrian Chadd wrote: >>>>>> >>>>>>> Hi! >>>>>>> >>>>>>> You can declare an mbuf tag and use that. Look at M_TXCB in net80211 >>>>>>> and how mbuf tags are added. >>>>>>> >>>>>>> I've long thought about adding a net80211 mbuf tag to represent >>>>>>> -all- of the tx related state - TX callback, rate control, rate completion, >>>>>>> aggregation state, retry count, etc. That way all the drivers can use it. >>>>>>> >>>>>>> >>>>>>> >>>>>>> -adrian >>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> > --20cf307cfec04094f304e64fe611 Content-Type: application/octet-stream; name="20130914-net80211-ratectl-ath.diff" Content-Disposition: attachment; filename="20130914-net80211-ratectl-ath.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hlkaqstj0 SW5kZXg6IGRldi9yYWwvcnQyODYwLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZGV2L3JhbC9ydDI4NjAuYwko cmV2aXNpb24gMjU0ODI2KQorKysgZGV2L3JhbC9ydDI4NjAuYwkod29ya2luZyBjb3B5KQpAQCAt NDg0LDcgKzQ4NCw4IEBACiAJLyogSFcgc3VwcG9ydHMgdXAgdG8gMjU1IFNUQXMgKDAtMjU0KSBp biBIb3N0QVAgYW5kIElCU1MgbW9kZXMgKi8KIAl2YXAtPml2X21heF9haWQgPSBtaW4oSUVFRTgw MjExX0FJRF9NQVgsIFJUMjg2MF9XQ0lEX01BWCk7CiAKLQlpZWVlODAyMTFfcmF0ZWN0bF9pbml0 KHZhcCk7CisJLyogWFhYIFRPRE8gZmlsbCB0aGUgY2FwICovCisJaWVlZTgwMjExX3JhdGVjdGxf aW5pdCh2YXAsIDApOwogCS8qIGNvbXBsZXRlIHNldHVwICovCiAJaWVlZTgwMjExX3ZhcF9hdHRh Y2godmFwLCBpZWVlODAyMTFfbWVkaWFfY2hhbmdlLCBpZWVlODAyMTFfbWVkaWFfc3RhdHVzKTsK IAlpZiAoVEFJTFFfRklSU1QoJmljLT5pY192YXBzKSA9PSB2YXApCkBAIC0xMTIxLDExICsxMTIy LDE3IEBACiAJCQkJcmV0cnljbnQgPSAxOwogCQkJZWxzZQogCQkJCXJldHJ5Y250ID0gMDsKKwkJ CWllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKG5pLT5uaV92YXAsIG5pLCBOVUxMKTsgLyog anVzdCBtYWtlIGl0IGNvbXBpbGVkLiBxY2MgKi8KKyNpZiAwCiAJCQlpZWVlODAyMTFfcmF0ZWN0 bF90eF9jb21wbGV0ZShuaS0+bmlfdmFwLCBuaSwKIAkJCSAgICBJRUVFODAyMTFfUkFURUNUTF9U WF9TVUNDRVNTLCAmcmV0cnljbnQsIE5VTEwpOworI2VuZGlmCiAJCX0gZWxzZSB7CisJCQlpZWVl ODAyMTFfcmF0ZWN0bF90eF9jb21wbGV0ZShuaS0+bmlfdmFwLCBuaSwgTlVMTCk7IC8qIGp1c3Qg bWFrZSBpdCBjb21waWxlZC4gcWNjICovCisjaWYgMAogCQkJaWVlZTgwMjExX3JhdGVjdGxfdHhf Y29tcGxldGUobmktPm5pX3ZhcCwgbmksCiAJCQkgICAgSUVFRTgwMjExX1JBVEVDVExfVFhfRkFJ TFVSRSwgJnJldHJ5Y250LCBOVUxMKTsKKyNlbmRpZgogCQkJaWZwLT5pZl9vZXJyb3JzKys7CiAJ CX0KIAl9CkluZGV4OiBkZXYvcmFsL3J0MjU2MC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRldi9yYWwvcnQy NTYwLmMJKHJldmlzaW9uIDI1NDgyNikKKysrIGRldi9yYWwvcnQyNTYwLmMJKHdvcmtpbmcgY29w eSkKQEAgLTQyNiw3ICs0MjYsOCBAQAogCXZhcC0+aXZfbmV3c3RhdGUgPSBydDI1NjBfbmV3c3Rh dGU7CiAJdmFwLT5pdl91cGRhdGVfYmVhY29uID0gcnQyNTYwX2JlYWNvbl91cGRhdGU7CiAKLQlp ZWVlODAyMTFfcmF0ZWN0bF9pbml0KHZhcCk7CisJLyogWFhYIFRPRE8gZmlsbCB0aGUgY2FwICov CisJaWVlZTgwMjExX3JhdGVjdGxfaW5pdCh2YXAsIDApOwogCS8qIGNvbXBsZXRlIHNldHVwICov CiAJaWVlZTgwMjExX3ZhcF9hdHRhY2godmFwLCBpZWVlODAyMTFfbWVkaWFfY2hhbmdlLCBpZWVl ODAyMTFfbWVkaWFfc3RhdHVzKTsKIAlpZiAoVEFJTFFfRklSU1QoJmljLT5pY192YXBzKSA9PSB2 YXApCkBAIC05NTUsOSArOTU2LDEzIEBACiAKIAkJCURQUklOVEZOKHNjLCAxMCwgIiVzXG4iLCAi ZGF0YSBmcmFtZSBzZW50IHN1Y2Nlc3NmdWxseSIpOwogCQkJaWYgKGRhdGEtPnJpeCAhPSBJRUVF ODAyMTFfRklYRURfUkFURV9OT05FKQorCQkJCWllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRl KHZhcCwgbmksIE5VTEwpOyAvKiBqdXN0IG1ha2UgaXQgY29tcGlsZWQuIHFjYyAqLworI2lmIDAK IAkJCQlpZWVlODAyMTFfcmF0ZWN0bF90eF9jb21wbGV0ZSh2YXAsIG5pLAogCQkJCSAgICBJRUVF ODAyMTFfUkFURUNUTF9UWF9TVUNDRVNTLAogCQkJCSAgICAmcmV0cnljbnQsIE5VTEwpOworI2Vu ZGlmCisKIAkJCWlmcC0+aWZfb3BhY2tldHMrKzsKIAkJCWJyZWFrOwogCkBAIC05NjcsOSArOTcy LDEyIEBACiAJCQlEUFJJTlRGTihzYywgOSwgImRhdGEgZnJhbWUgc2VudCBhZnRlciAldSByZXRy aWVzXG4iLAogCQkJICAgIHJldHJ5Y250KTsKIAkJCWlmIChkYXRhLT5yaXggIT0gSUVFRTgwMjEx X0ZJWEVEX1JBVEVfTk9ORSkKKwkJCQlpZWVlODAyMTFfcmF0ZWN0bF90eF9jb21wbGV0ZSh2YXAs IG5pLCBOVUxMKTsgLyoganVzdCBtYWtlIGl0IGNvbXBpbGVkLiBxY2MgKi8KKyNpZiAwCiAJCQkJ aWVlZTgwMjExX3JhdGVjdGxfdHhfY29tcGxldGUodmFwLCBuaSwKIAkJCQkgICAgSUVFRTgwMjEx X1JBVEVDVExfVFhfU1VDQ0VTUywKIAkJCQkgICAgJnJldHJ5Y250LCBOVUxMKTsKKyNlbmRpZgog CQkJaWZwLT5pZl9vcGFja2V0cysrOwogCQkJYnJlYWs7CiAKQEAgLTk3OSw5ICs5ODcsMTIgQEAK IAkJCURQUklOVEZOKHNjLCA5LCAiZGF0YSBmcmFtZSBmYWlsZWQgYWZ0ZXIgJWQgcmV0cmllc1xu IiwKIAkJCSAgICByZXRyeWNudCk7CiAJCQlpZiAoZGF0YS0+cml4ICE9IElFRUU4MDIxMV9GSVhF RF9SQVRFX05PTkUpCisJCQkJaWVlZTgwMjExX3JhdGVjdGxfdHhfY29tcGxldGUodmFwLCBuaSwg TlVMTCk7IC8qIGp1c3QgbWFrZSBpdCBjb21waWxlZC4gcWNjICovCisjaWYgMAogCQkJCWllZWU4 MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKHZhcCwgbmksCiAJCQkJICAgIElFRUU4MDIxMV9SQVRF Q1RMX1RYX0ZBSUxVUkUsCiAJCQkJICAgICZyZXRyeWNudCwgTlVMTCk7CisjZW5kaWYKIAkJCWlm cC0+aWZfb2Vycm9ycysrOwogCQkJYnJlYWs7CiAKSW5kZXg6IGRldi9yYWwvcnQyNjYxLmMKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gZGV2L3JhbC9ydDI2NjEuYwkocmV2aXNpb24gMjU0ODI2KQorKysgZGV2L3Jh bC9ydDI2NjEuYwkod29ya2luZyBjb3B5KQpAQCAtNDIzLDcgKzQyMyw4IEBACiAJdmFwLT5pdl91 cGRhdGVfYmVhY29uID0gcnQyNjYxX2JlYWNvbl91cGRhdGU7CiAjZW5kaWYKIAotCWllZWU4MDIx MV9yYXRlY3RsX2luaXQodmFwKTsKKwkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgKi8KKwlpZWVl ODAyMTFfcmF0ZWN0bF9pbml0KHZhcCwgMCk7CiAJLyogY29tcGxldGUgc2V0dXAgKi8KIAlpZWVl ODAyMTFfdmFwX2F0dGFjaCh2YXAsIGllZWU4MDIxMV9tZWRpYV9jaGFuZ2UsIGllZWU4MDIxMV9t ZWRpYV9zdGF0dXMpOwogCWlmIChUQUlMUV9GSVJTVCgmaWMtPmljX3ZhcHMpID09IHZhcCkKQEAg LTkwNSw5ICs5MDYsMTIgQEAKIAkJCURQUklOVEZOKHNjLCAxMCwgImRhdGEgZnJhbWUgc2VudCBz dWNjZXNzZnVsbHkgYWZ0ZXIgIgogCQkJICAgICIlZCByZXRyaWVzXG4iLCByZXRyeWNudCk7CiAJ CQlpZiAoZGF0YS0+cml4ICE9IElFRUU4MDIxMV9GSVhFRF9SQVRFX05PTkUpCisJCQkJaWVlZTgw MjExX3JhdGVjdGxfdHhfY29tcGxldGUodmFwLCBuaSwgTlVMTCk7IC8qIGp1c3QgbWFrZSBpdCBj b21waWxlZC4gcWNjICovCisjaWYgMAogCQkJCWllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRl KHZhcCwgbmksCiAJCQkJICAgIElFRUU4MDIxMV9SQVRFQ1RMX1RYX1NVQ0NFU1MsCiAJCQkJICAg ICZyZXRyeWNudCwgTlVMTCk7CisjZW5kaWYKIAkJCWlmcC0+aWZfb3BhY2tldHMrKzsKIAkJCWJy ZWFrOwogCkBAIC05MTcsOSArOTIxLDEyIEBACiAJCQlEUFJJTlRGTihzYywgOSwgIiVzXG4iLAog CQkJICAgICJzZW5kaW5nIGRhdGEgZnJhbWUgZmFpbGVkICh0b28gbXVjaCByZXRyaWVzKSIpOwog CQkJaWYgKGRhdGEtPnJpeCAhPSBJRUVFODAyMTFfRklYRURfUkFURV9OT05FKQorCQkJCWllZWU4 MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKHZhcCwgbmksIE5VTEwpOyAvKiBqdXN0IG1ha2UgaXQg Y29tcGlsZWQuIHFjYyAqLworI2lmIDAKIAkJCQlpZWVlODAyMTFfcmF0ZWN0bF90eF9jb21wbGV0 ZSh2YXAsIG5pLAogCQkJCSAgICBJRUVFODAyMTFfUkFURUNUTF9UWF9GQUlMVVJFLAogCQkJCSAg ICAmcmV0cnljbnQsIE5VTEwpOworI2VuZGlmCiAJCQlpZnAtPmlmX29lcnJvcnMrKzsKIAkJCWJy ZWFrOwogCkluZGV4OiBkZXYvYXRoL2lmX2F0aF90eF9odC5jCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRldi9h dGgvaWZfYXRoX3R4X2h0LmMJKHJldmlzaW9uIDI1NDgyNikKKysrIGRldi9hdGgvaWZfYXRoX3R4 X2h0LmMJKHdvcmtpbmcgY29weSkKQEAgLTY0LDYgKzY0LDggQEAKIAogI2luY2x1ZGUgPG5ldDgw MjExL2llZWU4MDIxMV92YXIuaD4KICNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfcmVnZG9t YWluLmg+CisKKyNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5oPgogI2lmZGVm IElFRUU4MDIxMV9TVVBQT1JUX1NVUEVSRwogI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9z dXBlcmcuaD4KICNlbmRpZgpAQCAtMjIxLDEzICsyMjMsNDcgQEAKIHZvaWQKIGF0aF90eF9yYXRl X2ZpbGxfcmNmbGFncyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9idWYgKmJmKQog ewotCXN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkgPSBiZi0+YmZfbm9kZTsKLQlzdHJ1Y3QgaWVl ZTgwMjExY29tICppYyA9IG5pLT5uaV9pYzsKKwkvLyBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5p ID0gYmYtPmJmX25vZGU7CisJLy8gc3RydWN0IGllZWU4MDIxMWNvbSAqaWMgPSBuaS0+bmlfaWM7 CiAJY29uc3QgSEFMX1JBVEVfVEFCTEUgKnJ0ID0gc2MtPnNjX2N1cnJhdGVzOwotCXN0cnVjdCBh dGhfcmNfc2VyaWVzICpyYyA9IGJmLT5iZl9zdGF0ZS5iZnNfcmM7CisJc3RydWN0IGF0aF9yY19z ZXJpZXMgKmF0aF9yYyA9IGJmLT5iZl9zdGF0ZS5iZnNfcmM7CisJc3RydWN0IGllZWU4MDIxMV9y Y19pbmZvICpyY19pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JjX3NlcmllcyAqcmMg PSBOVUxMOworCXN0cnVjdCBtX3RhZyAqbXRhZzsKIAl1aW50OF90IHJhdGU7CiAJaW50IGk7CiAK KwltdGFnID0gbV90YWdfbG9jYXRlKGJmLT5iZl9tLCBNVEFHX0FCSV9ORVQ4MDIxMSwgCisJCQlO RVQ4MDIxMV9UQUdfUkFURUNUTCwgTlVMTCk7CisJaWYgKE5VTEwgPT0gbXRhZykKKwkJcmV0dXJu OworCisJcmNfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8qKShtdGFnICsgMSk7CisJ cmMgPSByY19pbmZvLT5pcmlfcmM7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX1JBVEVD VExfTlVNOyBpKyspIHsKKwkJaWYgKHJjW2ldLnRyaWVzID09IDApCisJCQljb250aW51ZTsKKwor CQlyYXRlID0gcnQtPmluZm9bcmNbaV0ucml4XS5yYXRlQ29kZTsKKwkJaWYgKHJjW2ldLmZsYWdz ICYgSUVFRTgwMjExX1JBVEVDVExfRkxBR19TUCkKKwkJCXJhdGUgfD0gcnQtPmluZm9bcmNbaV0u cml4XS5zaG9ydFByZWFtYmxlOworCisJCXJjW2ldLnJhdGVjb2RlID0gcmF0ZTsKKworCQlhdGhf cmNbaV0ucml4ID0gcmNbaV0ucml4OworCQlhdGhfcmNbaV0udHJpZXMgPSByY1tpXS50cmllczsK KwkJYXRoX3JjW2ldLmZsYWdzID0gcmNbaV0uZmxhZ3M7CisJCWF0aF9yY1tpXS5yYXRlY29kZSA9 IHJjW2ldLnJhdGVjb2RlOworCQlhdGhfcmNbaV0udHhfcG93ZXJfY2FwID0gcmNbaV0udHhfcG93 ZXJfY2FwOworCQlhdGhfcmNbaV0ubWF4NG1zZnJhbWVsZW4gPSByY1tpXS5tYXg0bXNmcmFtZWxl bjsKKwkJCisJCURQUklOVEYoc2MsIEFUSF9ERUJVR19TV19UWF9BR0dSLAorCQkgICAgIiVzOiBp PSVkLCByYXRlPTB4JXgsIGZsYWdzPTB4JXgsIG1heDRtcz0lZFxuIiwKKwkJICAgIF9fZnVuY19f LCBpLCByYXRlLCByY1tpXS5mbGFncywgcmNbaV0ubWF4NG1zZnJhbWVsZW4pOworCX0KKworI2lm IDAKIAlmb3IgKGkgPSAwOyBpIDwgQVRIX1JDX05VTTsgaSsrKSB7CiAJCXJjW2ldLmZsYWdzID0g MDsKIAkJaWYgKHJjW2ldLnRyaWVzID09IDApCkBAIC0zMjUsNiArMzYxLDcgQEAKIAkJICAgICIl czogaT0lZCwgcmF0ZT0weCV4LCBmbGFncz0weCV4LCBtYXg0bXM9JWRcbiIsCiAJCSAgICBfX2Z1 bmNfXywgaSwgcmF0ZSwgcmNbaV0uZmxhZ3MsIHJjW2ldLm1heDRtc2ZyYW1lbGVuKTsKIAl9Cisj ZW5kaWYKIH0KIAogLyoKSW5kZXg6IGRldi9hdGgvaWZfYXRoLmMKPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZGV2 L2F0aC9pZl9hdGguYwkocmV2aXNpb24gMjU0ODI2KQorKysgZGV2L2F0aC9pZl9hdGguYwkod29y a2luZyBjb3B5KQpAQCAtODIsNiArODIsOCBAQAogCiAjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgw MjExX3Zhci5oPgogI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9yZWdkb21haW4uaD4KKwor I2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmg+CiAjaWZkZWYgSUVFRTgwMjEx X1NVUFBPUlRfU1VQRVJHCiAjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3N1cGVyZy5oPgog I2VuZGlmCkBAIC0zMjIsNiArMzI0LDcgQEAKIAlzYy0+c2NfYWggPSBhaDsKIAlzYy0+c2NfaW52 YWxpZCA9IDA7CS8qIHJlYWR5IHRvIGdvLCBlbmFibGUgaW50ZXJydXB0IGhhbmRsaW5nICovCiAj aWZkZWYJQVRIX0RFQlVHCisJYXRoX2RlYnVnIHw9IEFUSF9ERUJVR19OT0RFOyAKIAlzYy0+c2Nf ZGVidWcgPSBhdGhfZGVidWc7CiAjZW5kaWYKIApAQCAtMTM4MCw2ICsxMzgzLDE2IEBACiAJfQog CUFUSF9VTkxPQ0soc2MpOwogCisJdWludDMyX3QgY2FwcyA9IDA7CisJaWYgKHNjLT5zY19tcnJl dHJ5KQorCQljYXBzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlI7CisJaWYgKHNjLT5zY19t cnJwcm90KQorCQljYXBzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9NUlJQUk9UOworCWlmIChz Yy0+c2NfdHhjaGFpbm1hc2sgPiAxKQorCQljYXBzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0NBUF9N VUxUWENIQUlOOworCisJaWVlZTgwMjExX3JhdGVjdGxfaW5pdCh2YXAsIGNhcHMpOworCQogCS8q IGNvbXBsZXRlIHNldHVwICovCiAJaWVlZTgwMjExX3ZhcF9hdHRhY2godmFwLCBhdGhfbWVkaWFf Y2hhbmdlLCBpZWVlODAyMTFfbWVkaWFfc3RhdHVzKTsKIAlyZXR1cm4gdmFwOwpAQCAtMTQxNCw2 ICsxNDI3LDcgQEAKIAkJYXRoX3N0b3ByZWN2KHNjLCAxKTsJCS8qIHN0b3AgcmVjdiBzaWRlICov CiAJfQogCisJaWVlZTgwMjExX3JhdGVjdGxfZGVpbml0KHZhcCk7CiAJaWVlZTgwMjExX3ZhcF9k ZXRhY2godmFwKTsKIAogCS8qCkBAIC00MDQyLDYgKzQwNTYsOCBAQAogewogCXN0cnVjdCBpZWVl ODAyMTFfbm9kZSAqbmkgPSBiZi0+YmZfbm9kZTsKIAlzdHJ1Y3QgYXRoX25vZGUgKmFuID0gTlVM TDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8gKnJjX2luZm8gPSBOVUxMOworCXN0cnVjdCBt X3RhZyAqbXRhZzsKIAogCUFUSF9UWF9VTkxPQ0tfQVNTRVJUKHNjKTsKIAlBVEhfVFhRX1VOTE9D S19BU1NFUlQodHhxKTsKQEAgLTQwNjgsMTAgKzQwODQsMzQgQEAKIAkJCSAqIFhYWCBhc3N1bWUg dGhpcyBpc24ndCBhbiBhZ2dyZWdhdGUKIAkJCSAqIGZyYW1lLgogCQkJICovCisjaWYgMAogCQkJ YXRoX3R4X3VwZGF0ZV9yYXRlY3RybChzYywgbmksCiAJCQkgICAgIGJmLT5iZl9zdGF0ZS5iZnNf cmMsIHRzLAogCQkJICAgIGJmLT5iZl9zdGF0ZS5iZnNfcGt0bGVuLCAxLAogCQkJICAgICh0cy0+ dHNfc3RhdHVzID09IDAgPyAwIDogMSkpOworI2VuZGlmCisJCQkvKiBuZXQ4MDIxMSByYXRlY3Rs ICovCisJCSAgICBtdGFnID0gbV90YWdfbG9jYXRlKGJmLT5iZl9tLCBNVEFHX0FCSV9ORVQ4MDIx MSwgCisJCQkJICAgICAgICAgICAgTkVUODAyMTFfVEFHX1JBVEVDVEwsIE5VTEwpOworCQkJaWYg KE5VTEwgPT0gbXRhZykgeworCQkJCUlFRUU4MDIxMV9OT1RFKG5pLT5uaV92YXAsIElFRUU4MDIx MV9NU0dfUkFURUNUTCwgbmksCisJCQkJCQkiJXM6IG5vIHJhdGVjdGwgbWJ1ZiB0YWcgZm91bmQu XG4iLCBfX2Z1bmNfXyk7CisJCQkJc3RydWN0IGllZWU4MDIxMV9yY19pbmZvIHRtcF9yY19pbmZv OworCQkJCXJjX2luZm8gPSAmdG1wX3JjX2luZm87CisJCQkJYnplcm8ocmNfaW5mbywgc2l6ZW9m KHJjX2luZm8pKTsKKwkJCX0gZWxzZSB7CisJCQkJSUVFRTgwMjExX05PVEUobmktPm5pX3ZhcCwg SUVFRTgwMjExX01TR19SQVRFQ1RMLCBuaSwKKwkJCQkJCSIlczogZm91bmQgcmF0ZWN0bCBtYnVm IHRhZy5cbiIsIF9fZnVuY19fKTsKKwkJCQlyY19pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfcmNf aW5mbyopKG10YWcgKyAxKTsKKwkJCX0KKwkKKwkJCWllZWU4MDIxMV9yYXRlY3RsX3JjX2luZm9f c2V0KHJjX2luZm8sCisJCQkJCTEsICh0cy0+dHNfc3RhdHVzID09IDAgPyAwIDogMSksIAorCQkJ CQliZi0+YmZfc3RhdGUuYmZzX3BrdGxlbiwKKwkJCQkJdHMtPnRzX3Nob3J0cmV0cnksIHRzLT50 c19sb25ncmV0cnksCisJCQkJCXRzLT50c19maW5hbHRzaSwgdHMtPnRzX3JhdGUpOworCQkJcmNf aW5mby0+aXJpX2ZsYWdzICY9IH5JRUVFODAyMTFfUkFURUNUTF9JTkZPX0FHR1I7CQorCQkJaWVl ZTgwMjExX3JhdGVjdGxfdHhfY29tcGxldGUobmktPm5pX3ZhcCwgbmksIHJjX2luZm8pOwogCQl9 CiAJCWF0aF90eF9kZWZhdWx0X2NvbXAoc2MsIGJmLCAwKTsKIAl9IGVsc2UKQEAgLTU1NzQsOSAr NTYxNCwxNSBAQAogCiAJYW4tPmFuX21jYXN0cml4ID0gYXRoX3R4X2ZpbmRyaXgoc2MsIHRwLT5t Y2FzdHJhdGUpOwogCWFuLT5hbl9tZ210cml4ID0gYXRoX3R4X2ZpbmRyaXgoc2MsIHRwLT5tZ210 cmF0ZSk7Ci0KKyNpZiAwCiAJYXRoX3JhdGVfbmV3YXNzb2Moc2MsIGFuLCBpc25ldyk7CisjZW5k aWYKIAorCURQUklOVEYoc2MsIEFUSF9ERUJVR19OT0RFLCAiJXM6IG5ld2Fzc29jIGlzIG5ldzog JWRcbiIsCisJCQlfX2Z1bmNfXywgaXNuZXcpOworCWlmIChpc25ldykKKwkJaWVlZTgwMjExX3Jh dGVjdGxfbm9kZV9pbml0KG5pKTsKKwogCWlmIChpc25ldyAmJgogCSAgICAodmFwLT5pdl9mbGFn cyAmIElFRUU4MDIxMV9GX1BSSVZBQ1kpID09IDAgJiYgc2MtPnNjX2hhc2NscmtleSAmJgogCSAg ICBuaS0+bmlfdWNhc3RrZXkud2tfa2V5aXggPT0gSUVFRTgwMjExX0tFWUlYX05PTkUpCkluZGV4 OiBkZXYvYXRoL2lmX2F0aF9zeXNjdGwuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkZXYvYXRoL2lmX2F0aF9z eXNjdGwuYwkocmV2aXNpb24gMjU0ODI2KQorKysgZGV2L2F0aC9pZl9hdGhfc3lzY3RsLmMJKHdv cmtpbmcgY29weSkKQEAgLTcxLDYgKzcxLDcgQEAKIAogI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4 MDIxMV92YXIuaD4KICNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfcmVnZG9tYWluLmg+Cisj aW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4KICNpZmRlZiBJRUVFODAyMTFf U1VQUE9SVF9TVVBFUkcKICNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfc3VwZXJnLmg+CiAj ZW5kaWYKQEAgLTYwMiw2ICs2MDMsMjggQEAKIH0KICNlbmRpZiAvKiBBVEhfREVCVUdfQUxRICov CiAKK3N0YXRpYyBpbnQKK2F0aF9zeXNjdGxfcmF0ZWN0bF9zdGF0cyhTWVNDVExfSEFORExFUl9B UkdTKQoreworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gYXJnMTsKKwlzdHJ1Y3QgaWVlZTgwMjEx Y29tICppYyA9IHNjLT5zY19pZnAtPmlmX2wyY29tOyAKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2 YXA7CisJaW50IGVycm9yLCB2OworCisJdiA9IDA7CisJZXJyb3IgPSBzeXNjdGxfaGFuZGxlX2lu dChvaWRwLCAmdiwgMCwgcmVxKTsKKwlpZiAoZXJyb3IgfHwgIXJlcS0+bmV3cHRyKQorCQlyZXR1 cm4gZXJyb3I7CisKKwlwcmludGYoIlxuWyVzXTogcGVyLWRldmljZSBuZXQ4MDIxMSByYXRlY3Rs IHN0YXRpc3RpY3NcbiIsIAorCQkJaWMtPmljX2lmcC0+aWZfeG5hbWUpOworCVRBSUxRX0ZPUkVB Q0godmFwLCAmaWMtPmljX3ZhcHMsIGl2X25leHQpIHsKKwkJaWVlZTgwMjExX3JhdGVjdGxfc3Rh dHModmFwKTsKKwl9CisJCQorCXJldHVybiAwOworfQorCiB2b2lkCiBhdGhfc3lzY3RsYXR0YWNo KHN0cnVjdCBhdGhfc29mdGMgKnNjKQogewpAQCAtNzkyLDYgKzgxNSwxMCBAQAogI2lmZGVmCUFU SF9ERUJVR19BTFEKIAlhdGhfc3lzY3RsX2FscV9hdHRhY2goc2MpOwogI2VuZGlmCisJCisJU1lT Q1RMX0FERF9QUk9DKGN0eCwgU1lTQ1RMX0NISUxEUkVOKHRyZWUpLCBPSURfQVVUTywKKwkJInJh dGVjdGxfc3RhdHMiLCBDVExUWVBFX0lOVCB8IENUTEZMQUdfUlcsIHNjLCAwLAorCQlhdGhfc3lz Y3RsX3JhdGVjdGxfc3RhdHMsICJJIiwgInBlci1kZXZpY2UgbmV0ODAyMTEgcmF0ZWN0bCBzdGF0 aXN0aWNzIik7CiB9CiAKIHN0YXRpYyBpbnQKSW5kZXg6IGRldi9hdGgvaWZfYXRoX3R4LmMKPT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQotLS0gZGV2L2F0aC9pZl9hdGhfdHguYwkocmV2aXNpb24gMjU0ODI2KQorKysgZGV2 L2F0aC9pZl9hdGhfdHguYwkod29ya2luZyBjb3B5KQpAQCAtNzIsNiArNzIsOCBAQAogCiAjaW5j bHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Zhci5oPgogI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4 MDIxMV9yZWdkb21haW4uaD4KKworI2luY2x1ZGUgPG5ldDgwMjExL2llZWU4MDIxMV9yYXRlY3Rs Lmg+CiAjaWZkZWYgSUVFRTgwMjExX1NVUFBPUlRfU1VQRVJHCiAjaW5jbHVkZSA8bmV0ODAyMTEv aWVlZTgwMjExX3N1cGVyZy5oPgogI2VuZGlmCkBAIC0xMzg3LDYgKzEzODksMTAgQEAKIHN0YXRp YyB2b2lkCiBhdGhfdHhfZG9fcmF0ZWxvb2t1cChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0 IGF0aF9idWYgKmJmKQogeworCXN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkgPSBiZi0+YmZfbm9k ZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8gKnJjX2luZm8gPSBOVUxMOworCXN0cnVjdCBp ZWVlODAyMTFfcmNfc2VyaWVzICpyYyA9IE5VTEw7CisJc3RydWN0IG1fdGFnICptdGFnOwogCXVp bnQ4X3QgcmF0ZSwgcml4OwogCWludCB0cnkwOwogCkBAIC0xMzk1LDcgKzE0MDEsNyBAQAogCiAJ LyogR2V0IHJpZCBvZiBhbnkgcHJldmlvdXMgc3RhdGUgKi8KIAliemVybyhiZi0+YmZfc3RhdGUu YmZzX3JjLCBzaXplb2YoYmYtPmJmX3N0YXRlLmJmc19yYykpOwotCisjaWYgMAogCUFUSF9OT0RF X0xPQ0soQVRIX05PREUoYmYtPmJmX25vZGUpKTsKIAlhdGhfcmF0ZV9maW5kcmF0ZShzYywgQVRI X05PREUoYmYtPmJmX25vZGUpLCBiZi0+YmZfc3RhdGUuYmZzX3NocHJlYW0sCiAJICAgIGJmLT5i Zl9zdGF0ZS5iZnNfcGt0bGVuLCAmcml4LCAmdHJ5MCwgJnJhdGUpOwpAQCAtMTQwOSw3ICsxNDE1 LDQ0IEBACiAJCWF0aF9yYXRlX2dldHh0eHJhdGVzKHNjLCBBVEhfTk9ERShiZi0+YmZfbm9kZSks IHJpeCwKIAkJICAgIGJmLT5iZl9zdGF0ZS5iZnNfcmMpOwogCUFUSF9OT0RFX1VOTE9DSyhBVEhf Tk9ERShiZi0+YmZfbm9kZSkpOworI2VuZGlmCiAKKwkvKiBuZXQ4MDIxMSByYXRlY3RsICovCisJ bXRhZyA9IG1fdGFnX2xvY2F0ZShiZi0+YmZfbSwgTVRBR19BQklfTkVUODAyMTEsIAorCQkJTkVU ODAyMTFfVEFHX1JBVEVDVEwsIE5VTEwpOworYWdhaW46CQorCWlmIChOVUxMID09IG10YWcpIHsK KwkJbXRhZyA9IG1fdGFnX2FsbG9jKE1UQUdfQUJJX05FVDgwMjExLCBORVQ4MDIxMV9UQUdfUkFU RUNUTCwKKwkJCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yY19pbmZvKSwgTV9OT1dBSVQpOwor CQlpZiAoTlVMTCA9PSBtdGFnKSB7CisJCQlJRUVFODAyMTFfTk9URShuaS0+bmlfdmFwLCBJRUVF ODAyMTFfTVNHX1JBVEVDVEwsIG5pLAorCQkJCQkiJXM6IGNhbid0IGFsbG9jIG1idWYgdGFnIGZv ciByYXRlY3RsLlxuIiwgX19mdW5jX18pOworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0gZWxzZQor CQlJRUVFODAyMTFfTk9URShuaS0+bmlfdmFwLCBJRUVFODAyMTFfTVNHX1JBVEVDVEwsIG5pLAor CQkJCSIlczogbmFuaT8gZmluZCBtYnVmIHRhZyBmb3IgcmF0ZWN0bCBkaXJlY3RseS5cbiIsIF9f ZnVuY19fKTsKKwkKKwlyY19pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyopKG10YWcg KyAxKTsKKwlyYyA9IHJjX2luZm8tPmlyaV9yYzsKKwkKKwliemVybyhyY19pbmZvLCBzaXplb2Yo cmNfaW5mbykpOworCisJaWYgKGJmLT5iZl9zdGF0ZS5iZnNfc2hwcmVhbSkKKwkJcmNfaW5mby0+ aXJpX2ZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0lORk9fU1A7CisJaWYgKGJmLT5iZl9zdGF0 ZS5iZnNfYWdncikKKwkJcmNfaW5mby0+aXJpX2ZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0lO Rk9fQUdHUjsKKworCXJjX2luZm8tPmlyaV9mcmFtZWxlbiA9IGJmLT5iZl9zdGF0ZS5iZnNfcGt0 bGVuOworCisJaWVlZTgwMjExX3JhdGVjdGxfcmF0ZXMobmksIHJjX2luZm8pOworCisJbV90YWdf cHJlcGVuZChiZi0+YmZfbSwgbXRhZyk7CisKKwlyaXggPSByY1swXS5yaXg7CisJdHJ5MCA9IHJj WzBdLnRyaWVzOworCXJhdGUgPSBuaS0+bmlfdHhyYXRlOworCiAJc2MtPnNjX3R4cml4ID0gcml4 OwkvKiBmb3IgTEVEIGJsaW5raW5nICovCiAJc2MtPnNjX2xhc3RkYXRhcml4ID0gcml4OwkvKiBm b3IgZmFzdCBmcmFtZXMgKi8KIAliZi0+YmZfc3RhdGUuYmZzX3RyeTAgPSB0cnkwOwpAQCAtMTUz MCw3ICsxNTczLDggQEAKIAkgKiBmcmFtZXMgdGhhdCBtdXN0IGdvIG91dCAtIGVnIG1hbmFnZW1l bnQvcmF3IGZyYW1lcy4KIAkgKi8KIAliZi0+YmZfc3RhdGUuYmZzX3R4ZmxhZ3MgfD0gSEFMX1RY REVTQ19DTFJETUFTSzsKLQorCQorCWJmLT5iZl9zdGF0ZS5iZnNfYWdnciA9IDA7CiAJLyogU2V0 dXAgdGhlIGRlc2NyaXB0b3IgYmVmb3JlIGhhbmRvZmYgKi8KIAlhdGhfdHhfZG9fcmF0ZWxvb2t1 cChzYywgYmYpOwogCWF0aF90eF9jYWxjX2R1cmF0aW9uKHNjLCBiZik7CkBAIC00MDU4LDYgKzQx MDIsOCBAQAogCWludCB0aWQgPSBiZi0+YmZfc3RhdGUuYmZzX3RpZDsKIAlzdHJ1Y3QgYXRoX3Rp ZCAqYXRpZCA9ICZhbi0+YW5fdGlkW3RpZF07CiAJc3RydWN0IGF0aF90eF9zdGF0dXMgKnRzID0g JmJmLT5iZl9zdGF0dXMuZHNfdHhzdGF0OworCXN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNf aW5mbyA9IE5VTEw7CisJc3RydWN0IG1fdGFnICptdGFnOwogCiAJLyogVGhlIFRJRCBzdGF0ZSBp cyBwcm90ZWN0ZWQgYmVoaW5kIHRoZSBUWFEgbG9jayAqLwogCUFUSF9UWF9MT0NLKHNjKTsKQEAg LTQxMDgsOSArNDE1NCwzNSBAQAogCSAqIGR1cmluZyBhIGh3IHF1ZXVlIGRyYWluIGFuZCB0aGUg ZnJhbWUgd2FudGVkIGFuIEFDSy4KIAkgKi8KIAlpZiAoZmFpbCA9PSAwICYmICgoYmYtPmJmX3N0 YXRlLmJmc190eGZsYWdzICYgSEFMX1RYREVTQ19OT0FDSykgPT0gMCkpCisJeworI2lmIDAKIAkJ YXRoX3R4X3VwZGF0ZV9yYXRlY3RybChzYywgbmksIGJmLT5iZl9zdGF0ZS5iZnNfcmMsCiAJCSAg ICB0cywgYmYtPmJmX3N0YXRlLmJmc19wa3RsZW4sCiAJCSAgICAxLCAodHMtPnRzX3N0YXR1cyA9 PSAwKSA/IDAgOiAxKTsKKyNlbmRpZgorCQorCQkvKiBuZXQ4MDIxMSByYXRlY3RsICovCisJICAg IG10YWcgPSBtX3RhZ19sb2NhdGUoYmYtPmJmX20sIE1UQUdfQUJJX05FVDgwMjExLCAKKwkJCSAg ICAgICAgICAgIE5FVDgwMjExX1RBR19SQVRFQ1RMLCBOVUxMKTsKKwkJaWYgKE5VTEwgPT0gbXRh ZykgeworCQkJSUVFRTgwMjExX05PVEUobmktPm5pX3ZhcCwgSUVFRTgwMjExX01TR19SQVRFQ1RM LCBuaSwKKwkJCQkJIiVzOiBubyByYXRlY3RsIG1idWYgdGFnIGZvdW5kLlxuIiwgX19mdW5jX18p OworCQkJc3RydWN0IGllZWU4MDIxMV9yY19pbmZvIHRtcF9yY19pbmZvOworCQkJcmNfaW5mbyA9 ICZ0bXBfcmNfaW5mbzsKKwkJCWJ6ZXJvKHJjX2luZm8sIHNpemVvZihyY19pbmZvKSk7CisJCX0g ZWxzZSB7CisJCQlJRUVFODAyMTFfTk9URShuaS0+bmlfdmFwLCBJRUVFODAyMTFfTVNHX1JBVEVD VEwsIG5pLAorCQkJCQkiJXM6IGZvdW5kIHJhdGVjdGwgbWJ1ZiB0YWcuXG4iLCBfX2Z1bmNfXyk7 CisJCQlyY19pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyopKG10YWcgKyAxKTsKKwkJ fQorCQlyY19pbmZvLT5pcmlfZmxhZ3MgJj0gfklFRUU4MDIxMV9SQVRFQ1RMX0lORk9fQUdHUjsJ CisJCWllZWU4MDIxMV9yYXRlY3RsX3JjX2luZm9fc2V0KHJjX2luZm8sCisJCQkJMSwgKHRzLT50 c19zdGF0dXMgPT0gMCA/IDAgOiAxKSwgCisJCQkJYmYtPmJmX3N0YXRlLmJmc19wa3RsZW4sCisJ CQkJdHMtPnRzX3Nob3J0cmV0cnksIHRzLT50c19sb25ncmV0cnksCisJCQkJdHMtPnRzX2ZpbmFs dHNpLCB0cy0+dHNfcmF0ZSk7CisJCWllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKG5pLT5u aV92YXAsIG5pLCByY19pbmZvKTsKKwl9CiAKIAlhdGhfdHhfZGVmYXVsdF9jb21wKHNjLCBiZiwg ZmFpbCk7CiB9CkBAIC00NDc1LDYgKzQ1NDcsOSBAQAogCWludCBkcm9wcyA9IDA7CiAJc3RydWN0 IGllZWU4MDIxMV90eF9hbXBkdSAqdGFwOwogCWF0aF9idWZoZWFkIGJmX2NxOworCXN0cnVjdCBh dGhfdHhfc3RhdHVzIHRzID0gYmZfZmlyc3QtPmJmX3N0YXR1cy5kc190eHN0YXQ7CisJc3RydWN0 IGllZWU4MDIxMV9yY19pbmZvICpyY19pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgbV90YWcgKm10YWc7 CiAKIAlUQUlMUV9JTklUKCZiZl9xKTsKIAlUQUlMUV9JTklUKCZiZl9jcSk7CkBAIC00NDg1LDEx ICs0NTYwLDM2IEBACiAJICogWFhYIHVzZSB0aGUgbGVuZ3RoIGluIHRoZSBmaXJzdCBmcmFtZSBp biB0aGUgc2VyaWVzOwogCSAqIFhYWCBqdXN0IHNvIHRoaW5ncyBhcmUgY29uc2lzdGVudCBmb3Ig bm93LgogCSAqLworI2lmIDAKIAlhdGhfdHhfdXBkYXRlX3JhdGVjdHJsKHNjLCBuaSwgYmZfZmly c3QtPmJmX3N0YXRlLmJmc19yYywKIAkgICAgJmJmX2ZpcnN0LT5iZl9zdGF0dXMuZHNfdHhzdGF0 LAogCSAgICBiZl9maXJzdC0+YmZfc3RhdGUuYmZzX3BrdGxlbiwKIAkgICAgYmZfZmlyc3QtPmJm X3N0YXRlLmJmc19uZnJhbWVzLCBiZl9maXJzdC0+YmZfc3RhdGUuYmZzX25mcmFtZXMpOworI2Vu ZGlmCisJLyogbmV0ODAyMTEgcmF0ZWN0bCAqLworCW10YWcgPSBtX3RhZ19sb2NhdGUoYmZfZmly c3QtPmJmX20sIE1UQUdfQUJJX05FVDgwMjExLCAKKwkJCU5FVDgwMjExX1RBR19SQVRFQ1RMLCBO VUxMKTsKKwlpZiAoTlVMTCA9PSBtdGFnKSB7CisJCUlFRUU4MDIxMV9OT1RFKG5pLT5uaV92YXAs IElFRUU4MDIxMV9NU0dfUkFURUNUTCwgbmksCisJCQkJIiVzOiBubyByYXRlY3RsIG1idWYgdGFn IGZvdW5kLlxuIiwgX19mdW5jX18pOworCQlzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8gdG1wX3Jj X2luZm87CisJCXJjX2luZm8gPSAmdG1wX3JjX2luZm87CisJCWJ6ZXJvKHJjX2luZm8sIHNpemVv ZihyY19pbmZvKSk7CisJfSBlbHNlIHsKKwkJSUVFRTgwMjExX05PVEUobmktPm5pX3ZhcCwgSUVF RTgwMjExX01TR19SQVRFQ1RMLCBuaSwKKwkJCQkiJXM6IGZvdW5kIHJhdGVjdGwgbWJ1ZiB0YWcu XG4iLCBfX2Z1bmNfXyk7CisJCXJjX2luZm8gPSAoc3RydWN0IGllZWU4MDIxMV9yY19pbmZvKiko bXRhZyArIDEpOworCX0KIAorCWllZWU4MDIxMV9yYXRlY3RsX3JjX2luZm9fc2V0KHJjX2luZm8s CisJCQliZl9maXJzdC0+YmZfc3RhdGUuYmZzX25mcmFtZXMsIAorCQkJYmZfZmlyc3QtPmJmX3N0 YXRlLmJmc19uZnJhbWVzLAorCQkJYmZfZmlyc3QtPmJmX3N0YXRlLmJmc19wa3RsZW4sCisJCQl0 cy50c19zaG9ydHJldHJ5LCB0cy50c19sb25ncmV0cnksCisJCQl0cy50c19maW5hbHRzaSwgdHMu dHNfcmF0ZSk7CisJcmNfaW5mby0+aXJpX2ZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0lORk9f QUdHUjsKKwlpZWVlODAyMTFfcmF0ZWN0bF90eF9jb21wbGV0ZShuaS0+bmlfdmFwLCBuaSwgcmNf aW5mbyk7CisKIAlBVEhfVFhfTE9DSyhzYyk7CiAJdGFwID0gYXRoX3R4X2dldF90eF90aWQoYW4s IHRpZC0+dGlkKTsKIAlzYy0+c2Nfc3RhdHMuYXN0X3R4X2FnZ3JfZmFpbGFsbCsrOwpAQCAtNDYy Niw4ICs0NzI2LDEyIEBACiAJaW50IG5mcmFtZXMgPSAwLCBuYmFkID0gMCwgbmY7CiAJaW50IHBr dGxlbjsKIAkvKiBYWFggdGhlcmUncyB0b28gbXVjaCBvbiB0aGUgc3RhY2s/ICovCisjaWYgMAog CXN0cnVjdCBhdGhfcmNfc2VyaWVzIHJjW0FUSF9SQ19OVU1dOworI2VuZGlmCiAJaW50IHR4c2Vx OworCXN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbyA9IE5VTEw7CisJc3RydWN0IG1f dGFnICptdGFnOwogCiAJRFBSSU5URihzYywgQVRIX0RFQlVHX1NXX1RYX0FHR1IsICIlczogY2Fs bGVkOyBod3FfZGVwdGg9JWRcbiIsCiAJICAgIF9fZnVuY19fLCBhdGlkLT5od3FfZGVwdGgpOwpA QCAtNDc0OCw3ICs0ODUyLDcgQEAKIAlpc2FnZ3IgPSBiZl9maXJzdC0+YmZfc3RhdGUuYmZzX2Fn Z3I7CiAJYmFbMF0gPSB0cy50c19iYV9sb3c7CiAJYmFbMV0gPSB0cy50c19iYV9oaWdoOwotCisj aWYgMAogCS8qCiAJICogQ29weSB0aGUgVFggY29tcGxldGlvbiBzdGF0dXMgYW5kIHRoZSByYXRl IGNvbnRyb2wKIAkgKiBzZXJpZXMgZnJvbSB0aGUgZmlyc3QgZGVzY3JpcHRvciwgYXMgaXQgbWF5 IGJlIGZyZWVkCkBAIC00NzU2LDYgKzQ4NjAsMTMgQEAKIAkgKiBpbnRvIHRoaW5ncy4KIAkgKi8K IAltZW1jcHkocmMsIGJmX2ZpcnN0LT5iZl9zdGF0ZS5iZnNfcmMsIHNpemVvZihyYykpOworI2Vu ZGlmCisJLyogCisJICogR2V0IHRoZSBuZXQ4MDIxMSByYXRlY3RsIG10YWcgaGVyZSwgYXMgYmZf Zmlyc3Qgd2lsbCAKKwkgKiBiZSBzZXQgdG8gTlVMTCBsYXRlci4gCisJICovCisJbXRhZyA9IG1f dGFnX2xvY2F0ZShiZl9maXJzdC0+YmZfbSwgTVRBR19BQklfTkVUODAyMTEsIAorCQkJTkVUODAy MTFfVEFHX1JBVEVDVEwsIE5VTEwpOwogCiAJRFBSSU5URihzYywgQVRIX0RFQlVHX1NXX1RYX0FH R1IsCiAJICAgICIlczogdHhhX3N0YXJ0PSVkLCB0eF9vaz0lZCwgc3RhdHVzPSUuOHgsIGZsYWdz PSUuOHgsICIKQEAgLTQ4NzMsOSArNDk4NCwzMiBAQAogCSAqIGNvbnRyb2wgY29kZS4KIAkgKi8K IAlpZiAoZmFpbCA9PSAwKQorCXsKKyNpZiAwCQogCQlhdGhfdHhfdXBkYXRlX3JhdGVjdHJsKHNj LCBuaSwgcmMsICZ0cywgcGt0bGVuLCBuZnJhbWVzLAogCQkgICAgbmJhZCk7CisjZW5kaWYKKwkJ LyogbmV0ODAyMTEgcmF0ZWN0bCAqLworCQlpZiAoTlVMTCA9PSBtdGFnKSB7CisJCQlJRUVFODAy MTFfTk9URShuaS0+bmlfdmFwLCBJRUVFODAyMTFfTVNHX1JBVEVDVEwsIG5pLAorCQkJCQkiJXM6 IG5vIHJhdGVjdGwgbWJ1ZiB0YWcgZm91bmQuXG4iLCBfX2Z1bmNfXyk7CisJCQlzdHJ1Y3QgaWVl ZTgwMjExX3JjX2luZm8gdG1wX3JjX2luZm87CisJCQlyY19pbmZvID0gJnRtcF9yY19pbmZvOwor CQkJYnplcm8ocmNfaW5mbywgc2l6ZW9mKHJjX2luZm8pKTsKKwkJfSBlbHNlIHsKKwkJCUlFRUU4 MDIxMV9OT1RFKG5pLT5uaV92YXAsIElFRUU4MDIxMV9NU0dfUkFURUNUTCwgbmksCisJCQkJCSIl czogZm91bmQgcmF0ZWN0bCBtYnVmIHRhZy5cbiIsIF9fZnVuY19fKTsKKwkJCXJjX2luZm8gPSAo c3RydWN0IGllZWU4MDIxMV9yY19pbmZvKikobXRhZyArIDEpOworCQl9CiAKKwkJcmNfaW5mby0+ aXJpX2ZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0lORk9fQUdHUjsKKwkJaWVlZTgwMjExX3Jh dGVjdGxfcmNfaW5mb19zZXQocmNfaW5mbywKKwkJCQkJbmZyYW1lcywgbmJhZCwgcGt0bGVuLAor CQkJCQl0cy50c19zaG9ydHJldHJ5LCB0cy50c19sb25ncmV0cnksCisJCQkJCXRzLnRzX2ZpbmFs dHNpLCB0cy50c19yYXRlKTsKKwkJaWVlZTgwMjExX3JhdGVjdGxfdHhfY29tcGxldGUobmktPm5p X3ZhcCwgbmksIHJjX2luZm8pOworCX0KKwogCS8qCiAJICogc2VuZCBiYXIgaWYgd2UgZHJvcHBl ZCBhbnkgZnJhbWVzCiAJICovCkBAIC00OTQ4LDYgKzUwODIsOCBAQAogCXN0cnVjdCBhdGhfdGlk ICphdGlkID0gJmFuLT5hbl90aWRbdGlkXTsKIAlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyB0czsKIAlp bnQgZHJvcHMgPSAwOworCXN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqcmNfaW5mbyA9IE5VTEw7 CisJc3RydWN0IG1fdGFnICptdGFnOwogCiAJLyoKIAkgKiBUYWtlIGEgY29weSBvZiB0aGlzOyBm aWx0ZXJpbmcvY2xvbmluZyB0aGUgZnJhbWUgbWF5IGZyZWUgdGhlCkBAIC00OTYyLDExICs1MDk4 LDM2IEBACiAJICogRG8gaXQgb3V0c2lkZSBvZiB0aGUgVFhRIGxvY2suCiAJICovCiAJaWYgKGZh aWwgPT0gMCAmJiAoKGJmLT5iZl9zdGF0ZS5iZnNfdHhmbGFncyAmIEhBTF9UWERFU0NfTk9BQ0sp ID09IDApKQorCXsKKyNpZiAwCQogCQlhdGhfdHhfdXBkYXRlX3JhdGVjdHJsKHNjLCBuaSwgYmYt PmJmX3N0YXRlLmJmc19yYywKIAkJICAgICZiZi0+YmZfc3RhdHVzLmRzX3R4c3RhdCwKIAkJICAg IGJmLT5iZl9zdGF0ZS5iZnNfcGt0bGVuLAogCQkgICAgMSwgKHRzLnRzX3N0YXR1cyA9PSAwKSA/ IDAgOiAxKTsKKyNlbmRpZgorCQltdGFnID0gbV90YWdfbG9jYXRlKGJmLT5iZl9tLCBNVEFHX0FC SV9ORVQ4MDIxMSwgCisJCQkJTkVUODAyMTFfVEFHX1JBVEVDVEwsIE5VTEwpOworCQkKKwkJaWYg KE5VTEwgPT0gbXRhZykgeworCQkJSUVFRTgwMjExX05PVEUobmktPm5pX3ZhcCwgSUVFRTgwMjEx X01TR19SQVRFQ1RMLCBuaSwKKwkJCQkJIiVzOiBubyByYXRlY3RsIG1idWYgdGFnIGZvdW5kLlxu IiwgX19mdW5jX18pOworCQkJc3RydWN0IGllZWU4MDIxMV9yY19pbmZvIHRtcF9yY19pbmZvOwor CQkJcmNfaW5mbyA9ICZ0bXBfcmNfaW5mbzsKKwkJCWJ6ZXJvKHJjX2luZm8sIHNpemVvZihyY19p bmZvKSk7CisJCX0gZWxzZSB7CisJCQlJRUVFODAyMTFfTk9URShuaS0+bmlfdmFwLCBJRUVFODAy MTFfTVNHX1JBVEVDVEwsIG5pLAorCQkJCQkiJXM6IGZvdW5kIHJhdGVjdGwgbWJ1ZiB0YWcuXG4i LCBfX2Z1bmNfXyk7CisJCQlyY19pbmZvID0gKHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyopKG10 YWcgKyAxKTsKKwkJfQogCisJCXJjX2luZm8tPmlyaV9mbGFncyAmPSB+SUVFRTgwMjExX1JBVEVD VExfSU5GT19BR0dSOworCQlpZWVlODAyMTFfcmF0ZWN0bF9yY19pbmZvX3NldChyY19pbmZvLAor CQkJCTEsICh0cy50c19zdGF0dXMgPT0gMCA/IDAgOiAxKSwgCisJCQkJYmYtPmJmX3N0YXRlLmJm c19wa3RsZW4sCisJCQkJdHMudHNfc2hvcnRyZXRyeSwgdHMudHNfbG9uZ3JldHJ5LAorCQkJCXRz LnRzX2ZpbmFsdHNpLCB0cy50c19yYXRlKTsKKwkJaWVlZTgwMjExX3JhdGVjdGxfdHhfY29tcGxl dGUobmktPm5pX3ZhcCwgbmksIHJjX2luZm8pOworCX0KIAkvKgogCSAqIFRoaXMgaXMgY2FsbGVk IGVhcmx5IHNvIGF0aWQtPmh3cV9kZXB0aCBjYW4gYmUgdHJhY2tlZC4KIAkgKiBUaGlzIHVuZm9y dHVuYXRlbHkgbWVhbnMgdGhhdCBpdCdzIHJlbGVhc2VkIGFuZCByZWdyYWJiZWQKQEAgLTUxODMs NiArNTM0NCwxNSBAQAogCQl9CiAKIAkJLyoKKwkJICogSWYgbm9uLWFnZ3JlZ2F0ZSBzY2VuYXJp byBhcHBlYXJzLCB0aGlzIHdpbGwgYmUgCisJCSAqIHR1cm5lZCBvZmYuCisJCSAqCisJCSAqIFRo aXMgZmxhZyBpcyB1c2VkIGJ5IGF0aF90eF9kb19yYXRlbG9va3VwKCkgdG8gCisJCSAqIGRpc3Rp bmd1aXNoIGFnZ3Ivbm9uLWFnZ3Igc2NlbmFyaW8uICAKKwkJICovCisJCWJmLT5iZl9zdGF0ZS5i ZnNfYWdnciA9IDE7CisKKwkJLyoKIAkJICogSWYgdGhlIHBhY2tldCBkb2Vzbid0IGZhbGwgd2l0 aGluIHRoZSBCQVcgKGVnIGEgTlVMTAogCQkgKiBkYXRhIGZyYW1lKSwgc2NoZWR1bGUgaXQgZGly ZWN0bHk7IGNvbnRpbnVlLgogCQkgKi8KQEAgLTU0MjUsNiArNTU5NSw3IEBACiAJCS8qIFVwZGF0 ZSBDTFJETUFTSyBqdXN0IGJlZm9yZSB0aGlzIGZyYW1lIGlzIHF1ZXVlZCAqLwogCQlhdGhfdHhf dXBkYXRlX2NscmRtYXNrKHNjLCB0aWQsIGJmKTsKIAorCQliZi0+YmZfc3RhdGUuYmZzX2FnZ3Ig PSAwOyAKIAkJLyogUHJvZ3JhbSBkZXNjcmlwdG9ycyArIHJhdGUgY29udHJvbCAqLwogCQlhdGhf dHhfZG9fcmF0ZWxvb2t1cChzYywgYmYpOwogCQlhdGhfdHhfY2FsY19kdXJhdGlvbihzYywgYmYp OwpJbmRleDogZGV2L2l3bi9pZl9pd24uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkZXYvaXduL2lmX2l3bi5j CShyZXZpc2lvbiAyNTQ4MjYpCisrKyBkZXYvaXduL2lmX2l3bi5jCSh3b3JraW5nIGNvcHkpCkBA IC04NzYsNyArODc2LDggQEAKIAlpdnAtPml2X25ld3N0YXRlID0gdmFwLT5pdl9uZXdzdGF0ZTsK IAl2YXAtPml2X25ld3N0YXRlID0gaXduX25ld3N0YXRlOwogCi0JaWVlZTgwMjExX3JhdGVjdGxf aW5pdCh2YXApOworCS8qIFhYWCBUT0RPIGZpbGwgdGhlIGNhcCAqLworCWllZWU4MDIxMV9yYXRl Y3RsX2luaXQodmFwLCAwKTsKIAkvKiBDb21wbGV0ZSBzZXR1cC4gKi8KIAlpZWVlODAyMTFfdmFw X2F0dGFjaCh2YXAsIGl3bl9tZWRpYV9jaGFuZ2UsIGllZWU4MDIxMV9tZWRpYV9zdGF0dXMpOwog CWljLT5pY19vcG1vZGUgPSBvcG1vZGU7CkBAIC0yNDk5LDcgKzI1MDAsOCBAQAogCXVpbnQ2NF90 IGJpdG1hcDsKIAl1aW50MTZfdCBzc247CiAJdWludDhfdCB0aWQ7Ci0JaW50IGFja2ZhaWxjbnQg PSAwLCBpLCBsYXN0aWR4LCBxaWQsICpyZXMsIHNoaWZ0OworCS8qIGludCBmYWlsY250ID0gMDsg Ki8KKwlpbnQgaSwgbGFzdGlkeCwgcWlkLCAqcmVzLCBzaGlmdDsKIAogCWJ1c19kbWFtYXBfc3lu YyhzYy0+cnhxLmRhdGFfZG1hdCwgZGF0YS0+bWFwLCBCVVNfRE1BU1lOQ19QT1NUUkVBRCk7CiAK QEAgLTI1NjMsMTIgKzI1NjUsMTggQEAKIAlmb3IgKGkgPSAwOyBiaXRtYXA7IGkrKykgewogCQlp ZiAoKGJpdG1hcCAmIDEpID09IDApIHsKIAkJCWlmcC0+aWZfb2Vycm9ycysrOworI2lmIDAKIAkJ CWllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKG5pLT5uaV92YXAsIG5pLAogCQkJICAgIElF RUU4MDIxMV9SQVRFQ1RMX1RYX0ZBSUxVUkUsICZhY2tmYWlsY250LCBOVUxMKTsKKyNlbmRpZgor CQlpZWVlODAyMTFfcmF0ZWN0bF90eF9jb21wbGV0ZShuaS0+bmlfdmFwLCBuaSwgTlVMTCk7IC8q IGp1c3QgbWFrZSBpdCBjb21waWxlZC4gcWNjICovCQogCQl9IGVsc2UgewogCQkJaWZwLT5pZl9v cGFja2V0cysrOworI2lmIDAKIAkJCWllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKG5pLT5u aV92YXAsIG5pLAogCQkJICAgIElFRUU4MDIxMV9SQVRFQ1RMX1RYX1NVQ0NFU1MsICZhY2tmYWls Y250LCBOVUxMKTsKKyNlbmRpZgorCQkJaWVlZTgwMjExX3JhdGVjdGxfdHhfY29tcGxldGUobmkt Pm5pX3ZhcCwgbmksIE5VTEwpOyAvKiBqdXN0IG1ha2UgaXQgY29tcGlsZWQuIHFjYyAqLwogCQl9 CiAJCWJpdG1hcCA+Pj0gMTsKIAl9CkBAIC0yODA3LDEyICsyODE1LDE4IEBACiAJICovCiAJaWYg KHN0YXR1cyAmIElXTl9UWF9GQUlMKSB7CiAJCWlmcC0+aWZfb2Vycm9ycysrOworI2lmIDAKIAkJ aWVlZTgwMjExX3JhdGVjdGxfdHhfY29tcGxldGUodmFwLCBuaSwKIAkJICAgIElFRUU4MDIxMV9S QVRFQ1RMX1RYX0ZBSUxVUkUsICZhY2tmYWlsY250LCBOVUxMKTsKKyNlbmRpZgorCQlpZWVlODAy MTFfcmF0ZWN0bF90eF9jb21wbGV0ZSh2YXAsIG5pLCBOVUxMKTsgLyoganVzdCBtYWtlIGl0IGNv bXBpbGVkLiBxY2MgKi8KIAl9IGVsc2UgewogCQlpZnAtPmlmX29wYWNrZXRzKys7CisjaWYgMAog CQlpZWVlODAyMTFfcmF0ZWN0bF90eF9jb21wbGV0ZSh2YXAsIG5pLAogCQkgICAgSUVFRTgwMjEx X1JBVEVDVExfVFhfU1VDQ0VTUywgJmFja2ZhaWxjbnQsIE5VTEwpOworI2VuZGlmCisJCWllZWU4 MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKHZhcCwgbmksIE5VTEwpOyAvKiBqdXN0IG1ha2UgaXQg Y29tcGlsZWQuIHFjYyAqLwogCX0KIAltX2ZyZWVtKG0pOwogCWllZWU4MDIxMV9mcmVlX25vZGUo bmkpOwpJbmRleDogZGV2L2J3aS9pZl9id2kuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkZXYvYndpL2lmX2J3 aS5jCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBkZXYvYndpL2lmX2J3aS5jCSh3b3JraW5nIGNvcHkp CkBAIC02MTcsNyArNjE3LDggQEAKICNpZiAwCiAJdmFwLT5pdl91cGRhdGVfYmVhY29uID0gYndp X2JlYWNvbl91cGRhdGU7CiAjZW5kaWYKLQlpZWVlODAyMTFfcmF0ZWN0bF9pbml0KHZhcCk7CisJ LyogWFhYIFRPRE8gZmlsbCB0aGUgY2FwICovCisJaWVlZTgwMjExX3JhdGVjdGxfaW5pdCh2YXAs IDApOwogCiAJLyogY29tcGxldGUgc2V0dXAgKi8KIAlpZWVlODAyMTFfdmFwX2F0dGFjaCh2YXAs IGJ3aV9tZWRpYV9jaGFuZ2UsIGllZWU4MDIxMV9tZWRpYV9zdGF0dXMpOwpAQCAtMzM3Nyw5ICsz Mzc4LDEyIEBACiAJCQkgKiB3ZWxsIHNvIHRvIGF2b2lkIG92ZXItYWdncmVzc2l2ZSBkb3duc2hp ZnRpbmcgd2UKIAkJCSAqIHRyZWF0IGFueSBudW1iZXIgb2YgcmV0cmllcyBhcyAiMSIuCiAJCQkg Ki8KKyNpZiAwCiAJCQlpZWVlODAyMTFfcmF0ZWN0bF90eF9jb21wbGV0ZSh2YXAsIG5pLAogCQkJ ICAgIChkYXRhX3R4Y250ID4gMSkgPyBJRUVFODAyMTFfUkFURUNUTF9UWF9TVUNDRVNTIDoKIAkJ CSAgICAgICAgSUVFRTgwMjExX1JBVEVDVExfVFhfRkFJTFVSRSwgJmFja2VkLCBOVUxMKTsKKyNl bmRpZgorCQkJaWVlZTgwMjExX3JhdGVjdGxfdHhfY29tcGxldGUodmFwLCBuaSwgTlVMTCk7IC8q IGp1c3QgbWFrZSBpdCBjb21waWxlZC4gcWNjICovCiAJCX0KIAogCQkvKgpJbmRleDogZGV2L2J3 bi9pZl9id24uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkZXYvYnduL2lmX2J3bi5jCShyZXZpc2lvbiAyNTQ4 MjYpCisrKyBkZXYvYnduL2lmX2J3bi5jCSh3b3JraW5nIGNvcHkpCkBAIC0yOTcwLDcgKzI5NzAs OCBAQAogCS8qIG92ZXJyaWRlIG1heCBhaWQgc28gc3RhJ3MgY2Fubm90IGFzc29jIHdoZW4gd2Un cmUgb3V0IG9mIHN0YSBpZCdzICovCiAJdmFwLT5pdl9tYXhfYWlkID0gQldOX1NUQUlEX01BWDsK IAotCWllZWU4MDIxMV9yYXRlY3RsX2luaXQodmFwKTsKKwkvKiBYWFggVE9ETyBmaWxsIHRoZSBj YXAgKi8KKwlpZWVlODAyMTFfcmF0ZWN0bF9pbml0KHZhcCwgMCk7CiAKIAkvKiBjb21wbGV0ZSBz ZXR1cCAqLwogCWllZWU4MDIxMV92YXBfYXR0YWNoKHZhcCwgaWVlZTgwMjExX21lZGlhX2NoYW5n ZSwKQEAgLTg5OTEsOCArODk5Miw5IEBACiAJc3RydWN0IGJ3bl9zdGF0cyAqc3RhdHMgPSAmbWFj LT5tYWNfc3RhdHM7CiAJc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaTsKIAlzdHJ1Y3QgaWVlZTgw MjExdmFwICp2YXA7Ci0JaW50IHJldHJ5Y250ID0gMCwgc2xvdDsKLQorCS8qaW50IHJldHJ5Y250 ID0gMCwgc2xvdDsqLworCWludCBzbG90OworCQogCUJXTl9BU1NFUlRfTE9DS0VEKG1hYy0+bWFj X3NjKTsKIAogCWlmIChzdGF0dXMtPmltKQpAQCAtOTAyMCwxMSArOTAyMiwxNCBAQAogCQkJCWlm IChtZXRhLT5tdF9pc2xhc3QpIHsKIAkJCQkJbmkgPSBtZXRhLT5tdF9uaTsKIAkJCQkJdmFwID0g bmktPm5pX3ZhcDsKKyNpZiAwCiAJCQkJCWllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKHZh cCwgbmksCiAJCQkJCSAgICBzdGF0dXMtPmFjayA/CiAJCQkJCSAgICAgIElFRUU4MDIxMV9SQVRF Q1RMX1RYX1NVQ0NFU1MgOgogCQkJCQkgICAgICBJRUVFODAyMTFfUkFURUNUTF9UWF9GQUlMVVJF LAogCQkJCQkgICAgJnJldHJ5Y250LCAwKTsKKyNlbmRpZgorCQkJCQlpZWVlODAyMTFfcmF0ZWN0 bF90eF9jb21wbGV0ZSh2YXAsIG5pLCBOVUxMKTsgLyoganVzdCBtYWtlIGl0IGNvbXBpbGVkLiBx Y2MgKi8KIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCXNsb3QgPSBid25fZG1hX25leHRzbG90KGRy LCBzbG90KTsKQEAgLTkwNDEsMTEgKzkwNDYsMTQgQEAKIAkJCX0KIAkJCW5pID0gdHAtPnRwX25p OwogCQkJdmFwID0gbmktPm5pX3ZhcDsKKyNpZiAwCiAJCQlpZWVlODAyMTFfcmF0ZWN0bF90eF9j b21wbGV0ZSh2YXAsIG5pLAogCQkJICAgIHN0YXR1cy0+YWNrID8KIAkJCSAgICAgIElFRUU4MDIx MV9SQVRFQ1RMX1RYX1NVQ0NFU1MgOgogCQkJICAgICAgSUVFRTgwMjExX1JBVEVDVExfVFhfRkFJ TFVSRSwKIAkJCSAgICAmcmV0cnljbnQsIDApOworI2VuZGlmCisJCQlpZWVlODAyMTFfcmF0ZWN0 bF90eF9jb21wbGV0ZSh2YXAsIG5pLCBOVUxMKTsgLyoganVzdCBtYWtlIGl0IGNvbXBpbGVkLiBx Y2MgKi8KIAkJfQogCQlid25fcGlvX2hhbmRsZV90eGVvZihtYWMsIHN0YXR1cyk7CiAJfQpJbmRl eDogZGV2L3VzYi93bGFuL2lmX3p5ZC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRldi91c2Ivd2xhbi9pZl96 eWQuYwkocmV2aXNpb24gMjU0ODI2KQorKysgZGV2L3VzYi93bGFuL2lmX3p5ZC5jCSh3b3JraW5n IGNvcHkpCkBAIC00OTYsNyArNDk2LDggQEAKIAl6dnAtPm5ld3N0YXRlID0gdmFwLT5pdl9uZXdz dGF0ZTsKIAl2YXAtPml2X25ld3N0YXRlID0genlkX25ld3N0YXRlOwogCi0JaWVlZTgwMjExX3Jh dGVjdGxfaW5pdCh2YXApOworCS8qIFhYWCBUT0RPIGZpbGwgdGhlIGNhcCAqLworCWllZWU4MDIx MV9yYXRlY3RsX2luaXQodmFwLCAwKTsKIAlpZWVlODAyMTFfcmF0ZWN0bF9zZXRpbnRlcnZhbCh2 YXAsIDEwMDAgLyogMSBzZWMgKi8pOwogCiAJLyogY29tcGxldGUgc2V0dXAgKi8KQEAgLTY2NCwx MiArNjY1LDE1IEBACiAJCQkgKi8KIAkJCW5pID0gaWVlZTgwMjExX2ZpbmRfdHhub2RlKHZhcCwg cmV0cnktPm1hY2FkZHIpOwogCQkJaWYgKG5pICE9IE5VTEwpIHsKLQkJCQlpbnQgcmV0cnljbnQg PQotCQkJCSAgICAoaW50KShsZTE2dG9oKHJldHJ5LT5jb3VudCkgJiAweGZmKTsKKwkJCQkvKmlu dCByZXRyeWNudCA9CisJCQkJICAgIChpbnQpKGxlMTZ0b2gocmV0cnktPmNvdW50KSAmIDB4ZmYp OyovCiAJCQkJCisjaWYgMAogCQkJCWllZWU4MDIxMV9yYXRlY3RsX3R4X2NvbXBsZXRlKHZhcCwg bmksCiAJCQkJICAgIElFRUU4MDIxMV9SQVRFQ1RMX1RYX0ZBSUxVUkUsCiAJCQkJICAgICZyZXRy eWNudCwgTlVMTCk7CisjZW5kaWYKKwkJCQlpZWVlODAyMTFfcmF0ZWN0bF90eF9jb21wbGV0ZSh2 YXAsIG5pLCBOVUxMKTsgLyoganVzdCBtYWtlIGl0IGNvbXBpbGVkLiBxY2MgKi8KIAkJCQlpZWVl ODAyMTFfZnJlZV9ub2RlKG5pKTsKIAkJCX0KIAkJCWlmIChsZTE2dG9oKHJldHJ5LT5jb3VudCkg JiAweDEwMCkKSW5kZXg6IGRldi91c2Ivd2xhbi9pZl9ydW0uYwo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBkZXYv dXNiL3dsYW4vaWZfcnVtLmMJKHJldmlzaW9uIDI1NDgyNikKKysrIGRldi91c2Ivd2xhbi9pZl9y dW0uYwkod29ya2luZyBjb3B5KQpAQCAtNjEzLDcgKzYxMyw4IEBACiAKIAl1c2JfY2FsbG91dF9p bml0X210eCgmcnZwLT5yYXRlY3RsX2NoLCAmc2MtPnNjX210eCwgMCk7CiAJVEFTS19JTklUKCZy dnAtPnJhdGVjdGxfdGFzaywgMCwgcnVtX3JhdGVjdGxfdGFzaywgcnZwKTsKLQlpZWVlODAyMTFf cmF0ZWN0bF9pbml0KHZhcCk7CisJLyogWFhYIFRPRE8gZmlsbCB0aGUgY2FwICovCisJaWVlZTgw MjExX3JhdGVjdGxfaW5pdCh2YXAsIDApOwogCWllZWU4MDIxMV9yYXRlY3RsX3NldGludGVydmFs KHZhcCwgMTAwMCAvKiAxIHNlYyAqLyk7CiAJLyogY29tcGxldGUgc2V0dXAgKi8KIAlpZWVlODAy MTFfdmFwX2F0dGFjaCh2YXAsIGllZWU4MDIxMV9tZWRpYV9jaGFuZ2UsIGllZWU4MDIxMV9tZWRp YV9zdGF0dXMpOwpJbmRleDogZGV2L3VzYi93bGFuL2lmX3VyYWwuYwo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBk ZXYvdXNiL3dsYW4vaWZfdXJhbC5jCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBkZXYvdXNiL3dsYW4v aWZfdXJhbC5jCSh3b3JraW5nIGNvcHkpCkBAIC01OTgsNyArNTk4LDggQEAKIAogCXVzYl9jYWxs b3V0X2luaXRfbXR4KCZ1dnAtPnJhdGVjdGxfY2gsICZzYy0+c2NfbXR4LCAwKTsKIAlUQVNLX0lO SVQoJnV2cC0+cmF0ZWN0bF90YXNrLCAwLCB1cmFsX3JhdGVjdGxfdGFzaywgdXZwKTsKLQlpZWVl ODAyMTFfcmF0ZWN0bF9pbml0KHZhcCk7CisJLyogWFhYIFRPRE8gZmlsbCB0aGUgY2FwICovCisJ aWVlZTgwMjExX3JhdGVjdGxfaW5pdCh2YXAsIDApOwogCWllZWU4MDIxMV9yYXRlY3RsX3NldGlu dGVydmFsKHZhcCwgMTAwMCAvKiAxIHNlYyAqLyk7CiAKIAkvKiBjb21wbGV0ZSBzZXR1cCAqLwpJ bmRleDogZGV2L3VzYi93bGFuL2lmX3J1bi5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGRldi91c2Ivd2xhbi9p Zl9ydW4uYwkocmV2aXNpb24gMjU0ODI2KQorKysgZGV2L3VzYi93bGFuL2lmX3J1bi5jCSh3b3Jr aW5nIGNvcHkpCkBAIC04MjAsNyArODIwLDggQEAKIAlydnAtPm5ld3N0YXRlID0gdmFwLT5pdl9u ZXdzdGF0ZTsKIAl2YXAtPml2X25ld3N0YXRlID0gcnVuX25ld3N0YXRlOwogCi0JaWVlZTgwMjEx X3JhdGVjdGxfaW5pdCh2YXApOworCS8qIFhYWCBUT0RPIGZpbGwgdGhlIGNhcCAqLworCWllZWU4 MDIxMV9yYXRlY3RsX2luaXQodmFwLCAwKTsKIAlpZWVlODAyMTFfcmF0ZWN0bF9zZXRpbnRlcnZh bCh2YXAsIDEwMDAgLyogMSBzZWMgKi8pOwogCiAJLyogY29tcGxldGUgc2V0dXAgKi8KSW5kZXg6 IGRldi93cGkvaWZfd3BpLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZGV2L3dwaS9pZl93cGkuYwkocmV2aXNp b24gMjU0ODI2KQorKysgZGV2L3dwaS9pZl93cGkuYwkod29ya2luZyBjb3B5KQpAQCAtNzgyLDcg Kzc4Miw4IEBACiAJd3ZwLT5uZXdzdGF0ZSA9IHZhcC0+aXZfbmV3c3RhdGU7CiAJdmFwLT5pdl9u ZXdzdGF0ZSA9IHdwaV9uZXdzdGF0ZTsKIAotCWllZWU4MDIxMV9yYXRlY3RsX2luaXQodmFwKTsK KwkvKiBYWFggVE9ETyBmaWxsIHRoZSBjYXAgKi8KKwlpZWVlODAyMTFfcmF0ZWN0bF9pbml0KHZh cCwgMCk7CiAJLyogY29tcGxldGUgc2V0dXAgKi8KIAlpZWVlODAyMTFfdmFwX2F0dGFjaCh2YXAs IGllZWU4MDIxMV9tZWRpYV9jaGFuZ2UsIGllZWU4MDIxMV9tZWRpYV9zdGF0dXMpOwogCWljLT5p Y19vcG1vZGUgPSBvcG1vZGU7CkBAIC0xNTk2LDggKzE1OTcsMTEgQEAKIAkJRFBSSU5URk4oV1BJ X0RFQlVHX1RYLCAoIiVkIHJldHJpZXNcbiIsIHN0YXQtPm50cmllcykpOwogCQlyZXRyeWNudCA9 IDE7CiAJfQorI2lmIDAKIAlpZWVlODAyMTFfcmF0ZWN0bF90eF9jb21wbGV0ZSh2YXAsIG5pLCBJ RUVFODAyMTFfUkFURUNUTF9UWF9TVUNDRVNTLAogCSAgICAmcmV0cnljbnQsIE5VTEwpOworI2Vu ZGlmCisJaWVlZTgwMjExX3JhdGVjdGxfdHhfY29tcGxldGUodmFwLCBuaSwgTlVMTCk7IC8qIGp1 c3QgbWFrZSBpdCBjb21waWxlZC4gcWNjICovCiAKIAkvKiBYWFggb2Vycm9ycyBzaG91bGQgb25s eSBjb3VudCBlcnJvcnMgIW1heHRyaWVzICovCiAJaWYgKChsZTMydG9oKHN0YXQtPnN0YXR1cykg JiAweGZmKSAhPSAxKQpJbmRleDogbmV0ODAyMTEvaWVlZTgwMjExX2ZyZWVic2QuYwo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09Ci0tLSBuZXQ4MDIxMS9pZWVlODAyMTFfZnJlZWJzZC5jCShyZXZpc2lvbiAyNTQ4MjYpCisr KyBuZXQ4MDIxMS9pZWVlODAyMTFfZnJlZWJzZC5jCSh3b3JraW5nIGNvcHkpCkBAIC0yNjIsNyAr MjYyLDkgQEAKIAkJImRyaXZlcl9jYXBzIiwgQ1RMRkxBR19SVywgJnZhcC0+aXZfY2FwcywgMCwK IAkJImRyaXZlciBjYXBhYmlsaXRpZXMiKTsKICNpZmRlZiBJRUVFODAyMTFfREVCVUcKKwlpZWVl ODAyMTFfZGVidWcgfD0gKElFRUU4MDIxMV9NU0dfUkFURUNUTHxJRUVFODAyMTFfTVNHX05PREV8 SUVFRTgwMjExX01TR19TQ0FOKTsKIAl2YXAtPml2X2RlYnVnID0gaWVlZTgwMjExX2RlYnVnOwor CWlmX3ByaW50ZihpZnAsICIlczogaXZfZGVidWc9MHglMDh4XG4iLCBfX2Z1bmNfXywgdmFwLT5p dl9kZWJ1Zyk7CiAJU1lTQ1RMX0FERF9VSU5UKGN0eCwgU1lTQ1RMX0NISUxEUkVOKG9pZCksIE9J RF9BVVRPLAogCQkiZGVidWciLCBDVExGTEFHX1JXLCAmdmFwLT5pdl9kZWJ1ZywgMCwKIAkJImNv bnRyb2wgZGVidWdnaW5nIHByaW50ZnMiKTsKSW5kZXg6IG5ldDgwMjExL2llZWU4MDIxMV9yc3Nh ZGFwdC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KLS0tIG5ldDgwMjExL2llZWU4MDIxMV9yc3NhZGFwdC5jCShyZXZp c2lvbiAyNTQ4MjYpCisrKyBuZXQ4MDIxMS9pZWVlODAyMTFfcnNzYWRhcHQuYwkod29ya2luZyBj b3B5KQpAQCAtNzQsNyArNzQsNyBAQAogCQkJCSAgICBwYXJtIyNfZGVub20pCiAKIHN0YXRpYyB2 b2lkCXJzc2FkYXB0X3NldGludGVydmFsKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKiwgaW50 KTsKLXN0YXRpYyB2b2lkCXJzc2FkYXB0X2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKK3N0 YXRpYyB2b2lkCXJzc2FkYXB0X2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqLCB1aW50MzJfdCk7 CiBzdGF0aWMgdm9pZAlyc3NhZGFwdF9kZWluaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKIHN0 YXRpYyB2b2lkCXJzc2FkYXB0X3VwZGF0ZXN0YXRzKHN0cnVjdCBpZWVlODAyMTFfcnNzYWRhcHRf bm9kZSAqKTsKIHN0YXRpYyB2b2lkCXJzc2FkYXB0X25vZGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjEx X25vZGUgKik7CkBAIC04NCw4ICs4NCw3IEBACiBzdGF0aWMgdm9pZAlyc3NhZGFwdF9yYWlzZV9y YXRlKHN0cnVjdCBpZWVlODAyMTFfcnNzYWRhcHRfbm9kZSAqLAogCQkJaW50LCBpbnQpOwogc3Rh dGljIHZvaWQJcnNzYWRhcHRfdHhfY29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAq LAotICAgIAkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBpbnQsCi0JCQl2b2lkICos IHZvaWQgKik7CisgICAgCQkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICosIHN0cnVjdCBp ZWVlODAyMTFfcmNfaW5mbyAqKTsKIHN0YXRpYyB2b2lkCXJzc2FkYXB0X3N5c2N0bGF0dGFjaChz dHJ1Y3QgaWVlZTgwMjExdmFwICosCiAJCQlzdHJ1Y3Qgc3lzY3RsX2N0eF9saXN0ICosIHN0cnVj dCBzeXNjdGxfb2lkICopOwogCkBAIC0xMjEsNyArMTIwLDcgQEAKIH0KIAogc3RhdGljIHZvaWQK LXJzc2FkYXB0X2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwKQorcnNzYWRhcHRfaW5pdChz dHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsIHVpbnQzMl90IGNhcGFiaWxpdGllcykKIHsKIAlzdHJ1 Y3QgaWVlZTgwMjExX3Jzc2FkYXB0ICpyczsKIApAQCAtMTM0LDYgKzEzMywxMCBAQAogCQlpZl9w cmludGYodmFwLT5pdl9pZnAsICJjb3VsZG4ndCBhbGxvYyByYXRlY3RsIHN0cnVjdHVyZVxuIik7 CiAJCXJldHVybjsKIAl9CisKKwlzdHJ1Y3QgaWVlZTgwMjExX3JjX3N0YXQgKiBpcnMgPSBJRUVF ODAyMTFfUkFURUNUTF9TVEFUKHZhcCk7CisJaXJzLT5pcnNfY2FwYWJpbGl0aWVzID0gY2FwYWJp bGl0aWVzOworCiAJcnMtPnZhcCA9IHZhcDsKIAlyc3NhZGFwdF9zZXRpbnRlcnZhbCh2YXAsIDUw MCAvKiBtc2VjcyAqLyk7CiAJcnNzYWRhcHRfc3lzY3RsYXR0YWNoKHZhcCwgdmFwLT5pdl9zeXNj dGwsIHZhcC0+aXZfb2lkKTsKQEAgLTMwNywxMCArMzEwLDExIEBACiAKIHN0YXRpYyB2b2lkCiBy c3NhZGFwdF90eF9jb21wbGV0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCi0gICAg Y29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgaW50IHN1Y2Nlc3MsIHZvaWQgKmFyZzEs IHZvaWQgKmFyZzIpCisgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3RydWN0 IGllZWU4MDIxMV9yY19pbmZvICpyY19pbmZvKQogewogCXN0cnVjdCBpZWVlODAyMTFfcnNzYWRh cHRfbm9kZSAqcmEgPSBuaS0+bmlfcmN0bHM7Ci0JaW50IHBrdGxlbiA9ICooaW50ICopYXJnMSwg cnNzaSA9ICooaW50ICopYXJnMjsKKwkvKmludCBwa3RsZW4gPSAqKGludCAqKWFyZzEsIHJzc2kg PSAqKGludCAqKWFyZzI7Ki8KKwlpbnQgcGt0bGVuID0gMCwgcnNzaSA9IDAsIHN1Y2Nlc3MgPSAw OyAvKiBqdXN0IG1ha2UgaXQgY29tcGlsZWQuIHFjYyAqLwogCiAJaWYgKHN1Y2Nlc3MpIHsKIAkJ cmEtPnJhX25vaysrOwpJbmRleDogbmV0ODAyMTEvaWVlZTgwMjExX2FtcnIuYwo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBuZXQ4MDIxMS9pZWVlODAyMTFfYW1yci5jCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBuZXQ4 MDIxMS9pZWVlODAyMTFfYW1yci5jCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw4ICs0Nyw4IEBACiAK ICNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfdmFyLmg+CiAjaW5jbHVkZSA8bmV0ODAyMTEv aWVlZTgwMjExX2h0Lmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4K ICNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAyMTFfYW1yci5oPgotI2luY2x1ZGUgPG5ldDgwMjEx L2llZWU4MDIxMV9yYXRlY3RsLmg+CiAKICNkZWZpbmUgaXNfc3VjY2VzcyhhbW4pCVwKIAkoKGFt biktPmFtbl9yZXRyeWNudCA8IChhbW4pLT5hbW5fdHhjbnQgLyAxMCkKQEAgLTU4LDE4ICs1OCwx OSBAQAogCSgoYW1uKS0+YW1uX3R4Y250ID4gMTApCiAKIHN0YXRpYyB2b2lkCWFtcnJfc2V0aW50 ZXJ2YWwoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqLCBpbnQpOwotc3RhdGljIHZvaWQJYW1y cl9pbml0KHN0cnVjdCBpZWVlODAyMTF2YXAgKik7CitzdGF0aWMgdm9pZAlhbXJyX2luaXQoc3Ry dWN0IGllZWU4MDIxMXZhcCAqLCB1aW50MzJfdCk7CiBzdGF0aWMgdm9pZAlhbXJyX2RlaW5pdChz dHJ1Y3QgaWVlZTgwMjExdmFwICopOwogc3RhdGljIHZvaWQJYW1ycl9ub2RlX2luaXQoc3RydWN0 IGllZWU4MDIxMV9ub2RlICopOwogc3RhdGljIHZvaWQJYW1ycl9ub2RlX2RlaW5pdChzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKik7CiBzdGF0aWMgaW50CWFtcnJfdXBkYXRlKHN0cnVjdCBpZWVlODAy MTFfYW1yciAqLAogICAgIAkJCXN0cnVjdCBpZWVlODAyMTFfYW1ycl9ub2RlICosIHN0cnVjdCBp ZWVlODAyMTFfbm9kZSAqKTsKIHN0YXRpYyBpbnQJYW1ycl9yYXRlKHN0cnVjdCBpZWVlODAyMTFf bm9kZSAqLCB2b2lkICosIHVpbnQzMl90KTsKK3N0YXRpYyB2b2lkCWFtcnJfcmF0ZXMoc3RydWN0 IGllZWU4MDIxMV9ub2RlICosIHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqKTsKIHN0YXRpYyB2 b2lkCWFtcnJfdHhfY29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqLAotICAgIAkJ CWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBpbnQsIAotCQkJdm9pZCAqLCB2b2lkICop Owotc3RhdGljIHZvaWQJYW1ycl90eF91cGRhdGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAq dmFwLAorICAgIAkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCBzdHJ1Y3QgaWVlZTgw MjExX3JjX2luZm8gKik7CitzdGF0aWMgdm9pZAlhbXJyX3R4X3VwZGF0ZShjb25zdCBzdHJ1Y3Qg aWVlZTgwMjExdmFwICosCiAJCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgdm9pZCAq LCB2b2lkICosIHZvaWQgKik7CitzdGF0aWMgdm9pZAlhbXJyX3N0YXRzKGNvbnN0IHN0cnVjdCBp ZWVlODAyMTF2YXAgKik7CiBzdGF0aWMgdm9pZAlhbXJyX3N5c2N0bGF0dGFjaChzdHJ1Y3QgaWVl ZTgwMjExdmFwICosCiAJCQlzdHJ1Y3Qgc3lzY3RsX2N0eF9saXN0ICosIHN0cnVjdCBzeXNjdGxf b2lkICopOwogCkBAIC04NSw5ICs4NiwxMSBAQAogCS5pcl9ub2RlX2luaXQJPSBhbXJyX25vZGVf aW5pdCwKIAkuaXJfbm9kZV9kZWluaXQJPSBhbXJyX25vZGVfZGVpbml0LAogCS5pcl9yYXRlCT0g YW1ycl9yYXRlLAorCS5pcl9yYXRlcwk9IGFtcnJfcmF0ZXMsCiAJLmlyX3R4X2NvbXBsZXRlCT0g YW1ycl90eF9jb21wbGV0ZSwKIAkuaXJfdHhfdXBkYXRlCT0gYW1ycl90eF91cGRhdGUsCiAJLmly X3NldGludGVydmFsCT0gYW1ycl9zZXRpbnRlcnZhbCwKKwkuaXJfc3RhdHMJPSBhbXJyX3N0YXRz LAogfTsKIElFRUU4MDIxMV9SQVRFQ1RMX01PRFVMRShhbXJyLCAxKTsKIElFRUU4MDIxMV9SQVRF Q1RMX0FMRyhhbXJyLCBJRUVFODAyMTFfUkFURUNUTF9BTVJSLCBhbXJyKTsKQEAgLTEwNSw3ICsx MDgsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotYW1ycl9pbml0KHN0cnVjdCBpZWVlODAyMTF2YXAg KnZhcCkKK2FtcnJfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsIHVpbnQzMl90IGNhcGFi aWxpdGllcykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2FtcnIgKmFtcnI7CiAKQEAgLTExNyw2ICsx MjAsMTAgQEAKIAkJaWZfcHJpbnRmKHZhcC0+aXZfaWZwLCAiY291bGRuJ3QgYWxsb2MgcmF0ZWN0 bCBzdHJ1Y3R1cmVcbiIpOwogCQlyZXR1cm47CiAJfQorCisJc3RydWN0IGllZWU4MDIxMV9yY19z dGF0ICogaXJzID0gSUVFRTgwMjExX1JBVEVDVExfU1RBVCh2YXApOworCWlycy0+aXJzX2NhcGFi aWxpdGllcyA9IGNhcGFiaWxpdGllczsKKwogCWFtcnItPmFtcnJfbWluX3N1Y2Nlc3NfdGhyZXNo b2xkID0gSUVFRTgwMjExX0FNUlJfTUlOX1NVQ0NFU1NfVEhSRVNIT0xEOwogCWFtcnItPmFtcnJf bWF4X3N1Y2Nlc3NfdGhyZXNob2xkID0gSUVFRTgwMjExX0FNUlJfTUFYX1NVQ0NFU1NfVEhSRVNI T0xEOwogCWFtcnJfc2V0aW50ZXJ2YWwodmFwLCA1MDAgLyogbXMgKi8pOwpAQCAtMTI5LDE3ICsx MzYsNiBAQAogCWZyZWUodmFwLT5pdl9ycywgTV84MDIxMV9SQVRFQ1RMKTsKIH0KIAotc3RhdGlj IGludAotYW1ycl9ub2RlX2lzXzExbihzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQotewotCi0J aWYgKG5pLT5uaV9jaGFuID09IE5VTEwpCi0JCXJldHVybiAoMCk7Ci0JaWYgKG5pLT5uaV9jaGFu ID09IElFRUU4MDIxMV9DSEFOX0FOWUMpCi0JCXJldHVybiAoMCk7Ci0JcmV0dXJuIChJRUVFODAy MTFfSVNfQ0hBTl9IVChuaS0+bmlfY2hhbikpOwotfQotCiBzdGF0aWMgdm9pZAogYW1ycl9ub2Rl X2luaXQoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKIHsKQEAgLTE1OSwyOSArMTU1LDIwIEBA CiAJCX0KIAl9IGVsc2UKIAkJYW1uID0gbmktPm5pX3JjdGxzOworCiAJYW1uLT5hbW5fYW1yciA9 IGFtcnI7CiAJYW1uLT5hbW5fc3VjY2VzcyA9IDA7CiAJYW1uLT5hbW5fcmVjb3ZlcnkgPSAwOwog CWFtbi0+YW1uX3R4Y250ID0gYW1uLT5hbW5fcmV0cnljbnQgPSAwOwogCWFtbi0+YW1uX3N1Y2Nl c3NfdGhyZXNob2xkID0gYW1yci0+YW1ycl9taW5fc3VjY2Vzc190aHJlc2hvbGQ7CiAKLQkvKiAx MW4gb3Igbm90PyBQaWNrIHRoZSByaWdodCByYXRlc2V0ICovCi0JaWYgKGFtcnJfbm9kZV9pc18x MW4obmkpKSB7Ci0JCS8qIFhYWCBldyAqLwotCQlJRUVFODAyMTFfTk9URShuaS0+bmlfdmFwLCBJ RUVFODAyMTFfTVNHX1JBVEVDVEwsIG5pLAotCQkgICAgIiVzOiAxMW4gbm9kZSIsIF9fZnVuY19f KTsKLQkJcnMgPSAoc3RydWN0IGllZWU4MDIxMV9yYXRlc2V0ICopICZuaS0+bmlfaHRyYXRlczsK LQl9IGVsc2UgewotCQlJRUVFODAyMTFfTk9URShuaS0+bmlfdmFwLCBJRUVFODAyMTFfTVNHX1JB VEVDVEwsIG5pLAotCQkgICAgIiVzOiBub24tMTFuIG5vZGUiLCBfX2Z1bmNfXyk7Ci0JCXJzID0g Jm5pLT5uaV9yYXRlczsKLQl9CisJcnMgPSBpZWVlODAyMTFfcmF0ZWN0bF9nZXRfcmF0ZXNldChu aSk7CiAKIAkvKiBJbml0aWFsIHJhdGUgLSBsb3dlc3QgKi8KIAlyYXRlID0gcnMtPnJzX3JhdGVz WzBdOwogCiAJLyogWFhYIGNsZWFyIHRoZSBiYXNpYyByYXRlIGZsYWcgaWYgaXQncyBub3QgMTFu ICovCi0JaWYgKCEgYW1ycl9ub2RlX2lzXzExbihuaSkpCisJaWYgKCEgaWVlZTgwMjExX3JhdGVj dGxfbm9kZV9pczExbihuaSkpCiAJCXJhdGUgJj0gSUVFRTgwMjExX1JBVEVfVkFMOwogCiAJLyog cGljayBpbml0aWFsIHJhdGUgZnJvbSB0aGUgcmF0ZXNldCAtIEhUIG9yIG90aGVyd2lzZSAqLwpA QCAtMTg5LDcgKzE3Niw3IEBACiAJICAgIGFtbi0+YW1uX3JpeC0tKSB7CiAJCS8qIGxlZ2FjeSAt IGFueXRoaW5nIDwgMzZtYml0LCBzdG9wIHNlYXJjaGluZyAqLwogCQkvKiAxMW4gLSBzdG9wIGF0 IE1DUzQgLyBNQ1MxMiAvIE1DUzI4ICovCi0JCWlmIChhbXJyX25vZGVfaXNfMTFuKG5pKSAmJgor CQlpZiAoaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pczExbihuaSkgJiYKIAkJICAgIChycy0+cnNf cmF0ZXNbYW1uLT5hbW5fcml4XSAmIDB4NykgPCA0KQogCQkJYnJlYWs7CiAJCWVsc2UgaWYgKChy cy0+cnNfcmF0ZXNbYW1uLT5hbW5fcml4XSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkgPD0gNzIpCkBA IC0xOTgsNyArMTg1LDcgQEAKIAl9CiAKIAkvKiBpZiB0aGUgcmF0ZSBpcyBhbiAxMW4gcmF0ZSwg ZW5zdXJlIHRoZSBNQ1MgYml0IGlzIHNldCAqLwotCWlmIChhbXJyX25vZGVfaXNfMTFuKG5pKSkK KwlpZiAoaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pczExbihuaSkpCiAJCXJhdGUgfD0gSUVFRTgw MjExX1JBVEVfTUNTOwogCiAJLyogQXNzaWduIGluaXRpYWwgcmF0ZSBmcm9tIHRoZSByYXRlc2V0 ICovCkBAIC0yMDYsOSArMTkzLDggQEAKIAlhbW4tPmFtbl90aWNrcyA9IHRpY2tzOwogCiAJSUVF RTgwMjExX05PVEUobmktPm5pX3ZhcCwgSUVFRTgwMjExX01TR19SQVRFQ1RMLCBuaSwKLQkgICAg IkFNUlI6IG5yYXRlcz0lZCwgaW5pdGlhbCByYXRlICVkIiwKLQkgICAgcnMtPnJzX25yYXRlcywK LQkgICAgcmF0ZSk7CisJICAgICIlczogQU1SUjogbnJhdGVzPSVkLCBpbml0aWFsIHJhdGUgJWQi LAorCQlfX2Z1bmNfXywgcnMtPnJzX25yYXRlcywgcmF0ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBA IC0yMjYsMTcgKzIxMiwxMiBAQAogCiAJS0FTU0VSVChpc19lbm91Z2goYW1uKSwgKCJ0eGNudCAl ZCIsIGFtbi0+YW1uX3R4Y250KSk7CiAKLQkvKiAxMW4gb3Igbm90PyBQaWNrIHRoZSByaWdodCBy YXRlc2V0ICovCi0JaWYgKGFtcnJfbm9kZV9pc18xMW4obmkpKSB7Ci0JCS8qIFhYWCBldyAqLwot CQlycyA9IChzdHJ1Y3QgaWVlZTgwMjExX3JhdGVzZXQgKikgJm5pLT5uaV9odHJhdGVzOwotCX0g ZWxzZSB7Ci0JCXJzID0gJm5pLT5uaV9yYXRlczsKLQl9CisJcnMgPSBpZWVlODAyMTFfcmF0ZWN0 bF9nZXRfcmF0ZXNldChuaSk7CiAKKwogCUlFRUU4MDIxMV9OT1RFKG5pLT5uaV92YXAsIElFRUU4 MDIxMV9NU0dfUkFURUNUTCwgbmksCi0JICAgICJBTVJSOiBjdXJyZW50IHJhdGUgJWQsIHR4Y250 PSVkLCByZXRyeWNudD0lZCIsCi0JICAgIHJzLT5yc19yYXRlc1tyaXhdICYgSUVFRTgwMjExX1JB VEVfVkFMLAorCSAgICAiJXM6IEFNUlI6IGN1cnJlbnQgcmF0ZSAlZCwgdHhjbnQ9JWQsIHJldHJ5 Y250PSVkIiwKKwkgICAgX19mdW5jX18sIHJzLT5yc19yYXRlc1tyaXhdICYgSUVFRTgwMjExX1JB VEVfVkFMLAogCSAgICBhbW4tPmFtbl90eGNudCwKIAkgICAgYW1uLT5hbW5fcmV0cnljbnQpOwog CkBAIC0yNTYsOCArMjM3LDggQEAKIAkJCWFtbi0+YW1uX3N1Y2Nlc3MgPSAwOwogCQkJcml4Kys7 CiAJCQlJRUVFODAyMTFfTk9URShuaS0+bmlfdmFwLCBJRUVFODAyMTFfTVNHX1JBVEVDVEwsIG5p LAotCQkJICAgICJBTVJSIGluY3JlYXNpbmcgcmF0ZSAlZCAodHhjbnQ9JWQgcmV0cnljbnQ9JWQp IiwKLQkJCSAgICBycy0+cnNfcmF0ZXNbcml4XSAmIElFRUU4MDIxMV9SQVRFX1ZBTCwKKwkJCSAg ICAiJXM6IEFNUlIgaW5jcmVhc2luZyByYXRlICVkICh0eGNudD0lZCByZXRyeWNudD0lZCkiLAor CQkJICAgIF9fZnVuY19fLCBycy0+cnNfcmF0ZXNbcml4XSAmIElFRUU4MDIxMV9SQVRFX1ZBTCwK IAkJCSAgICBhbW4tPmFtbl90eGNudCwgYW1uLT5hbW5fcmV0cnljbnQpOwogCQl9IGVsc2Ugewog CQkJYW1uLT5hbW5fcmVjb3ZlcnkgPSAwOwpAQCAtMjc3LDggKzI1OCw4IEBACiAJCQl9CiAJCQly aXgtLTsKIAkJCUlFRUU4MDIxMV9OT1RFKG5pLT5uaV92YXAsIElFRUU4MDIxMV9NU0dfUkFURUNU TCwgbmksCi0JCQkgICAgIkFNUlIgZGVjcmVhc2luZyByYXRlICVkICh0eGNudD0lZCByZXRyeWNu dD0lZCkiLAotCQkJICAgIHJzLT5yc19yYXRlc1tyaXhdICYgSUVFRTgwMjExX1JBVEVfVkFMLAor CQkJICAgICIlczogQU1SUiBkZWNyZWFzaW5nIHJhdGUgJWQgKHR4Y250PSVkIHJldHJ5Y250PSVk KSIsCisJCQkgICAgX19mdW5jX18sIHJzLT5yc19yYXRlc1tyaXhdICYgSUVFRTgwMjExX1JBVEVf VkFMLAogCQkJICAgIGFtbi0+YW1uX3R4Y250LCBhbW4tPmFtbl9yZXRyeWNudCk7CiAJCX0KIAkJ YW1uLT5hbW5fcmVjb3ZlcnkgPSAwOwpAQCAtMzA0LDEzICsyODUsNyBAQAogCWNvbnN0IHN0cnVj dCBpZWVlODAyMTFfcmF0ZXNldCAqcnMgPSBOVUxMOwogCWludCByaXg7CiAKLQkvKiAxMW4gb3Ig bm90PyBQaWNrIHRoZSByaWdodCByYXRlc2V0ICovCi0JaWYgKGFtcnJfbm9kZV9pc18xMW4obmkp KSB7Ci0JCS8qIFhYWCBldyAqLwotCQlycyA9IChzdHJ1Y3QgaWVlZTgwMjExX3JhdGVzZXQgKikg Jm5pLT5uaV9odHJhdGVzOwotCX0gZWxzZSB7Ci0JCXJzID0gJm5pLT5uaV9yYXRlczsKLQl9CisJ cnMgPSBpZWVlODAyMTFfcmF0ZWN0bF9nZXRfcmF0ZXNldChuaSk7CiAKIAlpZiAoaXNfZW5vdWdo KGFtbikgJiYgKHRpY2tzIC0gYW1uLT5hbW5fdGlja3MpID4gYW1yci0+YW1ycl9pbnRlcnZhbCkg ewogCQlyaXggPSBhbXJyX3VwZGF0ZShhbXJyLCBhbW4sIG5pKTsKQEAgLTMxOCw3ICsyOTMsNyBA QAogCQkJLyogdXBkYXRlIHB1YmxpYyByYXRlICovCiAJCQluaS0+bmlfdHhyYXRlID0gcnMtPnJz X3JhdGVzW3JpeF07CiAJCQkvKiBYWFggc3RyaXAgYmFzaWMgcmF0ZSBmbGFnIGZyb20gdHhyYXRl LCBpZiBub24tMTFuICovCi0JCQlpZiAoYW1ycl9ub2RlX2lzXzExbihuaSkpCisJCQlpZiAoaWVl ZTgwMjExX3JhdGVjdGxfbm9kZV9pczExbihuaSkpCiAJCQkJbmktPm5pX3R4cmF0ZSB8PSBJRUVF ODAyMTFfUkFURV9NQ1M7CiAJCQllbHNlCiAJCQkJbmktPm5pX3R4cmF0ZSAmPSBJRUVFODAyMTFf UkFURV9WQUw7CkBAIC0zMzAsNiArMzA1LDc2IEBACiAJcmV0dXJuIHJpeDsKIH0KIAorc3RhdGlj IHZvaWQKK2FtcnJfcmF0ZXMoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3RydWN0IGllZWU4 MDIxMV9yY19pbmZvICpyY19pbmZvKQoreworI2RlZmluZQlSQVRFKF9peCkJKHJzLT5yc19yYXRl c1soX2l4KV0gJiBJRUVFODAyMTFfUkFURV9WQUwpCisjZGVmaW5lCU1DUyhfaXgpCShycy0+cnNf cmF0ZXNbKF9peCldIHwgSUVFRTgwMjExX1JBVEVfTUNTKQorCXN0cnVjdCBpZWVlODAyMTFfcmNf c2VyaWVzICpyYyA9IHJjX2luZm8tPmlyaV9yYzsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3Jh dGVzZXQgKnJzID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0 ID0gTlVMTDsKKwlpbnQgcml4LCBjb2RlOworCisJcnMgPSBpZWVlODAyMTFfcmF0ZWN0bF9nZXRf cmF0ZXNldChuaSk7CisJcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZShuaS0+bmlfaWMtPmlj X2N1cmNoYW4pOworCUlFRUU4MDIxMV9EUFJJTlRGKG5pLT5uaV92YXAsIElFRUU4MDIxMV9NU0df UkFURUNUTCwgCisJICAgICIlczogY2hhbm5lbCBmbGFnczogMHglMDh4XG4iLCBfX2Z1bmNfXywg CisJCW5pLT5uaV9pYy0+aWNfY3VyY2hhbi0+aWNfZmxhZ3MpOyAKKwkKKwlyaXggPSBhbXJyX3Jh dGUobmksIE5VTEwsIDApOworCisJcmNbMF0uZmxhZ3MgPSByY1sxXS5mbGFncyA9IHJjWzJdLmZs YWdzID0gcmNbM10uZmxhZ3MgPSAwOworCisJaWYgKHJzLT5yc19ucmF0ZXMgPiAwKSB7CisJCWNv ZGUgPSBpZWVlODAyMTFfcmF0ZWN0bF9ub2RlX2lzMTFuKG5pKT8gTUNTKHJpeCkgOiBSQVRFKHJp eCk7CisJCXJjWzBdLnJpeCA9IHJ0LT5yYXRlQ29kZVRvSW5kZXhbY29kZV07CisKKwkJaWYgKElF RUU4MDIxMV9SQVRFQ1RMX0hBU0NBUF9NUlIobmktPm5pX3ZhcCkpIHsKKwkJCXJjWzBdLnRyaWVz ID0gMTsKKwkJCXJjWzFdLnRyaWVzID0gMTsKKwkJCXJjWzJdLnRyaWVzID0gMTsKKwkJCXJjWzNd LnRyaWVzID0gMTsKKwkJCWlmICgtLXJpeCA+PSAwKSB7CisJCQkJY29kZSA9IGllZWU4MDIxMV9y YXRlY3RsX25vZGVfaXMxMW4obmkpPyBNQ1Mocml4KSA6IFJBVEUocml4KTsKKwkJCQlyY1sxXS5y aXggPSBydC0+cmF0ZUNvZGVUb0luZGV4W2NvZGVdOworCQkJfSBlbHNlIHsKKwkJCQlyY1sxXS5y aXggPSBydC0+cmF0ZUNvZGVUb0luZGV4WzBdOworCQkJfQorCQkJaWYgKC0tcml4ID49IDApIHsK KwkJCQljb2RlID0gaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pczExbihuaSk/IE1DUyhyaXgpIDog UkFURShyaXgpOworCQkJCXJjWzJdLnJpeCA9IHJ0LT5yYXRlQ29kZVRvSW5kZXhbY29kZV07CisJ CQl9IGVsc2UgeworCQkJCXJjWzJdLnJpeCA9IHJ0LT5yYXRlQ29kZVRvSW5kZXhbMF07CisJCQl9 CisJCQlpZiAocml4ID49IDApIHsKKwkJCQkvKiBOQjogb25seSBkbyB0aGlzIGlmIHdlIGRpZG4n dCBhbHJlYWR5IGRvIGl0IGFib3ZlICovCisJCQkJY29kZSA9IGllZWU4MDIxMV9yYXRlY3RsX25v ZGVfaXMxMW4obmkpPyBNQ1MoMCkgOiBSQVRFKDApOworCQkJCXJjWzNdLnJpeCA9IHJ0LT5yYXRl Q29kZVRvSW5kZXhbY29kZV07CisJCQl9IGVsc2UgeworCQkJCXJjWzNdLnJpeCA9IHJ0LT5yYXRl Q29kZVRvSW5kZXhbMF07CisJCQl9CisJCX0gZWxzZSB7CisJCQlyY1swXS50cmllcyA9IElFRUU4 MDIxMV9SQVRFQ1RMX1RYTUFYVFJZOworCisJCQlyY1sxXS50cmllcyA9IDA7CisJCQlyY1syXS50 cmllcyA9IDA7CisJCQlyY1szXS50cmllcyA9IDA7CisJCQlyY1sxXS5yaXggPSBydC0+cmF0ZUNv ZGVUb0luZGV4WzBdOworCQkJcmNbMl0ucml4ID0gcnQtPnJhdGVDb2RlVG9JbmRleFswXTsKKwkJ CXJjWzNdLnJpeCA9IHJ0LT5yYXRlQ29kZVRvSW5kZXhbMF07CisJCX0KKwl9CisJSUVFRTgwMjEx X05PVEUobmktPm5pX3ZhcCwgSUVFRTgwMjExX01TR19SQVRFQ1RMLCBuaSwKKwkgICAgIiVzOiBB TVJSIHJhdGUgc2V0cyhyaXgsIHRyaWVzKS4gcmNbMF06KCVkLCAlZCksIHJjWzFdOiglZCwgJWQp LCAiIAorCQkicmNbMl06KCVkLCAlZCksIHJjWzNdOiglZCwgJWQpIiwgX19mdW5jX18sIAorCQly Y1swXS5yaXgsIHJjWzBdLnRyaWVzLAorCQlyY1sxXS5yaXgsIHJjWzFdLnRyaWVzLCAKKwkJcmNb Ml0ucml4LCByY1syXS50cmllcywgCisJCXJjWzNdLnJpeCwgcmNbM10udHJpZXMpOworI3VuZGVm IFJBVEUKKyN1bmRlZiBNQ1MKK30KKwogLyoKICAqIFVwZGF0ZSBzdGF0aXN0aWNzIHdpdGggdHgg Y29tcGxldGUgc3RhdHVzLiAgT2sgaXMgbm9uLXplcm8KICAqIGlmIHRoZSBwYWNrZXQgaXMga25v d24gdG8gYmUgQUNLJ2QuICBSZXRyaWVzIGhhcyB0aGUgbnVtYmVyCkBAIC0zMzcsMTYgKzM4Miwy MiBAQAogICovCiBzdGF0aWMgdm9pZAogYW1ycl90eF9jb21wbGV0ZShjb25zdCBzdHJ1Y3QgaWVl ZTgwMjExdmFwICp2YXAsCi0gICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgaW50 IG9rLAotICAgIHZvaWQgKmFyZzEsIHZvaWQgKmFyZzIgX191bnVzZWQpCisgICAgY29uc3Qgc3Ry dWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3RydWN0IGllZWU4MDIxMV9yY19pbmZvICpyY19pbmZv KQogewogCXN0cnVjdCBpZWVlODAyMTFfYW1ycl9ub2RlICphbW4gPSBuaS0+bmlfcmN0bHM7Ci0J aW50IHJldHJpZXMgPSAqKGludCAqKWFyZzE7CiAKLQlhbW4tPmFtbl90eGNudCsrOwotCWlmIChv aykKLQkJYW1uLT5hbW5fc3VjY2VzcysrOwotCWFtbi0+YW1uX3JldHJ5Y250ICs9IHJldHJpZXM7 CisJLyogdXBkYXRlIHBlciB2YXAgc3RhdGlzdGljcyAqLworCWllZWU4MDIxMV9yYXRlY3RsX3Vw ZGF0ZV9zdGF0KHZhcCwgcmNfaW5mbyk7CisKKwlhbW4tPmFtbl90eGNudCArPSByY19pbmZvLT5p cmlfdHhjbnQ7CisJYW1uLT5hbW5fc3VjY2VzcyArPSAocmNfaW5mby0+aXJpX3R4Y250IC0gcmNf aW5mby0+aXJpX2ZhaWxjbnQpOworCWFtbi0+YW1uX3JldHJ5Y250ICs9IHJjX2luZm8tPmlyaV9y ZXRyeWNudDsKKworCUlFRUU4MDIxMV9OT1RFKHZhcCwgSUVFRTgwMjExX01TR19SQVRFQ1RMLCBu aSwKKwkgICAgIiVzOiBBTVJSIHR4IGNvbXBsZXRlLiB0eGNudD0lZCglZCkgc3VjY2Vzcz0lZCgl ZCkgcmV0cnljbnQ9JWQoJWQpXG4iLAorCSAgICBfX2Z1bmNfXywgYW1uLT5hbW5fdHhjbnQsIHJj X2luZm8tPmlyaV90eGNudCwKKwkJYW1uLT5hbW5fc3VjY2VzcywgKHJjX2luZm8tPmlyaV90eGNu dCAtIHJjX2luZm8tPmlyaV9mYWlsY250KSwKKwkJYW1uLT5hbW5fcmV0cnljbnQsIHJjX2luZm8t PmlyaV9yZXRyeWNudCk7CiB9CiAKIC8qCkBAIC0zNjQsOCArNDE1LDIxIEBACiAJYW1uLT5hbW5f dHhjbnQgPSB0eGNudDsKIAlhbW4tPmFtbl9zdWNjZXNzID0gc3VjY2VzczsKIAlhbW4tPmFtbl9y ZXRyeWNudCA9IHJldHJ5Y250OworCUlFRUU4MDIxMV9OT1RFKHZhcCwgSUVFRTgwMjExX01TR19S QVRFQ1RMLCBuaSwKKwkgICAgIiVzOiBBTVJSIHR4IHVwZGF0ZS4gdHhjbnQ9JWQgc3VjY2Vzcz0l ZCByZXRyeWNudD0lZFxuIiwKKwkgICAgX19mdW5jX18sIHR4Y250LCBzdWNjZXNzLCByZXRyeWNu dCk7CiB9CiAKK3N0YXRpYyB2b2lkCithbXJyX3N0YXRzKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2 YXAgKnZhcCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3JjX3N0YXQgKiBpcnMgPSBJRUVFODAyMTFf UkFURUNUTF9TVEFUKHZhcCk7CisJcHJpbnRmKCJ0eCBjb3VudDogJWQgKG9rIGNvdW50OiAlZCwg ZmFpbCBjb3VudDogJWQpXG4iCisJCQkicmV0cnkgY291bnQ6ICVkIChzaG9ydCByZXRyeTogJWQs IGxvbmcgcmV0cnk6ICVkKVxuIiwKKwkJCWlycy0+aXJzX3R4Y250LCBpcnMtPmlyc190eGNudCAt IGlycy0+aXJzX2ZhaWxjbnQsIGlycy0+aXJzX2ZhaWxjbnQsCisJCQlpcnMtPmlyc19yZXRyeWNu dCwgaXJzLT5pcnNfc2hvcnRyZXRyeSwgaXJzLT5pcnNfbG9uZ3JldHJ5KTsKK30KKwogc3RhdGlj IGludAogYW1ycl9zeXNjdGxfaW50ZXJ2YWwoU1lTQ1RMX0hBTkRMRVJfQVJHUykKIHsKSW5kZXg6 IG5ldDgwMjExL2llZWU4MDIxMV9ub2RlLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbmV0ODAyMTEvaWVlZTgw MjExX25vZGUuYwkocmV2aXNpb24gMjU0ODI2KQorKysgbmV0ODAyMTEvaWVlZTgwMjExX25vZGUu Ywkod29ya2luZyBjb3B5KQpAQCAtMTA3NCw2ICsxMDc0LDggQEAKIAlpZWVlODAyMTFfaWVzX2Ns ZWFudXAoJm5pLT5uaV9pZXMpOwogCWllZWU4MDIxMV9wc3FfY2xlYW51cCgmbmktPm5pX3BzcSk7 CiAJZnJlZShuaSwgTV84MDIxMV9OT0RFKTsKKwlJRUVFODAyMTFfRFBSSU5URihuaS0+bmlfdmFw LCBJRUVFODAyMTFfTVNHX1JBVEVDVEwsCisJCQkiJXM6IGFmdGVyIGZyZWUobmksIE1fODAyMTFf Tk9ERSkuXG4iLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xNzMzLDcgKzE3MzUs NyBAQAogCSAqIHRvIHVzZSBuaV9pYyBiZWxvdyB0byByZWNsYWltIHJlc291cmNlcy4KIAkgKi8K ICNpZiAwCi0JSUVFRTgwMjExX0RQUklOVEYodmFwLCBJRUVFODAyMTFfTVNHX05PREUsCisJSUVF RTgwMjExX0RQUklOVEYobmktPm5pX3ZhcCwgSUVFRTgwMjExX01TR19OT0RFLAogCQkiJXMgJXA8 JXM+IGluICVzIHRhYmxlXG4iLCBfX2Z1bmNfXywgbmksCiAJCWV0aGVyX3NwcmludGYobmktPm5p X21hY2FkZHIpLAogCQludCAhPSBOVUxMID8gbnQtPm50X25hbWUgOiAiPGdvbmU+Iik7CkluZGV4 OiBuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG5ldDgwMjExL2ll ZWU4MDIxMV9yYXRlY3RsLmMJKHJldmlzaW9uIDI1NDgyNikKKysrIG5ldDgwMjExL2llZWU4MDIx MV9yYXRlY3RsLmMJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBACiAvKi0KICAqIENvcHly aWdodCAoYykgMjAxMCBSdWkgUGF1bG8gPHJwYXVsb0BGcmVlQlNELm9yZz4KKyAqIENvcHlyaWdo dCAoYykgMjAxMyBDaGVuY2hvbmcgUWluIDxjY3FpbkBGcmVlQlNELm9yZz4KICAqIEFsbCByaWdo dHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC00OSw2ICs1MCw0MCBAQAogCiBNQUxM T0NfREVGSU5FKE1fODAyMTFfUkFURUNUTCwgIjgwMjExcmF0ZWN0bCIsICI4MDIuMTEgcmF0ZSBj b250cm9sIik7CiAKK2VudW0geworCU1DU19IVDIwLAorCU1DU19IVDIwX1NHSSwKKwlNQ1NfSFQ0 MCwKKwlNQ1NfSFQ0MF9TR0ksCit9OworCitpbnQgbWF4XzRtc19mcmFtZWxlbls0XVszMl0gPSB7 CisJW01DU19IVDIwXSA9IHsKKwkJMzIxMiwgIDY0MzIsICA5NjQ4LCAgMTI4NjQsICAxOTMwMCwg IDI1NzM2LCAgMjg5NTIsICAzMjE3MiwKKwkJNjQyNCwgIDEyODUyLCAxOTI4MCwgMjU3MDgsICAz ODU2OCwgIDUxNDI0LCAgNTc4NTIsICA2NDI4MCwKKwkJOTYyOCwgIDE5MjYwLCAyODg5NiwgMzg1 MjgsICA1Nzc5MiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMTI4MjgsIDI1NjU2LCAzODQ4 OCwgNTEzMjAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQy MF9TR0ldID0geworCQkzNTcyLCAgNzE0NCwgIDEwNzIwLCAgMTQyOTYsICAyMTQ0NCwgIDI4NTk2 LCAgMzIxNzIsICAzNTc0NCwKKwkJNzE0MCwgIDE0Mjg0LCAyMTQyOCwgIDI4NTY4LCAgNDI4NTYs ICA1NzE0NCwgIDY0Mjg4LCAgNjU1MzIsCisJCTEwNzAwLCAyMTQwOCwgMzIxMTIsICA0MjgxNiwg IDY0MjI4LCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCQkxNDI1NiwgMjg1MTYsIDQyNzgwLCAg NTcwNDAsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF0g PSB7CisJCTY2ODAsICAxMzM2MCwgIDIwMDQ0LCAgMjY3MjQsICA0MDA5MiwgIDUzNDU2LCAgNjAx NDAsICA2NTUzMiwKKwkJMTMzNDgsIDI2NzAwLCAgNDAwNTIsICA1MzQwMCwgIDY1NTMyLCAgNjU1 MzIsICA2NTUzMiwgIDY1NTMyLAorCQkyMDAwNCwgNDAwMDgsICA2MDAxNiwgIDY1NTMyLCAgNjU1 MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJCTI2NjQ0LCA1MzI5MiwgIDY1NTMyLCAgNjU1 MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsICA2NTUzMiwKKwl9LAorCVtNQ1NfSFQ0MF9TR0ld ID0geworCQk3NDIwLCAgMTQ4NDQsICAyMjI3MiwgIDI5Njk2LCAgNDQ1NDQsICA1OTM5NiwgIDY1 NTMyLCAgNjU1MzIsCisJCTE0ODMyLCAyOTY2OCwgIDQ0NTA0LCAgNTkzNDAsICA2NTUzMiwgIDY1 NTMyLCAgNjU1MzIsICA2NTUzMiwKKwkJMjIyMzIsIDQ0NDY0LCAgNjU1MzIsICA2NTUzMiwgIDY1 NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLAorCQkyOTYxNiwgNTkyMzIsICA2NTUzMiwgIDY1 NTMyLCAgNjU1MzIsICA2NTUzMiwgIDY1NTMyLCAgNjU1MzIsCisJfQorfTsKKwogdm9pZAogaWVl ZTgwMjExX3JhdGVjdGxfcmVnaXN0ZXIoaW50IHR5cGUsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFf cmF0ZWN0bCAqcmF0ZWN0bCkKIHsKQEAgLTY1LDEyICsxMDAsMzYgQEAKIAlyYXRlY3Rsc1t0eXBl XSA9IE5VTEw7CiB9CiAKK3N0YXRpYyBpbnQKK3JhdGVjdGxfc3lzY3RsX3N0YXRzKFNZU0NUTF9I QU5ETEVSX0FSR1MpCit7CisJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gYXJnMTsKKwlpbnQg ZXJyb3IsIHY7CisKKwl2ID0gMDsKKwllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZ2 LCAwLCByZXEpOworCWlmIChlcnJvciB8fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsK KworCWllZWU4MDIxMV9yYXRlY3RsX3N0YXRzKHZhcCk7CisJcmV0dXJuIDA7Cit9CisKIHZvaWQK LWllZWU4MDIxMV9yYXRlY3RsX2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwKQoraWVlZTgw MjExX3JhdGVjdGxfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsIHVpbnQzMl90IGNhcGFi aWxpdGllcykKIHsKIAlpZiAodmFwLT5pdl9yYXRlID09IHJhdGVjdGxzW0lFRUU4MDIxMV9SQVRF Q1RMX05PTkVdKQogCQlpZWVlODAyMTFfcmF0ZWN0bF9zZXQodmFwLCBJRUVFODAyMTFfUkFURUNU TF9BTVJSKTsKLQl2YXAtPml2X3JhdGUtPmlyX2luaXQodmFwKTsKKwl2YXAtPml2X3JhdGUtPmly X2luaXQodmFwLCBjYXBhYmlsaXRpZXMpOworCisJU1lTQ1RMX0FERF9QUk9DKHZhcC0+aXZfc3lz Y3RsLCBTWVNDVExfQ0hJTERSRU4odmFwLT5pdl9vaWQpLCAKKwkJCU9JRF9BVVRPLCAicmF0ZWN0 bF9zdGF0cyIsIENUTFRZUEVfSU5UIHwgQ1RMRkxBR19SVywgCisJCQl2YXAsIDAsIHJhdGVjdGxf c3lzY3RsX3N0YXRzLCAiSSIsIAorCQkJInBlci12YXAgbmV0ODAyMTEgcmF0ZWN0bCBzdGF0aXN0 aWNzIik7CisKKwlJRUVFODAyMTFfRFBSSU5URih2YXAsIElFRUU4MDIxMV9NU0dfUkFURUNUTCwK KwkgICAgIiVzOiByYXRlY3RsIGluaXRpYWxpemVkLiBjYXBzPTB4JTA4eFxuIiwKKwkgICAgX19m dW5jX18sIGNhcGFiaWxpdGllcyk7CiB9CiAKIHZvaWQKQEAgLTkwLDMgKzE0OSwxMTAgQEAKIAl9 CiAJdmFwLT5pdl9yYXRlID0gcmF0ZWN0bHNbdHlwZV07CiB9CisKK3ZvaWQKK2llZWU4MDIxMV9y YXRlY3RsX2NvbXBsZXRlX3JjZmxhZ3Moc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwKKwkJc3Ry dWN0IGllZWU4MDIxMV9yY19pbmZvICpyY19pbmZvKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAg KnZhcCA9IG5pLT5uaV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9yY19zZXJpZXMgKnJjID0gcmNf aW5mby0+aXJpX3JjOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqIHJ0ID0g TlVMTDsKKwl1aW50OF90IHJhdGU7CisJaW50IGk7CisKKwlydCA9IGllZWU4MDIxMV9nZXRfcmF0 ZXRhYmxlKG5pLT5uaV9pYy0+aWNfY3VyY2hhbik7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCByYXRl IGNvbnRyb2wgY29kZSBkb2Vzbid0IG1lc3MgaXQgdXAuCisJICogSWYgZW5hYmxlIHJ0cy9jdHMg YW5kIGlzIHByZS04MDIuMTFuLCBibGFuayB0cmllcyAxLCAyLCAzIAorCSAqLworCisJaWYgKCEg SUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01SUlBST1QodmFwKSkKKwl7CisJCWZvciAoaSA9IDE7 IGkgPCBJRUVFODAyMTFfUkFURUNUTF9OVU07IGkrKykKKwkJeworCQkJaWYgKHJjWzBdLmZsYWdz ICYgSUVFRTgwMjExX1JBVEVDVExfRkxBR19SVFNDVFMpCisJCQkJcmNbaV0udHJpZXMgPSAwOwor CQkJcmNbaV0uZmxhZ3MgJj0gfklFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfUlRTQ1RTOyAKKwkJfQor CX0KKworCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfUkFURUNUTF9OVU07IGkrKykgeworCQkK KwkJaWYgKHJjW2ldLnRyaWVzID09IDApCisJCQljb250aW51ZTsKKworCQlyYXRlID0gcnQtPmlu Zm9bcmNbaV0ucml4XS5kb3QxMVJhdGU7CisKKwkJLyogT25seSBlbmFibGUgZHVhbC1zdHJlYW0s IHNob3J0Z2ksIDIwNDAgaWYgSFQgaXMgc2V0ICovCisKKwkJaWYgKElTX0hUX1JBVEUocmF0ZSkp IHsKKwkJCXJjW2ldLmZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfSFQ7CisKKwkJCWlm IChpZWVlODAyMTFfcmF0ZWN0bF9oYXNjYXBfY3c0MChuaSkpCisJCQkJcmNbaV0uZmxhZ3MgfD0g SUVFRTgwMjExX1JBVEVDVExfRkxBR19DVzQwOworCisJCQlpZiAoaWVlZTgwMjExX3JhdGVjdGxf aGFzY2FwX3Nob3J0Z2kobmkpKQorCQkJCXJjW2ldLmZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RM X0ZMQUdfU0dJOworCQkJLyoKKwkJCSAqIElmIHdlIGhhdmUgU1RCQyBUWCBlbmFibGVkIGFuZCB0 aGUgcmVjZWl2ZXIKKwkJCSAqIGNhbiByZWNlaXZlIChhdCBsZWFzdCkgMSBzdHJlYW0gU1RCQywg QU5EIGl0J3MKKwkJCSAqIE1DUyAwLTcsIEFORCB3ZSBoYXZlIGF0IGxlYXN0IHR3byBjaGFpbnMg ZW5hYmxlZCwKKwkJCSAqIGVuYWJsZSBTVEJDLgorCQkJICovCisJCQlpZiAoaWVlZTgwMjExX3Jh dGVjdGxfaGFzY2FwX3N0YmMobmkpICYmCisJCQkJKHJhdGUgJiBJRUVFODAyMTFfUkFURV9WQUwp IDwgOCAmJgorCQkJCUhUX1JDXzJfU1RSRUFNUyhyYXRlKSA9PSAxKQorCQkJCXJjW2ldLmZsYWdz IHw9IElFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfU1RCQzsKKwkJCQorCQkJLyoKKwkJCSAqIER1YWwg LyBUcmlwbGUgc3RyZWFtIHJhdGU/CisJCQkgKi8KKwkJCWlmIChIVF9SQ18yX1NUUkVBTVMocmF0 ZSkgPT0gMikKKwkJCQlyY1tpXS5mbGFncyB8PSBJRUVFODAyMTFfUkFURUNUTF9GTEFHX0RTOwor CQkJZWxzZSBpZiAoSFRfUkNfMl9TVFJFQU1TKHJhdGUpID09IDMpCisJCQkJcmNbaV0uZmxhZ3Mg fD0gSUVFRTgwMjExX1JBVEVDVExfRkxBR19UUzsKKworCQkJLyoKKwkJCSAqIENhbGN1bGF0ZSB0 aGUgbWF4aW11bSA0bXMgZnJhbWUgbGVuZ3RoIGJhc2VkCisJCQkgKiBvbiB0aGUgTUNTIHJhdGUs IFNHSSBhbmQgY2hhbm5lbCB3aWR0aCBmbGFncy4KKwkJCSAqLworCQkJaWYgKEhUX1JDXzJfTUNT KHJhdGUpIDwgMzIpIHsKKwkJCQlpbnQgajsKKwkJCQlpZiAocmNbaV0uZmxhZ3MgJiBJRUVFODAy MTFfUkFURUNUTF9GTEFHX0NXNDApIHsKKwkJCQkJaWYgKHJjW2ldLmZsYWdzICYgSUVFRTgwMjEx X1JBVEVDVExfRkxBR19TR0kpCisJCQkJCQlqID0gTUNTX0hUNDBfU0dJOworCQkJCQllbHNlCisJ CQkJCQlqID0gTUNTX0hUNDA7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHJjW2ldLmZsYWdzICYg SUVFRTgwMjExX1JBVEVDVExfRkxBR19TR0kpCisJCQkJCQlqID0gTUNTX0hUMjBfU0dJOworCQkJ CQllbHNlCisJCQkJCQlqID0gTUNTX0hUMjA7CisJCQkJfQorCQkJCXJjW2ldLm1heDRtc2ZyYW1l bGVuID0KKwkJCQkgICAgbWF4XzRtc19mcmFtZWxlbltqXVtIVF9SQ18yX01DUyhyYXRlKV07CisJ CQl9CisJCX0gZWxzZSB7CisJCQlyY1tpXS5tYXg0bXNmcmFtZWxlbiA9IDA7CisKKwkJCS8qCisJ CQkgKiBPbmx5IGVuYWJsZSBzaG9ydCBwcmVhbWJsZSBmb3IgbGVnYWN5IHJhdGVzCisJCQkgKi8K KwkJCWlmIChyY19pbmZvLT5pcmlfZmxhZ3MgJiBJRUVFODAyMTFfUkFURUNUTF9JTkZPX1NQKQor CQkJCXJjW2ldLmZsYWdzIHw9IElFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfU1A7CisJCX0KKworCQkv KgorCQkgKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gVFggcG93ZXIgY2FwIGZvciB0aGUgY3VycmVu dAorCQkgKiBub2RlLiAKKwkJICogUmF0ZSBjb250cm9sIGFsZ28gY2FuJ3QgY29udHJvbCBUWCBw b3dlciBieSBub3cuCisJCSAqLworCQlyY1tpXS50eF9wb3dlcl9jYXAgPSBpZWVlODAyMTFfZ2V0 X25vZGVfdHhwb3dlcihuaSk7CisJCQorCX0KKwlJRUVFODAyMTFfTk9URShuaS0+bmlfdmFwLCBJ RUVFODAyMTFfTVNHX1JBVEVDVEwsIG5pLAorCSAgICAiJXM6IGZsYWdzOiByY1swXToweCUwOHgs IHJjWzFdOjB4JTA4eCwgIgorCQkicmNbMl06MHglMDh4LCByY1szXToweCUwOHhcbiIsIF9fZnVu Y19fLCAKKwkJcmNbMF0uZmxhZ3MsIHJjWzFdLmZsYWdzLCByY1syXS5mbGFncywgcmNbM10uZmxh Z3MpOworfQorCkluZGV4OiBuZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bC5oCj09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K LS0tIG5ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmgJKHJldmlzaW9uIDI1NDgyNikKKysrIG5l dDgwMjExL2llZWU4MDIxMV9yYXRlY3RsLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw2IEBA CiAvKi0KICAqIENvcHlyaWdodCAoYykgMjAxMCBSdWkgUGF1bG8gPHJwYXVsb0BGcmVlQlNELm9y Zz4KKyAqIENvcHlyaWdodCAoYykgMjAxMyBDaGVuY2hvbmcgUWluIDxjY3FpbkBGcmVlQlNELm9y Zz4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVz ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0yNCw2ICsy NSw4IEBACiAgKgogICogJEZyZWVCU0QkCiAgKi8KKyNpZm5kZWYgX05FVDgwMjExX0lFRUU4MDIx MV9SQVRFQ1RMX0hfCisjZGVmaW5lIF9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNUTF9IXwogCiBl bnVtIGllZWU4MDIxMV9yYXRlYWxncyB7CiAJSUVFRTgwMjExX1JBVEVDVExfQU1SUgkJPSAwLApA QCAtMzcsMjggKzQwLDExNSBAQAogI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9UWF9TVUNDRVNT CTEKICNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfVFhfRkFJTFVSRQkwCiAKKyNkZWZpbmUJSUVF RTgwMjExX1JBVEVDVExfVFJVRQkJMQorI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9GQUxTRQkJ MAorCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX05VTQkJNAorI2RlZmluZQlJRUVFODAyMTFf UkFURUNUTF9UWE1BWFRSWQkxMQorCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0ZMQUdfRFMJ CTB4MDEJLyogZHVhbC1zdHJlYW0gcmF0ZSAqLworI2RlZmluZQlJRUVFODAyMTFfUkFURUNUTF9G TEFHX0NXNDAJCTB4MDIJLyogdXNlIEhUNDAgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExf RkxBR19TR0kJCTB4MDQJLyogdXNlIHNob3J0LUdJICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRF Q1RMX0ZMQUdfSFQJCTB4MDgJLyogdXNlIEhUICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RM X0ZMQUdfUlRTQ1RTCTB4MTAJLyogZW5hYmxlIFJUUy9DVFMgcHJvdGVjdGlvbiAqLworI2RlZmlu ZQlJRUVFODAyMTFfUkFURUNUTF9GTEFHX1NUQkMJCTB4MjAJLyogZW5hYmxlIFNUQkMgKi8KKyNk ZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfRkxBR19UUwkJMHg0MAkvKiB0cmlwbGUtc3RyZWFtIHJh dGUgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfRkxBR19TUAkJMHg4MAkvKiBzaG9ydCBw cmVhbWJsZSAqLworCisvKiBIYXJkd2FyZSBDQVBzIG9mZmVyZWQgdG8gcmF0ZSBjb250cm9sIGFs Z28gKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfQ0FQX01SUgkJCTB4MDEJLyogc3VwcG9y dCBNUlIgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfQ0FQX01SUlBST1QJCTB4MDIJLyog c3VwcG9ydCBNUlIgKyBwcm90ZWN0ICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0NBUF9N VUxUWENIQUlOCTB4MDQJLyogaGFzIG1vcmUgdGhhbiAxIHR4Y2hhaW4gKi8KKworI2RlZmluZSBJ U19WQVBfSFQodmFwKQkoKHZhcCktPml2X2h0Y2FwcyAmIElFRUU4MDIxMV9IVENfSFQpCisjZGVm aW5lIElTX0hUX1JBVEUoX3JhdGUpICAgKChfcmF0ZSkgJiAweDgwKQorI2RlZmluZSBIVF9SQ18y X01DUyhfcmMpICAgICgoX3JjKSAmIDB4N2YpCisjZGVmaW5lIEhUX1JDXzJfU1RSRUFNUyhfcmMp ICAgICgoKChfcmMpICYgMHg3OCkgPj4gMykgKyAxKQorCitleHRlcm4gaW50IG1heF80bXNfZnJh bWVsZW5bNF1bMzJdOworCitzdHJ1Y3QgaWVlZTgwMjExX3JjX3NlcmllcyB7CisJdWludDhfdCBy aXg7CQkvKiByYXRldGFibGUgaW5kZXgsIG5vdCByYXRlIGNvZGUgKi8KKwl1aW50OF90IHJhdGVj b2RlOwkvKiBoYXJkd2FyZSByYXRlIGNvZGUgKi8KKwl1aW50OF90IHRyaWVzOworCXVpbnQ4X3Qg dHhfcG93ZXJfY2FwOworCXVpbnQxNl90IGZsYWdzOworCXVpbnQxNl90IG1heDRtc2ZyYW1lbGVu OworfTsKKworc3RydWN0IGllZWU4MDIxMV9yY19pbmZvIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Jj X3NlcmllcyBpcmlfcmNbSUVFRTgwMjExX1JBVEVDVExfTlVNXTsKKwl1aW50MzJfdCBpcmlfZnJh bWVsZW47CisJdWludDE2X3QgaXJpX2ZsYWdzOwkJCS8qIFNlZSBiZWxvdyAqLworCXVpbnQxNl90 IGlyaV9tYXhhZ2dyc2l6ZTsJLyogTWF4aW11bSBhZ2dyZWdhdGUgc2l6ZSAqLworCisJLyogVFgg aW5mbyAqLworCXVpbnQ4X3QgaXJpX3R4Y250OwkJCS8qIFRYIGNvdW50ICovCisJdWludDhfdCBp cmlfZmFpbGNudDsJCS8qIFRYIHJldHJ5LWZhaWwgY291bnQgKi8KKwl1aW50OF90IGlyaV9va2Nu dDsJCQkvKiBUWCBvayB3aXRoIG9yIHdpdGhvdXQgcmV0cnkgKi8KKwl1aW50OF90IGlyaV9yZXRy eWNudDsJCS8qIFRYIHJldHJ5IGNvdW50ICovCisJdWludDhfdCBpcmlfc2hvcnRyZXRyeTsKKwl1 aW50OF90IGlyaV9sb25ncmV0cnk7CisJdWludDhfdCBpcmlfZmluYWx0c2k7CisJdWludDhfdCBp cmlfdHhyYXRlOwkJCS8qIEhXIHR4IHJhdGUgKi8KK307CisKKy8qIGllZWU4MDIxMV9yY19pbmZv IGZsYWdzICovCisjZGVmaW5lCUlFRUU4MDIxMV9SQVRFQ1RMX0lORk9fU1AJCTB4MDEJLyogc2hv cnQgcHJlYW1ibGUgKi8KKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfSU5GT19BR0dSCQkweDAy CS8qIGFnZ3JlZ2F0aW9uIHNjZW5hcmlvICovCisKKyNkZWZpbmUgTkVUODAyMTFfVEFHX1JBVEVD VEwgICAxICAgLyogbmV0ODAyMTEgcmF0ZWN0bCBzdGF0ZSAqLworCisvKgorICogbmV0ODAyMTEg cmF0ZWN0bCBzdGF0aXN0aWNzLiAKKyAqIHBlciB2YXAgcmF0ZWN0bCBzZWV0aW5nIG11c3Qgc3Rh cnQgd2l0aCB0aGlzIGNvbW1vbiBzdGF0ZS4KKyAqLworc3RydWN0IGllZWU4MDIxMV9yY19zdGF0 IHsKKwl1aW50MzJfdCBpcnNfY2FwYWJpbGl0aWVzOwkJLyogaGFyZHdhcmUgY2FwYWJpbGl0aWVz IG9mZmVyZWQgdG8gcmMgKi8KKworCS8qIHJhdGVjdGwgc3RhdGlzdGljcyAqLworCXVpbnQzMl90 IGlyc190eGNudDsKKwl1aW50MzJfdCBpcnNfZmFpbGNudDsKKwl1aW50MzJfdCBpcnNfcmV0cnlj bnQ7CisJdWludDMyX3QgaXJzX3Nob3J0cmV0cnk7CisJdWludDMyX3QgaXJzX2xvbmdyZXRyeTsK K307CisKKyNkZWZpbmUgSUVFRTgwMjExX1JBVEVDVExfU1RBVChfdmFwKSBcCisJKChzdHJ1Y3Qg aWVlZTgwMjExX3JjX3N0YXQgKikoKF92YXApLT5pdl9ycykpCisKKyNkZWZpbmUJSUVFRTgwMjEx X1JBVEVDVExfSEFTQ0FQX01SUihfdmFwKSBcCisJKElFRUU4MDIxMV9SQVRFQ1RMX1NUQVQoX3Zh cCktPmlyc19jYXBhYmlsaXRpZXMgJiBJRUVFODAyMTFfUkFURUNUTF9DQVBfTVJSKQorI2RlZmlu ZQlJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVJSUFJPVChfdmFwKSBcCisJKElFRUU4MDIxMV9S QVRFQ1RMX1NUQVQoX3ZhcCktPmlyc19jYXBhYmlsaXRpZXMgJiBJRUVFODAyMTFfUkFURUNUTF9D QVBfTVJSUFJPVCkKKyNkZWZpbmUJSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01VTFRYQ0hBSU4o X3ZhcCkgXAorCShJRUVFODAyMTFfUkFURUNUTF9TVEFUKF92YXApLT5pcnNfY2FwYWJpbGl0aWVz ICYgSUVFRTgwMjExX1JBVEVDVExfQ0FQX01VTFRYQ0hBSU4pCisKIHN0cnVjdCBpZWVlODAyMTFf cmF0ZWN0bCB7CiAJY29uc3QgY2hhciAqaXJfbmFtZTsKIAlpbnQJKCppcl9hdHRhY2gpKGNvbnN0 IHN0cnVjdCBpZWVlODAyMTF2YXAgKik7CiAJdm9pZAkoKmlyX2RldGFjaCkoY29uc3Qgc3RydWN0 IGllZWU4MDIxMXZhcCAqKTsKLQl2b2lkCSgqaXJfaW5pdCkoc3RydWN0IGllZWU4MDIxMXZhcCAq KTsKKwl2b2lkCSgqaXJfaW5pdCkoc3RydWN0IGllZWU4MDIxMXZhcCAqLCB1aW50MzJfdCk7CiAJ dm9pZAkoKmlyX2RlaW5pdCkoc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKIAl2b2lkCSgqaXJfbm9k ZV9pbml0KShzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKik7CiAJdm9pZAkoKmlyX25vZGVfZGVpbml0 KShzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKik7CiAJaW50CSgqaXJfcmF0ZSkoc3RydWN0IGllZWU4 MDIxMV9ub2RlICosIHZvaWQgKiwgdWludDMyX3QpOworCXZvaWQJKCppcl9yYXRlcykoc3RydWN0 IGllZWU4MDIxMV9ub2RlICosIHN0cnVjdCBpZWVlODAyMTFfcmNfaW5mbyAqKTsKIAl2b2lkCSgq aXJfdHhfY29tcGxldGUpKGNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKiwKLQkgICAgCQkJICBj b25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgaW50LAotCSAgICAJCQkgIHZvaWQgKiwgdm9p ZCAqKTsKKwkgICAgCQkJICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgc3RydWN0IGll ZWU4MDIxMV9yY19pbmZvICopOwogCXZvaWQJKCppcl90eF91cGRhdGUpKGNvbnN0IHN0cnVjdCBp ZWVlODAyMTF2YXAgKiwKIAkgICAgCQkJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICosCiAJ ICAgIAkJCXZvaWQgKiwgdm9pZCAqLCB2b2lkICopOwogCXZvaWQJKCppcl9zZXRpbnRlcnZhbCko Y29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqLCBpbnQpOworCXZvaWQJKCppcl9zdGF0cykoY29u c3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqKTsKIH07CiAKIHZvaWQJaWVlZTgwMjExX3JhdGVjdGxf cmVnaXN0ZXIoaW50LCBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVjdGwgKik7CiB2b2lkCWll ZWU4MDIxMV9yYXRlY3RsX3VucmVnaXN0ZXIoaW50KTsKLXZvaWQJaWVlZTgwMjExX3JhdGVjdGxf aW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICopOwordm9pZAlpZWVlODAyMTFfcmF0ZWN0bF9pbml0 KHN0cnVjdCBpZWVlODAyMTF2YXAgKiwgdWludDMyX3QpOwogdm9pZAlpZWVlODAyMTFfcmF0ZWN0 bF9zZXQoc3RydWN0IGllZWU4MDIxMXZhcCAqLCBpbnQpOwordm9pZAlpZWVlODAyMTFfcmF0ZWN0 bF9jb21wbGV0ZV9yY2ZsYWdzKHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqLCAKKwkJCQkJCXN0cnVj dCBpZWVlODAyMTFfcmNfaW5mbyopOwogCiBNQUxMT0NfREVDTEFSRShNXzgwMjExX1JBVEVDVEwp OwogCkBAIC03NCw2ICsxNjQsOCBAQAogCWNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9 IG5pLT5uaV92YXA7CiAKIAl2YXAtPml2X3JhdGUtPmlyX25vZGVfaW5pdChuaSk7CisJSUVFRTgw MjExX0RQUklOVEYodmFwLCBJRUVFODAyMTFfTVNHX1JBVEVDVEwsCisJCQkiJXM6IG5ldDgwMjEx IHJhdGVjdGwgbm9kZSBpbml0ZWQuXG4iLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9f aW5saW5lCkBAIC04Miw2ICsxNzQsOCBAQAogCWNvbnN0IHN0cnVjdCBpZWVlODAyMTF2YXAgKnZh cCA9IG5pLT5uaV92YXA7CiAKIAl2YXAtPml2X3JhdGUtPmlyX25vZGVfZGVpbml0KG5pKTsKKwlJ RUVFODAyMTFfRFBSSU5URih2YXAsIElFRUU4MDIxMV9NU0dfUkFURUNUTCwKKwkJCSIlczogbmV0 ODAyMTEgcmF0ZWN0bCBub2RlIGRlaW5pdGVkLlxuIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMg aW50IF9faW5saW5lCkBAIC05MywxMCArMTg3LDI2IEBACiB9CiAKIHN0YXRpYyB2b2lkIF9faW5s aW5lCitpZWVlODAyMTFfcmF0ZWN0bF9yYXRlcyhzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBz dHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8gKnJjX2luZm8pCit7CisJY29uc3Qgc3RydWN0IGllZWU4 MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKKworCWlmIChyY19pbmZvLT5pcmlfZmxhZ3MgJiBJ RUVFODAyMTFfUkFURUNUTF9JTkZPX0FHR1IpIAorCQlyY19pbmZvLT5pcmlfZnJhbWVsZW4gPSAw OworCisJSUVFRTgwMjExX0RQUklOVEYodmFwLCBJRUVFODAyMTFfTVNHX1JBVEVDVEwsCisJCQki JXM6IGZpbmQgcmF0ZSBzZXRzIGZvciAlc2FnZ3JlZ2F0aW9uIHNjZW5hcmlvLlxuIiwgX19mdW5j X18sIAorCQkJKHJjX2luZm8tPmlyaV9mbGFncyAmIElFRUU4MDIxMV9SQVRFQ1RMX0lORk9fQUdH Uik/ICIiIDogIm5vbi0iKTsKKworCXZhcC0+aXZfcmF0ZS0+aXJfcmF0ZXMobmksIHJjX2luZm8p OworCWllZWU4MDIxMV9yYXRlY3RsX2NvbXBsZXRlX3JjZmxhZ3MobmksIHJjX2luZm8pOworfQor CitzdGF0aWMgdm9pZCBfX2lubGluZQogaWVlZTgwMjExX3JhdGVjdGxfdHhfY29tcGxldGUoY29u c3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAotICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFf bm9kZSAqbmksIGludCBzdGF0dXMsIHZvaWQgKmFyZzEsIHZvaWQgKmFyZzIpCisgICAgY29uc3Qg c3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3RydWN0IGllZWU4MDIxMV9yY19pbmZvICpyY19p bmZvKQogewotCXZhcC0+aXZfcmF0ZS0+aXJfdHhfY29tcGxldGUodmFwLCBuaSwgc3RhdHVzLCBh cmcxLCBhcmcyKTsKKwl2YXAtPml2X3JhdGUtPmlyX3R4X2NvbXBsZXRlKHZhcCwgbmksIHJjX2lu Zm8pOwogfQogCiBzdGF0aWMgdm9pZCBfX2lubGluZQpAQCAtMTE1LDMgKzIyNSwxMDggQEAKIAkJ cmV0dXJuOwogCXZhcC0+aXZfcmF0ZS0+aXJfc2V0aW50ZXJ2YWwodmFwLCBtc2Vjcyk7CiB9CisK K3N0YXRpYyB2b2lkIF9faW5saW5lCitpZWVlODAyMTFfcmF0ZWN0bF9zdGF0cyhjb25zdCBzdHJ1 Y3QgaWVlZTgwMjExdmFwICp2YXApCit7CisJcHJpbnRmKCJcblslc106IG5ldDgwMjExIHJhdGVj dGwgc3RhdGlzdGljcyAoJXMpXG4iLCAKKwkJCXZhcC0+aXZfaWZwLT5pZl94bmFtZSwgdmFwLT5p dl9yYXRlLT5pcl9uYW1lKTsKKwlpZiAodmFwLT5pdl9yYXRlLT5pcl9zdGF0cyA9PSBOVUxMKQor CQlyZXR1cm47CisJdmFwLT5pdl9yYXRlLT5pcl9zdGF0cyh2YXApOworfQorCitzdGF0aWMgaW50 IF9faW5saW5lCitpZWVlODAyMTFfcmF0ZWN0bF9oYXNjYXBfY3c0MChjb25zdCBzdHJ1Y3QgaWVl ZTgwMjExX25vZGUgKm5pKQoreworCXJldHVybiBuaS0+bmlfY2h3ID09IDQwOworfQorCitzdGF0 aWMgaW50IF9faW5saW5lCitpZWVlODAyMTFfcmF0ZWN0bF9oYXNjYXBfc2hvcnRnaShjb25zdCBz dHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCXN0cnVjdCBpZWVlODAyMTFjb20gKmljID0g bmktPm5pX2ljOworCisJaWYgKG5pLT5uaV9jaHcgPT0gNDAgJiYKKwkJaWMtPmljX2h0Y2FwcyAm IElFRUU4MDIxMV9IVENBUF9TSE9SVEdJNDAgJiYKKwkJbmktPm5pX2h0Y2FwICYgSUVFRTgwMjEx X0hUQ0FQX1NIT1JUR0k0MCkKKwkJcmV0dXJuIElFRUU4MDIxMV9SQVRFQ1RMX1RSVUU7CisKKwlp ZiAobmktPm5pX2NodyA9PSAyMCAmJgorCQlpYy0+aWNfaHRjYXBzICYgSUVFRTgwMjExX0hUQ0FQ X1NIT1JUR0kyMCAmJgorCQluaS0+bmlfaHRjYXAgJiBJRUVFODAyMTFfSFRDQVBfU0hPUlRHSTIw KQorCQlyZXR1cm4gSUVFRTgwMjExX1JBVEVDVExfVFJVRTsKKworCXJldHVybiBJRUVFODAyMTFf UkFURUNUTF9GQUxTRTsKK30KKworc3RhdGljIGludCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVj dGxfaGFzY2FwX3N0YmMoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKwlzdHJ1 Y3QgaWVlZTgwMjExY29tICppYyA9IG5pLT5uaV9pYzsKKworCWlmIChpYy0+aWNfaHRjYXBzICYg SUVFRTgwMjExX0hUQ0FQX1RYU1RCQyAmJgorCQluaS0+bmlfaHRjYXAgJiBJRUVFODAyMTFfSFRD QVBfUlhTVEJDXzFTVFJFQU0gJiYKKwkJSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01VTFRYQ0hB SU4obmktPm5pX3ZhcCkpCisJCXJldHVybiBJRUVFODAyMTFfUkFURUNUTF9UUlVFOworCQorCXJl dHVybiBJRUVFODAyMTFfUkFURUNUTF9GQUxTRTsKK30KKworc3RhdGljIGludCBfX2lubGluZQor aWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pczExbihjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUg Km5pKQoreworCWlmIChuaS0+bmlfY2hhbiA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCWlmIChu aS0+bmlfY2hhbiA9PSBJRUVFODAyMTFfQ0hBTl9BTllDKQorCQlyZXR1cm4gKDApOworCXJldHVy biAoSUVFRTgwMjExX0lTX0NIQU5fSFQobmktPm5pX2NoYW4pKTsKK30KKworX19pbmxpbmUgc3Rh dGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZXNldCAqCitpZWVlODAyMTFfcmF0ZWN0bF9n ZXRfcmF0ZXNldChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCWNvbnN0IHN0 cnVjdCBpZWVlODAyMTFfcmF0ZXNldCAqcnMgPSBOVUxMOworCS8qIDExbiBvciBub3Q/IFBpY2sg dGhlIHJpZ2h0IHJhdGVzZXQgKi8KKwlpZiAoaWVlZTgwMjExX3JhdGVjdGxfbm9kZV9pczExbihu aSkpIHsKKwkJSUVFRTgwMjExX05PVEUobmktPm5pX3ZhcCwgSUVFRTgwMjExX01TR19SQVRFQ1RM LCBuaSwKKwkJCQkiJXM6IDExbiBub2RlIiwgX19mdW5jX18pOworCQlycyA9IChzdHJ1Y3QgaWVl ZTgwMjExX3JhdGVzZXQgKikgJm5pLT5uaV9odHJhdGVzOworCX0gZWxzZSB7CisJCUlFRUU4MDIx MV9OT1RFKG5pLT5uaV92YXAsIElFRUU4MDIxMV9NU0dfUkFURUNUTCwgbmksCisJCQkgICAgIiVz OiBub24tMTFuIG5vZGUiLCBfX2Z1bmNfXyk7CisJCXJzID0gJm5pLT5uaV9yYXRlczsKKwl9CisJ cmV0dXJuIHJzOworfQorCitzdGF0aWMgdm9pZCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxf dXBkYXRlX3N0YXQoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorCQljb25zdCBzdHJ1 Y3QgaWVlZTgwMjExX3JjX2luZm8gKnJjX2luZm8pCit7CisJc3RydWN0IGllZWU4MDIxMV9yY19z dGF0ICogaXJzID0gSUVFRTgwMjExX1JBVEVDVExfU1RBVCh2YXApOworCWlycy0+aXJzX3R4Y250 ICs9IHJjX2luZm8tPmlyaV90eGNudDsKKwlpcnMtPmlyc19mYWlsY250ICs9IHJjX2luZm8tPmly aV9mYWlsY250OworCWlycy0+aXJzX3JldHJ5Y250ICs9IHJjX2luZm8tPmlyaV9yZXRyeWNudDsK KwlpcnMtPmlyc19zaG9ydHJldHJ5ICs9IHJjX2luZm8tPmlyaV9zaG9ydHJldHJ5OworCWlycy0+ aXJzX2xvbmdyZXRyeSArPSByY19pbmZvLT5pcmlfbG9uZ3JldHJ5OworfQorCitzdGF0aWMgdm9p ZCBfX2lubGluZQoraWVlZTgwMjExX3JhdGVjdGxfcmNfaW5mb19zZXQoc3RydWN0IGllZWU4MDIx MV9yY19pbmZvICpyY19pbmZvLAorCQl1aW50OF90IHR4Y250LCB1aW50OF90IGZhaWxjbnQsIHVp bnQzMl90IGZyYW1lbGVuLAorCQl1aW50OF90IHNob3J0cmV0cnksIHVpbnQ4X3QgbG9uZ3JldHJ5 LAorCQl1aW50OF90IGZpbmFsdHNpLCB1aW50OF90IHR4cmF0ZSkKK3sKKwlyY19pbmZvLT5pcmlf dHhjbnQgPSB0eGNudDsKKwlyY19pbmZvLT5pcmlfZmFpbGNudCA9IGZhaWxjbnQ7CisJcmNfaW5m by0+aXJpX29rY250ID0gdHhjbnQgLSBmYWlsY250OworCXJjX2luZm8tPmlyaV9mcmFtZWxlbiA9 IGZyYW1lbGVuOworCXJjX2luZm8tPmlyaV9zaG9ydHJldHJ5ID0gc2hvcnRyZXRyeTsKKwlyY19p bmZvLT5pcmlfbG9uZ3JldHJ5ID0gbG9uZ3JldHJ5OworCXJjX2luZm8tPmlyaV9yZXRyeWNudCA9 IHNob3J0cmV0cnkgKyBsb25ncmV0cnk7CisJcmNfaW5mby0+aXJpX2ZpbmFsdHNpID0gZmluYWx0 c2k7CisJcmNfaW5mby0+aXJpX3R4cmF0ZSA9IHR4cmF0ZTsKK30KKworI2VuZGlmCkluZGV4OiBu ZXQ4MDIxMS9pZWVlODAyMTFfcmF0ZWN0bF9ub25lLmMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbmV0ODAyMTEv aWVlZTgwMjExX3JhdGVjdGxfbm9uZS5jCShyZXZpc2lvbiAyNTQ4MjYpCisrKyBuZXQ4MDIxMS9p ZWVlODAyMTFfcmF0ZWN0bF9ub25lLmMJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDEwICs0NCwyNiBA QAogCiAjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Zhci5oPgogI2luY2x1ZGUgPG5ldDgw MjExL2llZWU4MDIxMV9yYXRlY3RsLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3Jh dGVjdGxfbm9uZS5oPgogCiBzdGF0aWMgdm9pZAotbm9uZV9pbml0KHN0cnVjdCBpZWVlODAyMTF2 YXAgKnZhcCkKK25vbmVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsIHVpbnQzMl90IGNh cGFiaWxpdGllcykKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5vbmU7CisKKwlLQVNTRVJU KHZhcC0+aXZfcnMgPT0gTlVMTCwgKCIlcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMiLCBfX2Z1bmNf XykpOworCisJbm9uZSA9IHZhcC0+aXZfcnMgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlODAy MTFfbm9uZSksCisJICAgIE1fODAyMTFfUkFURUNUTCwgTV9OT1dBSVR8TV9aRVJPKTsKKwlpZiAo bm9uZSA9PSBOVUxMKSB7CisJCWlmX3ByaW50Zih2YXAtPml2X2lmcCwgImNvdWxkbid0IGFsbG9j IHJhdGVjdGwgc3RydWN0dXJlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXN0cnVjdCBpZWVlODAy MTFfcmNfc3RhdCAqIGlycyA9IElFRUU4MDIxMV9SQVRFQ1RMX1NUQVQodmFwKTsKKwlpcnMtPmly c19jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7CisKKwkvKiAuLi4gKi8KIH0KIAogc3RhdGlj IHZvaWQKQEAgLTU5LDYgKzc1LDI1IEBACiBzdGF0aWMgdm9pZAogbm9uZV9ub2RlX2luaXQoc3Ry dWN0IGllZWU4MDIxMV9ub2RlICpuaSkKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAgPSBu aS0+bmlfdmFwOworCXN0cnVjdCBpZWVlODAyMTFfbm9uZSAqbm9uZSA9IHZhcC0+aXZfcnM7CisJ c3RydWN0IGllZWU4MDIxMV9ub25lX25vZGUgKm5vbjsKKworCWlmIChuaS0+bmlfcmN0bHMgPT0g TlVMTCkgeworCQluaS0+bmlfcmN0bHMgPSBub24gPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVl ODAyMTFfbm9uZV9ub2RlKSwKKwkJICAgIE1fODAyMTFfUkFURUNUTCwgTV9OT1dBSVR8TV9aRVJP KTsKKwkJaWYgKG5vbiA9PSBOVUxMKSB7CisJCQlpZl9wcmludGYodmFwLT5pdl9pZnAsICJjb3Vs ZG4ndCBhbGxvYyBwZXItbm9kZSByYXRlY3RsICIKKwkJCSAgICAic3RydWN0dXJlXG4iKTsKKwkJ CXJldHVybjsKKwkJfQorCX0gZWxzZQorCQlub24gPSBuaS0+bmlfcmN0bHM7CisKKwlub24tPm5v bl9ub25lID0gbm9uZTsKKworCS8qIC4uLiAqLworCQogCW5pLT5uaV90eHJhdGUgPSBuaS0+bmlf cmF0ZXMucnNfcmF0ZXNbMF0gJiBJRUVFODAyMTFfUkFURV9WQUw7CiB9CiAKQEAgLTc4LDggKzEx Myw3IEBACiAKIHN0YXRpYyB2b2lkCiBub25lX3R4X2NvbXBsZXRlKGNvbnN0IHN0cnVjdCBpZWVl ODAyMTF2YXAgKnZhcCwKLSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQg b2ssCi0gICAgdm9pZCAqYXJnMSwgdm9pZCAqYXJnMiBfX3VudXNlZCkKKyAgICBjb25zdCBzdHJ1 Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBzdHJ1Y3QgaWVlZTgwMjExX3JjX2luZm8gKnJjX2luZm8p CiB7CiB9CiAKSW5kZXg6IG5ldDgwMjExL2llZWU4MDIxMV9yY19zYW1wbGUuYwo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBuZXQ4MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmMJKHJldmlzaW9uIDApCisrKyBuZXQ4 MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmMJKHJldmlzaW9uIDI1NjgyNSkKQEAgLTAsMCArMSwx MTQxIEBACisvKiAkRnJlZUJTRDogaGVhZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvc2Ft cGxlLmMgMjQ4NTczIDIwMTMtMDItMjcgMDQ6MzM6MDZaIGFkcmlhbiAkKi8KKworLyotCisgKiBD b3B5cmlnaHQgKGMpIDIwMDUgSm9obiBCaWNrZXQKKyAqIENvcHlyaWdodCAoYykgMjAxMyBDaGVu Y2hvbmcgUWluIDxjY3FpbkBGcmVlQlNELm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBg QVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKKyAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1F UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ U0NMQUlNRUQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1Ig QU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisgKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqIE5PVCBMSU1JVEVE IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G IFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G CisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworI2luY2x1ZGUg Im9wdF93bGFuLmgiCisKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMva2Vy bmVsLmg+CisjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4K KyNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRl IDxuZXQvaWZfbWVkaWEuaD4KKworI2lmZGVmIElORVQKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+ CisjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxuZXQ4 MDIxMS9pZWVlODAyMTFfdmFyLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX2h0Lmg+ CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4KKyNpbmNsdWRlIDxuZXQ4 MDIxMS9pZWVlODAyMTFfcmNfc2FtcGxlLmg+CisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjEx X3JjX3NhbXBsZV90eHNjaGVkLmg+CisKK3N0YXRpYyB2b2lkCXNhbXBsZV9pbml0KHN0cnVjdCBp ZWVlODAyMTF2YXAgKiwgdWludDMyX3QpOworc3RhdGljIHZvaWQJc2FtcGxlX2RlaW5pdChzdHJ1 Y3QgaWVlZTgwMjExdmFwICopOworc3RhdGljIHZvaWQJc2FtcGxlX25vZGVfaW5pdChzdHJ1Y3Qg aWVlZTgwMjExX25vZGUgKik7CitzdGF0aWMgdm9pZAlzYW1wbGVfbm9kZV9kZWluaXQoc3RydWN0 IGllZWU4MDIxMV9ub2RlICopOworc3RhdGljIGludAlzYW1wbGVfcmF0ZShzdHJ1Y3QgaWVlZTgw MjExX25vZGUgKiwgdm9pZCAqLCB1aW50MzJfdCk7CitzdGF0aWMgdm9pZAlzYW1wbGVfdHhfY29t cGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqLAorICAgIAkJCWNvbnN0IHN0cnVjdCBp ZWVlODAyMTFfbm9kZSAqLCBpbnQsIAorCQkJdm9pZCAqLCB2b2lkICopOworc3RhdGljIHZvaWQJ c2FtcGxlX3R4X3VwZGF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisJCQljb25z dCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKiwgdm9pZCAqLCB2b2lkICosIHZvaWQgKik7CitzdGF0 aWMgdm9pZAlzYW1wbGVfc2V0aW50ZXJ2YWwoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqLCBp bnQpOworCisvKiBudW1iZXIgb2YgcmVmZXJlbmNlcyBmcm9tIG5ldDgwMjExIGxheWVyICovCitz dGF0aWMJaW50IG5yZWZzID0gMDsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0 ZWN0bCBzYW1wbGUgPSB7CisJLmlyX25hbWUJPSAic2FtcGxlIiwKKwkuaXJfYXR0YWNoCT0gTlVM TCwKKwkuaXJfZGV0YWNoCT0gTlVMTCwKKwkuaXJfaW5pdAk9IHNhbXBsZV9pbml0LAorCS5pcl9k ZWluaXQJPSBzYW1wbGVfZGVpbml0LAorCS5pcl9ub2RlX2luaXQJPSBzYW1wbGVfbm9kZV9pbml0 LAorCS5pcl9ub2RlX2RlaW5pdAk9IHNhbXBsZV9ub2RlX2RlaW5pdCwKKwkuaXJfcmF0ZQk9IHNh bXBsZV9yYXRlLAorCS5pcl9yYXRlcwk9IHNhbXBsZV9yYXRlcywKKwkuaXJfdHhfY29tcGxldGUJ PSBzYW1wbGVfdHhfY29tcGxldGUsCisJLmlyX3R4X3VwZGF0ZQk9IHNhbXBsZV90eF91cGRhdGUs CisJLmlyX3NldGludGVydmFsCT0gc2FtcGxlX3NldGludGVydmFsLAorfTsKK0lFRUU4MDIxMV9S QVRFQ1RMX01PRFVMRShzYW1wbGUsIDEpOworSUVFRTgwMjExX1JBVEVDVExfQUxHKHNhbXBsZSwg SUVFRTgwMjExX1JBVEVDVExfU0FNUExFLCBzYW1wbGUpOworCitzdGF0aWMgdm9pZAorc2FtcGxl X2luaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLCB1aW50MzJfdCBjYXBhYmlsaXRpZXMpCit7 CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZTsKKworCUtBU1NFUlQodmFwLT5pdl9y cyA9PSBOVUxMLCAoIiVzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyIsIF9fZnVuY19fKSk7CisKKwlz YW1wbGUgPSB2YXAtPml2X3JzID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3NhbXBs ZSksCisJICAgIE1fODAyMTFfUkFURUNUTCwgTV9OT1dBSVR8TV9aRVJPKTsKKwlpZiAoc2FtcGxl ID09IE5VTEwpIHsKKwkJaWZfcHJpbnRmKHZhcC0+aXZfaWZwLCAiY291bGRuJ3QgYWxsb2MgcmF0 ZWN0bCBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm47CisJfQorCisJc3RydWN0IGllZWU4MDIxMV9y Y19zdGF0ICogaXJzID0gSUVFRTgwMjExX1JBVEVDVExfU1RBVCh2YXApOworCWlycy0+aXJzX2Nh cGFiaWxpdGllcyA9IGNhcGFiaWxpdGllczsKKworCXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19y YXRlID0gNzU7CQkvKiBld21hIHBlcmNlbnRhZ2UgKFswLi45OV0pICovCisJc2FtcGxlLT5zYW1w bGVfc21vb3RoaW5nX21pbnBhY2tldHMgPSAxMDAgLyAoMTAwIC0gc2FtcGxlLT5zYW1wbGVfc21v b3RoaW5nX3JhdGUpOworCXNhbXBsZS0+c2FtcGxlX3JhdGUgPSAxMDsJCQkvKiAldGltZSB0byB0 cnkgZGlmZiB0eCByYXRlcyAqLworCXNhbXBsZS0+c2FtcGxlX21heF9zdWNjZXNzaXZlX2ZhaWx1 cmVzID0gMzsJLyogdGhyZXNob2xkIGZvciByYXRlIHNhbXBsaW5nKi8KKwlzYW1wbGUtPnNhbXBs ZV9zdGFsZV9mYWlsdXJlX3RpbWVvdXQgPSAxMCAqIGh6OwkvKiAxMCBzZWNvbmRzICovCisJc2Ft cGxlLT5zYW1wbGVfbWluX3N3aXRjaCA9IGh6OwkJCS8qIDEgc2Vjb25kICovCisJc2FtcGxlX3Nl dGludGVydmFsKHZhcCwgNTAwIC8qIG1zICovKTsgCS8qIGFjdHVhbGx5IGRvIG5vdGhpbmcgKi8K KwlzYW1wbGVfc3lzY3RsYXR0YWNoKHZhcCwgdmFwLT5pdl9zeXNjdGwsIHZhcC0+aXZfb2lkKTsK K30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9kZWluaXQoc3RydWN0IGllZWU4MDIxMXZhcCAqdmFw KQoreworCWZyZWUodmFwLT5pdl9ycywgTV84MDIxMV9SQVRFQ1RMKTsKK30KKworc3RhdGljIGNv bnN0IHN0cnVjdCB0eHNjaGVkdWxlICptcnJfc2NoZWR1bGVzW0lFRUU4MDIxMV9NT0RFX01BWCsy XSA9IHsKKwlOVUxMLAkJLyogSUVFRTgwMjExX01PREVfQVVUTyAqLworCXNlcmllc18xMWEsCS8q IElFRUU4MDIxMV9NT0RFXzExQSAqLworCXNlcmllc18xMWcsCS8qIElFRUU4MDIxMV9NT0RFXzEx QiAqLworCXNlcmllc18xMWcsCS8qIElFRUU4MDIxMV9NT0RFXzExRyAqLworCU5VTEwsCQkvKiBJ RUVFODAyMTFfTU9ERV9GSCAqLworCXNlcmllc18xMWEsCS8qIElFRUU4MDIxMV9NT0RFX1RVUkJP X0EgKi8KKwlzZXJpZXNfMTFnLAkvKiBJRUVFODAyMTFfTU9ERV9UVVJCT19HICovCisJc2VyaWVz XzExYSwJLyogSUVFRTgwMjExX01PREVfU1RVUkJPX0EgKi8KKwlzZXJpZXNfMTFuYSwJLyogSUVF RTgwMjExX01PREVfMTFOQSAqLworCXNlcmllc18xMW5nLAkvKiBJRUVFODAyMTFfTU9ERV8xMU5H ICovCisJc2VyaWVzX2hhbGYsCS8qIElFRUU4MDIxMV9NT0RFX0hBTEYgKi8KKwlzZXJpZXNfcXVh cnRlciwJLyogSUVFRTgwMjExX01PREVfUVVBUlRFUiAqLworfTsKKworc3RhdGljIHZvaWQKK3Nh bXBsZV9ub2RlX2luaXQoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKyNkZWZpbmUJUkFU RShfaXgpCShuaS0+bmlfcmF0ZXMucnNfcmF0ZXNbKF9peCldICYgSUVFRTgwMjExX1JBVEVfVkFM KQorI2RlZmluZQlET1QxMVJBVEUoX2l4KQkocnQtPmluZm9bKF9peCldLmRvdDExUmF0ZSAmIElF RUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJTUNTKF9peCkJKG5pLT5uaV9odHJhdGVzLnJzX3Jh dGVzW19peF0gfCBJRUVFODAyMTFfUkFURV9NQ1MpCisJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFw ID0gbmktPm5pX3ZhcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSAqc2FtcGxlID0gdmFwLT5p dl9yczsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBOVUxMOworCWNvbnN0 IHN0cnVjdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJs ZSh2YXAtPml2X2ljLT5pY19jdXJjaGFuKTsKKwllbnVtIGllZWU4MDIxMV9waHltb2RlIGN1cm1v ZGUgPSBpZWVlODAyMTFfY2hhbjJtb2RlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCWludCB4 LCB5LCByaXg7CisKKwlpZiAobmktPm5pX3JjdGxzID09IE5VTEwpIHsKKwkJbmktPm5pX3JjdGxz ID0gc2FuID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlKSwKKwkJ ICAgIE1fODAyMTFfUkFURUNUTCwgTV9OT1dBSVR8TV9aRVJPKTsKKwkJaWYgKHNhbiA9PSBOVUxM KSB7CisJCQlpZl9wcmludGYodmFwLT5pdl9pZnAsICJjb3VsZG4ndCBhbGxvYyBwZXItbm9kZSBy YXRlY3RsICIKKwkJCSAgICAic3RydWN0dXJlXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxz ZQorCQlzYW4gPSBuaS0+bmlfcmN0bHM7CisJCisJc2FuLT5zYW5fc2FtcGxlID0gc2FtcGxlOwor CisJS0FTU0VSVChydCAhPSBOVUxMLCAoIm5vIHJhdGUgdGFibGUsIG1vZGUgJXUiLCBjdXJtb2Rl KSk7CisKKwlzYW4tPnNjaGVkID0gbXJyX3NjaGVkdWxlc1tjdXJtb2RlXTsKKwlLQVNTRVJUKHNh bi0+c2NoZWQgIT0gTlVMTCwgKCJubyBtcnIgc2NoZWR1bGUgZm9yIG1vZGUgJXUiLCBjdXJtb2Rl KSk7CisKKwlzYW4tPnN0YXRpY19yaXggPSAtMTsKKwlzYW1wbGVfdXBkYXRlX3N0YXRpY19yaXgo bmkpOworCisJLyoKKwkgKiBDb25zdHJ1Y3QgYSBiaXRtYXNrIG9mIHVzYWJsZSByYXRlcy4gIFRo aXMgaGFzIGFsbAorCSAqIG5lZ290aWF0ZWQgcmF0ZXMgbWludXMgdGhvc2UgbWFya2VkIGJ5IHRo ZSBoYWwgYXMKKwkgKiB0byBiZSBpZ25vcmVkIGZvciBkb2luZyByYXRlIGNvbnRyb2wuCisJICov CisJc2FuLT5yYXRlbWFzayA9IDA7CisKKwkvKiBNQ1MgcmF0ZXMgKi8KKwlpZiAobmktPm5pX2Zs YWdzICYgSUVFRTgwMjExX05PREVfSFQpIHsKKwkJZm9yICh4ID0gMDsgeCA8IG5pLT5uaV9odHJh dGVzLnJzX25yYXRlczsgeCsrKSB7CisJCQlyaXggPSBydC0+cmF0ZUNvZGVUb0luZGV4W01DUyh4 KV07CisJCQlpZiAocml4ID09IDB4ZmYpCisJCQkJY29udGludWU7CisJCQkvKiBza2lwIHJhdGVz IG1hcmtlZCBicm9rZW4gYnkgaGFsICovCisJCQlpZiAoIXJ0LT5pbmZvW3JpeF0udmFsaWQpCisJ CQkJY29udGludWU7CisJCQlLQVNTRVJUKHJpeCA8IFNBTVBMRV9NQVhSQVRFUywKKwkJCSAgICAo Im1jcyAldSBoYXMgcml4ICVkIiwgTUNTKHgpLCByaXgpKTsKKwkJCXNhbi0+cmF0ZW1hc2sgfD0g KHVpbnQ2NF90KSAxPDxyaXg7CisJCX0KKwl9CisKKwkvKiBMZWdhY3kgcmF0ZXMgKi8KKwlmb3Ig KHggPSAwOyB4IDwgbmktPm5pX3JhdGVzLnJzX25yYXRlczsgeCsrKSB7CisJCXJpeCA9IHJ0LT5y YXRlQ29kZVRvSW5kZXhbUkFURSh4KV07CisJCWlmIChyaXggPT0gMHhmZikKKwkJCWNvbnRpbnVl OworCQkvKiBza2lwIHJhdGVzIG1hcmtlZCBicm9rZW4gYnkgaGFsICovCisJCWlmICghcnQtPmlu Zm9bcml4XS52YWxpZCkKKwkJCWNvbnRpbnVlOworCQlLQVNTRVJUKHJpeCA8IFNBTVBMRV9NQVhS QVRFUywKKwkJICAgICgicmF0ZSAldSBoYXMgcml4ICVkIiwgUkFURSh4KSwgcml4KSk7CisJCXNh bi0+cmF0ZW1hc2sgfD0gKHVpbnQ2NF90KSAxPDxyaXg7CisJfQorCisJZm9yICh5ID0gMDsgeSA8 IE5VTV9QQUNLRVRfU0laRV9CSU5TOyB5KyspIHsKKwkJaW50IHNpemUgPSBiaW5fdG9fc2l6ZSh5 KTsKKwkJdWludDY0X3QgbWFzazsKKworCQlzYW4tPnBhY2tldHNfc2VudFt5XSA9IDA7CisJCXNh bi0+Y3VycmVudF9zYW1wbGVfcml4W3ldID0gLTE7CisJCXNhbi0+bGFzdF9zYW1wbGVfcml4W3ld ID0gMDsKKwkJLyogWFhYIHN0YXJ0IHdpdGggZmlyc3QgdmFsaWQgcmF0ZSAqLworCQlzYW4tPmN1 cnJlbnRfcml4W3ldID0gZmZzKHNhbi0+cmF0ZW1hc2spLTE7CisJCQorCQkvKgorCQkgKiBJbml0 aWFsaXplIHRoZSBzdGF0aXN0aWNzIGJ1Y2tldHM7IHRoZXNlIGFyZQorCQkgKiBpbmRleGVkIGJ5 IHRoZSByYXRlIGNvZGUgaW5kZXguCisJCSAqLworCQlmb3IgKHJpeCA9IDAsIG1hc2sgPSBzYW4t PnJhdGVtYXNrOyBtYXNrICE9IDA7IHJpeCsrLCBtYXNrID4+PSAxKSB7CisJCQlpZiAoKG1hc2sg JiAxKSA9PSAwKQkJLyogbm90IGEgdmFsaWQgcmF0ZSAqLworCQkJCWNvbnRpbnVlOworCQkJc2Fu LT5zdGF0c1t5XVtyaXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgPSAwOworCQkJc2FuLT5zdGF0c1t5 XVtyaXhdLnRyaWVzID0gMDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS50b3RhbF9wYWNrZXRzID0g MDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5wYWNrZXRzX2Fja2VkID0gMDsKKwkJCXNhbi0+c3Rh dHNbeV1bcml4XS5sYXN0X3R4ID0gMDsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5ld21hX3BjdCA9 IDA7CisJCQkKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5wZXJmZWN0X3R4X3RpbWUgPQorCQkJICAg IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCByaXgsIDAsIDAsCisJCQkgICAg KG5pLT5uaV9jaHcgPT0gNDApKTsKKwkJCXNhbi0+c3RhdHNbeV1bcml4XS5hdmVyYWdlX3R4X3Rp bWUgPQorCQkJICAgIHNhbi0+c3RhdHNbeV1bcml4XS5wZXJmZWN0X3R4X3RpbWU7CisJCX0KKwl9 CisKKwkvKiBzZXQgdGhlIHZpc2libGUgYml0LXJhdGUgKi8KKwlpZiAoc2FuLT5zdGF0aWNfcml4 ICE9IC0xKQorCQluaS0+bmlfdHhyYXRlID0gRE9UMTFSQVRFKHNhbi0+c3RhdGljX3JpeCk7CisJ ZWxzZQorCQluaS0+bmlfdHhyYXRlID0gUkFURSgwKTsKKyN1bmRlZiBSQVRFCisjdW5kZWYgRE9U MTFSQVRFCisjdW5kZWYgTUNTCit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfbm9kZV9kZWluaXQo c3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSkKK3sKKwlmcmVlKG5pLT5uaV9yY3RscywgTV84MDIx MV9SQVRFQ1RMKTsKK30KKworc3RhdGljIGludAorZG90MTFyYXRlKGNvbnN0IGllZWU4MDIxMV9y YXRlX3RhYmxlICpydCwgaW50IHJpeCkKK3sKKwlpZiAocml4IDwgMCkKKwkJcmV0dXJuIC0xOwor CXJldHVybiBydC0+aW5mb1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9IVCA/CisJICAgIHJ0LT5p bmZvW3JpeF0uZG90MTFSYXRlIDogKHJ0LT5pbmZvW3JpeF0uZG90MTFSYXRlICYgSUVFRTgwMjEx X1JBVEVfVkFMKSAvIDI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICoKK2RvdDExcmF0ZV9sYWJl bChjb25zdCBpZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQsIGludCByaXgpCit7CisJaWYgKHJpeCA8 IDApCisJCXJldHVybiAiIjsKKwlyZXR1cm4gcnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjEx X1RfSFQgPyAiTUNTIiA6ICJNYiAiOworfQorCisvKgorICogUmV0dXJuIHRoZSByaXggd2l0aCB0 aGUgbG93ZXN0IGF2ZXJhZ2VfdHhfdGltZSwKKyAqIG9yIC0xIGlmIGFsbCB0aGUgYXZlcmFnZV90 eF90aW1lcyBhcmUgMC4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcGlja19iZXN0X3JhdGUo Y29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9y YXRlX3RhYmxlICpydCwKKyAgICBpbnQgc2l6ZV9iaW4sIGludCByZXF1aXJlX2Fja2VkX2JlZm9y ZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9ub2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7 CisgICAgaW50IGJlc3RfcmF0ZV9yaXgsIGJlc3RfcmF0ZV90dCwgYmVzdF9yYXRlX3BjdDsKKwl1 aW50NjRfdCBtYXNrOworCWludCByaXgsIHR0LCBwY3Q7CisKKyAgICBiZXN0X3JhdGVfcml4ID0g MDsKKyAgICBiZXN0X3JhdGVfdHQgPSAwOworCWJlc3RfcmF0ZV9wY3QgPSAwOworCisJZm9yICht YXNrID0gc2FuLT5yYXRlbWFzaywgcml4ID0gMDsgbWFzayAhPSAwOyBtYXNrID4+PSAxLCByaXgr KykgeworCQlpZiAoKG1hc2sgJiAxKSA9PSAwKQkJLyogbm90IGEgc3VwcG9ydGVkIHJhdGUgKi8K KwkJCWNvbnRpbnVlOworCisJCS8qIERvbid0IHBpY2sgYSBub24tSFQgcmF0ZSBmb3IgYSBIVCBu b2RlICovCisJCWlmICgobmktPm5pX2ZsYWdzICYgSUVFRTgwMjExX05PREVfSFQpICYmCisJCSAg ICAocnQtPmluZm9bcml4XS5waHkgIT0gSUVFRTgwMjExX1RfSFQpKSB7CisJCQljb250aW51ZTsK KwkJfQorCisJCXR0ID0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5hdmVyYWdlX3R4X3RpbWU7 CisJCWlmICh0dCA8PSAwIHx8CisJCSAgICAocmVxdWlyZV9hY2tlZF9iZWZvcmUgJiYKKwkJICAg ICAhc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5wYWNrZXRzX2Fja2VkKSkKKwkJCWNvbnRpbnVl OworCisJCS8qIENhbGN1bGF0ZSBwZXJjZW50YWdlIGlmIHBvc3NpYmxlICovCisJCWlmIChzYW4t PnN0YXRzW3NpemVfYmluXVtyaXhdLnRvdGFsX3BhY2tldHMgPiAwKSB7CisJCQlwY3QgPSBzYW4t PnN0YXRzW3NpemVfYmluXVtyaXhdLmV3bWFfcGN0OworCQl9IGVsc2UgeworCQkJLyogWFhYIGZv ciBub3csIGFzc3VtZSA5NSUgb2sgKi8KKwkJCXBjdCA9IDk1OworCQl9CisKKwkJLyogZG9uJ3Qg dXNlIGEgYml0LXJhdGUgdGhhdCBoYXMgYmVlbiBmYWlsaW5nICovCisJCWlmIChzYW4tPnN0YXRz W3NpemVfYmluXVtyaXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMgPiAzKQorCQkJY29udGludWU7CisK KwkJLyoKKwkJICogRm9yIEhULCBEb24ndCB1c2UgYSBiaXQgcmF0ZSB0aGF0IGlzIG11Y2ggbW9y ZQorCQkgKiBsb3NzeSB0aGFuIHRoZSBiZXN0LgorCQkgKgorCQkgKiBYWFggdGhpcyBpc24ndCBv cHRpbWFsOyBpdCdzIGp1c3QgZGVzaWduZWQgdG8KKwkJICogZWxpbWluYXRlIHJhdGVzIHRoYXQg YXJlIGdvaW5nIHRvIGJlIG9idmlvdXNseQorCQkgKiB3b3JzZS4KKwkJICovCisJCWlmIChuaS0+ bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgeworCQkJaWYgKGJlc3RfcmF0ZV9wY3QgPiAo cGN0ICsgNTApKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogRm9yIG5vbi1NQ1Mg cmF0ZXMsIHVzZSB0aGUgY3VycmVudCBhdmVyYWdlIHR4dGltZSBmb3IKKwkJICogY29tcGFyaXNv bi4KKwkJICovCisJCWlmICghIChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkpIHsK KwkJCWlmIChiZXN0X3JhdGVfdHQgPT0gMCB8fCB0dCA8PSBiZXN0X3JhdGVfdHQpIHsKKwkJCQli ZXN0X3JhdGVfdHQgPSB0dDsKKwkJCQliZXN0X3JhdGVfcml4ID0gcml4OworCQkJCWJlc3RfcmF0 ZV9wY3QgPSBwY3Q7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBTaW5jZSAyIHN0cmVhbSByYXRl cyBoYXZlIHNsaWdodGx5IGhpZ2hlciBUWCB0aW1lcywKKwkJICogYWxsb3cgYSBsaXR0bGUgYml0 IG9mIGxlZXdheS4gVGhpcyBzaG91bGQgbGF0ZXIKKwkJICogYmUgYWJzdHJhY3RlZCBvdXQgYW5k IHByb3Blcmx5IGhhbmRsZWQuCisJCSAqLworCQlpZiAobmktPm5pX2ZsYWdzICYgSUVFRTgwMjEx X05PREVfSFQpIHsKKwkJCWlmIChiZXN0X3JhdGVfdHQgPT0gMCB8fCAodHQgKiA4IDw9IGJlc3Rf cmF0ZV90dCAqIDEwKSkgeworCQkJCWJlc3RfcmF0ZV90dCA9IHR0OworCQkJCWJlc3RfcmF0ZV9y aXggPSByaXg7CisJCQkJYmVzdF9yYXRlX3BjdCA9IHBjdDsKKwkJCX0KKwkJfQorICAgICAgICB9 CisgICAgICAgIHJldHVybiAoYmVzdF9yYXRlX3R0ID8gYmVzdF9yYXRlX3JpeCA6IC0xKTsKK30K KworLyoKKyAqIFBpY2sgYSBnb29kICJyYW5kb20iIGJpdC1yYXRlIHRvIHNhbXBsZSBvdGhlciB0 aGFuIHRoZSBjdXJyZW50IG9uZS4KKyAqLworc3RhdGljIF9faW5saW5lIGludAorcGlja19zYW1w bGVfcmF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBjb25zdCBpZWVlODAyMTFf cmF0ZV90YWJsZSAqcnQsIAorCWludCBzaXplX2JpbikKK3sKKyNkZWZpbmUJRE9UMTFSQVRFKGl4 KQkocnQtPmluZm9baXhdLmRvdDExUmF0ZSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJ TUNTKGl4KQkJKHJ0LT5pbmZvW2l4XS5kb3QxMVJhdGUgfCBJRUVFODAyMTFfUkFURV9NQ1MpCisJ c3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCXN0cnVj dCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9zYW1wbGU7CisJaW50IGN1cnJl bnRfcml4LCByaXg7CisJdW5zaWduZWQgY3VycmVudF90dDsKKwl1aW50NjRfdCBtYXNrOworCQor CWN1cnJlbnRfcml4ID0gc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl07CisJaWYgKGN1cnJlbnRf cml4IDwgMCkgeworCQkvKiBubyBzdWNjZXNzZXMgeWV0LCBzZW5kIGF0IHRoZSBsb3dlc3QgYml0 LXJhdGUgKi8KKwkJLyogWFhYIHNob3VsZCByZXR1cm4gTUNTMCBpZiBIVCAqLworCQlyZXR1cm4g MDsKKwl9CisKKwljdXJyZW50X3R0ID0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bY3VycmVudF9yaXhd LmF2ZXJhZ2VfdHhfdGltZTsKKworCXJpeCA9IHNhbi0+bGFzdF9zYW1wbGVfcml4W3NpemVfYmlu XSsxOwkvKiBuZXh0IHNhbXBsZSByYXRlICovCisJbWFzayA9IHNhbi0+cmF0ZW1hc2sgJn4gKCh1 aW50NjRfdCkgMTw8Y3VycmVudF9yaXgpOy8qIGRvbid0IHNhbXBsZSBjdXJyZW50IHJhdGUgKi8K Kwl3aGlsZSAobWFzayAhPSAwKSB7CisJCWlmICgobWFzayAmICgodWludDY0X3QpIDE8PHJpeCkp ID09IDApIHsJLyogbm90IGEgc3VwcG9ydGVkIHJhdGUgKi8KKwluZXh0cmF0ZToKKwkJCWlmICgr K3JpeCA+PSBydC0+cmF0ZUNvdW50KQorCQkJCXJpeCA9IDA7CisJCQljb250aW51ZTsKKwkJfQor CisJCS8qCisJCSAqIFRoZSBmb2xsb3dpbmcgY29kZSBzdG9wcyB0cnlpbmcgdG8gc2FtcGxlCisJ CSAqIG5vbi1NQ1MgcmF0ZXMgd2hlbiBzcGVha2luZyB0byBhbiBNQ1Mgbm9kZS4KKwkJICogSG93 ZXZlciwgYXQgbGVhc3QgZm9yIENDSyByYXRlcyBpbiAyLjRHSHogbW9kZSwKKwkJICogdGhlIG5v bi1NQ1MgcmF0ZXMgTUFZIGFjdHVhbGx5IHByb3ZpZGUgYmV0dGVyCisJCSAqIFBFUiBhdCB0aGUg dmVyeSBmYXIgZWRnZSBvZiByZWNlcHRpb24uCisJCSAqCisJCSAqIEhvd2V2ZXIhIFVudGlsIGF0 aF9yYXRlX2Zvcm1fYWdncigpIGdyb3dzCisJCSAqIHNvbWUgbG9naWMgdG8gbm90IGZvcm0gYWdn cmVnYXRlcyBpZiB0aGUKKwkJICogc2VsZWN0ZWQgcmF0ZSBpcyBub24tTUNTLCB0aGlzIHdvbid0 IHdvcmsuCisJCSAqCisJCSAqIFNvIGRvbid0IGRpc2FibGUgdGhpcyBjb2RlIHVudGlsIHlvdSd2 ZSB0YXVnaHQKKwkJICogYXRoX3JhdGVfZm9ybV9hZ2dyKCkgdG8gZHJvcCBvdXQgaWYgYW55IG9m CisJCSAqIHRoZSBzZWxlY3RlZCByYXRlcyBhcmUgbm9uLU1DUy4KKwkJICovCisjaWYgMQorCQkv KiBpZiB0aGUgbm9kZSBpcyBIVCBhbmQgdGhlIHJhdGUgaXNuJ3QgSFQsIGRvbid0IGJvdGhlciBz YW1wbGUgKi8KKwkJaWYgKChuaS0+bmlfZmxhZ3MgJiBJRUVFODAyMTFfTk9ERV9IVCkgJiYKKwkJ ICAgIChydC0+aW5mb1tyaXhdLnBoeSAhPSBJRUVFODAyMTFfVF9IVCkpIHsKKwkJCW1hc2sgJj0g figodWludDY0X3QpIDE8PHJpeCk7CisJCQlnb3RvIG5leHRyYXRlOworCQl9CisjZW5kaWYKKwor CQkvKiB0aGlzIGJpdC1yYXRlIGlzIGFsd2F5cyB3b3JzZSB0aGFuIHRoZSBjdXJyZW50IG9uZSAq LworCQlpZiAoc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5wZXJmZWN0X3R4X3RpbWUgPiBjdXJy ZW50X3R0KSB7CisJCQltYXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJZ290byBuZXh0 cmF0ZTsKKwkJfQorCisJCS8qIHJhcmVseSBzYW1wbGUgYml0LXJhdGVzIHRoYXQgZmFpbCBhIGxv dCAqLworCQlpZiAoc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5zdWNjZXNzaXZlX2ZhaWx1cmVz ID4gc2FtcGxlLT5zYW1wbGVfbWF4X3N1Y2Nlc3NpdmVfZmFpbHVyZXMgJiYKKwkJICAgIHRpY2tz IC0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4XS5sYXN0X3R4IDwgc2FtcGxlLT5zYW1wbGVfc3Rh bGVfZmFpbHVyZV90aW1lb3V0KSB7CisJCQltYXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOwor CQkJZ290byBuZXh0cmF0ZTsKKwkJfQorCisJCS8qCisJCSAqIEZvciBIVCwgb25seSBzYW1wbGUg YSBmZXcgcmF0ZXMgb24gZWl0aGVyIHNpZGUgb2YgdGhlCisJCSAqIGN1cnJlbnQgcml4OyB0aGVy ZSdzIHF1aXRlIGxpa2VseSBhIGxvdCBvZiB0aGVtLgorCQkgKi8KKwkJaWYgKG5pLT5uaV9mbGFn cyAmIElFRUU4MDIxMV9OT0RFX0hUKSB7CisJCQlpZiAocml4IDwgKGN1cnJlbnRfcml4IC0gMykg fHwKKwkJCSAgICByaXggPiAoY3VycmVudF9yaXggKyAzKSkgeworCQkJCW1hc2sgJj0gfigodWlu dDY0X3QpIDE8PHJpeCk7CisJCQkJZ290byBuZXh0cmF0ZTsKKwkJCX0KKwkJfQorCisJCS8qIERv bid0IHNhbXBsZSBtb3JlIHRoYW4gMiByYXRlcyBoaWdoZXIgZm9yIHJhdGVzID4gMTFNIGZvciBu b24tSFQgcmF0ZXMgKi8KKwkJaWYgKCEgKG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hU KSkgeworCQkJaWYgKERPVDExUkFURShyaXgpID4gMioxMSAmJiByaXggPiBjdXJyZW50X3JpeCAr IDIpIHsKKwkJCQltYXNrICY9IH4oKHVpbnQ2NF90KSAxPDxyaXgpOworCQkJCWdvdG8gbmV4dHJh dGU7CisJCQl9CisJCX0KKworCQlzYW4tPmxhc3Rfc2FtcGxlX3JpeFtzaXplX2Jpbl0gPSByaXg7 CisJCXJldHVybiByaXg7CisJfQorCXJldHVybiBjdXJyZW50X3JpeDsKKyN1bmRlZiBET1QxMVJB VEUKKyN1bmRlZiBNQ1MKK30KKworc3RhdGljIGludAorc2FtcGxlX2dldF9zdGF0aWNfcml4KGNv bnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCit7CisjZGVmaW5lCVJBVEUoX2l4KQkobmkt Pm5pX3JhdGVzLnJzX3JhdGVzWyhfaXgpXSAmIElFRUU4MDIxMV9SQVRFX1ZBTCkKKyNkZWZpbmUJ TUNTKF9peCkJKG5pLT5uaV9odHJhdGVzLnJzX3JhdGVzW19peF0gfCBJRUVFODAyMTFfUkFURV9N Q1MpCisJc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKKwljb25zdCBzdHJ1 Y3QgaWVlZTgwMjExX3JhdGVfdGFibGUgKnJ0ID0gaWVlZTgwMjExX2dldF9yYXRldGFibGUodmFw LT5pdl9pYy0+aWNfY3VyY2hhbik7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eHBhcmFtICp0 cCA9IG5pLT5uaV90eHBhcm1zOworCWludCBzcmF0ZTsKKworCS8qIENoZWNrIE1DUyByYXRlcyAq LworCWZvciAoc3JhdGUgPSBuaS0+bmlfaHRyYXRlcy5yc19ucmF0ZXMgLSAxOyBzcmF0ZSA+PSAw OyBzcmF0ZS0tKSB7CisJCWlmIChNQ1Moc3JhdGUpID09IHRwLT51Y2FzdHJhdGUpCisJCQlyZXR1 cm4gcnQtPnJhdGVDb2RlVG9JbmRleFt0cC0+dWNhc3RyYXRlXTsKKwl9CisKKwkvKiBDaGVjayBs ZWdhY3kgcmF0ZXMgKi8KKwlmb3IgKHNyYXRlID0gbmktPm5pX3JhdGVzLnJzX25yYXRlcyAtIDE7 IHNyYXRlID49IDA7IHNyYXRlLS0pIHsKKwkJaWYgKFJBVEUoc3JhdGUpID09IHRwLT51Y2FzdHJh dGUpCisJCQlyZXR1cm4gcnQtPnJhdGVDb2RlVG9JbmRleFt0cC0+dWNhc3RyYXRlXTsKKwl9CisJ cmV0dXJuIC0xOworI3VuZGVmCVJBVEUKKyN1bmRlZglNQ1MKK30KKworc3RhdGljIHZvaWQKK3Nh bXBsZV91cGRhdGVfc3RhdGljX3JpeChzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pKQoreworCXN0 cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsKKwljb25zdCBz dHJ1Y3QgaWVlZTgwMjExX3R4cGFyYW0gKnRwID0gbmktPm5pX3R4cGFybXM7CisKKwlpZiAodHAg IT0gTlVMTCAmJiB0cC0+dWNhc3RyYXRlICE9IElFRUU4MDIxMV9GSVhFRF9SQVRFX05PTkUpIHsK KwkJLyoKKwkJICogQSBmaXhlZCByYXRlIGlzIHRvIGJlIHVzZWQ7IHVjYXN0cmF0ZSBpcyB0aGUg SUVFRSBjb2RlCisJCSAqIGZvciB0aGlzIHJhdGUgKHNhbnMgYmFzaWMgYml0KS4gIENoZWNrIHRo aXMgYWdhaW5zdCB0aGUKKwkJICogbmVnb3RpYXRlZCByYXRlIHNldCBmb3IgdGhlIG5vZGUuICBO b3RlIHRoZSBmaXhlZCByYXRlCisJCSAqIG1heSBub3QgYmUgYXZhaWxhYmxlIGZvciB2YXJpb3Vz IHJlYXNvbnMgc28gd2Ugb25seQorCQkgKiBzZXR1cCB0aGUgc3RhdGljIHJhdGUgaW5kZXggaWYg dGhlIGxvb2t1cCBpcyBzdWNjZXNzZnVsLgorCQkgKi8KKwkJc2FuLT5zdGF0aWNfcml4ID0gc2Ft cGxlX2dldF9zdGF0aWNfcml4KG5pKTsKKwl9IGVsc2UgeworCQlzYW4tPnN0YXRpY19yaXggPSAt MTsKKwl9Cit9CisKKy8qCisgKiBQaWNrIGEgbm9uLUhUIHJhdGUgdG8gYmVnaW4gdXNpbmcuCisg Ki8KK3N0YXRpYyBpbnQKK3NhbXBsZV9waWNrX3NlZWRfcmF0ZV9sZWdhY3koY29uc3Qgc3RydWN0 IGllZWU4MDIxMV9ub2RlICpuaSwgaW50IGZyYW1lTGVuKQoreworI2RlZmluZQlET1QxMVJBVEUo aXgpCShydC0+aW5mb1tpeF0uZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorCXN0cnVj dCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1w bGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0 ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2X2ljLT5pY19jdXJj aGFuKTsKKwkKKwljb25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2JpbihmcmFtZUxlbik7CisJ aW50IHJpeCA9IC0xOworCisJLyogbm8gcGFja2V0IGhhcyBiZWVuIHNlbnQgc3VjY2Vzc2Z1bGx5 IHlldCAqLworCWZvciAocml4ID0gcnQtPnJhdGVDb3VudC0xOyByaXggPiAwOyByaXgtLSkgewor CQlpZiAoKHNhbi0+cmF0ZW1hc2sgJiAoKHVpbnQ2NF90KSAxPDxyaXgpKSA9PSAwKQorCQkJY29u dGludWU7CisKKwkJLyogU2tpcCBIVCByYXRlcyAqLworCQlpZiAocnQtPmluZm9bcml4XS5waHkg PT0gSUVFRTgwMjExX1RfSFQpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBQaWNrIHRoZSBo aWdoZXN0IHJhdGUgPD0gMzYgTWJwcworCQkgKiB0aGF0IGhhc24ndCBmYWlsZWQuCisJCSAqLwor CQlpZiAoRE9UMTFSQVRFKHJpeCkgPD0gNzIgJiYKKwkJICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5d W3JpeF0uc3VjY2Vzc2l2ZV9mYWlsdXJlcyA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwly ZXR1cm4gcml4OworI3VuZGVmIERPVDExUkFURQorfQorCisvKgorICogUGljayBhIEhUIHJhdGUg dG8gYmVnaW4gdXNpbmcuCisgKgorICogRG9uJ3QgdXNlIGFueSBub24tSFQgcmF0ZXM7IG9ubHkg Y29uc2lkZXIgSFQgcmF0ZXMuCisgKi8KK3N0YXRpYyBpbnQKK3NhbXBsZV9waWNrX3NlZWRfcmF0 ZV9odChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25vZGUgKm5pLCBpbnQgZnJhbWVMZW4pCit7Cisj ZGVmaW5lCU1DUyhpeCkJCShydC0+aW5mb1tpeF0uZG90MTFSYXRlIHwgSUVFRTgwMjExX1JBVEVf TUNTKQorCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IG5pLT5uaV92YXA7CisJc3RydWN0IGll ZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmktPm5pX3JjdGxzOworCWNvbnN0IHN0cnVjdCBp ZWVlODAyMTFfcmF0ZV90YWJsZSAqcnQgPSBpZWVlODAyMTFfZ2V0X3JhdGV0YWJsZSh2YXAtPml2 X2ljLT5pY19jdXJjaGFuKTsKKwkKKwljb25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2Jpbihm cmFtZUxlbik7CisJaW50IHJpeCA9IC0xLCBodF9yaXggPSAtMTsKKworCS8qIG5vIHBhY2tldCBo YXMgYmVlbiBzZW50IHN1Y2Nlc3NmdWxseSB5ZXQgKi8KKwlmb3IgKHJpeCA9IHJ0LT5yYXRlQ291 bnQtMTsgcml4ID4gMDsgcml4LS0pIHsKKwkJLyogU2tpcCByYXRlcyB3ZSBjYW4ndCB1c2UgKi8K KwkJaWYgKChzYW4tPnJhdGVtYXNrICYgKCh1aW50NjRfdCkgMTw8cml4KSkgPT0gMCkKKwkJCWNv bnRpbnVlOworCisJCS8qIEtlZXAgYSBjb3B5IG9mIHRoZSBsYXN0IHNlZW4gSFQgcmF0ZSBpbmRl eCAqLworCQlpZiAocnQtPmluZm9bcml4XS5waHkgPT0gSUVFRTgwMjExX1RfSFQpCisJCQlodF9y aXggPSByaXg7CisKKwkJLyogU2tpcCBub24tSFQgcmF0ZXMgKi8KKwkJaWYgKHJ0LT5pbmZvW3Jp eF0ucGh5ICE9IElFRUU4MDIxMV9UX0hUKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogUGlj ayBhIG1lZGl1bS1zcGVlZCByYXRlIHJlZ2FyZGxlc3Mgb2Ygc3RyZWFtIGNvdW50CisJCSAqIHdo aWNoIGhhcyBub3Qgc2VlbiBhbnkgZmFpbHVyZXMuIEhpZ2hlciByYXRlcyBtYXkgZmFpbDsKKwkJ ICogd2UnbGwgdHJ5IHRoZW0gbGF0ZXIuCisJCSAqLworCQlpZiAoKChNQ1Mocml4KSAmIDB4Nykg PD0gNCkgJiYKKwkJICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeF0uc3VjY2Vzc2l2ZV9mYWls dXJlcyA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogSWYgYWxsIHRoZSBN Q1MgcmF0ZXMgaGF2ZSBzdWNjZXNzaXZlIGZhaWx1cmVzLCByaXggc2hvdWxkIGJlCisJICogPiAw OyBvdGhlcndpc2UgdXNlIHRoZSBsb3dlc3QgTUNTIHJpeCAoaG9wZWZ1bGx5IE1DUyAwLikKKwkg Ki8KKwlyZXR1cm4gTUFYKHJpeCwgaHRfcml4KTsKKyN1bmRlZiBNQ1MKK30KKworc3RhdGljIGlu dAorc2FtcGxlX3JhdGUoc3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgdm9pZCAqYXJnIF9fdW51 c2VkLCB1aW50MzJfdCBpYXJnIF9fdW51c2VkKQoreworI2RlZmluZQlET1QxMVJBVEUoaXgpCShy dC0+aW5mb1tpeF0uZG90MTFSYXRlICYgSUVFRTgwMjExX1JBVEVfVkFMKQorI2RlZmluZQlNQ1Mo aXgpCQkocnQtPmluZm9baXhdLmRvdDExUmF0ZSB8IElFRUU4MDIxMV9SQVRFX01DUykKKyNkZWZp bmUJUkFURShpeCkJKERPVDExUkFURShpeCkgLyAyKQorCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZh cCA9IG5pLT5uaV92YXA7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSAqc2FuID0gbmkt Pm5pX3JjdGxzOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSBzYW4tPnNhbl9z YW1wbGU7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIx MV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCQorCWludCByaXgsIG1y ciwgYmVzdF9yaXgsIGNoYW5nZV9yYXRlczsKKwl1bnNpZ25lZCBhdmVyYWdlX3R4X3RpbWU7CisJ CisJc2l6ZV90IGZyYW1lTGVuID0gKHNpemVfdClpYXJnOworCWNvbnN0IGludCBzaXplX2JpbiA9 IHNpemVfdG9fYmluKGZyYW1lTGVuKTsKKworCXNhbXBsZV91cGRhdGVfc3RhdGljX3JpeChuaSk7 CisKKwlpZiAoc2FuLT5zdGF0aWNfcml4ICE9IC0xKSB7CisJCXJpeCA9IHNhbi0+c3RhdGljX3Jp eDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChJRUVFODAyMTFfUkFURUNUTF9IQVNDQVBfTVJS KHZhcCkpCisJCW1yciA9IDE7CisJaWYgKCEgSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01SUlBS T1QodmFwKSkKKwkJbXJyID0gMDsKKworCWJlc3Rfcml4ID0gcGlja19iZXN0X3JhdGUobmksIHJ0 LCBzaXplX2JpbiwgIW1ycik7CisJaWYgKGJlc3Rfcml4ID49IDApIHsKKwkJYXZlcmFnZV90eF90 aW1lID0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bYmVzdF9yaXhdLmF2ZXJhZ2VfdHhfdGltZTsKKwl9 IGVsc2UgeworCQlhdmVyYWdlX3R4X3RpbWUgPSAwOworCX0KKworCS8qCisJICogTGltaXQgdGhl IHRpbWUgbWVhc3VyaW5nIHRoZSBwZXJmb3JtYW5jZSBvZiBvdGhlciB0eAorCSAqIHJhdGVzIHRv IHNhbXBsZV9yYXRlJSBvZiB0aGUgdG90YWwgdHJhbnNtaXNzaW9uIHRpbWUuCisJICovCisJaWYg KHNhbi0+c2FtcGxlX3R0W3NpemVfYmluXSA8IGF2ZXJhZ2VfdHhfdGltZSAqIChzYW4tPnBhY2tl dHNfc2luY2Vfc2FtcGxlW3NpemVfYmluXSAqCisJCXNhbXBsZS0+c2FtcGxlX3JhdGUvMTAwKSkg eworCQlyaXggPSBwaWNrX3NhbXBsZV9yYXRlKG5pLCBydCwgc2l6ZV9iaW4pOworCQlJRUVFODAy MTFfTk9URSh2YXAsIElFRUU4MDIxMV9NU0dfUkFURUNUTCwKKwkJICAgICAmbmksICJhdHQgJWQg c2FtcGxlX3R0ICVkIHNpemUgJXUgc2FtcGxlIHJhdGUgJWQgJXMgY3VycmVudCByYXRlICVkICVz IiwKKwkJICAgICBhdmVyYWdlX3R4X3RpbWUsCisJCSAgICAgc2FuLT5zYW1wbGVfdHRbc2l6ZV9i aW5dLAorCQkgICAgIGJpbl90b19zaXplKHNpemVfYmluKSwKKwkJICAgICBkb3QxMXJhdGUocnQs IHJpeCksCisJCSAgICAgZG90MTFyYXRlX2xhYmVsKHJ0LCByaXgpLAorCQkgICAgIGRvdDExcmF0 ZShydCwgc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl0pLAorCQkgICAgIGRvdDExcmF0ZV9sYWJl bChydCwgc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl0pKTsKKwkJaWYgKHJpeCAhPSBzYW4tPmN1 cnJlbnRfcml4W3NpemVfYmluXSkgeworCQkJc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbc2l6ZV9i aW5dID0gcml4OworCQl9IGVsc2UgeworCQkJc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbc2l6ZV9i aW5dID0gLTE7CisJCX0KKwkJc2FuLT5wYWNrZXRzX3NpbmNlX3NhbXBsZVtzaXplX2Jpbl0gPSAw OworCX0gZWxzZSB7CisJCWNoYW5nZV9yYXRlcyA9IDA7CisJCWlmICghc2FuLT5wYWNrZXRzX3Nl bnRbc2l6ZV9iaW5dIHx8IGJlc3Rfcml4ID09IC0xKSB7CisJCQkvKiBubyBwYWNrZXQgaGFzIGJl ZW4gc2VudCBzdWNjZXNzZnVsbHkgeWV0ICovCisJCQljaGFuZ2VfcmF0ZXMgPSAxOworCQkJaWYg KG5pLT5uaV9mbGFncyAmIElFRUU4MDIxMV9OT0RFX0hUKQorCQkJCWJlc3Rfcml4ID0gc2FtcGxl X3BpY2tfc2VlZF9yYXRlX2h0KG5pLCBmcmFtZUxlbik7CisJCQllbHNlCisJCQkJYmVzdF9yaXgg PSBzYW1wbGVfcGlja19zZWVkX3JhdGVfbGVnYWN5KG5pLCBmcmFtZUxlbik7CisJCX0gZWxzZSBp ZiAoc2FuLT5wYWNrZXRzX3NlbnRbc2l6ZV9iaW5dIDwgMjApIHsKKwkJCS8qIGxldCB0aGUgYml0 LXJhdGUgc3dpdGNoIHF1aWNrbHkgZHVyaW5nIHRoZSBmaXJzdCBmZXcgcGFja2V0cyAqLworCQkJ SUVFRTgwMjExX05PVEUodmFwLAorCQkJICAgIElFRUU4MDIxMV9NU0dfUkFURUNUTCwgJm5pLAor CQkJICAgICIlczogc3dpdGNoaW5nIHF1aWNrbHkuLiIsIF9fZnVuY19fKTsKKwkJCWNoYW5nZV9y YXRlcyA9IDE7CisJCX0gZWxzZSBpZiAodGlja3MgLSBzYW1wbGUtPnNhbXBsZV9taW5fc3dpdGNo ID4gc2FuLT50aWNrc19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dKSB7CisJCQkvKiBtaW5fc3dpdGNo IHNlY29uZHMgaGF2ZSBnb25lIGJ5ICovCisJCQlJRUVFODAyMTFfTk9URSh2YXAsCisJCQkgICAg SUVFRTgwMjExX01TR19SQVRFQ1RMLCAmbmksCisJCQkgICAgIiVzOiBtaW5fc3dpdGNoICVkID4g dGlja3Nfc2luY2Vfc3dpdGNoICVkLi4iLAorCQkJICAgIF9fZnVuY19fLCB0aWNrcyAtIHNhbXBs ZS0+c2FtcGxlX21pbl9zd2l0Y2gsIHNhbi0+dGlja3Nfc2luY2Vfc3dpdGNoW3NpemVfYmluXSk7 CisJCQljaGFuZ2VfcmF0ZXMgPSAxOworCQl9IGVsc2UgaWYgKCghIChuaS0+bmlfZmxhZ3MgJiBJ RUVFODAyMTFfTk9ERV9IVCkpICYmCisJCSAgICAoMiphdmVyYWdlX3R4X3RpbWUgPCBzYW4tPnN0 YXRzW3NpemVfYmluXVtzYW4tPmN1cnJlbnRfcml4W3NpemVfYmluXV0uYXZlcmFnZV90eF90aW1l KSkgeworCQkJLyogdGhlIGN1cnJlbnQgYml0LXJhdGUgaXMgdHdpY2UgYXMgc2xvdyBhcyB0aGUg YmVzdCBvbmUgKi8KKwkJCUlFRUU4MDIxMV9OT1RFKHZhcCwKKwkJCSAgICBJRUVFODAyMTFfTVNH X1JBVEVDVEwsICZuaSwKKwkJCSAgICAiJXM6IDJ4IGF0dCAoPSAlZCkgPCBjdXJfcml4IGF0dCAl ZCIsCisJCQkgICAgX19mdW5jX18sCisJCQkgICAgMiAqIGF2ZXJhZ2VfdHhfdGltZSwgc2FuLT5z dGF0c1tzaXplX2Jpbl1bc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl1dLmF2ZXJhZ2VfdHhfdGlt ZSk7CisJCQljaGFuZ2VfcmF0ZXMgPSAxOworCQl9IGVsc2UgaWYgKChuaS0+bmlfZmxhZ3MgJiBJ RUVFODAyMTFfTk9ERV9IVCkpIHsKKwkJCWludCBjdXJfcml4ID0gc2FuLT5jdXJyZW50X3JpeFtz aXplX2Jpbl07CisJCQlpbnQgY3VyX2F0dCA9IHNhbi0+c3RhdHNbc2l6ZV9iaW5dW2N1cl9yaXhd LmF2ZXJhZ2VfdHhfdGltZTsKKwkJCS8qCisJCQkgKiBJZiB0aGUgbm9kZSBpcyBIVCwgdXBncmFk ZSBpdCBpZiB0aGUgTUNTIHJhdGUgaXMKKwkJCSAqIGhpZ2hlciBhbmQgdGhlIGF2ZXJhZ2UgdHgg dGltZSBpcyB3aXRoaW4gMjAlIG9mCisJCQkgKiB0aGUgY3VycmVudCByYXRlLiBJdCBjYW4gZmFp bCBhIGxpdHRsZS4KKwkJCSAqCisJCQkgKiBUaGlzIGlzIGxpa2VseSBub3Qgb3B0aW1hbCEKKwkJ CSAqLworI2lmIDAKKwkJCXByaW50ZigiY3VyIHJpeC9hdHQgJXgvJWQsIGJlc3Qgcml4L2F0dCAl eC8lZFxuIiwKKwkJCSAgICBNQ1MoY3VyX3JpeCksIGN1cl9hdHQsIE1DUyhiZXN0X3JpeCksIGF2 ZXJhZ2VfdHhfdGltZSk7CisjZW5kaWYKKwkJCWlmICgoTUNTKGJlc3Rfcml4KSA+IE1DUyhjdXJf cml4KSkgJiYKKwkJCSAgICAoYXZlcmFnZV90eF90aW1lICogOCkgPD0gKGN1cl9hdHQgKiAxMCkp IHsKKwkJCQlJRUVFODAyMTFfTk9URSh2YXAsCisJCQkJICAgIElFRUU4MDIxMV9NU0dfUkFURUNU TCwgJm5pLAorCQkJCSAgICAiJXM6IEhUOiBiZXN0X3JpeCAweCVkID4gY3VyX3JpeCAweCV4LCBh dmVyYWdlX3R4X3RpbWUgJWQsIGN1cl9hdHQgJWQiLAorCQkJCSAgICBfX2Z1bmNfXywKKwkJCQkg ICAgTUNTKGJlc3Rfcml4KSwgTUNTKGN1cl9yaXgpLCBhdmVyYWdlX3R4X3RpbWUsIGN1cl9hdHQp OworCQkJCWNoYW5nZV9yYXRlcyA9IDE7CisJCQl9CisJCX0KKworCQlzYW4tPnBhY2tldHNfc2lu Y2Vfc2FtcGxlW3NpemVfYmluXSsrOworCQkKKwkJaWYgKGNoYW5nZV9yYXRlcykgeworCQkJaWYg KGJlc3Rfcml4ICE9IHNhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dKSB7CisJCQkJSUVFRTgwMjEx X05PVEUodmFwLAorCQkJCSAgICBJRUVFODAyMTFfTVNHX1JBVEVDVEwsCisJCQkJICAgICZuaSwK KyIlczogc2l6ZSAlZCBzd2l0Y2ggcmF0ZSAlZCAoJWQvJWQpIC0+ICVkICglZC8lZCkgYWZ0ZXIg JWQgcGFja2V0cyBtcnIgJWQiLAorCQkJCSAgICBfX2Z1bmNfXywKKwkJCQkgICAgYmluX3RvX3Np emUoc2l6ZV9iaW4pLAorCQkJCSAgICBSQVRFKHNhbi0+Y3VycmVudF9yaXhbc2l6ZV9iaW5dKSwK KwkJCQkgICAgc2FuLT5zdGF0c1tzaXplX2Jpbl1bc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl1d LmF2ZXJhZ2VfdHhfdGltZSwKKwkJCQkgICAgc2FuLT5zdGF0c1tzaXplX2Jpbl1bc2FuLT5jdXJy ZW50X3JpeFtzaXplX2Jpbl1dLnBlcmZlY3RfdHhfdGltZSwKKwkJCQkgICAgUkFURShiZXN0X3Jp eCksCisJCQkJICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW2Jlc3Rfcml4XS5hdmVyYWdlX3R4X3Rp bWUsCisJCQkJICAgIHNhbi0+c3RhdHNbc2l6ZV9iaW5dW2Jlc3Rfcml4XS5wZXJmZWN0X3R4X3Rp bWUsCisJCQkJICAgIHNhbi0+cGFja2V0c19zaW5jZV9zd2l0Y2hbc2l6ZV9iaW5dLAorCQkJCSAg ICBtcnIpOworCQkJfQorCQkJc2FuLT5wYWNrZXRzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0gPSAw OworCQkJc2FuLT5jdXJyZW50X3JpeFtzaXplX2Jpbl0gPSBiZXN0X3JpeDsKKwkJCXNhbi0+dGlj a3Nfc2luY2Vfc3dpdGNoW3NpemVfYmluXSA9IHRpY2tzOworCQkJLyogCisJCQkgKiBTZXQgdGhl IHZpc2libGUgdHhyYXRlIGZvciB0aGlzIG5vZGUuCisJCQkgKi8KKwkJCW5pLT5uaV90eHJhdGUg PSBkb3QxMXJhdGUocnQsIGJlc3Rfcml4KTsKKwkJfQorCQlyaXggPSBzYW4tPmN1cnJlbnRfcml4 W3NpemVfYmluXTsKKwkJc2FuLT5wYWNrZXRzX3NpbmNlX3N3aXRjaFtzaXplX2Jpbl0rKzsKKwl9 CisJLy8gKnRyeTAgPSBtcnIgPyBzYW4tPnNjaGVkW3JpeF0udDAgOiBBVEhfVFhNQVhUUlk7Citk b25lOgorCisJLyoKKwkgKiBUaGlzIGJ1ZyB0b3RhbGx5IHN1Y2tzIGFuZCBzaG91bGQgYmUgZml4 ZWQuCisJICoKKwkgKiBGb3Igbm93IHRob3VnaCwgbGV0J3Mgbm90IHBhbmljLCBzbyB3ZSBjYW4g c3RhcnQgdG8gZmlndXJlCisJICogb3V0IGhvdyB0byBiZXR0ZXIgcmVwcm9kdWNlIGl0LgorCSAq LworCWlmIChyaXggPCAwIHx8IHJpeCA+PSBydC0+cmF0ZUNvdW50KSB7CisJCXByaW50ZigiJXM6 IEVSUk9SOiByaXggJWQgb3V0IG9mIGJvdW5kcyAocmF0ZUNvdW50PSVkKVxuIiwKKwkJICAgIF9f ZnVuY19fLAorCQkgICAgcml4LAorCQkgICAgcnQtPnJhdGVDb3VudCk7CisJCSAgICByaXggPSAw OwkvKiBYWFgganVzdCBkZWZhdWx0IGZvciBub3cgKi8KKwl9CisJS0FTU0VSVChyaXggPj0gMCAm JiByaXggPCBydC0+cmF0ZUNvdW50LCAoInJpeCBpcyAlZCIsIHJpeCkpOworCisJLy8gKnJpeDAg PSByaXg7CisJLy8gKnR4cmF0ZSA9IHJ0LT5pbmZvW3JpeF0ucmF0ZUNvZGUKKwkvLyAJfCAoc2hv cnRQcmVhbWJsZSA/IHJ0LT5pbmZvW3JpeF0uc2hvcnRQcmVhbWJsZSA6IDApOworCXNhbi0+cGFj a2V0c19zZW50W3NpemVfYmluXSsrOworCisJcmV0dXJuIHJpeDsKKyN1bmRlZiBET1QxMVJBVEUK KyN1bmRlZiBNQ1MKKyN1bmRlZiBSQVRFCit9CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfcmF0ZXMo c3RydWN0IGllZWU4MDIxMV9ub2RlICpuaSwgc3RydWN0IGllZWU4MDIxMV9yY19pbmZvICpyY19p bmZvKQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlX25vZGUgKnNhbiA9IG5pLT5uaV9yY3Rs czsKKwl1aW50OF90IHJpeDAgPSBzYW1wbGVfcmF0ZShuaSwgTlVMTCwgMCk7CisJY29uc3Qgc3Ry dWN0IHR4c2NoZWR1bGUgKnNjaGVkID0gJnNhbi0+c2NoZWRbcml4MF07CisJc3RydWN0IGllZWU4 MDIxMV9yY19zZXJpZXMgKnJjID0gcmNfaW5mby0+aXJpX3JjOworCisJS0FTU0VSVChyaXgwID09 IHNjaGVkLT5yMCwgKCJyaXgwICgleCkgIT0gc2NoZWQtPnIwICgleCkhXG4iLAorCSAgICByaXgw LCBzY2hlZC0+cjApKTsKKwkvKiBYWFggKi8KKwlyY1swXS5mbGFncyA9IHJjWzFdLmZsYWdzID0g cmNbMl0uZmxhZ3MgPSByY1szXS5mbGFncyA9IDA7CisKKwlyY1swXS5yaXggPSBzY2hlZC0+cjA7 CisJcmNbMV0ucml4ID0gc2NoZWQtPnIxOworCXJjWzJdLnJpeCA9IHNjaGVkLT5yMjsKKwlyY1sz XS5yaXggPSBzY2hlZC0+cjM7CisKKwlyY1swXS50cmllcyA9IHNjaGVkLT50MDsKKwlyY1sxXS50 cmllcyA9IHNjaGVkLT50MTsKKwlyY1syXS50cmllcyA9IHNjaGVkLT50MjsKKwlyY1szXS50cmll cyA9IHNjaGVkLT50MzsKK30KKworc3RhdGljIHZvaWQKK3VwZGF0ZV9zdGF0cyhjb25zdCBzdHJ1 Y3QgaWVlZTgwMjExdmFwICp2YXAsCisgICAgCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ub2Rl ICpuaSwKKwkJICBpbnQgZnJhbWVfc2l6ZSwKKwkJICBpbnQgcml4MCwgaW50IHRyaWVzMCwKKwkJ ICBpbnQgcml4MSwgaW50IHRyaWVzMSwKKwkJICBpbnQgcml4MiwgaW50IHRyaWVzMiwKKwkJICBp bnQgcml4MywgaW50IHRyaWVzMywKKwkJICBpbnQgc2hvcnRfdHJpZXMsIGludCB0cmllcywKKwkJ ICBpbnQgbmZyYW1lcywgaW50IG5iYWQpCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9k ZSAqc2FuID0gbmktPm5pX3JjdGxzOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUg PSBzYW4tPnNhbl9zYW1wbGU7CisKKwljb25zdCBpbnQgc2l6ZV9iaW4gPSBzaXplX3RvX2Jpbihm cmFtZV9zaXplKTsKKwljb25zdCBpbnQgc2l6ZSA9IGJpbl90b19zaXplKHNpemVfYmluKTsKKwor CWludCBpc19odDQwID0gaWVlZTgwMjExX3JhdGVjdGxfaGFzY2FwX2N3NDAodmFwLCBuaSk7CisJ aW50IHR0LCB0cmllc19zb19mYXI7CisJaW50IHBjdDsKKworCWlmICghSVNfUkFURV9ERUZJTkVE KHNhbiwgcml4MCkpCisJCXJldHVybjsKKwl0dCA9IGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQo dmFwLCBzaXplLCByaXgwLCBzaG9ydF90cmllcywKKwkJTUlOKHRyaWVzMCwgdHJpZXMpIC0gMSwg aXNfaHQ0MCk7CisJdHJpZXNfc29fZmFyID0gdHJpZXMwOworCisJaWYgKHRyaWVzMSAmJiB0cmll c19zb19mYXIgPCB0cmllcykgeworCQlpZiAoIUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeDEpKQor CQkJcmV0dXJuOworCQl0dCArPSBjYWxjX3VzZWNzX3VuaWNhc3RfcGFja2V0KHZhcCwgc2l6ZSwg cml4MSwgc2hvcnRfdHJpZXMsCisJCQlNSU4odHJpZXMxICsgdHJpZXNfc29fZmFyLCB0cmllcykg LSB0cmllc19zb19mYXIgLSAxLCBpc19odDQwKTsKKwkJdHJpZXNfc29fZmFyICs9IHRyaWVzMTsK Kwl9CisKKwlpZiAodHJpZXMyICYmIHRyaWVzX3NvX2ZhciA8IHRyaWVzKSB7CisJCWlmICghSVNf UkFURV9ERUZJTkVEKHNhbiwgcml4MikpCisJCQlyZXR1cm47CisJCXR0ICs9IGNhbGNfdXNlY3Nf dW5pY2FzdF9wYWNrZXQodmFwLCBzaXplLCByaXgyLCBzaG9ydF90cmllcywKKwkJCU1JTih0cmll czIgKyB0cmllc19zb19mYXIsIHRyaWVzKSAtIHRyaWVzX3NvX2ZhciAtIDEsIGlzX2h0NDApOwor CQl0cmllc19zb19mYXIgKz0gdHJpZXMyOworCX0KKworCWlmICh0cmllczMgJiYgdHJpZXNfc29f ZmFyIDwgdHJpZXMpIHsKKwkJaWYgKCFJU19SQVRFX0RFRklORUQoc2FuLCByaXgzKSkKKwkJCXJl dHVybjsKKwkJdHQgKz0gY2FsY191c2Vjc191bmljYXN0X3BhY2tldCh2YXAsIHNpemUsIHJpeDMs IHNob3J0X3RyaWVzLAorCQkJTUlOKHRyaWVzMyArIHRyaWVzX3NvX2ZhciwgdHJpZXMpIC0gdHJp ZXNfc29fZmFyIC0gMSwgaXNfaHQ0MCk7CisJfQorCisJaWYgKHNhbi0+c3RhdHNbc2l6ZV9iaW5d W3JpeDBdLnRvdGFsX3BhY2tldHMgPCBzYW1wbGUtPnNhbnBsZV9zbW9vdGhpbmdfbWlucGFja2V0 cykgeworCQkvKiBqdXN0IGF2ZXJhZ2UgdGhlIGZpcnN0IGZldyBwYWNrZXRzICovCisJCWludCBh dmdfdHggPSBzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS5hdmVyYWdlX3R4X3RpbWU7CisJCWlu dCBwYWNrZXRzID0gc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0udG90YWxfcGFja2V0czsKKwkJ c2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0uYXZlcmFnZV90eF90aW1lID0gKHR0KyhhdmdfdHgq cGFja2V0cykpLyhwYWNrZXRzK25mcmFtZXMpOworCX0gZWxzZSB7CisJCS8qIHVzZSBhIGV3bWEg Ki8KKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0uYXZlcmFnZV90eF90aW1lID0gCisJCQko KHNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmF2ZXJhZ2VfdHhfdGltZSAqIHNhbXBsZS0+c2Fu cGxlX3Ntb290aGluZ19yYXRlKSArIAorCQkJICh0dCAqICgxMDAgLSBzYW1wbGUtPnNhbnBsZV9z bW9vdGhpbmdfcmF0ZSkpKSAvIDEwMDsKKwl9CisJCisJLyoKKwkgKiBYWFggRG9uJ3QgbWFyayB0 aGUgaGlnaGVyIGJpdCByYXRlcyBhcyBhbHNvIGhhdmluZyBmYWlsZWQ7IGFzIHRoaXMKKwkgKiB1 bmZvcnR1bmF0ZWx5IHN0b3BzIHRob3NlIHJhdGVzIGZyb20gYmVpbmcgdGFzdGVkIHdoZW4gdHJ5 aW5nIHRvCisJICogVFguIFRoaXMgaGFwcGVucyB3aXRoIDExbiBhZ2dyZWdhdGlvbi4KKwkgKi8K KwlpZiAobmZyYW1lcyA9PSBuYmFkKSB7CisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnN1 Y2Nlc3NpdmVfZmFpbHVyZXMgKz0gbmJhZDsKKworCX0gZWxzZSB7CisJCXNhbi0+c3RhdHNbc2l6 ZV9iaW5dW3JpeDBdLnBhY2tldHNfYWNrZWQgKz0gKG5mcmFtZXMgLSBuYmFkKTsKKwkJc2FuLT5z dGF0c1tzaXplX2Jpbl1bcml4MF0uc3VjY2Vzc2l2ZV9mYWlsdXJlcyA9IDA7CisJfQorCXNhbi0+ c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLnRyaWVzICs9IHRyaWVzOworCXNhbi0+c3RhdHNbc2l6ZV9i aW5dW3JpeDBdLmxhc3RfdHggPSB0aWNrczsKKwlzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50 b3RhbF9wYWNrZXRzICs9IG5mcmFtZXM7CisKKwkvKiB1cGRhdGUgRVdNQSBmb3IgdGhpcyByaXgg Ki8KKworCS8qIENhbGN1bGF0ZSBwZXJjZW50YWdlIGJhc2VkIG9uIGN1cnJlbnQgcmF0ZSAqLwor CWlmIChuZnJhbWVzID09IDApCisJCW5mcmFtZXMgPSBuYmFkID0gMTsKKwlwY3QgPSAoKG5mcmFt ZXMgLSBuYmFkKSAqIDEwMDApIC8gbmZyYW1lczsKKworCWlmIChzYW4tPnN0YXRzW3NpemVfYmlu XVtyaXgwXS50b3RhbF9wYWNrZXRzIDwKKwkgICAgc2FtcGxlLT5zYW5wbGVfc21vb3RoaW5nX21p bnBhY2tldHMpIHsKKwkJLyoganVzdCBhdmVyYWdlIHRoZSBmaXJzdCBmZXcgcGFja2V0cyAqLwor CQlpbnQgYV9wY3QgPSAoc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0ucGFja2V0c19hY2tlZCAq IDEwMDApIC8KKwkJICAgIChzYW4tPnN0YXRzW3NpemVfYmluXVtyaXgwXS50b3RhbF9wYWNrZXRz KTsKKwkJc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0uZXdtYV9wY3QgPSBhX3BjdDsKKwl9IGVs c2UgeworCQkvKiB1c2UgYSBld21hICovCisJCXNhbi0+c3RhdHNbc2l6ZV9iaW5dW3JpeDBdLmV3 bWFfcGN0ID0KKwkJCSgoc2FuLT5zdGF0c1tzaXplX2Jpbl1bcml4MF0uZXdtYV9wY3QgKiBzYW1w bGUtPnNhbnBsZV9zbW9vdGhpbmdfcmF0ZSkgKworCQkJIChwY3QgKiAoMTAwIC0gc2FtcGxlLT5z YW5wbGVfc21vb3RoaW5nX3JhdGUpKSkgLyAxMDA7CisJfQorCisJaWYgKHJpeDAgPT0gc2FuLT5j dXJyZW50X3NhbXBsZV9yaXhbc2l6ZV9iaW5dKSB7CisJCXNhbi0+c2FtcGxlX3R0W3NpemVfYmlu XSA9IHR0OworCQlzYW4tPmN1cnJlbnRfc2FtcGxlX3JpeFtzaXplX2Jpbl0gPSAtMTsKKwl9Cit9 CisKK3N0YXRpYyB2b2lkCitzYW1wbGVfdHhfY29tcGxldGUoY29uc3Qgc3RydWN0IGllZWU4MDIx MXZhcCAqdmFwLAorICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksIGludCBvaywK KyAgICB2b2lkICphcmcxLCB2b2lkICphcmcyKQoreworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxl X25vZGUgKnNhbiA9IG5pLT5uaV9yY3RsczsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGVf dGFibGUgKnJ0ID0gaWVlZTgwMjExX2dldF9yYXRldGFibGUodmFwLT5pdl9pYy0+aWNfY3VyY2hh bik7CisKKwkvKiBYWFggbmVlZCB0byBjaGFuZ2UgYXJnMiB0byBwb2ludGVyIG9mIGllZWU4MDIx MV9yY19pbmZvICovCisJc3RydWN0IGllZWU4MDIxMV9yY19pbmZvICpyY19pbmZvID0gKHN0cnVj dCBpZWVlODAyMTFfcmNfaW5mbyopYXJnMjsKKworCWludCBmaW5hbF9yaXgsIHNob3J0X3RyaWVz LCBsb25nX3RyaWVzOworCWludCBuZnJhbWVzLCBuYmFkOworCWludCBmcmFtZV9zaXplLCBtcnI7 CisKKwkvKiB1cGRhdGUgcGVyIHZhcCBzdGF0aXN0aWNzICovCisJaWVlZTgwMjExX3JhdGVjdGxf dXBkYXRlX3N0YXQodmFwLCByY19pbmZvKTsKKworCWZpbmFsX3JpeCA9IHJ0LT5yYXRlQ29kZVRv SW5kZXhbcmNfaW5mby0+aXJpX3R4cmF0ZV07CisJc2hvcnRfdHJpZXMgPSByY19pbmZvLT5pcmlf c2hvcnRyZXRyeTsKKwkvKiBYWFggd2h5IHBsdXMgMSBoZXJlPyAqLworCWxvbmdfdHJpZXMgPSBy Y19pbmZvLT5pcmlfbG9uZ3JldHJ5ICsgMTsKKworCW5mcmFtZXMgPSByY19pbmZvLT5pcmlfdHhj bnQ7CisJbmJhZCA9IHJjX2luZm8tPmlyaV9mYWlsY250OworCisJZnJhbWVfc2l6ZSA9IHJjX2lu Zm8tPmlyaV9mcmFtZWxlbjsKKwltcnIgPSAwOworCisJaWYgKG5mcmFtZXMgPT0gMCkgeworCQly ZXR1cm47CisJfQorCisJaWYgKGZyYW1lX3NpemUgPT0gMCkJCSAgICAvKiBOQjogc2hvdWxkIG5v dCBoYXBwZW4gKi8KKwkJZnJhbWVfc2l6ZSA9IDE1MDA7CisKKwlpZiAoc2FuLT5yYXRlbWFzayA9 PSAwKSB7CisJCXJldHVybjsKKwl9CisJCisJaWYgKElFRUU4MDIxMV9SQVRFQ1RMX0hBU0NBUF9N UlIodmFwKSkKKwkJbXJyID0gMTsKKwkvKiBYWFggY2hlY2sgSFQgcHJvdG1vZGUgdG9vICovCisJ aWYgKG1yciAmJiAhSUVFRTgwMjExX1JBVEVDVExfSEFTQ0FQX01SUlBST1QodmFwKSkKKwkJbXJy ID0gMDsKKwkKKwlpZiAoIW1yciB8fCByY19pbmZvLT5pcmlfZmluYWx0c2kgPT0gMCkgeworCQlp ZiAoIUlTX1JBVEVfREVGSU5FRChzYW4sIGZpbmFsX3JpeCkpIHsKKwkJCXJldHVybjsKKwkJfQor CQkvKgorCQkgKiBPbmx5IG9uZSByYXRlIHdhcyB1c2VkOyBvcHRpbWl6ZSB3b3JrLgorCQkgKi8K KwkJdXBkYXRlX3N0YXRzKHZhcCwgbmksIGZyYW1lX3NpemUsIAorCQkJICAgICBmaW5hbF9yaXgs IGxvbmdfdHJpZXMsCisJCQkgICAgIDAsIDAsCisJCQkgICAgIDAsIDAsCisJCQkgICAgIDAsIDAs CisJCQkgICAgIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzLAorCQkJICAgICBuZnJhbWVzLCBuYmFk KTsKKworCX0gZWxzZSB7CisJCWludCBmaW5hbFRTSWR4ID0gcmNfaW5mby0+aXJpX2ZpbmFsdHNp OworCQlpbnQgaTsKKworCQkvKgorCQkgKiBOQjogc2VyaWVzID4gMCBhcmUgbm90IHBlbmFsaXpl ZCBmb3IgZmFpbHVyZQorCQkgKiBiYXNlZCBvbiB0aGUgdHJ5IGNvdW50cyB1bmRlciB0aGUgYXNz dW1wdGlvbgorCQkgKiB0aGF0IGxvc3NlcyBhcmUgb2Z0ZW4gYnVyc3R5IGFuZCBzaW5jZSB3ZQor CQkgKiBzYW1wbGUgaGlnaGVyIHJhdGVzIDEgdHJ5IGF0IGEgdGltZSBkb2luZyBzbworCQkgKiBt YXkgdW5mYWlybHkgcGVuYWxpemUgdGhlbS4KKwkJICovCisJCWlmIChyY1swXS50cmllcykgewor CQkJdXBkYXRlX3N0YXRzKHZhcCwgbmksIGZyYW1lX3NpemUsCisJCQkJICAgICByY1swXS5yaXgs IHJjWzBdLnRyaWVzLAorCQkJCSAgICAgcmNbMV0ucml4LCByY1sxXS50cmllcywKKwkJCQkgICAg IHJjWzJdLnJpeCwgcmNbMl0udHJpZXMsCisJCQkJICAgICByY1szXS5yaXgsIHJjWzNdLnRyaWVz LAorCQkJCSAgICAgc2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJCQkJICAgICBuZnJhbWVzLCBu YmFkKTsKKwkJCWxvbmdfdHJpZXMgLT0gcmNbMF0udHJpZXM7CisJCX0KKwkJCisJCWlmIChyY1sx XS50cmllcyAmJiBmaW5hbFRTSWR4ID4gMCkgeworCQkJdXBkYXRlX3N0YXRzKHZhcCwgbmksIGZy YW1lX3NpemUsCisJCQkJICAgICByY1sxXS5yaXgsIHJjWzFdLnRyaWVzLAorCQkJCSAgICAgcmNb Ml0ucml4LCByY1syXS50cmllcywKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJ CQkJICAgICAwLCAwLAorCQkJCSAgICAgc2hvcnRfdHJpZXMsIGxvbmdfdHJpZXMsCisJCQkJICAg ICBuZnJhbWVzLCBuYmFkKTsKKwkJCWxvbmdfdHJpZXMgLT0gcmNbMV0udHJpZXM7CisJCX0KKwor CQlpZiAocmNbMl0udHJpZXMgJiYgZmluYWxUU0lkeCA+IDEpIHsKKwkJCXVwZGF0ZV9zdGF0cyh2 YXAsIG5pLCBmcmFtZV9zaXplLAorCQkJCSAgICAgcmNbMl0ucml4LCByY1syXS50cmllcywKKwkJ CQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAwLCAwLAorCQkJCSAgICAg MCwgMCwKKwkJCQkgICAgIHNob3J0X3RyaWVzLCBsb25nX3RyaWVzLAorCQkJCSAgICAgbmZyYW1l cywgbmJhZCk7CisJCQlsb25nX3RyaWVzIC09IHJjWzJdLnRyaWVzOworCQl9CisKKwkJaWYgKHJj WzNdLnRyaWVzICYmIGZpbmFsVFNJZHggPiAyKSB7CisJCQl1cGRhdGVfc3RhdHModmFwLCBuaSwg ZnJhbWVfc2l6ZSwKKwkJCQkgICAgIHJjWzNdLnJpeCwgcmNbM10udHJpZXMsCisJCQkJICAgICAw LCAwLAorCQkJCSAgICAgMCwgMCwKKwkJCQkgICAgIDAsIDAsCisJCQkJICAgICBzaG9ydF90cmll cywgbG9uZ190cmllcywKKwkJCQkgICAgIG5mcmFtZXMsIG5iYWQpOworCQl9CisJfQorfQorCitz dGF0aWMgdm9pZAorc2FtcGxlX3R4X3VwZGF0ZShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExdmFwICp2 YXAsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmksCisgICAgdm9pZCAqYXJnMSwgdm9p ZCAqYXJnMiwgdm9pZCAqYXJnMykKK3sKKwkvKiBub3RoaW5nIGhlcmUuICovCit9CisKK3N0YXRp YyB2b2lkCitzYW1wbGVfc2V0aW50ZXJ2YWwoY29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFw LCBpbnQgbXNlY3MpCit7CisJc3RydWN0IGllZWU4MDIxMV9zYW1wbGUgKnNhbXBsZSA9IHZhcC0+ aXZfcnM7CisJaW50IHQ7CisKKwlpZiAobXNlY3MgPCAxMDApCisJCW1zZWNzID0gMTAwOworCXQg PSBtc2Vjc190b190aWNrcyhtc2Vjcyk7CisJLyogaWVlZTgwMjExX3NhbXBsZSBkb2Vzbid0IGhh dmUgdGhlIHNhbXBsZV9pbnRlcnZhbCBmaWVsZCBieSBub3cgKi8KKwkvLyBzYW1wbGUtPnNhbXBs ZV9pbnRlcnZhbCA9ICh0IDwgMSkgPyAxIDogdDsKK30KKworc3RhdGljIHZvaWQKK3NhbXBsZV9z dGF0cyh2b2lkICphcmcsIHN0cnVjdCBpZWVlODAyMTFfbm9kZSAqbmkpCit7CisJc3RydWN0IGll ZWU4MDIxMXZhcCAqdmFwID0gbmktPm5pX3ZhcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZV9u b2RlICpzYW4gPSBuaS0+bmlfcmN0bHM7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3Rh YmxlICpydCA9IGllZWU4MDIxMV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4p OworCXVpbnQ2NF90IG1hc2s7CisJaW50IHJpeCwgeTsKKworCXByaW50ZigiXG5bJXNdIHJlZmNu dCAlZCBzdGF0aWNfcml4ICglZCAlcykgcmF0ZW1hc2sgMHglanhcbiIsCisJICAgIGV0aGVyX3Nw cmludGYobmktPm5pX21hY2FkZHIpLCBpZWVlODAyMTFfbm9kZV9yZWZjbnQobmkpLAorCSAgICBk b3QxMXJhdGUocnQsIHNhbi0+c3RhdGljX3JpeCksCisJICAgIGRvdDExcmF0ZV9sYWJlbChydCwg c2FuLT5zdGF0aWNfcml4KSwKKwkgICAgKHVpbnRtYXhfdClzYW4tPnJhdGVtYXNrKTsKKwlmb3Ig KHkgPSAwOyB5IDwgTlVNX1BBQ0tFVF9TSVpFX0JJTlM7IHkrKykgeworCQlwcmludGYoIlslNHVd IGN1ciByaXggJWQgKCVkICVzKSBzaW5jZSBzd2l0Y2g6IHBhY2tldHMgJWQgdGlja3MgJXVcbiIs CisJCSAgICBiaW5fdG9fc2l6ZSh5KSwgc2FuLT5jdXJyZW50X3JpeFt5XSwKKwkJICAgIGRvdDEx cmF0ZShydCwgc2FuLT5jdXJyZW50X3JpeFt5XSksCisJCSAgICBkb3QxMXJhdGVfbGFiZWwocnQs IHNhbi0+Y3VycmVudF9yaXhbeV0pLAorCQkgICAgc2FuLT5wYWNrZXRzX3NpbmNlX3N3aXRjaFt5 XSwgc2FuLT50aWNrc19zaW5jZV9zd2l0Y2hbeV0pOworCQlwcmludGYoIlslNHVdIGxhc3Qgc2Ft cGxlICglZCAlcykgY3VyIHNhbXBsZSAoJWQgJXMpIHBhY2tldHMgc2VudCAlZFxuIiwKKwkJICAg IGJpbl90b19zaXplKHkpLAorCQkgICAgZG90MTFyYXRlKHJ0LCBzYW4tPmxhc3Rfc2FtcGxlX3Jp eFt5XSksCisJCSAgICBkb3QxMXJhdGVfbGFiZWwocnQsIHNhbi0+bGFzdF9zYW1wbGVfcml4W3ld KSwKKwkJICAgIGRvdDExcmF0ZShydCwgc2FuLT5jdXJyZW50X3NhbXBsZV9yaXhbeV0pLAorCQkg ICAgZG90MTFyYXRlX2xhYmVsKHJ0LCBzYW4tPmN1cnJlbnRfc2FtcGxlX3JpeFt5XSksCisJCSAg ICBzYW4tPnBhY2tldHNfc2VudFt5XSk7CisJCXByaW50ZigiWyU0dV0gcGFja2V0cyBzaW5jZSBz YW1wbGUgJWQgc2FtcGxlIHR0ICV1XG4iLAorCQkgICAgYmluX3RvX3NpemUoeSksIHNhbi0+cGFj a2V0c19zaW5jZV9zYW1wbGVbeV0sCisJCSAgICBzYW4tPnNhbXBsZV90dFt5XSk7CisJfQorCWZv ciAobWFzayA9IHNhbi0+cmF0ZW1hc2ssIHJpeCA9IDA7IG1hc2sgIT0gMDsgbWFzayA+Pj0gMSwg cml4KyspIHsKKwkJaWYgKChtYXNrICYgMSkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJZm9yICh5 ID0gMDsgeSA8IE5VTV9QQUNLRVRfU0laRV9CSU5TOyB5KyspIHsKKwkJCWlmIChzYW4tPnN0YXRz W3ldW3JpeF0udG90YWxfcGFja2V0cyA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRmKCJb JTJ1ICVzOiU0dV0gJThqdTolLThqdSAoJTNkJSUpIChFV01BICUzZC4lMWQlJSkgVCAlOGp1IEYg JTRkIGF2ZyAlNXUgbGFzdCAldVxuIiwKKwkJCSAgICBkb3QxMXJhdGUocnQsIHJpeCksIGRvdDEx cmF0ZV9sYWJlbChydCwgcml4KSwKKwkJCSAgICBiaW5fdG9fc2l6ZSh5KSwKKwkJCSAgICAodWlu dG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0udG90YWxfcGFja2V0cywKKwkJCSAgICAodWludG1h eF90KSBzYW4tPnN0YXRzW3ldW3JpeF0ucGFja2V0c19hY2tlZCwKKwkJCSAgICAoaW50KSAoKHNh bi0+c3RhdHNbeV1bcml4XS5wYWNrZXRzX2Fja2VkICogMTAwVUxMKSAvCisJCQkgICAgIHNhbi0+ c3RhdHNbeV1bcml4XS50b3RhbF9wYWNrZXRzKSwKKwkJCSAgICBzYW4tPnN0YXRzW3ldW3JpeF0u ZXdtYV9wY3QgLyAxMCwKKwkJCSAgICBzYW4tPnN0YXRzW3ldW3JpeF0uZXdtYV9wY3QgJSAxMCwK KwkJCSAgICAodWludG1heF90KSBzYW4tPnN0YXRzW3ldW3JpeF0udHJpZXMsCisJCQkgICAgc2Fu LT5zdGF0c1t5XVtyaXhdLnN1Y2Nlc3NpdmVfZmFpbHVyZXMsCisJCQkgICAgc2FuLT5zdGF0c1t5 XVtyaXhdLmF2ZXJhZ2VfdHhfdGltZSwKKwkJCSAgICB0aWNrcyAtIHNhbi0+c3RhdHNbeV1bcml4 XS5sYXN0X3R4KTsKKwkJfQorCX0KK30KKworc3RhdGljIGludAorc2FtcGxlX3N5c2N0bF9zdGF0 cyhTWVNDVExfSEFORExFUl9BUkdTKQoreworCXN0cnVjdCBpZWVlODAyMTF2YXAgKnZhcCA9IGFy ZzE7CisJc3RydWN0IGllZWU4MDIxMWNvbSAqaWMgPSB2YXAtPml2X2lmcC0+aWZfbDJjb207CisJ aW50IGVycm9yLCB2OworCisJdiA9IDA7CisJZXJyb3IgPSBzeXNjdGxfaGFuZGxlX2ludChvaWRw LCAmdiwgMCwgcmVxKTsKKwlpZiAoZXJyb3IgfHwgIXJlcS0+bmV3cHRyKQorCQlyZXR1cm4gZXJy b3I7CisJaWVlZTgwMjExX2l0ZXJhdGVfbm9kZXMoJmljLT5pY19zdGEsIHNhbXBsZV9zdGF0cywg TlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NhbXBsZV9zeXNjdGxfc21vb3Ro aW5nX3JhdGUoU1lTQ1RMX0hBTkRMRVJfQVJHUykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExdmFwICp2 YXAgPSBhcmcxOworCXN0cnVjdCBpZWVlODAyMTFfc2FtcGxlICpzYW1wbGUgPSB2YXAtPml2X3Jz OworCWludCByYXRlLCBlcnJvcjsKKworCXJhdGUgPSBzYW1wbGUtPnNhbXBsZV9zbW9vdGhpbmdf cmF0ZTsKKwllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRlLCAwLCByZXEpOwor CWlmIChlcnJvciB8fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsKKwlpZiAoISgwIDw9 IHJhdGUgJiYgcmF0ZSA8IDEwMCkpCisJCXJldHVybiBFSU5WQUw7CisJc2FtcGxlLT5zYW1wbGVf c21vb3RoaW5nX3JhdGUgPSByYXRlOworCXNhbXBsZS0+c2FtcGxlX3Ntb290aGluZ19taW5wYWNr ZXRzID0gMTAwIC8gKDEwMCAtIHJhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citz YW1wbGVfc3lzY3RsX3NhbXBsZV9yYXRlKFNZU0NUTF9IQU5ETEVSX0FSR1MpCit7CisJc3RydWN0 IGllZWU4MDIxMXZhcCAqdmFwID0gYXJnMTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSAqc2Ft cGxlID0gdmFwLT5pdl9yczsKKwlpbnQgcmF0ZSwgZXJyb3I7CisKKwlyYXRlID0gc2FtcGxlLT5z YW1wbGVfcmF0ZTsKKwllcnJvciA9IHN5c2N0bF9oYW5kbGVfaW50KG9pZHAsICZyYXRlLCAwLCBy ZXEpOworCWlmIChlcnJvciB8fCAhcmVxLT5uZXdwdHIpCisJCXJldHVybiBlcnJvcjsKKwlpZiAo ISgyIDw9IHJhdGUgJiYgcmF0ZSA8PSAxMDApKQorCQlyZXR1cm4gRUlOVkFMOworCXNhbXBsZS0+ c2FtcGxlX3JhdGUgPSByYXRlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2FtcGxl X3N5c2N0bGF0dGFjaChzdHJ1Y3QgaWVlZTgwMjExdmFwICp2YXAsCisgICAgc3RydWN0IHN5c2N0 bF9jdHhfbGlzdCAqY3R4LCBzdHJ1Y3Qgc3lzY3RsX29pZCAqdHJlZSkKK3sKKwlTWVNDVExfQURE X1BST0MoY3R4LCBTWVNDVExfQ0hJTERSRU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAic2FtcGxl X3Ntb290aGluZ19yYXRlIiwgQ1RMVFlQRV9JTlQgfCBDVExGTEFHX1JXLCB2YXAsIDAsCisJICAg IHNhbXBsZV9zeXNjdGxfc21vb3RoaW5nX3JhdGUsICJJIiwKKwkgICAgInNhbXBsZTogc21vb3Ro aW5nIHJhdGUgZm9yIGF2ZyB0eCB0aW1lICglJSkiKTsKKwlTWVNDVExfQUREX1BST0MoY3R4LCBT WVNDVExfQ0hJTERSRU4odHJlZSksIE9JRF9BVVRPLAorCSAgICAic2FtcGxlX3JhdGUiLCBDVExU WVBFX0lOVCB8IENUTEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5c2N0bF9zYW1wbGVf cmF0ZSwgIkkiLAorCSAgICAic2FtcGxlOiBwZXJjZW50IGFpciB0aW1lIGRldm90ZWQgdG8gc2Ft cGxpbmcgbmV3IHJhdGVzICglJSkiKTsKKwkvKiBYWFggbWF4X3N1Y2Nlc3NpdmVfZmFpbHVyZXMs IHN0YWxlX2ZhaWx1cmVfdGltZW91dCwgbWluX3N3aXRjaCAqLworCVNZU0NUTF9BRERfUFJPQyhj dHgsIFNZU0NUTF9DSElMRFJFTih0cmVlKSwgT0lEX0FVVE8sCisJICAgICJzYW1wbGVfc3RhdHMi LCBDVExUWVBFX0lOVCB8IENUTEZMQUdfUlcsIHZhcCwgMCwKKwkgICAgc2FtcGxlX3N5c2N0bF9z dGF0cywgIkkiLCAic2FtcGxlOiBwcmludCBzdGF0aXN0aWNzIik7Cit9CkluZGV4OiBuZXQ4MDIx MS9pZWVlODAyMTFfcmNfc2FtcGxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbmV0ODAyMTEvaWVlZTgwMjEx X3JjX3NhbXBsZS5oCShyZXZpc2lvbiAwKQorKysgbmV0ODAyMTEvaWVlZTgwMjExX3JjX3NhbXBs ZS5oCShyZXZpc2lvbiAyNTY4MjUpCkBAIC0wLDAgKzEsMjg3IEBACisvKiAkRnJlZUJTRDogaGVh ZC9zeXMvZGV2L2F0aC9hdGhfcmF0ZS9zYW1wbGUvc2FtcGxlLmggMjQwMzgyIDIwMTItMDgtMTUg MDc6MTA6MTBaIGFkcmlhbiAkKi8KKworLyotCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgSm9obiBC aWNrZXQKKyAqIENvcHlyaWdodCAoYykgMjAxMyBDaGVuY2hvbmcgUWluIDxjY3FpbkBGcmVlQlNE Lm9yZz4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91 dCBtb2RpZmljYXRpb24uCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz dCByZXByb2R1Y2UgYXQgbWluaW11bSBhIGRpc2NsYWltZXIKKyAqICAgIHNpbWlsYXIgdG8gdGhl ICJOTyBXQVJSQU5UWSIgZGlzY2xhaW1lciBiZWxvdyAoIkRpc2NsYWltZXIiKSBhbmQgYW55Cisg KiAgICByZWRpc3RyaWJ1dGlvbiBtdXN0IGJlIGNvbmRpdGlvbmVkIHVwb24gaW5jbHVkaW5nIGEg c3Vic3RhbnRpYWxseQorICogICAgc2ltaWxhciBEaXNjbGFpbWVyIHJlcXVpcmVtZW50IGZvciBm dXJ0aGVyIGJpbmFyeSByZWRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWVzIG9m IHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcworICogICAg b2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv ZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29m dHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0 aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBOTyBXQVJSQU5UWQorICog VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP TlRSSUJVVE9SUworICogYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FS UkFOVElFUyBPRiBOT05JTkZSSU5HRU1FTlQsIE1FUkNIQU5USUJJTElUWQorICogQU5EIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT SEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg Rk9SIFNQRUNJQUwsIEVYRU1QTEFSWSwKKyAqIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRF IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT SU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkg T0YgTElBQklMSVRZLCBXSEVUSEVSCisgKiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg T1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJ TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF RCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKyAqLworCisjaWZuZGVm IF9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNUTF9TQU1QTEVfSF8KKyNkZWZpbmUgX05FVDgwMjEx X0lFRUU4MDIxMV9SQVRFQ1RMX1NBTVBMRV9IXworCisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgw MjExX3JhdGVjdGwuaD4KKworLyoKKyAqIGZvciBub3csIHdlIHRyYWNrIHBlcmZvcm1hbmNlIGZv ciB0aHJlZSBkaWZmZXJlbnQgcGFja2V0CisgKiBzaXplIGJ1Y2tldHMKKyAqLworI2RlZmluZSBO VU1fUEFDS0VUX1NJWkVfQklOUyAyCisjZGVmaW5lCVNBTVBMRV9NQVhSQVRFUwk2NAkJLyogTkI6 IGNvcnJlc3BvbmRzIHRvIGhhbCBpbmZvWzMyXSAqLworCisvKgorICogUmF0ZSBjb250cm9sIHNl dHRpbmdzLgorICovCitzdHJ1Y3QgaWVlZTgwMjExX3NhbXBsZSB7CisJc3RydWN0IGllZWU4MDIx MV9yY19zdGF0IHNhbXBsZV9zdGF0OworCWludAlzYW1wbGVfc21vb3RoaW5nX3JhdGU7CQkJLyog ZXdtYSBwZXJjZW50YWdlIFswLi45OV0gKi8KKwlpbnQJc2FtcGxlX3Ntb290aGluZ19taW5wYWNr ZXRzOworCWludAlzYW1wbGVfcmF0ZTsJCQkvKiAldGltZSB0byB0cnkgZGlmZmVyZW50IHR4IHJh dGVzICovCisJaW50CXNhbXBsZV9tYXhfc3VjY2Vzc2l2ZV9mYWlsdXJlczsKKwlpbnQJc2FtcGxl X3N0YWxlX2ZhaWx1cmVfdGltZW91dDsJLyogaG93IGxvbmcgdG8gaG9ub3IgbWF4X3N1Y2Nlc3Np dmVfZmFpbHVyZXMgKi8KKwlpbnQJc2FtcGxlX21pbl9zd2l0Y2g7CQkvKiBtaW4gdGltZSBiZXR3 ZWVuIHJhdGUgY2hhbmdlcyAqLworCWludAlzYW1wbGVfbWluX2dvb2RfcGN0OwkvKiBtaW4gZ29v ZCBwZXJjZW50YWdlIGZvciBhIHJhdGUgdG8gYmUgY29uc2lkZXJlZCAqLworfTsKKworc3RydWN0 IHJhdGVfc3RhdHMgewkKKwl1bnNpZ25lZCBhdmVyYWdlX3R4X3RpbWU7CisJaW50IHN1Y2Nlc3Np dmVfZmFpbHVyZXM7CisJdWludDY0X3QgdHJpZXM7CisJdWludDY0X3QgdG90YWxfcGFja2V0czsJ LyogcGt0cyB0b3RhbCBzaW5jZSBhc3NvYyAqLworCXVpbnQ2NF90IHBhY2tldHNfYWNrZWQ7CS8q IHBrdHMgYWNrZWQgc2luY2UgYXNzb2MgKi8KKwlpbnQgZXdtYV9wY3Q7CS8qIEVXTUEgcGVyY2Vu dGFnZSAqLworCXVuc2lnbmVkIHBlcmZlY3RfdHhfdGltZTsgLyogdHJhbnNtaXQgdGltZSBmb3Ig MCByZXRyaWVzICovCisJaW50IGxhc3RfdHg7Cit9OworCitzdHJ1Y3QgdHhzY2hlZHVsZSB7CisJ dWludDhfdAl0MCwgcjA7CQkvKiBzZXJpZXMgMDogdHJpZXMsIHJhdGUgY29kZSAqLworCXVpbnQ4 X3QJdDEsIHIxOwkJLyogc2VyaWVzIDE6IHRyaWVzLCByYXRlIGNvZGUgKi8KKwl1aW50OF90CXQy LCByMjsJCS8qIHNlcmllcyAyOiB0cmllcywgcmF0ZSBjb2RlICovCisJdWludDhfdAl0MywgcjM7 CQkvKiBzZXJpZXMgMzogdHJpZXMsIHJhdGUgY29kZSAqLworfTsKKworLyoKKyAqIFJhdGUgY29u dHJvbCBzdGF0ZSBmb3IgYSBnaXZlbiBub2RlLgorICovCisvKiBYWFggY2hhbmdlIG5hbWluZyBj b252ZXJzaW9uPyAqLworc3RydWN0IGllZWU4MDIxMV9zYW1wbGVfbm9kZSB7CisJc3RydWN0IGll ZWU4MDIxMV9zYW1wbGUgKnNhbl9zYW1wbGU7LyogYmFja3BvaW50ZXIgKi8KKwlpbnQgc3RhdGlj X3JpeDsJCQkvKiByYXRlIGluZGV4IG9mIGZpeGVkIHR4IHJhdGUgKi8KKwl1aW50NjRfdCByYXRl bWFzazsJCS8qIGJpdCBtYXNrIG9mIHZhbGlkIHJhdGUgaW5kaWNlcyAqLworCWNvbnN0IHN0cnVj dCB0eHNjaGVkdWxlICpzY2hlZDsJLyogdHggc2NoZWR1bGUgdGFibGUgKi8KKworCXN0cnVjdCBy YXRlX3N0YXRzIHN0YXRzW05VTV9QQUNLRVRfU0laRV9CSU5TXVtTQU1QTEVfTUFYUkFURVNdOwor CWludCBsYXN0X3NhbXBsZV9yaXhbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworCisJaW50IGN1cnJl bnRfc2FtcGxlX3JpeFtOVU1fUEFDS0VUX1NJWkVfQklOU107ICAgICAgIAorCWludCBwYWNrZXRz X3NlbnRbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOworCisJaW50IGN1cnJlbnRfcml4W05VTV9QQUNL RVRfU0laRV9CSU5TXTsKKwlpbnQgcGFja2V0c19zaW5jZV9zd2l0Y2hbTlVNX1BBQ0tFVF9TSVpF X0JJTlNdOworCXVuc2lnbmVkIHRpY2tzX3NpbmNlX3N3aXRjaFtOVU1fUEFDS0VUX1NJWkVfQklO U107CisKKwlpbnQgcGFja2V0c19zaW5jZV9zYW1wbGVbTlVNX1BBQ0tFVF9TSVpFX0JJTlNdOwor CXVuc2lnbmVkIHNhbXBsZV90dFtOVU1fUEFDS0VUX1NJWkVfQklOU107Cit9OworCisjZGVmaW5l CUlTX1JBVEVfREVGSU5FRChzYW4sIHJpeCkJKCgoc2FuKS0+cmF0ZW1hc2sgJiAoMTw8KHJpeCkp KSAhPSAwKQorCisjaWZuZGVmIE1JTgorI2RlZmluZQlNSU4oYSxiKQkoKGEpIDwgKGIpID8gKGEp IDogKGIpKQorI2VuZGlmCisjaWZuZGVmIE1BWAorI2RlZmluZQlNQVgoYSxiKQkoKGEpID4gKGIp ID8gKGEpIDogKGIpKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBpbnQgcGFja2V0X3NpemVfYmlu c1tOVU1fUEFDS0VUX1NJWkVfQklOU10gID0geyAyNTAsIDE2MDAgfTsKKworc3RhdGljIGlubGlu ZSBpbnQKK2Jpbl90b19zaXplKGludCBpbmRleCkKK3sKKwlyZXR1cm4gcGFja2V0X3NpemVfYmlu c1tpbmRleF07Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitzaXplX3RvX2JpbihpbnQgc2l6ZSkg Cit7CisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJTlMgPiAxCisJaWYgKHNpemUgPD0gcGFja2V0X3Np emVfYmluc1swXSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKyNpZiBOVU1fUEFDS0VUX1NJWkVfQklO UyA+IDIKKwlpZiAoc2l6ZSA8PSBwYWNrZXRfc2l6ZV9iaW5zWzFdKQorCQlyZXR1cm4gMTsKKyNl bmRpZgorI2lmIE5VTV9QQUNLRVRfU0laRV9CSU5TID4gMworCWlmIChzaXplIDw9IHBhY2tldF9z aXplX2JpbnNbMl0pCisJCXJldHVybiAyOworI2VuZGlmCisjaWYgTlVNX1BBQ0tFVF9TSVpFX0JJ TlMgPiA0CisjZXJyb3IgImFkZCBzdXBwb3J0IGZvciBtb3JlIHBhY2tldCBzaXplcyIKKyNlbmRp ZgorCXJldHVybiBOVU1fUEFDS0VUX1NJWkVfQklOUy0xOworfQorCitzdGF0aWMgdWludDMyX3Qg c2FtcGxlX3BrdF90eHRpbWUoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCwK Kwl1aW50MzJfdCBmcmFtZUxlbiwgdWludDE2X3QgcmF0ZWl4LCBpbnQgaXNodDQwLCBpbnQgaXNT aG9ydFByZWFtYmxlKQoreworCXVpbnQ4X3QgcmM7CisgICAgaW50IG51bVN0cmVhbXM7CisKKyAg ICByYyA9IHJ0LT5pbmZvW3JhdGVpeF0ucmF0ZUNvZGU7CisKKyAgICAvKiBMZWdhY3kgcmF0ZT8g UmV0dXJuIHRoZSBvbGQgd2F5ICovCisgICAgaWYgKCEgSVNfSFRfUkFURShyYykpCisgICAgCXJl dHVybiBpZWVlODAyMTFfY29tcHV0ZV9kdXJhdGlvbihydCwgZnJhbWVMZW4sIHJhdGVpeCwgaXNT aG9ydFByZWFtYmxlKTsKKworICAgIC8qIDExbiBmcmFtZSAtIGV4dHJhY3Qgb3V0IHRoZSBudW1i ZXIgb2Ygc3BhdGlhbCBzdHJlYW1zICovCisgICAgbnVtU3RyZWFtcyA9IEhUX1JDXzJfU1RSRUFN UyhyYyk7CisgICAgS0FTU0VSVChudW1TdHJlYW1zID4gMCAmJiBudW1TdHJlYW1zIDw9IDQsCisg ICAgICAgICgibnVtYmVyIG9mIHNwYXRpYWwgc3RyZWFtcyBuZWVkcyB0byBiZSAxLi4zOiBNQ1Mg cmF0ZSAweCV4ISIsCisgICAgICAgIHJhdGVpeCkpOworCisgICAgcmV0dXJuIGllZWU4MDIxMV9j b21wdXRlX2R1cmF0aW9uX2h0KGZyYW1lTGVuLCByYywgbnVtU3RyZWFtcywgaXNodDQwLCBpc1No b3J0UHJlYW1ibGUpOworfQorCisjZGVmaW5lIFdJRklfQ1dfTUlOIDMxCisjZGVmaW5lIFdJRklf Q1dfTUFYIDEwMjMKKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgdHJhbnNtaXQgZHVyYXRpb24gb2Yg YSBmcmFtZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNhbGNfdXNlY3NfdW5pY2FzdF9wYWNrZXQo Y29uc3Qgc3RydWN0IGllZWU4MDIxMXZhcCAqdmFwLAorCQkJCWludCBsZW5ndGgsCisJCQkJaW50 IHJpeCwgaW50IHNob3J0X3JldHJpZXMsCisJCQkJaW50IGxvbmdfcmV0cmllcywgaW50IGlzX2h0 NDApCit7CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlX3RhYmxlICpydCA9IGllZWU4MDIx MV9nZXRfcmF0ZXRhYmxlKHZhcC0+aXZfaWMtPmljX2N1cmNoYW4pOworCXN0cnVjdCBpZWVlODAy MTFjb20gKmljID0gdmFwLT5pdl9pYzsKKwlpbnQgY3VybW9kZSA9IGllZWU4MDIxMV9jaGFuMm1v ZGUodmFwLT5pdl9pYy0+aWNfY3VyY2hhbik7CisJCisJdW5zaWduZWQgdF9zbG90LCB0X2RpZnMs IHRfc2lmczsgCisJaW50IHJ0cywgY3RzOworCWludCB0dCwgeCwgY3csIGNpeDsKKworCWludCB0 dCA9IDA7CisJaW50IHggPSAwOworCWludCBjdyA9IFdJRklfQ1dfTUlOOworCisJS0FTU0VSVChy dCAhPSBOVUxMLCAoIm5vIHJhdGUgdGFibGUsIG1vZGUgJXUiLCBjdXJtb2RlKSk7CisKKwlpZiAo cml4ID49IHJ0LT5yYXRlQ291bnQpIHsKKwkJcHJpbnRmKCJib2d1cyByaXggJWQsIG1heCAldSwg bW9kZSAldVxuIiwKKwkJICAgICAgIHJpeCwgcnQtPnJhdGVDb3VudCwgY3VybW9kZSk7CisJCXJl dHVybiAwOworCX0KKwljaXggPSBydC0+aW5mb1tyaXhdLmNvbnRyb2xSYXRlOworCS8qIAorCSAq IFhYWCBnZXR0aW5nIG1hYy9waHkgbGV2ZWwgdGltaW5ncyBzaG91bGQgYmUgZml4ZWQgZm9yIHR1 cmJvCisJICogcmF0ZXMsIGFuZCB0aGVyZSBpcyBwcm9iYWJseSBhIHdheSB0byBnZXQgdGhpcyBm cm9tIHRoZQorCSAqIGhhbC4uLgorCSAqLworCXN3aXRjaCAocnQtPmluZm9bcml4XS5waHkpIHsK KwljYXNlIElFRUU4MDIxMV9UX09GRE06CisJCXRfc2xvdCA9IDk7CisJCXRfc2lmcyA9IDE2Owor CQl0X2RpZnMgPSAyODsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBJRUVFODAyMTFfVF9U VVJCTzoKKwkJdF9zbG90ID0gOTsKKwkJdF9zaWZzID0gODsKKwkJdF9kaWZzID0gMjg7CisJCWJy ZWFrOworCWNhc2UgSUVFRTgwMjExX1RfSFQ6CisJCXRfc2xvdCA9IDk7CisJCXRfc2lmcyA9IDg7 CisJCXRfZGlmcyA9IDI4OworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9UX0RTOgorCQkvKiBm YWxsIHRocm91Z2ggdG8gZGVmYXVsdCAqLworCWRlZmF1bHQ6CisJCS8qIHBnIDIwNSBpZWVlLjgw Mi4xMS5wZGYgKi8KKwkJdF9zbG90ID0gMjA7CisJCXRfZGlmcyA9IDUwOworCQl0X3NpZnMgPSAx MDsKKwl9CisKKwlydHMgPSBjdHMgPSAwOworCisJaWYgKChpYy0+aWNfZmxhZ3MgJiBJRUVFODAy MTFfRl9VU0VQUk9UKSAmJgorCSAgICBydC0+aW5mb1tyaXhdLnBoeSA9PSBJRUVFODAyMTFfVF9P RkRNKSB7CisJCWlmIChpYy0+aWNfcHJvdG1vZGUgPT0gSUVFRTgwMjExX1BST1RfUlRTQ1RTKQor CQkJcnRzID0gMTsKKwkJZWxzZSBpZiAoaWMtPmljX3Byb3Rtb2RlID09IElFRUU4MDIxMV9QUk9U X0NUU09OTFkpCisJCQljdHMgPSAxOworCisJCWludCBwcm90cml4OworICAgIAlpZiAoY3VybW9k ZSA9PSBJRUVFODAyMTFfTU9ERV8xMUcpCisgICAgCSAgICBwcm90cml4ID0gcnQtPnJhdGVDb2Rl VG9JbmRleFsyKjJdOworICAgIAllbHNlIAorICAgIAkgICAgcHJvdHJpeCA9IHJ0LT5yYXRlQ29k ZVRvSW5kZXhbMioxXTsKKyAgICAJaWYgKDB4ZmYgPT0gcHJvdHJpeCkKKyAgICAJCXByb3RyaXgg PSAwOworCisJCWNpeCA9IHJ0LT5pbmZvW3Byb3RyaXhdLmNvbnRyb2xSYXRlOworCX0KKworCWlm ICgwIC8qbGVuZ3RoID4gaWMtPmljX3J0c3RocmVzaG9sZCAqLykgeworCQlydHMgPSAxOworCX0K KworCWlmIChydHMgfHwgY3RzKSB7CisJCWludCBjdHNyYXRlOworCQlpbnQgY3RzZHVyYXRpb24g PSAwOworCisJCS8qIE5COiB0aGlzIGlzIGludGVudGlvbmFsbHkgbm90IGEgcnVudGltZSBjaGVj ayAqLworCQlLQVNTRVJUKGNpeCA8IHJ0LT5yYXRlQ291bnQsCisJCSAgICAoImJvZ3VzIGNpeCAl ZCwgbWF4ICV1LCBtb2RlICV1XG4iLCBjaXgsIHJ0LT5yYXRlQ291bnQsCisJCSAgICAgY3VybW9k ZSkpOworCisJCWN0c3JhdGUgPSBydC0+aW5mb1tjaXhdLnJhdGVDb2RlIHwgcnQtPmluZm9bY2l4 XS5zaG9ydFByZWFtYmxlOworCQlpZiAocnRzKQkJLyogU0lGUyArIENUUyAqLworCQkJY3RzZHVy YXRpb24gKz0gcnQtPmluZm9bY2l4XS5zcEFja0R1cmF0aW9uOworCisJCS8qIFhYWCBhc3N1bWVz IHNob3J0IHByZWFtYmxlICovCisJCWN0c2R1cmF0aW9uICs9IHNhbXBsZV9wa3RfdHh0aW1lKHJ0 LCBsZW5ndGgsIHJpeCwgaXNfaHQ0MCwgMCk7CisKKwkJaWYgKGN0cykJLyogU0lGUyArIEFDSyAq LworCQkJY3RzZHVyYXRpb24gKz0gcnQtPmluZm9bY2l4XS5zcEFja0R1cmF0aW9uOworCisJCXR0 ICs9IChzaG9ydF9yZXRyaWVzICsgMSkgKiBjdHNkdXJhdGlvbjsKKwl9CisJdHQgKz0gdF9kaWZz OworCisJLyogWFhYIGFzc3VtZXMgc2hvcnQgcHJlYW1ibGUgKi8KKwl0dCArPSAobG9uZ19yZXRy aWVzKzEpKnNhbXBsZV9wa3RfdHh0aW1lKHJ0LCBsZW5ndGgsIHJpeCwgaXNfaHQ0MCwgMCk7CisK Kwl0dCArPSAobG9uZ19yZXRyaWVzKzEpKih0X3NpZnMgKyBydC0+aW5mb1tyaXhdLnNwQWNrRHVy YXRpb24pOworCisJZm9yICh4ID0gMDsgeCA8PSBzaG9ydF9yZXRyaWVzICsgbG9uZ19yZXRyaWVz OyB4KyspIHsKKwkJY3cgPSBNSU4oV0lGSV9DV19NQVgsIChjdyArIDEpICogMik7CisJCXR0ICs9 ICh0X3Nsb3QgKiBjdy8yKTsKKwl9CisJcmV0dXJuIHR0OworfQorCisjZW5kaWYgLyogX05FVDgw MjExX0lFRUU4MDIxMV9SQVRFQ1RMX1NBTVBMRV9IXyAqLwpJbmRleDogbmV0ODAyMTEvaWVlZTgw MjExX3JhdGVjdGxfbm9uZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG5ldDgwMjExL2llZWU4MDIxMV9yYXRl Y3RsX25vbmUuaAkocmV2aXNpb24gMCkKKysrIG5ldDgwMjExL2llZWU4MDIxMV9yYXRlY3RsX25v bmUuaAkocmV2aXNpb24gMjU2ODI1KQpAQCAtMCwwICsxLDM4IEBACisvKi0KKyAqIENvcHlyaWdo dCAoYykgMjAxMyBDaGVuY2hvbmcgUWluIDxjY3FpbkBGcmVlQlNELm9yZz4KKyAqCisgKiBQZXJt aXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJl IGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRl ZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMg cGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRX QVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJS QU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1Q TElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5P IEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJ UkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwor ICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRT LCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RI RVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBX SVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZu ZGVmIF9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNUTF9OT05FX0hfCisjZGVmaW5lIF9ORVQ4MDIx MV9JRUVFODAyMTFfUkFURUNUTF9OT05FX0hfCisKKyNpbmNsdWRlIDxuZXQ4MDIxMS9pZWVlODAy MTFfcmF0ZWN0bC5oPgorCisvKgorICogUmF0ZSBjb250cm9sIHNldHRpbmdzLgorICovCisKK3N0 cnVjdCBpZWVlODAyMTFfbm9uZSB7CisJc3RydWN0IGllZWU4MDIxMV9yY19zdGF0IG5vbmVfc3Rh dDsKKwkvKiBvdGhlciBzdHVmZnMgKi8KK307CisKKy8qCisgKiBSYXRlIGNvbnRyb2wgc3RhdGUg Zm9yIGEgZ2l2ZW4gbm9kZS4KKyAqLworc3RydWN0IGllZWU4MDIxMV9ub25lX25vZGUgeworCXN0 cnVjdCBpZWVlODAyMTFfbm9uZSAqbm9uX25vbmU7Cit9OworCisjZW5kaWYgLyogX05FVDgwMjEx X0lFRUU4MDIxMV9SQVRFQ1RMX05PTkVfSF8gKi8KSW5kZXg6IG5ldDgwMjExL2llZWU4MDIxMV9y Y19zYW1wbGVfdHhzY2hlZC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG5ldDgwMjExL2llZWU4MDIxMV9yY19z YW1wbGVfdHhzY2hlZC5oCShyZXZpc2lvbiAwKQorKysgbmV0ODAyMTEvaWVlZTgwMjExX3JjX3Nh bXBsZV90eHNjaGVkLmgJKHJldmlzaW9uIDI1NjgyNSkKQEAgLTAsMCArMSwyNDEgQEAKKy8qICRG cmVlQlNEOiBoZWFkL3N5cy9kZXYvYXRoL2F0aF9yYXRlL3NhbXBsZS90eF9zY2hlZHVsZXMuaCAy NDAzODQgMjAxMi0wOC0xNSAwNzo1MDo0MlogYWRyaWFuICQqLworCisvKi0KKyAqIENvcHlyaWdo dCAoYykgMjAwNSBKb2huIEJpY2tldAorICogQ29weXJpZ2h0IChjKSAyMDEzIENoZW5jaG9uZyBR aW4gPGNjcWluQEZyZWVCU0Qub3JnPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt ZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSBhdCBtaW5pbXVtIGEgZGlzY2xhaW1lcgorICog ICAgc2ltaWxhciB0byB0aGUgIk5PIFdBUlJBTlRZIiBkaXNjbGFpbWVyIGJlbG93ICgiRGlzY2xh aW1lciIpIGFuZCBhbnkKKyAqICAgIHJlZGlzdHJpYnV0aW9uIG11c3QgYmUgY29uZGl0aW9uZWQg dXBvbiBpbmNsdWRpbmcgYSBzdWJzdGFudGlhbGx5CisgKiAgICBzaW1pbGFyIERpc2NsYWltZXIg cmVxdWlyZW1lbnQgZm9yIGZ1cnRoZXIgYmluYXJ5IHJlZGlzdHJpYnV0aW9uLgorICogMy4gTmVp dGhlciB0aGUgbmFtZXMgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3Ig dGhlIG5hbWVzCisgKiAgICBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICBmcm9tIHRoaXMgc29mdHdhcmUg d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJu YXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1z IG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSB2ZXJzaW9uIDIg YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAq IE5PIFdBUlJBTlRZCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNT IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTklORlJJTkdFTUVOVCwgTUVSQ0hBTlRJQklM SVRZCisgKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlN RUQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJ QlVUT1JTIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgRVhFTVBMQVJZLAorICogT1IgQ09OU0VRVUVO VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg T0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP UiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB TkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIKKyAqIElOIENPTlRSQUNULCBT VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ U0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FS RSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VT LgorICoKKyAqLworI2lmbmRlZglfTkVUODAyMTFfSUVFRTgwMjExX1JBVEVDVExfU0FNUExFX1RY U0NIRURVTEVTX0hfCisjZGVmaW5lCV9ORVQ4MDIxMV9JRUVFODAyMTFfUkFURUNUTF9TQU1QTEVf VFhTQ0hFRFVMRVNfSF8KKworI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgorCisjZGVmaW5lIEEoX3Ip IFwKKyAgICAoKChfcikgPT0gNikgICA/IDAgOiAoKChfcikgPT0gOSkgICA/IDEgOiAoKChfcikg PT0gMTIpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDE4KSAgPyAzIDogKCgoX3IpID09IDI0KSAg PyA0IDogKCgoX3IpID09IDM2KSAgPyA1IDogXAorICAgICgoKF9yKSA9PSA0OCkgID8gNiA6ICgo KF9yKSA9PSA1NCkgID8gNyA6IDApKSkpKSkpKQorc3RhdGljIGNvbnN0IHN0cnVjdCB0eHNjaGVk dWxlIHNlcmllc18xMWFbXSA9IHsKKwl7IDMsQSggNiksIDMsQSggIDYpLCAwLEEoICA2KSwgMCxB KCA2KSB9LAkvKiAgIDZNYi9zICovCisJeyA0LEEoIDkpLCAzLEEoICA2KSwgNCxBKCAgNiksIDAs QSggNikgfSwJLyogICA5TWIvcyAqLworCXsgNCxBKDEyKSwgMyxBKCAgNiksIDQsQSggIDYpLCAw LEEoIDYpIH0sCS8qICAxMk1iL3MgKi8KKwl7IDQsQSgxOCksIDMsQSggMTIpLCA0LEEoICA2KSwg MixBKCA2KSB9LAkvKiAgMThNYi9zICovCisJeyA0LEEoMjQpLCAzLEEoIDE4KSwgNCxBKCAxMiks IDIsQSggNikgfSwJLyogIDI0TWIvcyAqLworCXsgNCxBKDM2KSwgMyxBKCAyNCksIDQsQSggMTgp LCAyLEEoIDYpIH0sCS8qICAzNk1iL3MgKi8KKwl7IDQsQSg0OCksIDMsQSggMzYpLCA0LEEoIDI0 KSwgMixBKDEyKSB9LAkvKiAgNDhNYi9zICovCisJeyA0LEEoNTQpLCAzLEEoIDQ4KSwgNCxBKCAz NiksIDIsQSgyNCkgfQkvKiAgNTRNYi9zICovCit9OworCisjZGVmaW5lIE5BMShfcikgXAorCSgo KF9yKSA9PSA2LjUpICA/IDggOiAoKChfcikgPT0gMTMpICA/ICA5IDogKCgoX3IpID09IDE5LjUp PyAxMCA6IFwKKwkoKChfcikgPT0gMjYpICA/IDExIDogKCgoX3IpID09IDM5KSAgPyAxMiA6ICgo KF9yKSA9PSA1MikgID8gMTMgOiBcCisJKCgoX3IpID09IDU4LjUpPyAxNCA6ICgoKF9yKSA9PSA2 NSkgID8gMTUgOiAwKSkpKSkpKSkKKyNkZWZpbmUgTkEyKF9yKSBcCisJKCgoX3IpID09IDEzKSA/ IDE2IDogKCgoX3IpID09IDI2KSA/IDE3IDogKCgoX3IpID09IDM5KSA/IDE4IDogXAorCSgoKF9y KSA9PSA1MikgPyAxOSA6ICgoKF9yKSA9PSA3OCkgPyAyMCA6ICgoKF9yKSA9PSAxMDQpPyAyMSA6 IFwKKwkoKChfcikgPT0gMTE3KT8gMjIgOiAoKChfcikgPT0gMTMwKT8gMjMgOiAwKSkpKSkpKSkK KyNkZWZpbmUgTkEzKF9yKSBcCisJKCgoX3IpID09IDE5LjUpICA/IDI0IDogKCgoX3IpID09IDM5 KSA/IDI1IDogKCgoX3IpID09IDU4LjUpICA/IDI2IDogXAorCSgoKF9yKSA9PSA3OCkgID8gMjcg OiAoKChfcikgPT0gMTE3KSA/IDI4IDogKCgoX3IpID09IDE1NikgPyAyOSA6IFwKKwkoKChfcikg PT0gMTc1LjUpID8gMzAgOiAoKChfcikgPT0gMTk1KT8gMzEgOiAwKSkpKSkpKSkKK3N0YXRpYyBj b25zdCBzdHJ1Y3QgdHhzY2hlZHVsZSBzZXJpZXNfMTFuYVtdID0geworCXsgMyxBKCA2KSwgMyxB KCAgNiksIDAsQSggIDYpLCAwLEEoIDYpIH0sICAgICAgIC8qICAgNk1iL3MgKi8KKwl7IDQsQSgg OSksIDMsQSggIDYpLCA0LEEoICA2KSwgMCxBKCA2KSB9LCAgICAgICAvKiAgIDlNYi9zICovCisJ eyA0LEEoMTIpLCAzLEEoICA2KSwgNCxBKCAgNiksIDAsQSggNikgfSwgICAgICAgLyogIDEyTWIv cyAqLworCXsgNCxBKDE4KSwgMyxBKCAxMiksIDQsQSggIDYpLCAyLEEoIDYpIH0sICAgICAgIC8q ICAxOE1iL3MgKi8KKwl7IDQsQSgyNCksIDMsQSggMTgpLCA0LEEoIDEyKSwgMixBKCA2KSB9LCAg ICAgICAvKiAgMjRNYi9zICovCisJeyA0LEEoMzYpLCAzLEEoIDI0KSwgNCxBKCAxOCksIDIsQSgg NikgfSwgICAgICAgLyogIDM2TWIvcyAqLworCXsgNCxBKDQ4KSwgMyxBKCAzNiksIDQsQSggMjQp LCAyLEEoMTIpIH0sICAgICAgIC8qICA0OE1iL3MgKi8KKwl7IDQsQSg1NCksIDMsQSggNDgpLCA0 LEEoIDM2KSwgMixBKDI0KSB9LCAgICAgICAvKiAgNTRNYi9zICovCisKKwkvKiAxIHN0cmVhbSBy YXRlcyAqLworCisJeyAzLE5BMSggNi41KSwgMyxOQTEoIDYuNSksIDAsTkExKCA2LjUpLCAwLE5B MSg2LjUpIH0sICAvKiA2LjVNYi9zICovCisJeyA0LE5BMSggIDEzKSwgMyxOQTEoIDYuNSksIDQs TkExKCA2LjUpLCAwLE5BMSg2LjUpIH0sICAvKiAgMTNNYi9zICovCisJeyA0LE5BMSgxOS41KSwg MyxOQTEoIDYuNSksIDQsTkExKCA2LjUpLCAwLE5BMSg2LjUpIH0sICAvKjE5LjVNYi9zICovCisJ eyA0LE5BMSggIDI2KSwgMyxOQTEoMTkuNSksIDQsTkExKCA2LjUpLCAyLE5BMSg2LjUpIH0sICAv KiAgMjZNYi9zICovCisJeyA0LE5BMSggIDM5KSwgMyxOQTEoICAyNiksIDQsTkExKDE5LjUpLCAy LE5BMSg2LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5BMSggIDUyKSwgMyxOQTEoICAzOSks IDQsTkExKCAgMjYpLCAyLE5BMSg2LjUpIH0sICAvKiAgNTJNYi9zICovCisJeyA0LE5BMSg1OC41 KSwgMyxOQTEoICA1MiksIDQsTkExKCAgMzkpLCAyLE5BMSggMTMpIH0sICAvKjU4LjVNYi9zICov CisJeyA0LE5BMSggIDY1KSwgMyxOQTEoNTguNSksIDQsTkExKCAgNTIpLCAyLE5BMSggMTMpIH0s ICAvKiAgNjVNYi9zICovCisKKwkvKiAyIHN0cmVhbSByYXRlcyAqLworCisJeyAzLE5BMiggIDEz KSwgMyxOQTIoICAxMyksIDAsTkEyKCAgMTMpLCAwLE5BMiggMTMpIH0sICAvKiAgMTNNYi9zICov CisJeyA0LE5BMiggIDI2KSwgMyxOQTIoICAxMyksIDQsTkEyKCAgMTMpLCAwLE5BMiggMTMpIH0s ICAvKiAgMjZNYi9zICovCisJeyA0LE5BMiggIDM5KSwgMyxOQTIoICAyNiksIDQsTkEyKCAgMTMp LCAyLE5BMiggMTMpIH0sICAvKiAgMzlNYi9zICovCisJeyA0LE5BMiggIDUyKSwgMyxOQTIoICAz OSksIDQsTkEyKCAgMjYpLCAyLE5BMiggMTMpIH0sICAvKiAgNTJNYi9zICovCisJeyA0LE5BMigg IDc4KSwgMyxOQTIoICA1MiksIDQsTkEyKCAgMzkpLCAyLE5BMiggMTMpIH0sICAvKiAgNzhNYi9z ICovCisJeyA0LE5BMiggMTA0KSwgMyxOQTIoICA3OCksIDQsTkEyKCAgNTIpLCAyLE5BMiggMTMp IH0sICAvKiAxMDRNYi9zICovCisJeyA0LE5BMiggMTE3KSwgMyxOQTIoIDEwNCksIDQsTkEyKCAg NzgpLCAyLE5BMiggMjYpIH0sICAvKiAxMTdNYi9zICovCisJeyA0LE5BMiggMTMwKSwgMyxOQTIo IDExNyksIDQsTkEyKCAxMDQpLCAyLE5BMiggMjYpIH0sICAgLyogMTMwTWIvcyAqLworCisJLyog MyBzdHJlYW0gcmF0ZXMgKi8KKworCXsgMyxOQTMoMTkuNSksIDMsTkEzKDE5LjUpLCAwLE5BMygx OS41KSwgMCxOQTMoMTkuNSkgfSwgIC8qICAxOU1iL3MgKi8KKwl7IDMsTkEzKCAgMzkpLCAzLE5B MygxOS41KSwgMCxOQTMoMTkuNSksIDAsTkEzKDE5LjUpIH0sICAvKiAgMzlNYi9zICovCisJeyAz LE5BMyg1OC41KSwgMyxOQTMoICAzOSksIDAsTkEzKDE5LjUpLCAwLE5BMygxOS41KSB9LCAgLyog IDU4TWIvcyAqLworCXsgMyxOQTMoICA3OCksIDMsTkEzKDU4LjUpLCAwLE5BMyggIDM5KSwgMCxO QTMoMTkuNSkgfSwgIC8qICA3OE1iL3MgKi8KKwl7IDMsTkEzKCAxMTcpLCAzLE5BMyggIDc4KSwg MCxOQTMoNTguNSksIDAsTkEzKDE5LjUpIH0sICAvKiAxMTdNYi9zICovCisJeyAzLE5BMyggMTU2 KSwgMyxOQTMoIDExNyksIDAsTkEzKCAgNzgpLCAwLE5BMygxOS41KSB9LCAgLyogIDE1Nk1iL3Mg Ki8KKwl7IDMsTkEzKDE3NS41KSwgMyxOQTMoIDE1NiksIDAsTkEzKCAxMTcpLCAwLE5BMyggIDM5 KSB9LCAgLyogIDE3NU1iL3MgKi8KKwl7IDMsTkEzKCAxOTUpLCAzLE5BMyggMTk1KSwgMCxOQTMo IDE1NiksIDAsTkEzKDU4LjUpIH0sICAvKiAxOTVNYi9zICovCit9OworI3VuZGVmIEEKKyN1bmRl ZiBOQTMKKyN1bmRlZiBOQTIKKyN1bmRlZiBOQTEKKworI2RlZmluZSBHKF9yKSBcCisgICAgKCgo X3IpID09IDEpICAgPyAwIDogKCgoX3IpID09IDIpICAgPyAxIDogKCgoX3IpID09IDUuNSkgPyAy IDogXAorICAgICgoKF9yKSA9PSAxMSkgID8gMyA6ICgoKF9yKSA9PSA2KSAgID8gNCA6ICgoKF9y KSA9PSA5KSAgID8gNSA6IFwKKyAgICAoKChfcikgPT0gMTIpICA/IDYgOiAoKChfcikgPT0gMTgp ICA/IDcgOiAoKChfcikgPT0gMjQpICA/IDggOiBcCisgICAgKCgoX3IpID09IDM2KSAgPyA5IDog KCgoX3IpID09IDQ4KSAgPyAxMCA6ICgoKF9yKSA9PSA1NCkgID8gMTEgOiAwKSkpKSkpKSkpKSkp CitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUgc2VyaWVzXzExZ1tdID0geworCXsgMyxH KCAxKSwgMyxHKCAgMSksIDAsRyggIDEpLCAwLEcoIDEpIH0sCS8qICAgMU1iL3MgKi8KKwl7IDQs RyggMiksIDMsRyggIDEpLCA0LEcoICAxKSwgMCxHKCAxKSB9LAkvKiAgIDJNYi9zICovCisJeyA0 LEcoNS41KSwzLEcoICAyKSwgNCxHKCAgMSksIDIsRyggMSkgfSwJLyogNS41TWIvcyAqLworCXsg NCxHKDExKSwgMyxHKDUuNSksIDQsRyggIDIpLCAyLEcoIDEpIH0sCS8qICAxMU1iL3MgKi8KKwl7 IDQsRyggNiksIDMsRyg1LjUpLCA0LEcoICAyKSwgMixHKCAxKSB9LAkvKiAgIDZNYi9zICovCisJ eyA0LEcoIDkpLCAzLEcoICA2KSwgNCxHKDUuNSksIDIsRyggMSkgfSwJLyogICA5TWIvcyAqLwor CXsgNCxHKDEyKSwgMyxHKCAxMSksIDQsRyg1LjUpLCAyLEcoIDEpIH0sCS8qICAxMk1iL3MgKi8K Kwl7IDQsRygxOCksIDMsRyggMTIpLCA0LEcoIDExKSwgMixHKCAxKSB9LAkvKiAgMThNYi9zICov CisJeyA0LEcoMjQpLCAzLEcoIDE4KSwgNCxHKCAxMiksIDIsRyggMSkgfSwJLyogIDI0TWIvcyAq LworCXsgNCxHKDM2KSwgMyxHKCAyNCksIDQsRyggMTgpLCAyLEcoIDEpIH0sCS8qICAzNk1iL3Mg Ki8KKwl7IDQsRyg0OCksIDMsRyggMzYpLCA0LEcoIDI0KSwgMixHKCAxKSB9LAkvKiAgNDhNYi9z ICovCisJeyA0LEcoNTQpLCAzLEcoIDQ4KSwgNCxHKCAzNiksIDIsRyggMSkgfQkvKiAgNTRNYi9z ICovCit9OworCisjZGVmaW5lIE5HMShfcikgXAorCSgoKF9yKSA9PSA2LjUpID8gMTIgOiAoKChf cikgPT0gMTMpID8gMTMgOiAoKChfcikgPT0gMTkuNSk/IDE0IDogXAorCSgoKF9yKSA9PSAyNikg ID8gMTUgOiAoKChfcikgPT0gMzkpID8gMTYgOiAoKChfcikgPT0gNTIpICA/IDE3IDogXAorCSgo KF9yKSA9PSA1OC41KT8gMTggOiAoKChfcikgPT0gNjUpID8gMTkgOiAwKSkpKSkpKSkKKyNkZWZp bmUgTkcyKF9yKSBcCisJKCgoX3IpID09IDEzKSAgPyAyMCA6ICgoKF9yKSA9PSAyNikgPyAyMSA6 ICgoKF9yKSA9PSAzOSkgID8gMjIgOiBcCisJKCgoX3IpID09IDUyKSAgPyAyMyA6ICgoKF9yKSA9 PSA3OCkgPyAyNCA6ICgoKF9yKSA9PSAxMDQpID8gMjUgOiBcCisJKCgoX3IpID09IDExNykgPyAy NiA6ICgoKF9yKSA9PSAxMzApPyAyNyA6IDApKSkpKSkpKQorI2RlZmluZSBORzMoX3IpIFwKKwko KChfcikgPT0gMTkuNSkgID8gMjggOiAoKChfcikgPT0gMzkpID8gMjkgOiAoKChfcikgPT0gNTgu NSkgID8gMzAgOiBcCisJKCgoX3IpID09IDc4KSAgPyAzMSA6ICgoKF9yKSA9PSAxMTcpID8gMzIg OiAoKChfcikgPT0gMTU2KSA/IDMzIDogXAorCSgoKF9yKSA9PSAxNzUuNSkgPyAzNCA6ICgoKF9y KSA9PSAxOTUpPyAzNSA6IDApKSkpKSkpKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1 bGUgc2VyaWVzXzExbmdbXSA9IHsKKwl7IDMsRyggMSksIDMsRyggIDEpLCAwLEcoICAxKSwgMCxH KCAxKSB9LCAgICAgICAvKiAgIDFNYi9zICovCisJeyA0LEcoIDIpLCAzLEcoICAxKSwgNCxHKCAg MSksIDAsRyggMSkgfSwgICAgICAgLyogICAyTWIvcyAqLworCXsgNCxHKDUuNSksMyxHKCAgMiks IDQsRyggIDEpLCAyLEcoIDEpIH0sICAgICAgIC8qIDUuNU1iL3MgKi8KKwl7IDQsRygxMSksIDMs Ryg1LjUpLCA0LEcoICAyKSwgMixHKCAxKSB9LCAgICAgICAvKiAgMTFNYi9zICovCisJeyA0LEco IDYpLCAzLEcoNS41KSwgNCxHKCAgMiksIDIsRyggMSkgfSwgICAgICAgLyogICA2TWIvcyAqLwor CXsgNCxHKCA5KSwgMyxHKCAgNiksIDQsRyg1LjUpLCAyLEcoIDEpIH0sICAgICAgIC8qICAgOU1i L3MgKi8KKwl7IDQsRygxMiksIDMsRyggMTEpLCA0LEcoNS41KSwgMixHKCAxKSB9LCAgICAgICAv KiAgMTJNYi9zICovCisJeyA0LEcoMTgpLCAzLEcoIDEyKSwgNCxHKCAxMSksIDIsRyggMSkgfSwg ICAgICAgLyogIDE4TWIvcyAqLworCXsgNCxHKDI0KSwgMyxHKCAxOCksIDQsRyggMTIpLCAyLEco IDEpIH0sICAgICAgIC8qICAyNE1iL3MgKi8KKwl7IDQsRygzNiksIDMsRyggMjQpLCA0LEcoIDE4 KSwgMixHKCAxKSB9LCAgICAgICAvKiAgMzZNYi9zICovCisJeyA0LEcoNDgpLCAzLEcoIDM2KSwg NCxHKCAyNCksIDIsRyggMSkgfSwgICAgICAgLyogIDQ4TWIvcyAqLworCXsgNCxHKDU0KSwgMyxH KCA0OCksIDQsRyggMzYpLCAyLEcoIDEpIH0sICAgICAgIC8qICA1NE1iL3MgKi8KKworCS8qIDEg c3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkcxKCA2LjUpLCAzLE5HMSggNi41KSwgMCxORzEoIDYu NSksIDAsTkcxKDYuNSkgfSwgIC8qIDYuNU1iL3MgKi8KKwl7IDQsTkcxKCAgMTMpLCAzLE5HMSgg Ni41KSwgNCxORzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8qICAxM01iL3MgKi8KKwl7IDQsTkcx KDE5LjUpLCAzLE5HMSggNi41KSwgNCxORzEoIDYuNSksIDAsTkcxKDYuNSkgfSwgIC8qMTkuNU1i L3MgKi8KKwl7IDQsTkcxKCAgMjYpLCAzLE5HMSgxOS41KSwgNCxORzEoIDYuNSksIDIsTkcxKDYu NSkgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQsTkcxKCAgMzkpLCAzLE5HMSggIDI2KSwgNCxORzEo MTkuNSksIDIsTkcxKDYuNSkgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDQsTkcxKCAgNTIpLCAzLE5H MSggIDM5KSwgNCxORzEoICAyNiksIDIsTkcxKDYuNSkgfSwgIC8qICA1Mk1iL3MgKi8KKwl7IDQs TkcxKDU4LjUpLCAzLE5HMSggIDUyKSwgNCxORzEoICAzOSksIDIsTkcxKCAxMykgfSwgIC8qNTgu NU1iL3MgKi8KKwl7IDQsTkcxKCAgNjUpLCAzLE5HMSg1OC41KSwgNCxORzEoICA1MiksIDIsTkcx KCAxMykgfSwgIC8qICA2NU1iL3MgKi8KKworCS8qIDIgc3RyZWFtIHJhdGVzICovCisKKwl7IDMs TkcyKCAgMTMpLCAzLE5HMiggIDEzKSwgMCxORzIoICAxMyksIDAsTkcyKCAxMykgfSwgIC8qICAx M01iL3MgKi8KKwl7IDQsTkcyKCAgMjYpLCAzLE5HMiggIDEzKSwgNCxORzIoICAxMyksIDAsTkcy KCAxMykgfSwgIC8qICAyNk1iL3MgKi8KKwl7IDQsTkcyKCAgMzkpLCAzLE5HMiggIDI2KSwgNCxO RzIoICAxMyksIDIsTkcyKCAxMykgfSwgIC8qICAzOU1iL3MgKi8KKwl7IDQsTkcyKCAgNTIpLCAz LE5HMiggIDM5KSwgNCxORzIoICAyNiksIDIsTkcyKCAxMykgfSwgIC8qICA1Mk1iL3MgKi8KKwl7 IDQsTkcyKCAgNzgpLCAzLE5HMiggIDUyKSwgNCxORzIoICAzOSksIDIsTkcyKCAxMykgfSwgIC8q ICA3OE1iL3MgKi8KKwl7IDQsTkcyKCAxMDQpLCAzLE5HMiggIDc4KSwgNCxORzIoICA1MiksIDIs TkcyKCAxMykgfSwgIC8qIDEwNE1iL3MgKi8KKwl7IDQsTkcyKCAxMTcpLCAzLE5HMiggMTA0KSwg NCxORzIoICA3OCksIDIsTkcyKCAyNikgfSwgIC8qIDExN01iL3MgKi8KKwl7IDQsTkcyKCAxMzAp LCAzLE5HMiggMTE3KSwgNCxORzIoIDEwNCksIDIsTkcyKCAyNikgfSwgIC8qIDEzME1iL3MgKi8K KworCS8qIDMgc3RyZWFtIHJhdGVzICovCisKKwl7IDMsTkczKDE5LjUpLCAzLE5HMygxOS41KSwg MCxORzMoMTkuNSksIDAsTkczKDE5LjUpIH0sICAvKiAgMTlNYi9zICovCisJeyAzLE5HMyggIDM5 KSwgMyxORzMoMTkuNSksIDAsTkczKDE5LjUpLCAwLE5HMygxOS41KSB9LCAgLyogIDM5TWIvcyAq LworCXsgMyxORzMoNTguNSksIDMsTkczKCAgMzkpLCAwLE5HMygxOS41KSwgMCxORzMoMTkuNSkg fSwgIC8qICA1OE1iL3MgKi8KKwl7IDMsTkczKCAgNzgpLCAzLE5HMyg1OC41KSwgMCxORzMoICAz OSksIDAsTkczKDE5LjUpIH0sICAvKiAgNzhNYi9zICovCisJeyAzLE5HMyggMTE3KSwgMyxORzMo ICA3OCksIDAsTkczKDU4LjUpLCAwLE5HMygxOS41KSB9LCAgLyogMTE3TWIvcyAqLworCXsgMyxO RzMoIDE1NiksIDMsTkczKCAxMTcpLCAwLE5HMyggIDc4KSwgMCxORzMoMTkuNSkgfSwgIC8qICAx NTZNYi9zICovCisJeyAzLE5HMygxNzUuNSksIDMsTkczKCAxNTYpLCAwLE5HMyggMTE3KSwgMCxO RzMoICAzOSkgfSwgIC8qICAxNzVNYi9zICovCisJeyAzLE5HMyggMTk1KSwgMyxORzMoIDE5NSks IDAsTkczKCAxNTYpLCAwLE5HMyg1OC41KSB9LCAgLyogMTk1TWIvcyAqLworCit9OworI3VuZGVm IEcKKyN1bmRlZiBORzMKKyN1bmRlZiBORzIKKyN1bmRlZiBORzEKKworI2RlZmluZSBIKF9yKSBc CisgICAgKCgoX3IpID09IDMpICAgPyAwIDogKCgoX3IpID09IDQuNSkgPyAxIDogKCgoX3IpID09 IDYpICA/IDIgOiBcCisgICAgKCgoX3IpID09IDkpICAgPyAzIDogKCgoX3IpID09IDEyKSAgPyA0 IDogKCgoX3IpID09IDE4KSA/IDUgOiBcCisgICAgKCgoX3IpID09IDI0KSAgPyA2IDogKCgoX3Ip ID09IDI3KSAgPyA3IDogMCkpKSkpKSkpCitzdGF0aWMgY29uc3Qgc3RydWN0IHR4c2NoZWR1bGUg c2VyaWVzX2hhbGZbXSA9IHsKKwl7IDMsSCggMyksIDMsSCggIDMpLCAwLEgoICAzKSwgMCxIKCAz KSB9LAkvKiAgIDNNYi9zICovCisJeyA0LEgoNC41KSwzLEgoICAzKSwgNCxIKCAgMyksIDAsSCgg MykgfSwJLyogNC41TWIvcyAqLworCXsgNCxIKCA2KSwgMyxIKCAgMyksIDQsSCggIDMpLCAwLEgo IDMpIH0sCS8qICAgNk1iL3MgKi8KKwl7IDQsSCggOSksIDMsSCggIDYpLCA0LEgoICAzKSwgMixI KCAzKSB9LAkvKiAgIDlNYi9zICovCisJeyA0LEgoMTIpLCAzLEgoICA5KSwgNCxIKCAgNiksIDIs SCggMykgfSwJLyogIDEyTWIvcyAqLworCXsgNCxIKDE4KSwgMyxIKCAxMiksIDQsSCggIDkpLCAy LEgoIDMpIH0sCS8qICAxOE1iL3MgKi8KKwl7IDQsSCgyNCksIDMsSCggMTgpLCA0LEgoIDEyKSwg MixIKCA2KSB9LAkvKiAgMjRNYi9zICovCisJeyA0LEgoMjcpLCAzLEgoIDI0KSwgNCxIKCAxOCks IDIsSCgxMikgfQkvKiAgMjdNYi9zICovCit9OworI3VuZGVmIEgKKworI2lmZGVmIFEKKyN1bmRl ZiBRCisjZW5kaWYKKyNkZWZpbmUgUShfcikgXAorICAgICgoKF9yKSA9PSAxLjUpID8gMCA6ICgo KF9yKSA9PTIuMjUpID8gMSA6ICgoKF9yKSA9PSAzKSAgPyAyIDogXAorICAgICgoKF9yKSA9PSA0 LjUpID8gMyA6ICgoKF9yKSA9PSAgNikgID8gNCA6ICgoKF9yKSA9PSA5KSAgPyA1IDogXAorICAg ICgoKF9yKSA9PSAxMikgID8gNiA6ICgoKF9yKSA9PSAxMy41KT8gNyA6IDApKSkpKSkpKQorc3Rh dGljIGNvbnN0IHN0cnVjdCB0eHNjaGVkdWxlIHNlcmllc19xdWFydGVyW10gPSB7CisJeyAzLFEo IDEuNSksMyxRKDEuNSksIDAsUSgxLjUpLCAwLFEoMS41KSB9LAkvKiAxLjVNYi9zICovCisJeyA0 LFEoMi4yNSksMyxRKDEuNSksIDQsUSgxLjUpLCAwLFEoMS41KSB9LAkvKjIuMjVNYi9zICovCisJ eyA0LFEoICAgMyksMyxRKDEuNSksIDQsUSgxLjUpLCAwLFEoMS41KSB9LAkvKiAgIDNNYi9zICov CisJeyA0LFEoIDQuNSksMyxRKCAgMyksIDQsUSgxLjUpLCAyLFEoMS41KSB9LAkvKiA0LjVNYi9z ICovCisJeyA0LFEoICAgNiksMyxRKDQuNSksIDQsUSggIDMpLCAyLFEoMS41KSB9LAkvKiAgIDZN Yi9zICovCisJeyA0LFEoICAgOSksMyxRKCAgNiksIDQsUSg0LjUpLCAyLFEoMS41KSB9LAkvKiAg IDlNYi9zICovCisJeyA0LFEoICAxMiksMyxRKCAgOSksIDQsUSggIDYpLCAyLFEoICAzKSB9LAkv KiAgMTJNYi9zICovCisJeyA0LFEoMTMuNSksMyxRKCAxMiksIDQsUSggIDkpLCAyLFEoICA2KSB9 CS8qMTMuNU1iL3MgKi8KK307CisjdW5kZWYgUQorCisjZW5kaWYgLyogX05FVDgwMjExX0lFRUU4 MDIxMV9SQVRFQ1RMX1NBTVBMRV9UWFNDSEVEVUxFU19IXyAqLwpJbmRleDogbmV0ODAyMTEvaWVl ZTgwMjExX3Jzc2FkYXB0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbmV0ODAyMTEvaWVlZTgwMjExX3Jzc2Fk YXB0LmgJKHJldmlzaW9uIDI1NDgyNikKKysrIG5ldDgwMjExL2llZWU4MDIxMV9yc3NhZGFwdC5o CSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw4IEBACiAjaWZuZGVmIF9ORVQ4MDIxMV9JRUVF ODAyMTFfUlNTQURBUFRfSF8KICNkZWZpbmUgX05FVDgwMjExX0lFRUU4MDIxMV9SU1NBREFQVF9I XwogCisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4KKwogLyogRGF0YS1y YXRlIGFkYXB0YXRpb24gbG9vc2VseSBiYXNlZCBvbiAiTGluayBBZGFwdGF0aW9uIFN0cmF0ZWd5 CiAgKiBmb3IgSUVFRSA4MDIuMTEgV0xBTiB2aWEgUmVjZWl2ZWQgU2lnbmFsIFN0cmVuZ3RoIE1l YXN1cmVtZW50IgogICogYnkgSmF2aWVyIGRlbCBQcmFkbyBQYXZvbiBhbmQgU3VuZ2h5dW4gQ2hv aS4KQEAgLTQzLDYgKzQ1LDcgQEAKICNkZWZpbmUJSUVFRTgwMjExX1JTU0FEQVBUX0JLVFBPV0VS CTMJLyogMioqX0JLVFBPV0VSICovCiAKIHN0cnVjdCBpZWVlODAyMTFfcnNzYWRhcHQgeworCXN0 cnVjdCBpZWVlODAyMTFfcmNfc3RhdCByc3NhZGFwdF9zdGF0OwogCWNvbnN0IHN0cnVjdCBpZWVl ODAyMTF2YXAgKnZhcDsKIAlpbnQJaW50ZXJ2YWw7CQkJLyogdXBkYXRlIGludGVydmFsICh0aWNr cykgKi8KIH07CkluZGV4OiBuZXQ4MDIxMS9pZWVlODAyMTFfYW1yci5oCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t IG5ldDgwMjExL2llZWU4MDIxMV9hbXJyLmgJKHJldmlzaW9uIDI1NDgyNikKKysrIG5ldDgwMjEx L2llZWU4MDIxMV9hbXJyLmgJKHdvcmtpbmcgY29weSkKQEAgLTIwLDYgKzIwLDcgQEAKICNpZm5k ZWYgX05FVDgwMjExX0lFRUU4MDIxMV9BTVJSX0hfCiAjZGVmaW5lIF9ORVQ4MDIxMV9JRUVFODAy MTFfQU1SUl9IXwogCisjaW5jbHVkZSA8bmV0ODAyMTEvaWVlZTgwMjExX3JhdGVjdGwuaD4KIC8q LQogICogTmFpdmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFkYXB0aXZlIE11bHRpIFJhdGUgUmV0 cnkgYWxnb3JpdGhtOgogICoKQEAgLTM1LDYgKzM2LDcgQEAKIHN0cnVjdCBpZWVlODAyMTF2YXA7 CiAKIHN0cnVjdCBpZWVlODAyMTFfYW1yciB7CisJc3RydWN0IGllZWU4MDIxMV9yY19zdGF0IGFt cnJfc3RhdDsKIAl1X2ludAlhbXJyX21pbl9zdWNjZXNzX3RocmVzaG9sZDsKIAl1X2ludAlhbXJy X21heF9zdWNjZXNzX3RocmVzaG9sZDsKIAlpbnQJYW1ycl9pbnRlcnZhbDsJCS8qIHVwZGF0ZSBp bnRlcnZhbCAodGlja3MpICovCg== --20cf307cfec04094f304e64fe611--