Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tJTZO-003FKt-Bk for pgsql-hackers@arkaria.postgresql.org; Fri, 06 Dec 2024 08:20:14 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tJTYN-00Ajpq-Ob for pgsql-hackers@arkaria.postgresql.org; Fri, 06 Dec 2024 08:19:12 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tJTYN-00AjpZ-CG for pgsql-hackers@lists.postgresql.org; Fri, 06 Dec 2024 08:19:12 +0000 Received: from mail-pg1-x52e.google.com ([2607:f8b0:4864:20::52e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1tJTYL-001KHY-DD for pgsql-hackers@postgresql.org; Fri, 06 Dec 2024 08:19:11 +0000 Received: by mail-pg1-x52e.google.com with SMTP id 41be03b00d2f7-7fcfb7db9bfso1441789a12.1 for ; Fri, 06 Dec 2024 00:19:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733473147; x=1734077947; 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=avopHmaHkBVs2fyOsTExIFpIlYaZE+SY2f83xJ7mSrs=; b=V3/0oU7NAlL4dIVclASlydl09SfmdSPsDTPxmXKQjZIQrjhBkBy+jUIT8uqjQw3ma3 SEzLH5wVsTvlDXC126NmkdFoIs29osK4pIyMvkInuEJxACH4/uPxDeOmqk/btTRjagU1 GkWo96+F8QClzWWPhpkDqRgdioueq2ox6BoZl9Q3IEKLaAhShUDwMioGclycbLkBqXme OoLOGOJxe5HzLM0YEwCF43FHlJ3XNycGQBWMzORKzmOVzHqdoZaKpehbe3F7YwdpmPY9 DoKLpqf/PNZ27XemR9nqMsjpOI8LE08nDAp3LDFJ2wc9cIgBUFwoHaf5LRqP1Dbn3/pX bM/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733473147; x=1734077947; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=avopHmaHkBVs2fyOsTExIFpIlYaZE+SY2f83xJ7mSrs=; b=uVjrJ1lmrFZn0wbsXPUaSnCy4WzBgqZiqa3hzhJd/XkAuy0cqYEXxTBNgFYOf4FmYt r8TUVMgvq08I1K43mGoMVYowNQqXZq1QC+tRAb6cb0/MlSPhtpXtf5DrTbJKW8mtBCTd r7qOppJ1o+/oxmFTG5/sdtwTpfZxvgU+1xyzNy2aCK+EQ1kcCrPV9vZO0FVNz5uKJehw Dl11VMbGwWCjkMxRMbOu2kT3P6p30bu1LzyJNpMiPDG1Ool13PDRqxzUEp1zNvtaI7C+ 79iqEpNnOw78mCw50lEDwk3cz8hitHmDrSls2sr9uKOj42v7gTjCkM/Sv3qYU1zxfr4I YiXw== X-Forwarded-Encrypted: i=1; AJvYcCXeP8R4KgOsGBxeRjxy5gm3XAsWDNqy/BKFX6jYn4DZb+AkKODYrotVqgBdNZN1qDe/WNVmvvweRpbowk5E@postgresql.org X-Gm-Message-State: AOJu0YzwewuYrNTZiU9lnTJQ5N4d+BSyB8BqOIdNrBmzDfC3ep2gLA0V 2pdPNZFEqaJLzOWgkzyNOxdTAjgkVIYAFrUVv5Xa0XDegbFMhW0iFiHf3xf4ySI7QKkhT1ANzQr 9y/N1IXGng4V90kgKFdEGxEWjFZU= X-Gm-Gg: ASbGncvN08MIOAkEbExjVvk5qpfgD6Th+qY+66gEo2yLQWAzpyiCFoaMQ2ZLwty9+K4 MxAcVKILxl6vpyaUFxneh3ow+P+ZmkOJkTKHSoZbdRsLNhWzGp3JKI5h8oTVzNJ4j X-Google-Smtp-Source: AGHT+IFEfOOz8d+8b0ln/+47oi9ksnFtIDjjtZ03SaKqSv92U/CafeVt1NbjNnIusBn7BRHeL8K54QsK+lOThGCGBRM= X-Received: by 2002:a17:90b:5205:b0:2ee:96a5:721e with SMTP id 98e67ed59e1d1-2ef69e154c8mr4248473a91.12.1733473147422; Fri, 06 Dec 2024 00:19:07 -0800 (PST) MIME-Version: 1.0 References: <54c35fb9-da3a-4754-ab8c-46ed0b612465@vondra.me> <684c70d7-180e-461d-9377-600c2db581ba@vondra.me> In-Reply-To: From: Amit Langote Date: Fri, 6 Dec 2024 17:18:47 +0900 Message-ID: Subject: Re: generic plans and "initial" pruning To: Tomas Vondra Cc: Robert Haas , Alvaro Herrera , Andres Freund , Daniel Gustafsson , David Rowley , PostgreSQL Hackers , Thom Brown , Tom Lane Content-Type: multipart/mixed; boundary="0000000000002e418a062895ab0c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000002e418a062895ab0c Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Dec 5, 2024 at 11:07=E2=80=AFPM Tomas Vondra wrot= e: > On 12/5/24 12:28, Amit Langote wrote: > > On Thu, Dec 5, 2024 at 3:53=E2=80=AFPM Amit Langote wrote: > >> On Thu, Dec 5, 2024 at 2:20=E2=80=AFAM Tomas Vondra = wrote: > >>> Sure, changing the APIs is allowed, I'm just wondering if maybe there > >>> might be a way to not have this issue, or at least notice the missing > >>> call early. > >>> > >>> I haven't tried, wouldn't it be better to modify ExecutorStart() to d= o > >>> the retries internally? I mean, the extensions wouldn't need to check= if > >>> the plan is still valid, ExecutorStart() would take care of that. Yea= h, > >>> it might need some new arguments, but that's more obvious. > >> > >> One approach could be to move some code from standard_ExecutorStart() > >> into ExecutorStart(). Specifically, the code responsible for setting > >> up enough state in the EState to perform ExecDoInitialPruning(), which > >> takes locks that might invalidate the plan. If the plan does become > >> invalid, the hook and standard_ExecutorStart() are not called. > >> Instead, the caller, ExecutorStartExt() in this case, creates a new > >> plan. > >> > >> This avoids the need to add ExecPlanStillValid() checks anywhere, > >> whether in core or extension code. However, it does mean accessing the > >> PlannedStmt earlier than InitPlan(), but the current placement of the > >> code is not exactly set in stone. > > > > I tried this approach and found that it essentially disables testing > > of this patch using the delay_execution module, which relies on the > > ExecutorStart_hook(). The way the testing works is that the hook in > > delay_execution.c pauses the execution of a cached plan to allow a > > concurrent session to drop an index referenced in the plan. When > > unpaused, execution initialization resumes by calling > > standard_ExecutorStart(). At this point, obtaining the lock on the > > partition whose index has been dropped invalidates the plan, which the > > hook detects and reports. It then also reports the successful > > re-execution of an updated plan that no longer references the dropped > > index. Hmm. > > > > It's not clear to me why the change disables this testing, and I can't > try without a patch. Could you explain? Sorry, PFA the delta patch for the change I described above. It applies on top of v58 series of patches that I posted yesterday. You'll notice that delay_execution test fails if you apply and do check-world. As for how the change breaks the testing, here is a before and after of the flow of a isolation test in src/test/modules/delay_execution/specs/cached-plan-inval.spec (s1 is the session used to run a cached plan, s2 to perform concurrent DDL that invalidates the plan): * Before (working): 1. s2 takes advisory lock 2. s1 runs cached plan -> goes to ExecutorStart_hook -> waits for the advisory lock 3. s2 drops an index referenced in the plan 4. s2 unlocks advisory lock 5. s1 locks unpruned partitions -> detects plan invalidation due to dropped index. * After (stops working because initial pruning and locking are done before calling ExecutorStart_hook): 1. s2 takes advisory lock 2. s1 runs cached plan -> locks unpruned partitions -> goes to ExecutorStart_hook to get advisory lock -> waits for advisory lock 3. s2 drops an index referenced in the plan -> waits for lock on the unpruned partition -> deadlock! One idea I had after sending the email yesterday is to introduce ExecutorStartCachedPlan_hook for the advisory lock based waiting. ExecutorStartCachedPlan() is the new function that you will find in v58-0004 that wraps ExecutorStart() to handle plan invalidation. This new hook would be called before ExecutorStartCachedPlan() calls ExecutorStart(), so the original testing flow can still work. Another idea might be to use injection points infra to introduce the wait instead of the combination of a executor hook and advisory lock. --=20 Thanks, Amit Langote --0000000000002e418a062895ab0c Content-Type: application/octet-stream; name="pruning-in-ExecutorStart.diff" Content-Disposition: attachment; filename="pruning-in-ExecutorStart.diff" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m4ch3frr0 ZGlmZiAtLWdpdCBhL2NvbnRyaWIvYXV0b19leHBsYWluL2F1dG9fZXhwbGFpbi5jIGIvY29udHJp Yi9hdXRvX2V4cGxhaW4vYXV0b19leHBsYWluLmMKaW5kZXggOGI1ZWFmM2VmMy4uNjIzYTY3NGY5 OSAxMDA2NDQKLS0tIGEvY29udHJpYi9hdXRvX2V4cGxhaW4vYXV0b19leHBsYWluLmMKKysrIGIv Y29udHJpYi9hdXRvX2V4cGxhaW4vYXV0b19leHBsYWluLmMKQEAgLTI5OCwxMCArMjk4LDYgQEAg ZXhwbGFpbl9FeGVjdXRvclN0YXJ0KFF1ZXJ5RGVzYyAqcXVlcnlEZXNjLCBpbnQgZWZsYWdzKQog CWVsc2UKIAkJc3RhbmRhcmRfRXhlY3V0b3JTdGFydChxdWVyeURlc2MsIGVmbGFncyk7CiAKLQkv KiBUaGUgcGxhbiBtYXkgaGF2ZSBiZWNvbWUgaW52YWxpZCBkdXJpbmcgc3RhbmRhcmRfRXhlY3V0 b3JTdGFydCgpICovCi0JaWYgKCFFeGVjUGxhblN0aWxsVmFsaWQocXVlcnlEZXNjLT5lc3RhdGUp KQotCQlyZXR1cm47Ci0KIAlpZiAoYXV0b19leHBsYWluX2VuYWJsZWQoKSkKIAl7CiAJCS8qCmRp ZmYgLS1naXQgYS9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9wZ19zdGF0X3N0YXRlbWVudHMu YyBiL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jCmluZGV4 IGIxMTY5MWFlMjYuLjQ5YzY1N2IzZTAgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0 ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jCisrKyBiL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1l bnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jCkBAIC05OTQsMTAgKzk5NCw2IEBAIHBnc3NfRXhlY3V0 b3JTdGFydChRdWVyeURlc2MgKnF1ZXJ5RGVzYywgaW50IGVmbGFncykKIAllbHNlCiAJCXN0YW5k YXJkX0V4ZWN1dG9yU3RhcnQocXVlcnlEZXNjLCBlZmxhZ3MpOwogCi0JLyogVGhlIHBsYW4gbWF5 IGhhdmUgYmVjb21lIGludmFsaWQgZHVyaW5nIHN0YW5kYXJkX0V4ZWN1dG9yU3RhcnQoKSAqLwot CWlmICghRXhlY1BsYW5TdGlsbFZhbGlkKHF1ZXJ5RGVzYy0+ZXN0YXRlKSkKLQkJcmV0dXJuOwot CiAJLyoKIAkgKiBJZiBxdWVyeSBoYXMgcXVlcnlJZCB6ZXJvLCBkb24ndCB0cmFjayBpdC4gIFRo aXMgcHJldmVudHMgZG91YmxlCiAJICogY291bnRpbmcgb2Ygb3B0aW1pemFibGUgc3RhdGVtZW50 cyB0aGF0IGFyZSBkaXJlY3RseSBjb250YWluZWQgaW4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L2V4ZWN1dG9yL2V4ZWNNYWluLmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjTWFpbi5jCmlu ZGV4IDk1NDNkOTQ5MGMuLjE4NzU4Mjg3YmYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1 dG9yL2V4ZWNNYWluLmMKKysrIGIvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY01haW4uYwpAQCAt MTIzLDYgKzEyMywxNiBAQCBzdGF0aWMgdm9pZCBFdmFsUGxhblF1YWxTdGFydChFUFFTdGF0ZSAq ZXBxc3RhdGUsIFBsYW4gKnBsYW5UcmVlKTsKIHZvaWQKIEV4ZWN1dG9yU3RhcnQoUXVlcnlEZXNj ICpxdWVyeURlc2MsIGludCBlZmxhZ3MpCiB7CisJRVN0YXRlCSAgICplc3RhdGU7CisJTWVtb3J5 Q29udGV4dCBvbGRjb250ZXh0OworCVBsYW5uZWRTdG10ICpwbGFubmVkc3RtdCA9IHF1ZXJ5RGVz Yy0+cGxhbm5lZHN0bXQ7CisJTGlzdAkgICAqcmFuZ2VUYWJsZSA9IHBsYW5uZWRzdG10LT5ydGFi bGU7CisJQ2FjaGVkUGxhbiAqY2FjaGVkcGxhbiA9IHF1ZXJ5RGVzYy0+Y3BsYW47CisKKwkvKiBz YW5pdHkgY2hlY2tzOiBxdWVyeURlc2MgbXVzdCBub3QgYmUgc3RhcnRlZCBhbHJlYWR5ICovCisJ QXNzZXJ0KHF1ZXJ5RGVzYyAhPSBOVUxMKTsKKwlBc3NlcnQocXVlcnlEZXNjLT5lc3RhdGUgPT0g TlVMTCk7CisKIAkvKgogCSAqIEluIHNvbWUgY2FzZXMgKGUuZy4gYW4gRVhFQ1VURSBzdGF0ZW1l bnQgb3IgYW4gZXhlY3V0ZSBtZXNzYWdlIHdpdGggdGhlCiAJICogZXh0ZW5kZWQgcXVlcnkgcHJv dG9jb2wpIHRoZSBxdWVyeV9pZCB3b24ndCBiZSByZXBvcnRlZCwgc28gZG8gaXQgbm93LgpAQCAt MTMzLDYgKzE0MywxMTcgQEAgRXhlY3V0b3JTdGFydChRdWVyeURlc2MgKnF1ZXJ5RGVzYywgaW50 IGVmbGFncykKIAkgKi8KIAlwZ3N0YXRfcmVwb3J0X3F1ZXJ5X2lkKHF1ZXJ5RGVzYy0+cGxhbm5l ZHN0bXQtPnF1ZXJ5SWQsIGZhbHNlKTsKIAorCS8qCisJICogQnVpbGQgRVN0YXRlLCBzd2l0Y2gg aW50byBwZXItcXVlcnkgbWVtb3J5IGNvbnRleHQgZm9yIHN0YXJ0dXAuCisJICovCisJZXN0YXRl ID0gQ3JlYXRlRXhlY3V0b3JTdGF0ZSgpOworCXF1ZXJ5RGVzYy0+ZXN0YXRlID0gZXN0YXRlOwor CisJb2xkY29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhlc3RhdGUtPmVzX3F1ZXJ5X2N4 dCk7CisKKwkvKgorCSAqIEZpbGwgaW4gZXh0ZXJuYWwgcGFyYW1ldGVycywgaWYgYW55LCBmcm9t IHF1ZXJ5RGVzYzsgYW5kIGFsbG9jYXRlCisJICogd29ya3NwYWNlIGZvciBpbnRlcm5hbCBwYXJh bWV0ZXJzCisJICovCisJZXN0YXRlLT5lc19wYXJhbV9saXN0X2luZm8gPSBxdWVyeURlc2MtPnBh cmFtczsKKworCWlmIChxdWVyeURlc2MtPnBsYW5uZWRzdG10LT5wYXJhbUV4ZWNUeXBlcyAhPSBO SUwpCisJeworCQlpbnQJCQluUGFyYW1FeGVjOworCisJCW5QYXJhbUV4ZWMgPSBsaXN0X2xlbmd0 aChxdWVyeURlc2MtPnBsYW5uZWRzdG10LT5wYXJhbUV4ZWNUeXBlcyk7CisJCWVzdGF0ZS0+ZXNf cGFyYW1fZXhlY192YWxzID0gKFBhcmFtRXhlY0RhdGEgKikKKwkJCXBhbGxvYzAoblBhcmFtRXhl YyAqIHNpemVvZihQYXJhbUV4ZWNEYXRhKSk7CisJfQorCisJLyogV2Ugbm93IHJlcXVpcmUgYWxs IGNhbGxlcnMgdG8gcHJvdmlkZSBzb3VyY2VUZXh0ICovCisJQXNzZXJ0KHF1ZXJ5RGVzYy0+c291 cmNlVGV4dCAhPSBOVUxMKTsKKwllc3RhdGUtPmVzX3NvdXJjZVRleHQgPSBxdWVyeURlc2MtPnNv dXJjZVRleHQ7CisKKwkvKgorCSAqIEZpbGwgaW4gdGhlIHF1ZXJ5IGVudmlyb25tZW50LCBpZiBh bnksIGZyb20gcXVlcnlEZXNjLgorCSAqLworCWVzdGF0ZS0+ZXNfcXVlcnlFbnYgPSBxdWVyeURl c2MtPnF1ZXJ5RW52OworCisJLyoKKwkgKiBJZiBub24tcmVhZC1vbmx5IHF1ZXJ5LCBzZXQgdGhl IGNvbW1hbmQgSUQgdG8gbWFyayBvdXRwdXQgdHVwbGVzIHdpdGgKKwkgKi8KKwlzd2l0Y2ggKHF1 ZXJ5RGVzYy0+b3BlcmF0aW9uKQorCXsKKwkJY2FzZSBDTURfU0VMRUNUOgorCisJCQkvKgorCQkJ ICogU0VMRUNUIEZPUiBbS0VZXSBVUERBVEUvU0hBUkUgYW5kIG1vZGlmeWluZyBDVEVzIG5lZWQg dG8gbWFyaworCQkJICogdHVwbGVzCisJCQkgKi8KKwkJCWlmIChxdWVyeURlc2MtPnBsYW5uZWRz dG10LT5yb3dNYXJrcyAhPSBOSUwgfHwKKwkJCQlxdWVyeURlc2MtPnBsYW5uZWRzdG10LT5oYXNN b2RpZnlpbmdDVEUpCisJCQkJZXN0YXRlLT5lc19vdXRwdXRfY2lkID0gR2V0Q3VycmVudENvbW1h bmRJZCh0cnVlKTsKKworCQkJLyoKKwkJCSAqIEEgU0VMRUNUIHdpdGhvdXQgbW9kaWZ5aW5nIENU RXMgY2FuJ3QgcG9zc2libHkgcXVldWUgdHJpZ2dlcnMsCisJCQkgKiBzbyBmb3JjZSBza2lwLXRy aWdnZXJzIG1vZGUuIFRoaXMgaXMganVzdCBhIG1hcmdpbmFsIGVmZmljaWVuY3kKKwkJCSAqIGhh Y2ssIHNpbmNlIEFmdGVyVHJpZ2dlckJlZ2luUXVlcnkvQWZ0ZXJUcmlnZ2VyRW5kUXVlcnkgYXJl bid0CisJCQkgKiBhbGwgdGhhdCBleHBlbnNpdmUsIGJ1dCB3ZSBtaWdodCBhcyB3ZWxsIGRvIGl0 LgorCQkJICovCisJCQlpZiAoIXF1ZXJ5RGVzYy0+cGxhbm5lZHN0bXQtPmhhc01vZGlmeWluZ0NU RSkKKwkJCQllZmxhZ3MgfD0gRVhFQ19GTEFHX1NLSVBfVFJJR0dFUlM7CisJCQlicmVhazsKKwor CQljYXNlIENNRF9JTlNFUlQ6CisJCWNhc2UgQ01EX0RFTEVURToKKwkJY2FzZSBDTURfVVBEQVRF OgorCQljYXNlIENNRF9NRVJHRToKKwkJCWVzdGF0ZS0+ZXNfb3V0cHV0X2NpZCA9IEdldEN1cnJl bnRDb21tYW5kSWQodHJ1ZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZWxvZyhFUlJP UiwgInVucmVjb2duaXplZCBvcGVyYXRpb24gY29kZTogJWQiLAorCQkJCSAoaW50KSBxdWVyeURl c2MtPm9wZXJhdGlvbik7CisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqIENvcHkgb3RoZXIgaW1w b3J0YW50IGluZm9ybWF0aW9uIGludG8gdGhlIEVTdGF0ZQorCSAqLworCWVzdGF0ZS0+ZXNfc25h cHNob3QgPSBSZWdpc3RlclNuYXBzaG90KHF1ZXJ5RGVzYy0+c25hcHNob3QpOworCWVzdGF0ZS0+ ZXNfY3Jvc3NjaGVja19zbmFwc2hvdCA9IFJlZ2lzdGVyU25hcHNob3QocXVlcnlEZXNjLT5jcm9z c2NoZWNrX3NuYXBzaG90KTsKKwllc3RhdGUtPmVzX3RvcF9lZmxhZ3MgPSBlZmxhZ3M7CisJZXN0 YXRlLT5lc19pbnN0cnVtZW50ID0gcXVlcnlEZXNjLT5pbnN0cnVtZW50X29wdGlvbnM7CisJZXN0 YXRlLT5lc19qaXRfZmxhZ3MgPSBxdWVyeURlc2MtPnBsYW5uZWRzdG10LT5qaXRGbGFnczsKKwor CWVzdGF0ZS0+ZXNfcGFydF9wcnVuZV9pbmZvcyA9IHBsYW5uZWRzdG10LT5wYXJ0UHJ1bmVJbmZv czsKKwllc3RhdGUtPmVzX3VucHJ1bmVkX3JlbGlkcyA9IGJtc19jb3B5KHBsYW5uZWRzdG10LT51 bnBydW5hYmxlUmVsaWRzKTsKKworCS8qCisJICogRG8gcGVybWlzc2lvbnMgY2hlY2tzCisJICov CisJRXhlY0NoZWNrUGVybWlzc2lvbnMocmFuZ2VUYWJsZSwgcGxhbm5lZHN0bXQtPnBlcm1JbmZv cywgdHJ1ZSk7CisKKwkvKgorCSAqIGluaXRpYWxpemUgdGhlIG5vZGUncyBleGVjdXRpb24gc3Rh dGUKKwkgKi8KKwlFeGVjSW5pdFJhbmdlVGFibGUoZXN0YXRlLCByYW5nZVRhYmxlLCBwbGFubmVk c3RtdC0+cGVybUluZm9zKTsKKworCS8qCisJICogUGVyZm9ybSBydW50aW1lICJpbml0aWFsIiBw cnVuaW5nIHRvIGlkZW50aWZ5IHdoaWNoIGNoaWxkIHN1YnBsYW5zLAorCSAqIGNvcnJlc3BvbmRp bmcgdG8gdGhlIGNoaWxkcmVuIG9mIHBsYW4gbm9kZXMgdGhhdCBjb250YWluCisJICogUGFydGl0 aW9uUHJ1bmVJbmZvIHN1Y2ggYXMgQXBwZW5kLCB3aWxsIG5vdCBiZSBleGVjdXRlZC4gVGhlIHJl c3VsdHMsCisJICogd2hpY2ggYXJlIGJpdG1hcHNldHMgb2YgaW5kZXhlcyBvZiB0aGUgY2hpbGQg c3VicGxhbnMgdGhhdCB3aWxsIGJlCisJICogZXhlY3V0ZWQsIGFyZSBzYXZlZCBpbiBlc19wYXJ0 X3BydW5lX3Jlc3VsdHMuICBUaGVzZSByZXN1bHRzIGNvcnJlc3BvbmQKKwkgKiB0byBlYWNoIFBh cnRpdGlvblBydW5lSW5mbyBlbnRyeSwgYW5kIHRoZSBlc19wYXJ0X3BydW5lX3Jlc3VsdHMgbGlz dCBpcworCSAqIHBhcmFsbGVsIHRvIGVzX3BhcnRfcHJ1bmVfaW5mb3MuCisJICoKKwkgKiBUaGlz IHdpbGwgYWxzbyBhZGQgdGhlIFJUIGluZGV4ZXMgb2Ygc3Vydml2aW5nIGxlYWYgcGFydGl0aW9u cyB0bworCSAqIGVzX3VucHJ1bmVkX3JlbGlkcy4KKwkgKi8KKwlFeGVjRG9Jbml0aWFsUHJ1bmlu Zyhlc3RhdGUsIGNhY2hlZHBsYW4pOworCisJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRl eHQpOworCisJaWYgKGNhY2hlZHBsYW4gJiYgIUNhY2hlZFBsYW5WYWxpZChjYWNoZWRwbGFuKSkK KwkJcmV0dXJuOworCiAJaWYgKEV4ZWN1dG9yU3RhcnRfaG9vaykKIAkJKCpFeGVjdXRvclN0YXJ0 X2hvb2spIChxdWVyeURlc2MsIGVmbGFncyk7CiAJZWxzZQpAQCAtMTk4LDEyICszMTksMTIgQEAg RXhlY3V0b3JTdGFydENhY2hlZFBsYW4oUXVlcnlEZXNjICpxdWVyeURlc2MsIGludCBlZmxhZ3Ms CiB2b2lkCiBzdGFuZGFyZF9FeGVjdXRvclN0YXJ0KFF1ZXJ5RGVzYyAqcXVlcnlEZXNjLCBpbnQg ZWZsYWdzKQogewotCUVTdGF0ZQkgICAqZXN0YXRlOwogCU1lbW9yeUNvbnRleHQgb2xkY29udGV4 dDsKKwlFU3RhdGUJICAgKmVzdGF0ZTsKIAogCS8qIHNhbml0eSBjaGVja3M6IHF1ZXJ5RGVzYyBt dXN0IG5vdCBiZSBzdGFydGVkIGFscmVhZHkgKi8KIAlBc3NlcnQocXVlcnlEZXNjICE9IE5VTEwp OwotCUFzc2VydChxdWVyeURlc2MtPmVzdGF0ZSA9PSBOVUxMKTsKKwlBc3NlcnQocXVlcnlEZXNj LT5lc3RhdGUgIT0gTlVMTCk7CiAKIAkvKiBjYWxsZXIgbXVzdCBlbnN1cmUgdGhlIHF1ZXJ5J3Mg c25hcHNob3QgaXMgYWN0aXZlICovCiAJQXNzZXJ0KEdldEFjdGl2ZVNuYXBzaG90KCkgPT0gcXVl cnlEZXNjLT5zbmFwc2hvdCk7CkBAIC0yMjcsODUgKzM0OCw2IEBAIHN0YW5kYXJkX0V4ZWN1dG9y U3RhcnQoUXVlcnlEZXNjICpxdWVyeURlc2MsIGludCBlZmxhZ3MpCiAJCSEoZWZsYWdzICYgRVhF Q19GTEFHX0VYUExBSU5fT05MWSkpCiAJCUV4ZWNDaGVja1hhY3RSZWFkT25seShxdWVyeURlc2Mt PnBsYW5uZWRzdG10KTsKIAotCS8qCi0JICogQnVpbGQgRVN0YXRlLCBzd2l0Y2ggaW50byBwZXIt cXVlcnkgbWVtb3J5IGNvbnRleHQgZm9yIHN0YXJ0dXAuCi0JICovCi0JZXN0YXRlID0gQ3JlYXRl RXhlY3V0b3JTdGF0ZSgpOwotCXF1ZXJ5RGVzYy0+ZXN0YXRlID0gZXN0YXRlOwotCi0Jb2xkY29u dGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhlc3RhdGUtPmVzX3F1ZXJ5X2N4dCk7Ci0KLQkv KgotCSAqIEZpbGwgaW4gZXh0ZXJuYWwgcGFyYW1ldGVycywgaWYgYW55LCBmcm9tIHF1ZXJ5RGVz YzsgYW5kIGFsbG9jYXRlCi0JICogd29ya3NwYWNlIGZvciBpbnRlcm5hbCBwYXJhbWV0ZXJzCi0J ICovCi0JZXN0YXRlLT5lc19wYXJhbV9saXN0X2luZm8gPSBxdWVyeURlc2MtPnBhcmFtczsKLQot CWlmIChxdWVyeURlc2MtPnBsYW5uZWRzdG10LT5wYXJhbUV4ZWNUeXBlcyAhPSBOSUwpCi0Jewot CQlpbnQJCQluUGFyYW1FeGVjOwotCi0JCW5QYXJhbUV4ZWMgPSBsaXN0X2xlbmd0aChxdWVyeURl c2MtPnBsYW5uZWRzdG10LT5wYXJhbUV4ZWNUeXBlcyk7Ci0JCWVzdGF0ZS0+ZXNfcGFyYW1fZXhl Y192YWxzID0gKFBhcmFtRXhlY0RhdGEgKikKLQkJCXBhbGxvYzAoblBhcmFtRXhlYyAqIHNpemVv ZihQYXJhbUV4ZWNEYXRhKSk7Ci0JfQotCi0JLyogV2Ugbm93IHJlcXVpcmUgYWxsIGNhbGxlcnMg dG8gcHJvdmlkZSBzb3VyY2VUZXh0ICovCi0JQXNzZXJ0KHF1ZXJ5RGVzYy0+c291cmNlVGV4dCAh PSBOVUxMKTsKLQllc3RhdGUtPmVzX3NvdXJjZVRleHQgPSBxdWVyeURlc2MtPnNvdXJjZVRleHQ7 Ci0KLQkvKgotCSAqIEZpbGwgaW4gdGhlIHF1ZXJ5IGVudmlyb25tZW50LCBpZiBhbnksIGZyb20g cXVlcnlEZXNjLgotCSAqLwotCWVzdGF0ZS0+ZXNfcXVlcnlFbnYgPSBxdWVyeURlc2MtPnF1ZXJ5 RW52OwotCi0JLyoKLQkgKiBJZiBub24tcmVhZC1vbmx5IHF1ZXJ5LCBzZXQgdGhlIGNvbW1hbmQg SUQgdG8gbWFyayBvdXRwdXQgdHVwbGVzIHdpdGgKLQkgKi8KLQlzd2l0Y2ggKHF1ZXJ5RGVzYy0+ b3BlcmF0aW9uKQotCXsKLQkJY2FzZSBDTURfU0VMRUNUOgotCi0JCQkvKgotCQkJICogU0VMRUNU IEZPUiBbS0VZXSBVUERBVEUvU0hBUkUgYW5kIG1vZGlmeWluZyBDVEVzIG5lZWQgdG8gbWFyawot CQkJICogdHVwbGVzCi0JCQkgKi8KLQkJCWlmIChxdWVyeURlc2MtPnBsYW5uZWRzdG10LT5yb3dN YXJrcyAhPSBOSUwgfHwKLQkJCQlxdWVyeURlc2MtPnBsYW5uZWRzdG10LT5oYXNNb2RpZnlpbmdD VEUpCi0JCQkJZXN0YXRlLT5lc19vdXRwdXRfY2lkID0gR2V0Q3VycmVudENvbW1hbmRJZCh0cnVl KTsKLQotCQkJLyoKLQkJCSAqIEEgU0VMRUNUIHdpdGhvdXQgbW9kaWZ5aW5nIENURXMgY2FuJ3Qg cG9zc2libHkgcXVldWUgdHJpZ2dlcnMsCi0JCQkgKiBzbyBmb3JjZSBza2lwLXRyaWdnZXJzIG1v ZGUuIFRoaXMgaXMganVzdCBhIG1hcmdpbmFsIGVmZmljaWVuY3kKLQkJCSAqIGhhY2ssIHNpbmNl IEFmdGVyVHJpZ2dlckJlZ2luUXVlcnkvQWZ0ZXJUcmlnZ2VyRW5kUXVlcnkgYXJlbid0Ci0JCQkg KiBhbGwgdGhhdCBleHBlbnNpdmUsIGJ1dCB3ZSBtaWdodCBhcyB3ZWxsIGRvIGl0LgotCQkJICov Ci0JCQlpZiAoIXF1ZXJ5RGVzYy0+cGxhbm5lZHN0bXQtPmhhc01vZGlmeWluZ0NURSkKLQkJCQll ZmxhZ3MgfD0gRVhFQ19GTEFHX1NLSVBfVFJJR0dFUlM7Ci0JCQlicmVhazsKLQotCQljYXNlIENN RF9JTlNFUlQ6Ci0JCWNhc2UgQ01EX0RFTEVURToKLQkJY2FzZSBDTURfVVBEQVRFOgotCQljYXNl IENNRF9NRVJHRToKLQkJCWVzdGF0ZS0+ZXNfb3V0cHV0X2NpZCA9IEdldEN1cnJlbnRDb21tYW5k SWQodHJ1ZSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZWxvZyhFUlJPUiwgInVucmVj b2duaXplZCBvcGVyYXRpb24gY29kZTogJWQiLAotCQkJCSAoaW50KSBxdWVyeURlc2MtPm9wZXJh dGlvbik7Ci0JCQlicmVhazsKLQl9Ci0KLQkvKgotCSAqIENvcHkgb3RoZXIgaW1wb3J0YW50IGlu Zm9ybWF0aW9uIGludG8gdGhlIEVTdGF0ZQotCSAqLwotCWVzdGF0ZS0+ZXNfc25hcHNob3QgPSBS ZWdpc3RlclNuYXBzaG90KHF1ZXJ5RGVzYy0+c25hcHNob3QpOwotCWVzdGF0ZS0+ZXNfY3Jvc3Nj aGVja19zbmFwc2hvdCA9IFJlZ2lzdGVyU25hcHNob3QocXVlcnlEZXNjLT5jcm9zc2NoZWNrX3Nu YXBzaG90KTsKLQllc3RhdGUtPmVzX3RvcF9lZmxhZ3MgPSBlZmxhZ3M7Ci0JZXN0YXRlLT5lc19p bnN0cnVtZW50ID0gcXVlcnlEZXNjLT5pbnN0cnVtZW50X29wdGlvbnM7Ci0JZXN0YXRlLT5lc19q aXRfZmxhZ3MgPSBxdWVyeURlc2MtPnBsYW5uZWRzdG10LT5qaXRGbGFnczsKLQogCS8qCiAJICog U2V0IHVwIGFuIEFGVEVSLXRyaWdnZXIgc3RhdGVtZW50IGNvbnRleHQsIHVubGVzcyB0b2xkIG5v dCB0bywgb3IKIAkgKiB1bmxlc3MgaXQncyBFWFBMQUlOLW9ubHkgbW9kZSAod2hlbiBFeGVjdXRv ckZpbmlzaCB3b24ndCBiZSBjYWxsZWQpLgpAQCAtMzEzLDYgKzM1NSw5IEBAIHN0YW5kYXJkX0V4 ZWN1dG9yU3RhcnQoUXVlcnlEZXNjICpxdWVyeURlc2MsIGludCBlZmxhZ3MpCiAJaWYgKCEoZWZs YWdzICYgKEVYRUNfRkxBR19TS0lQX1RSSUdHRVJTIHwgRVhFQ19GTEFHX0VYUExBSU5fT05MWSkp KQogCQlBZnRlclRyaWdnZXJCZWdpblF1ZXJ5KCk7CiAKKwllc3RhdGUgPSBxdWVyeURlc2MtPmVz dGF0ZTsKKwlvbGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRvKGVzdGF0ZS0+ZXNfcXVl cnlfY3h0KTsKKwogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgcGxhbiBzdGF0ZSB0cmVlCiAJICov CkBAIC05MjIsNDYgKzk2NywxNCBAQCBJbml0UGxhbihRdWVyeURlc2MgKnF1ZXJ5RGVzYywgaW50 IGVmbGFncykKIHsKIAlDbWRUeXBlCQlvcGVyYXRpb24gPSBxdWVyeURlc2MtPm9wZXJhdGlvbjsK IAlQbGFubmVkU3RtdCAqcGxhbm5lZHN0bXQgPSBxdWVyeURlc2MtPnBsYW5uZWRzdG10OwotCUNh Y2hlZFBsYW4gKmNhY2hlZHBsYW4gPSBxdWVyeURlc2MtPmNwbGFuOwogCVBsYW4JICAgKnBsYW4g PSBwbGFubmVkc3RtdC0+cGxhblRyZWU7Ci0JTGlzdAkgICAqcmFuZ2VUYWJsZSA9IHBsYW5uZWRz dG10LT5ydGFibGU7CiAJRVN0YXRlCSAgICplc3RhdGUgPSBxdWVyeURlc2MtPmVzdGF0ZTsKIAlQ bGFuU3RhdGUgICpwbGFuc3RhdGU7CiAJVHVwbGVEZXNjCXR1cFR5cGU7CiAJTGlzdENlbGwgICAq bDsKIAlpbnQJCQlpOwogCi0JLyoKLQkgKiBEbyBwZXJtaXNzaW9ucyBjaGVja3MKLQkgKi8KLQlF eGVjQ2hlY2tQZXJtaXNzaW9ucyhyYW5nZVRhYmxlLCBwbGFubmVkc3RtdC0+cGVybUluZm9zLCB0 cnVlKTsKLQotCS8qCi0JICogaW5pdGlhbGl6ZSB0aGUgbm9kZSdzIGV4ZWN1dGlvbiBzdGF0ZQot CSAqLwotCUV4ZWNJbml0UmFuZ2VUYWJsZShlc3RhdGUsIHJhbmdlVGFibGUsIHBsYW5uZWRzdG10 LT5wZXJtSW5mb3MpOwotCiAJZXN0YXRlLT5lc19wbGFubmVkc3RtdCA9IHBsYW5uZWRzdG10Owot CWVzdGF0ZS0+ZXNfY2FjaGVkcGxhbiA9IGNhY2hlZHBsYW47Ci0JZXN0YXRlLT5lc19wYXJ0X3By dW5lX2luZm9zID0gcGxhbm5lZHN0bXQtPnBhcnRQcnVuZUluZm9zOwotCWVzdGF0ZS0+ZXNfdW5w cnVuZWRfcmVsaWRzID0gYm1zX2NvcHkocGxhbm5lZHN0bXQtPnVucHJ1bmFibGVSZWxpZHMpOwot Ci0JLyoKLQkgKiBQZXJmb3JtIHJ1bnRpbWUgImluaXRpYWwiIHBydW5pbmcgdG8gaWRlbnRpZnkg d2hpY2ggY2hpbGQgc3VicGxhbnMsCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUgY2hpbGRyZW4g b2YgcGxhbiBub2RlcyB0aGF0IGNvbnRhaW4KLQkgKiBQYXJ0aXRpb25QcnVuZUluZm8gc3VjaCBh cyBBcHBlbmQsIHdpbGwgbm90IGJlIGV4ZWN1dGVkLiBUaGUgcmVzdWx0cywKLQkgKiB3aGljaCBh cmUgYml0bWFwc2V0cyBvZiBpbmRleGVzIG9mIHRoZSBjaGlsZCBzdWJwbGFucyB0aGF0IHdpbGwg YmUKLQkgKiBleGVjdXRlZCwgYXJlIHNhdmVkIGluIGVzX3BhcnRfcHJ1bmVfcmVzdWx0cy4gIFRo ZXNlIHJlc3VsdHMgY29ycmVzcG9uZAotCSAqIHRvIGVhY2ggUGFydGl0aW9uUHJ1bmVJbmZvIGVu dHJ5LCBhbmQgdGhlIGVzX3BhcnRfcHJ1bmVfcmVzdWx0cyBsaXN0IGlzCi0JICogcGFyYWxsZWwg dG8gZXNfcGFydF9wcnVuZV9pbmZvcy4KLQkgKgotCSAqIFRoaXMgd2lsbCBhbHNvIGFkZCB0aGUg UlQgaW5kZXhlcyBvZiBzdXJ2aXZpbmcgbGVhZiBwYXJ0aXRpb25zIHRvCi0JICogZXNfdW5wcnVu ZWRfcmVsaWRzLgotCSAqLwotCUV4ZWNEb0luaXRpYWxQcnVuaW5nKGVzdGF0ZSk7Ci0KLQlpZiAo IUV4ZWNQbGFuU3RpbGxWYWxpZChlc3RhdGUpKQotCQlyZXR1cm47CiAKIAkvKgogCSAqIE5leHQs IGJ1aWxkIHRoZSBFeGVjUm93TWFyayBhcnJheSBmcm9tIHRoZSBQbGFuUm93TWFyayhzKSwgaWYg YW55LgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY1BhcnRpdGlvbi5jIGIv c3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY1BhcnRpdGlvbi5jCmluZGV4IGIzNDljY2IyMTEuLjEy NmYzMzBlZjggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNQYXJ0aXRpb24u YworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjUGFydGl0aW9uLmMKQEAgLTE4MTIsNyAr MTgxMiw3IEBAIGFkanVzdF9wYXJ0aXRpb25fY29sbm9zX3VzaW5nX21hcChMaXN0ICpjb2xub3Ms IEF0dHJNYXAgKmF0dHJNYXApCiAgKiB1c2UgdGhlIHNhbWUgaW5kZXggdG8gcmV0cmlldmUgdGhl IHBydW5pbmcgcmVzdWx0cy4KICAqLwogdm9pZAotRXhlY0RvSW5pdGlhbFBydW5pbmcoRVN0YXRl ICplc3RhdGUpCitFeGVjRG9Jbml0aWFsUHJ1bmluZyhFU3RhdGUgKmVzdGF0ZSwgQ2FjaGVkUGxh biAqY3BsYW4pCiB7CiAJTGlzdENlbGwgICAqbGM7CiAJTGlzdAkgICAqbG9ja2VkX3JlbGlkcyA9 IE5JTDsKQEAgLTE4MzgsNyArMTgzOCw3IEBAIEV4ZWNEb0luaXRpYWxQcnVuaW5nKEVTdGF0ZSAq ZXN0YXRlKQogCiAJCQl2YWxpZHN1YnBsYW5zID0gRXhlY0ZpbmRNYXRjaGluZ1N1YlBsYW5zKHBy dW5lc3RhdGUsIHRydWUsCiAJCQkJCQkJCQkJCQkJICZ2YWxpZHN1YnBsYW5fcnRpcyk7Ci0JCQlp ZiAoRXhlY1Nob3VsZExvY2tSZWxhdGlvbnMoZXN0YXRlKSkKKwkJCWlmIChjcGxhbiAmJiBDYWNo ZWRQbGFuUmVxdWlyZXNMb2NraW5nKGNwbGFuKSkKIAkJCXsKIAkJCQlpbnQJCXJ0aW5kZXggPSAt MTsKIApAQCAtMTg2Niw3ICsxODY2LDcgQEAgRXhlY0RvSW5pdGlhbFBydW5pbmcoRVN0YXRlICpl c3RhdGUpCiAJICogUmVsZWFzZSB0aGUgdXNlbGVzcyBsb2NrcyBpZiB0aGUgcGxhbiB3b24ndCBi ZSBleGVjdXRlZC4gIFRoaXMgaXMgdGhlCiAJICogc2FtZSBhcyB3aGF0IENoZWNrQ2FjaGVkUGxh bigpIGluIHBsYW5jYWNoZS5jIGRvZXMuCiAJICovCi0JaWYgKCFFeGVjUGxhblN0aWxsVmFsaWQo ZXN0YXRlKSkKKwlpZiAoY3BsYW4gJiYgIUNhY2hlZFBsYW5WYWxpZChjcGxhbikpCiAJewogCQlm b3JlYWNoKGxjLCBsb2NrZWRfcmVsaWRzKQogCQl7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9l eGVjdXRvci9leGVjUGFydGl0aW9uLmggYi9zcmMvaW5jbHVkZS9leGVjdXRvci9leGVjUGFydGl0 aW9uLmgKaW5kZXggYTA4NDM0ODFmNy4uOTVkODg2ODg0YyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1 ZGUvZXhlY3V0b3IvZXhlY1BhcnRpdGlvbi5oCisrKyBiL3NyYy9pbmNsdWRlL2V4ZWN1dG9yL2V4 ZWNQYXJ0aXRpb24uaApAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgIm5vZGVzL3BhcnNlbm9k ZXMuaCIKICNpbmNsdWRlICJub2Rlcy9wbGFubm9kZXMuaCIKICNpbmNsdWRlICJwYXJ0aXRpb25p bmcvcGFydHBydW5lLmgiCisjaW5jbHVkZSAidXRpbHMvcGxhbmNhY2hlLmgiCiAKIC8qIFNlZSBl eGVjUGFydGl0aW9uLmMgZm9yIHRoZSBkZWZpbml0aW9ucy4gKi8KIHR5cGVkZWYgc3RydWN0IFBh cnRpdGlvbkRpc3BhdGNoRGF0YSAqUGFydGl0aW9uRGlzcGF0Y2g7CkBAIC0xMzYsNyArMTM3LDcg QEAgdHlwZWRlZiBzdHJ1Y3QgUGFydGl0aW9uUHJ1bmVTdGF0ZQogCVBhcnRpdGlvblBydW5pbmdE YXRhICpwYXJ0cHJ1bmVkYXRhW0ZMRVhJQkxFX0FSUkFZX01FTUJFUl07CiB9IFBhcnRpdGlvblBy dW5lU3RhdGU7CiAKLXZvaWQgRXhlY0RvSW5pdGlhbFBydW5pbmcoRVN0YXRlICplc3RhdGUpOwor dm9pZCBFeGVjRG9Jbml0aWFsUHJ1bmluZyhFU3RhdGUgKmVzdGF0ZSwgQ2FjaGVkUGxhbiAqY3Bs YW4pOwogZXh0ZXJuIFBhcnRpdGlvblBydW5lU3RhdGUgKkV4ZWNJbml0UGFydGl0aW9uRXhlY1By dW5pbmcoUGxhblN0YXRlICpwbGFuc3RhdGUsCiAJCQkJCQkJCQkJCQkJCSBpbnQgbl90b3RhbF9z dWJwbGFucywKIAkJCQkJCQkJCQkJCQkJIGludCBwYXJ0X3BydW5lX2luZGV4LApkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvZXhlY3V0b3IvZXhlY3V0b3IuaCBiL3NyYy9pbmNsdWRlL2V4ZWN1dG9y L2V4ZWN1dG9yLmgKaW5kZXggNmQ3MmY3ZDlkNi4uNmE3Y2EzNzc1MyAxMDA2NDQKLS0tIGEvc3Jj L2luY2x1ZGUvZXhlY3V0b3IvZXhlY3V0b3IuaAorKysgYi9zcmMvaW5jbHVkZS9leGVjdXRvci9l eGVjdXRvci5oCkBAIC0yNjUsMzEgKzI2NSw2IEBAIGV4dGVybiB2b2lkIEV4ZWNFbmROb2RlKFBs YW5TdGF0ZSAqbm9kZSk7CiBleHRlcm4gdm9pZCBFeGVjU2h1dGRvd25Ob2RlKFBsYW5TdGF0ZSAq bm9kZSk7CiBleHRlcm4gdm9pZCBFeGVjU2V0VHVwbGVCb3VuZChpbnQ2NCB0dXBsZXNfbmVlZGVk LCBQbGFuU3RhdGUgKmNoaWxkX25vZGUpOwogCi0vKgotICogSXMgdGhlIENhY2hlZFBsYW4gaW4g ZXNfY2FjaGVkcGxhbiBzdGlsbCB2YWxpZD8KLSAqCi0gKiBDYWxsZWQgZnJvbSBJbml0UGxhbigp IGJlY2F1c2UgaW52YWxpZGF0aW9uIG1lc3NhZ2VzIHRoYXQgYWZmZWN0IHRoZSBwbGFuCi0gKiBt aWdodCBiZSByZWNlaXZlZCBhZnRlciBsb2NrcyBoYXZlIGJlZW4gdGFrZW4gb24gcnVudGltZS1w cnVuYWJsZSByZWxhdGlvbnMuCi0gKiBUaGUgY2FsbGVyIHNob3VsZCB0YWtlIGFwcHJvcHJpYXRl IGFjdGlvbiBpZiB0aGUgcGxhbiBoYXMgYmVjb21lIGludmFsaWQuCi0gKi8KLXN0YXRpYyBpbmxp bmUgYm9vbAotRXhlY1BsYW5TdGlsbFZhbGlkKEVTdGF0ZSAqZXN0YXRlKQotewotCXJldHVybiBl c3RhdGUtPmVzX2NhY2hlZHBsYW4gPT0gTlVMTCA/IHRydWUgOgotCQlDYWNoZWRQbGFuVmFsaWQo ZXN0YXRlLT5lc19jYWNoZWRwbGFuKTsKLX0KLQotLyoKLSAqIExvY2tzIGFyZSBuZWVkZWQgb25s eSBpZiBydW5uaW5nIGEgY2FjaGVkIHBsYW4gdGhhdCBtaWdodCBjb250YWluIHVubG9ja2VkCi0g KiByZWxhdGlvbnMsIHN1Y2ggYXMgYSByZXVzZWQgZ2VuZXJpYyBwbGFuLgotICovCi1zdGF0aWMg aW5saW5lIGJvb2wKLUV4ZWNTaG91bGRMb2NrUmVsYXRpb25zKEVTdGF0ZSAqZXN0YXRlKQotewot CXJldHVybiBlc3RhdGUtPmVzX2NhY2hlZHBsYW4gPT0gTlVMTCA/IGZhbHNlIDoKLQkJQ2FjaGVk UGxhblJlcXVpcmVzTG9ja2luZyhlc3RhdGUtPmVzX2NhY2hlZHBsYW4pOwotfQotCiAvKiAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCiAgKgkJRXhlY1Byb2NOb2RlCiAgKgo= --0000000000002e418a062895ab0c--