Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wIGec-007vjs-1J for pgsql-hackers@arkaria.postgresql.org; Thu, 30 Apr 2026 01:57:27 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wIGea-005HlZ-0H for pgsql-hackers@arkaria.postgresql.org; Thu, 30 Apr 2026 01:57:24 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wIGeZ-005HlL-26 for pgsql-hackers@lists.postgresql.org; Thu, 30 Apr 2026 01:57:23 +0000 Received: from mail-yx1-xb12f.google.com ([2607:f8b0:4864:20::b12f]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wIGeX-00000003u6w-15hb for pgsql-hackers@postgresql.org; Thu, 30 Apr 2026 01:57:23 +0000 Received: by mail-yx1-xb12f.google.com with SMTP id 956f58d0204a3-651bc83e74aso335731d50.2 for ; Wed, 29 Apr 2026 18:57:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1777514238; cv=none; d=google.com; s=arc-20240605; b=EzOPv1m9SJG4/I6ZXwHemip9nsWo3ECcvYtSjLKxcmwbsH9PxI0+z/gPcom4MbWSXw DyUgco1JsBlPhit7hyvmdtv6UCYZrAHwT/pKn3/0nxeaBC9YW2qCQ8DaaHHLCxy7/Ve5 vbdnwCa4VcFuDxFbD3sAG1CNFs71pbmO3/HwEmKj46FCvUSRPCXh+ozFkzHEM2BvjzBl kmTQJzcNGuw1ge+mDnNu5HfaII4yEiMhnzv8EmFtqOXa5UeFYL2nYxtgsaUq/4nKvGKf xTnWIaJsOq5MV8DA5fDvMC6Gj13sju/hutO5ArAEW722SQbCah2JTlJ4qgnRw1hqPufZ uGNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=7jZOAiVsoeRG+WDKmkGSgHBghMo893mwdqBAmcUuJ6g=; fh=FIa6CnAOcDlblDMIqVQXhn30ONA1aoHzZ0tfczHgg8I=; b=U7mGkc3LxMPYUGqSqMt32ZkS3C4M3BOcthD+D3y7HKkjG/1pxHzjP3l+6BN+Sa9yQp OcwJLIfZpMpPMpESCkI9qP4aE4d1c9U1dNExgse4oP6XG2jegkhZZKoo1EQqJXA978gv FPehiGlq7kX61p4HayQudBSycN1O3JNnx4bGgGtlKItvtjUGt0hQ6C1xzrcMS92X0Gov DDzFqPBh0aIVLcM/6YGmR+UdCi5NnLah6wjtsMwF3V4qWLr9wZP6YmZCpVT0As142qcm tZVJvf6Kv90j/xh4vfHNM15JFLRHoIK+KMhcIPVA+r36F9IJBTWNTaPy/UsPiMj69GaT U+sQ==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777514238; x=1778119038; darn=postgresql.org; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=7jZOAiVsoeRG+WDKmkGSgHBghMo893mwdqBAmcUuJ6g=; b=KhP/gwuS6hDQrb6YHjsjYLNeahFFHeciLyr0zBeqTzaxFSb0UVrR2m+9nQZFi+os3H BApnfzYI4mgPsuKowTIYdyaSW1+Y/n7w/OvmAkqljTWA7pAASxy7FHnaPsomAkDUpKqC HsN8ondlDYWhXnOTTURMY950bDQ5gFI+X+Xp9aR4UHzEdilUQan1h2haGG5/Fh2XAXYx vtTXjzGdcjYmXPafWFwO/erNvzolV2XA05pZXHldVNG4tzmt6reOePUy5tVp2Ua3MWJ3 t5S4XOih7POz8a06I4rUyM3ncF0x8BCqLHjTdECIjdnot+8J3KdMPIykiR94lvxiPzGZ 9rSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777514238; x=1778119038; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=7jZOAiVsoeRG+WDKmkGSgHBghMo893mwdqBAmcUuJ6g=; b=nfu5H4Btv0+rxwRV6al8YqCubt19uxXGSDt+1La4kxSEbDZgka/5sHAuEaMvKpZIZN Y/GURKJXSMhK3w4QpvrU+DCyxtUe0KOxzT6eO8PveibEQZCkg8mBOtS8RtbKe+rgsTLn HY9mSTmJAPY7a29CwV+4UUWXHL8q1MY4k5rxnumn+l5OGl68o3Nztbo2iOkhfvel2jMc ye7fyQgVhnLzIjN6EbX/GmdhCAKW+Ms4YHMJQYq4xd75BGqHmjUlbM+lzwKciGZLpKLt +QFEY9PSX7bwYXG/LlfzSsXYKR/X2uI8IbG3hpa+V0XzcdkeZ62t6eaPjQIAmcPcok10 dJPg== X-Gm-Message-State: AOJu0YwXB4stCjqKx+ZXGz+mzD9dWyNdXKtnyWarV3Es/tXdxL1X9dks pIr+h0XpvF2dsmRnAnkWlZUlqQk/ezAdnfUXRF6cmkcKtHHBRIf/Q8AWKGiMjI4OjxHWvxfDEdb 8kXLQuRfy1/qceVQBQfQPH/JZnfblankbjfs+UFY= X-Gm-Gg: AeBDiev/YvInp0jb1PGCsPZuALHCG9QLyxkDkfHvwL+5ok7Dhm8feivvGWKpOdc6Drs F6ARQ6mOomKK2MTT5csuIWSqRJJiFsPdJykQ5vbarSGHUkNWBEUSIOi1kJjdHpQv63k1TJxGJDp y74h6bhmqMaUMQZLsg/XHQczZn7sDE1sX1r6RmbUlSb84NW8BicZnoaOt0HWKD4gSbEUzZQUdvx 23q4WZ+dMQTl18ITwNvIrxHi7mdYLut2IPxXOJniZiykzuCmF30jzVwc4NUzRK5MimIP9B5NWZv /eQ6eJ2XAVM1kNZ/VBSQNcai2ny/2HyoUONSi7z66yc4RAEzYQ== X-Received: by 2002:a53:cb52:0:b0:65b:123:1b00 with SMTP id 956f58d0204a3-65c18c9e1f4mr586702d50.26.1777514238237; Wed, 29 Apr 2026 18:57:18 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Haibo Yan Date: Wed, 29 Apr 2026 18:57:07 -0700 X-Gm-Features: AVHnY4L7ACriv4vjXWq5F69fjqgKxUW5h8l3xkdGC-B4CTDqTGdLKtwUvVNLe4M Message-ID: Subject: Re: [PATCH] DISTINCT in plain aggregate window functions To: PostgreSQL-development Content-Type: multipart/mixed; boundary="000000000000c18cea0650a3c85c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000c18cea0650a3c85c Content-Type: multipart/alternative; boundary="000000000000c18ce80650a3c85a" --000000000000c18ce80650a3c85a Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Apr 7, 2026 at 10:31=E2=80=AFPM Haibo Yan w= rote: > Hi Hackers > > I=E2=80=99d like to start a patch series to add support for DISTINCT in p= lain > aggregate window functions. > > PostgreSQL currently rejects cases such as: > > > -------------------------------------------------------------------------= -------------------------------- > > count(DISTINCT x) OVER (PARTITION BY p) > > sum(DISTINCT x) OVER () > > > -------------------------------------------------------------------------= -------------------------------- > > My plan is to implement this incrementally, by frame class and by feature > dimension, rather than trying to solve every case in a single patch. > > For the first step, I=E2=80=99m posting patches 1-2 only and would apprec= iate your > review on those. > > Patch 1 is intentionally very small: > > > - add parse/deparse plumbing for DISTINCT in plain aggregate window > functions > - carry the information through WindowFunc > - preserve it in ruleutils / deparse > - but still reject execution > > Patch 1 by itself does not add user-visible execution support, so I think > it is best reviewed together with patch 2. > > Patch 2 adds the first real executor support: > > > - plain aggregate window functions only > - single-argument DISTINCT only > - whole-partition frames only > > That means support for cases where the frame is effectively the entire > partition, for example: > > > -------------------------------------------------------------------------= -------------------------------- > > count(DISTINCT x) OVER (PARTITION BY p) > sum(DISTINCT x) OVER () > avg(DISTINCT x) OVER ( > PARTITION BY p > ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING > ) > > > -------------------------------------------------------------------------= -------------------------------- > > The executor approach in patch 2 is deliberately conservative: > > > - collect the partition=E2=80=99s aggregate inputs > - sort and deduplicate them > - feed the distinct values into the aggregate transition function > - finalize once > - reuse the cached result for all rows in the partition > > This avoids the much harder moving-frame cases for now. > > My proposed overall roadmap is below: > > Patch 1 > > > - parse/deparse plumbing only > - allow DISTINCT to be represented on plain aggregate window functions > - preserve it through deparse / view definition > - still reject execution > > Patch 2 > > > - executor support for whole-partition frames > - plain aggregate window functions only > - single-argument DISTINCT only > - sort-and-dedup implementation > > Patch 3 > > > - executor support for non-shrinking frames > - frames starting at UNBOUNDED PRECEDING with no EXCLUDE > - incremental hash-based seen-set > - covers default ORDER BY frame and supported ... CURRENT ROW / ... > FOLLOWING cases > > Patch 4 > > > - executor support for sliding ROWS frames > - refcounted DISTINCT state > - add/remove distinct contributions as rows enter and leave the frame > - fallback to restart/recompute for aggregates without inverse > transition support > > Patch 5 > > > - extend the sliding DISTINCT machinery to sliding RANGE and GROUPS > - keep the same refcounted model > - no EXCLUDE yet > > Patch 6 > > > - support EXCLUDE clauses > - likely correctness-first, with restart/recompute where incremental > maintenance is too awkward > > Patch 7 > > > - support multi-argument DISTINCT > - upgrade DISTINCT keys from single datum to tuple/composite key > representation > > Patch 8 > > > - support aggregate ORDER BY inside window aggregates > - left until last because it is orthogonal to frame-shape support and > substantially complicates both parse representation and executor behav= ior > > In short, the roadmap is: > > > 1. plumbing > 2. whole-partition > 3. non-shrinking > 4. sliding ROWS > 5. sliding RANGE / GROUPS > 6. EXCLUDE > 7. multi-arg DISTINCT > 8. aggregate ORDER BY > > For this posting, I=E2=80=99d especially appreciate feedback on: > > > - whether patch 1 + patch 2 is a reasonable first split > - whether whole-partition-only executor support is a good first > executable step > - whether the proposed long-term breakdown seems sensible > > Thanks in advance for any review or comments. > > Best regards, > > Haibo Yan > > > I=E2=80=99ve managed to finish the first sub-series adding initial suppor= t for DISTINCT in plain aggregate window functions. Patch 1 teaches the parser and deparser to accept DISTINCT in plain window aggregates. This is representation-only and does not change execution yet. Patch 2 adds executor support for the simplest case, whole-partition frames, using a sort-and-deduplicate path. Patch 3 extends that support to non-shrinking frames, where rows only enter the frame, by using an incremental hash-based seen-set instead of restarting the aggregate for each row. Please review. Regards, Haibo --000000000000c18ce80650a3c85a Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
On Tue, Apr 7, 2026 at 10:31=E2=80=AFPM H= aibo Yan <tristan.yim@gmail.com= > wrote:

Hi Hackers

I=E2=80=99d like to start a patch series to add support= for DISTINCT in plain aggregate window functions.

PostgreSQL currently rejects cases such as:

----------------------= ---------------------------------------------------------------------------= --------

count(DISTINCT x) OVER (PARTITION BY p)

sum(DISTINCT x) =C2=A0 OVER (= )

-------------------------------------------------------------------= --------------------------------------

My plan is to implement this i= ncrementally, by frame class and by feature dimension, rather than trying t= o solve every case in a single patch.

For the first step, I=E2=80=99m= posting patches 1-2 only and would appreciate your review on those.

= Patch 1 is intentionally very small:

  • add par= se/deparse plumbing for DISTINCT in plain aggregate window fun= ctions
  • carry the information through WindowFunc
  • preserve it in ruleutils / deparse
  • but still reject execution

Patch 1 by itself does not add user-visible execution support, so = I think it is best reviewed together with patch 2.

Patch 2 adds the f= irst real executor support:

  • plain aggregate = window functions only
  • single-argument DISTINCT only
  • whole-partition frames only

That means support for cases where the frame is effectively the enti= re partition, for example:

------------------------------------------= ---------------------------------------------------------------

count= (DISTINCT x) OVER (PARTITION BY p)
sum(DISTINCT x) =C2=A0 OVER ()
avg= (DISTINCT x) =C2=A0 OVER (
=C2=A0 =C2=A0 PARTITION BY p
=C2=A0 =C2=A0= ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)

------= ---------------------------------------------------------------------------= ------------------------

The executor approach in patch 2 is delibera= tely conservative:

  • collect the partition=E2= =80=99s aggregate inputs
  • sort and deduplicate them
  • feed the= distinct values into the aggregate transition function
  • finalize on= ce
  • reuse the cached result for all rows in the partition
<= p>

This avoids the much harder moving-frame cases for now.

My pro= posed overall roadmap is below:

Patch 1

    parse/deparse plumbing only
  • allow DISTINCT to be rep= resented on plain aggregate window functions
  • preserve it through de= parse / view definition
  • still reject execution

Patch 2<= /p>

  • executor support for whole-partition frames<= /li>
  • plain aggregate window functions only
  • single-argument DISTINCT only
  • sort-and-dedup implementation

Pat= ch 3

  • executor support for non-shrinking fram= es
  • frames starting at UNBOUNDED PRECEDING with no EXCLUDE
  • incremental hash-based seen-set
  • covers def= ault ORDER BY frame and supported ... CURRENT ROW= / ... FOLLOWING cases

Patch 4

=

  • executor support for sliding ROWS frames
  • r= efcounted DISTINCT state
  • add/remove distinct contributions as rows = enter and leave the frame
  • fallback to restart/recompute for aggrega= tes without inverse transition support

Patch 5

  • extend the sliding DISTINCT machinery to sliding RANGE= and GROUPS
  • keep the same refcounted model
  • =
  • no EXCLUDE yet

Patch 6

  • support EXCLUDE clauses
  • likely co= rrectness-first, with restart/recompute where incremental maintenance is to= o awkward

Patch 7

  • support multi-= argument DISTINCT
  • upgrade DISTINCT keys from single da= tum to tuple/composite key representation

Patch 8

<= /span>

  • support aggregate ORDER BY inside window agg= regates
  • left until last because it is orthogonal to frame-shape sup= port and substantially complicates both parse representation and executor b= ehavior

In short, the roadmap is:

    plumbing
  1. whole-partition
  2. non-shrinking
  3. sliding ROWS
  4. sliding RANGE / GROUPS
  5. EXCLUDE
  6. multi-arg DISTINCT
  7. aggregate ORDER BY

For this posting, I=E2=80=99d especially app= reciate feedback on:

  • whether patch 1 + patch= 2 is a reasonable first split
  • whether whole-partition-only executo= r support is a good first executable step
  • whether the proposed long= -term breakdown seems sensible

Thanks in advance for any review= or comments.

Best regards,

Haibo Yan


I= =E2=80=99ve managed to finish the first sub-series adding initial support f= or
DISTINCT in plain aggregate window functions.

Patch 1 teaches the parser and deparser to accept DIS= TINCT in plain
window aggregates. This is representation-only and does not change
execution yet.

Patch 2 adds executor support for the simplest case, = whole-partition
frames, using a sort-and-deduplicate path.

Patch 3 extends that support to non-shrinking frames,= where rows only
enter the frame, by using an incremental hash-based seen-set instead of
restarting the aggregate for each row.

Please review.

Regards,

Haibo=C2=A0
--000000000000c18ce80650a3c85a-- --000000000000c18cea0650a3c85c Content-Type: application/octet-stream; name="v2-0003-Extend-DISTINCT-window-aggregates-to-grow-only-fr.patch" Content-Disposition: attachment; filename="v2-0003-Extend-DISTINCT-window-aggregates-to-grow-only-fr.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_moku2mpn2 RnJvbSBmM2I1ZTFmNDEwZjM2MTYyNzFjMjQ2YjBjYjMzZDVmNDZlYzhmNThjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYWlibyBZYW4gPGhhaWJvLnlhbkBhcHBsZS5jb20+CkRhdGU6 IFR1ZSwgNyBBcHIgMjAyNiAxNDo1MDoxMiAtMDcwMApTdWJqZWN0OiBbUEFUQ0ggdjIgMDMvMTBd IEV4dGVuZCBESVNUSU5DVCB3aW5kb3cgYWdncmVnYXRlcyB0byBncm93LW9ubHkKIGZyYW1lcwpN SU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgK Q29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAoKU3VwcG9ydCBESVNUSU5DVCBmb3IgZnJh bWVzIHN0YXJ0aW5nIGF0IFVOQk9VTkRFRCBQUkVDRURJTkcgd2l0aCBubwpFWENMVURFIGNsYXVz ZS4gIFRoZXNlIGZyYW1lcyBvbmx5IGdyb3csIHNvIGFuIGluY3JlbWVudGFsIGhhc2ggdGFibGUK dHJhY2tzIHZhbHVlcyBzZWVuIHNvIGZhciDigJQgbmV3IHZhbHVlcyBpbnZva2UgdGhlIHRyYW5z aXRpb24gZnVuY3Rpb24sCmR1cGxpY2F0ZXMgYXJlIHNraXBwZWQuICBUaGUgYXJndW1lbnQgdHlw ZSBtdXN0IGJlIGhhc2hhYmxlLgpXaG9sZS1wYXJ0aXRpb24gZnJhbWVzIGtlZXAgdGhlIGV4aXN0 aW5nIHNvcnQtYmFzZWQgcGF0aC4KLS0tCiBzcmMvYmFja2VuZC9leGVjdXRvci9ub2RlV2luZG93 QWdnLmMgfCAzMzMgKysrKysrKysrKysrKysrKysrKysrKysrKy0tCiBzcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL3dpbmRvdy5vdXQgfCAxOTkgKysrKysrKysrKysrKystLQogc3JjL3Rlc3QvcmVn cmVzcy9zcWwvd2luZG93LnNxbCAgICAgIHwgIDcxICsrKysrLQogMyBmaWxlcyBjaGFuZ2VkLCA1 NTggaW5zZXJ0aW9ucygrKSwgNDUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvZXhlY3V0b3Ivbm9kZVdpbmRvd0FnZy5jIGIvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZVdp bmRvd0FnZy5jCmluZGV4IDE1NTc0NWI4OTUyLi5kY2I4OTQ5NDkxZSAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvZXhlY3V0b3Ivbm9kZVdpbmRvd0FnZy5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1 dG9yL25vZGVXaW5kb3dBZ2cuYwpAQCAtMTgxLDYgKzE4MSwxNSBAQCB0eXBlZGVmIHN0cnVjdCBX aW5kb3dTdGF0ZVBlckFnZ0RhdGEKIAlPaWQJCQlzb3J0Q29sbGF0aW9uOwkvKiBjb2xsYXRpb24g Zm9yIHNvcnQvZXF1YWxpdHkgKi8KIAlib29sCQlzb3J0TnVsbHNGaXJzdDsgLyogTlVMTFMgRklS U1Q/ICovCiAJRm1nckluZm8JZXF1YWxmbjsJCS8qIGVxdWFsaXR5IGNvbXBhcmlzb24gZnVuY3Rp b24gKi8KKworCS8qIEdyb3ctb25seSBmcmFtZSBESVNUSU5DVDogaGFzaC1iYXNlZCBzZWVuLXNl dCAqLworCWJvb2wJCWRpc3RpbmN0SXNIYXNoOwkJLyogdXNpbmcgaGFzaC1iYXNlZCBpbmNyZW1l bnRhbCBESVNUSU5DVD8gKi8KKwlUdXBsZUhhc2hUYWJsZSBkaXN0aW5jdFRhYmxlOwkvKiBoYXNo IHRhYmxlIG9mIHNlZW4gdmFsdWVzLCBvciBOVUxMICovCisJTWVtb3J5Q29udGV4dCBkaXN0aW5j dENvbnRleHQ7CS8qIEJ1bXBDb250ZXh0IGZvciBoYXNoIHRhYmxlIHR1cGxlcyAqLworCVR1cGxl RGVzYwlkaXN0aW5jdFR1cGxlRGVzYzsJLyogc2luZ2xlLWNvbHVtbiB0dXBsZSBkZXNjcmlwdG9y ICovCisJVHVwbGVUYWJsZVNsb3QgKmRpc3RpbmN0U2xvdDsJLyogc2xvdCBmb3IgaGFzaCB0YWJs ZSBsb29rdXBzICovCisJT2lkCQkgICAqaGFzaEVxRnVuY09pZHM7CQkvKiBlcXVhbGl0eSBmdW5j dGlvbiBPSUQgZm9yIGhhc2ggKHBhbGxvYydkKSAqLworCUZtZ3JJbmZvICAgKmhhc2hGdW5jdGlv bnM7CQkvKiBoYXNoIGZ1bmN0aW9uIGluZm8gKHBhbGxvYydkKSAqLwogfSBXaW5kb3dTdGF0ZVBl ckFnZ0RhdGE7CiAKIHN0YXRpYyB2b2lkIGluaXRpYWxpemVfd2luZG93YWdncmVnYXRlKFdpbmRv d0FnZ1N0YXRlICp3aW5zdGF0ZSwKQEAgLTIxOCw5ICsyMjcsMTMgQEAgc3RhdGljIFdpbmRvd1N0 YXRlUGVyQWdnRGF0YSAqaW5pdGlhbGl6ZV9wZXJhZ2coV2luZG93QWdnU3RhdGUgKndpbnN0YXRl LAogc3RhdGljIERhdHVtIEdldEFnZ0luaXRWYWwoRGF0dW0gdGV4dEluaXRWYWwsIE9pZCB0cmFu c3R5cGUpOwogCiBzdGF0aWMgYm9vbCBpc193aG9sZV9wYXJ0aXRpb25fZnJhbWUoV2luZG93QWdn U3RhdGUgKndpbnN0YXRlKTsKK3N0YXRpYyBib29sIGlzX2dyb3dfb25seV9mcmFtZShXaW5kb3dB Z2dTdGF0ZSAqd2luc3RhdGUpOwogc3RhdGljIHZvaWQgZXZhbF93aW5kb3dhZ2dyZWdhdGVfZGlz dGluY3QoV2luZG93QWdnU3RhdGUgKndpbnN0YXRlLAogCQkJCQkJCQkJCSAgV2luZG93U3RhdGVQ ZXJGdW5jIHBlcmZ1bmNzdGF0ZSwKIAkJCQkJCQkJCQkgIFdpbmRvd1N0YXRlUGVyQWdnIHBlcmFn Z3N0YXRlKTsKK3N0YXRpYyB2b2lkIGFkdmFuY2Vfd2luZG93YWdncmVnYXRlX2Rpc3RpbmN0KFdp bmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwKKwkJCQkJCQkJCQkJIFdpbmRvd1N0YXRlUGVyRnVuYyBw ZXJmdW5jc3RhdGUsCisJCQkJCQkJCQkJCSBXaW5kb3dTdGF0ZVBlckFnZyBwZXJhZ2dzdGF0ZSk7 CiAKIHN0YXRpYyBib29sIGFyZV9wZWVycyhXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUsIFR1cGxl VGFibGVTbG90ICpzbG90MSwKIAkJCQkJICBUdXBsZVRhYmxlU2xvdCAqc2xvdDIpOwpAQCAtMjkz LDYgKzMwNiw0MyBAQCBpbml0aWFsaXplX3dpbmRvd2FnZ3JlZ2F0ZShXaW5kb3dBZ2dTdGF0ZSAq d2luc3RhdGUsCiAJcGVyYWdnc3RhdGUtPnRyYW5zVmFsdWVDb3VudCA9IDA7CiAJcGVyYWdnc3Rh dGUtPnJlc3VsdFZhbHVlID0gKERhdHVtKSAwOwogCXBlcmFnZ3N0YXRlLT5yZXN1bHRWYWx1ZUlz TnVsbCA9IHRydWU7CisKKwkvKgorCSAqIEZvciBoYXNoLWJhc2VkIERJU1RJTkNUIChncm93LW9u bHkgZnJhbWVzKSwgY3JlYXRlIGEgZnJlc2ggaGFzaCB0YWJsZQorCSAqIGVhY2ggdGltZSB0aGUg YWdncmVnYXRlIGlzIHJlc3RhcnRlZCAoaS5lLiwgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggbmV3CisJ ICogcGFydGl0aW9uKS4gIFRoZSBwcmV2aW91cyBkaXN0aW5jdENvbnRleHQgKGlmIGFueSkgd2Fz IGEgY2hpbGQgb2YKKwkgKiBhZ2djb250ZXh0IGFuZCB3YXMgYWxyZWFkeSBkZXN0cm95ZWQgYnkg dGhlIE1lbW9yeUNvbnRleHRSZXNldCBhYm92ZQorCSAqIChmb3IgcHJpdmF0ZSBhZ2djb250ZXh0 cykgb3IgYnkgdGhlIGNhbGxlcidzIHJlc2V0IG9mIHRoZSBzaGFyZWQKKwkgKiBhZ2djb250ZXh0 LgorCSAqLworCWlmIChwZXJhZ2dzdGF0ZS0+ZGlzdGluY3RJc0hhc2gpCisJeworCQlPaWQJCQlj b2xsYXRpb25zWzFdOworCQlBdHRyTnVtYmVyCWtleUNvbElkeFsxXSA9IHsxfTsKKworCQljb2xs YXRpb25zWzBdID0gcGVyYWdnc3RhdGUtPnNvcnRDb2xsYXRpb247CisKKwkJcGVyYWdnc3RhdGUt PmRpc3RpbmN0Q29udGV4dCA9CisJCQlCdW1wQ29udGV4dENyZWF0ZShwZXJhZ2dzdGF0ZS0+YWdn Y29udGV4dCwKKwkJCQkJCQkgICJXaW5kb3dBZ2cgRGlzdGluY3QgSGFzaCBUdXBsZXMiLAorCQkJ CQkJCSAgQUxMT0NTRVRfREVGQVVMVF9TSVpFUyk7CisKKwkJcGVyYWdnc3RhdGUtPmRpc3RpbmN0 VGFibGUgPQorCQkJQnVpbGRUdXBsZUhhc2hUYWJsZSgmd2luc3RhdGUtPnNzLnBzLAorCQkJCQkJ CQlwZXJhZ2dzdGF0ZS0+ZGlzdGluY3RUdXBsZURlc2MsCisJCQkJCQkJCSZUVFNPcHNWaXJ0dWFs LAorCQkJCQkJCQkxLAkJLyogbnVtQ29scyAqLworCQkJCQkJCQlrZXlDb2xJZHgsCisJCQkJCQkJ CXBlcmFnZ3N0YXRlLT5oYXNoRXFGdW5jT2lkcywKKwkJCQkJCQkJcGVyYWdnc3RhdGUtPmhhc2hG dW5jdGlvbnMsCisJCQkJCQkJCWNvbGxhdGlvbnMsCisJCQkJCQkJCTI1NiwJLyogaW5pdGlhbCBl c3RpbWF0ZSAqLworCQkJCQkJCQkwLAkJLyogYWRkaXRpb25hbHNpemUgKi8KKwkJCQkJCQkJcGVy YWdnc3RhdGUtPmFnZ2NvbnRleHQsCisJCQkJCQkJCXBlcmFnZ3N0YXRlLT5kaXN0aW5jdENvbnRl eHQsCisJCQkJCQkJCXdpbnN0YXRlLT50bXBjb250ZXh0LT5lY3h0X3Blcl90dXBsZV9tZW1vcnks CisJCQkJCQkJCWZhbHNlKTsKKwl9CiB9CiAKIC8qCkBAIC03NTAsNiArODAwLDI3IEBAIGlzX3do b2xlX3BhcnRpdGlvbl9mcmFtZShXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUpCiAJcmV0dXJuIGZh bHNlOwogfQogCisvKgorICogaXNfZ3Jvd19vbmx5X2ZyYW1lCisgKgorICogUmV0dXJucyB0cnVl IGlmIHRoZSB3aW5kb3cgZnJhbWUgb25seSBncm93cyBhcyB0aGUgY3VycmVudCByb3cgYWR2YW5j ZXMsCisgKiBpLmUuIHJvd3Mgb25seSBlbnRlciB0aGUgZnJhbWUsIG5ldmVyIGxlYXZlIGl0LiAg VGhpcyBpcyB0aGUgY2FzZSB3aGVuIHRoZQorICogc3RhcnQgaXMgVU5CT1VOREVEIFBSRUNFRElO RyBhbmQgdGhlcmUgaXMgbm8gRVhDTFVTSU9OIGNsYXVzZS4KKyAqCisgKiBOb3RlOiBldmVyeSB3 aG9sZS1wYXJ0aXRpb24gZnJhbWUgaXMgYWxzbyBhIGdyb3ctb25seSBmcmFtZS4KKyAqLworc3Rh dGljIGJvb2wKK2lzX2dyb3dfb25seV9mcmFtZShXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUpCit7 CisJaW50CQkJZnJhbWVPcHRpb25zID0gd2luc3RhdGUtPmZyYW1lT3B0aW9uczsKKworCWlmICgh KGZyYW1lT3B0aW9ucyAmIEZSQU1FT1BUSU9OX1NUQVJUX1VOQk9VTkRFRF9QUkVDRURJTkcpKQor CQlyZXR1cm4gZmFsc2U7CisJaWYgKGZyYW1lT3B0aW9ucyAmIEZSQU1FT1BUSU9OX0VYQ0xVU0lP TikKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCiAvKgogICogZXZhbF93aW5k b3dhZ2dyZWdhdGVfZGlzdGluY3QKICAqCkBAIC0xMDAwLDYgKzEwNzEsMTY0IEBAIHJlbWVtYmVy X3ZhbHVlOgogCXR1cGxlc29ydF9lbmQoc29ydHN0YXRlKTsKIH0KIAorLyoKKyAqIGFkdmFuY2Vf d2luZG93YWdncmVnYXRlX2Rpc3RpbmN0CisgKgorICogUGVyLXJvdyBoYW5kbGVyIGZvciBoYXNo LWJhc2VkIERJU1RJTkNUIHdpbmRvdyBhZ2dyZWdhdGVzIHdpdGggZ3Jvdy1vbmx5CisgKiBmcmFt ZXMuICBFdmFsdWF0ZXMgdGhlIHNpbmdsZSBhcmd1bWVudCwgY2hlY2tzIHRoZSBoYXNoIHRhYmxl IGZvcgorICogZHVwbGljYXRlcywgYW5kIG9ubHkgYWR2YW5jZXMgdGhlIHRyYW5zaXRpb24gZnVu Y3Rpb24gZm9yIG5ldyBkaXN0aW5jdAorICogdmFsdWVzLgorICovCitzdGF0aWMgdm9pZAorYWR2 YW5jZV93aW5kb3dhZ2dyZWdhdGVfZGlzdGluY3QoV2luZG93QWdnU3RhdGUgKndpbnN0YXRlLAor CQkJCQkJCQkgV2luZG93U3RhdGVQZXJGdW5jIHBlcmZ1bmNzdGF0ZSwKKwkJCQkJCQkJIFdpbmRv d1N0YXRlUGVyQWdnIHBlcmFnZ3N0YXRlKQoreworCUxPQ0FMX0ZDSU5GTyhmY2luZm8sIEZVTkNf TUFYX0FSR1MpOworCVdpbmRvd0Z1bmNFeHByU3RhdGUgKndmdW5jc3RhdGUgPSBwZXJmdW5jc3Rh dGUtPndmdW5jc3RhdGU7CisJaW50CQkJbnVtQXJndW1lbnRzID0gcGVyZnVuY3N0YXRlLT5udW1B cmd1bWVudHM7CisJRXhwckNvbnRleHQgKmVjb250ZXh0ID0gd2luc3RhdGUtPnRtcGNvbnRleHQ7 CisJRXhwclN0YXRlICAqZmlsdGVyID0gd2Z1bmNzdGF0ZS0+YWdnZmlsdGVyOworCVR1cGxlVGFi bGVTbG90ICpzbG90ID0gcGVyYWdnc3RhdGUtPmRpc3RpbmN0U2xvdDsKKwlEYXR1bQkJbmV3VmFs OworCWJvb2wJCWlzbnVsbDsKKwlib29sCQlpc25ldzsKKwlNZW1vcnlDb250ZXh0IG9sZENvbnRl eHQ7CisKKwlvbGRDb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKGVjb250ZXh0LT5lY3h0 X3Blcl90dXBsZV9tZW1vcnkpOworCisJLyogU2tpcCBhbnl0aGluZyBGSUxURVJlZCBvdXQgKi8K KwlpZiAoZmlsdGVyKQorCXsKKwkJRGF0dW0JCXJlcyA9IEV4ZWNFdmFsRXhwcihmaWx0ZXIsIGVj b250ZXh0LCAmaXNudWxsKTsKKworCQlpZiAoaXNudWxsIHx8ICFEYXR1bUdldEJvb2wocmVzKSkK KwkJeworCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZENvbnRleHQpOworCQkJcmV0dXJuOwor CQl9CisJfQorCisJLyogRXZhbHVhdGUgdGhlIHNpbmdsZSBhcmd1bWVudCAqLworCXsKKwkJRXhw clN0YXRlICAqYXJnc3RhdGUgPSAoRXhwclN0YXRlICopIGxpbml0aWFsKHdmdW5jc3RhdGUtPmFy Z3MpOworCisJCW5ld1ZhbCA9IEV4ZWNFdmFsRXhwcihhcmdzdGF0ZSwgZWNvbnRleHQsICZpc251 bGwpOworCX0KKworCS8qIFN0b3JlIGluIHNsb3QgZm9yIGhhc2ggbG9va3VwICovCisJRXhlY0Ns ZWFyVHVwbGUoc2xvdCk7CisJc2xvdC0+dHRzX3ZhbHVlc1swXSA9IG5ld1ZhbDsKKwlzbG90LT50 dHNfaXNudWxsWzBdID0gaXNudWxsOworCUV4ZWNTdG9yZVZpcnR1YWxUdXBsZShzbG90KTsKKwor CS8qIENoZWNrIGlmIGFscmVhZHkgc2VlbiAqLworCUxvb2t1cFR1cGxlSGFzaEVudHJ5KHBlcmFn Z3N0YXRlLT5kaXN0aW5jdFRhYmxlLCBzbG90LCAmaXNuZXcsIE5VTEwpOworCisJaWYgKCFpc25l dykKKwl7CisJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRDb250ZXh0KTsKKwkJcmV0dXJuOwkJ LyogYWxyZWFkeSBzZWVuLCBza2lwICovCisJfQorCisJLyoKKwkgKiBOZXcgZGlzdGluY3QgdmFs dWU6IGFkdmFuY2UgdGhlIHRyYW5zaXRpb24gZnVuY3Rpb24uCisJICogVGhpcyByZXBsaWNhdGVz IHRoZSBzdHJpY3QtaGFuZGxpbmcgKyB0cmFuc2ZuIGxvZ2ljIGZyb20KKwkgKiBhZHZhbmNlX3dp bmRvd2FnZ3JlZ2F0ZSgpLgorCSAqLworCWlmIChwZXJhZ2dzdGF0ZS0+dHJhbnNmbi5mbl9zdHJp Y3QpCisJeworCQkvKiBGb3Igc3RyaWN0IHRyYW5zZm4sIHNraXAgTlVMTCBpbnB1dHMgKi8KKwkJ aWYgKGlzbnVsbCkKKwkJeworCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZENvbnRleHQpOwor CQkJcmV0dXJuOworCQl9CisKKwkJLyoKKwkJICogRm9yIHN0cmljdCB0cmFuc2l0aW9uIGZ1bmN0 aW9ucyB3aXRoIGluaXRpYWwgdmFsdWUgTlVMTCwgdXNlIHRoZQorCQkgKiBmaXJzdCBub24tTlVM TCBpbnB1dCBhcyB0aGUgaW5pdGlhbCBzdGF0ZS4KKwkJICovCisJCWlmIChwZXJhZ2dzdGF0ZS0+ dHJhbnNWYWx1ZUNvdW50ID09IDAgJiYgcGVyYWdnc3RhdGUtPnRyYW5zVmFsdWVJc051bGwpCisJ CXsKKwkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhwZXJhZ2dzdGF0ZS0+YWdnY29udGV4dCk7CisJ CQlwZXJhZ2dzdGF0ZS0+dHJhbnNWYWx1ZSA9IGRhdHVtQ29weShuZXdWYWwsCisJCQkJCQkJCQkJ CQlwZXJhZ2dzdGF0ZS0+dHJhbnN0eXBlQnlWYWwsCisJCQkJCQkJCQkJCQlwZXJhZ2dzdGF0ZS0+ dHJhbnN0eXBlTGVuKTsKKwkJCXBlcmFnZ3N0YXRlLT50cmFuc1ZhbHVlSXNOdWxsID0gZmFsc2U7 CisJCQlwZXJhZ2dzdGF0ZS0+dHJhbnNWYWx1ZUNvdW50ID0gMTsKKwkJCU1lbW9yeUNvbnRleHRT d2l0Y2hUbyhvbGRDb250ZXh0KTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChwZXJhZ2dzdGF0 ZS0+dHJhbnNWYWx1ZUlzTnVsbCkKKwkJeworCQkJLyoKKwkJCSAqIERvbid0IGNhbGwgYSBzdHJp Y3QgZnVuY3Rpb24gd2l0aCBOVUxMIGlucHV0cy4gIE5vdGUgaXQgaXMKKwkJCSAqIHBvc3NpYmxl IHRvIGdldCBoZXJlIGRlc3BpdGUgdGhlIGFib3ZlIHRlc3RzLCBpZiB0aGUgdHJhbnNmbgorCQkJ ICogaXMgc3RyaWN0ICphbmQqIHJldHVybmVkIGEgTlVMTCBvbiBhIHByaW9yIGN5Y2xlLiAgSWYg dGhhdAorCQkJICogaGFwcGVucyB3ZSB3aWxsIHByb3BhZ2F0ZSB0aGUgTlVMTCBhbGwgdGhlIHdh eSB0byB0aGUgZW5kLgorCQkJICogSGFzaC1iYXNlZCBESVNUSU5DVCBuZXZlciB1c2VzIG1vdmlu Zy1hZ2dyZWdhdGUgY29kZSwgc28KKwkJCSAqIGludnRyYW5zZm5fb2lkIHNob3VsZCBhbHdheXMg YmUgaW52YWxpZCBoZXJlLgorCQkJICovCisJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkQ29u dGV4dCk7CisJCQlBc3NlcnQoIU9pZElzVmFsaWQocGVyYWdnc3RhdGUtPmludnRyYW5zZm5fb2lk KSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBPSyB0byBjYWxsIHRoZSB0cmFuc2l0aW9u IGZ1bmN0aW9uICovCisJSW5pdEZ1bmN0aW9uQ2FsbEluZm9EYXRhKCpmY2luZm8sICYocGVyYWdn c3RhdGUtPnRyYW5zZm4pLAorCQkJCQkJCSBudW1Bcmd1bWVudHMgKyAxLAorCQkJCQkJCSBwZXJm dW5jc3RhdGUtPndpbkNvbGxhdGlvbiwKKwkJCQkJCQkgKE5vZGUgKikgd2luc3RhdGUsIE5VTEwp OworCWZjaW5mby0+YXJnc1swXS52YWx1ZSA9IHBlcmFnZ3N0YXRlLT50cmFuc1ZhbHVlOworCWZj aW5mby0+YXJnc1swXS5pc251bGwgPSBwZXJhZ2dzdGF0ZS0+dHJhbnNWYWx1ZUlzTnVsbDsKKwlm Y2luZm8tPmFyZ3NbMV0udmFsdWUgPSBuZXdWYWw7CisJZmNpbmZvLT5hcmdzWzFdLmlzbnVsbCA9 IGlzbnVsbDsKKwl3aW5zdGF0ZS0+Y3VyYWdnY29udGV4dCA9IHBlcmFnZ3N0YXRlLT5hZ2djb250 ZXh0OworCisJeworCQlEYXR1bQkJcmVzdWx0OworCisJCXJlc3VsdCA9IEZ1bmN0aW9uQ2FsbElu dm9rZShmY2luZm8pOworCQl3aW5zdGF0ZS0+Y3VyYWdnY29udGV4dCA9IE5VTEw7CisKKwkJcGVy YWdnc3RhdGUtPnRyYW5zVmFsdWVDb3VudCsrOworCisJCWlmICghcGVyYWdnc3RhdGUtPnRyYW5z dHlwZUJ5VmFsICYmCisJCQlEYXR1bUdldFBvaW50ZXIocmVzdWx0KSAhPSBEYXR1bUdldFBvaW50 ZXIocGVyYWdnc3RhdGUtPnRyYW5zVmFsdWUpKQorCQl7CisJCQlpZiAoIWZjaW5mby0+aXNudWxs KQorCQkJeworCQkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhwZXJhZ2dzdGF0ZS0+YWdnY29udGV4 dCk7CisJCQkJaWYgKERhdHVtSXNSZWFkV3JpdGVFeHBhbmRlZE9iamVjdChyZXN1bHQsCisJCQkJ CQkJCQkJCQkgICBmYWxzZSwKKwkJCQkJCQkJCQkJCSAgIHBlcmFnZ3N0YXRlLT50cmFuc3R5cGVM ZW4pICYmCisJCQkJCU1lbW9yeUNvbnRleHRHZXRQYXJlbnQoRGF0dW1HZXRFT0hQKHJlc3VsdCkt PmVvaF9jb250ZXh0KSA9PSBDdXJyZW50TWVtb3J5Q29udGV4dCkKKwkJCQkJIC8qIGRvIG5vdGhp bmcgKi8gOworCQkJCWVsc2UKKwkJCQkJcmVzdWx0ID0gZGF0dW1Db3B5KHJlc3VsdCwKKwkJCQkJ CQkJCSAgIHBlcmFnZ3N0YXRlLT50cmFuc3R5cGVCeVZhbCwKKwkJCQkJCQkJCSAgIHBlcmFnZ3N0 YXRlLT50cmFuc3R5cGVMZW4pOworCQkJfQorCQkJaWYgKCFwZXJhZ2dzdGF0ZS0+dHJhbnNWYWx1 ZUlzTnVsbCkKKwkJCXsKKwkJCQlpZiAoRGF0dW1Jc1JlYWRXcml0ZUV4cGFuZGVkT2JqZWN0KHBl cmFnZ3N0YXRlLT50cmFuc1ZhbHVlLAorCQkJCQkJCQkJCQkJICAgZmFsc2UsCisJCQkJCQkJCQkJ CQkgICBwZXJhZ2dzdGF0ZS0+dHJhbnN0eXBlTGVuKSkKKwkJCQkJRGVsZXRlRXhwYW5kZWRPYmpl Y3QocGVyYWdnc3RhdGUtPnRyYW5zVmFsdWUpOworCQkJCWVsc2UKKwkJCQkJcGZyZWUoRGF0dW1H ZXRQb2ludGVyKHBlcmFnZ3N0YXRlLT50cmFuc1ZhbHVlKSk7CisJCQl9CisJCX0KKworCQlNZW1v cnlDb250ZXh0U3dpdGNoVG8ob2xkQ29udGV4dCk7CisJCXBlcmFnZ3N0YXRlLT50cmFuc1ZhbHVl ID0gcmVzdWx0OworCQlwZXJhZ2dzdGF0ZS0+dHJhbnNWYWx1ZUlzTnVsbCA9IGZjaW5mby0+aXNu dWxsOworCX0KK30KKwogLyoKICAqIGV2YWxfd2luZG93YWdncmVnYXRlcwogICogZXZhbHVhdGUg cGxhaW4gYWdncmVnYXRlcyBiZWluZyB1c2VkIGFzIHdpbmRvdyBmdW5jdGlvbnMKQEAgLTEyNTYs MTMgKzE0ODUsMTYgQEAgZXZhbF93aW5kb3dhZ2dyZWdhdGVzKFdpbmRvd0FnZ1N0YXRlICp3aW5z dGF0ZSkKIAkvKgogCSAqIENvbXB1dGUgRElTVElOQ1QgYWdncmVnYXRlcyBmb3IgdGhlIHdob2xl IHBhcnRpdGlvbi4gIFRoZXNlIGFyZSBoYW5kbGVkCiAJICogc2VwYXJhdGVseSB2aWEgc29ydC1i YXNlZCBkZWR1cGxpY2F0aW9uIHJhdGhlciB0aGFuIHRoZSBtYWluCi0JICogYWNjdW11bGF0aW9u IGxvb3AgYmVsb3cuCisJICogYWNjdW11bGF0aW9uIGxvb3AgYmVsb3cuICBIYXNoLWJhc2VkIERJ U1RJTkNUIChncm93LW9ubHkgZnJhbWVzKSBpcworCSAqIGhhbmRsZWQgaW5jcmVtZW50YWxseSBp biB0aGUgbWFpbiBsb29wIGluc3RlYWQuCiAJICovCiAJZm9yIChpID0gMDsgaSA8IG51bWFnZ3M7 IGkrKykKIAl7CiAJCXBlcmFnZ3N0YXRlID0gJndpbnN0YXRlLT5wZXJhZ2dbaV07CiAJCWlmICgh cGVyYWdnc3RhdGUtPndpbmRpc3RpbmN0IHx8ICFwZXJhZ2dzdGF0ZS0+cmVzdGFydCkKIAkJCWNv bnRpbnVlOworCQlpZiAocGVyYWdnc3RhdGUtPmRpc3RpbmN0SXNIYXNoKQorCQkJY29udGludWU7 CQkvKiBoYW5kbGVkIGluY3JlbWVudGFsbHkgaW4gbWFpbiBsb29wICovCiAJCXdmdW5jbm8gPSBw ZXJhZ2dzdGF0ZS0+d2Z1bmNubzsKIAkJZXZhbF93aW5kb3dhZ2dyZWdhdGVfZGlzdGluY3Qod2lu c3RhdGUsCiAJCQkJCQkJCQkgICZ3aW5zdGF0ZS0+cGVyZnVuY1t3ZnVuY25vXSwKQEAgLTEzMjUs MTAgKzE1NTcsMjAgQEAgZXZhbF93aW5kb3dhZ2dyZWdhdGVzKFdpbmRvd0FnZ1N0YXRlICp3aW5z dGF0ZSkKIAkJewogCQkJcGVyYWdnc3RhdGUgPSAmd2luc3RhdGUtPnBlcmFnZ1tpXTsKIAotCQkJ LyogRElTVElOQ1QgYWdncmVnYXRlcyBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5ICovCi0JCQlpZiAo cGVyYWdnc3RhdGUtPndpbmRpc3RpbmN0KQorCQkJLyogU29ydC1iYXNlZCBESVNUSU5DVCBhZ2dy ZWdhdGVzIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkgKi8KKwkJCWlmIChwZXJhZ2dzdGF0ZS0+d2lu ZGlzdGluY3QgJiYgIXBlcmFnZ3N0YXRlLT5kaXN0aW5jdElzSGFzaCkKIAkJCQljb250aW51ZTsK IAorCQkJLyogSGFzaC1iYXNlZCBESVNUSU5DVDogYWR2YW5jZSB2aWEgcGVyLXJvdyBkZWR1cCAq LworCQkJaWYgKHBlcmFnZ3N0YXRlLT53aW5kaXN0aW5jdCAmJiBwZXJhZ2dzdGF0ZS0+ZGlzdGlu Y3RJc0hhc2gpCisJCQl7CisJCQkJd2Z1bmNubyA9IHBlcmFnZ3N0YXRlLT53ZnVuY25vOworCQkJ CWFkdmFuY2Vfd2luZG93YWdncmVnYXRlX2Rpc3RpbmN0KHdpbnN0YXRlLAorCQkJCQkJCQkJCQkJ ICZ3aW5zdGF0ZS0+cGVyZnVuY1t3ZnVuY25vXSwKKwkJCQkJCQkJCQkJCSBwZXJhZ2dzdGF0ZSk7 CisJCQkJY29udGludWU7CisJCQl9CisKIAkJCS8qIE5vbi1yZXN0YXJ0ZWQgYWdncyBza2lwIHVu dGlsIGFnZ3JlZ2F0ZWR1cHRvX25vbnJlc3RhcnRlZCAqLwogCQkJaWYgKCFwZXJhZ2dzdGF0ZS0+ cmVzdGFydCAmJgogCQkJCXdpbnN0YXRlLT5hZ2dyZWdhdGVkdXB0byA8IGFnZ3JlZ2F0ZWR1cHRv X25vbnJlc3RhcnRlZCkKQEAgLTE0OTcsMTggKzE3MzksMjYgQEAgcHJlcGFyZV90dXBsZXN0b3Jl KFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSkKIAkJfQogCiAJCS8qCi0JCSAqIElmIGFueSBhZ2dy ZWdhdGUgdXNlcyBESVNUSU5DVCwgdGhlIHJlYWQgcG9pbnRlciBhbHNvIG5lZWRzCi0JCSAqIEJB Q0tXQVJEIGNhcGFiaWxpdHkuICBUaGUgRElTVElOQ1QgaGVscGVyIHJlYWRzIHRocm91Z2ggdGhl Ci0JCSAqIGVudGlyZSBwYXJ0aXRpb24gdG8gY29sbGVjdCB2YWx1ZXMgZm9yIHNvcnRpbmcsIHdo aWNoIGFkdmFuY2VzCi0JCSAqIHRoZSByZWFkIHBvaW50ZXIgdG8gdGhlIGVuZC4gIFRoZSBtYWlu IGFjY3VtdWxhdGlvbiBsb29wIChmb3IKLQkJICogbm9uLURJU1RJTkNUIGFnZ3JlZ2F0ZXMgaW4g dGhlIHNhbWUgV2luZG93QWdnIG5vZGUpIHRoZW4gbmVlZHMKLQkJICogdG8gcmV3aW5kIGJhY2sg dG8gdGhlIGZyYW1lIGhlYWQuCisJCSAqIElmIGFueSBhZ2dyZWdhdGUgdXNlcyBzb3J0LWJhc2Vk IERJU1RJTkNUICh3aG9sZS1wYXJ0aXRpb24gcGF0aCksCisJCSAqIHRoZSByZWFkIHBvaW50ZXIg YWxzbyBuZWVkcyBCQUNLV0FSRCBjYXBhYmlsaXR5LiAgVGhlIERJU1RJTkNUCisJCSAqIGhlbHBl ciByZWFkcyB0aHJvdWdoIHRoZSBlbnRpcmUgcGFydGl0aW9uIHRvIGNvbGxlY3QgdmFsdWVzIGZv cgorCQkgKiBzb3J0aW5nLCB3aGljaCBhZHZhbmNlcyB0aGUgcmVhZCBwb2ludGVyIHRvIHRoZSBl bmQuICBUaGUgbWFpbgorCQkgKiBhY2N1bXVsYXRpb24gbG9vcCAoZm9yIG5vbi1ESVNUSU5DVCBh Z2dyZWdhdGVzIGluIHRoZSBzYW1lCisJCSAqIFdpbmRvd0FnZyBub2RlKSB0aGVuIG5lZWRzIHRv IHJld2luZCBiYWNrIHRvIHRoZSBmcmFtZSBoZWFkLgorCQkgKgorCQkgKiBIYXNoLWJhc2VkIERJ U1RJTkNUIChncm93LW9ubHkgZnJhbWVzKSBwYXJ0aWNpcGF0ZXMgaW4gdGhlIG5vcm1hbAorCQkg KiBmb3J3YXJkIG1haW4gbG9vcCBhbmQgZG9lcyBub3QgbmVlZCBCQUNLV0FSRC4KKwkJICoKKwkJ ICogTkI6IHdpbmRpc3RpbmN0IGFuZCBkaXN0aW5jdElzSGFzaCBhcmUgc2V0IGR1cmluZworCQkg KiBpbml0aWFsaXplX3BlcmFnZygpIGluIEV4ZWNJbml0V2luZG93QWdnKCksIHdoaWNoIHJ1bnMg YmVmb3JlCisJCSAqIGFueSBwYXJ0aXRpb24gaXMgc3RhcnRlZCwgc28gdGhleSBhcmUgdmFsaWQg aGVyZS4KIAkJICovCiAJCWlmICghKHJlYWRwdHJfZmxhZ3MgJiBFWEVDX0ZMQUdfQkFDS1dBUkQp KQogCQl7CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbnN0YXRlLT5udW1hZ2dzOyBpKyspCiAJ CQl7Ci0JCQkJaWYgKHdpbnN0YXRlLT5wZXJhZ2dbaV0ud2luZGlzdGluY3QpCisJCQkJaWYgKHdp bnN0YXRlLT5wZXJhZ2dbaV0ud2luZGlzdGluY3QgJiYKKwkJCQkJIXdpbnN0YXRlLT5wZXJhZ2db aV0uZGlzdGluY3RJc0hhc2gpCiAJCQkJewogCQkJCQlyZWFkcHRyX2ZsYWdzIHw9IEVYRUNfRkxB R19CQUNLV0FSRDsKIAkJCQkJYnJlYWs7CkBAIC0zMjc3LDcgKzM1MjcsOCBAQCBFeGVjUmVTY2Fu V2luZG93QWdnKFdpbmRvd0FnZ1N0YXRlICpub2RlKQogICogaW5pdGlhbGl6ZV9wZXJhZ2cKICAq CiAgKiBBbG1vc3Qgc2FtZSBhcyBpbiBub2RlQWdnLmMsIGV4Y2VwdCB3ZSBvbmx5IHN1cHBvcnQg RElTVElOQ1QgZm9yCi0gKiB3aG9sZS1wYXJ0aXRpb24gZnJhbWVzIGFuZCBzaW5nbGUtYXJndW1l bnQgYWdncmVnYXRlcy4KKyAqIG5vbi1zaHJpbmtpbmcgZnJhbWVzIChVTkJPVU5ERUQgUFJFQ0VE SU5HLCBubyBFWENMVURFKSBhbmQKKyAqIHNpbmdsZS1hcmd1bWVudCBhZ2dyZWdhdGVzLgogICov CiBzdGF0aWMgV2luZG93U3RhdGVQZXJBZ2dEYXRhICoKIGluaXRpYWxpemVfcGVyYWdnKFdpbmRv d0FnZ1N0YXRlICp3aW5zdGF0ZSwgV2luZG93RnVuYyAqd2Z1bmMsCkBAIC0zMzA0LDE1ICszNTU1 LDE5IEBAIGluaXRpYWxpemVfcGVyYWdnKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwgV2luZG93 RnVuYyAqd2Z1bmMsCiAJTGlzdENlbGwgICAqbGM7CiAKIAkvKgotCSAqIFZhbGlkYXRlIERJU1RJ TkNUIHVzYWdlLiAgQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCBESVNUSU5DVCBmb3IKLQkgKiB3 aG9sZS1wYXJ0aXRpb24gZnJhbWVzICh3aGVyZSB0aGUgcmVzdWx0IGlzIGNvbnN0YW50IGFjcm9z cyB0aGUKLQkgKiBwYXJ0aXRpb24pIGFuZCBzaW5nbGUtYXJndW1lbnQgYWdncmVnYXRlcyBvbmx5 LgorCSAqIFZhbGlkYXRlIERJU1RJTkNUIHVzYWdlLiAgV2Ugc3VwcG9ydCBESVNUSU5DVCBmb3Ig d2hvbGUtcGFydGl0aW9uIGZyYW1lcworCSAqIChzb3J0LWJhc2VkIGRlZHVwbGljYXRpb24pIGFu ZCBncm93LW9ubHkgZnJhbWVzIChoYXNoLWJhc2VkIGRlZHVwKS4KKwkgKiBBIGdyb3ctb25seSBm cmFtZSBzdGFydHMgYXQgVU5CT1VOREVEIFBSRUNFRElORyB3aXRoIG5vIEVYQ0xVU0lPTi4KKwkg KiBPbmx5IHNpbmdsZS1hcmd1bWVudCBhZ2dyZWdhdGVzIGFyZSBzdXBwb3J0ZWQuCiAJICovCi0J aWYgKHdmdW5jLT53aW5kaXN0aW5jdCAmJiAhaXNfd2hvbGVfcGFydGl0aW9uX2ZyYW1lKHdpbnN0 YXRlKSkKKwlpZiAod2Z1bmMtPndpbmRpc3RpbmN0ICYmICFpc19ncm93X29ubHlfZnJhbWUod2lu c3RhdGUpKQogCQllcmVwb3J0KEVSUk9SLAogCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9O T1RfU1VQUE9SVEVEKSwKLQkJCQkgZXJybXNnKCJESVNUSU5DVCBpcyBvbmx5IHN1cHBvcnRlZCBm b3Igd2luZG93IGZ1bmN0aW9ucyB3aXRoIGEgZnJhbWUgdGhhdCBjb3ZlcnMgdGhlIGVudGlyZSBw YXJ0aXRpb24iKSwKLQkJCQkgZXJyaGludCgiUmVtb3ZlIE9SREVSIEJZIGZyb20gdGhlIHdpbmRv dyBkZWZpbml0aW9uLCBvciB1c2UgUk9XUyBCRVRXRUVOIFVOQk9VTkRFRCBQUkVDRURJTkcgQU5E IFVOQk9VTkRFRCBGT0xMT1dJTkcuIikpKTsKKwkJCQkgZXJybXNnKCJESVNUSU5DVCBpcyBub3Qg c3VwcG9ydGVkIGZvciB3aW5kb3cgZnVuY3Rpb25zICIKKwkJCQkJCSJ3aXRoIGZyYW1lcyB0aGF0 IGRvIG5vdCBzdGFydCBhdCBVTkJPVU5ERUQgIgorCQkJCQkJIlBSRUNFRElORyBvciB0aGF0IHVz ZSBhbiBFWENMVURFIGNsYXVzZSIpLAorCQkJCSBlcnJoaW50KCJUaGUgZnJhbWUgbXVzdCBzdGFy dCBhdCBVTkJPVU5ERUQgUFJFQ0VESU5HICIKKwkJCQkJCSAiYW5kIG11c3Qgbm90IGhhdmUgYW4g RVhDTFVERSBjbGF1c2UuIikpKTsKIAogCWlmICh3ZnVuYy0+d2luZGlzdGluY3QgJiYgbGlzdF9s ZW5ndGgod2Z1bmMtPmFyZ3MpICE9IDEpCiAJCWVyZXBvcnQoRVJST1IsCkBAIC0zNTkwLDYgKzM4 NDUsNTAgQEAgaW5pdGlhbGl6ZV9wZXJhZ2coV2luZG93QWdnU3RhdGUgKndpbnN0YXRlLCBXaW5k b3dGdW5jICp3ZnVuYywKIAkJZ2V0X3R5cGxlbmJ5dmFsKGlucHV0VHlwZSwKIAkJCQkJCSZwZXJh Z2dzdGF0ZS0+aW5wdXR0eXBlTGVuLAogCQkJCQkJJnBlcmFnZ3N0YXRlLT5pbnB1dHR5cGVCeVZh bCk7CisKKwkJLyoKKwkJICogRm9yIG5vbi1zaHJpbmtpbmcgYnV0IG5vbi13aG9sZS1wYXJ0aXRp b24gZnJhbWVzLCBzZXQgdXAgaGFzaC1iYXNlZAorCQkgKiBpbmNyZW1lbnRhbCBESVNUSU5DVC4g IFVubGlrZSB0aGUgd2hvbGUtcGFydGl0aW9uIHBhdGggd2hpY2ggdXNlcworCQkgKiBzb3J0LWJh c2VkIGRlZHVwbGljYXRpb24gKHJlcXVpcmluZyBvbmx5IGJ0cmVlIG9wZXJhdG9ycyksIHRoZQor CQkgKiBpbmNyZW1lbnRhbCBwYXRoIG11c3QgdHJhY2sgcHJldmlvdXNseSBzZWVuIHZhbHVlcyBh Y3Jvc3Mgcm93cworCQkgKiB1c2luZyBhIGhhc2ggdGFibGUsIHNvIHRoZSBhcmd1bWVudCB0eXBl IG11c3Qgc3VwcG9ydCBoYXNoaW5nLgorCQkgKiBJZiBpdCBkb2VzIG5vdCwgd2UgcmVqZWN0IGhl cmUgcmF0aGVyIHRoYW4gc2lsZW50bHkgZmFsbGluZyBiYWNrLAorCQkgKiBiZWNhdXNlIGEgc29y dC1iYXNlZCBpbmNyZW1lbnRhbCBhcHByb2FjaCB3b3VsZCByZXF1aXJlIHJlLXNvcnRpbmcKKwkJ ICogb24gZXZlcnkgcm93LgorCQkgKgorCQkgKiBUaGUgaGFzaCB0YWJsZSBpdHNlbGYgaXMgY3Jl YXRlZCBwZXItcGFydGl0aW9uIGluCisJCSAqIGluaXRpYWxpemVfd2luZG93YWdncmVnYXRlKCku CisJCSAqLworCQlpZiAoIWlzX3dob2xlX3BhcnRpdGlvbl9mcmFtZSh3aW5zdGF0ZSkpCisJCXsK KwkJCU9pZAkJCWhhc2hmbl9vaWQ7CisKKwkJCS8qIEdyb3ctb25seSBwYXRoIHJlcXVpcmVzIGEg aGFzaGFibGUgdHlwZSAqLworCQkJaWYgKCFnZXRfb3BfaGFzaF9mdW5jdGlvbnMoZXFPcHIsICZo YXNoZm5fb2lkLCBOVUxMKSkKKwkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkJKGVycmNvZGUoRVJS Q09ERV9VTkRFRklORURfRlVOQ1RJT04pLAorCQkJCQkJIGVycm1zZygiY291bGQgbm90IGZpbmQg aGFzaCBmdW5jdGlvbiBmb3Igd2luZG93ICIKKwkJCQkJCQkJIkRJU1RJTkNUIGFnZ3JlZ2F0ZSIp LAorCQkJCQkJIGVycmhpbnQoIlRoZSBhcmd1bWVudCB0eXBlIG11c3Qgc3VwcG9ydCBoYXNoaW5n LiIpKSk7CisKKwkJCXBlcmFnZ3N0YXRlLT5kaXN0aW5jdElzSGFzaCA9IHRydWU7CisKKwkJCS8q IENyZWF0ZSBhIHNpbmdsZS1jb2x1bW4gVHVwbGVEZXNjIGZvciB0aGUgaW5wdXQgdHlwZSAqLwor CQkJcGVyYWdnc3RhdGUtPmRpc3RpbmN0VHVwbGVEZXNjID0gQ3JlYXRlVGVtcGxhdGVUdXBsZURl c2MoMSk7CisJCQlUdXBsZURlc2NJbml0RW50cnkocGVyYWdnc3RhdGUtPmRpc3RpbmN0VHVwbGVE ZXNjLCAxLAorCQkJCQkJCSAgICJkaXN0aW5jdF92YWwiLCBpbnB1dFR5cGUsIC0xLCAwKTsKKwor CQkJLyogQ3JlYXRlIGEgZGVkaWNhdGVkIHNsb3QgZm9yIGhhc2ggdGFibGUgbG9va3VwcyAqLwor CQkJcGVyYWdnc3RhdGUtPmRpc3RpbmN0U2xvdCA9CisJCQkJTWFrZVNpbmdsZVR1cGxlVGFibGVT bG90KHBlcmFnZ3N0YXRlLT5kaXN0aW5jdFR1cGxlRGVzYywKKwkJCQkJCQkJCQkgJlRUU09wc1Zp cnR1YWwpOworCisJCQkvKiBQcmUtY29tcHV0ZSBoYXNoIGluZnJhc3RydWN0dXJlIChyZXVzZWQg YWNyb3NzIHBhcnRpdGlvbnMpICovCisJCQlleGVjVHVwbGVzSGFzaFByZXBhcmUoMSwKKwkJCQkJ CQkJICAmZXFPcHIsCisJCQkJCQkJCSAgJnBlcmFnZ3N0YXRlLT5oYXNoRXFGdW5jT2lkcywKKwkJ CQkJCQkJICAmcGVyYWdnc3RhdGUtPmhhc2hGdW5jdGlvbnMpOworCQl9CiAJfQogCiAJUmVsZWFz ZVN5c0NhY2hlKGFnZ1R1cGxlKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvd2luZG93Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvd2luZG93Lm91dAppbmRl eCA4NGUyYWIwNTJlNS4uZTg5ZmM1N2MwNjMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvd2luZG93Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3dpbmRv dy5vdXQKQEAgLTYxMTgsMzAgKzYxMTgsMTkzIEBAIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEw KSBnKHgpOwogIDEwIHwgICAgIDIgfCAgIDMKICgxMCByb3dzKQogCi0tLSBFcnJvcjogbm9uLXdo b2xlLXBhcnRpdGlvbiBmcmFtZSAoaGFzIE9SREVSIEJZIC0+IFJBTkdFIFVOQk9VTkRFRCBQUkVD RURJTkcgdG8gQ1VSUkVOVCBST1cpCistLSBOb24tc2hyaW5raW5nIGZyYW1lOiBPUkRFUiBCWSBw cm9kdWNlcyBSQU5HRSBVTkJPVU5ERUQgUFJFQ0VESU5HIHRvIENVUlJFTlQgUk9XCiBTRUxFQ1Qg Y291bnQoRElTVElOQ1QgeCkgT1ZFUiAoUEFSVElUSU9OIEJZIHggPiA1IE9SREVSIEJZIHgpCi1G Uk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsgLS0gZXJyb3IKLUVSUk9SOiAgRElTVElO Q1QgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHdpbmRvdyBmdW5jdGlvbnMgd2l0aCBhIGZyYW1lIHRo YXQgY292ZXJzIHRoZSBlbnRpcmUgcGFydGl0aW9uCi1ISU5UOiAgUmVtb3ZlIE9SREVSIEJZIGZy b20gdGhlIHdpbmRvdyBkZWZpbml0aW9uLCBvciB1c2UgUk9XUyBCRVRXRUVOIFVOQk9VTkRFRCBQ UkVDRURJTkcgQU5EIFVOQk9VTkRFRCBGT0xMT1dJTkcuCi0tLSBFcnJvcjogcGFydGlhbCBST1dT IGZyYW1lCi1TRUxFQ1QgY291bnQoRElTVElOQ1QgeCkgT1ZFUiAoUk9XUyAzIFBSRUNFRElORykK LUZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgpOyAtLSBlcnJvcgotRVJST1I6ICBESVNU SU5DVCBpcyBvbmx5IHN1cHBvcnRlZCBmb3Igd2luZG93IGZ1bmN0aW9ucyB3aXRoIGEgZnJhbWUg dGhhdCBjb3ZlcnMgdGhlIGVudGlyZSBwYXJ0aXRpb24KLUhJTlQ6ICBSZW1vdmUgT1JERVIgQlkg ZnJvbSB0aGUgd2luZG93IGRlZmluaXRpb24sIG9yIHVzZSBST1dTIEJFVFdFRU4gVU5CT1VOREVE IFBSRUNFRElORyBBTkQgVU5CT1VOREVEIEZPTExPV0lORy4KLS0tIEVycm9yOiBFWENMVURFIGNs YXVzZQotU0VMRUNUIGNvdW50KERJU1RJTkNUIHgpIE9WRVIgKFJPV1MgQkVUV0VFTiBVTkJPVU5E RUQgUFJFQ0VESU5HIEFORCBVTkJPVU5ERUQgRk9MTE9XSU5HIEVYQ0xVREUgQ1VSUkVOVCBST1cp Ci1GUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsgLS0gZXJyb3IKLUVSUk9SOiAgRElT VElOQ1QgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHdpbmRvdyBmdW5jdGlvbnMgd2l0aCBhIGZyYW1l IHRoYXQgY292ZXJzIHRoZSBlbnRpcmUgcGFydGl0aW9uCi1ISU5UOiAgUmVtb3ZlIE9SREVSIEJZ IGZyb20gdGhlIHdpbmRvdyBkZWZpbml0aW9uLCBvciB1c2UgUk9XUyBCRVRXRUVOIFVOQk9VTkRF RCBQUkVDRURJTkcgQU5EIFVOQk9VTkRFRCBGT0xMT1dJTkcuCi0tLSBFcnJvcjogUk9XUyBCRVRX RUVOIFVOQk9VTkRFRCBQUkVDRURJTkcgQU5EIENVUlJFTlQgUk9XIChub3Qgd2hvbGUtcGFydGl0 aW9uCi0tLSBldmVuIHdpdGhvdXQgT1JERVIgQlksIGJlY2F1c2UgUk9XUyBDVVJSRU5UIFJPVyBt ZWFucyBleGFjdGx5IG9uZSByb3cpCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsK KyBjb3VudCAKKy0tLS0tLS0KKyAgICAgMQorICAgICAyCisgICAgIDMKKyAgICAgNAorICAgICA1 CisgICAgIDEKKyAgICAgMgorICAgICAzCisgICAgIDQKKyAgICAgNQorKDEwIHJvd3MpCisKKy0t IE5vbi1zaHJpbmtpbmcgZnJhbWU6IHJ1bm5pbmcgY291bnQgd2l0aCBPUkRFUiBCWSAoZGVmYXVs dCBSQU5HRSBmcmFtZSkKK1NFTEVDVCB4LCBjb3VudChESVNUSU5DVCB4ICUgMykgT1ZFUiAoT1JE RVIgQlkgeCkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgpOworIHggIHwgY291bnQg CistLS0tKy0tLS0tLS0KKyAgMSB8ICAgICAxCisgIDIgfCAgICAgMgorICAzIHwgICAgIDMKKyAg NCB8ICAgICAzCisgIDUgfCAgICAgMworICA2IHwgICAgIDMKKyAgNyB8ICAgICAzCisgIDggfCAg ICAgMworICA5IHwgICAgIDMKKyAxMCB8ICAgICAzCisoMTAgcm93cykKKworLS0gTm9uLXNocmlu a2luZyBmcmFtZTogZXhwbGljaXQgUk9XUyBVTkJPVU5ERUQgUFJFQ0VESU5HIHRvIENVUlJFTlQg Uk9XCitTRUxFQ1QgeCwgY291bnQoRElTVElOQ1QgeCAlIDMpIE9WRVIgKAorICAgIFJPV1MgQkVU V0VFTiBVTkJPVU5ERUQgUFJFQ0VESU5HIEFORCBDVVJSRU5UIFJPVykKK0ZST00gZ2VuZXJhdGVf c2VyaWVzKDEsIDEwKSBnKHgpOworIHggIHwgY291bnQgCistLS0tKy0tLS0tLS0KKyAgMSB8ICAg ICAxCisgIDIgfCAgICAgMgorICAzIHwgICAgIDMKKyAgNCB8ICAgICAzCisgIDUgfCAgICAgMwor ICA2IHwgICAgIDMKKyAgNyB8ICAgICAzCisgIDggfCAgICAgMworICA5IHwgICAgIDMKKyAxMCB8 ICAgICAzCisoMTAgcm93cykKKworLS0gTm9uLXNocmlua2luZyBmcmFtZTogUEFSVElUSU9OIEJZ IGFuZCBPUkRFUiBCWQorU0VMRUNUIHgsIHN1bShESVNUSU5DVCB4ICUgMykgT1ZFUiAoUEFSVElU SU9OIEJZIHggPiA1IE9SREVSIEJZIHgpCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4 KTsKKyB4ICB8IHN1bSAKKy0tLS0rLS0tLS0KKyAgMSB8ICAgMQorICAyIHwgICAzCisgIDMgfCAg IDMKKyAgNCB8ICAgMworICA1IHwgICAzCisgIDYgfCAgIDAKKyAgNyB8ICAgMQorICA4IHwgICAz CisgIDkgfCAgIDMKKyAxMCB8ICAgMworKDEwIHJvd3MpCisKKy0tIE5vbi1zaHJpbmtpbmcgZnJh bWU6IEZJTFRFUiB3aXRoIE9SREVSIEJZCitTRUxFQ1QgeCwgY291bnQoRElTVElOQ1QgeCAlIDMp IEZJTFRFUiAoV0hFUkUgeCA+IDIpIE9WRVIgKE9SREVSIEJZIHgpCitGUk9NIGdlbmVyYXRlX3Nl cmllcygxLCAxMCkgZyh4KTsKKyB4ICB8IGNvdW50IAorLS0tLSstLS0tLS0tCisgIDEgfCAgICAg MAorICAyIHwgICAgIDAKKyAgMyB8ICAgICAxCisgIDQgfCAgICAgMgorICA1IHwgICAgIDMKKyAg NiB8ICAgICAzCisgIDcgfCAgICAgMworICA4IHwgICAgIDMKKyAgOSB8ICAgICAzCisgMTAgfCAg ICAgMworKDEwIHJvd3MpCisKKy0tIE5vbi1zaHJpbmtpbmcgZnJhbWU6IG1peGVkIERJU1RJTkNU ICsgbm9uLURJU1RJTkNUIHdpdGggT1JERVIgQlkKK1NFTEVDVCB4LAorICAgICAgIGNvdW50KERJ U1RJTkNUIHggJSAzKSBPVkVSIHcsCisgICAgICAgc3VtKHgpIE9WRVIgdworRlJPTSBnZW5lcmF0 ZV9zZXJpZXMoMSwgOSkgZyh4KQorV0lORE9XIHcgQVMgKE9SREVSIEJZIHgpOworIHggfCBjb3Vu dCB8IHN1bSAKKy0tLSstLS0tLS0tKy0tLS0tCisgMSB8ICAgICAxIHwgICAxCisgMiB8ICAgICAy IHwgICAzCisgMyB8ICAgICAzIHwgICA2CisgNCB8ICAgICAzIHwgIDEwCisgNSB8ICAgICAzIHwg IDE1CisgNiB8ICAgICAzIHwgIDIxCisgNyB8ICAgICAzIHwgIDI4CisgOCB8ICAgICAzIHwgIDM2 CisgOSB8ICAgICAzIHwgIDQ1CisoOSByb3dzKQorCistLSBOb24tc2hyaW5raW5nIGZyYW1lOiB2 ZXJpZnkgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHJ1bm5pbmcgY291bnQKK1NFTEVDVCB4LCBj b3VudChESVNUSU5DVCB4KSBPVkVSIChPUkRFUiBCWSB4KQorRlJPTSBnZW5lcmF0ZV9zZXJpZXMo MSwgNSkgZyh4KTsKKyB4IHwgY291bnQgCistLS0rLS0tLS0tLQorIDEgfCAgICAgMQorIDIgfCAg ICAgMgorIDMgfCAgICAgMworIDQgfCAgICAgNAorIDUgfCAgICAgNQorKDUgcm93cykKKworLS0g Tm9uLXNocmlua2luZyBmcmFtZTogUk9XUyBVTkJPVU5ERUQgUFJFQ0VESU5HIHRvIENVUlJFTlQg Uk9XIHdpdGhvdXQgT1JERVIgQlkKIFNFTEVDVCB4LAogICAgICAgIGNvdW50KERJU1RJTkNUIHgg JSAzKSBPVkVSICgKICAgICAgICAgICAgUk9XUyBCRVRXRUVOIFVOQk9VTkRFRCBQUkVDRURJTkcg QU5EIENVUlJFTlQgUk9XCiAgICAgICAgKQorRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTApIGco eCk7CisgeCAgfCBjb3VudCAKKy0tLS0rLS0tLS0tLQorICAxIHwgICAgIDEKKyAgMiB8ICAgICAy CisgIDMgfCAgICAgMworICA0IHwgICAgIDMKKyAgNSB8ICAgICAzCisgIDYgfCAgICAgMworICA3 IHwgICAgIDMKKyAgOCB8ICAgICAzCisgIDkgfCAgICAgMworIDEwIHwgICAgIDMKKygxMCByb3dz KQorCistLSBOb24tc2hyaW5raW5nIGZyYW1lOiBGT0xMT1dJTkcgYm91bmQgKG5vdCBqdXN0IENV UlJFTlQgUk9XKQorU0VMRUNUIHgsCisgICAgICAgY291bnQoRElTVElOQ1QgeCAlIDMpIE9WRVIg KAorICAgICAgICAgICBPUkRFUiBCWSB4CisgICAgICAgICAgIFJPV1MgQkVUV0VFTiBVTkJPVU5E RUQgUFJFQ0VESU5HIEFORCAyIEZPTExPV0lORworICAgICAgICkKK0ZST00gZ2VuZXJhdGVfc2Vy aWVzKDEsIDEwKSBnKHgpOworIHggIHwgY291bnQgCistLS0tKy0tLS0tLS0KKyAgMSB8ICAgICAz CisgIDIgfCAgICAgMworICAzIHwgICAgIDMKKyAgNCB8ICAgICAzCisgIDUgfCAgICAgMworICA2 IHwgICAgIDMKKyAgNyB8ICAgICAzCisgIDggfCAgICAgMworICA5IHwgICAgIDMKKyAxMCB8ICAg ICAzCisoMTAgcm93cykKKworLS0gRXJyb3I6IHNsaWRpbmcgZnJhbWUgKHN0YXJ0IGlzIG5vdCBV TkJPVU5ERUQgUFJFQ0VESU5HKQorU0VMRUNUIGNvdW50KERJU1RJTkNUIHgpIE9WRVIgKFJPV1Mg MyBQUkVDRURJTkcpCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsgLS0gZXJyb3IK K0VSUk9SOiAgRElTVElOQ1QgaXMgbm90IHN1cHBvcnRlZCBmb3Igd2luZG93IGZ1bmN0aW9ucyB3 aXRoIGZyYW1lcyB0aGF0IGRvIG5vdCBzdGFydCBhdCBVTkJPVU5ERUQgUFJFQ0VESU5HIG9yIHRo YXQgdXNlIGFuIEVYQ0xVREUgY2xhdXNlCitISU5UOiAgVGhlIGZyYW1lIG11c3Qgc3RhcnQgYXQg VU5CT1VOREVEIFBSRUNFRElORyBhbmQgbXVzdCBub3QgaGF2ZSBhbiBFWENMVURFIGNsYXVzZS4K Ky0tIEVycm9yOiBzbGlkaW5nIGZyYW1lIHdpdGggZXhwbGljaXQgYm91bmRzCitTRUxFQ1QgY291 bnQoRElTVElOQ1QgeCkgT1ZFUiAoUk9XUyBCRVRXRUVOIDMgUFJFQ0VESU5HIEFORCBDVVJSRU5U IFJPVykKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgpOyAtLSBlcnJvcgorRVJST1I6 ICBESVNUSU5DVCBpcyBub3Qgc3VwcG9ydGVkIGZvciB3aW5kb3cgZnVuY3Rpb25zIHdpdGggZnJh bWVzIHRoYXQgZG8gbm90IHN0YXJ0IGF0IFVOQk9VTkRFRCBQUkVDRURJTkcgb3IgdGhhdCB1c2Ug YW4gRVhDTFVERSBjbGF1c2UKK0hJTlQ6ICBUaGUgZnJhbWUgbXVzdCBzdGFydCBhdCBVTkJPVU5E RUQgUFJFQ0VESU5HIGFuZCBtdXN0IG5vdCBoYXZlIGFuIEVYQ0xVREUgY2xhdXNlLgorLS0gRXJy b3I6IEVYQ0xVREUgY2xhdXNlIHdpdGggT1JERVIgQlkKK1NFTEVDVCBjb3VudChESVNUSU5DVCB4 KSBPVkVSICgKKyAgICBPUkRFUiBCWSB4IFJPV1MgQkVUV0VFTiBVTkJPVU5ERUQgUFJFQ0VESU5H IEFORCBDVVJSRU5UIFJPVworICAgIEVYQ0xVREUgQ1VSUkVOVCBST1cpCitGUk9NIGdlbmVyYXRl X3NlcmllcygxLCAxMCkgZyh4KTsgLS0gZXJyb3IKK0VSUk9SOiAgRElTVElOQ1QgaXMgbm90IHN1 cHBvcnRlZCBmb3Igd2luZG93IGZ1bmN0aW9ucyB3aXRoIGZyYW1lcyB0aGF0IGRvIG5vdCBzdGFy dCBhdCBVTkJPVU5ERUQgUFJFQ0VESU5HIG9yIHRoYXQgdXNlIGFuIEVYQ0xVREUgY2xhdXNlCitI SU5UOiAgVGhlIGZyYW1lIG11c3Qgc3RhcnQgYXQgVU5CT1VOREVEIFBSRUNFRElORyBhbmQgbXVz dCBub3QgaGF2ZSBhbiBFWENMVURFIGNsYXVzZS4KKy0tIEVycm9yOiBFWENMVURFIGNsYXVzZSB3 aXRoIFVOQk9VTkRFRCBmcmFtZQorU0VMRUNUIGNvdW50KERJU1RJTkNUIHgpIE9WRVIgKFJPV1Mg QkVUV0VFTiBVTkJPVU5ERUQgUFJFQ0VESU5HIEFORCBVTkJPVU5ERUQgRk9MTE9XSU5HIEVYQ0xV REUgQ1VSUkVOVCBST1cpCiBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsgLS0gZXJy b3IKLUVSUk9SOiAgRElTVElOQ1QgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHdpbmRvdyBmdW5jdGlv bnMgd2l0aCBhIGZyYW1lIHRoYXQgY292ZXJzIHRoZSBlbnRpcmUgcGFydGl0aW9uCi1ISU5UOiAg UmVtb3ZlIE9SREVSIEJZIGZyb20gdGhlIHdpbmRvdyBkZWZpbml0aW9uLCBvciB1c2UgUk9XUyBC RVRXRUVOIFVOQk9VTkRFRCBQUkVDRURJTkcgQU5EIFVOQk9VTkRFRCBGT0xMT1dJTkcuCitFUlJP UjogIERJU1RJTkNUIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHdpbmRvdyBmdW5jdGlvbnMgd2l0aCBm cmFtZXMgdGhhdCBkbyBub3Qgc3RhcnQgYXQgVU5CT1VOREVEIFBSRUNFRElORyBvciB0aGF0IHVz ZSBhbiBFWENMVURFIGNsYXVzZQorSElOVDogIFRoZSBmcmFtZSBtdXN0IHN0YXJ0IGF0IFVOQk9V TkRFRCBQUkVDRURJTkcgYW5kIG11c3Qgbm90IGhhdmUgYW4gRVhDTFVERSBjbGF1c2UuCistLSBF cnJvcjogbm9uLWhhc2hhYmxlIHR5cGUgd2l0aCBub24tc2hyaW5raW5nIGZyYW1lIChtb25leSBo YXMgYnRyZWUgYnV0IG5vIGhhc2gpLgorLS0gV2hvbGUtcGFydGl0aW9uIERJU1RJTkNUIHVzZXMg c29ydC1iYXNlZCBkZWR1cCBzbyBtb25leSB3b3JrcyB0aGVyZSwKKy0tIGJ1dCB0aGUgaW5jcmVt ZW50YWwgbm9uLXNocmlua2luZyBwYXRoIHJlcXVpcmVzIGhhc2ggc3VwcG9ydC4KK1NFTEVDVCBj b3VudChESVNUSU5DVCB4Ojptb25leSkgT1ZFUiAoT1JERVIgQlkgeCkKK0ZST00gZ2VuZXJhdGVf c2VyaWVzKDEsIDUpIGcoeCk7IC0tIGVycm9yCitFUlJPUjogIGNvdWxkIG5vdCBmaW5kIGhhc2gg ZnVuY3Rpb24gZm9yIHdpbmRvdyBESVNUSU5DVCBhZ2dyZWdhdGUKK0hJTlQ6ICBUaGUgYXJndW1l bnQgdHlwZSBtdXN0IHN1cHBvcnQgaGFzaGluZy4KIC0tIEVycm9yOiBtdWx0aS1hcmd1bWVudCBE SVNUSU5DVCB3aW5kb3cgYWdncmVnYXRlIChub3QgeWV0IHN1cHBvcnRlZCkKIFNFTEVDVCBzdHJp bmdfYWdnKERJU1RJTkNUIGZvdXI6OnRleHQsICcsJykgT1ZFUiAoUEFSVElUSU9OIEJZIHRlbikK IEZST00gdGVuazE7IC0tIGVycm9yCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC93 aW5kb3cuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvd2luZG93LnNxbAppbmRleCA4ZTMxOWM0 NTQ2MS4uN2VjMzdiYTM3MjkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpbmRv dy5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvd2luZG93LnNxbApAQCAtMjIxMCwyNiAr MjIxMCw3NyBAQCBTRUxFQ1QgeCwKICAgICAgICBzdW0oRElTVElOQ1QgeCAlIDMpIE9WRVIgKFBB UlRJVElPTiBCWSB4ID4gNSkKIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgpOwogCi0t LSBFcnJvcjogbm9uLXdob2xlLXBhcnRpdGlvbiBmcmFtZSAoaGFzIE9SREVSIEJZIC0+IFJBTkdF IFVOQk9VTkRFRCBQUkVDRURJTkcgdG8gQ1VSUkVOVCBST1cpCistLSBOb24tc2hyaW5raW5nIGZy YW1lOiBPUkRFUiBCWSBwcm9kdWNlcyBSQU5HRSBVTkJPVU5ERUQgUFJFQ0VESU5HIHRvIENVUlJF TlQgUk9XCiBTRUxFQ1QgY291bnQoRElTVElOQ1QgeCkgT1ZFUiAoUEFSVElUSU9OIEJZIHggPiA1 IE9SREVSIEJZIHgpCi1GUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsgLS0gZXJyb3IK K0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgpOwogCi0tLSBFcnJvcjogcGFydGlhbCBS T1dTIGZyYW1lCi1TRUxFQ1QgY291bnQoRElTVElOQ1QgeCkgT1ZFUiAoUk9XUyAzIFBSRUNFRElO RykKLUZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgpOyAtLSBlcnJvcgorLS0gTm9uLXNo cmlua2luZyBmcmFtZTogcnVubmluZyBjb3VudCB3aXRoIE9SREVSIEJZIChkZWZhdWx0IFJBTkdF IGZyYW1lKQorU0VMRUNUIHgsIGNvdW50KERJU1RJTkNUIHggJSAzKSBPVkVSIChPUkRFUiBCWSB4 KQorRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTApIGcoeCk7CiAKLS0tIEVycm9yOiBFWENMVURF IGNsYXVzZQotU0VMRUNUIGNvdW50KERJU1RJTkNUIHgpIE9WRVIgKFJPV1MgQkVUV0VFTiBVTkJP VU5ERUQgUFJFQ0VESU5HIEFORCBVTkJPVU5ERUQgRk9MTE9XSU5HIEVYQ0xVREUgQ1VSUkVOVCBS T1cpCi1GUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsgLS0gZXJyb3IKKy0tIE5vbi1z aHJpbmtpbmcgZnJhbWU6IGV4cGxpY2l0IFJPV1MgVU5CT1VOREVEIFBSRUNFRElORyB0byBDVVJS RU5UIFJPVworU0VMRUNUIHgsIGNvdW50KERJU1RJTkNUIHggJSAzKSBPVkVSICgKKyAgICBST1dT IEJFVFdFRU4gVU5CT1VOREVEIFBSRUNFRElORyBBTkQgQ1VSUkVOVCBST1cpCitGUk9NIGdlbmVy YXRlX3NlcmllcygxLCAxMCkgZyh4KTsKKworLS0gTm9uLXNocmlua2luZyBmcmFtZTogUEFSVElU SU9OIEJZIGFuZCBPUkRFUiBCWQorU0VMRUNUIHgsIHN1bShESVNUSU5DVCB4ICUgMykgT1ZFUiAo UEFSVElUSU9OIEJZIHggPiA1IE9SREVSIEJZIHgpCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAx MCkgZyh4KTsKKworLS0gTm9uLXNocmlua2luZyBmcmFtZTogRklMVEVSIHdpdGggT1JERVIgQlkK K1NFTEVDVCB4LCBjb3VudChESVNUSU5DVCB4ICUgMykgRklMVEVSIChXSEVSRSB4ID4gMikgT1ZF UiAoT1JERVIgQlkgeCkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgpOworCistLSBO b24tc2hyaW5raW5nIGZyYW1lOiBtaXhlZCBESVNUSU5DVCArIG5vbi1ESVNUSU5DVCB3aXRoIE9S REVSIEJZCitTRUxFQ1QgeCwKKyAgICAgICBjb3VudChESVNUSU5DVCB4ICUgMykgT1ZFUiB3LAor ICAgICAgIHN1bSh4KSBPVkVSIHcKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDkpIGcoeCkKK1dJ TkRPVyB3IEFTIChPUkRFUiBCWSB4KTsKIAotLS0gRXJyb3I6IFJPV1MgQkVUV0VFTiBVTkJPVU5E RUQgUFJFQ0VESU5HIEFORCBDVVJSRU5UIFJPVyAobm90IHdob2xlLXBhcnRpdGlvbgotLS0gZXZl biB3aXRob3V0IE9SREVSIEJZLCBiZWNhdXNlIFJPV1MgQ1VSUkVOVCBST1cgbWVhbnMgZXhhY3Rs eSBvbmUgcm93KQorLS0gTm9uLXNocmlua2luZyBmcmFtZTogdmVyaWZ5IG1vbm90b25pY2FsbHkg aW5jcmVhc2luZyBydW5uaW5nIGNvdW50CitTRUxFQ1QgeCwgY291bnQoRElTVElOQ1QgeCkgT1ZF UiAoT1JERVIgQlkgeCkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDUpIGcoeCk7CisKKy0tIE5v bi1zaHJpbmtpbmcgZnJhbWU6IFJPV1MgVU5CT1VOREVEIFBSRUNFRElORyB0byBDVVJSRU5UIFJP VyB3aXRob3V0IE9SREVSIEJZCiBTRUxFQ1QgeCwKICAgICAgICBjb3VudChESVNUSU5DVCB4ICUg MykgT1ZFUiAoCiAgICAgICAgICAgIFJPV1MgQkVUV0VFTiBVTkJPVU5ERUQgUFJFQ0VESU5HIEFO RCBDVVJSRU5UIFJPVwogICAgICAgICkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgp OworCistLSBOb24tc2hyaW5raW5nIGZyYW1lOiBGT0xMT1dJTkcgYm91bmQgKG5vdCBqdXN0IENV UlJFTlQgUk9XKQorU0VMRUNUIHgsCisgICAgICAgY291bnQoRElTVElOQ1QgeCAlIDMpIE9WRVIg KAorICAgICAgICAgICBPUkRFUiBCWSB4CisgICAgICAgICAgIFJPV1MgQkVUV0VFTiBVTkJPVU5E RUQgUFJFQ0VESU5HIEFORCAyIEZPTExPV0lORworICAgICAgICkKK0ZST00gZ2VuZXJhdGVfc2Vy aWVzKDEsIDEwKSBnKHgpOworCistLSBFcnJvcjogc2xpZGluZyBmcmFtZSAoc3RhcnQgaXMgbm90 IFVOQk9VTkRFRCBQUkVDRURJTkcpCitTRUxFQ1QgY291bnQoRElTVElOQ1QgeCkgT1ZFUiAoUk9X UyAzIFBSRUNFRElORykKIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgpOyAtLSBlcnJv cgogCistLSBFcnJvcjogc2xpZGluZyBmcmFtZSB3aXRoIGV4cGxpY2l0IGJvdW5kcworU0VMRUNU IGNvdW50KERJU1RJTkNUIHgpIE9WRVIgKFJPV1MgQkVUV0VFTiAzIFBSRUNFRElORyBBTkQgQ1VS UkVOVCBST1cpCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsgLS0gZXJyb3IKKwor LS0gRXJyb3I6IEVYQ0xVREUgY2xhdXNlIHdpdGggT1JERVIgQlkKK1NFTEVDVCBjb3VudChESVNU SU5DVCB4KSBPVkVSICgKKyAgICBPUkRFUiBCWSB4IFJPV1MgQkVUV0VFTiBVTkJPVU5ERUQgUFJF Q0VESU5HIEFORCBDVVJSRU5UIFJPVworICAgIEVYQ0xVREUgQ1VSUkVOVCBST1cpCitGUk9NIGdl bmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsgLS0gZXJyb3IKKworLS0gRXJyb3I6IEVYQ0xVREUg Y2xhdXNlIHdpdGggVU5CT1VOREVEIGZyYW1lCitTRUxFQ1QgY291bnQoRElTVElOQ1QgeCkgT1ZF UiAoUk9XUyBCRVRXRUVOIFVOQk9VTkRFRCBQUkVDRURJTkcgQU5EIFVOQk9VTkRFRCBGT0xMT1dJ TkcgRVhDTFVERSBDVVJSRU5UIFJPVykKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgp OyAtLSBlcnJvcgorCistLSBFcnJvcjogbm9uLWhhc2hhYmxlIHR5cGUgd2l0aCBub24tc2hyaW5r aW5nIGZyYW1lIChtb25leSBoYXMgYnRyZWUgYnV0IG5vIGhhc2gpLgorLS0gV2hvbGUtcGFydGl0 aW9uIERJU1RJTkNUIHVzZXMgc29ydC1iYXNlZCBkZWR1cCBzbyBtb25leSB3b3JrcyB0aGVyZSwK Ky0tIGJ1dCB0aGUgaW5jcmVtZW50YWwgbm9uLXNocmlua2luZyBwYXRoIHJlcXVpcmVzIGhhc2gg c3VwcG9ydC4KK1NFTEVDVCBjb3VudChESVNUSU5DVCB4Ojptb25leSkgT1ZFUiAoT1JERVIgQlkg eCkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDUpIGcoeCk7IC0tIGVycm9yCisKIC0tIEVycm9y OiBtdWx0aS1hcmd1bWVudCBESVNUSU5DVCB3aW5kb3cgYWdncmVnYXRlIChub3QgeWV0IHN1cHBv cnRlZCkKIFNFTEVDVCBzdHJpbmdfYWdnKERJU1RJTkNUIGZvdXI6OnRleHQsICcsJykgT1ZFUiAo UEFSVElUSU9OIEJZIHRlbikKIEZST00gdGVuazE7IC0tIGVycm9yCi0tIAoyLjUyLjAKCg== --000000000000c18cea0650a3c85c Content-Type: application/octet-stream; name="v2-0002-Support-DISTINCT-in-whole-partition-window-aggreg.patch" Content-Disposition: attachment; filename="v2-0002-Support-DISTINCT-in-whole-partition-window-aggreg.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_moku2mpk1 RnJvbSA1MzFiODE1YzgwZTAyZGU5ZTYyY2QyZWM0ZDdkMGRjMTBiMjkzYjliIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYWlibyBZYW4gPGhhaWJvLnlhbkBhcHBsZS5jb20+CkRhdGU6 IFR1ZSwgNyBBcHIgMjAyNiAxMTo1Nzo1MCAtMDcwMApTdWJqZWN0OiBbUEFUQ0ggdjIgMDIvMTBd IFN1cHBvcnQgRElTVElOQ1QgaW4gd2hvbGUtcGFydGl0aW9uIHdpbmRvdwogYWdncmVnYXRlcwoK QWRkIGV4ZWN1dG9yIHN1cHBvcnQgZm9yIERJU1RJTkNUIGluIHBsYWluIGFnZ3JlZ2F0ZSB3aW5k b3cgZnVuY3Rpb25zCndoZW4gdGhlIGZyYW1lIGNvdmVycyB0aGUgZW50aXJlIHBhcnRpdGlvbi4g IENvbGxlY3QgYXJndW1lbnQgdmFsdWVzLApzb3J0LCBkZWR1cGxpY2F0ZSwgYW5kIHJ1biB0aGUg dHJhbnNpdGlvbiBmdW5jdGlvbiBvbmNlIHBlciBkaXN0aW5jdAp2YWx1ZTsgcmV1c2UgdGhlIHJl c3VsdCBmb3IgZXZlcnkgcm93LiAgT25seSBzaW5nbGUtYXJndW1lbnQgRElTVElOQ1QKaXMgaGFu ZGxlZDsgb3RoZXIgZnJhbWUgc2hhcGVzIGFyZSBzdGlsbCByZWplY3RlZC4KLS0tCiBzcmMvYmFj a2VuZC9leGVjdXRvci9ub2RlV2luZG93QWdnLmMgfCAzOTMgKysrKysrKysrKysrKysrKysrKysr KysrKystCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3dpbmRvdy5vdXQgfCAxNjYgKysrKysr KysrKy0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpbmRvdy5zcWwgICAgICB8ICA2NCArKysrLQog MyBmaWxlcyBjaGFuZ2VkLCA2MDkgaW5zZXJ0aW9ucygrKSwgMTQgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZVdpbmRvd0FnZy5jIGIvc3JjL2JhY2tl bmQvZXhlY3V0b3Ivbm9kZVdpbmRvd0FnZy5jCmluZGV4IDQwODdhYjFiMTZlLi4xNTU3NDViODk1 MiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZVdpbmRvd0FnZy5jCisrKyBi L3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVXaW5kb3dBZ2cuYwpAQCAtNDcsNiArNDcsNyBAQAog I2luY2x1ZGUgIm9wdGltaXplci9vcHRpbWl6ZXIuaCIKICNpbmNsdWRlICJwYXJzZXIvcGFyc2Vf YWdnLmgiCiAjaW5jbHVkZSAicGFyc2VyL3BhcnNlX2NvZXJjZS5oIgorI2luY2x1ZGUgInBhcnNl ci9wYXJzZV9vcGVyLmgiCiAjaW5jbHVkZSAidXRpbHMvYWNsLmgiCiAjaW5jbHVkZSAidXRpbHMv YnVpbHRpbnMuaCIKICNpbmNsdWRlICJ1dGlscy9kYXR1bS5oIgpAQCAtNTUsNiArNTYsNyBAQAog I2luY2x1ZGUgInV0aWxzL21lbXV0aWxzLmgiCiAjaW5jbHVkZSAidXRpbHMvcmVncHJvYy5oIgog I2luY2x1ZGUgInV0aWxzL3N5c2NhY2hlLmgiCisjaW5jbHVkZSAidXRpbHMvdHVwbGVzb3J0Lmgi CiAjaW5jbHVkZSAidXRpbHMvdHVwbGVzdG9yZS5oIgogI2luY2x1ZGUgIndpbmRvd2FwaS5oIgog CkBAIC0xNzEsNiArMTczLDE0IEBAIHR5cGVkZWYgc3RydWN0IFdpbmRvd1N0YXRlUGVyQWdnRGF0 YQogCiAJLyogRGF0YSBsb2NhbCB0byBldmFsX3dpbmRvd2FnZ3JlZ2F0ZXMoKSAqLwogCWJvb2wJ CXJlc3RhcnQ7CQkvKiBuZWVkIHRvIHJlc3RhcnQgdGhpcyBhZ2cgaW4gdGhpcyBjeWNsZT8gKi8K KworCS8qIERJU1RJTkNUIHN1cHBvcnQgKi8KKwlib29sCQl3aW5kaXN0aW5jdDsJLyogRElTVElO Q1Qgc3BlY2lmaWVkIG9uIHRoaXMgYWdncmVnYXRlICovCisJT2lkCQkJaW5wdXR0eXBlT2lkOwkv KiBPSUQgb2YgdGhlIHNpbmdsZSBESVNUSU5DVCBhcmd1bWVudCB0eXBlICovCisJT2lkCQkJc29y dE9wZXJhdG9yOwkvKiBidHJlZSA8IG9wZXJhdG9yIGZvciBzb3J0aW5nICovCisJT2lkCQkJc29y dENvbGxhdGlvbjsJLyogY29sbGF0aW9uIGZvciBzb3J0L2VxdWFsaXR5ICovCisJYm9vbAkJc29y dE51bGxzRmlyc3Q7IC8qIE5VTExTIEZJUlNUPyAqLworCUZtZ3JJbmZvCWVxdWFsZm47CQkvKiBl cXVhbGl0eSBjb21wYXJpc29uIGZ1bmN0aW9uICovCiB9IFdpbmRvd1N0YXRlUGVyQWdnRGF0YTsK IAogc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV93aW5kb3dhZ2dyZWdhdGUoV2luZG93QWdnU3RhdGUg KndpbnN0YXRlLApAQCAtMjA3LDYgKzIxNywxMSBAQCBzdGF0aWMgV2luZG93U3RhdGVQZXJBZ2dE YXRhICppbml0aWFsaXplX3BlcmFnZyhXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUsCiAJCQkJCQkJ CQkJCQlXaW5kb3dTdGF0ZVBlckFnZyBwZXJhZ2dzdGF0ZSk7CiBzdGF0aWMgRGF0dW0gR2V0QWdn SW5pdFZhbChEYXR1bSB0ZXh0SW5pdFZhbCwgT2lkIHRyYW5zdHlwZSk7CiAKK3N0YXRpYyBib29s IGlzX3dob2xlX3BhcnRpdGlvbl9mcmFtZShXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUpOworc3Rh dGljIHZvaWQgZXZhbF93aW5kb3dhZ2dyZWdhdGVfZGlzdGluY3QoV2luZG93QWdnU3RhdGUgKndp bnN0YXRlLAorCQkJCQkJCQkJCSAgV2luZG93U3RhdGVQZXJGdW5jIHBlcmZ1bmNzdGF0ZSwKKwkJ CQkJCQkJCQkgIFdpbmRvd1N0YXRlUGVyQWdnIHBlcmFnZ3N0YXRlKTsKKwogc3RhdGljIGJvb2wg YXJlX3BlZXJzKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwgVHVwbGVUYWJsZVNsb3QgKnNsb3Qx LAogCQkJCQkgIFR1cGxlVGFibGVTbG90ICpzbG90Mik7CiBzdGF0aWMgYm9vbCB3aW5kb3dfZ2V0 dHVwbGVzbG90KFdpbmRvd09iamVjdCB3aW5vYmosIGludDY0IHBvcywKQEAgLTY5NCw2ICs3MDks Mjk3IEBAIGZpbmFsaXplX3dpbmRvd2FnZ3JlZ2F0ZShXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUs CiAJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZENvbnRleHQpOwogfQogCisvKgorICogaXNfd2hv bGVfcGFydGl0aW9uX2ZyYW1lCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgZnJh bWUgaXMgZ3VhcmFudGVlZCB0byBjb3ZlciB0aGUgZW50aXJlCisgKiBwYXJ0aXRpb24uICBUaGlz IGlzIHRoZSBjYXNlIHdoZW4gdGhlIHN0YXJ0IGlzIFVOQk9VTkRFRCBQUkVDRURJTkcsCisgKiB0 aGVyZSBpcyBubyBFWENMVVNJT04gY2xhdXNlLCBhbmQgdGhlIGVuZCBpcyBlaXRoZXIgVU5CT1VO REVEIEZPTExPV0lORworICogb3IgQ1VSUkVOVCBST1cgd2l0aCBubyBPUkRFUiBCWSBpbiBSQU5H RSBvciBHUk9VUFMgbW9kZSAod2hpY2ggbWVhbnMKKyAqIGFsbCByb3dzIGFyZSBwZWVycywgc28g Q1VSUkVOVCBST1cgZXh0ZW5kcyB0byB0aGUgcGFydGl0aW9uIGJvdW5kYXJ5KS4KKyAqIEluIFJP V1MgbW9kZSwgQ1VSUkVOVCBST1cgYWx3YXlzIG1lYW5zIGV4YWN0bHkgdGhlIGN1cnJlbnQgcm93 LgorICovCitzdGF0aWMgYm9vbAoraXNfd2hvbGVfcGFydGl0aW9uX2ZyYW1lKFdpbmRvd0FnZ1N0 YXRlICp3aW5zdGF0ZSkKK3sKKwlXaW5kb3dBZ2cgICpub2RlID0gKFdpbmRvd0FnZyAqKSB3aW5z dGF0ZS0+c3MucHMucGxhbjsKKwlpbnQJCQlmcmFtZU9wdGlvbnMgPSB3aW5zdGF0ZS0+ZnJhbWVP cHRpb25zOworCisJLyogTXVzdCBzdGFydCBhdCBVTkJPVU5ERUQgUFJFQ0VESU5HICovCisJaWYg KCEoZnJhbWVPcHRpb25zICYgRlJBTUVPUFRJT05fU1RBUlRfVU5CT1VOREVEX1BSRUNFRElORykp CisJCXJldHVybiBmYWxzZTsKKworCS8qIE11c3Qgbm90IGhhdmUgYW4gRVhDTFVTSU9OIGNsYXVz ZSAqLworCWlmIChmcmFtZU9wdGlvbnMgJiBGUkFNRU9QVElPTl9FWENMVVNJT04pCisJCXJldHVy biBmYWxzZTsKKworCS8qIEVuZCBtdXN0IGJlIFVOQk9VTkRFRCBGT0xMT1dJTkcgLi4uICovCisJ aWYgKGZyYW1lT3B0aW9ucyAmIEZSQU1FT1BUSU9OX0VORF9VTkJPVU5ERURfRk9MTE9XSU5HKQor CQlyZXR1cm4gdHJ1ZTsKKworCS8qCisJICogLi4uIG9yIENVUlJFTlQgUk9XIHdpdGggbm8gT1JE RVIgQlkgKGFsbCByb3dzIGFyZSBwZWVycyksIGJ1dCBvbmx5CisJICogZm9yIFJBTkdFIG9yIEdS T1VQUyBtb2RlLiAgSW4gUk9XUyBtb2RlLCBDVVJSRU5UIFJPVyBtZWFucyBleGFjdGx5CisJICog dGhlIGN1cnJlbnQgcm93IHJlZ2FyZGxlc3Mgb2YgcGVlcnMuCisJICovCisJaWYgKChmcmFtZU9w dGlvbnMgJiBGUkFNRU9QVElPTl9FTkRfQ1VSUkVOVF9ST1cpICYmCisJCSEoZnJhbWVPcHRpb25z ICYgRlJBTUVPUFRJT05fUk9XUykgJiYKKwkJbm9kZS0+b3JkTnVtQ29scyA9PSAwKQorCQlyZXR1 cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIGV2YWxfd2luZG93YWdncmVn YXRlX2Rpc3RpbmN0CisgKgorICogQ29tcHV0ZSBhIHNpbmdsZS1hcmd1bWVudCBESVNUSU5DVCB3 aW5kb3cgYWdncmVnYXRlIG92ZXIgdGhlIHdob2xlCisgKiBwYXJ0aXRpb24uICBXZSBjb2xsZWN0 IGFsbCBhcmd1bWVudCB2YWx1ZXMgKGFwcGx5aW5nIGFueSBGSUxURVIgY2xhdXNlKSwKKyAqIHNv cnQgdGhlbSwgc2tpcCBkdXBsaWNhdGVzLCBhbmQgZmVlZCB0aGUgZGlzdGluY3QgdmFsdWVzIGlu dG8gdGhlCisgKiBhZ2dyZWdhdGUncyB0cmFuc2l0aW9uIGZ1bmN0aW9uLgorICoKKyAqIFRoaXMg Zm9sbG93cyB0aGUgcGF0dGVybiBvZiBwcm9jZXNzX29yZGVyZWRfYWdncmVnYXRlX3NpbmdsZSgp IGluCisgKiBub2RlQWdnLmMuCisgKi8KK3N0YXRpYyB2b2lkCitldmFsX3dpbmRvd2FnZ3JlZ2F0 ZV9kaXN0aW5jdChXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUsCisJCQkJCQkJICBXaW5kb3dTdGF0 ZVBlckZ1bmMgcGVyZnVuY3N0YXRlLAorCQkJCQkJCSAgV2luZG93U3RhdGVQZXJBZ2cgcGVyYWdn c3RhdGUpCit7CisJV2luZG93T2JqZWN0IGFnZ193aW5vYmogPSB3aW5zdGF0ZS0+YWdnX3dpbm9i ajsKKwlUdXBsZVRhYmxlU2xvdCAqdGVtcF9zbG90ID0gd2luc3RhdGUtPnRlbXBfc2xvdF8xOwor CUV4cHJDb250ZXh0ICplY29udGV4dCA9IHdpbnN0YXRlLT50bXBjb250ZXh0OworCVdpbmRvd0Z1 bmNFeHByU3RhdGUgKndmdW5jc3RhdGUgPSBwZXJmdW5jc3RhdGUtPndmdW5jc3RhdGU7CisJRXhw clN0YXRlICAqZmlsdGVyID0gd2Z1bmNzdGF0ZS0+YWdnZmlsdGVyOworCWludAkJCW51bUFyZ3Vt ZW50cyA9IHBlcmZ1bmNzdGF0ZS0+bnVtQXJndW1lbnRzOworCUxPQ0FMX0ZDSU5GTyhmY2luZm8s IEZVTkNfTUFYX0FSR1MpOworCVR1cGxlc29ydHN0YXRlICpzb3J0c3RhdGU7CisJRGF0dW0JCW5l d1ZhbDsKKwlib29sCQluZXdJc051bGw7CisJRGF0dW0JCW5ld0FiYnJldlZhbDsKKwlEYXR1bQkJ b2xkVmFsID0gKERhdHVtKSAwOworCWJvb2wJCW9sZElzTnVsbCA9IHRydWU7CisJYm9vbAkJaGF2 ZU9sZFZhbCA9IGZhbHNlOworCURhdHVtCQlvbGRBYmJyZXZWYWwgPSAoRGF0dW0pIDA7CisJTWVt b3J5Q29udGV4dCBvbGRDb250ZXh0OworCWludDY0CQl0b3RhbF9yb3dzOworCWludDY0CQlyb3c7 CisKKwkvKiBFbnN1cmUgYWxsIHBhcnRpdGlvbiByb3dzIGFyZSBzcG9vbGVkICovCisJc3Bvb2xf dHVwbGVzKHdpbnN0YXRlLCAtMSk7CisJdG90YWxfcm93cyA9IHdpbnN0YXRlLT5zcG9vbGVkX3Jv d3M7CisKKwkvKiBDcmVhdGUgYSB0dXBsZXNvcnQgZm9yIHRoZSBzaW5nbGUgRElTVElOQ1QgYXJn dW1lbnQgKi8KKwlzb3J0c3RhdGUgPSB0dXBsZXNvcnRfYmVnaW5fZGF0dW0ocGVyYWdnc3RhdGUt PmlucHV0dHlwZU9pZCwKKwkJCQkJCQkJCSAgcGVyYWdnc3RhdGUtPnNvcnRPcGVyYXRvciwKKwkJ CQkJCQkJCSAgcGVyYWdnc3RhdGUtPnNvcnRDb2xsYXRpb24sCisJCQkJCQkJCQkgIHBlcmFnZ3N0 YXRlLT5zb3J0TnVsbHNGaXJzdCwKKwkJCQkJCQkJCSAgd29ya19tZW0sIE5VTEwsIFRVUExFU09S VF9OT05FKTsKKworCS8qCisJICogTG9vcCBvdmVyIGFsbCByb3dzIGluIHRoZSBwYXJ0aXRpb24s IGV2YWx1YXRlIEZJTFRFUiBhbmQgdGhlIGFyZ3VtZW50LAorCSAqIGFuZCBmZWVkIHZhbHVlcyBp bnRvIHRoZSBzb3J0LgorCSAqLworCWZvciAocm93ID0gMDsgcm93IDwgdG90YWxfcm93czsgcm93 KyspCisJeworCQlpZiAoIXdpbmRvd19nZXR0dXBsZXNsb3QoYWdnX3dpbm9iaiwgcm93LCB0ZW1w X3Nsb3QpKQorCQkJYnJlYWs7CisKKwkJZWNvbnRleHQtPmVjeHRfb3V0ZXJ0dXBsZSA9IHRlbXBf c2xvdDsKKworCQlvbGRDb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKGVjb250ZXh0LT5l Y3h0X3Blcl90dXBsZV9tZW1vcnkpOworCisJCS8qIFNraXAgYW55dGhpbmcgRklMVEVSZWQgb3V0 ICovCisJCWlmIChmaWx0ZXIpCisJCXsKKwkJCWJvb2wJCWlzbnVsbDsKKwkJCURhdHVtCQlyZXMg PSBFeGVjRXZhbEV4cHIoZmlsdGVyLCBlY29udGV4dCwgJmlzbnVsbCk7CisKKwkJCWlmIChpc251 bGwgfHwgIURhdHVtR2V0Qm9vbChyZXMpKQorCQkJeworCQkJCU1lbW9yeUNvbnRleHRTd2l0Y2hU byhvbGRDb250ZXh0KTsKKwkJCQlSZXNldEV4cHJDb250ZXh0KGVjb250ZXh0KTsKKwkJCQlFeGVj Q2xlYXJUdXBsZSh0ZW1wX3Nsb3QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyog RXZhbHVhdGUgdGhlIHNpbmdsZSBhcmd1bWVudCAqLworCQl7CisJCQlFeHByU3RhdGUgICphcmdz dGF0ZSA9IChFeHByU3RhdGUgKikgbGluaXRpYWwod2Z1bmNzdGF0ZS0+YXJncyk7CisJCQlEYXR1 bQkJdmFsOworCQkJYm9vbAkJaXNudWxsOworCisJCQl2YWwgPSBFeGVjRXZhbEV4cHIoYXJnc3Rh dGUsIGVjb250ZXh0LCAmaXNudWxsKTsKKworCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZENv bnRleHQpOworCisJCQkvKiBGZWVkIGludG8gc29ydCAqLworCQkJdHVwbGVzb3J0X3B1dGRhdHVt KHNvcnRzdGF0ZSwgdmFsLCBpc251bGwpOworCQl9CisKKwkJUmVzZXRFeHByQ29udGV4dChlY29u dGV4dCk7CisJCUV4ZWNDbGVhclR1cGxlKHRlbXBfc2xvdCk7CisJfQorCisJLyogU29ydCAqLwor CXR1cGxlc29ydF9wZXJmb3Jtc29ydChzb3J0c3RhdGUpOworCisJLyoKKwkgKiBSZWFkIGJhY2sg c29ydGVkIHZhbHVlcywgc2tpcCBkdXBsaWNhdGVzLCBhbmQgZmVlZCBkaXN0aW5jdCB2YWx1ZXMK KwkgKiBpbnRvIHRoZSB0cmFuc2l0aW9uIGZ1bmN0aW9uLiAgVGhpcyBtaXJyb3JzCisJICogcHJv Y2Vzc19vcmRlcmVkX2FnZ3JlZ2F0ZV9zaW5nbGUoKSBpbiBub2RlQWdnLmMuCisJICovCisJd2hp bGUgKHR1cGxlc29ydF9nZXRkYXR1bShzb3J0c3RhdGUsIHRydWUsIGZhbHNlLAorCQkJCQkJCSAg Jm5ld1ZhbCwgJm5ld0lzTnVsbCwgJm5ld0FiYnJldlZhbCkpCisJeworCQlSZXNldEV4cHJDb250 ZXh0KGVjb250ZXh0KTsKKwkJb2xkQ29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhlY29u dGV4dC0+ZWN4dF9wZXJfdHVwbGVfbWVtb3J5KTsKKworCQkvKgorCQkgKiBJZiBESVNUSU5DVCBt b2RlLCBza2lwIGlmIG5vdCBkaXN0aW5jdCBmcm9tIHByaW9yIHZhbHVlLgorCQkgKi8KKwkJaWYg KGhhdmVPbGRWYWwgJiYKKwkJCSgob2xkSXNOdWxsICYmIG5ld0lzTnVsbCkgfHwKKwkJCSAoIW9s ZElzTnVsbCAmJiAhbmV3SXNOdWxsICYmCisJCQkgIG9sZEFiYnJldlZhbCA9PSBuZXdBYmJyZXZW YWwgJiYKKwkJCSAgRGF0dW1HZXRCb29sKEZ1bmN0aW9uQ2FsbDJDb2xsKCZwZXJhZ2dzdGF0ZS0+ ZXF1YWxmbiwKKwkJCQkJCQkJCQkJIHBlcmFnZ3N0YXRlLT5zb3J0Q29sbGF0aW9uLAorCQkJCQkJ CQkJCQkgb2xkVmFsLCBuZXdWYWwpKSkpKQorCQl7CisJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8o b2xkQ29udGV4dCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIEFkdmFuY2UgdGhl IHRyYW5zaXRpb24gZnVuY3Rpb24gd2l0aCB0aGlzIGRpc3RpbmN0IHZhbHVlLgorCQkgKiBUaGlz IHJlcGxpY2F0ZXMgdGhlIHN0cmljdC1mdW5jdGlvbiBoYW5kbGluZyBmcm9tCisJCSAqIGFkdmFu Y2Vfd2luZG93YWdncmVnYXRlKCkuCisJCSAqLworCQlpZiAocGVyYWdnc3RhdGUtPnRyYW5zZm4u Zm5fc3RyaWN0KQorCQl7CisJCQkvKiBGb3Igc3RyaWN0IHRyYW5zZm4sIHNraXAgTlVMTCBpbnB1 dHMgKi8KKwkJCWlmIChuZXdJc051bGwpCisJCQl7CisJCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRv KG9sZENvbnRleHQpOworCQkJCWdvdG8gcmVtZW1iZXJfdmFsdWU7CisJCQl9CisKKwkJCS8qCisJ CQkgKiBGb3Igc3RyaWN0IHRyYW5zaXRpb24gZnVuY3Rpb25zIHdpdGggaW5pdGlhbCB2YWx1ZSBO VUxMLAorCQkJICogdXNlIHRoZSBmaXJzdCBub24tTlVMTCBpbnB1dCBhcyB0aGUgaW5pdGlhbCBz dGF0ZS4KKwkJCSAqLworCQkJaWYgKHBlcmFnZ3N0YXRlLT50cmFuc1ZhbHVlQ291bnQgPT0gMCAm JgorCQkJCXBlcmFnZ3N0YXRlLT50cmFuc1ZhbHVlSXNOdWxsKQorCQkJeworCQkJCU1lbW9yeUNv bnRleHRTd2l0Y2hUbyhwZXJhZ2dzdGF0ZS0+YWdnY29udGV4dCk7CisJCQkJcGVyYWdnc3RhdGUt PnRyYW5zVmFsdWUgPSBkYXR1bUNvcHkobmV3VmFsLAorCQkJCQkJCQkJCQkJCXBlcmFnZ3N0YXRl LT50cmFuc3R5cGVCeVZhbCwKKwkJCQkJCQkJCQkJCQlwZXJhZ2dzdGF0ZS0+dHJhbnN0eXBlTGVu KTsKKwkJCQlwZXJhZ2dzdGF0ZS0+dHJhbnNWYWx1ZUlzTnVsbCA9IGZhbHNlOworCQkJCXBlcmFn Z3N0YXRlLT50cmFuc1ZhbHVlQ291bnQgPSAxOworCQkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhv bGRDb250ZXh0KTsKKwkJCQlnb3RvIHJlbWVtYmVyX3ZhbHVlOworCQkJfQorCisJCQlpZiAocGVy YWdnc3RhdGUtPnRyYW5zVmFsdWVJc051bGwpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBEb24ndCBj YWxsIGEgc3RyaWN0IGZ1bmN0aW9uIHdpdGggTlVMTCBpbnB1dHMuCisJCQkJICovCisJCQkJTWVt b3J5Q29udGV4dFN3aXRjaFRvKG9sZENvbnRleHQpOworCQkJCWdvdG8gcmVtZW1iZXJfdmFsdWU7 CisJCQl9CisJCX0KKworCQkvKiBPSyB0byBjYWxsIHRoZSB0cmFuc2l0aW9uIGZ1bmN0aW9uICov CisJCUluaXRGdW5jdGlvbkNhbGxJbmZvRGF0YSgqZmNpbmZvLCAmKHBlcmFnZ3N0YXRlLT50cmFu c2ZuKSwKKwkJCQkJCQkJIG51bUFyZ3VtZW50cyArIDEsCisJCQkJCQkJCSBwZXJmdW5jc3RhdGUt PndpbkNvbGxhdGlvbiwKKwkJCQkJCQkJIChOb2RlICopIHdpbnN0YXRlLCBOVUxMKTsKKwkJZmNp bmZvLT5hcmdzWzBdLnZhbHVlID0gcGVyYWdnc3RhdGUtPnRyYW5zVmFsdWU7CisJCWZjaW5mby0+ YXJnc1swXS5pc251bGwgPSBwZXJhZ2dzdGF0ZS0+dHJhbnNWYWx1ZUlzTnVsbDsKKwkJZmNpbmZv LT5hcmdzWzFdLnZhbHVlID0gbmV3VmFsOworCQlmY2luZm8tPmFyZ3NbMV0uaXNudWxsID0gbmV3 SXNOdWxsOworCQl3aW5zdGF0ZS0+Y3VyYWdnY29udGV4dCA9IHBlcmFnZ3N0YXRlLT5hZ2djb250 ZXh0OworCisJCXsKKwkJCURhdHVtCQlyZXN1bHQ7CisKKwkJCXJlc3VsdCA9IEZ1bmN0aW9uQ2Fs bEludm9rZShmY2luZm8pOworCQkJd2luc3RhdGUtPmN1cmFnZ2NvbnRleHQgPSBOVUxMOworCisJ CQlwZXJhZ2dzdGF0ZS0+dHJhbnNWYWx1ZUNvdW50Kys7CisKKwkJCS8qCisJCQkgKiBJZiBwYXNz LWJ5LXJlZiBkYXRhdHlwZSwgbXVzdCBjb3B5IHRoZSBuZXcgdmFsdWUgaW50bworCQkJICogYWdn Y29udGV4dCBhbmQgZnJlZSB0aGUgcHJpb3IgdHJhbnNWYWx1ZS4gIEJ1dCBpZiB0cmFuc2ZuCisJ CQkgKiByZXR1cm5lZCBhIHBvaW50ZXIgdG8gaXRzIGZpcnN0IGlucHV0LCB3ZSBkb24ndCBuZWVk IHRvIGRvCisJCQkgKiBhbnl0aGluZy4gIEFsc28sIGlmIHRyYW5zZm4gcmV0dXJuZWQgYSBwb2lu dGVyIHRvIGEgUi9XCisJCQkgKiBleHBhbmRlZCBvYmplY3QgdGhhdCBpcyBhbHJlYWR5IGEgY2hp bGQgb2YgdGhlIGFnZ2NvbnRleHQsCisJCQkgKiBhc3N1bWUgd2UgY2FuIGFkb3B0IHRoYXQgdmFs dWUgd2l0aG91dCBjb3B5aW5nIGl0LgorCQkJICoKKwkJCSAqIFRoaXMgbXVzdCBtYXRjaCBhZHZh bmNlX3dpbmRvd2FnZ3JlZ2F0ZSdzIGxvZ2ljIGV4YWN0bHkuCisJCQkgKi8KKwkJCWlmICghcGVy YWdnc3RhdGUtPnRyYW5zdHlwZUJ5VmFsICYmCisJCQkJRGF0dW1HZXRQb2ludGVyKHJlc3VsdCkg IT0gRGF0dW1HZXRQb2ludGVyKHBlcmFnZ3N0YXRlLT50cmFuc1ZhbHVlKSkKKwkJCXsKKwkJCQlp ZiAoIWZjaW5mby0+aXNudWxsKQorCQkJCXsKKwkJCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKHBl cmFnZ3N0YXRlLT5hZ2djb250ZXh0KTsKKwkJCQkJaWYgKERhdHVtSXNSZWFkV3JpdGVFeHBhbmRl ZE9iamVjdChyZXN1bHQsCisJCQkJCQkJCQkJCQkJICAgZmFsc2UsCisJCQkJCQkJCQkJCQkJICAg cGVyYWdnc3RhdGUtPnRyYW5zdHlwZUxlbikgJiYKKwkJCQkJCU1lbW9yeUNvbnRleHRHZXRQYXJl bnQoRGF0dW1HZXRFT0hQKHJlc3VsdCktPmVvaF9jb250ZXh0KSA9PSBDdXJyZW50TWVtb3J5Q29u dGV4dCkKKwkJCQkJCSAvKiBkbyBub3RoaW5nICovIDsKKwkJCQkJZWxzZQorCQkJCQkJcmVzdWx0 ID0gZGF0dW1Db3B5KHJlc3VsdCwKKwkJCQkJCQkJCQkgICBwZXJhZ2dzdGF0ZS0+dHJhbnN0eXBl QnlWYWwsCisJCQkJCQkJCQkJICAgcGVyYWdnc3RhdGUtPnRyYW5zdHlwZUxlbik7CisJCQkJfQor CQkJCWlmICghcGVyYWdnc3RhdGUtPnRyYW5zVmFsdWVJc051bGwpCisJCQkJeworCQkJCQlpZiAo RGF0dW1Jc1JlYWRXcml0ZUV4cGFuZGVkT2JqZWN0KHBlcmFnZ3N0YXRlLT50cmFuc1ZhbHVlLAor CQkJCQkJCQkJCQkJCSAgIGZhbHNlLAorCQkJCQkJCQkJCQkJCSAgIHBlcmFnZ3N0YXRlLT50cmFu c3R5cGVMZW4pKQorCQkJCQkJRGVsZXRlRXhwYW5kZWRPYmplY3QocGVyYWdnc3RhdGUtPnRyYW5z VmFsdWUpOworCQkJCQllbHNlCisJCQkJCQlwZnJlZShEYXR1bUdldFBvaW50ZXIocGVyYWdnc3Rh dGUtPnRyYW5zVmFsdWUpKTsKKwkJCQl9CisJCQl9CisKKwkJCU1lbW9yeUNvbnRleHRTd2l0Y2hU byhvbGRDb250ZXh0KTsKKwkJCXBlcmFnZ3N0YXRlLT50cmFuc1ZhbHVlID0gcmVzdWx0OworCQkJ cGVyYWdnc3RhdGUtPnRyYW5zVmFsdWVJc051bGwgPSBmY2luZm8tPmlzbnVsbDsKKwkJfQorCity ZW1lbWJlcl92YWx1ZToKKwkJLyoKKwkJICogUmVtZW1iZXIgdGhlIGN1cnJlbnQgdmFsdWUgZm9y IHN1YnNlcXVlbnQgZHVwbGljYXRlIGNoZWNrcy4KKwkJICovCisJCWlmICghcGVyYWdnc3RhdGUt PmlucHV0dHlwZUJ5VmFsKQorCQl7CisJCQlpZiAoIW9sZElzTnVsbCkKKwkJCQlwZnJlZShEYXR1 bUdldFBvaW50ZXIob2xkVmFsKSk7CisJCQlpZiAoIW5ld0lzTnVsbCkKKwkJCQlvbGRWYWwgPSBk YXR1bUNvcHkobmV3VmFsLCBwZXJhZ2dzdGF0ZS0+aW5wdXR0eXBlQnlWYWwsCisJCQkJCQkJCSAg IHBlcmFnZ3N0YXRlLT5pbnB1dHR5cGVMZW4pOworCQkJZWxzZQorCQkJCW9sZFZhbCA9IChEYXR1 bSkgMDsKKwkJfQorCQllbHNlCisJCQlvbGRWYWwgPSBuZXdWYWw7CisJCW9sZEFiYnJldlZhbCA9 IG5ld0FiYnJldlZhbDsKKwkJb2xkSXNOdWxsID0gbmV3SXNOdWxsOworCQloYXZlT2xkVmFsID0g dHJ1ZTsKKwl9CisKKwlpZiAoIW9sZElzTnVsbCAmJiAhcGVyYWdnc3RhdGUtPmlucHV0dHlwZUJ5 VmFsKQorCQlwZnJlZShEYXR1bUdldFBvaW50ZXIob2xkVmFsKSk7CisKKwl0dXBsZXNvcnRfZW5k KHNvcnRzdGF0ZSk7Cit9CisKIC8qCiAgKiBldmFsX3dpbmRvd2FnZ3JlZ2F0ZXMKICAqIGV2YWx1 YXRlIHBsYWluIGFnZ3JlZ2F0ZXMgYmVpbmcgdXNlZCBhcyB3aW5kb3cgZnVuY3Rpb25zCkBAIC05 NDcsNiArMTI1MywyMiBAQCBldmFsX3dpbmRvd2FnZ3JlZ2F0ZXMoV2luZG93QWdnU3RhdGUgKndp bnN0YXRlKQogCQl9CiAJfQogCisJLyoKKwkgKiBDb21wdXRlIERJU1RJTkNUIGFnZ3JlZ2F0ZXMg Zm9yIHRoZSB3aG9sZSBwYXJ0aXRpb24uICBUaGVzZSBhcmUgaGFuZGxlZAorCSAqIHNlcGFyYXRl bHkgdmlhIHNvcnQtYmFzZWQgZGVkdXBsaWNhdGlvbiByYXRoZXIgdGhhbiB0aGUgbWFpbgorCSAq IGFjY3VtdWxhdGlvbiBsb29wIGJlbG93LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBudW1hZ2dz OyBpKyspCisJeworCQlwZXJhZ2dzdGF0ZSA9ICZ3aW5zdGF0ZS0+cGVyYWdnW2ldOworCQlpZiAo IXBlcmFnZ3N0YXRlLT53aW5kaXN0aW5jdCB8fCAhcGVyYWdnc3RhdGUtPnJlc3RhcnQpCisJCQlj b250aW51ZTsKKwkJd2Z1bmNubyA9IHBlcmFnZ3N0YXRlLT53ZnVuY25vOworCQlldmFsX3dpbmRv d2FnZ3JlZ2F0ZV9kaXN0aW5jdCh3aW5zdGF0ZSwKKwkJCQkJCQkJCSAgJndpbnN0YXRlLT5wZXJm dW5jW3dmdW5jbm9dLAorCQkJCQkJCQkJICBwZXJhZ2dzdGF0ZSk7CisJfQorCiAJLyoKIAkgKiBO b24tcmVzdGFydGVkIGFnZ3JlZ2F0ZXMgbm93IGNvbnRhaW4gdGhlIHJvd3MgYmV0d2VlbiBhZ2dy ZWdhdGVkYmFzZQogCSAqIChpLmUuLCBmcmFtZWhlYWRwb3MpIGFuZCBhZ2dyZWdhdGVkdXB0bywg d2hpbGUgcmVzdGFydGVkIGFnZ3JlZ2F0ZXMKQEAgLTEwMDMsNiArMTMyNSwxMCBAQCBldmFsX3dp bmRvd2FnZ3JlZ2F0ZXMoV2luZG93QWdnU3RhdGUgKndpbnN0YXRlKQogCQl7CiAJCQlwZXJhZ2dz dGF0ZSA9ICZ3aW5zdGF0ZS0+cGVyYWdnW2ldOwogCisJCQkvKiBESVNUSU5DVCBhZ2dyZWdhdGVz IGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkgKi8KKwkJCWlmIChwZXJhZ2dzdGF0ZS0+d2luZGlzdGlu Y3QpCisJCQkJY29udGludWU7CisKIAkJCS8qIE5vbi1yZXN0YXJ0ZWQgYWdncyBza2lwIHVudGls IGFnZ3JlZ2F0ZWR1cHRvX25vbnJlc3RhcnRlZCAqLwogCQkJaWYgKCFwZXJhZ2dzdGF0ZS0+cmVz dGFydCAmJgogCQkJCXdpbnN0YXRlLT5hZ2dyZWdhdGVkdXB0byA8IGFnZ3JlZ2F0ZWR1cHRvX25v bnJlc3RhcnRlZCkKQEAgLTExNzAsNiArMTQ5NiwyNiBAQCBwcmVwYXJlX3R1cGxlc3RvcmUoV2lu ZG93QWdnU3RhdGUgKndpbnN0YXRlKQogCQkJcmVhZHB0cl9mbGFncyB8PSBFWEVDX0ZMQUdfQkFD S1dBUkQ7CiAJCX0KIAorCQkvKgorCQkgKiBJZiBhbnkgYWdncmVnYXRlIHVzZXMgRElTVElOQ1Qs IHRoZSByZWFkIHBvaW50ZXIgYWxzbyBuZWVkcworCQkgKiBCQUNLV0FSRCBjYXBhYmlsaXR5LiAg VGhlIERJU1RJTkNUIGhlbHBlciByZWFkcyB0aHJvdWdoIHRoZQorCQkgKiBlbnRpcmUgcGFydGl0 aW9uIHRvIGNvbGxlY3QgdmFsdWVzIGZvciBzb3J0aW5nLCB3aGljaCBhZHZhbmNlcworCQkgKiB0 aGUgcmVhZCBwb2ludGVyIHRvIHRoZSBlbmQuICBUaGUgbWFpbiBhY2N1bXVsYXRpb24gbG9vcCAo Zm9yCisJCSAqIG5vbi1ESVNUSU5DVCBhZ2dyZWdhdGVzIGluIHRoZSBzYW1lIFdpbmRvd0FnZyBu b2RlKSB0aGVuIG5lZWRzCisJCSAqIHRvIHJld2luZCBiYWNrIHRvIHRoZSBmcmFtZSBoZWFkLgor CQkgKi8KKwkJaWYgKCEocmVhZHB0cl9mbGFncyAmIEVYRUNfRkxBR19CQUNLV0FSRCkpCisJCXsK KwkJCWZvciAoaW50IGkgPSAwOyBpIDwgd2luc3RhdGUtPm51bWFnZ3M7IGkrKykKKwkJCXsKKwkJ CQlpZiAod2luc3RhdGUtPnBlcmFnZ1tpXS53aW5kaXN0aW5jdCkKKwkJCQl7CisJCQkJCXJlYWRw dHJfZmxhZ3MgfD0gRVhFQ19GTEFHX0JBQ0tXQVJEOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9 CisJCX0KKwogCQlhZ2dfd2lub2JqLT5yZWFkcHRyID0gdHVwbGVzdG9yZV9hbGxvY19yZWFkX3Bv aW50ZXIod2luc3RhdGUtPmJ1ZmZlciwKIAkJCQkJCQkJCQkJCQkJCXJlYWRwdHJfZmxhZ3MpOwog CX0KQEAgLTI5MzAsNyArMzI3Niw4IEBAIEV4ZWNSZVNjYW5XaW5kb3dBZ2coV2luZG93QWdnU3Rh dGUgKm5vZGUpCiAvKgogICogaW5pdGlhbGl6ZV9wZXJhZ2cKICAqCi0gKiBBbG1vc3Qgc2FtZSBh cyBpbiBub2RlQWdnLmMsIGV4Y2VwdCB3ZSBkb24ndCBzdXBwb3J0IERJU1RJTkNUIGN1cnJlbnRs eS4KKyAqIEFsbW9zdCBzYW1lIGFzIGluIG5vZGVBZ2cuYywgZXhjZXB0IHdlIG9ubHkgc3VwcG9y dCBESVNUSU5DVCBmb3IKKyAqIHdob2xlLXBhcnRpdGlvbiBmcmFtZXMgYW5kIHNpbmdsZS1hcmd1 bWVudCBhZ2dyZWdhdGVzLgogICovCiBzdGF0aWMgV2luZG93U3RhdGVQZXJBZ2dEYXRhICoKIGlu aXRpYWxpemVfcGVyYWdnKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwgV2luZG93RnVuYyAqd2Z1 bmMsCkBAIC0yOTU3LDEzICszMzA0LDIwIEBAIGluaXRpYWxpemVfcGVyYWdnKFdpbmRvd0FnZ1N0 YXRlICp3aW5zdGF0ZSwgV2luZG93RnVuYyAqd2Z1bmMsCiAJTGlzdENlbGwgICAqbGM7CiAKIAkv KgotCSAqIFRlbXBvcmFyeTogcmVqZWN0IERJU1RJTkNUIHdpbmRvdyBhZ2dyZWdhdGVzIHVudGls IGV4ZWN1dG9yIHN1cHBvcnQKLQkgKiBsYW5kcy4gIFBhdGNoIDIgd2lsbCByZXBsYWNlIHRoaXMg d2l0aCBhY3R1YWwgRElTVElOQ1QgaGFuZGxpbmcuCisJICogVmFsaWRhdGUgRElTVElOQ1QgdXNh Z2UuICBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IERJU1RJTkNUIGZvcgorCSAqIHdob2xlLXBh cnRpdGlvbiBmcmFtZXMgKHdoZXJlIHRoZSByZXN1bHQgaXMgY29uc3RhbnQgYWNyb3NzIHRoZQor CSAqIHBhcnRpdGlvbikgYW5kIHNpbmdsZS1hcmd1bWVudCBhZ2dyZWdhdGVzIG9ubHkuCiAJICov Ci0JaWYgKHdmdW5jLT53aW5kaXN0aW5jdCkKKwlpZiAod2Z1bmMtPndpbmRpc3RpbmN0ICYmICFp c193aG9sZV9wYXJ0aXRpb25fZnJhbWUod2luc3RhdGUpKQogCQllcmVwb3J0KEVSUk9SLAogCQkJ CShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKLQkJCQkgZXJybXNnKCJE SVNUSU5DVCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGZvciB3aW5kb3cgYWdncmVnYXRlcyIpKSk7 CisJCQkJIGVycm1zZygiRElTVElOQ1QgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHdpbmRvdyBmdW5j dGlvbnMgd2l0aCBhIGZyYW1lIHRoYXQgY292ZXJzIHRoZSBlbnRpcmUgcGFydGl0aW9uIiksCisJ CQkJIGVycmhpbnQoIlJlbW92ZSBPUkRFUiBCWSBmcm9tIHRoZSB3aW5kb3cgZGVmaW5pdGlvbiwg b3IgdXNlIFJPV1MgQkVUV0VFTiBVTkJPVU5ERUQgUFJFQ0VESU5HIEFORCBVTkJPVU5ERUQgRk9M TE9XSU5HLiIpKSk7CisKKwlpZiAod2Z1bmMtPndpbmRpc3RpbmN0ICYmIGxpc3RfbGVuZ3RoKHdm dW5jLT5hcmdzKSAhPSAxKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVf RkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkgZXJybXNnKCJESVNUSU5DVCBpcyBub3Qgc3Vw cG9ydGVkIGZvciB3aW5kb3cgYWdncmVnYXRlIGZ1bmN0aW9ucyB3aXRoIG1vcmUgdGhhbiBvbmUg YXJndW1lbnQiKSkpOwogCiAJbnVtQXJndW1lbnRzID0gbGlzdF9sZW5ndGgod2Z1bmMtPmFyZ3Mp OwogCkBAIC0zMjA5LDYgKzM1NjMsMzUgQEAgaW5pdGlhbGl6ZV9wZXJhZ2coV2luZG93QWdnU3Rh dGUgKndpbnN0YXRlLCBXaW5kb3dGdW5jICp3ZnVuYywKIAllbHNlCiAJCXBlcmFnZ3N0YXRlLT5h Z2djb250ZXh0ID0gd2luc3RhdGUtPmFnZ2NvbnRleHQ7CiAKKwkvKgorCSAqIFNldCB1cCBESVNU SU5DVCBzdGF0ZSBpZiBuZWVkZWQuICBXZSBuZWVkIHNvcnQgYW5kIGVxdWFsaXR5IG9wZXJhdG9y cworCSAqIGZvciB0aGUgc2luZ2xlIGFyZ3VtZW50IHR5cGUsIHBsdXMgaXRzIHR5cGUgbGVuZ3Ro IGFuZCBieS12YWx1ZSBpbmZvCisJICogZm9yIGRhdHVtIGNvcHlpbmcgZHVyaW5nIHRoZSBkZWR1 cCBsb29wLgorCSAqLworCWlmICh3ZnVuYy0+d2luZGlzdGluY3QpCisJeworCQlPaWQJCQlsdE9w ciwKKwkJCQkJZXFPcHI7CisJCU9pZAkJCWlucHV0VHlwZSA9IGlucHV0VHlwZXNbMF07CisKKwkJ cGVyYWdnc3RhdGUtPndpbmRpc3RpbmN0ID0gdHJ1ZTsKKwkJcGVyYWdnc3RhdGUtPmlucHV0dHlw ZU9pZCA9IGlucHV0VHlwZTsKKworCQlnZXRfc29ydF9ncm91cF9vcGVyYXRvcnMoaW5wdXRUeXBl LAorCQkJCQkJCQkgdHJ1ZSwgdHJ1ZSwgZmFsc2UsCisJCQkJCQkJCSAmbHRPcHIsICZlcU9wciwg TlVMTCwKKwkJCQkJCQkJIE5VTEwpOworCisJCXBlcmFnZ3N0YXRlLT5zb3J0T3BlcmF0b3IgPSBs dE9wcjsKKwkJcGVyYWdnc3RhdGUtPnNvcnRDb2xsYXRpb24gPSB3ZnVuYy0+aW5wdXRjb2xsaWQ7 CisJCXBlcmFnZ3N0YXRlLT5zb3J0TnVsbHNGaXJzdCA9IGZhbHNlOworCQlmbWdyX2luZm8oZ2V0 X29wY29kZShlcU9wciksICZwZXJhZ2dzdGF0ZS0+ZXF1YWxmbik7CisKKwkJZ2V0X3R5cGxlbmJ5 dmFsKGlucHV0VHlwZSwKKwkJCQkJCSZwZXJhZ2dzdGF0ZS0+aW5wdXR0eXBlTGVuLAorCQkJCQkJ JnBlcmFnZ3N0YXRlLT5pbnB1dHR5cGVCeVZhbCk7CisJfQorCiAJUmVsZWFzZVN5c0NhY2hlKGFn Z1R1cGxlKTsKIAogCXJldHVybiBwZXJhZ2dzdGF0ZTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvd2luZG93Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvd2lu ZG93Lm91dAppbmRleCA3ZTkyMTJjNDY3Ny4uODRlMmFiMDUyZTUgMTAwNjQ0Ci0tLSBhL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvd2luZG93Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL3dpbmRvdy5vdXQKQEAgLTU5NjgsOCArNTk2OCw3IEBAIFdJTkRPVyB3IEFTIChPUkRF UiBCWSB4IFJPV1MgQkVUV0VFTiAyIFBSRUNFRElORyBBTkQgMiBGT0xMT1dJTkcpOwogRFJPUCBU QUJMRSBwbGFuZXRzIENBU0NBREU7CiBOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIHZpZXcgcGxh bmV0c192aWV3CiAtLQotLS0gVGVzdCBESVNUSU5DVCBpbiB3aW5kb3cgYWdncmVnYXRlcyAocGFy c2UvZGVwYXJzZSBwbHVtYmluZyBvbmx5OwotLS0gZXhlY3V0aW9uIHN1cHBvcnQgaXMgbm90IHll dCBpbXBsZW1lbnRlZCkKKy0tIFRlc3QgRElTVElOQ1QgaW4gd2luZG93IGFnZ3JlZ2F0ZXMKIC0t CiAtLSBTaG91bGQgcGFyc2Ugc3VjY2Vzc2Z1bGx5IGFuZCByb3VuZC10cmlwIHRocm91Z2ggYSB2 aWV3IGRlZmluaXRpb24KIENSRUFURSBURU1QIFZJRVcgd2luZG93X2Rpc3RpbmN0X3ZpZXcgQVMK QEAgLTU5ODcsNiArNTk4NiwxNjMgQEAgU0VMRUNUIG50aWxlKERJU1RJTkNUIDQpIE9WRVIgKCkg RlJPTSB0ZW5rMTsgLS0gZXJyb3IKIEVSUk9SOiAgRElTVElOQ1QgaXMgbm90IGltcGxlbWVudGVk IGZvciBub24tYWdncmVnYXRlIHdpbmRvdyBmdW5jdGlvbnMKIExJTkUgMTogU0VMRUNUIG50aWxl KERJU1RJTkNUIDQpIE9WRVIgKCkgRlJPTSB0ZW5rMTsKICAgICAgICAgICAgICAgIF4KLS0tIEV4 ZWN1dGlvbiBmYWlscyB3aXRoIGEgY2xlYXIgZXhlY3V0b3Itc2lkZSBlcnJvcgotU0VMRUNUIGNv dW50KERJU1RJTkNUIGZvdXIpIE9WRVIgKFBBUlRJVElPTiBCWSB0ZW4pIEZST00gdGVuazE7IC0t IGVycm9yCi1FUlJPUjogIERJU1RJTkNUIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgZm9yIHdpbmRv dyBhZ2dyZWdhdGVzCistLSBCYXNpYyBESVNUSU5DVCB3aG9sZS1wYXJ0aXRpb24gY2FzZXMgKHNo b3VsZCBzdWNjZWVkKQorU0VMRUNUIGNvdW50KERJU1RJTkNUIGZvdXIpIE9WRVIgKFBBUlRJVElP TiBCWSB0ZW4pCitGUk9NIHRlbmsxIExJTUlUIDIwOworIGNvdW50IAorLS0tLS0tLQorICAgICAy CisgICAgIDIKKyAgICAgMgorICAgICAyCisgICAgIDIKKyAgICAgMgorICAgICAyCisgICAgIDIK KyAgICAgMgorICAgICAyCisgICAgIDIKKyAgICAgMgorICAgICAyCisgICAgIDIKKyAgICAgMgor ICAgICAyCisgICAgIDIKKyAgICAgMgorICAgICAyCisgICAgIDIKKygyMCByb3dzKQorCistLSBE SVNUSU5DVCB3aXRoIG5vIFBBUlRJVElPTiBCWSAod2hvbGUgc2luZ2xlIHBhcnRpdGlvbikKK1NF TEVDVCB4LCBzdW0oRElTVElOQ1QgeCAlIDMpIE9WRVIgKCkKK0ZST00gZ2VuZXJhdGVfc2VyaWVz KDEsIDkpIGcoeCk7CisgeCB8IHN1bSAKKy0tLSstLS0tLQorIDEgfCAgIDMKKyAyIHwgICAzCisg MyB8ICAgMworIDQgfCAgIDMKKyA1IHwgICAzCisgNiB8ICAgMworIDcgfCAgIDMKKyA4IHwgICAz CisgOSB8ICAgMworKDkgcm93cykKKworLS0gRElTVElOQ1Qgd2l0aCBleHBsaWNpdCBVTkJPVU5E RUQgUFJFQ0VESU5HIHRvIFVOQk9VTkRFRCBGT0xMT1dJTkcKK1NFTEVDVCB4LCBhdmcoRElTVElO Q1QgeCAlIDQpIE9WRVIgKFBBUlRJVElPTiBCWSB4ID4gNQorICBST1dTIEJFVFdFRU4gVU5CT1VO REVEIFBSRUNFRElORyBBTkQgVU5CT1VOREVEIEZPTExPV0lORykKK0ZST00gZ2VuZXJhdGVfc2Vy aWVzKDEsIDEwKSBnKHgpOworIHggIHwgICAgICAgIGF2ZyAgICAgICAgIAorLS0tLSstLS0tLS0t LS0tLS0tLS0tLS0tLQorICAxIHwgMS41MDAwMDAwMDAwMDAwMDAwCisgIDIgfCAxLjUwMDAwMDAw MDAwMDAwMDAKKyAgMyB8IDEuNTAwMDAwMDAwMDAwMDAwMAorICA0IHwgMS41MDAwMDAwMDAwMDAw MDAwCisgIDUgfCAxLjUwMDAwMDAwMDAwMDAwMDAKKyAgNiB8IDEuNTAwMDAwMDAwMDAwMDAwMAor ICA3IHwgMS41MDAwMDAwMDAwMDAwMDAwCisgIDggfCAxLjUwMDAwMDAwMDAwMDAwMDAKKyAgOSB8 IDEuNTAwMDAwMDAwMDAwMDAwMAorIDEwIHwgMS41MDAwMDAwMDAwMDAwMDAwCisoMTAgcm93cykK KworLS0gRElTVElOQ1Qgd2l0aCBGSUxURVIKK1NFTEVDVCB4LAorICAgICAgIGNvdW50KERJU1RJ TkNUIHggJSAzKSBGSUxURVIgKFdIRVJFIHggPiAzKSBPVkVSIChQQVJUSVRJT04gQlkgeCA+IDUp CitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsKKyB4ICB8IGNvdW50IAorLS0tLSst LS0tLS0tCisgIDEgfCAgICAgMgorICAyIHwgICAgIDIKKyAgMyB8ICAgICAyCisgIDQgfCAgICAg MgorICA1IHwgICAgIDIKKyAgNiB8ICAgICAzCisgIDcgfCAgICAgMworICA4IHwgICAgIDMKKyAg OSB8ICAgICAzCisgMTAgfCAgICAgMworKDEwIHJvd3MpCisKKy0tIE5VTEwgaGFuZGxpbmcKK1NF TEVDVCB4LAorICAgICAgIGNvdW50KERJU1RJTkNUIHgpIE9WRVIgKCkKK0ZST00gKFZBTFVFUyAo MSksKDIpLChOVUxMKSwoMiksKE5VTEwpLCgxKSwoMykpIHYoeCk7CisgeCB8IGNvdW50IAorLS0t Ky0tLS0tLS0KKyAxIHwgICAgIDMKKyAyIHwgICAgIDMKKyAgIHwgICAgIDMKKyAyIHwgICAgIDMK KyAgIHwgICAgIDMKKyAxIHwgICAgIDMKKyAzIHwgICAgIDMKKyg3IHJvd3MpCisKKy0tIE1peGVk IERJU1RJTkNUIGFuZCBub24tRElTVElOQ1QgYWdncmVnYXRlcyBpbiBzYW1lIHdpbmRvdworU0VM RUNUIHgsCisgICAgICAgY291bnQoRElTVElOQ1QgeCAlIDMpIE9WRVIgdywKKyAgICAgICBzdW0o eCkgT1ZFUiB3CitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCA5KSBnKHgpCitXSU5ET1cgdyBBUyAo UEFSVElUSU9OIEJZIHggPiA1KTsKKyB4IHwgY291bnQgfCBzdW0gCistLS0rLS0tLS0tLSstLS0t LQorIDEgfCAgICAgMyB8ICAxNQorIDIgfCAgICAgMyB8ICAxNQorIDMgfCAgICAgMyB8ICAxNQor IDQgfCAgICAgMyB8ICAxNQorIDUgfCAgICAgMyB8ICAxNQorIDYgfCAgICAgMyB8ICAzMAorIDcg fCAgICAgMyB8ICAzMAorIDggfCAgICAgMyB8ICAzMAorIDkgfCAgICAgMyB8ICAzMAorKDkgcm93 cykKKworLS0gTXVsdGlwbGUgRElTVElOQ1QgYWdncmVnYXRlcyBpbiBzYW1lIHF1ZXJ5CitTRUxF Q1QgeCwKKyAgICAgICBjb3VudChESVNUSU5DVCB4ICUgMikgT1ZFUiAoUEFSVElUSU9OIEJZIHgg PiA1KSwKKyAgICAgICBzdW0oRElTVElOQ1QgeCAlIDMpIE9WRVIgKFBBUlRJVElPTiBCWSB4ID4g NSkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgpOworIHggIHwgY291bnQgfCBzdW0g CistLS0tKy0tLS0tLS0rLS0tLS0KKyAgMSB8ICAgICAyIHwgICAzCisgIDIgfCAgICAgMiB8ICAg MworICAzIHwgICAgIDIgfCAgIDMKKyAgNCB8ICAgICAyIHwgICAzCisgIDUgfCAgICAgMiB8ICAg MworICA2IHwgICAgIDIgfCAgIDMKKyAgNyB8ICAgICAyIHwgICAzCisgIDggfCAgICAgMiB8ICAg MworICA5IHwgICAgIDIgfCAgIDMKKyAxMCB8ICAgICAyIHwgICAzCisoMTAgcm93cykKKworLS0g RXJyb3I6IG5vbi13aG9sZS1wYXJ0aXRpb24gZnJhbWUgKGhhcyBPUkRFUiBCWSAtPiBSQU5HRSBV TkJPVU5ERUQgUFJFQ0VESU5HIHRvIENVUlJFTlQgUk9XKQorU0VMRUNUIGNvdW50KERJU1RJTkNU IHgpIE9WRVIgKFBBUlRJVElPTiBCWSB4ID4gNSBPUkRFUiBCWSB4KQorRlJPTSBnZW5lcmF0ZV9z ZXJpZXMoMSwgMTApIGcoeCk7IC0tIGVycm9yCitFUlJPUjogIERJU1RJTkNUIGlzIG9ubHkgc3Vw cG9ydGVkIGZvciB3aW5kb3cgZnVuY3Rpb25zIHdpdGggYSBmcmFtZSB0aGF0IGNvdmVycyB0aGUg ZW50aXJlIHBhcnRpdGlvbgorSElOVDogIFJlbW92ZSBPUkRFUiBCWSBmcm9tIHRoZSB3aW5kb3cg ZGVmaW5pdGlvbiwgb3IgdXNlIFJPV1MgQkVUV0VFTiBVTkJPVU5ERUQgUFJFQ0VESU5HIEFORCBV TkJPVU5ERUQgRk9MTE9XSU5HLgorLS0gRXJyb3I6IHBhcnRpYWwgUk9XUyBmcmFtZQorU0VMRUNU IGNvdW50KERJU1RJTkNUIHgpIE9WRVIgKFJPV1MgMyBQUkVDRURJTkcpCitGUk9NIGdlbmVyYXRl X3NlcmllcygxLCAxMCkgZyh4KTsgLS0gZXJyb3IKK0VSUk9SOiAgRElTVElOQ1QgaXMgb25seSBz dXBwb3J0ZWQgZm9yIHdpbmRvdyBmdW5jdGlvbnMgd2l0aCBhIGZyYW1lIHRoYXQgY292ZXJzIHRo ZSBlbnRpcmUgcGFydGl0aW9uCitISU5UOiAgUmVtb3ZlIE9SREVSIEJZIGZyb20gdGhlIHdpbmRv dyBkZWZpbml0aW9uLCBvciB1c2UgUk9XUyBCRVRXRUVOIFVOQk9VTkRFRCBQUkVDRURJTkcgQU5E IFVOQk9VTkRFRCBGT0xMT1dJTkcuCistLSBFcnJvcjogRVhDTFVERSBjbGF1c2UKK1NFTEVDVCBj b3VudChESVNUSU5DVCB4KSBPVkVSIChST1dTIEJFVFdFRU4gVU5CT1VOREVEIFBSRUNFRElORyBB TkQgVU5CT1VOREVEIEZPTExPV0lORyBFWENMVURFIENVUlJFTlQgUk9XKQorRlJPTSBnZW5lcmF0 ZV9zZXJpZXMoMSwgMTApIGcoeCk7IC0tIGVycm9yCitFUlJPUjogIERJU1RJTkNUIGlzIG9ubHkg c3VwcG9ydGVkIGZvciB3aW5kb3cgZnVuY3Rpb25zIHdpdGggYSBmcmFtZSB0aGF0IGNvdmVycyB0 aGUgZW50aXJlIHBhcnRpdGlvbgorSElOVDogIFJlbW92ZSBPUkRFUiBCWSBmcm9tIHRoZSB3aW5k b3cgZGVmaW5pdGlvbiwgb3IgdXNlIFJPV1MgQkVUV0VFTiBVTkJPVU5ERUQgUFJFQ0VESU5HIEFO RCBVTkJPVU5ERUQgRk9MTE9XSU5HLgorLS0gRXJyb3I6IFJPV1MgQkVUV0VFTiBVTkJPVU5ERUQg UFJFQ0VESU5HIEFORCBDVVJSRU5UIFJPVyAobm90IHdob2xlLXBhcnRpdGlvbgorLS0gZXZlbiB3 aXRob3V0IE9SREVSIEJZLCBiZWNhdXNlIFJPV1MgQ1VSUkVOVCBST1cgbWVhbnMgZXhhY3RseSBv bmUgcm93KQorU0VMRUNUIHgsCisgICAgICAgY291bnQoRElTVElOQ1QgeCAlIDMpIE9WRVIgKAor ICAgICAgICAgICBST1dTIEJFVFdFRU4gVU5CT1VOREVEIFBSRUNFRElORyBBTkQgQ1VSUkVOVCBS T1cKKyAgICAgICApCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsgLS0gZXJyb3IK K0VSUk9SOiAgRElTVElOQ1QgaXMgb25seSBzdXBwb3J0ZWQgZm9yIHdpbmRvdyBmdW5jdGlvbnMg d2l0aCBhIGZyYW1lIHRoYXQgY292ZXJzIHRoZSBlbnRpcmUgcGFydGl0aW9uCitISU5UOiAgUmVt b3ZlIE9SREVSIEJZIGZyb20gdGhlIHdpbmRvdyBkZWZpbml0aW9uLCBvciB1c2UgUk9XUyBCRVRX RUVOIFVOQk9VTkRFRCBQUkVDRURJTkcgQU5EIFVOQk9VTkRFRCBGT0xMT1dJTkcuCistLSBFcnJv cjogbXVsdGktYXJndW1lbnQgRElTVElOQ1Qgd2luZG93IGFnZ3JlZ2F0ZSAobm90IHlldCBzdXBw b3J0ZWQpCitTRUxFQ1Qgc3RyaW5nX2FnZyhESVNUSU5DVCBmb3VyOjp0ZXh0LCAnLCcpIE9WRVIg KFBBUlRJVElPTiBCWSB0ZW4pCitGUk9NIHRlbmsxOyAtLSBlcnJvcgorRVJST1I6ICBESVNUSU5D VCBpcyBub3Qgc3VwcG9ydGVkIGZvciB3aW5kb3cgYWdncmVnYXRlIGZ1bmN0aW9ucyB3aXRoIG1v cmUgdGhhbiBvbmUgYXJndW1lbnQKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dp bmRvdy5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC93aW5kb3cuc3FsCmluZGV4IDJjMjExZTY3 MDUyLi44ZTMxOWM0NTQ2MSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvd2luZG93 LnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC93aW5kb3cuc3FsCkBAIC0yMTYxLDggKzIx NjEsNyBAQCBXSU5ET1cgdyBBUyAoT1JERVIgQlkgeCBST1dTIEJFVFdFRU4gMiBQUkVDRURJTkcg QU5EIDIgRk9MTE9XSU5HKTsKIERST1AgVEFCTEUgcGxhbmV0cyBDQVNDQURFOwogCiAtLQotLS0g VGVzdCBESVNUSU5DVCBpbiB3aW5kb3cgYWdncmVnYXRlcyAocGFyc2UvZGVwYXJzZSBwbHVtYmlu ZyBvbmx5OwotLS0gZXhlY3V0aW9uIHN1cHBvcnQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCkKKy0t IFRlc3QgRElTVElOQ1QgaW4gd2luZG93IGFnZ3JlZ2F0ZXMKIC0tCiAKIC0tIFNob3VsZCBwYXJz ZSBzdWNjZXNzZnVsbHkgYW5kIHJvdW5kLXRyaXAgdGhyb3VnaCBhIHZpZXcgZGVmaW5pdGlvbgpA QCAtMjE3NSw1ICsyMTc0LDYyIEBAIERST1AgVklFVyB3aW5kb3dfZGlzdGluY3RfdmlldzsKIC0t IERJU1RJTkNUIG9uIGEgbm9uLWFnZ3JlZ2F0ZSB3aW5kb3cgZnVuY3Rpb24gaXMgc3RpbGwgYSBw YXJzZSBlcnJvcgogU0VMRUNUIG50aWxlKERJU1RJTkNUIDQpIE9WRVIgKCkgRlJPTSB0ZW5rMTsg LS0gZXJyb3IKIAotLS0gRXhlY3V0aW9uIGZhaWxzIHdpdGggYSBjbGVhciBleGVjdXRvci1zaWRl IGVycm9yCi1TRUxFQ1QgY291bnQoRElTVElOQ1QgZm91cikgT1ZFUiAoUEFSVElUSU9OIEJZIHRl bikgRlJPTSB0ZW5rMTsgLS0gZXJyb3IKKy0tIEJhc2ljIERJU1RJTkNUIHdob2xlLXBhcnRpdGlv biBjYXNlcyAoc2hvdWxkIHN1Y2NlZWQpCitTRUxFQ1QgY291bnQoRElTVElOQ1QgZm91cikgT1ZF UiAoUEFSVElUSU9OIEJZIHRlbikKK0ZST00gdGVuazEgTElNSVQgMjA7CisKKy0tIERJU1RJTkNU IHdpdGggbm8gUEFSVElUSU9OIEJZICh3aG9sZSBzaW5nbGUgcGFydGl0aW9uKQorU0VMRUNUIHgs IHN1bShESVNUSU5DVCB4ICUgMykgT1ZFUiAoKQorRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgOSkg Zyh4KTsKKworLS0gRElTVElOQ1Qgd2l0aCBleHBsaWNpdCBVTkJPVU5ERUQgUFJFQ0VESU5HIHRv IFVOQk9VTkRFRCBGT0xMT1dJTkcKK1NFTEVDVCB4LCBhdmcoRElTVElOQ1QgeCAlIDQpIE9WRVIg KFBBUlRJVElPTiBCWSB4ID4gNQorICBST1dTIEJFVFdFRU4gVU5CT1VOREVEIFBSRUNFRElORyBB TkQgVU5CT1VOREVEIEZPTExPV0lORykKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgp OworCistLSBESVNUSU5DVCB3aXRoIEZJTFRFUgorU0VMRUNUIHgsCisgICAgICAgY291bnQoRElT VElOQ1QgeCAlIDMpIEZJTFRFUiAoV0hFUkUgeCA+IDMpIE9WRVIgKFBBUlRJVElPTiBCWSB4ID4g NSkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgpOworCistLSBOVUxMIGhhbmRsaW5n CitTRUxFQ1QgeCwKKyAgICAgICBjb3VudChESVNUSU5DVCB4KSBPVkVSICgpCitGUk9NIChWQUxV RVMgKDEpLCgyKSwoTlVMTCksKDIpLChOVUxMKSwoMSksKDMpKSB2KHgpOworCistLSBNaXhlZCBE SVNUSU5DVCBhbmQgbm9uLURJU1RJTkNUIGFnZ3JlZ2F0ZXMgaW4gc2FtZSB3aW5kb3cKK1NFTEVD VCB4LAorICAgICAgIGNvdW50KERJU1RJTkNUIHggJSAzKSBPVkVSIHcsCisgICAgICAgc3VtKHgp IE9WRVIgdworRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgOSkgZyh4KQorV0lORE9XIHcgQVMgKFBB UlRJVElPTiBCWSB4ID4gNSk7CisKKy0tIE11bHRpcGxlIERJU1RJTkNUIGFnZ3JlZ2F0ZXMgaW4g c2FtZSBxdWVyeQorU0VMRUNUIHgsCisgICAgICAgY291bnQoRElTVElOQ1QgeCAlIDIpIE9WRVIg KFBBUlRJVElPTiBCWSB4ID4gNSksCisgICAgICAgc3VtKERJU1RJTkNUIHggJSAzKSBPVkVSIChQ QVJUSVRJT04gQlkgeCA+IDUpCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsKKwor LS0gRXJyb3I6IG5vbi13aG9sZS1wYXJ0aXRpb24gZnJhbWUgKGhhcyBPUkRFUiBCWSAtPiBSQU5H RSBVTkJPVU5ERUQgUFJFQ0VESU5HIHRvIENVUlJFTlQgUk9XKQorU0VMRUNUIGNvdW50KERJU1RJ TkNUIHgpIE9WRVIgKFBBUlRJVElPTiBCWSB4ID4gNSBPUkRFUiBCWSB4KQorRlJPTSBnZW5lcmF0 ZV9zZXJpZXMoMSwgMTApIGcoeCk7IC0tIGVycm9yCisKKy0tIEVycm9yOiBwYXJ0aWFsIFJPV1Mg ZnJhbWUKK1NFTEVDVCBjb3VudChESVNUSU5DVCB4KSBPVkVSIChST1dTIDMgUFJFQ0VESU5HKQor RlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTApIGcoeCk7IC0tIGVycm9yCisKKy0tIEVycm9yOiBF WENMVURFIGNsYXVzZQorU0VMRUNUIGNvdW50KERJU1RJTkNUIHgpIE9WRVIgKFJPV1MgQkVUV0VF TiBVTkJPVU5ERUQgUFJFQ0VESU5HIEFORCBVTkJPVU5ERUQgRk9MTE9XSU5HIEVYQ0xVREUgQ1VS UkVOVCBST1cpCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsgLS0gZXJyb3IKKwor LS0gRXJyb3I6IFJPV1MgQkVUV0VFTiBVTkJPVU5ERUQgUFJFQ0VESU5HIEFORCBDVVJSRU5UIFJP VyAobm90IHdob2xlLXBhcnRpdGlvbgorLS0gZXZlbiB3aXRob3V0IE9SREVSIEJZLCBiZWNhdXNl IFJPV1MgQ1VSUkVOVCBST1cgbWVhbnMgZXhhY3RseSBvbmUgcm93KQorU0VMRUNUIHgsCisgICAg ICAgY291bnQoRElTVElOQ1QgeCAlIDMpIE9WRVIgKAorICAgICAgICAgICBST1dTIEJFVFdFRU4g VU5CT1VOREVEIFBSRUNFRElORyBBTkQgQ1VSUkVOVCBST1cKKyAgICAgICApCitGUk9NIGdlbmVy YXRlX3NlcmllcygxLCAxMCkgZyh4KTsgLS0gZXJyb3IKKworLS0gRXJyb3I6IG11bHRpLWFyZ3Vt ZW50IERJU1RJTkNUIHdpbmRvdyBhZ2dyZWdhdGUgKG5vdCB5ZXQgc3VwcG9ydGVkKQorU0VMRUNU IHN0cmluZ19hZ2coRElTVElOQ1QgZm91cjo6dGV4dCwgJywnKSBPVkVSIChQQVJUSVRJT04gQlkg dGVuKQorRlJPTSB0ZW5rMTsgLS0gZXJyb3IKLS0gCjIuNTIuMAoK --000000000000c18cea0650a3c85c Content-Type: application/octet-stream; name="v2-0001-Parse-and-deparse-DISTINCT-in-window-aggregate-ca.patch" Content-Disposition: attachment; filename="v2-0001-Parse-and-deparse-DISTINCT-in-window-aggregate-ca.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_moku2mpb0 RnJvbSAzNDZiZGZhYzc4YTY5YTY3Yzc5MGM2MWIyMGFkZDc0ODA3ZjM0MThkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYWlibyBZYW4gPGhhaWJvLnlhbkBhcHBsZS5jb20+CkRhdGU6 IE1vbiwgNiBBcHIgMjAyNiAyMzo1MDo1MCAtMDcwMApTdWJqZWN0OiBbUEFUQ0ggdjIgMDEvMTBd IFBhcnNlIGFuZCBkZXBhcnNlIERJU1RJTkNUIGluIHdpbmRvdyBhZ2dyZWdhdGUgY2FsbHMKCkFk ZCBhIHdpbmRpc3RpbmN0IGZpZWxkIHRvIFdpbmRvd0Z1bmMgdG8gY2FycnkgdGhlIERJU1RJTkNU IHF1YWxpZmllcgp0aHJvdWdoIHBhcnNlIGFuYWx5c2lzLCBub2RlIHNlcmlhbGl6YXRpb24sIGFu ZCBydWxldXRpbHMgZGVwYXJzZS4KTW92ZSB0aGUgcmVqZWN0aW9uIGZyb20gcGFyc2UgdGltZSB0 byBleGVjdXRvciBpbml0IHNvIHRoYXQgc3RvcmVkCnJ1bGVzIGFuZCB2aWV3IGRlZmluaXRpb25z IHByZXNlcnZlIHRoZSBzeW50YXguICBFeGVjdXRpb24gc3RpbGwKcmFpc2VzIEZFQVRVUkVfTk9U X1NVUFBPUlRFRCB1bnRpbCBsYXRlciBwYXRjaGVzIGFkZCByZWFsIHN1cHBvcnQuCi0tLQogc3Jj L2JhY2tlbmQvZXhlY3V0b3Ivbm9kZVdpbmRvd0FnZy5jIHwgIDkgKysrKysrKysrCiBzcmMvYmFj a2VuZC9vcHRpbWl6ZXIvdXRpbC9jbGF1c2VzLmMgfCAgMSArCiBzcmMvYmFja2VuZC9wYXJzZXIv cGFyc2VfZnVuYy5jICAgICAgfCAgNiArKysrLS0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9ydWxl dXRpbHMuYyAgICB8ICAyICsrCiBzcmMvaW5jbHVkZS9ub2Rlcy9wcmltbm9kZXMuaCAgICAgICAg fCAgMiArKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC93aW5kb3cub3V0IHwgMjMgKysrKysr KysrKysrKysrKysrKysrKysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpbmRvdy5zcWwgICAgICB8 IDE4ICsrKysrKysrKysrKysrKysrKwogNyBmaWxlcyBjaGFuZ2VkLCA1OSBpbnNlcnRpb25zKCsp LCAyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVX aW5kb3dBZ2cuYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVXaW5kb3dBZ2cuYwppbmRleCBm NTJhN2FhZTg0My4uNDA4N2FiMWIxNmUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9y L25vZGVXaW5kb3dBZ2cuYworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlV2luZG93QWdn LmMKQEAgLTI5NTYsNiArMjk1NiwxNSBAQCBpbml0aWFsaXplX3BlcmFnZyhXaW5kb3dBZ2dTdGF0 ZSAqd2luc3RhdGUsIFdpbmRvd0Z1bmMgKndmdW5jLAogCWludAkJCWk7CiAJTGlzdENlbGwgICAq bGM7CiAKKwkvKgorCSAqIFRlbXBvcmFyeTogcmVqZWN0IERJU1RJTkNUIHdpbmRvdyBhZ2dyZWdh dGVzIHVudGlsIGV4ZWN1dG9yIHN1cHBvcnQKKwkgKiBsYW5kcy4gIFBhdGNoIDIgd2lsbCByZXBs YWNlIHRoaXMgd2l0aCBhY3R1YWwgRElTVElOQ1QgaGFuZGxpbmcuCisJICovCisJaWYgKHdmdW5j LT53aW5kaXN0aW5jdCkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX0ZF QVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJIGVycm1zZygiRElTVElOQ1QgaXMgbm90IHlldCBp bXBsZW1lbnRlZCBmb3Igd2luZG93IGFnZ3JlZ2F0ZXMiKSkpOworCiAJbnVtQXJndW1lbnRzID0g bGlzdF9sZW5ndGgod2Z1bmMtPmFyZ3MpOwogCiAJaSA9IDA7CmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9vcHRpbWl6ZXIvdXRpbC9jbGF1c2VzLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRp bC9jbGF1c2VzLmMKaW5kZXggZmNmNmQ3ZmZmMmEuLjYyZDYyZDdmZGVmIDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9jbGF1c2VzLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3V0aWwvY2xhdXNlcy5jCkBAIC0yODE2LDYgKzI4MTYsNyBAQCBldmFsX2NvbnN0X2V4 cHJlc3Npb25zX211dGF0b3IoTm9kZSAqbm9kZSwKIAkJCQluZXdleHByLT53aW5yZWYgPSBleHBy LT53aW5yZWY7CiAJCQkJbmV3ZXhwci0+d2luc3RhciA9IGV4cHItPndpbnN0YXI7CiAJCQkJbmV3 ZXhwci0+d2luYWdnID0gZXhwci0+d2luYWdnOworCQkJCW5ld2V4cHItPndpbmRpc3RpbmN0ID0g ZXhwci0+d2luZGlzdGluY3Q7CiAJCQkJbmV3ZXhwci0+aWdub3JlX251bGxzID0gZXhwci0+aWdu b3JlX251bGxzOwogCQkJCW5ld2V4cHItPmxvY2F0aW9uID0gZXhwci0+bG9jYXRpb247CiAKZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3BhcnNlci9wYXJzZV9mdW5jLmMgYi9zcmMvYmFja2VuZC9w YXJzZXIvcGFyc2VfZnVuYy5jCmluZGV4IDM1ZmY2NDI3MTQ3Li5kMjE2ZDUzZTUzMCAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvcGFyc2VyL3BhcnNlX2Z1bmMuYworKysgYi9zcmMvYmFja2VuZC9w YXJzZXIvcGFyc2VfZnVuYy5jCkBAIC04NDcsNiArODQ3LDcgQEAgUGFyc2VGdW5jT3JDb2x1bW4o UGFyc2VTdGF0ZSAqcHN0YXRlLCBMaXN0ICpmdW5jbmFtZSwgTGlzdCAqZmFyZ3MsCiAJCS8qIHdp bnJlZiB3aWxsIGJlIHNldCBieSB0cmFuc2Zvcm1XaW5kb3dGdW5jQ2FsbCAqLwogCQl3ZnVuYy0+ d2luc3RhciA9IGFnZ19zdGFyOwogCQl3ZnVuYy0+d2luYWdnID0gKGZkcmVzdWx0ID09IEZVTkNE RVRBSUxfQUdHUkVHQVRFKTsKKwkJd2Z1bmMtPndpbmRpc3RpbmN0ID0gYWdnX2Rpc3RpbmN0Owog CQl3ZnVuYy0+YWdnZmlsdGVyID0gYWdnX2ZpbHRlcjsKIAkJd2Z1bmMtPmlnbm9yZV9udWxscyA9 IGlnbm9yZV9udWxsczsKIAkJd2Z1bmMtPnJ1bkNvbmRpdGlvbiA9IE5JTDsKQEAgLTg1NCwxMSAr ODU1LDEyIEBAIFBhcnNlRnVuY09yQ29sdW1uKFBhcnNlU3RhdGUgKnBzdGF0ZSwgTGlzdCAqZnVu Y25hbWUsIExpc3QgKmZhcmdzLAogCiAJCS8qCiAJCSAqIGFnZ19zdGFyIGlzIGFsbG93ZWQgZm9y IGFnZ3JlZ2F0ZSBmdW5jdGlvbnMgYnV0IGRpc3RpbmN0IGlzbid0CisJCSAqIGFsbG93ZWQgZm9y IG5vbi1hZ2dyZWdhdGUgd2luZG93IGZ1bmN0aW9ucy4KIAkJICovCi0JCWlmIChhZ2dfZGlzdGlu Y3QpCisJCWlmIChhZ2dfZGlzdGluY3QgJiYgIXdmdW5jLT53aW5hZ2cpCiAJCQllcmVwb3J0KEVS Uk9SLAogCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCi0JCQkJ CSBlcnJtc2coIkRJU1RJTkNUIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3Igd2luZG93IGZ1bmN0aW9u cyIpLAorCQkJCQkgZXJybXNnKCJESVNUSU5DVCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIG5vbi1h Z2dyZWdhdGUgd2luZG93IGZ1bmN0aW9ucyIpLAogCQkJCQkgcGFyc2VyX2VycnBvc2l0aW9uKHBz dGF0ZSwgbG9jYXRpb24pKSk7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxz L2FkdC9ydWxldXRpbHMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9ydWxldXRpbHMuYwppbmRl eCBjNzgxY2RjODRkMy4uNzNkYzlmODViNDAgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxz L2FkdC9ydWxldXRpbHMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcnVsZXV0aWxzLmMK QEAgLTExNjU5LDYgKzExNjU5LDggQEAgZ2V0X3dpbmRvd2Z1bmNfZXhwcl9oZWxwZXIoV2luZG93 RnVuYyAqd2Z1bmMsIGRlcGFyc2VfY29udGV4dCAqY29udGV4dCwKIAkJYXBwZW5kU3RyaW5nSW5m b0NoYXIoYnVmLCAnKicpOwogCWVsc2UKIAl7CisJCWlmICh3ZnVuYy0+d2luZGlzdGluY3QpCisJ CQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIkRJU1RJTkNUICIpOwogCQlpZiAoaXNfanNv bl9vYmplY3RhZ2cpCiAJCXsKIAkJCWdldF9ydWxlX2V4cHIoKE5vZGUgKikgbGluaXRpYWwod2Z1 bmMtPmFyZ3MpLCBjb250ZXh0LCBmYWxzZSk7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rl cy9wcmltbm9kZXMuaCBiL3NyYy9pbmNsdWRlL25vZGVzL3ByaW1ub2Rlcy5oCmluZGV4IDZkZmM5 NDZjMjBiLi4xZTk4NGRmYmZkYSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9kZXMvcHJpbW5v ZGVzLmgKKysrIGIvc3JjL2luY2x1ZGUvbm9kZXMvcHJpbW5vZGVzLmgKQEAgLTYxNCw2ICs2MTQs OCBAQCB0eXBlZGVmIHN0cnVjdCBXaW5kb3dGdW5jCiAJYm9vbAkJd2luc3RhciBwZ19ub2RlX2F0 dHIocXVlcnlfanVtYmxlX2lnbm9yZSk7CiAJLyogaXMgZnVuY3Rpb24gYSBzaW1wbGUgYWdncmVn YXRlPyAqLwogCWJvb2wJCXdpbmFnZyBwZ19ub2RlX2F0dHIocXVlcnlfanVtYmxlX2lnbm9yZSk7 CisJLyogdHJ1ZSBpZiBhZ2dyZWdhdGUgYXJndW1lbnRzIHdlcmUgbWFya2VkIERJU1RJTkNUICov CisJYm9vbAkJd2luZGlzdGluY3Q7CiAJLyogaWdub3JlIG51bGxzLiBPbmUgb2YgdGhlIE51bGwg VHJlYXRtZW50IG9wdGlvbnMgKi8KIAlpbnQJCQlpZ25vcmVfbnVsbHM7CiAJLyogdG9rZW4gbG9j YXRpb24sIG9yIC0xIGlmIHVua25vd24gKi8KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvd2luZG93Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvd2luZG93Lm91 dAppbmRleCBlNmFhYzI3YTJhOS4uN2U5MjEyYzQ2NzcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvd2luZG93Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3dpbmRvdy5vdXQKQEAgLTU5NjcsMyArNTk2NywyNiBAQCBXSU5ET1cgdyBBUyAoT1JERVIgQlkg eCBST1dTIEJFVFdFRU4gMiBQUkVDRURJTkcgQU5EIDIgRk9MTE9XSU5HKTsKIC0tY2xlYW51cAog RFJPUCBUQUJMRSBwbGFuZXRzIENBU0NBREU7CiBOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIHZp ZXcgcGxhbmV0c192aWV3CistLQorLS0gVGVzdCBESVNUSU5DVCBpbiB3aW5kb3cgYWdncmVnYXRl cyAocGFyc2UvZGVwYXJzZSBwbHVtYmluZyBvbmx5OworLS0gZXhlY3V0aW9uIHN1cHBvcnQgaXMg bm90IHlldCBpbXBsZW1lbnRlZCkKKy0tCistLSBTaG91bGQgcGFyc2Ugc3VjY2Vzc2Z1bGx5IGFu ZCByb3VuZC10cmlwIHRocm91Z2ggYSB2aWV3IGRlZmluaXRpb24KK0NSRUFURSBURU1QIFZJRVcg d2luZG93X2Rpc3RpbmN0X3ZpZXcgQVMKK1NFTEVDVCBjb3VudChESVNUSU5DVCBmb3VyKSBPVkVS IChQQVJUSVRJT04gQlkgdGVuKSBBUyBjbnQKK0ZST00gdGVuazE7CitTRUxFQ1QgcGdfZ2V0X3Zp ZXdkZWYoJ3dpbmRvd19kaXN0aW5jdF92aWV3JykgTElLRSAnJURJU1RJTkNUJScgQVMgaGFzX2Rp c3RpbmN0OworIGhhc19kaXN0aW5jdCAKKy0tLS0tLS0tLS0tLS0tCisgdAorKDEgcm93KQorCitE Uk9QIFZJRVcgd2luZG93X2Rpc3RpbmN0X3ZpZXc7CistLSBESVNUSU5DVCBvbiBhIG5vbi1hZ2dy ZWdhdGUgd2luZG93IGZ1bmN0aW9uIGlzIHN0aWxsIGEgcGFyc2UgZXJyb3IKK1NFTEVDVCBudGls ZShESVNUSU5DVCA0KSBPVkVSICgpIEZST00gdGVuazE7IC0tIGVycm9yCitFUlJPUjogIERJU1RJ TkNUIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3Igbm9uLWFnZ3JlZ2F0ZSB3aW5kb3cgZnVuY3Rpb25z CitMSU5FIDE6IFNFTEVDVCBudGlsZShESVNUSU5DVCA0KSBPVkVSICgpIEZST00gdGVuazE7Cisg ICAgICAgICAgICAgICBeCistLSBFeGVjdXRpb24gZmFpbHMgd2l0aCBhIGNsZWFyIGV4ZWN1dG9y LXNpZGUgZXJyb3IKK1NFTEVDVCBjb3VudChESVNUSU5DVCBmb3VyKSBPVkVSIChQQVJUSVRJT04g QlkgdGVuKSBGUk9NIHRlbmsxOyAtLSBlcnJvcgorRVJST1I6ICBESVNUSU5DVCBpcyBub3QgeWV0 IGltcGxlbWVudGVkIGZvciB3aW5kb3cgYWdncmVnYXRlcwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qv cmVncmVzcy9zcWwvd2luZG93LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpbmRvdy5zcWwK aW5kZXggMzA1NTQ5YjEwNGQuLjJjMjExZTY3MDUyIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdy ZXNzL3NxbC93aW5kb3cuc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpbmRvdy5zcWwK QEAgLTIxNTksMyArMjE1OSwyMSBAQCBXSU5ET1cgdyBBUyAoT1JERVIgQlkgeCBST1dTIEJFVFdF RU4gMiBQUkVDRURJTkcgQU5EIDIgRk9MTE9XSU5HKTsKIAogLS1jbGVhbnVwCiBEUk9QIFRBQkxF IHBsYW5ldHMgQ0FTQ0FERTsKKworLS0KKy0tIFRlc3QgRElTVElOQ1QgaW4gd2luZG93IGFnZ3Jl Z2F0ZXMgKHBhcnNlL2RlcGFyc2UgcGx1bWJpbmcgb25seTsKKy0tIGV4ZWN1dGlvbiBzdXBwb3J0 IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQpCistLQorCistLSBTaG91bGQgcGFyc2Ugc3VjY2Vzc2Z1 bGx5IGFuZCByb3VuZC10cmlwIHRocm91Z2ggYSB2aWV3IGRlZmluaXRpb24KK0NSRUFURSBURU1Q IFZJRVcgd2luZG93X2Rpc3RpbmN0X3ZpZXcgQVMKK1NFTEVDVCBjb3VudChESVNUSU5DVCBmb3Vy KSBPVkVSIChQQVJUSVRJT04gQlkgdGVuKSBBUyBjbnQKK0ZST00gdGVuazE7CitTRUxFQ1QgcGdf Z2V0X3ZpZXdkZWYoJ3dpbmRvd19kaXN0aW5jdF92aWV3JykgTElLRSAnJURJU1RJTkNUJScgQVMg aGFzX2Rpc3RpbmN0OworRFJPUCBWSUVXIHdpbmRvd19kaXN0aW5jdF92aWV3OworCistLSBESVNU SU5DVCBvbiBhIG5vbi1hZ2dyZWdhdGUgd2luZG93IGZ1bmN0aW9uIGlzIHN0aWxsIGEgcGFyc2Ug ZXJyb3IKK1NFTEVDVCBudGlsZShESVNUSU5DVCA0KSBPVkVSICgpIEZST00gdGVuazE7IC0tIGVy cm9yCisKKy0tIEV4ZWN1dGlvbiBmYWlscyB3aXRoIGEgY2xlYXIgZXhlY3V0b3Itc2lkZSBlcnJv cgorU0VMRUNUIGNvdW50KERJU1RJTkNUIGZvdXIpIE9WRVIgKFBBUlRJVElPTiBCWSB0ZW4pIEZS T00gdGVuazE7IC0tIGVycm9yCi0tIAoyLjUyLjAKCg== --000000000000c18cea0650a3c85c--