Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1s2YDQ-003xwo-FH for pgsql-hackers@arkaria.postgresql.org; Thu, 02 May 2024 15:19:21 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1s2YDN-001ndr-UR for pgsql-hackers@arkaria.postgresql.org; Thu, 02 May 2024 15:19:18 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1s2YDM-001nd6-Sv for pgsql-hackers@lists.postgresql.org; Thu, 02 May 2024 15:19:18 +0000 Received: from mail-lj1-x235.google.com ([2a00:1450:4864:20::235]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1s2YDE-0016Hx-Te for pgsql-hackers@lists.postgresql.org; Thu, 02 May 2024 15:19:15 +0000 Received: by mail-lj1-x235.google.com with SMTP id 38308e7fff4ca-2e1fa824504so9582051fa.0 for ; Thu, 02 May 2024 08:19:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1714663147; x=1715267947; darn=lists.postgresql.org; h=subject:from:to:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=Dzwzs+MqtewTqnCMuv3CaMhOBXwPcFmSOEICUi7EqzI=; b=jjBa3FivlpF9oUoEmBPQ6W+h2SD7Cww+XQs4boH7wIDbCQ8bTGnmstu90UMmHi55Oy RdQ+WzUGeCZqXP2VY2xzB595gEj8IfIYjQ/eNUUolOvdVxB97LnS72Lq6PyJukK9YWxi esRktz4fJ0l8riIPIfkHinTSNTfNDBjfbaMkZA1t3zBcYm2B/1nwfoPerI0tB3HecuIn iWBN0tB+Kws7DYDeJ6zwZaIZ1Ph1RR23Y4A0f9gNGd45/sgiXovAnWlpdcwLlXeLOtTK P34JMSjbEjYK8uDf0sxiB1bsuAkkkguP6ejv6mJ17cS1rXbb1MyxKnmgzcrAZ/GuedFn R3qQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1714663147; x=1715267947; h=subject:from:to:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=Dzwzs+MqtewTqnCMuv3CaMhOBXwPcFmSOEICUi7EqzI=; b=HD0JZkbFRhEmE5Sd498Y5JokMklhILdGIk/mc29iMm88RKV84ghw9f5o9EKY5S2s7a t7T4uu4zFPtejdC4JJffQ3pn/mLNv2fCdgkelkL4qdkKhKKBzho3z4UHibtR+ZZp+lqq 64gYeNwoKdGR9e99afWmyG+ox96ar2V2R1f2+z710oIK0TXXyDkWgYd0UNs/WOg2FxQp Gh0zoTaBz6m7gkuUfFDIuEO3ZOUaKvwxg6qeL+wFVD9WXPj59loNcdw6JAcA8oCNCwPm fYgMaHIW3dggedaQFRjfVHokkmMcpttXMxEkEIshQFa5u8Zh3GnMxRXS6OS2XOV7saQM bDkw== X-Gm-Message-State: AOJu0Yyprcrk4LC68E8p5BjFe7Lzor/UGIk6Fk69u3yF++ZEXlZomDcm FtUeNOHf+oaCSkxUYnZa3/62oHD/vi6Ydn6Stc54ohQV/uSFHqlb9VQLnhAkkbeV22rBBPCck5R pjqFqTAb8L5iC7yheCtfFOGedhWl90D2mXisFyItVXs0gUMkCR7OPOxJIi6NcYzmAMduwSGVf8N hMs2RCF2qpJVrWVtKPvbSvVnQgfc90qkyMQWpkLQbFwPinqpCz+jQaPAwTvofs3w== X-Google-Smtp-Source: AGHT+IHc9nZEKRK2JmKhyqHlEDGucTOX0tnjl3kvz/26ol+k8rga0l/HtlrfHhPKAV+OhnN9HZ7ICA== X-Received: by 2002:a2e:7a01:0:b0:2de:3ec7:8887 with SMTP id v1-20020a2e7a01000000b002de3ec78887mr37872ljc.18.1714663145705; Thu, 02 May 2024 08:19:05 -0700 (PDT) Received: from [10.137.0.18] (ip-86-49-229-30.bb.vodafone.cz. [86.49.229.30]) by smtp.gmail.com with ESMTPSA id h12-20020a05600c314c00b0041be9cb540esm2268320wmo.18.2024.05.02.08.19.04 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 02 May 2024 08:19:05 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------5ATIJri30SzyV9JJnS7e1Mjr" Message-ID: <6ab4003f-a8b8-4d75-a67f-f25ad98582dc@enterprisedb.com> Date: Thu, 2 May 2024 17:19:03 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: PostgreSQL Hackers From: Tomas Vondra Subject: Parallel CREATE INDEX for GIN indexes List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------5ATIJri30SzyV9JJnS7e1Mjr Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi, In PG17 we shall have parallel CREATE INDEX for BRIN indexes, and back when working on that I was thinking how difficult would it be to do something similar to do that for other index types, like GIN. I even had that on my list of ideas to pitch to potential contributors, as I was fairly sure it's doable and reasonably isolated / well-defined. However, I was not aware of any takers, so a couple days ago on a slow weekend I took a stab at it. And yes, it's doable - attached is a fairly complete, tested and polished version of the feature, I think. It turned out to be a bit more complex than I expected, for reasons that I'll get into when discussing the patches. First, let's talk about the benefits - how much faster is that than the single-process build we have for GIN indexes? I do have a table with the archive of all our mailing lists - it's ~1.5M messages, table is ~21GB (raw dump is about 28GB). This does include simple text data (message body), JSONB (headers) and tsvector (full-text on message body). If I do CREATE index with different number of workers (0 means serial build), I get this timings (in seconds): workers trgm tsvector jsonb jsonb (hash) ----------------------------------------------------- 0 1240 378 104 57 1 773 196 59 85 2 548 163 51 78 3 423 153 45 75 4 362 142 43 75 5 323 134 40 70 6 295 130 39 73 Perhaps an easier to understand result is this table with relative timing compared to serial build: workers trgm tsvector jsonb jsonb (hash) ----------------------------------------------------- 1 62% 52% 57% 149% 2 44% 43% 49% 136% 3 34% 40% 43% 132% 4 29% 38% 41% 131% 5 26% 35% 39% 123% 6 24% 34% 38% 129% This shows the benefits are pretty nice, depending on the opclass. For most indexes it's maybe ~3-4x faster, which is nice, and I don't think it's possible to do much better - the actual index inserts can happen from a single process only, which is the main limit. For some of the opclasses it can regress (like the jsonb_path_ops). I don't think that's a major issue. Or more precisely, I'm not surprised by it. It'd be nice to be able to disable the parallel builds in these cases somehow, but I haven't thought about that. I do plan to do some tests with btree_gin, but I don't expect that to behave significantly differently. There are small variations in the index size, when built in the serial way and the parallel way. It's generally within ~5-10%, and I believe it's due to the serial build adding the TIDs incrementally, while the build adds them in much larger chunks (possibly even in one chunk with all the TIDs for the key). I believe the same size variation can happen if the index gets built in a different way, e.g. by inserting the data in a different order, etc. I did a number of tests to check if the index produces the correct results, and I haven't found any issues. So I think this is OK, and neither a problem nor an advantage of the patch. Now, let's talk about the code - the series has 7 patches, with 6 non-trivial parts doing changes in focused and easier to understand pieces (I hope so). 1) v20240502-0001-Allow-parallel-create-for-GIN-indexes.patch This is the initial feature, adding the "basic" version, implemented as pretty much 1:1 copy of the BRIN parallel build and minimal changes to make it work for GIN (mostly about how to store intermediate results). The basic idea is that the workers do the regular build, but instead of flushing the data into the index after hitting the memory limit, it gets written into a shared tuplesort and sorted by the index key. And the leader then reads this sorted data, accumulates the TID for a given key and inserts that into the index in one go. 2) v20240502-0002-Use-mergesort-in-the-leader-process.patch The approach implemented by 0001 works, but there's a little bit of issue - if there are many distinct keys (e.g. for trigrams that can happen very easily), the workers will hit the memory limit with only very short TID lists for most keys. For serial build that means merging the data into a lot of random places, and in parallel build it means the leader will have to merge a lot of tiny lists from many sorted rows. Which can be quite annoying and expensive, because the leader does so using qsort() in the serial part. It'd be better to ensure most of the sorting happens in the workers, and the leader can do a mergesort. But the mergesort must not happen too often - merging many small lists is not cheaper than a single qsort (especially when the lists overlap). So this patch changes the workers to process the data in two phases. The first works as before, but the data is flushed into a local tuplesort. And then each workers sorts the results it produced, and combines them into results with much larger TID lists, and those results are written to the shared tuplesort. So the leader only gets very few lists to combine for a given key - usually just one list per worker. 3) v20240502-0003-Remove-the-explicit-pg_qsort-in-workers.patch In 0002 the workers still do an explicit qsort() on the TID list before writing the data into the shared tuplesort. But we can do better - the workers can do a merge sort too. To help with this, we add the first TID to the tuplesort tuple, and sort by that too - it helps the workers to process the data in an order that allows simple concatenation instead of the full mergesort. Note: There's a non-obvious issue due to parallel scans always being "sync scans", which may lead to very "wide" TID ranges when the scan wraps around. More about that later. 4) v20240502-0004-Compress-TID-lists-before-writing-tuples-t.patch The parallel build passes data between processes using temporary files, which means it may need significant amount of disk space. For BRIN this was not a major concern, because the summaries tend to be pretty small. But for GIN that's not the case, and the two-phase processing introduced by 0002 make it worse, because the worker essentially creates another copy of the intermediate data. It does not need to copy the key, so maybe it's not exactly 2x the space requirement, but in the worst case it's not far from that. But there's a simple way how to improve this - the TID lists tend to be very compressible, and GIN already implements a very light-weight TID compression, so this patch does just that - when building the tuple to be written into the tuplesort, we just compress the TIDs. 5) v20240502-0005-Collect-and-print-compression-stats.patch This patch simply collects some statistics about the compression, to show how much it reduces the amounts of data in the various phases. The data I've seen so far usually show ~75% compression in the first phase, and ~30% compression in the second phase. That is, in the first phase we save ~25% of space, in the second phase we save ~70% of space. An example of the log messages from this patch, for one worker (of two) in the trigram phase says: LOG: _gin_parallel_scan_and_build raw 10158870494 compressed 7519211584 ratio 74.02% LOG: _gin_process_worker_data raw 4593563782 compressed 1314800758 ratio 28.62% Put differently, a single-phase version without compression (as in 0001) would need ~10GB of disk space per worker. With compression, we need only about ~8.8GB for both phases (or ~7.5GB for the first phase alone). I do think these numbers look pretty good. The numbers are different for other opclasses (trigrams are rather extreme in how much space they need), but the overall behavior is the same. 6) v20240502-0006-Enforce-memory-limit-when-combining-tuples.patch Until this part, there's no limit on memory used by combining results for a single index key - it'll simply use as much memory as needed to combine all the TID lists. Which may not be a huge issue because each TID is only 6B, and we can accumulate a lot of those in a couple MB. And a parallel CREATE INDEX usually runs with a fairly significant values of maintenance_work_mem (in fact it requires it to even allow parallel). But still, there should be some memory limit. It however is not as simple as dumping current state into the index, because the TID lists produced by the workers may overlap, so the tail of the list may still receive TIDs from some future TID list. And that's a problem because ginEntryInsert() expects to receive TIDs in order, and if that's not the case it may fail with "could not split GIN page". But we already have the first TID for each sort tuple (and we consider it when sorting the data), and this is useful for deducing how far we can flush the data, and keep just the minimal part of the TID list that may change by merging. So this patch implements that - it introduces the concept of "freezing" the head of the TID list up to "first TID" from the next tuple, and uses that to write data into index if needed because of memory limit. We don't want to do that too often, so it only happens if we hit the memory limit and there's at least a certain number (1024) of TIDs. 7) v20240502-0007-Detect-wrap-around-in-parallel-callback.patch There's one more efficiency problem - the parallel scans are required to be synchronized, i.e. the scan may start half-way through the table, and then wrap around. Which however means the TID list will have a very wide range of TID values, essentially the min and max of for the key. Without 0006 this would cause frequent failures of the index build, with the error I already mentioned: ERROR: could not split GIN page; all old items didn't fit tracking the "safe" TID horizon addresses that. But there's still an issue with efficiency - having such a wide TID list forces the mergesort to actually walk the lists, because this wide list overlaps with every other list produced by the worker. And that's much more expensive than just simply concatenating them, which is what happens without the wrap around (because in that case the worker produces non-overlapping lists). One way to fix this would be to allow parallel scans to not be sync scans, but that seems fairly tricky and I'm not sure if that can be done. The BRIN parallel build had a similar issue, and it was just simpler to deal with this in the build code. So 0007 does something similar - it tracks if the TID value goes backward in the callback, and if it does it dumps the state into the tuplesort before processing the first tuple from the beginning of the table. Which means we end up with two separate "narrow" TID list, not one very wide one. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --------------5ATIJri30SzyV9JJnS7e1Mjr Content-Type: image/png; name="gin-parallel-absolute.png" Content-Disposition: attachment; filename="gin-parallel-absolute.png" Content-Transfer-Encoding: base64 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 AABQF10tlPkKYy48+U08cqkJrRZh+YpIfmlovhqTX76Wi1e8oU1+84ww0nGc7cNtG8lIf57s lltuKR5nLn351wjkj5tfitrsmmuuKb6m/mqUkN8oJL9xT37Zav5a+apOfifYfBVS5eKYF+n5 6lF+iV5+6WBz6cxGe9y5lP7oRz8qtufb8+8OzL9fT18W2Op5anV7s+H2bff5297Hq9vj8/yc 5+cxz1t+vvPX0GOOJM/rd7/73aLI58efy1guI9dee21x7FyYgn790bbnr3/llVcWf9b8uC6+ +OLicQ6373CG26+fn2c95kjbne9H1s5zol+j1XYAAIC66GqhHEvx5h35JWpjKS8+m38NAjrT 7vMY71Kqvw8QY4vnGQAAAONhwhXKeEON/DNNTz31VLEwzr+3Md6s57LLLtO7bJef/exn6Rvf +IZuhqmd5zFfncq/iiF/H/MVVXQHzzMAAADGy4QrlPEuqMMlvwR006ZNepftcsEFF1R+lQF8 7TyP+WW78b1sfnMhjC2eZwAAAIyXCVco8xt+5J8tzD/HFD8XmH9+K/8+uXzFEv0rv8lMvgKd 39hFf8chxg7PMwAAAMbLhCuUAAAAAID+QKEEAAAAAHSEQgkAAAAA6AiFEgAAAADQEQolAAAA AKAjFEoAAAAAQEcolAAAAACAjlAoAQAAAAAdoVACAAAAADpCoQQAAAAAdIRCCQAAAADoCIUS AAAAANARCiUAAAAAoCMUSgAAAABARyiUAAAAAICOUCgBAAAAAB2hUAIAAAAAOtL1QvnYY4+l /fbbTzenG264IR122GFp9913T0cccUS64447ytvWrl2bdtpppyEJK1euTNOnT0+TJk1Ks2fP TsuWLStvAwAAAACMn64WyjvvvDMdfvjhQwphOOSQQ9KSJUvSU089lT796U+no446qrwtbz/u uOOa9h40d+7ctHjx4rRhw4a0YMGCdPzxx+suAAAAAIBxUG16Y2ifffZJF1100bCFstmmTZvS HnvsUX5+6qmnptNPP71pj0H56uS6deuKj1etWpVmzpwpewAAAAAAxsPoTW87PfTQQ8V/WxXK 1atXp9e85jXl53PmzCleBrvXXnulI488Mt1///3lbVOmTEkDAwPFx5s3b06TJ08ubwMAAAAA jJ/Rm94YaVUozzjjjHT55ZeXn++7777pqquuKorjjTfemI499tjytl122aX8eNu2bWnnnXcu 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 --------------5ATIJri30SzyV9JJnS7e1Mjr Content-Type: image/png; name="gin-parallel-relative.png" Content-Disposition: attachment; filename="gin-parallel-relative.png" Content-Transfer-Encoding: base64 iVBORw0KGgoAAAANSUhEUgAAA5QAAAG0CAYAAABNBWhXAABeZElEQVR4Xuzdbazl5V3/+znl UFLawJOSHtL0j9M0tCEE2qYngdBH5yQnwQJPTgKNPqCkQR80JyRNLDpaEJE63kY7Vq3K6Iit NcKMHWuL9zcdQIaxamW0aJUbyQzKTdECpTMdfqfX6vW5un6fvTazZ33mYs/q7/1K3umetdde e7Pm65Xf17X3ni0DAAAAAABL2OI3AAAAAACwESyUAAAAAIClsFACAAAAAJbCQgkAAAAAWAoL JQAAAABgKSyUAAAAAIClsFACAAAAAJbCQgkAAAAAWAoLJQAAAABgKSyUAAAAAIClsFACAAAA AJbCQgkAAAAAWAoLJQAAAABgKSyUAAAAAIClsFACAAAAAJbCQgkAAAAAWAoLJQAAAABgKSyU AAAAAIClsFACAAAAAJbCQgkAAAAAWAoLJQAAAABgKSyUAAAAAIClsFACAAAAAJbCQgkAAAAA WAoLJQAAAABgKV0Xypdeemn4whe+4DevrFX97znVvu4f+IEfmHUqOJW+lo3a6Ne80fu9Ek7G 13IyHmNZm/m5AQAATmVdF8qf/dmf/Y66CFvV/55T7es+lS7OT6WvZaM2+jVv9H6vhJPxtZyM x1jWZn5uAACAU1nXhfI77SJsVf97VvXrfiWs4nMz1a/5ZDzGsjbzcwMAAJzKWChPwKr+96zq 1/1KWMXnZqpf88l4jGVt5ucGAAA4lXVbKHUBNp+/7ytf+crw8z//88O2bduG3/zN32zvf/HF F4dPf/rTw6233jp8+MMfHn7v935vOHr06LqPc+zYsWHv3r3DzTffPNxyyy3Dn/3Zn83e/7Wv fW34nd/5ndlj/PiP//jwB3/wB7PHWYb/t/jF5X333Tf8wi/8wvAjP/Ijww//8A8PO3bsGB54 4IHZ+/7zP/9zdv+f+qmfGn2MbN++ffb+//qv/5r9+Rvf+MbwJ3/yJ7Pbf/AHf3D4yEc+Mnzu c59b+LWX/8byXJX/vh/6oR8aPvaxjw3/8R//0d7vX7N/3UeOHJk9dvkc5XP9xE/8xHD33Xev +Vz62PX+zk7Eoq/j5Z6/eSf69Zbn9Nd//ddnX++P/uiPzmagPL9+v69//evDJz/5ydnn/rEf +7Hh93//94cXXnhh7hFf3he/+MXhV37lV2azVr6u2267bfb3Uh533ka/rqJ8bJnr8ndbnpcy y+W2Rc/fIovut8rPsx6jnA/ludBjfPazn52dAfM2+vdRbOQ5OZHPDQAAMCWbulD+6q/+6ux/ P/ShDw27d++eva9cnJWlyD/2t3/7t9d9nPKxfv/yS2gWPc4f/dEftY8/Ef4481/Hvn371rxP /fVf//XsPuWCtfz50KFD7eOKxx57bHZ7uYgtyi/Quf3229c8Tqk8X+X9Ui7uf+7nfm7N/cpF 9H//93/P7uPvK0m54P/lX/7lNe8vffzjHx9dKM9/DeV/5//OTpR/HRt5/oplvt7y/5Tw+/7x H//xmvvt3Llzzf3K35kveYuU5d8/VvlzpNuP93WV/5Zf/MVfXHOf+a/zePx+q/486/5lcfXH mP9cJ/L3sdHnRLcd73MDAABMTbeFstAFl9Pt5ZfFPPnkk6P3HThwYPa+8mrjwYMHZ6/A/cM/ /MNsSfLH059/8id/cvaqXHn1oLwyUm4rryD89E//9Oz28qqEls5y32X555fySkW5vSyx5ZWd 8vnuvffe2W3lFZ5CF67lVZ55+nrLqySF/vvLRXZZNsvjPf7447OFs9x+//33t48tF7zltvLq UfnvfP7559sF+/yF83pft77G8lz/0z/90+y5Ls95+fP811ToMRb9nZ0o/3o28vwVy3695fl7 7rnnZq9QldvKK79+vzJfZc7KY5bHXvSY67nppptm9y1fX/nay2OUV8n1tc7b6Nf1N3/zN7Pb yivuDz300Owx//Ef/7F9rtLx+P1W/XnWY5T/uy7/j5ny9ZdlTrfJifx9bPQ52ejnBgAAmJpN XSjLBaXTKwB+gfn5z39+zeMtepz/+Z//abf/y7/8S7u9LFvltvLtb8vyzy9leS23zy97rlxo l889/22v5dVGfauqvu2vvAJUHkvf/ipPPfXU7PbyypHoVaTy7X1SPq7cVpZMWe/r/qVf+qXZ 7WV5mVee+3J7eYVXFj3Xy/KvZyPPX7HM1/vlL3+53VZetS23zc+A7lfma54Wuvnn+0ToW7TL K7nzNvp1aQ7279/fbivKc+TP33r8fqv+POsx/vVf/7Xdpv+7Lt9q+3LW+/vY6HOSfG4AAIDv ZJu6UJYly5VXZMr7nn322dHtzzzzzJrH05/LhZ2UJU23l1cmFt2+rPU+vvyMp95XFuJ///d/ n71i6D9v9hu/8Ruz++jbXv/t3/5t9udPfOIT7T56xWa95l9h0X3LEv1y1vu69UqOP9fl5yTL 7eXVJNFjLPo7O1H+9Wz0+Vvm6y2vWkv5Vk3/3PpzeYx5eszyOTeqfM1lQSqvDpdXrfxzFRv9 usrPIS76b9Wy5o+7iN9v1Z/nRZ/r5f7veiN/Hxt9Tk70cwMAAEzFpi6U8z8PKDfeeOPsfX5B 93K/lMcfx+93vNs3ar2PL98qV355SvmlHrpPqSwFjzzySLtf+ZbFcru+7VXfhlu+pVH0379e 5f1+3+P9/Nl6X/fxnutFrzD5c70M/3o2+vwt8/U6v11/9udQjzn/fK+nLHmLft7RP1ex6LZF t5f/lvJn/28tX6ffdz1+v1V/nv0x17v9RP4+NvqcLPrYl7sdAABgKjZ1oVxEr46s90rG/Mf5 n5e9faOO9/Hl56rKz4d96lOfaq+0lt+IKuViuryqWL7ttbyKUy5ay7e8zi9p+lnR473qWOi+ X/3qV/1dI+t93es913o1uPw3yHqPsYz1Hut4z9/J+Hr9dv3Zn0M9Zvk7Op7f+q3fmt23fJtx +ZnY8nOw+s2+pfm/X//8692u/37/by2vGvp917Pe/Vb1efbHXO/2E/n7kOM9J/45jnc7AADA VJxyC2X5Vf/lff4zTfpZq/mP8z8ve/tGncjHlwvnct/y85Hz9KpkeVWk/G/5Zwfm6TfT+s/O LfLRj350dt8HH3yw3fb000/PbtvIz1Dqc/nPyumXksz/XNt6j7GMjTzWoufvZHy9frv+XH4p yzz9zG75rbbHo5/D02/WLR599NH22POv9PnnX+/2X/u1X5v9+Z577pm71zD75yz8vuvZyP1W 6Xn2x1zv9hP5+1hk0XPin+N4twMAAExF14VS3zpXfvvjvJe7CCuLVHlfeZXgn//5n2c/s1R+ EYx+pmz+4/zPy96+Uev99/zMz/zM7PZywV2+3vJqx1/91V/Nbiu//XLe/IVtyX/5Tlkgyu3l lczyLbLlscov5PnMZz4zu738kyLy53/+57Pbys+HPfHEE7Ofbyz/NmS5bc+ePe1+633d+s2z 5XMt+m2e88tM+tzN88fa6PN3Mr5ev11/Lv/sRfnFMuVzl19ypFd/y6tbx6PZ/Nu//dvZslJ+ Dq/8hlA99vxi459/vdvL4lX+XF4tLHNQ/lu/9KUvtVfPFj2G8/ut+vPsj7ne7Sfy97HR58Q/ x/FuBwAAmIquC2X5x8R1wVV+Pb+83EXYev8OpZr/LY3rPc6J3L7otvWs999TLlz961R///d/ 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 JQAAAAAgl/8F+kXwHL3xEb0AAAAASUVORK5CYII= --------------5ATIJri30SzyV9JJnS7e1Mjr Content-Type: text/x-patch; charset=UTF-8; name="v20240502-0001-Allow-parallel-create-for-GIN-indexes.patch" Content-Disposition: attachment; filename*0="v20240502-0001-Allow-parallel-create-for-GIN-indexes.patch" Content-Transfer-Encoding: base64 RnJvbSAzNWNmODRlZTU2OGRmMmNiN2ViNDAyN2RjZjg0ZmVmZDAyZTQ1NTA5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzLnZvbmRyYUBwb3N0 Z3Jlc3FsLm9yZz4KRGF0ZTogVGh1LCAyIE1heSAyMDI0IDE1OjIxOjI2ICswMjAwClN1Ympl Y3Q6IFtQQVRDSCB2MjAyNDA1MDIgMS84XSBBbGxvdyBwYXJhbGxlbCBjcmVhdGUgZm9yIEdJ TiBpbmRleGVzCgpBZGQgc3VwcG9ydCBmb3IgcGFyYWxsZWwgY3JlYXRlIG9mIEdJTiBpbmRl eGVzLCB1c2luZyBhbiBhcHByb2FjaCBhbmQKY29kZSB2ZXJ5IHNpbWlsYXIgdG8gdGhlIG9u ZSB1c2VkIGJ5IEJSSU4gaW5kZXhlcy4KCkVhY2ggd29ya2VyIHJlYWRzIGEgc3Vic2V0IG9m IHRoZSB0YWJsZSAoZnJvbSBhIHBhcmFsbGVsIHNjYW4pLCBhbmQKYWNjdW11bGF0ZWQgaW5k ZXggZW50cmllcyBpbiBtZW1vcnkuIEJ1dCBpbnN0ZWFkIG9mIHdyaXRpbmcgdGhlIHJlc3Vs dHMKaW50byB0aGUgaW5kZXggKGFmdGVyIGhpdHRpbmcgdGhlIG1lbW9yeSBsaW1pdCksIHRo ZSBkYXRhIGFyZSB3cml0dGVuCnRvIGEgc2hhcmVkIHR1cGxlc29ydCAoYW5kIHNvcnRlZCBi eSBpbmRleCBrZXkpLgoKVGhlIGxlYWRlciB0aGVuIHJlYWRzIGRhdGEgZnJvbSB0aGUgdHVw bGVzb3J0LCBhbmQgY29tYmluZXMgdGhlbSBpbnRvCmVudHJpZXMgdGhhdCBnZXQgaW5zZXJ0 ZWQgaW50byB0aGUgaW5kZXguCi0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW5idWxr LmMgICAgICAgICAgIHwgICAgNyArCiBzcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbmluc2Vy dC5jICAgICAgICAgfCAxMzM1ICsrKysrKysrKysrKysrKysrKystCiBzcmMvYmFja2VuZC9h Y2Nlc3MvZ2luL2dpbnV0aWwuYyAgICAgICAgICAgfCAgICAyICstCiBzcmMvYmFja2VuZC9h Y2Nlc3MvdHJhbnNhbS9wYXJhbGxlbC5jICAgICAgfCAgICA0ICsKIHNyYy9iYWNrZW5kL3V0 aWxzL3NvcnQvdHVwbGVzb3J0dmFyaWFudHMuYyB8ICAxNTQgKysrCiBzcmMvaW5jbHVkZS9h Y2Nlc3MvZ2luLmggICAgICAgICAgICAgICAgICAgfCAgICA0ICsKIHNyYy9pbmNsdWRlL2Fj Y2Vzcy9naW5fdHVwbGUuaCAgICAgICAgICAgICB8ICAgMjggKwogc3JjL2luY2x1ZGUvdXRp bHMvdHVwbGVzb3J0LmggICAgICAgICAgICAgIHwgICAgNiArCiBzcmMvdG9vbHMvcGdpbmRl bnQvdHlwZWRlZnMubGlzdCAgICAgICAgICAgfCAgICA0ICsKIDkgZmlsZXMgY2hhbmdlZCwg MTUyOCBpbnNlcnRpb25zKCspLCAxNiBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBzcmMvaW5jbHVkZS9hY2Nlc3MvZ2luX3R1cGxlLmgKCmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9hY2Nlc3MvZ2luL2dpbmJ1bGsuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2lu YnVsay5jCmluZGV4IGE1MjI4MDFjMmY3Li4xMmVlZmYwNGE2YyAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvYWNjZXNzL2dpbi9naW5idWxrLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNz L2dpbi9naW5idWxrLmMKQEAgLTE1Myw2ICsxNTMsMTMgQEAgZ2luSW5zZXJ0QkFFbnRyeShC dWlsZEFjY3VtdWxhdG9yICphY2N1bSwKIAlHaW5FbnRyeUFjY3VtdWxhdG9yICplYTsKIAli b29sCQlpc05ldzsKIAorCS8qCisJICogRklYTUUgcHJldmVudHMgd3JpdGVzIG9mIHVuaW5p dGlhbGl6ZWQgYnl0ZXMgcmVwb3J0ZWQgYnkgdmFsZ3JpbmQgaW4KKwkgKiB3cml0ZXR1cCAo bGlrZWx5IHRoYXQgYnVpbGRfZ2luX3R1cGxlIGNvcGllcyBzb21lIGZpZWxkcyB0aGF0IGFy ZSBvbmx5CisJICogaW5pdGlhbGl6ZWQgZm9yIGEgY2VydGFpbiBjYXRlZ29yeSwgb3Igc29t ZXRoaW5nIHNpbWlsYXIpCisJICovCisJbWVtc2V0KCZlYXRtcCwgMCwgc2l6ZW9mKEdpbkVu dHJ5QWNjdW11bGF0b3IpKTsKKwogCS8qCiAJICogRm9yIHRoZSBtb21lbnQsIGZpbGwgb25s eSB0aGUgZmllbGRzIG9mIGVhdG1wIHRoYXQgd2lsbCBiZSBsb29rZWQgYXQgYnkKIAkgKiBj bXBFbnRyeUFjY3VtdWxhdG9yIG9yIGdpbkNvbWJpbmVEYXRhLgpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvYWNjZXNzL2dpbi9naW5pbnNlcnQuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9n aW4vZ2luaW5zZXJ0LmMKaW5kZXggNzFmMzhiZTkwYzMuLjRkNmQxNTI0MDNlIDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbmluc2VydC5jCisrKyBiL3NyYy9iYWNr ZW5kL2FjY2Vzcy9naW4vZ2luaW5zZXJ0LmMKQEAgLTE1LDE0ICsxNSwxMjQgQEAKICNpbmNs dWRlICJwb3N0Z3Jlcy5oIgogCiAjaW5jbHVkZSAiYWNjZXNzL2dpbl9wcml2YXRlLmgiCisj aW5jbHVkZSAiYWNjZXNzL2dpbl90dXBsZS5oIgorI2luY2x1ZGUgImFjY2Vzcy90YWJsZS5o IgogI2luY2x1ZGUgImFjY2Vzcy90YWJsZWFtLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3hsb2dp bnNlcnQuaCIKKyNpbmNsdWRlICJjYXRhbG9nL2luZGV4LmgiCisjaW5jbHVkZSAiY29tbWFu ZHMvdmFjdXVtLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAibm9kZXMv ZXhlY25vZGVzLmgiCisjaW5jbHVkZSAicGdzdGF0LmgiCiAjaW5jbHVkZSAic3RvcmFnZS9i dWZtZ3IuaCIKICNpbmNsdWRlICJzdG9yYWdlL3ByZWRpY2F0ZS5oIgorI2luY2x1ZGUgInRj b3AvdGNvcHByb3QuaCIJCS8qIHBncm1pbmNsdWRlIGlnbm9yZSAqLworI2luY2x1ZGUgInV0 aWxzL2RhdHVtLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIKICNpbmNsdWRlICJ1 dGlscy9yZWwuaCIKKyNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgorCisKKy8qIE1hZ2lj IG51bWJlcnMgZm9yIHBhcmFsbGVsIHN0YXRlIHNoYXJpbmcgKi8KKyNkZWZpbmUgUEFSQUxM RUxfS0VZX0dJTl9TSEFSRUQJCQlVSU5UNjRDT05TVCgweEIwMDAwMDAwMDAwMDAwMDEpCisj ZGVmaW5lIFBBUkFMTEVMX0tFWV9UVVBMRVNPUlQJCQlVSU5UNjRDT05TVCgweEIwMDAwMDAw MDAwMDAwMDIpCisjZGVmaW5lIFBBUkFMTEVMX0tFWV9RVUVSWV9URVhUCQkJVUlOVDY0Q09O U1QoMHhCMDAwMDAwMDAwMDAwMDAzKQorI2RlZmluZSBQQVJBTExFTF9LRVlfV0FMX1VTQUdF CQkJVUlOVDY0Q09OU1QoMHhCMDAwMDAwMDAwMDAwMDA0KQorI2RlZmluZSBQQVJBTExFTF9L RVlfQlVGRkVSX1VTQUdFCQlVSU5UNjRDT05TVCgweEIwMDAwMDAwMDAwMDAwMDUpCisKKy8q CisgKiBTdGF0dXMgZm9yIGluZGV4IGJ1aWxkcyBwZXJmb3JtZWQgaW4gcGFyYWxsZWwuICBU aGlzIGlzIGFsbG9jYXRlZCBpbiBhCisgKiBkeW5hbWljIHNoYXJlZCBtZW1vcnkgc2VnbWVu dC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgR2luU2hhcmVkCit7CisJLyoKKwkgKiBUaGVzZSBm aWVsZHMgYXJlIG5vdCBtb2RpZmllZCBkdXJpbmcgdGhlIGJ1aWxkLiAgVGhleSBwcmltYXJp bHkgZXhpc3QKKwkgKiBmb3IgdGhlIGJlbmVmaXQgb2Ygd29ya2VyIHByb2Nlc3NlcyB0aGF0 IG5lZWQgdG8gY3JlYXRlIHN0YXRlCisJICogY29ycmVzcG9uZGluZyB0byB0aGF0IHVzZWQg YnkgdGhlIGxlYWRlci4KKwkgKi8KKwlPaWQJCQloZWFwcmVsaWQ7CisJT2lkCQkJaW5kZXhy ZWxpZDsKKwlib29sCQlpc2NvbmN1cnJlbnQ7CisJaW50CQkJc2NhbnR1cGxlc29ydHN0YXRl czsKKworCS8qCisJICogd29ya2Vyc2RvbmVjdiBpcyB1c2VkIHRvIG1vbml0b3IgdGhlIHBy b2dyZXNzIG9mIHdvcmtlcnMuICBBbGwgcGFyYWxsZWwKKwkgKiBwYXJ0aWNpcGFudHMgbXVz dCBpbmRpY2F0ZSB0aGF0IHRoZXkgYXJlIGRvbmUgYmVmb3JlIGxlYWRlciBjYW4gdXNlCisJ ICogcmVzdWx0cyBidWlsdCBieSB0aGUgd29ya2VycyAoYW5kIGJlZm9yZSBsZWFkZXIgY2Fu IHdyaXRlIHRoZSBkYXRhIGludG8KKwkgKiB0aGUgaW5kZXgpLgorCSAqLworCUNvbmRpdGlv blZhcmlhYmxlIHdvcmtlcnNkb25lY3Y7CisKKwkvKgorCSAqIG11dGV4IHByb3RlY3RzIGFs bCBmaWVsZHMgYmVmb3JlIGhlYXBkZXNjLgorCSAqCisJICogVGhlc2UgZmllbGRzIGNvbnRh aW4gc3RhdHVzIGluZm9ybWF0aW9uIG9mIGludGVyZXN0IHRvIEdJTiBpbmRleCBidWlsZHMK KwkgKiB0aGF0IG11c3Qgd29yayBqdXN0IHRoZSBzYW1lIHdoZW4gYW4gaW5kZXggaXMgYnVp bHQgaW4gcGFyYWxsZWwuCisJICovCisJc2xvY2tfdAkJbXV0ZXg7CisKKwkvKgorCSAqIE11 dGFibGUgc3RhdGUgdGhhdCBpcyBtYWludGFpbmVkIGJ5IHdvcmtlcnMsIGFuZCByZXBvcnRl ZCBiYWNrIHRvCisJICogbGVhZGVyIGF0IGVuZCBvZiB0aGUgc2NhbnMuCisJICoKKwkgKiBu cGFydGljaXBhbnRzZG9uZSBpcyBudW1iZXIgb2Ygd29ya2VyIHByb2Nlc3NlcyBmaW5pc2hl ZC4KKwkgKgorCSAqIHJlbHR1cGxlcyBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGlucHV0IGhl YXAgdHVwbGVzLgorCSAqCisJICogaW5kdHVwbGVzIGlzIHRoZSB0b3RhbCBudW1iZXIgb2Yg dHVwbGVzIHRoYXQgbWFkZSBpdCBpbnRvIHRoZSBpbmRleC4KKwkgKi8KKwlpbnQJCQlucGFy dGljaXBhbnRzZG9uZTsKKwlkb3VibGUJCXJlbHR1cGxlczsKKwlkb3VibGUJCWluZHR1cGxl czsKKworCS8qCisJICogUGFyYWxsZWxUYWJsZVNjYW5EZXNjRGF0YSBkYXRhIGZvbGxvd3Mu IENhbid0IGRpcmVjdGx5IGVtYmVkIGhlcmUsIGFzCisJICogaW1wbGVtZW50YXRpb25zIG9m IHRoZSBwYXJhbGxlbCB0YWJsZSBzY2FuIGRlc2MgaW50ZXJmYWNlIG1pZ2h0IG5lZWQKKwkg KiBzdHJvbmdlciBhbGlnbm1lbnQuCisJICovCit9IEdpblNoYXJlZDsKKworLyoKKyAqIFJl dHVybiBwb2ludGVyIHRvIGEgR2luU2hhcmVkJ3MgcGFyYWxsZWwgdGFibGUgc2Nhbi4KKyAq CisgKiBjLmYuIHNobV90b2NfYWxsb2NhdGUgYXMgdG8gd2h5IEJVRkZFUkFMSUdOIGlzIHVz ZWQsIHJhdGhlciB0aGFuIGp1c3QKKyAqIE1BWEFMSUdOLgorICovCisjZGVmaW5lIFBhcmFs bGVsVGFibGVTY2FuRnJvbUdpblNoYXJlZChzaGFyZWQpIFwKKwkoUGFyYWxsZWxUYWJsZVNj YW5EZXNjKSAoKGNoYXIgKikgKHNoYXJlZCkgKyBCVUZGRVJBTElHTihzaXplb2YoR2luU2hh cmVkKSkpCisKKy8qCisgKiBTdGF0dXMgZm9yIGxlYWRlciBpbiBwYXJhbGxlbCBpbmRleCBi dWlsZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgR2luTGVhZGVyCit7CisJLyogcGFyYWxsZWwg Y29udGV4dCBpdHNlbGYgKi8KKwlQYXJhbGxlbENvbnRleHQgKnBjeHQ7CisKKwkvKgorCSAq IG5wYXJ0aWNpcGFudHR1cGxlc29ydHMgaXMgdGhlIGV4YWN0IG51bWJlciBvZiB3b3JrZXIg cHJvY2Vzc2VzCisJICogc3VjY2Vzc2Z1bGx5IGxhdW5jaGVkLCBwbHVzIG9uZSBsZWFkZXIg cHJvY2VzcyBpZiBpdCBwYXJ0aWNpcGF0ZXMgYXMgYQorCSAqIHdvcmtlciAob25seSBESVNB QkxFX0xFQURFUl9QQVJUSUNJUEFUSU9OIGJ1aWxkcyBhdm9pZCBsZWFkZXIKKwkgKiBwYXJ0 aWNpcGF0aW5nIGFzIGEgd29ya2VyKS4KKwkgKi8KKwlpbnQJCQlucGFydGljaXBhbnR0dXBs ZXNvcnRzOworCisJLyoKKwkgKiBMZWFkZXIgcHJvY2VzcyBjb252ZW5pZW5jZSBwb2ludGVy cyB0byBzaGFyZWQgc3RhdGUgKGxlYWRlciBhdm9pZHMgVE9DCisJICogbG9va3VwcykuCisJ ICoKKwkgKiBHaW5TaGFyZWQgaXMgdGhlIHNoYXJlZCBzdGF0ZSBmb3IgZW50aXJlIGJ1aWxk LiAgc2hhcmVkc29ydCBpcyB0aGUKKwkgKiBzaGFyZWQsIHR1cGxlc29ydC1tYW5hZ2VkIHN0 YXRlIHBhc3NlZCB0byBlYWNoIHByb2Nlc3MgdHVwbGVzb3J0LgorCSAqIHNuYXBzaG90IGlz IHRoZSBzbmFwc2hvdCB1c2VkIGJ5IHRoZSBzY2FuIGlmZiBhbiBNVkNDIHNuYXBzaG90IGlz CisJICogcmVxdWlyZWQuCisJICovCisJR2luU2hhcmVkICAqZ2luc2hhcmVkOworCVNoYXJl ZHNvcnQgKnNoYXJlZHNvcnQ7CisJU25hcHNob3QJc25hcHNob3Q7CisJV2FsVXNhZ2UgICAq d2FsdXNhZ2U7CisJQnVmZmVyVXNhZ2UgKmJ1ZmZlcnVzYWdlOworfSBHaW5MZWFkZXI7CiAK IHR5cGVkZWYgc3RydWN0CiB7CkBAIC0zMiw5ICsxNDIsNDkgQEAgdHlwZWRlZiBzdHJ1Y3QK IAlNZW1vcnlDb250ZXh0IHRtcEN0eDsKIAlNZW1vcnlDb250ZXh0IGZ1bmNDdHg7CiAJQnVp bGRBY2N1bXVsYXRvciBhY2N1bTsKKworCS8qIEZJWE1FIGxpa2VseSBkdXBsaWNhdGUgd2l0 aCBpbmR0dXBsZXMgKi8KKwlkb3VibGUJCWJzX251bXR1cGxlczsKKwlkb3VibGUJCWJzX3Jl bHR1cGxlczsKKworCS8qCisJICogYnNfbGVhZGVyIGlzIG9ubHkgcHJlc2VudCB3aGVuIGEg cGFyYWxsZWwgaW5kZXggYnVpbGQgaXMgcGVyZm9ybWVkLCBhbmQKKwkgKiBvbmx5IGluIHRo ZSBsZWFkZXIgcHJvY2Vzcy4gKEFjdHVhbGx5LCBvbmx5IHRoZSBsZWFkZXIgcHJvY2VzcyBo YXMgYQorCSAqIEdpbkJ1aWxkU3RhdGUuKQorCSAqLworCUdpbkxlYWRlciAgKmJzX2xlYWRl cjsKKwlpbnQJCQlic193b3JrZXJfaWQ7CisKKwkvKgorCSAqIFRoZSBzb3J0c3RhdGUgaXMg dXNlZCBieSB3b3JrZXJzIChpbmNsdWRpbmcgdGhlIGxlYWRlcikuIEl0IGhhcyB0byBiZQor CSAqIHBhcnQgb2YgdGhlIGJ1aWxkIHN0YXRlLCBiZWNhdXNlIHRoYXQncyB0aGUgb25seSB0 aGluZyBwYXNzZWQgdG8gdGhlCisJICogYnVpbGQgY2FsbGJhY2sgZXRjLgorCSAqLworCVR1 cGxlc29ydHN0YXRlICpic19zb3J0c3RhdGU7CiB9IEdpbkJ1aWxkU3RhdGU7CiAKIAorLyog cGFyYWxsZWwgaW5kZXggYnVpbGRzICovCitzdGF0aWMgdm9pZCBfZ2luX2JlZ2luX3BhcmFs bGVsKEdpbkJ1aWxkU3RhdGUgKmJ1aWxkc3RhdGUsIFJlbGF0aW9uIGhlYXAsIFJlbGF0aW9u IGluZGV4LAorCQkJCQkJCQlib29sIGlzY29uY3VycmVudCwgaW50IHJlcXVlc3QpOworc3Rh dGljIHZvaWQgX2dpbl9lbmRfcGFyYWxsZWwoR2luTGVhZGVyICpnaW5sZWFkZXIsIEdpbkJ1 aWxkU3RhdGUgKnN0YXRlKTsKK3N0YXRpYyBTaXplIF9naW5fcGFyYWxsZWxfZXN0aW1hdGVf c2hhcmVkKFJlbGF0aW9uIGhlYXAsIFNuYXBzaG90IHNuYXBzaG90KTsKK3N0YXRpYyBkb3Vi bGUgX2dpbl9wYXJhbGxlbF9oZWFwc2NhbihHaW5CdWlsZFN0YXRlICpidWlsZHN0YXRlKTsK K3N0YXRpYyBkb3VibGUgX2dpbl9wYXJhbGxlbF9tZXJnZShHaW5CdWlsZFN0YXRlICpidWls ZHN0YXRlKTsKK3N0YXRpYyB2b2lkIF9naW5fbGVhZGVyX3BhcnRpY2lwYXRlX2FzX3dvcmtl cihHaW5CdWlsZFN0YXRlICpidWlsZHN0YXRlLAorCQkJCQkJCQkJCQkgIFJlbGF0aW9uIGhl YXAsIFJlbGF0aW9uIGluZGV4KTsKK3N0YXRpYyB2b2lkIF9naW5fcGFyYWxsZWxfc2Nhbl9h bmRfYnVpbGQoR2luQnVpbGRTdGF0ZSAqYnVpbGRzdGF0ZSwKKwkJCQkJCQkJCQkgR2luU2hh cmVkICpnaW5zaGFyZWQsCisJCQkJCQkJCQkJIFNoYXJlZHNvcnQgKnNoYXJlZHNvcnQsCisJ CQkJCQkJCQkJIFJlbGF0aW9uIGhlYXAsIFJlbGF0aW9uIGluZGV4LAorCQkJCQkJCQkJCSBp bnQgc29ydG1lbSwgYm9vbCBwcm9ncmVzcyk7CisKK3N0YXRpYyBEYXR1bSBfZ2luX3BhcnNl X3R1cGxlKEdpblR1cGxlICphLCBJdGVtUG9pbnRlckRhdGEgKippdGVtcyk7CitzdGF0aWMg R2luVHVwbGUgKl9naW5fYnVpbGRfdHVwbGUoT2Zmc2V0TnVtYmVyIGF0dHJudW0sIHVuc2ln bmVkIGNoYXIgY2F0ZWdvcnksCisJCQkJCQkJCSAgRGF0dW0ga2V5LCBpbnQxNiB0eXBsZW4s IGJvb2wgdHlwYnl2YWwsCisJCQkJCQkJCSAgSXRlbVBvaW50ZXJEYXRhICppdGVtcywgdWlu dDMyIG5pdGVtcywKKwkJCQkJCQkJICBTaXplICpsZW4pOworCiAvKgogICogQWRkcyBhcnJh eSBvZiBpdGVtIHBvaW50ZXJzIHRvIHR1cGxlJ3MgcG9zdGluZyBsaXN0LCBvcgogICogY3Jl YXRlcyBwb3N0aW5nIHRyZWUgYW5kIHR1cGxlIHBvaW50aW5nIHRvIHRyZWUgaW4gY2FzZQpA QCAtMzEzLDEyICs0NjMsOTUgQEAgZ2luQnVpbGRDYWxsYmFjayhSZWxhdGlvbiBpbmRleCwg SXRlbVBvaW50ZXIgdGlkLCBEYXR1bSAqdmFsdWVzLAogCU1lbW9yeUNvbnRleHRTd2l0Y2hU byhvbGRDdHgpOwogfQogCitzdGF0aWMgdm9pZAorZ2luQnVpbGRDYWxsYmFja1BhcmFsbGVs KFJlbGF0aW9uIGluZGV4LCBJdGVtUG9pbnRlciB0aWQsIERhdHVtICp2YWx1ZXMsCisJCQkJ CQkgYm9vbCAqaXNudWxsLCBib29sIHR1cGxlSXNBbGl2ZSwgdm9pZCAqc3RhdGUpCit7CisJ R2luQnVpbGRTdGF0ZSAqYnVpbGRzdGF0ZSA9IChHaW5CdWlsZFN0YXRlICopIHN0YXRlOwor CU1lbW9yeUNvbnRleHQgb2xkQ3R4OworCWludAkJCWk7CisKKwlvbGRDdHggPSBNZW1vcnlD b250ZXh0U3dpdGNoVG8oYnVpbGRzdGF0ZS0+dG1wQ3R4KTsKKworCWZvciAoaSA9IDA7IGkg PCBidWlsZHN0YXRlLT5naW5zdGF0ZS5vcmlnVHVwZGVzYy0+bmF0dHM7IGkrKykKKwkJZ2lu SGVhcFR1cGxlQnVsa0luc2VydChidWlsZHN0YXRlLCAoT2Zmc2V0TnVtYmVyKSAoaSArIDEp LAorCQkJCQkJCSAgIHZhbHVlc1tpXSwgaXNudWxsW2ldLCB0aWQpOworCisJLyoKKwkgKiBY WFggaWRlYSAtIEluc3RlYWQgb2Ygd3JpdGluZyB0aGUgZW50cmllcyBkaXJlY3RseSBpbnRv IHRoZSBzaGFyZWQKKwkgKiB0dXBsZXNvcnQsIHdyaXRlIGl0IGludG8gYSBsb2NhbCBvbmUs IGRvIHRoZSBzb3J0IGluIHRoZSB3b3JrZXIsIGFuZAorCSAqIGNvbWJpbmUgdGhlIHJlc3Vs dHMuIEZvciBsYXJnZSB0YWJsZXMgd2l0aCBtYW55IGRpZmZlcmVudCBrZXlzIHRoYXQncwor CSAqIGdvaW5nIHRvIHdvcmsgYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQgYXBwcm9hY2ggd2hl cmUgd2UgZG9uJ3QgZ2V0IG1hbnkKKwkgKiBtYXRjaGVzIGluIHdvcmtfbWVtIChtYXliZSB0 aGlzIHNob3VsZCB1c2UgMzJNQiwgd2hpY2ggaXMgd2hhdCB3ZSB1c2UKKwkgKiB3aGVuIHBs YW5uaW5nLCBidXQgZXZlbiB0aGF0IG1heSBub3QgYmUgZ3JlYXQpLiBXaGljaCBtZWFucyB3 ZSBhcmUKKwkgKiBsaWtlbHkgdG8gaGF2ZSBtYW55IGVudHJpZXMgd2l0aCBhIHNpbmdsZSBU SUQsIGZvcmNpbmcgdGhlIGxlYWRlciB0byBkbworCSAqIGEgcXNvcnQoKSB3aGVuIG1lcmdp bmcgdGhlIGRhdGEsIG9mdGVuIGFtb3VudGluZyB0byB+NTAlIG9mIHRoZSBzZXJpYWwKKwkg KiBwYXJ0LiBCeSBkb2luZyB0aGUgcXNvcnQoKSBpbiBhIHdvcmtlciwgbGVhZGVyIHRoZW4g Y2FuIGRvIGEgbWVyZ2Vzb3J0CisJICogKGxpa2VseSBjaGVhcGVyKS4gQWxzbywgaXQgbWVh bnMgdGhlIGFtb3VudCBvZiBkYXRhIHdvcmtlci0+bGVhZGVyIGlzCisJICogZ29pbmcgdG8g YmUgbG93ZXIgdGhhbmtzIHRvIGRlZHVwbGljYXRpb24uCisJICoKKwkgKiBEaXNhZHZhbnRh Z2U6IEl0IG5lZWRzIG1vcmUgZGlzayBzcGFjZSwgcG9zc2libHkgdXAgdG8gMngsIGJlY2F1 c2UgZWFjaAorCSAqIHdvcmtlciBjcmVhdGVzIGEgdHVwbGVzdG9yZSwgdGhlbiAidHJhbnNm b3JtcyBpdCIgaW50byB0aGUgc2hhcmVkCisJICogdHVwbGVzdG9yZSAoaG9wZWZ1bGx5IGxl c3MgZGF0YSwgYnV0IG5vdCBndWFyYW50ZWVkKS4KKwkgKgorCSAqIEl0J3MgaG93ZXZlciBw b3NzaWJsZSB0byBwYXJ0aXRpb24gdGhlIGRhdGEgaW50byBtdWx0aXBsZSB0dXBsZXNvcnRz CisJICogcGVyIHdvcmtlciAoYnkgaGFzaGluZykuIFdlIGRvbid0IG5lZWQgcGVyZmVjdCBz b3J0aW5nLCBhbmQgd2UgY2FuIGV2ZW4KKwkgKiBsaXZlIHdpdGggImVxdWFsIiBrZXlzIGhh dmluZyBtdWx0aXBsZSBoYXNoZXMgKGlmIHRoZXJlIGFyZSBtdWx0aXBsZQorCSAqIGJpbmFy eSByZXByZXNlbnRhdGlvbnMgb2YgdGhlIHZhbHVlKS4KKwkgKi8KKworCS8qCisJICogSWYg d2UndmUgbWF4ZWQgb3V0IG91ciBhdmFpbGFibGUgbWVtb3J5LCBkdW1wIGV2ZXJ5dGhpbmcg dG8gdGhlCisJICogdHVwbGVzb3J0CisJICoKKwkgKiBYWFggcHJvYmFibHkgc2hvdWxkIHVz ZSAzMk1CLCBub3Qgd29ya19tZW0sIGFzIHVzZWQgZHVyaW5nIHBsYW5uaW5nPworCSAqLwor CWlmIChidWlsZHN0YXRlLT5hY2N1bS5hbGxvY2F0ZWRNZW1vcnkgPj0gKFNpemUpIHdvcmtf bWVtICogMTAyNEwpCisJeworCQlJdGVtUG9pbnRlckRhdGEgKmxpc3Q7CisJCURhdHVtCQlr ZXk7CisJCUdpbk51bGxDYXRlZ29yeSBjYXRlZ29yeTsKKwkJdWludDMyCQlubGlzdDsKKwkJ T2Zmc2V0TnVtYmVyIGF0dG51bTsKKwkJVHVwbGVEZXNjCXRkZXNjID0gUmVsYXRpb25HZXRE ZXNjcihpbmRleCk7CisKKwkJZ2luQmVnaW5CQVNjYW4oJmJ1aWxkc3RhdGUtPmFjY3VtKTsK KwkJd2hpbGUgKChsaXN0ID0gZ2luR2V0QkFFbnRyeSgmYnVpbGRzdGF0ZS0+YWNjdW0sCisJ CQkJCQkJCQkgJmF0dG51bSwgJmtleSwgJmNhdGVnb3J5LCAmbmxpc3QpKSAhPSBOVUxMKQor CQl7CisJCQkvKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUga2V5ICovCisJCQlGb3JtX3BnX2F0 dHJpYnV0ZSBhdHRyID0gVHVwbGVEZXNjQXR0cih0ZGVzYywgKGF0dG51bSAtIDEpKTsKKwor CQkJLyogR0lOIHR1cGxlIGFuZCB0dXBsZSBsZW5ndGggKi8KKwkJCUdpblR1cGxlICAgKnR1 cDsKKwkJCVNpemUJCXR1cGxlbjsKKworCQkJLyogdGhlcmUgY291bGQgYmUgbWFueSBlbnRy aWVzLCBzbyBiZSB3aWxsaW5nIHRvIGFib3J0IGhlcmUgKi8KKwkJCUNIRUNLX0ZPUl9JTlRF UlJVUFRTKCk7CisKKwkJCXR1cCA9IF9naW5fYnVpbGRfdHVwbGUoYXR0bnVtLCBjYXRlZ29y eSwKKwkJCQkJCQkJICAga2V5LCBhdHRyLT5hdHRsZW4sIGF0dHItPmF0dGJ5dmFsLAorCQkJ CQkJCQkgICBsaXN0LCBubGlzdCwgJnR1cGxlbik7CisKKwkJCXR1cGxlc29ydF9wdXRnaW50 dXBsZShidWlsZHN0YXRlLT5ic19zb3J0c3RhdGUsIHR1cCwgdHVwbGVuKTsKKworCQkJcGZy ZWUodHVwKTsKKwkJfQorCisJCU1lbW9yeUNvbnRleHRSZXNldChidWlsZHN0YXRlLT50bXBD dHgpOworCQlnaW5Jbml0QkEoJmJ1aWxkc3RhdGUtPmFjY3VtKTsKKwl9CisKKwlNZW1vcnlD b250ZXh0U3dpdGNoVG8ob2xkQ3R4KTsKK30KKwogSW5kZXhCdWlsZFJlc3VsdCAqCiBnaW5i dWlsZChSZWxhdGlvbiBoZWFwLCBSZWxhdGlvbiBpbmRleCwgSW5kZXhJbmZvICppbmRleElu Zm8pCiB7CiAJSW5kZXhCdWlsZFJlc3VsdCAqcmVzdWx0OwogCWRvdWJsZQkJcmVsdHVwbGVz OwogCUdpbkJ1aWxkU3RhdGUgYnVpbGRzdGF0ZTsKKwlHaW5CdWlsZFN0YXRlICpzdGF0ZSA9 ICZidWlsZHN0YXRlOwogCUJ1ZmZlcgkJUm9vdEJ1ZmZlciwKIAkJCQlNZXRhQnVmZmVyOwog CUl0ZW1Qb2ludGVyRGF0YSAqbGlzdDsKQEAgLTMzNiw2ICs1NjksMTQgQEAgZ2luYnVpbGQo UmVsYXRpb24gaGVhcCwgUmVsYXRpb24gaW5kZXgsIEluZGV4SW5mbyAqaW5kZXhJbmZvKQog CWJ1aWxkc3RhdGUuaW5kdHVwbGVzID0gMDsKIAltZW1zZXQoJmJ1aWxkc3RhdGUuYnVpbGRT dGF0cywgMCwgc2l6ZW9mKEdpblN0YXRzRGF0YSkpOwogCisJLyoKKwkgKiBYWFggTWFrZSBz dXJlIHRvIGluaXRpYWxpemUgYSBidW5jaCBvZiBmaWVsZHMsIG5vdCB0byB0cmlwIHZhbGdy aW5kLgorCSAqIE1heWJlIHRoZXJlIHNob3VsZCBiZSBhbiAiaW5pdCIgZnVuY3Rpb24gZm9y IGJ1aWxkIHN0YXRlPworCSAqLworCWJ1aWxkc3RhdGUuYnNfbnVtdHVwbGVzID0gMDsKKwli dWlsZHN0YXRlLmJzX3JlbHR1cGxlcyA9IDA7CisJYnVpbGRzdGF0ZS5ic19sZWFkZXIgPSBO VUxMOworCiAJLyogaW5pdGlhbGl6ZSB0aGUgbWV0YSBwYWdlICovCiAJTWV0YUJ1ZmZlciA9 IEdpbk5ld0J1ZmZlcihpbmRleCk7CiAKQEAgLTM3NiwyNSArNjE3LDkxIEBAIGdpbmJ1aWxk KFJlbGF0aW9uIGhlYXAsIFJlbGF0aW9uIGluZGV4LCBJbmRleEluZm8gKmluZGV4SW5mbykK IAlnaW5Jbml0QkEoJmJ1aWxkc3RhdGUuYWNjdW0pOwogCiAJLyoKLQkgKiBEbyB0aGUgaGVh cCBzY2FuLiAgV2UgZGlzYWxsb3cgc3luYyBzY2FuIGhlcmUgYmVjYXVzZSBkYXRhUGxhY2VU b1BhZ2UKLQkgKiBwcmVmZXJzIHRvIHJlY2VpdmUgdHVwbGVzIGluIFRJRCBvcmRlci4KKwkg KiBBdHRlbXB0IHRvIGxhdW5jaCBwYXJhbGxlbCB3b3JrZXIgc2NhbiB3aGVuIHJlcXVpcmVk CisJICoKKwkgKiBYWFggcGxhbl9jcmVhdGVfaW5kZXhfd29ya2VycyBtYWtlcyB0aGUgbnVt YmVyIG9mIHdvcmtlcnMgZGVwZW5kZW50IG9uCisJICogbWFpbnRlbmFuY2Vfd29ya19tZW0s IHJlcXVpcmluZyAzMk1CIGZvciBlYWNoIHdvcmtlci4gVGhhdCBtYWtlcyBzZW5zZQorCSAq IGZvciBidHJlZSwgYnV0IG5vdCBmb3IgR0lOLCB3aGljaCBjYW4gZG8gd2l0aCBtdWNoIGxl c3MgbWVtb3J5LiBTbworCSAqIG1heWJlIG1ha2UgdGhhdCBzb21laG93IGxlc3Mgc3RyaWN0 LCBvcHRpb25hbGx5PworCSAqLworCWlmIChpbmRleEluZm8tPmlpX1BhcmFsbGVsV29ya2Vy cyA+IDApCisJCV9naW5fYmVnaW5fcGFyYWxsZWwoc3RhdGUsIGhlYXAsIGluZGV4LCBpbmRl eEluZm8tPmlpX0NvbmN1cnJlbnQsCisJCQkJCQkJaW5kZXhJbmZvLT5paV9QYXJhbGxlbFdv cmtlcnMpOworCisKKwkvKgorCSAqIElmIHBhcmFsbGVsIGJ1aWxkIHJlcXVlc3RlZCBhbmQg YXQgbGVhc3Qgb25lIHdvcmtlciBwcm9jZXNzIHdhcworCSAqIHN1Y2Nlc3NmdWxseSBsYXVu Y2hlZCwgc2V0IHVwIGNvb3JkaW5hdGlvbiBzdGF0ZSwgd2FpdCBmb3Igd29ya2VycyB0bwor CSAqIGNvbXBsZXRlLiBUaGVuIHJlYWQgYWxsIHR1cGxlcyBmcm9tIHRoZSBzaGFyZWQgdHVw bGVzb3J0IGFuZCBpbnNlcnQKKwkgKiB0aGVtIGludG8gdGhlIGluZGV4LgorCSAqCisJICog SW4gc2VyaWFsIG1vZGUsIHNpbXBseSBzY2FuIHRoZSB0YWJsZSBhbmQgYnVpbGQgdGhlIGlu ZGV4IG9uZSBpbmRleAorCSAqIHR1cGxlIGF0IGEgdGltZS4KIAkgKi8KLQlyZWx0dXBsZXMg PSB0YWJsZV9pbmRleF9idWlsZF9zY2FuKGhlYXAsIGluZGV4LCBpbmRleEluZm8sIGZhbHNl LCB0cnVlLAotCQkJCQkJCQkJICAgZ2luQnVpbGRDYWxsYmFjaywgKHZvaWQgKikgJmJ1aWxk c3RhdGUsCi0JCQkJCQkJCQkgICBOVUxMKTsKKwlpZiAoc3RhdGUtPmJzX2xlYWRlcikKKwl7 CisJCVNvcnRDb29yZGluYXRlIGNvb3JkaW5hdGU7CisKKwkJY29vcmRpbmF0ZSA9IChTb3J0 Q29vcmRpbmF0ZSkgcGFsbG9jMChzaXplb2YoU29ydENvb3JkaW5hdGVEYXRhKSk7CisJCWNv b3JkaW5hdGUtPmlzV29ya2VyID0gZmFsc2U7CisJCWNvb3JkaW5hdGUtPm5QYXJ0aWNpcGFu dHMgPQorCQkJc3RhdGUtPmJzX2xlYWRlci0+bnBhcnRpY2lwYW50dHVwbGVzb3J0czsKKwkJ Y29vcmRpbmF0ZS0+c2hhcmVkc29ydCA9IHN0YXRlLT5ic19sZWFkZXItPnNoYXJlZHNvcnQ7 CisKKwkJLyoKKwkJICogQmVnaW4gbGVhZGVyIHR1cGxlc29ydC4KKwkJICoKKwkJICogSW4g Y2FzZXMgd2hlcmUgcGFyYWxsZWxpc20gaXMgaW52b2x2ZWQsIHRoZSBsZWFkZXIgcmVjZWl2 ZXMgdGhlCisJCSAqIHNhbWUgc2hhcmUgb2YgbWFpbnRlbmFuY2Vfd29ya19tZW0gYXMgYSBz ZXJpYWwgc29ydCAoaXQgaXMKKwkJICogZ2VuZXJhbGx5IHRyZWF0ZWQgaW4gdGhlIHNhbWUg d2F5IGFzIGEgc2VyaWFsIHNvcnQgb25jZSB3ZSByZXR1cm4pLgorCQkgKiBQYXJhbGxlbCB3 b3JrZXIgVHVwbGVzb3J0c3RhdGVzIHdpbGwgaGF2ZSByZWNlaXZlZCBvbmx5IGEgZnJhY3Rp b24KKwkJICogb2YgbWFpbnRlbmFuY2Vfd29ya19tZW0sIHRob3VnaC4KKwkJICoKKwkJICog V2UgcmVseSBvbiB0aGUgbGlmZXRpbWUgb2YgdGhlIExlYWRlciBUdXBsZXNvcnRzdGF0ZSBh bG1vc3Qgbm90CisJCSAqIG92ZXJsYXBwaW5nIHdpdGggYW55IHdvcmtlciBUdXBsZXNvcnRz dGF0ZSdzIGxpZmV0aW1lLiAgVGhlcmUgbWF5CisJCSAqIGJlIHNvbWUgc21hbGwgb3Zlcmxh cCwgYnV0IHRoYXQncyBva2F5IGJlY2F1c2Ugd2UgcmVseSBvbiBsZWFkZXIKKwkJICogVHVw bGVzb3J0c3RhdGUgb25seSBhbGxvY2F0aW5nIGEgc21hbGwsIGZpeGVkIGFtb3VudCBvZiBt ZW1vcnkKKwkJICogaGVyZS4gV2hlbiBpdHMgdHVwbGVzb3J0X3BlcmZvcm1zb3J0KCkgaXMg Y2FsbGVkIChieSBvdXIgY2FsbGVyKSwKKwkJICogYW5kIHNpZ25pZmljYW50IGFtb3VudHMg b2YgbWVtb3J5IGFyZSBsaWtlbHkgdG8gYmUgdXNlZCwgYWxsCisJCSAqIHdvcmtlcnMgbXVz dCBoYXZlIGFscmVhZHkgZnJlZWQgYWxtb3N0IGFsbCBtZW1vcnkgaGVsZCBieSB0aGVpcgor CQkgKiBUdXBsZXNvcnRzdGF0ZXMgKHRoZXkgYXJlIGFib3V0IHRvIGdvIGF3YXkgY29tcGxl dGVseSwgdG9vKS4gIFRoZQorCQkgKiBvdmVyYWxsIGVmZmVjdCBpcyB0aGF0IG1haW50ZW5h bmNlX3dvcmtfbWVtIGFsd2F5cyByZXByZXNlbnRzIGFuCisJCSAqIGFic29sdXRlIGhpZ2gg d2F0ZXJtYXJrIG9uIHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgYSBDUkVBVEUKKwkJ ICogSU5ERVggb3BlcmF0aW9uLCByZWdhcmRsZXNzIG9mIHRoZSB1c2Ugb2YgcGFyYWxsZWxp c20gb3IgYW55IG90aGVyCisJCSAqIGZhY3Rvci4KKwkJICovCisJCXN0YXRlLT5ic19zb3J0 c3RhdGUgPQorCQkJdHVwbGVzb3J0X2JlZ2luX2luZGV4X2dpbihtYWludGVuYW5jZV93b3Jr X21lbSwgY29vcmRpbmF0ZSwKKwkJCQkJCQkJCSAgVFVQTEVTT1JUX05PTkUpOwogCi0JLyog ZHVtcCByZW1haW5pbmcgZW50cmllcyB0byB0aGUgaW5kZXggKi8KLQlvbGRDdHggPSBNZW1v cnlDb250ZXh0U3dpdGNoVG8oYnVpbGRzdGF0ZS50bXBDdHgpOwotCWdpbkJlZ2luQkFTY2Fu KCZidWlsZHN0YXRlLmFjY3VtKTsKLQl3aGlsZSAoKGxpc3QgPSBnaW5HZXRCQUVudHJ5KCZi dWlsZHN0YXRlLmFjY3VtLAotCQkJCQkJCQkgJmF0dG51bSwgJmtleSwgJmNhdGVnb3J5LCAm bmxpc3QpKSAhPSBOVUxMKQorCQkvKiBzY2FuIHRoZSByZWxhdGlvbiBhbmQgbWVyZ2UgcGVy LXdvcmtlciByZXN1bHRzICovCisJCXJlbHR1cGxlcyA9IF9naW5fcGFyYWxsZWxfbWVyZ2Uo c3RhdGUpOworCisJCV9naW5fZW5kX3BhcmFsbGVsKHN0YXRlLT5ic19sZWFkZXIsIHN0YXRl KTsKKwl9CisJZWxzZQkJCQkJCS8qIG5vIHBhcmFsbGVsIGluZGV4IGJ1aWxkICovCiAJewot CQkvKiB0aGVyZSBjb3VsZCBiZSBtYW55IGVudHJpZXMsIHNvIGJlIHdpbGxpbmcgdG8gYWJv cnQgaGVyZSAqLwotCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOwotCQlnaW5FbnRyeUluc2Vy dCgmYnVpbGRzdGF0ZS5naW5zdGF0ZSwgYXR0bnVtLCBrZXksIGNhdGVnb3J5LAotCQkJCQkg ICBsaXN0LCBubGlzdCwgJmJ1aWxkc3RhdGUuYnVpbGRTdGF0cyk7CisJCS8qCisJCSAqIERv IHRoZSBoZWFwIHNjYW4uICBXZSBkaXNhbGxvdyBzeW5jIHNjYW4gaGVyZSBiZWNhdXNlCisJ CSAqIGRhdGFQbGFjZVRvUGFnZSBwcmVmZXJzIHRvIHJlY2VpdmUgdHVwbGVzIGluIFRJRCBv cmRlci4KKwkJICovCisJCXJlbHR1cGxlcyA9IHRhYmxlX2luZGV4X2J1aWxkX3NjYW4oaGVh cCwgaW5kZXgsIGluZGV4SW5mbywgZmFsc2UsIHRydWUsCisJCQkJCQkJCQkJICAgZ2luQnVp bGRDYWxsYmFjaywgKHZvaWQgKikgJmJ1aWxkc3RhdGUsCisJCQkJCQkJCQkJICAgTlVMTCk7 CisKKwkJLyogZHVtcCByZW1haW5pbmcgZW50cmllcyB0byB0aGUgaW5kZXggKi8KKwkJb2xk Q3R4ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKGJ1aWxkc3RhdGUudG1wQ3R4KTsKKwkJZ2lu QmVnaW5CQVNjYW4oJmJ1aWxkc3RhdGUuYWNjdW0pOworCQl3aGlsZSAoKGxpc3QgPSBnaW5H ZXRCQUVudHJ5KCZidWlsZHN0YXRlLmFjY3VtLAorCQkJCQkJCQkJICZhdHRudW0sICZrZXks ICZjYXRlZ29yeSwgJm5saXN0KSkgIT0gTlVMTCkKKwkJeworCQkJLyogdGhlcmUgY291bGQg YmUgbWFueSBlbnRyaWVzLCBzbyBiZSB3aWxsaW5nIHRvIGFib3J0IGhlcmUgKi8KKwkJCUNI RUNLX0ZPUl9JTlRFUlJVUFRTKCk7CisJCQlnaW5FbnRyeUluc2VydCgmYnVpbGRzdGF0ZS5n aW5zdGF0ZSwgYXR0bnVtLCBrZXksIGNhdGVnb3J5LAorCQkJCQkJICAgbGlzdCwgbmxpc3Qs ICZidWlsZHN0YXRlLmJ1aWxkU3RhdHMpOworCQl9CisJCU1lbW9yeUNvbnRleHRTd2l0Y2hU byhvbGRDdHgpOwogCX0KLQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkQ3R4KTsKIAogCU1l bW9yeUNvbnRleHREZWxldGUoYnVpbGRzdGF0ZS5mdW5jQ3R4KTsKIAlNZW1vcnlDb250ZXh0 RGVsZXRlKGJ1aWxkc3RhdGUudG1wQ3R4KTsKQEAgLTUzNCwzICs4NDEsMTAwMSBAQCBnaW5p bnNlcnQoUmVsYXRpb24gaW5kZXgsIERhdHVtICp2YWx1ZXMsIGJvb2wgKmlzbnVsbCwKIAog CXJldHVybiBmYWxzZTsKIH0KKworLyoKKyAqIENyZWF0ZSBwYXJhbGxlbCBjb250ZXh0LCBh bmQgbGF1bmNoIHdvcmtlcnMgZm9yIGxlYWRlci4KKyAqCisgKiBidWlsZHN0YXRlIGFyZ3Vt ZW50IHNob3VsZCBiZSBpbml0aWFsaXplZCAod2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZQor ICogdHVwbGVzb3J0IHN0YXRlcywgd2hpY2ggbWF5IGxhdGVyIGJlIGNyZWF0ZWQgYmFzZWQg b24gc2hhcmVkCisgKiBzdGF0ZSBpbml0aWFsbHkgc2V0IHVwIGhlcmUpLgorICoKKyAqIGlz Y29uY3VycmVudCBpbmRpY2F0ZXMgaWYgb3BlcmF0aW9uIGlzIENSRUFURSBJTkRFWCBDT05D VVJSRU5UTFkuCisgKgorICogcmVxdWVzdCBpcyB0aGUgdGFyZ2V0IG51bWJlciBvZiBwYXJh bGxlbCB3b3JrZXIgcHJvY2Vzc2VzIHRvIGxhdW5jaC4KKyAqCisgKiBTZXRzIGJ1aWxkc3Rh dGUncyBHaW5MZWFkZXIsIHdoaWNoIGNhbGxlciBtdXN0IHVzZSB0byBzaHV0IGRvd24gcGFy YWxsZWwKKyAqIG1vZGUgYnkgcGFzc2luZyBpdCB0byBfZ2luX2VuZF9wYXJhbGxlbCgpIGF0 IHRoZSB2ZXJ5IGVuZCBvZiBpdHMgaW5kZXgKKyAqIGJ1aWxkLiAgSWYgbm90IGV2ZW4gYSBz aW5nbGUgd29ya2VyIHByb2Nlc3MgY2FuIGJlIGxhdW5jaGVkLCB0aGlzIGlzCisgKiBuZXZl ciBzZXQsIGFuZCBjYWxsZXIgc2hvdWxkIHByb2NlZWQgd2l0aCBhIHNlcmlhbCBpbmRleCBi dWlsZC4KKyAqLworc3RhdGljIHZvaWQKK19naW5fYmVnaW5fcGFyYWxsZWwoR2luQnVpbGRT dGF0ZSAqYnVpbGRzdGF0ZSwgUmVsYXRpb24gaGVhcCwgUmVsYXRpb24gaW5kZXgsCisJCQkJ CWJvb2wgaXNjb25jdXJyZW50LCBpbnQgcmVxdWVzdCkKK3sKKwlQYXJhbGxlbENvbnRleHQg KnBjeHQ7CisJaW50CQkJc2NhbnR1cGxlc29ydHN0YXRlczsKKwlTbmFwc2hvdAlzbmFwc2hv dDsKKwlTaXplCQllc3RnaW5zaGFyZWQ7CisJU2l6ZQkJZXN0c29ydDsKKwlHaW5TaGFyZWQg ICpnaW5zaGFyZWQ7CisJU2hhcmVkc29ydCAqc2hhcmVkc29ydDsKKwlHaW5MZWFkZXIgICpn aW5sZWFkZXIgPSAoR2luTGVhZGVyICopIHBhbGxvYzAoc2l6ZW9mKEdpbkxlYWRlcikpOwor CVdhbFVzYWdlICAgKndhbHVzYWdlOworCUJ1ZmZlclVzYWdlICpidWZmZXJ1c2FnZTsKKwli b29sCQlsZWFkZXJwYXJ0aWNpcGF0ZXMgPSB0cnVlOworCWludAkJCXF1ZXJ5bGVuOworCisj aWZkZWYgRElTQUJMRV9MRUFERVJfUEFSVElDSVBBVElPTgorCWxlYWRlcnBhcnRpY2lwYXRl cyA9IGZhbHNlOworI2VuZGlmCisKKwkvKgorCSAqIEVudGVyIHBhcmFsbGVsIG1vZGUsIGFu ZCBjcmVhdGUgY29udGV4dCBmb3IgcGFyYWxsZWwgYnVpbGQgb2YgZ2luIGluZGV4CisJICov CisJRW50ZXJQYXJhbGxlbE1vZGUoKTsKKwlBc3NlcnQocmVxdWVzdCA+IDApOworCXBjeHQg PSBDcmVhdGVQYXJhbGxlbENvbnRleHQoInBvc3RncmVzIiwgIl9naW5fcGFyYWxsZWxfYnVp bGRfbWFpbiIsCisJCQkJCQkJCSByZXF1ZXN0KTsKKworCXNjYW50dXBsZXNvcnRzdGF0ZXMg PSBsZWFkZXJwYXJ0aWNpcGF0ZXMgPyByZXF1ZXN0ICsgMSA6IHJlcXVlc3Q7CisKKwkvKgor CSAqIFByZXBhcmUgZm9yIHNjYW4gb2YgdGhlIGJhc2UgcmVsYXRpb24uICBJbiBhIG5vcm1h bCBpbmRleCBidWlsZCwgd2UgdXNlCisJICogU25hcHNob3RBbnkgYmVjYXVzZSB3ZSBtdXN0 IHJldHJpZXZlIGFsbCB0dXBsZXMgYW5kIGRvIG91ciBvd24gdGltZQorCSAqIHF1YWwgY2hl Y2tzIChiZWNhdXNlIHdlIGhhdmUgdG8gaW5kZXggUkVDRU5UTFlfREVBRCB0dXBsZXMpLiAg SW4gYQorCSAqIGNvbmN1cnJlbnQgYnVpbGQsIHdlIHRha2UgYSByZWd1bGFyIE1WQ0Mgc25h cHNob3QgYW5kIGluZGV4IHdoYXRldmVyJ3MKKwkgKiBsaXZlIGFjY29yZGluZyB0byB0aGF0 LgorCSAqLworCWlmICghaXNjb25jdXJyZW50KQorCQlzbmFwc2hvdCA9IFNuYXBzaG90QW55 OworCWVsc2UKKwkJc25hcHNob3QgPSBSZWdpc3RlclNuYXBzaG90KEdldFRyYW5zYWN0aW9u U25hcHNob3QoKSk7CisKKwkvKgorCSAqIEVzdGltYXRlIHNpemUgZm9yIG91ciBvd24gUEFS QUxMRUxfS0VZX0dJTl9TSEFSRUQgd29ya3NwYWNlLgorCSAqLworCWVzdGdpbnNoYXJlZCA9 IF9naW5fcGFyYWxsZWxfZXN0aW1hdGVfc2hhcmVkKGhlYXAsIHNuYXBzaG90KTsKKwlzaG1f dG9jX2VzdGltYXRlX2NodW5rKCZwY3h0LT5lc3RpbWF0b3IsIGVzdGdpbnNoYXJlZCk7CisJ ZXN0c29ydCA9IHR1cGxlc29ydF9lc3RpbWF0ZV9zaGFyZWQoc2NhbnR1cGxlc29ydHN0YXRl cyk7CisJc2htX3RvY19lc3RpbWF0ZV9jaHVuaygmcGN4dC0+ZXN0aW1hdG9yLCBlc3Rzb3J0 KTsKKworCXNobV90b2NfZXN0aW1hdGVfa2V5cygmcGN4dC0+ZXN0aW1hdG9yLCAyKTsKKwor CS8qCisJICogRXN0aW1hdGUgc3BhY2UgZm9yIFdhbFVzYWdlIGFuZCBCdWZmZXJVc2FnZSAt LSBQQVJBTExFTF9LRVlfV0FMX1VTQUdFCisJICogYW5kIFBBUkFMTEVMX0tFWV9CVUZGRVJf VVNBR0UuCisJICoKKwkgKiBJZiB0aGVyZSBhcmUgbm8gZXh0ZW5zaW9ucyBsb2FkZWQgdGhh dCBjYXJlLCB3ZSBjb3VsZCBza2lwIHRoaXMuICBXZQorCSAqIGhhdmUgbm8gd2F5IG9mIGtu b3dpbmcgd2hldGhlciBhbnlvbmUncyBsb29raW5nIGF0IHBnV2FsVXNhZ2Ugb3IKKwkgKiBw Z0J1ZmZlclVzYWdlLCBzbyBkbyBpdCB1bmNvbmRpdGlvbmFsbHkuCisJICovCisJc2htX3Rv Y19lc3RpbWF0ZV9jaHVuaygmcGN4dC0+ZXN0aW1hdG9yLAorCQkJCQkJICAgbXVsX3NpemUo c2l6ZW9mKFdhbFVzYWdlKSwgcGN4dC0+bndvcmtlcnMpKTsKKwlzaG1fdG9jX2VzdGltYXRl X2tleXMoJnBjeHQtPmVzdGltYXRvciwgMSk7CisJc2htX3RvY19lc3RpbWF0ZV9jaHVuaygm cGN4dC0+ZXN0aW1hdG9yLAorCQkJCQkJICAgbXVsX3NpemUoc2l6ZW9mKEJ1ZmZlclVzYWdl KSwgcGN4dC0+bndvcmtlcnMpKTsKKwlzaG1fdG9jX2VzdGltYXRlX2tleXMoJnBjeHQtPmVz dGltYXRvciwgMSk7CisKKwkvKiBGaW5hbGx5LCBlc3RpbWF0ZSBQQVJBTExFTF9LRVlfUVVF UllfVEVYVCBzcGFjZSAqLworCWlmIChkZWJ1Z19xdWVyeV9zdHJpbmcpCisJeworCQlxdWVy eWxlbiA9IHN0cmxlbihkZWJ1Z19xdWVyeV9zdHJpbmcpOworCQlzaG1fdG9jX2VzdGltYXRl X2NodW5rKCZwY3h0LT5lc3RpbWF0b3IsIHF1ZXJ5bGVuICsgMSk7CisJCXNobV90b2NfZXN0 aW1hdGVfa2V5cygmcGN4dC0+ZXN0aW1hdG9yLCAxKTsKKwl9CisJZWxzZQorCQlxdWVyeWxl biA9IDA7CQkJLyoga2VlcCBjb21waWxlciBxdWlldCAqLworCisJLyogRXZlcnlvbmUncyBo YWQgYSBjaGFuY2UgdG8gYXNrIGZvciBzcGFjZSwgc28gbm93IGNyZWF0ZSB0aGUgRFNNICov CisJSW5pdGlhbGl6ZVBhcmFsbGVsRFNNKHBjeHQpOworCisJLyogSWYgbm8gRFNNIHNlZ21l bnQgd2FzIGF2YWlsYWJsZSwgYmFjayBvdXQgKGRvIHNlcmlhbCBidWlsZCkgKi8KKwlpZiAo cGN4dC0+c2VnID09IE5VTEwpCisJeworCQlpZiAoSXNNVkNDU25hcHNob3Qoc25hcHNob3Qp KQorCQkJVW5yZWdpc3RlclNuYXBzaG90KHNuYXBzaG90KTsKKwkJRGVzdHJveVBhcmFsbGVs Q29udGV4dChwY3h0KTsKKwkJRXhpdFBhcmFsbGVsTW9kZSgpOworCQlyZXR1cm47CisJfQor CisJLyogU3RvcmUgc2hhcmVkIGJ1aWxkIHN0YXRlLCBmb3Igd2hpY2ggd2UgcmVzZXJ2ZWQg c3BhY2UgKi8KKwlnaW5zaGFyZWQgPSAoR2luU2hhcmVkICopIHNobV90b2NfYWxsb2NhdGUo cGN4dC0+dG9jLCBlc3RnaW5zaGFyZWQpOworCS8qIEluaXRpYWxpemUgaW1tdXRhYmxlIHN0 YXRlICovCisJZ2luc2hhcmVkLT5oZWFwcmVsaWQgPSBSZWxhdGlvbkdldFJlbGlkKGhlYXAp OworCWdpbnNoYXJlZC0+aW5kZXhyZWxpZCA9IFJlbGF0aW9uR2V0UmVsaWQoaW5kZXgpOwor CWdpbnNoYXJlZC0+aXNjb25jdXJyZW50ID0gaXNjb25jdXJyZW50OworCWdpbnNoYXJlZC0+ c2NhbnR1cGxlc29ydHN0YXRlcyA9IHNjYW50dXBsZXNvcnRzdGF0ZXM7CisKKwlDb25kaXRp b25WYXJpYWJsZUluaXQoJmdpbnNoYXJlZC0+d29ya2Vyc2RvbmVjdik7CisJU3BpbkxvY2tJ bml0KCZnaW5zaGFyZWQtPm11dGV4KTsKKworCS8qIEluaXRpYWxpemUgbXV0YWJsZSBzdGF0 ZSAqLworCWdpbnNoYXJlZC0+bnBhcnRpY2lwYW50c2RvbmUgPSAwOworCWdpbnNoYXJlZC0+ cmVsdHVwbGVzID0gMC4wOworCWdpbnNoYXJlZC0+aW5kdHVwbGVzID0gMC4wOworCisJdGFi bGVfcGFyYWxsZWxzY2FuX2luaXRpYWxpemUoaGVhcCwKKwkJCQkJCQkJICBQYXJhbGxlbFRh YmxlU2NhbkZyb21HaW5TaGFyZWQoZ2luc2hhcmVkKSwKKwkJCQkJCQkJICBzbmFwc2hvdCk7 CisKKwkvKgorCSAqIFN0b3JlIHNoYXJlZCB0dXBsZXNvcnQtcHJpdmF0ZSBzdGF0ZSwgZm9y IHdoaWNoIHdlIHJlc2VydmVkIHNwYWNlLgorCSAqIFRoZW4sIGluaXRpYWxpemUgb3BhcXVl IHN0YXRlIHVzaW5nIHR1cGxlc29ydCByb3V0aW5lLgorCSAqLworCXNoYXJlZHNvcnQgPSAo U2hhcmVkc29ydCAqKSBzaG1fdG9jX2FsbG9jYXRlKHBjeHQtPnRvYywgZXN0c29ydCk7CisJ dHVwbGVzb3J0X2luaXRpYWxpemVfc2hhcmVkKHNoYXJlZHNvcnQsIHNjYW50dXBsZXNvcnRz dGF0ZXMsCisJCQkJCQkJCXBjeHQtPnNlZyk7CisKKwkvKgorCSAqIFN0b3JlIHNoYXJlZCB0 dXBsZXNvcnQtcHJpdmF0ZSBzdGF0ZSwgZm9yIHdoaWNoIHdlIHJlc2VydmVkIHNwYWNlLgor CSAqIFRoZW4sIGluaXRpYWxpemUgb3BhcXVlIHN0YXRlIHVzaW5nIHR1cGxlc29ydCByb3V0 aW5lLgorCSAqLworCXNobV90b2NfaW5zZXJ0KHBjeHQtPnRvYywgUEFSQUxMRUxfS0VZX0dJ Tl9TSEFSRUQsIGdpbnNoYXJlZCk7CisJc2htX3RvY19pbnNlcnQocGN4dC0+dG9jLCBQQVJB TExFTF9LRVlfVFVQTEVTT1JULCBzaGFyZWRzb3J0KTsKKworCS8qIFN0b3JlIHF1ZXJ5IHN0 cmluZyBmb3Igd29ya2VycyAqLworCWlmIChkZWJ1Z19xdWVyeV9zdHJpbmcpCisJeworCQlj aGFyCSAgICpzaGFyZWRxdWVyeTsKKworCQlzaGFyZWRxdWVyeSA9IChjaGFyICopIHNobV90 b2NfYWxsb2NhdGUocGN4dC0+dG9jLCBxdWVyeWxlbiArIDEpOworCQltZW1jcHkoc2hhcmVk cXVlcnksIGRlYnVnX3F1ZXJ5X3N0cmluZywgcXVlcnlsZW4gKyAxKTsKKwkJc2htX3RvY19p bnNlcnQocGN4dC0+dG9jLCBQQVJBTExFTF9LRVlfUVVFUllfVEVYVCwgc2hhcmVkcXVlcnkp OworCX0KKworCS8qCisJICogQWxsb2NhdGUgc3BhY2UgZm9yIGVhY2ggd29ya2VyJ3MgV2Fs VXNhZ2UgYW5kIEJ1ZmZlclVzYWdlOyBubyBuZWVkIHRvCisJICogaW5pdGlhbGl6ZS4KKwkg Ki8KKwl3YWx1c2FnZSA9IHNobV90b2NfYWxsb2NhdGUocGN4dC0+dG9jLAorCQkJCQkJCQlt dWxfc2l6ZShzaXplb2YoV2FsVXNhZ2UpLCBwY3h0LT5ud29ya2VycykpOworCXNobV90b2Nf aW5zZXJ0KHBjeHQtPnRvYywgUEFSQUxMRUxfS0VZX1dBTF9VU0FHRSwgd2FsdXNhZ2UpOwor CWJ1ZmZlcnVzYWdlID0gc2htX3RvY19hbGxvY2F0ZShwY3h0LT50b2MsCisJCQkJCQkJCSAg IG11bF9zaXplKHNpemVvZihCdWZmZXJVc2FnZSksIHBjeHQtPm53b3JrZXJzKSk7CisJc2ht X3RvY19pbnNlcnQocGN4dC0+dG9jLCBQQVJBTExFTF9LRVlfQlVGRkVSX1VTQUdFLCBidWZm ZXJ1c2FnZSk7CisKKwkvKiBMYXVuY2ggd29ya2Vycywgc2F2aW5nIHN0YXR1cyBmb3IgbGVh ZGVyL2NhbGxlciAqLworCUxhdW5jaFBhcmFsbGVsV29ya2VycyhwY3h0KTsKKwlnaW5sZWFk ZXItPnBjeHQgPSBwY3h0OworCWdpbmxlYWRlci0+bnBhcnRpY2lwYW50dHVwbGVzb3J0cyA9 IHBjeHQtPm53b3JrZXJzX2xhdW5jaGVkOworCWlmIChsZWFkZXJwYXJ0aWNpcGF0ZXMpCisJ CWdpbmxlYWRlci0+bnBhcnRpY2lwYW50dHVwbGVzb3J0cysrOworCWdpbmxlYWRlci0+Z2lu c2hhcmVkID0gZ2luc2hhcmVkOworCWdpbmxlYWRlci0+c2hhcmVkc29ydCA9IHNoYXJlZHNv cnQ7CisJZ2lubGVhZGVyLT5zbmFwc2hvdCA9IHNuYXBzaG90OworCWdpbmxlYWRlci0+d2Fs dXNhZ2UgPSB3YWx1c2FnZTsKKwlnaW5sZWFkZXItPmJ1ZmZlcnVzYWdlID0gYnVmZmVydXNh Z2U7CisKKwkvKiBJZiBubyB3b3JrZXJzIHdlcmUgc3VjY2Vzc2Z1bGx5IGxhdW5jaGVkLCBi YWNrIG91dCAoZG8gc2VyaWFsIGJ1aWxkKSAqLworCWlmIChwY3h0LT5ud29ya2Vyc19sYXVu Y2hlZCA9PSAwKQorCXsKKwkJX2dpbl9lbmRfcGFyYWxsZWwoZ2lubGVhZGVyLCBOVUxMKTsK KwkJcmV0dXJuOworCX0KKworCS8qIFNhdmUgbGVhZGVyIHN0YXRlIG5vdyB0aGF0IGl0J3Mg Y2xlYXIgYnVpbGQgd2lsbCBiZSBwYXJhbGxlbCAqLworCWJ1aWxkc3RhdGUtPmJzX2xlYWRl ciA9IGdpbmxlYWRlcjsKKworCS8qIEpvaW4gaGVhcCBzY2FuIG91cnNlbHZlcyAqLworCWlm IChsZWFkZXJwYXJ0aWNpcGF0ZXMpCisJCV9naW5fbGVhZGVyX3BhcnRpY2lwYXRlX2FzX3dv cmtlcihidWlsZHN0YXRlLCBoZWFwLCBpbmRleCk7CisKKwkvKgorCSAqIENhbGxlciBuZWVk cyB0byB3YWl0IGZvciBhbGwgbGF1bmNoZWQgd29ya2VycyB3aGVuIHdlIHJldHVybi4gIE1h a2UKKwkgKiBzdXJlIHRoYXQgdGhlIGZhaWx1cmUtdG8tc3RhcnQgY2FzZSB3aWxsIG5vdCBo YW5nIGZvcmV2ZXIuCisJICovCisJV2FpdEZvclBhcmFsbGVsV29ya2Vyc1RvQXR0YWNoKHBj eHQpOworfQorCisvKgorICogU2h1dCBkb3duIHdvcmtlcnMsIGRlc3Ryb3kgcGFyYWxsZWwg Y29udGV4dCwgYW5kIGVuZCBwYXJhbGxlbCBtb2RlLgorICovCitzdGF0aWMgdm9pZAorX2dp bl9lbmRfcGFyYWxsZWwoR2luTGVhZGVyICpnaW5sZWFkZXIsIEdpbkJ1aWxkU3RhdGUgKnN0 YXRlKQoreworCWludAkJCWk7CisKKwkvKiBTaHV0ZG93biB3b3JrZXIgcHJvY2Vzc2VzICov CisJV2FpdEZvclBhcmFsbGVsV29ya2Vyc1RvRmluaXNoKGdpbmxlYWRlci0+cGN4dCk7CisK KwkvKgorCSAqIE5leHQsIGFjY3VtdWxhdGUgV0FMIHVzYWdlLiAgKFRoaXMgbXVzdCB3YWl0 IGZvciB0aGUgd29ya2VycyB0byBmaW5pc2gsCisJICogb3Igd2UgbWlnaHQgZ2V0IGluY29t cGxldGUgZGF0YS4pCisJICovCisJZm9yIChpID0gMDsgaSA8IGdpbmxlYWRlci0+cGN4dC0+ bndvcmtlcnNfbGF1bmNoZWQ7IGkrKykKKwkJSW5zdHJBY2N1bVBhcmFsbGVsUXVlcnkoJmdp bmxlYWRlci0+YnVmZmVydXNhZ2VbaV0sICZnaW5sZWFkZXItPndhbHVzYWdlW2ldKTsKKwor CS8qIEZyZWUgbGFzdCByZWZlcmVuY2UgdG8gTVZDQyBzbmFwc2hvdCwgaWYgb25lIHdhcyB1 c2VkICovCisJaWYgKElzTVZDQ1NuYXBzaG90KGdpbmxlYWRlci0+c25hcHNob3QpKQorCQlV bnJlZ2lzdGVyU25hcHNob3QoZ2lubGVhZGVyLT5zbmFwc2hvdCk7CisJRGVzdHJveVBhcmFs bGVsQ29udGV4dChnaW5sZWFkZXItPnBjeHQpOworCUV4aXRQYXJhbGxlbE1vZGUoKTsKK30K KworLyoKKyAqIFdpdGhpbiBsZWFkZXIsIHdhaXQgZm9yIGVuZCBvZiBoZWFwIHNjYW4uCisg KgorICogV2hlbiBjYWxsZWQsIHBhcmFsbGVsIGhlYXAgc2NhbiBzdGFydGVkIGJ5IF9naW5f YmVnaW5fcGFyYWxsZWwoKSB3aWxsCisgKiBhbHJlYWR5IGJlIHVuZGVyd2F5IHdpdGhpbiB3 b3JrZXIgcHJvY2Vzc2VzICh3aGVuIGxlYWRlciBwYXJ0aWNpcGF0ZXMKKyAqIGFzIGEgd29y a2VyLCB3ZSBzaG91bGQgZW5kIHVwIGhlcmUganVzdCBhcyB3b3JrZXJzIGFyZSBmaW5pc2hp bmcpLgorICoKKyAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBoZWFwIHR1cGxlcyBz Y2FubmVkLgorICovCitzdGF0aWMgZG91YmxlCitfZ2luX3BhcmFsbGVsX2hlYXBzY2FuKEdp bkJ1aWxkU3RhdGUgKnN0YXRlKQoreworCUdpblNoYXJlZCAgKmdpbnNoYXJlZCA9IHN0YXRl LT5ic19sZWFkZXItPmdpbnNoYXJlZDsKKwlpbnQJCQlucGFydGljaXBhbnR0dXBsZXNvcnRz OworCisJbnBhcnRpY2lwYW50dHVwbGVzb3J0cyA9IHN0YXRlLT5ic19sZWFkZXItPm5wYXJ0 aWNpcGFudHR1cGxlc29ydHM7CisJZm9yICg7OykKKwl7CisJCVNwaW5Mb2NrQWNxdWlyZSgm Z2luc2hhcmVkLT5tdXRleCk7CisJCWlmIChnaW5zaGFyZWQtPm5wYXJ0aWNpcGFudHNkb25l ID09IG5wYXJ0aWNpcGFudHR1cGxlc29ydHMpCisJCXsKKwkJCS8qIGNvcHkgdGhlIGRhdGEg aW50byBsZWFkZXIgc3RhdGUgKi8KKwkJCXN0YXRlLT5ic19yZWx0dXBsZXMgPSBnaW5zaGFy ZWQtPnJlbHR1cGxlczsKKwkJCXN0YXRlLT5ic19udW10dXBsZXMgPSBnaW5zaGFyZWQtPmlu ZHR1cGxlczsKKworCQkJU3BpbkxvY2tSZWxlYXNlKCZnaW5zaGFyZWQtPm11dGV4KTsKKwkJ CWJyZWFrOworCQl9CisJCVNwaW5Mb2NrUmVsZWFzZSgmZ2luc2hhcmVkLT5tdXRleCk7CisK KwkJQ29uZGl0aW9uVmFyaWFibGVTbGVlcCgmZ2luc2hhcmVkLT53b3JrZXJzZG9uZWN2LAor CQkJCQkJCSAgIFdBSVRfRVZFTlRfUEFSQUxMRUxfQ1JFQVRFX0lOREVYX1NDQU4pOworCX0K KworCUNvbmRpdGlvblZhcmlhYmxlQ2FuY2VsU2xlZXAoKTsKKworCXJldHVybiBzdGF0ZS0+ YnNfcmVsdHVwbGVzOworfQorCitzdGF0aWMgaW50Cit0aWRfY21wKGNvbnN0IHZvaWQgKmEs IGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuIEl0ZW1Qb2ludGVyQ29tcGFyZSgoSXRlbVBv aW50ZXIpIGEsIChJdGVtUG9pbnRlcikgYik7Cit9CisKKy8qCisgKiBTdGF0ZSB1c2VkIHRv IGNvbWJpbmUgYWNjdW11bGF0ZSBUSURzIGZyb20gbXVsdGlwbGUgR2luVHVwbGVzIGZvciB0 aGUgc2FtZQorICoga2V5IHZhbHVlLgorICoKKyAqIFhYWCBTaW1pbGFyIHB1cnBvc2UgdG8g QnVpbGRBY2N1bXVsYXRvciwgYnV0IG11Y2ggc2ltcGxlci4KKyAqLwordHlwZWRlZiBzdHJ1 Y3QgR2luQnVmZmVyCit7CisJT2Zmc2V0TnVtYmVyIGF0dG51bTsKKwlHaW5OdWxsQ2F0ZWdv cnkgY2F0ZWdvcnk7CisJRGF0dW0JCWtleTsJCQkvKiAwIGlmIG5vIGtleSAoYW5kIGtleWxl biA9PSAwKSAqLworCVNpemUJCWtleWxlbjsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgKG5vdCB0 eXBsZW4pICovCisKKwkvKiB0eXBlIGluZm8gKi8KKwlpbnQxNgkJdHlwbGVuOworCWJvb2wJ CXR5cGJ5dmFsOworCisJLyogYXJyYXkgb2YgVElEIHZhbHVlcyAqLworCWludAkJCW5pdGVt czsKKwlpbnQJCQltYXhpdGVtczsKKwlJdGVtUG9pbnRlckRhdGEgKml0ZW1zOworfSBHaW5C dWZmZXI7CisKKy8qIFhYWCBzaG91bGQgZG8gbW9yZSBjaGVja3MgKi8KK3N0YXRpYyB2b2lk CitBc3NlcnRDaGVja0dpbkJ1ZmZlcihHaW5CdWZmZXIgKmJ1ZmZlcikKK3sKKyNpZmRlZiBV U0VfQVNTRVJUX0NIRUNLSU5HCisJQXNzZXJ0KGJ1ZmZlci0+bml0ZW1zIDw9IGJ1ZmZlci0+ bWF4aXRlbXMpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitBc3NlcnRDaGVja0l0ZW1Q b2ludGVycyhJdGVtUG9pbnRlckRhdGEgKml0ZW1zLCBpbnQgbml0ZW1zLCBib29sIHNvcnRl ZCkKK3sKKyNpZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCisJZm9yIChpbnQgaSA9IDA7IGkg PCBuaXRlbXM7IGkrKykKKwl7CisJCUFzc2VydChJdGVtUG9pbnRlcklzVmFsaWQoJml0ZW1z W2ldKSk7CisKKwkJaWYgKChpID09IDApIHx8ICFzb3J0ZWQpCisJCQljb250aW51ZTsKKwor CQlBc3NlcnQoSXRlbVBvaW50ZXJDb21wYXJlKCZpdGVtc1tpIC0gMV0sICZpdGVtc1tpXSkg PCAwKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIEdpbkJ1ZmZlciAqCitHaW5CdWZmZXJJ bml0KHZvaWQpCit7CisJcmV0dXJuIHBhbGxvYzAoc2l6ZW9mKEdpbkJ1ZmZlcikpOworfQor CitzdGF0aWMgYm9vbAorR2luQnVmZmVySXNFbXB0eShHaW5CdWZmZXIgKmJ1ZmZlcikKK3sK KwlyZXR1cm4gKGJ1ZmZlci0+bml0ZW1zID09IDApOworfQorCisvKgorICogQ29tcGFyZSBp ZiB0aGUgdHVwbGUgbWF0Y2hlcyB0aGUgYWxyZWFkeSBhY2N1bXVsYXRlZCBkYXRhLiBDb21w YXJlCisgKiBzY2FsYXIgZmllbGRzIGZpcnN0LCBiZWZvcmUgdGhlIGFjdHVhbCBrZXkuCisg KgorICogWFhYIFRoZSBrZXkgaXMgY29tcGFyZWQgdXNpbmcgbWVtY21wLCB3aGljaCBtZWFu cyB0aGF0IGlmIGEga2V5IGhhcworICogbXVsdGlwbGUgYmluYXJ5IHJlcHJlc2VudGF0aW9u cywgd2UgbWF5IGVuZCB1cCB0cmVhdGluZyB0aGVtIGFzCisgKiBkaWZmZXJlbnQgaGVyZS4g QnV0IHRoYXQncyBPSywgdGhlIGluZGV4IHdpbGwgbWVyZ2UgdGhlbSBhbnl3YXkuCisgKi8K K3N0YXRpYyBib29sCitHaW5CdWZmZXJLZXlFcXVhbHMoR2luQnVmZmVyICpidWZmZXIsIEdp blR1cGxlICp0dXApCit7CisJQXNzZXJ0Q2hlY2tHaW5CdWZmZXIoYnVmZmVyKTsKKworCWlm ICh0dXAtPmF0dHJudW0gIT0gYnVmZmVyLT5hdHRudW0pCisJCXJldHVybiBmYWxzZTsKKwor CS8qIHNhbWUgYXR0cmlidXRlIHNob3VsZCBoYXZlIHRoZSBzYW1lIHR5cGUgaW5mbyAqLwor CUFzc2VydCh0dXAtPnR5cGJ5dmFsID09IGJ1ZmZlci0+dHlwYnl2YWwpOworCUFzc2VydCh0 dXAtPnR5cGxlbiA9PSBidWZmZXItPnR5cGxlbik7CisKKwlpZiAodHVwLT5jYXRlZ29yeSAh PSBidWZmZXItPmNhdGVnb3J5KQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAodHVwLT5rZXls ZW4gIT0gYnVmZmVyLT5rZXlsZW4pCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogRm9y IE5VTEwvZW1wdHkga2V5cywgdGhpcyBtZWFucyBlcXVhbGl0eSwgZm9yIG5vcm1hbCBrZXlz IHdlIG5lZWQgdG8KKwkgKiBjb21wYXJlIHRoZSBhY3R1YWwga2V5IHZhbHVlLgorCSAqLwor CWlmIChidWZmZXItPmNhdGVnb3J5ICE9IEdJTl9DQVRfTk9STV9LRVkpCisJCXJldHVybiB0 cnVlOworCisJLyoKKwkgKiBDb21wYXJlIHRoZSBrZXkgdmFsdWUsIGRlcGVuZGluZyBvbiB0 aGUgdHlwZSBpbmZvcm1hdGlvbi4KKwkgKgorCSAqIFhYWCBOb3Qgc3VyZSB0aGlzIHdvcmtz IGNvcnJlY3RseSBmb3IgYnl2YWwgdHlwZXMgdGhhdCBkb24ndCBuZWVkIHRoZQorCSAqIHdo b2xlIERhdHVtLiBXaGF0IGlmIHRoZXJlIGlzIGdhcmJhZ2UgaW4gdGhlIHBhZGRpbmcgYnl0 ZXM/CisJICovCisJaWYgKGJ1ZmZlci0+dHlwYnl2YWwpCisJCXJldHVybiAoYnVmZmVyLT5r ZXkgPT0gKihEYXR1bSAqKSB0dXAtPmRhdGEpOworCisJLyogYnlyZWYgdmFsdWVzIHNpbXBs eSB1c2VzIG1lbWNtcCBmb3IgY29tcGFyaXNvbiAqLworCXJldHVybiAobWVtY21wKHR1cC0+ ZGF0YSwgRGF0dW1HZXRQb2ludGVyKGJ1ZmZlci0+a2V5KSwgYnVmZmVyLT5rZXlsZW4pID09 IDApOworfQorCitzdGF0aWMgdm9pZAorR2luQnVmZmVyU3RvcmVUdXBsZShHaW5CdWZmZXIg KmJ1ZmZlciwgR2luVHVwbGUgKnR1cCkKK3sKKwlJdGVtUG9pbnRlckRhdGEgKml0ZW1zOwor CURhdHVtCQlrZXk7CisKKwlBc3NlcnRDaGVja0dpbkJ1ZmZlcihidWZmZXIpOworCisJa2V5 ID0gX2dpbl9wYXJzZV90dXBsZSh0dXAsICZpdGVtcyk7CisKKwkvKiBpZiB0aGUgYnVmZmVy IGlzIGVtcHR5LCBzZXQgdGhlIGZpZWxkcyAoYW5kIGNvcHkgdGhlIGtleSkgKi8KKwlpZiAo R2luQnVmZmVySXNFbXB0eShidWZmZXIpKQorCXsKKwkJYnVmZmVyLT5jYXRlZ29yeSA9IHR1 cC0+Y2F0ZWdvcnk7CisJCWJ1ZmZlci0+a2V5bGVuID0gdHVwLT5rZXlsZW47CisJCWJ1ZmZl ci0+YXR0bnVtID0gdHVwLT5hdHRybnVtOworCisJCWJ1ZmZlci0+dHlwbGVuID0gdHVwLT50 eXBsZW47CisJCWJ1ZmZlci0+dHlwYnl2YWwgPSB0dXAtPnR5cGJ5dmFsOworCisJCWlmICh0 dXAtPmNhdGVnb3J5ID09IEdJTl9DQVRfTk9STV9LRVkpCisJCQlidWZmZXItPmtleSA9IGRh dHVtQ29weShrZXksIGJ1ZmZlci0+dHlwYnl2YWwsIGJ1ZmZlci0+dHlwbGVuKTsKKwkJZWxz ZQorCQkJYnVmZmVyLT5rZXkgPSAoRGF0dW0pIDA7CisJfQorCisJLyogZW5sYXJnZSB0aGUg VElEIGJ1ZmZlciwgaWYgbmVlZGVkICovCisJaWYgKGJ1ZmZlci0+bml0ZW1zICsgdHVwLT5u aXRlbXMgPiBidWZmZXItPm1heGl0ZW1zKQorCXsKKwkJLyogNjQgc2VlbXMgbGlrZSBhIGdv b2QgaW5pdCB2YWx1ZSAqLworCQlidWZmZXItPm1heGl0ZW1zID0gTWF4KGJ1ZmZlci0+bWF4 aXRlbXMsIDY0KTsKKworCQl3aGlsZSAoYnVmZmVyLT5uaXRlbXMgKyB0dXAtPm5pdGVtcyA+ IGJ1ZmZlci0+bWF4aXRlbXMpCisJCQlidWZmZXItPm1heGl0ZW1zICo9IDI7CisKKwkJaWYg KGJ1ZmZlci0+aXRlbXMgPT0gTlVMTCkKKwkJCWJ1ZmZlci0+aXRlbXMgPSBwYWxsb2MoYnVm ZmVyLT5tYXhpdGVtcyAqIHNpemVvZihJdGVtUG9pbnRlckRhdGEpKTsKKwkJZWxzZQorCQkJ YnVmZmVyLT5pdGVtcyA9IHJlcGFsbG9jKGJ1ZmZlci0+aXRlbXMsCisJCQkJCQkJCQkgYnVm ZmVyLT5tYXhpdGVtcyAqIHNpemVvZihJdGVtUG9pbnRlckRhdGEpKTsKKwl9CisKKwkvKiBu b3cgd2Ugc2hvdWxkIGJlIGd1YXJhbnRlZWQgdG8gaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIGFs bCB0aGUgVElEcyAqLworCUFzc2VydChidWZmZXItPm5pdGVtcyArIHR1cC0+bml0ZW1zIDw9 IGJ1ZmZlci0+bWF4aXRlbXMpOworCisJLyogY29weSB0aGUgbmV3IFRJRHMgaW50byB0aGUg YnVmZmVyICovCisJbWVtY3B5KCZidWZmZXItPml0ZW1zW2J1ZmZlci0+bml0ZW1zXSwgaXRl bXMsIHNpemVvZihJdGVtUG9pbnRlckRhdGEpICogdHVwLT5uaXRlbXMpOworCWJ1ZmZlci0+ bml0ZW1zICs9IHR1cC0+bml0ZW1zOworCisJQXNzZXJ0Q2hlY2tJdGVtUG9pbnRlcnMoYnVm ZmVyLT5pdGVtcywgYnVmZmVyLT5uaXRlbXMsIGZhbHNlKTsKK30KKworc3RhdGljIHZvaWQK K0dpbkJ1ZmZlclNvcnRJdGVtcyhHaW5CdWZmZXIgKmJ1ZmZlcikKK3sKKwkvKiB3ZSBzaG91 bGQgbm90IGhhdmUgYSBidWZmZXIgd2l0aCBubyBUSURzIHRvIHNvcnQgKi8KKwlBc3NlcnQo YnVmZmVyLT5pdGVtcyAhPSBOVUxMKTsKKwlBc3NlcnQoYnVmZmVyLT5uaXRlbXMgPiAwKTsK KworCXBnX3Fzb3J0KGJ1ZmZlci0+aXRlbXMsIGJ1ZmZlci0+bml0ZW1zLCBzaXplb2YoSXRl bVBvaW50ZXJEYXRhKSwgdGlkX2NtcCk7CisKKwlBc3NlcnRDaGVja0l0ZW1Qb2ludGVycyhi dWZmZXItPml0ZW1zLCBidWZmZXItPm5pdGVtcywgdHJ1ZSk7Cit9CisKKy8qIFhYWCBwcm9i YWJseSB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBhIG1lbW9yeSBjb250ZXh0IGZvciB0aGUg YnVmZmVyICovCitzdGF0aWMgdm9pZAorR2luQnVmZmVyUmVzZXQoR2luQnVmZmVyICpidWZm ZXIpCit7CisJQXNzZXJ0KCFHaW5CdWZmZXJJc0VtcHR5KGJ1ZmZlcikpOworCisJLyogcmVs ZWFzZSBieXJlZiB2YWx1ZXMsIGRvIG5vdGhpbmcgZm9yIGJ5LXZhbCBvbmVzICovCisJaWYg KChidWZmZXItPmNhdGVnb3J5ID09IEdJTl9DQVRfTk9STV9LRVkpICYmICFidWZmZXItPnR5 cGJ5dmFsKQorCQlwZnJlZShEYXR1bUdldFBvaW50ZXIoYnVmZmVyLT5rZXkpKTsKKworCS8q IFhYWCBub3QgcmVhbGx5IG5lZWRlZCwgYnV0IGVhc2llciB0byB0cmlnZ2VyIE5VTEwgZGVy ZWYgZXRjLiAqLworCWJ1ZmZlci0+a2V5ID0gKERhdHVtKSAwOworCisJYnVmZmVyLT5hdHRu dW0gPSAwOworCWJ1ZmZlci0+Y2F0ZWdvcnkgPSAwOworCWJ1ZmZlci0+a2V5bGVuID0gMDsK KwlidWZmZXItPm5pdGVtcyA9IDA7CisKKwlidWZmZXItPnR5cGxlbiA9IDA7CisJYnVmZmVy LT50eXBieXZhbCA9IDA7CisKKwkvKiBYWFggc2hvdWxkIGRvIHNvbWV0aGluZyB3aXRoIGV4 dHJlbWVseSBsYXJnZSBhcnJheSBvZiBpdGVtcz8gKi8KK30KKworLyoKKyAqIFhYWCBNYXli ZSBjaGVjayBzaXplIG9mIHRoZSBUSUQgYXJyYXlzLCBhbmQgcmV0dXJuIGZhbHNlIGlmIGl0 J3MgdG9vCisgKiBsYXJnZSAobW9yZSB0aGFudCBtYWludGVuYW5jZV93b3JrX21lbSBvciBz b21ldGhpbmc/KS4KKyAqLworc3RhdGljIGJvb2wKK0dpbkJ1ZmZlckNhbkFkZEtleShHaW5C dWZmZXIgKmJ1ZmZlciwgR2luVHVwbGUgKnR1cCkKK3sKKwkvKiBlbXB0eSBidWZmZXIgY2Fu IGFjY2VwdCBkYXRhIGZvciBhbnkga2V5ICovCisJaWYgKEdpbkJ1ZmZlcklzRW1wdHkoYnVm ZmVyKSkKKwkJcmV0dXJuIHRydWU7CisKKwkvKiBvdGhlcndpc2UganVzdCBkYXRhIGZvciB0 aGUgc2FtZSBrZXkgKi8KKwlyZXR1cm4gR2luQnVmZmVyS2V5RXF1YWxzKGJ1ZmZlciwgdHVw KTsKK30KKworLyoKKyAqIFdpdGhpbiBsZWFkZXIsIHdhaXQgZm9yIGVuZCBvZiBoZWFwIHNj YW4gYW5kIG1lcmdlIHBlci13b3JrZXIgcmVzdWx0cy4KKyAqCisgKiBBZnRlciB3YWl0aW5n IGZvciBhbGwgd29ya2VycyB0byBmaW5pc2gsIG1lcmdlIHRoZSBwZXItd29ya2VyIHJlc3Vs dHMgaW50bworICogdGhlIGNvbXBsZXRlIGluZGV4LiBUaGUgcmVzdWx0cyBmcm9tIGVhY2gg d29ya2VyIGFyZSBzb3J0ZWQgYnkgYmxvY2sgbnVtYmVyCisgKiAoc3RhcnQgb2YgdGhlIHBh Z2UgcmFuZ2UpLiBXaGlsZSBjb21iaW5pZyB0aGUgcGVyLXdvcmtlciByZXN1bHRzIHdlIG1l cmdlCisgKiBzdW1tYXJpZXMgZm9yIHRoZSBzYW1lIHBhZ2UgcmFuZ2UsIGFuZCBhbHNvIGZp bGwtaW4gZW1wdHkgc3VtbWFyaWVzIGZvcgorICogcmFuZ2VzIHdpdGhvdXQgYW55IHR1cGxl cy4KKyAqCisgKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgaGVhcCB0dXBsZXMgc2Nh bm5lZC4KKyAqCisgKiBGSVhNRSBwcm9iYWJseSBzaG91bGQgaGF2ZSBsb2NhbCBtZW1vcnkg Y29udGV4dHMgc2ltaWxhciB0byB3aGF0CisgKiBfYnJpbl9wYXJhbGxlbF9tZXJnZSAgZG9l cy4KKyAqLworc3RhdGljIGRvdWJsZQorX2dpbl9wYXJhbGxlbF9tZXJnZShHaW5CdWlsZFN0 YXRlICpzdGF0ZSkKK3sKKwlHaW5UdXBsZSAgICp0dXA7CisJU2l6ZQkJdHVwbGVuOworCWRv dWJsZQkJcmVsdHVwbGVzID0gMDsKKwlHaW5CdWZmZXIgICpidWZmZXI7CisKKwkvKiB3YWl0 IGZvciB3b3JrZXJzIHRvIHNjYW4gdGFibGUgYW5kIHByb2R1Y2UgcGFydGlhbCByZXN1bHRz ICovCisJcmVsdHVwbGVzID0gX2dpbl9wYXJhbGxlbF9oZWFwc2NhbihzdGF0ZSk7CisKKwkv KiBkbyB0aGUgYWN0dWFsIHNvcnQgaW4gdGhlIGxlYWRlciAqLworCXR1cGxlc29ydF9wZXJm b3Jtc29ydChzdGF0ZS0+YnNfc29ydHN0YXRlKTsKKworCS8qIGluaXRpYWxpemUgYnVmZmVy IHRvIGNvbWJpbmUgZW50cmllcyBmb3IgdGhlIHNhbWUga2V5ICovCisJYnVmZmVyID0gR2lu QnVmZmVySW5pdCgpOworCisJLyoKKwkgKiBSZWFkIHRoZSBHSU4gdHVwbGVzIGZyb20gdGhl IHNoYXJlZCB0dXBsZXNvcnQsIHNvcnRlZCBieSBjYXRlZ29yeSBhbmQKKwkgKiBrZXkuIFRo YXQgcHJvYmFibHkgZ2l2ZXMgdXMgb3JkZXIgbWF0Y2hpbmcgaG93IGRhdGEgaXMgb3JnYW5p emVkIGluIHRoZQorCSAqIGluZGV4LgorCSAqCisJICogWFhYIE1heWJlIHdlIHNob3VsZCBz b3J0IGJ5IGtleSBmaXJzdCwgdGhlbiBieSBjYXRlZ29yeT8KKwkgKgorCSAqIFdlIGRvbid0 IGluc2VydCB0aGUgR0lOIHR1cGxlcyByaWdodCBhd2F5LCBidXQgaW5zdGVhZCBhY2N1bXVs YXRlIGFzCisJICogbWFueSBUSURzIGZvciB0aGUgc2FtZSBrZXkgYXMgcG9zc2libGUsIGFu ZCB0aGVuIGluc2VydCB0aGF0IGF0IG9uY2UuCisJICogVGhpcyB3YXkgd2UgZG9uJ3QgbmVl ZCB0byBkZWNvbXByZXNzL3JlY29tcHJlc3MgdGhlIHBvc3RpbmcgbGlzdHMsIGV0Yy4KKwkg Ki8KKwl3aGlsZSAoKHR1cCA9IHR1cGxlc29ydF9nZXRnaW50dXBsZShzdGF0ZS0+YnNfc29y dHN0YXRlLCAmdHVwbGVuLCB0cnVlKSkgIT0gTlVMTCkKKwl7CisJCUNIRUNLX0ZPUl9JTlRF UlJVUFRTKCk7CisKKwkJLyoKKwkJICogSWYgdGhlIGJ1ZmZlciBjYW4gYWNjZXB0IHRoZSBu ZXcgR0lOIHR1cGxlLCBqdXN0IHN0b3JlIGl0IHRoZXJlIGFuZAorCQkgKiB3ZSdyZSBkb25l LiBJZiBpdCdzIGEgZGlmZmVyZW50IGtleSAob3IgbWF5YmUgdG9vIG11Y2ggZGF0YSkgZmx1 c2gKKwkJICogdGhlIGN1cnJlbnQgY29udGVudHMgaW50byB0aGUgaW5kZXggZmlyc3QuCisJ CSAqLworCQlpZiAoIUdpbkJ1ZmZlckNhbkFkZEtleShidWZmZXIsIHR1cCkpCisJCXsKKwkJ CS8qCisJCQkgKiBCdWZmZXIgaXMgbm90IGVtcHR5IGFuZCBpdCdzIHN0b3JpbmcgYSBkaWZm ZXJlbnQga2V5IC0gZmx1c2gKKwkJCSAqIHRoZSBkYXRhIGludG8gdGhlIGluc2VydCwgYW5k IHN0YXJ0IGEgbmV3IGVudHJ5IGZvciBjdXJyZW50CisJCQkgKiBHaW5UdXBsZS4KKwkJCSAq LworCQkJR2luQnVmZmVyU29ydEl0ZW1zKGJ1ZmZlcik7CisKKwkJCWdpbkVudHJ5SW5zZXJ0 KCZzdGF0ZS0+Z2luc3RhdGUsCisJCQkJCQkgICBidWZmZXItPmF0dG51bSwgYnVmZmVyLT5r ZXksIGJ1ZmZlci0+Y2F0ZWdvcnksCisJCQkJCQkgICBidWZmZXItPml0ZW1zLCBidWZmZXIt Pm5pdGVtcywgJnN0YXRlLT5idWlsZFN0YXRzKTsKKworCQkJLyogZGlzY2FyZCB0aGUgZXhp c3RpbmcgZGF0YSAqLworCQkJR2luQnVmZmVyUmVzZXQoYnVmZmVyKTsKKwkJfQorCisJCS8q IG5vdyByZW1lbWJlciB0aGUgbmV3IGtleSAqLworCQlHaW5CdWZmZXJTdG9yZVR1cGxlKGJ1 ZmZlciwgdHVwKTsKKwl9CisKKwkvKiBmbHVzaCBkYXRhIHJlbWFpbmluZyBpbiB0aGUgYnVm ZmVyIChmb3IgdGhlIGxhc3Qga2V5KSAqLworCWlmICghR2luQnVmZmVySXNFbXB0eShidWZm ZXIpKQorCXsKKwkJR2luQnVmZmVyU29ydEl0ZW1zKGJ1ZmZlcik7CisKKwkJZ2luRW50cnlJ bnNlcnQoJnN0YXRlLT5naW5zdGF0ZSwKKwkJCQkJICAgYnVmZmVyLT5hdHRudW0sIGJ1ZmZl ci0+a2V5LCBidWZmZXItPmNhdGVnb3J5LAorCQkJCQkgICBidWZmZXItPml0ZW1zLCBidWZm ZXItPm5pdGVtcywgJnN0YXRlLT5idWlsZFN0YXRzKTsKKworCQkvKiBkaXNjYXJkIHRoZSBl eGlzdGluZyBkYXRhICovCisJCUdpbkJ1ZmZlclJlc2V0KGJ1ZmZlcik7CisJfQorCisJdHVw bGVzb3J0X2VuZChzdGF0ZS0+YnNfc29ydHN0YXRlKTsKKworCXJldHVybiByZWx0dXBsZXM7 Cit9CisKKy8qCisgKiBSZXR1cm5zIHNpemUgb2Ygc2hhcmVkIG1lbW9yeSByZXF1aXJlZCB0 byBzdG9yZSBzdGF0ZSBmb3IgYSBwYXJhbGxlbAorICogZ2luIGluZGV4IGJ1aWxkIGJhc2Vk IG9uIHRoZSBzbmFwc2hvdCBpdHMgcGFyYWxsZWwgc2NhbiB3aWxsIHVzZS4KKyAqLworc3Rh dGljIFNpemUKK19naW5fcGFyYWxsZWxfZXN0aW1hdGVfc2hhcmVkKFJlbGF0aW9uIGhlYXAs IFNuYXBzaG90IHNuYXBzaG90KQoreworCS8qIGMuZi4gc2htX3RvY19hbGxvY2F0ZSBhcyB0 byB3aHkgQlVGRkVSQUxJR04gaXMgdXNlZCAqLworCXJldHVybiBhZGRfc2l6ZShCVUZGRVJB TElHTihzaXplb2YoR2luU2hhcmVkKSksCisJCQkJCXRhYmxlX3BhcmFsbGVsc2Nhbl9lc3Rp bWF0ZShoZWFwLCBzbmFwc2hvdCkpOworfQorCisvKgorICogV2l0aGluIGxlYWRlciwgcGFy dGljaXBhdGUgYXMgYSBwYXJhbGxlbCB3b3JrZXIuCisgKi8KK3N0YXRpYyB2b2lkCitfZ2lu X2xlYWRlcl9wYXJ0aWNpcGF0ZV9hc193b3JrZXIoR2luQnVpbGRTdGF0ZSAqYnVpbGRzdGF0 ZSwgUmVsYXRpb24gaGVhcCwgUmVsYXRpb24gaW5kZXgpCit7CisJR2luTGVhZGVyICAqZ2lu bGVhZGVyID0gYnVpbGRzdGF0ZS0+YnNfbGVhZGVyOworCWludAkJCXNvcnRtZW07CisKKwkv KgorCSAqIE1pZ2h0IGFzIHdlbGwgdXNlIHJlbGlhYmxlIGZpZ3VyZSB3aGVuIGRvbGluZyBv dXQgbWFpbnRlbmFuY2Vfd29ya19tZW0KKwkgKiAod2hlbiByZXF1ZXN0ZWQgbnVtYmVyIG9m IHdvcmtlcnMgd2VyZSBub3QgbGF1bmNoZWQsIHRoaXMgd2lsbCBiZQorCSAqIHNvbWV3aGF0 IGhpZ2hlciB0aGFuIGl0IGlzIGZvciBvdGhlciB3b3JrZXJzKS4KKwkgKi8KKwlzb3J0bWVt ID0gbWFpbnRlbmFuY2Vfd29ya19tZW0gLyBnaW5sZWFkZXItPm5wYXJ0aWNpcGFudHR1cGxl c29ydHM7CisKKwkvKiBQZXJmb3JtIHdvcmsgY29tbW9uIHRvIGFsbCBwYXJ0aWNpcGFudHMg Ki8KKwlfZ2luX3BhcmFsbGVsX3NjYW5fYW5kX2J1aWxkKGJ1aWxkc3RhdGUsIGdpbmxlYWRl ci0+Z2luc2hhcmVkLAorCQkJCQkJCQkgZ2lubGVhZGVyLT5zaGFyZWRzb3J0LCBoZWFwLCBp bmRleCwgc29ydG1lbSwgdHJ1ZSk7Cit9CisKKy8qCisgKiBQZXJmb3JtIGEgd29ya2VyJ3Mg cG9ydGlvbiBvZiBhIHBhcmFsbGVsIHNvcnQuCisgKgorICogVGhpcyBnZW5lcmF0ZXMgYSB0 dXBsZXNvcnQgZm9yIHRoZSB3b3JrZXIgcG9ydGlvbiBvZiB0aGUgdGFibGUuCisgKgorICog c29ydG1lbSBpcyB0aGUgYW1vdW50IG9mIHdvcmtpbmcgbWVtb3J5IHRvIHVzZSB3aXRoaW4g ZWFjaCB3b3JrZXIsCisgKiBleHByZXNzZWQgaW4gS0JzLgorICoKKyAqIFdoZW4gdGhpcyBy ZXR1cm5zLCB3b3JrZXJzIGFyZSBkb25lLCBhbmQgbmVlZCBvbmx5IHJlbGVhc2UgcmVzb3Vy Y2VzLgorICovCitzdGF0aWMgdm9pZAorX2dpbl9wYXJhbGxlbF9zY2FuX2FuZF9idWlsZChH aW5CdWlsZFN0YXRlICpzdGF0ZSwKKwkJCQkJCQkgR2luU2hhcmVkICpnaW5zaGFyZWQsIFNo YXJlZHNvcnQgKnNoYXJlZHNvcnQsCisJCQkJCQkJIFJlbGF0aW9uIGhlYXAsIFJlbGF0aW9u IGluZGV4LAorCQkJCQkJCSBpbnQgc29ydG1lbSwgYm9vbCBwcm9ncmVzcykKK3sKKwlTb3J0 Q29vcmRpbmF0ZSBjb29yZGluYXRlOworCVRhYmxlU2NhbkRlc2Mgc2NhbjsKKwlkb3VibGUJ CXJlbHR1cGxlczsKKwlJbmRleEluZm8gICppbmRleEluZm87CisKKwkvKiBJbml0aWFsaXpl IGxvY2FsIHR1cGxlc29ydCBjb29yZGluYXRpb24gc3RhdGUgKi8KKwljb29yZGluYXRlID0g cGFsbG9jMChzaXplb2YoU29ydENvb3JkaW5hdGVEYXRhKSk7CisJY29vcmRpbmF0ZS0+aXNX b3JrZXIgPSB0cnVlOworCWNvb3JkaW5hdGUtPm5QYXJ0aWNpcGFudHMgPSAtMTsKKwljb29y ZGluYXRlLT5zaGFyZWRzb3J0ID0gc2hhcmVkc29ydDsKKworCS8qIEJlZ2luICJwYXJ0aWFs IiB0dXBsZXNvcnQgKi8KKwlzdGF0ZS0+YnNfc29ydHN0YXRlID0gdHVwbGVzb3J0X2JlZ2lu X2luZGV4X2dpbihzb3J0bWVtLCBjb29yZGluYXRlLAorCQkJCQkJCQkJCQkJCVRVUExFU09S VF9OT05FKTsKKworCS8qIEpvaW4gcGFyYWxsZWwgc2NhbiAqLworCWluZGV4SW5mbyA9IEJ1 aWxkSW5kZXhJbmZvKGluZGV4KTsKKwlpbmRleEluZm8tPmlpX0NvbmN1cnJlbnQgPSBnaW5z aGFyZWQtPmlzY29uY3VycmVudDsKKworCXNjYW4gPSB0YWJsZV9iZWdpbnNjYW5fcGFyYWxs ZWwoaGVhcCwKKwkJCQkJCQkJCVBhcmFsbGVsVGFibGVTY2FuRnJvbUdpblNoYXJlZChnaW5z aGFyZWQpKTsKKworCXJlbHR1cGxlcyA9IHRhYmxlX2luZGV4X2J1aWxkX3NjYW4oaGVhcCwg aW5kZXgsIGluZGV4SW5mbywgdHJ1ZSwgdHJ1ZSwKKwkJCQkJCQkJCSAgIGdpbkJ1aWxkQ2Fs bGJhY2tQYXJhbGxlbCwgc3RhdGUsIHNjYW4pOworCisJLyogaW5zZXJ0IHRoZSBsYXN0IGl0 ZW0gKi8KKwkvKiB3cml0ZSByZW1haW5pbmcgYWNjdW11bGF0ZWQgZW50cmllcyAqLworCXsK KwkJSXRlbVBvaW50ZXJEYXRhICpsaXN0OworCQlEYXR1bQkJa2V5OworCQlHaW5OdWxsQ2F0 ZWdvcnkgY2F0ZWdvcnk7CisJCXVpbnQzMgkJbmxpc3Q7CisJCU9mZnNldE51bWJlciBhdHRu dW07CisJCVR1cGxlRGVzYwl0ZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IoaW5kZXgpOworCisJ CWdpbkJlZ2luQkFTY2FuKCZzdGF0ZS0+YWNjdW0pOworCQl3aGlsZSAoKGxpc3QgPSBnaW5H ZXRCQUVudHJ5KCZzdGF0ZS0+YWNjdW0sCisJCQkJCQkJCQkgJmF0dG51bSwgJmtleSwgJmNh dGVnb3J5LCAmbmxpc3QpKSAhPSBOVUxMKQorCQl7CisJCQkvKiBpbmZvcm1hdGlvbiBhYm91 dCB0aGUga2V5ICovCisJCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHRyID0gVHVwbGVEZXNjQXR0 cih0ZGVzYywgKGF0dG51bSAtIDEpKTsKKworCQkJR2luVHVwbGUgICAqdHVwOworCQkJU2l6 ZQkJbGVuOworCisJCQkvKiB0aGVyZSBjb3VsZCBiZSBtYW55IGVudHJpZXMsIHNvIGJlIHdp bGxpbmcgdG8gYWJvcnQgaGVyZSAqLworCQkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKKwor CQkJdHVwID0gX2dpbl9idWlsZF90dXBsZShhdHRudW0sIGNhdGVnb3J5LAorCQkJCQkJCQkg ICBrZXksIGF0dHItPmF0dGxlbiwgYXR0ci0+YXR0Ynl2YWwsCisJCQkJCQkJCSAgIGxpc3Qs IG5saXN0LCAmbGVuKTsKKworCQkJdHVwbGVzb3J0X3B1dGdpbnR1cGxlKHN0YXRlLT5ic19z b3J0c3RhdGUsIHR1cCwgbGVuKTsKKworCQkJcGZyZWUodHVwKTsKKwkJfQorCisJCU1lbW9y eUNvbnRleHRSZXNldChzdGF0ZS0+dG1wQ3R4KTsKKwkJZ2luSW5pdEJBKCZzdGF0ZS0+YWNj dW0pOworCX0KKworCS8qIHNvcnQgdGhlIEdJTiB0dXBsZXMgYnVpbHQgYnkgdGhpcyB3b3Jr ZXIgKi8KKwl0dXBsZXNvcnRfcGVyZm9ybXNvcnQoc3RhdGUtPmJzX3NvcnRzdGF0ZSk7CisK KwlzdGF0ZS0+YnNfcmVsdHVwbGVzICs9IHJlbHR1cGxlczsKKworCS8qCisJICogRG9uZS4g IFJlY29yZCBhbWJ1aWxkIHN0YXRpc3RpY3MuCisJICovCisJU3BpbkxvY2tBY3F1aXJlKCZn aW5zaGFyZWQtPm11dGV4KTsKKwlnaW5zaGFyZWQtPm5wYXJ0aWNpcGFudHNkb25lKys7CisJ Z2luc2hhcmVkLT5yZWx0dXBsZXMgKz0gc3RhdGUtPmJzX3JlbHR1cGxlczsKKwlnaW5zaGFy ZWQtPmluZHR1cGxlcyArPSBzdGF0ZS0+YnNfbnVtdHVwbGVzOworCVNwaW5Mb2NrUmVsZWFz ZSgmZ2luc2hhcmVkLT5tdXRleCk7CisKKwkvKiBOb3RpZnkgbGVhZGVyICovCisJQ29uZGl0 aW9uVmFyaWFibGVTaWduYWwoJmdpbnNoYXJlZC0+d29ya2Vyc2RvbmVjdik7CisKKwl0dXBs ZXNvcnRfZW5kKHN0YXRlLT5ic19zb3J0c3RhdGUpOworfQorCisvKgorICogUGVyZm9ybSB3 b3JrIHdpdGhpbiBhIGxhdW5jaGVkIHBhcmFsbGVsIHByb2Nlc3MuCisgKi8KK3ZvaWQKK19n aW5fcGFyYWxsZWxfYnVpbGRfbWFpbihkc21fc2VnbWVudCAqc2VnLCBzaG1fdG9jICp0b2Mp Cit7CisJY2hhcgkgICAqc2hhcmVkcXVlcnk7CisJR2luU2hhcmVkICAqZ2luc2hhcmVkOwor CVNoYXJlZHNvcnQgKnNoYXJlZHNvcnQ7CisJR2luQnVpbGRTdGF0ZSBidWlsZHN0YXRlOwor CVJlbGF0aW9uCWhlYXBSZWw7CisJUmVsYXRpb24JaW5kZXhSZWw7CisJTE9DS01PREUJaGVh cExvY2ttb2RlOworCUxPQ0tNT0RFCWluZGV4TG9ja21vZGU7CisJV2FsVXNhZ2UgICAqd2Fs dXNhZ2U7CisJQnVmZmVyVXNhZ2UgKmJ1ZmZlcnVzYWdlOworCWludAkJCXNvcnRtZW07CisK KwkvKgorCSAqIFRoZSBvbmx5IHBvc3NpYmxlIHN0YXR1cyBmbGFnIHRoYXQgY2FuIGJlIHNl dCB0byB0aGUgcGFyYWxsZWwgd29ya2VyIGlzCisJICogUFJPQ19JTl9TQUZFX0lDLgorCSAq LworCUFzc2VydCgoTXlQcm9jLT5zdGF0dXNGbGFncyA9PSAwKSB8fAorCQkgICAoTXlQcm9j LT5zdGF0dXNGbGFncyA9PSBQUk9DX0lOX1NBRkVfSUMpKTsKKworCS8qIFNldCBkZWJ1Z19x dWVyeV9zdHJpbmcgZm9yIGluZGl2aWR1YWwgd29ya2VycyBmaXJzdCAqLworCXNoYXJlZHF1 ZXJ5ID0gc2htX3RvY19sb29rdXAodG9jLCBQQVJBTExFTF9LRVlfUVVFUllfVEVYVCwgdHJ1 ZSk7CisJZGVidWdfcXVlcnlfc3RyaW5nID0gc2hhcmVkcXVlcnk7CisKKwkvKiBSZXBvcnQg dGhlIHF1ZXJ5IHN0cmluZyBmcm9tIGxlYWRlciAqLworCXBnc3RhdF9yZXBvcnRfYWN0aXZp dHkoU1RBVEVfUlVOTklORywgZGVidWdfcXVlcnlfc3RyaW5nKTsKKworCS8qIExvb2sgdXAg Z2luIHNoYXJlZCBzdGF0ZSAqLworCWdpbnNoYXJlZCA9IHNobV90b2NfbG9va3VwKHRvYywg UEFSQUxMRUxfS0VZX0dJTl9TSEFSRUQsIGZhbHNlKTsKKworCS8qIE9wZW4gcmVsYXRpb25z IHVzaW5nIGxvY2sgbW9kZXMga25vd24gdG8gYmUgb2J0YWluZWQgYnkgaW5kZXguYyAqLwor CWlmICghZ2luc2hhcmVkLT5pc2NvbmN1cnJlbnQpCisJeworCQloZWFwTG9ja21vZGUgPSBT aGFyZUxvY2s7CisJCWluZGV4TG9ja21vZGUgPSBBY2Nlc3NFeGNsdXNpdmVMb2NrOworCX0K KwllbHNlCisJeworCQloZWFwTG9ja21vZGUgPSBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2s7 CisJCWluZGV4TG9ja21vZGUgPSBSb3dFeGNsdXNpdmVMb2NrOworCX0KKworCS8qIE9wZW4g cmVsYXRpb25zIHdpdGhpbiB3b3JrZXIgKi8KKwloZWFwUmVsID0gdGFibGVfb3BlbihnaW5z aGFyZWQtPmhlYXByZWxpZCwgaGVhcExvY2ttb2RlKTsKKwlpbmRleFJlbCA9IGluZGV4X29w ZW4oZ2luc2hhcmVkLT5pbmRleHJlbGlkLCBpbmRleExvY2ttb2RlKTsKKworCS8qIGluaXRp YWxpemUgdGhlIEdJTiBidWlsZCBzdGF0ZSAqLworCWluaXRHaW5TdGF0ZSgmYnVpbGRzdGF0 ZS5naW5zdGF0ZSwgaW5kZXhSZWwpOworCWJ1aWxkc3RhdGUuaW5kdHVwbGVzID0gMDsKKwlt ZW1zZXQoJmJ1aWxkc3RhdGUuYnVpbGRTdGF0cywgMCwgc2l6ZW9mKEdpblN0YXRzRGF0YSkp OworCisJLyoKKwkgKiBjcmVhdGUgYSB0ZW1wb3JhcnkgbWVtb3J5IGNvbnRleHQgdGhhdCBp cyB1c2VkIHRvIGhvbGQgZGF0YSBub3QgeWV0CisJICogZHVtcGVkIG91dCB0byB0aGUgaW5k ZXgKKwkgKi8KKwlidWlsZHN0YXRlLnRtcEN0eCA9IEFsbG9jU2V0Q29udGV4dENyZWF0ZShD dXJyZW50TWVtb3J5Q29udGV4dCwKKwkJCQkJCQkJCQkJICAiR2luIGJ1aWxkIHRlbXBvcmFy eSBjb250ZXh0IiwKKwkJCQkJCQkJCQkJICBBTExPQ1NFVF9ERUZBVUxUX1NJWkVTKTsKKwor CS8qCisJICogY3JlYXRlIGEgdGVtcG9yYXJ5IG1lbW9yeSBjb250ZXh0IHRoYXQgaXMgdXNl ZCBmb3IgY2FsbGluZworCSAqIGdpbkV4dHJhY3RFbnRyaWVzKCksIGFuZCBjYW4gYmUgcmVz ZXQgYWZ0ZXIgZWFjaCB0dXBsZQorCSAqLworCWJ1aWxkc3RhdGUuZnVuY0N0eCA9IEFsbG9j U2V0Q29udGV4dENyZWF0ZShDdXJyZW50TWVtb3J5Q29udGV4dCwKKwkJCQkJCQkJCQkJICAg IkdpbiBidWlsZCB0ZW1wb3JhcnkgY29udGV4dCBmb3IgdXNlci1kZWZpbmVkIGZ1bmN0aW9u IiwKKwkJCQkJCQkJCQkJICAgQUxMT0NTRVRfREVGQVVMVF9TSVpFUyk7CisKKwlidWlsZHN0 YXRlLmFjY3VtLmdpbnN0YXRlID0gJmJ1aWxkc3RhdGUuZ2luc3RhdGU7CisJZ2luSW5pdEJB KCZidWlsZHN0YXRlLmFjY3VtKTsKKworCisJLyogTG9vayB1cCBzaGFyZWQgc3RhdGUgcHJp dmF0ZSB0byB0dXBsZXNvcnQuYyAqLworCXNoYXJlZHNvcnQgPSBzaG1fdG9jX2xvb2t1cCh0 b2MsIFBBUkFMTEVMX0tFWV9UVVBMRVNPUlQsIGZhbHNlKTsKKwl0dXBsZXNvcnRfYXR0YWNo X3NoYXJlZChzaGFyZWRzb3J0LCBzZWcpOworCisJLyogUHJlcGFyZSB0byB0cmFjayBidWZm ZXIgdXNhZ2UgZHVyaW5nIHBhcmFsbGVsIGV4ZWN1dGlvbiAqLworCUluc3RyU3RhcnRQYXJh bGxlbFF1ZXJ5KCk7CisKKwkvKgorCSAqIE1pZ2h0IGFzIHdlbGwgdXNlIHJlbGlhYmxlIGZp Z3VyZSB3aGVuIGRvbGluZyBvdXQgbWFpbnRlbmFuY2Vfd29ya19tZW0KKwkgKiAod2hlbiBy ZXF1ZXN0ZWQgbnVtYmVyIG9mIHdvcmtlcnMgd2VyZSBub3QgbGF1bmNoZWQsIHRoaXMgd2ls bCBiZQorCSAqIHNvbWV3aGF0IGhpZ2hlciB0aGFuIGl0IGlzIGZvciBvdGhlciB3b3JrZXJz KS4KKwkgKi8KKwlzb3J0bWVtID0gbWFpbnRlbmFuY2Vfd29ya19tZW0gLyBnaW5zaGFyZWQt PnNjYW50dXBsZXNvcnRzdGF0ZXM7CisKKwlfZ2luX3BhcmFsbGVsX3NjYW5fYW5kX2J1aWxk KCZidWlsZHN0YXRlLCBnaW5zaGFyZWQsIHNoYXJlZHNvcnQsCisJCQkJCQkJCSBoZWFwUmVs LCBpbmRleFJlbCwgc29ydG1lbSwgZmFsc2UpOworCisJLyogUmVwb3J0IFdBTC9idWZmZXIg dXNhZ2UgZHVyaW5nIHBhcmFsbGVsIGV4ZWN1dGlvbiAqLworCWJ1ZmZlcnVzYWdlID0gc2ht X3RvY19sb29rdXAodG9jLCBQQVJBTExFTF9LRVlfQlVGRkVSX1VTQUdFLCBmYWxzZSk7CisJ d2FsdXNhZ2UgPSBzaG1fdG9jX2xvb2t1cCh0b2MsIFBBUkFMTEVMX0tFWV9XQUxfVVNBR0Us IGZhbHNlKTsKKwlJbnN0ckVuZFBhcmFsbGVsUXVlcnkoJmJ1ZmZlcnVzYWdlW1BhcmFsbGVs V29ya2VyTnVtYmVyXSwKKwkJCQkJCSAgJndhbHVzYWdlW1BhcmFsbGVsV29ya2VyTnVtYmVy XSk7CisKKwlpbmRleF9jbG9zZShpbmRleFJlbCwgaW5kZXhMb2NrbW9kZSk7CisJdGFibGVf Y2xvc2UoaGVhcFJlbCwgaGVhcExvY2ttb2RlKTsKK30KKworLyoKKyAqIF9naW5fYnVpbGRf dHVwbGUKKyAqCQlTZXJpYWxpemUgdGhlIHN0YXRlIGZvciBhbiBpbmRleCBrZXkgaW50byBh IHR1cGxlIGZvciB0dXBsZXNvcnQuCisgKgorICogVGhlIHR1cGxlIGhhcyBhIG51bWJlciBv ZiBzY2FsYXIgZmllbGRzIChtb3N0bHkgbWF0Y2hpbmcgdGhlIGJ1aWxkIHN0YXRlKSwKKyAq IGFuZCB0aGVuIGEgZGF0YSBhcnJheSB0aGF0IHN0b3JlcyB0aGUga2V5IGZpcnN0LCBhbmQg dGhlbiB0aGUgVElEIGxpc3QuCisgKgorICogRm9yIGJ5LXJlZmVyZW5jZSBkYXRhIHR5cGVz LCB3ZSBzdG9yZSB0aGUgYWN0dWFsIGRhdGEuIEZvciBieS12YWwgdHlwZXMKKyAqIHdlIHNp bXBseSBjb3B5IHRoZSB3aG9sZSBEYXR1bSwgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNh cmUgYWJvdXQgc3R1ZmYKKyAqIGxpa2UgZW5kaWFuZXNzIGV0Yy4gV2UgY291bGQgbWFrZSBp dCBhIGxpdHRsZSBiaXQgc21hbGxlciwgYnV0IGl0J3Mgbm90CisgKiB3b3J0aCBpdCAtIGl0 J3MgYSB0aW55IGZyYWN0aW9uIG9mIHRoZSBkYXRhLCBhbmQgd2UgbmVlZCB0byBNQVhBTElH TiB0aGUKKyAqIHN0YXJ0IG9mIHRoZSBUSUQgbGlzdCBhbnl3YXkuIFNvIHdlIHdvdWxkbid0 IHNhdmUgYW55dGhpbmcuCisgKi8KK3N0YXRpYyBHaW5UdXBsZSAqCitfZ2luX2J1aWxkX3R1 cGxlKE9mZnNldE51bWJlciBhdHRybnVtLCB1bnNpZ25lZCBjaGFyIGNhdGVnb3J5LAorCQkJ CSBEYXR1bSBrZXksIGludDE2IHR5cGxlbiwgYm9vbCB0eXBieXZhbCwKKwkJCQkgSXRlbVBv aW50ZXJEYXRhICppdGVtcywgdWludDMyIG5pdGVtcywKKwkJCQkgU2l6ZSAqbGVuKQorewor CUdpblR1cGxlICAgKnR1cGxlOworCWNoYXIJICAgKnB0cjsKKworCVNpemUJCXR1cGxlbjsK KwlpbnQJCQlrZXlsZW47CisKKwkvKgorCSAqIENhbGN1bGF0ZSBob3cgbG9uZyBpcyB0aGUg a2V5IHZhbHVlLiBPbmx5IGtleXMgd2l0aCBHSU5fQ0FUX05PUk1fS0VZCisJICogaGF2ZSBh Y3R1YWwgbm9uLWVtcHR5IGtleS4gV2UgaW5jbHVkZSB2YXJsZW5hIGhlYWRlcnMgYW5kIFww IGJ5dGVzIGZvcgorCSAqIHN0cmluZ3MsIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGFjY2VzcyB0 aGUgZGF0YSBpbi1saW5lLgorCSAqCisJICogRm9yIGJ5dmFsIHR5cGVzIHdlIHNpbXBseSBj b3B5IHRoZSB3aG9sZSBEYXR1bS4gV2UgY291bGQgc3RvcmUganVzdCB0aGUKKwkgKiBuZWNl c3NhcnkgYnl0ZXMsIGJ1dCB0aGlzIGlzIHNpbXBsZXIgdG8gd29yayB3aXRoIGFuZCBub3Qg d29ydGggdGhlCisJICogZXh0cmEgY29tcGxleGl0eS4gTW9yZW92ZXIgd2Ugc3RpbGwgbmVl ZCB0byBkbyB0aGUgTUFYQUxJR04gdG8gYWxsb3cKKwkgKiBkaXJlY3QgYWNjZXNzIHRvIGl0 ZW1zIHBvaW50ZXJzLgorCSAqLworCWlmIChjYXRlZ29yeSAhPSBHSU5fQ0FUX05PUk1fS0VZ KQorCQlrZXlsZW4gPSAwOworCWVsc2UgaWYgKHR5cGJ5dmFsKQorCQlrZXlsZW4gPSBzaXpl b2YoRGF0dW0pOworCWVsc2UgaWYgKHR5cGxlbiA+IDApCisJCWtleWxlbiA9IHR5cGxlbjsK KwllbHNlIGlmICh0eXBsZW4gPT0gLTEpCisJCWtleWxlbiA9IFZBUlNJWkVfQU5ZKGtleSk7 CisJZWxzZSBpZiAodHlwbGVuID09IC0yKQorCQlrZXlsZW4gPSBzdHJsZW4oRGF0dW1HZXRQ b2ludGVyKGtleSkpICsgMTsKKwllbHNlCisJCWVsb2coRVJST1IsICJpbnZhbGlkIHR5cGxl biIpOworCisJLyoKKwkgKiBEZXRlcm1pbmUgR0lOIHR1cGxlIGxlbmd0aCB3aXRoIGFsbCB0 aGUgZGF0YSBpbmNsdWRlZC4gQmUgY2FyZWZ1bCBhYm91dAorCSAqIGFsaWdubWVudCwgdG8g YWxsb3cgZGlyZWN0IGFjY2VzcyB0byBpdGVtIHBvaW50ZXJzLgorCSAqLworCXR1cGxlbiA9 IE1BWEFMSUdOKG9mZnNldG9mKEdpblR1cGxlLCBkYXRhKSArIGtleWxlbikgKworCQkoc2l6 ZW9mKEl0ZW1Qb2ludGVyRGF0YSkgKiBuaXRlbXMpOworCisJKmxlbiA9IHR1cGxlbjsKKwor CS8qCisJICogYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSB3aG9sZSBHSU4gdHVwbGUKKwkgKgor CSAqIFhYWCBwYWxsb2MwIHNvIHRoYXQgdmFsZ3JpbmQgZG9lcyBub3QgY29tcGxhaW4gYWJv dXQgdW5pbml0aWFsaXplZAorCSAqIGJ5dGVzIGluIHdyaXRldHVwX2luZGV4X2dpbiwgbGlr ZWx5IGJlY2F1c2Ugb2YgcGFkZGluZworCSAqLworCXR1cGxlID0gcGFsbG9jMCh0dXBsZW4p OworCisJdHVwbGUtPnR1cGxlbiA9IHR1cGxlbjsKKwl0dXBsZS0+YXR0cm51bSA9IGF0dHJu dW07CisJdHVwbGUtPmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisJdHVwbGUtPmtleWxlbiA9IGtl eWxlbjsKKwl0dXBsZS0+bml0ZW1zID0gbml0ZW1zOworCisJLyoga2V5IHR5cGUgaW5mbyAq LworCXR1cGxlLT50eXBsZW4gPSB0eXBsZW47CisJdHVwbGUtPnR5cGJ5dmFsID0gdHlwYnl2 YWw7CisKKwkvKgorCSAqIENvcHkgdGhlIGtleSBhbmQgaXRlbXMgaW50byB0aGUgdHVwbGUu IEZpcnN0IHRoZSBrZXkgdmFsdWUsIHdoaWNoIHdlCisJICogY2FuIHNpbXBseSBjb3B5IHJp Z2h0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgYXJyYXkuCisJICovCisJaWYgKGNh dGVnb3J5ID09IEdJTl9DQVRfTk9STV9LRVkpCisJeworCQlpZiAodHlwYnl2YWwpCisJCXsK KwkJCW1lbWNweSh0dXBsZS0+ZGF0YSwgJmtleSwgc2l6ZW9mKERhdHVtKSk7CisJCX0KKwkJ ZWxzZSBpZiAodHlwbGVuID4gMCkJLyogYnlyZWYsIGZpeGVkIGxlbmd0aCAqLworCQl7CisJ CQltZW1jcHkodHVwbGUtPmRhdGEsICZrZXksIHR5cGxlbik7CisJCX0KKwkJZWxzZSBpZiAo dHlwbGVuID09IC0xKQorCQl7CisJCQltZW1jcHkodHVwbGUtPmRhdGEsIERhdHVtR2V0UG9p bnRlcihrZXkpLCBrZXlsZW4pOworCQl9CisJCWVsc2UgaWYgKHR5cGxlbiA9PSAtMikKKwkJ eworCQkJbWVtY3B5KHR1cGxlLT5kYXRhLCBEYXR1bUdldFBvaW50ZXIoa2V5KSwga2V5bGVu KTsKKwkJfQorCX0KKworCS8qIGZpbmFsbHksIGNvcHkgdGhlIFRJRHMgaW50byB0aGUgYXJy YXkgKi8KKwlwdHIgPSAoY2hhciAqKSB0dXBsZSArIE1BWEFMSUdOKG9mZnNldG9mKEdpblR1 cGxlLCBkYXRhKSArIGtleWxlbik7CisKKwltZW1jcHkocHRyLCBpdGVtcywgc2l6ZW9mKEl0 ZW1Qb2ludGVyRGF0YSkgKiBuaXRlbXMpOworCisJcmV0dXJuIHR1cGxlOworfQorCisvKgor ICogX2dpbl9wYXJzZV90dXBsZQorICoJCURlc2VyaWFsaXplIHRoZSB0dXBsZSBmcm9tIHRo ZSB0dXBsZXN0b3JlIHJlcHJlc2VudGF0aW9uLgorICoKKyAqIE1vc3Qgb2YgdGhlIGZpZWxk cyBhcmUgYWN0dWFsbHkgZGlyZWN0bHkgYWNjZXNzaWJsZSwgdGhlIG9ubHkgdGhpbmcgdGhh dAorICogbmVlZHMgbW9yZSBjYXJlIGlzIHRoZSBrZXkgYW5kIHRoZSBUSUQgbGlzdC4KKyAq CisgKiBGb3IgdGhlIGtleSwgdGhpcyByZXR1cm5zIGEgcmVndWxhciBEYXR1bSByZXByZXNl bnRpbmcgaXQuIEl0J3MgZWl0aGVyIHRoZQorICogYWN0dWFsIGtleSB2YWx1ZSwgb3IgYSBw b2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgYXJyYXkgKHdoaWNoIGlzCisg KiB3aGVyZSB0aGUgZGF0YSB3YXMgY29waWVkIGJ5IF9naW5fYnVpbGRfdHVwbGUpLgorICoK KyAqIFRoZSBwb2ludGVyIHRvIHRoZSBUSUQgbGlzdCBpcyByZXR1cm5lZCB0aHJvdWdoICdp dGVtcycgKHdoaWNoIGlzIHNpbXBseQorICogYSBwb2ludGVyIHRvIHRoZSBkYXRhIGFycmF5 KS4KKyAqLworc3RhdGljIERhdHVtCitfZ2luX3BhcnNlX3R1cGxlKEdpblR1cGxlICphLCBJ dGVtUG9pbnRlckRhdGEgKippdGVtcykKK3sKKwlEYXR1bQkJa2V5OworCisJaWYgKGl0ZW1z KQorCXsKKwkJY2hhcgkgICAqcHRyID0gKGNoYXIgKikgYSArIE1BWEFMSUdOKG9mZnNldG9m KEdpblR1cGxlLCBkYXRhKSArIGEtPmtleWxlbik7CisKKwkJKml0ZW1zID0gKEl0ZW1Qb2lu dGVyRGF0YSAqKSBwdHI7CisJfQorCisJaWYgKGEtPmNhdGVnb3J5ICE9IEdJTl9DQVRfTk9S TV9LRVkpCisJCXJldHVybiAoRGF0dW0pIDA7CisKKwlpZiAoYS0+dHlwYnl2YWwgPiAwKQor CXsKKwkJbWVtY3B5KCZrZXksIGEtPmRhdGEsIGEtPmtleWxlbik7CisJCXJldHVybiBrZXk7 CisJfQorCisJcmV0dXJuIFBvaW50ZXJHZXREYXR1bShhLT5kYXRhKTsKK30KKworLyoKKyAq IF9naW5fY29tcGFyZV90dXBsZXMKKyAqCQlDb21wYXJlIEdJTiB0dXBsZXMsIHVzZWQgYnkg dHVwbGVzb3J0IGR1cmluZyBwYXJhbGxlbCBpbmRleCBidWlsZC4KKyAqCisgKiBUaGUgc2Nh bGFyIGZpZWxkcyAoYXR0cm51bSwgY2F0ZWdvcnkpIGFyZSBjb21wYXJlZCBmaXJzdCwgdGhl IGtleSB2YWx1ZSBpcworICogY29tcGFyZWQgbGFzdC4gVGhlIGNvbXBhcmlzb25zIGFyZSBk b25lIHNpbXBseSBieSAibWVtY21wIiwgYmFzZWQgb24gdGhlCisgKiBhc3N1bXB0aW9uIHRo YXQgaWYgd2UgZ2V0IHR3byBrZXlzIHRoYXQgYXJlIHR3byBkaWZmZXJlbnQgcmVwcmVzZW50 YXRpb25zCisgKiBvZiBhIGxvZ2ljYWxseSBlcXVhbCB2YWx1ZSwgaXQnbGwgZ2V0IG1lcmdl ZCBieSB0aGUgaW5kZXggYnVpbGQuCisgKgorICogRklYTUUgSXMgdGhlIGFzc3VtcHRpb24g d2UgY2FuIGp1c3QgbWVtY21wKCkgYWN0dWFsbHkgdmFsaWQ/IFdvbid0IHRoaXMKKyAqIHRy aWdnZXIgdGhlICJjb3VsZCBub3Qgc3BsaXQgR0lOIHBhZ2U7IGFsbCBvbGQgaXRlbXMgZGlk bid0IGZpdCIgZXJyb3IKKyAqIHdoZW4gdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgVElEIGxpc3Q/ CisgKi8KK2ludAorX2dpbl9jb21wYXJlX3R1cGxlcyhHaW5UdXBsZSAqYSwgR2luVHVwbGUg KmIpCit7CisJRGF0dW0JCWtleWEsCisJCQkJa2V5YjsKKworCWlmIChhLT5hdHRybnVtIDwg Yi0+YXR0cm51bSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGEtPmF0dHJudW0gPiBiLT5hdHRy bnVtKQorCQlyZXR1cm4gMTsKKworCWlmIChhLT5jYXRlZ29yeSA8IGItPmNhdGVnb3J5KQor CQlyZXR1cm4gLTE7CisKKwlpZiAoYS0+Y2F0ZWdvcnkgPiBiLT5jYXRlZ29yeSkKKwkJcmV0 dXJuIDE7CisKKwlpZiAoKGEtPmNhdGVnb3J5ID09IEdJTl9DQVRfTk9STV9LRVkpICYmCisJ CShiLT5jYXRlZ29yeSA9PSBHSU5fQ0FUX05PUk1fS0VZKSkKKwl7CisJCWtleWEgPSBfZ2lu X3BhcnNlX3R1cGxlKGEsIE5VTEwpOworCQlrZXliID0gX2dpbl9wYXJzZV90dXBsZShiLCBO VUxMKTsKKworCQlpZiAoYS0+dHlwbGVuID4gMCkKKwkJCXJldHVybiBtZW1jbXAoJmtleWEs ICZrZXliLCBhLT5rZXlsZW4pOworCisJCWlmIChhLT50eXBsZW4gPCAwKQorCQl7CisJCQlp ZiAoYS0+a2V5bGVuIDwgYi0+a2V5bGVuKQorCQkJCXJldHVybiAtMTsKKworCQkJaWYgKGEt PmtleWxlbiA+IGItPmtleWxlbikKKwkJCQlyZXR1cm4gMTsKKworCQkJcmV0dXJuIG1lbWNt cChEYXR1bUdldFBvaW50ZXIoa2V5YSksIERhdHVtR2V0UG9pbnRlcihrZXliKSwgYS0+a2V5 bGVuKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvYWNjZXNzL2dpbi9naW51dGlsLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbnV0 aWwuYwppbmRleCA1NzQ3YWU2YTRjYS4uZGQyMmI0NGFjYTkgMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL2FjY2Vzcy9naW4vZ2ludXRpbC5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9n aW4vZ2ludXRpbC5jCkBAIC01Myw3ICs1Myw3IEBAIGdpbmhhbmRsZXIoUEdfRlVOQ1RJT05f QVJHUykKIAlhbXJvdXRpbmUtPmFtY2x1c3RlcmFibGUgPSBmYWxzZTsKIAlhbXJvdXRpbmUt PmFtcHJlZGxvY2tzID0gdHJ1ZTsKIAlhbXJvdXRpbmUtPmFtY2FucGFyYWxsZWwgPSBmYWxz ZTsKLQlhbXJvdXRpbmUtPmFtY2FuYnVpbGRwYXJhbGxlbCA9IGZhbHNlOworCWFtcm91dGlu ZS0+YW1jYW5idWlsZHBhcmFsbGVsID0gdHJ1ZTsKIAlhbXJvdXRpbmUtPmFtY2FuaW5jbHVk ZSA9IGZhbHNlOwogCWFtcm91dGluZS0+YW11c2VtYWludGVuYW5jZXdvcmttZW0gPSB0cnVl OwogCWFtcm91dGluZS0+YW1zdW1tYXJpemluZyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vcGFyYWxsZWwuYyBiL3NyYy9iYWNrZW5kL2FjY2Vz cy90cmFuc2FtL3BhcmFsbGVsLmMKaW5kZXggODYxM2ZjNmZiNTQuLmM5ZWE3NjlhZmI1IDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9wYXJhbGxlbC5jCisrKyBi L3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3BhcmFsbGVsLmMKQEAgLTE1LDYgKzE1LDcg QEAKICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCiAjaW5jbHVkZSAiYWNjZXNzL2JyaW4uaCIK KyNpbmNsdWRlICJhY2Nlc3MvZ2luLmgiCiAjaW5jbHVkZSAiYWNjZXNzL25idHJlZS5oIgog I2luY2x1ZGUgImFjY2Vzcy9wYXJhbGxlbC5oIgogI2luY2x1ZGUgImFjY2Vzcy9zZXNzaW9u LmgiCkBAIC0xNDYsNiArMTQ3LDkgQEAgc3RhdGljIGNvbnN0IHN0cnVjdAogCXsKIAkJIl9i cmluX3BhcmFsbGVsX2J1aWxkX21haW4iLCBfYnJpbl9wYXJhbGxlbF9idWlsZF9tYWluCiAJ fSwKKwl7CisJCSJfZ2luX3BhcmFsbGVsX2J1aWxkX21haW4iLCBfZ2luX3BhcmFsbGVsX2J1 aWxkX21haW4KKwl9LAogCXsKIAkJInBhcmFsbGVsX3ZhY3V1bV9tYWluIiwgcGFyYWxsZWxf dmFjdXVtX21haW4KIAl9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9zb3J0L3R1 cGxlc29ydHZhcmlhbnRzLmMgYi9zcmMvYmFja2VuZC91dGlscy9zb3J0L3R1cGxlc29ydHZh cmlhbnRzLmMKaW5kZXggMDVhODUzY2FhMzYuLjU1Y2M1NTk2OWU1IDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC91dGlscy9zb3J0L3R1cGxlc29ydHZhcmlhbnRzLmMKKysrIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvc29ydC90dXBsZXNvcnR2YXJpYW50cy5jCkBAIC0yMCw2ICsyMCw3IEBA CiAjaW5jbHVkZSAicG9zdGdyZXMuaCIKIAogI2luY2x1ZGUgImFjY2Vzcy9icmluX3R1cGxl LmgiCisjaW5jbHVkZSAiYWNjZXNzL2dpbl90dXBsZS5oIgogI2luY2x1ZGUgImFjY2Vzcy9o YXNoLmgiCiAjaW5jbHVkZSAiYWNjZXNzL2h0dXBfZGV0YWlscy5oIgogI2luY2x1ZGUgImFj Y2Vzcy9uYnRyZWUuaCIKQEAgLTQ2LDYgKzQ3LDggQEAgc3RhdGljIHZvaWQgcmVtb3ZlYWJi cmV2X2luZGV4KFR1cGxlc29ydHN0YXRlICpzdGF0ZSwgU29ydFR1cGxlICpzdHVwcywKIAkJ CQkJCQkgICBpbnQgY291bnQpOwogc3RhdGljIHZvaWQgcmVtb3ZlYWJicmV2X2luZGV4X2Jy aW4oVHVwbGVzb3J0c3RhdGUgKnN0YXRlLCBTb3J0VHVwbGUgKnN0dXBzLAogCQkJCQkJCQkJ aW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIHJlbW92ZWFiYnJldl9pbmRleF9naW4oVHVwbGVz b3J0c3RhdGUgKnN0YXRlLCBTb3J0VHVwbGUgKnN0dXBzLAorCQkJCQkJCQkgICBpbnQgY291 bnQpOwogc3RhdGljIHZvaWQgcmVtb3ZlYWJicmV2X2RhdHVtKFR1cGxlc29ydHN0YXRlICpz dGF0ZSwgU29ydFR1cGxlICpzdHVwcywKIAkJCQkJCQkgICBpbnQgY291bnQpOwogc3RhdGlj IGludAljb21wYXJldHVwX2hlYXAoY29uc3QgU29ydFR1cGxlICphLCBjb25zdCBTb3J0VHVw bGUgKmIsCkBAIC03NCw2ICs3Nyw4IEBAIHN0YXRpYyBpbnQJY29tcGFyZXR1cF9pbmRleF9o YXNoX3RpZWJyZWFrKGNvbnN0IFNvcnRUdXBsZSAqYSwgY29uc3QgU29ydFR1cGxlICpiCiAJ CQkJCQkJCQkJICAgVHVwbGVzb3J0c3RhdGUgKnN0YXRlKTsKIHN0YXRpYyBpbnQJY29tcGFy ZXR1cF9pbmRleF9icmluKGNvbnN0IFNvcnRUdXBsZSAqYSwgY29uc3QgU29ydFR1cGxlICpi LAogCQkJCQkJCQkgIFR1cGxlc29ydHN0YXRlICpzdGF0ZSk7CitzdGF0aWMgaW50CWNvbXBh cmV0dXBfaW5kZXhfZ2luKGNvbnN0IFNvcnRUdXBsZSAqYSwgY29uc3QgU29ydFR1cGxlICpi LAorCQkJCQkJCQkgVHVwbGVzb3J0c3RhdGUgKnN0YXRlKTsKIHN0YXRpYyB2b2lkIHdyaXRl dHVwX2luZGV4KFR1cGxlc29ydHN0YXRlICpzdGF0ZSwgTG9naWNhbFRhcGUgKnRhcGUsCiAJ CQkJCQkgICBTb3J0VHVwbGUgKnN0dXApOwogc3RhdGljIHZvaWQgcmVhZHR1cF9pbmRleChU dXBsZXNvcnRzdGF0ZSAqc3RhdGUsIFNvcnRUdXBsZSAqc3R1cCwKQEAgLTgyLDYgKzg3LDEw IEBAIHN0YXRpYyB2b2lkIHdyaXRldHVwX2luZGV4X2JyaW4oVHVwbGVzb3J0c3RhdGUgKnN0 YXRlLCBMb2dpY2FsVGFwZSAqdGFwZSwKIAkJCQkJCQkJU29ydFR1cGxlICpzdHVwKTsKIHN0 YXRpYyB2b2lkIHJlYWR0dXBfaW5kZXhfYnJpbihUdXBsZXNvcnRzdGF0ZSAqc3RhdGUsIFNv cnRUdXBsZSAqc3R1cCwKIAkJCQkJCQkgICBMb2dpY2FsVGFwZSAqdGFwZSwgdW5zaWduZWQg aW50IGxlbik7CitzdGF0aWMgdm9pZCB3cml0ZXR1cF9pbmRleF9naW4oVHVwbGVzb3J0c3Rh dGUgKnN0YXRlLCBMb2dpY2FsVGFwZSAqdGFwZSwKKwkJCQkJCQkgICBTb3J0VHVwbGUgKnN0 dXApOworc3RhdGljIHZvaWQgcmVhZHR1cF9pbmRleF9naW4oVHVwbGVzb3J0c3RhdGUgKnN0 YXRlLCBTb3J0VHVwbGUgKnN0dXAsCisJCQkJCQkJICBMb2dpY2FsVGFwZSAqdGFwZSwgdW5z aWduZWQgaW50IGxlbik7CiBzdGF0aWMgaW50CWNvbXBhcmV0dXBfZGF0dW0oY29uc3QgU29y dFR1cGxlICphLCBjb25zdCBTb3J0VHVwbGUgKmIsCiAJCQkJCQkJIFR1cGxlc29ydHN0YXRl ICpzdGF0ZSk7CiBzdGF0aWMgaW50CWNvbXBhcmV0dXBfZGF0dW1fdGllYnJlYWsoY29uc3Qg U29ydFR1cGxlICphLCBjb25zdCBTb3J0VHVwbGUgKmIsCkBAIC01ODAsNiArNTg5LDM1IEBA IHR1cGxlc29ydF9iZWdpbl9pbmRleF9icmluKGludCB3b3JrTWVtLAogCXJldHVybiBzdGF0 ZTsKIH0KIAorCitUdXBsZXNvcnRzdGF0ZSAqCit0dXBsZXNvcnRfYmVnaW5faW5kZXhfZ2lu KGludCB3b3JrTWVtLCBTb3J0Q29vcmRpbmF0ZSBjb29yZGluYXRlLAorCQkJCQkJICBpbnQg c29ydG9wdCkKK3sKKwlUdXBsZXNvcnRzdGF0ZSAqc3RhdGUgPSB0dXBsZXNvcnRfYmVnaW5f Y29tbW9uKHdvcmtNZW0sIGNvb3JkaW5hdGUsCisJCQkJCQkJCQkJCQkgICBzb3J0b3B0KTsK KwlUdXBsZXNvcnRQdWJsaWMgKmJhc2UgPSBUdXBsZXNvcnRzdGF0ZUdldFB1YmxpYyhzdGF0 ZSk7CisKKyNpZmRlZiBUUkFDRV9TT1JUCisJaWYgKHRyYWNlX3NvcnQpCisJCWVsb2coTE9H LAorCQkJICJiZWdpbiBpbmRleCBzb3J0OiB3b3JrTWVtID0gJWQsIHJhbmRvbUFjY2VzcyA9 ICVjIiwKKwkJCSB3b3JrTWVtLAorCQkJIHNvcnRvcHQgJiBUVVBMRVNPUlRfUkFORE9NQUND RVNTID8gJ3QnIDogJ2YnKTsKKyNlbmRpZgorCisJYmFzZS0+bktleXMgPSAxOwkJCS8qIE9u bHkgdGhlIGluZGV4IGtleSAqLworCisJYmFzZS0+cmVtb3ZlYWJicmV2ID0gcmVtb3ZlYWJi cmV2X2luZGV4X2dpbjsKKwliYXNlLT5jb21wYXJldHVwID0gY29tcGFyZXR1cF9pbmRleF9n aW47CisJYmFzZS0+d3JpdGV0dXAgPSB3cml0ZXR1cF9pbmRleF9naW47CisJYmFzZS0+cmVh ZHR1cCA9IHJlYWR0dXBfaW5kZXhfZ2luOworCWJhc2UtPmhhdmVEYXR1bTEgPSBmYWxzZTsK KwliYXNlLT5hcmcgPSBOVUxMOworCisJcmV0dXJuIHN0YXRlOworfQorCiBUdXBsZXNvcnRz dGF0ZSAqCiB0dXBsZXNvcnRfYmVnaW5fZGF0dW0oT2lkIGRhdHVtVHlwZSwgT2lkIHNvcnRP cGVyYXRvciwgT2lkIHNvcnRDb2xsYXRpb24sCiAJCQkJCSAgYm9vbCBudWxsc0ZpcnN0Rmxh ZywgaW50IHdvcmtNZW0sCkBAIC04MTcsNiArODU1LDM3IEBAIHR1cGxlc29ydF9wdXRicmlu dHVwbGUoVHVwbGVzb3J0c3RhdGUgKnN0YXRlLCBCcmluVHVwbGUgKnR1cGxlLCBTaXplIHNp emUpCiAJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwogfQogCit2b2lkCit0 dXBsZXNvcnRfcHV0Z2ludHVwbGUoVHVwbGVzb3J0c3RhdGUgKnN0YXRlLCBHaW5UdXBsZSAq dHVwLCBTaXplIHNpemUpCit7CisJU29ydFR1cGxlCXN0dXA7CisJR2luVHVwbGUgICAqY3R1 cDsKKwlUdXBsZXNvcnRQdWJsaWMgKmJhc2UgPSBUdXBsZXNvcnRzdGF0ZUdldFB1YmxpYyhz dGF0ZSk7CisJTWVtb3J5Q29udGV4dCBvbGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRj aFRvKGJhc2UtPnR1cGxlY29udGV4dCk7CisJU2l6ZQkJdHVwbGVuOworCisJLyogY29weSB0 aGUgR2luVHVwbGUgaW50byB0aGUgcmlnaHQgbWVtb3J5IGNvbnRleHQgKi8KKwljdHVwID0g cGFsbG9jKHNpemUpOworCW1lbWNweShjdHVwLCB0dXAsIHNpemUpOworCisJc3R1cC50dXBs ZSA9IGN0dXA7CisJc3R1cC5kYXR1bTEgPSAoRGF0dW0pIDA7CisJc3R1cC5pc251bGwxID0g ZmFsc2U7CisKKwkvKiBHZXRNZW1vcnlDaHVua1NwYWNlIGlzIG5vdCBzdXBwb3J0ZWQgZm9y IGJ1bXAgY29udGV4dHMgKi8KKwlpZiAoVHVwbGVTb3J0VXNlQnVtcFR1cGxlQ3h0KGJhc2Ut PnNvcnRvcHQpKQorCQl0dXBsZW4gPSBNQVhBTElHTihzaXplKTsKKwllbHNlCisJCXR1cGxl biA9IEdldE1lbW9yeUNodW5rU3BhY2UoY3R1cCk7CisKKwl0dXBsZXNvcnRfcHV0dHVwbGVf Y29tbW9uKHN0YXRlLCAmc3R1cCwKKwkJCQkJCQkgIGJhc2UtPnNvcnRLZXlzICYmCisJCQkJ CQkJICBiYXNlLT5zb3J0S2V5cy0+YWJicmV2X2NvbnZlcnRlciAmJgorCQkJCQkJCSAgIXN0 dXAuaXNudWxsMSwgdHVwbGVuKTsKKworCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250 ZXh0KTsKK30KKwogLyoKICAqIEFjY2VwdCBvbmUgRGF0dW0gd2hpbGUgY29sbGVjdGluZyBp bnB1dCBkYXRhIGZvciBzb3J0LgogICoKQEAgLTk4OSw2ICsxMDU4LDI5IEBAIHR1cGxlc29y dF9nZXRicmludHVwbGUoVHVwbGVzb3J0c3RhdGUgKnN0YXRlLCBTaXplICpsZW4sIGJvb2wg Zm9yd2FyZCkKIAlyZXR1cm4gJmJ0dXAtPnR1cGxlOwogfQogCitHaW5UdXBsZSAqCit0dXBs ZXNvcnRfZ2V0Z2ludHVwbGUoVHVwbGVzb3J0c3RhdGUgKnN0YXRlLCBTaXplICpsZW4sIGJv b2wgZm9yd2FyZCkKK3sKKwlUdXBsZXNvcnRQdWJsaWMgKmJhc2UgPSBUdXBsZXNvcnRzdGF0 ZUdldFB1YmxpYyhzdGF0ZSk7CisJTWVtb3J5Q29udGV4dCBvbGRjb250ZXh0ID0gTWVtb3J5 Q29udGV4dFN3aXRjaFRvKGJhc2UtPnNvcnRjb250ZXh0KTsKKwlTb3J0VHVwbGUJc3R1cDsK KwlHaW5UdXBsZSAgICp0dXA7CisKKwlpZiAoIXR1cGxlc29ydF9nZXR0dXBsZV9jb21tb24o c3RhdGUsIGZvcndhcmQsICZzdHVwKSkKKwkJc3R1cC50dXBsZSA9IE5VTEw7CisKKwlNZW1v cnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CisKKwlpZiAoIXN0dXAudHVwbGUpCisJ CXJldHVybiBmYWxzZTsKKworCXR1cCA9IChHaW5UdXBsZSAqKSBzdHVwLnR1cGxlOworCisJ KmxlbiA9IHR1cC0+dHVwbGVuOworCisJcmV0dXJuIHR1cDsKK30KKwogLyoKICAqIEZldGNo IHRoZSBuZXh0IERhdHVtIGluIGVpdGhlciBmb3J3YXJkIG9yIGJhY2sgZGlyZWN0aW9uLgog ICogUmV0dXJucyBmYWxzZSBpZiBubyBtb3JlIGRhdHVtcy4KQEAgLTE3NzcsNiArMTg2OSw2 OCBAQCByZWFkdHVwX2luZGV4X2JyaW4oVHVwbGVzb3J0c3RhdGUgKnN0YXRlLCBTb3J0VHVw bGUgKnN0dXAsCiAJc3R1cC0+ZGF0dW0xID0gdHVwbGUtPnR1cGxlLmJ0X2Jsa25vOwogfQog CisKKy8qCisgKiBSb3V0aW5lcyBzcGVjaWFsaXplZCBmb3IgR0lOIGNhc2UKKyAqLworCitz dGF0aWMgdm9pZAorcmVtb3ZlYWJicmV2X2luZGV4X2dpbihUdXBsZXNvcnRzdGF0ZSAqc3Rh dGUsIFNvcnRUdXBsZSAqc3R1cHMsIGludCBjb3VudCkKK3sKKwlBc3NlcnQoZmFsc2UpOwor CWVsb2coRVJST1IsICJyZW1vdmVhYmJyZXZfaW5kZXhfZ2luIG5vdCBpbXBsZW1lbnRlZCIp OworfQorCitzdGF0aWMgaW50Citjb21wYXJldHVwX2luZGV4X2dpbihjb25zdCBTb3J0VHVw bGUgKmEsIGNvbnN0IFNvcnRUdXBsZSAqYiwKKwkJCQkJIFR1cGxlc29ydHN0YXRlICpzdGF0 ZSkKK3sKKwlBc3NlcnQoIVR1cGxlc29ydHN0YXRlR2V0UHVibGljKHN0YXRlKS0+aGF2ZURh dHVtMSk7CisKKwlyZXR1cm4gX2dpbl9jb21wYXJlX3R1cGxlcygoR2luVHVwbGUgKikgYS0+ dHVwbGUsCisJCQkJCQkJICAgKEdpblR1cGxlICopIGItPnR1cGxlKTsKK30KKworc3RhdGlj IHZvaWQKK3dyaXRldHVwX2luZGV4X2dpbihUdXBsZXNvcnRzdGF0ZSAqc3RhdGUsIExvZ2lj YWxUYXBlICp0YXBlLCBTb3J0VHVwbGUgKnN0dXApCit7CisJVHVwbGVzb3J0UHVibGljICpi YXNlID0gVHVwbGVzb3J0c3RhdGVHZXRQdWJsaWMoc3RhdGUpOworCUdpblR1cGxlICAgKnR1 cGxlID0gKEdpblR1cGxlICopIHN0dXAtPnR1cGxlOworCXVuc2lnbmVkIGludCB0dXBsZW4g PSB0dXBsZS0+dHVwbGVuOworCisJdHVwbGVuID0gdHVwbGVuICsgc2l6ZW9mKHR1cGxlbik7 CisJTG9naWNhbFRhcGVXcml0ZSh0YXBlLCAmdHVwbGVuLCBzaXplb2YodHVwbGVuKSk7CisJ TG9naWNhbFRhcGVXcml0ZSh0YXBlLCB0dXBsZSwgdHVwbGUtPnR1cGxlbik7CisJaWYgKGJh c2UtPnNvcnRvcHQgJiBUVVBMRVNPUlRfUkFORE9NQUNDRVNTKSAvKiBuZWVkIHRyYWlsaW5n IGxlbmd0aCB3b3JkPyAqLworCQlMb2dpY2FsVGFwZVdyaXRlKHRhcGUsICZ0dXBsZW4sIHNp emVvZih0dXBsZW4pKTsKK30KKworc3RhdGljIHZvaWQKK3JlYWR0dXBfaW5kZXhfZ2luKFR1 cGxlc29ydHN0YXRlICpzdGF0ZSwgU29ydFR1cGxlICpzdHVwLAorCQkJCSAgTG9naWNhbFRh cGUgKnRhcGUsIHVuc2lnbmVkIGludCBsZW4pCit7CisJR2luVHVwbGUgICAqdHVwbGU7CisJ VHVwbGVzb3J0UHVibGljICpiYXNlID0gVHVwbGVzb3J0c3RhdGVHZXRQdWJsaWMoc3RhdGUp OworCXVuc2lnbmVkIGludCB0dXBsZW4gPSBsZW4gLSBzaXplb2YodW5zaWduZWQgaW50KTsK KworCS8qCisJICogQWxsb2NhdGUgc3BhY2UgZm9yIHRoZSBHSU4gc29ydCB0dXBsZSwgd2hp Y2ggYWxyZWFkeSBoYXMgdGhlIHByb3BlcgorCSAqIGxlbmd0aCBpbmNsdWRlZCBpbiB0aGUg aGVhZGVyLgorCSAqLworCXR1cGxlID0gKEdpblR1cGxlICopIHR1cGxlc29ydF9yZWFkdHVw X2FsbG9jKHN0YXRlLCB0dXBsZW4pOworCisJdHVwbGUtPnR1cGxlbiA9IHR1cGxlbjsKKwor CUxvZ2ljYWxUYXBlUmVhZEV4YWN0KHRhcGUsIHR1cGxlLCB0dXBsZW4pOworCWlmIChiYXNl LT5zb3J0b3B0ICYgVFVQTEVTT1JUX1JBTkRPTUFDQ0VTUykgLyogbmVlZCB0cmFpbGluZyBs ZW5ndGggd29yZD8gKi8KKwkJTG9naWNhbFRhcGVSZWFkRXhhY3QodGFwZSwgJnR1cGxlbiwg c2l6ZW9mKHR1cGxlbikpOworCXN0dXAtPnR1cGxlID0gKHZvaWQgKikgdHVwbGU7CisKKwkv KiBubyBhYmJyZXZpYXRpb25zIChGSVhNRSBtYXliZSB1c2UgYXR0cm51bSBmb3IgdGhpcz8p ICovCisJc3R1cC0+ZGF0dW0xID0gKERhdHVtKSAwOworfQorCisKIC8qCiAgKiBSb3V0aW5l cyBzcGVjaWFsaXplZCBmb3IgRGF0dW1UdXBsZSBjYXNlCiAgKi8KZGlmZiAtLWdpdCBhL3Ny Yy9pbmNsdWRlL2FjY2Vzcy9naW4uaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9naW4uaAppbmRl eCAyNTk4M2I3YTUwNS4uYmU3NmQ4NDQ2ZjQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2Fj Y2Vzcy9naW4uaAorKysgYi9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2luLmgKQEAgLTEyLDYgKzEy LDggQEAKIAogI2luY2x1ZGUgImFjY2Vzcy94bG9ncmVhZGVyLmgiCiAjaW5jbHVkZSAibGli L3N0cmluZ2luZm8uaCIKKyNpbmNsdWRlICJub2Rlcy9leGVjbm9kZXMuaCIKKyNpbmNsdWRl ICJzdG9yYWdlL3NobV90b2MuaCIKICNpbmNsdWRlICJzdG9yYWdlL2Jsb2NrLmgiCiAjaW5j bHVkZSAidXRpbHMvcmVsY2FjaGUuaCIKIApAQCAtODgsNCArOTAsNiBAQCBleHRlcm4gdm9p ZCBnaW5HZXRTdGF0cyhSZWxhdGlvbiBpbmRleCwgR2luU3RhdHNEYXRhICpzdGF0cyk7CiBl eHRlcm4gdm9pZCBnaW5VcGRhdGVTdGF0cyhSZWxhdGlvbiBpbmRleCwgY29uc3QgR2luU3Rh dHNEYXRhICpzdGF0cywKIAkJCQkJCSAgIGJvb2wgaXNfYnVpbGQpOwogCitleHRlcm4gdm9p ZCBfZ2luX3BhcmFsbGVsX2J1aWxkX21haW4oZHNtX3NlZ21lbnQgKnNlZywgc2htX3RvYyAq dG9jKTsKKwogI2VuZGlmCQkJCQkJCS8qIEdJTl9IICovCmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9hY2Nlc3MvZ2luX3R1cGxlLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2luX3R1cGxl LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmI1MzA0YjczZmYx Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbl90dXBsZS5oCkBA IC0wLDAgKzEsMjggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGdpbi5oCisgKgkg IFB1YmxpYyBoZWFkZXIgZmlsZSBmb3IgR2VuZXJhbGl6ZWQgSW52ZXJ0ZWQgSW5kZXggYWNj ZXNzIG1ldGhvZC4KKyAqCisgKglDb3B5cmlnaHQgKGMpIDIwMDYtMjAyNCwgUG9zdGdyZVNR TCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqCisgKglzcmMvaW5jbHVkZS9hY2Nlc3Mv Z2luLmgKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2lmbmRlZiBHSU5fVFVQTEVf CisjZGVmaW5lIEdJTl9UVVBMRV8KKworCit0eXBlZGVmIHN0cnVjdCBHaW5UdXBsZQorewor CVNpemUJCXR1cGxlbjsJCQkvKiBsZW5ndGggb2YgdGhlIHdob2xlIHR1cGxlICovCisJU2l6 ZQkJa2V5bGVuOwkJCS8qIGJ5dGVzIGluIGRhdGEgZm9yIGtleSB2YWx1ZSAqLworCWludDE2 CQl0eXBsZW47CQkJLyogdHlwbGVuIGZvciBrZXkgKi8KKwlib29sCQl0eXBieXZhbDsJCS8q IHR5cGJ5dmFsIGZvciBrZXkgKi8KKwlPZmZzZXROdW1iZXIgYXR0cm51bTsKKwlzaWduZWQg Y2hhciBjYXRlZ29yeTsJCS8qIGNhdGVnb3J5OiBub3JtYWwgb3IgTlVMTD8gKi8KKwlpbnQJ CQluaXRlbXM7CQkJLyogbnVtYmVyIG9mIFRJRHMgaW4gdGhlIGRhdGEgKi8KKwljaGFyCQlk YXRhW0ZMRVhJQkxFX0FSUkFZX01FTUJFUl07Cit9IEdpblR1cGxlOworCitleHRlcm4gaW50 CV9naW5fY29tcGFyZV90dXBsZXMoR2luVHVwbGUgKmEsIEdpblR1cGxlICpiKTsKKworI2Vu ZGlmCQkJCQkJCS8qIEdJTl9UVVBMRV9IICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91 dGlscy90dXBsZXNvcnQuaCBiL3NyYy9pbmNsdWRlL3V0aWxzL3R1cGxlc29ydC5oCmluZGV4 IGU3OTQxYTFmMDlmLi4zNWZhNWFlMjQ0MiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRp bHMvdHVwbGVzb3J0LmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvdHVwbGVzb3J0LmgKQEAg LTIyLDYgKzIyLDcgQEAKICNkZWZpbmUgVFVQTEVTT1JUX0gKIAogI2luY2x1ZGUgImFjY2Vz cy9icmluX3R1cGxlLmgiCisjaW5jbHVkZSAiYWNjZXNzL2dpbl90dXBsZS5oIgogI2luY2x1 ZGUgImFjY2Vzcy9pdHVwLmgiCiAjaW5jbHVkZSAiZXhlY3V0b3IvdHVwdGFibGUuaCIKICNp bmNsdWRlICJzdG9yYWdlL2RzbS5oIgpAQCAtNDQzLDYgKzQ0NCw4IEBAIGV4dGVybiBUdXBs ZXNvcnRzdGF0ZSAqdHVwbGVzb3J0X2JlZ2luX2luZGV4X2dpc3QoUmVsYXRpb24gaGVhcFJl bCwKIAkJCQkJCQkJCQkJCSAgaW50IHNvcnRvcHQpOwogZXh0ZXJuIFR1cGxlc29ydHN0YXRl ICp0dXBsZXNvcnRfYmVnaW5faW5kZXhfYnJpbihpbnQgd29ya01lbSwgU29ydENvb3JkaW5h dGUgY29vcmRpbmF0ZSwKIAkJCQkJCQkJCQkJCSAgaW50IHNvcnRvcHQpOworZXh0ZXJuIFR1 cGxlc29ydHN0YXRlICp0dXBsZXNvcnRfYmVnaW5faW5kZXhfZ2luKGludCB3b3JrTWVtLCBT b3J0Q29vcmRpbmF0ZSBjb29yZGluYXRlLAorCQkJCQkJCQkJCQkJIGludCBzb3J0b3B0KTsK IGV4dGVybiBUdXBsZXNvcnRzdGF0ZSAqdHVwbGVzb3J0X2JlZ2luX2RhdHVtKE9pZCBkYXR1 bVR5cGUsCiAJCQkJCQkJCQkJCSBPaWQgc29ydE9wZXJhdG9yLCBPaWQgc29ydENvbGxhdGlv biwKIAkJCQkJCQkJCQkJIGJvb2wgbnVsbHNGaXJzdEZsYWcsCkBAIC00NTYsNiArNDU5LDcg QEAgZXh0ZXJuIHZvaWQgdHVwbGVzb3J0X3B1dGluZGV4dHVwbGV2YWx1ZXMoVHVwbGVzb3J0 c3RhdGUgKnN0YXRlLAogCQkJCQkJCQkJCSAgUmVsYXRpb24gcmVsLCBJdGVtUG9pbnRlciBz ZWxmLAogCQkJCQkJCQkJCSAgY29uc3QgRGF0dW0gKnZhbHVlcywgY29uc3QgYm9vbCAqaXNu dWxsKTsKIGV4dGVybiB2b2lkIHR1cGxlc29ydF9wdXRicmludHVwbGUoVHVwbGVzb3J0c3Rh dGUgKnN0YXRlLCBCcmluVHVwbGUgKnR1cCwgU2l6ZSBsZW4pOworZXh0ZXJuIHZvaWQgdHVw bGVzb3J0X3B1dGdpbnR1cGxlKFR1cGxlc29ydHN0YXRlICpzdGF0ZSwgR2luVHVwbGUgKnR1 cCwgU2l6ZSBsZW4pOwogZXh0ZXJuIHZvaWQgdHVwbGVzb3J0X3B1dGRhdHVtKFR1cGxlc29y dHN0YXRlICpzdGF0ZSwgRGF0dW0gdmFsLAogCQkJCQkJCSAgIGJvb2wgaXNOdWxsKTsKIApA QCAtNDY1LDYgKzQ2OSw4IEBAIGV4dGVybiBIZWFwVHVwbGUgdHVwbGVzb3J0X2dldGhlYXB0 dXBsZShUdXBsZXNvcnRzdGF0ZSAqc3RhdGUsIGJvb2wgZm9yd2FyZCk7CiBleHRlcm4gSW5k ZXhUdXBsZSB0dXBsZXNvcnRfZ2V0aW5kZXh0dXBsZShUdXBsZXNvcnRzdGF0ZSAqc3RhdGUs IGJvb2wgZm9yd2FyZCk7CiBleHRlcm4gQnJpblR1cGxlICp0dXBsZXNvcnRfZ2V0YnJpbnR1 cGxlKFR1cGxlc29ydHN0YXRlICpzdGF0ZSwgU2l6ZSAqbGVuLAogCQkJCQkJCQkJCSBib29s IGZvcndhcmQpOworZXh0ZXJuIEdpblR1cGxlICp0dXBsZXNvcnRfZ2V0Z2ludHVwbGUoVHVw bGVzb3J0c3RhdGUgKnN0YXRlLCBTaXplICpsZW4sCisJCQkJCQkJCQkgICBib29sIGZvcndh cmQpOwogZXh0ZXJuIGJvb2wgdHVwbGVzb3J0X2dldGRhdHVtKFR1cGxlc29ydHN0YXRlICpz dGF0ZSwgYm9vbCBmb3J3YXJkLCBib29sIGNvcHksCiAJCQkJCQkJICAgRGF0dW0gKnZhbCwg Ym9vbCAqaXNOdWxsLCBEYXR1bSAqYWJicmV2KTsKIApkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xz L3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMu bGlzdAppbmRleCBlMTBmZjI4ZWU1NC4uMGVlMWI5YWIxOWIgMTAwNjQ0Ci0tLSBhL3NyYy90 b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CisrKyBiL3NyYy90b29scy9wZ2luZGVudC90 eXBlZGVmcy5saXN0CkBAIC0xMDA0LDExICsxMDA0LDEzIEBAIEdpbkJ0cmVlRGF0YQogR2lu QnRyZWVEYXRhTGVhZkluc2VydERhdGEKIEdpbkJ0cmVlRW50cnlJbnNlcnREYXRhCiBHaW5C dHJlZVN0YWNrCitHaW5CdWZmZXIKIEdpbkJ1aWxkU3RhdGUKIEdpbkNoa1ZhbAogR2luRW50 cmllcwogR2luRW50cnlBY2N1bXVsYXRvcgogR2luSW5kZXhTdGF0CitHaW5MZWFkZXIKIEdp bk1ldGFQYWdlRGF0YQogR2luTnVsbENhdGVnb3J5CiBHaW5PcHRpb25zCkBAIC0xMDIxLDkg KzEwMjMsMTEgQEAgR2luU2NhbkVudHJ5CiBHaW5TY2FuS2V5CiBHaW5TY2FuT3BhcXVlCiBH aW5TY2FuT3BhcXVlRGF0YQorR2luU2hhcmVkCiBHaW5TdGF0ZQogR2luU3RhdHNEYXRhCiBH aW5UZXJuYXJ5VmFsdWUKK0dpblR1cGxlCiBHaW5UdXBsZUNvbGxlY3RvcgogR2luVmFjdXVt U3RhdGUKIEdpc3RCdWlsZE1vZGUKLS0gCjIuNDQuMAoK --------------5ATIJri30SzyV9JJnS7e1Mjr Content-Type: text/x-patch; charset=UTF-8; name="v20240502-0002-Use-mergesort-in-the-leader-process.patch" Content-Disposition: attachment; filename="v20240502-0002-Use-mergesort-in-the-leader-process.patch" Content-Transfer-Encoding: base64 RnJvbSBiYzUxYWE4ZmYxMGIwYTUzZjY1NTY0YWNlMmExNGRhNjcxMzYzMzQxIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzLnZvbmRyYUBwb3N0 Z3Jlc3FsLm9yZz4KRGF0ZTogVGh1LCAyIE1heSAyMDI0IDE1OjIxOjMyICswMjAwClN1Ympl Y3Q6IFtQQVRDSCB2MjAyNDA1MDIgMi84XSBVc2UgbWVyZ2Vzb3J0IGluIHRoZSBsZWFkZXIg cHJvY2VzcwoKVGhlIGxlYWRlciBwcm9jZXNzIChleGVjdXRpbmcgdGhlIHNlcmlhbCBwYXJ0 IG9mIHRoZSBpbmRleCBidWlsZCkgc3BlbnQKYSBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSB0 aW1lIGluIHBnX3Fzb3J0LCBhZnRlciBjb21iaW5pbmcgdGhlIHBhcnRpYWwKcmVzdWx0cyBm cm9tIHRoZSB3b3JrZXJzLiBCdXQgd2UgY2FuIGltcHJvdmUgdGhpcyBhbmQgbW92ZSBzb21l IG9mIHRoZQpjb3N0cyB0byB0aGUgcGFyYWxsZWwgcGFydCBpbiB3b3JrZXJzIC0gaWYgd29y a2VycyBwcm9kdWNlIHNvcnRlZCBUSUQKbGlzdHMsIHRoZSBsZWFkZXIgY2FuIGNvbWJpbmUg dGhlbSBieSBtZXJnZXNvcnQuCgpCdXQgdG8gbWFrZSB0aGlzIHJlYWxseSBlZmZpY2llbnQs IHRoZSBtZXJnZXNvcnQgbXVzdCBub3QgYmUgZXhlY3V0ZWQKdG9vIG1hbnkgdGltZXMuIFRo ZSB3b3JrZXJzIG1heSBlYXNpbHkgcHJvZHVjZSB2ZXJ5IHNob3J0IFRJRCBsaXN0cywgaWYK dGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IGtleXMsIGhpdHRpbmcgdGhlIG1lbW9yeSBsaW1p dCBvZnRlbi4gU28gdGhpcwphZGRzIGFuIGludGVybWVkaWF0ZSB0dXBsZXNvcnQgcGFzcyBp bnRvIGVhY2ggd29ya2VyLCB0byBjb21iaW5lIFRJRHMKZm9yIGVhY2gga2V5IGFuZCBvbmx5 IHRoZW4gd3JpdGUgdGhlIHJlc3VsdCBpbnRvIHRoZSBzaGFyZWQgdHVwbGVzdG9yZS4KClRo aXMgbWVhbnMgdGhlIG51bWJlciBvZiBtZXJnZXNvcnQgaW52b2NhdGlvbnMgZm9yIGVhY2gg a2V5IHNob3VsZCBiZQphYm91dCB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHdvcmtlcnMu IFdlIGNhbid0IHJlYWxseSBkbyBiZXR0ZXIsIGFuZAppdCdzIGxvdyBlbm91Z2ggdG8ga2Vl cCB0aGUgbWVyZ2Vzb3J0IGFwcHJvYWNoIGVmZmljaWVudC4KCk5vdGU6IElmIHdlIGludHJv ZHVjZSBhIG1lbW9yeSBsaW1pdCBvbiBHaW5CdWZmZXIgKHRvIG5vdCBhY2N1bXVsYXRlIHRv bwptYW55IFRJRHMgaW4gbWVtb3J5KSwgd2UgY291bGQgZW5kIHVwIHdpdGggbW9yZSBjaHVu a3MsIGJ1dCBpdCBzaG91bGQKbm90IGJlIHZlcnkgY29tbW9uLgotLS0KIHNyYy9iYWNrZW5k L2FjY2Vzcy9naW4vZ2luaW5zZXJ0LmMgfCAxNzEgKysrKysrKysrKysrKysrKysrKysrKysr Ky0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxNDggaW5zZXJ0aW9ucygrKSwgMjMgZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW5pbnNlcnQuYyBi L3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luaW5zZXJ0LmMKaW5kZXggNGQ2ZDE1MjQwM2Uu LjgwMTFlMGI1YWQ1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbmlu c2VydC5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luaW5zZXJ0LmMKQEAgLTE2 MSw2ICsxNjEsMTQgQEAgdHlwZWRlZiBzdHJ1Y3QKIAkgKiBidWlsZCBjYWxsYmFjayBldGMu CiAJICovCiAJVHVwbGVzb3J0c3RhdGUgKmJzX3NvcnRzdGF0ZTsKKworCS8qCisJICogVGhl IHNvcnRzdGF0ZSBpcyB1c2VkIG9ubHkgd2l0aGluIGEgd29ya2VyIGZvciB0aGUgZmlyc3Qg bWVyZ2UgcGFzcworCSAqIHRoYXQgaGFwcGVucyBpbiB0aGUgd29ya2VyLiBJbiBwcmluY2lw bGUgaXQgZG9lc24ndCBuZWVkIHRvIGJlIHBhcnQgb2YKKwkgKiB0aGUgYnVpbGQgc3RhdGUg YW5kIHdlIGNvdWxkIHBhc3MgaXQgYXJvdW5kIGRpcmVjdGx5LCBidXQgaXQncyBtb3JlCisJ ICogY29udmVuaWVudCB0aGlzIHdheS4KKwkgKi8KKwlUdXBsZXNvcnRzdGF0ZSAqYnNfd29y a2VyX3NvcnQ7CiB9IEdpbkJ1aWxkU3RhdGU7CiAKIApAQCAtNTMzLDcgKzU0MSw3IEBAIGdp bkJ1aWxkQ2FsbGJhY2tQYXJhbGxlbChSZWxhdGlvbiBpbmRleCwgSXRlbVBvaW50ZXIgdGlk LCBEYXR1bSAqdmFsdWVzLAogCQkJCQkJCQkgICBrZXksIGF0dHItPmF0dGxlbiwgYXR0ci0+ YXR0Ynl2YWwsCiAJCQkJCQkJCSAgIGxpc3QsIG5saXN0LCAmdHVwbGVuKTsKIAotCQkJdHVw bGVzb3J0X3B1dGdpbnR1cGxlKGJ1aWxkc3RhdGUtPmJzX3NvcnRzdGF0ZSwgdHVwLCB0dXBs ZW4pOworCQkJdHVwbGVzb3J0X3B1dGdpbnR1cGxlKGJ1aWxkc3RhdGUtPmJzX3dvcmtlcl9z b3J0LCB0dXAsIHR1cGxlbik7CiAKIAkJCXBmcmVlKHR1cCk7CiAJCX0KQEAgLTExMjcsNyAr MTEzNSw2IEBAIHR5cGVkZWYgc3RydWN0IEdpbkJ1ZmZlcgogCiAJLyogYXJyYXkgb2YgVElE IHZhbHVlcyAqLwogCWludAkJCW5pdGVtczsKLQlpbnQJCQltYXhpdGVtczsKIAlJdGVtUG9p bnRlckRhdGEgKml0ZW1zOwogfSBHaW5CdWZmZXI7CiAKQEAgLTExMzYsNyArMTE0Myw2IEBA IHN0YXRpYyB2b2lkCiBBc3NlcnRDaGVja0dpbkJ1ZmZlcihHaW5CdWZmZXIgKmJ1ZmZlcikK IHsKICNpZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCi0JQXNzZXJ0KGJ1ZmZlci0+bml0ZW1z IDw9IGJ1ZmZlci0+bWF4aXRlbXMpOwogI2VuZGlmCiB9CiAKQEAgLTEyNDAsMjggKzEyNDYs MjIgQEAgR2luQnVmZmVyU3RvcmVUdXBsZShHaW5CdWZmZXIgKmJ1ZmZlciwgR2luVHVwbGUg KnR1cCkKIAkJCWJ1ZmZlci0+a2V5ID0gKERhdHVtKSAwOwogCX0KIAotCS8qIGVubGFyZ2Ug dGhlIFRJRCBidWZmZXIsIGlmIG5lZWRlZCAqLwotCWlmIChidWZmZXItPm5pdGVtcyArIHR1 cC0+bml0ZW1zID4gYnVmZmVyLT5tYXhpdGVtcykKKwkvKiBjb3B5IHRoZSBuZXcgVElEcyBp bnRvIHRoZSBidWZmZXIsIGNvbWJpbmUgdXNpbmcgbWVyZ2Utc29ydCAqLwogCXsKLQkJLyog NjQgc2VlbXMgbGlrZSBhIGdvb2QgaW5pdCB2YWx1ZSAqLwotCQlidWZmZXItPm1heGl0ZW1z ID0gTWF4KGJ1ZmZlci0+bWF4aXRlbXMsIDY0KTsKKwkJaW50CQkJbm5ldzsKKwkJSXRlbVBv aW50ZXIgbmV3OwogCi0JCXdoaWxlIChidWZmZXItPm5pdGVtcyArIHR1cC0+bml0ZW1zID4g YnVmZmVyLT5tYXhpdGVtcykKLQkJCWJ1ZmZlci0+bWF4aXRlbXMgKj0gMjsKKwkJbmV3ID0g Z2luTWVyZ2VJdGVtUG9pbnRlcnMoYnVmZmVyLT5pdGVtcywgYnVmZmVyLT5uaXRlbXMsCisJ CQkJCQkJCSAgIGl0ZW1zLCB0dXAtPm5pdGVtcywgJm5uZXcpOwogCi0JCWlmIChidWZmZXIt Pml0ZW1zID09IE5VTEwpCi0JCQlidWZmZXItPml0ZW1zID0gcGFsbG9jKGJ1ZmZlci0+bWF4 aXRlbXMgKiBzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSk7Ci0JCWVsc2UKLQkJCWJ1ZmZlci0+ aXRlbXMgPSByZXBhbGxvYyhidWZmZXItPml0ZW1zLAotCQkJCQkJCQkJIGJ1ZmZlci0+bWF4 aXRlbXMgKiBzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSk7Ci0JfQorCQlBc3NlcnQobm5ldyA9 PSBidWZmZXItPm5pdGVtcyArIHR1cC0+bml0ZW1zKTsKIAotCS8qIG5vdyB3ZSBzaG91bGQg YmUgZ3VhcmFudGVlZCB0byBoYXZlIGVub3VnaCBzcGFjZSBmb3IgYWxsIHRoZSBUSURzICov Ci0JQXNzZXJ0KGJ1ZmZlci0+bml0ZW1zICsgdHVwLT5uaXRlbXMgPD0gYnVmZmVyLT5tYXhp dGVtcyk7CisJCWlmIChidWZmZXItPml0ZW1zKQorCQkJcGZyZWUoYnVmZmVyLT5pdGVtcyk7 CiAKLQkvKiBjb3B5IHRoZSBuZXcgVElEcyBpbnRvIHRoZSBidWZmZXIgKi8KLQltZW1jcHko JmJ1ZmZlci0+aXRlbXNbYnVmZmVyLT5uaXRlbXNdLCBpdGVtcywgc2l6ZW9mKEl0ZW1Qb2lu dGVyRGF0YSkgKiB0dXAtPm5pdGVtcyk7Ci0JYnVmZmVyLT5uaXRlbXMgKz0gdHVwLT5uaXRl bXM7CisJCWJ1ZmZlci0+aXRlbXMgPSBuZXc7CisJCWJ1ZmZlci0+bml0ZW1zID0gbm5ldzsK Kwl9CiAKIAlBc3NlcnRDaGVja0l0ZW1Qb2ludGVycyhidWZmZXItPml0ZW1zLCBidWZmZXIt Pm5pdGVtcywgZmFsc2UpOwogfQpAQCAtMTMwMiw2ICsxMzAyLDIxIEBAIEdpbkJ1ZmZlclJl c2V0KEdpbkJ1ZmZlciAqYnVmZmVyKQogCS8qIFhYWCBzaG91bGQgZG8gc29tZXRoaW5nIHdp dGggZXh0cmVtZWx5IGxhcmdlIGFycmF5IG9mIGl0ZW1zPyAqLwogfQogCisvKiBYWFggcHJv YmFibHkgd291bGQgYmUgYmV0dGVyIHRvIGhhdmUgYSBtZW1vcnkgY29udGV4dCBmb3IgdGhl IGJ1ZmZlciAqLworc3RhdGljIHZvaWQKK0dpbkJ1ZmZlckZyZWUoR2luQnVmZmVyICpidWZm ZXIpCit7CisJaWYgKGJ1ZmZlci0+aXRlbXMpCisJCXBmcmVlKGJ1ZmZlci0+aXRlbXMpOwor CisJLyogcmVsZWFzZSBieXJlZiB2YWx1ZXMsIGRvIG5vdGhpbmcgZm9yIGJ5LXZhbCBvbmVz ICovCisJaWYgKCFHaW5CdWZmZXJJc0VtcHR5KGJ1ZmZlcikgJiYKKwkJKGJ1ZmZlci0+Y2F0 ZWdvcnkgPT0gR0lOX0NBVF9OT1JNX0tFWSkgJiYgIWJ1ZmZlci0+dHlwYnl2YWwpCisJCXBm cmVlKERhdHVtR2V0UG9pbnRlcihidWZmZXItPmtleSkpOworCisJcGZyZWUoYnVmZmVyKTsK K30KKwogLyoKICAqIFhYWCBNYXliZSBjaGVjayBzaXplIG9mIHRoZSBUSUQgYXJyYXlzLCBh bmQgcmV0dXJuIGZhbHNlIGlmIGl0J3MgdG9vCiAgKiBsYXJnZSAobW9yZSB0aGFudCBtYWlu dGVuYW5jZV93b3JrX21lbSBvciBzb21ldGhpbmc/KS4KQEAgLTEzNzUsNyArMTM5MCw3IEBA IF9naW5fcGFyYWxsZWxfbWVyZ2UoR2luQnVpbGRTdGF0ZSAqc3RhdGUpCiAJCQkgKiB0aGUg ZGF0YSBpbnRvIHRoZSBpbnNlcnQsIGFuZCBzdGFydCBhIG5ldyBlbnRyeSBmb3IgY3VycmVu dAogCQkJICogR2luVHVwbGUuCiAJCQkgKi8KLQkJCUdpbkJ1ZmZlclNvcnRJdGVtcyhidWZm ZXIpOworCQkJQXNzZXJ0Q2hlY2tJdGVtUG9pbnRlcnMoYnVmZmVyLT5pdGVtcywgYnVmZmVy LT5uaXRlbXMsIHRydWUpOwogCiAJCQlnaW5FbnRyeUluc2VydCgmc3RhdGUtPmdpbnN0YXRl LAogCQkJCQkJICAgYnVmZmVyLT5hdHRudW0sIGJ1ZmZlci0+a2V5LCBidWZmZXItPmNhdGVn b3J5LApAQCAtMTM5Miw3ICsxNDA3LDcgQEAgX2dpbl9wYXJhbGxlbF9tZXJnZShHaW5CdWls ZFN0YXRlICpzdGF0ZSkKIAkvKiBmbHVzaCBkYXRhIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVy IChmb3IgdGhlIGxhc3Qga2V5KSAqLwogCWlmICghR2luQnVmZmVySXNFbXB0eShidWZmZXIp KQogCXsKLQkJR2luQnVmZmVyU29ydEl0ZW1zKGJ1ZmZlcik7CisJCUFzc2VydENoZWNrSXRl bVBvaW50ZXJzKGJ1ZmZlci0+aXRlbXMsIGJ1ZmZlci0+bml0ZW1zLCB0cnVlKTsKIAogCQln aW5FbnRyeUluc2VydCgmc3RhdGUtPmdpbnN0YXRlLAogCQkJCQkgICBidWZmZXItPmF0dG51 bSwgYnVmZmVyLT5rZXksIGJ1ZmZlci0+Y2F0ZWdvcnksCkBAIC0xNDAyLDYgKzE0MTcsOSBA QCBfZ2luX3BhcmFsbGVsX21lcmdlKEdpbkJ1aWxkU3RhdGUgKnN0YXRlKQogCQlHaW5CdWZm ZXJSZXNldChidWZmZXIpOwogCX0KIAorCS8qIHJlbGFzZSBhbGwgdGhlIG1lbW9yeSAqLwor CUdpbkJ1ZmZlckZyZWUoYnVmZmVyKTsKKwogCXR1cGxlc29ydF9lbmQoc3RhdGUtPmJzX3Nv cnRzdGF0ZSk7CiAKIAlyZXR1cm4gcmVsdHVwbGVzOwpAQCAtMTQ0MCw2ICsxNDU4LDEwMiBA QCBfZ2luX2xlYWRlcl9wYXJ0aWNpcGF0ZV9hc193b3JrZXIoR2luQnVpbGRTdGF0ZSAqYnVp bGRzdGF0ZSwgUmVsYXRpb24gaGVhcCwgUmVsYQogCQkJCQkJCQkgZ2lubGVhZGVyLT5zaGFy ZWRzb3J0LCBoZWFwLCBpbmRleCwgc29ydG1lbSwgdHJ1ZSk7CiB9CiAKKy8qCisgKiBfZ2lu X3Byb2Nlc3Nfd29ya2VyX2RhdGEKKyAqCQlGaXJzdCBwaGFzZSBvZiB0aGUga2V5IG1lcmdp bmcsIGhhcHBlbmluZyBpbiB0aGUgd29ya2VyLgorICoKKyAqIERlcGVuZGluZyBvbiB0aGUg bnVtYmVyIG9mIGRpc3RpbmN0IGtleXMsIHRoZSBUSUQgbGlzdHMgcHJvZHVjZWQgYnkgdGhl CisgKiBjYWxsYmFjayBtYXkgYmUgdmVyeSBzaG9ydC4gQnV0IGNvbWJpbmluZyBtYW55IHRp bnkgbGlzdHMgaXMgZXhwZW5zaXZlLAorICogc28gd2UgdHJ5IHRvIGRvIGFzIG11Y2ggYXMg cG9zc2libGUgaW4gdGhlIHdvcmtlcnMgYW5kIG9ubHkgdGhlbiBwYXNzIHRoZQorICogcmVz dWx0cyB0byB0aGUgbGVhZGVyLgorICoKKyAqIFdlIHJlYWQgdGhlIHR1cGxlcyBzb3J0ZWQg YnkgdGhlIGtleSwgYW5kIG1lcmdlIHRoZW0gaW50byBsYXJnZXIgbGlzdHMuCisgKiBBdCB0 aGUgbW9tZW50IHRoZXJlJ3Mgbm8gbWVtb3J5IGxpbWl0LCBzbyB0aGlzIHdpbGwganVzdCBw cm9kdWNlIG9uZQorICogaHVnZSAoc29ydGVkKSBsaXN0IHBlciBrZXkgaW4gZWFjaCB3b3Jr ZXIuIFdoaWNoIG1lYW5zIHRoZSBsZWFkZXIgd2lsbAorICogZG8gYSB2ZXJ5IGxpbWl0ZWQg bnVtYmVyIG9mIG1lcmdlc29ydHMsIHdoaWNoIGlzIGdvb2QuCisgKi8KK3N0YXRpYyB2b2lk CitfZ2luX3Byb2Nlc3Nfd29ya2VyX2RhdGEoR2luQnVpbGRTdGF0ZSAqc3RhdGUsIFR1cGxl c29ydHN0YXRlICp3b3JrZXJfc29ydCkKK3sKKwlHaW5UdXBsZSAgICp0dXA7CisJU2l6ZQkJ dHVwbGVuOworCisJR2luQnVmZmVyICAqYnVmZmVyOworCisJLyogaW5pdGlhbGl6ZSBidWZm ZXIgdG8gY29tYmluZSBlbnRyaWVzIGZvciB0aGUgc2FtZSBrZXkgKi8KKwlidWZmZXIgPSBH aW5CdWZmZXJJbml0KCk7CisKKwkvKiBzb3J0IHRoZSByYXcgcGVyLXdvcmtlciBkYXRhICov CisJdHVwbGVzb3J0X3BlcmZvcm1zb3J0KHN0YXRlLT5ic193b3JrZXJfc29ydCk7CisKKwkv KgorCSAqIFJlYWQgdGhlIEdJTiB0dXBsZXMgZnJvbSB0aGUgc2hhcmVkIHR1cGxlc29ydCwg c29ydGVkIGJ5IHRoZSBrZXksIGFuZAorCSAqIG1lcmdlIHRoZW0gaW50byBsYXJnZXIgY2h1 bmtzIGZvciB0aGUgbGVhZGVyIHRvIGNvbWJpbmUuCisJICovCisJd2hpbGUgKCh0dXAgPSB0 dXBsZXNvcnRfZ2V0Z2ludHVwbGUod29ya2VyX3NvcnQsICZ0dXBsZW4sIHRydWUpKSAhPSBO VUxMKQorCXsKKworCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOworCisJCS8qCisJCSAqIElm IHRoZSBidWZmZXIgY2FuIGFjY2VwdCB0aGUgbmV3IEdJTiB0dXBsZSwganVzdCBzdG9yZSBp dCB0aGVyZSBhbmQKKwkJICogd2UncmUgZG9uZS4gSWYgaXQncyBhIGRpZmZlcmVudCBrZXkg KG9yIG1heWJlIHRvbyBtdWNoIGRhdGEpIGZsdXNoCisJCSAqIHRoZSBjdXJyZW50IGNvbnRl bnRzIGludG8gdGhlIGluZGV4IGZpcnN0LgorCQkgKi8KKwkJaWYgKCFHaW5CdWZmZXJDYW5B ZGRLZXkoYnVmZmVyLCB0dXApKQorCQl7CisJCQlHaW5UdXBsZSAgICpudHVwOworCQkJU2l6 ZQkJbnR1cGxlbjsKKworCQkJLyoKKwkJCSAqIEJ1ZmZlciBpcyBub3QgZW1wdHkgYW5kIGl0 J3Mgc3RvcmluZyBhIGRpZmZlcmVudCBrZXkgLSBmbHVzaAorCQkJICogdGhlIGRhdGEgaW50 byB0aGUgaW5zZXJ0LCBhbmQgc3RhcnQgYSBuZXcgZW50cnkgZm9yIGN1cnJlbnQKKwkJCSAq IEdpblR1cGxlLgorCQkJICovCisJCQlHaW5CdWZmZXJTb3J0SXRlbXMoYnVmZmVyKTsKKwor CQkJbnR1cCA9IF9naW5fYnVpbGRfdHVwbGUoYnVmZmVyLT5hdHRudW0sIGJ1ZmZlci0+Y2F0 ZWdvcnksCisJCQkJCQkJCQlidWZmZXItPmtleSwgYnVmZmVyLT50eXBsZW4sIGJ1ZmZlci0+ dHlwYnl2YWwsCisJCQkJCQkJCQlidWZmZXItPml0ZW1zLCBidWZmZXItPm5pdGVtcywgJm50 dXBsZW4pOworCisJCQl0dXBsZXNvcnRfcHV0Z2ludHVwbGUoc3RhdGUtPmJzX3NvcnRzdGF0 ZSwgbnR1cCwgbnR1cGxlbik7CisKKwkJCXBmcmVlKG50dXApOworCisJCQkvKiBkaXNjYXJk IHRoZSBleGlzdGluZyBkYXRhICovCisJCQlHaW5CdWZmZXJSZXNldChidWZmZXIpOworCQl9 CisKKwkJLyogbm93IHJlbWVtYmVyIHRoZSBuZXcga2V5ICovCisJCUdpbkJ1ZmZlclN0b3Jl VHVwbGUoYnVmZmVyLCB0dXApOworCX0KKworCS8qIGZsdXNoIGRhdGEgcmVtYWluaW5nIGlu IHRoZSBidWZmZXIgKGZvciB0aGUgbGFzdCBrZXkpICovCisJaWYgKCFHaW5CdWZmZXJJc0Vt cHR5KGJ1ZmZlcikpCisJeworCQlHaW5UdXBsZSAgICpudHVwOworCQlTaXplCQludHVwbGVu OworCisJCUdpbkJ1ZmZlclNvcnRJdGVtcyhidWZmZXIpOworCisJCW50dXAgPSBfZ2luX2J1 aWxkX3R1cGxlKGJ1ZmZlci0+YXR0bnVtLCBidWZmZXItPmNhdGVnb3J5LAorCQkJCQkJCQli dWZmZXItPmtleSwgYnVmZmVyLT50eXBsZW4sIGJ1ZmZlci0+dHlwYnl2YWwsCisJCQkJCQkJ CWJ1ZmZlci0+aXRlbXMsIGJ1ZmZlci0+bml0ZW1zLCAmbnR1cGxlbik7CisKKwkJdHVwbGVz b3J0X3B1dGdpbnR1cGxlKHN0YXRlLT5ic19zb3J0c3RhdGUsIG50dXAsIG50dXBsZW4pOwor CisJCXBmcmVlKG50dXApOworCisJCS8qIGRpc2NhcmQgdGhlIGV4aXN0aW5nIGRhdGEgKi8K KwkJR2luQnVmZmVyUmVzZXQoYnVmZmVyKTsKKwl9CisKKwkvKiByZWxhc2UgYWxsIHRoZSBt ZW1vcnkgKi8KKwlHaW5CdWZmZXJGcmVlKGJ1ZmZlcik7CisKKwl0dXBsZXNvcnRfZW5kKHdv cmtlcl9zb3J0KTsKK30KKwogLyoKICAqIFBlcmZvcm0gYSB3b3JrZXIncyBwb3J0aW9uIG9m IGEgcGFyYWxsZWwgc29ydC4KICAqCkBAIC0xNDcxLDYgKzE1ODUsMTAgQEAgX2dpbl9wYXJh bGxlbF9zY2FuX2FuZF9idWlsZChHaW5CdWlsZFN0YXRlICpzdGF0ZSwKIAlzdGF0ZS0+YnNf c29ydHN0YXRlID0gdHVwbGVzb3J0X2JlZ2luX2luZGV4X2dpbihzb3J0bWVtLCBjb29yZGlu YXRlLAogCQkJCQkJCQkJCQkJCVRVUExFU09SVF9OT05FKTsKIAorCS8qIExvY2FsIHBlci13 b3JrZXIgc29ydCBvZiByYXctZGF0YSAqLworCXN0YXRlLT5ic193b3JrZXJfc29ydCA9IHR1 cGxlc29ydF9iZWdpbl9pbmRleF9naW4oc29ydG1lbSwgTlVMTCwKKwkJCQkJCQkJCQkJCQkg IFRVUExFU09SVF9OT05FKTsKKwogCS8qIEpvaW4gcGFyYWxsZWwgc2NhbiAqLwogCWluZGV4 SW5mbyA9IEJ1aWxkSW5kZXhJbmZvKGluZGV4KTsKIAlpbmRleEluZm8tPmlpX0NvbmN1cnJl bnQgPSBnaW5zaGFyZWQtPmlzY29uY3VycmVudDsKQEAgLTE1MDgsNyArMTYyNiw3IEBAIF9n aW5fcGFyYWxsZWxfc2Nhbl9hbmRfYnVpbGQoR2luQnVpbGRTdGF0ZSAqc3RhdGUsCiAJCQkJ CQkJCSAgIGtleSwgYXR0ci0+YXR0bGVuLCBhdHRyLT5hdHRieXZhbCwKIAkJCQkJCQkJICAg bGlzdCwgbmxpc3QsICZsZW4pOwogCi0JCQl0dXBsZXNvcnRfcHV0Z2ludHVwbGUoc3RhdGUt PmJzX3NvcnRzdGF0ZSwgdHVwLCBsZW4pOworCQkJdHVwbGVzb3J0X3B1dGdpbnR1cGxlKHN0 YXRlLT5ic193b3JrZXJfc29ydCwgdHVwLCBsZW4pOwogCiAJCQlwZnJlZSh0dXApOwogCQl9 CkBAIC0xNTE3LDYgKzE2MzUsMTMgQEAgX2dpbl9wYXJhbGxlbF9zY2FuX2FuZF9idWlsZChH aW5CdWlsZFN0YXRlICpzdGF0ZSwKIAkJZ2luSW5pdEJBKCZzdGF0ZS0+YWNjdW0pOwogCX0K IAorCS8qCisJICogRG8gdGhlIGZpcnN0IHBoYXNlIG9mIGluLXdvcmtlciBwcm9jZXNzaW5n IC0gc29ydCB0aGUgZGF0YSBwcm9kdWNlZCBieQorCSAqIHRoZSBjYWxsYmFjaywgYW5kIGNv bWJpbmUgdGhlbSBpbnRvIG11Y2ggbGFyZ2VyIGNodW5rcyBhbmQgcGxhY2UgdGhhdAorCSAq IGludG8gdGhlIHNoYXJlZCB0dXBsZXN0b3JlIGZvciBsZWFkZXIgdG8gcHJvY2Vzcy4KKwkg Ki8KKwlfZ2luX3Byb2Nlc3Nfd29ya2VyX2RhdGEoc3RhdGUsIHN0YXRlLT5ic193b3JrZXJf c29ydCk7CisKIAkvKiBzb3J0IHRoZSBHSU4gdHVwbGVzIGJ1aWx0IGJ5IHRoaXMgd29ya2Vy ICovCiAJdHVwbGVzb3J0X3BlcmZvcm1zb3J0KHN0YXRlLT5ic19zb3J0c3RhdGUpOwogCi0t IAoyLjQ0LjAKCg== --------------5ATIJri30SzyV9JJnS7e1Mjr Content-Type: text/x-patch; charset=UTF-8; name="v20240502-0003-Remove-the-explicit-pg_qsort-in-workers.patch" Content-Disposition: attachment; filename*0="v20240502-0003-Remove-the-explicit-pg_qsort-in-workers.patch" Content-Transfer-Encoding: base64 RnJvbSBjMWRhZmIwMjA5Y2UyMjVlOWU4MjVjMDdkZGNiMTQxNmNlMjQzNWZlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzLnZvbmRyYUBwb3N0 Z3Jlc3FsLm9yZz4KRGF0ZTogVGh1LCAyIE1heSAyMDI0IDE1OjIxOjM2ICswMjAwClN1Ympl Y3Q6IFtQQVRDSCB2MjAyNDA1MDIgMy84XSBSZW1vdmUgdGhlIGV4cGxpY2l0IHBnX3Fzb3J0 IGluIHdvcmtlcnMKCldlIGRvbid0IG5lZWQgdG8gZG8gdGhlIGV4cGxpY2l0IHNvcnQgYmVm b3JlIGJ1aWxkaW5nIHRoZSBHSU4gdHVwbGUsCmJlY2F1c2UgdGhlIG1lcmdlc29ydCBpbiBH aW5CdWZmZXJTdG9yZVR1cGxlIGlzIGFscmVhZHkgbWFpbnRhaW5pbmcgdGhlCmNvcnJlY3Qg b3JkZXIgKHRoaXMgd2FzIGFkZGVkIGluIGFuIGVhcmxpZXIgY29tbWl0KS4KClRoZSBjb21t ZW50IGFsc28gYWRkcyBhIGZpZWxkIHdpdGggdGhlIGZpcnN0IFRJRCwgYW5kIG1vZGlmaWVz IHRoZQpjb21wYXJhdG9yIHRvIHNvcnQgYnkgaXQgKGZvciBlYWNoIGtleSB2YWx1ZSkuIFRo aXMgaGVscHMgd29ya2VycyB0bwpidWlsZCBub24tb3ZlcmxhcHBpbmcgVElEIGxpc3RzIGFu ZCBzaW1wbHkgYXBwZW5kIHZhbHVlcyBpbnN0ZWFkIG9mCmhhdmluZyB0byBkbyB0aGUgYWN0 dWFsIG1lcmdlc29ydCB0byBjb21iaW5lIHRoZW0uIFRoaXMgaXMgYmVzdC1lZmZvcnQsCmku ZS4gaXQncyBub3QgZ3VhcmFudGVlZCB0byBlbGltaW5hdGUgdGhlIG1lcmdlc29ydCAtIGlu IHBhcnRpY3VsYXIsCnBhcmFsbGVsIHNjYW5zIGFyZSBzeW5jaHJvbml6ZWQsIGFuZCB0aHVz IG1heSBzdGFydCBzb21ld2hlcmUgaW4gdGhlCm1pZGRsZSBvZiB0aGUgdGFibGUsIGFuZCB3 cmFwIGFyb3VuZC4gSW4gd2hpY2ggY2FzZSB0aGVyZSBtYXkgYmUgdmVyeQp3aWRlIGxpc3Qg KHdpdGggbG93L2hpZ2ggVElEIHZhbHVlcykuCgpOb3RlOiBUaGVyZSdzIGFuIFhYWCBjb21t ZW50IHdpdGggYSBjb3VwbGUgaWRlYXMgb24gaG93IHRvIGltcHJvdmUgdGhpcywKYXQgdGhl IGNvc3Qgb2YgbW9yZSBjb21wbGV4aXR5LgotLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy9naW4v Z2luaW5zZXJ0LmMgfCAxMzAgKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0KIHNyYy9p bmNsdWRlL2FjY2Vzcy9naW5fdHVwbGUuaCAgICAgfCAgIDkgKy0KIDIgZmlsZXMgY2hhbmdl ZCwgMTA0IGluc2VydGlvbnMoKyksIDM1IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luaW5zZXJ0LmMgYi9zcmMvYmFja2VuZC9hY2Nlc3Mv Z2luL2dpbmluc2VydC5jCmluZGV4IDgwMTFlMGI1YWQ1Li41NzYyYzk1MjBkOCAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW5pbnNlcnQuYworKysgYi9zcmMvYmFj a2VuZC9hY2Nlc3MvZ2luL2dpbmluc2VydC5jCkBAIC0xMTEwLDEyICsxMTEwLDYgQEAgX2dp bl9wYXJhbGxlbF9oZWFwc2NhbihHaW5CdWlsZFN0YXRlICpzdGF0ZSkKIAlyZXR1cm4gc3Rh dGUtPmJzX3JlbHR1cGxlczsKIH0KIAotc3RhdGljIGludAotdGlkX2NtcChjb25zdCB2b2lk ICphLCBjb25zdCB2b2lkICpiKQotewotCXJldHVybiBJdGVtUG9pbnRlckNvbXBhcmUoKEl0 ZW1Qb2ludGVyKSBhLCAoSXRlbVBvaW50ZXIpIGIpOwotfQotCiAvKgogICogU3RhdGUgdXNl ZCB0byBjb21iaW5lIGFjY3VtdWxhdGUgVElEcyBmcm9tIG11bHRpcGxlIEdpblR1cGxlcyBm b3IgdGhlIHNhbWUKICAqIGtleSB2YWx1ZS4KQEAgLTExNDcsMTcgKzExNDEsMjEgQEAgQXNz ZXJ0Q2hlY2tHaW5CdWZmZXIoR2luQnVmZmVyICpidWZmZXIpCiB9CiAKIHN0YXRpYyB2b2lk Ci1Bc3NlcnRDaGVja0l0ZW1Qb2ludGVycyhJdGVtUG9pbnRlckRhdGEgKml0ZW1zLCBpbnQg bml0ZW1zLCBib29sIHNvcnRlZCkKK0Fzc2VydENoZWNrSXRlbVBvaW50ZXJzKEdpbkJ1ZmZl ciAqYnVmZmVyLCBib29sIHNvcnRlZCkKIHsKICNpZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5H Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBuaXRlbXM7IGkrKykKKwkvKiB3ZSBzaG91bGQgbm90 IGhhdmUgYSBidWZmZXIgd2l0aCBubyBUSURzIHRvIHNvcnQgKi8KKwlBc3NlcnQoYnVmZmVy LT5pdGVtcyAhPSBOVUxMKTsKKwlBc3NlcnQoYnVmZmVyLT5uaXRlbXMgPiAwKTsKKworCWZv ciAoaW50IGkgPSAwOyBpIDwgYnVmZmVyLT5uaXRlbXM7IGkrKykKIAl7Ci0JCUFzc2VydChJ dGVtUG9pbnRlcklzVmFsaWQoJml0ZW1zW2ldKSk7CisJCUFzc2VydChJdGVtUG9pbnRlcklz VmFsaWQoJmJ1ZmZlci0+aXRlbXNbaV0pKTsKIAogCQlpZiAoKGkgPT0gMCkgfHwgIXNvcnRl ZCkKIAkJCWNvbnRpbnVlOwogCi0JCUFzc2VydChJdGVtUG9pbnRlckNvbXBhcmUoJml0ZW1z W2kgLSAxXSwgJml0ZW1zW2ldKSA8IDApOworCQlBc3NlcnQoSXRlbVBvaW50ZXJDb21wYXJl KCZidWZmZXItPml0ZW1zW2kgLSAxXSwgJmJ1ZmZlci0+aXRlbXNbaV0pIDwgMCk7CiAJfQog I2VuZGlmCiB9CkBAIC0xMjIwLDYgKzEyMTgsNDUgQEAgR2luQnVmZmVyS2V5RXF1YWxzKEdp bkJ1ZmZlciAqYnVmZmVyLCBHaW5UdXBsZSAqdHVwKQogCXJldHVybiAobWVtY21wKHR1cC0+ ZGF0YSwgRGF0dW1HZXRQb2ludGVyKGJ1ZmZlci0+a2V5KSwgYnVmZmVyLT5rZXlsZW4pID09 IDApOwogfQogCisvKgorICogR2luQnVmZmVyU3RvcmVUdXBsZQorICoJCUFkZCBkYXRhIGZy b20gYSBHaW5UdXBsZSBpbnRvIHRoZSBHaW5CdWZmZXIuCisgKgorICogSWYgdGhlIGJ1ZmZl ciBpcyBlbXB0eSwgd2Ugc2ltcGx5IGluaXRpYWxpemUgaXQgd2l0aCBkYXRhIGZyb20gdGhl IHR1cGxlLgorICogT3RoZXJ3aXNlIGRhdGEgZnJvbSB0aGUgdHVwbGUgKHRoZSBUSUQgbGlz dCkgaXMgYWRkZWQgdG8gdGhlIFRJRCBkYXRhIGluCisgKiB0aGUgYnVmZmVyLCBlaXRoZXIg Ynkgc2ltcGx5IGFwcGVuZGluZyB0aGUgVElEcyBvciBkb2luZyBtZXJnZSBzb3J0LgorICoK KyAqIFRoZSBkYXRhIChmb3IgdGhlIHNhbWUga2V5KSBpcyBleHBlY3RlZCB0byBiZSBwcm9j ZXNzZWQgc29ydGVkIGJ5IGZpcnN0CisgKiBUSUQuIEJ1dCB0aGlzIGRvZXMgbm90IGd1YXJh bnRlZSB0aGUgbGlzdHMgZG8gbm90IG92ZXJsYXAsIGVzcGVjaWFsbHkgaW4KKyAqIHRoZSBs ZWFkZXIsIGJlY2F1c2UgdGhlIHdvcmtlcnMgcHJvY2VzcyBpbnRlcmxlYXZpbmcgZGF0YS4g QnV0IGV2ZW4gaW4KKyAqIGEgc2luZ2xlIHdvcmtlciwgbGlzdHMgY2FuIG92ZXJsYXAgLSBw YXJhbGxlbCBzY2FucyByZXF1aXJlIHN5bmMtc2NhbnMsCisgKiBhbmQgaWYgdGhlIHNjYW4g c3RhcnRzIHNvbWV3aGVyZSBpbiB0aGUgdGFibGUgYW5kIHRoZW4gd3JhcHMgYXJvdW5kLCBp dAorICogbWF5IGNvbnRhaW4gdmVyeSB3aWRlIGxpc3RzIChpbiB0ZXJtcyBvZiBUSUQgcmFu Z2UpLgorICoKKyAqIEJ1dCB0aGUgZ2luTWVyZ2VJdGVtUG9pbnRlcnMoKSBpcyBhbHJlYWR5 IHNtYXJ0IGFib3V0IGRldGVjdGluZyBjYXNlcworICogd2hlcmUgaXQgY2FuIHNpbXBseSBj b25jYXRlbmF0ZSB0aGUgbGlzdHMsIGFuZCB3aGVuIGZ1bGwgbWVyZ2Vzb3J0IGlzCisgKiBu ZWVkZWQuIEFuZCBkb2VzIHRoZSByaWdodCB0aGluZy4KKyAqCisgKiBCeSBrZWVwaW5nIHRo ZSBmaXJzdCBUSUQgaW4gdGhlIEdpblR1cGxlIGFuZCBzb3J0aW5nIGJ5IHRoYXQsIHdlIG1h a2UKKyAqIGl0IG1vcmUgbGlrZWx5IHRoZSBsaXN0cyB3b24ndCBvdmVybGFwIHZlcnkgb2Z0 ZW4uCisgKgorICogWFhYIEhvdyBmcmVxdWVudCBjYW4gdGhlIG92ZXJsYXBzIGJlPyBJZiB0 aGUgc2NhbiBkb2VzIG5vdCB3cmFwIGFyb3VuZCwKKyAqIHRoZXJlIHNob3VsZCBiZSBubyBv dmVybGFwcGluZyBsaXN0cywgYW5kIHRodXMgbm8gbWVyZ2Vzb3J0LiBBZnRlciBhYgorICog b3ZlcmxhcCwgdGhlcmUgcHJvYmFibHkgY2FuIGJlIG1hbnkgLSB0aGUgb25lIGxpc3Qgd2ls bCBiZSB2ZXJ5IHdpZGUsCisgKiB3aXRoIGEgdmVyeSBsb3cgYW5kIGhpZ2ggVElELCBhbmQg YWxsIG90aGVyIGxpc3RzIHdpbGwgb3ZlcmxhcCB3aXRoIGl0LgorICogSSdtIG5vdCBzdXJl IGhvdyBtdWNoIHdlIGNhbiBkbyB0byBwcmV2ZW50IHRoYXQsIHNob3J0IG9mIGRpc2FibGlu ZyBzeW5jCisgKiBzY2FucyAod2hpY2ggZm9yIHBhcmFsbGVsIHNjYW5zIGlzIGN1cnJlbnRs eSBub3QgcG9zc2libGUpLiBPbmUgb3B0aW9uCisgKiB3b3VsZCBiZSB0byBrZWVwIHR3byBs aXN0cyBvZiBUSURzLCBhbmQgc2VlIGlmIHRoZSBuZXcgbGlzdCBjYW4gYmUKKyAqIGNvbmNh dGVuYXRlZCB3aXRoIG9uZSBvZiB0aGVtLiBUaGUgaWRlYSBpcyB0aGF0IHRoZXJlJ3Mgb25s eSBvbmUgd2lkZQorICogbGlzdCAoYmVjYXVzZSB0aGUgd3JhcGFyb3VuZCBoYXBwZW5zIG9u bHkgb25jZSksIGFuZCB0aGVuIGRvIHRoZQorICogbWVyZ2Vzb3J0IG9ubHkgb25jZSBhdCB0 aGUgdmVyeSBlbmQuCisgKgorICogWFhYIEFsdGVybmF0aXZlbHksIHdlIGNvdWxkIHNpbXBs eSBkZXRlY3QgdGhlIGNhc2Ugd2hlbiB0aGUgbGlzdHMgY2FuJ3QKKyAqIGJlIGFwcGVuZGVk LCBhbmQgZmx1c2ggdGhlIGN1cnJlbnQgbGlzdCBvdXQuIFRoZSB3cmFwIGFyb3VuZCBoYXBw ZW5zIG9ubHkKKyAqIG9uY2UsIHNvIHRoZXJlJ3MgZ29pbmcgdG8gYmUgb25seSBzdWNoIHdp ZGUgbGlzdCwgYW5kIGl0J2xsIGJlIHNvcnRlZAorICogZmlyc3QgKGJlY2F1c2UgaXQgaGFz IHRoZSBsb3dlc3QgVElEIGZvciB0aGUga2V5KS4gU28gd2UnZCBkbyB0aGlzIGF0CisgKiBt b3N0IG9uY2UgcGVyIGtleS4KKyAqLwogc3RhdGljIHZvaWQKIEdpbkJ1ZmZlclN0b3JlVHVw bGUoR2luQnVmZmVyICpidWZmZXIsIEdpblR1cGxlICp0dXApCiB7CkBAIC0xMjQ2LDcgKzEy ODMsMTIgQEAgR2luQnVmZmVyU3RvcmVUdXBsZShHaW5CdWZmZXIgKmJ1ZmZlciwgR2luVHVw bGUgKnR1cCkKIAkJCWJ1ZmZlci0+a2V5ID0gKERhdHVtKSAwOwogCX0KIAotCS8qIGNvcHkg dGhlIG5ldyBUSURzIGludG8gdGhlIGJ1ZmZlciwgY29tYmluZSB1c2luZyBtZXJnZS1zb3J0 ICovCisJLyoKKwkgKiBDb3B5IHRoZSBuZXcgVElEcyBpbnRvIHRoZSBidWZmZXIsIGNvbWJp bmUgd2l0aCBleGlzdGluZyBkYXRhIChpZiBhbnkpCisJICogdXNpbmcgbWVyZ2Utc29ydC4g VGhlIG1lcmdlc29ydCBpcyBhbHJlYWR5IHNtYXJ0IGFib3V0IGNhc2VzIHdoZXJlIGl0CisJ ICogY2FuIHNpbXBseSBjb25jYXRlbmF0ZSB0aGUgdHdvIGxpc3RzLCBhbmQgd2hlbiBpdCBh Y3R1YWxseSBuZWVkcyB0bworCSAqIG1lcmdlIHRoZSBkYXRhIGluIGFuIGV4cGVuc2l2ZSB3 YXkuCisJICovCiAJewogCQlpbnQJCQlubmV3OwogCQlJdGVtUG9pbnRlciBuZXc7CkBAIC0x MjYxLDIxICsxMzAzLDkgQEAgR2luQnVmZmVyU3RvcmVUdXBsZShHaW5CdWZmZXIgKmJ1ZmZl ciwgR2luVHVwbGUgKnR1cCkKIAogCQlidWZmZXItPml0ZW1zID0gbmV3OwogCQlidWZmZXIt Pm5pdGVtcyA9IG5uZXc7Ci0JfQotCi0JQXNzZXJ0Q2hlY2tJdGVtUG9pbnRlcnMoYnVmZmVy LT5pdGVtcywgYnVmZmVyLT5uaXRlbXMsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQKLUdp bkJ1ZmZlclNvcnRJdGVtcyhHaW5CdWZmZXIgKmJ1ZmZlcikKLXsKLQkvKiB3ZSBzaG91bGQg bm90IGhhdmUgYSBidWZmZXIgd2l0aCBubyBUSURzIHRvIHNvcnQgKi8KLQlBc3NlcnQoYnVm ZmVyLT5pdGVtcyAhPSBOVUxMKTsKLQlBc3NlcnQoYnVmZmVyLT5uaXRlbXMgPiAwKTsKLQot CXBnX3Fzb3J0KGJ1ZmZlci0+aXRlbXMsIGJ1ZmZlci0+bml0ZW1zLCBzaXplb2YoSXRlbVBv aW50ZXJEYXRhKSwgdGlkX2NtcCk7CiAKLQlBc3NlcnRDaGVja0l0ZW1Qb2ludGVycyhidWZm ZXItPml0ZW1zLCBidWZmZXItPm5pdGVtcywgdHJ1ZSk7CisJCUFzc2VydENoZWNrSXRlbVBv aW50ZXJzKGJ1ZmZlciwgdHJ1ZSk7CisJfQogfQogCiAvKiBYWFggcHJvYmFibHkgd291bGQg YmUgYmV0dGVyIHRvIGhhdmUgYSBtZW1vcnkgY29udGV4dCBmb3IgdGhlIGJ1ZmZlciAqLwpA QCAtMTI5OSw2ICsxMzI5LDExIEBAIEdpbkJ1ZmZlclJlc2V0KEdpbkJ1ZmZlciAqYnVmZmVy KQogCWJ1ZmZlci0+dHlwbGVuID0gMDsKIAlidWZmZXItPnR5cGJ5dmFsID0gMDsKIAorCWlm IChidWZmZXItPml0ZW1zKQorCXsKKwkJcGZyZWUoYnVmZmVyLT5pdGVtcyk7CisJCWJ1ZmZl ci0+aXRlbXMgPSBOVUxMOworCX0KIAkvKiBYWFggc2hvdWxkIGRvIHNvbWV0aGluZyB3aXRo IGV4dHJlbWVseSBsYXJnZSBhcnJheSBvZiBpdGVtcz8gKi8KIH0KIApAQCAtMTM5MCw3ICsx NDI1LDcgQEAgX2dpbl9wYXJhbGxlbF9tZXJnZShHaW5CdWlsZFN0YXRlICpzdGF0ZSkKIAkJ CSAqIHRoZSBkYXRhIGludG8gdGhlIGluc2VydCwgYW5kIHN0YXJ0IGEgbmV3IGVudHJ5IGZv ciBjdXJyZW50CiAJCQkgKiBHaW5UdXBsZS4KIAkJCSAqLwotCQkJQXNzZXJ0Q2hlY2tJdGVt UG9pbnRlcnMoYnVmZmVyLT5pdGVtcywgYnVmZmVyLT5uaXRlbXMsIHRydWUpOworCQkJQXNz ZXJ0Q2hlY2tJdGVtUG9pbnRlcnMoYnVmZmVyLCB0cnVlKTsKIAogCQkJZ2luRW50cnlJbnNl cnQoJnN0YXRlLT5naW5zdGF0ZSwKIAkJCQkJCSAgIGJ1ZmZlci0+YXR0bnVtLCBidWZmZXIt PmtleSwgYnVmZmVyLT5jYXRlZ29yeSwKQEAgLTE0MDAsMTQgKzE0MzUsMTcgQEAgX2dpbl9w YXJhbGxlbF9tZXJnZShHaW5CdWlsZFN0YXRlICpzdGF0ZSkKIAkJCUdpbkJ1ZmZlclJlc2V0 KGJ1ZmZlcik7CiAJCX0KIAotCQkvKiBub3cgcmVtZW1iZXIgdGhlIG5ldyBrZXkgKi8KKwkJ LyoKKwkJICogUmVtZW1iZXIgZGF0YSBmb3IgdGhlIGN1cnJlbnQgdHVwbGUgKGVpdGhlciBy ZW1lbWJlciB0aGUgbmV3IGtleSwKKwkJICogb3IgYXBwZW5kIGlmIHRvIHRoZSBleGlzdGlu ZyBkYXRhKS4KKwkJICovCiAJCUdpbkJ1ZmZlclN0b3JlVHVwbGUoYnVmZmVyLCB0dXApOwog CX0KIAogCS8qIGZsdXNoIGRhdGEgcmVtYWluaW5nIGluIHRoZSBidWZmZXIgKGZvciB0aGUg bGFzdCBrZXkpICovCiAJaWYgKCFHaW5CdWZmZXJJc0VtcHR5KGJ1ZmZlcikpCiAJewotCQlB c3NlcnRDaGVja0l0ZW1Qb2ludGVycyhidWZmZXItPml0ZW1zLCBidWZmZXItPm5pdGVtcywg dHJ1ZSk7CisJCUFzc2VydENoZWNrSXRlbVBvaW50ZXJzKGJ1ZmZlciwgdHJ1ZSk7CiAKIAkJ Z2luRW50cnlJbnNlcnQoJnN0YXRlLT5naW5zdGF0ZSwKIAkJCQkJICAgYnVmZmVyLT5hdHRu dW0sIGJ1ZmZlci0+a2V5LCBidWZmZXItPmNhdGVnb3J5LApAQCAtMTUxMCw3ICsxNTQ4LDcg QEAgX2dpbl9wcm9jZXNzX3dvcmtlcl9kYXRhKEdpbkJ1aWxkU3RhdGUgKnN0YXRlLCBUdXBs ZXNvcnRzdGF0ZSAqd29ya2VyX3NvcnQpCiAJCQkgKiB0aGUgZGF0YSBpbnRvIHRoZSBpbnNl cnQsIGFuZCBzdGFydCBhIG5ldyBlbnRyeSBmb3IgY3VycmVudAogCQkJICogR2luVHVwbGUu CiAJCQkgKi8KLQkJCUdpbkJ1ZmZlclNvcnRJdGVtcyhidWZmZXIpOworCQkJQXNzZXJ0Q2hl Y2tJdGVtUG9pbnRlcnMoYnVmZmVyLCB0cnVlKTsKIAogCQkJbnR1cCA9IF9naW5fYnVpbGRf dHVwbGUoYnVmZmVyLT5hdHRudW0sIGJ1ZmZlci0+Y2F0ZWdvcnksCiAJCQkJCQkJCQlidWZm ZXItPmtleSwgYnVmZmVyLT50eXBsZW4sIGJ1ZmZlci0+dHlwYnl2YWwsCkBAIC0xNTI0LDcg KzE1NjIsMTAgQEAgX2dpbl9wcm9jZXNzX3dvcmtlcl9kYXRhKEdpbkJ1aWxkU3RhdGUgKnN0 YXRlLCBUdXBsZXNvcnRzdGF0ZSAqd29ya2VyX3NvcnQpCiAJCQlHaW5CdWZmZXJSZXNldChi dWZmZXIpOwogCQl9CiAKLQkJLyogbm93IHJlbWVtYmVyIHRoZSBuZXcga2V5ICovCisJCS8q CisJCSAqIFJlbWVtYmVyIGRhdGEgZm9yIHRoZSBjdXJyZW50IHR1cGxlIChlaXRoZXIgcmVt ZW1iZXIgdGhlIG5ldyBrZXksCisJCSAqIG9yIGFwcGVuZCBpZiB0byB0aGUgZXhpc3Rpbmcg ZGF0YSkuCisJCSAqLwogCQlHaW5CdWZmZXJTdG9yZVR1cGxlKGJ1ZmZlciwgdHVwKTsKIAl9 CiAKQEAgLTE1MzQsNyArMTU3NSw3IEBAIF9naW5fcHJvY2Vzc193b3JrZXJfZGF0YShHaW5C dWlsZFN0YXRlICpzdGF0ZSwgVHVwbGVzb3J0c3RhdGUgKndvcmtlcl9zb3J0KQogCQlHaW5U dXBsZSAgICpudHVwOwogCQlTaXplCQludHVwbGVuOwogCi0JCUdpbkJ1ZmZlclNvcnRJdGVt cyhidWZmZXIpOworCQlBc3NlcnRDaGVja0l0ZW1Qb2ludGVycyhidWZmZXIsIHRydWUpOwog CiAJCW50dXAgPSBfZ2luX2J1aWxkX3R1cGxlKGJ1ZmZlci0+YXR0bnVtLCBidWZmZXItPmNh dGVnb3J5LAogCQkJCQkJCQlidWZmZXItPmtleSwgYnVmZmVyLT50eXBsZW4sIGJ1ZmZlci0+ dHlwYnl2YWwsCkBAIC0xODM1LDYgKzE4NzYsNyBAQCBfZ2luX2J1aWxkX3R1cGxlKE9mZnNl dE51bWJlciBhdHRybnVtLCB1bnNpZ25lZCBjaGFyIGNhdGVnb3J5LAogCXR1cGxlLT5jYXRl Z29yeSA9IGNhdGVnb3J5OwogCXR1cGxlLT5rZXlsZW4gPSBrZXlsZW47CiAJdHVwbGUtPm5p dGVtcyA9IG5pdGVtczsKKwl0dXBsZS0+Zmlyc3QgPSBpdGVtc1swXTsKIAogCS8qIGtleSB0 eXBlIGluZm8gKi8KIAl0dXBsZS0+dHlwbGVuID0gdHlwbGVuOwpAQCAtMTkxOSw2ICsxOTYx LDEyIEBAIF9naW5fcGFyc2VfdHVwbGUoR2luVHVwbGUgKmEsIEl0ZW1Qb2ludGVyRGF0YSAq Kml0ZW1zKQogICogYXNzdW1wdGlvbiB0aGF0IGlmIHdlIGdldCB0d28ga2V5cyB0aGF0IGFy ZSB0d28gZGlmZmVyZW50IHJlcHJlc2VudGF0aW9ucwogICogb2YgYSBsb2dpY2FsbHkgZXF1 YWwgdmFsdWUsIGl0J2xsIGdldCBtZXJnZWQgYnkgdGhlIGluZGV4IGJ1aWxkLgogICoKKyAq IElmIHRoZSBrZXkgdmFsdWUgbWF0Y2hlcywgd2UgY29tcGFyZSB0aGUgZmlyc3QgVElEIHZh bHVlIGluIHRoZSBUSUQgbGlzdCwKKyAqIHdoaWNoIG1lYW5zIHRoZSB0dXBsZXMgYXJlIG1l cmdlZCBpbiBhbiBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBtb3N0CisgKiBsaWtlbHkgdG8g YmUgc2ltcGx5IGNvbmNhdGVuYXRlZC4gKFRoaXMgImZpcnN0IiBUSUQgd2lsbCBhbHNvIGFs bG93IHVzCisgKiB0byBkZXRlcm1pbmUgYSBwb2ludCB1cCB0byB3aGljaCB0aGUgbGlzdCBp cyBmdWxseSBkZXRlcm1pbmVkIGFuZCBjYW4gYmUKKyAqIHdyaXR0ZW4gaW50byB0aGUgaW5k ZXggdG8gZW5mb3JjZSBhIG1lbW9yeSBsaW1pdCBldGMuKQorICoKICAqIEZJWE1FIElzIHRo ZSBhc3N1bXB0aW9uIHdlIGNhbiBqdXN0IG1lbWNtcCgpIGFjdHVhbGx5IHZhbGlkPyBXb24n dCB0aGlzCiAgKiB0cmlnZ2VyIHRoZSAiY291bGQgbm90IHNwbGl0IEdJTiBwYWdlOyBhbGwg b2xkIGl0ZW1zIGRpZG4ndCBmaXQiIGVycm9yCiAgKiB3aGVuIHRyeWluZyB0byB1cGRhdGUg dGhlIFRJRCBsaXN0PwpAQCAtMTk0NywyMCArMTk5NSwzNCBAQCBfZ2luX2NvbXBhcmVfdHVw bGVzKEdpblR1cGxlICphLCBHaW5UdXBsZSAqYikKIAkJa2V5YSA9IF9naW5fcGFyc2VfdHVw bGUoYSwgTlVMTCk7CiAJCWtleWIgPSBfZ2luX3BhcnNlX3R1cGxlKGIsIE5VTEwpOwogCisJ CS8qCisJCSAqIHdvcmtzIGZvciBib3RoIGJ5dmFsIGFuZCBieXJlZiB0eXBlcyB3aXRoIGZp eGVkIGxlbmdodCwgYmVjYXVzZSBmb3IKKwkJICogYnl2YWwgd2Ugc2V0IGtleWxlbiB0byBz aXplb2YoRGF0dW0pCisJCSAqLwogCQlpZiAoYS0+dHlwbGVuID4gMCkKLQkJCXJldHVybiBt ZW1jbXAoJmtleWEsICZrZXliLCBhLT5rZXlsZW4pOworCQl7CisJCQlpbnQJCQlyID0gbWVt Y21wKCZrZXlhLCAma2V5YiwgYS0+a2V5bGVuKTsKKworCQkJLyogaWYgdGhlIGtleSBpcyB0 aGUgc2FtZSwgY29uc2lkZXIgdGhlIGZpcnN0IFRJRCBpbiB0aGUgYXJyYXkgKi8KKwkJCXJl dHVybiAociAhPSAwKSA/IHIgOiBJdGVtUG9pbnRlckNvbXBhcmUoJmEtPmZpcnN0LCAmYi0+ Zmlyc3QpOworCQl9CiAKIAkJaWYgKGEtPnR5cGxlbiA8IDApCiAJCXsKKwkJCWludAkJCXI7 CisKIAkJCWlmIChhLT5rZXlsZW4gPCBiLT5rZXlsZW4pCiAJCQkJcmV0dXJuIC0xOwogCiAJ CQlpZiAoYS0+a2V5bGVuID4gYi0+a2V5bGVuKQogCQkJCXJldHVybiAxOwogCi0JCQlyZXR1 cm4gbWVtY21wKERhdHVtR2V0UG9pbnRlcihrZXlhKSwgRGF0dW1HZXRQb2ludGVyKGtleWIp LCBhLT5rZXlsZW4pOworCQkJciA9IG1lbWNtcChEYXR1bUdldFBvaW50ZXIoa2V5YSksIERh dHVtR2V0UG9pbnRlcihrZXliKSwgYS0+a2V5bGVuKTsKKworCQkJLyogaWYgdGhlIGtleSBp cyB0aGUgc2FtZSwgY29uc2lkZXIgdGhlIGZpcnN0IFRJRCBpbiB0aGUgYXJyYXkgKi8KKwkJ CXJldHVybiAociAhPSAwKSA/IHIgOiBJdGVtUG9pbnRlckNvbXBhcmUoJmEtPmZpcnN0LCAm Yi0+Zmlyc3QpOwogCQl9CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIEl0ZW1Qb2ludGVy Q29tcGFyZSgmYS0+Zmlyc3QsICZiLT5maXJzdCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9hY2Nlc3MvZ2luX3R1cGxlLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2luX3R1cGxl LmgKaW5kZXggYjUzMDRiNzNmZjEuLmMzNjQxZWRkNWZjIDEwMDY0NAotLS0gYS9zcmMvaW5j bHVkZS9hY2Nlc3MvZ2luX3R1cGxlLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbl90 dXBsZS5oCkBAIC0xMCw3ICsxMCwxMyBAQAogI2lmbmRlZiBHSU5fVFVQTEVfCiAjZGVmaW5l IEdJTl9UVVBMRV8KIAotCisvKgorICogRWFjaCB3b3JrZXIgc2VlcyB0dXBsZXMgaW4gQ1RJ RCBvcmRlciwgc28gaWYgd2UgdHJhY2sgdGhlIGZpcnN0IFRJRCBhbmQKKyAqIGNvbXBhcmUg dGhhdCB3aGVuIGNvbWJpbmluZyByZXN1bHRzIGluIHRoZSB3b3JrZXIsIHdlIHdvdWxkIG5v dCBuZWVkIHRvCisgKiBkbyBhbiBleHBlbnNpdmUgc29ydCBpbiB3b3JrZXJzICh0aGUgbWVy Z2Vzb3J0IGlzIGFscmVhZHkgc21hcnQgYWJvdXQKKyAqIGRldGVjdGluZyB0aGlzIGFuZCBq dXN0IGNvbmNhdGVuYXRpbmcgdGhlIGxpc3RzKS4gV2UnZCBzdGlsbCBuZWVkIHRoZQorICog ZnVsbCBtZXJnZXNvcnQgaW4gdGhlIGxlYWRlciwgYnV0IHRoYXQncyBtdWNoIGNoZWFwZXIu CisgKi8KIHR5cGVkZWYgc3RydWN0IEdpblR1cGxlCiB7CiAJU2l6ZQkJdHVwbGVuOwkJCS8q IGxlbmd0aCBvZiB0aGUgd2hvbGUgdHVwbGUgKi8KQEAgLTE5LDYgKzI1LDcgQEAgdHlwZWRl ZiBzdHJ1Y3QgR2luVHVwbGUKIAlib29sCQl0eXBieXZhbDsJCS8qIHR5cGJ5dmFsIGZvciBr ZXkgKi8KIAlPZmZzZXROdW1iZXIgYXR0cm51bTsKIAlzaWduZWQgY2hhciBjYXRlZ29yeTsJ CS8qIGNhdGVnb3J5OiBub3JtYWwgb3IgTlVMTD8gKi8KKwlJdGVtUG9pbnRlckRhdGEgZmly c3Q7CQkvKiBmaXJzdCBUSUQgaW4gdGhlIGFycmF5ICovCiAJaW50CQkJbml0ZW1zOwkJCS8q IG51bWJlciBvZiBUSURzIGluIHRoZSBkYXRhICovCiAJY2hhcgkJZGF0YVtGTEVYSUJMRV9B UlJBWV9NRU1CRVJdOwogfSBHaW5UdXBsZTsKLS0gCjIuNDQuMAoK --------------5ATIJri30SzyV9JJnS7e1Mjr Content-Type: text/x-patch; charset=UTF-8; name="v20240502-0004-Compress-TID-lists-before-writing-tuples-t.patch" Content-Disposition: attachment; filename*0="v20240502-0004-Compress-TID-lists-before-writing-tuples-t.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA2ZTZmYzQ3MTk5ODUwYzU1MDY5YmYzODAwNzlmNjEwMjlmNWExYjY2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzLnZvbmRyYUBwb3N0 Z3Jlc3FsLm9yZz4KRGF0ZTogVGh1LCAyIE1heSAyMDI0IDE1OjIxOjM5ICswMjAwClN1Ympl Y3Q6IFtQQVRDSCB2MjAyNDA1MDIgNC84XSBDb21wcmVzcyBUSUQgbGlzdHMgYmVmb3JlIHdy aXRpbmcgdHVwbGVzIHRvCiBkaXNrCgpXaGVuIHNlcmlhbGl6aW5nIEdJTiB0dXBsZXMgdG8g dHVwbGVzb3J0cywgd2UgY2FuIHNpZ25pZmljYW50bHkgcmVkdWNlCnRoZSBhbW91bnQgb2Yg ZGF0YSBieSBjb21wcmVzc2luZyB0aGUgVElEIGxpc3RzLiBUaGUgR0lOIG9wY2xhc3NlcyBt YXkKcHJvZHVjZSBhIGxvdCBvZiBkYXRhIChkZXBlbmRpbmcgb24gaG93IG1hbnkga2V5cyBh cmUgZXh0cmFjdGVkIGZyb20KZWFjaCByb3cpLCBhbmQgdGhlIGNvbXByZXNzaW9uIGlzIHZl cnkgZWZmZWN0aXZlIGFuZCBlZmZpY2llbnQuCgpJZiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVu dCBrZXlzIGlzIGhpZ2gsIHRoZSBmaXJzdCB3b3JrZXIgcGFzcyBtYXkgbm90CmJlbmVmaXQg ZnJvbSB0aGUgY29tcHJlc3Npb24gdmVyeSBtdWNoIC0gdGhlIGRhdGEgd2lsbCBiZSBzcGls bGVkIHRvCmRpc2sgYmVmb3JlIHRoZSBUSUQgbGlzdHMgY2FuIGdyb3cgbG9uZyBlbm91Z2gg Zm9yIHRoZSBjb21wcmVzc2lvbiB0bwphY3R1YWx5IGhlbHAuIEluIHRoZSBzZWNvbmQgcGFz cyB0aGUgaW1wYWN0IGlzIG11Y2ggbW9yZSBzaWduaWZpY2FudC4KCkZvciByZWFsLXdvcmxk IGRhdGEgKGZ1bGwtdGV4dCBvbiBtYWlsaW5nIGxpc3QgYXJjaGl2ZXMpLCBJIHVzdWFsbHkg c2VlCnRoZSBjb21wcmVzc2lvbiB0byBzYXZlIG9ubHkgYWJvdXQgfjE1JSBpbiB0aGUgZmly c3QgcGFzcywgYnV0IH41MCUgb24KdGhlIHNlY29uZCBwYXNzLgotLS0KIHNyYy9iYWNrZW5k L2FjY2Vzcy9naW4vZ2luaW5zZXJ0LmMgfCAxMTYgKysrKysrKysrKysrKysrKysrKysrKyst LS0tLS0KIHNyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0ICAgfCAgIDEgKwogMiBm aWxlcyBjaGFuZ2VkLCA5NSBpbnNlcnRpb25zKCspLCAyMiBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbmluc2VydC5jIGIvc3JjL2JhY2tl bmQvYWNjZXNzL2dpbi9naW5pbnNlcnQuYwppbmRleCA1NzYyYzk1MjBkOC4uNjA3Y2U5YjM0 ZDYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luaW5zZXJ0LmMKKysr IGIvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW5pbnNlcnQuYwpAQCAtMTg3LDcgKzE4Nyw5 IEBAIHN0YXRpYyB2b2lkIF9naW5fcGFyYWxsZWxfc2Nhbl9hbmRfYnVpbGQoR2luQnVpbGRT dGF0ZSAqYnVpbGRzdGF0ZSwKIAkJCQkJCQkJCQkgUmVsYXRpb24gaGVhcCwgUmVsYXRpb24g aW5kZXgsCiAJCQkJCQkJCQkJIGludCBzb3J0bWVtLCBib29sIHByb2dyZXNzKTsKIAotc3Rh dGljIERhdHVtIF9naW5fcGFyc2VfdHVwbGUoR2luVHVwbGUgKmEsIEl0ZW1Qb2ludGVyRGF0 YSAqKml0ZW1zKTsKK3N0YXRpYyBJdGVtUG9pbnRlciBfZ2luX3BhcnNlX3R1cGxlX2l0ZW1z KEdpblR1cGxlICphKTsKK3N0YXRpYyBEYXR1bSBfZ2luX3BhcnNlX3R1cGxlX2tleShHaW5U dXBsZSAqYSk7CisKIHN0YXRpYyBHaW5UdXBsZSAqX2dpbl9idWlsZF90dXBsZShPZmZzZXRO dW1iZXIgYXR0cm51bSwgdW5zaWduZWQgY2hhciBjYXRlZ29yeSwKIAkJCQkJCQkJICBEYXR1 bSBrZXksIGludDE2IHR5cGxlbiwgYm9vbCB0eXBieXZhbCwKIAkJCQkJCQkJICBJdGVtUG9p bnRlckRhdGEgKml0ZW1zLCB1aW50MzIgbml0ZW1zLApAQCAtMTI2NSw3ICsxMjY3LDggQEAg R2luQnVmZmVyU3RvcmVUdXBsZShHaW5CdWZmZXIgKmJ1ZmZlciwgR2luVHVwbGUgKnR1cCkK IAogCUFzc2VydENoZWNrR2luQnVmZmVyKGJ1ZmZlcik7CiAKLQlrZXkgPSBfZ2luX3BhcnNl X3R1cGxlKHR1cCwgJml0ZW1zKTsKKwlrZXkgPSBfZ2luX3BhcnNlX3R1cGxlX2tleSh0dXAp OworCWl0ZW1zID0gX2dpbl9wYXJzZV90dXBsZV9pdGVtcyh0dXApOwogCiAJLyogaWYgdGhl IGJ1ZmZlciBpcyBlbXB0eSwgc2V0IHRoZSBmaWVsZHMgKGFuZCBjb3B5IHRoZSBrZXkpICov CiAJaWYgKEdpbkJ1ZmZlcklzRW1wdHkoYnVmZmVyKSkKQEAgLTEzMDYsNiArMTMwOSw5IEBA IEdpbkJ1ZmZlclN0b3JlVHVwbGUoR2luQnVmZmVyICpidWZmZXIsIEdpblR1cGxlICp0dXAp CiAKIAkJQXNzZXJ0Q2hlY2tJdGVtUG9pbnRlcnMoYnVmZmVyLCB0cnVlKTsKIAl9CisKKwkv KiBmcmVlIHRoZSBkZWNvbXByZXNzZWQgVElEIGxpc3QgKi8KKwlwZnJlZShpdGVtcyk7CiB9 CiAKIC8qIFhYWCBwcm9iYWJseSB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBhIG1lbW9yeSBj b250ZXh0IGZvciB0aGUgYnVmZmVyICovCkBAIC0xODA2LDYgKzE4MTIsMTUgQEAgX2dpbl9w YXJhbGxlbF9idWlsZF9tYWluKGRzbV9zZWdtZW50ICpzZWcsIHNobV90b2MgKnRvYykKIAl0 YWJsZV9jbG9zZShoZWFwUmVsLCBoZWFwTG9ja21vZGUpOwogfQogCisvKgorICogVXNlZCB0 byBrZWVwIHRyYWNrIG9mIGNvbXByZXNzZWQgVElEIGxpc3RzIHdoZW4gYnVpbGRpbmcgYSBH SU4gdHVwbGUuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisJZGxpc3Rfbm9kZQlub2RlOwkJ CS8qIGxpbmtlZCBsaXN0IHBvaW50ZXJzICovCisJR2luUG9zdGluZ0xpc3QgKnNlZzsKK30g R2luU2VnbWVudEluZm87CisKIC8qCiAgKiBfZ2luX2J1aWxkX3R1cGxlCiAgKgkJU2VyaWFs aXplIHRoZSBzdGF0ZSBmb3IgYW4gaW5kZXgga2V5IGludG8gYSB0dXBsZSBmb3IgdHVwbGVz b3J0LgpAQCAtMTgxOCw2ICsxODMzLDExIEBAIF9naW5fcGFyYWxsZWxfYnVpbGRfbWFpbihk c21fc2VnbWVudCAqc2VnLCBzaG1fdG9jICp0b2MpCiAgKiBsaWtlIGVuZGlhbmVzcyBldGMu IFdlIGNvdWxkIG1ha2UgaXQgYSBsaXR0bGUgYml0IHNtYWxsZXIsIGJ1dCBpdCdzIG5vdAog ICogd29ydGggaXQgLSBpdCdzIGEgdGlueSBmcmFjdGlvbiBvZiB0aGUgZGF0YSwgYW5kIHdl IG5lZWQgdG8gTUFYQUxJR04gdGhlCiAgKiBzdGFydCBvZiB0aGUgVElEIGxpc3QgYW55d2F5 LiBTbyB3ZSB3b3VsZG4ndCBzYXZlIGFueXRoaW5nLgorICoKKyAqIFRoZSBUSUQgbGlzdCBp cyBzZXJpYWxpemVkIGFzIGNvbXByZXNzZWQgLSBpdCdzIGhpZ2hseSBjb21wcmVzc2libGUs IGFuZAorICogd2UgYWxyZWFkeSBoYXZlIGdpbkNvbXByZXNzUG9zdGluZ0xpc3QgZm9yIHRo aXMgcHVycG9zZS4gVGhlIGxpc3QgbWF5IGJlCisgKiBwcmV0dHkgbG9uZywgc28gd2UgY29t cHJlc3MgaXQgaW50byBtdWx0aXBsZSBzZWdtZW50cyBhbmQgdGhlbiBjb3B5IGFsbAorICog b2YgdGhhdCBpbnRvIHRoZSBHSU4gdHVwbGUuCiAgKi8KIHN0YXRpYyBHaW5UdXBsZSAqCiBf Z2luX2J1aWxkX3R1cGxlKE9mZnNldE51bWJlciBhdHRybnVtLCB1bnNpZ25lZCBjaGFyIGNh dGVnb3J5LApAQCAtMTgzMSw2ICsxODUxLDExIEBAIF9naW5fYnVpbGRfdHVwbGUoT2Zmc2V0 TnVtYmVyIGF0dHJudW0sIHVuc2lnbmVkIGNoYXIgY2F0ZWdvcnksCiAJU2l6ZQkJdHVwbGVu OwogCWludAkJCWtleWxlbjsKIAorCWRsaXN0X211dGFibGVfaXRlciBpdGVyOworCWRsaXN0 X2hlYWQJc2VnbWVudHM7CisJaW50CQkJbmNvbXByZXNzZWQ7CisJU2l6ZQkJY29tcHJlc3Ns ZW47CisKIAkvKgogCSAqIENhbGN1bGF0ZSBob3cgbG9uZyBpcyB0aGUga2V5IHZhbHVlLiBP bmx5IGtleXMgd2l0aCBHSU5fQ0FUX05PUk1fS0VZCiAJICogaGF2ZSBhY3R1YWwgbm9uLWVt cHR5IGtleS4gV2UgaW5jbHVkZSB2YXJsZW5hIGhlYWRlcnMgYW5kIFwwIGJ5dGVzIGZvcgpA QCAtMTg1NCwxMiArMTg3OSwzNCBAQCBfZ2luX2J1aWxkX3R1cGxlKE9mZnNldE51bWJlciBh dHRybnVtLCB1bnNpZ25lZCBjaGFyIGNhdGVnb3J5LAogCWVsc2UKIAkJZWxvZyhFUlJPUiwg ImludmFsaWQgdHlwbGVuIik7CiAKKwkvKiBjb21wcmVzcyB0aGUgaXRlbSBwb2ludGVycyAq LworCW5jb21wcmVzc2VkID0gMDsKKwljb21wcmVzc2xlbiA9IDA7CisJZGxpc3RfaW5pdCgm c2VnbWVudHMpOworCisJLyogZ2VuZXJhdGUgY29tcHJlc3NlZCBzZWdtZW50cyBvZiBUSUQg bGlzdCBjaHVua3MgKi8KKwl3aGlsZSAobmNvbXByZXNzZWQgPCBuaXRlbXMpCisJeworCQlp bnQJCQljbnQ7CisJCUdpblNlZ21lbnRJbmZvICpzZWdpbmZvID0gcGFsbG9jKHNpemVvZihH aW5TZWdtZW50SW5mbykpOworCisJCXNlZ2luZm8tPnNlZyA9IGdpbkNvbXByZXNzUG9zdGlu Z0xpc3QoJml0ZW1zW25jb21wcmVzc2VkXSwKKwkJCQkJCQkJCQkJICAobml0ZW1zIC0gbmNv bXByZXNzZWQpLAorCQkJCQkJCQkJCQkgIFVJTlQxNl9NQVgsCisJCQkJCQkJCQkJCSAgJmNu dCk7CisKKwkJbmNvbXByZXNzZWQgKz0gY250OworCQljb21wcmVzc2xlbiArPSBTaXplT2ZH aW5Qb3N0aW5nTGlzdChzZWdpbmZvLT5zZWcpOworCisJCWRsaXN0X3B1c2hfdGFpbCgmc2Vn bWVudHMsICZzZWdpbmZvLT5ub2RlKTsKKwl9CisKIAkvKgogCSAqIERldGVybWluZSBHSU4g dHVwbGUgbGVuZ3RoIHdpdGggYWxsIHRoZSBkYXRhIGluY2x1ZGVkLiBCZSBjYXJlZnVsIGFi b3V0Ci0JICogYWxpZ25tZW50LCB0byBhbGxvdyBkaXJlY3QgYWNjZXNzIHRvIGl0ZW0gcG9p bnRlcnMuCisJICogYWxpZ25tZW50LCB0byBhbGxvdyBkaXJlY3QgYWNjZXNzIHRvIGNvbXBy ZXNzZWQgc2VnbWVudHMgKHRob3NlIHJlcXVpcmUKKwkgKiBTSE9SVEFMSUdOLCBidXQgd2Ug ZG8gTUFYQUxJTkcgYW55d2F5KS4KIAkgKi8KLQl0dXBsZW4gPSBNQVhBTElHTihvZmZzZXRv ZihHaW5UdXBsZSwgZGF0YSkgKyBrZXlsZW4pICsKLQkJKHNpemVvZihJdGVtUG9pbnRlckRh dGEpICogbml0ZW1zKTsKKwl0dXBsZW4gPSBNQVhBTElHTihvZmZzZXRvZihHaW5UdXBsZSwg ZGF0YSkgKyBrZXlsZW4pICsgY29tcHJlc3NsZW47CiAKIAkqbGVuID0gdHVwbGVuOwogCkBA IC0xOTA5LDM3ICsxOTU2LDQwIEBAIF9naW5fYnVpbGRfdHVwbGUoT2Zmc2V0TnVtYmVyIGF0 dHJudW0sIHVuc2lnbmVkIGNoYXIgY2F0ZWdvcnksCiAJLyogZmluYWxseSwgY29weSB0aGUg VElEcyBpbnRvIHRoZSBhcnJheSAqLwogCXB0ciA9IChjaGFyICopIHR1cGxlICsgTUFYQUxJ R04ob2Zmc2V0b2YoR2luVHVwbGUsIGRhdGEpICsga2V5bGVuKTsKIAotCW1lbWNweShwdHIs IGl0ZW1zLCBzaXplb2YoSXRlbVBvaW50ZXJEYXRhKSAqIG5pdGVtcyk7CisJLyogY29weSBp biB0aGUgY29tcHJlc3NlZCBkYXRhLCBhbmQgZnJlZSB0aGUgc2VnbWVudHMgKi8KKwlkbGlz dF9mb3JlYWNoX21vZGlmeShpdGVyLCAmc2VnbWVudHMpCisJeworCQlHaW5TZWdtZW50SW5m byAqc2VnaW5mbyA9IGRsaXN0X2NvbnRhaW5lcihHaW5TZWdtZW50SW5mbywgbm9kZSwgaXRl ci5jdXIpOworCisJCW1lbWNweShwdHIsIHNlZ2luZm8tPnNlZywgU2l6ZU9mR2luUG9zdGlu Z0xpc3Qoc2VnaW5mby0+c2VnKSk7CisKKwkJcHRyICs9IFNpemVPZkdpblBvc3RpbmdMaXN0 KHNlZ2luZm8tPnNlZyk7CisKKwkJZGxpc3RfZGVsZXRlKCZzZWdpbmZvLT5ub2RlKTsKKwor CQlwZnJlZShzZWdpbmZvLT5zZWcpOworCQlwZnJlZShzZWdpbmZvKTsKKwl9CiAKIAlyZXR1 cm4gdHVwbGU7CiB9CiAKIC8qCi0gKiBfZ2luX3BhcnNlX3R1cGxlCi0gKgkJRGVzZXJpYWxp emUgdGhlIHR1cGxlIGZyb20gdGhlIHR1cGxlc3RvcmUgcmVwcmVzZW50YXRpb24uCisgKiBf Z2luX3BhcnNlX3R1cGxlX2tleQorICoJCVJldHVybiBhIERhdHVtIHJlcHJlc2VudGluZyB0 aGUga2V5IHN0b3JlZCBpbiB0aGUgdHVwbGUuCiAgKgotICogTW9zdCBvZiB0aGUgZmllbGRz IGFyZSBhY3R1YWxseSBkaXJlY3RseSBhY2Nlc3NpYmxlLCB0aGUgb25seSB0aGluZyB0aGF0 CisgKiBNb3N0IG9mIHRoZSB0dXBsZSBmaWVsZHMgYXJlIGRpcmVjdGx5IGFjY2Vzc2libGUs IHRoZSBvbmx5IHRoaW5nIHRoYXQKICAqIG5lZWRzIG1vcmUgY2FyZSBpcyB0aGUga2V5IGFu ZCB0aGUgVElEIGxpc3QuCiAgKgogICogRm9yIHRoZSBrZXksIHRoaXMgcmV0dXJucyBhIHJl Z3VsYXIgRGF0dW0gcmVwcmVzZW50aW5nIGl0LiBJdCdzIGVpdGhlciB0aGUKICAqIGFjdHVh bCBrZXkgdmFsdWUsIG9yIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRh IGFycmF5ICh3aGljaCBpcwogICogd2hlcmUgdGhlIGRhdGEgd2FzIGNvcGllZCBieSBfZ2lu X2J1aWxkX3R1cGxlKS4KLSAqCi0gKiBUaGUgcG9pbnRlciB0byB0aGUgVElEIGxpc3QgaXMg cmV0dXJuZWQgdGhyb3VnaCAnaXRlbXMnICh3aGljaCBpcyBzaW1wbHkKLSAqIGEgcG9pbnRl ciB0byB0aGUgZGF0YSBhcnJheSkuCiAgKi8KIHN0YXRpYyBEYXR1bQotX2dpbl9wYXJzZV90 dXBsZShHaW5UdXBsZSAqYSwgSXRlbVBvaW50ZXJEYXRhICoqaXRlbXMpCitfZ2luX3BhcnNl X3R1cGxlX2tleShHaW5UdXBsZSAqYSkKIHsKIAlEYXR1bQkJa2V5OwogCi0JaWYgKGl0ZW1z KQotCXsKLQkJY2hhcgkgICAqcHRyID0gKGNoYXIgKikgYSArIE1BWEFMSUdOKG9mZnNldG9m KEdpblR1cGxlLCBkYXRhKSArIGEtPmtleWxlbik7Ci0KLQkJKml0ZW1zID0gKEl0ZW1Qb2lu dGVyRGF0YSAqKSBwdHI7Ci0JfQotCiAJaWYgKGEtPmNhdGVnb3J5ICE9IEdJTl9DQVRfTk9S TV9LRVkpCiAJCXJldHVybiAoRGF0dW0pIDA7CiAKQEAgLTE5NTIsNiArMjAwMiwyOCBAQCBf Z2luX3BhcnNlX3R1cGxlKEdpblR1cGxlICphLCBJdGVtUG9pbnRlckRhdGEgKippdGVtcykK IAlyZXR1cm4gUG9pbnRlckdldERhdHVtKGEtPmRhdGEpOwogfQogCisvKgorKiBfZ2luX3Bh cnNlX3R1cGxlX2l0ZW1zCisgKgkJUmV0dXJuIGEgcG9pbnRlciB0byBhIHBhbGxvYydkIGFy cmF5IG9mIGRlY29tcHJlc3NlZCBUSUQgYXJyYXkuCisgKi8KK3N0YXRpYyBJdGVtUG9pbnRl cgorX2dpbl9wYXJzZV90dXBsZV9pdGVtcyhHaW5UdXBsZSAqYSkKK3sKKwlpbnQJCQlsZW47 CisJY2hhcgkgICAqcHRyOworCWludAkJCW5kZWNvZGVkOworCUl0ZW1Qb2ludGVyIGl0ZW1z OworCisJbGVuID0gYS0+dHVwbGVuIC0gTUFYQUxJR04ob2Zmc2V0b2YoR2luVHVwbGUsIGRh dGEpICsgYS0+a2V5bGVuKTsKKwlwdHIgPSAoY2hhciAqKSBhICsgTUFYQUxJR04ob2Zmc2V0 b2YoR2luVHVwbGUsIGRhdGEpICsgYS0+a2V5bGVuKTsKKworCWl0ZW1zID0gZ2luUG9zdGlu Z0xpc3REZWNvZGVBbGxTZWdtZW50cygoR2luUG9zdGluZ0xpc3QgKikgcHRyLCBsZW4sICZu ZGVjb2RlZCk7CisKKwlBc3NlcnQobmRlY29kZWQgPT0gYS0+bml0ZW1zKTsKKworCXJldHVy biAoSXRlbVBvaW50ZXIpIGl0ZW1zOworfQorCiAvKgogICogX2dpbl9jb21wYXJlX3R1cGxl cwogICoJCUNvbXBhcmUgR0lOIHR1cGxlcywgdXNlZCBieSB0dXBsZXNvcnQgZHVyaW5nIHBh cmFsbGVsIGluZGV4IGJ1aWxkLgpAQCAtMTk5Miw4ICsyMDY0LDggQEAgX2dpbl9jb21wYXJl X3R1cGxlcyhHaW5UdXBsZSAqYSwgR2luVHVwbGUgKmIpCiAJaWYgKChhLT5jYXRlZ29yeSA9 PSBHSU5fQ0FUX05PUk1fS0VZKSAmJgogCQkoYi0+Y2F0ZWdvcnkgPT0gR0lOX0NBVF9OT1JN X0tFWSkpCiAJewotCQlrZXlhID0gX2dpbl9wYXJzZV90dXBsZShhLCBOVUxMKTsKLQkJa2V5 YiA9IF9naW5fcGFyc2VfdHVwbGUoYiwgTlVMTCk7CisJCWtleWEgPSBfZ2luX3BhcnNlX3R1 cGxlX2tleShhKTsKKwkJa2V5YiA9IF9naW5fcGFyc2VfdHVwbGVfa2V5KGIpOwogCiAJCS8q CiAJCSAqIHdvcmtzIGZvciBib3RoIGJ5dmFsIGFuZCBieXJlZiB0eXBlcyB3aXRoIGZpeGVk IGxlbmdodCwgYmVjYXVzZSBmb3IKZGlmZiAtLWdpdCBhL3NyYy90b29scy9wZ2luZGVudC90 eXBlZGVmcy5saXN0IGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKaW5kZXgg MGVlMWI5YWIxOWIuLjk3Yjg3NzBlZDVmIDEwMDY0NAotLS0gYS9zcmMvdG9vbHMvcGdpbmRl bnQvdHlwZWRlZnMubGlzdAorKysgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlz dApAQCAtMTAyMyw2ICsxMDIzLDcgQEAgR2luU2NhbkVudHJ5CiBHaW5TY2FuS2V5CiBHaW5T Y2FuT3BhcXVlCiBHaW5TY2FuT3BhcXVlRGF0YQorR2luU2VnbWVudEluZm8KIEdpblNoYXJl ZAogR2luU3RhdGUKIEdpblN0YXRzRGF0YQotLSAKMi40NC4wCgo= --------------5ATIJri30SzyV9JJnS7e1Mjr Content-Type: text/x-patch; charset=UTF-8; name="v20240502-0005-Collect-and-print-compression-stats.patch" Content-Disposition: attachment; filename="v20240502-0005-Collect-and-print-compression-stats.patch" Content-Transfer-Encoding: base64 RnJvbSA2ZDcyNmM2OGZlZjg5NjliOGM2YWNiYTBmNjY0N2RkMWRiODMxNzRlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzLnZvbmRyYUBwb3N0 Z3Jlc3FsLm9yZz4KRGF0ZTogVGh1LCAyIE1heSAyMDI0IDE1OjIxOjQzICswMjAwClN1Ympl Y3Q6IFtQQVRDSCB2MjAyNDA1MDIgNS84XSBDb2xsZWN0IGFuZCBwcmludCBjb21wcmVzc2lv biBzdGF0cwoKQWxsb3dzIGV2YWx1YXRpbmcgdGhlIGJlbmVmaXRzIG9mIGNvbXByZXNzaW5n IHRoZSBUSUQgbGlzdHMuCi0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW5pbnNlcnQu YyB8IDM2ICsrKysrKysrKysrKysrKysrKysrKysrKystLS0tLQogc3JjL2luY2x1ZGUvYWNj ZXNzL2dpbi5oICAgICAgICAgICB8ICAyICsrCiAyIGZpbGVzIGNoYW5nZWQsIDMyIGluc2Vy dGlvbnMoKyksIDYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNj ZXNzL2dpbi9naW5pbnNlcnQuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luaW5zZXJ0 LmMKaW5kZXggNjA3Y2U5YjM0ZDYuLmFjZmM0ZTU2ODM4IDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9hY2Nlc3MvZ2luL2dpbmluc2VydC5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9n aW4vZ2luaW5zZXJ0LmMKQEAgLTE5MCw3ICsxOTAsOCBAQCBzdGF0aWMgdm9pZCBfZ2luX3Bh cmFsbGVsX3NjYW5fYW5kX2J1aWxkKEdpbkJ1aWxkU3RhdGUgKmJ1aWxkc3RhdGUsCiBzdGF0 aWMgSXRlbVBvaW50ZXIgX2dpbl9wYXJzZV90dXBsZV9pdGVtcyhHaW5UdXBsZSAqYSk7CiBz dGF0aWMgRGF0dW0gX2dpbl9wYXJzZV90dXBsZV9rZXkoR2luVHVwbGUgKmEpOwogCi1zdGF0 aWMgR2luVHVwbGUgKl9naW5fYnVpbGRfdHVwbGUoT2Zmc2V0TnVtYmVyIGF0dHJudW0sIHVu c2lnbmVkIGNoYXIgY2F0ZWdvcnksCitzdGF0aWMgR2luVHVwbGUgKl9naW5fYnVpbGRfdHVw bGUoR2luQnVpbGRTdGF0ZSAqc3RhdGUsCisJCQkJCQkJCSAgT2Zmc2V0TnVtYmVyIGF0dHJu dW0sIHVuc2lnbmVkIGNoYXIgY2F0ZWdvcnksCiAJCQkJCQkJCSAgRGF0dW0ga2V5LCBpbnQx NiB0eXBsZW4sIGJvb2wgdHlwYnl2YWwsCiAJCQkJCQkJCSAgSXRlbVBvaW50ZXJEYXRhICpp dGVtcywgdWludDMyIG5pdGVtcywKIAkJCQkJCQkJICBTaXplICpsZW4pOwpAQCAtNTM5LDcg KzU0MCw3IEBAIGdpbkJ1aWxkQ2FsbGJhY2tQYXJhbGxlbChSZWxhdGlvbiBpbmRleCwgSXRl bVBvaW50ZXIgdGlkLCBEYXR1bSAqdmFsdWVzLAogCQkJLyogdGhlcmUgY291bGQgYmUgbWFu eSBlbnRyaWVzLCBzbyBiZSB3aWxsaW5nIHRvIGFib3J0IGhlcmUgKi8KIAkJCUNIRUNLX0ZP Ul9JTlRFUlJVUFRTKCk7CiAKLQkJCXR1cCA9IF9naW5fYnVpbGRfdHVwbGUoYXR0bnVtLCBj YXRlZ29yeSwKKwkJCXR1cCA9IF9naW5fYnVpbGRfdHVwbGUoYnVpbGRzdGF0ZSwgYXR0bnVt LCBjYXRlZ29yeSwKIAkJCQkJCQkJICAga2V5LCBhdHRyLT5hdHRsZW4sIGF0dHItPmF0dGJ5 dmFsLAogCQkJCQkJCQkgICBsaXN0LCBubGlzdCwgJnR1cGxlbik7CiAKQEAgLTE1MzAsNiAr MTUzMSwxNSBAQCBfZ2luX3Byb2Nlc3Nfd29ya2VyX2RhdGEoR2luQnVpbGRTdGF0ZSAqc3Rh dGUsIFR1cGxlc29ydHN0YXRlICp3b3JrZXJfc29ydCkKIAkvKiBzb3J0IHRoZSByYXcgcGVy LXdvcmtlciBkYXRhICovCiAJdHVwbGVzb3J0X3BlcmZvcm1zb3J0KHN0YXRlLT5ic193b3Jr ZXJfc29ydCk7CiAKKwkvKiBwcmludCBzb21lIGJhc2ljIGluZm8gKi8KKwllbG9nKExPRywg Il9naW5fcGFyYWxsZWxfc2Nhbl9hbmRfYnVpbGQgcmF3ICVsdSBjb21wcmVzc2VkICVsdSBy YXRpbyAlLjJmJSUiLAorCQkgc3RhdGUtPmJ1aWxkU3RhdHMuc2l6ZVJhdywgc3RhdGUtPmJ1 aWxkU3RhdHMuc2l6ZUNvbXByZXNzZWQsCisJCSAoMTAwLjAgKiBzdGF0ZS0+YnVpbGRTdGF0 cy5zaXplQ29tcHJlc3NlZCkgLyBzdGF0ZS0+YnVpbGRTdGF0cy5zaXplUmF3KTsKKworCS8q IHJlc2V0IGJlZm9yZSB0aGUgc2Vjb25kIHBoYXNlICovCisJc3RhdGUtPmJ1aWxkU3RhdHMu c2l6ZUNvbXByZXNzZWQgPSAwOworCXN0YXRlLT5idWlsZFN0YXRzLnNpemVSYXcgPSAwOwor CiAJLyoKIAkgKiBSZWFkIHRoZSBHSU4gdHVwbGVzIGZyb20gdGhlIHNoYXJlZCB0dXBsZXNv cnQsIHNvcnRlZCBieSB0aGUga2V5LCBhbmQKIAkgKiBtZXJnZSB0aGVtIGludG8gbGFyZ2Vy IGNodW5rcyBmb3IgdGhlIGxlYWRlciB0byBjb21iaW5lLgpAQCAtMTU1Niw3ICsxNTY2LDcg QEAgX2dpbl9wcm9jZXNzX3dvcmtlcl9kYXRhKEdpbkJ1aWxkU3RhdGUgKnN0YXRlLCBUdXBs ZXNvcnRzdGF0ZSAqd29ya2VyX3NvcnQpCiAJCQkgKi8KIAkJCUFzc2VydENoZWNrSXRlbVBv aW50ZXJzKGJ1ZmZlciwgdHJ1ZSk7CiAKLQkJCW50dXAgPSBfZ2luX2J1aWxkX3R1cGxlKGJ1 ZmZlci0+YXR0bnVtLCBidWZmZXItPmNhdGVnb3J5LAorCQkJbnR1cCA9IF9naW5fYnVpbGRf dHVwbGUoc3RhdGUsIGJ1ZmZlci0+YXR0bnVtLCBidWZmZXItPmNhdGVnb3J5LAogCQkJCQkJ CQkJYnVmZmVyLT5rZXksIGJ1ZmZlci0+dHlwbGVuLCBidWZmZXItPnR5cGJ5dmFsLAogCQkJ CQkJCQkJYnVmZmVyLT5pdGVtcywgYnVmZmVyLT5uaXRlbXMsICZudHVwbGVuKTsKIApAQCAt MTU4Myw3ICsxNTkzLDcgQEAgX2dpbl9wcm9jZXNzX3dvcmtlcl9kYXRhKEdpbkJ1aWxkU3Rh dGUgKnN0YXRlLCBUdXBsZXNvcnRzdGF0ZSAqd29ya2VyX3NvcnQpCiAKIAkJQXNzZXJ0Q2hl Y2tJdGVtUG9pbnRlcnMoYnVmZmVyLCB0cnVlKTsKIAotCQludHVwID0gX2dpbl9idWlsZF90 dXBsZShidWZmZXItPmF0dG51bSwgYnVmZmVyLT5jYXRlZ29yeSwKKwkJbnR1cCA9IF9naW5f YnVpbGRfdHVwbGUoc3RhdGUsIGJ1ZmZlci0+YXR0bnVtLCBidWZmZXItPmNhdGVnb3J5LAog CQkJCQkJCQlidWZmZXItPmtleSwgYnVmZmVyLT50eXBsZW4sIGJ1ZmZlci0+dHlwYnl2YWws CiAJCQkJCQkJCWJ1ZmZlci0+aXRlbXMsIGJ1ZmZlci0+bml0ZW1zLCAmbnR1cGxlbik7CiAK QEAgLTE1OTgsNiArMTYwOCwxMSBAQCBfZ2luX3Byb2Nlc3Nfd29ya2VyX2RhdGEoR2luQnVp bGRTdGF0ZSAqc3RhdGUsIFR1cGxlc29ydHN0YXRlICp3b3JrZXJfc29ydCkKIAkvKiByZWxh c2UgYWxsIHRoZSBtZW1vcnkgKi8KIAlHaW5CdWZmZXJGcmVlKGJ1ZmZlcik7CiAKKwkvKiBw cmludCBzb21lIGJhc2ljIGluZm8gKi8KKwllbG9nKExPRywgIl9naW5fcHJvY2Vzc193b3Jr ZXJfZGF0YSByYXcgJWx1IGNvbXByZXNzZWQgJWx1IHJhdGlvICUuMmYlJSIsCisJCSBzdGF0 ZS0+YnVpbGRTdGF0cy5zaXplUmF3LCBzdGF0ZS0+YnVpbGRTdGF0cy5zaXplQ29tcHJlc3Nl ZCwKKwkJICgxMDAuMCAqIHN0YXRlLT5idWlsZFN0YXRzLnNpemVDb21wcmVzc2VkKSAvIHN0 YXRlLT5idWlsZFN0YXRzLnNpemVSYXcpOworCiAJdHVwbGVzb3J0X2VuZCh3b3JrZXJfc29y dCk7CiB9CiAKQEAgLTE2NjksNyArMTY4NCw3IEBAIF9naW5fcGFyYWxsZWxfc2Nhbl9hbmRf YnVpbGQoR2luQnVpbGRTdGF0ZSAqc3RhdGUsCiAJCQkvKiB0aGVyZSBjb3VsZCBiZSBtYW55 IGVudHJpZXMsIHNvIGJlIHdpbGxpbmcgdG8gYWJvcnQgaGVyZSAqLwogCQkJQ0hFQ0tfRk9S X0lOVEVSUlVQVFMoKTsKIAotCQkJdHVwID0gX2dpbl9idWlsZF90dXBsZShhdHRudW0sIGNh dGVnb3J5LAorCQkJdHVwID0gX2dpbl9idWlsZF90dXBsZShzdGF0ZSwgYXR0bnVtLCBjYXRl Z29yeSwKIAkJCQkJCQkJICAga2V5LCBhdHRyLT5hdHRsZW4sIGF0dHItPmF0dGJ5dmFsLAog CQkJCQkJCQkgICBsaXN0LCBubGlzdCwgJmxlbik7CiAKQEAgLTE3NjMsNiArMTc3OCw3IEBA IF9naW5fcGFyYWxsZWxfYnVpbGRfbWFpbihkc21fc2VnbWVudCAqc2VnLCBzaG1fdG9jICp0 b2MpCiAJLyogaW5pdGlhbGl6ZSB0aGUgR0lOIGJ1aWxkIHN0YXRlICovCiAJaW5pdEdpblN0 YXRlKCZidWlsZHN0YXRlLmdpbnN0YXRlLCBpbmRleFJlbCk7CiAJYnVpbGRzdGF0ZS5pbmR0 dXBsZXMgPSAwOworCS8qIFhYWCBzaG91bGRuJ3QgdGhpcyBpbml0aWFsaXplIHRoZSBvdGhl ciBmaWVkbHMsIGxpa2UgZ2luYnVpbGQoKT8gKi8KIAltZW1zZXQoJmJ1aWxkc3RhdGUuYnVp bGRTdGF0cywgMCwgc2l6ZW9mKEdpblN0YXRzRGF0YSkpOwogCiAJLyoKQEAgLTE4NDAsNyAr MTg1Niw4IEBAIHR5cGVkZWYgc3RydWN0CiAgKiBvZiB0aGF0IGludG8gdGhlIEdJTiB0dXBs ZS4KICAqLwogc3RhdGljIEdpblR1cGxlICoKLV9naW5fYnVpbGRfdHVwbGUoT2Zmc2V0TnVt YmVyIGF0dHJudW0sIHVuc2lnbmVkIGNoYXIgY2F0ZWdvcnksCitfZ2luX2J1aWxkX3R1cGxl KEdpbkJ1aWxkU3RhdGUgKnN0YXRlLAorCQkJCSBPZmZzZXROdW1iZXIgYXR0cm51bSwgdW5z aWduZWQgY2hhciBjYXRlZ29yeSwKIAkJCQkgRGF0dW0ga2V5LCBpbnQxNiB0eXBsZW4sIGJv b2wgdHlwYnl2YWwsCiAJCQkJIEl0ZW1Qb2ludGVyRGF0YSAqaXRlbXMsIHVpbnQzMiBuaXRl bXMsCiAJCQkJIFNpemUgKmxlbikKQEAgLTE5NzEsNiArMTk4OCwxMyBAQCBfZ2luX2J1aWxk X3R1cGxlKE9mZnNldE51bWJlciBhdHRybnVtLCB1bnNpZ25lZCBjaGFyIGNhdGVnb3J5LAog CQlwZnJlZShzZWdpbmZvKTsKIAl9CiAKKwkvKiBob3cgbGFyZ2Ugd291bGQgdGhlIHR1cGxl IGJlIHdpdGhvdXQgY29tcHJlc3Npb24/ICovCisJc3RhdGUtPmJ1aWxkU3RhdHMuc2l6ZVJh dyArPSBNQVhBTElHTihvZmZzZXRvZihHaW5UdXBsZSwgZGF0YSkgKyBrZXlsZW4pICsKKwkJ bml0ZW1zICogc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSk7CisKKwkvKiBjb21wcmVzc2VkIHNp emUgKi8KKwlzdGF0ZS0+YnVpbGRTdGF0cy5zaXplQ29tcHJlc3NlZCArPSB0dXBsZW47CisK IAlyZXR1cm4gdHVwbGU7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9n aW4uaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9naW4uaAppbmRleCBiZTc2ZDg0NDZmNC4uMmI2 NjMzZDA2OGEgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9naW4uaAorKysgYi9z cmMvaW5jbHVkZS9hY2Nlc3MvZ2luLmgKQEAgLTQ5LDYgKzQ5LDggQEAgdHlwZWRlZiBzdHJ1 Y3QgR2luU3RhdHNEYXRhCiAJQmxvY2tOdW1iZXIgbkRhdGFQYWdlczsKIAlpbnQ2NAkJbkVu dHJpZXM7CiAJaW50MzIJCWdpblZlcnNpb247CisJU2l6ZQkJc2l6ZVJhdzsKKwlTaXplCQlz aXplQ29tcHJlc3NlZDsKIH0gR2luU3RhdHNEYXRhOwogCiAvKgotLSAKMi40NC4wCgo= --------------5ATIJri30SzyV9JJnS7e1Mjr Content-Type: text/x-patch; charset=UTF-8; name="v20240502-0006-Enforce-memory-limit-when-combining-tuples.patch" Content-Disposition: attachment; filename*0="v20240502-0006-Enforce-memory-limit-when-combining-tuples.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSBhY2U0MGE0NDg2ODRmZmIxZmFjMWU0NjMwYjU2NTdkOGZmZDNkMjdkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzLnZvbmRyYUBwb3N0 Z3Jlc3FsLm9yZz4KRGF0ZTogVGh1LCAyIE1heSAyMDI0IDE1OjIxOjQ5ICswMjAwClN1Ympl Y3Q6IFtQQVRDSCB2MjAyNDA1MDIgNi84XSBFbmZvcmNlIG1lbW9yeSBsaW1pdCB3aGVuIGNv bWJpbmluZyB0dXBsZXMKCldoZW4gY29tYmlubmlnIGludGVybWVkaWF0ZSByZXN1bHRzIGR1 cmluZyBwYXJhbGxlbCBHSU4gaW5kZXggYnVpbGQsIHdlCndhbnQgdG8gcmVzdHJpY3QgdGhl IG1lbW9yeSB1c2FnZS4gSW4gZ2luQnVpbGRDYWxsYmFja1BhcmFsbGVsKCkgdGhpcyBpcwpk b25lIHNpbXBseSBieSBkdW1waW5nIHdvcmtpbmcgc3RhdGUgaW50byB0dXBsZXNvcnQgYWZ0 ZXIgaGl0dGluZyB0aGUKbWVtb3J5IGxpbWl0LgoKVGhpcyBjb21taXQgaW50cm9kdWNlcyBt ZW1vcnkgbGltaXQgdG8gdGhlIGZvbGxvd2luZyBzdGVwcywgbWVyZ2luZyB0aGUKaW50ZXJt ZWRpYXRlIHJlc3VsdHMgaW4gYm90aCB3b3JrZXIgYW5kIGxlYWRlci4gVGhlIG1lcmdlIG9u bHkgZGVhbHMKd2l0aCBvbmUga2V5IGF0IGEgdGltZSwgYW5kIHRoZSBwcmltYXJ5IHJpc2sg aXMgdGhlIGtleSBtaWdodCBoYXZlIHRvbwptYW55IGRpZmZlcmVudCBUSURzLiBUaGlzIGlz IG5vdCB2ZXJ5IGxpa2VseSwgYmVjYXVzZSB0aGUgVElEIGFycmF5IG9ubHkKbmVlZHMgNkIg cGVyIGl0ZW0sIGl0J3MgYSBwb3RlbnRpYWwgaXNzdWUuCgpXZSBjYW4ndCBzaW1wbHkgZHVt cCB0aGUgd2hvbGUgY3VycmVudCBUSUQgbGlzdCAtIHRoZSBpbmRleCByZXF1aXJlcyB0aGUK VElEIHZhbHVlcyB0byBiZSBpbnNlcnRlZCBpbiB0aGUgY29ycmVjdCBvcmRlciwgYnV0IGlm IHRoZSBsaXN0cyBvdmVybGFwCihhcyB0aGV5IGRvIGJldHdlZW4gd29ya2VycyksIHRoZSB0 YWlsIG9mIHRoZSBsaXN0IG1heSBjaGFuZ2UgZHVyaW5nIHRoZQptZXJnZXNvcnQuIEJ1dCB0 aGFua3MgdG8gc29ydGluZyBHSU4gdHVwbGVzIGJ5IGZpcnN0IFRJRCwgd2UgY2FuIGRlcml2 ZQphIHNhZmUgVElEIGhvcml6b24gLSB3ZSBrbm93IG5vIGZ1dHVyZSB0dXBsZXMgd2lsbCBo YXZlIFRJRHMgZnJvbSBiZWZvcmUKdGhpcyB2YWx1ZSwgc28gaXQncyBzYWZlIHRvIG91dHB1 dCB0aGlzIHBhcnQgb2YgdGhlIGxpc3QuCgpUaGlzIGNvbW1pdCB0cmFja3MgImZyb3plbiIg cGFydCBvZiB0aGUgdGhlIFRJRCBsaXN0LCB3aGljaCBpcyB0aGUgcGFydAp3ZSBrbm93IHdv bid0IGNoYW5nZSBhZnRlciBtZXJnaW5nIGFkZGl0aW9uYWwgVElEIGxpc3RzLiBUaGVuIGlm IHRoZSBUSUQKbGlzdCBncm93cyB0b28gbGFyZ2UgKG1vcmUgdGhhbiA2NGtCKSwgd2UgdHJ5 IHRvIHRyaW0gaXQgLSB3cml0ZSBvdXQgdGhlCmZyb3plbiBwYXJ0IG9mIHRoZSBsaXN0LCBh bmQgZGlzY2FyZCBpdCBmcm9tIHRoZSBidWZmZXIuIFdlIG9ubHkgZG8gdGhlCnRyaW1taW5n IGlmIHRoZXJlJ3MgYXQgbGVhc3QgMTAyNCBmcm96ZW4gaXRlbXMgLSB3ZSBkb24ndCB3YW50 IHRvIHdyaXRlCnRoZSBkYXRhIGludG8gdGhlIGluZGV4IGluIHRpbnkgY2h1bmtzLgoKVGhl IGZyZWV6aW5nIGFsc28gYWxsb3dzIHVzIHRvIHNraXAgdGhlIGZyb3plbiBwYXJ0IGR1cmlu ZyBtZXJnZXNvcnQuClRoZSBmcm96ZW4gcGFydCBvZiB0aGUgbGlzdCBpcyBrbm93biB0byBi ZSBmdWxseSBzb3J0ZWQsIHNvIHdlIGNhbiBqdXN0CnNraXAgaXQgYW5kIG1lcmdlc29ydCBv bmx5IHRoZSByZXN0IG9mIHRoZSBkYXRhLgoKTm90ZTogVGhlc2UgbGltaXRlcyAoMTAyNCBh bmQgNjRrQikgYXJlIG1vc3RseSBhcmJpdHJhcnkgLSBidXQgc2VlbSBoaWdoCmVub3VnaCB0 byBnZXQgZ29vZCBlZmZpY2llbmN5IGZvciBjb21wcmVzc2lvbi9iYXRjaGluZywgYnV0IGxv dyBlbm91Z2gKdG8gcmVsZWFzZSBtZW1vcnkgZWFybHkgYW5kIHdvcmsgaW4gc21hbGwgaW5j cmVtZW50cy4KLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbmluc2VydC5jIHwgMjQ1 ICsrKysrKysrKysrKysrKysrKysrKysrKysrKy0tCiBzcmMvaW5jbHVkZS9hY2Nlc3MvZ2lu LmggICAgICAgICAgIHwgICAxICsKIDIgZmlsZXMgY2hhbmdlZCwgMjM3IGluc2VydGlvbnMo KyksIDkgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2dp bi9naW5pbnNlcnQuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luaW5zZXJ0LmMKaW5k ZXggYWNmYzRlNTY4MzguLjFkOTU1NzY5MmEzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9h Y2Nlc3MvZ2luL2dpbmluc2VydC5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2lu aW5zZXJ0LmMKQEAgLTExMzAsOCArMTEzMCwxMiBAQCB0eXBlZGVmIHN0cnVjdCBHaW5CdWZm ZXIKIAlpbnQxNgkJdHlwbGVuOwogCWJvb2wJCXR5cGJ5dmFsOwogCisJLyogTnVtYmVyIG9m IFRJRHMgdG8gY29sbGVjdCBiZWZvcmUgYXR0ZW1wdCB0byB3cml0ZSBzb21lIG91dC4gKi8K KwlpbnQJCQltYXhpdGVtczsKKwogCS8qIGFycmF5IG9mIFRJRCB2YWx1ZXMgKi8KIAlpbnQJ CQluaXRlbXM7CisJaW50CQkJbmZyb3plbjsKIAlJdGVtUG9pbnRlckRhdGEgKml0ZW1zOwog fSBHaW5CdWZmZXI7CiAKQEAgLTExNjYsNyArMTE3MCwyMSBAQCBBc3NlcnRDaGVja0l0ZW1Q b2ludGVycyhHaW5CdWZmZXIgKmJ1ZmZlciwgYm9vbCBzb3J0ZWQpCiBzdGF0aWMgR2luQnVm ZmVyICoKIEdpbkJ1ZmZlckluaXQodm9pZCkKIHsKLQlyZXR1cm4gcGFsbG9jMChzaXplb2Yo R2luQnVmZmVyKSk7CisJR2luQnVmZmVyICAqYnVmZmVyID0gKEdpbkJ1ZmZlciAqKSBwYWxs b2MwKHNpemVvZihHaW5CdWZmZXIpKTsKKworCS8qCisJICogSG93IG1hbnkgaXRlbXMgY2Fu IHdlIGZpdCBpbnRvIHRoZSBtZW1vcnkgbGltaXQ/IDY0a0Igc2VlbXMgbW9yZSB0aGFuCisJ ICogZW5vdWdoIGFuZCB3ZSBkb24ndCB3YW50IGEgbGltaXQgdGhhdCdzIHRvbyBoaWdoLiBP VE9IIG1heWJlIHRoaXMKKwkgKiBzaG91bGQgYmUgdGllZCB0byBtYWludGVuYW5jZV93b3Jr X21lbSBvciBzb21ldGhpbmcgbGlrZSB0aGF0PworCSAqCisJICogWFhYIFRoaXMgaXMgbm90 IGVub3VnaCB0byBwcmV2ZW50IHJlcGVhdGVkIG1lcmdlcyBhZnRlciBhIHdyYXBhcm91bmQs CisJICogYnV0IGl0IHNob3VsZCBiZSBlbm91Z2ggdG8gbWFrZSB0aGUgbWVyZ2VzIGNoZWFw IGJlY2F1c2UgaXQgcXVpY2tseQorCSAqIGZpbmRzIHJlYWNoZXMgdGhlIGVuZCBvZiB0aGUg c2Vjb25kIGxpc3QgYW5kIGNhbiBqdXN0IG1lbWNweSB0aGUgcmVzdAorCSAqIHdpdGhvdXQg d2Fsa2luZyBpdCBpdGVtIGJ5IGl0ZW0uCisJICovCisJYnVmZmVyLT5tYXhpdGVtcyA9ICg2 NCAqIDEwMjRMKSAvIHNpemVvZihJdGVtUG9pbnRlckRhdGEpOworCisJcmV0dXJuIGJ1ZmZl cjsKIH0KIAogc3RhdGljIGJvb2wKQEAgLTEyMjEsNiArMTIzOSw1NCBAQCBHaW5CdWZmZXJL ZXlFcXVhbHMoR2luQnVmZmVyICpidWZmZXIsIEdpblR1cGxlICp0dXApCiAJcmV0dXJuICht ZW1jbXAodHVwLT5kYXRhLCBEYXR1bUdldFBvaW50ZXIoYnVmZmVyLT5rZXkpLCBidWZmZXIt PmtleWxlbikgPT0gMCk7CiB9CiAKKy8qCisgKiBHaW5CdWZmZXJTaG91bGRUcmltCisgKgkJ U2hvdWxkIHdlIHRyaW0gdGhlIGxpc3Qgb2YgaXRlbSBwb2ludGVycz8KKyAqCisgKiBCeSB0 cmltbWluZyB3ZSB1bmRlcnN0YW5kIHdyaXRpbmcgb3V0IGFuZCByZW1vdmluZyB0aGUgdHVw bGUgSURzIHRoYXQKKyAqIHdlIGtub3cgY2FuJ3QgY2hhbmdlIGJ5IGZ1dHVyZSBtZXJnZXMu IFdlIGNhbiBkZWR1Y2UgdGhlIFRJRCB1cCB0byB3aGljaAorICogdGhpcyBpcyBndWFyYW50 ZWVkIGZyb20gdGhlICJmaXJzdCIgVElEIGluIGVhY2ggR0lOIHR1cGxlLCB3aGljaCBwcm92 aWRlcworICogYSAiaG9yaXpvbiIgKGZvciBhIGdpdmVuIGtleSkgdGhhbmtzIHRvIHRoZSBz b3J0LgorICoKKyAqIFdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyB0b28gb2Z0ZW4gLSBjb21w cmVzc2luZyBsb25nZXIgVElEIGxpc3RzIGlzIG1vcmUKKyAqIGVmZmljaWVudC4gQnV0IHdl IGFsc28gZG9uJ3Qgd2FudCB0byBhY2N1bXVsYXRlIHRvbyBtYW55IFRJRHMsIGZvciB0d28K KyAqIHJlYXNvbnMuIEZpcnN0LCBpdCBjb25zdW1lcyBtZW1vcnkgYW5kIHdlIG1pZ2h0IGV4 Y2VlZCBtYWludGVuYW5jZV93b3JrX21lbQorICogKG9yIHdoYXRldmVyIGxpbWl0IGFwcGxp ZXMpLCBldmVuIGlmIHRoYXQncyB1bmxpa2VseSBiZWNhdXNlIFRJRHMgYXJlIHZlcnkKKyAq IHNtYWxsIHNvIHdlIGNhbiBmaXQgYSBsb3Qgb2YgdGhlbS4gU2Vjb25kLCBhbmQgbW9yZSBp bXBvcnRhbnRseSwgbG9uZyBUSUQKKyAqIGxpc3RzIGFyZSBhbiBpc3N1ZSBpZiB0aGUgc2Nh biB3cmFwcyBhcm91bmQsIGJlY2F1c2UgYSBrZXkgbWF5IGdldCBhIHZlcnkKKyAqIHdpZGUg bGlzdCAod2l0aCBtaW4vbWF4IFRJRCBmb3IgdGhhdCBrZXkpLCBmb3JjaW5nICJmdWxsIiBt ZXJnZXNvcnRzIGZvcgorICogZXZlcnkgbGlzdCBtZXJnZWQgaW50byBpdCAoaW5zdGVhZCBv ZiB0aGUgZWZmaWNpZW50IGFwcGVuZCkuCisgKgorICogU28gd2UgbG9vayBhdCB0d28gdGhp bmdzIHdoZW4gZGVjaWRpbmcgaWYgdG8gdHJpbSAtIGlmIHRoZSByZXN1bHRpbmcgbGlzdAor ICogKGFmdGVyIGFkZGluZyBUSURzIGZyb20gdGhlIG5ldyB0dXBsZSkgd291bGQgYmUgdG9v IGxvbmcsIGFuZCBpZiB0aGVyZSBpcworICogZW5vdWdoIFRJRHMgdG8gdHJpbSAod2l0aCB2 YWx1ZXMgbGVzcyB0aGFuICJmaXJzdCIgVElEIGZyb20gdGhlIG5ldyB0dXBsZSksCisgKiB3 ZSBkbyB0aGUgdHJpbS4gQnkgZW5vdWdoIHdlIG1lYW4gYXQgbGVhc3QgMTI4IFRJRHMgKG1v c3RseSBhbiBhcmJpdHJhcnkKKyAqIG51bWJlcikuCisgKgorICogWFhYIFRoaXMgZG9lcyBo ZWxwIGZvciB0aGUgd3JhcCBhcm91bmQgY2FzZSwgYmVjYXVzZSB0aGUgIndpZGUiIFRJRCBs aXN0CisgKiBpcyBlc3NlbnRpYWxseSB0d28gcmFuZ2VzIC0gb25lIGF0IHRoZSBiZWdpbm5p bmcgb2YgdGhlIHRhYmxlLCBvbmUgYXQgdGhlCisgKiBlbmQuIEFuZCBhbGwgdGhlIG90aGVy IHJhbmdlcyAoZnJvbSBHSU4gdHVwbGVzKSBjb21lIGluIGJldHdlZW4sIGFuZCBhbHNvCisg KiBkbyBub3Qgb3ZlcmxhcC4gU28gYnkgdHJpbW1pbmcgdXAgdG8gdGhlIHJhbmdlIHdlJ3Jl IGFib3V0IHRvIGFkZCwgdGhpcworICogZ3VhcmFudGVlcyB3ZSdsbCBiZSBhYmxlIHRvICJj b25jYXRlbmF0ZSIgdGhlIHR3byBsaXN0cyBjaGVhcGx5LgorICovCitzdGF0aWMgYm9vbAor R2luQnVmZmVyU2hvdWxkVHJpbShHaW5CdWZmZXIgKmJ1ZmZlciwgR2luVHVwbGUgKnR1cCkK K3sKKwkvKiBub3QgZW5vdWdoIFRJRHMgdG8gdHJpbSAoMTAyNCBpcyBzb21ld2hhdCBhcmJp dHJhcnkgbnVtYmVyKSAqLworCWlmIChidWZmZXItPm5mcm96ZW4gPCAxMDI0KQorCQlyZXR1 cm4gZmFsc2U7CisKKwkvKiBXZSdyZSBub3QgdG8gaGl0IHRoZSBtZW1vcnkgbGltaXQgYWZ0 ZXIgYWRkaW5nIHRoaXMgdHVwbGUuICovCisJaWYgKChidWZmZXItPm5pdGVtcyArIHR1cC0+ bml0ZW1zKSA8IGJ1ZmZlci0+bWF4aXRlbXMpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJ ICogT0ssIHdlIGhhdmUgZW5vdWdoIGZyb3plbiBUSURzIHRvIGZsdXNoLCBhbmQgd2UgaGF2 ZSBoaXQgdGhlIG1lbW9yeQorCSAqIGxpbWl0LCBzbyBpdCdzIHRpbWUgdG8gd3JpdGUgaXQg b3V0LgorCSAqLworCXJldHVybiB0cnVlOworfQorCiAvKgogICogR2luQnVmZmVyU3RvcmVU dXBsZQogICoJCUFkZCBkYXRhIGZyb20gYSBHaW5UdXBsZSBpbnRvIHRoZSBHaW5CdWZmZXIu CkBAIC0xMjU5LDYgKzEzMjUsMTEgQEAgR2luQnVmZmVyS2V5RXF1YWxzKEdpbkJ1ZmZlciAq YnVmZmVyLCBHaW5UdXBsZSAqdHVwKQogICogb25jZSwgc28gdGhlcmUncyBnb2luZyB0byBi ZSBvbmx5IHN1Y2ggd2lkZSBsaXN0LCBhbmQgaXQnbGwgYmUgc29ydGVkCiAgKiBmaXJzdCAo YmVjYXVzZSBpdCBoYXMgdGhlIGxvd2VzdCBUSUQgZm9yIHRoZSBrZXkpLiBTbyB3ZSdkIGRv IHRoaXMgYXQKICAqIG1vc3Qgb25jZSBwZXIga2V5LgorICoKKyAqIFhYWCBNYXliZSB3ZSBj b3VsZC9zaG91bGQgYWxsb2NhdGUgdGhlIGJ1ZmZlciBvbmNlIGFuZCB0aGVuIGtlZXAgaXQK KyAqIHdpdGhvdXQgcGFsbG9jL3BmcmVlLiBUaGF0IHdvbid0IGhlbHAgd2hlbiBqdXN0IGNh bGxpbmcgdGhlIG1lcmdlc29ydCwKKyAqIGFzIHRoYXQgZG9lcyBwYWxsb2MgaW50ZXJuYWxs eSwgYnV0IGlmIHdlIGRldGVjdGVkIHRoZSBhcHBlbmQgY2FzZSwKKyAqIHdlIGNvdWxkIGRv IHdpdGhvdXQgaXQuIE5vdCBzdXJlIGhvdyBtdWNoIG92ZXJoZWFkIGl0IGlzLCB0aG91Z2gu CiAgKi8KIHN0YXRpYyB2b2lkCiBHaW5CdWZmZXJTdG9yZVR1cGxlKEdpbkJ1ZmZlciAqYnVm ZmVyLCBHaW5UdXBsZSAqdHVwKQpAQCAtMTI4NywyNiArMTM1OCw4MiBAQCBHaW5CdWZmZXJT dG9yZVR1cGxlKEdpbkJ1ZmZlciAqYnVmZmVyLCBHaW5UdXBsZSAqdHVwKQogCQkJYnVmZmVy LT5rZXkgPSAoRGF0dW0pIDA7CiAJfQogCisJLyoKKwkgKiBUcnkgZnJlZXplIFRJRHMgYXQg dGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCwgaS5lLiBleGNsdWRlIHRoZW0gZnJvbQorCSAq IHRoZSBtZXJnZXNvcnQuIFdlIGNhbiBkbyB0aGF0IHdpdGggVElEcyBiZWZvcmUgdGhlIGZp cnN0IFRJRCBpbiB0aGUgbmV3CisJICogdHVwbGUgd2UncmUgYWJvdXQgdG8gYWRkIGludG8g dGhlIGJ1ZmZlci4KKwkgKgorCSAqIFdlIGRvIHRoaXMgaW5jcmVtZW50YWxseSB3aGVuIGFk ZGluZyBkYXRhIGludG8gdGhlIGluLW1lbW9yeSBidWZmZXIsCisJICogYW5kIG5vdCBsYXRl ciAoZS5nLiB3aGVuIGhpdHRpbmcgYSBtZW1vcnkgbGltaXQpLCBiZWNhdXNlIGl0IGFsbG93 cyB1cworCSAqIHRvIHNraXAgdGhlIGZyb3plbiBkYXRhIGR1cmluZyB0aGUgbWVyZ2Vzb3J0 LCBtYWtpbmcgaXQgY2hlYXBlci4KKwkgKi8KKworCS8qCisJICogQ2hlY2sgaWYgdGhlIGxh c3QgVElEIGluIHRoZSBjdXJyZW50IGxpc3QgaXMgZnJvemVuLiBUaGlzIGlzIHRoZSBjYXNl CisJICogd2hlbiBtZXJnaW5nIG5vbi1vdmVybGFwcGluZyBsaXN0cywgZS5nLiBpbiBlYWNo IHBhcmFsbGVsIHdvcmtlci4KKwkgKi8KKwlpZiAoKGJ1ZmZlci0+bml0ZW1zID4gMCkgJiYK KwkJKEl0ZW1Qb2ludGVyQ29tcGFyZSgmYnVmZmVyLT5pdGVtc1tidWZmZXItPm5pdGVtcyAt IDFdLCAmdHVwLT5maXJzdCkgPT0gMCkpCisJCWJ1ZmZlci0+bmZyb3plbiA9IGJ1ZmZlci0+ bml0ZW1zOworCisJLyoKKwkgKiBOb3cgc2VhcmNoIHRoZSBsaXN0IGxpbmVhcmx5LCB0byBm aW5kIHRoZSBsYXN0IGZyb3plbiBUSUQuIElmIHdlIGZvdW5kCisJICogdGhlIHdob2xlIGxp c3QgaXMgZnJvemVuLCB0aGlzIGp1c3QgZG9lcyBub3RoaW5nLgorCSAqCisJICogU3RhcnQg d2l0aCB0aGUgZmlyc3Qgbm90LXlldC1mcm96ZW4gdHVwbGUsIGFuZCB3YWxrIHVudGlsIHdl IGZpbmQgdGhlCisJICogZmlyc3QgVElEIHRoYXQncyBoaWdoZXIuCisJICoKKwkgKiBYWFgg TWF5YmUgdGhpcyBzaG91bGQgZG8gYSBiaW5hcnkgc2VhcmNoIGlmIHRoZSBudW1iZXIgb2Yg Im5vbi1mcm96ZW4iCisJICogaXRlbXMgaXMgc3VmZmljaWVudGx5IGhpZ2ggKGVub3VnaCB0 byBtYWtlIGxpbmVhciBzZWFyY2ggc2xvd2VyIHRoYW4KKwkgKiBiaW5zZWFyY2gpLgorCSAq LworCWZvciAoaW50IGkgPSBidWZmZXItPm5mcm96ZW47IGkgPCBidWZmZXItPm5pdGVtczsg aSsrKQorCXsKKwkJLyogSXMgdGhlIFRJRCBhZnRlciB0aGUgZmlyc3QgVElEIG9mIHRoZSBu ZXcgdHVwbGU/IENhbid0IGZyZWV6ZS4gKi8KKwkJaWYgKEl0ZW1Qb2ludGVyQ29tcGFyZSgm YnVmZmVyLT5pdGVtc1tpXSwgJnR1cC0+Zmlyc3QpID4gMCkKKwkJCWJyZWFrOworCisJCWJ1 ZmZlci0+bmZyb3plbisrOworCX0KKwogCS8qCiAJICogQ29weSB0aGUgbmV3IFRJRHMgaW50 byB0aGUgYnVmZmVyLCBjb21iaW5lIHdpdGggZXhpc3RpbmcgZGF0YSAoaWYgYW55KQogCSAq IHVzaW5nIG1lcmdlLXNvcnQuIFRoZSBtZXJnZXNvcnQgaXMgYWxyZWFkeSBzbWFydCBhYm91 dCBjYXNlcyB3aGVyZSBpdAogCSAqIGNhbiBzaW1wbHkgY29uY2F0ZW5hdGUgdGhlIHR3byBs aXN0cywgYW5kIHdoZW4gaXQgYWN0dWFsbHkgbmVlZHMgdG8KIAkgKiBtZXJnZSB0aGUgZGF0 YSBpbiBhbiBleHBlbnNpdmUgd2F5LgorCSAqCisJICogWFhYIFdlIGNvdWxkIGNoZWNrIGlm IChidWZmZXItPm5pdGVtcyA+IGJ1ZmZlci0+bmZyb3plbikgYW5kIG9ubHkgZG8KKwkgKiB0 aGUgbWVyZ2Vzb3J0IGluIHRoYXQgY2FzZS4gZ2luTWVyZ2VJdGVtUG9pbnRlcnMgZG9lcyBz b21lIHBhbGxvYworCSAqIGludGVybmFsbHksIGFuZCB0aGlzIHdheSB3ZSBjb3VsZCBlbGlt aW5hdGUgdGhhdC4gQnV0IGxldCdzIGtlZXAgdGhlCisJICogY29kZSBzaW1wbGUgZm9yIG5v dy4KIAkgKi8KIAl7CiAJCWludAkJCW5uZXc7CiAJCUl0ZW1Qb2ludGVyIG5ldzsKIAotCQlu ZXcgPSBnaW5NZXJnZUl0ZW1Qb2ludGVycyhidWZmZXItPml0ZW1zLCBidWZmZXItPm5pdGVt cywKKwkJLyoKKwkJICogUmVzaXplIHRoZSBhcnJheSAtIHdlIGRvIHRoaXMgZmlyc3QsIGJl Y2F1c2Ugd2UnbGwgZGVyZWZlcmVuY2UgdGhlCisJCSAqIGZpcnN0IHVuZnJvemVuIFRJRCwg d2hpY2ggd291bGQgZmFpbCBpZiB0aGUgYXJyYXkgaXMgTlVMTC4gV2UnbGwKKwkJICogc3Rp bGwgcGFzcyAwIGFzIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGF0IGFycmF5IHRob3VnaC4K KwkJICovCisJCWlmIChidWZmZXItPml0ZW1zID09IE5VTEwpCisJCQlidWZmZXItPml0ZW1z ID0gcGFsbG9jKChidWZmZXItPm5pdGVtcyArIHR1cC0+bml0ZW1zKSAqIHNpemVvZihJdGVt UG9pbnRlckRhdGEpKTsKKwkJZWxzZQorCQkJYnVmZmVyLT5pdGVtcyA9IHJlcGFsbG9jKGJ1 ZmZlci0+aXRlbXMsCisJCQkJCQkJCQkgKGJ1ZmZlci0+bml0ZW1zICsgdHVwLT5uaXRlbXMp ICogc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkpOworCisJCW5ldyA9IGdpbk1lcmdlSXRlbVBv aW50ZXJzKCZidWZmZXItPml0ZW1zW2J1ZmZlci0+bmZyb3plbl0sIC8qIGZpcnN0IHVuZnJv bnplbiAqLworCQkJCQkJCQkgICAoYnVmZmVyLT5uaXRlbXMgLSBidWZmZXItPm5mcm96ZW4p LAkvKiBudW0gb2YgdW5mcm96ZW4gKi8KIAkJCQkJCQkJICAgaXRlbXMsIHR1cC0+bml0ZW1z LCAmbm5ldyk7CiAKLQkJQXNzZXJ0KG5uZXcgPT0gYnVmZmVyLT5uaXRlbXMgKyB0dXAtPm5p dGVtcyk7CisJCUFzc2VydChubmV3ID09ICh0dXAtPm5pdGVtcyArIChidWZmZXItPm5pdGVt cyAtIGJ1ZmZlci0+bmZyb3plbikpKTsKKworCQltZW1jcHkoJmJ1ZmZlci0+aXRlbXNbYnVm ZmVyLT5uZnJvemVuXSwgbmV3LAorCQkJICAgbm5ldyAqIHNpemVvZihJdGVtUG9pbnRlckRh dGEpKTsKIAotCQlpZiAoYnVmZmVyLT5pdGVtcykKLQkJCXBmcmVlKGJ1ZmZlci0+aXRlbXMp OworCQlwZnJlZShuZXcpOwogCi0JCWJ1ZmZlci0+aXRlbXMgPSBuZXc7Ci0JCWJ1ZmZlci0+ bml0ZW1zID0gbm5ldzsKKwkJYnVmZmVyLT5uaXRlbXMgKz0gdHVwLT5uaXRlbXM7CiAKIAkJ QXNzZXJ0Q2hlY2tJdGVtUG9pbnRlcnMoYnVmZmVyLCB0cnVlKTsKIAl9CkBAIC0xMzMyLDYg KzE0NTksNyBAQCBHaW5CdWZmZXJSZXNldChHaW5CdWZmZXIgKmJ1ZmZlcikKIAlidWZmZXIt PmNhdGVnb3J5ID0gMDsKIAlidWZmZXItPmtleWxlbiA9IDA7CiAJYnVmZmVyLT5uaXRlbXMg PSAwOworCWJ1ZmZlci0+bmZyb3plbiA9IDA7CiAKIAlidWZmZXItPnR5cGxlbiA9IDA7CiAJ YnVmZmVyLT50eXBieXZhbCA9IDA7CkBAIC0xMzQ0LDYgKzE0NzIsMjMgQEAgR2luQnVmZmVy UmVzZXQoR2luQnVmZmVyICpidWZmZXIpCiAJLyogWFhYIHNob3VsZCBkbyBzb21ldGhpbmcg d2l0aCBleHRyZW1lbHkgbGFyZ2UgYXJyYXkgb2YgaXRlbXM/ICovCiB9CiAKKy8qCisgKiBH aW5CdWZmZXJUcmltCisgKgkJRGlzY2FyZCB0aGUgImZyb3plbiIgcGFydCBvZiB0aGUgVElE IGxpc3QgKHdoaWNoIHNob3VsZCBoYXZlIGJlZW4KKyAqCQl3cml0dGVuIHRvIGRpc2svaW5k ZXggYmVmb3JlIHRoaXMgY2FsbCkuCisgKi8KK3N0YXRpYyB2b2lkCitHaW5CdWZmZXJUcmlt KEdpbkJ1ZmZlciAqYnVmZmVyKQoreworCUFzc2VydCgoYnVmZmVyLT5uZnJvemVuID4gMCkg JiYgKGJ1ZmZlci0+bmZyb3plbiA8PSBidWZmZXItPm5pdGVtcykpOworCisJbWVtbW92ZSgm YnVmZmVyLT5pdGVtc1swXSwgJmJ1ZmZlci0+aXRlbXNbYnVmZmVyLT5uZnJvemVuXSwKKwkJ CXNpemVvZihJdGVtUG9pbnRlckRhdGEpICogKGJ1ZmZlci0+bml0ZW1zIC0gYnVmZmVyLT5u ZnJvemVuKSk7CisKKwlidWZmZXItPm5pdGVtcyAtPSBidWZmZXItPm5mcm96ZW47CisJYnVm ZmVyLT5uZnJvemVuID0gMDsKK30KKwogLyogWFhYIHByb2JhYmx5IHdvdWxkIGJlIGJldHRl ciB0byBoYXZlIGEgbWVtb3J5IGNvbnRleHQgZm9yIHRoZSBidWZmZXIgKi8KIHN0YXRpYyB2 b2lkCiBHaW5CdWZmZXJGcmVlKEdpbkJ1ZmZlciAqYnVmZmVyKQpAQCAtMTQwMiw3ICsxNTQ3 LDEyIEBAIF9naW5fcGFyYWxsZWxfbWVyZ2UoR2luQnVpbGRTdGF0ZSAqc3RhdGUpCiAJLyog ZG8gdGhlIGFjdHVhbCBzb3J0IGluIHRoZSBsZWFkZXIgKi8KIAl0dXBsZXNvcnRfcGVyZm9y bXNvcnQoc3RhdGUtPmJzX3NvcnRzdGF0ZSk7CiAKLQkvKiBpbml0aWFsaXplIGJ1ZmZlciB0 byBjb21iaW5lIGVudHJpZXMgZm9yIHRoZSBzYW1lIGtleSAqLworCS8qCisJICogSW5pdGlh bGl6ZSBidWZmZXIgdG8gY29tYmluZSBlbnRyaWVzIGZvciB0aGUgc2FtZSBrZXkuCisJICoK KwkgKiBUaGUgbGVhZGVyIGlzIGFsbG93ZWQgdG8gdXNlIHRoZSB3aG9sZSBtYWludGVuYW5j ZV93b3JrX21lbSBidWZmZXIgdG8KKwkgKiBjb21iaW5lIGRhdGEuIFRoZSBwYXJhbGxlbCB3 b3JrZXJzIGFscmVhZHkgY29tcGxldGVkLgorCSAqLwogCWJ1ZmZlciA9IEdpbkJ1ZmZlcklu aXQoKTsKIAogCS8qCkBAIC0xNDQyLDYgKzE1OTIsMzYgQEAgX2dpbl9wYXJhbGxlbF9tZXJn ZShHaW5CdWlsZFN0YXRlICpzdGF0ZSkKIAkJCUdpbkJ1ZmZlclJlc2V0KGJ1ZmZlcik7CiAJ CX0KIAorCQkvKgorCQkgKiBXZSdyZSBhYm91dCB0byBhZGQgYSBHSU4gdHVwbGUgdG8gdGhl IGJ1ZmZlciAtIGNoZWNrIHRoZSBtZW1vcnkKKwkJICogbGltaXQgZmlyc3QsIGFuZCBtYXli ZSB3cml0ZSBvdXQgc29tZSBvZiB0aGUgZGF0YSBpbnRvIHRoZSBpbmRleAorCQkgKiBmaXJz dCwgaWYgbmVlZGVkIChhbmQgcG9zc2libGUpLiBXZSBvbmx5IGZsdXNoIHRoZSBwYXJ0IG9m IHRoZSBUSUQKKwkJICogbGlzdCB0aGF0IHdlIGtub3cgd29uJ3QgY2hhbmdlLCBhbmQgb25s eSBpZiB0aGVyZSdzIGVub3VnaCBkYXRhIGZvcgorCQkgKiBjb21wcmVzc2lvbiB0byB3b3Jr IHdlbGwuCisJCSAqCisJCSAqIFhYWCBUaGUgYnVmZmVyIG1heSBhbHNvIGJlIGVtcHR5LCBi dXQgaW4gdGhhdCBjYXNlIHdlIHNraXAgdGhpcy4KKwkJICovCisJCWlmIChHaW5CdWZmZXJT aG91bGRUcmltKGJ1ZmZlciwgdHVwKSkKKwkJeworCQkJQXNzZXJ0KGJ1ZmZlci0+bmZyb3pl biA+IDApOworCisJCQlzdGF0ZS0+YnVpbGRTdGF0cy5uVHJpbXMrKzsKKworCQkJLyoKKwkJ CSAqIEJ1ZmZlciBpcyBub3QgZW1wdHkgYW5kIGl0J3Mgc3RvcmluZyBhIGRpZmZlcmVudCBr ZXkgLSBmbHVzaAorCQkJICogdGhlIGRhdGEgaW50byB0aGUgaW5zZXJ0LCBhbmQgc3RhcnQg YSBuZXcgZW50cnkgZm9yIGN1cnJlbnQKKwkJCSAqIEdpblR1cGxlLgorCQkJICovCisJCQlB c3NlcnRDaGVja0l0ZW1Qb2ludGVycyhidWZmZXIsIHRydWUpOworCisJCQlnaW5FbnRyeUlu c2VydCgmc3RhdGUtPmdpbnN0YXRlLAorCQkJCQkJICAgYnVmZmVyLT5hdHRudW0sIGJ1ZmZl ci0+a2V5LCBidWZmZXItPmNhdGVnb3J5LAorCQkJCQkJICAgYnVmZmVyLT5pdGVtcywgYnVm ZmVyLT5uZnJvemVuLCAmc3RhdGUtPmJ1aWxkU3RhdHMpOworCisJCQkvKiB0cnVuY2F0ZSB0 aGUgZGF0YSB3ZSd2ZSBqdXN0IGRpc2NhcmRlZCAqLworCQkJR2luQnVmZmVyVHJpbShidWZm ZXIpOworCQl9CisKIAkJLyoKIAkJICogUmVtZW1iZXIgZGF0YSBmb3IgdGhlIGN1cnJlbnQg dHVwbGUgKGVpdGhlciByZW1lbWJlciB0aGUgbmV3IGtleSwKIAkJICogb3IgYXBwZW5kIGlm IHRvIHRoZSBleGlzdGluZyBkYXRhKS4KQEAgLTE0NjUsNiArMTY0NSw4IEBAIF9naW5fcGFy YWxsZWxfbWVyZ2UoR2luQnVpbGRTdGF0ZSAqc3RhdGUpCiAJLyogcmVsYXNlIGFsbCB0aGUg bWVtb3J5ICovCiAJR2luQnVmZmVyRnJlZShidWZmZXIpOwogCisJZWxvZyhMT0csICJfZ2lu X3BhcmFsbGVsX21lcmdlIG50cmltcyAlbGQiLCBzdGF0ZS0+YnVpbGRTdGF0cy5uVHJpbXMp OworCiAJdHVwbGVzb3J0X2VuZChzdGF0ZS0+YnNfc29ydHN0YXRlKTsKIAogCXJldHVybiBy ZWx0dXBsZXM7CkBAIC0xNTI1LDcgKzE3MDcsMTMgQEAgX2dpbl9wcm9jZXNzX3dvcmtlcl9k YXRhKEdpbkJ1aWxkU3RhdGUgKnN0YXRlLCBUdXBsZXNvcnRzdGF0ZSAqd29ya2VyX3NvcnQp CiAKIAlHaW5CdWZmZXIgICpidWZmZXI7CiAKLQkvKiBpbml0aWFsaXplIGJ1ZmZlciB0byBj b21iaW5lIGVudHJpZXMgZm9yIHRoZSBzYW1lIGtleSAqLworCS8qCisJICogSW5pdGlhbGl6 ZSBidWZmZXIgdG8gY29tYmluZSBlbnRyaWVzIGZvciB0aGUgc2FtZSBrZXkuCisJICoKKwkg KiBUaGUgd29ya2VycyBhcmUgbGltaXRlZCB0byB0aGUgc2FtZSBhbW91bnQgb2YgbWVtb3J5 IGFzIGR1cmluZyB0aGUgc29ydAorCSAqIGluIGdpbkJ1aWxkQ2FsbGJhY2tQYXJhbGxlbC4g QnV0IHRoaXMgcHJvYmFibHkgc2hvdWxkIGJlIHRoZSAzMk1CIHVzZWQKKwkgKiBkdXJpbmcg cGxhbm5pbmcsIGp1c3QgbGlrZSB0aGVyZS4KKwkgKi8KIAlidWZmZXIgPSBHaW5CdWZmZXJJ bml0KCk7CiAKIAkvKiBzb3J0IHRoZSByYXcgcGVyLXdvcmtlciBkYXRhICovCkBAIC0xNTc4 LDYgKzE3NjYsNDMgQEAgX2dpbl9wcm9jZXNzX3dvcmtlcl9kYXRhKEdpbkJ1aWxkU3RhdGUg KnN0YXRlLCBUdXBsZXNvcnRzdGF0ZSAqd29ya2VyX3NvcnQpCiAJCQlHaW5CdWZmZXJSZXNl dChidWZmZXIpOwogCQl9CiAKKwkJLyoKKwkJICogV2UncmUgYWJvdXQgdG8gYWRkIGEgR0lO IHR1cGxlIHRvIHRoZSBidWZmZXIgLSBjaGVjayB0aGUgbWVtb3J5CisJCSAqIGxpbWl0IGZp cnN0LCBhbmQgbWF5YmUgd3JpdGUgb3V0IHNvbWUgb2YgdGhlIGRhdGEgaW50byB0aGUgaW5k ZXgKKwkJICogZmlyc3QsIGlmIG5lZWRlZCAoYW5kIHBvc3NpYmxlKS4gV2Ugb25seSBmbHVz aCB0aGUgcGFydCBvZiB0aGUgVElECisJCSAqIGxpc3QgdGhhdCB3ZSBrbm93IHdvbid0IGNo YW5nZSwgYW5kIG9ubHkgaWYgdGhlcmUncyBlbm91Z2ggZGF0YSBmb3IKKwkJICogY29tcHJl c3Npb24gdG8gd29yayB3ZWxsLgorCQkgKgorCQkgKiBYWFggVGhlIGJ1ZmZlciBtYXkgYWxz byBiZSBlbXB0eSwgYnV0IGluIHRoYXQgY2FzZSB3ZSBza2lwIHRoaXMuCisJCSAqLworCQlp ZiAoR2luQnVmZmVyU2hvdWxkVHJpbShidWZmZXIsIHR1cCkpCisJCXsKKwkJCUdpblR1cGxl ICAgKm50dXA7CisJCQlTaXplCQludHVwbGVuOworCisJCQlBc3NlcnQoYnVmZmVyLT5uZnJv emVuID4gMCk7CisKKwkJCXN0YXRlLT5idWlsZFN0YXRzLm5UcmltcysrOworCisJCQkvKgor CQkJICogQnVmZmVyIGlzIG5vdCBlbXB0eSBhbmQgaXQncyBzdG9yaW5nIGEgZGlmZmVyZW50 IGtleSAtIGZsdXNoCisJCQkgKiB0aGUgZGF0YSBpbnRvIHRoZSBpbnNlcnQsIGFuZCBzdGFy dCBhIG5ldyBlbnRyeSBmb3IgY3VycmVudAorCQkJICogR2luVHVwbGUuCisJCQkgKi8KKwkJ CUFzc2VydENoZWNrSXRlbVBvaW50ZXJzKGJ1ZmZlciwgdHJ1ZSk7CisKKwkJCW50dXAgPSBf Z2luX2J1aWxkX3R1cGxlKHN0YXRlLCBidWZmZXItPmF0dG51bSwgYnVmZmVyLT5jYXRlZ29y eSwKKwkJCQkJCQkJCWJ1ZmZlci0+a2V5LCBidWZmZXItPnR5cGxlbiwgYnVmZmVyLT50eXBi eXZhbCwKKwkJCQkJCQkJCWJ1ZmZlci0+aXRlbXMsIGJ1ZmZlci0+bmZyb3plbiwgJm50dXBs ZW4pOworCisJCQl0dXBsZXNvcnRfcHV0Z2ludHVwbGUoc3RhdGUtPmJzX3NvcnRzdGF0ZSwg bnR1cCwgbnR1cGxlbik7CisKKwkJCXBmcmVlKG50dXApOworCisJCQkvKiB0cnVuY2F0ZSB0 aGUgZGF0YSB3ZSd2ZSBqdXN0IGRpc2NhcmRlZCAqLworCQkJR2luQnVmZmVyVHJpbShidWZm ZXIpOworCQl9CisKIAkJLyoKIAkJICogUmVtZW1iZXIgZGF0YSBmb3IgdGhlIGN1cnJlbnQg dHVwbGUgKGVpdGhlciByZW1lbWJlciB0aGUgbmV3IGtleSwKIAkJICogb3IgYXBwZW5kIGlm IHRvIHRoZSBleGlzdGluZyBkYXRhKS4KQEAgLTE2MTMsNiArMTgzOCw4IEBAIF9naW5fcHJv Y2Vzc193b3JrZXJfZGF0YShHaW5CdWlsZFN0YXRlICpzdGF0ZSwgVHVwbGVzb3J0c3RhdGUg Kndvcmtlcl9zb3J0KQogCQkgc3RhdGUtPmJ1aWxkU3RhdHMuc2l6ZVJhdywgc3RhdGUtPmJ1 aWxkU3RhdHMuc2l6ZUNvbXByZXNzZWQsCiAJCSAoMTAwLjAgKiBzdGF0ZS0+YnVpbGRTdGF0 cy5zaXplQ29tcHJlc3NlZCkgLyBzdGF0ZS0+YnVpbGRTdGF0cy5zaXplUmF3KTsKIAorCWVs b2coTE9HLCAiX2dpbl9wcm9jZXNzX3dvcmtlcl9kYXRhIHRyaW1zICVsZCIsIHN0YXRlLT5i dWlsZFN0YXRzLm5Ucmltcyk7CisKIAl0dXBsZXNvcnRfZW5kKHdvcmtlcl9zb3J0KTsKIH0K IApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbi5oIGIvc3JjL2luY2x1ZGUv YWNjZXNzL2dpbi5oCmluZGV4IDJiNjYzM2QwNjhhLi45MzgxMzI5ZmFjNSAxMDA2NDQKLS0t IGEvc3JjL2luY2x1ZGUvYWNjZXNzL2dpbi5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9n aW4uaApAQCAtNTEsNiArNTEsNyBAQCB0eXBlZGVmIHN0cnVjdCBHaW5TdGF0c0RhdGEKIAlp bnQzMgkJZ2luVmVyc2lvbjsKIAlTaXplCQlzaXplUmF3OwogCVNpemUJCXNpemVDb21wcmVz c2VkOworCWludDY0CQluVHJpbXM7CiB9IEdpblN0YXRzRGF0YTsKIAogLyoKLS0gCjIuNDQu MAoK --------------5ATIJri30SzyV9JJnS7e1Mjr Content-Type: text/x-patch; charset=UTF-8; name="v20240502-0007-Detect-wrap-around-in-parallel-callback.patch" Content-Disposition: attachment; filename*0="v20240502-0007-Detect-wrap-around-in-parallel-callback.patch" Content-Transfer-Encoding: base64 RnJvbSBhNTY5MDg2Y2QyZGM3MGVlMGI5MTUyOTgwZWIyMzAxZDk5ZjhjNTgwIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzLnZvbmRyYUBwb3N0 Z3Jlc3FsLm9yZz4KRGF0ZTogVGh1LCAyIE1heSAyMDI0IDE1OjIxOjU1ICswMjAwClN1Ympl Y3Q6IFtQQVRDSCB2MjAyNDA1MDIgNy84XSBEZXRlY3Qgd3JhcCBhcm91bmQgaW4gcGFyYWxs ZWwgY2FsbGJhY2sKCldoZW4gc3luYyBzY2FuIGR1cmluZyBpbmRleCBidWlsZCB3cmFwcyBh cm91bmQsIHRoYXQgbWF5IHJlc3VsdCBpbiBzb21lCmtleXMgaGF2aW5nIHZlcnkgbG9uZyBU SUQgbGlzdHMsIHJlcXVpcmluZyAiZnVsbCIgbWVyZ2Ugc29ydCBydW5zIHdoZW4KY29tYmlu aW5nIGRhdGEgaW4gd29ya2Vycy4gSXQgYWxzbyBjYXVzZXMgcHJvYmxlbXMgd2l0aCBlbmZv cmNpbmcgbWVtb3J5CmxpbWl0LCBiZWNhdXNlIHdlIGNhbid0IGp1c3QgZHVtcCB0aGUgZGF0 YSAtIHRoZSBpbmRleCBidWlsZCByZXF1aXJlcwphcHBlbmQtb25seSBwb3N0aW5nIGxpc3Rz LCBhbmQgdmlvbGF0aW5nIG1heSByZXN1bHQgaW4gZXJyb3JzIGxpa2UKCiAgRVJST1I6IGNv dWxkIG5vdCBzcGxpdCBHSU4gcGFnZTsgYWxsIG9sZCBpdGVtcyBkaWRuJ3QgZml0CgpiZWNh dXNlIGFmdGVyIHRoZSBzY2FuIHdyYXAgYXJvdW5kIHNvbWUgb2YgdGhlIFRJRHMgbWF5IGJl bG9uZyB0byB0aGUKYmVnaW5uaW5nIG9mIHRoZSBsaXN0LCBhZmZlY3RpbmcgdGhlIGNvbXBy ZXNzaW9uLgoKQnV0IHdlIGNhbiBkZWFsIHdpdGggdGhpcyBpbiB0aGUgY2FsbGJhY2sgLSBp ZiB3ZSBzZWUgdGhlIFRJRCB0byBqdW1wCmJhY2ssIHRoYXQgbXVzdCBtZWFuIGEgd3JhcGFy b3VuZCBoYXBwZW5lZC4gSW4gdGhhdCBjYXNlIHdlIHNpbXBseSBkdW1wCmFsbCB0aGUgZGF0 YSBhY2N1bXVsYXRlZCBpbiBtZW1vcnksIGFuZCBzdGFydCBmcm9tIHNjcmF0Y2guCgpUaGlz IG1lYW5zIHRoZXJlIHdvbid0IGJlIGFueSB0dXBsZXMgd2l0aCB2ZXJ5IHdpZGUgVElEIHJh bmdlcywgaW5zdGVhZAp0aGVyZSdsbCBiZSBvbmUgdHVwbGUgd2l0aCBhIHJhbmdlIGF0IHRo ZSBlbmQgb2YgdGhlIHRhYmxlLCBhbmQgYW5vdGhlcgp0dXBsZSBhdCB0aGUgYmVnaW5uaW5n LiBBbmQgYWxsIHRoZSBsaXN0cyBpbiB0aGUgd29ya2VyIHdpbGwgYmUKbm9uLW92ZXJsYXBw aW5nLCBhbmQgc29ydCBuaWNlbHkgYmFzZWQgb24gZmlyc3QgVElELgoKRm9yIHRoZSBsZWFk ZXIsIHdlIHN0aWxsIG5lZWQgdG8gZG8gdGhlIGZ1bGwgbWVyZ2UgLSB0aGUgbGlzdHMgbWF5 Cm92ZXJsYXAgYW5kIGludGVybGVhdmUgaW4gdmFyaW91cyB3YXlzLiBCdXQgdGhlcmUgc2hv dWxkIGJlIG9ubHkgdmVyeQpmZXcgb2YgdGhvc2UgbGlzdHMsIGFib3V0IG9uZSBwZXIgd29y a2VyLCBtYWtpbmcgaXQgbm90IGFuIGlzc3VlLgotLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy9n aW4vZ2luaW5zZXJ0LmMgfCA4OSArKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0KIDEg ZmlsZSBjaGFuZ2VkLCA1NSBpbnNlcnRpb25zKCspLCAzNCBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbmluc2VydC5jIGIvc3JjL2JhY2tl bmQvYWNjZXNzL2dpbi9naW5pbnNlcnQuYwppbmRleCAxZDk1NTc2OTJhMy4uYWNkZjQ1NDE2 ZmUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2luaW5zZXJ0LmMKKysr IGIvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW5pbnNlcnQuYwpAQCAtMTQyLDYgKzE0Miw3 IEBAIHR5cGVkZWYgc3RydWN0CiAJTWVtb3J5Q29udGV4dCB0bXBDdHg7CiAJTWVtb3J5Q29u dGV4dCBmdW5jQ3R4OwogCUJ1aWxkQWNjdW11bGF0b3IgYWNjdW07CisJSXRlbVBvaW50ZXJE YXRhIHRpZDsKIAogCS8qIEZJWE1FIGxpa2VseSBkdXBsaWNhdGUgd2l0aCBpbmR0dXBsZXMg Ki8KIAlkb3VibGUJCWJzX251bXR1cGxlczsKQEAgLTQ3NCw2ICs0NzUsNDcgQEAgZ2luQnVp bGRDYWxsYmFjayhSZWxhdGlvbiBpbmRleCwgSXRlbVBvaW50ZXIgdGlkLCBEYXR1bSAqdmFs dWVzLAogCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRDdHgpOwogfQogCitzdGF0aWMgdm9p ZAorZ2luRmx1c2hCdWlsZFN0YXRlKEdpbkJ1aWxkU3RhdGUgKmJ1aWxkc3RhdGUsIFJlbGF0 aW9uIGluZGV4KQoreworCUl0ZW1Qb2ludGVyRGF0YSAqbGlzdDsKKwlEYXR1bQkJa2V5Owor CUdpbk51bGxDYXRlZ29yeSBjYXRlZ29yeTsKKwl1aW50MzIJCW5saXN0OworCU9mZnNldE51 bWJlciBhdHRudW07CisJVHVwbGVEZXNjCXRkZXNjID0gUmVsYXRpb25HZXREZXNjcihpbmRl eCk7CisKKwlnaW5CZWdpbkJBU2NhbigmYnVpbGRzdGF0ZS0+YWNjdW0pOworCXdoaWxlICgo bGlzdCA9IGdpbkdldEJBRW50cnkoJmJ1aWxkc3RhdGUtPmFjY3VtLAorCQkJCQkJCQkgJmF0 dG51bSwgJmtleSwgJmNhdGVnb3J5LCAmbmxpc3QpKSAhPSBOVUxMKQorCXsKKwkJLyogaW5m b3JtYXRpb24gYWJvdXQgdGhlIGtleSAqLworCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHRyID0g VHVwbGVEZXNjQXR0cih0ZGVzYywgKGF0dG51bSAtIDEpKTsKKworCQkvKiBHSU4gdHVwbGUg YW5kIHR1cGxlIGxlbmd0aCAqLworCQlHaW5UdXBsZSAgICp0dXA7CisJCVNpemUJCXR1cGxl bjsKKworCQkvKiB0aGVyZSBjb3VsZCBiZSBtYW55IGVudHJpZXMsIHNvIGJlIHdpbGxpbmcg dG8gYWJvcnQgaGVyZSAqLworCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOworCisJCXR1cCA9 IF9naW5fYnVpbGRfdHVwbGUoYnVpbGRzdGF0ZSwgYXR0bnVtLCBjYXRlZ29yeSwKKwkJCQkJ CQkgICBrZXksIGF0dHItPmF0dGxlbiwgYXR0ci0+YXR0Ynl2YWwsCisJCQkJCQkJICAgbGlz dCwgbmxpc3QsICZ0dXBsZW4pOworCisJCXR1cGxlc29ydF9wdXRnaW50dXBsZShidWlsZHN0 YXRlLT5ic193b3JrZXJfc29ydCwgdHVwLCB0dXBsZW4pOworCisJCXBmcmVlKHR1cCk7CisJ fQorCisJTWVtb3J5Q29udGV4dFJlc2V0KGJ1aWxkc3RhdGUtPnRtcEN0eCk7CisJZ2luSW5p dEJBKCZidWlsZHN0YXRlLT5hY2N1bSk7Cit9CisKKy8qCisgKiBGSVhNRSBBbm90aGVyIHdh eSB0byBkZWFsIHdpdGggdGhlIHdyYXAgYXJvdW5kIG9mIHN5bmMgc2NhbnMgd291bGQgYmUg dG8KKyAqIGRldGVjdCB3aGVuIHRpZCB3cmFwcyBhcm91bmQgYW5kIGp1c3QgZmx1c2ggdGhl IHN0YXRlLgorICovCiBzdGF0aWMgdm9pZAogZ2luQnVpbGRDYWxsYmFja1BhcmFsbGVsKFJl bGF0aW9uIGluZGV4LCBJdGVtUG9pbnRlciB0aWQsIERhdHVtICp2YWx1ZXMsCiAJCQkJCQkg Ym9vbCAqaXNudWxsLCBib29sIHR1cGxlSXNBbGl2ZSwgdm9pZCAqc3RhdGUpCkBAIC00ODQs NiArNTI2LDE2IEBAIGdpbkJ1aWxkQ2FsbGJhY2tQYXJhbGxlbChSZWxhdGlvbiBpbmRleCwg SXRlbVBvaW50ZXIgdGlkLCBEYXR1bSAqdmFsdWVzLAogCiAJb2xkQ3R4ID0gTWVtb3J5Q29u dGV4dFN3aXRjaFRvKGJ1aWxkc3RhdGUtPnRtcEN0eCk7CiAKKwkvKiBmbHVzaCBjb250ZW50 cyBiZWZvcmUgd3JhcHBpbmcgYXJvdW5kICovCisJaWYgKEl0ZW1Qb2ludGVyQ29tcGFyZSh0 aWQsICZidWlsZHN0YXRlLT50aWQpIDwgMCkKKwl7CisJCWVsb2coTE9HLCAiY2FsbGluZyBn aW5GbHVzaEJ1aWxkU3RhdGUiKTsKKwkJZ2luRmx1c2hCdWlsZFN0YXRlKGJ1aWxkc3RhdGUs IGluZGV4KTsKKwl9CisKKwkvKiByZW1lbWJlciB0aGUgVElEIHdlJ3JlIGFib3V0IHRvIHBy b2Nlc3MgKi8KKwltZW1jcHkoJmJ1aWxkc3RhdGUtPnRpZCwgdGlkLCBzaXplb2YoSXRlbVBv aW50ZXJEYXRhKSk7CisKIAlmb3IgKGkgPSAwOyBpIDwgYnVpbGRzdGF0ZS0+Z2luc3RhdGUu b3JpZ1R1cGRlc2MtPm5hdHRzOyBpKyspCiAJCWdpbkhlYXBUdXBsZUJ1bGtJbnNlcnQoYnVp bGRzdGF0ZSwgKE9mZnNldE51bWJlcikgKGkgKyAxKSwKIAkJCQkJCQkgICB2YWx1ZXNbaV0s IGlzbnVsbFtpXSwgdGlkKTsKQEAgLTUxOCw0MCArNTcwLDcgQEAgZ2luQnVpbGRDYWxsYmFj a1BhcmFsbGVsKFJlbGF0aW9uIGluZGV4LCBJdGVtUG9pbnRlciB0aWQsIERhdHVtICp2YWx1 ZXMsCiAJICogWFhYIHByb2JhYmx5IHNob3VsZCB1c2UgMzJNQiwgbm90IHdvcmtfbWVtLCBh cyB1c2VkIGR1cmluZyBwbGFubmluZz8KIAkgKi8KIAlpZiAoYnVpbGRzdGF0ZS0+YWNjdW0u YWxsb2NhdGVkTWVtb3J5ID49IChTaXplKSB3b3JrX21lbSAqIDEwMjRMKQotCXsKLQkJSXRl bVBvaW50ZXJEYXRhICpsaXN0OwotCQlEYXR1bQkJa2V5OwotCQlHaW5OdWxsQ2F0ZWdvcnkg Y2F0ZWdvcnk7Ci0JCXVpbnQzMgkJbmxpc3Q7Ci0JCU9mZnNldE51bWJlciBhdHRudW07Ci0J CVR1cGxlRGVzYwl0ZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IoaW5kZXgpOwotCi0JCWdpbkJl Z2luQkFTY2FuKCZidWlsZHN0YXRlLT5hY2N1bSk7Ci0JCXdoaWxlICgobGlzdCA9IGdpbkdl dEJBRW50cnkoJmJ1aWxkc3RhdGUtPmFjY3VtLAotCQkJCQkJCQkJICZhdHRudW0sICZrZXks ICZjYXRlZ29yeSwgJm5saXN0KSkgIT0gTlVMTCkKLQkJewotCQkJLyogaW5mb3JtYXRpb24g YWJvdXQgdGhlIGtleSAqLwotCQkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ciA9IFR1cGxlRGVz Y0F0dHIodGRlc2MsIChhdHRudW0gLSAxKSk7Ci0KLQkJCS8qIEdJTiB0dXBsZSBhbmQgdHVw bGUgbGVuZ3RoICovCi0JCQlHaW5UdXBsZSAgICp0dXA7Ci0JCQlTaXplCQl0dXBsZW47Ci0K LQkJCS8qIHRoZXJlIGNvdWxkIGJlIG1hbnkgZW50cmllcywgc28gYmUgd2lsbGluZyB0byBh Ym9ydCBoZXJlICovCi0JCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOwotCi0JCQl0dXAgPSBf Z2luX2J1aWxkX3R1cGxlKGJ1aWxkc3RhdGUsIGF0dG51bSwgY2F0ZWdvcnksCi0JCQkJCQkJ CSAgIGtleSwgYXR0ci0+YXR0bGVuLCBhdHRyLT5hdHRieXZhbCwKLQkJCQkJCQkJICAgbGlz dCwgbmxpc3QsICZ0dXBsZW4pOwotCi0JCQl0dXBsZXNvcnRfcHV0Z2ludHVwbGUoYnVpbGRz dGF0ZS0+YnNfd29ya2VyX3NvcnQsIHR1cCwgdHVwbGVuKTsKLQotCQkJcGZyZWUodHVwKTsK LQkJfQotCi0JCU1lbW9yeUNvbnRleHRSZXNldChidWlsZHN0YXRlLT50bXBDdHgpOwotCQln aW5Jbml0QkEoJmJ1aWxkc3RhdGUtPmFjY3VtKTsKLQl9CisJCWdpbkZsdXNoQnVpbGRTdGF0 ZShidWlsZHN0YXRlLCBpbmRleCk7CiAKIAlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkQ3R4 KTsKIH0KQEAgLTU4Nyw2ICs2MDYsNyBAQCBnaW5idWlsZChSZWxhdGlvbiBoZWFwLCBSZWxh dGlvbiBpbmRleCwgSW5kZXhJbmZvICppbmRleEluZm8pCiAJYnVpbGRzdGF0ZS5ic19udW10 dXBsZXMgPSAwOwogCWJ1aWxkc3RhdGUuYnNfcmVsdHVwbGVzID0gMDsKIAlidWlsZHN0YXRl LmJzX2xlYWRlciA9IE5VTEw7CisJbWVtc2V0KCZidWlsZHN0YXRlLnRpZCwgMCwgc2l6ZW9m KEl0ZW1Qb2ludGVyRGF0YSkpOwogCiAJLyogaW5pdGlhbGl6ZSB0aGUgbWV0YSBwYWdlICov CiAJTWV0YUJ1ZmZlciA9IEdpbk5ld0J1ZmZlcihpbmRleCk7CkBAIC0yMDA3LDYgKzIwMjcs NyBAQCBfZ2luX3BhcmFsbGVsX2J1aWxkX21haW4oZHNtX3NlZ21lbnQgKnNlZywgc2htX3Rv YyAqdG9jKQogCWJ1aWxkc3RhdGUuaW5kdHVwbGVzID0gMDsKIAkvKiBYWFggc2hvdWxkbid0 IHRoaXMgaW5pdGlhbGl6ZSB0aGUgb3RoZXIgZmllZGxzLCBsaWtlIGdpbmJ1aWxkKCk/ICov CiAJbWVtc2V0KCZidWlsZHN0YXRlLmJ1aWxkU3RhdHMsIDAsIHNpemVvZihHaW5TdGF0c0Rh dGEpKTsKKwltZW1zZXQoJmJ1aWxkc3RhdGUudGlkLCAwLCBzaXplb2YoSXRlbVBvaW50ZXJE YXRhKSk7CiAKIAkvKgogCSAqIGNyZWF0ZSBhIHRlbXBvcmFyeSBtZW1vcnkgY29udGV4dCB0 aGF0IGlzIHVzZWQgdG8gaG9sZCBkYXRhIG5vdCB5ZXQKLS0gCjIuNDQuMAoK --------------5ATIJri30SzyV9JJnS7e1Mjr--