From mboxrd@z Thu Jan 1 00:00:00 1970 From: James Chapman Subject: PPP-over-L2TP kernel support, patch for review Date: Mon, 6 Sep 2004 12:59:16 +0100 Sender: netdev-bounce@oss.sgi.com Message-ID: <1094471956.413c5114de2d7@www.katalix.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="-MOQ10944719560baa5174fac6e4ed97ac1aeaf3061f31" Cc: Martijn van Oosterhout Return-path: To: netdev@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com List-Id: netdev.vger.kernel.org This message is in MIME format. ---MOQ10944719560baa5174fac6e4ed97ac1aeaf3061f31 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Attached this time... sorry. Attached is a PPP-over-L2TP driver for review. The patch is against vanilla 2.6.8.1. It was originally developed for 2.4 and forward- ported to 2.6 so please look for typical 2.4-to-2.6 porting bugs. The original version of this driver was written by Martijn van Oosterhout, distributed as kl2tp-0.2 last year. Note that this code handles only the datapath of L2TP; a userland daemon runs the L2TP control protocol, setting up tunnels and sessions with its peers. OpenL2TP is a recently released L2TP client/server written specifically for Linux and includes this driver in its distribution, http://openl2tp.sourceforge.net. I'm working towards having this driver integrated into the kernel tree. Comments? /jc ---MOQ10944719560baa5174fac6e4ed97ac1aeaf3061f31 Content-Type: application/octet-stream; name="pppol2tp-linux-2.6.8.1.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pppol2tp-linux-2.6.8.1.patch" ZGlmZiAtTmF1ciBsaW51eC0yLjYuOC4xLm9yaWcvZHJpdmVycy9uZXQvS2NvbmZpZyBsaW51eC0y LjYuOC4xL2RyaXZlcnMvbmV0L0tjb25maWcKLS0tIGxpbnV4LTIuNi44LjEub3JpZy9kcml2ZXJz L25ldC9LY29uZmlnCTIwMDQtMDgtMTQgMTE6NTY6MDAuMDAwMDAwMDAwICswMTAwCisrKyBsaW51 eC0yLjYuOC4xL2RyaXZlcnMvbmV0L0tjb25maWcJMjAwNC0wOS0wNCAwMTowMjowMC4wMDAwMDAw MDAgKzAxMDAKQEAgLTI0ODEsNiArMjQ4MSwxOSBAQAogCSAgd2hpY2ggY2FuIGxlYWQgdG8gYmFk IHJlc3VsdHMgaWYgdGhlIEFUTSBwZWVyIGxvc2VzIHN0YXRlIGFuZAogCSAgY2hhbmdlcyBpdHMg ZW5jYXBzdWxhdGlvbiB1bmlsYXRlcmFsbHkuCiAKK2NvbmZpZyBQUFBPTDJUUAorCXRyaXN0YXRl ICJQUFAgb3ZlciBMMlRQIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFM ICYmIFBQUE9FCisJaGVscAorCSAgU3VwcG9ydCBmb3IgUFBQLW92ZXItTDJUUCBzb2NrZXQgZmFt aWx5LiBMMlRQIGlzIGEgcHJvdG9jb2wKKwkgIHVzZWQgYnkgSVNQcyBhbmQgZW50ZXJwcmlzZXMg dG8gdHVubmVsIFBQUCB0cmFmZmljIG92ZXIgVURQCisJICB0dW5uZWxzLiBMMlRQIGlzIHJlcGxh Y2luZyBQUFRQIGZvciBWUE4gdXNlcy4KKworCSAgVGhpcyBrZXJuZWwgY29tcG9uZW50IGhhbmRs ZXMgb25seSBMMlRQIGRhdGEgcGFja2V0czogYQorCSAgdXNlcmxhbmQgZGFlbW9uIGhhbmRsZXMg TDJUUCB0aGUgY29udHJvbCBwcm90b2NvbCAodHVubmVsCisJICBhbmQgc2Vzc2lvbiBzZXR1cCku IE9uZSBzdWNoIGRhZW1vbiBpcyBPcGVuTDJUUAorCSAgKGh0dHA6Ly9vcGVubDJ0cC5zb3VyY2Vm b3JnZS5uZXQvKS4KKwogY29uZmlnIFNMSVAKIAl0cmlzdGF0ZSAiU0xJUCAoc2VyaWFsIGxpbmUp IHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVRERVZJQ0VTCmRpZmYgLU5hdXIgbGludXgtMi42Ljgu MS5vcmlnL2RyaXZlcnMvbmV0L01ha2VmaWxlIGxpbnV4LTIuNi44LjEvZHJpdmVycy9uZXQvTWFr ZWZpbGUKLS0tIGxpbnV4LTIuNi44LjEub3JpZy9kcml2ZXJzL25ldC9NYWtlZmlsZQkyMDA0LTA4 LTE0IDExOjU1OjA5LjAwMDAwMDAwMCArMDEwMAorKysgbGludXgtMi42LjguMS9kcml2ZXJzL25l dC9NYWtlZmlsZQkyMDA0LTA5LTAxIDE3OjU3OjA3LjAwMDAwMDAwMCArMDEwMApAQCAtMTAxLDYg KzEwMSw3IEBACiBvYmotJChDT05GSUdfUFBQX0RFRkxBVEUpICs9IHBwcF9kZWZsYXRlLm8KIG9i ai0kKENPTkZJR19QUFBfQlNEQ09NUCkgKz0gYnNkX2NvbXAubwogb2JqLSQoQ09ORklHX1BQUE9F KSArPSBwcHBveC5vIHBwcG9lLm8KK29iai0kKENPTkZJR19QUFBPTDJUUCkgKz0gcHBwb3gubyBw cHBvbDJ0cC5vCiAKIG9iai0kKENPTkZJR19TTElQKSArPSBzbGlwLm8KIGlmZXEgKCQoQ09ORklH X1NMSVBfQ09NUFJFU1NFRCkseSkKZGlmZiAtTmF1ciBsaW51eC0yLjYuOC4xLm9yaWcvZHJpdmVy cy9uZXQvcHBwb2wydHAuYyBsaW51eC0yLjYuOC4xL2RyaXZlcnMvbmV0L3BwcG9sMnRwLmMKLS0t IGxpbnV4LTIuNi44LjEub3JpZy9kcml2ZXJzL25ldC9wcHBvbDJ0cC5jCTE5NzAtMDEtMDEgMDE6 MDA6MDAuMDAwMDAwMDAwICswMTAwCisrKyBsaW51eC0yLjYuOC4xL2RyaXZlcnMvbmV0L3BwcG9s MnRwLmMJMjAwNC0wOS0wNCAwMTowMDoyMy4wMDAwMDAwMDAgKzAxMDAKQEAgLTAsMCArMSwyMzU5 IEBACisvKiogLSotIGxpbnV4LWMgLSotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMaW51eCBQUFAgb3ZlciBMMlRQIChQUFBv WC9QUFBvTDJUUCkgU29ja2V0cworICoKKyAqIFBQUG9YICAgIC0tLSBHZW5lcmljIFBQUCBlbmNh cHN1bGF0aW9uIHNvY2tldCBmYW1pbHkKKyAqIFBQUG9MMlRQIC0tLSBQUFAgb3ZlciBMMlRQIChS RkMgMjY2MSkKKyAqCisgKgorICogVmVyc2lvbjogICAgMC4zLjAKKyAqCisgKiAyNTEwMDMgOglD b3BpZWQgZnJvbSBwcHBvZS5jIHZlcnNpb24gMC42LjkuCisgKgorICogQXV0aG9yOglNYXJ0aWpu IHZhbiBPb3N0ZXJob3V0IDxrbGVwdG9nQHN2YW5hLm9yZz4KKyAqIENvbnRyaWJ1dG9yczoKKyAq CQlNaWNoYWwgT3N0cm93c2tpIDxtb3N0cm93c0BzcGVha2Vhc3kubmV0PgorICoJCUFybmFsZG8g Q2FydmFsaG8gZGUgTWVsbyA8YWNtZUB4Y29uZWN0aXZhLmNvbS5icj4KKyAqCQlEYXZpZCBTLiBN aWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKgkJSmFtZXMgQ2hhcG1hbiAoamNoYXBtYW5Aa2F0 YWxpeC5jb20pCisgKgorICogTGljZW5zZToKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJs aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAq CQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u LgorICoKKyAqLworCisvKiBUaGlzIGRyaXZlciBoYW5kbGVzIG9ubHkgTDJUUCBkYXRhIGZyYW1l czsgY29udHJvbCBmcmFtZXMgYXJlIGhhbmRsZWQgYnkgYQorICogdXNlcnNwYWNlIGFwcGxpY2F0 aW9uLgorICoKKyAqIFRvIHNlbmQgZGF0YSBpbiBhbiBMMlRQIHNlc3Npb24sIHVzZXJzcGFjZSBv cGVucyBhIFBQUG9MMlRQIHNvY2tldCBhbmQKKyAqIGF0dGFjaGVzIGl0IHRvIGEgYm91bmQgVURQ IHNvY2tldCB3aXRoIGxvY2FsIHR1bm5lbF9pZCAvIHNlc3Npb25faWQgYW5kCisgKiBwZWVyIHR1 bm5lbF9pZCAvIHNlc3Npb25faWQgc2V0LiBEYXRhIGNhbiB0aGVuIGJlIHNlbnQgb3IgcmVjZWl2 ZWQgdXNpbmcKKyAqIHJlZ3VsYXIgc29ja2V0IHNlbmRtc2coKSAvIHJlY3Ztc2coKSBjYWxscy4g S2VybmVsIHBhcmFtZXRlcnMgb2YgdGhlIHNvY2tldAorICogY2FuIGJlIHJlYWQgb3IgbW9kaWZp ZWQgdXNpbmcgaW9jdGwoKSBvciBbZ3NdZXRzb2Nrb3B0KCkgY2FsbHMuCisgKgorICogV2hlbiBh IFBQUG9MMlRQIHNvY2tldCBpcyBjb25uZWN0ZWQgd2l0aCBsb2NhbCBhbmQgcGVlciBzZXNzaW9u X2lkIHZhbHVlcworICogemVybywgdGhlIHNvY2tldCBpcyB0cmVhdGVkIGFzIGEgc3BlY2lhbCB0 dW5uZWwgbWFuYWdlbWVudCBzb2NrZXQuCisgKgorICogSGVyZSdzIGV4YW1wbGUgdXNlcnNwYWNl IGNvZGUgdG8gY3JlYXRlIGEgc29ja2V0IGZvciBzZW5kaW5nL3JlY2VpdmluZyBkYXRhCisgKiBv dmVyIGFuIEwyVFAgc2Vzc2lvbjotCisgKgorICoJc3RydWN0IHNvY2thZGRyX3BwcG94IHNheDsK KyAqCWludCBmZDsKKyAqCWludCBzZXNzaW9uX2ZkOworICoJCisgKglmZCA9IHNvY2tldChBRl9Q UFBPWCwgU09DS19ER1JBTSwgUFhfUFJPVE9fT0wyVFApOworICoKKyAqCXNheC5zYV9mYW1pbHkg PSBBRl9QUFBPWDsKKyAqCXNheC5zYV9wcm90b2NvbCA9IFBYX1BST1RPX09MMlRQOworICoJc2F4 LnNhX2FkZHIucHBwb2wydHAuZmQgPSB0dW5uZWxfZmQ7IC8vIGJvdW5kIFVEUCBzb2NrZXQKKyAq CXNheC5zYV9hZGRyLnBwcG9sMnRwLmFkZHIuc2luX2FkZHIuc19hZGRyID0gYWRkci0+c2luX2Fk ZHIuc19hZGRyOworICoJc2F4LnNhX2FkZHIucHBwb2wydHAuYWRkci5zaW5fcG9ydCA9IGFkZHIt PnNpbl9wb3J0OworICoJc2F4LnNhX2FkZHIucHBwb2wydHAuYWRkci5zaW5fZmFtaWx5ID0gQUZf SU5FVDsKKyAqCXNheC5zYV9hZGRyLnBwcG9sMnRwLnNfdHVubmVsICA9IHR1bm5lbF9pZDsKKyAq CXNheC5zYV9hZGRyLnBwcG9sMnRwLnNfc2Vzc2lvbiA9IHNlc3Npb25faWQ7CisgKglzYXguc2Ff YWRkci5wcHBvbDJ0cC5kX3R1bm5lbCAgPSBwZWVyX3R1bm5lbF9pZDsKKyAqCXNheC5zYV9hZGRy LnBwcG9sMnRwLmRfc2Vzc2lvbiA9IHBlZXJfc2Vzc2lvbl9pZDsKKyAqICAKKyAqCXNlc3Npb25f ZmQgPSBjb25uZWN0KGZkLCAoc3RydWN0IHNvY2thZGRyICopJnNheCwgc2l6ZW9mKHNheCkpOwor ICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9k dWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nl c3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVk Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisK KyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNp bmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Cisj aW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUg PGxpbnV4L2lmX3BwcG94Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51 eC9wcHBfY2hhbm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CisjaW5jbHVkZSA8 bGludXgvaWZfcHBwLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4 L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20v YXRvbWljLmg+CisKKyNkZWZpbmUgUFBQT0wyVFBfRFJWX1ZFUlNJT04JIlYwLjMiCisKKy8qIERl dmVsb3BlciBkZWJ1ZyBjb2RlLiAqLworI2lmIDAKKyNkZWZpbmUgREVCVUcJLyogRGVmaW5lIHRv IGNvbXBpbGUgaW4gdmVyeSB2ZXJib3NlIGRldmVsb3BlciBkZWJ1ZyAqLworI2VuZGlmCisKKy8q IFRpbWVvdXRzIGFyZSBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzIHRvL2Zyb20gdXNlcnNwYWNl ICovCisjZGVmaW5lIEpJRkZJRVNfVE9fTVModCkgKCh0KSAqIDEwMDAgLyBIWikKKyNkZWZpbmUg TVNfVE9fSklGRklFUyhqKSAoKGogKiBIWikgLyAxMDAwKQorCisvKiBMMlRQIGhlYWRlciBjb25z dGFudHMgKi8KKyNkZWZpbmUgTDJUUF9IRFJGTEFHX1QJICAgMHg4MDAwCisjZGVmaW5lIEwyVFBf SERSRkxBR19MCSAgIDB4NDAwMAorI2RlZmluZSBMMlRQX0hEUkZMQUdfUwkgICAweDA4MDAKKyNk ZWZpbmUgTDJUUF9IRFJGTEFHX08JICAgMHgwMjAwCisjZGVmaW5lIEwyVFBfSERSRkxBR19QCSAg IDB4MDEwMAorCisjZGVmaW5lIEwyVFBfSERSX1ZFUl9NQVNLICAweDAwMEYKKyNkZWZpbmUgTDJU UF9IRFJfVkVSCSAgIDB4MDAwMgorCisvKiBTcGFjZSBmb3IgVURQLCBMMlRQIGFuZCBQUFAgaGVh ZGVycywgcGx1cyBzb21lIHNsYWNrICovCisjZGVmaW5lIFBQUE9MMlRQX0hFQURFUl9PVkVSSEVB RAk0MAorCisvKiBKdXN0IHNvbWUgcmFuZG9tIG51bWJlcnMgKi8KKyNkZWZpbmUgTDJUUF9UVU5O RUxfTUFHSUMgICAweDQyMTE0RERBCisjZGVmaW5lIEwyVFBfU0VTU0lPTl9NQUdJQyAgMHgwQzA0 RUI3RAorCisjZGVmaW5lIFBQUE9MMlRQX0hBU0hfQklUUyA0CisjZGVmaW5lIFBQUE9MMlRQX0hB U0hfU0laRSAoMTw8UFBQT0wyVFBfSEFTSF9CSVRTKQorCisvKiBEZWZhdWx0IHRyYWNlIGZsYWdz ICovCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgUFBQT0wyVFBfREVGQVVMVF9ERUJVR19GTEFHUwkt MQorI2Vsc2UKKyNkZWZpbmUgUFBQT0wyVFBfREVGQVVMVF9ERUJVR19GTEFHUwkwCisjZW5kaWYK KworCisvKiBEZWJ1ZyBrZXJuZWwgbWVzc2FnZSBjb250cm9sLgorICogVmVyYm9zZSBkZWJ1ZyBt ZXNzYWdlcyAoTDJUUF9NU0dfREVCVUcgZmxhZykgYXJlIG9wdGlvbmFsbHkgY29tcGlsZWQgaW4u CisgKi8KKyNpZmRlZiBERUJVRworI2RlZmluZSBEUFJJTlRLKF9tYXNrLCBfZm10LCBhcmdzLi4u KQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKChfbWFzaykgJiBQUFBPTDJUUF9NU0dfREVC VUcpCQkJXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgIlBQUE9MMlRQICVzOiAiIF9mbXQsCQlcCisJ CQkgICAgICAgX19GVU5DVElPTl9fLCAjI2FyZ3MpOwkJCVwKKwl9IHdoaWxlKDApCisjZWxzZQor I2RlZmluZSBEUFJJTlRLKF9tYXNrLCBzcmdzLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZiAv KiBERUJVRyAqLworCisjZGVmaW5lIFBSSU5USyhfbWFzaywgX3R5cGUsIF9sdmwsIF9mbXQsIGFy Z3MuLi4pCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKChfbWFzaykgJiAoX3R5cGUpKQkJCQkJ XAorCQkJcHJpbnRrKF9sdmwgIlBQUE9MMlRQOiAiIF9mbXQsICMjYXJncyk7CQlcCisJfSB3aGls ZSgwKQorCisvKiBFeHRyYSBkcml2ZXIgZGVidWcuIFNob3VsZCBvbmx5IGJlIGVuYWJsZWQgYnkg ZGV2ZWxvcGVycyB3b3JraW5nIG9uCisgKiB0aGlzIGRyaXZlci4gCisgKi8KKyNpZmRlZiBERUJV RworI2RlZmluZSBFTlRFUl9GVU5DVElPTgkgcHJpbnRrKEtFUk5fREVCVUcgIlBQUE9MMlRQOiAt LT4gJXNcbiIsIF9fRlVOQ1RJT05fXykKKyNkZWZpbmUgRVhJVF9GVU5DVElPTgkgcHJpbnRrKEtF Uk5fREVCVUcgIlBQUE9MMlRQOiA8LS0gJXNcbiIsIF9fRlVOQ1RJT05fXykKKyNlbHNlCisjZGVm aW5lIEVOVEVSX0ZVTkNUSU9OCSBkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgRVhJVF9GVU5DVElP TgkgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworc3RydWN0IHBwcG9sMnRwX3R1bm5lbDsKKwor LyogRGVzY3JpYmVzIGEgc2Vzc2lvbi4gSXQgaXMgdGhlIHNrX3VzZXJfZGF0YSBmaWVsZCBpbiB0 aGUgUFBQb0wyVFAKKyAqIHNvY2tldC4gQ29udGFpbnMgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5l IGluY29taW5nIHBhY2tldHMgYW5kIHRyYW5zbWl0CisgKiBvdXRnb2luZyBvbmVzLgorICovCitz dHJ1Y3QgcHBwb2wydHBfc2Vzc2lvbgoreworCWludAkJCW1hZ2ljOwkJLyogc2hvdWxkIGJlIEwy VFBfU0VTU0lPTl9NQUdJQyAqLworCWludAkJCW93bmVyOwkJLyogcGlkIHRoYXQgb3BlbmVkIHRo ZSBzb2NrZXQgKi8KKwkKKwlzdHJ1Y3Qgc29jawkJKnNvY2s7CQkvKiBQb2ludGVyIHRvIHRoZSBz ZXNzaW9uCisJCQkJCQkgKiBQUFBvWCBzb2NrZXQgKi8KKwlzdHJ1Y3Qgc29jawkJKnR1bm5lbF9z b2NrOwkvKiBQb2ludGVyIHRvIHRoZSB0dW5uZWwgVURQIAorCQkJCQkJICogc29ja2V0ICovCisJ CisJc3RydWN0IHBwcG9sMnRwX2FkZHIJdHVubmVsX2FkZHI7CS8qIERlc2NyaXB0aW9uIG9mIHR1 bm5lbCAqLworCisJc3RydWN0IHBwcG9sMnRwX3R1bm5lbAkqdHVubmVsOwkvKiBiYWNrIHBvaW50 ZXIgdG8gdHVubmVsIGNvbnRleHQgKi8KKwkKKwljaGFyCQkJbmFtZVsyMF07CS8qICJzZXNzIHh4 eHh4L3l5eXl5Iiwgd2hlcmUgCisJCQkJCQkgKiB4PXR1bm5lbF9pZCwgeT1zZXNzaW9uX2lkICov CisJaW50CQkJbXR1OworCWludAkJCW1ydTsKKwlpbnQJCQlmbGFnczsJCS8qIGFjY2Vzc2VkIGJ5 IFBQUElPQ0dGTEFHUy4gCisJCQkJCQkgKiBVbnVzZWQuICovCisJaW50CQkJcmVjdl9zZXE6MTsJ LyogZXhwZWN0IHJlY2VpdmUgcGFja2V0cyB3aXRoIAorCQkJCQkJICogc2VxdWVuY2UgbnVtYmVy cz8gKi8KKwlpbnQJCQlzZW5kX3NlcToxOwkvKiBzZW5kIHBhY2tldHMgd2l0aCBzZXF1ZW5jZSAK KwkJCQkJCSAqIG51bWJlcnM/ICovCisJaW50CQkJbG5zX21vZGU6MTsJLyogYmVoYXZlIGFzIExO Uz8gTEFDIGVuYWJsZXMgCisJCQkJCQkgKiBzZXF1ZW5jZSBudW1iZXJzIHVuZGVyIAorCQkJCQkJ ICogY29udHJvbCBvZiBMTlMuICovCisJaW50CQkJZGVidWc7CQkvKiBiaXRtYXNrIG9mIGRlYnVn IG1lc3NhZ2UgCisJCQkJCQkgKiBjYXRlZ29yaWVzICovCisJaW50CQkJcmVvcmRlcl90aW1lb3V0 OyAvKiBjb25maWd1cmVkIHJlb3JkZXIgdGltZW91dCAKKwkJCQkJCSAgKiAoaW4gamlmZmllcykg Ki8KKwl1MTYJCQlucjsJCS8qIHNlc3Npb24gTlIgc3RhdGUgKHJlY2VpdmUpICovCisJdTE2CQkJ bnM7CQkvKiBzZXNzaW9uIE5SIHN0YXRlIChzZW5kKSAqLworCXN0cnVjdCBwcHBvbDJ0cF9pb2Nf c3RhdHMgc3RhdHM7CisJc3RydWN0IHBwcG9sMnRwX3Nlc3Npb24gKm5leHQ7CQkvKiBOZXh0IGlu IHRoaXMgaGFzaCBjaGFpbiAqLworfTsKKworLyogVGhlIHNrX3VzZXJfZGF0YSBmaWVsZCBvZiB0 aGUgdHVubmVsJ3MgVURQIHNvY2tldC4gSXQgY29udGFpbnMgaW5mbyB0byB0cmFjaworICogYWxs IHRoZSBhc3NvY2lhdGVkIHNlc3Npb25zIHNvIGluY29taW5nIHBhY2tldHMgY2FuIGJlIHNvcnRl ZCBvdXQKKyAqLworc3RydWN0IHBwcG9sMnRwX3R1bm5lbAoreworCWludAkJCW1hZ2ljOwkJLyog U2hvdWxkIGJlIEwyVFBfVFVOTkVMX01BR0lDICovCisJCisJc3RydWN0IHByb3RvCQlvbGRfcHJv dG87CS8qIG9yaWdpbmFsIHByb3RvICovCisJc3RydWN0IHByb3RvCQlsMnRwX3Byb3RvOwkvKiBM MlRQIHByb3RvICovCisJc3RydWN0IHBwcG9sMnRwX3Nlc3Npb24gKmhhc2hbUFBQT0wyVFBfSEFT SF9TSVpFXTsKKwlpbnQJCQlkZWJ1ZzsJCS8qIGJpdG1hc2sgb2YgZGVidWcgbWVzc2FnZSAKKwkJ CQkJCSAqIGNhdGVnb3JpZXMgKi8KKwljaGFyCQkJbmFtZVsxMl07CS8qICJ0dW5sIHh4eHh4IiAq LworCXN0cnVjdCBwcHBvbDJ0cF9pb2Nfc3RhdHMgc3RhdHM7CisJCisJdm9pZCAoKm9sZF9kYXRh X3JlYWR5KShzdHJ1Y3Qgc29jayAqLCBpbnQpOworCXZvaWQgKCpvbGRfc2tfZGVzdHJ1Y3QpKHN0 cnVjdCBzb2NrICopOworCisJc3RydWN0IHNvY2sJCSpzb2NrOwkJLyogUGFyZW50IHNvY2tldCAq LwkKKwlzdHJ1Y3QgcHBwb2wydHBfdHVubmVsCSpuZXh0OwkJLyogS2VlcCBhIGxpc3Qgb2YgYWxs IG9wZW4gCisJCQkJCQkgKiBwcmVwYXJlZCBzb2NrZXRzICovCisKKwlhdG9taWNfdAkJc2Vzc2lv bl9jb3VudDsKK307CisKKy8qIE51bWJlciBvZiBieXRlcyB0byBidWlsZCB0cmFuc21pdCBMMlRQ IGhlYWRlcnMuCisgKiBVbmZvcnR1bmF0ZWx5IHRoZSBzaXplIGlzIGRpZmZlcmVudCBkZXBlbmRp bmcgb24gd2hldGhlciBzZXF1ZW5jZSBudW1iZXJzCisgKiBhcmUgZW5hYmxlZC4KKyAqLworI2Rl ZmluZSBQUFBPTDJUUF9MMlRQX0hEUl9TSVpFX1NFUQkJMTAKKyNkZWZpbmUgUFBQT0wyVFBfTDJU UF9IRFJfU0laRV9OT1NFUQkJNgorCisKK3N0YXRpYyBpbnQgcHBwb2wydHBfeG1pdChzdHJ1Y3Qg cHBwX2NoYW5uZWwgKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IpOworCitzdGF0aWMgc3RydWN0 IHBwcF9jaGFubmVsX29wcyBwcHBvbDJ0cF9jaGFuX29wcyA9IHsgcHBwb2wydHBfeG1pdCAsIE5V TEwgfTsKK3N0YXRpYyBzdHJ1Y3QgcHJvdG9fb3BzIHBwcG9sMnRwX29wczsKK3N0YXRpYyBzdHJ1 Y3QgcHBwb2wydHBfdHVubmVsICpwcHBvbDJ0cF90dW5uZWxfbGlzdDsKKworLyogTWFjcm9zIHRv IGRlcml2ZSBzZXNzaW9uL3R1bm5lbCBjb250ZXh0IHBvaW50ZXJzIGZyb20gYSBzb2NrZXQuICov CisjZGVmaW5lIFNPQ0tfMl9TRVNTSU9OKHNvY2ssIHNlc3Npb24sIGVyciwgZXJydmFsLCBsYWJl bCwgcXVpZXQpIFwKKwlzZXNzaW9uID0gKHN0cnVjdCBwcHBvbDJ0cF9zZXNzaW9uICopKChzb2Nr KS0+c2tfdXNlcl9kYXRhKTsgIFwKKwlpZiAoIXNlc3Npb24gfHwgc2Vzc2lvbi0+bWFnaWMgIT0g TDJUUF9TRVNTSU9OX01BR0lDKSB7CSAgICAgICBcCisJCWlmICghcXVpZXQpIFwKKwkJCXByaW50 ayhLRVJOX0VSUiAiJXM6ICVzOiVkOiBCQUQgU0VTU0lPTiBNQUdJQyAiIFwKKwkJCSAgICAgICAi KCIgI3NvY2sgIj0lcCkgc2Vzc2lvbj0lcCBtYWdpYz0leFxuIiwgXAorCQkJICAgICAgIF9fRlVO Q1RJT05fXywgX19GSUxFX18sIF9fTElORV9fLCBzb2NrLCBcCisJCQkgICAgICAgc2Vzc2lvbiwg c2Vzc2lvbiA/IHNlc3Npb24tPm1hZ2ljIDogMCk7IFwKKwkJZXJyID0gZXJydmFsOyBcCisJCWdv dG8gbGFiZWw7IFwKKwl9CisJCisjZGVmaW5lIFNPQ0tfMl9UVU5ORUwoc29jaywgdHVubmVsLCBl cnIsIGVycnZhbCwgbGFiZWwsIHF1aWV0KSBcCisJdHVubmVsID0gKHN0cnVjdCBwcHBvbDJ0cF90 dW5uZWwgKikoKHNvY2spLT5za191c2VyX2RhdGEpOwkgXAorCWlmICghdHVubmVsIHx8IHR1bm5l bC0+bWFnaWMgIT0gTDJUUF9UVU5ORUxfTUFHSUMpIHsJICAgICBcCisJCWlmICghcXVpZXQpIFwK KwkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiVkOiBCQUQgVFVOTkVMIE1BR0lDICIgXAorCQkJ ICAgICAgICIoIiAjc29jayAiPSVwKSB0dW5uZWw9JXAgbWFnaWM9JXhcbiIsIFwKKwkJCSAgICAg ICBfX0ZVTkNUSU9OX18sIF9fRklMRV9fLCBfX0xJTkVfXywgc29jaywgXAorCQkJICAgICAgIHR1 bm5lbCwgdHVubmVsID8gdHVubmVsLT5tYWdpYyA6IDApOyBcCisJCWVyciA9IGVycnZhbDsgXAor CQlnb3RvIGxhYmVsOyBcCisJfQorCisvKiBFYXN5IHdheSB0byBsb2NhdGUgZmVhdHVyZXMgbm90 IHlldCBpbXBsZW1lbnRlZCAKKyAqLworc3RhdGljIHZvaWQgcHBwb2wydHBfd2Fybl9ub3RfeWV0 X2ltcGxlbWVudGVkKGludCBkZWJ1Z19tYXNrLCBjb25zdCBjaGFyICp3aGF0KQoreworCVBSSU5U SyhkZWJ1Z19tYXNrLCBQUFBPTDJUUF9NU0dfQ09OVFJPTCwgS0VSTl9XQVJOSU5HLCAKKwkgICAg ICAgImZlYXR1cmUgJXMgbm90IHlldCBpbXBsZW1lbnRlZFxuIiwgd2hhdCk7Cit9CisKK3N0YXRp YyByd2xvY2tfdCBwcHBvbDJ0cF9oYXNoX2xvY2sgPSBSV19MT0NLX1VOTE9DS0VEOworCisvKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioKKyAqIEhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24uCisgKgorICog V2UgbmVlZCB0byBmaW5kIHNlc3Npb25zIGVmZmljaWVudGx5LCBpZGVudGlmaWVkIGJ5IGEgdHVu bmVsX2lkL3Nlc3Npb25faWQKKyAqIHBhaXIsIGhlbmNlIHdlIHVzZSBhIGhhc2ggdGFibGUuCisg KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgaW50IGNtcF9hZGRyKHN0cnVj dCBwcHBvbDJ0cF9hZGRyICphZGRyLCB1MTYgdHVubmVsLCB1MTYgc2Vzc2lvbikKK3sKKwlyZXR1 cm4gKChhZGRyLT5zX3R1bm5lbCA9PSB0dW5uZWwpICYmIChhZGRyLT5zX3Nlc3Npb24gPT0gc2Vz c2lvbikpOworfQorCitzdGF0aWMgaW50IGhhc2hfaXRlbSh1MTYgdHVubmVsLCB1MTYgc2Vzc2lv bikKK3sKKwlpbnQgaSwgdGVtcCwgaGFzaDsKKworCWhhc2ggPSAwOwkKKwl0ZW1wID0gdHVubmVs IF4gc2Vzc2lvbjsKKworCWZvciAoaSA9IDA7IGkgPD0gc2l6ZW9mKHUxNikvUFBQT0wyVFBfSEFT SF9CSVRTOyArK2kpIHsKKwkJaGFzaCBePSB0ZW1wOworCQl0ZW1wID4+PSBQUFBPTDJUUF9IQVNI X0JJVFM7CisJfQorCXJldHVybiBoYXNoICYgKFBQUE9MMlRQX0hBU0hfU0laRSAtIDEpOworfQor CisvKiBTZXQvZ2V0L2RlbGV0ZS9yZWhhc2ggaXRlbXMJIChpbnRlcm5hbCB2ZXJzaW9ucykKKyAq Lworc3RhdGljIHN0cnVjdCBwcHBvbDJ0cF9zZXNzaW9uICpfX2dldF9pdGVtKHN0cnVjdCBwcHBv bDJ0cF90dW5uZWwgKnR1bm5lbCwgCisJCQkJCSAgIHUxNiB0dW5uZWxfaWQsIHUxNiBzZXNzaW9u X2lkKQoreworCWludCBoYXNoID0gaGFzaF9pdGVtKHR1bm5lbF9pZCwgc2Vzc2lvbl9pZCk7CisJ c3RydWN0IHBwcG9sMnRwX3Nlc3Npb24gKnJldDsKKworCXJldCA9IHR1bm5lbC0+aGFzaFtoYXNo XTsKKworCXdoaWxlIChyZXQgJiYgIWNtcF9hZGRyKCZyZXQtPnR1bm5lbF9hZGRyLCB0dW5uZWxf aWQsIHNlc3Npb25faWQpKQorCQlyZXQgPSByZXQtPm5leHQ7CisKKwlyZXR1cm4gcmV0OworfQor CitzdGF0aWMgaW50IF9fc2V0X2l0ZW0oc3RydWN0IHBwcG9sMnRwX3R1bm5lbCAqdHVubmVsLCAK KwkJICAgICAgc3RydWN0IHBwcG9sMnRwX3Nlc3Npb24gKnNlc3Npb24pCit7CisJc3RydWN0IHBw cG9sMnRwX2FkZHIgKmFkZHIgPSAmc2Vzc2lvbi0+dHVubmVsX2FkZHI7CisJaW50IGhhc2ggPSBo YXNoX2l0ZW0oYWRkci0+c190dW5uZWwsIGFkZHItPnNfc2Vzc2lvbik7CisJc3RydWN0IHBwcG9s MnRwX3Nlc3Npb24gKnJldDsKKworCXJldCA9IHR1bm5lbC0+aGFzaFtoYXNoXTsKKwl3aGlsZSAo cmV0KSB7CisJCWlmIChjbXBfYWRkcigmcmV0LT50dW5uZWxfYWRkciwgYWRkci0+c190dW5uZWws IGFkZHItPnNfc2Vzc2lvbikpCisJCQlyZXR1cm4gLUVBTFJFQURZOworCisJCXJldCA9IHJldC0+ bmV4dDsKKwl9CisKKwlpZiAoIXJldCkgeworCQlzZXNzaW9uLT5uZXh0ID0gdHVubmVsLT5oYXNo W2hhc2hdOworCQl0dW5uZWwtPmhhc2hbaGFzaF0gPSBzZXNzaW9uOworCX0KKworCXJldHVybiAw OworfQorCitzdGF0aWMgc3RydWN0IHBwcG9sMnRwX3Nlc3Npb24gKl9fZGVsZXRlX2l0ZW0oc3Ry dWN0IHBwcG9sMnRwX3R1bm5lbCAqdHVubmVsLCAKKwkJCQkJICAgICAgdTE2IHR1bm5lbF9pZCwg dTE2IHNlc3Npb25faWQpCit7CisJaW50IGhhc2ggPSBoYXNoX2l0ZW0odHVubmVsX2lkLCBzZXNz aW9uX2lkKTsKKwlzdHJ1Y3QgcHBwb2wydHBfc2Vzc2lvbiAqcmV0LCAqKnNyYzsKKworCXJldCA9 IHR1bm5lbC0+aGFzaFtoYXNoXTsKKwlzcmMgPSAmdHVubmVsLT5oYXNoW2hhc2hdOworCisJd2hp bGUgKHJldCkgeworCQlpZiAoY21wX2FkZHIoJnJldC0+dHVubmVsX2FkZHIsIHR1bm5lbF9pZCwg c2Vzc2lvbl9pZCkpIHsKKwkJCSpzcmMgPSByZXQtPm5leHQ7CisJCQlicmVhazsKKwkJfQorCisJ CXNyYyA9ICZyZXQtPm5leHQ7CisJCXJldCA9IHJldC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gcmV0 OworfQorCisvKiBTZXQvZ2V0L2RlbGV0ZS9yZWhhc2ggaXRlbXMKKyAqLworc3RhdGljIGlubGlu ZSBzdHJ1Y3QgcHBwb2wydHBfc2Vzc2lvbiAqZ2V0X2l0ZW0oc3RydWN0IHBwcG9sMnRwX3R1bm5l bCAqdHVubmVsLCAKKwkJCQkJCXUxNiB0dW5uZWxfaWQsIHUxNiBzZXNzaW9uX2lkKQoreworCXN0 cnVjdCBwcHBvbDJ0cF9zZXNzaW9uICpzZXNzaW9uOworCQorCUVOVEVSX0ZVTkNUSU9OOworCisJ cmVhZF9sb2NrX2JoKCZwcHBvbDJ0cF9oYXNoX2xvY2spOworCXNlc3Npb24gPSBfX2dldF9pdGVt KHR1bm5lbCwgdHVubmVsX2lkLCBzZXNzaW9uX2lkKTsKKwlpZiAoc2Vzc2lvbikKKwkJc29ja19o b2xkKHNlc3Npb24tPnNvY2spOworCXJlYWRfdW5sb2NrX2JoKCZwcHBvbDJ0cF9oYXNoX2xvY2sp OworCisJRVhJVF9GVU5DVElPTjsKKwlyZXR1cm4gc2Vzc2lvbjsKK30KKworc3RhdGljIGlubGlu ZSBpbnQgc2V0X2l0ZW0oc3RydWN0IHBwcG9sMnRwX3R1bm5lbCAqdHVubmVsLCAKKwkJCSAgIHN0 cnVjdCBwcHBvbDJ0cF9zZXNzaW9uICpzZXNzaW9uKQoreworCWludCBpOworCQorCUVOVEVSX0ZV TkNUSU9OOworCisJaWYgKCFzZXNzaW9uKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdyaXRlX2xv Y2tfYmgoJnBwcG9sMnRwX2hhc2hfbG9jayk7CisJaSA9IF9fc2V0X2l0ZW0odHVubmVsLCBzZXNz aW9uKTsKKwl3cml0ZV91bmxvY2tfYmgoJnBwcG9sMnRwX2hhc2hfbG9jayk7CisKKwlFWElUX0ZV TkNUSU9OOworCXJldHVybiBpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwcHBvbDJ0cF9z ZXNzaW9uICpkZWxldGVfaXRlbShzdHJ1Y3QgcHBwb2wydHBfdHVubmVsICp0dW5uZWwsCisJCQkJ CQkgICB1MTYgdHVubmVsX2lkLCAKKwkJCQkJCSAgIHUxNiBzZXNzaW9uX2lkKQoreworCXN0cnVj dCBwcHBvbDJ0cF9zZXNzaW9uICpyZXQ7CisKKwlFTlRFUl9GVU5DVElPTjsKKworCXdyaXRlX2xv Y2tfYmgoJnBwcG9sMnRwX2hhc2hfbG9jayk7CisJcmV0ID0gX19kZWxldGVfaXRlbSh0dW5uZWws IHR1bm5lbF9pZCwgc2Vzc2lvbl9pZCk7CisJd3JpdGVfdW5sb2NrX2JoKCZwcHBvbDJ0cF9oYXNo X2xvY2spOworCisJRVhJVF9GVU5DVElPTjsKKwlyZXR1cm4gcmV0OworfQorCisvKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioKKyAqIFJlY2VpdmUgZGF0YSBoYW5kbGluZworICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqLworCisvKiBJbnRlcm5hbCByZWNlaXZlIGZyYW1lLiBEbyB0aGUgcmVhbCB3b3JrIG9mIHJl Y2VpdmluZyBhbiBMMlRQIGRhdGEgZnJhbWUKKyAqIGhlcmUuCisgKiBSZXR1cm5zIDAgaWYgdGhl IHBhY2tldCB3YXMgYSBkYXRhIHBhY2tldCBhbmQgd2FzIHN1Y2Nlc3NmdWxseSBwYXNzZWQgb24u CisgKiBSZXR1cm5zIDEgaWYgdGhlIHBhY2tldCB3YXMgbm90IGEgZ29vZCBkYXRhIHBhY2tldCBh bmQgY291bGQgbm90IGJlCisgKiBmb3J3YXJkZWQuICBBbGwgc3VjaCBwYWNrZXRzIGFyZSBwYXNz ZWQgdXAgdG8gdXNlcnNwYWNlIHRvIGRlYWwgd2l0aC4KKyAqLworc3RhdGljIGludCBwcHBvbDJ0 cF9yZWN2X2NvcmUoc3RydWN0IHNvY2sgKnNvY2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJ c3RydWN0IHBwcG94X29wdCAqcG87CisJc3RydWN0IHBwcG9sMnRwX3Nlc3Npb24gKnNlc3Npb24g PSBOVUxMOworCWludCBlcnJvciA9IDA7CisJc3RydWN0IHBwcG9sMnRwX3R1bm5lbCAqdHVubmVs OworCXN0cnVjdCBzb2NrICpzZXNzaW9uX3NvY2sgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgKnB0 cjsKKwl1MTYgaGRyZmxhZ3M7CisJdTE2IHR1bm5lbF9pZCwgc2Vzc2lvbl9pZDsKKwlpbnQgbGVu Z3RoOworCWludCByZXN1bHQ7CisKKwlFTlRFUl9GVU5DVElPTjsKKworCVNPQ0tfMl9UVU5ORUwo c29jaywgdHVubmVsLCBlcnJvciwgMSwgZW5kLCAwKTsKKworCS8qIFNob3J0IHBhY2tldD8gKi8K KwlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IHVkcGhkcikpIHsKKwkJUFJJTlRLKHR1bm5l bC0+ZGVidWcsIFBQUE9MMlRQX01TR19EQVRBLCBLRVJOX0lORk8sIAorCQkgICAgICAgIiVzOiBy ZWN2IHNob3J0IHBhY2tldCAobGVuPSVkKVxuIiwgdHVubmVsLT5uYW1lLCBza2ItPmxlbik7CisJ CWdvdG8gZW5kOworCX0KKworCS8qIFBvaW50IHRvIEwyVFAgaGVhZGVyICovCisJcHRyID0gc2ti LT5kYXRhICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCisJLyogR2V0IEwyVFAgaGVhZGVyIGZs YWdzICovCisJaGRyZmxhZ3MgPSBudG9ocygqKHUxNiopcHRyKTsKKworCS8qIFRyYWNlIHBhY2tl dCBjb250ZW50cywgaWYgZW5hYmxlZCAqLworCWlmICh0dW5uZWwtPmRlYnVnICYgUFBQT0wyVFBf TVNHX0RBVEEpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZWN2OiAiIEtFUk5fREVCVUcs IHR1bm5lbC0+bmFtZSk7CisKKwkJZm9yIChsZW5ndGggPSAwOyBsZW5ndGggPCAxNjsgbGVuZ3Ro KyspCisJCQlwcmludGsoIiAlMDJYIiwgcHRyW2xlbmd0aF0pOworCQlwcmludGsoIlxuIik7CisJ fQorCisJLyogR2V0IGxlbmd0aCBvZiBMMlRQIHBhY2tldCAqLworCWxlbmd0aCA9IG50b2hzKHNr Yi0+aC51aC0+bGVuKSAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKKwkKKwkvKiBUb28gc2hvcnQ/ ICovCisJaWYgKGxlbmd0aCA8IDEyKSB7CisJCVBSSU5USyh0dW5uZWwtPmRlYnVnLCBQUFBPTDJU UF9NU0dfREFUQSwgS0VSTl9JTkZPLCAKKwkJICAgICAgICIlczogcmVjdiBzaG9ydCBMMlRQIHBh Y2tldCAobGVuPSVkKVxuIiwgdHVubmVsLT5uYW1lLCBsZW5ndGgpOworCQlnb3RvIGVuZDsKKwl9 CisJCisJLyogSWYgdHlwZSBpcyBjb250cm9sIHBhY2tldCwgaXQgaXMgaGFuZGxlZCBieSB1c2Vy c3BhY2UuICovCisJaWYgKGhkcmZsYWdzICYgTDJUUF9IRFJGTEFHX1QpIHsgCisJCVBSSU5USyh0 dW5uZWwtPmRlYnVnLCBQUFBPTDJUUF9NU0dfREFUQSwgS0VSTl9ERUJVRywgCisJCSAgICAgICAi JXM6IHJlY3YgY29udHJvbCBwYWNrZXQsIGxlbj0lZFxuIiwgdHVubmVsLT5uYW1lLCBsZW5ndGgp OworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBTa2lwIGZsYWdzICovCisJcHRyICs9IDI7CisJCisJ LyogSWYgbGVuZ3RoIGlzIHByZXNlbnQsIHNraXAgaXQgKi8KKwlpZiAoaGRyZmxhZ3MgJiBMMlRQ X0hEUkZMQUdfTCkKKwkJcHRyICs9IDI7CisKKwkvKiBFeHRyYWN0IHR1bm5lbCBhbmQgc2Vzc2lv biBJRCAqLworCXR1bm5lbF9pZCA9IG50b2hzKCoodTE2ICopIHB0cik7CisJcHRyICs9IDI7CisJ c2Vzc2lvbl9pZCA9IG50b2hzKCoodTE2ICopIHB0cik7CisJcHRyICs9IDI7CisKKwkvKiBGaW5k IHRoZSBzZXNzaW9uIGNvbnRleHQgKi8KKwlzZXNzaW9uID0gZ2V0X2l0ZW0odHVubmVsLCB0dW5u ZWxfaWQsIHNlc3Npb25faWQpOworCWlmICghc2Vzc2lvbikgeworCQkvKiBOb3QgZm91bmQ/IFBh c3MgdG8gdXNlcnNwYWNlIHRvIGRlYWwgd2l0aCAqLworCQlQUklOVEsodHVubmVsLT5kZWJ1Zywg UFBQT0wyVFBfTVNHX0RBVEEsIEtFUk5fSU5GTywgCisJCSAgICAgICAiJXM6IG5vIHNvY2tldCBm b3VuZCAoJWh1LyVodSkuIFBhc3NpbmcgdXAuXG4iLCAKKwkJICAgICAgIHR1bm5lbC0+bmFtZSwg dHVubmVsX2lkLCBzZXNzaW9uX2lkKTsKKwkJZ290byBlbmQ7CisJfQorCisJRFBSSU5USyhzZXNz aW9uLT5kZWJ1ZywgIiVzOiBzb2NrZXQgcmN2YnVmIGFsbG9jPSVkXG4iLCAKKwkJc2Vzc2lvbi0+ bmFtZSwgYXRvbWljX3JlYWQoJnNvY2stPnNrX3JtZW1fYWxsb2MpKTsKKworCS8qIFRoZSByZWYg Y291bnQgb24gdGhlIHNvY2tldCB3YXMgaW5jcmVhc2VkIGJ5IHRoZSBhYm92ZSBjYWxsIHNpbmNl CisJICogd2Ugbm93IGhvbGQgYSBwb2ludGVyIHRvIHRoZSBzZXNzaW9uLiBUYWtlIGNhcmUgdG8g ZG8gc29ja19wdXQoKQorCSAqIHdoZW4gZXhpdGluZyB0aGlzIGZ1bmN0aW9uIGZyb20gbm93IG9u Li4uCisJICovCisKKwkvKiBIYW5kbGUgdGhlIG9wdGlvbmFsIHNlcXVlbmNlIG51bWJlcnMuICBJ ZiB3ZSBhcmUgdGhlIExBQywKKwkgKiBlbmFibGUvZGlzYWJsZSBzZXF1ZW5jZSBudW1iZXJzIHVu ZGVyIHRoZSBjb250cm9sIG9mIHRoZSBMTlMuICBJZgorCSAqIG5vIHNlcXVlbmNlIG51bWJlcnMg cHJlc2VudCBidXQgd2Ugd2VyZSBleHBlY3RpbmcgdGhlbSwgZGlzY2FyZAorCSAqIGZyYW1lLgor CSAqLworCWlmIChoZHJmbGFncyAmIEwyVFBfSERSRkxBR19TKSB7CisJCXUxNiBucywgbnI7CisJ CW5zID0gbnRvaHMoKih1MTYgKikgcHRyKTsKKwkJcHRyICs9IDI7CisJCW5yID0gbnRvaHMoKih1 MTYgKikgcHRyKTsKKwkJcHRyICs9IDI7CisKKwkJLyogUmVjZWl2ZWQgYSBwYWNrZXQgd2l0aCBz ZXF1ZW5jZSBudW1iZXJzLiBJZiB3ZSdyZSB0aGUgTE5TLAorCQkgKiBjaGVjayBpZiB3ZSBzcmUg c2VuZGluZyBzZXF1ZW5jZSBudW1iZXJzIGFuZCBpZiBub3QsCisJCSAqIGNvbmZpZ3VyZSBpdCBz by4KKwkJICovCisJCWlmICgoIXNlc3Npb24tPmxuc19tb2RlKSAmJiAoIXNlc3Npb24tPnNlbmRf c2VxKSkgeworCQkJUFJJTlRLKHNlc3Npb24tPmRlYnVnLCBQUFBPTDJUUF9NU0dfU0VRLCBLRVJO X0lORk8sIAorCQkJICAgICAgICIlczogcmVxdWVzdGVkIHRvIGVuYWJsZSBzZXEgbnVtYmVycyBi eSBMTlNcbiIsIAorCQkJICAgICAgIHNlc3Npb24tPm5hbWUpOworCQkJc2Vzc2lvbi0+c2VuZF9z ZXEgPSAtMTsKKwkJfQorCisJCVBSSU5USyhzZXNzaW9uLT5kZWJ1ZywgUFBQT0wyVFBfTVNHX1NF USwgS0VSTl9ERUJVRywgCisJCSAgICAgICAiJXM6IHJlY3YgZGF0YSBucz0laHUsIG5yPSVodSwg c2Vzc2lvbiBucj0laHVcbiIsIAorCQkgICAgICAgc2Vzc2lvbi0+bmFtZSwgbnMsIG5yLCBzZXNz aW9uLT5ucik7CisKKwkJLyogRGlzY2FyZCBvdXQtb2Ytc2VxdWVuY2UgcGFja2V0cyAqLworCQlp ZiAobnMgIT0gc2Vzc2lvbi0+bnIpIHsKKwkJCXNlc3Npb24tPnN0YXRzLnJ4X29vc19wYWNrZXRz Kys7CisJCQlzZXNzaW9uLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWdvdG8gZGlzY2FyZDsKKwkJ fQorCisJCS8qIEJ1bXAgb3VyIE5yICovCisJCXNlc3Npb24tPm5yKys7CisJCVBSSU5USyhzZXNz aW9uLT5kZWJ1ZywgUFBQT0wyVFBfTVNHX1NFUSwgS0VSTl9ERUJVRywgCisJCSAgICAgICAiJXM6 IHVwZGF0ZWQgbnIgdG8gJWh1XG4iLCBzZXNzaW9uLT5uYW1lLCBzZXNzaW9uLT5ucik7CisJfSBl bHNlIHsKKwkJLyogTm8gc2VxdWVuY2UgbnVtYmVycy4KKwkJICogSWYgdXNlciBoYXMgY29uZmln dXJlZCBtYW5kYXRvcnkgc2VxdWVuY2UgbnVtYmVycywgZGlzY2FyZC4KKwkJICovCisJCWlmIChz ZXNzaW9uLT5yZWN2X3NlcSkgeworCQkJUFJJTlRLKHNlc3Npb24tPmRlYnVnLCBQUFBPTDJUUF9N U0dfU0VRLCBLRVJOX1dBUk5JTkcsIAorCQkJICAgICAgICIlczogcmVjdiBkYXRhIGhhcyBubyBz ZXEgbnVtYmVycyB3aGVuIHJlcXVpcmVkLiAiCisJCQkgICAgICAgIkRpc2NhcmRpbmdcbiIsIHNl c3Npb24tPm5hbWUpOworCQkJc2Vzc2lvbi0+c3RhdHMucnhfc2VxX2Rpc2NhcmRzKys7CisJCQlz ZXNzaW9uLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWdvdG8gZGlzY2FyZDsKKwkJfQorCisJCS8q IElmIHdlJ3JlIHRoZSBMQUMgYW5kIHdlJ3JlIHNlbmRpbmcgc2VxdWVuY2UgbnVtYmVycywgdGhl CisJCSAqIExOUyBoYXMgcmVxdWVzdGVkIHRoYXQgd2Ugbm8gbG9uZ2VyIHNlbmQgc2VxdWVuY2Ug bnVtYmVycy4KKwkJICogSWYgd2UncmUgdGhlIExOUyBhbmQgd2UncmUgc2VuZGluZyBzZXF1ZW5j ZSBudW1iZXJzLCB0aGUKKwkJICogTEFDIGlzIGJyb2tlbi4gRGlzY2FyZCB0aGUgZnJhbWUuCisJ CSAqLworCQlpZiAoKCFzZXNzaW9uLT5sbnNfbW9kZSkgJiYgKHNlc3Npb24tPnNlbmRfc2VxKSkg eworCQkJUFJJTlRLKHNlc3Npb24tPmRlYnVnLCBQUFBPTDJUUF9NU0dfU0VRLCBLRVJOX0lORk8s IAorCQkJICAgICAgICIlczogcmVxdWVzdGVkIHRvIGRpc2FibGUgc2VxIG51bWJlcnMgYnkgTE5T XG4iLCAKKwkJCSAgICAgICBzZXNzaW9uLT5uYW1lKTsKKwkJCXNlc3Npb24tPnNlbmRfc2VxID0g MDsKKwkJfSBlbHNlIGlmIChzZXNzaW9uLT5zZW5kX3NlcSkgeworCQkJUFJJTlRLKHNlc3Npb24t PmRlYnVnLCBQUFBPTDJUUF9NU0dfU0VRLCBLRVJOX1dBUk5JTkcsIAorCQkJICAgICAgICIlczog cmVjdiBkYXRhIGhhcyBubyBzZXEgbnVtYmVycyB3aGVuIHJlcXVpcmVkLiAiCisJCQkgICAgICAg IkRpc2NhcmRpbmdcbiIsIHNlc3Npb24tPm5hbWUpOworCQkJc2Vzc2lvbi0+c3RhdHMucnhfc2Vx X2Rpc2NhcmRzKys7CisJCQlzZXNzaW9uLT5zdGF0cy5yeF9lcnJvcnMrKzsKKwkJCWdvdG8gZGlz Y2FyZDsKKwkJfQorCX0KKwkJCisJLyogSWYgb2Zmc2V0IGJpdCBzZXQsIHNraXAgaXQuICovCisJ aWYgKGhkcmZsYWdzICYgTDJUUF9IRFJGTEFHX08pCisJCXB0ciArPSAyICsgbnRvaHMoKih1MTYg KikgcHRyKTsKKworCXNrYl9wdWxsKHNrYiwgcHRyIC0gc2tiLT5kYXRhKTsKKworCS8qIFNraXAg UFBQIGhlYWRlciwgaWYgcHJlc2VudC4JIEluIHRlc3RpbmcsIE1pY3Jvc29mdCBMMlRQIGNsaWVu dHMKKwkgKiBkb24ndCBzZW5kIHRoZSBQUFAgaGVhZGVyIChQUFAgaGVhZGVyIGNvbXByZXNzaW9u IGVuYWJsZWQpLCBidXQKKwkgKiBvdGhlciBjbGllbnRzIGNhbiBpbmNsdWRlIHRoZSBoZWFkZXIu IFNvIHdlIGNvcGUgd2l0aCBib3RoIGNhc2VzCisJICogaGVyZS4gVGhlIFBQUCBoZWFkZXIgaXMg YWx3YXlzIEZGMDMgd2hlbiB1c2luZyBMMlRQLgorCSAqCisJICogTm90ZSB0aGF0IHNrYi0+ZGF0 YVtdIGlzbid0IGRlcmVmZXJlbmNlZCBmcm9tIGEgdTE2IHB0ciBoZXJlIHNpbmNlCisJICogdGhl IGZpZWxkIG1heSBiZSB1bmFsaWduZWQuCisJICovCisJaWYgKChza2ItPmRhdGFbMF0gPT0gMHhm ZikgJiYgKHNrYi0+ZGF0YVsxXSA9PSAweDAzKSkKKwkJc2tiX3B1bGwoc2tiLCAyKTsKKworCS8q IFdlJ3JlIGFib3V0IHRvIHJlcXVldWUgdGhlIHNrYiwgc28gdW5saW5rIGl0IGFuZCByZXR1cm4g cmVzb3VyY2VzCisJICogdG8gaXRzIGN1cnJlbnQgb3duZXIgKGEgc29ja2V0IHJlY2VpdmUgYnVm ZmVyKS4KKwkgKi8KKwlza2JfdW5saW5rKHNrYik7CisJc2tiX29ycGhhbihza2IpOworCisJdHVu bmVsLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJdHVubmVsLT5zdGF0cy5yeF9ieXRlcyArPSBsZW5n dGg7CisJc2Vzc2lvbi0+c3RhdHMucnhfcGFja2V0cysrOworCXNlc3Npb24tPnN0YXRzLnJ4X2J5 dGVzICs9IGxlbmd0aDsKKworCS8qIElmIHRoZSBzb2NrZXQgaXMgYm91bmQsIHNlbmQgaXQgaW4g dG8gUFBQJ3MgaW5wdXQgcXVldWUuICBPdGhlcndpc2UKKwkgKiBxdWV1ZSBpdCBvbiB0aGUgc29j a2V0LgorCSAqLworCXNlc3Npb25fc29jayA9IHNlc3Npb24tPnNvY2s7CisJaWYgKHNlc3Npb25f c29jay0+c2tfc3RhdGUgJiBQUFBPWF9CT1VORCkgeworCQlQUklOVEsoc2Vzc2lvbi0+ZGVidWcs IFBQUE9MMlRQX01TR19EQVRBLCBLRVJOX0RFQlVHLCAKKwkJICAgICAgICIlczogcmVjdiAlZCBi eXRlIGRhdGEgZnJhbWUsIHBhc3NpbmcgdG8gcHBwXG4iLCAKKwkJICAgICAgIHNlc3Npb24tPm5h bWUsIGxlbmd0aCk7CisJCXBvID0gcHBwb3hfc2soc2Vzc2lvbl9zb2NrKTsKKwkJcHBwX2lucHV0 KCZwby0+Y2hhbiwgc2tiKTsKKwl9IGVsc2UgeworCQlQUklOVEsoc2Vzc2lvbi0+ZGVidWcsIFBQ UE9MMlRQX01TR19EQVRBLCBLRVJOX0lORk8sIAorCQkgICAgICAgIiVzOiBzb2NrZXQgbm90IGJv dW5kXG4iLCBzZXNzaW9uLT5uYW1lKTsKKwkJLyogTm90IGJvdW5kLiBRdWV1ZSBpdCBub3cgKi8K KwkJc29ja19xdWV1ZV9yY3Zfc2tiKHNlc3Npb25fc29jaywgc2tiKTsKKwl9CisKKwlyZXN1bHQg PSAwOworCitvdXQ6CisJRFBSSU5USyhzZXNzaW9uLT5kZWJ1ZywgImNhbGxpbmcgc29ja19wdXQ7 IHJlZmNudD0lZFxuIiwgCisJCXNlc3Npb24tPnNvY2stPnNrX3JlZmNudC5jb3VudGVyKTsKKwlz b2NrX3B1dChzZXNzaW9uLT5zb2NrKTsKKwlFWElUX0ZVTkNUSU9OOworCXJldHVybiByZXN1bHQ7 CisKK2Rpc2NhcmQ6CisJRFBSSU5USyhzZXNzaW9uLT5kZWJ1ZywgImRpc2NhcmRpbmcgc2tiLCBs ZW49JWRcbiIsIHNrYi0+bGVuKTsKKwlza2JfdW5saW5rKHNrYik7CisJa2ZyZWVfc2tiKHNrYik7 CisJcmVzdWx0ID0gMDsKKwlnb3RvIG91dDsKKworZW5kOgorCUVYSVRfRlVOQ1RJT047CisJcmV0 dXJuIDE7Cit9CisKKy8qIFRoZSBkYXRhX3JlYWR5IGhvb2sgb24gdGhlIFVEUCBzb2NrZXQuIFNj YW4gdGhlIGluY29taW5nIHBhY2tldCBsaXN0IGZvcgorICogcGFja2V0cyB0byBwcm9jZXNzCisg Ki8KK3N0YXRpYyB2b2lkIHBwcG9sMnRwX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQg bGVuKQoreworCWludCBlcnI7CisJc3RydWN0IHBwcG9sMnRwX3R1bm5lbCAqdHVubmVsOworCXN0 cnVjdCBza19idWZmICpza2I7CisJaW50IHByb2Nlc3NlZCA9IDA7CisJCisJRU5URVJfRlVOQ1RJ T047CisJU09DS18yX1RVTk5FTChzaywgdHVubmVsLCBlcnIsIC1FQkFERiwgZW5kLCAwKTsKKwkK KwlQUklOVEsodHVubmVsLT5kZWJ1ZywgUFBQT0wyVFBfTVNHX0RBVEEsIEtFUk5fREVCVUcsIAor CSAgICAgICAiJXM6IHJlY2VpdmVkICVkIGJ5dGVzXG4iLCB0dW5uZWwtPm5hbWUsIGxlbik7CisJ CisJLyogRklYTUU6IERvIHdlIG5lZWQgdG8gbG9jayB0aGUgc29ja2V0IGhlcmU/ICovCisJc2ti X3F1ZXVlX3dhbGsoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpIHsKKwkJaWYgKHBwcG9sMnRw X3JlY3ZfY29yZShzaywgc2tiKSkgeworCQkJLyogc2tiIHdhcyBwYXNzZWQgdG8gdXNlcnNwYWNl ICovCisJCQlwcm9jZXNzZWQgPSAxOworCQkJUFJJTlRLKHR1bm5lbC0+ZGVidWcsIFBQUE9MMlRQ X01TR19EQVRBLCBLRVJOX0RFQlVHLCAKKwkJCSAgICAgICAiJXM6IHBhY2tldCBwYXNzZWQgdG8g dXNlcnNwYWNlXG4iLCAKKwkJCSAgICAgICB0dW5uZWwtPm5hbWUpOworCQl9IGVsc2UgeworCQkJ UFJJTlRLKHR1bm5lbC0+ZGVidWcsIFBQUE9MMlRQX01TR19EQVRBLCBLRVJOX0RFQlVHLCAKKwkJ CSAgICAgICAiJXM6IGRhdGEgcGFja2V0IGFjY2VwdGVkXG4iLCB0dW5uZWwtPm5hbWUpOworCQkJ LyogSWYgdGhlIHBhY2tldCBoYXMgYmVlbiBhY2NlcHRlZCBpdCBpcyB0aGUKKwkJCSAqIHJlc3Bv bnNpYmlsaXR5IG9mIHRoZSByZWNlaXZlciAoZWl0aGVyIHNvY2tldCBvcgorCQkJICogcHBwIGRl dmljZSkgdG8gZGlzcG9zZSBvZiBpdC4KKwkJCSAqCisJCQkgKiBBbHNvLCBzaW5jZSByZWN2X2Nv cmUgaGFzIHJlcXVldWVkIHRoZSBwYWNrZXQKKwkJCSAqIGVsc2V3aGVyZSwgaXQncyBub3Qgc2Fm ZSB0byBjb250aW51ZSB0aGlzIGxvb3AsIHNvCisJCQkgKiB3ZSBicmVhaworCQkJICovCisJCQli cmVhazsKKwkJfQorCX0KKwlpZiAocHJvY2Vzc2VkKSB7CisJCURQUklOVEsodHVubmVsLT5kZWJ1 ZywgIiVzOiBjYWxsaW5nIG9sZCBvbGRfZGF0YV9yZWFkeVxuIiwgCisJCQl0dW5uZWwtPm5hbWUp OworCQl0dW5uZWwtPm9sZF9kYXRhX3JlYWR5KHNrLCBsZW4pOworCX0KK2VuZDoKKwlFWElUX0ZV TkNUSU9OOworCXJldHVybjsKK30KKworLyogUmVjZWl2ZSBtZXNzYWdlLiBUaGlzIGlzIHRoZSBy ZWN2bXNnIGZvciB0aGUgUFBQb0wyVFAgc29ja2V0LgorICovCitzdGF0aWMgaW50IHBwcG9sMnRw X3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCAKKwkJCSAg ICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCisJCQkgICAgaW50IGZsYWdzKQorewor CWludCBlcnIgPSAwOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBzb2Nr ICpzayA9IHNvY2stPnNrOworCisJRU5URVJfRlVOQ1RJT047CisKKwllcnIgPSAtRUlPOworCWlm IChzb2NrLT5zdGF0ZSAmIFBQUE9YX0JPVU5EKQorCQlnb3RvIGVycm9yOworCQkJCisJbXNnLT5t c2dfbmFtZWxlbiA9IDA7CisJCisJc2tiPXNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncyAmIH5N U0dfRE9OVFdBSVQsCisJCQkgICAgICBmbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CisJaWYg KHNrYikgeworCQllcnIgPSBtZW1jcHlfdG9pb3ZlYyhtc2ctPm1zZ19pb3YsICh1bnNpZ25lZCBj aGFyICopIHNrYi0+ZGF0YSwKKwkJCQkgICAgIHNrYi0+bGVuKTsKKwkJaWYgKGVyciA8IDApCisJ CQlnb3RvIGRvX3NrYl9mcmVlOworCQllcnIgPSBza2ItPmxlbjsKKwl9Citkb19za2JfZnJlZToK KwlpZiAoc2tiKQorCQlrZnJlZV9za2Ioc2tiKTsKK2Vycm9yOgorCUVYSVRfRlVOQ1RJT047CisJ cmV0dXJuIGVycjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVHJhbnNtaXQgaGFuZGxpbmcK KyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8KKworLyogSW50ZXJuYWwgVURQIHNvY2tldCB0cmFuc21pc3Npb24K KyAqLworc3RhdGljIGludCBwcHBvbDJ0cF91ZHBfc29ja19zZW5kKHN0cnVjdCBraW9jYiAqaW9j YiwKKwkJCQkgIHN0cnVjdCBwcHBvbDJ0cF9zZXNzaW9uICpzZXNzaW9uLCAKKwkJCQkgIHN0cnVj dCBwcHBvbDJ0cF90dW5uZWwgKnR1bm5lbCwKKwkJCQkgIHN0cnVjdCBtc2doZHIgKm1zZywgaW50 IHRvdGFsX2xlbikKK3sKKwltbV9zZWdtZW50X3QgZnM7CisJaW50IGVycm9yOworCisJRU5URVJf RlVOQ1RJT047CisKKwlEUFJJTlRLKHNlc3Npb24tPmRlYnVnLCAiJXM6IHVkcF9zZW5kbXNnIGNh bGwuLi5cbiIsIHNlc3Npb24tPm5hbWUpOworCisJLyogU2V0IHRvIHVzZXJzcGFjZSBkYXRhIHNl Z21lbnQgd2hpbGUgd2UgZG8gYSBzZW5kbXNnKCkgY2FsbC4JV2UncmUKKwkgKiBhY3R1YWxseSBj YWxsaW5nIGEgdXNlcnNwYWNlIEFQSSBmcm9tIHRoZSBrZXJuZWwgaGVyZS4uLgorCSAqLworCWZz ID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKworCS8qIFRoZSBhY3R1YWwgc2VuZG1z ZygpIGNhbGwuLi4gKi8KKwllcnJvciA9IHR1bm5lbC0+b2xkX3Byb3RvLnNlbmRtc2coaW9jYiwg c2Vzc2lvbi0+dHVubmVsX3NvY2ssIG1zZywgdG90YWxfbGVuKTsKKwlpZiAoZXJyb3IgPT0gLUVJ T0NCUVVFVUVEKQorCQllcnJvciA9IHdhaXRfb25fc3luY19raW9jYihpb2NiKTsKKworCS8qIEJh Y2sgdG8ga2VybmVsIHNwYWNlICovCisJc2V0X2ZzKGZzKTsKKworCWlmIChlcnJvciA+PSAwKSB7 CisJCXR1bm5lbC0+c3RhdHMudHhfcGFja2V0cysrOworCQl0dW5uZWwtPnN0YXRzLnR4X2J5dGVz ICs9IGVycm9yOworCQlzZXNzaW9uLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCXNlc3Npb24tPnN0 YXRzLnR4X2J5dGVzICs9IGVycm9yOworCX0gZWxzZSB7CisJCXR1bm5lbC0+c3RhdHMudHhfZXJy b3JzKys7CisJCXNlc3Npb24tPnN0YXRzLnR4X2Vycm9ycysrOworCX0KKworCURQUklOVEsoc2Vz c2lvbi0+ZGVidWcsICIlczogJXM6IHJldHVybmluZyByZXN1bHQgJWRcbiIsIF9fRlVOQ1RJT05f XywgCisJCXNlc3Npb24tPm5hbWUsIGVycm9yKTsKKwlrZnJlZShtc2ctPm1zZ19pb3YpOworCWtm cmVlKG1zZyk7CisJCisJRVhJVF9GVU5DVElPTjsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qIEJ1 aWxkIGFuIEwyVFAgaGVhZGVyIGZvciB0aGUgc2Vzc2lvbiBpbnRvIHRoZSBidWZmZXIgcHJvdmlk ZWQuCisgKi8KK3N0YXRpYyBpbnQgcHBwb2wydHBfYnVpbGRfbDJ0cF9oZWFkZXIoc3RydWN0IHBw cG9sMnRwX3Nlc3Npb24gKnNlc3Npb24sIAorCQkJCSAgICAgIHZvaWQgKmJ1ZikKK3sKKwl1MTYg KmJ1ZnAgPSBidWY7CisJdTE2IGZsYWdzID0gTDJUUF9IRFJfVkVSOworCisJaWYgKHNlc3Npb24t PnNlbmRfc2VxKSB7CisJCWZsYWdzIHw9IEwyVFBfSERSRkxBR19TOworCX0KKworCS8qIFNldHVw IEwyVFAgaGVhZGVyLgorCSAqIEZJWE1FOiBDYW4gdGhpcyBldmVyIGJlIHVuYWxpZ25lZD8gSXMg ZGlyZWN0IGRlcmVmZXJlbmNpbmcgb2YKKwkgKiAxNi1iaXQgaGVhZGVyIGZpZWxkcyBzYWZlIGhl cmUgZm9yIGFsbCBhcmNoaXRlY3R1cmVzPworCSAqLwkKKwkqYnVmcCsrID0gaHRvbnMoZmxhZ3Mp OworCSpidWZwKysgPSBodG9ucyhzZXNzaW9uLT50dW5uZWxfYWRkci5kX3R1bm5lbCk7CisJKmJ1 ZnArKyA9IGh0b25zKHNlc3Npb24tPnR1bm5lbF9hZGRyLmRfc2Vzc2lvbik7CisJaWYgKHNlc3Np b24tPnNlbmRfc2VxKSB7CisJCSpidWZwKysgPSBodG9ucyhzZXNzaW9uLT5ucyk7CisJCSpidWZw KysgPSAwOworCQlzZXNzaW9uLT5ucysrOworCQlQUklOVEsoc2Vzc2lvbi0+ZGVidWcsIFBQUE9M MlRQX01TR19TRVEsIEtFUk5fREVCVUcsIAorCQkgICAgICAgIiVzOiB1cGRhdGVkIG5zIHRvICVo dVxuIiwgc2Vzc2lvbi0+bmFtZSwgc2Vzc2lvbi0+bnMpOworCX0KKworCXJldHVybiAoKHZvaWQg KikgYnVmcCkgLSBidWY7Cit9CisKKy8qIFRoaXMgaXMgdGhlIHNlbmRtc2cgZm9yIHRoZSBQUFBv TDJUUCBwcHBvbDJ0cF9zZXNzaW9uIHNvY2tldC4gIFdlIGNvbWUgaGVyZQorICogd2hlbiBhIHVz ZXIgYXBwbGljYXRpb24gZG9lcyBhIHNlbmRtc2coKSBvbiB0aGUgc2Vzc2lvbiBzb2NrZXQuIEwy VFAgYW5kCisgKiBQUFAgaGVhZGVycyBtdXN0IGJlIGluc2VydGVkIGludG8gdGhlIHVzZXIncyBk YXRhLgorICovCitzdGF0aWMgaW50IHBwcG9sMnRwX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2Ni LCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptLAorCQkJICAgIHNpemVfdCB0 b3RhbF9sZW4pCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgcHBwaFsyXSA9IHsgMHhmZiwgMHgw MyB9OworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCWludCBlcnJvciA9IDA7CisJdTgg aGRyW1BQUE9MMlRQX0wyVFBfSERSX1NJWkVfU0VRXTsKKwlpbnQgaGRyX2xlbjsKKwlzdHJ1Y3Qg bXNnaGRyICptc2c7CisJc3RydWN0IHBwcG9sMnRwX3Nlc3Npb24gKnNlc3Npb247CisJc3RydWN0 IHBwcG9sMnRwX3R1bm5lbCAqdHVubmVsOworCisJRU5URVJfRlVOQ1RJT047CisKKwlpZiAoc29j a19mbGFnKHNrLCBTT0NLX0RFQUQpIHx8ICEoc2stPnNrX3N0YXRlICYgUFBQT1hfQ09OTkVDVEVE KSkgeworCQllcnJvciA9IC1FTk9UQ09OTjsKKwkJZ290byBlbmQ7CisJfQorCisJLyogR2V0IHNl c3Npb24gYW5kIHR1bm5lbCBjb250ZXh0cyAqLworCVNPQ0tfMl9TRVNTSU9OKHNrLCBzZXNzaW9u LCBlcnJvciwgLUVCQURGLCBlbmQsIDApOworCVNPQ0tfMl9UVU5ORUwoc2Vzc2lvbi0+dHVubmVs X3NvY2ssIHR1bm5lbCwgZXJyb3IsIC1FQkFERiwgZW5kLCAwKTsKKworCS8qIFNldHVwIEwyVFAg aGVhZGVyICovCQorCWhkcl9sZW4gPSBwcHBvbDJ0cF9idWlsZF9sMnRwX2hlYWRlcihzZXNzaW9u LCAmaGRyKTsKKworCWlmIChzZXNzaW9uLT5zZW5kX3NlcSkKKwkJUFJJTlRLKHNlc3Npb24tPmRl YnVnLCBQUFBPTDJUUF9NU0dfREFUQSwgS0VSTl9ERUJVRywgCisJCSAgICAgICAiJXM6IHNlbmQg JWQgYnl0ZXMsIG5zPSVodVxuIiwgc2Vzc2lvbi0+bmFtZSwgCisJCSAgICAgICB0b3RhbF9sZW4s IHNlc3Npb24tPm5zIC0gMSk7CisJZWxzZQorCQlQUklOVEsoc2Vzc2lvbi0+ZGVidWcsIFBQUE9M MlRQX01TR19EQVRBLCBLRVJOX0RFQlVHLCAKKwkJICAgICAgICIlczogc2VuZCAlZCBieXRlc1xu Iiwgc2Vzc2lvbi0+bmFtZSwgdG90YWxfbGVuKTsKKworCS8qIFVuZm9ydHVuYXRlbHksIHRoZXJl IGlzIG5vIGRpcmVjdCB3YXkgZm9yIHVzIHRvIHBhc3MgYW4gc2tiIHRvIHRoZQorCSAqIFVEUCBs YXllciwgd2UgaGF2ZSB0byBwcmV0ZW5kIHRvIGJlIHNlbmRpbmcgb3JkaW5hcnkgZGF0YSBhbmQg dXNlCisJICogc2VuZG1zZy4KKwkgKgorCSAqIFdlIGFkZCB0aGUgTDJUUCBhbmQgUFBQIGhlYWRl cnMgaGVyZS4gVG8gZG8gc28sIHdlIGNyZWF0ZSBhIG5ldworCSAqIHN0cnVjdCBtc2doZHIgYW5k IGluc2VydCB0aGUgaGVhZGVycyBhcyB0aGUgZmlyc3QgaW92ZWNzLgorCSAqLworCW1zZyA9IGtt YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc2doZHIpLCBHRlBfS0VSTkVMKTsKKwlpZiAobXNnID09IE5V TEwpIHsKKwkJZXJyb3IgPSAtRU5PQlVGUzsKKwkJdHVubmVsLT5zdGF0cy50eF9lcnJvcnMrKzsK KwkJc2Vzc2lvbi0+c3RhdHMudHhfZXJyb3JzKys7CisJCWdvdG8gZW5kOworCX0KKworCW1zZy0+ bXNnX2lvdiA9IGttYWxsb2MoKG0tPm1zZ19pb3ZsZW4gKyAyKSAqIHNpemVvZihzdHJ1Y3QgaW92 ZWMpLCAKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAobXNnLT5tc2dfaW92ID09IE5VTEwp IHsKKwkJZXJyb3IgPSAtRU5PQlVGUzsKKwkJdHVubmVsLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJ c2Vzc2lvbi0+c3RhdHMudHhfZXJyb3JzKys7CisJCWtmcmVlKG1zZyk7CisJCWdvdG8gZW5kOwor CX0KKworCW1zZy0+bXNnX2lvdlswXS5pb3ZfYmFzZSA9ICZoZHI7CisJbXNnLT5tc2dfaW92WzBd Lmlvdl9sZW4JID0gaGRyX2xlbjsKKwltc2ctPm1zZ19pb3ZbMV0uaW92X2Jhc2UgPSAmcHBwaDsK Kwltc2ctPm1zZ19pb3ZbMV0uaW92X2xlbgkgPSBzaXplb2YocHBwaCk7CisJbWVtY3B5KCZtc2ct Pm1zZ19pb3ZbMl0sICZtLT5tc2dfaW92WzBdLCAKKwkgICAgICAgbS0+bXNnX2lvdmxlbiAqIHNp emVvZihzdHJ1Y3QgaW92ZWMpKTsKKwltc2ctPm1zZ19pb3ZsZW4gPSBtLT5tc2dfaW92bGVuICsg MjsKKwkKKwkvKiBJZiB0aGUgdXNlciBjYWxscyBzZW5kdG8oKSB0aGF0J3MganVzdCB0b28gYmFk ICovCisJbXNnLT5tc2dfbmFtZQkgPSAmc2Vzc2lvbi0+dHVubmVsX2FkZHIuYWRkcjsKKwltc2ct Pm1zZ19uYW1lbGVuID0gc2l6ZW9mKHNlc3Npb24tPnR1bm5lbF9hZGRyLmFkZHIpOworCQorCW1z Zy0+bXNnX2NvbnRyb2wgICAgPSBtLT5tc2dfY29udHJvbDsKKwltc2ctPm1zZ19jb250cm9sbGVu ID0gbS0+bXNnX2NvbnRyb2xsZW47CisJbXNnLT5tc2dfZmxhZ3MJICAgID0gbS0+bXNnX2ZsYWdz OworCisJLyogRG8gdGhlIHJlYWwgd29yay4gVGhpcyBhbHdheXMgZnJlZXMgbXNnLCByZWdhcmRs ZXNzIG9mIHdoZXRoZXIKKwkgKiB0aGVyZSB3YXMgYW4gZXJyb3IKKwkgKi8KKwllcnJvciA9IHBw cG9sMnRwX3VkcF9zb2NrX3NlbmQoaW9jYiwgc2Vzc2lvbiwgdHVubmVsLCBtc2csIAorCQkJCSAg ICAgICB0b3RhbF9sZW4gKyBoZHJfbGVuICsgc2l6ZW9mKHBwcGgpKTsKKworZW5kOgorCUVYSVRf RlVOQ1RJT047CisJcmV0dXJuIGVycm9yOworfQorCisKKy8qIFRyYW5zbWl0IGZ1bmN0aW9uIGNh bGxlZCBieSBnZW5lcmljIFBQUCBkcml2ZXIuICBTZW5kcyBQUFAgZnJhbWUgb3ZlcgorICogUFBQ b0wyVFAgc29ja2V0LgorICoKKyAqIFRoaXMgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIHBwcG9sMnRw X3NlbmRtc2coKSwgYnV0IHJhdGhlciB0aGFuIGJlaW5nIGNhbGxlZAorICogd2l0aCBhIG1zZ2hk ciBmcm9tIHVzZXJzcGFjZSwgaXQgaXMgY2FsbGVkIHdpdGggYSBza2IgZnJvbSB0aGUga2VybmVs LgorICovCitzdGF0aWMgaW50IHBwcG9sMnRwX3htaXQoc3RydWN0IHBwcF9jaGFubmVsICpjaGFu LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29j ayAqKSBjaGFuLT5wcml2YXRlOworCWludCBlcnJvciA9IDA7CisJdTggaGRyW1BQUE9MMlRQX0wy VFBfSERSX1NJWkVfU0VRXTsKKwlpbnQgaGRyX2xlbjsKKwlzdHJ1Y3QgbXNnaGRyICptc2c7CisJ c3RydWN0IHBwcG9sMnRwX3Nlc3Npb24gKnNlc3Npb247CisJc3RydWN0IHBwcG9sMnRwX3R1bm5l bCAqdHVubmVsOworCXN0cnVjdCBraW9jYiBpb2NiOworCXN0cnVjdCBzb2NrX2lvY2Igc2lvY2I7 CisJCisJRU5URVJfRlVOQ1RJT047CisJCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19ERUFEKSB8 fCAhKHNrLT5za19zdGF0ZSAmIFBQUE9YX0NPTk5FQ1RFRCkpIHsKKwkJRFBSSU5USygtMSwgImRl YWQ9JWQgc3RhdGU9JXhcbiIsIHNvY2tfZmxhZyhzaywgU09DS19ERUFEKSwgc2stPnNrX3N0YXRl KTsKKwkJZXJyb3IgPSAtRU5PVENPTk47CisJCWdvdG8gZW5kOworCX0KKworCS8qIEdldCBzZXNz aW9uIGFuZCB0dW5uZWwgY29udGV4dHMgZnJvbSB0aGUgc29ja2V0ICovCisJU09DS18yX1NFU1NJ T04oc2ssIHNlc3Npb24sIGVycm9yLCAtRUJBREYsIGVuZCwgMCk7CisJU09DS18yX1RVTk5FTChz ZXNzaW9uLT50dW5uZWxfc29jaywgdHVubmVsLCBlcnJvciwgLUVCQURGLCBlbmQsIDApOworCisJ LyogU2V0dXAgTDJUUCBoZWFkZXIgKi8JCisJaGRyX2xlbiA9IHBwcG9sMnRwX2J1aWxkX2wydHBf aGVhZGVyKHNlc3Npb24sICZoZHIpOworCisJaWYgKHNlc3Npb24tPnNlbmRfc2VxKQorCQlQUklO VEsoc2Vzc2lvbi0+ZGVidWcsIFBQUE9MMlRQX01TR19EQVRBLCBLRVJOX0RFQlVHLCAKKwkJICAg ICAgICIlczogc2VuZCAlZCBieXRlcywgbnM9JWh1XG4iLCAKKwkJICAgICAgIHNlc3Npb24tPm5h bWUsIHNrYi0+bGVuLCBzZXNzaW9uLT5ucyAtIDEpOworCWVsc2UKKwkJUFJJTlRLKHNlc3Npb24t PmRlYnVnLCBQUFBPTDJUUF9NU0dfREFUQSwgS0VSTl9ERUJVRywgCisJCSAgICAgICAiJXM6IHNl bmQgJWQgYnl0ZXNcbiIsIHNlc3Npb24tPm5hbWUsIHNrYi0+bGVuKTsKKworCS8qIFVuZm9ydHVu YXRseSB0aGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHdheSBmb3IgdXMgdG8gcGFzcyBhbiBz a2IKKwkgKiB0byB0aGUgVURQIGxheWVyLCB3ZSBoYXZlIHRvIHByZXRlbmQgdG8gYmUgc2VuZGlu ZyBvcmRpbmFyeSBkYXRhCisJICogYW5kIHVzZSBzZW5kbXNnCisJICovCisJbXNnID0ga21hbGxv YyhzaXplb2Yoc3RydWN0IG1zZ2hkciksIEdGUF9LRVJORUwpOworCWlmIChtc2cgPT0gTlVMTCkg eworCQllcnJvciA9IC1FTk9CVUZTOworCQl0dW5uZWwtPnN0YXRzLnR4X2Vycm9ycysrOworCQlz ZXNzaW9uLT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJZ290byBlbmQ7CisJfQorCQorCW1zZy0+bXNn X2lvdiA9IGttYWxsb2MoMiAqIHNpemVvZihzdHJ1Y3QgaW92ZWMpLCBHRlBfS0VSTkVMKTsKKwlp ZiAobXNnLT5tc2dfaW92ID09IE5VTEwpIHsKKwkJZXJyb3IgPSAtRU5PQlVGUzsKKwkJdHVubmVs LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJc2Vzc2lvbi0+c3RhdHMudHhfZXJyb3JzKys7CisJCWtm cmVlKG1zZyk7CisJCWdvdG8gZW5kOworCX0KKwltc2ctPm1zZ19pb3ZbMF0uaW92X2Jhc2UgPSAm aGRyOworCW1zZy0+bXNnX2lvdlswXS5pb3ZfbGVuCSA9IGhkcl9sZW47CisJLyogRklYTUU6IGRv IHdlIG5lZWQgdG8gaGFuZGxlIHNrYiBmcmFnbWVudHMgaGVyZT8gKi8KKwltc2ctPm1zZ19pb3Zb MV0uaW92X2Jhc2UgPSBza2ItPmRhdGE7CisJbXNnLT5tc2dfaW92WzFdLmlvdl9sZW4JID0gc2ti LT5sZW47CisJbXNnLT5tc2dfaW92bGVuID0gMjsKKwkKKwkvKiBJZiB0aGUgdXNlciBjYWxscyBz ZW5kdG8oKSB0aGF0J3MganVzdCB0b28gYmFkICovCisJbXNnLT5tc2dfbmFtZQkgPSAmc2Vzc2lv bi0+dHVubmVsX2FkZHIuYWRkcjsKKwltc2ctPm1zZ19uYW1lbGVuID0gc2l6ZW9mKHNlc3Npb24t PnR1bm5lbF9hZGRyLmFkZHIpOworCQorCW1zZy0+bXNnX2NvbnRyb2wgICAgPSBOVUxMOworCW1z Zy0+bXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy0+bXNnX2ZsYWdzCSAgICA9IE1TR19ET05UV0FJ VDsJLyogTmVlZCB0aGlzIHRvIHByZXZlbnQgYmxvY2tpbmcgKi8KKworCS8qIERvIHRoZSByZWFs IHdvcmsuIFRoaXMgYWx3YXlzIGZyZWVzIG1zZywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyCisJICog dGhlcmUgd2FzIGFuIGVycm9yCisJICovCisJaW5pdF9zeW5jX2tpb2NiKCZpb2NiLCBOVUxMKTsK Kwlpb2NiLnByaXZhdGUgPSAmc2lvY2I7CisJZXJyb3IgPSBwcHBvbDJ0cF91ZHBfc29ja19zZW5k KCZpb2NiLCBzZXNzaW9uLCB0dW5uZWwsIG1zZywgCisJCQkJICAgICAgIHNrYi0+bGVuICsgaGRy X2xlbik7CisKKwlrZnJlZV9za2Ioc2tiKTsKKworZW5kOgorCUVYSVRfRlVOQ1RJT047CisJcmV0 dXJuIGVycm9yOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNlc3Npb24gKGFuZCB0 dW5uZWwgY29udHJvbCkgc29ja2V0IGNyZWF0ZS9kZXN0cm95LgorICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqLworCisvKiBXaGVuIHRoZSB0dW5uZWwgVURQIHNvY2tldCBpcyBjbG9zZWQsIGFsbCB0aGUg YXR0YWNoZWQgc29ja2V0cyBuZWVkIHRvIGdvCisgKiB0b28uIFRoaXMgaGFuZGxlcyB0aGF0Lgor ICovCitzdGF0aWMgdm9pZCBwcHBvbDJ0cF90dW5uZWxfY2xvc2VhbGwoc3RydWN0IHBwcG9sMnRw X3R1bm5lbCAqdHVubmVsKQoreworCWludCBoYXNoOworCisJRU5URVJfRlVOQ1RJT047CisJCisJ aWYgKHR1bm5lbCA9PSBOVUxMKQorCQlCVUcoKTsKKworCVBSSU5USyh0dW5uZWwtPmRlYnVnLCBQ UFBPTDJUUF9NU0dfQ09OVFJPTCwgS0VSTl9JTkZPLCAKKwkgICAgICAgIiVzOiBjbG9zaW5nIGFs bCBzZXNzaW9ucy4uLlxuIiwgdHVubmVsLT5uYW1lKTsKKworCXJlYWRfbG9ja19iaCgmcHBwb2wy dHBfaGFzaF9sb2NrKTsKKwlmb3IgKGhhc2ggPSAwOyBoYXNoIDwgUFBQT0wyVFBfSEFTSF9TSVpF OyBoYXNoKyspIHsKKwkJc3RydWN0IHBwcG9sMnRwX3Nlc3Npb24gKnNlc3Npb24gPSB0dW5uZWwt Pmhhc2hbaGFzaF07CisJCXN0cnVjdCBwcHBvbDJ0cF9zZXNzaW9uICpuZXh0OworCisJCXdoaWxl IChzZXNzaW9uICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBzb2NrICpzayA9IHNlc3Npb24tPnNvY2s7 CisKKwkJCW5leHQgPSBzZXNzaW9uLT5uZXh0OworCisJCQlQUklOVEsoc2Vzc2lvbi0+ZGVidWcs IFBQUE9MMlRQX01TR19DT05UUk9MLCBLRVJOX0lORk8sCisJCQkgICAgICAgIiVzOiBjbG9zaW5n IHNlc3Npb25cbiIsIHNlc3Npb24tPm5hbWUpOworCisJCQlzb2NrX2hvbGQoc2spOworCisJCQkv KiBXZSBob2xkIGEgcmVmZXJlbmNlIHRvIFNLLCBub3cgZHJvcCB0aGUgaGFzaCB0YWJsZQorCQkJ ICogbG9jayBzbyB0aGF0IHdlIG1heSBhdHRlbXB0IHRvIGxvY2sgdGhlIHNvY2tldAorCQkJICog KHdoaWNoIGNhbiBzbGVlcCkuCisJCQkgKi8KKwkJCXJlYWRfdW5sb2NrX2JoKCZwcHBvbDJ0cF9o YXNoX2xvY2spOworCisJCQlsb2NrX3NvY2soc2spOworCisJCQkvKiBQdXJnZSBhbnkgcXVldWVk IGRhdGEgKi8KKwkJCXNrYl9xdWV1ZV9wdXJnZSgmc2stPnNrX3JlY2VpdmVfcXVldWUpOworCQkJ c2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfd3JpdGVfcXVldWUpOworCisJCQlpZiAoc2stPnNrX3N0 YXRlICYgKFBQUE9YX0NPTk5FQ1RFRCB8IFBQUE9YX0JPVU5EKSkgeworCQkJCXBwcG94X3VuYmlu ZF9zb2NrKHNrKTsKKwkJCQlzay0+c2tfc3RhdGUgPSBQUFBPWF9ERUFEOworCQkJCXNrLT5za19z dGF0ZV9jaGFuZ2Uoc2spOworCQkJfQorCisJCQlyZWxlYXNlX3NvY2soc2spOworCisJCQlEUFJJ TlRLKHNlc3Npb24tPmRlYnVnLCAiY2FsbGluZyBzb2NrX3B1dDsgcmVmY250PSVkXG4iLAorCQkJ CXNrLT5za19yZWZjbnQuY291bnRlcik7CisJCQlzb2NrX3B1dChzayk7CisKKwkJCXJlYWRfbG9j a19iaCgmcHBwb2wydHBfaGFzaF9sb2NrKTsKKworCQkJc2Vzc2lvbiA9IG5leHQ7CisJCX0KKwkJ dHVubmVsLT5oYXNoW2hhc2hdID0gTlVMTDsKKwl9CisJcmVhZF91bmxvY2tfYmgoJnBwcG9sMnRw X2hhc2hfbG9jayk7CisKKwlFWElUX0ZVTkNUSU9OOworfQorCisvKiBSZWFsbHkga2lsbCB0aGUg dHVubmVsLgorICogQ29tZSBoZXJlIG9ubHkgd2hlbiBhbGwgc2Vzc2lvbnMgaGF2ZSBiZWVuIGNs ZWFyZWQgZnJvbSB0aGUgdHVubmVsLgorICovCitzdGF0aWMgdm9pZCBwcHBvbDJ0cF90dW5uZWxf ZnJlZShzdHJ1Y3QgcHBwb2wydHBfdHVubmVsICp0dW5uZWwpCit7CisJc3RydWN0IHBwcG9sMnRw X3R1bm5lbCAqKnB0cjsKKworCUVOVEVSX0ZVTkNUSU9OOworCisJLyogUmVtb3ZlIGZyb20gc29j a2V0IGxpc3QgKi8KKwlmb3IgKHB0ciA9ICZwcHBvbDJ0cF90dW5uZWxfbGlzdDsgKnB0cjsgcHRy ID0gJigqcHRyKS0+bmV4dCkgeworCQlpZiAoKnB0ciA9PSB0dW5uZWwpIHsKKwkJCSpwdHIgPSB0 dW5uZWwtPm5leHQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWtmcmVlKHR1bm5lbCk7CisKKwlF WElUX0ZVTkNUSU9OOworfQorCisvKiBUdW5uZWwgVURQIHNvY2tldCBkZXN0cnVjdCBob29rLgor ICogVGhlIHR1bm5lbCBjb250ZXh0IGlzIGRlbGV0ZWQgb25seSB3aGVuIGFsbCBzZXNzaW9uIHNv Y2tldHMgaGF2ZSBiZWVuCisgKiBjbG9zZWQuCisgKi8KK3N0YXRpYyB2b2lkIHBwcG9sMnRwX3R1 bm5lbF9kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHBwcG9sMnRwX3R1bm5l bCAqdHVubmVsOworCWludCBlcnJvciA9IDA7CisJRU5URVJfRlVOQ1RJT047CisJCisJU09DS18y X1RVTk5FTChzaywgdHVubmVsLCBlcnJvciwgLUVCQURGLCBlbmQsIDApOworCisJUFJJTlRLKHR1 bm5lbC0+ZGVidWcsIFBQUE9MMlRQX01TR19DT05UUk9MLCBLRVJOX0lORk8sIAorCSAgICAgICAi JXM6IGNsb3NpbmcuLi5cbiIsIHR1bm5lbC0+bmFtZSk7IAorCQorCXBwcG9sMnRwX3R1bm5lbF9j bG9zZWFsbCh0dW5uZWwpOworCitlbmQ6CisJRVhJVF9GVU5DVElPTjsKKwlyZXR1cm47Cit9CisK Ky8qIFJlYWxseSBraWxsIHRoZSBzb2NrZXQuIChDYWxsZWQgZnJvbSBzb2NrX3B1dCBpZiByZWZj bnQgPT0gMC4pCisgKi8KK3N0YXRpYyB2b2lkIHBwcG9sMnRwX3Nlc3Npb25fZGVzdHJ1Y3Qoc3Ry dWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBwcHBveF9vcHQgKnBvID0gcHBwb3hfc2soc2spOwor CXN0cnVjdCBwcHBvbDJ0cF9zZXNzaW9uICpzZXNzaW9uID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAw OworCisJRU5URVJfRlVOQ1RJT047CisJCisJaWYgKHNrLT5za191c2VyX2RhdGEgIT0gTlVMTCkg eworCQlzdHJ1Y3QgcHBwb2wydHBfdHVubmVsICp0dW5uZWw7CisKKwkJU09DS18yX1NFU1NJT04o c2ssIHNlc3Npb24sIGVycm9yLCAtRUJBREYsIG91dCwgMCk7CisKKwkJLyogRG9uJ3QgdXNlIFNP Q0tfMl9UVU5ORUwoKSBoZXJlIHRvIGdldCB0aGUgdHVubmVsIGNvbnRleHQKKwkJICogYmVjYXVz ZSB0aGUgdHVubmVsIHNvY2tldCBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBjbG9zZWQKKwkJICog KGl0cyBzay0+c2tfdXNlcl9kYXRhIHdpbGwgYmUgTlVMTCkgc28gdXNlIHRoZSBzZXNzaW9uJ3MK KwkJICogcHJpdmF0ZSB0dW5uZWwgcHRyIGluc3RlYWQuCisJCSAqLworCQl0dW5uZWwgPSBzZXNz aW9uLT50dW5uZWw7CisJCWlmICh0dW5uZWwgIT0gTlVMTCkgeworCQkJaWYgKHR1bm5lbC0+bWFn aWMgIT0gTDJUUF9UVU5ORUxfTUFHSUMpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiAlczol ZDogQkFEIFRVTk5FTCBNQUdJQyAiCisJCQkJICAgICAgICIoIHR1bm5lbD0lcCBtYWdpYz0leCAp XG4iLAorCQkJCSAgICAgICBfX0ZVTkNUSU9OX18sIF9fRklMRV9fLCBfX0xJTkVfXywgCisJCQkJ ICAgICAgIHR1bm5lbCwgdHVubmVsLT5tYWdpYyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0K KworCQkvKiBEZWxldGUgdHVubmVsIGNvbnRleHQgaWYgdGhpcyB3YXMgdGhlIGxhc3Qgc2Vzc2lv biBvbiB0aGUKKwkJICogdHVubmVsLiAgVGhpcyB3YXMgYWxsb2NhdGVkIHdoZW4gdGhlIGZpcnN0 IHNlc3Npb24gd2FzCisJCSAqIGNyZWF0ZWQgb24gdGhlIHR1bm5lbC4gU2VlCisJCSAqIHBwcG9s MnRwX3ByZXBhcmVfdHVubmVsX3NvY2tldCgpLgorCQkgKi8KKwkJRFBSSU5USyh0dW5uZWwtPmRl YnVnLCAiJXM6IHNlc3Npb25fY291bnQ9JWRcbiIsIAorCQkJdHVubmVsLT5uYW1lLCBhdG9taWNf cmVhZCgmdHVubmVsLT5zZXNzaW9uX2NvdW50KSk7CisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0 KCZ0dW5uZWwtPnNlc3Npb25fY291bnQpKSB7CisJCQlwcHBvbDJ0cF90dW5uZWxfZnJlZSh0dW5u ZWwpOworCQl9CisJfQorCisJaWYgKHBvKQorCQlrZnJlZShwbyk7CisKKwlpZiAoc2Vzc2lvbiAh PSBOVUxMKQorCQlrZnJlZShzZXNzaW9uKTsKKworb3V0OgorCUVYSVRfRlVOQ1RJT047Cit9CisK Ky8qIENhbGxlZCB3aGVuIHRoZSBQUFBvWCBzb2NrZXQgKHNlc3Npb24pIGlzIGNsb3NlZC4KKyAq Lworc3RhdGljIGludCBwcHBvbDJ0cF9yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJ c3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHBwcG9sMnRwX3Nlc3Npb24gKnNl c3Npb24gPSBOVUxMOworCXN0cnVjdCBwcHBvbDJ0cF90dW5uZWwgKnR1bm5lbDsKKwlpbnQgZXJy b3IgPSAwOworCUVOVEVSX0ZVTkNUSU9OOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwlp ZiAoc29ja19mbGFnKHNrLCBTT0NLX0RFQUQpICE9IDApCisJCXJldHVybiAtRUJBREY7CisKKwlE UFJJTlRLKC0xLCAiJXM6LCBzaz0lcCAoJXApLCByZWZjbnQ9JXVcbiIsIF9fRlVOQ1RJT05fXywg CisJCXNrLCBzay0+c2tfb3duZXIsIG1vZHVsZV9yZWZjb3VudChUSElTX01PRFVMRSkpOworCisJ aWYgKHNrLT5za191c2VyX2RhdGEpIHsJICAgIC8qIFdhcyB0aGlzIHNvY2tldCBhY3R1YWxseSBj b25uZWN0ZWQ/ICovCisJCVNPQ0tfMl9TRVNTSU9OKHNrLCBzZXNzaW9uLCBlcnJvciwgLUVCQURG LCBlbmQsIDApOworCisJCS8qIERvbid0IHVzZSBTT0NLXzJfVFVOTkVMKCkgaGVyZSB0byBnZXQg dGhlIHR1bm5lbCBjb250ZXh0CisJCSAqIGJlY2F1c2UgdGhlIHR1bm5lbCBzb2NrZXQgbWlnaHQg aGF2ZSBhbHJlYWR5IGJlZW4gY2xvc2VkCisJCSAqIChpdHMgc2stPnNrX3VzZXJfZGF0YSB3aWxs IGJlIE5VTEwpIHNvIHVzZSB0aGUgc2Vzc2lvbidzCisJCSAqIHByaXZhdGUgdHVubmVsIHB0ciBp bnN0ZWFkLgorCQkgKi8KKwkJdHVubmVsID0gc2Vzc2lvbi0+dHVubmVsOworCQlpZiAodHVubmVs ICE9IE5VTEwpIHsKKwkJCWlmICh0dW5uZWwtPm1hZ2ljID09IEwyVFBfVFVOTkVMX01BR0lDKSB7 CisJCQkJLyogRGVsZXRlIHRoZSBzZXNzaW9uIHNvY2tldCBmcm9tIHRoZSBoYXNoICovCisJCQkJ ZGVsZXRlX2l0ZW0odHVubmVsLCAKKwkJCQkJICAgIHNlc3Npb24tPnR1bm5lbF9hZGRyLnNfdHVu bmVsLCAKKwkJCQkJICAgIHNlc3Npb24tPnR1bm5lbF9hZGRyLnNfc2Vzc2lvbik7CisJCQl9IGVs c2UgeworCQkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzOiVkOiBCQUQgVFVOTkVMIE1BR0lDICIK KwkJCQkgICAgICAgIiggdHVubmVsPSVwIG1hZ2ljPSV4IClcbiIsCisJCQkJICAgICAgIF9fRlVO Q1RJT05fXywgX19GSUxFX18sIF9fTElORV9fLCAKKwkJCQkgICAgICAgdHVubmVsLCB0dW5uZWwt Pm1hZ2ljKTsKKwkJCQlnb3RvIGVuZDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChzay0+c2tfc3Rh dGUgJiAoUFBQT1hfQ09OTkVDVEVEIHwgUFBQT1hfQk9VTkQpKQorCQlwcHBveF91bmJpbmRfc29j ayhzayk7CisKKwkvKiBTaWduYWwgdGhlIGRlYXRoIG9mIHRoZSBzb2NrZXQuICovCisJc2stPnNr X3N0YXRlID0gUFBQT1hfREVBRDsKKwlzb2NrX29ycGhhbihzayk7CisJc29jay0+c2sgPSBOVUxM OworCisJLyogUHVyZ2UgYW55IHF1ZXVlZCBkYXRhICovCisJc2tiX3F1ZXVlX3B1cmdlKCZzay0+ c2tfcmVjZWl2ZV9xdWV1ZSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfd3JpdGVfcXVldWUp OworCisJaWYgKHNlc3Npb24gIT0gTlVMTCkKKwkJRFBSSU5USyhzZXNzaW9uLT5kZWJ1ZywgImNh bGxpbmcgc29ja19wdXQ7IHJlZmNudD0lZFxuIiwgCisJCQlzZXNzaW9uLT5zb2NrLT5za19yZWZj bnQuY291bnRlcik7CisJc29ja19wdXQoc2spOworCitlbmQ6CisJRVhJVF9GVU5DVElPTjsKKwly ZXR1cm4gZXJyb3I7Cit9CisKKy8qIEludGVybmFsIGZ1bmN0aW9uIHRvIHByZXBhcmUgYSB0dW5u ZWwgKFVEUCkgc29ja2V0IHRvIGhhdmUgUFBQb1ggc29ja2V0cworICogYXR0YWNoZWQgdG8gaXQK KyAqLworc3RhdGljIHN0cnVjdCBzb2NrICpwcHBvbDJ0cF9wcmVwYXJlX3R1bm5lbF9zb2NrZXQo aW50IGZkLCB1MTYgdHVubmVsX2lkLCAKKwkJCQkJCSAgIGludCAqZXJyb3IpCit7CisJaW50IGVy cjsKKwlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gTlVMTDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3Ry dWN0IHBwcG9sMnRwX3R1bm5lbCAqdHVubmVsOworCXN0cnVjdCBzb2NrICpyZXQgPSBOVUxMOwor CisJRU5URVJfRlVOQ1RJT047CisJCisJLyogR2V0IHRoZSBzb2NrZXQgZnJvbSB0aGUgZmQgKi8K KwllcnIgPSAtRUJBREY7CisJc29jayA9IHNvY2tmZF9sb29rdXAoZmQsICZlcnIpOworCWlmICgh c29jaykgeworCQlQUklOVEsoLTEsIFBQUE9MMlRQX01TR19DT05UUk9MLCBLRVJOX0VSUiwgCisJ CSAgICAgICAidHVubCAlaHU6IHNvY2tmZF9sb29rdXAoZmQ9JWQpIHJldHVybmVkICVkXG4iLCAK KwkJICAgICAgIHR1bm5lbF9pZCwgZmQsIGVycik7CisJCWdvdG8gZXJyOworCX0KKworCS8qIFF1 aWNrIHNhbml0eSBjaGVja3MgKi8KKwllcnIgPSAtRVNPQ0tUTk9TVVBQT1JUOworCWlmIChzb2Nr LT50eXBlICE9IFNPQ0tfREdSQU0pIHsKKwkJUFJJTlRLKC0xLCBQUFBPTDJUUF9NU0dfQ09OVFJP TCwgS0VSTl9FUlIsIAorCQkgICAgICAgInR1bmwgJWh1OiBmZCAlZCB3cm9uZyB0eXBlLCBnb3Qg JWQsIGV4cGVjdGVkICVkXG4iLCAKKwkJICAgICAgIHR1bm5lbF9pZCwgZmQsIHNvY2stPnR5cGUs IFNPQ0tfREdSQU0pOworCQlnb3RvIGVycjsKKwl9CisJZXJyID0gLUVBRk5PU1VQUE9SVDsKKwlp ZiAoc29jay0+b3BzLT5mYW1pbHkhPUFGX0lORVQpIHsKKwkJUFJJTlRLKC0xLCBQUFBPTDJUUF9N U0dfQ09OVFJPTCwgS0VSTl9FUlIsIAorCQkgICAgICAgInR1bmwgJWh1OiBmZCAlZCB3cm9uZyBm YW1pbHksIGdvdCAlZCwgZXhwZWN0ZWQgJWRcbiIsIAorCQkgICAgICAgdHVubmVsX2lkLCBmZCwg c29jay0+b3BzLT5mYW1pbHksIEFGX0lORVQpOworCQlnb3RvIGVycjsKKwl9CisKKwllcnIgPSAt RU5PVENPTk47CisJc2sgPSBzb2NrLT5zazsKKwkKKwkvKiBDaGVjayBpZiB0aGlzIHNvY2tldCBo YXMgYWxyZWFkeSBiZWVuIHByZXBwZWQgKi8KKwl0dW5uZWwgPSAoc3RydWN0IHBwcG9sMnRwX3R1 bm5lbCAqKXNrLT5za191c2VyX2RhdGE7CisJaWYgKHR1bm5lbCAhPSBOVUxMKSB7CisJCS8qIFVz ZXItZGF0YSBmaWVsZCBhbHJlYWR5IHNldCAqLworCQllcnIgPSAtRUJVU1k7CisJCWlmICh0dW5u ZWwtPm1hZ2ljICE9IEwyVFBfVFVOTkVMX01BR0lDKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVz OiAlczolZDogQkFEIFRVTk5FTCBNQUdJQyAiCisJCQkgICAgICAgIiggdHVubmVsPSVwIG1hZ2lj PSV4IClcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBfX0ZJTEVfXywgX19MSU5FX18sIAor CQkJICAgICAgIHR1bm5lbCwgdHVubmVsLT5tYWdpYyk7CisJCQlnb3RvIGVycjsKKwkJfQorCisJ CS8qIFRoaXMgc29ja2V0IGhhcyBhbHJlYWR5IGJlZW4gcHJlcHBlZCAqLworCQlyZXQgPSB0dW5u ZWwtPnNvY2s7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFRoaXMgc29ja2V0IGlzIGF2YWlsYWJs ZSBhbmQgbmVlZHMgcHJlcHBpbmcuIENyZWF0ZSBhbmV3IHR1bm5lbAorCSAqIGNvbnRleHQgYW5k IGluaXQgaXQuCisJICovCisJc2stPnNrX3VzZXJfZGF0YSA9IHR1bm5lbCA9IGttYWxsb2Moc2l6 ZW9mKHN0cnVjdCBwcHBvbDJ0cF90dW5uZWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2stPnNrX3Vz ZXJfZGF0YSA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKwor CURQUklOVEsoLTEsICJ0dW5sICVodTogYWxsb2NhdGVkIHR1bm5lbD0lcCwgc2s9JXAsIHNvY2s9 JXBcbiIsIAorCQl0dW5uZWxfaWQsIHR1bm5lbCwgc2ssIHNvY2spOworCisJbWVtc2V0KHR1bm5l bCwgMCwgc2l6ZW9mKHN0cnVjdCBwcHBvbDJ0cF90dW5uZWwpKTsKKwkKKwl0dW5uZWwtPm1hZ2lj ID0gTDJUUF9UVU5ORUxfTUFHSUM7CisJc3ByaW50ZigmdHVubmVsLT5uYW1lWzBdLCAidHVubCAl aHUiLCB0dW5uZWxfaWQpOworCisJdHVubmVsLT5zdGF0cy50dW5uZWxfaWQgPSB0dW5uZWxfaWQ7 CisKKwl0dW5uZWwtPmRlYnVnID0gUFBQT0wyVFBfREVGQVVMVF9ERUJVR19GTEFHUzsKKworCS8q IFNldHVwIHRoZSBuZXcgcHJvdG9jb2wgc3R1ZmYgKi8KKwl0dW5uZWwtPm9sZF9wcm90byAgPSAq c2stPnNrX3Byb3Q7CisJdHVubmVsLT5sMnRwX3Byb3RvID0gKnNrLT5za19wcm90OworCQorCXNr LT5za19wcm90ID0gJnR1bm5lbC0+bDJ0cF9wcm90bzsKKwkKKwl0dW5uZWwtPm9sZF9kYXRhX3Jl YWR5ID0gc2stPnNrX2RhdGFfcmVhZHk7CisJc2stPnNrX2RhdGFfcmVhZHkJICAgICAgID0gJnBw cG9sMnRwX2RhdGFfcmVhZHk7CisKKwl0dW5uZWwtPm9sZF9za19kZXN0cnVjdCA9IHNrLT5za19k ZXN0cnVjdDsKKwlzay0+c2tfZGVzdHJ1Y3QJCT0gJnBwcG9sMnRwX3R1bm5lbF9kZXN0cnVjdDsK KworCXR1bm5lbC0+c29jayAgID0gc2s7CisJc2stPnNrX2FsbG9jYXRpb24gPSBHRlBfQVRPTUlD OworCisJLyogQWRkIHR1bm5lbCB0byBvdXIgbGlzdCAqLworCXR1bm5lbC0+bmV4dAkgICAgID0g cHBwb2wydHBfdHVubmVsX2xpc3Q7CisJcHBwb2wydHBfdHVubmVsX2xpc3QgPSB0dW5uZWw7CisJ CisJcmV0ID0gdHVubmVsLT5zb2NrOworCQorCSplcnJvciA9IDA7CitvdXQ6CisJaWYgKHNvY2sp CisJCXNvY2tmZF9wdXQoc29jayk7CisJRVhJVF9GVU5DVElPTjsKKworCXJldHVybiByZXQ7CisK K2VycjoKKwkqZXJyb3IgPSBlcnI7CisJZ290byBvdXQ7Cit9CisKKy8qIHNvY2tldCgpIGhhbmRs ZXIuIEluaXRpYWxpemUgYSBuZXcgc3RydWN0IHNvY2suCisgKi8KK3N0YXRpYyBpbnQgcHBwb2wy dHBfY3JlYXRlKHN0cnVjdCBzb2NrZXQgKnNvY2spCit7CisJaW50IGVycm9yID0gMDsKKwlzdHJ1 Y3Qgc29jayAqc2s7CisJc3RydWN0IHBwcG94X29wdCAqcG87CisKKwlFTlRFUl9GVU5DVElPTjsK KwlEUFJJTlRLKC0xLCAic29jaz0lcFxuIiwgc29jayk7CisKKwlzayA9IHNrX2FsbG9jKFBGX1BQ UE9YLCBHRlBfS0VSTkVMLCAxLCBOVUxMKTsKKwlpZiAoIXNrKQorCQlyZXR1cm4gLUVOT01FTTsK KwlEUFJJTlRLKC0xLCAic2tfYWxsb2MsIHNrPSVwXG4iLCBzayk7CisKKwlzb2NrX2luaXRfZGF0 YShzb2NrLCBzayk7CisJRFBSSU5USygtMSwgInNrX3NldF9vd25lciwgc2s9JXAgKCVwKSwgcmVm Y250PSV1XG4iLCAKKwkJc2ssIHNrLT5za19vd25lciwgbW9kdWxlX3JlZmNvdW50KFRISVNfTU9E VUxFKSk7CisKKwkvKiBGSVhNRTogTm90IHN1cmUgd2h5IHRoZSBtb2R1bGUgdXNlIGNvdW50ZXIg aXMgemVybyB3aGVuIHdlCisJICogZ2V0IGhlcmUuICBTaW1pbGFyIHNvY2tldCBjb2RlIGRvZXNu J3Qgc2VlbSB0byBidW1wIGl0cworCSAqIG1vZHVsZSB1c2UgY291bnQgYmVmb3JlIGNhbGxpbmcg c2tfc2V0X293bmVyKCksIHNvIHdoeQorCSAqIHBwcG9sMnRwPworCSAqLworCWlmICh0cnlfbW9k dWxlX2dldChUSElTX01PRFVMRSkpIHsKKwkJc2tfc2V0X293bmVyKHNrLCBUSElTX01PRFVMRSk7 CisJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCX0KKworCXNvY2stPnN0YXRlICA9IFNTX1VO Q09OTkVDVEVEOworCXNvY2stPm9wcyAgICA9ICZwcHBvbDJ0cF9vcHM7CisKKwlzay0+c2tfYmFj a2xvZ19yY3YgPSBwcHBvbDJ0cF9yZWN2X2NvcmU7CisJc2stPnNrX3Byb3RvY29sICAgID0gUFhf UFJPVE9fT0wyVFA7CisJc2stPnNrX2ZhbWlseSAgICAgID0gUEZfUFBQT1g7CisJc2stPnNrX3N0 YXRlICAgICAgID0gUFBQT1hfTk9ORTsKKwlzay0+c2tfdHlwZSAgICAgICAgPSBTT0NLX1NUUkVB TTsKKwlzay0+c2tfZGVzdHJ1Y3QgICAgPSBwcHBvbDJ0cF9zZXNzaW9uX2Rlc3RydWN0OworCisJ cG8gPSBzay0+c2tfcHJvdGluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHBwb3hfb3B0KSwg R0ZQX0tFUk5FTCk7CisJaWYgKCFwbykgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZnJl ZV9zazsKKwl9CisKKwltZW1zZXQoKHZvaWQgKikgcG8sIDAsIHNpemVvZigqcG8pKTsKKwlwby0+ c2sgPSBzazsKKworCXNvY2stPnNrID0gc2s7CisKKwlFWElUX0ZVTkNUSU9OOworCXJldHVybiAw OworCitmcmVlX3NrOgorCXNrX2ZyZWUoc2spOworCUVYSVRfRlVOQ1RJT047CisJcmV0dXJuIGVy cm9yOworfQorCisvKiBjb25uZWN0KCkgaGFuZGxlci4uCUF0dGFjaCBhIFBQUG9YIHNvY2tldCB0 byBhIHR1bm5lbCBVRFAgc29ja2V0CisgKi8KK2ludCBwcHBvbDJ0cF9jb25uZWN0KHN0cnVjdCBz b2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdXNlcnZhZGRyLAorCQkgICAgIGludCBzb2Nr YWRkcl9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlz dHJ1Y3Qgc29ja2FkZHJfcHBwb3ggKnNwID0gKHN0cnVjdCBzb2NrYWRkcl9wcHBveCAqKSB1c2Vy dmFkZHI7CisJc3RydWN0IHBwcG94X29wdCAqcG8gPSBwcHBveF9zayhzayk7CisJc3RydWN0IHNv Y2sgKnR1bm5lbF9zb2NrID0gTlVMTDsKKwlzdHJ1Y3QgcHBwb2wydHBfc2Vzc2lvbiAqc2Vzc2lv biA9IE5VTEw7CisJc3RydWN0IHBwcG9sMnRwX3R1bm5lbCAqdHVubmVsOworCXN0cnVjdCBkc3Rf ZW50cnkgKmRzdDsKKwlpbnQgZXJyb3IgPSAwOworCisJRU5URVJfRlVOQ1RJT047CisJCisJRFBS SU5USygtMSwgInNvY2s9JXAsIHVzZXJ2YWRkcj0lcCwgc29ja2FkZHJfbGVuPSVkLCBmbGFncz0l ZFxuIiwgCisJCXNvY2ssIHVzZXJ2YWRkciwgc29ja2FkZHJfbGVuLCBmbGFncyk7CisJbG9ja19z b2NrKHNrKTsKKworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoc3AtPnNhX3Byb3RvY29sICE9IFBY X1BST1RPX09MMlRQKQorCQlnb3RvIGVuZDsKKworCS8qIENoZWNrIGZvciBhbHJlYWR5IGJvdW5k IHNvY2tldHMgKi8KKwllcnJvciA9IC1FQlVTWTsKKwlpZiAoc2stPnNrX3N0YXRlICYgUFBQT1hf Q09OTkVDVEVEKQorCQlnb3RvIGVuZDsKKworCS8qIFdlIGRvbid0IHN1cHBvcnRpbmcgcmViaW5k aW5nIGFueXdheSAqLwkJCisJaWYgKHNrLT5za191c2VyX2RhdGEpCisJCWdvdG8gZW5kOyAvKiBz b2NrZXQgaXMgYWxyZWFkeSBhdHRhY2hlZCAqLworCisJLyogRG9uJ3QgYmluZCBpZiBzX3R1bm5l bCBpcyAwICovCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChzcC0+c2FfYWRkci5wcHBvbDJ0cC5z X3R1bm5lbCA9PSAwKQorCQlnb3RvIGVuZDsKKworCS8qIFRoaXMgbG9va3MgdXAgdGhlIHR1bm5l bCBzb2NrZXQgYW5kIGNvbmZpZ3VyZXMgaXQgaWYgbmVjZXNzYXJ5ICovCisJdHVubmVsX3NvY2sg PSAKKwkJcHBwb2wydHBfcHJlcGFyZV90dW5uZWxfc29ja2V0KHNwLT5zYV9hZGRyLnBwcG9sMnRw LmZkLCAKKwkJCQkJICAgICAgIHNwLT5zYV9hZGRyLnBwcG9sMnRwLnNfdHVubmVsLCAKKwkJCQkJ ICAgICAgICZlcnJvcik7CisJaWYgKHR1bm5lbF9zb2NrID09IE5VTEwpCisJCWdvdG8gZW5kOwor CXR1bm5lbCA9IHR1bm5lbF9zb2NrLT5za191c2VyX2RhdGE7CisKKwkvKiBBbGxvY2F0ZSBhbmQg aW5pdGlhbGl6ZSBhIG5ldyBzZXNzaW9uIGNvbnRleHQuCisJICovCisJc2Vzc2lvbiA9IGttYWxs b2Moc2l6ZW9mKHN0cnVjdCBwcHBvbDJ0cF9zZXNzaW9uKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNl c3Npb24gPT0gTlVMTCkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZW5kOworCX0KKwor CW1lbXNldChzZXNzaW9uLCAwLCBzaXplb2Yoc3RydWN0IHBwcG9sMnRwX3Nlc3Npb24pKTsKKwor CXNlc3Npb24tPm1hZ2ljCSAgICAgPSBMMlRQX1NFU1NJT05fTUFHSUM7CisJc2Vzc2lvbi0+b3du ZXIJICAgICA9IGN1cnJlbnQtPnBpZDsKKwlzZXNzaW9uLT5zb2NrCSAgICAgPSBzazsKKwlzZXNz aW9uLT50dW5uZWwJICAgICA9IHR1bm5lbDsKKwlzZXNzaW9uLT50dW5uZWxfc29jayA9IHR1bm5l bF9zb2NrOworCXNlc3Npb24tPnR1bm5lbF9hZGRyID0gc3AtPnNhX2FkZHIucHBwb2wydHA7CisJ c3ByaW50Zigmc2Vzc2lvbi0+bmFtZVswXSwgInNlc3MgJWh1LyVodSIsIAorCQlzZXNzaW9uLT50 dW5uZWxfYWRkci5zX3R1bm5lbCwgCisJCXNlc3Npb24tPnR1bm5lbF9hZGRyLnNfc2Vzc2lvbik7 CisKKwlzZXNzaW9uLT5zdGF0cy50dW5uZWxfaWQgID0gc2Vzc2lvbi0+dHVubmVsX2FkZHIuc190 dW5uZWw7CisJc2Vzc2lvbi0+c3RhdHMuc2Vzc2lvbl9pZCA9IHNlc3Npb24tPnR1bm5lbF9hZGRy LnNfc2Vzc2lvbjsKKwkKKwlzZXNzaW9uLT5kZWJ1ZyA9IFBQUE9MMlRQX0RFRkFVTFRfREVCVUdf RkxBR1M7CisKKwkvKiBEZWZhdWx0IE1UVSBtdXN0IGFsbG93IHNwYWNlIGZvciBVRFAvTDJUUC9Q UFAKKwkgKiBoZWFkZXJzLiBMZWF2ZSBzb21lIHNsYWNrLiAKKwkgKi8KKwlzZXNzaW9uLT5tdHUg PSBzZXNzaW9uLT5tcnUgPSAxNTAwIC0gUFBQT0wyVFBfSEVBREVSX09WRVJIRUFEOworCisJLyog SWYgUE1UVSBkaXNjb3Zlcnkgd2FzIGVuYWJsZWQsIHVzZSB0aGUgTVRVIHRoYXQgd2FzIGRpc2Nv dmVyZWQgKi8KKwlkc3QgPSBza19kc3RfZ2V0KHNrKTsKKwlpZiAoZHN0ICE9IE5VTEwpIHsKKwkJ dTMyIHBtdHUgPSBkc3RfcG10dShfX3NrX2RzdF9nZXQoc2spKTsKKwkJaWYgKHBtdHUgIT0gMCkg eworCQkJc2Vzc2lvbi0+bXR1ID0gc2Vzc2lvbi0+bXJ1ID0gcG10dSAtIAorCQkJCVBQUE9MMlRQ X0hFQURFUl9PVkVSSEVBRDsKKwkJCURQUklOVEsoc2Vzc2lvbi0+ZGVidWcsIAorCQkJCSIlczog TVRVIHNldCBieSBQYXRoIE1UVSBkaXNjb3Zlcnk6IG10dT0lZFxuIiwKKwkJCQlzZXNzaW9uLT5u YW1lLCBzZXNzaW9uLT5tdHUpOworCQl9CisJCWRzdF9yZWxlYXNlKGRzdCk7CisJfQorCisJLyog U3BlY2lhbCBjYXNlOiBpZiBzb3VyY2UgJiBkZXN0IHNlc3Npb25faWQgPT0gMHgwMDAwLCB0aGlz IHNvY2tldCBpcworCSAqIGJlaW5nIGNyZWF0ZWQgdG8gbWFuYWdlIHRoZSB0dW5uZWwuIERvbid0 IGFkZCB0aGUgc2Vzc2lvbiB0byB0aGUKKwkgKiBzZXNzaW9uIGhhc2ggbGlzdCwganVzdCBzZXQg dXAgdGhlIGludGVybmFsIGNvbnRleHQgZm9yIHVzZSBieQorCSAqIGlvY3RsKCkgYW5kIHNvY2tv cHQoKSBoYW5kbGVycy4KKwkgKi8KKwlpZiAoKHNlc3Npb24tPnR1bm5lbF9hZGRyLnNfc2Vzc2lv biA9PSAwKSAmJgorCSAgICAoc2Vzc2lvbi0+dHVubmVsX2FkZHIuZF9zZXNzaW9uID09IDApKSB7 CisJCWVycm9yID0gMDsKKwkJRFBSSU5USyhzZXNzaW9uLT5kZWJ1ZywgCisJCQkidHVubCAlaHU6 IHNvY2tldCBjcmVhdGVkIGZvciB0dW5uZWwgbWdtdCBvcHNcbiIsIAorCQkJc2Vzc2lvbi0+dHVu bmVsX2FkZHIuc190dW5uZWwpOworCQlzay0+c2tfdXNlcl9kYXRhID0gc2Vzc2lvbjsKKwkJZ290 byBvdXRfbm9fcHBwOworCX0KKworCURQUklOVEsoLTEsICIlczogYWxsb2NhdGVkIHNlc3Npb249 JXAsIHNvY2s9JXAsIG93bmVyPSVkXG4iLCAKKwkJc2Vzc2lvbi0+bmFtZSwgc2Vzc2lvbiwgc2ss IHNlc3Npb24tPm93bmVyKTsKKworCS8qIEFkZCBzZXNzaW9uIHRvIHRoZSB0dW5uZWwncyBoYXNo IGxpc3QgKi8KKwlTT0NLXzJfVFVOTkVMKHR1bm5lbF9zb2NrLCB0dW5uZWwsIGVycm9yLCAtRUJB REYsIGVuZCwgMCk7CisJaWYgKHNldF9pdGVtKHR1bm5lbCwgc2Vzc2lvbikpIHsKKwkJa2ZyZWUo c2Vzc2lvbik7CisJCWVycm9yID0gLUVBTFJFQURZOworCQlnb3RvIGVuZDsKKwl9CisJCisJLyog VGhpcyBpcyBob3cgd2UgZ2V0IHRoZSBzZXNzaW9uIGNvbnRleHQgZnJvbSB0aGUgc29ja2V0LiAq LworCXNrLT5za191c2VyX2RhdGEgPSBzZXNzaW9uOworCQkKKwkvKiBXZSBkb24ndCBzdG9yZSBh bnkgbW9yZSBvcHRpb25zIGluIHRoZSBwcHBveF9vcHQsIGV2ZXJ5dGhpbmcgaXMgaW4KKwkgKiB1 c2VyX2RhdGEgKHN0cnVjdCBwcHBvbDJ0cF9zZXNzaW9uKQorCSAqLworCXBvLT5zayA9IHNrOwor CisJLyogUmlnaHQgbm93LCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYSB3YXkgdG8gcHVzaCB0aGUg aW5jb21pbmcgc2tiJ3MKKwkgKiBzdHJhaWdodCB0aHJvdWdoIHRoZSBVRFAgbGF5ZXIsIHRoZSBv bmx5IGhlYWRlciB3ZSBuZWVkIHRvIHdvcnJ5CisJICogYWJvdXQgaXMgdGhlIEwyVFAgaGVhZGVy LiBUaGlzIHNpemUgaXMgZGlmZmVyZW50IGRlcGVuZGluZyBvbgorCSAqIHdoZXRoZXIgc2VxdWVu Y2UgbnVtYmVycyBhcmUgZW5hYmxlZCBmb3IgdGhlIGRhdGEgY2hhbm5lbC4KKwkgKi8KKwlwby0+ Y2hhbi5oZHJsZW4gPSBQUFBPTDJUUF9MMlRQX0hEUl9TSVpFX05PU0VROworCisJcG8tPmNoYW4u cHJpdmF0ZSA9IHNrOworCXBvLT5jaGFuLm9wcwkgPSAmcHBwb2wydHBfY2hhbl9vcHM7CisKKwll cnJvciA9IHBwcF9yZWdpc3Rlcl9jaGFubmVsKCZwby0+Y2hhbik7CisJaWYgKGVycm9yKQorCQln b3RvIGVuZDsKKworb3V0X25vX3BwcDoKKwlhdG9taWNfaW5jKCZ0dW5uZWwtPnNlc3Npb25fY291 bnQpOworCXNrLT5za19zdGF0ZSA9IFBQUE9YX0NPTk5FQ1RFRDsKKwlQUklOVEsoc2Vzc2lvbi0+ ZGVidWcsIFBQUE9MMlRQX01TR19DT05UUk9MLCBLRVJOX0lORk8sIAorCSAgICAgICAiJXM6IGNy ZWF0ZWRcbiIsIHNlc3Npb24tPm5hbWUpOworCitlbmQ6CisJcmVsZWFzZV9zb2NrKHNrKTsKKwor CWlmIChlcnJvciAhPSAwKQorCQlQUklOVEsoc2Vzc2lvbi0+ZGVidWcsIFBQUE9MMlRQX01TR19D T05UUk9MLCBLRVJOX1dBUk5JTkcsIAorCQkgICAgICAgIiVzOiBjb25uZWN0IGZhaWxlZDogJWRc biIsIHNlc3Npb24tPm5hbWUsIGVycm9yKTsKKworCUVYSVRfRlVOQ1RJT047CisKKwlyZXR1cm4g ZXJyb3I7Cit9CisKKy8qIGdldG5hbWUoKSBzdXBwb3J0LgorICovCitzdGF0aWMgaW50IHBwcG9s MnRwX2dldG5hbWUoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICp1YWRkciwK KwkJCSAgICBpbnQgKnVzb2NrYWRkcl9sZW4sIGludCBwZWVyKQoreworCWludCBsZW4gPSBzaXpl b2Yoc3RydWN0IHNvY2thZGRyX3BwcG94KTsKKwlzdHJ1Y3Qgc29ja2FkZHJfcHBwb3ggc3A7CisJ aW50IGVycm9yID0gMDsKKwlzdHJ1Y3QgcHBwb2wydHBfc2Vzc2lvbiAqc2Vzc2lvbjsKKworCUVO VEVSX0ZVTkNUSU9OOworCQorCWVycm9yID0gLUVOT1RDT05OOworCWlmIChzb2NrLT5zay0+c2tf c3RhdGUgIT0gUFBQT1hfQ09OTkVDVEVEKQorCQlnb3RvIGVuZDsKKwkKKwlTT0NLXzJfU0VTU0lP Tihzb2NrLT5zaywgc2Vzc2lvbiwgZXJyb3IsIC1FQkFERiwgZW5kLCAwKTsKKwkKKwlzcC5zYV9m YW1pbHkJPSBBRl9QUFBPWDsKKwlzcC5zYV9wcm90b2NvbAk9IFBYX1BST1RPX09MMlRQOworCW1l bWNweSgmc3Auc2FfYWRkci5wcHBvbDJ0cCwgJnNlc3Npb24tPnR1bm5lbF9hZGRyLAorCSAgICAg ICBzaXplb2Yoc3RydWN0IHBwcG9sMnRwX2FkZHIpKTsKKworCW1lbWNweSh1YWRkciwgJnNwLCBs ZW4pOworCisJKnVzb2NrYWRkcl9sZW4gPSBsZW47CisKKwllcnJvciA9IDA7CitlbmQ6CisJRVhJ VF9GVU5DVElPTjsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisg KiBpb2N0bCgpIGhhbmRsZXJzLgorICoKKyAqIFRoZSBQUFBvWCBzb2NrZXQgaXMgY3JlYXRlZCBm b3IgTDJUUCBzZXNzaW9uczogdHVubmVscyBoYXZlIHRoZWlyIG93biBVRFAKKyAqIHNvY2tldHMu IEhvd2V2ZXIsIGluIG9yZGVyIHRvIGNvbnRyb2wga2VybmVsIHR1bm5lbCBmZWF0dXJlcywgd2Ug YWxsb3cKKyAqIHVzZXJzcGFjZSB0byBjcmVhdGUgYSBzcGVjaWFsICJ0dW5uZWwiIFBQUG9YIHNv Y2tldCB3aGljaCBpcyB1c2VkIGZvcgorICogY29udHJvbCBvbmx5LiAgVHVubmVsIFBQUG9YIHNv Y2tldHMgaGF2ZSBzZXNzaW9uX2lkID09IDAgYW5kIHNpbXBseSBhbGxvdworICogdGhlIHVzZXIg YXBwbGljYXRpb24gdG8gaXNzdWUgTDJUUCBzZXRzb2Nrb3B0KCksIGdldHNvY2tvcHQoKSBhbmQg aW9jdGwoKQorICogY2FsbHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU2Vzc2lvbiBp b2N0bCBoZWxwZXIuCisgKi8KK3N0YXRpYyBpbnQgcHBwb2wydHBfc2Vzc2lvbl9pb2N0bChzdHJ1 Y3QgcHBwb2wydHBfc2Vzc2lvbiAqc2Vzc2lvbiwgCisJCQkJICB1bnNpZ25lZCBpbnQgY21kLCB1 bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBlcnIgPSAwOwor CXN0cnVjdCBzb2NrICpzayA9IHNlc3Npb24tPnNvY2s7CisJaW50IHZhbCA9IChpbnQpIGFyZzsK KworCVBSSU5USyhzZXNzaW9uLT5kZWJ1ZywgUFBQT0wyVFBfTVNHX0NPTlRST0wsIEtFUk5fREVC VUcsIAorCSAgICAgICAiJXM6IHBwcG9sMnRwX3Nlc3Npb25faW9jdGwoY21kPSUjeCwgYXJnPSUj bHgpXG4iLCAKKwkgICAgICAgc2Vzc2lvbi0+bmFtZSwgY21kLCBhcmcpOworCQorCXN3aXRjaCAo Y21kKSB7CisJY2FzZSBTSU9DR0lGTVRVOgorCQllcnIgPSAtRU5YSU87CisJCWlmICghKHNrLT5z a19zdGF0ZSAmIFBQUE9YX0NPTk5FQ1RFRCkpCisJCQlicmVhazsKKworCQllcnIgPSAtRUZBVUxU OworCQlpZiAoY29weV9mcm9tX3VzZXIoJmlmciwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9m KHN0cnVjdCBpZnJlcSkpKQorCQkJYnJlYWs7CisJCWlmci5pZnJfbXR1ID0gc2Vzc2lvbi0+bXR1 OworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsICZpZnIsIHNpemVvZihz dHJ1Y3QgaWZyZXEpKSkKKwkJCWJyZWFrOworCisJCVBSSU5USyhzZXNzaW9uLT5kZWJ1ZywgUFBQ T0wyVFBfTVNHX0NPTlRST0wsIEtFUk5fSU5GTywgCisJCSAgICAgICAiJXM6IGdldCBtdHU9JWRc biIsIHNlc3Npb24tPm5hbWUsIHNlc3Npb24tPm10dSk7CisJCWVyciA9IDA7CisJCWJyZWFrOwor CisJY2FzZSBTSU9DU0lGTVRVOgorCQllcnIgPSAtRU5YSU87CisJCWlmICghKHNrLT5za19zdGF0 ZSAmIFBQUE9YX0NPTk5FQ1RFRCkpCisJCQlicmVhazsKKworCQllcnIgPSAtRUZBVUxUOworCQlp ZiAoY29weV9mcm9tX3VzZXIoJmlmciwgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mKHN0cnVj dCBpZnJlcSkpKQorCQkJYnJlYWs7CisKKwkJc2Vzc2lvbi0+bXR1ID0gaWZyLmlmcl9tdHU7Cis7 CisJCVBSSU5USyhzZXNzaW9uLT5kZWJ1ZywgUFBQT0wyVFBfTVNHX0NPTlRST0wsIEtFUk5fSU5G TywgCisJCSAgICAgICAiJXM6IHNldCBtdHU9JWRcbiIsIHNlc3Npb24tPm5hbWUsIHNlc3Npb24t Pm10dSk7CisJCWVyciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NHTVJVOgorCQllcnIg PSAtRU5YSU87CisJCWlmICghKHNrLT5za19zdGF0ZSAmIFBQUE9YX0NPTk5FQ1RFRCkpCisJCQli cmVhazsKKworCQllcnIgPSAtRUZBVUxUOworCQlpZiAocHV0X3VzZXIoc2Vzc2lvbi0+bXJ1LCAo aW50IF9fdXNlciAqKSBhcmcpKQorCQkJYnJlYWs7CisKKwkJUFJJTlRLKHNlc3Npb24tPmRlYnVn LCBQUFBPTDJUUF9NU0dfQ09OVFJPTCwgS0VSTl9JTkZPLCAKKwkJICAgICAgICIlczogZ2V0IG1y dT0lZFxuIiwgc2Vzc2lvbi0+bmFtZSwgc2Vzc2lvbi0+bXJ1KTsKKwkJZXJyID0gMDsKKwkJYnJl YWs7CisKKwljYXNlIFBQUElPQ1NNUlU6CisJCWVyciA9IC1FTlhJTzsKKwkJaWYgKCEoc2stPnNr X3N0YXRlICYgUFBQT1hfQ09OTkVDVEVEKSkKKwkJCWJyZWFrOworCisJCWVyciA9IC1FRkFVTFQ7 CisJCWlmIChnZXRfdXNlcih2YWwsKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCWJyZWFrOworCisJ CXNlc3Npb24tPm1ydSA9IHZhbDsKKwkJUFJJTlRLKHNlc3Npb24tPmRlYnVnLCBQUFBPTDJUUF9N U0dfQ09OVFJPTCwgS0VSTl9JTkZPLCAKKwkJICAgICAgICIlczogc2V0IG1ydT0lZFxuIiwgc2Vz c2lvbi0+bmFtZSwgc2Vzc2lvbi0+bXJ1KTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwljYXNl IFBQUElPQ0dGTEFHUzoKKwkJZXJyID0gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKHNlc3Npb24t PmZsYWdzLCAoaW50IF9fdXNlciAqKSBhcmcpKQorCQkJYnJlYWs7CisKKwkJUFJJTlRLKHNlc3Np b24tPmRlYnVnLCBQUFBPTDJUUF9NU0dfQ09OVFJPTCwgS0VSTl9JTkZPLCAKKwkJICAgICAgICIl czogZ2V0IGZsYWdzPSVkXG4iLCBzZXNzaW9uLT5uYW1lLCBzZXNzaW9uLT5mbGFncyk7CisJCWVy ciA9IDA7CisJCWJyZWFrOworCisJY2FzZSBQUFBJT0NTRkxBR1M6CisJCWVyciA9IC1FRkFVTFQ7 CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZykpCisJCQlicmVhazsKKwkJ c2Vzc2lvbi0+ZmxhZ3MgPSB2YWw7CisJCVBSSU5USyhzZXNzaW9uLT5kZWJ1ZywgUFBQT0wyVFBf TVNHX0NPTlRST0wsIEtFUk5fSU5GTywgCisJCSAgICAgICAiJXM6IHNldCBmbGFncz0lZFxuIiwg c2Vzc2lvbi0+bmFtZSwgc2Vzc2lvbi0+ZmxhZ3MpOworCQllcnIgPSAwOworCQlicmVhazsKKwor CWNhc2UgUFBQSU9DR0wyVFBTVEFUUzoKKwkJZXJyID0gLUVOWElPOworCisJCWlmICghKHNrLT5z a19zdGF0ZSAmIFBQUE9YX0NPTk5FQ1RFRCkpCisJCQlicmVhazsKKworCQlpZiAoY29weV90b191 c2VyKCh2b2lkIF9fdXNlciAqKSBhcmcsICZzZXNzaW9uLT5zdGF0cywgCisJCQkJIHNpemVvZihz ZXNzaW9uLT5zdGF0cykpKQorCQkJYnJlYWs7CisJCVBSSU5USyhzZXNzaW9uLT5kZWJ1ZywgUFBQ T0wyVFBfTVNHX0NPTlRST0wsIEtFUk5fSU5GTywgCisJCSAgICAgICAiJXM6IGdldCBMMlRQIHN0 YXRzXG4iLCBzZXNzaW9uLT5uYW1lKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0 OgorCQllcnIgPSAtRU5PU1lTOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisv KiBUdW5uZWwgaW9jdGwgaGVscGVyLgorICoKKyAqIE5vdGUgdGhlIHNwZWNpYWwgaGFuZGxpbmcg Zm9yIFBQUElPQ0dMMlRQU1RBVFMgYmVsb3cuIElmIHRoZSBpb2N0bCBkYXRhCisgKiBzcGVjaWZp ZXMgYSBzZXNzaW9uX2lkLCB0aGUgc2Vzc2lvbiBpb2N0bCBoYW5kbGVyIGlzIGNhbGxlZC4gVGhp cyBhbGxvd3MgYW4KKyAqIGFwcGxpY2F0aW9uIHRvIHJldHJpZXZlIHNlc3Npb24gc3RhdHMgdmlh IGEgdHVubmVsIHNvY2tldC4KKyAqLworc3RhdGljIGludCBwcHBvbDJ0cF90dW5uZWxfaW9jdGwo c3RydWN0IHBwcG9sMnRwX3R1bm5lbCAqdHVubmVsLCAKKwkJCQkgdW5zaWduZWQgaW50IGNtZCwg dW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IHNvY2sgKnNrID0g dHVubmVsLT5zb2NrOworCXN0cnVjdCBwcHBvbDJ0cF9pb2Nfc3RhdHMgc3RhdHNfcmVxOworCisJ UFJJTlRLKHR1bm5lbC0+ZGVidWcsIFBQUE9MMlRQX01TR19DT05UUk9MLCBLRVJOX0RFQlVHLCAK KwkgICAgICAgIiVzOiBwcHBvbDJ0cF90dW5uZWxfaW9jdGwoY21kPSUjeCwgYXJnPSUjbHgpXG4i LCB0dW5uZWwtPm5hbWUsIAorCSAgICAgICBjbWQsIGFyZyk7CisKKwlzd2l0Y2ggKGNtZCkgewor CWNhc2UgUFBQSU9DR0wyVFBTVEFUUzoKKwkJZXJyID0gLUVOWElPOworCisJCWlmICghKHNrLT5z a19zdGF0ZSAmIFBQUE9YX0NPTk5FQ1RFRCkpCisJCQlicmVhazsKKworCQlpZiAoY29weV9mcm9t X3VzZXIoJnN0YXRzX3JlcSwgKHZvaWQgX191c2VyICopIGFyZywgCisJCQkJICAgc2l6ZW9mKHN0 YXRzX3JlcSkpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN0 YXRzX3JlcS5zZXNzaW9uX2lkICE9IDApIHsKKwkJCS8qIHJlc2VuZCB0byBzZXNzaW9uIGlvY3Rs IGhhbmRsZXIgKi8KKwkJCXN0cnVjdCBwcHBvbDJ0cF9zZXNzaW9uICpzZXNzaW9uID0gCisJCQkJ Z2V0X2l0ZW0odHVubmVsLCBzdGF0c19yZXEudHVubmVsX2lkLCAKKwkJCQkJIHN0YXRzX3JlcS5z ZXNzaW9uX2lkKTsKKwkJCWlmIChzZXNzaW9uICE9IE5VTEwpCisJCQkJZXJyID0gcHBwb2wydHBf c2Vzc2lvbl9pb2N0bChzZXNzaW9uLCBjbWQsIGFyZyk7CisJCQllbHNlCisJCQkJZXJyID0gLUVC QURSOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKikg YXJnLCAmdHVubmVsLT5zdGF0cywgCisJCQkJIHNpemVvZih0dW5uZWwtPnN0YXRzKSkpIHsKKwkJ CWVyciA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlQUklOVEsodHVubmVsLT5kZWJ1Zywg UFBQT0wyVFBfTVNHX0NPTlRST0wsIEtFUk5fSU5GTywgCisJCSAgICAgICAiJXM6IGdldCBMMlRQ IHN0YXRzXG4iLCB0dW5uZWwtPm5hbWUpOworCQllcnIgPSAwOworCQlicmVhazsKKworCWRlZmF1 bHQ6CisJCWVyciA9IC1FTk9TWVM7CisJCWJyZWFrOworCX0KKworCXJldHVybiBlcnI7Cit9CisK Ky8qIE1haW4gaW9jdGwoKSBoYW5kbGVyLgorICogRGlzcGF0Y2ggdG8gdHVubmVsIG9yIHNlc3Np b24gaGVscGVycyBkZXBlbmRpbmcgb24gdGhlIHNvY2tldC4KKyAqLworc3RhdGljIGludCBwcHBv bDJ0cF9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAg IHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0 cnVjdCBwcHBvbDJ0cF9zZXNzaW9uICpzZXNzaW9uOworCXN0cnVjdCBwcHBvbDJ0cF90dW5uZWwg KnR1bm5lbDsKKwlpbnQgZXJyID0gMDsKKworCUVOVEVSX0ZVTkNUSU9OOworCQorCWlmICghc2sp CisJCXJldHVybiAwOworCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19ERUFEKSAhPSAwKQorCQly ZXR1cm4gLUVCQURGOworCisJaWYgKChzay0+c2tfdXNlcl9kYXRhID09IE5VTEwpIHx8IAorCSAg ICAoIShzay0+c2tfc3RhdGUgJiAoUFBQT1hfQ09OTkVDVEVEIHwgUFBQT1hfQk9VTkQpKSkpIHsK KwkJZXJyID0gLUVOT1RDT05OOworCQlEUFJJTlRLKC0xLCAiaW9jdGw6IHNvY2tldCAlcCBub3Qg Y29ubmVjdGVkLlxuIiwgc2spOworCQlnb3RvIGVuZDsKKwl9CisKKwlTT0NLXzJfU0VTU0lPTihz aywgc2Vzc2lvbiwgZXJyLCAtRUJBREYsIGVuZCwgMCk7CisJU09DS18yX1RVTk5FTChzZXNzaW9u LT50dW5uZWxfc29jaywgdHVubmVsLCBlcnIsIC1FQkFERiwgZW5kLCAxKTsKKworCS8qIFNwZWNp YWwgY2FzZTogaWYgc2Vzc2lvbidzIHNlc3Npb25faWQgaXMgemVybywgdHJlYXQgaW9jdGwgYXMg YQorCSAqIHR1bm5lbCBpb2N0bAorCSAqLworCWlmICgoc2Vzc2lvbi0+dHVubmVsX2FkZHIuc19z ZXNzaW9uID09IDApICYmCisJICAgIChzZXNzaW9uLT50dW5uZWxfYWRkci5kX3Nlc3Npb24gPT0g MCkpIHsKKwkJZXJyID0gcHBwb2wydHBfdHVubmVsX2lvY3RsKHR1bm5lbCwgY21kLCBhcmcpOwor CQlnb3RvIGVuZDsKKwl9CisKKwllcnIgPSBwcHBvbDJ0cF9zZXNzaW9uX2lvY3RsKHNlc3Npb24s IGNtZCwgYXJnKTsKKworZW5kOgorCUVYSVRfRlVOQ1RJT047CisJcmV0dXJuIGVycjsKK30KKwor LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqCisgKiBzZXRzb2Nrb3B0KCkgLyBnZXRzb2Nrb3B0KCkgc3Vw cG9ydC4KKyAqCisgKiBUaGUgUFBQb1ggc29ja2V0IGlzIGNyZWF0ZWQgZm9yIEwyVFAgc2Vzc2lv bnM6IHR1bm5lbHMgaGF2ZSB0aGVpciBvd24gVURQCisgKiBzb2NrZXRzLiBJbiBvcmRlciB0byBj b250cm9sIGtlcm5lbCB0dW5uZWwgZmVhdHVyZXMsIHdlIGFsbG93IHVzZXJzcGFjZSB0bworICog Y3JlYXRlIGEgc3BlY2lhbCAidHVubmVsIiBQUFBvWCBzb2NrZXQgd2hpY2ggaXMgdXNlZCBmb3Ig Y29udHJvbCBvbmx5LgorICogVHVubmVsIFBQUG9YIHNvY2tldHMgaGF2ZSBzZXNzaW9uX2lkID09 IDAgYW5kIHNpbXBseSBhbGxvdyB0aGUgdXNlcgorICogYXBwbGljYXRpb24gdG8gaXNzdWUgTDJU UCBzZXRzb2Nrb3B0KCksIGdldHNvY2tvcHQoKSBhbmQgaW9jdGwoKSBjYWxscy4KKyAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8KKworLyogVHVubmVsIHNldHNvY2tvcHQoKSBoZWxwZXIuCisgKi8KK3N0 YXRpYyBpbnQgcHBwb2wydHBfdHVubmVsX3NldHNvY2tvcHQoc3RydWN0IHBwcG9sMnRwX3R1bm5l bCAqdHVubmVsLCAKKwkJCQkgICAgICBpbnQgb3B0bmFtZSwgaW50IHZhbCkKK3sKKwlpbnQgZXJy ID0gMDsKKworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgUFBQT0wyVFBfU09fREVCVUc6CisJ CXR1bm5lbC0+ZGVidWcgPSB2YWw7CisJCVBSSU5USyh0dW5uZWwtPmRlYnVnLCBQUFBPTDJUUF9N U0dfQ09OVFJPTCwgS0VSTl9JTkZPLCAKKwkJICAgICAgICIlczogc2V0IGRlYnVnPSV4XG4iLCB0 dW5uZWwtPm5hbWUsIHR1bm5lbC0+ZGVidWcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVy ciA9IC1FTk9QUk9UT09QVDsKKwkJYnJlYWs7CisJfQorCQorCXJldHVybiBlcnI7Cit9CisKKy8q IFNlc3Npb24gc2V0c29ja29wdCBoZWxwZXIuCisgKi8KK3N0YXRpYyBpbnQgcHBwb2wydHBfc2Vz c2lvbl9zZXRzb2Nrb3B0KHN0cnVjdCBwcHBvbDJ0cF9zZXNzaW9uICpzZXNzaW9uLCAKKwkJCQkg ICAgICAgaW50IG9wdG5hbWUsIGludCB2YWwpCit7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2gg KG9wdG5hbWUpIHsKKwljYXNlIFBQUE9MMlRQX1NPX1JFQ1ZTRVE6CisJCWlmICgodmFsICE9IDAp ICYmICh2YWwgIT0gMSkpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlz ZXNzaW9uLT5yZWN2X3NlcSA9IHZhbCA/IC0xIDogMDsKKwkJUFJJTlRLKHNlc3Npb24tPmRlYnVn LCBQUFBPTDJUUF9NU0dfQ09OVFJPTCwgS0VSTl9JTkZPLCAKKwkJICAgICAgICIlczogc2V0IHJl Y3Zfc2VxPSVkXG4iLCBzZXNzaW9uLT5uYW1lLCAKKwkJICAgICAgIHNlc3Npb24tPnJlY3Zfc2Vx KTsKKwkJYnJlYWs7CisKKwljYXNlIFBQUE9MMlRQX1NPX1NFTkRTRVE6CisJCWlmICgodmFsICE9 IDApICYmICh2YWwgIT0gMSkpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQor CQlzZXNzaW9uLT5zZW5kX3NlcSA9IHZhbCA/IC0xIDogMDsKKwkJeworCQkJLyogRklYTUU6IGlz IGl0IHNhZmUgdG8gY2hhbmdlIHRoZSBwcHAgY2hhbm5lbCdzCisJCQkgKiBoZHJsZW4gb24gdGhl IGZseT8KKwkJCSAqLworCQkJc3RydWN0IHNvY2sgKnNrCSAgICAgPSBzZXNzaW9uLT5zb2NrOwor CQkJc3RydWN0IHBwcG94X29wdCAqcG8gPSBwcHBveF9zayhzayk7CisJCQlwby0+Y2hhbi5oZHJs ZW4gPSB2YWwgPyBQUFBPTDJUUF9MMlRQX0hEUl9TSVpFX1NFUSA6IAorCQkJCVBQUE9MMlRQX0wy VFBfSERSX1NJWkVfTk9TRVE7CisJCX0KKwkJUFJJTlRLKHNlc3Npb24tPmRlYnVnLCBQUFBPTDJU UF9NU0dfQ09OVFJPTCwgS0VSTl9JTkZPLCAKKwkJICAgICAgICIlczogc2V0IHNlbmRfc2VxPSVk XG4iLCBzZXNzaW9uLT5uYW1lLCBzZXNzaW9uLT5zZW5kX3NlcSk7CisJCWJyZWFrOworCisJY2Fz ZSBQUFBPTDJUUF9TT19MTlNNT0RFOgorCQlpZiAoKHZhbCAhPSAwKSAmJiAodmFsICE9IDEpKSB7 CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJc2Vzc2lvbi0+bG5zX21vZGUg PSB2YWwgPyAtMSA6IDA7CisJCVBSSU5USyhzZXNzaW9uLT5kZWJ1ZywgUFBQT0wyVFBfTVNHX0NP TlRST0wsIEtFUk5fSU5GTywgCisJCSAgICAgICAiJXM6IHNldCBsbnNfbW9kZT0lZFxuIiwgc2Vz c2lvbi0+bmFtZSwgCisJCSAgICAgICBzZXNzaW9uLT5sbnNfbW9kZSk7CisJCWJyZWFrOworCisJ Y2FzZSBQUFBPTDJUUF9TT19ERUJVRzoKKwkJc2Vzc2lvbi0+ZGVidWcgPSB2YWw7CisJCVBSSU5U SyhzZXNzaW9uLT5kZWJ1ZywgUFBQT0wyVFBfTVNHX0NPTlRST0wsIEtFUk5fSU5GTywgCisJCSAg ICAgICAiJXM6IHNldCBkZWJ1Zz0leFxuIiwgc2Vzc2lvbi0+bmFtZSwgc2Vzc2lvbi0+ZGVidWcp OworCQlicmVhazsKKworCWNhc2UgUFBQT0wyVFBfU09fUkVPUkRFUlRPOgorCQlzZXNzaW9uLT5y ZW9yZGVyX3RpbWVvdXQgPSBNU19UT19KSUZGSUVTKHZhbCk7CisJCVBSSU5USyhzZXNzaW9uLT5k ZWJ1ZywgUFBQT0wyVFBfTVNHX0NPTlRST0wsIEtFUk5fSU5GTywgCisJCSAgICAgICAiJXM6IHNl dCByZW9yZGVyX3RpbWVvdXQ9JWRcbiIsIHNlc3Npb24tPm5hbWUsIAorCQkgICAgICAgc2Vzc2lv bi0+cmVvcmRlcl90aW1lb3V0KTsKKwkJaWYgKHNlc3Npb24tPnJlb3JkZXJfdGltZW91dCAhPSAw KQorCQkJcHBwb2wydHBfd2Fybl9ub3RfeWV0X2ltcGxlbWVudGVkKHNlc3Npb24tPmRlYnVnLCAi U09fUkVPUkRFUlRPIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1BST1RP T1BUOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBNYWluIHNldHNvY2tv cHQoKSBlbnRyeSBwb2ludC4KKyAqIERvZXMgQVBJIGNoZWNrcywgdGhlbiBjYWxscyBlaXRoZXIg dGhlIHR1bm5lbCBvciBzZXNzaW9uIHNldHNvY2tvcHQKKyAqIGhhbmRsZXIsIGFjY29yZGluZyB0 byB3aGV0aGVyIHRoZSBQUFBvTDJUUCBzb2NrZXQgaXMgYSBmb3IgYSByZWd1bGFyCisgKiBzZXNz aW9uIG9yIHRoZSBzcGVjaWFsIHR1bm5lbCB0eXBlLgorICovCitzdGF0aWMgaW50IHBwcG9sMnRw X3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwg CisJCQkgICAgICAgY2hhciAqb3B0dmFsLCBpbnQgb3B0bGVuKQoreworCXN0cnVjdCBzb2NrICpz ayA9IHNvY2stPnNrOworCXN0cnVjdCBwcHBvbDJ0cF9zZXNzaW9uICpzZXNzaW9uID0gc2stPnNr X3VzZXJfZGF0YTsKKwlzdHJ1Y3QgcHBwb2wydHBfdHVubmVsICp0dW5uZWw7CisJaW50IHZhbDsK KwlpbnQgZXJyID0gMDsKKworCWlmIChsZXZlbCAhPSBTT0xfUFBQT0wyVFApCisJCXJldHVybiAt RVNPQ0tUTk9TVVBQT1JUOworCisJaWYgKG9wdGxlbjxzaXplb2YoaW50KSkKKwkJcmV0dXJuIC1F SU5WQUw7CisKKwlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJCXJl dHVybiAtRUZBVUxUOworCisJaWYgKHNrLT5za191c2VyX2RhdGEgPT0gTlVMTCkgeworCQllcnIg PSAtRU5PVENPTk47CisJCURQUklOVEsoLTEsICJzZXRzb2Nrb3B0OiBzb2NrZXQgJXAgbm90IGNv bm5lY3RlZC5cbiIsIHNrKTsKKwkJZ290byBlbmQ7CisJfQorCisJU09DS18yX1NFU1NJT04oc2ss IHNlc3Npb24sIGVyciwgLUVCQURGLCBlbmQsIDApOworCVNPQ0tfMl9UVU5ORUwoc2Vzc2lvbi0+ dHVubmVsX3NvY2ssIHR1bm5lbCwgZXJyLCAtRUJBREYsIGVuZCwgMSk7CisKKwlsb2NrX3NvY2so c2spOworCisJLyogU3BlY2lhbCBjYXNlOiBpZiBzZXNzaW9uX2lkID09IDB4MDAwMCwgdHJlYXQg YXMgb3BlcmF0aW9uIG9uIHR1bm5lbAorCSAqLworCWlmICgoc2Vzc2lvbi0+dHVubmVsX2FkZHIu c19zZXNzaW9uID09IDApICYmCisJICAgIChzZXNzaW9uLT50dW5uZWxfYWRkci5kX3Nlc3Npb24g PT0gMCkpCisJCWVyciA9IHBwcG9sMnRwX3R1bm5lbF9zZXRzb2Nrb3B0KHR1bm5lbCwgb3B0bmFt ZSwgdmFsKTsKKwllbHNlCisJCWVyciA9IHBwcG9sMnRwX3Nlc3Npb25fc2V0c29ja29wdChzZXNz aW9uLCBvcHRuYW1lLCB2YWwpOworCQorCXJlbGVhc2Vfc29jayhzayk7CitlbmQ6CisJcmV0dXJu IGVycjsKK30KKworLyogVHVubmVsIGdldHNvY2tvcHQgaGVscGVyLgorICovCitzdGF0aWMgaW50 IHBwcG9sMnRwX3R1bm5lbF9nZXRzb2Nrb3B0KHN0cnVjdCBwcHBvbDJ0cF90dW5uZWwgKnR1bm5l bCwgCisJCQkJICAgICAgaW50IG9wdG5hbWUsIGludCAqdmFsKQoreworCWludCBlcnIgPSAwOwor CisJc3dpdGNoIChvcHRuYW1lKSB7CisJY2FzZSBQUFBPTDJUUF9TT19ERUJVRzoKKwkJKnZhbCA9 IHR1bm5lbC0+ZGVidWc7CisJCVBSSU5USyh0dW5uZWwtPmRlYnVnLCBQUFBPTDJUUF9NU0dfQ09O VFJPTCwgS0VSTl9JTkZPLCAKKwkJICAgICAgICIlczogZ2V0IGRlYnVnPSV4XG4iLCB0dW5uZWwt Pm5hbWUsIHR1bm5lbC0+ZGVidWcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1F Tk9QUk9UT09QVDsKKwkJYnJlYWs7CisJfQorCQorCXJldHVybiBlcnI7Cit9CisKKy8qIFNlc3Np b24gZ2V0c29ja29wdCBoZWxwZXIuCisgKi8KK3N0YXRpYyBpbnQgcHBwb2wydHBfc2Vzc2lvbl9n ZXRzb2Nrb3B0KHN0cnVjdCBwcHBvbDJ0cF9zZXNzaW9uICpzZXNzaW9uLCAKKwkJCQkgICAgICAg aW50IG9wdG5hbWUsIGludCAqdmFsKQoreworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChvcHRu YW1lKSB7CisJY2FzZSBQUFBPTDJUUF9TT19SRUNWU0VROgorCQkqdmFsID0gc2Vzc2lvbi0+cmVj dl9zZXE7CisJCVBSSU5USyhzZXNzaW9uLT5kZWJ1ZywgUFBQT0wyVFBfTVNHX0NPTlRST0wsIEtF Uk5fSU5GTywgCisJCSAgICAgICAiJXM6IGdldCByZWN2X3NlcT0lZFxuIiwgc2Vzc2lvbi0+bmFt ZSwgKnZhbCk7CisJCWJyZWFrOworCisJY2FzZSBQUFBPTDJUUF9TT19TRU5EU0VROgorCQkqdmFs ID0gc2Vzc2lvbi0+c2VuZF9zZXE7CisJCVBSSU5USyhzZXNzaW9uLT5kZWJ1ZywgUFBQT0wyVFBf TVNHX0NPTlRST0wsIEtFUk5fSU5GTywgCisJCSAgICAgICAiJXM6IGdldCBzZW5kX3NlcT0lZFxu Iiwgc2Vzc2lvbi0+bmFtZSwgKnZhbCk7CisJCWJyZWFrOworCisJY2FzZSBQUFBPTDJUUF9TT19M TlNNT0RFOgorCQkqdmFsID0gc2Vzc2lvbi0+bG5zX21vZGU7CisJCVBSSU5USyhzZXNzaW9uLT5k ZWJ1ZywgUFBQT0wyVFBfTVNHX0NPTlRST0wsIEtFUk5fSU5GTywgCisJCSAgICAgICAiJXM6IGdl dCBsbnNfbW9kZT0lZFxuIiwgc2Vzc2lvbi0+bmFtZSwgKnZhbCk7CisJCWJyZWFrOworCisJY2Fz ZSBQUFBPTDJUUF9TT19ERUJVRzoKKwkJKnZhbCA9IHNlc3Npb24tPmRlYnVnOworCQlQUklOVEso c2Vzc2lvbi0+ZGVidWcsIFBQUE9MMlRQX01TR19DT05UUk9MLCBLRVJOX0lORk8sIAorCQkgICAg ICAgIiVzOiBnZXQgZGVidWc9JWRcbiIsIHNlc3Npb24tPm5hbWUsICp2YWwpOworCQlicmVhazsK KworCWNhc2UgUFBQT0wyVFBfU09fUkVPUkRFUlRPOgorCQkqdmFsID0gSklGRklFU19UT19NUyhz ZXNzaW9uLT5yZW9yZGVyX3RpbWVvdXQpOworCQlQUklOVEsoc2Vzc2lvbi0+ZGVidWcsIFBQUE9M MlRQX01TR19DT05UUk9MLCBLRVJOX0lORk8sIAorCQkgICAgICAgIiVzOiBnZXQgcmVvcmRlcl90 aW1lb3V0PSVkXG4iLCBzZXNzaW9uLT5uYW1lLCAqdmFsKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0 OgorCQllcnIgPSAtRU5PUFJPVE9PUFQ7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyogTWFp biBnZXRzb2Nrb3B0KCkgZW50cnkgcG9pbnQuCisgKiBEb2VzIEFQSSBjaGVja3MsIHRoZW4gY2Fs bHMgZWl0aGVyIHRoZSB0dW5uZWwgb3Igc2Vzc2lvbiBnZXRzb2Nrb3B0CisgKiBoYW5kbGVyLCBh Y2NvcmRpbmcgdG8gd2hldGhlciB0aGUgUFBQb1ggc29ja2V0IGlzIGEgZm9yIGEgcmVndWxhciBz ZXNzaW9uCisgKiBvciB0aGUgc3BlY2lhbCB0dW5uZWwgdHlwZS4KKyAqLworc3RhdGljIGludCBw cHBvbDJ0cF9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwgCisJCQkg ICAgICAgaW50IG9wdG5hbWUsIGNoYXIgKm9wdHZhbCwgaW50ICpvcHRsZW4pCit7CisJc3RydWN0 IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IHBwcG9sMnRwX3Nlc3Npb24gKnNlc3Npb24g PSBzay0+c2tfdXNlcl9kYXRhOworCXN0cnVjdCBwcHBvbDJ0cF90dW5uZWwgKnR1bm5lbDsKKwlp bnQgdmFsLCBsZW47CisJaW50IGVyciA9IDA7CisKKwlpZiAobGV2ZWwgIT0gU09MX1BQUE9MMlRQ KQorCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKKworCWlmIChnZXRfdXNlcihsZW4sIChpbnQg X191c2VyICopIG9wdGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJbGVuID0gbWluX3QodW5z aWduZWQgaW50LCBsZW4sIHNpemVvZihpbnQpKTsKKwkKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJu IC1FSU5WQUw7CisKKwlpZiAoc2stPnNrX3VzZXJfZGF0YSA9PSBOVUxMKSB7CisJCWVyciA9IC1F Tk9UQ09OTjsKKwkJRFBSSU5USygtMSwgImdldHNvY2tvcHQ6IHNvY2tldCAlcCBub3QgY29ubmVj dGVkLlxuIiwgc2spOworCQlnb3RvIGVuZDsKKwl9CisKKwkvKiBHZXQgdGhlIHNlc3Npb24gYW5k IHR1bm5lbCBjb250ZXh0cyAqLworCVNPQ0tfMl9TRVNTSU9OKHNrLCBzZXNzaW9uLCBlcnIsIC1F QkFERiwgZW5kLCAwKTsKKwlTT0NLXzJfVFVOTkVMKHNlc3Npb24tPnR1bm5lbF9zb2NrLCB0dW5u ZWwsIGVyciwgLUVCQURGLCBlbmQsIDEpOworCisJLyogU3BlY2lhbCBjYXNlOiBpZiBzZXNzaW9u X2lkID09IDB4MDAwMCwgdHJlYXQgYXMgb3BlcmF0aW9uIG9uIHR1bm5lbCAqLworCWlmICgoc2Vz c2lvbi0+dHVubmVsX2FkZHIuc19zZXNzaW9uID09IDApICYmCisJICAgIChzZXNzaW9uLT50dW5u ZWxfYWRkci5kX3Nlc3Npb24gPT0gMCkpCisJCWVyciA9IHBwcG9sMnRwX3R1bm5lbF9nZXRzb2Nr b3B0KHR1bm5lbCwgb3B0bmFtZSwgJnZhbCk7CisJZWxzZQorCQllcnIgPSBwcHBvbDJ0cF9zZXNz aW9uX2dldHNvY2tvcHQoc2Vzc2lvbiwgb3B0bmFtZSwgJnZhbCk7CisJCisKKwlpZiAocHV0X3Vz ZXIobGVuLCAoaW50IF9fdXNlciAqKSBvcHRsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlm IChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopIG9wdHZhbCwgJnZhbCwgbGVuKSkKKwkJcmV0 dXJuIC1FRkFVTFQ7CisKK2VuZDoKKwlyZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioKKyAqIC9wcm9jIGZpbGVzeXN0ZW0gZm9yIGRlYnVnCisgKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiovCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUu aD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgIT0gS0VSTkVMX1ZFUlNJT04oMiw0LDI3KSkK KyNpZiAoTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDApKQorc3RhdGlj IGlubGluZSBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKlBERShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlu b2RlKQoreworCXJldHVybiAoc3RydWN0IHByb2NfZGlyX2VudHJ5ICopaW5vZGUtPnUuZ2VuZXJp Y19pcDsKK30KKyNlbmRpZgorI2VuZGlmCitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpw cHBvbDJ0cF9wcm9jOworCitzdGF0aWMgaW50IHBwcG9sMnRwX3Byb2Nfb3BlbihzdHJ1Y3QgaW5v ZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdm9pZCAqcHBwb2wydHBfcHJv Y19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIGxvZmZfdCAqcG9zKTsKK3N0YXRpYyB2b2lkICpw cHBvbDJ0cF9wcm9jX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBv cyk7CitzdGF0aWMgdm9pZCBwcHBvbDJ0cF9wcm9jX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2 b2lkICp2KTsKK3N0YXRpYyBpbnQgcHBwb2wydHBfcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAq bSwgdm9pZCAqdik7CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHBwb2wydHBfcHJv Y19vcHMgPSB7CisJLnN0YXJ0CQk9IHBwcG9sMnRwX3Byb2Nfc3RhcnQsCisJLm5leHQJCT0gcHBw b2wydHBfcHJvY19uZXh0LAorCS5zdG9wCQk9IHBwcG9sMnRwX3Byb2Nfc3RvcCwKKwkuc2hvdwkJ PSBwcHBvbDJ0cF9wcm9jX3Nob3csCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9u cyBwcHBvbDJ0cF9wcm9jX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVu CQk9IHBwcG9sMnRwX3Byb2Nfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9 IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBw cHBvbDJ0cF9wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUp Cit7CisJc3RydWN0IHNlcV9maWxlICptOworCWludCByZXQgPSAwOworCisJRU5URVJfRlVOQ1RJ T047CisJcmV0ID0gc2VxX29wZW4oZmlsZSwmcHBwb2wydHBfcHJvY19vcHMpOworCWlmIChyZXQ8 MCkKKwkJZ290byBvdXQ7CisKKwltCSAgID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCW0tPnByaXZh dGUgPSBQREUoaW5vZGUpLT5kYXRhOworCitvdXQ6CisJRVhJVF9GVU5DVElPTjsKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgdm9pZCAqcHBwb2wydHBfcHJvY19zdGFydChzdHJ1Y3Qgc2VxX2Zp bGUgKm0sIGxvZmZfdCAqX3BvcykKK3sKKwlzdHJ1Y3QgcHBwb2wydHBfdHVubmVsICp0dW5uZWw7 CisJbG9mZl90IHBvcyA9ICpfcG9zOworCisJRU5URVJfRlVOQ1RJT047CisKKwkvKiBsb2NrIHRo ZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCisJd3JpdGVfbG9ja19iaCgmcHBwb2wydHBf aGFzaF9sb2NrKTsKKworCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KKwlpZiAoIXBv cykKKwkJcmV0dXJuICh2b2lkICopMTsKKwlwb3MtLTsKKworCS8qIGZpbmQgdGhlIG4ndGggZWxl bWVudCBpbiB0aGUgbGlzdCAqLworCWZvciAodHVubmVsID0gcHBwb2wydHBfdHVubmVsX2xpc3Q7 IHR1bm5lbCAhPSBOVUxMOyAKKwkgICAgIHR1bm5lbCA9IHR1bm5lbC0+bmV4dCkKKwkJaWYgKCFw b3MtLSkKKwkJCWJyZWFrOworCisJRVhJVF9GVU5DVElPTjsKKworCXJldHVybiB0dW5uZWw7Cit9 CisKK3N0YXRpYyB2b2lkICpwcHBvbDJ0cF9wcm9jX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2 b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgcHBwb2wydHBfdHVubmVsICp0dW5uZWwg PSB2OworCisJRU5URVJfRlVOQ1RJT047CisKKwkoKnBvcykrKzsKKworCXR1bm5lbCA9ICh2ID09 ICh2b2lkICopMSkgPyBwcHBvbDJ0cF90dW5uZWxfbGlzdCA6IHR1bm5lbC0+bmV4dDsKKworCUVY SVRfRlVOQ1RJT047CisKKwlyZXR1cm4gdHVubmVsOworfQorCitzdGF0aWMgdm9pZCBwcHBvbDJ0 cF9wcm9jX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQoreworCUVOVEVSX0ZVTkNU SU9OOworCisJd3JpdGVfdW5sb2NrX2JoKCZwcHBvbDJ0cF9oYXNoX2xvY2spOworCisJRVhJVF9G VU5DVElPTjsKK30KKworc3RhdGljIGludCBwcHBvbDJ0cF9wcm9jX3Nob3coc3RydWN0IHNlcV9m aWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBwcHBvbDJ0cF90dW5uZWwgKnR1bm5lbCA9IHY7 CisJc3RydWN0IHBwcG9sMnRwX3Nlc3Npb24gKnNlc3Npb247CisJaW50IGk7CisKKwlFTlRFUl9G VU5DVElPTjsKKworCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLworCWlmICh2ID09ICh2 b2lkICopMSkgeworCQlzZXFfcHV0cyhtLCAiUFBQb0wyVFAgZHJpdmVyIGluZm8sICIgUFBQT0wy VFBfRFJWX1ZFUlNJT04gIlxuIik7CisJCXNlcV9wdXRzKG0sICJUVU5ORUwgbmFtZSwgdXNlci1k YXRhLW9rICIKKwkJCSAic2Vzc2lvbi1jb3VudCBtYWdpYy1va1xuIik7CisJCXNlcV9wdXRzKG0s ICIgZGVidWcgdHgtcGt0cy9ieXRlcy9lcnJzIHJ4LXBrdHMvYnl0ZXMvZXJyc1xuIik7CisJCXNl cV9wdXRzKG0sICIgIFNFU1NJT04gbmFtZSwgYWRkci9wb3J0IHNyYy10aWQvc2lkICIKKwkJCSAi ZGVzdC10aWQvc2lkIHN0YXRlIHVzZXItZGF0YS1vayBtYWdpYy1va1xuIik7CisJCXNlcV9wdXRz KG0sICIgICBtdHUvbXJ1L3JjdnNlcS9zZW5kc2VxL2xucyBkZWJ1ZyByZW9yZGVydG9cbiIpOwor CQlzZXFfcHV0cyhtLCAiICAgbnIvbnMgdHgtcGt0cy9ieXRlcy9lcnJzIHJ4LXBrdHMvYnl0ZXMv ZXJyc1xuIik7CisJCXNlcV9wdXRzKG0sICJcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzZXFf cHJpbnRmKG0sICJUVU5ORUwgJyVzJywgJWMgJWQgTUFHSUMgJXNcbiIsIAorCQkgICB0dW5uZWwt Pm5hbWUsCisJCSAgICh0dW5uZWwgPT0gdHVubmVsLT5zb2NrLT5za191c2VyX2RhdGEpID8gJ1kn OidOJywKKwkJICAgYXRvbWljX3JlYWQoJnR1bm5lbC0+c2Vzc2lvbl9jb3VudCksCisJCSAgICh0 dW5uZWwtPm1hZ2ljID09IEwyVFBfVFVOTkVMX01BR0lDKSA/ICJPSyIgOiAiQkFEIik7CisJc2Vx X3ByaW50ZihtLCAiICUwOHggJXUvJXUvJXUgJXUvJXUvJXVcbiIsCisJCSAgIHR1bm5lbC0+ZGVi dWcsCisJCSAgIHR1bm5lbC0+c3RhdHMudHhfcGFja2V0cywgdHVubmVsLT5zdGF0cy50eF9ieXRl cywgCisJCSAgIHR1bm5lbC0+c3RhdHMudHhfZXJyb3JzLAorCQkgICB0dW5uZWwtPnN0YXRzLnJ4 X3BhY2tldHMsIHR1bm5lbC0+c3RhdHMucnhfYnl0ZXMsIAorCQkgICB0dW5uZWwtPnN0YXRzLnJ4 X2Vycm9ycyk7CisKKwlpZiAodHVubmVsLT5tYWdpYyAhPSBMMlRQX1RVTk5FTF9NQUdJQykgewor CQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUFBQT0wyVFBfSEFTSF9TSVpFOyBp KyspIHsKKwkJc2Vzc2lvbiA9IHR1bm5lbC0+aGFzaFtpXTsKKwkJd2hpbGUgKHNlc3Npb24pIHsK KwkJCXNlcV9wcmludGYobSwgIiAgU0VTU0lPTiAnJXMnICUwOFgvJWQgJTA0WC8lMDRYIC0+ICIK KwkJCQkgICAiJTA0WC8lMDRYICVkICVjIE1BR0lDICVzXG4iLAorCQkJCSAgIHNlc3Npb24tPm5h bWUsCisJCQkJICAgaHRvbmwoc2Vzc2lvbi0+dHVubmVsX2FkZHIuYWRkci5zaW5fYWRkci5zX2Fk ZHIpLAorCQkJCSAgIGh0b25zKHNlc3Npb24tPnR1bm5lbF9hZGRyLmFkZHIuc2luX3BvcnQpLAor CQkJCSAgIHNlc3Npb24tPnR1bm5lbF9hZGRyLnNfdHVubmVsLCAKKwkJCQkgICBzZXNzaW9uLT50 dW5uZWxfYWRkci5zX3Nlc3Npb24sCisJCQkJICAgc2Vzc2lvbi0+dHVubmVsX2FkZHIuZF90dW5u ZWwsIAorCQkJCSAgIHNlc3Npb24tPnR1bm5lbF9hZGRyLmRfc2Vzc2lvbiwKKwkJCQkgICBzZXNz aW9uLT5zb2NrLT5za19zdGF0ZSwKKwkJCQkgICAoc2Vzc2lvbiA9PSBzZXNzaW9uLT5zb2NrLT5z a191c2VyX2RhdGEpID8gCisJCQkJICAgJ1knIDogJ04nLAorCQkJCSAgIChzZXNzaW9uLT5tYWdp YyA9PSBMMlRQX1NFU1NJT05fTUFHSUMpID8gCisJCQkJICAgIk9LIiA6ICJCQUQiKTsKKworCQkJ c2VxX3ByaW50ZihtLCAiICAgJWQvJWQvJWMvJWMvJXMgJTA4eCAlZFxuIiwKKwkJCQkgICBzZXNz aW9uLT5tdHUsIHNlc3Npb24tPm1ydSwgCisJCQkJICAgc2Vzc2lvbi0+cmVjdl9zZXEgPyAnUicg OiAnLScsCisJCQkJICAgc2Vzc2lvbi0+c2VuZF9zZXEgPyAnUycgOiAnLScsCisJCQkJICAgc2Vz c2lvbi0+bG5zX21vZGUgPyAiTE5TIiA6ICJMQUMiLAorCQkJCSAgIHNlc3Npb24tPmRlYnVnLCBz ZXNzaW9uLT5yZW9yZGVyX3RpbWVvdXQpOworCQkJc2VxX3ByaW50ZihtLCAiICAgJWh1LyVodSAl dS8ldS8ldSAldS8ldS8ldVxuIiwKKwkJCQkgICBzZXNzaW9uLT5uciwgc2Vzc2lvbi0+bnMsCisJ CQkJICAgc2Vzc2lvbi0+c3RhdHMudHhfcGFja2V0cywgCisJCQkJICAgc2Vzc2lvbi0+c3RhdHMu dHhfYnl0ZXMsIAorCQkJCSAgIHNlc3Npb24tPnN0YXRzLnR4X2Vycm9ycywKKwkJCQkgICBzZXNz aW9uLT5zdGF0cy5yeF9wYWNrZXRzLCAKKwkJCQkgICBzZXNzaW9uLT5zdGF0cy5yeF9ieXRlcywg CisJCQkJICAgc2Vzc2lvbi0+c3RhdHMucnhfZXJyb3JzKTsKKworCQkJaWYgKHNlc3Npb24tPm1h Z2ljICE9IEwyVFBfU0VTU0lPTl9NQUdJQykgeworCQkJCXNlcV9wdXRzKG0sICIqKiogQWJvcnRp bmcgKioqXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJc2Vzc2lvbiA9IHNlc3Npb24tPm5l eHQ7CisJCX0KKworCQlpZiAoc2Vzc2lvbikKKwkJCWJyZWFrOworCX0KKwlzZXFfcHV0cyhtLCAi XG4iKTsKKworb3V0OgorCUVYSVRfRlVOQ1RJT047CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlm IC8qIENPTkZJR19QUk9DX0ZTICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSW5pdCBh bmQgY2xlYW51cAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHByb3Rv X29wcyBwcHBvbDJ0cF9vcHMgPSB7CisJLmZhbWlseQkJPSBBRl9QUFBPWCwKKwkub3duZXIJCT0g VEhJU19NT0RVTEUsCisJLnJlbGVhc2UJPSBwcHBvbDJ0cF9yZWxlYXNlLAorCS5iaW5kCQk9IHNv Y2tfbm9fYmluZCwKKwkuY29ubmVjdAk9IHBwcG9sMnRwX2Nvbm5lY3QsCisJLnNvY2tldHBhaXIJ PSBzb2NrX25vX3NvY2tldHBhaXIsCisJLmFjY2VwdAkJPSBzb2NrX25vX2FjY2VwdCwKKwkuZ2V0 bmFtZQk9IHBwcG9sMnRwX2dldG5hbWUsCisJLnBvbGwJCT0gZGF0YWdyYW1fcG9sbCwKKwkubGlz dGVuCQk9IHNvY2tfbm9fbGlzdGVuLAorCS5zaHV0ZG93bgk9IHNvY2tfbm9fc2h1dGRvd24sCisJ LnNldHNvY2tvcHQJPSBwcHBvbDJ0cF9zZXRzb2Nrb3B0LAorCS5nZXRzb2Nrb3B0CT0gcHBwb2wy dHBfZ2V0c29ja29wdCwKKwkuc2VuZG1zZwk9IHBwcG9sMnRwX3NlbmRtc2csCisJLnJlY3Ztc2cJ PSBwcHBvbDJ0cF9yZWN2bXNnLAorCS5tbWFwCQk9IHNvY2tfbm9fbW1hcAorfTsKKworc3RydWN0 IHBwcG94X3Byb3RvIHBwcG9sMnRwX3Byb3RvID0geworCS5jcmVhdGUJCT0gcHBwb2wydHBfY3Jl YXRlLAorCS5pb2N0bAkJPSBwcHBvbDJ0cF9pb2N0bAorfTsKKworaW50IF9faW5pdCBwcHBvbDJ0 cF9pbml0KHZvaWQpCit7CisJaW50IGVyciA9IHJlZ2lzdGVyX3BwcG94X3Byb3RvKFBYX1BST1RP X09MMlRQLCAmcHBwb2wydHBfcHJvdG8pOworCisJaWYgKGVyciA9PSAwKSB7CisjaWZkZWYgQ09O RklHX1BST0NfRlMKKwkJcHBwb2wydHBfcHJvYyA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJwcHBvbDJ0 cCIsIDAsIHByb2NfbmV0KTsKKwkJaWYgKCFwcHBvbDJ0cF9wcm9jKSB7CisJCQlyZXR1cm4gLUVO T01FTTsKKwkJfQorCQlwcHBvbDJ0cF9wcm9jLT5wcm9jX2ZvcHMgPSAmcHBwb2wydHBfcHJvY19m b3BzOworI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisJCXByaW50ayhLRVJOX0lORk8gIlBQ UG9MMlRQIGtlcm5lbCBkcml2ZXIsICVzXG4iLAorCQkgICAgICAgUFBQT0wyVFBfRFJWX1ZFUlNJ T04pOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgX19leGl0IHBwcG9sMnRwX2V4aXQo dm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3BwcG94X3Byb3RvKFBYX1BST1RPX09MMlRQKTsKKyNpZmRl ZiBDT05GSUdfUFJPQ19GUworCXJlbW92ZV9wcm9jX2VudHJ5KCJwcHBvbDJ0cCIsIHByb2NfbmV0 KTsKKyNlbmRpZgorfQorCittb2R1bGVfaW5pdChwcHBvbDJ0cF9pbml0KTsKK21vZHVsZV9leGl0 KHBwcG9sMnRwX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJ0aWpuIHZhbiBPb3N0ZXJob3V0 IDxrbGVwdG9nQHN2YW5hLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUFBQIG92ZXIgTDJU UCBvdmVyIFVEUCwgIiBQUFBPTDJUUF9EUlZfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BM Iik7CmRpZmYgLU5hdXIgbGludXgtMi42LjguMS5vcmlnL2luY2x1ZGUvbGludXgvaWZfcHBwb2wy dHAuaCBsaW51eC0yLjYuOC4xL2luY2x1ZGUvbGludXgvaWZfcHBwb2wydHAuaAotLS0gbGludXgt Mi42LjguMS5vcmlnL2luY2x1ZGUvbGludXgvaWZfcHBwb2wydHAuaAkxOTcwLTAxLTAxIDAxOjAw OjAwLjAwMDAwMDAwMCArMDEwMAorKysgbGludXgtMi42LjguMS9pbmNsdWRlL2xpbnV4L2lmX3Bw cG9sMnRwLmgJMjAwNC0wOS0wMSAxNzozNzo1NC4wMDAwMDAwMDAgKzAxMDAKQEAgLTAsMCArMSw4 NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKgorICogTGludXggUFBQIG92ZXIgTDJUUCAoUFBQb0wy VFApIFNvY2tldCBJbXBsZW1lbnRhdGlvbiAoUkZDIDI2NjEpIAorICoKKyAqIFRoaXMgZmlsZSBz dXBwbGllcyBkZWZpbml0aW9ucyByZXF1aXJlZCBieSB0aGUgUFBQIG92ZXIgTDJUUCBkcml2ZXIK KyAqIChwcHBvbDJ0cC5jKS4gIEFsbCB2ZXJzaW9uIGluZm9ybWF0aW9uIHdydCB0aGlzIGZpbGUg aXMgbG9jYXRlZCBpbiBwcHBvbDJ0cC5jCisgKgorICogTGljZW5zZToKKyAqCQlUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJ bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0 aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaWZuZGVmIF9fTElOVVhfSUZfUFBQT0wyVFBf SAorI2RlZmluZSBfX0xJTlVYX0lGX1BQUE9MMlRQX0gKKworI2luY2x1ZGUgPGFzbS90eXBlcy5o PgorCisjaWZkZWYgX19LRVJORUxfXworI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjZW5kaWYKKwor LyogU3RydWN0dXJlIHVzZWQgdG8gYmluZCgpIHRoZSBzb2NrZXQgdG8gYSBwYXJ0aWN1bGFyIHNv Y2tldCAmIHR1bm5lbCAqLworc3RydWN0IHBwcG9sMnRwX2FkZHIKK3sKKwlpbnQJZmQ7CQkgLyog RkQgb2YgVURQIHNvY2tldCB0byB1c2UgKi8KKwkKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsg LyogSVAgYWRkcmVzcyBhbmQgcG9ydCB0byBzZW5kIHRvICovCisJCisJX191MTYgc190dW5uZWws IHNfc2Vzc2lvbjsgICAgLyogRm9yIG1hdGNoaW5nIGluY29taW5nIHBhY2tldHMgKi8KKwlfX3Ux NiBkX3R1bm5lbCwgZF9zZXNzaW9uOyAgICAvKiBGb3Igc2VuZGluZyBvdXRnb2luZyBwYWNrZXRz ICovCit9OworCisvKiBJb2N0bCBkZWZpbml0aW9uczoKKyAqIEdMMlRQU1RBVFMJLSBnZXQgTDJU UCB0dW5uZWwgb3Igc2Vzc2lvbiBzdGF0aXN0aWNzCisgKgorICogRklYTUUgLSBNT1ZFIFRPIGlm X3BwcC5oPz8/CisgKi8KKyNkZWZpbmUJUFBQSU9DR0wyVFBTVEFUUwlfSU9SKCd0JywgNTQsIHN0 cnVjdCBwcHBvbDJ0cF9pb2Nfc3RhdHMpCisKK3N0cnVjdCBwcHBvbDJ0cF9pb2Nfc3RhdHMgewor CV9fdTE2CXR1bm5lbF9pZDsJLyogcmVkdW5kYW50ICovCisJX191MTYJc2Vzc2lvbl9pZDsJLyog aWYgemVybywgZ2V0IHR1bm5lbCBzdGF0cyAqLworCV9fdTMyCXR4X3BhY2tldHM7CisJX191MzIJ dHhfYnl0ZXM7CisJX191MzIJdHhfZXJyb3JzOworCV9fdTMyCXJ4X3BhY2tldHM7CisJX191MzIJ cnhfYnl0ZXM7CisJX191MzIJcnhfc2VxX2Rpc2NhcmRzOworCV9fdTMyCXJ4X29vc19wYWNrZXRz OworCV9fdTMyCXJ4X2Vycm9yczsKK307CisKKy8qIFNvY2tldCBvcHRpb25zOgorICogREVCVUcJ LSBiaXRtYXNrIG9mIGRlYnVnIG1lc3NhZ2UgY2F0ZWdvcmllcworICogU0VORFNFUQktIDAgPT4g ZG9uJ3Qgc2VuZCBwYWNrZXRzIHdpdGggc2VxdWVuY2UgbnVtYmVycworICoJCSAgMSA9PiBzZW5k IHBhY2tldHMgd2l0aCBzZXF1ZW5jZSBudW1iZXJzCisgKiBSRUNWU0VRCS0gMCA9PiByZWNlaXZl IHBhY2tldCBzZXF1ZW5jZSBudW1iZXJzIGFyZSBvcHRpb25hbAorICoJCSAgMSA9PiBkcm9wIHJl Y2VpdmUgcGFja2V0cyB3aXRob3V0IHNlcXVlbmNlIG51bWJlcnMKKyAqIExOU01PREUJLSAwID0+ IGFjdCBhcyBMQUMuCisgKgkJICAxID0+IGFjdCBhcyBMTlMuCisgKiBSRU9SREVSVE8JLSByZW9y ZGVyIHRpbWVvdXQgKGluIG1pbGxpc2VjcykuIElmIDAsIGRvbid0IHRyeSB0byByZW9yZGVyLgor ICovCitlbnVtIHsKKwlQUFBPTDJUUF9TT19ERUJVRwk9IDEsCisJUFBQT0wyVFBfU09fUkVDVlNF UQk9IDIsCisJUFBQT0wyVFBfU09fU0VORFNFUQk9IDMsCisJUFBQT0wyVFBfU09fTE5TTU9ERQk9 IDQsCisJUFBQT0wyVFBfU09fUkVPUkRFUlRPCT0gNSwKK307CisKKy8qIERlYnVnIG1lc3NhZ2Ug Y2F0ZWdvcmllcyBmb3IgdGhlIERFQlVHIHNvY2tldCBvcHRpb24gKi8KK2VudW0geworCVBQUE9M MlRQX01TR19ERUJVRwk9ICgxIDw8IDApLAkvKiB2ZXJib3NlIGRlYnVnIChpZgorCQkJCQkJICog Y29tcGlsZWQgaW4pICovIAorCVBQUE9MMlRQX01TR19DT05UUk9MCT0gKDEgPDwgMSksCS8qIHVz ZXJzcGFjZSAtIGtlcm5lbAorCQkJCQkJICogaW50ZXJmYWNlICovCisJUFBQT0wyVFBfTVNHX1NF UQk9ICgxIDw8IDIpLAkvKiBzZXF1ZW5jZSBudW1iZXJzICovCisJUFBQT0wyVFBfTVNHX0RBVEEJ PSAoMSA8PCAzKSwJLyogZGF0YSBwYWNrZXRzICovCit9OworCisKKworI2VuZGlmCmRpZmYgLU5h dXIgbGludXgtMi42LjguMS5vcmlnL2luY2x1ZGUvbGludXgvaWZfcHBwb3guaCBsaW51eC0yLjYu OC4xL2luY2x1ZGUvbGludXgvaWZfcHBwb3guaAotLS0gbGludXgtMi42LjguMS5vcmlnL2luY2x1 ZGUvbGludXgvaWZfcHBwb3guaAkyMDA0LTA4LTE0IDExOjU0OjUwLjAwMDAwMDAwMCArMDEwMAor KysgbGludXgtMi42LjguMS9pbmNsdWRlL2xpbnV4L2lmX3BwcG94LmgJMjAwNC0wOS0wMSAxNzoz Nzo1NC4wMDAwMDAwMDAgKzAxMDAKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxhc20vc2Vt YXBob3JlLmg+CiAjaW5jbHVkZSA8bGludXgvcHBwX2NoYW5uZWwuaD4KICNlbmRpZiAvKiBfX0tF Uk5FTF9fICovCisjaW5jbHVkZSA8bGludXgvaWZfcHBwb2wydHAuaD4KIAogLyogRm9yIHVzZXIt c3BhY2UgcHJvZ3JhbXMgdG8gcGljayB1cCB0aGVzZSBkZWZpbml0aW9ucwogICogd2hpY2ggdGhl eSB3b3VsZG4ndCBnZXQgb3RoZXJ3aXNlIHdpdGhvdXQgZGVmaW5pbmcgX19LRVJORUxfXwpAQCAt NTAsMTMgKzUxLDE1IEBACiAgKiBQcm90b2NvbHMgc3VwcG9ydGVkIGJ5IEFGX1BQUE9YIAogICov IAogI2RlZmluZSBQWF9QUk9UT19PRSAgICAwIC8qIEN1cnJlbnRseSBqdXN0IFBQUG9FICovCi0j ZGVmaW5lIFBYX01BWF9QUk9UTyAgIDEJCisjZGVmaW5lIFBYX1BST1RPX09MMlRQIDEgLyogTm93 IEwyVFAgYWxzbyAqLworI2RlZmluZSBQWF9NQVhfUFJPVE8gICAyCQogIAogc3RydWN0IHNvY2th ZGRyX3BwcG94IHsgCiAgICAgICAgc2FfZmFtaWx5X3QgICAgIHNhX2ZhbWlseTsgICAgICAgICAg ICAvKiBhZGRyZXNzIGZhbWlseSwgQUZfUFBQT1ggKi8gCiAgICAgICAgdW5zaWduZWQgaW50ICAg IHNhX3Byb3RvY29sOyAgICAgICAgICAvKiBwcm90b2NvbCBpZGVudGlmaWVyICovIAogICAgICAg IHVuaW9ueyAKICAgICAgICAgICAgICAgIHN0cnVjdCBwcHBvZV9hZGRyICAgICAgIHBwcG9lOyAK KyAgICAgICAgICAgICAgIHN0cnVjdCBwcHBvbDJ0cF9hZGRyICAgIHBwcG9sMnRwOwogICAgICAg IH1zYV9hZGRyOyAKIH1fX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7IAogCmRpZmYgLU5hdXIgbGlu dXgtMi42LjguMS5vcmlnL2luY2x1ZGUvbGludXgvc29ja2V0LmggbGludXgtMi42LjguMS9pbmNs dWRlL2xpbnV4L3NvY2tldC5oCi0tLSBsaW51eC0yLjYuOC4xLm9yaWcvaW5jbHVkZS9saW51eC9z b2NrZXQuaAkyMDA0LTA4LTE0IDExOjU1OjU5LjAwMDAwMDAwMCArMDEwMAorKysgbGludXgtMi42 LjguMS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCTIwMDQtMDktMDEgMTc6Mzc6NTUuMDAwMDAwMDAw ICswMTAwCkBAIC0yNjgsNiArMjY4LDcgQEAKICNkZWZpbmUgU09MX0lSREEgICAgICAgIDI2Ngog I2RlZmluZSBTT0xfTkVUQkVVSQkyNjcKICNkZWZpbmUgU09MX0xMQwkJMjY4CisjZGVmaW5lIFNP TF9QUFBPTDJUUAkyNjkKIAogLyogSVBYIG9wdGlvbnMgKi8KICNkZWZpbmUgSVBYX1RZUEUJMQo= ---MOQ10944719560baa5174fac6e4ed97ac1aeaf3061f31--