From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH RFC 12/13] x86/mm: split PV MMU code to pv/mm.c Date: Mon, 27 Mar 2017 10:10:58 +0100 Message-ID: <20170327091059.8452-13-wei.liu2@citrix.com> References: <20170327091059.8452-1-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1csQlH-00007a-KO for xen-devel@lists.xenproject.org; Mon, 27 Mar 2017 09:16:28 +0000 In-Reply-To: <20170327091059.8452-1-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Xen-devel Cc: George Dunlap , Andrew Cooper , Tim Deegan , Wei Liu , Jan Beulich List-Id: xen-devel@lists.xenproject.org TW92ZSB0aGUgZm9sbG93aW5nIFBWIHNwZWNpZmljIGNvZGUgdG8gdGhhdCBuZXcgZmlsZToKCjEu IFRocmVlIGh5cGVyY2FsbHMgdGhhdCBhcmUgb25seSBhdmFpbGFibGUgdG8gUFYgZ3Vlc3RzOgog ICAxLiBkb19tbXVfdXBkYXRlCiAgIDIuIGRvX3VwZGF0ZV92YV9tYXBwaW5nCiAgIDMuIGRvX3Vw ZGF0ZV92YV9tYXBwaW5nX290aGVyZG9tYWluCjIuIFBWIE1NSU8gZW11bGF0aW9uIGNvZGUKMy4g UFYgd3JpdGFibGUgcGFnZSB0YWJsZSBlbXVsYXRpb24gY29kZQo0LiBQViBncmFudCB0YWJsZSBj cmVhdGlvbiAvIGRlc3RydWN0aW9uIGNvZGUKNS4gT3RoZXIgc3VwcG9ydGluZyBjb2RlIGZvciB0 aGUgYWJvdmUKCk1vdmUgZXZlcnl0aGluZyBpbiBvbmUgcGF0Y2ggYmVjYXVzZSB0aGV5IHNoYXJl IGEgbG90IG9mIGNvZGUuCgpBbHNvIG1vdmUgdGhlIFBWIHBhZ2UgdGFibGUgQVBJIGNvbW1lbnQg YW5kIGRlbGV0ZSB0cmFpbGluZyB3aGl0ZQpzcGFjZXMuCgpObyBmdW5jdGlvbmFsIGNoYW5nZS4K ClNpZ25lZC1vZmYtYnk6IFdlaSBMaXUgPHdlaS5saXUyQGNpdHJpeC5jb20+Ci0tLQogeGVuL2Fy Y2gveDg2L21tLmMgICAgICAgIHwgMTkxOCArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCiB4ZW4vYXJjaC94ODYvcHYvTWFrZWZpbGUgfCAgICAxICsKIHhlbi9h cmNoL3g4Ni9wdi9tbS5jICAgICB8IDE5MDIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrCiB4ZW4vaW5jbHVkZS9hc20teDg2L21tLmggfCAgICA1ICsKIDQgZmls ZXMgY2hhbmdlZCwgMTkzNSBpbnNlcnRpb25zKCspLCAxODkxIGRlbGV0aW9ucygtKQogY3JlYXRl IG1vZGUgMTAwNjQ0IHhlbi9hcmNoL3g4Ni9wdi9tbS5jCgpkaWZmIC0tZ2l0IGEveGVuL2FyY2gv eDg2L21tLmMgYi94ZW4vYXJjaC94ODYvbW0uYwppbmRleCA5MmU3OWQ3ZmI2Li4wMTE5Y2FjYzQz IDEwMDY0NAotLS0gYS94ZW4vYXJjaC94ODYvbW0uYworKysgYi94ZW4vYXJjaC94ODYvbW0uYwpA QCAtMTgsNzEgKzE4LDYgQEAKICAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBJZiBub3QsIHNl ZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAgKi8KIAotLyoKLSAqIEEgZGVzY3Jp cHRpb24gb2YgdGhlIHg4NiBwYWdlIHRhYmxlIEFQSToKLSAqIAotICogRG9tYWlucyB0cmFwIHRv IGRvX21tdV91cGRhdGUgd2l0aCBhIGxpc3Qgb2YgdXBkYXRlIHJlcXVlc3RzLgotICogVGhpcyBp cyBhIGxpc3Qgb2YgKHB0ciwgdmFsKSBwYWlycywgd2hlcmUgdGhlIHJlcXVlc3RlZCBvcGVyYXRp b24KLSAqIGlzICpwdHIgPSB2YWwuCi0gKiAKLSAqIFJlZmVyZW5jZSBjb3VudGluZyBvZiBwYWdl czoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIEVhY2ggcGFnZSBoYXMgdHdv IHJlZmNvdW50czogdG90X2NvdW50IGFuZCB0eXBlX2NvdW50LgotICogCi0gKiBUT1RfQ09VTlQg aXMgdGhlIG9idmlvdXMgcmVmZXJlbmNlIGNvdW50LiBJdCBjb3VudHMgYWxsIHVzZXMgb2YgYQot ICogcGh5c2ljYWwgcGFnZSBmcmFtZSBieSBhIGRvbWFpbiwgaW5jbHVkaW5nIHVzZXMgYXMgYSBw YWdlIGRpcmVjdG9yeSwKLSAqIGEgcGFnZSB0YWJsZSwgb3Igc2ltcGxlIG1hcHBpbmdzIHZpYSBh IFBURS4gVGhpcyBjb3VudCBwcmV2ZW50cyBhCi0gKiBkb21haW4gZnJvbSByZWxlYXNpbmcgYSBm cmFtZSBiYWNrIHRvIHRoZSBmcmVlIHBvb2wgd2hlbiBpdCBzdGlsbCBob2xkcwotICogYSByZWZl cmVuY2UgdG8gaXQuCi0gKiAKLSAqIFRZUEVfQ09VTlQgaXMgbW9yZSBzdWJ0bGUuIEEgZnJhbWUg Y2FuIGJlIHB1dCB0byBvbmUgb2YgdGhyZWUKLSAqIG11dHVhbGx5LWV4Y2x1c2l2ZSB1c2VzOiBp dCBtaWdodCBiZSB1c2VkIGFzIGEgcGFnZSBkaXJlY3RvcnksIG9yIGEKLSAqIHBhZ2UgdGFibGUs IG9yIGl0IG1heSBiZSBtYXBwZWQgd3JpdGFibGUgYnkgdGhlIGRvbWFpbiBbb2YgY291cnNlLCBh Ci0gKiBmcmFtZSBtYXkgbm90IGJlIHVzZWQgaW4gYW55IG9mIHRoZXNlIHRocmVlIHdheXMhXS4K LSAqIFNvLCB0eXBlX2NvdW50IGlzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiB0aW1lcyBhIGZy YW1lIGlzIGJlaW5nIAotICogcmVmZXJyZWQgdG8gaW4gaXRzIGN1cnJlbnQgaW5jYXJuYXRpb24u IFRoZXJlZm9yZSwgYSBwYWdlIGNhbiBvbmx5Ci0gKiBjaGFuZ2UgaXRzIHR5cGUgd2hlbiBpdHMg dHlwZSBjb3VudCBpcyB6ZXJvLgotICogCi0gKiBQaW5uaW5nIHRoZSBwYWdlIHR5cGU6Ci0gKiAt LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBUaGUgdHlwZSBvZiBhIHBhZ2UgY2FuIGJlIHBpbm5l ZC91bnBpbm5lZCB3aXRoIHRoZSBjb21tYW5kcwotICogTU1VRVhUX1tVTl1QSU5fTD9fVEFCTEUu IEVhY2ggcGFnZSBjYW4gYmUgcGlubmVkIGV4YWN0bHkgb25jZSAodGhhdCBpcywKLSAqIHBpbm5p bmcgaXMgbm90IHJlZmVyZW5jZSBjb3VudGVkLCBzbyBpdCBjYW4ndCBiZSBuZXN0ZWQpLgotICog VGhpcyBpcyB1c2VmdWwgdG8gcHJldmVudCBhIHBhZ2UncyB0eXBlIGNvdW50IGZhbGxpbmcgdG8g emVybywgYXQgd2hpY2gKLSAqIHBvaW50IHNhZmV0eSBjaGVja3Mgd291bGQgbmVlZCB0byBiZSBj YXJyaWVkIG91dCBuZXh0IHRpbWUgdGhlIGNvdW50Ci0gKiBpcyBpbmNyZWFzZWQgYWdhaW4uCi0g KiAKLSAqIEEgZnVydGhlciBub3RlIG9uIHdyaXRhYmxlIHBhZ2UgbWFwcGluZ3M6Ci0gKiAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRm9yIHNpbXBsaWNpdHks IHRoZSBjb3VudCBvZiB3cml0YWJsZSBtYXBwaW5ncyBmb3IgYSBwYWdlIG1heSBub3QKLSAqIGNv cnJlc3BvbmQgdG8gcmVhbGl0eS4gVGhlICd3cml0YWJsZSBjb3VudCcgaXMgaW5jcmVtZW50ZWQg Zm9yIGV2ZXJ5Ci0gKiBQVEUgd2hpY2ggbWFwcyB0aGUgcGFnZSB3aXRoIHRoZSBfUEFHRV9SVyBm bGFnIHNldC4gSG93ZXZlciwgZm9yCi0gKiB3cml0ZSBhY2Nlc3MgdG8gYmUgcG9zc2libGUgdGhl IHBhZ2UgZGlyZWN0b3J5IGVudHJ5IG11c3QgYWxzbyBoYXZlCi0gKiBpdHMgX1BBR0VfUlcgYml0 IHNldC4gV2UgZG8gbm90IGNoZWNrIHRoaXMgYXMgaXQgY29tcGxpY2F0ZXMgdGhlIAotICogcmVm ZXJlbmNlIGNvdW50aW5nIGNvbnNpZGVyYWJseSBbY29uc2lkZXIgdGhlIGNhc2Ugb2YgbXVsdGlw bGUKLSAqIGRpcmVjdG9yeSBlbnRyaWVzIHJlZmVyZW5jaW5nIGEgc2luZ2xlIHBhZ2UgdGFibGUs IHNvbWUgd2l0aCB0aGUgUlcKLSAqIGJpdCBzZXQsIG90aGVycyBub3QgLS0gaXQgc3RhcnRzIGdl dHRpbmcgYSBiaXQgbWVzc3ldLgotICogSW4gbm9ybWFsIHVzZSwgdGhpcyBzaW1wbGlmaWNhdGlv biBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtLgotICogSG93ZXZlciwgdGhlIGxvZ2ljIGNhbiBiZSBh ZGRlZCBpZiByZXF1aXJlZC4KLSAqIAotICogT25lIG1vcmUgbm90ZSBvbiByZWFkLW9ubHkgcGFn ZSBtYXBwaW5nczoKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Ci0gKiBXZSB3YW50IGRvbWFpbnMgdG8gYmUgYWJsZSB0byBtYXAgcGFnZXMgZm9yIHJlYWQtb25s eSBhY2Nlc3MuIFRoZQotICogbWFpbiByZWFzb24gaXMgdGhhdCBwYWdlIHRhYmxlcyBhbmQgZGly ZWN0b3JpZXMgc2hvdWxkIGJlIHJlYWRhYmxlCi0gKiBieSBhIGRvbWFpbiwgYnV0IGl0IHdvdWxk IG5vdCBiZSBzYWZlIGZvciB0aGVtIHRvIGJlIHdyaXRhYmxlLgotICogSG93ZXZlciwgZG9tYWlu cyBoYXZlIGZyZWUgYWNjZXNzIHRvIHJpbmdzIDEgJiAyIG9mIHRoZSBJbnRlbAotICogcHJpdmls ZWdlIG1vZGVsLiBJbiB0ZXJtcyBvZiBwYWdlIHByb3RlY3Rpb24sIHRoZXNlIGFyZSBjb25zaWRl cmVkCi0gKiB0byBiZSBwYXJ0IG9mICdzdXBlcnZpc29yIG1vZGUnLiBUaGUgV1AgYml0IGluIENS MCBjb250cm9scyB3aGV0aGVyCi0gKiByZWFkLW9ubHkgcmVzdHJpY3Rpb25zIGFyZSByZXNwZWN0 ZWQgaW4gc3VwZXJ2aXNvciBtb2RlIC0tIGlmIHRoZSAKLSAqIGJpdCBpcyBjbGVhciB0aGVuIGFu eSBtYXBwZWQgcGFnZSBpcyB3cml0YWJsZS4KLSAqIAotICogV2UgZ2V0IHJvdW5kIHRoaXMgYnkg YWx3YXlzIHNldHRpbmcgdGhlIFdQIGJpdCBhbmQgZGlzYWxsb3dpbmcgCi0gKiB1cGRhdGVzIHRv IGl0LiBUaGlzIGlzIHZlcnkgdW5saWtlbHkgdG8gY2F1c2UgYSBwcm9ibGVtIGZvciBndWVzdAot ICogT1Mncywgd2hpY2ggd2lsbCBnZW5lcmFsbHkgdXNlIHRoZSBXUCBiaXQgdG8gc2ltcGxpZnkg Y29weS1vbi13cml0ZQotICogaW1wbGVtZW50YXRpb24gKGluIHRoYXQgY2FzZSwgT1Mgd2FudHMg YSBmYXVsdCB3aGVuIGl0IHdyaXRlcyB0bwotICogYW4gYXBwbGljYXRpb24tc3VwcGxpZWQgYnVm ZmVyKS4KLSAqLwotCiAjaW5jbHVkZSA8eGVuL2luaXQuaD4KICNpbmNsdWRlIDx4ZW4va2VybmVs Lmg+CiAjaW5jbHVkZSA8eGVuL2xpYi5oPgpAQCAtMTI3LDE0ICs2Miw2IEBACiBsMV9wZ2VudHJ5 X3QgX19zZWN0aW9uKCIuYnNzLnBhZ2VfYWxpZ25lZCIpIF9fYWxpZ25lZChQQUdFX1NJWkUpCiAg ICAgbDFfZml4bWFwW0wxX1BBR0VUQUJMRV9FTlRSSUVTXTsKIAotLyoKLSAqIFBURSB1cGRhdGVz IGNhbiBiZSBkb25lIHdpdGggb3JkaW5hcnkgd3JpdGVzIGV4Y2VwdDoKLSAqICAxLiBEZWJ1ZyBi dWlsZHMgZ2V0IGV4dHJhIGNoZWNraW5nIGJ5IHVzaW5nIENNUFhDSEdbOEJdLgotICovCi0jaWYg IWRlZmluZWQoTkRFQlVHKQotI2RlZmluZSBQVEVfVVBEQVRFX1dJVEhfQ01QWENIRwotI2VuZGlm Ci0KIHBhZGRyX3QgX19yZWFkX21vc3RseSBtZW1faG90cGx1ZzsKIAogLyogUHJpdmF0ZSBkb21h aW4gc3RydWN0cyBmb3IgRE9NSURfWEVOIGFuZCBET01JRF9JTy4gKi8KQEAgLTUyMCw2NyArNDQ3 LDYgQEAgdm9pZCB1cGRhdGVfY3IzKHN0cnVjdCB2Y3B1ICp2KQogICAgIG1ha2VfY3IzKHYsIGNy M19tZm4pOwogfQogCi0vKiBHZXQgYSBtYXBwaW5nIG9mIGEgUFYgZ3Vlc3QncyBsMWUgZm9yIHRo aXMgdmlydHVhbCBhZGRyZXNzLiAqLwotc3RhdGljIGwxX3BnZW50cnlfdCAqZ3Vlc3RfbWFwX2wx ZSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgKmdsMW1mbikKLXsKLSAgICBsMl9w Z2VudHJ5X3QgbDJlOwotCi0gICAgQVNTRVJUKCFwYWdpbmdfbW9kZV90cmFuc2xhdGUoY3VycmVu dC0+ZG9tYWluKSk7Ci0gICAgQVNTRVJUKCFwYWdpbmdfbW9kZV9leHRlcm5hbChjdXJyZW50LT5k b21haW4pKTsKLQotICAgIGlmICggdW5saWtlbHkoIV9fYWRkcl9vayhhZGRyKSkgKQotICAgICAg ICByZXR1cm4gTlVMTDsKLQotICAgIC8qIEZpbmQgdGhpcyBsMWUgYW5kIGl0cyBlbmNsb3Npbmcg bDFtZm4gaW4gdGhlIGxpbmVhciBtYXAuICovCi0gICAgaWYgKCBfX2NvcHlfZnJvbV91c2VyKCZs MmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZfX2xpbmVhcl9sMl90YWJsZVtsMl9saW5l YXJfb2Zmc2V0KGFkZHIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGwyX3Bn ZW50cnlfdCkpICkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBDaGVjayBmbGFncyB0 aGF0IGl0IHdpbGwgYmUgc2FmZSB0byByZWFkIHRoZSBsMWUuICovCi0gICAgaWYgKCAobDJlX2dl dF9mbGFncyhsMmUpICYgKF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9QU0UpKSAhPSBfUEFHRV9QUkVT RU5UICkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAqZ2wxbWZuID0gbDJlX2dldF9wZm4o bDJlKTsKLQotICAgIHJldHVybiAobDFfcGdlbnRyeV90ICopbWFwX2RvbWFpbl9wYWdlKF9tZm4o KmdsMW1mbikpICsKLSAgICAgICAgICAgbDFfdGFibGVfb2Zmc2V0KGFkZHIpOwotfQotCi0vKiBQ dWxsIGRvd24gdGhlIG1hcHBpbmcgd2UgZ290IGZyb20gZ3Vlc3RfbWFwX2wxZSgpLiAqLwotc3Rh dGljIGlubGluZSB2b2lkIGd1ZXN0X3VubWFwX2wxZSh2b2lkICpwKQotewotICAgIHVubWFwX2Rv bWFpbl9wYWdlKHApOwotfQotCi0vKiBSZWFkIGEgUFYgZ3Vlc3QncyBsMWUgdGhhdCBtYXBzIHRo aXMgdmlydHVhbCBhZGRyZXNzLiAqLwotc3RhdGljIGlubGluZSB2b2lkIGd1ZXN0X2dldF9lZmZf bDFlKHVuc2lnbmVkIGxvbmcgYWRkciwgbDFfcGdlbnRyeV90ICplZmZfbDFlKQotewotICAgIEFT U0VSVCghcGFnaW5nX21vZGVfdHJhbnNsYXRlKGN1cnJlbnQtPmRvbWFpbikpOwotICAgIEFTU0VS VCghcGFnaW5nX21vZGVfZXh0ZXJuYWwoY3VycmVudC0+ZG9tYWluKSk7Ci0KLSAgICBpZiAoIHVu bGlrZWx5KCFfX2FkZHJfb2soYWRkcikpIHx8Ci0gICAgICAgICBfX2NvcHlfZnJvbV91c2VyKGVm Zl9sMWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZfX2xpbmVhcl9sMV90YWJsZVtsMV9s aW5lYXJfb2Zmc2V0KGFkZHIpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGwx X3BnZW50cnlfdCkpICkKLSAgICAgICAgKmVmZl9sMWUgPSBsMWVfZW1wdHkoKTsKLX0KLQotLyoK LSAqIFJlYWQgdGhlIGd1ZXN0J3MgbDFlIHRoYXQgbWFwcyB0aGlzIGFkZHJlc3MsIGZyb20gdGhl IGtlcm5lbC1tb2RlCi0gKiBwYWdlIHRhYmxlcy4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGd1 ZXN0X2dldF9lZmZfa2Vybl9sMWUoc3RydWN0IHZjcHUgKnYsIHVuc2lnbmVkIGxvbmcgYWRkciwK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmVmZl9sMWUp Ci17Ci0gICAgYm9vbF90IHVzZXJfbW9kZSA9ICEodi0+YXJjaC5mbGFncyAmIFRGX2tlcm5lbF9t b2RlKTsKLSNkZWZpbmUgVE9HR0xFX01PREUoKSBpZiAoIHVzZXJfbW9kZSApIHRvZ2dsZV9ndWVz dF9tb2RlKHYpCi0KLSAgICBUT0dHTEVfTU9ERSgpOwotICAgIGd1ZXN0X2dldF9lZmZfbDFlKGFk ZHIsIGVmZl9sMWUpOwotICAgIFRPR0dMRV9NT0RFKCk7Ci19Ci0KIGNvbnN0IGNoYXIgX19zZWN0 aW9uKCIuYnNzLnBhZ2VfYWxpZ25lZC5jb25zdCIpIF9fYWxpZ25lZChQQUdFX1NJWkUpCiAgICAg emVyb19wYWdlW1BBR0VfU0laRV07CiAKQEAgLTYzNSw0OSArNTAxLDYgQEAgc3RhdGljIGludCBh bGxvY19zZWdkZXNjX3BhZ2Uoc3RydWN0IHBhZ2VfaW5mbyAqcGFnZSkKICAgICByZXR1cm4gaSA9 PSA1MTIgPyAwIDogLUVJTlZBTDsKIH0KIAotCi0vKiBNYXAgc2hhZG93IHBhZ2UgYXQgb2Zmc2V0 IEBvZmYuICovCi1pbnQgbWFwX2xkdF9zaGFkb3dfcGFnZSh1bnNpZ25lZCBpbnQgb2ZmKQotewot ICAgIHN0cnVjdCB2Y3B1ICp2ID0gY3VycmVudDsKLSAgICBzdHJ1Y3QgZG9tYWluICpkID0gdi0+ ZG9tYWluOwotICAgIHVuc2lnbmVkIGxvbmcgZ21mbjsKLSAgICBzdHJ1Y3QgcGFnZV9pbmZvICpw YWdlOwotICAgIGwxX3BnZW50cnlfdCBsMWUsIG5sMWU7Ci0gICAgdW5zaWduZWQgbG9uZyBndmEg PSB2LT5hcmNoLnB2X3ZjcHUubGR0X2Jhc2UgKyAob2ZmIDw8IFBBR0VfU0hJRlQpOwotICAgIGlu dCBva2F5OwotCi0gICAgQlVHX09OKHVubGlrZWx5KGluX2lycSgpKSk7Ci0KLSAgICBpZiAoIGlz X3B2XzMyYml0X2RvbWFpbihkKSApCi0gICAgICAgIGd2YSA9ICh1MzIpZ3ZhOwotICAgIGd1ZXN0 X2dldF9lZmZfa2Vybl9sMWUodiwgZ3ZhLCAmbDFlKTsKLSAgICBpZiAoIHVubGlrZWx5KCEobDFl X2dldF9mbGFncyhsMWUpICYgX1BBR0VfUFJFU0VOVCkpICkKLSAgICAgICAgcmV0dXJuIDA7Ci0K LSAgICBnbWZuID0gbDFlX2dldF9wZm4obDFlKTsKLSAgICBwYWdlID0gZ2V0X3BhZ2VfZnJvbV9n Zm4oZCwgZ21mbiwgTlVMTCwgUDJNX0FMTE9DKTsKLSAgICBpZiAoIHVubGlrZWx5KCFwYWdlKSAp Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgb2theSA9IGdldF9wYWdlX3R5cGUocGFnZSwgUEdU X3NlZ19kZXNjX3BhZ2UpOwotICAgIGlmICggdW5saWtlbHkoIW9rYXkpICkKLSAgICB7Ci0gICAg ICAgIHB1dF9wYWdlKHBhZ2UpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBubDFl ID0gbDFlX2Zyb21fcGZuKHBhZ2VfdG9fbWZuKHBhZ2UpLCBsMWVfZ2V0X2ZsYWdzKGwxZSkgfCBf UEFHRV9SVyk7Ci0KLSAgICBzcGluX2xvY2soJnYtPmFyY2gucHZfdmNwdS5zaGFkb3dfbGR0X2xv Y2spOwotICAgIGwxZV93cml0ZSgmZ2R0X2xkdF9wdGVzKGQsIHYpW29mZiArIDE2XSwgbmwxZSk7 Ci0gICAgdi0+YXJjaC5wdl92Y3B1LnNoYWRvd19sZHRfbWFwY250Kys7Ci0gICAgc3Bpbl91bmxv Y2soJnYtPmFyY2gucHZfdmNwdS5zaGFkb3dfbGR0X2xvY2spOwotCi0gICAgcmV0dXJuIDE7Ci19 Ci0KLQogaW50IGdldF9wYWdlX2Zyb21fcGFnZW5yKHVuc2lnbmVkIGxvbmcgcGFnZV9uciwgc3Ry dWN0IGRvbWFpbiAqZCkKIHsKICAgICBzdHJ1Y3QgcGFnZV9pbmZvICpwYWdlID0gbWZuX3RvX3Bh Z2UocGFnZV9ucik7CkBAIC0xNzQ0LDM0NCArMTU2Nyw2IEBAIHZvaWQgcGFnZV91bmxvY2soc3Ry dWN0IHBhZ2VfaW5mbyAqcGFnZSkKICAgICB9IHdoaWxlICggKHkgPSBjbXB4Y2hnKCZwYWdlLT51 LmludXNlLnR5cGVfaW5mbywgeCwgbngpKSAhPSB4ICk7CiB9CiAKLS8qIEhvdyB0byB3cml0ZSBh biBlbnRyeSB0byB0aGUgZ3Vlc3QgcGFnZXRhYmxlcy4KLSAqIFJldHVybnMgMCBmb3IgZmFpbHVy ZSAocG9pbnRlciBub3QgdmFsaWQpLCAxIGZvciBzdWNjZXNzLiAqLwotc3RhdGljIGlubGluZSBp bnQgdXBkYXRlX2ludHB0ZShpbnRwdGVfdCAqcCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGludHB0ZV90IG9sZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlu dHB0ZV90IG5ldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9u ZyBtZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB2Y3B1ICp2LAot ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlc2VydmVfYWQpCi17Ci0gICAg aW50IHJ2ID0gMTsKLSNpZm5kZWYgUFRFX1VQREFURV9XSVRIX0NNUFhDSEcKLSAgICBpZiAoICFw cmVzZXJ2ZV9hZCApCi0gICAgewotICAgICAgICBydiA9IHBhZ2luZ193cml0ZV9ndWVzdF9lbnRy eSh2LCBwLCBuZXcsIF9tZm4obWZuKSk7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgIHsK LSAgICAgICAgaW50cHRlX3QgdCA9IG9sZDsKLSAgICAgICAgZm9yICggOyA7ICkKLSAgICAgICAg ewotICAgICAgICAgICAgaW50cHRlX3QgX25ldyA9IG5ldzsKLSAgICAgICAgICAgIGlmICggcHJl c2VydmVfYWQgKQotICAgICAgICAgICAgICAgIF9uZXcgfD0gb2xkICYgKF9QQUdFX0FDQ0VTU0VE IHwgX1BBR0VfRElSVFkpOwotCi0gICAgICAgICAgICBydiA9IHBhZ2luZ19jbXB4Y2hnX2d1ZXN0 X2VudHJ5KHYsIHAsICZ0LCBfbmV3LCBfbWZuKG1mbikpOwotICAgICAgICAgICAgaWYgKCB1bmxp a2VseShydiA9PSAwKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTUVNX0xPRygi RmFpbGVkIHRvIHVwZGF0ZSAlIiBQUklwdGUgIiAtPiAlIiBQUklwdGUKLSAgICAgICAgICAgICAg ICAgICAgICAgICI6IHNhdyAlIiBQUklwdGUsIG9sZCwgX25ldywgdCk7Ci0gICAgICAgICAgICAg ICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggdCA9PSBvbGQgKQot ICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBBbGxvd2VkIHRvIGNoYW5n ZSBpbiBBY2Nlc3NlZC9EaXJ0eSBmbGFncyBvbmx5LiAqLwotICAgICAgICAgICAgQlVHX09OKCh0 IF4gb2xkKSAmIH4oaW50cHRlX3QpKF9QQUdFX0FDQ0VTU0VEfF9QQUdFX0RJUlRZKSk7Ci0KLSAg ICAgICAgICAgIG9sZCA9IHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJ2OwotfQot Ci0vKiBNYWNybyB0aGF0IHdyYXBzIHRoZSBhcHByb3ByaWF0ZSB0eXBlLWNoYW5nZXMgYXJvdW5k IHVwZGF0ZV9pbnRwdGUoKS4KLSAqIEFyZ3VtZW50cyBhcmU6IHR5cGUsIHB0ciwgb2xkLCBuZXcs IG1mbiwgdmNwdSAqLwotI2RlZmluZSBVUERBVEVfRU5UUlkoX3QsX3AsX28sX24sX20sX3YsX2Fk KSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdXBkYXRlX2ludHB0ZSgmX3QgIyMgZV9n ZXRfaW50cHRlKCooX3ApKSwgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAg ICAgIF90ICMjIGVfZ2V0X2ludHB0ZShfbyksIF90ICMjIGVfZ2V0X2ludHB0ZShfbiksICAgXAot ICAgICAgICAgICAgICAgICAgKF9tKSwgKF92KSwgKF9hZCkpCi0KLS8qCi0gKiBQVEUgZmxhZ3Mg dGhhdCBhIGd1ZXN0IG1heSBjaGFuZ2Ugd2l0aG91dCByZS12YWxpZGF0aW5nIHRoZSBQVEUuCi0g KiBBbGwgb3RoZXIgYml0cyBhZmZlY3QgdHJhbnNsYXRpb24sIGNhY2hpbmcsIG9yIFhlbidzIHNh ZmV0eS4KLSAqLwotI2RlZmluZSBGQVNUUEFUSF9GTEFHX1dISVRFTElTVCAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKF9QQUdFX05YX0JJVCB8IF9QQUdFX0FWQUlM X0hJR0ggfCBfUEFHRV9BVkFJTCB8IF9QQUdFX0dMT0JBTCB8IFwKLSAgICAgX1BBR0VfRElSVFkg fCBfUEFHRV9BQ0NFU1NFRCB8IF9QQUdFX1VTRVIpCi0KLS8qIFVwZGF0ZSB0aGUgTDEgZW50cnkg YXQgcGwxZSB0byBuZXcgdmFsdWUgbmwxZS4gKi8KLXN0YXRpYyBpbnQgbW9kX2wxX2VudHJ5KGwx X3BnZW50cnlfdCAqcGwxZSwgbDFfcGdlbnRyeV90IG5sMWUsCi0gICAgICAgICAgICAgICAgICAg ICAgICB1bnNpZ25lZCBsb25nIGdsMW1mbiwgaW50IHByZXNlcnZlX2FkLAotICAgICAgICAgICAg ICAgICAgICAgICAgc3RydWN0IHZjcHUgKnB0X3ZjcHUsIHN0cnVjdCBkb21haW4gKnBnX2RvbSkK LXsKLSAgICBsMV9wZ2VudHJ5X3Qgb2wxZTsKLSAgICBzdHJ1Y3QgZG9tYWluICpwdF9kb20gPSBw dF92Y3B1LT5kb21haW47Ci0gICAgaW50IHJjID0gMDsKLQotICAgIGlmICggdW5saWtlbHkoX19j b3B5X2Zyb21fdXNlcigmb2wxZSwgcGwxZSwgc2l6ZW9mKG9sMWUpKSAhPSAwKSApCi0gICAgICAg IHJldHVybiAtRUZBVUxUOwotCi0gICAgaWYgKCB1bmxpa2VseShwYWdpbmdfbW9kZV9yZWZjb3Vu dHMocHRfZG9tKSkgKQotICAgIHsKLSAgICAgICAgaWYgKCBVUERBVEVfRU5UUlkobDEsIHBsMWUs IG9sMWUsIG5sMWUsIGdsMW1mbiwgcHRfdmNwdSwgcHJlc2VydmVfYWQpICkKLSAgICAgICAgICAg IHJldHVybiAwOwotICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgIH0KLQotICAgIGlmICggbDFl X2dldF9mbGFncyhubDFlKSAmIF9QQUdFX1BSRVNFTlQgKQotICAgIHsKLSAgICAgICAgLyogVHJh bnNsYXRlIGZvcmVpZ24gZ3Vlc3QgYWRkcmVzc2VzLiAqLwotICAgICAgICBzdHJ1Y3QgcGFnZV9p bmZvICpwYWdlID0gTlVMTDsKLQotICAgICAgICBpZiAoIHVubGlrZWx5KGwxZV9nZXRfZmxhZ3Mo bmwxZSkgJiBsMV9kaXNhbGxvd19tYXNrKHB0X2RvbSkpICkKLSAgICAgICAgewotICAgICAgICAg ICAgTUVNX0xPRygiQmFkIEwxIGZsYWdzICV4IiwKLSAgICAgICAgICAgICAgICAgICAgbDFlX2dl dF9mbGFncyhubDFlKSAmIGwxX2Rpc2FsbG93X21hc2socHRfZG9tKSk7Ci0gICAgICAgICAgICBy ZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcGFnaW5nX21vZGVfdHJh bnNsYXRlKHBnX2RvbSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwYWdlID0gZ2V0X3BhZ2Vf ZnJvbV9nZm4ocGdfZG9tLCBsMWVfZ2V0X3BmbihubDFlKSwgTlVMTCwgUDJNX0FMTE9DKTsKLSAg ICAgICAgICAgIGlmICggIXBhZ2UgKQotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwot ICAgICAgICAgICAgbmwxZSA9IGwxZV9mcm9tX3BmbihwYWdlX3RvX21mbihwYWdlKSwgbDFlX2dl dF9mbGFncyhubDFlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGYXN0IHBhdGggZm9yIHN1 ZmZpY2llbnRseS1zaW1pbGFyIG1hcHBpbmdzLiAqLwotICAgICAgICBpZiAoICFsMWVfaGFzX2No YW5nZWQob2wxZSwgbmwxZSwgfkZBU1RQQVRIX0ZMQUdfV0hJVEVMSVNUKSApCi0gICAgICAgIHsK LSAgICAgICAgICAgIGFkanVzdF9ndWVzdF9sMWUobmwxZSwgcHRfZG9tKTsKLSAgICAgICAgICAg IHJjID0gVVBEQVRFX0VOVFJZKGwxLCBwbDFlLCBvbDFlLCBubDFlLCBnbDFtZm4sIHB0X3ZjcHUs Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZV9hZCk7Ci0gICAgICAgICAg ICBpZiAoIHBhZ2UgKQotICAgICAgICAgICAgICAgIHB1dF9wYWdlKHBhZ2UpOwotICAgICAgICAg ICAgcmV0dXJuIHJjID8gMCA6IC1FQlVTWTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAo IHJjID0gZ2V0X3BhZ2VfZnJvbV9sMWUobmwxZSwgcHRfZG9tLCBwZ19kb20pICkKLSAgICAgICAg ewotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKCBwYWdlICkKLSAgICAgICAgICAg ICAgICBwdXRfcGFnZShwYWdlKTsKLSAgICAgICAgICAgIHJldHVybiByYzsKLSAgICAgICAgY2Fz ZSAwOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgX1BBR0VfUlcgLi4uIF9QQUdF X1JXIHwgUEFHRV9DQUNIRV9BVFRSUzoKLSAgICAgICAgICAgIEFTU0VSVCghKHJjICYgfihfUEFH RV9SVyB8IFBBR0VfQ0FDSEVfQVRUUlMpKSk7Ci0gICAgICAgICAgICBsMWVfZmxpcF9mbGFncyhu bDFlLCByYyk7Ci0gICAgICAgICAgICByYyA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg ICAgfQotICAgICAgICBpZiAoIHBhZ2UgKQotICAgICAgICAgICAgcHV0X3BhZ2UocGFnZSk7Ci0K LSAgICAgICAgYWRqdXN0X2d1ZXN0X2wxZShubDFlLCBwdF9kb20pOwotICAgICAgICBpZiAoIHVu bGlrZWx5KCFVUERBVEVfRU5UUlkobDEsIHBsMWUsIG9sMWUsIG5sMWUsIGdsMW1mbiwgcHRfdmNw dSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlX2FkKSkgKQot ICAgICAgICB7Ci0gICAgICAgICAgICBvbDFlID0gbmwxZTsKLSAgICAgICAgICAgIHJjID0gLUVC VVNZOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCB1bmxpa2VseSghVVBEQVRFX0VO VFJZKGwxLCBwbDFlLCBvbDFlLCBubDFlLCBnbDFtZm4sIHB0X3ZjcHUsCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVfYWQpKSApCi0gICAgewotICAgICAgICBy ZXR1cm4gLUVCVVNZOwotICAgIH0KLQotICAgIHB1dF9wYWdlX2Zyb21fbDFlKG9sMWUsIHB0X2Rv bSk7Ci0gICAgcmV0dXJuIHJjOwotfQotCi0KLS8qIFVwZGF0ZSB0aGUgTDIgZW50cnkgYXQgcGwy ZSB0byBuZXcgdmFsdWUgbmwyZS4gcGwyZSBpcyB3aXRoaW4gZnJhbWUgcGZuLiAqLwotc3RhdGlj IGludCBtb2RfbDJfZW50cnkobDJfcGdlbnRyeV90ICpwbDJlLCAKLSAgICAgICAgICAgICAgICAg ICAgICAgIGwyX3BnZW50cnlfdCBubDJlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2ln bmVkIGxvbmcgcGZuLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXNlcnZlX2FkLAot ICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZjcHUgKnZjcHUpCi17Ci0gICAgbDJfcGdl bnRyeV90IG9sMmU7Ci0gICAgc3RydWN0IGRvbWFpbiAqZCA9IHZjcHUtPmRvbWFpbjsKLSAgICBz dHJ1Y3QgcGFnZV9pbmZvICpsMnBnID0gbWZuX3RvX3BhZ2UocGZuKTsKLSAgICB1bnNpZ25lZCBs b25nIHR5cGUgPSBsMnBnLT51LmludXNlLnR5cGVfaW5mbzsKLSAgICBpbnQgcmMgPSAwOwotCi0g ICAgaWYgKCB1bmxpa2VseSghaXNfZ3Vlc3RfbDJfc2xvdChkLCB0eXBlLCBwZ2VudHJ5X3B0cl90 b19zbG90KHBsMmUpKSkgKQotICAgIHsKLSAgICAgICAgTUVNX0xPRygiSWxsZWdhbCBMMiB1cGRh dGUgYXR0ZW1wdCBpbiBYZW4tcHJpdmF0ZSBhcmVhICVwIiwgcGwyZSk7Ci0gICAgICAgIHJldHVy biAtRVBFUk07Ci0gICAgfQotCi0gICAgaWYgKCB1bmxpa2VseShfX2NvcHlfZnJvbV91c2VyKCZv bDJlLCBwbDJlLCBzaXplb2Yob2wyZSkpICE9IDApICkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7 Ci0KLSAgICBpZiAoIGwyZV9nZXRfZmxhZ3MobmwyZSkgJiBfUEFHRV9QUkVTRU5UICkKLSAgICB7 Ci0gICAgICAgIGlmICggdW5saWtlbHkobDJlX2dldF9mbGFncyhubDJlKSAmIEwyX0RJU0FMTE9X X01BU0spICkKLSAgICAgICAgewotICAgICAgICAgICAgTUVNX0xPRygiQmFkIEwyIGZsYWdzICV4 IiwKLSAgICAgICAgICAgICAgICAgICAgbDJlX2dldF9mbGFncyhubDJlKSAmIEwyX0RJU0FMTE9X X01BU0spOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAg ICAvKiBGYXN0IHBhdGggZm9yIHN1ZmZpY2llbnRseS1zaW1pbGFyIG1hcHBpbmdzLiAqLwotICAg ICAgICBpZiAoICFsMmVfaGFzX2NoYW5nZWQob2wyZSwgbmwyZSwgfkZBU1RQQVRIX0ZMQUdfV0hJ VEVMSVNUKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkanVzdF9ndWVzdF9sMmUobmwyZSwg ZCk7Ci0gICAgICAgICAgICBpZiAoIFVQREFURV9FTlRSWShsMiwgcGwyZSwgb2wyZSwgbmwyZSwg cGZuLCB2Y3B1LCBwcmVzZXJ2ZV9hZCkgKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAg ICAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggdW5saWtl bHkoKHJjID0gZ2V0X3BhZ2VfZnJvbV9sMmUobmwyZSwgcGZuLCBkKSkgPCAwKSApCi0gICAgICAg ICAgICByZXR1cm4gcmM7Ci0KLSAgICAgICAgYWRqdXN0X2d1ZXN0X2wyZShubDJlLCBkKTsKLSAg ICAgICAgaWYgKCB1bmxpa2VseSghVVBEQVRFX0VOVFJZKGwyLCBwbDJlLCBvbDJlLCBubDJlLCBw Zm4sIHZjcHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZV9h ZCkpICkKLSAgICAgICAgewotICAgICAgICAgICAgb2wyZSA9IG5sMmU7Ci0gICAgICAgICAgICBy YyA9IC1FQlVTWTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICggdW5saWtlbHkoIVVQ REFURV9FTlRSWShsMiwgcGwyZSwgb2wyZSwgbmwyZSwgcGZuLCB2Y3B1LAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlX2FkKSkgKQotICAgIHsKLSAgICAgICAg cmV0dXJuIC1FQlVTWTsKLSAgICB9Ci0KLSAgICBwdXRfcGFnZV9mcm9tX2wyZShvbDJlLCBwZm4p OwotICAgIHJldHVybiByYzsKLX0KLQotLyogVXBkYXRlIHRoZSBMMyBlbnRyeSBhdCBwbDNlIHRv IG5ldyB2YWx1ZSBubDNlLiBwbDNlIGlzIHdpdGhpbiBmcmFtZSBwZm4uICovCi1zdGF0aWMgaW50 IG1vZF9sM19lbnRyeShsM19wZ2VudHJ5X3QgKnBsM2UsIAotICAgICAgICAgICAgICAgICAgICAg ICAgbDNfcGdlbnRyeV90IG5sM2UsIAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQg bG9uZyBwZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlc2VydmVfYWQsCi0gICAg ICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmNwdSAqdmNwdSkKLXsKLSAgICBsM19wZ2VudHJ5 X3Qgb2wzZTsKLSAgICBzdHJ1Y3QgZG9tYWluICpkID0gdmNwdS0+ZG9tYWluOwotICAgIGludCBy YyA9IDA7Ci0KLSAgICBpZiAoIHVubGlrZWx5KCFpc19ndWVzdF9sM19zbG90KHBnZW50cnlfcHRy X3RvX3Nsb3QocGwzZSkpKSApCi0gICAgewotICAgICAgICBNRU1fTE9HKCJJbGxlZ2FsIEwzIHVw ZGF0ZSBhdHRlbXB0IGluIFhlbi1wcml2YXRlIGFyZWEgJXAiLCBwbDNlKTsKLSAgICAgICAgcmV0 dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBEaXNhbGxvdyB1cGRhdGVzIHRv IGZpbmFsIEwzIHNsb3QuIEl0IGNvbnRhaW5zIFhlbiBtYXBwaW5ncywgYW5kIGl0Ci0gICAgICog d291bGQgYmUgYSBwYWluIHRvIGVuc3VyZSB0aGV5IHJlbWFpbiBjb250aW51b3VzbHkgdmFsaWQg dGhyb3VnaG91dC4KLSAgICAgKi8KLSAgICBpZiAoIGlzX3B2XzMyYml0X2RvbWFpbihkKSAmJiAo cGdlbnRyeV9wdHJfdG9fc2xvdChwbDNlKSA+PSAzKSApCi0gICAgICAgIHJldHVybiAtRUlOVkFM OwotCi0gICAgaWYgKCB1bmxpa2VseShfX2NvcHlfZnJvbV91c2VyKCZvbDNlLCBwbDNlLCBzaXpl b2Yob2wzZSkpICE9IDApICkKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0KLSAgICBpZiAoIGwz ZV9nZXRfZmxhZ3MobmwzZSkgJiBfUEFHRV9QUkVTRU5UICkKLSAgICB7Ci0gICAgICAgIGlmICgg dW5saWtlbHkobDNlX2dldF9mbGFncyhubDNlKSAmIGwzX2Rpc2FsbG93X21hc2soZCkpICkKLSAg ICAgICAgewotICAgICAgICAgICAgTUVNX0xPRygiQmFkIEwzIGZsYWdzICV4IiwKLSAgICAgICAg ICAgICAgICAgICAgbDNlX2dldF9mbGFncyhubDNlKSAmIGwzX2Rpc2FsbG93X21hc2soZCkpOwot ICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGYXN0 IHBhdGggZm9yIHN1ZmZpY2llbnRseS1zaW1pbGFyIG1hcHBpbmdzLiAqLwotICAgICAgICBpZiAo ICFsM2VfaGFzX2NoYW5nZWQob2wzZSwgbmwzZSwgfkZBU1RQQVRIX0ZMQUdfV0hJVEVMSVNUKSAp Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFkanVzdF9ndWVzdF9sM2UobmwzZSwgZCk7Ci0gICAg ICAgICAgICByYyA9IFVQREFURV9FTlRSWShsMywgcGwzZSwgb2wzZSwgbmwzZSwgcGZuLCB2Y3B1 LCBwcmVzZXJ2ZV9hZCk7Ci0gICAgICAgICAgICByZXR1cm4gcmMgPyAwIDogLUVGQVVMVDsKLSAg ICAgICAgfQotCi0gICAgICAgIHJjID0gZ2V0X3BhZ2VfZnJvbV9sM2UobmwzZSwgcGZuLCBkLCAw KTsKLSAgICAgICAgaWYgKCB1bmxpa2VseShyYyA8IDApICkKLSAgICAgICAgICAgIHJldHVybiBy YzsKLSAgICAgICAgcmMgPSAwOwotCi0gICAgICAgIGFkanVzdF9ndWVzdF9sM2UobmwzZSwgZCk7 Ci0gICAgICAgIGlmICggdW5saWtlbHkoIVVQREFURV9FTlRSWShsMywgcGwzZSwgb2wzZSwgbmwz ZSwgcGZuLCB2Y3B1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2Vy dmVfYWQpKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9sM2UgPSBubDNlOwotICAgICAgICAg ICAgcmMgPSAtRUZBVUxUOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCB1bmxpa2Vs eSghVVBEQVRFX0VOVFJZKGwzLCBwbDNlLCBvbDNlLCBubDNlLCBwZm4sIHZjcHUsCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVfYWQpKSApCi0gICAgewotICAg ICAgICByZXR1cm4gLUVGQVVMVDsKLSAgICB9Ci0KLSAgICBpZiAoIGxpa2VseShyYyA9PSAwKSAp Ci0gICAgICAgIGlmICggIWNyZWF0ZV9wYWVfeGVuX21hcHBpbmdzKGQsIHBsM2UpICkKLSAgICAg ICAgICAgIEJVRygpOwotCi0gICAgcHV0X3BhZ2VfZnJvbV9sM2Uob2wzZSwgcGZuLCAwLCAxKTsK LSAgICByZXR1cm4gcmM7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgTDQgZW50cnkgYXQgcGw0ZSB0byBu ZXcgdmFsdWUgbmw0ZS4gcGw0ZSBpcyB3aXRoaW4gZnJhbWUgcGZuLiAqLwotc3RhdGljIGludCBt b2RfbDRfZW50cnkobDRfcGdlbnRyeV90ICpwbDRlLCAKLSAgICAgICAgICAgICAgICAgICAgICAg IGw0X3BnZW50cnlfdCBubDRlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxv bmcgcGZuLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXNlcnZlX2FkLAotICAgICAg ICAgICAgICAgICAgICAgICAgc3RydWN0IHZjcHUgKnZjcHUpCi17Ci0gICAgc3RydWN0IGRvbWFp biAqZCA9IHZjcHUtPmRvbWFpbjsKLSAgICBsNF9wZ2VudHJ5X3Qgb2w0ZTsKLSAgICBpbnQgcmMg PSAwOwotCi0gICAgaWYgKCB1bmxpa2VseSghaXNfZ3Vlc3RfbDRfc2xvdChkLCBwZ2VudHJ5X3B0 cl90b19zbG90KHBsNGUpKSkgKQotICAgIHsKLSAgICAgICAgTUVNX0xPRygiSWxsZWdhbCBMNCB1 cGRhdGUgYXR0ZW1wdCBpbiBYZW4tcHJpdmF0ZSBhcmVhICVwIiwgcGw0ZSk7Ci0gICAgICAgIHJl dHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIGlmICggdW5saWtlbHkoX19jb3B5X2Zyb21fdXNl cigmb2w0ZSwgcGw0ZSwgc2l6ZW9mKG9sNGUpKSAhPSAwKSApCi0gICAgICAgIHJldHVybiAtRUZB VUxUOwotCi0gICAgaWYgKCBsNGVfZ2V0X2ZsYWdzKG5sNGUpICYgX1BBR0VfUFJFU0VOVCApCi0g ICAgewotICAgICAgICBpZiAoIHVubGlrZWx5KGw0ZV9nZXRfZmxhZ3Mobmw0ZSkgJiBMNF9ESVNB TExPV19NQVNLKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1FTV9MT0coIkJhZCBMNCBmbGFn cyAleCIsCi0gICAgICAgICAgICAgICAgICAgIGw0ZV9nZXRfZmxhZ3Mobmw0ZSkgJiBMNF9ESVNB TExPV19NQVNLKTsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAg ICAgICAgLyogRmFzdCBwYXRoIGZvciBzdWZmaWNpZW50bHktc2ltaWxhciBtYXBwaW5ncy4gKi8K LSAgICAgICAgaWYgKCAhbDRlX2hhc19jaGFuZ2VkKG9sNGUsIG5sNGUsIH5GQVNUUEFUSF9GTEFH X1dISVRFTElTVCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGp1c3RfZ3Vlc3RfbDRlKG5s NGUsIGQpOwotICAgICAgICAgICAgcmMgPSBVUERBVEVfRU5UUlkobDQsIHBsNGUsIG9sNGUsIG5s NGUsIHBmbiwgdmNwdSwgcHJlc2VydmVfYWQpOwotICAgICAgICAgICAgcmV0dXJuIHJjID8gMCA6 IC1FRkFVTFQ7Ci0gICAgICAgIH0KLQotICAgICAgICByYyA9IGdldF9wYWdlX2Zyb21fbDRlKG5s NGUsIHBmbiwgZCwgMCk7Ci0gICAgICAgIGlmICggdW5saWtlbHkocmMgPCAwKSApCi0gICAgICAg ICAgICByZXR1cm4gcmM7Ci0gICAgICAgIHJjID0gMDsKLQotICAgICAgICBhZGp1c3RfZ3Vlc3Rf bDRlKG5sNGUsIGQpOwotICAgICAgICBpZiAoIHVubGlrZWx5KCFVUERBVEVfRU5UUlkobDQsIHBs NGUsIG9sNGUsIG5sNGUsIHBmbiwgdmNwdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHByZXNlcnZlX2FkKSkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBvbDRlID0gbmw0 ZTsKLSAgICAgICAgICAgIHJjID0gLUVGQVVMVDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNl IGlmICggdW5saWtlbHkoIVVQREFURV9FTlRSWShsNCwgcGw0ZSwgb2w0ZSwgbmw0ZSwgcGZuLCB2 Y3B1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlX2FkKSkg KQotICAgIHsKLSAgICAgICAgcmV0dXJuIC1FRkFVTFQ7Ci0gICAgfQotCi0gICAgcHV0X3BhZ2Vf ZnJvbV9sNGUob2w0ZSwgcGZuLCAwLCAxKTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KIHN0YXRpYyBp bnQgY2xlYW51cF9wYWdlX2NhY2hlYXR0cihzdHJ1Y3QgcGFnZV9pbmZvICpwYWdlKQogewogICAg IHVuc2lnbmVkIGludCBjYWNoZWF0dHIgPQpAQCAtMjg0OSwxMjUgKzIzMzQsMjMgQEAgaW50IHZj cHVfZGVzdHJveV9wYWdldGFibGVzKHN0cnVjdCB2Y3B1ICp2KQogICAgIHJldHVybiByYyAhPSAt RUlOVFIgPyByYyA6IC1FUkVTVEFSVDsKIH0KIAotaW50IG5ld19ndWVzdF9jcjModW5zaWduZWQg bG9uZyBtZm4pCitzdHJ1Y3QgZG9tYWluICptbV9nZXRfcGdfb3duZXIoZG9taWRfdCBkb21pZCkK IHsKLSAgICBzdHJ1Y3QgdmNwdSAqY3VyciA9IGN1cnJlbnQ7Ci0gICAgc3RydWN0IGRvbWFpbiAq ZCA9IGN1cnItPmRvbWFpbjsKLSAgICBpbnQgcmM7Ci0gICAgdW5zaWduZWQgbG9uZyBvbGRfYmFz ZV9tZm47CisgICAgc3RydWN0IGRvbWFpbiAqcGdfb3duZXIgPSBOVUxMLCAqY3VyciA9IGN1cnJl bnQtPmRvbWFpbjsKIAotICAgIGlmICggaXNfcHZfMzJiaXRfZG9tYWluKGQpICkKKyAgICBpZiAo IGxpa2VseShkb21pZCA9PSBET01JRF9TRUxGKSApCiAgICAgewotICAgICAgICB1bnNpZ25lZCBs b25nIGd0X21mbiA9IHBhZ2V0YWJsZV9nZXRfcGZuKGN1cnItPmFyY2guZ3Vlc3RfdGFibGUpOwot ICAgICAgICBsNF9wZ2VudHJ5X3QgKnBsNGUgPSBtYXBfZG9tYWluX3BhZ2UoX21mbihndF9tZm4p KTsKLQotICAgICAgICByYyA9IHBhZ2luZ19tb2RlX3JlZmNvdW50cyhkKQotICAgICAgICAgICAg ID8gLUVJTlZBTCAvKiBPbGQgY29kZSB3YXMgYnJva2VuLCBidXQgd2hhdCBzaG91bGQgaXQgYmU/ ICovCi0gICAgICAgICAgICAgOiBtb2RfbDRfZW50cnkoCi0gICAgICAgICAgICAgICAgICAgIHBs NGUsCi0gICAgICAgICAgICAgICAgICAgIGw0ZV9mcm9tX3BmbigKLSAgICAgICAgICAgICAgICAg ICAgICAgIG1mbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChfUEFHRV9QUkVTRU5UfF9QQUdF X1JXfF9QQUdFX1VTRVJ8X1BBR0VfQUNDRVNTRUQpKSwKLSAgICAgICAgICAgICAgICAgICAgZ3Rf bWZuLCAwLCBjdXJyKTsKLSAgICAgICAgdW5tYXBfZG9tYWluX3BhZ2UocGw0ZSk7Ci0gICAgICAg IHN3aXRjaCAoIHJjICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBi cmVhazsKLSAgICAgICAgY2FzZSAtRUlOVFI6Ci0gICAgICAgIGNhc2UgLUVSRVNUQVJUOgotICAg ICAgICAgICAgcmV0dXJuIC1FUkVTVEFSVDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAg IE1FTV9MT0coIkVycm9yIHdoaWxlIGluc3RhbGxpbmcgbmV3IGNvbXBhdCBiYXNlcHRyICVseCIs IG1mbik7Ci0gICAgICAgICAgICByZXR1cm4gcmM7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnZh bGlkYXRlX3NoYWRvd19sZHQoY3VyciwgMCk7Ci0gICAgICAgIHdyaXRlX3B0YmFzZShjdXJyKTsK LQotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcGdfb3duZXIgPSByY3VfbG9ja19jdXJyZW50 X2RvbWFpbigpOworICAgICAgICBnb3RvIG91dDsKICAgICB9CiAKLSAgICByYyA9IHB1dF9vbGRf Z3Vlc3RfdGFibGUoY3Vycik7Ci0gICAgaWYgKCB1bmxpa2VseShyYykgKQotICAgICAgICByZXR1 cm4gcmM7Ci0KLSAgICBvbGRfYmFzZV9tZm4gPSBwYWdldGFibGVfZ2V0X3BmbihjdXJyLT5hcmNo Lmd1ZXN0X3RhYmxlKTsKLSAgICAvKgotICAgICAqIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9y dGFudCB3aGVuIGdldHRpbmcgcmVzdGFydGVkIGFmdGVyIHRoZQotICAgICAqIHByZXZpb3VzIGF0 dGVtcHQgZ290IHByZWVtcHRlZCBpbiB0aGUgcHV0LW9sZC1NRk4gcGhhc2UuCi0gICAgICovCi0g ICAgaWYgKCBvbGRfYmFzZV9tZm4gPT0gbWZuICkKKyAgICBpZiAoIHVubGlrZWx5KGRvbWlkID09 IGN1cnItPmRvbWFpbl9pZCkgKQogICAgIHsKLSAgICAgICAgd3JpdGVfcHRiYXNlKGN1cnIpOwot ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgTUVNX0xPRygiQ2Fubm90IHNwZWNpZnkgaXRzZWxm IGFzIGZvcmVpZ24gZG9tYWluIik7CisgICAgICAgIGdvdG8gb3V0OwogICAgIH0KIAotICAgIHJj ID0gcGFnaW5nX21vZGVfcmVmY291bnRzKGQpCi0gICAgICAgICA/IChnZXRfcGFnZV9mcm9tX3Bh Z2VucihtZm4sIGQpID8gMCA6IC1FSU5WQUwpCi0gICAgICAgICA6IGdldF9wYWdlX2FuZF90eXBl X2Zyb21fcGFnZW5yKG1mbiwgUEdUX3Jvb3RfcGFnZV90YWJsZSwgZCwgMCwgMSk7Ci0gICAgc3dp dGNoICggcmMgKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2Ug LUVJTlRSOgotICAgIGNhc2UgLUVSRVNUQVJUOgotICAgICAgICByZXR1cm4gLUVSRVNUQVJUOwot ICAgIGRlZmF1bHQ6Ci0gICAgICAgIE1FTV9MT0coIkVycm9yIHdoaWxlIGluc3RhbGxpbmcgbmV3 IGJhc2VwdHIgJWx4IiwgbWZuKTsKLSAgICAgICAgcmV0dXJuIHJjOwotICAgIH0KLQotICAgIGlu dmFsaWRhdGVfc2hhZG93X2xkdChjdXJyLCAwKTsKLQotICAgIGlmICggIVZNX0FTU0lTVChkLCBt MnBfc3RyaWN0KSAmJiAhcGFnaW5nX21vZGVfcmVmY291bnRzKGQpICkKLSAgICAgICAgZmlsbF9y b19tcHQobWZuKTsKLSAgICBjdXJyLT5hcmNoLmd1ZXN0X3RhYmxlID0gcGFnZXRhYmxlX2Zyb21f cGZuKG1mbik7Ci0gICAgdXBkYXRlX2NyMyhjdXJyKTsKLQotICAgIHdyaXRlX3B0YmFzZShjdXJy KTsKLQotICAgIGlmICggbGlrZWx5KG9sZF9iYXNlX21mbiAhPSAwKSApCi0gICAgewotICAgICAg ICBzdHJ1Y3QgcGFnZV9pbmZvICpwYWdlID0gbWZuX3RvX3BhZ2Uob2xkX2Jhc2VfbWZuKTsKLQot ICAgICAgICBpZiAoIHBhZ2luZ19tb2RlX3JlZmNvdW50cyhkKSApCi0gICAgICAgICAgICBwdXRf cGFnZShwYWdlKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3dpdGNoICggcmMgPSBwdXRf cGFnZV9hbmRfdHlwZV9wcmVlbXB0aWJsZShwYWdlKSApCi0gICAgICAgICAgICB7Ci0gICAgICAg ICAgICBjYXNlIC1FSU5UUjoKLSAgICAgICAgICAgICAgICByYyA9IC1FUkVTVEFSVDsKLSAgICAg ICAgICAgICAgICAvKiBmYWxsdGhyb3VnaCAqLwotICAgICAgICAgICAgY2FzZSAtRVJFU1RBUlQ6 Ci0gICAgICAgICAgICAgICAgY3Vyci0+YXJjaC5vbGRfZ3Vlc3RfdGFibGUgPSBwYWdlOwotICAg ICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAg ICBCVUdfT04ocmMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAg IH0KLQotICAgIHJldHVybiByYzsKLX0KLQotc3RydWN0IGRvbWFpbiAqbW1fZ2V0X3BnX293bmVy KGRvbWlkX3QgZG9taWQpCi17Ci0gICAgc3RydWN0IGRvbWFpbiAqcGdfb3duZXIgPSBOVUxMLCAq Y3VyciA9IGN1cnJlbnQtPmRvbWFpbjsKLQotICAgIGlmICggbGlrZWx5KGRvbWlkID09IERPTUlE X1NFTEYpICkKLSAgICB7Ci0gICAgICAgIHBnX293bmVyID0gcmN1X2xvY2tfY3VycmVudF9kb21h aW4oKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gICAgaWYgKCB1bmxpa2VseShkb21p ZCA9PSBjdXJyLT5kb21haW5faWQpICkKLSAgICB7Ci0gICAgICAgIE1FTV9MT0coIkNhbm5vdCBz cGVjaWZ5IGl0c2VsZiBhcyBmb3JlaWduIGRvbWFpbiIpOwotICAgICAgICBnb3RvIG91dDsKLSAg ICB9Ci0KLSAgICBpZiAoICFpc19odm1fZG9tYWluKGN1cnIpICYmIHVubGlrZWx5KHBhZ2luZ19t b2RlX3RyYW5zbGF0ZShjdXJyKSkgKQorICAgIGlmICggIWlzX2h2bV9kb21haW4oY3VycikgJiYg dW5saWtlbHkocGFnaW5nX21vZGVfdHJhbnNsYXRlKGN1cnIpKSApCiAgICAgewogICAgICAgICBN RU1fTE9HKCJDYW5ub3QgbWl4IGZvcmVpZ24gbWFwcGluZ3Mgd2l0aCB0cmFuc2xhdGVkIGRvbWFp bnMiKTsKICAgICAgICAgZ290byBvdXQ7CkBAIC0zNTgxLDU3MiArMjk2NCw2IEBAIGxvbmcgZG9f bW11ZXh0X29wKAogICAgIHJldHVybiByYzsKIH0KIAotbG9uZyBkb19tbXVfdXBkYXRlKAotICAg IFhFTl9HVUVTVF9IQU5ETEVfUEFSQU0obW11X3VwZGF0ZV90KSB1cmVxcywKLSAgICB1bnNpZ25l ZCBpbnQgY291bnQsCi0gICAgWEVOX0dVRVNUX0hBTkRMRV9QQVJBTSh1aW50KSBwZG9uZSwKLSAg ICB1bnNpZ25lZCBpbnQgZm9yZWlnbmRvbSkKLXsKLSAgICBzdHJ1Y3QgbW11X3VwZGF0ZSByZXE7 Ci0gICAgdm9pZCAqdmE7Ci0gICAgdW5zaWduZWQgbG9uZyBncGZuLCBnbWZuLCBtZm47Ci0gICAg c3RydWN0IHBhZ2VfaW5mbyAqcGFnZTsKLSAgICB1bnNpZ25lZCBpbnQgY21kLCBpID0gMCwgZG9u ZSA9IDAsIHB0X2RvbTsKLSAgICBzdHJ1Y3QgdmNwdSAqY3VyciA9IGN1cnJlbnQsICp2ID0gY3Vy cjsKLSAgICBzdHJ1Y3QgZG9tYWluICpkID0gdi0+ZG9tYWluLCAqcHRfb3duZXIgPSBkLCAqcGdf b3duZXI7Ci0gICAgc3RydWN0IGRvbWFpbl9tbWFwX2NhY2hlIG1hcGNhY2hlOwotICAgIHVpbnQz Ml90IHhzbV9uZWVkZWQgPSAwOwotICAgIHVpbnQzMl90IHhzbV9jaGVja2VkID0gMDsKLSAgICBp bnQgcmMgPSBwdXRfb2xkX2d1ZXN0X3RhYmxlKGN1cnIpOwotCi0gICAgaWYgKCB1bmxpa2VseShy YykgKQotICAgIHsKLSAgICAgICAgaWYgKCBsaWtlbHkocmMgPT0gLUVSRVNUQVJUKSApCi0gICAg ICAgICAgICByYyA9IGh5cGVyY2FsbF9jcmVhdGVfY29udGludWF0aW9uKAotICAgICAgICAgICAg ICAgICAgICAgX19IWVBFUlZJU09SX21tdV91cGRhdGUsICJoaWhpIiwgdXJlcXMsIGNvdW50LCBw ZG9uZSwKLSAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25kb20pOwotICAgICAgICByZXR1cm4g cmM7Ci0gICAgfQotCi0gICAgaWYgKCB1bmxpa2VseShjb3VudCA9PSBNTVVfVVBEQVRFX1BSRUVN UFRFRCkgJiYKLSAgICAgICAgIGxpa2VseShndWVzdF9oYW5kbGVfaXNfbnVsbCh1cmVxcykpICkK LSAgICB7Ci0gICAgICAgIC8qIFNlZSB0aGUgY3Vyci0+YXJjaC5vbGRfZ3Vlc3RfdGFibGUgcmVs YXRlZAotICAgICAgICAgKiBoeXBlcmNhbGxfY3JlYXRlX2NvbnRpbnVhdGlvbigpIGJlbG93LiAq LwotICAgICAgICByZXR1cm4gKGludClmb3JlaWduZG9tOwotICAgIH0KLQotICAgIGlmICggdW5s aWtlbHkoY291bnQgJiBNTVVfVVBEQVRFX1BSRUVNUFRFRCkgKQotICAgIHsKLSAgICAgICAgY291 bnQgJj0gfk1NVV9VUERBVEVfUFJFRU1QVEVEOwotICAgICAgICBpZiAoIHVubGlrZWx5KCFndWVz dF9oYW5kbGVfaXNfbnVsbChwZG9uZSkpICkKLSAgICAgICAgICAgICh2b2lkKWNvcHlfZnJvbV9n dWVzdCgmZG9uZSwgcGRvbmUsIDEpOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHBlcmZjX2lu Y3IoY2FsbHNfdG9fbW11X3VwZGF0ZSk7Ci0KLSAgICBpZiAoIHVubGlrZWx5KCFndWVzdF9oYW5k bGVfb2theSh1cmVxcywgY291bnQpKSApCi0gICAgICAgIHJldHVybiAtRUZBVUxUOwotCi0gICAg aWYgKCAocHRfZG9tID0gZm9yZWlnbmRvbSA+PiAxNikgIT0gMCApCi0gICAgewotICAgICAgICAv KiBQYWdldGFibGVzIGJlbG9uZyB0byBhIGZvcmVpZ24gZG9tYWluIChQRkQpLiAqLwotICAgICAg ICBpZiAoIChwdF9vd25lciA9IHJjdV9sb2NrX2RvbWFpbl9ieV9pZChwdF9kb20gLSAxKSkgPT0g TlVMTCApCi0gICAgICAgICAgICByZXR1cm4gLUVTUkNIOwotCi0gICAgICAgIGlmICggcHRfb3du ZXIgPT0gZCApCi0gICAgICAgICAgICByY3VfdW5sb2NrX2RvbWFpbihwdF9vd25lcik7Ci0gICAg ICAgIGVsc2UgaWYgKCAhcHRfb3duZXItPnZjcHUgfHwgKHYgPSBwdF9vd25lci0+dmNwdVswXSkg PT0gTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJjID0gLUVJTlZBTDsKLSAgICAgICAg ICAgIGdvdG8gb3V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCAocGdfb3duZXIgPSBt bV9nZXRfcGdfb3duZXIoKHVpbnQxNl90KWZvcmVpZ25kb20pKSA9PSBOVUxMICkKLSAgICB7Ci0g ICAgICAgIHJjID0gLUVTUkNIOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICBkb21h aW5fbW1hcF9jYWNoZV9pbml0KCZtYXBjYWNoZSk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGNv dW50OyBpKysgKQotICAgIHsKLSAgICAgICAgaWYgKCBjdXJyLT5hcmNoLm9sZF9ndWVzdF90YWJs ZSB8fCAoaSAmJiBoeXBlcmNhbGxfcHJlZW1wdF9jaGVjaygpKSApCi0gICAgICAgIHsKLSAgICAg ICAgICAgIHJjID0gLUVSRVNUQVJUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQot ICAgICAgICBpZiAoIHVubGlrZWx5KF9fY29weV9mcm9tX2d1ZXN0KCZyZXEsIHVyZXFzLCAxKSAh PSAwKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1FTV9MT0coIkJhZCBfX2NvcHlfZnJvbV9n dWVzdCIpOwotICAgICAgICAgICAgcmMgPSAtRUZBVUxUOwotICAgICAgICAgICAgYnJlYWs7Ci0g ICAgICAgIH0KLQotICAgICAgICBjbWQgPSByZXEucHRyICYgKHNpemVvZihsMV9wZ2VudHJ5X3Qp LTEpOwotCi0gICAgICAgIHN3aXRjaCAoIGNtZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8q Ci0gICAgICAgICAgICAgKiBNTVVfTk9STUFMX1BUX1VQREFURTogTm9ybWFsIHVwZGF0ZSB0byBh bnkgbGV2ZWwgb2YgcGFnZSB0YWJsZS4KLSAgICAgICAgICAgICAqIE1NVV9VUERBVEVfUFRfUFJF U0VSVkVfQUQ6IEFzIGFib3ZlIGJ1dCBhbHNvIHByZXNlcnZlIChPUikKLSAgICAgICAgICAgICAq IGN1cnJlbnQgQS9EIGJpdHMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgY2FzZSBNTVVfTk9S TUFMX1BUX1VQREFURToKLSAgICAgICAgY2FzZSBNTVVfUFRfVVBEQVRFX1BSRVNFUlZFX0FEOgot ICAgICAgICB7Ci0gICAgICAgICAgICBwMm1fdHlwZV90IHAybXQ7Ci0KLSAgICAgICAgICAgIHJj ID0gLUVPUE5PVFNVUFA7Ci0gICAgICAgICAgICBpZiAoIHVubGlrZWx5KHBhZ2luZ19tb2RlX3Jl ZmNvdW50cyhwdF9vd25lcikpICkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAg ICAgeHNtX25lZWRlZCB8PSBYU01fTU1VX05PUk1BTF9VUERBVEU7Ci0gICAgICAgICAgICBpZiAo IGdldF9wdGVfZmxhZ3MocmVxLnZhbCkgJiBfUEFHRV9QUkVTRU5UICkKLSAgICAgICAgICAgIHsK LSAgICAgICAgICAgICAgICB4c21fbmVlZGVkIHw9IFhTTV9NTVVfVVBEQVRFX1JFQUQ7Ci0gICAg ICAgICAgICAgICAgaWYgKCBnZXRfcHRlX2ZsYWdzKHJlcS52YWwpICYgX1BBR0VfUlcgKQotICAg ICAgICAgICAgICAgICAgICB4c21fbmVlZGVkIHw9IFhTTV9NTVVfVVBEQVRFX1dSSVRFOwotICAg ICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCB4c21fbmVlZGVkICE9IHhzbV9jaGVja2VkICkK LSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByYyA9IHhzbV9tbXVfdXBkYXRlKFhTTV9U QVJHRVQsIGQsIHB0X293bmVyLCBwZ19vd25lciwgeHNtX25lZWRlZCk7Ci0gICAgICAgICAgICAg ICAgaWYgKCByYyApCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAg IHhzbV9jaGVja2VkID0geHNtX25lZWRlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJj ID0gLUVJTlZBTDsKLQotICAgICAgICAgICAgcmVxLnB0ciAtPSBjbWQ7Ci0gICAgICAgICAgICBn bWZuID0gcmVxLnB0ciA+PiBQQUdFX1NISUZUOwotICAgICAgICAgICAgcGFnZSA9IGdldF9wYWdl X2Zyb21fZ2ZuKHB0X293bmVyLCBnbWZuLCAmcDJtdCwgUDJNX0FMTE9DKTsKLQotICAgICAgICAg ICAgaWYgKCBwMm1faXNfcGFnZWQocDJtdCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAg ICAgIEFTU0VSVCghcGFnZSk7Ci0gICAgICAgICAgICAgICAgcDJtX21lbV9wYWdpbmdfcG9wdWxh dGUocGdfb3duZXIsIGdtZm4pOwotICAgICAgICAgICAgICAgIHJjID0gLUVOT0VOVDsKLSAgICAg ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCB1bmxp a2VseSghcGFnZSkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1FTV9MT0coIkNv dWxkIG5vdCBnZXQgcGFnZSBmb3Igbm9ybWFsIHVwZGF0ZSIpOwotICAgICAgICAgICAgICAgIGJy ZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZm4gPSBwYWdlX3RvX21mbihwYWdl KTsKLSAgICAgICAgICAgIHZhID0gbWFwX2RvbWFpbl9wYWdlX3dpdGhfY2FjaGUobWZuLCAmbWFw Y2FjaGUpOwotICAgICAgICAgICAgdmEgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyl2YSArCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKShyZXEucHRyICYgflBBR0Vf TUFTSykpOwotCi0gICAgICAgICAgICBpZiAoIHBhZ2VfbG9jayhwYWdlKSApCi0gICAgICAgICAg ICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICggcGFnZS0+dS5pbnVzZS50eXBlX2luZm8gJiBQ R1RfdHlwZV9tYXNrICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBQ R1RfbDFfcGFnZV90YWJsZToKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAg IGwxX3BnZW50cnlfdCBsMWUgPSBsMWVfZnJvbV9pbnRwdGUocmVxLnZhbCk7Ci0gICAgICAgICAg ICAgICAgICAgIHAybV90eXBlX3QgbDFlX3AybXQgPSBwMm1fcmFtX3J3OwotICAgICAgICAgICAg ICAgICAgICBzdHJ1Y3QgcGFnZV9pbmZvICp0YXJnZXQgPSBOVUxMOwotICAgICAgICAgICAgICAg ICAgICBwMm1fcXVlcnlfdCBxID0gKGwxZV9nZXRfZmxhZ3MobDFlKSAmIF9QQUdFX1JXKSA/Ci0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUDJNX1VOU0hBUkUgOiBQMk1f QUxMT0M7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCBwYWdpbmdfbW9kZV90cmFuc2xhdGUo cGdfb3duZXIpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGdldF9wYWdlX2Zy b21fZ2ZuKHBnX293bmVyLCBsMWVfZ2V0X3BmbihsMWUpLAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmwxZV9wMm10LCBxKTsKLQotICAgICAgICAg ICAgICAgICAgICBpZiAoIHAybV9pc19wYWdlZChsMWVfcDJtdCkgKQotICAgICAgICAgICAgICAg ICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHRhcmdldCApCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgcHV0X3BhZ2UodGFyZ2V0KTsKLSAgICAgICAgICAgICAgICAgICAg ICAgIHAybV9tZW1fcGFnaW5nX3BvcHVsYXRlKHBnX293bmVyLCBsMWVfZ2V0X3BmbihsMWUpKTsK LSAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gLUVOT0VOVDsKLSAgICAgICAgICAgICAgICAg ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAg IGVsc2UgaWYgKCBwMm1fcmFtX3BhZ2luZ19pbiA9PSBsMWVfcDJtdCAmJiAhdGFyZ2V0ICkKLSAg ICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAtRU5PRU5U OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0K LSAgICAgICAgICAgICAgICAgICAgLyogSWYgd2UgdHJpZWQgdG8gdW5zaGFyZSBhbmQgZmFpbGVk ICovCi0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAocSAmIFAyTV9VTlNIQVJFKSAmJiBw Mm1faXNfc2hhcmVkKGwxZV9wMm10KSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAg ICAgICAgICAgICAgICAgIC8qIFdlIGNvdWxkIG5vdCBoYXZlIG9idGFpbmVkIGEgcGFnZSByZWYu ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQodGFyZ2V0ID09IE5VTEwpOwotICAg ICAgICAgICAgICAgICAgICAgICAgLyogQW5kIG1lbV9zaGFyaW5nX25vdGlmeSBoYXMgYWxyZWFk eSBiZWVuIGNhbGxlZC4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gLUVOT01FTTsK LSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0K LSAgICAgICAgICAgICAgICAgICAgcmMgPSBtb2RfbDFfZW50cnkodmEsIGwxZSwgbWZuLAotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPT0gTU1VX1BUX1VQREFURV9Q UkVTRVJWRV9BRCwgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdf b3duZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIHRhcmdldCApCi0gICAgICAgICAgICAg ICAgICAgICAgICBwdXRfcGFnZSh0YXJnZXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg ICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFBHVF9sMl9wYWdlX3RhYmxlOgot ICAgICAgICAgICAgICAgICAgICByYyA9IG1vZF9sMl9lbnRyeSh2YSwgbDJlX2Zyb21faW50cHRl KHJlcS52YWwpLCBtZm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNt ZCA9PSBNTVVfUFRfVVBEQVRFX1BSRVNFUlZFX0FELCB2KTsKLSAgICAgICAgICAgICAgICAgICAg YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBQR1RfbDNfcGFnZV90YWJsZToKLSAgICAgICAg ICAgICAgICAgICAgcmMgPSBtb2RfbDNfZW50cnkodmEsIGwzZV9mcm9tX2ludHB0ZShyZXEudmFs KSwgbWZuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPT0gTU1V X1BUX1VQREFURV9QUkVTRVJWRV9BRCwgdik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwot ICAgICAgICAgICAgICAgIGNhc2UgUEdUX2w0X3BhZ2VfdGFibGU6Ci0gICAgICAgICAgICAgICAg ICAgIHJjID0gbW9kX2w0X2VudHJ5KHZhLCBsNGVfZnJvbV9pbnRwdGUocmVxLnZhbCksIG1mbiwK LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kID09IE1NVV9QVF9VUERB VEVfUFJFU0VSVkVfQUQsIHYpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAg ICAgIGNhc2UgUEdUX3dyaXRhYmxlX3BhZ2U6Ci0gICAgICAgICAgICAgICAgICAgIHBlcmZjX2lu Y3Iod3JpdGFibGVfbW11X3VwZGF0ZXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIHBhZ2lu Z193cml0ZV9ndWVzdF9lbnRyeSh2LCB2YSwgcmVxLnZhbCwgX21mbihtZm4pKSApCi0gICAgICAg ICAgICAgICAgICAgICAgICByYyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAg ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYWdlX3VubG9jayhwYWdlKTsKLSAgICAg ICAgICAgICAgICBpZiAoIHJjID09IC1FSU5UUiApCi0gICAgICAgICAgICAgICAgICAgIHJjID0g LUVSRVNUQVJUOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIGdldF9wYWdl X3R5cGUocGFnZSwgUEdUX3dyaXRhYmxlX3BhZ2UpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAg ICAgICAgICBwZXJmY19pbmNyKHdyaXRhYmxlX21tdV91cGRhdGVzKTsKLSAgICAgICAgICAgICAg ICBpZiAoIHBhZ2luZ193cml0ZV9ndWVzdF9lbnRyeSh2LCB2YSwgcmVxLnZhbCwgX21mbihtZm4p KSApCi0gICAgICAgICAgICAgICAgICAgIHJjID0gMDsKLSAgICAgICAgICAgICAgICBwdXRfcGFn ZV90eXBlKHBhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1bm1hcF9kb21haW5f cGFnZV93aXRoX2NhY2hlKHZhLCAmbWFwY2FjaGUpOwotICAgICAgICAgICAgcHV0X3BhZ2UocGFn ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNTVVfTUFDSFBI WVNfVVBEQVRFOgotICAgICAgICAgICAgaWYgKCB1bmxpa2VseShkICE9IHB0X293bmVyKSApCi0g ICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmMgPSAtRVBFUk07Ci0gICAgICAgICAgICAg ICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggdW5saWtlbHkocGFn aW5nX21vZGVfdHJhbnNsYXRlKHBnX293bmVyKSkgKQotICAgICAgICAgICAgewotICAgICAgICAg ICAgICAgIHJjID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg IH0KLQotICAgICAgICAgICAgbWZuID0gcmVxLnB0ciA+PiBQQUdFX1NISUZUOwotICAgICAgICAg ICAgZ3BmbiA9IHJlcS52YWw7Ci0KLSAgICAgICAgICAgIHhzbV9uZWVkZWQgfD0gWFNNX01NVV9N QUNIUEhZU19VUERBVEU7Ci0gICAgICAgICAgICBpZiAoIHhzbV9uZWVkZWQgIT0geHNtX2NoZWNr ZWQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJjID0geHNtX21tdV91cGRhdGUo WFNNX1RBUkdFVCwgZCwgTlVMTCwgcGdfb3duZXIsIHhzbV9uZWVkZWQpOwotICAgICAgICAgICAg ICAgIGlmICggcmMgKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAg ICB4c21fY2hlY2tlZCA9IHhzbV9uZWVkZWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg IGlmICggdW5saWtlbHkoIWdldF9wYWdlX2Zyb21fcGFnZW5yKG1mbiwgcGdfb3duZXIpKSApCi0g ICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTUVNX0xPRygiQ291bGQgbm90IGdldCBwYWdl IGZvciBtYWNoLT5waHlzIHVwZGF0ZSIpOwotICAgICAgICAgICAgICAgIHJjID0gLUVJTlZBTDsK LSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0 X2dwZm5fZnJvbV9tZm4obWZuLCBncGZuKTsKLQotICAgICAgICAgICAgcGFnaW5nX21hcmtfZGly dHkocGdfb3duZXIsIF9tZm4obWZuKSk7Ci0KLSAgICAgICAgICAgIHB1dF9wYWdlKG1mbl90b19w YWdlKG1mbikpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAg ICAgICAgIE1FTV9MT0coIkludmFsaWQgcGFnZSB1cGRhdGUgY29tbWFuZCAleCIsIGNtZCk7Ci0g ICAgICAgICAgICByYyA9IC1FTk9TWVM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQot Ci0gICAgICAgIGlmICggdW5saWtlbHkocmMpICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAg ICAgIGd1ZXN0X2hhbmRsZV9hZGRfb2Zmc2V0KHVyZXFzLCAxKTsKLSAgICB9Ci0KLSAgICBpZiAo IHJjID09IC1FUkVTVEFSVCApCi0gICAgewotICAgICAgICBBU1NFUlQoaSA8IGNvdW50KTsKLSAg ICAgICAgcmMgPSBoeXBlcmNhbGxfY3JlYXRlX2NvbnRpbnVhdGlvbigKLSAgICAgICAgICAgIF9f SFlQRVJWSVNPUl9tbXVfdXBkYXRlLCAiaGloaSIsCi0gICAgICAgICAgICB1cmVxcywgKGNvdW50 IC0gaSkgfCBNTVVfVVBEQVRFX1BSRUVNUFRFRCwgcGRvbmUsIGZvcmVpZ25kb20pOwotICAgIH0K LSAgICBlbHNlIGlmICggY3Vyci0+YXJjaC5vbGRfZ3Vlc3RfdGFibGUgKQotICAgIHsKLSAgICAg ICAgWEVOX0dVRVNUX0hBTkRMRV9QQVJBTSh2b2lkKSBudWxsOwotCi0gICAgICAgIEFTU0VSVChy YyB8fCBpID09IGNvdW50KTsKLSAgICAgICAgc2V0X3hlbl9ndWVzdF9oYW5kbGUobnVsbCwgTlVM TCk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEluIG9yZGVyIHRvIGhhdmUgYSB3YXkgdG8gY29t bXVuaWNhdGUgdGhlIGZpbmFsIHJldHVybiB2YWx1ZSB0bwotICAgICAgICAgKiBvdXIgY29udGlu dWF0aW9uLCB3ZSBwYXNzIHRoaXMgaW4gcGxhY2Ugb2YgImZvcmVpZ25kb20iLCBidWlsZGluZwot ICAgICAgICAgKiBvbiB0aGUgZmFjdCB0aGF0IHRoaXMgYXJndW1lbnQgaXNuJ3QgbmVlZGVkIGFu eW1vcmUuCi0gICAgICAgICAqLwotICAgICAgICByYyA9IGh5cGVyY2FsbF9jcmVhdGVfY29udGlu dWF0aW9uKAotICAgICAgICAgICAgICAgIF9fSFlQRVJWSVNPUl9tbXVfdXBkYXRlLCAiaGloaSIs IG51bGwsCi0gICAgICAgICAgICAgICAgTU1VX1VQREFURV9QUkVFTVBURUQsIG51bGwsIHJjKTsK LSAgICB9Ci0KLSAgICBtbV9wdXRfcGdfb3duZXIocGdfb3duZXIpOwotCi0gICAgZG9tYWluX21t YXBfY2FjaGVfZGVzdHJveSgmbWFwY2FjaGUpOwotCi0gICAgcGVyZmNfYWRkKG51bV9wYWdlX3Vw ZGF0ZXMsIGkpOwotCi0gb3V0OgotICAgIGlmICggcHRfb3duZXIgIT0gZCApCi0gICAgICAgIHJj dV91bmxvY2tfZG9tYWluKHB0X293bmVyKTsKLQotICAgIC8qIEFkZCBpbmNyZW1lbnRhbCB3b3Jr IHdlIGhhdmUgZG9uZSB0byB0aGUgQGRvbmUgb3V0cHV0IHBhcmFtZXRlci4gKi8KLSAgICBpZiAo IHVubGlrZWx5KCFndWVzdF9oYW5kbGVfaXNfbnVsbChwZG9uZSkpICkKLSAgICB7Ci0gICAgICAg IGRvbmUgKz0gaTsKLSAgICAgICAgY29weV90b19ndWVzdChwZG9uZSwgJmRvbmUsIDEpOwotICAg IH0KLQotICAgIHJldHVybiByYzsKLX0KLQotCi1zdGF0aWMgaW50IGNyZWF0ZV9ncmFudF9wdGVf bWFwcGluZygKLSAgICB1aW50NjRfdCBwdGVfYWRkciwgbDFfcGdlbnRyeV90IG5sMWUsIHN0cnVj dCB2Y3B1ICp2KQotewotICAgIGludCByYyA9IEdOVFNUX29rYXk7Ci0gICAgdm9pZCAqdmE7Ci0g ICAgdW5zaWduZWQgbG9uZyBnbWZuLCBtZm47Ci0gICAgc3RydWN0IHBhZ2VfaW5mbyAqcGFnZTsK LSAgICBsMV9wZ2VudHJ5X3Qgb2wxZTsKLSAgICBzdHJ1Y3QgZG9tYWluICpkID0gdi0+ZG9tYWlu OwotCi0gICAgYWRqdXN0X2d1ZXN0X2wxZShubDFlLCBkKTsKLQotICAgIGdtZm4gPSBwdGVfYWRk ciA+PiBQQUdFX1NISUZUOwotICAgIHBhZ2UgPSBnZXRfcGFnZV9mcm9tX2dmbihkLCBnbWZuLCBO VUxMLCBQMk1fQUxMT0MpOwotCi0gICAgaWYgKCB1bmxpa2VseSghcGFnZSkgKQotICAgIHsKLSAg ICAgICAgTUVNX0xPRygiQ291bGQgbm90IGdldCBwYWdlIGZvciBub3JtYWwgdXBkYXRlIik7Ci0g ICAgICAgIHJldHVybiBHTlRTVF9nZW5lcmFsX2Vycm9yOwotICAgIH0KLSAgICAKLSAgICBtZm4g PSBwYWdlX3RvX21mbihwYWdlKTsKLSAgICB2YSA9IG1hcF9kb21haW5fcGFnZShfbWZuKG1mbikp OwotICAgIHZhID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdmEgKyAoKHVuc2lnbmVkIGxvbmcp cHRlX2FkZHIgJiB+UEFHRV9NQVNLKSk7Ci0KLSAgICBpZiAoICFwYWdlX2xvY2socGFnZSkgKQot ICAgIHsKLSAgICAgICAgcmMgPSBHTlRTVF9nZW5lcmFsX2Vycm9yOwotICAgICAgICBnb3RvIGZh aWxlZDsKLSAgICB9Ci0KLSAgICBpZiAoIChwYWdlLT51LmludXNlLnR5cGVfaW5mbyAmIFBHVF90 eXBlX21hc2spICE9IFBHVF9sMV9wYWdlX3RhYmxlICkKLSAgICB7Ci0gICAgICAgIHBhZ2VfdW5s b2NrKHBhZ2UpOwotICAgICAgICByYyA9IEdOVFNUX2dlbmVyYWxfZXJyb3I7Ci0gICAgICAgIGdv dG8gZmFpbGVkOwotICAgIH0KLQotICAgIG9sMWUgPSAqKGwxX3BnZW50cnlfdCAqKXZhOwotICAg IGlmICggIVVQREFURV9FTlRSWShsMSwgKGwxX3BnZW50cnlfdCAqKXZhLCBvbDFlLCBubDFlLCBt Zm4sIHYsIDApICkKLSAgICB7Ci0gICAgICAgIHBhZ2VfdW5sb2NrKHBhZ2UpOwotICAgICAgICBy YyA9IEdOVFNUX2dlbmVyYWxfZXJyb3I7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0gCi0K LSAgICBwYWdlX3VubG9jayhwYWdlKTsKLQotICAgIGlmICggIXBhZ2luZ19tb2RlX3JlZmNvdW50 cyhkKSApCi0gICAgICAgIHB1dF9wYWdlX2Zyb21fbDFlKG9sMWUsIGQpOwotCi0gZmFpbGVkOgot ICAgIHVubWFwX2RvbWFpbl9wYWdlKHZhKTsKLSAgICBwdXRfcGFnZShwYWdlKTsKLQotICAgIHJl dHVybiByYzsKLX0KLQotc3RhdGljIGludCBkZXN0cm95X2dyYW50X3B0ZV9tYXBwaW5nKAotICAg IHVpbnQ2NF90IGFkZHIsIHVuc2lnbmVkIGxvbmcgZnJhbWUsIHN0cnVjdCBkb21haW4gKmQpCi17 Ci0gICAgaW50IHJjID0gR05UU1Rfb2theTsKLSAgICB2b2lkICp2YTsKLSAgICB1bnNpZ25lZCBs b25nIGdtZm4sIG1mbjsKLSAgICBzdHJ1Y3QgcGFnZV9pbmZvICpwYWdlOwotICAgIGwxX3BnZW50 cnlfdCBvbDFlOwotCi0gICAgZ21mbiA9IGFkZHIgPj4gUEFHRV9TSElGVDsKLSAgICBwYWdlID0g Z2V0X3BhZ2VfZnJvbV9nZm4oZCwgZ21mbiwgTlVMTCwgUDJNX0FMTE9DKTsKLQotICAgIGlmICgg dW5saWtlbHkoIXBhZ2UpICkKLSAgICB7Ci0gICAgICAgIE1FTV9MT0coIkNvdWxkIG5vdCBnZXQg cGFnZSBmb3Igbm9ybWFsIHVwZGF0ZSIpOwotICAgICAgICByZXR1cm4gR05UU1RfZ2VuZXJhbF9l cnJvcjsKLSAgICB9Ci0gICAgCi0gICAgbWZuID0gcGFnZV90b19tZm4ocGFnZSk7Ci0gICAgdmEg PSBtYXBfZG9tYWluX3BhZ2UoX21mbihtZm4pKTsKLSAgICB2YSA9ICh2b2lkICopKCh1bnNpZ25l ZCBsb25nKXZhICsgKCh1bnNpZ25lZCBsb25nKWFkZHIgJiB+UEFHRV9NQVNLKSk7Ci0KLSAgICBp ZiAoICFwYWdlX2xvY2socGFnZSkgKQotICAgIHsKLSAgICAgICAgcmMgPSBHTlRTVF9nZW5lcmFs X2Vycm9yOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0KLSAgICBpZiAoIChwYWdlLT51 LmludXNlLnR5cGVfaW5mbyAmIFBHVF90eXBlX21hc2spICE9IFBHVF9sMV9wYWdlX3RhYmxlICkK LSAgICB7Ci0gICAgICAgIHBhZ2VfdW5sb2NrKHBhZ2UpOwotICAgICAgICByYyA9IEdOVFNUX2dl bmVyYWxfZXJyb3I7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLQotICAgIG9sMWUgPSAq KGwxX3BnZW50cnlfdCAqKXZhOwotICAgIAotICAgIC8qIENoZWNrIHRoYXQgdGhlIHZpcnR1YWwg YWRkcmVzcyBzdXBwbGllZCBpcyBhY3R1YWxseSBtYXBwZWQgdG8gZnJhbWUuICovCi0gICAgaWYg KCB1bmxpa2VseShsMWVfZ2V0X3BmbihvbDFlKSAhPSBmcmFtZSkgKQotICAgIHsKLSAgICAgICAg cGFnZV91bmxvY2socGFnZSk7Ci0gICAgICAgIE1FTV9MT0coIlBURSBlbnRyeSAlbHggZm9yIGFk ZHJlc3MgJSJQUkl4NjQiIGRvZXNuJ3QgbWF0Y2ggZnJhbWUgJWx4IiwKLSAgICAgICAgICAgICAg ICAodW5zaWduZWQgbG9uZylsMWVfZ2V0X2ludHB0ZShvbDFlKSwgYWRkciwgZnJhbWUpOwotICAg ICAgICByYyA9IEdOVFNUX2dlbmVyYWxfZXJyb3I7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAg IH0KLQotICAgIC8qIERlbGV0ZSBwYWdldGFibGUgZW50cnkuICovCi0gICAgaWYgKCB1bmxpa2Vs eSghVVBEQVRFX0VOVFJZCi0gICAgICAgICAgICAgICAgICAobDEsIAotICAgICAgICAgICAgICAg ICAgIChsMV9wZ2VudHJ5X3QgKil2YSwgb2wxZSwgbDFlX2VtcHR5KCksIG1mbiwgCi0gICAgICAg ICAgICAgICAgICAgZC0+dmNwdVswXSAvKiBDaGFuZ2UgaWYgd2UgZ28gdG8gcGVyLXZjcHUgc2hh ZG93cy4gKi8sCi0gICAgICAgICAgICAgICAgICAgMCkpICkKLSAgICB7Ci0gICAgICAgIHBhZ2Vf dW5sb2NrKHBhZ2UpOwotICAgICAgICBNRU1fTE9HKCJDYW5ub3QgZGVsZXRlIFBURSBlbnRyeSBh dCAlcCIsIHZhKTsKLSAgICAgICAgcmMgPSBHTlRTVF9nZW5lcmFsX2Vycm9yOwotICAgICAgICBn b3RvIGZhaWxlZDsKLSAgICB9Ci0KLSAgICBwYWdlX3VubG9jayhwYWdlKTsKLQotIGZhaWxlZDoK LSAgICB1bm1hcF9kb21haW5fcGFnZSh2YSk7Ci0gICAgcHV0X3BhZ2UocGFnZSk7Ci0gICAgcmV0 dXJuIHJjOwotfQotCi0KLXN0YXRpYyBpbnQgY3JlYXRlX2dyYW50X3ZhX21hcHBpbmcoCi0gICAg dW5zaWduZWQgbG9uZyB2YSwgbDFfcGdlbnRyeV90IG5sMWUsIHN0cnVjdCB2Y3B1ICp2KQotewot ICAgIGwxX3BnZW50cnlfdCAqcGwxZSwgb2wxZTsKLSAgICBzdHJ1Y3QgZG9tYWluICpkID0gdi0+ ZG9tYWluOwotICAgIHVuc2lnbmVkIGxvbmcgZ2wxbWZuOwotICAgIHN0cnVjdCBwYWdlX2luZm8g KmwxcGc7Ci0gICAgaW50IG9rYXk7Ci0gICAgCi0gICAgYWRqdXN0X2d1ZXN0X2wxZShubDFlLCBk KTsKLQotICAgIHBsMWUgPSBndWVzdF9tYXBfbDFlKHZhLCAmZ2wxbWZuKTsKLSAgICBpZiAoICFw bDFlICkKLSAgICB7Ci0gICAgICAgIE1FTV9MT0coIkNvdWxkIG5vdCBmaW5kIEwxIFBURSBmb3Ig YWRkcmVzcyAlbHgiLCB2YSk7Ci0gICAgICAgIHJldHVybiBHTlRTVF9nZW5lcmFsX2Vycm9yOwot ICAgIH0KLQotICAgIGlmICggIWdldF9wYWdlX2Zyb21fcGFnZW5yKGdsMW1mbiwgY3VycmVudC0+ ZG9tYWluKSApCi0gICAgewotICAgICAgICBndWVzdF91bm1hcF9sMWUocGwxZSk7Ci0gICAgICAg IHJldHVybiBHTlRTVF9nZW5lcmFsX2Vycm9yOwotICAgIH0KLQotICAgIGwxcGcgPSBtZm5fdG9f cGFnZShnbDFtZm4pOwotICAgIGlmICggIXBhZ2VfbG9jayhsMXBnKSApCi0gICAgewotICAgICAg ICBwdXRfcGFnZShsMXBnKTsKLSAgICAgICAgZ3Vlc3RfdW5tYXBfbDFlKHBsMWUpOwotICAgICAg ICByZXR1cm4gR05UU1RfZ2VuZXJhbF9lcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAoIChsMXBnLT51 LmludXNlLnR5cGVfaW5mbyAmIFBHVF90eXBlX21hc2spICE9IFBHVF9sMV9wYWdlX3RhYmxlICkK LSAgICB7Ci0gICAgICAgIHBhZ2VfdW5sb2NrKGwxcGcpOwotICAgICAgICBwdXRfcGFnZShsMXBn KTsKLSAgICAgICAgZ3Vlc3RfdW5tYXBfbDFlKHBsMWUpOwotICAgICAgICByZXR1cm4gR05UU1Rf Z2VuZXJhbF9lcnJvcjsKLSAgICB9Ci0KLSAgICBvbDFlID0gKnBsMWU7Ci0gICAgb2theSA9IFVQ REFURV9FTlRSWShsMSwgcGwxZSwgb2wxZSwgbmwxZSwgZ2wxbWZuLCB2LCAwKTsKLQotICAgIHBh Z2VfdW5sb2NrKGwxcGcpOwotICAgIHB1dF9wYWdlKGwxcGcpOwotICAgIGd1ZXN0X3VubWFwX2wx ZShwbDFlKTsKLQotICAgIGlmICggb2theSAmJiAhcGFnaW5nX21vZGVfcmVmY291bnRzKGQpICkK LSAgICAgICAgcHV0X3BhZ2VfZnJvbV9sMWUob2wxZSwgZCk7Ci0KLSAgICByZXR1cm4gb2theSA/ IEdOVFNUX29rYXkgOiBHTlRTVF9nZW5lcmFsX2Vycm9yOwotfQotCi1zdGF0aWMgaW50IHJlcGxh Y2VfZ3JhbnRfdmFfbWFwcGluZygKLSAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxv bmcgZnJhbWUsIGwxX3BnZW50cnlfdCBubDFlLCBzdHJ1Y3QgdmNwdSAqdikKLXsKLSAgICBsMV9w Z2VudHJ5X3QgKnBsMWUsIG9sMWU7Ci0gICAgdW5zaWduZWQgbG9uZyBnbDFtZm47Ci0gICAgc3Ry dWN0IHBhZ2VfaW5mbyAqbDFwZzsKLSAgICBpbnQgcmMgPSAwOwotICAgIAotICAgIHBsMWUgPSBn dWVzdF9tYXBfbDFlKGFkZHIsICZnbDFtZm4pOwotICAgIGlmICggIXBsMWUgKQotICAgIHsKLSAg ICAgICAgTUVNX0xPRygiQ291bGQgbm90IGZpbmQgTDEgUFRFIGZvciBhZGRyZXNzICVseCIsIGFk ZHIpOwotICAgICAgICByZXR1cm4gR05UU1RfZ2VuZXJhbF9lcnJvcjsKLSAgICB9Ci0KLSAgICBp ZiAoICFnZXRfcGFnZV9mcm9tX3BhZ2VucihnbDFtZm4sIGN1cnJlbnQtPmRvbWFpbikgKQotICAg IHsKLSAgICAgICAgcmMgPSBHTlRTVF9nZW5lcmFsX2Vycm9yOwotICAgICAgICBnb3RvIG91dDsK LSAgICB9Ci0KLSAgICBsMXBnID0gbWZuX3RvX3BhZ2UoZ2wxbWZuKTsKLSAgICBpZiAoICFwYWdl X2xvY2sobDFwZykgKQotICAgIHsKLSAgICAgICAgcmMgPSBHTlRTVF9nZW5lcmFsX2Vycm9yOwot ICAgICAgICBwdXRfcGFnZShsMXBnKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotCi0gICAg aWYgKCAobDFwZy0+dS5pbnVzZS50eXBlX2luZm8gJiBQR1RfdHlwZV9tYXNrKSAhPSBQR1RfbDFf cGFnZV90YWJsZSApCi0gICAgewotICAgICAgICByYyA9IEdOVFNUX2dlbmVyYWxfZXJyb3I7Ci0g ICAgICAgIGdvdG8gdW5sb2NrX2FuZF9vdXQ7Ci0gICAgfQotCi0gICAgb2wxZSA9ICpwbDFlOwot Ci0gICAgLyogQ2hlY2sgdGhhdCB0aGUgdmlydHVhbCBhZGRyZXNzIHN1cHBsaWVkIGlzIGFjdHVh bGx5IG1hcHBlZCB0byBmcmFtZS4gKi8KLSAgICBpZiAoIHVubGlrZWx5KGwxZV9nZXRfcGZuKG9s MWUpICE9IGZyYW1lKSApCi0gICAgewotICAgICAgICBNRU1fTE9HKCJQVEUgZW50cnkgJWx4IGZv ciBhZGRyZXNzICVseCBkb2Vzbid0IG1hdGNoIGZyYW1lICVseCIsCi0gICAgICAgICAgICAgICAg bDFlX2dldF9wZm4ob2wxZSksIGFkZHIsIGZyYW1lKTsKLSAgICAgICAgcmMgPSBHTlRTVF9nZW5l cmFsX2Vycm9yOwotICAgICAgICBnb3RvIHVubG9ja19hbmRfb3V0OwotICAgIH0KLQotICAgIC8q IERlbGV0ZSBwYWdldGFibGUgZW50cnkuICovCi0gICAgaWYgKCB1bmxpa2VseSghVVBEQVRFX0VO VFJZKGwxLCBwbDFlLCBvbDFlLCBubDFlLCBnbDFtZm4sIHYsIDApKSApCi0gICAgewotICAgICAg ICBNRU1fTE9HKCJDYW5ub3QgZGVsZXRlIFBURSBlbnRyeSBhdCAlcCIsICh1bnNpZ25lZCBsb25n ICopcGwxZSk7Ci0gICAgICAgIHJjID0gR05UU1RfZ2VuZXJhbF9lcnJvcjsKLSAgICAgICAgZ290 byB1bmxvY2tfYW5kX291dDsKLSAgICB9Ci0KLSB1bmxvY2tfYW5kX291dDoKLSAgICBwYWdlX3Vu bG9jayhsMXBnKTsKLSAgICBwdXRfcGFnZShsMXBnKTsKLSBvdXQ6Ci0gICAgZ3Vlc3RfdW5tYXBf bDFlKHBsMWUpOwotICAgIHJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBkZXN0cm95X2dyYW50 X3ZhX21hcHBpbmcoCi0gICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGZyYW1l LCBzdHJ1Y3QgdmNwdSAqdikKLXsKLSAgICByZXR1cm4gcmVwbGFjZV9ncmFudF92YV9tYXBwaW5n KGFkZHIsIGZyYW1lLCBsMWVfZW1wdHkoKSwgdik7Ci19Ci0KIHN0YXRpYyBpbnQgY3JlYXRlX2dy YW50X3AybV9tYXBwaW5nKHVpbnQ2NF90IGFkZHIsIHVuc2lnbmVkIGxvbmcgZnJhbWUsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2FjaGVfZmxhZ3Mp CkBAIC00MTcwLDE0MCArMjk4NywzOCBAQCBzdGF0aWMgaW50IGNyZWF0ZV9ncmFudF9wMm1fbWFw cGluZyh1aW50NjRfdCBhZGRyLCB1bnNpZ25lZCBsb25nIGZyYW1lLAogICAgICAgICByZXR1cm4g R05UU1Rfb2theTsKIH0KIAotc3RhdGljIGludCBjcmVhdGVfZ3JhbnRfcHZfbWFwcGluZyh1aW50 NjRfdCBhZGRyLCB1bnNpZ25lZCBsb25nIGZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGludCBjYWNoZV9mbGFncykK LXsKLSAgICBsMV9wZ2VudHJ5X3QgcHRlOwotICAgIHVpbnQzMl90IGdyYW50X3B0ZV9mbGFnczsK LQotICAgIGdyYW50X3B0ZV9mbGFncyA9Ci0gICAgICAgIF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9B Q0NFU1NFRCB8IF9QQUdFX0RJUlRZIHwgX1BBR0VfR05UVEFCOwotICAgIGlmICggY3B1X2hhc19u eCApCi0gICAgICAgIGdyYW50X3B0ZV9mbGFncyB8PSBfUEFHRV9OWF9CSVQ7Ci0KLSAgICBwdGUg PSBsMWVfZnJvbV9wZm4oZnJhbWUsIGdyYW50X3B0ZV9mbGFncyk7Ci0gICAgaWYgKCAoZmxhZ3Mg JiBHTlRNQVBfYXBwbGljYXRpb25fbWFwKSApCi0gICAgICAgIGwxZV9hZGRfZmxhZ3MocHRlLF9Q QUdFX1VTRVIpOwotICAgIGlmICggIShmbGFncyAmIEdOVE1BUF9yZWFkb25seSkgKQotICAgICAg ICBsMWVfYWRkX2ZsYWdzKHB0ZSxfUEFHRV9SVyk7Ci0KLSAgICBsMWVfYWRkX2ZsYWdzKHB0ZSwK LSAgICAgICAgICAgICAgICAgICgoZmxhZ3MgPj4gX0dOVE1BUF9ndWVzdF9hdmFpbDApICogX1BB R0VfQVZBSUwwKQotICAgICAgICAgICAgICAgICAgICYgX1BBR0VfQVZBSUwpOwotCi0gICAgbDFl X2FkZF9mbGFncyhwdGUsIGNhY2hlYXR0cl90b19wdGVfZmxhZ3MoY2FjaGVfZmxhZ3MgPj4gNSkp OwotCi0gICAgaWYgKCBmbGFncyAmIEdOVE1BUF9jb250YWluc19wdGUgKQotICAgICAgICByZXR1 cm4gY3JlYXRlX2dyYW50X3B0ZV9tYXBwaW5nKGFkZHIsIHB0ZSwgY3VycmVudCk7Ci0gICAgcmV0 dXJuIGNyZWF0ZV9ncmFudF92YV9tYXBwaW5nKGFkZHIsIHB0ZSwgY3VycmVudCk7Ci19Ci0KIGlu dCBjcmVhdGVfZ3JhbnRfaG9zdF9tYXBwaW5nKHVpbnQ2NF90IGFkZHIsIHVuc2lnbmVkIGxvbmcg ZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3Ms IHVuc2lnbmVkIGludCBjYWNoZV9mbGFncykKIHsKICAgICBpZiAoIHBhZ2luZ19tb2RlX2V4dGVy bmFsKGN1cnJlbnQtPmRvbWFpbikgKQogICAgICAgICByZXR1cm4gY3JlYXRlX2dyYW50X3AybV9t YXBwaW5nKGFkZHIsIGZyYW1lLCBmbGFncywgY2FjaGVfZmxhZ3MpOwogCi0gICAgcmV0dXJuIGNy ZWF0ZV9ncmFudF9wdl9tYXBwaW5nKGFkZHIsIGZyYW1lLCBmbGFncywgY2FjaGVfZmxhZ3MpOwot fQotCi1zdGF0aWMgaW50IHJlcGxhY2VfZ3JhbnRfcDJtX21hcHBpbmcoCi0gICAgdWludDY0X3Qg YWRkciwgdW5zaWduZWQgbG9uZyBmcmFtZSwgdWludDY0X3QgbmV3X2FkZHIsIHVuc2lnbmVkIGlu dCBmbGFncykKLXsKLSAgICB1bnNpZ25lZCBsb25nIGdmbiA9ICh1bnNpZ25lZCBsb25nKShhZGRy ID4+IFBBR0VfU0hJRlQpOwotICAgIHAybV90eXBlX3QgdHlwZTsKLSAgICBtZm5fdCBvbGRfbWZu OwotICAgIHN0cnVjdCBkb21haW4gKmQgPSBjdXJyZW50LT5kb21haW47Ci0KLSAgICBpZiAoIG5l d19hZGRyICE9IDAgfHwgKGZsYWdzICYgR05UTUFQX2NvbnRhaW5zX3B0ZSkgKQotICAgICAgICBy ZXR1cm4gR05UU1RfZ2VuZXJhbF9lcnJvcjsKLQotICAgIG9sZF9tZm4gPSBnZXRfZ2ZuKGQsIGdm biwgJnR5cGUpOwotICAgIGlmICggIXAybV9pc19ncmFudCh0eXBlKSB8fCBtZm5feChvbGRfbWZu KSAhPSBmcmFtZSApCi0gICAgewotICAgICAgICBwdXRfZ2ZuKGQsIGdmbik7Ci0gICAgICAgIE1F TV9MT0coInJlcGxhY2VfZ3JhbnRfcDJtX21hcHBpbmc6IG9sZCBtYXBwaW5nIGludmFsaWQgKHR5 cGUgJWQsIG1mbiAlbHgsIGZyYW1lICVseCkiLAotICAgICAgICAgICAgICAgIHR5cGUsIG1mbl94 KG9sZF9tZm4pLCBmcmFtZSk7Ci0gICAgICAgIHJldHVybiBHTlRTVF9nZW5lcmFsX2Vycm9yOwot ICAgIH0KLSAgICBndWVzdF9waHlzbWFwX3JlbW92ZV9wYWdlKGQsIF9nZm4oZ2ZuKSwgX21mbihm cmFtZSksIFBBR0VfT1JERVJfNEspOwotCi0gICAgcHV0X2dmbihkLCBnZm4pOwotICAgIHJldHVy biBHTlRTVF9va2F5OwotfQotCi1zdGF0aWMgaW50IHJlcGxhY2VfZ3JhbnRfcHZfbWFwcGluZyh1 aW50NjRfdCBhZGRyLCB1bnNpZ25lZCBsb25nIGZyYW1lLAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgdWludDY0X3QgbmV3X2FkZHIsIHVuc2lnbmVkIGludCBmbGFncykKLXsK LSAgICBzdHJ1Y3QgdmNwdSAqY3VyciA9IGN1cnJlbnQ7Ci0gICAgbDFfcGdlbnRyeV90ICpwbDFl LCBvbDFlOwotICAgIHVuc2lnbmVkIGxvbmcgZ2wxbWZuOwotICAgIHN0cnVjdCBwYWdlX2luZm8g KmwxcGc7Ci0gICAgaW50IHJjOwotCi0gICAgaWYgKCBmbGFncyAmIEdOVE1BUF9jb250YWluc19w dGUgKQotICAgIHsKLSAgICAgICAgaWYgKCAhbmV3X2FkZHIgKQotICAgICAgICAgICAgcmV0dXJu IGRlc3Ryb3lfZ3JhbnRfcHRlX21hcHBpbmcoYWRkciwgZnJhbWUsIGN1cnItPmRvbWFpbik7Ci0K LSAgICAgICAgTUVNX0xPRygiVW5zdXBwb3J0ZWQgZ3JhbnQgdGFibGUgb3BlcmF0aW9uIik7Ci0g ICAgICAgIHJldHVybiBHTlRTVF9nZW5lcmFsX2Vycm9yOwotICAgIH0KLQotICAgIGlmICggIW5l d19hZGRyICkKLSAgICAgICAgcmV0dXJuIGRlc3Ryb3lfZ3JhbnRfdmFfbWFwcGluZyhhZGRyLCBm cmFtZSwgY3Vycik7Ci0KLSAgICBwbDFlID0gZ3Vlc3RfbWFwX2wxZShuZXdfYWRkciwgJmdsMW1m bik7Ci0gICAgaWYgKCAhcGwxZSApCi0gICAgewotICAgICAgICBNRU1fTE9HKCJDb3VsZCBub3Qg ZmluZCBMMSBQVEUgZm9yIGFkZHJlc3MgJWx4IiwKLSAgICAgICAgICAgICAgICAodW5zaWduZWQg bG9uZyluZXdfYWRkcik7Ci0gICAgICAgIHJldHVybiBHTlRTVF9nZW5lcmFsX2Vycm9yOwotICAg IH0KLQotICAgIGlmICggIWdldF9wYWdlX2Zyb21fcGFnZW5yKGdsMW1mbiwgY3VycmVudC0+ZG9t YWluKSApCi0gICAgewotICAgICAgICBndWVzdF91bm1hcF9sMWUocGwxZSk7Ci0gICAgICAgIHJl dHVybiBHTlRTVF9nZW5lcmFsX2Vycm9yOwotICAgIH0KKyAgICByZXR1cm4gY3JlYXRlX2dyYW50 X3B2X21hcHBpbmcoYWRkciwgZnJhbWUsIGZsYWdzLCBjYWNoZV9mbGFncyk7Cit9CiAKLSAgICBs MXBnID0gbWZuX3RvX3BhZ2UoZ2wxbWZuKTsKLSAgICBpZiAoICFwYWdlX2xvY2sobDFwZykgKQot ICAgIHsKLSAgICAgICAgcHV0X3BhZ2UobDFwZyk7Ci0gICAgICAgIGd1ZXN0X3VubWFwX2wxZShw bDFlKTsKLSAgICAgICAgcmV0dXJuIEdOVFNUX2dlbmVyYWxfZXJyb3I7Ci0gICAgfQorc3RhdGlj IGludCByZXBsYWNlX2dyYW50X3AybV9tYXBwaW5nKAorICAgIHVpbnQ2NF90IGFkZHIsIHVuc2ln bmVkIGxvbmcgZnJhbWUsIHVpbnQ2NF90IG5ld19hZGRyLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7 CisgICAgdW5zaWduZWQgbG9uZyBnZm4gPSAodW5zaWduZWQgbG9uZykoYWRkciA+PiBQQUdFX1NI SUZUKTsKKyAgICBwMm1fdHlwZV90IHR5cGU7CisgICAgbWZuX3Qgb2xkX21mbjsKKyAgICBzdHJ1 Y3QgZG9tYWluICpkID0gY3VycmVudC0+ZG9tYWluOwogCi0gICAgaWYgKCAobDFwZy0+dS5pbnVz ZS50eXBlX2luZm8gJiBQR1RfdHlwZV9tYXNrKSAhPSBQR1RfbDFfcGFnZV90YWJsZSApCi0gICAg ewotICAgICAgICBwYWdlX3VubG9jayhsMXBnKTsKLSAgICAgICAgcHV0X3BhZ2UobDFwZyk7Ci0g ICAgICAgIGd1ZXN0X3VubWFwX2wxZShwbDFlKTsKKyAgICBpZiAoIG5ld19hZGRyICE9IDAgfHwg KGZsYWdzICYgR05UTUFQX2NvbnRhaW5zX3B0ZSkgKQogICAgICAgICByZXR1cm4gR05UU1RfZ2Vu ZXJhbF9lcnJvcjsKLSAgICB9Ci0KLSAgICBvbDFlID0gKnBsMWU7CiAKLSAgICBpZiAoIHVubGlr ZWx5KCFVUERBVEVfRU5UUlkobDEsIHBsMWUsIG9sMWUsIGwxZV9lbXB0eSgpLAotICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBnbDFtZm4sIGN1cnIsIDApKSApCisgICAgb2xkX21mbiA9 IGdldF9nZm4oZCwgZ2ZuLCAmdHlwZSk7CisgICAgaWYgKCAhcDJtX2lzX2dyYW50KHR5cGUpIHx8 IG1mbl94KG9sZF9tZm4pICE9IGZyYW1lICkKICAgICB7Ci0gICAgICAgIHBhZ2VfdW5sb2NrKGwx cGcpOwotICAgICAgICBwdXRfcGFnZShsMXBnKTsKLSAgICAgICAgTUVNX0xPRygiQ2Fubm90IGRl bGV0ZSBQVEUgZW50cnkgYXQgJXAiLCAodW5zaWduZWQgbG9uZyAqKXBsMWUpOwotICAgICAgICBn dWVzdF91bm1hcF9sMWUocGwxZSk7CisgICAgICAgIHB1dF9nZm4oZCwgZ2ZuKTsKKyAgICAgICAg TUVNX0xPRygicmVwbGFjZV9ncmFudF9wMm1fbWFwcGluZzogb2xkIG1hcHBpbmcgaW52YWxpZCAo dHlwZSAlZCwgbWZuICVseCwgZnJhbWUgJWx4KSIsCisgICAgICAgICAgICAgICAgdHlwZSwgbWZu X3gob2xkX21mbiksIGZyYW1lKTsKICAgICAgICAgcmV0dXJuIEdOVFNUX2dlbmVyYWxfZXJyb3I7 CiAgICAgfQorICAgIGd1ZXN0X3BoeXNtYXBfcmVtb3ZlX3BhZ2UoZCwgX2dmbihnZm4pLCBfbWZu KGZyYW1lKSwgUEFHRV9PUkRFUl80Syk7CiAKLSAgICBwYWdlX3VubG9jayhsMXBnKTsKLSAgICBw dXRfcGFnZShsMXBnKTsKLSAgICBndWVzdF91bm1hcF9sMWUocGwxZSk7Ci0KLSAgICByYyA9IHJl cGxhY2VfZ3JhbnRfdmFfbWFwcGluZyhhZGRyLCBmcmFtZSwgb2wxZSwgY3Vycik7Ci0gICAgaWYg KCByYyAmJiAhcGFnaW5nX21vZGVfcmVmY291bnRzKGN1cnItPmRvbWFpbikgKQotICAgICAgICBw dXRfcGFnZV9mcm9tX2wxZShvbDFlLCBjdXJyLT5kb21haW4pOwotCi0gICAgcmV0dXJuIHJjOwor ICAgIHB1dF9nZm4oZCwgZ2ZuKTsKKyAgICByZXR1cm4gR05UU1Rfb2theTsKIH0KIAogaW50IHJl cGxhY2VfZ3JhbnRfaG9zdF9tYXBwaW5nKHVpbnQ2NF90IGFkZHIsIHVuc2lnbmVkIGxvbmcgZnJh bWUsCkBAIC00NDA1LDEyNSArMzEyMCw2IEBAIGludCBzdGVhbF9wYWdlKAogICAgIHJldHVybiAt MTsKIH0KIAotc3RhdGljIGludCBfX2RvX3VwZGF0ZV92YV9tYXBwaW5nKAotICAgIHVuc2lnbmVk IGxvbmcgdmEsIHU2NCB2YWw2NCwgdW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IGRvbWFpbiAq cGdfb3duZXIpCi17Ci0gICAgbDFfcGdlbnRyeV90ICAgdmFsID0gbDFlX2Zyb21faW50cHRlKHZh bDY0KTsKLSAgICBzdHJ1Y3QgdmNwdSAgICp2ICAgPSBjdXJyZW50OwotICAgIHN0cnVjdCBkb21h aW4gKmQgICA9IHYtPmRvbWFpbjsKLSAgICBzdHJ1Y3QgcGFnZV9pbmZvICpnbDFwZzsKLSAgICBs MV9wZ2VudHJ5X3QgICpwbDFlOwotICAgIHVuc2lnbmVkIGxvbmcgIGJtYXBfcHRyLCBnbDFtZm47 Ci0gICAgY3B1bWFza190ICAgICAqbWFzayA9IE5VTEw7Ci0gICAgaW50ICAgICAgICAgICAgcmM7 Ci0KLSAgICBwZXJmY19pbmNyKGNhbGxzX3RvX3VwZGF0ZV92YSk7Ci0KLSAgICByYyA9IHhzbV91 cGRhdGVfdmFfbWFwcGluZyhYU01fVEFSR0VULCBkLCBwZ19vd25lciwgdmFsKTsKLSAgICBpZiAo IHJjICkKLSAgICAgICAgcmV0dXJuIHJjOwotCi0gICAgcmMgPSAtRUlOVkFMOwotICAgIHBsMWUg PSBndWVzdF9tYXBfbDFlKHZhLCAmZ2wxbWZuKTsKLSAgICBpZiAoIHVubGlrZWx5KCFwbDFlIHx8 ICFnZXRfcGFnZV9mcm9tX3BhZ2VucihnbDFtZm4sIGQpKSApCi0gICAgICAgIGdvdG8gb3V0Owot Ci0gICAgZ2wxcGcgPSBtZm5fdG9fcGFnZShnbDFtZm4pOwotICAgIGlmICggIXBhZ2VfbG9jayhn bDFwZykgKQotICAgIHsKLSAgICAgICAgcHV0X3BhZ2UoZ2wxcGcpOwotICAgICAgICBnb3RvIG91 dDsKLSAgICB9Ci0KLSAgICBpZiAoIChnbDFwZy0+dS5pbnVzZS50eXBlX2luZm8gJiBQR1RfdHlw ZV9tYXNrKSAhPSBQR1RfbDFfcGFnZV90YWJsZSApCi0gICAgewotICAgICAgICBwYWdlX3VubG9j ayhnbDFwZyk7Ci0gICAgICAgIHB1dF9wYWdlKGdsMXBnKTsKLSAgICAgICAgZ290byBvdXQ7Ci0g ICAgfQotCi0gICAgcmMgPSBtb2RfbDFfZW50cnkocGwxZSwgdmFsLCBnbDFtZm4sIDAsIHYsIHBn X293bmVyKTsKLQotICAgIHBhZ2VfdW5sb2NrKGdsMXBnKTsKLSAgICBwdXRfcGFnZShnbDFwZyk7 Ci0KLSBvdXQ6Ci0gICAgaWYgKCBwbDFlICkKLSAgICAgICAgZ3Vlc3RfdW5tYXBfbDFlKHBsMWUp OwotCi0gICAgc3dpdGNoICggZmxhZ3MgJiBVVk1GX0ZMVVNIVFlQRV9NQVNLICkKLSAgICB7Ci0g ICAgY2FzZSBVVk1GX1RMQl9GTFVTSDoKLSAgICAgICAgc3dpdGNoICggKGJtYXBfcHRyID0gZmxh Z3MgJiB+VVZNRl9GTFVTSFRZUEVfTUFTSykgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgVVZN Rl9MT0NBTDoKLSAgICAgICAgICAgIGZsdXNoX3RsYl9sb2NhbCgpOwotICAgICAgICAgICAgYnJl YWs7Ci0gICAgICAgIGNhc2UgVVZNRl9BTEw6Ci0gICAgICAgICAgICBtYXNrID0gZC0+ZG9tYWlu X2RpcnR5X2NwdW1hc2s7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAg ICAgICAgICAgIG1hc2sgPSB0aGlzX2NwdShzY3JhdGNoX2NwdW1hc2spOwotICAgICAgICAgICAg cmMgPSBtbV92Y3B1bWFza190b19wY3B1bWFzayhkLAotICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdF9ndWVzdF9oYW5kbGVfZnJvbV9wdHIoYm1hcF9wdHIsCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB2b2lkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgbWFzayk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoIG1h c2sgKQotICAgICAgICAgICAgZmx1c2hfdGxiX21hc2sobWFzayk7Ci0gICAgICAgIGJyZWFrOwot Ci0gICAgY2FzZSBVVk1GX0lOVkxQRzoKLSAgICAgICAgc3dpdGNoICggKGJtYXBfcHRyID0gZmxh Z3MgJiB+VVZNRl9GTFVTSFRZUEVfTUFTSykgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgVVZN Rl9MT0NBTDoKLSAgICAgICAgICAgIHBhZ2luZ19pbnZscGcodiwgdmEpOwotICAgICAgICAgICAg YnJlYWs7Ci0gICAgICAgIGNhc2UgVVZNRl9BTEw6Ci0gICAgICAgICAgICBtYXNrID0gZC0+ZG9t YWluX2RpcnR5X2NwdW1hc2s7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoK LSAgICAgICAgICAgIG1hc2sgPSB0aGlzX2NwdShzY3JhdGNoX2NwdW1hc2spOwotICAgICAgICAg ICAgcmMgPSBtbV92Y3B1bWFza190b19wY3B1bWFzayhkLAotICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdF9ndWVzdF9oYW5kbGVfZnJvbV9wdHIoYm1hcF9wdHIs Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB2b2lkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgbWFzayk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAo IG1hc2sgKQotICAgICAgICAgICAgZmx1c2hfdGxiX29uZV9tYXNrKG1hc2ssIHZhKTsKLSAgICAg ICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJjOwotfQotCi1sb25nIGRvX3VwZGF0ZV92 YV9tYXBwaW5nKHVuc2lnbmVkIGxvbmcgdmEsIHU2NCB2YWw2NCwKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLSAgICByZXR1cm4gX19kb191cGRhdGVf dmFfbWFwcGluZyh2YSwgdmFsNjQsIGZsYWdzLCBjdXJyZW50LT5kb21haW4pOwotfQotCi1sb25n IGRvX3VwZGF0ZV92YV9tYXBwaW5nX290aGVyZG9tYWluKHVuc2lnbmVkIGxvbmcgdmEsIHU2NCB2 YWw2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9u ZyBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9taWRfdCBk b21pZCkKLXsKLSAgICBzdHJ1Y3QgZG9tYWluICpwZ19vd25lcjsKLSAgICBpbnQgcmM7Ci0KLSAg ICBpZiAoIChwZ19vd25lciA9IG1tX2dldF9wZ19vd25lcihkb21pZCkpID09IE5VTEwgKQotICAg ICAgICByZXR1cm4gLUVTUkNIOwotCi0gICAgcmMgPSBfX2RvX3VwZGF0ZV92YV9tYXBwaW5nKHZh LCB2YWw2NCwgZmxhZ3MsIHBnX293bmVyKTsKLQotICAgIG1tX3B1dF9wZ19vd25lcihwZ19vd25l cik7Ci0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioq KgogICogRGVzY3JpcHRvciBUYWJsZXMKICAqLwpAQCAtNTA4NCw0NjYgKzM2ODAsNiBAQCBsb25n IGFyY2hfbWVtb3J5X29wKHVuc2lnbmVkIGxvbmcgY21kLCBYRU5fR1VFU1RfSEFORExFX1BBUkFN KHZvaWQpIGFyZykKICAgICByZXR1cm4gMDsKIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioq KioqKgotICogV3JpdGFibGUgUGFnZXRhYmxlcwotICovCi0KLXN0cnVjdCBwdHdyX2VtdWxhdGVf Y3R4dCB7Ci0gICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgY3R4dDsKLSAgICB1bnNpZ25lZCBs b25nIGNyMjsKLSAgICBsMV9wZ2VudHJ5X3QgIHB0ZTsKLX07Ci0KLXN0YXRpYyBpbnQgcHR3cl9l bXVsYXRlZF9yZWFkKAotICAgIGVudW0geDg2X3NlZ21lbnQgc2VnLAotICAgIHVuc2lnbmVkIGxv bmcgb2Zmc2V0LAotICAgIHZvaWQgKnBfZGF0YSwKLSAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCi0g ICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCi17Ci0gICAgdW5zaWduZWQgaW50IHJj ID0gYnl0ZXM7Ci0gICAgdW5zaWduZWQgbG9uZyBhZGRyID0gb2Zmc2V0OwotCi0gICAgaWYgKCAh X19hZGRyX29rKGFkZHIpIHx8Ci0gICAgICAgICAocmMgPSBfX2NvcHlfZnJvbV91c2VyKHBfZGF0 YSwgKHZvaWQgKilhZGRyLCBieXRlcykpICkKLSAgICB7Ci0gICAgICAgIHg4Nl9lbXVsX3BhZ2Vm YXVsdCgwLCBhZGRyICsgYnl0ZXMgLSByYywgY3R4dCk7ICAvKiBSZWFkIGZhdWx0LiAqLwotICAg ICAgICByZXR1cm4gWDg2RU1VTF9FWENFUFRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIFg4NkVN VUxfT0tBWTsKLX0KLQotc3RhdGljIGludCBwdHdyX2VtdWxhdGVkX3VwZGF0ZSgKLSAgICB1bnNp Z25lZCBsb25nIGFkZHIsCi0gICAgcGFkZHJfdCBvbGQsCi0gICAgcGFkZHJfdCB2YWwsCi0gICAg dW5zaWduZWQgaW50IGJ5dGVzLAotICAgIHVuc2lnbmVkIGludCBkb19jbXB4Y2hnLAotICAgIHN0 cnVjdCBwdHdyX2VtdWxhdGVfY3R4dCAqcHR3cl9jdHh0KQotewotICAgIHVuc2lnbmVkIGxvbmcg bWZuOwotICAgIHVuc2lnbmVkIGxvbmcgdW5hbGlnbmVkX2FkZHIgPSBhZGRyOwotICAgIHN0cnVj dCBwYWdlX2luZm8gKnBhZ2U7Ci0gICAgbDFfcGdlbnRyeV90IHB0ZSwgb2wxZSwgbmwxZSwgKnBs MWU7Ci0gICAgc3RydWN0IHZjcHUgKnYgPSBjdXJyZW50OwotICAgIHN0cnVjdCBkb21haW4gKmQg PSB2LT5kb21haW47Ci0gICAgaW50IHJldDsKLQotICAgIC8qIE9ubHkgYWxsb3cgbmF0dXJhbGx5 LWFsaWduZWQgc3RvcmVzIHdpdGhpbiB0aGUgb3JpZ2luYWwgJWNyMiBwYWdlLiAqLwotICAgIGlm ICggdW5saWtlbHkoKChhZGRyXnB0d3JfY3R4dC0+Y3IyKSAmIFBBR0VfTUFTSykgfHwgKGFkZHIg JiAoYnl0ZXMtMSkpKSApCi0gICAgewotICAgICAgICBNRU1fTE9HKCJwdHdyX2VtdWxhdGU6IGJh ZCBhY2Nlc3MgKGNyMj0lbHgsIGFkZHI9JWx4LCBieXRlcz0ldSkiLAotICAgICAgICAgICAgICAg IHB0d3JfY3R4dC0+Y3IyLCBhZGRyLCBieXRlcyk7Ci0gICAgICAgIHJldHVybiBYODZFTVVMX1VO SEFORExFQUJMRTsKLSAgICB9Ci0KLSAgICAvKiBUdXJuIGEgc3ViLXdvcmQgYWNjZXNzIGludG8g YSBmdWxsLXdvcmQgYWNjZXNzLiAqLwotICAgIGlmICggYnl0ZXMgIT0gc2l6ZW9mKHBhZGRyX3Qp ICkKLSAgICB7Ci0gICAgICAgIHBhZGRyX3QgICAgICBmdWxsOwotICAgICAgICB1bnNpZ25lZCBp bnQgcmMsIG9mZnNldCA9IGFkZHIgJiAoc2l6ZW9mKHBhZGRyX3QpLTEpOwotCi0gICAgICAgIC8q IEFsaWduIGFkZHJlc3M7IHJlYWQgZnVsbCB3b3JkLiAqLwotICAgICAgICBhZGRyICY9IH4oc2l6 ZW9mKHBhZGRyX3QpLTEpOwotICAgICAgICBpZiAoIChyYyA9IGNvcHlfZnJvbV91c2VyKCZmdWxs LCAodm9pZCAqKWFkZHIsIHNpemVvZihwYWRkcl90KSkpICE9IDAgKQotICAgICAgICB7Ci0gICAg ICAgICAgICB4ODZfZW11bF9wYWdlZmF1bHQoMCwgLyogUmVhZCBmYXVsdC4gKi8KLSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBhZGRyICsgc2l6ZW9mKHBhZGRyX3QpIC0gcmMsCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0d3JfY3R4dC0+Y3R4dCk7Ci0gICAgICAgICAg ICByZXR1cm4gWDg2RU1VTF9FWENFUFRJT047Ci0gICAgICAgIH0KLSAgICAgICAgLyogTWFzayBv dXQgYml0cyBwcm92aWRlZCBieSBjYWxsZXIuICovCi0gICAgICAgIGZ1bGwgJj0gfigoKChwYWRk cl90KTEgPDwgKGJ5dGVzKjgpKSAtIDEpIDw8IChvZmZzZXQqOCkpOwotICAgICAgICAvKiBTaGlm dCB0aGUgY2FsbGVyIHZhbHVlIGFuZCBPUiBpbiB0aGUgbWlzc2luZyBiaXRzLiAqLwotICAgICAg ICB2YWwgICY9ICgoKHBhZGRyX3QpMSA8PCAoYnl0ZXMqOCkpIC0gMSk7Ci0gICAgICAgIHZhbCA8 PD0gKG9mZnNldCkqODsKLSAgICAgICAgdmFsICB8PSBmdWxsOwotICAgICAgICAvKiBBbHNvIGZp bGwgaW4gbWlzc2luZyBwYXJ0cyBvZiB0aGUgY21weGNoZyBvbGQgdmFsdWUuICovCi0gICAgICAg IG9sZCAgJj0gKCgocGFkZHJfdCkxIDw8IChieXRlcyo4KSkgLSAxKTsKLSAgICAgICAgb2xkIDw8 PSAob2Zmc2V0KSo4OwotICAgICAgICBvbGQgIHw9IGZ1bGw7Ci0gICAgfQotCi0gICAgcHRlICA9 IHB0d3JfY3R4dC0+cHRlOwotICAgIG1mbiAgPSBsMWVfZ2V0X3BmbihwdGUpOwotICAgIHBhZ2Ug PSBtZm5fdG9fcGFnZShtZm4pOwotCi0gICAgLyogV2UgYXJlIGxvb2tpbmcgb25seSBmb3IgcmVh ZC1vbmx5IG1hcHBpbmdzIG9mIHAudC4gcGFnZXMuICovCi0gICAgQVNTRVJUKChsMWVfZ2V0X2Zs YWdzKHB0ZSkgJiAoX1BBR0VfUld8X1BBR0VfUFJFU0VOVCkpID09IF9QQUdFX1BSRVNFTlQpOwot ICAgIEFTU0VSVChtZm5fdmFsaWQoX21mbihtZm4pKSk7Ci0gICAgQVNTRVJUKChwYWdlLT51Lmlu dXNlLnR5cGVfaW5mbyAmIFBHVF90eXBlX21hc2spID09IFBHVF9sMV9wYWdlX3RhYmxlKTsKLSAg ICBBU1NFUlQoKHBhZ2UtPnUuaW51c2UudHlwZV9pbmZvICYgUEdUX2NvdW50X21hc2spICE9IDAp OwotICAgIEFTU0VSVChwYWdlX2dldF9vd25lcihwYWdlKSA9PSBkKTsKLQotICAgIC8qIENoZWNr IHRoZSBuZXcgUFRFLiAqLwotICAgIG5sMWUgPSBsMWVfZnJvbV9pbnRwdGUodmFsKTsKLSAgICBz d2l0Y2ggKCByZXQgPSBnZXRfcGFnZV9mcm9tX2wxZShubDFlLCBkLCBkKSApCi0gICAgewotICAg IGRlZmF1bHQ6Ci0gICAgICAgIGlmICggaXNfcHZfMzJiaXRfZG9tYWluKGQpICYmIChieXRlcyA9 PSA0KSAmJiAodW5hbGlnbmVkX2FkZHIgJiA0KSAmJgotICAgICAgICAgICAgICFkb19jbXB4Y2hn ICYmIChsMWVfZ2V0X2ZsYWdzKG5sMWUpICYgX1BBR0VfUFJFU0VOVCkgKQotICAgICAgICB7Ci0g ICAgICAgICAgICAvKgotICAgICAgICAgICAgICogSWYgdGhpcyBpcyBhbiB1cHBlci1oYWxmIHdy aXRlIHRvIGEgUEFFIFBURSB0aGVuIHdlIGFzc3VtZSB0aGF0Ci0gICAgICAgICAgICAgKiB0aGUg Z3Vlc3QgaGFzIHNpbXBseSBnb3QgdGhlIHR3byB3cml0ZXMgdGhlIHdyb25nIHdheSByb3VuZC4g V2UKLSAgICAgICAgICAgICAqIHphcCB0aGUgUFJFU0VOVCBiaXQgb24gdGhlIGFzc3VtcHRpb24g dGhhdCB0aGUgYm90dG9tIGhhbGYgd2lsbAotICAgICAgICAgICAgICogYmUgd3JpdHRlbiBpbW1l ZGlhdGVseSBhZnRlciB3ZSByZXR1cm4gdG8gdGhlIGd1ZXN0LgotICAgICAgICAgICAgICovCi0g ICAgICAgICAgICBnZHByaW50ayhYRU5MT0dfREVCVUcsICJwdHdyX2VtdWxhdGU6IGZpeGluZyB1 cCBpbnZhbGlkIFBBRSBQVEUgJSIKLSAgICAgICAgICAgICAgICAgICAgIFBSSXB0ZSJcbiIsIGwx ZV9nZXRfaW50cHRlKG5sMWUpKTsKLSAgICAgICAgICAgIGwxZV9yZW1vdmVfZmxhZ3MobmwxZSwg X1BBR0VfUFJFU0VOVCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAg ICAgICAgICBNRU1fTE9HKCJwdHdyX2VtdWxhdGU6IGNvdWxkIG5vdCBnZXRfcGFnZV9mcm9tX2wx ZSgpIik7Ci0gICAgICAgICAgICByZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7Ci0gICAgICAg IH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAwOgotICAgICAgICBicmVhazsKLSAgICBjYXNl IF9QQUdFX1JXIC4uLiBfUEFHRV9SVyB8IFBBR0VfQ0FDSEVfQVRUUlM6Ci0gICAgICAgIEFTU0VS VCghKHJldCAmIH4oX1BBR0VfUlcgfCBQQUdFX0NBQ0hFX0FUVFJTKSkpOwotICAgICAgICBsMWVf ZmxpcF9mbGFncyhubDFlLCByZXQpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBhZGp1 c3RfZ3Vlc3RfbDFlKG5sMWUsIGQpOwotCi0gICAgLyogQ2hlY2tlZCBzdWNjZXNzZnVsbHk6IGRv IHRoZSB1cGRhdGUgKHdyaXRlIG9yIGNtcHhjaGcpLiAqLwotICAgIHBsMWUgPSBtYXBfZG9tYWlu X3BhZ2UoX21mbihtZm4pKTsKLSAgICBwbDFlID0gKGwxX3BnZW50cnlfdCAqKSgodW5zaWduZWQg bG9uZylwbDFlICsgKGFkZHIgJiB+UEFHRV9NQVNLKSk7Ci0gICAgaWYgKCBkb19jbXB4Y2hnICkK LSAgICB7Ci0gICAgICAgIGludCBva2F5OwotICAgICAgICBpbnRwdGVfdCB0ID0gb2xkOwotICAg ICAgICBvbDFlID0gbDFlX2Zyb21faW50cHRlKG9sZCk7Ci0KLSAgICAgICAgb2theSA9IHBhZ2lu Z19jbXB4Y2hnX2d1ZXN0X2VudHJ5KHYsICZsMWVfZ2V0X2ludHB0ZSgqcGwxZSksCi0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdCwgbDFlX2dldF9pbnRwdGUobmwx ZSksIF9tZm4obWZuKSk7Ci0gICAgICAgIG9rYXkgPSAob2theSAmJiB0ID09IG9sZCk7Ci0KLSAg ICAgICAgaWYgKCAhb2theSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVubWFwX2RvbWFpbl9w YWdlKHBsMWUpOwotICAgICAgICAgICAgcHV0X3BhZ2VfZnJvbV9sMWUobmwxZSwgZCk7Ci0gICAg ICAgICAgICByZXR1cm4gWDg2RU1VTF9SRVRSWTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNl Ci0gICAgewotICAgICAgICBvbDFlID0gKnBsMWU7Ci0gICAgICAgIGlmICggIVVQREFURV9FTlRS WShsMSwgcGwxZSwgb2wxZSwgbmwxZSwgbWZuLCB2LCAwKSApCi0gICAgICAgICAgICBCVUcoKTsK LSAgICB9Ci0KLSAgICB0cmFjZV9wdHdyX2VtdWxhdGlvbihhZGRyLCBubDFlKTsKLQotICAgIHVu bWFwX2RvbWFpbl9wYWdlKHBsMWUpOwotCi0gICAgLyogRmluYWxseSwgZHJvcCB0aGUgb2xkIFBU RS4gKi8KLSAgICBwdXRfcGFnZV9mcm9tX2wxZShvbDFlLCBkKTsKLQotICAgIHJldHVybiBYODZF TVVMX09LQVk7Ci19Ci0KLXN0YXRpYyBpbnQgcHR3cl9lbXVsYXRlZF93cml0ZSgKLSAgICBlbnVt IHg4Nl9zZWdtZW50IHNlZywKLSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKLSAgICB2b2lkICpw X2RhdGEsCi0gICAgdW5zaWduZWQgaW50IGJ5dGVzLAotICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9j dHh0ICpjdHh0KQotewotICAgIHBhZGRyX3QgdmFsID0gMDsKLQotICAgIGlmICggKGJ5dGVzID4g c2l6ZW9mKHBhZGRyX3QpKSB8fCAoYnl0ZXMgJiAoYnl0ZXMgLSAxKSkgfHwgIWJ5dGVzICkKLSAg ICB7Ci0gICAgICAgIE1FTV9MT0coInB0d3JfZW11bGF0ZTogYmFkIHdyaXRlIHNpemUgKGFkZHI9 JWx4LCBieXRlcz0ldSkiLAotICAgICAgICAgICAgICAgIG9mZnNldCwgYnl0ZXMpOwotICAgICAg ICByZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7Ci0gICAgfQotCi0gICAgbWVtY3B5KCZ2YWws IHBfZGF0YSwgYnl0ZXMpOwotCi0gICAgcmV0dXJuIHB0d3JfZW11bGF0ZWRfdXBkYXRlKAotICAg ICAgICBvZmZzZXQsIDAsIHZhbCwgYnl0ZXMsIDAsCi0gICAgICAgIGNvbnRhaW5lcl9vZihjdHh0 LCBzdHJ1Y3QgcHR3cl9lbXVsYXRlX2N0eHQsIGN0eHQpKTsKLX0KLQotc3RhdGljIGludCBwdHdy X2VtdWxhdGVkX2NtcHhjaGcoCi0gICAgZW51bSB4ODZfc2VnbWVudCBzZWcsCi0gICAgdW5zaWdu ZWQgbG9uZyBvZmZzZXQsCi0gICAgdm9pZCAqcF9vbGQsCi0gICAgdm9pZCAqcF9uZXcsCi0gICAg dW5zaWduZWQgaW50IGJ5dGVzLAotICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQot ewotICAgIHBhZGRyX3Qgb2xkID0gMCwgbmV3ID0gMDsKLQotICAgIGlmICggKGJ5dGVzID4gc2l6 ZW9mKHBhZGRyX3QpKSB8fCAoYnl0ZXMgJiAoYnl0ZXMgLTEpKSApCi0gICAgewotICAgICAgICBN RU1fTE9HKCJwdHdyX2VtdWxhdGU6IGJhZCBjbXB4Y2hnIHNpemUgKGFkZHI9JWx4LCBieXRlcz0l dSkiLAotICAgICAgICAgICAgICAgIG9mZnNldCwgYnl0ZXMpOwotICAgICAgICByZXR1cm4gWDg2 RU1VTF9VTkhBTkRMRUFCTEU7Ci0gICAgfQotCi0gICAgbWVtY3B5KCZvbGQsIHBfb2xkLCBieXRl cyk7Ci0gICAgbWVtY3B5KCZuZXcsIHBfbmV3LCBieXRlcyk7Ci0KLSAgICByZXR1cm4gcHR3cl9l bXVsYXRlZF91cGRhdGUoCi0gICAgICAgIG9mZnNldCwgb2xkLCBuZXcsIGJ5dGVzLCAxLAotICAg ICAgICBjb250YWluZXJfb2YoY3R4dCwgc3RydWN0IHB0d3JfZW11bGF0ZV9jdHh0LCBjdHh0KSk7 Ci19Ci0KLXN0YXRpYyBpbnQgcHZfZW11bF9pc19tZW1fd3JpdGUoY29uc3Qgc3RydWN0IHg4Nl9l bXVsYXRlX3N0YXRlICpzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ry dWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCi17Ci0gICAgcmV0dXJuIHg4Nl9pbnNuX2lzX21l bV93cml0ZShzdGF0ZSwgY3R4dCkgPyBYODZFTVVMX09LQVkKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA6IFg4NkVNVUxfVU5IQU5ETEVBQkxFOwotfQotCi1z dGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyBwdHdyX2VtdWxhdGVfb3BzID0gewot ICAgIC5yZWFkICAgICAgID0gcHR3cl9lbXVsYXRlZF9yZWFkLAotICAgIC5pbnNuX2ZldGNoID0g cHR3cl9lbXVsYXRlZF9yZWFkLAotICAgIC53cml0ZSAgICAgID0gcHR3cl9lbXVsYXRlZF93cml0 ZSwKLSAgICAuY21weGNoZyAgICA9IHB0d3JfZW11bGF0ZWRfY21weGNoZywKLSAgICAudmFsaWRh dGUgICA9IHB2X2VtdWxfaXNfbWVtX3dyaXRlLAotICAgIC5jcHVpZCAgICAgID0gcHZfZW11bF9j cHVpZCwKLX07Ci0KLS8qIFdyaXRlIHBhZ2UgZmF1bHQgaGFuZGxlcjogY2hlY2sgaWYgZ3Vlc3Qg aXMgdHJ5aW5nIHRvIG1vZGlmeSBhIFBURS4gKi8KLWludCBwdHdyX2RvX3BhZ2VfZmF1bHQoc3Ry dWN0IHZjcHUgKnYsIHVuc2lnbmVkIGxvbmcgYWRkciwgCi0gICAgICAgICAgICAgICAgICAgICAg IHN0cnVjdCBjcHVfdXNlcl9yZWdzICpyZWdzKQotewotICAgIHN0cnVjdCBkb21haW4gKmQgPSB2 LT5kb21haW47Ci0gICAgc3RydWN0IHBhZ2VfaW5mbyAqcGFnZTsKLSAgICBsMV9wZ2VudHJ5X3Qg ICAgICBwdGU7Ci0gICAgc3RydWN0IHB0d3JfZW11bGF0ZV9jdHh0IHB0d3JfY3R4dCA9IHsKLSAg ICAgICAgLmN0eHQgPSB7Ci0gICAgICAgICAgICAucmVncyA9IHJlZ3MsCi0gICAgICAgICAgICAu dmVuZG9yID0gZC0+YXJjaC5jcHVpZC0+eDg2X3ZlbmRvciwKLSAgICAgICAgICAgIC5hZGRyX3Np emUgPSBpc19wdl8zMmJpdF9kb21haW4oZCkgPyAzMiA6IEJJVFNfUEVSX0xPTkcsCi0gICAgICAg ICAgICAuc3Bfc2l6ZSAgID0gaXNfcHZfMzJiaXRfZG9tYWluKGQpID8gMzIgOiBCSVRTX1BFUl9M T05HLAotICAgICAgICAgICAgLnN3aW50X2VtdWxhdGUgPSB4ODZfc3dpbnRfZW11bGF0ZV9ub25l LAotICAgICAgICB9LAotICAgIH07Ci0gICAgaW50IHJjOwotCi0gICAgLyogQXR0ZW1wdCB0byBy ZWFkIHRoZSBQVEUgdGhhdCBtYXBzIHRoZSBWQSBiZWluZyBhY2Nlc3NlZC4gKi8KLSAgICBndWVz dF9nZXRfZWZmX2wxZShhZGRyLCAmcHRlKTsKLQotICAgIC8qIFdlIGFyZSBsb29raW5nIG9ubHkg Zm9yIHJlYWQtb25seSBtYXBwaW5ncyBvZiBwLnQuIHBhZ2VzLiAqLwotICAgIGlmICggKChsMWVf Z2V0X2ZsYWdzKHB0ZSkgJiAoX1BBR0VfUFJFU0VOVHxfUEFHRV9SVykpICE9IF9QQUdFX1BSRVNF TlQpIHx8Ci0gICAgICAgICByYW5nZXNldF9jb250YWluc19zaW5nbGV0b24obW1pb19yb19yYW5n ZXMsIGwxZV9nZXRfcGZuKHB0ZSkpIHx8Ci0gICAgICAgICAhZ2V0X3BhZ2VfZnJvbV9wYWdlbnIo bDFlX2dldF9wZm4ocHRlKSwgZCkgKQotICAgICAgICBnb3RvIGJhaWw7Ci0KLSAgICBwYWdlID0g bDFlX2dldF9wYWdlKHB0ZSk7Ci0gICAgaWYgKCAhcGFnZV9sb2NrKHBhZ2UpICkKLSAgICB7Ci0g ICAgICAgIHB1dF9wYWdlKHBhZ2UpOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotCi0gICAg aWYgKCAocGFnZS0+dS5pbnVzZS50eXBlX2luZm8gJiBQR1RfdHlwZV9tYXNrKSAhPSBQR1RfbDFf cGFnZV90YWJsZSApCi0gICAgewotICAgICAgICBwYWdlX3VubG9jayhwYWdlKTsKLSAgICAgICAg cHV0X3BhZ2UocGFnZSk7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBwdHdyX2N0 eHQuY3IyID0gYWRkcjsKLSAgICBwdHdyX2N0eHQucHRlID0gcHRlOwotCi0gICAgcmMgPSB4ODZf ZW11bGF0ZSgmcHR3cl9jdHh0LmN0eHQsICZwdHdyX2VtdWxhdGVfb3BzKTsKLQotICAgIHBhZ2Vf dW5sb2NrKHBhZ2UpOwotICAgIHB1dF9wYWdlKHBhZ2UpOwotCi0gICAgc3dpdGNoICggcmMgKQot ICAgIHsKLSAgICBjYXNlIFg4NkVNVUxfRVhDRVBUSU9OOgotICAgICAgICAvKgotICAgICAgICAg KiBUaGlzIGVtdWxhdGlvbiBvbmx5IGNvdmVycyB3cml0ZXMgdG8gcGFnZXRhYmxlcyB3aGljaCBh cmUgbWFya2VkCi0gICAgICAgICAqIHJlYWQtb25seSBieSBYZW4uICBXZSB0b2xlcmF0ZSAjUEYg KGluIGNhc2UgYSBjb25jdXJyZW50IHBhZ2V0YWJsZQotICAgICAgICAgKiB1cGRhdGUgaGFzIHN1 Y2NlZWRlZCBvbiBhIGRpZmZlcmVudCB2Y3B1KS4gIEFueXRoaW5nIGVsc2UgaXMgYW4KLSAgICAg ICAgICogZW11bGF0aW9uIGJ1Zywgb3IgYSBndWVzdCBwbGF5aW5nIHdpdGggdGhlIGluc3RydWN0 aW9uIHN0cmVhbSB1bmRlcgotICAgICAgICAgKiBYZW4ncyBmZWV0LgotICAgICAgICAgKi8KLSAg ICAgICAgaWYgKCBwdHdyX2N0eHQuY3R4dC5ldmVudC50eXBlID09IFg4Nl9FVkVOVFRZUEVfSFdf RVhDRVBUSU9OICYmCi0gICAgICAgICAgICAgcHR3cl9jdHh0LmN0eHQuZXZlbnQudmVjdG9yID09 IFRSQVBfcGFnZV9mYXVsdCApCi0gICAgICAgICAgICBwdl9pbmplY3RfZXZlbnQoJnB0d3JfY3R4 dC5jdHh0LmV2ZW50KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZ2RwcmludGsoWEVOTE9H X1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBldmVudCAodHlwZSAl dSwgdmVjdG9yICUjeCkgZnJvbSBlbXVsYXRpb25cbiIsCi0gICAgICAgICAgICAgICAgICAgICBw dHdyX2N0eHQuY3R4dC5ldmVudC50eXBlLCBwdHdyX2N0eHQuY3R4dC5ldmVudC52ZWN0b3IpOwot Ci0gICAgICAgIC8qIEZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBYODZFTVVMX09LQVk6Ci0KLSAg ICAgICAgaWYgKCBwdHdyX2N0eHQuY3R4dC5yZXRpcmUuc2luZ2xlc3RlcCApCi0gICAgICAgICAg ICBwdl9pbmplY3RfaHdfZXhjZXB0aW9uKFRSQVBfZGVidWcsIFg4Nl9FVkVOVF9OT19FQyk7Ci0K LSAgICAgICAgLyogRmFsbHRocm91Z2ggKi8KLSAgICBjYXNlIFg4NkVNVUxfUkVUUlk6Ci0gICAg ICAgIHBlcmZjX2luY3IocHR3cl9lbXVsYXRpb25zKTsKLSAgICAgICAgcmV0dXJuIEVYQ1JFVF9m YXVsdF9maXhlZDsKLSAgICB9Ci0KLSBiYWlsOgotICAgIHJldHVybiAwOwotfQotCi0vKioqKioq KioqKioqKioqKioqKioqKioqKgotICogZmF1bHQgaGFuZGxpbmcgZm9yIHJlYWQtb25seSBNTUlP IHBhZ2VzCi0gKi8KLQotaW50IG1taW9fcm9fZW11bGF0ZWRfd3JpdGUoCi0gICAgZW51bSB4ODZf c2VnbWVudCBzZWcsCi0gICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0gICAgdm9pZCAqcF9kYXRh LAotICAgIHVuc2lnbmVkIGludCBieXRlcywKLSAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAq Y3R4dCkKLXsKLSAgICBzdHJ1Y3QgbW1pb19yb19lbXVsYXRlX2N0eHQgKm1taW9fcm9fY3R4dCA9 IGN0eHQtPmRhdGE7Ci0KLSAgICAvKiBPbmx5IGFsbG93IG5hdHVyYWxseS1hbGlnbmVkIHN0b3Jl cyBhdCB0aGUgb3JpZ2luYWwgJWNyMiBhZGRyZXNzLiAqLwotICAgIGlmICggKChieXRlcyB8IG9m ZnNldCkgJiAoYnl0ZXMgLSAxKSkgfHwgIWJ5dGVzIHx8Ci0gICAgICAgICBvZmZzZXQgIT0gbW1p b19yb19jdHh0LT5jcjIgKQotICAgIHsKLSAgICAgICAgTUVNX0xPRygibW1pb19yb19lbXVsYXRl OiBiYWQgYWNjZXNzIChjcjI9JWx4LCBhZGRyPSVseCwgYnl0ZXM9JXUpIiwKLSAgICAgICAgICAg ICAgICBtbWlvX3JvX2N0eHQtPmNyMiwgb2Zmc2V0LCBieXRlcyk7Ci0gICAgICAgIHJldHVybiBY ODZFTVVMX1VOSEFORExFQUJMRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gWDg2RU1VTF9PS0FZOwot fQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyBtbWlvX3JvX2VtdWxhdGVf b3BzID0gewotICAgIC5yZWFkICAgICAgID0geDg2ZW11bF91bmhhbmRsZWFibGVfcncsCi0gICAg Lmluc25fZmV0Y2ggPSBwdHdyX2VtdWxhdGVkX3JlYWQsCi0gICAgLndyaXRlICAgICAgPSBtbWlv X3JvX2VtdWxhdGVkX3dyaXRlLAotICAgIC52YWxpZGF0ZSAgID0gcHZfZW11bF9pc19tZW1fd3Jp dGUsCi0gICAgLmNwdWlkICAgICAgPSBwdl9lbXVsX2NwdWlkLAotfTsKLQotaW50IG1tY2ZnX2lu dGVyY2VwdF93cml0ZSgKLSAgICBlbnVtIHg4Nl9zZWdtZW50IHNlZywKLSAgICB1bnNpZ25lZCBs b25nIG9mZnNldCwKLSAgICB2b2lkICpwX2RhdGEsCi0gICAgdW5zaWduZWQgaW50IGJ5dGVzLAot ICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQotewotICAgIHN0cnVjdCBtbWlvX3Jv X2VtdWxhdGVfY3R4dCAqbW1pb19jdHh0ID0gY3R4dC0+ZGF0YTsKLQotICAgIC8qCi0gICAgICog T25seSBhbGxvdyBuYXR1cmFsbHktYWxpZ25lZCBzdG9yZXMgbm8gd2lkZXIgdGhhbiA0IGJ5dGVz IHRvIHRoZQotICAgICAqIG9yaWdpbmFsICVjcjIgYWRkcmVzcy4KLSAgICAgKi8KLSAgICBpZiAo ICgoYnl0ZXMgfCBvZmZzZXQpICYgKGJ5dGVzIC0gMSkpIHx8IGJ5dGVzID4gNCB8fCAhYnl0ZXMg fHwKLSAgICAgICAgIG9mZnNldCAhPSBtbWlvX2N0eHQtPmNyMiApCi0gICAgewotICAgICAgICBN RU1fTE9HKCJtbWNmZ19pbnRlcmNlcHQ6IGJhZCB3cml0ZSAoY3IyPSVseCwgYWRkcj0lbHgsIGJ5 dGVzPSV1KSIsCi0gICAgICAgICAgICAgICAgbW1pb19jdHh0LT5jcjIsIG9mZnNldCwgYnl0ZXMp OwotICAgICAgICByZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7Ci0gICAgfQotCi0gICAgb2Zm c2V0ICY9IDB4ZmZmOwotICAgIGlmICggcGNpX2NvbmZfd3JpdGVfaW50ZXJjZXB0KG1taW9fY3R4 dC0+c2VnLCBtbWlvX2N0eHQtPmJkZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBvZmZzZXQsIGJ5dGVzLCBwX2RhdGEpID49IDAgKQotICAgICAgICBwY2lfbW1jZmdfd3JpdGUo bW1pb19jdHh0LT5zZWcsIFBDSV9CVVMobW1pb19jdHh0LT5iZGYpLAotICAgICAgICAgICAgICAg ICAgICAgICAgUENJX0RFVkZOMihtbWlvX2N0eHQtPmJkZiksIG9mZnNldCwgYnl0ZXMsCi0gICAg ICAgICAgICAgICAgICAgICAgICAqKHVpbnQzMl90ICopcF9kYXRhKTsKLQotICAgIHJldHVybiBY ODZFTVVMX09LQVk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgeDg2X2VtdWxhdGVfb3BzIG1t Y2ZnX2ludGVyY2VwdF9vcHMgPSB7Ci0gICAgLnJlYWQgICAgICAgPSB4ODZlbXVsX3VuaGFuZGxl YWJsZV9ydywKLSAgICAuaW5zbl9mZXRjaCA9IHB0d3JfZW11bGF0ZWRfcmVhZCwKLSAgICAud3Jp dGUgICAgICA9IG1tY2ZnX2ludGVyY2VwdF93cml0ZSwKLSAgICAudmFsaWRhdGUgICA9IHB2X2Vt dWxfaXNfbWVtX3dyaXRlLAotICAgIC5jcHVpZCAgICAgID0gcHZfZW11bF9jcHVpZCwKLX07Ci0K LS8qIENoZWNrIGlmIGd1ZXN0IGlzIHRyeWluZyB0byBtb2RpZnkgYSByL28gTU1JTyBwYWdlLiAq LwotaW50IG1taW9fcm9fZG9fcGFnZV9mYXVsdChzdHJ1Y3QgdmNwdSAqdiwgdW5zaWduZWQgbG9u ZyBhZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY3B1X3VzZXJfcmVncyAq cmVncykKLXsKLSAgICBsMV9wZ2VudHJ5X3QgcHRlOwotICAgIHVuc2lnbmVkIGxvbmcgbWZuOwot ICAgIHVuc2lnbmVkIGludCBhZGRyX3NpemUgPSBpc19wdl8zMmJpdF92Y3B1KHYpID8gMzIgOiBC SVRTX1BFUl9MT05HOwotICAgIHN0cnVjdCBtbWlvX3JvX2VtdWxhdGVfY3R4dCBtbWlvX3JvX2N0 eHQgPSB7IC5jcjIgPSBhZGRyIH07Ci0gICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgY3R4dCA9 IHsKLSAgICAgICAgLnJlZ3MgPSByZWdzLAotICAgICAgICAudmVuZG9yID0gdi0+ZG9tYWluLT5h cmNoLmNwdWlkLT54ODZfdmVuZG9yLAotICAgICAgICAuYWRkcl9zaXplID0gYWRkcl9zaXplLAot ICAgICAgICAuc3Bfc2l6ZSA9IGFkZHJfc2l6ZSwKLSAgICAgICAgLnN3aW50X2VtdWxhdGUgPSB4 ODZfc3dpbnRfZW11bGF0ZV9ub25lLAotICAgICAgICAuZGF0YSA9ICZtbWlvX3JvX2N0eHQKLSAg ICB9OwotICAgIGludCByYzsKLQotICAgIC8qIEF0dGVtcHQgdG8gcmVhZCB0aGUgUFRFIHRoYXQg bWFwcyB0aGUgVkEgYmVpbmcgYWNjZXNzZWQuICovCi0gICAgZ3Vlc3RfZ2V0X2VmZl9sMWUoYWRk ciwgJnB0ZSk7Ci0KLSAgICAvKiBXZSBhcmUgbG9va2luZyBvbmx5IGZvciByZWFkLW9ubHkgbWFw cGluZ3Mgb2YgTU1JTyBwYWdlcy4gKi8KLSAgICBpZiAoICgobDFlX2dldF9mbGFncyhwdGUpICYg KF9QQUdFX1BSRVNFTlR8X1BBR0VfUlcpKSAhPSBfUEFHRV9QUkVTRU5UKSApCi0gICAgICAgIHJl dHVybiAwOwotCi0gICAgbWZuID0gbDFlX2dldF9wZm4ocHRlKTsKLSAgICBpZiAoIG1mbl92YWxp ZChfbWZuKG1mbikpICkKLSAgICB7Ci0gICAgICAgIHN0cnVjdCBwYWdlX2luZm8gKnBhZ2UgPSBt Zm5fdG9fcGFnZShtZm4pOwotICAgICAgICBzdHJ1Y3QgZG9tYWluICpvd25lciA9IHBhZ2VfZ2V0 X293bmVyX2FuZF9yZWZlcmVuY2UocGFnZSk7Ci0KLSAgICAgICAgaWYgKCBvd25lciApCi0gICAg ICAgICAgICBwdXRfcGFnZShwYWdlKTsKLSAgICAgICAgaWYgKCBvd25lciAhPSBkb21faW8gKQot ICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCAhcmFuZ2VzZXRfY29udGFp bnNfc2luZ2xldG9uKG1taW9fcm9fcmFuZ2VzLCBtZm4pICkKLSAgICAgICAgcmV0dXJuIDA7Ci0K LSAgICBpZiAoIHBjaV9yb19tbWNmZ19kZWNvZGUobWZuLCAmbW1pb19yb19jdHh0LnNlZywgJm1t aW9fcm9fY3R4dC5iZGYpICkKLSAgICAgICAgcmMgPSB4ODZfZW11bGF0ZSgmY3R4dCwgJm1tY2Zn X2ludGVyY2VwdF9vcHMpOwotICAgIGVsc2UKLSAgICAgICAgcmMgPSB4ODZfZW11bGF0ZSgmY3R4 dCwgJm1taW9fcm9fZW11bGF0ZV9vcHMpOwotCi0gICAgc3dpdGNoICggcmMgKQotICAgIHsKLSAg ICBjYXNlIFg4NkVNVUxfRVhDRVBUSU9OOgotICAgICAgICAvKgotICAgICAgICAgKiBUaGlzIGVt dWxhdGlvbiBvbmx5IGNvdmVycyB3cml0ZXMgdG8gTU1DRkcgc3BhY2Ugb3IgcmVhZC1vbmx5IE1G TnMuCi0gICAgICAgICAqIFdlIHRvbGVyYXRlICNQRiAoZnJvbSBoaXR0aW5nIGFuIGFkamFjZW50 IHBhZ2Ugb3IgYSBzdWNjZXNzZnVsCi0gICAgICAgICAqIGNvbmN1cnJlbnQgcGFnZXRhYmxlIHVw ZGF0ZSkuICBBbnl0aGluZyBlbHNlIGlzIGFuIGVtdWxhdGlvbiBidWcsCi0gICAgICAgICAqIG9y IGEgZ3Vlc3QgcGxheWluZyB3aXRoIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0gdW5kZXIgWGVuJ3Mg ZmVldC4KLSAgICAgICAgICovCi0gICAgICAgIGlmICggY3R4dC5ldmVudC50eXBlID09IFg4Nl9F VkVOVFRZUEVfSFdfRVhDRVBUSU9OICYmCi0gICAgICAgICAgICAgY3R4dC5ldmVudC52ZWN0b3Ig PT0gVFJBUF9wYWdlX2ZhdWx0ICkKLSAgICAgICAgICAgIHB2X2luamVjdF9ldmVudCgmY3R4dC5l dmVudCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdkcHJpbnRrKFhFTkxPR19XQVJOSU5H LAotICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgZXZlbnQgKHR5cGUgJXUsIHZlY3Rv ciAlI3gpIGZyb20gZW11bGF0aW9uXG4iLAotICAgICAgICAgICAgICAgICAgICAgY3R4dC5ldmVu dC50eXBlLCBjdHh0LmV2ZW50LnZlY3Rvcik7Ci0KLSAgICAgICAgLyogRmFsbHRocm91Z2ggKi8K LSAgICBjYXNlIFg4NkVNVUxfT0tBWToKLQotICAgICAgICBpZiAoIGN0eHQucmV0aXJlLnNpbmds ZXN0ZXAgKQotICAgICAgICAgICAgcHZfaW5qZWN0X2h3X2V4Y2VwdGlvbihUUkFQX2RlYnVnLCBY ODZfRVZFTlRfTk9fRUMpOwotCi0gICAgICAgIC8qIEZhbGx0aHJvdWdoICovCi0gICAgY2FzZSBY ODZFTVVMX1JFVFJZOgotICAgICAgICBwZXJmY19pbmNyKHB0d3JfZW11bGF0aW9ucyk7Ci0gICAg ICAgIHJldHVybiBFWENSRVRfZmF1bHRfZml4ZWQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19 Ci0KIHZvaWQgKmFsbG9jX3hlbl9wYWdldGFibGUodm9pZCkKIHsKICAgICBpZiAoIHN5c3RlbV9z dGF0ZSAhPSBTWVNfU1RBVEVfZWFybHlfYm9vdCApCmRpZmYgLS1naXQgYS94ZW4vYXJjaC94ODYv cHYvTWFrZWZpbGUgYi94ZW4vYXJjaC94ODYvcHYvTWFrZWZpbGUKaW5kZXggZWE5NDU5OTQzOC4u NjY1YmU1NTM2YyAxMDA2NDQKLS0tIGEveGVuL2FyY2gveDg2L3B2L01ha2VmaWxlCisrKyBiL3hl bi9hcmNoL3g4Ni9wdi9NYWtlZmlsZQpAQCAtMSwyICsxLDMgQEAKIG9iai15ICs9IGh5cGVyY2Fs bC5vCiBvYmotYmluLXkgKz0gZG9tMF9idWlsZC5pbml0Lm8KK29iai15ICs9IG1tLm8KZGlmZiAt LWdpdCBhL3hlbi9hcmNoL3g4Ni9wdi9tbS5jIGIveGVuL2FyY2gveDg2L3B2L21tLmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uZmQxNTdiOWY1OAotLS0gL2Rldi9udWxs CisrKyBiL3hlbi9hcmNoL3g4Ni9wdi9tbS5jCkBAIC0wLDAgKzEsMTkwMiBAQAorLyoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKgorICogYXJjaC94ODYvcHYvbW0uYworICoKKyAqIENvcHlyaWdodCAoYykg MjAwMi0yMDA1IEsgQSBGcmFzZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNCBDaHJpc3RpYW4gTGlt cGFjaAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz dHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAq IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFt IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50 eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0 YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IElmIG5v dCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisvKgorICogQSBk ZXNjcmlwdGlvbiBvZiB0aGUgeDg2IHBhZ2UgdGFibGUgQVBJOgorICoKKyAqIERvbWFpbnMgdHJh cCB0byBkb19tbXVfdXBkYXRlIHdpdGggYSBsaXN0IG9mIHVwZGF0ZSByZXF1ZXN0cy4KKyAqIFRo aXMgaXMgYSBsaXN0IG9mIChwdHIsIHZhbCkgcGFpcnMsIHdoZXJlIHRoZSByZXF1ZXN0ZWQgb3Bl cmF0aW9uCisgKiBpcyAqcHRyID0gdmFsLgorICoKKyAqIFJlZmVyZW5jZSBjb3VudGluZyBvZiBw YWdlczoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEVhY2ggcGFnZSBoYXMg dHdvIHJlZmNvdW50czogdG90X2NvdW50IGFuZCB0eXBlX2NvdW50LgorICoKKyAqIFRPVF9DT1VO VCBpcyB0aGUgb2J2aW91cyByZWZlcmVuY2UgY291bnQuIEl0IGNvdW50cyBhbGwgdXNlcyBvZiBh CisgKiBwaHlzaWNhbCBwYWdlIGZyYW1lIGJ5IGEgZG9tYWluLCBpbmNsdWRpbmcgdXNlcyBhcyBh IHBhZ2UgZGlyZWN0b3J5LAorICogYSBwYWdlIHRhYmxlLCBvciBzaW1wbGUgbWFwcGluZ3Mgdmlh IGEgUFRFLiBUaGlzIGNvdW50IHByZXZlbnRzIGEKKyAqIGRvbWFpbiBmcm9tIHJlbGVhc2luZyBh IGZyYW1lIGJhY2sgdG8gdGhlIGZyZWUgcG9vbCB3aGVuIGl0IHN0aWxsIGhvbGRzCisgKiBhIHJl ZmVyZW5jZSB0byBpdC4KKyAqCisgKiBUWVBFX0NPVU5UIGlzIG1vcmUgc3VidGxlLiBBIGZyYW1l IGNhbiBiZSBwdXQgdG8gb25lIG9mIHRocmVlCisgKiBtdXR1YWxseS1leGNsdXNpdmUgdXNlczog aXQgbWlnaHQgYmUgdXNlZCBhcyBhIHBhZ2UgZGlyZWN0b3J5LCBvciBhCisgKiBwYWdlIHRhYmxl LCBvciBpdCBtYXkgYmUgbWFwcGVkIHdyaXRhYmxlIGJ5IHRoZSBkb21haW4gW29mIGNvdXJzZSwg YQorICogZnJhbWUgbWF5IG5vdCBiZSB1c2VkIGluIGFueSBvZiB0aGVzZSB0aHJlZSB3YXlzIV0u CisgKiBTbywgdHlwZV9jb3VudCBpcyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgdGltZXMgYSBm cmFtZSBpcyBiZWluZworICogcmVmZXJyZWQgdG8gaW4gaXRzIGN1cnJlbnQgaW5jYXJuYXRpb24u IFRoZXJlZm9yZSwgYSBwYWdlIGNhbiBvbmx5CisgKiBjaGFuZ2UgaXRzIHR5cGUgd2hlbiBpdHMg dHlwZSBjb3VudCBpcyB6ZXJvLgorICoKKyAqIFBpbm5pbmcgdGhlIHBhZ2UgdHlwZToKKyAqIC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoZSB0eXBlIG9mIGEgcGFnZSBjYW4gYmUgcGlubmVk L3VucGlubmVkIHdpdGggdGhlIGNvbW1hbmRzCisgKiBNTVVFWFRfW1VOXVBJTl9MP19UQUJMRS4g RWFjaCBwYWdlIGNhbiBiZSBwaW5uZWQgZXhhY3RseSBvbmNlICh0aGF0IGlzLAorICogcGlubmlu ZyBpcyBub3QgcmVmZXJlbmNlIGNvdW50ZWQsIHNvIGl0IGNhbid0IGJlIG5lc3RlZCkuCisgKiBU aGlzIGlzIHVzZWZ1bCB0byBwcmV2ZW50IGEgcGFnZSdzIHR5cGUgY291bnQgZmFsbGluZyB0byB6 ZXJvLCBhdCB3aGljaAorICogcG9pbnQgc2FmZXR5IGNoZWNrcyB3b3VsZCBuZWVkIHRvIGJlIGNh cnJpZWQgb3V0IG5leHQgdGltZSB0aGUgY291bnQKKyAqIGlzIGluY3JlYXNlZCBhZ2Fpbi4KKyAq CisgKiBBIGZ1cnRoZXIgbm90ZSBvbiB3cml0YWJsZSBwYWdlIG1hcHBpbmdzOgorICogLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZvciBzaW1wbGljaXR5LCB0 aGUgY291bnQgb2Ygd3JpdGFibGUgbWFwcGluZ3MgZm9yIGEgcGFnZSBtYXkgbm90CisgKiBjb3Jy ZXNwb25kIHRvIHJlYWxpdHkuIFRoZSAnd3JpdGFibGUgY291bnQnIGlzIGluY3JlbWVudGVkIGZv ciBldmVyeQorICogUFRFIHdoaWNoIG1hcHMgdGhlIHBhZ2Ugd2l0aCB0aGUgX1BBR0VfUlcgZmxh ZyBzZXQuIEhvd2V2ZXIsIGZvcgorICogd3JpdGUgYWNjZXNzIHRvIGJlIHBvc3NpYmxlIHRoZSBw YWdlIGRpcmVjdG9yeSBlbnRyeSBtdXN0IGFsc28gaGF2ZQorICogaXRzIF9QQUdFX1JXIGJpdCBz ZXQuIFdlIGRvIG5vdCBjaGVjayB0aGlzIGFzIGl0IGNvbXBsaWNhdGVzIHRoZQorICogcmVmZXJl bmNlIGNvdW50aW5nIGNvbnNpZGVyYWJseSBbY29uc2lkZXIgdGhlIGNhc2Ugb2YgbXVsdGlwbGUK KyAqIGRpcmVjdG9yeSBlbnRyaWVzIHJlZmVyZW5jaW5nIGEgc2luZ2xlIHBhZ2UgdGFibGUsIHNv bWUgd2l0aCB0aGUgUlcKKyAqIGJpdCBzZXQsIG90aGVycyBub3QgLS0gaXQgc3RhcnRzIGdldHRp bmcgYSBiaXQgbWVzc3ldLgorICogSW4gbm9ybWFsIHVzZSwgdGhpcyBzaW1wbGlmaWNhdGlvbiBz aG91bGRuJ3QgYmUgYSBwcm9ibGVtLgorICogSG93ZXZlciwgdGhlIGxvZ2ljIGNhbiBiZSBhZGRl ZCBpZiByZXF1aXJlZC4KKyAqCisgKiBPbmUgbW9yZSBub3RlIG9uIHJlYWQtb25seSBwYWdlIG1h cHBpbmdzOgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAq IFdlIHdhbnQgZG9tYWlucyB0byBiZSBhYmxlIHRvIG1hcCBwYWdlcyBmb3IgcmVhZC1vbmx5IGFj Y2Vzcy4gVGhlCisgKiBtYWluIHJlYXNvbiBpcyB0aGF0IHBhZ2UgdGFibGVzIGFuZCBkaXJlY3Rv cmllcyBzaG91bGQgYmUgcmVhZGFibGUKKyAqIGJ5IGEgZG9tYWluLCBidXQgaXQgd291bGQgbm90 IGJlIHNhZmUgZm9yIHRoZW0gdG8gYmUgd3JpdGFibGUuCisgKiBIb3dldmVyLCBkb21haW5zIGhh dmUgZnJlZSBhY2Nlc3MgdG8gcmluZ3MgMSAmIDIgb2YgdGhlIEludGVsCisgKiBwcml2aWxlZ2Ug bW9kZWwuIEluIHRlcm1zIG9mIHBhZ2UgcHJvdGVjdGlvbiwgdGhlc2UgYXJlIGNvbnNpZGVyZWQK KyAqIHRvIGJlIHBhcnQgb2YgJ3N1cGVydmlzb3IgbW9kZScuIFRoZSBXUCBiaXQgaW4gQ1IwIGNv bnRyb2xzIHdoZXRoZXIKKyAqIHJlYWQtb25seSByZXN0cmljdGlvbnMgYXJlIHJlc3BlY3RlZCBp biBzdXBlcnZpc29yIG1vZGUgLS0gaWYgdGhlCisgKiBiaXQgaXMgY2xlYXIgdGhlbiBhbnkgbWFw cGVkIHBhZ2UgaXMgd3JpdGFibGUuCisgKgorICogV2UgZ2V0IHJvdW5kIHRoaXMgYnkgYWx3YXlz IHNldHRpbmcgdGhlIFdQIGJpdCBhbmQgZGlzYWxsb3dpbmcKKyAqIHVwZGF0ZXMgdG8gaXQuIFRo aXMgaXMgdmVyeSB1bmxpa2VseSB0byBjYXVzZSBhIHByb2JsZW0gZm9yIGd1ZXN0CisgKiBPUydz LCB3aGljaCB3aWxsIGdlbmVyYWxseSB1c2UgdGhlIFdQIGJpdCB0byBzaW1wbGlmeSBjb3B5LW9u LXdyaXRlCisgKiBpbXBsZW1lbnRhdGlvbiAoaW4gdGhhdCBjYXNlLCBPUyB3YW50cyBhIGZhdWx0 IHdoZW4gaXQgd3JpdGVzIHRvCisgKiBhbiBhcHBsaWNhdGlvbi1zdXBwbGllZCBidWZmZXIpLgor ICovCisKKyNpbmNsdWRlIDx4ZW4vZXZlbnQuaD4KKyNpbmNsdWRlIDx4ZW4vZ3Vlc3RfYWNjZXNz Lmg+CisjaW5jbHVkZSA8eGVuL2h5cGVyY2FsbC5oPgorI2luY2x1ZGUgPHhlbi9tbS5oPgorI2lu Y2x1ZGUgPHhlbi9zY2hlZC5oPgorI2luY2x1ZGUgPHhlbi90cmFjZS5oPgorI2luY2x1ZGUgPHhz bS94c20uaD4KKworI2luY2x1ZGUgPGFzbS9wMm0uaD4KKyNpbmNsdWRlIDxhc20vcGFnaW5nLmg+ CisjaW5jbHVkZSA8YXNtL3g4Nl9lbXVsYXRlLmg+CisKKy8qCisgKiBQVEUgdXBkYXRlcyBjYW4g YmUgZG9uZSB3aXRoIG9yZGluYXJ5IHdyaXRlcyBleGNlcHQ6CisgKiAgMS4gRGVidWcgYnVpbGRz IGdldCBleHRyYSBjaGVja2luZyBieSB1c2luZyBDTVBYQ0hHWzhCXS4KKyAqLworI2lmICFkZWZp bmVkKE5ERUJVRykKKyNkZWZpbmUgUFRFX1VQREFURV9XSVRIX0NNUFhDSEcKKyNlbmRpZgorCisv KiBIb3cgdG8gd3JpdGUgYW4gZW50cnkgdG8gdGhlIGd1ZXN0IHBhZ2V0YWJsZXMuCisgKiBSZXR1 cm5zIDAgZm9yIGZhaWx1cmUgKHBvaW50ZXIgbm90IHZhbGlkKSwgMSBmb3Igc3VjY2Vzcy4gKi8K K3N0YXRpYyBpbmxpbmUgaW50IHVwZGF0ZV9pbnRwdGUoaW50cHRlX3QgKnAsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGludHB0ZV90IG9sZCwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgaW50cHRlX3QgbmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB1bnNpZ25lZCBsb25nIG1mbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ry dWN0IHZjcHUgKnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVzZXJ2 ZV9hZCkKK3sKKyAgICBpbnQgcnYgPSAxOworI2lmbmRlZiBQVEVfVVBEQVRFX1dJVEhfQ01QWENI RworICAgIGlmICggIXByZXNlcnZlX2FkICkKKyAgICB7CisgICAgICAgIHJ2ID0gcGFnaW5nX3dy aXRlX2d1ZXN0X2VudHJ5KHYsIHAsIG5ldywgX21mbihtZm4pKTsKKyAgICB9CisgICAgZWxzZQor I2VuZGlmCisgICAgeworICAgICAgICBpbnRwdGVfdCB0ID0gb2xkOworICAgICAgICBmb3IgKCA7 IDsgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnRwdGVfdCBfbmV3ID0gbmV3OworICAgICAg ICAgICAgaWYgKCBwcmVzZXJ2ZV9hZCApCisgICAgICAgICAgICAgICAgX25ldyB8PSBvbGQgJiAo X1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9ESVJUWSk7CisKKyAgICAgICAgICAgIHJ2ID0gcGFnaW5n X2NtcHhjaGdfZ3Vlc3RfZW50cnkodiwgcCwgJnQsIF9uZXcsIF9tZm4obWZuKSk7CisgICAgICAg ICAgICBpZiAoIHVubGlrZWx5KHJ2ID09IDApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAg ICAgICBNRU1fTE9HKCJGYWlsZWQgdG8gdXBkYXRlICUiIFBSSXB0ZSAiIC0+ICUiIFBSSXB0ZQor ICAgICAgICAgICAgICAgICAgICAgICAgIjogc2F3ICUiIFBSSXB0ZSwgb2xkLCBfbmV3LCB0KTsK KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYg KCB0ID09IG9sZCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIEFs bG93ZWQgdG8gY2hhbmdlIGluIEFjY2Vzc2VkL0RpcnR5IGZsYWdzIG9ubHkuICovCisgICAgICAg ICAgICBCVUdfT04oKHQgXiBvbGQpICYgfihpbnRwdGVfdCkoX1BBR0VfQUNDRVNTRUR8X1BBR0Vf RElSVFkpKTsKKworICAgICAgICAgICAgb2xkID0gdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBy ZXR1cm4gcnY7Cit9CisKKy8qIE1hY3JvIHRoYXQgd3JhcHMgdGhlIGFwcHJvcHJpYXRlIHR5cGUt Y2hhbmdlcyBhcm91bmQgdXBkYXRlX2ludHB0ZSgpLgorICogQXJndW1lbnRzIGFyZTogdHlwZSwg cHRyLCBvbGQsIG5ldywgbWZuLCB2Y3B1ICovCisjZGVmaW5lIFVQREFURV9FTlRSWShfdCxfcCxf byxfbixfbSxfdixfYWQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1cGRhdGVfaW50 cHRlKCZfdCAjIyBlX2dldF9pbnRwdGUoKihfcCkpLCAgICAgICAgICAgICAgICAgICAgICAgXAor ICAgICAgICAgICAgICAgICAgX3QgIyMgZV9nZXRfaW50cHRlKF9vKSwgX3QgIyMgZV9nZXRfaW50 cHRlKF9uKSwgICBcCisgICAgICAgICAgICAgICAgICAoX20pLCAoX3YpLCAoX2FkKSkKKworLyoK KyAqIFBURSBmbGFncyB0aGF0IGEgZ3Vlc3QgbWF5IGNoYW5nZSB3aXRob3V0IHJlLXZhbGlkYXRp bmcgdGhlIFBURS4KKyAqIEFsbCBvdGhlciBiaXRzIGFmZmVjdCB0cmFuc2xhdGlvbiwgY2FjaGlu Zywgb3IgWGVuJ3Mgc2FmZXR5LgorICovCisjZGVmaW5lIEZBU1RQQVRIX0ZMQUdfV0hJVEVMSVNU ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX1BBR0VfTlhfQklU IHwgX1BBR0VfQVZBSUxfSElHSCB8IF9QQUdFX0FWQUlMIHwgX1BBR0VfR0xPQkFMIHwgXAorICAg ICBfUEFHRV9ESVJUWSB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfVVNFUikKKworLyogVXBkYXRl IHRoZSBMMSBlbnRyeSBhdCBwbDFlIHRvIG5ldyB2YWx1ZSBubDFlLiAqLworc3RhdGljIGludCBt b2RfbDFfZW50cnkobDFfcGdlbnRyeV90ICpwbDFlLCBsMV9wZ2VudHJ5X3QgbmwxZSwKKyAgICAg ICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZ2wxbWZuLCBpbnQgcHJlc2VydmVfYWQs CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmNwdSAqcHRfdmNwdSwgc3RydWN0IGRv bWFpbiAqcGdfZG9tKQoreworICAgIGwxX3BnZW50cnlfdCBvbDFlOworICAgIHN0cnVjdCBkb21h aW4gKnB0X2RvbSA9IHB0X3ZjcHUtPmRvbWFpbjsKKyAgICBpbnQgcmMgPSAwOworCisgICAgaWYg KCB1bmxpa2VseShfX2NvcHlfZnJvbV91c2VyKCZvbDFlLCBwbDFlLCBzaXplb2Yob2wxZSkpICE9 IDApICkKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICBpZiAoIHVubGlrZWx5KHBhZ2lu Z19tb2RlX3JlZmNvdW50cyhwdF9kb20pKSApCisgICAgeworICAgICAgICBpZiAoIFVQREFURV9F TlRSWShsMSwgcGwxZSwgb2wxZSwgbmwxZSwgZ2wxbWZuLCBwdF92Y3B1LCBwcmVzZXJ2ZV9hZCkg KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgfQor CisgICAgaWYgKCBsMWVfZ2V0X2ZsYWdzKG5sMWUpICYgX1BBR0VfUFJFU0VOVCApCisgICAgewor ICAgICAgICAvKiBUcmFuc2xhdGUgZm9yZWlnbiBndWVzdCBhZGRyZXNzZXMuICovCisgICAgICAg IHN0cnVjdCBwYWdlX2luZm8gKnBhZ2UgPSBOVUxMOworCisgICAgICAgIGlmICggdW5saWtlbHko bDFlX2dldF9mbGFncyhubDFlKSAmIGwxX2Rpc2FsbG93X21hc2socHRfZG9tKSkgKQorICAgICAg ICB7CisgICAgICAgICAgICBNRU1fTE9HKCJCYWQgTDEgZmxhZ3MgJXgiLAorICAgICAgICAgICAg ICAgICAgICBsMWVfZ2V0X2ZsYWdzKG5sMWUpICYgbDFfZGlzYWxsb3dfbWFzayhwdF9kb20pKTsK KyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBw YWdpbmdfbW9kZV90cmFuc2xhdGUocGdfZG9tKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBh Z2UgPSBnZXRfcGFnZV9mcm9tX2dmbihwZ19kb20sIGwxZV9nZXRfcGZuKG5sMWUpLCBOVUxMLCBQ Mk1fQUxMT0MpOworICAgICAgICAgICAgaWYgKCAhcGFnZSApCisgICAgICAgICAgICAgICAgcmV0 dXJuIC1FSU5WQUw7CisgICAgICAgICAgICBubDFlID0gbDFlX2Zyb21fcGZuKHBhZ2VfdG9fbWZu KHBhZ2UpLCBsMWVfZ2V0X2ZsYWdzKG5sMWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEZh c3QgcGF0aCBmb3Igc3VmZmljaWVudGx5LXNpbWlsYXIgbWFwcGluZ3MuICovCisgICAgICAgIGlm ICggIWwxZV9oYXNfY2hhbmdlZChvbDFlLCBubDFlLCB+RkFTVFBBVEhfRkxBR19XSElURUxJU1Qp ICkKKyAgICAgICAgeworICAgICAgICAgICAgYWRqdXN0X2d1ZXN0X2wxZShubDFlLCBwdF9kb20p OworICAgICAgICAgICAgcmMgPSBVUERBVEVfRU5UUlkobDEsIHBsMWUsIG9sMWUsIG5sMWUsIGds MW1mbiwgcHRfdmNwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlX2Fk KTsKKyAgICAgICAgICAgIGlmICggcGFnZSApCisgICAgICAgICAgICAgICAgcHV0X3BhZ2UocGFn ZSk7CisgICAgICAgICAgICByZXR1cm4gcmMgPyAwIDogLUVCVVNZOworICAgICAgICB9CisKKyAg ICAgICAgc3dpdGNoICggcmMgPSBnZXRfcGFnZV9mcm9tX2wxZShubDFlLCBwdF9kb20sIHBnX2Rv bSkgKQorICAgICAgICB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoIHBhZ2Ug KQorICAgICAgICAgICAgICAgIHB1dF9wYWdlKHBhZ2UpOworICAgICAgICAgICAgcmV0dXJuIHJj OworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBfUEFH RV9SVyAuLi4gX1BBR0VfUlcgfCBQQUdFX0NBQ0hFX0FUVFJTOgorICAgICAgICAgICAgQVNTRVJU KCEocmMgJiB+KF9QQUdFX1JXIHwgUEFHRV9DQUNIRV9BVFRSUykpKTsKKyAgICAgICAgICAgIGwx ZV9mbGlwX2ZsYWdzKG5sMWUsIHJjKTsKKyAgICAgICAgICAgIHJjID0gMDsKKyAgICAgICAgICAg IGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICggcGFnZSApCisgICAgICAgICAgICBwdXRf cGFnZShwYWdlKTsKKworICAgICAgICBhZGp1c3RfZ3Vlc3RfbDFlKG5sMWUsIHB0X2RvbSk7Cisg ICAgICAgIGlmICggdW5saWtlbHkoIVVQREFURV9FTlRSWShsMSwgcGwxZSwgb2wxZSwgbmwxZSwg Z2wxbWZuLCBwdF92Y3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJl c2VydmVfYWQpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9sMWUgPSBubDFlOworICAgICAg ICAgICAgcmMgPSAtRUJVU1k7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHVubGlr ZWx5KCFVUERBVEVfRU5UUlkobDEsIHBsMWUsIG9sMWUsIG5sMWUsIGdsMW1mbiwgcHRfdmNwdSwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZV9hZCkpICkKKyAg ICB7CisgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgfQorCisgICAgcHV0X3BhZ2VfZnJvbV9s MWUob2wxZSwgcHRfZG9tKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKworLyogVXBkYXRlIHRoZSBM MiBlbnRyeSBhdCBwbDJlIHRvIG5ldyB2YWx1ZSBubDJlLiBwbDJlIGlzIHdpdGhpbiBmcmFtZSBw Zm4uICovCitzdGF0aWMgaW50IG1vZF9sMl9lbnRyeShsMl9wZ2VudHJ5X3QgKnBsMmUsCisgICAg ICAgICAgICAgICAgICAgICAgICBsMl9wZ2VudHJ5X3QgbmwyZSwKKyAgICAgICAgICAgICAgICAg ICAgICAgIHVuc2lnbmVkIGxvbmcgcGZuLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBy ZXNlcnZlX2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZjcHUgKnZjcHUpCit7 CisgICAgbDJfcGdlbnRyeV90IG9sMmU7CisgICAgc3RydWN0IGRvbWFpbiAqZCA9IHZjcHUtPmRv bWFpbjsKKyAgICBzdHJ1Y3QgcGFnZV9pbmZvICpsMnBnID0gbWZuX3RvX3BhZ2UocGZuKTsKKyAg ICB1bnNpZ25lZCBsb25nIHR5cGUgPSBsMnBnLT51LmludXNlLnR5cGVfaW5mbzsKKyAgICBpbnQg cmMgPSAwOworCisgICAgaWYgKCB1bmxpa2VseSghaXNfZ3Vlc3RfbDJfc2xvdChkLCB0eXBlLCBw Z2VudHJ5X3B0cl90b19zbG90KHBsMmUpKSkgKQorICAgIHsKKyAgICAgICAgTUVNX0xPRygiSWxs ZWdhbCBMMiB1cGRhdGUgYXR0ZW1wdCBpbiBYZW4tcHJpdmF0ZSBhcmVhICVwIiwgcGwyZSk7Cisg ICAgICAgIHJldHVybiAtRVBFUk07CisgICAgfQorCisgICAgaWYgKCB1bmxpa2VseShfX2NvcHlf ZnJvbV91c2VyKCZvbDJlLCBwbDJlLCBzaXplb2Yob2wyZSkpICE9IDApICkKKyAgICAgICAgcmV0 dXJuIC1FRkFVTFQ7CisKKyAgICBpZiAoIGwyZV9nZXRfZmxhZ3MobmwyZSkgJiBfUEFHRV9QUkVT RU5UICkKKyAgICB7CisgICAgICAgIGlmICggdW5saWtlbHkobDJlX2dldF9mbGFncyhubDJlKSAm IEwyX0RJU0FMTE9XX01BU0spICkKKyAgICAgICAgeworICAgICAgICAgICAgTUVNX0xPRygiQmFk IEwyIGZsYWdzICV4IiwKKyAgICAgICAgICAgICAgICAgICAgbDJlX2dldF9mbGFncyhubDJlKSAm IEwyX0RJU0FMTE9XX01BU0spOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAg IH0KKworICAgICAgICAvKiBGYXN0IHBhdGggZm9yIHN1ZmZpY2llbnRseS1zaW1pbGFyIG1hcHBp bmdzLiAqLworICAgICAgICBpZiAoICFsMmVfaGFzX2NoYW5nZWQob2wyZSwgbmwyZSwgfkZBU1RQ QVRIX0ZMQUdfV0hJVEVMSVNUKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkanVzdF9ndWVz dF9sMmUobmwyZSwgZCk7CisgICAgICAgICAgICBpZiAoIFVQREFURV9FTlRSWShsMiwgcGwyZSwg b2wyZSwgbmwyZSwgcGZuLCB2Y3B1LCBwcmVzZXJ2ZV9hZCkgKQorICAgICAgICAgICAgICAgIHJl dHVybiAwOworICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorCisgICAgICAg IGlmICggdW5saWtlbHkoKHJjID0gZ2V0X3BhZ2VfZnJvbV9sMmUobmwyZSwgcGZuLCBkKSkgPCAw KSApCisgICAgICAgICAgICByZXR1cm4gcmM7CisKKyAgICAgICAgYWRqdXN0X2d1ZXN0X2wyZShu bDJlLCBkKTsKKyAgICAgICAgaWYgKCB1bmxpa2VseSghVVBEQVRFX0VOVFJZKGwyLCBwbDJlLCBv bDJlLCBubDJlLCBwZm4sIHZjcHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBwcmVzZXJ2ZV9hZCkpICkKKyAgICAgICAgeworICAgICAgICAgICAgb2wyZSA9IG5sMmU7Cisg ICAgICAgICAgICByYyA9IC1FQlVTWTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgg dW5saWtlbHkoIVVQREFURV9FTlRSWShsMiwgcGwyZSwgb2wyZSwgbmwyZSwgcGZuLCB2Y3B1LAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlX2FkKSkgKQorICAg IHsKKyAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisKKyAgICBwdXRfcGFnZV9mcm9tX2wy ZShvbDJlLCBwZm4pOworICAgIHJldHVybiByYzsKK30KKworLyogVXBkYXRlIHRoZSBMMyBlbnRy eSBhdCBwbDNlIHRvIG5ldyB2YWx1ZSBubDNlLiBwbDNlIGlzIHdpdGhpbiBmcmFtZSBwZm4uICov CitzdGF0aWMgaW50IG1vZF9sM19lbnRyeShsM19wZ2VudHJ5X3QgKnBsM2UsCisgICAgICAgICAg ICAgICAgICAgICAgICBsM19wZ2VudHJ5X3QgbmwzZSwKKyAgICAgICAgICAgICAgICAgICAgICAg IHVuc2lnbmVkIGxvbmcgcGZuLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXNlcnZl X2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHZjcHUgKnZjcHUpCit7CisgICAg bDNfcGdlbnRyeV90IG9sM2U7CisgICAgc3RydWN0IGRvbWFpbiAqZCA9IHZjcHUtPmRvbWFpbjsK KyAgICBpbnQgcmMgPSAwOworCisgICAgaWYgKCB1bmxpa2VseSghaXNfZ3Vlc3RfbDNfc2xvdChw Z2VudHJ5X3B0cl90b19zbG90KHBsM2UpKSkgKQorICAgIHsKKyAgICAgICAgTUVNX0xPRygiSWxs ZWdhbCBMMyB1cGRhdGUgYXR0ZW1wdCBpbiBYZW4tcHJpdmF0ZSBhcmVhICVwIiwgcGwzZSk7Cisg ICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8qCisgICAgICogRGlzYWxsb3cg dXBkYXRlcyB0byBmaW5hbCBMMyBzbG90LiBJdCBjb250YWlucyBYZW4gbWFwcGluZ3MsIGFuZCBp dAorICAgICAqIHdvdWxkIGJlIGEgcGFpbiB0byBlbnN1cmUgdGhleSByZW1haW4gY29udGludW91 c2x5IHZhbGlkIHRocm91Z2hvdXQuCisgICAgICovCisgICAgaWYgKCBpc19wdl8zMmJpdF9kb21h aW4oZCkgJiYgKHBnZW50cnlfcHRyX3RvX3Nsb3QocGwzZSkgPj0gMykgKQorICAgICAgICByZXR1 cm4gLUVJTlZBTDsKKworICAgIGlmICggdW5saWtlbHkoX19jb3B5X2Zyb21fdXNlcigmb2wzZSwg cGwzZSwgc2l6ZW9mKG9sM2UpKSAhPSAwKSApCisgICAgICAgIHJldHVybiAtRUZBVUxUOworCisg ICAgaWYgKCBsM2VfZ2V0X2ZsYWdzKG5sM2UpICYgX1BBR0VfUFJFU0VOVCApCisgICAgeworICAg ICAgICBpZiAoIHVubGlrZWx5KGwzZV9nZXRfZmxhZ3MobmwzZSkgJiBsM19kaXNhbGxvd19tYXNr KGQpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIE1FTV9MT0coIkJhZCBMMyBmbGFncyAleCIs CisgICAgICAgICAgICAgICAgICAgIGwzZV9nZXRfZmxhZ3MobmwzZSkgJiBsM19kaXNhbGxvd19t YXNrKGQpKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAg ICAgLyogRmFzdCBwYXRoIGZvciBzdWZmaWNpZW50bHktc2ltaWxhciBtYXBwaW5ncy4gKi8KKyAg ICAgICAgaWYgKCAhbDNlX2hhc19jaGFuZ2VkKG9sM2UsIG5sM2UsIH5GQVNUUEFUSF9GTEFHX1dI SVRFTElTVCkgKQorICAgICAgICB7CisgICAgICAgICAgICBhZGp1c3RfZ3Vlc3RfbDNlKG5sM2Us IGQpOworICAgICAgICAgICAgcmMgPSBVUERBVEVfRU5UUlkobDMsIHBsM2UsIG9sM2UsIG5sM2Us IHBmbiwgdmNwdSwgcHJlc2VydmVfYWQpOworICAgICAgICAgICAgcmV0dXJuIHJjID8gMCA6IC1F RkFVTFQ7CisgICAgICAgIH0KKworICAgICAgICByYyA9IGdldF9wYWdlX2Zyb21fbDNlKG5sM2Us IHBmbiwgZCwgMCk7CisgICAgICAgIGlmICggdW5saWtlbHkocmMgPCAwKSApCisgICAgICAgICAg ICByZXR1cm4gcmM7CisgICAgICAgIHJjID0gMDsKKworICAgICAgICBhZGp1c3RfZ3Vlc3RfbDNl KG5sM2UsIGQpOworICAgICAgICBpZiAoIHVubGlrZWx5KCFVUERBVEVfRU5UUlkobDMsIHBsM2Us IG9sM2UsIG5sM2UsIHBmbiwgdmNwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHByZXNlcnZlX2FkKSkgKQorICAgICAgICB7CisgICAgICAgICAgICBvbDNlID0gbmwzZTsK KyAgICAgICAgICAgIHJjID0gLUVGQVVMVDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlm ICggdW5saWtlbHkoIVVQREFURV9FTlRSWShsMywgcGwzZSwgb2wzZSwgbmwzZSwgcGZuLCB2Y3B1 LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlX2FkKSkgKQor ICAgIHsKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgfQorCisgICAgaWYgKCBsaWtlbHko cmMgPT0gMCkgKQorICAgICAgICBpZiAoICFjcmVhdGVfcGFlX3hlbl9tYXBwaW5ncyhkLCBwbDNl KSApCisgICAgICAgICAgICBCVUcoKTsKKworICAgIHB1dF9wYWdlX2Zyb21fbDNlKG9sM2UsIHBm biwgMCwgMSk7CisgICAgcmV0dXJuIHJjOworfQorCisvKiBVcGRhdGUgdGhlIEw0IGVudHJ5IGF0 IHBsNGUgdG8gbmV3IHZhbHVlIG5sNGUuIHBsNGUgaXMgd2l0aGluIGZyYW1lIHBmbi4gKi8KK3N0 YXRpYyBpbnQgbW9kX2w0X2VudHJ5KGw0X3BnZW50cnlfdCAqcGw0ZSwKKyAgICAgICAgICAgICAg ICAgICAgICAgIGw0X3BnZW50cnlfdCBubDRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5z aWduZWQgbG9uZyBwZm4sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlc2VydmVfYWQs CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmNwdSAqdmNwdSkKK3sKKyAgICBzdHJ1 Y3QgZG9tYWluICpkID0gdmNwdS0+ZG9tYWluOworICAgIGw0X3BnZW50cnlfdCBvbDRlOworICAg IGludCByYyA9IDA7CisKKyAgICBpZiAoIHVubGlrZWx5KCFpc19ndWVzdF9sNF9zbG90KGQsIHBn ZW50cnlfcHRyX3RvX3Nsb3QocGw0ZSkpKSApCisgICAgeworICAgICAgICBNRU1fTE9HKCJJbGxl Z2FsIEw0IHVwZGF0ZSBhdHRlbXB0IGluIFhlbi1wcml2YXRlIGFyZWEgJXAiLCBwbDRlKTsKKyAg ICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaWYgKCB1bmxpa2VseShfX2NvcHlf ZnJvbV91c2VyKCZvbDRlLCBwbDRlLCBzaXplb2Yob2w0ZSkpICE9IDApICkKKyAgICAgICAgcmV0 dXJuIC1FRkFVTFQ7CisKKyAgICBpZiAoIGw0ZV9nZXRfZmxhZ3Mobmw0ZSkgJiBfUEFHRV9QUkVT RU5UICkKKyAgICB7CisgICAgICAgIGlmICggdW5saWtlbHkobDRlX2dldF9mbGFncyhubDRlKSAm IEw0X0RJU0FMTE9XX01BU0spICkKKyAgICAgICAgeworICAgICAgICAgICAgTUVNX0xPRygiQmFk IEw0IGZsYWdzICV4IiwKKyAgICAgICAgICAgICAgICAgICAgbDRlX2dldF9mbGFncyhubDRlKSAm IEw0X0RJU0FMTE9XX01BU0spOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAg IH0KKworICAgICAgICAvKiBGYXN0IHBhdGggZm9yIHN1ZmZpY2llbnRseS1zaW1pbGFyIG1hcHBp bmdzLiAqLworICAgICAgICBpZiAoICFsNGVfaGFzX2NoYW5nZWQob2w0ZSwgbmw0ZSwgfkZBU1RQ QVRIX0ZMQUdfV0hJVEVMSVNUKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkanVzdF9ndWVz dF9sNGUobmw0ZSwgZCk7CisgICAgICAgICAgICByYyA9IFVQREFURV9FTlRSWShsNCwgcGw0ZSwg b2w0ZSwgbmw0ZSwgcGZuLCB2Y3B1LCBwcmVzZXJ2ZV9hZCk7CisgICAgICAgICAgICByZXR1cm4g cmMgPyAwIDogLUVGQVVMVDsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gZ2V0X3BhZ2VfZnJv bV9sNGUobmw0ZSwgcGZuLCBkLCAwKTsKKyAgICAgICAgaWYgKCB1bmxpa2VseShyYyA8IDApICkK KyAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgcmMgPSAwOworCisgICAgICAgIGFkanVz dF9ndWVzdF9sNGUobmw0ZSwgZCk7CisgICAgICAgIGlmICggdW5saWtlbHkoIVVQREFURV9FTlRS WShsNCwgcGw0ZSwgb2w0ZSwgbmw0ZSwgcGZuLCB2Y3B1LAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcHJlc2VydmVfYWQpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9s NGUgPSBubDRlOworICAgICAgICAgICAgcmMgPSAtRUZBVUxUOworICAgICAgICB9CisgICAgfQor ICAgIGVsc2UgaWYgKCB1bmxpa2VseSghVVBEQVRFX0VOVFJZKGw0LCBwbDRlLCBvbDRlLCBubDRl LCBwZm4sIHZjcHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2Vy dmVfYWQpKSApCisgICAgeworICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICB9CisKKyAgICBw dXRfcGFnZV9mcm9tX2w0ZShvbDRlLCBwZm4sIDAsIDEpOworICAgIHJldHVybiByYzsKK30KKwor LyogR2V0IGEgbWFwcGluZyBvZiBhIFBWIGd1ZXN0J3MgbDFlIGZvciB0aGlzIHZpcnR1YWwgYWRk cmVzcy4gKi8KK3N0YXRpYyBsMV9wZ2VudHJ5X3QgKmd1ZXN0X21hcF9sMWUodW5zaWduZWQgbG9u ZyBhZGRyLCB1bnNpZ25lZCBsb25nICpnbDFtZm4pCit7CisgICAgbDJfcGdlbnRyeV90IGwyZTsK KworICAgIEFTU0VSVCghcGFnaW5nX21vZGVfdHJhbnNsYXRlKGN1cnJlbnQtPmRvbWFpbikpOwor ICAgIEFTU0VSVCghcGFnaW5nX21vZGVfZXh0ZXJuYWwoY3VycmVudC0+ZG9tYWluKSk7CisKKyAg ICBpZiAoIHVubGlrZWx5KCFfX2FkZHJfb2soYWRkcikpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7 CisKKyAgICAvKiBGaW5kIHRoaXMgbDFlIGFuZCBpdHMgZW5jbG9zaW5nIGwxbWZuIGluIHRoZSBs aW5lYXIgbWFwLiAqLworICAgIGlmICggX19jb3B5X2Zyb21fdXNlcigmbDJlLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAmX19saW5lYXJfbDJfdGFibGVbbDJfbGluZWFyX29mZnNldChhZGRy KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsMl9wZ2VudHJ5X3QpKSApCisg ICAgICAgIHJldHVybiBOVUxMOworCisgICAgLyogQ2hlY2sgZmxhZ3MgdGhhdCBpdCB3aWxsIGJl IHNhZmUgdG8gcmVhZCB0aGUgbDFlLiAqLworICAgIGlmICggKGwyZV9nZXRfZmxhZ3MobDJlKSAm IChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUFNFKSkgIT0gX1BBR0VfUFJFU0VOVCApCisgICAgICAg IHJldHVybiBOVUxMOworCisgICAgKmdsMW1mbiA9IGwyZV9nZXRfcGZuKGwyZSk7CisKKyAgICBy ZXR1cm4gKGwxX3BnZW50cnlfdCAqKW1hcF9kb21haW5fcGFnZShfbWZuKCpnbDFtZm4pKSArCisg ICAgICAgICAgIGwxX3RhYmxlX29mZnNldChhZGRyKTsKK30KKworLyogUHVsbCBkb3duIHRoZSBt YXBwaW5nIHdlIGdvdCBmcm9tIGd1ZXN0X21hcF9sMWUoKS4gKi8KK3N0YXRpYyBpbmxpbmUgdm9p ZCBndWVzdF91bm1hcF9sMWUodm9pZCAqcCkKK3sKKyAgICB1bm1hcF9kb21haW5fcGFnZShwKTsK K30KKworc3RhdGljIGludCBjcmVhdGVfZ3JhbnRfdmFfbWFwcGluZygKKyAgICB1bnNpZ25lZCBs b25nIHZhLCBsMV9wZ2VudHJ5X3QgbmwxZSwgc3RydWN0IHZjcHUgKnYpCit7CisgICAgbDFfcGdl bnRyeV90ICpwbDFlLCBvbDFlOworICAgIHN0cnVjdCBkb21haW4gKmQgPSB2LT5kb21haW47Cisg ICAgdW5zaWduZWQgbG9uZyBnbDFtZm47CisgICAgc3RydWN0IHBhZ2VfaW5mbyAqbDFwZzsKKyAg ICBpbnQgb2theTsKKworICAgIGFkanVzdF9ndWVzdF9sMWUobmwxZSwgZCk7CisKKyAgICBwbDFl ID0gZ3Vlc3RfbWFwX2wxZSh2YSwgJmdsMW1mbik7CisgICAgaWYgKCAhcGwxZSApCisgICAgewor ICAgICAgICBNRU1fTE9HKCJDb3VsZCBub3QgZmluZCBMMSBQVEUgZm9yIGFkZHJlc3MgJWx4Iiwg dmEpOworICAgICAgICByZXR1cm4gR05UU1RfZ2VuZXJhbF9lcnJvcjsKKyAgICB9CisKKyAgICBp ZiAoICFnZXRfcGFnZV9mcm9tX3BhZ2VucihnbDFtZm4sIGN1cnJlbnQtPmRvbWFpbikgKQorICAg IHsKKyAgICAgICAgZ3Vlc3RfdW5tYXBfbDFlKHBsMWUpOworICAgICAgICByZXR1cm4gR05UU1Rf Z2VuZXJhbF9lcnJvcjsKKyAgICB9CisKKyAgICBsMXBnID0gbWZuX3RvX3BhZ2UoZ2wxbWZuKTsK KyAgICBpZiAoICFwYWdlX2xvY2sobDFwZykgKQorICAgIHsKKyAgICAgICAgcHV0X3BhZ2UobDFw Zyk7CisgICAgICAgIGd1ZXN0X3VubWFwX2wxZShwbDFlKTsKKyAgICAgICAgcmV0dXJuIEdOVFNU X2dlbmVyYWxfZXJyb3I7CisgICAgfQorCisgICAgaWYgKCAobDFwZy0+dS5pbnVzZS50eXBlX2lu Zm8gJiBQR1RfdHlwZV9tYXNrKSAhPSBQR1RfbDFfcGFnZV90YWJsZSApCisgICAgeworICAgICAg ICBwYWdlX3VubG9jayhsMXBnKTsKKyAgICAgICAgcHV0X3BhZ2UobDFwZyk7CisgICAgICAgIGd1 ZXN0X3VubWFwX2wxZShwbDFlKTsKKyAgICAgICAgcmV0dXJuIEdOVFNUX2dlbmVyYWxfZXJyb3I7 CisgICAgfQorCisgICAgb2wxZSA9ICpwbDFlOworICAgIG9rYXkgPSBVUERBVEVfRU5UUlkobDEs IHBsMWUsIG9sMWUsIG5sMWUsIGdsMW1mbiwgdiwgMCk7CisKKyAgICBwYWdlX3VubG9jayhsMXBn KTsKKyAgICBwdXRfcGFnZShsMXBnKTsKKyAgICBndWVzdF91bm1hcF9sMWUocGwxZSk7CisKKyAg ICBpZiAoIG9rYXkgJiYgIXBhZ2luZ19tb2RlX3JlZmNvdW50cyhkKSApCisgICAgICAgIHB1dF9w YWdlX2Zyb21fbDFlKG9sMWUsIGQpOworCisgICAgcmV0dXJuIG9rYXkgPyBHTlRTVF9va2F5IDog R05UU1RfZ2VuZXJhbF9lcnJvcjsKK30KKworc3RhdGljIGludCByZXBsYWNlX2dyYW50X3ZhX21h cHBpbmcoCisgICAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGZyYW1lLCBsMV9w Z2VudHJ5X3QgbmwxZSwgc3RydWN0IHZjcHUgKnYpCit7CisgICAgbDFfcGdlbnRyeV90ICpwbDFl LCBvbDFlOworICAgIHVuc2lnbmVkIGxvbmcgZ2wxbWZuOworICAgIHN0cnVjdCBwYWdlX2luZm8g KmwxcGc7CisgICAgaW50IHJjID0gMDsKKworICAgIHBsMWUgPSBndWVzdF9tYXBfbDFlKGFkZHIs ICZnbDFtZm4pOworICAgIGlmICggIXBsMWUgKQorICAgIHsKKyAgICAgICAgTUVNX0xPRygiQ291 bGQgbm90IGZpbmQgTDEgUFRFIGZvciBhZGRyZXNzICVseCIsIGFkZHIpOworICAgICAgICByZXR1 cm4gR05UU1RfZ2VuZXJhbF9lcnJvcjsKKyAgICB9CisKKyAgICBpZiAoICFnZXRfcGFnZV9mcm9t X3BhZ2VucihnbDFtZm4sIGN1cnJlbnQtPmRvbWFpbikgKQorICAgIHsKKyAgICAgICAgcmMgPSBH TlRTVF9nZW5lcmFsX2Vycm9yOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBsMXBn ID0gbWZuX3RvX3BhZ2UoZ2wxbWZuKTsKKyAgICBpZiAoICFwYWdlX2xvY2sobDFwZykgKQorICAg IHsKKyAgICAgICAgcmMgPSBHTlRTVF9nZW5lcmFsX2Vycm9yOworICAgICAgICBwdXRfcGFnZShs MXBnKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKCAobDFwZy0+dS5pbnVz ZS50eXBlX2luZm8gJiBQR1RfdHlwZV9tYXNrKSAhPSBQR1RfbDFfcGFnZV90YWJsZSApCisgICAg eworICAgICAgICByYyA9IEdOVFNUX2dlbmVyYWxfZXJyb3I7CisgICAgICAgIGdvdG8gdW5sb2Nr X2FuZF9vdXQ7CisgICAgfQorCisgICAgb2wxZSA9ICpwbDFlOworCisgICAgLyogQ2hlY2sgdGhh dCB0aGUgdmlydHVhbCBhZGRyZXNzIHN1cHBsaWVkIGlzIGFjdHVhbGx5IG1hcHBlZCB0byBmcmFt ZS4gKi8KKyAgICBpZiAoIHVubGlrZWx5KGwxZV9nZXRfcGZuKG9sMWUpICE9IGZyYW1lKSApCisg ICAgeworICAgICAgICBNRU1fTE9HKCJQVEUgZW50cnkgJWx4IGZvciBhZGRyZXNzICVseCBkb2Vz bid0IG1hdGNoIGZyYW1lICVseCIsCisgICAgICAgICAgICAgICAgbDFlX2dldF9wZm4ob2wxZSks IGFkZHIsIGZyYW1lKTsKKyAgICAgICAgcmMgPSBHTlRTVF9nZW5lcmFsX2Vycm9yOworICAgICAg ICBnb3RvIHVubG9ja19hbmRfb3V0OworICAgIH0KKworICAgIC8qIERlbGV0ZSBwYWdldGFibGUg ZW50cnkuICovCisgICAgaWYgKCB1bmxpa2VseSghVVBEQVRFX0VOVFJZKGwxLCBwbDFlLCBvbDFl LCBubDFlLCBnbDFtZm4sIHYsIDApKSApCisgICAgeworICAgICAgICBNRU1fTE9HKCJDYW5ub3Qg ZGVsZXRlIFBURSBlbnRyeSBhdCAlcCIsICh1bnNpZ25lZCBsb25nICopcGwxZSk7CisgICAgICAg IHJjID0gR05UU1RfZ2VuZXJhbF9lcnJvcjsKKyAgICAgICAgZ290byB1bmxvY2tfYW5kX291dDsK KyAgICB9CisKKyB1bmxvY2tfYW5kX291dDoKKyAgICBwYWdlX3VubG9jayhsMXBnKTsKKyAgICBw dXRfcGFnZShsMXBnKTsKKyBvdXQ6CisgICAgZ3Vlc3RfdW5tYXBfbDFlKHBsMWUpOworICAgIHJl dHVybiByYzsKK30KKworc3RhdGljIGludCBjcmVhdGVfZ3JhbnRfcHRlX21hcHBpbmcoCisgICAg dWludDY0X3QgcHRlX2FkZHIsIGwxX3BnZW50cnlfdCBubDFlLCBzdHJ1Y3QgdmNwdSAqdikKK3sK KyAgICBpbnQgcmMgPSBHTlRTVF9va2F5OworICAgIHZvaWQgKnZhOworICAgIHVuc2lnbmVkIGxv bmcgZ21mbiwgbWZuOworICAgIHN0cnVjdCBwYWdlX2luZm8gKnBhZ2U7CisgICAgbDFfcGdlbnRy eV90IG9sMWU7CisgICAgc3RydWN0IGRvbWFpbiAqZCA9IHYtPmRvbWFpbjsKKworICAgIGFkanVz dF9ndWVzdF9sMWUobmwxZSwgZCk7CisKKyAgICBnbWZuID0gcHRlX2FkZHIgPj4gUEFHRV9TSElG VDsKKyAgICBwYWdlID0gZ2V0X3BhZ2VfZnJvbV9nZm4oZCwgZ21mbiwgTlVMTCwgUDJNX0FMTE9D KTsKKworICAgIGlmICggdW5saWtlbHkoIXBhZ2UpICkKKyAgICB7CisgICAgICAgIE1FTV9MT0co IkNvdWxkIG5vdCBnZXQgcGFnZSBmb3Igbm9ybWFsIHVwZGF0ZSIpOworICAgICAgICByZXR1cm4g R05UU1RfZ2VuZXJhbF9lcnJvcjsKKyAgICB9CisKKyAgICBtZm4gPSBwYWdlX3RvX21mbihwYWdl KTsKKyAgICB2YSA9IG1hcF9kb21haW5fcGFnZShfbWZuKG1mbikpOworICAgIHZhID0gKHZvaWQg KikoKHVuc2lnbmVkIGxvbmcpdmEgKyAoKHVuc2lnbmVkIGxvbmcpcHRlX2FkZHIgJiB+UEFHRV9N QVNLKSk7CisKKyAgICBpZiAoICFwYWdlX2xvY2socGFnZSkgKQorICAgIHsKKyAgICAgICAgcmMg PSBHTlRTVF9nZW5lcmFsX2Vycm9yOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAg ICBpZiAoIChwYWdlLT51LmludXNlLnR5cGVfaW5mbyAmIFBHVF90eXBlX21hc2spICE9IFBHVF9s MV9wYWdlX3RhYmxlICkKKyAgICB7CisgICAgICAgIHBhZ2VfdW5sb2NrKHBhZ2UpOworICAgICAg ICByYyA9IEdOVFNUX2dlbmVyYWxfZXJyb3I7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0K KworICAgIG9sMWUgPSAqKGwxX3BnZW50cnlfdCAqKXZhOworICAgIGlmICggIVVQREFURV9FTlRS WShsMSwgKGwxX3BnZW50cnlfdCAqKXZhLCBvbDFlLCBubDFlLCBtZm4sIHYsIDApICkKKyAgICB7 CisgICAgICAgIHBhZ2VfdW5sb2NrKHBhZ2UpOworICAgICAgICByYyA9IEdOVFNUX2dlbmVyYWxf ZXJyb3I7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAgIHBhZ2VfdW5sb2NrKHBh Z2UpOworCisgICAgaWYgKCAhcGFnaW5nX21vZGVfcmVmY291bnRzKGQpICkKKyAgICAgICAgcHV0 X3BhZ2VfZnJvbV9sMWUob2wxZSwgZCk7CisKKyBmYWlsZWQ6CisgICAgdW5tYXBfZG9tYWluX3Bh Z2UodmEpOworICAgIHB1dF9wYWdlKHBhZ2UpOworCisgICAgcmV0dXJuIHJjOworfQorCitzdGF0 aWMgaW50IGRlc3Ryb3lfZ3JhbnRfcHRlX21hcHBpbmcoCisgICAgdWludDY0X3QgYWRkciwgdW5z aWduZWQgbG9uZyBmcmFtZSwgc3RydWN0IGRvbWFpbiAqZCkKK3sKKyAgICBpbnQgcmMgPSBHTlRT VF9va2F5OworICAgIHZvaWQgKnZhOworICAgIHVuc2lnbmVkIGxvbmcgZ21mbiwgbWZuOworICAg IHN0cnVjdCBwYWdlX2luZm8gKnBhZ2U7CisgICAgbDFfcGdlbnRyeV90IG9sMWU7CisKKyAgICBn bWZuID0gYWRkciA+PiBQQUdFX1NISUZUOworICAgIHBhZ2UgPSBnZXRfcGFnZV9mcm9tX2dmbihk LCBnbWZuLCBOVUxMLCBQMk1fQUxMT0MpOworCisgICAgaWYgKCB1bmxpa2VseSghcGFnZSkgKQor ICAgIHsKKyAgICAgICAgTUVNX0xPRygiQ291bGQgbm90IGdldCBwYWdlIGZvciBub3JtYWwgdXBk YXRlIik7CisgICAgICAgIHJldHVybiBHTlRTVF9nZW5lcmFsX2Vycm9yOworICAgIH0KKworICAg IG1mbiA9IHBhZ2VfdG9fbWZuKHBhZ2UpOworICAgIHZhID0gbWFwX2RvbWFpbl9wYWdlKF9tZm4o bWZuKSk7CisgICAgdmEgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyl2YSArICgodW5zaWduZWQg bG9uZylhZGRyICYgflBBR0VfTUFTSykpOworCisgICAgaWYgKCAhcGFnZV9sb2NrKHBhZ2UpICkK KyAgICB7CisgICAgICAgIHJjID0gR05UU1RfZ2VuZXJhbF9lcnJvcjsKKyAgICAgICAgZ290byBm YWlsZWQ7CisgICAgfQorCisgICAgaWYgKCAocGFnZS0+dS5pbnVzZS50eXBlX2luZm8gJiBQR1Rf dHlwZV9tYXNrKSAhPSBQR1RfbDFfcGFnZV90YWJsZSApCisgICAgeworICAgICAgICBwYWdlX3Vu bG9jayhwYWdlKTsKKyAgICAgICAgcmMgPSBHTlRTVF9nZW5lcmFsX2Vycm9yOworICAgICAgICBn b3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBvbDFlID0gKihsMV9wZ2VudHJ5X3QgKil2YTsKKwor ICAgIC8qIENoZWNrIHRoYXQgdGhlIHZpcnR1YWwgYWRkcmVzcyBzdXBwbGllZCBpcyBhY3R1YWxs eSBtYXBwZWQgdG8gZnJhbWUuICovCisgICAgaWYgKCB1bmxpa2VseShsMWVfZ2V0X3BmbihvbDFl KSAhPSBmcmFtZSkgKQorICAgIHsKKyAgICAgICAgcGFnZV91bmxvY2socGFnZSk7CisgICAgICAg IE1FTV9MT0coIlBURSBlbnRyeSAlbHggZm9yIGFkZHJlc3MgJSJQUkl4NjQiIGRvZXNuJ3QgbWF0 Y2ggZnJhbWUgJWx4IiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylsMWVfZ2V0X2lu dHB0ZShvbDFlKSwgYWRkciwgZnJhbWUpOworICAgICAgICByYyA9IEdOVFNUX2dlbmVyYWxfZXJy b3I7CisgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAgIC8qIERlbGV0ZSBwYWdldGFi bGUgZW50cnkuICovCisgICAgaWYgKCB1bmxpa2VseSghVVBEQVRFX0VOVFJZCisgICAgICAgICAg ICAgICAgICAobDEsCisgICAgICAgICAgICAgICAgICAgKGwxX3BnZW50cnlfdCAqKXZhLCBvbDFl LCBsMWVfZW1wdHkoKSwgbWZuLAorICAgICAgICAgICAgICAgICAgIGQtPnZjcHVbMF0gLyogQ2hh bmdlIGlmIHdlIGdvIHRvIHBlci12Y3B1IHNoYWRvd3MuICovLAorICAgICAgICAgICAgICAgICAg IDApKSApCisgICAgeworICAgICAgICBwYWdlX3VubG9jayhwYWdlKTsKKyAgICAgICAgTUVNX0xP RygiQ2Fubm90IGRlbGV0ZSBQVEUgZW50cnkgYXQgJXAiLCB2YSk7CisgICAgICAgIHJjID0gR05U U1RfZ2VuZXJhbF9lcnJvcjsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgcGFn ZV91bmxvY2socGFnZSk7CisKKyBmYWlsZWQ6CisgICAgdW5tYXBfZG9tYWluX3BhZ2UodmEpOwor ICAgIHB1dF9wYWdlKHBhZ2UpOworICAgIHJldHVybiByYzsKK30KKworLyogUmVhZCBhIFBWIGd1 ZXN0J3MgbDFlIHRoYXQgbWFwcyB0aGlzIHZpcnR1YWwgYWRkcmVzcy4gKi8KK3N0YXRpYyBpbmxp bmUgdm9pZCBndWVzdF9nZXRfZWZmX2wxZSh1bnNpZ25lZCBsb25nIGFkZHIsIGwxX3BnZW50cnlf dCAqZWZmX2wxZSkKK3sKKyAgICBBU1NFUlQoIXBhZ2luZ19tb2RlX3RyYW5zbGF0ZShjdXJyZW50 LT5kb21haW4pKTsKKyAgICBBU1NFUlQoIXBhZ2luZ19tb2RlX2V4dGVybmFsKGN1cnJlbnQtPmRv bWFpbikpOworCisgICAgaWYgKCB1bmxpa2VseSghX19hZGRyX29rKGFkZHIpKSB8fAorICAgICAg ICAgX19jb3B5X2Zyb21fdXNlcihlZmZfbDFlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAm X19saW5lYXJfbDFfdGFibGVbbDFfbGluZWFyX29mZnNldChhZGRyKV0sCisgICAgICAgICAgICAg ICAgICAgICAgICAgIHNpemVvZihsMV9wZ2VudHJ5X3QpKSApCisgICAgICAgICplZmZfbDFlID0g bDFlX2VtcHR5KCk7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBndWVzdCdzIGwxZSB0aGF0IG1hcHMg dGhpcyBhZGRyZXNzLCBmcm9tIHRoZSBrZXJuZWwtbW9kZQorICogcGFnZSB0YWJsZXMuCisgKi8K K3N0YXRpYyBpbmxpbmUgdm9pZCBndWVzdF9nZXRfZWZmX2tlcm5fbDFlKHN0cnVjdCB2Y3B1ICp2 LCB1bnNpZ25lZCBsb25nIGFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICB2b2lkICplZmZfbDFlKQoreworICAgIGJvb2xfdCB1c2VyX21vZGUgPSAhKHYtPmFy Y2guZmxhZ3MgJiBURl9rZXJuZWxfbW9kZSk7CisjZGVmaW5lIFRPR0dMRV9NT0RFKCkgaWYgKCB1 c2VyX21vZGUgKSB0b2dnbGVfZ3Vlc3RfbW9kZSh2KQorCisgICAgVE9HR0xFX01PREUoKTsKKyAg ICBndWVzdF9nZXRfZWZmX2wxZShhZGRyLCBlZmZfbDFlKTsKKyAgICBUT0dHTEVfTU9ERSgpOwor fQorCitzdGF0aWMgaW50IGRlc3Ryb3lfZ3JhbnRfdmFfbWFwcGluZygKKyAgICB1bnNpZ25lZCBs b25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgZnJhbWUsIHN0cnVjdCB2Y3B1ICp2KQoreworICAgIHJl dHVybiByZXBsYWNlX2dyYW50X3ZhX21hcHBpbmcoYWRkciwgZnJhbWUsIGwxZV9lbXB0eSgpLCB2 KTsKK30KKworaW50IHJlcGxhY2VfZ3JhbnRfcHZfbWFwcGluZyh1aW50NjRfdCBhZGRyLCB1bnNp Z25lZCBsb25nIGZyYW1lLAorCQkJICAgICB1aW50NjRfdCBuZXdfYWRkciwgdW5zaWduZWQgaW50 IGZsYWdzKQoreworICAgIHN0cnVjdCB2Y3B1ICpjdXJyID0gY3VycmVudDsKKyAgICBsMV9wZ2Vu dHJ5X3QgKnBsMWUsIG9sMWU7CisgICAgdW5zaWduZWQgbG9uZyBnbDFtZm47CisgICAgc3RydWN0 IHBhZ2VfaW5mbyAqbDFwZzsKKyAgICBpbnQgcmM7CisKKyAgICBpZiAoIGZsYWdzICYgR05UTUFQ X2NvbnRhaW5zX3B0ZSApCisgICAgeworICAgICAgICBpZiAoICFuZXdfYWRkciApCisgICAgICAg ICAgICByZXR1cm4gZGVzdHJveV9ncmFudF9wdGVfbWFwcGluZyhhZGRyLCBmcmFtZSwgY3Vyci0+ ZG9tYWluKTsKKworICAgICAgICBNRU1fTE9HKCJVbnN1cHBvcnRlZCBncmFudCB0YWJsZSBvcGVy YXRpb24iKTsKKyAgICAgICAgcmV0dXJuIEdOVFNUX2dlbmVyYWxfZXJyb3I7CisgICAgfQorCisg ICAgaWYgKCAhbmV3X2FkZHIgKQorICAgICAgICByZXR1cm4gZGVzdHJveV9ncmFudF92YV9tYXBw aW5nKGFkZHIsIGZyYW1lLCBjdXJyKTsKKworICAgIHBsMWUgPSBndWVzdF9tYXBfbDFlKG5ld19h ZGRyLCAmZ2wxbWZuKTsKKyAgICBpZiAoICFwbDFlICkKKyAgICB7CisgICAgICAgIE1FTV9MT0co IkNvdWxkIG5vdCBmaW5kIEwxIFBURSBmb3IgYWRkcmVzcyAlbHgiLAorICAgICAgICAgICAgICAg ICh1bnNpZ25lZCBsb25nKW5ld19hZGRyKTsKKyAgICAgICAgcmV0dXJuIEdOVFNUX2dlbmVyYWxf ZXJyb3I7CisgICAgfQorCisgICAgaWYgKCAhZ2V0X3BhZ2VfZnJvbV9wYWdlbnIoZ2wxbWZuLCBj dXJyZW50LT5kb21haW4pICkKKyAgICB7CisgICAgICAgIGd1ZXN0X3VubWFwX2wxZShwbDFlKTsK KyAgICAgICAgcmV0dXJuIEdOVFNUX2dlbmVyYWxfZXJyb3I7CisgICAgfQorCisgICAgbDFwZyA9 IG1mbl90b19wYWdlKGdsMW1mbik7CisgICAgaWYgKCAhcGFnZV9sb2NrKGwxcGcpICkKKyAgICB7 CisgICAgICAgIHB1dF9wYWdlKGwxcGcpOworICAgICAgICBndWVzdF91bm1hcF9sMWUocGwxZSk7 CisgICAgICAgIHJldHVybiBHTlRTVF9nZW5lcmFsX2Vycm9yOworICAgIH0KKworICAgIGlmICgg KGwxcGctPnUuaW51c2UudHlwZV9pbmZvICYgUEdUX3R5cGVfbWFzaykgIT0gUEdUX2wxX3BhZ2Vf dGFibGUgKQorICAgIHsKKyAgICAgICAgcGFnZV91bmxvY2sobDFwZyk7CisgICAgICAgIHB1dF9w YWdlKGwxcGcpOworICAgICAgICBndWVzdF91bm1hcF9sMWUocGwxZSk7CisgICAgICAgIHJldHVy biBHTlRTVF9nZW5lcmFsX2Vycm9yOworICAgIH0KKworICAgIG9sMWUgPSAqcGwxZTsKKworICAg IGlmICggdW5saWtlbHkoIVVQREFURV9FTlRSWShsMSwgcGwxZSwgb2wxZSwgbDFlX2VtcHR5KCks CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsMW1mbiwgY3VyciwgMCkpICkKKyAg ICB7CisgICAgICAgIHBhZ2VfdW5sb2NrKGwxcGcpOworICAgICAgICBwdXRfcGFnZShsMXBnKTsK KyAgICAgICAgTUVNX0xPRygiQ2Fubm90IGRlbGV0ZSBQVEUgZW50cnkgYXQgJXAiLCAodW5zaWdu ZWQgbG9uZyAqKXBsMWUpOworICAgICAgICBndWVzdF91bm1hcF9sMWUocGwxZSk7CisgICAgICAg IHJldHVybiBHTlRTVF9nZW5lcmFsX2Vycm9yOworICAgIH0KKworICAgIHBhZ2VfdW5sb2NrKGwx cGcpOworICAgIHB1dF9wYWdlKGwxcGcpOworICAgIGd1ZXN0X3VubWFwX2wxZShwbDFlKTsKKwor ICAgIHJjID0gcmVwbGFjZV9ncmFudF92YV9tYXBwaW5nKGFkZHIsIGZyYW1lLCBvbDFlLCBjdXJy KTsKKyAgICBpZiAoIHJjICYmICFwYWdpbmdfbW9kZV9yZWZjb3VudHMoY3Vyci0+ZG9tYWluKSAp CisgICAgICAgIHB1dF9wYWdlX2Zyb21fbDFlKG9sMWUsIGN1cnItPmRvbWFpbik7CisKKyAgICBy ZXR1cm4gcmM7Cit9CisKK2ludCBjcmVhdGVfZ3JhbnRfcHZfbWFwcGluZyh1aW50NjRfdCBhZGRy LCB1bnNpZ25lZCBsb25nIGZyYW1lLAorCQkJICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWdu ZWQgaW50IGNhY2hlX2ZsYWdzKQoreworICAgIGwxX3BnZW50cnlfdCBwdGU7CisgICAgdWludDMy X3QgZ3JhbnRfcHRlX2ZsYWdzOworCisgICAgZ3JhbnRfcHRlX2ZsYWdzID0KKyAgICAgICAgX1BB R0VfUFJFU0VOVCB8IF9QQUdFX0FDQ0VTU0VEIHwgX1BBR0VfRElSVFkgfCBfUEFHRV9HTlRUQUI7 CisgICAgaWYgKCBjcHVfaGFzX254ICkKKyAgICAgICAgZ3JhbnRfcHRlX2ZsYWdzIHw9IF9QQUdF X05YX0JJVDsKKworICAgIHB0ZSA9IGwxZV9mcm9tX3BmbihmcmFtZSwgZ3JhbnRfcHRlX2ZsYWdz KTsKKyAgICBpZiAoIChmbGFncyAmIEdOVE1BUF9hcHBsaWNhdGlvbl9tYXApICkKKyAgICAgICAg bDFlX2FkZF9mbGFncyhwdGUsX1BBR0VfVVNFUik7CisgICAgaWYgKCAhKGZsYWdzICYgR05UTUFQ X3JlYWRvbmx5KSApCisgICAgICAgIGwxZV9hZGRfZmxhZ3MocHRlLF9QQUdFX1JXKTsKKworICAg IGwxZV9hZGRfZmxhZ3MocHRlLAorICAgICAgICAgICAgICAgICAgKChmbGFncyA+PiBfR05UTUFQ X2d1ZXN0X2F2YWlsMCkgKiBfUEFHRV9BVkFJTDApCisgICAgICAgICAgICAgICAgICAgJiBfUEFH RV9BVkFJTCk7CisKKyAgICBsMWVfYWRkX2ZsYWdzKHB0ZSwgY2FjaGVhdHRyX3RvX3B0ZV9mbGFn cyhjYWNoZV9mbGFncyA+PiA1KSk7CisKKyAgICBpZiAoIGZsYWdzICYgR05UTUFQX2NvbnRhaW5z X3B0ZSApCisgICAgICAgIHJldHVybiBjcmVhdGVfZ3JhbnRfcHRlX21hcHBpbmcoYWRkciwgcHRl LCBjdXJyZW50KTsKKyAgICByZXR1cm4gY3JlYXRlX2dyYW50X3ZhX21hcHBpbmcoYWRkciwgcHRl LCBjdXJyZW50KTsKK30KKworLyogTWFwIHNoYWRvdyBwYWdlIGF0IG9mZnNldCBAb2ZmLiAqLwor aW50IG1hcF9sZHRfc2hhZG93X3BhZ2UodW5zaWduZWQgaW50IG9mZikKK3sKKyAgICBzdHJ1Y3Qg dmNwdSAqdiA9IGN1cnJlbnQ7CisgICAgc3RydWN0IGRvbWFpbiAqZCA9IHYtPmRvbWFpbjsKKyAg ICB1bnNpZ25lZCBsb25nIGdtZm47CisgICAgc3RydWN0IHBhZ2VfaW5mbyAqcGFnZTsKKyAgICBs MV9wZ2VudHJ5X3QgbDFlLCBubDFlOworICAgIHVuc2lnbmVkIGxvbmcgZ3ZhID0gdi0+YXJjaC5w dl92Y3B1LmxkdF9iYXNlICsgKG9mZiA8PCBQQUdFX1NISUZUKTsKKyAgICBpbnQgb2theTsKKwor ICAgIEJVR19PTih1bmxpa2VseShpbl9pcnEoKSkpOworCisgICAgaWYgKCBpc19wdl8zMmJpdF9k b21haW4oZCkgKQorICAgICAgICBndmEgPSAodTMyKWd2YTsKKyAgICBndWVzdF9nZXRfZWZmX2tl cm5fbDFlKHYsIGd2YSwgJmwxZSk7CisgICAgaWYgKCB1bmxpa2VseSghKGwxZV9nZXRfZmxhZ3Mo bDFlKSAmIF9QQUdFX1BSRVNFTlQpKSApCisgICAgICAgIHJldHVybiAwOworCisgICAgZ21mbiA9 IGwxZV9nZXRfcGZuKGwxZSk7CisgICAgcGFnZSA9IGdldF9wYWdlX2Zyb21fZ2ZuKGQsIGdtZm4s IE5VTEwsIFAyTV9BTExPQyk7CisgICAgaWYgKCB1bmxpa2VseSghcGFnZSkgKQorICAgICAgICBy ZXR1cm4gMDsKKworICAgIG9rYXkgPSBnZXRfcGFnZV90eXBlKHBhZ2UsIFBHVF9zZWdfZGVzY19w YWdlKTsKKyAgICBpZiAoIHVubGlrZWx5KCFva2F5KSApCisgICAgeworICAgICAgICBwdXRfcGFn ZShwYWdlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbmwxZSA9IGwxZV9mcm9t X3BmbihwYWdlX3RvX21mbihwYWdlKSwgbDFlX2dldF9mbGFncyhsMWUpIHwgX1BBR0VfUlcpOwor CisgICAgc3Bpbl9sb2NrKCZ2LT5hcmNoLnB2X3ZjcHUuc2hhZG93X2xkdF9sb2NrKTsKKyAgICBs MWVfd3JpdGUoJmdkdF9sZHRfcHRlcyhkLCB2KVtvZmYgKyAxNl0sIG5sMWUpOworICAgIHYtPmFy Y2gucHZfdmNwdS5zaGFkb3dfbGR0X21hcGNudCsrOworICAgIHNwaW5fdW5sb2NrKCZ2LT5hcmNo LnB2X3ZjcHUuc2hhZG93X2xkdF9sb2NrKTsKKworICAgIHJldHVybiAxOworfQorCitpbnQgbmV3 X2d1ZXN0X2NyMyh1bnNpZ25lZCBsb25nIG1mbikKK3sKKyAgICBzdHJ1Y3QgdmNwdSAqY3VyciA9 IGN1cnJlbnQ7CisgICAgc3RydWN0IGRvbWFpbiAqZCA9IGN1cnItPmRvbWFpbjsKKyAgICBpbnQg cmM7CisgICAgdW5zaWduZWQgbG9uZyBvbGRfYmFzZV9tZm47CisKKyAgICBpZiAoIGlzX3B2XzMy Yml0X2RvbWFpbihkKSApCisgICAgeworICAgICAgICB1bnNpZ25lZCBsb25nIGd0X21mbiA9IHBh Z2V0YWJsZV9nZXRfcGZuKGN1cnItPmFyY2guZ3Vlc3RfdGFibGUpOworICAgICAgICBsNF9wZ2Vu dHJ5X3QgKnBsNGUgPSBtYXBfZG9tYWluX3BhZ2UoX21mbihndF9tZm4pKTsKKworICAgICAgICBy YyA9IHBhZ2luZ19tb2RlX3JlZmNvdW50cyhkKQorICAgICAgICAgICAgID8gLUVJTlZBTCAvKiBP bGQgY29kZSB3YXMgYnJva2VuLCBidXQgd2hhdCBzaG91bGQgaXQgYmU/ICovCisgICAgICAgICAg ICAgOiBtb2RfbDRfZW50cnkoCisgICAgICAgICAgICAgICAgICAgIHBsNGUsCisgICAgICAgICAg ICAgICAgICAgIGw0ZV9mcm9tX3BmbigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1mbiwKKyAg ICAgICAgICAgICAgICAgICAgICAgIChfUEFHRV9QUkVTRU5UfF9QQUdFX1JXfF9QQUdFX1VTRVJ8 X1BBR0VfQUNDRVNTRUQpKSwKKyAgICAgICAgICAgICAgICAgICAgZ3RfbWZuLCAwLCBjdXJyKTsK KyAgICAgICAgdW5tYXBfZG9tYWluX3BhZ2UocGw0ZSk7CisgICAgICAgIHN3aXRjaCAoIHJjICkK KyAgICAgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg Y2FzZSAtRUlOVFI6CisgICAgICAgIGNhc2UgLUVSRVNUQVJUOgorICAgICAgICAgICAgcmV0dXJu IC1FUkVTVEFSVDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIE1FTV9MT0coIkVycm9y IHdoaWxlIGluc3RhbGxpbmcgbmV3IGNvbXBhdCBiYXNlcHRyICVseCIsIG1mbik7CisgICAgICAg ICAgICByZXR1cm4gcmM7CisgICAgICAgIH0KKworICAgICAgICBpbnZhbGlkYXRlX3NoYWRvd19s ZHQoY3VyciwgMCk7CisgICAgICAgIHdyaXRlX3B0YmFzZShjdXJyKTsKKworICAgICAgICByZXR1 cm4gMDsKKyAgICB9CisKKyAgICByYyA9IHB1dF9vbGRfZ3Vlc3RfdGFibGUoY3Vycik7CisgICAg aWYgKCB1bmxpa2VseShyYykgKQorICAgICAgICByZXR1cm4gcmM7CisKKyAgICBvbGRfYmFzZV9t Zm4gPSBwYWdldGFibGVfZ2V0X3BmbihjdXJyLT5hcmNoLmd1ZXN0X3RhYmxlKTsKKyAgICAvKgor ICAgICAqIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCB3aGVuIGdldHRpbmcgcmVzdGFy dGVkIGFmdGVyIHRoZQorICAgICAqIHByZXZpb3VzIGF0dGVtcHQgZ290IHByZWVtcHRlZCBpbiB0 aGUgcHV0LW9sZC1NRk4gcGhhc2UuCisgICAgICovCisgICAgaWYgKCBvbGRfYmFzZV9tZm4gPT0g bWZuICkKKyAgICB7CisgICAgICAgIHdyaXRlX3B0YmFzZShjdXJyKTsKKyAgICAgICAgcmV0dXJu IDA7CisgICAgfQorCisgICAgcmMgPSBwYWdpbmdfbW9kZV9yZWZjb3VudHMoZCkKKyAgICAgICAg ID8gKGdldF9wYWdlX2Zyb21fcGFnZW5yKG1mbiwgZCkgPyAwIDogLUVJTlZBTCkKKyAgICAgICAg IDogZ2V0X3BhZ2VfYW5kX3R5cGVfZnJvbV9wYWdlbnIobWZuLCBQR1Rfcm9vdF9wYWdlX3RhYmxl LCBkLCAwLCAxKTsKKyAgICBzd2l0Y2ggKCByYyApCisgICAgeworICAgIGNhc2UgMDoKKyAgICAg ICAgYnJlYWs7CisgICAgY2FzZSAtRUlOVFI6CisgICAgY2FzZSAtRVJFU1RBUlQ6CisgICAgICAg IHJldHVybiAtRVJFU1RBUlQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTUVNX0xPRygiRXJyb3Ig d2hpbGUgaW5zdGFsbGluZyBuZXcgYmFzZXB0ciAlbHgiLCBtZm4pOworICAgICAgICByZXR1cm4g cmM7CisgICAgfQorCisgICAgaW52YWxpZGF0ZV9zaGFkb3dfbGR0KGN1cnIsIDApOworCisgICAg aWYgKCAhVk1fQVNTSVNUKGQsIG0ycF9zdHJpY3QpICYmICFwYWdpbmdfbW9kZV9yZWZjb3VudHMo ZCkgKQorICAgICAgICBmaWxsX3JvX21wdChtZm4pOworICAgIGN1cnItPmFyY2guZ3Vlc3RfdGFi bGUgPSBwYWdldGFibGVfZnJvbV9wZm4obWZuKTsKKyAgICB1cGRhdGVfY3IzKGN1cnIpOworCisg ICAgd3JpdGVfcHRiYXNlKGN1cnIpOworCisgICAgaWYgKCBsaWtlbHkob2xkX2Jhc2VfbWZuICE9 IDApICkKKyAgICB7CisgICAgICAgIHN0cnVjdCBwYWdlX2luZm8gKnBhZ2UgPSBtZm5fdG9fcGFn ZShvbGRfYmFzZV9tZm4pOworCisgICAgICAgIGlmICggcGFnaW5nX21vZGVfcmVmY291bnRzKGQp ICkKKyAgICAgICAgICAgIHB1dF9wYWdlKHBhZ2UpOworICAgICAgICBlbHNlCisgICAgICAgICAg ICBzd2l0Y2ggKCByYyA9IHB1dF9wYWdlX2FuZF90eXBlX3ByZWVtcHRpYmxlKHBhZ2UpICkKKyAg ICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgLUVJTlRSOgorICAgICAgICAgICAgICAgIHJj ID0gLUVSRVNUQVJUOworICAgICAgICAgICAgICAgIC8qIGZhbGx0aHJvdWdoICovCisgICAgICAg ICAgICBjYXNlIC1FUkVTVEFSVDoKKyAgICAgICAgICAgICAgICBjdXJyLT5hcmNoLm9sZF9ndWVz dF90YWJsZSA9IHBhZ2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZh dWx0OgorICAgICAgICAgICAgICAgIEJVR19PTihyYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7 CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCisvKioqKioqKioq KioqKioqKioqKioqKioqKgorICogV3JpdGFibGUgUGFnZXRhYmxlcworICovCisKK3N0cnVjdCBw dHdyX2VtdWxhdGVfY3R4dCB7CisgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgY3R4dDsKKyAg ICB1bnNpZ25lZCBsb25nIGNyMjsKKyAgICBsMV9wZ2VudHJ5X3QgIHB0ZTsKK307CisKK3N0YXRp YyBpbnQgcHR3cl9lbXVsYXRlZF9yZWFkKAorICAgIGVudW0geDg2X3NlZ21lbnQgc2VnLAorICAg IHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorICAgIHZvaWQgKnBfZGF0YSwKKyAgICB1bnNpZ25lZCBp bnQgYnl0ZXMsCisgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisgICAgdW5z aWduZWQgaW50IHJjID0gYnl0ZXM7CisgICAgdW5zaWduZWQgbG9uZyBhZGRyID0gb2Zmc2V0Owor CisgICAgaWYgKCAhX19hZGRyX29rKGFkZHIpIHx8CisgICAgICAgICAocmMgPSBfX2NvcHlfZnJv bV91c2VyKHBfZGF0YSwgKHZvaWQgKilhZGRyLCBieXRlcykpICkKKyAgICB7CisgICAgICAgIHg4 Nl9lbXVsX3BhZ2VmYXVsdCgwLCBhZGRyICsgYnl0ZXMgLSByYywgY3R4dCk7ICAvKiBSZWFkIGZh dWx0LiAqLworICAgICAgICByZXR1cm4gWDg2RU1VTF9FWENFUFRJT047CisgICAgfQorCisgICAg cmV0dXJuIFg4NkVNVUxfT0tBWTsKK30KKworc3RhdGljIGludCBwdHdyX2VtdWxhdGVkX3VwZGF0 ZSgKKyAgICB1bnNpZ25lZCBsb25nIGFkZHIsCisgICAgcGFkZHJfdCBvbGQsCisgICAgcGFkZHJf dCB2YWwsCisgICAgdW5zaWduZWQgaW50IGJ5dGVzLAorICAgIHVuc2lnbmVkIGludCBkb19jbXB4 Y2hnLAorICAgIHN0cnVjdCBwdHdyX2VtdWxhdGVfY3R4dCAqcHR3cl9jdHh0KQoreworICAgIHVu c2lnbmVkIGxvbmcgbWZuOworICAgIHVuc2lnbmVkIGxvbmcgdW5hbGlnbmVkX2FkZHIgPSBhZGRy OworICAgIHN0cnVjdCBwYWdlX2luZm8gKnBhZ2U7CisgICAgbDFfcGdlbnRyeV90IHB0ZSwgb2wx ZSwgbmwxZSwgKnBsMWU7CisgICAgc3RydWN0IHZjcHUgKnYgPSBjdXJyZW50OworICAgIHN0cnVj dCBkb21haW4gKmQgPSB2LT5kb21haW47CisgICAgaW50IHJldDsKKworICAgIC8qIE9ubHkgYWxs b3cgbmF0dXJhbGx5LWFsaWduZWQgc3RvcmVzIHdpdGhpbiB0aGUgb3JpZ2luYWwgJWNyMiBwYWdl LiAqLworICAgIGlmICggdW5saWtlbHkoKChhZGRyXnB0d3JfY3R4dC0+Y3IyKSAmIFBBR0VfTUFT SykgfHwgKGFkZHIgJiAoYnl0ZXMtMSkpKSApCisgICAgeworICAgICAgICBNRU1fTE9HKCJwdHdy X2VtdWxhdGU6IGJhZCBhY2Nlc3MgKGNyMj0lbHgsIGFkZHI9JWx4LCBieXRlcz0ldSkiLAorICAg ICAgICAgICAgICAgIHB0d3JfY3R4dC0+Y3IyLCBhZGRyLCBieXRlcyk7CisgICAgICAgIHJldHVy biBYODZFTVVMX1VOSEFORExFQUJMRTsKKyAgICB9CisKKyAgICAvKiBUdXJuIGEgc3ViLXdvcmQg YWNjZXNzIGludG8gYSBmdWxsLXdvcmQgYWNjZXNzLiAqLworICAgIGlmICggYnl0ZXMgIT0gc2l6 ZW9mKHBhZGRyX3QpICkKKyAgICB7CisgICAgICAgIHBhZGRyX3QgICAgICBmdWxsOworICAgICAg ICB1bnNpZ25lZCBpbnQgcmMsIG9mZnNldCA9IGFkZHIgJiAoc2l6ZW9mKHBhZGRyX3QpLTEpOwor CisgICAgICAgIC8qIEFsaWduIGFkZHJlc3M7IHJlYWQgZnVsbCB3b3JkLiAqLworICAgICAgICBh ZGRyICY9IH4oc2l6ZW9mKHBhZGRyX3QpLTEpOworICAgICAgICBpZiAoIChyYyA9IGNvcHlfZnJv bV91c2VyKCZmdWxsLCAodm9pZCAqKWFkZHIsIHNpemVvZihwYWRkcl90KSkpICE9IDAgKQorICAg ICAgICB7CisgICAgICAgICAgICB4ODZfZW11bF9wYWdlZmF1bHQoMCwgLyogUmVhZCBmYXVsdC4g Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyICsgc2l6ZW9mKHBhZGRyX3Qp IC0gcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0d3JfY3R4dC0+Y3R4dCk7 CisgICAgICAgICAgICByZXR1cm4gWDg2RU1VTF9FWENFUFRJT047CisgICAgICAgIH0KKyAgICAg ICAgLyogTWFzayBvdXQgYml0cyBwcm92aWRlZCBieSBjYWxsZXIuICovCisgICAgICAgIGZ1bGwg Jj0gfigoKChwYWRkcl90KTEgPDwgKGJ5dGVzKjgpKSAtIDEpIDw8IChvZmZzZXQqOCkpOworICAg ICAgICAvKiBTaGlmdCB0aGUgY2FsbGVyIHZhbHVlIGFuZCBPUiBpbiB0aGUgbWlzc2luZyBiaXRz LiAqLworICAgICAgICB2YWwgICY9ICgoKHBhZGRyX3QpMSA8PCAoYnl0ZXMqOCkpIC0gMSk7Cisg ICAgICAgIHZhbCA8PD0gKG9mZnNldCkqODsKKyAgICAgICAgdmFsICB8PSBmdWxsOworICAgICAg ICAvKiBBbHNvIGZpbGwgaW4gbWlzc2luZyBwYXJ0cyBvZiB0aGUgY21weGNoZyBvbGQgdmFsdWUu ICovCisgICAgICAgIG9sZCAgJj0gKCgocGFkZHJfdCkxIDw8IChieXRlcyo4KSkgLSAxKTsKKyAg ICAgICAgb2xkIDw8PSAob2Zmc2V0KSo4OworICAgICAgICBvbGQgIHw9IGZ1bGw7CisgICAgfQor CisgICAgcHRlICA9IHB0d3JfY3R4dC0+cHRlOworICAgIG1mbiAgPSBsMWVfZ2V0X3BmbihwdGUp OworICAgIHBhZ2UgPSBtZm5fdG9fcGFnZShtZm4pOworCisgICAgLyogV2UgYXJlIGxvb2tpbmcg b25seSBmb3IgcmVhZC1vbmx5IG1hcHBpbmdzIG9mIHAudC4gcGFnZXMuICovCisgICAgQVNTRVJU KChsMWVfZ2V0X2ZsYWdzKHB0ZSkgJiAoX1BBR0VfUld8X1BBR0VfUFJFU0VOVCkpID09IF9QQUdF X1BSRVNFTlQpOworICAgIEFTU0VSVChtZm5fdmFsaWQoX21mbihtZm4pKSk7CisgICAgQVNTRVJU KChwYWdlLT51LmludXNlLnR5cGVfaW5mbyAmIFBHVF90eXBlX21hc2spID09IFBHVF9sMV9wYWdl X3RhYmxlKTsKKyAgICBBU1NFUlQoKHBhZ2UtPnUuaW51c2UudHlwZV9pbmZvICYgUEdUX2NvdW50 X21hc2spICE9IDApOworICAgIEFTU0VSVChwYWdlX2dldF9vd25lcihwYWdlKSA9PSBkKTsKKwor ICAgIC8qIENoZWNrIHRoZSBuZXcgUFRFLiAqLworICAgIG5sMWUgPSBsMWVfZnJvbV9pbnRwdGUo dmFsKTsKKyAgICBzd2l0Y2ggKCByZXQgPSBnZXRfcGFnZV9mcm9tX2wxZShubDFlLCBkLCBkKSAp CisgICAgeworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICggaXNfcHZfMzJiaXRfZG9tYWluKGQp ICYmIChieXRlcyA9PSA0KSAmJiAodW5hbGlnbmVkX2FkZHIgJiA0KSAmJgorICAgICAgICAgICAg ICFkb19jbXB4Y2hnICYmIChsMWVfZ2V0X2ZsYWdzKG5sMWUpICYgX1BBR0VfUFJFU0VOVCkgKQor ICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgdGhpcyBpcyBhbiB1 cHBlci1oYWxmIHdyaXRlIHRvIGEgUEFFIFBURSB0aGVuIHdlIGFzc3VtZSB0aGF0CisgICAgICAg ICAgICAgKiB0aGUgZ3Vlc3QgaGFzIHNpbXBseSBnb3QgdGhlIHR3byB3cml0ZXMgdGhlIHdyb25n IHdheSByb3VuZC4gV2UKKyAgICAgICAgICAgICAqIHphcCB0aGUgUFJFU0VOVCBiaXQgb24gdGhl IGFzc3VtcHRpb24gdGhhdCB0aGUgYm90dG9tIGhhbGYgd2lsbAorICAgICAgICAgICAgICogYmUg d3JpdHRlbiBpbW1lZGlhdGVseSBhZnRlciB3ZSByZXR1cm4gdG8gdGhlIGd1ZXN0LgorICAgICAg ICAgICAgICovCisgICAgICAgICAgICBnZHByaW50ayhYRU5MT0dfREVCVUcsICJwdHdyX2VtdWxh dGU6IGZpeGluZyB1cCBpbnZhbGlkIFBBRSBQVEUgJSIKKyAgICAgICAgICAgICAgICAgICAgIFBS SXB0ZSJcbiIsIGwxZV9nZXRfaW50cHRlKG5sMWUpKTsKKyAgICAgICAgICAgIGwxZV9yZW1vdmVf ZmxhZ3MobmwxZSwgX1BBR0VfUFJFU0VOVCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAg ICAgICB7CisgICAgICAgICAgICBNRU1fTE9HKCJwdHdyX2VtdWxhdGU6IGNvdWxkIG5vdCBnZXRf cGFnZV9mcm9tX2wxZSgpIik7CisgICAgICAgICAgICByZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFC TEU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAwOgorICAgICAgICBicmVh azsKKyAgICBjYXNlIF9QQUdFX1JXIC4uLiBfUEFHRV9SVyB8IFBBR0VfQ0FDSEVfQVRUUlM6Cisg ICAgICAgIEFTU0VSVCghKHJldCAmIH4oX1BBR0VfUlcgfCBQQUdFX0NBQ0hFX0FUVFJTKSkpOwor ICAgICAgICBsMWVfZmxpcF9mbGFncyhubDFlLCByZXQpOworICAgICAgICBicmVhazsKKyAgICB9 CisKKyAgICBhZGp1c3RfZ3Vlc3RfbDFlKG5sMWUsIGQpOworCisgICAgLyogQ2hlY2tlZCBzdWNj ZXNzZnVsbHk6IGRvIHRoZSB1cGRhdGUgKHdyaXRlIG9yIGNtcHhjaGcpLiAqLworICAgIHBsMWUg PSBtYXBfZG9tYWluX3BhZ2UoX21mbihtZm4pKTsKKyAgICBwbDFlID0gKGwxX3BnZW50cnlfdCAq KSgodW5zaWduZWQgbG9uZylwbDFlICsgKGFkZHIgJiB+UEFHRV9NQVNLKSk7CisgICAgaWYgKCBk b19jbXB4Y2hnICkKKyAgICB7CisgICAgICAgIGludCBva2F5OworICAgICAgICBpbnRwdGVfdCB0 ID0gb2xkOworICAgICAgICBvbDFlID0gbDFlX2Zyb21faW50cHRlKG9sZCk7CisKKyAgICAgICAg b2theSA9IHBhZ2luZ19jbXB4Y2hnX2d1ZXN0X2VudHJ5KHYsICZsMWVfZ2V0X2ludHB0ZSgqcGwx ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdCwgbDFlX2dl dF9pbnRwdGUobmwxZSksIF9tZm4obWZuKSk7CisgICAgICAgIG9rYXkgPSAob2theSAmJiB0ID09 IG9sZCk7CisKKyAgICAgICAgaWYgKCAhb2theSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVu bWFwX2RvbWFpbl9wYWdlKHBsMWUpOworICAgICAgICAgICAgcHV0X3BhZ2VfZnJvbV9sMWUobmwx ZSwgZCk7CisgICAgICAgICAgICByZXR1cm4gWDg2RU1VTF9SRVRSWTsKKyAgICAgICAgfQorICAg IH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvbDFlID0gKnBsMWU7CisgICAgICAgIGlmICgg IVVQREFURV9FTlRSWShsMSwgcGwxZSwgb2wxZSwgbmwxZSwgbWZuLCB2LCAwKSApCisgICAgICAg ICAgICBCVUcoKTsKKyAgICB9CisKKyAgICB0cmFjZV9wdHdyX2VtdWxhdGlvbihhZGRyLCBubDFl KTsKKworICAgIHVubWFwX2RvbWFpbl9wYWdlKHBsMWUpOworCisgICAgLyogRmluYWxseSwgZHJv cCB0aGUgb2xkIFBURS4gKi8KKyAgICBwdXRfcGFnZV9mcm9tX2wxZShvbDFlLCBkKTsKKworICAg IHJldHVybiBYODZFTVVMX09LQVk7Cit9CisKK3N0YXRpYyBpbnQgcHR3cl9lbXVsYXRlZF93cml0 ZSgKKyAgICBlbnVtIHg4Nl9zZWdtZW50IHNlZywKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwK KyAgICB2b2lkICpwX2RhdGEsCisgICAgdW5zaWduZWQgaW50IGJ5dGVzLAorICAgIHN0cnVjdCB4 ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQoreworICAgIHBhZGRyX3QgdmFsID0gMDsKKworICAgIGlm ICggKGJ5dGVzID4gc2l6ZW9mKHBhZGRyX3QpKSB8fCAoYnl0ZXMgJiAoYnl0ZXMgLSAxKSkgfHwg IWJ5dGVzICkKKyAgICB7CisgICAgICAgIE1FTV9MT0coInB0d3JfZW11bGF0ZTogYmFkIHdyaXRl IHNpemUgKGFkZHI9JWx4LCBieXRlcz0ldSkiLAorICAgICAgICAgICAgICAgIG9mZnNldCwgYnl0 ZXMpOworICAgICAgICByZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CisgICAgfQorCisgICAg bWVtY3B5KCZ2YWwsIHBfZGF0YSwgYnl0ZXMpOworCisgICAgcmV0dXJuIHB0d3JfZW11bGF0ZWRf dXBkYXRlKAorICAgICAgICBvZmZzZXQsIDAsIHZhbCwgYnl0ZXMsIDAsCisgICAgICAgIGNvbnRh aW5lcl9vZihjdHh0LCBzdHJ1Y3QgcHR3cl9lbXVsYXRlX2N0eHQsIGN0eHQpKTsKK30KKworc3Rh dGljIGludCBwdHdyX2VtdWxhdGVkX2NtcHhjaGcoCisgICAgZW51bSB4ODZfc2VnbWVudCBzZWcs CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisgICAgdm9pZCAqcF9vbGQsCisgICAgdm9pZCAq cF9uZXcsCisgICAgdW5zaWduZWQgaW50IGJ5dGVzLAorICAgIHN0cnVjdCB4ODZfZW11bGF0ZV9j dHh0ICpjdHh0KQoreworICAgIHBhZGRyX3Qgb2xkID0gMCwgbmV3ID0gMDsKKworICAgIGlmICgg KGJ5dGVzID4gc2l6ZW9mKHBhZGRyX3QpKSB8fCAoYnl0ZXMgJiAoYnl0ZXMgLTEpKSApCisgICAg eworICAgICAgICBNRU1fTE9HKCJwdHdyX2VtdWxhdGU6IGJhZCBjbXB4Y2hnIHNpemUgKGFkZHI9 JWx4LCBieXRlcz0ldSkiLAorICAgICAgICAgICAgICAgIG9mZnNldCwgYnl0ZXMpOworICAgICAg ICByZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CisgICAgfQorCisgICAgbWVtY3B5KCZvbGQs IHBfb2xkLCBieXRlcyk7CisgICAgbWVtY3B5KCZuZXcsIHBfbmV3LCBieXRlcyk7CisKKyAgICBy ZXR1cm4gcHR3cl9lbXVsYXRlZF91cGRhdGUoCisgICAgICAgIG9mZnNldCwgb2xkLCBuZXcsIGJ5 dGVzLCAxLAorICAgICAgICBjb250YWluZXJfb2YoY3R4dCwgc3RydWN0IHB0d3JfZW11bGF0ZV9j dHh0LCBjdHh0KSk7Cit9CisKK3N0YXRpYyBpbnQgcHZfZW11bF9pc19tZW1fd3JpdGUoY29uc3Qg c3RydWN0IHg4Nl9lbXVsYXRlX3N0YXRlICpzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisgICAgcmV0dXJuIHg4 Nl9pbnNuX2lzX21lbV93cml0ZShzdGF0ZSwgY3R4dCkgPyBYODZFTVVMX09LQVkKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFg4NkVNVUxfVU5IQU5ETEVB QkxFOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9lbXVsYXRlX29wcyBwdHdyX2VtdWxh dGVfb3BzID0geworICAgIC5yZWFkICAgICAgID0gcHR3cl9lbXVsYXRlZF9yZWFkLAorICAgIC5p bnNuX2ZldGNoID0gcHR3cl9lbXVsYXRlZF9yZWFkLAorICAgIC53cml0ZSAgICAgID0gcHR3cl9l bXVsYXRlZF93cml0ZSwKKyAgICAuY21weGNoZyAgICA9IHB0d3JfZW11bGF0ZWRfY21weGNoZywK KyAgICAudmFsaWRhdGUgICA9IHB2X2VtdWxfaXNfbWVtX3dyaXRlLAorICAgIC5jcHVpZCAgICAg ID0gcHZfZW11bF9jcHVpZCwKK307CisKKy8qIFdyaXRlIHBhZ2UgZmF1bHQgaGFuZGxlcjogY2hl Y2sgaWYgZ3Vlc3QgaXMgdHJ5aW5nIHRvIG1vZGlmeSBhIFBURS4gKi8KK2ludCBwdHdyX2RvX3Bh Z2VfZmF1bHQoc3RydWN0IHZjcHUgKnYsIHVuc2lnbmVkIGxvbmcgYWRkciwKKyAgICAgICAgICAg ICAgICAgICAgICAgc3RydWN0IGNwdV91c2VyX3JlZ3MgKnJlZ3MpCit7CisgICAgc3RydWN0IGRv bWFpbiAqZCA9IHYtPmRvbWFpbjsKKyAgICBzdHJ1Y3QgcGFnZV9pbmZvICpwYWdlOworICAgIGwx X3BnZW50cnlfdCAgICAgIHB0ZTsKKyAgICBzdHJ1Y3QgcHR3cl9lbXVsYXRlX2N0eHQgcHR3cl9j dHh0ID0geworICAgICAgICAuY3R4dCA9IHsKKyAgICAgICAgICAgIC5yZWdzID0gcmVncywKKyAg ICAgICAgICAgIC52ZW5kb3IgPSBkLT5hcmNoLmNwdWlkLT54ODZfdmVuZG9yLAorICAgICAgICAg ICAgLmFkZHJfc2l6ZSA9IGlzX3B2XzMyYml0X2RvbWFpbihkKSA/IDMyIDogQklUU19QRVJfTE9O RywKKyAgICAgICAgICAgIC5zcF9zaXplICAgPSBpc19wdl8zMmJpdF9kb21haW4oZCkgPyAzMiA6 IEJJVFNfUEVSX0xPTkcsCisgICAgICAgICAgICAuc3dpbnRfZW11bGF0ZSA9IHg4Nl9zd2ludF9l bXVsYXRlX25vbmUsCisgICAgICAgIH0sCisgICAgfTsKKyAgICBpbnQgcmM7CisKKyAgICAvKiBB dHRlbXB0IHRvIHJlYWQgdGhlIFBURSB0aGF0IG1hcHMgdGhlIFZBIGJlaW5nIGFjY2Vzc2VkLiAq LworICAgIGd1ZXN0X2dldF9lZmZfbDFlKGFkZHIsICZwdGUpOworCisgICAgLyogV2UgYXJlIGxv b2tpbmcgb25seSBmb3IgcmVhZC1vbmx5IG1hcHBpbmdzIG9mIHAudC4gcGFnZXMuICovCisgICAg aWYgKCAoKGwxZV9nZXRfZmxhZ3MocHRlKSAmIChfUEFHRV9QUkVTRU5UfF9QQUdFX1JXKSkgIT0g X1BBR0VfUFJFU0VOVCkgfHwKKyAgICAgICAgIHJhbmdlc2V0X2NvbnRhaW5zX3NpbmdsZXRvbiht bWlvX3JvX3JhbmdlcywgbDFlX2dldF9wZm4ocHRlKSkgfHwKKyAgICAgICAgICFnZXRfcGFnZV9m cm9tX3BhZ2VucihsMWVfZ2V0X3BmbihwdGUpLCBkKSApCisgICAgICAgIGdvdG8gYmFpbDsKKwor ICAgIHBhZ2UgPSBsMWVfZ2V0X3BhZ2UocHRlKTsKKyAgICBpZiAoICFwYWdlX2xvY2socGFnZSkg KQorICAgIHsKKyAgICAgICAgcHV0X3BhZ2UocGFnZSk7CisgICAgICAgIGdvdG8gYmFpbDsKKyAg ICB9CisKKyAgICBpZiAoIChwYWdlLT51LmludXNlLnR5cGVfaW5mbyAmIFBHVF90eXBlX21hc2sp ICE9IFBHVF9sMV9wYWdlX3RhYmxlICkKKyAgICB7CisgICAgICAgIHBhZ2VfdW5sb2NrKHBhZ2Up OworICAgICAgICBwdXRfcGFnZShwYWdlKTsKKyAgICAgICAgZ290byBiYWlsOworICAgIH0KKwor ICAgIHB0d3JfY3R4dC5jcjIgPSBhZGRyOworICAgIHB0d3JfY3R4dC5wdGUgPSBwdGU7CisKKyAg ICByYyA9IHg4Nl9lbXVsYXRlKCZwdHdyX2N0eHQuY3R4dCwgJnB0d3JfZW11bGF0ZV9vcHMpOwor CisgICAgcGFnZV91bmxvY2socGFnZSk7CisgICAgcHV0X3BhZ2UocGFnZSk7CisKKyAgICBzd2l0 Y2ggKCByYyApCisgICAgeworICAgIGNhc2UgWDg2RU1VTF9FWENFUFRJT046CisgICAgICAgIC8q CisgICAgICAgICAqIFRoaXMgZW11bGF0aW9uIG9ubHkgY292ZXJzIHdyaXRlcyB0byBwYWdldGFi bGVzIHdoaWNoIGFyZSBtYXJrZWQKKyAgICAgICAgICogcmVhZC1vbmx5IGJ5IFhlbi4gIFdlIHRv bGVyYXRlICNQRiAoaW4gY2FzZSBhIGNvbmN1cnJlbnQgcGFnZXRhYmxlCisgICAgICAgICAqIHVw ZGF0ZSBoYXMgc3VjY2VlZGVkIG9uIGEgZGlmZmVyZW50IHZjcHUpLiAgQW55dGhpbmcgZWxzZSBp cyBhbgorICAgICAgICAgKiBlbXVsYXRpb24gYnVnLCBvciBhIGd1ZXN0IHBsYXlpbmcgd2l0aCB0 aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtIHVuZGVyCisgICAgICAgICAqIFhlbidzIGZlZXQuCisgICAg ICAgICAqLworICAgICAgICBpZiAoIHB0d3JfY3R4dC5jdHh0LmV2ZW50LnR5cGUgPT0gWDg2X0VW RU5UVFlQRV9IV19FWENFUFRJT04gJiYKKyAgICAgICAgICAgICBwdHdyX2N0eHQuY3R4dC5ldmVu dC52ZWN0b3IgPT0gVFJBUF9wYWdlX2ZhdWx0ICkKKyAgICAgICAgICAgIHB2X2luamVjdF9ldmVu dCgmcHR3cl9jdHh0LmN0eHQuZXZlbnQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnZHBy aW50ayhYRU5MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGV2 ZW50ICh0eXBlICV1LCB2ZWN0b3IgJSN4KSBmcm9tIGVtdWxhdGlvblxuIiwKKyAgICAgICAgICAg ICAgICAgICAgIHB0d3JfY3R4dC5jdHh0LmV2ZW50LnR5cGUsIHB0d3JfY3R4dC5jdHh0LmV2ZW50 LnZlY3Rvcik7CisKKyAgICAgICAgLyogRmFsbHRocm91Z2ggKi8KKyAgICBjYXNlIFg4NkVNVUxf T0tBWToKKworICAgICAgICBpZiAoIHB0d3JfY3R4dC5jdHh0LnJldGlyZS5zaW5nbGVzdGVwICkK KyAgICAgICAgICAgIHB2X2luamVjdF9od19leGNlcHRpb24oVFJBUF9kZWJ1ZywgWDg2X0VWRU5U X05PX0VDKTsKKworICAgICAgICAvKiBGYWxsdGhyb3VnaCAqLworICAgIGNhc2UgWDg2RU1VTF9S RVRSWToKKyAgICAgICAgcGVyZmNfaW5jcihwdHdyX2VtdWxhdGlvbnMpOworICAgICAgICByZXR1 cm4gRVhDUkVUX2ZhdWx0X2ZpeGVkOworICAgIH0KKworIGJhaWw6CisgICAgcmV0dXJuIDA7Cit9 CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZhdWx0IGhhbmRsaW5nIGZvciBy ZWFkLW9ubHkgTU1JTyBwYWdlcworICovCisKK2ludCBtbWlvX3JvX2VtdWxhdGVkX3dyaXRlKAor ICAgIGVudW0geDg2X3NlZ21lbnQgc2VnLAorICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorICAg IHZvaWQgKnBfZGF0YSwKKyAgICB1bnNpZ25lZCBpbnQgYnl0ZXMsCisgICAgc3RydWN0IHg4Nl9l bXVsYXRlX2N0eHQgKmN0eHQpCit7CisgICAgc3RydWN0IG1taW9fcm9fZW11bGF0ZV9jdHh0ICpt bWlvX3JvX2N0eHQgPSBjdHh0LT5kYXRhOworCisgICAgLyogT25seSBhbGxvdyBuYXR1cmFsbHkt YWxpZ25lZCBzdG9yZXMgYXQgdGhlIG9yaWdpbmFsICVjcjIgYWRkcmVzcy4gKi8KKyAgICBpZiAo ICgoYnl0ZXMgfCBvZmZzZXQpICYgKGJ5dGVzIC0gMSkpIHx8ICFieXRlcyB8fAorICAgICAgICAg b2Zmc2V0ICE9IG1taW9fcm9fY3R4dC0+Y3IyICkKKyAgICB7CisgICAgICAgIE1FTV9MT0coIm1t aW9fcm9fZW11bGF0ZTogYmFkIGFjY2VzcyAoY3IyPSVseCwgYWRkcj0lbHgsIGJ5dGVzPSV1KSIs CisgICAgICAgICAgICAgICAgbW1pb19yb19jdHh0LT5jcjIsIG9mZnNldCwgYnl0ZXMpOworICAg ICAgICByZXR1cm4gWDg2RU1VTF9VTkhBTkRMRUFCTEU7CisgICAgfQorCisgICAgcmV0dXJuIFg4 NkVNVUxfT0tBWTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB4ODZfZW11bGF0ZV9vcHMgbW1p b19yb19lbXVsYXRlX29wcyA9IHsKKyAgICAucmVhZCAgICAgICA9IHg4NmVtdWxfdW5oYW5kbGVh YmxlX3J3LAorICAgIC5pbnNuX2ZldGNoID0gcHR3cl9lbXVsYXRlZF9yZWFkLAorICAgIC53cml0 ZSAgICAgID0gbW1pb19yb19lbXVsYXRlZF93cml0ZSwKKyAgICAudmFsaWRhdGUgICA9IHB2X2Vt dWxfaXNfbWVtX3dyaXRlLAorICAgIC5jcHVpZCAgICAgID0gcHZfZW11bF9jcHVpZCwKK307CisK K2ludCBtbWNmZ19pbnRlcmNlcHRfd3JpdGUoCisgICAgZW51bSB4ODZfc2VnbWVudCBzZWcsCisg ICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisgICAgdm9pZCAqcF9kYXRhLAorICAgIHVuc2lnbmVk IGludCBieXRlcywKKyAgICBzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKK3sKKyAgICBz dHJ1Y3QgbW1pb19yb19lbXVsYXRlX2N0eHQgKm1taW9fY3R4dCA9IGN0eHQtPmRhdGE7CisKKyAg ICAvKgorICAgICAqIE9ubHkgYWxsb3cgbmF0dXJhbGx5LWFsaWduZWQgc3RvcmVzIG5vIHdpZGVy IHRoYW4gNCBieXRlcyB0byB0aGUKKyAgICAgKiBvcmlnaW5hbCAlY3IyIGFkZHJlc3MuCisgICAg ICovCisgICAgaWYgKCAoKGJ5dGVzIHwgb2Zmc2V0KSAmIChieXRlcyAtIDEpKSB8fCBieXRlcyA+ IDQgfHwgIWJ5dGVzIHx8CisgICAgICAgICBvZmZzZXQgIT0gbW1pb19jdHh0LT5jcjIgKQorICAg IHsKKyAgICAgICAgTUVNX0xPRygibW1jZmdfaW50ZXJjZXB0OiBiYWQgd3JpdGUgKGNyMj0lbHgs IGFkZHI9JWx4LCBieXRlcz0ldSkiLAorICAgICAgICAgICAgICAgIG1taW9fY3R4dC0+Y3IyLCBv ZmZzZXQsIGJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIFg4NkVNVUxfVU5IQU5ETEVBQkxFOworICAg IH0KKworICAgIG9mZnNldCAmPSAweGZmZjsKKyAgICBpZiAoIHBjaV9jb25mX3dyaXRlX2ludGVy Y2VwdChtbWlvX2N0eHQtPnNlZywgbW1pb19jdHh0LT5iZGYsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgb2Zmc2V0LCBieXRlcywgcF9kYXRhKSA+PSAwICkKKyAgICAgICAgcGNp X21tY2ZnX3dyaXRlKG1taW9fY3R4dC0+c2VnLCBQQ0lfQlVTKG1taW9fY3R4dC0+YmRmKSwKKyAg ICAgICAgICAgICAgICAgICAgICAgIFBDSV9ERVZGTjIobW1pb19jdHh0LT5iZGYpLCBvZmZzZXQs IGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgKih1aW50MzJfdCAqKXBfZGF0YSk7CisK KyAgICByZXR1cm4gWDg2RU1VTF9PS0FZOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9l bXVsYXRlX29wcyBtbWNmZ19pbnRlcmNlcHRfb3BzID0geworICAgIC5yZWFkICAgICAgID0geDg2 ZW11bF91bmhhbmRsZWFibGVfcncsCisgICAgLmluc25fZmV0Y2ggPSBwdHdyX2VtdWxhdGVkX3Jl YWQsCisgICAgLndyaXRlICAgICAgPSBtbWNmZ19pbnRlcmNlcHRfd3JpdGUsCisgICAgLnZhbGlk YXRlICAgPSBwdl9lbXVsX2lzX21lbV93cml0ZSwKKyAgICAuY3B1aWQgICAgICA9IHB2X2VtdWxf Y3B1aWQsCit9OworCisvKiBDaGVjayBpZiBndWVzdCBpcyB0cnlpbmcgdG8gbW9kaWZ5IGEgci9v IE1NSU8gcGFnZS4gKi8KK2ludCBtbWlvX3JvX2RvX3BhZ2VfZmF1bHQoc3RydWN0IHZjcHUgKnYs IHVuc2lnbmVkIGxvbmcgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNw dV91c2VyX3JlZ3MgKnJlZ3MpCit7CisgICAgbDFfcGdlbnRyeV90IHB0ZTsKKyAgICB1bnNpZ25l ZCBsb25nIG1mbjsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcl9zaXplID0gaXNfcHZfMzJiaXRfdmNw dSh2KSA/IDMyIDogQklUU19QRVJfTE9ORzsKKyAgICBzdHJ1Y3QgbW1pb19yb19lbXVsYXRlX2N0 eHQgbW1pb19yb19jdHh0ID0geyAuY3IyID0gYWRkciB9OworICAgIHN0cnVjdCB4ODZfZW11bGF0 ZV9jdHh0IGN0eHQgPSB7CisgICAgICAgIC5yZWdzID0gcmVncywKKyAgICAgICAgLnZlbmRvciA9 IHYtPmRvbWFpbi0+YXJjaC5jcHVpZC0+eDg2X3ZlbmRvciwKKyAgICAgICAgLmFkZHJfc2l6ZSA9 IGFkZHJfc2l6ZSwKKyAgICAgICAgLnNwX3NpemUgPSBhZGRyX3NpemUsCisgICAgICAgIC5zd2lu dF9lbXVsYXRlID0geDg2X3N3aW50X2VtdWxhdGVfbm9uZSwKKyAgICAgICAgLmRhdGEgPSAmbW1p b19yb19jdHh0CisgICAgfTsKKyAgICBpbnQgcmM7CisKKyAgICAvKiBBdHRlbXB0IHRvIHJlYWQg dGhlIFBURSB0aGF0IG1hcHMgdGhlIFZBIGJlaW5nIGFjY2Vzc2VkLiAqLworICAgIGd1ZXN0X2dl dF9lZmZfbDFlKGFkZHIsICZwdGUpOworCisgICAgLyogV2UgYXJlIGxvb2tpbmcgb25seSBmb3Ig cmVhZC1vbmx5IG1hcHBpbmdzIG9mIE1NSU8gcGFnZXMuICovCisgICAgaWYgKCAoKGwxZV9nZXRf ZmxhZ3MocHRlKSAmIChfUEFHRV9QUkVTRU5UfF9QQUdFX1JXKSkgIT0gX1BBR0VfUFJFU0VOVCkg KQorICAgICAgICByZXR1cm4gMDsKKworICAgIG1mbiA9IGwxZV9nZXRfcGZuKHB0ZSk7CisgICAg aWYgKCBtZm5fdmFsaWQoX21mbihtZm4pKSApCisgICAgeworICAgICAgICBzdHJ1Y3QgcGFnZV9p bmZvICpwYWdlID0gbWZuX3RvX3BhZ2UobWZuKTsKKyAgICAgICAgc3RydWN0IGRvbWFpbiAqb3du ZXIgPSBwYWdlX2dldF9vd25lcl9hbmRfcmVmZXJlbmNlKHBhZ2UpOworCisgICAgICAgIGlmICgg b3duZXIgKQorICAgICAgICAgICAgcHV0X3BhZ2UocGFnZSk7CisgICAgICAgIGlmICggb3duZXIg IT0gZG9tX2lvICkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICggIXJh bmdlc2V0X2NvbnRhaW5zX3NpbmdsZXRvbihtbWlvX3JvX3JhbmdlcywgbWZuKSApCisgICAgICAg IHJldHVybiAwOworCisgICAgaWYgKCBwY2lfcm9fbW1jZmdfZGVjb2RlKG1mbiwgJm1taW9fcm9f Y3R4dC5zZWcsICZtbWlvX3JvX2N0eHQuYmRmKSApCisgICAgICAgIHJjID0geDg2X2VtdWxhdGUo JmN0eHQsICZtbWNmZ19pbnRlcmNlcHRfb3BzKTsKKyAgICBlbHNlCisgICAgICAgIHJjID0geDg2 X2VtdWxhdGUoJmN0eHQsICZtbWlvX3JvX2VtdWxhdGVfb3BzKTsKKworICAgIHN3aXRjaCAoIHJj ICkKKyAgICB7CisgICAgY2FzZSBYODZFTVVMX0VYQ0VQVElPTjoKKyAgICAgICAgLyoKKyAgICAg ICAgICogVGhpcyBlbXVsYXRpb24gb25seSBjb3ZlcnMgd3JpdGVzIHRvIE1NQ0ZHIHNwYWNlIG9y IHJlYWQtb25seSBNRk5zLgorICAgICAgICAgKiBXZSB0b2xlcmF0ZSAjUEYgKGZyb20gaGl0dGlu ZyBhbiBhZGphY2VudCBwYWdlIG9yIGEgc3VjY2Vzc2Z1bAorICAgICAgICAgKiBjb25jdXJyZW50 IHBhZ2V0YWJsZSB1cGRhdGUpLiAgQW55dGhpbmcgZWxzZSBpcyBhbiBlbXVsYXRpb24gYnVnLAor ICAgICAgICAgKiBvciBhIGd1ZXN0IHBsYXlpbmcgd2l0aCB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFt IHVuZGVyIFhlbidzIGZlZXQuCisgICAgICAgICAqLworICAgICAgICBpZiAoIGN0eHQuZXZlbnQu dHlwZSA9PSBYODZfRVZFTlRUWVBFX0hXX0VYQ0VQVElPTiAmJgorICAgICAgICAgICAgIGN0eHQu ZXZlbnQudmVjdG9yID09IFRSQVBfcGFnZV9mYXVsdCApCisgICAgICAgICAgICBwdl9pbmplY3Rf ZXZlbnQoJmN0eHQuZXZlbnQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnZHByaW50ayhY RU5MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGV2ZW50ICh0 eXBlICV1LCB2ZWN0b3IgJSN4KSBmcm9tIGVtdWxhdGlvblxuIiwKKyAgICAgICAgICAgICAgICAg ICAgIGN0eHQuZXZlbnQudHlwZSwgY3R4dC5ldmVudC52ZWN0b3IpOworCisgICAgICAgIC8qIEZh bGx0aHJvdWdoICovCisgICAgY2FzZSBYODZFTVVMX09LQVk6CisKKyAgICAgICAgaWYgKCBjdHh0 LnJldGlyZS5zaW5nbGVzdGVwICkKKyAgICAgICAgICAgIHB2X2luamVjdF9od19leGNlcHRpb24o VFJBUF9kZWJ1ZywgWDg2X0VWRU5UX05PX0VDKTsKKworICAgICAgICAvKiBGYWxsdGhyb3VnaCAq LworICAgIGNhc2UgWDg2RU1VTF9SRVRSWToKKyAgICAgICAgcGVyZmNfaW5jcihwdHdyX2VtdWxh dGlvbnMpOworICAgICAgICByZXR1cm4gRVhDUkVUX2ZhdWx0X2ZpeGVkOworICAgIH0KKworICAg IHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUFYgTU1VIGh5 cGVyY2FsbHMKKyAqLworbG9uZyBkb19tbXVfdXBkYXRlKAorICAgIFhFTl9HVUVTVF9IQU5ETEVf UEFSQU0obW11X3VwZGF0ZV90KSB1cmVxcywKKyAgICB1bnNpZ25lZCBpbnQgY291bnQsCisgICAg WEVOX0dVRVNUX0hBTkRMRV9QQVJBTSh1aW50KSBwZG9uZSwKKyAgICB1bnNpZ25lZCBpbnQgZm9y ZWlnbmRvbSkKK3sKKyAgICBzdHJ1Y3QgbW11X3VwZGF0ZSByZXE7CisgICAgdm9pZCAqdmE7Cisg ICAgdW5zaWduZWQgbG9uZyBncGZuLCBnbWZuLCBtZm47CisgICAgc3RydWN0IHBhZ2VfaW5mbyAq cGFnZTsKKyAgICB1bnNpZ25lZCBpbnQgY21kLCBpID0gMCwgZG9uZSA9IDAsIHB0X2RvbTsKKyAg ICBzdHJ1Y3QgdmNwdSAqY3VyciA9IGN1cnJlbnQsICp2ID0gY3VycjsKKyAgICBzdHJ1Y3QgZG9t YWluICpkID0gdi0+ZG9tYWluLCAqcHRfb3duZXIgPSBkLCAqcGdfb3duZXI7CisgICAgc3RydWN0 IGRvbWFpbl9tbWFwX2NhY2hlIG1hcGNhY2hlOworICAgIHVpbnQzMl90IHhzbV9uZWVkZWQgPSAw OworICAgIHVpbnQzMl90IHhzbV9jaGVja2VkID0gMDsKKyAgICBpbnQgcmMgPSBwdXRfb2xkX2d1 ZXN0X3RhYmxlKGN1cnIpOworCisgICAgaWYgKCB1bmxpa2VseShyYykgKQorICAgIHsKKyAgICAg ICAgaWYgKCBsaWtlbHkocmMgPT0gLUVSRVNUQVJUKSApCisgICAgICAgICAgICByYyA9IGh5cGVy Y2FsbF9jcmVhdGVfY29udGludWF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgX19IWVBFUlZJ U09SX21tdV91cGRhdGUsICJoaWhpIiwgdXJlcXMsIGNvdW50LCBwZG9uZSwKKyAgICAgICAgICAg ICAgICAgICAgIGZvcmVpZ25kb20pOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAg aWYgKCB1bmxpa2VseShjb3VudCA9PSBNTVVfVVBEQVRFX1BSRUVNUFRFRCkgJiYKKyAgICAgICAg IGxpa2VseShndWVzdF9oYW5kbGVfaXNfbnVsbCh1cmVxcykpICkKKyAgICB7CisgICAgICAgIC8q IFNlZSB0aGUgY3Vyci0+YXJjaC5vbGRfZ3Vlc3RfdGFibGUgcmVsYXRlZAorICAgICAgICAgKiBo eXBlcmNhbGxfY3JlYXRlX2NvbnRpbnVhdGlvbigpIGJlbG93LiAqLworICAgICAgICByZXR1cm4g KGludClmb3JlaWduZG9tOworICAgIH0KKworICAgIGlmICggdW5saWtlbHkoY291bnQgJiBNTVVf VVBEQVRFX1BSRUVNUFRFRCkgKQorICAgIHsKKyAgICAgICAgY291bnQgJj0gfk1NVV9VUERBVEVf UFJFRU1QVEVEOworICAgICAgICBpZiAoIHVubGlrZWx5KCFndWVzdF9oYW5kbGVfaXNfbnVsbChw ZG9uZSkpICkKKyAgICAgICAgICAgICh2b2lkKWNvcHlfZnJvbV9ndWVzdCgmZG9uZSwgcGRvbmUs IDEpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHBlcmZjX2luY3IoY2FsbHNfdG9fbW11X3Vw ZGF0ZSk7CisKKyAgICBpZiAoIHVubGlrZWx5KCFndWVzdF9oYW5kbGVfb2theSh1cmVxcywgY291 bnQpKSApCisgICAgICAgIHJldHVybiAtRUZBVUxUOworCisgICAgaWYgKCAocHRfZG9tID0gZm9y ZWlnbmRvbSA+PiAxNikgIT0gMCApCisgICAgeworICAgICAgICAvKiBQYWdldGFibGVzIGJlbG9u ZyB0byBhIGZvcmVpZ24gZG9tYWluIChQRkQpLiAqLworICAgICAgICBpZiAoIChwdF9vd25lciA9 IHJjdV9sb2NrX2RvbWFpbl9ieV9pZChwdF9kb20gLSAxKSkgPT0gTlVMTCApCisgICAgICAgICAg ICByZXR1cm4gLUVTUkNIOworCisgICAgICAgIGlmICggcHRfb3duZXIgPT0gZCApCisgICAgICAg ICAgICByY3VfdW5sb2NrX2RvbWFpbihwdF9vd25lcik7CisgICAgICAgIGVsc2UgaWYgKCAhcHRf b3duZXItPnZjcHUgfHwgKHYgPSBwdF9vd25lci0+dmNwdVswXSkgPT0gTlVMTCApCisgICAgICAg IHsKKyAgICAgICAgICAgIHJjID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAg ICAgICB9CisgICAgfQorCisgICAgaWYgKCAocGdfb3duZXIgPSBtbV9nZXRfcGdfb3duZXIoKHVp bnQxNl90KWZvcmVpZ25kb20pKSA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHJjID0gLUVTUkNI OworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBkb21haW5fbW1hcF9jYWNoZV9pbml0 KCZtYXBjYWNoZSk7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgIHsK KyAgICAgICAgaWYgKCBjdXJyLT5hcmNoLm9sZF9ndWVzdF90YWJsZSB8fCAoaSAmJiBoeXBlcmNh bGxfcHJlZW1wdF9jaGVjaygpKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJjID0gLUVSRVNU QVJUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHVubGlr ZWx5KF9fY29weV9mcm9tX2d1ZXN0KCZyZXEsIHVyZXFzLCAxKSAhPSAwKSApCisgICAgICAgIHsK KyAgICAgICAgICAgIE1FTV9MT0coIkJhZCBfX2NvcHlfZnJvbV9ndWVzdCIpOworICAgICAgICAg ICAgcmMgPSAtRUZBVUxUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAg ICBjbWQgPSByZXEucHRyICYgKHNpemVvZihsMV9wZ2VudHJ5X3QpLTEpOworCisgICAgICAgIHN3 aXRjaCAoIGNtZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBN TVVfTk9STUFMX1BUX1VQREFURTogTm9ybWFsIHVwZGF0ZSB0byBhbnkgbGV2ZWwgb2YgcGFnZSB0 YWJsZS4KKyAgICAgICAgICAgICAqIE1NVV9VUERBVEVfUFRfUFJFU0VSVkVfQUQ6IEFzIGFib3Zl IGJ1dCBhbHNvIHByZXNlcnZlIChPUikKKyAgICAgICAgICAgICAqIGN1cnJlbnQgQS9EIGJpdHMu CisgICAgICAgICAgICAgKi8KKyAgICAgICAgY2FzZSBNTVVfTk9STUFMX1BUX1VQREFURToKKyAg ICAgICAgY2FzZSBNTVVfUFRfVVBEQVRFX1BSRVNFUlZFX0FEOgorICAgICAgICB7CisgICAgICAg ICAgICBwMm1fdHlwZV90IHAybXQ7CisKKyAgICAgICAgICAgIHJjID0gLUVPUE5PVFNVUFA7Cisg ICAgICAgICAgICBpZiAoIHVubGlrZWx5KHBhZ2luZ19tb2RlX3JlZmNvdW50cyhwdF9vd25lcikp ICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgeHNtX25lZWRlZCB8PSBY U01fTU1VX05PUk1BTF9VUERBVEU7CisgICAgICAgICAgICBpZiAoIGdldF9wdGVfZmxhZ3MocmVx LnZhbCkgJiBfUEFHRV9QUkVTRU5UICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4 c21fbmVlZGVkIHw9IFhTTV9NTVVfVVBEQVRFX1JFQUQ7CisgICAgICAgICAgICAgICAgaWYgKCBn ZXRfcHRlX2ZsYWdzKHJlcS52YWwpICYgX1BBR0VfUlcgKQorICAgICAgICAgICAgICAgICAgICB4 c21fbmVlZGVkIHw9IFhTTV9NTVVfVVBEQVRFX1dSSVRFOworICAgICAgICAgICAgfQorICAgICAg ICAgICAgaWYgKCB4c21fbmVlZGVkICE9IHhzbV9jaGVja2VkICkKKyAgICAgICAgICAgIHsKKyAg ICAgICAgICAgICAgICByYyA9IHhzbV9tbXVfdXBkYXRlKFhTTV9UQVJHRVQsIGQsIHB0X293bmVy LCBwZ19vd25lciwgeHNtX25lZWRlZCk7CisgICAgICAgICAgICAgICAgaWYgKCByYyApCisgICAg ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHhzbV9jaGVja2VkID0geHNt X25lZWRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJjID0gLUVJTlZBTDsKKworICAg ICAgICAgICAgcmVxLnB0ciAtPSBjbWQ7CisgICAgICAgICAgICBnbWZuID0gcmVxLnB0ciA+PiBQ QUdFX1NISUZUOworICAgICAgICAgICAgcGFnZSA9IGdldF9wYWdlX2Zyb21fZ2ZuKHB0X293bmVy LCBnbWZuLCAmcDJtdCwgUDJNX0FMTE9DKTsKKworICAgICAgICAgICAgaWYgKCBwMm1faXNfcGFn ZWQocDJtdCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFTU0VSVCghcGFnZSk7 CisgICAgICAgICAgICAgICAgcDJtX21lbV9wYWdpbmdfcG9wdWxhdGUocGdfb3duZXIsIGdtZm4p OworICAgICAgICAgICAgICAgIHJjID0gLUVOT0VOVDsKKyAgICAgICAgICAgICAgICBicmVhazsK KyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCB1bmxpa2VseSghcGFnZSkgKQorICAg ICAgICAgICAgeworICAgICAgICAgICAgICAgIE1FTV9MT0coIkNvdWxkIG5vdCBnZXQgcGFnZSBm b3Igbm9ybWFsIHVwZGF0ZSIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAg fQorCisgICAgICAgICAgICBtZm4gPSBwYWdlX3RvX21mbihwYWdlKTsKKyAgICAgICAgICAgIHZh ID0gbWFwX2RvbWFpbl9wYWdlX3dpdGhfY2FjaGUobWZuLCAmbWFwY2FjaGUpOworICAgICAgICAg ICAgdmEgPSAodm9pZCAqKSgodW5zaWduZWQgbG9uZyl2YSArCisgICAgICAgICAgICAgICAgICAg ICAgICAgICh1bnNpZ25lZCBsb25nKShyZXEucHRyICYgflBBR0VfTUFTSykpOworCisgICAgICAg ICAgICBpZiAoIHBhZ2VfbG9jayhwYWdlKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAg ICAgc3dpdGNoICggcGFnZS0+dS5pbnVzZS50eXBlX2luZm8gJiBQR1RfdHlwZV9tYXNrICkKKyAg ICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBQR1RfbDFfcGFnZV90YWJsZToK KyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGwxX3BnZW50cnlfdCBsMWUg PSBsMWVfZnJvbV9pbnRwdGUocmVxLnZhbCk7CisgICAgICAgICAgICAgICAgICAgIHAybV90eXBl X3QgbDFlX3AybXQgPSBwMm1fcmFtX3J3OworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcGFn ZV9pbmZvICp0YXJnZXQgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBwMm1fcXVlcnlfdCBx ID0gKGwxZV9nZXRfZmxhZ3MobDFlKSAmIF9QQUdFX1JXKSA/CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgUDJNX1VOU0hBUkUgOiBQMk1fQUxMT0M7CisKKyAgICAgICAg ICAgICAgICAgICAgaWYgKCBwYWdpbmdfbW9kZV90cmFuc2xhdGUocGdfb3duZXIpICkKKyAgICAg ICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGdldF9wYWdlX2Zyb21fZ2ZuKHBnX293bmVyLCBs MWVfZ2V0X3BmbihsMWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgJmwxZV9wMm10LCBxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHAy bV9pc19wYWdlZChsMWVfcDJtdCkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAg ICAgICAgICAgICAgICBpZiAoIHRhcmdldCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg cHV0X3BhZ2UodGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAybV9tZW1fcGFnaW5n X3BvcHVsYXRlKHBnX293bmVyLCBsMWVfZ2V0X3BmbihsMWUpKTsKKyAgICAgICAgICAgICAgICAg ICAgICAgIHJjID0gLUVOT0VOVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwMm1fcmFt X3BhZ2luZ19pbiA9PSBsMWVfcDJtdCAmJiAhdGFyZ2V0ICkKKyAgICAgICAgICAgICAgICAgICAg eworICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSAtRU5PRU5UOworICAgICAgICAgICAgICAg ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAg ICAgLyogSWYgd2UgdHJpZWQgdG8gdW5zaGFyZSBhbmQgZmFpbGVkICovCisgICAgICAgICAgICAg ICAgICAgIGVsc2UgaWYgKCAocSAmIFAyTV9VTlNIQVJFKSAmJiBwMm1faXNfc2hhcmVkKGwxZV9w Mm10KSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8q IFdlIGNvdWxkIG5vdCBoYXZlIG9idGFpbmVkIGEgcGFnZSByZWYuICovCisgICAgICAgICAgICAg ICAgICAgICAgICBBU1NFUlQodGFyZ2V0ID09IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAg ICAgLyogQW5kIG1lbV9zaGFyaW5nX25vdGlmeSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC4gKi8K KyAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICAg ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAg ICAgcmMgPSBtb2RfbDFfZW50cnkodmEsIGwxZSwgbWZuLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjbWQgPT0gTU1VX1BUX1VQREFURV9QUkVTRVJWRV9BRCwgdiwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfb3duZXIpOworICAgICAgICAg ICAgICAgICAgICBpZiAoIHRhcmdldCApCisgICAgICAgICAgICAgICAgICAgICAgICBwdXRfcGFn ZSh0YXJnZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAg ICAgICAgICAgICAgICBjYXNlIFBHVF9sMl9wYWdlX3RhYmxlOgorICAgICAgICAgICAgICAgICAg ICByYyA9IG1vZF9sMl9lbnRyeSh2YSwgbDJlX2Zyb21faW50cHRlKHJlcS52YWwpLCBtZm4sCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9PSBNTVVfUFRfVVBEQVRF X1BSRVNFUlZFX0FELCB2KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg ICAgICAgY2FzZSBQR1RfbDNfcGFnZV90YWJsZToKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBt b2RfbDNfZW50cnkodmEsIGwzZV9mcm9tX2ludHB0ZShyZXEudmFsKSwgbWZuLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPT0gTU1VX1BUX1VQREFURV9QUkVTRVJW RV9BRCwgdik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNh c2UgUEdUX2w0X3BhZ2VfdGFibGU6CisgICAgICAgICAgICAgICAgICAgIHJjID0gbW9kX2w0X2Vu dHJ5KHZhLCBsNGVfZnJvbV9pbnRwdGUocmVxLnZhbCksIG1mbiwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgY21kID09IE1NVV9QVF9VUERBVEVfUFJFU0VSVkVfQUQsIHYp OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUEdUX3dyaXRh YmxlX3BhZ2U6CisgICAgICAgICAgICAgICAgICAgIHBlcmZjX2luY3Iod3JpdGFibGVfbW11X3Vw ZGF0ZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoIHBhZ2luZ193cml0ZV9ndWVzdF9lbnRy eSh2LCB2YSwgcmVxLnZhbCwgX21mbihtZm4pKSApCisgICAgICAgICAgICAgICAgICAgICAgICBy YyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAg ICAgICAgICAgICAgICBwYWdlX3VubG9jayhwYWdlKTsKKyAgICAgICAgICAgICAgICBpZiAoIHJj ID09IC1FSU5UUiApCisgICAgICAgICAgICAgICAgICAgIHJjID0gLUVSRVNUQVJUOworICAgICAg ICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIGdldF9wYWdlX3R5cGUocGFnZSwgUEdUX3dy aXRhYmxlX3BhZ2UpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwZXJmY19pbmNy KHdyaXRhYmxlX21tdV91cGRhdGVzKTsKKyAgICAgICAgICAgICAgICBpZiAoIHBhZ2luZ193cml0 ZV9ndWVzdF9lbnRyeSh2LCB2YSwgcmVxLnZhbCwgX21mbihtZm4pKSApCisgICAgICAgICAgICAg ICAgICAgIHJjID0gMDsKKyAgICAgICAgICAgICAgICBwdXRfcGFnZV90eXBlKHBhZ2UpOworICAg ICAgICAgICAgfQorCisgICAgICAgICAgICB1bm1hcF9kb21haW5fcGFnZV93aXRoX2NhY2hlKHZh LCAmbWFwY2FjaGUpOworICAgICAgICAgICAgcHV0X3BhZ2UocGFnZSk7CisgICAgICAgIH0KKyAg ICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBNTVVfTUFDSFBIWVNfVVBEQVRFOgorICAgICAg ICAgICAgaWYgKCB1bmxpa2VseShkICE9IHB0X293bmVyKSApCisgICAgICAgICAgICB7CisgICAg ICAgICAgICAgICAgcmMgPSAtRVBFUk07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg ICAgICB9CisKKyAgICAgICAgICAgIGlmICggdW5saWtlbHkocGFnaW5nX21vZGVfdHJhbnNsYXRl KHBnX293bmVyKSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJjID0gLUVJTlZB TDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg bWZuID0gcmVxLnB0ciA+PiBQQUdFX1NISUZUOworICAgICAgICAgICAgZ3BmbiA9IHJlcS52YWw7 CisKKyAgICAgICAgICAgIHhzbV9uZWVkZWQgfD0gWFNNX01NVV9NQUNIUEhZU19VUERBVEU7Cisg ICAgICAgICAgICBpZiAoIHhzbV9uZWVkZWQgIT0geHNtX2NoZWNrZWQgKQorICAgICAgICAgICAg eworICAgICAgICAgICAgICAgIHJjID0geHNtX21tdV91cGRhdGUoWFNNX1RBUkdFVCwgZCwgTlVM TCwgcGdfb3duZXIsIHhzbV9uZWVkZWQpOworICAgICAgICAgICAgICAgIGlmICggcmMgKQorICAg ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB4c21fY2hlY2tlZCA9IHhz bV9uZWVkZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggdW5saWtlbHkoIWdl dF9wYWdlX2Zyb21fcGFnZW5yKG1mbiwgcGdfb3duZXIpKSApCisgICAgICAgICAgICB7CisgICAg ICAgICAgICAgICAgTUVNX0xPRygiQ291bGQgbm90IGdldCBwYWdlIGZvciBtYWNoLT5waHlzIHVw ZGF0ZSIpOworICAgICAgICAgICAgICAgIHJjID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBi cmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2V0X2dwZm5fZnJvbV9tZm4obWZu LCBncGZuKTsKKworICAgICAgICAgICAgcGFnaW5nX21hcmtfZGlydHkocGdfb3duZXIsIF9tZm4o bWZuKSk7CisKKyAgICAgICAgICAgIHB1dF9wYWdlKG1mbl90b19wYWdlKG1mbikpOworICAgICAg ICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIE1FTV9MT0coIklu dmFsaWQgcGFnZSB1cGRhdGUgY29tbWFuZCAleCIsIGNtZCk7CisgICAgICAgICAgICByYyA9IC1F Tk9TWVM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggdW5s aWtlbHkocmMpICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGd1ZXN0X2hhbmRsZV9h ZGRfb2Zmc2V0KHVyZXFzLCAxKTsKKyAgICB9CisKKyAgICBpZiAoIHJjID09IC1FUkVTVEFSVCAp CisgICAgeworICAgICAgICBBU1NFUlQoaSA8IGNvdW50KTsKKyAgICAgICAgcmMgPSBoeXBlcmNh bGxfY3JlYXRlX2NvbnRpbnVhdGlvbigKKyAgICAgICAgICAgIF9fSFlQRVJWSVNPUl9tbXVfdXBk YXRlLCAiaGloaSIsCisgICAgICAgICAgICB1cmVxcywgKGNvdW50IC0gaSkgfCBNTVVfVVBEQVRF X1BSRUVNUFRFRCwgcGRvbmUsIGZvcmVpZ25kb20pOworICAgIH0KKyAgICBlbHNlIGlmICggY3Vy ci0+YXJjaC5vbGRfZ3Vlc3RfdGFibGUgKQorICAgIHsKKyAgICAgICAgWEVOX0dVRVNUX0hBTkRM RV9QQVJBTSh2b2lkKSBudWxsOworCisgICAgICAgIEFTU0VSVChyYyB8fCBpID09IGNvdW50KTsK KyAgICAgICAgc2V0X3hlbl9ndWVzdF9oYW5kbGUobnVsbCwgTlVMTCk7CisgICAgICAgIC8qCisg ICAgICAgICAqIEluIG9yZGVyIHRvIGhhdmUgYSB3YXkgdG8gY29tbXVuaWNhdGUgdGhlIGZpbmFs IHJldHVybiB2YWx1ZSB0bworICAgICAgICAgKiBvdXIgY29udGludWF0aW9uLCB3ZSBwYXNzIHRo aXMgaW4gcGxhY2Ugb2YgImZvcmVpZ25kb20iLCBidWlsZGluZworICAgICAgICAgKiBvbiB0aGUg ZmFjdCB0aGF0IHRoaXMgYXJndW1lbnQgaXNuJ3QgbmVlZGVkIGFueW1vcmUuCisgICAgICAgICAq LworICAgICAgICByYyA9IGh5cGVyY2FsbF9jcmVhdGVfY29udGludWF0aW9uKAorICAgICAgICAg ICAgICAgIF9fSFlQRVJWSVNPUl9tbXVfdXBkYXRlLCAiaGloaSIsIG51bGwsCisgICAgICAgICAg ICAgICAgTU1VX1VQREFURV9QUkVFTVBURUQsIG51bGwsIHJjKTsKKyAgICB9CisKKyAgICBtbV9w dXRfcGdfb3duZXIocGdfb3duZXIpOworCisgICAgZG9tYWluX21tYXBfY2FjaGVfZGVzdHJveSgm bWFwY2FjaGUpOworCisgICAgcGVyZmNfYWRkKG51bV9wYWdlX3VwZGF0ZXMsIGkpOworCisgb3V0 OgorICAgIGlmICggcHRfb3duZXIgIT0gZCApCisgICAgICAgIHJjdV91bmxvY2tfZG9tYWluKHB0 X293bmVyKTsKKworICAgIC8qIEFkZCBpbmNyZW1lbnRhbCB3b3JrIHdlIGhhdmUgZG9uZSB0byB0 aGUgQGRvbmUgb3V0cHV0IHBhcmFtZXRlci4gKi8KKyAgICBpZiAoIHVubGlrZWx5KCFndWVzdF9o YW5kbGVfaXNfbnVsbChwZG9uZSkpICkKKyAgICB7CisgICAgICAgIGRvbmUgKz0gaTsKKyAgICAg ICAgY29weV90b19ndWVzdChwZG9uZSwgJmRvbmUsIDEpOworICAgIH0KKworICAgIHJldHVybiBy YzsKK30KKworc3RhdGljIGludCBfX2RvX3VwZGF0ZV92YV9tYXBwaW5nKAorICAgIHVuc2lnbmVk IGxvbmcgdmEsIHU2NCB2YWw2NCwgdW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IGRvbWFpbiAq cGdfb3duZXIpCit7CisgICAgbDFfcGdlbnRyeV90ICAgdmFsID0gbDFlX2Zyb21faW50cHRlKHZh bDY0KTsKKyAgICBzdHJ1Y3QgdmNwdSAgICp2ICAgPSBjdXJyZW50OworICAgIHN0cnVjdCBkb21h aW4gKmQgICA9IHYtPmRvbWFpbjsKKyAgICBzdHJ1Y3QgcGFnZV9pbmZvICpnbDFwZzsKKyAgICBs MV9wZ2VudHJ5X3QgICpwbDFlOworICAgIHVuc2lnbmVkIGxvbmcgIGJtYXBfcHRyLCBnbDFtZm47 CisgICAgY3B1bWFza190ICAgICAqbWFzayA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgcmM7 CisKKyAgICBwZXJmY19pbmNyKGNhbGxzX3RvX3VwZGF0ZV92YSk7CisKKyAgICByYyA9IHhzbV91 cGRhdGVfdmFfbWFwcGluZyhYU01fVEFSR0VULCBkLCBwZ19vd25lciwgdmFsKTsKKyAgICBpZiAo IHJjICkKKyAgICAgICAgcmV0dXJuIHJjOworCisgICAgcmMgPSAtRUlOVkFMOworICAgIHBsMWUg PSBndWVzdF9tYXBfbDFlKHZhLCAmZ2wxbWZuKTsKKyAgICBpZiAoIHVubGlrZWx5KCFwbDFlIHx8 ICFnZXRfcGFnZV9mcm9tX3BhZ2VucihnbDFtZm4sIGQpKSApCisgICAgICAgIGdvdG8gb3V0Owor CisgICAgZ2wxcGcgPSBtZm5fdG9fcGFnZShnbDFtZm4pOworICAgIGlmICggIXBhZ2VfbG9jayhn bDFwZykgKQorICAgIHsKKyAgICAgICAgcHV0X3BhZ2UoZ2wxcGcpOworICAgICAgICBnb3RvIG91 dDsKKyAgICB9CisKKyAgICBpZiAoIChnbDFwZy0+dS5pbnVzZS50eXBlX2luZm8gJiBQR1RfdHlw ZV9tYXNrKSAhPSBQR1RfbDFfcGFnZV90YWJsZSApCisgICAgeworICAgICAgICBwYWdlX3VubG9j ayhnbDFwZyk7CisgICAgICAgIHB1dF9wYWdlKGdsMXBnKTsKKyAgICAgICAgZ290byBvdXQ7Cisg ICAgfQorCisgICAgcmMgPSBtb2RfbDFfZW50cnkocGwxZSwgdmFsLCBnbDFtZm4sIDAsIHYsIHBn X293bmVyKTsKKworICAgIHBhZ2VfdW5sb2NrKGdsMXBnKTsKKyAgICBwdXRfcGFnZShnbDFwZyk7 CisKKyBvdXQ6CisgICAgaWYgKCBwbDFlICkKKyAgICAgICAgZ3Vlc3RfdW5tYXBfbDFlKHBsMWUp OworCisgICAgc3dpdGNoICggZmxhZ3MgJiBVVk1GX0ZMVVNIVFlQRV9NQVNLICkKKyAgICB7Cisg ICAgY2FzZSBVVk1GX1RMQl9GTFVTSDoKKyAgICAgICAgc3dpdGNoICggKGJtYXBfcHRyID0gZmxh Z3MgJiB+VVZNRl9GTFVTSFRZUEVfTUFTSykgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgVVZN Rl9MT0NBTDoKKyAgICAgICAgICAgIGZsdXNoX3RsYl9sb2NhbCgpOworICAgICAgICAgICAgYnJl YWs7CisgICAgICAgIGNhc2UgVVZNRl9BTEw6CisgICAgICAgICAgICBtYXNrID0gZC0+ZG9tYWlu X2RpcnR5X2NwdW1hc2s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAg ICAgICAgICAgIG1hc2sgPSB0aGlzX2NwdShzY3JhdGNoX2NwdW1hc2spOworICAgICAgICAgICAg cmMgPSBtbV92Y3B1bWFza190b19wY3B1bWFzayhkLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb25zdF9ndWVzdF9oYW5kbGVfZnJvbV9wdHIoYm1hcF9wdHIsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB2b2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgbWFzayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIG1h c2sgKQorICAgICAgICAgICAgZmx1c2hfdGxiX21hc2sobWFzayk7CisgICAgICAgIGJyZWFrOwor CisgICAgY2FzZSBVVk1GX0lOVkxQRzoKKyAgICAgICAgc3dpdGNoICggKGJtYXBfcHRyID0gZmxh Z3MgJiB+VVZNRl9GTFVTSFRZUEVfTUFTSykgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgVVZN Rl9MT0NBTDoKKyAgICAgICAgICAgIHBhZ2luZ19pbnZscGcodiwgdmEpOworICAgICAgICAgICAg YnJlYWs7CisgICAgICAgIGNhc2UgVVZNRl9BTEw6CisgICAgICAgICAgICBtYXNrID0gZC0+ZG9t YWluX2RpcnR5X2NwdW1hc2s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoK KyAgICAgICAgICAgIG1hc2sgPSB0aGlzX2NwdShzY3JhdGNoX2NwdW1hc2spOworICAgICAgICAg ICAgcmMgPSBtbV92Y3B1bWFza190b19wY3B1bWFzayhkLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBjb25zdF9ndWVzdF9oYW5kbGVfZnJvbV9wdHIoYm1hcF9wdHIs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB2b2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgbWFzayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAo IG1hc2sgKQorICAgICAgICAgICAgZmx1c2hfdGxiX29uZV9tYXNrKG1hc2ssIHZhKTsKKyAgICAg ICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJjOworfQorCitsb25nIGRvX3VwZGF0ZV92 YV9tYXBwaW5nKHVuc2lnbmVkIGxvbmcgdmEsIHU2NCB2YWw2NCwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKyAgICByZXR1cm4gX19kb191cGRhdGVf dmFfbWFwcGluZyh2YSwgdmFsNjQsIGZsYWdzLCBjdXJyZW50LT5kb21haW4pOworfQorCitsb25n IGRvX3VwZGF0ZV92YV9tYXBwaW5nX290aGVyZG9tYWluKHVuc2lnbmVkIGxvbmcgdmEsIHU2NCB2 YWw2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9u ZyBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9taWRfdCBk b21pZCkKK3sKKyAgICBzdHJ1Y3QgZG9tYWluICpwZ19vd25lcjsKKyAgICBpbnQgcmM7CisKKyAg ICBpZiAoIChwZ19vd25lciA9IG1tX2dldF9wZ19vd25lcihkb21pZCkpID09IE5VTEwgKQorICAg ICAgICByZXR1cm4gLUVTUkNIOworCisgICAgcmMgPSBfX2RvX3VwZGF0ZV92YV9tYXBwaW5nKHZh LCB2YWw2NCwgZmxhZ3MsIHBnX293bmVyKTsKKworICAgIG1tX3B1dF9wZ19vd25lcihwZ19vd25l cik7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBt b2RlOiBDCisgKiBjLWZpbGUtc3R5bGU6ICJCU0QiCisgKiBjLWJhc2ljLW9mZnNldDogNAorICog dGFiLXdpZHRoOiA0CisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIEVuZDoKKyAqLwpkaWZm IC0tZ2l0IGEveGVuL2luY2x1ZGUvYXNtLXg4Ni9tbS5oIGIveGVuL2luY2x1ZGUvYXNtLXg4Ni9t bS5oCmluZGV4IDk2N2I3ZmNkYTkuLjE3MDkwOGY3ZjIgMTAwNjQ0Ci0tLSBhL3hlbi9pbmNsdWRl L2FzbS14ODYvbW0uaAorKysgYi94ZW4vaW5jbHVkZS9hc20teDg2L21tLmgKQEAgLTY0OSw2ICs2 NDksMTEgQEAgaW50IG1tX3ZjcHVtYXNrX3RvX3BjcHVtYXNrKHN0cnVjdCBkb21haW4gKmQsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVOX0dVRVNUX0hBTkRMRV9QQVJBTShjb25zdF92 b2lkKSBibWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwdW1hc2tfdCAqcG1hc2sp OwogCitpbnQgY3JlYXRlX2dyYW50X3B2X21hcHBpbmcodWludDY0X3QgYWRkciwgdW5zaWduZWQg bG9uZyBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxh Z3MsIHVuc2lnbmVkIGludCBjYWNoZV9mbGFncyk7CitpbnQgcmVwbGFjZV9ncmFudF9wdl9tYXBw aW5nKHVpbnQ2NF90IGFkZHIsIHVuc2lnbmVkIGxvbmcgZnJhbWUsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHVpbnQ2NF90IG5ld19hZGRyLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworCiAj ZGVmaW5lIE1FTV9MT0coX2YsIF9hLi4uKSBnZHByaW50ayhYRU5MT0dfV0FSTklORyAsIF9mICJc biIgLCAjIyBfYSkKIAogI2RlZmluZSBQQUdFX0NBQ0hFX0FUVFJTIChfUEFHRV9QQVR8X1BBR0Vf UENEfF9QQUdFX1BXVCkKLS0gCjIuMTEuMAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3Rz Lnhlbi5vcmcKaHR0cHM6Ly9saXN0cy54ZW4ub3JnL3hlbi1kZXZlbAo=