Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1vHRhA-007aPX-Gy for pgsql-hackers@arkaria.postgresql.org; Fri, 07 Nov 2025 19:00:25 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1vHRh7-00GDrJ-DU for pgsql-hackers@arkaria.postgresql.org; Fri, 07 Nov 2025 19:00:21 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1vHRh6-00GDrB-AI for pgsql-hackers@lists.postgresql.org; Fri, 07 Nov 2025 19:00:21 +0000 Received: from fhigh-a6-smtp.messagingengine.com ([103.168.172.157]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vHRh2-006Xe9-0c for pgsql-hackers@postgresql.org; Fri, 07 Nov 2025 19:00:19 +0000 Received: from phl-compute-05.internal (phl-compute-05.internal [10.202.2.45]) by mailfhigh.phl.internal (Postfix) with ESMTP id 797DB1400204 for ; Fri, 7 Nov 2025 14:00:13 -0500 (EST) Received: from phl-imap-16 ([10.202.2.88]) by phl-compute-05.internal (MEProxy); Fri, 07 Nov 2025 14:00:13 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm3; t=1762542013; x=1762628413; bh=r+5DpEloPl E7h1UDG5PEraSadziGXSIpzWOxcqvXY34=; b=dzde0I5idVBEnnFI5iihuMwUl4 fL9XPX4X8p4YZVE2TrQSol6FfmSupAhFh4X02PZSKuddJJ9DoLSPWKargZ/oypT6 eC1jtOs4CaBm9tLDcMhYRhojoaLZyGXnqxvmcD5EPI7MfN6mz0f3EPMqST/K2orB jle9FsqGnDm9NAe4QUFzofj1xDNeol40Ksu4o/FDmoGa0Urx0zWtpZ/IOIqpE9px Z7dsRIgUeY5pVFHi5PrifBFCNNZnoxkSZ7NWQFV9NvdheVEr1AQyRDxSSv/MjYFi nvDusLm4Ld3otjqBVGfd9HoCVn2b+ulkSfCVFPfzgj+ger3OrtkqrCBx7rwQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t= 1762542013; x=1762628413; bh=r+5DpEloPlE7h1UDG5PEraSadziGXSIpzWO xcqvXY34=; b=raplRhaUOwyGqypAQtux0oYT6wRNHzHi75efvbTVbOtvMLNhVzf MjbPoni6QcId0xL8r1ke7T/98c5pypThTKxASru85cMFT69gkR9An6qlHqz/HY08 BWes2YQG5Pc6rklV4uV4p6mTDN341m60erubkCRNGcv2jq6ltkttgL9h3AVhX7fJ TyTjVi84WN5YDm7RFsYRs0g7NlPa/N7afNfSN2yAFFi5ll+O0MYtZK2bVwFRsRD0 bmMfsDQ2LLZryLqy0CtS0BOfxUe3Vl62t2JTvTUwryi9npgPxh6XKhNQHuk+8xEe dZeNC7jpZG9tQryBKzN8rf5HfcYfBkl+dmw== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdeggdduledtgeegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucenucfjughrpefoggffhffvkfgjfhfutgesmhdtreerre dtjeenucfhrhhomhepfdflohgvlhculfgrtghosghsohhnfdcuoehjohgvlhestghomhhp ihhlvghrrdhorhhgqeenucggtffrrghtthgvrhhnpedvtedvkeffkeeljefgieeijeffie fgudffveeuueevhfethfdvjedtgfeuvdfhieenucevlhhushhtvghrufhiiigvpedtnecu rfgrrhgrmhepmhgrihhlfhhrohhmpehjohgvlhestghomhhpihhlvghrrdhorhhgpdhnsg gprhgtphhtthhopedupdhmohguvgepshhmthhpohhuthdprhgtphhtthhopehpghhsqhhl qdhhrggtkhgvrhhssehpohhsthhgrhgvshhqlhdrohhrgh X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id D71522CC0054; Fri, 7 Nov 2025 14:00:12 -0500 (EST) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 X-ThreadId: AE1r89ybsZ1g Date: Fri, 07 Nov 2025 19:59:41 +0100 From: "Joel Jacobson" To: pgsql-hackers Message-Id: In-Reply-To: References: <6899c044-4a82-49be-8117-e6f669765f7e@app.fastmail.com> <165530.1752362320@sss.pgh.pa.us> <02a7cd37-e2fc-4212-8b19-f8c239c95fb8@app.fastmail.com> <96f00bf1-cc9d-4520-9d02-9e14e7767c88@app.fastmail.com> <30c2aa7d-dd6c-4b68-a2e4-f217a1a34acf@app.fastmail.com> <0b4d402a-9ac2-4aa8-acf8-8231dbe579ea@app.fastmail.com> <3095599.1758644879@sss.pgh.pa.us> <0dc6a2cc-5216-4dc1-9dd2-430cafc6095b@app.fastmail.com> <52CC167F-763B-4ECA-B0B4-DAB381816828@gmail.com> <9186C6D0-F7A9-482A-9183-89E530B57E36@gmail.com> <1073593.1759423179@sss.pgh.pa.us> <4bd5e6c4-6fa7-44bb-869d-59a32a331fa8@app.fastmail.com> <85828f29-e72e-4400-94f3-9a69bc8dc239@app.fastmail.com> <2495353.1759860890@sss.pgh.pa.us> <8aeae418-92a6-4bbd-9c06-9574c79e59f7@app.fastmail.com> <2531672.1759868124@sss.pgh.pa.us> <474efa78-337c-41cd-a73a-f845a0115109@app.fastmail.com> <2749343.1759949176@sss.pgh.pa.us> <8bfca2be-1ec0-4e15-aafb-0b7b661fe936@app.fastmail.com> <9eba307f-f2fb-48f0-9507-2e197f39ef9e@app.fastmail.com> <8c71183a-0d28-4bcf-a806-78446ff95404@app.fastmail.com> <1009807.1760476747@sss.pgh.pa.us> <1F7227F5-C33D-4E2C-8511-33F1468590D0@gmail.com> <0a5a20d3-4621-46b3-b2ab-903f63a20dea@app.fastmail.com> <6F913129-ABEF-4004-AAF3-F22FC34!29AE8@gmail.com> <1547585.1760645808@sss.pgh.pa.us> <14865EB6-0BF4-462B-9072-10BDAC10C052@gmail.com> <0BCA1C2D-B92C-459E-B1A6-6D06BA4C62CF@gmail.com> <55d24cbb-e9ef-491f-a99b-b3dbd7cecdf9@app.fastmail.com> <38574cad-e90d-47b7-a015-753bb6bbc360@app.fastmail.com> <66631FB7-5BEA-4ED5-A694-9AD8B9CCFEE8@gmail.com> <4b7b49a5-5e1a-44a8-93e0-60457d15cb1d@app.fastmail.com> <82DEA2B6-6FC5-4A79-BDE3-1FD72F104A6E@gmail.com> <38de1036-d8cf-420c-b845-edb5a946b191@app.fastmail.com> <87E40BF8-8877-4DBD-9040-99AF8A4E6358@gmail.com> <7556f0d4-03fd-451a-bd34-5f62b424319a@app.fastmail.com> <290910DE-9A03-4AE6-B348-073D5DA96ACC@gmail.com> <4B243750-12BE-4C16-A769-A803268F40E3@gmail.com> <4605CAD6-69D5-4082-B96C-91FC0DE5399D@gmail.com> Subject: Re: Optimize LISTEN/NOTIFY Content-Type: multipart/mixed; boundary=86e7cd31e6424024be1d558339921d90 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --86e7cd31e6424024be1d558339921d90 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On Thu, Nov 6, 2025, at 09:33, Joel Jacobson wrote: > On Thu, Nov 6, 2025, at 00:21, Chao Li wrote: >> That=E2=80=99s what we don=E2=80=99t know. We now lack a performance = test for=20 >> evaluating how =E2=80=9Cdirect advancement=E2=80=9D efficiently helps= if it only=20 >> handles sleeping listeners. So what I was suggesting is that we shoul= d=20 >> first create some tests, maybe also add a few more statistics, so tha= t=20 >> we can evaluate different solutions. If a simple implementation that=20 >> only handles sleeping listeners would have performed good enough, of=20 >> course we can take it; otherwise we may need to either pursue a bette= r=20 >> solution. Changes since v23: * The advancingPos flag has been split into two fields: bool isAdvancing: indicates if a backend is currently advancing QueuePosition advancingPos: the target position the backend will adv= ance to * The logic in SignalBackends has been reworked and simplified, thanks to the new isAdvancing and advancingPos fields. I now think it's finally easy to reason about why each branch in SignalBackends must be correct. I've also attached 0003-optimize_listen_notify-v24.txt that adds instrumentation that can then be used together with the benchmark/correctness tool pg_async_notify_test-v24.c. This has been very helpful to me, to develop an intuition for its concurrency behavior. I hope it can help others as well. The 0003 patch is only for testing and not part of the patchset, hence the .txt. % gcc -Wall -Wextra -O2 -pthread \ -I$(pg_config --includedir-server) \ -I$(pg_config --includedir) \ -L$(pg_config --libdir) \ -o pg_async_notify_test-v24 pg_async_notify_test-v24.c \ -lpq -pthread -lm % ./pg_async_notify_test-v24 --listeners 10 --notifiers 10 --channels 10= --duration 10 10 s: 301622 sent (29409/s), 3015940 received (294185/s) Notification Latency Distribution: 0.00-0.01ms 0 (0.0%) avg: 0.000ms 0.01-0.10ms # 25 (0.0%) avg: 0.074ms 0.10-1.00ms # 289 (0.0%) avg: 0.461ms 1.00-10.00ms ######### 2824257 (93.6%) avg: 4.193ms 10.00-100.00ms # 189923 (6.3%) avg: 24.893ms >100.00ms # 1453 (0.0%) avg: 109.662ms SignalBackends Statistics: signaled_targeted # 1251569 (9.4%) advancing_behind # 108505 (0.8%) advancing_ahead # 207494 (1.6%) idle_behind # 408641 (3.1%) avoided_wakeups ####### 10589740 (79.6%) already_ahead # 744087 (5.6%) asyncQueueReadAllNotifications Statistics: necessary_wakeups ######## 1525695 (86.3%) unnecessary_wakeups # 242106 (13.7%) /Joel --86e7cd31e6424024be1d558339921d90 Content-Disposition: attachment; filename*0="0003-optimize_listen_notify-v24.txt" Content-Type: text/plain; name="0003-optimize_listen_notify-v24.txt" Content-Transfer-Encoding: base64 RnJvbSA5ZjJkYTg0YTljNThkZjE1NTk2MTQ4MWFhMDgwMmZmYjk1NDYwODExIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogRnJpLCA3IE5vdiAyMDI1IDE5OjI0OjM3ICswMTAwClN1YmplY3Q6IFtQQVRD SCAzLzNdIEFkZCBpbnN0cnVtZW50YXRpb24gZm9yIGFuYWx5emluZyBMSVNURU4vTk9USUZZ IHdha2V1cAogYmVoYXZpb3IKClRoaXMgY29tbWl0IGFkZHMgYSBzZXQgb2YgYXRvbWljIGNv dW50ZXJzIGFuZCBTUUwtYWNjZXNzaWJsZSBmdW5jdGlvbnMKdG8gaGVscCB1bmRlcnN0YW5k IGhvdyBTaWduYWxCYWNrZW5kcyBhbmQgYXN5bmNRdWV1ZVJlYWRBbGxOb3RpZmljYXRpb25z CmludGVyYWN0IHVuZGVyIHZhcmlvdXMgd29ya2xvYWRzLiAgVGhlIGluc3RydW1lbnRhdGlv biBpcyBpbnRlbmRlZCBvbmx5CmZvciBkZXZlbG9wbWVudCBhbmQgcGVyZm9ybWFuY2UgYW5h bHlzaXMgYW5kIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZQpmaW5hbCBwYXRjaC4KClNw ZWNpZmljYWxseToKCiogQWRkZWQgc2V2ZXJhbCBwZ19hdG9taWNfdWludDMyIGNvdW50ZXJz IGluIEFzeW5jUXVldWVDb250cm9sIHRyYWNraW5nCiAgd2FrZXVwIGNhdGVnb3JpZXMgc3Vj aCBhcyBzaWduYWxlZCBiYWNrZW5kcywgYWR2YW5jaW5nIHZzLiBpZGxlCiAgcG9zaXRpb25z LCBkaXJlY3QgYWR2YW5jZW1lbnRzLCBhbmQgdW5uZWNlc3Nhcnkgd2FrZXVwcy4KKiBJbmNy ZW1lbnRlZCB0aGVzZSBjb3VudGVycyBpbiBTaWduYWxCYWNrZW5kcygpIGFuZAogIGFzeW5j UXVldWVSZWFkQWxsTm90aWZpY2F0aW9ucygpIHRvIGNsYXNzaWZ5IHdha2V1cCBkZWNpc2lv bnMuCiogQWRkZWQgU1FMIGZ1bmN0aW9ucyBwZ19nZXRfYXN5bmNfd2FrZXVwX3N0YXRzKCkg YW5kCiAgcGdfcmVzZXRfYXN5bmNfd2FrZXVwX3N0YXRzKCkgZm9yIHJlYWRpbmcgYW5kIHJl c2V0dGluZyB0aGVzZSBjb3VudGVycwogIGR1cmluZyB0ZXN0IHJ1bnMuCiogTW9kaWZpZWQg YXN5bmNRdWV1ZVByb2Nlc3NQYWdlRW50cmllcygpIHRvIHJlcG9ydCB3aGV0aGVyIGFueQog IG5vdGlmaWNhdGlvbnMgd2VyZSBvZiBpbnRlcmVzdCB0byB0aGUgYmFja2VuZCwgYWxsb3dp bmcKICBkaWZmZXJlbnRpYXRpb24gYmV0d2VlbiBuZWNlc3NhcnkgYW5kIHVubmVjZXNzYXJ5 IHdha2V1cHMuCgpUaGlzIGlzIHB1cmVseSBkaWFnbm9zdGljIGNvZGUgdG8gaGVscCByZWFz b24gYWJvdXQgYmFja2VuZCB3YWtldXAKcGF0dGVybnMgYW5kIHZhbGlkYXRlIGFzc3VtcHRp b25zIGR1cmluZyBvcHRpbWl6YXRpb24uICBJdCBpbnRyb2R1Y2VzIG5vCnVzZXItdmlzaWJs ZSBvciBiZWhhdmlvcmFsIGNoYW5nZXMgYW5kIGlzIG5vdCBpbnRlbmRlZCBmb3IgY29tbWl0 IHRvIHRoZQptYWluIHRyZWUuCi0tLQogc3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5bmMuYyAg ICB8IDE3MSArKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLQogc3JjL2luY2x1ZGUv Y2F0YWxvZy9wZ19wcm9jLmRhdCB8ICAxMyArKy0KIDIgZmlsZXMgY2hhbmdlZCwgMTU5IGlu c2VydGlvbnMoKyksIDI1IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L2NvbW1hbmRzL2FzeW5jLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jCmluZGV4 IDlmN2I4YTMzMjRhLi4yZWM2YjZiOWUyYiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29t bWFuZHMvYXN5bmMuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jCkBAIC0x MzYsNiArMTM2LDcgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzaWduYWwu aD4KIAorI2luY2x1ZGUgImFjY2Vzcy9odHVwX2RldGFpbHMuaCIKICNpbmNsdWRlICJhY2Nl c3MvcGFyYWxsZWwuaCIKICNpbmNsdWRlICJhY2Nlc3Mvc2xydS5oIgogI2luY2x1ZGUgImFj Y2Vzcy90cmFuc2FtLmgiCkBAIC0zMzIsNiArMzMzLDE0IEBAIHR5cGVkZWYgc3RydWN0IEFz eW5jUXVldWVDb250cm9sCiAJVGltZXN0YW1wVHogbGFzdFF1ZXVlRmlsbFdhcm47CS8qIHRp bWUgb2YgbGFzdCBxdWV1ZS1mdWxsIG1zZyAqLwogCWRzYV9oYW5kbGUJY2hhbm5lbEhhc2hE U0E7CiAJZHNoYXNoX3RhYmxlX2hhbmRsZSBjaGFubmVsSGFzaERTSDsKKwlwZ19hdG9taWNf dWludDMyIHNpZ25hbGVkVGFyZ2V0ZWQ7CQkvKiBsaXN0ZW5pbmcgdG8gc29tZSBvZiB0aGUg Y2hhbm5lbHM7IHNpZ25hbCBuZWVkZWQgKi8KKwlwZ19hdG9taWNfdWludDMyIGFkdmFuY2lu Z0JlaGluZDsJCS8qIGFkdmFuY2luZywgcG9zaXRpb24gYmVoaW5kIHF1ZXVlIGhlYWQgYmVm b3JlIHdyaXRlICovCisJcGdfYXRvbWljX3VpbnQzMiBhZHZhbmNpbmdBaGVhZDsJCS8qIGFk dmFuY2luZywgcG9zaXRpb24gYWhlYWQgb2YgcXVldWUgaGVhZCBhZnRlciB3cml0ZSAqLwor CXBnX2F0b21pY191aW50MzIgaWRsZUJlaGluZDsJCQkvKiBzdGF0aW9uYXJ5IGF0IGEgcG9z aXRpb24gYmVoaW5kIHF1ZXVlIGhlYWQgYmVmb3JlIHdyaXRlICovCisJcGdfYXRvbWljX3Vp bnQzMiBhdm9pZGVkV2FrZXVwczsJCS8qIGRpcmVjdGx5IGFkdmFuY2VkICovCisJcGdfYXRv bWljX3VpbnQzMiBhbHJlYWR5QWhlYWQ7CQkJLyogYWxyZWFkeSBjYXVnaHQgdXAgb3IgYWhl YWQsIG5vIGFjdGlvbiBuZWVkZWQgKi8KKwlwZ19hdG9taWNfdWludDMyIG5lY2Vzc2FyeVdh a2V1cHM7CQkvKiB3YWtldXBzIHdoZXJlIGF0IGxlYXN0IG9uZSBtZXNzYWdlIHdhcyBpbnRl cmVzdGluZyAqLworCXBnX2F0b21pY191aW50MzIgdW5uZWNlc3NhcnlXYWtldXBzOwkvKiB3 YWtldXBzIHdoZXJlIHdlIGhhZCBubyBpbnRlcmVzdCBpbiBhbnkgb2YgdGhlIG1lc3NhZ2Vz ICovCiAJUXVldWVCYWNrZW5kU3RhdHVzIGJhY2tlbmRbRkxFWElCTEVfQVJSQVlfTUVNQkVS XTsKIH0gQXN5bmNRdWV1ZUNvbnRyb2w7CiAKQEAgLTUxOCw3ICs1MjcsOCBAQCBzdGF0aWMg dm9pZCBhc3luY1F1ZXVlUmVhZEFsbE5vdGlmaWNhdGlvbnModm9pZCk7CiBzdGF0aWMgYm9v bCBhc3luY1F1ZXVlUHJvY2Vzc1BhZ2VFbnRyaWVzKHZvbGF0aWxlIFF1ZXVlUG9zaXRpb24g KmN1cnJlbnQsCiAJCQkJCQkJCQkJIFF1ZXVlUG9zaXRpb24gc3RvcCwKIAkJCQkJCQkJCQkg Y2hhciAqcGFnZV9idWZmZXIsCi0JCQkJCQkJCQkJIFNuYXBzaG90IHNuYXBzaG90KTsKKwkJ CQkJCQkJCQkgU25hcHNob3Qgc25hcHNob3QsCisJCQkJCQkJCQkJIGJvb2wgKmludGVyZXN0 ZWQpOwogc3RhdGljIHZvaWQgYXN5bmNRdWV1ZUFkdmFuY2VUYWlsKHZvaWQpOwogc3RhdGlj IHZvaWQgUHJvY2Vzc0luY29taW5nTm90aWZ5KGJvb2wgZmx1c2gpOwogc3RhdGljIGJvb2wg QXN5bmNFeGlzdHNQZW5kaW5nTm90aWZ5KE5vdGlmaWNhdGlvbiAqbik7CkBAIC02ODQsNiAr Njk0LDE1IEBAIEFzeW5jU2htZW1Jbml0KHZvaWQpCiAJCWFzeW5jUXVldWVDb250cm9sLT5s YXN0UXVldWVGaWxsV2FybiA9IDA7CiAJCWFzeW5jUXVldWVDb250cm9sLT5jaGFubmVsSGFz aERTQSA9IERTQV9IQU5ETEVfSU5WQUxJRDsKIAkJYXN5bmNRdWV1ZUNvbnRyb2wtPmNoYW5u ZWxIYXNoRFNIID0gRFNIQVNIX0hBTkRMRV9JTlZBTElEOworCQlwZ19hdG9taWNfaW5pdF91 MzIoJmFzeW5jUXVldWVDb250cm9sLT5zaWduYWxlZFRhcmdldGVkLCAwKTsKKwkJcGdfYXRv bWljX2luaXRfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+YWR2YW5jaW5nQmVoaW5kLCAwKTsK KwkJcGdfYXRvbWljX2luaXRfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+YWR2YW5jaW5nQWhl YWQsIDApOworCQlwZ19hdG9taWNfaW5pdF91MzIoJmFzeW5jUXVldWVDb250cm9sLT5pZGxl QmVoaW5kLCAwKTsKKwkJcGdfYXRvbWljX2luaXRfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+ YXZvaWRlZFdha2V1cHMsIDApOworCQlwZ19hdG9taWNfaW5pdF91MzIoJmFzeW5jUXVldWVD b250cm9sLT5hbHJlYWR5QWhlYWQsIDApOworCQlwZ19hdG9taWNfaW5pdF91MzIoJmFzeW5j UXVldWVDb250cm9sLT5uZWNlc3NhcnlXYWtldXBzLCAwKTsKKwkJcGdfYXRvbWljX2luaXRf dTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+dW5uZWNlc3NhcnlXYWtldXBzLCAwKTsKKwogCQlm b3IgKGludCBpID0gMDsgaSA8IE1heEJhY2tlbmRzOyBpKyspCiAJCXsKIAkJCVFVRVVFX0JB Q0tFTkRfUElEKGkpID0gSW52YWxpZFBpZDsKQEAgLTk5OCw2ICsxMDE3LDg1IEBAIHBnX2xp c3RlbmluZ19jaGFubmVscyhQR19GVU5DVElPTl9BUkdTKQogCVNSRl9SRVRVUk5fRE9ORShm dW5jY3R4KTsKIH0KIAorLyoKKyAqIFNRTCBmdW5jdGlvbjogcmV0dXJuIHN0YXRpc3RpY3Mg YWJvdXQgTk9USUZZIHdha2V1cHMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBz aW5nbGUgcm93IHdpdGg6CisgKiAtIG5lY2Vzc2FyeV93YWtldXBzOiB3YWtldXBzIHdoZXJl IGF0IGxlYXN0IG9uZSBtZXNzYWdlIHdhcyBpbnRlcmVzdGluZworICogLSB1bm5lY2Vzc2Fy eV93YWtldXBzOiB3YWtldXBzIHdoZXJlIG5vIG1lc3NhZ2VzIHdlcmUgaW50ZXJlc3RpbmcK KyAqIC0gZGlyZWN0X2FkdmFuY2VtZW50c19zdWNjZXNzOiBkaXJlY3RseSBhZHZhbmNlZAor ICogLSBhbHJlYWR5X2FkdmFuY2luZzogYWxyZWFkeSBhZHZhbmNpbmcgaXRzIHBvc2l0aW9u CisgKiAtIHNpZ25hbGVkX3VuY2VydGFpbjogc2lnbmFsZWQgZHVlIHRvIHVuY2VydGFpbiBu ZWVkCisgKiAtIGFscmVhZHlfYWhlYWQ6IGFscmVhZHkgYWhlYWQsIG5vIGFjdGlvbiBuZWVk ZWQKKyAqLworRGF0dW0KK3BnX2dldF9hc3luY193YWtldXBfc3RhdHMoUEdfRlVOQ1RJT05f QVJHUykKK3sKKwlUdXBsZURlc2MJdHVwZGVzYzsKKwlEYXR1bQkJdmFsdWVzWzhdOworCWJv b2wJCW51bGxzWzhdOworCUhlYXBUdXBsZQl0dXBsZTsKKwl1aW50MzIJCXNpZ25hbGVkX3Rh cmdldGVkOworCXVpbnQzMgkJYWR2YW5jaW5nX2JlaGluZDsKKwl1aW50MzIJCWFkdmFuY2lu Z19haGVhZDsKKwl1aW50MzIJCWlkbGVfYmVoaW5kOworCXVpbnQzMgkJYXZvaWRlZF93YWtl dXBzOworCXVpbnQzMgkJYWxyZWFkeV9haGVhZDsKKwl1aW50MzIJCW5lY2Vzc2FyeV93YWtl dXBzOworCXVpbnQzMgkJdW5uZWNlc3Nhcnlfd2FrZXVwczsKKworCS8qIEJ1aWxkIGEgdHVw bGUgZGVzY3JpcHRvciBmb3Igb3VyIHJlc3VsdCB0eXBlICovCisJaWYgKGdldF9jYWxsX3Jl c3VsdF90eXBlKGZjaW5mbywgTlVMTCwgJnR1cGRlc2MpICE9IFRZUEVGVU5DX0NPTVBPU0lU RSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9U X1NVUFBPUlRFRCksCisJCQkJIGVycm1zZygiZnVuY3Rpb24gcmV0dXJuaW5nIHJlY29yZCBj YWxsZWQgaW4gY29udGV4dCB0aGF0IGNhbm5vdCBhY2NlcHQgdHlwZSByZWNvcmQiKSkpOwor CisJLyogUmVhZCB0aGUgYXRvbWljIGNvdW50ZXJzICovCisJc2lnbmFsZWRfdGFyZ2V0ZWQg PSBwZ19hdG9taWNfcmVhZF91MzIoJmFzeW5jUXVldWVDb250cm9sLT5zaWduYWxlZFRhcmdl dGVkKTsKKwlhZHZhbmNpbmdfYmVoaW5kID0gcGdfYXRvbWljX3JlYWRfdTMyKCZhc3luY1F1 ZXVlQ29udHJvbC0+YWR2YW5jaW5nQmVoaW5kKTsKKwlhZHZhbmNpbmdfYWhlYWQgPSBwZ19h dG9taWNfcmVhZF91MzIoJmFzeW5jUXVldWVDb250cm9sLT5hZHZhbmNpbmdBaGVhZCk7CisJ aWRsZV9iZWhpbmQgPSBwZ19hdG9taWNfcmVhZF91MzIoJmFzeW5jUXVldWVDb250cm9sLT5p ZGxlQmVoaW5kKTsKKwlhdm9pZGVkX3dha2V1cHMgPSBwZ19hdG9taWNfcmVhZF91MzIoJmFz eW5jUXVldWVDb250cm9sLT5hdm9pZGVkV2FrZXVwcyk7CisJYWxyZWFkeV9haGVhZCA9IHBn X2F0b21pY19yZWFkX3UzMigmYXN5bmNRdWV1ZUNvbnRyb2wtPmFscmVhZHlBaGVhZCk7CisJ bmVjZXNzYXJ5X3dha2V1cHMgPSBwZ19hdG9taWNfcmVhZF91MzIoJmFzeW5jUXVldWVDb250 cm9sLT5uZWNlc3NhcnlXYWtldXBzKTsKKwl1bm5lY2Vzc2FyeV93YWtldXBzID0gcGdfYXRv bWljX3JlYWRfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+dW5uZWNlc3NhcnlXYWtldXBzKTsK KworCS8qIEZpbGwgaW4gdGhlIHZhbHVlcyAqLworCW1lbXNldChudWxscywgMCwgc2l6ZW9m KG51bGxzKSk7CisJdmFsdWVzWzBdID0gSW50NjRHZXREYXR1bSgoaW50NjQpIHNpZ25hbGVk X3RhcmdldGVkKTsKKwl2YWx1ZXNbMV0gPSBJbnQ2NEdldERhdHVtKChpbnQ2NCkgYWR2YW5j aW5nX2JlaGluZCk7CisJdmFsdWVzWzJdID0gSW50NjRHZXREYXR1bSgoaW50NjQpIGFkdmFu Y2luZ19haGVhZCk7CisJdmFsdWVzWzNdID0gSW50NjRHZXREYXR1bSgoaW50NjQpIGlkbGVf YmVoaW5kKTsKKwl2YWx1ZXNbNF0gPSBJbnQ2NEdldERhdHVtKChpbnQ2NCkgYXZvaWRlZF93 YWtldXBzKTsKKwl2YWx1ZXNbNV0gPSBJbnQ2NEdldERhdHVtKChpbnQ2NCkgYWxyZWFkeV9h aGVhZCk7CisJdmFsdWVzWzZdID0gSW50NjRHZXREYXR1bSgoaW50NjQpIG5lY2Vzc2FyeV93 YWtldXBzKTsKKwl2YWx1ZXNbN10gPSBJbnQ2NEdldERhdHVtKChpbnQ2NCkgdW5uZWNlc3Nh cnlfd2FrZXVwcyk7CisKKwl0dXBsZSA9IGhlYXBfZm9ybV90dXBsZSh0dXBkZXNjLCB2YWx1 ZXMsIG51bGxzKTsKKwlQR19SRVRVUk5fREFUVU0oSGVhcFR1cGxlR2V0RGF0dW0odHVwbGUp KTsKK30KKworLyoKKyAqIFNRTCBmdW5jdGlvbjogcmVzZXQgTk9USUZZIHdha2V1cCBzdGF0 aXN0aWNzCisgKgorICogVGhpcyBmdW5jdGlvbiByZXNldHMgYWxsIHRoZSBhc3luYyB3YWtl dXAgY291bnRlcnMgdG8gemVyby4KKyAqLworRGF0dW0KK3BnX3Jlc2V0X2FzeW5jX3dha2V1 cF9zdGF0cyhQR19GVU5DVElPTl9BUkdTKQoreworCS8qIFJlc2V0IGFsbCB0aGUgYXRvbWlj IGNvdW50ZXJzIHRvIHplcm8gKi8KKwlwZ19hdG9taWNfd3JpdGVfdTMyKCZhc3luY1F1ZXVl Q29udHJvbC0+c2lnbmFsZWRUYXJnZXRlZCwgMCk7CisJcGdfYXRvbWljX3dyaXRlX3UzMigm YXN5bmNRdWV1ZUNvbnRyb2wtPmFkdmFuY2luZ0JlaGluZCwgMCk7CisJcGdfYXRvbWljX3dy aXRlX3UzMigmYXN5bmNRdWV1ZUNvbnRyb2wtPmFkdmFuY2luZ0FoZWFkLCAwKTsKKwlwZ19h dG9taWNfd3JpdGVfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+aWRsZUJlaGluZCwgMCk7CisJ cGdfYXRvbWljX3dyaXRlX3UzMigmYXN5bmNRdWV1ZUNvbnRyb2wtPmF2b2lkZWRXYWtldXBz LCAwKTsKKwlwZ19hdG9taWNfd3JpdGVfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+YWxyZWFk eUFoZWFkLCAwKTsKKwlwZ19hdG9taWNfd3JpdGVfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+ bmVjZXNzYXJ5V2FrZXVwcywgMCk7CisJcGdfYXRvbWljX3dyaXRlX3UzMigmYXN5bmNRdWV1 ZUNvbnRyb2wtPnVubmVjZXNzYXJ5V2FrZXVwcywgMCk7CisKKwlQR19SRVRVUk5fVk9JRCgp OworfQorCiAvKgogICogQXN5bmNfVW5saXN0ZW5PbkV4aXQKICAqCkBAIC0yMDE2LDYgKzIx MTQsNyBAQCBTaWduYWxCYWNrZW5kcyh2b2lkKQogCiAJCQlBc3NlcnQocGlkICE9IEludmFs aWRQaWQpOwogCisJCQlwZ19hdG9taWNfZmV0Y2hfYWRkX3UzMigmYXN5bmNRdWV1ZUNvbnRy b2wtPnNpZ25hbGVkVGFyZ2V0ZWQsIDEpOwogCQkJUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVO RElORyhpKSA9IHRydWU7CiAJCQlwaWRzW2NvdW50XSA9IHBpZDsKIAkJCXByb2Nub3NbY291 bnRdID0gaTsKQEAgLTIwMzcsNiArMjEzNiw3IEBAIFNpZ25hbEJhY2tlbmRzKHZvaWQpCiAJ CXsKIAkJCVF1ZXVlUG9zaXRpb24gcG9zOwogCQkJaW50MzIJCXBpZDsKKwkJCWJvb2wJCW5l ZWRfc2lnbmFsID0gZmFsc2U7CiAKIAkJCWlmIChRVUVVRV9CQUNLRU5EX1dBS0VVUF9QRU5E SU5HKGkpKQogCQkJCWNvbnRpbnVlOwpAQCAtMjA0NCwyMSArMjE0NCwzOSBAQCBTaWduYWxC YWNrZW5kcyh2b2lkKQogCQkJcG9zID0gUVVFVUVfQkFDS0VORF9QT1MoaSk7CiAJCQlwaWQg PSBRVUVVRV9CQUNLRU5EX1BJRChpKTsKIAotCQkJLyoKLQkJCSAqIFdlIG5lZWQgdG8gc2ln bmFsIGFkdmFuY2luZyBsaXN0ZW5pbmcgYmFja2VuZHMgdGhhdCB3b3VsZCBnZXQKLQkJCSAq IHN0dWNrIGF0IGEgcG9zaXRpb24gYmVmb3JlIHRoZSBuZXcgcXVldWUgaGVhZC4gV2UgYWxz byBuZWVkIHRvCi0JCQkgKiBzaWduYWwgbGlzdGVuaW5nIGJhY2tlbmRzIHRoYXQgYXJlIGlk bGUgYXQgYSBwb3NpdGlvbiBiZWZvcmUKLQkJCSAqIHRoZSBvbGQgcXVldWUgaGVhZCBzaW5j ZSB0aGV5IGNvdWxkIGJlIGludGVyZXN0ZWQgaW4gdGhlCi0JCQkgKiBtZXNzYWdlcyBpbi1i ZXR3ZWVuLgotCQkJICoKLQkJCSAqIExpc3RlbmluZyBiYWNrZW5kcyB0aGF0IGFyZSBub3Qg YWR2YW5jaW5nIGFuZCBhcmUgc3RhdGlvbmFyeSBhdAotCQkJICogYSBwb3NpdGlvbiBzb21l d2hlcmUgaW4gdGhlIHJhbmdlIHdlIGp1c3Qgd3JvdGUsIGNhbiBzYWZlbHkgYmUKLQkJCSAq IGRpcmVjdCBhZHZhbmNlZCB0byB0aGUgbmV3IHF1ZXVlIGhlYWQsIHNpbmNlIHdlIGtub3cg dGhhdCB0aGV5Ci0JCQkgKiBhcmUgbm90IGludGVyZXN0ZWQgaW4gb3VyIG1lc3NhZ2VzLgot CQkJICovCi0JCQlpZiAoUVVFVUVfQkFDS0VORF9JU19BRFZBTkNJTkcoaSkgPwotCQkJCVFV RVVFX1BPU19QUkVDRURFUyhRVUVVRV9CQUNLRU5EX0FEVkFOQ0lOR19QT1MoaSksIHF1ZXVl SGVhZEFmdGVyV3JpdGUpIDoKLQkJCQlRVUVVRV9QT1NfUFJFQ0VERVMocG9zLCBxdWV1ZUhl YWRCZWZvcmVXcml0ZSkpCisJCQlpZiAoUVVFVUVfQkFDS0VORF9JU19BRFZBTkNJTkcoaSkp CisJCQl7CisJCQkJaWYgKFFVRVVFX1BPU19QUkVDRURFUyhRVUVVRV9CQUNLRU5EX0FEVkFO Q0lOR19QT1MoaSksIHF1ZXVlSGVhZEFmdGVyV3JpdGUpKQorCQkJCXsKKwkJCQkJbmVlZF9z aWduYWwgPSB0cnVlOworCQkJCQlwZ19hdG9taWNfZmV0Y2hfYWRkX3UzMigmYXN5bmNRdWV1 ZUNvbnRyb2wtPmFkdmFuY2luZ0JlaGluZCwgMSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7 CisJCQkJCXBnX2F0b21pY19mZXRjaF9hZGRfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+YWR2 YW5jaW5nQWhlYWQsIDEpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAo UVVFVUVfUE9TX1BSRUNFREVTKHBvcywgcXVldWVIZWFkQmVmb3JlV3JpdGUpKQorCQkJCXsK KwkJCQkJbmVlZF9zaWduYWwgPSB0cnVlOworCQkJCQlwZ19hdG9taWNfZmV0Y2hfYWRkX3Uz MigmYXN5bmNRdWV1ZUNvbnRyb2wtPmlkbGVCZWhpbmQsIDEpOworCQkJCX0KKwkJCQllbHNl IGlmIChRVUVVRV9QT1NfUFJFQ0VERVMocG9zLCBxdWV1ZUhlYWRBZnRlcldyaXRlKSkKKwkJ CQl7CisJCQkJCVFVRVVFX0JBQ0tFTkRfUE9TKGkpID0gcXVldWVIZWFkQWZ0ZXJXcml0ZTsK KwkJCQkJcGdfYXRvbWljX2ZldGNoX2FkZF91MzIoJmFzeW5jUXVldWVDb250cm9sLT5hdm9p ZGVkV2FrZXVwcywgMSk7CQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlBc3NlcnQo UVVFVUVfUE9TX0VRVUFMKHBvcywgcXVldWVIZWFkQWZ0ZXJXcml0ZSkgfHwKKwkJCQkJCSAg IFFVRVVFX1BPU19QUkVDRURFUyhxdWV1ZUhlYWRBZnRlcldyaXRlLCBwb3MpKTsKKwkJCQkJ cGdfYXRvbWljX2ZldGNoX2FkZF91MzIoJmFzeW5jUXVldWVDb250cm9sLT5hbHJlYWR5QWhl YWQsIDEpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKG5lZWRfc2lnbmFsKQogCQkJewogCQkJ CUFzc2VydChwaWQgIT0gSW52YWxpZFBpZCk7CiAKQEAgLTIwNjcsMTMgKzIxODUsNyBAQCBT aWduYWxCYWNrZW5kcyh2b2lkKQogCQkJCXByb2Nub3NbY291bnRdID0gaTsKIAkJCQljb3Vu dCsrOwogCQkJfQotCQkJZWxzZSBpZiAoIVFVRVVFX0JBQ0tFTkRfSVNfQURWQU5DSU5HKGkp ICYmCi0JCQkJCSBRVUVVRV9QT1NfUFJFQ0VERVMocG9zLCBxdWV1ZUhlYWRBZnRlcldyaXRl KSkKLQkJCXsKLQkJCQlBc3NlcnQoIVFVRVVFX1BPU19QUkVDRURFUyhwb3MsIHF1ZXVlSGVh ZEJlZm9yZVdyaXRlKSk7CiAKLQkJCQlRVUVVRV9CQUNLRU5EX1BPUyhpKSA9IHF1ZXVlSGVh ZEFmdGVyV3JpdGU7Ci0JCQl9CiAJCX0KIAl9CiAJTFdMb2NrUmVsZWFzZShOb3RpZnlRdWV1 ZUxvY2spOwpAQCAtMjMwMiw2ICsyNDE0LDcgQEAgYXN5bmNRdWV1ZVJlYWRBbGxOb3RpZmlj YXRpb25zKHZvaWQpCiAJdm9sYXRpbGUgUXVldWVQb3NpdGlvbiBwb3M7CiAJUXVldWVQb3Np dGlvbiBoZWFkOwogCVNuYXBzaG90CXNuYXBzaG90OworCWJvb2wJCWludGVyZXN0ZWQgPSBm YWxzZTsKIAogCS8qIHBhZ2VfYnVmZmVyIG11c3QgYmUgYWRlcXVhdGVseSBhbGlnbmVkLCBz byB1c2UgYSB1bmlvbiAqLwogCXVuaW9uCkBAIC0yNDM4LDcgKzI1NTEsOCBAQCBhc3luY1F1 ZXVlUmVhZEFsbE5vdGlmaWNhdGlvbnModm9pZCkKIAkJCSAqLwogCQkJcmVhY2hlZFN0b3Ag PSBhc3luY1F1ZXVlUHJvY2Vzc1BhZ2VFbnRyaWVzKCZwb3MsIGhlYWQsCiAJCQkJCQkJCQkJ CQkJICAgcGFnZV9idWZmZXIuYnVmLAotCQkJCQkJCQkJCQkJCSAgIHNuYXBzaG90KTsKKwkJ CQkJCQkJCQkJCQkgICBzbmFwc2hvdCwKKwkJCQkJCQkJCQkJCQkgICAmaW50ZXJlc3RlZCk7 CiAJCX0gd2hpbGUgKCFyZWFjaGVkU3RvcCk7CiAJfQogCVBHX0ZJTkFMTFkoKTsKQEAgLTI0 NTIsNiArMjU2NiwxMSBAQCBhc3luY1F1ZXVlUmVhZEFsbE5vdGlmaWNhdGlvbnModm9pZCkK IAl9CiAJUEdfRU5EX1RSWSgpOwogCisJaWYgKGludGVyZXN0ZWQpCisJCXBnX2F0b21pY19m ZXRjaF9hZGRfdTMyKCZhc3luY1F1ZXVlQ29udHJvbC0+bmVjZXNzYXJ5V2FrZXVwcywgMSk7 CisJZWxzZQorCQlwZ19hdG9taWNfZmV0Y2hfYWRkX3UzMigmYXN5bmNRdWV1ZUNvbnRyb2wt PnVubmVjZXNzYXJ5V2FrZXVwcywgMSk7CisKIAkvKiBEb25lIHdpdGggc25hcHNob3QgKi8K IAlVbnJlZ2lzdGVyU25hcHNob3Qoc25hcHNob3QpOwogfQpAQCAtMjQ3Niw3ICsyNTk1LDgg QEAgc3RhdGljIGJvb2wKIGFzeW5jUXVldWVQcm9jZXNzUGFnZUVudHJpZXModm9sYXRpbGUg UXVldWVQb3NpdGlvbiAqY3VycmVudCwKIAkJCQkJCQkgUXVldWVQb3NpdGlvbiBzdG9wLAog CQkJCQkJCSBjaGFyICpwYWdlX2J1ZmZlciwKLQkJCQkJCQkgU25hcHNob3Qgc25hcHNob3Qp CisJCQkJCQkJIFNuYXBzaG90IHNuYXBzaG90LAorCQkJCQkJCSBib29sICppbnRlcmVzdGVk KQogewogCWJvb2wJCXJlYWNoZWRTdG9wID0gZmFsc2U7CiAJYm9vbAkJcmVhY2hlZEVuZE9m UGFnZTsKQEAgLTI1MzcsNiArMjY1Nyw5IEBAIGFzeW5jUXVldWVQcm9jZXNzUGFnZUVudHJp ZXModm9sYXRpbGUgUXVldWVQb3NpdGlvbiAqY3VycmVudCwKIAkJCQkJY2hhcgkgICAqcGF5 bG9hZCA9IHFlLT5kYXRhICsgc3RybGVuKGNoYW5uZWwpICsgMTsKIAogCQkJCQlOb3RpZnlN eUZyb250RW5kKGNoYW5uZWwsIHBheWxvYWQsIHFlLT5zcmNQaWQpOworCisJCQkJCS8qIE1h cmsgd2VyZSBpbnRlcmVzdGVkIGluIGF0IGxlYXN0IG9uZSBtZXNzYWdlICovCisJCQkJCSpp bnRlcmVzdGVkID0gdHJ1ZTsKIAkJCQl9CiAJCQl9CiAJCQllbHNlCmRpZmYgLS1naXQgYS9z cmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0IGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9w Z19wcm9jLmRhdAppbmRleCA5MTIxYTM4MmY3Ni4uYjI1OWJjY2ZhNGIgMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKKysrIGIvc3JjL2luY2x1ZGUvY2F0 YWxvZy9wZ19wcm9jLmRhdApAQCAtODU3MSw3ICs4NTcxLDE4IEBACiAgIHByb25hbWUgPT4g J3BnX25vdGlmaWNhdGlvbl9xdWV1ZV91c2FnZScsIHByb3ZvbGF0aWxlID0+ICd2JywKICAg cHJvcGFyYWxsZWwgPT4gJ3InLCBwcm9yZXR0eXBlID0+ICdmbG9hdDgnLCBwcm9hcmd0eXBl cyA9PiAnJywKICAgcHJvc3JjID0+ICdwZ19ub3RpZmljYXRpb25fcXVldWVfdXNhZ2UnIH0s Ci0KK3sgb2lkID0+ICc5MzE1JywKKyAgZGVzY3IgPT4gJ2dldCBzdGF0aXN0aWNzIGFib3V0 IE5PVElGWSB3YWtldXBzJywKKyAgcHJvbmFtZSA9PiAncGdfZ2V0X2FzeW5jX3dha2V1cF9z dGF0cycsIHByb3ZvbGF0aWxlID0+ICd2JywKKyAgcHJvcGFyYWxsZWwgPT4gJ3InLCBwcm9y ZXR0eXBlID0+ICdyZWNvcmQnLCBwcm9hcmd0eXBlcyA9PiAnJywKKyAgcHJvYWxsYXJndHlw ZXMgPT4gJ3tpbnQ4LGludDgsaW50OCxpbnQ4LGludDgsaW50OCxpbnQ4LGludDh9JywgcHJv YXJnbW9kZXMgPT4gJ3tvLG8sbyxvLG8sbyxvLG99JywKKyAgcHJvYXJnbmFtZXMgPT4gJ3tz aWduYWxlZF90YXJnZXRlZCxhZHZhbmNpbmdfYmVoaW5kLGFkdmFuY2luZ19haGVhZCxpZGxl X2JlaGluZCxhdm9pZGVkX3dha2V1cHMsYWxyZWFkeV9haGVhZCxuZWNlc3Nhcnlfd2FrZXVw cyx1bm5lY2Vzc2FyeV93YWtldXBzfScsCisgIHByb3NyYyA9PiAncGdfZ2V0X2FzeW5jX3dh a2V1cF9zdGF0cycgfSwKK3sgb2lkID0+ICc5MzE2JywKKyAgZGVzY3IgPT4gJ3Jlc2V0IHN0 YXRpc3RpY3MgYWJvdXQgTk9USUZZIHdha2V1cHMnLAorICBwcm9uYW1lID0+ICdwZ19yZXNl dF9hc3luY193YWtldXBfc3RhdHMnLCBwcm92b2xhdGlsZSA9PiAndicsCisgIHByb3BhcmFs bGVsID0+ICdyJywgcHJvcmV0dHlwZSA9PiAndm9pZCcsIHByb2FyZ3R5cGVzID0+ICcnLAor ICBwcm9zcmMgPT4gJ3BnX3Jlc2V0X2FzeW5jX3dha2V1cF9zdGF0cycgfSwKICMgc2hhcmVk IG1lbW9yeSB1c2FnZQogeyBvaWQgPT4gJzUwNTInLCBkZXNjciA9PiAnYWxsb2NhdGlvbnMg ZnJvbSB0aGUgbWFpbiBzaGFyZWQgbWVtb3J5IHNlZ21lbnQnLAogICBwcm9uYW1lID0+ICdw Z19nZXRfc2htZW1fYWxsb2NhdGlvbnMnLCBwcm9yb3dzID0+ICc1MCcsIHByb3JldHNldCA9 PiAndCcsCi0tIAoyLjUwLjEKCg== --86e7cd31e6424024be1d558339921d90 Content-Disposition: attachment; filename*0="0002-optimize_listen_notify-v24.patch" Content-Type: application/octet-stream; name="=?UTF-8?Q?0002-optimize=5Flisten=5Fnotify-v24.patch?=" Content-Transfer-Encoding: base64 RnJvbSA5OWMyYmZlMGM5ZDdjNTE5YzQ5NGJjMTcwMTc1MGY1YjYwMzA2ZWM0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogRnJpLCA3IE5vdiAyMDI1IDE5OjA4OjM5ICswMTAwClN1YmplY3Q6IFtQQVRD SCAyLzNdIE9wdGltaXplIExJU1RFTi9OT1RJRlkgd2l0aCBzaGFyZWQgY2hhbm5lbCBtYXAg YW5kIGRpcmVjdAogYWR2YW5jZW1lbnQKClRoaXMgcGF0Y2ggcmV3b3JrcyB0aGUgTElTVEVO L05PVElGWSBzaWduYWxpbmcgcGF0aCB0byBhdm9pZCB0aGUKbG9uZy1zdGFuZGluZyBpbmVm ZmljaWVuY3kgd2hlcmUgZXZlcnkgY29tbWl0IHdha2VzIGFsbCBsaXN0ZW5pbmcKYmFja2Vu ZHMgaW4gdGhlIHNhbWUgZGF0YWJhc2UsIGV2ZW4gdGhvc2UgdGhhdCBhcmUgbGlzdGVuaW5n IG9uCmNvbXBsZXRlbHkgZGlmZmVyZW50IGNoYW5uZWxzLgoKUHJvYmxlbQotLS0tLS0tCgpB dCBwcmVzZW50LCBTaWduYWxCYWNrZW5kcyBoYXMgbm8gY2VudHJhbCBrbm93bGVkZ2Ugb2Yg d2hpY2ggYmFja2VuZApsaXN0ZW5zIG9uIHdoaWNoIGNoYW5uZWwuIFdoZW4gYSBiYWNrZW5k IGNvbW1pdHMgYSB0cmFuc2FjdGlvbiB0aGF0Cmlzc3VlZCBOT1RJRlksIGl0IHNpbXBseSBp dGVyYXRlcyBvdmVyIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycyBpbiB0aGUKc2FtZSBkYXRh YmFzZSBhbmQgc2VuZHMgZWFjaCBvbmUgYSBQUk9DU0lHX05PVElGWV9JTlRFUlJVUFQgc2ln bmFsLgoKVGhhdCBiZWhhdmlvciBpcyBmaW5lIHdoZW4gYWxsIGxpc3RlbmVycyBhcmUgb24g dGhlIHNhbWUgY2hhbm5lbCwgYnV0CndoZW4gbWFueSBiYWNrZW5kcyBhcmUgbGlzdGVuaW5n IG9uIGRpZmZlcmVudCBjaGFubmVscywgZWFjaCBOT1RJRlkKdHJpZ2dlcnMgYSBzdG9ybSBv ZiB1bm5lY2Vzc2FyeSB3YWtldXBzIGFuZCBjb250ZXh0IHN3aXRjaGVzLiBBcyB0aGUKbnVt YmVyIG9mIGlkbGUgbGlzdGVuZXJzIGdyb3dzLCB0aGlzIG9mdGVuIGJlY29tZXMgdGhlIGJv dHRsZW5lY2sgYW5kCnRocm91Z2hwdXQgZHJvcHMgc2hhcnBseS4KCk92ZXJ2aWV3IG9mIHRo ZSBzb2x1dGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoaXMgcGF0Y2ggaW50cm9k dWNlcyBhIGxhemlseS1jcmVhdGVkIGR5bmFtaWMgc2hhcmVkIGhhc2ggKGRzaGFzaCkKYmFj a2VkIGJ5IGR5bmFtaWMgc2hhcmVkIG1lbW9yeSAoRFNBKSB0aGF0IG1hcHMgKGRib2lkLCBj aGFubmVsKSB0bwphcnJheXMgb2YgbGlzdGVuaW5nIGJhY2tlbmRzIChQcm9jTnVtYmVycyku IFRoaXMgYWxsb3dzIHRoZSBzZW5kZXIgdG8KdGFyZ2V0IG9ubHkgdGhvc2UgYmFja2VuZHMg YWN0dWFsbHkgbGlzdGVuaW5nIG9uIHRoZSBjaGFubmVscyBmb3Igd2hpY2gKaXQgaGFzIHF1 ZXVlZCBub3RpZmljYXRpb25zLgoKQXQgY29tbWl0IHRpbWU6CgoqIEF0Q29tbWl0X05vdGlm eSB1cGRhdGVzIHRoZSBzaGFyZWQgY2hhbm5lbEhhc2ggdG8gcmVmbGVjdCBhbnkgTElTVEVO CiAgb3IgVU5MSVNURU4gYWN0aW9ucyBwZXJmb3JtZWQgaW4gdGhlIHRyYW5zYWN0aW9uLgoq IFNpZ25hbEJhY2tlbmRzIGNvbnN1bHRzIHRoaXMgaGFzaCB0byBmaW5kIHRoZSBiYWNrZW5k cyB0aGF0IGFyZQogIGxpc3RlbmluZyBvbiB0aGUgY2hhbm5lbHMgYmVpbmcgbm90aWZpZWQg aW4gdGhlIGN1cnJlbnQgZGF0YWJhc2UsIGFuZAogIHNpZ25hbHMgb25seSB0aG9zZS4KCkVh Y2ggYmFja2VuZCdzIGVudHJ5IGluIEFzeW5jUXVldWVDb250cm9sIG5vdyBpbmNsdWRlcyBh IHdha2V1cFBlbmRpbmcKZmxhZyB0byBwcmV2ZW50IGR1cGxpY2F0ZSBzaWduYWxzIHdoaWxl IGEgcHJldmlvdXMgd2FrZXVwIGlzIHN0aWxsIGJlaW5nCnByb2Nlc3NlZC4KCkRpcmVjdCBh ZHZhbmNlbWVudAotLS0tLS0tLS0tLS0tLS0tLS0KCkEgZnVydGhlciBvcHRpbWl6YXRpb24g YXZvaWRzIHNpZ25hbGluZyBpZGxlIGJhY2tlbmRzIHRoYXQgYXJlIG5vdApsaXN0ZW5pbmcg b24gYW55IG9mIHRoZSBjaGFubmVscyBub3RpZmllZCB3aXRoaW4gdGhlIHRyYW5zYWN0aW9u LgoKV2hpbGUgcXVldWluZyBub3RpZmljYXRpb25zLCBQcmVDb21taXRfTm90aWZ5IHJlY29y ZHMgdGhlIHF1ZXVlIGhlYWQKcG9zaXRpb24gYm90aCBiZWZvcmUgYW5kIGFmdGVyIHdyaXRp bmcgaXRzIG5vdGlmaWNhdGlvbnMuIEJlY2F1c2UgYWxsCndyaXRlcnMgYXJlIHNlcmlhbGl6 ZWQgYnkgdGhlIGV4aXN0aW5nIGNsdXN0ZXItd2lkZSBoZWF2eXdlaWdodCBsb2NrIG9uCiJk YXRhYmFzZSAwIiwgbm8gYmFja2VuZCAoZnJvbSBhbnkgZGF0YWJhc2UpIGNhbiBpbnNlcnQg ZW50cmllcyBiZXR3ZWVuCnRob3NlIHR3byBwb2ludHMuIFRoaXMgZ3VhcmFudGVlcyB0aGF0 IHRoZSByZWdpb24gW29sZEhlYWQsIG5ld0hlYWQpCmNvbnRhaW5zIG9ubHkgdGhlIGVudHJp ZXMgd3JpdHRlbiBieSBvdXIgY29tbWl0LgoKU2lnbmFsQmFja2VuZHMgdXNlcyB0aGlzIGZh Y3QgdG8gZGlyZWN0bHkgYWR2YW5jZSBhbnkgYmFja2VuZCBzdGlsbApwb3NpdGlvbmVkIGF0 IG9sZEhlYWQgdXAgdG8gbmV3SGVhZCwgYXZvaWRpbmcgYSBuZWVkbGVzcyB3YWtldXAgZm9y Cmxpc3RlbmVycyB0aGF0IHdvdWxkIG90aGVyd2lzZSBub3QgZmluZCBhbnkgbm90aWZpZXMg b2YgaW50ZXJlc3QuCgpUbyBoYW5kbGUgYWR2YW5jaW5nIGJhY2tlbmRzIGNvcnJlY3RseSwg ZWFjaCBiYWNrZW5kJ3MgZW50cnkgdHJhY2tzIGJvdGgKd2hldGhlciBpdCBpcyBjdXJyZW50 bHkgYWR2YW5jaW5nIChpc0FkdmFuY2luZykgYW5kIHRoZSB0YXJnZXQgcG9zaXRpb24KaXQg aXMgYWR2YW5jaW5nIHRvIChhZHZhbmNpbmdQb3MpLiBUaGlzIGFsbG93cyBTaWduYWxCYWNr ZW5kcyB0byBzaWduYWwKYWR2YW5jaW5nIGJhY2tlbmRzIG9ubHkgd2hlbiB0aGVpciB0YXJn ZXQgcG9zaXRpb24gd291bGQgbGVhdmUgdGhlbQpiZWhpbmQgdGhlIG5ldyBxdWV1ZSBoZWFk LCB3aGlsZSBzYWZlbHkgZGlyZWN0LWFkdmFuY2luZyBpZGxlIGJhY2tlbmRzCnRoYXQgd291 bGQgbm90IGJlIGludGVyZXN0ZWQgaW4gdGhlIG5ld2x5IHdyaXR0ZW4gbm90aWZpY2F0aW9u cy4KCk90aGVyIG5vdGVzCi0tLS0tLS0tLS0tCgoqIE1haW50YWlucyBkdWFsIGRhdGEgc3Ry dWN0dXJlczogYSBzaGFyZWQgY2hhbm5lbEhhc2ggZm9yIGRldGVybWluaW5nCiAgd2hpY2gg YmFja2VuZHMgdG8gc2lnbmFsLCBhbmQgYSBsb2NhbCBwZXItYmFja2VuZCBsaXN0ZW5DaGFu bmVscyBsaXN0CiAgZm9yIGZhc3QgbG9jay1mcmVlIGxvb2t1cHMgZHVyaW5nIG5vdGlmaWNh dGlvbiBwcm9jZXNzaW5nLiBUaGlzIGF2b2lkcwogIGNvbnRlbnRpb24gb24gdGhlIHNoYXJl ZCBoYXNoIGR1cmluZyB0aGUgaGlnaC1mcmVxdWVuY3kgSXNMaXN0ZW5pbmdPbgogIGNoZWNr cyB0aGF0IG9jY3VyIGZvciBldmVyeSBub3RpZmljYXRpb24gcmVhZCBmcm9tIHRoZSBxdWV1 ZS4KKiBCYWNrZW5kcyByZW1haW4gcmVnaXN0ZXJlZCBpbiB0aGUgZ2xvYmFsIGxpc3RlbmVy IGxpc3QgYXMgbG9uZyBhcwogIGxpc3RlbkNoYW5uZWxzIGlzIG5vbi1lbXB0eS4KKiBBZGRz IExXTG9jayB0cmFuY2hlIE5PVElGWV9DSEFOTkVMX0hBU0ggYW5kIHdhaXQgZXZlbnQKICBO b3RpZnlDaGFubmVsSGFzaCBmb3IgdmlzaWJpbGl0eS4KKiBObyB1c2VyLXZpc2libGUgYmVo YXZpb3JhbCBjaGFuZ2VzOyB0aGlzIGlzIGFuIGludGVybmFsIG9wdGltaXphdGlvbgogIG9u bHkuCi0tLQogc3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5bmMuYyAgICAgICAgICAgICAgICAg IHwgNzE2ICsrKysrKysrKysrKysrKy0tLQogLi4uL3V0aWxzL2FjdGl2aXR5L3dhaXRfZXZl bnRfbmFtZXMudHh0ICAgICAgIHwgICAxICsKIHNyYy9pbmNsdWRlL3N0b3JhZ2UvbHdsb2Nr bGlzdC5oICAgICAgICAgICAgICB8ICAgMSArCiBzcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRl ZnMubGlzdCAgICAgICAgICAgICAgfCAgIDIgKwogNCBmaWxlcyBjaGFuZ2VkLCA2MTYgaW5z ZXJ0aW9ucygrKSwgMTA0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L2NvbW1hbmRzL2FzeW5jLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jCmluZGV4 IDRiZDM3ZDViZWI1Li45ZjdiOGEzMzI0YSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29t bWFuZHMvYXN5bmMuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jCkBAIC0y NCw4ICsyNCwxMCBAQAogICoJICBBbGwgbm90aWZpY2F0aW9uIG1lc3NhZ2VzIGFyZSBwbGFj ZWQgaW4gdGhlIHF1ZXVlIGFuZCBsYXRlciByZWFkIG91dAogICoJICBieSBsaXN0ZW5pbmcg YmFja2VuZHMuCiAgKgotICoJICBUaGVyZSBpcyBubyBjZW50cmFsIGtub3dsZWRnZSBvZiB3 aGljaCBiYWNrZW5kIGxpc3RlbnMgb24gd2hpY2ggY2hhbm5lbDsKLSAqCSAgZXZlcnkgYmFj a2VuZCBoYXMgaXRzIG93biBsaXN0IG9mIGludGVyZXN0aW5nIGNoYW5uZWxzLgorICoJICBX ZSBhbHNvIG1haW50YWluIGEgZHluYW1pYyBzaGFyZWQgaGFzaCB0YWJsZSAoZHNoYXNoKSB0 aGF0IG1hcHMgY2hhbm5lbAorICoJICBuYW1lcyB0byB0aGUgc2V0IG9mIGJhY2tlbmRzIGxp c3RlbmluZyBvbiBlYWNoIGNoYW5uZWwuIFRoaXMgdGFibGUgaXMKKyAqCSAgY3JlYXRlZCBs YXppbHkgb24gdGhlIGZpcnN0IExJU1RFTiBjb21tYW5kIGFuZCBncm93cyBkeW5hbWljYWxs eSBhcworICoJICBuZWVkZWQuCiAgKgogICoJICBBbHRob3VnaCB0aGVyZSBpcyBvbmx5IG9u ZSBxdWV1ZSwgbm90aWZpY2F0aW9ucyBhcmUgdHJlYXRlZCBhcyBiZWluZwogICoJICBkYXRh YmFzZS1sb2NhbDsgdGhpcyBpcyBkb25lIGJ5IGluY2x1ZGluZyB0aGUgc2VuZGVyJ3MgZGF0 YWJhc2UgT0lECkBAIC02OCwxNiArNzAsMjEgQEAKICAqCSAgQ29tbWl0VHJhbnNhY3Rpb24o KSB3aGljaCB3aWxsIHRoZW4gZG8gdGhlIGFjdHVhbCB0cmFuc2FjdGlvbiBjb21taXQuCiAg KgogICoJICBBZnRlciBjb21taXQgd2UgYXJlIGNhbGxlZCBhbm90aGVyIHRpbWUgKEF0Q29t bWl0X05vdGlmeSgpKS4gSGVyZSB3ZQotICoJICBtYWtlIGFueSBhY3R1YWwgdXBkYXRlcyB0 byB0aGUgZWZmZWN0aXZlIGxpc3RlbiBzdGF0ZSAobGlzdGVuQ2hhbm5lbHMpLgotICoJICBU aGVuIHdlIHNpZ25hbCBhbnkgYmFja2VuZHMgdGhhdCBtYXkgYmUgaW50ZXJlc3RlZCBpbiBv dXIgbWVzc2FnZXMKLSAqCSAgKGluY2x1ZGluZyBvdXIgb3duIGJhY2tlbmQsIGlmIGxpc3Rl bmluZykuICBUaGlzIGlzIGRvbmUgYnkKLSAqCSAgU2lnbmFsQmFja2VuZHMoKSwgd2hpY2gg c2NhbnMgdGhlIGxpc3Qgb2YgbGlzdGVuaW5nIGJhY2tlbmRzIGFuZCBzZW5kcyBhCi0gKgkg IFBST0NTSUdfTk9USUZZX0lOVEVSUlVQVCBzaWduYWwgdG8gZXZlcnkgbGlzdGVuaW5nIGJh Y2tlbmQgKHdlIGRvbid0Ci0gKgkgIGtub3cgd2hpY2ggYmFja2VuZCBpcyBsaXN0ZW5pbmcg b24gd2hpY2ggY2hhbm5lbCBzbyB3ZSBtdXN0IHNpZ25hbCB0aGVtCi0gKgkgIGFsbCkuICBX ZSBjYW4gZXhjbHVkZSBiYWNrZW5kcyB0aGF0IGFyZSBhbHJlYWR5IHVwIHRvIGRhdGUsIHRo b3VnaCwgYW5kCi0gKgkgIHdlIGNhbiBhbHNvIGV4Y2x1ZGUgYmFja2VuZHMgdGhhdCBhcmUg aW4gb3RoZXIgZGF0YWJhc2VzICh1bmxlc3MgdGhleQotICoJICBhcmUgd2F5IGJlaGluZCBh bmQgc2hvdWxkIGJlIGtpY2tlZCB0byBtYWtlIHRoZW0gYWR2YW5jZSB0aGVpcgotICoJICBw b2ludGVycykuCisgKgkgIG1ha2UgYW55IGFjdHVhbCB1cGRhdGVzIHRvIHRoZSBsb2NhbCBs aXN0ZW4gc3RhdGUgKGxpc3RlbkNoYW5uZWxzSGFzaCkgYW5kCisgKgkgIHNoYXJlZCBjaGFu bmVsIGhhc2ggdGFibGUgKGNoYW5uZWxIYXNoKS4gIFRoZW4gd2Ugc2lnbmFsIGFueSBiYWNr ZW5kcworICoJICB0aGF0IG1heSBiZSBpbnRlcmVzdGVkIGluIG91ciBtZXNzYWdlcyAoaW5j bHVkaW5nIG91ciBvd24gYmFja2VuZCwKKyAqCSAgaWYgbGlzdGVuaW5nKS4gIFRoaXMgaXMg ZG9uZSBieSBTaWduYWxCYWNrZW5kcygpLCB3aGljaCBjb25zdWx0cyB0aGUKKyAqCSAgc2hh cmVkIGNoYW5uZWwgaGFzaCB0YWJsZSB0byBpZGVudGlmeSBsaXN0ZW5lcnMgZm9yIHRoZSBj aGFubmVscyB0aGF0CisgKgkgIGhhdmUgcGVuZGluZyBub3RpZmljYXRpb25zIGluIHRoZSBj dXJyZW50IGRhdGFiYXNlLiAgRWFjaCBzZWxlY3RlZAorICoJICBiYWNrZW5kIGlzIG1hcmtl ZCBhcyBoYXZpbmcgYSB3YWtldXAgcGVuZGluZyB0byBhdm9pZCBkdXBsaWNhdGUgc2lnbmFs cywKKyAqCSAgYW5kIGEgUFJPQ1NJR19OT1RJRllfSU5URVJSVVBUIHNpZ25hbCBpcyBzZW50 IHRvIGl0LgorICoKKyAqCSAgV2hlbiB3cml0aW5nIG5vdGlmaWNhdGlvbnMsIFByZUNvbW1p dF9Ob3RpZnkoKSByZWNvcmRzIHRoZSBxdWV1ZSBoZWFkCisgKgkgIHBvc2l0aW9uIGJvdGgg YmVmb3JlIGFuZCBhZnRlciB0aGUgd3JpdGUuICBCZWNhdXNlIGFsbCB3cml0ZXJzIHNlcmlh bGl6ZQorICoJICBvbiBhIGNsdXN0ZXItd2lkZSBoZWF2eXdlaWdodCBsb2NrLCBubyBiYWNr ZW5kIGNhbiBpbnNlcnQgZW50cmllcyBiZXR3ZWVuCisgKgkgIHRoZXNlIHR3byBwb2ludHMu ICBTaWduYWxCYWNrZW5kcygpIHVzZXMgdGhpcyBmYWN0IHRvIGRpcmVjdGx5IGFkdmFuY2Ug YW55CisgKgkgIGJhY2tlbmQgdGhhdCBpcyBzdGlsbCBwb3NpdGlvbmVkIGF0IHRoZSBvbGQg aGVhZCwgYXZvaWRpbmcgdW5uZWNlc3NhcnkKKyAqCSAgd2FrZXVwcyBmb3IgaWRsZSBsaXN0 ZW5lcnMgdGhhdCBoYXZlIG5vdGhpbmcgdG8gcmVhZC4KICAqCiAgKgkgIEZpbmFsbHksIGFm dGVyIHdlIGFyZSBvdXQgb2YgdGhlIHRyYW5zYWN0aW9uIGFsdG9nZXRoZXIgYW5kIGFib3V0 IHRvIGdvCiAgKgkgIGlkbGUsIHdlIHNjYW4gdGhlIHF1ZXVlIGZvciBtZXNzYWdlcyB0aGF0 IG5lZWQgdG8gYmUgc2VudCB0byBvdXIKQEAgLTEzNywxNCArMTQ0LDE3IEBACiAjaW5jbHVk ZSAiY29tbWFuZHMvYXN5bmMuaCIKICNpbmNsdWRlICJjb21tb24vaGFzaGZuLmgiCiAjaW5j bHVkZSAiZnVuY2FwaS5oIgorI2luY2x1ZGUgImxpYi9kc2hhc2guaCIKICNpbmNsdWRlICJs aWJwcS9saWJwcS5oIgogI2luY2x1ZGUgImxpYnBxL3BxZm9ybWF0LmgiCiAjaW5jbHVkZSAi bWlzY2FkbWluLmgiCisjaW5jbHVkZSAic3RvcmFnZS9kc21fcmVnaXN0cnkuaCIKICNpbmNs dWRlICJzdG9yYWdlL2lwYy5oIgogI2luY2x1ZGUgInN0b3JhZ2UvbG1nci5oIgogI2luY2x1 ZGUgInN0b3JhZ2UvcHJvY3NpZ25hbC5oIgogI2luY2x1ZGUgInRjb3AvdGNvcHByb3QuaCIK ICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUgInV0aWxzL2RzYS5oIgog I2luY2x1ZGUgInV0aWxzL2d1Y19ob29rcy5oIgogI2luY2x1ZGUgInV0aWxzL21lbXV0aWxz LmgiCiAjaW5jbHVkZSAidXRpbHMvcHNfc3RhdHVzLmgiCkBAIC0xNjIsNiArMTcyLDI5IEBA CiAgKi8KICNkZWZpbmUgTk9USUZZX1BBWUxPQURfTUFYX0xFTkdUSAkoQkxDS1NaIC0gTkFN RURBVEFMRU4gLSAxMjgpCiAKKy8qCisgKiBDaGFubmVsIGhhc2ggdGFibGUgZGVmaW5pdGlv bnMKKyAqCisgKiBUaGlzIGhhc2ggdGFibGUgbWFwcyAoZGF0YWJhc2UgT0lELCBjaGFubmVs IG5hbWUpIGtleXMgdG8gYXJyYXlzIG9mCisgKiBQcm9jTnVtYmVycyByZXByZXNlbnRpbmcg dGhlIGJhY2tlbmRzIGxpc3RlbmluZyBvbiBlYWNoIGNoYW5uZWwuCisgKi8KKworI2RlZmlu ZSBJTklUSUFMX0xJU1RFTkVSU19BUlJBWV9TSVpFIDQKKwordHlwZWRlZiBzdHJ1Y3QgQ2hh bm5lbEhhc2hLZXkKK3sKKwlPaWQJCQlkYm9pZDsKKwljaGFyCQljaGFubmVsW05BTUVEQVRB TEVOXTsKK30gQ2hhbm5lbEhhc2hLZXk7CisKK3R5cGVkZWYgc3RydWN0IENoYW5uZWxFbnRy eQoreworCUNoYW5uZWxIYXNoS2V5IGtleTsKKwlkc2FfcG9pbnRlciBsaXN0ZW5lcnNBcnJh eTsgLyogRFNBIHBvaW50ZXIgdG8gUHJvY051bWJlciBhcnJheSAqLworCWludAkJCW51bUxp c3RlbmVyczsJLyogTnVtYmVyIG9mIGxpc3RlbmVycyBjdXJyZW50bHkgc3RvcmVkICovCisJ aW50CQkJYWxsb2NhdGVkTGlzdGVuZXJzOyAvKiBBbGxvY2F0ZWQgc2l6ZSBvZiBhcnJheSAq LworfSBDaGFubmVsRW50cnk7CisKIC8qCiAgKiBTdHJ1Y3QgcmVwcmVzZW50aW5nIGFuIGVu dHJ5IGluIHRoZSBnbG9iYWwgbm90aWZ5IHF1ZXVlCiAgKgpAQCAtMjI0LDExICsyNTcsMTYg QEAgdHlwZWRlZiBzdHJ1Y3QgUXVldWVQb3NpdGlvbgogCSAoeCkucGFnZSAhPSAoeSkucGFn ZSA/ICh4KSA6IFwKIAkgKHgpLm9mZnNldCA+ICh5KS5vZmZzZXQgPyAoeCkgOiAoeSkpCiAK Ky8qIHJldHVybnMgdHJ1ZSBpZiB4IGNvbWVzIGJlZm9yZSB5IGluIHF1ZXVlIG9yZGVyICov CisjZGVmaW5lIFFVRVVFX1BPU19QUkVDRURFUyh4LHkpIFwKKwkoYXN5bmNRdWV1ZVBhZ2VQ cmVjZWRlcygoeCkucGFnZSwgKHkpLnBhZ2UpIHx8IFwKKwkgKCh4KS5wYWdlID09ICh5KS5w YWdlICYmICh4KS5vZmZzZXQgPCAoeSkub2Zmc2V0KSkKKwogLyoKICAqIFBhcmFtZXRlciBk ZXRlcm1pbmluZyBob3cgb2Z0ZW4gd2UgdHJ5IHRvIGFkdmFuY2UgdGhlIHRhaWwgcG9pbnRl cjoKICAqIHdlIGRvIHRoYXQgYWZ0ZXIgZXZlcnkgUVVFVUVfQ0xFQU5VUF9ERUxBWSBwYWdl cyBvZiBOT1RJRlkgZGF0YS4gIFRoaXMgaXMKLSAqIGFsc28gdGhlIGRpc3RhbmNlIGJ5IHdo aWNoIGEgYmFja2VuZCBpbiBhbm90aGVyIGRhdGFiYXNlIG5lZWRzIHRvIGJlCi0gKiBiZWhp bmQgYmVmb3JlIHdlJ2xsIGRlY2lkZSB3ZSBuZWVkIHRvIHdha2UgaXQgdXAgdG8gYWR2YW5j ZSBpdHMgcG9pbnRlci4KKyAqIGFsc28gdGhlIGRpc3RhbmNlIGJ5IHdoaWNoIGEgYmFja2Vu ZCBuZWVkcyB0byBiZSBiZWhpbmQgYmVmb3JlIHdlJ2xsCisgKiBkZWNpZGUgd2UgbmVlZCB0 byB3YWtlIGl0IHVwIHRvIGFkdmFuY2UgaXRzIHBvaW50ZXIuCiAgKgogICogUmVzaXN0IHRo ZSB0ZW1wdGF0aW9uIHRvIG1ha2UgdGhpcyByZWFsbHkgbGFyZ2UuICBXaGlsZSB0aGF0IHdv dWxkIHNhdmUKICAqIHdvcmsgaW4gc29tZSBwbGFjZXMsIGl0IHdvdWxkIGFkZCBjb3N0IGlu IG90aGVycy4gIEluIHBhcnRpY3VsYXIsIHRoaXMKQEAgLTI0Niw2ICsyODQsOSBAQCB0eXBl ZGVmIHN0cnVjdCBRdWV1ZUJhY2tlbmRTdGF0dXMKIAlPaWQJCQlkYm9pZDsJCQkvKiBiYWNr ZW5kJ3MgZGF0YWJhc2UgT0lELCBvciBJbnZhbGlkT2lkICovCiAJUHJvY051bWJlcgluZXh0 TGlzdGVuZXI7CS8qIGlkIG9mIG5leHQgbGlzdGVuZXIsIG9yIElOVkFMSURfUFJPQ19OVU1C RVIgKi8KIAlRdWV1ZVBvc2l0aW9uIHBvczsJCQkvKiBiYWNrZW5kIGhhcyByZWFkIHF1ZXVl IHVwIHRvIGhlcmUgKi8KKwlib29sCQl3YWtldXBQZW5kaW5nOwkvKiBzaWduYWwgc2VudCBi dXQgbm90IHlldCBwcm9jZXNzZWQgKi8KKwlib29sCQlpc0FkdmFuY2luZzsJLyogYmFja2Vu ZCBpcyBhZHZhbmNpbmcgaXRzIHBvc2l0aW9uICovCisJUXVldWVQb3NpdGlvbiBhZHZhbmNp bmdQb3M7IC8qIHRhcmdldCBwb3NpdGlvbiBiYWNrZW5kIGlzIGFkdmFuY2luZyB0byAqLwog fSBRdWV1ZUJhY2tlbmRTdGF0dXM7CiAKIC8qCkBAIC0yNjAsOSArMzAxLDEwIEBAIHR5cGVk ZWYgc3RydWN0IFF1ZXVlQmFja2VuZFN0YXR1cwogICogKHNpbmNlIG5vIG90aGVyIGJhY2tl bmQgd2lsbCBpbnNwZWN0IGl0KS4KICAqCiAgKiBXaGVuIGhvbGRpbmcgTm90aWZ5UXVldWVM b2NrIGluIEVYQ0xVU0lWRSBtb2RlLCBiYWNrZW5kcyBjYW4gaW5zcGVjdCB0aGUKLSAqIGVu dHJpZXMgb2Ygb3RoZXIgYmFja2VuZHMgYW5kIGFsc28gY2hhbmdlIHRoZSBoZWFkIHBvaW50 ZXIuIFdoZW4gaG9sZGluZwotICogYm90aCBOb3RpZnlRdWV1ZUxvY2sgYW5kIE5vdGlmeVF1 ZXVlVGFpbExvY2sgaW4gRVhDTFVTSVZFIG1vZGUsIGJhY2tlbmRzCi0gKiBjYW4gY2hhbmdl IHRoZSB0YWlsIHBvaW50ZXJzLgorICogZW50cmllcyBvZiBvdGhlciBiYWNrZW5kcyBhbmQg YWxzbyBjaGFuZ2UgdGhlIGhlYWQgcG9pbnRlci4gVGhleSBjYW4KKyAqIGFsc28gYWR2YW5j ZSBvdGhlciBiYWNrZW5kcycgcXVldWUgcG9zaXRpb25zLCB1bmxlc3MgdGhleSBhcmUgbm90 CisgKiBpbiB0aGUgcHJvY2VzcyBvZiBkb2luZyB0aGF0IHRoZW1zZWx2ZXMuIFdoZW4gaG9s ZGluZyBib3RoIE5vdGlmeVF1ZXVlTG9jayBhbmQKKyAqIE5vdGlmeVF1ZXVlVGFpbExvY2sg aW4gRVhDTFVTSVZFIG1vZGUsIGJhY2tlbmRzIGNhbiBjaGFuZ2UgdGhlIHRhaWwgcG9pbnRl cnMuCiAgKgogICogU0xSVSBidWZmZXIgcG9vbCBpcyBkaXZpZGVkIGluIGJhbmtzIGFuZCBi YW5rIHdpc2UgU0xSVSBsb2NrIGlzIHVzZWQgYXMKICAqIHRoZSBjb250cm9sIGxvY2sgZm9y IHRoZSBwZ19ub3RpZnkgU0xSVSBidWZmZXJzLgpAQCAtMjg4LDExICszMzAsMTYgQEAgdHlw ZWRlZiBzdHJ1Y3QgQXN5bmNRdWV1ZUNvbnRyb2wKIAlQcm9jTnVtYmVyCWZpcnN0TGlzdGVu ZXI7CS8qIGlkIG9mIGZpcnN0IGxpc3RlbmVyLCBvcgogCQkJCQkJCQkgKiBJTlZBTElEX1BS T0NfTlVNQkVSICovCiAJVGltZXN0YW1wVHogbGFzdFF1ZXVlRmlsbFdhcm47CS8qIHRpbWUg b2YgbGFzdCBxdWV1ZS1mdWxsIG1zZyAqLworCWRzYV9oYW5kbGUJY2hhbm5lbEhhc2hEU0E7 CisJZHNoYXNoX3RhYmxlX2hhbmRsZSBjaGFubmVsSGFzaERTSDsKIAlRdWV1ZUJhY2tlbmRT dGF0dXMgYmFja2VuZFtGTEVYSUJMRV9BUlJBWV9NRU1CRVJdOwogfSBBc3luY1F1ZXVlQ29u dHJvbDsKIAogc3RhdGljIEFzeW5jUXVldWVDb250cm9sICphc3luY1F1ZXVlQ29udHJvbDsK IAorc3RhdGljIGRzYV9hcmVhICpjaGFubmVsRFNBID0gTlVMTDsKK3N0YXRpYyBkc2hhc2hf dGFibGUgKmNoYW5uZWxIYXNoID0gTlVMTDsKKwogI2RlZmluZSBRVUVVRV9IRUFECQkJCQko YXN5bmNRdWV1ZUNvbnRyb2wtPmhlYWQpCiAjZGVmaW5lIFFVRVVFX1RBSUwJCQkJCShhc3lu Y1F1ZXVlQ29udHJvbC0+dGFpbCkKICNkZWZpbmUgUVVFVUVfU1RPUF9QQUdFCQkJCShhc3lu Y1F1ZXVlQ29udHJvbC0+c3RvcFBhZ2UpCkBAIC0zMDEsNiArMzQ4LDkgQEAgc3RhdGljIEFz eW5jUXVldWVDb250cm9sICphc3luY1F1ZXVlQ29udHJvbDsKICNkZWZpbmUgUVVFVUVfQkFD S0VORF9EQk9JRChpKQkJKGFzeW5jUXVldWVDb250cm9sLT5iYWNrZW5kW2ldLmRib2lkKQog I2RlZmluZSBRVUVVRV9ORVhUX0xJU1RFTkVSKGkpCQkoYXN5bmNRdWV1ZUNvbnRyb2wtPmJh Y2tlbmRbaV0ubmV4dExpc3RlbmVyKQogI2RlZmluZSBRVUVVRV9CQUNLRU5EX1BPUyhpKQkJ KGFzeW5jUXVldWVDb250cm9sLT5iYWNrZW5kW2ldLnBvcykKKyNkZWZpbmUgUVVFVUVfQkFD S0VORF9XQUtFVVBfUEVORElORyhpKQkoYXN5bmNRdWV1ZUNvbnRyb2wtPmJhY2tlbmRbaV0u d2FrZXVwUGVuZGluZykKKyNkZWZpbmUgUVVFVUVfQkFDS0VORF9JU19BRFZBTkNJTkcoaSkJ KGFzeW5jUXVldWVDb250cm9sLT5iYWNrZW5kW2ldLmlzQWR2YW5jaW5nKQorI2RlZmluZSBR VUVVRV9CQUNLRU5EX0FEVkFOQ0lOR19QT1MoaSkJKGFzeW5jUXVldWVDb250cm9sLT5iYWNr ZW5kW2ldLmFkdmFuY2luZ1BvcykKIAogLyoKICAqIFRoZSBTTFJVIGJ1ZmZlciBhcmVhIHRo cm91Z2ggd2hpY2ggd2UgYWNjZXNzIHRoZSBub3RpZmljYXRpb24gcXVldWUKQEAgLTMxMywx NiArMzYzLDE2IEBAIHN0YXRpYyBTbHJ1Q3RsRGF0YSBOb3RpZnlDdGxEYXRhOwogI2RlZmlu ZSBRVUVVRV9GVUxMX1dBUk5fSU5URVJWQUwJNTAwMAkvKiB3YXJuIGF0IG1vc3Qgb25jZSBl dmVyeSA1cyAqLwogCiAvKgotICogbGlzdGVuQ2hhbm5lbHMgaWRlbnRpZmllcyB0aGUgY2hh bm5lbHMgd2UgYXJlIGFjdHVhbGx5IGxpc3RlbmluZyB0bwotICogKGllLCBoYXZlIGNvbW1p dHRlZCBhIExJU1RFTiBvbikuICBJdCBpcyBhIHNpbXBsZSBsaXN0IG9mIGNoYW5uZWwgbmFt ZXMsCisgKiBsaXN0ZW5DaGFubmVsc0hhc2ggaWRlbnRpZmllcyB0aGUgY2hhbm5lbHMgd2Ug YXJlIGFjdHVhbGx5IGxpc3RlbmluZyB0bworICogKGllLCBoYXZlIGNvbW1pdHRlZCBhIExJ U1RFTiBvbikuICBJdCBpcyBhIGhhc2ggdGFibGUgb2YgY2hhbm5lbCBuYW1lcywKICAqIGFs bG9jYXRlZCBpbiBUb3BNZW1vcnlDb250ZXh0LgogICovCi1zdGF0aWMgTGlzdCAqbGlzdGVu Q2hhbm5lbHMgPSBOSUw7CS8qIGxpc3Qgb2YgQyBzdHJpbmdzICovCitzdGF0aWMgSFRBQiAq bGlzdGVuQ2hhbm5lbHNIYXNoID0gTlVMTDsKIAogLyoKICAqIFN0YXRlIGZvciBwZW5kaW5n IExJU1RFTi9VTkxJU1RFTiBhY3Rpb25zIGNvbnNpc3RzIG9mIGFuIG9yZGVyZWQgbGlzdCBv ZgogICogYWxsIGFjdGlvbnMgcmVxdWVzdGVkIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9u LiAgQXMgZXhwbGFpbmVkIGFib3ZlLAotICogd2UgZG9uJ3QgYWN0dWFsbHkgY2hhbmdlIGxp c3RlbkNoYW5uZWxzIHVudGlsIHdlIHJlYWNoIHRyYW5zYWN0aW9uIGNvbW1pdC4KKyAqIHdl IGRvbid0IGFjdHVhbGx5IGNoYW5nZSBsaXN0ZW5DaGFubmVsc0hhc2ggdW50aWwgd2UgcmVh Y2ggdHJhbnNhY3Rpb24gY29tbWl0LgogICoKICAqIFRoZSBsaXN0IGlzIGtlcHQgaW4gQ3Vy VHJhbnNhY3Rpb25Db250ZXh0LiAgSW4gc3VidHJhbnNhY3Rpb25zLCBlYWNoCiAgKiBzdWJ0 cmFuc2FjdGlvbiBoYXMgaXRzIG93biBsaXN0IGluIGl0cyBvd24gQ3VyVHJhbnNhY3Rpb25D b250ZXh0LCBidXQKQEAgLTM5MSw2ICs0NDEsNyBAQCB0eXBlZGVmIHN0cnVjdCBOb3RpZmlj YXRpb25MaXN0CiAJaW50CQkJbmVzdGluZ0xldmVsOwkvKiBjdXJyZW50IHRyYW5zYWN0aW9u IG5lc3RpbmcgZGVwdGggKi8KIAlMaXN0CSAgICpldmVudHM7CQkJLyogbGlzdCBvZiBOb3Rp ZmljYXRpb24gc3RydWN0cyAqLwogCUhUQUIJICAgKmhhc2h0YWI7CQkvKiBoYXNoIG9mIE5v dGlmaWNhdGlvbkhhc2ggc3RydWN0cywgb3IgTlVMTCAqLworCUhUQUIJICAgKmNoYW5uZWxI YXNodGFiOyAvKiBoYXNoIG9mIHVuaXF1ZSBjaGFubmVsIG5hbWVzLCBvciBOVUxMICovCiAJ c3RydWN0IE5vdGlmaWNhdGlvbkxpc3QgKnVwcGVyOyAvKiBkZXRhaWxzIGZvciB1cHBlciB0 cmFuc2FjdGlvbiBsZXZlbHMgKi8KIH0gTm90aWZpY2F0aW9uTGlzdDsKIApAQCAtNDAxLDYg KzQ1MiwxMSBAQCBzdHJ1Y3QgTm90aWZpY2F0aW9uSGFzaAogCU5vdGlmaWNhdGlvbiAqZXZl bnQ7CQkvKiA9PiB0aGUgYWN0dWFsIE5vdGlmaWNhdGlvbiBzdHJ1Y3QgKi8KIH07CiAKK3N0 cnVjdCBDaGFubmVsSGFzaAoreworCWNoYXIJCWNoYW5uZWxbTkFNRURBVEFMRU5dOworfTsK Kwogc3RhdGljIE5vdGlmaWNhdGlvbkxpc3QgKnBlbmRpbmdOb3RpZmllcyA9IE5VTEw7CiAK IC8qCkBAIC00MTgsNiArNDc0LDIwIEBAIHN0YXRpYyBib29sIHVubGlzdGVuRXhpdFJlZ2lz dGVyZWQgPSBmYWxzZTsKIC8qIFRydWUgaWYgd2UncmUgY3VycmVudGx5IHJlZ2lzdGVyZWQg YXMgYSBsaXN0ZW5lciBpbiBhc3luY1F1ZXVlQ29udHJvbCAqLwogc3RhdGljIGJvb2wgYW1S ZWdpc3RlcmVkTGlzdGVuZXIgPSBmYWxzZTsKIAorLyoKKyAqIFF1ZXVlIGhlYWQgcG9zaXRp b25zIGZvciBkaXJlY3QgYWR2YW5jZW1lbnQuCisgKiBUaGVzZSBhcmUgY2FwdHVyZWQgZHVy aW5nIFByZUNvbW1pdF9Ob3RpZnkgd2hpbGUgaG9sZGluZyB0aGUgaGVhdnl3ZWlnaHQKKyAq IGxvY2sgb24gZGF0YWJhc2UgMCwgZW5zdXJpbmcgbm8gb3RoZXIgYmFja2VuZCBjYW4gaW5z ZXJ0IG5vdGlmaWNhdGlvbnMKKyAqIGJldHdlZW4gdGhlbS4gIFNpZ25hbEJhY2tlbmRzIHVz ZXMgdGhlc2UgdG8gYWR2YW5jZSBpZGxlIGJhY2tlbmRzLgorICovCitzdGF0aWMgUXVldWVQ b3NpdGlvbiBxdWV1ZUhlYWRCZWZvcmVXcml0ZTsKK3N0YXRpYyBRdWV1ZVBvc2l0aW9uIHF1 ZXVlSGVhZEFmdGVyV3JpdGU7CisKKy8qCisgKiBMaXN0IG9mIGNoYW5uZWxzIHdpdGggcGVu ZGluZyBub3RpZmljYXRpb25zIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgorICovCitz dGF0aWMgTGlzdCAqcGVuZGluZ05vdGlmeUNoYW5uZWxzID0gTklMOworCiAvKiBoYXZlIHdl IGFkdmFuY2VkIHRvIGEgcGFnZSB0aGF0J3MgYSBtdWx0aXBsZSBvZiBRVUVVRV9DTEVBTlVQ X0RFTEFZPyAqLwogc3RhdGljIGJvb2wgdHJ5QWR2YW5jZVRhaWwgPSBmYWxzZTsKIApAQCAt NDI4LDcgKzQ5OCw2IEBAIGJvb2wJCVRyYWNlX25vdGlmeSA9IGZhbHNlOwogaW50CQkJbWF4 X25vdGlmeV9xdWV1ZV9wYWdlcyA9IDEwNDg1NzY7CiAKIC8qIGxvY2FsIGZ1bmN0aW9uIHBy b3RvdHlwZXMgKi8KLXN0YXRpYyBpbmxpbmUgaW50NjQgYXN5bmNRdWV1ZVBhZ2VEaWZmKGlu dDY0IHAsIGludDY0IHEpOwogc3RhdGljIGlubGluZSBib29sIGFzeW5jUXVldWVQYWdlUHJl Y2VkZXMoaW50NjQgcCwgaW50NjQgcSk7CiBzdGF0aWMgdm9pZCBxdWV1ZV9saXN0ZW4oTGlz dGVuQWN0aW9uS2luZCBhY3Rpb24sIGNvbnN0IGNoYXIgKmNoYW5uZWwpOwogc3RhdGljIHZv aWQgQXN5bmNfVW5saXN0ZW5PbkV4aXQoaW50IGNvZGUsIERhdHVtIGFyZyk7CkBAIC00NTcs MTYgKzUyNiw5IEBAIHN0YXRpYyB2b2lkIEFkZEV2ZW50VG9QZW5kaW5nTm90aWZpZXMoTm90 aWZpY2F0aW9uICpuKTsKIHN0YXRpYyB1aW50MzIgbm90aWZpY2F0aW9uX2hhc2goY29uc3Qg dm9pZCAqa2V5LCBTaXplIGtleXNpemUpOwogc3RhdGljIGludAlub3RpZmljYXRpb25fbWF0 Y2goY29uc3Qgdm9pZCAqa2V5MSwgY29uc3Qgdm9pZCAqa2V5MiwgU2l6ZSBrZXlzaXplKTsK IHN0YXRpYyB2b2lkIENsZWFyUGVuZGluZ0FjdGlvbnNBbmROb3RpZmllcyh2b2lkKTsKLQot LyoKLSAqIENvbXB1dGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gcXVldWUgcGFnZSBu dW1iZXJzLgotICogUHJldmlvdXNseSB0aGlzIGZ1bmN0aW9uIGFjY291bnRlZCBmb3IgYSB3 cmFwYXJvdW5kLgotICovCi1zdGF0aWMgaW5saW5lIGludDY0Ci1hc3luY1F1ZXVlUGFnZURp ZmYoaW50NjQgcCwgaW50NjQgcSkKLXsKLQlyZXR1cm4gcCAtIHE7Ci19CitzdGF0aWMgaW5s aW5lIHZvaWQgQ2hhbm5lbEhhc2hQcmVwYXJlS2V5KENoYW5uZWxIYXNoS2V5ICprZXksIE9p ZCBkYm9pZCwgY29uc3QgY2hhciAqY2hhbm5lbCk7CitzdGF0aWMgZHNoYXNoX2hhc2ggY2hh bm5lbEhhc2hGdW5jKGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IHNpemUsIHZvaWQgKmFyZyk7 CitzdGF0aWMgdm9pZCBpbml0Q2hhbm5lbEhhc2godm9pZCk7CiAKIC8qCiAgKiBEZXRlcm1p bmVzIHdoZXRoZXIgcCBwcmVjZWRlcyBxLgpAQCAtNDc4LDYgKzU0MCwxMDUgQEAgYXN5bmNR dWV1ZVBhZ2VQcmVjZWRlcyhpbnQ2NCBwLCBpbnQ2NCBxKQogCXJldHVybiBwIDwgcTsKIH0K IAorLyoKKyAqIGNoYW5uZWxIYXNoRnVuYworICoJCUhhc2ggZnVuY3Rpb24gZm9yIGNoYW5u ZWwga2V5cy4KKyAqLworc3RhdGljIGRzaGFzaF9oYXNoCitjaGFubmVsSGFzaEZ1bmMoY29u c3Qgdm9pZCAqa2V5LCBzaXplX3Qgc2l6ZSwgdm9pZCAqYXJnKQoreworCWNvbnN0IENoYW5u ZWxIYXNoS2V5ICprID0gKGNvbnN0IENoYW5uZWxIYXNoS2V5ICopIGtleTsKKwlkc2hhc2hf aGFzaCBoOworCisJaCA9IERhdHVtR2V0VUludDMyKGhhc2hfdWludDMyKGstPmRib2lkKSk7 CisJaCBePSBEYXR1bUdldFVJbnQzMihoYXNoX2FueSgoY29uc3QgdW5zaWduZWQgY2hhciAq KSBrLT5jaGFubmVsLAorCQkJCQkJCQkgc3RybmxlbihrLT5jaGFubmVsLCBOQU1FREFUQUxF TikpKTsKKworCXJldHVybiBoOworfQorCisvKiBwYXJhbWV0ZXJzIGZvciB0aGUgY2hhbm5l bCBoYXNoIHRhYmxlICovCitzdGF0aWMgY29uc3QgZHNoYXNoX3BhcmFtZXRlcnMgY2hhbm5l bERTSFBhcmFtcyA9IHsKKwlzaXplb2YoQ2hhbm5lbEhhc2hLZXkpLAorCXNpemVvZihDaGFu bmVsRW50cnkpLAorCWRzaGFzaF9tZW1jbXAsCisJY2hhbm5lbEhhc2hGdW5jLAorCWRzaGFz aF9tZW1jcHksCisJTFdUUkFOQ0hFX05PVElGWV9DSEFOTkVMX0hBU0gKK307CisKKy8qCisg KiBpbml0Q2hhbm5lbEhhc2gKKyAqCQlMYXp5IGluaXRpYWxpemF0aW9uIG9mIHRoZSBjaGFu bmVsIGhhc2ggdGFibGUuCisgKi8KK3N0YXRpYyB2b2lkCitpbml0Q2hhbm5lbEhhc2godm9p ZCkKK3sKKwlNZW1vcnlDb250ZXh0IG9sZGNvbnRleHQ7CisKKwkvKiBRdWljayBleGl0IGlm IHdlIGFscmVhZHkgZGlkIHRoaXMgKi8KKwlpZiAoYXN5bmNRdWV1ZUNvbnRyb2wtPmNoYW5u ZWxIYXNoRFNIICE9IERTSEFTSF9IQU5ETEVfSU5WQUxJRCAmJgorCQljaGFubmVsSGFzaCAh PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBPdGhlcndpc2UsIHVzZSBhIGxvY2sgdG8gZW5z dXJlIG9ubHkgb25lIHByb2Nlc3MgY3JlYXRlcyB0aGUgdGFibGUgKi8KKwlMV0xvY2tBY3F1 aXJlKE5vdGlmeVF1ZXVlTG9jaywgTFdfRVhDTFVTSVZFKTsKKworCS8qIEJlIHN1cmUgYW55 IGxvY2FsIG1lbW9yeSBhbGxvY2F0ZWQgYnkgRFNBIHJvdXRpbmVzIGlzIHBlcnNpc3RlbnQg Ki8KKwlvbGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKFRvcE1lbW9yeUNvbnRl eHQpOworCisJaWYgKGFzeW5jUXVldWVDb250cm9sLT5jaGFubmVsSGFzaERTSCA9PSBEU0hB U0hfSEFORExFX0lOVkFMSUQpCisJeworCQkvKiBJbml0aWFsaXplIGR5bmFtaWMgc2hhcmVk IGhhc2ggdGFibGUgZm9yIGNoYW5uZWwgaGFzaCAqLworCQljaGFubmVsRFNBID0gZHNhX2Ny ZWF0ZShMV1RSQU5DSEVfTk9USUZZX0NIQU5ORUxfSEFTSCk7CisJCWRzYV9waW4oY2hhbm5l bERTQSk7CisJCWRzYV9waW5fbWFwcGluZyhjaGFubmVsRFNBKTsKKwkJY2hhbm5lbEhhc2gg PSBkc2hhc2hfY3JlYXRlKGNoYW5uZWxEU0EsICZjaGFubmVsRFNIUGFyYW1zLCBOVUxMKTsK KworCQkvKiBTdG9yZSBoYW5kbGVzIGluIHNoYXJlZCBtZW1vcnkgZm9yIG90aGVyIGJhY2tl bmRzIHRvIHVzZSAqLworCQlhc3luY1F1ZXVlQ29udHJvbC0+Y2hhbm5lbEhhc2hEU0EgPSBk c2FfZ2V0X2hhbmRsZShjaGFubmVsRFNBKTsKKwkJYXN5bmNRdWV1ZUNvbnRyb2wtPmNoYW5u ZWxIYXNoRFNIID0KKwkJCWRzaGFzaF9nZXRfaGFzaF90YWJsZV9oYW5kbGUoY2hhbm5lbEhh c2gpOworCX0KKwllbHNlIGlmICghY2hhbm5lbEhhc2gpCisJeworCQkvKiBBdHRhY2ggdG8g ZXhpc3RpbmcgZHluYW1pYyBzaGFyZWQgaGFzaCB0YWJsZSAqLworCQljaGFubmVsRFNBID0g ZHNhX2F0dGFjaChhc3luY1F1ZXVlQ29udHJvbC0+Y2hhbm5lbEhhc2hEU0EpOworCQlkc2Ff cGluX21hcHBpbmcoY2hhbm5lbERTQSk7CisJCWNoYW5uZWxIYXNoID0gZHNoYXNoX2F0dGFj aChjaGFubmVsRFNBLCAmY2hhbm5lbERTSFBhcmFtcywKKwkJCQkJCQkJCWFzeW5jUXVldWVD b250cm9sLT5jaGFubmVsSGFzaERTSCwKKwkJCQkJCQkJCU5VTEwpOworCX0KKworCU1lbW9y eUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKKwlMV0xvY2tSZWxlYXNlKE5vdGlmeVF1 ZXVlTG9jayk7Cit9CisKKy8qCisgKiBpbml0TGlzdGVuQ2hhbm5lbHNIYXNoCisgKgkJTGF6 eSBpbml0aWFsaXphdGlvbiBvZiB0aGUgbG9jYWwgbGlzdGVuIGNoYW5uZWxzIGhhc2ggdGFi bGUuCisgKi8KK3N0YXRpYyB2b2lkCitpbml0TGlzdGVuQ2hhbm5lbHNIYXNoKHZvaWQpCit7 CisJSEFTSENUTAkJaGFzaF9jdGw7CisKKwkvKiBRdWljayBleGl0IGlmIHdlIGFscmVhZHkg ZGlkIHRoaXMgKi8KKwlpZiAobGlzdGVuQ2hhbm5lbHNIYXNoICE9IE5VTEwpCisJCXJldHVy bjsKKworCS8qIEluaXRpYWxpemUgbG9jYWwgaGFzaCB0YWJsZSBmb3IgdGhpcyBiYWNrZW5k J3MgbGlzdGVuZWQgY2hhbm5lbHMgKi8KKwltZW1zZXQoJmhhc2hfY3RsLCAwLCBzaXplb2Yo aGFzaF9jdGwpKTsKKwloYXNoX2N0bC5rZXlzaXplID0gTkFNRURBVEFMRU47CisJaGFzaF9j dGwuZW50cnlzaXplID0gc2l6ZW9mKHN0cnVjdCBDaGFubmVsSGFzaCk7CisKKwlsaXN0ZW5D aGFubmVsc0hhc2ggPQorCQloYXNoX2NyZWF0ZSgiTGlzdGVuIENoYW5uZWxzIiwKKwkJCQkJ NjQsCisJCQkJCSZoYXNoX2N0bCwKKwkJCQkJSEFTSF9FTEVNIHwgSEFTSF9TVFJJTkdTKTsK K30KKwogLyoKICAqIFJlcG9ydCBzcGFjZSBuZWVkZWQgZm9yIG91ciBzaGFyZWQgbWVtb3J5 IGFyZWEKICAqLwpAQCAtNTIxLDEyICs2ODIsMTcgQEAgQXN5bmNTaG1lbUluaXQodm9pZCkK IAkJUVVFVUVfU1RPUF9QQUdFID0gMDsKIAkJUVVFVUVfRklSU1RfTElTVEVORVIgPSBJTlZB TElEX1BST0NfTlVNQkVSOwogCQlhc3luY1F1ZXVlQ29udHJvbC0+bGFzdFF1ZXVlRmlsbFdh cm4gPSAwOworCQlhc3luY1F1ZXVlQ29udHJvbC0+Y2hhbm5lbEhhc2hEU0EgPSBEU0FfSEFO RExFX0lOVkFMSUQ7CisJCWFzeW5jUXVldWVDb250cm9sLT5jaGFubmVsSGFzaERTSCA9IERT SEFTSF9IQU5ETEVfSU5WQUxJRDsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBNYXhCYWNrZW5k czsgaSsrKQogCQl7CiAJCQlRVUVVRV9CQUNLRU5EX1BJRChpKSA9IEludmFsaWRQaWQ7CiAJ CQlRVUVVRV9CQUNLRU5EX0RCT0lEKGkpID0gSW52YWxpZE9pZDsKIAkJCVFVRVVFX05FWFRf TElTVEVORVIoaSkgPSBJTlZBTElEX1BST0NfTlVNQkVSOwogCQkJU0VUX1FVRVVFX1BPUyhR VUVVRV9CQUNLRU5EX1BPUyhpKSwgMCwgMCk7CisJCQlTRVRfUVVFVUVfUE9TKFFVRVVFX0JB Q0tFTkRfQURWQU5DSU5HX1BPUyhpKSwgMCwgMCk7CisJCQlRVUVVRV9CQUNLRU5EX1dBS0VV UF9QRU5ESU5HKGkpID0gZmFsc2U7CisJCQlRVUVVRV9CQUNLRU5EX0lTX0FEVkFOQ0lORyhp KSA9IGZhbHNlOwogCQl9CiAJfQogCkBAIC02NTcsNiArODIzLDcgQEAgQXN5bmNfTm90aWZ5 KGNvbnN0IGNoYXIgKmNoYW5uZWwsIGNvbnN0IGNoYXIgKnBheWxvYWQpCiAJCW5vdGlmaWVz LT5ldmVudHMgPSBsaXN0X21ha2UxKG4pOwogCQkvKiBXZSBjZXJ0YWlubHkgZG9uJ3QgbmVl ZCBhIGhhc2h0YWJsZSB5ZXQgKi8KIAkJbm90aWZpZXMtPmhhc2h0YWIgPSBOVUxMOworCQlu b3RpZmllcy0+Y2hhbm5lbEhhc2h0YWIgPSBOVUxMOwogCQlub3RpZmllcy0+dXBwZXIgPSBw ZW5kaW5nTm90aWZpZXM7CiAJCXBlbmRpbmdOb3RpZmllcyA9IG5vdGlmaWVzOwogCX0KQEAg LTY4Myw3ICs4NTAsNyBAQCBBc3luY19Ob3RpZnkoY29uc3QgY2hhciAqY2hhbm5lbCwgY29u c3QgY2hhciAqcGF5bG9hZCkKICAqCQlDb21tb24gY29kZSBmb3IgbGlzdGVuLCB1bmxpc3Rl biwgdW5saXN0ZW4gYWxsIGNvbW1hbmRzLgogICoKICAqCQlBZGRzIHRoZSByZXF1ZXN0IHRv IHRoZSBsaXN0IG9mIHBlbmRpbmcgYWN0aW9ucy4KLSAqCQlBY3R1YWwgdXBkYXRlIG9mIHRo ZSBsaXN0ZW5DaGFubmVscyBsaXN0IGhhcHBlbnMgZHVyaW5nIHRyYW5zYWN0aW9uCisgKgkJ QWN0dWFsIHVwZGF0ZSBvZiB0aGUgbGlzdGVuQ2hhbm5lbHNIYXNoIGhhcHBlbnMgZHVyaW5n IHRyYW5zYWN0aW9uCiAgKgkJY29tbWl0LgogICovCiBzdGF0aWMgdm9pZApAQCAtNzgzLDMw ICs5NTAsNDkgQEAgQXN5bmNfVW5saXN0ZW5BbGwodm9pZCkKICAqIFNRTCBmdW5jdGlvbjog cmV0dXJuIGEgc2V0IG9mIHRoZSBjaGFubmVsIG5hbWVzIHRoaXMgYmFja2VuZCBpcyBhY3Rp dmVseQogICogbGlzdGVuaW5nIHRvLgogICoKLSAqIE5vdGU6IHRoaXMgY29kaW5nIHJlbGll cyBvbiB0aGUgZmFjdCB0aGF0IHRoZSBsaXN0ZW5DaGFubmVscyBsaXN0IGNhbm5vdAorICog Tm90ZTogdGhpcyBjb2RpbmcgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgdGhlIGxpc3RlbkNo YW5uZWxzSGFzaCBjYW5ub3QKICAqIGNoYW5nZSB3aXRoaW4gYSB0cmFuc2FjdGlvbi4KICAq LwogRGF0dW0KIHBnX2xpc3RlbmluZ19jaGFubmVscyhQR19GVU5DVElPTl9BUkdTKQogewog CUZ1bmNDYWxsQ29udGV4dCAqZnVuY2N0eDsKKwlIQVNIX1NFUV9TVEFUVVMgKnN0YXR1czsK IAogCS8qIHN0dWZmIGRvbmUgb25seSBvbiB0aGUgZmlyc3QgY2FsbCBvZiB0aGUgZnVuY3Rp b24gKi8KIAlpZiAoU1JGX0lTX0ZJUlNUQ0FMTCgpKQogCXsKKwkJTWVtb3J5Q29udGV4dCBv bGRjb250ZXh0OworCiAJCS8qIGNyZWF0ZSBhIGZ1bmN0aW9uIGNvbnRleHQgZm9yIGNyb3Nz LWNhbGwgcGVyc2lzdGVuY2UgKi8KIAkJZnVuY2N0eCA9IFNSRl9GSVJTVENBTExfSU5JVCgp OworCisJCS8qIEluaXRpYWxpemUgaGFzaCB0YWJsZSBpdGVyYXRpb24gaWYgd2UgaGF2ZSBh bnkgY2hhbm5lbHMgKi8KKwkJaWYgKGxpc3RlbkNoYW5uZWxzSGFzaCAhPSBOVUxMKQorCQl7 CisJCQlvbGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKGZ1bmNjdHgtPm11bHRp X2NhbGxfbWVtb3J5X2N0eCk7CisJCQlzdGF0dXMgPSAoSEFTSF9TRVFfU1RBVFVTICopIHBh bGxvYyhzaXplb2YoSEFTSF9TRVFfU1RBVFVTKSk7CisJCQloYXNoX3NlcV9pbml0KHN0YXR1 cywgbGlzdGVuQ2hhbm5lbHNIYXNoKTsKKwkJCWZ1bmNjdHgtPnVzZXJfZmN0eCA9IHN0YXR1 czsKKwkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKKwkJfQorCQllbHNl CisJCXsKKwkJCWZ1bmNjdHgtPnVzZXJfZmN0eCA9IE5VTEw7CisJCX0KIAl9CiAKIAkvKiBz dHVmZiBkb25lIG9uIGV2ZXJ5IGNhbGwgb2YgdGhlIGZ1bmN0aW9uICovCiAJZnVuY2N0eCA9 IFNSRl9QRVJDQUxMX1NFVFVQKCk7CisJc3RhdHVzID0gKEhBU0hfU0VRX1NUQVRVUyAqKSBm dW5jY3R4LT51c2VyX2ZjdHg7CiAKLQlpZiAoZnVuY2N0eC0+Y2FsbF9jbnRyIDwgbGlzdF9s ZW5ndGgobGlzdGVuQ2hhbm5lbHMpKQorCWlmIChzdGF0dXMgIT0gTlVMTCkKIAl7Ci0JCWNo YXIJICAgKmNoYW5uZWwgPSAoY2hhciAqKSBsaXN0X250aChsaXN0ZW5DaGFubmVscywKLQkJ CQkJCQkJCQkJCWZ1bmNjdHgtPmNhbGxfY250cik7CisJCXN0cnVjdCBDaGFubmVsSGFzaCAq ZW50cnk7CiAKLQkJU1JGX1JFVFVSTl9ORVhUKGZ1bmNjdHgsIENTdHJpbmdHZXRUZXh0RGF0 dW0oY2hhbm5lbCkpOworCQllbnRyeSA9IChzdHJ1Y3QgQ2hhbm5lbEhhc2ggKikgaGFzaF9z ZXFfc2VhcmNoKHN0YXR1cyk7CisJCWlmIChlbnRyeSAhPSBOVUxMKQorCQkJU1JGX1JFVFVS Tl9ORVhUKGZ1bmNjdHgsIENTdHJpbmdHZXRUZXh0RGF0dW0oZW50cnktPmNoYW5uZWwpKTsK IAl9CiAKIAlTUkZfUkVUVVJOX0RPTkUoZnVuY2N0eCk7CkBAIC04OTQsNiArMTA4MCwzNiBA QCBQcmVDb21taXRfTm90aWZ5KHZvaWQpCiAJaWYgKHBlbmRpbmdOb3RpZmllcykKIAl7CiAJ CUxpc3RDZWxsICAgKm5leHROb3RpZnk7CisJCWJvb2wJCWZpcnN0SXRlcmF0aW9uID0gdHJ1 ZTsKKworCQkvKgorCQkgKiBCdWlsZCBsaXN0IG9mIHVuaXF1ZSBjaGFubmVscyBmb3IgU2ln bmFsQmFja2VuZHMoKS4KKwkJICoKKwkJICogSWYgd2UgaGF2ZSBhIGNoYW5uZWxIYXNodGFi LCB1c2UgaXQgdG8gZWZmaWNpZW50bHkgZ2V0IHRoZSB1bmlxdWUKKwkJICogY2hhbm5lbHMu ICBPdGhlcndpc2UsIGZhbGwgYmFjayB0byB0aGUgbGluZWFyIGFwcHJvYWNoLgorCQkgKi8K KwkJcGVuZGluZ05vdGlmeUNoYW5uZWxzID0gTklMOworCQlpZiAocGVuZGluZ05vdGlmaWVz LT5jaGFubmVsSGFzaHRhYiAhPSBOVUxMKQorCQl7CisJCQlIQVNIX1NFUV9TVEFUVVMgc3Rh dHVzOworCQkJc3RydWN0IENoYW5uZWxIYXNoICpjaGFubmVsRW50cnk7CisKKwkJCWhhc2hf c2VxX2luaXQoJnN0YXR1cywgcGVuZGluZ05vdGlmaWVzLT5jaGFubmVsSGFzaHRhYik7CisJ CQl3aGlsZSAoKGNoYW5uZWxFbnRyeSA9IChzdHJ1Y3QgQ2hhbm5lbEhhc2ggKikgaGFzaF9z ZXFfc2VhcmNoKCZzdGF0dXMpKSAhPSBOVUxMKQorCQkJCXBlbmRpbmdOb3RpZnlDaGFubmVs cyA9IGxhcHBlbmQocGVuZGluZ05vdGlmeUNoYW5uZWxzLCBjaGFubmVsRW50cnktPmNoYW5u ZWwpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogTGluZWFyIGFwcHJvYWNoIGZvciBzbWFs bCBudW1iZXIgb2Ygbm90aWZpY2F0aW9ucyAqLworCQkJZm9yZWFjaF9wdHIoTm90aWZpY2F0 aW9uLCBuLCBwZW5kaW5nTm90aWZpZXMtPmV2ZW50cykKKwkJCXsKKwkJCQljaGFyCSAgICpj aGFubmVsID0gbi0+ZGF0YTsKKworCQkJCS8qIEFkZCBpZiBub3QgYWxyZWFkeSBpbiBsaXN0 ICovCisJCQkJaWYgKCFsaXN0X21lbWJlcl9wdHIocGVuZGluZ05vdGlmeUNoYW5uZWxzLCBj aGFubmVsKSkKKwkJCQkJcGVuZGluZ05vdGlmeUNoYW5uZWxzID0gbGFwcGVuZChwZW5kaW5n Tm90aWZ5Q2hhbm5lbHMsIGNoYW5uZWwpOworCQkJfQorCQl9CiAKIAkJLyoKIAkJICogTWFr ZSBzdXJlIHRoYXQgd2UgaGF2ZSBhbiBYSUQgYXNzaWduZWQgdG8gdGhlIGN1cnJlbnQgdHJh bnNhY3Rpb24uCkBAIC05MjIsNiArMTEzOCwyMiBAQCBQcmVDb21taXRfTm90aWZ5KHZvaWQp CiAJCUxvY2tTaGFyZWRPYmplY3QoRGF0YWJhc2VSZWxhdGlvbklkLCBJbnZhbGlkT2lkLCAw LAogCQkJCQkJIEFjY2Vzc0V4Y2x1c2l2ZUxvY2spOwogCisJCS8qCisJCSAqIEZvciB0aGUg ZGlyZWN0IGFkdmFuY2VtZW50IG9wdGltaXphdGlvbiBpbiBTaWduYWxCYWNrZW5kcygpLCB3 ZQorCQkgKiBuZWVkIHRvIGVuc3VyZSB0aGF0IG5vIG90aGVyIGJhY2tlbmQgY2FuIGluc2Vy dCBxdWV1ZSBlbnRyaWVzCisJCSAqIGJldHdlZW4gcXVldWVIZWFkQmVmb3JlV3JpdGUgYW5k IHF1ZXVlSGVhZEFmdGVyV3JpdGUuICBUaGUKKwkJICogaGVhdnl3ZWlnaHQgbG9jayBhYm92 ZSBwcm92aWRlcyB0aGlzIGd1YXJhbnRlZSwgc2luY2UgaXQgc2VyaWFsaXplcworCQkgKiBh bGwgd3JpdGVycy4KKwkJICoKKwkJICogTm90ZTogaWYgdGhlIGhlYXZ5d2VpZ2h0IGxvY2sg d2VyZSBldmVyIHJlbW92ZWQgZm9yIHNjYWxhYmlsaXR5CisJCSAqIHJlYXNvbnMsIHdlIGNv dWxkIGFjaGlldmUgdGhlIHNhbWUgZ3VhcmFudGVlIGJ5IGhvbGRpbmcKKwkJICogTm90aWZ5 UXVldWVMb2NrIGluIEVYQ0xVU0lWRSBtb2RlIGFjcm9zcyBhbGwgb3VyIGluc2VydGlvbnMs IHJhdGhlcgorCQkgKiB0aGFuIHJlbGVhc2luZyBhbmQgcmVhY3F1aXJpbmcgaXQgZm9yIGVh Y2ggcGFnZSBhcyB3ZSBkbyBiZWxvdy4KKwkJICovCisKKwkJLyogSW5pdGlhbGl6ZSBxdWV1 ZUhlYWRCZWZvcmVXcml0ZSB0byBhIHNhZmUgZGVmYXVsdCAqLworCQlTRVRfUVVFVUVfUE9T KHF1ZXVlSGVhZEJlZm9yZVdyaXRlLCAwLCAwKTsKKwogCQkvKiBOb3cgcHVzaCB0aGUgbm90 aWZpY2F0aW9ucyBpbnRvIHRoZSBxdWV1ZSAqLwogCQluZXh0Tm90aWZ5ID0gbGlzdF9oZWFk KHBlbmRpbmdOb3RpZmllcy0+ZXZlbnRzKTsKIAkJd2hpbGUgKG5leHROb3RpZnkgIT0gTlVM TCkKQEAgLTkzOSwxMiArMTE3MSwyMCBAQCBQcmVDb21taXRfTm90aWZ5KHZvaWQpCiAJCQkg KiBwb2ludCBpbiB0aW1lIHdlIGNhbiBzdGlsbCByb2xsIHRoZSB0cmFuc2FjdGlvbiBiYWNr LgogCQkJICovCiAJCQlMV0xvY2tBY3F1aXJlKE5vdGlmeVF1ZXVlTG9jaywgTFdfRVhDTFVT SVZFKTsKKwkJCWlmIChmaXJzdEl0ZXJhdGlvbikKKwkJCXsKKwkJCQlxdWV1ZUhlYWRCZWZv cmVXcml0ZSA9IFFVRVVFX0hFQUQ7CisJCQkJZmlyc3RJdGVyYXRpb24gPSBmYWxzZTsKKwkJ CX0KKwogCQkJYXN5bmNRdWV1ZUZpbGxXYXJuaW5nKCk7CiAJCQlpZiAoYXN5bmNRdWV1ZUlz RnVsbCgpKQogCQkJCWVyZXBvcnQoRVJST1IsCiAJCQkJCQkoZXJyY29kZShFUlJDT0RFX1BS T0dSQU1fTElNSVRfRVhDRUVERUQpLAogCQkJCQkJIGVycm1zZygidG9vIG1hbnkgbm90aWZp Y2F0aW9ucyBpbiB0aGUgTk9USUZZIHF1ZXVlIikpKTsKIAkJCW5leHROb3RpZnkgPSBhc3lu Y1F1ZXVlQWRkRW50cmllcyhuZXh0Tm90aWZ5KTsKKwkJCXF1ZXVlSGVhZEFmdGVyV3JpdGUg PSBRVUVVRV9IRUFEOworCiAJCQlMV0xvY2tSZWxlYXNlKE5vdGlmeVF1ZXVlTG9jayk7CiAJ CX0KIApAQCAtOTU3LDcgKzExOTcsNyBAQCBQcmVDb21taXRfTm90aWZ5KHZvaWQpCiAgKgog ICoJCVRoaXMgaXMgY2FsbGVkIGF0IHRyYW5zYWN0aW9uIGNvbW1pdCwgYWZ0ZXIgY29tbWl0 dGluZyB0byBjbG9nLgogICoKLSAqCQlVcGRhdGUgbGlzdGVuQ2hhbm5lbHMgYW5kIGNsZWFy IHRyYW5zYWN0aW9uLWxvY2FsIHN0YXRlLgorICoJCVVwZGF0ZSBsaXN0ZW5DaGFubmVsc0hh c2ggYW5kIGNsZWFyIHRyYW5zYWN0aW9uLWxvY2FsIHN0YXRlLgogICoKICAqCQlJZiB3ZSBp c3N1ZWQgYW55IG5vdGlmaWNhdGlvbnMgaW4gdGhlIHRyYW5zYWN0aW9uLCBzZW5kIHNpZ25h bHMgdG8KICAqCQlsaXN0ZW5pbmcgYmFja2VuZHMgKHBvc3NpYmx5IGluY2x1ZGluZyBvdXJz ZWx2ZXMpIHRvIHByb2Nlc3MgdGhlbS4KQEAgLTEwMDIsNyArMTI0Miw4IEBAIEF0Q29tbWl0 X05vdGlmeSh2b2lkKQogCX0KIAogCS8qIElmIG5vIGxvbmdlciBsaXN0ZW5pbmcgdG8gYW55 dGhpbmcsIGdldCBvdXQgb2YgbGlzdGVuZXIgYXJyYXkgKi8KLQlpZiAoYW1SZWdpc3RlcmVk TGlzdGVuZXIgJiYgbGlzdGVuQ2hhbm5lbHMgPT0gTklMKQorCWlmIChhbVJlZ2lzdGVyZWRM aXN0ZW5lciAmJgorCQkobGlzdGVuQ2hhbm5lbHNIYXNoID09IE5VTEwgfHwgaGFzaF9nZXRf bnVtX2VudHJpZXMobGlzdGVuQ2hhbm5lbHNIYXNoKSA9PSAwKSkKIAkJYXN5bmNRdWV1ZVVu cmVnaXN0ZXIoKTsKIAogCS8qCkBAIC0xMTM1LDUwICsxMzc2LDE0NSBAQCBFeGVjX0xpc3Rl blByZUNvbW1pdCh2b2lkKQogc3RhdGljIHZvaWQKIEV4ZWNfTGlzdGVuQ29tbWl0KGNvbnN0 IGNoYXIgKmNoYW5uZWwpCiB7Ci0JTWVtb3J5Q29udGV4dCBvbGRjb250ZXh0OworCUNoYW5u ZWxIYXNoS2V5IGtleTsKKwlDaGFubmVsRW50cnkgKmVudHJ5OworCWJvb2wJCWZvdW5kOwor CVByb2NOdW1iZXIgKmxpc3RlbmVyczsKIAogCS8qIERvIG5vdGhpbmcgaWYgd2UgYXJlIGFs cmVhZHkgbGlzdGVuaW5nIG9uIHRoaXMgY2hhbm5lbCAqLwogCWlmIChJc0xpc3RlbmluZ09u KGNoYW5uZWwpKQogCQlyZXR1cm47CiAKIAkvKgotCSAqIEFkZCB0aGUgbmV3IGNoYW5uZWwg bmFtZSB0byBsaXN0ZW5DaGFubmVscy4KKwkgKiBBZGQgdGhlIG5ldyBjaGFubmVsIG5hbWUg dG8gbGlzdGVuQ2hhbm5lbHNIYXNoLgogCSAqCiAJICogWFhYIEl0IGlzIHRoZW9yZXRpY2Fs bHkgcG9zc2libGUgdG8gZ2V0IGFuIG91dC1vZi1tZW1vcnkgZmFpbHVyZSBoZXJlLAogCSAq IHdoaWNoIHdvdWxkIGJlIGJhZCBiZWNhdXNlIHdlIGFscmVhZHkgY29tbWl0dGVkLiAgRm9y IHRoZSBtb21lbnQgaXQKIAkgKiBkb2Vzbid0IHNlZW0gd29ydGggdHJ5aW5nIHRvIGd1YXJk IGFnYWluc3QgdGhhdCwgYnV0IG1heWJlIGltcHJvdmUgdGhpcwogCSAqIGxhdGVyLgogCSAq LwotCW9sZGNvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oVG9wTWVtb3J5Q29udGV4 dCk7Ci0JbGlzdGVuQ2hhbm5lbHMgPSBsYXBwZW5kKGxpc3RlbkNoYW5uZWxzLCBwc3RyZHVw KGNoYW5uZWwpKTsKLQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CisJaW5p dExpc3RlbkNoYW5uZWxzSGFzaCgpOworCSh2b2lkKSBoYXNoX3NlYXJjaChsaXN0ZW5DaGFu bmVsc0hhc2gsIGNoYW5uZWwsIEhBU0hfRU5URVIsIE5VTEwpOworCisJLyogTm93IHVwZGF0 ZSB0aGUgc2hhcmVkIGNoYW5uZWxIYXNoIGZvciBTaWduYWxCYWNrZW5kcygpIHRvIHVzZSAq LworCWluaXRDaGFubmVsSGFzaCgpOworCisJQ2hhbm5lbEhhc2hQcmVwYXJlS2V5KCZrZXks IE15RGF0YWJhc2VJZCwgY2hhbm5lbCk7CisKKwkvKgorCSAqIEZvciBuZXcgZW50cmllcywg d2UgaW5pdGlhbGl6ZSBsaXN0ZW5lcnNBcnJheSB0byBJbnZhbGlkRHNhUG9pbnRlciBhcyBh CisJICogbWFya2VyLiBUaGlzIGhhbmRsZXMgYm90aCB0aGUgaW5pdGlhbCBjcmVhdGlvbiBh bmQgcG90ZW50aWFsIHJldHJ5CisJICogYWZ0ZXIgT09NLgorCSAqLworCWVudHJ5ID0gZHNo YXNoX2ZpbmRfb3JfaW5zZXJ0KGNoYW5uZWxIYXNoLCAma2V5LCAmZm91bmQpOworCisJaWYg KCFmb3VuZCkKKwkJZW50cnktPmxpc3RlbmVyc0FycmF5ID0gSW52YWxpZERzYVBvaW50ZXI7 CisKKwlpZiAoIURzYVBvaW50ZXJJc1ZhbGlkKGVudHJ5LT5saXN0ZW5lcnNBcnJheSkpCisJ eworCQkvKiBGaXJzdCBsaXN0ZW5lciBmb3IgdGhpcyBjaGFubmVsICovCisJCWVudHJ5LT5s aXN0ZW5lcnNBcnJheSA9IGRzYV9hbGxvY2F0ZShjaGFubmVsRFNBLAorCQkJCQkJCQkJCQkg c2l6ZW9mKFByb2NOdW1iZXIpICogSU5JVElBTF9MSVNURU5FUlNfQVJSQVlfU0laRSk7CisJ CWVudHJ5LT5udW1MaXN0ZW5lcnMgPSAwOworCQllbnRyeS0+YWxsb2NhdGVkTGlzdGVuZXJz ID0gSU5JVElBTF9MSVNURU5FUlNfQVJSQVlfU0laRTsKKwl9CisKKwlsaXN0ZW5lcnMgPSAo UHJvY051bWJlciAqKSBkc2FfZ2V0X2FkZHJlc3MoY2hhbm5lbERTQSwKKwkJCQkJCQkJCQkJ ICAgZW50cnktPmxpc3RlbmVyc0FycmF5KTsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgZW50 cnktPm51bUxpc3RlbmVyczsgaSsrKQorCXsKKwkJaWYgKGxpc3RlbmVyc1tpXSA9PSBNeVBy b2NOdW1iZXIpCisJCXsKKwkJCWRzaGFzaF9yZWxlYXNlX2xvY2soY2hhbm5lbEhhc2gsIGVu dHJ5KTsKKwkJCXJldHVybjsJCQkJLyogQWxyZWFkeSByZWdpc3RlcmVkICovCisJCX0KKwl9 CisKKwlpZiAoZW50cnktPm51bUxpc3RlbmVycyA+PSBlbnRyeS0+YWxsb2NhdGVkTGlzdGVu ZXJzKQorCXsKKwkJaW50CQkJbmV3X3NpemUgPSBlbnRyeS0+YWxsb2NhdGVkTGlzdGVuZXJz ICogMjsKKwkJZHNhX3BvaW50ZXIgbmV3X2FycmF5ID0gZHNhX2FsbG9jYXRlKGNoYW5uZWxE U0EsCisJCQkJCQkJCQkJCSBzaXplb2YoUHJvY051bWJlcikgKiBuZXdfc2l6ZSk7CisJCVBy b2NOdW1iZXIgKm5ld19saXN0ZW5lcnMgPSAoUHJvY051bWJlciAqKSBkc2FfZ2V0X2FkZHJl c3MoY2hhbm5lbERTQSwKKwkJCQkJCQkJCQkJCQkJCQkgICBuZXdfYXJyYXkpOworCisJCW1l bWNweShuZXdfbGlzdGVuZXJzLCBsaXN0ZW5lcnMsCisJCQkgICBzaXplb2YoUHJvY051bWJl cikgKiBlbnRyeS0+bnVtTGlzdGVuZXJzKTsKKworCQlkc2FfZnJlZShjaGFubmVsRFNBLCBl bnRyeS0+bGlzdGVuZXJzQXJyYXkpOworCQllbnRyeS0+bGlzdGVuZXJzQXJyYXkgPSBuZXdf YXJyYXk7CisJCWVudHJ5LT5hbGxvY2F0ZWRMaXN0ZW5lcnMgPSBuZXdfc2l6ZTsKKwkJbGlz dGVuZXJzID0gbmV3X2xpc3RlbmVyczsKKwl9CisKKwlsaXN0ZW5lcnNbZW50cnktPm51bUxp c3RlbmVyc10gPSBNeVByb2NOdW1iZXI7CisJZW50cnktPm51bUxpc3RlbmVycysrOworCisJ ZHNoYXNoX3JlbGVhc2VfbG9jayhjaGFubmVsSGFzaCwgZW50cnkpOwogfQogCiAvKgogICog RXhlY19Vbmxpc3RlbkNvbW1pdCAtLS0gc3Vicm91dGluZSBmb3IgQXRDb21taXRfTm90aWZ5 CiAgKgotICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCBuYW1lIGZyb20gbGlzdGVu Q2hhbm5lbHMuCisgKgkJVW5saXN0ZW4gdGhlIHNwZWNpZmllZCBjaGFubmVsIGZvciB0aGlz IGJhY2tlbmQuCiAgKi8KIHN0YXRpYyB2b2lkCiBFeGVjX1VubGlzdGVuQ29tbWl0KGNvbnN0 IGNoYXIgKmNoYW5uZWwpCiB7Ci0JTGlzdENlbGwgICAqcTsKKwlDaGFubmVsSGFzaEtleSBr ZXk7CisJQ2hhbm5lbEVudHJ5ICplbnRyeTsKKwlQcm9jTnVtYmVyICpsaXN0ZW5lcnM7CisJ aW50CQkJaTsKIAogCWlmIChUcmFjZV9ub3RpZnkpCiAJCWVsb2coREVCVUcxLCAiRXhlY19V bmxpc3RlbkNvbW1pdCglcywlZCkiLCBjaGFubmVsLCBNeVByb2NQaWQpOwogCi0JZm9yZWFj aChxLCBsaXN0ZW5DaGFubmVscykKKwkvKiBSZW1vdmUgZnJvbSBvdXIgbG9jYWwgY2FjaGUg Ki8KKwlpZiAobGlzdGVuQ2hhbm5lbHNIYXNoICE9IE5VTEwpCisJCSh2b2lkKSBoYXNoX3Nl YXJjaChsaXN0ZW5DaGFubmVsc0hhc2gsIGNoYW5uZWwsIEhBU0hfUkVNT1ZFLCBOVUxMKTsK KworCS8qIE5vdyByZW1vdmUgZnJvbSB0aGUgc2hhcmVkIGNoYW5uZWxIYXNoICovCisJaWYg KGNoYW5uZWxIYXNoID09IE5VTEwpCisJCXJldHVybjsKKworCUNoYW5uZWxIYXNoUHJlcGFy ZUtleSgma2V5LCBNeURhdGFiYXNlSWQsIGNoYW5uZWwpOworCisJLyogTG9vayB1cCB0aGUg Y2hhbm5lbCB3aXRoIGV4Y2x1c2l2ZSBsb2NrIHNvIHdlIGNhbiBtb2RpZnkgaXQgKi8KKwll bnRyeSA9IGRzaGFzaF9maW5kKGNoYW5uZWxIYXNoLCAma2V5LCB0cnVlKTsKKwlpZiAoZW50 cnkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbGlzdGVuZXJzID0gKFByb2NOdW1iZXIgKikg ZHNhX2dldF9hZGRyZXNzKGNoYW5uZWxEU0EsCisJCQkJCQkJCQkJCSAgIGVudHJ5LT5saXN0 ZW5lcnNBcnJheSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cnktPm51bUxpc3RlbmVyczsg aSsrKQogCXsKLQkJY2hhcgkgICAqbGNoYW4gPSAoY2hhciAqKSBsZmlyc3QocSk7Ci0KLQkJ aWYgKHN0cmNtcChsY2hhbiwgY2hhbm5lbCkgPT0gMCkKKwkJaWYgKGxpc3RlbmVyc1tpXSA9 PSBNeVByb2NOdW1iZXIpCiAJCXsKLQkJCWxpc3RlbkNoYW5uZWxzID0gZm9yZWFjaF9kZWxl dGVfY3VycmVudChsaXN0ZW5DaGFubmVscywgcSk7Ci0JCQlwZnJlZShsY2hhbik7Ci0JCQli cmVhazsKKwkJCWVudHJ5LT5udW1MaXN0ZW5lcnMtLTsKKwkJCWlmIChpIDwgZW50cnktPm51 bUxpc3RlbmVycykKKwkJCQltZW1tb3ZlKCZsaXN0ZW5lcnNbaV0sICZsaXN0ZW5lcnNbaSAr IDFdLAorCQkJCQkJc2l6ZW9mKFByb2NOdW1iZXIpICogKGVudHJ5LT5udW1MaXN0ZW5lcnMg LSBpKSk7CisKKwkJCWlmIChlbnRyeS0+bnVtTGlzdGVuZXJzID09IDApCisJCQl7CisJCQkJ LyogTGFzdCBsaXN0ZW5lciBmb3IgdGhpcyBjaGFubmVsICovCisJCQkJZHNhX2ZyZWUoY2hh bm5lbERTQSwgZW50cnktPmxpc3RlbmVyc0FycmF5KTsKKwkJCQlkc2hhc2hfZGVsZXRlX2Vu dHJ5KGNoYW5uZWxIYXNoLCBlbnRyeSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZHNo YXNoX3JlbGVhc2VfbG9jayhjaGFubmVsSGFzaCwgZW50cnkpOworCQkJfQorCisJCQlyZXR1 cm47CiAJCX0KIAl9CiAKKwlkc2hhc2hfcmVsZWFzZV9sb2NrKGNoYW5uZWxIYXNoLCBlbnRy eSk7CisKIAkvKgogCSAqIFdlIGRvIG5vdCBjb21wbGFpbiBhYm91dCB1bmxpc3RlbmluZyBz b21ldGhpbmcgbm90IGJlaW5nIGxpc3RlbmVkOwogCSAqIHNob3VsZCB3ZT8KQEAgLTExOTMs MzQgKzE1MjksNjggQEAgRXhlY19Vbmxpc3RlbkNvbW1pdChjb25zdCBjaGFyICpjaGFubmVs KQogc3RhdGljIHZvaWQKIEV4ZWNfVW5saXN0ZW5BbGxDb21taXQodm9pZCkKIHsKKwlkc2hh c2hfc2VxX3N0YXR1cyBzdGF0dXM7CisJQ2hhbm5lbEVudHJ5ICplbnRyeTsKKwogCWlmIChU cmFjZV9ub3RpZnkpCiAJCWVsb2coREVCVUcxLCAiRXhlY19Vbmxpc3RlbkFsbENvbW1pdCgl ZCkiLCBNeVByb2NQaWQpOwogCi0JbGlzdF9mcmVlX2RlZXAobGlzdGVuQ2hhbm5lbHMpOwot CWxpc3RlbkNoYW5uZWxzID0gTklMOworCS8qIENsZWFyIG91ciBsb2NhbCBjYWNoZSAqLwor CWlmIChsaXN0ZW5DaGFubmVsc0hhc2ggIT0gTlVMTCkKKwl7CisJCWhhc2hfZGVzdHJveShs aXN0ZW5DaGFubmVsc0hhc2gpOworCQlsaXN0ZW5DaGFubmVsc0hhc2ggPSBOVUxMOworCX0K KworCS8qIE5vdyByZW1vdmUgZnJvbSB0aGUgc2hhcmVkIGNoYW5uZWxIYXNoICovCisJaWYg KGNoYW5uZWxIYXNoID09IE5VTEwpCisJCXJldHVybjsKKworCWRzaGFzaF9zZXFfaW5pdCgm c3RhdHVzLCBjaGFubmVsSGFzaCwgdHJ1ZSk7CisJd2hpbGUgKChlbnRyeSA9IGRzaGFzaF9z ZXFfbmV4dCgmc3RhdHVzKSkgIT0gTlVMTCkKKwl7CisJCWlmIChlbnRyeS0+a2V5LmRib2lk ID09IE15RGF0YWJhc2VJZCkKKwkJeworCQkJUHJvY051bWJlciAqbGlzdGVuZXJzOworCQkJ aW50CQkJaTsKKworCQkJbGlzdGVuZXJzID0gKFByb2NOdW1iZXIgKikgZHNhX2dldF9hZGRy ZXNzKGNoYW5uZWxEU0EsCisJCQkJCQkJCQkJCQkJICAgZW50cnktPmxpc3RlbmVyc0FycmF5 KTsKKworCQkJZm9yIChpID0gMDsgaSA8IGVudHJ5LT5udW1MaXN0ZW5lcnM7IGkrKykKKwkJ CXsKKwkJCQlpZiAobGlzdGVuZXJzW2ldID09IE15UHJvY051bWJlcikKKwkJCQl7CisJCQkJ CWVudHJ5LT5udW1MaXN0ZW5lcnMtLTsKKwkJCQkJaWYgKGkgPCBlbnRyeS0+bnVtTGlzdGVu ZXJzKQorCQkJCQkJbWVtbW92ZSgmbGlzdGVuZXJzW2ldLCAmbGlzdGVuZXJzW2kgKyAxXSwK KwkJCQkJCQkJc2l6ZW9mKFByb2NOdW1iZXIpICogKGVudHJ5LT5udW1MaXN0ZW5lcnMgLSBp KSk7CisKKwkJCQkJaWYgKGVudHJ5LT5udW1MaXN0ZW5lcnMgPT0gMCkKKwkJCQkJeworCQkJ CQkJZHNhX2ZyZWUoY2hhbm5lbERTQSwgZW50cnktPmxpc3RlbmVyc0FycmF5KTsKKwkJCQkJ CWRzaGFzaF9kZWxldGVfY3VycmVudCgmc3RhdHVzKTsKKwkJCQkJfQorCQkJCQlicmVhazsK KwkJCQl9CisJCQl9CisJCX0KKwl9CisJZHNoYXNoX3NlcV90ZXJtKCZzdGF0dXMpOwogfQog CiAvKgogICogVGVzdCB3aGV0aGVyIHdlIGFyZSBhY3RpdmVseSBsaXN0ZW5pbmcgb24gdGhl IGdpdmVuIGNoYW5uZWwgbmFtZS4KICAqCiAgKiBOb3RlOiB0aGlzIGZ1bmN0aW9uIGlzIGV4 ZWN1dGVkIGZvciBldmVyeSBub3RpZmljYXRpb24gZm91bmQgaW4gdGhlIHF1ZXVlLgotICog UGVyaGFwcyBpdCBpcyB3b3J0aCBmdXJ0aGVyIG9wdGltaXphdGlvbiwgZWcgY29udmVydCB0 aGUgbGlzdCB0byBhIHNvcnRlZAotICogYXJyYXkgc28gd2UgY2FuIGJpbmFyeS1zZWFyY2gg aXQuICBJbiBwcmFjdGljZSB0aGUgbGlzdCBpcyBsaWtlbHkgdG8gYmUKLSAqIGZhaXJseSBz aG9ydCwgdGhvdWdoLgogICovCiBzdGF0aWMgYm9vbAogSXNMaXN0ZW5pbmdPbihjb25zdCBj aGFyICpjaGFubmVsKQogewotCUxpc3RDZWxsICAgKnA7CisJaWYgKGxpc3RlbkNoYW5uZWxz SGFzaCA9PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CiAKLQlmb3JlYWNoKHAsIGxpc3RlbkNo YW5uZWxzKQotCXsKLQkJY2hhcgkgICAqbGNoYW4gPSAoY2hhciAqKSBsZmlyc3QocCk7Ci0K LQkJaWYgKHN0cmNtcChsY2hhbiwgY2hhbm5lbCkgPT0gMCkKLQkJCXJldHVybiB0cnVlOwot CX0KLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIChoYXNoX3NlYXJjaChsaXN0ZW5DaGFubmVs c0hhc2gsIGNoYW5uZWwsIEhBU0hfRklORCwgTlVMTCkgIT0gTlVMTCk7CiB9CiAKIC8qCkBA IC0xMjMwLDcgKzE2MDAsNyBAQCBJc0xpc3RlbmluZ09uKGNvbnN0IGNoYXIgKmNoYW5uZWwp CiBzdGF0aWMgdm9pZAogYXN5bmNRdWV1ZVVucmVnaXN0ZXIodm9pZCkKIHsKLQlBc3NlcnQo bGlzdGVuQ2hhbm5lbHMgPT0gTklMKTsJLyogZWxzZSBjYWxsZXIgZXJyb3IgKi8KKwlBc3Nl cnQobGlzdGVuQ2hhbm5lbHNIYXNoID09IE5VTEwgfHwgaGFzaF9nZXRfbnVtX2VudHJpZXMo bGlzdGVuQ2hhbm5lbHNIYXNoKSA9PSAwKTsJLyogZWxzZSBjYWxsZXIgZXJyb3IgKi8KIAog CWlmICghYW1SZWdpc3RlcmVkTGlzdGVuZXIpCS8qIG5vdGhpbmcgdG8gZG8gKi8KIAkJcmV0 dXJuOwpAQCAtMTI0Miw2ICsxNjEyLDcgQEAgYXN5bmNRdWV1ZVVucmVnaXN0ZXIodm9pZCkK IAkvKiBNYXJrIG91ciBlbnRyeSBhcyBpbnZhbGlkICovCiAJUVVFVUVfQkFDS0VORF9QSUQo TXlQcm9jTnVtYmVyKSA9IEludmFsaWRQaWQ7CiAJUVVFVUVfQkFDS0VORF9EQk9JRChNeVBy b2NOdW1iZXIpID0gSW52YWxpZE9pZDsKKwlRVUVVRV9CQUNLRU5EX1dBS0VVUF9QRU5ESU5H KE15UHJvY051bWJlcikgPSBmYWxzZTsKIAkvKiBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGxp c3QgKi8KIAlpZiAoUVVFVUVfRklSU1RfTElTVEVORVIgPT0gTXlQcm9jTnVtYmVyKQogCQlR VUVVRV9GSVJTVF9MSVNURU5FUiA9IFFVRVVFX05FWFRfTElTVEVORVIoTXlQcm9jTnVtYmVy KTsKQEAgLTE1NjUsMTIgKzE5MzYsMTUgQEAgYXN5bmNRdWV1ZUZpbGxXYXJuaW5nKHZvaWQp CiAvKgogICogU2VuZCBzaWduYWxzIHRvIGxpc3RlbmluZyBiYWNrZW5kcy4KICAqCi0gKiBO b3JtYWxseSB3ZSBzaWduYWwgb25seSBiYWNrZW5kcyBpbiBvdXIgb3duIGRhdGFiYXNlLCBz aW5jZSBvbmx5IHRob3NlCi0gKiBiYWNrZW5kcyBjb3VsZCBiZSBpbnRlcmVzdGVkIGluIG5v dGlmaWVzIHdlIHNlbmQuICBIb3dldmVyLCBpZiB0aGVyZSdzCi0gKiBub3RpZnkgdHJhZmZp YyBpbiBvdXIgZGF0YWJhc2UgYnV0IG5vIHRyYWZmaWMgaW4gYW5vdGhlciBkYXRhYmFzZSB0 aGF0Ci0gKiBkb2VzIGhhdmUgbGlzdGVuZXIocyksIHRob3NlIGxpc3RlbmVycyB3aWxsIGZh bGwgZnVydGhlciBhbmQgZnVydGhlcgotICogYmVoaW5kLiAgV2FrZW4gdGhlbSBhbnl3YXkg aWYgdGhleSdyZSBmYXIgZW5vdWdoIGJlaGluZCwgc28gdGhhdCB0aGV5J2xsCi0gKiBhZHZh bmNlIHRoZWlyIHF1ZXVlIHBvc2l0aW9uIHBvaW50ZXJzLCBhbGxvd2luZyB0aGUgZ2xvYmFs IHRhaWwgdG8gYWR2YW5jZS4KKyAqIE5vcm1hbGx5IHdlIHNpZ25hbCBvbmx5IGJhY2tlbmRz IGluIG91ciBvd24gZGF0YWJhc2UsIHRoYXQgYXJlCisgKiBsaXN0ZW5pbmcgb24gdGhlIGNo YW5uZWxzIHdpdGggcGVuZGluZyBub3RpZmllcywgc2luY2Ugb25seSB0aG9zZQorICogYmFj a2VuZHMgYXJlIGludGVyZXN0ZWQgaW4gbm90aWZpZXMgd2Ugc2VuZC4KKyAqCisgKiBCYWNr ZW5kcyB0aGF0IGFyZSBrbm93biB0byBzdGlsbCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBxdWV1 ZSBoZWFkCisgKiBmcm9tIGJlZm9yZSBvdXIgY29tbWl0IGNhbiBiZSBzYWZlbHkgYWR2YW5j ZWQgZGlyZWN0bHkgdG8gdGhlIG5ldworICogaGVhZCwgc2luY2UgdGhlIHF1ZXVlIHJlZ2lv biB3ZSB3cm90ZSBpcyBrbm93biB0byBjb250YWluIG9ubHkgb3VyCisgKiBvd24gbm90aWZp Y2F0aW9ucy4gIFRoaXMgYXZvaWRzIHVubmVjZXNzYXJ5IHdha2V1cHMgd2hlbiB0aGVyZSBp cworICogbm90aGluZyBvZiBpbnRlcmVzdCB0byB0aGVtLgogICoKICAqIFNpbmNlIHdlIGtu b3cgdGhlIFByb2NOdW1iZXIgYW5kIHRoZSBQaWQgdGhlIHNpZ25hbGluZyBpcyBxdWl0ZSBj aGVhcC4KICAqCkBAIC0xNTgzLDYgKzE5NTcsMTMgQEAgU2lnbmFsQmFja2VuZHModm9pZCkK IAlpbnQzMgkgICAqcGlkczsKIAlQcm9jTnVtYmVyICpwcm9jbm9zOwogCWludAkJCWNvdW50 OworCUxpc3RDZWxsICAgKmxjOworCisJLyoKKwkgKiBBdHRhY2ggdG8gdGhlIGNoYW5uZWwg aGFzaCBpZiBuZWVkZWQuICBXZSBtaWdodCBub3QgaGF2ZSBvbmUgaWYgdGhpcworCSAqIGJh Y2tlbmQgaGFzbid0IGRvbmUgTElTVEVOLCBidXQgd2UgbmVlZCBpdCB0byBmaW5kIGxpc3Rl bmVycy4KKwkgKi8KKwlpbml0Q2hhbm5lbEhhc2goKTsKIAogCS8qCiAJICogSWRlbnRpZnkg YmFja2VuZHMgdGhhdCB3ZSBuZWVkIHRvIHNpZ25hbC4gIFdlIGRvbid0IHdhbnQgdG8gc2Vu ZApAQCAtMTU5NywzNiArMTk3OCwxMDMgQEAgU2lnbmFsQmFja2VuZHModm9pZCkKIAljb3Vu dCA9IDA7CiAKIAlMV0xvY2tBY3F1aXJlKE5vdGlmeVF1ZXVlTG9jaywgTFdfRVhDTFVTSVZF KTsKLQlmb3IgKFByb2NOdW1iZXIgaSA9IFFVRVVFX0ZJUlNUX0xJU1RFTkVSOyBpICE9IElO VkFMSURfUFJPQ19OVU1CRVI7IGkgPSBRVUVVRV9ORVhUX0xJU1RFTkVSKGkpKQorCWZvcmVh Y2gobGMsIHBlbmRpbmdOb3RpZnlDaGFubmVscykKIAl7Ci0JCWludDMyCQlwaWQgPSBRVUVV RV9CQUNLRU5EX1BJRChpKTsKLQkJUXVldWVQb3NpdGlvbiBwb3M7CisJCWNoYXIJICAgKmNo YW5uZWwgPSAoY2hhciAqKSBsZmlyc3QobGMpOworCQlDaGFubmVsRW50cnkgKmVudHJ5ID0g TlVMTDsKKwkJUHJvY051bWJlciAqbGlzdGVuZXJzOwogCi0JCUFzc2VydChwaWQgIT0gSW52 YWxpZFBpZCk7Ci0JCXBvcyA9IFFVRVVFX0JBQ0tFTkRfUE9TKGkpOwotCQlpZiAoUVVFVUVf QkFDS0VORF9EQk9JRChpKSA9PSBNeURhdGFiYXNlSWQpCisJCWlmIChjaGFubmVsSGFzaCAh PSBOVUxMKQogCQl7Ci0JCQkvKgotCQkJICogQWx3YXlzIHNpZ25hbCBsaXN0ZW5lcnMgaW4g b3VyIG93biBkYXRhYmFzZSwgdW5sZXNzIHRoZXkncmUKLQkJCSAqIGFscmVhZHkgY2F1Z2h0 IHVwICh1bmxpa2VseSwgYnV0IHBvc3NpYmxlKS4KLQkJCSAqLworCQkJQ2hhbm5lbEhhc2hL ZXkga2V5OworCisJCQlDaGFubmVsSGFzaFByZXBhcmVLZXkoJmtleSwgTXlEYXRhYmFzZUlk LCBjaGFubmVsKTsKKwkJCWVudHJ5ID0gZHNoYXNoX2ZpbmQoY2hhbm5lbEhhc2gsICZrZXks IGZhbHNlKTsKKwkJfQorCisJCWlmIChlbnRyeSA9PSBOVUxMKQorCQkJY29udGludWU7CQkJ LyogTm8gbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIHRoaXMgY2hhbm5lbCAqLworCisJCWxp c3RlbmVycyA9IChQcm9jTnVtYmVyICopIGRzYV9nZXRfYWRkcmVzcyhjaGFubmVsRFNBLAor CQkJCQkJCQkJCQkJICAgZW50cnktPmxpc3RlbmVyc0FycmF5KTsKKworCQlmb3IgKGludCBq ID0gMDsgaiA8IGVudHJ5LT5udW1MaXN0ZW5lcnM7IGorKykKKwkJeworCQkJUHJvY051bWJl cglpID0gbGlzdGVuZXJzW2pdOworCQkJaW50MzIJCXBpZDsKKwkJCVF1ZXVlUG9zaXRpb24g cG9zOworCisJCQlpZiAoUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSkKKwkJCQlj b250aW51ZTsKKworCQkJcG9zID0gUVVFVUVfQkFDS0VORF9QT1MoaSk7CisJCQlwaWQgPSBR VUVVRV9CQUNLRU5EX1BJRChpKTsKKworCQkJLyogU2tpcCBpZiBjYXVnaHQgdXAgKi8KIAkJ CWlmIChRVUVVRV9QT1NfRVFVQUwocG9zLCBRVUVVRV9IRUFEKSkKIAkJCQljb250aW51ZTsK KworCQkJQXNzZXJ0KHBpZCAhPSBJbnZhbGlkUGlkKTsKKworCQkJUVVFVUVfQkFDS0VORF9X QUtFVVBfUEVORElORyhpKSA9IHRydWU7CisJCQlwaWRzW2NvdW50XSA9IHBpZDsKKwkJCXBy b2Nub3NbY291bnRdID0gaTsKKwkJCWNvdW50Kys7CiAJCX0KLQkJZWxzZQorCisJCWRzaGFz aF9yZWxlYXNlX2xvY2soY2hhbm5lbEhhc2gsIGVudHJ5KTsKKwl9CisKKwkvKgorCSAqIERp cmVjdCBhZHZhbmNlbWVudDogYXZvaWQgd2FraW5nIG5vbi1jYXVnaHQgdXAgYmFja2VuZHMg dGhhdCBhcmVuJ3QKKwkgKiBpbnRlcmVzdGVkIGluIG91ciBub3RpZmljYXRpb25zLgorCSAq LworCWlmIChwZW5kaW5nTm90aWZpZXMgIT0gTlVMTCkKKwl7CisJCWZvciAoUHJvY051bWJl ciBpID0gUVVFVUVfRklSU1RfTElTVEVORVI7CisJCQkgaSAhPSBJTlZBTElEX1BST0NfTlVN QkVSOworCQkJIGkgPSBRVUVVRV9ORVhUX0xJU1RFTkVSKGkpKQogCQl7CisJCQlRdWV1ZVBv c2l0aW9uIHBvczsKKwkJCWludDMyCQlwaWQ7CisKKwkJCWlmIChRVUVVRV9CQUNLRU5EX1dB S0VVUF9QRU5ESU5HKGkpKQorCQkJCWNvbnRpbnVlOworCisJCQlwb3MgPSBRVUVVRV9CQUNL RU5EX1BPUyhpKTsKKwkJCXBpZCA9IFFVRVVFX0JBQ0tFTkRfUElEKGkpOworCiAJCQkvKgot CQkJICogTGlzdGVuZXJzIGluIG90aGVyIGRhdGFiYXNlcyBzaG91bGQgYmUgc2lnbmFsZWQg b25seSBpZiB0aGV5Ci0JCQkgKiBhcmUgZmFyIGJlaGluZC4KKwkJCSAqIFdlIG5lZWQgdG8g c2lnbmFsIGFkdmFuY2luZyBsaXN0ZW5pbmcgYmFja2VuZHMgdGhhdCB3b3VsZCBnZXQKKwkJ CSAqIHN0dWNrIGF0IGEgcG9zaXRpb24gYmVmb3JlIHRoZSBuZXcgcXVldWUgaGVhZC4gV2Ug YWxzbyBuZWVkIHRvCisJCQkgKiBzaWduYWwgbGlzdGVuaW5nIGJhY2tlbmRzIHRoYXQgYXJl IGlkbGUgYXQgYSBwb3NpdGlvbiBiZWZvcmUKKwkJCSAqIHRoZSBvbGQgcXVldWUgaGVhZCBz aW5jZSB0aGV5IGNvdWxkIGJlIGludGVyZXN0ZWQgaW4gdGhlCisJCQkgKiBtZXNzYWdlcyBp bi1iZXR3ZWVuLgorCQkJICoKKwkJCSAqIExpc3RlbmluZyBiYWNrZW5kcyB0aGF0IGFyZSBu b3QgYWR2YW5jaW5nIGFuZCBhcmUgc3RhdGlvbmFyeSBhdAorCQkJICogYSBwb3NpdGlvbiBz b21ld2hlcmUgaW4gdGhlIHJhbmdlIHdlIGp1c3Qgd3JvdGUsIGNhbiBzYWZlbHkgYmUKKwkJ CSAqIGRpcmVjdCBhZHZhbmNlZCB0byB0aGUgbmV3IHF1ZXVlIGhlYWQsIHNpbmNlIHdlIGtu b3cgdGhhdCB0aGV5CisJCQkgKiBhcmUgbm90IGludGVyZXN0ZWQgaW4gb3VyIG1lc3NhZ2Vz LgogCQkJICovCi0JCQlpZiAoYXN5bmNRdWV1ZVBhZ2VEaWZmKFFVRVVFX1BPU19QQUdFKFFV RVVFX0hFQUQpLAotCQkJCQkJCQkgICBRVUVVRV9QT1NfUEFHRShwb3MpKSA8IFFVRVVFX0NM RUFOVVBfREVMQVkpCi0JCQkJY29udGludWU7CisJCQlpZiAoUVVFVUVfQkFDS0VORF9JU19B RFZBTkNJTkcoaSkgPworCQkJCVFVRVVFX1BPU19QUkVDRURFUyhRVUVVRV9CQUNLRU5EX0FE VkFOQ0lOR19QT1MoaSksIHF1ZXVlSGVhZEFmdGVyV3JpdGUpIDoKKwkJCQlRVUVVRV9QT1Nf UFJFQ0VERVMocG9zLCBxdWV1ZUhlYWRCZWZvcmVXcml0ZSkpCisJCQl7CisJCQkJQXNzZXJ0 KHBpZCAhPSBJbnZhbGlkUGlkKTsKKworCQkJCVFVRVVFX0JBQ0tFTkRfV0FLRVVQX1BFTkRJ TkcoaSkgPSB0cnVlOworCQkJCXBpZHNbY291bnRdID0gcGlkOworCQkJCXByb2Nub3NbY291 bnRdID0gaTsKKwkJCQljb3VudCsrOworCQkJfQorCQkJZWxzZSBpZiAoIVFVRVVFX0JBQ0tF TkRfSVNfQURWQU5DSU5HKGkpICYmCisJCQkJCSBRVUVVRV9QT1NfUFJFQ0VERVMocG9zLCBx dWV1ZUhlYWRBZnRlcldyaXRlKSkKKwkJCXsKKwkJCQlBc3NlcnQoIVFVRVVFX1BPU19QUkVD RURFUyhwb3MsIHF1ZXVlSGVhZEJlZm9yZVdyaXRlKSk7CisKKwkJCQlRVUVVRV9CQUNLRU5E X1BPUyhpKSA9IHF1ZXVlSGVhZEFmdGVyV3JpdGU7CisJCQl9CiAJCX0KLQkJLyogT0ssIG5l ZWQgdG8gc2lnbmFsIHRoaXMgb25lICovCi0JCXBpZHNbY291bnRdID0gcGlkOwotCQlwcm9j bm9zW2NvdW50XSA9IGk7Ci0JCWNvdW50Kys7CiAJfQogCUxXTG9ja1JlbGVhc2UoTm90aWZ5 UXVldWVMb2NrKTsKIApAQCAtMTY3Myw5ICsyMTIxLDEwIEBAIEF0QWJvcnRfTm90aWZ5KHZv aWQpCiAJLyoKIAkgKiBJZiB3ZSBMSVNURU4gYnV0IHRoZW4gcm9sbCBiYWNrIHRoZSB0cmFu c2FjdGlvbiBhZnRlciBQcmVDb21taXRfTm90aWZ5LAogCSAqIHdlIGhhdmUgcmVnaXN0ZXJl ZCBhcyBhIGxpc3RlbmVyIGJ1dCBoYXZlIG5vdCBtYWRlIGFueSBlbnRyeSBpbgotCSAqIGxp c3RlbkNoYW5uZWxzLiAgSW4gdGhhdCBjYXNlLCBkZXJlZ2lzdGVyIGFnYWluLgorCSAqIGxp c3RlbkNoYW5uZWxzSGFzaC4gIEluIHRoYXQgY2FzZSwgZGVyZWdpc3RlciBhZ2Fpbi4KIAkg Ki8KLQlpZiAoYW1SZWdpc3RlcmVkTGlzdGVuZXIgJiYgbGlzdGVuQ2hhbm5lbHMgPT0gTklM KQorCWlmIChhbVJlZ2lzdGVyZWRMaXN0ZW5lciAmJgorCQkobGlzdGVuQ2hhbm5lbHNIYXNo ID09IE5VTEwgfHwgaGFzaF9nZXRfbnVtX2VudHJpZXMobGlzdGVuQ2hhbm5lbHNIYXNoKSA9 PSAwKSkKIAkJYXN5bmNRdWV1ZVVucmVnaXN0ZXIoKTsKIAogCS8qIEFuZCBjbGVhbiB1cCAq LwpAQCAtMTg2MSwyMCArMjMxMCwyOSBAQCBhc3luY1F1ZXVlUmVhZEFsbE5vdGlmaWNhdGlv bnModm9pZCkKIAkJQXN5bmNRdWV1ZUVudHJ5IGFsaWduOwogCX0JCQlwYWdlX2J1ZmZlcjsK IAotCS8qIEZldGNoIGN1cnJlbnQgc3RhdGUgKi8KKwkvKgorCSAqIEZldGNoIGN1cnJlbnQg c3RhdGUsIGluZGljYXRlIHRvIG90aGVycyB0aGF0IHdlIGhhdmUgd29rZW4gdXAsIGFuZCB0 aGF0CisJICogd2Ugbm93IHdpbGwgYmUgYWR2YW5jaW5nIG91ciBwb3NpdGlvbi4KKwkgKi8K IAlMV0xvY2tBY3F1aXJlKE5vdGlmeVF1ZXVlTG9jaywgTFdfU0hBUkVEKTsKIAkvKiBBc3Nl cnQgY2hlY2tzIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIHN0YXRlIGVudHJ5ICovCiAJQXNzZXJ0 KE15UHJvY1BpZCA9PSBRVUVVRV9CQUNLRU5EX1BJRChNeVByb2NOdW1iZXIpKTsKKwlRVUVV RV9CQUNLRU5EX1dBS0VVUF9QRU5ESU5HKE15UHJvY051bWJlcikgPSBmYWxzZTsKKwloZWFk ID0gUVVFVUVfSEVBRDsKIAlwb3MgPSBRVUVVRV9CQUNLRU5EX1BPUyhNeVByb2NOdW1iZXIp OwotCWhlYWQgPSBRVUVVRV9IRUFEOwotCUxXTG9ja1JlbGVhc2UoTm90aWZ5UXVldWVMb2Nr KTsKIAogCWlmIChRVUVVRV9QT1NfRVFVQUwocG9zLCBoZWFkKSkKIAl7CiAJCS8qIE5vdGhp bmcgdG8gZG8sIHdlIGhhdmUgcmVhZCBhbGwgbm90aWZpY2F0aW9ucyBhbHJlYWR5LiAqLwor CQlMV0xvY2tSZWxlYXNlKE5vdGlmeVF1ZXVlTG9jayk7CiAJCXJldHVybjsKIAl9CiAKKwlR VUVVRV9CQUNLRU5EX0lTX0FEVkFOQ0lORyhNeVByb2NOdW1iZXIpID0gdHJ1ZTsKKwlRVUVV RV9CQUNLRU5EX0FEVkFOQ0lOR19QT1MoTXlQcm9jTnVtYmVyKSA9IGhlYWQ7CisKKwlMV0xv Y2tSZWxlYXNlKE5vdGlmeVF1ZXVlTG9jayk7CisKIAkvKi0tLS0tLS0tLS0KIAkgKiBHZXQg c25hcHNob3Qgd2UnbGwgdXNlIHRvIGRlY2lkZSB3aGljaCB4YWN0cyBhcmUgc3RpbGwgaW4g cHJvZ3Jlc3MuCiAJICogVGhpcyBpcyB0cmlja2llciB0aGFuIGl0IG1pZ2h0IHNlZW0sIGJl Y2F1c2Ugb2YgcmFjZSBjb25kaXRpb25zLgpAQCAtMTk4Nyw2ICsyNDQ1LDggQEAgYXN5bmNR dWV1ZVJlYWRBbGxOb3RpZmljYXRpb25zKHZvaWQpCiAJewogCQkvKiBVcGRhdGUgc2hhcmVk IHN0YXRlICovCiAJCUxXTG9ja0FjcXVpcmUoTm90aWZ5UXVldWVMb2NrLCBMV19TSEFSRUQp OworCisJCVFVRVVFX0JBQ0tFTkRfSVNfQURWQU5DSU5HKE15UHJvY051bWJlcikgPSBmYWxz ZTsKIAkJUVVFVUVfQkFDS0VORF9QT1MoTXlQcm9jTnVtYmVyKSA9IHBvczsKIAkJTFdMb2Nr UmVsZWFzZShOb3RpZnlRdWV1ZUxvY2spOwogCX0KQEAgLTIxODYsNyArMjY0Niw3IEBAIFBy b2Nlc3NJbmNvbWluZ05vdGlmeShib29sIGZsdXNoKQogCW5vdGlmeUludGVycnVwdFBlbmRp bmcgPSBmYWxzZTsKIAogCS8qIERvIG5vdGhpbmcgZWxzZSBpZiB3ZSBhcmVuJ3QgYWN0aXZl bHkgbGlzdGVuaW5nICovCi0JaWYgKGxpc3RlbkNoYW5uZWxzID09IE5JTCkKKwlpZiAobGlz dGVuQ2hhbm5lbHNIYXNoID09IE5VTEwgfHwgaGFzaF9nZXRfbnVtX2VudHJpZXMobGlzdGVu Q2hhbm5lbHNIYXNoKSA9PSAwKQogCQlyZXR1cm47CiAKIAlpZiAoVHJhY2Vfbm90aWZ5KQpA QCAtMjI5MCwxMyArMjc1MCwxNSBAQCBBZGRFdmVudFRvUGVuZGluZ05vdGlmaWVzKE5vdGlm aWNhdGlvbiAqbikKIHsKIAlBc3NlcnQocGVuZGluZ05vdGlmaWVzLT5ldmVudHMgIT0gTklM KTsKIAotCS8qIENyZWF0ZSB0aGUgaGFzaCB0YWJsZSBpZiBpdCdzIHRpbWUgdG8gKi8KKwkv KiBDcmVhdGUgdGhlIGhhc2ggdGFibGVzIGlmIGl0J3MgdGltZSB0byAqLwogCWlmIChsaXN0 X2xlbmd0aChwZW5kaW5nTm90aWZpZXMtPmV2ZW50cykgPj0gTUlOX0hBU0hBQkxFX05PVElG SUVTICYmCiAJCXBlbmRpbmdOb3RpZmllcy0+aGFzaHRhYiA9PSBOVUxMKQogCXsKIAkJSEFT SENUTAkJaGFzaF9jdGw7CiAJCUxpc3RDZWxsICAgKmw7CiAKKwkJQXNzZXJ0KHBlbmRpbmdO b3RpZmllcy0+Y2hhbm5lbEhhc2h0YWIgPT0gTlVMTCk7CisKIAkJLyogQ3JlYXRlIHRoZSBo YXNoIHRhYmxlICovCiAJCWhhc2hfY3RsLmtleXNpemUgPSBzaXplb2YoTm90aWZpY2F0aW9u ICopOwogCQloYXNoX2N0bC5lbnRyeXNpemUgPSBzaXplb2Yoc3RydWN0IE5vdGlmaWNhdGlv bkhhc2gpOwpAQCAtMjMwOSwxMCArMjc3MSwyMiBAQCBBZGRFdmVudFRvUGVuZGluZ05vdGlm aWVzKE5vdGlmaWNhdGlvbiAqbikKIAkJCQkJCSZoYXNoX2N0bCwKIAkJCQkJCUhBU0hfRUxF TSB8IEhBU0hfRlVOQ1RJT04gfCBIQVNIX0NPTVBBUkUgfCBIQVNIX0NPTlRFWFQpOwogCisJ CS8qIENyZWF0ZSB0aGUgY2hhbm5lbCBoYXNoIHRhYmxlICovCisJCW1lbXNldCgmaGFzaF9j dGwsIDAsIHNpemVvZihoYXNoX2N0bCkpOworCQloYXNoX2N0bC5rZXlzaXplID0gTkFNRURB VEFMRU47CisJCWhhc2hfY3RsLmVudHJ5c2l6ZSA9IHNpemVvZihzdHJ1Y3QgQ2hhbm5lbEhh c2gpOworCQloYXNoX2N0bC5oY3h0ID0gQ3VyVHJhbnNhY3Rpb25Db250ZXh0OworCQlwZW5k aW5nTm90aWZpZXMtPmNoYW5uZWxIYXNodGFiID0KKwkJCWhhc2hfY3JlYXRlKCJQZW5kaW5n IE5vdGlmeSBDaGFubmVscyIsCisJCQkJCQk2NEwsCisJCQkJCQkmaGFzaF9jdGwsCisJCQkJ CQlIQVNIX0VMRU0gfCBIQVNIX1NUUklOR1MgfCBIQVNIX0NPTlRFWFQpOworCiAJCS8qIElu c2VydCBhbGwgdGhlIGFscmVhZHktZXhpc3RpbmcgZXZlbnRzICovCiAJCWZvcmVhY2gobCwg cGVuZGluZ05vdGlmaWVzLT5ldmVudHMpCiAJCXsKIAkJCU5vdGlmaWNhdGlvbiAqb2xkbiA9 IChOb3RpZmljYXRpb24gKikgbGZpcnN0KGwpOworCQkJY2hhcgkgICAqY2hhbm5lbCA9IG9s ZG4tPmRhdGE7CiAJCQlib29sCQlmb3VuZDsKIAogCQkJKHZvaWQpIGhhc2hfc2VhcmNoKHBl bmRpbmdOb3RpZmllcy0+aGFzaHRhYiwKQEAgLTIzMjAsMjIgKzI3OTQsNDIgQEAgQWRkRXZl bnRUb1BlbmRpbmdOb3RpZmllcyhOb3RpZmljYXRpb24gKm4pCiAJCQkJCQkJICAgSEFTSF9F TlRFUiwKIAkJCQkJCQkgICAmZm91bmQpOwogCQkJQXNzZXJ0KCFmb3VuZCk7CisKKwkJCS8q IEluc2VydCBjaGFubmVsIGludG8gY2hhbm5lbEhhc2h0YWIgKi8KKwkJCSh2b2lkKSBoYXNo X3NlYXJjaChwZW5kaW5nTm90aWZpZXMtPmNoYW5uZWxIYXNodGFiLAorCQkJCQkJCSAgIGNo YW5uZWwsCisJCQkJCQkJICAgSEFTSF9FTlRFUiwKKwkJCQkJCQkgICAmZm91bmQpOworCQkJ LyogZm91bmQgbWF5IGJlIHRydWUgaWYgbXVsdGlwbGUgZXZlbnRzIG9uIHNhbWUgY2hhbm5l bCAqLwogCQl9CiAJfQogCiAJLyogQWRkIG5ldyBldmVudCB0byB0aGUgbGlzdCwgaW4gb3Jk ZXIgKi8KIAlwZW5kaW5nTm90aWZpZXMtPmV2ZW50cyA9IGxhcHBlbmQocGVuZGluZ05vdGlm aWVzLT5ldmVudHMsIG4pOwogCi0JLyogQWRkIGV2ZW50IHRvIHRoZSBoYXNoIHRhYmxlIGlm IG5lZWRlZCAqLworCS8qIEFkZCBldmVudCB0byB0aGUgaGFzaCB0YWJsZXMgaWYgbmVlZGVk ICovCiAJaWYgKHBlbmRpbmdOb3RpZmllcy0+aGFzaHRhYiAhPSBOVUxMKQogCXsKIAkJYm9v bAkJZm91bmQ7CiAKKwkJQXNzZXJ0KHBlbmRpbmdOb3RpZmllcy0+Y2hhbm5lbEhhc2h0YWIg IT0gTlVMTCk7CisKIAkJKHZvaWQpIGhhc2hfc2VhcmNoKHBlbmRpbmdOb3RpZmllcy0+aGFz aHRhYiwKIAkJCQkJCSAgICZuLAogCQkJCQkJICAgSEFTSF9FTlRFUiwKIAkJCQkJCSAgICZm b3VuZCk7CiAJCUFzc2VydCghZm91bmQpOworCisJCS8qIEFkZCBjaGFubmVsIHRvIGNoYW5u ZWxIYXNodGFiICovCisJCXsKKwkJCWNoYXIJICAgKmNoYW5uZWwgPSBuLT5kYXRhOworCisJ CQkodm9pZCkgaGFzaF9zZWFyY2gocGVuZGluZ05vdGlmaWVzLT5jaGFubmVsSGFzaHRhYiwK KwkJCQkJCQkgICBjaGFubmVsLAorCQkJCQkJCSAgIEhBU0hfRU5URVIsCisJCQkJCQkJICAg JmZvdW5kKTsKKwkJCS8qIGZvdW5kIG1heSBiZSB0cnVlIGlmIHdlIGFscmVhZHkgaGF2ZSBh biBldmVudCBvbiB0aGlzIGNoYW5uZWwgKi8KKwkJfQogCX0KIH0KIApAQCAtMjM3Myw3ICsy ODY3LDcgQEAgbm90aWZpY2F0aW9uX21hdGNoKGNvbnN0IHZvaWQgKmtleTEsIGNvbnN0IHZv aWQgKmtleTIsIFNpemUga2V5c2l6ZSkKIAlyZXR1cm4gMTsJCQkJCS8qIG5vdCBlcXVhbCAq LwogfQogCi0vKiBDbGVhciB0aGUgcGVuZGluZ0FjdGlvbnMgYW5kIHBlbmRpbmdOb3RpZmll cyBsaXN0cy4gKi8KKy8qIENsZWFyIHRoZSBwZW5kaW5nQWN0aW9ucywgcGVuZGluZ05vdGlm aWVzLCBhbmQgcGVuZGluZ05vdGlmeUNoYW5uZWxzIGxpc3RzLiAqLwogc3RhdGljIHZvaWQK IENsZWFyUGVuZGluZ0FjdGlvbnNBbmROb3RpZmllcyh2b2lkKQogewpAQCAtMjM4NSw2ICsy ODc5LDcgQEAgQ2xlYXJQZW5kaW5nQWN0aW9uc0FuZE5vdGlmaWVzKHZvaWQpCiAJICovCiAJ cGVuZGluZ0FjdGlvbnMgPSBOVUxMOwogCXBlbmRpbmdOb3RpZmllcyA9IE5VTEw7CisJcGVu ZGluZ05vdGlmeUNoYW5uZWxzID0gTklMOwogfQogCiAvKgpAQCAtMjM5NSwzICsyODkwLDE2 IEBAIGNoZWNrX25vdGlmeV9idWZmZXJzKGludCAqbmV3dmFsLCB2b2lkICoqZXh0cmEsIEd1 Y1NvdXJjZSBzb3VyY2UpCiB7CiAJcmV0dXJuIGNoZWNrX3NscnVfYnVmZmVycygibm90aWZ5 X2J1ZmZlcnMiLCBuZXd2YWwpOwogfQorCisKKy8qCisgKiBDaGFubmVsSGFzaFByZXBhcmVL ZXkKKyAqCQlQcmVwYXJlIGEgY2hhbm5lbCBrZXkgZm9yIHVzZSBhcyBhIGhhc2gga2V5Lgor ICovCitzdGF0aWMgaW5saW5lIHZvaWQKK0NoYW5uZWxIYXNoUHJlcGFyZUtleShDaGFubmVs SGFzaEtleSAqa2V5LCBPaWQgZGJvaWQsIGNvbnN0IGNoYXIgKmNoYW5uZWwpCit7CisJbWVt c2V0KGtleSwgMCwgc2l6ZW9mKENoYW5uZWxIYXNoS2V5KSk7CisJa2V5LT5kYm9pZCA9IGRi b2lkOworCXN0cmxjcHkoa2V5LT5jaGFubmVsLCBjaGFubmVsLCBOQU1FREFUQUxFTik7Cit9 CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50X25h bWVzLnR4dCBiL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L3dhaXRfZXZlbnRfbmFtZXMu dHh0CmluZGV4IDc1NTNmNmVhY2VmLi5hNGZhZGJkMDc2NyAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQKKysrIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQKQEAgLTM2Niw2ICsz NjYsNyBAQCBTdWJ0cmFuc0J1ZmZlcgkiV2FpdGluZyBmb3IgSS9PIG9uIGEgc3ViLXRyYW5z YWN0aW9uIFNMUlUgYnVmZmVyLiIKIE11bHRpWGFjdE9mZnNldEJ1ZmZlcgkiV2FpdGluZyBm b3IgSS9PIG9uIGEgbXVsdGl4YWN0IG9mZnNldCBTTFJVIGJ1ZmZlci4iCiBNdWx0aVhhY3RN ZW1iZXJCdWZmZXIJIldhaXRpbmcgZm9yIEkvTyBvbiBhIG11bHRpeGFjdCBtZW1iZXIgU0xS VSBidWZmZXIuIgogTm90aWZ5QnVmZmVyCSJXYWl0aW5nIGZvciBJL08gb24gYSA8Y29tbWFu ZD5OT1RJRlk8L2NvbW1hbmQ+IG1lc3NhZ2UgU0xSVSBidWZmZXIuIgorTm90aWZ5Q2hhbm5l bEhhc2gJIldhaXRpbmcgdG8gYWNjZXNzIHRoZSA8Y29tbWFuZD5OT1RJRlk8L2NvbW1hbmQ+ IGNoYW5uZWwgaGFzaCB0YWJsZS4iCiBTZXJpYWxCdWZmZXIJIldhaXRpbmcgZm9yIEkvTyBv biBhIHNlcmlhbGl6YWJsZSB0cmFuc2FjdGlvbiBjb25mbGljdCBTTFJVIGJ1ZmZlci4iCiBX QUxJbnNlcnQJIldhaXRpbmcgdG8gaW5zZXJ0IFdBTCBkYXRhIGludG8gYSBtZW1vcnkgYnVm ZmVyLiIKIEJ1ZmZlckNvbnRlbnQJIldhaXRpbmcgdG8gYWNjZXNzIGEgZGF0YSBwYWdlIGlu IG1lbW9yeS4iCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2x3bG9ja2xpc3Qu aCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbHdsb2NrbGlzdC5oCmluZGV4IDA2YTFmZmQ0YjA4 Li4yNzY4ZGRmNDQxNCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2ts aXN0LmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2tsaXN0LmgKQEAgLTEwMCw2 ICsxMDAsNyBAQCBQR19MV0xPQ0tUUkFOQ0hFKFNVQlRSQU5TX0JVRkZFUiwgU3VidHJhbnNC dWZmZXIpCiBQR19MV0xPQ0tUUkFOQ0hFKE1VTFRJWEFDVE9GRlNFVF9CVUZGRVIsIE11bHRp WGFjdE9mZnNldEJ1ZmZlcikKIFBHX0xXTE9DS1RSQU5DSEUoTVVMVElYQUNUTUVNQkVSX0JV RkZFUiwgTXVsdGlYYWN0TWVtYmVyQnVmZmVyKQogUEdfTFdMT0NLVFJBTkNIRShOT1RJRllf QlVGRkVSLCBOb3RpZnlCdWZmZXIpCitQR19MV0xPQ0tUUkFOQ0hFKE5PVElGWV9DSEFOTkVM X0hBU0gsIE5vdGlmeUNoYW5uZWxIYXNoKQogUEdfTFdMT0NLVFJBTkNIRShTRVJJQUxfQlVG RkVSLCBTZXJpYWxCdWZmZXIpCiBQR19MV0xPQ0tUUkFOQ0hFKFdBTF9JTlNFUlQsIFdBTElu c2VydCkKIFBHX0xXTE9DS1RSQU5DSEUoQlVGRkVSX0NPTlRFTlQsIEJ1ZmZlckNvbnRlbnQp CmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCBiL3NyYy90 b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CmluZGV4IDAxOGI1OTE5Y2Y2Li5iODQ0Mzcy NTM5OCAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKKysr IGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKQEAgLTQxMiw2ICs0MTIsOCBA QCBDYXRhbG9nSWRNYXBFbnRyeQogQ2F0YWxvZ0luZGV4U3RhdGUKIENoYW5nZVZhck5vZGVz X2NhbGxiYWNrCiBDaGFuZ2VWYXJOb2Rlc19jb250ZXh0CitDaGFubmVsRW50cnkKK0NoYW5u ZWxIYXNoS2V5CiBDaGVja1BvaW50CiBDaGVja1BvaW50U3RtdAogQ2hlY2twb2ludFN0YXRz RGF0YQotLSAKMi41MC4xCgo= --86e7cd31e6424024be1d558339921d90 Content-Disposition: attachment; filename*0="0001-optimize_listen_notify-v24.patch" Content-Type: application/octet-stream; name="=?UTF-8?Q?0001-optimize=5Flisten=5Fnotify-v24.patch?=" Content-Transfer-Encoding: base64 RnJvbSBmYjgyMjEwODE0OWVhMDFmYTI1YTQ2ZjFhNGMwYmE3MWY4NmUxYTJiIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogV2VkLCA4IE9jdCAyMDI1IDA5OjMwOjU0ICswMjAwClN1YmplY3Q6IFtQQVRD SCAxLzNdIEltcHJvdmUgTElTVEVOL05PVElGWSB0ZXN0IGNvdmVyYWdlCgpUaGlzIGFkZHMg aXNvbGF0aW9uIHRlc3RzIHRvIGNvdmVyIHByZXZpb3VzbHkgdW50ZXN0ZWQgY29kZSBwYXRo czoKCiogQ2hlY2sgc2ltcGxlIE5PVElGWSByZXBhcmVudGluZyB3aGVuIHBhcmVudCBoYXMg bm8gYWN0aW9uCiogQ2hlY2sgTElTVEVOIHJlcGFyZW50aW5nIGluIHN1YnRyYW5zYWN0aW9u CiogQ2hlY2sgTElTVEVOIG1lcmdlIHBhdGggd2hlbiBib3RoIG91dGVyIGFuZCBpbm5lciB0 cmFuc2FjdGlvbnMgaGF2ZSBhY3Rpb25zCiogQ2hlY2sgTElTVEVOIGFib3J0IHBhdGggKFJP TExCQUNLIFRPIFNBVkVQT0lOVCBkaXNjYXJkcyBwZW5kaW5nIGFjdGlvbnMpCiogQ2hlY2sg bm90aWZpY2F0aW9uX21hdGNoIGZ1bmN0aW9uICh0cmlnZ2VyZWQgYnkgaGFzaCB0YWJsZSBk dXBsaWNhdGUgZGV0ZWN0aW9uKQoqIENoZWNrIHRoYXQgbm90aWZpY2F0aW9ucyBzZW50IGZy b20gYSBiYWNrZW5kIHRoYXQgaGFzIG5vdCBkb25lIExJU1RFTgogIGFyZSBwcm9wZXJseSBk ZWxpdmVyZWQgdG8gYSBsaXN0ZW5lciBpbiBhbm90aGVyIGJhY2tlbmQKClRoaXMgYWxzbyBh ZGRzIGEgdGVzdCB0byBwcmVwYXJlIGZvciB0aGUgbmV4dCBwYXRjaDoKCiogQ2hlY2sgQ2hh bm5lbEhhc2hBZGRMaXN0ZW5lciBhcnJheSBncm93dGgKLS0tCiBzcmMvdGVzdC9pc29sYXRp b24vZXhwZWN0ZWQvYXN5bmMtbm90aWZ5Lm91dCB8IDExNCArKysrKysrKysrKysrKysrKyst CiBzcmMvdGVzdC9pc29sYXRpb24vc3BlY3MvYXN5bmMtbm90aWZ5LnNwZWMgICB8ICA2OCAr KysrKysrKysrKwogMiBmaWxlcyBjaGFuZ2VkLCAxODEgaW5zZXJ0aW9ucygrKSwgMSBkZWxl dGlvbigtKQoKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC9hc3lu Yy1ub3RpZnkub3V0IGIvc3JjL3Rlc3QvaXNvbGF0aW9uL2V4cGVjdGVkL2FzeW5jLW5vdGlm eS5vdXQKaW5kZXggNTU2ZTE4MDU4OTMuLjQ0M2E2ZWI2NjlmIDEwMDY0NAotLS0gYS9zcmMv dGVzdC9pc29sYXRpb24vZXhwZWN0ZWQvYXN5bmMtbm90aWZ5Lm91dAorKysgYi9zcmMvdGVz dC9pc29sYXRpb24vZXhwZWN0ZWQvYXN5bmMtbm90aWZ5Lm91dApAQCAtMSw0ICsxLDQgQEAK LVBhcnNlZCB0ZXN0IHNwZWMgd2l0aCAzIHNlc3Npb25zCitQYXJzZWQgdGVzdCBzcGVjIHdp dGggNyBzZXNzaW9ucwogCiBzdGFydGluZyBwZXJtdXRhdGlvbjogbGlzdGVuYyBub3RpZnkx IG5vdGlmeTIgbm90aWZ5MyBub3RpZnlmCiBzdGVwIGxpc3RlbmM6IExJU1RFTiBjMTsgTElT VEVOIGMyOwpAQCAtNDcsNiArNDcsMTA1IEBAIG5vdGlmaWVyOiBOT1RJRlkgImMyIiB3aXRo IHBheWxvYWQgInBheWxvYWQiIGZyb20gbm90aWZpZXIKIG5vdGlmaWVyOiBOT1RJRlkgImMx IiB3aXRoIHBheWxvYWQgInBheWxvYWRzIiBmcm9tIG5vdGlmaWVyCiBub3RpZmllcjogTk9U SUZZICJjMiIgd2l0aCBwYXlsb2FkICJwYXlsb2FkcyIgZnJvbSBub3RpZmllcgogCitzdGFy dGluZyBwZXJtdXRhdGlvbjogbGlzdGVuYyBub3RpZnlzX3NpbXBsZQorc3RlcCBsaXN0ZW5j OiBMSVNURU4gYzE7IExJU1RFTiBjMjsKK3N0ZXAgbm90aWZ5c19zaW1wbGU6IAorCUJFR0lO OworCVNBVkVQT0lOVCBzMTsKKwlOT1RJRlkgYzEsICdzaW1wbGUxJzsKKwlOT1RJRlkgYzIs ICdzaW1wbGUyJzsKKwlSRUxFQVNFIFNBVkVQT0lOVCBzMTsKKwlDT01NSVQ7CisKK25vdGlm aWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgInNpbXBsZTEiIGZyb20gbm90aWZpZXIK K25vdGlmaWVyOiBOT1RJRlkgImMyIiB3aXRoIHBheWxvYWQgInNpbXBsZTIiIGZyb20gbm90 aWZpZXIKKworc3RhcnRpbmcgcGVybXV0YXRpb246IGxzYmVnaW4gbHNzYXZlcG9pbnQgbHNs aXN0ZW4gbHNyZWxlYXNlIGxzY29tbWl0IGxzbm90aWZ5CitzdGVwIGxzYmVnaW46IEJFR0lO Oworc3RlcCBsc3NhdmVwb2ludDogU0FWRVBPSU5UIHMxOworc3RlcCBsc2xpc3RlbjogTElT VEVOIGMxOyBMSVNURU4gYzI7CitzdGVwIGxzcmVsZWFzZTogUkVMRUFTRSBTQVZFUE9JTlQg czE7CitzdGVwIGxzY29tbWl0OiBDT01NSVQ7CitzdGVwIGxzbm90aWZ5OiBOT1RJRlkgYzEs ICdzdWJ4YWN0X3Rlc3QnOworbGlzdGVuX3N1YnhhY3Q6IE5PVElGWSAiYzEiIHdpdGggcGF5 bG9hZCAic3VieGFjdF90ZXN0IiBmcm9tIGxpc3Rlbl9zdWJ4YWN0CisKK3N0YXJ0aW5nIHBl cm11dGF0aW9uOiBsc2JlZ2luIGxzbGlzdGVuX291dGVyIGxzc2F2ZXBvaW50IGxzbGlzdGVu IGxzcmVsZWFzZSBsc2NvbW1pdCBsc25vdGlmeQorc3RlcCBsc2JlZ2luOiBCRUdJTjsKK3N0 ZXAgbHNsaXN0ZW5fb3V0ZXI6IExJU1RFTiBjMzsKK3N0ZXAgbHNzYXZlcG9pbnQ6IFNBVkVQ T0lOVCBzMTsKK3N0ZXAgbHNsaXN0ZW46IExJU1RFTiBjMTsgTElTVEVOIGMyOworc3RlcCBs c3JlbGVhc2U6IFJFTEVBU0UgU0FWRVBPSU5UIHMxOworc3RlcCBsc2NvbW1pdDogQ09NTUlU Oworc3RlcCBsc25vdGlmeTogTk9USUZZIGMxLCAnc3VieGFjdF90ZXN0JzsKK2xpc3Rlbl9z dWJ4YWN0OiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgInN1YnhhY3RfdGVzdCIgZnJvbSBs aXN0ZW5fc3VieGFjdAorCitzdGFydGluZyBwZXJtdXRhdGlvbjogbHNiZWdpbiBsc3NhdmVw b2ludCBsc2xpc3RlbiBsc3JvbGxiYWNrIGxzY29tbWl0IGxzbm90aWZ5X2NoZWNrCitzdGVw IGxzYmVnaW46IEJFR0lOOworc3RlcCBsc3NhdmVwb2ludDogU0FWRVBPSU5UIHMxOworc3Rl cCBsc2xpc3RlbjogTElTVEVOIGMxOyBMSVNURU4gYzI7CitzdGVwIGxzcm9sbGJhY2s6IFJP TExCQUNLIFRPIFNBVkVQT0lOVCBzMTsKK3N0ZXAgbHNjb21taXQ6IENPTU1JVDsKK3N0ZXAg bHNub3RpZnlfY2hlY2s6IE5PVElGWSBjMSwgJ3Nob3VsZF9ub3RfcmVjZWl2ZSc7CisKK3N0 YXJ0aW5nIHBlcm11dGF0aW9uOiBsaXN0ZW5jIG5vdGlmeV9tYW55X3dpdGhfZHVwCitzdGVw IGxpc3RlbmM6IExJU1RFTiBjMTsgTElTVEVOIGMyOworc3RlcCBub3RpZnlfbWFueV93aXRo X2R1cDogCisJQkVHSU47CisJU0VMRUNUIHBnX25vdGlmeSgnYzEnLCAnbXNnJyB8fCBzOjp0 ZXh0KSBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxNykgczsKKwlTRUxFQ1QgcGdfbm90aWZ5 KCdjMScsICdtc2cxJyk7CisJQ09NTUlUOworCitwZ19ub3RpZnkKKy0tLS0tLS0tLQorICAg ICAgICAgCisgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAg ICAgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisg ICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIAor ICAgICAgICAgCisgICAgICAgICAKKygxNyByb3dzKQorCitwZ19ub3RpZnkKKy0tLS0tLS0t LQorICAgICAgICAgCisoMSByb3cpCisKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBh eWxvYWQgIm1zZzEiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRo IHBheWxvYWQgIm1zZzIiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3 aXRoIHBheWxvYWQgIm1zZzMiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMx IiB3aXRoIHBheWxvYWQgIm1zZzQiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkg ImMxIiB3aXRoIHBheWxvYWQgIm1zZzUiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJ RlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzYiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBO T1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzciIGZyb20gbm90aWZpZXIKK25vdGlmaWVy OiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzgiIGZyb20gbm90aWZpZXIKK25vdGlm aWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzkiIGZyb20gbm90aWZpZXIKK25v dGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzEwIiBmcm9tIG5vdGlmaWVy Citub3RpZmllcjogTk9USUZZICJjMSIgd2l0aCBwYXlsb2FkICJtc2cxMSIgZnJvbSBub3Rp Zmllcgorbm90aWZpZXI6IE5PVElGWSAiYzEiIHdpdGggcGF5bG9hZCAibXNnMTIiIGZyb20g bm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzEzIiBm cm9tIG5vdGlmaWVyCitub3RpZmllcjogTk9USUZZICJjMSIgd2l0aCBwYXlsb2FkICJtc2cx NCIgZnJvbSBub3RpZmllcgorbm90aWZpZXI6IE5PVElGWSAiYzEiIHdpdGggcGF5bG9hZCAi bXNnMTUiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxv YWQgIm1zZzE2IiBmcm9tIG5vdGlmaWVyCitub3RpZmllcjogTk9USUZZICJjMSIgd2l0aCBw YXlsb2FkICJtc2cxNyIgZnJvbSBub3RpZmllcgorCitzdGFydGluZyBwZXJtdXRhdGlvbjog bGlzdGVuYyBsbGlzdGVuIGwybGlzdGVuIGwzbGlzdGVuIGxzbGlzdGVuCitzdGVwIGxpc3Rl bmM6IExJU1RFTiBjMTsgTElTVEVOIGMyOworc3RlcCBsbGlzdGVuOiBMSVNURU4gYzE7IExJ U1RFTiBjMjsKK3N0ZXAgbDJsaXN0ZW46IExJU1RFTiBjMTsKK3N0ZXAgbDNsaXN0ZW46IExJ U1RFTiBjMTsKK3N0ZXAgbHNsaXN0ZW46IExJU1RFTiBjMTsgTElTVEVOIGMyOworCiBzdGFy dGluZyBwZXJtdXRhdGlvbjogbGxpc3RlbiBub3RpZnkxIG5vdGlmeTIgbm90aWZ5MyBub3Rp ZnlmIGxjaGVjawogc3RlcCBsbGlzdGVuOiBMSVNURU4gYzE7IExJU1RFTiBjMjsKIHN0ZXAg bm90aWZ5MTogTk9USUZZIGMxOwpAQCAtOTUsNiArMTk0LDggQEAgbGlzdGVuZXI6IE5PVElG WSAiYzIiIHdpdGggcGF5bG9hZCAiIiBmcm9tIG5vdGlmaWVyCiAKIHN0YXJ0aW5nIHBlcm11 dGF0aW9uOiBsMmxpc3RlbiBsMmJlZ2luIG5vdGlmeTEgbGJlZ2lucyBsbGlzdGVuIGxjb21t aXQgbDJjb21taXQgbDJzdG9wCiBzdGVwIGwybGlzdGVuOiBMSVNURU4gYzE7CitsaXN0ZW5l cjI6IE5PVElGWSAiYzEiIHdpdGggcGF5bG9hZCAiIiBmcm9tIG5vdGlmaWVyCitsaXN0ZW5l cjI6IE5PVElGWSAiYzEiIHdpdGggcGF5bG9hZCAiIiBmcm9tIG5vdGlmaWVyCiBzdGVwIGwy YmVnaW46IEJFR0lOOwogc3RlcCBub3RpZnkxOiBOT1RJRlkgYzE7CiBzdGVwIGxiZWdpbnM6 IEJFR0lOIElTT0xBVElPTiBMRVZFTCBTRVJJQUxJWkFCTEU7CkBAIC0xMDQsNiArMjA1LDE3 IEBAIHN0ZXAgbDJjb21taXQ6IENPTU1JVDsKIGxpc3RlbmVyMjogTk9USUZZICJjMSIgd2l0 aCBwYXlsb2FkICIiIGZyb20gbm90aWZpZXIKIHN0ZXAgbDJzdG9wOiBVTkxJU1RFTiAqOwog CitzdGFydGluZyBwZXJtdXRhdGlvbjogbGNoX2xpc3RlbiBuY2hfbm90aWZ5IGxjaF9jaGVj aworc3RlcCBsY2hfbGlzdGVuOiBMSVNURU4gY2g7CitzdGVwIG5jaF9ub3RpZnk6IE5PVElG WSBjaCwgJ2FhJzsKK3N0ZXAgbGNoX2NoZWNrOiBTRUxFQ1QgMSBBUyB4OworeAorLQorMQor KDEgcm93KQorCitsaXN0ZW5lcl9jaDogTk9USUZZICJjaCIgd2l0aCBwYXlsb2FkICJhYSIg ZnJvbSBub3RpZmllcl9jaAorCiBzdGFydGluZyBwZXJtdXRhdGlvbjogbGxpc3RlbiBsYmVn aW4gdXNhZ2UgYmlnbm90aWZ5IHVzYWdlCiBzdGVwIGxsaXN0ZW46IExJU1RFTiBjMTsgTElT VEVOIGMyOwogc3RlcCBsYmVnaW46IEJFR0lOOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvaXNv bGF0aW9uL3NwZWNzL2FzeW5jLW5vdGlmeS5zcGVjIGIvc3JjL3Rlc3QvaXNvbGF0aW9uL3Nw ZWNzL2FzeW5jLW5vdGlmeS5zcGVjCmluZGV4IDBiOGNmZDkxMDgzLi4wYTAxZTc3N2I5OCAx MDA2NDQKLS0tIGEvc3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNzL2FzeW5jLW5vdGlmeS5zcGVj CisrKyBiL3NyYy90ZXN0L2lzb2xhdGlvbi9zcGVjcy9hc3luYy1ub3RpZnkuc3BlYwpAQCAt MzEsNiArMzEsMjAgQEAgc3RlcCBub3RpZnlzMQl7CiAJUk9MTEJBQ0sgVE8gU0FWRVBPSU5U IHMyOwogCUNPTU1JVDsKIH0KK3N0ZXAgbm90aWZ5c19zaW1wbGUJeworCUJFR0lOOworCVNB VkVQT0lOVCBzMTsKKwlOT1RJRlkgYzEsICdzaW1wbGUxJzsKKwlOT1RJRlkgYzIsICdzaW1w bGUyJzsKKwlSRUxFQVNFIFNBVkVQT0lOVCBzMTsKKwlDT01NSVQ7Cit9CitzdGVwIG5vdGlm eV9tYW55X3dpdGhfZHVwCXsKKwlCRUdJTjsKKwlTRUxFQ1QgcGdfbm90aWZ5KCdjMScsICdt c2cnIHx8IHM6OnRleHQpIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDE3KSBzOworCVNFTEVD VCBwZ19ub3RpZnkoJ2MxJywgJ21zZzEnKTsKKwlDT01NSVQ7Cit9CiBzdGVwIHVzYWdlCQl7 IFNFTEVDVCBwZ19ub3RpZmljYXRpb25fcXVldWVfdXNhZ2UoKSA+IDAgQVMgbm9uemVybzsg fQogc3RlcCBiaWdub3RpZnkJeyBTRUxFQ1QgY291bnQocGdfbm90aWZ5KCdjMScsIHM6OnRl eHQpKSBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMDAwKSBzOyB9CiB0ZWFyZG93bgkJeyBV TkxJU1RFTiAqOyB9CkBAIC01Myw2ICs2NywzOCBAQCBzdGVwIGwyYmVnaW4JeyBCRUdJTjsg fQogc3RlcCBsMmNvbW1pdAl7IENPTU1JVDsgfQogc3RlcCBsMnN0b3AJCXsgVU5MSVNURU4g KjsgfQogCisjIFRoaXJkIGxpc3RlbmVyIHNlc3Npb24gZm9yIHRlc3RpbmcgYXJyYXkgZ3Jv d3RoLgorCitzZXNzaW9uIGxpc3RlbmVyMworc3RlcCBsM2xpc3Rlbgl7IExJU1RFTiBjMTsg fQordGVhcmRvd24JCXsgVU5MSVNURU4gKjsgfQorCisjIExpc3RlbmVyIHNlc3Npb24gZm9y IGNyb3NzLXNlc3Npb24gbm90aWZpY2F0aW9uIHRlc3Qgd2l0aCBjaGFubmVsICdjaCcuCisK K3Nlc3Npb24gbGlzdGVuZXJfY2gKK3N0ZXAgbGNoX2xpc3Rlbgl7IExJU1RFTiBjaDsgfQor c3RlcCBsY2hfY2hlY2sJeyBTRUxFQ1QgMSBBUyB4OyB9Cit0ZWFyZG93bgkJeyBVTkxJU1RF TiAqOyB9CisKKyMgTm90aWZpZXIgc2Vzc2lvbiBmb3IgY3Jvc3Mtc2Vzc2lvbiBub3RpZmlj YXRpb24gdGVzdCB3aXRoIGNoYW5uZWwgJ2NoJy4KKworc2Vzc2lvbiBub3RpZmllcl9jaAor c3RlcCBuY2hfbm90aWZ5CXsgTk9USUZZIGNoLCAnYWEnOyB9CisKKyMgU2Vzc2lvbiBmb3Ig dGVzdGluZyBMSVNURU4gaW4gc3VidHJhbnNhY3Rpb24gd2l0aCBzZXBhcmF0ZSBzdGVwcy4K Kworc2Vzc2lvbiBsaXN0ZW5fc3VieGFjdAorc3RlcCBsc2JlZ2luCXsgQkVHSU47IH0KK3N0 ZXAgbHNsaXN0ZW5fb3V0ZXIJeyBMSVNURU4gYzM7IH0KK3N0ZXAgbHNzYXZlcG9pbnQJeyBT QVZFUE9JTlQgczE7IH0KK3N0ZXAgbHNsaXN0ZW4JeyBMSVNURU4gYzE7IExJU1RFTiBjMjsg fQorc3RlcCBsc3JlbGVhc2UJeyBSRUxFQVNFIFNBVkVQT0lOVCBzMTsgfQorc3RlcCBsc3Jv bGxiYWNrCXsgUk9MTEJBQ0sgVE8gU0FWRVBPSU5UIHMxOyB9CitzdGVwIGxzY29tbWl0CXsg Q09NTUlUOyB9CitzdGVwIGxzbm90aWZ5CXsgTk9USUZZIGMxLCAnc3VieGFjdF90ZXN0Jzsg fQorc3RlcCBsc25vdGlmeV9jaGVjawl7IE5PVElGWSBjMSwgJ3Nob3VsZF9ub3RfcmVjZWl2 ZSc7IH0KK3RlYXJkb3duCQl7IFVOTElTVEVOICo7IH0KKwogCiAjIFRyaXZpYWwgY2FzZXMu CiBwZXJtdXRhdGlvbiBsaXN0ZW5jIG5vdGlmeTEgbm90aWZ5MiBub3RpZnkzIG5vdGlmeWYK QEAgLTYwLDYgKzEwNiwyNCBAQCBwZXJtdXRhdGlvbiBsaXN0ZW5jIG5vdGlmeTEgbm90aWZ5 MiBub3RpZnkzIG5vdGlmeWYKICMgQ2hlY2sgc2ltcGxlIGFuZCBsZXNzLXNpbXBsZSBkZWR1 cGxpY2F0aW9uLgogcGVybXV0YXRpb24gbGlzdGVuYyBub3RpZnlkMSBub3RpZnlkMiBub3Rp ZnlzMQogCisjIENoZWNrIHNpbXBsZSBOT1RJRlkgcmVwYXJlbnRpbmcgd2hlbiBwYXJlbnQg aGFzIG5vIGFjdGlvbi4KK3Blcm11dGF0aW9uIGxpc3RlbmMgbm90aWZ5c19zaW1wbGUKKwor IyBDaGVjayBMSVNURU4gcmVwYXJlbnRpbmcgaW4gc3VidHJhbnNhY3Rpb24uCitwZXJtdXRh dGlvbiBsc2JlZ2luIGxzc2F2ZXBvaW50IGxzbGlzdGVuIGxzcmVsZWFzZSBsc2NvbW1pdCBs c25vdGlmeQorCisjIENoZWNrIExJU1RFTiBtZXJnZSBwYXRoIHdoZW4gYm90aCBvdXRlciBh bmQgaW5uZXIgdHJhbnNhY3Rpb25zIGhhdmUgYWN0aW9ucy4KK3Blcm11dGF0aW9uIGxzYmVn aW4gbHNsaXN0ZW5fb3V0ZXIgbHNzYXZlcG9pbnQgbHNsaXN0ZW4gbHNyZWxlYXNlIGxzY29t bWl0IGxzbm90aWZ5CisKKyMgQ2hlY2sgTElTVEVOIGFib3J0IHBhdGggKFJPTExCQUNLIFRP IFNBVkVQT0lOVCBkaXNjYXJkcyBwZW5kaW5nIGFjdGlvbnMpLgorcGVybXV0YXRpb24gbHNi ZWdpbiBsc3NhdmVwb2ludCBsc2xpc3RlbiBsc3JvbGxiYWNrIGxzY29tbWl0IGxzbm90aWZ5 X2NoZWNrCisKKyMgQ2hlY2sgbm90aWZpY2F0aW9uX21hdGNoIGZ1bmN0aW9uICh0cmlnZ2Vy ZWQgYnkgaGFzaCB0YWJsZSBkdXBsaWNhdGUgZGV0ZWN0aW9uKS4KK3Blcm11dGF0aW9uIGxp c3RlbmMgbm90aWZ5X21hbnlfd2l0aF9kdXAKKworIyBDaGVjayBDaGFubmVsSGFzaEFkZExp c3RlbmVyIGFycmF5IGdyb3d0aC4KK3Blcm11dGF0aW9uIGxpc3RlbmMgbGxpc3RlbiBsMmxp c3RlbiBsM2xpc3RlbiBsc2xpc3RlbgorCiAjIENyb3NzLWJhY2tlbmQgbm90aWZpY2F0aW9u IGRlbGl2ZXJ5LiAgV2UgdXNlIGEgInNlbGVjdCAxIiB0byBmb3JjZSB0aGUKICMgbGlzdGVu ZXIgc2Vzc2lvbiB0byBjaGVjayBmb3Igbm90aWZpZXMuICBJbiBwcmluY2lwbGUgd2UgY291 bGQganVzdCB3YWl0CiAjIGZvciBkZWxpdmVyeSwgYnV0IHRoYXQgd291bGQgcmVxdWlyZSBl eHRyYSBzdXBwb3J0IGluIGlzb2xhdGlvbnRlc3RlcgpAQCAtNzMsNiArMTM3LDEwIEBAIHBl cm11dGF0aW9uIGxpc3RlbmMgbGxpc3RlbiBub3RpZnkxIG5vdGlmeTIgbm90aWZ5MyBub3Rp ZnlmIGxjaGVjawogIyBhbmQgbm90aWZ5IHF1ZXVlIGlzIG5vdCBlbXB0eQogcGVybXV0YXRp b24gbDJsaXN0ZW4gbDJiZWdpbiBub3RpZnkxIGxiZWdpbnMgbGxpc3RlbiBsY29tbWl0IGwy Y29tbWl0IGwyc3RvcAogCisjIENoZWNrIHRoYXQgbm90aWZpY2F0aW9ucyBzZW50IGZyb20g YSBiYWNrZW5kIHRoYXQgaGFzIG5vdCBkb25lIExJU1RFTgorIyBhcmUgcHJvcGVybHkgZGVs aXZlcmVkIHRvIGEgbGlzdGVuZXIgaW4gYW5vdGhlciBiYWNrZW5kLgorcGVybXV0YXRpb24g bGNoX2xpc3RlbiBuY2hfbm90aWZ5IGxjaF9jaGVjaworCiAjIFZlcmlmeSB0aGF0IHBnX25v dGlmaWNhdGlvbl9xdWV1ZV91c2FnZSBjb3JyZWN0bHkgcmVwb3J0cyBhIG5vbi16ZXJvIHJl c3VsdCwKICMgYWZ0ZXIgc3VibWl0dGluZyBub3RpZmljYXRpb25zIHdoaWxlIGFub3RoZXIg Y29ubmVjdGlvbiBpcyBsaXN0ZW5pbmcgZm9yCiAjIHRob3NlIG5vdGlmaWNhdGlvbnMgYW5k IHdhaXRpbmcgaW5zaWRlIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbi4gIFdlIGhhdmUgdG8KLS0g CjIuNTAuMQoK --86e7cd31e6424024be1d558339921d90 Content-Disposition: attachment; filename="pg_async_notify_test-v24.c" Content-Type: application/octet-stream; name="pg_async_notify_test-v24.c" Content-Transfer-Encoding: base64 LyoKICogUGxhdGZvcm0gZGV0ZWN0aW9uIGZvciBJL08gbXVsdGlwbGV4aW5nLgogKgogKiBU byBtYW51YWxseSBvdmVycmlkZSwgYWRkIG9uZSBvZiB0aGVzZSBhdCB0aGUgdmVyeSB0b3Ag b2YgdGhpcyBmaWxlOgogKiAgICNkZWZpbmUgVVNFX0tRVUVVRSAgICAocmVxdWlyZXMga3F1 ZXVlIHN1cHBvcnQ6IG1hY09TLCBGcmVlQlNELCBldGMuKQogKiAgICNkZWZpbmUgVVNFX1BQ T0xMICAgICAocmVxdWlyZXMgcHBvbGwgc3VwcG9ydDogTGludXgsIGV0Yy4pCiAqCiAqIE5v dGU6IEVuc3VyZSB0aGUgY2hvc2VuIG1ldGhvZCBpcyBhdmFpbGFibGUgb24geW91ciBwbGF0 Zm9ybSwgb3IgeW91J2xsCiAqIGdldCBjb21waWxhdGlvbiBlcnJvcnMuCiAqLwojaWYgIWRl ZmluZWQoVVNFX0tRVUVVRSkgJiYgIWRlZmluZWQoVVNFX1BQT0xMKQojIGlmIGRlZmluZWQo X19BUFBMRV9fKSB8fCBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJT RF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pCiMgIGRlZmluZSBVU0VfS1FVRVVFCiMgZWxz ZQojICBkZWZpbmUgVVNFX1BQT0xMCiMgZW5kaWYKI2VuZGlmCgojaW5jbHVkZSA8c3RkaW8u aD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxl cnJuby5oPgojaWZkZWYgVVNFX0tRVUVVRQojaW5jbHVkZSA8c3lzL2V2ZW50Lmg+CiNlbmRp ZgojaWZkZWYgVVNFX1BQT0xMCiNpbmNsdWRlIDxwb2xsLmg+CiNlbmRpZgojaW5jbHVkZSA8 c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8dGltZS5oPgoj aW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPGdldG9w dC5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8bWF0aC5oPgoKI2luY2x1ZGUg ImxpYnBxLWZlLmgiCgojZGVmaW5lIFBHX1RJTUVfR0VUX0RPVUJMRSh0KSAoMC4wMDAwMDEg KiAodCkpCiNkZWZpbmUgQ09OTkVDVElPTl9TVFJJTkcgInBvc3RncmVzcWw6Ly8vcG9zdGdy ZXMiCiNkZWZpbmUgTUFYX05PVElGSUVSUyAyNTYgIC8qIE1heGltdW0gbm90aWZpZXJzIHBl ciBjaGFubmVsIGZvciBzZXF1ZW5jZSB0cmFja2luZyAqLwoKLyogTGF0ZW5jeSBoaXN0b2dy YW0gYnVja2V0cyAqLwojZGVmaW5lIE5VTV9CVUNLRVRTIDYKc3RhdGljIHVpbnQ2NF90IGJ1 Y2tldF9jb3VudHNbTlVNX0JVQ0tFVFNdOwpzdGF0aWMgdWludDY0X3QgYnVja2V0X3RvdGFs c1tOVU1fQlVDS0VUU107ICAvKiBUb3RhbCBsYXRlbmN5IGluIG1pY3Jvc2Vjb25kcyAqLwpz dGF0aWMgcHRocmVhZF9tdXRleF90IGhpc3RvZ3JhbV9tdXRleCA9IFBUSFJFQURfTVVURVhf SU5JVElBTElaRVI7CgpzdGF0aWMgdWludDMyX3QgbnVtX25vdGlmaWVzX3NlbnQ7CnN0YXRp YyB1aW50MzJfdCBudW1fbm90aWZpZXNfcmVjZWl2ZWQ7CnN0YXRpYyB2b2xhdGlsZSBpbnQg c3RhcnRfbm90aWZ5aW5nID0gMDsgIC8qIFNpZ25hbCBmb3Igbm90aWZpZXJzIHRvIHN0YXJ0 ICovCgovKiBTeW5jaHJvbml6YXRpb24gZm9yIGxpc3RlbmVyIExJU1RFTiBzZXR1cCAqLwpz dGF0aWMgaW50IGxpc3RlbmVyc19yZWFkeSA9IDA7CnN0YXRpYyBwdGhyZWFkX211dGV4X3Qg c3RhcnR1cF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CnN0YXRpYyBwdGhy ZWFkX2NvbmRfdCBzdGFydHVwX2NvbmQgPSBQVEhSRUFEX0NPTkRfSU5JVElBTElaRVI7Cgov KiAtLWV4dHJhLWNoYW5uZWxzIGFyZ3VtZW50ICovCnN0YXRpYyBpbnQJCQludW1fZXh0cmFf Y2hhbm5lbHMgPSAwOwoKLyogLS1zbGVlcCBhcmd1bWVudCAqLwpzdGF0aWMgZG91YmxlCQlt YXhfc2xlZXBfc2Vjb25kcyA9IDAuMDsKCi8qIC0tc2xlZXAtZXhwIGFyZ3VtZW50ICovCnN0 YXRpYyBkb3VibGUJCXNsZWVwX2V4cG9uZW50aWFsX2ZhY3RvciA9IDEuMDsKCi8qIC0tYmF0 Y2ggYXJndW1lbnQgKi8Kc3RhdGljIGludAkJCWJhdGNoX3NpemUgPSAxOwoKLyogLS1kdXJh dGlvbiBhcmd1bWVudCBhbmQgc2h1dGRvd24gZmxhZyAqLwpzdGF0aWMgZG91YmxlCQlkdXJh dGlvbl9zZWNvbmRzID0gMC4wOwpzdGF0aWMgdm9sYXRpbGUgaW50CXNodXRkb3duX3JlcXVl c3RlZCA9IDA7CgovKiBwZ19nZXRfYXN5bmNfd2FrZXVwX3N0YXRzIGF2YWlsYWJpbGl0eSBh bmQgZGF0YSAqLwpzdGF0aWMgaW50IGhhc19hc3luY193YWtldXBfc3RhdHMgPSAwOyAgLyog RGV0ZWN0ZWQgZnVuY3Rpb24gYXZhaWxhYmlsaXR5ICovCnN0YXRpYyB1aW50NjRfdCBhc3lu Y193YWtldXBfc3RhdHNbMTNdID0gezB9OyAgLyogTGF0ZXN0IHN0YXRzIHNuYXBzaG90ICov CnN0YXRpYyBwdGhyZWFkX211dGV4X3Qgd2FrZXVwX3N0YXRzX211dGV4ID0gUFRIUkVBRF9N VVRFWF9JTklUSUFMSVpFUjsKCi8qIFRocmVhZCBhcmd1bWVudHMgc3RydWN0dXJlICovCnN0 cnVjdCB0aHJlYWRfYXJncyB7CglpbnQgY2hhbm5lbF9pZDsKCWludCBub3RpZmllcl9pZDsg IC8qIElEIG9mIG5vdGlmaWVyIHdpdGhpbiBjaGFubmVsICgwIHRvIG51bV9ub3RpZnlfdGhy ZWFkcy0xKSAqLwoJaW50IG51bV9ub3RpZmllcnM7ICAvKiBUb3RhbCBudW1iZXIgb2Ygbm90 aWZpZXJzIHBlciBjaGFubmVsICovCglpbnQgdG90YWxfbGlzdGVuZXJzOyAgLyogVG90YWwg bnVtYmVyIG9mIGxpc3RlbmVyIHRocmVhZHMgKGFsbCBjaGFubmVscykgKi8KCXVpbnQ2NF90 ICpzZXFfY291bnRlcjsgIC8qIFBvaW50ZXIgdG8gdGhpcyBub3RpZmllcidzIHNlcXVlbmNl IGNvdW50ZXIgKi8KfTsKCnR5cGVkZWYgaW50NjRfdCBwZ190aW1lX3VzZWNfdDsKCnN0YXRp YyBpbmxpbmUgcGdfdGltZV91c2VjX3QKcGdfdGltZV9ub3codm9pZCkKewoJc3RydWN0IHRp bWV2YWwgdHY7CgoJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CgoJcmV0dXJuIChwZ190aW1l X3VzZWNfdCkgKHR2LnR2X3NlYyAqIDEwMDAwMDAgKyB0di50dl91c2VjKTsKfQoKc3RhdGlj IHZvaWQKZXhpdF9uaWNlbHkoUEdjb25uICpjb25uKQp7CglQUWZpbmlzaChjb25uKTsKCWV4 aXQoMSk7Cn0KCnN0YXRpYyBpbnQKZ2V0X2xhdGVuY3lfYnVja2V0KGRvdWJsZSBsYXRlbmN5 X21zKQp7CgkvKiBCdWNrZXRzOiAwLTAuMDFtcywgMC4wMS0wLjFtcywgMC4xLTFtcywgMS0x MG1zLCAxMC0xMDBtcywgPjEwMG1zICovCglpZiAobGF0ZW5jeV9tcyA8IDAuMDEpCgkJcmV0 dXJuIDA7CgllbHNlIGlmIChsYXRlbmN5X21zIDwgMC4xKQoJCXJldHVybiAxOwoJZWxzZSBp ZiAobGF0ZW5jeV9tcyA8IDEuMCkKCQlyZXR1cm4gMjsKCWVsc2UgaWYgKGxhdGVuY3lfbXMg PCAxMC4wKQoJCXJldHVybiAzOwoJZWxzZSBpZiAobGF0ZW5jeV9tcyA8IDEwMC4wKQoJCXJl dHVybiA0OwoJZWxzZQoJCXJldHVybiA1Owp9CgpzdGF0aWMgdm9pZAp1cGRhdGVfaGlzdG9n cmFtKHVpbnQ2NF90IGxhdGVuY3lfdXNlYykKewoJZG91YmxlIGxhdGVuY3lfbXMgPSBsYXRl bmN5X3VzZWMgLyAxMDAwLjA7CglpbnQgYnVja2V0ID0gZ2V0X2xhdGVuY3lfYnVja2V0KGxh dGVuY3lfbXMpOwoKCXB0aHJlYWRfbXV0ZXhfbG9jaygmaGlzdG9ncmFtX211dGV4KTsKCWJ1 Y2tldF9jb3VudHNbYnVja2V0XSsrOwoJYnVja2V0X3RvdGFsc1tidWNrZXRdICs9IGxhdGVu Y3lfdXNlYzsKCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZoaXN0b2dyYW1fbXV0ZXgpOwp9Cgpz dGF0aWMgaW50CmNoZWNrX2FzeW5jX3dha2V1cF9zdGF0c19hdmFpbGFibGUodm9pZCkKewoJ UEdjb25uICpjb25uOwoJUEdyZXN1bHQgKnJlczsKCWludCBhdmFpbGFibGUgPSAwOwoKCS8q IE1ha2UgYSB0ZW1wb3JhcnkgY29ubmVjdGlvbiB0byBjaGVjayBmdW5jdGlvbiBhdmFpbGFi aWxpdHkgKi8KCWNvbm4gPSBQUWNvbm5lY3RkYihDT05ORUNUSU9OX1NUUklORyk7CgoJaWYg KFBRc3RhdHVzKGNvbm4pICE9IENPTk5FQ1RJT05fT0spCgl7CgkJZnByaW50ZihzdGRlcnIs ICIlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKCQlleGl0X25pY2VseShjb25uKTsKCX0K CgkvKiBRdWVyeSBwZ19wcm9jIHRvIHNlZSBpZiB0aGUgZnVuY3Rpb24gZXhpc3RzIGluIHBn X2NhdGFsb2cgKi8KCXJlcyA9IFBRZXhlYyhjb25uLAoJCQkJICJTRUxFQ1QgMSBGUk9NIHBn X3Byb2MgcCAiCgkJCQkgIkpPSU4gcGdfbmFtZXNwYWNlIG4gT04gcC5wcm9uYW1lc3BhY2Ug PSBuLm9pZCAiCgkJCQkgIldIRVJFIHAucHJvbmFtZSA9ICdwZ19nZXRfYXN5bmNfd2FrZXVw X3N0YXRzJyAiCgkJCQkgIkFORCBuLm5zcG5hbWUgPSAncGdfY2F0YWxvZyciKTsKCglpZiAo UFFyZXN1bHRTdGF0dXMocmVzKSA9PSBQR1JFU19UVVBMRVNfT0sgJiYgUFFudHVwbGVzKHJl cykgPiAwKQoJCWF2YWlsYWJsZSA9IDE7CgoJUFFjbGVhcihyZXMpOwoJUFFmaW5pc2goY29u bik7CgoJcmV0dXJuIGF2YWlsYWJsZTsKfQoKc3RhdGljIHZvaWQKZmV0Y2hfYXN5bmNfd2Fr ZXVwX3N0YXRzKHZvaWQpCnsKCVBHY29ubiAqY29ubjsKCVBHcmVzdWx0ICpyZXM7CgoJaWYg KCFoYXNfYXN5bmNfd2FrZXVwX3N0YXRzKQoJCXJldHVybjsKCgljb25uID0gUFFjb25uZWN0 ZGIoQ09OTkVDVElPTl9TVFJJTkcpOwoKCWlmIChQUXN0YXR1cyhjb25uKSAhPSBDT05ORUNU SU9OX09LKQoJewoJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBQUWVycm9yTWVzc2FnZShjb25u KSk7CgkJZXhpdF9uaWNlbHkoY29ubik7Cgl9CgoJcmVzID0gUFFleGVjKGNvbm4sCgkJCQkg IlNFTEVDVCBzaWduYWxlZF90YXJnZXRlZCwgYWR2YW5jaW5nX2JlaGluZCwgYWR2YW5jaW5n X2FoZWFkLCAiCgkJCQkgImlkbGVfYmVoaW5kLCBhdm9pZGVkX3dha2V1cHMsIGFscmVhZHlf YWhlYWQsICIKCQkJCSAibmVjZXNzYXJ5X3dha2V1cHMsIHVubmVjZXNzYXJ5X3dha2V1cHMg IgoJCQkJICJGUk9NIHBnX2NhdGFsb2cucGdfZ2V0X2FzeW5jX3dha2V1cF9zdGF0cygpIik7 CgoJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgPT0gUEdSRVNfVFVQTEVTX09LICYmIFBRbnR1 cGxlcyhyZXMpID4gMCkKCXsKCQlwdGhyZWFkX211dGV4X2xvY2soJndha2V1cF9zdGF0c19t dXRleCk7CgkJZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspCgkJewoJCQlhc3luY193YWtl dXBfc3RhdHNbaV0gPSBzdHJ0b3VsbChQUWdldHZhbHVlKHJlcywgMCwgaSksIE5VTEwsIDEw KTsKCQl9CgkJcHRocmVhZF9tdXRleF91bmxvY2soJndha2V1cF9zdGF0c19tdXRleCk7Cgl9 CgoJUFFjbGVhcihyZXMpOwoJUFFmaW5pc2goY29ubik7Cn0KCnN0YXRpYyB2b2lkCnJlc2V0 X2FzeW5jX3dha2V1cF9zdGF0cyh2b2lkKQp7CglQR2Nvbm4gKmNvbm47CglQR3Jlc3VsdCAq cmVzOwoKCWNvbm4gPSBQUWNvbm5lY3RkYihDT05ORUNUSU9OX1NUUklORyk7CgoJaWYgKFBR c3RhdHVzKGNvbm4pICE9IENPTk5FQ1RJT05fT0spCgl7CgkJZnByaW50ZihzdGRlcnIsICIl cyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKCQlleGl0X25pY2VseShjb25uKTsKCX0KCgly ZXMgPSBQUWV4ZWMoY29ubiwgIlNFTEVDVCBwZ19jYXRhbG9nLnBnX3Jlc2V0X2FzeW5jX3dh a2V1cF9zdGF0cygpIik7CgoJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfVFVQ TEVTX09LKQoJewoJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJlc2V0IGFzeW5jIHdh a2V1cCBzdGF0czogJXMiLAoJCQkJUFFlcnJvck1lc3NhZ2UoY29ubikpOwoJfQoKCVBRY2xl YXIocmVzKTsKCVBRZmluaXNoKGNvbm4pOwp9CgpzdGF0aWMgdm9pZCAqCm5vdGlmeV90aHJl YWRfbWFpbih2b2lkICphcmcpCnsKCXN0cnVjdCB0aHJlYWRfYXJncyAqYXJncyA9IChzdHJ1 Y3QgdGhyZWFkX2FyZ3MgKilhcmc7CglpbnQgY2hhbm5lbF9pZCA9IGFyZ3MtPmNoYW5uZWxf aWQ7CglpbnQgbm90aWZpZXJfaWQgPSBhcmdzLT5ub3RpZmllcl9pZDsKCXVpbnQ2NF90ICpz ZXFfY291bnRlciA9IGFyZ3MtPnNlcV9jb3VudGVyOwoJUEdjb25uCSAgICpjb25uOwoJUEdy ZXN1bHQgICAqcmVzOwoJY2hhcgkJY2hhbm5lbF9uYW1lWzMyXTsKCgkvKiBHZW5lcmF0ZSBj aGFubmVsIG5hbWUgZnJvbSBjaGFubmVsX2lkICovCglzbnByaW50ZihjaGFubmVsX25hbWUs IHNpemVvZihjaGFubmVsX25hbWUpLCAiJWQiLCBjaGFubmVsX2lkKTsKCgkvKiBNYWtlIGEg Y29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UgKi8KCWNvbm4gPSBQUWNvbm5lY3RkYihDT05O RUNUSU9OX1NUUklORyk7CgoJLyogQ2hlY2sgdG8gc2VlIHRoYXQgdGhlIGJhY2tlbmQgY29u bmVjdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IG1hZGUgKi8KCWlmIChQUXN0YXR1cyhjb25uKSAh PSBDT05ORUNUSU9OX09LKQoJewoJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBQUWVycm9yTWVz c2FnZShjb25uKSk7CgkJZXhpdF9uaWNlbHkoY29ubik7Cgl9CgoJLyogV2FpdCBmb3Igc2ln bmFsIHRvIHN0YXJ0IG5vdGlmeWluZyAqLwoJd2hpbGUgKCFzdGFydF9ub3RpZnlpbmcpCgkJ dXNsZWVwKDEwMDAwKTsgIC8qIFNsZWVwIDEwbXMgKi8KCgl3aGlsZSAoIXNodXRkb3duX3Jl cXVlc3RlZCkKCXsKCQkvKiBTbGVlcCByYW5kb20gYW1vdW50IGlmIC0tc2xlZXAgd2FzIHNw ZWNpZmllZCAqLwoJCWlmIChtYXhfc2xlZXBfc2Vjb25kcyA+IDAuMCkKCQl7CgkJCS8qIENh bGN1bGF0ZSBwZXItY2hhbm5lbCBtYXggc2xlZXAgdXNpbmcgZXhwb25lbnRpYWwgZmFjdG9y ICovCgkJCWRvdWJsZSBwZXJfY2hhbm5lbF9tYXggPSBtYXhfc2xlZXBfc2Vjb25kcyAqIHBv dyhzbGVlcF9leHBvbmVudGlhbF9mYWN0b3IsIGNoYW5uZWxfaWQpOwoKCQkJZG91YmxlIHJh bmRvbV9zbGVlcCA9ICgoZG91YmxlKXJhbmQoKSAvIFJBTkRfTUFYKSAqIHBlcl9jaGFubmVs X21heDsKCQkJc3RydWN0IHRpbWVzcGVjIHRzOwoJCQl0cy50dl9zZWMgPSAodGltZV90KXJh bmRvbV9zbGVlcDsKCQkJdHMudHZfbnNlYyA9IChsb25nKSgocmFuZG9tX3NsZWVwIC0gdHMu dHZfc2VjKSAqIDEwMDAwMDAwMDAuMCk7CgoJCQlpZiAobmFub3NsZWVwKCZ0cywgTlVMTCkg PT0gLTEpCgkJCXsKCQkJCWZwcmludGYoc3RkZXJyLCAiQ2hhbm5lbCAlZCBub3RpZmllciAl ZDogbmFub3NsZWVwIGZhaWxlZDogIiwKCQkJCQkJY2hhbm5lbF9pZCwgbm90aWZpZXJfaWQp OwoJCQkJc3dpdGNoIChlcnJubykKCQkJCXsKCQkJCQljYXNlIEVJTlZBTDoKCQkJCQkJZnBy aW50ZihzdGRlcnIsICJFSU5WQUwgLSBpbnZhbGlkIHRpbWVzcGVjICh0dl9zZWM9JWxkLCB0 dl9uc2VjPSVsZClcbiIsCgkJCQkJCQkJKGxvbmcpdHMudHZfc2VjLCB0cy50dl9uc2VjKTsK CQkJCQkJZnByaW50ZihzdGRlcnIsICIgIHJhbmRvbV9zbGVlcCB2YWx1ZSB3YXM6ICUuNmYg c2Vjb25kc1xuIiwgcmFuZG9tX3NsZWVwKTsKCQkJCQkJZnByaW50ZihzdGRlcnIsICIgIFRo aXMgbGlrZWx5IGluZGljYXRlcyBvdmVyZmxvdyBpbiBzbGVlcCBjYWxjdWxhdGlvbi5cbiIp OwoJCQkJCQlicmVhazsKCQkJCQljYXNlIEVJTlRSOgoJCQkJCQlmcHJpbnRmKHN0ZGVyciwg IkVJTlRSIC0gaW50ZXJydXB0ZWQgYnkgc2lnbmFsXG4iKTsKCQkJCQkJYnJlYWs7CgkJCQkJ Y2FzZSBFRkFVTFQ6CgkJCQkJCWZwcmludGYoc3RkZXJyLCAiRUZBVUxUIC0gcHJvYmxlbSBj b3B5aW5nIGZyb20gdXNlciBzcGFjZVxuIik7CgkJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6 CgkJCQkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBlcnJvciAoZXJybm89JWQpXG4iLCBl cnJubyk7CgkJCQkJCWJyZWFrOwoJCQkJfQoJCQkJZXhpdF9uaWNlbHkoY29ubik7CgkJCX0K CQl9CgoJCS8qIFN0YXJ0IHRyYW5zYWN0aW9uIGlmIGJhdGNoaW5nICovCgkJaWYgKGJhdGNo X3NpemUgPiAxKQoJCXsKCQkJcmVzID0gUFFleGVjKGNvbm4sICJCRUdJTiIpOwoJCQlpZiAo UFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQoJCQl7CgkJCQlmcHJp bnRmKHN0ZGVyciwgIkJFR0lOIGNvbW1hbmQgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdl KGNvbm4pKTsKCQkJCVBRY2xlYXIocmVzKTsKCQkJCWV4aXRfbmljZWx5KGNvbm4pOwoJCQl9 CgkJCVBRY2xlYXIocmVzKTsKCQl9CgoJCS8qIFNlbmQgYmF0Y2hfc2l6ZSBub3RpZmljYXRp b25zICovCgkJZm9yIChpbnQgaSA9IDA7IGkgPCBiYXRjaF9zaXplOyBpKyspCgkJewoJCQlj aGFyIGJ1ZlsxMjhdOwoJCQlwZ190aW1lX3VzZWNfdCBzZW5kX3RpbWU7CgkJCXVpbnQ2NF90 IHNlcTsKCgkJCS8qIEdldCB0aW1lc3RhbXAgYmVmb3JlIHNlbmRpbmcgKi8KCQkJc2VuZF90 aW1lID0gcGdfdGltZV9ub3coKTsKCgkJCS8qIEF0b21pY2FsbHkgZ2V0IGFuZCBpbmNyZW1l bnQgdGhpcyBub3RpZmllcidzIHNlcXVlbmNlIGNvdW50ZXIgKi8KCQkJc2VxID0gX19zeW5j X2ZldGNoX2FuZF9hZGQoc2VxX2NvdW50ZXIsIDEpOwoKCQkJLyogU2VuZCBub3RpZmljYXRp b24gd2l0aCBub3RpZmllcl9pZCwgc2VxdWVuY2UgbnVtYmVyLCBhbmQgdGltZXN0YW1wICov CgkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJOT1RJRlkgXCIlc1wiLCAnJWQgJWxs ZCAlbGxkJyIsCgkJCQkJIGNoYW5uZWxfbmFtZSwgbm90aWZpZXJfaWQsIChsb25nIGxvbmcp c2VxLCAobG9uZyBsb25nKXNlbmRfdGltZSk7CgkJCXJlcyA9IFBRZXhlYyhjb25uLCBidWYp OwoJCQlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQoJCQl7 CgkJCQlmcHJpbnRmKHN0ZGVyciwgIk5PVElGWSBjb21tYW5kIGZhaWxlZDogJXMiLCBQUWVy cm9yTWVzc2FnZShjb25uKSk7CgkJCQlQUWNsZWFyKHJlcyk7CgkJCQlleGl0X25pY2VseShj b25uKTsKCQkJfQoJCQlQUWNsZWFyKHJlcyk7CgoJCQlfX3N5bmNfZmV0Y2hfYW5kX2FkZCgm bnVtX25vdGlmaWVzX3NlbnQsIDEpOwoJCX0KCgkJLyogQ29tbWl0IHRyYW5zYWN0aW9uIGlm IGJhdGNoaW5nICovCgkJaWYgKGJhdGNoX3NpemUgPiAxKQoJCXsKCQkJcmVzID0gUFFleGVj KGNvbm4sICJDT01NSVQiKTsKCQkJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNf Q09NTUFORF9PSykKCQkJewoJCQkJZnByaW50ZihzdGRlcnIsICJDT01NSVQgY29tbWFuZCBm YWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOwoJCQkJUFFjbGVhcihyZXMpOwoJ CQkJZXhpdF9uaWNlbHkoY29ubik7CgkJCX0KCQkJUFFjbGVhcihyZXMpOwoJCX0KCX0KCgly ZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQgKgpsaXN0ZW5fdGhyZWFkX21haW4odm9pZCAq YXJnKQp7CglzdHJ1Y3QgdGhyZWFkX2FyZ3MgKmFyZ3MgPSAoc3RydWN0IHRocmVhZF9hcmdz ICopYXJnOwoJaW50IGNoYW5uZWxfaWQgPSBhcmdzLT5jaGFubmVsX2lkOwoJaW50IG51bV9u b3RpZmllcnMgPSBhcmdzLT5udW1fbm90aWZpZXJzOwoJUEdjb25uCSAgICpjb25uOwoJUEdy ZXN1bHQgICAqcmVzOwoJUEdub3RpZnkgICAqbm90aWZ5OwoJdWludDY0X3QJZXhwZWN0ZWRf c2VxW01BWF9OT1RJRklFUlNdOwoJY2hhcgkJY2hhbm5lbF9uYW1lWzMyXTsKCWNoYXIJCWxp c3Rlbl9jbWRbNjRdOwoKCS8qIEluaXRpYWxpemUgZXhwZWN0ZWQgc2VxdWVuY2UgZm9yIGVh Y2ggbm90aWZpZXIgKi8KCWZvciAoaW50IGkgPSAwOyBpIDwgTUFYX05PVElGSUVSUzsgaSsr KQoJCWV4cGVjdGVkX3NlcVtpXSA9IDA7CgoJLyogR2VuZXJhdGUgY2hhbm5lbCBuYW1lIGZy b20gY2hhbm5lbF9pZCAqLwoJc25wcmludGYoY2hhbm5lbF9uYW1lLCBzaXplb2YoY2hhbm5l bF9uYW1lKSwgIiVkIiwgY2hhbm5lbF9pZCk7CgoJLyogTWFrZSBhIGNvbm5lY3Rpb24gdG8g dGhlIGRhdGFiYXNlICovCgljb25uID0gUFFjb25uZWN0ZGIoQ09OTkVDVElPTl9TVFJJTkcp OwoKCS8qIENoZWNrIHRvIHNlZSB0aGF0IHRoZSBiYWNrZW5kIGNvbm5lY3Rpb24gd2FzIHN1 Y2Nlc3NmdWxseSBtYWRlICovCglpZiAoUFFzdGF0dXMoY29ubikgIT0gQ09OTkVDVElPTl9P SykKCXsKCQlmcHJpbnRmKHN0ZGVyciwgIiVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOwoJ CWV4aXRfbmljZWx5KGNvbm4pOwoJfQoKCgkvKgoJICogSXNzdWUgTElTVEVOIGNvbW1hbmQg Zm9yICJleHRyYSIgY2hhbm5lbHMuIFRoZSBleHRyYSBjaGFubmVscyBhcmUgbmV2ZXIKCSAq IG5vdGlmaWVkLCB0aGV5J3JlIHVzZWQganVzdCB0byBibG9hdCB0aGUgbGlzdCBvZiBjaGFu bmVscyB0aGF0IG5vdGlmeQoJICogcHJvY2Vzc2luZyBuZWVkcyB0byB0cmF2ZXJzZS4KCSAq LwoJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZXh0cmFfY2hhbm5lbHM7IGkrKykKCXsKCQlz bnByaW50ZihsaXN0ZW5fY21kLCBzaXplb2YobGlzdGVuX2NtZCksICJMSVNURU4gXCJleHRy YSVkXCIiLCBpKTsKCQlyZXMgPSBQUWV4ZWMoY29ubiwgbGlzdGVuX2NtZCk7CgkJaWYgKFBR cmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfQ09NTUFORF9PSykKCQl7CgkJCWZwcmludGYo c3RkZXJyLCAiTElTVEVOIGNvbW1hbmQgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNv bm4pKTsKCQkJUFFjbGVhcihyZXMpOwoJCQlleGl0X25pY2VseShjb25uKTsKCQl9CgkJUFFj bGVhcihyZXMpOwoJfQoKCS8qCgkgKiBJc3N1ZSBMSVNURU4gY29tbWFuZCB0byBlbmFibGUg bm90aWZpY2F0aW9ucyBmcm9tIHRoZSBydWxlJ3MgTk9USUZZLgoJICovCglzbnByaW50Zihs aXN0ZW5fY21kLCBzaXplb2YobGlzdGVuX2NtZCksICJMSVNURU4gXCIlc1wiIiwgY2hhbm5l bF9uYW1lKTsKCXJlcyA9IFBRZXhlYyhjb25uLCBsaXN0ZW5fY21kKTsKCWlmIChQUXJlc3Vs dFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRfT0spCgl7CgkJZnByaW50ZihzdGRlcnIs ICJMSVNURU4gY29tbWFuZCBmYWlsZWQ6ICVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOwoJ CVBRY2xlYXIocmVzKTsKCQlleGl0X25pY2VseShjb25uKTsKCX0KCVBRY2xlYXIocmVzKTsK CgkvKiBTaWduYWwgdGhhdCB0aGlzIGxpc3RlbmVyIGlzIHJlYWR5ICovCglwdGhyZWFkX211 dGV4X2xvY2soJnN0YXJ0dXBfbXV0ZXgpOwoJbGlzdGVuZXJzX3JlYWR5Kys7CglpZiAobGlz dGVuZXJzX3JlYWR5ID09IGFyZ3MtPnRvdGFsX2xpc3RlbmVycykKCQlwdGhyZWFkX2NvbmRf c2lnbmFsKCZzdGFydHVwX2NvbmQpOyAgLyogV2FrZSBtYWluIHRocmVhZCBpZiB3ZSdyZSB0 aGUgbGFzdCAqLwoJcHRocmVhZF9tdXRleF91bmxvY2soJnN0YXJ0dXBfbXV0ZXgpOwoKCXdo aWxlICghc2h1dGRvd25fcmVxdWVzdGVkKQoJewoJCS8qCgkJICogU2xlZXAgdW50aWwgc29t ZXRoaW5nIGhhcHBlbnMgb24gdGhlIGNvbm5lY3Rpb24uICBXZSB1c2Uga3F1ZXVlKDIpCgkJ ICogb24gbWFjT1MvQlNEIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIHNjYWxhYmlsaXR5 LCBvciBwcG9sbCgyKSBvbgoJCSAqIG90aGVyIHBsYXRmb3Jtcy4gQm90aCBhdm9pZCB0aGUg RkRfU0VUU0laRSBsaW1pdGF0aW9uIG9mIHNlbGVjdCgpLgoJCSAqLwoJCWludAkJCXNvY2s7 CgoJCXNvY2sgPSBQUXNvY2tldChjb25uKTsKCgkJaWYgKHNvY2sgPCAwKQoJCQlicmVhazsJ CQkJLyogc2hvdWxkbid0IGhhcHBlbiAqLwoKI2lmZGVmIFVTRV9LUVVFVUUKCQkvKiBVc2Ug a3F1ZXVlIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIHNjYWxhYmlsaXR5ICovCgkJaW50 IGtxOwoJCXN0cnVjdCBrZXZlbnQga2V2OwoJCXN0cnVjdCBrZXZlbnQgZXZlbnQ7CgoJCWtx ID0ga3F1ZXVlKCk7CgkJaWYgKGtxIDwgMCkKCQl7CgkJCWZwcmludGYoc3RkZXJyLCAia3F1 ZXVlKCkgZmFpbGVkOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKCQkJZXhpdF9uaWNlbHko Y29ubik7CgkJfQoKCQkvKiBNb25pdG9yIHRoZSBzb2NrZXQgZm9yIHJlYWQgZXZlbnRzICov CgkJRVZfU0VUKCZrZXYsIHNvY2ssIEVWRklMVF9SRUFELCBFVl9BREQgfCBFVl9PTkVTSE9U LCAwLCAwLCBOVUxMKTsKCgkJLyogV2FpdCB3aXRoIHRpbWVvdXQgdG8gYWxsb3cgcGVyaW9k aWMgc2h1dGRvd24gY2hlY2tzICovCgkJc3RydWN0IHRpbWVzcGVjIHRpbWVvdXQ7CgkJdGlt ZW91dC50dl9zZWMgPSAwOwoJCXRpbWVvdXQudHZfbnNlYyA9IDEwMDAwMDAwMDsgIC8qIDEw MG1zICovCgoJCWludCByZXQgPSBrZXZlbnQoa3EsICZrZXYsIDEsICZldmVudCwgMSwgJnRp bWVvdXQpOwoJCWlmIChyZXQgPCAwKQoJCXsKCQkJZnByaW50ZihzdGRlcnIsICJrZXZlbnQo KSBmYWlsZWQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwoJCQljbG9zZShrcSk7CgkJCWV4 aXRfbmljZWx5KGNvbm4pOwoJCX0KCgkJY2xvc2Uoa3EpOwoKCQkvKiBJZiB0aW1lb3V0IG9y IHNodXRkb3duIHJlcXVlc3RlZCwgY29udGludWUgdG8gY2hlY2sgKi8KCQlpZiAocmV0ID09 IDAgfHwgc2h1dGRvd25fcmVxdWVzdGVkKQoJCQljb250aW51ZTsKI2VsaWYgZGVmaW5lZChV U0VfUFBPTEwpCgkJLyogVXNlIHBwb2xsIChuYW5vc2Vjb25kIHJlc29sdXRpb24pICovCgkJ c3RydWN0IHBvbGxmZCBwZmQ7CgoJCXBmZC5mZCA9IHNvY2s7CgkJcGZkLmV2ZW50cyA9IFBP TExJTjsKCQlwZmQucmV2ZW50cyA9IDA7CgoJCS8qIFdhaXQgd2l0aCB0aW1lb3V0IHRvIGFs bG93IHBlcmlvZGljIHNodXRkb3duIGNoZWNrcyAqLwoJCXN0cnVjdCB0aW1lc3BlYyB0aW1l b3V0OwoJCXRpbWVvdXQudHZfc2VjID0gMDsKCQl0aW1lb3V0LnR2X25zZWMgPSAxMDAwMDAw MDA7ICAvKiAxMDBtcyAqLwoKCQlpbnQgcmV0ID0gcHBvbGwoJnBmZCwgMSwgJnRpbWVvdXQs IE5VTEwpOwoJCWlmIChyZXQgPCAwKQoJCXsKCQkJZnByaW50ZihzdGRlcnIsICJwcG9sbCgp IGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CgkJCWV4aXRfbmljZWx5KGNvbm4p OwoJCX0KCgkJLyogSWYgdGltZW91dCBvciBzaHV0ZG93biByZXF1ZXN0ZWQsIGNvbnRpbnVl IHRvIGNoZWNrICovCgkJaWYgKHJldCA9PSAwIHx8IHNodXRkb3duX3JlcXVlc3RlZCkKCQkJ Y29udGludWU7CiNlbHNlCiMgZXJyb3IgIk5vIEkvTyBtdWx0aXBsZXhpbmcgbWV0aG9kIGRl ZmluZWQuIERlZmluZSBVU0VfS1FVRVVFIG9yIFVTRV9QUE9MTC4iCiNlbmRpZgoKCQkvKiBO b3cgY2hlY2sgZm9yIGlucHV0ICovCgkJUFFjb25zdW1lSW5wdXQoY29ubik7CgkJd2hpbGUg KChub3RpZnkgPSBQUW5vdGlmaWVzKGNvbm4pKSAhPSBOVUxMKQoJCXsKCQkJcGdfdGltZV91 c2VjX3QgcmVjdl90aW1lOwoJCQlwZ190aW1lX3VzZWNfdCBzZW5kX3RpbWU7CgkJCWludCBu b3RpZmllcl9pZDsKCQkJdWludDY0X3Qgc2VxOwoJCQl1aW50NjRfdCBsYXRlbmN5X3VzZWM7 CgoJCQkvKiBHZXQgcmVjZWl2ZSB0aW1lc3RhbXAgKi8KCQkJcmVjdl90aW1lID0gcGdfdGlt ZV9ub3coKTsKCgkJCS8qIFBhcnNlIG5vdGlmaWVyX2lkLCBzZXF1ZW5jZSBudW1iZXIsIGFu ZCBzZW5kIHRpbWVzdGFtcCBmcm9tIHBheWxvYWQgKi8KCQkJaWYgKG5vdGlmeS0+ZXh0cmEg JiYgbm90aWZ5LT5leHRyYVswXSkKCQkJewoJCQkJaWYgKHNzY2FuZihub3RpZnktPmV4dHJh LCAiJWQgJWxsZCAlbGxkIiwgJm5vdGlmaWVyX2lkLCAobG9uZyBsb25nICopJnNlcSwgKGxv bmcgbG9uZyAqKSZzZW5kX3RpbWUpID09IDMpCgkJCQl7CgkJCQkJLyogVmFsaWRhdGUgbm90 aWZpZXJfaWQgKi8KCQkJCQlpZiAobm90aWZpZXJfaWQgPCAwIHx8IG5vdGlmaWVyX2lkID49 IG51bV9ub3RpZmllcnMpCgkJCQkJewoJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRVJST1I6 IENoYW5uZWwgJWQgcmVjZWl2ZWQgaW52YWxpZCBub3RpZmllcl9pZCAlZCAoZXhwZWN0ZWQg MC0lZClcbiIsCgkJCQkJCQkJY2hhbm5lbF9pZCwgbm90aWZpZXJfaWQsIG51bV9ub3RpZmll cnMgLSAxKTsKCQkJCQkJYWJvcnQoKTsKCQkJCQl9CgoJCQkJCS8qIFZlcmlmeSBzZXF1ZW5j ZSBudW1iZXIgZm9yIHRoaXMgbm90aWZpZXIgKi8KCQkJCQlpZiAoc2VxICE9IGV4cGVjdGVk X3NlcVtub3RpZmllcl9pZF0pCgkJCQkJewoJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRVJS T1I6IENoYW5uZWwgJWQgbm90aWZpZXIgJWQgc2VxdWVuY2UgZ2FwISBFeHBlY3RlZCAlbGxk LCByZWNlaXZlZCAlbGxkXG4iLAoJCQkJCQkJCWNoYW5uZWxfaWQsIG5vdGlmaWVyX2lkLCAo bG9uZyBsb25nKWV4cGVjdGVkX3NlcVtub3RpZmllcl9pZF0sIChsb25nIGxvbmcpc2VxKTsK CQkJCQkJYWJvcnQoKTsKCQkJCQl9CgkJCQkJZXhwZWN0ZWRfc2VxW25vdGlmaWVyX2lkXSsr OwoKCQkJCQlsYXRlbmN5X3VzZWMgPSByZWN2X3RpbWUgLSBzZW5kX3RpbWU7CgoJCQkJCS8q IFVwZGF0ZSBoaXN0b2dyYW0gKi8KCQkJCQl1cGRhdGVfaGlzdG9ncmFtKGxhdGVuY3lfdXNl Yyk7CgkJCQl9CgkJCX0KCgkJCVBRZnJlZW1lbShub3RpZnkpOwoJCQlQUWNvbnN1bWVJbnB1 dChjb25uKTsKCgkJCV9fc3luY19mZXRjaF9hbmRfYWRkKCZudW1fbm90aWZpZXNfcmVjZWl2 ZWQsIDEpOwoJCX0KCX0KCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIHZvaWQKcHJpbnRfdXNh Z2UoY29uc3QgY2hhciAqcHJvZ25hbWUpCnsKCXByaW50ZigiVXNhZ2U6ICVzIFtPUFRJT05T XVxuXG4iLCBwcm9nbmFtZSk7CglwcmludGYoIlBvc3RncmVTUUwgQXN5bmMgTm90aWZ5IFBl cmZvcm1hbmNlIFRlc3RcblxuIik7CglwcmludGYoIlRlc3RzIFBvc3RncmVTUUwgTElTVEVO L05PVElGWSBwZXJmb3JtYW5jZSB3aXRoIGNvbmZpZ3VyYWJsZSB0aHJlYWRzIGFuZCBjaGFu bmVscy5cbiIpOwoJcHJpbnRmKCJDb25uZWN0cyB0bzogJXNcblxuIiwgQ09OTkVDVElPTl9T VFJJTkcpOwoJcHJpbnRmKCJPcHRpb25zOlxuIik7CglwcmludGYoIiAgLS1saXN0ZW5lcnMg VEhSRUFEUyAgICAgICBOdW1iZXIgb2YgbGlzdGVuZXIgdGhyZWFkcyBwZXIgY2hhbm5lbFxu Iik7CglwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAxLCBt aW5pbXVtOiAxKVxuXG4iKTsKCXByaW50ZigiICAtLW5vdGlmaWVycyBUSFJFQURTICAgICAg IE51bWJlciBvZiBub3RpZmllciB0aHJlYWRzIHBlciBjaGFubmVsXG4iKTsKCXByaW50Zigi ICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IDEsIG1pbmltdW06IDEpXG5c biIpOwoJcHJpbnRmKCIgIC0tY2hhbm5lbHMgQ09VTlQgICAgICAgICAgTnVtYmVyIG9mIGNo YW5uZWxzIHRvIGNyZWF0ZSBhbmQgdGVzdFxuIik7CglwcmludGYoIiAgICAgICAgICAgICAg ICAgICAgICAgICAgIChkZWZhdWx0OiAxLCBtaW5pbXVtOiAxKVxuXG4iKTsKCXByaW50Zigi ICAtLWV4dHJhLWNoYW5uZWxzIENPVU5UICAgIEFkZGl0aW9uYWwgY2hhbm5lbHMgdG8gbGlz dGVuIG9uIGZvciBsb2FkIHRlc3RpbmdcbiIpOwoJcHJpbnRmKCIgICAgICAgICAgICAgICAg ICAgICAgICAgICAoZGVmYXVsdDogMCwgbWluaW11bTogMClcbiIpOwoJcHJpbnRmKCIgICAg ICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBleHRyYSBjaGFubmVscyBhcmUgbm90IG5v dGlmaWVkXG5cbiIpOwoJcHJpbnRmKCIgIC0tc2xlZXAgU0VDT05EUyAgICAgICAgICBNYXhp bXVtIHJhbmRvbSBzbGVlcCBiZWZvcmUgZWFjaCBub3RpZnlcbiIpOwoJcHJpbnRmKCIgICAg ICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdDogMC4wLCBtaW5pbXVtOiAwLjApXG4i KTsKCXByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydHMgZnJhY3Rp b25hbCB2YWx1ZXMgKGUuZy4sIDAuMSBmb3IgMTAwbXMpXG5cbiIpOwoJcHJpbnRmKCIgIC0t c2xlZXAtZXhwIEZBQ1RPUiAgICAgICBFeHBvbmVudGlhbCBzY2FsaW5nIGZhY3RvciBmb3Ig cGVyLWNoYW5uZWwgc2xlZXBcbiIpOwoJcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAg ICAgICAoZGVmYXVsdDogMS4wLCBtdXN0IGJlID4gMC4wKVxuIik7CglwcmludGYoIiAgICAg ICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwgTiBnZXRzOiAtLXNsZWVwICogRkFDVE9S Xk5cbiIpOwoJcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgPDEuMCB0 byBkZWNyZWFzZSBzbGVlcCBmb3IgaGlnaGVyIGNoYW5uZWxzXG4iKTsKCXByaW50ZigiICAg ICAgICAgICAgICAgICAgICAgICAgICAgVXNlID4xLjAgdG8gaW5jcmVhc2Ugc2xlZXAgZm9y IGhpZ2hlciBjaGFubmVsc1xuXG4iKTsKCXByaW50ZigiICAtLWJhdGNoIENPVU5UICAgICAg ICAgICAgTnVtYmVyIG9mIE5PVElGWXMgdG8gc2VuZCBpbiBhIHNpbmdsZSB0cmFuc2FjdGlv blxuIik7CglwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAx LCBtaW5pbXVtOiAxKVxuIik7CglwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAg IEVhY2ggTk9USUZZIGhhcyBpdHMgb3duIHNlcSBhbmQgc2VuZF90aW1lXG4iKTsKCXByaW50 ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVHSU4vQ09NTUlUIG9ubHkgdXNlZCB3 aGVuIENPVU5UID4gMVxuXG4iKTsKCXByaW50ZigiICAtLWR1cmF0aW9uIFNFQ09ORFMgICAg ICAgUnVuIGZvciBzcGVjaWZpZWQgdGltZSB0aGVuIGV4aXQgZ3JhY2VmdWxseVxuIik7Cglw cmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiAwID0gcnVuIGZv cmV2ZXIsIG11c3QgYmUgPiAwLjApXG4iKTsKCXByaW50ZigiICAgICAgICAgICAgICAgICAg ICAgICAgICAgU3VwcG9ydHMgZnJhY3Rpb25hbCB2YWx1ZXMgKGUuZy4sIDEwLjUpXG5cbiIp OwoJcHJpbnRmKCIgIC0taGVscCAgICAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaGVs cCBtZXNzYWdlIGFuZCBleGl0XG5cbiIpOwoJZXhpdCgwKTsKfQoKaW50Cm1haW4oaW50IGFy Z2MsIGNoYXIgKiphcmd2KQp7CglpbnQJCQludW1fdGhyZWFkcyA9IDA7CglwdGhyZWFkX3Qg ICp0aHJlYWRzOwoJcGdfdGltZV91c2VjX3Qgc3RhcnQ7CglzdGF0aWMgc3RydWN0IG9wdGlv biBsb25nX29wdGlvbnNbXSA9IHsKCQkvKiBzeXN0ZW1hdGljIGxvbmcvc2hvcnQgbmFtZWQg b3B0aW9ucyAqLwoJCXsibGlzdGVuZXJzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIDF9 LAoJCXsibm90aWZpZXJzIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIDJ9LAoJCXsiY2hh bm5lbHMiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgM30sCgkJeyJleHRyYS1jaGFubmVs cyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCA0fSwKCQl7InNsZWVwIiwgcmVxdWlyZWRf YXJndW1lbnQsIE5VTEwsIDV9LAoJCXsic2xlZXAtZXhwIiwgcmVxdWlyZWRfYXJndW1lbnQs IE5VTEwsIDd9LAoJCXsiYmF0Y2giLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgNn0sCgkJ eyJkdXJhdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCA4fSwKCQl7ImhlbHAiLCBu b19hcmd1bWVudCwgTlVMTCwgJ2gnfSwKCQl7TlVMTCwgMCwgTlVMTCwgMH0KCX07CglpbnQJ CQludW1fbGlzdGVuX3RocmVhZHMgPSAxOwoJaW50CQkJbnVtX25vdGlmeV90aHJlYWRzID0g MTsKCWludAkJCW51bV9jaGFubmVscyA9IDE7CglpbnQJCQlvcHRpbmRleDsKCWludAkJCWM7 CgoJd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIiIsIGxvbmdfb3B0aW9u cywgJm9wdGluZGV4KSkgIT0gLTEpCgl7CgkJc3dpdGNoIChjKQoJCXsKCQkJY2FzZSAxOgkJ CQkvKiBsaXN0ZW5lcnMgKi8KCQkJCW51bV9saXN0ZW5fdGhyZWFkcyA9IGF0b2kob3B0YXJn KTsKCQkJCWlmIChudW1fbGlzdGVuX3RocmVhZHMgPCAxKQoJCQkJewoJCQkJCWZwcmludGYo c3RkZXJyLCAiaW52YWxpZCAtLWxpc3RlbmVycyBhcmd1bWVudFxuIik7CgkJCQkJZXhpdCgx KTsKCQkJCX0KCQkJCWJyZWFrOwoKCQkJY2FzZSAyOgkJCQkvKiBub3RpZmllcnMgKi8KCQkJ CW51bV9ub3RpZnlfdGhyZWFkcyA9IGF0b2kob3B0YXJnKTsKCQkJCWlmIChudW1fbm90aWZ5 X3RocmVhZHMgPCAxKQoJCQkJewoJCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCAtLW5v dGlmaWVycyBhcmd1bWVudFxuIik7CgkJCQkJZXhpdCgxKTsKCQkJCX0KCQkJCWJyZWFrOwoK CQkJY2FzZSAzOgkJCQkvKiBjaGFubmVscyAqLwoJCQkJbnVtX2NoYW5uZWxzID0gYXRvaShv cHRhcmcpOwoJCQkJaWYgKG51bV9jaGFubmVscyA8IDEpCgkJCQl7CgkJCQkJZnByaW50Zihz dGRlcnIsICJpbnZhbGlkIC0tY2hhbm5lbHMgYXJndW1lbnRcbiIpOwoJCQkJCWV4aXQoMSk7 CgkJCQl9CgkJCQlicmVhazsKCgkJCWNhc2UgNDoJCQkJLyogZXh0cmEtY2hhbm5lbHMgKi8K CQkJCW51bV9leHRyYV9jaGFubmVscyA9IGF0b2kob3B0YXJnKTsKCQkJCWlmIChudW1fZXh0 cmFfY2hhbm5lbHMgPCAwKQoJCQkJewoJCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCAt LWV4dHJhLWNoYW5uZWxzIGFyZ3VtZW50XG4iKTsKCQkJCQlleGl0KDEpOwoJCQkJfQoJCQkJ YnJlYWs7CgoJCQljYXNlIDU6CQkJCS8qIHNsZWVwICovCgkJCQltYXhfc2xlZXBfc2Vjb25k cyA9IGF0b2Yob3B0YXJnKTsKCQkJCWlmIChtYXhfc2xlZXBfc2Vjb25kcyA8IDAuMCkKCQkJ CXsKCQkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgLS1zbGVlcCBhcmd1bWVudFxuIik7 CgkJCQkJZXhpdCgxKTsKCQkJCX0KCQkJCWJyZWFrOwoKCQkJY2FzZSA2OgkJCQkvKiBiYXRj aCAqLwoJCQkJYmF0Y2hfc2l6ZSA9IGF0b2kob3B0YXJnKTsKCQkJCWlmIChiYXRjaF9zaXpl IDwgMSkKCQkJCXsKCQkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgLS1iYXRjaCBhcmd1 bWVudCAobWluaW11bTogMSlcbiIpOwoJCQkJCWV4aXQoMSk7CgkJCQl9CgkJCQlicmVhazsK CgkJCWNhc2UgNzoJCQkJLyogc2xlZXAtZXhwICovCgkJCQlzbGVlcF9leHBvbmVudGlhbF9m YWN0b3IgPSBhdG9mKG9wdGFyZyk7CgkJCQlpZiAoc2xlZXBfZXhwb25lbnRpYWxfZmFjdG9y IDw9IDAuMCkKCQkJCXsKCQkJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgLS1zbGVlcC1l eHAgYXJndW1lbnQgKG11c3QgYmUgPiAwLjApXG4iKTsKCQkJCQlleGl0KDEpOwoJCQkJfQoJ CQkJYnJlYWs7CgoJCQljYXNlIDg6CQkJCS8qIGR1cmF0aW9uICovCgkJCQlkdXJhdGlvbl9z ZWNvbmRzID0gYXRvZihvcHRhcmcpOwoJCQkJaWYgKGR1cmF0aW9uX3NlY29uZHMgPD0gMC4w KQoJCQkJewoJCQkJCWZwcmludGYoc3RkZXJyLCAiaW52YWxpZCAtLWR1cmF0aW9uIGFyZ3Vt ZW50IChtdXN0IGJlID4gMC4wKVxuIik7CgkJCQkJZXhpdCgxKTsKCQkJCX0KCQkJCWJyZWFr OwoKCQkJY2FzZSAnaCc6CQkJCS8qIGhlbHAgKi8KCQkJCXByaW50X3VzYWdlKGFyZ3ZbMF0p OwoJCQkJYnJlYWs7CgoJCQljYXNlICc/JzoJCQkJLyogdW5rbm93biBvcHRpb24gb3IgbWlz c2luZyBhcmd1bWVudCAqLwoJCQkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogVW5rbm93biBv cHRpb24gb3IgbWlzc2luZyBhcmd1bWVudFxuXG4iKTsKCQkJCXByaW50X3VzYWdlKGFyZ3Zb MF0pOwoJCQkJYnJlYWs7CgoJCQlkZWZhdWx0OgoJCQkJZnByaW50ZihzdGRlcnIsICJFcnJv cjogVW5leHBlY3RlZCBnZXRvcHRfbG9uZyByZXR1cm4gdmFsdWVcbiIpOwoJCQkJZXhpdCgx KTsKCQl9Cgl9CgoJLyogQ2hlY2sgZm9yIGV4dHJhIHBvc2l0aW9uYWwgYXJndW1lbnRzICov CglpZiAob3B0aW5kIDwgYXJnYykKCXsKCQlmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiBVbmV4 cGVjdGVkIGFyZ3VtZW50ICclcydcblxuIiwgYXJndltvcHRpbmRdKTsKCQlwcmludF91c2Fn ZShhcmd2WzBdKTsKCX0KCgkvKiBDaGVjayBpZiBwZ19nZXRfYXN5bmNfd2FrZXVwX3N0YXRz IGlzIGF2YWlsYWJsZSAqLwoJaGFzX2FzeW5jX3dha2V1cF9zdGF0cyA9IGNoZWNrX2FzeW5j X3dha2V1cF9zdGF0c19hdmFpbGFibGUoKTsKCWlmIChoYXNfYXN5bmNfd2FrZXVwX3N0YXRz KQoJCXJlc2V0X2FzeW5jX3dha2V1cF9zdGF0cygpOwoKCWludCB0b3RhbF90aHJlYWRzID0g bnVtX2NoYW5uZWxzICogKG51bV9ub3RpZnlfdGhyZWFkcyArIG51bV9saXN0ZW5fdGhyZWFk cyk7Cgl0aHJlYWRzID0gbWFsbG9jKHRvdGFsX3RocmVhZHMgKiBzaXplb2YocHRocmVhZF90 KSk7CglzdHJ1Y3QgdGhyZWFkX2FyZ3MgKnRocmVhZF9hcmdzX2FycmF5ID0gbWFsbG9jKHRv dGFsX3RocmVhZHMgKiBzaXplb2Yoc3RydWN0IHRocmVhZF9hcmdzKSk7CgoJLyogQWxsb2Nh dGUgc2VxdWVuY2UgY291bnRlcnMgZm9yIGVhY2ggbm90aWZpZXIgdGhyZWFkIChpbml0aWFs aXplZCB0byAwKSAqLwoJdWludDY0X3QgKm5vdGlmaWVyX3NlcXMgPSBjYWxsb2MobnVtX2No YW5uZWxzICogbnVtX25vdGlmeV90aHJlYWRzLCBzaXplb2YodWludDY0X3QpKTsKCgkvKiBT cGF3biB0aHJlYWRzIGZvciBlYWNoIGNoYW5uZWwgKi8KCWZvciAoaW50IGNoYW5uZWxfaWQg PSAwOyBjaGFubmVsX2lkIDwgbnVtX2NoYW5uZWxzOyBjaGFubmVsX2lkKyspCgl7CgkJLyog U3Bhd24gbm90aWZpZXIgdGhyZWFkcyBmb3IgdGhpcyBjaGFubmVsICovCgkJZm9yIChpbnQg aSA9IDA7IGkgPCBudW1fbm90aWZ5X3RocmVhZHM7IGkrKykKCQl7CgkJCWludAkJCXM7CgkJ CWludAkJCW5vdGlmaWVyX2luZGV4ID0gY2hhbm5lbF9pZCAqIG51bV9ub3RpZnlfdGhyZWFk cyArIGk7CgoJCQl0aHJlYWRfYXJnc19hcnJheVtudW1fdGhyZWFkc10uY2hhbm5lbF9pZCA9 IGNoYW5uZWxfaWQ7CgkJCXRocmVhZF9hcmdzX2FycmF5W251bV90aHJlYWRzXS5ub3RpZmll cl9pZCA9IGk7CgkJCXRocmVhZF9hcmdzX2FycmF5W251bV90aHJlYWRzXS5udW1fbm90aWZp ZXJzID0gbnVtX25vdGlmeV90aHJlYWRzOwoJCQl0aHJlYWRfYXJnc19hcnJheVtudW1fdGhy ZWFkc10udG90YWxfbGlzdGVuZXJzID0gbnVtX2NoYW5uZWxzICogbnVtX2xpc3Rlbl90aHJl YWRzOwoJCQl0aHJlYWRfYXJnc19hcnJheVtudW1fdGhyZWFkc10uc2VxX2NvdW50ZXIgPSAm bm90aWZpZXJfc2Vxc1tub3RpZmllcl9pbmRleF07CgkJCXMgPSBwdGhyZWFkX2NyZWF0ZSgm dGhyZWFkc1tudW1fdGhyZWFkc10sIE5VTEwsCgkJCQkJCQkgICAmbm90aWZ5X3RocmVhZF9t YWluLCAmdGhyZWFkX2FyZ3NfYXJyYXlbbnVtX3RocmVhZHNdKTsKCQkJaWYgKHMgIT0gMCkK CQkJewoJCQkJZnByaW50ZihzdGRlcnIsICJwdGhyZWFkX2NyZWF0ZSBmYWlsZWRcbiIpOwoJ CQkJZXhpdCgxKTsKCQkJfQoJCQludW1fdGhyZWFkcysrOwoJCX0KCgkJLyogU3Bhd24gbGlz dGVuZXIgdGhyZWFkcyBmb3IgdGhpcyBjaGFubmVsICovCgkJZm9yIChpbnQgaSA9IDA7IGkg PCBudW1fbGlzdGVuX3RocmVhZHM7IGkrKykKCQl7CgkJCWludAkJCXM7CgoJCQl0aHJlYWRf YXJnc19hcnJheVtudW1fdGhyZWFkc10uY2hhbm5lbF9pZCA9IGNoYW5uZWxfaWQ7CgkJCXRo cmVhZF9hcmdzX2FycmF5W251bV90aHJlYWRzXS5ub3RpZmllcl9pZCA9IC0xOyAgLyogTm90 IHVzZWQgZm9yIGxpc3RlbmVycyAqLwoJCQl0aHJlYWRfYXJnc19hcnJheVtudW1fdGhyZWFk c10ubnVtX25vdGlmaWVycyA9IG51bV9ub3RpZnlfdGhyZWFkczsKCQkJdGhyZWFkX2FyZ3Nf YXJyYXlbbnVtX3RocmVhZHNdLnRvdGFsX2xpc3RlbmVycyA9IG51bV9jaGFubmVscyAqIG51 bV9saXN0ZW5fdGhyZWFkczsKCQkJdGhyZWFkX2FyZ3NfYXJyYXlbbnVtX3RocmVhZHNdLnNl cV9jb3VudGVyID0gTlVMTDsgIC8qIE5vdCB1c2VkIGZvciBsaXN0ZW5lcnMgKi8KCQkJcyA9 IHB0aHJlYWRfY3JlYXRlKCZ0aHJlYWRzW251bV90aHJlYWRzXSwgTlVMTCwKCQkJCQkJCSAg ICZsaXN0ZW5fdGhyZWFkX21haW4sICZ0aHJlYWRfYXJnc19hcnJheVtudW1fdGhyZWFkc10p OwoJCQlpZiAocyAhPSAwKQoJCQl7CgkJCQlmcHJpbnRmKHN0ZGVyciwgInB0aHJlYWRfY3Jl YXRlIGZhaWxlZFxuIik7CgkJCQlleGl0KDEpOwoJCQl9CgkJCW51bV90aHJlYWRzKys7CgkJ fQoJfQoKCS8qIFdhaXQgZm9yIGFsbCBsaXN0ZW5lcnMgdG8gZXN0YWJsaXNoIExJU1RFTiBi ZWZvcmUgbm90aWZpZXJzIHN0YXJ0IHNlbmRpbmcgKi8KCXB0aHJlYWRfbXV0ZXhfbG9jaygm c3RhcnR1cF9tdXRleCk7Cgl3aGlsZSAobGlzdGVuZXJzX3JlYWR5IDwgbnVtX2NoYW5uZWxz ICogbnVtX2xpc3Rlbl90aHJlYWRzKQoJCXB0aHJlYWRfY29uZF93YWl0KCZzdGFydHVwX2Nv bmQsICZzdGFydHVwX211dGV4KTsKCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzdGFydHVwX211 dGV4KTsKCgkvKiBTaWduYWwgbm90aWZpZXJzIHRvIHN0YXJ0ICovCglzdGFydF9ub3RpZnlp bmcgPSAxOwoKCXN0YXJ0ID0gcGdfdGltZV9ub3coKTsKCgl1aW50MzJfdCBwcmV2X3NlbnQg PSAwOwoJdWludDMyX3QgcHJldl9yZWNlaXZlZCA9IDA7CglpbnQgZmlyc3RfaXRlcmF0aW9u ID0gMTsKCgl3aGlsZSAoIXNodXRkb3duX3JlcXVlc3RlZCkKCXsKCQlkb3VibGUJCWVsYXBz ZWRfc2VjOwoJCXVpbnQzMl90CWN1cnJfc2VudDsKCQl1aW50MzJfdAljdXJyX3JlY2VpdmVk OwoJCXVpbnQzMl90CXNlbnRfcGVyX3NlYzsKCQl1aW50MzJfdAlyZWNlaXZlZF9wZXJfc2Vj OwoKCQlzbGVlcCgxKTsKCgkJLyogRmV0Y2ggYXN5bmMgd2FrZXVwIHN0YXRzIGlmIGF2YWls YWJsZSAqLwoJCWZldGNoX2FzeW5jX3dha2V1cF9zdGF0cygpOwoKCQkvKiBNb3ZlIGN1cnNv ciBiYWNrIHVwIGJlZm9yZSBwcmludGluZyAoZXhjZXB0IGZpcnN0IHRpbWUpICovCgkJaWYg KCFmaXJzdF9pdGVyYXRpb24pCgkJewoJCQlpbnQgbGluZXMgPSBOVU1fQlVDS0VUUyArIDI7 ICAvKiBMYXRlbmN5IGRpc3RyaWJ1dGlvbiAqLwoJCQlpZiAoaGFzX2FzeW5jX3dha2V1cF9z dGF0cykKCQkJCWxpbmVzICs9IDEyOyAgLyogOCBmb3IgU2lnbmFsQmFja2VuZHMgKyA0IGZv ciBhc3luY1F1ZXVlUmVhZEFsbE5vdGlmaWNhdGlvbnMgKi8KCQkJZnByaW50ZihzdGRlcnIs ICJcMDMzWyVkQVxyIiwgbGluZXMpOwoJCX0KCQlmaXJzdF9pdGVyYXRpb24gPSAwOwoKCQll bGFwc2VkX3NlYyA9IFBHX1RJTUVfR0VUX0RPVUJMRShwZ190aW1lX25vdygpIC0gc3RhcnQp OwoKCQljdXJyX3NlbnQgPSBudW1fbm90aWZpZXNfc2VudDsKCQljdXJyX3JlY2VpdmVkID0g bnVtX25vdGlmaWVzX3JlY2VpdmVkOwoJCXNlbnRfcGVyX3NlYyA9IGN1cnJfc2VudCAtIHBy ZXZfc2VudDsKCQlyZWNlaXZlZF9wZXJfc2VjID0gY3Vycl9yZWNlaXZlZCAtIHByZXZfcmVj ZWl2ZWQ7CgoJCS8qIFByaW50IHN0YXRzIG9uIHNhbWUgbGluZSAqLwoJCWZwcmludGYoc3Rk ZXJyLCAiXHIlLjBmIHM6ICV1IHNlbnQgKCV1L3MpLCAldSByZWNlaXZlZCAoJXUvcykgICAg IiwKCQkJCWVsYXBzZWRfc2VjLCBjdXJyX3NlbnQsIHNlbnRfcGVyX3NlYywgY3Vycl9yZWNl aXZlZCwgcmVjZWl2ZWRfcGVyX3NlYyk7CgoJCS8qIFByaW50IGhpc3RvZ3JhbSAqLwoJCXB0 aHJlYWRfbXV0ZXhfbG9jaygmaGlzdG9ncmFtX211dGV4KTsKCgkJdWludDY0X3QgdG90YWxf bWVhc3VyZWQgPSAwOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVQ0tFVFM7IGkrKykK CQkJdG90YWxfbWVhc3VyZWQgKz0gYnVja2V0X2NvdW50c1tpXTsKCgkJaWYgKHRvdGFsX21l YXN1cmVkID4gMCkKCQl7CgkJCWNvbnN0IGNoYXIgKmJ1Y2tldF9sYWJlbHNbXSA9IHsKCQkJ CSIgMC4wMC0wLjAxbXMgICAiLAoJCQkJIiAwLjAxLTAuMTBtcyAgICIsCgkJCQkiIDAuMTAt MS4wMG1zICAgIiwKCQkJCSIgMS4wMC0xMC4wMG1zICAiLAoJCQkJIiAxMC4wMC0xMDAuMDBt cyIsCgkJCQkiPjEwMC4wMG1zICAgICAiCgkJCX07CgoJCQlmcHJpbnRmKHN0ZGVyciwgIlxu Iik7CgkJCWZwcmludGYoc3RkZXJyLCAiTm90aWZpY2F0aW9uIExhdGVuY3kgRGlzdHJpYnV0 aW9uOlxuIik7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVQ0tFVFM7IGkrKykKCQkJ ewoJCQkJdWludDY0X3QgY291bnQgPSBidWNrZXRfY291bnRzW2ldOwoJCQkJZG91YmxlIHBl cmNlbnRhZ2UgPSAoY291bnQgKiAxMDAuMCkgLyB0b3RhbF9tZWFzdXJlZDsKCQkJCWRvdWJs ZSBhdmdfbGF0ZW5jeV9tcyA9IDAuMDsKCgkJCQlpZiAoY291bnQgPiAwKQoJCQkJCWF2Z19s YXRlbmN5X21zID0gKGJ1Y2tldF90b3RhbHNbaV0gLyAxMDAwLjApIC8gY291bnQ7CgoJCQkJ LyogRHJhdyBiYXIgY2hhcnQgKG1heCAxMCBjaGFycykgKi8KCQkJCWludCBiYXJfbGVuZ3Ro ID0gKGludCkoKGNvdW50ICogMTApIC8gdG90YWxfbWVhc3VyZWQpOwoJCQkJaWYgKGJhcl9s ZW5ndGggPT0gMCAmJiBjb3VudCA+IDApCgkJCQkJYmFyX2xlbmd0aCA9IDE7CgoJCQkJZnBy aW50ZihzdGRlcnIsICIlcyAgIiwgYnVja2V0X2xhYmVsc1tpXSk7CgkJCQlmb3IgKGludCBq ID0gMDsgaiA8IGJhcl9sZW5ndGg7IGorKykKCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiMiKTsK CQkJCWZvciAoaW50IGogPSBiYXJfbGVuZ3RoOyBqIDwgMTA7IGorKykKCQkJCQlmcHJpbnRm KHN0ZGVyciwgIiAiKTsKCgkJCQlmcHJpbnRmKHN0ZGVyciwgIiAlbGx1ICglLjFmJSUpIGF2 ZzogJS4zZm1zXG4iLAoJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWNvdW50LCBwZXJjZW50 YWdlLCBhdmdfbGF0ZW5jeV9tcyk7CgkJCX0KCQl9CgoJCXB0aHJlYWRfbXV0ZXhfdW5sb2Nr KCZoaXN0b2dyYW1fbXV0ZXgpOwoKCQkvKiBEaXNwbGF5IGFzeW5jIHdha2V1cCBzdGF0cyBp ZiBhdmFpbGFibGUgKi8KCQlpZiAoaGFzX2FzeW5jX3dha2V1cF9zdGF0cykKCQl7CgkJCXB0 aHJlYWRfbXV0ZXhfbG9jaygmd2FrZXVwX3N0YXRzX211dGV4KTsKCgkJCXVpbnQ2NF90IHN0 YXRzWzhdOwoJCQltZW1jcHkoc3RhdHMsIGFzeW5jX3dha2V1cF9zdGF0cywgc2l6ZW9mKHN0 YXRzKSk7CgoJCQlwdGhyZWFkX211dGV4X3VubG9jaygmd2FrZXVwX3N0YXRzX211dGV4KTsK CgkJCS8qIEZpcnN0IGhpc3RvZ3JhbTogU2lnbmFsQmFja2VuZHMgU3RhdGlzdGljcyAqLwoJ CQl1aW50NjRfdCBzaWduYWxfdG90YWwgPSBzdGF0c1swXSArIHN0YXRzWzFdICsgc3RhdHNb Ml0gKyBzdGF0c1szXSArIHN0YXRzWzRdICsgc3RhdHNbNV07CgoJCQlpZiAoc2lnbmFsX3Rv dGFsID4gMCkKCQkJewoJCQkJY29uc3QgY2hhciAqc2lnbmFsX2xhYmVsc1tdID0gewoJCQkJ CSJzaWduYWxlZF90YXJnZXRlZCIsCgkJCQkJImFkdmFuY2luZ19iZWhpbmQgIiwKCQkJCQki YWR2YW5jaW5nX2FoZWFkICAiLAoJCQkJCSJpZGxlX2JlaGluZCAgICAgICIsCgkJCQkJImF2 b2lkZWRfd2FrZXVwcyAgIiwKCQkJCQkiYWxyZWFkeV9haGVhZCAgICAiCgkJCQl9OwoJCQkJ aW50IHNpZ25hbF9pbmRpY2VzW10gPSB7MCwgMSwgMiwgMywgNCwgNX07CgoJCQkJZnByaW50 ZihzdGRlcnIsICJcbiIpOwoJCQkJZnByaW50ZihzdGRlcnIsICJTaWduYWxCYWNrZW5kcyBT dGF0aXN0aWNzOlxuIik7CgkJCQlmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykKCQkJCXsK CQkJCQlpbnQgaWR4ID0gc2lnbmFsX2luZGljZXNbaV07CgkJCQkJZG91YmxlIHBlcmNlbnRh Z2UgPSAoc3RhdHNbaWR4XSAqIDEwMC4wKSAvIHNpZ25hbF90b3RhbDsKCgkJCQkJLyogRHJh dyBiYXIgY2hhcnQgKG1heCAxMCBjaGFycykgKi8KCQkJCQlpbnQgYmFyX2xlbmd0aCA9IChp bnQpKChzdGF0c1tpZHhdICogMTApIC8gc2lnbmFsX3RvdGFsKTsKCQkJCQlpZiAoYmFyX2xl bmd0aCA9PSAwICYmIHN0YXRzW2lkeF0gPiAwKQoJCQkJCQliYXJfbGVuZ3RoID0gMTsKCgkJ CQkJZnByaW50ZihzdGRlcnIsICIlcyAgIiwgc2lnbmFsX2xhYmVsc1tpXSk7CgkJCQkJZm9y IChpbnQgaiA9IDA7IGogPCBiYXJfbGVuZ3RoOyBqKyspCgkJCQkJCWZwcmludGYoc3RkZXJy LCAiIyIpOwoJCQkJCWZvciAoaW50IGogPSBiYXJfbGVuZ3RoOyBqIDwgMTA7IGorKykKCQkJ CQkJZnByaW50ZihzdGRlcnIsICIgIik7CgoJCQkJCWZwcmludGYoc3RkZXJyLCAiICVsbHUg KCUuMWYlJSlcbiIsCgkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXN0YXRzW2lkeF0sIHBl cmNlbnRhZ2UpOwoJCQkJfQoJCQl9CgoJCQkvKiBTZWNvbmQgaGlzdG9ncmFtOiBhc3luY1F1 ZXVlUmVhZEFsbE5vdGlmaWNhdGlvbnMgU3RhdGlzdGljcyAqLwoJCQl1aW50NjRfdCBhc3lu Y3FfdG90YWwgPSBzdGF0c1s2XSArIHN0YXRzWzddOwoKCQkJaWYgKGFzeW5jcV90b3RhbCA+ IDApCgkJCXsKCQkJCWNvbnN0IGNoYXIgKmFzeW5jcV9sYWJlbHNbXSA9IHsKCQkJCQkibmVj ZXNzYXJ5X3dha2V1cHMgICIsCgkJCQkJInVubmVjZXNzYXJ5X3dha2V1cHMiCgkJCQl9OwoJ CQkJaW50IGFzeW5jcV9pbmRpY2VzW10gPSB7NiwgN307CgoJCQkJZnByaW50ZihzdGRlcnIs ICJcbiIpOwoJCQkJZnByaW50ZihzdGRlcnIsICJhc3luY1F1ZXVlUmVhZEFsbE5vdGlmaWNh dGlvbnMgU3RhdGlzdGljczpcbiIpOwoJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKysp CgkJCQl7CgkJCQkJaW50IGlkeCA9IGFzeW5jcV9pbmRpY2VzW2ldOwoJCQkJCWRvdWJsZSBw ZXJjZW50YWdlID0gKHN0YXRzW2lkeF0gKiAxMDAuMCkgLyBhc3luY3FfdG90YWw7CgoJCQkJ CS8qIERyYXcgYmFyIGNoYXJ0IChtYXggMTAgY2hhcnMpICovCgkJCQkJaW50IGJhcl9sZW5n dGggPSAoaW50KSgoc3RhdHNbaWR4XSAqIDEwKSAvIGFzeW5jcV90b3RhbCk7CgkJCQkJaWYg KGJhcl9sZW5ndGggPT0gMCAmJiBzdGF0c1tpZHhdID4gMCkKCQkJCQkJYmFyX2xlbmd0aCA9 IDE7CgoJCQkJCWZwcmludGYoc3RkZXJyLCAiJXMgICIsIGFzeW5jcV9sYWJlbHNbaV0pOwoJ CQkJCWZvciAoaW50IGogPSAwOyBqIDwgYmFyX2xlbmd0aDsgaisrKQoJCQkJCQlmcHJpbnRm KHN0ZGVyciwgIiMiKTsKCQkJCQlmb3IgKGludCBqID0gYmFyX2xlbmd0aDsgaiA8IDEwOyBq KyspCgkJCQkJCWZwcmludGYoc3RkZXJyLCAiICIpOwoKCQkJCQlmcHJpbnRmKHN0ZGVyciwg IiAlbGx1ICglLjFmJSUpXG4iLAoJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylzdGF0c1tp ZHhdLCBwZXJjZW50YWdlKTsKCQkJCX0KCQkJfQoJCX0KCgkJZmZsdXNoKHN0ZGVycik7CgoJ CXByZXZfc2VudCA9IGN1cnJfc2VudDsKCQlwcmV2X3JlY2VpdmVkID0gY3Vycl9yZWNlaXZl ZDsKCgkJLyogQ2hlY2sgaWYgZHVyYXRpb24gaGFzIGVsYXBzZWQgKi8KCQlpZiAoZHVyYXRp b25fc2Vjb25kcyA+IDAuMCkKCQl7CgkJCWVsYXBzZWRfc2VjID0gUEdfVElNRV9HRVRfRE9V QkxFKHBnX3RpbWVfbm93KCkgLSBzdGFydCk7CgkJCWlmIChlbGFwc2VkX3NlYyA+IGR1cmF0 aW9uX3NlY29uZHMpCgkJCQlleGl0KDApOwoJCX0KCgl9CgoJcmV0dXJuIDA7Cn0K --86e7cd31e6424024be1d558339921d90--