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 1wPegi-000vbK-2q for pgsql-hackers@arkaria.postgresql.org; Wed, 20 May 2026 11:02:09 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wPegg-007ElO-2N for pgsql-hackers@arkaria.postgresql.org; Wed, 20 May 2026 11:02:07 +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 1wPegg-007ElG-1H for pgsql-hackers@lists.postgresql.org; Wed, 20 May 2026 11:02:07 +0000 Received: from mail-yx1-xb136.google.com ([2607:f8b0:4864:20::b136]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wPegf-00000000XNp-1p5S for pgsql-hackers@postgresql.org; Wed, 20 May 2026 11:02:07 +0000 Received: by mail-yx1-xb136.google.com with SMTP id 956f58d0204a3-651c366f7efso4878521d50.1 for ; Wed, 20 May 2026 04:02:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779274924; cv=none; d=google.com; s=arc-20240605; b=irzrwRfil+mUTqTYx9fLBLBnCrdgqwU4D9MctxUpeIUGUx/T+Kc2RGit4sbAc725UU AatlFOCXiyzdAVmevtFumLv2c2Bi/Ry3pqJaeuKiJ0JIQeKGXDgBnZcR17RqvPcbms9T kcDaDZr+gz6Chd6eJ8Yx8+9Er8zLCWGpodvefcx9TrOEHT/SNQBcpZo8vnWRSVimYjwg Veq/emwrdEvlz3YBvPp0ueL2KbQlG1QnvNeJX0DQygp/zccExvW01RdR9B102bA046h7 F3ko6G3wgMMaOUKaDtvjJy+PAgMTf9RvpZFo0Vzy8YvUIzehnamq04Y9DZ1kKZRJ2zni 58VQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=Y9Lkj218O2HF9VmpLTw/L+DrFth9ARpFheZShXrHAxc=; fh=/kK1cEDgD7JKx/Kj+HUrzbzr4mFtKW/RL193pFfWulA=; b=cFZL2BPHeF+98maPuSc/GVLGaCxmSgkLqODs40aUuOfklIWmPE4JMZzLZsnyizEW9x LH+UV/SU1hLwfOcVW+Om75XFtUtQNqkmhn9023ZFSgwI03j879jIf4faUhjZxDUYtayO 5l43XVjEKuinZpT/5xcrZ726okHuSB4b1TjlHv5LI/2e75bWV560Mj4ARXWRxHGpg9CZ 4en9rO3gzC6S6uOCKKWNZGlimRoxXR3qvzrT82yLD0tq6+cZf7mg1gGQR8BRxlsV/1g7 +/45IDxyEGsLzp5G/LtsgXLyraaMbOwDfwTV6gt5N4lV9VKPWep9yz+we27bQFdUPVlM STSQ==; 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=1779274924; x=1779879724; 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=Y9Lkj218O2HF9VmpLTw/L+DrFth9ARpFheZShXrHAxc=; b=rbmE2BguaE+lpAFDavzijmLaT3IraQLGP3L5hXV1NXFIJ94iC/p2RKyFtJP26kz8j1 PrAF0VoqY9jJEyTQHZXi4EFJHebZj1pLumQK8lwZzKQsO6OR9ktKZ6L/+1QOpTmpYQP6 l/uPoi/1zskiHXVL9oPktW7Zk6Mxb3Y80+ZFZWGYrweArBnlrSp3fAYLNl/lSMtgio5j RzgJ1r++Kvi/5ihcFUoecTViMzQ8ROVvV0m7NklkY0XmSod1oWM575Py4OnXXnACW8DT veaNI4tt6OXXEzuj8EFjdPJF5FpEStj1rt7EgEAFEuhz1WSpcpEzMy4kzZND8aLbV0jy 7D1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779274924; x=1779879724; 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=Y9Lkj218O2HF9VmpLTw/L+DrFth9ARpFheZShXrHAxc=; b=c/bNdcsAFSDR7CnS2bFGe5XbzqBRJ5hSsbK+r1O6VUVCE3omp5KaLU1f7DMqaGDw3T 2GHdFN/iVnq3lwRllSokruHIxJaXzt2/2f6V4cGEAlZrl6g9DVxX3z9gNUunQLFii6Gq xB5vOIPuDoAOi0hHCUJpVuNsYGOaNbX6/Ty5+NO2t8CE2lCkzarKPpAz7vchawzjwW7l 4Su6oPUmjHendkMcOLfbRmA+Wi8+5xbe2PRhyus4u614+DL4fuAdOl1Ogk4z4FtRh2Rh psTQ4LnoJY7KrsfYzMaK/rf+RrNSiKTByn6GKxeXza+Efw85+wR3zQAOZVj1M5erenqh nGQA== X-Gm-Message-State: AOJu0Yyl8qPPJmHYoDm5AodqMUSjK2Rp5fGx8dY5DDIkHTxXbFTxLKNB FrkXiWILgKzgoLz9GWNA54v2rhjIs0EDbo3Mhg3roCz0dSawCDVDeTyjyQOuSFGeom9MARavuEE JUUuZdJa7mvXbWl0bd44c/I6jEcIidMOXMFID X-Gm-Gg: Acq92OFmnsHouCyu2phjeAfcV/zIlKtqNLCDaZh1HEWvDnXEP2NRi4GphtWRvRVkuhz sj0URa0+01UsMvST+g5jwEZxa8Ch9B+G0tgzmP3klmQhJn1kJdvMcrEnZ/mi+Y4xBRgzISxqwbR Z9HaKiYS90YfLsgd/ovQHvAxo9Qm0dZq0kihk7TNhDZ3QD+drNA9E5OW8zNzQfjsLM/VBN/v2My Wo3S0iPbk3T0oLZng3LA/JomBpWM2HNKFEA/wrNkfsqZwgy4/nXiSpn/SaxtBF8tUc/owjfbXP/ roayHw== X-Received: by 2002:a53:d043:0:10b0:65c:2ac8:ec3d with SMTP id 956f58d0204a3-65e2275d6bamr18884299d50.21.1779274923499; Wed, 20 May 2026 04:02:03 -0700 (PDT) MIME-Version: 1.0 References: <9835b0a4-9121-47ac-9c44-427b8b1a7f1b@app.fastmail.com> In-Reply-To: <9835b0a4-9121-47ac-9c44-427b8b1a7f1b@app.fastmail.com> From: Arseniy Mukhin Date: Wed, 20 May 2026 14:01:52 +0300 X-Gm-Features: AVHnY4JT9n-KpJyjFCuLKXNuYJM4VCtCfEp0MhnaTy7qIEELPCzBPtDpziwO8Ks Message-ID: Subject: Re: [PATCH] Fix LISTEN startup race with direct advancement To: Joel Jacobson Cc: pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000c7242706523db9de" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000c7242706523db9de Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, May 19, 2026 at 11:39=E2=80=AFPM Joel Jacobson = wrote: > > Hi hackers, > > I had another pass over the async.c rework committed in 282b1cd, > and found a race that can cause a notification committed after > the listener registered its queue position to be missed entirely. > > This can happen in the small time window between PreCommit_Notify(), > where the first LISTEN registers the backend and records its queue > position, and AtCommit_Notify(), where the staged listen action is > made active in the shared channel map by setting listening =3D true. > > If a concurrent NOTIFY commits in that window, SignalBackends() can > see the staged listener entry with listening =3D false and conclude that > the backend is not interested in the channel. With direct advancement, > that can move the backend's queue pointer past the notification instead > of waking it. > > This is distinct from the documented LISTEN startup race in > listen.sgml. The documented race can produce false positives: after > LISTEN returns, an application may receive a notification for work > already observed by its initial database scan. That is harmless. This > race is a false negative: a notification can be missed entirely. > > The fix is just to treat staged LISTEN entries as possible listeners > when deciding whom to wake: > > ```diff > - if (!listeners[j].listening) > - continue; /* ignore not-yet-committed listeners */ > ``` > > The attached patches split the report into tests and fix: > > 0001 Test missed LISTEN startup notification > 0002 Test LISTEN startup notification for already-seen work > 0003 Fix LISTEN startup race with direct advancement > > /Joel Hi, Thank you for the fix! I tried the test and managed to reproduce it. I think what is definitely wrong here is that we can do direct advancement over messages that the listener is interested in, when it has set the position already. So +1 for the fix. I think the fix is correct and it's IIUC really harmless as the worst thing that can happen is an unnecessary signal. One point - looks like the 0003 contains the same test as 0001. Also while I was trying to understand the issue, another bad schedule came to my mind: it's basically the same scenario as you reproduced, but now we have a message in between the listener's position and notification that the listener is interested in. In this case the notifier can't do direct advancement, so the message is not lost, but the notifier still doesn't signal about a new message, so the listener doesn't know that there is something to read until something triggers it (like another message). PFA the reproducer (there is a schedule diagram in the head of the file). It depends on 0001. Your patch fixes it too. Thank you! Best regards, Arseniy Mukhin --000000000000c7242706523db9de Content-Type: application/octet-stream; name="untriggered-notification.patch.nocfbot" Content-Disposition: attachment; filename="untriggered-notification.patch.nocfbot" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpdy8b6u0 RnJvbSBlN2M2OTEzYzFlMzkyZTZhNDFlNGYxODg2ODk3Y2RiYjQ3OWY3MjU0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBcnNlbml5IE11a2hpbiA8YXJzZW5peS5tdWtoaW4uZGV2QGdt YWlsLmNvbT4KRGF0ZTogV2VkLCAyMCBNYXkgMjAyNiAxMjo0NTo1NCArMDMwMApTdWJqZWN0OiBb UEFUQ0hdIExJU1RFTi9OT1RJRlkgdGVzdCAtIHVudHJpZ2dlcmVkIG5vdGlmaWNhdGlvbgoKLS0t CiBzcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jICAgICAgICAgICAgICAgICAgfCAgMiArCiBz cmMvdGVzdC9tb2R1bGVzL2luamVjdGlvbl9wb2ludHMvTWFrZWZpbGUgICAgfCAgMyArLQogLi4u bm90aWZ5LWxpc3Rlbi11bnRyaWdnZXJlZC1ub3RpZmljYXRpb24ub3V0IHwgNDUgKysrKysrKysr KysrKysKIHNyYy90ZXN0L21vZHVsZXMvaW5qZWN0aW9uX3BvaW50cy9tZXNvbi5idWlsZCB8ICAx ICsKIC4uLm90aWZ5LWxpc3Rlbi11bnRyaWdnZXJlZC1ub3RpZmljYXRpb24uc3BlYyB8IDYwICsr KysrKysrKysrKysrKysrKysKIDUgZmlsZXMgY2hhbmdlZCwgMTEwIGluc2VydGlvbnMoKyksIDEg ZGVsZXRpb24oLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9tb2R1bGVzL2luamVjdGlv bl9wb2ludHMvZXhwZWN0ZWQvYXN5bmMtbm90aWZ5LWxpc3Rlbi11bnRyaWdnZXJlZC1ub3RpZmlj YXRpb24ub3V0CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvbW9kdWxlcy9pbmplY3Rpb25f cG9pbnRzL3NwZWNzL2FzeW5jLW5vdGlmeS1saXN0ZW4tdW50cmlnZ2VyZWQtbm90aWZpY2F0aW9u LnNwZWMKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9hc3luYy5jIGIvc3JjL2Jh Y2tlbmQvY29tbWFuZHMvYXN5bmMuYwppbmRleCBmMWJkMjc4YmQxOS4uZmRiNDMzMjFlMDQgMTAw NjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5jLmMKKysrIGIvc3JjL2JhY2tlbmQv Y29tbWFuZHMvYXN5bmMuYwpAQCAtMjI4Nyw2ICsyMjg3LDggQEAgU2lnbmFsQmFja2VuZHModm9p ZCkKIAkgKi8KIAljb3VudCA9IDA7CiAKKwlJTkpFQ1RJT05fUE9JTlQoImFzeW5jLW5vdGlmeS1z aWduYWwtYmFja2VuZHMtc3RhcnQiLCBOVUxMKTsKKwogCUxXTG9ja0FjcXVpcmUoTm90aWZ5UXVl dWVMb2NrLCBMV19FWENMVVNJVkUpOwogCiAJLyogU2NhbiBlYWNoIGNoYW5uZWwgbmFtZSB0aGF0 IHdlIG5vdGlmaWVkIGluIHRoaXMgdHJhbnNhY3Rpb24gKi8KZGlmZiAtLWdpdCBhL3NyYy90ZXN0 L21vZHVsZXMvaW5qZWN0aW9uX3BvaW50cy9NYWtlZmlsZSBiL3NyYy90ZXN0L21vZHVsZXMvaW5q ZWN0aW9uX3BvaW50cy9NYWtlZmlsZQppbmRleCA2NjVlNzg1MmQ1Mi4uZjUzZTMzMWM1NmUgMTAw NjQ0Ci0tLSBhL3NyYy90ZXN0L21vZHVsZXMvaW5qZWN0aW9uX3BvaW50cy9NYWtlZmlsZQorKysg Yi9zcmMvdGVzdC9tb2R1bGVzL2luamVjdGlvbl9wb2ludHMvTWFrZWZpbGUKQEAgLTIyLDcgKzIy LDggQEAgSVNPTEFUSU9OID0gYmFzaWMgXAogCSAgICByZXBhY2tfdGVtcG9yYWxfbXVsdGlyYW5n ZSBcCiAJICAgIHJlcGFja190b2FzdCBcCiAJICAgIHN5c2NhY2hlLXVwZGF0ZS1wcnVuZWQgXAot CSAgICBoZWFwX2xvY2tfdXBkYXRlCisJICAgIGhlYXBfbG9ja191cGRhdGUgXAorICAgICAgICBh c3luYy1ub3RpZnktbGlzdGVuLXVudHJpZ2dlcmVkLW5vdGlmaWNhdGlvbgogCiAjIHNvbWUgaXNv bGF0aW9uIHRlc3RzIHJlcXVpcmUgd2FsX2xldmVsPXJlcGxpY2EKIElTT0xBVElPTl9PUFRTID0g LS10ZW1wLWNvbmZpZyAkKHRvcF9zcmNkaXIpL3NyYy90ZXN0L21vZHVsZXMvaW5qZWN0aW9uX3Bv aW50cy9leHRyYS5jb25mCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9tb2R1bGVzL2luamVjdGlvbl9w b2ludHMvZXhwZWN0ZWQvYXN5bmMtbm90aWZ5LWxpc3Rlbi11bnRyaWdnZXJlZC1ub3RpZmljYXRp b24ub3V0IGIvc3JjL3Rlc3QvbW9kdWxlcy9pbmplY3Rpb25fcG9pbnRzL2V4cGVjdGVkL2FzeW5j LW5vdGlmeS1saXN0ZW4tdW50cmlnZ2VyZWQtbm90aWZpY2F0aW9uLm91dApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZGQ3N2E4MTgyYjQKLS0tIC9kZXYvbnVsbAorKysg Yi9zcmMvdGVzdC9tb2R1bGVzL2luamVjdGlvbl9wb2ludHMvZXhwZWN0ZWQvYXN5bmMtbm90aWZ5 LWxpc3Rlbi11bnRyaWdnZXJlZC1ub3RpZmljYXRpb24ub3V0CkBAIC0wLDAgKzEsNDUgQEAKK1Bh cnNlZCB0ZXN0IHNwZWMgd2l0aCA0IHNlc3Npb25zCisKK3N0YXJ0aW5nIHBlcm11dGF0aW9uOiBs aXN0ZW4gbm90aWZ5MiBub3RpZnkgd2FrZSB3YWtlX3VwX3NpZ25hbF9iYWNrZW5kc19zdGFydCBj aGVjayBjaGVjayBjaGVjayBub3RpZnkgY2hlY2sKK3N0ZXAgbGlzdGVuOiBMSVNURU4gcmFjZTsg PHdhaXRpbmcgLi4uPgorc3RlcCBub3RpZnkyOiBOT1RJRlkgY2gyLCAnY2gyX3BheWxvYWQnOyA8 d2FpdGluZyAuLi4+CitzdGVwIG5vdGlmeTogTk9USUZZIHJhY2UsICdwYXlsb2FkJzsKK3N0ZXAg d2FrZTogCisJU0VMRUNUIEZST00gaW5qZWN0aW9uX3BvaW50c19kZXRhY2goJ2FzeW5jLW5vdGlm eS1iZWZvcmUtbGlzdGVuLWNvbW1pdCcpOworCVNFTEVDVCBGUk9NIGluamVjdGlvbl9wb2ludHNf d2FrZXVwKCdhc3luYy1ub3RpZnktYmVmb3JlLWxpc3Rlbi1jb21taXQnKTsKKyA8d2FpdGluZyAu Li4+CitzdGVwIGxpc3RlbjogPC4uLiBjb21wbGV0ZWQ+CitsaXN0ZW5lcjogTk9USUZZICJyYWNl IiB3aXRoIHBheWxvYWQgInBheWxvYWQiIGZyb20gbjEKK3N0ZXAgd2FrZTogPC4uLiBjb21wbGV0 ZWQ+CitzdGVwIHdha2VfdXBfc2lnbmFsX2JhY2tlbmRzX3N0YXJ0OiAKKwlTRUxFQ1QgRlJPTSBp bmplY3Rpb25fcG9pbnRzX2RldGFjaCgnYXN5bmMtbm90aWZ5LXNpZ25hbC1iYWNrZW5kcy1zdGFy dCcpOworCVNFTEVDVCBGUk9NIGluamVjdGlvbl9wb2ludHNfd2FrZXVwKCdhc3luYy1ub3RpZnkt c2lnbmFsLWJhY2tlbmRzLXN0YXJ0Jyk7CisgPHdhaXRpbmcgLi4uPgorc3RlcCBub3RpZnkyOiA8 Li4uIGNvbXBsZXRlZD4KK3N0ZXAgY2hlY2s6IFNFTEVDVCAxIEFTIHg7Cit4CistCisxCisoMSBy b3cpCisKK3N0ZXAgd2FrZV91cF9zaWduYWxfYmFja2VuZHNfc3RhcnQ6IDwuLi4gY29tcGxldGVk Pgorc3RlcCBjaGVjazogU0VMRUNUIDEgQVMgeDsKK3gKKy0KKzEKKygxIHJvdykKKworc3RlcCBj aGVjazogU0VMRUNUIDEgQVMgeDsKK3gKKy0KKzEKKygxIHJvdykKKworc3RlcCBub3RpZnk6IE5P VElGWSByYWNlLCAncGF5bG9hZCc7CitzdGVwIGNoZWNrOiBTRUxFQ1QgMSBBUyB4OworeAorLQor MQorKDEgcm93KQorCitsaXN0ZW5lcjogTk9USUZZICJyYWNlIiB3aXRoIHBheWxvYWQgInBheWxv YWQiIGZyb20gbjEKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L21vZHVsZXMvaW5qZWN0aW9uX3BvaW50 cy9tZXNvbi5idWlsZCBiL3NyYy90ZXN0L21vZHVsZXMvaW5qZWN0aW9uX3BvaW50cy9tZXNvbi5i dWlsZAppbmRleCA3ZmI4ZGUzZDBmOC4uY2Y2NWM0YTQ4MTcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0 L21vZHVsZXMvaW5qZWN0aW9uX3BvaW50cy9tZXNvbi5idWlsZAorKysgYi9zcmMvdGVzdC9tb2R1 bGVzL2luamVjdGlvbl9wb2ludHMvbWVzb24uYnVpbGQKQEAgLTU0LDYgKzU0LDcgQEAgdGVzdHMg Kz0gewogICAgICAgJ3JlcGFja190b2FzdCcsCiAgICAgICAnc3lzY2FjaGUtdXBkYXRlLXBydW5l ZCcsCiAgICAgICAnaGVhcF9sb2NrX3VwZGF0ZScsCisgICAgICAnYXN5bmMtbm90aWZ5LWxpc3Rl bi11bnRyaWdnZXJlZC1ub3RpZmljYXRpb24nLAogICAgIF0sCiAgICAgJ3J1bm5pbmdjaGVjayc6 IGZhbHNlLCAjIHNlZSBzeXNjYWNoZS11cGRhdGUtcHJ1bmVkCiAgICAgIyBTb21lIHRlc3RzIHdh aXQgZm9yIGFsbCBzbmFwc2hvdHMsIHNvIGF2b2lkIHBhcmFsbGVsIGV4ZWN1dGlvbgpkaWZmIC0t Z2l0IGEvc3JjL3Rlc3QvbW9kdWxlcy9pbmplY3Rpb25fcG9pbnRzL3NwZWNzL2FzeW5jLW5vdGlm eS1saXN0ZW4tdW50cmlnZ2VyZWQtbm90aWZpY2F0aW9uLnNwZWMgYi9zcmMvdGVzdC9tb2R1bGVz L2luamVjdGlvbl9wb2ludHMvc3BlY3MvYXN5bmMtbm90aWZ5LWxpc3Rlbi11bnRyaWdnZXJlZC1u b3RpZmljYXRpb24uc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u ZDU3ZDQ2OTU3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9tb2R1bGVzL2luamVjdGlv bl9wb2ludHMvc3BlY3MvYXN5bmMtbm90aWZ5LWxpc3Rlbi11bnRyaWdnZXJlZC1ub3RpZmljYXRp b24uc3BlYwpAQCAtMCwwICsxLDYwIEBACisjIFRlc3QgTElTVEVOL05PVElGWSB1bnRyaWdnZXJl ZCBub3RpZmljYXRpb24KKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyMgbCAgICB8IHN0YXJ0IGxpc3RlbmluZyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfCB3YWtldXAsIHNldCBsaXN0ZW49dHJ1ZSBhbmQKKyMgICAgICB8IHNsZWVwIGJlZm9y ZSBzZXQgbGlzdGVuPXRydWUgICAgICAgICAgICAgICAgfCBzdGFydCB3YWl0aW5nIGZvciBuZXcg bWVzc2FnZXMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyMgbjIgICAgICAgfCBhZGQgdW5yZWxhdGVkIG1lc3NhZ2UsICAgICAgICAgICAgICAgICAgICAg IHwgYWR2YW5jZSBsaXN0ZW5lciBvdmVyIG91ciB1bnJlbGF0ZWQgbWVzc2FnZQorIyAgICAgICAg ICB8IGFkdmFuY2UgdG8gc2lnbmFsX2JhY2tlbmRzIHN0YXJ0ICAgICAgICAgICAgfCBsaXN0ZW5l ciBwb3Mgbm93IGlzIHJpZ2h0IGJlZm9yZSByZWxhdGVkIG1lc3NhZ2UKKyMgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYnV0IGxpc3RlbmVy IGRvZXNuJ3Qga25vdyB0aGF0CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IHRoZXJlIGlzIHNvbWV0aGluZyB0byByZWFkCisjIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIG4xICAgICAgICAgICAg ICAgfCBzZW5kIHJlbGF0ZWQgbWVzc2FnZQorIyAgICAgICAgICAgICAgICAgIHwgZG9uJ3Qgc2ln bmFsIGFzIGxpc3Rlbj1mYWxzZSwKKyMgICAgICAgICAgICAgICAgICB8IGRvbid0IGRpcmVjdCBh ZHZhbmNlIGFzIG4yIG1lc3NhZ2UgaXMgaW4gYmV0d2VlbiBvdXIgbWVzc2FnZSBhbmQgbGlzdGVu ZXIgcG9zaXRpb24KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKworc2V0dXAKK3sKKwlDUkVBVEUgRVhURU5TSU9OIGluamVjdGlvbl9wb2ludHM7Cit9CisK K3RlYXJkb3duCit7CisJRFJPUCBFWFRFTlNJT04gaW5qZWN0aW9uX3BvaW50czsKK30KKworc2Vz c2lvbiBsaXN0ZW5lcgorc2V0dXAKK3sKKwlTRUxFQ1QgRlJPTSBpbmplY3Rpb25fcG9pbnRzX3Nl dF9sb2NhbCgpOworCVNFTEVDVCBGUk9NIGluamVjdGlvbl9wb2ludHNfYXR0YWNoKCdhc3luYy1u b3RpZnktYmVmb3JlLWxpc3Rlbi1jb21taXQnLCAnd2FpdCcpOworfQorc3RlcCBsaXN0ZW4JeyBM SVNURU4gcmFjZTsgfQorc3RlcCBjaGVjawl7IFNFTEVDVCAxIEFTIHg7IH0KK3RlYXJkb3duCXsg VU5MSVNURU4gKjsgfQorCitzZXNzaW9uIG4xCitzdGVwIG5vdGlmeQl7IE5PVElGWSByYWNlLCAn cGF5bG9hZCc7IH0KKworc2Vzc2lvbiBuMgorc2V0dXAKK3sKKwlTRUxFQ1QgRlJPTSBpbmplY3Rp b25fcG9pbnRzX3NldF9sb2NhbCgpOworCVNFTEVDVCBGUk9NIGluamVjdGlvbl9wb2ludHNfYXR0 YWNoKCdhc3luYy1ub3RpZnktc2lnbmFsLWJhY2tlbmRzLXN0YXJ0JywgJ3dhaXQnKTsKK30KK3N0 ZXAgbm90aWZ5Mgl7IE5PVElGWSBjaDIsICdjaDJfcGF5bG9hZCc7IH0KKworc2Vzc2lvbiBjdHJs CitzdGVwIHdha2UKK3sKKwlTRUxFQ1QgRlJPTSBpbmplY3Rpb25fcG9pbnRzX2RldGFjaCgnYXN5 bmMtbm90aWZ5LWJlZm9yZS1saXN0ZW4tY29tbWl0Jyk7CisJU0VMRUNUIEZST00gaW5qZWN0aW9u X3BvaW50c193YWtldXAoJ2FzeW5jLW5vdGlmeS1iZWZvcmUtbGlzdGVuLWNvbW1pdCcpOworfQor c3RlcCB3YWtlX3VwX3NpZ25hbF9iYWNrZW5kc19zdGFydAoreworCVNFTEVDVCBGUk9NIGluamVj dGlvbl9wb2ludHNfZGV0YWNoKCdhc3luYy1ub3RpZnktc2lnbmFsLWJhY2tlbmRzLXN0YXJ0Jyk7 CisJU0VMRUNUIEZST00gaW5qZWN0aW9uX3BvaW50c193YWtldXAoJ2FzeW5jLW5vdGlmeS1zaWdu YWwtYmFja2VuZHMtc3RhcnQnKTsKK30KKworcGVybXV0YXRpb24gbGlzdGVuIG5vdGlmeTIgbm90 aWZ5IHdha2UobGlzdGVuKSB3YWtlX3VwX3NpZ25hbF9iYWNrZW5kc19zdGFydChub3RpZnkyKSBj aGVjayBjaGVjayBjaGVjayBub3RpZnkgY2hlY2sKLS0gCjIuNDMuMAoK --000000000000c7242706523db9de--