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 1rzbIG-005Chv-Pi for pgsql-hackers@arkaria.postgresql.org; Wed, 24 Apr 2024 12:00:09 +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 1rzbIF-00EcwI-6f for pgsql-hackers@arkaria.postgresql.org; Wed, 24 Apr 2024 12:00: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.94.2) (envelope-from ) id 1rzbIE-00Ecw7-QG for pgsql-hackers@lists.postgresql.org; Wed, 24 Apr 2024 12:00:06 +0000 Received: from mail-lf1-x131.google.com ([2a00:1450:4864:20::131]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rzbIB-002hTv-NZ for pgsql-hackers@lists.postgresql.org; Wed, 24 Apr 2024 12:00:05 +0000 Received: by mail-lf1-x131.google.com with SMTP id 2adb3069b0e04-51b526f0fc4so4066799e87.1 for ; Wed, 24 Apr 2024 05:00:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713960002; x=1714564802; darn=lists.postgresql.org; h=in-reply-to:from:references:cc:to:content-language:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=ZXhQT59LuMK2WvSatTcKBzMqxxveKyVRCr+WBZhOLms=; b=AAiLeJJHrsbVHF6FUm4SsPnaEeJzprjLrPCocX4FErhrh5XHH7H80ASdkH1CP2VnIO a5E2Z5/9W2VmoPbMPMD7veOeCz/oLnTX0DvoawguzPO3fq9YhVDL6muMb3I9j0s5GfQZ lPvukunv2Mix5+wpqr1JEE01YrifbuAp6yTa5ERnwAJ9fhpmXvvF2Qe/DGIRkm3z4D/+ VUp+MUuAiMje10kf8eiipQI/naoZ1QynC7K+MzljQ762+A19uCXl3EjpC2VLUwqnVO2H lCyzWzZewzQLBiiDeM68S8juMIbTKYWke0r5Z1lEc2OyXG+1Yc8sgxrdwZ3rm5l3Tt8/ Of6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713960002; x=1714564802; h=in-reply-to:from:references:cc:to:content-language:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=ZXhQT59LuMK2WvSatTcKBzMqxxveKyVRCr+WBZhOLms=; b=Q/2W2xw80phSMAgqxitsqMWBflXRg6WgsaGK+eTgAYXw2eaeJa3coanLQJkcEqwcXP puQBgzLiupxgE/eFkbdSeHKjUdRQXQtcBLl6CZvFjkdttA6cELMJkLY5Vd43f+393RGY +vInnOImYKRymCDPS0RL+UZmvbKTjVKX++3Ii2J/oiYnBkzdrmad0apsI8O0M3ECvkt1 gsvfMZG0G8May4rypYQ1lfKd9zdkyuhTfAPnvjryhE0OAC5c2QXpkiHJFjpSdoeiO3PP OwFYUBq+rXX6X9D5p+H42bPWehZD6pVUHppIfQZH92vtkEalx2utz9//Knedz2PNB3q1 456g== X-Gm-Message-State: AOJu0Yxay89gwVr+XjM4CdxhRlyZB8GOBvB3zbCncUcqh0z8/Q2GXK43 wLCHPFS6uYVqFWfIfXM+EIoPLzFq4QbveODOvofiW5jQOihnRz22 X-Google-Smtp-Source: AGHT+IE3vc9njQMtBU5QLw0uoVGk8u4QpymKnt8SKdjk8oaicqEy2bckMRG8a+ck9mR6zrmZSPuG2w== X-Received: by 2002:a05:6512:3da9:b0:51a:f596:9d53 with SMTP id k41-20020a0565123da900b0051af5969d53mr1917567lfv.42.1713960002171; Wed, 24 Apr 2024 05:00:02 -0700 (PDT) Received: from [1.0.0.7] ([178.155.18.59]) by smtp.gmail.com with ESMTPSA id u23-20020a196a17000000b00518bf00fca8sm2357966lfu.279.2024.04.24.05.00.01 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 24 Apr 2024 05:00:01 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------ksNGEtP94hDXUYH3PPFB2Si9" Message-ID: <62310067-6dc4-97ab-6724-7d3602b5056d@gmail.com> Date: Wed, 24 Apr 2024 15:00:00 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Subject: Re: Avoid orphaned objects dependencies, take 3 Content-Language: en-US To: Bertrand Drouvot Cc: pgsql-hackers@lists.postgresql.org References: From: Alexander Lakhin In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------ksNGEtP94hDXUYH3PPFB2Si9 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi Bertrand, 24.04.2024 11:38, Bertrand Drouvot wrote: >> Please find attached v2 that should not produce the issue anymore (I launched a >> lot of attempts without any issues). v1 was not strong enough as it was not >> always checking for the dependent object existence. v2 now always checks if the >> object still exists after the additional lock acquisition attempt while recording >> the dependency. >> >> I still need to think about v2 but in the meantime could you please also give >> v2 a try on you side? > I gave more thought to v2 and the approach seems reasonable to me. Basically what > it does is that in case the object is already dropped before we take the new lock > (while recording the dependency) then the error message is a "generic" one (means > it does not provide the description of the "already" dropped object). I think it > makes sense to write the patch that way by abandoning the patch's ambition to > tell the description of the dropped object in all the cases. > > Of course, I would be happy to hear others thought about it. > > Please find v3 attached (which is v2 with more comments). Thank you for the improved version! I can confirm that it fixes that case. I've also tested other cases that fail on master (most of them also fail with v1), please try/look at the attached script. (There could be other broken-dependency cases, of course, but I think I've covered all the representative ones.) All tested cases work correctly with v3 applied — I couldn't get broken dependencies, though concurrent create/drop operations can still produce the "cache lookup failed" error, which is probably okay, except that it is an INTERNAL_ERROR, which assumed to be not easily triggered by users. Best regards, Alexander --------------ksNGEtP94hDXUYH3PPFB2Si9 Content-Type: text/plain; charset=UTF-8; name="test-broken-deps.sh.txt" Content-Disposition: attachment; filename="test-broken-deps.sh.txt" Content-Transfer-Encoding: base64 aWYgWyAiJDEiID09ICJmdW5jdGlvbi1zY2hlbWEiIF07IHRoZW4KcmVzPTEKZm9yICgoaT0x O2k8PTMwMDtpKyspKTsgZG8KICAoIHsgZm9yICgobj0xO248PTIwO24rKykpOyBkbyBlY2hv ICJEUk9QIFNDSEVNQSBzOyI7IGRvbmUgfSB8IHBzcWwgKSA+cHNxbDEubG9nIDI+JjEgJiAK ICBlY2hvICIKQ1JFQVRFIFNDSEVNQSBzOwpDUkVBVEUgRlVOQ1RJT04gcy5mdW5jMSgpIFJF VFVSTlMgaW50IExBTkdVQUdFIFNRTCBBUyAnU0VMRUNUIDE7JzsKQ1JFQVRFIEZVTkNUSU9O IHMuZnVuYzIoKSBSRVRVUk5TIGludCBMQU5HVUFHRSBTUUwgQVMgJ1NFTEVDVCAyOyc7CkNS RUFURSBGVU5DVElPTiBzLmZ1bmMzKCkgUkVUVVJOUyBpbnQgTEFOR1VBR0UgU1FMIEFTICdT RUxFQ1QgMzsnOwpDUkVBVEUgRlVOQ1RJT04gcy5mdW5jNCgpIFJFVFVSTlMgaW50IExBTkdV QUdFIFNRTCBBUyAnU0VMRUNUIDQ7JzsKQ1JFQVRFIEZVTkNUSU9OIHMuZnVuYzUoKSBSRVRV Uk5TIGludCBMQU5HVUFHRSBTUUwgQVMgJ1NFTEVDVCA1Oyc7CiAgIiAgfCBwc3FsID5wc3Fs Mi5sb2cgMj4mMSAmCiAgd2FpdAogIHBzcWwgLWMgIkRST1AgU0NIRU1BIHMgQ0FTQ0FERSIg PnBzcWwzLmxvZyAyPiYxCmRvbmUKZWNobyAiClNFTEVDVCBwZ19pZGVudGlmeV9vYmplY3Qo J3BnX3Byb2MnOjpyZWdjbGFzcywgcHAub2lkLCAwKSwgcHAub2lkIEZST00gcGdfcHJvYyBw cAogIExFRlQgSk9JTiBwZ19uYW1lc3BhY2UgcG4gT04gcHAucHJvbmFtZXNwYWNlID0gcG4u b2lkIFdIRVJFIHBuLm9pZCBJUyBOVUxMIiB8IHBzcWwKc2xlZXAgMQpncmVwICd3YXMgdGVy bWluYXRlZCcgc2VydmVyLmxvZyB8fCByZXM9MApmaQoKCmlmIFsgIiQxIiA9PSAiZnVuY3Rp b24tZnVuY3Rpb24iIF07IHRoZW4KcmVzPTEKZm9yICgoaT0xO2k8PTEwMDA7aSsrKSk7IGRv CiggeyBmb3IgKChuPTE7bjw9MjA7bisrKSk7IGRvIGVjaG8gIkRST1AgRlVOQ1RJT04gZigp OyI7IGRvbmUgfSB8IHBzcWwgKSA+cHNxbDEubG9nIDI+JjEgJgooIGVjaG8gIgpDUkVBVEUg RlVOQ1RJT04gZigpIFJFVFVSTlMgaW50IExBTkdVQUdFIFNRTCBSRVRVUk4gMTsKQ1JFQVRF IEZVTkNUSU9OIGYxKCkgUkVUVVJOUyBpbnQgTEFOR1VBR0UgU1FMIFJFVFVSTiBmKCkgKyAx OwpDUkVBVEUgRlVOQ1RJT04gZjIoKSBSRVRVUk5TIGludCBMQU5HVUFHRSBTUUwgUkVUVVJO IGYoKSArIDI7CkNSRUFURSBGVU5DVElPTiBmMygpIFJFVFVSTlMgaW50IExBTkdVQUdFIFNR TCBSRVRVUk4gZigpICsgMzsKQ1JFQVRFIEZVTkNUSU9OIGY0KCkgUkVUVVJOUyBpbnQgTEFO R1VBR0UgU1FMIFJFVFVSTiBmKCkgKyA0OwpDUkVBVEUgRlVOQ1RJT04gZjUoKSBSRVRVUk5T IGludCBMQU5HVUFHRSBTUUwgUkVUVVJOIGYoKSArIDU7CiIgfCBwc3FsICkgPnBzcWwyLmxv ZyAyPiYxICYKd2FpdAplY2hvICJBTFRFUiBGVU5DVElPTiBmMSgpIFJFTkFNRSBUTyBmMDE7 IFNFTEVDVCBmMDEoKSIgfCBwc3FsIDI+JjEgfCBncmVwICdjYWNoZSBsb29rdXAgZmFpbGVk JyAmJiB7IGVjaG8gIm9uIGl0ZXJhdGlvbiAkaSI7IHJlcz0xOyBicmVhazsgfQoKcHNxbCAt YyAiRFJPUCBGVU5DVElPTiBmKCkgQ0FTQ0FERSIgPnBzcWwzLmxvZyAyPiYxCmRvbmUKCmdy ZXAgLUEyICdjYWNoZSBsb29rdXAgZmFpbGVkJyBzZXJ2ZXIubG9nIHx8IHJlcz0wCmZpCgoK aWYgWyAiJDEiID09ICJmdW5jdGlvbi1yZXR0eXBlIiBdOyB0aGVuCnJlcz0wCmZvciAoKGk9 MTtpPD01MDAwO2krKykpOyBkbwooIGVjaG8gIgpDUkVBVEUgRE9NQUlOIGlkIEFTIGludDsK Q1JFQVRFIEZVTkNUSU9OIGYxKCkgUkVUVVJOUyBpZCBMQU5HVUFHRSBTUUwgUkVUVVJOIDE7 CkNSRUFURSBGVU5DVElPTiBmMigpIFJFVFVSTlMgaWQgTEFOR1VBR0UgU1FMIFJFVFVSTiAy OwpDUkVBVEUgRlVOQ1RJT04gZjMoKSBSRVRVUk5TIGlkIExBTkdVQUdFIFNRTCBSRVRVUk4g MzsKQ1JFQVRFIEZVTkNUSU9OIGY0KCkgUkVUVVJOUyBpZCBMQU5HVUFHRSBTUUwgUkVUVVJO IDQ7CkNSRUFURSBGVU5DVElPTiBmNSgpIFJFVFVSTlMgaWQgTEFOR1VBR0UgU1FMIFJFVFVS TiA1OwoiIHwgcHNxbCApID5wc3FsMS5sb2cgMj4mMSAmCiggZWNobyAiU0VMRUNUIHBnX3Ns ZWVwKHJhbmRvbSgpIC8gMTAwKTsgRFJPUCBET01BSU4gaWQiICB8IHBzcWwgKSA+cHNxbDIu bG9nIDI+JjEgJgp3YWl0Cgpwc3FsIC1jICJTRUxFQ1QgZjEoKSIgMj4mMSB8IGdyZXAgJ2Nh Y2hlIGxvb2t1cCBmYWlsZWQnICYmIHsgZWNobyAib24gaXRlcmF0aW9uICRpIjsgcmVzPTE7 IGJyZWFrOyB9CnBzcWwgLWMgIkRST1AgRE9NQUlOIGlkIENBU0NBREUiID5wc3FsMy5sb2cg Mj4mMQpkb25lCgpbICRyZXMgPT0gMSBdICYmIHBzcWwgLWMgIlNFTEVDVCBwbi5vaWQsIHBy b25hbWUsIHByb25hbWVzcGFjZSwgcHJvb3duZXIsIHByb2xhbmcsIHByb3JldHR5cGUgRlJP TSBwZ19wcm9jIHBwIElOTkVSIEpPSU4gcGdfbmFtZXNwYWNlIHBuIE9OIChwcC5wcm9uYW1l c3BhY2UgPSBwbi5vaWQpIFdIRVJFIHBuLm5zcG5hbWU9J3B1YmxpYyciCmZpCgoKaWYgWyAi JDEiID09ICJmdW5jdGlvbi1hcmd0eXBlIiBdOyB0aGVuCnJlcz0wCmZvciAoKGk9MTtpPD01 MDAwO2krKykpOyBkbwooIGVjaG8gIgpDUkVBVEUgRE9NQUlOIGlkIEFTIGludDsKQ1JFQVRF IEZVTkNUSU9OIGYxKGkgaWQpIFJFVFVSTlMgaW50IExBTkdVQUdFIFNRTCBSRVRVUk4gMTsK Q1JFQVRFIEZVTkNUSU9OIGYyKGkgaWQpIFJFVFVSTlMgaW50IExBTkdVQUdFIFNRTCBSRVRV Uk4gMjsKQ1JFQVRFIEZVTkNUSU9OIGYzKGkgaWQpIFJFVFVSTlMgaW50IExBTkdVQUdFIFNR TCBSRVRVUk4gMzsKQ1JFQVRFIEZVTkNUSU9OIGY0KGkgaWQpIFJFVFVSTlMgaW50IExBTkdV QUdFIFNRTCBSRVRVUk4gNDsKQ1JFQVRFIEZVTkNUSU9OIGY1KGkgaWQpIFJFVFVSTlMgaW50 IExBTkdVQUdFIFNRTCBSRVRVUk4gNTsKIiB8IHBzcWwgKSA+cHNxbDEubG9nIDI+JjEgJgoo IGVjaG8gIlNFTEVDVCBwZ19zbGVlcChyYW5kb20oKSAvIDEwMDApOyBEUk9QIERPTUFJTiBp ZCIgfCBwc3FsICkgPnBzcWwyLmxvZyAyPiYxICYKd2FpdAoKcHNxbCAtYyAiU0VMRUNUIGYx KDEpIiAyPiYxIHwgZ3JlcCAnY2FjaGUgbG9va3VwIGZhaWxlZCcgJiYgeyBlY2hvICJvbiBp dGVyYXRpb24gJGkiOyByZXM9MTsgYnJlYWs7IH0KcHNxbCAtcSAtYyAiRFJPUCBET01BSU4g aWQgQ0FTQ0FERSIgPi9kZXYvbnVsbCAyPiYxCmRvbmUKCmdyZXAgLUExICdjYWNoZSBsb29r dXAgZmFpbGVkJyBzZXJ2ZXIubG9nIHx8IHJlcz0wCmZpCgoKaWYgWyAiJDEiID09ICJkb21h aW4tZG9tYWluIiBdOyB0aGVuCnJlcz0wCmZvciAoKGk9MTtpPD0zMDtpKyspKTsgZG8KeyBl Y2hvICJDUkVBVEUgRE9NQUlOIGlkIEFTIGludDsiOyBmb3IgKChkPTE7ZDwxMDA7ZCsrKSk7 IGRvIGVjaG8gIkNSRUFURSBET01BSU4gaWQkZCBBUyBpZDsiOyBkb25lOyBlY2hvICJEUk9Q IERPTUFJTiBpZCBDQVNDQURFOyI7IH0gfCBwc3FsID5wc3FsMC5sb2cgMj4mMQp7IGZvciAo KG49MTtuPD0xMDA7bisrKSk7IGRvIGVjaG8gIkNSRUFURSBET01BSU4gaWQgQVMgaW50OyI7 IGZvciAoKGQ9MTtkPDEwMDtkKyspKTsgZG8gZWNobyAiQ1JFQVRFIERPTUFJTiBpZCRkIEFT IGlkOyI7IGRvbmU7IGVjaG8gIkRST1AgRE9NQUlOIGlkIENBU0NBREU7IjsgZG9uZTsgfSB8 IE9OX0VSUk9SX1NUT1A9MSBwc3FsID5wc3FsMS5sb2cgMj4mMSAmCnsgZm9yICgobj0xO248 PTEwMDtuKyspKTsgZG8gZWNobyAiU0VMRUNUIHBnX3NsZWVwKHJhbmRvbSgpIC8gMTAwKTsg RFJPUCBET01BSU4gaWQ7IjsgZG9uZTsgfSB8IHBzcWwgPnBzcWwyLmxvZyAyPiYxICYKd2Fp dAogIApwc3FsIC1jICJDUkVBVEUgVEFCTEUgdDEoaSBpZDEpIiAyPiYxIHwgZ3JlcCAnY2Fj aGUgbG9va3VwIGZhaWxlZCcgJiYgeyBlY2hvICJvbiBpdGVyYXRpb24gJGkiOyByZXM9MTsg YnJlYWs7IH0KZG9uZQpncmVwIC1BMSAnY2FjaGUgbG9va3VwIGZhaWxlZCcgc2VydmVyLmxv Zwpwc3FsIC1jICJcXGREKyBpKiIKZmkKCgppZiBbICIkMSIgPT0gInRhYmxlLXRyaWdnZXIi IF07IHRoZW4KcmVzPTEKZm9yICgoaT0xO2k8PTEwMDtpKyspKTsgZG8KcHNxbCAtYyAiRFJP UCBUQUJMRSBJRiBFWElTVFMgdCIKcHNxbCAtYyAiQ1JFQVRFIFRBQkxFIHQoaSBpbnQsIGMg dGV4dCkiCiggeyBmb3IgKChuPTE7bjw9MzA7bisrKSk7IGRvIGVjaG8gIkRST1AgRlVOQ1RJ T04gdHJpZ2dlcl9mdW5jKCk7IjsgZG9uZSB9IHwgcHNxbCApID4+cHNxbDEubG9nIDI+JjEg JgooIGVjaG8gIgpDUkVBVEUgRlVOQ1RJT04gdHJpZ2dlcl9mdW5jKCkgUkVUVVJOUyB0cmln Z2VyIExBTkdVQUdFIHBscGdzcWwgQVMgJwpCRUdJTgogICAgUkFJU0UgTk9USUNFICcndHJp Z2dlcl9mdW5jKCUpIGNhbGxlZDogYWN0aW9uID0gJSwgd2hlbiA9ICUsIGxldmVsID0gJScn LCBUR19BUkdWWzBdLCBUR19PUCwgVEdfV0hFTiwgVEdfTEVWRUw7CiAgICBSRVRVUk4gTlVM TDsKRU5EOyc7CkNSRUFURSBUUklHR0VSIG1vZGlmaWVkX2MxIEJFRk9SRSBVUERBVEUgT0Yg YyBPTiB0CkZPUiBFQUNIIFJPVyBXSEVOIChPTEQuYyA8PiBORVcuYykgRVhFQ1VURSBQUk9D RURVUkUgdHJpZ2dlcl9mdW5jKCdtb2RpZmllZF9jJyk7CkNSRUFURSBUUklHR0VSIG1vZGlm aWVkX2MyIEJFRk9SRSBVUERBVEUgT0YgYyBPTiB0CkZPUiBFQUNIIFJPVyBXSEVOIChPTEQu YyA8PiBORVcuYykgRVhFQ1VURSBQUk9DRURVUkUgdHJpZ2dlcl9mdW5jKCdtb2RpZmllZF9j Jyk7CkNSRUFURSBUUklHR0VSIG1vZGlmaWVkX2MzIEJFRk9SRSBVUERBVEUgT0YgYyBPTiB0 CkZPUiBFQUNIIFJPVyBXSEVOIChPTEQuYyA8PiBORVcuYykgRVhFQ1VURSBQUk9DRURVUkUg dHJpZ2dlcl9mdW5jKCdtb2RpZmllZF9jJyk7CkNSRUFURSBUUklHR0VSIG1vZGlmaWVkX2M0 IEJFRk9SRSBVUERBVEUgT0YgYyBPTiB0CkZPUiBFQUNIIFJPVyBXSEVOIChPTEQuYyA8PiBO RVcuYykgRVhFQ1VURSBQUk9DRURVUkUgdHJpZ2dlcl9mdW5jKCdtb2RpZmllZF9jJyk7CkNS RUFURSBUUklHR0VSIG1vZGlmaWVkX2M1IEJFRk9SRSBVUERBVEUgT0YgYyBPTiB0CkZPUiBF QUNIIFJPVyBXSEVOIChPTEQuYyA8PiBORVcuYykgRVhFQ1VURSBQUk9DRURVUkUgdHJpZ2dl cl9mdW5jKCdtb2RpZmllZF9jJyk7CiIgfCBwc3FsICkgPj5wc3FsMi5sb2cgMj4mMSAmCndh aXQKcHNxbCAtYyAiRFJPUCBGVU5DVElPTiB0cmlnZ2VyX2Z1bmMoKSBDQVNDQURFIiA+cHNx bDMubG9nIDI+JjEKCnBzcWwgLWMgIklOU0VSVCBJTlRPIHQgVkFMVUVTKDEsICdhJykiCnBz cWwgLWMgIlVQREFURSB0IFNFVCBjPSdiJyIgMj4mMSB8IGdyZXAgJ2NhY2hlIGxvb2t1cCBm YWlsZWQnICYmIHsgZWNobyAib24gaXRlcmF0aW9uICRpIjsgcmVzPTE7IGJyZWFrOyB9CmRv bmUKCmdyZXAgLUEyICdjYWNoZSBsb29rdXAgZmFpbGVkJyBzZXJ2ZXIubG9nIHx8IHJlcz0w CmZpCgoKaWYgWyAiJDEiID09ICJ0YWJsZS1jb2x0eXBlIiBdOyB0aGVuCnJlcz0wCm51bWNs aWVudHM9MjAKZm9yICgoaT0xO2k8PTUwO2krKykpOyBkbwpmb3IgKChjPTE7Yzw9bnVtY2xp ZW50cztjKyspKTsgZG8KICBlY2hvICJTRUxFQ1QgcGdfc2xlZXAocmFuZG9tKCkgLyAyMDAw KTsgRFJPUCBET01BSU4gaWRfJGMgUkVTVFJJQ1QiIHwgcHNxbCA+cHNxbDEtJGMubG9nIDI+ JjEgJgogIGVjaG8gIgpDUkVBVEUgRE9NQUlOIGlkXyRjIGludDsKQ1JFQVRFIFRBQkxFIHRi bF8kYyAoaSBpZF8kYyk7CiAgIiB8IHBzcWwgPnBzcWwyLSRjLmxvZyAyPiYxICYKZG9uZQp3 YWl0CmZvciAoKGM9MTtjPD1udW1jbGllbnRzO2MrKykpOyBkbwogIGVjaG8gIlNFTEVDVCAq IEZST00gdGJsXyRjIiB8IHBzcWwgMj4mMSB8IGdyZXAgJ2NhY2hlIGxvb2t1cCBmYWlsZWQn ICYmIHsgZWNobyAib24gaXRlcmF0aW9uICRpIjsgcmVzPTE7IGJyZWFrOyB9CiAgZWNobyAi RFJPUCBET01BSU4gaWRfJGMgQ0FTQ0FERTsgRFJPUCBUQUJMRSB0YmxfJGMiIHwgcHNxbCA+ cHNxbDMtJGMubG9nIDI+JjEKZG9uZQpbICRyZXMgPT0gMSBdICYmIGJyZWFrOwpkb25lCmdy ZXAgLUEyICdjYWNoZSBsb29rdXAgZmFpbGVkJyBzZXJ2ZXIubG9nCmZpCgoKaWYgWyAiJDEi ID09ICJ0eXBlLXNoZWxsdHlwZSIgXTsgdGhlbgpyZXM9MApudW1jbGllbnRzPTQwCmZvciAo KGk9MTtpPD0xMDA7aSsrKSk7IGRvCmZvciAoKGM9MTtjPD1udW1jbGllbnRzO2MrKykpOyBk bwogIGVjaG8gIkRST1AgRlVOQ1RJT04gSUYgRVhJU1RTIHhpbnQ4aW5fJGMsIHhpbnQ4b3V0 XyRjIENBU0NBREUiIHwgcHNxbCA+cHNxbDAtJGMubG9nIDI+JjEKZG9uZQpmb3IgKChjPTE7 Yzw9bnVtY2xpZW50cztjKyspKTsgZG8KICBlY2hvICIKQ1JFQVRFIFRZUEUgeGludDhfJGM7 CkNSRUFURSBGVU5DVElPTiB4aW50OGluXyRjKGNzdHJpbmcpIFJFVFVSTlMgeGludDhfJGMg SU1NVVRBQkxFIFNUUklDVCBMQU5HVUFHRSBJTlRFUk5BTCBBUyAnaW50OGluJzsKQ1JFQVRF IEZVTkNUSU9OIHhpbnQ4b3V0XyRjKHhpbnQ4XyRjKSBSRVRVUk5TIGNzdHJpbmcgSU1NVVRB QkxFIFNUUklDVCBMQU5HVUFHRSBJTlRFUk5BTCBBUyAnaW50OG91dCc7CkNSRUFURSBUWVBF IHhpbnQ4XyRjKGlucHV0ID0geGludDhpbl8kYywgb3V0cHV0ID0geGludDhvdXRfJGMsIGxp a2UgPSBpbnQ4KTsKICAiIHwgcHNxbCA+cHNxbDEtJGMubG9nIDI+JjEgJgogIGVjaG8gIlNF TEVDVCBwZ19zbGVlcChyYW5kb20oKSAvIDEwMDApOyBEUk9QIFRZUEUgeGludDhfJGMgQ0FT Q0FERTsiIHwgcHNxbCA+cHNxbDItJGMubG9nIDI+JjEgJgpkb25lCndhaXQKZ3JlcCAnVFJB UCcgc2VydmVyLmxvZyAmJiB7IGVjaG8gIm9uIGl0ZXJhdGlvbiAkaSI7IHJlcz0xOyBicmVh azsgfQpkb25lCmZpCgoKaWYgWyAiJDEiID09ICJ0eXBlLXNjaGVtYSIgXTsgdGhlbgpyZXM9 MApudW1jbGllbnRzPTIwCmZvciAoKGk9MTtpPD0xMDA7aSsrKSk7IGRvCmZvciAoKGM9MTtj PD1udW1jbGllbnRzO2MrKykpOyBkbwogIGVjaG8gIgpDUkVBVEUgU0NIRU1BIHNfJGM7CkNS RUFURSBET01BSU4gc18kYy5kb21fJGMgaW50NDsKQ1JFQVRFIFRBQkxFIHRibF8kYyAoaSBk b21fJGMpOwogICIgfCBwc3FsID5wc3FsMS0kYy5sb2cgMj4mMSAmCiAgZWNobyAiRFJPUCBT Q0hFTUEgc18kYyBSRVNUUklDVCIgfCBwc3FsID5wc3FsMi0kYy5sb2cgMj4mMSAmCmRvbmUK d2FpdApwZ19kdW1wIC1mIGRiLmR1bXAgfHwgeyBlY2hvICJvbiBpdGVyYXRpb24gJGkiOyBy ZXM9MTsgYnJlYWs7IH0KZm9yICgoYz0xO2M8PW51bWNsaWVudHM7YysrKSk7IGRvCiAgZWNo byAiRFJPUCBTQ0hFTUEgc18kYyBDQVNDQURFIiB8IHBzcWwgPnBzcWwzLSRjLmxvZyAyPiYx CmRvbmUKZG9uZQpmaQoKCmlmIFsgIiQxIiA9PSAidHNfdGVtcGxhdGUtc2NoZW1hIiBdOyB0 aGVuCnJlcz0wCm51bWNsaWVudHM9MjAKZm9yICgoaT0xO2k8PTEwMDtpKyspKTsgZG8KZm9y ICgoYz0xO2M8PW51bWNsaWVudHM7YysrKSk7IGRvCiAgZWNobyAiCkNSRUFURSBTQ0hFTUEg c18kYzsKQ1JFQVRFIFRFWFQgU0VBUkNIIFRFTVBMQVRFIHNfJGMudHN0XyRjKGxleGl6ZT1k c2ltcGxlX2xleGl6ZSk7CiAgIiB8IHBzcWwgPnBzcWwxLSRjLmxvZyAyPiYxICYKICBlY2hv ICJEUk9QIFNDSEVNQSBzXyRjIFJFU1RSSUNUOyIgfCBwc3FsID5wc3FsMi0kYy5sb2cgMj4m MSAmCmRvbmUKd2FpdApwZ19kdW1wIC1mIGRiLmR1bXAgfHwgeyBlY2hvICJvbiBpdGVyYXRp b24gJGkiOyByZXM9MTsgYnJlYWs7IH0KZm9yICgoYz0xO2M8PW51bWNsaWVudHM7YysrKSk7 IGRvCiAgZWNobyAiRFJPUCBTQ0hFTUEgc18kYyBDQVNDQURFOyIgfCBwc3FsID5wc3FsMy0k Yy5sb2cgMj4mMQpkb25lCmRvbmUKZmkKCgppZiBbICIkMSIgPT0gImNhc3Qtc2NoZW1hIiBd OyB0aGVuCnJlcz0wCm51bWNsaWVudHM9MjAKZm9yICgoaT0xO2k8PTEwMDtpKyspKTsgZG8K Zm9yICgoYz0xO2M8PW51bWNsaWVudHM7YysrKSk7IGRvCiAgZWNobyAiCkNSRUFURSBTQ0hF TUEgc18kYzsKQ1JFQVRFIERPTUFJTiBzXyRjLmRvbV8kYyBpbnQ0OwpDUkVBVEUgVEFCTEUg dGJsXyRjIChpIGRvbV8kYyk7CiAgIiB8IHBzcWwgPnBzcWwxLSRjLmxvZyAyPiYxICYKICBl Y2hvICJEUk9QIFNDSEVNQSBzXyRjIFJFU1RSSUNUOyIgfCBwc3FsID5wc3FsMi0kYy5sb2cg Mj4mMSAmCmRvbmUKd2FpdApwZ19kdW1wIC1mIGRiLmR1bXAgfHwgeyBlY2hvICJvbiBpdGVy YXRpb24gJGkiOyByZXM9MTsgYnJlYWs7IH0KZm9yICgoYz0xO2M8PW51bWNsaWVudHM7Yysr KSk7IGRvCiAgZWNobyAiRFJPUCBTQ0hFTUEgc18kYyBDQVNDQURFOyIgfCBwc3FsID5wc3Fs My0kYy5sb2cgMj4mMQpkb25lCmRvbmUKZmkKCgppZiBbICIkMSIgPT0gImNhc3QtZnVuY3Rp b24iIF07IHRoZW4KcmVzPTAKZWNobyAiCkNSRUFURSBUWVBFIHR0OwpDUkVBVEUgRlVOQ1RJ T04gdHRfaW4oY3N0cmluZykgUkVUVVJOUyB0dCBBUyAndGV4dGluJyBMQU5HVUFHRSBpbnRl cm5hbCBTVFJJQ1QgSU1NVVRBQkxFOwpDUkVBVEUgRlVOQ1RJT04gdHRfb3V0KHR0KSBSRVRV Uk5TIGNzdHJpbmcgQVMgJ3RleHRvdXQnIExBTkdVQUdFIGludGVybmFsIFNUUklDVCBJTU1V VEFCTEU7CgpDUkVBVEUgVFlQRSB0dCAoaW50ZXJuYWxsZW5ndGggPSB2YXJpYWJsZSwgaW5w dXQgPSB0dF9pbiwgb3V0cHV0ID0gdHRfb3V0LCBhbGlnbm1lbnQgPSBpbnQ0KTsKIiB8IHBz cWwKCm51bWNsaWVudHM9Mgpmb3IgKChuPTE7bjw9NTAwO24rKykpOyBkbwogIGZvciAoKGk9 MTtpPD0kbnVtY2xpZW50cztpKyspKTsgZG8KY2F0IDw8ICdFT0YnIHwgcHNxbCA+cHNxbC0k aS5sb2cgMj4mMSAmCkRST1AgQ0FTVCAoaW50NCBBUyB0dCk7CkNSRUFURSBGVU5DVElPTiBj ZihpbnQ0KSBSRVRVUk5TIHR0IExBTkdVQUdFIFNRTCBBUwogICQkIFNFTEVDVCAoJDE6OnRl eHQpOjp0dDsgJCQ7CkNSRUFURSBDQVNUIChpbnQ0IEFTIHR0KSBXSVRIIEZVTkNUSU9OIGNm KGludDQpIEFTIElNUExJQ0lUOwpEUk9QIEZVTkNUSU9OIGNmKGludDQpIENBU0NBREU7CkVP RgogIGRvbmUKICB3YWl0CiAgZWNobyAiU0VMRUNUIDEyMzQ6OmludDQ6OnR0OyIgfCBwc3Fs IDI+JjEgfCBncmVwICdjYWNoZSBsb29rdXAgZmFpbGVkIGZvciBmdW5jdGlvbicKICBwZ19k dW1wIC1mIGRiLmR1bXAgfHwgeyBlY2hvICJvbiBpdGVyYXRpb24gJGkiOyByZXM9MTsgYnJl YWs7IH0KZG9uZQpmaQoKCmlmIFsgIiQxIiA9PSAic2VydmVyLWZkd193cmFwcGVyIiBdOyB0 aGVuCnJlcz0wCm51bWNsaWVudHM9MjAKZm9yICgoaT0xO2k8PTIwMDtpKyspKTsgZG8KZm9y ICgoYz0xO2M8PW51bWNsaWVudHM7YysrKSk7IGRvCiAgZWNobyAiCkNSRUFURSBGT1JFSUdO IERBVEEgV1JBUFBFUiBmZHdfd3JhcHBlcl8kYzsKQ1JFQVRFIFNFUlZFUiB0c3RfJGMgRk9S RUlHTiBEQVRBIFdSQVBQRVIgZmR3X3dyYXBwZXJfJGM7CiAgIiB8IHBzcWwgPnBzcWwxLSRj LmxvZyAyPiYxICYKICBlY2hvICJEUk9QIEZPUkVJR04gREFUQSBXUkFQUEVSIGZkd193cmFw cGVyXyRjIFJFU1RSSUNUOyIgfCBwc3FsID5wc3FsMi0kYy5sb2cgMj4mMSAmCmRvbmUKd2Fp dApwZ19kdW1wIC1mIGRiLmR1bXAgfHwgeyBlY2hvICJvbiBpdGVyYXRpb24gJGkiOyByZXM9 MTsgYnJlYWs7IH0KZm9yICgoYz0xO2M8PW51bWNsaWVudHM7YysrKSk7IGRvCiAgZWNobyAi RFJPUCBGT1JFSUdOIERBVEEgV1JBUFBFUiBmZHdfd3JhcHBlcl8kYyBDQVNDQURFOyIgfCBw c3FsID5wc3FsMy0kYy5sb2cgMj4mMQpkb25lCmRvbmUKZmkK --------------ksNGEtP94hDXUYH3PPFB2Si9--