Date: Thu, 12 Jun 2014 08:56:43 +0200 From: =?UTF-8?Q?Tomek_Wa=C5=82aszek?= <tmwalaszek@gmail.com> To: freebsd-hackers@freebsd.org Subject: Improve cron(8) Message-ID: <CAN3T69vCQTb1hU%2BAUKg%2BKLgsuCttLxYS6u2r9k3w5LM2D4zZoA@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
--089e0111c08a47d11f04fb9e10f8 Content-Type: text/plain; charset=UTF-8 Hello, I saw on the FreeBSD Ideas page topic about cron :). I've started updating the 'original' FreeBSD cron from sources to vixi cron 4.1. I think (well I hope :P) most of the features that were done in FreeBSD cron are now ported into vixi cron 4.1, there are unfortunately some missing features at the moment: - @every_second - this need to be done - -s and -o, in vixi cron 4.1 daylight time switches are enabled by default, at the moment there is no -s and -o options. So you need to remove '-s' from the cron rc script I've also added one feature from OpenBSD, crontab is poking cron using unix-domain socket so we don't need to have suid on crontab. Path is in the attachment. I'm testing it on my FreeBSD box and it looks good but anyway don't try it on production machines :). After the installation we have to do a few things: - Add crontab group - Change group to crontab on /var/cron/tabs - Add sticky bit on /var/cron/tabs - Add group write permissions on /var/cron/tabs This is still work in progress but if someone could have a look on this and give me some feedback it would be great. Regards, Tomasz Walaszek --089e0111c08a47d11f04fb9e10f8 Content-Type: application/octet-stream; name=vixi_patch Content-Disposition: attachment; filename=vixi_patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_hwbtjuwi0 ZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vTWFrZWZpbGUgZnJlZWJzZF9jcm9uL01h a2VmaWxlCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL01ha2VmaWxlCTIwMTQtMDEtMTYgMjE6 NDM6NDkuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vTWFrZWZpbGUJMjAxNC0wNi0x MSAxNjo0Mjo1NS4yNzE0NDQ4OTMgKzAyMDAKQEAgLTEsNCArMSw0IEBACi0jICRGcmVlQlNEOiBy ZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL01ha2VmaWxlIDgwMDI5IDIwMDEtMDctMjAgMDY6 MjA6MzJaIG9icmllbiAkCisjICRGcmVlQlNEOiByZWxlbmcvMTAuMC91c3Iuc2Jpbi9jcm9uL01h a2VmaWxlIDgwMDI5IDIwMDEtMDctMjAgMDY6MjA6MzJaIG9icmllbiAkCiAKIFNVQkRJUj0JbGli IGNyb24gY3JvbnRhYgogCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL01ha2VmaWxl LmluYyBmcmVlYnNkX2Nyb24vTWFrZWZpbGUuaW5jCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9u L01ha2VmaWxlLmluYwkyMDE0LTAxLTE2IDIxOjQzOjUwLjAwMDAwMDAwMCArMDEwMAorKysgZnJl ZWJzZF9jcm9uL01ha2VmaWxlLmluYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MTQ0NDg5MyArMDIw MApAQCAtMSw0ICsxLDQgQEAKLSMgJEZyZWVCU0Q6IHJlbGVhc2UvMTAuMC4wL3Vzci5zYmluL2Ny b24vTWFrZWZpbGUuaW5jIDE0NzIyNSAyMDA1LTA2LTEwIDA2OjEyOjUzWiBkZXMgJAorIyAkRnJl ZUJTRDogcmVsZW5nLzEwLjAvdXNyLnNiaW4vY3Jvbi9NYWtlZmlsZS5pbmMgMTQ3MjI1IDIwMDUt MDYtMTAgMDY6MTI6NTNaIGRlcyAkCiAKIExJQkNST049ICR7Lk9CSkRJUn0vLi4vbGliL2xpYmNy b24uYQogCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24vTWFrZWZpbGUgZnJl ZWJzZF9jcm9uL2Nyb24vTWFrZWZpbGUKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9N YWtlZmlsZQkyMDE0LTAxLTE2IDIxOjQzOjQ5LjAwMDAwMDAwMCArMDEwMAorKysgZnJlZWJzZF9j cm9uL2Nyb24vTWFrZWZpbGUJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzE0NDQ4OTMgKzAyMDAKQEAg LTEsNCArMSw0IEBACi0jICRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Ny b24vTWFrZWZpbGUgMjAxMzkwIDIwMTAtMDEtMDIgMTE6MDc6NDRaIGVkICQKKyMgJEZyZWVCU0Q6 IHJlbGVuZy8xMC4wL3Vzci5zYmluL2Nyb24vY3Jvbi9NYWtlZmlsZSAyMDEzOTAgMjAxMC0wMS0w MiAxMTowNzo0NFogZWQgJAogCiBQUk9HPQljcm9uCiBNQU49CWNyb24uOApkaWZmIC1ydU4gL3Vz ci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2NvbXBhdC5oIGZyZWVic2RfY3Jvbi9jcm9uL2NvbXBh dC5oCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24vY29tcGF0LmgJMjAxNC0wMS0xNiAy MTo0Mzo0OS4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9jcm9uL2NvbXBhdC5oCTE5 NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCkBAIC0xLDE0MCArMCwwIEBACi0vKiBD b3B5cmlnaHQgMTk5MywxOTk0IGJ5IFBhdWwgVml4aWUKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQK LSAqCi0gKiBEaXN0cmlidXRlIGZyZWVseSwgZXhjZXB0OiBkb24ndCByZW1vdmUgbXkgbmFtZSBm cm9tIHRoZSBzb3VyY2Ugb3IKLSAqIGRvY3VtZW50YXRpb24gKGRvbid0IHRha2UgY3JlZGl0IGZv ciBteSB3b3JrKSwgbWFyayB5b3VyIGNoYW5nZXMgKGRvbid0Ci0gKiBnZXQgbWUgYmxhbWVkIGZv ciB5b3VyIHBvc3NpYmxlIGJ1Z3MpLCBkb24ndCBhbHRlciBvciByZW1vdmUgdGhpcwotICogbm90 aWNlLiAgTWF5IGJlIHNvbGQgaWYgYnVpbGRhYmxlIHNvdXJjZSBpcyBwcm92aWRlZCB0byBidXll ci4gIE5vCi0gKiB3YXJyYW50ZWUgb2YgYW55IGtpbmQsIGV4cHJlc3Mgb3IgaW1wbGllZCwgaXMg aW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBzb2Z0d2FyZTsgdXNlIGF0IHlvdXIgb3duIHJpc2ssIHJl c3BvbnNpYmlsaXR5IGZvciBkYW1hZ2VzIChpZiBhbnkpIHRvCi0gKiBhbnlvbmUgcmVzdWx0aW5n IGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIHJlc3RzIGVudGlyZWx5IHdpdGggdGhlCi0g KiB1c2VyLgotICoKLSAqIFNlbmQgYnVnIHJlcG9ydHMsIGJ1ZyBmaXhlcywgZW5oYW5jZW1lbnRz LCByZXF1ZXN0cywgZmxhbWVzLCBldGMuLCBhbmQKLSAqIEknbGwgdHJ5IHRvIGtlZXAgYSB2ZXJz aW9uIHVwIHRvIGRhdGUuICBJIGNhbiBiZSByZWFjaGVkIGFzIGZvbGxvd3M6Ci0gKiBQYXVsIFZp eGllICAgICAgICAgIDxwYXVsQHZpeC5jb20+ICAgICAgICAgIHV1bmV0IWRlY3dybCF2aXhpZSFw YXVsCi0gKi8KLQotLyoKLSAqICRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9u L2Nyb24vY29tcGF0LmggNTA0NzkgMTk5OS0wOC0yOCAwMTozNTo1OVogcGV0ZXIgJAotICovCi0K LSNpZm5kZWYgX19QCi0jIGlmZGVmIF9fU1REQ19fCi0jICBkZWZpbmUgX19QKHgpIHgKLSMgZWxz ZQotIyAgZGVmaW5lIF9fUCh4KSAoKQotIyAgZGVmaW5lIGNvbnN0Ci0jIGVuZGlmCi0jZW5kaWYK LQotI2lmIGRlZmluZWQoVU5JWFBDKSB8fCBkZWZpbmVkKHVuaXhwYykKLSMgZGVmaW5lIFVOSVhQ QyAxCi0jIGRlZmluZSBBVFQgMQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKGhwdXgpIHx8IGRlZmlu ZWQoX2hwdXgpIHx8IGRlZmluZWQoX19ocHV4KQotIyBkZWZpbmUgSFBVWCAxCi0jIGRlZmluZSBz ZXRldWlkKGUpIHNldHJlc3VpZCgtMSxlLC0xKQotIyBkZWZpbmUgc2V0cmV1aWQocixlKQlzZXRy ZXN1aWQocixlLC0xKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9JQk1SMikKLSMgZGVmaW5lIEFJ WCAxCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jb252ZXhfXykKLSMgZGVmaW5lIENPTlZFWCAx Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoc2dpKSB8fCBkZWZpbmVkKF9zZ2kpIHx8IGRlZmluZWQo X19zZ2kpCi0jIGRlZmluZSBJUklYIDEKLS8qIElSSVggNCBoZHJzIGFyZSBicm9rZW46IG9uZSBj YW5ub3QgI2luY2x1ZGUgYm90aCA8c3RkaW8uaD4KLSAqIGFuZCA8c3RkbGliLmg+IGJlY2F1c2Ug dGhleSBkaXNhZ3JlZSBvbiBzeXN0ZW0oKSwgcGVycm9yKCkuCi0gKiBUaGVyZWZvcmUgd2UgbXVz dCB6YXAgdGhlICJjb25zdCIga2V5d29yZCBCRUZPUkUgaW5jbHVkaW5nCi0gKiBlaXRoZXIgb2Yg dGhlbS4KLSAqLwotIyBkZWZpbmUgY29uc3QKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfVU5JQ09T KQotIyBkZWZpbmUgVU5JQ09TIDEKLSNlbmRpZgotCi0jaWZuZGVmIFBPU0lYCi0jIGlmIChCU0Qg Pj0gMTk5MTAzKSB8fCBkZWZpbmVkKF9fbGludXgpIHx8IGRlZmluZWQodWx0cml4KSB8fCBkZWZp bmVkKEFJWCkgfHxcCi0JZGVmaW5lZChIUFVYKSB8fCBkZWZpbmVkKENPTlZFWCkgfHwgZGVmaW5l ZChJUklYKQotIyAgZGVmaW5lIFBPU0lYCi0jIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBCU0QK LSMgaWYgZGVmaW5lZCh1bHRyaXgpCi0jICBkZWZpbmUgQlNEIDE5ODkwMgotIyBlbmRpZgotI2Vu ZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKi8KLQotI2lmICFkZWZpbmVkKEJTRCkgJiYgIWRlZmluZWQoSFBVWCkg JiYgIWRlZmluZWQoQ09OVkVYKSAmJiAhZGVmaW5lZChfX2xpbnV4KQotIyBkZWZpbmUgTkVFRF9W Rk9SSwotI2VuZGlmCi0KLSNpZiAoIWRlZmluZWQoQlNEKSB8fCAoQlNEIDwgMTk4OTAyKSkgJiYg IWRlZmluZWQoX19saW51eCkgJiYgXAotCSFkZWZpbmVkKElSSVgpICYmICFkZWZpbmVkKE5lWFQp ICYmICFkZWZpbmVkKEhQVVgpCi0jIGRlZmluZSBORUVEX1NUUkNBU0VDTVAKLSNlbmRpZgotCi0j aWYgKCFkZWZpbmVkKEJTRCkgfHwgKEJTRCA8IDE5ODkxMSkpICYmICFkZWZpbmVkKF9fbGludXgp ICYmXAotCSFkZWZpbmVkKElSSVgpICYmICFkZWZpbmVkKFVOSUNPUykgJiYgIWRlZmluZWQoSFBV WCkKLSMgZGVmaW5lIE5FRURfU1RSRFVQCi0jZW5kaWYKLQotI2lmICghZGVmaW5lZChCU0QpIHx8 IChCU0QgPCAxOTg5MTEpKSAmJiAhZGVmaW5lZChQT1NJWCkgJiYgIWRlZmluZWQoTmVYVCkKLSMg ZGVmaW5lIE5FRURfU1RSRVJST1IKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChIUFVYKSB8fCBkZWZp bmVkKEFJWCkgfHwgZGVmaW5lZChVTklYUEMpCi0jIGRlZmluZSBORUVEX0ZMT0NLCi0jZW5kaWYK LQotI2lmbmRlZiBQT1NJWAotIyBkZWZpbmUgTkVFRF9TRVRTSUQKLSNlbmRpZgotCi0jaWYgKGRl ZmluZWQoUE9TSVgpICYmICFkZWZpbmVkKEJTRCkpICYmICFkZWZpbmVkKF9fbGludXgpCi0jIGRl ZmluZSBORUVEX0dFVERUQUJMRVNJWkUKLSNlbmRpZgotCi0jaWZkZWYgUE9TSVgKLSNpbmNsdWRl IDx1bmlzdGQuaD4KLSNpZmRlZiBfUE9TSVhfU0FWRURfSURTCi0jIGRlZmluZSBIQVZFX1NBVkVE X1VJRFMKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChBVFQpICYmICFkZWZpbmVkKF9f bGludXgpICYmICFkZWZpbmVkKElSSVgpICYmICFkZWZpbmVkKFVOSUNPUykKLSMgZGVmaW5lIFVT RV9TSUdDSExECi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKEFJWCkgJiYgIWRlZmluZWQoVU5JQ09T KQotIyBkZWZpbmUgU1lTX1RJTUVfSCAxCi0jZWxzZQotIyBkZWZpbmUgU1lTX1RJTUVfSCAwCi0j ZW5kaWYKLQotI2lmIGRlZmluZWQoQlNEKSAmJiAhZGVmaW5lZChQT1NJWCkKLSMgZGVmaW5lIFVT RV9VVElNRVMKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChBSVgpIHx8IGRlZmluZWQoSFBVWCkgfHwg ZGVmaW5lZChJUklYKQotIyBkZWZpbmUgTkVFRF9TRVRFTlYKLSNlbmRpZgotCi0jaWYgIWRlZmlu ZWQoVU5JQ09TKSAmJiAhZGVmaW5lZChVTklYUEMpCi0jIGRlZmluZSBIQVNfRkNIT1dOCi0jZW5k aWYKLQotI2lmICFkZWZpbmVkKFVOSUNPUykgJiYgIWRlZmluZWQoVU5JWFBDKQotIyBkZWZpbmUg SEFTX0ZDSE1PRAotI2VuZGlmCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24v Y29uZmlnLmggZnJlZWJzZF9jcm9uL2Nyb24vY29uZmlnLmgKLS0tIC91c3Ivc3JjL3Vzci5zYmlu L2Nyb24vY3Jvbi9jb25maWcuaAkyMDE0LTAxLTE2IDIxOjQzOjQ5LjAwMDAwMDAwMCArMDEwMAor KysgZnJlZWJzZF9jcm9uL2Nyb24vY29uZmlnLmgJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzE0NDQ4 OTMgKzAyMDAKQEAgLTEsMjkgKzEsMjkgQEAKIC8qIENvcHlyaWdodCAxOTg4LDE5OTAsMTk5Mywx OTk0IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqLworCisvKgorICog Q29weXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAo IklTQyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0d2FyZSBD b25zb3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2VwdDogZG9uJ3Qg cmVtb3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0aW9uIChkb24n dCB0YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChkb24ndAotICog Z2V0IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0ZXIgb3IgcmVt b3ZlIHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBzb3VyY2UgaXMg cHJvdmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5kLCBleHByZXNz IG9yIGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7IHVzZSBhdCB5 b3VyIG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55KSB0bwotICog YW55b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSByZXN0cyBlbnRp cmVseSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2Rp ZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRo IG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92 ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIg aW4gYWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4ZXMsIGVuaGFu Y2VtZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRyeSB0byBrZWVw IGEgdmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xsb3dzOgotICog UGF1bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5ldCFkZWN3cmwh dml4aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElTQyBE SVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUg SU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBB TkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9SCisgKiBBTlkg U1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFO WSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRB IE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElH RU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBPRiBPUiBJTiBD T05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgog ICovCiAKLS8qIGNvbmZpZy5oIC0gY29uZmlndXJhYmxlcyBmb3IgVml4aWUgQ3JvbgorLyogY29u ZmlnLmggLSBjb25maWd1cmFibGVzIGZvciBJU0MgQ3JvbgogICoKLSAqICRGcmVlQlNEOiByZWxl YXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Nyb24vY29uZmlnLmggNTA0NzkgMTk5OS0wOC0yOCAw MTozNTo1OVogcGV0ZXIgJAorICogJElkOiBjb25maWcuaCx2IDEuMTAgMjAwNC8wMS8yMyAxODo1 Njo0MiB2aXhpZSBFeHAgJAogICovCiAKLSNpZiAhZGVmaW5lZChfUEFUSF9TRU5ETUFJTCkKLSMg ZGVmaW5lIF9QQVRIX1NFTkRNQUlMICIvdXNyL2xpYi9zZW5kbWFpbCIKLSNlbmRpZiAvKlNFTkRN QUlMKi8KLQogLyoKICAqIHRoZXNlIGFyZSBzaXRlLWRlcGVuZGVudAogICovCkBAIC0zMyw0NCAr MzMsMzggQEAKICNlbmRpZgogCiAJCQkvKgotCQkJICogY2hvb3NlIG9uZSBvZiB0aGVzZSBNQUlM Q01EIGNvbW1hbmRzLiAgSSB1c2UKKwkJCSAqIGNob29zZSBvbmUgb2YgdGhlc2UgbWFpbGVyIGNv bW1hbmRzLiAgc29tZSB1c2UKIAkJCSAqIC9iaW4vbWFpbCBmb3Igc3BlZWQ7IGl0IG1ha2VzIGJp ZmYgYmFyayBidXQgZG9lc24ndAotCQkJICogZG8gYWxpYXNpbmcuICAvdXNyL2xpYi9zZW5kbWFp bCBkb2VzIGFsaWFzaW5nIGJ1dCBpcworCQkJICogZG8gYWxpYXNpbmcuICBzZW5kbWFpbCBkb2Vz IGRvIGFsaWFzaW5nIGJ1dCBpcwogCQkJICogYSBob2cgZm9yIHNob3J0IG1lc3NhZ2VzLiAgYWxp YXNpbmcgaXMgbm90IG5lZWRlZAogCQkJICogaWYgeW91IG1ha2UgdXNlIG9mIHRoZSBNQUlMVE89 IGZlYXR1cmUgaW4gY3JvbnRhYnMuCiAJCQkgKiAoaGludDogTUFJTFRPPSB3YXMgYWRkZWQgZm9y IHRoaXMgcmVhc29uKS4KIAkJCSAqLwogCi0jZGVmaW5lIE1BSUxDTUQgX1BBVEhfU0VORE1BSUwJ CQkJCS8qLSovCi0jZGVmaW5lIE1BSUxBUkdTICIlcyAtRkNyb25EYWVtb24gLW9kaSAtb2VtIC1v aSAtdCIgICAgICAgICAgICAgLyotKi8KLQkJCS8qIC1GeAkgPSBzZXQgZnVsbC1uYW1lIG9mIHNl bmRlcgorI2RlZmluZSBNQUlMRk1UICIlcyAtRkNyb25EYWVtb24gLW9kaSAtb2VtIC1vaSAtdCIg LyotKi8KKwkJCS8qIC1GeAkgPSBTZXQgZnVsbC1uYW1lIG9mIHNlbmRlcgogCQkJICogLW9kaQkg PSBPcHRpb24gRGVsaXZlcnltb2RlIEludGVyYWN0aXZlCiAJCQkgKiAtb2VtCSA9IE9wdGlvbiBF cnJvcnMgTWFpbGVkdG9zZW5kZXIKLQkJCSAqIC1vaSAgID0gT3B0aW9uIGRvdCBtZXNzYWdlIHRl cm1pbmF0b3IKLQkJCSAqIC10ICAgID0gcmVhZCByZWNpcGllbnRzIGZyb20gaGVhZGVyIG9mIG1l c3NhZ2UKKwkJCSAqIC1vaSAgID0gSWdub3JlICIuIiBhbG9uZSBvbiBhIGxpbmUKKwkJCSAqIC10 ICAgID0gR2V0IHJlY2lwaWVudCBmcm9tIGhlYWRlcnMKIAkJCSAqLworI2RlZmluZSBNQUlMQVJH IF9QQVRIX1NFTkRNQUlMCQkJCS8qLSovCiAKLS8qICNkZWZpbmUgTUFJTENNRCAiL2Jpbi9tYWls IiAqLwkJLyotKi8KLS8qICNkZWZpbmUgTUFJTEFSR1MgIiVzIC1kICAlcyIgKi8JCS8qLSovCi0J CQkvKiAtZCA9IHVuZG9jdW1lbnRlZCBidXQgY29tbW9uIGZsYWc6IGRlbGl2ZXIgbG9jYWxseT8K Ky8qICNkZWZpbmUgTUFJTEZNVCAiJXMgLWQgJXMiCQkJCQorCQkJIC1kID0gdW5kb2N1bWVudGVk IGJ1dCBjb21tb24gZmxhZzogZGVsaXZlciBsb2NhbGx5PwogCQkJICovCisvKiAjZGVmaW5lIE1B SUxBUkcgIi9iaW4vbWFpbCIsbWFpbHRvICovCiAKLS8qICNkZWZpbmUgTUFJTENNRCAiL3Vzci9t bWRmL2Jpbi9zdWJtaXQiICovCS8qLSovCi0vKiAjZGVmaW5lIE1BSUxBUkdTICIlcyAtbWxyeHRv ICVzIiAqLwkJLyotKi8KKy8qICNkZWZpbmUgTUFJTEZNVCAiJXMgLW1scnh0byAlcyIJCQkqLwor LyogI2RlZmluZSBNQUlMQVJHICIvdXNyL21tZGYvYmluL3N1Ym1pdCIsbWFpbHRvCSovCiAKLS8q ICNkZWZpbmUgTUFJTF9EQVRFICovCQkJCS8qLSovCisvKiAjZGVmaW5lIE1BSUxfREFURQkJCQkq LwogCQkJLyogc2hvdWxkIHdlIGluY2x1ZGUgYW4gZXJzYXR6IERhdGU6IGhlYWRlciBpbgogCQkJ ICogZ2VuZXJhdGVkIG1haWw/ICBpZiB5b3UgYXJlIHVzaW5nIHNlbmRtYWlsCi0JCQkgKiBmb3Ig TUFJTENNRCwgaXQgaXMgYmV0dGVyIHRvIGxldCBzZW5kbWFpbAorCQkJICogYXMgdGhlIG1haWxl ciwgaXQgaXMgYmV0dGVyIHRvIGxldCBzZW5kbWFpbAogCQkJICogZ2VuZXJhdGUgdGhlIERhdGU6 IGhlYWRlci4KIAkJCSAqLwogCi0JCQkvKiBpZiBBTExPV19GSUxFIGFuZCBERU5ZX0ZJTEUgYXJl IG5vdCBkZWZpbmVkIG9yIGFyZQotCQkJICogZGVmaW5lZCBidXQgbmVpdGhlciBleGlzdHMsIHNo b3VsZCBjcm9udGFiKDEpIGJlCi0JCQkgKiB1c2FibGUgb25seSBieSByb290PwotCQkJICovCi0v KiAjZGVmaW5lIEFMTE9XX09OTFlfUk9PVCAqLwkJCS8qLSovCi0KIAkJCS8qIGlmIHlvdSB3YW50 IHRvIHVzZSBzeXNsb2coMykgaW5zdGVhZCBvZiBhcHBlbmRpbmcKIAkJCSAqIHRvIENST05ESVIv TE9HX0ZJTEUgKC92YXIvY3Jvbi9sb2csIGUuZy4pLCBkZWZpbmUKIAkJCSAqIFNZU0xPRyBoZXJl LiAgTm90ZSB0aGF0IHF1aXRlIGEgYml0IG9mIGxvZ2dpbmcKQEAgLTg1LDMgKzc5LDI3IEBACiAJ CQkgKiBwbGFjZXMuCiAJCQkgKi8KICNkZWZpbmUgU1lTTE9HCSAJCQkvKi0qLworCisJCQkvKiBp ZiB5b3Ugd2FudCBjcm9uIHRvIGNhcGl0YWxpemUgaXRzIG5hbWUgaW4gcHMKKwkJCSAqIHdoZW4g cnVubmluZyBhIGpvYi4gIERvZXMgbm90IHdvcmsgb24gU1lTVi4KKwkJCSAqLworLyojZGVmaW5l IENBUElUQUxJWkVfRk9SX1BTCQkqLworCisJCQkvKiBpZiB5b3UgaGF2ZSBhIHRtX2dtdG9mZiBt ZW1iZXIgaW4gc3RydWN0IHRtLgorCQkJICogSWYgbm90LCB3ZSB3aWxsIGhhdmUgdG8gY29tcHV0 ZSB0aGUgdmFsdWUgb3Vyc2VsdmVzLgorCQkJICovCisvKiNkZWZpbmUgSEFWRV9UTV9HTVRPRkYJ CSovCisKKwkJCS8qIGlmIHlvdXIgT1Mgc3VwcG9ydHMgYSBCU0Qtc3R5bGUgbG9naW4uY29uZiBm aWxlICovCisvKiNkZWZpbmUgTE9HSU5fQ0FQCQkJKi8KKworCQkJLyogaWYgeW91ciBPUyBzdXBw b3J0cyBCU0QgYXV0aGVudGljYXRpb24gKi8KKy8qI2RlZmluZSBCU0RfQVVUSAkJCSovCisKKwkJ CS8qIERlZmluZSB0aGlzIHRvIHJ1biBjcm9udGFiIHNldGdpZCBpbnN0ZWFkIG9mICAgCisJCQkg KiBzZXR1aWQgcm9vdC4gIEdyb3VwIGFjY2VzcyB3aWxsIGJlIHVzZWQgdG8gcmVhZAorCQkJICog dGhlIHRhYnMvYXRqb2JzIGRpcnMgYW5kIHRoZSBhbGxvdy9kZW55IGZpbGVzLgorCQkJICogSWYg dGhpcyBpcyBub3QgZGVmaW5lZCB0aGVuIGNyb250YWIgYW5kIGF0CisJCQkgKiBtdXN0IGJlIHNl dHVpZCByb290LgorCQkJICovCisvKiNkZWZpbmUgQ1JPTl9HUk9VUAkiY3JvbnRhYiIJKi8KZGlm ZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9jcm9uLjggZnJlZWJzZF9jcm9uL2Ny b24vY3Jvbi44Ci0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24vY3Jvbi44CTIwMTQtMDEt MTYgMjE6NDM6NDkuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vY3Jvbi9jcm9uLjgJ MjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzI0NDQyNzYgKzAyMDAKQEAgLTE1LDcgKzE1LDcgQEAKIC5c IiAqIFBhdWwgVml4aWUgICAgICAgICAgPHBhdWxAdml4LmNvbT4gICAgICAgICAgdXVuZXQhZGVj d3JsIXZpeGllIXBhdWwKIC5cIiAqLwogLlwiCi0uXCIgJEZyZWVCU0Q6IHJlbGVhc2UvMTAuMC4w L3Vzci5zYmluL2Nyb24vY3Jvbi9jcm9uLjggMTgwMDk2IDIwMDgtMDYtMjkgMTY6NTY6MThaIG1h cmNrICQKKy5cIiAkRnJlZUJTRDogcmVsZW5nLzEwLjAvdXNyLnNiaW4vY3Jvbi9jcm9uL2Nyb24u OCAxODAwOTYgMjAwOC0wNi0yOSAxNjo1NjoxOFogbWFyY2sgJAogLlwiCiAuRGQgSnVuZSAyOSwg MjAwOAogLkR0IENST04gOApkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2Ny b24uYyBmcmVlYnNkX2Nyb24vY3Jvbi9jcm9uLmMKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24v Y3Jvbi9jcm9uLmMJMjAxNC0wMS0xNiAyMTo0Mzo0OS4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVi c2RfY3Jvbi9jcm9uL2Nyb24uYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MjQ0NDI3NiArMDIwMApA QCAtMSwxNDIgKzEsMTM3IEBACiAvKiBDb3B5cmlnaHQgMTk4OCwxOTkwLDE5OTMsMTk5NCBieSBQ YXVsIFZpeGllCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKi8KKworLyoKKyAqIENvcHlyaWdo dCAoYykgMjAwNCBieSBJbnRlcm5ldCBTeXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQor ICogQ29weXJpZ2h0IChjKSAxOTk3LDIwMDAgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1 bSwgSW5jLgogICoKLSAqIERpc3RyaWJ1dGUgZnJlZWx5LCBleGNlcHQ6IGRvbid0IHJlbW92ZSBt eSBuYW1lIGZyb20gdGhlIHNvdXJjZSBvcgotICogZG9jdW1lbnRhdGlvbiAoZG9uJ3QgdGFrZSBj cmVkaXQgZm9yIG15IHdvcmspLCBtYXJrIHlvdXIgY2hhbmdlcyAoZG9uJ3QKLSAqIGdldCBtZSBi bGFtZWQgZm9yIHlvdXIgcG9zc2libGUgYnVncyksIGRvbid0IGFsdGVyIG9yIHJlbW92ZSB0aGlz Ci0gKiBub3RpY2UuICBNYXkgYmUgc29sZCBpZiBidWlsZGFibGUgc291cmNlIGlzIHByb3ZpZGVk IHRvIGJ1eWVyLiAgTm8KLSAqIHdhcnJhbnRlZSBvZiBhbnkga2luZCwgZXhwcmVzcyBvciBpbXBs aWVkLCBpcyBpbmNsdWRlZCB3aXRoIHRoaXMKLSAqIHNvZnR3YXJlOyB1c2UgYXQgeW91ciBvd24g cmlzaywgcmVzcG9uc2liaWxpdHkgZm9yIGRhbWFnZXMgKGlmIGFueSkgdG8KLSAqIGFueW9uZSBy ZXN1bHRpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUgcmVzdHMgZW50aXJlbHkgd2l0 aCB0aGUKLSAqIHVzZXIuCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQg ZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRo b3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNv cHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBj b3BpZXMuCiAgKgotICogU2VuZCBidWcgcmVwb3J0cywgYnVnIGZpeGVzLCBlbmhhbmNlbWVudHMs IHJlcXVlc3RzLCBmbGFtZXMsIGV0Yy4sIGFuZAotICogSSdsbCB0cnkgdG8ga2VlcCBhIHZlcnNp b24gdXAgdG8gZGF0ZS4gIEkgY2FuIGJlIHJlYWNoZWQgYXMgZm9sbG93czoKLSAqIFBhdWwgVml4 aWUgICAgICAgICAgPHBhdWxAdml4LmNvbT4gICAgICAgICAgdXVuZXQhZGVjd3JsIXZpeGllIXBh dWwKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJU0MgRElTQ0xBSU1T IEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElO RyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F U1MuICBJTiBOTyBFVkVOVCBTSEFMTCBJU0MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUws IERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdF UworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9G SVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Ig T1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVDVElP TiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCi0j aWYgIWRlZmluZWQobGludCkgJiYgIWRlZmluZWQoTElOVCkKLXN0YXRpYyBjb25zdCBjaGFyIHJj c2lkW10gPQotICAiJEZyZWVCU0Q6IHJlbGVhc2UvMTAuMC4wL3Vzci5zYmluL2Nyb24vY3Jvbi9j cm9uLmMgMjQyMTAxIDIwMTItMTAtMjUgMjI6NTQ6MjlaIHNvYm9tYXggJCI7Ci0jZW5kaWYKKy8v I2lmICFkZWZpbmVkKGxpbnQpICYmICFkZWZpbmVkKExJTlQpCisvL3N0YXRpYyBjaGFyIHJjc2lk W10gPSAiJElkOiBjcm9uLmMsdiAxLjEyIDIwMDQvMDEvMjMgMTg6NTY6NDIgdml4aWUgRXhwICQi OworLy8jZW5kaWYKIAogI2RlZmluZQlNQUlOX1BST0dSQU0KLQorI2luY2x1ZGUgPGxpYnV0aWwu aD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgogCiAjaW5jbHVkZSAiY3Jvbi5oIgotI2luY2x1ZGUg PHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgotI2lmIFNZU19USU1FX0gKLSMg aW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNlbHNlCi0jIGluY2x1ZGUgPHRpbWUuaD4KLSNlbmRpZgog CitlbnVtIHRpbWVqdW1wIHsgbmVnYXRpdmUsIHNtYWxsLCBtZWRpdW0sIGxhcmdlIH07CiAKIHN0 YXRpYwl2b2lkCXVzYWdlKHZvaWQpLAogCQlydW5fcmVib290X2pvYnMoY3Jvbl9kYiAqKSwKLQkJ Y3Jvbl90aWNrKGNyb25fZGIgKiwgaW50KSwKLQkJY3Jvbl9zeW5jKGludCksCi0JCWNyb25fc2xl ZXAoY3Jvbl9kYiAqLCBpbnQpLAotCQljcm9uX2NsZWFuKGNyb25fZGIgKiksCi0jaWZkZWYgVVNF X1NJR0NITEQKKwkJZmluZF9qb2JzKGludCwgY3Jvbl9kYiAqLCBpbnQsIGludCksCisJCXNldF90 aW1lKGludCksCisJCWNyb25fc2xlZXAoaW50KSwKIAkJc2lnY2hsZF9oYW5kbGVyKGludCksCi0j ZW5kaWYKIAkJc2lnaHVwX2hhbmRsZXIoaW50KSwKKwkJc2lnY2hsZF9yZWFwZXIodm9pZCksCisJ CXF1aXQoaW50KSwKIAkJcGFyc2VfYXJncyhpbnQgYywgY2hhciAqdltdKTsKIAotc3RhdGljIGlu dAlydW5fYXRfc2VjcmVzKGNyb25fZGIgKik7Ci0KLXN0YXRpYyB0aW1lX3QJbGFzdF90aW1lID0g MDsKLXN0YXRpYyBpbnQJZHN0X2VuYWJsZWQgPSAwOwotc3RydWN0IHBpZGZoICpwZmg7CitzdGF0 aWMJdm9sYXRpbGUgc2lnX2F0b21pY190CWdvdF9zaWdodXAsIGdvdF9zaWdjaGxkOworc3RhdGlj CWludAkJCXRpbWVSdW5uaW5nLCB2aXJ0dWFsVGltZSwgY2xvY2tUaW1lOworc3RhdGljICBpbnQJ CQljcm9uU29jazsKK3N0YXRpYwlsb25nCQkJR01Ub2ZmOworc3RhdGljICBjcm9uX2RiIAkJZGF0 YWJhc2U7CiAKK3N0cnVjdCBwaWRmaAkJCSpwZmg7CiBzdGF0aWMgdm9pZAotdXNhZ2UoKSB7Ci0j aWYgREVCVUdHSU5HCi0gICAgY2hhciAqKmRmbGFnczsKLSNlbmRpZgotCi0JZnByaW50ZihzdGRl cnIsICJ1c2FnZTogY3JvbiBbLWogaml0dGVyXSBbLUogcm9vdGppdHRlcl0gIgotCQkJIlstbSBt YWlsdG9dIFstc10gWy1vXSBbLXggZGVidWdmbGFnWywuLi5dXVxuIik7Ci0jaWYgREVCVUdHSU5H Ci0JZnByaW50ZihzdGRlcnIsICJcbmRlYnVnZmxhZ3M6ICIpOwordXNhZ2Uodm9pZCkgeworCWNv bnN0IGNoYXIgKipkZmxhZ3M7CiAKLSAgICAgICAgZm9yKGRmbGFncyA9IERlYnVnRmxhZ05hbWVz OyAqZGZsYWdzOyBkZmxhZ3MrKykgewotCQlmcHJpbnRmKHN0ZGVyciwgIiVzICIsICpkZmxhZ3Mp OwotCX0KLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotI2VuZGlmCisJZnByaW50Zihz dGRlcnIsICJ1c2FnZTogY3JvbiBbLWogaml0dGVyXSBbLUogcm9vdGppdHRlcl0gIik7CisJZnBy aW50ZihzdGRlcnIsICIlcyBbLW5dIFsteCBbIiwgUHJvZ3JhbU5hbWUpOworCWZvciAoZGZsYWdz ID0gRGVidWdGbGFnTmFtZXM7ICpkZmxhZ3M7IGRmbGFncysrKQorCQlmcHJpbnRmKHN0ZGVyciwg IiVzJXMiLCAqZGZsYWdzLCBkZmxhZ3NbMV0gPyAiLCIgOiAiXSIpOwogCisJZnByaW50ZihzdGRl cnIsICJdXG4iKTsKIAlleGl0KEVSUk9SX0VYSVQpOwogfQogCiBzdGF0aWMgdm9pZAogb3Blbl9w aWRmaWxlKHZvaWQpCiB7Ci0JY2hhcglwaWRmaWxlW01BWF9GTkFNRV07Ci0JY2hhcglidWZbTUFY X1RFTVBTVFJdOwotCWludAlvdGhlcnBpZDsKLQotCSh2b2lkKSBzbnByaW50ZihwaWRmaWxlLCBz aXplb2YocGlkZmlsZSksIFBJREZJTEUsIFBJRERJUik7Ci0JcGZoID0gcGlkZmlsZV9vcGVuKHBp ZGZpbGUsIDA2MDAsICZvdGhlcnBpZCk7Ci0JaWYgKHBmaCA9PSBOVUxMKSB7Ci0JCWlmIChlcnJu byA9PSBFRVhJU1QpIHsKLQkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0JCQkgICAgImNy b24gYWxyZWFkeSBydW5uaW5nLCBwaWQ6ICVkIiwgb3RoZXJwaWQpOwotCQl9IGVsc2UgewotCQkJ c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJCSAgICAiY2FuJ3Qgb3BlbiBvciBjcmVhdGUg JXM6ICVzIiwgcGlkZmlsZSwKLQkJCSAgICBzdHJlcnJvcihlcnJubykpOwotCQl9Ci0JCWxvZ19p dCgiQ1JPTiIsIGdldHBpZCgpLCAiREVBVEgiLCBidWYpOwotCQllcnJ4KEVSUk9SX0VYSVQsICIl cyIsIGJ1Zik7Ci0JfQorICAgICAgICBjaGFyICAgIHBpZGZpbGVbTUFYX0ZOQU1FXTsKKyAgICAg ICAgY2hhciAgICBidWZbTUFYX1RFTVBTVFJdOworICAgICAgICBpbnQgICAgIG90aGVycGlkOwor CisgICAgICAgICh2b2lkKSBzbnByaW50ZihwaWRmaWxlLCBzaXplb2YocGlkZmlsZSksIFBJREZJ TEUsIFBJRERJUik7CisgICAgICAgIHBmaCA9IHBpZGZpbGVfb3BlbihwaWRmaWxlLCAwNjAwLCAm b3RoZXJwaWQpOworICAgICAgICBpZiAocGZoID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBp ZiAoZXJybm8gPT0gRUVYSVNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50Zihi dWYsIHNpemVvZihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9uIGFscmVh ZHkgcnVubmluZywgcGlkOiAlZCIsIG90aGVycGlkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2Ug eworICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3Qgb3BlbiBvciBjcmVhdGUgJXM6ICVzIiwg cGlkZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwor ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2dfaXQoIkNST04iLCBnZXRwaWQo KSwgIkRFQVRIIiwgYnVmKTsKKyAgICAgICAgICAgICAgICBlcnJ4KEVSUk9SX0VYSVQsICIlcyIs IGJ1Zik7CisgICAgICAgIH0KIH0KIAogaW50Ci1tYWluKGFyZ2MsIGFyZ3YpCi0JaW50CWFyZ2M7 Ci0JY2hhcgkqYXJndltdOwotewotCWNyb25fZGIJZGF0YWJhc2U7Ci0JaW50IHJ1bm51bTsKLQlp bnQgc2VjcmVzMSwgc2VjcmVzMjsKLQlzdHJ1Y3QgdG0gKnRtOworbWFpbihpbnQgYXJnYywgY2hh ciAqYXJndltdKSB7CisJc3RydWN0IHNpZ2FjdGlvbiBzYWN0OwogCiAJUHJvZ3JhbU5hbWUgPSBh cmd2WzBdOwogCisJc2V0bG9jYWxlKExDX0FMTCwgIiIpOworCiAjaWYgZGVmaW5lZChCU0QpCiAJ c2V0bGluZWJ1ZihzdGRvdXQpOwogCXNldGxpbmVidWYoc3RkZXJyKTsKICNlbmRpZgogCisJTm9G b3JrID0gMDsKIAlwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpOwogCi0jaWZkZWYgVVNFX1NJR0NITEQK LQkodm9pZCkgc2lnbmFsKFNJR0NITEQsIHNpZ2NobGRfaGFuZGxlcik7Ci0jZWxzZQotCSh2b2lk KSBzaWduYWwoU0lHQ0xELCBTSUdfSUdOKTsKKwliemVybygoY2hhciAqKSZzYWN0LCBzaXplb2Yg c2FjdCk7CisJc2lnZW1wdHlzZXQoJnNhY3Quc2FfbWFzayk7CisJc2FjdC5zYV9mbGFncyA9IDA7 CisjaWZkZWYgU0FfUkVTVEFSVAorCXNhY3Quc2FfZmxhZ3MgfD0gU0FfUkVTVEFSVDsKICNlbmRp ZgotCSh2b2lkKSBzaWduYWwoU0lHSFVQLCBzaWdodXBfaGFuZGxlcik7CisJc2FjdC5zYV9oYW5k bGVyID0gc2lnY2hsZF9oYW5kbGVyOworCSh2b2lkKSBzaWdhY3Rpb24oU0lHQ0hMRCwgJnNhY3Qs IE5VTEwpOworCXNhY3Quc2FfaGFuZGxlciA9IHNpZ2h1cF9oYW5kbGVyOworCSh2b2lkKSBzaWdh Y3Rpb24oU0lHSFVQLCAmc2FjdCwgTlVMTCk7CisJc2FjdC5zYV9oYW5kbGVyID0gcXVpdDsKKwko dm9pZCkgc2lnYWN0aW9uKFNJR0lOVCwgJnNhY3QsIE5VTEwpOworCSh2b2lkKSBzaWdhY3Rpb24o U0lHVEVSTSwgJnNhY3QsIE5VTEwpOwogCiAJb3Blbl9waWRmaWxlKCk7CisJY3JvblNvY2sgPSBv cGVuX3NvY2tldCgpOwogCXNldF9jcm9uX3VpZCgpOwogCXNldF9jcm9uX2N3ZCgpOwogCi0jaWYg ZGVmaW5lZChQT1NJWCkKLQlzZXRlbnYoIlBBVEgiLCBfUEFUSF9ERUZQQVRILCAxKTsKLSNlbmRp ZgorCWlmIChwdXRlbnYoIlBBVEg9Il9QQVRIX0RFRlBBVEgpIDwgMCkgeworCQlsb2dfaXQoIkNS T04iLCBnZXRwaWQoKSwgIkRFQVRIIiwgImNhbid0IG1hbGxvYyIpOworCQlleGl0KDEpOworCX0K IAogCS8qIGlmIHRoZXJlIGFyZSBubyBkZWJ1ZyBmbGFncyB0dXJuZWQgb24sIGZvcmsgYXMgYSBk YWVtb24gc2hvdWxkLgogCSAqLwotIyBpZiBERUJVR0dJTkcKIAlpZiAoRGVidWdGbGFncykgewot IyBlbHNlCi0JaWYgKDApIHsKLSMgZW5kaWYKLQkJKHZvaWQpIGZwcmludGYoc3RkZXJyLCAiWyVk XSBjcm9uIHN0YXJ0ZWRcbiIsIGdldHBpZCgpKTsKLQl9IGVsc2UgeworI2lmIERFQlVHR0lORwor CQkodm9pZCkgZnByaW50ZihzdGRlcnIsICJbJWxkXSBjcm9uIHN0YXJ0ZWRcbiIsIChsb25nKWdl dHBpZCgpKTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoTm9Gb3JrID09IDApIHsKIAkJaWYgKGRhZW1v bigxLCAwKSA9PSAtMSkgewogCQkJcGlkZmlsZV9yZW1vdmUocGZoKTsKIAkJCWxvZ19pdCgiQ1JP TiIsZ2V0cGlkKCksIkRFQVRIIiwiY2FuJ3QgYmVjb21lIGRhZW1vbiIpOwpAQCAtMTQ1LDE2MCAr MTQwLDE4MCBAQAogCX0KIAogCWlmIChtYWR2aXNlKE5VTEwsIDAsIE1BRFZfUFJPVEVDVCkgIT0g MCkKLQkJbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJXQVJOSU5HIiwgIm1hZHZpc2UoKSBmYWls ZWQiKTsKKwkJbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJXQVJOSU5HIiwgIm1hZHZpc2UoKSBm aWxlZCIpOwogCiAJcGlkZmlsZV93cml0ZShwZmgpOwogCWRhdGFiYXNlLmhlYWQgPSBOVUxMOwog CWRhdGFiYXNlLnRhaWwgPSBOVUxMOwogCWRhdGFiYXNlLm10aW1lID0gKHRpbWVfdCkgMDsKIAls b2FkX2RhdGFiYXNlKCZkYXRhYmFzZSk7Ci0Jc2VjcmVzMSA9IHNlY3JlczIgPSBydW5fYXRfc2Vj cmVzKCZkYXRhYmFzZSk7CisJc2V0X3RpbWUoVFJVRSk7CiAJcnVuX3JlYm9vdF9qb2JzKCZkYXRh YmFzZSk7Ci0JY3Jvbl9zeW5jKHNlY3JlczEpOwotCXJ1bm51bSA9IDA7CisJdGltZVJ1bm5pbmcg PSB2aXJ0dWFsVGltZSA9IGNsb2NrVGltZTsKKworCS8qCisJICogVG9vIG1hbnkgY2xvY2tzLCBu b3QgZW5vdWdoIHRpbWUgKEFsLiBFaW5zdGVpbikKKwkgKiBUaGVzZSBjbG9ja3MgYXJlIGluIG1p bnV0ZXMgc2luY2UgdGhlIGVwb2NoLCBhZGp1c3RlZCBmb3IgdGltZXpvbmUuCisJICogdmlydHVh bFRpbWU6IGlzIHRoZSB0aW1lIGl0ICp3b3VsZCogYmUgaWYgd2Ugd29rZSB1cAorCSAqIHByb21w dGx5IGFuZCBub2JvZHkgZXZlciBjaGFuZ2VkIHRoZSBjbG9jay4gSXQgaXMKKwkgKiBtb25vdG9u aWNhbGx5IGluY3JlYXNpbmcuLi4gdW5sZXNzIGEgdGltZWp1bXAgaGFwcGVucy4KKwkgKiBBdCB0 aGUgdG9wIG9mIHRoZSBsb29wLCBhbGwgam9icyBmb3IgJ3ZpcnR1YWxUaW1lJyBoYXZlIHJ1bi4K KwkgKiB0aW1lUnVubmluZzogaXMgdGhlIHRpbWUgd2UgbGFzdCBhd2FrZW5lZC4KKwkgKiBjbG9j a1RpbWU6IGlzIHRoZSB0aW1lIHdoZW4gc2V0X3RpbWUgd2FzIGxhc3QgY2FsbGVkLgorCSAqLwog CXdoaWxlIChUUlVFKSB7Ci0jIGlmIERFQlVHR0lORwotCSAgICAvKiBpZiAoIShEZWJ1Z0ZsYWdz ICYgRFRFU1QpKSAqLwotIyBlbmRpZiAvKkRFQlVHR0lORyovCi0JCQljcm9uX3NsZWVwKCZkYXRh YmFzZSwgc2VjcmVzMSk7Ci0KLQkJaWYgKHNlY3JlczEgPT0gMCB8fCBydW5udW0gJSA2MCA9PSAw KSB7Ci0JCQlsb2FkX2RhdGFiYXNlKCZkYXRhYmFzZSk7Ci0JCQlzZWNyZXMyID0gcnVuX2F0X3Nl Y3JlcygmZGF0YWJhc2UpOwotCQkJaWYgKHNlY3JlczIgIT0gc2VjcmVzMSkgewotCQkJCXNlY3Jl czEgPSBzZWNyZXMyOwotCQkJCWlmIChzZWNyZXMxICE9IDApIHsKLQkJCQkJcnVubnVtID0gMDsK LQkJCQl9IGVsc2UgewotCQkJCQkvKgotCQkJCQkgKiBHb2luZyBmcm9tIDEgc2VjIHRvIDYwIHNl YyByZXMuIElmIHdlCi0JCQkJCSAqIGFyZSBhbHJlYWR5IGF0IG1pbnV0ZSdzIGJvdW5kYXJ5LCBz bwotCQkJCQkgKiBsZXQgaXQgcnVuLCBvdGhlcndpc2Ugc2NoZWR1bGUgZm9yIHRoZQotCQkJCQkg KiBuZXh0IG1pbnV0ZS4KLQkJCQkJICovCi0JCQkJCXRtID0gbG9jYWx0aW1lKCZUYXJnZXRUaW1l KTsKLQkJCQkJaWYgKHRtLT50bV9zZWMgPiAwKSAgewotCQkJCQkJY3Jvbl9zeW5jKHNlY3JlczIp OwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9CisJCWludCB0aW1lRGlmZjsKKwkJZW51 bSB0aW1lanVtcCB3YWtldXBLaW5kOworCisJCS8qIC4uLiB3YWl0IGZvciB0aGUgdGltZSAoaW4g bWludXRlcykgdG8gY2hhbmdlIC4uLiAqLworCQlkbyB7CisJCQljcm9uX3NsZWVwKHRpbWVSdW5u aW5nICsgMSk7CisJCQlzZXRfdGltZShGQUxTRSk7CisJCX0gd2hpbGUgKGNsb2NrVGltZSA9PSB0 aW1lUnVubmluZyk7CisJCXRpbWVSdW5uaW5nID0gY2xvY2tUaW1lOworCisJCS8qCisJCSAqIENh bGN1bGF0ZSBob3cgdGhlIGN1cnJlbnQgdGltZSBkaWZmZXJzIGZyb20gb3VyIHZpcnR1YWwKKwkJ ICogY2xvY2suICBDbGFzc2lmeSB0aGUgY2hhbmdlIGludG8gb25lIG9mIDQgY2FzZXMuCisJCSAq LworCQl0aW1lRGlmZiA9IHRpbWVSdW5uaW5nIC0gdmlydHVhbFRpbWU7CisKKwkJLyogc2hvcnRj dXQgZm9yIHRoZSBtb3N0IGNvbW1vbiBjYXNlICovCisJCWlmICh0aW1lRGlmZiA9PSAxKSB7CisJ CQl2aXJ0dWFsVGltZSA9IHRpbWVSdW5uaW5nOworCQkJZmluZF9qb2JzKHZpcnR1YWxUaW1lLCAm ZGF0YWJhc2UsIFRSVUUsIFRSVUUpOworCQl9IGVsc2UgeworCQkJaWYgKHRpbWVEaWZmID4gKDMq TUlOVVRFX0NPVU5UKSB8fAorCQkJICAgIHRpbWVEaWZmIDwgLSgzKk1JTlVURV9DT1VOVCkpCisJ CQkJd2FrZXVwS2luZCA9IGxhcmdlOworCQkJZWxzZSBpZiAodGltZURpZmYgPiA1KQorCQkJCXdh a2V1cEtpbmQgPSBtZWRpdW07CisJCQllbHNlIGlmICh0aW1lRGlmZiA+IDApCisJCQkJd2FrZXVw S2luZCA9IHNtYWxsOworCQkJZWxzZQorCQkJCXdha2V1cEtpbmQgPSBuZWdhdGl2ZTsKKworCQkJ c3dpdGNoICh3YWtldXBLaW5kKSB7CisJCQljYXNlIHNtYWxsOgorCQkJCS8qCisJCQkJICogY2Fz ZSAxOiB0aW1lRGlmZiBpcyBhIHNtYWxsIHBvc2l0aXZlIG51bWJlcgorCQkJCSAqICh3b2tldXAg bGF0ZSkgcnVuIGpvYnMgZm9yIGVhY2ggdmlydHVhbAorCQkJCSAqIG1pbnV0ZSB1bnRpbCBjYXVn aHQgdXAuCisJCQkJICovCisJCQkJRGVidWcoRFNDSCwgKCJbJWxkXSwgbm9ybWFsIGNhc2UgJWQg bWludXRlcyB0byBnb1xuIiwKKwkJCQkgICAgKGxvbmcpZ2V0cGlkKCksIHRpbWVEaWZmKSkKKwkJ CQlkbyB7CisJCQkJCWlmIChqb2JfcnVucXVldWUoKSkKKwkJCQkJCXNsZWVwKDEwKTsKKwkJCQkJ dmlydHVhbFRpbWUrKzsKKwkJCQkJZmluZF9qb2JzKHZpcnR1YWxUaW1lLCAmZGF0YWJhc2UsCisJ CQkJCSAgICBUUlVFLCBUUlVFKTsKKwkJCQl9IHdoaWxlICh2aXJ0dWFsVGltZSA8IHRpbWVSdW5u aW5nKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBtZWRpdW06CisJCQkJLyoKKwkJCQkgKiBjYXNl IDI6IHRpbWVEaWZmIGlzIGEgbWVkaXVtLXNpemVkIHBvc2l0aXZlCisJCQkJICogbnVtYmVyLCBm b3IgZXhhbXBsZSBiZWNhdXNlIHdlIHdlbnQgdG8gRFNUCisJCQkJICogcnVuIHdpbGRjYXJkIGpv YnMgb25jZSwgdGhlbiBydW4gYW55CisJCQkJICogZml4ZWQtdGltZSBqb2JzIHRoYXQgd291bGQg b3RoZXJ3aXNlIGJlCisJCQkJICogc2tpcHBlZCBpZiB3ZSB1c2UgdXAgb3VyIG1pbnV0ZSAocG9z c2libGUsCisJCQkJICogaWYgdGhlcmUgYXJlIGEgbG90IG9mIGpvYnMgdG8gcnVuKSBnbworCQkJ CSAqIGFyb3VuZCB0aGUgbG9vcCBhZ2FpbiBzbyB0aGF0IHdpbGRjYXJkIGpvYnMKKwkJCQkgKiBo YXZlIGEgY2hhbmNlIHRvIHJ1biwgYW5kIHdlIGRvIG91cgorCQkJCSAqIGhvdXNla2VlcGluZy4K KwkJCQkgKi8KKwkJCQlEZWJ1ZyhEU0NILCAoIlslbGRdLCBEU1QgYmVnaW5zICVkIG1pbnV0ZXMg dG8gZ29cbiIsCisJCQkJICAgIChsb25nKWdldHBpZCgpLCB0aW1lRGlmZikpCisJCQkJLyogcnVu IHdpbGRjYXJkIGpvYnMgZm9yIGN1cnJlbnQgbWludXRlICovCisJCQkJZmluZF9qb2JzKHRpbWVS dW5uaW5nLCAmZGF0YWJhc2UsIFRSVUUsIEZBTFNFKTsKKwkKKwkJCQkvKiBydW4gZml4ZWQtdGlt ZSBqb2JzIGZvciBlYWNoIG1pbnV0ZSBtaXNzZWQgKi8KKwkJCQlkbyB7CisJCQkJCWlmIChqb2Jf cnVucXVldWUoKSkKKwkJCQkJCXNsZWVwKDEwKTsKKwkJCQkJdmlydHVhbFRpbWUrKzsKKwkJCQkJ ZmluZF9qb2JzKHZpcnR1YWxUaW1lLCAmZGF0YWJhc2UsCisJCQkJCSAgICBGQUxTRSwgVFJVRSk7 CisJCQkJCXNldF90aW1lKEZBTFNFKTsKKwkJCQl9IHdoaWxlICh2aXJ0dWFsVGltZTwgdGltZVJ1 bm5pbmcgJiYKKwkJCQkgICAgY2xvY2tUaW1lID09IHRpbWVSdW5uaW5nKTsKKwkJCQlicmVhazsK KwkKKwkJCWNhc2UgbmVnYXRpdmU6CisJCQkJLyoKKwkJCQkgKiBjYXNlIDM6IHRpbWVEaWZmIGlz IGEgc21hbGwgb3IgbWVkaXVtLXNpemVkCisJCQkJICogbmVnYXRpdmUgbnVtLCBlZy4gYmVjYXVz ZSBvZiBEU1QgZW5kaW5nLgorCQkJCSAqIEp1c3QgcnVuIHRoZSB3aWxkY2FyZCBqb2JzLiBUaGUg Zml4ZWQtdGltZQorCQkJCSAqIGpvYnMgcHJvYmFibHkgaGF2ZSBhbHJlYWR5IHJ1biwgYW5kIHNo b3VsZAorCQkJCSAqIG5vdCBiZSByZXBlYXRlZC4gIFZpcnR1YWwgdGltZSBkb2VzIG5vdAorCQkJ CSAqIGNoYW5nZSB1bnRpbCB3ZSBhcmUgY2F1Z2h0IHVwLgorCQkJCSAqLworCQkJCURlYnVnKERT Q0gsICgiWyVsZF0sIERTVCBlbmRzICVkIG1pbnV0ZXMgdG8gZ29cbiIsCisJCQkJICAgIChsb25n KWdldHBpZCgpLCB0aW1lRGlmZikpCisJCQkJZmluZF9qb2JzKHRpbWVSdW5uaW5nLCAmZGF0YWJh c2UsIFRSVUUsIEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyoKKwkJCQkg KiBvdGhlcjogdGltZSBoYXMgY2hhbmdlZCBhICpsb3QqLAorCQkJCSAqIGp1bXAgdmlydHVhbCB0 aW1lLCBhbmQgcnVuIGV2ZXJ5dGhpbmcKKwkJCQkgKi8KKwkJCQlEZWJ1ZyhEU0NILCAoIlslbGRd LCBjbG9jayBqdW1wZWRcbiIsCisJCQkJICAgIChsb25nKWdldHBpZCgpKSkKKwkJCQl2aXJ0dWFs VGltZSA9IHRpbWVSdW5uaW5nOworCQkJCWZpbmRfam9icyh0aW1lUnVubmluZywgJmRhdGFiYXNl LCBUUlVFLCBUUlVFKTsKIAkJCX0KIAkJfQogCi0JCS8qIGRvIHRoaXMgaXRlcmF0aW9uCi0JCSAq LwotCQljcm9uX3RpY2soJmRhdGFiYXNlLCBzZWNyZXMxKTsKKwkJLyogSm9icyB0byBiZSBydW4g KGlmIGFueSkgYXJlIGxvYWRlZDsgY2xlYXIgdGhlIHF1ZXVlLiAqLworCQlqb2JfcnVucXVldWUo KTsKIAotCQkvKiBzbGVlcCAxIG9yIDYwIHNlY29uZHMKLQkJICovCi0JCVRhcmdldFRpbWUgKz0g KHNlY3JlczEgIT0gMCkgPyAxIDogNjA7Ci0JCXJ1bm51bSArPSAxOworCQkvKiBDaGVjayB0byBz ZWUgaWYgd2UgcmVjZWl2ZWQgYSBzaWduYWwgd2hpbGUgcnVubmluZyBqb2JzLiAqLworCQlpZiAo Z290X3NpZ2h1cCkgeworCQkJZ290X3NpZ2h1cCA9IDA7CisJCQlsb2dfY2xvc2UoKTsKKwkJfQor CQlpZiAoZ290X3NpZ2NobGQpIHsKKwkJCWdvdF9zaWdjaGxkID0gMDsKKwkJCXNpZ2NobGRfcmVh cGVyKCk7CisJCX0KKwkJbG9hZF9kYXRhYmFzZSgmZGF0YWJhc2UpOwogCX0KIH0KIAotCiBzdGF0 aWMgdm9pZAotcnVuX3JlYm9vdF9qb2JzKGRiKQotCWNyb25fZGIgKmRiOwotewotCXJlZ2lzdGVy IHVzZXIJCSp1OwotCXJlZ2lzdGVyIGVudHJ5CQkqZTsKK3J1bl9yZWJvb3Rfam9icyhjcm9uX2Ri ICpkYikgeworCXVzZXIgKnU7CisJZW50cnkgKmU7CiAKLQlmb3IgKHUgPSBkYi0+aGVhZDsgIHUg IT0gTlVMTDsgIHUgPSB1LT5uZXh0KSB7Ci0JCWZvciAoZSA9IHUtPmNyb250YWI7ICBlICE9IE5V TEw7ICBlID0gZS0+bmV4dCkgewotCQkJaWYgKGUtPmZsYWdzICYgV0hFTl9SRUJPT1QpIHsKKwlm b3IgKHUgPSBkYi0+aGVhZDsgdSAhPSBOVUxMOyB1ID0gdS0+bmV4dCkgeworCQlmb3IgKGUgPSB1 LT5jcm9udGFiOyBlICE9IE5VTEw7IGUgPSBlLT5uZXh0KSB7CisJCQlpZiAoZS0+ZmxhZ3MgJiBX SEVOX1JFQk9PVCkKIAkJCQlqb2JfYWRkKGUsIHUpOwotCQkJfQogCQl9CiAJfQogCSh2b2lkKSBq b2JfcnVucXVldWUoKTsKIH0KIAotCiBzdGF0aWMgdm9pZAotY3Jvbl90aWNrKGNyb25fZGIgKmRi LCBpbnQgc2VjcmVzKQotewotCXN0YXRpYyBzdHJ1Y3QgdG0JbGFzdHRtOwotCXN0YXRpYyB0aW1l X3QJZGlmZiA9IDAsIC8qIHRpbWUgZGlmZmVyZW5jZSBpbiBzZWNvbmRzIGZyb20gdGhlIGxhc3Qg b2Zmc2V0IGNoYW5nZSAqLwotCQlkaWZmbGltaXQgPSAwOyAvKiBlbmQgcG9pbnQgZm9yIHRoZSB0 aW1lIHpvbmUgY29ycmVjdGlvbiAqLwotCXN0cnVjdCB0bQlvdHp0bTsgLyogdGltZSBpbiB0aGUg b2xkIHRpbWUgem9uZSAqLwotCWludAkJb3R6c2Vjb25kLCBvdHptaW51dGUsIG90emhvdXIsIG90 emRvbSwgb3R6bW9udGgsIG90emRvdzsKLSAJcmVnaXN0ZXIgc3RydWN0IHRtCSp0bSA9IGxvY2Fs dGltZSgmVGFyZ2V0VGltZSk7Ci0JcmVnaXN0ZXIgaW50CQlzZWNvbmQsIG1pbnV0ZSwgaG91ciwg ZG9tLCBtb250aCwgZG93OwotCXJlZ2lzdGVyIHVzZXIJCSp1OwotCXJlZ2lzdGVyIGVudHJ5CQkq ZTsKK2ZpbmRfam9icyhpbnQgdnRpbWUsIGNyb25fZGIgKmRiLCBpbnQgZG9XaWxkLCBpbnQgZG9O b25XaWxkKSB7CisJdGltZV90IHZpcnR1YWxTZWNvbmQgID0gdnRpbWUgKiBTRUNPTkRTX1BFUl9N SU5VVEU7CisJc3RydWN0IHRtICp0bSA9IGdtdGltZSgmdmlydHVhbFNlY29uZCk7CisJaW50IG1p bnV0ZSwgaG91ciwgZG9tLCBtb250aCwgZG93OworCXVzZXIgKnU7CisJZW50cnkgKmU7CiAKIAkv KiBtYWtlIDAtYmFzZWQgdmFsdWVzIG91dCBvZiB0aGVzZSBzbyB3ZSBjYW4gdXNlIHRoZW0gYXMg aW5kaWNpZXMKIAkgKi8KLQlzZWNvbmQgPSAoc2VjcmVzID09IDApID8gMCA6IHRtLT50bV9zZWMg LUZJUlNUX1NFQ09ORDsKIAltaW51dGUgPSB0bS0+dG1fbWluIC1GSVJTVF9NSU5VVEU7CiAJaG91 ciA9IHRtLT50bV9ob3VyIC1GSVJTVF9IT1VSOwogCWRvbSA9IHRtLT50bV9tZGF5IC1GSVJTVF9E T007CiAJbW9udGggPSB0bS0+dG1fbW9uICsxIC8qIDAuLjExIC0+IDEuLjEyICovIC1GSVJTVF9N T05USDsKIAlkb3cgPSB0bS0+dG1fd2RheSAtRklSU1RfRE9XOwogCi0JRGVidWcoRFNDSCwgKCJb JWRdIHRpY2soJWQsJWQsJWQsJWQsJWQsJWQpXG4iLAotCQlnZXRwaWQoKSwgc2Vjb25kLCBtaW51 dGUsIGhvdXIsIGRvbSwgbW9udGgsIGRvdykpCi0KLQlpZiAoZHN0X2VuYWJsZWQgJiYgbGFzdF90 aW1lICE9IDAgCi0JJiYgVGFyZ2V0VGltZSA+IGxhc3RfdGltZSAvKiBleGNsdWRlIHN0ZXBwaW5n IGJhY2sgKi8KLQkmJiB0bS0+dG1fZ210b2ZmICE9IGxhc3R0bS50bV9nbXRvZmYgKSB7Ci0KLQkJ ZGlmZiA9IHRtLT50bV9nbXRvZmYgLSBsYXN0dG0udG1fZ210b2ZmOwotCi0JCWlmICggZGlmZiA+ IDAgKSB7IC8qIFNULT5EU1QgKi8KLQkJCS8qIG1hcmsgam9icyBmb3IgYW4gZWFybGllciBydW4g Ki8KLQkJCWRpZmZsaW1pdCA9IFRhcmdldFRpbWUgKyBkaWZmOwotCQkJZm9yICh1ID0gZGItPmhl YWQ7ICB1ICE9IE5VTEw7ICB1ID0gdS0+bmV4dCkgewotCQkJCWZvciAoZSA9IHUtPmNyb250YWI7 ICBlICE9IE5VTEw7ICBlID0gZS0+bmV4dCkgewotCQkJCQllLT5mbGFncyAmPSB+Tk9UX1VOVElM OwotCQkJCQlpZiAoIGUtPmxhc3RydW4gPj0gVGFyZ2V0VGltZSApCi0JCQkJCQllLT5sYXN0cnVu ID0gMDsKLQkJCQkJLyogbm90IGluY2x1ZGUgdGhlIGVuZHMgb2YgaG91cmx5IHJhbmdlcyAqLwot CQkJCQlpZiAoIGUtPmxhc3RydW4gPCBUYXJnZXRUaW1lIC0gMzYwMCApCi0JCQkJCQllLT5mbGFn cyB8PSBSVU5fQVQ7Ci0JCQkJCWVsc2UKLQkJCQkJCWUtPmZsYWdzICY9IH5SVU5fQVQ7Ci0JCQkJ fQotCQkJfQotCQl9IGVsc2UgeyAvKiBkaWZmIDwgMCA6IERTVC0+U1QgKi8KLQkJCS8qIG1hcmsg am9icyBmb3Igc2tpcHBpbmcgKi8KLQkJCWRpZmZsaW1pdCA9IFRhcmdldFRpbWUgLSBkaWZmOwot CQkJZm9yICh1ID0gZGItPmhlYWQ7ICB1ICE9IE5VTEw7ICB1ID0gdS0+bmV4dCkgewotCQkJCWZv ciAoZSA9IHUtPmNyb250YWI7ICBlICE9IE5VTEw7ICBlID0gZS0+bmV4dCkgewotCQkJCQllLT5m bGFncyB8PSBOT1RfVU5USUw7Ci0JCQkJCWUtPmZsYWdzICY9IH5SVU5fQVQ7Ci0JCQkJfQotCQkJ fQotCQl9Ci0JfQotCi0JaWYgKGRpZmYgIT0gMCkgewotCQkvKiBpZiB0aGUgdGltZSB3YXMgcmVz ZXQgb2YgdGhlIGVuZCBvZiBzcGVjaWFsIHpvbmUgaXMgcmVhY2hlZCAqLwotCQlpZiAobGFzdF90 aW1lID09IDAgfHwgVGFyZ2V0VGltZSA+PSBkaWZmbGltaXQpIHsKLQkJCS8qIGRpc2FibGUgdGhl IFRaIHN3aXRjaCBjaGVja3MgKi8KLQkJCWRpZmYgPSAwOwotCQkJZGlmZmxpbWl0ID0gMDsKLQkJ CWZvciAodSA9IGRiLT5oZWFkOyAgdSAhPSBOVUxMOyAgdSA9IHUtPm5leHQpIHsKLQkJCQlmb3Ig KGUgPSB1LT5jcm9udGFiOyAgZSAhPSBOVUxMOyAgZSA9IGUtPm5leHQpIHsKLQkJCQkJZS0+Zmxh Z3MgJj0gfihSVU5fQVR8Tk9UX1VOVElMKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkv KiBnZXQgdGhlIHRpbWUgaW4gdGhlIG9sZCB0aW1lIHpvbmUgKi8KLQkJCXRpbWVfdCBkaWZmdGlt ZSA9IFRhcmdldFRpbWUgKyB0bS0+dG1fZ210b2ZmIC0gZGlmZjsKLQkJCWdtdGltZV9yKCZkaWZm dGltZSwgJm90enRtKTsKLQotCQkJLyogbWFrZSAwLWJhc2VkIHZhbHVlcyBvdXQgb2YgdGhlc2Ug c28gd2UgY2FuIHVzZSB0aGVtIGFzIGluZGljaWVzCi0JCQkgKi8KLQkJCW90enNlY29uZCA9IChz ZWNyZXMgPT0gMCkgPyAwIDogb3R6dG0udG1fc2VjIC1GSVJTVF9TRUNPTkQ7Ci0JCQlvdHptaW51 dGUgPSBvdHp0bS50bV9taW4gLUZJUlNUX01JTlVURTsKLQkJCW90emhvdXIgPSBvdHp0bS50bV9o b3VyIC1GSVJTVF9IT1VSOwotCQkJb3R6ZG9tID0gb3R6dG0udG1fbWRheSAtRklSU1RfRE9NOwot CQkJb3R6bW9udGggPSBvdHp0bS50bV9tb24gKzEgLyogMC4uMTEgLT4gMS4uMTIgKi8gLUZJUlNU X01PTlRIOwotCQkJb3R6ZG93ID0gb3R6dG0udG1fd2RheSAtRklSU1RfRE9XOwotCQl9Ci0JfQor CURlYnVnKERTQ0gsICgiWyVsZF0gdGljayglZCwlZCwlZCwlZCwlZCkgJXMgJXNcbiIsCisJCSAg ICAgKGxvbmcpZ2V0cGlkKCksIG1pbnV0ZSwgaG91ciwgZG9tLCBtb250aCwgZG93LAorCQkgICAg IGRvV2lsZD8iICI6Ik5vIHdpbGRjYXJkIixkb05vbldpbGQ/IiAiOiJXaWxkY2FyZCBvbmx5Iikp CiAKIAkvKiB0aGUgZG9tL2RvdyBzaXR1YXRpb24gaXMgb2RkLiAgJyogKiAxLDE1ICogU3VuJyB3 aWxsIHJ1biBvbiB0aGUKIAkgKiBmaXJzdCBhbmQgZmlmdGVlbnRoIEFORCBldmVyeSBTdW5kYXk7 ICAnKiAqICogKiBTdW4nIHdpbGwgcnVuICpvbmx5KgpAQCAtMzA2LDI2OSArMzIxLDE5NSBAQAog CSAqIGlzIHdoeSB3ZSBrZWVwICdlLT5kb3dfc3RhcicgYW5kICdlLT5kb21fc3RhcicuICB5ZXMs IGl0J3MgYml6YXJyZS4KIAkgKiBsaWtlIG1hbnkgYml6YXJyZSB0aGluZ3MsIGl0J3MgdGhlIHN0 YW5kYXJkLgogCSAqLwotCWZvciAodSA9IGRiLT5oZWFkOyAgdSAhPSBOVUxMOyAgdSA9IHUtPm5l eHQpIHsKLQkJZm9yIChlID0gdS0+Y3JvbnRhYjsgIGUgIT0gTlVMTDsgIGUgPSBlLT5uZXh0KSB7 CisJZm9yICh1ID0gZGItPmhlYWQ7IHUgIT0gTlVMTDsgdSA9IHUtPm5leHQpIHsKKwkJZm9yIChl ID0gdS0+Y3JvbnRhYjsgZSAhPSBOVUxMOyBlID0gZS0+bmV4dCkgewogCQkJRGVidWcoRFNDSHxE RVhULCAoInVzZXIgWyVzOiVkOiVkOi4uLl0gY21kPVwiJXNcIlxuIiwKLQkJCQkJICBlbnZfZ2V0 KCJMT0dOQU1FIiwgZS0+ZW52cCksCi0JCQkJCSAgZS0+dWlkLCBlLT5naWQsIGUtPmNtZCkpCi0K LQkJCWlmICggZGlmZiAhPSAwICYmIChlLT5mbGFncyAmIChSVU5fQVR8Tk9UX1VOVElMKSkgKSB7 Ci0JCQkJaWYgKGJpdF90ZXN0KGUtPnNlY29uZCwgb3R6c2Vjb25kKQotCQkJCSAmJiBiaXRfdGVz dChlLT5taW51dGUsIG90em1pbnV0ZSkKLQkJCQkgJiYgYml0X3Rlc3QoZS0+aG91ciwgb3R6aG91 cikKLQkJCQkgJiYgYml0X3Rlc3QoZS0+bW9udGgsIG90em1vbnRoKQotCQkJCSAmJiAoICgoZS0+ ZmxhZ3MgJiBET01fU1RBUikgfHwgKGUtPmZsYWdzICYgRE9XX1NUQVIpKQotCQkJCQkgID8gKGJp dF90ZXN0KGUtPmRvdyxvdHpkb3cpICYmIGJpdF90ZXN0KGUtPmRvbSxvdHpkb20pKQotCQkJCQkg IDogKGJpdF90ZXN0KGUtPmRvdyxvdHpkb3cpIHx8IGJpdF90ZXN0KGUtPmRvbSxvdHpkb20pKQot CQkJCQkpCi0JCQkJICAgKSB7Ci0JCQkJCWlmICggZS0+ZmxhZ3MgJiBSVU5fQVQgKSB7Ci0JCQkJ CQllLT5mbGFncyAmPSB+UlVOX0FUOwotCQkJCQkJZS0+bGFzdHJ1biA9IFRhcmdldFRpbWU7Ci0J CQkJCQlqb2JfYWRkKGUsIHUpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0gZWxzZSAKLQkJCQkJ CWUtPmZsYWdzICY9IH5OT1RfVU5USUw7Ci0JCQkJfSBlbHNlIGlmICggZS0+ZmxhZ3MgJiBOT1Rf VU5USUwgKQotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKGJpdF90ZXN0KGUtPnNlY29u ZCwgc2Vjb25kKQotCQkJICYmIGJpdF90ZXN0KGUtPm1pbnV0ZSwgbWludXRlKQotCQkJICYmIGJp dF90ZXN0KGUtPmhvdXIsIGhvdXIpCi0JCQkgJiYgYml0X3Rlc3QoZS0+bW9udGgsIG1vbnRoKQot CQkJICYmICggKChlLT5mbGFncyAmIERPTV9TVEFSKSB8fCAoZS0+ZmxhZ3MgJiBET1dfU1RBUikp CisJCQkgICAgZW52X2dldCgiTE9HTkFNRSIsIGUtPmVudnApLCAKKwkJCSAgICBlLT51aWQsIGUt PmdpZCwgZS0+Y21kKSkKKwkJCWlmIChiaXRfdGVzdChlLT5taW51dGUsIG1pbnV0ZSkgJiYKKwkJ CSAgICBiaXRfdGVzdChlLT5ob3VyLCBob3VyKSAmJgorCQkJICAgIGJpdF90ZXN0KGUtPm1vbnRo LCBtb250aCkgJiYKKwkJCSAgICAoICgoZS0+ZmxhZ3MgJiBET01fU1RBUikgfHwgKGUtPmZsYWdz ICYgRE9XX1NUQVIpKQogCQkJICAgICAgPyAoYml0X3Rlc3QoZS0+ZG93LGRvdykgJiYgYml0X3Rl c3QoZS0+ZG9tLGRvbSkpCiAJCQkgICAgICA6IChiaXRfdGVzdChlLT5kb3csZG93KSB8fCBiaXRf dGVzdChlLT5kb20sZG9tKSkKIAkJCSAgICApCiAJCQkgICApIHsKLQkJCQllLT5mbGFncyAmPSB+ UlVOX0FUOwotCQkJCWUtPmxhc3RydW4gPSBUYXJnZXRUaW1lOwotCQkJCWpvYl9hZGQoZSwgdSk7 CisJCQkJaWYgKChkb05vbldpbGQgJiYKKwkJCQkgICAgIShlLT5mbGFncyAmIChNSU5fU1RBUnxI Ul9TVEFSKSkpIHx8IAorCQkJCSAgICAoZG9XaWxkICYmIChlLT5mbGFncyAmIChNSU5fU1RBUnxI Ul9TVEFSKSkpKQorCQkJCQlqb2JfYWRkKGUsIHUpOwogCQkJfQogCQl9CiAJfQotCi0JbGFzdF90 aW1lID0gVGFyZ2V0VGltZTsKLQlsYXN0dG0gPSAqdG07CiB9CiAKLQotLyogdGhlIHRhc2sgaGVy ZSBpcyB0byBmaWd1cmUgb3V0IGhvdyBsb25nIGl0J3MgZ29pbmcgdG8gYmUgdW50aWwgOjAwIG9m IHRoZQotICogZm9sbG93aW5nIG1pbnV0ZSBhbmQgaW5pdGlhbGl6ZSBUYXJnZXRUaW1lIHRvIHRo aXMgdmFsdWUuICBUYXJnZXRUaW1lCi0gKiB3aWxsIHN1YnNlcXVlbnRseSBzbGlkZSA2MCBzZWNv bmRzIGF0IGEgdGltZSwgd2l0aCBjb3JyZWN0aW9uIGFwcGxpZWQKLSAqIGltcGxpY2l0bHkgaW4g Y3Jvbl9zbGVlcCgpLiAgaXQgd291bGQgYmUgbmljZSB0byBsZXQgY3JvbiBleGVjdXRlIGluCi0g KiB0aGUgImN1cnJlbnQgbWludXRlIiBiZWZvcmUgZ29pbmcgdG8gc2xlZXAsIGJ1dCBieSByZXN0 YXJ0aW5nIGNyb24geW91Ci0gKiBjb3VsZCB0aGVuIGdldCBpdCB0byBleGVjdXRlIGEgZ2l2ZW4g bWludXRlJ3Mgam9icyBtb3JlIHRoYW4gb25jZS4KLSAqIGluc3RlYWQgd2UgaGF2ZSB0aGUgY2hh bmNlIG9mIG1pc3NpbmcgYSBtaW51dGUncyBqb2JzIGNvbXBsZXRlbHksIGJ1dAotICogdGhhdCdz IHNvbWV0aGluZyBzeXNhZG1pbidzIGtub3cgdG8gZXhwZWN0IHdoYXQgd2l0aCBjcmFzaGluZyBj b21wdXRlcnMuLgorLyoKKyAqIFNldCBTdGFydFRpbWUgYW5kIGNsb2NrVGltZSB0byB0aGUgY3Vy cmVudCB0aW1lLgorICogVGhlc2UgYXJlIHVzZWQgZm9yIGNvbXB1dGluZyB3aGF0IHRpbWUgaXQg cmVhbGx5IGlzIHJpZ2h0IG5vdy4KKyAqIE5vdGUgdGhhdCBjbG9ja1RpbWUgaXMgYSB1bml4IHdh bGxjbG9jayB0aW1lIGNvbnZlcnRlZCB0byBtaW51dGVzLgogICovCiBzdGF0aWMgdm9pZAotY3Jv bl9zeW5jKGludCBzZWNyZXMpIHsKLSAJc3RydWN0IHRtICp0bTsKLQotCVRhcmdldFRpbWUgPSB0 aW1lKCh0aW1lX3QqKTApOwotCWlmIChzZWNyZXMgIT0gMCkgewotCQlUYXJnZXRUaW1lICs9IDE7 Ci0JfSBlbHNlIHsKLQkJdG0gPSBsb2NhbHRpbWUoJlRhcmdldFRpbWUpOwotCQlUYXJnZXRUaW1l ICs9ICg2MCAtIHRtLT50bV9zZWMpOwotCX0KLX0KK3NldF90aW1lKGludCBpbml0aWFsaXplKSB7 CisJc3RydWN0IHRtIHRtOworCXN0YXRpYyBpbnQgaXNkc3Q7CiAKLXN0YXRpYyBpbnQKLXRpbWVz cGVjX3N1YnRyYWN0KHN0cnVjdCB0aW1lc3BlYyAqcmVzdWx0LCBzdHJ1Y3QgdGltZXNwZWMgKngs Ci0gICAgc3RydWN0IHRpbWVzcGVjICp5KQotewotCXRpbWVfdCBuc2VjOworCVN0YXJ0VGltZSA9 IHRpbWUoTlVMTCk7CiAKLQkvKiBQZXJmb3JtIHRoZSBjYXJyeSBmb3IgdGhlIGxhdGVyIHN1YnRy YWN0aW9uIGJ5IHVwZGF0aW5nIHkuICovCi0JaWYgKHgtPnR2X25zZWMgPCB5LT50dl9uc2VjKSB7 Ci0JCW5zZWMgPSAoeS0+dHZfbnNlYyAtIHgtPnR2X25zZWMpIC8gMTAwMDAwMDAgKyAxOwotCQl5 LT50dl9uc2VjIC09IDEwMDAwMDAwMDAgKiBuc2VjOwotCQl5LT50dl9zZWMgKz0gbnNlYzsKKwkv KiBXZSBhZGp1c3QgdGhlIHRpbWUgdG8gR01UIHNvIHdlIGNhbiBjYXRjaCBEU1QgY2hhbmdlcy4g Ki8KKwl0bSA9ICpsb2NhbHRpbWUoJlN0YXJ0VGltZSk7CisJaWYgKGluaXRpYWxpemUgfHwgdG0u dG1faXNkc3QgIT0gaXNkc3QpIHsKKwkJaXNkc3QgPSB0bS50bV9pc2RzdDsKKwkJR01Ub2ZmID0g Z2V0X2dtdG9mZigmU3RhcnRUaW1lLCAmdG0pOworCQlEZWJ1ZyhEU0NILCAoIlslbGRdIEdNVG9m Zj0lbGRcbiIsCisJCSAgICAobG9uZylnZXRwaWQoKSwgKGxvbmcpR01Ub2ZmKSkKIAl9Ci0JaWYg KHgtPnR2X25zZWMgLSB5LT50dl9uc2VjID4gMTAwMDAwMDAwMCkgewotCQluc2VjID0gKHgtPnR2 X25zZWMgLSB5LT50dl9uc2VjKSAvIDEwMDAwMDAwMDA7Ci0JCXktPnR2X25zZWMgKz0gMTAwMDAw MDAwMCAqIG5zZWM7Ci0JCXktPnR2X3NlYyAtPSBuc2VjOwotCX0KLSAgICAgCi0JLyogdHZfbnNl YyBpcyBjZXJ0YWlubHkgcG9zaXRpdmUuICovCi0JcmVzdWx0LT50dl9zZWMgPSB4LT50dl9zZWMg LSB5LT50dl9zZWM7Ci0JcmVzdWx0LT50dl9uc2VjID0geC0+dHZfbnNlYyAtIHktPnR2X25zZWM7 Ci0gICAgIAotCS8qIFJldHVybiBUcnVlIGlmIHJlc3VsdCBpcyBuZWdhdGl2ZS4gKi8KLQlyZXR1 cm4gKHgtPnR2X3NlYyA8IHktPnR2X3NlYyk7CisJY2xvY2tUaW1lID0gKFN0YXJ0VGltZSArIEdN VG9mZikgLyAodGltZV90KVNFQ09ORFNfUEVSX01JTlVURTsKIH0KIAorLyoKKyAqIFRyeSB0byBq dXN0IGhpdCB0aGUgbmV4dCBtaW51dGUuCisgKi8KIHN0YXRpYyB2b2lkCi1jcm9uX3NsZWVwKGNy b25fZGIgKmRiLCBpbnQgc2VjcmVzKQotewotCWludCBzZWNvbmRzX3RvX3dhaXQ7Ci0JaW50IHJ2 YWw7Ci0Jc3RydWN0IHRpbWVzcGVjIGN0aW1lLCB0dGltZSwgc3RpbWUsIHJlbXRpbWU7Ci0KLQkv KgotCSAqIExvb3AgdW50aWwgd2UgcmVhY2ggdGhlIHRvcCBvZiB0aGUgbmV4dCBtaW51dGUsIHNs ZWVwIHdoZW4gcG9zc2libGUuCi0JICovCi0KLQlmb3IgKDs7KSB7Ci0JCWNsb2NrX2dldHRpbWUo Q0xPQ0tfUkVBTFRJTUUsICZjdGltZSk7Ci0JCXR0aW1lLnR2X3NlYyA9IFRhcmdldFRpbWU7Ci0J CXR0aW1lLnR2X25zZWMgPSAwOwotCQl0aW1lc3BlY19zdWJ0cmFjdCgmc3RpbWUsICZ0dGltZSwg JmN0aW1lKTsKLQorY3Jvbl9zbGVlcChpbnQgdGFyZ2V0KSB7CisJdGltZV90IHQxLCB0MjsKKwl1 bnNpZ25lZCBjaGFyIHBva2U7CisJaW50IG5mZHMsIGZkOworCXNvY2tsZW5fdCBzdW5sZW47CisJ c3RhdGljIGZkX3NldCAqZmRzcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gc191bjsKKworCXN0cnVj dCB0aW1ldmFsIHNlY29uZHNfdG9fd2FpdDsKKwlzZWNvbmRzX3RvX3dhaXQudHZfdXNlYyA9IDA7 CisKKwl0MSA9IHRpbWUoTlVMTCkgKyBHTVRvZmY7CisJc2Vjb25kc190b193YWl0LnR2X3NlYyA9 IChpbnQpKHRhcmdldCAqIFNFQ09ORFNfUEVSX01JTlVURSAtIHQxKSArIDE7CisJRGVidWcoRFND SCwgKCJbJWxkXSBUYXJnZXQgdGltZT0lbGQsIHNlYy10by13YWl0PSVsZFxuIiwKKwkgICAgKGxv bmcpZ2V0cGlkKCksIChsb25nKXRhcmdldCpTRUNPTkRTX1BFUl9NSU5VVEUsIHNlY29uZHNfdG9f d2FpdC50dl9zZWMpKQorCisJZmRzciA9IChmZF9zZXQgKiljYWxsb2MoaG93bWFueShjcm9uU29j ayArIDEsIE5GREJJVFMpLAorCQkJc2l6ZW9mKGZkX21hc2spKTsKKworCXdoaWxlIChzZWNvbmRz X3RvX3dhaXQudHZfc2VjID4gMCAmJiBzZWNvbmRzX3RvX3dhaXQudHZfc2VjIDwgNjUpIHsKKwkJ cG9rZSA9IFJFTE9BRF9DUk9OOworCQlpZiAoZmRzcikKKwkJCUZEX1NFVChjcm9uU29jaywgZmRz cik7CiAJCS8qCi0JCSAqIElmIHRoZSBzZWNvbmRzX3RvX3dhaXQgdmFsdWUgaXMgaW5zYW5lLCBq dW1wIHRoZSBjcm9uCisJCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSB3ZXJlIGludGVycnVwdGVkIGJ5 IGEgc2lnbmFsLgorCQkgKiBJZiBzbywgc2VydmljZSB0aGUgc2lnbmFsKHMpIHRoZW4gY29udGlu dWUgc2xlZXBpbmcKKwkJICogd2hlcmUgd2UgbGVmdCBvZmYuCiAJCSAqLwotCi0JCWlmIChzdGlt ZS50dl9zZWMgPCAtNjAwIHx8IHN0aW1lLnR2X3NlYyA+IDYwMCkgewotCQkJY3Jvbl9jbGVhbihk Yik7Ci0JCQljcm9uX3N5bmMoc2VjcmVzKTsKLQkJCWNvbnRpbnVlOworCQluZmRzID0gc2VsZWN0 KGNyb25Tb2NrICsgMSwgZmRzciwgTlVMTCwgTlVMTCwgJnNlY29uZHNfdG9fd2FpdCk7CisJCWlm IChuZmRzID09IDApCisJCQlicmVhazsgICAgICAgICAgLyogdGltZXIgZXhwaXJlZCAqLworCQlp ZiAobmZkcyA9PSAtMSAmJiBlcnJubyAhPSBFSU5UUikKKwkJCWJyZWFrOyAgICAgICAgICAvKiBh biBlcnJvciBvY2N1cnJlZCAqLworCQlpZiAobmZkcyA+IDApIHsKKwkJCURlYnVnKERTQ0gsICgi WyVsZF0gR290IGEgcG9rZSBvbiB0aGUgc29ja2V0XG4iLAorCQkJCQkJKGxvbmcpZ2V0cGlkKCkp KQorCQkJc3VubGVuID0gc2l6ZW9mKHNfdW4pOworCQkJZmQgPSBhY2NlcHQoY3JvblNvY2ssIChz dHJ1Y3Qgc29ja2FkZHIgKikmc191biwgJnN1bmxlbik7CisJCQlpZiAoZmQgPj0gMCAmJiBmY250 bChmZCwgRl9TRVRGTCwgT19OT05CTE9DSykgPT0gMCkgeworCQkJCSh2b2lkKSByZWFkKGZkLCAm cG9rZSwgMSk7CisJCQkJY2xvc2UoZmQpOworCQkJCWlmIChwb2tlICYgUkVMT0FEX0NST04pIHsK KwkJCQkJZGF0YWJhc2UubXRpbWUgPSAodGltZV90KTA7CisJCQkJCWxvYWRfZGF0YWJhc2UoJmRh dGFiYXNlKTsKKwkJCQl9CisJCQl9CiAJCX0KLQotCQlzZWNvbmRzX3RvX3dhaXQgPSAoc3RpbWUu dHZfbnNlYyA+IDApID8gc3RpbWUudHZfc2VjICsgMSA6Ci0JCSAgICBzdGltZS50dl9zZWM7Ci0K LQkJRGVidWcoRFNDSCwgKCJbJWRdIFRhcmdldFRpbWU9JWxkLCBzZWMtdG8td2FpdD0lZFxuIiwK LQkJCWdldHBpZCgpLCAobG9uZylUYXJnZXRUaW1lLCBzZWNvbmRzX3RvX3dhaXQpKQotCi0JCS8q Ci0JCSAqIElmIHdlJ3ZlIHJ1biBvdXQgb2Ygd2FpdCB0aW1lIG9yIHRoZXJlIGFyZSBubyBqb2Jz IGxlZnQKLQkJICogdG8gcnVuLCBicmVhawotCQkgKi8KLQotCQlpZiAoc3RpbWUudHZfc2VjIDwg MCkKLQkJCWJyZWFrOwotCQlpZiAoam9iX3J1bnF1ZXVlKCkgPT0gMCkgewotCQkJRGVidWcoRFND SCwgKCJbJWRdIHNsZWVwaW5nIGZvciAlZCBzZWNvbmRzXG4iLAotCQkJCWdldHBpZCgpLCBzZWNv bmRzX3RvX3dhaXQpKQotCi0JCQlmb3IgKDs7KSB7Ci0JCQkJcnZhbCA9IG5hbm9zbGVlcCgmc3Rp bWUsICZyZW10aW1lKTsKLQkJCQlpZiAocnZhbCA9PSAwIHx8IGVycm5vICE9IEVJTlRSKQotCQkJ CQlicmVhazsKLQkJCQlzdGltZS50dl9zZWMgPSByZW10aW1lLnR2X3NlYzsKLQkJCQlzdGltZS50 dl9uc2VjID0gcmVtdGltZS50dl9uc2VjOworCQllbHNlIHsKKwkJCWlmIChnb3Rfc2lnaHVwKSB7 CisJCQkJZ290X3NpZ2h1cCA9IDA7CisJCQkJbG9nX2Nsb3NlKCk7CisJCQl9CisJCQlpZiAoZ290 X3NpZ2NobGQpIHsKKwkJCQlnb3Rfc2lnY2hsZCA9IDA7CisJCQkJc2lnY2hsZF9yZWFwZXIoKTsK IAkJCX0KIAkJfQorCQl0MiA9IHRpbWUoTlVMTCkgKyBHTVRvZmY7CisJCXNlY29uZHNfdG9fd2Fp dC50dl9zZWMgLT0gKGludCkodDIgLSB0MSk7CisJCXQxID0gdDI7CiAJfQogfQogCi0KLS8qIGlm IHRoZSB0aW1lIHdhcyBjaGFuZ2VkIGFicnVwdGx5LCBjbGVhciB0aGUgZmxhZ3MgcmVsYXRlZAot ICogdG8gdGhlIGRheWxpZ2h0IHRpbWUgc3dpdGNoIGhhbmRsaW5nIHRvIGF2b2lkIHN0cmFuZ2Ug ZWZmZWN0cwotICovCi0KIHN0YXRpYyB2b2lkCi1jcm9uX2NsZWFuKGRiKQotCWNyb25fZGIJKmRi OwotewotCXVzZXIJCSp1OwotCWVudHJ5CQkqZTsKK3NpZ2h1cF9oYW5kbGVyKGludCB4KSB7CisJ Z290X3NpZ2h1cCA9IDE7Cit9CiAKLQlsYXN0X3RpbWUgPSAwOworc3RhdGljIHZvaWQKK3NpZ2No bGRfaGFuZGxlcihpbnQgeCkgeworCWdvdF9zaWdjaGxkID0gMTsKK30KIAotCWZvciAodSA9IGRi LT5oZWFkOyAgdSAhPSBOVUxMOyAgdSA9IHUtPm5leHQpIHsKLQkJZm9yIChlID0gdS0+Y3JvbnRh YjsgIGUgIT0gTlVMTDsgIGUgPSBlLT5uZXh0KSB7Ci0JCQllLT5mbGFncyAmPSB+KFJVTl9BVHxO T1RfVU5USUwpOwotCQl9Ci0JfQorc3RhdGljIHZvaWQKK3F1aXQoaW50IHgpIHsKKwlwaWRmaWxl X3JlbW92ZShwZmgpOworCV9leGl0KDApOwogfQogCi0jaWZkZWYgVVNFX1NJR0NITEQKIHN0YXRp YyB2b2lkCi1zaWdjaGxkX2hhbmRsZXIoaW50IHgpCi17Ci0JV0FJVF9UCQl3YWl0ZXI7Ci0JUElE X1QJCXBpZDsKK3NpZ2NobGRfcmVhcGVyKHZvaWQpIHsKKwlXQUlUX1Qgd2FpdGVyOworCVBJRF9U IHBpZDsKIAotCWZvciAoOzspIHsKLSNpZmRlZiBQT1NJWAorCWRvIHsKIAkJcGlkID0gd2FpdHBp ZCgtMSwgJndhaXRlciwgV05PSEFORyk7Ci0jZWxzZQotCQlwaWQgPSB3YWl0Mygmd2FpdGVyLCBX Tk9IQU5HLCAoc3RydWN0IHJ1c2FnZSAqKTApOwotI2VuZGlmCiAJCXN3aXRjaCAocGlkKSB7CiAJ CWNhc2UgLTE6CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CiAJCQlEZWJ1 ZyhEUFJPQywKLQkJCQkoIlslZF0gc2lnY2hsZC4uLm5vIGNoaWxkcmVuXG4iLCBnZXRwaWQoKSkp Ci0JCQlyZXR1cm47CisJCQkgICAgICAoIlslbGRdIHNpZ2NobGQuLi5ubyBjaGlsZHJlblxuIiwK KwkJCSAgICAgICAobG9uZylnZXRwaWQoKSkpCisJCQlicmVhazsKIAkJY2FzZSAwOgogCQkJRGVi dWcoRFBST0MsCi0JCQkJKCJbJWRdIHNpZ2NobGQuLi5ubyBkZWFkIGtpZHNcbiIsIGdldHBpZCgp KSkKLQkJCXJldHVybjsKKwkJCSAgICAgICgiWyVsZF0gc2lnY2hsZC4uLm5vIGRlYWQga2lkc1xu IiwKKwkJCSAgICAgICAobG9uZylnZXRwaWQoKSkpCisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJ CURlYnVnKERQUk9DLAotCQkJCSgiWyVkXSBzaWdjaGxkLi4ucGlkICMlZCBkaWVkLCBzdGF0PSVk XG4iLAotCQkJCWdldHBpZCgpLCBwaWQsIFdFWElUU1RBVFVTKHdhaXRlcikpKQorCQkJICAgICAg KCJbJWxkXSBzaWdjaGxkLi4ucGlkICMlbGQgZGllZCwgc3RhdD0lZFxuIiwKKwkJCSAgICAgICAo bG9uZylnZXRwaWQoKSwgKGxvbmcpcGlkLCBXRVhJVFNUQVRVUyh3YWl0ZXIpKSkKKwkJCWJyZWFr OwogCQl9Ci0JfQorCX0gd2hpbGUgKHBpZCA+IDApOwogfQotI2VuZGlmIC8qVVNFX1NJR0NITEQq LwotCiAKIHN0YXRpYyB2b2lkCi1zaWdodXBfaGFuZGxlcihpbnQgeCkKLXsKLQlsb2dfY2xvc2Uo KTsKLX0KLQorcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CisJaW50IGFyZ2No OwogCi1zdGF0aWMgdm9pZAotcGFyc2VfYXJncyhhcmdjLCBhcmd2KQotCWludAlhcmdjOwotCWNo YXIJKmFyZ3ZbXTsKLXsKLQlpbnQJYXJnY2g7Ci0JY2hhcgkqZW5kcDsKKwljaGFyICplbmRwOwog Ci0Jd2hpbGUgKChhcmdjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiajpKOm06b3N4OiIpKSAhPSAt MSkgeworCXdoaWxlICgtMSAhPSAoYXJnY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgImo6SjptOm54 OiIpKSkgewogCQlzd2l0Y2ggKGFyZ2NoKSB7CisJCWRlZmF1bHQ6CisJCQl1c2FnZSgpOwogCQlj YXNlICdqJzoKIAkJCUppdHRlciA9IHN0cnRvdWwob3B0YXJnLCAmZW5kcCwgMTApOwogCQkJaWYg KCpvcHRhcmcgPT0gJ1wwJyB8fCAqZW5kcCAhPSAnXDAnIHx8IEppdHRlciA+IDYwKQogCQkJCWVy cngoRVJST1JfRVhJVCwKLQkJCQkgICAgICJiYWQgdmFsdWUgZm9yIGppdHRlcjogJXMiLCBvcHRh cmcpOworCQkJCQkJImJhZCB2YWx1ZSBmb3Igaml0dGVyOiAlcyIsIG9wdGFyZyk7CiAJCQlicmVh azsKIAkJY2FzZSAnSic6CiAJCQlSb290Sml0dGVyID0gc3RydG91bChvcHRhcmcsICZlbmRwLCAx MCk7Ci0JCQlpZiAoKm9wdGFyZyA9PSAnXDAnIHx8ICplbmRwICE9ICdcMCcgfHwgUm9vdEppdHRl ciA+IDYwKQorCQkJaWYoICpvcHRhcmcgPT0gJ1wwJyB8fCAqZW5kcCAhPSAnXDAnIHx8IFJvb3RK aXR0ZXIgPiA2MCkKIAkJCQllcnJ4KEVSUk9SX0VYSVQsCi0JCQkJICAgICAiYmFkIHZhbHVlIGZv ciByb290IGppdHRlcjogJXMiLCBvcHRhcmcpOworCQkJCQkJImJhZCB2YWx1ZSBmb3Igcm9vdCBq aXR0ZXI6ICVzIiwgb3B0YXJnKTsKIAkJCWJyZWFrOwogCQljYXNlICdtJzoKIAkJCWRlZm1haWx0 byA9IG9wdGFyZzsKIAkJCWJyZWFrOwotCQljYXNlICdvJzoKLQkJCWRzdF9lbmFibGVkID0gMDsK LQkJCWJyZWFrOwotCQljYXNlICdzJzoKLQkJCWRzdF9lbmFibGVkID0gMTsKLQkJCWJyZWFrOwog CQljYXNlICd4JzoKIAkJCWlmICghc2V0X2RlYnVnX2ZsYWdzKG9wdGFyZykpCiAJCQkJdXNhZ2Uo KTsKIAkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdXNhZ2UoKTsKLQkJfQotCX0KLX0KLQotc3Rh dGljIGludAotcnVuX2F0X3NlY3Jlcyhjcm9uX2RiICpkYikKLXsKLQl1c2VyICp1OwotCWVudHJ5 ICplOwotCi0JZm9yICh1ID0gZGItPmhlYWQ7ICB1ICE9IE5VTEw7ICB1ID0gdS0+bmV4dCkgewot CQlmb3IgKGUgPSB1LT5jcm9udGFiOyAgZSAhPSBOVUxMOyAgZSA9IGUtPm5leHQpIHsKLQkJCWlm ICgoZS0+ZmxhZ3MgJiBTRUNfUkVTKSAhPSAwKQotCQkJCXJldHVybiAxOworCQljYXNlICduJzoK KwkJCU5vRm9yayA9IDE7CisJCQlicmVhazsKIAkJfQogCX0KLQlyZXR1cm4gMDsKIH0KZGlmZiAt cnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9jcm9uLmggZnJlZWJzZF9jcm9uL2Nyb24v Y3Jvbi5oCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb24vY3Jvbi5oCTIwMTQtMDEtMTYg MjE6NDM6NDkuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vY3Jvbi9jcm9uLmgJMjAx NC0wNi0xMSAxNjo0Mjo1NS4yNzI0NDQyNzYgKzAyMDAKQEAgLTEsMzA3ICsxLDQ2IEBACiAvKiBD b3B5cmlnaHQgMTk4OCwxOTkwLDE5OTMsMTk5NCBieSBQYXVsIFZpeGllCiAgKiBBbGwgcmlnaHRz IHJlc2VydmVkCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBieSBJbnRlcm5ldCBT eXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQorICogQ29weXJpZ2h0IChjKSAxOTk3LDIw MDAgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bSwgSW5jLgogICoKLSAqIERpc3RyaWJ1 dGUgZnJlZWx5LCBleGNlcHQ6IGRvbid0IHJlbW92ZSBteSBuYW1lIGZyb20gdGhlIHNvdXJjZSBv cgotICogZG9jdW1lbnRhdGlvbiAoZG9uJ3QgdGFrZSBjcmVkaXQgZm9yIG15IHdvcmspLCBtYXJr IHlvdXIgY2hhbmdlcyAoZG9uJ3QKLSAqIGdldCBtZSBibGFtZWQgZm9yIHlvdXIgcG9zc2libGUg YnVncyksIGRvbid0IGFsdGVyIG9yIHJlbW92ZSB0aGlzCi0gKiBub3RpY2UuICBNYXkgYmUgc29s ZCBpZiBidWlsZGFibGUgc291cmNlIGlzIHByb3ZpZGVkIHRvIGJ1eWVyLiAgTm8KLSAqIHdhcnJh bnRlZSBvZiBhbnkga2luZCwgZXhwcmVzcyBvciBpbXBsaWVkLCBpcyBpbmNsdWRlZCB3aXRoIHRo aXMKLSAqIHNvZnR3YXJlOyB1c2UgYXQgeW91ciBvd24gcmlzaywgcmVzcG9uc2liaWxpdHkgZm9y IGRhbWFnZXMgKGlmIGFueSkgdG8KLSAqIGFueW9uZSByZXN1bHRpbmcgZnJvbSB0aGUgdXNlIG9m IHRoaXMgc29mdHdhcmUgcmVzdHMgZW50aXJlbHkgd2l0aCB0aGUKLSAqIHVzZXIuCisgKiBQZXJt aXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJl IGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRl ZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMg cGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAgKgotICogU2VuZCBidWcg cmVwb3J0cywgYnVnIGZpeGVzLCBlbmhhbmNlbWVudHMsIHJlcXVlc3RzLCBmbGFtZXMsIGV0Yy4s IGFuZAotICogSSdsbCB0cnkgdG8ga2VlcCBhIHZlcnNpb24gdXAgdG8gZGF0ZS4gIEkgY2FuIGJl IHJlYWNoZWQgYXMgZm9sbG93czoKLSAqIFBhdWwgVml4aWUgICAgICAgICAgPHBhdWxAdml4LmNv bT4gICAgICAgICAgdXVuZXQhZGVjd3JsIXZpeGllIXBhdWwKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQ Uk9WSURFRCAiQVMgSVMiIEFORCBJU0MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRI IFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVT IE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuICBJTiBOTyBFVkVOVCBTSEFMTCBJ U0MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENP TlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJ TkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBB Q1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBB UklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9S TUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCiAvKiBjcm9uLmggLSBoZWFkZXIgZm9yIHZp eGllJ3MgY3JvbgogICoKLSAqICRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9u L2Nyb24vY3Jvbi5oIDI0MjEwMSAyMDEyLTEwLTI1IDIyOjU0OjI5WiBzb2JvbWF4ICQKKyAqICRJ ZDogY3Jvbi5oLHYgMS42IDIwMDQvMDEvMjMgMTg6NTY6NDIgdml4aWUgRXhwICQKICAqCiAgKiB2 aXggMTRub3Y4OCBbcmVzdCBvZiBsb2cgaXMgaW4gUkNTXQogICogdml4IDE0amFuODcgWzAgb3Ig NyBjYW4gYmUgc3VuZGF5OyB0aGFua3MsIG13bUBiZXJrZWxleV0KICAqIHZpeCAzMGRlYzg2IFt3 cml0dGVuXQogICovCiAKLS8qIHJlb3JkZXIgdGhlc2UgI2luY2x1ZGUncyBhdCB5b3VyIHBlcmls ICovCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KLSNp bmNsdWRlICJjb21wYXQuaCIKKyNkZWZpbmUgQ1JPTl9WRVJTSU9OICJWNS4wIgogCi0jaW5jbHVk ZSA8Yml0c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KK3Vuc2lnbmVkIEppdHRlciwgUm9v dEppdHRlcjsKK2V4dGVybiB1bnNpZ25lZCBKaXR0ZXIsIFJvb3RKaXR0ZXI7CitleHRlcm4gc3Ry dWN0IHBpZGZoICpwZmg7CiAjaW5jbHVkZSA8ZXJyLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KICNp bmNsdWRlIDxsaWJ1dGlsLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+ Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3dh aXQuaD4KIAotI2luY2x1ZGUgInBhdGhuYW1lcy5oIgorI2RlZmluZSBTWVNfTkFNRSAiKnN5c3Rl bSoiCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiZXh0ZXJucy5oIgotCi0JLyogdGhl c2UgYXJlIHJlYWxseSBpbW11dGFibGUsIGFuZCBhcmUKLQkgKiAgIGRlZmluZWQgZm9yIHN5bWJv bGljIGNvbnZlbmllbmNlIG9ubHkKLQkgKiBUUlVFLCBGQUxTRSwgYW5kIEVSUiBtdXN0IGJlIGRp c3RpbmN0Ci0JICogRVJSIG11c3QgYmUgPCBPSy4KLQkgKi8KLSNkZWZpbmUgVFJVRQkJMQotI2Rl ZmluZSBGQUxTRQkJMAotCS8qIHN5c3RlbSBjYWxscyByZXR1cm4gdGhpcyBvbiBzdWNjZXNzICov Ci0jZGVmaW5lIE9LCQkwCi0JLyogICBvciB0aGlzIG9uIGVycm9yICovCi0jZGVmaW5lIEVSUgkJ KC0xKQotCi0JLyogdHVybiB0aGlzIG9uIHRvIGdldCAnLXgnIGNvZGUgKi8KLSNpZm5kZWYgREVC VUdHSU5HCi0jZGVmaW5lIERFQlVHR0lORwlGQUxTRQotI2VuZGlmCi0KLSNkZWZpbmUgUkVBRF9Q SVBFCTAJLyogd2hpY2ggZW5kIG9mIGEgcGlwZSBwYWlyIGRvIHlvdSByZWFkPyAqLwotI2RlZmlu ZSBXUklURV9QSVBFCTEJLyogICBvciB3cml0ZSB0bz8gKi8KLSNkZWZpbmUgU1RESU4JCTAJLyog d2hhdCBpcyBzdGRpbidzIGZpbGUgZGVzY3JpcHRvcj8gKi8KLSNkZWZpbmUgU1RET1VUCQkxCS8q ICAgc3Rkb3V0J3M/ICovCi0jZGVmaW5lIFNUREVSUgkJMgkvKiAgIHN0ZGVycidzPyAqLwotI2Rl ZmluZSBFUlJPUl9FWElUCTEJLyogZXhpdCgpIHdpdGggdGhpcyB3aWxsIHNjYXJlIHRoZSBzaGVs bCAqLwotI2RlZmluZQlPS19FWElUCQkwCS8qIGV4aXQoKSB3aXRoIHRoaXMgaXMgY29uc2lkZXJl ZCAnbm9ybWFsJyAqLwotI2RlZmluZQlNQVhfRk5BTUUJMTAwCS8qIG1heCBsZW5ndGggb2YgaW50 ZXJuYWxseSBnZW5lcmF0ZWQgZm4gKi8KLSNkZWZpbmUJTUFYX0NPTU1BTkQJMTAwMAkvKiBtYXgg bGVuZ3RoIG9mIGludGVybmFsbHkgZ2VuZXJhdGVkIGNtZCAqLwotI2RlZmluZQlNQVhfRU5WU1RS CTEwMDAJLyogbWF4IGxlbmd0aCBvZiBlbnZ2YXI9dmFsdWVcMCBzdHJpbmdzICovCi0jZGVmaW5l CU1BWF9URU1QU1RSCTEwMAkvKiBvYnZpb3VzICovCi0jZGVmaW5lCU1BWF9VTkFNRQkyMAkvKiBt YXggbGVuZ3RoIG9mIHVzZXJuYW1lLCBzaG91bGQgYmUgb3ZlcmtpbGwgKi8KLSNkZWZpbmUJUk9P VF9VSUQJMAkvKiBkb24ndCBjaGFuZ2UgdGhpcywgaXQgcmVhbGx5IG11c3QgYmUgcm9vdCAqLwot I2RlZmluZQlST09UX1VTRVIJInJvb3QiCS8qIGRpdHRvICovCi0jZGVmaW5lCVNZU19OQU1FCSIq c3lzdGVtKiIgLyogbWFnaWMgb3duZXIgbmFtZSBmb3Igc3lzdGVtIGNyb250YWIgKi8KLQotCQkJ CS8qIE5PVEU6IHRoZXNlIGNvcnJlc3BvbmQgdG8gRGVidWdGbGFnTmFtZXMsCi0JCQkJICoJZGVm aW5lZCBiZWxvdy4KLQkJCQkgKi8KLSNkZWZpbmUJREVYVAkJMHgwMDAxCS8qIGV4dGVuZCBmbGFn IGZvciBvdGhlciBkZWJ1ZyBtYXNrcyAqLwotI2RlZmluZQlEU0NICQkweDAwMDIJLyogc2NoZWR1 bGluZyBkZWJ1ZyBtYXNrICovCi0jZGVmaW5lCURQUk9DCQkweDAwMDQJLyogcHJvY2VzcyBjb250 cm9sIGRlYnVnIG1hc2sgKi8KLSNkZWZpbmUJRFBBUlMJCTB4MDAwOAkvKiBwYXJzaW5nIGRlYnVn IG1hc2sgKi8KLSNkZWZpbmUJRExPQUQJCTB4MDAxMAkvKiBkYXRhYmFzZSBsb2FkaW5nIGRlYnVn IG1hc2sgKi8KLSNkZWZpbmUJRE1JU0MJCTB4MDAyMAkvKiBtaXNjIGRlYnVnIG1hc2sgKi8KLSNk ZWZpbmUJRFRFU1QJCTB4MDA0MAkvKiB0ZXN0IG1vZGU6IGRvbid0IGV4ZWN1dGUgYW55IGNvbW1h bmRzICovCi0jZGVmaW5lCURCSVQJCTB4MDA4MAkvKiBiaXQgdHdpZGRsaW5nIHNob3duIChsb25n KSAqLwotCi0jZGVmaW5lCUNST05fVEFCKHUpCSIlcy8lcyIsIFNQT09MX0RJUiwgdQotI2RlZmlu ZQlSRUcJCXJlZ2lzdGVyCi0jZGVmaW5lCVBQQ19OVUxMCSgoY2hhciAqKilOVUxMKQotCi0jaWZu ZGVmIE1BWEhPU1ROQU1FTEVOCi0jZGVmaW5lIE1BWEhPU1ROQU1FTEVOIDI1NgotI2VuZGlmCi0K LSNkZWZpbmUJU2tpcF9CbGFua3MoYywgZikgXAotCQkJd2hpbGUgKGMgPT0gJ1x0JyB8fCBjID09 ICcgJykgXAotCQkJCWMgPSBnZXRfY2hhcihmKTsKLQotI2RlZmluZQlTa2lwX05vbmJsYW5rcyhj LCBmKSBcCi0JCQl3aGlsZSAoYyE9J1x0JyAmJiBjIT0nICcgJiYgYyE9J1xuJyAmJiBjICE9IEVP RikgXAotCQkJCWMgPSBnZXRfY2hhcihmKTsKLQotI2RlZmluZQlTa2lwX0xpbmUoYywgZikgXAot CQkJZG8ge2MgPSBnZXRfY2hhcihmKTt9IHdoaWxlIChjICE9ICdcbicgJiYgYyAhPSBFT0YpOwot Ci0jaWYgREVCVUdHSU5HCi0jIGRlZmluZSBEZWJ1ZyhtYXNrLCBtZXNzYWdlKSBcCi0JCQlpZiAo IChEZWJ1Z0ZsYWdzICYgKG1hc2spICkgPT0gKG1hc2spICkgXAotCQkJCXByaW50ZiBtZXNzYWdl OwotI2Vsc2UgLyogIURFQlVHR0lORyAqLwotIyBkZWZpbmUgRGVidWcobWFzaywgbWVzc2FnZSkg XAotCQkJOwotI2VuZGlmIC8qIERFQlVHR0lORyAqLwotCi0jZGVmaW5lCU1rTG93ZXIoY2gpCShp c3VwcGVyKGNoKSA/IHRvbG93ZXIoY2gpIDogY2gpCi0jZGVmaW5lCU1rVXBwZXIoY2gpCShpc2xv d2VyKGNoKSA/IHRvdXBwZXIoY2gpIDogY2gpCi0jZGVmaW5lCVNldF9MaW5lTnVtKGxuKQl7RGVi dWcoRFBBUlN8REVYVCwoImxpbmVudW09JWRcbiIsbG4pKTsgXAotCQkJIExpbmVOdW1iZXIgPSBs bjsgXAotCQkJfQotCi0jZGVmaW5lCUZJUlNUX1NFQ09ORAkwCi0jZGVmaW5lCUxBU1RfU0VDT05E CTU5Ci0jZGVmaW5lCVNFQ09ORF9DT1VOVAkoTEFTVF9TRUNPTkQgLSBGSVJTVF9TRUNPTkQgKyAx KQotCi0jZGVmaW5lCUZJUlNUX01JTlVURQkwCi0jZGVmaW5lCUxBU1RfTUlOVVRFCTU5Ci0jZGVm aW5lCU1JTlVURV9DT1VOVAkoTEFTVF9NSU5VVEUgLSBGSVJTVF9NSU5VVEUgKyAxKQotCi0jZGVm aW5lCUZJUlNUX0hPVVIJMAotI2RlZmluZQlMQVNUX0hPVVIJMjMKLSNkZWZpbmUJSE9VUl9DT1VO VAkoTEFTVF9IT1VSIC0gRklSU1RfSE9VUiArIDEpCi0KLSNkZWZpbmUJRklSU1RfRE9NCTEKLSNk ZWZpbmUJTEFTVF9ET00JMzEKLSNkZWZpbmUJRE9NX0NPVU5UCShMQVNUX0RPTSAtIEZJUlNUX0RP TSArIDEpCi0KLSNkZWZpbmUJRklSU1RfTU9OVEgJMQotI2RlZmluZQlMQVNUX01PTlRICTEyCi0j ZGVmaW5lCU1PTlRIX0NPVU5UCShMQVNUX01PTlRIIC0gRklSU1RfTU9OVEggKyAxKQotCi0vKiBu b3RlIG9uIERPVzogMCBhbmQgNyBhcmUgYm90aCBTdW5kYXksIGZvciBjb21wYXRpYmlsaXR5IHJl YXNvbnMuICovCi0jZGVmaW5lCUZJUlNUX0RPVwkwCi0jZGVmaW5lCUxBU1RfRE9XCTcKLSNkZWZp bmUJRE9XX0NPVU5UCShMQVNUX0RPVyAtIEZJUlNUX0RPVyArIDEpCi0KLSNpZmRlZiBMT0dJTl9D QVAKLS8qIHNlZSBpbml0LmMgKi8KLSNkZWZpbmUgUkVTT1VSQ0VfUkMgImRhZW1vbiIKLSNlbmRp ZgotCi0JCQkvKiBlYWNoIHVzZXIncyBjcm9udGFiIHdpbGwgYmUgaGVsZCBhcyBhIGxpc3Qgb2YK LQkJCSAqIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlLgotCQkJICoKLQkJCSAqIFRoZXNlIGFyZSB0 aGUgY3JvbiBjb21tYW5kcy4KLQkJCSAqLwotCi10eXBlZGVmCXN0cnVjdCBfZW50cnkgewotCXN0 cnVjdCBfZW50cnkJKm5leHQ7Ci0JdWlkX3QJCXVpZDsKLQlnaWRfdAkJZ2lkOwotI2lmZGVmIExP R0lOX0NBUAotCWNoYXIgICAgICAgICAgICAqY2xhc3M7Ci0jZW5kaWYKLQljaGFyCQkqKmVudnA7 Ci0JY2hhcgkJKmNtZDsKLQliaXRzdHJfdAliaXRfZGVjbChzZWNvbmQsIFNFQ09ORF9DT1VOVCk7 Ci0JYml0c3RyX3QJYml0X2RlY2wobWludXRlLCBNSU5VVEVfQ09VTlQpOwotCWJpdHN0cl90CWJp dF9kZWNsKGhvdXIsICAgSE9VUl9DT1VOVCk7Ci0JYml0c3RyX3QJYml0X2RlY2woZG9tLCAgICBE T01fQ09VTlQpOwotCWJpdHN0cl90CWJpdF9kZWNsKG1vbnRoLCAgTU9OVEhfQ09VTlQpOwotCWJp dHN0cl90CWJpdF9kZWNsKGRvdywgICAgRE9XX0NPVU5UKTsKLQlpbnQJCWZsYWdzOwotI2RlZmlu ZQlET01fU1RBUgkweDAxCi0jZGVmaW5lCURPV19TVEFSCTB4MDIKLSNkZWZpbmUJV0hFTl9SRUJP T1QJMHgwNAotI2RlZmluZQlSVU5fQVQJMHgwOAotI2RlZmluZQlOT1RfVU5USUwJMHgxMAotI2Rl ZmluZQlTRUNfUkVTCQkweDIwCi0JdGltZV90CWxhc3RydW47Ci19IGVudHJ5OwotCi0JCQkvKiB0 aGUgY3JvbnRhYiBkYXRhYmFzZSB3aWxsIGJlIGEgbGlzdCBvZiB0aGUKLQkJCSAqIGZvbGxvd2lu ZyBzdHJ1Y3R1cmUsIG9uZSBlbGVtZW50IHBlciB1c2VyCi0JCQkgKiBwbHVzIG9uZSBmb3IgdGhl IHN5c3RlbS4KLQkJCSAqCi0JCQkgKiBUaGVzZSBhcmUgdGhlIGNyb250YWJzLgotCQkJICovCi0K LXR5cGVkZWYJc3RydWN0IF91c2VyIHsKLQlzdHJ1Y3QgX3VzZXIJKm5leHQsICpwcmV2OwkvKiBs aW5rcyAqLwotCWNoYXIJCSpuYW1lOwotCXRpbWVfdAkJbXRpbWU7CQkvKiBsYXN0IG1vZHRpbWUg b2YgY3JvbnRhYiAqLwotCWVudHJ5CQkqY3JvbnRhYjsJLyogdGhpcyBwZXJzb24ncyBjcm9udGFi ICovCi19IHVzZXI7Ci0KLXR5cGVkZWYJc3RydWN0IF9jcm9uX2RiIHsKLQl1c2VyCQkqaGVhZCwg KnRhaWw7CS8qIGxpbmtzICovCi0JdGltZV90CQltdGltZTsJCS8qIGxhc3QgbW9kdGltZSBvbiBz cG9vbGRpciAqLwotfSBjcm9uX2RiOwotCi0KLXZvaWQJCXNldF9jcm9uX3VpZCh2b2lkKSwKLQkJ c2V0X2Nyb25fY3dkKHZvaWQpLAotCQlsb2FkX2RhdGFiYXNlKGNyb25fZGIgKiksCi0JCW9wZW5f bG9nZmlsZSh2b2lkKSwKLQkJc2lncGlwZV9mdW5jKHZvaWQpLAotCQlqb2JfYWRkKGVudHJ5ICos IHVzZXIgKiksCi0JCWRvX2NvbW1hbmQoZW50cnkgKiwgdXNlciAqKSwKLQkJbGlua191c2VyKGNy b25fZGIgKiwgdXNlciAqKSwKLQkJdW5saW5rX3VzZXIoY3Jvbl9kYiAqLCB1c2VyICopLAotCQlm cmVlX3VzZXIodXNlciAqKSwKLQkJZW52X2ZyZWUoY2hhciAqKiksCi0JCXVuZ2V0X2NoYXIoaW50 LCBGSUxFICopLAotCQlmcmVlX2VudHJ5KGVudHJ5ICopLAotCQlza2lwX2NvbW1lbnRzKEZJTEUg KiksCi0JCWxvZ19pdChjaGFyICosIGludCwgY2hhciAqLCBjaGFyICopLAotCQlsb2dfY2xvc2Uo dm9pZCk7Ci0KLWludAkJam9iX3J1bnF1ZXVlKHZvaWQpLAotCQlzZXRfZGVidWdfZmxhZ3MoY2hh ciAqKSwKLQkJZ2V0X2NoYXIoRklMRSAqKSwKLQkJZ2V0X3N0cmluZyhjaGFyICosIGludCwgRklM RSAqLCBjaGFyICopLAotCQlzd2FwX3VpZHModm9pZCksCi0JCXN3YXBfdWlkc19iYWNrKHZvaWQp LAotCQlsb2FkX2VudihjaGFyICosIEZJTEUgKiksCi0JCWNyb25fcGNsb3NlKEZJTEUgKiksCi0J CXN0cmNtcF91bnRpbChjaGFyICosIGNoYXIgKiwgaW50KSwKLQkJYWxsb3dlZChjaGFyICopLAot CQlzdHJkdGIoY2hhciAqKTsKLQotY2hhcgkJKmVudl9nZXQoY2hhciAqLCBjaGFyICoqKSwKLQkJ KmFycGFkYXRlKHRpbWVfdCAqKSwKLQkJKm1rcHJpbnRzKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWdu ZWQgaW50KSwKLQkJKmZpcnN0X3dvcmQoY2hhciAqLCBjaGFyICopLAotCQkqKmVudl9pbml0KHZv aWQpLAotCQkqKmVudl9jb3B5KGNoYXIgKiopLAotCQkqKmVudl9zZXQoY2hhciAqKiwgY2hhciAq KTsKLQotdXNlcgkJKmxvYWRfdXNlcihpbnQsIHN0cnVjdCBwYXNzd2QgKiwgY2hhciAqKSwKLQkJ KmZpbmRfdXNlcihjcm9uX2RiICosIGNoYXIgKik7Ci0KLWVudHJ5CQkqbG9hZF9lbnRyeShGSUxF ICosIHZvaWQgKCopKGNoYXIgKiksCi0JCQkJIHN0cnVjdCBwYXNzd2QgKiwgY2hhciAqKik7Ci0K LUZJTEUJCSpjcm9uX3BvcGVuKGNoYXIgKiwgY2hhciAqLCBlbnRyeSAqKTsKLQotCi0JCQkJLyog aW4gdGhlIEMgdHJhZGl0aW9uLCB3ZSBvbmx5IGNyZWF0ZQotCQkJCSAqIHZhcmlhYmxlcyBmb3Ig dGhlIG1haW4gcHJvZ3JhbSwganVzdAotCQkJCSAqIGV4dGVybiB0aGVtIGVsc2V3aGVyZS4KLQkJ CQkgKi8KLQotI2lmZGVmIE1BSU5fUFJPR1JBTQotIyBpZiAhZGVmaW5lZChMSU5UKSAmJiAhZGVm aW5lZChsaW50KQotY2hhcgkqY29weXJpZ2h0W10gPSB7Ci0JCSJAKCMpIENvcHlyaWdodCAxOTg4 LDE5ODksMTk5MCwxOTkzLDE5OTQgYnkgUGF1bCBWaXhpZSIsCi0JCSJAKCMpIEFsbCByaWdodHMg cmVzZXJ2ZWQiCi0JfTsKLSMgZW5kaWYKLQotY2hhcgkqTW9udGhOYW1lc1tdID0gewotCQkiSmFu IiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAotCQkiSnVsIiwgIkF1ZyIsICJT ZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiLAotCQlOVUxMCi0JfTsKLQotY2hhcgkqRG93TmFtZXNb XSA9IHsKLQkJIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIs ICJTdW4iLAotCQlOVUxMCi0JfTsKLQotY2hhcgkqUHJvZ3JhbU5hbWUsCi0JKmRlZm1haWx0bzsK LWludAlMaW5lTnVtYmVyOwotdW5zaWduZWQgSml0dGVyLAotCVJvb3RKaXR0ZXI7Ci10aW1lX3QJ VGFyZ2V0VGltZTsKLQotIyBpZiBERUJVR0dJTkcKLWludAlEZWJ1Z0ZsYWdzOwotY2hhcgkqRGVi dWdGbGFnTmFtZXNbXSA9IHsJLyogc3luYyB3aXRoICNkZWZpbmVzICovCi0JCSJleHQiLCAic2No IiwgInByb2MiLCAicGFycyIsICJsb2FkIiwgIm1pc2MiLCAidGVzdCIsICJiaXQiLAotCQlOVUxM CQkvKiBOVUxMIG11c3QgYmUgbGFzdCBlbGVtZW50ICovCi0JfTsKLSMgZW5kaWYgLyogREVCVUdH SU5HICovCi0jZWxzZSAvKk1BSU5fUFJPR1JBTSovCi1leHRlcm4JY2hhcgkqY29weXJpZ2h0W10s Ci0JCSpNb250aE5hbWVzW10sCi0JCSpEb3dOYW1lc1tdLAotCQkqUHJvZ3JhbU5hbWUsCi0JCSpk ZWZtYWlsdG87Ci1leHRlcm4JaW50CUxpbmVOdW1iZXI7Ci1leHRlcm4gdW5zaWduZWQJSml0dGVy LAotCQlSb290Sml0dGVyOwotZXh0ZXJuCXRpbWVfdAlUYXJnZXRUaW1lOwotZXh0ZXJuIHN0cnVj dCBwaWRmaCAqcGZoOwotIyBpZiBERUJVR0dJTkcKLWV4dGVybglpbnQJRGVidWdGbGFnczsKLWV4 dGVybgljaGFyCSpEZWJ1Z0ZsYWdOYW1lc1tdOwotIyBlbmRpZiAvKiBERUJVR0dJTkcgKi8KLSNl bmRpZiAvKk1BSU5fUFJPR1JBTSovCisjaW5jbHVkZSAicGF0aG5hbWVzLmgiCisjaW5jbHVkZSAi bWFjcm9zLmgiCisjaW5jbHVkZSAic3RydWN0cy5oIgorI2luY2x1ZGUgImZ1bmNzLmgiCisjaW5j bHVkZSAiZ2xvYmFscy5oIgpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2Rh dGFiYXNlLmMgZnJlZWJzZF9jcm9uL2Nyb24vZGF0YWJhc2UuYwotLS0gL3Vzci9zcmMvdXNyLnNi aW4vY3Jvbi9jcm9uL2RhdGFiYXNlLmMJMjAxNC0wMS0xNiAyMTo0Mzo0OS4wMDAwMDAwMDAgKzAx MDAKKysrIGZyZWVic2RfY3Jvbi9jcm9uL2RhdGFiYXNlLmMJMjAxNC0wNi0xMSAxNjo0Mjo1NS4y NzI0NDQyNzYgKzAyMDAKQEAgLTEsNTUgKzEsNDggQEAKIC8qIENvcHlyaWdodCAxOTg4LDE5OTAs MTk5MywxOTk0IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqLworCisv KgorICogQ29weXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwg SW5jLiAoIklTQyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0 d2FyZSBDb25zb3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2VwdDog ZG9uJ3QgcmVtb3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0aW9u IChkb24ndCB0YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChkb24n dAotICogZ2V0IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0ZXIg b3IgcmVtb3ZlIHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBzb3Vy Y2UgaXMgcHJvdmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5kLCBl eHByZXNzIG9yIGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7IHVz ZSBhdCB5b3VyIG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55KSB0 bwotICogYW55b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSByZXN0 cyBlbnRpcmVseSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5 LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9z ZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRo ZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBh cHBlYXIgaW4gYWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4ZXMs IGVuaGFuY2VtZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRyeSB0 byBrZWVwIGEgdmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xsb3dz OgotICogUGF1bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5ldCFk ZWN3cmwhdml4aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5E IElTQyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09G VFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJ TElUWSBBTkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9SCisg KiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT IE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNF LCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwg TkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBPRiBP UiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRX QVJFLgogICovCiAKLSNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQotc3RhdGlj IGNvbnN0IGNoYXIgcmNzaWRbXSA9Ci0gICIkRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNi aW4vY3Jvbi9jcm9uL2RhdGFiYXNlLmMgMTczNDEyIDIwMDctMTEtMDcgMTA6NTM6NDFaIGtldmxv ICQiOwotI2VuZGlmCisvLyNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQorLy9z dGF0aWMgY2hhciByY3NpZFtdID0gIiRJZDogZGF0YWJhc2UuYyx2IDEuNyAyMDA0LzAxLzIzIDE4 OjU2OjQyIHZpeGllIEV4cCAkIjsKKy8vI2VuZGlmCiAKIC8qIHZpeCAyNmphbjg3IFtSQ1MgaGFz IHRoZSBsb2ddCiAgKi8KIAotCiAjaW5jbHVkZSAiY3Jvbi5oIgotI2luY2x1ZGUgPGZjbnRsLmg+ Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvZmlsZS5oPgotCiAKICNkZWZp bmUgVE1BWChhLGIpICgoYSk+KGIpPyhhKTooYikpCiAKLQotc3RhdGljCXZvaWQJCXByb2Nlc3Nf Y3JvbnRhYihjaGFyICosIGNoYXIgKiwgY2hhciAqLAotCQkJCQkgICAgIHN0cnVjdCBzdGF0ICos Ci0JCQkJCSAgICAgY3Jvbl9kYiAqLCBjcm9uX2RiICopOwotCitzdGF0aWMJdm9pZAkJcHJvY2Vz c19jcm9udGFiKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLAorCQkJCQljb25zdCBjaGFyICos IHN0cnVjdCBzdGF0ICosCisJCQkJCWNyb25fZGIgKiwgY3Jvbl9kYiAqKTsKIAogdm9pZAotbG9h ZF9kYXRhYmFzZShvbGRfZGIpCi0JY3Jvbl9kYgkJKm9sZF9kYjsKLXsKLQlESVIJCSpkaXI7Ci0J c3RydWN0IHN0YXQJc3RhdGJ1ZjsKLQlzdHJ1Y3Qgc3RhdAlzeXNjcm9uX3N0YXQ7Ci0JRElSX1Qg ICAJKmRwOwotCWNyb25fZGIJCW5ld19kYjsKLQl1c2VyCQkqdSwgKm51OworbG9hZF9kYXRhYmFz ZShjcm9uX2RiICpvbGRfZGIpIHsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmLCBzeXNjcm9uX3N0YXQ7 CisJY3Jvbl9kYiBuZXdfZGI7CisJRElSX1QgKmRwOworCURJUiAqZGlyOworCXVzZXIgKnUsICpu dTsKIAotCURlYnVnKERMT0FELCAoIlslZF0gbG9hZF9kYXRhYmFzZSgpXG4iLCBnZXRwaWQoKSkp CisJRGVidWcoRExPQUQsICgiWyVsZF0gbG9hZF9kYXRhYmFzZSgpXG4iLCAobG9uZylnZXRwaWQo KSkpCiAKIAkvKiBiZWZvcmUgd2Ugc3RhcnQgbG9hZGluZyBhbnkgZGF0YSwgZG8gYSBzdGF0IG9u IFNQT09MX0RJUgogCSAqIHNvIHRoYXQgaWYgYW55dGhpbmcgY2hhbmdlcyBhcyBvZiB0aGlzIG1v bWVudCAoaS5lLiwgYmVmb3JlIHdlJ3ZlCkBAIC03Myw4ICs2Niw4IEBACiAJICogdGltZSB0aGlz IGZ1bmN0aW9uIGlzIGNhbGxlZC4KIAkgKi8KIAlpZiAob2xkX2RiLT5tdGltZSA9PSBUTUFYKHN0 YXRidWYuc3RfbXRpbWUsIHN5c2Nyb25fc3RhdC5zdF9tdGltZSkpIHsKLQkJRGVidWcoRExPQUQs ICgiWyVkXSBzcG9vbCBkaXIgbXRpbWUgdW5jaCwgbm8gbG9hZCBuZWVkZWQuXG4iLAotCQkJICAg ICAgZ2V0cGlkKCkpKQorCQlEZWJ1ZyhETE9BRCwgKCJbJWxkXSBzcG9vbCBkaXIgbXRpbWUgdW5j aCwgbm8gbG9hZCBuZWVkZWQuXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkpKQogCQlyZXR1 cm47CiAJfQogCkBAIC04NiwxMSArNzksOSBAQAogCW5ld19kYi5tdGltZSA9IFRNQVgoc3RhdGJ1 Zi5zdF9tdGltZSwgc3lzY3Jvbl9zdGF0LnN0X210aW1lKTsKIAluZXdfZGIuaGVhZCA9IG5ld19k Yi50YWlsID0gTlVMTDsKIAotCWlmIChzeXNjcm9uX3N0YXQuc3RfbXRpbWUpIHsKLQkJcHJvY2Vz c19jcm9udGFiKCJyb290IiwgU1lTX05BTUUsCi0JCQkJU1lTQ1JPTlRBQiwgJnN5c2Nyb25fc3Rh dCwKKwlpZiAoc3lzY3Jvbl9zdGF0LnN0X210aW1lKQorCQlwcm9jZXNzX2Nyb250YWIoInJvb3Qi LCBOVUxMLCBTWVNDUk9OVEFCLCAmc3lzY3Jvbl9zdGF0LAogCQkJCSZuZXdfZGIsIG9sZF9kYik7 Ci0JfQogCiAJLyogd2UgdXNlZCB0byBrZWVwIHRoaXMgZGlyIG9wZW4gYWxsIHRoZSB0aW1lLCBm b3IgdGhlIHNha2Ugb2YKIAkgKiBlZmZpY2llbmN5LiAgaG93ZXZlciwgd2UgbmVlZCB0byBjbG9z ZSBpdCBpbiBldmVyeSBmb3JrLCBhbmQKQEAgLTEwMiw4ICs5Myw3IEBACiAJfQogCiAJd2hpbGUg KE5VTEwgIT0gKGRwID0gcmVhZGRpcihkaXIpKSkgewotCQljaGFyCWZuYW1lW01BWE5BTUxFTisx XSwKLQkJCXRhYm5hbWVbTUFYTkFNTEVOKzFdOworCQljaGFyIGZuYW1lW01BWE5BTUxFTisxXSwg dGFibmFtZVtNQVhOQU1MRU4rMV07CiAKIAkJLyogYXZvaWQgZmlsZSBuYW1lcyBiZWdpbm5pbmcg d2l0aCAiLiIuICB0aGlzIGlzIGdvb2QKIAkJICogYmVjYXVzZSB3ZSB3b3VsZCBvdGhlcndpc2Ug d2FzdGUgdHdvIGd1YXJhbnRlZWQgY2FsbHMKQEAgLTExMyw5ICsxMDMsMTMgQEAKIAkJaWYgKGRw LT5kX25hbWVbMF0gPT0gJy4nKQogCQkJY29udGludWU7CiAKLQkJKHZvaWQpIHN0cm5jcHkoZm5h bWUsIGRwLT5kX25hbWUsIHNpemVvZihmbmFtZSkpOwotCQlmbmFtZVtzaXplb2YoZm5hbWUpLTFd ID0gJ1wwJzsKLQkJKHZvaWQpIHNucHJpbnRmKHRhYm5hbWUsIHNpemVvZiB0YWJuYW1lLCBDUk9O X1RBQihmbmFtZSkpOworCQlpZiAoc3RybGVuKGRwLT5kX25hbWUpID49IHNpemVvZiBmbmFtZSkK KwkJCWNvbnRpbnVlOwkvKiBYWFggbG9nPyAqLworCQkodm9pZCkgc3RybGNweShmbmFtZSwgZHAt PmRfbmFtZSwgc2l6ZW9mKGZuYW1lKSk7CisJCQorCQlpZiAoIWdsdWVfc3RyaW5ncyh0YWJuYW1l LCBzaXplb2YgdGFibmFtZSwgU1BPT0xfRElSLAorCQkJCSAgZm5hbWUsICcvJykpCisJCQljb250 aW51ZTsJLyogWFhYIGxvZz8gKi8KIAogCQlwcm9jZXNzX2Nyb250YWIoZm5hbWUsIGZuYW1lLCB0 YWJuYW1lLAogCQkJCSZzdGF0YnVmLCAmbmV3X2RiLCBvbGRfZGIpOwpAQCAtMTQ0LDEyICsxMzgs OCBAQAogCURlYnVnKERMT0FELCAoImxvYWRfZGF0YWJhc2UgaXMgZG9uZVxuIikpCiB9CiAKLQog dm9pZAotbGlua191c2VyKGRiLCB1KQotCWNyb25fZGIJKmRiOwotCXVzZXIJKnU7Ci17CitsaW5r X3VzZXIoY3Jvbl9kYiAqZGIsIHVzZXIgKnUpIHsKIAlpZiAoZGItPmhlYWQgPT0gTlVMTCkKIAkJ ZGItPmhlYWQgPSB1OwogCWlmIChkYi0+dGFpbCkKQEAgLTE1OSwxMiArMTQ5LDggQEAKIAlkYi0+ dGFpbCA9IHU7CiB9CiAKLQogdm9pZAotdW5saW5rX3VzZXIoZGIsIHUpCi0JY3Jvbl9kYgkqZGI7 Ci0JdXNlcgkqdTsKLXsKK3VubGlua191c2VyKGNyb25fZGIgKmRiLCB1c2VyICp1KSB7CiAJaWYg KHUtPnByZXYgPT0gTlVMTCkKIAkJZGItPmhlYWQgPSB1LT5uZXh0OwogCWVsc2UKQEAgLTE3Niw0 MyArMTYyLDM2IEBACiAJCXUtPm5leHQtPnByZXYgPSB1LT5wcmV2OwogfQogCi0KIHVzZXIgKgot ZmluZF91c2VyKGRiLCBuYW1lKQotCWNyb25fZGIJKmRiOwotCWNoYXIJKm5hbWU7Ci17Ci0JY2hh cgkqZW52X2dldCgpOwotCXVzZXIJKnU7CitmaW5kX3VzZXIoY3Jvbl9kYiAqZGIsIGNvbnN0IGNo YXIgKm5hbWUpIHsKKwl1c2VyICp1OwogCiAJZm9yICh1ID0gZGItPmhlYWQ7ICB1ICE9IE5VTEw7 ICB1ID0gdS0+bmV4dCkKLQkJaWYgKCFzdHJjbXAodS0+bmFtZSwgbmFtZSkpCisJCWlmIChzdHJj bXAodS0+bmFtZSwgbmFtZSkgPT0gMCkKIAkJCWJyZWFrOwotCXJldHVybiB1OworCXJldHVybiAo dSk7CiB9CiAKLQogc3RhdGljIHZvaWQKLXByb2Nlc3NfY3JvbnRhYih1bmFtZSwgZm5hbWUsIHRh Ym5hbWUsIHN0YXRidWYsIG5ld19kYiwgb2xkX2RiKQotCWNoYXIJCSp1bmFtZTsKLQljaGFyCQkq Zm5hbWU7Ci0JY2hhcgkJKnRhYm5hbWU7Ci0Jc3RydWN0IHN0YXQJKnN0YXRidWY7Ci0JY3Jvbl9k YgkJKm5ld19kYjsKLQljcm9uX2RiCQkqb2xkX2RiOworcHJvY2Vzc19jcm9udGFiKGNvbnN0IGNo YXIgKnVuYW1lLCBjb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqdGFibmFtZSwKKwkJc3Ry dWN0IHN0YXQgKnN0YXRidWYsIGNyb25fZGIgKm5ld19kYiwgY3Jvbl9kYiAqb2xkX2RiKQogewot CXN0cnVjdCBwYXNzd2QJKnB3ID0gTlVMTDsKLQlpbnQJCWNyb250YWJfZmQgPSBPSyAtIDE7Ci0J dXNlcgkJKnU7CisJc3RydWN0IHBhc3N3ZCAqcHcgPSBOVUxMOworCWludCBjcm9udGFiX2ZkID0g T0sgLSAxOworCXVzZXIgKnU7CiAKLQlpZiAoc3RyY21wKGZuYW1lLCBTWVNfTkFNRSkgJiYgIShw dyA9IGdldHB3bmFtKHVuYW1lKSkpIHsKKwlpZiAoZm5hbWUgPT0gTlVMTCkgeworCQkvKiBtdXN0 IGJlIHNldCB0byBzb21ldGhpbmcgZm9yIGxvZ2dpbmcgcHVycG9zZXMuCisJCSAqLworCQlmbmFt ZSA9ICIqc3lzdGVtKiI7CisJfSBlbHNlIGlmICgocHcgPSBnZXRwd25hbSh1bmFtZSkpID09IE5V TEwpIHsKIAkJLyogZmlsZSBkb2Vzbid0IGhhdmUgYSB1c2VyIGluIHBhc3N3ZCBmaWxlLgogCQkg Ki8KIAkJbG9nX2l0KGZuYW1lLCBnZXRwaWQoKSwgIk9SUEhBTiIsICJubyBwYXNzd2QgZW50cnki KTsKIAkJZ290byBuZXh0X2Nyb250YWI7CiAJfQogCi0JaWYgKChjcm9udGFiX2ZkID0gb3Blbih0 YWJuYW1lLCBPX1JET05MWSwgMCkpIDwgT0spIHsKKwlpZiAoKGNyb250YWJfZmQgPSBvcGVuKHRh Ym5hbWUsIE9fUkRPTkxZfE9fTk9OQkxPQ0t8T19OT0ZPTExPVywgMCkpIDwgT0spIHsKIAkJLyog Y3JvbnRhYiBub3QgYWNjZXNzaWJsZT8KIAkJICovCiAJCWxvZ19pdChmbmFtZSwgZ2V0cGlkKCks ICJDQU4nVCBPUEVOIiwgdGFibmFtZSk7CkBAIC0yMjMsNiArMjAyLDIzIEBACiAJCWxvZ19pdChm bmFtZSwgZ2V0cGlkKCksICJGU1RBVCBGQUlMRUQiLCB0YWJuYW1lKTsKIAkJZ290byBuZXh0X2Ny b250YWI7CiAJfQorCWlmICghU19JU1JFRyhzdGF0YnVmLT5zdF9tb2RlKSkgeworCQlsb2dfaXQo Zm5hbWUsIGdldHBpZCgpLCAiTk9UIFJFR1VMQVIiLCB0YWJuYW1lKTsKKwkJZ290byBuZXh0X2Ny b250YWI7CisJfQorCWlmICgoc3RhdGJ1Zi0+c3RfbW9kZSAmIDA3Nzc3KSAhPSAwNjAwKSB7CisJ CWxvZ19pdChmbmFtZSwgZ2V0cGlkKCksICJCQUQgRklMRSBNT0RFIiwgdGFibmFtZSk7CisJCWdv dG8gbmV4dF9jcm9udGFiOworCX0KKwlpZiAoc3RhdGJ1Zi0+c3RfdWlkICE9IFJPT1RfVUlEICYm IChwdyA9PSBOVUxMIHx8CisJICAgIHN0YXRidWYtPnN0X3VpZCAhPSBwdy0+cHdfdWlkIHx8IHN0 cmNtcCh1bmFtZSwgcHctPnB3X25hbWUpICE9IDApKSB7CisJCWxvZ19pdChmbmFtZSwgZ2V0cGlk KCksICJXUk9ORyBGSUxFIE9XTkVSIiwgdGFibmFtZSk7CisJCWdvdG8gbmV4dF9jcm9udGFiOwor CX0KKwlpZiAoc3RhdGJ1Zi0+c3RfbmxpbmsgIT0gMSkgeworCQlsb2dfaXQoZm5hbWUsIGdldHBp ZCgpLCAiQkFEIExJTksgQ09VTlQiLCB0YWJuYW1lKTsKKwkJZ290byBuZXh0X2Nyb250YWI7CisJ fQogCiAJRGVidWcoRExPQUQsICgiXHQlczoiLCBmbmFtZSkpCiAJdSA9IGZpbmRfdXNlcihvbGRf ZGIsIGZuYW1lKTsKQEAgLTI1NSw3ICsyNTEsNyBAQAogCQlsaW5rX3VzZXIobmV3X2RiLCB1KTsK IAl9CiAKLW5leHRfY3JvbnRhYjoKKyBuZXh0X2Nyb250YWI6CiAJaWYgKGNyb250YWJfZmQgPj0g T0spIHsKIAkJRGVidWcoRExPQUQsICgiIFtkb25lXVxuIikpCiAJCWNsb3NlKGNyb250YWJfZmQp OwpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2RvX2NvbW1hbmQuYyBmcmVl YnNkX2Nyb24vY3Jvbi9kb19jb21tYW5kLmMKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jv bi9kb19jb21tYW5kLmMJMjAxNC0wMS0xNiAyMTo0Mzo0OS4wMDAwMDAwMDAgKzAxMDAKKysrIGZy ZWVic2RfY3Jvbi9jcm9uL2RvX2NvbW1hbmQuYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MjQ0NDI3 NiArMDIwMApAQCAtMSw1NCArMSw0OSBAQAogLyogQ29weXJpZ2h0IDE5ODgsMTk5MCwxOTkzLDE5 OTQgYnkgUGF1bCBWaXhpZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICovCisKKy8qCisgKiBD b3B5cmlnaHQgKGMpIDIwMDQgYnkgSW50ZXJuZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuICgi SVNDIikKKyAqIENvcHlyaWdodCAoYykgMTk5NywyMDAwIGJ5IEludGVybmV0IFNvZnR3YXJlIENv bnNvcnRpdW0sIEluYy4KICAqCi0gKiBEaXN0cmlidXRlIGZyZWVseSwgZXhjZXB0OiBkb24ndCBy ZW1vdmUgbXkgbmFtZSBmcm9tIHRoZSBzb3VyY2Ugb3IKLSAqIGRvY3VtZW50YXRpb24gKGRvbid0 IHRha2UgY3JlZGl0IGZvciBteSB3b3JrKSwgbWFyayB5b3VyIGNoYW5nZXMgKGRvbid0Ci0gKiBn ZXQgbWUgYmxhbWVkIGZvciB5b3VyIHBvc3NpYmxlIGJ1Z3MpLCBkb24ndCBhbHRlciBvciByZW1v dmUgdGhpcwotICogbm90aWNlLiAgTWF5IGJlIHNvbGQgaWYgYnVpbGRhYmxlIHNvdXJjZSBpcyBw cm92aWRlZCB0byBidXllci4gIE5vCi0gKiB3YXJyYW50ZWUgb2YgYW55IGtpbmQsIGV4cHJlc3Mg b3IgaW1wbGllZCwgaXMgaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBzb2Z0d2FyZTsgdXNlIGF0IHlv dXIgb3duIHJpc2ssIHJlc3BvbnNpYmlsaXR5IGZvciBkYW1hZ2VzIChpZiBhbnkpIHRvCi0gKiBh bnlvbmUgcmVzdWx0aW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIHJlc3RzIGVudGly ZWx5IHdpdGggdGhlCi0gKiB1c2VyLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlm eSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGgg b3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3Zl CisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBp biBhbGwgY29waWVzLgogICoKLSAqIFNlbmQgYnVnIHJlcG9ydHMsIGJ1ZyBmaXhlcywgZW5oYW5j ZW1lbnRzLCByZXF1ZXN0cywgZmxhbWVzLCBldGMuLCBhbmQKLSAqIEknbGwgdHJ5IHRvIGtlZXAg YSB2ZXJzaW9uIHVwIHRvIGRhdGUuICBJIGNhbiBiZSByZWFjaGVkIGFzIGZvbGxvd3M6Ci0gKiBQ YXVsIFZpeGllICAgICAgICAgIDxwYXVsQHZpeC5jb20+ICAgICAgICAgIHV1bmV0IWRlY3dybCF2 aXhpZSFwYXVsCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJ U0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJ TkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFO RCBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgSVNDIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBT UEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5Z IERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEg T1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdF TkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENP Tk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAg Ki8KIAotI2lmICFkZWZpbmVkKGxpbnQpICYmICFkZWZpbmVkKExJTlQpCi1zdGF0aWMgY29uc3Qg Y2hhciByY3NpZFtdID0KLSAgIiRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9u L2Nyb24vZG9fY29tbWFuZC5jIDIyODk5MCAyMDExLTEyLTMwIDEwOjU4OjE0WiB1cXMgJCI7Ci0j ZW5kaWYKLQorLy8jaWYgIWRlZmluZWQobGludCkgJiYgIWRlZmluZWQoTElOVCkKKy8vc3RhdGlj IGNoYXIgcmNzaWRbXSA9ICIkSWQ6IGRvX2NvbW1hbmQuYyx2IDEuOSAyMDA0LzAxLzIzIDE4OjU2 OjQyIHZpeGllIEV4cCAkIjsKKy8vI2VuZGlmCiAKICNpbmNsdWRlICJjcm9uLmgiCi0jaW5jbHVk ZSA8c3lzL3NpZ25hbC5oPgorCiAjaWYgZGVmaW5lZChzZXF1ZW50KQogIyBpbmNsdWRlIDxzeXMv dW5pdmVyc2UuaD4KICNlbmRpZgotI2lmIGRlZmluZWQoU1lTTE9HKQotIyBpbmNsdWRlIDxzeXNs b2cuaD4KLSNlbmRpZgorCiAjaWYgZGVmaW5lZChMT0dJTl9DQVApCiAjIGluY2x1ZGUgPGxvZ2lu X2NhcC5oPgogI2VuZGlmCisKICNpZmRlZiBQQU0KICMgaW5jbHVkZSA8c2VjdXJpdHkvcGFtX2Fw cGwuaD4KICMgaW5jbHVkZSA8c2VjdXJpdHkvb3BlbnBhbS5oPgogI2VuZGlmCi0KLQotc3RhdGlj IHZvaWQJCWNoaWxkX3Byb2Nlc3MoZW50cnkgKiwgdXNlciAqKSwKLQkJCWRvX3VuaXYodXNlciAq KTsKLQorc3RhdGljIHZvaWQJCWNoaWxkX3Byb2Nlc3MoZW50cnkgKiwgdXNlciAqKTsKK3N0YXRp YyBpbnQJCXNhZmVfcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CiAKIHZvaWQKLWRvX2Nv bW1hbmQoZSwgdSkKLQllbnRyeQkqZTsKLQl1c2VyCSp1OwoteworZG9fY29tbWFuZChlbnRyeSAq ZSwgdXNlciAqdSkgewogCURlYnVnKERQUk9DLCAoIlslZF0gZG9fY29tbWFuZCglcywgKCVzLCVk LCVkKSlcbiIsCi0JCWdldHBpZCgpLCBlLT5jbWQsIHUtPm5hbWUsIGUtPnVpZCwgZS0+Z2lkKSkK KwkJICAgICAgZ2V0cGlkKCksIGUtPmNtZCwgdS0+bmFtZSwgZS0+dWlkLCBlLT5naWQpKQogCiAJ LyogZm9yayB0byBiZWNvbWUgYXN5bmNocm9ub3VzIC0tIHBhcmVudCBwcm9jZXNzIGlzIGRvbmUg aW1tZWRpYXRlbHksCiAJICogYW5kIGNvbnRpbnVlcyB0byBydW4gdGhlIG5vcm1hbCBjcm9uIGNv ZGUsIHdoaWNoIG1lYW5zIHJldHVybiB0bwpAQCAtNTksNDEgKzU0LDM4IEBACiAJICovCiAJc3dp dGNoIChmb3JrKCkpIHsKIAljYXNlIC0xOgotCQlsb2dfaXQoIkNST04iLGdldHBpZCgpLCJlcnJv ciIsImNhbid0IGZvcmsiKTsKKwkJbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJlcnJvciIsICJj YW4ndCBmb3JrIik7CiAJCWJyZWFrOwogCWNhc2UgMDoKIAkJLyogY2hpbGQgcHJvY2VzcyAqLwog CQlwaWRmaWxlX2Nsb3NlKHBmaCk7CiAJCWNoaWxkX3Byb2Nlc3MoZSwgdSk7Ci0JCURlYnVnKERQ Uk9DLCAoIlslZF0gY2hpbGQgcHJvY2VzcyBkb25lLCBleGl0aW5nXG4iLCBnZXRwaWQoKSkpCisJ CURlYnVnKERQUk9DLCAoIlslbGRdIGNoaWxkIHByb2Nlc3MgZG9uZSwgZXhpdGluZ1xuIiwKKwkJ CSAgICAgIChsb25nKWdldHBpZCgpKSkKIAkJX2V4aXQoT0tfRVhJVCk7CiAJCWJyZWFrOwogCWRl ZmF1bHQ6CiAJCS8qIHBhcmVudCBwcm9jZXNzICovCiAJCWJyZWFrOwogCX0KLQlEZWJ1ZyhEUFJP QywgKCJbJWRdIG1haW4gcHJvY2VzcyByZXR1cm5pbmcgdG8gd29ya1xuIiwgZ2V0cGlkKCkpKQor CURlYnVnKERQUk9DLCAoIlslbGRdIG1haW4gcHJvY2VzcyByZXR1cm5pbmcgdG8gd29ya1xuIiwo bG9uZylnZXRwaWQoKSkpCiB9CiAKLQogc3RhdGljIHZvaWQKLWNoaWxkX3Byb2Nlc3MoZSwgdSkK LQllbnRyeQkqZTsKLQl1c2VyCSp1OwotewotCWludAkJc3RkaW5fcGlwZVsyXSwgc3Rkb3V0X3Bp cGVbMl07Ci0JcmVnaXN0ZXIgY2hhcgkqaW5wdXRfZGF0YTsKLQljaGFyCQkqdXNlcm5tLCAqbWFp bHRvOwotCWludAkJY2hpbGRyZW4gPSAwOworY2hpbGRfcHJvY2VzcyhlbnRyeSAqZSwgdXNlciAq dSkgeworCWludCBzdGRpbl9waXBlWzJdLCBzdGRvdXRfcGlwZVsyXTsKKwljaGFyICppbnB1dF9k YXRhLCAqdXNlcm5tLCAqbWFpbHRvOworCWludCBjaGlsZHJlbiA9IDA7CisKICMgaWYgZGVmaW5l ZChMT0dJTl9DQVApCi0Jc3RydWN0IHBhc3N3ZAkqcHdkOworCXN0cnVjdCBwYXNzd2QgKnB3ZDsK IAlsb2dpbl9jYXBfdCAqbGM7CiAjIGVuZGlmCiAKLQlEZWJ1ZyhEUFJPQywgKCJbJWRdIGNoaWxk X3Byb2Nlc3MoJyVzJylcbiIsIGdldHBpZCgpLCBlLT5jbWQpKQorCURlYnVnKERQUk9DLCAoIlsl bGRdIGNoaWxkX3Byb2Nlc3MoJyVzJylcbiIsIChsb25nKWdldHBpZCgpLCBlLT5jbWQpKQogCi0J LyogbWFyayBvdXJzZWx2ZXMgYXMgZGlmZmVyZW50IHRvIFBTIGNvbW1hbmQgd2F0Y2hlcnMgYnkg dXBzaGlmdGluZwotCSAqIG91ciBwcm9ncmFtIG5hbWUuICBUaGlzIGhhcyBubyBlZmZlY3Qgb24g c29tZSBrZXJuZWxzLgorCS8qIG1hcmsgb3Vyc2VsdmVzIGFzIGRpZmZlcmVudCB0byBQUyBjb21t YW5kIHdhdGNoZXJzIGJ5IHVwc2hpdGluZworCSAqIG91ciBwcm9ncmFtIG5hbWUuIFRoaXMgaGFz IG5vIGVmZmVjdCBvbiBzb21lIGtlcm5lbHMuCiAJICovCiAJc2V0cHJvY3RpdGxlKCJydW5uaW5n IGpvYiIpOwogCkBAIC0xMDMsODggKzk1LDgwIEBACiAJbWFpbHRvID0gZW52X2dldCgiTUFJTFRP IiwgZS0+ZW52cCk7CiAKICNpZmRlZiBQQU0KLQkvKiB1c2UgUEFNIHRvIHNlZSBpZiB0aGUgdXNl cidzIGFjY291bnQgaXMgYXZhaWxhYmxlLAotCSAqIGkuZS4sIG5vdCBsb2NrZWQgb3IgZXhwaXJl ZCBvciB3aGF0ZXZlci4gIHNraXAgdGhpcwotCSAqIGZvciBzeXN0ZW0gdGFza3MgZnJvbSAvZXRj L2Nyb250YWIgLS0gdGhleSBjYW4gcnVuCi0JICogYXMgYW55IHVzZXIuCi0JICovCi0JaWYgKHN0 cmNtcCh1LT5uYW1lLCBTWVNfTkFNRSkpIHsJLyogbm90IGVxdWFsICovCi0JCXBhbV9oYW5kbGVf dCAqcGFtaCA9IE5VTEw7Ci0JCWludCBwYW1fZXJyOwotCQlzdHJ1Y3QgcGFtX2NvbnYgcGFtYyA9 IHsKLQkJCS5jb252ID0gb3BlbnBhbV9udWxsY29udiwKLQkJCS5hcHBkYXRhX3B0ciA9IE5VTEwK LQkJfTsKLQotCQlEZWJ1ZyhEUFJPQywgKCJbJWRdIGNoZWNraW5nIGFjY291bnQgd2l0aCBQQU1c biIsIGdldHBpZCgpKSkKLQotCQkvKiB1LT5uYW1lIGtlZXBzIGNyb250YWIgb3duZXIgbmFtZSB3 aGlsZSBMT0dOQU1FIGlzIHRoZSBuYW1lCi0JCSAqIG9mIHVzZXIgdG8gcnVuIGNvbW1hbmQgb24g YmVoYWxmIG9mLiAgdGhleSBzaG91bGQgYmUgdGhlCi0JCSAqIHNhbWUgZm9yIGEgdGFzayBmcm9t IGEgcGVyLXVzZXIgY3JvbnRhYi4KLQkJICovCi0JCWlmIChzdHJjbXAodS0+bmFtZSwgdXNlcm5t KSkgewotCQkJbG9nX2l0KHVzZXJubSwgZ2V0cGlkKCksICJ1c2VybmFtZSBhbWJpZ3VpdHkiLCB1 LT5uYW1lKTsKLQkJCWV4aXQoRVJST1JfRVhJVCk7Ci0JCX0KLQotCQlwYW1fZXJyID0gcGFtX3N0 YXJ0KCJjcm9uIiwgdXNlcm5tLCAmcGFtYywgJnBhbWgpOwotCQlpZiAocGFtX2VyciAhPSBQQU1f U1VDQ0VTUykgewotCQkJbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJlcnJvciIsICJjYW4ndCBz dGFydCBQQU0iKTsKLQkJCWV4aXQoRVJST1JfRVhJVCk7Ci0JCX0KKyAgICAgICAgLyogdXNlIFBB TSB0byBzZWUgaWYgdGhlIHVzZXIncyBhY2NvdW50IGlzIGF2YWlsYWJsZSwKKyAgICAgICAgICog aS5lLiwgbm90IGxvY2tlZCBvciBleHBpcmVkIG9yIHdoYXRldmVyLiAgc2tpcCB0aGlzCisgICAg ICAgICAqIGZvciBzeXN0ZW0gdGFza3MgZnJvbSAvZXRjL2Nyb250YWIgLS0gdGhleSBjYW4gcnVu CisgICAgICAgICAqIGFzIGFueSB1c2VyLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHN0cmNt cCh1LT5uYW1lLCBTWVNfTkFNRSkpIHsgICAgICAgIC8qIG5vdCBlcXVhbCAqLworICAgICAgICAg ICAgICAgIHBhbV9oYW5kbGVfdCAqcGFtaCA9IE5VTEw7CisgICAgICAgICAgICAgICAgaW50IHBh bV9lcnI7CisgICAgICAgICAgICAgICAgc3RydWN0IHBhbV9jb252IHBhbWMgPSB7CisgICAgICAg ICAgICAgICAgICAgICAgICAuY29udiA9IG9wZW5wYW1fbnVsbGNvbnYsCisgICAgICAgICAgICAg ICAgICAgICAgICAuYXBwZGF0YV9wdHIgPSBOVUxMCisgICAgICAgICAgICAgICAgfTsKKworICAg ICAgICAgICAgICAgIERlYnVnKERQUk9DLCAoIlslZF0gY2hlY2tpbmcgYWNjb3VudCB3aXRoIFBB TVxuIiwgZ2V0cGlkKCkpKQorCisgICAgICAgICAgICAgICAgLyogdS0+bmFtZSBrZWVwcyBjcm9u dGFiIG93bmVyIG5hbWUgd2hpbGUgTE9HTkFNRSBpcyB0aGUgbmFtZQorICAgICAgICAgICAgICAg ICAqIG9mIHVzZXIgdG8gcnVuIGNvbW1hbmQgb24gYmVoYWxmIG9mLiAgdGhleSBzaG91bGQgYmUg dGhlCisgICAgICAgICAgICAgICAgICogc2FtZSBmb3IgYSB0YXNrIGZyb20gYSBwZXItdXNlciBj cm9udGFiLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChzdHJjbXAo dS0+bmFtZSwgdXNlcm5tKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nX2l0KHVzZXJu bSwgZ2V0cGlkKCksICJ1c2VybmFtZSBhbWJpZ3VpdHkiLCB1LT5uYW1lKTsKKyAgICAgICAgICAg ICAgICAgICAgICAgIGV4aXQoRVJST1JfRVhJVCk7CisgICAgICAgICAgICAgICAgfQorCisgICAg ICAgICAgICAgICAgcGFtX2VyciA9IHBhbV9zdGFydCgiY3JvbiIsIHVzZXJubSwgJnBhbWMsICZw YW1oKTsKKyAgICAgICAgICAgICAgICBpZiAocGFtX2VyciAhPSBQQU1fU1VDQ0VTUykgeworICAg ICAgICAgICAgICAgICAgICAgICAgbG9nX2l0KCJDUk9OIiwgZ2V0cGlkKCksICJlcnJvciIsICJj YW4ndCBzdGFydCBQQU0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVJST1JfRVhJ VCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGFtX2VyciA9IHBhbV9h Y2N0X21nbXQocGFtaCwgUEFNX1NJTEVOVCk7CisgICAgICAgICAgICAgICAgLyogRXhwaXJlZCBw YXNzd29yZCBzaG91bGRuJ3QgcHJldmVudCB0aGUgam9iIGZyb20gcnVubmluZy4gKi8KKyAgICAg ICAgICAgICAgICBpZiAocGFtX2VyciAhPSBQQU1fU1VDQ0VTUyAmJiBwYW1fZXJyICE9IFBBTV9O RVdfQVVUSFRPS19SRVFEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaXQodXNlcm5t LCBnZXRwaWQoKSwgIlVTRVIiLCAiYWNjb3VudCB1bmF2YWlsYWJsZSIpOworICAgICAgICAgICAg ICAgICAgICAgICAgZXhpdChFUlJPUl9FWElUKTsKKyAgICAgICAgICAgICAgICB9CiAKLQkJcGFt X2VyciA9IHBhbV9hY2N0X21nbXQocGFtaCwgUEFNX1NJTEVOVCk7Ci0JCS8qIEV4cGlyZWQgcGFz c3dvcmQgc2hvdWxkbid0IHByZXZlbnQgdGhlIGpvYiBmcm9tIHJ1bm5pbmcuICovCi0JCWlmIChw YW1fZXJyICE9IFBBTV9TVUNDRVNTICYmIHBhbV9lcnIgIT0gUEFNX05FV19BVVRIVE9LX1JFUUQp IHsKLQkJCWxvZ19pdCh1c2Vybm0sIGdldHBpZCgpLCAiVVNFUiIsICJhY2NvdW50IHVuYXZhaWxh YmxlIik7Ci0JCQlleGl0KEVSUk9SX0VYSVQpOwotCQl9Ci0KLQkJcGFtX2VuZChwYW1oLCBwYW1f ZXJyKTsKLQl9CisgICAgICAgICAgICAgICAgcGFtX2VuZChwYW1oLCBwYW1fZXJyKTsKKyAgICAg ICAgfQogI2VuZGlmCiAKLSNpZmRlZiBVU0VfU0lHQ0hMRAogCS8qIG91ciBwYXJlbnQgaXMgd2F0 Y2hpbmcgZm9yIG91ciBkZWF0aCBieSBjYXRjaGluZyBTSUdDSExELiAgd2UKIAkgKiBkbyBub3Qg Y2FyZSB0byB3YXRjaCBmb3Igb3VyIGNoaWxkcmVuJ3MgZGVhdGhzIHRoaXMgd2F5IC0tIHdlCi0J ICogdXNlIHdhaXQoKSBleHBsaWNpdGx5LiAgc28gd2UgaGF2ZSB0byBkaXNhYmxlIHRoZSBzaWdu YWwgKHdoaWNoCisJICogdXNlIHdhaXQoKSBleHBsaWNpdGx5LiAgc28gd2UgaGF2ZSB0byByZXNl dCB0aGUgc2lnbmFsICh3aGljaAogCSAqIHdhcyBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50KS4K IAkgKi8KIAkodm9pZCkgc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOwotI2Vsc2UKLQkvKiBvbiBz eXN0ZW0tViBzeXN0ZW1zLCB3ZSBhcmUgaWdub3JpbmcgU0lHQ0xELiAgd2UgaGF2ZSB0byBzdG9w Ci0JICogaWdub3JpbmcgaXQgbm93IG9yIHRoZSB3YWl0KCkgaW4gY3Jvbl9wY2xvc2UoKSB3b24n dCB3b3JrLgotCSAqIGJlY2F1c2Ugb2YgdGhpcywgd2UgaGF2ZSB0byB3YWl0KCkgZm9yIG91ciBj aGlsZHJlbiBoZXJlLCBhcyB3ZWxsLgotCSAqLwotCSh2b2lkKSBzaWduYWwoU0lHQ0xELCBTSUdf REZMKTsKLSNlbmRpZiAvKkJTRCovCiAKIAkvKiBjcmVhdGUgc29tZSBwaXBlcyB0byB0YWxrIHRv IG91ciBmdXR1cmUgY2hpbGQKIAkgKi8KIAlwaXBlKHN0ZGluX3BpcGUpOwkvKiBjaGlsZCdzIHN0 ZGluICovCiAJcGlwZShzdGRvdXRfcGlwZSk7CS8qIGNoaWxkJ3Mgc3Rkb3V0ICovCi0KKwkKIAkv KiBzaW5jZSB3ZSBhcmUgYSBmb3JrZWQgcHJvY2Vzcywgd2UgY2FuIGRpZGRsZSB0aGUgY29tbWFu ZCBzdHJpbmcKIAkgKiB3ZSB3ZXJlIHBhc3NlZCAtLSBub2JvZHkgZWxzZSBpcyBnb2luZyB0byB1 c2UgaXQgYWdhaW4sIHJpZ2h0PwogCSAqCiAJICogaWYgYSAlIGlzIHByZXNlbnQgaW4gdGhlIGNv bW1hbmQsIHByZXZpb3VzIGNoYXJhY3RlcnMgYXJlIHRoZQogCSAqIGNvbW1hbmQsIGFuZCBzdWJz ZXF1ZW50IGNoYXJhY3RlcnMgYXJlIHRoZSBhZGRpdGlvbmFsIGlucHV0IHRvCi0JICogdGhlIGNv bW1hbmQuICBTdWJzZXF1ZW50ICUncyB3aWxsIGJlIHRyYW5zZm9ybWVkIGludG8gbmV3bGluZXMs CisJICogdGhlIGNvbW1hbmQuICBBbiBlc2NhcGVkICUgd2lsbCBoYXZlIHRoZSBlc2NhcGUgY2hh cmFjdGVyIHN0cmlwcGVkCisJICogZnJvbSBpdC4gIFN1YnNlcXVlbnQgJSdzIHdpbGwgYmUgdHJh bnNmb3JtZWQgaW50byBuZXdsaW5lcywKIAkgKiBidXQgdGhhdCBoYXBwZW5zIGxhdGVyLgotCSAq Ci0JICogSWYgdGhlcmUgYXJlIGVzY2FwZWQgJSdzLCByZW1vdmUgdGhlIGVzY2FwZSBjaGFyYWN0 ZXIuCiAJICovCiAJLypsb2NhbCovewotCQlyZWdpc3RlciBpbnQgZXNjYXBlZCA9IEZBTFNFOwot CQlyZWdpc3RlciBpbnQgY2g7Ci0JCXJlZ2lzdGVyIGNoYXIgKnA7CisJCWludCBlc2NhcGVkID0g RkFMU0U7CisJCWludCBjaDsKKwkJY2hhciAqcDsKIAotCQlmb3IgKGlucHV0X2RhdGEgPSBwID0g ZS0+Y21kOyAoY2ggPSAqaW5wdXRfZGF0YSk7CisJCWZvciAoaW5wdXRfZGF0YSA9IHAgPSBlLT5j bWQ7CisJCSAgICAgKGNoID0gKmlucHV0X2RhdGEpICE9ICdcMCc7CiAJCSAgICAgaW5wdXRfZGF0 YSsrLCBwKyspIHsKIAkJCWlmIChwICE9IGlucHV0X2RhdGEpCi0JCQkgICAgKnAgPSBjaDsKKwkJ CQkqcCA9IGNoOwogCQkJaWYgKGVzY2FwZWQpIHsKLQkJCQlpZiAoY2ggPT0gJyUnIHx8IGNoID09 ICdcXCcpCisJCQkJaWYgKGNoID09ICclJykKIAkJCQkJKi0tcCA9IGNoOwogCQkJCWVzY2FwZWQg PSBGQUxTRTsKIAkJCQljb250aW51ZTsKQEAgLTIwNSwyNiArMTg5LDI0IEBACiAJICovCiAJc3dp dGNoICh2Zm9yaygpKSB7CiAJY2FzZSAtMToKLQkJbG9nX2l0KCJDUk9OIixnZXRwaWQoKSwiZXJy b3IiLCJjYW4ndCB2Zm9yayIpOworCQlsb2dfaXQoIkNST04iLCBnZXRwaWQoKSwgImVycm9yIiwg ImNhbid0IHZmb3JrIik7CiAJCWV4aXQoRVJST1JfRVhJVCk7CiAJCS8qTk9UUkVBQ0hFRCovCiAJ Y2FzZSAwOgotCQlEZWJ1ZyhEUFJPQywgKCJbJWRdIGdyYW5kY2hpbGQgcHJvY2VzcyBWZm9yaygp J2VkXG4iLAotCQkJICAgICAgZ2V0cGlkKCkpKQotCisJCURlYnVnKERQUk9DLCAoIlslbGRdIGdy YW5kY2hpbGQgcHJvY2VzcyB2Zm9yaygpJ2VkXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkp KQogCQlpZiAoZS0+dWlkID09IFJPT1RfVUlEKQogCQkJSml0dGVyID0gUm9vdEppdHRlcjsKIAkJ aWYgKEppdHRlciAhPSAwKSB7CiAJCQlzcmFuZG9tKGdldHBpZCgpKTsKIAkJCXNsZWVwKHJhbmRv bSgpICUgSml0dGVyKTsKIAkJfQotCiAJCS8qIHdyaXRlIGEgbG9nIG1lc3NhZ2UuICB3ZSd2ZSB3 YWl0ZWQgdGhpcyBsb25nIHRvIGRvIGl0CiAJCSAqIGJlY2F1c2UgaXQgd2FzIG5vdCB1bnRpbCBu b3cgdGhhdCB3ZSBrbmV3IHRoZSBQSUQgdGhhdAogCQkgKiB0aGUgYWN0dWFsIHVzZXIgY29tbWFu ZCBzaGVsbCB3YXMgZ29pbmcgdG8gZ2V0IGFuZCB0aGUKIAkJICogUElEIGlzIHBhcnQgb2YgdGhl IGxvZyBtZXNzYWdlLgogCQkgKi8KLQkJLypsb2NhbCoveworCQlpZiAoKGUtPmZsYWdzICYgRE9O VF9MT0cpID09IDApIHsKIAkJCWNoYXIgKnggPSBta3ByaW50cygodV9jaGFyICopZS0+Y21kLCBz dHJsZW4oZS0+Y21kKSk7CiAKIAkJCWxvZ19pdCh1c2Vybm0sIGdldHBpZCgpLCAiQ01EIiwgeCk7 CkBAIC0yMzMsOSArMjE1LDcgQEAKIAogCQkvKiB0aGF0J3MgdGhlIGxhc3QgdGhpbmcgd2UnbGwg bG9nLiAgY2xvc2UgdGhlIGxvZyBmaWxlcy4KIAkJICovCi0jaWZkZWYgU1lTTE9HCi0JCWNsb3Nl bG9nKCk7Ci0jZW5kaWYKKwkJbG9nX2Nsb3NlKCk7CiAKIAkJLyogZ2V0IG5ldyBwZ3JwLCB2b2lk IHR0eSwgZXRjLgogCQkgKi8KQEAgLTI1Myw3NSArMjMzLDc1IEBACiAJCS8qIGdyYW5kY2hpbGQg cHJvY2Vzcy4gIG1ha2Ugc3Rke2luLG91dH0gYmUgdGhlIGVuZHMgb2YKIAkJICogcGlwZXMgb3Bl bmVkIGJ5IG91ciBkYWRkeTsgbWFrZSBzdGRlcnIgZ28gdG8gc3Rkb3V0LgogCQkgKi8KLQkJY2xv c2UoU1RESU4pOwlkdXAyKHN0ZGluX3BpcGVbUkVBRF9QSVBFXSwgU1RESU4pOwotCQljbG9zZShT VERPVVQpOwlkdXAyKHN0ZG91dF9waXBlW1dSSVRFX1BJUEVdLCBTVERPVVQpOwotCQljbG9zZShT VERFUlIpOwlkdXAyKFNURE9VVCwgU1RERVJSKTsKLQotCQkvKiBjbG9zZSB0aGUgcGlwZXMgd2Ug anVzdCBkdXAnZWQuICBUaGUgcmVzb3VyY2VzIHdpbGwgcmVtYWluLgotCQkgKi8KLQkJY2xvc2Uo c3RkaW5fcGlwZVtSRUFEX1BJUEVdKTsKLQkJY2xvc2Uoc3Rkb3V0X3BpcGVbV1JJVEVfUElQRV0p OwotCi0JCS8qIHNldCBvdXIgbG9naW4gdW5pdmVyc2UuICBEbyB0aGlzIGluIHRoZSBncmFuZGNo aWxkCi0JCSAqIHNvIHRoYXQgdGhlIGNoaWxkIGNhbiBpbnZva2UgL3Vzci9saWIvc2VuZG1haWwK LQkJICogd2l0aG91dCBzdXJwcmlzZXMuCi0JCSAqLwotCQlkb191bml2KHUpOwotCi0jIGlmIGRl ZmluZWQoTE9HSU5fQ0FQKQotCQkvKiBTZXQgdXNlcidzIGVudGlyZSBjb250ZXh0LCBidXQgc2tp cCB0aGUgZW52aXJvbm1lbnQKLQkJICogYXMgY3JvbiBwcm92aWRlcyBhIHNlcGFyYXRlIGludGVy ZmFjZSBmb3IgdGhpcwotCQkgKi8KLQkJaWYgKChwd2QgPSBnZXRwd25hbSh1c2Vybm0pKSA9PSBO VUxMKQotCQkJcHdkID0gZ2V0cHd1aWQoZS0+dWlkKTsKLQkJbGMgPSBOVUxMOwotCQlpZiAocHdk ICE9IE5VTEwpIHsKLQkJCXB3ZC0+cHdfZ2lkID0gZS0+Z2lkOwotCQkJaWYgKGUtPmNsYXNzICE9 IE5VTEwpCi0JCQkJbGMgPSBsb2dpbl9nZXRjbGFzcyhlLT5jbGFzcyk7Ci0JCX0KLQkJaWYgKHB3 ZCAmJgotCQkgICAgc2V0dXNlcmNvbnRleHQobGMsIHB3ZCwgZS0+dWlkLAotCQkJICAgIExPR0lO X1NFVEFMTCAmIH4oTE9HSU5fU0VUUEFUSHxMT0dJTl9TRVRFTlYpKSA9PSAwKQotCQkJKHZvaWQp IGVuZHB3ZW50KCk7Ci0JCWVsc2UgewotCQkJLyogZmFsbCBiYWNrIHRvIHRoZSBvbGQgbWV0aG9k ICovCi0JCQkodm9pZCkgZW5kcHdlbnQoKTsKLSMgZW5kaWYKLQkJCS8qIHNldCBvdXIgZGlyZWN0 b3J5LCB1aWQgYW5kIGdpZC4gIFNldCBnaWQgZmlyc3QsCi0JCQkgKiBzaW5jZSBvbmNlIHdlIHNl dCB1aWQsIHdlJ3ZlIGxvc3Qgcm9vdCBwcml2aWxlZ2VzLgotCQkJICovCi0JCQlpZiAoc2V0Z2lk KGUtPmdpZCkgIT0gMCkgewotCQkJCWxvZ19pdCh1c2Vybm0sIGdldHBpZCgpLAotCQkJCSAgICAi ZXJyb3IiLCAic2V0Z2lkIGZhaWxlZCIpOwotCQkJCWV4aXQoRVJST1JfRVhJVCk7Ci0JCQl9CisJ CWlmIChzdGRpbl9waXBlW1JFQURfUElQRV0gIT0gU1RESU4pIHsKKwkJCWR1cDIoc3RkaW5fcGlw ZVtSRUFEX1BJUEVdLCBTVERJTik7CisJCQljbG9zZShzdGRpbl9waXBlW1JFQURfUElQRV0pOwor CQl9CisJCWlmIChzdGRvdXRfcGlwZVtXUklURV9QSVBFXSAhPSBTVERPVVQpIHsKKwkJCWR1cDIo c3Rkb3V0X3BpcGVbV1JJVEVfUElQRV0sIFNURE9VVCk7CisJCQljbG9zZShzdGRvdXRfcGlwZVtX UklURV9QSVBFXSk7CisJCX0KKwkJZHVwMihTVERPVVQsIFNUREVSUik7CisKKworI2lmZGVmIExP R0lOX0NBUAorIC8qIFNldCB1c2VyJ3MgZW50aXJlIGNvbnRleHQsIGJ1dCBza2lwIHRoZSBlbnZp cm9ubWVudAorICAgICAgICAgICAgICAgICAqIGFzIGNyb24gcHJvdmlkZXMgYSBzZXBhcmF0ZSBp bnRlcmZhY2UgZm9yIHRoaXMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBp ZiAoKHB3ZCA9IGdldHB3bmFtKHVzZXJubSkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAg ICAgICBwd2QgPSBnZXRwd3VpZChlLT51aWQpOworICAgICAgICAgICAgICAgIGxjID0gTlVMTDsK KyAgICAgICAgICAgICAgICBpZiAocHdkICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAg ICAgIHB3ZC0+cHdfZ2lkID0gZS0+Z2lkOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUt PmNsYXNzICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjID0gbG9n aW5fZ2V0Y2xhc3MoZS0+Y2xhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg ICBpZiAocHdkICYmCisgICAgICAgICAgICAgICAgICAgIHNldHVzZXJjb250ZXh0KGxjLCBwd2Qs IGUtPnVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dJTl9TRVRBTEwgJiB+KExP R0lOX1NFVFBBVEh8TE9HSU5fU0VURU5WKSkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAg ICh2b2lkKSBlbmRwd2VudCgpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAg ICAgICAgICAgICAgLyogZmFsbCBiYWNrIHRvIHRoZSBvbGQgbWV0aG9kICovCisgICAgICAgICAg ICAgICAgICAgICAgICAodm9pZCkgZW5kcHdlbnQoKTsKKworCisjZW5kaWYgLyogTE9HSU5fQ0FQ ICovCisgICAgICAgICAgICAgICAgICAgIC8qIHNldCBvdXIgZGlyZWN0b3J5LCB1aWQgYW5kIGdp ZC4gIFNldCBnaWQgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaW5jZSBvbmNl IHdlIHNldCB1aWQsIHdlJ3ZlIGxvc3Qgcm9vdCBwcml2aWxlZ2VzLgorICAgICAgICAgICAgICAg ICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0Z2lkKGUtPmdpZCkg IT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaXQodXNlcm5tLCBn ZXRwaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciIsICJz ZXRnaWQgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVJS T1JfRVhJVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAjIGlmIGRlZmluZWQoQlNEKQot CQkJaWYgKGluaXRncm91cHModXNlcm5tLCBlLT5naWQpICE9IDApIHsKLQkJCQlsb2dfaXQodXNl cm5tLCBnZXRwaWQoKSwKLQkJCQkgICAgImVycm9yIiwgImluaXRncm91cHMgZmFpbGVkIik7Ci0J CQkJZXhpdChFUlJPUl9FWElUKTsKLQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChp bml0Z3JvdXBzKHVzZXJubSwgZS0+Z2lkKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGxvZ19pdCh1c2Vybm0sIGdldHBpZCgpLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgImVycm9yIiwgImluaXRncm91cHMgZmFpbGVkIik7CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVJST1JfRVhJVCk7CisgICAgICAgICAgICAgICAg ICAgICAgICB9CiAjIGVuZGlmCi0JCQlpZiAoc2V0bG9naW4odXNlcm5tKSAhPSAwKSB7Ci0JCQkJ bG9nX2l0KHVzZXJubSwgZ2V0cGlkKCksCi0JCQkJICAgICJlcnJvciIsICJzZXRsb2dpbiBmYWls ZWQiKTsKLQkJCQlleGl0KEVSUk9SX0VYSVQpOwotCQkJfQotCQkJaWYgKHNldHVpZChlLT51aWQp ICE9IDApIHsKLQkJCQlsb2dfaXQodXNlcm5tLCBnZXRwaWQoKSwKLQkJCQkgICAgImVycm9yIiwg InNldHVpZCBmYWlsZWQiKTsKLQkJCQlleGl0KEVSUk9SX0VYSVQpOwotCQkJfQotCQkJLyogd2Ug YXJlbid0IHJvb3QgYWZ0ZXIgdGhpcy4uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChz ZXRsb2dpbih1c2Vybm0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg bG9nX2l0KHVzZXJubSwgZ2V0cGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAiZXJyb3IiLCAic2V0bG9naW4gZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGV4aXQoRVJST1JfRVhJVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9Cisg ICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dWlkKGUtPnVpZCkgIT0gMCkgeworICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfaXQodXNlcm5tLCBnZXRwaWQoKSwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvciIsICJzZXR1aWQgZmFpbGVkIik7 CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoRVJST1JfRVhJVCk7CisgICAg ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSBhcmVu J3Qgcm9vdCBhZnRlciB0aGlzLi4qLwogI2lmIGRlZmluZWQoTE9HSU5fQ0FQKQotCQl9Ci0JCWlm IChsYyAhPSBOVUxMKQotCQkJbG9naW5fY2xvc2UobGMpOworICAgICAgICAgICAgICAgIH0KKyAg ICAgICAgICAgICAgICBpZiAobGMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxv Z2luX2Nsb3NlKGxjKTsKICNlbmRpZgorCiAJCWNoZGlyKGVudl9nZXQoIkhPTUUiLCBlLT5lbnZw KSk7CiAKLQkJLyogZXhlYyB0aGUgY29tbWFuZC4KKwkJLyoKKwkJICogRXhlYyB0aGUgY29tbWFu ZC4KIAkJICovCiAJCXsKIAkJCWNoYXIJKnNoZWxsID0gZW52X2dldCgiU0hFTEwiLCBlLT5lbnZw KTsKQEAgLTMzNiw3ICszMTYsOCBAQAogCQkJfQogIyBlbmRpZiAvKkRFQlVHR0lORyovCiAJCQll eGVjbGUoc2hlbGwsIHNoZWxsLCAiLWMiLCBlLT5jbWQsIChjaGFyICopMCwgZS0+ZW52cCk7Ci0J CQl3YXJuKCJleGVjbDogY291bGRuJ3QgZXhlYyBgJXMnIiwgc2hlbGwpOworCQkJZnByaW50Zihz dGRlcnIsICJleGVjbDogY291bGRuJ3QgZXhlYyBgJXMnXG4iLCBzaGVsbCk7CisJCQlwZXJyb3Io ImV4ZWNsIik7CiAJCQlfZXhpdChFUlJPUl9FWElUKTsKIAkJfQogCQlicmVhazsKQEAgLTM1MSw3 ICszMzIsNyBAQAogCSAqIHRoZSB1c2VyJ3MgY29tbWFuZC4KIAkgKi8KIAotCURlYnVnKERQUk9D LCAoIlslZF0gY2hpbGQgY29udGludWVzLCBjbG9zaW5nIHBpcGVzXG4iLCBnZXRwaWQoKSkpCisJ RGVidWcoRFBST0MsICgiWyVsZF0gY2hpbGQgY29udGludWVzLCBjbG9zaW5nIHBpcGVzXG4iLChs b25nKWdldHBpZCgpKSkKIAogCS8qIGNsb3NlIHRoZSBlbmRzIG9mIHRoZSBwaXBlIHRoYXQgd2ls bCBvbmx5IGJlIHJlZmVyZW5jZWQgaW4gdGhlCiAJICogZ3JhbmRjaGlsZCBwcm9jZXNzLi4uCkBA IC0zNzEsMTcgKzM1MiwxOCBAQAogCSAqLwogCiAJaWYgKCppbnB1dF9kYXRhICYmIGZvcmsoKSA9 PSAwKSB7Ci0JCXJlZ2lzdGVyIEZJTEUJKm91dCA9IGZkb3BlbihzdGRpbl9waXBlW1dSSVRFX1BJ UEVdLCAidyIpOwotCQlyZWdpc3RlciBpbnQJbmVlZF9uZXdsaW5lID0gRkFMU0U7Ci0JCXJlZ2lz dGVyIGludAllc2NhcGVkID0gRkFMU0U7Ci0JCXJlZ2lzdGVyIGludAljaDsKKwkJRklMRSAqb3V0 ID0gZmRvcGVuKHN0ZGluX3BpcGVbV1JJVEVfUElQRV0sICJ3Iik7CisJCWludCBuZWVkX25ld2xp bmUgPSBGQUxTRTsKKwkJaW50IGVzY2FwZWQgPSBGQUxTRTsKKwkJaW50IGNoOwogCiAJCWlmIChv dXQgPT0gTlVMTCkgewotCQkJd2FybigiZmRvcGVuIGZhaWxlZCBpbiBjaGlsZDIiKTsKKwkJCXdh cm4oImZkb3BlbiBpbiBjaGlsZDIiKTsKIAkJCV9leGl0KEVSUk9SX0VYSVQpOwogCQl9CiAKLQkJ RGVidWcoRFBST0MsICgiWyVkXSBjaGlsZDIgc2VuZGluZyBkYXRhIHRvIGdyYW5kY2hpbGRcbiIs IGdldHBpZCgpKSkKKwkJRGVidWcoRFBST0MsICgiWyVsZF0gY2hpbGQyIHNlbmRpbmcgZGF0YSB0 byBncmFuZGNoaWxkXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkpKQogCiAJCS8qIGNsb3Nl IHRoZSBwaXBlIHdlIGRvbid0IHVzZSwgc2luY2Ugd2UgaW5oZXJpdGVkIGl0IGFuZAogCQkgKiBh cmUgcGFydCBvZiBpdHMgcmVmZXJlbmNlIGNvdW50IG5vdy4KQEAgLTM5Myw3ICszNzUsNyBAQAog CQkgKgklICAtPiBcbgogCQkgKglceCAtPiBceAlmb3IgYWxsIHggIT0gJQogCQkgKi8KLQkJd2hp bGUgKChjaCA9ICppbnB1dF9kYXRhKyspKSB7CisJCXdoaWxlICgoY2ggPSAqaW5wdXRfZGF0YSsr KSAhPSAnXDAnKSB7CiAJCQlpZiAoZXNjYXBlZCkgewogCQkJCWlmIChjaCAhPSAnJScpCiAJCQkJ CXB1dGMoJ1xcJywgb3V0KTsKQEAgLTQxNyw3ICszOTksOCBAQAogCQkgKi8KIAkJZmNsb3NlKG91 dCk7CiAKLQkJRGVidWcoRFBST0MsICgiWyVkXSBjaGlsZDIgZG9uZSBzZW5kaW5nIHRvIGdyYW5k Y2hpbGRcbiIsIGdldHBpZCgpKSkKKwkJRGVidWcoRFBST0MsICgiWyVsZF0gY2hpbGQyIGRvbmUg c2VuZGluZyB0byBncmFuZGNoaWxkXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkpKQogCQll eGl0KDApOwogCX0KIApAQCAtNDM1LDU3ICs0MTgsNjcgQEAKIAkgKiB3aGVuIHRoZSBncmFuZGNo aWxkIGV4aXRzLCB3ZSdsbCBnZXQgRU9GLgogCSAqLwogCi0JRGVidWcoRFBST0MsICgiWyVkXSBj aGlsZCByZWFkaW5nIG91dHB1dCBmcm9tIGdyYW5kY2hpbGRcbiIsIGdldHBpZCgpKSkKKwlEZWJ1 ZyhEUFJPQywgKCJbJWxkXSBjaGlsZCByZWFkaW5nIG91dHB1dCBmcm9tIGdyYW5kY2hpbGRcbiIs CisJCSAgICAgIChsb25nKWdldHBpZCgpKSkKIAogCS8qbG9jYWwqL3sKLQkJcmVnaXN0ZXIgRklM RQkqaW4gPSBmZG9wZW4oc3Rkb3V0X3BpcGVbUkVBRF9QSVBFXSwgInIiKTsKLQkJcmVnaXN0ZXIg aW50CWNoOworCQlGSUxFCSppbiA9IGZkb3BlbihzdGRvdXRfcGlwZVtSRUFEX1BJUEVdLCAiciIp OworCQlpbnQJY2ggPSBnZXRjKGluKTsKIAogCQlpZiAoaW4gPT0gTlVMTCkgewogCQkJd2Fybigi ZmRvcGVuIGZhaWxlZCBpbiBjaGlsZCIpOwogCQkJX2V4aXQoRVJST1JfRVhJVCk7CiAJCX0KIAot CQljaCA9IGdldGMoaW4pOwogCQlpZiAoY2ggIT0gRU9GKSB7Ci0JCQlyZWdpc3RlciBGSUxFCSpt YWlsOwotCQkJcmVnaXN0ZXIgaW50CWJ5dGVzID0gMTsKLQkJCWludAkJc3RhdHVzID0gMDsKKwkJ CUZJTEUJKm1haWw7CisJCQlpbnQJYnl0ZXMgPSAxOworCQkJaW50CXN0YXR1cyA9IDA7CiAKIAkJ CURlYnVnKERQUk9DfERFWFQsCi0JCQkJKCJbJWRdIGdvdCBkYXRhICgleDolYykgZnJvbSBncmFu ZGNoaWxkXG4iLAotCQkJCQlnZXRwaWQoKSwgY2gsIGNoKSkKKwkJCSAgICAgICgiWyVsZF0gZ290 IGRhdGEgKCV4OiVjKSBmcm9tIGdyYW5kY2hpbGRcbiIsCisJCQkgICAgICAgKGxvbmcpZ2V0cGlk KCksIGNoLCBjaCkpCiAKIAkJCS8qIGdldCBuYW1lIG9mIHJlY2lwaWVudC4gIHRoaXMgaXMgTUFJ TFRPIGlmIHNldCB0byBhCiAJCQkgKiB2YWxpZCBsb2NhbCB1c2VybmFtZTsgVVNFUiBvdGhlcndp c2UuCiAJCQkgKi8KLQkJCWlmIChtYWlsdG8gPT0gTlVMTCkgewotCQkJCS8qIE1BSUxUTyBub3Qg cHJlc2VudCwgc2V0IHRvIFVTRVIsCi0JCQkJICogdW5sZXNzIGdsb2JhbGx5IG92ZXJyaWRlbi4K KwkJCWlmKG1haWx0byA9PSBOVUxMKSB7CisJCQkJLypNQUlMVE8gbm90IHByZXNlbnQsIHNldCB0 byBVU0VSLAorCQkJCSAqIHVubGVzcyBnbG9iYWxseSBvdmVycmlkZW4KIAkJCQkgKi8KLQkJCQlp ZiAoZGVmbWFpbHRvKQorCQkJCWlmICghKm1haWx0bykgeworCQkJCQkvKiAuLi4gYnV0IGl0J3Mg ZW1wdHkuIHNldCB0byBOVUxMCisJCQkJCSAqLworCQkJCQltYWlsdG8gPSBOVUxMOworCQkJCX0K KwkJCX0gZWxzZSB7CisJCQkJLyogTUFJTFRPIG5vdCBwcmVzZW50LCBzZXQgdG8gVVNFUi4KKwkJ CQkgKi8KKwkJCQlpZiAoZGVmbWFpbHRvKSAKIAkJCQkJbWFpbHRvID0gZGVmbWFpbHRvOwotCQkJ CWVsc2UKKwkJCQllbHNlIAogCQkJCQltYWlsdG8gPSB1c2Vybm07CiAJCQl9Ci0JCQlpZiAobWFp bHRvICYmICptYWlsdG8gPT0gJ1wwJykKLQkJCQltYWlsdG8gPSBOVUxMOwotCisJCQogCQkJLyog aWYgd2UgYXJlIHN1cHBvc2VkIHRvIGJlIG1haWxpbmcsIE1BSUxUTyB3aWxsCiAJCQkgKiBiZSBu b24tTlVMTC4gIG9ubHkgaW4gdGhpcyBjYXNlIHNob3VsZCB3ZSBzZXQKIAkJCSAqIHVwIHRoZSBt YWlsIGNvbW1hbmQgYW5kIHN1YmplY3RzIGFuZCBzdHVmZi4uLgogCQkJICovCiAKLQkJCWlmICht YWlsdG8pIHsKLQkJCQlyZWdpc3RlciBjaGFyCSoqZW52OwotCQkJCWF1dG8gY2hhcgltYWlsY21k W01BWF9DT01NQU5EXTsKLQkJCQlhdXRvIGNoYXIJaG9zdG5hbWVbTUFYSE9TVE5BTUVMRU5dOwot Ci0JCQkJKHZvaWQpIGdldGhvc3RuYW1lKGhvc3RuYW1lLCBNQVhIT1NUTkFNRUxFTik7Ci0JCQkJ KHZvaWQpIHNucHJpbnRmKG1haWxjbWQsIHNpemVvZihtYWlsY21kKSwKLQkJCQkJICAgICAgIE1B SUxBUkdTLCBNQUlMQ01EKTsKKwkJCWlmIChtYWlsdG8gJiYgc2FmZV9wKHVzZXJubSwgbWFpbHRv KSkgeworCQkJCWNoYXIJKiplbnY7CisJCQkJY2hhcgltYWlsY21kW01BWF9DT01NQU5EXTsKKwkJ CQljaGFyCWhvc3RuYW1lW01BWEhPU1ROQU1FTEVOXTsKKworCQkJCWdldGhvc3RuYW1lKGhvc3Ru YW1lLCBNQVhIT1NUTkFNRUxFTik7CisJCQkJaWYgKHN0cmxlbnMoTUFJTEZNVCwgTUFJTEFSRywg TlVMTCkgKyAxCisJCQkJICAgID49IHNpemVvZiBtYWlsY21kKSB7CisJCQkJCWZwcmludGYoc3Rk ZXJyLCAibWFpbGNtZCB0b28gbG9uZ1xuIik7CisJCQkJCSh2b2lkKSBfZXhpdChFUlJPUl9FWElU KTsKKwkJCQl9CisJCQkJKHZvaWQpc3ByaW50ZihtYWlsY21kLCBNQUlMRk1ULCBNQUlMQVJHKTsK IAkJCQlpZiAoIShtYWlsID0gY3Jvbl9wb3BlbihtYWlsY21kLCAidyIsIGUpKSkgewotCQkJCQl3 YXJuKCIlcyIsIE1BSUxDTUQpOworCQkJCQl3YXJuKCIlcyIsIG1haWxjbWQpOwogCQkJCQkodm9p ZCkgX2V4aXQoRVJST1JfRVhJVCk7CiAJCQkJfQogCQkJCWZwcmludGYobWFpbCwgIkZyb206ICVz IChDcm9uIERhZW1vbilcbiIsIHVzZXJubSk7CkBAIC00OTMsMTAgKzQ4NiwxMCBAQAogCQkJCWZw cmludGYobWFpbCwgIlN1YmplY3Q6IENyb24gPCVzQCVzPiAlc1xuIiwKIAkJCQkJdXNlcm5tLCBm aXJzdF93b3JkKGhvc3RuYW1lLCAiLiIpLAogCQkJCQllLT5jbWQpOwotIyBpZiBkZWZpbmVkKE1B SUxfREFURSkKKyNpZmRlZiBNQUlMX0RBVEUKIAkJCQlmcHJpbnRmKG1haWwsICJEYXRlOiAlc1xu IiwKLQkJCQkJYXJwYWRhdGUoJlRhcmdldFRpbWUpKTsKLSMgZW5kaWYgLyogTUFJTF9EQVRFICov CisJCQkJCWFycGFkYXRlKCZTdGFydFRpbWUpKTsKKyNlbmRpZiAvKk1BSUxfREFURSovCiAJCQkJ Zm9yIChlbnYgPSBlLT5lbnZwOyAgKmVudjsgIGVudisrKQogCQkJCQlmcHJpbnRmKG1haWwsICJY LUNyb24tRW52OiA8JXM+XG4iLAogCQkJCQkJKmVudik7CkBAIC01MjMsOCArNTE2LDggQEAKIAkJ CSAqLwogCiAJCQlpZiAobWFpbHRvKSB7Ci0JCQkJRGVidWcoRFBST0MsICgiWyVkXSBjbG9zaW5n IHBpcGUgdG8gbWFpbFxuIiwKLQkJCQkJZ2V0cGlkKCkpKQorCQkJCURlYnVnKERQUk9DLCAoIlsl bGRdIGNsb3NpbmcgcGlwZSB0byBtYWlsXG4iLAorCQkJCQkgICAgICAobG9uZylnZXRwaWQoKSkp CiAJCQkJLyogTm90ZTogdGhlIHBjbG9zZSB3aWxsIHByb2JhYmx5IHNlZQogCQkJCSAqIHRoZSB0 ZXJtaW5hdGlvbiBvZiB0aGUgZ3JhbmRjaGlsZAogCQkJCSAqIGluIGFkZGl0aW9uIHRvIHRoZSBt YWlsIHByb2Nlc3MsIHNpbmNlCkBAIC01NDEsNyArNTM0LDcgQEAKIAkJCWlmIChtYWlsdG8gJiYg c3RhdHVzKSB7CiAJCQkJY2hhciBidWZbTUFYX1RFTVBTVFJdOwogCi0JCQkJc25wcmludGYoYnVm LCBzaXplb2YoYnVmKSwKKwkJCQlzcHJpbnRmKGJ1ZiwKIAkJCSJtYWlsZWQgJWQgYnl0ZSVzIG9m IG91dHB1dCBidXQgZ290IHN0YXR1cyAweCUwNHhcbiIsCiAJCQkJCWJ5dGVzLCAoYnl0ZXM9PTEp PyIiOiJzIiwKIAkJCQkJc3RhdHVzKTsKQEAgLTU1MCw2OCArNTQzLDQ4IEBACiAKIAkJfSAvKmlm IGRhdGEgZnJvbSBncmFuZGNoaWxkKi8KIAotCQlEZWJ1ZyhEUFJPQywgKCJbJWRdIGdvdCBFT0Yg ZnJvbSBncmFuZGNoaWxkXG4iLCBnZXRwaWQoKSkpCisJCURlYnVnKERQUk9DLCAoIlslbGRdIGdv dCBFT0YgZnJvbSBncmFuZGNoaWxkXG4iLAorCQkJICAgICAgKGxvbmcpZ2V0cGlkKCkpKQogCiAJ CWZjbG9zZShpbik7CS8qIGFsc28gY2xvc2VzIHN0ZG91dF9waXBlW1JFQURfUElQRV0gKi8KIAl9 CiAKIAkvKiB3YWl0IGZvciBjaGlsZHJlbiB0byBkaWUuCiAJICovCi0JZm9yICg7ICBjaGlsZHJl biA+IDA7ICBjaGlsZHJlbi0tKQotCXsKLQkJV0FJVF9UCQl3YWl0ZXI7Ci0JCVBJRF9UCQlwaWQ7 Ci0KLQkJRGVidWcoRFBST0MsICgiWyVkXSB3YWl0aW5nIGZvciBncmFuZGNoaWxkICMlZCB0byBm aW5pc2hcbiIsCi0JCQlnZXRwaWQoKSwgY2hpbGRyZW4pKQotCQlwaWQgPSB3YWl0KCZ3YWl0ZXIp OworCWZvciAoOyBjaGlsZHJlbiA+IDA7IGNoaWxkcmVuLS0pIHsKKwkJV0FJVF9UIHdhaXRlcjsK KwkJUElEX1QgcGlkOworCisJCURlYnVnKERQUk9DLCAoIlslbGRdIHdhaXRpbmcgZm9yIGdyYW5k Y2hpbGQgIyVkIHRvIGZpbmlzaFxuIiwKKwkJCSAgICAgIChsb25nKWdldHBpZCgpLCBjaGlsZHJl bikpCisJCXdoaWxlICgocGlkID0gd2FpdCgmd2FpdGVyKSkgPCBPSyAmJiBlcnJubyA9PSBFSU5U UikKKwkJCTsKIAkJaWYgKHBpZCA8IE9LKSB7Ci0JCQlEZWJ1ZyhEUFJPQywgKCJbJWRdIG5vIG1v cmUgZ3JhbmRjaGlsZHJlbi0tbWFpbCB3cml0dGVuP1xuIiwKLQkJCQlnZXRwaWQoKSkpCisJCQlE ZWJ1ZyhEUFJPQywKKwkJCSAgICAgICgiWyVsZF0gbm8gbW9yZSBncmFuZGNoaWxkcmVuLS1tYWls IHdyaXR0ZW4/XG4iLAorCQkJICAgICAgIChsb25nKWdldHBpZCgpKSkKIAkJCWJyZWFrOwogCQl9 Ci0JCURlYnVnKERQUk9DLCAoIlslZF0gZ3JhbmRjaGlsZCAjJWQgZmluaXNoZWQsIHN0YXR1cz0l MDR4IiwKLQkJCWdldHBpZCgpLCBwaWQsIFdFWElUU1RBVFVTKHdhaXRlcikpKQorCQlEZWJ1ZyhE UFJPQywgKCJbJWxkXSBncmFuZGNoaWxkICMlbGQgZmluaXNoZWQsIHN0YXR1cz0lMDR4IiwKKwkJ CSAgICAgIChsb25nKWdldHBpZCgpLCAobG9uZylwaWQsIFdFWElUU1RBVFVTKHdhaXRlcikpKQog CQlpZiAoV0lGU0lHTkFMRUQod2FpdGVyKSAmJiBXQ09SRURVTVAod2FpdGVyKSkKIAkJCURlYnVn KERQUk9DLCAoIiwgZHVtcGVkIGNvcmUiKSkKIAkJRGVidWcoRFBST0MsICgiXG4iKSkKIAl9CiB9 CiAKLQotc3RhdGljIHZvaWQKLWRvX3VuaXYodSkKLQl1c2VyCSp1OwotewotI2lmIGRlZmluZWQo c2VxdWVudCkKLS8qIER5bml4IChTZXF1ZW50KSBoYWNrIHRvIHB1dCB0aGUgdXNlciBhc3NvY2lh dGVkIHdpdGgKLSAqIHRoZSBwYXNzZWQgdXNlciBzdHJ1Y3R1cmUgaW50byB0aGUgQVRUIHVuaXZl cnNlIGlmCi0gKiBuZWNlc3NhcnkuICBXZSBoYXZlIHRvIGRpZyB0aGUgZ2Vjb3MgaW5mbyBvdXQg b2YKLSAqIHRoZSB1c2VyJ3MgcGFzc3dvcmQgZW50cnkgdG8gc2VlIGlmIHRoZSBtYWdpYwotICog InVuaXZlcnNlKGF0dCkiIHN0cmluZyBpcyBwcmVzZW50LgotICovCi0KLQlzdHJ1Y3QJcGFzc3dk CSpwOwotCWNoYXIJKnM7Ci0JaW50CWk7Ci0KLQlwID0gZ2V0cHd1aWQodS0+dWlkKTsKLQkodm9p ZCkgZW5kcHdlbnQoKTsKLQotCWlmIChwID09IE5VTEwpCi0JCXJldHVybjsKLQotCXMgPSBwLT5w d19nZWNvczsKLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JewotCQlpZiAoKHMgPSBzdHJj aHIocywgJywnKSkgPT0gTlVMTCkKLQkJCXJldHVybjsKLQkJcysrOworc3RhdGljIGludAorc2Fm ZV9wKGNvbnN0IGNoYXIgKnVzZXJubSwgY29uc3QgY2hhciAqcykgeworCXN0YXRpYyBjb25zdCBj aGFyIHNhZmVfZGVsaW1bXSA9ICJAITolLS4sIjsgICAgIC8qIGNvbnNlcnZhdGl2ZSEgKi8KKwlj b25zdCBjaGFyICp0OworCWludCBjaCwgZmlyc3Q7CisKKwlmb3IgKHQgPSBzLCBmaXJzdCA9IDE7 IChjaCA9ICp0KyspICE9ICdcMCc7IGZpcnN0ID0gMCkgeworCQlpZiAoaXNhc2NpaShjaCkgJiYg aXNwcmludChjaCkgJiYKKwkJICAgIChpc2FsbnVtKGNoKSB8fCAoIWZpcnN0ICYmIHN0cmNocihz YWZlX2RlbGltLCBjaCkpKSkKKwkJCWNvbnRpbnVlOworCQlsb2dfaXQodXNlcm5tLCBnZXRwaWQo KSwgIlVOU0FGRSIsIHMpOworCQlyZXR1cm4gKEZBTFNFKTsKIAl9Ci0JaWYgKHN0cmNtcChzLCAi dW5pdmVyc2UoYXR0KSIpKQotCQlyZXR1cm47Ci0KLQkodm9pZCkgdW5pdmVyc2UoVV9BVFQpOwot I2VuZGlmCisJcmV0dXJuIChUUlVFKTsKIH0KZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Ny b24vY3Jvbi9leHRlcm5zLmggZnJlZWJzZF9jcm9uL2Nyb24vZXh0ZXJucy5oCi0tLSAvdXNyL3Ny Yy91c3Iuc2Jpbi9jcm9uL2Nyb24vZXh0ZXJucy5oCTIwMTQtMDEtMTYgMjE6NDM6NDkuMDAwMDAw MDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vY3Jvbi9leHRlcm5zLmgJMjAxNC0wNi0xMSAxNjo0 Mjo1NS4yNzI0NDQyNzYgKzAyMDAKQEAgLTEsNzggKzEsMTA0IEBACi0vKgkkRnJlZUJTRDogcmVs ZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9jcm9uL2V4dGVybnMuaCAxNzM0MTIgMjAwNy0xMS0w NyAxMDo1Mzo0MVoga2V2bG8gJAkqLwotCiAvKiBDb3B5cmlnaHQgMTk5MywxOTk0IGJ5IFBhdWwg Vml4aWUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChj KSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAoIklTQyIpCisgKiBD b3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVtLCBJ bmMuCiAgKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2VwdDogZG9uJ3QgcmVtb3ZlIG15IG5h bWUgZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0aW9uIChkb24ndCB0YWtlIGNyZWRp dCBmb3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChkb24ndAotICogZ2V0IG1lIGJsYW1l ZCBmb3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0ZXIgb3IgcmVtb3ZlIHRoaXMKLSAq IG5vdGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBzb3VyY2UgaXMgcHJvdmlkZWQgdG8g YnV5ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5kLCBleHByZXNzIG9yIGltcGxpZWQs IGlzIGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7IHVzZSBhdCB5b3VyIG93biByaXNr LCByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55KSB0bwotICogYW55b25lIHJlc3Vs dGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSByZXN0cyBlbnRpcmVseSB3aXRoIHRo ZQotICogdXNlci4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0 cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQg ZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJp Z2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGll cy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4ZXMsIGVuaGFuY2VtZW50cywgcmVx dWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRyeSB0byBrZWVwIGEgdmVyc2lvbiB1 cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xsb3dzOgotICogUGF1bCBWaXhpZSAg ICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5ldCFkZWN3cmwhdml4aWUhcGF1bAor ICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElTQyBESVNDTEFJTVMgQUxM IFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFM TCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4g IElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElS RUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisg KiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMs IFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhF UiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBPRiBPUiBJTiBDT05ORUNUSU9OIFdJ VEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKLSNpZiBk ZWZpbmVkKFBPU0lYKSB8fCBkZWZpbmVkKEFUVCkKLSMgaW5jbHVkZSA8c3RkbGliLmg+Ci0jIGlu Y2x1ZGUgPHVuaXN0ZC5oPgotIyBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgaW5jbHVkZSA8ZGlyZW50 Lmg+Ci0jIGRlZmluZSBESVJfVAlzdHJ1Y3QgZGlyZW50Ci0jIGRlZmluZSBXQUlUX1QJaW50Ci0j IGRlZmluZSBXQUlUX0lTX0lOVCAxCisvKiByZW9yZGVyIHRoZXNlICNpbmNsdWRlJ3MgYXQgeW91 ciBwZXJpbCAqLworCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVz Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1 ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8c3lzL3N0 YXQuaD4KKworI2luY2x1ZGUgPGJpdHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaWZu ZGVmIGlzYXNjaWkKKyNkZWZpbmUgaXNhc2NpaShjKSAgICAgICgodW5zaWduZWQpKGMpPD0wMTc3 KQorI2VuZGlmCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNs dWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGdycC5oPgorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2lu Y2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgor I2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5n Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0 aW1lLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+ CisjaW5jbHVkZSA8c3lzL3VuLmg+CisKKworI2lmIGRlZmluZWQoU1lTTE9HKQorIyBpbmNsdWRl IDxzeXNsb2cuaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChMT0dJTl9DQVApCisjIGluY2x1ZGUg PGxvZ2luX2NhcC5oPgorI2VuZGlmIC8qTE9HSU5fQ0FQKi8KKworI2lmIGRlZmluZWQoQlNEX0FV VEgpCisjIGluY2x1ZGUgPGJzZF9hdXRoLmg+CisjZW5kaWYgLypCU0RfQVVUSCovCisKKyNkZWZp bmUgRElSX1QJc3RydWN0IGRpcmVudAorI2RlZmluZSBXQUlUX1QJaW50CisjZGVmaW5lIFNJR19U CXNpZ190CisjZGVmaW5lIFRJTUVfVAl0aW1lX3QKKyNkZWZpbmUgUElEX1QJcGlkX3QKKworI2lm bmRlZiBUWk5BTUVfQUxSRUFEWV9ERUZJTkVECiBleHRlcm4gY2hhciAqdHpuYW1lWzJdOwotIyBk ZWZpbmUgVFpPTkUodG0pIHR6bmFtZVsodG0pLnRtX2lzZHN0XQogI2VuZGlmCisjZGVmaW5lIFRa T05FKHRtKSB0em5hbWVbKHRtKS50bV9pc2RzdF0KIAotI2lmIGRlZmluZWQoVU5JWFBDKQotIyB1 bmRlZiBXQUlUX1QKLSMgdW5kZWYgV0FJVF9JU19JTlQKLSMgZGVmaW5lIFdBSVRfVAl1bmlvbiB3 YWl0Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoUE9TSVgpCi0jIGRlZmluZSBTSUdfVAlzaWdfdAot IyBkZWZpbmUgVElNRV9UCXRpbWVfdAotIyBkZWZpbmUgUElEX1QgcGlkX3QKLSNlbmRpZgotCi0j aWYgZGVmaW5lZChBVFQpCi0jIGRlZmluZSBTSUdfVAl2b2lkCi0jIGRlZmluZSBUSU1FX1QJbG9u ZwotIyBkZWZpbmUgUElEX1QgaW50Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFBPU0lYKSAmJiAh ZGVmaW5lZChBVFQpCi0vKiBjbGFzc2ljIEJTRCAqLwotZXh0ZXJuCXRpbWVfdAkJdGltZSgpOwot ZXh0ZXJuCXVuc2lnbmVkCXNsZWVwKCk7Ci1leHRlcm4Jc3RydWN0IHRtCSpsb2NhbHRpbWUoKTsK LWV4dGVybglzdHJ1Y3QgcGFzc3dkCSpnZXRwd25hbSgpOwotZXh0ZXJuCWludAkJZXJybm87Ci1l eHRlcm4Jdm9pZAkJcGVycm9yKCksIGV4aXQoKSwgZnJlZSgpOwotZXh0ZXJuCWNoYXIJCSpnZXRl bnYoKSwgKnN0cmNweSgpLCAqc3RyY2hyKCksICpzdHJ0b2soKTsKLWV4dGVybgl2b2lkCQkqbWFs bG9jKCksICpyZWFsbG9jKCk7Ci0jIGRlZmluZSBTSUdfVAl2b2lkCi0jIGRlZmluZSBUSU1FX1QJ bG9uZwotIyBkZWZpbmUgUElEX1QgaW50Ci0jIGRlZmluZSBXQUlUX1QJdW5pb24gd2FpdAotIyBk ZWZpbmUgRElSX1QJc3RydWN0IGRpcmVjdAotIyBpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jIGRlZmlu ZSBUWk9ORSh0bSkgKHRtKS50bV96b25lCisjaWYgKGRlZmluZWQoQlNEKSkgJiYgKEJTRCA+PSAx OTg2MDYpIHx8IGRlZmluZWQoX19saW51eCkKKyMgZGVmaW5lIEhBVkVfRkNIT1dOCisjIGRlZmlu ZSBIQVZFX0ZDSE1PRAogI2VuZGlmCiAKKyNpZmRlZiBQT1NJWAorI2luY2x1ZGUgPHVuaXN0ZC5o PgorI2lmZGVmIF9QT1NJWF9TQVZFRF9JRFMKKyMgZGVmaW5lIEhBVkVfU0FWRURfVUlEUworI2Vu ZGlmCisjZW5kaWYKKworI2RlZmluZSBNWV9VSUQocHcpIGdldHVpZCgpCisjZGVmaW5lIE1ZX0dJ RChwdykgZ2V0Z2lkKCkKKwogLyogZ2V0b3B0KCkgaXNuJ3QgcGFydCBvZiBQT1NJWC4gIHNvbWUg c3lzdGVtcyBkZWZpbmUgaXQgaW4gPHN0ZGxpYi5oPiBhbnl3YXkuCiAgKiBvZiB0aG9zZSB0aGF0 IGRvLCBzb21lIGNvbXBsYWluIHRoYXQgb3VyIGRlZmluaXRpb24gaXMgZGlmZmVyZW50IGFuZCBz b21lCiAgKiBkbyBub3QuICB0byBhZGQgdG8gdGhlIG1pc2VyeSBhbmQgY29uZnVzaW9uLCBzb21l IHN5c3RlbXMgZGVmaW5lIGdldG9wdCgpCiAgKiBpbiB3YXlzIHRoYXQgd2UgY2Fubm90IHByZWRp Y3Qgb3IgY29tcHJlaGVuZCwgeWV0IGRvIG5vdCBkZWZpbmUgdGhlIGFkanVuY3QKICAqIGV4dGVy bmFsIHZhcmlhYmxlcyBuZWVkZWQgZm9yIHRoZSBpbnRlcmZhY2UuCiAgKi8KLSNpZiAoIWRlZmlu ZWQoQlNEKSB8fCAoQlNEIDwgMTk4OTExKSkgJiYgIWRlZmluZWQoQVRUKSAmJiAhZGVmaW5lZChV TklDT1MpCisjaWYgKCFkZWZpbmVkKEJTRCkgfHwgKEJTRCA8IDE5ODkxMSkpCiBpbnQJZ2V0b3B0 KGludCwgY2hhciAqIGNvbnN0ICosIGNvbnN0IGNoYXIgKik7CiAjZW5kaWYKIApAQCAtODEsNjcg KzEwNywyNSBAQAogZXh0ZXJuCWludCBvcHRpbmQsIG9wdGVyciwgb3B0b3B0OwogI2VuZGlmCiAK LSNpZiBXQUlUX0lTX0lOVAotIyBpZm5kZWYgV0VYSVRTVEFUVVMKLSMgIGRlZmluZSBXRVhJVFNU QVRVUyh4KSAoKCh4KSA+PiA4KSAmIDB4ZmYpCi0jIGVuZGlmCi0jIGlmbmRlZiBXVEVSTVNJRwot IyAgZGVmaW5lIFdURVJNU0lHKHgpCSgoeCkgJiAweDdmKQotIyBlbmRpZgotIyBpZm5kZWYgV0NP UkVEVU1QCi0jICBkZWZpbmUgV0NPUkVEVU1QKHgpCSgoeCkgJiAweDgwKQotIyBlbmRpZgotI2Vs c2UgLypXQUlUX0lTX0lOVCovCi0jIGlmbmRlZiBXRVhJVFNUQVRVUwotIyAgZGVmaW5lIFdFWElU U1RBVFVTKHgpICgoeCkud19yZXRjb2RlKQotIyBlbmRpZgotIyBpZm5kZWYgV1RFUk1TSUcKLSMg IGRlZmluZSBXVEVSTVNJRyh4KQkoKHgpLndfdGVybXNpZykKLSMgZW5kaWYKLSMgaWZuZGVmIFdD T1JFRFVNUAotIyAgZGVmaW5lIFdDT1JFRFVNUCh4KQkoKHgpLndfY29yZWR1bXApCi0jIGVuZGlm Ci0jZW5kaWYgLypXQUlUX0lTX0lOVCovCi0KLSNpZm5kZWYgV0lGU0lHTkFMRUQKLSNkZWZpbmUg V0lGU0lHTkFMRUQoeCkJKFdURVJNU0lHKHgpICE9IDApCi0jZW5kaWYKLSNpZm5kZWYgV0lGRVhJ VEVECi0jZGVmaW5lIFdJRkVYSVRFRCh4KQkoV1RFUk1TSUcoeCkgPT0gMCkKLSNlbmRpZgotCi0j aWZkZWYgTkVFRF9TVFJDQVNFQ01QCi1leHRlcm4JaW50CQlzdHJjYXNlY21wKGNoYXIgKiwgY2hh ciAqKTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9TVFJEVVAKLWV4dGVybgljaGFyCQkqc3RyZHVw KGNoYXIgKik7Ci0jZW5kaWYKLQotI2lmZGVmIE5FRURfU1RSRVJST1IKLWV4dGVybgljaGFyCQkq c3RyZXJyb3IoaW50KTsKLSNlbmRpZgotCi0jaWZkZWYgTkVFRF9GTE9DSworLyogZGlnaXRhbCB1 bml4IG5lZWRzIHRoaXMgYnV0IGRvZXMgbm90IGdpdmUgdXMgYSB3YXkgdG8gaWRlbnRpZnkgaXQu CisgKi8KIGV4dGVybglpbnQJCWZsb2NrKGludCwgaW50KTsKKworLyogbm90IGFsbCBzeXN0ZW1z IHdobyBwcm92aWRlIGZsb2NrKCkgcHJvdmlkZSB0aGVzZSBkZWZpbml0aW9ucy4KKyAqLworI2lm bmRlZiBMT0NLX1NICiAjIGRlZmluZSBMT0NLX1NIIDEKLSMgZGVmaW5lIExPQ0tfRVggMgotIyBk ZWZpbmUgTE9DS19OQiA0Ci0jIGRlZmluZSBMT0NLX1VOIDgKICNlbmRpZgotCi0jaWZkZWYgTkVF RF9TRVRTSUQKLWV4dGVybglpbnQJCXNldHNpZCh2b2lkKTsKKyNpZm5kZWYgTE9DS19FWAorIyBk ZWZpbmUgTE9DS19FWCAyCiAjZW5kaWYKLQotI2lmZGVmIE5FRURfR0VURFRBQkxFU0laRQotZXh0 ZXJuCWludAkJZ2V0ZHRhYmxlc2l6ZSh2b2lkKTsKKyNpZm5kZWYgTE9DS19OQgorIyBkZWZpbmUg TE9DS19OQiA0CiAjZW5kaWYKLQotI2lmZGVmIE5FRURfU0VURU5WCi1leHRlcm4JaW50CQlzZXRl bnYoY2hhciAqLCBjaGFyICosIGludCk7CisjaWZuZGVmIExPQ0tfVU4KKyMgZGVmaW5lIExPQ0tf VU4gOAogI2VuZGlmCiAKLSNpZmRlZiBORUVEX1ZGT1JLCi1leHRlcm4JUElEX1QJCXZmb3JrKHZv aWQpOworI2lmbmRlZiBXQ09SRURVTVAKKyMgZGVmaW5lIFdDT1JFRFVNUChzdCkgICAgICAgICAg KCgoc3QpICYgMDIwMCkgIT0gMCkKICNlbmRpZgpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4v Y3Jvbi9jcm9uL2Z1bmNzLmggZnJlZWJzZF9jcm9uL2Nyb24vZnVuY3MuaAotLS0gL3Vzci9zcmMv dXNyLnNiaW4vY3Jvbi9jcm9uL2Z1bmNzLmgJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAg KzAxMDAKKysrIGZyZWVic2RfY3Jvbi9jcm9uL2Z1bmNzLmgJMjAxNC0wNi0xMSAxNjo0Mjo1NS4y NzI0NDQyNzYgKzAyMDAKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqICRJZDogZnVuY3MuaCx2IDEu OSAyMDA0LzAxLzIzIDE4OjU2OjQyIHZpeGllIEV4cCAkCisgKi8KKworLyoKKyAqIENvcHlyaWdo dCAoYykgMjAwNCBieSBJbnRlcm5ldCBTeXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQor ICogQ29weXJpZ2h0IChjKSAxOTk3LDIwMDAgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1 bSwgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0 cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQg ZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJp Z2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGll cy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJU0NM QUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNM VURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBG SVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgSVNDIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVD SUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERB TUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1Ig UFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNF IE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENPTk5F Q1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8K KworLyogTm90ZXM6CisgKglUaGlzIGZpbGUgaGFzIHRvIGJlIGluY2x1ZGVkIGJ5IGNyb24uaCBh ZnRlciBkYXRhIHN0cnVjdHVyZSBkZWZzLgorICoJV2Ugc2hvdWxkIHJlb3JnIHRoaXMgaW50byBz ZWN0aW9ucyBieSBtb2R1bGUuCisgKi8KKwordm9pZAkJc2V0X2Nyb25fdWlkKHZvaWQpLAorCQlz ZXRfY3Jvbl9jd2Qodm9pZCksCisJCWxvYWRfZGF0YWJhc2UoY3Jvbl9kYiAqKSwKKwkJb3Blbl9s b2dmaWxlKHZvaWQpLAorCQlzaWdwaXBlX2Z1bmModm9pZCksCisJCWpvYl9hZGQoZW50cnkgKiwg dXNlciAqKSwKKwkJZG9fY29tbWFuZChlbnRyeSAqLCB1c2VyICopLAorCQlsaW5rX3VzZXIoY3Jv bl9kYiAqLCB1c2VyICopLAorCQl1bmxpbmtfdXNlcihjcm9uX2RiICosIHVzZXIgKiksCisJCWZy ZWVfdXNlcih1c2VyICopLAorCQllbnZfZnJlZShjaGFyICoqKSwKKwkJdW5nZXRfY2hhcihpbnQs IEZJTEUgKiksCisJCWZyZWVfZW50cnkoZW50cnkgKiksCisJCWFjcXVpcmVfZGFlbW9ubG9jayhp bnQpLAorCQlza2lwX2NvbW1lbnRzKEZJTEUgKiksCisJCWxvZ19pdChjb25zdCBjaGFyICosIGlu dCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopLAorCQlsb2dfY2xvc2Uodm9pZCksCisJCW1r cHJpbnQoY2hhciAqLCB1bnNpZ25lZCBjaGFyICosIGludCk7CisKK2ludAkJam9iX3J1bnF1ZXVl KHZvaWQpLAorCQlzZXRfZGVidWdfZmxhZ3MoY29uc3QgY2hhciAqKSwKKwkJZ2V0X2NoYXIoRklM RSAqKSwKKwkJZ2V0X3N0cmluZyhjaGFyICosIGludCwgRklMRSAqLCBjaGFyICopLAorCQlzd2Fw X3VpZHModm9pZCksCisJCXN3YXBfdWlkc19iYWNrKHZvaWQpLAorCQlsb2FkX2VudihjaGFyICos IEZJTEUgKiksCisJCWNyb25fcGNsb3NlKEZJTEUgKiksCisJCWdsdWVfc3RyaW5ncyhjaGFyICos IHNpemVfdCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIpLAorCQlzdHJjbXBfdW50 aWwoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGNoYXIpLAorCQlhbGxvd2VkKGNoYXIgKiks CisJCXN0cmR0YihjaGFyICopLAorCQlvcGVuX3NvY2tldCh2b2lkKTsKKworc2l6ZV90CQlzdHJs ZW5zKGNvbnN0IGNoYXIgKiwgLi4uKTsKKworY2hhcgkJKmVudl9nZXQoY2hhciAqLCBjaGFyICoq KSwKKwkJKmFycGFkYXRlKHRpbWVfdCAqKSwKKwkJKm1rcHJpbnRzKHVuc2lnbmVkIGNoYXIgKiwg dW5zaWduZWQgaW50KSwKKwkJKmZpcnN0X3dvcmQoY2hhciAqLCBjaGFyICopLAorCQkqKmVudl9p bml0KHZvaWQpLAorCQkqKmVudl9jb3B5KGNoYXIgKiopLAorCQkqKmVudl9zZXQoY2hhciAqKiwg Y2hhciAqKTsKKwordXNlcgkJKmxvYWRfdXNlcihpbnQsIHN0cnVjdCBwYXNzd2QgKiwgY29uc3Qg Y2hhciAqKSwKKwkJKmZpbmRfdXNlcihjcm9uX2RiICosIGNvbnN0IGNoYXIgKik7CisKK2VudHJ5 CQkqbG9hZF9lbnRyeShGSUxFICosIHZvaWQgKCopKCksIHN0cnVjdCBwYXNzd2QgKiwgY2hhciAq Kik7CisKK0ZJTEUJCSpjcm9uX3BvcGVuKGNoYXIgKiwgY2hhciAqLCBlbnRyeSAqKTsKKworc3Ry dWN0IHBhc3N3ZAkqcHdfZHVwKGNvbnN0IHN0cnVjdCBwYXNzd2QgKik7CisKKyNpZm5kZWYgSEFW RV9UTV9HTVRPRkYKK2xvbmcJCWdldF9nbXRvZmYodGltZV90ICosIHN0cnVjdCB0bSAqKTsKKyNl bmRpZgpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2dsb2JhbHMuaCBmcmVl YnNkX2Nyb24vY3Jvbi9nbG9iYWxzLmgKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9n bG9iYWxzLmgJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2Rf Y3Jvbi9jcm9uL2dsb2JhbHMuaAkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MjQ0NDI3NiArMDIwMApA QCAtMCwwICsxLDgwIEBACisvKgorICogJElkOiBnbG9iYWxzLmgsdiAxLjEwIDIwMDQvMDEvMjMg MTk6MDM6MzMgdml4aWUgRXhwICQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IGJ5 IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAoIklTQyIpCisgKiBDb3B5cmlnaHQg KGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVtLCBJbmMuCisgKgor ICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBz b2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5 IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFu ZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRI RSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJU0MgRElTQ0xBSU1TIEFMTCBXQVJS QU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1Q TElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuICBJTiBO TyBFVkVOVCBTSEFMTCBJU0MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwg SU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hB VFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVU SEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9S VElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRI RSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZkZWYgTUFJ Tl9QUk9HUkFNCisjIGRlZmluZSBYVFJOCisjIGRlZmluZSBJTklUKHgpID0geAorI2Vsc2UKKyMg ZGVmaW5lIFhUUk4gZXh0ZXJuCisjIGRlZmluZSBJTklUKHgpCisjZW5kaWYKKworWFRSTiBjb25z dCBjaGFyICpjb3B5cmlnaHRbXQorI2lmZGVmIE1BSU5fUFJPR1JBTQorCT0geworCQkiQCgjKSBJ U0MgQ3JvbiBWNC4xIiwKKwkJIkAoIykgQ29weXJpZ2h0IDE5ODgsMTk4OSwxOTkwLDE5OTMsMTk5 NCBieSBQYXVsIFZpeGllIiwKKwkJIkAoIykgQ29weXJpZ2h0IDE5OTcsMjAwMCBieSBJbnRlcm5l dCBTb2Z0d2FyZSBDb25zb3J0aXVtLCBJbmMuIiwKKwkJIkAoIykgQ29weXJpZ2h0IDIwMDQgYnkg SW50ZXJuZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuIiwKKwkJIkAoIykgQWxsIHJpZ2h0cyBy ZXNlcnZlZCIsCisJCU5VTEwKKwl9CisjZW5kaWYKKwk7CisKK1hUUk4gY29uc3QgY2hhciAqTW9u dGhOYW1lc1tdCisjaWZkZWYgTUFJTl9QUk9HUkFNCisJPSB7CisJCSJKYW4iLCAiRmViIiwgIk1h ciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisJCSJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAi Tm92IiwgIkRlYyIsCisJCU5VTEwKKwl9CisjZW5kaWYKKwk7CisKK1hUUk4gY29uc3QgY2hhciAq RG93TmFtZXNbXQorI2lmZGVmIE1BSU5fUFJPR1JBTQorCT0geworCQkiU3VuIiwgIk1vbiIsICJU dWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IiwgIlN1biIsCisJCU5VTEwKKwl9CisjZW5k aWYKKwk7CisKK1hUUk4gY2hhcgkqUHJvZ3JhbU5hbWUgSU5JVCgiYW1uZXNpYSIpOworWFRSTiBj aGFyCSpkZWZtYWlsdG87CitYVFJOIGludAlMaW5lTnVtYmVyIElOSVQoMCk7CitYVFJOIHRpbWVf dAlTdGFydFRpbWUgSU5JVCgwKTsKK1hUUk4gaW50CU5vRm9yayBJTklUKDApOworCisjaWYgREVC VUdHSU5HCitYVFJOIGludAlEZWJ1Z0ZsYWdzIElOSVQoMCk7CitYVFJOIGNvbnN0IGNoYXIgKkRl YnVnRmxhZ05hbWVzW10KKyNpZmRlZiBNQUlOX1BST0dSQU0KKwk9IHsKKwkJImV4dCIsICJzY2gi LCAicHJvYyIsICJwYXJzIiwgImxvYWQiLCAibWlzYyIsICJ0ZXN0IiwgImJpdCIsCisJCU5VTEwK Kwl9CisjZW5kaWYKKwk7CisjZWxzZQorI2RlZmluZQlEZWJ1Z0ZsYWdzCTAKKyNlbmRpZiAvKiBE RUJVR0dJTkcgKi8KZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9qb2IuYyBm cmVlYnNkX2Nyb24vY3Jvbi9qb2IuYwotLS0gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL2pv Yi5jCTIwMTQtMDEtMTYgMjE6NDM6NDkuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24v Y3Jvbi9qb2IuYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MzQ0NDgxMiArMDIwMApAQCAtMSw3NiAr MSw3MyBAQAogLyogQ29weXJpZ2h0IDE5ODgsMTk5MCwxOTkzLDE5OTQgYnkgUGF1bCBWaXhpZQog ICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQg YnkgSW50ZXJuZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuICgiSVNDIikKKyAqIENvcHlyaWdo dCAoYykgMTk5NywyMDAwIGJ5IEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0sIEluYy4KICAq Ci0gKiBEaXN0cmlidXRlIGZyZWVseSwgZXhjZXB0OiBkb24ndCByZW1vdmUgbXkgbmFtZSBmcm9t IHRoZSBzb3VyY2Ugb3IKLSAqIGRvY3VtZW50YXRpb24gKGRvbid0IHRha2UgY3JlZGl0IGZvciBt eSB3b3JrKSwgbWFyayB5b3VyIGNoYW5nZXMgKGRvbid0Ci0gKiBnZXQgbWUgYmxhbWVkIGZvciB5 b3VyIHBvc3NpYmxlIGJ1Z3MpLCBkb24ndCBhbHRlciBvciByZW1vdmUgdGhpcwotICogbm90aWNl LiAgTWF5IGJlIHNvbGQgaWYgYnVpbGRhYmxlIHNvdXJjZSBpcyBwcm92aWRlZCB0byBidXllci4g IE5vCi0gKiB3YXJyYW50ZWUgb2YgYW55IGtpbmQsIGV4cHJlc3Mgb3IgaW1wbGllZCwgaXMgaW5j bHVkZWQgd2l0aCB0aGlzCi0gKiBzb2Z0d2FyZTsgdXNlIGF0IHlvdXIgb3duIHJpc2ssIHJlc3Bv bnNpYmlsaXR5IGZvciBkYW1hZ2VzIChpZiBhbnkpIHRvCi0gKiBhbnlvbmUgcmVzdWx0aW5nIGZy b20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIHJlc3RzIGVudGlyZWx5IHdpdGggdGhlCi0gKiB1 c2VyLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUg dGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMg aGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90 aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgogICoK LSAqIFNlbmQgYnVnIHJlcG9ydHMsIGJ1ZyBmaXhlcywgZW5oYW5jZW1lbnRzLCByZXF1ZXN0cywg ZmxhbWVzLCBldGMuLCBhbmQKLSAqIEknbGwgdHJ5IHRvIGtlZXAgYSB2ZXJzaW9uIHVwIHRvIGRh dGUuICBJIGNhbiBiZSByZWFjaGVkIGFzIGZvbGxvd3M6Ci0gKiBQYXVsIFZpeGllICAgICAgICAg IDxwYXVsQHZpeC5jb20+ICAgICAgICAgIHV1bmV0IWRlY3dybCF2aXhpZSFwYXVsCisgKiBUSEUg U09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJU0NMQUlNUyBBTEwgV0FSUkFO VElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJ RUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiAgSU4gTk8g RVZFTlQgU0hBTEwgSVNDIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElO RElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRT T0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhF UiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJ T1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUg VVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAotI2lmICFkZWZpbmVk KGxpbnQpICYmICFkZWZpbmVkKExJTlQpCi1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0KLSAg IiRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Nyb24vam9iLmMgNTA0Nzkg MTk5OS0wOC0yOCAwMTozNTo1OVogcGV0ZXIgJCI7Ci0jZW5kaWYKLQorLy8jaWYgIWRlZmluZWQo bGludCkgJiYgIWRlZmluZWQoTElOVCkKKy8vc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IGpv Yi5jLHYgMS42IDIwMDQvMDEvMjMgMTg6NTY6NDMgdml4aWUgRXhwICQiOworLy8jZW5kaWYKIAog I2luY2x1ZGUgImNyb24uaCIKIAotCiB0eXBlZGVmCXN0cnVjdCBfam9iIHsKIAlzdHJ1Y3QgX2pv YgkqbmV4dDsKIAllbnRyeQkJKmU7CiAJdXNlcgkJKnU7CiB9IGpvYjsKIAotCiBzdGF0aWMgam9i CSpqaGVhZCA9IE5VTEwsICpqdGFpbCA9IE5VTEw7CiAKLQogdm9pZAotam9iX2FkZChlLCB1KQot CXJlZ2lzdGVyIGVudHJ5ICplOwotCXJlZ2lzdGVyIHVzZXIgKnU7Ci17Ci0JcmVnaXN0ZXIgam9i ICpqOworam9iX2FkZChlbnRyeSAqZSwgdXNlciAqdSkgeworCWpvYiAqajsKIAogCS8qIGlmIGFs cmVhZHkgb24gcXVldWUsIGtlZXAgZ29pbmcgKi8KLQlmb3IgKGo9amhlYWQ7IGo7IGo9ai0+bmV4 dCkKLQkJaWYgKGotPmUgPT0gZSAmJiBqLT51ID09IHUpIHsgcmV0dXJuOyB9CisJZm9yIChqID0g amhlYWQ7IGogIT0gTlVMTDsgaiA9IGotPm5leHQpCisJCWlmIChqLT5lID09IGUgJiYgai0+dSA9 PSB1KQorCQkJcmV0dXJuOwogCiAJLyogYnVpbGQgYSBqb2IgcXVldWUgZWxlbWVudCAqLwotCWlm ICgoaiA9IChqb2IqKW1hbGxvYyhzaXplb2Yoam9iKSkpID09IE5VTEwpCisJaWYgKChqID0gKGpv YiAqKW1hbGxvYyhzaXplb2Yoam9iKSkpID09IE5VTEwpCiAJCXJldHVybjsKLQlqLT5uZXh0ID0g KGpvYiopIE5VTEw7CisJai0+bmV4dCA9IE5VTEw7CiAJai0+ZSA9IGU7CiAJai0+dSA9IHU7CiAK IAkvKiBhZGQgaXQgdG8gdGhlIHRhaWwgKi8KLQlpZiAoIWpoZWFkKSB7IGpoZWFkPWo7IH0KLQll bHNlIHsganRhaWwtPm5leHQ9ajsgfQorCWlmIChqaGVhZCA9PSBOVUxMKQorCQlqaGVhZCA9IGo7 CisJZWxzZQorCQlqdGFpbC0+bmV4dCA9IGo7CiAJanRhaWwgPSBqOwogfQogCi0KIGludAotam9i X3J1bnF1ZXVlKCkKLXsKLQlyZWdpc3RlciBqb2IJKmosICpqbjsKLQlyZWdpc3RlciBpbnQJcnVu ID0gMDsKK2pvYl9ydW5xdWV1ZSh2b2lkKSB7CisJam9iICpqLCAqam47CisJaW50IHJ1biA9IDA7 CiAKLQlmb3IgKGo9amhlYWQ7IGo7IGo9am4pIHsKKwlmb3IgKGogPSBqaGVhZDsgajsgaiA9IGpu KSB7CiAJCWRvX2NvbW1hbmQoai0+ZSwgai0+dSk7CiAJCWpuID0gai0+bmV4dDsKIAkJZnJlZShq KTsKIAkJcnVuKys7CiAJfQogCWpoZWFkID0ganRhaWwgPSBOVUxMOwotCXJldHVybiBydW47CisJ cmV0dXJuIChydW4pOwogfQpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL21h Y3Jvcy5oIGZyZWVic2RfY3Jvbi9jcm9uL21hY3Jvcy5oCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9j cm9uL2Nyb24vbWFjcm9zLmgJMTk3MC0wMS0wMSAwMTowMDowMC4wMDAwMDAwMDAgKzAxMDAKKysr IGZyZWVic2RfY3Jvbi9jcm9uL21hY3Jvcy5oCTIwMTQtMDYtMTEgMTY6NDI6NTUuMjczNDQ0ODEy ICswMjAwCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogJElkOiBtYWNyb3MuaCx2IDEuOSAyMDA0 LzAxLzIzIDE4OjU2OjQzIHZpeGllIEV4cCAkCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykg MjAwNCBieSBJbnRlcm5ldCBTeXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQorICogQ29w eXJpZ2h0IChjKSAxOTk3LDIwMDAgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bSwgSW5j LgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRl IHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlz IGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5v dGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAq CisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJU0NMQUlNUyBB TEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcg QUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT LiAgSU4gTk8gRVZFTlQgU0hBTEwgSVNDIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBE SVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMK KyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklU UywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9U SEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENPTk5FQ1RJT04g V0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworCS8q IHRoZXNlIGFyZSByZWFsbHkgaW1tdXRhYmxlLCBhbmQgYXJlCisJICogICBkZWZpbmVkIGZvciBz eW1ib2xpYyBjb252ZW5pZW5jZSBvbmx5CisJICogVFJVRSwgRkFMU0UsIGFuZCBFUlIgbXVzdCBi ZSBkaXN0aW5jdAorCSAqIEVSUiBtdXN0IGJlIDwgT0suCisJICovCisjZGVmaW5lIFRSVUUJCTEK KyNkZWZpbmUgRkFMU0UJCTAKKwkvKiBzeXN0ZW0gY2FsbHMgcmV0dXJuIHRoaXMgb24gc3VjY2Vz cyAqLworI2RlZmluZSBPSwkJMAorCS8qICAgb3IgdGhpcyBvbiBlcnJvciAqLworI2RlZmluZSBF UlIJCSgtMSkKKworCS8qIHR1cm4gdGhpcyBvbiB0byBnZXQgJy14JyBjb2RlICovCisjaWZuZGVm IERFQlVHR0lORworI2RlZmluZSBERUJVR0dJTkcJRkFMU0UKKyNlbmRpZgorCisjZGVmaW5lCUlO SVRfUElECTEJLyogcGFyZW50IG9mIG9ycGhhbnMgKi8KKyNkZWZpbmUgUkVBRF9QSVBFCTAJLyog d2hpY2ggZW5kIG9mIGEgcGlwZSBwYWlyIGRvIHlvdSByZWFkPyAqLworI2RlZmluZSBXUklURV9Q SVBFCTEJLyogICBvciB3cml0ZSB0bz8gKi8KKyNkZWZpbmUgU1RESU4JCTAJLyogd2hhdCBpcyBz dGRpbidzIGZpbGUgZGVzY3JpcHRvcj8gKi8KKyNkZWZpbmUgU1RET1VUCQkxCS8qICAgc3Rkb3V0 J3M/ICovCisjZGVmaW5lIFNUREVSUgkJMgkvKiAgIHN0ZGVycidzPyAqLworI2RlZmluZSBFUlJP Ul9FWElUCTEJLyogZXhpdCgpIHdpdGggdGhpcyB3aWxsIHNjYXJlIHRoZSBzaGVsbCAqLworI2Rl ZmluZQlPS19FWElUCQkwCS8qIGV4aXQoKSB3aXRoIHRoaXMgaXMgY29uc2lkZXJlZCAnbm9ybWFs JyAqLworI2RlZmluZQlNQVhfRk5BTUUJMTAwCS8qIG1heCBsZW5ndGggb2YgaW50ZXJuYWxseSBn ZW5lcmF0ZWQgZm4gKi8KKyNkZWZpbmUJTUFYX0NPTU1BTkQJMTAwMAkvKiBtYXggbGVuZ3RoIG9m IGludGVybmFsbHkgZ2VuZXJhdGVkIGNtZCAqLworI2RlZmluZQlNQVhfRU5WU1RSCTEwMDAJLyog bWF4IGxlbmd0aCBvZiBlbnZ2YXI9dmFsdWVcMCBzdHJpbmdzICovCisjZGVmaW5lCU1BWF9URU1Q U1RSCTEwMAkvKiBvYnZpb3VzICovCisjZGVmaW5lCU1BWF9VTkFNRQkzMwkvKiBtYXggbGVuZ3Ro IG9mIHVzZXJuYW1lLCBzaG91bGQgYmUgb3ZlcmtpbGwgKi8KKyNkZWZpbmUJUk9PVF9VSUQJMAkv KiBkb24ndCBjaGFuZ2UgdGhpcywgaXQgcmVhbGx5IG11c3QgYmUgcm9vdCAqLworI2RlZmluZQlS T09UX1VTRVIJInJvb3QiCS8qIGRpdHRvICovCisKKwkJCQkvKiBOT1RFOiB0aGVzZSBjb3JyZXNw b25kIHRvIERlYnVnRmxhZ05hbWVzLAorCQkJCSAqCWRlZmluZWQgYmVsb3cuCisJCQkJICovCisj ZGVmaW5lCURFWFQJCTB4MDAwMQkvKiBleHRlbmQgZmxhZyBmb3Igb3RoZXIgZGVidWcgbWFza3Mg Ki8KKyNkZWZpbmUJRFNDSAkJMHgwMDAyCS8qIHNjaGVkdWxpbmcgZGVidWcgbWFzayAqLworI2Rl ZmluZQlEUFJPQwkJMHgwMDA0CS8qIHByb2Nlc3MgY29udHJvbCBkZWJ1ZyBtYXNrICovCisjZGVm aW5lCURQQVJTCQkweDAwMDgJLyogcGFyc2luZyBkZWJ1ZyBtYXNrICovCisjZGVmaW5lCURMT0FE CQkweDAwMTAJLyogZGF0YWJhc2UgbG9hZGluZyBkZWJ1ZyBtYXNrICovCisjZGVmaW5lCURNSVND CQkweDAwMjAJLyogbWlzYyBkZWJ1ZyBtYXNrICovCisjZGVmaW5lCURURVNUCQkweDAwNDAJLyog dGVzdCBtb2RlOiBkb24ndCBleGVjdXRlIGFueSBjb21tYW5kcyAqLworCisjZGVmaW5lCVBQQ19O VUxMCSgoY29uc3QgY2hhciAqKilOVUxMKQorCisjaWZuZGVmIE1BWEhPU1ROQU1FTEVOCisjZGVm aW5lIE1BWEhPU1ROQU1FTEVOIDY0CisjZW5kaWYKKworI2RlZmluZQlTa2lwX0JsYW5rcyhjLCBm KSBcCisJCQl3aGlsZSAoYyA9PSAnXHQnIHx8IGMgPT0gJyAnKSBcCisJCQkJYyA9IGdldF9jaGFy KGYpOworCisjZGVmaW5lCVNraXBfTm9uYmxhbmtzKGMsIGYpIFwKKwkJCXdoaWxlIChjIT0nXHQn ICYmIGMhPScgJyAmJiBjIT0nXG4nICYmIGMgIT0gRU9GKSBcCisJCQkJYyA9IGdldF9jaGFyKGYp OworCisjaWYgREVCVUdHSU5HCisjIGRlZmluZSBEZWJ1ZyhtYXNrLCBtZXNzYWdlKSBcCisJCQlp ZiAoKERlYnVnRmxhZ3MgJiAobWFzaykpICE9IDApIFwKKwkJCQlwcmludGYgbWVzc2FnZTsKKyNl bHNlIC8qICFERUJVR0dJTkcgKi8KKyMgZGVmaW5lIERlYnVnKG1hc2ssIG1lc3NhZ2UpIFwKKwkJ CTsKKyNlbmRpZiAvKiBERUJVR0dJTkcgKi8KKworI2RlZmluZQlNa1VwcGVyKGNoKQkoaXNsb3dl cihjaCkgPyB0b3VwcGVyKGNoKSA6IGNoKQorI2RlZmluZQlTZXRfTGluZU51bShsbikJe0RlYnVn KERQQVJTfERFWFQsKCJsaW5lbnVtPSVkXG4iLGxuKSk7IFwKKwkJCSBMaW5lTnVtYmVyID0gbG47 IFwKKwkJCX0KKworI2lmZGVmIEhBVkVfVE1fR01UT0ZGCisjZGVmaW5lCWdldF9nbXRvZmYoYywg dCkJKCh0KS0+dG1fZ210b2ZmKQorI2VuZGlmCisKKyNkZWZpbmUJU0VDT05EU19QRVJfTUlOVVRF CTYwCisjZGVmaW5lCVNFQ09ORFNfUEVSX0hPVVIJMzYwMAorCisjZGVmaW5lIEZJUlNUX1NFQ09O RCAgICAwCisjZGVmaW5lIExBU1RfU0VDT05EICAgICA1OQorI2RlZmluZSBTRUNPTkRfQ09VTlQg KExBU1RfU0VDT05EIC0gRklSU1RfU0VDT05EICsgMSkKKworI2RlZmluZQlGSVJTVF9NSU5VVEUJ MAorI2RlZmluZQlMQVNUX01JTlVURQk1OQorI2RlZmluZQlNSU5VVEVfQ09VTlQJKExBU1RfTUlO VVRFIC0gRklSU1RfTUlOVVRFICsgMSkKKworI2RlZmluZQlGSVJTVF9IT1VSCTAKKyNkZWZpbmUJ TEFTVF9IT1VSCTIzCisjZGVmaW5lCUhPVVJfQ09VTlQJKExBU1RfSE9VUiAtIEZJUlNUX0hPVVIg KyAxKQorCisjZGVmaW5lCUZJUlNUX0RPTQkxCisjZGVmaW5lCUxBU1RfRE9NCTMxCisjZGVmaW5l CURPTV9DT1VOVAkoTEFTVF9ET00gLSBGSVJTVF9ET00gKyAxKQorCisjZGVmaW5lCUZJUlNUX01P TlRICTEKKyNkZWZpbmUJTEFTVF9NT05USAkxMgorI2RlZmluZQlNT05USF9DT1VOVAkoTEFTVF9N T05USCAtIEZJUlNUX01PTlRIICsgMSkKKworLyogbm90ZSBvbiBET1c6IDAgYW5kIDcgYXJlIGJv dGggU3VuZGF5LCBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLiAqLworI2RlZmluZQlGSVJTVF9E T1cJMAorI2RlZmluZQlMQVNUX0RPVwk3CisjZGVmaW5lCURPV19DT1VOVAkoTEFTVF9ET1cgLSBG SVJTVF9ET1cgKyAxKQorCisvKgorICogQmVjYXVzZSBjcm9udGFiL2F0IGZpbGVzIG1heSBiZSBv d25lZCBieSB0aGVpciByZXNwZWN0aXZlIHVzZXJzIHdlCisgKiB0YWtlIGV4dHJlbWUgY2FyZSBp biBvcGVuaW5nIHRoZW0uICBJZiB0aGUgT1MgbGFja3MgdGhlIE9fTk9GT0xMT1cKKyAqIHdlIHdp bGwganVzdCBoYXZlIHRvIGxpdmUgd2l0aG91dCBpdC4gIEluIG9yZGVyIGZvciB0aGlzIHRvIGJl IGFuCisgKiBpc3N1ZSBhbiBhdHRhY2tlciB3b3VsZCBoYXZlIHRvIHN1YnZlcnQgZ3JvdXAgQ1JP Tl9HUk9VUC4KKyAqLworI2lmbmRlZiBPX05PRk9MTE9XCisjZGVmaW5lIE9fTk9GT0xMT1cJMAor I2VuZGlmCisKKyNkZWZpbmUgICAgICAgIFJFTE9BRF9DUk9OICAgICAweDIKZGlmZiAtcnVOIC91 c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9wYXRobmFtZXMuaCBmcmVlYnNkX2Nyb24vY3Jvbi9w YXRobmFtZXMuaAotLS0gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL3BhdGhuYW1lcy5oCTIw MTQtMDEtMTYgMjE6NDM6NDkuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vY3Jvbi9w YXRobmFtZXMuaAkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MzQ0NDgxMiArMDIwMApAQCAtMSwzMSAr MSwzOCBAQAogLyogQ29weXJpZ2h0IDE5OTMsMTk5NCBieSBQYXVsIFZpeGllCiAgKiBBbGwgcmln aHRzIHJlc2VydmVkCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBieSBJbnRlcm5l dCBTeXN0ZW1zIENvbnNvcnRpdW0sIEluYy4gKCJJU0MiKQorICogQ29weXJpZ2h0IChjKSAxOTk3 LDIwMDAgYnkgSW50ZXJuZXQgU29mdHdhcmUgQ29uc29ydGl1bSwgSW5jLgogICoKLSAqIERpc3Ry aWJ1dGUgZnJlZWx5LCBleGNlcHQ6IGRvbid0IHJlbW92ZSBteSBuYW1lIGZyb20gdGhlIHNvdXJj ZSBvcgotICogZG9jdW1lbnRhdGlvbiAoZG9uJ3QgdGFrZSBjcmVkaXQgZm9yIG15IHdvcmspLCBt YXJrIHlvdXIgY2hhbmdlcyAoZG9uJ3QKLSAqIGdldCBtZSBibGFtZWQgZm9yIHlvdXIgcG9zc2li bGUgYnVncyksIGRvbid0IGFsdGVyIG9yIHJlbW92ZSB0aGlzCi0gKiBub3RpY2UuICBNYXkgYmUg c29sZCBpZiBidWlsZGFibGUgc291cmNlIGlzIHByb3ZpZGVkIHRvIGJ1eWVyLiAgTm8KLSAqIHdh cnJhbnRlZSBvZiBhbnkga2luZCwgZXhwcmVzcyBvciBpbXBsaWVkLCBpcyBpbmNsdWRlZCB3aXRo IHRoaXMKLSAqIHNvZnR3YXJlOyB1c2UgYXQgeW91ciBvd24gcmlzaywgcmVzcG9uc2liaWxpdHkg Zm9yIGRhbWFnZXMgKGlmIGFueSkgdG8KLSAqIGFueW9uZSByZXN1bHRpbmcgZnJvbSB0aGUgdXNl IG9mIHRoaXMgc29mdHdhcmUgcmVzdHMgZW50aXJlbHkgd2l0aCB0aGUKLSAqIHVzZXIuCisgKiBQ ZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3 YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3Jh bnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRo aXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAgKgotICogU2VuZCBi dWcgcmVwb3J0cywgYnVnIGZpeGVzLCBlbmhhbmNlbWVudHMsIHJlcXVlc3RzLCBmbGFtZXMsIGV0 Yy4sIGFuZAotICogSSdsbCB0cnkgdG8ga2VlcCBhIHZlcnNpb24gdXAgdG8gZGF0ZS4gIEkgY2Fu IGJlIHJlYWNoZWQgYXMgZm9sbG93czoKLSAqIFBhdWwgVml4aWUgICAgICAgICAgPHBhdWxAdml4 LmNvbT4gICAgICAgICAgdXVuZXQhZGVjd3JsIXZpeGllIXBhdWwKKyAqIFRIRSBTT0ZUV0FSRSBJ UyBQUk9WSURFRCAiQVMgSVMiIEFORCBJU0MgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBX SVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5U SUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuICBJTiBOTyBFVkVOVCBTSEFM TCBJU0MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9S IENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNV TFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisg KiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9O LCBBUklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVS Rk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCiAvKgotICogJEZyZWVCU0Q6IHJlbGVh c2UvMTAuMC4wL3Vzci5zYmluL2Nyb24vY3Jvbi9wYXRobmFtZXMuaCA1MDQ3OSAxOTk5LTA4LTI4 IDAxOjM1OjU5WiBwZXRlciAkCisgKiAkSWQ6IHBhdGhuYW1lcy5oLHYgMS45IDIwMDQvMDEvMjMg MTg6NTY6NDMgdml4aWUgRXhwICQKICAqLwogCisjaWZuZGVmIF9QQVRITkFNRVNfSF8KKyNkZWZp bmUgX1BBVEhOQU1FU19IXworCiAjaWYgKGRlZmluZWQoQlNEKSkgJiYgKEJTRCA+PSAxOTkxMDMp IHx8IGRlZmluZWQoX19saW51eCkgfHwgZGVmaW5lZChBSVgpCiAjIGluY2x1ZGUgPHBhdGhzLmg+ CiAjZW5kaWYgLypCU0QqLwogCiAjaWZuZGVmIENST05ESVIKLQkJCS8qIENST05ESVIgaXMgd2hl cmUgY3JvbmQoOCkgYW5kIGNyb250YWIoMSkgYm90aCBjaGRpcgotCQkJICogdG87IFNQT09MX0RJ UiwgQUxMT1dfRklMRSwgREVOWV9GSUxFLCBhbmQgTE9HX0ZJTEUKKwkJCS8qIENST05ESVIgaXMg d2hlcmUgY3Jvbig4KSBhbmQgY3JvbnRhYigxKSBib3RoIGNoZGlyCisJCQkgKiB0bzsgU1BPT0xf RElSLCBDUk9OX0FMTE9XLCBDUk9OX0RFTlksIGFuZCBMT0dfRklMRQogCQkJICogYXJlIGFsbCBy ZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeS4KIAkJCSAqLwogI2RlZmluZSBDUk9ORElSCQkiL3Zh ci9jcm9uIgpAQCAtMzQsMjQgKzQxLDI5IEBACiAJCQkvKiBTUE9PTERJUiBpcyB3aGVyZSB0aGUg Y3JvbnRhYnMgbGl2ZS4KIAkJCSAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgaGF2ZSBpdHMgbW9kdGlt ZSB1cGRhdGVkCiAJCQkgKiB3aGVuZXZlciBjcm9udGFiKDEpIGNoYW5nZXMgYSBjcm9udGFiOyB0 aGlzIGlzCi0JCQkgKiB0aGUgc2lnbmFsIGZvciBjcm9uZCg4KSB0byBsb29rIGF0IGVhY2ggaW5k aXZpZHVhbAorCQkJICogdGhlIHNpZ25hbCBmb3IgY3Jvbig4KSB0byBsb29rIGF0IGVhY2ggaW5k aXZpZHVhbAogCQkJICogY3JvbnRhYiBmaWxlIGFuZCByZWxvYWQgdGhvc2Ugd2hvc2UgbW9kdGlt ZXMgYXJlCiAJCQkgKiBuZXdlciB0aGFuIHRoZXkgd2VyZSBsYXN0IHRpbWUgYXJvdW5kIChvciB3 aGljaAogCQkJICogZGlkbid0IGV4aXN0IGxhc3QgdGltZSBhcm91bmQuLi4pCiAJCQkgKi8KICNk ZWZpbmUgU1BPT0xfRElSCSJ0YWJzIgogCi0JCQkvKiB1bmRlZmluaW5nIHRoZXNlIHR1cm5zIG9m ZiB0aGVpciBmZWF0dXJlcy4gIG5vdGUKLQkJCSAqIHRoYXQgQUxMT1dfRklMRSBhbmQgREVOWV9G SUxFIG11c3QgYm90aCBiZSBkZWZpbmVkCi0JCQkgKiBpbiBvcmRlciB0byBlbmFibGUgdGhlIGFs bG93L2RlbnkgY29kZS4gIElmIG5laXRoZXIKLQkJCSAqIExPR19GSUxFIG9yIFNZU0xPRyBpcyBk ZWZpbmVkLCB3ZSBkb24ndCBsb2cuICBJZgotCQkJICogYm90aCBhcmUgZGVmaW5lZCwgd2UgbG9n IGJvdGggd2F5cy4KLQkJCSAqLwotI2RlZmluZQlBTExPV19GSUxFCSJhbGxvdyIJCS8qLSovCi0j ZGVmaW5lIERFTllfRklMRQkiZGVueSIJCS8qLSovCi0vKiNkZWZpbmUgTE9HX0ZJTEUgICAgICAg ICJsb2ciKi8gICAgICAgICAgIC8qLSovCisJCQkvKiBjcm9uIGFsbG93L2RlbnkgZmlsZS4gIEF0 IGxlYXN0IGNyb24uZGVueSBtdXN0CisJCQkgKiBleGlzdCBmb3Igb3JkaW5hcnkgdXNlcnMgdG8g cnVuIGNyb250YWIuCisJCQkgKi8KKyNkZWZpbmUJQUxMT1dfRklMRQkiYWxsb3ciCisjZGVmaW5l CURFTllfRklMRQkiZGVueSIKKworCQkJLyogdW5kZWZpbmluZyB0aGlzIHR1cm5zIG9mZiBsb2dn aW5nIHRvIGEgZmlsZS4gIElmCisJCQkgKiBuZWl0aGVyIExPR19GSUxFIG9yIFNZU0xPRyBpcyBk ZWZpbmVkLCB3ZSBkb24ndCBsb2cuCisJCQkgKiBJZiBib3RoIGFyZSBkZWZpbmVkLCB3ZSBsb2cg Ym90aCB3YXlzLiAgTm90ZSB0aGF0IGlmCisJCQkgKiBMT0dfQ1JPTiBpcyBkZWZpbmVkIGJ5IDxz eXNsb2cuaD4sIExPR19GSUxFIHdpbGwgbm90CisJCQkgKiBiZSB1c2VkLgorCQkJICovCisjZGVm aW5lIExPR19GSUxFCSJsb2ciCiAKIAkJCS8qIHdoZXJlIHNob3VsZCB0aGUgZGFlbW9uIHN0aWNr IGl0cyBQSUQ/CisJCQkgKiBQSURESVIgbXVzdCBlbmQgaW4gJy8nLgogCQkJICovCiAjaWZkZWYg X1BBVEhfVkFSUlVOCiAjIGRlZmluZSBQSURESVIJX1BBVEhfVkFSUlVOCkBAIC01OSw2ICs3MSw4 IEBACiAjIGRlZmluZSBQSURESVIgIi9ldGMvIgogI2VuZGlmCiAjZGVmaW5lIFBJREZJTEUJCSIl c2Nyb24ucGlkIgorI2RlZmluZSBTT0NLRklMRSAgICAgICAgIi5zb2NrIgorI2RlZmluZSBfUEFU SF9DUk9OX1BJRAlQSURESVIgUElERklMRQogCiAJCQkvKiA0LjNCU0Qtc3R5bGUgY3JvbnRhYiAq LwogI2RlZmluZSBTWVNDUk9OVEFCCSIvZXRjL2Nyb250YWIiCkBAIC03Miw2ICs4NiwxMCBAQAog IyBkZWZpbmUgRURJVE9SICIvdXNyL3VjYi92aSIKICNlbmRpZgogCisjaWZuZGVmIF9QQVRIX1NF TkRNQUlMCisjIGRlZmluZSBfUEFUSF9TRU5ETUFJTCAiL3Vzci9saWIvc2VuZG1haWwiCisjZW5k aWYKKwogI2lmbmRlZiBfUEFUSF9CU0hFTEwKICMgZGVmaW5lIF9QQVRIX0JTSEVMTCAiL2Jpbi9z aCIKICNlbmRpZgpAQCAtNzksMyArOTcsMTMgQEAKICNpZm5kZWYgX1BBVEhfREVGUEFUSAogIyBk ZWZpbmUgX1BBVEhfREVGUEFUSCAiL3Vzci9iaW46L2JpbiIKICNlbmRpZgorCisjaWZuZGVmIF9Q QVRIX1RNUAorIyBkZWZpbmUgX1BBVEhfVE1QICIvdG1wIgorI2VuZGlmCisKKyNpZm5kZWYgX1BB VEhfREVWTlVMTAorIyBkZWZpbmUgX1BBVEhfREVWTlVMTCAiL2Rldi9udWxsIgorI2VuZGlmCisK KyNlbmRpZiAvKiBfUEFUSE5BTUVTX0hfICovCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9j cm9uL2Nyb24vcG9wZW4uYyBmcmVlYnNkX2Nyb24vY3Jvbi9wb3Blbi5jCi0tLSAvdXNyL3NyYy91 c3Iuc2Jpbi9jcm9uL2Nyb24vcG9wZW4uYwkyMDE0LTAxLTE2IDIxOjQzOjQ5LjAwMDAwMDAwMCAr MDEwMAorKysgZnJlZWJzZF9jcm9uL2Nyb24vcG9wZW4uYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3 MzQ0NDgxMiArMDIwMApAQCAtMjgsNyArMjgsNyBAQAogc3RhdGljIGNoYXIgc2Njc2lkW10gPSAi QCgjKXBvcGVuLmMJNS43IChCZXJrZWxleSkgMi8xNC84OSI7CiAjZW5kaWYKIHN0YXRpYyBjb25z dCBjaGFyIHJjc2lkW10gPQotICAiJEZyZWVCU0Q6IHJlbGVhc2UvMTAuMC4wL3Vzci5zYmluL2Ny b24vY3Jvbi9wb3Blbi5jIDE1OTUyNyAyMDA2LTA2LTExIDIxOjEzOjQ5WiBtYXhpbSAkIjsKKyAg IiRGcmVlQlNEOiByZWxlbmcvMTAuMC91c3Iuc2Jpbi9jcm9uL2Nyb24vcG9wZW4uYyAxNTk1Mjcg MjAwNi0wNi0xMSAyMToxMzo0OVogbWF4aW0gJCI7CiAjZW5kaWYgLyogbm90IGxpbnQgKi8KIAog I2luY2x1ZGUgImNyb24uaCIKZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi9z dHJ1Y3RzLmggZnJlZWJzZF9jcm9uL2Nyb24vc3RydWN0cy5oCi0tLSAvdXNyL3NyYy91c3Iuc2Jp bi9jcm9uL2Nyb24vc3RydWN0cy5oCTE5NzAtMDEtMDEgMDE6MDA6MDAuMDAwMDAwMDAwICswMTAw CisrKyBmcmVlYnNkX2Nyb24vY3Jvbi9zdHJ1Y3RzLmgJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzM0 NDQ4MTIgKzAyMDAKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICRJZDogc3RydWN0cy5oLHYgMS43 IDIwMDQvMDEvMjMgMTg6NTY6NDMgdml4aWUgRXhwICQKKyAqLworCisvKgorICogQ29weXJpZ2h0 IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAoIklTQyIpCisg KiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVt LCBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3Ry aWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBm ZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmln aHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVz LgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBJU0MgRElTQ0xB SU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xV RElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ VE5FU1MuICBJTiBOTyBFVkVOVCBTSEFMTCBJU0MgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJ QUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFN QUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQ Uk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0Ug T1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAorICogT0YgT1IgSU4gQ09OTkVD VElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLwor Cit0eXBlZGVmCXN0cnVjdCBfZW50cnkgeworCXN0cnVjdCBfZW50cnkJKm5leHQ7CisJdWlkX3QJ dWlkOworCWdpZF90CWdpZDsKKyNpZmRlZiBMT0dJTl9DQVAKKwljaGFyCSpjbGFzczsKKyNlbmRp ZgorCWNoYXIJCSoqZW52cDsKKwljaGFyCQkqY21kOworCWJpdHN0cl90CWJpdF9kZWNsKHNlY29u ZCwgU0VDT05EX0NPVU5UKTsKKwliaXRzdHJfdAliaXRfZGVjbChtaW51dGUsIE1JTlVURV9DT1VO VCk7CisJYml0c3RyX3QJYml0X2RlY2woaG91ciwgICBIT1VSX0NPVU5UKTsKKwliaXRzdHJfdAli aXRfZGVjbChkb20sICAgIERPTV9DT1VOVCk7CisJYml0c3RyX3QJYml0X2RlY2wobW9udGgsICBN T05USF9DT1VOVCk7CisJYml0c3RyX3QJYml0X2RlY2woZG93LCAgICBET1dfQ09VTlQpOworCWlu dAkJZmxhZ3M7CisjZGVmaW5lCU1JTl9TVEFSCTB4MDEKKyNkZWZpbmUJSFJfU1RBUgkJMHgwMgor I2RlZmluZQlET01fU1RBUgkweDA0CisjZGVmaW5lCURPV19TVEFSCTB4MDgKKyNkZWZpbmUJV0hF Tl9SRUJPT1QJMHgxMAorI2RlZmluZQlET05UX0xPRwkweDIwCisJdGltZV90CQlsYXN0cnVuOwor fSBlbnRyeTsKKworCQkJLyogdGhlIGNyb250YWIgZGF0YWJhc2Ugd2lsbCBiZSBhIGxpc3Qgb2Yg dGhlCisJCQkgKiBmb2xsb3dpbmcgc3RydWN0dXJlLCBvbmUgZWxlbWVudCBwZXIgdXNlcgorCQkJ ICogcGx1cyBvbmUgZm9yIHRoZSBzeXN0ZW0uCisJCQkgKgorCQkJICogVGhlc2UgYXJlIHRoZSBj cm9udGFicy4KKwkJCSAqLworCit0eXBlZGVmCXN0cnVjdCBfdXNlciB7CisJc3RydWN0IF91c2Vy CSpuZXh0LCAqcHJldjsJLyogbGlua3MgKi8KKwljaGFyCQkqbmFtZTsKKwl0aW1lX3QJCW10aW1l OwkJLyogbGFzdCBtb2R0aW1lIG9mIGNyb250YWIgKi8KKwllbnRyeQkJKmNyb250YWI7CS8qIHRo aXMgcGVyc29uJ3MgY3JvbnRhYiAqLworfSB1c2VyOworCit0eXBlZGVmCXN0cnVjdCBfY3Jvbl9k YiB7CisJdXNlcgkJKmhlYWQsICp0YWlsOwkvKiBsaW5rcyAqLworCXRpbWVfdAkJbXRpbWU7CQkv KiBsYXN0IG1vZHRpbWUgb24gc3Bvb2xkaXIgKi8KK30gY3Jvbl9kYjsKKwkJCQkvKiBpbiB0aGUg QyB0cmFkaXRpb24sIHdlIG9ubHkgY3JlYXRlCisJCQkJICogdmFyaWFibGVzIGZvciB0aGUgbWFp biBwcm9ncmFtLCBqdXN0CisJCQkJICogZXh0ZXJuIHRoZW0gZWxzZXdoZXJlLgorCQkJCSAqLwpk aWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9uL3VzZXIuYyBmcmVlYnNkX2Nyb24v Y3Jvbi91c2VyLmMKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3Jvbi91c2VyLmMJMjAxNC0w MS0xNiAyMTo0Mzo0OS4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9jcm9uL3VzZXIu YwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3MzQ0NDgxMiArMDIwMApAQCAtMSwzOCArMSwzNyBAQAog LyogQ29weXJpZ2h0IDE5ODgsMTk5MCwxOTkzLDE5OTQgYnkgUGF1bCBWaXhpZQogICogQWxsIHJp Z2h0cyByZXNlcnZlZAorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgYnkgSW50ZXJu ZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuICgiSVNDIikKKyAqIENvcHlyaWdodCAoYykgMTk5 NywyMDAwIGJ5IEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0sIEluYy4KICAqCi0gKiBEaXN0 cmlidXRlIGZyZWVseSwgZXhjZXB0OiBkb24ndCByZW1vdmUgbXkgbmFtZSBmcm9tIHRoZSBzb3Vy Y2Ugb3IKLSAqIGRvY3VtZW50YXRpb24gKGRvbid0IHRha2UgY3JlZGl0IGZvciBteSB3b3JrKSwg bWFyayB5b3VyIGNoYW5nZXMgKGRvbid0Ci0gKiBnZXQgbWUgYmxhbWVkIGZvciB5b3VyIHBvc3Np YmxlIGJ1Z3MpLCBkb24ndCBhbHRlciBvciByZW1vdmUgdGhpcwotICogbm90aWNlLiAgTWF5IGJl IHNvbGQgaWYgYnVpbGRhYmxlIHNvdXJjZSBpcyBwcm92aWRlZCB0byBidXllci4gIE5vCi0gKiB3 YXJyYW50ZWUgb2YgYW55IGtpbmQsIGV4cHJlc3Mgb3IgaW1wbGllZCwgaXMgaW5jbHVkZWQgd2l0 aCB0aGlzCi0gKiBzb2Z0d2FyZTsgdXNlIGF0IHlvdXIgb3duIHJpc2ssIHJlc3BvbnNpYmlsaXR5 IGZvciBkYW1hZ2VzIChpZiBhbnkpIHRvCi0gKiBhbnlvbmUgcmVzdWx0aW5nIGZyb20gdGhlIHVz ZSBvZiB0aGlzIHNvZnR3YXJlIHJlc3RzIGVudGlyZWx5IHdpdGggdGhlCi0gKiB1c2VyLgorICog UGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0 d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdy YW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0 aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgogICoKLSAqIFNlbmQg YnVnIHJlcG9ydHMsIGJ1ZyBmaXhlcywgZW5oYW5jZW1lbnRzLCByZXF1ZXN0cywgZmxhbWVzLCBl dGMuLCBhbmQKLSAqIEknbGwgdHJ5IHRvIGtlZXAgYSB2ZXJzaW9uIHVwIHRvIGRhdGUuICBJIGNh biBiZSByZWFjaGVkIGFzIGZvbGxvd3M6Ci0gKiBQYXVsIFZpeGllICAgICAgICAgIDxwYXVsQHZp eC5jb20+ICAgICAgICAgIHV1bmV0IWRlY3dybCF2aXhpZSFwYXVsCisgKiBUSEUgU09GVFdBUkUg SVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICog V0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFO VElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hB TEwgSVNDIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBP UiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVT VUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgor ICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElP TiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBF UkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAotI2lmICFkZWZpbmVkKGxpbnQpICYm ICFkZWZpbmVkKExJTlQpCi1zdGF0aWMgY29uc3QgY2hhciByY3NpZFtdID0KLSAgIiRGcmVlQlNE OiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Nyb24vdXNlci5jIDUwNDc5IDE5OTktMDgt MjggMDE6MzU6NTlaIHBldGVyICQiOwotI2VuZGlmCisvLyNpZiAhZGVmaW5lZChsaW50KSAmJiAh ZGVmaW5lZChMSU5UKQorLy9zdGF0aWMgY2hhciByY3NpZFtdID0gIiRJZDogdXNlci5jLHYgMS41 IDIwMDQvMDEvMjMgMTg6NTY6NDMgdml4aWUgRXhwICQiOworLy8jZW5kaWYKIAogLyogdml4IDI2 amFuODcgW2xvZyBpcyBpbiBSQ1MgZmlsZV0KICAqLwogCi0KICNpbmNsdWRlICJjcm9uLmgiCiAK IHN0YXRpYyBjaGFyICpVc2VyX25hbWU7Ci0KIHZvaWQKLWZyZWVfdXNlcih1KQotCXVzZXIJKnU7 Ci17Ci0JZW50cnkJKmUsICpuZTsKK2ZyZWVfdXNlcih1c2VyICp1KSB7CisJZW50cnkgKmUsICpu ZTsKIAogCWZyZWUodS0+bmFtZSk7CiAJZm9yIChlID0gdS0+Y3JvbnRhYjsgIGUgIT0gTlVMTDsg IGUgPSBuZSkgewpAQCAtNDMsNTYgKzQyLDQ5IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1sb2dfZXJy b3IobXNnKQotCWNoYXIJKm1zZzsKLXsKK2xvZ19lcnJvcihjaGFyICptc2cpIHsKIAlsb2dfaXQo VXNlcl9uYW1lLCBnZXRwaWQoKSwgIlBBUlNFIiwgbXNnKTsKIH0KIAogdXNlciAqCi1sb2FkX3Vz ZXIoY3JvbnRhYl9mZCwgcHcsIG5hbWUpCi0JaW50CQljcm9udGFiX2ZkOwotCXN0cnVjdCBwYXNz d2QJKnB3OwkJLyogTlVMTCBpbXBsaWVzIHN5c2Nyb250YWIgKi8KLQljaGFyCQkqbmFtZTsKLXsK LQljaGFyCWVudnN0cltNQVhfRU5WU1RSXTsKLQlGSUxFCSpmaWxlOwotCXVzZXIJKnU7Ci0JZW50 cnkJKmU7Ci0JaW50CXN0YXR1czsKLQljaGFyCSoqZW52cCwgKip0ZW52cDsKK2xvYWRfdXNlcihp bnQgY3JvbnRhYl9mZCwgc3RydWN0IHBhc3N3ZAkqcHcsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKwlj aGFyIGVudnN0cltNQVhfRU5WU1RSXTsKKwlGSUxFICpmaWxlOworCXVzZXIgKnU7CisJZW50cnkg KmU7CisJaW50IHN0YXR1cywgc2F2ZV9lcnJubzsKKwljaGFyICoqZW52cCwgKip0ZW52cDsKIAog CWlmICghKGZpbGUgPSBmZG9wZW4oY3JvbnRhYl9mZCwgInIiKSkpIHsKLQkJd2FybigiZmRvcGVu IG9uIGNyb250YWJfZmQgaW4gbG9hZF91c2VyIik7Ci0JCXJldHVybiBOVUxMOworCQlwZXJyb3Io ImZkb3BlbiBvbiBjcm9udGFiX2ZkIGluIGxvYWRfdXNlciIpOworCQlyZXR1cm4gKE5VTEwpOwog CX0KIAogCURlYnVnKERQQVJTLCAoImxvYWRfdXNlcigpXG4iKSkKIAogCS8qIGZpbGUgaXMgb3Bl bi4gIGJ1aWxkIHVzZXIgZW50cnksIHRoZW4gcmVhZCB0aGUgY3JvbnRhYiBmaWxlLgogCSAqLwot CWlmICgodSA9ICh1c2VyICopIG1hbGxvYyhzaXplb2YodXNlcikpKSA9PSBOVUxMKSB7Ci0JCWVy cm5vID0gRU5PTUVNOwotCQlyZXR1cm4gTlVMTDsKLQl9CisJaWYgKCh1ID0gKHVzZXIgKikgbWFs bG9jKHNpemVvZih1c2VyKSkpID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CiAJaWYgKCh1LT5u YW1lID0gc3RyZHVwKG5hbWUpKSA9PSBOVUxMKSB7CisJCXNhdmVfZXJybm8gPSBlcnJubzsKIAkJ ZnJlZSh1KTsKLQkJZXJybm8gPSBFTk9NRU07Ci0JCXJldHVybiBOVUxMOworCQllcnJubyA9IHNh dmVfZXJybm87CisJCXJldHVybiAoTlVMTCk7CiAJfQogCXUtPmNyb250YWIgPSBOVUxMOwogCi0J LyogCi0JICogaW5pdCBlbnZpcm9ubWVudC4gIHRoaXMgd2lsbCBiZSBjb3BpZWQvYXVnbWVudGVk IGZvciBlYWNoIGVudHJ5LgorCS8qIGluaXQgZW52aXJvbm1lbnQuICB0aGlzIHdpbGwgYmUgY29w aWVkL2F1Z21lbnRlZCBmb3IgZWFjaCBlbnRyeS4KIAkgKi8KIAlpZiAoKGVudnAgPSBlbnZfaW5p dCgpKSA9PSBOVUxMKSB7CisJCXNhdmVfZXJybm8gPSBlcnJubzsKIAkJZnJlZSh1LT5uYW1lKTsK IAkJZnJlZSh1KTsKLQkJcmV0dXJuIE5VTEw7CisJCWVycm5vID0gc2F2ZV9lcnJubzsKKwkJcmV0 dXJuIChOVUxMKTsKIAl9CiAKLQkvKgotCSAqIGxvYWQgdGhlIGNyb250YWIKKwkvKiBsb2FkIHRo ZSBjcm9udGFiCiAJICovCiAJd2hpbGUgKChzdGF0dXMgPSBsb2FkX2VudihlbnZzdHIsIGZpbGUp KSA+PSBPSykgewogCQlzd2l0Y2ggKHN0YXR1cykgewpAQCAtMTAxLDcgKzkzLDcgQEAKIAkJCXUg PSBOVUxMOwogCQkJZ290byBkb25lOwogCQljYXNlIEZBTFNFOgotCQkJVXNlcl9uYW1lID0gdS0+ bmFtZTsgICAgLyogZm9yIGxvZ19lcnJvciAqLworCQkJVXNlcl9uYW1lID0gdS0+bmFtZTsKIAkJ CWUgPSBsb2FkX2VudHJ5KGZpbGUsIGxvZ19lcnJvciwgcHcsIGVudnApOwogCQkJaWYgKGUpIHsK IAkJCQllLT5uZXh0ID0gdS0+Y3JvbnRhYjsKQEAgLTEwOSwxMyArMTAxLDE0IEBACiAJCQl9CiAJ CQlicmVhazsKIAkJY2FzZSBUUlVFOgotCQkJaWYgKCh0ZW52cCA9IGVudl9zZXQoZW52cCwgZW52 c3RyKSkpIHsKLQkJCQllbnZwID0gdGVudnA7Ci0JCQl9IGVsc2UgeworCQkJaWYgKCh0ZW52cCA9 IGVudl9zZXQoZW52cCwgZW52c3RyKSkgPT0gTlVMTCkgeworCQkJCXNhdmVfZXJybm8gPSBlcnJu bzsKIAkJCQlmcmVlX3VzZXIodSk7CiAJCQkJdSA9IE5VTEw7CisJCQkJZXJybm8gPSBzYXZlX2Vy cm5vOwogCQkJCWdvdG8gZG9uZTsKIAkJCX0KKwkJCWVudnAgPSB0ZW52cDsKIAkJCWJyZWFrOwog CQl9CiAJfQpAQCAtMTI0LDUgKzExNyw1IEBACiAJZW52X2ZyZWUoZW52cCk7CiAJZmNsb3NlKGZp bGUpOwogCURlYnVnKERQQVJTLCAoIi4uLmxvYWRfdXNlcigpIGRvbmVcbiIpKQotCXJldHVybiB1 OworCXJldHVybiAodSk7CiB9CmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb250 YWIvTWFrZWZpbGUgZnJlZWJzZF9jcm9uL2Nyb250YWIvTWFrZWZpbGUKLS0tIC91c3Ivc3JjL3Vz ci5zYmluL2Nyb24vY3JvbnRhYi9NYWtlZmlsZQkyMDE0LTAxLTE2IDIxOjQzOjUwLjAwMDAwMDAw MCArMDEwMAorKysgZnJlZWJzZF9jcm9uL2Nyb250YWIvTWFrZWZpbGUJMjAxNC0wNi0xMSAxNjo0 Mjo1NS4yNzM0NDQ4MTIgKzAyMDAKQEAgLTEsMTEgKzEsMTIgQEAKLSMgJEZyZWVCU0Q6IHJlbGVh c2UvMTAuMC4wL3Vzci5zYmluL2Nyb24vY3JvbnRhYi9NYWtlZmlsZSAxODUwNDAgMjAwOC0xMS0x OCAwMDoxMjoxNVogbWF0dGVvICQKKyMgJEZyZWVCU0Q6IHJlbGVuZy8xMC4wL3Vzci5zYmluL2Ny b24vY3JvbnRhYi9NYWtlZmlsZSAxODUwNDAgMjAwOC0xMS0xOCAwMDoxMjoxNVogbWF0dGVvICQK IAogQklORElSPQkvdXNyL2JpbgogCiBQUk9HPQljcm9udGFiCiBNQU49CWNyb250YWIuMSBjcm9u dGFiLjUKIEJJTk9XTj0Jcm9vdAotQklOTU9ERT00NTU1CitCSU5HUlA9IGNyb250YWIKK0JJTk1P REU9MjU1NQogUFJFQ0lPVVNQUk9HPQogCiBXQVJOUz89CTMKZGlmZiAtcnVOIC91c3Ivc3JjL3Vz ci5zYmluL2Nyb24vY3JvbnRhYi9jcm9udGFiLjEgZnJlZWJzZF9jcm9uL2Nyb250YWIvY3JvbnRh Yi4xCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb250YWIvY3JvbnRhYi4xCTIwMTQtMDEt MTYgMjE6NDM6NTAuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vY3JvbnRhYi9jcm9u dGFiLjEJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzM0NDQ4MTIgKzAyMDAKQEAgLTE1LDcgKzE1LDcg QEAKIC5cIiAqIFBhdWwgVml4aWUgICAgICAgICAgPHBhdWxAdml4LmNvbT4gICAgICAgICAgdXVu ZXQhZGVjd3JsIXZpeGllIXBhdWwKIC5cIiAqLwogLlwiCi0uXCIgJEZyZWVCU0Q6IHJlbGVhc2Uv MTAuMC4wL3Vzci5zYmluL2Nyb24vY3JvbnRhYi9jcm9udGFiLjEgMjA4MDU0IDIwMTAtMDUtMTQg MDE6MjU6MzBaIGJydWVmZmVyICQKKy5cIiAkRnJlZUJTRDogcmVsZW5nLzEwLjAvdXNyLnNiaW4v Y3Jvbi9jcm9udGFiL2Nyb250YWIuMSAyMDgwNTQgMjAxMC0wNS0xNCAwMToyNTozMFogYnJ1ZWZm ZXIgJAogLlwiCiAuRGQgTWF5IDEzLCAyMDEwCiAuRHQgQ1JPTlRBQiAxCmRpZmYgLXJ1TiAvdXNy L3NyYy91c3Iuc2Jpbi9jcm9uL2Nyb250YWIvY3JvbnRhYi41IGZyZWVic2RfY3Jvbi9jcm9udGFi L2Nyb250YWIuNQotLS0gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9udGFiL2Nyb250YWIuNQky MDE0LTAxLTE2IDIxOjQzOjUwLjAwMDAwMDAwMCArMDEwMAorKysgZnJlZWJzZF9jcm9uL2Nyb250 YWIvY3JvbnRhYi41CTIwMTQtMDYtMTEgMTY6NDI6NTUuMjczNDQ0ODEyICswMjAwCkBAIC0xNSw3 ICsxNSw3IEBACiAuXCIgKiBQYXVsIFZpeGllICAgICAgICAgIDxwYXVsQHZpeC5jb20+ICAgICAg ICAgIHV1bmV0IWRlY3dybCF2aXhpZSFwYXVsCiAuXCIgKi8KIC5cIgotLlwiICRGcmVlQlNEOiBy ZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Nyb250YWIvY3JvbnRhYi41IDI0MjEwMSAyMDEy LTEwLTI1IDIyOjU0OjI5WiBzb2JvbWF4ICQKKy5cIiAkRnJlZUJTRDogcmVsZW5nLzEwLjAvdXNy LnNiaW4vY3Jvbi9jcm9udGFiL2Nyb250YWIuNSAyNDIxMDEgMjAxMi0xMC0yNSAyMjo1NDoyOVog c29ib21heCAkCiAuXCIKIC5EZCBBcHJpbCAyOCwgMjAxMgogLkR0IENST05UQUIgNQpkaWZmIC1y dU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9jcm9udGFiL2Nyb250YWIuYyBmcmVlYnNkX2Nyb24v Y3JvbnRhYi9jcm9udGFiLmMKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vY3JvbnRhYi9jcm9u dGFiLmMJMjAxNC0wMS0xNiAyMTo0Mzo1MC4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jv bi9jcm9udGFiL2Nyb250YWIuYwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3NDQ0NDg5NiArMDIwMApA QCAtMSwyNCArMSwyNiBAQAogLyogQ29weXJpZ2h0IDE5ODgsMTk5MCwxOTkzLDE5OTQgYnkgUGF1 bCBWaXhpZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZAorICovCisKKy8qCisgKiBDb3B5cmlnaHQg KGMpIDIwMDQgYnkgSW50ZXJuZXQgU3lzdGVtcyBDb25zb3J0aXVtLCBJbmMuICgiSVNDIikKKyAq IENvcHlyaWdodCAoYykgMTk5NywyMDAwIGJ5IEludGVybmV0IFNvZnR3YXJlIENvbnNvcnRpdW0s IEluYy4KICAqCi0gKiBEaXN0cmlidXRlIGZyZWVseSwgZXhjZXB0OiBkb24ndCByZW1vdmUgbXkg bmFtZSBmcm9tIHRoZSBzb3VyY2Ugb3IKLSAqIGRvY3VtZW50YXRpb24gKGRvbid0IHRha2UgY3Jl ZGl0IGZvciBteSB3b3JrKSwgbWFyayB5b3VyIGNoYW5nZXMgKGRvbid0Ci0gKiBnZXQgbWUgYmxh bWVkIGZvciB5b3VyIHBvc3NpYmxlIGJ1Z3MpLCBkb24ndCBhbHRlciBvciByZW1vdmUgdGhpcwot ICogbm90aWNlLiAgTWF5IGJlIHNvbGQgaWYgYnVpbGRhYmxlIHNvdXJjZSBpcyBwcm92aWRlZCB0 byBidXllci4gIE5vCi0gKiB3YXJyYW50ZWUgb2YgYW55IGtpbmQsIGV4cHJlc3Mgb3IgaW1wbGll ZCwgaXMgaW5jbHVkZWQgd2l0aCB0aGlzCi0gKiBzb2Z0d2FyZTsgdXNlIGF0IHlvdXIgb3duIHJp c2ssIHJlc3BvbnNpYmlsaXR5IGZvciBkYW1hZ2VzIChpZiBhbnkpIHRvCi0gKiBhbnlvbmUgcmVz dWx0aW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlIHJlc3RzIGVudGlyZWx5IHdpdGgg dGhlCi0gKiB1c2VyLgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRp c3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91 dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5 cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29w aWVzLgogICoKLSAqIFNlbmQgYnVnIHJlcG9ydHMsIGJ1ZyBmaXhlcywgZW5oYW5jZW1lbnRzLCBy ZXF1ZXN0cywgZmxhbWVzLCBldGMuLCBhbmQKLSAqIEknbGwgdHJ5IHRvIGtlZXAgYSB2ZXJzaW9u IHVwIHRvIGRhdGUuICBJIGNhbiBiZSByZWFjaGVkIGFzIGZvbGxvd3M6Ci0gKiBQYXVsIFZpeGll ICAgICAgICAgIDxwYXVsQHZpeC5jb20+ICAgICAgICAgIHV1bmV0IWRlY3dybCF2aXhpZSFwYXVs Ci0gKiBGcm9tIElkOiBjcm9udGFiLmMsdiAyLjEzIDE5OTQvMDEvMTcgMDM6MjA6Mzcgdml4aWUg RXhwCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgSVNDIERJU0NMQUlN UyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJ TkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO RVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgSVNDIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFM LCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFH RVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJP RklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9S IE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENPTk5FQ1RJ T04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAog I2lmICFkZWZpbmVkKGxpbnQpICYmICFkZWZpbmVkKExJTlQpCi1zdGF0aWMgY29uc3QgY2hhciBy Y3NpZFtdID0KLSAgIiRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2Nyb250 YWIvY3JvbnRhYi5jIDIzOTk5MSAyMDEyLTA5LTAxIDE0OjQ1OjE1WiBlZCAkIjsKK3N0YXRpYyBj aGFyIHJjc2lkW10gPSAiJElkOiBjcm9udGFiLmMsdiAxLjEyIDIwMDQvMDEvMjMgMTg6NTY6NDIg dml4aWUgRXhwICQiOwogI2VuZGlmCiAKIC8qIGNyb250YWIgLSBpbnN0YWxsIGFuZCBtYW5hZ2Ug cGVyLXVzZXIgY3JvbnRhYiBmaWxlcwpAQCAtMjksMzYgKzMxLDIwIEBACiAjZGVmaW5lCU1BSU5f UFJPR1JBTQogCiAjaW5jbHVkZSAiY3Jvbi5oIgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVk ZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxtZDUuaD4KLSNpbmNsdWRlIDxwYXRocy5oPgotI2luY2x1 ZGUgPHN5cy9maWxlLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpZmRlZiBVU0VfVVRJTUVT Ci0jIGluY2x1ZGUgPHN5cy90aW1lLmg+Ci0jZWxzZQotIyBpbmNsdWRlIDx0aW1lLmg+Ci0jIGlu Y2x1ZGUgPHV0aW1lLmg+Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFBPU0lYKQotIyBpbmNsdWRlIDxs b2NhbGUuaD4KLSNlbmRpZgotCi0jZGVmaW5lIE1ENV9TSVpFIDMzCiAjZGVmaW5lIE5IRUFERVJf TElORVMgMwogCi0KIGVudW0gb3B0X3QJeyBvcHRfdW5rbm93biwgb3B0X2xpc3QsIG9wdF9kZWxl dGUsIG9wdF9lZGl0LCBvcHRfcmVwbGFjZSB9OwogCiAjaWYgREVCVUdHSU5HCiBzdGF0aWMgY2hh cgkqT3B0aW9uc1tdID0geyAiPz8/IiwgImxpc3QiLCAiZGVsZXRlIiwgImVkaXQiLCAicmVwbGFj ZSIgfTsKK3N0YXRpYyBjaGFyCSpnZXRvcHRhcmdzID0gInU6bGVyeDoiOworI2Vsc2UKK3N0YXRp YyBjaGFyCSpnZXRvcHRhcmdzID0gInU6bGVyIjsKICNlbmRpZgogCi0KIHN0YXRpYwlQSURfVAkJ UGlkOwogc3RhdGljCWNoYXIJCVVzZXJbTUFYX1VOQU1FXSwgUmVhbFVzZXJbTUFYX1VOQU1FXTsK LXN0YXRpYwljaGFyCQlGaWxlbmFtZVtNQVhfRk5BTUVdOworc3RhdGljCWNoYXIJCUZpbGVuYW1l W01BWF9GTkFNRV0sIFRlbXBGaWxlbmFtZVtNQVhfRk5BTUVdOwogc3RhdGljCUZJTEUJCSpOZXdD cm9udGFiOwogc3RhdGljCWludAkJQ2hlY2tFcnJvckNvdW50Owogc3RhdGljCWVudW0gb3B0X3QJ T3B0aW9uOwpAQCAtNjYsOTUgKzUyLDEwMyBAQAogc3RhdGljCXZvaWQJCWxpc3RfY21kKHZvaWQp LAogCQkJZGVsZXRlX2NtZCh2b2lkKSwKIAkJCWVkaXRfY21kKHZvaWQpLAotCQkJcG9rZV9kYWVt b24odm9pZCksCi0JCQljaGVja19lcnJvcihjaGFyICopLAotCQkJcGFyc2VfYXJncyhpbnQgYywg Y2hhciAqdltdKTsKKwkJCXBva2VfZGFlbW9uKHVuc2lnbmVkIGNoYXIpLAorCQkJY2hlY2tfZXJy b3IoY29uc3QgY2hhciAqKSwKKwkJCXBhcnNlX2FyZ3MoaW50IGMsIGNoYXIgKnZbXSksCisJCQlk aWUoaW50KTsKIHN0YXRpYwlpbnQJCXJlcGxhY2VfY21kKHZvaWQpOwogCi0KIHN0YXRpYyB2b2lk Ci11c2FnZShjaGFyICptc2cpCi17Ci0JZnByaW50ZihzdGRlcnIsICJjcm9udGFiOiB1c2FnZSBl cnJvcjogJXNcbiIsIG1zZyk7Ci0JZnByaW50ZihzdGRlcnIsICIlc1xuJXNcbiIsCi0JCSJ1c2Fn ZTogY3JvbnRhYiBbLXUgdXNlcl0gZmlsZSIsCi0JCSIgICAgICAgY3JvbnRhYiBbLXUgdXNlcl0g eyAtZSB8IC1sIHwgLXIgfSIpOwordXNhZ2UoY29uc3QgY2hhciAqbXNnKSB7CisJZnByaW50Zihz dGRlcnIsICIlczogdXNhZ2UgZXJyb3I6ICVzXG4iLCBQcm9ncmFtTmFtZSwgbXNnKTsKKwlmcHJp bnRmKHN0ZGVyciwgInVzYWdlOlx0JXMgWy11IHVzZXJdIGZpbGVcbiIsIFByb2dyYW1OYW1lKTsK KwlmcHJpbnRmKHN0ZGVyciwgIlx0JXMgWy11IHVzZXJdIFsgLWUgfCAtbCB8IC1yIF1cbiIsIFBy b2dyYW1OYW1lKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0XHQoZGVmYXVsdCBvcGVyYXRpb24gaXMg cmVwbGFjZSwgcGVyIDEwMDMuMilcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtZVx0KGVkaXQg dXNlcidzIGNyb250YWIpXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LWxcdChsaXN0IHVzZXIn cyBjcm9udGFiKVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1yXHQoZGVsZXRlIHVzZXIncyBj cm9udGFiKVxuIik7CiAJZXhpdChFUlJPUl9FWElUKTsKIH0KIAotCiBpbnQKLW1haW4oaW50IGFy Z2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQlpbnQJZXhpdHN0YXR1czsKK21haW4oaW50IGFyZ2MsIGNo YXIgKmFyZ3ZbXSkgeworCWludCBleGl0c3RhdHVzOwogCiAJUGlkID0gZ2V0cGlkKCk7CiAJUHJv Z3JhbU5hbWUgPSBhcmd2WzBdOwogCi0jaWYgZGVmaW5lZChQT1NJWCkKIAlzZXRsb2NhbGUoTENf QUxMLCAiIik7Ci0jZW5kaWYKIAogI2lmIGRlZmluZWQoQlNEKQogCXNldGxpbmVidWYoc3RkZXJy KTsKICNlbmRpZgogCXBhcnNlX2FyZ3MoYXJnYywgYXJndik7CQkvKiBzZXRzIG1hbnkgZ2xvYmFs cywgb3BlbnMgYSBmaWxlICovCi0Jc2V0X2Nyb25fdWlkKCk7CiAJc2V0X2Nyb25fY3dkKCk7Ci0J aWYgKCFhbGxvd2VkKFVzZXIpKSB7Ci0JCXdhcm54KCJ5b3UgKCVzKSBhcmUgbm90IGFsbG93ZWQg dG8gdXNlIHRoaXMgcHJvZ3JhbSIsIFVzZXIpOworCWlmICghYWxsb3dlZChSZWFsVXNlcikpIHsK KwkJZnByaW50ZihzdGRlcnIsCisJCQkiWW91ICglcykgYXJlIG5vdCBhbGxvd2VkIHRvIHVzZSB0 aGlzIHByb2dyYW0gKCVzKVxuIiwKKwkJCVVzZXIsIFByb2dyYW1OYW1lKTsKKwkJZnByaW50Zihz dGRlcnIsICJTZWUgY3JvbnRhYigxKSBmb3IgbW9yZSBpbmZvcm1hdGlvblxuIik7CiAJCWxvZ19p dChSZWFsVXNlciwgUGlkLCAiQVVUSCIsICJjcm9udGFiIGNvbW1hbmQgbm90IGFsbG93ZWQiKTsK IAkJZXhpdChFUlJPUl9FWElUKTsKIAl9CiAJZXhpdHN0YXR1cyA9IE9LX0VYSVQ7CiAJc3dpdGNo IChPcHRpb24pIHsKLQljYXNlIG9wdF9saXN0OgkJbGlzdF9jbWQoKTsKLQkJCQlicmVhazsKLQlj YXNlIG9wdF9kZWxldGU6CWRlbGV0ZV9jbWQoKTsKLQkJCQlicmVhazsKLQljYXNlIG9wdF9lZGl0 OgkJZWRpdF9jbWQoKTsKLQkJCQlicmVhazsKLQljYXNlIG9wdF9yZXBsYWNlOglpZiAocmVwbGFj ZV9jbWQoKSA8IDApCi0JCQkJCWV4aXRzdGF0dXMgPSBFUlJPUl9FWElUOwotCQkJCWJyZWFrOwog CWNhc2Ugb3B0X3Vua25vd246Ci0JCQkJYnJlYWs7CisJCWV4aXRzdGF0dXMgPSBFUlJPUl9FWElU OworCQlicmVhazsKKwljYXNlIG9wdF9saXN0OgorCQlsaXN0X2NtZCgpOworCQlicmVhazsKKwlj YXNlIG9wdF9kZWxldGU6CisJCWRlbGV0ZV9jbWQoKTsKKwkJYnJlYWs7CisJY2FzZSBvcHRfZWRp dDoKKwkJZWRpdF9jbWQoKTsKKwkJYnJlYWs7CisJY2FzZSBvcHRfcmVwbGFjZToKKwkJaWYgKHJl cGxhY2VfY21kKCkgPCAwKQorCQkJZXhpdHN0YXR1cyA9IEVSUk9SX0VYSVQ7CisJCWJyZWFrOwor CWRlZmF1bHQ6CisJCWFib3J0KCk7CiAJfQogCWV4aXQoZXhpdHN0YXR1cyk7CiAJLypOT1RSRUFD SEVEKi8KIH0KIAotCiBzdGF0aWMgdm9pZAotcGFyc2VfYXJncyhhcmdjLCBhcmd2KQotCWludAlh cmdjOwotCWNoYXIJKmFyZ3ZbXTsKLXsKLQlpbnQJCWFyZ2NoOwotCWNoYXIJCXJlc29sdmVkX3Bh dGhbUEFUSF9NQVhdOwotCi0JaWYgKCEocHcgPSBnZXRwd3VpZChnZXR1aWQoKSkpKQotCQllcnJ4 KEVSUk9SX0VYSVQsICJ5b3VyIFVJRCBpc24ndCBpbiB0aGUgcGFzc3dkIGZpbGUsIGJhaWxpbmcg b3V0Iik7Ci0JYnplcm8ocHctPnB3X3Bhc3N3ZCwgc3RybGVuKHB3LT5wd19wYXNzd2QpKTsKLQko dm9pZCkgc3RybmNweShVc2VyLCBwdy0+cHdfbmFtZSwgKHNpemVvZiBVc2VyKS0xKTsKLQlVc2Vy WyhzaXplb2YgVXNlciktMV0gPSAnXDAnOwotCXN0cmNweShSZWFsVXNlciwgVXNlcik7CitwYXJz ZV9hcmdzKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKwlpbnQgYXJnY2g7CisKKwlpZiAoIShw dyA9IGdldHB3dWlkKGdldHVpZCgpKSkpIAorCQllcnJ4KEVSUk9SX0VYSVQsICIlczogeW91ciBV SUQgaXNuJ3QgaW4gdGhlIHBhc3N3b3JkIGZpbGUuIiwgCisJCQkJUHJvZ3JhbU5hbWUpOworCWlm IChzdHJsZW4ocHctPnB3X25hbWUpID49IHNpemVvZiBVc2VyKSAKKwkJZXJyeChFUlJPUl9FWElU LCAidXNlcm5hbWUgdG9vIGxvbmdcbiIpOworCisJc3RybGNweShVc2VyLCBwdy0+cHdfbmFtZSwg c2l6ZW9mKFVzZXIpKTsKKwlzdHJsY3B5KFJlYWxVc2VyLCBVc2VyLCBzaXplb2YoUmVhbFVzZXIp KTsKIAlGaWxlbmFtZVswXSA9ICdcMCc7CiAJT3B0aW9uID0gb3B0X3Vua25vd247Ci0Jd2hpbGUg KChhcmdjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAidTpsZXJ4OiIpKSAhPSAtMSkgeworCXdoaWxl ICgtMSAhPSAoYXJnY2ggPSBnZXRvcHQoYXJnYywgYXJndiwgZ2V0b3B0YXJncykpKSB7CiAJCXN3 aXRjaCAoYXJnY2gpIHsKKyNpZiBERUJVR0dJTkcKIAkJY2FzZSAneCc6CiAJCQlpZiAoIXNldF9k ZWJ1Z19mbGFncyhvcHRhcmcpKQogCQkJCXVzYWdlKCJiYWQgZGVidWcgb3B0aW9uIik7CiAJCQli cmVhazsKKyNlbmRpZgogCQljYXNlICd1JzoKLQkJCWlmIChnZXR1aWQoKSAhPSBST09UX1VJRCkK KwkJCWlmIChNWV9VSUQocHcpICE9IFJPT1RfVUlEKSAKIAkJCQllcnJ4KEVSUk9SX0VYSVQsICJt dXN0IGJlIHByaXZpbGVnZWQgdG8gdXNlIC11Iik7Ci0JCQlpZiAoIShwdyA9IGdldHB3bmFtKG9w dGFyZykpKQotCQkJCWVycngoRVJST1JfRVhJVCwgInVzZXIgYCVzJyB1bmtub3duIiwgb3B0YXJn KTsKLQkJCWJ6ZXJvKHB3LT5wd19wYXNzd2QsIHN0cmxlbihwdy0+cHdfcGFzc3dkKSk7Ci0JCQko dm9pZCkgc3RybmNweShVc2VyLCBwdy0+cHdfbmFtZSwgKHNpemVvZiBVc2VyKS0xKTsKLQkJCVVz ZXJbKHNpemVvZiBVc2VyKS0xXSA9ICdcMCc7CisKKwkJCWlmICghKHB3ID0gZ2V0cHduYW0ob3B0 YXJnKSkpIAorCQkJCWVycngoRVJST1JfRVhJVCwgIiVzOiB1c2VyICVzIHVua25vd24iLCBQcm9n cmFtTmFtZSwgb3B0YXJnKTsKKworCQkJaWYgKHN0cmxlbihvcHRhcmcpID49IHNpemVvZiBVc2Vy KQorCQkJCXVzYWdlKCJ1c2VybmFtZSB0b28gbG9uZyIpOworCQkJKHZvaWQpIHN0cmxjcHkoVXNl ciwgb3B0YXJnLCBzaXplb2YoVXNlcikpOwogCQkJYnJlYWs7CiAJCWNhc2UgJ2wnOgogCQkJaWYg KE9wdGlvbiAhPSBvcHRfdW5rbm93bikKQEAgLTE3OSwyMTAgKzE3MywyMDYgQEAKIAllbmRwd2Vu dCgpOwogCiAJaWYgKE9wdGlvbiAhPSBvcHRfdW5rbm93bikgewotCQlpZiAoYXJndltvcHRpbmRd ICE9IE5VTEwpIHsKKwkJaWYgKGFyZ3Zbb3B0aW5kXSAhPSBOVUxMKQogCQkJdXNhZ2UoIm5vIGFy Z3VtZW50cyBwZXJtaXR0ZWQgYWZ0ZXIgdGhpcyBvcHRpb24iKTsKLQkJfQogCX0gZWxzZSB7CiAJ CWlmIChhcmd2W29wdGluZF0gIT0gTlVMTCkgewogCQkJT3B0aW9uID0gb3B0X3JlcGxhY2U7Ci0J CQkodm9pZCkgc3RybmNweSAoRmlsZW5hbWUsIGFyZ3Zbb3B0aW5kXSwgKHNpemVvZiBGaWxlbmFt ZSktMSk7Ci0JCQlGaWxlbmFtZVsoc2l6ZW9mIEZpbGVuYW1lKS0xXSA9ICdcMCc7Ci0KLQkJfSBl bHNlIHsKKwkJCWlmIChzdHJsZW4oYXJndltvcHRpbmRdKSA+PSBzaXplb2YgRmlsZW5hbWUpCisJ CQkJdXNhZ2UoImZpbGVuYW1lIHRvbyBsb25nIik7CisJCQkodm9pZCkgc3RybGNweSAoRmlsZW5h bWUsIGFyZ3Zbb3B0aW5kXSwgc2l6ZW9mKEZpbGVuYW1lKSk7CisJCX0gZWxzZQogCQkJdXNhZ2Uo ImZpbGUgbmFtZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgcmVwbGFjZSIpOwotCQl9CiAJfQogCiAJ aWYgKE9wdGlvbiA9PSBvcHRfcmVwbGFjZSkgewotCQkvKiByZWxpbnF1aXNoIHRoZSBzZXR1aWQg c3RhdHVzIG9mIHRoZSBiaW5hcnkgZHVyaW5nCi0JCSAqIHRoZSBvcGVuLCBsZXN0IG5vbnJvb3Qg dXNlcnMgcmVhZCBmaWxlcyB0aGV5IHNob3VsZAotCQkgKiBub3QgYmUgYWJsZSB0byByZWFkLiAg d2UgY2FuJ3QgdXNlIGFjY2VzcygpIGhlcmUKLQkJICogc2luY2UgdGhlcmUncyBhIHJhY2UgY29u ZGl0aW9uLiAgdGhhbmtzIGdvIG91dCB0bwotCQkgKiBBcm50IEd1bGJyYW5kc2VuIDxhZ3VsYnJh QHB2di51bml0Lm5vPiBmb3Igc3BvdHRpbmcKLQkJICogdGhlIHJhY2UuCi0JCSAqLwotCi0JCWlm IChzd2FwX3VpZHMoKSA8IE9LKQotCQkJZXJyKEVSUk9SX0VYSVQsICJzd2FwcGluZyB1aWRzIik7 Ci0KIAkJLyogd2UgaGF2ZSB0byBvcGVuIHRoZSBmaWxlIGhlcmUgYmVjYXVzZSB3ZSdyZSBnb2lu ZyB0bwogCQkgKiBjaGRpcigyKSBpbnRvIC92YXIvY3JvbiBiZWZvcmUgd2UgZ2V0IGFyb3VuZCB0 bwogCQkgKiByZWFkaW5nIHRoZSBmaWxlLgogCQkgKi8KLQkJaWYgKCFzdHJjbXAoRmlsZW5hbWUs ICItIikpIHsKKwkJaWYgKCFzdHJjbXAoRmlsZW5hbWUsICItIikpCiAJCQlOZXdDcm9udGFiID0g c3RkaW47Ci0JCX0gZWxzZSBpZiAocmVhbHBhdGgoRmlsZW5hbWUsIHJlc29sdmVkX3BhdGgpICE9 IE5VTEwgJiYKLQkJICAgICFzdHJjbXAocmVzb2x2ZWRfcGF0aCwgU1lTQ1JPTlRBQikpIHsKLQkJ CWVycihFUlJPUl9FWElULCBTWVNDUk9OVEFCICIgbXVzdCBiZSBlZGl0ZWQgbWFudWFsbHkiKTsK LQkJfSBlbHNlIHsKLQkJCWlmICghKE5ld0Nyb250YWIgPSBmb3BlbihGaWxlbmFtZSwgInIiKSkp Ci0JCQkJZXJyKEVSUk9SX0VYSVQsICIlcyIsIEZpbGVuYW1lKTsKLQkJfQotCQlpZiAoc3dhcF91 aWRzX2JhY2soKSA8IE9LKQotCQkJZXJyKEVSUk9SX0VYSVQsICJzd2FwcGluZyB1aWRzIGJhY2si KTsKLQl9CisJCWVsc2UgeworCQkJLyogcmVsaW5xdWlzaCB0aGUgc2V0dWlkIHN0YXR1cyBvZiB0 aGUgYmluYXJ5IGR1cmluZworCQkJICogdGhlIG9wZW4sIGxlc3Qgbm9ucm9vdCB1c2VycyByZWFk IGZpbGVzIHRoZXkgc2hvdWxkCisJCQkgKiBub3QgYmUgYWJsZSB0byByZWFkLiAgd2UgY2FuJ3Qg dXNlIGFjY2VzcygpIGhlcmUKKwkJCSAqIHNpbmNlIHRoZXJlJ3MgYSByYWNlIGNvbmRpdGlvbi4g IHRoYW5rcyBnbyBvdXQgdG8KKwkJCSAqIEFybnQgR3VsYnJhbmRzZW4gPGFndWxicmFAcHZ2LnVu aXQubm8+IGZvciBzcG90dGluZworCQkJICogdGhlIHJhY2UuCisJCQkgKi8KIAotCURlYnVnKERN SVNDLCAoInVzZXI9JXMsIGZpbGU9JXMsIG9wdGlvbj0lc1xuIiwKLQkJICAgICAgVXNlciwgRmls ZW5hbWUsIE9wdGlvbnNbKGludClPcHRpb25dKSkKLX0KKwkJCWlmIChzd2FwX3VpZHMoKSA8IE9L KSAKKwkJCQllcnJ4KEVSUk9SX0VYSVQsICJzd2FwcGluZyB1aWRzIik7CiAKLXN0YXRpYyB2b2lk Ci1jb3B5X2ZpbGUoRklMRSAqaW4sIEZJTEUgKm91dCkgewotCWludAl4LCBjaDsKKwkJCWlmICgh KE5ld0Nyb250YWIgPSBmb3BlbihGaWxlbmFtZSwgInIiKSkpIAorCQkJCWVycngoRVJST1JfRVhJ VCwgIiVzIiwgRmlsZW5hbWUpOwogCi0JU2V0X0xpbmVOdW0oMSkKLQkvKiBpZ25vcmUgdGhlIHRv cCBmZXcgY29tbWVudHMgc2luY2Ugd2UgcHJvYmFibHkgcHV0IHRoZW0gdGhlcmUuCi0JICovCi0J Zm9yICh4ID0gMDsgIHggPCBOSEVBREVSX0xJTkVTOyAgeCsrKSB7Ci0JCWNoID0gZ2V0X2NoYXIo aW4pOwotCQlpZiAoRU9GID09IGNoKQotCQkJYnJlYWs7Ci0JCWlmICgnIycgIT0gY2gpIHsKLQkJ CXB1dGMoY2gsIG91dCk7Ci0JCQlicmVhazsKKwkJCWlmIChzd2FwX3VpZHNfYmFjaygpIDwgT0sp IAorCQkJCWVycngoRVJST1JfRVhJVCwgInN3YXBwaW5nIHVpZHMgYmFjayIpOwogCQl9Ci0JCXdo aWxlIChFT0YgIT0gKGNoID0gZ2V0X2NoYXIoaW4pKSkKLQkJCWlmIChjaCA9PSAnXG4nKQotCQkJ CWJyZWFrOwotCQlpZiAoRU9GID09IGNoKQotCQkJYnJlYWs7CiAJfQogCi0JLyogY29weSB0aGUg cmVzdCBvZiB0aGUgY3JvbnRhYiAoaWYgYW55KSB0byB0aGUgb3V0cHV0IGZpbGUuCi0JICovCi0J aWYgKEVPRiAhPSBjaCkKLQkJd2hpbGUgKEVPRiAhPSAoY2ggPSBnZXRfY2hhcihpbikpKQotCQkJ cHV0YyhjaCwgb3V0KTsKKwlEZWJ1ZyhETUlTQywgKCJ1c2VyPSVzLCBmaWxlPSVzLCBvcHRpb249 JXNcbiIsCisJCSAgICAgIFVzZXIsIEZpbGVuYW1lLCBPcHRpb25zWyhpbnQpT3B0aW9uXSkpCiB9 CiAKIHN0YXRpYyB2b2lkCi1saXN0X2NtZCgpIHsKLQljaGFyCW5bTUFYX0ZOQU1FXTsKLQlGSUxF CSpmOworbGlzdF9jbWQodm9pZCkgeworCWNoYXIgbltNQVhfRk5BTUVdOworCUZJTEUgKmY7CisJ aW50IGNoOwogCiAJbG9nX2l0KFJlYWxVc2VyLCBQaWQsICJMSVNUIiwgVXNlcik7Ci0JKHZvaWQp IHNucHJpbnRmKG4sIHNpemVvZihuKSwgQ1JPTl9UQUIoVXNlcikpOworCWlmICghZ2x1ZV9zdHJp bmdzKG4sIHNpemVvZiBuLCBTUE9PTF9ESVIsIFVzZXIsICcvJykpIAorCQllcnJ4KEVSUk9SX0VY SVQsICJwYXRoIHRvbyBsb25nIik7CisKIAlpZiAoIShmID0gZm9wZW4obiwgInIiKSkpIHsKIAkJ aWYgKGVycm5vID09IEVOT0VOVCkKLQkJCWVycngoRVJST1JfRVhJVCwgIm5vIGNyb250YWIgZm9y ICVzIiwgVXNlcik7CisJCQlmcHJpbnRmKHN0ZGVyciwgIm5vIGNyb250YWIgZm9yICVzXG4iLCBV c2VyKTsKIAkJZWxzZQotCQkJZXJyKEVSUk9SX0VYSVQsICIlcyIsIG4pOworCQkJcGVycm9yKG4p OworCQlleGl0KEVSUk9SX0VYSVQpOwogCX0KIAogCS8qIGZpbGUgaXMgb3Blbi4gY29weSB0byBz dGRvdXQsIGNsb3NlLgogCSAqLwotCWNvcHlfZmlsZShmLCBzdGRvdXQpOworCVNldF9MaW5lTnVt KDEpCisJd2hpbGUgKEVPRiAhPSAoY2ggPSBnZXRfY2hhcihmKSkpCisJCXB1dGNoYXIoY2gpOwog CWZjbG9zZShmKTsKIH0KIAotCiBzdGF0aWMgdm9pZAotZGVsZXRlX2NtZCgpIHsKLQljaGFyCW5b TUFYX0ZOQU1FXTsKLQlpbnQgY2gsIGZpcnN0OwotCi0JaWYgKGlzYXR0eShTVERJTl9GSUxFTk8p KSB7Ci0JCSh2b2lkKWZwcmludGYoc3RkZXJyLCAicmVtb3ZlIGNyb250YWIgZm9yICVzPyAiLCBV c2VyKTsKLQkJZmlyc3QgPSBjaCA9IGdldGNoYXIoKTsKLQkJd2hpbGUgKGNoICE9ICdcbicgJiYg Y2ggIT0gRU9GKQotCQkJY2ggPSBnZXRjaGFyKCk7Ci0JCWlmIChmaXJzdCAhPSAneScgJiYgZmly c3QgIT0gJ1knKQotCQkJcmV0dXJuOwotCX0KK2RlbGV0ZV9jbWQodm9pZCkgeworCWNoYXIgbltN QVhfRk5BTUVdOwogCiAJbG9nX2l0KFJlYWxVc2VyLCBQaWQsICJERUxFVEUiLCBVc2VyKTsKLQko dm9pZCkgc25wcmludGYobiwgc2l6ZW9mKG4pLCBDUk9OX1RBQihVc2VyKSk7Ci0JaWYgKHVubGlu ayhuKSkgeworCWlmICghZ2x1ZV9zdHJpbmdzKG4sIHNpemVvZiBuLCBTUE9PTF9ESVIsIFVzZXIs ICcvJykpIAorCQllcnJ4KEVSUk9SX0VYSVQsICJwYXRoIHRvIGxvbmciKTsKKworCWlmICh1bmxp bmsobikgIT0gMCkgewogCQlpZiAoZXJybm8gPT0gRU5PRU5UKQotCQkJZXJyeChFUlJPUl9FWElU LCAibm8gY3JvbnRhYiBmb3IgJXMiLCBVc2VyKTsKKwkJCWZwcmludGYoc3RkZXJyLCAibm8gY3Jv bnRhYiBmb3IgJXNcbiIsIFVzZXIpOwogCQllbHNlCi0JCQllcnIoRVJST1JfRVhJVCwgIiVzIiwg bik7CisJCQlwZXJyb3Iobik7CisJCWV4aXQoRVJST1JfRVhJVCk7CiAJfQotCXBva2VfZGFlbW9u KCk7CisJcG9rZV9kYWVtb24oUkVMT0FEX0NST04pOwogfQogCi0KIHN0YXRpYyB2b2lkCi1jaGVj a19lcnJvcihtc2cpCi0JY2hhcgkqbXNnOwoteworY2hlY2tfZXJyb3IoY29uc3QgY2hhciAqbXNn KSB7CiAJQ2hlY2tFcnJvckNvdW50Kys7CiAJZnByaW50ZihzdGRlcnIsICJcIiVzXCI6JWQ6ICVz XG4iLCBGaWxlbmFtZSwgTGluZU51bWJlci0xLCBtc2cpOwogfQogCi0KIHN0YXRpYyB2b2lkCi1l ZGl0X2NtZCgpIHsKLQljaGFyCQluW01BWF9GTkFNRV0sIHFbTUFYX1RFTVBTVFJdLCAqZWRpdG9y OwotCUZJTEUJCSpmOwotCWludAkJdDsKLQlzdHJ1Y3Qgc3RhdAlzdGF0YnVmLCBmc2J1ZjsKLQlX QUlUX1QJCXdhaXRlcjsKLQlQSURfVAkJcGlkLCB4cGlkOwotCW1vZGVfdAkJdW07Ci0JaW50CQlz eW50YXhfZXJyb3IgPSAwOwotCWNoYXIJCW9yaWdfbWQ1W01ENV9TSVpFXTsKLQljaGFyCQluZXdf bWQ1W01ENV9TSVpFXTsKK2VkaXRfY21kKHZvaWQpIHsKKwljaGFyIG5bTUFYX0ZOQU1FXSwgcVtN QVhfVEVNUFNUUl0sICplZGl0b3I7CisJRklMRSAqZjsKKwlpbnQgY2gsIHQsIHg7CisJc3RydWN0 IHN0YXQgc3RhdGJ1ZiwgZnNidWY7CisJc3RydWN0IHV0aW1idWYgdXRpbWVidWY7CisJV0FJVF9U IHdhaXRlcjsKKwlQSURfVCBwaWQsIHhwaWQ7CiAKIAlsb2dfaXQoUmVhbFVzZXIsIFBpZCwgIkJF R0lOIEVESVQiLCBVc2VyKTsKLQkodm9pZCkgc25wcmludGYobiwgc2l6ZW9mKG4pLCBDUk9OX1RB QihVc2VyKSk7CisJaWYgKCFnbHVlX3N0cmluZ3Mobiwgc2l6ZW9mIG4sIFNQT09MX0RJUiwgVXNl ciwgJy8nKSkgCisJCWVycngoRVJST1JfRVhJVCwgInBhdGggdG9vIGxvbmciKTsKKwogCWlmICgh KGYgPSBmb3BlbihuLCAiciIpKSkgewotCQlpZiAoZXJybm8gIT0gRU5PRU5UKQotCQkJZXJyKEVS Uk9SX0VYSVQsICIlcyIsIG4pOwotCQl3YXJueCgibm8gY3JvbnRhYiBmb3IgJXMgLSB1c2luZyBh biBlbXB0eSBvbmUiLCBVc2VyKTsKLQkJaWYgKCEoZiA9IGZvcGVuKF9QQVRIX0RFVk5VTEwsICJy IikpKQotCQkJZXJyKEVSUk9SX0VYSVQsIF9QQVRIX0RFVk5VTEwpOworCQlpZiAoZXJybm8gIT0g RU5PRU5UKSB7CisJCQlwZXJyb3Iobik7CisJCQlleGl0KEVSUk9SX0VYSVQpOworCQl9CisJCWZw cmludGYoc3RkZXJyLCAibm8gY3JvbnRhYiBmb3IgJXMgLSB1c2luZyBhbiBlbXB0eSBvbmVcbiIs CisJCQlVc2VyKTsKKwkJaWYgKCEoZiA9IGZvcGVuKF9QQVRIX0RFVk5VTEwsICJyIikpKSB7CisJ CQlwZXJyb3IoX1BBVEhfREVWTlVMTCk7CisJCQlleGl0KEVSUk9SX0VYSVQpOworCQl9CiAJfQog Ci0JdW0gPSB1bWFzaygwNzcpOwotCSh2b2lkKSBzbnByaW50ZihGaWxlbmFtZSwgc2l6ZW9mKEZp bGVuYW1lKSwgIi90bXAvY3JvbnRhYi5YWFhYWFhYWFhYIik7Ci0JaWYgKCh0ID0gbWtzdGVtcChG aWxlbmFtZSkpID09IC0xKSB7Ci0JCXdhcm4oIiVzIiwgRmlsZW5hbWUpOwotCQkodm9pZCkgdW1h c2sodW0pOworCWlmIChmc3RhdChmaWxlbm8oZiksICZzdGF0YnVmKSA8IDApIHsKKwkJcGVycm9y KCJmc3RhdCIpOworCQlnb3RvIGZhdGFsOworCX0KKwl1dGltZWJ1Zi5hY3RpbWUgPSBzdGF0YnVm LnN0X2F0aW1lOworCXV0aW1lYnVmLm1vZHRpbWUgPSBzdGF0YnVmLnN0X210aW1lOworCisJLyog VHVybiBvZmYgc2lnbmFscy4gKi8KKwkodm9pZClzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKKwko dm9pZClzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKwkodm9pZClzaWduYWwoU0lHUVVJVCwgU0lH X0lHTik7CisKKwlpZiAoIWdsdWVfc3RyaW5ncyhGaWxlbmFtZSwgc2l6ZW9mIEZpbGVuYW1lLCBf UEFUSF9UTVAsCisJICAgICJjcm9udGFiLlhYWFhYWFhYWFgiLCAnLycpKSB7CisJCWZwcmludGYo c3RkZXJyLCAicGF0aCB0b28gbG9uZ1xuIik7CisJCWdvdG8gZmF0YWw7CisJfQorCWlmICgtMSA9 PSAodCA9IG1rc3RlbXAoRmlsZW5hbWUpKSkgeworCQlwZXJyb3IoRmlsZW5hbWUpOwogCQlnb3Rv IGZhdGFsOwogCX0KLQkodm9pZCkgdW1hc2sodW0pOwogI2lmZGVmIEhBU19GQ0hPV04KLQlpZiAo ZmNob3duKHQsIGdldHVpZCgpLCBnZXRnaWQoKSkgPCAwKSB7CisJaWYgKGZjaG93bih0LCBNWV9V SUQocHcpLCBNWV9HSUQocHcpKSA8IDApIHsKKwkJcGVycm9yKCJmY2hvd24iKTsKKwkJZ290byBm YXRhbDsKKwl9CiAjZWxzZQotCWlmIChjaG93bihGaWxlbmFtZSwgZ2V0dWlkKCksIGdldGdpZCgp KSA8IDApIHsKLSNlbmRpZgotCQl3YXJuKCJmY2hvd24iKTsKKwlpZiAoY2hvd24oRmlsZW5hbWUs IE1ZX1VJRChwdyksIC0xKSA8IDApIHsKKwkJcGVycm9yKCJjaG93biIpOwogCQlnb3RvIGZhdGFs OwogCX0KKyNlbmRpZgogCWlmICghKE5ld0Nyb250YWIgPSBmZG9wZW4odCwgInIrIikpKSB7CiAJ CXdhcm4oImZkb3BlbiIpOwogCQlnb3RvIGZhdGFsOwogCX0KIAotCWNvcHlfZmlsZShmLCBOZXdD cm9udGFiKTsKKwlTZXRfTGluZU51bSgxKQorCisJLyogaWdub3JlIHRoZSB0b3AgZmV3IGNvbW1l bnRzIHNpbmNlIHdlIHByb2JhYmx5IHB1dCB0aGVtIHRoZXJlLgorCSAqLworCXggPSAwOworCXdo aWxlIChFT0YgIT0gKGNoID0gZ2V0X2NoYXIoZikpKSB7CisJCWlmICgnIycgIT0gY2gpIHsKKwkJ CXB1dGMoY2gsIE5ld0Nyb250YWIpOworCQkJYnJlYWs7CisJCX0KKwkJd2hpbGUgKEVPRiAhPSAo Y2ggPSBnZXRfY2hhcihmKSkpCisJCQlpZiAoY2ggPT0gJ1xuJykKKwkJCQlicmVhazsKKwkJaWYg KCsreCA+PSBOSEVBREVSX0xJTkVTKQorCQkJYnJlYWs7CisJfQorCisJLyogY29weSB0aGUgcmVz dCBvZiB0aGUgY3JvbnRhYiAoaWYgYW55KSB0byB0aGUgdGVtcCBmaWxlLgorCSAqLworCWlmIChF T0YgIT0gY2gpCisJCXdoaWxlIChFT0YgIT0gKGNoID0gZ2V0X2NoYXIoZikpKQorCQkJcHV0Yyhj aCwgTmV3Q3JvbnRhYik7CiAJZmNsb3NlKGYpOwotCWlmIChmZmx1c2goTmV3Q3JvbnRhYikpCi0J CWVycihFUlJPUl9FWElULCAiJXMiLCBGaWxlbmFtZSk7CisJaWYgKGZmbHVzaChOZXdDcm9udGFi KSA8IE9LKSAKKwkJZXJyeChFUlJPUl9FWElULCAiJXMiLCBGaWxlbmFtZSk7CiAJaWYgKGZzdGF0 KHQsICZmc2J1ZikgPCAwKSB7CiAJCXdhcm4oInVuYWJsZSB0byBmc3RhdCB0ZW1wIGZpbGUiKTsK IAkJZ290byBmYXRhbDsKIAl9CisKKwl1dGltZShGaWxlbmFtZSwgJnV0aW1lYnVmKTsKICBhZ2Fp bjoKLQlpZiAoc3dhcF91aWRzKCkgPCBPSykKLQkJZXJyKEVSUk9SX0VYSVQsICJzd2FwcGluZyB1 aWRzIik7Ci0JaWYgKHN0YXQoRmlsZW5hbWUsICZzdGF0YnVmKSA8IDApIHsKLQkJd2Fybigic3Rh dCIpOwotIGZhdGFsOgkJdW5saW5rKEZpbGVuYW1lKTsKKwlyZXdpbmQoTmV3Q3JvbnRhYik7CisJ aWYgKGZlcnJvcihOZXdDcm9udGFiKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBlcnJvciB3 aGlsZSB3cml0aW5nIG5ldyBjcm9udGFiIHRvICVzXG4iLAorCQkJUHJvZ3JhbU5hbWUsIEZpbGVu YW1lKTsKKyBmYXRhbDoKKwkJdW5saW5rKEZpbGVuYW1lKTsKIAkJZXhpdChFUlJPUl9FWElUKTsK IAl9Ci0JaWYgKHN3YXBfdWlkc19iYWNrKCkgPCBPSykKLQkJZXJyKEVSUk9SX0VYSVQsICJzd2Fw cGluZyB1aWRzIGJhY2siKTsKLQlpZiAoc3RhdGJ1Zi5zdF9kZXYgIT0gZnNidWYuc3RfZGV2IHx8 IHN0YXRidWYuc3RfaW5vICE9IGZzYnVmLnN0X2lubykKLQkJZXJyeChFUlJPUl9FWElULCAidGVt cCBmaWxlIG11c3QgYmUgZWRpdGVkIGluIHBsYWNlIik7Ci0JaWYgKE1ENUZpbGUoRmlsZW5hbWUs IG9yaWdfbWQ1KSA9PSBOVUxMKSB7Ci0JCXdhcm4oIk1ENSIpOwotCQlnb3RvIGZhdGFsOwotCX0K IAotCWlmICgoIShlZGl0b3IgPSBnZXRlbnYoIlZJU1VBTCIpKSkKLQkgJiYgKCEoZWRpdG9yID0g Z2V0ZW52KCJFRElUT1IiKSkpCi0JICAgICkgeworCWlmICgoKGVkaXRvciA9IGdldGVudigiVklT VUFMIikpID09IE5VTEwgfHwgKmVkaXRvciA9PSAnXDAnKSAmJgorCSAgICAoKGVkaXRvciA9IGdl dGVudigiRURJVE9SIikpID09IE5VTEwgfHwgKmVkaXRvciA9PSAnXDAnKSkgewogCQllZGl0b3Ig PSBFRElUT1I7CiAJfQogCkBAIC0zOTYsMTggKzM4NiwyNiBAQAogCiAJc3dpdGNoIChwaWQgPSBm b3JrKCkpIHsKIAljYXNlIC0xOgotCQl3YXJuKCJmb3JrIik7CisJCXBlcnJvcigiZm9yayIpOwog CQlnb3RvIGZhdGFsOwogCWNhc2UgMDoKIAkJLyogY2hpbGQgKi8KLQkJaWYgKHNldHVpZChnZXR1 aWQoKSkgPCAwKQotCQkJZXJyKEVSUk9SX0VYSVQsICJzZXR1aWQoZ2V0dWlkKCkpIik7Ci0JCWlm IChjaGRpcigiL3RtcCIpIDwgMCkKLQkJCWVycihFUlJPUl9FWElULCAiY2hkaXIoL3RtcCkiKTsK LQkJaWYgKHN0cmxlbihlZGl0b3IpICsgc3RybGVuKEZpbGVuYW1lKSArIDIgPj0gTUFYX1RFTVBT VFIpCi0JCQllcnJ4KEVSUk9SX0VYSVQsICJlZGl0b3Igb3IgZmlsZW5hbWUgdG9vIGxvbmciKTsK LQkJZXhlY2xwKGVkaXRvciwgZWRpdG9yLCBGaWxlbmFtZSwgKGNoYXIgKilOVUxMKTsKLQkJZXJy KEVSUk9SX0VYSVQsICIlcyIsIGVkaXRvcik7CisJCWlmIChzZXRnaWQoTVlfR0lEKHB3KSkgPCAw KSAKKwkJCWVycngoRVJST1JfRVhJVCwgInNldGdpZChnZXRnaWQoKSkiKTsKKworCQlpZiAoc2V0 dWlkKE1ZX1VJRChwdykpIDwgMCkgCisJCQllcnJ4KEVSUk9SX0VYSVQsICJzZXR1aWQoZ2V0dWlk KCkpIik7CisKKwkJaWYgKGNoZGlyKF9QQVRIX1RNUCkgPCAwKSAKKwkJCWVycngoRVJST1JfRVhJ VCwgX1BBVEhfVE1QKTsKKworCQlpZiAoIWdsdWVfc3RyaW5ncyhxLCBzaXplb2YgcSwgZWRpdG9y LCBGaWxlbmFtZSwgJyAnKSkgCisJCQllcnJ4KEVSUk9SX0VYSVQsICIlczogZWRpdG9yIGNvbW1h bmQgbGluZSB0b28gbG9uZyIsCisJCQkJCVByb2dyYW1OYW1lKTsKKworCQlleGVjbHAoX1BBVEhf QlNIRUxMLCBfUEFUSF9CU0hFTEwsICItYyIsIHEsIChjaGFyICopMCk7CisJCXBlcnJvcihlZGl0 b3IpOworCQlleGl0KEVSUk9SX0VYSVQpOwogCQkvKk5PVFJFQUNIRUQqLwogCWRlZmF1bHQ6CiAJ CS8qIHBhcmVudCAqLwpAQCAtNDE1LDc0ICs0MTMsNzMgQEAKIAl9CiAKIAkvKiBwYXJlbnQgKi8K LQl7Ci0Jdm9pZCAoKnNpZ1szXSkoaW50IHNpZ25hbCk7Ci0Jc2lnWzBdID0gc2lnbmFsKFNJR0hV UCwgU0lHX0lHTik7Ci0Jc2lnWzFdID0gc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7Ci0Jc2lnWzJd ID0gc2lnbmFsKFNJR1RFUk0sIFNJR19JR04pOwotCXhwaWQgPSB3YWl0KCZ3YWl0ZXIpOwotCXNp Z25hbChTSUdIVVAsIHNpZ1swXSk7Ci0Jc2lnbmFsKFNJR0lOVCwgc2lnWzFdKTsKLQlzaWduYWwo U0lHVEVSTSwgc2lnWzJdKTsKLQl9Ci0JaWYgKHhwaWQgIT0gcGlkKSB7Ci0JCXdhcm54KCJ3cm9u ZyBQSUQgKCVkICE9ICVkKSBmcm9tIFwiJXNcIiIsIHhwaWQsIHBpZCwgZWRpdG9yKTsKLQkJZ290 byBmYXRhbDsKLQl9Ci0JaWYgKFdJRkVYSVRFRCh3YWl0ZXIpICYmIFdFWElUU1RBVFVTKHdhaXRl cikpIHsKLQkJd2FybngoIlwiJXNcIiBleGl0ZWQgd2l0aCBzdGF0dXMgJWQiLCBlZGl0b3IsIFdF WElUU1RBVFVTKHdhaXRlcikpOwotCQlnb3RvIGZhdGFsOwotCX0KLQlpZiAoV0lGU0lHTkFMRUQo d2FpdGVyKSkgewotCQl3YXJueCgiXCIlc1wiIGtpbGxlZDsgc2lnbmFsICVkICglc2NvcmUgZHVt cGVkKSIsCi0JCQllZGl0b3IsIFdURVJNU0lHKHdhaXRlciksIFdDT1JFRFVNUCh3YWl0ZXIpID8i IiA6Im5vICIpOwotCQlnb3RvIGZhdGFsOwotCX0KLQlpZiAoc3dhcF91aWRzKCkgPCBPSykKLQkJ ZXJyKEVSUk9SX0VYSVQsICJzd2FwcGluZyB1aWRzIik7Ci0JaWYgKHN0YXQoRmlsZW5hbWUsICZz dGF0YnVmKSA8IDApIHsKLQkJd2Fybigic3RhdCIpOwotCQlnb3RvIGZhdGFsOwotCX0KLQlpZiAo c3RhdGJ1Zi5zdF9kZXYgIT0gZnNidWYuc3RfZGV2IHx8IHN0YXRidWYuc3RfaW5vICE9IGZzYnVm LnN0X2lubykKLQkJZXJyeChFUlJPUl9FWElULCAidGVtcCBmaWxlIG11c3QgYmUgZWRpdGVkIGlu IHBsYWNlIik7Ci0JaWYgKE1ENUZpbGUoRmlsZW5hbWUsIG5ld19tZDUpID09IE5VTEwpIHsKLQkJ d2FybigiTUQ1Iik7Ci0JCWdvdG8gZmF0YWw7Ci0JfQotCWlmIChzd2FwX3VpZHNfYmFjaygpIDwg T0spCi0JCWVycihFUlJPUl9FWElULCAic3dhcHBpbmcgdWlkcyBiYWNrIik7Ci0JaWYgKHN0cmNt cChvcmlnX21kNSwgbmV3X21kNSkgPT0gMCAmJiAhc3ludGF4X2Vycm9yKSB7Ci0JCXdhcm54KCJu byBjaGFuZ2VzIG1hZGUgdG8gY3JvbnRhYiIpOworCWZvciAoOzspIHsKKwkJeHBpZCA9IHdhaXRw aWQocGlkLCAmd2FpdGVyLCBXVU5UUkFDRUQpOworCQlpZiAoeHBpZCA9PSAtMSkgeworCQkJaWYg KGVycm5vICE9IEVJTlRSKQorCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6IHdhaXRwaWQoKSBmYWls ZWQgd2FpdGluZyBmb3IgUElEICVsZCBmcm9tIFwiJXNcIjogJXNcbiIsCisJCQkJCVByb2dyYW1O YW1lLCAobG9uZylwaWQsIGVkaXRvciwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfSBlbHNlIGlmICh4 cGlkICE9IHBpZCkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogd3JvbmcgUElEICglbGQgIT0g JWxkKSBmcm9tIFwiJXNcIlxuIiwKKwkJCQlQcm9ncmFtTmFtZSwgKGxvbmcpeHBpZCwgKGxvbmcp cGlkLCBlZGl0b3IpOworCQkJZ290byBmYXRhbDsKKwkJfSBlbHNlIGlmIChXSUZTVE9QUEVEKHdh aXRlcikpIHsKKwkJCWtpbGwoZ2V0cGlkKCksIFdTVE9QU0lHKHdhaXRlcikpOworCQl9IGVsc2Ug aWYgKFdJRkVYSVRFRCh3YWl0ZXIpICYmIFdFWElUU1RBVFVTKHdhaXRlcikpIHsKKwkJCWZwcmlu dGYoc3RkZXJyLCAiJXM6IFwiJXNcIiBleGl0ZWQgd2l0aCBzdGF0dXMgJWRcbiIsCisJCQkJUHJv Z3JhbU5hbWUsIGVkaXRvciwgV0VYSVRTVEFUVVMod2FpdGVyKSk7CisJCQlnb3RvIGZhdGFsOwor CQl9IGVsc2UgaWYgKFdJRlNJR05BTEVEKHdhaXRlcikpIHsKKwkJCWZwcmludGYoc3RkZXJyLAor CQkJCSIlczogXCIlc1wiIGtpbGxlZDsgc2lnbmFsICVkICglc2NvcmUgZHVtcGVkKVxuIiwKKwkJ CQlQcm9ncmFtTmFtZSwgZWRpdG9yLCBXVEVSTVNJRyh3YWl0ZXIpLAorCQkJCVdDT1JFRFVNUCh3 YWl0ZXIpID8iIiA6Im5vICIpOworCQkJZ290byBmYXRhbDsKKwkJfSBlbHNlCisJCQlicmVhazsK Kwl9CisJKHZvaWQpc2lnbmFsKFNJR0hVUCwgU0lHX0RGTCk7CisJKHZvaWQpc2lnbmFsKFNJR0lO VCwgU0lHX0RGTCk7CisJKHZvaWQpc2lnbmFsKFNJR1FVSVQsIFNJR19ERkwpOworCWlmIChmc3Rh dCh0LCAmc3RhdGJ1ZikgPCAwKSB7CisJCXBlcnJvcigiZnN0YXQiKTsKKwkJZ290byBmYXRhbDsK Kwl9CisJaWYgKHV0aW1lYnVmLm1vZHRpbWUgPT0gc3RhdGJ1Zi5zdF9tdGltZSkgeworCQlmcHJp bnRmKHN0ZGVyciwgIiVzOiBubyBjaGFuZ2VzIG1hZGUgdG8gY3JvbnRhYlxuIiwKKwkJCVByb2dy YW1OYW1lKTsKIAkJZ290byByZW1vdmU7CiAJfQotCXdhcm54KCJpbnN0YWxsaW5nIG5ldyBjcm9u dGFiIik7CisJZnByaW50ZihzdGRlcnIsICIlczogaW5zdGFsbGluZyBuZXcgY3JvbnRhYlxuIiwg UHJvZ3JhbU5hbWUpOwogCXN3aXRjaCAocmVwbGFjZV9jbWQoKSkgewotCWNhc2UgMDoJCQkvKiBT dWNjZXNzICovCisJY2FzZSAwOgogCQlicmVhazsKLQljYXNlIC0xOgkJLyogU3ludGF4IGVycm9y ICovCisJY2FzZSAtMToKIAkJZm9yICg7OykgewogCQkJcHJpbnRmKCJEbyB5b3Ugd2FudCB0byBy ZXRyeSB0aGUgc2FtZSBlZGl0PyAiKTsKIAkJCWZmbHVzaChzdGRvdXQpOwogCQkJcVswXSA9ICdc MCc7CiAJCQkodm9pZCkgZmdldHMocSwgc2l6ZW9mIHEsIHN0ZGluKTsKLQkJCXN3aXRjaCAoaXNs b3dlcihxWzBdKSA/IHFbMF0gOiB0b2xvd2VyKHFbMF0pKSB7CisJCQlzd2l0Y2ggKHFbMF0pIHsK IAkJCWNhc2UgJ3knOgotCQkJCXN5bnRheF9lcnJvciA9IDE7CisJCQljYXNlICdZJzoKIAkJCQln b3RvIGFnYWluOwogCQkJY2FzZSAnbic6CisJCQljYXNlICdOJzoKIAkJCQlnb3RvIGFiYW5kb247 CiAJCQlkZWZhdWx0OgogCQkJCWZwcmludGYoc3RkZXJyLCAiRW50ZXIgWSBvciBOXG4iKTsKIAkJ CX0KIAkJfQogCQkvKk5PVFJFQUNIRUQqLwotCWNhc2UgLTI6CQkvKiBJbnN0YWxsIGVycm9yICov CisJY2FzZSAtMjoKIAlhYmFuZG9uOgotCQl3YXJueCgiZWRpdHMgbGVmdCBpbiAlcyIsIEZpbGVu YW1lKTsKKwkJZnByaW50ZihzdGRlcnIsICIlczogZWRpdHMgbGVmdCBpbiAlc1xuIiwKKwkJCVBy b2dyYW1OYW1lLCBGaWxlbmFtZSk7CiAJCWdvdG8gZG9uZTsKIAlkZWZhdWx0OgotCQl3YXJueCgi cGFuaWM6IGJhZCBzd2l0Y2goKSBpbiByZXBsYWNlX2NtZCgpIik7CisJCWZwcmludGYoc3RkZXJy LCAiJXM6IHBhbmljOiBiYWQgc3dpdGNoKCkgaW4gcmVwbGFjZV9jbWQoKVxuIiwKKwkJCVByb2dy YW1OYW1lKTsKIAkJZ290byBmYXRhbDsKIAl9CiAgcmVtb3ZlOgpAQCAtNDkxLDQwICs0ODgsNTMg QEAKIAlsb2dfaXQoUmVhbFVzZXIsIFBpZCwgIkVORCBFRElUIiwgVXNlcik7CiB9CiAKLQogLyog cmV0dXJucwkwCW9uIHN1Y2Nlc3MKICAqCQktMQlvbiBzeW50YXggZXJyb3IKICAqCQktMglvbiBp bnN0YWxsIGVycm9yCiAgKi8KIHN0YXRpYyBpbnQKLXJlcGxhY2VfY21kKCkgewotCWNoYXIJbltN QVhfRk5BTUVdLCBlbnZzdHJbTUFYX0VOVlNUUl0sIHRuW01BWF9GTkFNRV07Ci0JRklMRQkqdG1w OwotCWludAljaCwgZW9mOwotCWVudHJ5CSplOwotCXRpbWVfdAlub3cgPSB0aW1lKE5VTEwpOwot CWNoYXIJKiplbnZwID0gZW52X2luaXQoKTsKK3JlcGxhY2VfY21kKHZvaWQpIHsKKwljaGFyIG5b TUFYX0ZOQU1FXSwgZW52c3RyW01BWF9FTlZTVFJdOworCUZJTEUgKnRtcDsKKwlpbnQgY2gsIGVv ZiwgZmQ7CisJaW50IGVycm9yID0gMDsKKwllbnRyeSAqZTsKKwl1aWRfdCBmaWxlX293bmVyOwor CXRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOworCWNoYXIgKiplbnZwID0gZW52X2luaXQoKTsKIAog CWlmIChlbnZwID09IE5VTEwpIHsKLQkJd2FybngoImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkiKTsK KwkJZnByaW50ZihzdGRlcnIsICIlczogQ2Fubm90IGFsbG9jYXRlIG1lbW9yeS5cbiIsIFByb2dy YW1OYW1lKTsKIAkJcmV0dXJuICgtMik7CiAJfQogCi0JKHZvaWQpIHNucHJpbnRmKG4sIHNpemVv ZihuKSwgInRtcC4lZCIsIFBpZCk7Ci0JKHZvaWQpIHNucHJpbnRmKHRuLCBzaXplb2YodG4pLCBD Uk9OX1RBQihuKSk7Ci0KLQlpZiAoISh0bXAgPSBmb3Blbih0biwgIncrIikpKSB7Ci0JCXdhcm4o IiVzIiwgdG4pOworCWlmICghZ2x1ZV9zdHJpbmdzKFRlbXBGaWxlbmFtZSwgc2l6ZW9mIFRlbXBG aWxlbmFtZSwgU1BPT0xfRElSLAorCSAgICAidG1wLlhYWFhYWFhYWFgiLCAnLycpKSB7CisJCVRl bXBGaWxlbmFtZVswXSA9ICdcMCc7CisJCWZwcmludGYoc3RkZXJyLCAicGF0aCB0b28gbG9uZ1xu Iik7CisJCXJldHVybiAoLTIpOworCX0KKwlpZiAoKGZkID0gbWtzdGVtcChUZW1wRmlsZW5hbWUp KSA9PSAtMSB8fCAhKHRtcCA9IGZkb3BlbihmZCwgIncrIikpKSB7CisJCXBlcnJvcihUZW1wRmls ZW5hbWUpOworCQlpZiAoZmQgIT0gLTEpIHsKKwkJCWNsb3NlKGZkKTsKKwkJCXVubGluayhUZW1w RmlsZW5hbWUpOworCQl9CisJCVRlbXBGaWxlbmFtZVswXSA9ICdcMCc7CiAJCXJldHVybiAoLTIp OwogCX0KIAorCSh2b2lkKSBzaWduYWwoU0lHSFVQLCBkaWUpOworCSh2b2lkKSBzaWduYWwoU0lH SU5ULCBkaWUpOworCSh2b2lkKSBzaWduYWwoU0lHUVVJVCwgZGllKTsKKwogCS8qIHdyaXRlIGEg c2lnbmF0dXJlIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuCiAJICoKIAkgKiBWRVJZIElNUE9SVEFO VDogbWFrZSBzdXJlIE5IRUFERVJfTElORVMgYWdyZWVzIHdpdGggdGhpcyBjb2RlLgogCSAqLwog CWZwcmludGYodG1wLCAiIyBETyBOT1QgRURJVCBUSElTIEZJTEUgLSBlZGl0IHRoZSBtYXN0ZXIg YW5kIHJlaW5zdGFsbC5cbiIpOwogCWZwcmludGYodG1wLCAiIyAoJXMgaW5zdGFsbGVkIG9uICUt MjQuMjRzKVxuIiwgRmlsZW5hbWUsIGN0aW1lKCZub3cpKTsKLQlmcHJpbnRmKHRtcCwgIiMgKENy b24gdmVyc2lvbiAtLSAlcylcbiIsIHJjc2lkKTsKKwlmcHJpbnRmKHRtcCwgIiMgKENyb24gdmVy c2lvbiAlcyAtLSAlcylcbiIsIENST05fVkVSU0lPTiwgcmNzaWQpOwogCiAJLyogY29weSB0aGUg Y3JvbnRhYiB0byB0aGUgdG1wCiAJICovCkBAIC01MzIsMTMgKzU0MiwxNSBAQAogCVNldF9MaW5l TnVtKDEpCiAJd2hpbGUgKEVPRiAhPSAoY2ggPSBnZXRfY2hhcihOZXdDcm9udGFiKSkpCiAJCXB1 dGMoY2gsIHRtcCk7Ci0JZnRydW5jYXRlKGZpbGVubyh0bXApLCBmdGVsbCh0bXApKTsKKwlmdHJ1 bmNhdGUoZmlsZW5vKHRtcCksIGZ0ZWxsKHRtcCkpOwkvKiBYWFggcmVkdW5kYW50IHdpdGggIncr Ij8gKi8KIAlmZmx1c2godG1wKTsgIHJld2luZCh0bXApOwogCiAJaWYgKGZlcnJvcih0bXApKSB7 Ci0JCXdhcm54KCJlcnJvciB3aGlsZSB3cml0aW5nIG5ldyBjcm9udGFiIHRvICVzIiwgdG4pOwot CQlmY2xvc2UodG1wKTsgIHVubGluayh0bik7Ci0JCXJldHVybiAoLTIpOworCQlmcHJpbnRmKHN0 ZGVyciwgIiVzOiBlcnJvciB3aGlsZSB3cml0aW5nIG5ldyBjcm9udGFiIHRvICVzXG4iLAorCQkJ UHJvZ3JhbU5hbWUsIFRlbXBGaWxlbmFtZSk7CisJCWZjbG9zZSh0bXApOworCQllcnJvciA9IC0y OworCQlnb3RvIGRvbmU7CiAJfQogCiAJLyogY2hlY2sgdGhlIHN5bnRheCBvZiB0aGUgZmlsZSBi ZWluZyBpbnN0YWxsZWQuCkBAIC01NTMsNiArNTY1LDExIEBACiAJd2hpbGUgKCFDaGVja0Vycm9y Q291bnQgJiYgIWVvZikgewogCQlzd2l0Y2ggKGxvYWRfZW52KGVudnN0ciwgdG1wKSkgewogCQlj YXNlIEVSUjoKKwkJCS8qIGNoZWNrIGZvciBkYXRhIGJlZm9yZSB0aGUgRU9GICovCisJCQlpZiAo ZW52c3RyWzBdICE9ICdcMCcpIHsKKwkJCQlTZXRfTGluZU51bShMaW5lTnVtYmVyICsgMSk7CisJ CQkJY2hlY2tfZXJyb3IoInByZW1hdHVyZSBFT0YiKTsKKwkJCX0KIAkJCWVvZiA9IFRSVUU7CiAJ CQlicmVhazsKIAkJY2FzZSBGQUxTRToKQEAgLTU2Niw3OCArNTgzLDExMCBAQAogCX0KIAogCWlm IChDaGVja0Vycm9yQ291bnQgIT0gMCkgewotCQl3YXJueCgiZXJyb3JzIGluIGNyb250YWIgZmls ZSwgY2FuJ3QgaW5zdGFsbCIpOwotCQlmY2xvc2UodG1wKTsgIHVubGluayh0bik7Ci0JCXJldHVy biAoLTEpOworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9ycyBpbiBjcm9udGFiIGZpbGUsIGNhbid0 IGluc3RhbGwuXG4iKTsKKwkJZmNsb3NlKHRtcCk7CisJCWVycm9yID0gLTE7CisJCWdvdG8gZG9u ZTsKIAl9CiAKKwlmaWxlX293bmVyID0gKGdldGdpZCgpID09IGdldGVnaWQoKSkgPyBST09UX1VJ RCA6IHB3LT5wd191aWQ7CisKICNpZmRlZiBIQVNfRkNIT1dOCi0JaWYgKGZjaG93bihmaWxlbm8o dG1wKSwgUk9PVF9VSUQsIC0xKSA8IE9LKQotI2Vsc2UKLQlpZiAoY2hvd24odG4sIFJPT1RfVUlE LCAtMSkgPCBPSykKLSNlbmRpZgotCXsKLQkJd2FybigiY2hvd24iKTsKLQkJZmNsb3NlKHRtcCk7 ICB1bmxpbmsodG4pOwotCQlyZXR1cm4gKC0yKTsKKwlpZiAoZmNob3duKGZpbGVubyh0bXApLCBm aWxlX293bmVyLCAtMSkgPCBPSykgeworCQlwZXJyb3IoImZjaG93biIpOworCQlmY2xvc2UodG1w KTsKKwkJZXJyb3IgPSAtMjsKKwkJZ290byBkb25lOwogCX0KLQotI2lmZGVmIEhBU19GQ0hNT0QK LQlpZiAoZmNobW9kKGZpbGVubyh0bXApLCAwNjAwKSA8IE9LKQogI2Vsc2UKLQlpZiAoY2htb2Qo dG4sIDA2MDApIDwgT0spCi0jZW5kaWYKLQl7Ci0JCXdhcm4oImNob3duIik7Ci0JCWZjbG9zZSh0 bXApOyAgdW5saW5rKHRuKTsKLQkJcmV0dXJuICgtMik7CisJaWYgKGNob3duKFRlbXBGaWxlbmFt ZSwgZmlsZV9vd25lciwgLTEpIDwgT0spIHsKKwkJcGVycm9yKCJjaG93biIpOworCQlmY2xvc2Uo dG1wKTsKKwkJZXJyb3IgPSAtMjsKKwkJZ290byBkb25lOwogCX0KKyNlbmRpZgogCiAJaWYgKGZj bG9zZSh0bXApID09IEVPRikgewotCQl3YXJuKCJmY2xvc2UiKTsKLQkJdW5saW5rKHRuKTsKLQkJ cmV0dXJuICgtMik7CisJCXBlcnJvcigiZmNsb3NlIik7CisJCWVycm9yID0gLTI7CisJCWdvdG8g ZG9uZTsKIAl9CiAKLQkodm9pZCkgc25wcmludGYobiwgc2l6ZW9mKG4pLCBDUk9OX1RBQihVc2Vy KSk7Ci0JaWYgKHJlbmFtZSh0biwgbikpIHsKLQkJd2FybigiZXJyb3IgcmVuYW1pbmcgJXMgdG8g JXMiLCB0biwgbik7Ci0JCXVubGluayh0bik7Ci0JCXJldHVybiAoLTIpOworCWlmICghZ2x1ZV9z dHJpbmdzKG4sIHNpemVvZiBuLCBTUE9PTF9ESVIsIFVzZXIsICcvJykpIHsKKwkJZnByaW50Zihz dGRlcnIsICJwYXRoIHRvbyBsb25nXG4iKTsKKwkJZXJyb3IgPSAtMjsKKwkJZ290byBkb25lOwog CX0KLQorCWlmIChyZW5hbWUoVGVtcEZpbGVuYW1lLCBuKSkgeworCQlmcHJpbnRmKHN0ZGVyciwg IiVzOiBlcnJvciByZW5hbWluZyAlcyB0byAlc1xuIiwKKwkJCVByb2dyYW1OYW1lLCBUZW1wRmls ZW5hbWUsIG4pOworCQlwZXJyb3IoInJlbmFtZSIpOworCQllcnJvciA9IC0yOworCQlnb3RvIGRv bmU7CisJfQorCVRlbXBGaWxlbmFtZVswXSA9ICdcMCc7CiAJbG9nX2l0KFJlYWxVc2VyLCBQaWQs ICJSRVBMQUNFIiwgVXNlcik7CiAKLQkvKgotCSAqIENyZWF0aW5nIHRoZSAndG4nIHRlbXAgZmls ZSBoYXMgYWxyZWFkeSB1cGRhdGVkIHRoZQotCSAqIG1vZGlmaWNhdGlvbiB0aW1lIG9mIHRoZSBz cG9vbCBkaXJlY3RvcnkuICBTbGVlcCBmb3IgYQotCSAqIHNlY29uZCB0byBlbnN1cmUgdGhhdCBw b2tlX2RhZW1vbigpIHNldHMgYSBsYXRlcgotCSAqIG1vZGlmaWNhdGlvbiB0aW1lLiAgT3RoZXJ3 aXNlLCB0aGlzIGNhbiByYWNlIHdpdGggdGhlIGNyb24KLQkgKiBkYWVtb24gc2Nhbm5pbmcgZm9y IHVwZGF0ZWQgY3JvbnRhYnMuCi0JICovCi0Jc2xlZXAoMSk7Ci0KLQlwb2tlX2RhZW1vbigpOwor CXBva2VfZGFlbW9uKFJFTE9BRF9DUk9OKTsKIAotCXJldHVybiAoMCk7Citkb25lOgorCSh2b2lk KSBzaWduYWwoU0lHSFVQLCBTSUdfREZMKTsKKwkodm9pZCkgc2lnbmFsKFNJR0lOVCwgU0lHX0RG TCk7CisJKHZvaWQpIHNpZ25hbChTSUdRVUlULCBTSUdfREZMKTsKKwlpZiAoVGVtcEZpbGVuYW1l WzBdKSB7CisJCSh2b2lkKSB1bmxpbmsoVGVtcEZpbGVuYW1lKTsKKwkJVGVtcEZpbGVuYW1lWzBd ID0gJ1wwJzsKKwl9CisJcmV0dXJuIChlcnJvcik7CiB9CiAKLQogc3RhdGljIHZvaWQKLXBva2Vf ZGFlbW9uKCkgeworcG9rZV9kYWVtb24odW5zaWduZWQgY2hhciBjb29raWUpIHsKKwlpbnQgc29j ayA9IC0xOworCXN0cnVjdCBzb2NrYWRkcl91biBzX3VuOwogI2lmZGVmIFVTRV9VVElNRVMKLQlz dHJ1Y3QgdGltZXZhbCB0dnNbMl07Ci0KLQkodm9pZClnZXR0aW1lb2ZkYXkoJnR2c1swXSwgTlVM TCk7Ci0JdHZzWzFdID0gdHZzWzBdOwotCWlmICh1dGltZXMoU1BPT0xfRElSLCB0dnMpIDwgT0sp IHsKKwlzdHJ1Y3QgdGltZXZhbCB0dnNbMV07CisJCisJKHZvaWQpZ2V0dGltZW9mZGF5KCZ0dnMs IE5VTEwpOworCWlmICh1dGltZShTUE9PTF9ESVIsIHR2cykgPCBPSykgewogCQl3YXJuKCJjYW4n dCB1cGRhdGUgbXRpbWUgb24gc3Bvb2xkaXIgJXMiLCBTUE9PTF9ESVIpOwogCQlyZXR1cm47CiAJ fQogI2Vsc2UKIAlpZiAodXRpbWUoU1BPT0xfRElSLCBOVUxMKSA8IE9LKSB7Ci0JCXdhcm4oImNh bid0IHVwZGF0ZSBtdGltZSBvbiBzcG9vbGRpciAlcyIsIFNQT09MX0RJUik7CisJCXdhcm4oImNh bnQndCB1cGRhdGUgbXRpbWUgb24gc3Bvb2xkaXIgJXMiLCBTUE9PTF9ESVIpOwogCQlyZXR1cm47 CiAJfQogI2VuZGlmIC8qVVNFX1VUSU1FUyovCisKKwltZW1zZXQoJnNfdW4sICdcMCcsIHNpemVv ZihzX3VuKSk7CisJaWYgKCh1bnNpZ25lZCBsb25nKXNucHJpbnRmKHNfdW4uc3VuX3BhdGgsIHNp emVvZihzX3VuLnN1bl9wYXRoKSwgIiVzLyVzLyVzIiwKKwkJCQlDUk9ORElSLCBTUE9PTF9ESVIs IFNPQ0tGSUxFKSA+PSBzaXplb2Yoc191bi5zdW5fcGF0aCkpIHsKKwkJZnByaW50ZihzdGRlcnIs ICIlczogJXMvJXM6IHBhdGggdG9vIGxvbmdcbiIsCisJCQkJUHJvZ3JhbU5hbWUsIENST05ESVIs IFNPQ0tGSUxFKTsKKwkJcmV0dXJuOworCX0KKwkKKwlzX3VuLnN1bl9mYW1pbHkgPSBQRl9MT0NB TDsKKyNpZmRlZiBTVU5fTEVOCisJc191bi5zdW5fbGVuID0gU1VOX0xFTigmc191bik7CisjZW5k aWYKKwkodm9pZCkgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCWlmICgoc29jayA9IHNvY2tl dChQRl9MT0NBTCwgU09DS19TVFJFQU0sIDApKSA+PSAwICYmCisJCQljb25uZWN0KHNvY2ssIChz dHJ1Y3Qgc29ja2FkZHIgKikmc191biwgc2l6ZW9mKHNfdW4pKSA9PSAwKQorCQl3cml0ZShzb2Nr LCAmY29va2llLCAxKTsKKwllbHNlCisJCWZwcmludGYoc3RkZXJyLCAiJXM6IHdhcm5pbmcsIGNy b24gZG9lcyBub3QgYXBwZWFyIHRvIGJlICIKKwkJCQkicnVubmluZy5cbiIsIFByb2dyYW1OYW1l KTsKKwlpZiAoc29jayA+PSAwKQorCQljbG9zZShzb2NrKTsKKwkodm9pZCkgc2lnbmFsKFNJR1BJ UEUsIFNJR19ERkwpOworfQorCitzdGF0aWMgdm9pZAorZGllKGludCB4KSB7CisJaWYgKFRlbXBG aWxlbmFtZVswXSkKKwkJKHZvaWQpIHVubGluayhUZW1wRmlsZW5hbWUpOworCV9leGl0KEVSUk9S X0VYSVQpOwogfQpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9kb2MvQ0hBTkdFUyBm cmVlYnNkX2Nyb24vZG9jL0NIQU5HRVMKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vZG9jL0NI QU5HRVMJMjAxNC0wMS0xNiAyMTo0Mzo1MC4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jv bi9kb2MvQ0hBTkdFUwkyMDE0LTA2LTExIDE2OjQyOjU1LjI3NDQ0NDg5NiArMDIwMApAQCAtMSw0 ICsxLDQgQEAKLSRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jpbi9jcm9uL2RvYy9DSEFO R0VTIDIyODk5MCAyMDExLTEyLTMwIDEwOjU4OjE0WiB1cXMgJAorJEZyZWVCU0Q6IHJlbGVuZy8x MC4wL3Vzci5zYmluL2Nyb24vZG9jL0NIQU5HRVMgMjI4OTkwIDIwMTEtMTItMzAgMTA6NTg6MTRa IHVxcyAkCiAtLS0tLS0tLQogCiBWaXhpZSBDcm9uCQlDaGFuZ2VzIGZyb20gVjIgdG8gVjMKZGlm ZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vZG9jL0NPTlZFUlNJT04gZnJlZWJzZF9jcm9u L2RvYy9DT05WRVJTSU9OCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9jcm9uL2RvYy9DT05WRVJTSU9O CTIwMTQtMDEtMTYgMjE6NDM6NTAuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vZG9j L0NPTlZFUlNJT04JMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzQ0NDQ4OTYgKzAyMDAKQEAgLTEsNCAr MSw0IEBACi0kRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9kb2MvQ09OVkVS U0lPTiA3MjA5MSAyMDAxLTAyLTA2IDExOjIxOjU4WiBhc21vZGFpICQKKyRGcmVlQlNEOiByZWxl bmcvMTAuMC91c3Iuc2Jpbi9jcm9uL2RvYy9DT05WRVJTSU9OIDcyMDkxIDIwMDEtMDItMDYgMTE6 MjE6NThaIGFzbW9kYWkgJAogCiBDb252ZXJzaW9uIG9mIEJTRCA0LlsyM10gY3JvbnRhYiBmaWxl czoKIApkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9kb2MvRkVBVFVSRVMgZnJlZWJz ZF9jcm9uL2RvYy9GRUFUVVJFUwotLS0gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9kb2MvRkVBVFVS RVMJMjAxNC0wMS0xNiAyMTo0Mzo1MC4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9k b2MvRkVBVFVSRVMJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzQ0NDQ4OTYgKzAyMDAKQEAgLTEsNCAr MSw0IEBACi0kRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9kb2MvRkVBVFVS RVMgNTA0NzkgMTk5OS0wOC0yOCAwMTozNTo1OVogcGV0ZXIgJAorJEZyZWVCU0Q6IHJlbGVuZy8x MC4wL3Vzci5zYmluL2Nyb24vZG9jL0ZFQVRVUkVTIDUwNDc5IDE5OTktMDgtMjggMDE6MzU6NTla IHBldGVyICQKIAogRmVhdHVyZXMgb2YgVml4aWUncyBjcm9uIHJlbGF0aXZlIHRvIEJTRCA0Llsy M10gYW5kIFN5c1YgY3JvbnM6CiAKZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vZG9j L0lOU1RBTEwgZnJlZWJzZF9jcm9uL2RvYy9JTlNUQUxMCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9j cm9uL2RvYy9JTlNUQUxMCTIwMTQtMDEtMTYgMjE6NDM6NTAuMDAwMDAwMDAwICswMTAwCisrKyBm cmVlYnNkX2Nyb24vZG9jL0lOU1RBTEwJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzQ0NDQ4OTYgKzAy MDAKQEAgLTE1LDcgKzE1LDcgQEAKICAqIFBhdWwgVml4aWUgICAgICAgICAgPHBhdWxAdml4LmNv bT4gICAgICAgICAgdXVuZXQhZGVjd3JsIXZpeGllIXBhdWwKICAqLwogCi0kRnJlZUJTRDogcmVs ZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9kb2MvSU5TVEFMTCA1MDQ3OSAxOTk5LTA4LTI4IDAx OjM1OjU5WiBwZXRlciAkCiskRnJlZUJTRDogcmVsZW5nLzEwLjAvdXNyLnNiaW4vY3Jvbi9kb2Mv SU5TVEFMTCA1MDQ3OSAxOTk5LTA4LTI4IDAxOjM1OjU5WiBwZXRlciAkCiAKIFJlYWQgdGhlIGNv bW1lbnRzIGF0IHRoZSB0b3Agb2YgdGhlIE1ha2VmaWxlLCB0aGVuIGVkaXQgdGhlIGFyZWEgbWFy a2VkCiAnY29uZmlndXJhYmxlIHN0dWZmJy4KZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Ny b24vZG9jL01BSUwgZnJlZWJzZF9jcm9uL2RvYy9NQUlMCi0tLSAvdXNyL3NyYy91c3Iuc2Jpbi9j cm9uL2RvYy9NQUlMCTIwMTQtMDEtMTYgMjE6NDM6NTAuMDAwMDAwMDAwICswMTAwCisrKyBmcmVl YnNkX2Nyb24vZG9jL01BSUwJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzQ0NDQ4OTYgKzAyMDAKQEAg LTMsNyArMyw3IEBACiAgIHZlcnNpb24gb2YgY3Jvbi4gIGl0IGlzIHByZXNlbnRlZCBoZXJlIGZv ciBpdHMgZW50ZXJ0YWlubWVudCB2YWx1ZS4KICAgLS12aXggXQogCi0kRnJlZUJTRDogcmVsZWFz ZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9kb2MvTUFJTCAyMjg5OTAgMjAxMS0xMi0zMCAxMDo1ODox NFogdXFzICQKKyRGcmVlQlNEOiByZWxlbmcvMTAuMC91c3Iuc2Jpbi9jcm9uL2RvYy9NQUlMIDIy ODk5MCAyMDExLTEyLTMwIDEwOjU4OjE0WiB1cXMgJAogCiBGcm9tIHB0c2ZhIWxsbC1jcmchYW1l cyFhY29ybnJjIWJvYiBXZWQgRGVjIDMxIDEwOjA3OjA4IDE5ODYKIERhdGU6IFdlZCwgMzEgRGVj IDg2IDA4OjU5OjMxIHBzdApkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9kb2MvTWFr ZWZpbGUudml4aWUgZnJlZWJzZF9jcm9uL2RvYy9NYWtlZmlsZS52aXhpZQotLS0gL3Vzci9zcmMv dXNyLnNiaW4vY3Jvbi9kb2MvTWFrZWZpbGUudml4aWUJMjAxNC0wMS0xNiAyMTo0Mzo1MC4wMDAw MDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9kb2MvTWFrZWZpbGUudml4aWUJMjAxNC0wNi0x MSAxNjo0Mjo1NS4yNzQ0NDQ4OTYgKzAyMDAKQEAgLTE3LDcgKzE3LDcgQEAKIAogIyBNYWtlZmls ZSBmb3Igdml4aWUncyBjcm9uCiAjCi0jICRGcmVlQlNEOiByZWxlYXNlLzEwLjAuMC91c3Iuc2Jp bi9jcm9uL2RvYy9NYWtlZmlsZS52aXhpZSA1MDQ3OSAxOTk5LTA4LTI4IDAxOjM1OjU5WiBwZXRl ciAkCisjICRGcmVlQlNEOiByZWxlbmcvMTAuMC91c3Iuc2Jpbi9jcm9uL2RvYy9NYWtlZmlsZS52 aXhpZSA1MDQ3OSAxOTk5LTA4LTI4IDAxOjM1OjU5WiBwZXRlciAkCiAjCiAjIHZpeCAwM21hcjg4 IFttb3ZlZCB0byBSQ1MsIHJlc3Qgb2YgbG9nIGlzIGluIHRoZXJlXQogIyB2aXggMzBtYXI4NyBb Z29vZGJ5ZSwgdGltZS5jOyBoZWxsbywgZ2V0b3B0XQpkaWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNi aW4vY3Jvbi9kb2MvUkVBRE1FIGZyZWVic2RfY3Jvbi9kb2MvUkVBRE1FCi0tLSAvdXNyL3NyYy91 c3Iuc2Jpbi9jcm9uL2RvYy9SRUFETUUJMjAxNC0wMS0xNiAyMTo0Mzo1MC4wMDAwMDAwMDAgKzAx MDAKKysrIGZyZWVic2RfY3Jvbi9kb2MvUkVBRE1FCTIwMTQtMDYtMTEgMTY6NDI6NTUuMjc0NDQ0 ODk2ICswMjAwCkBAIC02OSw0ICs2OSw0IEBACiAJaWYgeW91IGxpa2UgaXQsIGNoYW5nZSB5b3Vy IC9ldGMve3JjLHJjLmxvY2FsfSB0byB1c2UgaXQgaW5zdGVhZCBvZgogCQl0aGUgb2xkIG9uZS4K IAotJEZyZWVCU0Q6IHJlbGVhc2UvMTAuMC4wL3Vzci5zYmluL2Nyb24vZG9jL1JFQURNRSA1MDQ3 OSAxOTk5LTA4LTI4IDAxOjM1OjU5WiBwZXRlciAkCiskRnJlZUJTRDogcmVsZW5nLzEwLjAvdXNy LnNiaW4vY3Jvbi9kb2MvUkVBRE1FIDUwNDc5IDE5OTktMDgtMjggMDE6MzU6NTlaIHBldGVyICQK ZGlmZiAtcnVOIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vbGliL01ha2VmaWxlIGZyZWVic2RfY3Jv bi9saWIvTWFrZWZpbGUKLS0tIC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vbGliL01ha2VmaWxlCTIw MTQtMDEtMTYgMjE6NDM6NTAuMDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vbGliL01h a2VmaWxlCTIwMTQtMDYtMTEgMTY6NDI6NTUuMjc1NDQ0Mzc5ICswMjAwCkBAIC0xLDQgKzEsNCBA QAotIyAkRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9saWIvTWFrZWZpbGUg MTg1MDQyIDIwMDgtMTEtMTggMDA6NTk6MjZaIG1hdHRlbyAkCisjICRGcmVlQlNEOiByZWxlbmcv MTAuMC91c3Iuc2Jpbi9jcm9uL2xpYi9NYWtlZmlsZSAxODUwNDIgMjAwOC0xMS0xOCAwMDo1OToy NlogbWF0dGVvICQKIAogTElCPQljcm9uCiBJTlRFUk5BTExJQj0KZGlmZiAtcnVOIC91c3Ivc3Jj L3Vzci5zYmluL2Nyb24vbGliL2NvbXBhdC5jIGZyZWVic2RfY3Jvbi9saWIvY29tcGF0LmMKLS0t IC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vbGliL2NvbXBhdC5jCTIwMTQtMDEtMTYgMjE6NDM6NTAu MDAwMDAwMDAwICswMTAwCisrKyBmcmVlYnNkX2Nyb24vbGliL2NvbXBhdC5jCTE5NzAtMDEtMDEg MDE6MDA6MDAuMDAwMDAwMDAwICswMTAwCkBAIC0xLDIzNyArMCwwIEBACi0vKiBDb3B5cmlnaHQg MTk4OCwxOTkwLDE5OTMsMTk5NCBieSBQYXVsIFZpeGllCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVk Ci0gKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2VwdDogZG9uJ3QgcmVtb3ZlIG15IG5hbWUg ZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0aW9uIChkb24ndCB0YWtlIGNyZWRpdCBm b3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChkb24ndAotICogZ2V0IG1lIGJsYW1lZCBm b3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0ZXIgb3IgcmVtb3ZlIHRoaXMKLSAqIG5v dGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBzb3VyY2UgaXMgcHJvdmlkZWQgdG8gYnV5 ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5kLCBleHByZXNzIG9yIGltcGxpZWQsIGlz IGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7IHVzZSBhdCB5b3VyIG93biByaXNrLCBy ZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55KSB0bwotICogYW55b25lIHJlc3VsdGlu ZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSByZXN0cyBlbnRpcmVseSB3aXRoIHRoZQot ICogdXNlci4KLSAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4ZXMsIGVuaGFuY2VtZW50 cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRyeSB0byBrZWVwIGEgdmVy c2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xsb3dzOgotICogUGF1bCBW aXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5ldCFkZWN3cmwhdml4aWUh cGF1bAotICovCi0KLSNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQotc3RhdGlj IGNoYXIgcmNzaWRbXSA9ICIkRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9s aWIvY29tcGF0LmMgNjk3OTMgMjAwMC0xMi0wOSAwOTozNTo1NVogb2JyaWVuICQiOwotI2VuZGlm Ci0KLS8qIHZpeCAzMGRlYzkzIFticm9rZSB0aGlzIG91dCBvZiBtaXNjLmMgLSBzZWUgUkNTIGxv ZyBmb3IgaGlzdG9yeV0KLSAqIHZpeCAxNWphbjg3IFthZGRlZCBUSU9DTk9UVFksIHRoYW5rcyBj c2dAcHlyYW1pZF0KLSAqLwotCi0KLSNpbmNsdWRlICJjcm9uLmgiCi0jaWZkZWYgTkVFRF9HRVRE VEFCTEVTSVpFCi0jIGluY2x1ZGUgPGxpbWl0cy5oPgotI2VuZGlmCi0jaWYgZGVmaW5lZChORUVE X1NFVFNJRCkgJiYgZGVmaW5lZChCU0QpCi0jIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2VuZGlm Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwYXRocy5oPgotCi0KLS8qIHRoZSBjb2Rl IGRvZXMgbm90IGRlcGVuZCBvbiBhbnkgb2YgdmZvcmsncwotICogc2lkZS1lZmZlY3RzOyBpdCBq dXN0IHVzZXMgaXQgYXMgYSBxdWljawotICogZm9yay1hbmQtZXhlYy4KLSAqLwotI2lmZGVmIE5F RURfVkZPUksKLVBJRF9UCi12Zm9yaygpIHsKLQlyZXR1cm4gKGZvcmsoKSk7Ci19Ci0jZW5kaWYK LQotCi0jaWZkZWYgTkVFRF9TVFJEVVAKLWNoYXIgKgotc3RyZHVwKHN0cikKLQljaGFyCSpzdHI7 Ci17Ci0JY2hhcgkqdGVtcDsKLQotCWlmICgodGVtcCA9IG1hbGxvYyhzdHJsZW4oc3RyKSArIDEp KSA9PSBOVUxMKSB7Ci0JCWVycm5vID0gRU5PTUVNOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JKHZv aWQpIHN0cmNweSh0ZW1wLCBzdHIpOwotCXJldHVybiB0ZW1wOwotfQotI2VuZGlmCi0KLQotI2lm ZGVmIE5FRURfU1RSRVJST1IKLWNoYXIgKgotc3RyZXJyb3IoZXJyb3IpCi0JaW50IGVycm9yOwot ewotCWV4dGVybiBjaGFyICpzeXNfZXJybGlzdFtdOwotCWV4dGVybiBpbnQgc3lzX25lcnI7Ci0J c3RhdGljIGNoYXIgYnVmWzMyXTsKLQotCWlmICgoZXJyb3IgPD0gc3lzX25lcnIpICYmIChlcnJv ciA+IDApKSB7Ci0JCXJldHVybiBzeXNfZXJybGlzdFtlcnJvcl07Ci0JfQotCi0Jc3ByaW50Zihi dWYsICJVbmtub3duIGVycm9yOiAlZCIsIGVycm9yKTsKLQlyZXR1cm4gYnVmOwotfQotI2VuZGlm Ci0KLQotI2lmZGVmIE5FRURfU1RSQ0FTRUNNUAotaW50Ci1zdHJjYXNlY21wKGxlZnQsIHJpZ2h0 KQotCWNoYXIJKmxlZnQ7Ci0JY2hhcgkqcmlnaHQ7Ci17Ci0Jd2hpbGUgKCpsZWZ0ICYmIChNa0xv d2VyKCpsZWZ0KSA9PSBNa0xvd2VyKCpyaWdodCkpKSB7Ci0JCWxlZnQrKzsKLQkJcmlnaHQrKzsK LQl9Ci0JcmV0dXJuIE1rTG93ZXIoKmxlZnQpIC0gTWtMb3dlcigqcmlnaHQpOwotfQotI2VuZGlm Ci0KLQotI2lmZGVmIE5FRURfU0VUU0lECi1pbnQKLXNldHNpZCgpCi17Ci0JaW50CW5ld3BncnA7 Ci0jIGlmIGRlZmluZWQoQlNEKQotCWludAlmZDsKLSMgIGlmIGRlZmluZWQoUE9TSVgpCi0JbmV3 cGdycCA9IHNldHBnaWQoKHBpZF90KTAsIGdldHBpZCgpKTsKLSMgIGVsc2UKLQluZXdwZ3JwID0g c2V0cGdycCgwLCBnZXRwaWQoKSk7Ci0jICBlbmRpZgotCWlmICgoZmQgPSBvcGVuKF9QQVRIX1RU WSwgMikpID49IDApCi0JewotCQkodm9pZCkgaW9jdGwoZmQsIFRJT0NOT1RUWSwgKGNoYXIqKTAp OwotCQkodm9pZCkgY2xvc2UoZmQpOwotCX0KLSMgZWxzZSAvKkJTRCovCi0JbmV3cGdycCA9IHNl dHBncnAoKTsKLQotCSh2b2lkKSBjbG9zZShTVERJTik7CSh2b2lkKSBvcGVuKF9QQVRIX0RFVk5V TEwsIDApOwotCSh2b2lkKSBjbG9zZShTVERPVVQpOwkodm9pZCkgb3BlbihfUEFUSF9ERVZOVUxM LCAxKTsKLQkodm9pZCkgY2xvc2UoU1RERVJSKTsJKHZvaWQpIG9wZW4oX1BBVEhfREVWTlVMTCwg Mik7Ci0jIGVuZGlmIC8qQlNEKi8KLQlyZXR1cm4gbmV3cGdycDsKLX0KLSNlbmRpZiAvKk5FRURf U0VUU0lEKi8KLQotCi0jaWZkZWYgTkVFRF9HRVREVEFCTEVTSVpFCi1pbnQKLWdldGR0YWJsZXNp emUoKSB7Ci0jaWZkZWYgX1NDX09QRU5fTUFYCi0JcmV0dXJuIHN5c2NvbmYoX1NDX09QRU5fTUFY KTsKLSNlbHNlCi0JcmV0dXJuIF9QT1NJWF9PUEVOX01BWDsKLSNlbmRpZgotfQotI2VuZGlmCi0K LQotI2lmZGVmIE5FRURfRkxPQ0sKLS8qIFRoZSBmb2xsb3dpbmcgZmxvY2soKSBlbXVsYXRpb24g c25hcmZlZCBpbnRhY3QgKikgZnJvbSB0aGUgSFAtVVgKLSAqICJCU0QgdG8gSFAtVVggcG9ydGlu ZyB0cmlja3MiIG1haW50YWluZWQgYnkKLSAqIHN5c3RlbUBhbGNoZW15LmNoZW0udXRvcm9udG8u Y2EgKFN5c3RlbSBBZG1pbiAoTWlrZSBQZXRlcnNvbikpCi0gKiBmcm9tIHRoZSB2ZXJzaW9uICJs YXN0IHVwZGF0ZWQ6IDExLUphbi0xOTkzIgotICogU25hcmZhZ2UgZG9uZSBieSBKYXJra28gSGll dGFuaWVtaSA8SmFya2tvLkhpZXRhbmllbWlAaHV0LmZpPgotICogKikgd2VsbCwgYWxtb3N0LCBo YWQgdG8gSyZSIHRoZSBmdW5jdGlvbiBlbnRyeSwgSFBVWCAiY2MiCi0gKiBkb2VzIG5vdCBncm9r IEFOU0kgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotIAotLyoKLSAqIGZsb2NrIChmZCwgb3BlcmF0 aW9uKQotICoKLSAqIFRoaXMgcm91dGluZSBwZXJmb3JtcyBzb21lIGZpbGUgbG9ja2luZyBsaWtl IHRoZSBCU0QgJ2Zsb2NrJwotICogb24gdGhlIG9iamVjdCBkZXNjcmliZWQgYnkgdGhlIGludCBm aWxlIGRlc2NyaXB0b3IgJ2ZkJywKLSAqIHdoaWNoIG11c3QgYWxyZWFkeSBiZSBvcGVuLgotICoK LSAqIFRoZSBvcGVyYXRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBhcmU6Ci0gKgotICogTE9DS19T SCAgLSAgZ2V0IGEgc2hhcmVkIGxvY2suCi0gKiBMT0NLX0VYICAtICBnZXQgYW4gZXhjbHVzaXZl IGxvY2suCi0gKiBMT0NLX05CICAtICBkb24ndCBibG9jayAobXVzdCBiZSBPUmVkIHdpdGggTE9D S19TSCBvciBMT0NLX0VYKS4KLSAqIExPQ0tfVU4gIC0gIHJlbGVhc2UgYSBsb2NrLgotICoKLSAq IFJldHVybiB2YWx1ZTogMCBpZiBsb2NrIHN1Y2Nlc3NmdWwsIC0xIGlmIGZhaWxlZC4KLSAqCi0g KiBOb3RlIHRoYXQgd2hldGhlciB0aGUgbG9ja3MgYXJlIGVuZm9yY2VkIG9yIGFkdmlzb3J5IGlz Ci0gKiBjb250cm9sbGVkIGJ5IHRoZSBwcmVzZW5jZSBvciBhYnNlbmNlIG9mIHRoZSBTRVRHSUQg Yml0IG9uCi0gKiB0aGUgZXhlY3V0YWJsZS4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8g ZGlmZmVyZW5jZSBiZXR3ZWVuIHNoYXJlZCBhbmQgZXhjbHVzaXZlCi0gKiBsb2Nrcywgc2luY2Ug dGhlICdsb2NrZicgc3lzdGVtIGNhbGwgaW4gU1lTViBkb2Vzbid0IG1ha2UgYW55Ci0gKiBkaXN0 aW5jdGlvbi4KLSAqCi0gKiBUaGUgZmlsZSAiPHN5cy9maWxlLmg+IiBzaG91bGQgYmUgbW9kaWZp ZWQgdG8gY29udGFpbiB0aGUgZGVmaW5pdGlvbnMKLSAqIG9mIHRoZSBhdmFpbGFibGUgb3BlcmF0 aW9ucywgd2hpY2ggbXVzdCBiZSBhZGRlZCBtYW51YWxseSAoc2VlIGJlbG93Ci0gKiBmb3IgdGhl IHZhbHVlcykuCi0gKi8KLQotLyogdGhpcyBjb2RlIGhhcyBiZWVuIHJlZm9ybWF0dGVkIGJ5IHZp eGllICovCi0KLWludAotZmxvY2soZmQsIG9wZXJhdGlvbikKLQlpbnQgZmQ7Ci0JaW50IG9wZXJh dGlvbjsKLXsKLQlpbnQgaTsKLQotCXN3aXRjaCAob3BlcmF0aW9uKSB7Ci0JY2FzZSBMT0NLX1NI OgkJLyogZ2V0IGEgc2hhcmVkIGxvY2sgKi8KLQljYXNlIExPQ0tfRVg6CQkvKiBnZXQgYW4gZXhj bHVzaXZlIGxvY2sgKi8KLQkJaSA9IGxvY2tmIChmZCwgRl9MT0NLLCAwKTsKLQkJYnJlYWs7Ci0K LQljYXNlIExPQ0tfU0h8TE9DS19OQjoJLyogZ2V0IGEgbm9uLWJsb2NraW5nIHNoYXJlZCBsb2Nr ICovCi0JY2FzZSBMT0NLX0VYfExPQ0tfTkI6CS8qIGdldCBhIG5vbi1ibG9ja2luZyBleGNsdXNp dmUgbG9jayAqLwotCQlpID0gbG9ja2YgKGZkLCBGX1RMT0NLLCAwKTsKLQkJaWYgKGkgPT0gLTEp Ci0JCQlpZiAoKGVycm5vID09IEVBR0FJTikgfHwgKGVycm5vID09IEVBQ0NFUykpCi0JCQkJZXJy bm8gPSBFV09VTERCTE9DSzsKLQkJYnJlYWs7Ci0KLQljYXNlIExPQ0tfVU46CQkvKiB1bmxvY2sg Ki8KLQkJaSA9IGxvY2tmIChmZCwgRl9VTE9DSywgMCk7Ci0JCWJyZWFrOwotIAotCWRlZmF1bHQ6 CQkvKiBjYW4ndCBkZWNpcGhlciBvcGVyYXRpb24gKi8KLQkJaSA9IC0xOwotCQllcnJubyA9IEVJ TlZBTDsKLQkJYnJlYWs7Ci0JfQotIAotCXJldHVybiAoaSk7Ci19Ci0jZW5kaWYgLypORUVEX0ZM T0NLKi8KLQotCi0jaWZkZWYgTkVFRF9TRVRFTlYKLWludAotc2V0ZW52KG5hbWUsIHZhbHVlLCBv dmVyd3JpdGUpCi0JY2hhciAqbmFtZSwgKnZhbHVlOwotCWludCBvdmVyd3JpdGU7Ci17Ci0JY2hh ciAqdG1wOwotCi0JaWYgKG92ZXJ3cml0ZSAmJiBnZXRlbnYobmFtZSkpCi0JCXJldHVybiAtMTsK LQotCWlmICghKHRtcCA9IG1hbGxvYyhzdHJsZW4obmFtZSkgKyBzdHJsZW4odmFsdWUpICsgMikp KSB7Ci0JCWVycm5vID0gRU5PTUVNOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0Jc3ByaW50Zih0bXAs ICIlcz0lcyIsIG5hbWUsIHZhbHVlKTsKLQlyZXR1cm4gcHV0ZW52KHRtcCk7CS8qIGludGVudGlv bmFsbHkgb3JwaGFuICd0bXAnIHN0b3JhZ2UgKi8KLX0KLSNlbmRpZgpkaWZmIC1ydU4gL3Vzci9z cmMvdXNyLnNiaW4vY3Jvbi9saWIvZW50cnkuYyBmcmVlYnNkX2Nyb24vbGliL2VudHJ5LmMKLS0t IC91c3Ivc3JjL3Vzci5zYmluL2Nyb24vbGliL2VudHJ5LmMJMjAxNC0wMS0xNiAyMTo0Mzo1MC4w MDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9saWIvZW50cnkuYwkyMDE0LTA2LTExIDE2 OjQyOjU1LjI3NTQ0NDM3OSArMDIwMApAQCAtMSwyNCArMSwyOCBAQAotLyogQ29weXJpZ2h0IDE5 ODgsMTk5MCwxOTkzLDE5OTQgYnkgUGF1bCBWaXhpZQorLyoKKyAqIENvcHlyaWdodCAxOTg4LDE5 OTAsMTk5MywxOTk0IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqLwor CisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1 bSwgSW5jLiAoIklTQyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBT b2Z0d2FyZSBDb25zb3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2Vw dDogZG9uJ3QgcmVtb3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0 aW9uIChkb24ndCB0YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChk b24ndAotICogZ2V0IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0 ZXIgb3IgcmVtb3ZlIHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBz b3VyY2UgaXMgcHJvdmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5k LCBleHByZXNzIG9yIGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7 IHVzZSBhdCB5b3VyIG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55 KSB0bwotICogYW55b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBy ZXN0cyBlbnRpcmVseSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBj b3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVy cG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0 IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGlj ZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4 ZXMsIGVuaGFuY2VtZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRy eSB0byBrZWVwIGEgdmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xs b3dzOgotICogUGF1bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5l dCFkZWN3cmwhdml4aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIg QU5EIElTQyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMg U09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5U QUJJTElUWSBBTkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9S CisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1B R0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0Yg VVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFD VCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBP RiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNP RlRXQVJFLgogICovCiAKLSNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQotc3Rh dGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9Ci0gICIkRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNy LnNiaW4vY3Jvbi9saWIvZW50cnkuYyAyNDIxMDEgMjAxMi0xMC0yNSAyMjo1NDoyOVogc29ib21h eCAkIjsKLSNlbmRpZgorLy8jaWYgIWRlZmluZWQobGludCkgJiYgIWRlZmluZWQoTElOVCkKKy8v c3RhdGljIGNoYXIgcmNzaWRbXSA9ICIkSWQ6IGVudHJ5LmMsdiAxLjE3IDIwMDQvMDEvMjMgMTg6 NTY6NDIgdml4aWUgRXhwICQiOworLy8jZW5kaWYKIAogLyogdml4IDI2amFuODcgW1JDUydkOyBy ZXN0IG9mIGxvZyBpcyBpbiBSQ1MgZmlsZV0KICAqIHZpeCAwMWphbjg3IFthZGRlZCBsaW5lLWxl dmVsIGVycm9yIHJlY292ZXJ5XQpAQCAtMjYsMjcgKzMwLDE0IEBACiAgKiB2aXggMzBkZWM4NiBb d3JpdHRlbl0KICAqLwogCi0KICNpbmNsdWRlICJjcm9uLmgiCi0jaW5jbHVkZSA8Z3JwLmg+Ci0j aWZkZWYgTE9HSU5fQ0FQCi0jaW5jbHVkZSA8bG9naW5fY2FwLmg+Ci0jZW5kaWYKIAogdHlwZWRl ZgllbnVtIGVjb2RlIHsKIAllX25vbmUsIGVfbWludXRlLCBlX2hvdXIsIGVfZG9tLCBlX21vbnRo LCBlX2RvdywKLQllX2NtZCwgZV90aW1lc3BlYywgZV91c2VybmFtZSwgZV9ncm91cCwgZV9tZW0K LSNpZmRlZiBMT0dJTl9DQVAKLQksIGVfY2xhc3MKLSNlbmRpZgorCWVfY21kLCBlX3RpbWVzcGVj LCBlX3VzZXJuYW1lLCBlX29wdGlvbiwgZV9tZW1vcnkKIH0gZWNvZGVfZTsKIAotc3RhdGljIGNo YXIJZ2V0X2xpc3QoYml0c3RyX3QgKiwgaW50LCBpbnQsIGNoYXIgKltdLCBpbnQsIEZJTEUgKiks Ci0JCWdldF9yYW5nZShiaXRzdHJfdCAqLCBpbnQsIGludCwgY2hhciAqW10sIGludCwgRklMRSAq KSwKLQkJZ2V0X251bWJlcihpbnQgKiwgaW50LCBjaGFyICpbXSwgaW50LCBGSUxFICopOwotc3Rh dGljIGludAlzZXRfZWxlbWVudChiaXRzdHJfdCAqLCBpbnQsIGludCwgaW50KTsKLQotc3RhdGlj IGNoYXIgKmVjb2Rlc1tdID0KK3N0YXRpYyBjb25zdCBjaGFyICplY29kZXNbXSA9CiAJewogCQki bm8gZXJyb3IiLAogCQkiYmFkIG1pbnV0ZSIsCkBAIC01NywxOSArNDgsMTggQEAKIAkJImJhZCBj b21tYW5kIiwKIAkJImJhZCB0aW1lIHNwZWNpZmllciIsCiAJCSJiYWQgdXNlcm5hbWUiLAotCQki YmFkIGdyb3VwIG5hbWUiLAotCQkib3V0IG9mIG1lbW9yeSIsCi0jaWZkZWYgTE9HSU5fQ0FQCi0J CSJiYWQgY2xhc3MgbmFtZSIsCi0jZW5kaWYKKwkJImJhZCBvcHRpb24iLAorCQkib3V0IG9mIG1l bW9yeSIKIAl9OwogCitzdGF0aWMgaW50CWdldF9saXN0KGJpdHN0cl90ICosIGludCwgaW50LCBj b25zdCBjaGFyICpbXSwgaW50LCBGSUxFICopLAorCQlnZXRfcmFuZ2UoYml0c3RyX3QgKiwgaW50 LCBpbnQsIGNvbnN0IGNoYXIgKltdLCBpbnQsIEZJTEUgKiksCisJCWdldF9udW1iZXIoaW50ICos IGludCwgY29uc3QgY2hhciAqW10sIGludCwgRklMRSAqLCBjb25zdCBjaGFyICopLAorCQlzZXRf ZWxlbWVudChiaXRzdHJfdCAqLCBpbnQsIGludCwgaW50KTsKIAogdm9pZAotZnJlZV9lbnRyeShl KQotCWVudHJ5CSplOwotewotI2lmZGVmIExPR0lOX0NBUAorZnJlZV9lbnRyeShlbnRyeSAqZSkg eworIyBpZmRlZiBMT0dJTl9DQVAKIAlpZiAoZS0+Y2xhc3MgIT0gTlVMTCkKIAkJZnJlZShlLT5j bGFzcyk7CiAjZW5kaWYKQEAgLTgwLDIwICs3MCwxNCBAQAogCWZyZWUoZSk7CiB9CiAKLQogLyog cmV0dXJuIE5VTEwgaWYgZW9mIG9yIHN5bnRheCBlcnJvciBvY2N1cnM7CiAgKiBvdGhlcndpc2Ug cmV0dXJuIGEgcG9pbnRlciB0byBhIG5ldyBlbnRyeS4KICAqLwogZW50cnkgKgotbG9hZF9lbnRy eShmaWxlLCBlcnJvcl9mdW5jLCBwdywgZW52cCkKLQlGSUxFCQkqZmlsZTsKLQl2b2lkCQkoKmVy cm9yX2Z1bmMpKGNoYXIgKik7Ci0Jc3RydWN0IHBhc3N3ZAkqcHc7Ci0JY2hhcgkJKiplbnZwOwot eworbG9hZF9lbnRyeShGSUxFICpmaWxlLCB2b2lkICgqZXJyb3JfZnVuYykoKSwgc3RydWN0IHBh c3N3ZCAqcHcsIGNoYXIgKiplbnZwKSB7CiAJLyogdGhpcyBmdW5jdGlvbiByZWFkcyBvbmUgY3Jv bnRhYiBlbnRyeSAtLSB0aGUgbmV4dCAtLSBmcm9tIGEgZmlsZS4KIAkgKiBpdCBza2lwcyBhbnkg bGVhZGluZyBibGFuayBsaW5lcywgaWdub3JlcyBjb21tZW50cywgYW5kIHJldHVybnMKLQkgKiBF T0YgaWYgZm9yIGFueSByZWFzb24gdGhlIGVudHJ5IGNhbid0IGJlIHJlYWQgYW5kIHBhcnNlZC4K KwkgKiBOVUxMIGlmIGZvciBhbnkgcmVhc29uIHRoZSBlbnRyeSBjYW4ndCBiZSByZWFkIGFuZCBw YXJzZWQuCiAJICoKIAkgKiB0aGUgZW50cnkgaXMgYWxzbyBwYXJzZWQgaGVyZS4KIAkgKgpAQCAt MTA1LDExICs4OSwxMSBAQAogCSAqLwogCiAJZWNvZGVfZQllY29kZSA9IGVfbm9uZTsKLQllbnRy eQkqZTsKLQlpbnQJY2g7Ci0JY2hhcgljbWRbTUFYX0NPTU1BTkRdOwotCWNoYXIJZW52c3RyW01B WF9FTlZTVFJdOwotCWNoYXIJKipwcmV2X2VudjsKKwllbnRyeSAqZTsKKwlpbnQgY2g7CisJY2hh ciBjbWRbTUFYX0NPTU1BTkRdOworCWNoYXIgZW52c3RyW01BWF9FTlZTVFJdOworCWNoYXIgKip0 ZW52cDsKIAogCURlYnVnKERQQVJTLCAoImxvYWRfZW50cnkoKS4uLmFib3V0IHRvIGVhdCBjb21t ZW50c1xuIikpCiAKQEAgLTExNyw3ICsxMDEsNyBAQAogCiAJY2ggPSBnZXRfY2hhcihmaWxlKTsK IAlpZiAoY2ggPT0gRU9GKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIChOVUxMKTsKIAogCS8q IGNoIGlzIG5vdyB0aGUgZmlyc3QgdXNlZnVsIGNoYXJhY3RlciBvZiBhIHVzZWZ1bCBsaW5lLgog CSAqIGl0IG1heSBiZSBhbiBAc3BlY2lhbCBvciBpdCBtYXkgYmUgdGhlIGZpcnN0IGNoYXJhY3Rl cgpAQCAtMTI2LDExICsxMTAsNiBAQAogCiAJZSA9IChlbnRyeSAqKSBjYWxsb2Moc2l6ZW9mKGVu dHJ5KSwgc2l6ZW9mKGNoYXIpKTsKIAotCWlmIChlID09IE5VTEwpIHsKLQkJd2FybigibG9hZF9l bnRyeTogY2FsbG9jIGZhaWxlZCIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KIAlpZiAoY2ggPT0g J0AnKSB7CiAJCS8qIGFsbCBvZiB0aGVzZSBzaG91bGQgYmUgZmxhZ2dlZCBhbmQgbG9hZC1saW1p dGVkOyBpLmUuLAogCQkgKiBpbnN0ZWFkIG9mIEBob3VybHkgbWVhbmluZyAiMCAqICogKiAqIiBp dCBzaG91bGQgbWVhbgpAQCAtMTQ0LDE0ICsxMjMsMTAgQEAKIAkJICogYW55bW9yZS4gIHRvbyBt dWNoIGZvciBteSBvdmVybG9hZGVkIGJyYWluLiAodml4LCBqYW45MCkKIAkJICogSElOVAogCQkg Ki8KLQkJRGVidWcoRFBBUlMsICgibG9hZF9lbnRyeSgpLi4uYWJvdXQgdG8gdGVzdCBzaG9ydGN1 dHNcbiIpKQogCQljaCA9IGdldF9zdHJpbmcoY21kLCBNQVhfQ09NTUFORCwgZmlsZSwgIiBcdFxu Iik7CiAJCWlmICghc3RyY21wKCJyZWJvb3QiLCBjbWQpKSB7Ci0JCQlEZWJ1ZyhEUEFSUywgKCJs b2FkX2VudHJ5KCkuLi5yZWJvb3Qgc2hvcnRjdXRcbiIpKQogCQkJZS0+ZmxhZ3MgfD0gV0hFTl9S RUJPT1Q7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcCgieWVhcmx5IiwgY21kKSB8fCAhc3RyY21wKCJh bm51YWxseSIsIGNtZCkpewotCQkJRGVidWcoRFBBUlMsICgibG9hZF9lbnRyeSgpLi4ueWVhcmx5 IHNob3J0Y3V0XG4iKSkKLQkJCWJpdF9zZXQoZS0+c2Vjb25kLCAwKTsKIAkJCWJpdF9zZXQoZS0+ bWludXRlLCAwKTsKIAkJCWJpdF9zZXQoZS0+aG91ciwgMCk7CiAJCQliaXRfc2V0KGUtPmRvbSwg MCk7CkBAIC0xNTksOCArMTM0LDYgQEAKIAkJCWJpdF9uc2V0KGUtPmRvdywgMCwgKExBU1RfRE9X LUZJUlNUX0RPVysxKSk7CiAJCQllLT5mbGFncyB8PSBET1dfU1RBUjsKIAkJfSBlbHNlIGlmICgh c3RyY21wKCJtb250aGx5IiwgY21kKSkgewotCQkJRGVidWcoRFBBUlMsICgibG9hZF9lbnRyeSgp Li4ubW9udGhseSBzaG9ydGN1dFxuIikpCi0JCQliaXRfc2V0KGUtPnNlY29uZCwgMCk7CiAJCQli aXRfc2V0KGUtPm1pbnV0ZSwgMCk7CiAJCQliaXRfc2V0KGUtPmhvdXIsIDApOwogCQkJYml0X3Nl dChlLT5kb20sIDApOwpAQCAtMTY4LDQ3ICsxNDEsMzMgQEAKIAkJCWJpdF9uc2V0KGUtPmRvdywg MCwgKExBU1RfRE9XLUZJUlNUX0RPVysxKSk7CiAJCQllLT5mbGFncyB8PSBET1dfU1RBUjsKIAkJ fSBlbHNlIGlmICghc3RyY21wKCJ3ZWVrbHkiLCBjbWQpKSB7Ci0JCQlEZWJ1ZyhEUEFSUywgKCJs b2FkX2VudHJ5KCkuLi53ZWVrbHkgc2hvcnRjdXRcbiIpKQotCQkJYml0X3NldChlLT5zZWNvbmQs IDApOwogCQkJYml0X3NldChlLT5taW51dGUsIDApOwogCQkJYml0X3NldChlLT5ob3VyLCAwKTsK IAkJCWJpdF9uc2V0KGUtPmRvbSwgMCwgKExBU1RfRE9NLUZJUlNUX0RPTSsxKSk7Ci0JCQllLT5m bGFncyB8PSBET01fU1RBUjsKIAkJCWJpdF9uc2V0KGUtPm1vbnRoLCAwLCAoTEFTVF9NT05USC1G SVJTVF9NT05USCsxKSk7CiAJCQliaXRfc2V0KGUtPmRvdywgMCk7CisJCQllLT5mbGFncyB8PSBE T1dfU1RBUjsKIAkJfSBlbHNlIGlmICghc3RyY21wKCJkYWlseSIsIGNtZCkgfHwgIXN0cmNtcCgi bWlkbmlnaHQiLCBjbWQpKSB7Ci0JCQlEZWJ1ZyhEUEFSUywgKCJsb2FkX2VudHJ5KCkuLi5kYWls eSBzaG9ydGN1dFxuIikpCi0JCQliaXRfc2V0KGUtPnNlY29uZCwgMCk7CiAJCQliaXRfc2V0KGUt Pm1pbnV0ZSwgMCk7CiAJCQliaXRfc2V0KGUtPmhvdXIsIDApOwogCQkJYml0X25zZXQoZS0+ZG9t LCAwLCAoTEFTVF9ET00tRklSU1RfRE9NKzEpKTsKIAkJCWJpdF9uc2V0KGUtPm1vbnRoLCAwLCAo TEFTVF9NT05USC1GSVJTVF9NT05USCsxKSk7CiAJCQliaXRfbnNldChlLT5kb3csIDAsIChMQVNU X0RPVy1GSVJTVF9ET1crMSkpOwogCQl9IGVsc2UgaWYgKCFzdHJjbXAoImhvdXJseSIsIGNtZCkp IHsKLQkJCURlYnVnKERQQVJTLCAoImxvYWRfZW50cnkoKS4uLmhvdXJseSBzaG9ydGN1dFxuIikp Ci0JCQliaXRfc2V0KGUtPnNlY29uZCwgMCk7CiAJCQliaXRfc2V0KGUtPm1pbnV0ZSwgMCk7CiAJ CQliaXRfbnNldChlLT5ob3VyLCAwLCAoTEFTVF9IT1VSLUZJUlNUX0hPVVIrMSkpOwogCQkJYml0 X25zZXQoZS0+ZG9tLCAwLCAoTEFTVF9ET00tRklSU1RfRE9NKzEpKTsKIAkJCWJpdF9uc2V0KGUt Pm1vbnRoLCAwLCAoTEFTVF9NT05USC1GSVJTVF9NT05USCsxKSk7CiAJCQliaXRfbnNldChlLT5k b3csIDAsIChMQVNUX0RPVy1GSVJTVF9ET1crMSkpOworCQkJZS0+ZmxhZ3MgfD0gSFJfU1RBUjsK IAkJfSBlbHNlIGlmICghc3RyY21wKCJldmVyeV9taW51dGUiLCBjbWQpKSB7CiAJCQlEZWJ1ZyhE UEFSUywgKCJsb2FkX2VudHJ5KCkuLi5ldmVyeV9taW51dGUgc2hvcnRjdXRcbiIpKQotCQkJYml0 X3NldChlLT5zZWNvbmQsIDApOwotCQkJYml0X25zZXQoZS0+bWludXRlLCAwLCAoTEFTVF9NSU5V VEUtRklSU1RfTUlOVVRFKzEpKTsKLQkJCWJpdF9uc2V0KGUtPmhvdXIsIDAsIChMQVNUX0hPVVIt RklSU1RfSE9VUisxKSk7Ci0JCQliaXRfbnNldChlLT5kb20sIDAsIChMQVNUX0RPTS1GSVJTVF9E T00rMSkpOwotCQkJYml0X25zZXQoZS0+bW9udGgsIDAsIChMQVNUX01PTlRILUZJUlNUX01PTlRI KzEpKTsKLQkJCWJpdF9uc2V0KGUtPmRvdywgMCwgKExBU1RfRE9XLUZJUlNUX0RPVysxKSk7Ci0J CX0gZWxzZSBpZiAoIXN0cmNtcCgiZXZlcnlfc2Vjb25kIiwgY21kKSkgewotCQkJRGVidWcoRFBB UlMsICgibG9hZF9lbnRyeSgpLi4uZXZlcnlfc2Vjb25kIHNob3J0Y3V0XG4iKSkKLQkJCWUtPmZs YWdzIHw9IFNFQ19SRVM7Ci0JCQliaXRfbnNldChlLT5zZWNvbmQsIDAsIChMQVNUX1NFQ09ORC1G SVJTVF9TRUNPTkQrMSkpOwotCQkJYml0X25zZXQoZS0+bWludXRlLCAwLCAoTEFTVF9NSU5VVEUt RklSU1RfTUlOVVRFKzEpKTsKLQkJCWJpdF9uc2V0KGUtPmhvdXIsIDAsIChMQVNUX0hPVVItRklS U1RfSE9VUisxKSk7Ci0JCQliaXRfbnNldChlLT5kb20sIDAsIChMQVNUX0RPTS1GSVJTVF9ET00r MSkpOwotCQkJYml0X25zZXQoZS0+bW9udGgsIDAsIChMQVNUX01PTlRILUZJUlNUX01PTlRIKzEp KTsKLQkJCWJpdF9uc2V0KGUtPmRvdywgMCwgKExBU1RfRE9XLUZJUlNUX0RPVysxKSk7CisgICAg ICAgICAgICAgICAgICAgICAgICBiaXRfc2V0KGUtPnNlY29uZCwgMCk7CisgICAgICAgICAgICAg ICAgICAgICAgICBiaXRfbnNldChlLT5taW51dGUsIDAsIChMQVNUX01JTlVURS1GSVJTVF9NSU5V VEUrMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYml0X25zZXQoZS0+aG91ciwgMCwgKExB U1RfSE9VUi1GSVJTVF9IT1VSKzEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdF9uc2V0 KGUtPmRvbSwgMCwgKExBU1RfRE9NLUZJUlNUX0RPTSsxKSk7CisgICAgICAgICAgICAgICAgICAg ICAgICBiaXRfbnNldChlLT5tb250aCwgMCwgKExBU1RfTU9OVEgtRklSU1RfTU9OVEgrMSkpOwor ICAgICAgICAgICAgICAgICAgICAgICAgYml0X25zZXQoZS0+ZG93LCAwLCAoTEFTVF9ET1ctRklS U1RfRE9XKzEpKTsKIAkJfSBlbHNlIHsKIAkJCWVjb2RlID0gZV90aW1lc3BlYzsKIAkJCWdvdG8g ZW9mOwpAQCAtMjE3LDE0ICsxNzYsMTUgQEAKIAkJICogdXNlcm5hbWUvY29tbWFuZC4KIAkJICov CiAJCVNraXBfQmxhbmtzKGNoLCBmaWxlKTsKLQkJaWYgKGNoID09IEVPRikgeworCQlpZiAoY2gg PT0gRU9GIHx8IGNoID09ICdcbicpIHsKIAkJCWVjb2RlID0gZV9jbWQ7CiAJCQlnb3RvIGVvZjsK IAkJfQogCX0gZWxzZSB7CiAJCURlYnVnKERQQVJTLCAoImxvYWRfZW50cnkoKS4uLmFib3V0IHRv IHBhcnNlIG51bWVyaWNzXG4iKSkKLQkJYml0X3NldChlLT5zZWNvbmQsIDApOwogCisJCWlmIChj aCA9PSAnKicpCisJCQllLT5mbGFncyB8PSBNSU5fU1RBUjsKIAkJY2ggPSBnZXRfbGlzdChlLT5t aW51dGUsIEZJUlNUX01JTlVURSwgTEFTVF9NSU5VVEUsCiAJCQkgICAgICBQUENfTlVMTCwgY2gs IGZpbGUpOwogCQlpZiAoY2ggPT0gRU9GKSB7CkBAIC0yMzUsNiArMTk1LDggQEAKIAkJLyogaG91 cnMKIAkJICovCiAKKwkJaWYgKGNoID09ICcqJykKKwkJCWUtPmZsYWdzIHw9IEhSX1NUQVI7CiAJ CWNoID0gZ2V0X2xpc3QoZS0+aG91ciwgRklSU1RfSE9VUiwgTEFTVF9IT1VSLAogCQkJICAgICAg UFBDX05VTEwsIGNoLCBmaWxlKTsKIAkJaWYgKGNoID09IEVPRikgewpAQCAtMjgzLDE0OSArMjQ1 LDEzOCBAQAogCQliaXRfc2V0KGUtPmRvdywgNyk7CiAJfQogCisJLyogY2hlY2sgZm9yIHBlcm1h dHVyZSBFT0wgYW5kIGNhdGNoIGEgY29tbW9uIHR5cG8gKi8KKwlpZiAoY2ggPT0gJ1xuJyB8fCBj aCA9PSAnKicpIHsKKwkJZWNvZGUgPSBlX2NtZDsKKwkJZ290byBlb2Y7CisJfQorCiAJLyogY2gg aXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIGNvbW1hbmQsIG9yIGEgdXNlcm5hbWUgKi8KIAl1 bmdldF9jaGFyKGNoLCBmaWxlKTsKIAogCWlmICghcHcpIHsKIAkJY2hhcgkJKnVzZXJuYW1lID0g Y21kOwkvKiB0ZW1wIGJ1ZmZlciAqLwotCQljaGFyICAgICAgICAgICAgKnM7Ci0JCXN0cnVjdCBn cm91cCAgICAqZ3JwOwotI2lmZGVmIExPR0lOX0NBUAotCQlsb2dpbl9jYXBfdCAqbGM7Ci0jZW5k aWYKIAogCQlEZWJ1ZyhEUEFSUywgKCJsb2FkX2VudHJ5KCkuLi5hYm91dCB0byBwYXJzZSB1c2Vy bmFtZVxuIikpCi0JCWNoID0gZ2V0X3N0cmluZyh1c2VybmFtZSwgTUFYX0NPTU1BTkQsIGZpbGUs ICIgXHQiKTsKKwkJY2ggPSBnZXRfc3RyaW5nKHVzZXJuYW1lLCBNQVhfQ09NTUFORCwgZmlsZSwg IiBcdFxuIik7CiAKIAkJRGVidWcoRFBBUlMsICgibG9hZF9lbnRyeSgpLi4uZ290ICVzXG4iLHVz ZXJuYW1lKSkKLQkJaWYgKGNoID09IEVPRikgeworCQlpZiAoY2ggPT0gRU9GIHx8IGNoID09ICdc bicgfHwgY2ggPT0gJyonKSB7CiAJCQllY29kZSA9IGVfY21kOwogCQkJZ290byBlb2Y7CiAJCX0K IAotI2lmZGVmIExPR0lOX0NBUAotCQlpZiAoKHMgPSBzdHJyY2hyKHVzZXJuYW1lLCAnLycpKSAh PSBOVUxMKSB7Ci0JCQkqcyA9ICdcMCc7Ci0JCQllLT5jbGFzcyA9IHN0cmR1cChzICsgMSk7Ci0J CQlpZiAoZS0+Y2xhc3MgPT0gTlVMTCkKLQkJCQl3YXJuKCJzdHJkdXAoXCIlc1wiKSIsIHMgKyAx KTsKLQkJfSBlbHNlIHsKLQkJCWUtPmNsYXNzID0gc3RyZHVwKFJFU09VUkNFX1JDKTsKLQkJCWlm IChlLT5jbGFzcyA9PSBOVUxMKQotCQkJCXdhcm4oInN0cmR1cChcIiVzXCIpIiwgUkVTT1VSQ0Vf UkMpOwotCQl9Ci0JCWlmIChlLT5jbGFzcyA9PSBOVUxMKSB7Ci0JCQllY29kZSA9IGVfbWVtOwot CQkJZ290byBlb2Y7Ci0JCX0KLQkJaWYgKChsYyA9IGxvZ2luX2dldGNsYXNzKGUtPmNsYXNzKSkg PT0gTlVMTCkgewotCQkJZWNvZGUgPSBlX2NsYXNzOwotCQkJZ290byBlb2Y7Ci0JCX0KLQkJbG9n aW5fY2xvc2UobGMpOwotI2VuZGlmCi0JCWdycCA9IE5VTEw7Ci0JCWlmICgocyA9IHN0cnJjaHIo dXNlcm5hbWUsICc6JykpICE9IE5VTEwpIHsKLQkJCSpzID0gJ1wwJzsKLQkJCWlmICgoZ3JwID0g Z2V0Z3JuYW0ocyArIDEpKSA9PSBOVUxMKSB7Ci0JCQkJZWNvZGUgPSBlX2dyb3VwOwotCQkJCWdv dG8gZW9mOwotCQkJfQotCQl9Ci0KIAkJcHcgPSBnZXRwd25hbSh1c2VybmFtZSk7CiAJCWlmIChw dyA9PSBOVUxMKSB7CiAJCQllY29kZSA9IGVfdXNlcm5hbWU7CiAJCQlnb3RvIGVvZjsKIAkJfQot CQlpZiAoZ3JwICE9IE5VTEwpCi0JCQlwdy0+cHdfZ2lkID0gZ3JwLT5ncl9naWQ7Ci0JCURlYnVn KERQQVJTLCAoImxvYWRfZW50cnkoKS4uLnVpZCAlZCwgZ2lkICVkXG4iLHB3LT5wd191aWQscHct PnB3X2dpZCkpCi0jaWZkZWYgTE9HSU5fQ0FQCi0JCURlYnVnKERQQVJTLCAoImxvYWRfZW50cnko KS4uLmNsYXNzICVzXG4iLGUtPmNsYXNzKSkKKwkJRGVidWcoRFBBUlMsICgibG9hZF9lbnRyeSgp Li4udWlkICVsZCwgZ2lkICVsZFxuIiwKKwkJCSAgICAgIChsb25nKXB3LT5wd191aWQsIChsb25n KXB3LT5wd19naWQpKQorIyBpZmRlZiBMT0dJTl9DQVAKKwkJRGVidWcoRFBBUlMsICgibG9hZF9l bnRyeSgpLi4uY2xhc3MgJXNcbiIsIGUtPmNsYXNzKSkKICNlbmRpZgogCX0KIAotI2lmbmRlZiBQ QU0JLyogUEFNIHRha2VzIGNhcmUgb2YgYWNjb3VudCBleHBpcmF0aW9uIGJ5IGl0c2VsZiAqLwot CWlmIChwdy0+cHdfZXhwaXJlICYmIHRpbWUoTlVMTCkgPj0gcHctPnB3X2V4cGlyZSkgeworI2lm bmRlZiBQQU0KKwlpZiAocG0tPnB3X2V4cGlyZSAmJiB0aW1lKE5VTEwpID49IHB3LT5wd19leHBp cmUpIHsKIAkJZWNvZGUgPSBlX3VzZXJuYW1lOwogCQlnb3RvIGVvZjsKIAl9Ci0jZW5kaWYgLyog IVBBTSAqLwotCisjZW5kaWYKIAllLT51aWQgPSBwdy0+cHdfdWlkOwogCWUtPmdpZCA9IHB3LT5w d19naWQ7CiAKIAkvKiBjb3B5IGFuZCBmaXggdXAgZW52aXJvbm1lbnQuICBzb21lIHZhcmlhYmxl cyBhcmUganVzdCBkZWZhdWx0cyBhbmQKIAkgKiBvdGhlcnMgYXJlIG92ZXJyaWRlcy4KIAkgKi8K LQllLT5lbnZwID0gZW52X2NvcHkoZW52cCk7Ci0JaWYgKGUtPmVudnAgPT0gTlVMTCkgewotCQl3 YXJuKCJlbnZfY29weSIpOwotCQllY29kZSA9IGVfbWVtOworCWlmICgoZS0+ZW52cCA9IGVudl9j b3B5KGVudnApKSA9PSBOVUxMKSB7CisJCWVjb2RlID0gZV9tZW1vcnk7CiAJCWdvdG8gZW9mOwog CX0KIAlpZiAoIWVudl9nZXQoIlNIRUxMIiwgZS0+ZW52cCkpIHsKLQkJcHJldl9lbnYgPSBlLT5l bnZwOwotCQlzcHJpbnRmKGVudnN0ciwgIlNIRUxMPSVzIiwgX1BBVEhfQlNIRUxMKTsKLQkJZS0+ ZW52cCA9IGVudl9zZXQoZS0+ZW52cCwgZW52c3RyKTsKLQkJaWYgKGUtPmVudnAgPT0gTlVMTCkg ewotCQkJd2FybigiZW52X3NldCglcykiLCBlbnZzdHIpOwotCQkJZW52X2ZyZWUocHJldl9lbnYp OwotCQkJZWNvZGUgPSBlX21lbTsKLQkJCWdvdG8gZW9mOwotCQl9CisJCWlmIChnbHVlX3N0cmlu Z3MoZW52c3RyLCBzaXplb2YgZW52c3RyLCAiU0hFTEwiLAorCQkJCSBfUEFUSF9CU0hFTEwsICc9 JykpIHsKKwkJCWlmICgodGVudnAgPSBlbnZfc2V0KGUtPmVudnAsIGVudnN0cikpID09IE5VTEwp IHsKKwkJCQllY29kZSA9IGVfbWVtb3J5OworCQkJCWdvdG8gZW9mOworCQkJfQorCQkJZS0+ZW52 cCA9IHRlbnZwOworCQl9IGVsc2UKKwkJCWxvZ19pdCgiQ1JPTiIsIGdldHBpZCgpLCAiZXJyb3Ii LCAiY2FuJ3Qgc2V0IFNIRUxMIik7CiAJfQogCWlmICghZW52X2dldCgiSE9NRSIsIGUtPmVudnAp KSB7Ci0JCXByZXZfZW52ID0gZS0+ZW52cDsKLQkJc3ByaW50ZihlbnZzdHIsICJIT01FPSVzIiwg cHctPnB3X2Rpcik7Ci0JCWUtPmVudnAgPSBlbnZfc2V0KGUtPmVudnAsIGVudnN0cik7Ci0JCWlm IChlLT5lbnZwID09IE5VTEwpIHsKLQkJCXdhcm4oImVudl9zZXQoJXMpIiwgZW52c3RyKTsKLQkJ CWVudl9mcmVlKHByZXZfZW52KTsKLQkJCWVjb2RlID0gZV9tZW07Ci0JCQlnb3RvIGVvZjsKLQkJ fQorCQlpZiAoZ2x1ZV9zdHJpbmdzKGVudnN0ciwgc2l6ZW9mIGVudnN0ciwgIkhPTUUiLAorCQkJ CSBwdy0+cHdfZGlyLCAnPScpKSB7CisJCQlpZiAoKHRlbnZwID0gZW52X3NldChlLT5lbnZwLCBl bnZzdHIpKSA9PSBOVUxMKSB7CisJCQkJZWNvZGUgPSBlX21lbW9yeTsKKwkJCQlnb3RvIGVvZjsK KwkJCX0KKwkJCWUtPmVudnAgPSB0ZW52cDsKKwkJfSBlbHNlCisJCQlsb2dfaXQoIkNST04iLCBn ZXRwaWQoKSwgImVycm9yIiwgImNhbid0IHNldCBIT01FIik7CiAJfQorI2lmbmRlZiBMT0dJTl9D QVAKKwkvKiBJZiBsb2dpbi5jb25mIGlzIGluIHVzZWQgd2Ugd2lsbCBnZXQgdGhlIGRlZmF1bHQg UEFUSCBsYXRlci4gKi8KIAlpZiAoIWVudl9nZXQoIlBBVEgiLCBlLT5lbnZwKSkgewotCQlwcmV2 X2VudiA9IGUtPmVudnA7Ci0JCXNwcmludGYoZW52c3RyLCAiUEFUSD0lcyIsIF9QQVRIX0RFRlBB VEgpOwotCQllLT5lbnZwID0gZW52X3NldChlLT5lbnZwLCBlbnZzdHIpOwotCQlpZiAoZS0+ZW52 cCA9PSBOVUxMKSB7Ci0JCQl3YXJuKCJlbnZfc2V0KCVzKSIsIGVudnN0cik7Ci0JCQllbnZfZnJl ZShwcmV2X2Vudik7Ci0JCQllY29kZSA9IGVfbWVtOwotCQkJZ290byBlb2Y7Ci0JCX0KLQl9Ci0J cHJldl9lbnYgPSBlLT5lbnZwOwotCXNwcmludGYoZW52c3RyLCAiJXM9JXMiLCAiTE9HTkFNRSIs IHB3LT5wd19uYW1lKTsKLQllLT5lbnZwID0gZW52X3NldChlLT5lbnZwLCBlbnZzdHIpOwotCWlm IChlLT5lbnZwID09IE5VTEwpIHsKLQkJd2FybigiZW52X3NldCglcykiLCBlbnZzdHIpOwotCQll bnZfZnJlZShwcmV2X2Vudik7Ci0JCWVjb2RlID0gZV9tZW07Ci0JCWdvdG8gZW9mOwotCX0KLSNp ZiBkZWZpbmVkKEJTRCkKLQlwcmV2X2VudiA9IGUtPmVudnA7Ci0Jc3ByaW50ZihlbnZzdHIsICIl cz0lcyIsICJVU0VSIiwgcHctPnB3X25hbWUpOwotCWUtPmVudnAgPSBlbnZfc2V0KGUtPmVudnAs IGVudnN0cik7Ci0JaWYgKGUtPmVudnAgPT0gTlVMTCkgewotCQl3YXJuKCJlbnZfc2V0KCVzKSIs IGVudnN0cik7Ci0JCWVudl9mcmVlKHByZXZfZW52KTsKLQkJZWNvZGUgPSBlX21lbTsKLQkJZ290 byBlb2Y7Ci0JfQorCQlpZiAoZ2x1ZV9zdHJpbmdzKGVudnN0ciwgc2l6ZW9mIGVudnN0ciwgIlBB VEgiLAorCQkJCSBfUEFUSF9ERUZQQVRILCAnPScpKSB7CisJCQlpZiAoKHRlbnZwID0gZW52X3Nl dChlLT5lbnZwLCBlbnZzdHIpKSA9PSBOVUxMKSB7CisJCQkJZWNvZGUgPSBlX21lbW9yeTsKKwkJ CQlnb3RvIGVvZjsKKwkJCX0KKwkJCWUtPmVudnAgPSB0ZW52cDsKKwkJfSBlbHNlCisJCQlsb2df aXQoIkNST04iLCBnZXRwaWQoKSwgImVycm9yIiwgImNhbid0IHNldCBQQVRIIik7CisJfQorI2Vu ZGlmIC8qIExPR0lOX0NBUCAqLworCWlmIChnbHVlX3N0cmluZ3MoZW52c3RyLCBzaXplb2YgZW52 c3RyLCAiTE9HTkFNRSIsCisJCQkgcHctPnB3X25hbWUsICc9JykpIHsKKwkJaWYgKCh0ZW52cCA9 IGVudl9zZXQoZS0+ZW52cCwgZW52c3RyKSkgPT0gTlVMTCkgeworCQkJZWNvZGUgPSBlX21lbW9y eTsKKwkJCWdvdG8gZW9mOworCQl9CisJCWUtPmVudnAgPSB0ZW52cDsKKwl9IGVsc2UKKwkJbG9n X2l0KCJDUk9OIiwgZ2V0cGlkKCksICJlcnJvciIsICJjYW4ndCBzZXQgTE9HTkFNRSIpOworI2lm IGRlZmluZWQoQlNEKSB8fCBkZWZpbmVkKF9fbGludXgpCisJaWYgKGdsdWVfc3RyaW5ncyhlbnZz dHIsIHNpemVvZiBlbnZzdHIsICJVU0VSIiwKKwkJCSBwdy0+cHdfbmFtZSwgJz0nKSkgeworCQlp ZiAoKHRlbnZwID0gZW52X3NldChlLT5lbnZwLCBlbnZzdHIpKSA9PSBOVUxMKSB7CisJCQllY29k ZSA9IGVfbWVtb3J5OworCQkJZ290byBlb2Y7CisJCX0KKwkJZS0+ZW52cCA9IHRlbnZwOworCX0g ZWxzZQorCQlsb2dfaXQoIkNST04iLCBnZXRwaWQoKSwgImVycm9yIiwgImNhbid0IHNldCBVU0VS Iik7CiAjZW5kaWYKIAogCURlYnVnKERQQVJTLCAoImxvYWRfZW50cnkoKS4uLmFib3V0IHRvIHBh cnNlIGNvbW1hbmRcbiIpKQogCisJLyogSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgY29t bWFuZCBpcyAnLScgaXQgaXMgYSBjcm9uIG9wdGlvbi4KKwkgKi8KKwl3aGlsZSAoKGNoID0gZ2V0 X2NoYXIoZmlsZSkpID09ICctJykgeworCQlzd2l0Y2ggKGNoID0gZ2V0X2NoYXIoZmlsZSkpIHsK KwkJY2FzZSAncSc6CisJCQllLT5mbGFncyB8PSBET05UX0xPRzsKKwkJCVNraXBfTm9uYmxhbmtz KGNoLCBmaWxlKQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllY29kZSA9IGVfb3B0aW9uOwor CQkJZ290byBlb2Y7CisJCX0KKwkJU2tpcF9CbGFua3MoY2gsIGZpbGUpCisJCWlmIChjaCA9PSBF T0YgfHwgY2ggPT0gJ1xuJykgeworCQkJZWNvZGUgPSBlX2NtZDsKKwkJCWdvdG8gZW9mOworCQl9 CisJfQorCXVuZ2V0X2NoYXIoY2gsIGZpbGUpOworCiAJLyogRXZlcnl0aGluZyB1cCB0byB0aGUg bmV4dCBcbiBvciBFT0YgaXMgcGFydCBvZiB0aGUgY29tbWFuZC4uLgogCSAqIHRvbyBiYWQgd2Ug ZG9uJ3Qga25vdyBpbiBhZHZhbmNlIGhvdyBsb25nIGl0IHdpbGwgYmUsIHNpbmNlIHdlCiAJICog bmVlZCB0byBtYWxsb2MgYSBzdHJpbmcgZm9yIGl0Li4uIHNvLCB3ZSBsaW1pdCBpdCB0byBNQVhf Q09NTUFORC4KLQkgKiBYWFggLSBzaG91bGQgdXNlIHJlYWxsb2MoKS4KLQkgKi8KKwkgKi8gCiAJ Y2ggPSBnZXRfc3RyaW5nKGNtZCwgTUFYX0NPTU1BTkQsIGZpbGUsICJcbiIpOwogCiAJLyogYSBm aWxlIHdpdGhvdXQgYSBcbiBiZWZvcmUgdGhlIEVPRiBpcyBydWRlLCBzbyB3ZSdsbCBjb21wbGFp bi4uLgpAQCAtNDM3LDM3ICszODgsMzUgQEAKIAogCS8qIGdvdCB0aGUgY29tbWFuZCBpbiB0aGUg J2NtZCcgc3RyaW5nOyBzYXZlIGl0IGluICplLgogCSAqLwotCWUtPmNtZCA9IHN0cmR1cChjbWQp OwotCWlmIChlLT5jbWQgPT0gTlVMTCkgewotCQl3YXJuKCJzdHJkdXAoXCIlc1wiKSIsIGNtZCk7 Ci0JCWVjb2RlID0gZV9tZW07CisJaWYgKChlLT5jbWQgPSBzdHJkdXAoY21kKSkgPT0gTlVMTCkg eworCQllY29kZSA9IGVfbWVtb3J5OwogCQlnb3RvIGVvZjsKIAl9CisKIAlEZWJ1ZyhEUEFSUywg KCJsb2FkX2VudHJ5KCkuLi5yZXR1cm5pbmcgc3VjY2Vzc2Z1bGx5XG4iKSkKIAogCS8qIHN1Y2Nl c3MsIGZpbmksIHJldHVybiBwb2ludGVyIHRvIHRoZSBlbnRyeSB3ZSBqdXN0IGNyZWF0ZWQuLi4K IAkgKi8KLQlyZXR1cm4gZTsKKwlyZXR1cm4gKGUpOwogCiAgZW9mOgotCWZyZWVfZW50cnkoZSk7 CisJaWYgKGUtPmVudnApCisJCWVudl9mcmVlKGUtPmVudnApOworCWlmIChlLT5jbWQpCisJCWZy ZWUoZS0+Y21kKTsKKwlmcmVlKGUpOworCXdoaWxlIChjaCAhPSAnXG4nICYmICFmZW9mKGZpbGUp KQorCQljaCA9IGdldF9jaGFyKGZpbGUpOwogCWlmIChlY29kZSAhPSBlX25vbmUgJiYgZXJyb3Jf ZnVuYykKIAkJKCplcnJvcl9mdW5jKShlY29kZXNbKGludCllY29kZV0pOwotCXdoaWxlIChjaCAh PSBFT0YgJiYgY2ggIT0gJ1xuJykKLQkJY2ggPSBnZXRfY2hhcihmaWxlKTsKLQlyZXR1cm4gTlVM TDsKKwlyZXR1cm4gKE5VTEwpOwogfQogCi0KLXN0YXRpYyBjaGFyCi1nZXRfbGlzdChiaXRzLCBs b3csIGhpZ2gsIG5hbWVzLCBjaCwgZmlsZSkKLQliaXRzdHJfdAkqYml0czsJCS8qIG9uZSBiaXQg cGVyIGZsYWcsIGRlZmF1bHQ9RkFMU0UgKi8KLQlpbnQJCWxvdywgaGlnaDsJLyogYm91bmRzLCBp bXBsLiBvZmZzZXQgZm9yIGJpdHN0ciAqLwotCWNoYXIJCSpuYW1lc1tdOwkvKiBOVUxMIG9yICpb XSBvZiBuYW1lcyBmb3IgdGhlc2UgZWxlbWVudHMgKi8KLQlpbnQJCWNoOwkJLyogY3VycmVudCBj aGFyYWN0ZXIgYmVpbmcgcHJvY2Vzc2VkICovCi0JRklMRQkJKmZpbGU7CQkvKiBmaWxlIGJlaW5n IHJlYWQgKi8KK3N0YXRpYyBpbnQKK2dldF9saXN0KGJpdHN0cl90ICpiaXRzLCBpbnQgbG93LCBp bnQgaGlnaCwgY29uc3QgY2hhciAqbmFtZXNbXSwKKwkgaW50IGNoLCBGSUxFICpmaWxlKQogewot CXJlZ2lzdGVyIGludAlkb25lOworCWludCBkb25lOwogCiAJLyogd2Uga25vdyB0aGF0IHdlIHBv aW50IHRvIGEgbm9uLWJsYW5rIGNoYXJhY3RlciBoZXJlOwogCSAqIG11c3QgZG8gYSBTa2lwX0Js YW5rcyBiZWZvcmUgd2UgZXhpdCwgc28gdGhhdCB0aGUKQEAgLTQ3OSw3ICs0MjgsNyBAQAogCiAJ LyogbGlzdCA9IHJhbmdlIHsiLCIgcmFuZ2V9CiAJICovCi0KKwkKIAkvKiBjbGVhciB0aGUgYml0 IHN0cmluZywgc2luY2UgdGhlIGRlZmF1bHQgaXMgJ29mZicuCiAJICovCiAJYml0X25jbGVhcihi aXRzLCAwLCAoaGlnaC1sb3crMSkpOwpAQCAtNDg4LDcgKzQzNyw4IEBACiAJICovCiAJZG9uZSA9 IEZBTFNFOwogCXdoaWxlICghZG9uZSkgewotCQljaCA9IGdldF9yYW5nZShiaXRzLCBsb3csIGhp Z2gsIG5hbWVzLCBjaCwgZmlsZSk7CisJCWlmIChFT0YgPT0gKGNoID0gZ2V0X3JhbmdlKGJpdHMs IGxvdywgaGlnaCwgbmFtZXMsIGNoLCBmaWxlKSkpCisJCQlyZXR1cm4gKEVPRik7CiAJCWlmIChj aCA9PSAnLCcpCiAJCQljaCA9IGdldF9jaGFyKGZpbGUpOwogCQllbHNlCkBAIC01MDIsMjMgKzQ1 MiwxOCBAQAogCiAJRGVidWcoRFBBUlN8REVYVCwgKCJnZXRfbGlzdCgpLi4uZXhpdGluZyB3LyAl MDJ4XG4iLCBjaCkpCiAKLQlyZXR1cm4gY2g7CisJcmV0dXJuIChjaCk7CiB9CiAKIAotc3RhdGlj IGNoYXIKLWdldF9yYW5nZShiaXRzLCBsb3csIGhpZ2gsIG5hbWVzLCBjaCwgZmlsZSkKLQliaXRz dHJfdAkqYml0czsJCS8qIG9uZSBiaXQgcGVyIGZsYWcsIGRlZmF1bHQ9RkFMU0UgKi8KLQlpbnQJ CWxvdywgaGlnaDsJLyogYm91bmRzLCBpbXBsLiBvZmZzZXQgZm9yIGJpdHN0ciAqLwotCWNoYXIJ CSpuYW1lc1tdOwkvKiBOVUxMIG9yIG5hbWVzIG9mIGVsZW1lbnRzICovCi0JaW50CQljaDsJCS8q IGN1cnJlbnQgY2hhcmFjdGVyIGJlaW5nIHByb2Nlc3NlZCAqLwotCUZJTEUJCSpmaWxlOwkJLyog ZmlsZSBiZWluZyByZWFkICovCitzdGF0aWMgaW50CitnZXRfcmFuZ2UoYml0c3RyX3QgKmJpdHMs IGludCBsb3csIGludCBoaWdoLCBjb25zdCBjaGFyICpuYW1lc1tdLAorCSAgaW50IGNoLCBGSUxF ICpmaWxlKQogewogCS8qIHJhbmdlID0gbnVtYmVyIHwgbnVtYmVyICItIiBudW1iZXIgWyAiLyIg bnVtYmVyIF0KIAkgKi8KIAotCXJlZ2lzdGVyIGludAlpOwotCWF1dG8gaW50CW51bTEsIG51bTIs IG51bTM7CisJaW50IGksIG51bTEsIG51bTIsIG51bTM7CiAKIAlEZWJ1ZyhEUEFSU3xERVhULCAo ImdldF9yYW5nZSgpLi4uZW50ZXJpbmcsIGV4aXQgd29uJ3Qgc2hvd1xuIikpCiAKQEAgLTUyOSwz MSArNDc0LDMyIEBACiAJCW51bTIgPSBoaWdoOwogCQljaCA9IGdldF9jaGFyKGZpbGUpOwogCQlp ZiAoY2ggPT0gRU9GKQotCQkJcmV0dXJuIEVPRjsKKwkJCXJldHVybiAoRU9GKTsKIAl9IGVsc2Ug ewotCQlpZiAoRU9GID09IChjaCA9IGdldF9udW1iZXIoJm51bTEsIGxvdywgbmFtZXMsIGNoLCBm aWxlKSkpCi0JCQlyZXR1cm4gRU9GOworCQljaCA9IGdldF9udW1iZXIoJm51bTEsIGxvdywgbmFt ZXMsIGNoLCBmaWxlLCAiLC0gXHRcbiIpOworCQlpZiAoY2ggPT0gRU9GKQorCQkJcmV0dXJuIChF T0YpOwogCi0JCWlmIChjaCA9PSAnLycpCi0JCQludW0yID0gaGlnaDsKLQkJZWxzZSBpZiAoY2gg IT0gJy0nKSB7CisJCWlmIChjaCAhPSAnLScpIHsKIAkJCS8qIG5vdCBhIHJhbmdlLCBpdCdzIGEg c2luZ2xlIG51bWJlci4KIAkJCSAqLwotCQkJaWYgKEVPRiA9PSBzZXRfZWxlbWVudChiaXRzLCBs b3csIGhpZ2gsIG51bTEpKQotCQkJCXJldHVybiBFT0Y7Ci0JCQlyZXR1cm4gY2g7CisJCQlpZiAo RU9GID09IHNldF9lbGVtZW50KGJpdHMsIGxvdywgaGlnaCwgbnVtMSkpIHsKKwkJCQl1bmdldF9j aGFyKGNoLCBmaWxlKTsKKwkJCQlyZXR1cm4gKEVPRik7CisJCQl9CisJCQlyZXR1cm4gKGNoKTsK IAkJfSBlbHNlIHsKIAkJCS8qIGVhdCB0aGUgZGFzaAogCQkJICovCiAJCQljaCA9IGdldF9jaGFy KGZpbGUpOwogCQkJaWYgKGNoID09IEVPRikKLQkJCQlyZXR1cm4gRU9GOworCQkJCXJldHVybiAo RU9GKTsKIAogCQkJLyogZ2V0IHRoZSBudW1iZXIgZm9sbG93aW5nIHRoZSBkYXNoCiAJCQkgKi8K LQkJCWNoID0gZ2V0X251bWJlcigmbnVtMiwgbG93LCBuYW1lcywgY2gsIGZpbGUpOwotCQkJaWYg KGNoID09IEVPRikKLQkJCQlyZXR1cm4gRU9GOworCQkJY2ggPSBnZXRfbnVtYmVyKCZudW0yLCBs b3csIG5hbWVzLCBjaCwgZmlsZSwgIi8sIFx0XG4iKTsKKwkJCWlmIChjaCA9PSBFT0YgfHwgbnVt MSA+IG51bTIpCisJCQkJcmV0dXJuIChFT0YpOwogCQl9CiAJfQogCkBAIC01NjQsMTYgKzUxMCwx NiBAQAogCQkgKi8KIAkJY2ggPSBnZXRfY2hhcihmaWxlKTsKIAkJaWYgKGNoID09IEVPRikKLQkJ CXJldHVybiBFT0Y7CisJCQlyZXR1cm4gKEVPRik7CiAKIAkJLyogZ2V0IHRoZSBzdGVwIHNpemUg LS0gbm90ZTogd2UgZG9uJ3QgcGFzcyB0aGUKIAkJICogbmFtZXMgaGVyZSwgYmVjYXVzZSB0aGUg bnVtYmVyIGlzIG5vdCBhbgogCQkgKiBlbGVtZW50IGlkLCBpdCdzIGEgc3RlcCBzaXplLiAgJ2xv dycgaXMKIAkJICogc2VudCBhcyBhIDAgc2luY2UgdGhlcmUgaXMgbm8gb2Zmc2V0IGVpdGhlci4K IAkJICovCi0JCWNoID0gZ2V0X251bWJlcigmbnVtMywgMCwgUFBDX05VTEwsIGNoLCBmaWxlKTsK KwkJY2ggPSBnZXRfbnVtYmVyKCZudW0zLCAwLCBQUENfTlVMTCwgY2gsIGZpbGUsICIsIFx0XG4i KTsKIAkJaWYgKGNoID09IEVPRiB8fCBudW0zID09IDApCi0JCQlyZXR1cm4gRU9GOworCQkJcmV0 dXJuIChFT0YpOwogCX0gZWxzZSB7CiAJCS8qIG5vIHN0ZXAuICBkZWZhdWx0PT0xLgogCQkgKi8K QEAgLTU4Myw4NSArNTI5LDc2IEBACiAJLyogcmFuZ2UuIHNldCBhbGwgZWxlbWVudHMgZnJvbSBu dW0xIHRvIG51bTIsIHN0ZXBwaW5nCiAJICogYnkgbnVtMy4gICh0aGUgc3RlcCBpcyBhIGRvd253 YXJkLWNvbXBhdGlibGUgZXh0ZW5zaW9uCiAJICogcHJvcG9zZWQgY29uY2VwdHVhbGx5IGJ5IGJv YkBhY29ybnJjLCBzeW50YWN0aWNhbGx5Ci0JICogZGVzaWduZWQgdGhlbiBpbXBsbWVudGVkIGJ5 IHBhdWwgdml4aWUpLgorCSAqIGRlc2lnbmVkIHRoZW4gaW1wbGVtZW50ZWQgYnkgcGF1bCB2aXhp ZSkuCiAJICovCiAJZm9yIChpID0gbnVtMTsgIGkgPD0gbnVtMjsgIGkgKz0gbnVtMykKLQkJaWYg KEVPRiA9PSBzZXRfZWxlbWVudChiaXRzLCBsb3csIGhpZ2gsIGkpKQotCQkJcmV0dXJuIEVPRjsK KwkJaWYgKEVPRiA9PSBzZXRfZWxlbWVudChiaXRzLCBsb3csIGhpZ2gsIGkpKSB7CisJCQl1bmdl dF9jaGFyKGNoLCBmaWxlKTsKKwkJCXJldHVybiAoRU9GKTsKKwkJfQogCi0JcmV0dXJuIGNoOwor CXJldHVybiAoY2gpOwogfQogCitzdGF0aWMgaW50CitnZXRfbnVtYmVyKGludCAqbnVtcHRyLCBp bnQgbG93LCBjb25zdCBjaGFyICpuYW1lc1tdLCBpbnQgY2gsIEZJTEUgKmZpbGUsCisgICAgY29u c3QgY2hhciAqdGVybXMpIHsKKwljaGFyIHRlbXBbTUFYX1RFTVBTVFJdLCAqcGM7CisJaW50IGxl biwgaTsKIAotc3RhdGljIGNoYXIKLWdldF9udW1iZXIobnVtcHRyLCBsb3csIG5hbWVzLCBjaCwg ZmlsZSkKLQlpbnQJKm51bXB0cjsJLyogd2hlcmUgZG9lcyB0aGUgcmVzdWx0IGdvPyAqLwotCWlu dAlsb3c7CQkvKiBvZmZzZXQgYXBwbGllZCB0byByZXN1bHQgaWYgc3ltYm9saWMgZW51bSB1c2Vk ICovCi0JY2hhcgkqbmFtZXNbXTsJLyogc3ltYm9saWMgbmFtZXMsIGlmIGFueSwgZm9yIGVudW1z ICovCi0JaW50CWNoOwkJLyogY3VycmVudCBjaGFyYWN0ZXIgKi8KLQlGSUxFCSpmaWxlOwkJLyog c291cmNlICovCi17Ci0JY2hhcgl0ZW1wW01BWF9URU1QU1RSXSwgKnBjOwotCWludAlsZW4sIGks IGFsbF9kaWdpdHM7Ci0KLQkvKiBjb2xsZWN0IGFscGhhbnVtZXJpY3MgaW50byBvdXIgZml4ZWQt c2l6ZSB0ZW1wIGFycmF5Ci0JICovCiAJcGMgPSB0ZW1wOwogCWxlbiA9IDA7Ci0JYWxsX2RpZ2l0 cyA9IFRSVUU7Ci0Jd2hpbGUgKGlzYWxudW0oY2gpKSB7Ci0JCWlmICgrK2xlbiA+PSBNQVhfVEVN UFNUUikKLQkJCXJldHVybiBFT0Y7CiAKKwkvKiBmaXJzdCBsb29rIGZvciBhIG51bWJlciAqLwor CXdoaWxlIChpc2RpZ2l0KCh1bnNpZ25lZCBjaGFyKWNoKSkgeworCQlpZiAoKytsZW4gPj0gTUFY X1RFTVBTVFIpCisJCQlnb3RvIGJhZDsKIAkJKnBjKysgPSBjaDsKLQotCQlpZiAoIWlzZGlnaXQo Y2gpKQotCQkJYWxsX2RpZ2l0cyA9IEZBTFNFOwotCiAJCWNoID0gZ2V0X2NoYXIoZmlsZSk7CiAJ fQogCSpwYyA9ICdcMCc7Ci0JaWYgKGxlbiA9PSAwKQotCSAgICByZXR1cm4gKEVPRik7CisJaWYg KGxlbiAhPSAwKSB7CisJCS8qIGdvdCBhIG51bWJlciwgY2hlY2sgZm9yIHZhbGlkIHRlcm1pbmF0 b3IgKi8KKwkJaWYgKCFzdHJjaHIodGVybXMsIGNoKSkKKwkJCWdvdG8gYmFkOworCQkqbnVtcHRy ID0gYXRvaSh0ZW1wKTsKKwkJcmV0dXJuIChjaCk7CisJfQogCi0JLyogdHJ5IHRvIGZpbmQgdGhl IG5hbWUgaW4gdGhlIG5hbWUgbGlzdAotCSAqLworCS8qIG5vIG51bWJlcnMsIGxvb2sgZm9yIGEg c3RyaW5nIGlmIHdlIGhhdmUgYW55ICovCiAJaWYgKG5hbWVzKSB7Ci0JCWZvciAoaSA9IDA7ICBu YW1lc1tpXSAhPSBOVUxMOyAgaSsrKSB7Ci0JCQlEZWJ1ZyhEUEFSU3xERVhULAotCQkJCSgiZ2V0 X251bSwgY29tcGFyZSglcywlcylcbiIsIG5hbWVzW2ldLCB0ZW1wKSkKLQkJCWlmICghc3RyY2Fz ZWNtcChuYW1lc1tpXSwgdGVtcCkpIHsKLQkJCQkqbnVtcHRyID0gaStsb3c7Ci0JCQkJcmV0dXJu IGNoOworCQl3aGlsZSAoaXNhbHBoYSgodW5zaWduZWQgY2hhciljaCkpIHsKKwkJCWlmICgrK2xl biA+PSBNQVhfVEVNUFNUUikKKwkJCQlnb3RvIGJhZDsKKwkJCSpwYysrID0gY2g7CisJCQljaCA9 IGdldF9jaGFyKGZpbGUpOworCQl9CisJCSpwYyA9ICdcMCc7CisJCWlmIChsZW4gIT0gMCAmJiBz dHJjaHIodGVybXMsIGNoKSkgeworCQkJZm9yIChpID0gMDsgIG5hbWVzW2ldICE9IE5VTEw7ICBp KyspIHsKKwkJCQlEZWJ1ZyhEUEFSU3xERVhULAorCQkJCQkoImdldF9udW0sIGNvbXBhcmUoJXMs JXMpXG4iLCBuYW1lc1tpXSwKKwkJCQkJdGVtcCkpCisJCQkJaWYgKCFzdHJjYXNlY21wKG5hbWVz W2ldLCB0ZW1wKSkgeworCQkJCQkqbnVtcHRyID0gaStsb3c7CisJCQkJCXJldHVybiAoY2gpOwor CQkJCX0KIAkJCX0KIAkJfQogCX0KIAotCS8qIG5vIG5hbWUgbGlzdCBzcGVjaWZpZWQsIG9yIHRo ZXJlIGlzIG9uZSBhbmQgb3VyIHN0cmluZyBpc24ndAotCSAqIGluIGl0LiAgZWl0aGVyIHdheTog aWYgaXQncyBhbGwgZGlnaXRzLCB1c2UgaXRzIG1hZ25pdHVkZS4KLQkgKiBvdGhlcndpc2UsIGl0 J3MgYW4gZXJyb3IuCi0JICovCi0JaWYgKGFsbF9kaWdpdHMpIHsKLQkJKm51bXB0ciA9IGF0b2ko dGVtcCk7Ci0JCXJldHVybiBjaDsKLQl9Ci0KLQlyZXR1cm4gRU9GOworYmFkOgorCXVuZ2V0X2No YXIoY2gsIGZpbGUpOworCXJldHVybiAoRU9GKTsKIH0KIAotCiBzdGF0aWMgaW50Ci1zZXRfZWxl bWVudChiaXRzLCBsb3csIGhpZ2gsIG51bWJlcikKLQliaXRzdHJfdAkqYml0czsgCQkvKiBvbmUg Yml0IHBlciBmbGFnLCBkZWZhdWx0PUZBTFNFICovCi0JaW50CQlsb3c7Ci0JaW50CQloaWdoOwot CWludAkJbnVtYmVyOwoteworc2V0X2VsZW1lbnQoYml0c3RyX3QgKmJpdHMsIGludCBsb3csIGlu dCBoaWdoLCBpbnQgbnVtYmVyKSB7CiAJRGVidWcoRFBBUlN8REVYVCwgKCJzZXRfZWxlbWVudCg/ LCVkLCVkLCVkKVxuIiwgbG93LCBoaWdoLCBudW1iZXIpKQogCiAJaWYgKG51bWJlciA8IGxvdyB8 fCBudW1iZXIgPiBoaWdoKQotCQlyZXR1cm4gRU9GOworCQlyZXR1cm4gKEVPRik7CiAKIAliaXRf c2V0KGJpdHMsIChudW1iZXItbG93KSk7Ci0JcmV0dXJuIE9LOworCXJldHVybiAoT0spOwogfQpk aWZmIC1ydU4gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9saWIvZW52LmMgZnJlZWJzZF9jcm9uL2xp Yi9lbnYuYwotLS0gL3Vzci9zcmMvdXNyLnNiaW4vY3Jvbi9saWIvZW52LmMJMjAxNC0wMS0xNiAy MTo0Mzo1MC4wMDAwMDAwMDAgKzAxMDAKKysrIGZyZWVic2RfY3Jvbi9saWIvZW52LmMJMjAxNC0w Ni0xMSAxNjo0Mjo1NS4yNzU0NDQzNzkgKzAyMDAKQEAgLTEsOTUgKzEsODIgQEAKIC8qIENvcHly aWdodCAxOTg4LDE5OTAsMTk5MywxOTk0IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVz ZXJ2ZWQKKyAqLworCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3Rl bXMgQ29uc29ydGl1bSwgSW5jLiAoIklTQyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBi eSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25zb3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBm cmVlbHksIGV4Y2VwdDogZG9uJ3QgcmVtb3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0g KiBkb2N1bWVudGF0aW9uIChkb24ndCB0YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91 ciBjaGFuZ2VzIChkb24ndAotICogZ2V0IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdz KSwgZG9uJ3QgYWx0ZXIgb3IgcmVtb3ZlIHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlm IGJ1aWxkYWJsZSBzb3VyY2UgaXMgcHJvdmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVl IG9mIGFueSBraW5kLCBleHByZXNzIG9yIGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwot ICogc29mdHdhcmU7IHVzZSBhdCB5b3VyIG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFt YWdlcyAoaWYgYW55KSB0bwotICogYW55b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhp cyBzb2Z0d2FyZSByZXN0cyBlbnRpcmVseSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Np b24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9y IGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBw cm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJt aXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBv cnRzLCBidWcgZml4ZXMsIGVuaGFuY2VtZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5k Ci0gKiBJJ2xsIHRyeSB0byBrZWVwIGEgdmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVh Y2hlZCBhcyBmb2xsb3dzOgotICogUGF1bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAg ICAgICAgICB1dW5ldCFkZWN3cmwhdml4aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJ REVEICJBUyBJUyIgQU5EIElTQyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVH QVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YK KyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBC RSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VR VUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBG Uk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElP TiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJ TkcgT1VUCisgKiBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5D RSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKLSNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5l ZChMSU5UKQotc3RhdGljIGNvbnN0IGNoYXIgcmNzaWRbXSA9Ci0gICIkRnJlZUJTRDogcmVsZWFz ZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9saWIvZW52LmMgMTEwNjM4IDIwMDMtMDItMTAgMTE6MjA6 NThaIHRob21hcyAkIjsKLSNlbmRpZgotCisvLyNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5l ZChMSU5UKQorLy9zdGF0aWMgY2hhciByY3NpZFtdID0gIiRJZDogZW52LmMsdiAxLjEwIDIwMDQv MDEvMjMgMTg6NTY6NDIgdml4aWUgRXhwICQiOworLy8jZW5kaWYKIAogI2luY2x1ZGUgImNyb24u aCIKIAotCiBjaGFyICoqCi1lbnZfaW5pdCgpCi17Ci0JcmVnaXN0ZXIgY2hhcgkqKnAgPSAoY2hh ciAqKikgbWFsbG9jKHNpemVvZihjaGFyICopKTsKK2Vudl9pbml0KHZvaWQpIHsKKwljaGFyICoq cCA9IChjaGFyICoqKSBtYWxsb2Moc2l6ZW9mKGNoYXIgKiopKTsKIAotCWlmIChwKQorCWlmIChw ICE9IE5VTEwpCiAJCXBbMF0gPSBOVUxMOwogCXJldHVybiAocCk7CiB9CiAKLQogdm9pZAotZW52 X2ZyZWUoZW52cCkKLQljaGFyCSoqZW52cDsKLXsKLQljaGFyCSoqcDsKK2Vudl9mcmVlKGNoYXIg KiplbnZwKSB7CisJY2hhciAqKnA7CiAKLQlpZiAoKHAgPSBlbnZwKSkKLQkgICAgZm9yICg7ICAq cDsgIHArKykKKwlmb3IgKHAgPSBlbnZwOyAqcCAhPSBOVUxMOyBwKyspCiAJCWZyZWUoKnApOwog CWZyZWUoZW52cCk7CiB9CiAKLQogY2hhciAqKgotZW52X2NvcHkoZW52cCkKLQlyZWdpc3RlciBj aGFyCSoqZW52cDsKLXsKLQlyZWdpc3RlciBpbnQJY291bnQsIGk7Ci0JcmVnaXN0ZXIgY2hhcgkq KnA7Ci0KLQlmb3IgKGNvdW50ID0gMDsgIGVudnBbY291bnRdICE9IE5VTEw7ICBjb3VudCsrKQot CQk7Ci0JcCA9IChjaGFyICoqKSBtYWxsb2MoKGNvdW50KzEpICogc2l6ZW9mKGNoYXIgKikpOyAv KiAxIGZvciB0aGUgTlVMTCAqLwotCWlmIChwID09IE5VTEwpIHsKLQkJZXJybm8gPSBFTk9NRU07 Ci0JCXJldHVybiBOVUxMOworZW52X2NvcHkoY2hhciAqKmVudnApIHsKKwlpbnQgY291bnQsIGks IHNhdmVfZXJybm87CisJY2hhciAqKnA7CisKKwlmb3IgKGNvdW50ID0gMDsgZW52cFtjb3VudF0g IT0gTlVMTDsgY291bnQrKykKKwkJTlVMTDsKKwlwID0gKGNoYXIgKiopIG1hbGxvYygoY291bnQr MSkgKiBzaXplb2YoY2hhciAqKSk7ICAvKiAxIGZvciB0aGUgTlVMTCAqLworCWlmIChwICE9IE5V TEwpIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQlpZiAoKHBbaV0gPSBzdHJk dXAoZW52cFtpXSkpID09IE5VTEwpIHsKKwkJCQlzYXZlX2Vycm5vID0gZXJybm87CisJCQkJd2hp bGUgKC0taSA+PSAwKQorCQkJCQlmcmVlKHBbaV0pOworCQkJCWZyZWUocCk7CisJCQkJZXJybm8g PSBzYXZlX2Vycm5vOworCQkJCXJldHVybiAoTlVMTCk7CisJCQl9CisJCXBbY291bnRdID0gTlVM TDsKIAl9Ci0JZm9yIChpID0gMDsgIGkgPCBjb3VudDsgIGkrKykKLQkJaWYgKChwW2ldID0gc3Ry ZHVwKGVudnBbaV0pKSA9PSBOVUxMKSB7Ci0JCQl3aGlsZSAoLS1pID49IDApCi0JCQkJKHZvaWQp IGZyZWUocFtpXSk7Ci0JCQlmcmVlKHApOwotCQkJZXJybm8gPSBFTk9NRU07Ci0JCQlyZXR1cm4g TlVMTDsKLQkJfQotCXBbY291bnRdID0gTlVMTDsKIAlyZXR1cm4gKHApOwogfQogCi0KIGNoYXIg KioKLWVudl9zZXQoZW52cCwgZW52c3RyKQotCWNoYXIJKiplbnZwOwotCWNoYXIJKmVudnN0cjsK LXsKLQlyZWdpc3RlciBpbnQJY291bnQsIGZvdW5kOwotCXJlZ2lzdGVyIGNoYXIJKipwOwotCWNo YXIJCSpxOworZW52X3NldChjaGFyICoqZW52cCwgY2hhciAqZW52c3RyKSB7CisJaW50IGNvdW50 LCBmb3VuZDsKKwljaGFyICoqcCwgKmVudnRtcDsKIAogCS8qCiAJICogY291bnQgdGhlIG51bWJl ciBvZiBlbGVtZW50cywgaW5jbHVkaW5nIHRoZSBudWxsIHBvaW50ZXI7CiAJICogYWxzbyBzZXQg J2ZvdW5kJyB0byAtMSBvciBpbmRleCBvZiBlbnRyeSBpZiBhbHJlYWR5IGluIGhlcmUuCiAJICov CiAJZm91bmQgPSAtMTsKLQlmb3IgKGNvdW50ID0gMDsgIGVudnBbY291bnRdICE9IE5VTEw7ICBj b3VudCsrKSB7CisJZm9yIChjb3VudCA9IDA7IGVudnBbY291bnRdICE9IE5VTEw7IGNvdW50Kysp IHsKIAkJaWYgKCFzdHJjbXBfdW50aWwoZW52cFtjb3VudF0sIGVudnN0ciwgJz0nKSkKIAkJCWZv dW5kID0gY291bnQ7CiAJfQpAQCAtMTAwLDE0ICs4NywxMCBAQAogCQkgKiBpdCBleGlzdHMgYWxy ZWFkeSwgc28ganVzdCBmcmVlIHRoZSBleGlzdGluZyBzZXR0aW5nLAogCQkgKiBzYXZlIG91ciBu ZXcgb25lIHRoZXJlLCBhbmQgcmV0dXJuIHRoZSBleGlzdGluZyBhcnJheS4KIAkJICovCi0JCXEg PSBlbnZwW2ZvdW5kXTsKLQkJaWYgKChlbnZwW2ZvdW5kXSA9IHN0cmR1cChlbnZzdHIpKSA9PSBO VUxMKSB7Ci0JCQllbnZwW2ZvdW5kXSA9IHE7Ci0JCQkvKiBYWFggZW52X2ZyZWUoZW52cCk7ICov Ci0JCQllcnJubyA9IEVOT01FTTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCWZyZWUocSk7CisJ CWlmICgoZW52dG1wID0gc3RyZHVwKGVudnN0cikpID09IE5VTEwpCisJCQlyZXR1cm4gKE5VTEwp OworCQlmcmVlKGVudnBbZm91bmRdKTsKKwkJZW52cFtmb3VuZF0gPSBlbnZ0bXA7CiAJCXJldHVy biAoZW52cCk7CiAJfQogCkBAIC0xMTYsNDcgKzk5LDQyIEBACiAJICogb25lLCBzYXZlIG91ciBz dHJpbmcgb3ZlciB0aGUgb2xkIG51bGwgcG9pbnRlciwgYW5kIHJldHVybiByZXNpemVkCiAJICog YXJyYXkuCiAJICovCisJaWYgKChlbnZ0bXAgPSBzdHJkdXAoZW52c3RyKSkgPT0gTlVMTCkKKwkJ cmV0dXJuIChOVUxMKTsKIAlwID0gKGNoYXIgKiopIHJlYWxsb2MoKHZvaWQgKikgZW52cCwKLQkJ CSAgICAgICh1bnNpZ25lZCkgKChjb3VudCsxKSAqIHNpemVvZihjaGFyICopKSk7Ci0JaWYgKHAg PT0gTlVMTCkgCXsKLQkJLyogWFhYIGVudl9mcmVlKGVudnApOyAqLwotCQllcnJubyA9IEVOT01F TTsKLQkJcmV0dXJuIE5VTEw7CisJCQkgICAgICAoc2l6ZV90KSAoKGNvdW50KzEpICogc2l6ZW9m KGNoYXIgKiopKSk7CisJaWYgKHAgPT0gTlVMTCkgeworCQlmcmVlKGVudnRtcCk7CisJCXJldHVy biAoTlVMTCk7CiAJfQogCXBbY291bnRdID0gcFtjb3VudC0xXTsKLQlpZiAoKHBbY291bnQtMV0g PSBzdHJkdXAoZW52c3RyKSkgPT0gTlVMTCkgewotCQllbnZfZnJlZShwKTsKLQkJZXJybm8gPSBF Tk9NRU07Ci0JCXJldHVybiBOVUxMOwotCX0KKwlwW2NvdW50LTFdID0gZW52dG1wOwogCXJldHVy biAocCk7CiB9CiAKKy8qIFRoZSBmb2xsb3dpbmcgc3RhdGVzIGFyZSB1c2VkIGJ5IGxvYWRfZW52 KCksIHRyYXZlcnNlZCBpbiBvcmRlcjogKi8KK2VudW0gZW52X3N0YXRlIHsKKwlOQU1FSSwJCS8q IEZpcnN0IGNoYXIgb2YgTkFNRSwgbWF5IGJlIHF1b3RlICovCisJTkFNRSwJCS8qIFN1YnNlcXVl bnQgY2hhcnMgb2YgTkFNRSAqLworCUVRMSwJCS8qIEFmdGVyIGVuZCBvZiBuYW1lLCBsb29raW5n IGZvciAnPScgc2lnbiAqLworCUVRMiwJCS8qIEFmdGVyICc9Jywgc2tpcHBpbmcgd2hpdGVzcGFj ZSAqLworCVZBTFVFSSwJCS8qIEZpcnN0IGNoYXIgb2YgVkFMVUUsIG1heSBiZSBxdW90ZSAqLwor CVZBTFVFLAkJLyogU3Vic2VxdWVudCBjaGFycyBvZiBWQUxVRSAqLworCUZJTkksCQkvKiBBbGwg ZG9uZSwgc2tpcHBpbmcgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworCUVSUk9SLAkJLyogRXJyb3Ig Ki8KK307CiAKIC8qIHJldHVybglFUlIgPSBlbmQgb2YgZmlsZQogICoJCUZBTFNFID0gbm90IGFu IGVudiBzZXR0aW5nIChmaWxlIHdhcyByZXBvc2l0aW9uZWQpCiAgKgkJVFJVRSA9IHdhcyBhbiBl bnYgc2V0dGluZwogICovCiBpbnQKLWxvYWRfZW52KGVudnN0ciwgZikKLQljaGFyCSplbnZzdHI7 Ci0JRklMRQkqZjsKLXsKLQlsb25nCWZpbGVwb3M7Ci0JaW50CWZpbGVsaW5lOwotCWNoYXIJbmFt ZVtNQVhfRU5WU1RSXSwgdmFsW01BWF9FTlZTVFJdOwotCWNoYXIJcXVvdGVjaGFyLCAqYywgKnN0 cjsKLQlpbnQJc3RhdGU7Ci0KLQkvKiBUaGUgZm9sbG93aW5nIHN0YXRlcyBhcmUgdHJhdmVyc2Vk IGluIG9yZGVyOiAqLwotI2RlZmluZSBOQU1FSQkwCS8qIEZpcnN0IGNoYXIgb2YgTkFNRSwgbWF5 IGJlIHF1b3RlICovCi0jZGVmaW5lIE5BTUUJMQkvKiBTdWJzZXF1ZW50IGNoYXJzIG9mIE5BTUUg Ki8KLSNkZWZpbmUgRVExCTIJLyogQWZ0ZXIgZW5kIG9mIG5hbWUsIGxvb2tpbmcgZm9yICc9JyBz aWduICovCi0jZGVmaW5lIEVRMgkzCS8qIEFmdGVyICc9Jywgc2tpcHBpbmcgd2hpdGVzcGFjZSAq LwotI2RlZmluZSBWQUxVRUkJNAkvKiBGaXJzdCBjaGFyIG9mIFZBTFVFLCBtYXkgYmUgcXVvdGUg Ki8KLSNkZWZpbmUgVkFMVUUJNQkvKiBTdWJzZXF1ZW50IGNoYXJzIG9mIFZBTFVFICovCi0jZGVm aW5lIEZJTkkJNgkvKiBBbGwgZG9uZSwgc2tpcHBpbmcgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwot I2RlZmluZSBFUlJPUgk3CS8qIEVycm9yICovCitsb2FkX2VudihjaGFyICplbnZzdHIsIEZJTEUg KmYpIHsKKwlsb25nIGZpbGVwb3M7CisJaW50IGZpbGVsaW5lOworCWVudW0gZW52X3N0YXRlIHN0 YXRlOworCWNoYXIgbmFtZVtNQVhfRU5WU1RSXSwgdmFsW01BWF9FTlZTVFJdOworCWNoYXIgcXVv dGVjaGFyLCAqYywgKnN0cjsKIAogCWZpbGVwb3MgPSBmdGVsbChmKTsKIAlmaWxlbGluZSA9IExp bmVOdW1iZXI7CkBAIC0xNjQsMTAgKzE0MiwxMCBAQAogCWlmIChFT0YgPT0gZ2V0X3N0cmluZyhl bnZzdHIsIE1BWF9FTlZTVFIsIGYsICJcbiIpKQogCQlyZXR1cm4gKEVSUik7CiAKLQlEZWJ1ZyhE UEFSUywgKCJsb2FkX2VudiwgcmVhZCA8JXM+XG4iLCBlbnZzdHIpKTsKKwlEZWJ1ZyhEUEFSUywg KCJsb2FkX2VudiwgcmVhZCA8JXM+XG4iLCBlbnZzdHIpKQogCi0JYnplcm8gKG5hbWUsIHNpemVv ZiBuYW1lKTsKLQliemVybyAodmFsLCBzaXplb2YgdmFsKTsKKwliemVybyhuYW1lLCBzaXplb2Yg bmFtZSk7CisJYnplcm8odmFsLCBzaXplb2YgdmFsKTsKIAlzdHIgPSBuYW1lOwogCXN0YXRlID0g TkFNRUk7CiAJcXVvdGVjaGFyID0gJ1wwJzsKQEAgLTE3OCw3ICsxNTYsNyBAQAogCQljYXNlIFZB TFVFSToKIAkJCWlmICgqYyA9PSAnXCcnIHx8ICpjID09ICciJykKIAkJCQlxdW90ZWNoYXIgPSAq YysrOwotCQkJKytzdGF0ZTsKKwkJCXN0YXRlKys7CiAJCQkvKiBGQUxMVEhST1VHSCAqLwogCQlj YXNlIE5BTUU6CiAJCWNhc2UgVkFMVUU6CkBAIC0xOTQsNyArMTcyLDcgQEAKIAkJCQl9CiAJCQl9 IGVsc2UgewogCQkJCWlmIChzdGF0ZSA9PSBOQU1FKSB7Ci0JCQkJCWlmIChpc3NwYWNlICgqYykp IHsKKwkJCQkJaWYgKGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKmMpKSB7CiAJCQkJCQljKys7CiAJ CQkJCQlzdGF0ZSsrOwogCQkJCQkJYnJlYWs7CkBAIC0yMTQsNTIgKzE5Miw1NSBAQAogCQkJCXN0 ciA9IHZhbDsKIAkJCQlxdW90ZWNoYXIgPSAnXDAnOwogCQkJfSBlbHNlIHsKLQkJCQlpZiAoIWlz c3BhY2UgKCpjKSkKKwkJCQlpZiAoIWlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpKmMpKQogCQkJCQlz dGF0ZSA9IEVSUk9SOwogCQkJfQogCQkJYysrOwogCQkJYnJlYWs7CisKIAkJY2FzZSBFUTI6CiAJ CWNhc2UgRklOSToKLQkJCWlmIChpc3NwYWNlICgqYykpCisJCQlpZiAoaXNzcGFjZSgodW5zaWdu ZWQgY2hhcikqYykpCiAJCQkJYysrOwogCQkJZWxzZQogCQkJCXN0YXRlKys7CiAJCQlicmVhazsK KworCQlkZWZhdWx0OgorCQkJYWJvcnQoKTsKIAkJfQogCX0KIAlpZiAoc3RhdGUgIT0gRklOSSAm JiAhKHN0YXRlID09IFZBTFVFICYmICFxdW90ZWNoYXIpKSB7Ci0JCURlYnVnKERQQVJTLCAoImxv YWRfZW52LCBwYXJzZSBlcnJvciwgc3RhdGUgPSAlZFxuIiwgc3RhdGUpKQorCQlEZWJ1ZyhEUEFS UywgKCJsb2FkX2Vudiwgbm90IGFuIGVudiB2YXIsIHN0YXRlID0gJWRcbiIsIHN0YXRlKSkKIAkJ ZnNlZWsoZiwgZmlsZXBvcywgMCk7CiAJCVNldF9MaW5lTnVtKGZpbGVsaW5lKTsKIAkJcmV0dXJu IChGQUxTRSk7CiAJfQogCWlmIChzdGF0ZSA9PSBWQUxVRSkgewogCQkvKiBFbmQgb2YgdW5xdW90 ZWQgdmFsdWU6IHRyaW0gdHJhaWxpbmcgd2hpdGVzcGFjZSAqLwotCQljID0gdmFsICsgc3RybGVu ICh2YWwpOwotCQl3aGlsZSAoYyA+IHZhbCAmJiBpc3NwYWNlICgqKGMgLSAxKSkpCisJCWMgPSB2 YWwgKyBzdHJsZW4odmFsKTsKKwkJd2hpbGUgKGMgPiB2YWwgJiYgaXNzcGFjZSgodW5zaWduZWQg Y2hhciljWy0xXSkpCiAJCQkqKC0tYykgPSAnXDAnOwogCX0KIAogCS8qIDIgZmllbGRzIGZyb20g cGFyc2VyOyBsb29rcyBsaWtlIGFuIGVudiBzZXR0aW5nICovCiAKLQlpZiAoc3RybGVuKG5hbWUp ICsgMSArIHN0cmxlbih2YWwpID49IE1BWF9FTlZTVFItMSkKKwkvKgorCSAqIFRoaXMgY2FuJ3Qg b3ZlcmZsb3cgYmVjYXVzZSBnZXRfc3RyaW5nKCkgbGltaXRlZCB0aGUgc2l6ZSBvZiB0aGUKKwkg KiBuYW1lIGFuZCB2YWwgZmllbGRzLiAgU3RpbGwsIGl0IGRvZXNuJ3QgaHVydCB0byBiZSBjYXJl ZnVsLi4uCisJICovCisJaWYgKCFnbHVlX3N0cmluZ3MoZW52c3RyLCBNQVhfRU5WU1RSLCBuYW1l LCB2YWwsICc9JykpCiAJCXJldHVybiAoRkFMU0UpOwotCSh2b2lkKSBzcHJpbnRmKGVudnN0ciwg IiVzPSVzIiwgbmFtZSwgdmFsKTsKIAlEZWJ1ZyhEUEFSUywgKCJsb2FkX2VudiwgPCVzPiA8JXM+ IC0+IDwlcz5cbiIsIG5hbWUsIHZhbCwgZW52c3RyKSkKIAlyZXR1cm4gKFRSVUUpOwogfQogCi0K IGNoYXIgKgotZW52X2dldChuYW1lLCBlbnZwKQotCXJlZ2lzdGVyIGNoYXIJKm5hbWU7Ci0JcmVn aXN0ZXIgY2hhcgkqKmVudnA7Ci17Ci0JcmVnaXN0ZXIgaW50CWxlbiA9IHN0cmxlbihuYW1lKTsK LQlyZWdpc3RlciBjaGFyCSpwLCAqcTsKK2Vudl9nZXQoY2hhciAqbmFtZSwgY2hhciAqKmVudnAp IHsKKwlpbnQgbGVuID0gc3RybGVuKG5hbWUpOworCWNoYXIgKnAsICpxOwogCi0Jd2hpbGUgKChw ID0gKmVudnArKykpIHsKKwl3aGlsZSAoKHAgPSAqZW52cCsrKSAhPSBOVUxMKSB7CiAJCWlmICgh KHEgPSBzdHJjaHIocCwgJz0nKSkpCiAJCQljb250aW51ZTsKIAkJaWYgKChxIC0gcCkgPT0gbGVu ICYmICFzdHJuY21wKHAsIG5hbWUsIGxlbikpCmRpZmYgLXJ1TiAvdXNyL3NyYy91c3Iuc2Jpbi9j cm9uL2xpYi9taXNjLmMgZnJlZWJzZF9jcm9uL2xpYi9taXNjLmMKLS0tIC91c3Ivc3JjL3Vzci5z YmluL2Nyb24vbGliL21pc2MuYwkyMDE0LTAxLTE2IDIxOjQzOjUwLjAwMDAwMDAwMCArMDEwMAor KysgZnJlZWJzZF9jcm9uL2xpYi9taXNjLmMJMjAxNC0wNi0xMSAxNjo0Mjo1NS4yNzU0NDQzNzkg KzAyMDAKQEAgLTEsNjMgKzEsOTAgQEAKIC8qIENvcHlyaWdodCAxOTg4LDE5OTAsMTk5MywxOTk0 IGJ5IFBhdWwgVml4aWUKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKKyAqLworCisvKgorICogQ29w eXJpZ2h0IChjKSAyMDA0IGJ5IEludGVybmV0IFN5c3RlbXMgQ29uc29ydGl1bSwgSW5jLiAoIklT QyIpCisgKiBDb3B5cmlnaHQgKGMpIDE5OTcsMjAwMCBieSBJbnRlcm5ldCBTb2Z0d2FyZSBDb25z b3J0aXVtLCBJbmMuCiAgKgotICogRGlzdHJpYnV0ZSBmcmVlbHksIGV4Y2VwdDogZG9uJ3QgcmVt b3ZlIG15IG5hbWUgZnJvbSB0aGUgc291cmNlIG9yCi0gKiBkb2N1bWVudGF0aW9uIChkb24ndCB0 YWtlIGNyZWRpdCBmb3IgbXkgd29yayksIG1hcmsgeW91ciBjaGFuZ2VzIChkb24ndAotICogZ2V0 IG1lIGJsYW1lZCBmb3IgeW91ciBwb3NzaWJsZSBidWdzKSwgZG9uJ3QgYWx0ZXIgb3IgcmVtb3Zl IHRoaXMKLSAqIG5vdGljZS4gIE1heSBiZSBzb2xkIGlmIGJ1aWxkYWJsZSBzb3VyY2UgaXMgcHJv dmlkZWQgdG8gYnV5ZXIuICBObwotICogd2FycmFudGVlIG9mIGFueSBraW5kLCBleHByZXNzIG9y IGltcGxpZWQsIGlzIGluY2x1ZGVkIHdpdGggdGhpcwotICogc29mdHdhcmU7IHVzZSBhdCB5b3Vy IG93biByaXNrLCByZXNwb25zaWJpbGl0eSBmb3IgZGFtYWdlcyAoaWYgYW55KSB0bwotICogYW55 b25lIHJlc3VsdGluZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSByZXN0cyBlbnRpcmVs eSB3aXRoIHRoZQotICogdXNlci4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnks IGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9y IHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQor ICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4g YWxsIGNvcGllcy4KICAqCi0gKiBTZW5kIGJ1ZyByZXBvcnRzLCBidWcgZml4ZXMsIGVuaGFuY2Vt ZW50cywgcmVxdWVzdHMsIGZsYW1lcywgZXRjLiwgYW5kCi0gKiBJJ2xsIHRyeSB0byBrZWVwIGEg dmVyc2lvbiB1cCB0byBkYXRlLiAgSSBjYW4gYmUgcmVhY2hlZCBhcyBmb2xsb3dzOgotICogUGF1 bCBWaXhpZSAgICAgICAgICA8cGF1bEB2aXguY29tPiAgICAgICAgICB1dW5ldCFkZWN3cmwhdml4 aWUhcGF1bAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIElTQyBESVND TEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5D TFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQg RklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIElTQyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BF Q0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBE QU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9S IFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5D RSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBPRiBPUiBJTiBDT05O RUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICov CiAKLSNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQotc3RhdGljIGNvbnN0IGNo YXIgcmNzaWRbXSA9Ci0gICIkRnJlZUJTRDogcmVsZWFzZS8xMC4wLjAvdXNyLnNiaW4vY3Jvbi9s aWIvbWlzYy5jIDI0MTEyNSAyMDEyLTEwLTAyIDA5OjIzOjE2WiBwbHVrbmV0ICQiOwotI2VuZGlm CisvLyNpZiAhZGVmaW5lZChsaW50KSAmJiAhZGVmaW5lZChMSU5UKQorLy9zdGF0aWMgY2hhciBy Y3NpZFtdID0gIiRJZDogbWlzYy5jLHYgMS4xNiAyMDA0LzAxLzIzIDE4OjU2OjQzIHZpeGllIEV4 cCAkIjsKKy8vI2VuZGlmCiAKIC8qIHZpeCAyNmphbjg3IFtSQ1MgaGFzIHRoZSByZXN0IG9mIHRo ZSBsb2ddCiAgKiB2aXggMzBkZWM4NiBbd3JpdHRlbl0KICAqLwogCi0KICNpbmNsdWRlICJjcm9u LmgiCi0jaWYgU1lTX1RJTUVfSAotIyBpbmNsdWRlIDxzeXMvdGltZS5oPgotI2Vsc2UKLSMgaW5j bHVkZSA8dGltZS5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3lzL2ZpbGUuaD4KLSNpbmNsdWRlIDxz eXMvc3RhdC5oPgotI2luY2x1ZGUgPGVyci5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVk ZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZiBkZWZpbmVkKFNZU0xPRykKLSMg aW5jbHVkZSA8c3lzbG9nLmg+Ci0jZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KIAorI2lmIGRl ZmluZWQoU1lTTE9HKSAmJiBkZWZpbmVkKExPR19GSUxFKQorIyB1bmRlZiBMT0dfRklMRQorI2Vu ZGlmCiAKICNpZiBkZWZpbmVkKExPR19EQUVNT04pICYmICFkZWZpbmVkKExPR19DUk9OKQotI2Rl ZmluZSBMT0dfQ1JPTiBMT0dfREFFTU9OCisjIGRlZmluZSBMT0dfQ1JPTiBMT0dfREFFTU9OCiAj ZW5kaWYKIAorI2lmbmRlZiBGQUNJTElUWQorI2RlZmluZSBGQUNJTElUWSBMT0dfQ1JPTgorI2Vu ZGlmCiAKLXN0YXRpYyBpbnQJCUxvZ0ZEID0gRVJSOworc3RhdGljIGludCBMb2dGRCA9IEVSUjsK IAorI2lmIGRlZmluZWQoU1lTTE9HKQorc3RhdGljIGludCBzeXNsb2dfb3BlbiA9IEZBTFNFOwor I2VuZGlmCiAKKy8qCisgKiBnbHVlX3N0cmluZ3MgaXMgdGhlIG92ZXJmbG93LXNhZmUgZXF1aXZh bGVudCBvZgorICoJCXNwcmludGYoYnVmZmVyLCAiJXMlYyVzIiwgYSwgc2VwYXJhdG9yLCBiKTsK KyAqCisgKiByZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsdXJlLiAgJ2J1ZmZlcicgTVVT VCBOT1QgYmUgdXNlZCBpZgorICogZ2x1ZV9zdHJpbmdzIGZhaWxzLgorICovCiBpbnQKLXN0cmNt cF91bnRpbChsZWZ0LCByaWdodCwgdW50aWwpCi0JY2hhcgkqbGVmdDsKLQljaGFyCSpyaWdodDsK LQlpbnQJdW50aWw7CitnbHVlX3N0cmluZ3MoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3Np emUsIGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIsCisJICAgICBjaGFyIHNlcGFyYXRvcikK IHsKLQlyZWdpc3RlciBpbnQJZGlmZjsKKwljaGFyICpidWY7CisJY2hhciAqYnVmX2VuZDsKKwor CWlmIChidWZmZXJfc2l6ZSA8PSAwKQorCQlyZXR1cm4gKDApOworCWJ1Zl9lbmQgPSBidWZmZXIg KyBidWZmZXJfc2l6ZTsKKwlidWYgPSBidWZmZXI7CisKKwlmb3IgKCAvKiBub3RoaW5nICovOyBi dWYgPCBidWZfZW5kICYmICphICE9ICdcMCc7IGJ1ZisrLCBhKysgKQorCQkqYnVmID0gKmE7CisJ aWYgKGJ1ZiA9PSBidWZfZW5kKQorCQlyZXR1cm4gKDApOworCWlmIChzZXBhcmF0b3IgIT0gJy8n IHx8IGJ1ZiA9PSBidWZmZXIgfHwgYnVmWy0xXSAhPSAnLycpCisJCSpidWYrKyA9IHNlcGFyYXRv cjsKKwlpZiAoYnVmID09IGJ1Zl9lbmQpCisJCXJldHVybiAoMCk7CisJZm9yICggLyogbm90aGlu ZyAqLzsgYnVmIDwgYnVmX2VuZCAmJiAqYiAhPSAnXDAnOyBidWYrKywgYisrICkKKwkJKmJ1ZiA9 ICpiOworCWlmIChidWYgPT0gYnVmX2VuZCkKKwkJcmV0dXJuICgwKTsKKwkqYnVmID0gJ1wwJzsK KwlyZXR1cm4gKDEpOworfQogCitpbnQKK3N0cmNtcF91bnRpbChjb25zdCBjaGFyICpsZWZ0LCBj b25zdCBjaGFyICpyaWdodCwgY2hhciB1bnRpbCkgewogCXdoaWxlICgqbGVmdCAmJiAqbGVmdCAh PSB1bnRpbCAmJiAqbGVmdCA9PSAqcmlnaHQpIHsKIAkJbGVmdCsrOwogCQlyaWdodCsrOwpAQCAt NjUsMjEgKzkyLDE1IEBACiAKIAlpZiAoKCpsZWZ0PT0nXDAnIHx8ICpsZWZ0ID09IHVudGlsKSAm JgogCSAgICAoKnJpZ2h0PT0nXDAnIHx8ICpyaWdodCA9PSB1bnRpbCkpIHsKLQkJZGlmZiA9IDA7 Ci0JfSBlbHNlIHsKLQkJZGlmZiA9ICpsZWZ0IC0gKnJpZ2h0OworCQlyZXR1cm4gKDApOwogCX0K LQotCXJldHVybiBkaWZmOworCXJldHVybiAoKmxlZnQgLSAqcmlnaHQpOwogfQogCi0KIC8qIHN0 cmR0YihzKSAtIGRlbGV0ZSB0cmFpbGluZyBibGFua3MgaW4gc3RyaW5nICdzJyBhbmQgcmV0dXJu IG5ldyBsZW5ndGgKICAqLwogaW50Ci1zdHJkdGIocykKLQljaGFyCSpzOwoteworc3RyZHRiKGNo YXIgKnMpIHsKIAljaGFyCSp4ID0gczsKIAogCS8qIHNjYW4gZm9yd2FyZCB0byB0aGUgbnVsbApA QCAtOTEsNyArMTEyLDcgQEAKIAkgKiBvciB0aGUgbGFzdCBub24tYmxhbmsgaW4gdGhlIHN0cmlu Zywgd2hpY2hldmVyIGNvbWVzIGZpcnN0LgogCSAqLwogCWRvCXt4LS07fQotCXdoaWxlICh4ID49 IHMgJiYgaXNzcGFjZSgqeCkpOworCXdoaWxlICh4ID49IHMgJiYgaXNzcGFjZSgodW5zaWduZWQg Y2hhcikqeCkpOwogCiAJLyogb25lIGNoYXJhY3RlciBiZXlvbmQgd2hlcmUgd2Ugc3RvcHBlZCBh Ym92ZSBpcyB3aGVyZSB0aGUgbnVsbAogCSAqIGdvZXMuCkBAIC0xMDEsMTQgKzEyMiwxMSBAQAog CS8qIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvc2l0aW9uIG9mIHRoZSBudWxsIGNoYXJh Y3RlciBhbmQKIAkgKiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUg c3RyaW5nIGlzIHRoZSBsZW5ndGguCiAJICovCi0JcmV0dXJuIHggLSBzOworCXJldHVybiAoeCAt IHMpOwogfQogCi0KIGludAotc2V0X2RlYnVnX2ZsYWdzKGZsYWdzKQotCWNoYXIJKmZsYWdzOwot eworc2V0X2RlYnVnX2ZsYWdzKGNvbnN0IGNoYXIgKmZsYWdzKSB7CiAJLyogZGVidWcgZmxhZ3Mg YXJlIG9mIHRoZSBmb3JtICAgIGZsYWdbLGZsYWcgLi4uXQogCSAqCiAJICogaWYgYW4gZXJyb3Ig b2NjdXJzLCBwcmludCBhIG1lc3NhZ2UgdG8gc3Rkb3V0IGFuZCByZXR1cm4gRkFMU0UuCkBAIC0x MTgsMzEgKzEzNiwzMCBAQAogI2lmICFERUJVR0dJTkcKIAogCXByaW50ZigidGhpcyBwcm9ncmFt IHdhcyBjb21waWxlZCB3aXRob3V0IGRlYnVnZ2luZyBlbmFibGVkXG4iKTsKLQlyZXR1cm4gRkFM U0U7CisJcmV0dXJuIChGQUxTRSk7CiAKICNlbHNlIC8qIERFQlVHR0lORyAqLwogCi0JY2hhcgkq cGMgPSBmbGFnczsKKwljb25zdCBjaGFyICpwYyA9IGZsYWdzOwogCiAJRGVidWdGbGFncyA9IDA7 CiAKIAl3aGlsZSAoKnBjKSB7Ci0JCWNoYXIJKip0ZXN0OwotCQlpbnQJbWFzazsKKwkJY29uc3Qg Y2hhcgkqKnRlc3Q7CisJCWludAkJbWFzazsKIAogCQkvKiB0cnkgdG8gZmluZCBkZWJ1ZyBmbGFn IG5hbWUgaW4gb3VyIGxpc3QuCiAJCSAqLwotCQlmb3IgKAl0ZXN0ID0gRGVidWdGbGFnTmFtZXMs IG1hc2sgPSAxOwotCQkJKnRlc3QgJiYgc3RyY21wX3VudGlsKCp0ZXN0LCBwYywgJywnKTsKLQkJ CXRlc3QrKywgbWFzayA8PD0gMQotCQkgICAgKQotCQkJOworCQlmb3IgKHRlc3QgPSBEZWJ1Z0Zs YWdOYW1lcywgbWFzayA9IDE7CisJCSAgICAgKnRlc3QgIT0gTlVMTCAmJiBzdHJjbXBfdW50aWwo KnRlc3QsIHBjLCAnLCcpOworCQkgICAgIHRlc3QrKywgbWFzayA8PD0gMSkKKwkJCU5VTEw7CiAK IAkJaWYgKCEqdGVzdCkgewogCQkJZnByaW50ZihzdGRlcnIsCiAJCQkJInVucmVjb2duaXplZCBk ZWJ1ZyBmbGFnIDwlcz4gPCVzPlxuIiwKIAkJCQlmbGFncywgcGMpOwotCQkJcmV0dXJuIEZBTFNF OworCQkJcmV0dXJuIChGQUxTRSk7CiAJCX0KIAogCQlEZWJ1Z0ZsYWdzIHw9IG1hc2s7CkBAIC0x NTYsNyArMTczLDcgQEAKIAl9CiAKIAlpZiAoRGVidWdGbGFncykgewotCQlpbnQJZmxhZzsKKwkJ aW50IGZsYWc7CiAKIAkJZnByaW50ZihzdGRlcnIsICJkZWJ1ZyBmbGFncyBlbmFibGVkOiIpOwog CkBAIC0xNjYsOTAgKzE4MywxMDUgQEAKIAkJZnByaW50ZihzdGRlcnIsICJcbiIpOwogCX0KIAot CXJldHVybiBUUlVFOworCXJldHVybiAoVFJVRSk7CiAKICNlbmRpZiAvKiBERUJVR0dJTkcgKi8K IH0KIAotCiB2b2lkCi1zZXRfY3Jvbl91aWQoKQoteworc2V0X2Nyb25fdWlkKHZvaWQpIHsKICNp ZiBkZWZpbmVkKEJTRCkgfHwgZGVmaW5lZChQT1NJWCkKLQlpZiAoc2V0ZXVpZChST09UX1VJRCkg PCBPSykKLQkJZXJyKEVSUk9SX0VYSVQsICJzZXRldWlkIik7CisJaWYgKHNldGV1aWQoUk9PVF9V SUQpIDwgT0spIHsKKwkJcGVycm9yKCJzZXRldWlkIik7CisJCWV4aXQoRVJST1JfRVhJVCk7CisJ fQogI2Vsc2UKLQlpZiAoc2V0dWlkKFJPT1RfVUlEKSA8IE9LKQotCQllcnIoRVJST1JfRVhJVCwg InNldHVpZCIpOworCWlmIChzZXR1aWQoUk9PVF9VSUQpIDwgT0spIHsKKwkJcGVycm9yKCJzZXR1 aWQiKTsKKwkJZXhpdChFUlJPUl9FWElUKTsKKwl9CiAjZW5kaWYKIH0KIAotCiB2b2lkCi1zZXRf Y3Jvbl9jd2QoKQotewotCXN0cnVjdCBzdGF0CXNiOworc2V0X2Nyb25fY3dkKHZvaWQpIHsKKwlz dHJ1Y3Qgc3RhdCBzYjsKKwlzdHJ1Y3QgZ3JvdXAgKmdycCA9IE5VTEw7CiAKKyNpZmRlZiBDUk9O X0dST1VQCisJZ3JwID0gZ2V0Z3JuYW0oQ1JPTl9HUk9VUCk7CisjZW5kaWYKIAkvKiBmaXJzdCBj aGVjayBmb3IgQ1JPTkRJUiAoIi92YXIvY3JvbiIgb3Igc29tZSBzdWNoKQogCSAqLwogCWlmIChz dGF0KENST05ESVIsICZzYikgPCBPSyAmJiBlcnJubyA9PSBFTk9FTlQpIHsKLQkJd2FybigiJXMi LCBDUk9ORElSKTsKLQkJaWYgKE9LID09IG1rZGlyKENST05ESVIsIDA3MDApKSB7Ci0JCQl3YXJu eCgiJXM6IGNyZWF0ZWQiLCBDUk9ORElSKTsKKwkJcGVycm9yKENST05ESVIpOworCQlpZiAoT0sg PT0gbWtkaXIoQ1JPTkRJUiwgMDcxMCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6IGNyZWF0 ZWRcbiIsIENST05ESVIpOwogCQkJc3RhdChDUk9ORElSLCAmc2IpOwogCQl9IGVsc2UgewotCQkJ ZXJyKEVSUk9SX0VYSVQsICIlczogbWtkaXIiLCBDUk9ORElSKTsKKwkJCWZwcmludGYoc3RkZXJy LCAiJXM6ICIsIENST05ESVIpOworCQkJcGVycm9yKCJta2RpciIpOworCQkJZXhpdChFUlJPUl9F WElUKTsKIAkJfQogCX0KLQlpZiAoIShzYi5zdF9tb2RlICYgU19JRkRJUikpCi0JCWVycihFUlJP Ul9FWElULCAiJyVzJyBpcyBub3QgYSBkaXJlY3RvcnksIGJhaWxpbmcgb3V0IiwgQ1JPTkRJUik7 Ci0JaWYgKGNoZGlyKENST05ESVIpIDwgT0spCi0JCWVycihFUlJPUl9FWElULCAiY2Fubm90IGNo ZGlyKCVzKSwgYmFpbGluZyBvdXQiLCBDUk9ORElSKTsKKwlpZiAoIVNfSVNESVIoc2Iuc3RfbW9k ZSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICInJXMnIGlzIG5vdCBhIGRpcmVjdG9yeSwgYmFpbGlu ZyBvdXQuXG4iLAorCQkJQ1JPTkRJUik7CisJCWV4aXQoRVJST1JfRVhJVCk7CisJfQorCWlmIChj aGRpcihDUk9ORElSKSA8IE9LKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY2Fubm90IGNoZGlyKCVz KSwgYmFpbGluZyBvdXQuXG4iLCBDUk9ORElSKTsKKwkJcGVycm9yKENST05ESVIpOworCQlleGl0 KEVSUk9SX0VYSVQpOworCX0KIAogCS8qIENST05ESVIgb2theSAobm93PT1DV0QpLCBub3cgbG9v ayBhdCBTUE9PTF9ESVIgKCJ0YWJzIiBvciBzb21lIHN1Y2gpCiAJICovCiAJaWYgKHN0YXQoU1BP T0xfRElSLCAmc2IpIDwgT0sgJiYgZXJybm8gPT0gRU5PRU5UKSB7Ci0JCXdhcm4oIiVzIiwgU1BP T0xfRElSKTsKKwkJcGVycm9yKFNQT09MX0RJUik7CiAJCWlmIChPSyA9PSBta2RpcihTUE9PTF9E SVIsIDA3MDApKSB7Ci0JCQl3YXJueCgiJXM6IGNyZWF0ZWQiLCBTUE9PTF9ESVIpOworCQkJZnBy aW50ZihzdGRlcnIsICIlczogY3JlYXRlZFxuIiwgU1BPT0xfRElSKTsKIAkJCXN0YXQoU1BPT0xf RElSLCAmc2IpOwogCQl9IGVsc2UgewotCQkJZXJyKEVSUk9SX0VYSVQsICIlczogbWtkaXIiLCBT UE9PTF9ESVIpOworCQkJZnByaW50ZihzdGRlcnIsICIlczogIiwgU1BPT0xfRElSKTsKKwkJCXBl cnJvcigibWtkaXIiKTsKKwkJCWV4aXQoRVJST1JfRVhJVCk7CiAJCX0KIAl9Ci0JaWYgKCEoc2Iu c3RfbW9kZSAmIFNfSUZESVIpKQotCQllcnIoRVJST1JfRVhJVCwgIiclcycgaXMgbm90IGEgZGly ZWN0b3J5LCBiYWlsaW5nIG91dCIsIFNQT09MX0RJUik7CisJaWYgKCFTX0lTRElSKHNiLnN0X21v ZGUpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiJyVzJyBpcyBub3QgYSBkaXJlY3RvcnksIGJhaWxp bmcgb3V0LlxuIiwKKwkJCVNQT09MX0RJUik7CisJCWV4aXQoRVJST1JfRVhJVCk7CisJfQorCWlm IChncnAgIT0gTlVMTCkgeworCQlpZiAoc2Iuc3RfZ2lkICE9IGdycC0+Z3JfZ2lkKQorCQkJY2hv d24oU1BPT0xfRElSLCAtMSwgZ3JwLT5ncl9naWQpOworCQlpZiAoc2Iuc3RfbW9kZSAhPSAwMTcz MCkKKwkJCWNobW9kKFNQT09MX0RJUiwgMDE3MzApOworCX0KIH0KIAotCiAvKiBnZXRfY2hhcihm aWxlKSA6IGxpa2UgZ2V0YygpIGJ1dCBpbmNyZW1lbnQgTGluZU51bWJlciBvbiBuZXdsaW5lcwog ICovCiBpbnQKLWdldF9jaGFyKGZpbGUpCi0JRklMRQkqZmlsZTsKLXsKLQlpbnQJY2g7CitnZXRf Y2hhcihGSUxFICpmaWxlKSB7CisJaW50IGNoOwogCiAJY2ggPSBnZXRjKGZpbGUpOwogCWlmIChj aCA9PSAnXG4nKQogCQlTZXRfTGluZU51bShMaW5lTnVtYmVyICsgMSkKLQlyZXR1cm4gY2g7CisJ cmV0dXJuIChjaCk7CiB9CiAKLQogLyogdW5nZXRfY2hhcihjaCwgZmlsZSkgOiBsaWtlIHVuZ2V0 YyBidXQgZG8gTGluZU51bWJlciBwcm9jZXNzaW5nCiAgKi8KIHZvaWQKLXVuZ2V0X2NoYXIoY2gs IGZpbGUpCi0JaW50CWNoOwotCUZJTEUJKmZpbGU7Ci17Cit1bmdldF9jaGFyKGludCBjaCwgRklM RSAqZmlsZSkgewogCXVuZ2V0YyhjaCwgZmlsZSk7CiAJaWYgKGNoID09ICdcbicpCiAJCVNldF9M aW5lTnVtKExpbmVOdW1iZXIgLSAxKQogfQogCi0KIC8qIGdldF9zdHJpbmcoc3RyLCBtYXgsIGZp bGUsIHRlcm1zdHIpIDogbGlrZSBmZ2V0cygpIGJ1dAogICoJCSgxKSBoYXMgdGVybWluYXRvciBz dHJpbmcgd2hpY2ggc2hvdWxkIGluY2x1ZGUgXG4KICAqCQkoMikgd2lsbCBhbHdheXMgbGVhdmUg cm9vbSBmb3IgdGhlIG51bGwKQEAgLTI1NywxMyArMjg5LDggQEAKICAqCQkoNCkgcmV0dXJucyBF T0Ygb3IgdGVybWluYXRpbmcgY2hhcmFjdGVyLCB3aGljaGV2ZXIKICAqLwogaW50Ci1nZXRfc3Ry aW5nKHN0cmluZywgc2l6ZSwgZmlsZSwgdGVybXMpCi0JY2hhcgkqc3RyaW5nOwotCWludAlzaXpl OwotCUZJTEUJKmZpbGU7Ci0JY2hhcgkqdGVybXM7Ci17Ci0JaW50CWNoOworZ2V0X3N0cmluZyhj aGFyICpzdHJpbmcsIGludCBzaXplLCBGSUxFICpmaWxlLCBjaGFyICp0ZXJtcykgeworCWludCBj aDsKIAogCXdoaWxlIChFT0YgIT0gKGNoID0gZ2V0X2NoYXIoZmlsZSkpICYmICFzdHJjaHIodGVy bXMsIGNoKSkgewogCQlpZiAoc2l6ZSA+IDEpIHsKQEAgLTI3NSwxNyArMzAyLDE0IEBACiAJaWYg KHNpemUgPiAwKQogCQkqc3RyaW5nID0gJ1wwJzsKIAotCXJldHVybiBjaDsKKwlyZXR1cm4gKGNo KTsKIH0KIAotCiAvKiBza2lwX2NvbW1lbnRzKGZpbGUpIDogcmVhZCBwYXN0IGNvbW1lbnQgKGlm IGFueSkKICAqLwogdm9pZAotc2tpcF9jb21tZW50cyhmaWxlKQotCUZJTEUJKmZpbGU7Ci17Ci0J aW50CWNoOworc2tpcF9jb21tZW50cyhGSUxFICpmaWxlKSB7CisJaW50IGNoOwogCiAJd2hpbGUg KEVPRiAhPSAoY2ggPSBnZXRfY2hhcihmaWxlKSkpIHsKIAkJLyogY2ggaXMgbm93IHRoZSBmaXJz dCBjaGFyYWN0ZXIgb2YgYSBsaW5lLgpAQCAtMzE4LDkyICszNDIsODcgQEAKIAkJdW5nZXRfY2hh cihjaCwgZmlsZSk7CiB9CiAKLQotLyogaW50IGluX2ZpbGUoY2hhciAqc3RyaW5nLCBGSUxFICpm aWxlKQorLyogaW50IGluX2ZpbGUoY29uc3QgY2hhciAqc3RyaW5nLCBGSUxFICpmaWxlLCBpbnQg ZXJyb3IpCiAgKglyZXR1cm4gVFJVRSBpZiBvbmUgb2YgdGhlIGxpbmVzIGluIGZpbGUgbWF0Y2hl cyBzdHJpbmcgZXhhY3RseSwKLSAqCUZBTFNFIG90aGVyd2lzZS4KKyAqCUZBTFNFIGlmIG5vIGxp bmVzIG1hdGNoLCBhbmQgZXJyb3Igb24gZXJyb3IuCiAgKi8KIHN0YXRpYyBpbnQKLWluX2ZpbGUo Y2hhciAqc3RyaW5nLCBGSUxFICpmaWxlKQoraW5fZmlsZShjb25zdCBjaGFyICpzdHJpbmcsIEZJ TEUgKmZpbGUsIGludCBlcnJvcikKIHsKIAljaGFyIGxpbmVbTUFYX1RFTVBTVFJdOworCWNoYXIg KmVuZHA7CiAKLQlyZXdpbmQoZmlsZSk7CisJaWYgKGZzZWVrKGZpbGUsIDBMLCBTRUVLX1NFVCkp CisJCXJldHVybiAoZXJyb3IpOwogCXdoaWxlIChmZ2V0cyhsaW5lLCBNQVhfVEVNUFNUUiwgZmls ZSkpIHsKLQkJaWYgKGxpbmVbMF0gIT0gJ1wwJykKLQkJCWlmIChsaW5lW3N0cmxlbihsaW5lKS0x XSA9PSAnXG4nKQotCQkJCWxpbmVbc3RybGVuKGxpbmUpLTFdID0gJ1wwJzsKLQkJaWYgKDAgPT0g c3RyY21wKGxpbmUsIHN0cmluZykpCi0JCQlyZXR1cm4gVFJVRTsKKwkJaWYgKGxpbmVbMF0gIT0g J1wwJykgeworCQkJZW5kcCA9ICZsaW5lW3N0cmxlbihsaW5lKSAtIDFdOworCQkJaWYgKCplbmRw ICE9ICdcbicpCisJCQkJcmV0dXJuIChlcnJvcik7CisJCQkqZW5kcCA9ICdcMCc7CisJCQlpZiAo MCA9PSBzdHJjbXAobGluZSwgc3RyaW5nKSkKKwkJCQlyZXR1cm4gKFRSVUUpOworCQl9CiAJfQot CXJldHVybiBGQUxTRTsKKwlpZiAoZmVycm9yKGZpbGUpKQorCQlyZXR1cm4gKGVycm9yKTsKKwly ZXR1cm4gKEZBTFNFKTsKIH0KIAotCiAvKiBpbnQgYWxsb3dlZChjaGFyICp1c2VybmFtZSkKLSAq CXJldHVybnMgVFJVRSBpZiAoQUxMT1dfRklMRSBleGlzdHMgYW5kIHVzZXIgaXMgbGlzdGVkKQot ICoJb3IgKERFTllfRklMRSBleGlzdHMgYW5kIHVzZXIgaXMgTk9UIGxpc3RlZCkKLSAqCW9yIChu ZWl0aGVyIGZpbGUgZXhpc3RzIGJ1dCB1c2VyPT0icm9vdCIgc28gaXQncyBva2F5KQorICogICAg ICByZXR1cm5zIFRSVUUgaWYgKEFMTE9XX0ZJTEUgZXhpc3RzIGFuZCB1c2VyIGlzIGxpc3RlZCkK KyAqICAgICAgb3IgKERFTllfRklMRSBleGlzdHMgYW5kIHVzZXIgaXMgTk9UIGxpc3RlZCkKKyAq ICAgICAgb3IgKG5laXRoZXIgZmlsZSBleGlzdHMgYnV0IHVzZXI9PSJyb290IiBzbyBpdCdzIG9r YXkpCiAgKi8KKwogaW50Ci1hbGxvd2VkKHVzZXJuYW1lKQotCWNoYXIgKnVzZXJuYW1lOworYWxs b3dlZChjaGFyICp1c2VybmFtZSkKIHsKLQlGSUxFCSphbGxvdywgKmRlbnk7Ci0JaW50CWlzYWxs b3dlZDsKKyAgICAgICAgRklMRSAgICAqYWxsb3csICpkZW55OworICAgICAgICBpbnQgICAgIGlz YWxsb3dlZDsKIAotCWlzYWxsb3dlZCA9IEZBTFNFOworICAgICAgICBpc2FsbG93ZWQgPSBGQUxT RTsKIAotCWRlbnkgPSBOVUxMOworICAgICAgICBkZW55ID0gTlVMTDsKICNpZiBkZWZpbmVkKEFM TE9XX0ZJTEUpICYmIGRlZmluZWQoREVOWV9GSUxFKQotCWlmICgoYWxsb3cgPSBmb3BlbihBTExP V19GSUxFLCAiciIpKSA9PSBOVUxMICYmIGVycm5vICE9IEVOT0VOVCkKLQkJZ290byBvdXQ7Ci0J aWYgKChkZW55ID0gZm9wZW4oREVOWV9GSUxFLCAiciIpKSA9PSBOVUxMICYmIGVycm5vICE9IEVO T0VOVCkKLQkJZ290byBvdXQ7Ci0JRGVidWcoRE1JU0MsICgiYWxsb3cvZGVueSBlbmFibGVkLCAl ZC8lZFxuIiwgISFhbGxvdywgISFkZW55KSkKKyAgICAgICAgaWYgKChhbGxvdyA9IGZvcGVuKEFM TE9XX0ZJTEUsICJyIikpID09IE5VTEwgJiYgZXJybm8gIT0gRU5PRU5UKQorICAgICAgICAgICAg ICAgIGdvdG8gb3V0OworICAgICAgICBpZiAoKGRlbnkgPSBmb3BlbihERU5ZX0ZJTEUsICJyIikp ID09IE5VTEwgJiYgZXJybm8gIT0gRU5PRU5UKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0Owor ICAgICAgICBEZWJ1ZyhETUlTQywgKCJhbGxvdy9kZW55IGVuYWJsZWQsICVkLyVkXG4iLCAhIWFs bG93LCAhIWRlbnkpKQogI2Vsc2UKLQlhbGxvdyA9IE5VTEw7CisgICAgICAgIGFsbG93ID0gTlVM TDsKICNlbmRpZgogCi0JaWYgKGFsbG93KQotCQlpc2FsbG93ZWQgPSBpbl9maWxlKHVzZXJuYW1l LCBhbGxvdyk7Ci0JZWxzZSBpZiAoZGVueSkKLQkJaXNhbGxvd2VkID0gIWluX2ZpbGUodXNlcm5h bWUsIGRlbnkpOwotCWVsc2UgeworICAgICAgICBpZiAoYWxsb3cpCisgICAgICAgICAgICAgICAg aXNhbGxvd2VkID0gaW5fZmlsZSh1c2VybmFtZSwgYWxsb3csIEZBTFNFKTsKKyAgICAgICAgZWxz ZSBpZiAoZGVueSkKKyAgICAgICAgICAgICAgICBpc2FsbG93ZWQgPSAhaW5fZmlsZSh1c2VybmFt ZSwgZGVueSwgRkFMU0UpOworICAgICAgICBlbHNlIHsKICNpZiBkZWZpbmVkKEFMTE9XX09OTFlf Uk9PVCkKLQkJaXNhbGxvd2VkID0gKHN0cmNtcCh1c2VybmFtZSwgUk9PVF9VU0VSKSA9PSAwKTsK KyAgICAgICAgICAgICAgICBpc2FsbG93ZWQgPSAoc3RyY21wKHVzZXJuYW1lLCBST09UX1VTRVIp ID09IDApOwogI2Vsc2UKLQkJaXNhbGxvd2VkID0gVFJVRTsgCisgICAgICAgICAgICAgICAgaXNh bGxvd2VkID0gVFJVRTsgCiAjZW5kaWYKLQl9Ci1vdXQ6CWlmIChhbGxvdykKLQkJZmNsb3NlKGFs bG93KTsKLQlpZiAoZGVueSkKLQkJZmNsb3NlKGRlbnkpOwotCXJldHVybiAoaXNhbGxvd2VkKTsK KyAgICAgICAgfQorb3V0OiAgICBpZiAoYWxsb3cpCisgICAgICAgICAgICAgICAgZmNsb3NlKGFs bG93KTsKKyAgICAgICAgaWYgKGRlbnkpCisgICAgICAgICAgICAgICAgZmNsb3NlKGRlbnkpOwor ICAgICAgICByZXR1cm4gKGlzYWxsb3dlZCk7CiB9CiAKLQogdm9pZAotbG9nX2l0KHVzZXJuYW1l LCB4cGlkLCBldmVudCwgZGV0YWlsKQotCWNoYXIJKnVzZXJuYW1lOwotCWludAl4cGlkOwotCWNo YXIJKmV2ZW50OwotCWNoYXIJKmRldGFpbDsKLXsKK2xvZ19pdChjb25zdCBjaGFyICp1c2VybmFt ZSwgUElEX1QgeHBpZCwgY29uc3QgY2hhciAqZXZlbnQsIGNvbnN0IGNoYXIgKmRldGFpbCkgewog I2lmIGRlZmluZWQoTE9HX0ZJTEUpIHx8IERFQlVHR0lORwotCVBJRF9UCQkJcGlkID0geHBpZDsK KwlQSURfVCBwaWQgPSB4cGlkOwogI2VuZGlmCiAjaWYgZGVmaW5lZChMT0dfRklMRSkKLQljaGFy CQkJKm1zZzsKLQlUSU1FX1QJCQlub3cgPSB0aW1lKChUSU1FX1QpIDApOwotCXJlZ2lzdGVyIHN0 cnVjdCB0bQkqdCA9IGxvY2FsdGltZSgmbm93KTsKKwljaGFyICptc2c7CisJVElNRV9UIG5vdyA9 IHRpbWUoKFRJTUVfVCkgMCk7CisJc3RydWN0IHRtICp0ID0gbG9jYWx0aW1lKCZub3cpOwogI2Vu ZGlmIC8qTE9HX0ZJTEUqLwogCi0jaWYgZGVmaW5lZChTWVNMT0cpCi0Jc3RhdGljIGludAkJc3lz bG9nX29wZW4gPSAwOwotI2VuZGlmCi0KICNpZiBkZWZpbmVkKExPR19GSUxFKQogCS8qIHdlIGFz c3VtZSB0aGF0IE1BWF9URU1QU1RSIHdpbGwgaG9sZCB0aGUgZGF0ZSwgdGltZSwgJnB1bmN0dWF0 aW9uLgogCSAqLwpAQCAtNDExLDkwICs0MzAsODkgQEAKIAkJICAgICArIHN0cmxlbihldmVudCkK IAkJICAgICArIHN0cmxlbihkZXRhaWwpCiAJCSAgICAgKyBNQVhfVEVNUFNUUik7Ci0KIAlpZiAo bXNnID09IE5VTEwpCi0JCXdhcm54KCJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBsb2cg bWVzc2FnZSIpOwotCWVsc2UgeworCQlyZXR1cm47CisKKwlpZiAoTG9nRkQgPCBPSykgeworCQlM b2dGRCA9IG9wZW4oTE9HX0ZJTEUsIE9fV1JPTkxZfE9fQVBQRU5EfE9fQ1JFQVQsIDA2MDApOwog CQlpZiAoTG9nRkQgPCBPSykgewotCQkJTG9nRkQgPSBvcGVuKExPR19GSUxFLCBPX1dST05MWXxP X0FQUEVORHxPX0NSRUFULCAwNjAwKTsKLQkJCWlmIChMb2dGRCA8IE9LKSB7Ci0JCQkJd2Fybigi Y2FuJ3Qgb3BlbiBsb2cgZmlsZSAlcyIsIExPR19GSUxFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJKHZv aWQpIGZjbnRsKExvZ0ZELCBGX1NFVEZELCAxKTsKLQkJCX0KKwkJCWZwcmludGYoc3RkZXJyLCAi JXM6IGNhbid0IG9wZW4gbG9nIGZpbGVcbiIsCisJCQkJUHJvZ3JhbU5hbWUpOworCQkJcGVycm9y KExPR19GSUxFKTsKKwkJfSBlbHNlIHsKKwkJCSh2b2lkKSBmY250bChMb2dGRCwgRl9TRVRGRCwg MSk7CiAJCX0KKwl9CiAKLQkJLyogd2UgaGF2ZSB0byBzcHJpbnRmKCkgaXQgYmVjYXVzZSBmcHJp bnRmKCkgZG9lc24ndCBhbHdheXMKLQkJICogd3JpdGUgZXZlcnl0aGluZyBvdXQgaW4gb25lIGNo dW5rIGFuZCB0aGlzIGhhcyB0byBiZQotCQkgKiBhdG9taWNhbGx5IGFwcGVuZGVkIHRvIHRoZSBs b2cgZmlsZS4KLQkJICovCi0JCXNwcmludGYobXNnLCAiJXMgKCUwMmQvJTAyZC0lMDJkOiUwMmQ6 JTAyZC0lZCkgJXMgKCVzKVxuIiwKLQkJCXVzZXJuYW1lLAotCQkJdC0+dG1fbW9uKzEsIHQtPnRt X21kYXksIHQtPnRtX2hvdXIsIHQtPnRtX21pbiwKLQkJCXQtPnRtX3NlYywgcGlkLCBldmVudCwg ZGV0YWlsKTsKLQotCQkvKiB3ZSBoYXZlIHRvIHJ1biBzdHJsZW4oKSBiZWNhdXNlIHNwcmludGYo KSByZXR1cm5zIChjaGFyKikKLQkJICogb24gb2xkIEJTRC4KLQkJICovCi0JCWlmIChMb2dGRCA8 IE9LIHx8IHdyaXRlKExvZ0ZELCBtc2csIHN0cmxlbihtc2cpKSA8IE9LKSB7Ci0JCQlpZiAoTG9n RkQgPj0gT0spCi0JCQkJd2FybigiJXMiLCBMT0dfRklMRSk7Ci0JCQl3YXJueCgiY2FuJ3Qgd3Jp dGUgdG8gbG9nIGZpbGUiKTsKLQkJCXdyaXRlKFNUREVSUiwgbXNnLCBzdHJsZW4obXNnKSk7Ci0J CX0KKwkvKiB3ZSBoYXZlIHRvIHNwcmludGYoKSBpdCBiZWNhdXNlIGZwcmludGYoKSBkb2Vzbid0 IGFsd2F5cyB3cml0ZQorCSAqIGV2ZXJ5dGhpbmcgb3V0IGluIG9uZSBjaHVuayBhbmQgdGhpcyBo YXMgdG8gYmUgYXRvbWljYWxseSBhcHBlbmRlZAorCSAqIHRvIHRoZSBsb2cgZmlsZS4KKwkgKi8K KwlzcHJpbnRmKG1zZywgIiVzICglMDJkLyUwMmQtJTAyZDolMDJkOiUwMmQtJWQpICVzICglcylc biIsCisJCXVzZXJuYW1lLAorCQl0LT50bV9tb24rMSwgdC0+dG1fbWRheSwgdC0+dG1faG91ciwg dC0+dG1fbWluLCB0LT50bV9zZWMsIHBpZCwKKwkJZXZlbnQsIGRldGFpbCk7CiAKLQkJZnJlZSht c2cpOworCS8qIHdlIGhhdmUgdG8gcnVuIHN0cmxlbigpIGJlY2F1c2Ugc3ByaW50ZigpIHJldHVy bnMgKGNoYXIqKSBvbiBvbGQgQlNECisJICovCisJaWYgKExvZ0ZEIDwgT0sgfHwgd3JpdGUoTG9n RkQsIG1zZywgc3RybGVuKG1zZykpIDwgT0spIHsKKwkJaWYgKExvZ0ZEID49IE9LKQorCQkJcGVy cm9yKExPR19GSUxFKTsKKwkJZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3Qgd3JpdGUgdG8gbG9n IGZpbGVcbiIsIFByb2dyYW1OYW1lKTsKKwkJd3JpdGUoU1RERVJSLCBtc2csIHN0cmxlbihtc2cp KTsKIAl9CisKKwlmcmVlKG1zZyk7CiAjZW5kaWYgLypMT0dfRklMRSovCiAKICNpZiBkZWZpbmVk KFNZU0xPRykKIAlpZiAoIXN5c2xvZ19vcGVuKSB7Ci0JCS8qIHdlIGRvbid0IHVzZSBMT0dfUElE IHNpbmNlIHRoZSBwaWQgcGFzc2VkIHRvIHVzIGJ5Ci0JCSAqIG91ciBjbGllbnQgbWF5IG5vdCBi ZSBvdXIgb3duLiAgdGhlcmVmb3JlIHdlIHdhbnQgdG8KLQkJICogcHJpbnQgdGhlIHBpZCBvdXJz ZWx2ZXMuCi0JCSAqLwogIyBpZmRlZiBMT0dfREFFTU9OCi0JCW9wZW5sb2coUHJvZ3JhbU5hbWUs IExPR19QSUQsIExPR19DUk9OKTsKKwkJb3BlbmxvZyhQcm9ncmFtTmFtZSwgTE9HX1BJRCwgRkFD SUxJVFkpOwogIyBlbHNlCiAJCW9wZW5sb2coUHJvZ3JhbU5hbWUsIExPR19QSUQpOwogIyBlbmRp ZgogCQlzeXNsb2dfb3BlbiA9IFRSVUU7CQkvKiBhc3N1bWUgb3BlbmxvZyBzdWNjZXNzICovCiAJ fQogCi0Jc3lzbG9nKExPR19JTkZPLCAiKCVzKSAlcyAoJXMpXG4iLCB1c2VybmFtZSwgZXZlbnQs IGRldGFpbCk7CisJc3lzbG9nKExPR19JTkZPLCAiKCVzKSAlcyAoJXMpIiwgdXNlcm5hbWUsIGV2 ZW50LCBkZXRhaWwpOwogCiAjZW5kaWYgLypTWVNMT0cqLwogCiAjaWYgREVCVUdHSU5HCiAJaWYg KERlYnVnRmxhZ3MpIHsKLQkJZnByaW50ZihzdGRlcnIsICJsb2dfaXQ6ICglcyAlZCkgJXMgKCVz KVxuIiwKLQkJCXVzZXJuYW1lLCBwaWQsIGV2ZW50LCBkZXRhaWwpOworCQlmcHJpbnRmKHN0ZGVy ciwgImxvZ19pdDogKCVzICVsZCkgJXMgKCVzKVxuIiwKKwkJCXVzZXJuYW1lLCAobG9uZylwaWQs IGV2ZW50LCBkZXRhaWwpOwogCX0KICNlbmRpZgogfQogCi0KIHZvaWQKLWxvZ19jbG9zZSgpIHsK K2xvZ19jbG9zZSh2b2lkKSB7CiAJaWYgKExvZ0ZEICE9IEVSUikgewogCQljbG9zZShMb2dGRCk7 CiAJCUxvZ0ZEID0gRVJSOwogCX0KKyNpZiBkZWZpbmVkKFNZU0xPRykKKwljbG9zZWxvZygpOwor CXN5c2xvZ19vcGVuID0gRkFMU0U7CisjZW5kaWYgLypTWVNMT0cqLwogfQogCi0KLS8qIHR3byB3 YXJuaW5nczoKKy8qIGNoYXIgKmZpcnN0X3dvcmQoY2hhciAqcywgY2hhciAqdCkKKyAqCXJldHVy biBwb2ludGVyIHRvIGZpcnN0IHdvcmQKKyAqIHBhcmFtZXRlcnM6CisgKglzIC0gc3RyaW5nIHdl IHdhbnQgdGhlIGZpcnN0IHdvcmQgb2YKKyAqCXQgLSB0ZXJtaW5hdG9ycywgaW1wbGljaXRseSBp bmNsdWRpbmcgXDAKKyAqIHdhcm5pbmdzOgogICoJKDEpIHRoaXMgcm91dGluZSBpcyBmYWlybHkg c2xvdwogICoJKDIpIGl0IHJldHVybnMgYSBwb2ludGVyIHRvIHN0YXRpYyBzdG9yYWdlCiAgKi8K IGNoYXIgKgotZmlyc3Rfd29yZChzLCB0KQotCXJlZ2lzdGVyIGNoYXIgKnM7CS8qIHN0cmluZyB3 ZSB3YW50IHRoZSBmaXJzdCB3b3JkIG9mICovCi0JcmVnaXN0ZXIgY2hhciAqdDsJLyogdGVybWlu YXRvcnMsIGltcGxpY2l0bHkgaW5jbHVkaW5nIFwwICovCi17CitmaXJzdF93b3JkKGNoYXIgKnMs IGNoYXIgKnQpIHsKIAlzdGF0aWMgY2hhciByZXRidWZbMl1bTUFYX1RFTVBTVFIgKyAxXTsJLyog c3VyZSB3aXNoIEMgaGFkIEdDICovCiAJc3RhdGljIGludCByZXRzZWwgPSAwOwotCXJlZ2lzdGVy IGNoYXIgKnJiLCAqcnA7CisJY2hhciAqcmIsICpycDsKIAogCS8qIHNlbGVjdCBhIHJldHVybiBi dWZmZXIgKi8KIAlyZXRzZWwgPSAxLXJldHNlbDsKQEAgLTUxMywxOSArNTMxLDIzIEBACiAKIAkv KiBmaW5pc2ggdGhlIHJldHVybi1zdHJpbmcgYW5kIHJldHVybiBpdCAqLwogCSpycCA9ICdcMCc7 Ci0JcmV0dXJuIHJiOworCXJldHVybiAocmIpOwogfQogCi0KIC8qIHdhcm5pbmc6CiAgKgloZWF2 aWx5IGFzY2lpLWRlcGVuZGVudC4KICAqLwotc3RhdGljIHZvaWQKLW1rcHJpbnQocmVnaXN0ZXIg Y2hhciAqZHN0LCByZWdpc3RlciB1bnNpZ25lZCBjaGFyICpzcmMsIHJlZ2lzdGVyIGludCBsZW4p Cit2b2lkCitta3ByaW50KGNoYXIgKmRzdCwgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgbGVuKQog eworCS8qCisJICogWFhYCisJICogV2Uga25vdyB0aGlzIHJvdXRpbmUgY2FuJ3Qgb3ZlcmZsb3cg dGhlIGRzdCBidWZmZXIgYmVjYXVzZSBta3ByaW50cygpCisJICogYWxsb2NhdGVkIGVub3VnaCBz cGFjZSBmb3IgdGhlIHdvcnN0IGNhc2UuCisJICovCiAJd2hpbGUgKGxlbi0tID4gMCkKIAl7Ci0J CXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgY2ggPSAqc3JjKys7CisJCXVuc2lnbmVkIGNoYXIgY2gg PSAqc3JjKys7CiAKIAkJaWYgKGNoIDwgJyAnKSB7CQkJLyogY29udHJvbCBjaGFyYWN0ZXIgKi8K IAkJCSpkc3QrKyA9ICdeJzsKQEAgLTU0Myw1OCArNTY1LDE3NSBAQAogCSpkc3QgPSAnXDAnOwog fQogCi0KIC8qIHdhcm5pbmc6CiAgKglyZXR1cm5zIGEgcG9pbnRlciB0byBtYWxsb2MnZCBzdG9y YWdlLCB5b3UgbXVzdCBjYWxsIGZyZWUgeW91cnNlbGYuCiAgKi8KIGNoYXIgKgogbWtwcmludHMo c3JjLCBsZW4pCi0JcmVnaXN0ZXIgdW5zaWduZWQgY2hhciAqc3JjOwotCXJlZ2lzdGVyIHVuc2ln bmVkIGludCBsZW47CisJdW5zaWduZWQgY2hhciAqc3JjOworCXVuc2lnbmVkIGludCBsZW47CiB7 Ci0JcmVnaXN0ZXIgY2hhciAqZHN0ID0gbWFsbG9jKGxlbio0ICsgMSk7CisJY2hhciAqZHN0ID0g bWFsbG9jKGxlbio0ICsgMSk7CiAKLQlpZiAoZHN0ICE9IE5VTEwpCisJaWYgKGRzdCkKIAkJbWtw cmludChkc3QsIHNyYywgbGVuKTsKIAotCXJldHVybiBkc3Q7CisJcmV0dXJuIChkc3QpOwogfQog Ci0KICNpZmRlZiBNQUlMX0RBVEUKLS8qIFNhdCwgMjcgRmViIDkzIDExOjQ0OjUxIENTVAotICog MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3CisvKiBTYXQsIDI3IEZlYiAxOTkzIDExOjQ0OjUx IC0wODAwIChDU1QpCisgKiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3CiAg Ki8KIGNoYXIgKgogYXJwYWRhdGUoY2xvY2spCiAJdGltZV90ICpjbG9jazsKIHsKLQl0aW1lX3Qg dCA9IGNsb2NrID8qY2xvY2sgOnRpbWUoMEwpOwotCXN0cnVjdCB0bSAqdG0gPSBsb2NhbHRpbWUo JnQpOwotCXN0YXRpYyBjaGFyIHJldFszMl07CS8qIHpvbmUgbmFtZSBtaWdodCBiZSA+MyBjaGFy cyAqLwotCi0JaWYgKHRtLT50bV95ZWFyID49IDEwMCkKLQkJdG0tPnRtX3llYXIgKz0gMTkwMDsK LQotCSh2b2lkKSBzbnByaW50ZihyZXQsIHNpemVvZihyZXQpLCAiJXMsICUyZCAlcyAlZCAlMDJk OiUwMmQ6JTAyZCAlcyIsCi0JCSAgICAgICBEb3dOYW1lc1t0bS0+dG1fd2RheV0sCi0JCSAgICAg ICB0bS0+dG1fbWRheSwKLQkJICAgICAgIE1vbnRoTmFtZXNbdG0tPnRtX21vbl0sCi0JCSAgICAg ICB0bS0+dG1feWVhciwKLQkJICAgICAgIHRtLT50bV9ob3VyLAotCQkgICAgICAgdG0tPnRtX21p biwKLQkJICAgICAgIHRtLT50bV9zZWMsCisJdGltZV90IHQgPSBjbG9jayA/ICpjbG9jayA6IHRp bWUoKFRJTUVfVCkgMCk7CisJc3RydWN0IHRtIHRtID0gKmxvY2FsdGltZSgmdCk7CisJbG9uZyBn bXRvZmYgPSBnZXRfZ210b2ZmKCZ0LCAmdG0pOworCWludCBob3VycyA9IGdtdG9mZiAvIFNFQ09O RFNfUEVSX0hPVVI7CisJaW50IG1pbnV0ZXMgPSAoZ210b2ZmIC0gKGhvdXJzICogU0VDT05EU19Q RVJfSE9VUikpIC8gU0VDT05EU19QRVJfTUlOVVRFOworCXN0YXRpYyBjaGFyIHJldFs2NF07CS8q IHpvbmUgbmFtZSBtaWdodCBiZSA+MyBjaGFycyAqLworCQorCSh2b2lkKSBzcHJpbnRmKHJldCwg IiVzLCAlMmQgJXMgJTJkICUwMmQ6JTAyZDolMDJkICUuMmQlLjJkICglcykiLAorCQkgICAgICAg RG93TmFtZXNbdG0udG1fd2RheV0sCisJCSAgICAgICB0bS50bV9tZGF5LAorCQkgICAgICAgTW9u dGhOYW1lc1t0bS50bV9tb25dLAorCQkgICAgICAgdG0udG1feWVhciArIDE5MDAsCisJCSAgICAg ICB0bS50bV9ob3VyLAorCQkgICAgICAgdG0udG1fbWluLAorCQkgICAgICAgdG0udG1fc2VjLAor CQkgICAgICAgaG91cnMsCisJCSAgICAgICBtaW51dGVzLAogCQkgICAgICAgVFpPTkUoKnRtKSk7 Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gKHJldCk7CiB9CiAjZW5kaWYgLypNQUlMX0RBVEUqLwog Ci0KICNpZmRlZiBIQVZFX1NBVkVEX1VJRFMKLXN0YXRpYyBpbnQgc2F2ZV9ldWlkOwotaW50IHN3 YXBfdWlkcygpIHsgc2F2ZV9ldWlkID0gZ2V0ZXVpZCgpOyByZXR1cm4gc2V0ZXVpZChnZXR1aWQo KSk7IH0KLWludCBzd2FwX3VpZHNfYmFjaygpIHsgcmV0dXJuIHNldGV1aWQoc2F2ZV9ldWlkKTsg fQorc3RhdGljIHVpZF90IHNhdmVfZXVpZDsKK3N0YXRpYyBnaWRfdCBzYXZlX2VnaWQ7CisKK2lu dCBzd2FwX3VpZHModm9pZCkgeworCXNhdmVfZWdpZCA9IGdldGVnaWQoKTsKKwlzYXZlX2V1aWQg PSBnZXRldWlkKCk7CisJcmV0dXJuICgoc2V0ZWdpZChnZXRnaWQoKSkgfHwgc2V0ZXVpZChnZXR1 aWQoKSkpID8gLTEgOiAwKTsKK30KKworaW50IHN3YXBfdWlkc19iYWNrKHZvaWQpIHsKKwlyZXR1 cm4gKChzZXRlZ2lkKGdldGdpZCgpKSB8fCBzZXRldWlkKGdldHVpZCgpKSkgPyAtMSA6IDApOwor fQorCiAjZWxzZSAvKkhBVkVfU0FWRURfVUlEUyovCi1pbnQgc3dhcF91aWRzKCkgeyByZXR1cm4g c2V0cmV1aWQoZ2V0ZXVpZCgpLCBnZXR1aWQoKSk7IH0KLWludCBzd2FwX3VpZHNfYmFjaygpIHsg cmV0dXJuIHN3YXBfdWlkcygpOyB9CisKK2ludCBzd2FwX3VpZHModm9pZCkgeworCXJldHVybiAo KHNldHJlZ2lkKGdldGVnaWQoKSwgZ2V0Z2lkKCkpIHx8IHNldHJldWlkKGdldGV1aWQoKSwgZ2V0 dWlkKCkpKQorCSAgICA/IC0xIDogMCk7Cit9CisKK2ludCBzd2FwX3VpZHNfYmFjayh2b2lkKSB7 CisJcmV0dXJuIChzd2FwX3VpZHMoKSk7Cit9CiAjZW5kaWYgLypIQVZFX1NBVkVEX1VJRFMqLwor CitzaXplX3QKK3N0cmxlbnMoY29uc3QgY2hhciAqbGFzdCwgLi4uKSB7CisJdmFfbGlzdCBhcDsK KwlzaXplX3QgcmV0ID0gMDsKKwljb25zdCBjaGFyICpzdHI7CisKKwl2YV9zdGFydChhcCwgbGFz dCk7CisJZm9yIChzdHIgPSBsYXN0OyBzdHIgIT0gTlVMTDsgc3RyID0gdmFfYXJnKGFwLCBjb25z dCBjaGFyICopKQorCQlyZXQgKz0gc3RybGVuKHN0cik7CisJdmFfZW5kKGFwKTsKKwlyZXR1cm4g KHJldCk7Cit9CisKKy8qIFJldHVybiB0aGUgb2Zmc2V0IGZyb20gR01UIGluIHNlY29uZHMgKGFs Z29yaXRobSB0YWtlbiBmcm9tIHNlbmRtYWlsKS4KKyAqCisgKiB3YXJuaW5nOgorICoJY2xvYmJl cnMgdGhlIHN0YXRpYyBzdG9yYWdlIHNwYWNlIHVzZWQgYnkgbG9jYWx0aW1lKCkgYW5kIGdtdGlt ZSgpLgorICoJSWYgdGhlIGxvY2FsIHBvaW50ZXIgaXMgbm9uLU5VTEwgaXQgKm11c3QqIHBvaW50 IHRvIGEgbG9jYWwgY29weS4KKyAqLworI2lmbmRlZiBIQVZFX1RNX0dNVE9GRgorbG9uZyBnZXRf Z210b2ZmKHRpbWVfdCAqY2xvY2ssIHN0cnVjdCB0bSAqbG9jYWwpCit7CisJc3RydWN0IHRtIGdt dDsKKwlsb25nIG9mZnNldDsKKworCWdtdCA9ICpnbXRpbWUoY2xvY2spOworCWlmIChsb2NhbCA9 PSBOVUxMKQorCQlsb2NhbCA9IGxvY2FsdGltZShjbG9jayk7CisKKwlvZmZzZXQgPSAobG9jYWwt PnRtX3NlYyAtIGdtdC50bV9zZWMpICsKKwkgICAgKChsb2NhbC0+dG1fbWluIC0gZ210LnRtX21p bikgKiA2MCkgKworCSAgICAoKGxvY2FsLT50bV9ob3VyIC0gZ210LnRtX2hvdXIpICogMzYwMCk7 CisKKwkvKiBUaW1lem9uZSBtYXkgY2F1c2UgeWVhciByb2xsb3ZlciB0byBoYXBwZW4gb24gYSBk aWZmZXJlbnQgZGF5LiAqLworCWlmIChsb2NhbC0+dG1feWVhciA8IGdtdC50bV95ZWFyKQorCQlv ZmZzZXQgLT0gMjQgKiAzNjAwOworCWVsc2UgaWYgKGxvY2FsLT50bV95ZWFyID4gZ210LnRtX3ll YXIpCisJCW9mZnNldCAtPSAyNCAqIDM2MDA7CisJZWxzZSBpZiAobG9jYWwtPnRtX3lkYXkgPCBn bXQudG1feWRheSkKKwkJb2Zmc2V0IC09IDI0ICogMzYwMDsKKwllbHNlIGlmIChsb2NhbC0+dG1f eWRheSA+IGdtdC50bV95ZGF5KQorCQlvZmZzZXQgKz0gMjQgKiAzNjAwOworCisJcmV0dXJuIChv ZmZzZXQpOworfQorI2VuZGlmIC8qIEhBVkVfVE1fR01UT0ZGICovCisKK2ludAorb3Blbl9zb2Nr ZXQodm9pZCkKK3sKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgIHNvY2s7CisgICAgICAgIG1v ZGVfdCAgICAgICAgICAgICBvbWFzazsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyX3VuIHNfdW47 CisKKyAgICAgICAgc29jayA9IHNvY2tldChQRl9MT0NBTCwgU09DS19TVFJFQU0sIDApOworICAg ICAgICBpZiAoc29jayA9PSAtMSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAi JXM6IGNhbid0IGNyZWF0ZSBzb2NrZXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBQcm9n cmFtTmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBleGl0KEVYSVRfRkFJ TFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZjbnRsKHNvY2ssIEZfU0VURkQsIEZEX0NM T0VYRUMpID09IC0xKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2Fu J3QgbWFrZSBzb2NrZXQgY2xvc2Ugb24gZXhlYzogJXNcbiIsCisgICAgICAgICAgICAgICAgICAg IFByb2dyYW1OYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgICAgIGV4aXQoRVhJ VF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmNudGwoc29jaywgRl9TRVRGTCwg T19OT05CTE9DSykgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVz OiBjYW4ndCBtYWtlIHNvY2tldCBub24tYmxvY2tpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAg ICAgICBQcm9ncmFtTmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICBleGl0 KEVYSVRfRkFJTFVSRSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KCZzX3VuLCAnXDAnLCBz aXplb2Yoc191bikpOworICAgICAgICBpZiAoKHVuc2lnbmVkIGxvbmcpc25wcmludGYoc191bi5z dW5fcGF0aCwgc2l6ZW9mKHNfdW4uc3VuX3BhdGgpLCAiJXMvJXMvJXMiLAorICAgICAgICAgICAg ICBDUk9ORElSLCBTUE9PTF9ESVIsIFNPQ0tGSUxFKSA+PSBzaXplb2Yoc191bi5zdW5fcGF0aCkp IHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzLyVzOiBwYXRoIHRvbyBsb25n XG4iLCBDUk9ORElSLCBTT0NLRklMRSk7CisgICAgICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxV UkUpOworICAgICAgICB9CisgICAgICAgIHVubGluayhzX3VuLnN1bl9wYXRoKTsKKyAgICAgICAg c191bi5zdW5fZmFtaWx5ID0gUEZfTE9DQUw7CisjaWZkZWYgU1VOX0xFTgorICAgICAgICBzX3Vu LnN1bl9sZW4gPSBTVU5fTEVOKCZzX3VuKTsKKyNlbmRpZgorCisgICAgICAgIG9tYXNrID0gdW1h c2soMDA3KTsKKyAgICAgICAgaWYgKGJpbmQoc29jaywgKHN0cnVjdCBzb2NrYWRkciAqKSZzX3Vu LCBzaXplb2Yoc191bikpKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczog Y2FuJ3QgYmluZCBzb2NrZXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBQcm9ncmFtTmFt ZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICB1bWFzayhvbWFzayk7CisgICAg ICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOworICAgICAgICB9CisgICAgICAgIHVtYXNr KG9tYXNrKTsKKyAgICAgICAgaWYgKGxpc3Rlbihzb2NrLCBTT01BWENPTk4pKSB7CisgICAgICAg ICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY2FuJ3QgbGlzdGVuIG9uIHNvY2tldDogJXNc biIsCisgICAgICAgICAgICAgICAgICAgIFByb2dyYW1OYW1lLCBzdHJlcnJvcihlcnJubykpOwor ICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBj aG1vZChzX3VuLnN1bl9wYXRoLCAwNjYwKTsKKworICAgICAgICByZXR1cm4oc29jayk7Cit9CisK --089e0111c08a47d11f04fb9e10f8--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAN3T69vCQTb1hU%2BAUKg%2BKLgsuCttLxYS6u2r9k3w5LM2D4zZoA>