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.98.2) (envelope-from ) id 1xClE9-000000007Pj-109B for pgsql-bugs@arkaria.postgresql.org; Fri, 02 Oct 2026 21:55:38 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.98.2) (envelope-from ) id 1xClE8-00000001SO7-110Y for pgsql-bugs@arkaria.postgresql.org; Fri, 02 Oct 2026 21:55:36 +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.98.2) (envelope-from ) id 1xClE7-00000001SNy-3TmB for pgsql-bugs@lists.postgresql.org; Fri, 02 Oct 2026 21:55:35 +0000 Received: from lahtoruutu.iki.fi ([2a0b:5c81:1c1::37]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1xClE5-000000006Gd-0xwn for pgsql-bugs@lists.postgresql.org; Fri, 02 Oct 2026 21:55:35 +0000 Received: from [0.0.0.0] (unknown [75.125.238.33]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: hlinnaka) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4hxMz16VN2z49Q1d; Sat, 03 Oct 2026 00:55:25 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1790978126; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=gScH2EFNZsCK0/5SGpM4w/A5clZhr5cQj7oJOcThWe8=; b=DN8T3VbjriXVmos79cAXHqruLVOntQa50tqjT0I1o607lbf5PHhHR4wacBv4bGPdTzuGd+ /CznXoZAFqpBu+f6pQCmBSu1NFajDZx5+dVfoX8WWBxiR1O8goZhoFZR+p2Sc6FH9kxKrJ HjUwFXaJ04kFX9B6uQ6QVuNgR1KWvLNsPnGXKAquhzsR1LJNAghkBAk82WnkBM28g7VbsS QPtz7jqS6JRQFL0qG2QblnlerKmYEdVNHq0eEmt93D8iilhXXG8ODG0XqwuesIuKj8mNdr 35DS+l0wFUUfWcZSHGG6GqDH0Lu30fr0VZysNZNTyS57lQnYWoUozsuNu+kvbQ== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1790978126; b=rQ2E+BjH7UuwQSd5cQKCD5/eZ6HxxarL4dsTDj4nbMQZZ7AZGOYx93NxGNM5skAlh3+LnL D7QKHDj5f7/otMIrgZuYrIFgytIhcZ3qAuk5LyomGJyiFZX6+CvC6LkKTTdCV0JnE0JkKh zaYcn6mtw+DiYKm/jKBBLZEtCcnQqyppOKM2CqSoF6ehDfxfs+68M2z8Rc0HjlqV8vZcO2 Ddm/G8OoCyorzLC2RXHX0LXBR4Z0PpeHFjW7Ak/HIOpWCuewOtfitkhxNzE7dFkrhisOup t+BuWrMJoK0jK7TAEIIf/38xn1dcCqp0V0EAPmvdTbI4eT3T9U17TqRfmdT7aA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1790978126; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=gScH2EFNZsCK0/5SGpM4w/A5clZhr5cQj7oJOcThWe8=; b=iEvCzsVvhriurHa9eFInl2pNhoG56jkD3+vQrdbc/VRj1htyjQivhh88dNcVCzwV4Eu0DY ydFiKZuJ7WKMdC8lTiaJcg77i+PE5cZiwBugyfIIHBWwOVvrPIHpSba8WP07+M1enr/tKQ Mti6l59/AB7nAhb2JX7q+9637FdSXmAfw2vz+hE8ywVkEhZ3iDN+Z25Jrwxt8uIFIOTzFr 6nn1LUkDOInIKbhY9pNvETFMRZbVwdYItQzn/0Z3xlHSlWskR9i2RJDZ8DAlsZIEpPki7m 13D947p0Vnjd4GdeOWgUfsa1TBLvmX7wbjeNHR86nDm2y3QB93iIiKK6867vdg== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=hlinnaka smtp.mailfrom=hlinnaka@iki.fi Content-Type: multipart/mixed; boundary="------------dldfEPPxHNKD222soE6d5nbk" Message-ID: <3e128ea7-8cae-4a48-9d7c-9a032e7633f4@iki.fi> Date: Sat, 3 Oct 2026 00:55:25 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: BUG #19628: Uninterruptible vacuum during hash index processing To: mostafa nabil , Kirill Reshke , pgsql-bugs@lists.postgresql.org, sk@zsrv.org References: <19628-c2b17d358181a1ea@postgresql.org> Content-Language: en-US From: Heikki Linnakangas 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. --------------dldfEPPxHNKD222soE6d5nbk Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 02/10/2026 12:21, mostafa nabil wrote: > Hi Kirill, > > Thanks again for the review. Did you get a chance to look at v2? It > removes the vacuum_delay_point() call in hashbucketcleanup() as you > suggested, and keeps the check at the top of hashbulkdelete()'s > per-bucket loop. I had a look at this. Some further fixes: Do we have more places where we call vacuum_delay_point() while holding locks? It seems like a bad idea to ever do that -- you don't want to sleep while holding locks. I added an "Assert(INTERRUPTS_CAN_BE_PROCESSED())" into vacuum_cost_delay() and ran the regression tests, and that indeed revealed a few more places that did that. The attached patch removes or moves those vacuum_delay_point() calls too. I didn't include the assertion in the patch, because I'm afraid there might be more places that we've missed, including in extensions. After fixing those, if you ever do call vacuum_cost_delay_point() while holding a lock, e.g. from an extension or if we missed a caller, I think you don't really want to sleep. And you definitely don't want to call ProcessConfigFile() while in a critical section. So I added a quick exit to vacuum_delay_point() if it's called with !INTERRUPTS_CAN_BE_PROCESSED(). What do you think? - Heikki --------------dldfEPPxHNKD222soE6d5nbk Content-Type: text/x-patch; charset=UTF-8; name="v3-0001-Don-t-call-vacuum_delay_point-while-holding-locks.patch" Content-Disposition: attachment; filename*0="v3-0001-Don-t-call-vacuum_delay_point-while-holding-locks.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA4MGNkZjRmMzQwN2QzNGJkY2ZjODYyYThiMTE1MGFiNTM1MjRkNzA2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBIZWlra2kgTGlubmFrYW5nYXMgPGhlaWtraS5saW5u YWthbmdhc0Bpa2kuZmk+CkRhdGU6IFNhdCwgMyBPY3QgMjAyNiAwMDo1MzoxOCArMDMwMApT dWJqZWN0OiBbUEFUQ0ggdjMgMS8xXSBEb24ndCBjYWxsIHZhY3V1bV9kZWxheV9wb2ludCgp IHdoaWxlIGhvbGRpbmcgbG9ja3MKCkl0J3MgYSBiYWQgaWRlYSB0byBzbGVlcCB3aGlsZSBo b2xkaW5nIGxvY2tzLCBiZWNhdXNlIHlvdSBtaWdodCBibG9jawphbm90aGVyIHByb2Nlc3Mg dGhhdCB3YW50cyB0byBhY3F1aXJlIHRoZSBzYW1lIGxvY2suICBTbyBhdm9pZCBjYWxsaW5n CnZhY3V1bV9kZWxheV9wb2ludCgpIHdoaWxlIGhvbGRpbmcgbG9ja3MuCgpUaGVyZSB3ZXJl IGEgZmV3IHBsYWNlcyB0aGF0IGRpZCB0aGF0LCB3aGljaCBJIGZvdW5kIGJ5IGFkZGluZyBh bgoiQXNzZXJ0KElOVEVSUlVQVFNfQ0FOX0JFX1BST0NFU1NFRCgpKSIgaW50byB2YWN1dW1f ZGVsYXlfcG9pbnQoKSBhbmQKcnVubmluZyB0aGUgcmVncmVzc2lvbiB0ZXN0cy4gIEkgZGlk bid0IGluY2x1ZGUgdGhhdCBBc3NlcnQgaW4gdGhpcwpjb21taXQsIGJlY2F1c2UgdGhlcmUg bWlnaHQgYmUgbW9yZSBwbGFjZXMgdGhhdCBkbyB0aGF0IHRoYXQgYXJlIG5vdApjb3ZlcmVk IGJ5IHRoZSByZWdyZXNzaW9uIHRlc3RzLCBpbmNsdWRpbmcgZXh0ZW5zaW9ucy4gIEJ1dCBJ IGRpZCBhZGQKYSBydW50aW1lIGNoZWNrIHRoYXQgYmFpbHMgb3V0IG9mIHZhY3V1bV9kZWxh eV9wb2ludCgpIHF1aWNrbHkgaWYKaW50ZXJydXB0cyBjYW5ub3QgYmUgcHJvY2Vzc2VkIGF0 IHRoZSB0aW1lLiAgVGhhdCBwcmV2ZW50cyB0aGUgc2xlZXAKdGhhdCBtaWdodCBibG9jayBv dGhlcnMsIGFuZCBpdCBhbHNvIGF2b2lkcyBwb3RlbnRpYWxseSBjYWxsaW5nClByb2Nlc3ND b25maWdGaWxlKCkgd2hpbGUgaW4gYSBjcml0aWNhbCBzZWN0aW9uLCBpZgp2YWN1dW1fZGVs YXlfcG9pbnQoKSB3YXMgZXZlciBjYWxsZWQgaW4gb25lLgoKSW4gZ2luSW5zZXJ0Q2xlYW51 cCgpLCB0aGVyZSB3YXMgYWxyZWFkeSBhbm90aGVyIHZhY3V1bV9kZWxheV9wb2ludCgpCmNh bGwgbGF0ZXIgaW4gdGhlIGxvb3AsIHdoaWxlIG5vdCBob2xkaW5nIGFueSBsb2Nrcywgc28g anVzdCByZW1vdmUKdGhlIG90aGVyIGNhbGwgdGhhdCB3YXMgbWFkZSB3aGlsZSBob2xkaW5n IHRoZSBsb2NrLgoKSW4gaGFzaGJ1Y2tldGNsZWFudXAoKSwgbW92ZSB0aGUgdmFjdXVtX2Rl bGF5X3BvaW50KCkgY2FsbCB1cCB0aGUKc3RhY2sgdG8gaXRzIGNhbGxlci4gIFRoZSBjYWxs IGluIGhhc2hidWNrZXRjbGVhbnVwKCkgd2FzIG5vdCBhYmxlIHRvCmhhbmRsZSBpbnRlcnJ1 cHRzIGJlY2F1c2UgaXQgaGVsZCBhIGxvY2ssIGFuZCBiZWNhdXNlIHRoZXJlIHdlcmUgbm8K dmFjdXVtX2RlbGF5X3BvaW50KCkgb3IgQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKSBjYWxscyBp biB0aGUgY2FsbGVyJ3MKbG9vcCwgdGhlIHdob2xlIGhhc2ggaW5kZXggdmFjdXVtaW5nIHBo YXNlIHdhcyB1bmludGVycnVwdGlibGUgYnkKcGVuZGluZyBzaHV0ZG93biBvciBxdWVyeSBj YW5jZWwuICBOb3cgaXQgY2FuIGJlIGludGVycnVwdGVkIGJldHdlZW4KYnVja2V0cy4gIFVu Zm9ydHVuYXRlbHksIGhhc2hidWNrZXRjbGVhbnVwKCkgaGFzIHRvIHByb2Nlc3MgYWxsIHRo ZQpidWNrZXQncyBwYWdlcyBpbiBvbmUgZ28gd2l0aG91dCBwYXVzaW5nOyBmaXhpbmcgdGhh dCB3b3VsZCByZXF1aXJlCmNoYW5naW5nIGhvdyBoYXNoYnVja2V0Y2xlYW51cCgpJ3MgbG9j ayBjaGFpbmluZyB3b3Jrcy4KCkluIGFjcXVpcmVfc2FtcGxlX3Jvd3MoKSwgbW92ZSB0aGUg dmFjdXVtX2RlbGF5X3BvaW50KCkgY2FsbCBpbiB0aGUKbG9vcCB0byBiZXR3ZWVuIHBhZ2Vz LCB0byBhIHRpbWUgd2hlcmUgd2UncmUgbm90IGhvbGRpbmcgdGhlIGJ1ZmZlcgpsb2NrLgoK UmVwb3J0ZWQtYnk6IFNlcmdlaSBLb3JuaWxvdiA8c2tAenNydi5vcmc+CkF1dGhvcjogTW9z dGFmYSA8bW9zdGFmYS5uYWJpbC5uYWZpZUBnbWFpbC5jb20+ClJldmlld2VkLWJ5OiBLaXJp bGwgUmVzaGtlIDxyZXNoa2VraXJpbGxAZ21haWwuY29tPgpEaXNjdXNzaW9uOiBodHRwczov L3Bvc3Rnci5lcy9tLzE5NjI4LWMyYjE3ZDM1ODE4MWExZWFAcG9zdGdyZXNxbC5vcmcKLS0t CiBzcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbmZhc3QuYyB8IDYgKysrLS0tCiBzcmMvYmFj a2VuZC9hY2Nlc3MvaGFzaC9oYXNoLmMgICB8IDUgKysrLS0KIHNyYy9iYWNrZW5kL2NvbW1h bmRzL2FuYWx5emUuYyAgIHwgMyArLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL3ZhY3V1bS5j ICAgIHwgOCArKysrKysrKwogNCBmaWxlcyBjaGFuZ2VkLCAxNSBpbnNlcnRpb25zKCspLCA3 IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9naW4vZ2lu ZmFzdC5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2dpbi9naW5mYXN0LmMKaW5kZXggNDZmYzYw MTE1YTguLjM3NzliNDNmYTFhIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvZ2lu L2dpbmZhc3QuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvZ2luL2dpbmZhc3QuYwpAQCAt ODk1LDggKzg5NSw2IEBAIGdpbkluc2VydENsZWFudXAoR2luU3RhdGUgKmdpbnN0YXRlLCBi b29sIG11c3RfZW1wdHlfbGlzdCwKIAkJICovCiAJCXByb2Nlc3NQZW5kaW5nUGFnZSgmYWNj dW0sICZkYXR1bXMsIHBhZ2UsIEZpcnN0T2Zmc2V0TnVtYmVyKTsKIAotCQl2YWN1dW1fZGVs YXlfcG9pbnQoZmFsc2UpOwotCiAJCS8qCiAJCSAqIElzIGl0IHRpbWUgdG8gZmx1c2ggbWVt b3J5IHRvIGRpc2s/CUZsdXNoIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mCiAJCSAqIHRoZSBw ZW5kaW5nIGxpc3QsIG9yIGlmIHdlIGhhdmUgYSBmdWxsIHJvdyBhbmQgbWVtb3J5IGlzIGdl dHRpbmcKQEAgLTEwMDIsMTAgKzEwMDAsMTIgQEAgZ2luSW5zZXJ0Q2xlYW51cChHaW5TdGF0 ZSAqZ2luc3RhdGUsIGJvb2wgbXVzdF9lbXB0eV9saXN0LAogCQkJVW5sb2NrUmVsZWFzZUJ1 ZmZlcihidWZmZXIpOwogCQl9CiAKKwkJLyogY2FsbCB2YWN1dW1fZGVsYXlfcG9pbnQgd2hp bGUgbm90IGhvbGRpbmcgYW55IGJ1ZmZlciBsb2NrICovCisJCXZhY3V1bV9kZWxheV9wb2lu dChmYWxzZSk7CisKIAkJLyoKIAkJICogUmVhZCBuZXh0IHBhZ2UgaW4gcGVuZGluZyBsaXN0 CiAJCSAqLwotCQl2YWN1dW1fZGVsYXlfcG9pbnQoZmFsc2UpOwogCQlidWZmZXIgPSBSZWFk QnVmZmVyKGluZGV4LCBibGtubyk7CiAJCUxvY2tCdWZmZXIoYnVmZmVyLCBHSU5fU0hBUkUp OwogCQlwYWdlID0gQnVmZmVyR2V0UGFnZShidWZmZXIpOwpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvYWNjZXNzL2hhc2gvaGFzaC5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2hhc2gvaGFz aC5jCmluZGV4IGIyZTM0ZDJkNDVlLi42Mzg0NmMxMDg0MCAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvYWNjZXNzL2hhc2gvaGFzaC5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9oYXNo L2hhc2guYwpAQCAtNTYyLDYgKzU2Miw5IEBAIGJ1Y2tldF9sb29wOgogCQlQYWdlCQlwYWdl OwogCQlib29sCQlzcGxpdF9jbGVhbnVwID0gZmFsc2U7CiAKKwkJLyogY2FsbCB2YWN1dW1f ZGVsYXlfcG9pbnQgd2hpbGUgbm90IGhvbGRpbmcgYW55IGJ1ZmZlciBsb2NrICovCisJCXZh Y3V1bV9kZWxheV9wb2ludChmYWxzZSk7CisKIAkJLyogR2V0IGFkZHJlc3Mgb2YgYnVja2V0 J3Mgc3RhcnQgcGFnZSAqLwogCQlidWNrZXRfYmxrbm8gPSBCVUNLRVRfVE9fQkxLTk8oY2Fj aGVkbWV0YXAsIGN1cl9idWNrZXQpOwogCkBAIC03OTksOCArODAyLDYgQEAgaGFzaGJ1Y2tl dGNsZWFudXAoUmVsYXRpb24gcmVsLCBCdWNrZXQgY3VyX2J1Y2tldCwgQnVmZmVyIGJ1Y2tl dF9idWYsCiAJCWJvb2wJCXJldGFpbl9waW4gPSBmYWxzZTsKIAkJYm9vbAkJY2xlYXJfZGVh ZF9tYXJraW5nID0gZmFsc2U7CiAKLQkJdmFjdXVtX2RlbGF5X3BvaW50KGZhbHNlKTsKLQog CQlwYWdlID0gQnVmZmVyR2V0UGFnZShidWYpOwogCQlvcGFxdWUgPSBIYXNoUGFnZUdldE9w YXF1ZShwYWdlKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvYW5hbHl6 ZS5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvYW5hbHl6ZS5jCmluZGV4IGQwNDk4YjE0ZGEx Li41MThkNzUyNjI1NSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvYW5hbHl6 ZS5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FuYWx5emUuYwpAQCAtMTMzOSw4ICsx MzM5LDYgQEAgYWNxdWlyZV9zYW1wbGVfcm93cyhSZWxhdGlvbiBvbmVyZWwsIGludCBlbGV2 ZWwsCiAJLyogT3V0ZXIgbG9vcCBvdmVyIGJsb2NrcyB0byBzYW1wbGUgKi8KIAl3aGlsZSAo dGFibGVfc2Nhbl9hbmFseXplX25leHRfYmxvY2soc2Nhbiwgc3RyZWFtKSkKIAl7Ci0JCXZh Y3V1bV9kZWxheV9wb2ludCh0cnVlKTsKLQogCQl3aGlsZSAodGFibGVfc2Nhbl9hbmFseXpl X25leHRfdHVwbGUoc2NhbiwgJmxpdmVyb3dzLCAmZGVhZHJvd3MsIHNsb3QpKQogCQl7CiAJ CQkvKgpAQCAtMTM4OCw2ICsxMzg2LDcgQEAgYWNxdWlyZV9zYW1wbGVfcm93cyhSZWxhdGlv biBvbmVyZWwsIGludCBlbGV2ZWwsCiAKIAkJcGdzdGF0X3Byb2dyZXNzX3VwZGF0ZV9wYXJh bShQUk9HUkVTU19BTkFMWVpFX0JMT0NLU19ET05FLAogCQkJCQkJCQkJICsrYmxrc2RvbmUp OworCQl2YWN1dW1fZGVsYXlfcG9pbnQodHJ1ZSk7CiAJfQogCiAJcmVhZF9zdHJlYW1fZW5k KHN0cmVhbSk7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy92YWN1dW0uYyBi L3NyYy9iYWNrZW5kL2NvbW1hbmRzL3ZhY3V1bS5jCmluZGV4IGQ4YzJmMzNjNjE1Li5hMjU3 ZGQ4ZDIxZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvdmFjdXVtLmMKKysr IGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdmFjdXVtLmMKQEAgLTI0ODIsNiArMjQ4MiwxNCBA QCB2YWN1dW1fZGVsYXlfcG9pbnQoYm9vbCBpc19hbmFseXplKQogewogCWRvdWJsZQkJbXNl YyA9IDA7CiAKKwkvKgorCSAqIElmIHdlJ3JlIGhvbGRpbmcgbG9ja3Mgb3IgaG9sZGluZyBp bnRlcnJ1cHRzIGZvciBzb21lIG90aGVyIHJlYXNvbiwKKwkgKiBkb24ndCBzbGVlcCwgYmVj YXVzZSB3ZSBkb24ndCB3YW50IHRvIGhvbGQgbG9ja3MgYW55IGxvbmdlciB0aGFuCisJICog bmVjZXNzYXJ5LgorCSAqLworCWlmICghSU5URVJSVVBUU19DQU5fQkVfUFJPQ0VTU0VEKCkp CisJCXJldHVybjsKKwogCS8qIEFsd2F5cyBjaGVjayBmb3IgaW50ZXJydXB0cyAqLwogCUNI RUNLX0ZPUl9JTlRFUlJVUFRTKCk7CiAKLS0gCjIuNDcuMwoK --------------dldfEPPxHNKD222soE6d5nbk--