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 1vPx6C-002tyG-1b for pgsql-hackers@arkaria.postgresql.org; Mon, 01 Dec 2025 06:09:24 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vPx6A-000Rnv-2j for pgsql-hackers@arkaria.postgresql.org; Mon, 01 Dec 2025 06:09:23 +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 1vPx6A-000Rnm-1A for pgsql-hackers@lists.postgresql.org; Mon, 01 Dec 2025 06:09:22 +0000 Received: from mail-ed1-x52c.google.com ([2a00:1450:4864:20::52c]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vPx68-002SGk-1g for pgsql-hackers@postgresql.org; Mon, 01 Dec 2025 06:09:22 +0000 Received: by mail-ed1-x52c.google.com with SMTP id 4fb4d7f45d1cf-640c1fda178so7209616a12.1 for ; Sun, 30 Nov 2025 22:09:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1764569357; x=1765174157; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=qIe/AbfHFTytB7y1IPGljbEQ89Mnl4vCKCI9g2fE8XM=; b=QeFYHDkR2jC2WLe9vnNvsyozN12oZ9SgpiWWzIenToW114/8rQdjxTv1mQ9dljJR81 E6c/z2y5dUdzhd5pSGAnkMbKuQspYClK7oEzbBMNOd/OXwvhem9KjB2QjcFBWFVeuKDn GR6wXC1NtzMkO9ck7o+wY4eDhlhYyX1UNOUPxrMCo5+GimciRKy7pJh+2RBijUPHayi6 Is8yC7pm+lumAA8dE5U305agDDDh21YIFiZQ0cBWy+fCpOCcHN2WGXNrG/0SUIfd90Hd z5Uj+yL1PUN/R68rlKZlMsOW50weVWy8YM6bFsTcazIWLfVf1j6asxTVYeoYMvcEvWXl 6gZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764569357; x=1765174157; h=cc: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=qIe/AbfHFTytB7y1IPGljbEQ89Mnl4vCKCI9g2fE8XM=; b=g/Hpx06JNbK1Q74177ksYFk9kU4I5gkGf1u1lVJcuuYwkUJEAXHFE0NhpLlPMtQUMh eA4+/iR9g3snscs0/rg7EjX+rutMEnOKLYLpvKZ8L7IvX3PRkhS7p7WFqZKf+m5S436D +24SOfSa4b+y3QGW9/4ghu9C+qomKTgkogodbpr9A/t5y7mCJCRHeksbMOkyDcgUAptw UHoaKRxEMI2T0Sf5ZI8Hm7LbJxukfiz+uKohKVP4BKdchnnbWwdylN+4r1BmmZAMSza7 KyFVfWMt0FoZcDZTmXOppSq6tPrZMsoI6Gx78CYioyvt9dHW9Z1wze8TRO2mVkZI9hOm fdxQ== X-Forwarded-Encrypted: i=1; AJvYcCWAR77oJsAaycWIby1ACQYv+00XbRZ+b4PA8f05eVaPkVEhLzkOXFrW2xi7l+/nRHUTmy86+4ui7iPQMCX3@postgresql.org X-Gm-Message-State: AOJu0YwuYszlZnX7MzmKrW6oDGo3+HQqFPRtsSLlaShk5MXxDt6YUnnf PE17KDs1AhILGdy/42y6/0GfNMiA8K1GXnAYBYXnqyzkdDNHl3T5I+YUy0BJD5oPUlFSdRtPPKo kuPPVIgcCcs2xWHvdFNHlRxtnsQH1sb4= X-Gm-Gg: ASbGncsq3TdfBZpPyY0CvxUYn32IgjS4EEiL7jDXWloT6BMMVG83Q7yXxf0MYb5ljg4 czb8XMnt98Ol2UIF56hGJE6Xj8FFvI4SxuKQGUF8IgxScU0ytgPWwlUPtY2nR7i20z7UnhoQFJ1 Ki0e6BXVu17AG9mGREtYPLyKr5w6BBHV+CKeDhC2yoxK1inT7gpYQEWqxN8Cgfe2+ChvvtqdZ2g Xv3bNqqch+qO/+tHNTj3HVQJNuAp4T0nAou+YDt6SflDFl2RzkXZSQnAX100bQ0ffYDQ5AR7A2f Pd+latDZk3Jjqk9cZCUzsRwjPv6T X-Google-Smtp-Source: AGHT+IFFujWY+IqYU/8xV0DiCt/fnWOMRsBi45YxNhYqk2KX+gJwGBbMuGhCLVz8b/JSKoICO3vaDpGUKRpCnGRn4OQ= X-Received: by 2002:a05:6402:51c7:b0:641:6872:8857 with SMTP id 4fb4d7f45d1cf-64555d2fc70mr34773814a12.34.1764569357055; Sun, 30 Nov 2025 22:09:17 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Junwang Zhao Date: Mon, 1 Dec 2025 14:09:00 +0800 X-Gm-Features: AWmQ_bl5tC-469XbJtSdEtLQF9d4vw9tdGuq5TFZijlGvWlRwflu9ZcFv5_wqTo Message-ID: Subject: Re: Eliminating SPI / SQL from some RI triggers - take 3 To: Amit Langote Cc: Pavel Stehule , PostgreSQL-development Content-Type: multipart/mixed; boundary="000000000000b5b8e40644ddd176" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000b5b8e40644ddd176 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, On Wed, Oct 22, 2025 at 9:56=E2=80=AFPM Amit Langote wrote: > > . > On Tue, Oct 21, 2025 at 2:10=E2=80=AFPM Pavel Stehule wrote: > > =C3=BAt 21. 10. 2025 v 6:07 odes=C3=ADlatel Amit Langote napsal: > >> > >> On Thu, Apr 3, 2025 at 7:19=E2=80=AFPM Amit Langote wrote: > >> > On Fri, Dec 20, 2024 at 1:23=E2=80=AFPM Amit Langote wrote: > >> > > We discussed $subject at [1] and [2] and I'd like to continue that > >> > > work with the hope to commit some part of it for v18. > >> > > >> > I did not get a chance to do any further work on this in this cycle, > >> > but plan to start working on it after beta release, so moving this t= o > >> > the next CF. I will post a rebased patch after the freeze to keep t= he > >> > bots green for now. > >> > >> Sorry for the inactivity. I've moved the patch entry in the CF app to > >> PG19-Drafts, since I don't plan to work on it myself in the immediate > >> future. However, Junwang Zhao has expressed interest in taking this > >> work forward, and I look forward to working with him on it. > > > > > > This is very interesting and important feature - I can help with testin= g and review if it will be necessary > > Thanks for the interest. > > Just to add a quick note on the current direction I=E2=80=99ve been discu= ssing > off-list with Junwang: > > The next iteration of this work will likely follow a hybrid "fast-path > + fallback" design rather than the original pure fast-path approach. > The idea is to keep the optimization for straightforward cases where > the foreign key and referenced key can be verified by a direct index > probe, while falling back to the existing SPI path only when the > runtime behavior of the executor is non-trivial to replicate -- such > as visibility rechecks under concurrent updates -- or when the > constraint itself involves richer semantics, like temporal foreign > keys that require range and aggregation logic. That keeps the > optimization safe without changing the meaning of constraint > enforcement. > > This direction comes partly in response to the feedback from Robert > and Tom in the earlier Eliminating SPI threads, who raised concerns > that a fast path might silently diverge from what the executor does at > runtime in subtle cases. The fallback design aims to address that > directly: it keeps the optimization where it=E2=80=99s clearly safe, but > defers to the existing SPI-based implementation whenever correctness > might depend on executor behavior that would otherwise be difficult or > risky to reproduce locally. > > In practice, this means adding a guarded fast path that performs the > index probe and tuple lock directly under the same snapshot and > security context that SPI would use, while caching stable metadata > such as index descriptors, scan keys, and operator information per > constraint or per statement. The fallback to SPI remains for the few > cases that either depend on executor behavior or need features beyond > a simple index probe: > > * Concurrent updates or deletes: If table_tuple_lock() reports that > the target tuple was updated or deleted, we delegate to the SPI path > so that EvalPlanQual and visibility rules are applied as today. > > * Partitioned parents: Skipped in v1 for simplicity, since they > require routing the probe through the correct partition using > PartitionDirectory. This can be added later as a separate patch once > the core mechanism is stable. > > * Temporal foreign keys: These use range overlap and containment > semantics (&&, <@, range_agg()) that inherently involve aggregation > and multiple-row reasoning, so they stay on the SPI path. > > Everything else -- multi-column keys, cross-type equality supported by > the index opfamily, collation matching, and RLS/ACL enforcement -- > will be handled directly in the fast path. The security behavior will > mirror the existing SPI path by temporarily switching to the parent > table's owner with SECURITY_LOCAL_USERID_CHANGE | SECURITY_NOFORCE_RLS > around the probe, like ri_PerformCheck() does. > > For concurrency, the fast path locks the located parent tuple with > LockTupleKeyShare under GetActiveSnapshot(). If that succeeds (TM_Ok), > the check passes immediately. While non-TM_Ok cases fall back for now, > a later refinement could follow the update chain with > table_tuple_fetch_row_version() under the current snapshot and re-lock > the visible version, making the fast path fully self-contained. > > That=E2=80=99s the direction Junwang and I plan to explore next. > > -- > Thanks, Amit Langote As Amit has already stated, we are approaching a hybrid "fast-path + fallba= ck" design. 0001 adds a fast path optimization for foreign key constraint checks that bypasses the SPI executor, the fast path applies when the referenced table is not partitioned, and the constraint does not involve temporal semantics. With the following test: create table pk (a numeric primary key); create table fk (a bigint references pk); insert into pk select generate_series(1, 2000000); head: [local] zhjwpku@postgres:5432-90419=3D# insert into fk select generate_series(1, 2000000, 2); INSERT 0 1000000 Time: 13516.177 ms (00:13.516) [local] zhjwpku@postgres:5432-90419=3D# update fk set a =3D a + 1; UPDATE 1000000 Time: 15057.638 ms (00:15.058) patched: [local] zhjwpku@postgres:5432-98673=3D# insert into fk select generate_series(1, 2000000, 2); INSERT 0 1000000 Time: 8248.777 ms (00:08.249) [local] zhjwpku@postgres:5432-98673=3D# update fk set a =3D a + 1; UPDATE 1000000 Time: 10117.002 ms (00:10.117) 0002 cache fast-path metadata used by the index probe, at the current time only comparison operator hash entries, operator function OIDs and strategy numbers and subtypes for index scans. But this cache doesn't buy any performance improvement. Caching additional metadata should improve performance for foreign key chec= ks. Amit suggested introducing a mechanism for ri_triggers.c to register a cleanup callback in the EState, which AfterTriggerEndQuery() could then invoke to release per-statement cached metadata (such as the IndexScanDesc)= . However, I haven't been able to implement this mechanism yet. Amit and I agree that we can post the patches here for review now. We are continuing to work on improving the metadata cache implementation. --=20 Regards Junwang Zhao --000000000000b5b8e40644ddd176 Content-Type: application/octet-stream; name="v2-0002-Cache-fast-path-metadata-for-foreign-key-checks.patch" Content-Disposition: attachment; filename="v2-0002-Cache-fast-path-metadata-for-foreign-key-checks.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mimozcpn1 RnJvbSAwMjA3MjkxMzljODI0ZDY1YTAwOGM2NjQ0NDMxYmU4ZThlZmQ3ODAwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKdW53YW5nIFpoYW8gPHpoandwa3VAZ21haWwuY29tPgpEYXRl OiBNb24sIDEgRGVjIDIwMjUgMTI6NTg6NTkgKzA4MDAKU3ViamVjdDogW1BBVENIIHYyIDIvMl0g Q2FjaGUgZmFzdC1wYXRoIG1ldGFkYXRhIGZvciBmb3JlaWduIGtleSBjaGVja3MKClRoZSBtZXRh ZGF0YSBpcyBwb3B1bGF0ZWQgbGF6aWx5IG9uIGZpcnN0IHVzZSB2aWEKcmlfcG9wdWxhdGVfZmFz dHBhdGhfbWV0YWRhdGEoKSBhbmQgcmV1c2VkIGluIHN1YnNlcXVlbnQgY2hlY2tzIHZpYQpidWls ZF9zY2Fua2V5c19mcm9tX2NhY2hlKCkuIFRoaXMgZWxpbWluYXRlcyByZXBlYXRlZCBjYWxscyB0 bwpyaV9IYXNoQ29tcGFyZU9wKCkgYW5kIGdldF9vcF9vcGZhbWlseV9wcm9wZXJ0aWVzKCkgZHVy aW5nIEZLIGNoZWNrcy4KLS0tCiBzcmMvYmFja2VuZC91dGlscy9hZHQvcmlfdHJpZ2dlcnMuYyB8 IDkwICsrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgNjUgaW5z ZXJ0aW9ucygrKSwgMjUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L3JpX3RyaWdnZXJzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcmlfdHJpZ2dlcnMu YwppbmRleCBjZmI4NWI5ZDc1My4uZjJlN2U0ZjRhZTkgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3V0aWxzL2FkdC9yaV90cmlnZ2Vycy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9yaV90 cmlnZ2Vycy5jCkBAIC05NCw2ICs5NCw3IEBACiAjZGVmaW5lIFJJX1RSSUdUWVBFX1VQREFURSAy CiAjZGVmaW5lIFJJX1RSSUdUWVBFX0RFTEVURSAzCiAKK3N0cnVjdCBSSV9Db21wYXJlSGFzaEVu dHJ5OwogCiAvKgogICogUklfQ29uc3RyYWludEluZm8KQEAgLTEzMyw2ICsxMzQsMTYgQEAgdHlw ZWRlZiBzdHJ1Y3QgUklfQ29uc3RyYWludEluZm8KIAlPaWQJCQlhZ2dlZF9wZXJpb2RfY29udGFp bmVkX2J5X29wZXI7IC8qIGZrYXR0ciA8QCByYW5nZV9hZ2cocGthdHRyKSAqLwogCU9pZAkJCXBl cmlvZF9pbnRlcnNlY3Rfb3BlcjsJLyogYW55cmFuZ2UgKiBhbnlyYW5nZSAqLwogCWRsaXN0X25v ZGUJdmFsaWRfbGluazsJCS8qIExpbmsgaW4gbGlzdCBvZiB2YWxpZCBlbnRyaWVzICovCisKKwkv KiBGYXN0LXBhdGggbWV0YWRhdGEgZm9yIFJJIGNoZWNrcyBvbiBmb3JlaWduIHRhYmxlcyAqLwor CWJvb2wJCWZwbWV0YV92YWxpZDsgLyogaXMgZmFzdC1wYXRoIG1ldGFkYXRhIHZhbGlkPyAqLwor CS8vIFJlbGF0aW9uCWlkeHJlbDsKKwkvLyBJbmRleFNjYW5EZXNjIGlkeHNjYW47CisJLy8gVHVw bGVUYWJsZVNsb3QgKm91dHNsb3Q7CisJc3RydWN0IFJJX0NvbXBhcmVIYXNoRW50cnkgKmNvbXBh cmVfZW50cmllc1tSSV9NQVhfTlVNS0VZU107CisJUmVnUHJvY2VkdXJlCXJlZ29wc1tSSV9NQVhf TlVNS0VZU107CisJT2lkCQkJCXN1YnR5cGVzW1JJX01BWF9OVU1LRVlTXTsKKwlpbnQJCQkJc3Ry YXRzW1JJX01BWF9OVU1LRVlTXTsKIH0gUklfQ29uc3RyYWludEluZm87CiAKIC8qCkBAIC0yOTUs NiArMzA2LDQyIEBAIGdldF9ma2V5X3VuaXF1ZV9pbmRleChPaWQgY29ub2lkKQogCXJldHVybiBy ZXN1bHQ7CiB9CiAKK3N0YXRpYyB2b2lkCityaV9wb3B1bGF0ZV9mYXN0cGF0aF9tZXRhZGF0YShP aWQgY29uc3RyYWludE9pZCwKKwkJCQkJCQkgIFJlbGF0aW9uIHBrX3JlbCwgUmVsYXRpb24gZmtf cmVsLCBSZWxhdGlvbiBpZHhfcmVsKQoreworCVJJX0NvbnN0cmFpbnRJbmZvICpyaWluZm87CisK KwkvKiBGaW5kIHRoZSBjb25zdHJhaW50IGluZm8gKi8KKwlyaWluZm8gPSAoUklfQ29uc3RyYWlu dEluZm8gKikKKwkJaGFzaF9zZWFyY2gocmlfY29uc3RyYWludF9jYWNoZSwKKwkJCQkJJmNvbnN0 cmFpbnRPaWQsCisJCQkJCUhBU0hfRklORCwKKwkJCQkJTlVMTCk7CisJQXNzZXJ0KHJpaW5mbyAh PSBOVUxMICYmIHJpaW5mby0+dmFsaWQpOworCisJZm9yIChpbnQgaSA9IDA7IGkgPCByaWluZm8t Pm5rZXlzOyBpKyspCisJeworCQkvKiBVc2UgUEsgPSBGSyBlcXVhbGl0eSBvcGVyYXRvci4gKi8K KwkJT2lkIGVxX29wciA9IHJpaW5mby0+cGZfZXFfb3Byc1tpXTsKKwkJT2lkIHR5cGVpZCA9IFJJ QXR0VHlwZShma19yZWwsIHJpaW5mby0+ZmtfYXR0bnVtc1tpXSk7CisJCU9pZCBsZWZ0dHlwZTsK KwkJUklfQ29tcGFyZUhhc2hFbnRyeSAqZW50cnkgPSByaV9IYXNoQ29tcGFyZU9wKGVxX29wciwg dHlwZWlkKTsKKworCQlyaWluZm8tPmNvbXBhcmVfZW50cmllc1tpXSA9IGVudHJ5OworCQlyaWlu Zm8tPnJlZ29wc1tpXSA9IGdldF9vcGNvZGUoZXFfb3ByKTsKKworCQlnZXRfb3Bfb3BmYW1pbHlf cHJvcGVydGllcyhlcV9vcHIsCisJCQkJCQkJCSAgIGlkeF9yZWwtPnJkX29wZmFtaWx5W2ldLAor CQkJCQkJCQkgICBmYWxzZSwKKwkJCQkJCQkJICAgJnJpaW5mby0+c3RyYXRzW2ldLAorCQkJCQkJ CQkgICAmbGVmdHR5cGUsCisJCQkJCQkJCSAgICZyaWluZm8tPnN1YnR5cGVzW2ldKTsKKwl9CisK KwlyaWluZm8tPmZwbWV0YV92YWxpZCA9IHRydWU7Cit9CisKIC8qCiAgKiByaV9DaGVja1Blcm1p c3Npb25zCiAgKiAgIENoZWNrIHRoYXQgdGhlIG5ldyB1c2VyIGhhcyBwZXJtaXNzaW9ucyB0byBs b29rIGludG8gdGhlIHNjaGVtYSBvZgpAQCAtMzY1LDIwICs0MTIsMTQgQEAgcmVjaGVja19tYXRj aGVkX3BrX3R1cGxlKFJlbGF0aW9uIGlkeHJlbCwgU2NhbktleURhdGEgKnNrZXlzLAogfQogCiAv KgotICogRG9lc24ndCBpbmNsdWRlIGFueSBjYWNoZSBmb3Igbm93LgorICogQnVpbGQgU2Nhbktl eXMgZnJvbSBjYWNoZWQgbWV0YWRhdGEgZm9yIGZhc3QtcGF0aCBmb3JlaWduIGtleSBjaGVja3MK ICAqLwogc3RhdGljIHZvaWQKIGJ1aWxkX3NjYW5rZXlzX2Zyb21fY2FjaGUoY29uc3QgUklfQ29u c3RyYWludEluZm8gKnJpaW5mbywKIAkJCQkJCSAgUmVsYXRpb24gcGtfcmVsLCBSZWxhdGlvbiBm a19yZWwsCi0JCQkJCQkgIFJlbGF0aW9uIGlkeF9yZWwsIGludCBudW1fcGssCi0JCQkJCQkgIERh dHVtICpwa192YWxzLCBjaGFyICpwa19udWxscywKLQkJCQkJCSAgU2NhbktleSBza2V5cykKKwkJ CQkJCSAgUmVsYXRpb24gaWR4X3JlbCwgRGF0dW0gKnBrX3ZhbHMsCisJCQkJCQkgIGNoYXIgKnBr X251bGxzLCBTY2FuS2V5IHNrZXlzKQogewotCS8qIFVzZSBQSyA9IEZLIGVxdWFsaXR5IG9wZXJh dG9yLiAqLwotCWNvbnN0IE9pZCAqZXFfb3BycyA9IHJpaW5mby0+cGZfZXFfb3ByczsKLQotCUFz c2VydChudW1fcGsgPT0gcmlpbmZvLT5ua2V5cyk7Ci0KIAkvKgogCSAqIE1heSBuZWVkIHRvIGNh c3QgZWFjaCBvZiB0aGUgaW5kaXZpZHVhbCB2YWx1ZXMgb2YgdGhlIGZvcmVpZ24ga2V5CiAJICog dG8gdGhlIGNvcnJlc3BvbmRpbmcgUEsgY29sdW1uJ3MgdHlwZSBpZiB0aGUgZXF1YWxpdHkgb3Bl cmF0b3IKQEAgLTM4OCw5ICs0MjksNyBAQCBidWlsZF9zY2Fua2V5c19mcm9tX2NhY2hlKGNvbnN0 IFJJX0NvbnN0cmFpbnRJbmZvICpyaWluZm8sCiAJewogCQlpZiAocGtfbnVsbHNbaV0gIT0gJ24n KQogCQl7Ci0JCQlPaWQgIGVxX29wciA9IGVxX29wcnNbaV07Ci0JCQlPaWQgIHR5cGVpZCA9IFJJ QXR0VHlwZShma19yZWwsIHJpaW5mby0+ZmtfYXR0bnVtc1tpXSk7Ci0JCQlSSV9Db21wYXJlSGFz aEVudHJ5ICplbnRyeSA9IHJpX0hhc2hDb21wYXJlT3AoZXFfb3ByLCB0eXBlaWQpOworCQkJUklf Q29tcGFyZUhhc2hFbnRyeSAqZW50cnkgPSByaWluZm8tPmNvbXBhcmVfZW50cmllc1tpXTsKIAog CQkJaWYgKE9pZElzVmFsaWQoZW50cnktPmNhc3RfZnVuY19maW5mby5mbl9vaWQpKQogCQkJCXBr X3ZhbHNbaV0gPSBGdW5jdGlvbkNhbGwzKCZlbnRyeS0+Y2FzdF9mdW5jX2ZpbmZvLApAQCAtNDA2 LDIwICs0NDUsMTIgQEAgYnVpbGRfc2NhbmtleXNfZnJvbV9jYWNoZShjb25zdCBSSV9Db25zdHJh aW50SW5mbyAqcmlpbmZvLAogCSAqIFNldCB1cCBTY2FuS2V5cyBmb3IgdGhlIGluZGV4IHNjYW4u IFRoaXMgaXMgZXNzZW50aWFsbHkgaG93CiAJICogRXhlY0luZGV4QnVpbGRTY2FuS2V5cygpIHNl dHMgdGhlbSB1cC4KIAkgKi8KLQlmb3IgKGludCBpID0gMDsgaSA8IG51bV9wazsgaSsrKQorCWZv ciAoaW50IGkgPSAwOyBpIDwgcmlpbmZvLT5ua2V5czsgaSsrKQogCXsKIAkJaW50CQlwa2F0dHJu byA9IGkgKyAxOwotCQlPaWQJCWxlZnR0eXBlLAotCQkJCXJpZ2h0dHlwZTsKLQkJT2lkCQlvcGVy YXRvciA9IGVxX29wcnNbaV07Ci0JCU9pZAkJb3BmYW1pbHkgPSBpZHhfcmVsLT5yZF9vcGZhbWls eVtpXTsKLQkJaW50ICBzdHJhdDsKLQkJUmVnUHJvY2VkdXJlIHJlZ29wID0gZ2V0X29wY29kZShv cGVyYXRvcik7Ci0KLQkJZ2V0X29wX29wZmFtaWx5X3Byb3BlcnRpZXMob3BlcmF0b3IsIG9wZmFt aWx5LCBmYWxzZSwgJnN0cmF0LAotCQkJCQkJCQkgICAmbGVmdHR5cGUsICZyaWdodHR5cGUpOwot CQlTY2FuS2V5RW50cnlJbml0aWFsaXplKCZza2V5c1tpXSwgMCwgcGthdHRybm8sIHN0cmF0LCBy aWdodHR5cGUsCi0JCQkJCQkJICAgaWR4X3JlbC0+cmRfaW5kY29sbGF0aW9uW2ldLCByZWdvcCwK KworCQlTY2FuS2V5RW50cnlJbml0aWFsaXplKCZza2V5c1tpXSwgMCwgcGthdHRybm8sIHJpaW5m by0+c3RyYXRzW2ldLCByaWluZm8tPnN1YnR5cGVzW2ldLAorCQkJCQkJCSAgIGlkeF9yZWwtPnJk X2luZGNvbGxhdGlvbltpXSwgcmlpbmZvLT5yZWdvcHNbaV0sCiAJCQkJCQkJICAgcGtfdmFsc1tp XSk7CiAJfQogfQpAQCAtNTgzLDcgKzYxNCwxNSBAQCBSSV9GS2V5X2NoZWNrKFRyaWdnZXJEYXRh ICp0cmlnZGF0YSkKIAkJaWR4cmVsID0gaW5kZXhfb3BlbihpZHhvaWQsIFJvd1NoYXJlTG9jayk7 CiAJCW51bV9wayA9IEluZGV4UmVsYXRpb25HZXROdW1iZXJPZktleUF0dHJpYnV0ZXMoaWR4cmVs KTsKIAotCQlidWlsZF9zY2Fua2V5c19mcm9tX2NhY2hlKHJpaW5mbywgcGtfcmVsLCBma19yZWws IGlkeHJlbCwgbnVtX3BrLAorCQlBc3NlcnQobnVtX3BrID09IHJpaW5mby0+bmtleXMpOworCisJ CS8qIElmIEZhc3QtcGF0aCBtZXRhZGF0YSBoYXNuJ3QgYmVlbiBwb3B1bGF0ZWQsIGRvIGl0IG5v dyAqLworCQlpZiAoIXJpaW5mby0+ZnBtZXRhX3ZhbGlkKQorCQkJcmlfcG9wdWxhdGVfZmFzdHBh dGhfbWV0YWRhdGEocmlpbmZvLT5jb25zdHJhaW50X2lkLAorCQkJCQkJCQkJCSAgcGtfcmVsLCBm a19yZWwsIGlkeHJlbCk7CisJCUFzc2VydChyaWluZm8tPmZwbWV0YV92YWxpZCk7CisKKwkJYnVp bGRfc2NhbmtleXNfZnJvbV9jYWNoZShyaWluZm8sIHBrX3JlbCwgZmtfcmVsLCBpZHhyZWwsCiAJ CQkJCQkJCSAgcGtfdmFscywgcGtfbnVsbHMsIHNrZXkpOwogCiAJCXNjYW4gPSBpbmRleF9iZWdp bnNjYW4ocGtfcmVsLCBpZHhyZWwsIEdldEFjdGl2ZVNuYXBzaG90KCksIE5VTEwsIHJpaW5mby0+ bmtleXMsIDApOwpAQCAtMjY2Myw2ICsyNzAyLDcgQEAgcmlfTG9hZENvbnN0cmFpbnRJbmZvKE9p ZCBjb25zdHJhaW50T2lkKQogCWRjbGlzdF9wdXNoX3RhaWwoJnJpX2NvbnN0cmFpbnRfY2FjaGVf dmFsaWRfbGlzdCwgJnJpaW5mby0+dmFsaWRfbGluayk7CiAKIAlyaWluZm8tPnZhbGlkID0gdHJ1 ZTsKKwlyaWluZm8tPmZwbWV0YV92YWxpZCA9IGZhbHNlOwogCiAJcmV0dXJuIHJpaW5mbzsKIH0K LS0gCjIuNDEuMAoK --000000000000b5b8e40644ddd176 Content-Type: application/octet-stream; name="v2-0001-Add-fast-path-for-foreign-key-constraint-checks.patch" Content-Disposition: attachment; filename="v2-0001-Add-fast-path-for-foreign-key-constraint-checks.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mimozcpc0 RnJvbSBjOTNlZThiNmRmZDVmMzQ1NjAzYzMyN2U4MmI1MGYxZGQ4ZjMxY2YwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKdW53YW5nIFpoYW8gPHpoandwa3VAZ21haWwuY29tPgpEYXRl OiBNb24sIDEgRGVjIDIwMjUgMTI6MTY6NDYgKzA4MDAKU3ViamVjdDogW1BBVENIIHYyIDEvMl0g QWRkIGZhc3QgcGF0aCBmb3IgZm9yZWlnbiBrZXkgY29uc3RyYWludCBjaGVja3MKCkFkZCBhIGZh c3QgcGF0aCBvcHRpbWl6YXRpb24gZm9yIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgY2hlY2tzIHRo YXQKYnlwYXNzZXMgdGhlIFNQSSBleGVjdXRvciBmb3Igc2ltcGxlIGZvcmVpZ24ga2V5cyBieSBk aXJlY3RseSBwcm9iaW5nCnRoZSB1bmlxdWUgaW5kZXggb24gdGhlIHJlZmVyZW5jZWQgdGFibGUu CgpUaGUgZmFzdCBwYXRoIGFwcGxpZXMgd2hlbiB0aGUgcmVmZXJlbmNlZCB0YWJsZSBpcyBub3Qg cGFydGl0aW9uZWQsCmFuZCB0aGUgY29uc3RyYWludCBkb2VzIG5vdCBpbnZvbHZlIHRlbXBvcmFs IHNlbWFudGljcy4gSXQgZXh0cmFjdHMKdGhlIEZLIHZhbHVlLCBzY2FucyB0aGUgdW5pcXVlIGlu ZGV4IGRpcmVjdGx5LCBhbmQgbG9ja3MgdGhlIHR1cGxlCndpdGggS0VZIFNIQVJFIGxvY2ssIG1h dGNoaW5nIFNQSSBiZWhhdmlvci4KClRoaXMgYXZvaWRzIFNQSSBvdmVyaGVhZCBhbmQgaW1wcm92 ZXMgcGVyZm9ybWFuY2UgZm9yIGJ1bGsgb3BlcmF0aW9ucwp3aXRoIG1hbnkgRksgY2hlY2tzLgoK UmVmYWN0b3Jpbmc6IEV4dHJhY3QgdHVwbGUgbG9ja2luZyBsb2dpYyBpbnRvIEV4ZWNMb2NrVGFi bGVUdXBsZSgpIGZvcgpyZXVzZS4KCkF1dGhvcjogQW1pdCBMYW5nb3RlLCBKdW53YW5nIFpoYW8K CkRpc2N1c3Npb246Ci0tLQogc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUxvY2tSb3dzLmMgICAg ICAgICAgIHwgMTY0ICsrKysrLS0tLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3JpX3RyaWdnZXJz LmMgICAgICAgICAgIHwgMzIzICsrKysrKysrKysrKysrKysrLQogc3JjL2luY2x1ZGUvZXhlY3V0 b3IvZXhlY3V0b3IuaCAgICAgICAgICAgICAgIHwgICA5ICsKIC4uLi9leHBlY3RlZC9may1jb25j dXJyZW50LXBrLXVwZC5vdXQgICAgICAgICB8ICA1OCArKysrCiBzcmMvdGVzdC9pc29sYXRpb24v aXNvbGF0aW9uX3NjaGVkdWxlICAgICAgICAgfCAgIDEgKwogLi4uL2lzb2xhdGlvbi9zcGVjcy9m ay1jb25jdXJyZW50LXBrLXVwZC5zcGVjIHwgIDQyICsrKwogc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9mb3JlaWduX2tleS5vdXQgICAgIHwgIDQ3ICsrKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwv Zm9yZWlnbl9rZXkuc3FsICAgICAgICAgIHwgIDY0ICsrKysKIDggZmlsZXMgY2hhbmdlZCwgNjM1 IGluc2VydGlvbnMoKyksIDczIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90 ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC9may1jb25jdXJyZW50LXBrLXVwZC5vdXQKIGNyZWF0ZSBt b2RlIDEwMDY0NCBzcmMvdGVzdC9pc29sYXRpb24vc3BlY3MvZmstY29uY3VycmVudC1way11cGQu c3BlYwoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVMb2NrUm93cy5jIGIv c3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUxvY2tSb3dzLmMKaW5kZXggYThhZmJmOTNiNDguLjA2 YzQ3ODRjMGY1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlTG9ja1Jvd3Mu YworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlTG9ja1Jvd3MuYwpAQCAtNzksMTAgKzc5 LDcgQEAgbG5leHQ6CiAJCURhdHVtCQlkYXR1bTsKIAkJYm9vbAkJaXNOdWxsOwogCQlJdGVtUG9p bnRlckRhdGEgdGlkOwotCQlUTV9GYWlsdXJlRGF0YSB0bWZkOwogCQlMb2NrVHVwbGVNb2RlIGxv Y2ttb2RlOwotCQlpbnQJCQlsb2NrZmxhZ3MgPSAwOwotCQlUTV9SZXN1bHQJdGVzdDsKIAkJVHVw bGVUYWJsZVNsb3QgKm1hcmtTbG90OwogCiAJCS8qIGNsZWFyIGFueSBsZWZ0b3ZlciB0ZXN0IHR1 cGxlIGZvciB0aGlzIHJlbCAqLwpAQCAtMTc4LDc0ICsxNzUsMTEgQEAgbG5leHQ6CiAJCQkJYnJl YWs7CiAJCX0KIAotCQlsb2NrZmxhZ3MgPSBUVVBMRV9MT0NLX0ZMQUdfTE9DS19VUERBVEVfSU5f UFJPR1JFU1M7Ci0JCWlmICghSXNvbGF0aW9uVXNlc1hhY3RTbmFwc2hvdCgpKQotCQkJbG9ja2Zs YWdzIHw9IFRVUExFX0xPQ0tfRkxBR19GSU5EX0xBU1RfVkVSU0lPTjsKLQotCQl0ZXN0ID0gdGFi bGVfdHVwbGVfbG9jayhlcm0tPnJlbGF0aW9uLCAmdGlkLCBlc3RhdGUtPmVzX3NuYXBzaG90LAot CQkJCQkJCQltYXJrU2xvdCwgZXN0YXRlLT5lc19vdXRwdXRfY2lkLAotCQkJCQkJCQlsb2NrbW9k ZSwgZXJtLT53YWl0UG9saWN5LAotCQkJCQkJCQlsb2NrZmxhZ3MsCi0JCQkJCQkJCSZ0bWZkKTsK LQotCQlzd2l0Y2ggKHRlc3QpCi0JCXsKLQkJCWNhc2UgVE1fV291bGRCbG9jazoKLQkJCQkvKiBj b3VsZG4ndCBsb2NrIHR1cGxlIGluIFNLSVAgTE9DS0VEIG1vZGUgKi8KLQkJCQlnb3RvIGxuZXh0 OwotCi0JCQljYXNlIFRNX1NlbGZNb2RpZmllZDoKLQotCQkJCS8qCi0JCQkJICogVGhlIHRhcmdl dCB0dXBsZSB3YXMgYWxyZWFkeSB1cGRhdGVkIG9yIGRlbGV0ZWQgYnkgdGhlCi0JCQkJICogY3Vy cmVudCBjb21tYW5kLCBvciBieSBhIGxhdGVyIGNvbW1hbmQgaW4gdGhlIGN1cnJlbnQKLQkJCQkg KiB0cmFuc2FjdGlvbi4gIFdlICptdXN0KiBpZ25vcmUgdGhlIHR1cGxlIGluIHRoZSBmb3JtZXIK LQkJCQkgKiBjYXNlLCBzbyBhcyB0byBhdm9pZCB0aGUgIkhhbGxvd2VlbiBwcm9ibGVtIiBvZiBy ZXBlYXRlZAotCQkJCSAqIHVwZGF0ZSBhdHRlbXB0cy4gIEluIHRoZSBsYXR0ZXIgY2FzZSBpdCBt aWdodCBiZSBzZW5zaWJsZQotCQkJCSAqIHRvIGZldGNoIHRoZSB1cGRhdGVkIHR1cGxlIGluc3Rl YWQsIGJ1dCBkb2luZyBzbyB3b3VsZAotCQkJCSAqIHJlcXVpcmUgY2hhbmdpbmcgaGVhcF91cGRh dGUgYW5kIGhlYXBfZGVsZXRlIHRvIG5vdAotCQkJCSAqIGNvbXBsYWluIGFib3V0IHVwZGF0aW5n ICJpbnZpc2libGUiIHR1cGxlcywgd2hpY2ggc2VlbXMKLQkJCQkgKiBwcmV0dHkgc2NhcnkgKHRh YmxlX3R1cGxlX2xvY2sgd2lsbCBub3QgY29tcGxhaW4sIGJ1dCBmZXcKLQkJCQkgKiBjYWxsZXJz IGV4cGVjdCBUTV9JbnZpc2libGUsIGFuZCB3ZSdyZSBub3Qgb25lIG9mIHRoZW0pLiBTbwotCQkJ CSAqIGZvciBub3csIHRyZWF0IHRoZSB0dXBsZSBhcyBkZWxldGVkIGFuZCBkbyBub3QgcHJvY2Vz cy4KLQkJCQkgKi8KLQkJCQlnb3RvIGxuZXh0OwotCi0JCQljYXNlIFRNX09rOgotCi0JCQkJLyoK LQkJCQkgKiBHb3QgdGhlIGxvY2sgc3VjY2Vzc2Z1bGx5LCB0aGUgbG9ja2VkIHR1cGxlIHNhdmVk IGluCi0JCQkJICogbWFya1Nsb3QgZm9yLCBpZiBuZWVkZWQsIEV2YWxQbGFuUXVhbCB0ZXN0aW5n IGJlbG93LgotCQkJCSAqLwotCQkJCWlmICh0bWZkLnRyYXZlcnNlZCkKLQkJCQkJZXBxX25lZWRl ZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgVE1fVXBkYXRlZDoKLQkJCQlpZiAoSXNv bGF0aW9uVXNlc1hhY3RTbmFwc2hvdCgpKQotCQkJCQllcmVwb3J0KEVSUk9SLAotCQkJCQkJCShl cnJjb2RlKEVSUkNPREVfVF9SX1NFUklBTElaQVRJT05fRkFJTFVSRSksCi0JCQkJCQkJIGVycm1z ZygiY291bGQgbm90IHNlcmlhbGl6ZSBhY2Nlc3MgZHVlIHRvIGNvbmN1cnJlbnQgdXBkYXRlIikp KTsKLQkJCQllbG9nKEVSUk9SLCAidW5leHBlY3RlZCB0YWJsZV90dXBsZV9sb2NrIHN0YXR1czog JXUiLAotCQkJCQkgdGVzdCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgVE1fRGVsZXRlZDoKLQkJ CQlpZiAoSXNvbGF0aW9uVXNlc1hhY3RTbmFwc2hvdCgpKQotCQkJCQllcmVwb3J0KEVSUk9SLAot CQkJCQkJCShlcnJjb2RlKEVSUkNPREVfVF9SX1NFUklBTElaQVRJT05fRkFJTFVSRSksCi0JCQkJ CQkJIGVycm1zZygiY291bGQgbm90IHNlcmlhbGl6ZSBhY2Nlc3MgZHVlIHRvIGNvbmN1cnJlbnQg dXBkYXRlIikpKTsKLQkJCQkvKiB0dXBsZSB3YXMgZGVsZXRlZCBzbyBkb24ndCByZXR1cm4gaXQg Ki8KLQkJCQlnb3RvIGxuZXh0OwotCi0JCQljYXNlIFRNX0ludmlzaWJsZToKLQkJCQllbG9nKEVS Uk9SLCAiYXR0ZW1wdGVkIHRvIGxvY2sgaW52aXNpYmxlIHR1cGxlIik7Ci0JCQkJYnJlYWs7Ci0K LQkJCWRlZmF1bHQ6Ci0JCQkJZWxvZyhFUlJPUiwgInVucmVjb2duaXplZCB0YWJsZV90dXBsZV9s b2NrIHN0YXR1czogJXUiLAotCQkJCQkgdGVzdCk7Ci0JCX0KKwkJLyogc2tpcCB0dXBsZSBpZiBp dCBjb3VsZG4ndCBiZSBsb2NrZWQgKi8KKwkJaWYgKCFFeGVjTG9ja1RhYmxlVHVwbGUoZXJtLT5y ZWxhdGlvbiwgJnRpZCwgbWFya1Nsb3QsCisJCQkJCQkJCWVzdGF0ZS0+ZXNfc25hcHNob3QsIGVz dGF0ZS0+ZXNfb3V0cHV0X2NpZCwKKwkJCQkJCQkJbG9ja21vZGUsIGVybS0+d2FpdFBvbGljeSwg JmVwcV9uZWVkZWQpKQorCQkJZ290byBsbmV4dDsKIAogCQkvKiBSZW1lbWJlciBsb2NrZWQgdHVw bGUncyBUSUQgZm9yIEVQUSB0ZXN0aW5nIGFuZCBXSEVSRSBDVVJSRU5UIE9GICovCiAJCWVybS0+ Y3VyQ3RpZCA9IHRpZDsKQEAgLTI4MCw2ICsyMTQsOTQgQEAgbG5leHQ6CiAJcmV0dXJuIHNsb3Q7 CiB9CiAKKworLyoKKyAqIEV4ZWNMb2NrVGFibGVUdXBsZQorICogCQlMb2NrcyB0dXBsZSB3aXRo IHRoZSBzcGVjaWZpZWQgVElEIGluIGxvY2ttb2RlIGZvbGxvd2luZyBnaXZlbiB3YWl0CisgKiAJ CXBvbGljeQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHVwbGUgd2FzIHN1Y2Nlc3NmdWxs eSBsb2NrZWQuICBMb2NrZWQgdHVwbGUgaXMgbG9hZGVkCisgKiBpbnRvIHByb3ZpZGVkIHNsb3Qu CisgKi8KK2Jvb2wKK0V4ZWNMb2NrVGFibGVUdXBsZShSZWxhdGlvbiByZWxhdGlvbiwgSXRlbVBv aW50ZXIgdGlkLCBUdXBsZVRhYmxlU2xvdCAqc2xvdCwKKwkJCQkgICBTbmFwc2hvdCBzbmFwc2hv dCwgQ29tbWFuZElkIGNpZCwKKwkJCQkgICBMb2NrVHVwbGVNb2RlIGxvY2ttb2RlLCBMb2NrV2Fp dFBvbGljeSB3YWl0UG9saWN5LAorCQkJCSAgIGJvb2wgKnR1cGxlX2NvbmN1cnJlbnRseV91cGRh dGVkKQoreworCVRNX0ZhaWx1cmVEYXRhIHRtZmQ7CisJaW50CQkJbG9ja2ZsYWdzID0gVFVQTEVf TE9DS19GTEFHX0xPQ0tfVVBEQVRFX0lOX1BST0dSRVNTOworCVRNX1Jlc3VsdAl0ZXN0OworCisJ aWYgKHR1cGxlX2NvbmN1cnJlbnRseV91cGRhdGVkKQorCQkqdHVwbGVfY29uY3VycmVudGx5X3Vw ZGF0ZWQgPSBmYWxzZTsKKworCWlmICghSXNvbGF0aW9uVXNlc1hhY3RTbmFwc2hvdCgpKQorCQls b2NrZmxhZ3MgfD0gVFVQTEVfTE9DS19GTEFHX0ZJTkRfTEFTVF9WRVJTSU9OOworCisJdGVzdCA9 IHRhYmxlX3R1cGxlX2xvY2socmVsYXRpb24sIHRpZCwgc25hcHNob3QsIHNsb3QsIGNpZCwgbG9j a21vZGUsCisJCQkJCQkJd2FpdFBvbGljeSwgbG9ja2ZsYWdzLCAmdG1mZCk7CisKKwlzd2l0Y2gg KHRlc3QpCisJeworCQljYXNlIFRNX1dvdWxkQmxvY2s6CisJCQkvKiBjb3VsZG4ndCBsb2NrIHR1 cGxlIGluIFNLSVAgTE9DS0VEIG1vZGUgKi8KKwkJCXJldHVybiBmYWxzZTsKKworCQljYXNlIFRN X1NlbGZNb2RpZmllZDoKKwkJCS8qCisJCQkgKiBUaGUgdGFyZ2V0IHR1cGxlIHdhcyBhbHJlYWR5 IHVwZGF0ZWQgb3IgZGVsZXRlZCBieSB0aGUKKwkJCSAqIGN1cnJlbnQgY29tbWFuZCwgb3IgYnkg YSBsYXRlciBjb21tYW5kIGluIHRoZSBjdXJyZW50CisJCQkgKiB0cmFuc2FjdGlvbi4gIFdlICpt dXN0KiBpZ25vcmUgdGhlIHR1cGxlIGluIHRoZSBmb3JtZXIKKwkJCSAqIGNhc2UsIHNvIGFzIHRv IGF2b2lkIHRoZSAiSGFsbG93ZWVuIHByb2JsZW0iIG9mIHJlcGVhdGVkCisJCQkgKiB1cGRhdGUg YXR0ZW1wdHMuICBJbiB0aGUgbGF0dGVyIGNhc2UgaXQgbWlnaHQgYmUgc2Vuc2libGUKKwkJCSAq IHRvIGZldGNoIHRoZSB1cGRhdGVkIHR1cGxlIGluc3RlYWQsIGJ1dCBkb2luZyBzbyB3b3VsZAor CQkJICogcmVxdWlyZSBjaGFuZ2luZyBoZWFwX3VwZGF0ZSBhbmQgaGVhcF9kZWxldGUgdG8gbm90 CisJCQkgKiBjb21wbGFpbiBhYm91dCB1cGRhdGluZyAiaW52aXNpYmxlIiB0dXBsZXMsIHdoaWNo IHNlZW1zCisJCQkgKiBwcmV0dHkgc2NhcnkgKHRhYmxlX3R1cGxlX2xvY2sgd2lsbCBub3QgY29t cGxhaW4sIGJ1dCBmZXcKKwkJCSAqIGNhbGxlcnMgZXhwZWN0IFRNX0ludmlzaWJsZSwgYW5kIHdl J3JlIG5vdCBvbmUgb2YgdGhlbSkuIFNvCisJCQkgKiBmb3Igbm93LCB0cmVhdCB0aGUgdHVwbGUg YXMgZGVsZXRlZCBhbmQgZG8gbm90IHByb2Nlc3MuCisJCQkgKi8KKwkJCXJldHVybiBmYWxzZTsK KworCQljYXNlIFRNX09rOgorCQkJLyoKKwkJCSAqIEdvdCB0aGUgbG9jayBzdWNjZXNzZnVsbHks IHRoZSBsb2NrZWQgdHVwbGUgc2F2ZWQgaW4KKwkJCSAqIHNsb3QgZm9yIEV2YWxQbGFuUXVhbCwg aWYgYXNrZWQgYnkgdGhlIGNhbGxlci4KKwkJCSAqLworCQkJaWYgKHRtZmQudHJhdmVyc2VkICYm IHR1cGxlX2NvbmN1cnJlbnRseV91cGRhdGVkKQorCQkJCSp0dXBsZV9jb25jdXJyZW50bHlfdXBk YXRlZCA9IHRydWU7CisJCQlicmVhazsKKworCQljYXNlIFRNX1VwZGF0ZWQ6CisJCQlpZiAoSXNv bGF0aW9uVXNlc1hhY3RTbmFwc2hvdCgpKQorCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJCQkoZXJy Y29kZShFUlJDT0RFX1RfUl9TRVJJQUxJWkFUSU9OX0ZBSUxVUkUpLAorCQkJCQkJIGVycm1zZygi Y291bGQgbm90IHNlcmlhbGl6ZSBhY2Nlc3MgZHVlIHRvIGNvbmN1cnJlbnQgdXBkYXRlIikpKTsK KwkJCWVsb2coRVJST1IsICJ1bmV4cGVjdGVkIHRhYmxlX3R1cGxlX2xvY2sgc3RhdHVzOiAldSIs CisJCQkJIHRlc3QpOworCQkJYnJlYWs7CisKKwkJY2FzZSBUTV9EZWxldGVkOgorCQkJaWYgKElz b2xhdGlvblVzZXNYYWN0U25hcHNob3QoKSkKKwkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkJKGVy cmNvZGUoRVJSQ09ERV9UX1JfU0VSSUFMSVpBVElPTl9GQUlMVVJFKSwKKwkJCQkJCSBlcnJtc2co ImNvdWxkIG5vdCBzZXJpYWxpemUgYWNjZXNzIGR1ZSB0byBjb25jdXJyZW50IHVwZGF0ZSIpKSk7 CisJCQkvKiB0dXBsZSB3YXMgZGVsZXRlZCBzbyBkb24ndCByZXR1cm4gaXQgKi8KKwkJCXJldHVy biBmYWxzZTsKKworCQljYXNlIFRNX0ludmlzaWJsZToKKwkJCWVsb2coRVJST1IsICJhdHRlbXB0 ZWQgdG8gbG9jayBpbnZpc2libGUgdHVwbGUiKTsKKwkJCXJldHVybiBmYWxzZTsKKworCQlkZWZh dWx0OgorCQkJZWxvZyhFUlJPUiwgInVucmVjb2duaXplZCB0YWJsZV90dXBsZV9sb2NrIHN0YXR1 czogJXUiLCB0ZXN0KTsKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30K KwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQogICoJCUV4ZWNJbml0TG9ja1Jvd3MKICAqCmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC91dGlscy9hZHQvcmlfdHJpZ2dlcnMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9y aV90cmlnZ2Vycy5jCmluZGV4IDA1OWZjNWViZjYwLi5jZmI4NWI5ZDc1MyAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvdXRpbHMvYWR0L3JpX3RyaWdnZXJzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L3JpX3RyaWdnZXJzLmMKQEAgLTI0LDEyICsyNCwxNSBAQAogI2luY2x1ZGUgInBvc3Rn cmVzLmgiCiAKICNpbmNsdWRlICJhY2Nlc3MvaHR1cF9kZXRhaWxzLmgiCisjaW5jbHVkZSAiYWNj ZXNzL3NrZXkuaCIKICNpbmNsdWRlICJhY2Nlc3Mvc3lzYXR0ci5oIgogI2luY2x1ZGUgImFjY2Vz cy90YWJsZS5oIgogI2luY2x1ZGUgImFjY2Vzcy90YWJsZWFtLmgiCiAjaW5jbHVkZSAiYWNjZXNz L3hhY3QuaCIKKyNpbmNsdWRlICJjYXRhbG9nL2luZGV4LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9w Z19jb2xsYXRpb24uaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2NvbnN0cmFpbnQuaCIKKyNpbmNs dWRlICJjYXRhbG9nL3BnX25hbWVzcGFjZS5oIgogI2luY2x1ZGUgImNvbW1hbmRzL3RyaWdnZXIu aCIKICNpbmNsdWRlICJleGVjdXRvci9leGVjdXRvci5oIgogI2luY2x1ZGUgImV4ZWN1dG9yL3Nw aS5oIgpAQCAtMjM4LDYgKzI0MSwxODggQEAgcGdfbm9yZXR1cm4gc3RhdGljIHZvaWQgcmlfUmVw b3J0VmlvbGF0aW9uKGNvbnN0IFJJX0NvbnN0cmFpbnRJbmZvICpyaWluZm8sCiAJCQkJCQkJCQkJ ICAgVHVwbGVUYWJsZVNsb3QgKnZpb2xhdG9yc2xvdCwgVHVwbGVEZXNjIHR1cGRlc2MsCiAJCQkJ CQkJCQkJICAgaW50IHF1ZXJ5bm8sIGJvb2wgaXNfcmVzdHJpY3QsIGJvb2wgcGFydGdvbmUpOwog CitzdGF0aWMgYm9vbAorcmlfZmFzdHBhdGhfaXNfYXBwbGljYWJsZShjb25zdCBSSV9Db25zdHJh aW50SW5mbyAqcmlpbmZvLCBSZWxhdGlvbiBwa19yZWwpCit7CisJLyoKKwkgKiBQYXJ0aXRpb25l ZCByZWZlcmVuY2VkIHRhYmxlcyBhcmUgc2tpcHBlZCBmb3Igc2ltcGxpY2l0eSwgc2luY2UKKwkg KiB0aGV5IHJlcXVpcmUgcm91dGluZyB0aGUgcHJvYmUgdGhyb3VnaCB0aGUgY29ycmVjdCBwYXJ0 aXRpb24gdXNpbmcKKwkgKiBQYXJ0aXRpb25EaXJlY3RvcnkuCisJICogVGhpcyBjYW4gYmUgYWRk ZWQgbGF0ZXIgYXMgYSBzZXBhcmF0ZSBwYXRjaCBvbmNlIHRoZSBjb3JlIG1lY2hhbmlzbQorCSAq IGlzIHN0YWJsZS4KKwkgKi8KKwlpZiAocGtfcmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lO RF9QQVJUSVRJT05FRF9UQUJMRSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBUZW1wb3Jh bCBmb3JlaWduIGtleXMgdXNlIHJhbmdlIG92ZXJsYXAgYW5kIGNvbnRhaW5tZW50IHNlbWFudGlj cworCSAqICgmJiwgPEAsIHJhbmdlX2FnZygpKSB0aGF0IGluaGVyZW50bHkgaW52b2x2ZSBhZ2dy ZWdhdGlvbiBhbmQKKwkgKiBtdWx0aXBsZS1yb3cgcmVhc29uaW5nLCBzbyB0aGV5IHN0YXkgb24g dGhlIFNQSSBwYXRoLgorCSAqLworCWlmIChyaWluZm8tPmhhc3BlcmlvZCkKKwkJcmV0dXJuIGZh bHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBnZXRfZmtleV91bmlxdWVfaW5kZXgK KyAqICBSZXR1cm5zIHRoZSB1bmlxdWUgaW5kZXggdXNlZCBieSBhIHN1cHBvc2VkbHkgZm9yZWln biBrZXkgY29uc3RyYWludAorICoKKyAqIFhYWCBUaGlzIGlzIHZlcnkgc2ltaWxhciB0byBnZXRf Y29uc3RyYWludF9pbmRleDsgcHJvYmFibHkgdGhleSBzaG91bGQgYmUKKyAqIHVuaWZpZWQuCisg Ki8KK3N0YXRpYyBPaWQKK2dldF9ma2V5X3VuaXF1ZV9pbmRleChPaWQgY29ub2lkKQoreworCU9p ZAkJCXJlc3VsdCA9IEludmFsaWRPaWQ7CisJSGVhcFR1cGxlCXRwOworCisJdHAgPSBTZWFyY2hT eXNDYWNoZTEoQ09OU1RST0lELCBPYmplY3RJZEdldERhdHVtKGNvbm9pZCkpOworCWlmIChIZWFw VHVwbGVJc1ZhbGlkKHRwKSkKKwl7CisJCUZvcm1fcGdfY29uc3RyYWludCBjb250dXAgPSAoRm9y bV9wZ19jb25zdHJhaW50KSBHRVRTVFJVQ1QodHApOworCisJCWlmIChjb250dXAtPmNvbnR5cGUg PT0gQ09OU1RSQUlOVF9GT1JFSUdOKQorCQkJcmVzdWx0ID0gY29udHVwLT5jb25pbmRpZDsKKwkJ UmVsZWFzZVN5c0NhY2hlKHRwKTsKKwl9CisKKwlpZiAoIU9pZElzVmFsaWQocmVzdWx0KSkKKwkJ ZWxvZyhFUlJPUiwgInVuaXF1ZSBpbmRleCBub3QgZm91bmQgZm9yIGZvcmVpZ24ga2V5IGNvbnN0 cmFpbnQgJXUiLAorCQkJIGNvbm9pZCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICog cmlfQ2hlY2tQZXJtaXNzaW9ucworICogICBDaGVjayB0aGF0IHRoZSBuZXcgdXNlciBoYXMgcGVy bWlzc2lvbnMgdG8gbG9vayBpbnRvIHRoZSBzY2hlbWEgb2YKKyAqICAgYW5kIFNFTEVDVCBmcm9t ICdxdWVyeV9yZWwnCisgKgorICogUHJvdmlkZWQgZm9yIG5vbi1TUUwgaW1wbGVtZW50b3JzIG9m IGFuIFJJX1BsYW4uCisgKi8KK3N0YXRpYyB2b2lkCityaV9DaGVja1Blcm1pc3Npb25zKFJlbGF0 aW9uIHF1ZXJ5X3JlbCkKK3sKKwlBY2xSZXN1bHQgYWNscmVzdWx0OworCisJLyogVVNBR0Ugb24g c2NoZW1hLiAqLworCWFjbHJlc3VsdCA9IG9iamVjdF9hY2xjaGVjayhOYW1lc3BhY2VSZWxhdGlv bklkLAorCQkJCQkJCQlSZWxhdGlvbkdldE5hbWVzcGFjZShxdWVyeV9yZWwpLAorCQkJCQkJCQlH ZXRVc2VySWQoKSwgQUNMX1VTQUdFKTsKKwlpZiAoYWNscmVzdWx0ICE9IEFDTENIRUNLX09LKQor CQlhY2xjaGVja19lcnJvcihhY2xyZXN1bHQsIE9CSkVDVF9TQ0hFTUEsCisJCQkJCSAgIGdldF9u YW1lc3BhY2VfbmFtZShSZWxhdGlvbkdldE5hbWVzcGFjZShxdWVyeV9yZWwpKSk7CisKKwkvKiBT RUxFQ1Qgb24gcmVsYXRpb24uICovCisJYWNscmVzdWx0ID0gcGdfY2xhc3NfYWNsY2hlY2soUmVs YXRpb25HZXRSZWxpZChxdWVyeV9yZWwpLCBHZXRVc2VySWQoKSwKKwkJCQkJCQkJICBBQ0xfU0VM RUNUKTsKKwlpZiAoYWNscmVzdWx0ICE9IEFDTENIRUNLX09LKQorCQlhY2xjaGVja19lcnJvcihh Y2xyZXN1bHQsIE9CSkVDVF9UQUJMRSwKKwkJCQkJICAgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUo cXVlcnlfcmVsKSk7Cit9CisKKy8qCisgKiBUaGlzIGNoZWNrcyB0aGF0IHRoZSBpbmRleCBrZXkg b2YgdGhlIHR1cGxlIHNwZWNpZmllZCBpbiAnbmV3X3Nsb3QnIG1hdGNoZXMKKyAqIHRoZSBrZXkg dGhhdCBoYXMgYWxyZWFkeSBiZWVuIGZvdW5kIGluIHRoZSBQSyBpbmRleCByZWxhdGlvbiAnaWR4 cmVsJy4KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGluZGV4IGtleSBvZiB0aGUgdHVwbGUg bWF0Y2hlcyB0aGUgZXhpc3RpbmcgaW5kZXgKKyAqIGtleSwgZmFsc2Ugb3RoZXJ3aXNlLgorICov CitzdGF0aWMgYm9vbAorcmVjaGVja19tYXRjaGVkX3BrX3R1cGxlKFJlbGF0aW9uIGlkeHJlbCwg U2NhbktleURhdGEgKnNrZXlzLAorCQkJCQkJIFR1cGxlVGFibGVTbG90ICpuZXdfc2xvdCkKK3sK KwlJbmRleEluZm8gKmluZGV4SW5mbyA9IEJ1aWxkSW5kZXhJbmZvKGlkeHJlbCk7CisJRGF0dW0J CXZhbHVlc1tJTkRFWF9NQVhfS0VZU107CisJYm9vbAkJaXNudWxsW0lOREVYX01BWF9LRVlTXTsK Kwlib29sCQltYXRjaGVkID0gdHJ1ZTsKKworCS8qIFBLIGluZGV4ZXMgbmV2ZXIgaGF2ZSB0aGVz ZS4gKi8KKwlBc3NlcnQoaW5kZXhJbmZvLT5paV9FeHByZXNzaW9ucyA9PSBOSUwgJiYKKwkJICAg aW5kZXhJbmZvLT5paV9FeGNsdXNpb25PcHMgPT0gTlVMTCk7CisKKwkvKiBGb3JtIHRoZSBpbmRl eCB2YWx1ZXMgYW5kIGlzbnVsbCBmbGFncyBnaXZlbiB0aGUgdGFibGUgdHVwbGUuICovCisJRm9y bUluZGV4RGF0dW0oaW5kZXhJbmZvLCBuZXdfc2xvdCwgTlVMTCwgdmFsdWVzLCBpc251bGwpOwor CWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhJbmZvLT5paV9OdW1JbmRleEtleUF0dHJzOyBpKysp CisJeworCQlTY2FuS2V5RGF0YQkJKnNrZXkgPSAmc2tleXNbaV07CisKKwkJLyogQSBQSyBjb2x1 bW4gY2FuIG5ldmVyIGJlIHNldCB0byBOVUxMLiAqLworCQlBc3NlcnQoIWlzbnVsbFtpXSk7CisJ CWlmICghRGF0dW1HZXRCb29sKEZ1bmN0aW9uQ2FsbDJDb2xsKCZza2V5LT5za19mdW5jLAorCQkJ CQkJCQkJCQlza2V5LT5za19jb2xsYXRpb24sCisJCQkJCQkJCQkJCXNrZXktPnNrX2FyZ3VtZW50 LAorCQkJCQkJCQkJCQl2YWx1ZXNbaV0pKSkKKwkJeworCQkJbWF0Y2hlZCA9IGZhbHNlOworCQkJ YnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gbWF0Y2hlZDsKK30KKworLyoKKyAqIERvZXNuJ3Qg aW5jbHVkZSBhbnkgY2FjaGUgZm9yIG5vdy4KKyAqLworc3RhdGljIHZvaWQKK2J1aWxkX3NjYW5r ZXlzX2Zyb21fY2FjaGUoY29uc3QgUklfQ29uc3RyYWludEluZm8gKnJpaW5mbywKKwkJCQkJCSAg UmVsYXRpb24gcGtfcmVsLCBSZWxhdGlvbiBma19yZWwsCisJCQkJCQkgIFJlbGF0aW9uIGlkeF9y ZWwsIGludCBudW1fcGssCisJCQkJCQkgIERhdHVtICpwa192YWxzLCBjaGFyICpwa19udWxscywK KwkJCQkJCSAgU2NhbktleSBza2V5cykKK3sKKwkvKiBVc2UgUEsgPSBGSyBlcXVhbGl0eSBvcGVy YXRvci4gKi8KKwljb25zdCBPaWQgKmVxX29wcnMgPSByaWluZm8tPnBmX2VxX29wcnM7CisKKwlB c3NlcnQobnVtX3BrID09IHJpaW5mby0+bmtleXMpOworCisJLyoKKwkgKiBNYXkgbmVlZCB0byBj YXN0IGVhY2ggb2YgdGhlIGluZGl2aWR1YWwgdmFsdWVzIG9mIHRoZSBmb3JlaWduIGtleQorCSAq IHRvIHRoZSBjb3JyZXNwb25kaW5nIFBLIGNvbHVtbidzIHR5cGUgaWYgdGhlIGVxdWFsaXR5IG9w ZXJhdG9yCisJICogZGVtYW5kcyBpdC4KKwkgKi8KKwlmb3IgKGludCBpID0gMDsgaSA8IHJpaW5m by0+bmtleXM7IGkrKykKKwl7CisJCWlmIChwa19udWxsc1tpXSAhPSAnbicpCisJCXsKKwkJCU9p ZCAgZXFfb3ByID0gZXFfb3Byc1tpXTsKKwkJCU9pZCAgdHlwZWlkID0gUklBdHRUeXBlKGZrX3Jl bCwgcmlpbmZvLT5ma19hdHRudW1zW2ldKTsKKwkJCVJJX0NvbXBhcmVIYXNoRW50cnkgKmVudHJ5 ID0gcmlfSGFzaENvbXBhcmVPcChlcV9vcHIsIHR5cGVpZCk7CisKKwkJCWlmIChPaWRJc1ZhbGlk KGVudHJ5LT5jYXN0X2Z1bmNfZmluZm8uZm5fb2lkKSkKKwkJCQlwa192YWxzW2ldID0gRnVuY3Rp b25DYWxsMygmZW50cnktPmNhc3RfZnVuY19maW5mbywKKwkJCQkJCQkJCQkgICBwa192YWxzW2ld LAorCQkJCQkJCQkJCSAgIEludDMyR2V0RGF0dW0oLTEpLCAvKiB0eXBtb2QgKi8KKwkJCQkJCQkJ CQkgICBCb29sR2V0RGF0dW0oZmFsc2UpKTsgLyogaW1wbGljaXQgY29lcmNpb24gKi8KKwkJfSBl bHNlIHsKKwkJCUFzc2VydChmYWxzZSk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNldCB1cCBTY2Fu S2V5cyBmb3IgdGhlIGluZGV4IHNjYW4uIFRoaXMgaXMgZXNzZW50aWFsbHkgaG93CisJICogRXhl Y0luZGV4QnVpbGRTY2FuS2V5cygpIHNldHMgdGhlbSB1cC4KKwkgKi8KKwlmb3IgKGludCBpID0g MDsgaSA8IG51bV9wazsgaSsrKQorCXsKKwkJaW50CQlwa2F0dHJubyA9IGkgKyAxOworCQlPaWQJ CWxlZnR0eXBlLAorCQkJCXJpZ2h0dHlwZTsKKwkJT2lkCQlvcGVyYXRvciA9IGVxX29wcnNbaV07 CisJCU9pZAkJb3BmYW1pbHkgPSBpZHhfcmVsLT5yZF9vcGZhbWlseVtpXTsKKwkJaW50ICBzdHJh dDsKKwkJUmVnUHJvY2VkdXJlIHJlZ29wID0gZ2V0X29wY29kZShvcGVyYXRvcik7CisKKwkJZ2V0 X29wX29wZmFtaWx5X3Byb3BlcnRpZXMob3BlcmF0b3IsIG9wZmFtaWx5LCBmYWxzZSwgJnN0cmF0 LAorCQkJCQkJCQkgICAmbGVmdHR5cGUsICZyaWdodHR5cGUpOworCQlTY2FuS2V5RW50cnlJbml0 aWFsaXplKCZza2V5c1tpXSwgMCwgcGthdHRybm8sIHN0cmF0LCByaWdodHR5cGUsCisJCQkJCQkJ ICAgaWR4X3JlbC0+cmRfaW5kY29sbGF0aW9uW2ldLCByZWdvcCwKKwkJCQkJCQkgICBwa192YWxz W2ldKTsKKwl9Cit9CiAKIC8qCiAgKiBSSV9GS2V5X2NoZWNrIC0KQEAgLTM0OSw2ICs1MzQsMTMy IEBAIFJJX0ZLZXlfY2hlY2soVHJpZ2dlckRhdGEgKnRyaWdkYXRhKQogCQkJYnJlYWs7CiAJfQog CisJLyogRmFzdCBwYXRoLCBmb3Igc2ltcGxlIGNhc2VzLCBwcm9iZSB0aGUgdW5pcXVlIGluZGV4 IGRpcmVjdGx5ICovCisJaWYgKHJpX2Zhc3RwYXRoX2lzX2FwcGxpY2FibGUocmlpbmZvLCBwa19y ZWwpKQorCXsKKwkJT2lkCQkJaWR4b2lkOworCQlSZWxhdGlvbglpZHhyZWw7CisJCWludAkJCW51 bV9wazsKKwkJRGF0dW0JCXBrX3ZhbHNbSU5ERVhfTUFYX0tFWVNdOworCQljaGFyCQlwa19udWxs c1tJTkRFWF9NQVhfS0VZU107CisJCVNjYW5LZXlEYXRhCXNrZXlbSU5ERVhfTUFYX0tFWVNdOwor CQlJbmRleFNjYW5EZXNjCXNjYW47CisJCVR1cGxlVGFibGVTbG90ICpvdXRzbG90OworCQlPaWQJ CQkJc2F2ZWRfdXNlcmlkOworCQlpbnQJCQkJc2F2ZWRfc2VjX2NvbnRleHQ7CisJCWJvb2wJCQl0 dXBsZV9jb25jdXJyZW50bHlfdXBkYXRlZDsKKwkJaW50CQkJCXR1cGxlc19wcm9jZXNzZWQgPSAw OworCisJCWVsb2coREVCVUcxLAorCQkJICJSSSBmYXN0cGF0aDogY29uc3RyYWludCBcIiVzXCIg dXNpbmcgZmFzdCBwYXRoIiwKKwkJCSBOYW1lU3RyKHJpaW5mby0+Y29ubmFtZSkpOworCisJCS8q CisJCSAqIEV4dHJhY3QgdGhlIHVuaXF1ZSBrZXkgZnJvbSB0aGUgcHJvdmlkZWQgc2xvdCBhbmQg Y2hvb3NlIHRoZQorCQkgKiBlcXVhbGl0eSBvcGVyYXRvcnMgdG8gdXNlIHdoZW4gc2Nhbm5pbmcg dGhlIGluZGV4IGJlbG93LgorCQkgKi8KKwkJcmlfRXh0cmFjdFZhbHVlcyhma19yZWwsIG5ld3Ns b3QsIHJpaW5mbywgZmFsc2UsIHBrX3ZhbHMsIHBrX251bGxzKTsKKworCQkvKgorCQkgKiBTd2l0 Y2ggdG8gcmVmZXJlbmNlZCB0YWJsZSdzIG93bmVyIHRvIHBlcmZvcm0gdGhlIGJlbG93IG9wZXJh dGlvbnMgYXMuCisJCSAqIFRoaXMgbWF0Y2hlcyB3aGF0IHJpX1BlcmZvcm1DaGVjaygpIGRvZXMu CisJCSAqLworCQlHZXRVc2VySWRBbmRTZWNDb250ZXh0KCZzYXZlZF91c2VyaWQsICZzYXZlZF9z ZWNfY29udGV4dCk7CisJCVNldFVzZXJJZEFuZFNlY0NvbnRleHQoUmVsYXRpb25HZXRGb3JtKHBr X3JlbCktPnJlbG93bmVyLAorCQkJCQkJCSAgIHNhdmVkX3NlY19jb250ZXh0IHwgU0VDVVJJVFlf TE9DQUxfVVNFUklEX0NIQU5HRSB8CisJCQkJCQkJICAgU0VDVVJJVFlfTk9GT1JDRV9STFMpOwor CQlyaV9DaGVja1Blcm1pc3Npb25zKHBrX3JlbCk7CisKKwkJUHVzaEFjdGl2ZVNuYXBzaG90KEdl dFRyYW5zYWN0aW9uU25hcHNob3QoKSk7CisJCUNvbW1hbmRDb3VudGVySW5jcmVtZW50KCk7CisJ CVVwZGF0ZUFjdGl2ZVNuYXBzaG90Q29tbWFuZElkKCk7CisKKwkJLyoKKwkJICogT3BlbiB0aGUg Y29uc3RyYWludCBpbmRleCB0byBiZSBzY2FubmVkLgorCQkgKgorCQkgKiBIYW5kbGUgcGFydGl0 aW9uZWQgJ3BrX3JlbCcgbGF0ZXIsIHNraXBwZWQgaW4gcmlfZmFzdHBhdGhfaXNfYXBwbGljYWJs ZQorCQkgKi8KKwkJaWR4b2lkID0gZ2V0X2ZrZXlfdW5pcXVlX2luZGV4KHJpaW5mby0+Y29uc3Ry YWludF9pZCk7CisJCWlkeHJlbCA9IGluZGV4X29wZW4oaWR4b2lkLCBSb3dTaGFyZUxvY2spOwor CQludW1fcGsgPSBJbmRleFJlbGF0aW9uR2V0TnVtYmVyT2ZLZXlBdHRyaWJ1dGVzKGlkeHJlbCk7 CisKKwkJYnVpbGRfc2NhbmtleXNfZnJvbV9jYWNoZShyaWluZm8sIHBrX3JlbCwgZmtfcmVsLCBp ZHhyZWwsIG51bV9waywKKwkJCQkJCQkJICBwa192YWxzLCBwa19udWxscywgc2tleSk7CisKKwkJ c2NhbiA9IGluZGV4X2JlZ2luc2Nhbihwa19yZWwsIGlkeHJlbCwgR2V0QWN0aXZlU25hcHNob3Qo KSwgTlVMTCwgcmlpbmZvLT5ua2V5cywgMCk7CisKKwkJLyogSW5zdGFsbCB0aGUgU2NhbktleXMu ICovCisJCWluZGV4X3Jlc2NhbihzY2FuLCBza2V5LCBudW1fcGssIE5VTEwsIDApOworCisJCS8q IHNob3VsZCBiZSBjYWNoZWQsIGF2b2lkIGNyZWF0ZSBmb3IgZWFjaCByb3cgKi8KKwkJb3V0c2xv dCA9IHRhYmxlX3Nsb3RfY3JlYXRlKHBrX3JlbCwgTlVMTCk7CisKKwkJLyogTG9vayBmb3IgdGhl IHR1cGxlLCBhbmQgaWYgZm91bmQsIHRyeSB0byBsb2NrIGl0IGluIGtleSBzaGFyZSBtb2RlLiAq LworCQlpZiAoIWluZGV4X2dldG5leHRfc2xvdChzY2FuLCBGb3J3YXJkU2NhbkRpcmVjdGlvbiwg b3V0c2xvdCkpCisJCQlyaV9SZXBvcnRWaW9sYXRpb24ocmlpbmZvLAorCQkJCQkJCSAgIHBrX3Jl bCwgZmtfcmVsLAorCQkJCQkJCSAgIG5ld3Nsb3QsCisJCQkJCQkJICAgTlVMTCwKKwkJCQkJCQkg ICBSSV9QTEFOX0NIRUNLX0xPT0tVUFBLLCBmYWxzZSwgZmFsc2UpOworCisJCS8qCisJCSAqIElm IHdlIGZhaWwgdG8gbG9jayB0aGUgdHVwbGUgZm9yIHdoYXRldmVyIHJlYXNvbiwgYXNzdW1lIGl0 IGRvZXNuJ3QKKwkJICogZXhpc3QuICBJZiB0aGUgbG9ja2VkIHR1cGxlIGlzIHRoZSBvbmUgdGhh dCB3YXMgZm91bmQgdG8gYmUgdXBkYXRlZAorCQkgKiBjb25jdXJyZW50bHksIHJldHJ5LgorCQkg Ki8KKwkJaWYgKEV4ZWNMb2NrVGFibGVUdXBsZShwa19yZWwsICYob3V0c2xvdC0+dHRzX3RpZCks IG91dHNsb3QsCisJCQkJCQkJICAgR2V0QWN0aXZlU25hcHNob3QoKSwKKwkJCQkJCQkgICBHZXRD dXJyZW50Q29tbWFuZElkKGZhbHNlKSwKKwkJCQkJCQkgICBMb2NrVHVwbGVLZXlTaGFyZSwKKwkJ CQkJCQkgICBMb2NrV2FpdEJsb2NrLAorCQkJCQkJCSAgICZ0dXBsZV9jb25jdXJyZW50bHlfdXBk YXRlZCkpCisJCXsKKwkJCWJvb2wJCW1hdGNoZWQgPSB0cnVlOworCisJCQkvKgorCQkJICogSWYg dGhlIG1hdGNoZWQgdGFibGUgdHVwbGUgaGFzIGJlZW4gdXBkYXRlZCwgY2hlY2sgaWYgdGhlIGtl eSBpcworCQkJICogc3RpbGwgdGhlIHNhbWUuCisJCQkgKgorCQkJICogVGhpcyBlbXVsYXRlcyBF dmFsUGxhblF1YWwoKSBpbiB0aGUgZXhlY3V0b3IuCisJCQkgKi8KKwkJCWlmICh0dXBsZV9jb25j dXJyZW50bHlfdXBkYXRlZCAmJgorCQkJCSFyZWNoZWNrX21hdGNoZWRfcGtfdHVwbGUoaWR4cmVs LCBza2V5LCBvdXRzbG90KSkKKwkJCQltYXRjaGVkID0gZmFsc2U7CisKKwkJCWlmIChtYXRjaGVk KQorCQkJCXR1cGxlc19wcm9jZXNzZWQgPSAxOworCQl9CisKKwkJaW5kZXhfZW5kc2NhbihzY2Fu KTsKKwkJRXhlY0Ryb3BTaW5nbGVUdXBsZVRhYmxlU2xvdChvdXRzbG90KTsKKworCQkvKiBEb24n dCByZWxlYXNlIGxvY2sgdW50aWwgY29tbWl0LiAqLworCQlpbmRleF9jbG9zZShpZHhyZWwsIE5v TG9jayk7CisKKwkJUG9wQWN0aXZlU25hcHNob3QoKTsKKworCQkvKiBSZXN0b3JlIFVJRCBhbmQg c2VjdXJpdHkgY29udGV4dCAqLworCQlTZXRVc2VySWRBbmRTZWNDb250ZXh0KHNhdmVkX3VzZXJp ZCwgc2F2ZWRfc2VjX2NvbnRleHQpOworCisJCWlmICh0dXBsZXNfcHJvY2Vzc2VkID09IDEpCisJ CXsKKwkJCXRhYmxlX2Nsb3NlKHBrX3JlbCwgUm93U2hhcmVMb2NrKTsKKwkJCXJldHVybiBQb2lu dGVyR2V0RGF0dW0oTlVMTCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyaV9SZXBvcnRWaW9sYXRp b24ocmlpbmZvLAorCQkJCQkJCSAgIHBrX3JlbCwgZmtfcmVsLAorCQkJCQkJCSAgIG5ld3Nsb3Qs CisJCQkJCQkJICAgTlVMTCwKKwkJCQkJCQkgICBSSV9QTEFOX0NIRUNLX0xPT0tVUFBLLCBmYWxz ZSwgZmFsc2UpOworCQl9CisJfQorCisJLyogRmFsbCBiYWNrIHRvIFNQSSAqLworCWVsb2coREVC VUcxLCAiUkkgZmFzdHBhdGg6IGNvbnN0cmFpbnQgXCIlc1wiIGZhbGxpbmcgYmFjayB0byBTUEki LAorCQkgTmFtZVN0cihyaWluZm8tPmNvbm5hbWUpKTsKKwogCVNQSV9jb25uZWN0KCk7CiAKIAkv KiBGZXRjaCBvciBwcmVwYXJlIGEgc2F2ZWQgcGxhbiBmb3IgdGhlIHJlYWwgY2hlY2sgKi8KQEAg LTMxNjUsOCArMzQ3NiwxNiBAQCByaV9IYXNoQ29tcGFyZU9wKE9pZCBlcV9vcHIsIE9pZCB0eXBl aWQpCiAJCSAqIG1vbWVudCBzaW5jZSB0aGF0IHdpbGwgbmV2ZXIgYmUgZ2VuZXJhdGVkIGZvciBp bXBsaWNpdCBjb2VyY2lvbnMuCiAJCSAqLwogCQlvcF9pbnB1dF90eXBlcyhlcV9vcHIsICZsZWZ0 dHlwZSwgJnJpZ2h0dHlwZSk7Ci0JCUFzc2VydChsZWZ0dHlwZSA9PSByaWdodHR5cGUpOwotCQlp ZiAodHlwZWlkID09IGxlZnR0eXBlKQorCisJCS8qCisJCSAqIERvbid0IG5lZWQgdG8gY2FzdCBp ZiB0aGUgdmFsdWVzIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlCisJCSAqIG9wZXJhdG9yIHdp bGwgYmUgb2YgZXhwZWN0ZWQgb3BlcmFuZCB0eXBlKHMpLiAgVGhlIG9wZXJhdG9yIGNhbiBiZQor CQkgKiBjcm9zcy10eXBlIChzdWNoIGFzIHdoZW4gY2FsbGVkIGJ5IHJpX0xvb2t1cEtleUluUGtS ZWwoKSksIGluIHdoaWNoCisJCSAqIGNhc2UsIHdlIG9ubHkgbmVlZCB0aGUgY2FzdCBpZiB0aGUg cmlnaHQgb3BlcmFuZCB2YWx1ZSBkb2Vzbid0IG1hdGNoCisJCSAqIHRoZSB0eXBlIGV4cGVjdGVk IGJ5IHRoZSBvcGVyYXRvci4KKwkJICovCisJCWlmICgobGVmdHR5cGUgPT0gcmlnaHR0eXBlICYm IHR5cGVpZCA9PSBsZWZ0dHlwZSkgfHwKKwkJCShsZWZ0dHlwZSAhPSByaWdodHR5cGUgJiYgdHlw ZWlkID09IHJpZ2h0dHlwZSkpCiAJCQljYXN0ZnVuYyA9IEludmFsaWRPaWQ7CS8qIHNpbXBsZXN0 IGNhc2UgKi8KIAkJZWxzZQogCQl7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9leGVjdXRvci9l eGVjdXRvci5oIGIvc3JjL2luY2x1ZGUvZXhlY3V0b3IvZXhlY3V0b3IuaAppbmRleCBmYTJiNjU3 ZmIyZi4uODE1NWFhN2FlNzkgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2V4ZWN1dG9yL2V4ZWN1 dG9yLmgKKysrIGIvc3JjL2luY2x1ZGUvZXhlY3V0b3IvZXhlY3V0b3IuaApAQCAtMzAzLDYgKzMw MywxNSBAQCBleHRlcm4gdm9pZCBFeGVjU2h1dGRvd25Ob2RlKFBsYW5TdGF0ZSAqbm9kZSk7CiBl eHRlcm4gdm9pZCBFeGVjU2V0VHVwbGVCb3VuZChpbnQ2NCB0dXBsZXNfbmVlZGVkLCBQbGFuU3Rh dGUgKmNoaWxkX25vZGUpOwogCiAKKy8qCisgKiBmdW5jdGlvbnMgaW4gbm9kZUxvY2tSb3dzLmMK KyAqLworCitleHRlcm4gYm9vbCBFeGVjTG9ja1RhYmxlVHVwbGUoUmVsYXRpb24gcmVsYXRpb24s IEl0ZW1Qb2ludGVyIHRpZCwgVHVwbGVUYWJsZVNsb3QgKnNsb3QsCisJCQkJCQkJICAgU25hcHNo b3Qgc25hcHNob3QsIENvbW1hbmRJZCBjaWQsCisJCQkJCQkJICAgTG9ja1R1cGxlTW9kZSBsb2Nr bW9kZSwgTG9ja1dhaXRQb2xpY3kgd2FpdFBvbGljeSwKKwkJCQkJCQkgICBib29sICp0dXBsZV9j b25jdXJyZW50bHlfdXBkYXRlZCk7CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCQlFeGVjUHJvY05vZGUKICAq CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9pc29sYXRpb24vZXhwZWN0ZWQvZmstY29uY3VycmVudC1w ay11cGQub3V0IGIvc3JjL3Rlc3QvaXNvbGF0aW9uL2V4cGVjdGVkL2ZrLWNvbmN1cnJlbnQtcGst dXBkLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOWJiZWM2Mzhh YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9pc29sYXRpb24vZXhwZWN0ZWQvZmstY29u Y3VycmVudC1way11cGQub3V0CkBAIC0wLDAgKzEsNTggQEAKK1BhcnNlZCB0ZXN0IHNwZWMgd2l0 aCAyIHNlc3Npb25zCisKK3N0YXJ0aW5nIHBlcm11dGF0aW9uOiBzMnVrZXkgczFpIHMyYyBzMWMg czJzIHMxcworc3RlcCBzMnVrZXk6IFVQREFURSBwYXJlbnQgU0VUIHBhcmVudF9rZXkgPSAyIFdI RVJFIHBhcmVudF9rZXkgPSAxOworc3RlcCBzMWk6IElOU0VSVCBJTlRPIGNoaWxkIFZBTFVFUyAo MSwgMSk7IDx3YWl0aW5nIC4uLj4KK3N0ZXAgczJjOiBDT01NSVQ7CitzdGVwIHMxaTogPC4uLiBj b21wbGV0ZWQ+CitFUlJPUjogIGluc2VydCBvciB1cGRhdGUgb24gdGFibGUgImNoaWxkIiB2aW9s YXRlcyBmb3JlaWduIGtleSBjb25zdHJhaW50ICJjaGlsZF9wYXJlbnRfa2V5X2ZrZXkiCitzdGVw IHMxYzogQ09NTUlUOworc3RlcCBzMnM6IFNFTEVDVCAqIEZST00gcGFyZW50OworcGFyZW50X2tl eXxhdXgKKy0tLS0tLS0tLS0rLS0tCisgICAgICAgICAyfGZvbworKDEgcm93KQorCitzdGVwIHMx czogU0VMRUNUICogRlJPTSBjaGlsZDsKK2NoaWxkX2tleXxwYXJlbnRfa2V5CistLS0tLS0tLS0r LS0tLS0tLS0tLQorKDAgcm93cykKKworCitzdGFydGluZyBwZXJtdXRhdGlvbjogczJ1YXV4IHMx aSBzMmMgczFjIHMycyBzMXMKK3N0ZXAgczJ1YXV4OiBVUERBVEUgcGFyZW50IFNFVCBhdXggPSAn YmFyJyBXSEVSRSBwYXJlbnRfa2V5ID0gMTsKK3N0ZXAgczFpOiBJTlNFUlQgSU5UTyBjaGlsZCBW QUxVRVMgKDEsIDEpOworc3RlcCBzMmM6IENPTU1JVDsKK3N0ZXAgczFjOiBDT01NSVQ7CitzdGVw IHMyczogU0VMRUNUICogRlJPTSBwYXJlbnQ7CitwYXJlbnRfa2V5fGF1eAorLS0tLS0tLS0tLSst LS0KKyAgICAgICAgIDF8YmFyCisoMSByb3cpCisKK3N0ZXAgczFzOiBTRUxFQ1QgKiBGUk9NIGNo aWxkOworY2hpbGRfa2V5fHBhcmVudF9rZXkKKy0tLS0tLS0tLSstLS0tLS0tLS0tCisgICAgICAg IDF8ICAgICAgICAgMQorKDEgcm93KQorCisKK3N0YXJ0aW5nIHBlcm11dGF0aW9uOiBzMnVrZXkg czFpIHMydWtleTIgczJjIHMxYyBzMnMgczFzCitzdGVwIHMydWtleTogVVBEQVRFIHBhcmVudCBT RVQgcGFyZW50X2tleSA9IDIgV0hFUkUgcGFyZW50X2tleSA9IDE7CitzdGVwIHMxaTogSU5TRVJU IElOVE8gY2hpbGQgVkFMVUVTICgxLCAxKTsgPHdhaXRpbmcgLi4uPgorc3RlcCBzMnVrZXkyOiBV UERBVEUgcGFyZW50IFNFVCBwYXJlbnRfa2V5ID0gMSBXSEVSRSBwYXJlbnRfa2V5ID0gMjsKK3N0 ZXAgczJjOiBDT01NSVQ7CitzdGVwIHMxaTogPC4uLiBjb21wbGV0ZWQ+CitzdGVwIHMxYzogQ09N TUlUOworc3RlcCBzMnM6IFNFTEVDVCAqIEZST00gcGFyZW50OworcGFyZW50X2tleXxhdXgKKy0t LS0tLS0tLS0rLS0tCisgICAgICAgICAxfGZvbworKDEgcm93KQorCitzdGVwIHMxczogU0VMRUNU ICogRlJPTSBjaGlsZDsKK2NoaWxkX2tleXxwYXJlbnRfa2V5CistLS0tLS0tLS0rLS0tLS0tLS0t LQorICAgICAgICAxfCAgICAgICAgIDEKKygxIHJvdykKKwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qv aXNvbGF0aW9uL2lzb2xhdGlvbl9zY2hlZHVsZSBiL3NyYy90ZXN0L2lzb2xhdGlvbi9pc29sYXRp b25fc2NoZWR1bGUKaW5kZXggMTEyZjA1YTM2NzcuLjEyNGQ0Y2MyODlmIDEwMDY0NAotLS0gYS9z cmMvdGVzdC9pc29sYXRpb24vaXNvbGF0aW9uX3NjaGVkdWxlCisrKyBiL3NyYy90ZXN0L2lzb2xh dGlvbi9pc29sYXRpb25fc2NoZWR1bGUKQEAgLTM3LDYgKzM3LDcgQEAgdGVzdDogZmstcGFydGl0 aW9uZWQtMgogdGVzdDogZmstc25hcHNob3QKIHRlc3Q6IGZrLXNuYXBzaG90LTIKIHRlc3Q6IGZr LXNuYXBzaG90LTMKK3Rlc3Q6IGZrLWNvbmN1cnJlbnQtcGstdXBkCiB0ZXN0OiBzdWJ4aWQtb3Zl cmZsb3cKIHRlc3Q6IGV2YWwtcGxhbi1xdWFsCiB0ZXN0OiBldmFsLXBsYW4tcXVhbC10cmlnZ2Vy CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9pc29sYXRpb24vc3BlY3MvZmstY29uY3VycmVudC1way11 cGQuc3BlYyBiL3NyYy90ZXN0L2lzb2xhdGlvbi9zcGVjcy9may1jb25jdXJyZW50LXBrLXVwZC5z cGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5jYmEwNWE4NWY3OAot LS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2lzb2xhdGlvbi9zcGVjcy9may1jb25jdXJyZW50 LXBrLXVwZC5zcGVjCkBAIC0wLDAgKzEsNDIgQEAKKyMgVGVzdHMgdGhhdCBhbiBJTlNFUlQgb24g cmVmZXJlbmNpbmcgdGFibGUgY29ycmVjdGx5IGZhaWxzIHdoZW4KKyMgdGhlIHJlZmVyZW5jZWQg dmFsdWUgZGlzYXBwZWFycyBkdWUgdG8gYSBjb25jdXJyZW50IHVwZGF0ZQorc2V0dXAKK3sKKyAg Q1JFQVRFIFRBQkxFIHBhcmVudCAoCisgICAgcGFyZW50X2tleSBpbnQgUFJJTUFSWSBLRVksCisg ICAgYXV4ICAgdGV4dCBOT1QgTlVMTAorICApOworCisgIENSRUFURSBUQUJMRSBjaGlsZCAoCisg ICAgY2hpbGRfa2V5IGludCBQUklNQVJZIEtFWSwKKyAgICBwYXJlbnRfa2V5IGludCBOT1QgTlVM TCBSRUZFUkVOQ0VTIHBhcmVudAorICApOworCisgIElOU0VSVCBJTlRPIHBhcmVudCBWQUxVRVMg KDEsICdmb28nKTsKK30KKwordGVhcmRvd24KK3sKKyAgRFJPUCBUQUJMRSBwYXJlbnQsIGNoaWxk OworfQorCitzZXNzaW9uIHMxCitzZXR1cCAgeyBCRUdJTjsgfQorc3RlcCBzMWkgeyBJTlNFUlQg SU5UTyBjaGlsZCBWQUxVRVMgKDEsIDEpOyB9CitzdGVwIHMxYyB7IENPTU1JVDsgfQorc3RlcCBz MXMgeyBTRUxFQ1QgKiBGUk9NIGNoaWxkOyB9CisKK3Nlc3Npb24gczIKK3NldHVwICB7IEJFR0lO OyB9CitzdGVwIHMydWtleSB7IFVQREFURSBwYXJlbnQgU0VUIHBhcmVudF9rZXkgPSAyIFdIRVJF IHBhcmVudF9rZXkgPSAxOyB9CitzdGVwIHMydWF1eCB7IFVQREFURSBwYXJlbnQgU0VUIGF1eCA9 ICdiYXInIFdIRVJFIHBhcmVudF9rZXkgPSAxOyB9CitzdGVwIHMydWtleTIgeyBVUERBVEUgcGFy ZW50IFNFVCBwYXJlbnRfa2V5ID0gMSBXSEVSRSBwYXJlbnRfa2V5ID0gMjsgfQorc3RlcCBzMmMg eyBDT01NSVQ7IH0KK3N0ZXAgczJzIHsgU0VMRUNUICogRlJPTSBwYXJlbnQ7IH0KKworIyBmYWls CitwZXJtdXRhdGlvbiBzMnVrZXkgczFpIHMyYyBzMWMgczJzIHMxcworIyBvaworcGVybXV0YXRp b24gczJ1YXV4IHMxaSBzMmMgczFjIHMycyBzMXMKKyMgb2sKK3Blcm11dGF0aW9uIHMydWtleSBz MWkgczJ1a2V5MiBzMmMgczFjIHMycyBzMXMKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvZm9yZWlnbl9rZXkub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9mb3Jl aWduX2tleS5vdXQKaW5kZXggN2Y5ZTBlYmI4MmQuLmViN2QzOTNlYTI1IDEwMDY0NAotLS0gYS9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2ZvcmVpZ25fa2V5Lm91dAorKysgYi9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL2ZvcmVpZ25fa2V5Lm91dApAQCAtMzcwLDYgKzM3MCw1MyBAQCBTRUxF Q1QgKiBGUk9NIFBLVEFCTEU7CiBEUk9QIFRBQkxFIEZLVEFCTEU7CiBEUk9QIFRBQkxFIFBLVEFC TEU7CiAtLQorLS0gQ2hlY2sgUkxTCistLQorQ1JFQVRFIFRBQkxFIFBLVEFCTEUgKCBwdGVzdDEg aW50IFBSSU1BUlkgS0VZLCBwdGVzdDIgdGV4dCApOworQ1JFQVRFIFRBQkxFIEZLVEFCTEUgKCBm dGVzdDEgaW50IFJFRkVSRU5DRVMgUEtUQUJMRSwgZnRlc3QyIGludCApOworLS0gSW5zZXJ0IHRl c3QgZGF0YSBpbnRvIFBLVEFCTEUKK0lOU0VSVCBJTlRPIFBLVEFCTEUgVkFMVUVTICgxLCAnVGVz dDEnKTsKK0lOU0VSVCBJTlRPIFBLVEFCTEUgVkFMVUVTICgyLCAnVGVzdDInKTsKK0lOU0VSVCBJ TlRPIFBLVEFCTEUgVkFMVUVTICgzLCAnVGVzdDMnKTsKKy0tIEdyYW50IHByaXZpbGVnZXMgb24g UEtUQUJMRS9GS1RBQkxFIHRvIHVzZXIgcmVncmVzc19mb3JlaWduX2tleV91c2VyCitDUkVBVEUg VVNFUiByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXIgTk9MT0dJTjsKK0dSQU5UIFNFTEVDVCBPTiBQ S1RBQkxFIFRPIHJlZ3Jlc3NfZm9yZWlnbl9rZXlfdXNlcjsKK0dSQU5UIFNFTEVDVCwgSU5TRVJU IE9OIEZLVEFCTEUgVE8gcmVncmVzc19mb3JlaWduX2tleV91c2VyOworLS0gRW5hYmxlIFJMUyBv biBQS1RBQkxFIGFuZCBDcmVhdGUgcG9saWNpZXMKK0FMVEVSIFRBQkxFIFBLVEFCTEUgRU5BQkxF IFJPVyBMRVZFTCBTRUNVUklUWTsKK0NSRUFURSBQT0xJQ1kgcGt0YWJsZV92aWV3X29kZF9wb2xp Y3kgT04gUEtUQUJMRSBUTyByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXIgVVNJTkcgKHB0ZXN0MSAl IDIgPSAxKTsKK0FMVEVSIFRBQkxFIFBLVEFCTEUgT1dORVIgdG8gcmVncmVzc19mb3JlaWduX2tl eV91c2VyOworU0VUIFJPTEUgcmVncmVzc19mb3JlaWduX2tleV91c2VyOworSU5TRVJUIElOVE8g RktUQUJMRSBWQUxVRVMgKDMsIDUpOworSU5TRVJUIElOVE8gRktUQUJMRSBWQUxVRVMgKDIsIDUp OyAtLSBzdWNjZXNzLCBSRUZFUkVOQ0VTIGFyZSBub3Qgc3ViamVjdCB0byByb3cgc2VjdXJpdHkK K1JFU0VUIFJPTEU7CitEUk9QIFRBQkxFIEZLVEFCTEU7CitEUk9QIFRBQkxFIFBLVEFCTEU7CitE Uk9QIFVTRVIgcmVncmVzc19mb3JlaWduX2tleV91c2VyOworLS0KKy0tIENoZWNrIEFDTAorLS0K K0NSRUFURSBUQUJMRSBQS1RBQkxFICggcHRlc3QxIGludCBQUklNQVJZIEtFWSwgcHRlc3QyIHRl eHQgKTsKK0NSRUFURSBUQUJMRSBGS1RBQkxFICggZnRlc3QxIGludCBSRUZFUkVOQ0VTIFBLVEFC TEUsIGZ0ZXN0MiBpbnQgKTsKKy0tIEluc2VydCB0ZXN0IGRhdGEgaW50byBQS1RBQkxFCitJTlNF UlQgSU5UTyBQS1RBQkxFIFZBTFVFUyAoMSwgJ1Rlc3QxJyk7CitJTlNFUlQgSU5UTyBQS1RBQkxF IFZBTFVFUyAoMiwgJ1Rlc3QyJyk7CitJTlNFUlQgSU5UTyBQS1RBQkxFIFZBTFVFUyAoMywgJ1Rl c3QzJyk7CistLSBHcmFudCB1c2FnZSBvbiBQS1RBQkxFIHRvIHVzZXIgcmVncmVzc19mb3JlaWdu X2tleV91c2VyCitDUkVBVEUgVVNFUiByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXIgTk9MT0dJTjsK K0dSQU5UIFNFTEVDVCBPTiBQS1RBQkxFIFRPIHJlZ3Jlc3NfZm9yZWlnbl9rZXlfdXNlcjsKK0FM VEVSIFRBQkxFIFBLVEFCTEUgT1dORVIgdG8gcmVncmVzc19mb3JlaWduX2tleV91c2VyOworLS0g SW5zZXJ0aW5nIGludG8gRktUQUJMRSBzaG91bGQgd29yaworSU5TRVJUIElOVE8gRktUQUJMRSBW QUxVRVMgKDMsIDUpOworLS0gUmV2b2tlIHVzYWdlIG9uIFBLVEFCTEUgZnJvbSB1c2VyIHJlZ3Jl c3NfZm9yZWlnbl9rZXlfdXNlcgorUkVWT0tFIFNFTEVDVCBPTiBQS1RBQkxFIEZST00gcmVncmVz c19mb3JlaWduX2tleV91c2VyOworLS0gSW5zZXJ0aW5nIGludG8gRktUQUJMRSBzaG91bGQgZmFp bAorSU5TRVJUIElOVE8gRktUQUJMRSBWQUxVRVMgKDIsIDYpOworRVJST1I6ICBwZXJtaXNzaW9u IGRlbmllZCBmb3IgdGFibGUgcGt0YWJsZQorRFJPUCBUQUJMRSBGS1RBQkxFOworRFJPUCBUQUJM RSBQS1RBQkxFOworRFJPUCBVU0VSIHJlZ3Jlc3NfZm9yZWlnbl9rZXlfdXNlcjsKKy0tCiAtLSBD aGVjayBpbml0aWFsIGNoZWNrIHVwb24gQUxURVIgVEFCTEUKIC0tCiBDUkVBVEUgVEFCTEUgUEtU QUJMRSAoIHB0ZXN0MSBpbnQsIHB0ZXN0MiBpbnQsIFBSSU1BUlkgS0VZKHB0ZXN0MSwgcHRlc3Qy KSApOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZm9yZWlnbl9rZXkuc3FsIGIv c3JjL3Rlc3QvcmVncmVzcy9zcWwvZm9yZWlnbl9rZXkuc3FsCmluZGV4IDRhNjE3MmI4ZTU2Li40 YjIxOTgzNDhkMiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZm9yZWlnbl9rZXku c3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2ZvcmVpZ25fa2V5LnNxbApAQCAtMjQyLDYg KzI0Miw3MCBAQCBTRUxFQ1QgKiBGUk9NIFBLVEFCTEU7CiBEUk9QIFRBQkxFIEZLVEFCTEU7CiBE Uk9QIFRBQkxFIFBLVEFCTEU7CiAKKy0tCistLSBDaGVjayBSTFMKKy0tCitDUkVBVEUgVEFCTEUg UEtUQUJMRSAoIHB0ZXN0MSBpbnQgUFJJTUFSWSBLRVksIHB0ZXN0MiB0ZXh0ICk7CitDUkVBVEUg VEFCTEUgRktUQUJMRSAoIGZ0ZXN0MSBpbnQgUkVGRVJFTkNFUyBQS1RBQkxFLCBmdGVzdDIgaW50 ICk7CisKKy0tIEluc2VydCB0ZXN0IGRhdGEgaW50byBQS1RBQkxFCitJTlNFUlQgSU5UTyBQS1RB QkxFIFZBTFVFUyAoMSwgJ1Rlc3QxJyk7CitJTlNFUlQgSU5UTyBQS1RBQkxFIFZBTFVFUyAoMiwg J1Rlc3QyJyk7CitJTlNFUlQgSU5UTyBQS1RBQkxFIFZBTFVFUyAoMywgJ1Rlc3QzJyk7CisKKy0t IEdyYW50IHByaXZpbGVnZXMgb24gUEtUQUJMRS9GS1RBQkxFIHRvIHVzZXIgcmVncmVzc19mb3Jl aWduX2tleV91c2VyCitDUkVBVEUgVVNFUiByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXIgTk9MT0dJ TjsKK0dSQU5UIFNFTEVDVCBPTiBQS1RBQkxFIFRPIHJlZ3Jlc3NfZm9yZWlnbl9rZXlfdXNlcjsK K0dSQU5UIFNFTEVDVCwgSU5TRVJUIE9OIEZLVEFCTEUgVE8gcmVncmVzc19mb3JlaWduX2tleV91 c2VyOworCistLSBFbmFibGUgUkxTIG9uIFBLVEFCTEUgYW5kIENyZWF0ZSBwb2xpY2llcworQUxU RVIgVEFCTEUgUEtUQUJMRSBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOworQ1JFQVRFIFBPTElD WSBwa3RhYmxlX3ZpZXdfb2RkX3BvbGljeSBPTiBQS1RBQkxFIFRPIHJlZ3Jlc3NfZm9yZWlnbl9r ZXlfdXNlciBVU0lORyAocHRlc3QxICUgMiA9IDEpOworCitBTFRFUiBUQUJMRSBQS1RBQkxFIE9X TkVSIHRvIHJlZ3Jlc3NfZm9yZWlnbl9rZXlfdXNlcjsKKworU0VUIFJPTEUgcmVncmVzc19mb3Jl aWduX2tleV91c2VyOworCitJTlNFUlQgSU5UTyBGS1RBQkxFIFZBTFVFUyAoMywgNSk7CitJTlNF UlQgSU5UTyBGS1RBQkxFIFZBTFVFUyAoMiwgNSk7IC0tIHN1Y2Nlc3MsIFJFRkVSRU5DRVMgYXJl IG5vdCBzdWJqZWN0IHRvIHJvdyBzZWN1cml0eQorCitSRVNFVCBST0xFOworCitEUk9QIFRBQkxF IEZLVEFCTEU7CitEUk9QIFRBQkxFIFBLVEFCTEU7CitEUk9QIFVTRVIgcmVncmVzc19mb3JlaWdu X2tleV91c2VyOworCistLQorLS0gQ2hlY2sgQUNMCistLQorQ1JFQVRFIFRBQkxFIFBLVEFCTEUg KCBwdGVzdDEgaW50IFBSSU1BUlkgS0VZLCBwdGVzdDIgdGV4dCApOworQ1JFQVRFIFRBQkxFIEZL VEFCTEUgKCBmdGVzdDEgaW50IFJFRkVSRU5DRVMgUEtUQUJMRSwgZnRlc3QyIGludCApOworCist LSBJbnNlcnQgdGVzdCBkYXRhIGludG8gUEtUQUJMRQorSU5TRVJUIElOVE8gUEtUQUJMRSBWQUxV RVMgKDEsICdUZXN0MScpOworSU5TRVJUIElOVE8gUEtUQUJMRSBWQUxVRVMgKDIsICdUZXN0Micp OworSU5TRVJUIElOVE8gUEtUQUJMRSBWQUxVRVMgKDMsICdUZXN0MycpOworCistLSBHcmFudCB1 c2FnZSBvbiBQS1RBQkxFIHRvIHVzZXIgcmVncmVzc19mb3JlaWduX2tleV91c2VyCitDUkVBVEUg VVNFUiByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXIgTk9MT0dJTjsKK0dSQU5UIFNFTEVDVCBPTiBQ S1RBQkxFIFRPIHJlZ3Jlc3NfZm9yZWlnbl9rZXlfdXNlcjsKKworQUxURVIgVEFCTEUgUEtUQUJM RSBPV05FUiB0byByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXI7CisKKy0tIEluc2VydGluZyBpbnRv IEZLVEFCTEUgc2hvdWxkIHdvcmsKK0lOU0VSVCBJTlRPIEZLVEFCTEUgVkFMVUVTICgzLCA1KTsK KworLS0gUmV2b2tlIHVzYWdlIG9uIFBLVEFCTEUgZnJvbSB1c2VyIHJlZ3Jlc3NfZm9yZWlnbl9r ZXlfdXNlcgorUkVWT0tFIFNFTEVDVCBPTiBQS1RBQkxFIEZST00gcmVncmVzc19mb3JlaWduX2tl eV91c2VyOworCistLSBJbnNlcnRpbmcgaW50byBGS1RBQkxFIHNob3VsZCBmYWlsCitJTlNFUlQg SU5UTyBGS1RBQkxFIFZBTFVFUyAoMiwgNik7CisKK0RST1AgVEFCTEUgRktUQUJMRTsKK0RST1Ag VEFCTEUgUEtUQUJMRTsKKworRFJPUCBVU0VSIHJlZ3Jlc3NfZm9yZWlnbl9rZXlfdXNlcjsKKwog LS0KIC0tIENoZWNrIGluaXRpYWwgY2hlY2sgdXBvbiBBTFRFUiBUQUJMRQogLS0KLS0gCjIuNDEu MAoK --000000000000b5b8e40644ddd176--