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.96) (envelope-from ) id 1vfXFW-002brM-1q for pgsql-hackers@arkaria.postgresql.org; Tue, 13 Jan 2026 05:47:27 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vfXFV-0032Hj-2j for pgsql-hackers@arkaria.postgresql.org; Tue, 13 Jan 2026 05:47:26 +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.96) (envelope-from ) id 1vfXFU-0032Ha-2r for pgsql-hackers@lists.postgresql.org; Tue, 13 Jan 2026 05:47:25 +0000 Received: from fout-b6-smtp.messagingengine.com ([202.12.124.149]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vfXFR-0009zb-2P for pgsql-hackers@postgresql.org; Tue, 13 Jan 2026 05:47:24 +0000 Received: from phl-compute-05.internal (phl-compute-05.internal [10.202.2.45]) by mailfout.stl.internal (Postfix) with ESMTP id 39E431D00179; Tue, 13 Jan 2026 00:47:18 -0500 (EST) Received: from phl-imap-16 ([10.202.2.88]) by phl-compute-05.internal (MEProxy); Tue, 13 Jan 2026 00:47:18 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc: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=fm2; t=1768283238; x=1768369638; bh=wpVMgWH/qX L/FmkmfpvBD8ANLCboUPzRSMzVZ6JuQsE=; b=aGW7fW/0EIh22wwRIUeOe/IzXB 1TnLWQL32q04EHbxMQ4I2f/ES7Rxt4DrvFU4EicfOTAmpCK2+9Y5gvy5bMmQoqo2 xERqXnjS/fhPx3WpIa9p2Cqi+GTNmEhOqsdNINHzMq0BWkXn0juIPxQY5uzH8IT4 1hSH0WFO6w5BbPteX8a6EXDLDalSiFagbQFqkiHL1SYAkmBjCUAA2HgJAOpicijr x/KiFg1jrz/Hk/jrDL/zPu5kYkO2hEKfjNz+hRGuWxZPaU4zDkC4CDLMnoivOXlh BB4J5POVjDwtvW0fDUn5ENdrZ5hehdkys0U9TLsklpWBiSWoaTYWWo2t/npg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc: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=fm2; t= 1768283238; x=1768369638; bh=wpVMgWH/qXL/FmkmfpvBD8ANLCboUPzRSMz VZ6JuQsE=; b=ShHRiyUMKZ860Brq4kYqxuNLOGOxsJ9RUyK40u9bmC9EHF3C008 dv9sO0YV2On0hoYcPKQiYggZ/CzI2+wF+L4xTbvdyGJV7DtDZHLT+A5dfuSQt5wa AffAdqq7Y/EOCcxEg+TFJb/NiL6hUgAhiW7YjXauzOCOZTDL/LeCnOBj4e0NC87l G0vZAHWxgvmOhltZn7SZEqtWXKjEQf3ywcdRyNyl444uIesAql2iAGznSCE3K49S 3/BXyuwXJ6iG1P6lc7PllZ4avPeLdLfxych/gbfssHkjh6JinV+og5GONBp3CT3M rq/RaVt/rUVIey1C4U3IhyCeZyGEMjyP7/A== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgdduudelhedvucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucenucfjughrpefoggffhffvvefkjghfufgtsehmtderre ertddtnecuhfhrohhmpedflfhovghlucflrggtohgsshhonhdfuceojhhovghlsegtohhm phhilhgvrhdrohhrgheqnecuggftrfgrthhtvghrnhepfffgleffffdvhefhieegfeeije dujedvieeuveeugefgveeukeevieethefhteeinecuvehluhhsthgvrhfuihiivgeptden ucfrrghrrghmpehmrghilhhfrhhomhepjhhovghlsegtohhmphhilhgvrhdrohhrghdpnh gspghrtghpthhtohepvddpmhhouggvpehsmhhtphhouhhtpdhrtghpthhtohepphhgshhq lhdqhhgrtghkvghrshesphhoshhtghhrvghsqhhlrdhorhhgpdhrtghpthhtohepthhglh esshhsshdrphhghhdrphgrrdhush X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id C31712CC0083; Tue, 13 Jan 2026 00:47:17 -0500 (EST) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 X-ThreadId: AE1r89ybsZ1g Date: Tue, 13 Jan 2026 06:46:57 +0100 From: "Joel Jacobson" To: pgsql-hackers Cc: "Tom Lane" Message-Id: <34ccde90-2041-4388-90d5-f8519f3104dd@app.fastmail.com> In-Reply-To: <1843261.1767817768@sss.pgh.pa.us> 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-F22F!C!3!4!29AE8@gmail.com> <1547585.1760645808@sss.pgh.pa.us> <14865EB6-0BF4-462B-9072-10BDAC> <1843261.1767817768@sss.pgh.pa.us> Subject: Re: Optimize LISTEN/NOTIFY Content-Type: multipart/mixed; boundary=e7f9d88d3b6b4165867e81756e908ce5 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --e7f9d88d3b6b4165867e81756e908ce5 Content-Type: text/plain Content-Transfer-Encoding: 7bit On Wed, Jan 7, 2026, at 21:29, Tom Lane wrote: > "Joel Jacobson" writes: >> I've reworked the staging mechanism for LISTEN/UNLISTEN. The new design >> tracks LISTEN state at three levels: >> * pendingListenChannels: per-transaction pending changes >> * listenChannelsHash: per-backend committed state cache >> * channelHash: cluster-wide shared state > > I spent some time looking through this version. Many thanks for a great review with awesome ideas. >> The main benefit is that pendingListenChannels is now a hash table >> instead of a simple List. In the old design, LISTEN foo; UNLISTEN foo; >> LISTEN foo would create three list entries that all had to be processed >> at commit. The new design collapses this to one hash entry storing the >> final state, which we just apply at commit. > > That seems a little weird: surely such usage is not something we need > to optimize. Maybe it can be justified because it makes the code > simpler, but that's not immediately obvious to me. The reason for not sticking to the two-boolean approach (staged/current) like in v32 was to minimize shared dshash operations in favor of local hash table operations. Consider `LISTEN foo; UNLISTEN foo; LISTEN foo:` With two booleans and pendingListenActions as a List (as in v32): Each LISTEN/UNLISTEN touches the shared dshash during PreCommit to set the staged value, then commit iterates the entire list (including duplicates) to finalize. That's 6 dshash operations in total. With a local hash table (current design, v34): UNLISTEN during PreCommit doesn't touch the shared dshash at all, it just records the intent locally. LISTEN pre-allocates once per channel. At commit we iterate the de-duplicated hash table, so we do one dshash operation per unique channel rather than per action. That's 2 dshash operations in total. Since dshash operations involve shared memory access and potential contention, doing more work locally with a cheap hash table seemed like the right trade-off to me. I also tried making the current v34 approach work with pendingListenActions as a List. The problem is that at commit, we need to know the final intent per channel. With a List containing duplicates, we'd iterate in reverse for "last action wins" semantics, but then we'd need to track which channels we've already processed, essentially reimplementing a hash table manually. The hash table gives us this for free: inserting the same channel just overwrites the previous action, and at commit each channel appears exactly once with its final intent. > I found the terminology pretty confusing, in particular there's too > little cognitive distance between "channel hash table" and "local > listen channels hash table" and "pending listen channels hash table". > I think you could improve matters by renaming, perhaps along the > lines of I really struggled trying to come up with meaningful names, so big thanks for great naming improvements. Renames per suggestions: channelHash -> globalChannelTable listenChannelsHash -> localChannelTable pendingListenChannels -> pendingListenActions NotificationList.channelSet -> NotificationList.uniqueChannelNames Exec_ListenPreCommit -> BecomeRegisteredListener Exec_ListenPreCommitStage -> PrepareTableEntriesForListen Exec_UnlistenPreCommitStage -> PrepareTableEntriesForUnlisten Exec_UnlistenAllPreCommitStage -> PrepareTableEntriesForUnlistenAll I also renamed the following to make their purpose clear: ChannelNameKey -> GlobalChannelKey ChannelHashKey -> GlobalChannelKey ChannelListeners -> GlobalChannelEntry ChannelListeners.ChannelHashKey -> GlobalChannelEntry.GlobalChannelKey AsyncQueueControl.channelHashDSA -> AsyncQueueControl.globalChannelTableDSA AsyncQueueControl.channelHashDSH -> AsyncQueueControl.globalChannelTableDSH channelDSA -> globalChannelDSA I also renamed PendingListenEntry.listening to PendingListenEntry.action, and changed it from a bool to a new enum PendingListenAction. I didn't like how this field was a bool named "listening", since ListenerEntry's also has a bool field named "listening". It felt better to make it an enum with the explicit values {PENDING_LISTEN, PENDING_UNLISTEN}. > I noted while looking at code coverage results that AtAbort_Notify > seems almost entirely unreached, and soon realized that that's because > none of it runs unless we are cleaning up a transaction that fails > after Exec_ListenPreCommit has created pendingListenChannels. > That's obviously extremely difficult to reach in a test, so it's a bit > sad that we have that big chunk of unreachable code, especially when > the coverage elsewhere in this file is pretty stellar. I wonder if > there is a way to merge that chunk with the code in AtCommit_Notify > that also has to scan pendingListenChannels, so as to reduce the > amount of untested code. Also, the comments for AtAbort_Notify > don't really make it clear that there's nothing to do unless we're > reverting an almost-committed transaction. Great idea, thanks! I also found it troubling not being able to test AtAbort_Notify without e.g. manually adding code to simulate OOM, which is how I manually tested the old code. Two new helper-functions have been introduced: ApplyPendingListenActions -> RemoveListenerFromChannel RemoveListenerFromChannel is now used both by UNLISTEN being committed... AtCommit_Notify -> ApplyPendingListenActions -> RemoveListenerFromChannel ...as well as the harder-to-hit case of a staged LISTEN being aborted: AtAbort_Notify -> ApplyPendingListenActions -> RemoveListenerFromChannel > Speaking of AtCommit_Notify: > > entry = dshash_find(channelHash, &key, true); > if (entry == NULL) > continue; > > How can it be okay to just silently "continue" here? Certainly > this case should be unreachable, but that doesn't make it okay > to silently ignore the failure if one were to occur. Given > that this is post-commit processing, probably we can do no > better than The silent continue was handling UNLISTEN of a channel we weren't listening on (which is allowed as a no-op). However, I've now moved that check earlier: PrepareTableEntriesForUnlisten now returns early if the channel isn't in localChannelTable. This means ApplyPendingListenActions can safely PANIC on entry == NULL, since that case is now truly unreachable. > Also, a bit further down: > ... > > This seems like a weird order of operations: why didn't you finish > dealing with the channelHash entry before dealing with > listenChannelsHash? Right. Fixed. New version attached. /Joel --e7f9d88d3b6b4165867e81756e908ce5 Content-Disposition: attachment; filename*0="0001-optimize_listen_notify-v34.patch" Content-Type: application/octet-stream; name="=?UTF-8?Q?0001-optimize=5Flisten=5Fnotify-v34.patch?=" Content-Transfer-Encoding: base64 RnJvbSAwZDk0MzE1Y2RjN2FjZWQ1NWJiMGQ4ODA3MTE3NGU5MWM1YmNkMzliIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogU2F0LCAyNyBEZWMgMjAyNSAwODowNjoyMSArMDEwMApTdWJqZWN0OiBbUEFU Q0ggMS8yXSBJbXByb3ZlIExJU1RFTi9OT1RJRlkgdGVzdCBjb3ZlcmFnZQoKVGhpcyBhZGRz IGlzb2xhdGlvbiB0ZXN0cyB0byBjb3ZlciBwcmV2aW91c2x5IHVudGVzdGVkIGNvZGUgcGF0 aHM6CgoqIENoZWNrIHNpbXBsZSBOT1RJRlkgcmVwYXJlbnRpbmcgd2hlbiBwYXJlbnQgaGFz IG5vIGFjdGlvbgoqIENoZWNrIExJU1RFTiByZXBhcmVudGluZyBpbiBzdWJ0cmFuc2FjdGlv bgoqIENoZWNrIExJU1RFTiBtZXJnZSBwYXRoIHdoZW4gYm90aCBvdXRlciBhbmQgaW5uZXIg dHJhbnNhY3Rpb25zIGhhdmUgYWN0aW9ucwoqIENoZWNrIExJU1RFTiBhYm9ydCBwYXRoIChS T0xMQkFDSyBUTyBTQVZFUE9JTlQgZGlzY2FyZHMgcGVuZGluZyBhY3Rpb25zKQoqIENoZWNr IG5vdGlmaWNhdGlvbl9tYXRjaCBmdW5jdGlvbiAodHJpZ2dlcmVkIGJ5IGhhc2ggdGFibGUg ZHVwbGljYXRlIGRldGVjdGlvbikKKiBDaGVjayB0aGF0IG5vdGlmaWNhdGlvbnMgc2VudCBm cm9tIGEgYmFja2VuZCB0aGF0IGhhcyBub3QgZG9uZSBMSVNURU4KICBhcmUgcHJvcGVybHkg ZGVsaXZlcmVkIHRvIGEgbGlzdGVuZXIgaW4gYW5vdGhlciBiYWNrZW5kCiogQ2hlY2sgVU5M SVNURU4gKiBjYW5jZWxzIGEgTElTVEVOIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uCgpUaGlz IGFsc28gYWRkcyBhIHRlc3QgdG8gcHJlcGFyZSBmb3IgdGhlIG5leHQgcGF0Y2g6CgoqIENo ZWNrIENoYW5uZWxIYXNoQWRkTGlzdGVuZXIgYXJyYXkgZ3Jvd3RoCi0tLQogc3JjL3Rlc3Qv aXNvbGF0aW9uL2V4cGVjdGVkL2FzeW5jLW5vdGlmeS5vdXQgfCAxMjQgKysrKysrKysrKysr KysrKysrLQogc3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNzL2FzeW5jLW5vdGlmeS5zcGVjICAg fCAgNzIgKysrKysrKysrKysKIDIgZmlsZXMgY2hhbmdlZCwgMTk1IGluc2VydGlvbnMoKyks IDEgZGVsZXRpb24oLSkKCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9pc29sYXRpb24vZXhwZWN0 ZWQvYXN5bmMtbm90aWZ5Lm91dCBiL3NyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC9hc3lu Yy1ub3RpZnkub3V0CmluZGV4IDU1NmUxODA1ODkzLi41ZDZiY2NlMmIwMiAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvaXNvbGF0aW9uL2V4cGVjdGVkL2FzeW5jLW5vdGlmeS5vdXQKKysrIGIv c3JjL3Rlc3QvaXNvbGF0aW9uL2V4cGVjdGVkL2FzeW5jLW5vdGlmeS5vdXQKQEAgLTEsNCAr MSw0IEBACi1QYXJzZWQgdGVzdCBzcGVjIHdpdGggMyBzZXNzaW9ucworUGFyc2VkIHRlc3Qg c3BlYyB3aXRoIDcgc2Vzc2lvbnMKIAogc3RhcnRpbmcgcGVybXV0YXRpb246IGxpc3RlbmMg bm90aWZ5MSBub3RpZnkyIG5vdGlmeTMgbm90aWZ5Zgogc3RlcCBsaXN0ZW5jOiBMSVNURU4g YzE7IExJU1RFTiBjMjsKQEAgLTQ3LDYgKzQ3LDExNSBAQCBub3RpZmllcjogTk9USUZZICJj MiIgd2l0aCBwYXlsb2FkICJwYXlsb2FkIiBmcm9tIG5vdGlmaWVyCiBub3RpZmllcjogTk9U SUZZICJjMSIgd2l0aCBwYXlsb2FkICJwYXlsb2FkcyIgZnJvbSBub3RpZmllcgogbm90aWZp ZXI6IE5PVElGWSAiYzIiIHdpdGggcGF5bG9hZCAicGF5bG9hZHMiIGZyb20gbm90aWZpZXIK IAorc3RhcnRpbmcgcGVybXV0YXRpb246IGxpc3RlbmMgbm90aWZ5c19zaW1wbGUKK3N0ZXAg bGlzdGVuYzogTElTVEVOIGMxOyBMSVNURU4gYzI7CitzdGVwIG5vdGlmeXNfc2ltcGxlOiAK KwlCRUdJTjsKKwlTQVZFUE9JTlQgczE7CisJTk9USUZZIGMxLCAnc2ltcGxlMSc7CisJTk9U SUZZIGMyLCAnc2ltcGxlMic7CisJUkVMRUFTRSBTQVZFUE9JTlQgczE7CisJQ09NTUlUOwor Citub3RpZmllcjogTk9USUZZICJjMSIgd2l0aCBwYXlsb2FkICJzaW1wbGUxIiBmcm9tIG5v dGlmaWVyCitub3RpZmllcjogTk9USUZZICJjMiIgd2l0aCBwYXlsb2FkICJzaW1wbGUyIiBm cm9tIG5vdGlmaWVyCisKK3N0YXJ0aW5nIHBlcm11dGF0aW9uOiBsc2JlZ2luIGxzc2F2ZXBv aW50IGxzbGlzdGVuIGxzcmVsZWFzZSBsc2NvbW1pdCBsc25vdGlmeQorc3RlcCBsc2JlZ2lu OiBCRUdJTjsKK3N0ZXAgbHNzYXZlcG9pbnQ6IFNBVkVQT0lOVCBzMTsKK3N0ZXAgbHNsaXN0 ZW46IExJU1RFTiBjMTsgTElTVEVOIGMyOworc3RlcCBsc3JlbGVhc2U6IFJFTEVBU0UgU0FW RVBPSU5UIHMxOworc3RlcCBsc2NvbW1pdDogQ09NTUlUOworc3RlcCBsc25vdGlmeTogTk9U SUZZIGMxLCAnc3VieGFjdF90ZXN0JzsKK2xpc3Rlbl9zdWJ4YWN0OiBOT1RJRlkgImMxIiB3 aXRoIHBheWxvYWQgInN1YnhhY3RfdGVzdCIgZnJvbSBsaXN0ZW5fc3VieGFjdAorCitzdGFy dGluZyBwZXJtdXRhdGlvbjogbHNiZWdpbiBsc2xpc3Rlbl9vdXRlciBsc3NhdmVwb2ludCBs c2xpc3RlbiBsc3JlbGVhc2UgbHNjb21taXQgbHNub3RpZnkKK3N0ZXAgbHNiZWdpbjogQkVH SU47CitzdGVwIGxzbGlzdGVuX291dGVyOiBMSVNURU4gYzM7CitzdGVwIGxzc2F2ZXBvaW50 OiBTQVZFUE9JTlQgczE7CitzdGVwIGxzbGlzdGVuOiBMSVNURU4gYzE7IExJU1RFTiBjMjsK K3N0ZXAgbHNyZWxlYXNlOiBSRUxFQVNFIFNBVkVQT0lOVCBzMTsKK3N0ZXAgbHNjb21taXQ6 IENPTU1JVDsKK3N0ZXAgbHNub3RpZnk6IE5PVElGWSBjMSwgJ3N1YnhhY3RfdGVzdCc7Cits aXN0ZW5fc3VieGFjdDogTk9USUZZICJjMSIgd2l0aCBwYXlsb2FkICJzdWJ4YWN0X3Rlc3Qi IGZyb20gbGlzdGVuX3N1YnhhY3QKKworc3RhcnRpbmcgcGVybXV0YXRpb246IGxzYmVnaW4g bHNzYXZlcG9pbnQgbHNsaXN0ZW4gbHNyb2xsYmFjayBsc2NvbW1pdCBsc25vdGlmeV9jaGVj aworc3RlcCBsc2JlZ2luOiBCRUdJTjsKK3N0ZXAgbHNzYXZlcG9pbnQ6IFNBVkVQT0lOVCBz MTsKK3N0ZXAgbHNsaXN0ZW46IExJU1RFTiBjMTsgTElTVEVOIGMyOworc3RlcCBsc3JvbGxi YWNrOiBST0xMQkFDSyBUTyBTQVZFUE9JTlQgczE7CitzdGVwIGxzY29tbWl0OiBDT01NSVQ7 CitzdGVwIGxzbm90aWZ5X2NoZWNrOiBOT1RJRlkgYzEsICdzaG91bGRfbm90X3JlY2VpdmUn OworCitzdGFydGluZyBwZXJtdXRhdGlvbjogbHVubGlzdGVuX2FsbCBub3RpZnkxIGxjaGVj aworc3RlcCBsdW5saXN0ZW5fYWxsOiBCRUdJTjsgTElTVEVOIGMxOyBVTkxJU1RFTiAqOyBD T01NSVQ7CitzdGVwIG5vdGlmeTE6IE5PVElGWSBjMTsKK3N0ZXAgbGNoZWNrOiBTRUxFQ1Qg MSBBUyB4OworeAorLQorMQorKDEgcm93KQorCisKK3N0YXJ0aW5nIHBlcm11dGF0aW9uOiBs aXN0ZW5jIG5vdGlmeV9tYW55X3dpdGhfZHVwCitzdGVwIGxpc3RlbmM6IExJU1RFTiBjMTsg TElTVEVOIGMyOworc3RlcCBub3RpZnlfbWFueV93aXRoX2R1cDogCisJQkVHSU47CisJU0VM RUNUIHBnX25vdGlmeSgnYzEnLCAnbXNnJyB8fCBzOjp0ZXh0KSBGUk9NIGdlbmVyYXRlX3Nl cmllcygxLCAxNykgczsKKwlTRUxFQ1QgcGdfbm90aWZ5KCdjMScsICdtc2cxJyk7CisJQ09N TUlUOworCitwZ19ub3RpZnkKKy0tLS0tLS0tLQorICAgICAgICAgCisgICAgICAgICAKKyAg ICAgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisg ICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIAor ICAgICAgICAgCisgICAgICAgICAKKyAgICAgICAgIAorICAgICAgICAgCisgICAgICAgICAK KygxNyByb3dzKQorCitwZ19ub3RpZnkKKy0tLS0tLS0tLQorICAgICAgICAgCisoMSByb3cp CisKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzEiIGZyb20gbm90 aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzIiIGZyb20g bm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzMiIGZy b20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzQi IGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1z ZzUiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQg Im1zZzYiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxv YWQgIm1zZzciIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBh eWxvYWQgIm1zZzgiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRo IHBheWxvYWQgIm1zZzkiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBOT1RJRlkgImMxIiB3 aXRoIHBheWxvYWQgIm1zZzEwIiBmcm9tIG5vdGlmaWVyCitub3RpZmllcjogTk9USUZZICJj MSIgd2l0aCBwYXlsb2FkICJtc2cxMSIgZnJvbSBub3RpZmllcgorbm90aWZpZXI6IE5PVElG WSAiYzEiIHdpdGggcGF5bG9hZCAibXNnMTIiIGZyb20gbm90aWZpZXIKK25vdGlmaWVyOiBO T1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzEzIiBmcm9tIG5vdGlmaWVyCitub3RpZmll cjogTk9USUZZICJjMSIgd2l0aCBwYXlsb2FkICJtc2cxNCIgZnJvbSBub3RpZmllcgorbm90 aWZpZXI6IE5PVElGWSAiYzEiIHdpdGggcGF5bG9hZCAibXNnMTUiIGZyb20gbm90aWZpZXIK K25vdGlmaWVyOiBOT1RJRlkgImMxIiB3aXRoIHBheWxvYWQgIm1zZzE2IiBmcm9tIG5vdGlm aWVyCitub3RpZmllcjogTk9USUZZICJjMSIgd2l0aCBwYXlsb2FkICJtc2cxNyIgZnJvbSBu b3RpZmllcgorCitzdGFydGluZyBwZXJtdXRhdGlvbjogbGlzdGVuYyBsbGlzdGVuIGwybGlz dGVuIGwzbGlzdGVuIGxzbGlzdGVuCitzdGVwIGxpc3RlbmM6IExJU1RFTiBjMTsgTElTVEVO IGMyOworc3RlcCBsbGlzdGVuOiBMSVNURU4gYzE7IExJU1RFTiBjMjsKK3N0ZXAgbDJsaXN0 ZW46IExJU1RFTiBjMTsKK3N0ZXAgbDNsaXN0ZW46IExJU1RFTiBjMTsKK3N0ZXAgbHNsaXN0 ZW46IExJU1RFTiBjMTsgTElTVEVOIGMyOworCiBzdGFydGluZyBwZXJtdXRhdGlvbjogbGxp c3RlbiBub3RpZnkxIG5vdGlmeTIgbm90aWZ5MyBub3RpZnlmIGxjaGVjawogc3RlcCBsbGlz dGVuOiBMSVNURU4gYzE7IExJU1RFTiBjMjsKIHN0ZXAgbm90aWZ5MTogTk9USUZZIGMxOwpA QCAtOTUsNiArMjA0LDggQEAgbGlzdGVuZXI6IE5PVElGWSAiYzIiIHdpdGggcGF5bG9hZCAi IiBmcm9tIG5vdGlmaWVyCiAKIHN0YXJ0aW5nIHBlcm11dGF0aW9uOiBsMmxpc3RlbiBsMmJl Z2luIG5vdGlmeTEgbGJlZ2lucyBsbGlzdGVuIGxjb21taXQgbDJjb21taXQgbDJzdG9wCiBz dGVwIGwybGlzdGVuOiBMSVNURU4gYzE7CitsaXN0ZW5lcjI6IE5PVElGWSAiYzEiIHdpdGgg cGF5bG9hZCAiIiBmcm9tIG5vdGlmaWVyCitsaXN0ZW5lcjI6IE5PVElGWSAiYzEiIHdpdGgg cGF5bG9hZCAiIiBmcm9tIG5vdGlmaWVyCiBzdGVwIGwyYmVnaW46IEJFR0lOOwogc3RlcCBu b3RpZnkxOiBOT1RJRlkgYzE7CiBzdGVwIGxiZWdpbnM6IEJFR0lOIElTT0xBVElPTiBMRVZF TCBTRVJJQUxJWkFCTEU7CkBAIC0xMDQsNiArMjE1LDE3IEBAIHN0ZXAgbDJjb21taXQ6IENP TU1JVDsKIGxpc3RlbmVyMjogTk9USUZZICJjMSIgd2l0aCBwYXlsb2FkICIiIGZyb20gbm90 aWZpZXIKIHN0ZXAgbDJzdG9wOiBVTkxJU1RFTiAqOwogCitzdGFydGluZyBwZXJtdXRhdGlv bjogbGNoX2xpc3RlbiBuY2hfbm90aWZ5IGxjaF9jaGVjaworc3RlcCBsY2hfbGlzdGVuOiBM SVNURU4gY2g7CitzdGVwIG5jaF9ub3RpZnk6IE5PVElGWSBjaCwgJ2FhJzsKK3N0ZXAgbGNo X2NoZWNrOiBTRUxFQ1QgMSBBUyB4OworeAorLQorMQorKDEgcm93KQorCitsaXN0ZW5lcl9j aDogTk9USUZZICJjaCIgd2l0aCBwYXlsb2FkICJhYSIgZnJvbSBub3RpZmllcl9jaAorCiBz dGFydGluZyBwZXJtdXRhdGlvbjogbGxpc3RlbiBsYmVnaW4gdXNhZ2UgYmlnbm90aWZ5IHVz YWdlCiBzdGVwIGxsaXN0ZW46IExJU1RFTiBjMTsgTElTVEVOIGMyOwogc3RlcCBsYmVnaW46 IEJFR0lOOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNzL2FzeW5jLW5v dGlmeS5zcGVjIGIvc3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNzL2FzeW5jLW5vdGlmeS5zcGVj CmluZGV4IDBiOGNmZDkxMDgzLi5kMDljMjI5N2YwOSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3Qv aXNvbGF0aW9uL3NwZWNzL2FzeW5jLW5vdGlmeS5zcGVjCisrKyBiL3NyYy90ZXN0L2lzb2xh dGlvbi9zcGVjcy9hc3luYy1ub3RpZnkuc3BlYwpAQCAtMzEsNiArMzEsMjAgQEAgc3RlcCBu b3RpZnlzMQl7CiAJUk9MTEJBQ0sgVE8gU0FWRVBPSU5UIHMyOwogCUNPTU1JVDsKIH0KK3N0 ZXAgbm90aWZ5c19zaW1wbGUJeworCUJFR0lOOworCVNBVkVQT0lOVCBzMTsKKwlOT1RJRlkg YzEsICdzaW1wbGUxJzsKKwlOT1RJRlkgYzIsICdzaW1wbGUyJzsKKwlSRUxFQVNFIFNBVkVQ T0lOVCBzMTsKKwlDT01NSVQ7Cit9CitzdGVwIG5vdGlmeV9tYW55X3dpdGhfZHVwCXsKKwlC RUdJTjsKKwlTRUxFQ1QgcGdfbm90aWZ5KCdjMScsICdtc2cnIHx8IHM6OnRleHQpIEZST00g Z2VuZXJhdGVfc2VyaWVzKDEsIDE3KSBzOworCVNFTEVDVCBwZ19ub3RpZnkoJ2MxJywgJ21z ZzEnKTsKKwlDT01NSVQ7Cit9CiBzdGVwIHVzYWdlCQl7IFNFTEVDVCBwZ19ub3RpZmljYXRp b25fcXVldWVfdXNhZ2UoKSA+IDAgQVMgbm9uemVybzsgfQogc3RlcCBiaWdub3RpZnkJeyBT RUxFQ1QgY291bnQocGdfbm90aWZ5KCdjMScsIHM6OnRleHQpKSBGUk9NIGdlbmVyYXRlX3Nl cmllcygxLCAxMDAwKSBzOyB9CiB0ZWFyZG93bgkJeyBVTkxJU1RFTiAqOyB9CkBAIC00Myw2 ICs1Nyw3IEBAIHN0ZXAgbGNoZWNrCQl7IFNFTEVDVCAxIEFTIHg7IH0KIHN0ZXAgbGJlZ2lu CQl7IEJFR0lOOyB9CiBzdGVwIGxiZWdpbnMJeyBCRUdJTiBJU09MQVRJT04gTEVWRUwgU0VS SUFMSVpBQkxFOyB9CiBzdGVwIGxjb21taXQJeyBDT01NSVQ7IH0KK3N0ZXAgbHVubGlzdGVu X2FsbAl7IEJFR0lOOyBMSVNURU4gYzE7IFVOTElTVEVOICo7IENPTU1JVDsgfQogdGVhcmRv d24JCXsgVU5MSVNURU4gKjsgfQogCiAjIEluIHNvbWUgdGVzdHMgd2UgbmVlZCBhIHNlY29u ZCBsaXN0ZW5lciwganVzdCB0byBibG9jayB0aGUgcXVldWUuCkBAIC01Myw2ICs2OCwzOCBA QCBzdGVwIGwyYmVnaW4JeyBCRUdJTjsgfQogc3RlcCBsMmNvbW1pdAl7IENPTU1JVDsgfQog c3RlcCBsMnN0b3AJCXsgVU5MSVNURU4gKjsgfQogCisjIFRoaXJkIGxpc3RlbmVyIHNlc3Np b24gZm9yIHRlc3RpbmcgYXJyYXkgZ3Jvd3RoLgorCitzZXNzaW9uIGxpc3RlbmVyMworc3Rl cCBsM2xpc3Rlbgl7IExJU1RFTiBjMTsgfQordGVhcmRvd24JCXsgVU5MSVNURU4gKjsgfQor CisjIExpc3RlbmVyIHNlc3Npb24gZm9yIGNyb3NzLXNlc3Npb24gbm90aWZpY2F0aW9uIHRl c3Qgd2l0aCBjaGFubmVsICdjaCcuCisKK3Nlc3Npb24gbGlzdGVuZXJfY2gKK3N0ZXAgbGNo X2xpc3Rlbgl7IExJU1RFTiBjaDsgfQorc3RlcCBsY2hfY2hlY2sJeyBTRUxFQ1QgMSBBUyB4 OyB9Cit0ZWFyZG93bgkJeyBVTkxJU1RFTiAqOyB9CisKKyMgTm90aWZpZXIgc2Vzc2lvbiBm b3IgY3Jvc3Mtc2Vzc2lvbiBub3RpZmljYXRpb24gdGVzdCB3aXRoIGNoYW5uZWwgJ2NoJy4K Kworc2Vzc2lvbiBub3RpZmllcl9jaAorc3RlcCBuY2hfbm90aWZ5CXsgTk9USUZZIGNoLCAn YWEnOyB9CisKKyMgU2Vzc2lvbiBmb3IgdGVzdGluZyBMSVNURU4gaW4gc3VidHJhbnNhY3Rp b24gd2l0aCBzZXBhcmF0ZSBzdGVwcy4KKworc2Vzc2lvbiBsaXN0ZW5fc3VieGFjdAorc3Rl cCBsc2JlZ2luCXsgQkVHSU47IH0KK3N0ZXAgbHNsaXN0ZW5fb3V0ZXIJeyBMSVNURU4gYzM7 IH0KK3N0ZXAgbHNzYXZlcG9pbnQJeyBTQVZFUE9JTlQgczE7IH0KK3N0ZXAgbHNsaXN0ZW4J eyBMSVNURU4gYzE7IExJU1RFTiBjMjsgfQorc3RlcCBsc3JlbGVhc2UJeyBSRUxFQVNFIFNB VkVQT0lOVCBzMTsgfQorc3RlcCBsc3JvbGxiYWNrCXsgUk9MTEJBQ0sgVE8gU0FWRVBPSU5U IHMxOyB9CitzdGVwIGxzY29tbWl0CXsgQ09NTUlUOyB9CitzdGVwIGxzbm90aWZ5CXsgTk9U SUZZIGMxLCAnc3VieGFjdF90ZXN0JzsgfQorc3RlcCBsc25vdGlmeV9jaGVjawl7IE5PVElG WSBjMSwgJ3Nob3VsZF9ub3RfcmVjZWl2ZSc7IH0KK3RlYXJkb3duCQl7IFVOTElTVEVOICo7 IH0KKwogCiAjIFRyaXZpYWwgY2FzZXMuCiBwZXJtdXRhdGlvbiBsaXN0ZW5jIG5vdGlmeTEg bm90aWZ5MiBub3RpZnkzIG5vdGlmeWYKQEAgLTYwLDYgKzEwNywyNyBAQCBwZXJtdXRhdGlv biBsaXN0ZW5jIG5vdGlmeTEgbm90aWZ5MiBub3RpZnkzIG5vdGlmeWYKICMgQ2hlY2sgc2lt cGxlIGFuZCBsZXNzLXNpbXBsZSBkZWR1cGxpY2F0aW9uLgogcGVybXV0YXRpb24gbGlzdGVu YyBub3RpZnlkMSBub3RpZnlkMiBub3RpZnlzMQogCisjIENoZWNrIHNpbXBsZSBOT1RJRlkg cmVwYXJlbnRpbmcgd2hlbiBwYXJlbnQgaGFzIG5vIGFjdGlvbi4KK3Blcm11dGF0aW9uIGxp c3RlbmMgbm90aWZ5c19zaW1wbGUKKworIyBDaGVjayBMSVNURU4gcmVwYXJlbnRpbmcgaW4g c3VidHJhbnNhY3Rpb24uCitwZXJtdXRhdGlvbiBsc2JlZ2luIGxzc2F2ZXBvaW50IGxzbGlz dGVuIGxzcmVsZWFzZSBsc2NvbW1pdCBsc25vdGlmeQorCisjIENoZWNrIExJU1RFTiBtZXJn ZSBwYXRoIHdoZW4gYm90aCBvdXRlciBhbmQgaW5uZXIgdHJhbnNhY3Rpb25zIGhhdmUgYWN0 aW9ucy4KK3Blcm11dGF0aW9uIGxzYmVnaW4gbHNsaXN0ZW5fb3V0ZXIgbHNzYXZlcG9pbnQg bHNsaXN0ZW4gbHNyZWxlYXNlIGxzY29tbWl0IGxzbm90aWZ5CisKKyMgQ2hlY2sgTElTVEVO IGFib3J0IHBhdGggKFJPTExCQUNLIFRPIFNBVkVQT0lOVCBkaXNjYXJkcyBwZW5kaW5nIGFj dGlvbnMpLgorcGVybXV0YXRpb24gbHNiZWdpbiBsc3NhdmVwb2ludCBsc2xpc3RlbiBsc3Jv bGxiYWNrIGxzY29tbWl0IGxzbm90aWZ5X2NoZWNrCisKKyMgQ2hlY2sgVU5MSVNURU4gKiBj YW5jZWxzIGEgTElTVEVOIGluIHRoZSBzYW1lIHRyYW5zYWN0aW9uLgorcGVybXV0YXRpb24g bHVubGlzdGVuX2FsbCBub3RpZnkxIGxjaGVjaworCisjIENoZWNrIG5vdGlmaWNhdGlvbl9t YXRjaCBmdW5jdGlvbiAodHJpZ2dlcmVkIGJ5IGhhc2ggdGFibGUgZHVwbGljYXRlIGRldGVj dGlvbikuCitwZXJtdXRhdGlvbiBsaXN0ZW5jIG5vdGlmeV9tYW55X3dpdGhfZHVwCisKKyMg Q2hlY2sgQ2hhbm5lbEhhc2hBZGRMaXN0ZW5lciBhcnJheSBncm93dGguCitwZXJtdXRhdGlv biBsaXN0ZW5jIGxsaXN0ZW4gbDJsaXN0ZW4gbDNsaXN0ZW4gbHNsaXN0ZW4KKwogIyBDcm9z cy1iYWNrZW5kIG5vdGlmaWNhdGlvbiBkZWxpdmVyeS4gIFdlIHVzZSBhICJzZWxlY3QgMSIg dG8gZm9yY2UgdGhlCiAjIGxpc3RlbmVyIHNlc3Npb24gdG8gY2hlY2sgZm9yIG5vdGlmaWVz LiAgSW4gcHJpbmNpcGxlIHdlIGNvdWxkIGp1c3Qgd2FpdAogIyBmb3IgZGVsaXZlcnksIGJ1 dCB0aGF0IHdvdWxkIHJlcXVpcmUgZXh0cmEgc3VwcG9ydCBpbiBpc29sYXRpb250ZXN0ZXIK QEAgLTczLDYgKzE0MSwxMCBAQCBwZXJtdXRhdGlvbiBsaXN0ZW5jIGxsaXN0ZW4gbm90aWZ5 MSBub3RpZnkyIG5vdGlmeTMgbm90aWZ5ZiBsY2hlY2sKICMgYW5kIG5vdGlmeSBxdWV1ZSBp cyBub3QgZW1wdHkKIHBlcm11dGF0aW9uIGwybGlzdGVuIGwyYmVnaW4gbm90aWZ5MSBsYmVn aW5zIGxsaXN0ZW4gbGNvbW1pdCBsMmNvbW1pdCBsMnN0b3AKIAorIyBDaGVjayB0aGF0IG5v dGlmaWNhdGlvbnMgc2VudCBmcm9tIGEgYmFja2VuZCB0aGF0IGhhcyBub3QgZG9uZSBMSVNU RU4KKyMgYXJlIHByb3Blcmx5IGRlbGl2ZXJlZCB0byBhIGxpc3RlbmVyIGluIGFub3RoZXIg YmFja2VuZC4KK3Blcm11dGF0aW9uIGxjaF9saXN0ZW4gbmNoX25vdGlmeSBsY2hfY2hlY2sK KwogIyBWZXJpZnkgdGhhdCBwZ19ub3RpZmljYXRpb25fcXVldWVfdXNhZ2UgY29ycmVjdGx5 IHJlcG9ydHMgYSBub24temVybyByZXN1bHQsCiAjIGFmdGVyIHN1Ym1pdHRpbmcgbm90aWZp Y2F0aW9ucyB3aGlsZSBhbm90aGVyIGNvbm5lY3Rpb24gaXMgbGlzdGVuaW5nIGZvcgogIyB0 aG9zZSBub3RpZmljYXRpb25zIGFuZCB3YWl0aW5nIGluc2lkZSBhbiBhY3RpdmUgdHJhbnNh Y3Rpb24uICBXZSBoYXZlIHRvCi0tIAoyLjUwLjEKCg== --e7f9d88d3b6b4165867e81756e908ce5 Content-Disposition: attachment; filename*0="0002-optimize_listen_notify-v34.patch" Content-Type: application/octet-stream; name="=?UTF-8?Q?0002-optimize=5Flisten=5Fnotify-v34.patch?=" Content-Transfer-Encoding: base64 RnJvbSA4MGJmNTc5NWQ4NGE5NWEyZWIwZGI4ZDU1MmQxMWNkZGFkMGE0NWY4IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogU2F0LCAyNyBEZWMgMjAyNSAwODowNzowMyArMDEwMApTdWJqZWN0OiBbUEFU Q0ggMi8yXSBPcHRpbWl6ZSBMSVNURU4vTk9USUZZIHdpdGggc2hhcmVkIGNoYW5uZWwgbWFw IGFuZCBkaXJlY3QKIGFkdmFuY2VtZW50CgpUaGlzIHBhdGNoIHJld29ya3MgdGhlIExJU1RF Ti9OT1RJRlkgc2lnbmFsaW5nIHBhdGggdG8gYXZvaWQgdGhlCmxvbmctc3RhbmRpbmcgaW5l ZmZpY2llbmN5IHdoZXJlIGV2ZXJ5IGNvbW1pdCB3YWtlcyBhbGwgbGlzdGVuaW5nCmJhY2tl bmRzIGluIHRoZSBzYW1lIGRhdGFiYXNlLCBldmVuIHRob3NlIHRoYXQgYXJlIGxpc3Rlbmlu ZyBvbgpjb21wbGV0ZWx5IGRpZmZlcmVudCBjaGFubmVscy4KClByb2JsZW0KLS0tLS0tLQoK QXQgcHJlc2VudCwgU2lnbmFsQmFja2VuZHMgaGFzIG5vIGNlbnRyYWwga25vd2xlZGdlIG9m IHdoaWNoIGJhY2tlbmQKbGlzdGVucyBvbiB3aGljaCBjaGFubmVsLiBXaGVuIGEgYmFja2Vu ZCBjb21taXRzIGEgdHJhbnNhY3Rpb24gdGhhdAppc3N1ZWQgTk9USUZZLCBpdCBzaW1wbHkg aXRlcmF0ZXMgb3ZlciBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgaW4gdGhlCnNhbWUgZGF0 YWJhc2UgYW5kIHNlbmRzIGVhY2ggb25lIGEgUFJPQ1NJR19OT1RJRllfSU5URVJSVVBUIHNp Z25hbC4KClRoYXQgYmVoYXZpb3IgaXMgZmluZSB3aGVuIGFsbCBsaXN0ZW5lcnMgYXJlIG9u IHRoZSBzYW1lIGNoYW5uZWwsIGJ1dAp3aGVuIG1hbnkgYmFja2VuZHMgYXJlIGxpc3Rlbmlu ZyBvbiBkaWZmZXJlbnQgY2hhbm5lbHMsIGVhY2ggTk9USUZZCnRyaWdnZXJzIGEgc3Rvcm0g b2YgdW5uZWNlc3Nhcnkgd2FrZXVwcyBhbmQgY29udGV4dCBzd2l0Y2hlcy4gQXMgdGhlCm51 bWJlciBvZiBpZGxlIGxpc3RlbmVycyBncm93cywgdGhpcyBvZnRlbiBiZWNvbWVzIHRoZSBi b3R0bGVuZWNrIGFuZAp0aHJvdWdocHV0IGRyb3BzIHNoYXJwbHkuCgpPdmVydmlldyBvZiB0 aGUgc29sdXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGlzIHBhdGNoIGludHJv ZHVjZXMgYSBsYXppbHktY3JlYXRlZCBkeW5hbWljIHNoYXJlZCBoYXNoIChkc2hhc2gpCmJh Y2tlZCBieSBkeW5hbWljIHNoYXJlZCBtZW1vcnkgKERTQSkgdGhhdCBtYXBzIChkYm9pZCwg Y2hhbm5lbCkgdG8KYXJyYXlzIG9mIGxpc3RlbmluZyBiYWNrZW5kcyAoUHJvY051bWJlcnMp LiBUaGlzIGFsbG93cyB0aGUgc2VuZGVyIHRvCnRhcmdldCBvbmx5IHRob3NlIGJhY2tlbmRz IGFjdHVhbGx5IGxpc3RlbmluZyBvbiB0aGUgY2hhbm5lbHMgZm9yIHdoaWNoCml0IGhhcyBx dWV1ZWQgbm90aWZpY2F0aW9ucy4KCkxJU1RFTiBzdGF0ZSB0cmFja2luZwotLS0tLS0tLS0t LS0tLS0tLS0tLS0KCkxJU1RFTiBzdGF0ZSBpcyB0cmFja2VkIGF0IHRocmVlIGxldmVsczoK CiAgLSBwZW5kaW5nTGlzdGVuQWN0aW9uczogcGVyLXRyYW5zYWN0aW9uIHBlbmRpbmcgY2hh bmdlcwogIC0gbG9jYWxDaGFubmVsVGFibGU6IHBlci1iYWNrZW5kIGNvbW1pdHRlZCBzdGF0 ZSBjYWNoZQogIC0gZ2xvYmFsQ2hhbm5lbFRhYmxlOiBjbHVzdGVyLXdpZGUgc2hhcmVkIHN0 YXRlCgpUaGUgZmlyc3QgdHdvIGFyZSBsb2NhbCBoYXNoIHRhYmxlcywgdGhlIHRoaXJkIGlz IGEgZHNoYXNoIGluIHNoYXJlZAptZW1vcnkuIFByZUNvbW1pdF9Ob3RpZnkgdXBkYXRlcyBh bGwgdGhyZWUgKGRvaW5nIGFueSBhbGxvY2F0aW9ucyBiZWZvcmUKY2xvZyBjb21taXQgZm9y IE9PTSBzYWZldHkpLCBhbmQgQXRDb21taXRfTm90aWZ5IGZpbmFsaXplcyB0aGUgY2hhbmdl cy4KClVzaW5nIGEgaGFzaCB0YWJsZSBmb3IgcGVuZGluZ0xpc3RlbkFjdGlvbnMgcHJvdmlk ZXMgYXV0b21hdGljCmRlZHVwbGljYXRpb246IExJU1RFTiBmb287IFVOTElTVEVOIGZvbzsg TElTVEVOIGZvbyBjb2xsYXBzZXMgdG8gb25lCmVudHJ5IHN0b3JpbmcgdGhlIGZpbmFsIHN0 YXRlLCB3aGljaCB3ZSBqdXN0IGFwcGx5IGF0IGNvbW1pdC4KCkZvciBMSVNURU4sIFByZUNv bW1pdF9Ob3RpZnkgcHJlLWFsbG9jYXRlcyBlbnRyaWVzIGluIGJvdGggdGhlIGxvY2FsCmxv Y2FsQ2hhbm5lbFRhYmxlIGFuZCB0aGUgc2hhcmVkIGdsb2JhbENoYW5uZWxUYWJsZSAod2l0 aCBsaXN0ZW5pbmc9ZmFsc2UpLgpBdENvbW1pdF9Ob3RpZnkgdGhlbiBzZXRzIGxpc3Rlbmlu Zz10cnVlLgoKRm9yIFVOTElTVEVOLCBQcmVDb21taXRfTm90aWZ5IG9ubHkgcmVjb3JkcyB0 aGUgaW50ZW50IGluCnBlbmRpbmdMaXN0ZW5BY3Rpb25zLiBBdENvbW1pdF9Ob3RpZnkgcmVt b3ZlcyB0aGUgZW50cnkgZnJvbQpnbG9iYWxDaGFubmVsVGFibGUgYW5kIGxvY2FsQ2hhbm5l bFRhYmxlLgoKT24gYWJvcnQsIGVudHJpZXMgd2l0aCBsaXN0ZW5pbmc9ZmFsc2UgKHN0YWdl ZCBidXQgbmV2ZXIgY29tbWl0dGVkKSBhcmUKcmVtb3ZlZCBmcm9tIGdsb2JhbENoYW5uZWxU YWJsZSBhbmQgbG9jYWxDaGFubmVsVGFibGUuCgpTaWduYWwgYXJyYXlzIGZvciBzZW5kaW5n IG5vdGlmaWNhdGlvbnMgYXJlIGFsc28gcHJlYWxsb2NhdGVkIGluClByZUNvbW1pdF9Ob3Rp ZnkgdG8gYXZvaWQgYWxsb2NhdGlvbiBmYWlsdXJlcyBhZnRlciBjb21taXR0aW5nIHRvIGNs b2cuCgpEaXJlY3QgYWR2YW5jZW1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tCgpBIGZ1cnRoZXIg b3B0aW1pemF0aW9uIGF2b2lkcyBzaWduYWxpbmcgaWRsZSBiYWNrZW5kcyB0aGF0IGFyZSBu b3QKbGlzdGVuaW5nIG9uIGFueSBvZiB0aGUgY2hhbm5lbHMgbm90aWZpZWQgd2l0aGluIHRo ZSB0cmFuc2FjdGlvbi4KCldoaWxlIHF1ZXVpbmcgbm90aWZpY2F0aW9ucywgUHJlQ29tbWl0 X05vdGlmeSByZWNvcmRzIHRoZSBxdWV1ZSBoZWFkCnBvc2l0aW9uIGJvdGggYmVmb3JlIGFu ZCBhZnRlciB3cml0aW5nIGl0cyBub3RpZmljYXRpb25zLiBCZWNhdXNlIGFsbAp3cml0ZXJz IGFyZSBzZXJpYWxpemVkIGJ5IHRoZSBleGlzdGluZyBjbHVzdGVyLXdpZGUgaGVhdnl3ZWln aHQgbG9jayBvbgoiZGF0YWJhc2UgMCIsIG5vIGJhY2tlbmQgKGZyb20gYW55IGRhdGFiYXNl KSBjYW4gaW5zZXJ0IGVudHJpZXMgYmV0d2Vlbgp0aG9zZSB0d28gcG9pbnRzLiBUaGlzIGd1 YXJhbnRlZXMgdGhhdCB0aGUgcmVnaW9uIFtvbGRIZWFkLCBuZXdIZWFkKQpjb250YWlucyBv bmx5IHRoZSBlbnRyaWVzIHdyaXR0ZW4gYnkgb3VyIGNvbW1pdC4KClNpZ25hbEJhY2tlbmRz IHVzZXMgdGhpcyBmYWN0IHRvIGRpcmVjdGx5IGFkdmFuY2UgYW55IGJhY2tlbmQgc3RpbGwK cG9zaXRpb25lZCBhdCBvbGRIZWFkIHVwIHRvIG5ld0hlYWQsIGF2b2lkaW5nIGEgbmVlZGxl c3Mgd2FrZXVwIGZvcgpsaXN0ZW5lcnMgdGhhdCB3b3VsZCBvdGhlcndpc2Ugbm90IGZpbmQg YW55IG5vdGlmaWVzIG9mIGludGVyZXN0LgoKVG8gaGFuZGxlIGFkdmFuY2luZyBiYWNrZW5k cyBjb3JyZWN0bHksIGVhY2ggYmFja2VuZCdzIGVudHJ5IHRyYWNrcyBib3RoCndoZXRoZXIg aXQgaXMgY3VycmVudGx5IGFkdmFuY2luZyAoaXNBZHZhbmNpbmcpIGFuZCB0aGUgdGFyZ2V0 IHBvc2l0aW9uCml0IGlzIGFkdmFuY2luZyB0byAoYWR2YW5jaW5nUG9zKS4gVGhpcyBhbGxv d3MgU2lnbmFsQmFja2VuZHMgdG8gc2lnbmFsCmFkdmFuY2luZyBiYWNrZW5kcyBvbmx5IHdo ZW4gdGhlaXIgdGFyZ2V0IHBvc2l0aW9uIHdvdWxkIGxlYXZlIHRoZW0KYmVoaW5kIHRoZSBu ZXcgcXVldWUgaGVhZCwgd2hpbGUgc2FmZWx5IGRpcmVjdC1hZHZhbmNpbmcgaWRsZSBiYWNr ZW5kcwp0aGF0IHdvdWxkIG5vdCBiZSBpbnRlcmVzdGVkIGluIHRoZSBuZXdseSB3cml0dGVu IG5vdGlmaWNhdGlvbnMuCklkbGUgYmFja2VuZHMgdGhhdCBhcmUgc3RhdGlvbmFyeSBhdCBh IHBvc2l0aW9uIGJlZm9yZSB0aGUgb2xkIHF1ZXVlCmhlYWQgYXJlIHNpZ25hbGVkLCBzaW5j ZSB0aGV5IG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4gdGhlIG5vdGlmaWNhdGlvbnMKaW4gYmV0 d2VlbiB0aGVpciBjdXJyZW50IHBvc2l0aW9uIGFuZCB0aGUgb2xkIHF1ZXVlIGhlYWQuCgpP dGhlciBub3RlcwotLS0tLS0tLS0tLQoKVGhlIGxvY2FsQ2hhbm5lbFRhYmxlIHByb3ZpZGVz IGZhc3QgbG9jay1mcmVlIGxvb2t1cHMgZHVyaW5nCm5vdGlmaWNhdGlvbiBwcm9jZXNzaW5n LCBhdm9pZGluZyBjb250ZW50aW9uIG9uIHRoZSBzaGFyZWQgaGFzaCBkdXJpbmcKdGhlIGhp Z2gtZnJlcXVlbmN5IElzTGlzdGVuaW5nT24gY2hlY2tzIHRoYXQgb2NjdXIgZm9yIGV2ZXJ5 Cm5vdGlmaWNhdGlvbiByZWFkIGZyb20gdGhlIHF1ZXVlLgoKVGhpcyBwYXRjaCBhZGRzIExX TG9jayB0cmFuY2hlIE5PVElGWV9DSEFOTkVMX0hBU0ggYW5kIHdhaXQgZXZlbnQKTm90aWZ5 Q2hhbm5lbEhhc2ggZm9yIHZpc2liaWxpdHkuCgpUaGVyZSBhcmUgbm8gdXNlci12aXNpYmxl IGJlaGF2aW9yYWwgY2hhbmdlczsgdGhpcyBpcyBhbiBpbnRlcm5hbApvcHRpbWl6YXRpb24g b25seS4KLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jICAgICAgICAgICAgICAg ICAgfCAxMDg1ICsrKysrKysrKysrKysrLS0tCiAuLi4vdXRpbHMvYWN0aXZpdHkvd2FpdF9l dmVudF9uYW1lcy50eHQgICAgICAgfCAgICAxICsKIHNyYy9pbmNsdWRlL3N0b3JhZ2UvbHds b2NrbGlzdC5oICAgICAgICAgICAgICB8ICAgIDEgKwogc3JjL3Rvb2xzL3BnaW5kZW50L3R5 cGVkZWZzLmxpc3QgICAgICAgICAgICAgIHwgICAgNiArCiA0IGZpbGVzIGNoYW5nZWQsIDg5 OSBpbnNlcnRpb25zKCspLCAxOTQgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvY29tbWFuZHMvYXN5bmMuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5jLmMK aW5kZXggNDBjNDJmNTcyZWQuLjMyYzFkNjZmMDhjIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9jb21tYW5kcy9hc3luYy5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5jLmMK QEAgLTI0LDggKzI0LDEwIEBACiAgKgkgIEFsbCBub3RpZmljYXRpb24gbWVzc2FnZXMgYXJl IHBsYWNlZCBpbiB0aGUgcXVldWUgYW5kIGxhdGVyIHJlYWQgb3V0CiAgKgkgIGJ5IGxpc3Rl bmluZyBiYWNrZW5kcy4KICAqCi0gKgkgIFRoZXJlIGlzIG5vIGNlbnRyYWwga25vd2xlZGdl IG9mIHdoaWNoIGJhY2tlbmQgbGlzdGVucyBvbiB3aGljaCBjaGFubmVsOwotICoJICBldmVy eSBiYWNrZW5kIGhhcyBpdHMgb3duIGxpc3Qgb2YgaW50ZXJlc3RpbmcgY2hhbm5lbHMuCisg KgkgIFdlIGFsc28gbWFpbnRhaW4gYSBkeW5hbWljIHNoYXJlZCBoYXNoIHRhYmxlIChkc2hh c2gpIHRoYXQgbWFwcyBjaGFubmVsCisgKgkgIG5hbWVzIHRvIHRoZSBzZXQgb2YgYmFja2Vu ZHMgbGlzdGVuaW5nIG9uIGVhY2ggY2hhbm5lbC4gVGhpcyB0YWJsZSBpcworICoJICBjcmVh dGVkIGxhemlseSBvbiB0aGUgZmlyc3QgTElTVEVOIGNvbW1hbmQgYW5kIGdyb3dzIGR5bmFt aWNhbGx5IGFzCisgKgkgIG5lZWRlZC4KICAqCiAgKgkgIEFsdGhvdWdoIHRoZXJlIGlzIG9u bHkgb25lIHF1ZXVlLCBub3RpZmljYXRpb25zIGFyZSB0cmVhdGVkIGFzIGJlaW5nCiAgKgkg IGRhdGFiYXNlLWxvY2FsOyB0aGlzIGlzIGRvbmUgYnkgaW5jbHVkaW5nIHRoZSBzZW5kZXIn cyBkYXRhYmFzZSBPSUQKQEAgLTY0LDIwICs2NiwzNSBAQAogICoJICBub3RpZmljYXRpb25z LCB3ZSBjYW4gc3RpbGwgY2FsbCBlbG9nKEVSUk9SLCAuLi4pIGFuZCB0aGUgdHJhbnNhY3Rp b24KICAqCSAgd2lsbCByb2xsIGJhY2suCiAgKgorICoJICBQcmVDb21taXRfTm90aWZ5KCkg YWxzbyBzdGFnZXMgYW55IHBlbmRpbmcgTElTVEVOL1VOTElTVEVOIGFjdGlvbnMuCisgKgkg IExJU1RFTiBvcGVyYXRpb25zIHByZS1hbGxvY2F0ZSBlbnRyaWVzIGluIGJvdGggdGhlIHBl ci1iYWNrZW5kCisgKgkgIGxvY2FsQ2hhbm5lbFRhYmxlIGFuZCB0aGUgc2hhcmVkIGdsb2Jh bENoYW5uZWxUYWJsZSAod2l0aCBsaXN0ZW5pbmc9ZmFsc2UpLgorICoJICBwZW5kaW5nTGlz dGVuQWN0aW9ucyByZWNvcmRzIHRoZSBmaW5hbCBwZXItY2hhbm5lbCBpbnRlbnQgc28gY29t bWl0L2Fib3J0CisgKgkgIGNhbiBhcHBseSBpdCB3aXRoIGEgc2luZ2xlIHBhc3MuICBBbGwg YWxsb2NhdGlvbnMgaGFwcGVuIGJlZm9yZSBjb21taXR0aW5nCisgKgkgIHRvIGNsb2cgc28g ZmFpbHVyZXMgc2FmZWx5IGFib3J0LgorICoKICAqCSAgT25jZSB3ZSBoYXZlIHB1dCBhbGwg b2YgdGhlIG5vdGlmaWNhdGlvbnMgaW50byB0aGUgcXVldWUsIHdlIHJldHVybiB0bwogICoJ ICBDb21taXRUcmFuc2FjdGlvbigpIHdoaWNoIHdpbGwgdGhlbiBkbyB0aGUgYWN0dWFsIHRy YW5zYWN0aW9uIGNvbW1pdC4KICAqCiAgKgkgIEFmdGVyIGNvbW1pdCB3ZSBhcmUgY2FsbGVk IGFub3RoZXIgdGltZSAoQXRDb21taXRfTm90aWZ5KCkpLiBIZXJlIHdlCi0gKgkgIG1ha2Ug YW55IGFjdHVhbCB1cGRhdGVzIHRvIHRoZSBlZmZlY3RpdmUgbGlzdGVuIHN0YXRlIChsaXN0 ZW5DaGFubmVscykuCi0gKgkgIFRoZW4gd2Ugc2lnbmFsIGFueSBiYWNrZW5kcyB0aGF0IG1h eSBiZSBpbnRlcmVzdGVkIGluIG91ciBtZXNzYWdlcwotICoJICAoaW5jbHVkaW5nIG91ciBv d24gYmFja2VuZCwgaWYgbGlzdGVuaW5nKS4gIFRoaXMgaXMgZG9uZSBieQotICoJICBTaWdu YWxCYWNrZW5kcygpLCB3aGljaCBzY2FucyB0aGUgbGlzdCBvZiBsaXN0ZW5pbmcgYmFja2Vu ZHMgYW5kIHNlbmRzIGEKLSAqCSAgUFJPQ1NJR19OT1RJRllfSU5URVJSVVBUIHNpZ25hbCB0 byBldmVyeSBsaXN0ZW5pbmcgYmFja2VuZCAod2UgZG9uJ3QKLSAqCSAga25vdyB3aGljaCBi YWNrZW5kIGlzIGxpc3RlbmluZyBvbiB3aGljaCBjaGFubmVsIHNvIHdlIG11c3Qgc2lnbmFs IHRoZW0KLSAqCSAgYWxsKS4gIFdlIGNhbiBleGNsdWRlIGJhY2tlbmRzIHRoYXQgYXJlIGFs cmVhZHkgdXAgdG8gZGF0ZSwgdGhvdWdoLCBhbmQKLSAqCSAgd2UgY2FuIGFsc28gZXhjbHVk ZSBiYWNrZW5kcyB0aGF0IGFyZSBpbiBvdGhlciBkYXRhYmFzZXMgKHVubGVzcyB0aGV5Ci0g KgkgIGFyZSB3YXkgYmVoaW5kIGFuZCBzaG91bGQgYmUga2lja2VkIHRvIG1ha2UgdGhlbSBh ZHZhbmNlIHRoZWlyCi0gKgkgIHBvaW50ZXJzKS4KKyAqCSAgY29tbWl0IHRoZSBzdGFnZWQg bGlzdGVuL3VubGlzdGVuIGNoYW5nZXMgYnkgc2V0dGluZyBsaXN0ZW5pbmc9dHJ1ZSBmb3IK KyAqCSAgc3RhZ2VkIExJU1RFTnMsIG9yIHJlbW92aW5nIGVudHJpZXMgZm9yIFVOTElTVEVO cy4gIFRoZW4gd2Ugc2lnbmFsIGFueSBiYWNrZW5kcworICoJICB0aGF0IG1heSBiZSBpbnRl cmVzdGVkIGluIG91ciBtZXNzYWdlcyAoaW5jbHVkaW5nIG91ciBvd24gYmFja2VuZCwKKyAq CSAgaWYgbGlzdGVuaW5nKS4gIFRoaXMgaXMgZG9uZSBieSBTaWduYWxCYWNrZW5kcygpLCB3 aGljaCBjb25zdWx0cyB0aGUKKyAqCSAgc2hhcmVkIGdsb2JhbCBjaGFubmVsIHRhYmxlIHRv IGlkZW50aWZ5IGxpc3RlbmVycyBmb3IgdGhlIGNoYW5uZWxzIHRoYXQKKyAqCSAgaGF2ZSBw ZW5kaW5nIG5vdGlmaWNhdGlvbnMgaW4gdGhlIGN1cnJlbnQgZGF0YWJhc2UuICBFYWNoIHNl bGVjdGVkCisgKgkgIGJhY2tlbmQgaXMgbWFya2VkIGFzIGhhdmluZyBhIHdha2V1cCBwZW5k aW5nIHRvIGF2b2lkIGR1cGxpY2F0ZSBzaWduYWxzLAorICoJICBhbmQgYSBQUk9DU0lHX05P VElGWV9JTlRFUlJVUFQgc2lnbmFsIGlzIHNlbnQgdG8gaXQuCisgKgorICoJICBXaGVuIHdy aXRpbmcgbm90aWZpY2F0aW9ucywgUHJlQ29tbWl0X05vdGlmeSgpIHJlY29yZHMgdGhlIHF1 ZXVlIGhlYWQKKyAqCSAgcG9zaXRpb24gYm90aCBiZWZvcmUgYW5kIGFmdGVyIHRoZSB3cml0 ZS4gIEJlY2F1c2UgYWxsIHdyaXRlcnMgc2VyaWFsaXplCisgKgkgIG9uIGEgY2x1c3Rlci13 aWRlIGhlYXZ5d2VpZ2h0IGxvY2ssIG5vIGJhY2tlbmQgY2FuIGluc2VydCBlbnRyaWVzIGJl dHdlZW4KKyAqCSAgdGhlc2UgdHdvIHBvaW50cy4gIFNpZ25hbEJhY2tlbmRzKCkgdXNlcyB0 aGlzIGZhY3QgdG8gZGlyZWN0bHkgYWR2YW5jZSBhbnkKKyAqCSAgYmFja2VuZCB0aGF0IGlz IHN0aWxsIHBvc2l0aW9uZWQgYXQgdGhlIG9sZCBoZWFkLCBvciB3aXRoaW4gdGhlIHJhbmdl CisgKgkgIHdyaXR0ZW4sIGF2b2lkaW5nIHVubmVjZXNzYXJ5IHdha2V1cHMgZm9yIGlkbGUg bGlzdGVuZXJzIHRoYXQgaGF2ZQorICoJICBub3RoaW5nIHRvIHJlYWQuICBCYWNrZW5kcyB0 aGF0IGNhbm5vdCBiZSBkaXJlY3QgYWR2YW5jZWQgYXJlIHNpZ25hbGVkCisgKgkgIGlmIHRo ZXkgYXJlIHN0dWNrIGJlaGluZCB0aGUgb2xkIHF1ZXVlIGhlYWQsIG9yIGFkdmFuY2luZyB0 byBhIHBvc2l0aW9uCisgKgkgIGJlZm9yZSB0aGUgbmV3IHF1ZXVlIGhlYWQsIHNpbmNlIG90 aGVyd2lzZSBub3RpZmljYXRpb25zIGNvdWxkIGJlIGRlbGF5ZWQuCiAgKgogICoJICBGaW5h bGx5LCBhZnRlciB3ZSBhcmUgb3V0IG9mIHRoZSB0cmFuc2FjdGlvbiBhbHRvZ2V0aGVyIGFu ZCBhYm91dCB0byBnbwogICoJICBpZGxlLCB3ZSBzY2FuIHRoZSBxdWV1ZSBmb3IgbWVzc2Fn ZXMgdGhhdCBuZWVkIHRvIGJlIHNlbnQgdG8gb3VyCkBAIC0xMzcsMTQgKzE1NCwxNyBAQAog I2luY2x1ZGUgImNvbW1hbmRzL2FzeW5jLmgiCiAjaW5jbHVkZSAiY29tbW9uL2hhc2hmbi5o IgogI2luY2x1ZGUgImZ1bmNhcGkuaCIKKyNpbmNsdWRlICJsaWIvZHNoYXNoLmgiCiAjaW5j bHVkZSAibGlicHEvbGlicHEuaCIKICNpbmNsdWRlICJsaWJwcS9wcWZvcm1hdC5oIgogI2lu Y2x1ZGUgIm1pc2NhZG1pbi5oIgorI2luY2x1ZGUgInN0b3JhZ2UvZHNtX3JlZ2lzdHJ5Lmgi CiAjaW5jbHVkZSAic3RvcmFnZS9pcGMuaCIKICNpbmNsdWRlICJzdG9yYWdlL2xtZ3IuaCIK ICNpbmNsdWRlICJzdG9yYWdlL3Byb2NzaWduYWwuaCIKICNpbmNsdWRlICJ0Y29wL3Rjb3Bw cm90LmgiCiAjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKKyNpbmNsdWRlICJ1dGlscy9k c2EuaCIKICNpbmNsdWRlICJ1dGlscy9ndWNfaG9va3MuaCIKICNpbmNsdWRlICJ1dGlscy9t ZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL3BzX3N0YXR1cy5oIgpAQCAtMTYyLDYgKzE4 MiwzNiBAQAogICovCiAjZGVmaW5lIE5PVElGWV9QQVlMT0FEX01BWF9MRU5HVEgJKEJMQ0tT WiAtIE5BTUVEQVRBTEVOIC0gMTI4KQogCisvKgorICogR2xvYmFsIGNoYW5uZWwgdGFibGUg ZGVmaW5pdGlvbnMKKyAqCisgKiBUaGlzIGhhc2ggdGFibGUgbWFwcyAoZGF0YWJhc2UgT0lE LCBjaGFubmVsIG5hbWUpIGtleXMgdG8gYXJyYXlzIG9mCisgKiBQcm9jTnVtYmVycyByZXBy ZXNlbnRpbmcgdGhlIGJhY2tlbmRzIGxpc3RlbmluZyBvbiBlYWNoIGNoYW5uZWwuCisgKi8K KworI2RlZmluZSBJTklUSUFMX0xJU1RFTkVSU19BUlJBWV9TSVpFIDQKKwordHlwZWRlZiBz dHJ1Y3QgR2xvYmFsQ2hhbm5lbEtleQoreworCU9pZAkJCWRib2lkOworCWNoYXIJCWNoYW5u ZWxbTkFNRURBVEFMRU5dOworfSBHbG9iYWxDaGFubmVsS2V5OworCisKK3R5cGVkZWYgc3Ry dWN0IExpc3RlbmVyRW50cnkKK3sKKwlQcm9jTnVtYmVyCXByb2NObzsKKwlib29sCQlsaXN0 ZW5pbmc7CQkvKiB0cnVlIGlmIGNvbW1pdHRlZCBsaXN0ZW5lciAqLworfSBMaXN0ZW5lckVu dHJ5OworCit0eXBlZGVmIHN0cnVjdCBHbG9iYWxDaGFubmVsRW50cnkKK3sKKwlHbG9iYWxD aGFubmVsS2V5IGtleTsKKwlkc2FfcG9pbnRlciBsaXN0ZW5lcnNBcnJheTsgLyogRFNBIHBv aW50ZXIgdG8gTGlzdGVuZXJFbnRyeSBhcnJheSAqLworCWludAkJCW51bUxpc3RlbmVyczsJ LyogTnVtYmVyIG9mIGxpc3RlbmVycyBjdXJyZW50bHkgc3RvcmVkICovCisJaW50CQkJYWxs b2NhdGVkTGlzdGVuZXJzOyAvKiBBbGxvY2F0ZWQgc2l6ZSBvZiBhcnJheSAqLworfSBHbG9i YWxDaGFubmVsRW50cnk7CisKIC8qCiAgKiBTdHJ1Y3QgcmVwcmVzZW50aW5nIGFuIGVudHJ5 IGluIHRoZSBnbG9iYWwgbm90aWZ5IHF1ZXVlCiAgKgpAQCAtMjI0LDExICsyNzQsMTQgQEAg dHlwZWRlZiBzdHJ1Y3QgUXVldWVQb3NpdGlvbgogCSAoeCkucGFnZSAhPSAoeSkucGFnZSA/ ICh4KSA6IFwKIAkgKHgpLm9mZnNldCA+ICh5KS5vZmZzZXQgPyAoeCkgOiAoeSkpCiAKKy8q IHJldHVybnMgdHJ1ZSBpZiB4IGNvbWVzIGJlZm9yZSB5IGluIHF1ZXVlIG9yZGVyICovCisj ZGVmaW5lIFFVRVVFX1BPU19QUkVDRURFUyh4LHkpIFwKKwkoYXN5bmNRdWV1ZVBhZ2VQcmVj ZWRlcygoeCkucGFnZSwgKHkpLnBhZ2UpIHx8IFwKKwkgKCh4KS5wYWdlID09ICh5KS5wYWdl ICYmICh4KS5vZmZzZXQgPCAoeSkub2Zmc2V0KSkKKwogLyoKICAqIFBhcmFtZXRlciBkZXRl cm1pbmluZyBob3cgb2Z0ZW4gd2UgdHJ5IHRvIGFkdmFuY2UgdGhlIHRhaWwgcG9pbnRlcjoK LSAqIHdlIGRvIHRoYXQgYWZ0ZXIgZXZlcnkgUVVFVUVfQ0xFQU5VUF9ERUxBWSBwYWdlcyBv ZiBOT1RJRlkgZGF0YS4gIFRoaXMgaXMKLSAqIGFsc28gdGhlIGRpc3RhbmNlIGJ5IHdoaWNo IGEgYmFja2VuZCBpbiBhbm90aGVyIGRhdGFiYXNlIG5lZWRzIHRvIGJlCi0gKiBiZWhpbmQg YmVmb3JlIHdlJ2xsIGRlY2lkZSB3ZSBuZWVkIHRvIHdha2UgaXQgdXAgdG8gYWR2YW5jZSBp dHMgcG9pbnRlci4KKyAqIHdlIGRvIHRoYXQgYWZ0ZXIgZXZlcnkgUVVFVUVfQ0xFQU5VUF9E RUxBWSBwYWdlcyBvZiBOT1RJRlkgZGF0YS4KICAqCiAgKiBSZXNpc3QgdGhlIHRlbXB0YXRp b24gdG8gbWFrZSB0aGlzIHJlYWxseSBsYXJnZS4gIFdoaWxlIHRoYXQgd291bGQgc2F2ZQog ICogd29yayBpbiBzb21lIHBsYWNlcywgaXQgd291bGQgYWRkIGNvc3QgaW4gb3RoZXJzLiAg SW4gcGFydGljdWxhciwgdGhpcwpAQCAtMjQ2LDYgKzI5OSw5IEBAIHR5cGVkZWYgc3RydWN0 IFF1ZXVlQmFja2VuZFN0YXR1cwogCU9pZAkJCWRib2lkOwkJCS8qIGJhY2tlbmQncyBkYXRh YmFzZSBPSUQsIG9yIEludmFsaWRPaWQgKi8KIAlQcm9jTnVtYmVyCW5leHRMaXN0ZW5lcjsJ LyogaWQgb2YgbmV4dCBsaXN0ZW5lciwgb3IgSU5WQUxJRF9QUk9DX05VTUJFUiAqLwogCVF1 ZXVlUG9zaXRpb24gcG9zOwkJCS8qIGJhY2tlbmQgaGFzIHJlYWQgcXVldWUgdXAgdG8gaGVy ZSAqLworCWJvb2wJCXdha2V1cFBlbmRpbmc7CS8qIHNpZ25hbCBzZW50IGJ1dCBub3QgeWV0 IHByb2Nlc3NlZCAqLworCWJvb2wJCWlzQWR2YW5jaW5nOwkvKiBiYWNrZW5kIGlzIGFkdmFu Y2luZyBpdHMgcG9zaXRpb24gKi8KKwlRdWV1ZVBvc2l0aW9uIGFkdmFuY2luZ1BvczsgLyog dGFyZ2V0IHBvc2l0aW9uIGJhY2tlbmQgaXMgYWR2YW5jaW5nIHRvICovCiB9IFF1ZXVlQmFj a2VuZFN0YXR1czsKIAogLyoKQEAgLTI2MCwxNCArMzE2LDE2IEBAIHR5cGVkZWYgc3RydWN0 IFF1ZXVlQmFja2VuZFN0YXR1cwogICogKHNpbmNlIG5vIG90aGVyIGJhY2tlbmQgd2lsbCBp bnNwZWN0IGl0KS4KICAqCiAgKiBXaGVuIGhvbGRpbmcgTm90aWZ5UXVldWVMb2NrIGluIEVY Q0xVU0lWRSBtb2RlLCBiYWNrZW5kcyBjYW4gaW5zcGVjdCB0aGUKLSAqIGVudHJpZXMgb2Yg b3RoZXIgYmFja2VuZHMgYW5kIGFsc28gY2hhbmdlIHRoZSBoZWFkIHBvaW50ZXIuIFdoZW4g aG9sZGluZwotICogYm90aCBOb3RpZnlRdWV1ZUxvY2sgYW5kIE5vdGlmeVF1ZXVlVGFpbExv Y2sgaW4gRVhDTFVTSVZFIG1vZGUsIGJhY2tlbmRzCi0gKiBjYW4gY2hhbmdlIHRoZSB0YWls IHBvaW50ZXJzLgorICogZW50cmllcyBvZiBvdGhlciBiYWNrZW5kcyBhbmQgYWxzbyBjaGFu Z2UgdGhlIGhlYWQgcG9pbnRlci4gVGhleSBjYW4KKyAqIGFsc28gYWR2YW5jZSBvdGhlciBi YWNrZW5kcycgcXVldWUgcG9zaXRpb25zLCB1bmxlc3MgdGhleSBhcmUgbm90CisgKiBpbiB0 aGUgcHJvY2VzcyBvZiBkb2luZyB0aGF0IHRoZW1zZWx2ZXMuIFdoZW4gaG9sZGluZyBib3Ro IE5vdGlmeVF1ZXVlTG9jayBhbmQKKyAqIE5vdGlmeVF1ZXVlVGFpbExvY2sgaW4gRVhDTFVT SVZFIG1vZGUsIGJhY2tlbmRzIGNhbiBjaGFuZ2UgdGhlIHRhaWwgcG9pbnRlcnMuCiAgKgog ICogU0xSVSBidWZmZXIgcG9vbCBpcyBkaXZpZGVkIGluIGJhbmtzIGFuZCBiYW5rIHdpc2Ug U0xSVSBsb2NrIGlzIHVzZWQgYXMKICAqIHRoZSBjb250cm9sIGxvY2sgZm9yIHRoZSBwZ19u b3RpZnkgU0xSVSBidWZmZXJzLgogICogSW4gb3JkZXIgdG8gYXZvaWQgZGVhZGxvY2tzLCB3 aGVuZXZlciB3ZSBuZWVkIG11bHRpcGxlIGxvY2tzLCB3ZSBmaXJzdCBnZXQKLSAqIE5vdGlm eVF1ZXVlVGFpbExvY2ssIHRoZW4gTm90aWZ5UXVldWVMb2NrLCBhbmQgbGFzdGx5IFNMUlUg YmFuayBsb2NrLgorICogTm90aWZ5UXVldWVUYWlsTG9jaywgdGhlbiBOb3RpZnlRdWV1ZUxv Y2ssIHRoZW4gU0xSVSBiYW5rIGxvY2ssIGFuZCBsYXN0bHkKKyAqIGdsb2JhbENoYW5uZWxU YWJsZSBwYXJ0aXRpb24gbG9ja3MuCiAgKgogICogRWFjaCBiYWNrZW5kIHVzZXMgdGhlIGJh Y2tlbmRbXSBhcnJheSBlbnRyeSB3aXRoIGluZGV4IGVxdWFsIHRvIGl0cwogICogUHJvY051 bWJlci4gIFdlIHJlbHkgb24gdGhpcyB0byBtYWtlIFNlbmRQcm9jU2lnbmFsIGZhc3QuCkBA IC0yODgsMTEgKzM0NiwxNiBAQCB0eXBlZGVmIHN0cnVjdCBBc3luY1F1ZXVlQ29udHJvbAog CVByb2NOdW1iZXIJZmlyc3RMaXN0ZW5lcjsJLyogaWQgb2YgZmlyc3QgbGlzdGVuZXIsIG9y CiAJCQkJCQkJCSAqIElOVkFMSURfUFJPQ19OVU1CRVIgKi8KIAlUaW1lc3RhbXBUeiBsYXN0 UXVldWVGaWxsV2FybjsJLyogdGltZSBvZiBsYXN0IHF1ZXVlLWZ1bGwgbXNnICovCisJZHNh X2hhbmRsZQlnbG9iYWxDaGFubmVsVGFibGVEU0E7CisJZHNoYXNoX3RhYmxlX2hhbmRsZSBn bG9iYWxDaGFubmVsVGFibGVEU0g7CiAJUXVldWVCYWNrZW5kU3RhdHVzIGJhY2tlbmRbRkxF WElCTEVfQVJSQVlfTUVNQkVSXTsKIH0gQXN5bmNRdWV1ZUNvbnRyb2w7CiAKIHN0YXRpYyBB c3luY1F1ZXVlQ29udHJvbCAqYXN5bmNRdWV1ZUNvbnRyb2w7CiAKK3N0YXRpYyBkc2FfYXJl YSAqZ2xvYmFsQ2hhbm5lbERTQSA9IE5VTEw7CitzdGF0aWMgZHNoYXNoX3RhYmxlICpnbG9i YWxDaGFubmVsVGFibGUgPSBOVUxMOworCiAjZGVmaW5lIFFVRVVFX0hFQUQJCQkJCShhc3lu Y1F1ZXVlQ29udHJvbC0+aGVhZCkKICNkZWZpbmUgUVVFVUVfVEFJTAkJCQkJKGFzeW5jUXVl dWVDb250cm9sLT50YWlsKQogI2RlZmluZSBRVUVVRV9TVE9QX1BBR0UJCQkJKGFzeW5jUXVl dWVDb250cm9sLT5zdG9wUGFnZSkKQEAgLTMwMSw2ICszNjQsOSBAQCBzdGF0aWMgQXN5bmNR dWV1ZUNvbnRyb2wgKmFzeW5jUXVldWVDb250cm9sOwogI2RlZmluZSBRVUVVRV9CQUNLRU5E X0RCT0lEKGkpCQkoYXN5bmNRdWV1ZUNvbnRyb2wtPmJhY2tlbmRbaV0uZGJvaWQpCiAjZGVm aW5lIFFVRVVFX05FWFRfTElTVEVORVIoaSkJCShhc3luY1F1ZXVlQ29udHJvbC0+YmFja2Vu ZFtpXS5uZXh0TGlzdGVuZXIpCiAjZGVmaW5lIFFVRVVFX0JBQ0tFTkRfUE9TKGkpCQkoYXN5 bmNRdWV1ZUNvbnRyb2wtPmJhY2tlbmRbaV0ucG9zKQorI2RlZmluZSBRVUVVRV9CQUNLRU5E X1dBS0VVUF9QRU5ESU5HKGkpCShhc3luY1F1ZXVlQ29udHJvbC0+YmFja2VuZFtpXS53YWtl dXBQZW5kaW5nKQorI2RlZmluZSBRVUVVRV9CQUNLRU5EX0lTX0FEVkFOQ0lORyhpKQkoYXN5 bmNRdWV1ZUNvbnRyb2wtPmJhY2tlbmRbaV0uaXNBZHZhbmNpbmcpCisjZGVmaW5lIFFVRVVF X0JBQ0tFTkRfQURWQU5DSU5HX1BPUyhpKQkoYXN5bmNRdWV1ZUNvbnRyb2wtPmJhY2tlbmRb aV0uYWR2YW5jaW5nUG9zKQogCiAvKgogICogVGhlIFNMUlUgYnVmZmVyIGFyZWEgdGhyb3Vn aCB3aGljaCB3ZSBhY2Nlc3MgdGhlIG5vdGlmaWNhdGlvbiBxdWV1ZQpAQCAtMzEzLDE2ICsz NzksMjAgQEAgc3RhdGljIFNscnVDdGxEYXRhIE5vdGlmeUN0bERhdGE7CiAjZGVmaW5lIFFV RVVFX0ZVTExfV0FSTl9JTlRFUlZBTAk1MDAwCS8qIHdhcm4gYXQgbW9zdCBvbmNlIGV2ZXJ5 IDVzICovCiAKIC8qCi0gKiBsaXN0ZW5DaGFubmVscyBpZGVudGlmaWVzIHRoZSBjaGFubmVs cyB3ZSBhcmUgYWN0dWFsbHkgbGlzdGVuaW5nIHRvCi0gKiAoaWUsIGhhdmUgY29tbWl0dGVk IGEgTElTVEVOIG9uKS4gIEl0IGlzIGEgc2ltcGxlIGxpc3Qgb2YgY2hhbm5lbCBuYW1lcywK LSAqIGFsbG9jYXRlZCBpbiBUb3BNZW1vcnlDb250ZXh0LgorICogbG9jYWxDaGFubmVsVGFi bGUgY2FjaGVzIHRoZSBjaGFubmVscyB0aGlzIGJhY2tlbmQgaXMgbGlzdGVuaW5nIG9uLgor ICogVXNlZCBieSBJc0xpc3RlbmluZ09uKCkgZm9yIGZhc3QgbG9va3VwcyB3aGVuIHJlYWRp bmcgbm90aWZpY2F0aW9ucy4KKyAqIEVudHJpZXMgYXJlIHByZS1hbGxvY2F0ZWQgZHVyaW5n IFByZUNvbW1pdF9Ob3RpZnkgKGJlZm9yZSBjbG9nIGNvbW1pdCkKKyAqIHNvIGFsbG9jYXRp b24gZmFpbHVyZXMgc2FmZWx5IGFib3J0LiAgT24gYWJvcnQsIHN0YWdlZCBlbnRyaWVzIGFy ZSByZW1vdmVkLgorICogQWxsb2NhdGVkIGluIFRvcE1lbW9yeUNvbnRleHQgc28gaXQgcGVy c2lzdHMgYWNyb3NzIHRyYW5zYWN0aW9ucy4KICAqLwotc3RhdGljIExpc3QgKmxpc3RlbkNo YW5uZWxzID0gTklMOwkvKiBsaXN0IG9mIEMgc3RyaW5ncyAqLworc3RhdGljIEhUQUIgKmxv Y2FsQ2hhbm5lbFRhYmxlID0gTlVMTDsKIAogLyoKICAqIFN0YXRlIGZvciBwZW5kaW5nIExJ U1RFTi9VTkxJU1RFTiBhY3Rpb25zIGNvbnNpc3RzIG9mIGFuIG9yZGVyZWQgbGlzdCBvZgot ICogYWxsIGFjdGlvbnMgcmVxdWVzdGVkIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAg QXMgZXhwbGFpbmVkIGFib3ZlLAotICogd2UgZG9uJ3QgYWN0dWFsbHkgY2hhbmdlIGxpc3Rl bkNoYW5uZWxzIHVudGlsIHdlIHJlYWNoIHRyYW5zYWN0aW9uIGNvbW1pdC4KKyAqIGFsbCBh Y3Rpb25zIHJlcXVlc3RlZCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIER1cmluZyBQ cmVDb21taXRfTm90aWZ5LAorICogd2Ugc3RhZ2UgdGhlc2UgY2hhbmdlcyBpbiBsb2NhbENo YW5uZWxUYWJsZSBhbmQgdGhlIHNoYXJlZCBnbG9iYWxDaGFubmVsVGFibGUKKyAqIGFuZCBi dWlsZCBwZW5kaW5nTGlzdGVuQWN0aW9ucyB0byBjYXB0dXJlIHRoZSBmaW5hbCBwZXItY2hh bm5lbCBpbnRlbnQuCisgKiBPbiBhYm9ydCwgQXRBYm9ydF9Ob3RpZnkgY2xlYW5zIHVwIGFu eSBzdGFnZWQtYnV0LXVuY29tbWl0dGVkIGVudHJpZXMuCiAgKgogICogVGhlIGxpc3QgaXMg a2VwdCBpbiBDdXJUcmFuc2FjdGlvbkNvbnRleHQuICBJbiBzdWJ0cmFuc2FjdGlvbnMsIGVh Y2gKICAqIHN1YnRyYW5zYWN0aW9uIGhhcyBpdHMgb3duIGxpc3QgaW4gaXRzIG93biBDdXJU cmFuc2FjdGlvbkNvbnRleHQsIGJ1dApAQCAtMzM2LDYgKzQwNiwxMiBAQCB0eXBlZGVmIGVu dW0KIAlMSVNURU5fVU5MSVNURU5fQUxMLAogfSBMaXN0ZW5BY3Rpb25LaW5kOwogCit0eXBl ZGVmIGVudW0KK3sKKwlQRU5ESU5HX0xJU1RFTl9BUFBMWV9DT01NSVQsCisJUEVORElOR19M SVNURU5fQVBQTFlfQUJPUlQsCit9IFBlbmRpbmdMaXN0ZW5BcHBseU1vZGU7CisKIHR5cGVk ZWYgc3RydWN0CiB7CiAJTGlzdGVuQWN0aW9uS2luZCBhY3Rpb247CkBAIC0zOTEsNiArNDY3 LDcgQEAgdHlwZWRlZiBzdHJ1Y3QgTm90aWZpY2F0aW9uTGlzdAogCWludAkJCW5lc3RpbmdM ZXZlbDsJLyogY3VycmVudCB0cmFuc2FjdGlvbiBuZXN0aW5nIGRlcHRoICovCiAJTGlzdAkg ICAqZXZlbnRzOwkJCS8qIGxpc3Qgb2YgTm90aWZpY2F0aW9uIHN0cnVjdHMgKi8KIAlIVEFC CSAgICpoYXNodGFiOwkJLyogaGFzaCBvZiBOb3RpZmljYXRpb25IYXNoIHN0cnVjdHMsIG9y IE5VTEwgKi8KKwlIVEFCCSAgICp1bmlxdWVDaGFubmVsTmFtZXM7IC8qIGhhc2ggb2YgdW5p cXVlIGNoYW5uZWwgbmFtZXMsIG9yIE5VTEwgKi8KIAlzdHJ1Y3QgTm90aWZpY2F0aW9uTGlz dCAqdXBwZXI7IC8qIGRldGFpbHMgZm9yIHVwcGVyIHRyYW5zYWN0aW9uIGxldmVscyAqLwog fSBOb3RpZmljYXRpb25MaXN0OwogCkBAIC00MDEsNiArNDc4LDI1IEBAIHN0cnVjdCBOb3Rp ZmljYXRpb25IYXNoCiAJTm90aWZpY2F0aW9uICpldmVudDsJCS8qID0+IHRoZSBhY3R1YWwg Tm90aWZpY2F0aW9uIHN0cnVjdCAqLwogfTsKIAorc3RydWN0IENoYW5uZWxOYW1lCit7CisJ Y2hhcgkJY2hhbm5lbFtOQU1FREFUQUxFTl07Cit9OworCisvKiBQZW5kaW5nIGxpc3RlbiBh Y3Rpb24ga2luZCAqLwordHlwZWRlZiBlbnVtCit7CisJUEVORElOR19MSVNURU4sCisJUEVO RElOR19VTkxJU1RFTiwKK30gUGVuZGluZ0xpc3RlbkFjdGlvbjsKKworLyogRW50cnkgZm9y IHBlbmRpbmdMaXN0ZW5BY3Rpb25zIGhhc2ggdGFibGUgKi8KK3N0cnVjdCBQZW5kaW5nTGlz dGVuRW50cnkKK3sKKwljaGFyCQljaGFubmVsW05BTUVEQVRBTEVOXTsJLyogaGFzaCBrZXkg Ki8KKwlQZW5kaW5nTGlzdGVuQWN0aW9uIGFjdGlvbjsKK307CisKIHN0YXRpYyBOb3RpZmlj YXRpb25MaXN0ICpwZW5kaW5nTm90aWZpZXMgPSBOVUxMOwogCiAvKgpAQCAtNDE4LDYgKzUx NCwzOCBAQCBzdGF0aWMgYm9vbCB1bmxpc3RlbkV4aXRSZWdpc3RlcmVkID0gZmFsc2U7CiAv KiBUcnVlIGlmIHdlJ3JlIGN1cnJlbnRseSByZWdpc3RlcmVkIGFzIGEgbGlzdGVuZXIgaW4g YXN5bmNRdWV1ZUNvbnRyb2wgKi8KIHN0YXRpYyBib29sIGFtUmVnaXN0ZXJlZExpc3RlbmVy ID0gZmFsc2U7CiAKKy8qCisgKiBRdWV1ZSBoZWFkIHBvc2l0aW9ucyBmb3IgZGlyZWN0IGFk dmFuY2VtZW50LgorICogVGhlc2UgYXJlIGNhcHR1cmVkIGR1cmluZyBQcmVDb21taXRfTm90 aWZ5IHdoaWxlIGhvbGRpbmcgdGhlIGhlYXZ5d2VpZ2h0CisgKiBsb2NrIG9uIGRhdGFiYXNl IDAsIGVuc3VyaW5nIG5vIG90aGVyIGJhY2tlbmQgY2FuIGluc2VydCBub3RpZmljYXRpb25z CisgKiBiZXR3ZWVuIHRoZW0uICBTaWduYWxCYWNrZW5kcyB1c2VzIHRoZXNlIHRvIGFkdmFu Y2UgaWRsZSBiYWNrZW5kcy4KKyAqLworc3RhdGljIFF1ZXVlUG9zaXRpb24gcXVldWVIZWFk QmVmb3JlV3JpdGU7CitzdGF0aWMgUXVldWVQb3NpdGlvbiBxdWV1ZUhlYWRBZnRlcldyaXRl OworCisvKgorICogTGlzdCBvZiBjaGFubmVscyB3aXRoIHBlbmRpbmcgbm90aWZpY2F0aW9u cyBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKyAqLworc3RhdGljIExpc3QgKnBlbmRp bmdOb3RpZnlDaGFubmVscyA9IE5JTDsKKworLyoKKyAqIEhhc2ggdGFibGUgcmVjb3JkaW5n IHRoZSBmaW5hbCBsaXN0ZW4gaW50ZW50IHBlciBjaGFubmVsIGZvciB0aGlzIHRyYW5zYWN0 aW9uLgorICogS2V5IGlzIGNoYW5uZWwgbmFtZSwgdmFsdWUgaXMgUEVORElOR19MSVNURU4g b3IgUEVORElOR19VTkxJU1RFTi4gIFRoaXMga2VlcHMKKyAqIGNvbW1pdC9hYm9ydCBwcm9j ZXNzaW5nIHRvIG9uZSBwYXNzIHBlciBjaGFubmVsIGluc3RlYWQgb2YgcmVwbGF5aW5nIGV2 ZXJ5CisgKiBhY3Rpb24uICBQb3B1bGF0ZWQgZHVyaW5nIFByZUNvbW1pdF9Ob3RpZnkgYW5k IHVzZWQgYnkgQXRDb21taXRfTm90aWZ5IGFuZAorICogQXRBYm9ydF9Ob3RpZnkuCisgKi8K K3N0YXRpYyBIVEFCICpwZW5kaW5nTGlzdGVuQWN0aW9ucyA9IE5VTEw7CisKKy8qCisgKiBQ cmVhbGxvY2F0ZWQgYXJyYXlzIGZvciBTaWduYWxCYWNrZW5kcyB0byBhdm9pZCBtZW1vcnkg YWxsb2NhdGlvbiBhZnRlcgorICogY29tbWl0dGluZyB0byBjbG9nLiAgQWxsb2NhdGVkIGlu IFByZUNvbW1pdF9Ob3RpZnkgd2hlbiB0aGVyZSBhcmUgcGVuZGluZworICogbm90aWZpY2F0 aW9ucy4KKyAqLworc3RhdGljIGludDMyICpzaWduYWxQaWRzID0gTlVMTDsKK3N0YXRpYyBQ cm9jTnVtYmVyICpzaWduYWxQcm9jbm9zID0gTlVMTDsKKworCiAvKiBoYXZlIHdlIGFkdmFu Y2VkIHRvIGEgcGFnZSB0aGF0J3MgYSBtdWx0aXBsZSBvZiBRVUVVRV9DTEVBTlVQX0RFTEFZ PyAqLwogc3RhdGljIGJvb2wgdHJ5QWR2YW5jZVRhaWwgPSBmYWxzZTsKIApAQCAtNDI4LDE0 ICs1NTYsMTYgQEAgYm9vbAkJVHJhY2Vfbm90aWZ5ID0gZmFsc2U7CiBpbnQJCQltYXhfbm90 aWZ5X3F1ZXVlX3BhZ2VzID0gMTA0ODU3NjsKIAogLyogbG9jYWwgZnVuY3Rpb24gcHJvdG90 eXBlcyAqLwotc3RhdGljIGlubGluZSBpbnQ2NCBhc3luY1F1ZXVlUGFnZURpZmYoaW50NjQg cCwgaW50NjQgcSk7CiBzdGF0aWMgaW5saW5lIGJvb2wgYXN5bmNRdWV1ZVBhZ2VQcmVjZWRl cyhpbnQ2NCBwLCBpbnQ2NCBxKTsKIHN0YXRpYyB2b2lkIHF1ZXVlX2xpc3RlbihMaXN0ZW5B Y3Rpb25LaW5kIGFjdGlvbiwgY29uc3QgY2hhciAqY2hhbm5lbCk7CiBzdGF0aWMgdm9pZCBB c3luY19Vbmxpc3Rlbk9uRXhpdChpbnQgY29kZSwgRGF0dW0gYXJnKTsKLXN0YXRpYyB2b2lk IEV4ZWNfTGlzdGVuUHJlQ29tbWl0KHZvaWQpOwotc3RhdGljIHZvaWQgRXhlY19MaXN0ZW5D b21taXQoY29uc3QgY2hhciAqY2hhbm5lbCk7Ci1zdGF0aWMgdm9pZCBFeGVjX1VubGlzdGVu Q29tbWl0KGNvbnN0IGNoYXIgKmNoYW5uZWwpOwotc3RhdGljIHZvaWQgRXhlY19Vbmxpc3Rl bkFsbENvbW1pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIEJlY29tZVJlZ2lzdGVyZWRMaXN0ZW5l cih2b2lkKTsKK3N0YXRpYyB2b2lkIFByZXBhcmVUYWJsZUVudHJpZXNGb3JMaXN0ZW4oY29u c3QgY2hhciAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZCBQcmVwYXJlVGFibGVFbnRyaWVzRm9y VW5saXN0ZW4oY29uc3QgY2hhciAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZCBQcmVwYXJlVGFi bGVFbnRyaWVzRm9yVW5saXN0ZW5BbGwodm9pZCk7CitzdGF0aWMgdm9pZCBBcHBseVBlbmRp bmdMaXN0ZW5BY3Rpb25zKFBlbmRpbmdMaXN0ZW5BcHBseU1vZGUgbW9kZSk7CitzdGF0aWMg dm9pZCBSZW1vdmVMaXN0ZW5lckZyb21DaGFubmVsKEdsb2JhbENoYW5uZWxFbnRyeSAqKmVu dHJ5X3B0ciwgTGlzdGVuZXJFbnRyeSAqbGlzdGVuZXJzLCBpbnQgaWR4KTsKK3N0YXRpYyB2 b2lkIENsZWFudXBMaXN0ZW5lcnNPbkV4aXQodm9pZCk7CiBzdGF0aWMgYm9vbCBJc0xpc3Rl bmluZ09uKGNvbnN0IGNoYXIgKmNoYW5uZWwpOwogc3RhdGljIHZvaWQgYXN5bmNRdWV1ZVVu cmVnaXN0ZXIodm9pZCk7CiBzdGF0aWMgYm9vbCBhc3luY1F1ZXVlSXNGdWxsKHZvaWQpOwpA QCAtNDU2LDE2ICs1ODYsOSBAQCBzdGF0aWMgdm9pZCBBZGRFdmVudFRvUGVuZGluZ05vdGlm aWVzKE5vdGlmaWNhdGlvbiAqbik7CiBzdGF0aWMgdWludDMyIG5vdGlmaWNhdGlvbl9oYXNo KGNvbnN0IHZvaWQgKmtleSwgU2l6ZSBrZXlzaXplKTsKIHN0YXRpYyBpbnQJbm90aWZpY2F0 aW9uX21hdGNoKGNvbnN0IHZvaWQgKmtleTEsIGNvbnN0IHZvaWQgKmtleTIsIFNpemUga2V5 c2l6ZSk7CiBzdGF0aWMgdm9pZCBDbGVhclBlbmRpbmdBY3Rpb25zQW5kTm90aWZpZXModm9p ZCk7Ci0KLS8qCi0gKiBDb21wdXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHF1ZXVl IHBhZ2UgbnVtYmVycy4KLSAqIFByZXZpb3VzbHkgdGhpcyBmdW5jdGlvbiBhY2NvdW50ZWQg Zm9yIGEgd3JhcGFyb3VuZC4KLSAqLwotc3RhdGljIGlubGluZSBpbnQ2NAotYXN5bmNRdWV1 ZVBhZ2VEaWZmKGludDY0IHAsIGludDY0IHEpCi17Ci0JcmV0dXJuIHAgLSBxOwotfQorc3Rh dGljIGlubGluZSB2b2lkIEdsb2JhbENoYW5uZWxLZXlJbml0KEdsb2JhbENoYW5uZWxLZXkg KmtleSwgT2lkIGRib2lkLCBjb25zdCBjaGFyICpjaGFubmVsKTsKK3N0YXRpYyBkc2hhc2hf aGFzaCBnbG9iYWxDaGFubmVsVGFibGVIYXNoKGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IHNp emUsIHZvaWQgKmFyZyk7CitzdGF0aWMgdm9pZCBpbml0R2xvYmFsQ2hhbm5lbFRhYmxlKHZv aWQpOwogCiAvKgogICogRGV0ZXJtaW5lcyB3aGV0aGVyIHAgcHJlY2VkZXMgcS4KQEAgLTQ3 Nyw2ICs2MDAsMTMxIEBAIGFzeW5jUXVldWVQYWdlUHJlY2VkZXMoaW50NjQgcCwgaW50NjQg cSkKIAlyZXR1cm4gcCA8IHE7CiB9CiAKKy8qCisgKiBnbG9iYWxDaGFubmVsVGFibGVIYXNo CisgKgkJSGFzaCBmdW5jdGlvbiBmb3IgZ2xvYmFsIGNoYW5uZWwgdGFibGUga2V5cy4KKyAq Lworc3RhdGljIGRzaGFzaF9oYXNoCitnbG9iYWxDaGFubmVsVGFibGVIYXNoKGNvbnN0IHZv aWQgKmtleSwgc2l6ZV90IHNpemUsIHZvaWQgKmFyZykKK3sKKwljb25zdCBHbG9iYWxDaGFu bmVsS2V5ICprID0gKGNvbnN0IEdsb2JhbENoYW5uZWxLZXkgKikga2V5OworCWRzaGFzaF9o YXNoIGg7CisKKwloID0gRGF0dW1HZXRVSW50MzIoaGFzaF91aW50MzIoay0+ZGJvaWQpKTsK KwloIF49IERhdHVtR2V0VUludDMyKGhhc2hfYW55KChjb25zdCB1bnNpZ25lZCBjaGFyICop IGstPmNoYW5uZWwsCisJCQkJCQkJCSBzdHJubGVuKGstPmNoYW5uZWwsIE5BTUVEQVRBTEVO KSkpOworCisJcmV0dXJuIGg7Cit9CisKKy8qIHBhcmFtZXRlcnMgZm9yIHRoZSBnbG9iYWwg Y2hhbm5lbCB0YWJsZSAqLworc3RhdGljIGNvbnN0IGRzaGFzaF9wYXJhbWV0ZXJzIGdsb2Jh bENoYW5uZWxUYWJsZURTSFBhcmFtcyA9IHsKKwlzaXplb2YoR2xvYmFsQ2hhbm5lbEtleSks CisJc2l6ZW9mKEdsb2JhbENoYW5uZWxFbnRyeSksCisJZHNoYXNoX21lbWNtcCwKKwlnbG9i YWxDaGFubmVsVGFibGVIYXNoLAorCWRzaGFzaF9tZW1jcHksCisJTFdUUkFOQ0hFX05PVElG WV9DSEFOTkVMX0hBU0gKK307CisKKy8qCisgKiBpbml0R2xvYmFsQ2hhbm5lbFRhYmxlCisg KgkJTGF6eSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZ2xvYmFsIGNoYW5uZWwgdGFibGUuCisg Ki8KK3N0YXRpYyB2b2lkCitpbml0R2xvYmFsQ2hhbm5lbFRhYmxlKHZvaWQpCit7CisJTWVt b3J5Q29udGV4dCBvbGRjb250ZXh0OworCisJLyogUXVpY2sgZXhpdCBpZiB3ZSBhbHJlYWR5 IGRpZCB0aGlzICovCisJaWYgKGFzeW5jUXVldWVDb250cm9sLT5nbG9iYWxDaGFubmVsVGFi bGVEU0ggIT0gRFNIQVNIX0hBTkRMRV9JTlZBTElEICYmCisJCWdsb2JhbENoYW5uZWxUYWJs ZSAhPSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBPdGhlcndpc2UsIHVzZSBhIGxvY2sgdG8g ZW5zdXJlIG9ubHkgb25lIHByb2Nlc3MgY3JlYXRlcyB0aGUgdGFibGUgKi8KKwlMV0xvY2tB Y3F1aXJlKE5vdGlmeVF1ZXVlTG9jaywgTFdfRVhDTFVTSVZFKTsKKworCS8qIEJlIHN1cmUg YW55IGxvY2FsIG1lbW9yeSBhbGxvY2F0ZWQgYnkgRFNBIHJvdXRpbmVzIGlzIHBlcnNpc3Rl bnQgKi8KKwlvbGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKFRvcE1lbW9yeUNv bnRleHQpOworCisJaWYgKGFzeW5jUXVldWVDb250cm9sLT5nbG9iYWxDaGFubmVsVGFibGVE U0ggPT0gRFNIQVNIX0hBTkRMRV9JTlZBTElEKQorCXsKKwkJLyogSW5pdGlhbGl6ZSBkeW5h bWljIHNoYXJlZCBoYXNoIHRhYmxlIGZvciBnbG9iYWwgY2hhbm5lbHMgKi8KKwkJZ2xvYmFs Q2hhbm5lbERTQSA9IGRzYV9jcmVhdGUoTFdUUkFOQ0hFX05PVElGWV9DSEFOTkVMX0hBU0gp OworCQlkc2FfcGluKGdsb2JhbENoYW5uZWxEU0EpOworCQlkc2FfcGluX21hcHBpbmcoZ2xv YmFsQ2hhbm5lbERTQSk7CisJCWdsb2JhbENoYW5uZWxUYWJsZSA9IGRzaGFzaF9jcmVhdGUo Z2xvYmFsQ2hhbm5lbERTQSwgJmdsb2JhbENoYW5uZWxUYWJsZURTSFBhcmFtcywgTlVMTCk7 CisKKwkJLyogU3RvcmUgaGFuZGxlcyBpbiBzaGFyZWQgbWVtb3J5IGZvciBvdGhlciBiYWNr ZW5kcyB0byB1c2UgKi8KKwkJYXN5bmNRdWV1ZUNvbnRyb2wtPmdsb2JhbENoYW5uZWxUYWJs ZURTQSA9IGRzYV9nZXRfaGFuZGxlKGdsb2JhbENoYW5uZWxEU0EpOworCQlhc3luY1F1ZXVl Q29udHJvbC0+Z2xvYmFsQ2hhbm5lbFRhYmxlRFNIID0KKwkJCWRzaGFzaF9nZXRfaGFzaF90 YWJsZV9oYW5kbGUoZ2xvYmFsQ2hhbm5lbFRhYmxlKTsKKwl9CisJZWxzZSBpZiAoIWdsb2Jh bENoYW5uZWxUYWJsZSkKKwl7CisJCS8qIEF0dGFjaCB0byBleGlzdGluZyBkeW5hbWljIHNo YXJlZCBoYXNoIHRhYmxlICovCisJCWdsb2JhbENoYW5uZWxEU0EgPSBkc2FfYXR0YWNoKGFz eW5jUXVldWVDb250cm9sLT5nbG9iYWxDaGFubmVsVGFibGVEU0EpOworCQlkc2FfcGluX21h cHBpbmcoZ2xvYmFsQ2hhbm5lbERTQSk7CisJCWdsb2JhbENoYW5uZWxUYWJsZSA9IGRzaGFz aF9hdHRhY2goZ2xvYmFsQ2hhbm5lbERTQSwgJmdsb2JhbENoYW5uZWxUYWJsZURTSFBhcmFt cywKKwkJCQkJCQkJCQkgICBhc3luY1F1ZXVlQ29udHJvbC0+Z2xvYmFsQ2hhbm5lbFRhYmxl RFNILAorCQkJCQkJCQkJCSAgIE5VTEwpOworCX0KKworCU1lbW9yeUNvbnRleHRTd2l0Y2hU byhvbGRjb250ZXh0KTsKKwlMV0xvY2tSZWxlYXNlKE5vdGlmeVF1ZXVlTG9jayk7Cit9CisK Ky8qCisgKiBpbml0TG9jYWxDaGFubmVsVGFibGUKKyAqCQlMYXp5IGluaXRpYWxpemF0aW9u IG9mIHRoZSBsb2NhbCBjaGFubmVsIHRhYmxlLgorICovCitzdGF0aWMgdm9pZAoraW5pdExv Y2FsQ2hhbm5lbFRhYmxlKHZvaWQpCit7CisJSEFTSENUTAkJaGFzaF9jdGw7CisKKwkvKiBR dWljayBleGl0IGlmIHdlIGFscmVhZHkgZGlkIHRoaXMgKi8KKwlpZiAobG9jYWxDaGFubmVs VGFibGUgIT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogSW5pdGlhbGl6ZSBsb2NhbCBoYXNo IHRhYmxlIGZvciB0aGlzIGJhY2tlbmQncyBsaXN0ZW5lZCBjaGFubmVscyAqLworCW1lbXNl dCgmaGFzaF9jdGwsIDAsIHNpemVvZihoYXNoX2N0bCkpOworCWhhc2hfY3RsLmtleXNpemUg PSBOQU1FREFUQUxFTjsKKwloYXNoX2N0bC5lbnRyeXNpemUgPSBzaXplb2Yoc3RydWN0IENo YW5uZWxOYW1lKTsKKworCWxvY2FsQ2hhbm5lbFRhYmxlID0KKwkJaGFzaF9jcmVhdGUoIkxv Y2FsIExpc3RlbiBDaGFubmVscyIsCisJCQkJCTY0LAorCQkJCQkmaGFzaF9jdGwsCisJCQkJ CUhBU0hfRUxFTSB8IEhBU0hfU1RSSU5HUyk7Cit9CisKKy8qCisgKiBpbml0UGVuZGluZ0xp c3RlbkFjdGlvbnMKKyAqCQlMYXp5IGluaXRpYWxpemF0aW9uIG9mIHRoZSBwZW5kaW5nIGxp c3RlbiBhY3Rpb25zIGhhc2ggdGFibGUuCisgKgkJVGhpcyBpcyBhbGxvY2F0ZWQgaW4gQ3Vy VHJhbnNhY3Rpb25Db250ZXh0IGFuZCBkZXN0cm95ZWQgYXQKKyAqCQl0cmFuc2FjdGlvbiBl bmQuCisgKi8KK3N0YXRpYyB2b2lkCitpbml0UGVuZGluZ0xpc3RlbkFjdGlvbnModm9pZCkK K3sKKwlIQVNIQ1RMCQloYXNoX2N0bDsKKworCWlmIChwZW5kaW5nTGlzdGVuQWN0aW9ucyAh PSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmhhc2hfY3RsLCAwLCBzaXplb2YoaGFz aF9jdGwpKTsKKwloYXNoX2N0bC5rZXlzaXplID0gTkFNRURBVEFMRU47CisJaGFzaF9jdGwu ZW50cnlzaXplID0gc2l6ZW9mKHN0cnVjdCBQZW5kaW5nTGlzdGVuRW50cnkpOworCWhhc2hf Y3RsLmhjeHQgPSBDdXJUcmFuc2FjdGlvbkNvbnRleHQ7CisKKwlwZW5kaW5nTGlzdGVuQWN0 aW9ucyA9CisJCWhhc2hfY3JlYXRlKCJQZW5kaW5nIExpc3RlbiBBY3Rpb25zIiwKKwkJCQkJ MTYsCisJCQkJCSZoYXNoX2N0bCwKKwkJCQkJSEFTSF9FTEVNIHwgSEFTSF9TVFJJTkdTIHwg SEFTSF9DT05URVhUKTsKK30KKwogLyoKICAqIFJlcG9ydCBzcGFjZSBuZWVkZWQgZm9yIG91 ciBzaGFyZWQgbWVtb3J5IGFyZWEKICAqLwpAQCAtNTIwLDEyICs3NjgsMTcgQEAgQXN5bmNT aG1lbUluaXQodm9pZCkKIAkJUVVFVUVfU1RPUF9QQUdFID0gMDsKIAkJUVVFVUVfRklSU1Rf TElTVEVORVIgPSBJTlZBTElEX1BST0NfTlVNQkVSOwogCQlhc3luY1F1ZXVlQ29udHJvbC0+ bGFzdFF1ZXVlRmlsbFdhcm4gPSAwOworCQlhc3luY1F1ZXVlQ29udHJvbC0+Z2xvYmFsQ2hh bm5lbFRhYmxlRFNBID0gRFNBX0hBTkRMRV9JTlZBTElEOworCQlhc3luY1F1ZXVlQ29udHJv bC0+Z2xvYmFsQ2hhbm5lbFRhYmxlRFNIID0gRFNIQVNIX0hBTkRMRV9JTlZBTElEOwogCQlm b3IgKGludCBpID0gMDsgaSA8IE1heEJhY2tlbmRzOyBpKyspCiAJCXsKIAkJCVFVRVVFX0JB Q0tFTkRfUElEKGkpID0gSW52YWxpZFBpZDsKIAkJCVFVRVVFX0JBQ0tFTkRfREJPSUQoaSkg PSBJbnZhbGlkT2lkOwogCQkJUVVFVUVfTkVYVF9MSVNURU5FUihpKSA9IElOVkFMSURfUFJP Q19OVU1CRVI7CiAJCQlTRVRfUVVFVUVfUE9TKFFVRVVFX0JBQ0tFTkRfUE9TKGkpLCAwLCAw KTsKKwkJCVNFVF9RVUVVRV9QT1MoUVVFVUVfQkFDS0VORF9BRFZBTkNJTkdfUE9TKGkpLCAw LCAwKTsKKwkJCVFVRVVFX0JBQ0tFTkRfV0FLRVVQX1BFTkRJTkcoaSkgPSBmYWxzZTsKKwkJ CVFVRVVFX0JBQ0tFTkRfSVNfQURWQU5DSU5HKGkpID0gZmFsc2U7CiAJCX0KIAl9CiAKQEAg LTY1Niw2ICs5MDksNyBAQCBBc3luY19Ob3RpZnkoY29uc3QgY2hhciAqY2hhbm5lbCwgY29u c3QgY2hhciAqcGF5bG9hZCkKIAkJbm90aWZpZXMtPmV2ZW50cyA9IGxpc3RfbWFrZTEobik7 CiAJCS8qIFdlIGNlcnRhaW5seSBkb24ndCBuZWVkIGEgaGFzaHRhYmxlIHlldCAqLwogCQlu b3RpZmllcy0+aGFzaHRhYiA9IE5VTEw7CisJCW5vdGlmaWVzLT51bmlxdWVDaGFubmVsTmFt ZXMgPSBOVUxMOwogCQlub3RpZmllcy0+dXBwZXIgPSBwZW5kaW5nTm90aWZpZXM7CiAJCXBl bmRpbmdOb3RpZmllcyA9IG5vdGlmaWVzOwogCX0KQEAgLTY4Miw4ICs5MzYsOCBAQCBBc3lu Y19Ob3RpZnkoY29uc3QgY2hhciAqY2hhbm5lbCwgY29uc3QgY2hhciAqcGF5bG9hZCkKICAq CQlDb21tb24gY29kZSBmb3IgbGlzdGVuLCB1bmxpc3RlbiwgdW5saXN0ZW4gYWxsIGNvbW1h bmRzLgogICoKICAqCQlBZGRzIHRoZSByZXF1ZXN0IHRvIHRoZSBsaXN0IG9mIHBlbmRpbmcg YWN0aW9ucy4KLSAqCQlBY3R1YWwgdXBkYXRlIG9mIHRoZSBsaXN0ZW5DaGFubmVscyBsaXN0 IGhhcHBlbnMgZHVyaW5nIHRyYW5zYWN0aW9uCi0gKgkJY29tbWl0LgorICoJCUFjdHVhbCB1 cGRhdGUgb2YgbG9jYWxDaGFubmVsVGFibGUgYW5kIGdsb2JhbENoYW5uZWxUYWJsZSBoYXBw ZW5zIGR1cmluZworICoJCVByZUNvbW1pdF9Ob3RpZnksIHdpdGggc3RhZ2VkIGNoYW5nZXMg Y29tbWl0dGVkIGluIEF0Q29tbWl0X05vdGlmeS4KICAqLwogc3RhdGljIHZvaWQKIHF1ZXVl X2xpc3RlbihMaXN0ZW5BY3Rpb25LaW5kIGFjdGlvbiwgY29uc3QgY2hhciAqY2hhbm5lbCkK QEAgLTY5MywxMCArOTQ3LDkgQEAgcXVldWVfbGlzdGVuKExpc3RlbkFjdGlvbktpbmQgYWN0 aW9uLCBjb25zdCBjaGFyICpjaGFubmVsKQogCWludAkJCW15X2xldmVsID0gR2V0Q3VycmVu dFRyYW5zYWN0aW9uTmVzdExldmVsKCk7CiAKIAkvKgotCSAqIFVubGlrZSBBc3luY19Ob3Rp ZnksIHdlIGRvbid0IHRyeSB0byBjb2xsYXBzZSBvdXQgZHVwbGljYXRlcy4gSXQgd291bGQK LQkgKiBiZSB0b28gY29tcGxpY2F0ZWQgdG8gZW5zdXJlIHdlIGdldCB0aGUgcmlnaHQgaW50 ZXJhY3Rpb25zIG9mCi0JICogY29uZmxpY3RpbmcgTElTVEVOL1VOTElTVEVOL1VOTElTVEVO X0FMTCwgYW5kIGl0J3MgdW5saWtlbHkgdGhhdCB0aGVyZQotCSAqIHdvdWxkIGJlIGFueSBw ZXJmb3JtYW5jZSBiZW5lZml0IGFueXdheSBpbiBzYW5lIGFwcGxpY2F0aW9ucy4KKwkgKiBV bmxpa2UgQXN5bmNfTm90aWZ5LCB3ZSBkb24ndCB0cnkgdG8gY29sbGFwc2Ugb3V0IGR1cGxp Y2F0ZXMgaGVyZS4gV2UKKwkgKiBrZWVwIHRoZSBvcmRlcmVkIGxpc3QgdG8gcHJlc2VydmUg aW50ZXJhY3Rpb25zIGxpa2UgVU5MSVNURU4gQUxMOyB0aGUKKwkgKiBmaW5hbCBwZXItY2hh bm5lbCBpbnRlbnQgaXMgY29tcHV0ZWQgZHVyaW5nIFByZUNvbW1pdF9Ob3RpZnkuCiAJICov CiAJb2xkY29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhDdXJUcmFuc2FjdGlvbkNv bnRleHQpOwogCkBAIC03ODIsMzAgKzEwMzUsNDkgQEAgQXN5bmNfVW5saXN0ZW5BbGwodm9p ZCkKICAqIFNRTCBmdW5jdGlvbjogcmV0dXJuIGEgc2V0IG9mIHRoZSBjaGFubmVsIG5hbWVz IHRoaXMgYmFja2VuZCBpcyBhY3RpdmVseQogICogbGlzdGVuaW5nIHRvLgogICoKLSAqIE5v dGU6IHRoaXMgY29kaW5nIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IHRoZSBsaXN0ZW5DaGFu bmVscyBsaXN0IGNhbm5vdAorICogTm90ZTogdGhpcyBjb2RpbmcgcmVsaWVzIG9uIHRoZSBm YWN0IHRoYXQgdGhlIGxvY2FsQ2hhbm5lbFRhYmxlIGNhbm5vdAogICogY2hhbmdlIHdpdGhp biBhIHRyYW5zYWN0aW9uLgogICovCiBEYXR1bQogcGdfbGlzdGVuaW5nX2NoYW5uZWxzKFBH X0ZVTkNUSU9OX0FSR1MpCiB7CiAJRnVuY0NhbGxDb250ZXh0ICpmdW5jY3R4OworCUhBU0hf U0VRX1NUQVRVUyAqc3RhdHVzOwogCiAJLyogc3R1ZmYgZG9uZSBvbmx5IG9uIHRoZSBmaXJz dCBjYWxsIG9mIHRoZSBmdW5jdGlvbiAqLwogCWlmIChTUkZfSVNfRklSU1RDQUxMKCkpCiAJ eworCQlNZW1vcnlDb250ZXh0IG9sZGNvbnRleHQ7CisKIAkJLyogY3JlYXRlIGEgZnVuY3Rp b24gY29udGV4dCBmb3IgY3Jvc3MtY2FsbCBwZXJzaXN0ZW5jZSAqLwogCQlmdW5jY3R4ID0g U1JGX0ZJUlNUQ0FMTF9JTklUKCk7CisKKwkJLyogSW5pdGlhbGl6ZSBoYXNoIHRhYmxlIGl0 ZXJhdGlvbiBpZiB3ZSBoYXZlIGFueSBjaGFubmVscyAqLworCQlpZiAobG9jYWxDaGFubmVs VGFibGUgIT0gTlVMTCkKKwkJeworCQkJb2xkY29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0 Y2hUbyhmdW5jY3R4LT5tdWx0aV9jYWxsX21lbW9yeV9jdHgpOworCQkJc3RhdHVzID0gKEhB U0hfU0VRX1NUQVRVUyAqKSBwYWxsb2Moc2l6ZW9mKEhBU0hfU0VRX1NUQVRVUykpOworCQkJ aGFzaF9zZXFfaW5pdChzdGF0dXMsIGxvY2FsQ2hhbm5lbFRhYmxlKTsKKwkJCWZ1bmNjdHgt PnVzZXJfZmN0eCA9IHN0YXR1czsKKwkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250 ZXh0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWZ1bmNjdHgtPnVzZXJfZmN0eCA9IE5VTEw7 CisJCX0KIAl9CiAKIAkvKiBzdHVmZiBkb25lIG9uIGV2ZXJ5IGNhbGwgb2YgdGhlIGZ1bmN0 aW9uICovCiAJZnVuY2N0eCA9IFNSRl9QRVJDQUxMX1NFVFVQKCk7CisJc3RhdHVzID0gKEhB U0hfU0VRX1NUQVRVUyAqKSBmdW5jY3R4LT51c2VyX2ZjdHg7CiAKLQlpZiAoZnVuY2N0eC0+ Y2FsbF9jbnRyIDwgbGlzdF9sZW5ndGgobGlzdGVuQ2hhbm5lbHMpKQorCWlmIChzdGF0dXMg IT0gTlVMTCkKIAl7Ci0JCWNoYXIJICAgKmNoYW5uZWwgPSAoY2hhciAqKSBsaXN0X250aChs aXN0ZW5DaGFubmVscywKLQkJCQkJCQkJCQkJCWZ1bmNjdHgtPmNhbGxfY250cik7CisJCXN0 cnVjdCBDaGFubmVsTmFtZSAqZW50cnk7CiAKLQkJU1JGX1JFVFVSTl9ORVhUKGZ1bmNjdHgs IENTdHJpbmdHZXRUZXh0RGF0dW0oY2hhbm5lbCkpOworCQllbnRyeSA9IChzdHJ1Y3QgQ2hh bm5lbE5hbWUgKikgaGFzaF9zZXFfc2VhcmNoKHN0YXR1cyk7CisJCWlmIChlbnRyeSAhPSBO VUxMKQorCQkJU1JGX1JFVFVSTl9ORVhUKGZ1bmNjdHgsIENTdHJpbmdHZXRUZXh0RGF0dW0o ZW50cnktPmNoYW5uZWwpKTsKIAl9CiAKIAlTUkZfUkVUVVJOX0RPTkUoZnVuY2N0eCk7CkBA IC04MjEsNyArMTA5Myw3IEBAIHBnX2xpc3RlbmluZ19jaGFubmVscyhQR19GVU5DVElPTl9B UkdTKQogc3RhdGljIHZvaWQKIEFzeW5jX1VubGlzdGVuT25FeGl0KGludCBjb2RlLCBEYXR1 bSBhcmcpCiB7Ci0JRXhlY19Vbmxpc3RlbkFsbENvbW1pdCgpOworCUNsZWFudXBMaXN0ZW5l cnNPbkV4aXQoKTsKIAlhc3luY1F1ZXVlVW5yZWdpc3RlcigpOwogfQogCkBAIC04NjgsOCAr MTE0MCwyNSBAQCBQcmVDb21taXRfTm90aWZ5KHZvaWQpCiAJCWVsb2coREVCVUcxLCAiUHJl Q29tbWl0X05vdGlmeSIpOwogCiAJLyogUHJlZmxpZ2h0IGZvciBhbnkgcGVuZGluZyBsaXN0 ZW4vdW5saXN0ZW4gYWN0aW9ucyAqLworCWlmIChwZW5kaW5nTm90aWZpZXMgIT0gTlVMTCB8 fCBwZW5kaW5nQWN0aW9ucyAhPSBOVUxMKQorCQlpbml0R2xvYmFsQ2hhbm5lbFRhYmxlKCk7 CisKKwlpZiAocGVuZGluZ05vdGlmaWVzICE9IE5VTEwpCisJeworCQlpZiAoc2lnbmFsUGlk cyA9PSBOVUxMKQorCQkJc2lnbmFsUGlkcyA9IE1lbW9yeUNvbnRleHRBbGxvYyhUb3BNZW1v cnlDb250ZXh0LAorCQkJCQkJCQkJCQlNYXhCYWNrZW5kcyAqIHNpemVvZihpbnQzMikpOwor CisJCWlmIChzaWduYWxQcm9jbm9zID09IE5VTEwpCisJCQlzaWduYWxQcm9jbm9zID0gTWVt b3J5Q29udGV4dEFsbG9jKFRvcE1lbW9yeUNvbnRleHQsCisJCQkJCQkJCQkJCSAgIE1heEJh Y2tlbmRzICogc2l6ZW9mKFByb2NOdW1iZXIpKTsKKwl9CisKIAlpZiAocGVuZGluZ0FjdGlv bnMgIT0gTlVMTCkKIAl7CisJCWluaXRMb2NhbENoYW5uZWxUYWJsZSgpOworCQlpbml0UGVu ZGluZ0xpc3RlbkFjdGlvbnMoKTsKKwogCQlmb3JlYWNoKHAsIHBlbmRpbmdBY3Rpb25zLT5h Y3Rpb25zKQogCQl7CiAJCQlMaXN0ZW5BY3Rpb24gKmFjdHJlYyA9IChMaXN0ZW5BY3Rpb24g KikgbGZpcnN0KHApOwpAQCAtODc3LDEzICsxMTY2LDE0IEBAIFByZUNvbW1pdF9Ob3RpZnko dm9pZCkKIAkJCXN3aXRjaCAoYWN0cmVjLT5hY3Rpb24pCiAJCQl7CiAJCQkJY2FzZSBMSVNU RU5fTElTVEVOOgotCQkJCQlFeGVjX0xpc3RlblByZUNvbW1pdCgpOworCQkJCQlCZWNvbWVS ZWdpc3RlcmVkTGlzdGVuZXIoKTsKKwkJCQkJUHJlcGFyZVRhYmxlRW50cmllc0Zvckxpc3Rl bihhY3RyZWMtPmNoYW5uZWwpOwogCQkJCQlicmVhazsKIAkJCQljYXNlIExJU1RFTl9VTkxJ U1RFTjoKLQkJCQkJLyogdGhlcmUgaXMgbm8gRXhlY19Vbmxpc3RlblByZUNvbW1pdCgpICov CisJCQkJCVByZXBhcmVUYWJsZUVudHJpZXNGb3JVbmxpc3RlbihhY3RyZWMtPmNoYW5uZWwp OwogCQkJCQlicmVhazsKIAkJCQljYXNlIExJU1RFTl9VTkxJU1RFTl9BTEw6Ci0JCQkJCS8q IHRoZXJlIGlzIG5vIEV4ZWNfVW5saXN0ZW5BbGxQcmVDb21taXQoKSAqLworCQkJCQlQcmVw YXJlVGFibGVFbnRyaWVzRm9yVW5saXN0ZW5BbGwoKTsKIAkJCQkJYnJlYWs7CiAJCQl9CiAJ CX0KQEAgLTg5Myw2ICsxMTgzLDM2IEBAIFByZUNvbW1pdF9Ob3RpZnkodm9pZCkKIAlpZiAo cGVuZGluZ05vdGlmaWVzKQogCXsKIAkJTGlzdENlbGwgICAqbmV4dE5vdGlmeTsKKwkJYm9v bAkJZmlyc3RJdGVyYXRpb24gPSB0cnVlOworCisJCS8qCisJCSAqIEJ1aWxkIGxpc3Qgb2Yg dW5pcXVlIGNoYW5uZWxzIGZvciBTaWduYWxCYWNrZW5kcygpLgorCQkgKgorCQkgKiBJZiB1 bmlxdWVDaGFubmVsTmFtZXMgaXMgYXZhaWxhYmxlLCB1c2UgaXQgdG8gZWZmaWNpZW50bHkg Z2V0IHRoZQorCQkgKiB1bmlxdWUgY2hhbm5lbHMuICBPdGhlcndpc2UsIGZhbGwgYmFjayB0 byB0aGUgbGluZWFyIGFwcHJvYWNoLgorCQkgKi8KKwkJcGVuZGluZ05vdGlmeUNoYW5uZWxz ID0gTklMOworCQlpZiAocGVuZGluZ05vdGlmaWVzLT51bmlxdWVDaGFubmVsTmFtZXMgIT0g TlVMTCkKKwkJeworCQkJSEFTSF9TRVFfU1RBVFVTIHN0YXR1czsKKwkJCXN0cnVjdCBDaGFu bmVsTmFtZSAqY2hhbm5lbEVudHJ5OworCisJCQloYXNoX3NlcV9pbml0KCZzdGF0dXMsIHBl bmRpbmdOb3RpZmllcy0+dW5pcXVlQ2hhbm5lbE5hbWVzKTsKKwkJCXdoaWxlICgoY2hhbm5l bEVudHJ5ID0gKHN0cnVjdCBDaGFubmVsTmFtZSAqKSBoYXNoX3NlcV9zZWFyY2goJnN0YXR1 cykpICE9IE5VTEwpCisJCQkJcGVuZGluZ05vdGlmeUNoYW5uZWxzID0gbGFwcGVuZChwZW5k aW5nTm90aWZ5Q2hhbm5lbHMsIGNoYW5uZWxFbnRyeS0+Y2hhbm5lbCk7CisJCX0KKwkJZWxz ZQorCQl7CisJCQkvKiBMaW5lYXIgYXBwcm9hY2ggZm9yIHNtYWxsIG51bWJlciBvZiBub3Rp ZmljYXRpb25zICovCisJCQlmb3JlYWNoX3B0cihOb3RpZmljYXRpb24sIG4sIHBlbmRpbmdO b3RpZmllcy0+ZXZlbnRzKQorCQkJeworCQkJCWNoYXIJICAgKmNoYW5uZWwgPSBuLT5kYXRh OworCisJCQkJLyogQWRkIGlmIG5vdCBhbHJlYWR5IGluIGxpc3QgKi8KKwkJCQlpZiAoIWxp c3RfbWVtYmVyX3B0cihwZW5kaW5nTm90aWZ5Q2hhbm5lbHMsIGNoYW5uZWwpKQorCQkJCQlw ZW5kaW5nTm90aWZ5Q2hhbm5lbHMgPSBsYXBwZW5kKHBlbmRpbmdOb3RpZnlDaGFubmVscywg Y2hhbm5lbCk7CisJCQl9CisJCX0KIAogCQkvKgogCQkgKiBNYWtlIHN1cmUgdGhhdCB3ZSBo YXZlIGFuIFhJRCBhc3NpZ25lZCB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KQEAgLTky MSw2ICsxMjQxLDIyIEBAIFByZUNvbW1pdF9Ob3RpZnkodm9pZCkKIAkJTG9ja1NoYXJlZE9i amVjdChEYXRhYmFzZVJlbGF0aW9uSWQsIEludmFsaWRPaWQsIDAsCiAJCQkJCQkgQWNjZXNz RXhjbHVzaXZlTG9jayk7CiAKKwkJLyoKKwkJICogRm9yIHRoZSBkaXJlY3QgYWR2YW5jZW1l bnQgb3B0aW1pemF0aW9uIGluIFNpZ25hbEJhY2tlbmRzKCksIHdlCisJCSAqIG5lZWQgdG8g ZW5zdXJlIHRoYXQgbm8gb3RoZXIgYmFja2VuZCBjYW4gaW5zZXJ0IHF1ZXVlIGVudHJpZXMK KwkJICogYmV0d2VlbiBxdWV1ZUhlYWRCZWZvcmVXcml0ZSBhbmQgcXVldWVIZWFkQWZ0ZXJX cml0ZS4gIFRoZQorCQkgKiBoZWF2eXdlaWdodCBsb2NrIGFib3ZlIHByb3ZpZGVzIHRoaXMg Z3VhcmFudGVlLCBzaW5jZSBpdCBzZXJpYWxpemVzCisJCSAqIGFsbCB3cml0ZXJzLgorCQkg KgorCQkgKiBOb3RlOiBpZiB0aGUgaGVhdnl3ZWlnaHQgbG9jayB3ZXJlIGV2ZXIgcmVtb3Zl ZCBmb3Igc2NhbGFiaWxpdHkKKwkJICogcmVhc29ucywgd2UgY291bGQgYWNoaWV2ZSB0aGUg c2FtZSBndWFyYW50ZWUgYnkgaG9sZGluZworCQkgKiBOb3RpZnlRdWV1ZUxvY2sgaW4gRVhD TFVTSVZFIG1vZGUgYWNyb3NzIGFsbCBvdXIgaW5zZXJ0aW9ucywgcmF0aGVyCisJCSAqIHRo YW4gcmVsZWFzaW5nIGFuZCByZWFjcXVpcmluZyBpdCBmb3IgZWFjaCBwYWdlIGFzIHdlIGRv IGJlbG93LgorCQkgKi8KKworCQkvKiBJbml0aWFsaXplIHF1ZXVlSGVhZEJlZm9yZVdyaXRl IHRvIGEgc2FmZSBkZWZhdWx0ICovCisJCVNFVF9RVUVVRV9QT1MocXVldWVIZWFkQmVmb3Jl V3JpdGUsIDAsIDApOworCiAJCS8qIE5vdyBwdXNoIHRoZSBub3RpZmljYXRpb25zIGludG8g dGhlIHF1ZXVlICovCiAJCW5leHROb3RpZnkgPSBsaXN0X2hlYWQocGVuZGluZ05vdGlmaWVz LT5ldmVudHMpOwogCQl3aGlsZSAobmV4dE5vdGlmeSAhPSBOVUxMKQpAQCAtOTM4LDEyICsx Mjc0LDIwIEBAIFByZUNvbW1pdF9Ob3RpZnkodm9pZCkKIAkJCSAqIHBvaW50IGluIHRpbWUg d2UgY2FuIHN0aWxsIHJvbGwgdGhlIHRyYW5zYWN0aW9uIGJhY2suCiAJCQkgKi8KIAkJCUxX TG9ja0FjcXVpcmUoTm90aWZ5UXVldWVMb2NrLCBMV19FWENMVVNJVkUpOworCQkJaWYgKGZp cnN0SXRlcmF0aW9uKQorCQkJeworCQkJCXF1ZXVlSGVhZEJlZm9yZVdyaXRlID0gUVVFVUVf SEVBRDsKKwkJCQlmaXJzdEl0ZXJhdGlvbiA9IGZhbHNlOworCQkJfQorCiAJCQlhc3luY1F1 ZXVlRmlsbFdhcm5pbmcoKTsKIAkJCWlmIChhc3luY1F1ZXVlSXNGdWxsKCkpCiAJCQkJZXJl cG9ydChFUlJPUiwKIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfUFJPR1JBTV9MSU1JVF9FWENF RURFRCksCiAJCQkJCQkgZXJybXNnKCJ0b28gbWFueSBub3RpZmljYXRpb25zIGluIHRoZSBO T1RJRlkgcXVldWUiKSkpOwogCQkJbmV4dE5vdGlmeSA9IGFzeW5jUXVldWVBZGRFbnRyaWVz KG5leHROb3RpZnkpOworCQkJcXVldWVIZWFkQWZ0ZXJXcml0ZSA9IFFVRVVFX0hFQUQ7CisK IAkJCUxXTG9ja1JlbGVhc2UoTm90aWZ5UXVldWVMb2NrKTsKIAkJfQogCkBAIC05NTEsMTIg KzEyOTUsMTMzIEBAIFByZUNvbW1pdF9Ob3RpZnkodm9pZCkKIAl9CiB9CiAKKy8qCisgKiBS ZW1vdmVMaXN0ZW5lckZyb21DaGFubmVsIC0tLSByZW1vdmUgYSBsaXN0ZW5lciBmcm9tIGds b2JhbENoYW5uZWxUYWJsZSBlbnRyeQorICoKKyAqIERlY3JlbWVudHMgbnVtTGlzdGVuZXJz LCBjb21wYWN0cyB0aGUgYXJyYXksIGFuZCBmcmVlcyB0aGUgZW50cnkgaWYgZW1wdHkuCisg KiBTZXRzICplbnRyeV9wdHIgdG8gTlVMTCBpZiB0aGUgZW50cnkgd2FzIGRlbGV0ZWQuCisg Ki8KK3N0YXRpYyB2b2lkCitSZW1vdmVMaXN0ZW5lckZyb21DaGFubmVsKEdsb2JhbENoYW5u ZWxFbnRyeSAqKmVudHJ5X3B0ciwgTGlzdGVuZXJFbnRyeSAqbGlzdGVuZXJzLCBpbnQgaWR4 KQoreworCUdsb2JhbENoYW5uZWxFbnRyeSAqZW50cnkgPSAqZW50cnlfcHRyOworCisJZW50 cnktPm51bUxpc3RlbmVycy0tOworCWlmIChpZHggPCBlbnRyeS0+bnVtTGlzdGVuZXJzKQor CQltZW1tb3ZlKCZsaXN0ZW5lcnNbaWR4XSwgJmxpc3RlbmVyc1tpZHggKyAxXSwKKwkJCQlz aXplb2YoTGlzdGVuZXJFbnRyeSkgKiAoZW50cnktPm51bUxpc3RlbmVycyAtIGlkeCkpOwor CisJaWYgKGVudHJ5LT5udW1MaXN0ZW5lcnMgPT0gMCkKKwl7CisJCWRzYV9mcmVlKGdsb2Jh bENoYW5uZWxEU0EsIGVudHJ5LT5saXN0ZW5lcnNBcnJheSk7CisJCWRzaGFzaF9kZWxldGVf ZW50cnkoZ2xvYmFsQ2hhbm5lbFRhYmxlLCBlbnRyeSk7CisJCSplbnRyeV9wdHIgPSBOVUxM OworCX0KK30KKworLyoKKyAqIEFwcGx5UGVuZGluZ0xpc3RlbkFjdGlvbnMKKyAqCisgKiBB cHBseSBzdGFnZWQgbGlzdGVuL3VubGlzdGVuIGNoYW5nZXMgdG8gdGhlIGxvY2FsIGFuZCBn bG9iYWwgdGFibGVzLgorICovCitzdGF0aWMgdm9pZAorQXBwbHlQZW5kaW5nTGlzdGVuQWN0 aW9ucyhQZW5kaW5nTGlzdGVuQXBwbHlNb2RlIG1vZGUpCit7CisJSEFTSF9TRVFfU1RBVFVT IHNlcTsKKwlzdHJ1Y3QgUGVuZGluZ0xpc3RlbkVudHJ5ICpwZW5kaW5nOworCisJaWYgKHBl bmRpbmdMaXN0ZW5BY3Rpb25zID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChnbG9iYWxD aGFubmVsVGFibGUgPT0gTlVMTCkKKwl7CisJCWlmIChtb2RlID09IFBFTkRJTkdfTElTVEVO X0FQUExZX0NPTU1JVCkKKwkJCWVsb2coUEFOSUMsICJnbG9iYWwgY2hhbm5lbCB0YWJsZSBt aXNzaW5nIGR1cmluZyBjb21taXQiKTsKKwkJcmV0dXJuOworCX0KKworCWhhc2hfc2VxX2lu aXQoJnNlcSwgcGVuZGluZ0xpc3RlbkFjdGlvbnMpOworCXdoaWxlICgocGVuZGluZyA9IChz dHJ1Y3QgUGVuZGluZ0xpc3RlbkVudHJ5ICopIGhhc2hfc2VxX3NlYXJjaCgmc2VxKSkgIT0g TlVMTCkKKwl7CisJCUdsb2JhbENoYW5uZWxLZXkga2V5OworCQlHbG9iYWxDaGFubmVsRW50 cnkgKmVudHJ5OworCQlMaXN0ZW5lckVudHJ5ICpsaXN0ZW5lcnM7CisJCWJvb2wJCXJlbW92 ZUxvY2FsID0gZmFsc2U7CisJCWJvb2wJCWZvdW5kTGlzdGVuZXIgPSBmYWxzZTsKKworCQlH bG9iYWxDaGFubmVsS2V5SW5pdCgma2V5LCBNeURhdGFiYXNlSWQsIHBlbmRpbmctPmNoYW5u ZWwpOworCQllbnRyeSA9IGRzaGFzaF9maW5kKGdsb2JhbENoYW5uZWxUYWJsZSwgJmtleSwg dHJ1ZSk7CisJCWlmIChlbnRyeSA9PSBOVUxMKQorCQl7CisJCQlpZiAobW9kZSA9PSBQRU5E SU5HX0xJU1RFTl9BUFBMWV9DT01NSVQpCisJCQkJZWxvZyhQQU5JQywgImNvdWxkIG5vdCBm aW5kIGdsb2JhbCBjaGFubmVsIHRhYmxlIGVudHJ5IHdoZW4gZXhwZWN0ZWQiKTsKKwkJCWNv bnRpbnVlOworCQl9CisKKwkJbGlzdGVuZXJzID0gKExpc3RlbmVyRW50cnkgKikgZHNhX2dl dF9hZGRyZXNzKGdsb2JhbENoYW5uZWxEU0EsCisJCQkJCQkJCQkJCQkJICBlbnRyeS0+bGlz dGVuZXJzQXJyYXkpOworCisJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cnktPm51bUxpc3Rl bmVyczsgaSsrKQorCQl7CisJCQlpZiAobGlzdGVuZXJzW2ldLnByb2NObyAhPSBNeVByb2NO dW1iZXIpCisJCQkJY29udGludWU7CisKKwkJCWZvdW5kTGlzdGVuZXIgPSB0cnVlOworCisJ CQlpZiAobW9kZSA9PSBQRU5ESU5HX0xJU1RFTl9BUFBMWV9DT01NSVQpCisJCQl7CisJCQkJ aWYgKHBlbmRpbmctPmFjdGlvbiA9PSBQRU5ESU5HX0xJU1RFTikKKwkJCQl7CisJCQkJCS8q CisJCQkJCSAqIExJU1RFTiBiZWluZyBjb21taXR0ZWQ6IHNldCBsaXN0ZW5pbmc9dHJ1ZS4K KwkJCQkJICogbG9jYWxDaGFubmVsVGFibGUgd2FzIHByZS1hbGxvY2F0ZWQgaW4gUHJlQ29t bWl0LgorCQkJCQkgKi8KKwkJCQkJbGlzdGVuZXJzW2ldLmxpc3RlbmluZyA9IHRydWU7CisJ CQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qCisJCQkJCSAqIFVOTElTVEVOIGJlaW5n IGNvbW1pdHRlZDogcmVtb3ZlIGZyb20KKwkJCQkJICogZ2xvYmFsQ2hhbm5lbFRhYmxlCisJ CQkJCSAqLworCQkJCQlSZW1vdmVMaXN0ZW5lckZyb21DaGFubmVsKCZlbnRyeSwgbGlzdGVu ZXJzLCBpKTsKKwkJCQkJcmVtb3ZlTG9jYWwgPSB0cnVlOworCQkJCX0KKwkJCX0KKwkJCWVs c2UgaWYgKCFsaXN0ZW5lcnNbaV0ubGlzdGVuaW5nKQorCQkJeworCQkJCS8qCisJCQkJICog U3RhZ2VkIExJU1RFTiAob3IgTElTVEVOK1VOTElTVEVOKSBiZWluZyBhYm9ydGVkOiByZW1v dmUKKwkJCQkgKiBwcmUtYWxsb2NhdGVkIGVudHJpZXMgZnJvbSBib3RoIHRhYmxlcy4KKwkJ CQkgKi8KKwkJCQlSZW1vdmVMaXN0ZW5lckZyb21DaGFubmVsKCZlbnRyeSwgbGlzdGVuZXJz LCBpKTsKKwkJCQlyZW1vdmVMb2NhbCA9IHRydWU7CisJCQl9CisJCQlicmVhazsKKwkJfQor CisJCWlmICghZm91bmRMaXN0ZW5lciAmJiBtb2RlID09IFBFTkRJTkdfTElTVEVOX0FQUExZ X0NPTU1JVCkKKwkJCWVsb2coUEFOSUMsICJjb3VsZCBub3QgZmluZCBsaXN0ZW5lciBlbnRy eSBmb3IgYmFja2VuZCAlZCIsIE15UHJvY051bWJlcik7CisKKwkJaWYgKGVudHJ5ICE9IE5V TEwpCisJCQlkc2hhc2hfcmVsZWFzZV9sb2NrKGdsb2JhbENoYW5uZWxUYWJsZSwgZW50cnkp OworCisJCWlmIChyZW1vdmVMb2NhbCkKKwkJeworCQkJLyogVXBkYXRlIGxvY2FsIGNhY2hl IGFmdGVyIHNoYXJlZCB0YWJsZSBjaGFuZ2VzLiAqLworCQkJQXNzZXJ0KGxvY2FsQ2hhbm5l bFRhYmxlICE9IE5VTEwpOworCQkJKHZvaWQpIGhhc2hfc2VhcmNoKGxvY2FsQ2hhbm5lbFRh YmxlLCBwZW5kaW5nLT5jaGFubmVsLAorCQkJCQkJCSAgIEhBU0hfUkVNT1ZFLCBOVUxMKTsK KwkJfQorCX0KK30KKwogLyoKICAqIEF0Q29tbWl0X05vdGlmeQogICoKICAqCQlUaGlzIGlz IGNhbGxlZCBhdCB0cmFuc2FjdGlvbiBjb21taXQsIGFmdGVyIGNvbW1pdHRpbmcgdG8gY2xv Zy4KICAqCi0gKgkJVXBkYXRlIGxpc3RlbkNoYW5uZWxzIGFuZCBjbGVhciB0cmFuc2FjdGlv bi1sb2NhbCBzdGF0ZS4KKyAqCQlBcHBseSBwZW5kaW5nIGxpc3Rlbi91bmxpc3RlbiBjaGFu Z2VzIGFuZCBjbGVhciB0cmFuc2FjdGlvbi1sb2NhbCBzdGF0ZS4KICAqCiAgKgkJSWYgd2Ug aXNzdWVkIGFueSBub3RpZmljYXRpb25zIGluIHRoZSB0cmFuc2FjdGlvbiwgc2VuZCBzaWdu YWxzIHRvCiAgKgkJbGlzdGVuaW5nIGJhY2tlbmRzIChwb3NzaWJseSBpbmNsdWRpbmcgb3Vy c2VsdmVzKSB0byBwcm9jZXNzIHRoZW0uCkBAIC05NjYsOCArMTQzMSw2IEBAIFByZUNvbW1p dF9Ob3RpZnkodm9pZCkKIHZvaWQKIEF0Q29tbWl0X05vdGlmeSh2b2lkKQogewotCUxpc3RD ZWxsICAgKnA7Ci0KIAkvKgogCSAqIEFsbG93IHRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgbm90 IGV4ZWN1dGVkIExJU1RFTi9VTkxJU1RFTi9OT1RJRlkgdG8KIAkgKiByZXR1cm4gYXMgc29v biBhcyBwb3NzaWJsZQpAQCAtOTc4LDMwICsxNDQxLDEyIEBAIEF0Q29tbWl0X05vdGlmeSh2 b2lkKQogCWlmIChUcmFjZV9ub3RpZnkpCiAJCWVsb2coREVCVUcxLCAiQXRDb21taXRfTm90 aWZ5Iik7CiAKLQkvKiBQZXJmb3JtIGFueSBwZW5kaW5nIGxpc3Rlbi91bmxpc3RlbiBhY3Rp b25zICovCi0JaWYgKHBlbmRpbmdBY3Rpb25zICE9IE5VTEwpCi0JewotCQlmb3JlYWNoKHAs IHBlbmRpbmdBY3Rpb25zLT5hY3Rpb25zKQotCQl7Ci0JCQlMaXN0ZW5BY3Rpb24gKmFjdHJl YyA9IChMaXN0ZW5BY3Rpb24gKikgbGZpcnN0KHApOwotCi0JCQlzd2l0Y2ggKGFjdHJlYy0+ YWN0aW9uKQotCQkJewotCQkJCWNhc2UgTElTVEVOX0xJU1RFTjoKLQkJCQkJRXhlY19MaXN0 ZW5Db21taXQoYWN0cmVjLT5jaGFubmVsKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBMSVNU RU5fVU5MSVNURU46Ci0JCQkJCUV4ZWNfVW5saXN0ZW5Db21taXQoYWN0cmVjLT5jaGFubmVs KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBMSVNURU5fVU5MSVNURU5fQUxMOgotCQkJCQlF eGVjX1VubGlzdGVuQWxsQ29tbWl0KCk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQor CS8qIEFwcGx5IHN0YWdlZCBsaXN0ZW4vdW5saXN0ZW4gY2hhbmdlcyAqLworCUFwcGx5UGVu ZGluZ0xpc3RlbkFjdGlvbnMoUEVORElOR19MSVNURU5fQVBQTFlfQ09NTUlUKTsKIAogCS8q IElmIG5vIGxvbmdlciBsaXN0ZW5pbmcgdG8gYW55dGhpbmcsIGdldCBvdXQgb2YgbGlzdGVu ZXIgYXJyYXkgKi8KLQlpZiAoYW1SZWdpc3RlcmVkTGlzdGVuZXIgJiYgbGlzdGVuQ2hhbm5l bHMgPT0gTklMKQorCWlmIChhbVJlZ2lzdGVyZWRMaXN0ZW5lciAmJgorCQkobG9jYWxDaGFu bmVsVGFibGUgPT0gTlVMTCB8fCBoYXNoX2dldF9udW1fZW50cmllcyhsb2NhbENoYW5uZWxU YWJsZSkgPT0gMCkpCiAJCWFzeW5jUXVldWVVbnJlZ2lzdGVyKCk7CiAKIAkvKgpAQCAtMTAz MiwxMiArMTQ3NywxMiBAQCBBdENvbW1pdF9Ob3RpZnkodm9pZCkKIH0KIAogLyoKLSAqIEV4 ZWNfTGlzdGVuUHJlQ29tbWl0IC0tLSBzdWJyb3V0aW5lIGZvciBQcmVDb21taXRfTm90aWZ5 CisgKiBCZWNvbWVSZWdpc3RlcmVkTGlzdGVuZXIgLS0tIHN1YnJvdXRpbmUgZm9yIFByZUNv bW1pdF9Ob3RpZnkKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgbWFrZSBzdXJlIHdlIGFy ZSByZWFkeSB0byBjYXRjaCBhbnkgaW5jb21pbmcgbWVzc2FnZXMuCiAgKi8KIHN0YXRpYyB2 b2lkCi1FeGVjX0xpc3RlblByZUNvbW1pdCh2b2lkKQorQmVjb21lUmVnaXN0ZXJlZExpc3Rl bmVyKHZvaWQpCiB7CiAJUXVldWVQb3NpdGlvbiBoZWFkOwogCVF1ZXVlUG9zaXRpb24gbWF4 OwpAQCAtMTA1MSw3ICsxNDk2LDcgQEAgRXhlY19MaXN0ZW5QcmVDb21taXQodm9pZCkKIAkJ cmV0dXJuOwogCiAJaWYgKFRyYWNlX25vdGlmeSkKLQkJZWxvZyhERUJVRzEsICJFeGVjX0xp c3RlblByZUNvbW1pdCglZCkiLCBNeVByb2NQaWQpOworCQllbG9nKERFQlVHMSwgIkJlY29t ZVJlZ2lzdGVyZWRMaXN0ZW5lciglZCkiLCBNeVByb2NQaWQpOwogCiAJLyoKIAkgKiBCZWZv cmUgcmVnaXN0ZXJpbmcsIG1ha2Ugc3VyZSB3ZSB3aWxsIHVubGlzdGVuIGJlZm9yZSBkeWlu Zy4gKE5vdGU6CkBAIC0xMDk4LDYgKzE1NDMsOSBAQCBFeGVjX0xpc3RlblByZUNvbW1pdCh2 b2lkKQogCVFVRVVFX0JBQ0tFTkRfUE9TKE15UHJvY051bWJlcikgPSBtYXg7CiAJUVVFVUVf QkFDS0VORF9QSUQoTXlQcm9jTnVtYmVyKSA9IE15UHJvY1BpZDsKIAlRVUVVRV9CQUNLRU5E X0RCT0lEKE15UHJvY051bWJlcikgPSBNeURhdGFiYXNlSWQ7CisJUVVFVUVfQkFDS0VORF9X QUtFVVBfUEVORElORyhNeVByb2NOdW1iZXIpID0gZmFsc2U7CisJUVVFVUVfQkFDS0VORF9J U19BRFZBTkNJTkcoTXlQcm9jTnVtYmVyKSA9IGZhbHNlOworCVFVRVVFX0JBQ0tFTkRfQURW QU5DSU5HX1BPUyhNeVByb2NOdW1iZXIpID0gbWF4OwogCS8qIEluc2VydCBiYWNrZW5kIGlu dG8gbGlzdCBvZiBsaXN0ZW5lcnMgYXQgY29ycmVjdCBwb3NpdGlvbiAqLwogCWlmIChwcmV2 TGlzdGVuZXIgIT0gSU5WQUxJRF9QUk9DX05VTUJFUikKIAl7CkBAIC0xMTI3LDk5ICsxNTc1 LDIyNSBAQCBFeGVjX0xpc3RlblByZUNvbW1pdCh2b2lkKQogfQogCiAvKgotICogRXhlY19M aXN0ZW5Db21taXQgLS0tIHN1YnJvdXRpbmUgZm9yIEF0Q29tbWl0X05vdGlmeQorICogUHJl cGFyZVRhYmxlRW50cmllc0Zvckxpc3RlbiAtLS0gc3Vicm91dGluZSBmb3IgUHJlQ29tbWl0 X05vdGlmeQogICoKLSAqIEFkZCB0aGUgY2hhbm5lbCB0byB0aGUgbGlzdCBvZiBjaGFubmVs cyB3ZSBhcmUgbGlzdGVuaW5nIG9uLgorICogUHJlcGFyZSBhIExJU1RFTiBieSByZWNvcmRp bmcgaXQgaW4gcGVuZGluZ0xpc3RlbkFjdGlvbnMsIHByZS1hbGxvY2F0aW5nCisgKiBhbiBl bnRyeSBpbiBsb2NhbENoYW5uZWxUYWJsZSwgYW5kIHByZS1hbGxvY2F0aW5nIGFuIGVudHJ5 IGluIHRoZSBzaGFyZWQKKyAqIGdsb2JhbENoYW5uZWxUYWJsZSB3aXRoIGxpc3RlbmluZz1m YWxzZS4gIFRoZSBsaXN0ZW5pbmcgZmxhZyBpcyBzZXQgdG8gdHJ1ZSBpbgorICogQXRDb21t aXRfTm90aWZ5LiAgT24gYWJvcnQsIHRoZSBwcmUtYWxsb2NhdGVkIGVudHJpZXMgYXJlIHJl bW92ZWQuCiAgKi8KIHN0YXRpYyB2b2lkCi1FeGVjX0xpc3RlbkNvbW1pdChjb25zdCBjaGFy ICpjaGFubmVsKQorUHJlcGFyZVRhYmxlRW50cmllc0Zvckxpc3Rlbihjb25zdCBjaGFyICpj aGFubmVsKQogewotCU1lbW9yeUNvbnRleHQgb2xkY29udGV4dDsKKwlHbG9iYWxDaGFubmVs S2V5IGtleTsKKwlHbG9iYWxDaGFubmVsRW50cnkgKmVudHJ5OworCWJvb2wJCWZvdW5kOwor CUxpc3RlbmVyRW50cnkgKmxpc3RlbmVyczsKKwlzdHJ1Y3QgUGVuZGluZ0xpc3RlbkVudHJ5 ICpwZW5kaW5nOwogCi0JLyogRG8gbm90aGluZyBpZiB3ZSBhcmUgYWxyZWFkeSBsaXN0ZW5p bmcgb24gdGhpcyBjaGFubmVsICovCi0JaWYgKElzTGlzdGVuaW5nT24oY2hhbm5lbCkpCisJ LyogUmVjb3JkIGluIGxvY2FsIHBlbmRpbmcgaGFzaCB0aGF0IHdlIHdhbnQgdG8gTElTVEVO ICovCisJcGVuZGluZyA9IChzdHJ1Y3QgUGVuZGluZ0xpc3RlbkVudHJ5ICopCisJCWhhc2hf c2VhcmNoKHBlbmRpbmdMaXN0ZW5BY3Rpb25zLCBjaGFubmVsLCBIQVNIX0VOVEVSLCAmZm91 bmQpOworCXBlbmRpbmctPmFjdGlvbiA9IFBFTkRJTkdfTElTVEVOOworCisJLyogUHJlLWFs bG9jYXRlIGluIGxvY2FsIGNhY2hlIChPT00tc2FmZTogYmVmb3JlIGNsb2cgY29tbWl0KSAq LworCSh2b2lkKSBoYXNoX3NlYXJjaChsb2NhbENoYW5uZWxUYWJsZSwgY2hhbm5lbCwgSEFT SF9FTlRFUiwgTlVMTCk7CisKKwkvKiBQcmUtYWxsb2NhdGUgZW50cnkgaW4gc2hhcmVkIGds b2JhbENoYW5uZWxUYWJsZSB3aXRoIGxpc3RlbmluZz1mYWxzZSAqLworCUdsb2JhbENoYW5u ZWxLZXlJbml0KCZrZXksIE15RGF0YWJhc2VJZCwgY2hhbm5lbCk7CisJZW50cnkgPSBkc2hh c2hfZmluZF9vcl9pbnNlcnQoZ2xvYmFsQ2hhbm5lbFRhYmxlLCAma2V5LCAmZm91bmQpOwor CisJaWYgKCFmb3VuZCkKKwl7CisJCWVudHJ5LT5saXN0ZW5lcnNBcnJheSA9IEludmFsaWRE c2FQb2ludGVyOworCQllbnRyeS0+bnVtTGlzdGVuZXJzID0gMDsKKwkJZW50cnktPmFsbG9j YXRlZExpc3RlbmVycyA9IDA7CisJfQorCisJaWYgKCFEc2FQb2ludGVySXNWYWxpZChlbnRy eS0+bGlzdGVuZXJzQXJyYXkpKQorCXsKKwkJZW50cnktPmxpc3RlbmVyc0FycmF5ID0gZHNh X2FsbG9jYXRlKGdsb2JhbENoYW5uZWxEU0EsCisJCQkJCQkJCQkJCSBzaXplb2YoTGlzdGVu ZXJFbnRyeSkgKiBJTklUSUFMX0xJU1RFTkVSU19BUlJBWV9TSVpFKTsKKwkJZW50cnktPmFs bG9jYXRlZExpc3RlbmVycyA9IElOSVRJQUxfTElTVEVORVJTX0FSUkFZX1NJWkU7CisJfQor CisJbGlzdGVuZXJzID0gKExpc3RlbmVyRW50cnkgKikgZHNhX2dldF9hZGRyZXNzKGdsb2Jh bENoYW5uZWxEU0EsIGVudHJ5LT5saXN0ZW5lcnNBcnJheSk7CisKKwkvKgorCSAqIENoZWNr IGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBlbnRyeSAocG9zc2libHkgZnJvbSBlYXJsaWVyIGlu IHRoaXMKKwkgKiB0cmFuc2FjdGlvbikKKwkgKi8KKwlmb3IgKGludCBpID0gMDsgaSA8IGVu dHJ5LT5udW1MaXN0ZW5lcnM7IGkrKykKKwl7CisJCWlmIChsaXN0ZW5lcnNbaV0ucHJvY05v ID09IE15UHJvY051bWJlcikKKwkJeworCQkJLyogQWxyZWFkeSBoYXZlIGFuIGVudHJ5OyBs aXN0ZW5pbmcgZmxhZyBzdGF5cyBhcy1pcyB1bnRpbCBjb21taXQgKi8KKwkJCWRzaGFzaF9y ZWxlYXNlX2xvY2soZ2xvYmFsQ2hhbm5lbFRhYmxlLCBlbnRyeSk7CisJCQlyZXR1cm47CisJ CX0KKwl9CisKKwkvKiBOZWVkIHRvIGFkZCBhIG5ldyBlbnRyeTsgZ3JvdyBhcnJheSBpZiBu ZWNlc3NhcnkgKi8KKwlpZiAoZW50cnktPm51bUxpc3RlbmVycyA+PSBlbnRyeS0+YWxsb2Nh dGVkTGlzdGVuZXJzKQorCXsKKwkJaW50CQkJbmV3X3NpemUgPSBlbnRyeS0+YWxsb2NhdGVk TGlzdGVuZXJzICogMjsKKwkJZHNhX3BvaW50ZXIgbmV3X2FycmF5ID0gZHNhX2FsbG9jYXRl KGdsb2JhbENoYW5uZWxEU0EsCisJCQkJCQkJCQkJCSBzaXplb2YoTGlzdGVuZXJFbnRyeSkg KiBuZXdfc2l6ZSk7CisJCUxpc3RlbmVyRW50cnkgKm5ld19saXN0ZW5lcnMgPSAoTGlzdGVu ZXJFbnRyeSAqKSBkc2FfZ2V0X2FkZHJlc3MoZ2xvYmFsQ2hhbm5lbERTQSwgbmV3X2FycmF5 KTsKKworCQltZW1jcHkobmV3X2xpc3RlbmVycywgbGlzdGVuZXJzLCBzaXplb2YoTGlzdGVu ZXJFbnRyeSkgKiBlbnRyeS0+bnVtTGlzdGVuZXJzKTsKKwkJZHNhX2ZyZWUoZ2xvYmFsQ2hh bm5lbERTQSwgZW50cnktPmxpc3RlbmVyc0FycmF5KTsKKwkJZW50cnktPmxpc3RlbmVyc0Fy cmF5ID0gbmV3X2FycmF5OworCQllbnRyeS0+YWxsb2NhdGVkTGlzdGVuZXJzID0gbmV3X3Np emU7CisJCWxpc3RlbmVycyA9IG5ld19saXN0ZW5lcnM7CisJfQorCisJbGlzdGVuZXJzW2Vu dHJ5LT5udW1MaXN0ZW5lcnNdLnByb2NObyA9IE15UHJvY051bWJlcjsKKwlsaXN0ZW5lcnNb ZW50cnktPm51bUxpc3RlbmVyc10ubGlzdGVuaW5nID0gZmFsc2U7CS8qIHN0YWdlZCwgbm90 IHlldAorCQkJCQkJCQkJCQkJCQkgKiBjb21taXR0ZWQgKi8KKwllbnRyeS0+bnVtTGlzdGVu ZXJzKys7CisKKwlkc2hhc2hfcmVsZWFzZV9sb2NrKGdsb2JhbENoYW5uZWxUYWJsZSwgZW50 cnkpOworfQorCisvKgorICogUHJlcGFyZVRhYmxlRW50cmllc0ZvclVubGlzdGVuIC0tLSBz dWJyb3V0aW5lIGZvciBQcmVDb21taXRfTm90aWZ5CisgKgorICogUHJlcGFyZSBhbiBVTkxJ U1RFTiBieSByZWNvcmRpbmcgaXQgaW4gcGVuZGluZ0xpc3RlbkFjdGlvbnMsIGJ1dCBvbmx5 IGlmCisgKiB3ZSdyZSBjdXJyZW50bHkgbGlzdGVuaW5nIChjb21taXR0ZWQgb3Igc3RhZ2Vk KS4gIFdlIGRvbid0IHRvdWNoCisgKiBnbG9iYWxDaGFubmVsVGFibGUgeWV0IC0gdGhlIGxp c3RlbmVyIGtlZXBzIHJlY2VpdmluZyBzaWduYWxzIHVudGlsCisgKiBjb21taXQsIHdoZW4g dGhlIGVudHJ5IGlzIHJlbW92ZWQuCisgKi8KK3N0YXRpYyB2b2lkCitQcmVwYXJlVGFibGVF bnRyaWVzRm9yVW5saXN0ZW4oY29uc3QgY2hhciAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgUGVu ZGluZ0xpc3RlbkVudHJ5ICpwZW5kaW5nOworCWJvb2wJCWZvdW5kOworCisJQXNzZXJ0KGxv Y2FsQ2hhbm5lbFRhYmxlICE9IE5VTEwpOworCWlmIChoYXNoX3NlYXJjaChsb2NhbENoYW5u ZWxUYWJsZSwgY2hhbm5lbCwgSEFTSF9GSU5ELCBOVUxMKSA9PSBOVUxMKQogCQlyZXR1cm47 CiAKIAkvKgotCSAqIEFkZCB0aGUgbmV3IGNoYW5uZWwgbmFtZSB0byBsaXN0ZW5DaGFubmVs cy4KLQkgKgotCSAqIFhYWCBJdCBpcyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRvIGdldCBh biBvdXQtb2YtbWVtb3J5IGZhaWx1cmUgaGVyZSwKLQkgKiB3aGljaCB3b3VsZCBiZSBiYWQg YmVjYXVzZSB3ZSBhbHJlYWR5IGNvbW1pdHRlZC4gIEZvciB0aGUgbW9tZW50IGl0Ci0JICog ZG9lc24ndCBzZWVtIHdvcnRoIHRyeWluZyB0byBndWFyZCBhZ2FpbnN0IHRoYXQsIGJ1dCBt YXliZSBpbXByb3ZlIHRoaXMKLQkgKiBsYXRlci4KKwkgKiBSZWNvcmQgaW4gbG9jYWwgcGVu ZGluZyBoYXNoIHRoYXQgd2Ugd2FudCB0byBVTkxJU1RFTi4gRG9uJ3QgdG91Y2gKKwkgKiBs b2NhbENoYW5uZWxUYWJsZSBvciBnbG9iYWxDaGFubmVsVGFibGUgeWV0IC0gd2Uga2VlcCBy ZWNlaXZpbmcgc2lnbmFscworCSAqIHVudGlsIGNvbW1pdC4KIAkgKi8KLQlvbGRjb250ZXh0 ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKFRvcE1lbW9yeUNvbnRleHQpOwotCWxpc3RlbkNo YW5uZWxzID0gbGFwcGVuZChsaXN0ZW5DaGFubmVscywgcHN0cmR1cChjaGFubmVsKSk7Ci0J TWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOworCXBlbmRpbmcgPSAoc3RydWN0 IFBlbmRpbmdMaXN0ZW5FbnRyeSAqKQorCQloYXNoX3NlYXJjaChwZW5kaW5nTGlzdGVuQWN0 aW9ucywgY2hhbm5lbCwgSEFTSF9FTlRFUiwgJmZvdW5kKTsKKwlwZW5kaW5nLT5hY3Rpb24g PSBQRU5ESU5HX1VOTElTVEVOOwogfQogCiAvKgotICogRXhlY19Vbmxpc3RlbkNvbW1pdCAt LS0gc3Vicm91dGluZSBmb3IgQXRDb21taXRfTm90aWZ5CisgKiBQcmVwYXJlVGFibGVFbnRy aWVzRm9yVW5saXN0ZW5BbGwgLS0tIHN1YnJvdXRpbmUgZm9yIFByZUNvbW1pdF9Ob3RpZnkK ICAqCi0gKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjaGFubmVsIG5hbWUgZnJvbSBsaXN0ZW5D aGFubmVscy4KKyAqIFByZXBhcmUgVU5MSVNURU4gKiBieSByZWNvcmRpbmcgYWxsIGxpc3Rl bmVkIGNoYW5uZWxzIGluIHBlbmRpbmdMaXN0ZW5BY3Rpb25zCisgKiB3aXRoIGxpc3Rlbmlu Zz1mYWxzZS4KICAqLwogc3RhdGljIHZvaWQKLUV4ZWNfVW5saXN0ZW5Db21taXQoY29uc3Qg Y2hhciAqY2hhbm5lbCkKK1ByZXBhcmVUYWJsZUVudHJpZXNGb3JVbmxpc3RlbkFsbCh2b2lk KQogewotCUxpc3RDZWxsICAgKnE7CisJSEFTSF9TRVFfU1RBVFVTIHNlcTsKKwlzdHJ1Y3Qg Q2hhbm5lbE5hbWUgKmNoYW5uZWxFbnRyeTsKKwlzdHJ1Y3QgUGVuZGluZ0xpc3RlbkVudHJ5 ICpwZW5kaW5nOwogCi0JaWYgKFRyYWNlX25vdGlmeSkKLQkJZWxvZyhERUJVRzEsICJFeGVj X1VubGlzdGVuQ29tbWl0KCVzLCVkKSIsIGNoYW5uZWwsIE15UHJvY1BpZCk7CisJLyoKKwkg KiBGaXJzdCwgc2V0IGFsbCBleGlzdGluZyBlbnRyaWVzIGluIHBlbmRpbmdMaXN0ZW5BY3Rp b25zIHRvIGZhbHNlLiBUaGlzCisJICogaGFuZGxlcyB0aGUgY2FzZSBvZiBMSVNURU4gZm9v OyBVTkxJU1RFTiBBTEwgLSBmb28gbmVlZHMgdG8gYmUgbWFya2VkCisJICogYXMgdW5saXN0 ZW4gZXZlbiB0aG91Z2ggaXQncyBub3QgaW4gbG9jYWxDaGFubmVsVGFibGUgeWV0LgorCSAq LworCWhhc2hfc2VxX2luaXQoJnNlcSwgcGVuZGluZ0xpc3RlbkFjdGlvbnMpOworCXdoaWxl ICgocGVuZGluZyA9IChzdHJ1Y3QgUGVuZGluZ0xpc3RlbkVudHJ5ICopIGhhc2hfc2VxX3Nl YXJjaCgmc2VxKSkgIT0gTlVMTCkKKwkJcGVuZGluZy0+YWN0aW9uID0gUEVORElOR19VTkxJ U1RFTjsKIAotCWZvcmVhY2gocSwgbGlzdGVuQ2hhbm5lbHMpCisJLyoKKwkgKiBUaGVuIHNj YW4gbG9jYWxDaGFubmVsVGFibGUgKGNvbW1pdHRlZCBjaGFubmVscykgYW5kIGFkZCBhbnkg dGhhdAorCSAqIGFyZW4ndCBhbHJlYWR5IGluIHBlbmRpbmdMaXN0ZW5BY3Rpb25zLgorCSAq LworCWlmIChsb2NhbENoYW5uZWxUYWJsZSAhPSBOVUxMKQogCXsKLQkJY2hhcgkgICAqbGNo YW4gPSAoY2hhciAqKSBsZmlyc3QocSk7Ci0KLQkJaWYgKHN0cmNtcChsY2hhbiwgY2hhbm5l bCkgPT0gMCkKKwkJaGFzaF9zZXFfaW5pdCgmc2VxLCBsb2NhbENoYW5uZWxUYWJsZSk7CisJ CXdoaWxlICgoY2hhbm5lbEVudHJ5ID0gKHN0cnVjdCBDaGFubmVsTmFtZSAqKSBoYXNoX3Nl cV9zZWFyY2goJnNlcSkpICE9IE5VTEwpCiAJCXsKLQkJCWxpc3RlbkNoYW5uZWxzID0gZm9y ZWFjaF9kZWxldGVfY3VycmVudChsaXN0ZW5DaGFubmVscywgcSk7Ci0JCQlwZnJlZShsY2hh bik7Ci0JCQlicmVhazsKKwkJCWJvb2wJCWZvdW5kOworCisJCQlwZW5kaW5nID0gKHN0cnVj dCBQZW5kaW5nTGlzdGVuRW50cnkgKikKKwkJCQloYXNoX3NlYXJjaChwZW5kaW5nTGlzdGVu QWN0aW9ucywgY2hhbm5lbEVudHJ5LT5jaGFubmVsLCBIQVNIX0VOVEVSLCAmZm91bmQpOwor CQkJcGVuZGluZy0+YWN0aW9uID0gUEVORElOR19VTkxJU1RFTjsKIAkJfQogCX0KLQotCS8q Ci0JICogV2UgZG8gbm90IGNvbXBsYWluIGFib3V0IHVubGlzdGVuaW5nIHNvbWV0aGluZyBu b3QgYmVpbmcgbGlzdGVuZWQ7Ci0JICogc2hvdWxkIHdlPwotCSAqLwogfQogCiAvKgotICog RXhlY19Vbmxpc3RlbkFsbENvbW1pdCAtLS0gc3Vicm91dGluZSBmb3IgQXRDb21taXRfTm90 aWZ5CisgKiBDbGVhbnVwTGlzdGVuZXJzT25FeGl0IC0tLSBjYWxsZWQgZnJvbSBBc3luY19V bmxpc3Rlbk9uRXhpdAogICoKLSAqCQlVbmxpc3RlbiBvbiBhbGwgY2hhbm5lbHMgZm9yIHRo aXMgYmFja2VuZC4KKyAqCQlSZW1vdmUgdGhpcyBiYWNrZW5kIGZyb20gYWxsIGNoYW5uZWxz IGluIHRoZSBzaGFyZWQgZ2xvYmFsIHRhYmxlLgogICovCiBzdGF0aWMgdm9pZAotRXhlY19V bmxpc3RlbkFsbENvbW1pdCh2b2lkKQorQ2xlYW51cExpc3RlbmVyc09uRXhpdCh2b2lkKQog eworCWRzaGFzaF9zZXFfc3RhdHVzIHN0YXR1czsKKwlHbG9iYWxDaGFubmVsRW50cnkgKmVu dHJ5OworCiAJaWYgKFRyYWNlX25vdGlmeSkKLQkJZWxvZyhERUJVRzEsICJFeGVjX1VubGlz dGVuQWxsQ29tbWl0KCVkKSIsIE15UHJvY1BpZCk7CisJCWVsb2coREVCVUcxLCAiQ2xlYW51 cExpc3RlbmVyc09uRXhpdCglZCkiLCBNeVByb2NQaWQpOworCisJLyogQ2xlYXIgb3VyIGxv Y2FsIGNhY2hlICovCisJaWYgKGxvY2FsQ2hhbm5lbFRhYmxlICE9IE5VTEwpCisJeworCQlo YXNoX2Rlc3Ryb3kobG9jYWxDaGFubmVsVGFibGUpOworCQlsb2NhbENoYW5uZWxUYWJsZSA9 IE5VTEw7CisJfQogCi0JbGlzdF9mcmVlX2RlZXAobGlzdGVuQ2hhbm5lbHMpOwotCWxpc3Rl bkNoYW5uZWxzID0gTklMOworCS8qIE5vdyByZW1vdmUgZnJvbSB0aGUgc2hhcmVkIGdsb2Jh bENoYW5uZWxUYWJsZSAqLworCWlmIChnbG9iYWxDaGFubmVsVGFibGUgPT0gTlVMTCkKKwkJ cmV0dXJuOworCisJZHNoYXNoX3NlcV9pbml0KCZzdGF0dXMsIGdsb2JhbENoYW5uZWxUYWJs ZSwgdHJ1ZSk7CisJd2hpbGUgKChlbnRyeSA9IGRzaGFzaF9zZXFfbmV4dCgmc3RhdHVzKSkg IT0gTlVMTCkKKwl7CisJCWlmIChlbnRyeS0+a2V5LmRib2lkID09IE15RGF0YWJhc2VJZCkK KwkJeworCQkJTGlzdGVuZXJFbnRyeSAqbGlzdGVuZXJzOworCQkJaW50CQkJaTsKKworCQkJ bGlzdGVuZXJzID0gKExpc3RlbmVyRW50cnkgKikgZHNhX2dldF9hZGRyZXNzKGdsb2JhbENo YW5uZWxEU0EsCisJCQkJCQkJCQkJCQkJCSAgZW50cnktPmxpc3RlbmVyc0FycmF5KTsKKwor CQkJZm9yIChpID0gMDsgaSA8IGVudHJ5LT5udW1MaXN0ZW5lcnM7IGkrKykKKwkJCXsKKwkJ CQlpZiAobGlzdGVuZXJzW2ldLnByb2NObyA9PSBNeVByb2NOdW1iZXIpCisJCQkJeworCQkJ CQllbnRyeS0+bnVtTGlzdGVuZXJzLS07CisJCQkJCWlmIChpIDwgZW50cnktPm51bUxpc3Rl bmVycykKKwkJCQkJCW1lbW1vdmUoJmxpc3RlbmVyc1tpXSwgJmxpc3RlbmVyc1tpICsgMV0s CisJCQkJCQkJCXNpemVvZihMaXN0ZW5lckVudHJ5KSAqIChlbnRyeS0+bnVtTGlzdGVuZXJz IC0gaSkpOworCisJCQkJCWlmIChlbnRyeS0+bnVtTGlzdGVuZXJzID09IDApCisJCQkJCXsK KwkJCQkJCWRzYV9mcmVlKGdsb2JhbENoYW5uZWxEU0EsIGVudHJ5LT5saXN0ZW5lcnNBcnJh eSk7CisJCQkJCQlkc2hhc2hfZGVsZXRlX2N1cnJlbnQoJnN0YXR1cyk7CisJCQkJCX0KKwkJ CQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWRzaGFzaF9zZXFfdGVybSgmc3Rh dHVzKTsKIH0KIAogLyoKICAqIFRlc3Qgd2hldGhlciB3ZSBhcmUgYWN0aXZlbHkgbGlzdGVu aW5nIG9uIHRoZSBnaXZlbiBjaGFubmVsIG5hbWUuCiAgKgogICogTm90ZTogdGhpcyBmdW5j dGlvbiBpcyBleGVjdXRlZCBmb3IgZXZlcnkgbm90aWZpY2F0aW9uIGZvdW5kIGluIHRoZSBx dWV1ZS4KLSAqIFBlcmhhcHMgaXQgaXMgd29ydGggZnVydGhlciBvcHRpbWl6YXRpb24sIGVn IGNvbnZlcnQgdGhlIGxpc3QgdG8gYSBzb3J0ZWQKLSAqIGFycmF5IHNvIHdlIGNhbiBiaW5h cnktc2VhcmNoIGl0LiAgSW4gcHJhY3RpY2UgdGhlIGxpc3QgaXMgbGlrZWx5IHRvIGJlCi0g KiBmYWlybHkgc2hvcnQsIHRob3VnaC4KICAqLwogc3RhdGljIGJvb2wKIElzTGlzdGVuaW5n T24oY29uc3QgY2hhciAqY2hhbm5lbCkKIHsKLQlMaXN0Q2VsbCAgICpwOworCWlmIChsb2Nh bENoYW5uZWxUYWJsZSA9PSBOVUxMKQorCQlyZXR1cm4gZmFsc2U7CiAKLQlmb3JlYWNoKHAs IGxpc3RlbkNoYW5uZWxzKQotCXsKLQkJY2hhcgkgICAqbGNoYW4gPSAoY2hhciAqKSBsZmly c3QocCk7Ci0KLQkJaWYgKHN0cmNtcChsY2hhbiwgY2hhbm5lbCkgPT0gMCkKLQkJCXJldHVy biB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIChoYXNoX3NlYXJjaChsb2Nh bENoYW5uZWxUYWJsZSwgY2hhbm5lbCwgSEFTSF9GSU5ELCBOVUxMKSAhPSBOVUxMKTsKIH0K IAogLyoKQEAgLTEyMjksNyArMTgwMyw3IEBAIElzTGlzdGVuaW5nT24oY29uc3QgY2hhciAq Y2hhbm5lbCkKIHN0YXRpYyB2b2lkCiBhc3luY1F1ZXVlVW5yZWdpc3Rlcih2b2lkKQogewot CUFzc2VydChsaXN0ZW5DaGFubmVscyA9PSBOSUwpOwkvKiBlbHNlIGNhbGxlciBlcnJvciAq LworCUFzc2VydChsb2NhbENoYW5uZWxUYWJsZSA9PSBOVUxMIHx8IGhhc2hfZ2V0X251bV9l bnRyaWVzKGxvY2FsQ2hhbm5lbFRhYmxlKSA9PSAwKTsJLyogZWxzZSBjYWxsZXIgZXJyb3Ig Ki8KIAogCWlmICghYW1SZWdpc3RlcmVkTGlzdGVuZXIpCS8qIG5vdGhpbmcgdG8gZG8gKi8K IAkJcmV0dXJuOwpAQCAtMTI0MSw2ICsxODE1LDkgQEAgYXN5bmNRdWV1ZVVucmVnaXN0ZXIo dm9pZCkKIAkvKiBNYXJrIG91ciBlbnRyeSBhcyBpbnZhbGlkICovCiAJUVVFVUVfQkFDS0VO RF9QSUQoTXlQcm9jTnVtYmVyKSA9IEludmFsaWRQaWQ7CiAJUVVFVUVfQkFDS0VORF9EQk9J RChNeVByb2NOdW1iZXIpID0gSW52YWxpZE9pZDsKKwlRVUVVRV9CQUNLRU5EX1dBS0VVUF9Q RU5ESU5HKE15UHJvY051bWJlcikgPSBmYWxzZTsKKwlRVUVVRV9CQUNLRU5EX0lTX0FEVkFO Q0lORyhNeVByb2NOdW1iZXIpID0gZmFsc2U7CisJU0VUX1FVRVVFX1BPUyhRVUVVRV9CQUNL RU5EX0FEVkFOQ0lOR19QT1MoTXlQcm9jTnVtYmVyKSwgMCwgMCk7CiAJLyogYW5kIHJlbW92 ZSBpdCBmcm9tIHRoZSBsaXN0ICovCiAJaWYgKFFVRVVFX0ZJUlNUX0xJU1RFTkVSID09IE15 UHJvY051bWJlcikKIAkJUVVFVUVfRklSU1RfTElTVEVORVIgPSBRVUVVRV9ORVhUX0xJU1RF TkVSKE15UHJvY051bWJlcik7CkBAIC0xNTY1LDEyICsyMTQyLDIxIEBAIGFzeW5jUXVldWVG aWxsV2FybmluZyh2b2lkKQogLyoKICAqIFNlbmQgc2lnbmFscyB0byBsaXN0ZW5pbmcgYmFj a2VuZHMuCiAgKgotICogTm9ybWFsbHkgd2Ugc2lnbmFsIG9ubHkgYmFja2VuZHMgaW4gb3Vy IG93biBkYXRhYmFzZSwgc2luY2Ugb25seSB0aG9zZQotICogYmFja2VuZHMgY291bGQgYmUg aW50ZXJlc3RlZCBpbiBub3RpZmllcyB3ZSBzZW5kLiAgSG93ZXZlciwgaWYgdGhlcmUncwot ICogbm90aWZ5IHRyYWZmaWMgaW4gb3VyIGRhdGFiYXNlIGJ1dCBubyB0cmFmZmljIGluIGFu b3RoZXIgZGF0YWJhc2UgdGhhdAotICogZG9lcyBoYXZlIGxpc3RlbmVyKHMpLCB0aG9zZSBs aXN0ZW5lcnMgd2lsbCBmYWxsIGZ1cnRoZXIgYW5kIGZ1cnRoZXIKLSAqIGJlaGluZC4gIFdh a2VuIHRoZW0gYW55d2F5IGlmIHRoZXkncmUgZmFyIGVub3VnaCBiZWhpbmQsIHNvIHRoYXQg dGhleSdsbAotICogYWR2YW5jZSB0aGVpciBxdWV1ZSBwb3NpdGlvbiBwb2ludGVycywgYWxs b3dpbmcgdGhlIGdsb2JhbCB0YWlsIHRvIGFkdmFuY2UuCisgKiBOb3JtYWxseSB3ZSBzaWdu YWwgb25seSBiYWNrZW5kcyBpbiBvdXIgb3duIGRhdGFiYXNlLCB0aGF0IGFyZQorICogbGlz dGVuaW5nIG9uIHRoZSBjaGFubmVscyB3aXRoIHBlbmRpbmcgbm90aWZpZXMsIHNpbmNlIG9u bHkgdGhvc2UKKyAqIGJhY2tlbmRzIGFyZSBpbnRlcmVzdGVkIGluIG5vdGlmaWVzIHdlIHNl bmQuCisgKgorICogQmFja2VuZHMgdGhhdCBhcmUgbm90IGludGVyZXN0ZWQgaW4gb3VyIG5v dGlmaWVzLCB0aGF0IGFyZSBrbm93bgorICogdG8gc3RpbGwgYmUgcG9zaXRpb25lZCBhdCB0 aGUgb2xkIHF1ZXVlIGhlYWQsIG9yIGFueXdoZXJlIGluIHRoZQorICogcXVldWUgcmVnaW9u IHdlIGp1c3Qgd3JvdGUsIGNhbiBiZSBzYWZlbHkgYWR2YW5jZWQgZGlyZWN0bHkgdG8gdGhl CisgKiBuZXcgaGVhZCwgc2luY2UgdGhhdCByZWdpb24gaXMga25vd24gdG8gY29udGFpbiBv bmx5IG91ciBvd24KKyAqIG5vdGlmaWNhdGlvbnMuICBUaGlzIGF2b2lkcyB1bm5lY2Vzc2Fy eSB3YWtldXBzIHdoZW4gdGhlcmUgaXMKKyAqIG5vdGhpbmcgb2YgaW50ZXJlc3QgdG8gdGhl bS4KKyAqCisgKiBCYWNrZW5kcyB0aGF0IGFyZSBub3QgaW50ZXJlc3RlZCBpbiBvdXIgbm90 aWZpZXMsIHRoYXQgYXJlIGFkdmFuY2luZworICogdG8gYSB0YXJnZXQgcG9zaXRpb24gYmVm b3JlIHRoZSBuZXcgcXVldWUgaGVhZCwgb3IgdGhhdCBhcmUgbm90CisgKiBhZHZhbmNpbmcg YW5kIGFyZSBzdGF0aW9uYXJ5IGF0IGEgcG9zaXRpb24gYmVmb3JlIHRoZSBvbGQgcXVldWUg aGVhZAorICogbmVlZHMgdG8gYmUgc2lnbmFsZWQgc2luY2Ugbm90aWZpY2F0aW9ucyBjb3Vs ZCBvdGhlcndpc2UgYmUgZGVsYXllZC4KICAqCiAgKiBTaW5jZSB3ZSBrbm93IHRoZSBQcm9j TnVtYmVyIGFuZCB0aGUgUGlkIHRoZSBzaWduYWxpbmcgaXMgcXVpdGUgY2hlYXAuCiAgKgpA QCAtMTU4MCw2MCArMjE2NiwxMDYgQEAgYXN5bmNRdWV1ZUZpbGxXYXJuaW5nKHZvaWQpCiBz dGF0aWMgdm9pZAogU2lnbmFsQmFja2VuZHModm9pZCkKIHsKLQlpbnQzMgkgICAqcGlkczsK LQlQcm9jTnVtYmVyICpwcm9jbm9zOwogCWludAkJCWNvdW50OworCUxpc3RDZWxsICAgKmxj OwogCi0JLyoKLQkgKiBJZGVudGlmeSBiYWNrZW5kcyB0aGF0IHdlIG5lZWQgdG8gc2lnbmFs LiAgV2UgZG9uJ3Qgd2FudCB0byBzZW5kCi0JICogc2lnbmFscyB3aGlsZSBob2xkaW5nIHRo ZSBOb3RpZnlRdWV1ZUxvY2ssIHNvIHRoaXMgbG9vcCBqdXN0IGJ1aWxkcyBhCi0JICogbGlz dCBvZiB0YXJnZXQgUElEcy4KLQkgKgotCSAqIFhYWCBpbiBwcmluY2lwbGUgdGhlc2UgcGFs bG9jcyBjb3VsZCBmYWlsLCB3aGljaCB3b3VsZCBiZSBiYWQuIE1heWJlCi0JICogcHJlYWxs b2NhdGUgdGhlIGFycmF5cz8gIFRoZXkncmUgbm90IHRoYXQgbGFyZ2UsIHRob3VnaC4KLQkg Ki8KLQlwaWRzID0gKGludDMyICopIHBhbGxvYyhNYXhCYWNrZW5kcyAqIHNpemVvZihpbnQz MikpOwotCXByb2Nub3MgPSAoUHJvY051bWJlciAqKSBwYWxsb2MoTWF4QmFja2VuZHMgKiBz aXplb2YoUHJvY051bWJlcikpOworCUFzc2VydChzaWduYWxQaWRzICE9IE5VTEwgJiYgc2ln bmFsUHJvY25vcyAhPSBOVUxMKTsKIAljb3VudCA9IDA7CiAKIAlMV0xvY2tBY3F1aXJlKE5v dGlmeVF1ZXVlTG9jaywgTFdfRVhDTFVTSVZFKTsKLQlmb3IgKFByb2NOdW1iZXIgaSA9IFFV RVVFX0ZJUlNUX0xJU1RFTkVSOyBpICE9IElOVkFMSURfUFJPQ19OVU1CRVI7IGkgPSBRVUVV RV9ORVhUX0xJU1RFTkVSKGkpKQorCWZvcmVhY2gobGMsIHBlbmRpbmdOb3RpZnlDaGFubmVs cykKIAl7Ci0JCWludDMyCQlwaWQgPSBRVUVVRV9CQUNLRU5EX1BJRChpKTsKLQkJUXVldWVQ b3NpdGlvbiBwb3M7CisJCWNoYXIJICAgKmNoYW5uZWwgPSAoY2hhciAqKSBsZmlyc3QobGMp OworCQlHbG9iYWxDaGFubmVsRW50cnkgKmVudHJ5ID0gTlVMTDsKKwkJTGlzdGVuZXJFbnRy eSAqbGlzdGVuZXJzOwogCi0JCUFzc2VydChwaWQgIT0gSW52YWxpZFBpZCk7Ci0JCXBvcyA9 IFFVRVVFX0JBQ0tFTkRfUE9TKGkpOwotCQlpZiAoUVVFVUVfQkFDS0VORF9EQk9JRChpKSA9 PSBNeURhdGFiYXNlSWQpCisJCWlmIChnbG9iYWxDaGFubmVsVGFibGUgIT0gTlVMTCkKIAkJ ewotCQkJLyoKLQkJCSAqIEFsd2F5cyBzaWduYWwgbGlzdGVuZXJzIGluIG91ciBvd24gZGF0 YWJhc2UsIHVubGVzcyB0aGV5J3JlCi0JCQkgKiBhbHJlYWR5IGNhdWdodCB1cCAodW5saWtl bHksIGJ1dCBwb3NzaWJsZSkuCi0JCQkgKi8KKwkJCUdsb2JhbENoYW5uZWxLZXkga2V5Owor CisJCQlHbG9iYWxDaGFubmVsS2V5SW5pdCgma2V5LCBNeURhdGFiYXNlSWQsIGNoYW5uZWwp OworCQkJZW50cnkgPSBkc2hhc2hfZmluZChnbG9iYWxDaGFubmVsVGFibGUsICZrZXksIGZh bHNlKTsKKwkJfQorCisJCWlmIChlbnRyeSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJ bGlzdGVuZXJzID0gKExpc3RlbmVyRW50cnkgKikgZHNhX2dldF9hZGRyZXNzKGdsb2JhbENo YW5uZWxEU0EsCisJCQkJCQkJCQkJCQkJICBlbnRyeS0+bGlzdGVuZXJzQXJyYXkpOworCisJ CWZvciAoaW50IGogPSAwOyBqIDwgZW50cnktPm51bUxpc3RlbmVyczsgaisrKQorCQl7CisJ CQlQcm9jTnVtYmVyCWk7CisJCQlpbnQzMgkJcGlkOworCQkJUXVldWVQb3NpdGlvbiBwb3M7 CisKKwkJCWlmICghbGlzdGVuZXJzW2pdLmxpc3RlbmluZykKKwkJCQljb250aW51ZTsKKwor CQkJaSA9IGxpc3RlbmVyc1tqXS5wcm9jTm87CisKKwkJCWlmIChRVUVVRV9CQUNLRU5EX1dB S0VVUF9QRU5ESU5HKGkpKQorCQkJCWNvbnRpbnVlOworCisJCQlwb3MgPSBRVUVVRV9CQUNL RU5EX1BPUyhpKTsKKwkJCXBpZCA9IFFVRVVFX0JBQ0tFTkRfUElEKGkpOworCisJCQkvKiBT a2lwIGlmIGNhdWdodCB1cCAqLwogCQkJaWYgKFFVRVVFX1BPU19FUVVBTChwb3MsIFFVRVVF X0hFQUQpKQogCQkJCWNvbnRpbnVlOworCisJCQlBc3NlcnQocGlkICE9IEludmFsaWRQaWQp OworCisJCQlRVUVVRV9CQUNLRU5EX1dBS0VVUF9QRU5ESU5HKGkpID0gdHJ1ZTsKKwkJCXNp Z25hbFBpZHNbY291bnRdID0gcGlkOworCQkJc2lnbmFsUHJvY25vc1tjb3VudF0gPSBpOwor CQkJY291bnQrKzsKIAkJfQotCQllbHNlCisKKwkJZHNoYXNoX3JlbGVhc2VfbG9jayhnbG9i YWxDaGFubmVsVGFibGUsIGVudHJ5KTsKKwl9CisKKwlpZiAocGVuZGluZ05vdGlmaWVzICE9 IE5VTEwpCisJeworCQlmb3IgKFByb2NOdW1iZXIgaSA9IFFVRVVFX0ZJUlNUX0xJU1RFTkVS OworCQkJIGkgIT0gSU5WQUxJRF9QUk9DX05VTUJFUjsKKwkJCSBpID0gUVVFVUVfTkVYVF9M SVNURU5FUihpKSkKIAkJewotCQkJLyoKLQkJCSAqIExpc3RlbmVycyBpbiBvdGhlciBkYXRh YmFzZXMgc2hvdWxkIGJlIHNpZ25hbGVkIG9ubHkgaWYgdGhleQotCQkJICogYXJlIGZhciBi ZWhpbmQuCi0JCQkgKi8KLQkJCWlmIChhc3luY1F1ZXVlUGFnZURpZmYoUVVFVUVfUE9TX1BB R0UoUVVFVUVfSEVBRCksCi0JCQkJCQkJCSAgIFFVRVVFX1BPU19QQUdFKHBvcykpIDwgUVVF VUVfQ0xFQU5VUF9ERUxBWSkKKwkJCVF1ZXVlUG9zaXRpb24gcG9zOworCQkJaW50MzIJCXBp ZDsKKworCQkJaWYgKFFVRVVFX0JBQ0tFTkRfV0FLRVVQX1BFTkRJTkcoaSkpCiAJCQkJY29u dGludWU7CisKKwkJCXBvcyA9IFFVRVVFX0JBQ0tFTkRfUE9TKGkpOworCQkJcGlkID0gUVVF VUVfQkFDS0VORF9QSUQoaSk7CisKKwkJCWlmIChRVUVVRV9CQUNLRU5EX0lTX0FEVkFOQ0lO RyhpKSA/CisJCQkJUVVFVUVfUE9TX1BSRUNFREVTKFFVRVVFX0JBQ0tFTkRfQURWQU5DSU5H X1BPUyhpKSwgcXVldWVIZWFkQWZ0ZXJXcml0ZSkgOgorCQkJCVFVRVVFX1BPU19QUkVDRURF Uyhwb3MsIHF1ZXVlSGVhZEJlZm9yZVdyaXRlKSkKKwkJCXsKKwkJCQlBc3NlcnQocGlkICE9 IEludmFsaWRQaWQpOworCisJCQkJUVVFVUVfQkFDS0VORF9XQUtFVVBfUEVORElORyhpKSA9 IHRydWU7CisJCQkJc2lnbmFsUGlkc1tjb3VudF0gPSBwaWQ7CisJCQkJc2lnbmFsUHJvY25v c1tjb3VudF0gPSBpOworCQkJCWNvdW50Kys7CisJCQl9CisJCQllbHNlIGlmICghUVVFVUVf QkFDS0VORF9JU19BRFZBTkNJTkcoaSkgJiYKKwkJCQkJIFFVRVVFX1BPU19QUkVDRURFUyhw b3MsIHF1ZXVlSGVhZEFmdGVyV3JpdGUpKQorCQkJeworCQkJCUFzc2VydCghUVVFVUVfUE9T X1BSRUNFREVTKHBvcywgcXVldWVIZWFkQmVmb3JlV3JpdGUpKTsKKworCQkJCVFVRVVFX0JB Q0tFTkRfUE9TKGkpID0gcXVldWVIZWFkQWZ0ZXJXcml0ZTsKKwkJCX0KIAkJfQotCQkvKiBP SywgbmVlZCB0byBzaWduYWwgdGhpcyBvbmUgKi8KLQkJcGlkc1tjb3VudF0gPSBwaWQ7Ci0J CXByb2Nub3NbY291bnRdID0gaTsKLQkJY291bnQrKzsKIAl9CiAJTFdMb2NrUmVsZWFzZShO b3RpZnlRdWV1ZUxvY2spOwogCiAJLyogTm93IHNlbmQgc2lnbmFscyAqLwogCWZvciAoaW50 IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKIAl7Ci0JCWludDMyCQlwaWQgPSBwaWRzW2ldOwor CQlpbnQzMgkJcGlkID0gc2lnbmFsUGlkc1tpXTsKIAogCQkvKgogCQkgKiBJZiB3ZSBhcmUg c2lnbmFsaW5nIG91ciBvd24gcHJvY2Vzcywgbm8gbmVlZCB0byBpbnZvbHZlIHRoZSBrZXJu ZWw7CkBAIC0xNjUxLDEyICsyMjgzLDkgQEAgU2lnbmFsQmFja2VuZHModm9pZCkKIAkJICog Tm90aWZ5UXVldWVMb2NrOyB3aGljaCBpcyB1bmxpa2VseSBidXQgY2VydGFpbmx5IHBvc3Np YmxlLiBTbyB3ZQogCQkgKiBqdXN0IGxvZyBhIGxvdy1sZXZlbCBkZWJ1ZyBtZXNzYWdlIGlm IGl0IGhhcHBlbnMuCiAJCSAqLwotCQlpZiAoU2VuZFByb2NTaWduYWwocGlkLCBQUk9DU0lH X05PVElGWV9JTlRFUlJVUFQsIHByb2Nub3NbaV0pIDwgMCkKKwkJaWYgKFNlbmRQcm9jU2ln bmFsKHBpZCwgUFJPQ1NJR19OT1RJRllfSU5URVJSVVBULCBzaWduYWxQcm9jbm9zW2ldKSA8 IDApCiAJCQllbG9nKERFQlVHMywgImNvdWxkIG5vdCBzaWduYWwgYmFja2VuZCB3aXRoIFBJ RCAlZDogJW0iLCBwaWQpOwogCX0KLQotCXBmcmVlKHBpZHMpOwotCXBmcmVlKHByb2Nub3Mp OwogfQogCiAvKgpAQCAtMTY2NCwxOCArMjI5MywyMiBAQCBTaWduYWxCYWNrZW5kcyh2b2lk KQogICoKICAqCVRoaXMgaXMgY2FsbGVkIGF0IHRyYW5zYWN0aW9uIGFib3J0LgogICoKLSAq CUdldHMgcmlkIG9mIHBlbmRpbmcgYWN0aW9ucyBhbmQgb3V0Ym91bmQgbm90aWZpZXMgdGhh dCB3ZSB3b3VsZCBoYXZlCi0gKglleGVjdXRlZCBpZiB0aGUgdHJhbnNhY3Rpb24gZ290IGNv bW1pdHRlZC4KKyAqCVJldmVydCBhbnkgc3RhZ2VkIGxpc3Rlbi91bmxpc3RlbiBjaGFuZ2Vz IGFuZCBjbGVhbiB1cCB0cmFuc2FjdGlvbiBzdGF0ZS4KKyAqCVRoaXMgb25seSBkb2VzIHdv cmsgaWYgd2UgYWJvcnQgYWZ0ZXIgUHJlQ29tbWl0X05vdGlmeSBoYXMgc3RhZ2VkIGVudHJp ZXMuCiAgKi8KIHZvaWQKIEF0QWJvcnRfTm90aWZ5KHZvaWQpCiB7CiAJLyoKLQkgKiBJZiB3 ZSBMSVNURU4gYnV0IHRoZW4gcm9sbCBiYWNrIHRoZSB0cmFuc2FjdGlvbiBhZnRlciBQcmVD b21taXRfTm90aWZ5LAotCSAqIHdlIGhhdmUgcmVnaXN0ZXJlZCBhcyBhIGxpc3RlbmVyIGJ1 dCBoYXZlIG5vdCBtYWRlIGFueSBlbnRyeSBpbgotCSAqIGxpc3RlbkNoYW5uZWxzLiAgSW4g dGhhdCBjYXNlLCBkZXJlZ2lzdGVyIGFnYWluLgorCSAqIFJldmVydCBzdGFnZWQgbGlzdGVu L3VubGlzdGVuIGNoYW5nZXMuIE9ubHkgc3RhZ2VkIExJU1RFTnMgbmVlZAorCSAqIHVuZG9p bmcsIHNpbmNlIHN0YWdlZCBVTkxJU1RFTnMgZG9uJ3QgdG91Y2ggdGhlIGdsb2JhbCB0YWJs ZSB1bnRpbAorCSAqIGNvbW1pdC4KIAkgKi8KLQlpZiAoYW1SZWdpc3RlcmVkTGlzdGVuZXIg JiYgbGlzdGVuQ2hhbm5lbHMgPT0gTklMKQorCUFwcGx5UGVuZGluZ0xpc3RlbkFjdGlvbnMo UEVORElOR19MSVNURU5fQVBQTFlfQUJPUlQpOworCisJLyogSWYgd2UncmUgbm8gbG9uZ2Vy IGxpc3RlbmluZyBvbiBhbnl0aGluZywgdW5yZWdpc3RlciAqLworCWlmIChhbVJlZ2lzdGVy ZWRMaXN0ZW5lciAmJgorCQkobG9jYWxDaGFubmVsVGFibGUgPT0gTlVMTCB8fCBoYXNoX2dl dF9udW1fZW50cmllcyhsb2NhbENoYW5uZWxUYWJsZSkgPT0gMCkpCiAJCWFzeW5jUXVldWVV bnJlZ2lzdGVyKCk7CiAKIAkvKiBBbmQgY2xlYW4gdXAgKi8KQEAgLTE4NTQsMjAgKzI0ODcs MjkgQEAgYXN5bmNRdWV1ZVJlYWRBbGxOb3RpZmljYXRpb25zKHZvaWQpCiAJUXVldWVQb3Np dGlvbiBoZWFkOwogCVNuYXBzaG90CXNuYXBzaG90OwogCi0JLyogRmV0Y2ggY3VycmVudCBz dGF0ZSAqLworCS8qCisJICogRmV0Y2ggY3VycmVudCBzdGF0ZSwgaW5kaWNhdGUgdG8gb3Ro ZXJzIHRoYXQgd2UgaGF2ZSB3b2tlbiB1cCwgYW5kIHRoYXQKKwkgKiB3ZSBub3cgd2lsbCBi ZSBhZHZhbmNpbmcgb3VyIHBvc2l0aW9uLgorCSAqLwogCUxXTG9ja0FjcXVpcmUoTm90aWZ5 UXVldWVMb2NrLCBMV19TSEFSRUQpOwogCS8qIEFzc2VydCBjaGVja3MgdGhhdCB3ZSBoYXZl IGEgdmFsaWQgc3RhdGUgZW50cnkgKi8KIAlBc3NlcnQoTXlQcm9jUGlkID09IFFVRVVFX0JB Q0tFTkRfUElEKE15UHJvY051bWJlcikpOworCVFVRVVFX0JBQ0tFTkRfV0FLRVVQX1BFTkRJ TkcoTXlQcm9jTnVtYmVyKSA9IGZhbHNlOworCWhlYWQgPSBRVUVVRV9IRUFEOwogCXBvcyA9 IFFVRVVFX0JBQ0tFTkRfUE9TKE15UHJvY051bWJlcik7Ci0JaGVhZCA9IFFVRVVFX0hFQUQ7 Ci0JTFdMb2NrUmVsZWFzZShOb3RpZnlRdWV1ZUxvY2spOwogCiAJaWYgKFFVRVVFX1BPU19F UVVBTChwb3MsIGhlYWQpKQogCXsKIAkJLyogTm90aGluZyB0byBkbywgd2UgaGF2ZSByZWFk IGFsbCBub3RpZmljYXRpb25zIGFscmVhZHkuICovCisJCUxXTG9ja1JlbGVhc2UoTm90aWZ5 UXVldWVMb2NrKTsKIAkJcmV0dXJuOwogCX0KIAorCVFVRVVFX0JBQ0tFTkRfSVNfQURWQU5D SU5HKE15UHJvY051bWJlcikgPSB0cnVlOworCVFVRVVFX0JBQ0tFTkRfQURWQU5DSU5HX1BP UyhNeVByb2NOdW1iZXIpID0gaGVhZDsKKworCUxXTG9ja1JlbGVhc2UoTm90aWZ5UXVldWVM b2NrKTsKKwogCS8qLS0tLS0tLS0tLQogCSAqIEdldCBzbmFwc2hvdCB3ZSdsbCB1c2UgdG8g ZGVjaWRlIHdoaWNoIHhhY3RzIGFyZSBzdGlsbCBpbiBwcm9ncmVzcy4KIAkgKiBUaGlzIGlz IHRyaWNraWVyIHRoYW4gaXQgbWlnaHQgc2VlbSwgYmVjYXVzZSBvZiByYWNlIGNvbmRpdGlv bnMuCkBAIC0xOTAyLDcgKzI1NDQsNyBAQCBhc3luY1F1ZXVlUmVhZEFsbE5vdGlmaWNhdGlv bnModm9pZCkKIAkgKgogCSAqIFdoYXQgd2UgZG8gZ3VhcmFudGVlIGlzIHRoYXQgd2UnbGwg c2VlIGFsbCBub3RpZmljYXRpb25zIGZyb20KIAkgKiB0cmFuc2FjdGlvbnMgY29tbWl0dGlu ZyBhZnRlciB0aGUgc25hcHNob3Qgd2UgdGFrZSBoZXJlLgotCSAqIEV4ZWNfTGlzdGVuUHJl Q29tbWl0IGhhcyBhbHJlYWR5IGFkZGVkIHVzIHRvIHRoZSBsaXN0ZW5lciBhcnJheSwKKwkg KiBCZWNvbWVSZWdpc3RlcmVkTGlzdGVuZXIgaGFzIGFscmVhZHkgYWRkZWQgdXMgdG8gdGhl IGxpc3RlbmVyIGFycmF5LAogCSAqIHNvIG5vIG5vdC15ZXQtY29tbWl0dGVkIG1lc3NhZ2Vz IGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlCiAJICogYmVmb3JlIHdlIHNlZSB0aGVt LgogCSAqLS0tLS0tLS0tLQpAQCAtMTk1NCw2ICsyNTk2LDggQEAgYXN5bmNRdWV1ZVJlYWRB bGxOb3RpZmljYXRpb25zKHZvaWQpCiAKIAkJLyogVXBkYXRlIHNoYXJlZCBzdGF0ZSAqLwog CQlMV0xvY2tBY3F1aXJlKE5vdGlmeVF1ZXVlTG9jaywgTFdfU0hBUkVEKTsKKworCQlRVUVV RV9CQUNLRU5EX0lTX0FEVkFOQ0lORyhNeVByb2NOdW1iZXIpID0gZmFsc2U7CiAJCVFVRVVF X0JBQ0tFTkRfUE9TKE15UHJvY051bWJlcikgPSBwb3M7CiAJCUxXTG9ja1JlbGVhc2UoTm90 aWZ5UXVldWVMb2NrKTsKIApAQCAtMjA1MSw3ICsyNjk1LDcgQEAgYXN5bmNRdWV1ZVByb2Nl c3NQYWdlRW50cmllcyhRdWV1ZVBvc2l0aW9uICpjdXJyZW50LAogCQkJICogb3ZlciBpdCBv biB0aGUgZmlyc3QgTElTVEVOIGluIGEgc2Vzc2lvbiwgYW5kIG5vdCBnZXQgc3R1Y2sgb24K IAkJCSAqIGl0IGluZGVmaW5pdGVseS4KIAkJCSAqLwotCQkJaWYgKGxpc3RlbkNoYW5uZWxz ID09IE5JTCkKKwkJCWlmIChsb2NhbENoYW5uZWxUYWJsZSA9PSBOVUxMIHx8IGhhc2hfZ2V0 X251bV9lbnRyaWVzKGxvY2FsQ2hhbm5lbFRhYmxlKSA9PSAwKQogCQkJCWNvbnRpbnVlOwog CiAJCQlpZiAoVHJhbnNhY3Rpb25JZERpZENvbW1pdChxZS0+eGlkKSkKQEAgLTIzMDYsNyAr Mjk1MCw3IEBAIFByb2Nlc3NJbmNvbWluZ05vdGlmeShib29sIGZsdXNoKQogCW5vdGlmeUlu dGVycnVwdFBlbmRpbmcgPSBmYWxzZTsKIAogCS8qIERvIG5vdGhpbmcgZWxzZSBpZiB3ZSBh cmVuJ3QgYWN0aXZlbHkgbGlzdGVuaW5nICovCi0JaWYgKGxpc3RlbkNoYW5uZWxzID09IE5J TCkKKwlpZiAobG9jYWxDaGFubmVsVGFibGUgPT0gTlVMTCB8fCBoYXNoX2dldF9udW1fZW50 cmllcyhsb2NhbENoYW5uZWxUYWJsZSkgPT0gMCkKIAkJcmV0dXJuOwogCiAJaWYgKFRyYWNl X25vdGlmeSkKQEAgLTI0MTAsMTMgKzMwNTQsMTUgQEAgQWRkRXZlbnRUb1BlbmRpbmdOb3Rp ZmllcyhOb3RpZmljYXRpb24gKm4pCiB7CiAJQXNzZXJ0KHBlbmRpbmdOb3RpZmllcy0+ZXZl bnRzICE9IE5JTCk7CiAKLQkvKiBDcmVhdGUgdGhlIGhhc2ggdGFibGUgaWYgaXQncyB0aW1l IHRvICovCisJLyogQ3JlYXRlIHRoZSBoYXNoIHRhYmxlcyBpZiBpdCdzIHRpbWUgdG8gKi8K IAlpZiAobGlzdF9sZW5ndGgocGVuZGluZ05vdGlmaWVzLT5ldmVudHMpID49IE1JTl9IQVNI QUJMRV9OT1RJRklFUyAmJgogCQlwZW5kaW5nTm90aWZpZXMtPmhhc2h0YWIgPT0gTlVMTCkK IAl7CiAJCUhBU0hDVEwJCWhhc2hfY3RsOwogCQlMaXN0Q2VsbCAgICpsOwogCisJCUFzc2Vy dChwZW5kaW5nTm90aWZpZXMtPnVuaXF1ZUNoYW5uZWxOYW1lcyA9PSBOVUxMKTsKKwogCQkv KiBDcmVhdGUgdGhlIGhhc2ggdGFibGUgKi8KIAkJaGFzaF9jdGwua2V5c2l6ZSA9IHNpemVv ZihOb3RpZmljYXRpb24gKik7CiAJCWhhc2hfY3RsLmVudHJ5c2l6ZSA9IHNpemVvZihzdHJ1 Y3QgTm90aWZpY2F0aW9uSGFzaCk7CkBAIC0yNDI5LDEwICszMDc1LDIyIEBAIEFkZEV2ZW50 VG9QZW5kaW5nTm90aWZpZXMoTm90aWZpY2F0aW9uICpuKQogCQkJCQkJJmhhc2hfY3RsLAog CQkJCQkJSEFTSF9FTEVNIHwgSEFTSF9GVU5DVElPTiB8IEhBU0hfQ09NUEFSRSB8IEhBU0hf Q09OVEVYVCk7CiAKKwkJLyogQ3JlYXRlIHRoZSB1bmlxdWUgY2hhbm5lbCBuYW1lIHRhYmxl ICovCisJCW1lbXNldCgmaGFzaF9jdGwsIDAsIHNpemVvZihoYXNoX2N0bCkpOworCQloYXNo X2N0bC5rZXlzaXplID0gTkFNRURBVEFMRU47CisJCWhhc2hfY3RsLmVudHJ5c2l6ZSA9IHNp emVvZihzdHJ1Y3QgQ2hhbm5lbE5hbWUpOworCQloYXNoX2N0bC5oY3h0ID0gQ3VyVHJhbnNh Y3Rpb25Db250ZXh0OworCQlwZW5kaW5nTm90aWZpZXMtPnVuaXF1ZUNoYW5uZWxOYW1lcyA9 CisJCQloYXNoX2NyZWF0ZSgiUGVuZGluZyBOb3RpZnkgQ2hhbm5lbCBOYW1lcyIsCisJCQkJ CQk2NEwsCisJCQkJCQkmaGFzaF9jdGwsCisJCQkJCQlIQVNIX0VMRU0gfCBIQVNIX1NUUklO R1MgfCBIQVNIX0NPTlRFWFQpOworCiAJCS8qIEluc2VydCBhbGwgdGhlIGFscmVhZHktZXhp c3RpbmcgZXZlbnRzICovCiAJCWZvcmVhY2gobCwgcGVuZGluZ05vdGlmaWVzLT5ldmVudHMp CiAJCXsKIAkJCU5vdGlmaWNhdGlvbiAqb2xkbiA9IChOb3RpZmljYXRpb24gKikgbGZpcnN0 KGwpOworCQkJY2hhcgkgICAqY2hhbm5lbCA9IG9sZG4tPmRhdGE7CiAJCQlib29sCQlmb3Vu ZDsKIAogCQkJKHZvaWQpIGhhc2hfc2VhcmNoKHBlbmRpbmdOb3RpZmllcy0+aGFzaHRhYiwK QEAgLTI0NDAsMjIgKzMwOTgsNDIgQEAgQWRkRXZlbnRUb1BlbmRpbmdOb3RpZmllcyhOb3Rp ZmljYXRpb24gKm4pCiAJCQkJCQkJICAgSEFTSF9FTlRFUiwKIAkJCQkJCQkgICAmZm91bmQp OwogCQkJQXNzZXJ0KCFmb3VuZCk7CisKKwkJCS8qIEluc2VydCBjaGFubmVsIGludG8gdW5p cXVlQ2hhbm5lbE5hbWVzICovCisJCQkodm9pZCkgaGFzaF9zZWFyY2gocGVuZGluZ05vdGlm aWVzLT51bmlxdWVDaGFubmVsTmFtZXMsCisJCQkJCQkJICAgY2hhbm5lbCwKKwkJCQkJCQkg ICBIQVNIX0VOVEVSLAorCQkJCQkJCSAgICZmb3VuZCk7CisJCQkvKiBmb3VuZCBtYXkgYmUg dHJ1ZSBpZiBtdWx0aXBsZSBldmVudHMgb24gc2FtZSBjaGFubmVsICovCiAJCX0KIAl9CiAK IAkvKiBBZGQgbmV3IGV2ZW50IHRvIHRoZSBsaXN0LCBpbiBvcmRlciAqLwogCXBlbmRpbmdO b3RpZmllcy0+ZXZlbnRzID0gbGFwcGVuZChwZW5kaW5nTm90aWZpZXMtPmV2ZW50cywgbik7 CiAKLQkvKiBBZGQgZXZlbnQgdG8gdGhlIGhhc2ggdGFibGUgaWYgbmVlZGVkICovCisJLyog QWRkIGV2ZW50IHRvIHRoZSBoYXNoIHRhYmxlcyBpZiBuZWVkZWQgKi8KIAlpZiAocGVuZGlu Z05vdGlmaWVzLT5oYXNodGFiICE9IE5VTEwpCiAJewogCQlib29sCQlmb3VuZDsKIAorCQlB c3NlcnQocGVuZGluZ05vdGlmaWVzLT51bmlxdWVDaGFubmVsTmFtZXMgIT0gTlVMTCk7CisK IAkJKHZvaWQpIGhhc2hfc2VhcmNoKHBlbmRpbmdOb3RpZmllcy0+aGFzaHRhYiwKIAkJCQkJ CSAgICZuLAogCQkJCQkJICAgSEFTSF9FTlRFUiwKIAkJCQkJCSAgICZmb3VuZCk7CiAJCUFz c2VydCghZm91bmQpOworCisJCS8qIEFkZCBjaGFubmVsIHRvIHVuaXF1ZUNoYW5uZWxOYW1l cyAqLworCQl7CisJCQljaGFyCSAgICpjaGFubmVsID0gbi0+ZGF0YTsKKworCQkJKHZvaWQp IGhhc2hfc2VhcmNoKHBlbmRpbmdOb3RpZmllcy0+dW5pcXVlQ2hhbm5lbE5hbWVzLAorCQkJ CQkJCSAgIGNoYW5uZWwsCisJCQkJCQkJICAgSEFTSF9FTlRFUiwKKwkJCQkJCQkgICAmZm91 bmQpOworCQkJLyogZm91bmQgbWF5IGJlIHRydWUgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGV2 ZW50IG9uIHRoaXMgY2hhbm5lbCAqLworCQl9CiAJfQogfQogCkBAIC0yNDkzLDcgKzMxNzEs NyBAQCBub3RpZmljYXRpb25fbWF0Y2goY29uc3Qgdm9pZCAqa2V5MSwgY29uc3Qgdm9pZCAq a2V5MiwgU2l6ZSBrZXlzaXplKQogCXJldHVybiAxOwkJCQkJLyogbm90IGVxdWFsICovCiB9 CiAKLS8qIENsZWFyIHRoZSBwZW5kaW5nQWN0aW9ucyBhbmQgcGVuZGluZ05vdGlmaWVzIGxp c3RzLiAqLworLyogQ2xlYXIgdGhlIHBlbmRpbmdBY3Rpb25zLCBwZW5kaW5nTm90aWZpZXMs IGFuZCBwZW5kaW5nTm90aWZ5Q2hhbm5lbHMgbGlzdHMuICovCiBzdGF0aWMgdm9pZAogQ2xl YXJQZW5kaW5nQWN0aW9uc0FuZE5vdGlmaWVzKHZvaWQpCiB7CkBAIC0yNTA1LDYgKzMxODMs MTIgQEAgQ2xlYXJQZW5kaW5nQWN0aW9uc0FuZE5vdGlmaWVzKHZvaWQpCiAJICovCiAJcGVu ZGluZ0FjdGlvbnMgPSBOVUxMOwogCXBlbmRpbmdOb3RpZmllcyA9IE5VTEw7CisJcGVuZGlu Z05vdGlmeUNoYW5uZWxzID0gTklMOworCWlmIChwZW5kaW5nTGlzdGVuQWN0aW9ucyAhPSBO VUxMKQorCXsKKwkJaGFzaF9kZXN0cm95KHBlbmRpbmdMaXN0ZW5BY3Rpb25zKTsKKwkJcGVu ZGluZ0xpc3RlbkFjdGlvbnMgPSBOVUxMOworCX0KIH0KIAogLyoKQEAgLTI1MTUsMyArMzE5 OSwxNiBAQCBjaGVja19ub3RpZnlfYnVmZmVycyhpbnQgKm5ld3ZhbCwgdm9pZCAqKmV4dHJh LCBHdWNTb3VyY2Ugc291cmNlKQogewogCXJldHVybiBjaGVja19zbHJ1X2J1ZmZlcnMoIm5v dGlmeV9idWZmZXJzIiwgbmV3dmFsKTsKIH0KKworCisvKgorICogR2xvYmFsQ2hhbm5lbEtl eUluaXQKKyAqCQlQcmVwYXJlIGEgZ2xvYmFsIGNoYW5uZWwgdGFibGUga2V5IGZvciBoYXNo aW5nLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK0dsb2JhbENoYW5uZWxLZXlJbml0KEds b2JhbENoYW5uZWxLZXkgKmtleSwgT2lkIGRib2lkLCBjb25zdCBjaGFyICpjaGFubmVsKQor eworCW1lbXNldChrZXksIDAsIHNpemVvZihHbG9iYWxDaGFubmVsS2V5KSk7CisJa2V5LT5k Ym9pZCA9IGRib2lkOworCXN0cmxjcHkoa2V5LT5jaGFubmVsLCBjaGFubmVsLCBOQU1FREFU QUxFTik7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS93YWl0 X2V2ZW50X25hbWVzLnR4dCBiL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L3dhaXRfZXZl bnRfbmFtZXMudHh0CmluZGV4IDMyOTlkZTIzYmIzLi43MTk0YWVlMzUzMiAxMDA2NDQKLS0t IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQKKysr IGIvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvd2FpdF9ldmVudF9uYW1lcy50eHQKQEAg LTM3Miw2ICszNzIsNyBAQCBTdWJ0cmFuc0J1ZmZlcgkiV2FpdGluZyBmb3IgSS9PIG9uIGEg c3ViLXRyYW5zYWN0aW9uIFNMUlUgYnVmZmVyLiIKIE11bHRpWGFjdE9mZnNldEJ1ZmZlcgki V2FpdGluZyBmb3IgSS9PIG9uIGEgbXVsdGl4YWN0IG9mZnNldCBTTFJVIGJ1ZmZlci4iCiBN dWx0aVhhY3RNZW1iZXJCdWZmZXIJIldhaXRpbmcgZm9yIEkvTyBvbiBhIG11bHRpeGFjdCBt ZW1iZXIgU0xSVSBidWZmZXIuIgogTm90aWZ5QnVmZmVyCSJXYWl0aW5nIGZvciBJL08gb24g YSA8Y29tbWFuZD5OT1RJRlk8L2NvbW1hbmQ+IG1lc3NhZ2UgU0xSVSBidWZmZXIuIgorTm90 aWZ5Q2hhbm5lbEhhc2gJIldhaXRpbmcgdG8gYWNjZXNzIHRoZSA8Y29tbWFuZD5OT1RJRlk8 L2NvbW1hbmQ+IGNoYW5uZWwgaGFzaCB0YWJsZS4iCiBTZXJpYWxCdWZmZXIJIldhaXRpbmcg Zm9yIEkvTyBvbiBhIHNlcmlhbGl6YWJsZSB0cmFuc2FjdGlvbiBjb25mbGljdCBTTFJVIGJ1 ZmZlci4iCiBXQUxJbnNlcnQJIldhaXRpbmcgdG8gaW5zZXJ0IFdBTCBkYXRhIGludG8gYSBt ZW1vcnkgYnVmZmVyLiIKIEJ1ZmZlckNvbnRlbnQJIldhaXRpbmcgdG8gYWNjZXNzIGEgZGF0 YSBwYWdlIGluIG1lbW9yeS4iCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2x3 bG9ja2xpc3QuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2UvbHdsb2NrbGlzdC5oCmluZGV4IDk0 ZjgxOGI5ZjEwLi5lNmIzMmRhZmY5OSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFn ZS9sd2xvY2tsaXN0LmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9sd2xvY2tsaXN0LmgK QEAgLTEwMiw2ICsxMDIsNyBAQCBQR19MV0xPQ0tUUkFOQ0hFKFNVQlRSQU5TX0JVRkZFUiwg U3VidHJhbnNCdWZmZXIpCiBQR19MV0xPQ0tUUkFOQ0hFKE1VTFRJWEFDVE9GRlNFVF9CVUZG RVIsIE11bHRpWGFjdE9mZnNldEJ1ZmZlcikKIFBHX0xXTE9DS1RSQU5DSEUoTVVMVElYQUNU TUVNQkVSX0JVRkZFUiwgTXVsdGlYYWN0TWVtYmVyQnVmZmVyKQogUEdfTFdMT0NLVFJBTkNI RShOT1RJRllfQlVGRkVSLCBOb3RpZnlCdWZmZXIpCitQR19MV0xPQ0tUUkFOQ0hFKE5PVElG WV9DSEFOTkVMX0hBU0gsIE5vdGlmeUNoYW5uZWxIYXNoKQogUEdfTFdMT0NLVFJBTkNIRShT RVJJQUxfQlVGRkVSLCBTZXJpYWxCdWZmZXIpCiBQR19MV0xPQ0tUUkFOQ0hFKFdBTF9JTlNF UlQsIFdBTEluc2VydCkKIFBHX0xXTE9DS1RSQU5DSEUoQlVGRkVSX0NPTlRFTlQsIEJ1ZmZl ckNvbnRlbnQpCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlz dCBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CmluZGV4IDA5ZTdmMWQ0MjBl Li5iNzM3ZmRiMjNlOSAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZz Lmxpc3QKKysrIGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKQEAgLTExMTAs NiArMTExMCw4IEBAIEdpc3RTcGxpdFVuaW9uCiBHaXN0U3BsaXRWZWN0b3IKIEdpc3RUc1Zl Y3Rvck9wdGlvbnMKIEdpc3RWYWNTdGF0ZQorR2xvYmFsQ2hhbm5lbEVudHJ5CitHbG9iYWxD aGFubmVsS2V5CiBHbG9iYWxUcmFuc2FjdGlvbgogR2xvYmFsVHJhbnNhY3Rpb25EYXRhCiBH bG9iYWxWaXNIb3Jpem9uS2luZApAQCAtMTU3OSw2ICsxNTgxLDcgQEAgTGlzdFBhcnNlZExl eAogTGlzdGVuQWN0aW9uCiBMaXN0ZW5BY3Rpb25LaW5kCiBMaXN0ZW5TdG10CitMaXN0ZW5l ckVudHJ5CiBMb0luZm8KIExvYWRTdG10CiBMb2NhbEJ1ZmZlckxvb2t1cEVudApAQCAtMjE3 NSw2ICsyMTc4LDkgQEAgUGF0dGVybkluZm9BcnJheQogUGF0dGVybl9QcmVmaXhfU3RhdHVz CiBQYXR0ZXJuX1R5cGUKIFBlbmRpbmdGc3luY0VudHJ5CitQZW5kaW5nTGlzdGVuQWN0aW9u CitQZW5kaW5nTGlzdGVuQXBwbHlNb2RlCitQZW5kaW5nTGlzdGVuRW50cnkKIFBlbmRpbmdS ZWxEZWxldGUKIFBlbmRpbmdSZWxTeW5jCiBQZW5kaW5nVW5saW5rRW50cnkKLS0gCjIuNTAu MQoK --e7f9d88d3b6b4165867e81756e908ce5--