From mboxrd@z Thu Jan 1 00:00:00 1970 From: Archit Taneja Subject: Re: [PATCH 3/4] drm/msm: Initial add DSI connector support Date: Wed, 18 Mar 2015 13:26:12 +0530 Message-ID: <55092F9C.3050004@codeaurora.org> References: <1426289058-6663-1-git-send-email-hali@codeaurora.org> <1426289058-6663-4-git-send-email-hali@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1426289058-6663-4-git-send-email-hali@codeaurora.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Hai Li Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org List-Id: linux-arm-msm@vger.kernel.org SGksCgpPbiAwMy8xNC8yMDE1IDA0OjU0IEFNLCBIYWkgTGkgd3JvdGU6Cj4gVGhpcyBjaGFuZ2Ug YWRkcyB0aGUgRFNJIGNvbm5lY3RvciBzdXBwb3J0IGluIG1zbSBkcm0gZHJpdmVyLgo+Cj4gU2ln bmVkLW9mZi1ieTogSGFpIExpIDxoYWxpQGNvZGVhdXJvcmEub3JnPgo+IC0tLQo+ICAgZHJpdmVy cy9ncHUvZHJtL21zbS9LY29uZmlnICAgICAgICAgICB8ICAgMTEgKwo+ICAgZHJpdmVycy9ncHUv ZHJtL21zbS9NYWtlZmlsZSAgICAgICAgICB8ICAgIDQgKwo+ICAgZHJpdmVycy9ncHUvZHJtL21z bS9kc2kvZHNpLmMgICAgICAgICB8ICAyMDMgKysrKwo+ICAgZHJpdmVycy9ncHUvZHJtL21zbS9k c2kvZHNpLmggICAgICAgICB8ICAxMTUgKysKPiAgIGRyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2Rz aV9ob3N0LmMgICAgfCAxOTk3ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ICAg ZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpX21hbmFnZXIuYyB8ICA3MDYgKysrKysrKysrKysr Cj4gICBkcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2lfcGh5LmMgICAgIHwgIDM1MiArKysrKysK PiAgIGRyaXZlcnMvZ3B1L2RybS9tc20vbXNtX2Rydi5oICAgICAgICAgfCAgIDIwICsKPiAgIDgg ZmlsZXMgY2hhbmdlZCwgMzQwOCBpbnNlcnRpb25zKCspCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpLmMKPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2 ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2kuaAo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv Z3B1L2RybS9tc20vZHNpL2RzaV9ob3N0LmMKPiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2dwdS9kcm0vbXNtL2RzaS9kc2lfbWFuYWdlci5jCj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy9ncHUvZHJtL21zbS9kc2kvZHNpX3BoeS5jCj4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL21zbS9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL21zbS9LY29uZmlnCj4gaW5kZXgg MWU2YTkwNy4uNWJhNTYzMSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL0tjb25m aWcKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL0tjb25maWcKPiBAQCAtMzUsMyArMzUsMTQg QEAgY29uZmlnIERSTV9NU01fUkVHSVNURVJfTE9HR0lORwo+ICAgCSAgQ29tcGlsZSBpbiBzdXBw b3J0IGZvciBsb2dnaW5nIHJlZ2lzdGVyIHJlYWRzL3dyaXRlcyBpbiBhIGZvcm1hdAo+ICAgCSAg dGhhdCBjYW4gYmUgcGFyc2VkIGJ5IGVudnl0b29scyBkZW1zbSB0b29sLiAgSWYgZW5hYmxlZCwg cmVnaXN0ZXIKPiAgIAkgIGxvZ2dpbmcgY2FuIGJlIHN3aXRjaGVkIG9uIHZpYSBtc20ucmVnbG9n PXkgbW9kdWxlIHBhcmFtLgo+ICsKPiArY29uZmlnIERSTV9NU01fRFNJCj4gKwlib29sICJFbmFi bGUgRFNJIHN1cHBvcnQgaW4gTVNNIERSTSBkcml2ZXIiCj4gKwlkZXBlbmRzIG9uIERSTV9NU00K PiArCXNlbGVjdCBEUk1fUEFORUwKPiArCXNlbGVjdCBEUk1fTUlQSV9EU0kKPiArCWRlZmF1bHQg eQo+ICsJaGVscAo+ICsJICBDaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBuZWVkIGZv ciBNSVBJIERTSSBjb25uZWN0b3IKPiArCSAgc3VwcG9ydC4KPiArCj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZ3B1L2RybS9tc20vTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL01ha2VmaWxl Cj4gaW5kZXggNjc0YTEzMi4uNWMxNDRjYyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v bXNtL01ha2VmaWxlCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9NYWtlZmlsZQo+IEBAIC01 MCw1ICs1MCw5IEBAIG1zbS15IDo9IFwKPgo+ICAgbXNtLSQoQ09ORklHX0RSTV9NU01fRkJERVYp ICs9IG1zbV9mYmRldi5vCj4gICBtc20tJChDT05GSUdfQ09NTU9OX0NMSykgKz0gbWRwL21kcDQv bWRwNF9sdmRzX3BsbC5vCj4gK21zbS0kKENPTkZJR19EUk1fTVNNX0RTSSkgKz0gZHNpL2RzaS5v IFwKPiArCQkJZHNpL2RzaV9ob3N0Lm8gXAo+ICsJCQlkc2kvZHNpX21hbmFnZXIubyBcCj4gKwkJ CWRzaS9kc2lfcGh5Lm8KPgo+ICAgb2JqLSQoQ09ORklHX0RSTV9NU00pCSs9IG1zbS5vCj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2RzaS5jIGIvZHJpdmVycy9ncHUvZHJt L21zbS9kc2kvZHNpLmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLmRl NzcyNjAKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNp LmMKPiBAQCAtMCwwICsxLDIwMyBAQAo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRo ZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+ICsgKgo+ICsgKiBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQo+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKPiArICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVk IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3Jh bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo+ICsg KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy YW50eSBvZgo+ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UuICBTZWUgdGhlCj4gKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt b3JlIGRldGFpbHMuCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgImRzaS5oIgo+ICsKPiAraW50IG1z bV9kc2lfbW9kZXNldF9pbml0KHN0cnVjdCBtc21fZHJtX3N1Yl9kZXYgKmJhc2UsIHN0cnVjdCBk cm1fZGV2aWNlICpkZXYpCj4gK3sKPiArCXN0cnVjdCBtc21fZHNpICptc21fZHNpID0gY29udGFp bmVyX29mKGJhc2UsIHN0cnVjdCBtc21fZHNpLCBiYXNlKTsKPiArCXN0cnVjdCBtc21fZHJtX3By aXZhdGUgKnByaXYgPSBkZXYtPmRldl9wcml2YXRlOwo+ICsJaW50IHJldCwgaTsKPiArCj4gKwlp ZiAoV0FSTl9PTigoYmFzZS0+bnVtX2VuY29kZXJzICE9IE1TTV9EU0lfRU5DT0RFUl9OVU0pIHx8 Cj4gKwkJIWJhc2UtPmVuY29kZXJzW01TTV9EU0lfVklERU9fRU5DT0RFUl9JRF0gfHwKPiArCQkh YmFzZS0+ZW5jb2RlcnNbTVNNX0RTSV9DTURfRU5DT0RFUl9JRF0pKQo+ICsJCXJldHVybiAtRUlO VkFMOwo+ICsKPiArCW1zbV9kc2ktPmRldiA9IGRldjsKPiArCj4gKwlyZXQgPSBtc21fZHNpX2hv c3RfbW9kZXNldF9pbml0KG1zbV9kc2ktPmhvc3QsIGRldik7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJ ZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBtb2Rlc2V0IGluaXQgaG9zdDogJWRcbiIsIHJl dCk7Cj4gKwkJZ290byBmYWlsOwo+ICsJfQo+ICsKPiArCW1zbV9kc2ktPmJyaWRnZSA9IG1zbV9k c2lfbWFuYWdlcl9icmlkZ2VfaW5pdChtc21fZHNpLT5pZCk7Cj4gKwlpZiAoSVNfRVJSKG1zbV9k c2ktPmJyaWRnZSkpIHsKPiArCQlyZXQgPSBQVFJfRVJSKG1zbV9kc2ktPmJyaWRnZSk7Cj4gKwkJ ZGV2X2VycihkZXYtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgZHNpIGJyaWRnZTogJWRcbiIsIHJl dCk7Cj4gKwkJbXNtX2RzaS0+YnJpZGdlID0gTlVMTDsKPiArCQlnb3RvIGZhaWw7Cj4gKwl9Cj4g Kwo+ICsJbXNtX2RzaS0+Y29ubmVjdG9yID0gbXNtX2RzaV9tYW5hZ2VyX2Nvbm5lY3Rvcl9pbml0 KG1zbV9kc2ktPmlkKTsKPiArCWlmIChJU19FUlIobXNtX2RzaS0+Y29ubmVjdG9yKSkgewo+ICsJ CXJldCA9IFBUUl9FUlIobXNtX2RzaS0+Y29ubmVjdG9yKTsKPiArCQlkZXZfZXJyKGRldi0+ZGV2 LCAiZmFpbGVkIHRvIGNyZWF0ZSBkc2kgY29ubmVjdG9yOiAlZFxuIiwgcmV0KTsKPiArCQltc21f ZHNpLT5jb25uZWN0b3IgPSBOVUxMOwo+ICsJCWdvdG8gZmFpbDsKPiArCX0KPiArCj4gKwlmb3Ig KGkgPSAwOyBpIDwgYmFzZS0+bnVtX2VuY29kZXJzOyBpKyspCj4gKwkJYmFzZS0+ZW5jb2RlcnNb aV0tPmJyaWRnZSA9IG1zbV9kc2ktPmJyaWRnZTsKPiArCj4gKwlwcml2LT5icmlkZ2VzW3ByaXYt Pm51bV9icmlkZ2VzKytdICAgICAgID0gbXNtX2RzaS0+YnJpZGdlOwo+ICsJcHJpdi0+Y29ubmVj dG9yc1twcml2LT5udW1fY29ubmVjdG9ycysrXSA9IG1zbV9kc2ktPmNvbm5lY3RvcjsKPiArCj4g KwlyZXR1cm4gMDsKPiArZmFpbDoKPiArCWlmIChtc21fZHNpKSB7Cj4gKwkJLyogYnJpZGdlL2Nv bm5lY3RvciBhcmUgbm9ybWFsbHkgZGVzdHJveWVkIGJ5IGRybTogKi8KPiArCQlpZiAobXNtX2Rz aS0+YnJpZGdlKSB7Cj4gKwkJCW1zbV9kc2lfbWFuYWdlcl9icmlkZ2VfZGVzdHJveShtc21fZHNp LT5icmlkZ2UpOwo+ICsJCQltc21fZHNpLT5icmlkZ2UgPSBOVUxMOwo+ICsJCX0KPiArCQlpZiAo bXNtX2RzaS0+Y29ubmVjdG9yKSB7Cj4gKwkJCW1zbV9kc2ktPmNvbm5lY3Rvci0+ZnVuY3MtPmRl c3Ryb3kobXNtX2RzaS0+Y29ubmVjdG9yKTsKPiArCQkJbXNtX2RzaS0+Y29ubmVjdG9yID0gTlVM TDsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIHZv aWQgZHNpX2Rlc3Ryb3koc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kpCj4gK3sKPiArCWlmICghbXNt X2RzaSkKPiArCQlyZXR1cm47Cj4gKwo+ICsJbXNtX2RzaV9tYW5hZ2VyX3VucmVnaXN0ZXIobXNt X2RzaSk7Cj4gKwlpZiAobXNtX2RzaS0+aG9zdCkgewo+ICsJCW1zbV9kc2lfaG9zdF9kZXN0cm95 KG1zbV9kc2ktPmhvc3QpOwo+ICsJCW1zbV9kc2ktPmhvc3QgPSBOVUxMOwo+ICsJfQo+ICsKPiAr CXBsYXRmb3JtX3NldF9kcnZkYXRhKG1zbV9kc2ktPnBkZXYsIE5VTEwpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgc3RydWN0IG1zbV9kc2kgKmRzaV9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYpCj4gK3sKPiArCXN0cnVjdCBtc21fZHNpICptc21fZHNpID0gTlVMTDsKPiArCWludCByZXQ7 Cj4gKwo+ICsJaWYgKCFwZGV2KSB7Cj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gZHNpIGRl dmljZVxuIik7Cj4gKwkJcmV0ID0gLUVOWElPOwo+ICsJCWdvdG8gZmFpbDsKPiArCX0KPiArCj4g Kwltc21fZHNpID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbXNtX2RzaSksIEdG UF9LRVJORUwpOwo+ICsJaWYgKCFtc21fZHNpKSB7Cj4gKwkJcmV0ID0gLUVOT01FTTsKPiArCQln b3RvIGZhaWw7Cj4gKwl9Cj4gKwlEQkcoImRzaSBwcm9iZWQ9JXAiLCBtc21fZHNpKTsKPiArCj4g Kwltc21fZHNpLT5wZGV2ID0gcGRldjsKPiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1z bV9kc2kpOwo+ICsKPiArCS8qIEluaXQgZHNpIGhvc3QgKi8KPiArCXJldCA9IG1zbV9kc2lfaG9z dF9pbml0KG1zbV9kc2kpOwo+ICsJaWYgKHJldCkKPiArCQlnb3RvIGZhaWw7Cj4gKwo+ICsJLyog UmVnaXN0ZXIgdG8gZHNpIG1hbmFnZXIgKi8KPiArCXJldCA9IG1zbV9kc2lfbWFuYWdlcl9yZWdp c3Rlcihtc21fZHNpKTsKPiArCWlmIChyZXQpCj4gKwkJZ290byBmYWlsOwo+ICsKPiArCW1zbV9k c2ktPmJhc2UubW9kZXNldF9pbml0ID0gbXNtX2RzaV9tb2Rlc2V0X2luaXQ7Cj4gKwo+ICsJcmV0 dXJuIG1zbV9kc2k7Cj4gKwo+ICtmYWlsOgo+ICsJaWYgKG1zbV9kc2kpCj4gKwkJZHNpX2Rlc3Ry b3kobXNtX2RzaSk7Cj4gKwo+ICsJcmV0dXJuIEVSUl9QVFIocmV0KTsKPiArfQo+ICsKPiArc3Rh dGljIGludCBkc2lfYmluZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3Rl ciwgdm9pZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRldl9nZXRf ZHJ2ZGF0YShtYXN0ZXIpOwo+ICsJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJpdiA9IGRybS0+ ZGV2X3ByaXZhdGU7Cj4gKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZv cm1fZGV2aWNlKGRldik7Cj4gKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaTsKPiArCj4gKwlEQkco IiIpOwo+ICsJbXNtX2RzaSA9IGRzaV9pbml0KHBkZXYpOwo+ICsJaWYgKElTX0VSUihtc21fZHNp KSkKPiArCQlyZXR1cm4gUFRSX0VSUihtc21fZHNpKTsKPiArCj4gKwlwcml2LT5kc2lbbXNtX2Rz aS0+aWRdID0gJm1zbV9kc2ktPmJhc2U7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIGRzaV91bmJpbmQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlICpt YXN0ZXIsCj4gKwkJdm9pZCAqZGF0YSkKPiArewo+ICsJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9 IGRldl9nZXRfZHJ2ZGF0YShtYXN0ZXIpOwo+ICsJc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSAqcHJp diA9IGRybS0+ZGV2X3ByaXZhdGU7Cj4gKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSA9IGRldl9n ZXRfZHJ2ZGF0YShkZXYpOwo+ICsJaW50IGlkID0gbXNtX2RzaS0+aWQ7Cj4gKwo+ICsJaWYgKHBy aXYtPmRzaVtpZF0pIHsKPiArCQlkc2lfZGVzdHJveShtc21fZHNpKTsKPiArCQlwcml2LT5kc2lb aWRdID0gTlVMTDsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjb21wb25l bnRfb3BzIGRzaV9vcHMgPSB7Cj4gKwkuYmluZCAgID0gZHNpX2JpbmQsCj4gKwkudW5iaW5kID0g ZHNpX3VuYmluZCwKPiArfTsKPiArCj4gK3N0YXRpYyBpbnQgZHNpX2Rldl9wcm9iZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlyZXR1cm4gY29tcG9uZW50X2FkZCgmcGRl di0+ZGV2LCAmZHNpX29wcyk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHNpX2Rldl9yZW1vdmUo c3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJREJHKCIiKTsKPiArCWNvbXBv bmVudF9kZWwoJnBkZXYtPmRldiwgJmRzaV9vcHMpOwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4g K3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGR0X21hdGNoW10gPSB7Cj4gKwl7IC5j b21wYXRpYmxlID0gInFjb20sbWRzcy1kc2ktY3RybCIgfSwKPiArCXt9Cj4gK307Cj4gKwo+ICtz dGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkc2lfZHJpdmVyID0gewo+ICsJLnByb2JlID0g ZHNpX2Rldl9wcm9iZSwKPiArCS5yZW1vdmUgPSBkc2lfZGV2X3JlbW92ZSwKPiArCS5kcml2ZXIg PSB7Cj4gKwkJLm5hbWUgPSAibXNtX2RzaSIsCj4gKwkJLm9mX21hdGNoX3RhYmxlID0gZHRfbWF0 Y2gsCj4gKwl9LAo+ICt9Owo+ICsKPiArdm9pZCBfX2luaXQgbXNtX2RzaV9yZWdpc3Rlcih2b2lk KQo+ICt7Cj4gKwlEQkcoIiIpOwo+ICsJcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkc2lfZHJp dmVyKTsKPiArfQo+ICsKPiArdm9pZCBfX2V4aXQgbXNtX2RzaV91bnJlZ2lzdGVyKHZvaWQpCj4g K3sKPiArCURCRygiIik7Cj4gKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHNpX2RyaXZl cik7Cj4gK30KPiArCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2RzaS5o IGIvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpLmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ IGluZGV4IDAwMDAwMDAuLjFkMjQ0MDkKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9n cHUvZHJtL21zbS9kc2kvZHNpLmgKPiBAQCAtMCwwICsxLDExNSBAQAo+ICsvKgo+ICsgKiBDb3B5 cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVk Lgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp c3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKPiArICogb25seSB2ZXJz aW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCj4gKyAq Cj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp bGwgYmUgdXNlZnVsLAo+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCj4gKyAqIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4gKyAqLwo+ICsKPiArI2lmbmRlZiBfX0RT SV9DT05ORUNUT1JfSF9fCj4gKyNkZWZpbmUgX19EU0lfQ09OTkVDVE9SX0hfXwo+ICsKPiArI2lu Y2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ICsKPiArI2luY2x1ZGUgImRybV9jcnRj LmgiCj4gKyNpbmNsdWRlICJkcm1fbWlwaV9kc2kuaCIKPiArI2luY2x1ZGUgImRybV9wYW5lbC5o Igo+ICsKPiArI2luY2x1ZGUgIm1zbV9kcnYuaCIKPiArCj4gKyNkZWZpbmUgRFNJXzAJMAo+ICsj ZGVmaW5lIERTSV8xCTEKPiArI2RlZmluZSBEU0lfTUFYCTIKPiArCj4gKyNkZWZpbmUgRFNJX0NM T0NLX01BU1RFUglEU0lfMAo+ICsjZGVmaW5lIERTSV9DTE9DS19TTEFWRQkJRFNJXzEKPiArCj4g KyNkZWZpbmUgRFNJX0xFRlQJCURTSV8wCj4gKyNkZWZpbmUgRFNJX1JJR0hUCQlEU0lfMQo+ICsK PiArLyogQWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IGRybSBmcmFtZXdvcmsgc2VxdWVuY2UsIHRh a2UgdGhlIGVuY29kZXIgb2YKPiArICogRFNJXzEgYXMgbWFzdGVyIGVuY29kZXIKPiArICovCj4g KyNkZWZpbmUgRFNJX0VOQ09ERVJfTUFTVEVSCURTSV8xCj4gKyNkZWZpbmUgRFNJX0VOQ09ERVJf U0xBVkUJRFNJXzAKPiArCj4gK3N0cnVjdCBtc21fZHNpIHsKPiArCXN0cnVjdCBtc21fZHJtX3N1 Yl9kZXYgYmFzZTsKPiArCXN0cnVjdCBkcm1fZGV2aWNlICpkZXY7Cj4gKwlzdHJ1Y3QgcGxhdGZv cm1fZGV2aWNlICpwZGV2Owo+ICsKPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7 Cj4gKwlzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlOwo+ICsKPiArCXN0cnVjdCBtaXBpX2RzaV9o b3N0ICpob3N0Owo+ICsJc3RydWN0IG1zbV9kc2lfcGh5ICpwaHk7Cj4gKwlzdHJ1Y3QgZHJtX3Bh bmVsICpwYW5lbDsKPiArCXVuc2lnbmVkIGxvbmcgcGFuZWxfZmxhZ3M7Cj4gKwlib29sIHBoeV9l bmFibGVkOwo+ICsKPiArCS8qIHRoZSBlbmNvZGVyIHdlIGFyZSBob29rZWQgdG8gKG91dHNpZGUg b2YgZHNpIGJsb2NrKSAqLwo+ICsJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwo+ICsKPiAr CWludCBpZDsKPiArfTsKPiArCj4gKy8qIGRzaSBtYW5hZ2VyICovCj4gK3N0cnVjdCBkcm1fYnJp ZGdlICptc21fZHNpX21hbmFnZXJfYnJpZGdlX2luaXQodTggaWQpOwo+ICt2b2lkIG1zbV9kc2lf bWFuYWdlcl9icmlkZ2VfZGVzdHJveShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKTsKPiArc3Ry dWN0IGRybV9jb25uZWN0b3IgKm1zbV9kc2lfbWFuYWdlcl9jb25uZWN0b3JfaW5pdCh1OCBpZCk7 Cj4gK2ludCBtc21fZHNpX21hbmFnZXJfcGh5X2VuYWJsZShpbnQgaWQsCj4gKwkJY29uc3QgdW5z aWduZWQgbG9uZyBiaXRfcmF0ZSwgY29uc3QgdW5zaWduZWQgbG9uZyBlc2NfcmF0ZSwKPiArCQl1 MzIgKmNsa19wcmUsIHUzMiAqY2xrX3Bvc3QpOwo+ICt2b2lkIG1zbV9kc2lfbWFuYWdlcl9waHlf ZGlzYWJsZShpbnQgaWQpOwo+ICtpbnQgbXNtX2RzaV9tYW5hZ2VyX2NtZF94ZmVyKGludCBpZCwg Y29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKTsKPiArYm9vbCBtc21fZHNpX21hbmFnZXJf Y21kX3hmZXJfdHJpZ2dlcihpbnQgaWQsIHUzMiBpb3ZhLCB1MzIgbGVuKTsKPiAraW50IG1zbV9k c2lfbWFuYWdlcl9yZWdpc3RlcihzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSk7Cj4gK3ZvaWQgbXNt X2RzaV9tYW5hZ2VyX3VucmVnaXN0ZXIoc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kpOwo+ICsKPiAr LyogZHNpIGhvc3QgKi8KPiAraW50IG1zbV9kc2lfaG9zdF94ZmVyX3ByZXBhcmUoc3RydWN0IG1p cGlfZHNpX2hvc3QgKmhvc3QsCj4gKwkJCQkJY29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNn KTsKPiArdm9pZCBtc21fZHNpX2hvc3RfeGZlcl9yZXN0b3JlKHN0cnVjdCBtaXBpX2RzaV9ob3N0 ICpob3N0LAo+ICsJCQkJCWNvbnN0IHN0cnVjdCBtaXBpX2RzaV9tc2cgKm1zZyk7Cj4gK2ludCBt c21fZHNpX2hvc3RfY21kX3R4KHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAo+ICsJCQkJCWNv bnN0IHN0cnVjdCBtaXBpX2RzaV9tc2cgKm1zZyk7Cj4gK2ludCBtc21fZHNpX2hvc3RfY21kX3J4 KHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAo+ICsJCQkJCWNvbnN0IHN0cnVjdCBtaXBpX2Rz aV9tc2cgKm1zZyk7Cj4gK3ZvaWQgbXNtX2RzaV9ob3N0X2NtZF94ZmVyX2NvbW1pdChzdHJ1Y3Qg bWlwaV9kc2lfaG9zdCAqaG9zdCwKPiArCQkJCQl1MzIgaW92YSwgdTMyIGxlbik7Cj4gK2ludCBt c21fZHNpX2hvc3RfZW5hYmxlKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0KTsKPiAraW50IG1z bV9kc2lfaG9zdF9kaXNhYmxlKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0KTsKPiAraW50IG1z bV9kc2lfaG9zdF9wb3dlcl9vbihzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCk7Cj4gK2ludCBt c21fZHNpX2hvc3RfcG93ZXJfb2ZmKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0KTsKPiAraW50 IG1zbV9kc2lfaG9zdF9zZXRfZGlzcGxheV9tb2RlKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0 LAo+ICsJCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKTsKPiArc3RydWN0IGRybV9w YW5lbCAqbXNtX2RzaV9ob3N0X2dldF9wYW5lbChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCwK PiArCQkJCQl1bnNpZ25lZCBsb25nICpwYW5lbF9mbGFncyk7Cj4gK2ludCBtc21fZHNpX2hvc3Rf cmVnaXN0ZXIoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsIGJvb2wgY2hlY2tfZGVmZXIpOwo+ ICt2b2lkIG1zbV9kc2lfaG9zdF91bnJlZ2lzdGVyKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0 KTsKPiArdm9pZCBtc21fZHNpX2hvc3RfZGVzdHJveShzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9z dCk7Cj4gK2ludCBtc21fZHNpX2hvc3RfbW9kZXNldF9pbml0KHN0cnVjdCBtaXBpX2RzaV9ob3N0 ICpob3N0LAo+ICsJCQkJCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwo+ICtpbnQgbXNtX2RzaV9o b3N0X2luaXQoc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kpOwo+ICsKPiArLyogZHNpIHBoeSAqLwo+ ICtzdHJ1Y3QgbXNtX2RzaV9waHk7Cj4gK2VudW0gbXNtX2RzaV9waHlfdHlwZSB7Cj4gKwlNU01f RFNJX1BIWV9VTktOT1dOLAo+ICsJTVNNX0RTSV9QSFlfMjhOTSwKPiArCU1TTV9EU0lfUEhZX01B WAo+ICt9Owo+ICtzdHJ1Y3QgbXNtX2RzaV9waHkgKm1zbV9kc2lfcGh5X2luaXQoc3RydWN0IHBs YXRmb3JtX2RldmljZSAqcGRldiwKPiArCQkJZW51bSBtc21fZHNpX3BoeV90eXBlIHR5cGUsIGlu dCBpZCk7Cj4gK2ludCBtc21fZHNpX3BoeV9lbmFibGUoc3RydWN0IG1zbV9kc2lfcGh5ICpwaHks IGJvb2wgaXNfZHVhbF9wYW5lbCwKPiArCWNvbnN0IHVuc2lnbmVkIGxvbmcgYml0X3JhdGUsIGNv bnN0IHVuc2lnbmVkIGxvbmcgZXNjX3JhdGUpOwo+ICtpbnQgbXNtX2RzaV9waHlfZGlzYWJsZShz dHJ1Y3QgbXNtX2RzaV9waHkgKnBoeSk7Cj4gK3ZvaWQgbXNtX2RzaV9waHlfZ2V0X2Nsa19wcmVf cG9zdChzdHJ1Y3QgbXNtX2RzaV9waHkgKnBoeSwKPiArCQkJCQl1MzIgKmNsa19wcmUsIHUzMiAq Y2xrX3Bvc3QpOwo+ICsjZW5kaWYgLyogX19EU0lfQ09OTkVDVE9SX0hfXyAqLwo+ICsKPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL21zbS9kc2kvZHNpX2hvc3QuYyBiL2RyaXZlcnMvZ3B1 L2RybS9tc20vZHNpL2RzaV9ob3N0LmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAw MDAwMDAuLjhkYjExZWIKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL21z bS9kc2kvZHNpX2hvc3QuYwo+IEBAIC0wLDAgKzEsMTk5NyBAQAo+ICsvKgo+ICsgKiBDb3B5cmln aHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgo+ ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKPiArICogb25seSB2ZXJzaW9u IDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCj4gKyAqCj4g KyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLAo+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+ICsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCj4gKyAqIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgPGxpbnV4 L2Nsay5oPgo+ICsjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2Vy ci5oPgo+ICsjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgo+ICsjaW5jbHVkZSA8bGludXgvaW50ZXJy dXB0Lmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KPiArI2luY2x1ZGUgPGxpbnV4 L29mX2dwaW8uaD4KPiArI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgo+ICsjaW5jbHVkZSA8bGlu dXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgo+ ICsjaW5jbHVkZSA8dmlkZW8vbWlwaV9kaXNwbGF5Lmg+Cj4gKwo+ICsjaW5jbHVkZSAiZHNpLmgi Cj4gKyNpbmNsdWRlICJkc2kueG1sLmgiCj4gKwo+ICsjZGVmaW5lIE1TTV9EU0lfVkVSX01BSk9S X1YyCTB4MDIKPiArI2RlZmluZSBNU01fRFNJX1ZFUl9NQUpPUl82RwkweDAzCj4gKyNkZWZpbmUg TVNNX0RTSV82R19WRVJfTUlOT1JfVjFfMAkweDEwMDAwMDAwCj4gKyNkZWZpbmUgTVNNX0RTSV82 R19WRVJfTUlOT1JfVjFfMQkweDEwMDEwMDAwCj4gKyNkZWZpbmUgTVNNX0RTSV82R19WRVJfTUlO T1JfVjFfMV8xCTB4MTAwMTAwMDEKPiArI2RlZmluZSBNU01fRFNJXzZHX1ZFUl9NSU5PUl9WMV8y CTB4MTAwMjAwMDAKPiArI2RlZmluZSBNU01fRFNJXzZHX1ZFUl9NSU5PUl9WMV8zXzEJMHgxMDAz MDAwMQo+ICsKPiArI2RlZmluZSBEU0lfNkdfUkVHX1NISUZUCTQKPiArCj4gKyNkZWZpbmUgRFNJ X1JFR1VMQVRPUl9NQVgJOAo+ICtzdHJ1Y3QgZHNpX3JlZ19lbnRyeSB7Cj4gKwljaGFyIG5hbWVb MzJdOwo+ICsJaW50IG1pbl92b2x0YWdlOwo+ICsJaW50IG1heF92b2x0YWdlOwo+ICsJaW50IGVu YWJsZV9sb2FkOwo+ICsJaW50IGRpc2FibGVfbG9hZDsKPiArfTsKPiArCj4gK3N0cnVjdCBkc2lf cmVnX2NvbmZpZyB7Cj4gKwlpbnQgbnVtOwo+ICsJc3RydWN0IGRzaV9yZWdfZW50cnkgcmVnc1tE U0lfUkVHVUxBVE9SX01BWF07Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgZHNpX2NvbmZpZyB7Cj4gKwl1 MzIgbWFqb3I7Cj4gKwl1MzIgbWlub3I7Cj4gKwl1MzIgaW9fb2Zmc2V0Owo+ICsJZW51bSBtc21f ZHNpX3BoeV90eXBlIHBoeV90eXBlOwo+ICsJc3RydWN0IGRzaV9yZWdfY29uZmlnIHJlZ19jZmc7 Cj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRzaV9jb25maWcgZHNpX2NmZ3NbXSA9 IHsKPiArCXtNU01fRFNJX1ZFUl9NQUpPUl9WMiwgMCwgMCwgTVNNX0RTSV9QSFlfVU5LTk9XTn0s Cj4gKwl7IC8qIDg5NzQgdjEgKi8KPiArCQkubWFqb3IgPSBNU01fRFNJX1ZFUl9NQUpPUl82RywK PiArCQkubWlub3IgPSBNU01fRFNJXzZHX1ZFUl9NSU5PUl9WMV8wLAo+ICsJCS5pb19vZmZzZXQg PSBEU0lfNkdfUkVHX1NISUZULAo+ICsJCS5waHlfdHlwZSA9IE1TTV9EU0lfUEhZXzI4Tk0sCj4g KwkJLnJlZ19jZmcgPSB7Cj4gKwkJCS5udW0gPSA0LAo+ICsJCQkucmVncyA9IHsKPiArCQkJCXsi Z2RzYyIsIC0xLCAtMSwgLTEsIC0xfSwKPiArCQkJCXsidmRkIiwgMzAwMDAwMCwgMzAwMDAwMCwg MTUwMDAwLCAxMDB9LAo+ICsJCQkJeyJ2ZGRhIiwgMTIwMDAwMCwgMTIwMDAwMCwgMTAwMDAwLCAx MDB9LAo+ICsJCQkJeyJ2ZGRpbyIsIDE4MDAwMDAsIDE4MDAwMDAsIDEwMDAwMCwgMTAwfSwKPiAr CQkJfSwKPiArCQl9LAo+ICsJfSwKPiArCXsgLyogODk3NCB2MiAqLwo+ICsJCS5tYWpvciA9IE1T TV9EU0lfVkVSX01BSk9SXzZHLAo+ICsJCS5taW5vciA9IE1TTV9EU0lfNkdfVkVSX01JTk9SX1Yx XzEsCj4gKwkJLmlvX29mZnNldCA9IERTSV82R19SRUdfU0hJRlQsCj4gKwkJLnBoeV90eXBlID0g TVNNX0RTSV9QSFlfMjhOTSwKPiArCQkucmVnX2NmZyA9IHsKPiArCQkJLm51bSA9IDQsCj4gKwkJ CS5yZWdzID0gewo+ICsJCQkJeyJnZHNjIiwgLTEsIC0xLCAtMSwgLTF9LAo+ICsJCQkJeyJ2ZGQi LCAzMDAwMDAwLCAzMDAwMDAwLCAxNTAwMDAsIDEwMH0sCj4gKwkJCQl7InZkZGEiLCAxMjAwMDAw LCAxMjAwMDAwLCAxMDAwMDAsIDEwMH0sCj4gKwkJCQl7InZkZGlvIiwgMTgwMDAwMCwgMTgwMDAw MCwgMTAwMDAwLCAxMDB9LAo+ICsJCQl9LAo+ICsJCX0sCj4gKwl9LAo+ICsJeyAvKiA4OTc0IHYz ICovCj4gKwkJLm1ham9yID0gTVNNX0RTSV9WRVJfTUFKT1JfNkcsCj4gKwkJLm1pbm9yID0gTVNN X0RTSV82R19WRVJfTUlOT1JfVjFfMV8xLAo+ICsJCS5pb19vZmZzZXQgPSBEU0lfNkdfUkVHX1NI SUZULAo+ICsJCS5waHlfdHlwZSA9IE1TTV9EU0lfUEhZXzI4Tk0sCj4gKwkJLnJlZ19jZmcgPSB7 Cj4gKwkJCS5udW0gPSA0LAo+ICsJCQkucmVncyA9IHsKPiArCQkJCXsiZ2RzYyIsIC0xLCAtMSwg LTEsIC0xfSwKPiArCQkJCXsidmRkIiwgMzAwMDAwMCwgMzAwMDAwMCwgMTUwMDAwLCAxMDB9LAo+ ICsJCQkJeyJ2ZGRhIiwgMTIwMDAwMCwgMTIwMDAwMCwgMTAwMDAwLCAxMDB9LAo+ICsJCQkJeyJ2 ZGRpbyIsIDE4MDAwMDAsIDE4MDAwMDAsIDEwMDAwMCwgMTAwfSwKPiArCQkJfSwKPiArCQl9LAo+ ICsJfSwKPiArCXsgLyogODA4NCAqLwo+ICsJCS5tYWpvciA9IE1TTV9EU0lfVkVSX01BSk9SXzZH LAo+ICsJCS5taW5vciA9IE1TTV9EU0lfNkdfVkVSX01JTk9SX1YxXzIsCj4gKwkJLmlvX29mZnNl dCA9IERTSV82R19SRUdfU0hJRlQsCj4gKwkJLnBoeV90eXBlID0gTVNNX0RTSV9QSFlfMjhOTSwK PiArCQkucmVnX2NmZyA9IHsKPiArCQkJLm51bSA9IDQsCj4gKwkJCS5yZWdzID0gewo+ICsJCQkJ eyJnZHNjIiwgLTEsIC0xLCAtMSwgLTF9LAo+ICsJCQkJeyJ2ZGQiLCAzMDAwMDAwLCAzMDAwMDAw LCAxNTAwMDAsIDEwMH0sCj4gKwkJCQl7InZkZGEiLCAxMjAwMDAwLCAxMjAwMDAwLCAxMDAwMDAs IDEwMH0sCj4gKwkJCQl7InZkZGlvIiwgMTgwMDAwMCwgMTgwMDAwMCwgMTAwMDAwLCAxMDB9LAo+ ICsJCQl9LAo+ICsJCX0sCj4gKwl9LAo+ICsJeyAvKiA4OTE2ICovCj4gKwkJLm1ham9yID0gTVNN X0RTSV9WRVJfTUFKT1JfNkcsCj4gKwkJLm1pbm9yID0gTVNNX0RTSV82R19WRVJfTUlOT1JfVjFf M18xLAo+ICsJCS5pb19vZmZzZXQgPSBEU0lfNkdfUkVHX1NISUZULAo+ICsJCS5waHlfdHlwZSA9 IE1TTV9EU0lfUEhZXzI4Tk0sCj4gKwkJLnJlZ19jZmcgPSB7Cj4gKwkJCS5udW0gPSA0LAo+ICsJ CQkucmVncyA9IHsKPiArCQkJCXsiZ2RzYyIsIC0xLCAtMSwgLTEsIC0xfSwKPiArCQkJCXsidmRk IiwgMjg1MDAwMCwgMjg1MDAwMCwgMTAwMDAwLCAxMDB9LAo+ICsJCQkJeyJ2ZGRhIiwgMTIwMDAw MCwgMTIwMDAwMCwgMTAwMDAwLCAxMDB9LAo+ICsJCQkJeyJ2ZGRpbyIsIDE4MDAwMDAsIDE4MDAw MDAsIDEwMDAwMCwgMTAwfSwKPiArCQkJfSwKPiArCQl9LAo+ICsJfSwKPiArfTsKPiArCj4gK3N0 YXRpYyBpbnQgZHNpX2dldF92ZXJzaW9uKGNvbnN0IHZvaWQgX19pb21lbSAqYmFzZSwgdTMyICpt YWpvciwgdTMyICptaW5vcikKPiArewo+ICsJdTMyIHZlcjsKPiArCXUzMiB2ZXJfNmc7Cj4gKwo+ ICsJaWYgKCFtYWpvciB8fCAhbWlub3IpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJLyog RnJvbSBEU0k2Ryh2MyksIGFkZGl0aW9uIG9mIGEgNkdfSFdfVkVSU0lPTiByZWdpc3RlciBhdCBv ZmZzZXQgMAo+ICsJICogbWFrZXMgYWxsIG90aGVyIHJlZ2lzdGVycyA0LWJ5dGUgc2hpZnRlZCBk b3duLgo+ICsJICovCj4gKwl2ZXJfNmcgPSBtc21fcmVhZGwoYmFzZSArIFJFR19EU0lfNkdfSFdf VkVSU0lPTik7Cj4gKwlpZiAodmVyXzZnID09IDApIHsKPiArCQl2ZXIgPSBtc21fcmVhZGwoYmFz ZSArIFJFR19EU0lfVkVSU0lPTik7Cj4gKwkJdmVyID0gRklFTEQodmVyLCBEU0lfVkVSU0lPTl9N QUpPUik7Cj4gKwkJaWYgKHZlciA8PSBNU01fRFNJX1ZFUl9NQUpPUl9WMikgewo+ICsJCQkvKiBv bGQgdmVyc2lvbnMgKi8KPiArCQkJKm1ham9yID0gdmVyOwo+ICsJCQkqbWlub3IgPSAwOwo+ICsJ CQlyZXR1cm4gMDsKPiArCQl9IGVsc2Ugewo+ICsJCQlyZXR1cm4gLUVJTlZBTDsKPiArCQl9Cj4g Kwl9IGVsc2Ugewo+ICsJCXZlciA9IG1zbV9yZWFkbChiYXNlICsgRFNJXzZHX1JFR19TSElGVCAr IFJFR19EU0lfVkVSU0lPTik7Cj4gKwkJdmVyID0gRklFTEQodmVyLCBEU0lfVkVSU0lPTl9NQUpP Uik7Cj4gKwkJaWYgKHZlciA9PSBNU01fRFNJX1ZFUl9NQUpPUl82Rykgewo+ICsJCQkvKiA2RyB2 ZXJzaW9uICovCj4gKwkJCSptYWpvciA9IHZlcjsKPiArCQkJKm1pbm9yID0gdmVyXzZnOwo+ICsJ CQlyZXR1cm4gMDsKPiArCQl9IGVsc2Ugewo+ICsJCQlyZXR1cm4gLUVJTlZBTDsKPiArCQl9Cj4g Kwl9Cj4gK30KPiArCj4gKyNkZWZpbmUgRFNJX0VSUl9TVEFURV9BQ0sJCQkweDAwMDAKPiArI2Rl ZmluZSBEU0lfRVJSX1NUQVRFX1RJTUVPVVQJCQkweDAwMDEKPiArI2RlZmluZSBEU0lfRVJSX1NU QVRFX0RMTjBfUEhZCQkJMHgwMDAyCj4gKyNkZWZpbmUgRFNJX0VSUl9TVEFURV9GSUZPCQkJMHgw MDA0Cj4gKyNkZWZpbmUgRFNJX0VSUl9TVEFURV9NRFBfRklGT19VTkRFUkZMT1cJMHgwMDA4Cj4g KyNkZWZpbmUgRFNJX0VSUl9TVEFURV9JTlRFUkxFQVZFX09QX0NPTlRFTlRJT04JMHgwMDEwCj4g KyNkZWZpbmUgRFNJX0VSUl9TVEFURV9QTExfVU5MT0NLRUQJCTB4MDAyMAo+ICsKPiArc3RydWN0 IG1zbV9kc2lfaG9zdCB7Cj4gKwlzdHJ1Y3QgbWlwaV9kc2lfaG9zdCBiYXNlOwo+ICsKPiArCXN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Cj4gKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2Owo+ ICsKPiArCWludCBpZDsKPiArCj4gKwl2b2lkIF9faW9tZW0gKmN0cmxfYmFzZTsKPiArCXN0cnVj dCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW0RTSV9SRUdVTEFUT1JfTUFYXTsKPiArCXN0 cnVjdCBjbGsgKm1kcF9jb3JlX2NsazsKPiArCXN0cnVjdCBjbGsgKmFoYl9jbGs7Cj4gKwlzdHJ1 Y3QgY2xrICpheGlfY2xrOwo+ICsJc3RydWN0IGNsayAqbW1zc19taXNjX2FoYl9jbGs7Cj4gKwlz dHJ1Y3QgY2xrICpieXRlX2NsazsKPiArCXN0cnVjdCBjbGsgKmVzY19jbGs7Cj4gKwlzdHJ1Y3Qg Y2xrICpwaXhlbF9jbGs7Cj4gKwl1MzIgYnl0ZV9jbGtfcmF0ZTsKPiArCj4gKwlzdHJ1Y3QgZ3Bp b19kZXNjICpkaXNwX2VuX2dwaW87Cj4gKwlzdHJ1Y3QgZ3Bpb19kZXNjICp0ZV9ncGlvOwo+ICsK PiArCWNvbnN0IHN0cnVjdCBkc2lfY29uZmlnICpjZmc7Cj4gKwo+ICsJc3RydWN0IGNvbXBsZXRp b24gZG1hX2NvbXA7Cj4gKwlzdHJ1Y3QgY29tcGxldGlvbiB2aWRlb19jb21wOwo+ICsJc3RydWN0 IG11dGV4IGRldl9tdXRleDsKPiArCXN0cnVjdCBtdXRleCBjbWRfbXV0ZXg7Cj4gKwlzdHJ1Y3Qg bXV0ZXggY2xrX211dGV4Owo+ICsJc3BpbmxvY2tfdCBpbnRyX2xvY2s7IC8qIFByb3RlY3QgaW50 ZXJydXB0IGN0cmwgcmVnaXN0ZXIgKi8KPiArCj4gKwl1MzIgZXJyX3dvcmtfc3RhdGU7Cj4gKwlz dHJ1Y3Qgd29ya19zdHJ1Y3QgZXJyX3dvcms7Cj4gKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAq d29ya3F1ZXVlOwo+ICsKPiArCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqdHhfZ2VtX29iajsKPiAr CXU4ICpyeF9idWY7Cj4gKwo+ICsJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGU7Cj4gKwo+ ICsJLyogUGFuZWwgaW5mbyAqLwo+ICsJc3RydWN0IGRldmljZV9ub2RlICpwYW5lbF9ub2RlOwo+ ICsJdW5zaWduZWQgaW50IGNoYW5uZWw7Cj4gKwl1bnNpZ25lZCBpbnQgbGFuZXM7Cj4gKwllbnVt IG1pcGlfZHNpX3BpeGVsX2Zvcm1hdCBmb3JtYXQ7Cj4gKwl1bnNpZ25lZCBsb25nIG1vZGVfZmxh Z3M7Cj4gKwo+ICsJdTMyIGRtYV9jbWRfY3RybF9yZXN0b3JlOwo+ICsKPiArCWJvb2wgcmVnaXN0 ZXJlZDsKPiArCWJvb2wgcG93ZXJfb247Cj4gKwlpbnQgaXJxOwo+ICt9Owo+ICsKPiArc3RhdGlj IHUzMiBkc2lfZ2V0X2JwcChjb25zdCBlbnVtIG1pcGlfZHNpX3BpeGVsX2Zvcm1hdCBmbXQpCj4g K3sKPiArCXN3aXRjaCAoZm10KSB7Cj4gKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I1NjU6CQlyZXR1 cm4gMTY7Cj4gKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I2NjZfUEFDS0VEOglyZXR1cm4gMTg7Cj4g KwljYXNlIE1JUElfRFNJX0ZNVF9SR0I2NjY6Cj4gKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I4ODg6 Cj4gKwlkZWZhdWx0OgkJCQlyZXR1cm4gMjQ7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxp bmUgdTMyIGRzaV9yZWFkKHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0LCB1MzIgcmVnKQo+ ICt7Cj4gKwlyZXR1cm4gbXNtX3JlYWRsKG1zbV9ob3N0LT5jdHJsX2Jhc2UgKyBtc21faG9zdC0+ Y2ZnLT5pb19vZmZzZXQgKyByZWcpOwo+ICt9Cj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBkc2lfd3Jp dGUoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QsIHUzMiByZWcsIHUzMiBkYXRhKQo+ICt7 Cj4gKwltc21fd3JpdGVsKGRhdGEsIG1zbV9ob3N0LT5jdHJsX2Jhc2UgKyBtc21faG9zdC0+Y2Zn LT5pb19vZmZzZXQgKyByZWcpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRzaV9ob3N0X3JlZ3Vs YXRvcl9lbmFibGUoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpOwo+ICtzdGF0aWMgdm9p ZCBkc2lfaG9zdF9yZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9z dCk7Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRzaV9jb25maWcgKmRzaV9nZXRfY29uZmln KHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0KQo+ICt7Cj4gKwljb25zdCBzdHJ1Y3QgZHNp X2NvbmZpZyAqY2ZnOwo+ICsJc3RydWN0IHJlZ3VsYXRvciAqZ2RzY19yZWc7Cj4gKwlpbnQgaSwg cmV0Owo+ICsJdTMyIG1ham9yLCBtaW5vcjsKPiArCj4gKwlnZHNjX3JlZyA9IHJlZ3VsYXRvcl9n ZXQoJm1zbV9ob3N0LT5wZGV2LT5kZXYsICJnZHNjIik7Cj4gKwlpZiAoSVNfRVJSX09SX05VTEwo Z2RzY19yZWcpKSB7Cj4gKwkJcHJfZXJyKCIlczogY2Fubm90IGdldCBnZHNjXG4iLCBfX2Z1bmNf Xyk7Cj4gKwkJZ290byBmYWlsOwo+ICsJfQo+ICsJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShnZHNj X3JlZyk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGVuYWJsZSBn ZHNjXG4iLCBfX2Z1bmNfXyk7Cj4gKwkJcmVndWxhdG9yX3B1dChnZHNjX3JlZyk7Cj4gKwkJZ290 byBmYWlsOwo+ICsJfQo+ICsJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG1zbV9ob3N0LT5haGJf Y2xrKTsKPiArCWlmIChyZXQpIHsKPiArCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZW5hYmxlIGFo Yl9jbGtcbiIsIF9fZnVuY19fKTsKPiArCQlyZWd1bGF0b3JfZGlzYWJsZShnZHNjX3JlZyk7Cj4g KwkJcmVndWxhdG9yX3B1dChnZHNjX3JlZyk7Cj4gKwkJZ290byBmYWlsOwo+ICsJfQo+ICsKPiAr CXJldCA9IGRzaV9nZXRfdmVyc2lvbihtc21faG9zdC0+Y3RybF9iYXNlLCAmbWFqb3IsICZtaW5v cik7Cj4gKwo+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1zbV9ob3N0LT5haGJfY2xrKTsKPiAr CXJlZ3VsYXRvcl9kaXNhYmxlKGdkc2NfcmVnKTsKPiArCXJlZ3VsYXRvcl9wdXQoZ2RzY19yZWcp Owo+ICsJaWYgKHJldCkgewo+ICsJCXByX2VycigiJXM6IEludmFsaWQgdmVyc2lvblxuIiwgX19m dW5jX18pOwo+ICsJCWdvdG8gZmFpbDsKPiArCX0KPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJS QVlfU0laRShkc2lfY2Zncyk7IGkrKykgewo+ICsJCWNmZyA9IGRzaV9jZmdzICsgaTsKPiArCQlp ZiAoKGNmZy0+bWFqb3IgPT0gbWFqb3IpICYmIChjZmctPm1pbm9yID09IG1pbm9yKSkKPiArCQkJ cmV0dXJuIGNmZzsKPiArCX0KPiArCXByX2VycigiJXM6IFZlcnNpb24gJXg6JXggbm90IHN1cHBv cnRcbiIsIF9fZnVuY19fLCBtYWpvciwgbWlub3IpOwo+ICsKPiArZmFpbDoKPiArCXJldHVybiBO VUxMOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBtc21fZHNpX2hvc3QgKnRvX21z bV9kc2lfaG9zdChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCkKPiArewo+ICsJcmV0dXJuIGNv bnRhaW5lcl9vZihob3N0LCBzdHJ1Y3QgbXNtX2RzaV9ob3N0LCBiYXNlKTsKPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgZHNpX2hvc3RfcmVndWxhdG9yX2Rpc2FibGUoc3RydWN0IG1zbV9kc2lfaG9z dCAqbXNtX2hvc3QpCj4gK3sKPiArCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpzID0gbXNt X2hvc3QtPnN1cHBsaWVzOwo+ICsJY29uc3Qgc3RydWN0IGRzaV9yZWdfZW50cnkgKnJlZ3MgPSBt c21faG9zdC0+Y2ZnLT5yZWdfY2ZnLnJlZ3M7Cj4gKwlpbnQgbnVtID0gbXNtX2hvc3QtPmNmZy0+ cmVnX2NmZy5udW07Cj4gKwlpbnQgaTsKPiArCj4gKwlEQkcoIiIpOwo+ICsJZm9yIChpID0gbnVt IC0gMTsgaSA+PSAwOyBpLS0pCj4gKwkJaWYgKHJlZ3NbaV0uZGlzYWJsZV9sb2FkID49IDApCj4g KwkJCXJlZ3VsYXRvcl9zZXRfb3B0aW11bV9tb2RlKHNbaV0uY29uc3VtZXIsCj4gKwkJCQkJCXJl Z3NbaV0uZGlzYWJsZV9sb2FkKTsKPiArCj4gKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKG51bSwg cyk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHNpX2hvc3RfcmVndWxhdG9yX2VuYWJsZShzdHJ1 Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKPiArewo+ICsJc3RydWN0IHJlZ3VsYXRvcl9idWxr X2RhdGEgKnMgPSBtc21faG9zdC0+c3VwcGxpZXM7Cj4gKwljb25zdCBzdHJ1Y3QgZHNpX3JlZ19l bnRyeSAqcmVncyA9IG1zbV9ob3N0LT5jZmctPnJlZ19jZmcucmVnczsKPiArCWludCBudW0gPSBt c21faG9zdC0+Y2ZnLT5yZWdfY2ZnLm51bTsKPiArCWludCByZXQsIGk7Cj4gKwo+ICsJREJHKCIi KTsKPiArCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewo+ICsJCWlmIChyZWdzW2ldLmVuYWJs ZV9sb2FkID49IDApIHsKPiArCQkJcmV0ID0gcmVndWxhdG9yX3NldF9vcHRpbXVtX21vZGUoc1tp XS5jb25zdW1lciwKPiArCQkJCQkJCXJlZ3NbaV0uZW5hYmxlX2xvYWQpOwo+ICsJCQlpZiAocmV0 IDwgMCkgewo+ICsJCQkJcHJfZXJyKCJyZWd1bGF0b3IgJWQgc2V0IG9wIG1vZGUgZmFpbGVkLCAl ZFxuIiwKPiArCQkJCQlpLCByZXQpOwo+ICsJCQkJZ290byBmYWlsOwo+ICsJCQl9Cj4gKwkJfQo+ ICsJfQo+ICsKPiArCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShudW0sIHMpOwo+ICsJaWYg KHJldCA8IDApIHsKPiArCQlwcl9lcnIoInJlZ3VsYXRvciBlbmFibGUgZmFpbGVkLCAlZFxuIiwg cmV0KTsKPiArCQlnb3RvIGZhaWw7Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gKwo+ICtmYWls Ogo+ICsJZm9yIChpLS07IGkgPj0gMDsgaS0tKQo+ICsJCXJlZ3VsYXRvcl9zZXRfb3B0aW11bV9t b2RlKHNbaV0uY29uc3VtZXIsIHJlZ3NbaV0uZGlzYWJsZV9sb2FkKTsKPiArCXJldHVybiByZXQ7 Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHNpX3JlZ3VsYXRvcl9pbml0KHN0cnVjdCBtc21fZHNp X2hvc3QgKm1zbV9ob3N0KQo+ICt7Cj4gKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSAqcyA9 IG1zbV9ob3N0LT5zdXBwbGllczsKPiArCWNvbnN0IHN0cnVjdCBkc2lfcmVnX2VudHJ5ICpyZWdz ID0gbXNtX2hvc3QtPmNmZy0+cmVnX2NmZy5yZWdzOwo+ICsJaW50IG51bSA9IG1zbV9ob3N0LT5j ZmctPnJlZ19jZmcubnVtOwo+ICsJaW50IGksIHJldDsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwg bnVtOyBpKyspCj4gKwkJc1tpXS5zdXBwbHkgPSByZWdzW2ldLm5hbWU7Cj4gKwo+ICsJcmV0ID0g ZGV2bV9yZWd1bGF0b3JfYnVsa19nZXQoJm1zbV9ob3N0LT5wZGV2LT5kZXYsIG51bSwgcyk7Cj4g KwlpZiAocmV0IDwgMCkgewo+ICsJCXByX2VycigiJXM6IGZhaWxlZCB0byBpbml0IHJlZ3VsYXRv ciwgcmV0PSVkXG4iLAo+ICsJCQkJCQlfX2Z1bmNfXywgcmV0KTsKPiArCQlyZXR1cm4gcmV0Owo+ ICsJfQo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewo+ICsJCWlmICgocmVnc1tp XS5taW5fdm9sdGFnZSA+PSAwKSAmJiAocmVnc1tpXS5tYXhfdm9sdGFnZSA+PSAwKSkgewo+ICsJ CQlyZXQgPSByZWd1bGF0b3Jfc2V0X3ZvbHRhZ2Uoc1tpXS5jb25zdW1lciwKPiArCQkJCXJlZ3Nb aV0ubWluX3ZvbHRhZ2UsIHJlZ3NbaV0ubWF4X3ZvbHRhZ2UpOwo+ICsJCQlpZiAocmV0IDwgMCkg ewo+ICsJCQkJcHJfZXJyKCJyZWd1bGF0b3IgJWQgc2V0IHZvbHRhZ2UgZmFpbGVkLCAlZFxuIiwK PiArCQkJCQlpLCByZXQpOwo+ICsJCQkJcmV0dXJuIHJldDsKPiArCQkJfQo+ICsJCX0KPiArCX0K PiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBkc2lfY2xrX2luaXQoc3Ry dWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9 ICZtc21faG9zdC0+cGRldi0+ZGV2Owo+ICsJaW50IHJldCA9IDA7Cj4gKwo+ICsJbXNtX2hvc3Qt Pm1kcF9jb3JlX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJtZHBfY29yZV9jbGsiKTsKPiArCWlm IChJU19FUlIobXNtX2hvc3QtPm1kcF9jb3JlX2NsaykpIHsKPiArCQlyZXQgPSBQVFJfRVJSKG1z bV9ob3N0LT5tZHBfY29yZV9jbGspOwo+ICsJCXByX2VycigiJXM6IFVuYWJsZSB0byBnZXQgbWRw IGNvcmUgY2xrLiByZXQ9JWRcbiIsCj4gKwkJCV9fZnVuY19fLCByZXQpOwo+ICsJCWdvdG8gZXhp dDsKPiArCX0KPiArCj4gKwltc21faG9zdC0+YWhiX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJp ZmFjZV9jbGsiKTsKPiArCWlmIChJU19FUlIobXNtX2hvc3QtPmFoYl9jbGspKSB7Cj4gKwkJcmV0 ID0gUFRSX0VSUihtc21faG9zdC0+YWhiX2Nsayk7Cj4gKwkJcHJfZXJyKCIlczogVW5hYmxlIHRv IGdldCBtZHNzIGFoYiBjbGsuIHJldD0lZFxuIiwKPiArCQkJX19mdW5jX18sIHJldCk7Cj4gKwkJ Z290byBleGl0Owo+ICsJfQo+ICsKPiArCW1zbV9ob3N0LT5heGlfY2xrID0gZGV2bV9jbGtfZ2V0 KGRldiwgImJ1c19jbGsiKTsKPiArCWlmIChJU19FUlIobXNtX2hvc3QtPmF4aV9jbGspKSB7Cj4g KwkJcmV0ID0gUFRSX0VSUihtc21faG9zdC0+YXhpX2Nsayk7Cj4gKwkJcHJfZXJyKCIlczogVW5h YmxlIHRvIGdldCBheGkgYnVzIGNsay4gcmV0PSVkXG4iLAo+ICsJCQlfX2Z1bmNfXywgcmV0KTsK PiArCQlnb3RvIGV4aXQ7Cj4gKwl9Cj4gKwo+ICsJbXNtX2hvc3QtPm1tc3NfbWlzY19haGJfY2xr ID0gZGV2bV9jbGtfZ2V0KGRldiwgImNvcmVfbW1zc19jbGsiKTsKPiArCWlmIChJU19FUlIobXNt X2hvc3QtPm1tc3NfbWlzY19haGJfY2xrKSkgewo+ICsJCXJldCA9IFBUUl9FUlIobXNtX2hvc3Qt Pm1tc3NfbWlzY19haGJfY2xrKTsKPiArCQlwcl9lcnIoIiVzOiBVbmFibGUgdG8gZ2V0IG1tc3Mg bWlzYyBhaGIgY2xrLiByZXQ9JWRcbiIsCj4gKwkJCV9fZnVuY19fLCByZXQpOwo+ICsJCWdvdG8g ZXhpdDsKPiArCX0KPiArCj4gKwltc21faG9zdC0+Ynl0ZV9jbGsgPSBkZXZtX2Nsa19nZXQoZGV2 LCAiYnl0ZV9jbGsiKTsKPiArCWlmIChJU19FUlIobXNtX2hvc3QtPmJ5dGVfY2xrKSkgewo+ICsJ CXJldCA9IFBUUl9FUlIobXNtX2hvc3QtPmJ5dGVfY2xrKTsKPiArCQlwcl9lcnIoIiVzOiBjYW4n dCBmaW5kIGRzaV9ieXRlX2Nsay4gcmV0PSVkXG4iLAo+ICsJCQlfX2Z1bmNfXywgcmV0KTsKPiAr CQltc21faG9zdC0+Ynl0ZV9jbGsgPSBOVUxMOwo+ICsJCWdvdG8gZXhpdDsKPiArCX0KPiArCj4g Kwltc21faG9zdC0+cGl4ZWxfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInBpeGVsX2NsayIpOwo+ ICsJaWYgKElTX0VSUihtc21faG9zdC0+cGl4ZWxfY2xrKSkgewo+ICsJCXJldCA9IFBUUl9FUlIo bXNtX2hvc3QtPnBpeGVsX2Nsayk7Cj4gKwkJcHJfZXJyKCIlczogY2FuJ3QgZmluZCBkc2lfcGl4 ZWxfY2xrLiByZXQ9JWRcbiIsCj4gKwkJCV9fZnVuY19fLCByZXQpOwo+ICsJCW1zbV9ob3N0LT5w aXhlbF9jbGsgPSBOVUxMOwo+ICsJCWdvdG8gZXhpdDsKPiArCX0KPiArCj4gKwltc21faG9zdC0+ ZXNjX2NsayA9IGRldm1fY2xrX2dldChkZXYsICJjb3JlX2NsayIpOwo+ICsJaWYgKElTX0VSUiht c21faG9zdC0+ZXNjX2NsaykpIHsKPiArCQlyZXQgPSBQVFJfRVJSKG1zbV9ob3N0LT5lc2NfY2xr KTsKPiArCQlwcl9lcnIoIiVzOiBjYW4ndCBmaW5kIGRzaV9lc2NfY2xrLiByZXQ9JWRcbiIsCj4g KwkJCV9fZnVuY19fLCByZXQpOwo+ICsJCW1zbV9ob3N0LT5lc2NfY2xrID0gTlVMTDsKPiArCQln b3RvIGV4aXQ7Cj4gKwl9Cj4gKwo+ICtleGl0Ogo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiAr c3RhdGljIGludCBkc2lfYnVzX2Nsa19lbmFibGUoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hv c3QpCj4gK3sKPiArCWludCByZXQgPSAwOwo+ICsKPiArCURCRygiJXM6IGlkPSVkXG4iLCBfX2Z1 bmNfXywgbXNtX2hvc3QtPmlkKTsKPiArCj4gKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUobXNt X2hvc3QtPm1kcF9jb3JlX2Nsayk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJcHJfZXJyKCIlczogZmFp bGVkIHRvIGVuYWJsZSBtZHBfY29yZV9jbG9jaywgJWRcbiIsCj4gKwkJCQkJCQkgX19mdW5jX18s IHJldCk7Cj4gKwkJZ290byBjb3JlX2Nsa19lcnI7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gY2xrX3By ZXBhcmVfZW5hYmxlKG1zbV9ob3N0LT5haGJfY2xrKTsKPiArCWlmIChyZXQpIHsKPiArCQlwcl9l cnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIGFoYiBjbG9jaywgJWRcbiIsIF9fZnVuY19fLCByZXQp Owo+ICsJCWdvdG8gYWhiX2Nsa19lcnI7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gY2xrX3ByZXBhcmVf ZW5hYmxlKG1zbV9ob3N0LT5heGlfY2xrKTsKPiArCWlmIChyZXQpIHsKPiArCQlwcl9lcnIoIiVz OiBmYWlsZWQgdG8gZW5hYmxlIGFoYiBjbG9jaywgJWRcbiIsIF9fZnVuY19fLCByZXQpOwo+ICsJ CWdvdG8gYXhpX2Nsa19lcnI7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxl KG1zbV9ob3N0LT5tbXNzX21pc2NfYWhiX2Nsayk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJcHJfZXJy KCIlczogZmFpbGVkIHRvIGVuYWJsZSBtbXNzIG1pc2MgYWhiIGNsaywgJWRcbiIsCj4gKwkJCV9f ZnVuY19fLCByZXQpOwo+ICsJCWdvdG8gbWlzY19haGJfY2xrX2VycjsKPiArCX0KPiArCj4gKwly ZXR1cm4gMDsKPiArCj4gK21pc2NfYWhiX2Nsa19lcnI6Cj4gKwljbGtfZGlzYWJsZV91bnByZXBh cmUobXNtX2hvc3QtPmF4aV9jbGspOwo+ICtheGlfY2xrX2VycjoKPiArCWNsa19kaXNhYmxlX3Vu cHJlcGFyZShtc21faG9zdC0+YWhiX2Nsayk7Cj4gK2FoYl9jbGtfZXJyOgo+ICsJY2xrX2Rpc2Fi bGVfdW5wcmVwYXJlKG1zbV9ob3N0LT5tZHBfY29yZV9jbGspOwo+ICtjb3JlX2Nsa19lcnI6Cj4g KwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkc2lfYnVzX2Nsa19kaXNhYmxl KHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0KQo+ICt7Cj4gKwlEQkcoIiIpOwo+ICsJY2xr X2Rpc2FibGVfdW5wcmVwYXJlKG1zbV9ob3N0LT5tbXNzX21pc2NfYWhiX2Nsayk7Cj4gKwljbGtf ZGlzYWJsZV91bnByZXBhcmUobXNtX2hvc3QtPmF4aV9jbGspOwo+ICsJY2xrX2Rpc2FibGVfdW5w cmVwYXJlKG1zbV9ob3N0LT5haGJfY2xrKTsKPiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShtc21f aG9zdC0+bWRwX2NvcmVfY2xrKTsKPiArfQo+ICsKPiArc3RhdGljIGludCBkc2lfbGlua19jbGtf ZW5hYmxlKHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0KQo+ICt7Cj4gKwlpbnQgcmV0ID0g MDsKPiArCj4gKwlEQkcoIlNldCBjbGsgcmF0ZXM6IHBjbGs9JWQsIGJ5dGVjbGs9JWRcbiIsCj4g KwkJbXNtX2hvc3QtPm1vZGUtPmNsb2NrLCBtc21faG9zdC0+Ynl0ZV9jbGtfcmF0ZSk7Cj4gKwo+ ICsJcmV0ID0gIGNsa19zZXRfcmF0ZShtc21faG9zdC0+Ynl0ZV9jbGssIG1zbV9ob3N0LT5ieXRl X2Nsa19yYXRlKTsKPiArCWlmIChyZXQpIHsKPiArCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0 IHJhdGUgYnl0ZSBjbGssICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKPiArCQlnb3RvIGVycm9yOwo+ ICsJfQo+ICsKPiArCXJldCA9IGNsa19zZXRfcmF0ZShtc21faG9zdC0+cGl4ZWxfY2xrLCBtc21f aG9zdC0+bW9kZS0+Y2xvY2sgKiAxMDAwKTsKPiArCWlmIChyZXQpIHsKPiArCQlwcl9lcnIoIiVz OiBGYWlsZWQgdG8gc2V0IHJhdGUgcGl4ZWwgY2xrLCAlZFxuIiwgX19mdW5jX18sIHJldCk7Cj4g KwkJZ290byBlcnJvcjsKPiArCX0KPiArCj4gKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUobXNt X2hvc3QtPmVzY19jbGspOwo+ICsJaWYgKHJldCkgewo+ICsJCXByX2VycigiJXM6IEZhaWxlZCB0 byBlbmFibGUgZHNpIGVzYyBjbGtcbiIsIF9fZnVuY19fKTsKPiArCQlnb3RvIGVycm9yOwo+ICsJ fQo+ICsKPiArCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShtc21faG9zdC0+Ynl0ZV9jbGspOwo+ ICsJaWYgKHJldCkgewo+ICsJCXByX2VycigiJXM6IEZhaWxlZCB0byBlbmFibGUgZHNpIGJ5dGUg Y2xrXG4iLCBfX2Z1bmNfXyk7Cj4gKwkJZ290byBieXRlX2Nsa19lcnI7Cj4gKwl9Cj4gKwo+ICsJ cmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG1zbV9ob3N0LT5waXhlbF9jbGspOwo+ICsJaWYgKHJl dCkgewo+ICsJCXByX2VycigiJXM6IEZhaWxlZCB0byBlbmFibGUgZHNpIHBpeGVsIGNsa1xuIiwg X19mdW5jX18pOwo+ICsJCWdvdG8gcGl4ZWxfY2xrX2VycjsKPiArCX0KPiArCj4gKwlyZXR1cm4g cmV0Owo+ICsKPiArcGl4ZWxfY2xrX2VycjoKPiArCWNsa19kaXNhYmxlX3VucHJlcGFyZShtc21f aG9zdC0+Ynl0ZV9jbGspOwo+ICtieXRlX2Nsa19lcnI6Cj4gKwljbGtfZGlzYWJsZV91bnByZXBh cmUobXNtX2hvc3QtPmVzY19jbGspOwo+ICtlcnJvcjoKPiArCXJldHVybiByZXQ7Cj4gK30KPiAr Cj4gK3N0YXRpYyB2b2lkIGRzaV9saW5rX2Nsa19kaXNhYmxlKHN0cnVjdCBtc21fZHNpX2hvc3Qg Km1zbV9ob3N0KQo+ICt7Cj4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUobXNtX2hvc3QtPmVzY19j bGspOwo+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1zbV9ob3N0LT5waXhlbF9jbGspOwo+ICsJ Y2xrX2Rpc2FibGVfdW5wcmVwYXJlKG1zbV9ob3N0LT5ieXRlX2Nsayk7Cj4gK30KPiArCj4gK3N0 YXRpYyBpbnQgZHNpX2Nsa19jdHJsKHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0LCBib29s IGVuYWJsZSkKPiArewo+ICsJaW50IHJldDsKPiArCj4gKwltdXRleF9sb2NrKCZtc21faG9zdC0+ Y2xrX211dGV4KTsKPiArCWlmIChlbmFibGUpIHsKPiArCQlyZXQgPSBkc2lfYnVzX2Nsa19lbmFi bGUobXNtX2hvc3QpOwo+ICsJCWlmIChyZXQpIHsKPiArCQkJcHJfZXJyKCIlczogQ2FuIG5vdCBl bmFibGUgYnVzIGNsaywgJWRcbiIsCj4gKwkJCQlfX2Z1bmNfXywgcmV0KTsKPiArCQkJZ290byB1 bmxvY2tfcmV0Owo+ICsJCX0KPiArCQlyZXQgPSBkc2lfbGlua19jbGtfZW5hYmxlKG1zbV9ob3N0 KTsKPiArCQlpZiAocmV0KSB7Cj4gKwkJCXByX2VycigiJXM6IENhbiBub3QgZW5hYmxlIGxpbmsg Y2xrLCAlZFxuIiwKPiArCQkJCV9fZnVuY19fLCByZXQpOwo+ICsJCQlkc2lfYnVzX2Nsa19kaXNh YmxlKG1zbV9ob3N0KTsKPiArCQkJZ290byB1bmxvY2tfcmV0Owo+ICsJCX0KPiArCX0gZWxzZSB7 Cj4gKwkJZHNpX2xpbmtfY2xrX2Rpc2FibGUobXNtX2hvc3QpOwo+ICsJCWRzaV9idXNfY2xrX2Rp c2FibGUobXNtX2hvc3QpOwo+ICsJfQo+ICsKPiArdW5sb2NrX3JldDoKPiArCW11dGV4X3VubG9j aygmbXNtX2hvc3QtPmNsa19tdXRleCk7Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGlj IGludCBkc2lfZ3Bpb19pbml0KHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0KQo+ICt7Cj4g KwlpbnQgcmV0Owo+ICsKPiArCW1zbV9ob3N0LT5kaXNwX2VuX2dwaW8gPSBkZXZtX2dwaW9kX2dl dCgmbXNtX2hvc3QtPnBkZXYtPmRldiwKPiArCQkJCQkJImRpc3AtZW5hYmxlIik7Cj4gKwlpZiAo SVNfRVJSKG1zbV9ob3N0LT5kaXNwX2VuX2dwaW8pKSB7Cj4gKwkJcHJfd2FybigiJXM6IGNhbm5v dCBnZXQgZGlzcC1lbmFibGUtZ3Bpb3MgJWxkXG4iLAo+ICsJCQlfX2Z1bmNfXywgUFRSX0VSUiht c21faG9zdC0+ZGlzcF9lbl9ncGlvKSk7Cj4gKwkJbXNtX2hvc3QtPmRpc3BfZW5fZ3BpbyA9IE5V TEw7Cj4gKwl9Cj4gKwlpZiAobXNtX2hvc3QtPmRpc3BfZW5fZ3Bpbykgewo+ICsJCXJldCA9IGdw aW9kX2RpcmVjdGlvbl9vdXRwdXQobXNtX2hvc3QtPmRpc3BfZW5fZ3BpbywgMCk7Cj4gKwkJaWYg KHJldCkgewo+ICsJCQlwcl9lcnIoImNhbm5vdCBzZXQgZGlyIHRvIGRpc3AtZW4tZ3Bpb3MgJWRc biIsIHJldCk7Cj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCW1zbV9ob3N0 LT50ZV9ncGlvID0gZGV2bV9ncGlvZF9nZXQoJm1zbV9ob3N0LT5wZGV2LT5kZXYsICJkaXNwLXRl Iik7Cj4gKwlpZiAoSVNfRVJSKG1zbV9ob3N0LT50ZV9ncGlvKSkgewo+ICsJCXByX3dhcm4oIiVz OiBjYW5ub3QgZ2V0IGRpc3AtdGUtZ3Bpb3MgJWxkXG4iLAo+ICsJCQlfX2Z1bmNfXywgUFRSX0VS Uihtc21faG9zdC0+dGVfZ3BpbykpOwoKVmlkZW8gbW9kZSBwYW5lbHMgd29uJ3QgaGF2ZSB0ZV9n cGlvLCB3ZSBjb3VsZCBwcm9iYWJseSBtYWtlIHRoaXMgcHJfZGVidWcoKQoKPiArCQltc21faG9z dC0+dGVfZ3BpbyA9IE5VTEw7Cj4gKwl9Cj4gKwo+ICsJaWYgKG1zbV9ob3N0LT50ZV9ncGlvKSB7 Cj4gKwkJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX2lucHV0KG1zbV9ob3N0LT50ZV9ncGlvKTsKPiAr CQlpZiAocmV0KSB7Cj4gKwkJCXByX2VycigiJXM6IGNhbm5vdCBzZXQgZGlyIHRvIGRpc3AtdGUt Z3Bpb3MsICVkXG4iLAo+ICsJCQkJX19mdW5jX18sIHJldCk7Cj4gKwkJCXJldHVybiByZXQ7Cj4g KwkJfQo+ICsJfQoKVGhlc2UgZ3Bpb3MgY3VycmVudGx5IG5lZWQgdG8gYmUgZGVjbGFyZWQgdW5k ZXIgdGhlIGRzaSBEVCBub2RlLiBFdmVuIGlmIAp0aGVzZSBhcmUgY29udHJvbGxlZCB2aWEgdGhl IGRzaSBob3N0LCB0aGUgZ3Bpb3Mgc2hvdWxkIHN0aWxsIGNvbWUgdW5kZXIgCnRoZSBwYW5lbCBE VCBub2RlLgoKV2Ugc2hvdXQgZ2V0IHRoZSBwYW5lbCdzIG9mX25vZGUgaGVyZSBhbmQgbG9vayBm b3IgdGhlc2UuCgo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHNp X2NhbGNfY2xrX3JhdGUoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCj4gK3sKPiArCXN0 cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gbXNtX2hvc3QtPm1vZGU7Cj4gKwl1OCBsYW5l cyA9IG1zbV9ob3N0LT5sYW5lczsKPiArCXUzMiBicHAgPSBkc2lfZ2V0X2JwcChtc21faG9zdC0+ Zm9ybWF0KTsKPiArCXUzMiBwY2xrX3JhdGU7Cj4gKwo+ICsJaWYgKCFtb2RlKSB7Cj4gKwkJcHJf ZXJyKCIlczogbW9kZSBub3Qgc2V0XG4iLCBfX2Z1bmNfXyk7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7 Cj4gKwl9Cj4gKwo+ICsJcGNsa19yYXRlID0gbW9kZS0+Y2xvY2sgKiAxMDAwOwo+ICsJaWYgKGxh bmVzID4gMCkgewo+ICsJCW1zbV9ob3N0LT5ieXRlX2Nsa19yYXRlID0gKHBjbGtfcmF0ZSAqIGJw cCkgLyAoOCAqIGxhbmVzKTsKPiArCX0gZWxzZSB7Cj4gKwkJcHJfZXJyKCIlczogZm9yY2luZyBt ZHNzX2RzaSBsYW5lcyB0byAxXG4iLCBfX2Z1bmNfXyk7Cj4gKwkJbXNtX2hvc3QtPmJ5dGVfY2xr X3JhdGUgPSAocGNsa19yYXRlICogYnBwKSAvIDg7Cj4gKwl9Cj4gKwo+ICsJREJHKCJwY2xrPSVk LCBiY2xrPSVkXG4iLCBwY2xrX3JhdGUsIG1zbV9ob3N0LT5ieXRlX2Nsa19yYXRlKTsKPiArCj4g KwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHNpX3BoeV9zd19yZXNldChzdHJ1 Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKPiArewo+ICsJREJHKCIiKTsKPiArCWRzaV93cml0 ZShtc21faG9zdCwgUkVHX0RTSV9QSFlfUkVTRVQsIERTSV9QSFlfUkVTRVRfUkVTRVQpOwo+ICsJ LyogTWFrZSBzdXJlIGZ1bGx5IHJlc2V0ICovCj4gKwl3bWIoKTsKPiArCXVkZWxheSgxMDAwKTsK PiArCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9QSFlfUkVTRVQsIDApOwo+ICsJdWRlbGF5 KDEwMCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRzaV9pbnRyX2N0cmwoc3RydWN0IG1zbV9k c2lfaG9zdCAqbXNtX2hvc3QsIHUzMiBtYXNrLCBpbnQgZW5hYmxlKQo+ICt7Cj4gKwl1MzIgaW50 cjsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJm1z bV9ob3N0LT5pbnRyX2xvY2ssIGZsYWdzKTsKPiArCWludHIgPSBkc2lfcmVhZChtc21faG9zdCwg UkVHX0RTSV9JTlRSX0NUUkwpOwo+ICsKPiArCWlmIChlbmFibGUpCj4gKwkJaW50ciB8PSBtYXNr Owo+ICsJZWxzZQo+ICsJCWludHIgJj0gfm1hc2s7Cj4gKwo+ICsJREJHKCJpbnRyPSV4IGVuYWJs ZT0lZCIsIGludHIsIGVuYWJsZSk7Cj4gKwo+ICsJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJ X0lOVFJfQ1RSTCwgaW50cik7Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21faG9zdC0+ aW50cl9sb2NrLCBmbGFncyk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgZW51bSBkc2lfdHJh ZmZpY19tb2RlIGRzaV9nZXRfdHJhZmZpY19tb2RlKGNvbnN0IHUzMiBtb2RlX2ZsYWdzKQo+ICt7 Cj4gKwlpZiAobW9kZV9mbGFncyAmIE1JUElfRFNJX01PREVfVklERU9fQlVSU1QpCj4gKwkJcmV0 dXJuIEJVUlNUX01PREU7Cj4gKwllbHNlIGlmIChtb2RlX2ZsYWdzICYgTUlQSV9EU0lfTU9ERV9W SURFT19TWU5DX1BVTFNFKQo+ICsJCXJldHVybiBOT05fQlVSU1RfU1lOQ0hfUFVMU0U7Cj4gKwo+ ICsJcmV0dXJuIE5PTl9CVVJTVF9TWU5DSF9FVkVOVDsKPiArfQo+ICsKPiArc3RhdGljIGlubGlu ZSBlbnVtIGRzaV92aWRfZHN0X2Zvcm1hdCBkc2lfZ2V0X3ZpZF9mbXQoCj4gKwkJCQljb25zdCBl bnVtIG1pcGlfZHNpX3BpeGVsX2Zvcm1hdCBtaXBpX2ZtdCkKPiArewo+ICsJc3dpdGNoIChtaXBp X2ZtdCkgewo+ICsJY2FzZSBNSVBJX0RTSV9GTVRfUkdCODg4OglyZXR1cm4gVklEX0RTVF9GT1JN QVRfUkdCODg4Owo+ICsJY2FzZSBNSVBJX0RTSV9GTVRfUkdCNjY2OglyZXR1cm4gVklEX0RTVF9G T1JNQVRfUkdCNjY2X0xPT1NFOwo+ICsJY2FzZSBNSVBJX0RTSV9GTVRfUkdCNjY2X1BBQ0tFRDoJ cmV0dXJuIFZJRF9EU1RfRk9STUFUX1JHQjY2NjsKPiArCWNhc2UgTUlQSV9EU0lfRk1UX1JHQjU2 NToJcmV0dXJuIFZJRF9EU1RfRk9STUFUX1JHQjU2NTsKPiArCWRlZmF1bHQ6CQkJcmV0dXJuIFZJ RF9EU1RfRk9STUFUX1JHQjg4ODsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIGlubGluZSBlbnVt IGRzaV9jbWRfZHN0X2Zvcm1hdCBkc2lfZ2V0X2NtZF9mbXQoCj4gKwkJCQljb25zdCBlbnVtIG1p cGlfZHNpX3BpeGVsX2Zvcm1hdCBtaXBpX2ZtdCkKPiArewo+ICsJc3dpdGNoIChtaXBpX2ZtdCkg ewo+ICsJY2FzZSBNSVBJX0RTSV9GTVRfUkdCODg4OglyZXR1cm4gQ01EX0RTVF9GT1JNQVRfUkdC ODg4Owo+ICsJY2FzZSBNSVBJX0RTSV9GTVRfUkdCNjY2X1BBQ0tFRDoKPiArCWNhc2UgTUlQSV9E U0lfRk1UX1JHQjY2NjoJcmV0dXJuIFZJRF9EU1RfRk9STUFUX1JHQjY2NjsKPiArCWNhc2UgTUlQ SV9EU0lfRk1UX1JHQjU2NToJcmV0dXJuIENNRF9EU1RfRk9STUFUX1JHQjU2NTsKPiArCWRlZmF1 bHQ6CQkJcmV0dXJuIENNRF9EU1RfRk9STUFUX1JHQjg4ODsKPiArCX0KPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgZHNpX2N0cmxfY29uZmlnKHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0LCBi b29sIGVuYWJsZSwKPiArCQkJCXUzMiBjbGtfcHJlLCB1MzIgY2xrX3Bvc3QpCj4gK3sKPiArCXUz MiBmbGFncyA9IG1zbV9ob3N0LT5tb2RlX2ZsYWdzOwo+ICsJZW51bSBtaXBpX2RzaV9waXhlbF9m b3JtYXQgbWlwaV9mbXQgPSBtc21faG9zdC0+Zm9ybWF0Owo+ICsJdTMyIGRhdGEgPSAwOwo+ICsK PiArCWlmICghZW5hYmxlKSB7Cj4gKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX0NUUkws IDApOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4gKwlpZiAoZmxhZ3MgJiBNSVBJX0RTSV9NT0RF X1ZJREVPKSB7Cj4gKwkJaWYgKGZsYWdzICYgTUlQSV9EU0lfTU9ERV9WSURFT19IU0UpCj4gKwkJ CWRhdGEgfD0gRFNJX1ZJRF9DRkcwX1BVTFNFX01PREVfSFNBX0hFOwo+ICsJCWlmIChmbGFncyAm IE1JUElfRFNJX01PREVfVklERU9fSEZQKQo+ICsJCQlkYXRhIHw9IERTSV9WSURfQ0ZHMF9IRlBf UE9XRVJfU1RPUDsKPiArCQlpZiAoZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVPX0hCUCkKPiAr CQkJZGF0YSB8PSBEU0lfVklEX0NGRzBfSEJQX1BPV0VSX1NUT1A7Cj4gKwkJaWYgKGZsYWdzICYg TUlQSV9EU0lfTU9ERV9WSURFT19IU0EpCj4gKwkJCWRhdGEgfD0gRFNJX1ZJRF9DRkcwX0hTQV9Q T1dFUl9TVE9QOwo+ICsJCS8qIEFsd2F5cyBzZXQgbG93IHBvd2VyIHN0b3AgbW9kZSBmb3IgQkxM UAo+ICsJCSAqIHRvIGxldCBjb21tYW5kIGVuZ2luZSBzZW5kIHBhY2tldHMKPiArCQkgKi8KPiAr CQlkYXRhIHw9IERTSV9WSURfQ0ZHMF9FT0ZfQkxMUF9QT1dFUl9TVE9QIHwKPiArCQkJRFNJX1ZJ RF9DRkcwX0JMTFBfUE9XRVJfU1RPUDsKPiArCQlkYXRhIHw9IERTSV9WSURfQ0ZHMF9UUkFGRklD X01PREUoZHNpX2dldF90cmFmZmljX21vZGUoZmxhZ3MpKTsKPiArCQlkYXRhIHw9IERTSV9WSURf Q0ZHMF9EU1RfRk9STUFUKGRzaV9nZXRfdmlkX2ZtdChtaXBpX2ZtdCkpOwo+ICsJCWRhdGEgfD0g RFNJX1ZJRF9DRkcwX1ZJUlRfQ0hBTk5FTChtc21faG9zdC0+Y2hhbm5lbCk7Cj4gKwkJZHNpX3dy aXRlKG1zbV9ob3N0LCBSRUdfRFNJX1ZJRF9DRkcwLCBkYXRhKTsKPiArCj4gKwkJLyogRG8gbm90 IHN3YXAgUkdCIGNvbG9ycyAqLwo+ICsJCWRhdGEgPSBEU0lfVklEX0NGRzFfUkdCX1NXQVAoU1dB UF9SR0IpOwo+ICsJCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9WSURfQ0ZHMSwgMCk7Cj4g Kwl9IGVsc2Ugewo+ICsJCS8qIERvIG5vdCBzd2FwIFJHQiBjb2xvcnMgKi8KPiArCQlkYXRhID0g RFNJX0NNRF9DRkcwX1JHQl9TV0FQKFNXQVBfUkdCKTsKPiArCQlkYXRhIHw9IERTSV9DTURfQ0ZH MF9EU1RfRk9STUFUKGRzaV9nZXRfY21kX2ZtdChtaXBpX2ZtdCkpOwo+ICsJCWRzaV93cml0ZSht c21faG9zdCwgUkVHX0RTSV9DTURfQ0ZHMCwgZGF0YSk7Cj4gKwo+ICsJCWRhdGEgPSBEU0lfQ01E X0NGRzFfV1JfTUVNX1NUQVJUKE1JUElfRENTX1dSSVRFX01FTU9SWV9TVEFSVCkgfAo+ICsJCQlE U0lfQ01EX0NGRzFfV1JfTUVNX0NPTlRJTlVFKAo+ICsJCQkJCU1JUElfRENTX1dSSVRFX01FTU9S WV9DT05USU5VRSk7Cj4gKwkJLyogQWx3YXlzIGluc2VydCBEQ1MgY29tbWFuZCAqLwo+ICsJCWRh dGEgfD0gRFNJX0NNRF9DRkcxX0lOU0VSVF9EQ1NfQ09NTUFORDsKPiArCQlkc2lfd3JpdGUobXNt X2hvc3QsIFJFR19EU0lfQ01EX0NGRzEsIGRhdGEpOwo+ICsJfQo+ICsKPiArCWRzaV93cml0ZSht c21faG9zdCwgUkVHX0RTSV9DTURfRE1BX0NUUkwsCj4gKwkJCURTSV9DTURfRE1BX0NUUkxfRlJP TV9GUkFNRV9CVUZGRVIgfAo+ICsJCQlEU0lfQ01EX0RNQV9DVFJMX0xPV19QT1dFUik7Cj4gKwo+ ICsJZGF0YSA9IDA7Cj4gKwkvKiBBbHdheXMgYXNzdW1lIGRlZGljYXRlZCBURSBwaW4gKi8KPiAr CWRhdGEgfD0gRFNJX1RSSUdfQ1RSTF9URTsKPiArCWRhdGEgfD0gRFNJX1RSSUdfQ1RSTF9NRFBf VFJJR0dFUihUUklHR0VSX05PTkUpOwo+ICsJZGF0YSB8PSBEU0lfVFJJR19DVFJMX0RNQV9UUklH R0VSKFRSSUdHRVJfU1cpOwo+ICsJZGF0YSB8PSBEU0lfVFJJR19DVFJMX1NUUkVBTShtc21faG9z dC0+Y2hhbm5lbCk7Cj4gKwlpZiAoKG1zbV9ob3N0LT5jZmctPm1ham9yID09IE1TTV9EU0lfVkVS X01BSk9SXzZHKSAmJgo+ICsJCShtc21faG9zdC0+Y2ZnLT5taW5vciA+PSBNU01fRFNJXzZHX1ZF Ul9NSU5PUl9WMV8yKSkKPiArCQlkYXRhIHw9IERTSV9UUklHX0NUUkxfQkxPQ0tfRE1BX1dJVEhJ Tl9GUkFNRTsKPiArCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9UUklHX0NUUkwsIGRhdGEp Owo+ICsKPiArCWRhdGEgPSBEU0lfQ0xLT1VUX1RJTUlOR19DVFJMX1RfQ0xLX1BPU1QoY2xrX3Bv c3QpIHwKPiArCQlEU0lfQ0xLT1VUX1RJTUlOR19DVFJMX1RfQ0xLX1BSRShjbGtfcHJlKTsKPiAr CWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9DTEtPVVRfVElNSU5HX0NUUkwsIGRhdGEpOwo+ ICsKPiArCWRhdGEgPSAwOwo+ICsJaWYgKCEoZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX0VPVF9QQUNL RVQpKQo+ICsJCWRhdGEgfD0gRFNJX0VPVF9QQUNLRVRfQ1RSTF9UWF9FT1RfQVBQRU5EOwo+ICsJ ZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX0VPVF9QQUNLRVRfQ1RSTCwgZGF0YSk7Cj4gKwo+ ICsJLyogYWxsb3cgb25seSBhY2stZXJyLXN0YXR1cyB0byBnZW5lcmF0ZSBpbnRlcnJ1cHQgKi8K PiArCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9FUlJfSU5UX01BU0swLCAweDEzZmYzZmUw KTsKPiArCj4gKwlkc2lfaW50cl9jdHJsKG1zbV9ob3N0LCBEU0lfSVJRX01BU0tfRVJST1IsIDEp Owo+ICsKPiArCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9DTEtfQ1RSTCwKPiArCQlEU0lf Q0xLX0NUUkxfQUhCU19IQ0xLX09OIHwgRFNJX0NMS19DVFJMX0FIQk1fU0NMS19PTiB8Cj4gKwkJ RFNJX0NMS19DVFJMX1BDTEtfT04gfCBEU0lfQ0xLX0NUUkxfRFNJQ0xLX09OIHwKPiArCQlEU0lf Q0xLX0NUUkxfQllURUNMS19PTiB8IERTSV9DTEtfQ1RSTF9FU0NDTEtfT04gfAo+ICsJCURTSV9D TEtfQ1RSTF9GT1JDRV9PTl9EWU5fQUhCTV9IQ0xLKTsKPiArCj4gKwlkYXRhID0gRFNJX0NUUkxf Q0xLX0VOOwo+ICsKPiArCURCRygibGFuZSBudW1iZXI9JWQiLCBtc21faG9zdC0+bGFuZXMpOwo+ ICsJaWYgKG1zbV9ob3N0LT5sYW5lcyA9PSAyKSB7Cj4gKwkJZGF0YSB8PSBEU0lfQ1RSTF9MQU5F MSB8IERTSV9DVFJMX0xBTkUyOwo+ICsJCS8qIHN3YXAgbGFuZXMgZm9yIDItbGFuZSBwYW5lbCBm b3IgYmV0dGVyIHBlcmZvcm1hbmNlICovCj4gKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJ X0xBTkVfU1dBUF9DVFJMLAo+ICsJCQlEU0lfTEFORV9TV0FQX0NUUkxfRExOX1NXQVBfU0VMKExB TkVfU1dBUF8xMjMwKSk7Cj4gKwl9IGVsc2Ugewo+ICsJCS8qIFRha2UgNCBsYW5lcyBhcyBkZWZh dWx0ICovCj4gKwkJZGF0YSB8PSBEU0lfQ1RSTF9MQU5FMCB8IERTSV9DVFJMX0xBTkUxIHwgRFNJ X0NUUkxfTEFORTIgfAo+ICsJCQlEU0lfQ1RSTF9MQU5FMzsKPiArCQkvKiBEbyBub3Qgc3dhcCBs YW5lcyBmb3IgNC1sYW5lIHBhbmVsICovCj4gKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJ X0xBTkVfU1dBUF9DVFJMLAo+ICsJCQlEU0lfTEFORV9TV0FQX0NUUkxfRExOX1NXQVBfU0VMKExB TkVfU1dBUF8wMTIzKSk7Cj4gKwl9Cj4gKwlkYXRhIHw9IERTSV9DVFJMX0VOQUJMRTsKPiArCj4g Kwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQ1RSTCwgZGF0YSk7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIGRzaV90aW1pbmdfc2V0dXAoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3Qp Cj4gK3sKPiArCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlID0gbXNtX2hvc3QtPm1vZGU7 Cj4gKwl1MzIgaHNfc3RhcnQgPSAwLCB2c19zdGFydCA9IDA7IC8qIHRha2Ugc3luYyBzdGFydCBh cyAwICovCj4gKwl1MzIgaF90b3RhbCA9IG1vZGUtPmh0b3RhbDsKPiArCXUzMiB2X3RvdGFsID0g bW9kZS0+dnRvdGFsOwo+ICsJdTMyIGhzX2VuZCA9IG1vZGUtPmhzeW5jX2VuZCAtIG1vZGUtPmhz eW5jX3N0YXJ0Owo+ICsJdTMyIHZzX2VuZCA9IG1vZGUtPnZzeW5jX2VuZCAtIG1vZGUtPnZzeW5j X3N0YXJ0Owo+ICsJdTMyIGhhX3N0YXJ0ID0gaF90b3RhbCAtIG1vZGUtPmhzeW5jX3N0YXJ0Owo+ ICsJdTMyIGhhX2VuZCA9IGhhX3N0YXJ0ICsgbW9kZS0+aGRpc3BsYXk7Cj4gKwl1MzIgdmFfc3Rh cnQgPSB2X3RvdGFsIC0gbW9kZS0+dnN5bmNfc3RhcnQ7Cj4gKwl1MzIgdmFfZW5kID0gdmFfc3Rh cnQgKyBtb2RlLT52ZGlzcGxheTsKPiArCXUzMiB3YzsKPiArCj4gKwlEQkcoIiIpOwo+ICsKPiAr CWlmIChtc21faG9zdC0+bW9kZV9mbGFncyAmIE1JUElfRFNJX01PREVfVklERU8pIHsKPiArCQlk c2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQUNUSVZFX0gsCj4gKwkJCURTSV9BQ1RJVkVfSF9T VEFSVChoYV9zdGFydCkgfAo+ICsJCQlEU0lfQUNUSVZFX0hfRU5EKGhhX2VuZCkpOwo+ICsJCWRz aV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9BQ1RJVkVfViwKPiArCQkJRFNJX0FDVElWRV9WX1NU QVJUKHZhX3N0YXJ0KSB8Cj4gKwkJCURTSV9BQ1RJVkVfVl9FTkQodmFfZW5kKSk7Cj4gKwkJZHNp X3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX1RPVEFMLAo+ICsJCQlEU0lfVE9UQUxfSF9UT1RBTCho X3RvdGFsIC0gMSkgfAo+ICsJCQlEU0lfVE9UQUxfVl9UT1RBTCh2X3RvdGFsIC0gMSkpOwo+ICsK PiArCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQUNUSVZFX0hTWU5DLAo+ICsJCQlEU0lf QUNUSVZFX0hTWU5DX1NUQVJUKGhzX3N0YXJ0KSB8Cj4gKwkJCURTSV9BQ1RJVkVfSFNZTkNfRU5E KGhzX2VuZCkpOwo+ICsJCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9BQ1RJVkVfVlNZTkNf SFBPUywgMCk7Cj4gKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX0FDVElWRV9WU1lOQ19W UE9TLAo+ICsJCQlEU0lfQUNUSVZFX1ZTWU5DX1ZQT1NfU1RBUlQodnNfc3RhcnQpIHwKPiArCQkJ RFNJX0FDVElWRV9WU1lOQ19WUE9TX0VORCh2c19lbmQpKTsKPiArCX0gZWxzZSB7CQkvKiBjb21t YW5kIG1vZGUgKi8KPiArCQkvKiBpbWFnZSBkYXRhIGFuZCAxIGJ5dGUgd3JpdGVfbWVtb3J5X3N0 YXJ0IGNtZCAqLwo+ICsJCXdjID0gbW9kZS0+aGRpc3BsYXkgKiBkc2lfZ2V0X2JwcChtc21faG9z dC0+Zm9ybWF0KSAvIDggKyAxOwo+ICsKPiArCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lf Q01EX01EUF9TVFJFQU1fQ1RSTCwKPiArCQkJRFNJX0NNRF9NRFBfU1RSRUFNX0NUUkxfV09SRF9D T1VOVCh3YykgfAo+ICsJCQlEU0lfQ01EX01EUF9TVFJFQU1fQ1RSTF9WSVJUVUFMX0NIQU5ORUwo Cj4gKwkJCQkJbXNtX2hvc3QtPmNoYW5uZWwpIHwKPiArCQkJRFNJX0NNRF9NRFBfU1RSRUFNX0NU UkxfREFUQV9UWVBFKAo+ICsJCQkJCU1JUElfRFNJX0RDU19MT05HX1dSSVRFKSk7Cj4gKwo+ICsJ CWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9DTURfTURQX1NUUkVBTV9UT1RBTCwKPiArCQkJ RFNJX0NNRF9NRFBfU1RSRUFNX1RPVEFMX0hfVE9UQUwobW9kZS0+aGRpc3BsYXkpIHwKPiArCQkJ RFNJX0NNRF9NRFBfU1RSRUFNX1RPVEFMX1ZfVE9UQUwobW9kZS0+dmRpc3BsYXkpKTsKPiArCX0K PiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHNpX3N3X3Jlc2V0KHN0cnVjdCBtc21fZHNpX2hvc3Qg Km1zbV9ob3N0KQo+ICt7Cj4gKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQ0xLX0NUUkws Cj4gKwkJRFNJX0NMS19DVFJMX0FIQlNfSENMS19PTiB8IERTSV9DTEtfQ1RSTF9BSEJNX1NDTEtf T04gfAo+ICsJCURTSV9DTEtfQ1RSTF9QQ0xLX09OIHwgRFNJX0NMS19DVFJMX0RTSUNMS19PTiB8 Cj4gKwkJRFNJX0NMS19DVFJMX0JZVEVDTEtfT04gfCBEU0lfQ0xLX0NUUkxfRVNDQ0xLX09OIHwK PiArCQlEU0lfQ0xLX0NUUkxfRk9SQ0VfT05fRFlOX0FIQk1fSENMSyk7CgpUaGUgc2FtZSA3IGJp dHMgc2VlbSB0byBiZSBzZXQgZWxzZXdoZXJlLCBtYXliZSBtYWtlIHRoaXMgYSBtYWNybyAKRFNJ X0VOQUJMRV9DTEtTIG9yIHNvbWV0aGluZyBzaW1pbGFyPwoKPiArCXdtYigpOyAvKiBjbG9ja3Mg bmVlZCB0byBiZSBlbmFibGVkIGJlZm9yZSByZXNldCAqLwo+ICsKPiArCWRzaV93cml0ZShtc21f aG9zdCwgUkVHX0RTSV9SRVNFVCwgMSk7Cj4gKwl3bWIoKTsgLyogbWFrZSBzdXJlIHJlc2V0IGhh cHBlbiAqLwo+ICsJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX1JFU0VULCAwKTsKPiArfQo+ ICsKPiArc3RhdGljIHZvaWQgZHNpX29wX21vZGVfY29uZmlnKHN0cnVjdCBtc21fZHNpX2hvc3Qg Km1zbV9ob3N0LAo+ICsJCQkJCWJvb2wgdmlkZW9fbW9kZSwgYm9vbCBlbmFibGUpCj4gK3sKPiAr CXUzMiBkc2lfY3RybDsKPiArCj4gKwlkc2lfY3RybCA9IGRzaV9yZWFkKG1zbV9ob3N0LCBSRUdf RFNJX0NUUkwpOwo+ICsKPiArCWlmICghZW5hYmxlKSB7Cj4gKwkJZHNpX2N0cmwgJj0gfihEU0lf Q1RSTF9FTkFCTEUgfCBEU0lfQ1RSTF9WSURfTU9ERV9FTiB8Cj4gKwkJCQlEU0lfQ1RSTF9DTURf TU9ERV9FTik7Cj4gKwkJZHNpX2ludHJfY3RybChtc21faG9zdCwgRFNJX0lSUV9NQVNLX0NNRF9N RFBfRE9ORSB8Cj4gKwkJCQkJRFNJX0lSUV9NQVNLX1ZJREVPX0RPTkUsIDApOwo+ICsJfSBlbHNl IHsKPiArCQlpZiAodmlkZW9fbW9kZSkgewo+ICsJCQlkc2lfY3RybCB8PSBEU0lfQ1RSTF9WSURf TU9ERV9FTjsKPiArCQl9IGVsc2UgewkJLyogY29tbWFuZCBtb2RlICovCj4gKwkJCWRzaV9jdHJs IHw9IERTSV9DVFJMX0NNRF9NT0RFX0VOOwo+ICsJCQlkc2lfaW50cl9jdHJsKG1zbV9ob3N0LCBE U0lfSVJRX01BU0tfQ01EX01EUF9ET05FLCAxKTsKPiArCQl9Cj4gKwkJZHNpX2N0cmwgfD0gRFNJ X0NUUkxfRU5BQkxFOwo+ICsJfQo+ICsKPiArCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9D VFJMLCBkc2lfY3RybCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRzaV9zZXRfdHhfcG93ZXJf bW9kZShpbnQgbW9kZSwgc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCj4gK3sKPiArCXUz MiBkYXRhOwo+ICsKPiArCWRhdGEgPSBkc2lfcmVhZChtc21faG9zdCwgUkVHX0RTSV9DTURfRE1B X0NUUkwpOwo+ICsKPiArCWlmIChtb2RlID09IDApCj4gKwkJZGF0YSAmPSB+RFNJX0NNRF9ETUFf Q1RSTF9MT1dfUE9XRVI7Cj4gKwllbHNlCj4gKwkJZGF0YSB8PSBEU0lfQ01EX0RNQV9DVFJMX0xP V19QT1dFUjsKPiArCj4gKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQ01EX0RNQV9DVFJM LCBkYXRhKTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHNpX3dhaXQ0dmlkZW9fZG9uZShzdHJ1 Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKPiArewo+ICsJZHNpX2ludHJfY3RybChtc21faG9z dCwgRFNJX0lSUV9NQVNLX1ZJREVPX0RPTkUsIDEpOwo+ICsKPiArCXJlaW5pdF9jb21wbGV0aW9u KCZtc21faG9zdC0+dmlkZW9fY29tcCk7Cj4gKwo+ICsJd2FpdF9mb3JfY29tcGxldGlvbl90aW1l b3V0KCZtc21faG9zdC0+dmlkZW9fY29tcCwKPiArCQkJbXNlY3NfdG9famlmZmllcyg3MCkpOwo+ ICsKPiArCWRzaV9pbnRyX2N0cmwobXNtX2hvc3QsIERTSV9JUlFfTUFTS19WSURFT19ET05FLCAw KTsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHNpX3dhaXQ0dmlkZW9fZW5nX2J1c3koc3RydWN0 IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QpCj4gK3sKPiArCWlmICghKG1zbV9ob3N0LT5tb2RlX2Zs YWdzICYgTUlQSV9EU0lfTU9ERV9WSURFTykpCj4gKwkJcmV0dXJuOwo+ICsKPiArCWlmIChtc21f aG9zdC0+cG93ZXJfb24pIHsKPiArCQlkc2lfd2FpdDR2aWRlb19kb25lKG1zbV9ob3N0KTsKPiAr CQkvKiBkZWxheSA0IG1zIHRvIHNraXAgQkxMUCAqLwo+ICsJCXVzbGVlcF9yYW5nZSgyMDAwLCA0 MDAwKTsKPiArCX0KPiArfQo+ICsKPiArLyogZHNpX2NtZCAqLwo+ICtzdGF0aWMgaW50IGRzaV90 eF9idWZfYWxsb2Moc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QsIGludCBzaXplKQo+ICt7 Cj4gKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gbXNtX2hvc3QtPmRldjsKPiArCWludCByZXQ7 Cj4gKwl1MzIgaW92YTsKPiArCj4gKwltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7Cj4g Kwltc21faG9zdC0+dHhfZ2VtX29iaiA9IG1zbV9nZW1fbmV3KGRldiwgc2l6ZSwgTVNNX0JPX1VO Q0FDSEVEKTsKPiArCWlmIChJU19FUlIobXNtX2hvc3QtPnR4X2dlbV9vYmopKSB7Cj4gKwkJcmV0 ID0gUFRSX0VSUihtc21faG9zdC0+dHhfZ2VtX29iaik7Cj4gKwkJcHJfZXJyKCIlczogZmFpbGVk IHRvIGFsbG9jYXRlIGdlbSwgJWRcbiIsIF9fZnVuY19fLCByZXQpOwo+ICsJCW1zbV9ob3N0LT50 eF9nZW1fb2JqID0gTlVMTDsKPiArCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsK PiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJldCA9IG1zbV9nZW1fZ2V0X2lvdmFfbG9j a2VkKG1zbV9ob3N0LT50eF9nZW1fb2JqLCAwLCAmaW92YSk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJ cHJfZXJyKCIlczogZmFpbGVkIHRvIGdldCBpb3ZhLCAlZFxuIiwgX19mdW5jX18sIHJldCk7Cj4g KwkJcmV0dXJuIHJldDsKPiArCX0KPiArCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgp Owo+ICsKPiArCWlmIChpb3ZhICYgMHgwNykgewo+ICsJCXByX2VycigiJXM6IGJ1ZiBOT1QgOCBi eXRlcyBhbGlnbmVkXG4iLCBfX2Z1bmNfXyk7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4g Kwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRzaV90eF9idWZfZnJlZShz dHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKPiArewo+ICsJc3RydWN0IGRybV9kZXZpY2Ug KmRldiA9IG1zbV9ob3N0LT5kZXY7Cj4gKwo+ICsJaWYgKG1zbV9ob3N0LT50eF9nZW1fb2JqKSB7 Cj4gKwkJbXNtX2dlbV9wdXRfaW92YShtc21faG9zdC0+dHhfZ2VtX29iaiwgMCk7Cj4gKwkJbXV0 ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwo+ICsJCW1zbV9nZW1fZnJlZV9vYmplY3QobXNt X2hvc3QtPnR4X2dlbV9vYmopOwo+ICsJCW1zbV9ob3N0LT50eF9nZW1fb2JqID0gTlVMTDsKPiAr CQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKPiArCX0KPiArfQo+ICsKPiArLyoK PiArICogcHJlcGFyZSBjbWQgYnVmZmVyIHRvIGJlIHR4ZWQKPiArICovCj4gK3N0YXRpYyBpbnQg ZHNpX2NtZF9kbWFfYWRkKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqdHhfZ2VtLAo+ICsJCQljb25z dCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2cpCj4gK3sKPiArCXN0cnVjdCBtaXBpX2RzaV9wYWNr ZXQgcGFja2V0Owo+ICsJaW50IGxlbjsKPiArCWludCByZXQgPSAwOwo+ICsJdTggKmRhdGE7Cj4g Kwo+ICsJcmV0ID0gbWlwaV9kc2lfY3JlYXRlX3BhY2tldCgmcGFja2V0LCBtc2cpOwo+ICsJaWYg KHJldCkgewo+ICsJCXByX2VycigiJXM6IGNyZWF0ZSBwYWNrZXQgZmFpbGVkLCAlZFxuIiwgX19m dW5jX18sIHJldCk7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCWxlbiA9IChwYWNrZXQuc2l6 ZSArIDMpICYgKH4weDMpOwo+ICsKPiArCWlmIChsZW4gPiB0eF9nZW0tPnNpemUpIHsKPiArCQlw cl9lcnIoIiVzOiBwYWNrZXQgc2l6ZSBpcyB0b28gYmlnXG4iLCBfX2Z1bmNfXyk7Cj4gKwkJcmV0 dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJZGF0YSA9IG1zbV9nZW1fdmFkZHIodHhfZ2VtKTsK PiArCj4gKwlpZiAoSVNfRVJSKGRhdGEpKSB7Cj4gKwkJcmV0ID0gUFRSX0VSUihkYXRhKTsKPiAr CQlwcl9lcnIoIiVzOiBnZXQgdmFkZHIgZmFpbGVkLCAlZFxuIiwgX19mdW5jX18sIHJldCk7Cj4g KwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwkvKiBNU00gc3BlY2lmaWMgY29tbWFuZCBmb3Jt YXQgaW4gbWVtb3J5ICovCj4gKwlkYXRhWzBdID0gcGFja2V0LmhlYWRlclsxXTsKPiArCWRhdGFb MV0gPSBwYWNrZXQuaGVhZGVyWzJdOwo+ICsJZGF0YVsyXSA9IHBhY2tldC5oZWFkZXJbMF07Cj4g KwlkYXRhWzNdID0gQklUKDcpOyAvKiBMYXN0IHBhY2tldCAqLwo+ICsJaWYgKG1pcGlfZHNpX3Bh Y2tldF9mb3JtYXRfaXNfbG9uZyhtc2ctPnR5cGUpKQo+ICsJCWRhdGFbM10gfD0gQklUKDYpOwo+ ICsJaWYgKG1zZy0+cnhfYnVmICYmIG1zZy0+cnhfbGVuKQo+ICsJCWRhdGFbM10gfD0gQklUKDUp Owo+ICsKPiArCS8qIExvbmcgcGFja2V0ICovCj4gKwlpZiAocGFja2V0LnBheWxvYWQgJiYgcGFj a2V0LnBheWxvYWRfbGVuZ3RoKQo+ICsJCW1lbWNweShkYXRhICsgNCwgcGFja2V0LnBheWxvYWQs IHBhY2tldC5wYXlsb2FkX2xlbmd0aCk7Cj4gKwo+ICsJLyogQXBwZW5kIDB4ZmYgdG8gdGhlIGVu ZCAqLwo+ICsJaWYgKHBhY2tldC5zaXplIDwgbGVuKQo+ICsJCW1lbXNldChkYXRhICsgcGFja2V0 LnNpemUsIDB4ZmYsIGxlbiAtIHBhY2tldC5zaXplKTsKPiArCj4gKwlyZXR1cm4gbGVuOwo+ICt9 Cj4gKwo+ICsvKgo+ICsgKiBkc2lfc2hvcnRfcmVhZDFfcmVzcDogMSBwYXJhbWV0ZXIKPiArICov Cj4gK3N0YXRpYyBpbnQgZHNpX3Nob3J0X3JlYWQxX3Jlc3AodTggKmJ1ZiwgY29uc3Qgc3RydWN0 IG1pcGlfZHNpX21zZyAqbXNnKQo+ICt7Cj4gKwl1OCAqZGF0YSA9IG1zZy0+cnhfYnVmOwo+ICsJ aWYgKGRhdGEgJiYgKG1zZy0+cnhfbGVuID49IDEpKSB7Cj4gKwkJKmRhdGEgPSBidWZbMV07IC8q IHN0cmlwIG91dCBkY3MgdHlwZSAqLwo+ICsJCXJldHVybiAxOwo+ICsJfSBlbHNlIHsKPiArCQlw cl9lcnIoIiVzOiByZWFkIGRhdGEgZG9lcyBub3QgbWF0Y2ggd2l0aCByeF9idWYgbGVuICVkXG4i LAo+ICsJCQlfX2Z1bmNfXywgbXNnLT5yeF9sZW4pOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJ fQo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBkc2lfc2hvcnRfcmVhZDJfcmVzcDogMiBwYXJhbWV0ZXIK PiArICovCj4gK3N0YXRpYyBpbnQgZHNpX3Nob3J0X3JlYWQyX3Jlc3AodTggKmJ1ZiwgY29uc3Qg c3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKQo+ICt7Cj4gKwl1OCAqZGF0YSA9IG1zZy0+cnhfYnVm Owo+ICsJaWYgKGRhdGEgJiYgKG1zZy0+cnhfbGVuID49IDIpKSB7Cj4gKwkJZGF0YVswXSA9IGJ1 ZlsxXTsgLyogc3RyaXAgb3V0IGRjcyB0eXBlICovCj4gKwkJZGF0YVsxXSA9IGJ1ZlsyXTsKPiAr CQlyZXR1cm4gMjsKPiArCX0gZWxzZSB7Cj4gKwkJcHJfZXJyKCIlczogcmVhZCBkYXRhIGRvZXMg bm90IG1hdGNoIHdpdGggcnhfYnVmIGxlbiAlZFxuIiwKPiArCQkJX19mdW5jX18sIG1zZy0+cnhf bGVuKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArfQo+ICsKPiArc3RhdGljIGludCBk c2lfbG9uZ19yZWFkX3Jlc3AodTggKmJ1ZiwgY29uc3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNn KQo+ICt7Cj4gKwkvKiBzdHJpcCBvdXQgNCBieXRlIGRjcyBoZWFkZXIgKi8KPiArCWlmIChtc2ct PnJ4X2J1ZiAmJiBtc2ctPnJ4X2xlbikKPiArCQltZW1jcHkobXNnLT5yeF9idWYsIGJ1ZiArIDQs IG1zZy0+cnhfbGVuKTsKPiArCj4gKwlyZXR1cm4gbXNnLT5yeF9sZW47Cj4gK30KPiArCj4gKwo+ ICtzdGF0aWMgaW50IGRzaV9jbWRfZG1hX3R4KHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0 LCBpbnQgbGVuKQo+ICt7Cj4gKwlpbnQgcmV0ID0gMDsKPiArCXUzMiBpb3ZhOwo+ICsJYm9vbCB0 cmlnZ2VyZWQ7Cj4gKwo+ICsJcmV0ID0gbXNtX2dlbV9nZXRfaW92YShtc21faG9zdC0+dHhfZ2Vt X29iaiwgMCwgJmlvdmEpOwo+ICsJaWYgKHJldCkgewo+ICsJCXByX2VycigiJXM6IGZhaWxlZCB0 byBnZXQgaW92YTogJWRcbiIsIF9fZnVuY19fLCByZXQpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9 Cj4gKwo+ICsJcmVpbml0X2NvbXBsZXRpb24oJm1zbV9ob3N0LT5kbWFfY29tcCk7Cj4gKwo+ICsJ ZHNpX3dhaXQ0dmlkZW9fZW5nX2J1c3kobXNtX2hvc3QpOwo+ICsKPiArCXRyaWdnZXJlZCA9IG1z bV9kc2lfbWFuYWdlcl9jbWRfeGZlcl90cmlnZ2VyKAo+ICsJCQkJCQltc21faG9zdC0+aWQsIGlv dmEsIGxlbik7Cj4gKwlpZiAodHJpZ2dlcmVkKSB7Cj4gKwkJcmV0ID0gd2FpdF9mb3JfY29tcGxl dGlvbl90aW1lb3V0KCZtc21faG9zdC0+ZG1hX2NvbXAsCj4gKwkJCQkJbXNlY3NfdG9famlmZmll cygyMDApKTsKPiArCQlEQkcoInJldD0lZCIsIHJldCk7Cj4gKwkJaWYgKHJldCA9PSAwKQo+ICsJ CQlyZXQgPSAtRVRJTUVET1VUOwo+ICsJCWVsc2UKPiArCQkJcmV0ID0gbGVuOwo+ICsJfSBlbHNl Cj4gKwkJcmV0ID0gbGVuOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgZHNpX2NtZF9kbWFfcngoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QsCj4gKwkJCXU4 ICpidWYsIGludCByeF9ieXRlLCBpbnQgcGt0X3NpemUpCj4gK3sKPiArCXUzMiAqbHAsICp0ZW1w LCBkYXRhOwo+ICsJaW50IGksIGogPSAwLCBjbnQ7Cj4gKwlib29sIGFja19lcnJvciA9IGZhbHNl Owo+ICsJdTMyIHJlYWRfY250Owo+ICsJdTggcmVnWzE2XTsKPiArCWludCByZXBlYXRlZF9ieXRl cyA9IDA7Cj4gKwlpbnQgYnVmX29mZnNldCA9IGJ1ZiAtIG1zbV9ob3N0LT5yeF9idWY7Cj4gKwo+ ICsJbHAgPSAodTMyICopYnVmOwo+ICsJdGVtcCA9ICh1MzIgKilyZWc7Cj4gKwljbnQgPSAocnhf Ynl0ZSArIDMpID4+IDI7Cj4gKwlpZiAoY250ID4gNCkKPiArCQljbnQgPSA0OyAvKiA0IHggMzIg Yml0cyByZWdpc3RlcnMgb25seSAqLwo+ICsKPiArCS8qIENhbGN1bGF0ZSByZWFsIHJlYWQgZGF0 YSBjb3VudCAqLwo+ICsJcmVhZF9jbnQgPSBkc2lfcmVhZChtc21faG9zdCwgMHgxZDQpID4+IDE2 Owo+ICsKPiArCWFja19lcnJvciA9IChyeF9ieXRlID09IDQpID8KPiArCQkocmVhZF9jbnQgPT0g OCkgOiAvKiBzaG9ydCBwa3QgKyA0LWJ5dGUgZXJyb3IgcGt0ICovCj4gKwkJKHJlYWRfY250ID09 IChwa3Rfc2l6ZSArIDYgKyA0KSk7IC8qIGxvbmcgcGt0KzQtYnl0ZSBlcnJvciBwa3QqLwo+ICsK PiArCWlmIChhY2tfZXJyb3IpCj4gKwkJcmVhZF9jbnQgLT0gNDsgLyogUmVtb3ZlIDQgYnl0ZSBl cnJvciBwa3QgKi8KPiArCj4gKwkvKgo+ICsJICogSW4gY2FzZSBvZiBtdWx0aXBsZSByZWFkcyBm cm9tIHRoZSBwYW5lbCwgYWZ0ZXIgdGhlIGZpcnN0IHJlYWQsIHRoZXJlCj4gKwkgKiBpcyBwb3Nz aWJpbGl0eSB0aGF0IHRoZXJlIGFyZSBzb21lIGJ5dGVzIGluIHRoZSBwYXlsb2FkIHJlcGVhdGlu ZyBpbgo+ICsJICogdGhlIFJEQktfREFUQSByZWdpc3RlcnMuIFNpbmNlIHdlIHJlYWQgYWxsIHRo ZSBwYXJhbWV0ZXJzIGZyb20gdGhlCj4gKwkgKiBwYW5lbCByaWdodCBmcm9tIHRoZSBmaXJzdCBi eXRlIGZvciBldmVyeSBwYXNzLiBXZSBuZWVkIHRvIHNraXAgdGhlCj4gKwkgKiByZXBlYXRpbmcg Ynl0ZXMgYW5kIHRoZW4gYXBwZW5kIHRoZSBuZXcgcGFyYW1ldGVycyB0byB0aGUgcnggYnVmZmVy Lgo+ICsJICovCj4gKwlpZiAocmVhZF9jbnQgPiAxNikgewo+ICsJCWludCBieXRlc19zaGlmdGVk Owo+ICsJCS8qIEFueSBkYXRhIG1vcmUgdGhhbiAxNiBieXRlcyB3aWxsIGJlIHNoaWZ0ZWQgb3V0 Lgo+ICsJCSAqIFRoZSB0ZW1wIHJlYWQgYnVmZmVyIHNob3VsZCBhbHJlYWR5IGNvbnRhaW4gdGhl c2UgYnl0ZXMuCj4gKwkJICogVGhlIHJlbWFpbmluZyBieXRlcyBpbiByZWFkIGJ1ZmZlciBhcmUg dGhlIHJlcGVhdGVkIGJ5dGVzLgo+ICsJCSAqLwo+ICsJCWJ5dGVzX3NoaWZ0ZWQgPSByZWFkX2Nu dCAtIDE2Owo+ICsJCXJlcGVhdGVkX2J5dGVzID0gYnVmX29mZnNldCAtIGJ5dGVzX3NoaWZ0ZWQ7 Cj4gKwl9Cj4gKwo+ICsJZm9yIChpID0gY250IC0gMTsgaSA+PSAwOyBpLS0pIHsKPiArCQlkYXRh ID0gZHNpX3JlYWQobXNtX2hvc3QsIFJFR19EU0lfUkRCS19EQVRBKGkpKTsKPiArCQkqdGVtcCsr ID0gbnRvaGwoZGF0YSk7IC8qIHRvIGhvc3QgYnl0ZSBvcmRlciAqLwo+ICsJCURCRygiZGF0YSA9 IDB4JXggYW5kIG50b2hsKGRhdGEpID0gMHgleFxuIiwgZGF0YSwgbnRvaGwoZGF0YSkpOwo+ICsJ fQo+ICsKPiArCWZvciAoaSA9IHJlcGVhdGVkX2J5dGVzOyBpIDwgMTY7IGkrKykKPiArCQlidWZb aisrXSA9IHJlZ1tpXTsKPiArCj4gKwlyZXR1cm4gajsKPiArfQo+ICsKPiArc3RhdGljIGludCBk c2lfY21kczJidWZfdHgoc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QsCj4gKwkJCQljb25z dCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2cpCj4gK3sKPiArCWludCBsZW4sIHJldDsKPiArCWlu dCBibGxwX2xlbiA9IG1zbV9ob3N0LT5tb2RlLT5oZGlzcGxheSAqCj4gKwkJCWRzaV9nZXRfYnBw KG1zbV9ob3N0LT5mb3JtYXQpIC8gODsKPiArCj4gKwlsZW4gPSBkc2lfY21kX2RtYV9hZGQobXNt X2hvc3QtPnR4X2dlbV9vYmosIG1zZyk7Cj4gKwlpZiAoIWxlbikgewo+ICsJCXByX2VycigiJXM6 IGZhaWxlZCB0byBhZGQgY21kIHR5cGUgPSAweCV4XG4iLAo+ICsJCQlfX2Z1bmNfXywgIG1zZy0+ dHlwZSk7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJLyogZm9yIHZpZGVvIG1v ZGUsIGRvIG5vdCBzZW5kIGNtZHMgbW9yZSB0aGFuCj4gKwkqIG9uZSBwaXhlbCBsaW5lLCBzaW5j ZSBpdCBvbmx5IHRyYW5zbWl0IGl0Cj4gKwkqIGR1cmluZyBCTExQLgo+ICsJKi8KPiArCS8qIFRP RE86IGlmIHRoZSBjb21tYW5kIGlzIHNlbnQgaW4gTFAgbW9kZSwgdGhlIGJpdCByYXRlIGlzIG9u bHkKPiArCSAqIGhhbGYgb2YgZXNjIGNsayByYXRlLiBJbiB0aGlzIGNhc2UsIGlmIHRoZSB2aWRl byBpcyBhbHJlYWR5Cj4gKwkgKiBhY3RpdmVseSBzdHJlYW1pbmcsIHdlIG5lZWQgdG8gY2hlY2sg bW9yZSBjYXJlZnVsbHkgaWYgdGhlCj4gKwkgKiBjb21tYW5kIGNhbiBiZSBmaXQgaW50byBvbmUg QkxMUC4KPiArCSAqLwo+ICsJaWYgKChtc21faG9zdC0+bW9kZV9mbGFncyAmIE1JUElfRFNJX01P REVfVklERU8pICYmIChsZW4gPiBibGxwX2xlbikpIHsKPiArCQlwcl9lcnIoIiVzOiBjbWQgY2Fu bm90IGZpdCBpbnRvIEJMTFAgcGVyaW9kLCBsZW49JWRcbiIsCj4gKwkJCV9fZnVuY19fLCBsZW4p Owo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCXJldCA9IGRzaV9jbWRfZG1hX3R4 KG1zbV9ob3N0LCBsZW4pOwo+ICsJaWYgKHJldCA8IGxlbikgewo+ICsJCXByX2VycigiJXM6IGNt ZCBkbWEgdHggZmFpbGVkLCB0eXBlPTB4JXgsIGRhdGEwPTB4JXgsIGxlbj0lZFxuIiwKPiArCQkJ X19mdW5jX18sIG1zZy0+dHlwZSwgKCoodTggKikobXNnLT50eF9idWYpKSwgbGVuKTsKPiArCQly ZXR1cm4gLUVDT01NOwo+ICsJfQo+ICsKPiArCXJldHVybiBsZW47Cj4gK30KPiArCj4gK3N0YXRp YyB2b2lkIGRzaV9zd19yZXNldF9yZXN0b3JlKHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0 KQo+ICt7Cj4gKwl1MzIgZGF0YTAsIGRhdGExOwo+ICsKPiArCWRhdGEwID0gZHNpX3JlYWQobXNt X2hvc3QsIFJFR19EU0lfQ1RSTCk7Cj4gKwlkYXRhMSA9IGRhdGEwOwo+ICsJZGF0YTEgJj0gfkRT SV9DVFJMX0VOQUJMRTsKPiArCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9DVFJMLCBkYXRh MSk7Cj4gKwkvKgo+ICsJICogZHNpIGNvbnRyb2xsZXIgbmVlZCB0byBiZSBkaXNhYmxlZCBiZWZv cmUKPiArCSAqIGNsb2NrcyB0dXJuZWQgb24KPiArCSAqLwo+ICsJd21iKCk7Cj4gKwo+ICsJZHNp X3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX0NMS19DVFJMLAo+ICsJCURTSV9DTEtfQ1RSTF9BSEJT X0hDTEtfT04gfCBEU0lfQ0xLX0NUUkxfQUhCTV9TQ0xLX09OIHwKPiArCQlEU0lfQ0xLX0NUUkxf UENMS19PTiB8IERTSV9DTEtfQ1RSTF9EU0lDTEtfT04gfAo+ICsJCURTSV9DTEtfQ1RSTF9CWVRF Q0xLX09OIHwgRFNJX0NMS19DVFJMX0VTQ0NMS19PTiB8Cj4gKwkJRFNJX0NMS19DVFJMX0ZPUkNF X09OX0RZTl9BSEJNX0hDTEspOwo+ICsJd21iKCk7CS8qIG1ha2Ugc3VyZSBjbG9ja3MgZW5hYmxl ZCAqLwo+ICsKPiArCS8qIGRzaSBjb250cm9sbGVyIGNhbiBvbmx5IGJlIHJlc2V0IHdoaWxlIGNs b2NrcyBhcmUgcnVubmluZyAqLwo+ICsJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX1JFU0VU LCAxKTsKPiArCXdtYigpOwkvKiBtYWtlIHN1cmUgcmVzZXQgaGFwcGVuICovCj4gKwlkc2lfd3Jp dGUobXNtX2hvc3QsIFJFR19EU0lfUkVTRVQsIDApOwo+ICsJd21iKCk7CS8qIGNvbnRyb2xsZXIg b3V0IG9mIHJlc2V0ICovCj4gKwlkc2lfd3JpdGUobXNtX2hvc3QsIFJFR19EU0lfQ1RSTCwgZGF0 YTApOwo+ICsJd21iKCk7CS8qIG1ha2Ugc3VyZSBkc2kgY29udHJvbGxlciBlbmFibGVkIGFnYWlu ICovCj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRzaV9lcnJfd29ya2VyKHN0cnVjdCB3b3JrX3N0 cnVjdCAqd29yaykKPiArewo+ICsJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPQo+ICsJ CWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXNtX2RzaV9ob3N0LCBlcnJfd29yayk7Cj4gKwl1 MzIgc3RhdHVzID0gbXNtX2hvc3QtPmVycl93b3JrX3N0YXRlOwo+ICsKPiArCXByX2VycigiJXM6 IHN0YXR1cz0leFxuIiwgX19mdW5jX18sIHN0YXR1cyk7Cj4gKwlpZiAoc3RhdHVzICYgRFNJX0VS Ul9TVEFURV9NRFBfRklGT19VTkRFUkZMT1cpCj4gKwkJZHNpX3N3X3Jlc2V0X3Jlc3RvcmUobXNt X2hvc3QpOwo+ICsKPiArCS8qIEl0IGlzIHNhZmUgdG8gY2xlYXIgaGVyZSBiZWNhdXNlIGVycm9y IGlycSBpcyBkaXNhYmxlZC4gKi8KPiArCW1zbV9ob3N0LT5lcnJfd29ya19zdGF0ZSA9IDA7Cj4g Kwo+ICsJLyogZW5hYmxlIGRzaSBlcnJvciBpbnRlcnJ1cHQgKi8KPiArCWRzaV9pbnRyX2N0cmwo bXNtX2hvc3QsIERTSV9JUlFfTUFTS19FUlJPUiwgMSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lk IGRzaV9hY2tfZXJyX3N0YXR1cyhzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKPiArewo+ ICsJdTMyIHN0YXR1czsKPiArCj4gKwlzdGF0dXMgPSBkc2lfcmVhZChtc21faG9zdCwgUkVHX0RT SV9BQ0tfRVJSX1NUQVRVUyk7Cj4gKwo+ICsJaWYgKHN0YXR1cykgewo+ICsJCWRzaV93cml0ZSht c21faG9zdCwgUkVHX0RTSV9BQ0tfRVJSX1NUQVRVUywgc3RhdHVzKTsKPiArCQkvKiBXcml0aW5n IG9mIGFuIGV4dHJhIDAgbmVlZGVkIHRvIGNsZWFyIGVycm9yIGJpdHMgKi8KPiArCQlkc2lfd3Jp dGUobXNtX2hvc3QsIFJFR19EU0lfQUNLX0VSUl9TVEFUVVMsIDApOwo+ICsJCW1zbV9ob3N0LT5l cnJfd29ya19zdGF0ZSB8PSBEU0lfRVJSX1NUQVRFX0FDSzsKPiArCX0KPiArfQo+ICsKPiArc3Rh dGljIHZvaWQgZHNpX3RpbWVvdXRfc3RhdHVzKHN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0 KQo+ICt7Cj4gKwl1MzIgc3RhdHVzOwo+ICsKPiArCXN0YXR1cyA9IGRzaV9yZWFkKG1zbV9ob3N0 LCBSRUdfRFNJX1RJTUVPVVRfU1RBVFVTKTsKPiArCj4gKwlpZiAoc3RhdHVzKSB7Cj4gKwkJZHNp X3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX1RJTUVPVVRfU1RBVFVTLCBzdGF0dXMpOwo+ICsJCW1z bV9ob3N0LT5lcnJfd29ya19zdGF0ZSB8PSBEU0lfRVJSX1NUQVRFX1RJTUVPVVQ7Cj4gKwl9Cj4g K30KPiArCj4gK3N0YXRpYyB2b2lkIGRzaV9kbG4wX3BoeV9lcnIoc3RydWN0IG1zbV9kc2lfaG9z dCAqbXNtX2hvc3QpCj4gK3sKPiArCXUzMiBzdGF0dXM7Cj4gKwo+ICsJc3RhdHVzID0gZHNpX3Jl YWQobXNtX2hvc3QsIFJFR19EU0lfRExOMF9QSFlfRVJSKTsKPiArCj4gKwlpZiAoc3RhdHVzKSB7 Cj4gKwkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX0RMTjBfUEhZX0VSUiwgc3RhdHVzKTsK PiArCQltc21faG9zdC0+ZXJyX3dvcmtfc3RhdGUgfD0gRFNJX0VSUl9TVEFURV9ETE4wX1BIWTsK PiArCX0KPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZHNpX2ZpZm9fc3RhdHVzKHN0cnVjdCBtc21f ZHNpX2hvc3QgKm1zbV9ob3N0KQo+ICt7Cj4gKwl1MzIgc3RhdHVzOwo+ICsKPiArCXN0YXR1cyA9 IGRzaV9yZWFkKG1zbV9ob3N0LCBSRUdfRFNJX0ZJRk9fU1RBVFVTKTsKPiArCj4gKwkvKiBmaWZv IHVuZGVyZmxvdywgb3ZlcmZsb3cgKi8KPiArCWlmIChzdGF0dXMpIHsKPiArCQlkc2lfd3JpdGUo bXNtX2hvc3QsIFJFR19EU0lfRklGT19TVEFUVVMsIHN0YXR1cyk7Cj4gKwkJbXNtX2hvc3QtPmVy cl93b3JrX3N0YXRlIHw9IERTSV9FUlJfU1RBVEVfRklGTzsKPiArCQlpZiAoc3RhdHVzICYgRFNJ X0ZJRk9fU1RBVFVTX0NNRF9NRFBfRklGT19VTkRFUkZMT1cpCj4gKwkJCW1zbV9ob3N0LT5lcnJf d29ya19zdGF0ZSB8PQo+ICsJCQkJCURTSV9FUlJfU1RBVEVfTURQX0ZJRk9fVU5ERVJGTE9XOwo+ ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkc2lfc3RhdHVzKHN0cnVjdCBtc21fZHNpX2hv c3QgKm1zbV9ob3N0KQo+ICt7Cj4gKwl1MzIgc3RhdHVzOwo+ICsKPiArCXN0YXR1cyA9IGRzaV9y ZWFkKG1zbV9ob3N0LCBSRUdfRFNJX1NUQVRVUzApOwo+ICsKPiArCWlmIChzdGF0dXMgJiBEU0lf U1RBVFVTMF9JTlRFUkxFQVZFX09QX0NPTlRFTlRJT04pIHsKPiArCQlkc2lfd3JpdGUobXNtX2hv c3QsIFJFR19EU0lfU1RBVFVTMCwgc3RhdHVzKTsKPiArCQltc21faG9zdC0+ZXJyX3dvcmtfc3Rh dGUgfD0KPiArCQkJRFNJX0VSUl9TVEFURV9JTlRFUkxFQVZFX09QX0NPTlRFTlRJT047Cj4gKwl9 Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRzaV9jbGtfc3RhdHVzKHN0cnVjdCBtc21fZHNpX2hv c3QgKm1zbV9ob3N0KQo+ICt7Cj4gKwl1MzIgc3RhdHVzOwo+ICsKPiArCXN0YXR1cyA9IGRzaV9y ZWFkKG1zbV9ob3N0LCBSRUdfRFNJX0NMS19TVEFUVVMpOwo+ICsKPiArCWlmIChzdGF0dXMgJiBE U0lfQ0xLX1NUQVRVU19QTExfVU5MT0NLRUQpIHsKPiArCQlkc2lfd3JpdGUobXNtX2hvc3QsIFJF R19EU0lfQ0xLX1NUQVRVUywgc3RhdHVzKTsKPiArCQltc21faG9zdC0+ZXJyX3dvcmtfc3RhdGUg fD0gRFNJX0VSUl9TVEFURV9QTExfVU5MT0NLRUQ7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyB2 b2lkIGRzaV9lcnJvcihzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9zdCkKPiArewo+ICsJLyog ZGlzYWJsZSBkc2kgZXJyb3IgaW50ZXJydXB0ICovCj4gKwlkc2lfaW50cl9jdHJsKG1zbV9ob3N0 LCBEU0lfSVJRX01BU0tfRVJST1IsIDApOwo+ICsKPiArCWRzaV9jbGtfc3RhdHVzKG1zbV9ob3N0 KTsKPiArCWRzaV9maWZvX3N0YXR1cyhtc21faG9zdCk7Cj4gKwlkc2lfYWNrX2Vycl9zdGF0dXMo bXNtX2hvc3QpOwo+ICsJZHNpX3RpbWVvdXRfc3RhdHVzKG1zbV9ob3N0KTsKPiArCWRzaV9zdGF0 dXMobXNtX2hvc3QpOwo+ICsJZHNpX2RsbjBfcGh5X2Vycihtc21faG9zdCk7Cj4gKwo+ICsJcXVl dWVfd29yayhtc21faG9zdC0+d29ya3F1ZXVlLCAmbXNtX2hvc3QtPmVycl93b3JrKTsKPiArfQo+ ICsKPiArc3RhdGljIGlycXJldHVybl90IGRzaV9ob3N0X2lycShpbnQgaXJxLCB2b2lkICpwdHIp Cj4gK3sKPiArCXN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0ID0gcHRyOwo+ICsJdTMyIGlz cjsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwo+ICsJaWYgKCFtc21faG9zdC0+Y3RybF9i YXNlKQo+ICsJCXJldHVybiBJUlFfSEFORExFRDsKPiArCj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgm bXNtX2hvc3QtPmludHJfbG9jaywgZmxhZ3MpOwo+ICsJaXNyID0gZHNpX3JlYWQobXNtX2hvc3Qs IFJFR19EU0lfSU5UUl9DVFJMKTsKPiArCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9JTlRS X0NUUkwsIGlzcik7Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21faG9zdC0+aW50cl9s b2NrLCBmbGFncyk7Cj4gKwo+ICsJREJHKCJpc3I9MHgleCwgaWQ9JWRcbiIsIGlzciwgbXNtX2hv c3QtPmlkKTsKPiArCj4gKwlpZiAoaXNyICYgRFNJX0lSUV9FUlJPUikKPiArCQlkc2lfZXJyb3Io bXNtX2hvc3QpOwo+ICsKPiArCWlmIChpc3IgJiBEU0lfSVJRX1ZJREVPX0RPTkUpCj4gKwkJY29t cGxldGUoJm1zbV9ob3N0LT52aWRlb19jb21wKTsKPiArCj4gKwlpZiAoaXNyICYgRFNJX0lSUV9D TURfRE1BX0RPTkUpCj4gKwkJY29tcGxldGUoJm1zbV9ob3N0LT5kbWFfY29tcCk7Cj4gKwo+ICsJ cmV0dXJuIElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ICtpbnQgZHNpX2hvc3RfYXR0YWNoKHN0cnVj dCBtaXBpX2RzaV9ob3N0ICpob3N0LAo+ICsJCQkJCXN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRz aSkKPiArewo+ICsJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPSB0b19tc21fZHNpX2hv c3QoaG9zdCk7Cj4gKwo+ICsJbXNtX2hvc3QtPmNoYW5uZWwgPSBkc2ktPmNoYW5uZWw7Cj4gKwlt c21faG9zdC0+bGFuZXMgPSBkc2ktPmxhbmVzOwo+ICsJbXNtX2hvc3QtPmZvcm1hdCA9IGRzaS0+ Zm9ybWF0Owo+ICsJbXNtX2hvc3QtPm1vZGVfZmxhZ3MgPSBkc2ktPm1vZGVfZmxhZ3M7Cj4gKwo+ ICsJbXNtX2hvc3QtPnBhbmVsX25vZGUgPSBkc2ktPmRldi5vZl9ub2RlOwo+ICsKPiArCURCRygi aWQ9JWQiLCBtc21faG9zdC0+aWQpOwo+ICsJaWYgKG1zbV9ob3N0LT5kZXYpCj4gKwkJZHJtX2hl bHBlcl9ocGRfaXJxX2V2ZW50KG1zbV9ob3N0LT5kZXYpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9 Cj4gKwo+ICtpbnQgZHNpX2hvc3RfZGV0YWNoKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAo+ ICsJCQkJCXN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRzaSkKPiArewo+ICsJc3RydWN0IG1zbV9k c2lfaG9zdCAqbXNtX2hvc3QgPSB0b19tc21fZHNpX2hvc3QoaG9zdCk7Cj4gKwo+ICsJbXNtX2hv c3QtPnBhbmVsX25vZGUgPSBOVUxMOwo+ICsKPiArCURCRygiaWQ9JWQiLCBtc21faG9zdC0+aWQp Owo+ICsJaWYgKG1zbV9ob3N0LT5kZXYpCj4gKwkJZHJtX2hlbHBlcl9ocGRfaXJxX2V2ZW50KG1z bV9ob3N0LT5kZXYpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzc2l6ZV90IGRzaV9o b3N0X3RyYW5zZmVyKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAo+ICsJCQkJCWNvbnN0IHN0 cnVjdCBtaXBpX2RzaV9tc2cgKm1zZykKPiArewo+ICsJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNt X2hvc3QgPSB0b19tc21fZHNpX2hvc3QoaG9zdCk7Cj4gKwlpbnQgcmV0ID0gLUVJTlZBTDsKPiAr Cj4gKwlpZiAoIW1zZyB8fCAhbXNtX2hvc3QtPnBvd2VyX29uKQo+ICsJCXJldHVybiAtRUlOVkFM Owo+ICsKPiArCW11dGV4X2xvY2soJm1zbV9ob3N0LT5jbWRfbXV0ZXgpOwo+ICsJcmV0ID0gbXNt X2RzaV9tYW5hZ2VyX2NtZF94ZmVyKG1zbV9ob3N0LT5pZCwgbXNnKTsKPiArCW11dGV4X3VubG9j aygmbXNtX2hvc3QtPmNtZF9tdXRleCk7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiAr c3RhdGljIHN0cnVjdCBtaXBpX2RzaV9ob3N0X29wcyBkc2lfaG9zdF9vcHMgPSB7Cj4gKwkuYXR0 YWNoID0gZHNpX2hvc3RfYXR0YWNoLAo+ICsJLmRldGFjaCA9IGRzaV9ob3N0X2RldGFjaCwKPiAr CS50cmFuc2ZlciA9IGRzaV9ob3N0X3RyYW5zZmVyLAo+ICt9Owo+ICsKPiAraW50IG1zbV9kc2lf aG9zdF9pbml0KHN0cnVjdCBtc21fZHNpICptc21fZHNpKQo+ICt7Cj4gKwlzdHJ1Y3QgbXNtX2Rz aV9ob3N0ICptc21faG9zdCA9IE5VTEw7Cj4gKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 ID0gbXNtX2RzaS0+cGRldjsKPiArCWludCByZXQgPSAwOwo+ICsKPiArCW1zbV9ob3N0ID0gZGV2 bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbXNtX2hvc3QpLCBHRlBfS0VSTkVMKTsKPiAr CWlmICghbXNtX2hvc3QpIHsKPiArCQlwcl9lcnIoIiVzOiBGQUlMRUQ6IGNhbm5vdCBhbGxvYyBk c2kgaG9zdFxuIiwKPiArCQkgICAgICAgX19mdW5jX18pOwo+ICsJCXJldCA9IC1FTk9NRU07Cj4g KwkJZ290byBmYWlsOwo+ICsJfQo+ICsKPiArCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBk ZXYtPmRldi5vZl9ub2RlLAo+ICsJCQkJImNlbGwtaW5kZXgiLCAmbXNtX2hvc3QtPmlkKTsKCnJl dHJpZXZpbmcgdGhlIGluc3RhbmNlIG51bWJlciBvZiBhIHBlcmlwaGVyYWwgdmlhIGEgRFQgcHJv cGVydHkgbGlrZSAKJ2NlbGwtaW5kZXgnIGhhcyBiZWVuIGRlYmF0ZWQgcXVpdGUgYSBiaXQgaW4g dGhlIHBhc3QuIEkgc3VwcG9zZSBpdCdzIApub3QgdGhlIGJlc3QgdGhpbmcgdG8gZG8uCgpIb3dl dmVyLCBzaW5jZSB0aGUgRFNJIGluc3RhbmNlcyBpbiBNRFNTIGFyZW4ndCBjb21wbGV0ZWx5IGlk ZW50aWNhbChvbmUgCmFjdHMgYSBtYXN0ZXIgYW5kIG90aGVyIHNsYXZlIGluIGR1YWwgZHNpIG1v ZGUpLCBtYXliZSB3ZSBjYW4gZ2V0IGF3YXkgCndpdGggaGF2aW5nIGEgcHJvcGVydHkgbGlrZSAi cWNvbSxkc2ktbWFzdGVyOyIsIGFuZCB0aGF0IGNhbiBiZSBmdXJ0aGVyIAp1c2VkIHRvIGlkZW50 aWZ5IHdoZXRoZXIgdGhpcyBub2RlIGlzIERTSV8wIG9yIERTSV8xCgo+ICsJaWYgKHJldCkgewo+ ICsJCWRldl9lcnIoJnBkZXYtPmRldiwKPiArCQkJIiVzOiBDZWxsLWluZGV4IG5vdCBzcGVjaWZp ZWQsIHJldD0lZFxuIiwKPiArCQkJX19mdW5jX18sIHJldCk7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7 Cj4gKwl9Cj4gKwltc21faG9zdC0+cGRldiA9IHBkZXY7Cj4gKwo+ICsJcmV0ID0gZHNpX2Nsa19p bml0KG1zbV9ob3N0KTsKPiArCWlmIChyZXQpIHsKPiArCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8g aW5pdGlhbGl6ZSBkc2kgY2xrc1xuIiwgX19mdW5jX18pOwo+ICsJCWdvdG8gZmFpbDsKPiArCX0K PiArCj4gKwlyZXQgPSBkc2lfZ3Bpb19pbml0KG1zbV9ob3N0KTsKPiArCWlmIChyZXQpIHsKPiAr CQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gaW5pdGlhbGl6ZSBkc2kgZ3Bpb3NcbiIsIF9fZnVuY19f KTsKPiArCQlnb3RvIGZhaWw7Cj4gKwl9Cj4gKwo+ICsJbXNtX2hvc3QtPmN0cmxfYmFzZSA9IG1z bV9pb3JlbWFwKHBkZXYsICJkc2lfY3RybCIsICJEU0kgQ1RSTCIpOwo+ICsJaWYgKElTX0VSUiht c21faG9zdC0+Y3RybF9iYXNlKSkgewo+ICsJCXByX2VycigiJXM6IHVuYWJsZSB0byBtYXAgRHNp IGN0cmwgYmFzZVxuIiwgX19mdW5jX18pOwo+ICsJCXJldCA9IFBUUl9FUlIobXNtX2hvc3QtPmN0 cmxfYmFzZSk7Cj4gKwkJZ290byBmYWlsOwo+ICsJfQo+ICsKPiArCW1zbV9ob3N0LT5jZmcgPSBk c2lfZ2V0X2NvbmZpZyhtc21faG9zdCk7Cj4gKwlpZiAoIW1zbV9ob3N0LT5jZmcpIHsKPiArCQly ZXQgPSAtRUlOVkFMOwo+ICsJCXByX2VycigiJXM6IGdldCBjb25maWcgZmFpbGVkXG4iLCBfX2Z1 bmNfXyk7Cj4gKwkJZ290byBmYWlsOwo+ICsJfQo+ICsKPiArCXJldCA9IGRzaV9yZWd1bGF0b3Jf aW5pdChtc21faG9zdCk7Cj4gKwlpZiAocmV0KQo+ICsJCWdvdG8gZmFpbDsKPiArCj4gKwltc21f aG9zdC0+cnhfYnVmID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIFNaXzRLLCBHRlBfS0VSTkVM KTsKPiArCWlmICghbXNtX2hvc3QtPnJ4X2J1Zikgewo+ICsJCXByX2VycigiJXM6IGFsbG9jIHJ4 IHRlbXAgYnVmIGZhaWxlZFxuIiwgX19mdW5jX18pOwo+ICsJCWdvdG8gZmFpbDsKPiArCX0KPiAr Cj4gKwlpbml0X2NvbXBsZXRpb24oJm1zbV9ob3N0LT5kbWFfY29tcCk7Cj4gKwlpbml0X2NvbXBs ZXRpb24oJm1zbV9ob3N0LT52aWRlb19jb21wKTsKPiArCW11dGV4X2luaXQoJm1zbV9ob3N0LT5k ZXZfbXV0ZXgpOwo+ICsJbXV0ZXhfaW5pdCgmbXNtX2hvc3QtPmNtZF9tdXRleCk7Cj4gKwltdXRl eF9pbml0KCZtc21faG9zdC0+Y2xrX211dGV4KTsKPiArCXNwaW5fbG9ja19pbml0KCZtc21faG9z dC0+aW50cl9sb2NrKTsKPiArCj4gKwkvKiBzZXR1cCB3b3JrcXVldWUgKi8KPiArCW1zbV9ob3N0 LT53b3JrcXVldWUgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgiZHNpX2RybV93b3JrIiwgMCk7 Cj4gKwlJTklUX1dPUksoJm1zbV9ob3N0LT5lcnJfd29yaywgZHNpX2Vycl93b3JrZXIpOwo+ICsK PiArCW1zbV9kc2ktPnBoeSA9IG1zbV9kc2lfcGh5X2luaXQocGRldiwgbXNtX2hvc3QtPmNmZy0+ cGh5X3R5cGUsCj4gKwkJCQkJbXNtX2hvc3QtPmlkKTsKPiArCWlmICghbXNtX2RzaS0+cGh5KSB7 Cj4gKwkJcHJfZXJyKCIlczogcGh5IGluaXQgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Cj4gKwkJZ290 byBmYWlsOwo+ICsJfQo+ICsJbXNtX2RzaS0+aG9zdCA9ICZtc21faG9zdC0+YmFzZTsKPiArCW1z bV9kc2ktPmlkID0gbXNtX2hvc3QtPmlkOwo+ICsKPiArCURCRygiRHNpIEhvc3QgJWQgaW5pdGlh bGl6ZWRcbiIsIG1zbV9ob3N0LT5pZCk7Cj4gKwlyZXR1cm4gMDsKPiArCj4gK2ZhaWw6Cj4gKwly ZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICt2b2lkIG1zbV9kc2lfaG9zdF9kZXN0cm95KHN0cnVjdCBt aXBpX2RzaV9ob3N0ICpob3N0KQo+ICt7Cj4gKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9z dCA9IHRvX21zbV9kc2lfaG9zdChob3N0KTsKPiArCj4gKwlEQkcoIiIpOwo+ICsJZHNpX3R4X2J1 Zl9mcmVlKG1zbV9ob3N0KTsKPiArCWlmIChtc21faG9zdC0+d29ya3F1ZXVlKSB7Cj4gKwkJZmx1 c2hfd29ya3F1ZXVlKG1zbV9ob3N0LT53b3JrcXVldWUpOwo+ICsJCWRlc3Ryb3lfd29ya3F1ZXVl KG1zbV9ob3N0LT53b3JrcXVldWUpOwo+ICsJCW1zbV9ob3N0LT53b3JrcXVldWUgPSBOVUxMOwo+ ICsJfQo+ICsKPiArCW11dGV4X2Rlc3Ryb3koJm1zbV9ob3N0LT5jbGtfbXV0ZXgpOwo+ICsJbXV0 ZXhfZGVzdHJveSgmbXNtX2hvc3QtPmNtZF9tdXRleCk7Cj4gKwltdXRleF9kZXN0cm95KCZtc21f aG9zdC0+ZGV2X211dGV4KTsKPiArfQo+ICsKPiAraW50IG1zbV9kc2lfaG9zdF9tb2Rlc2V0X2lu aXQoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCj4gKwkJCQkJc3RydWN0IGRybV9kZXZpY2Ug KmRldikKPiArewo+ICsJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPSB0b19tc21fZHNp X2hvc3QoaG9zdCk7Cj4gKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gbXNtX2hvc3Qt PnBkZXY7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCW1zbV9ob3N0LT5pcnEgPSBpcnFfb2ZfcGFyc2Vf YW5kX21hcChwZGV2LT5kZXYub2Zfbm9kZSwgMCk7Cj4gKwlpZiAobXNtX2hvc3QtPmlycSA8IDAp IHsKPiArCQlyZXQgPSBtc21faG9zdC0+aXJxOwo+ICsJCWRldl9lcnIoZGV2LT5kZXYsICJmYWls ZWQgdG8gZ2V0IGlycTogJWRcbiIsIHJldCk7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4g Kwo+ICsJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBtc21faG9zdC0+aXJxLAo+ ICsJCQlkc2lfaG9zdF9pcnEsIElSUUZfVFJJR0dFUl9ISUdIIHwgSVJRRl9PTkVTSE9ULAo+ICsJ CQkiZHNpX2lzciIsIG1zbV9ob3N0KTsKPiArCWlmIChyZXQgPCAwKSB7Cj4gKwkJZGV2X2Vycigm cGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgSVJRJXU6ICVkXG4iLAo+ICsJCQkJbXNtX2hv c3QtPmlycSwgcmV0KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCW1zbV9ob3N0LT5k ZXYgPSBkZXY7Cj4gKwlyZXQgPSBkc2lfdHhfYnVmX2FsbG9jKG1zbV9ob3N0LCBTWl80Syk7Cj4g KwlpZiAocmV0KSB7Cj4gKwkJcHJfZXJyKCIlczogYWxsb2MgdHggZ2VtIG9iaiBmYWlsZWQsICVk XG4iLCBfX2Z1bmNfXywgcmV0KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJldHVy biByZXQ7Cj4gK30KPiArCj4gK2ludCBtc21fZHNpX2hvc3RfcmVnaXN0ZXIoc3RydWN0IG1pcGlf ZHNpX2hvc3QgKmhvc3QsIGJvb2wgY2hlY2tfZGVmZXIpCj4gK3sKPiArCXN0cnVjdCBtc21fZHNp X2hvc3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOwo+ICsJc3RydWN0IGRldmlj ZV9ub2RlICpub2RlOwo+ICsJaW50IHJldDsKPiArCj4gKwkvKiBSZWdpc3RlciBtaXBpIGRzaSBo b3N0ICovCj4gKwlpZiAoIW1zbV9ob3N0LT5yZWdpc3RlcmVkKSB7Cj4gKwkJaG9zdC0+ZGV2ID0g Jm1zbV9ob3N0LT5wZGV2LT5kZXY7Cj4gKwkJaG9zdC0+b3BzID0gJmRzaV9ob3N0X29wczsKPiAr CQlyZXQgPSBtaXBpX2RzaV9ob3N0X3JlZ2lzdGVyKGhvc3QpOwo+ICsJCWlmIChyZXQpCj4gKwkJ CXJldHVybiByZXQ7Cj4gKwo+ICsJCW1zbV9ob3N0LT5yZWdpc3RlcmVkID0gdHJ1ZTsKPiArCj4g KwkJLyogSWYgdGhlIHBhbmVsIGRyaXZlciBoYXMgbm90IGJlZW4gcHJvYmVkIGFmdGVyIGhvc3Qg cmVnaXN0ZXIsCj4gKwkJICogd2Ugc2hvdWxkIGRlZmVyIHRoZSBob3N0J3MgcHJvYmUuCj4gKwkJ ICogSXQgbWFrZXMgc3VyZSBwYW5lbCBpcyBjb25uZWN0ZWQgd2hlbiBmYmNvbiBkZXRlY3RzCj4g KwkJICogY29ubmVjdG9yIHN0YXR1cyBhbmQgZ2V0cyB0aGUgcHJvcGVyIGRpc3BsYXkgbW9kZSB0 bwo+ICsJCSAqIGNyZWF0ZSBmcmFtZWJ1ZmZlci4KPiArCQkgKi8KPiArCQlpZiAoY2hlY2tfZGVm ZXIpIHsKPiArCQkJbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobXNtX2hvc3QtPnBkZXYtPmRldi5v Zl9ub2RlLAo+ICsJCQkJCQkicWNvbSxwYW5lbCIsIDApOwo+ICsJCQlpZiAobm9kZSkgewo+ICsJ CQkJaWYgKCFvZl9kcm1fZmluZF9wYW5lbChub2RlKSkKPiArCQkJCQlyZXR1cm4gLUVQUk9CRV9E RUZFUjsKPiArCQkJfQo+ICsJCX0KPiArCX0KCldlIG1pZ2h0IGhhdmUgdG8gZGVmZXIgcHJvYmUg bXVsdGlwbGUgdGltZXMgYmVmb3JlIGFub3RoZXIgZGVwZW5kZW5jeSBpcyAKbWV0LiBUaGUgYWJv dmUgYXBwcm9hY2ggd2lsbCBsZXQgdGhlIGRyaXZlciBkZWZlciBvbmx5IG9uY2Ugd2l0aG91dCB0 aGUgCnBhbmVsIGRyaXZlciByZWdpc3RlcmVkLiBEdXJpbmcgdGhlIHNlY29uZCBwcm9iZSBhdHRl bXB0LCB3ZSdkIGp1c3QgCnJldHVybiBzaW5jZSAnbXNtX2hvc3QtPnJlZ2lzdGVyZWQnIHdvdWxk IGJlIHRydWUuCgpJIHRoaW5rIHdlIGNvdWxkIG1vdmUgdGhpcyBjaGVjayB0byBlbmQgb2YgZHNp X2luaXQoKS4KCj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3ZvaWQgbXNtX2RzaV9ob3N0 X3VucmVnaXN0ZXIoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QpCj4gK3sKPiArCXN0cnVjdCBt c21fZHNpX2hvc3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOwo+ICsKPiArCWlm IChtc21faG9zdC0+cmVnaXN0ZXJlZCkgewo+ICsJCW1pcGlfZHNpX2hvc3RfdW5yZWdpc3Rlciho b3N0KTsKPiArCQlob3N0LT5kZXYgPSBOVUxMOwo+ICsJCWhvc3QtPm9wcyA9IE5VTEw7Cj4gKwkJ bXNtX2hvc3QtPnJlZ2lzdGVyZWQgPSBmYWxzZTsKPiArCX0KPiArfQo+ICsKPiAraW50IG1zbV9k c2lfaG9zdF94ZmVyX3ByZXBhcmUoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCj4gKwkJCQlj b25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2cpCj4gK3sKPiArCXN0cnVjdCBtc21fZHNpX2hv c3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOwo+ICsKPiArCS8qIFRPRE86IG1h a2Ugc3VyZSBkc2lfY21kX21kcCBpcyBpZGxlLgo+ICsJICogU2luY2UgRFNJNkcgdjEuMi4wLCB3 ZSBjYW4gc2V0IERTSV9UUklHX0NUUkwuQkxPQ0tfRE1BX1dJVEhJTl9GUkFNRQo+ICsJICogdG8g YXNrIEgvVyB0byB3YWl0IHVudGlsIGNtZCBtZHAgaXMgaWRsZS4gUy9XIHdhaXQgaXMgbm90IG5l ZWRlZC4KPiArCSAqIEhvdyB0byBoYW5kbGUgdGhlIG9sZCB2ZXJzaW9ucz8gV2FpdCBmb3IgbWRw IGNtZCBkb25lPwo+ICsJICovCj4gKwo+ICsJLyoKPiArCSAqIG1kc3MgaW50ZXJydXB0IGlzIGdl bmVyYXRlZCBpbiBtZHAgY29yZSBjbG9jayBkb21haW4KPiArCSAqIG1kcCBjbG9jayBuZWVkIHRv IGJlIGVuYWJsZWQgdG8gcmVjZWl2ZSBkc2kgaW50ZXJydXB0Cj4gKwkgKi8KPiArCWRzaV9jbGtf Y3RybChtc21faG9zdCwgMSk7Cj4gKwo+ICsJLyogVE9ETzogdm90ZSBmb3IgYnVzIGJhbmR3aWR0 aCAqLwo+ICsKPiArCWlmICghKG1zZy0+ZmxhZ3MgJiBNSVBJX0RTSV9NU0dfVVNFX0xQTSkpCj4g KwkJZHNpX3NldF90eF9wb3dlcl9tb2RlKDAsIG1zbV9ob3N0KTsKPiArCj4gKwltc21faG9zdC0+ ZG1hX2NtZF9jdHJsX3Jlc3RvcmUgPSBkc2lfcmVhZChtc21faG9zdCwgUkVHX0RTSV9DVFJMKTsK PiArCWRzaV93cml0ZShtc21faG9zdCwgUkVHX0RTSV9DVFJMLAo+ICsJCW1zbV9ob3N0LT5kbWFf Y21kX2N0cmxfcmVzdG9yZSB8Cj4gKwkJRFNJX0NUUkxfQ01EX01PREVfRU4gfAo+ICsJCURTSV9D VFJMX0VOQUJMRSk7Cj4gKwlkc2lfaW50cl9jdHJsKG1zbV9ob3N0LCBEU0lfSVJRX01BU0tfQ01E X0RNQV9ET05FLCAxKTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArdm9pZCBtc21fZHNp X2hvc3RfeGZlcl9yZXN0b3JlKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAo+ICsJCQkJY29u c3Qgc3RydWN0IG1pcGlfZHNpX21zZyAqbXNnKQo+ICt7Cj4gKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0 ICptc21faG9zdCA9IHRvX21zbV9kc2lfaG9zdChob3N0KTsKPiArCj4gKwlkc2lfaW50cl9jdHJs KG1zbV9ob3N0LCBEU0lfSVJRX01BU0tfQ01EX0RNQV9ET05FLCAwKTsKPiArCWRzaV93cml0ZSht c21faG9zdCwgUkVHX0RTSV9DVFJMLCBtc21faG9zdC0+ZG1hX2NtZF9jdHJsX3Jlc3RvcmUpOwo+ ICsKPiArCWlmICghKG1zZy0+ZmxhZ3MgJiBNSVBJX0RTSV9NU0dfVVNFX0xQTSkpCj4gKwkJZHNp X3NldF90eF9wb3dlcl9tb2RlKDEsIG1zbV9ob3N0KTsKPiArCj4gKwkvKiBUT0RPOiB1bnZvdGUg Zm9yIGJ1cyBiYW5kd2lkdGggKi8KPiArCj4gKwlkc2lfY2xrX2N0cmwobXNtX2hvc3QsIDApOwo+ ICt9Cj4gKwo+ICtpbnQgbXNtX2RzaV9ob3N0X2NtZF90eChzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAq aG9zdCwKPiArCQkJCWNvbnN0IHN0cnVjdCBtaXBpX2RzaV9tc2cgKm1zZykKPiArewo+ICsJc3Ry dWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hvc3QgPSB0b19tc21fZHNpX2hvc3QoaG9zdCk7Cj4gKwo+ ICsJcmV0dXJuIGRzaV9jbWRzMmJ1Zl90eChtc21faG9zdCwgbXNnKTsKPiArfQo+ICsKPiAraW50 IG1zbV9kc2lfaG9zdF9jbWRfcngoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCj4gKwkJCQlj b25zdCBzdHJ1Y3QgbWlwaV9kc2lfbXNnICptc2cpCj4gK3sKPiArCXN0cnVjdCBtc21fZHNpX2hv c3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOwo+ICsJaW50IGRhdGFfYnl0ZSwg cnhfYnl0ZSwgZGxlbiwgZW5kOwo+ICsJaW50IHNob3J0X3Jlc3BvbnNlLCBkaWZmLCBwa3Rfc2l6 ZSwgcmV0ID0gMDsKPiArCWNoYXIgY21kOwo+ICsJaW50IHJsZW4gPSBtc2ctPnJ4X2xlbjsKPiAr CXU4ICpidWY7Cj4gKwo+ICsJaWYgKHJsZW4gPD0gMikgewo+ICsJCXNob3J0X3Jlc3BvbnNlID0g MTsKPiArCQlwa3Rfc2l6ZSA9IHJsZW47Cj4gKwkJcnhfYnl0ZSA9IDQ7Cj4gKwl9IGVsc2Ugewo+ ICsJCXNob3J0X3Jlc3BvbnNlID0gMDsKPiArCQlkYXRhX2J5dGUgPSAxMDsJLyogZmlyc3QgcmVh ZCAqLwo+ICsJCWlmIChybGVuIDwgZGF0YV9ieXRlKQo+ICsJCQlwa3Rfc2l6ZSA9IHJsZW47Cj4g KwkJZWxzZQo+ICsJCQlwa3Rfc2l6ZSA9IGRhdGFfYnl0ZTsKPiArCQlyeF9ieXRlID0gZGF0YV9i eXRlICsgNjsgLyogNCBoZWFkZXIgKyAyIGNyYyAqLwo+ICsJfQo+ICsKPiArCWJ1ZiA9IG1zbV9o b3N0LT5yeF9idWY7Cj4gKwllbmQgPSAwOwo+ICsJd2hpbGUgKCFlbmQpIHsKPiArCQl1OCB0eFsy XSA9IHtwa3Rfc2l6ZSAmIDB4ZmYsIHBrdF9zaXplID4+IDh9Owo+ICsJCXN0cnVjdCBtaXBpX2Rz aV9tc2cgbWF4X3BrdF9zaXplX21zZyA9IHsKPiArCQkJLmNoYW5uZWwgPSBtc2ctPmNoYW5uZWws Cj4gKwkJCS50eXBlID0gTUlQSV9EU0lfU0VUX01BWElNVU1fUkVUVVJOX1BBQ0tFVF9TSVpFLAo+ ICsJCQkudHhfbGVuID0gMiwKPiArCQkJLnR4X2J1ZiA9IHR4LAo+ICsJCX07Cj4gKwo+ICsJCURC Rygicmxlbj0lZCBwa3Rfc2l6ZT0lZCByeF9ieXRlPSVkIiwKPiArCQkJcmxlbiwgcGt0X3NpemUs IHJ4X2J5dGUpOwo+ICsKPiArCQlyZXQgPSBkc2lfY21kczJidWZfdHgobXNtX2hvc3QsICZtYXhf cGt0X3NpemVfbXNnKTsKPiArCQlpZiAocmV0IDwgMikgewo+ICsJCQlwcl9lcnIoIiVzOiBTZXQg bWF4IHBrdCBzaXplIGZhaWxlZCwgJWRcbiIsCj4gKwkJCQlfX2Z1bmNfXywgcmV0KTsKPiArCQkJ cmV0dXJuIC1FSU5WQUw7Cj4gKwkJfQo+ICsKPiArCQlpZiAoKG1zbV9ob3N0LT5jZmctPm1ham9y ID09IE1TTV9EU0lfVkVSX01BSk9SXzZHKSAmJgo+ICsJCQkobXNtX2hvc3QtPmNmZy0+bWlub3Ig Pj0gTVNNX0RTSV82R19WRVJfTUlOT1JfVjFfMSkpIHsKPiArCQkJLyogQ2xlYXIgdGhlIFJEQktf REFUQSByZWdpc3RlcnMgKi8KPiArCQkJZHNpX3dyaXRlKG1zbV9ob3N0LCBSRUdfRFNJX1JEQktf REFUQV9DVFJMLAo+ICsJCQkJCURTSV9SREJLX0RBVEFfQ1RSTF9DTFIpOwo+ICsJCQl3bWIoKTsg LyogbWFrZSBzdXJlIHRoZSBSREJLIHJlZ2lzdGVycyBhcmUgY2xlYXJlZCAqLwo+ICsJCQlkc2lf d3JpdGUobXNtX2hvc3QsIFJFR19EU0lfUkRCS19EQVRBX0NUUkwsIDApOwo+ICsJCQl3bWIoKTsg LyogcmVsZWFzZSBjbGVhcmVkIHN0YXR1cyBiZWZvcmUgdHJhbnNmZXIgKi8KPiArCQl9Cj4gKwo+ ICsJCXJldCA9IGRzaV9jbWRzMmJ1Zl90eChtc21faG9zdCwgbXNnKTsKPiArCQlpZiAocmV0IDwg bXNnLT50eF9sZW4pIHsKPiArCQkJcHJfZXJyKCIlczogUmVhZCBjbWQgVHggZmFpbGVkLCAlZFxu IiwgX19mdW5jX18sIHJldCk7Cj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ICsKPiArCQkvKgo+ ICsJCSAqIG9uY2UgY21kX2RtYV9kb25lIGludGVycnVwdCByZWNlaXZlZCwKPiArCQkgKiByZXR1 cm4gZGF0YSBmcm9tIGNsaWVudCBpcyByZWFkeSBhbmQgc3RvcmVkCj4gKwkJICogYXQgUkRCS19E QVRBIHJlZ2lzdGVyIGFscmVhZHkKPiArCQkgKiBzaW5jZSByeCBmaWZvIGlzIDE2IGJ5dGVzLCBk Y3MgaGVhZGVyIGlzIGtlcHQgYXQgZmlyc3QgbG9vcCwKPiArCQkgKiBhZnRlciB0aGF0IGRjcyBo ZWFkZXIgbG9zdCBkdXJpbmcgc2hpZnQgaW50byByZWdpc3RlcnMKPiArCQkgKi8KPiArCQlkbGVu ID0gZHNpX2NtZF9kbWFfcngobXNtX2hvc3QsIGJ1ZiwgcnhfYnl0ZSwgcGt0X3NpemUpOwo+ICsK PiArCQlpZiAoZGxlbiA8PSAwKQo+ICsJCQlyZXR1cm4gMDsKPiArCj4gKwkJaWYgKHNob3J0X3Jl c3BvbnNlKQo+ICsJCQlicmVhazsKPiArCj4gKwkJaWYgKHJsZW4gPD0gZGF0YV9ieXRlKSB7Cj4g KwkJCWRpZmYgPSBkYXRhX2J5dGUgLSBybGVuOwo+ICsJCQllbmQgPSAxOwo+ICsJCX0gZWxzZSB7 Cj4gKwkJCWRpZmYgPSAwOwo+ICsJCQlybGVuIC09IGRhdGFfYnl0ZTsKPiArCQl9Cj4gKwo+ICsJ CWlmICghZW5kKSB7Cj4gKwkJCWRsZW4gLT0gMjsgLyogMiBjcmMgKi8KPiArCQkJZGxlbiAtPSBk aWZmOwo+ICsJCQlidWYgKz0gZGxlbjsJLyogbmV4dCBzdGFydCBwb3NpdGlvbiAqLwo+ICsJCQlk YXRhX2J5dGUgPSAxNDsJLyogTk9UIGZpcnN0IHJlYWQgKi8KPiArCQkJaWYgKHJsZW4gPCBkYXRh X2J5dGUpCj4gKwkJCQlwa3Rfc2l6ZSArPSBybGVuOwo+ICsJCQllbHNlCj4gKwkJCQlwa3Rfc2l6 ZSArPSBkYXRhX2J5dGU7Cj4gKwkJCURCRygiYnVmPSV4IGRsZW49JWQgZGlmZj0lZFxuIiwgKGlu dClidWYsIGRsZW4sIGRpZmYpOwo+ICsJCX0KPiArCX0KPiArCj4gKwkvKgo+ICsJICogRm9yIHNp bmdsZSBMb25nIHJlYWQsIGlmIHRoZSByZXF1ZXN0ZWQgcmxlbiA8IDEwLAo+ICsJICogd2UgbmVl ZCB0byBzaGlmdCB0aGUgc3RhcnQgcG9zaXRpb24gb2YgcngKPiArCSAqIGRhdGEgYnVmZmVyIHRv IHNraXAgdGhlIGJ5dGVzIHdoaWNoIGFyZSBub3QKPiArCSAqIHVwZGF0ZWQuCj4gKwkgKi8KPiAr CWlmIChwa3Rfc2l6ZSA8IDEwICYmICFzaG9ydF9yZXNwb25zZSkKPiArCQlidWYgPSBtc21faG9z dC0+cnhfYnVmICsgKDEwIC0gcmxlbik7Cj4gKwllbHNlCj4gKwkJYnVmID0gbXNtX2hvc3QtPnJ4 X2J1ZjsKPiArCj4gKwljbWQgPSBidWZbMF07Cj4gKwlzd2l0Y2ggKGNtZCkgewo+ICsJY2FzZSBN SVBJX0RTSV9SWF9BQ0tOT1dMRURHRV9BTkRfRVJST1JfUkVQT1JUOgo+ICsJCXByX2VycigiJXM6 IHJ4IEFDS19FUlJfUEFDTEFHRVxuIiwgX19mdW5jX18pOwo+ICsJCXJldCA9IDA7Cj4gKwljYXNl IE1JUElfRFNJX1JYX0dFTkVSSUNfU0hPUlRfUkVBRF9SRVNQT05TRV8xQllURToKPiArCWNhc2Ug TUlQSV9EU0lfUlhfRENTX1NIT1JUX1JFQURfUkVTUE9OU0VfMUJZVEU6Cj4gKwkJcmV0ID0gZHNp X3Nob3J0X3JlYWQxX3Jlc3AoYnVmLCBtc2cpOwo+ICsJCWJyZWFrOwo+ICsJY2FzZSBNSVBJX0RT SV9SWF9HRU5FUklDX1NIT1JUX1JFQURfUkVTUE9OU0VfMkJZVEU6Cj4gKwljYXNlIE1JUElfRFNJ X1JYX0RDU19TSE9SVF9SRUFEX1JFU1BPTlNFXzJCWVRFOgo+ICsJCXJldCA9IGRzaV9zaG9ydF9y ZWFkMl9yZXNwKGJ1ZiwgbXNnKTsKPiArCQlicmVhazsKPiArCWNhc2UgTUlQSV9EU0lfUlhfR0VO RVJJQ19MT05HX1JFQURfUkVTUE9OU0U6Cj4gKwljYXNlIE1JUElfRFNJX1JYX0RDU19MT05HX1JF QURfUkVTUE9OU0U6Cj4gKwkJcmV0ID0gZHNpX2xvbmdfcmVhZF9yZXNwKGJ1ZiwgbXNnKTsKPiAr CQlicmVhazsKPiArCWRlZmF1bHQ6Cj4gKwkJcHJfd2FybigiJXM6SW52YWxpZCByZXNwb25zZSBj bWRcbiIsIF9fZnVuY19fKTsKPiArCQlyZXQgPSAwOwo+ICsJfQo+ICsKPiArCXJldHVybiByZXQ7 Cj4gK30KPiArCj4gK3ZvaWQgbXNtX2RzaV9ob3N0X2NtZF94ZmVyX2NvbW1pdChzdHJ1Y3QgbWlw aV9kc2lfaG9zdCAqaG9zdCwgdTMyIGlvdmEsIHUzMiBsZW4pCj4gK3sKPiArCXN0cnVjdCBtc21f ZHNpX2hvc3QgKm1zbV9ob3N0ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOwo+ICsKPiArCWRzaV93 cml0ZShtc21faG9zdCwgUkVHX0RTSV9ETUFfQkFTRSwgaW92YSk7Cj4gKwlkc2lfd3JpdGUobXNt X2hvc3QsIFJFR19EU0lfRE1BX0xFTiwgbGVuKTsKPiArCWRzaV93cml0ZShtc21faG9zdCwgUkVH X0RTSV9UUklHX0RNQSwgMSk7Cj4gKwo+ICsJLyogTWFrZSBzdXJlIHRyaWdnZXIgaGFwcGVucyAq Lwo+ICsJd21iKCk7Cj4gK30KPiArCj4gK2ludCBtc21fZHNpX2hvc3RfZW5hYmxlKHN0cnVjdCBt aXBpX2RzaV9ob3N0ICpob3N0KQo+ICt7Cj4gKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21faG9z dCA9IHRvX21zbV9kc2lfaG9zdChob3N0KTsKPiArCj4gKwlkc2lfb3BfbW9kZV9jb25maWcobXNt X2hvc3QsCj4gKwkJISEobXNtX2hvc3QtPm1vZGVfZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVP KSwgdHJ1ZSk7Cj4gKwo+ICsJLyogVE9ETzogY2xvY2sgc2hvdWxkIGJlIHR1cm5lZCBvZmYgZm9y IGNvbW1hbmQgbW9kZSwKPiArCSAqIGFuZCBvbmx5IHR1cm5lZCBvbiBiZWZvcmUgTURQIFNUQVJU Lgo+ICsJICogVGhpcyBwYXJ0IG9mIGNvZGUgc2hvdWxkIGJlIGVuYWJsZWQgb25jZSBtZHAgZHJp dmVyIHN1cHBvcnQgaXQuCj4gKwkgKi8KPiArCS8qIGlmIChtc21fcGFuZWwtPm1vZGUgPT0gTVNN X0RTSV9DTURfTU9ERSkKPiArCQlkc2lfY2xrX2N0cmwobXNtX2hvc3QsIDApOyAqLwo+ICsKPiAr CXJldHVybiAwOwo+ICt9Cj4gKwo+ICtpbnQgbXNtX2RzaV9ob3N0X2Rpc2FibGUoc3RydWN0IG1p cGlfZHNpX2hvc3QgKmhvc3QpCj4gK3sKPiArCXN0cnVjdCBtc21fZHNpX2hvc3QgKm1zbV9ob3N0 ID0gdG9fbXNtX2RzaV9ob3N0KGhvc3QpOwo+ICsKPiArCWRzaV9vcF9tb2RlX2NvbmZpZyhtc21f aG9zdCwKPiArCQkhIShtc21faG9zdC0+bW9kZV9mbGFncyAmIE1JUElfRFNJX01PREVfVklERU8p LCBmYWxzZSk7Cj4gKwo+ICsJLyogU2luY2Ugd2UgaGF2ZSBkaXNhYmxlZCBJTlRGLCB0aGUgdmlk ZW8gZW5naW5lIHdvbid0IHN0b3Agc28gdGhhdAo+ICsJICogdGhlIGNtZCBlbmdpbmUgd2lsbCBi ZSBibG9ja2VkLgo+ICsJICogUmVzZXQgdG8gZGlzYWJsZSB2aWRlbyBlbmdpbmUgc28gdGhhdCB3 ZSBjYW4gc2VuZCBvZmYgY21kLgo+ICsJICovCj4gKwlkc2lfc3dfcmVzZXQobXNtX2hvc3QpOwo+ ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtpbnQgbXNtX2RzaV9ob3N0X3Bvd2VyX29uKHN0 cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0KQo+ICt7Cj4gKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICpt c21faG9zdCA9IHRvX21zbV9kc2lfaG9zdChob3N0KTsKPiArCXUzMiBjbGtfcHJlLCBjbGtfcG9z dDsKPiArCWludCByZXQgPSAwOwo+ICsKPiArCW11dGV4X2xvY2soJm1zbV9ob3N0LT5kZXZfbXV0 ZXgpOwo+ICsJaWYgKG1zbV9ob3N0LT5wb3dlcl9vbikgewo+ICsJCURCRygiZHNpIGhvc3QgYWxy ZWFkeSBvbiIpOwo+ICsJCWdvdG8gdW5sb2NrX3JldDsKPiArCX0KPiArCj4gKwlyZXQgPSBkc2lf Y2FsY19jbGtfcmF0ZShtc21faG9zdCk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJcHJfZXJyKCIlczog dW5hYmxlIHRvIGNhbGMgY2xrIHJhdGUsICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKPiArCQlnb3Rv IHVubG9ja19yZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gZHNpX2hvc3RfcmVndWxhdG9yX2VuYWJs ZShtc21faG9zdCk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJcHJfZXJyKCIlczpGYWlsZWQgdG8gZW5h YmxlIHZyZWdzLnJldD0lZFxuIiwKPiArCQkJX19mdW5jX18sIHJldCk7Cj4gKwkJZ290byB1bmxv Y2tfcmV0Owo+ICsJfQo+ICsKPiArCXJldCA9IGRzaV9idXNfY2xrX2VuYWJsZShtc21faG9zdCk7 Cj4gKwlpZiAocmV0KSB7Cj4gKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGVuYWJsZSBidXMgY2xv Y2tzLCAlZFxuIiwgX19mdW5jX18sIHJldCk7Cj4gKwkJZ290byBmYWlsX2Rpc2FibGVfcmVnOwo+ ICsJfQo+ICsKPiArCWRzaV9waHlfc3dfcmVzZXQobXNtX2hvc3QpOwo+ICsJcmV0ID0gbXNtX2Rz aV9tYW5hZ2VyX3BoeV9lbmFibGUobXNtX2hvc3QtPmlkLAo+ICsJCQkJCW1zbV9ob3N0LT5ieXRl X2Nsa19yYXRlICogOCwKPiArCQkJCQljbGtfZ2V0X3JhdGUobXNtX2hvc3QtPmVzY19jbGspLAo+ ICsJCQkJCSZjbGtfcHJlLCAmY2xrX3Bvc3QpOwo+ICsJZHNpX2J1c19jbGtfZGlzYWJsZShtc21f aG9zdCk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGVuYWJsZSBw aHksICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKPiArCQlnb3RvIGZhaWxfZGlzYWJsZV9yZWc7Cj4g Kwl9Cj4gKwo+ICsJcmV0ID0gZHNpX2Nsa19jdHJsKG1zbV9ob3N0LCAxKTsKPiArCWlmIChyZXQp IHsKPiArCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gZW5hYmxlIGNsb2Nrcy4gcmV0PSVkXG4iLCBf X2Z1bmNfXywgcmV0KTsKPiArCQlnb3RvIGZhaWxfZGlzYWJsZV9yZWc7Cj4gKwl9Cj4gKwo+ICsJ ZHNpX3RpbWluZ19zZXR1cChtc21faG9zdCk7Cj4gKwlkc2lfc3dfcmVzZXQobXNtX2hvc3QpOwo+ ICsJZHNpX2N0cmxfY29uZmlnKG1zbV9ob3N0LCB0cnVlLCBjbGtfcHJlLCBjbGtfcG9zdCk7Cj4g Kwo+ICsJaWYgKG1zbV9ob3N0LT5kaXNwX2VuX2dwaW8pCj4gKwkJZ3Bpb2Rfc2V0X3ZhbHVlKG1z bV9ob3N0LT5kaXNwX2VuX2dwaW8sIDEpOwo+ICsKPiArCW1zbV9ob3N0LT5wb3dlcl9vbiA9IHRy dWU7Cj4gKwltdXRleF91bmxvY2soJm1zbV9ob3N0LT5kZXZfbXV0ZXgpOwo+ICsKPiArCXJldHVy biByZXQ7Cj4gKwo+ICtmYWlsX2Rpc2FibGVfcmVnOgo+ICsJZHNpX2hvc3RfcmVndWxhdG9yX2Rp c2FibGUobXNtX2hvc3QpOwo+ICt1bmxvY2tfcmV0Ogo+ICsJbXV0ZXhfdW5sb2NrKCZtc21faG9z dC0+ZGV2X211dGV4KTsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK2ludCBtc21fZHNpX2hv c3RfcG93ZXJfb2ZmKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0KQo+ICt7Cj4gKwlzdHJ1Y3Qg bXNtX2RzaV9ob3N0ICptc21faG9zdCA9IHRvX21zbV9kc2lfaG9zdChob3N0KTsKPiArCWludCBy ZXQgPSAwOwo+ICsKPiArCW11dGV4X2xvY2soJm1zbV9ob3N0LT5kZXZfbXV0ZXgpOwo+ICsJaWYg KCFtc21faG9zdC0+cG93ZXJfb24pIHsKPiArCQlEQkcoImRzaSBob3N0IGFscmVhZHkgb2ZmIik7 Cj4gKwkJZ290byB1bmxvY2tfcmV0Owo+ICsJfQo+ICsKPiArCWRzaV9jdHJsX2NvbmZpZyhtc21f aG9zdCwgZmFsc2UsIDAsIDApOwo+ICsKPiArCWlmIChtc21faG9zdC0+ZGlzcF9lbl9ncGlvKQo+ ICsJCWdwaW9kX3NldF92YWx1ZShtc21faG9zdC0+ZGlzcF9lbl9ncGlvLCAwKTsKPiArCj4gKwlt c21fZHNpX21hbmFnZXJfcGh5X2Rpc2FibGUobXNtX2hvc3QtPmlkKTsKPiArCj4gKwlkc2lfY2xr X2N0cmwobXNtX2hvc3QsIDApOwo+ICsKPiArCWRzaV9ob3N0X3JlZ3VsYXRvcl9kaXNhYmxlKG1z bV9ob3N0KTsKPiArCj4gKwlEQkcoIi0iKTsKPiArCj4gKwltc21faG9zdC0+cG93ZXJfb24gPSBm YWxzZTsKPiArCj4gK3VubG9ja19yZXQ6Cj4gKwltdXRleF91bmxvY2soJm1zbV9ob3N0LT5kZXZf bXV0ZXgpOwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiAraW50IG1zbV9kc2lfaG9zdF9zZXRf ZGlzcGxheV9tb2RlKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAo+ICsJCQkJCXN0cnVjdCBk cm1fZGlzcGxheV9tb2RlICptb2RlKQo+ICt7Cj4gKwlzdHJ1Y3QgbXNtX2RzaV9ob3N0ICptc21f aG9zdCA9IHRvX21zbV9kc2lfaG9zdChob3N0KTsKPiArCj4gKwlpZiAobXNtX2hvc3QtPm1vZGUp IHsKPiArCQlkcm1fbW9kZV9kZXN0cm95KG1zbV9ob3N0LT5kZXYsIG1zbV9ob3N0LT5tb2RlKTsK PiArCQltc21faG9zdC0+bW9kZSA9IE5VTEw7Cj4gKwl9Cj4gKwo+ICsJbXNtX2hvc3QtPm1vZGUg PSBkcm1fbW9kZV9kdXBsaWNhdGUobXNtX2hvc3QtPmRldiwgbW9kZSk7Cj4gKwlpZiAoSVNfRVJS KG1zbV9ob3N0LT5tb2RlKSkgewo+ICsJCXByX2VycigiJXM6IGNhbm5vdCBkdXBsaWNhdGUgbW9k ZSIsIF9fZnVuY19fKTsKPiArCQlyZXR1cm4gUFRSX0VSUihtc21faG9zdC0+bW9kZSk7Cj4gKwl9 Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0cnVjdCBkcm1fcGFuZWwgKm1zbV9kc2lf aG9zdF9nZXRfcGFuZWwoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCj4gKwkJCQl1bnNpZ25l ZCBsb25nICpwYW5lbF9mbGFncykKPiArewo+ICsJc3RydWN0IG1zbV9kc2lfaG9zdCAqbXNtX2hv c3QgPSB0b19tc21fZHNpX2hvc3QoaG9zdCk7Cj4gKwlzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbDsK PiArCj4gKwlwYW5lbCA9IG9mX2RybV9maW5kX3BhbmVsKG1zbV9ob3N0LT5wYW5lbF9ub2RlKTsK PiArCWlmIChwYW5lbF9mbGFncykKPiArCQkJKnBhbmVsX2ZsYWdzID0gbXNtX2hvc3QtPm1vZGVf ZmxhZ3M7Cj4gKwo+ICsJcmV0dXJuIHBhbmVsOwo+ICt9Cj4gKwo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2lfbWFuYWdlci5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9k c2kvZHNpX21hbmFnZXIuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4u OGVhYTg4NQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9k c2lfbWFuYWdlci5jCj4gQEAgLTAsMCArMSw3MDYgQEAKPiArLyoKPiArICogQ29weXJpZ2h0IChj KSAyMDE1LCBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPiArICoK PiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl IGl0IGFuZC9vciBtb2RpZnkKPiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCj4gKyAqIG9ubHkgdmVyc2lvbiAyIGFz IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgo+ICsgKgo+ICsgKiBU aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwKPiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt cGxpZWQgd2FycmFudHkgb2YKPiArICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlICJtc21fa21zLmgi Cj4gKyNpbmNsdWRlICJkc2kuaCIKPiArCj4gK3N0cnVjdCBtc21fZHNpX21hbmFnZXIgewo+ICsJ c3RydWN0IG1zbV9kc2kgKmRzaVtEU0lfTUFYXTsKPiArCj4gKwlib29sIGlzX2R1YWxfcGFuZWw7 Cj4gKwlib29sIGlzX3N5bmNfbmVlZGVkOwo+ICsJaW50IG1hc3Rlcl9wYW5lbF9pZDsKPiArfTsK PiArCj4gK3N0YXRpYyBzdHJ1Y3QgbXNtX2RzaV9tYW5hZ2VyIG1zbV9kc2ltX2dsYjsKPiArCj4g KyNkZWZpbmUgSVNfRFVBTF9QQU5FTCgpCQkobXNtX2RzaW1fZ2xiLmlzX2R1YWxfcGFuZWwpCj4g KyNkZWZpbmUgSVNfU1lOQ19ORUVERUQoKQkobXNtX2RzaW1fZ2xiLmlzX3N5bmNfbmVlZGVkKQo+ ICsjZGVmaW5lIElTX01BU1RFUl9QQU5FTChpZCkJKG1zbV9kc2ltX2dsYi5tYXN0ZXJfcGFuZWxf aWQgPT0gaWQpCj4gKwo+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBtc21fZHNpICpkc2lfbWdyX2dl dF9kc2koaW50IGlkKQo+ICt7Cj4gKwlyZXR1cm4gbXNtX2RzaW1fZ2xiLmRzaVtpZF07Cj4gK30K PiArCj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1zbV9kc2kgKmRzaV9tZ3JfZ2V0X290aGVyX2Rz aShpbnQgaWQpCj4gK3sKPiArCXJldHVybiBtc21fZHNpbV9nbGIuZHNpWyhpZCArIDEpICUgRFNJ X01BWF07Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHNpX21ncl9wYXJzZV9kdWFsX3BhbmVsKHN0 cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGludCBpZCkKPiArewo+ICsJc3RydWN0IG1zbV9kc2lfbWFu YWdlciAqbXNtX2RzaW0gPSAmbXNtX2RzaW1fZ2xiOwo+ICsKPiArCS8qIFdlIGFzc3VtZSAyIGRz aSBub2RlcyBoYXZlIHRoZSBzYW1lIGluZm9ybWF0aW9uIG9mIGR1YWwtcGFuZWwgYW5kCj4gKwkg KiBzeW5jLW1vZGUsIGFuZCBvbmx5IG9uZSBub2RlIHNwZWNpZmllcyBtYXN0ZXIgaW4gY2FzZSBv ZiBkdWFsIG1vZGUuCj4gKwkgKi8KPiArCWlmICghbXNtX2RzaW0tPmlzX2R1YWxfcGFuZWwpCj4g KwkJbXNtX2RzaW0tPmlzX2R1YWxfcGFuZWwgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woCj4gKwkJ CQkJCW5wLCAicWNvbSxkdWFsLXBhbmVsLW1vZGUiKTsKPiArCj4gKwlpZiAobXNtX2RzaW0tPmlz X2R1YWxfcGFuZWwpIHsKPiArCQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAicWNvbSxt YXN0ZXItcGFuZWwiKSkKPiArCQkJbXNtX2RzaW0tPm1hc3Rlcl9wYW5lbF9pZCA9IGlkOwo+ICsJ CWlmICghbXNtX2RzaW0tPmlzX3N5bmNfbmVlZGVkKQo+ICsJCQltc21fZHNpbS0+aXNfc3luY19u ZWVkZWQgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woCj4gKwkJCQkJbnAsICJxY29tLHN5bmMtZHVh bC1wYW5lbCIpOwo+ICsJfQo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdHJ1Y3QgZHNp X2Nvbm5lY3RvciB7Cj4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBiYXNlOwo+ICsJaW50IGlkOwo+ ICt9Owo+ICsKPiArc3RydWN0IGRzaV9icmlkZ2Ugewo+ICsJc3RydWN0IGRybV9icmlkZ2UgYmFz ZTsKPiArCWludCBpZDsKPiArfTsKPiArCj4gKyNkZWZpbmUgdG9fZHNpX2Nvbm5lY3Rvcih4KSBj b250YWluZXJfb2YoeCwgc3RydWN0IGRzaV9jb25uZWN0b3IsIGJhc2UpCj4gKyNkZWZpbmUgdG9f ZHNpX2JyaWRnZSh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGRzaV9icmlkZ2UsIGJhc2UpCj4g Kwo+ICtzdGF0aWMgaW5saW5lIGludCBkc2lfbWdyX2Nvbm5lY3Rvcl9nZXRfaWQoc3RydWN0IGRy bV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiArewo+ICsJc3RydWN0IGRzaV9jb25uZWN0b3IgKmRz aV9jb25uZWN0b3IgPSB0b19kc2lfY29ubmVjdG9yKGNvbm5lY3Rvcik7Cj4gKwlyZXR1cm4gZHNp X2Nvbm5lY3Rvci0+aWQ7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHNpX21ncl9icmlkZ2VfZ2V0 X2lkKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCj4gK3sKPiArCXN0cnVjdCBkc2lfYnJpZGdl ICpkc2lfYnJpZGdlID0gdG9fZHNpX2JyaWRnZShicmlkZ2UpOwo+ICsJcmV0dXJuIGRzaV9icmlk Z2UtPmlkOwo+ICt9Cj4gKwo+ICtzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBkc2lf bWdyX2Nvbm5lY3Rvcl9kZXRlY3QoCj4gKwkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rv ciwgYm9vbCBmb3JjZSkKPiArewo+ICsJaW50IGlkID0gZHNpX21ncl9jb25uZWN0b3JfZ2V0X2lk KGNvbm5lY3Rvcik7Cj4gKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSA9IGRzaV9tZ3JfZ2V0X2Rz aShpZCk7Cj4gKwlzdHJ1Y3QgbXNtX2RzaSAqb3RoZXJfZHNpID0gZHNpX21ncl9nZXRfb3RoZXJf ZHNpKGlkKTsKPiArCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUgKnByaXYgPSBjb25uZWN0b3ItPmRl di0+ZGV2X3ByaXZhdGU7Cj4gKwlzdHJ1Y3QgbXNtX2ttcyAqa21zID0gcHJpdi0+a21zOwo+ICsK PiArCURCRygiaWQ9JWQiLCBpZCk7Cj4gKwlpZiAoIW1zbV9kc2ktPnBhbmVsKSB7Cj4gKwkJbXNt X2RzaS0+cGFuZWwgPSBtc21fZHNpX2hvc3RfZ2V0X3BhbmVsKG1zbV9kc2ktPmhvc3QsCj4gKwkJ CQkJCSZtc21fZHNpLT5wYW5lbF9mbGFncyk7Cj4gKwo+ICsJCS8qIFRoZXJlIGlzIG9ubHkgMSBw YW5lbCBpbiB0aGUgZ2xvYmFsIHBhbmVsIGxpc3QKPiArCQkgKiBmb3IgZHVhbCBwYW5lbCBtb2Rl LiBUaGVyZWZvcmUgc2xhdmUgZHNpIHNob3VsZCBnZXQKPiArCQkgKiB0aGUgZHJtX3BhbmVsIGlu c3RhbmNlIGZyb20gbWFzdGVyIGRzaSwgYW5kCj4gKwkJICoga2VlcCB1c2luZyB0aGUgcGFuZWwg ZmxhZ3MgZ290IGZyb20gdGhlIGN1cnJlbnQgRFNJIGxpbmsuCj4gKwkJICovCj4gKwkJaWYgKCFt c21fZHNpLT5wYW5lbCAmJiBJU19EVUFMX1BBTkVMKCkgJiYKPiArCQkJIUlTX01BU1RFUl9QQU5F TChpZCkgJiYgb3RoZXJfZHNpKQo+ICsJCQltc21fZHNpLT5wYW5lbCA9IG1zbV9kc2lfaG9zdF9n ZXRfcGFuZWwoCj4gKwkJCQkJb3RoZXJfZHNpLT5ob3N0LCBOVUxMKTsKPiArCj4gKwkJaWYgKG1z bV9kc2ktPnBhbmVsICYmIElTX0RVQUxfUEFORUwoKSkKPiArCQkJZHJtX29iamVjdF9hdHRhY2hf cHJvcGVydHkoJmNvbm5lY3Rvci0+YmFzZSwKPiArCQkJCWNvbm5lY3Rvci0+ZGV2LT5tb2RlX2Nv bmZpZy50aWxlX3Byb3BlcnR5LCAwKTsKPiArCj4gKwkJLyogU2V0IHNwbGl0IGRpc3BsYXkgaW5m byB0byBrbXMgb25seSBvbmNlICovCj4gKwkJaWYgKG1zbV9kc2ktPnBhbmVsICYmIElTX0RVQUxf UEFORUwoKSAmJgo+ICsJCQkoaWQgPT0gRFNJX0VOQ09ERVJfTUFTVEVSKSAmJiBvdGhlcl9kc2kp IHsKPiArCQkJaW50IHZpZF9lbmNfaWQgPSBNU01fRFNJX1ZJREVPX0VOQ09ERVJfSUQ7Cj4gKwkJ CWludCBjbWRfZW5jX2lkID0gTVNNX0RTSV9DTURfRU5DT0RFUl9JRDsKPiArCQkJYm9vbCB2aWRf cGFuZWwgPQo+ICsJCQkJbXNtX2RzaS0+cGFuZWxfZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVP Owo+ICsJCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSB2aWRfcGFuZWwgPwo+ICsJCQkJ bXNtX2RzaS0+YmFzZS5lbmNvZGVyc1t2aWRfZW5jX2lkXSA6Cj4gKwkJCQltc21fZHNpLT5iYXNl LmVuY29kZXJzW2NtZF9lbmNfaWRdOwo+ICsJCQlzdHJ1Y3QgZHJtX2VuY29kZXIgKnNsYXZlX2Vu YyA9IHZpZF9wYW5lbCA/Cj4gKwkJCQlvdGhlcl9kc2ktPmJhc2UuZW5jb2RlcnNbdmlkX2VuY19p ZF0gOgo+ICsJCQkJb3RoZXJfZHNpLT5iYXNlLmVuY29kZXJzW2NtZF9lbmNfaWRdOwo+ICsKPiAr CQkJaWYgKGttcy0+ZnVuY3MtPnNldF9zcGxpdF9kaXNwbGF5KQo+ICsJCQkJa21zLT5mdW5jcy0+ c2V0X3NwbGl0X2Rpc3BsYXkoa21zLCBlbmNvZGVyLAo+ICsJCQkJCQlzbGF2ZV9lbmMsICF2aWRf cGFuZWwpOwo+ICsJCQllbHNlCj4gKwkJCQlwcl9lcnIoIm1kcCBkb2VzIG5vdCBzdXBwb3J0IGR1 YWwgcGFuZWxcbiIpOwo+ICsJCX0KPiArCX0KPiArCj4gKwlyZXR1cm4gbXNtX2RzaS0+cGFuZWwg PyBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZCA6Cj4gKwkJY29ubmVjdG9yX3N0YXR1c19kaXNj b25uZWN0ZWQ7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRzaV9tZ3JfY29ubmVjdG9yX2Rlc3Ry b3koc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiArewo+ICsJREJHKCIiKTsKPiAr CWRybV9jb25uZWN0b3JfdW5yZWdpc3Rlcihjb25uZWN0b3IpOwo+ICsJZHJtX2Nvbm5lY3Rvcl9j bGVhbnVwKGNvbm5lY3Rvcik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRzaV9kdWFsX2Nvbm5l Y3Rvcl9maXhfbW9kZXMoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiArewo+ICsJ c3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsICptOwo+ICsKPiArCS8qIE9ubHkgc3VwcG9y dCBsZWZ0LXJpZ2h0IG1vZGUgKi8KPiArCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtb2RlLCBt LCAmY29ubmVjdG9yLT5wcm9iZWRfbW9kZXMsIGhlYWQpIHsKPiArCQltb2RlLT5jbG9jayA+Pj0g MTsKPiArCQltb2RlLT5oZGlzcGxheSA+Pj0gMTsKPiArCQltb2RlLT5oc3luY19zdGFydCA+Pj0g MTsKPiArCQltb2RlLT5oc3luY19lbmQgPj49IDE7Cj4gKwkJbW9kZS0+aHRvdGFsID4+PSAxOwo+ ICsJCWRybV9tb2RlX3NldF9uYW1lKG1vZGUpOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50 IGRzaV9kdWFsX2Nvbm5lY3Rvcl90aWxlX2luaXQoCj4gKwkJCXN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IsIGludCBpZCkKPiArewo+ICsJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1v ZGU7Cj4gKwkvKiBGYWtlIHRvcG9sb2d5IGlkICovCj4gKwljaGFyIHRvcG9faWRbOF0gPSB7J00n LCAnUycsICdNJywgJ0QnLCAnVScsICdEJywgJ1MnLCAnSSd9Owo+ICsKPiArCS8qIFVzZSB0aGUg Zmlyc3QgbW9kZSBvbmx5IGZvciBub3cgKi8KPiArCW1vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZj b25uZWN0b3ItPnByb2JlZF9tb2RlcywKPiArCQkJCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlLAo+ ICsJCQkJaGVhZCk7Cj4gKwlpZiAoIW1vZGUpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwo+ICsJ Y29ubmVjdG9yLT5oYXNfdGlsZSA9IHRydWU7Cj4gKwljb25uZWN0b3ItPnRpbGVfZ3JvdXAgPSBk cm1fbW9kZV9nZXRfdGlsZV9ncm91cCgKPiArCQkJCQljb25uZWN0b3ItPmRldiwgdG9wb19pZCk7 Cj4gKwlpZiAoIWNvbm5lY3Rvci0+dGlsZV9ncm91cCkKPiArCQljb25uZWN0b3ItPnRpbGVfZ3Jv dXAgPSBkcm1fbW9kZV9jcmVhdGVfdGlsZV9ncm91cCgKPiArCQkJCQljb25uZWN0b3ItPmRldiwg dG9wb19pZCk7Cj4gKwlpZiAoIWNvbm5lY3Rvci0+dGlsZV9ncm91cCkgewo+ICsJCXByX2Vycigi JXM6IGZhaWxlZCB0byBjcmVhdGUgdGlsZSBncm91cFxuIiwgX19mdW5jX18pOwo+ICsJCXJldHVy biAtRU5PTUVNOwo+ICsJfQo+ICsKPiArCWNvbm5lY3Rvci0+dGlsZV9pc19zaW5nbGVfbW9uaXRv ciA9IHRydWU7Cj4gKwo+ICsJLyogbW9kZSBoYXMgYmVlbiBmaXhlZCAqLwo+ICsJY29ubmVjdG9y LT50aWxlX2hfc2l6ZSA9IG1vZGUtPmhkaXNwbGF5Owo+ICsJY29ubmVjdG9yLT50aWxlX3Zfc2l6 ZSA9IG1vZGUtPnZkaXNwbGF5Owo+ICsKPiArCS8qIE9ubHkgc3VwcG9ydCBsZWZ0LXJpZ2h0IG1v ZGUgKi8KPiArCWNvbm5lY3Rvci0+bnVtX2hfdGlsZSA9IDI7Cj4gKwljb25uZWN0b3ItPm51bV92 X3RpbGUgPSAxOwo+ICsKPiArCWNvbm5lY3Rvci0+dGlsZV92X2xvYyA9IDA7Cj4gKwljb25uZWN0 b3ItPnRpbGVfaF9sb2MgPSAoaWQgPT0gRFNJX1JJR0hUKSA/IDEgOiAwOwo+ICsKPiArCXJldHVy biAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRzaV9tZ3JfY29ubmVjdG9yX2dldF9tb2Rlcyhz dHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ICt7Cj4gKwlpbnQgaWQgPSBkc2lfbWdy X2Nvbm5lY3Rvcl9nZXRfaWQoY29ubmVjdG9yKTsKPiArCXN0cnVjdCBtc21fZHNpICptc21fZHNp ID0gZHNpX21ncl9nZXRfZHNpKGlkKTsKPiArCXN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsID0gbXNt X2RzaS0+cGFuZWw7Cj4gKwlpbnQgcmV0LCBudW07Cj4gKwo+ICsJaWYgKCFwYW5lbCkKPiArCQly ZXR1cm4gMDsKPiArCj4gKwkvKiBTaW5jZSB3ZSBoYXZlIDIgY29ubmVjdG9ycywgYnV0IG9ubHkg MSBkcm1fcGFuZWwgaW4gZHVhbCBEU0kgbW9kZSwKPiArCSAqIHBhbmVsIHNob3VsZCBub3QgYXR0 YWNoIHRvIGFueSBjb25uZWN0b3IuCj4gKwkgKiBPbmx5IHRlbXBvcmFyaWx5IGF0dGFjaCBwYW5l bCB0byB0aGUgY3VycmVudCBjb25uZWN0b3IgaGVyZSwKPiArCSAqIHRvIGxldCBwYW5lbCBzZXQg bW9kZSB0byB0aGlzIGNvbm5lY3Rvci4KPiArCSAqLwo+ICsJZHJtX3BhbmVsX2F0dGFjaChwYW5l bCwgY29ubmVjdG9yKTsKPiArCW51bSA9IGRybV9wYW5lbF9nZXRfbW9kZXMocGFuZWwpOwo+ICsJ ZHJtX3BhbmVsX2RldGFjaChwYW5lbCk7Cj4gKwlpZiAoIW51bSkKPiArCQlyZXR1cm4gMDsKPiAr Cj4gKwlpZiAoSVNfRFVBTF9QQU5FTCgpKSB7Cj4gKwkJLyogcmVwb3J0IGhhbGYgcmVzb2x1dGlv biB0byB1c2VyICovCj4gKwkJZHNpX2R1YWxfY29ubmVjdG9yX2ZpeF9tb2Rlcyhjb25uZWN0b3Ip Owo+ICsJCXJldCA9IGRzaV9kdWFsX2Nvbm5lY3Rvcl90aWxlX2luaXQoY29ubmVjdG9yLCBpZCk7 Cj4gKwkJaWYgKHJldCkKPiArCQkJcmV0dXJuIHJldDsKPiArCQlyZXQgPSBkcm1fbW9kZV9jb25u ZWN0b3Jfc2V0X3RpbGVfcHJvcGVydHkoY29ubmVjdG9yKTsKPiArCQlpZiAocmV0KSB7Cj4gKwkJ CXByX2VycigiJXM6IHNldCB0aWxlIHByb3BlcnR5IGZhaWxlZCwgJWRcbiIsCj4gKwkJCQkJX19m dW5jX18sIHJldCk7Cj4gKwkJCXJldHVybiByZXQ7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldHVy biBudW07Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHNpX21ncl9jb25uZWN0b3JfbW9kZV92YWxp ZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAo+ICsJCQkJc3RydWN0IGRybV9kaXNw bGF5X21vZGUgKm1vZGUpCj4gK3sKPiArCWludCBpZCA9IGRzaV9tZ3JfY29ubmVjdG9yX2dldF9p ZChjb25uZWN0b3IpOwo+ICsJc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kgPSBkc2lfbWdyX2dldF9k c2koaWQpOwo+ICsJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0KPiArCQkobXNtX2RzaS0+ cGFuZWxfZmxhZ3MgJiBNSVBJX0RTSV9NT0RFX1ZJREVPKSA/Cj4gKwkJbXNtX2RzaS0+YmFzZS5l bmNvZGVyc1tNU01fRFNJX1ZJREVPX0VOQ09ERVJfSURdIDoKPiArCQltc21fZHNpLT5iYXNlLmVu Y29kZXJzW01TTV9EU0lfQ01EX0VOQ09ERVJfSURdOwoKTWF5YmUgeW91IGNvdWxkIG1ha2UgYSBo ZWxwZXIgJ21zbV9kc2lfZ2V0X2VuY29kZXIobXNtX2RzaSknIG91dCBvZiAKdGhpcz8gSXQgc2Vl bXMgdG8gYmUgdXNlZCBlbHNld2hlcmUgdG9vLgoKPiArCXN0cnVjdCBtc21fZHJtX3ByaXZhdGUg KnByaXYgPSBjb25uZWN0b3ItPmRldi0+ZGV2X3ByaXZhdGU7Cj4gKwlzdHJ1Y3QgbXNtX2ttcyAq a21zID0gcHJpdi0+a21zOwo+ICsJbG9uZyBhY3R1YWwsIHJlcXVlc3RlZDsKPiArCj4gKwlEQkco IiIpOwo+ICsJcmVxdWVzdGVkID0gMTAwMCAqIG1vZGUtPmNsb2NrOwo+ICsJYWN0dWFsID0ga21z LT5mdW5jcy0+cm91bmRfcGl4Y2xrKGttcywgcmVxdWVzdGVkLCBlbmNvZGVyKTsKPiArCj4gKwlE QkcoInJlcXVlc3RlZD0lbGQsIGFjdHVhbD0lbGQiLCByZXF1ZXN0ZWQsIGFjdHVhbCk7Cj4gKwlp ZiAoYWN0dWFsICE9IHJlcXVlc3RlZCkKPiArCQlyZXR1cm4gTU9ERV9DTE9DS19SQU5HRTsKPiAr Cj4gKwlyZXR1cm4gTU9ERV9PSzsKPiArfQo+ICsKPiArc3RhdGljIHN0cnVjdCBkcm1fZW5jb2Rl ciAqCj4gK2RzaV9tZ3JfY29ubmVjdG9yX2Jlc3RfZW5jb2RlcihzdHJ1Y3QgZHJtX2Nvbm5lY3Rv ciAqY29ubmVjdG9yKQo+ICt7Cj4gKwlpbnQgaWQgPSBkc2lfbWdyX2Nvbm5lY3Rvcl9nZXRfaWQo Y29ubmVjdG9yKTsKPiArCXN0cnVjdCBtc21fZHNpICptc21fZHNpID0gZHNpX21ncl9nZXRfZHNp KGlkKTsKPiArCj4gKwlEQkcoIiIpOwo+ICsJcmV0dXJuIChtc21fZHNpLT5wYW5lbF9mbGFncyAm IE1JUElfRFNJX01PREVfVklERU8pID8KPiArCQltc21fZHNpLT5iYXNlLmVuY29kZXJzW01TTV9E U0lfVklERU9fRU5DT0RFUl9JRF0gOgo+ICsJCW1zbV9kc2ktPmJhc2UuZW5jb2RlcnNbTVNNX0RT SV9DTURfRU5DT0RFUl9JRF07Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRzaV9tZ3JfYnJpZGdl X3ByZV9lbmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKPiArewo+ICsJaW50IGlkID0g ZHNpX21ncl9icmlkZ2VfZ2V0X2lkKGJyaWRnZSk7Cj4gKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2Rz aSA9IGRzaV9tZ3JfZ2V0X2RzaShpZCk7Cj4gKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaTEgPSBk c2lfbWdyX2dldF9kc2koRFNJXzEpOwo+ICsJc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QgPSBt c21fZHNpLT5ob3N0Owo+ICsJc3RydWN0IGRybV9wYW5lbCAqcGFuZWwgPSBtc21fZHNpLT5wYW5l bDsKPiArCWJvb2wgaXNfZHVhbF9wYW5lbCA9IElTX0RVQUxfUEFORUwoKTsKPiArCWludCByZXQ7 Cj4gKwo+ICsJREJHKCJpZD0lZCIsIGlkKTsKPiArCWlmICghcGFuZWwgfHwgKGlzX2R1YWxfcGFu ZWwgJiYgKERTSV8xID09IGlkKSkpCj4gKwkJcmV0dXJuOwo+ICsKPiArCXJldCA9IG1zbV9kc2lf aG9zdF9wb3dlcl9vbihob3N0KTsKPiArCWlmIChyZXQpIHsKPiArCQlwcl9lcnIoIiVzOiBwb3dl ciBvbiBob3N0ICVkIGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCBpZCwgcmV0KTsKPiArCQlnb3Rv IGhvc3Rfb25fZmFpbDsKPiArCX0KPiArCj4gKwlpZiAoaXNfZHVhbF9wYW5lbCAmJiBtc21fZHNp MSkgewo+ICsJCXJldCA9IG1zbV9kc2lfaG9zdF9wb3dlcl9vbihtc21fZHNpMS0+aG9zdCk7Cj4g KwkJaWYgKHJldCkgewo+ICsJCQlwcl9lcnIoIiVzOiBwb3dlciBvbiBob3N0MSBmYWlsZWQsICVk XG4iLAo+ICsJCQkJCQkJX19mdW5jX18sIHJldCk7Cj4gKwkJCWdvdG8gaG9zdDFfb25fZmFpbDsK PiArCQl9Cj4gKwl9Cj4gKwo+ICsJLyogQWx3YXlzIGNhbGwgcGFuZWwgZnVuY3Rpb25zIG9uY2Us IGJlY2F1c2UgZXZlbiBmb3IgZHVhbCBwYW5lbHMsCj4gKwkgKiB0aGVyZSBpcyBvbmx5IG9uZSBk cm1fcGFuZWwgaW5zdGFuY2UuCj4gKwkgKi8KPiArCXJldCA9IGRybV9wYW5lbF9wcmVwYXJlKHBh bmVsKTsKPiArCWlmIChyZXQpIHsKPiArCQlwcl9lcnIoIiVzOiBwcmVwYXJlIHBhbmVsICVkIGZh aWxlZCwgJWRcbiIsIF9fZnVuY19fLCBpZCwgcmV0KTsKPiArCQlnb3RvIHBhbmVsX3ByZXBfZmFp bDsKPiArCX0KPiArCj4gKwlyZXQgPSBtc21fZHNpX2hvc3RfZW5hYmxlKGhvc3QpOwo+ICsJaWYg KHJldCkgewo+ICsJCXByX2VycigiJXM6IGVuYWJsZSBob3N0ICVkIGZhaWxlZCwgJWRcbiIsIF9f ZnVuY19fLCBpZCwgcmV0KTsKPiArCQlnb3RvIGhvc3RfZW5fZmFpbDsKPiArCX0KPiArCj4gKwlp ZiAoaXNfZHVhbF9wYW5lbCAmJiBtc21fZHNpMSkgewo+ICsJCXJldCA9IG1zbV9kc2lfaG9zdF9l bmFibGUobXNtX2RzaTEtPmhvc3QpOwo+ICsJCWlmIChyZXQpIHsKPiArCQkJcHJfZXJyKCIlczog ZW5hYmxlIGhvc3QxIGZhaWxlZCwgJWRcbiIsIF9fZnVuY19fLCByZXQpOwo+ICsJCQlnb3RvIGhv c3QxX2VuX2ZhaWw7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCXJldCA9IGRybV9wYW5lbF9lbmFibGUo cGFuZWwpOwo+ICsJaWYgKHJldCkgewo+ICsJCXByX2VycigiJXM6IGVuYWJsZSBwYW5lbCAlZCBm YWlsZWQsICVkXG4iLCBfX2Z1bmNfXywgaWQsIHJldCk7Cj4gKwkJZ290byBwYW5lbF9lbl9mYWls Owo+ICsJfQo+ICsKPiArCXJldHVybjsKPiArCj4gK3BhbmVsX2VuX2ZhaWw6Cj4gKwlpZiAoaXNf ZHVhbF9wYW5lbCAmJiBtc21fZHNpMSkKPiArCQltc21fZHNpX2hvc3RfZGlzYWJsZShtc21fZHNp MS0+aG9zdCk7Cj4gK2hvc3QxX2VuX2ZhaWw6Cj4gKwltc21fZHNpX2hvc3RfZGlzYWJsZShob3N0 KTsKPiAraG9zdF9lbl9mYWlsOgo+ICsJZHJtX3BhbmVsX3VucHJlcGFyZShwYW5lbCk7Cj4gK3Bh bmVsX3ByZXBfZmFpbDoKPiArCWlmIChpc19kdWFsX3BhbmVsICYmIG1zbV9kc2kxKQo+ICsJCW1z bV9kc2lfaG9zdF9wb3dlcl9vZmYobXNtX2RzaTEtPmhvc3QpOwo+ICtob3N0MV9vbl9mYWlsOgo+ ICsJbXNtX2RzaV9ob3N0X3Bvd2VyX29mZihob3N0KTsKPiAraG9zdF9vbl9mYWlsOgo+ICsJcmV0 dXJuOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkc2lfbWdyX2JyaWRnZV9lbmFibGUoc3RydWN0 IGRybV9icmlkZ2UgKmJyaWRnZSkKPiArewo+ICsJREJHKCIiKTsKPiArfQo+ICsKPiArc3RhdGlj IHZvaWQgZHNpX21ncl9icmlkZ2VfZGlzYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ ICt7Cj4gKwlEQkcoIiIpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkc2lfbWdyX2JyaWRnZV9w b3N0X2Rpc2FibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKPiArewo+ICsJaW50IGlkID0g ZHNpX21ncl9icmlkZ2VfZ2V0X2lkKGJyaWRnZSk7Cj4gKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2Rz aSA9IGRzaV9tZ3JfZ2V0X2RzaShpZCk7Cj4gKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaTEgPSBk c2lfbWdyX2dldF9kc2koRFNJXzEpOwo+ICsJc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QgPSBt c21fZHNpLT5ob3N0Owo+ICsJc3RydWN0IGRybV9wYW5lbCAqcGFuZWwgPSBtc21fZHNpLT5wYW5l bDsKPiArCWJvb2wgaXNfZHVhbF9wYW5lbCA9IElTX0RVQUxfUEFORUwoKTsKPiArCWludCByZXQ7 Cj4gKwo+ICsJREJHKCJpZD0lZCIsIGlkKTsKPiArCj4gKwlpZiAoIXBhbmVsIHx8IChpc19kdWFs X3BhbmVsICYmIChEU0lfMSA9PSBpZCkpKQo+ICsJCXJldHVybjsKPiArCj4gKwlyZXQgPSBkcm1f cGFuZWxfZGlzYWJsZShwYW5lbCk7Cj4gKwlpZiAocmV0KQo+ICsJCXByX2VycigiJXM6IFBhbmVs ICVkIE9GRiBmYWlsZWQsICVkXG4iLCBfX2Z1bmNfXywgaWQsIHJldCk7Cj4gKwo+ICsJcmV0ID0g bXNtX2RzaV9ob3N0X2Rpc2FibGUoaG9zdCk7Cj4gKwlpZiAocmV0KQo+ICsJCXByX2VycigiJXM6 IGhvc3QgJWQgZGlzYWJsZSBmYWlsZWQsICVkXG4iLCBfX2Z1bmNfXywgaWQsIHJldCk7Cj4gKwo+ ICsJaWYgKGlzX2R1YWxfcGFuZWwgJiYgbXNtX2RzaTEpIHsKPiArCQlyZXQgPSBtc21fZHNpX2hv c3RfZGlzYWJsZShtc21fZHNpMS0+aG9zdCk7Cj4gKwkJaWYgKHJldCkKPiArCQkJcHJfZXJyKCIl czogaG9zdDEgZGlzYWJsZSBmYWlsZWQsICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKPiArCX0KPiAr Cj4gKwlyZXQgPSBkcm1fcGFuZWxfdW5wcmVwYXJlKHBhbmVsKTsKPiArCWlmIChyZXQpCj4gKwkJ cHJfZXJyKCIlczogUGFuZWwgJWQgdW5wcmVwYXJlIGZhaWxlZCwlZFxuIiwgX19mdW5jX18sIGlk LCByZXQpOwo+ICsKPiArCXJldCA9IG1zbV9kc2lfaG9zdF9wb3dlcl9vZmYoaG9zdCk7Cj4gKwlp ZiAocmV0KQo+ICsJCXByX2VycigiJXM6IGhvc3QgJWQgcG93ZXIgb2ZmIGZhaWxlZCwlZFxuIiwg X19mdW5jX18sIGlkLCByZXQpOwo+ICsKPiArCWlmIChpc19kdWFsX3BhbmVsICYmIG1zbV9kc2kx KSB7Cj4gKwkJcmV0ID0gbXNtX2RzaV9ob3N0X3Bvd2VyX29mZihtc21fZHNpMS0+aG9zdCk7Cj4g KwkJaWYgKHJldCkKPiArCQkJcHJfZXJyKCIlczogaG9zdDEgcG93ZXIgb2ZmIGZhaWxlZCwgJWRc biIsCj4gKwkJCQkJCQkJX19mdW5jX18sIHJldCk7Cj4gKwl9Cj4gK30KPiArCj4gK3N0YXRpYyB2 b2lkIGRzaV9tZ3JfYnJpZGdlX21vZGVfc2V0KHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4g KwkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCj4gKwkJc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgKmFkanVzdGVkX21vZGUpCj4gK3sKPiArCWludCBpZCA9IGRzaV9tZ3JfYnJpZGdlX2dl dF9pZChicmlkZ2UpOwo+ICsJc3RydWN0IG1zbV9kc2kgKm1zbV9kc2kgPSBkc2lfbWdyX2dldF9k c2koaWQpOwo+ICsJc3RydWN0IG1zbV9kc2kgKm90aGVyX2RzaSA9IGRzaV9tZ3JfZ2V0X290aGVy X2RzaShpZCk7Cj4gKwlzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCA9IG1zbV9kc2ktPmhvc3Q7 Cj4gKwlib29sIGlzX2R1YWxfcGFuZWwgPSBJU19EVUFMX1BBTkVMKCk7Cj4gKwo+ICsJREJHKCJz ZXQgbW9kZTogJWQ6XCIlc1wiICVkICVkICVkICVkICVkICVkICVkICVkICVkICVkIDB4JXggMHgl eCIsCj4gKwkJCW1vZGUtPmJhc2UuaWQsIG1vZGUtPm5hbWUsCj4gKwkJCW1vZGUtPnZyZWZyZXNo LCBtb2RlLT5jbG9jaywKPiArCQkJbW9kZS0+aGRpc3BsYXksIG1vZGUtPmhzeW5jX3N0YXJ0LAo+ ICsJCQltb2RlLT5oc3luY19lbmQsIG1vZGUtPmh0b3RhbCwKPiArCQkJbW9kZS0+dmRpc3BsYXks IG1vZGUtPnZzeW5jX3N0YXJ0LAo+ICsJCQltb2RlLT52c3luY19lbmQsIG1vZGUtPnZ0b3RhbCwK PiArCQkJbW9kZS0+dHlwZSwgbW9kZS0+ZmxhZ3MpOwo+ICsKPiArCWlmIChpc19kdWFsX3BhbmVs ICYmIChEU0lfMSA9PSBpZCkpCj4gKwkJcmV0dXJuOwo+ICsKPiArCW1zbV9kc2lfaG9zdF9zZXRf ZGlzcGxheV9tb2RlKGhvc3QsIGFkanVzdGVkX21vZGUpOwo+ICsJaWYgKGlzX2R1YWxfcGFuZWwg JiYgb3RoZXJfZHNpKQo+ICsJCW1zbV9kc2lfaG9zdF9zZXRfZGlzcGxheV9tb2RlKG90aGVyX2Rz aS0+aG9zdCwgYWRqdXN0ZWRfbW9kZSk7Cj4gK30KPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg ZHJtX2Nvbm5lY3Rvcl9mdW5jcyBkc2lfbWdyX2Nvbm5lY3Rvcl9mdW5jcyA9IHsKPiArCS5kcG1z ID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2RwbXMsCj4gKwkuZGV0ZWN0ID0gZHNpX21n cl9jb25uZWN0b3JfZGV0ZWN0LAo+ICsJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3Np bmdsZV9jb25uZWN0b3JfbW9kZXMsCj4gKwkuZGVzdHJveSA9IGRzaV9tZ3JfY29ubmVjdG9yX2Rl c3Ryb3ksCj4gKwkucmVzZXQgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfcmVzZXQsCj4g KwkuYXRvbWljX2R1cGxpY2F0ZV9zdGF0ZSA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9k dXBsaWNhdGVfc3RhdGUsCj4gKwkuYXRvbWljX2Rlc3Ryb3lfc3RhdGUgPSBkcm1fYXRvbWljX2hl bHBlcl9jb25uZWN0b3JfZGVzdHJveV9zdGF0ZSwKPiArfTsKPiArCj4gK3N0YXRpYyBjb25zdCBz dHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgZHNpX21ncl9jb25uX2hlbHBlcl9mdW5j cyA9IHsKPiArCS5nZXRfbW9kZXMgPSBkc2lfbWdyX2Nvbm5lY3Rvcl9nZXRfbW9kZXMsCj4gKwku bW9kZV92YWxpZCA9IGRzaV9tZ3JfY29ubmVjdG9yX21vZGVfdmFsaWQsCj4gKwkuYmVzdF9lbmNv ZGVyID0gZHNpX21ncl9jb25uZWN0b3JfYmVzdF9lbmNvZGVyLAo+ICt9Owo+ICsKPiArc3RhdGlj IGNvbnN0IHN0cnVjdCBkcm1fYnJpZGdlX2Z1bmNzIGRzaV9tZ3JfYnJpZGdlX2Z1bmNzID0gewo+ ICsJLnByZV9lbmFibGUgPSBkc2lfbWdyX2JyaWRnZV9wcmVfZW5hYmxlLAo+ICsJLmVuYWJsZSA9 IGRzaV9tZ3JfYnJpZGdlX2VuYWJsZSwKPiArCS5kaXNhYmxlID0gZHNpX21ncl9icmlkZ2VfZGlz YWJsZSwKPiArCS5wb3N0X2Rpc2FibGUgPSBkc2lfbWdyX2JyaWRnZV9wb3N0X2Rpc2FibGUsCj4g KwkubW9kZV9zZXQgPSBkc2lfbWdyX2JyaWRnZV9tb2RlX3NldCwKPiArfTsKPiArCj4gKy8qIGlu aXRpYWxpemUgY29ubmVjdG9yICovCj4gK3N0cnVjdCBkcm1fY29ubmVjdG9yICptc21fZHNpX21h bmFnZXJfY29ubmVjdG9yX2luaXQodTggaWQpCj4gK3sKPiArCXN0cnVjdCBtc21fZHNpICptc21f ZHNpID0gZHNpX21ncl9nZXRfZHNpKGlkKTsKPiArCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25u ZWN0b3IgPSBOVUxMOwo+ICsJc3RydWN0IGRzaV9jb25uZWN0b3IgKmRzaV9jb25uZWN0b3I7Cj4g KwlpbnQgcmV0Owo+ICsKPiArCWRzaV9jb25uZWN0b3IgPSBkZXZtX2t6YWxsb2MobXNtX2RzaS0+ ZGV2LT5kZXYsCj4gKwkJCQlzaXplb2YoKmRzaV9jb25uZWN0b3IpLCBHRlBfS0VSTkVMKTsKPiAr CWlmICghZHNpX2Nvbm5lY3Rvcikgewo+ICsJCXJldCA9IC1FTk9NRU07Cj4gKwkJZ290byBmYWls Owo+ICsJfQo+ICsKPiArCWRzaV9jb25uZWN0b3ItPmlkID0gaWQ7Cj4gKwo+ICsJY29ubmVjdG9y ID0gJmRzaV9jb25uZWN0b3ItPmJhc2U7Cj4gKwo+ICsJcmV0ID0gZHJtX2Nvbm5lY3Rvcl9pbml0 KG1zbV9kc2ktPmRldiwgY29ubmVjdG9yLAo+ICsJCQkmZHNpX21ncl9jb25uZWN0b3JfZnVuY3Ms IERSTV9NT0RFX0NPTk5FQ1RPUl9EU0kpOwo+ICsJaWYgKHJldCkKPiArCQlnb3RvIGZhaWw7Cj4g Kwo+ICsJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwgJmRzaV9tZ3JfY29ubl9o ZWxwZXJfZnVuY3MpOwo+ICsKPiArCS8qIEVuYWJsZSBIUEQgdG8gbGV0IGhwZCBldmVudCBpcyBo YW5kbGVkCj4gKwkgKiB3aGVuIHBhbmVsIGlzIGF0dGFjaGVkIHRvIHRoZSBob3N0Lgo+ICsJICov Cj4gKwljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9IUEQ7Cj4gKwo+ICsJ LyogRGlzcGxheSBkcml2ZXIgZG9lc24ndCBzdXBwb3J0IGludGVybGFjZSBub3cuICovCj4gKwlj b25uZWN0b3ItPmludGVybGFjZV9hbGxvd2VkID0gMDsKPiArCWNvbm5lY3Rvci0+ZG91Ymxlc2Nh bl9hbGxvd2VkID0gMDsKPiArCj4gKwlyZXQgPSBkcm1fY29ubmVjdG9yX3JlZ2lzdGVyKGNvbm5l Y3Rvcik7Cj4gKwlpZiAocmV0KQo+ICsJCWdvdG8gZmFpbDsKPiArCj4gKwlyZXR1cm4gY29ubmVj dG9yOwo+ICsKPiArZmFpbDoKPiArCWlmIChjb25uZWN0b3IpCj4gKwkJZHNpX21ncl9jb25uZWN0 b3JfZGVzdHJveShjb25uZWN0b3IpOwo+ICsKPiArCXJldHVybiBFUlJfUFRSKHJldCk7Cj4gK30K PiArCj4gKy8qIGluaXRpYWxpemUgYnJpZGdlICovCj4gK3N0cnVjdCBkcm1fYnJpZGdlICptc21f ZHNpX21hbmFnZXJfYnJpZGdlX2luaXQodTggaWQpCj4gK3sKPiArCXN0cnVjdCBtc21fZHNpICpt c21fZHNpID0gZHNpX21ncl9nZXRfZHNpKGlkKTsKPiArCXN0cnVjdCBkcm1fYnJpZGdlICpicmlk Z2UgPSBOVUxMOwo+ICsJc3RydWN0IGRzaV9icmlkZ2UgKmRzaV9icmlkZ2U7Cj4gKwlpbnQgcmV0 Owo+ICsKPiArCWRzaV9icmlkZ2UgPSBkZXZtX2t6YWxsb2MobXNtX2RzaS0+ZGV2LT5kZXYsCj4g KwkJCQlzaXplb2YoKmRzaV9icmlkZ2UpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghZHNpX2JyaWRn ZSkgewo+ICsJCXJldCA9IC1FTk9NRU07Cj4gKwkJZ290byBmYWlsOwo+ICsJfQo+ICsKPiArCWRz aV9icmlkZ2UtPmlkID0gaWQ7Cj4gKwo+ICsJYnJpZGdlID0gJmRzaV9icmlkZ2UtPmJhc2U7Cj4g KwlicmlkZ2UtPmZ1bmNzID0gJmRzaV9tZ3JfYnJpZGdlX2Z1bmNzOwo+ICsKPiArCXJldCA9IGRy bV9icmlkZ2VfYXR0YWNoKG1zbV9kc2ktPmRldiwgYnJpZGdlKTsKPiArCWlmIChyZXQpCj4gKwkJ Z290byBmYWlsOwo+ICsKPiArCXJldHVybiBicmlkZ2U7Cj4gKwo+ICtmYWlsOgo+ICsJaWYgKGJy aWRnZSkKPiArCQltc21fZHNpX21hbmFnZXJfYnJpZGdlX2Rlc3Ryb3koYnJpZGdlKTsKPiArCj4g KwlyZXR1cm4gRVJSX1BUUihyZXQpOwo+ICt9Cj4gKwo+ICt2b2lkIG1zbV9kc2lfbWFuYWdlcl9i cmlkZ2VfZGVzdHJveShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ICt7Cj4gK30KPiArCj4g K2ludCBtc21fZHNpX21hbmFnZXJfcGh5X2VuYWJsZShpbnQgaWQsCj4gKwkJY29uc3QgdW5zaWdu ZWQgbG9uZyBiaXRfcmF0ZSwgY29uc3QgdW5zaWduZWQgbG9uZyBlc2NfcmF0ZSwKPiArCQl1MzIg KmNsa19wcmUsIHUzMiAqY2xrX3Bvc3QpCj4gK3sKPiArCXN0cnVjdCBtc21fZHNpICptc21fZHNp ID0gZHNpX21ncl9nZXRfZHNpKGlkKTsKPiArCXN0cnVjdCBtc21fZHNpX3BoeSAqcGh5ID0gbXNt X2RzaS0+cGh5Owo+ICsJaW50IHJldDsKPiArCj4gKwlyZXQgPSBtc21fZHNpX3BoeV9lbmFibGUo cGh5LCBJU19EVUFMX1BBTkVMKCksIGJpdF9yYXRlLCBlc2NfcmF0ZSk7Cj4gKwlpZiAocmV0KQo+ ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJbXNtX2RzaS0+cGh5X2VuYWJsZWQgPSB0cnVlOwo+ICsJ bXNtX2RzaV9waHlfZ2V0X2Nsa19wcmVfcG9zdChwaHksIGNsa19wcmUsIGNsa19wb3N0KTsKPiAr Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArdm9pZCBtc21fZHNpX21hbmFnZXJfcGh5X2Rpc2Fi bGUoaW50IGlkKQo+ICt7Cj4gKwlzdHJ1Y3QgbXNtX2RzaSAqbXNtX2RzaSA9IGRzaV9tZ3JfZ2V0 X2RzaShpZCk7Cj4gKwlzdHJ1Y3QgbXNtX2RzaSAqbWRzaSA9IGRzaV9tZ3JfZ2V0X2RzaShEU0lf Q0xPQ0tfTUFTVEVSKTsKPiArCXN0cnVjdCBtc21fZHNpICpzZHNpID0gZHNpX21ncl9nZXRfZHNp KERTSV9DTE9DS19TTEFWRSk7Cj4gKwlzdHJ1Y3QgbXNtX2RzaV9waHkgKnBoeSA9IG1zbV9kc2kt PnBoeTsKPiArCj4gKwkvKiBkaXNhYmxlIERTSSBwaHkKPiArCSAqIEluIGR1YWwtZHNpIGNvbmZp Z3VyYXRpb24sIHRoZSBwaHkgc2hvdWxkIGJlIGRpc2FibGVkIGZvciB0aGUKPiArCSAqIGZpcnN0 IGNvbnRyb2xsZXIgb25seSB3aGVuIHRoZSBzZWNvbmQgY29udHJvbGxlciBpcyBkaXNhYmxlZC4K PiArCSAqLwo+ICsJbXNtX2RzaS0+cGh5X2VuYWJsZWQgPSBmYWxzZTsKPiArCWlmIChJU19EVUFM X1BBTkVMKCkgJiYgbWRzaSAmJiBzZHNpKSB7Cj4gKwkJaWYgKCFtZHNpLT5waHlfZW5hYmxlZCAm JiAhc2RzaS0+cGh5X2VuYWJsZWQpIHsKPiArCQkJbXNtX2RzaV9waHlfZGlzYWJsZShzZHNpLT5w aHkpOwo+ICsJCQltc21fZHNpX3BoeV9kaXNhYmxlKG1kc2ktPnBoeSk7Cj4gKwkJfQo+ICsJfSBl bHNlIHsKPiArCQltc21fZHNpX3BoeV9kaXNhYmxlKHBoeSk7Cj4gKwl9Cj4gK30KPiArCj4gK2lu dCBtc21fZHNpX21hbmFnZXJfY21kX3hmZXIoaW50IGlkLCBjb25zdCBzdHJ1Y3QgbWlwaV9kc2lf bXNnICptc2cpCj4gK3sKPiArCXN0cnVjdCBtc21fZHNpICptc21fZHNpID0gZHNpX21ncl9nZXRf ZHNpKGlkKTsKPiArCXN0cnVjdCBtc21fZHNpICptc21fZHNpMCA9IGRzaV9tZ3JfZ2V0X2RzaShE U0lfMCk7Cj4gKwlzdHJ1Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCA9IG1zbV9kc2ktPmhvc3Q7Cj4g Kwlib29sIGlzX3JlYWQgPSAobXNnLT5yeF9idWYgJiYgbXNnLT5yeF9sZW4pOwo+ICsJYm9vbCBu ZWVkX3N5bmMgPSAoSVNfU1lOQ19ORUVERUQoKSAmJiAhaXNfcmVhZCk7Cj4gKwlpbnQgcmV0Owo+ ICsKPiArCWlmICghbXNnLT50eF9idWYgfHwgIW1zZy0+dHhfbGVuKQo+ICsJCXJldHVybiAwOwo+ ICsKPiArCS8qIEluIGR1YWwgbWFzdGVyIGNhc2UsIHBhbmVsIHJlcXVpcmVzIHRoZSBzYW1lIGNv bW1hbmRzIHNlbnQgdG8KPiArCSAqIGJvdGggRFNJIGxpbmtzLiBIb3N0IGlzc3VlcyB0aGUgY29t bWFuZCB0cmlnZ2VyIHRvIGJvdGggbGlua3MKPiArCSAqIHdoZW4gRFNJXzEgY2FsbHMgdGhlIGNt ZCB0cmFuc2ZlciBmdW5jdGlvbiwgbm8gbWF0dGVyIGl0IGhhcHBlbnMKPiArCSAqIGJlZm9yZSBv ciBhZnRlciBEU0lfMCBjbWQgdHJhbnNmZXIuCj4gKwkgKi8KPiArCWlmIChuZWVkX3N5bmMgJiYg KGlkID09IERTSV8wKSkKPiArCQlyZXR1cm4gaXNfcmVhZCA/IG1zZy0+cnhfbGVuIDogbXNnLT50 eF9sZW47Cj4gKwo+ICsJaWYgKG5lZWRfc3luYyAmJiBtc21fZHNpMCkgewo+ICsJCXJldCA9IG1z bV9kc2lfaG9zdF94ZmVyX3ByZXBhcmUobXNtX2RzaTAtPmhvc3QsIG1zZyk7Cj4gKwkJaWYgKHJl dCkgewo+ICsJCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcHJlcGFyZSBub24tdHJpZ2dlciBob3N0 LCAlZFxuIiwKPiArCQkJCV9fZnVuY19fLCByZXQpOwo+ICsJCQlyZXR1cm4gcmV0Owo+ICsJCX0K PiArCX0KPiArCXJldCA9IG1zbV9kc2lfaG9zdF94ZmVyX3ByZXBhcmUoaG9zdCwgbXNnKTsKPiAr CWlmIChyZXQpIHsKPiArCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcHJlcGFyZSBob3N0LCAlZFxu IiwgX19mdW5jX18sIHJldCk7Cj4gKwkJZ290byByZXN0b3JlX2hvc3QwOwo+ICsJfQo+ICsKPiAr CXJldCA9IGlzX3JlYWQgPyBtc21fZHNpX2hvc3RfY21kX3J4KGhvc3QsIG1zZykgOgo+ICsJCQlt c21fZHNpX2hvc3RfY21kX3R4KGhvc3QsIG1zZyk7Cj4gKwo+ICsJbXNtX2RzaV9ob3N0X3hmZXJf cmVzdG9yZShob3N0LCBtc2cpOwo+ICsKPiArcmVzdG9yZV9ob3N0MDoKPiArCWlmIChuZWVkX3N5 bmMgJiYgbXNtX2RzaTApCj4gKwkJbXNtX2RzaV9ob3N0X3hmZXJfcmVzdG9yZShtc21fZHNpMC0+ aG9zdCwgbXNnKTsKPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtib29sIG1zbV9kc2lf bWFuYWdlcl9jbWRfeGZlcl90cmlnZ2VyKGludCBpZCwgdTMyIGlvdmEsIHUzMiBsZW4pCj4gK3sK PiArCXN0cnVjdCBtc21fZHNpICptc21fZHNpID0gZHNpX21ncl9nZXRfZHNpKGlkKTsKPiArCXN0 cnVjdCBtc21fZHNpICptc21fZHNpMCA9IGRzaV9tZ3JfZ2V0X2RzaShEU0lfMCk7Cj4gKwlzdHJ1 Y3QgbWlwaV9kc2lfaG9zdCAqaG9zdCA9IG1zbV9kc2ktPmhvc3Q7Cj4gKwo+ICsJaWYgKElTX1NZ TkNfTkVFREVEKCkgJiYgKGlkID09IERTSV8wKSkKPiArCQlyZXR1cm4gZmFsc2U7Cj4gKwo+ICsJ aWYgKElTX1NZTkNfTkVFREVEKCkgJiYgbXNtX2RzaTApCj4gKwkJbXNtX2RzaV9ob3N0X2NtZF94 ZmVyX2NvbW1pdChtc21fZHNpMC0+aG9zdCwgaW92YSwgbGVuKTsKPiArCj4gKwltc21fZHNpX2hv c3RfY21kX3hmZXJfY29tbWl0KGhvc3QsIGlvdmEsIGxlbik7Cj4gKwo+ICsJcmV0dXJuIHRydWU7 Cj4gK30KPiArCj4gK2ludCBtc21fZHNpX21hbmFnZXJfcmVnaXN0ZXIoc3RydWN0IG1zbV9kc2kg Km1zbV9kc2kpCj4gK3sKPiArCXN0cnVjdCBtc21fZHNpX21hbmFnZXIgKm1zbV9kc2ltID0gJm1z bV9kc2ltX2dsYjsKPiArCWludCBpZCA9IG1zbV9kc2ktPmlkOwo+ICsJc3RydWN0IG1zbV9kc2kg Km90aGVyX2RzaSA9IGRzaV9tZ3JfZ2V0X290aGVyX2RzaShpZCk7Cj4gKwlpbnQgcmV0Owo+ICsK PiArCWlmIChpZCA+IERTSV9NQVgpIHsKPiArCQlwcl9lcnIoIiVzOiBpbnZhbGlkIGlkICVkXG4i LCBfX2Z1bmNfXywgaWQpOwo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCWlmICht c21fZHNpbS0+ZHNpW2lkXSkgewo+ICsJCXByX2VycigiJXM6IGRzaSVkIGFscmVhZHkgcmVnaXN0 ZXJlZFxuIiwgX19mdW5jX18sIGlkKTsKPiArCQlyZXR1cm4gLUVCVVNZOwo+ICsJfQo+ICsKPiAr CW1zbV9kc2ltLT5kc2lbaWRdID0gbXNtX2RzaTsKPiArCj4gKwlyZXQgPSBkc2lfbWdyX3BhcnNl X2R1YWxfcGFuZWwobXNtX2RzaS0+cGRldi0+ZGV2Lm9mX25vZGUsIGlkKTsKPiArCWlmIChyZXQp IHsKPiArCQlwcl9lcnIoIiVzOiBmYWlsZWQgdG8gcGFyc2UgZHVhbCBwYW5lbCBpbmZvXG4iLCBf X2Z1bmNfXyk7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlpZiAoIUlTX0RVQUxfUEFO RUwoKSkgewo+ICsJCXJldCA9IG1zbV9kc2lfaG9zdF9yZWdpc3Rlcihtc21fZHNpLT5ob3N0LCB0 cnVlKTsKPiArCX0gZWxzZSBpZiAoIW90aGVyX2RzaSkgewo+ICsJCXJldHVybiAwOwo+ICsJfSBl bHNlIHsKPiArCQlzdHJ1Y3QgbXNtX2RzaSAqbWRzaSA9IElTX01BU1RFUl9QQU5FTChpZCkgPwo+ ICsJCQkJCW1zbV9kc2kgOiBvdGhlcl9kc2k7Cj4gKwkJc3RydWN0IG1zbV9kc2kgKnNkc2kgPSBJ U19NQVNURVJfUEFORUwoaWQpID8KPiArCQkJCQlvdGhlcl9kc2kgOiBtc21fZHNpOwo+ICsJCS8q IFJlZ2lzdGVyIHNsYXZlIGhvc3QgZmlyc3QsIHNvIHRoYXQgc2xhdmUgRFNJIGRldmljZQo+ICsJ CSAqIGhhcyBhIGNoYW5jZSB0byBwcm9iZSwgYW5kIGRvIG5vdCBibG9jayB0aGUgbWFzdGVyCj4g KwkJICogRFNJIGRldmljZSdzIHByb2JlLgo+ICsJCSAqIEFsc28sIGRvIG5vdCBjaGVjayBkZWZl ciBmb3IgdGhlIHNsYXZlIGhvc3QsCj4gKwkJICogYmVjYXVzZSBvbmx5IG1hc3RlciBEU0kgZGV2 aWNlIGFkZHMgdGhlIHBhbmVsIHRvIGdsb2JhbAo+ICsJCSAqIHBhbmVsIGxpc3QuIFRoZSBwYW5l bCdzIGRldmljZSBpcyB0aGUgbWFzdGVyIERTSSBkZXZpY2UuCj4gKwkJICovCj4gKwkJcmV0ID0g bXNtX2RzaV9ob3N0X3JlZ2lzdGVyKHNkc2ktPmhvc3QsIGZhbHNlKTsKPiArCQlpZiAocmV0KQo+ ICsJCQlyZXR1cm4gcmV0Owo+ICsJCXJldCA9IG1zbV9kc2lfaG9zdF9yZWdpc3RlcihtZHNpLT5o b3N0LCB0cnVlKTsKPiArCX0KPiArCj4gKwlyZXR1cm4gcmV0Owo+ICt9CgpUaGUgZHVhbCBwYW5l bCBjaGVja3MgaW4gdGhlc2UgZnVuY3Rpb25zIGFyZSBxdWl0ZSBpbnRydXNpdmUgYXQgdGhlIApt b21lbnQuIFdlJ2QgdXNlIERTSSBsYXRlciB3aGVyZSB0aGVyZSB3b24ndCBiZSBhIHBhbmVsIGF0 IGFsbC4gVGhhdCAKd291bGQgcmVzdWx0IGluIGV2ZXIgbW9yZSBjb21wbGljYXRlZCBjaGVja3Mu CgpJcyBpdCBwb3NzaWJsZSB0byBzZXBhcmF0ZSBvdXQgdGhlIGR1YWwgcGFuZWwgZnVuY3Rpb25h bGl0eSBzdWNoIHRoYXQgaXQgCmJlY29tZXMgY2xlYW5lcj8KCkZvciBleGFtcGxlIG1zbV9kc2lf bWFuYWdlcl9waHlfZGlzYWJsZSBjYW4gbG9vayBsaWtlOgoKdm9pZCBtc21fZHNpX21hbmFnZXJf cGh5X2Rpc2FibGUoaW50IGlkKQp7CgkuLi4KCS4uLgoKCWlmIChtc21fZHVhbF9kc2lfbW9kZSgp KQoJCW1zbV9kdWFsX2RzaV9waHlfZGlzYWJsZShpZCk7CgllbHNlCgkJbXNtX2RzaV9waHlfZGlz YWJsZShwaHkpOwoKCS4uLgp9CgpUaGVyZSBtaWdodCBiZSByZXBldGl0aW9uIG9mIHNvbWUgY29k ZSBiZXR3ZWVuIHRoZSBub3JtYWwgYW5kIGR1YWwgbW9kZSAKY2FzZSwgYnV0IGl0IHdpbGwgbWFr ZSB0aGluZ3MgcXVpdGUgbGVnaWJsZS4KCj4gKwo+ICt2b2lkIG1zbV9kc2lfbWFuYWdlcl91bnJl Z2lzdGVyKHN0cnVjdCBtc21fZHNpICptc21fZHNpKQo+ICt7Cj4gKwlzdHJ1Y3QgbXNtX2RzaV9t YW5hZ2VyICptc21fZHNpbSA9ICZtc21fZHNpbV9nbGI7Cj4gKwo+ICsJbXNtX2RzaV9ob3N0X3Vu cmVnaXN0ZXIobXNtX2RzaS0+aG9zdCk7Cj4gKwltc21fZHNpbS0+ZHNpW21zbV9kc2ktPmlkXSA9 IE5VTEw7Cj4gK30KPiArCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2Rz aV9waHkuYyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZHNpL2RzaV9waHkuYwo+IG5ldyBmaWxlIG1v ZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uZjBjZWE4OQo+IC0tLSAvZGV2L251bGwKPiArKysg Yi9kcml2ZXJzL2dwdS9kcm0vbXNtL2RzaS9kc2lfcGh5LmMKPiBAQCAtMCwwICsxLDM1MiBAQAo+ ICsvKgo+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwg cmlnaHRzIHJlc2VydmVkLgo+ICsgKgo+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQo+ICsgKiBpdCB1bmRlciB0 aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQK PiArICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb24uCj4gKyAqCj4gKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAo+ICsgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+ICsgKiBNRVJDSEFOVEFC SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCj4gKyAq IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCj4gKyAqLwo+ICsK PiArI2luY2x1ZGUgImRzaS5oIgo+ICsjaW5jbHVkZSAiZHNpLnhtbC5oIkkKPiArCj4gKyNkZWZp bmUgZHNpX3BoeV9yZWFkKG9mZnNldCkgbXNtX3JlYWRsKChvZmZzZXQpKQo+ICsjZGVmaW5lIGRz aV9waHlfd3JpdGUob2Zmc2V0LCBkYXRhKSBtc21fd3JpdGVsKChkYXRhKSwgKG9mZnNldCkpCj4g Kwo+ICtzdHJ1Y3QgZHNpX2RwaHlfdGltaW5nIHsKPiArCXUzMiBjbGtfcHJlOwo+ICsJdTMyIGNs a19wb3N0Owo+ICsJdTMyIGNsa196ZXJvOwo+ICsJdTMyIGNsa190cmFpbDsKPiArCXUzMiBjbGtf cHJlcGFyZTsKPiArCXUzMiBoc19leGl0Owo+ICsJdTMyIGhzX3plcm87Cj4gKwl1MzIgaHNfcHJl cGFyZTsKPiArCXUzMiBoc190cmFpbDsKPiArCXUzMiBoc19ycXN0Owo+ICsJdTMyIHRhX2dvOwo+ ICsJdTMyIHRhX3N1cmU7Cj4gKwl1MzIgdGFfZ2V0Owo+ICt9Owo+ICsKPiArc3RydWN0IG1zbV9k c2lfcGh5IHsKPiArCXZvaWQgX19pb21lbSAqYmFzZTsKPiArCXZvaWQgX19pb21lbSAqcmVnX2Jh c2U7Cj4gKwlpbnQgaWQ7Cj4gKwlzdHJ1Y3QgZHNpX2RwaHlfdGltaW5nIHRpbWluZzsKPiArCWlu dCAoKmVuYWJsZSkoc3RydWN0IG1zbV9kc2lfcGh5ICpwaHksIGJvb2wgaXNfZHVhbF9wYW5lbCwK PiArCQljb25zdCB1bnNpZ25lZCBsb25nIGJpdF9yYXRlLCBjb25zdCB1bnNpZ25lZCBsb25nIGVz Y19yYXRlKTsKPiArCWludCAoKmRpc2FibGUpKHN0cnVjdCBtc21fZHNpX3BoeSAqcGh5KTsKPiAr fTsKPiArCj4gKyNkZWZpbmUgU19ESVZfUk9VTkRfVVAobiwgZCkJXAo+ICsJKCgobikgPj0gMCkg PyAoKChuKSArIChkKSAtIDEpIC8gKGQpKSA6ICgoKG4pIC0gKGQpICsgMSkgLyAoZCkpKQo+ICsK PiArc3RhdGljIGlubGluZSBzMzIgbGluZWFyX2ludGVyKHMzMiB0bWF4LCBzMzIgdG1pbiwgczMy IHBlcmNlbnQsCj4gKwkJCQlzMzIgbWluX3Jlc3VsdCwgYm9vbCBldmVuKQo+ICt7Cj4gKwlzMzIg djsKPiArCXYgPSAodG1heCAtIHRtaW4pICogcGVyY2VudDsKPiArCXYgPSBTX0RJVl9ST1VORF9V UCh2LCAxMDApICsgdG1pbjsKPiArCWlmIChldmVuICYmICh2ICYgMHgxKSkKPiArCQlyZXR1cm4g bWF4X3QoczMyLCBtaW5fcmVzdWx0LCB2IC0gMSk7Cj4gKwllbHNlCj4gKwkJcmV0dXJuIG1heF90 KHMzMiwgbWluX3Jlc3VsdCwgdik7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRzaV9kcGh5X3Rp bWluZ19jYWxjX2Nsa196ZXJvKHN0cnVjdCBkc2lfZHBoeV90aW1pbmcgKnRpbWluZywKPiArCQkJ CQlzMzIgdWksIHMzMiBjb2VmZiwgczMyIHBjbnQpCj4gK3sKPiArCXMzMiB0bWF4LCB0bWluLCBj bGtfejsKPiArCXMzMiB0ZW1wOwo+ICsKPiArCS8qIHJlc2V0ICovCj4gKwl0ZW1wID0gMzAwICog Y29lZmYgLSAoKHRpbWluZy0+Y2xrX3ByZXBhcmUgPj4gMSkgKyAxKSAqIDIgKiB1aTsKPiArCXRt aW4gPSBTX0RJVl9ST1VORF9VUCh0ZW1wLCB1aSkgLSAyOwo+ICsJaWYgKHRtaW4gPiAyNTUpIHsK PiArCQl0bWF4ID0gNTExOwo+ICsJCWNsa196ID0gbGluZWFyX2ludGVyKDIgKiB0bWluLCB0bWlu LCBwY250LCAwLCB0cnVlKTsKPiArCX0gZWxzZSB7Cj4gKwkJdG1heCA9IDI1NTsKPiArCQljbGtf eiA9IGxpbmVhcl9pbnRlcih0bWF4LCB0bWluLCBwY250LCAwLCB0cnVlKTsKPiArCX0KPiArCj4g KwkvKiBhZGp1c3QgKi8KPiArCXRlbXAgPSAodGltaW5nLT5oc19ycXN0ICsgdGltaW5nLT5jbGtf cHJlcGFyZSArIGNsa196KSAmIDB4NzsKPiArCXRpbWluZy0+Y2xrX3plcm8gPSBjbGtfeiArIDgg LSB0ZW1wOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGRzaV9kcGh5X3RpbWluZ19jYWxjKHN0cnVj dCBkc2lfZHBoeV90aW1pbmcgKnRpbWluZywKPiArCWNvbnN0IHVuc2lnbmVkIGxvbmcgYml0X3Jh dGUsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZXNjX3JhdGUpCj4gK3sKPiArCXMzMiB1aSwgbHB4Owo+ ICsJczMyIHRtYXgsIHRtaW47Cj4gKwlzMzIgcGNudDAgPSAxMDsKPiArCXMzMiBwY250MSA9IChi aXRfcmF0ZSA+IDEyMDAwMDAwMDApID8gMTUgOiAxMDsKPiArCXMzMiBwY250MiA9IDEwOwo+ICsJ czMyIHBjbnQzID0gKGJpdF9yYXRlID4gMTgwMDAwMDAwKSA/IDEwIDogNDA7Cj4gKwlzMzIgY29l ZmYgPSAxMDAwOyAvKiBQcmVjaXNpb24sIHNob3VsZCBhdm9pZCBvdmVyZmxvdyAqLwo+ICsJczMy IHRlbXA7Cj4gKwo+ICsJaWYgKCFiaXRfcmF0ZSB8fCAhZXNjX3JhdGUpCj4gKwkJcmV0dXJuIC1F SU5WQUw7Cj4gKwo+ICsJdWkgPSBtdWx0X2ZyYWMoTlNFQ19QRVJfTVNFQywgY29lZmYsIGJpdF9y YXRlIC8gMTAwMCk7Cj4gKwlscHggPSBtdWx0X2ZyYWMoTlNFQ19QRVJfTVNFQywgY29lZmYsIGVz Y19yYXRlIC8gMTAwMCk7Cj4gKwo+ICsJdG1heCA9IFNfRElWX1JPVU5EX1VQKDk1ICogY29lZmYs IHVpKSAtIDI7Cj4gKwl0bWluID0gU19ESVZfUk9VTkRfVVAoMzggKiBjb2VmZiwgdWkpIC0gMjsK PiArCXRpbWluZy0+Y2xrX3ByZXBhcmUgPSBsaW5lYXJfaW50ZXIodG1heCwgdG1pbiwgcGNudDAs IDAsIHRydWUpOwo+ICsKPiArCXRlbXAgPSBscHggLyB1aTsKPiArCWlmICh0ZW1wICYgMHgxKQo+ ICsJCXRpbWluZy0+aHNfcnFzdCA9IHRlbXA7Cj4gKwllbHNlCj4gKwkJdGltaW5nLT5oc19ycXN0 ID0gbWF4X3QoczMyLCAwLCB0ZW1wIC0gMik7Cj4gKwo+ICsJLyogQ2FsY3VsYXRlIGNsa196ZXJv IGFmdGVyIGNsa19wcmVwYXJlIGFuZCBoc19ycXN0ICovCj4gKwlkc2lfZHBoeV90aW1pbmdfY2Fs Y19jbGtfemVybyh0aW1pbmcsIHVpLCBjb2VmZiwgcGNudDIpOwo+ICsKPiArCXRlbXAgPSAxMDUg KiBjb2VmZiArIDEyICogdWkgLSAyMCAqIGNvZWZmOwo+ICsJdG1heCA9IFNfRElWX1JPVU5EX1VQ KHRlbXAsIHVpKSAtIDI7Cj4gKwl0bWluID0gU19ESVZfUk9VTkRfVVAoNjAgKiBjb2VmZiwgdWkp IC0gMjsKPiArCXRpbWluZy0+Y2xrX3RyYWlsID0gbGluZWFyX2ludGVyKHRtYXgsIHRtaW4sIHBj bnQzLCAwLCB0cnVlKTsKPiArCj4gKwl0ZW1wID0gODUgKiBjb2VmZiArIDYgKiB1aTsKPiArCXRt YXggPSBTX0RJVl9ST1VORF9VUCh0ZW1wLCB1aSkgLSAyOwo+ICsJdGVtcCA9IDQwICogY29lZmYg KyA0ICogdWk7Cj4gKwl0bWluID0gU19ESVZfUk9VTkRfVVAodGVtcCwgdWkpIC0gMjsKPiArCXRp bWluZy0+aHNfcHJlcGFyZSA9IGxpbmVhcl9pbnRlcih0bWF4LCB0bWluLCBwY250MSwgMCwgdHJ1 ZSk7Cj4gKwo+ICsJdG1heCA9IDI1NTsKPiArCXRlbXAgPSAoKHRpbWluZy0+aHNfcHJlcGFyZSA+ PiAxKSArIDEpICogMiAqIHVpICsgMiAqIHVpOwo+ICsJdGVtcCA9IDE0NSAqIGNvZWZmICsgMTAg KiB1aSAtIHRlbXA7Cj4gKwl0bWluID0gU19ESVZfUk9VTkRfVVAodGVtcCwgdWkpIC0gMjsKPiAr CXRpbWluZy0+aHNfemVybyA9IGxpbmVhcl9pbnRlcih0bWF4LCB0bWluLCBwY250MiwgMjQsIHRy dWUpOwo+ICsKPiArCXRlbXAgPSAxMDUgKiBjb2VmZiArIDEyICogdWkgLSAyMCAqIGNvZWZmOwo+ ICsJdG1heCA9IFNfRElWX1JPVU5EX1VQKHRlbXAsIHVpKSAtIDI7Cj4gKwl0ZW1wID0gNjAgKiBj b2VmZiArIDQgKiB1aTsKPiArCXRtaW4gPSBESVZfUk9VTkRfVVAodGVtcCwgdWkpIC0gMjsKPiAr CXRpbWluZy0+aHNfdHJhaWwgPSBsaW5lYXJfaW50ZXIodG1heCwgdG1pbiwgcGNudDMsIDAsIHRy dWUpOwo+ICsKPiArCXRtYXggPSAyNTU7Cj4gKwl0bWluID0gU19ESVZfUk9VTkRfVVAoMTAwICog Y29lZmYsIHVpKSAtIDI7Cj4gKwl0aW1pbmctPmhzX2V4aXQgPSBsaW5lYXJfaW50ZXIodG1heCwg dG1pbiwgcGNudDIsIDAsIHRydWUpOwo+ICsKPiArCXRtYXggPSA2MzsKPiArCXRlbXAgPSAoKHRp bWluZy0+aHNfZXhpdCA+PiAxKSArIDEpICogMiAqIHVpOwo+ICsJdGVtcCA9IDYwICogY29lZmYg KyA1MiAqIHVpIC0gMjQgKiB1aSAtIHRlbXA7Cj4gKwl0bWluID0gU19ESVZfUk9VTkRfVVAodGVt cCwgOCAqIHVpKSAtIDE7Cj4gKwl0aW1pbmctPmNsa19wb3N0ID0gbGluZWFyX2ludGVyKHRtYXgs IHRtaW4sIHBjbnQyLCAwLCBmYWxzZSk7Cj4gKwo+ICsJdG1heCA9IDYzOwo+ICsJdGVtcCA9ICgo dGltaW5nLT5jbGtfcHJlcGFyZSA+PiAxKSArIDEpICogMiAqIHVpOwo+ICsJdGVtcCArPSAoKHRp bWluZy0+Y2xrX3plcm8gPj4gMSkgKyAxKSAqIDIgKiB1aTsKPiArCXRlbXAgKz0gOCAqIHVpICsg bHB4Owo+ICsJdG1pbiA9IFNfRElWX1JPVU5EX1VQKHRlbXAsIDggKiB1aSkgLSAxOwo+ICsJaWYg KHRtaW4gPiB0bWF4KSB7Cj4gKwkJdGVtcCA9IGxpbmVhcl9pbnRlcigyICogdG1heCwgdG1pbiwg cGNudDIsIDAsIGZhbHNlKSA+PiAxOwo+ICsJCXRpbWluZy0+Y2xrX3ByZSA9IHRlbXAgPj4gMTsK PiArCQl0ZW1wID0gKDIgKiB0bWF4IC0gdG1pbikgKiBwY250MjsKPiArCX0gZWxzZSB7Cj4gKwkJ dGltaW5nLT5jbGtfcHJlID0gbGluZWFyX2ludGVyKHRtYXgsIHRtaW4sIHBjbnQyLCAwLCBmYWxz ZSk7Cj4gKwl9Cj4gKwo+ICsJdGltaW5nLT50YV9nbyA9IDM7Cj4gKwl0aW1pbmctPnRhX3N1cmUg PSAwOwo+ICsJdGltaW5nLT50YV9nZXQgPSA0Owo+ICsKPiArCURCRygiUEhZIHRpbWluZ3M6ICVk LCAlZCwgJWQsICVkLCAlZCwgJWQsICVkLCAlZCwgJWQsICVkIiwKPiArCQl0aW1pbmctPmNsa19w cmUsIHRpbWluZy0+Y2xrX3Bvc3QsIHRpbWluZy0+Y2xrX3plcm8sCj4gKwkJdGltaW5nLT5jbGtf dHJhaWwsIHRpbWluZy0+Y2xrX3ByZXBhcmUsIHRpbWluZy0+aHNfZXhpdCwKPiArCQl0aW1pbmct PmhzX3plcm8sIHRpbWluZy0+aHNfcHJlcGFyZSwgdGltaW5nLT5oc190cmFpbCwKPiArCQl0aW1p bmctPmhzX3Jxc3QpOwo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBk c2lfMjhubV9waHlfcmVndWxhdG9yX2N0cmwoc3RydWN0IG1zbV9kc2lfcGh5ICpwaHksIGJvb2wg ZW5hYmxlKQo+ICt7Cj4gKwl2b2lkIF9faW9tZW0gKmJhc2UgPSBwaHktPnJlZ19iYXNlOwo+ICsK PiArCWlmICghZW5hYmxlKSB7Cj4gKwkJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5t X1BIWV9SRUdVTEFUT1JfQ0FMX1BXUl9DRkcsIDApOwo+ICsJCXJldHVybjsKPiArCX0KPiArCj4g Kwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1JFR1VMQVRPUl9DVFJMXzAs IDB4MCk7Cj4gKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1JFR1VMQVRP Ul9DQUxfUFdSX0NGRywgMSk7Cj4gKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1f UEhZX1JFR1VMQVRPUl9DVFJMXzUsIDApOwo+ICsJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RT SV8yOG5tX1BIWV9SRUdVTEFUT1JfQ1RSTF8zLCAwKTsKPiArCWRzaV9waHlfd3JpdGUoYmFzZSAr IFJFR19EU0lfMjhubV9QSFlfUkVHVUxBVE9SX0NUUkxfMiwgMHgzKTsKPiArCWRzaV9waHlfd3Jp dGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfUkVHVUxBVE9SX0NUUkxfMSwgMHg5KTsKPiArCWRz aV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfUkVHVUxBVE9SX0NUUkxfMCwgMHg3 KTsKPiArCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfUkVHVUxBVE9SX0NU UkxfNCwgMHgyMCk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHNpXzI4bm1fcGh5X2VuYWJsZShz dHJ1Y3QgbXNtX2RzaV9waHkgKnBoeSwgYm9vbCBpc19kdWFsX3BhbmVsLAo+ICsJCWNvbnN0IHVu c2lnbmVkIGxvbmcgYml0X3JhdGUsIGNvbnN0IHVuc2lnbmVkIGxvbmcgZXNjX3JhdGUpCj4gK3sK PiArCXN0cnVjdCBkc2lfZHBoeV90aW1pbmcgKnRpbWluZyA9ICZwaHktPnRpbWluZzsKPiArCWlu dCBpOwo+ICsJdm9pZCBfX2lvbWVtICpiYXNlID0gcGh5LT5iYXNlOwo+ICsKPiArCURCRygiIik7 Cj4gKwo+ICsJaWYgKGRzaV9kcGh5X3RpbWluZ19jYWxjKHRpbWluZywgYml0X3JhdGUsIGVzY19y YXRlKSkgewo+ICsJCXByX2VycigiJXM6IEQtUEhZIHRpbWluZyBjYWxjdWxhdGlvbiBmYWlsZWRc biIsIF9fZnVuY19fKTsKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCX0KPiArCj4gKwlkc2lfcGh5 X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1NUUkVOR1RIXzAsIDB4ZmYpOwo+ICsKPiAr CWRzaV8yOG5tX3BoeV9yZWd1bGF0b3JfY3RybChwaHksIHRydWUpOwo+ICsKPiArCWRzaV9waHlf d3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfTERPX0NOVFJMLCAweDAwKTsKPiArCj4gKwlk c2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzAsCj4gKwkJ RFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzBfQ0xLX1pFUk8odGltaW5nLT5jbGtfemVybykpOwo+ ICsJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF8xLAo+ ICsJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF8xX0NMS19UUkFJTCh0aW1pbmctPmNsa190cmFp bCkpOwo+ICsJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9USU1JTkdfQ1RS TF8yLAo+ICsJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF8yX0NMS19QUkVQQVJFKHRpbWluZy0+ Y2xrX3ByZXBhcmUpKTsKPiArCWlmICh0aW1pbmctPmNsa196ZXJvICYgQklUKDgpKQo+ICsJCWRz aV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfVElNSU5HX0NUUkxfMywKPiArCQkJ RFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzNfQ0xLX1pFUk9fOCk7Cj4gKwlkc2lfcGh5X3dyaXRl KGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzQsCj4gKwkJRFNJXzI4bm1fUEhZ X1RJTUlOR19DVFJMXzRfSFNfRVhJVCh0aW1pbmctPmhzX2V4aXQpKTsKPiArCWRzaV9waHlfd3Jp dGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfVElNSU5HX0NUUkxfNSwKPiArCQlEU0lfMjhubV9Q SFlfVElNSU5HX0NUUkxfNV9IU19aRVJPKHRpbWluZy0+aHNfemVybykpOwo+ICsJZHNpX3BoeV93 cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF82LAo+ICsJCURTSV8yOG5t X1BIWV9USU1JTkdfQ1RSTF82X0hTX1BSRVBBUkUodGltaW5nLT5oc19wcmVwYXJlKSk7Cj4gKwlk c2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzcsCj4gKwkJ RFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzdfSFNfVFJBSUwodGltaW5nLT5oc190cmFpbCkpOwo+ ICsJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF84LAo+ ICsJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF84X0hTX1JRU1QodGltaW5nLT5oc19ycXN0KSk7 Cj4gKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzks Cj4gKwkJRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzlfVEFfR08odGltaW5nLT50YV9nbykgfAo+ ICsJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF85X1RBX1NVUkUodGltaW5nLT50YV9zdXJlKSk7 Cj4gKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzEw LAo+ICsJCURTSV8yOG5tX1BIWV9USU1JTkdfQ1RSTF8xMF9UQV9HRVQodGltaW5nLT50YV9nZXQp KTsKPiArCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfVElNSU5HX0NUUkxf MTEsCj4gKwkJRFNJXzI4bm1fUEhZX1RJTUlOR19DVFJMXzExX1RSSUczX0NNRCgwKSk7Cj4gKwo+ ICsJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9DVFJMXzEsIDB4MDApOwo+ ICsJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9DVFJMXzAsIDB4NWYpOwo+ ICsKPiArCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfU1RSRU5HVEhfMSwg MHg2KTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Cj4gKwkJZHNpX3BoeV93cml0 ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9MTl9DRkdfMChpKSwgMCk7Cj4gKwkJZHNpX3BoeV93 cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9MTl9DRkdfMShpKSwgMCk7Cj4gKwkJZHNpX3Bo eV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9MTl9DRkdfMihpKSwgMCk7Cj4gKwkJZHNp X3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9MTl9DRkdfMyhpKSwgMCk7Cj4gKwkJ ZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9MTl9URVNUX0RBVEFQQVRIKGkp LCAwKTsKPiArCQlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0xOX0RFQlVH X1NFTChpKSwgMCk7Cj4gKwkJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9M Tl9URVNUX1NUUl8wKGkpLCAweDEpOwo+ICsJCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lf MjhubV9QSFlfTE5fVEVTVF9TVFJfMShpKSwgMHg5Nyk7Cj4gKwl9Cj4gKwlkc2lfcGh5X3dyaXRl KGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0xOX0NGR180KDApLCAwKTsKPiArCWRzaV9waHlfd3Jp dGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfTE5fQ0ZHXzQoMSksIDB4NSk7Cj4gKwlkc2lfcGh5 X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0xOX0NGR180KDIpLCAweGEpOwo+ICsJZHNp X3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9MTl9DRkdfNCgzKSwgMHhmKTsKPiAr Cj4gKwlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0xOQ0tfQ0ZHXzEsIDB4 YzApOwo+ICsJZHNpX3BoeV93cml0ZShiYXNlICsgUkVHX0RTSV8yOG5tX1BIWV9MTkNLX1RFU1Rf U1RSMCwgMHgxKTsKPiArCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lfMjhubV9QSFlfTE5D S19URVNUX1NUUjEsIDB4YmIpOwo+ICsKPiArCWRzaV9waHlfd3JpdGUoYmFzZSArIFJFR19EU0lf MjhubV9QSFlfQ1RSTF8wLCAweDVmKTsKPiArCj4gKwlpZiAoaXNfZHVhbF9wYW5lbCAmJiAocGh5 LT5pZCAhPSBEU0lfQ0xPQ0tfTUFTVEVSKSkKPiArCQlkc2lfcGh5X3dyaXRlKGJhc2UgKyBSRUdf RFNJXzI4bm1fUEhZX0dMQkxfVEVTVF9DVFJMLCAweDAwKTsKPiArCWVsc2UKPiArCQlkc2lfcGh5 X3dyaXRlKGJhc2UgKyBSRUdfRFNJXzI4bm1fUEhZX0dMQkxfVEVTVF9DVFJMLCAweDAxKTsKPiAr Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBkc2lfMjhubV9waHlfZGlzYWJs ZShzdHJ1Y3QgbXNtX2RzaV9waHkgKnBoeSkKPiArewo+ICsJZHNpX3BoeV93cml0ZShwaHktPmJh c2UgKyBSRUdfRFNJXzI4bm1fUEhZX0NUUkxfMCwgMCk7Cj4gKwlkc2lfMjhubV9waHlfcmVndWxh dG9yX2N0cmwocGh5LCBmYWxzZSk7Cj4gKwo+ICsJLyoKPiArCSAqIFdhaXQgZm9yIHRoZSByZWdp c3RlcnMgd3JpdGVzIHRvIGNvbXBsZXRlIGluIG9yZGVyIHRvCj4gKwkgKiBlbnN1cmUgdGhhdCB0 aGUgcGh5IGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQKPiArCSAqLwo+ICsJd21iKCk7Cj4gKwo+ICsJ cmV0dXJuIDA7Cj4gK30KPiArCj4gKyNkZWZpbmUgZHNpX3BoeV9mdW5jX2luaXQobmFtZSkJXAo+ ICsJZG8gewlcCj4gKwkJcGh5LT5lbmFibGUgPSBkc2lfIyNuYW1lIyNfcGh5X2VuYWJsZTsJXAo+ ICsJCXBoeS0+ZGlzYWJsZSA9IGRzaV8jI25hbWUjI19waHlfZGlzYWJsZTsJXAo+ICsJfSB3aGls ZSAoMCkKPiArCj4gK3N0cnVjdCBtc21fZHNpX3BoeSAqbXNtX2RzaV9waHlfaW5pdChzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2LAo+ICsJCQllbnVtIG1zbV9kc2lfcGh5X3R5cGUgdHlwZSwg aW50IGlkKQo+ICt7Cj4gKwlzdHJ1Y3QgbXNtX2RzaV9waHkgKnBoeTsKPiArCj4gKwlwaHkgPSBk ZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwaHkpLCBHRlBfS0VSTkVMKTsKPiArCWlm ICghcGh5KQo+ICsJCXJldHVybiBOVUxMOwo+ICsKPiArCXBoeS0+YmFzZSA9IG1zbV9pb3JlbWFw KHBkZXYsICJkc2lfcGh5IiwgIkRTSV9QSFkiKTsKPiArCWlmIChJU19FUlJfT1JfTlVMTChwaHkt PmJhc2UpKSB7Cj4gKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIG1hcCBwaHkgYmFzZVxuIiwgX19m dW5jX18pOwo+ICsJCXJldHVybiBOVUxMOwo+ICsJfQo+ICsJcGh5LT5yZWdfYmFzZSA9IG1zbV9p b3JlbWFwKHBkZXYsICJkc2lfcGh5X3JlZ3VsYXRvciIsICJEU0lfUEhZX1JFRyIpOwo+ICsJaWYg KElTX0VSUl9PUl9OVUxMKHBoeS0+cmVnX2Jhc2UpKSB7Cj4gKwkJcHJfZXJyKCIlczogZmFpbGVk IHRvIG1hcCBwaHkgcmVndWxhdG9yIGJhc2VcbiIsIF9fZnVuY19fKTsKPiArCQlyZXR1cm4gTlVM TDsKPiArCX0KPiArCj4gKwlzd2l0Y2ggKHR5cGUpIHsKPiArCWNhc2UgTVNNX0RTSV9QSFlfMjhO TToKPiArCQlkc2lfcGh5X2Z1bmNfaW5pdCgyOG5tKTsKPiArCQlicmVhazsKPiArCWRlZmF1bHQ6 Cj4gKwkJcHJfZXJyKCIlczogdW5zdXBwb3J0ZWQgdHlwZSwgJWRcbiIsIF9fZnVuY19fLCB0eXBl KTsKPiArCQlyZXR1cm4gTlVMTDsKPiArCX0KPiArCj4gKwlwaHktPmlkID0gaWQ7Cj4gKwo+ICsJ cmV0dXJuIHBoeTsKPiArfQo+ICsKPiAraW50IG1zbV9kc2lfcGh5X2VuYWJsZShzdHJ1Y3QgbXNt X2RzaV9waHkgKnBoeSwgYm9vbCBpc19kdWFsX3BhbmVsLAo+ICsJY29uc3QgdW5zaWduZWQgbG9u ZyBiaXRfcmF0ZSwgY29uc3QgdW5zaWduZWQgbG9uZyBlc2NfcmF0ZSkKPiArewo+ICsJaWYgKCFw aHkgfHwgIXBoeS0+ZW5hYmxlKQo+ICsJCXJldHVybiAtRUlOVkFMOwo+ICsJcmV0dXJuIHBoeS0+ ZW5hYmxlKHBoeSwgaXNfZHVhbF9wYW5lbCwgYml0X3JhdGUsIGVzY19yYXRlKTsKPiArfQo+ICsK PiAraW50IG1zbV9kc2lfcGh5X2Rpc2FibGUoc3RydWN0IG1zbV9kc2lfcGh5ICpwaHkpCj4gK3sK PiArCWlmICghcGh5IHx8ICFwaHktPmRpc2FibGUpCj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwly ZXR1cm4gcGh5LT5kaXNhYmxlKHBoeSk7Cj4gK30KPiArCj4gK3ZvaWQgbXNtX2RzaV9waHlfZ2V0 X2Nsa19wcmVfcG9zdChzdHJ1Y3QgbXNtX2RzaV9waHkgKnBoeSwKPiArCXUzMiAqY2xrX3ByZSwg dTMyICpjbGtfcG9zdCkKPiArewo+ICsJaWYgKCFwaHkpCj4gKwkJcmV0dXJuOwo+ICsJaWYgKGNs a19wcmUpCj4gKwkJKmNsa19wcmUgPSBwaHktPnRpbWluZy5jbGtfcHJlOwo+ICsJaWYgKGNsa19w b3N0KQo+ICsJCSpjbGtfcG9zdCA9IHBoeS0+dGltaW5nLmNsa19wb3N0Owo+ICt9Cj4gKwo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL21zbV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2Ry bS9tc20vbXNtX2Rydi5oCj4gaW5kZXggN2I0NjRkYi4uYTE4NjgzZiAxMDA2NDQKPiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vbXNtL21zbV9kcnYuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20v bXNtX2Rydi5oCj4gQEAgLTk1LDYgKzk1LDkgQEAgc3RydWN0IG1zbV9kcm1fcHJpdmF0ZSB7Cj4g ICAJICovCj4gICAJc3RydWN0IG1zbV9kcm1fc3ViX2RldiAqZWRwOwo+Cj4gKwkvKiBEU0kgaXMg c2hhcmVkIGJ5IG1kcDQgYW5kIG1kcDUgKi8KPiArCXN0cnVjdCBtc21fZHJtX3N1Yl9kZXYgKmRz aVsyXTsKPiArCj4gICAJLyogd2hlbiB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgJ21zbV9ncHUnIHRo ZXNlIG5lZWQgdG8gYmUgYW4gYXJyYXk6ICovCj4gICAJc3RydWN0IG1zbV9ncHUgKmdwdTsKPiAg IAlzdHJ1Y3QgbXNtX2ZpbGVfcHJpdmF0ZSAqbGFzdGN0eDsKPiBAQCAtMjQzLDYgKzI0NiwyMyBA QCB2b2lkIF9fZXhpdCBoZG1pX3VucmVnaXN0ZXIodm9pZCk7Cj4gICB2b2lkIF9faW5pdCBtc21f ZWRwX3JlZ2lzdGVyKHZvaWQpOwo+ICAgdm9pZCBfX2V4aXQgbXNtX2VkcF91bnJlZ2lzdGVyKHZv aWQpOwo+Cj4gK2VudW0gbXNtX2RzaV9lbmNvZGVyX2lkIHsKPiArCU1TTV9EU0lfVklERU9fRU5D T0RFUl9JRCA9IDAsCj4gKwlNU01fRFNJX0NNRF9FTkNPREVSX0lEID0gMSwKPiArCU1TTV9EU0lf RU5DT0RFUl9OVU0gPSAyCj4gK307Cj4gKyNpZmRlZiBDT05GSUdfRFJNX01TTV9EU0kKPiArdm9p ZCBfX2luaXQgbXNtX2RzaV9yZWdpc3Rlcih2b2lkKTsKPiArdm9pZCBfX2V4aXQgbXNtX2RzaV91 bnJlZ2lzdGVyKHZvaWQpOwo+ICsjZWxzZQo+ICtzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IG1z bV9kc2lfcmVnaXN0ZXIodm9pZCkKPiArewo+ICt9Cj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2V4 aXQgbXNtX2RzaV91bnJlZ2lzdGVyKHZvaWQpCj4gK3sKPiArfQo+ICsjZW5kaWYKPiArCj4gICAj aWZkZWYgQ09ORklHX0RFQlVHX0ZTCj4gICB2b2lkIG1zbV9nZW1fZGVzY3JpYmUoc3RydWN0IGRy bV9nZW1fb2JqZWN0ICpvYmosIHN0cnVjdCBzZXFfZmlsZSAqbSk7Cj4gICB2b2lkIG1zbV9nZW1f ZGVzY3JpYmVfb2JqZWN0cyhzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3Qgc2VxX2ZpbGUg Km0pOwo+CgpUaGFua3MgZm9yIHRoZSBwYXRjaC4KCkFyY2hpdAoKLS0gClF1YWxjb21tIElubm92 YXRpb24gQ2VudGVyLCBJbmMuIGlzIGEgbWVtYmVyIG9mIENvZGUgQXVyb3JhIEZvcnVtLAphIExp bnV4IEZvdW5kYXRpb24gQ29sbGFib3JhdGl2ZSBQcm9qZWN0Cl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRl dmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==