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 1sk8F2-007yKa-SV for pgsql-hackers@arkaria.postgresql.org; Fri, 30 Aug 2024 20:29: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 1sk8Ez-00AVki-Af for pgsql-hackers@arkaria.postgresql.org; Fri, 30 Aug 2024 20:29:05 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sk8Ey-00AVkZ-LS for pgsql-hackers@lists.postgresql.org; Fri, 30 Aug 2024 20:29:05 +0000 Received: from mail-pj1-x1029.google.com ([2607:f8b0:4864:20::1029]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sk8Ev-002EEW-TJ for pgsql-hackers@lists.postgresql.org; Fri, 30 Aug 2024 20:29:03 +0000 Received: by mail-pj1-x1029.google.com with SMTP id 98e67ed59e1d1-2d3e44b4613so1701214a91.3 for ; Fri, 30 Aug 2024 13:29:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=illuminatedcomputing-com.20230601.gappssmtp.com; s=20230601; t=1725049740; x=1725654540; darn=lists.postgresql.org; h=subject:to:from:content-language:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=0gpHVTEb73bg+TW/T/yHapx/u1xKJ4YA60ogqBZi7iE=; b=0gfgdaVw6A49k3r/bFJZc0Qfl9M5qGbNER2a5bpTYdroYlNpDy0FTb8yQk/WImqCIj Vv4MaDH/bZ9ipep7m+qPYSoNr9eruEHJOHN8hrW14XrTlNHK1mKrn2CXRCIQp5QM+rti QRwBL/BfMOh+TOZmvwQmOPk+01gPbj3/XnoRH4guWJrA4KxpV7fW1tKAhntAYGzUL5Vu /KO1/FC30CauCtOTr3mRAXI5uPlZmRdDcAo+SMVQCNdYWwOugJKaI4L0SbJKgkZ2K99T PXI/cSFVaQXHetnxfrYVwjdU/58J3LTUky9OI8gOnopflhwoIjXticIqY5FR1F10eq7o nk2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1725049740; x=1725654540; h=subject:to:from:content-language:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=0gpHVTEb73bg+TW/T/yHapx/u1xKJ4YA60ogqBZi7iE=; b=KcVn4/ws8OUxdtwCVnxQNGWIq5gS4f67j3TRcHOzLaRYl/SOcjxEPlXVXa1Ygruotx 05stt2DEXNIiQwz962YPkfmx31z++H97wsewytRxIZRs3IogRWO587hj9jiSwwe3BKQR BUxn2GHpctgx6KYTA6cTGm7li2PHKILwG2KDAmlidJMW52AqrRSGd6azO2xLxcQyFMgy dLqD8p0HD2BgzrLc0fcq3zeGJgYKyP0L600hksuadW10bsSCiLnbsdZghqWTPPwtA3L/ QCNAYXFFPnZNA7hoZAgdmASeFMuZQ/3+Y3tx1YFwfXEPfOP/SRIbqGDcENDRtC+IpOFv u+Ng== X-Gm-Message-State: AOJu0YzZy28xbLfz1eBQHDW7IX1tySyxLknp2QeQ6WpRzEAySksCpwJF tVmdhs0ilSIZeYNNMCpBV0P2t3bFdQAUzxpouecnslESd4xS71eYinP2rOIIbnXXFHtS9myOZny + X-Google-Smtp-Source: AGHT+IG+8GUy61warrK2GzMo2EoZaoM5Vkh+wos12fEUe6x20Axfaw6ffkJ6V4gS7M/Q1N8FZVhLgg== X-Received: by 2002:a17:90b:1909:b0:2c4:b0f0:8013 with SMTP id 98e67ed59e1d1-2d8561b15b3mr7168644a91.11.1725049740049; Fri, 30 Aug 2024 13:29:00 -0700 (PDT) Received: from [192.168.2.139] ([50.39.255.79]) by smtp.googlemail.com with ESMTPSA id 98e67ed59e1d1-2d8445d7822sm6905618a91.9.2024.08.30.13.28.59 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 30 Aug 2024 13:28:59 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------RCf54thZhmeYn0OZpRu6ncm0" Message-ID: Date: Fri, 30 Aug 2024 13:28:58 -0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US From: Paul Jungwirth To: PostgreSQL Hackers Subject: Add tests for PL/pgSQL SRFs 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. --------------RCf54thZhmeYn0OZpRu6ncm0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hello Hackers, While working on inlining non-SQL SRFs [1] I noticed we don't have tests for when a PL/pgSQL function requires materialize mode but doesn't have a result TupleDesc. Here is a patch adding tests for that, as well as some other conditions around SRF calls with `SETOF RECORD` vs `TABLE (...)`. There aren't any code changes, just some new tests. But IMO it might be better to change the code. This error message is a bit confusing: +-- materialize mode requires a result TupleDesc: +select array_to_set2(array['one', 'two']); -- fail +ERROR: materialize mode required, but it is not allowed in this context +CONTEXT: PL/pgSQL function array_to_set2(anyarray) line 3 at RETURN QUERY Perhaps it would be better to give the same error as here?: +select * from array_to_set2(array['one', 'two']); -- fail +ERROR: a column definition list is required for functions returning "record" +LINE 1: select * from array_to_set2(array['one', 'two']); If folks agree, I can work on a patch for that. Otherwise, at least this patch documents the current behavior and increases coverage. [1] https://commitfest.postgresql.org/49/5083/ Yours, -- Paul ~{:-) pj@illuminatedcomputing.com --------------RCf54thZhmeYn0OZpRu6ncm0 Content-Type: text/x-patch; charset=UTF-8; name="v1-0001-Add-tests-for-PL-pgSQL-Set-Returning-Functions.patch" Content-Disposition: attachment; filename*0="v1-0001-Add-tests-for-PL-pgSQL-Set-Returning-Functions.patch" Content-Transfer-Encoding: base64 RnJvbSA3NjNkYjg2OGQyZGMxMjFmODc0NWJhOWY5MGU0ZjczN2MxMzViY2FhIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiUGF1bCBBLiBKdW5nd2lydGgiIDxwakBpbGx1bWlu YXRlZGNvbXB1dGluZy5jb20+CkRhdGU6IFdlZCwgMjggQXVnIDIwMjQgMTk6NDQ6MDIgLTA3 MDAKU3ViamVjdDogW1BBVENIIHYxXSBBZGQgdGVzdHMgZm9yIFBML3BnU1FMIFNldC1SZXR1 cm5pbmcgRnVuY3Rpb25zCgpUaGVzZSB0ZXN0cyBleGVyY2l6ZSBTUkZzIHdpdGggYW5kIHdp dGhvdXQgYSByZXN1bHQgVHVwbGVEZXNjIChpbiBvdGhlcgp3b3JkcyBSRVRVUk5TIFRBQkxF ICguLi4pIHZzIFJFVFVSTlMgU0VUT0YgUkVDT1JEKS4gV2UgY2FuIG9ubHkgc3VwcG9ydApt YXRlcmlhbGl6ZSBtb2RlIGluIHRoZSBmb3JtZXIgY2FzZS4gT24gdGhlIG90aGVyIGhhbmQs IHRoYXQgY2FzZQpyZWplY3RzIGEgY29sdW1uIGRlZmluaXRpb24gbGlzdCBhcyByZWR1bmRh bnQuIFRoZSBwb3NpdGlvbiBvZiB0aGVzZQp0ZXN0cyBzaG93cyB0aGUgY29udHJhc3Qgd2l0 aCBTUUwgZnVuY3Rpb25zICh0ZXN0ZWQgYWJvdmUpLCB3aGljaApzdXBwb3J0IFNFVE9GIFJF Q09SRCBpbiBtb3JlIHBsYWNlcy4KLS0tCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3Jh bmdlZnVuY3Mub3V0IHwgOTAgKysrKysrKysrKysrKysrKysrKysrKysrCiBzcmMvdGVzdC9y ZWdyZXNzL3NxbC9yYW5nZWZ1bmNzLnNxbCAgICAgIHwgNDIgKysrKysrKysrKysKIDIgZmls ZXMgY2hhbmdlZCwgMTMyIGluc2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL3JhbmdlZnVuY3Mub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9yYW5nZWZ1bmNzLm91dAppbmRleCAzOTdhOGIzNWQ2ZC4uM2QzZWJkMTc3ODAgMTAw NjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcmFuZ2VmdW5jcy5vdXQKKysr IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9yYW5nZWZ1bmNzLm91dApAQCAtMjE2OSw2 ICsyMTY5LDk2IEBAIExJTkUgMTogc2VsZWN0ICogZnJvbSBzaW4oMykgYXMgdChmMSBpbnQ4 LGYyIGludDgpOwogZHJvcCB0eXBlIHJuZ2Z1bmNfdHlwZSBjYXNjYWRlOwogTk9USUNFOiAg ZHJvcCBjYXNjYWRlcyB0byBmdW5jdGlvbiB0ZXN0cm5nZnVuYygpCiAtLQorLS0gdGVzdCB1 c2Ugb2YgUEwvcGdTUUwgZnVuY3Rpb25zIHJldHVybmluZyBzZXRvZiByZWNvcmQKKy0tCitj cmVhdGUgb3IgcmVwbGFjZSBmdW5jdGlvbiBhcnJheV90b19zZXQyKGFueWFycmF5KSByZXR1 cm5zIHNldG9mIHJlY29yZCBhcyAkJAorICBiZWdpbgorICByZXR1cm4gcXVlcnkgZXhlY3V0 ZSAnc2VsZWN0IGkgQVMgImluZGV4IiwgJDFbaV0gQVMgInZhbHVlIiBmcm9tIGdlbmVyYXRl X3N1YnNjcmlwdHMoJDEsIDEpIGknCisgICAgdXNpbmcgJDE7CisgIGVuZDsKKyQkIGxhbmd1 YWdlIHBscGdzcWwgaW1tdXRhYmxlOworLS0gbWF0ZXJpYWxpemUgbW9kZSByZXF1aXJlcyBh IHJlc3VsdCBUdXBsZURlc2M6CitzZWxlY3QgYXJyYXlfdG9fc2V0MihhcnJheVsnb25lJywg J3R3byddKTsgLS0gZmFpbAorRVJST1I6ICBtYXRlcmlhbGl6ZSBtb2RlIHJlcXVpcmVkLCBi dXQgaXQgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb250ZXh0CitDT05URVhUOiAgUEwvcGdT UUwgZnVuY3Rpb24gYXJyYXlfdG9fc2V0MihhbnlhcnJheSkgbGluZSAzIGF0IFJFVFVSTiBR VUVSWQorc2VsZWN0ICogZnJvbSBhcnJheV90b19zZXQyKGFycmF5WydvbmUnLCAndHdvJ10p IGFzIHQoZjEgaW50LGYyIHRleHQpOworIGYxIHwgZjIgIAorLS0tLSstLS0tLQorICAxIHwg b25lCisgIDIgfCB0d28KKygyIHJvd3MpCisKK3NlbGVjdCAqIGZyb20gYXJyYXlfdG9fc2V0 MihhcnJheVsnb25lJywgJ3R3byddKTsgLS0gZmFpbAorRVJST1I6ICBhIGNvbHVtbiBkZWZp bml0aW9uIGxpc3QgaXMgcmVxdWlyZWQgZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgInJlY29y ZCIKK0xJTkUgMTogc2VsZWN0ICogZnJvbSBhcnJheV90b19zZXQyKGFycmF5WydvbmUnLCAn dHdvJ10pOworICAgICAgICAgICAgICAgICAgICAgIF4KK3NlbGVjdCAqIGZyb20gYXJyYXlf dG9fc2V0MihhcnJheVsnb25lJywgJ3R3byddKSBhcyB0KGYxIG51bWVyaWMoNCwyKSxmMiB0 ZXh0KTsgLS0gZmFpbAorRVJST1I6ICBzdHJ1Y3R1cmUgb2YgcXVlcnkgZG9lcyBub3QgbWF0 Y2ggZnVuY3Rpb24gcmVzdWx0IHR5cGUKK0RFVEFJTDogIFJldHVybmVkIHR5cGUgaW50ZWdl ciBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB0eXBlIG51bWVyaWMoNCwyKSBpbiBjb2x1bW4g MS4KK0NPTlRFWFQ6ICBTUUwgc3RhdGVtZW50ICJzZWxlY3QgaSBBUyAiaW5kZXgiLCAkMVtp XSBBUyAidmFsdWUiIGZyb20gZ2VuZXJhdGVfc3Vic2NyaXB0cygkMSwgMSkgaSIKK1BML3Bn U1FMIGZ1bmN0aW9uIGFycmF5X3RvX3NldDIoYW55YXJyYXkpIGxpbmUgMyBhdCBSRVRVUk4g UVVFUlkKK3NlbGVjdCAqIGZyb20gYXJyYXlfdG9fc2V0MihhcnJheVsnb25lJywgJ3R3bydd KSBhcyB0KGYxIHBvaW50LGYyIHRleHQpOyAtLSBmYWlsCitFUlJPUjogIHN0cnVjdHVyZSBv ZiBxdWVyeSBkb2VzIG5vdCBtYXRjaCBmdW5jdGlvbiByZXN1bHQgdHlwZQorREVUQUlMOiAg UmV0dXJuZWQgdHlwZSBpbnRlZ2VyIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHR5cGUgcG9p bnQgaW4gY29sdW1uIDEuCitDT05URVhUOiAgU1FMIHN0YXRlbWVudCAic2VsZWN0IGkgQVMg ImluZGV4IiwgJDFbaV0gQVMgInZhbHVlIiBmcm9tIGdlbmVyYXRlX3N1YnNjcmlwdHMoJDEs IDEpIGkiCitQTC9wZ1NRTCBmdW5jdGlvbiBhcnJheV90b19zZXQyKGFueWFycmF5KSBsaW5l IDMgYXQgUkVUVVJOIFFVRVJZCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCisgIHNl bGVjdCAqIGZyb20gYXJyYXlfdG9fc2V0MihhcnJheVsnb25lJywgJ3R3byddKSBhcyB0KGYx IGludCwgZjIgdGV4dCk7CisgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBGdW5jdGlvbiBTY2FuIG9uIHB1YmxpYy5hcnJheV90b19z ZXQyIHQKKyAgIE91dHB1dDogZjEsIGYyCisgICBGdW5jdGlvbiBDYWxsOiBhcnJheV90b19z ZXQyKCd7b25lLHR3b30nOjp0ZXh0W10pCisoMyByb3dzKQorCitkcm9wIGZ1bmN0aW9uIGFy cmF5X3RvX3NldDI7CistLQorLS0gdGVzdCB1c2Ugb2YgUEwvcGdTUUwgZnVuY3Rpb25zIHJl dHVybmluZyB0YWJsZQorLS0KK2NyZWF0ZSBvciByZXBsYWNlIGZ1bmN0aW9uIGFycmF5X3Rv X3NldDIoYW55YXJyYXkpIHJldHVybnMgdGFibGUoaW5kZXggaW50LCB2YWx1ZSBhbnllbGVt ZW50KSBhcyAkJAorICBiZWdpbgorICByZXR1cm4gcXVlcnkgZXhlY3V0ZSAnc2VsZWN0IGkg QVMgImluZGV4IiwgJDFbaV0gQVMgInZhbHVlIiBmcm9tIGdlbmVyYXRlX3N1YnNjcmlwdHMo JDEsIDEpIGknCisgICAgdXNpbmcgJDE7CisgIGVuZDsKKyQkIGxhbmd1YWdlIHBscGdzcWwg aW1tdXRhYmxlOworLS0gbWF0ZXJpYWxpemUgbW9kZSByZXF1aXJlcyBhIHJlc3VsdCBUdXBs ZURlc2M6CitzZWxlY3QgYXJyYXlfdG9fc2V0MihhcnJheVsnb25lJywgJ3R3byddKTsKKyBh cnJheV90b19zZXQyIAorLS0tLS0tLS0tLS0tLS0tCisgKDEsb25lKQorICgyLHR3bykKKygy IHJvd3MpCisKK3NlbGVjdCAqIGZyb20gYXJyYXlfdG9fc2V0MihhcnJheVsnb25lJywgJ3R3 byddKSBhcyB0KGYxIGludCxmMiB0ZXh0KTsgLS0gZmFpbAorRVJST1I6ICBhIGNvbHVtbiBk ZWZpbml0aW9uIGxpc3QgaXMgcmVkdW5kYW50IGZvciBhIGZ1bmN0aW9uIHdpdGggT1VUIHBh cmFtZXRlcnMKK0xJTkUgMTogLi4uY3QgKiBmcm9tIGFycmF5X3RvX3NldDIoYXJyYXlbJ29u ZScsICd0d28nXSkgYXMgdChmMSBpbnQsZjIgLi4uCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorc2VsZWN0ICogZnJv bSBhcnJheV90b19zZXQyKGFycmF5WydvbmUnLCAndHdvJ10pOworIGluZGV4IHwgdmFsdWUg CistLS0tLS0tKy0tLS0tLS0KKyAgICAgMSB8IG9uZQorICAgICAyIHwgdHdvCisoMiByb3dz KQorCitzZWxlY3QgKiBmcm9tIGFycmF5X3RvX3NldDIoYXJyYXlbJ29uZScsICd0d28nXSkg YXMgdChmMSBudW1lcmljKDQsMiksZjIgdGV4dCk7IC0tIGZhaWwKK0VSUk9SOiAgYSBjb2x1 bW4gZGVmaW5pdGlvbiBsaXN0IGlzIHJlZHVuZGFudCBmb3IgYSBmdW5jdGlvbiB3aXRoIE9V VCBwYXJhbWV0ZXJzCitMSU5FIDE6IC4uLmN0ICogZnJvbSBhcnJheV90b19zZXQyKGFycmF5 WydvbmUnLCAndHdvJ10pIGFzIHQoZjEgbnVtZXJpYy4uLgorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KK3NlbGVjdCAq IGZyb20gYXJyYXlfdG9fc2V0MihhcnJheVsnb25lJywgJ3R3byddKSBhcyB0KGYxIHBvaW50 LGYyIHRleHQpOyAtLSBmYWlsCitFUlJPUjogIGEgY29sdW1uIGRlZmluaXRpb24gbGlzdCBp cyByZWR1bmRhbnQgZm9yIGEgZnVuY3Rpb24gd2l0aCBPVVQgcGFyYW1ldGVycworTElORSAx OiAuLi5jdCAqIGZyb20gYXJyYXlfdG9fc2V0MihhcnJheVsnb25lJywgJ3R3byddKSBhcyB0 KGYxIHBvaW50LGYuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBeCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYp CisgIHNlbGVjdCAqIGZyb20gYXJyYXlfdG9fc2V0MihhcnJheVsnb25lJywgJ3R3byddKTsK KyAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIEZ1bmN0aW9uIFNjYW4gb24gcHVibGljLmFycmF5X3RvX3NldDIKKyAgIE91dHB1dDog aW5kZXgsIHZhbHVlCisgICBGdW5jdGlvbiBDYWxsOiBhcnJheV90b19zZXQyKCd7b25lLHR3 b30nOjp0ZXh0W10pCisoMyByb3dzKQorCitkcm9wIGZ1bmN0aW9uIGFycmF5X3RvX3NldDI7 CistLQogLS0gQ2hlY2sgc29tZSBjYXNlcyBpbnZvbHZpbmcgYWRkZWQvZHJvcHBlZCBjb2x1 bW5zIGluIGEgcm93dHlwZSByZXN1bHQKIC0tCiBjcmVhdGUgdGVtcCB0YWJsZSB1c2VycyAo dXNlcmlkIHRleHQsIHNlcSBpbnQsIGVtYWlsIHRleHQsIHRvZHJvcCBib29sLCBtb3JlZHJv cCBpbnQsIGVuYWJsZWQgYm9vbCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3Nx bC9yYW5nZWZ1bmNzLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3JhbmdlZnVuY3Muc3Fs CmluZGV4IDNjNDdjOThlMTEzLi5hODk4YWMxMTZkZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3Qv cmVncmVzcy9zcWwvcmFuZ2VmdW5jcy5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwv cmFuZ2VmdW5jcy5zcWwKQEAgLTY0Nyw2ICs2NDcsNDggQEAgc2VsZWN0ICogZnJvbSBzaW4o MykgYXMgdChmMSBpbnQ4LGYyIGludDgpOyAgLS0gZmFpbCwgc2NhbGFyIHJlc3VsdCB0eXBl CiAKIGRyb3AgdHlwZSBybmdmdW5jX3R5cGUgY2FzY2FkZTsKIAorLS0KKy0tIHRlc3QgdXNl IG9mIFBML3BnU1FMIGZ1bmN0aW9ucyByZXR1cm5pbmcgc2V0b2YgcmVjb3JkCistLQorCitj cmVhdGUgb3IgcmVwbGFjZSBmdW5jdGlvbiBhcnJheV90b19zZXQyKGFueWFycmF5KSByZXR1 cm5zIHNldG9mIHJlY29yZCBhcyAkJAorICBiZWdpbgorICByZXR1cm4gcXVlcnkgZXhlY3V0 ZSAnc2VsZWN0IGkgQVMgImluZGV4IiwgJDFbaV0gQVMgInZhbHVlIiBmcm9tIGdlbmVyYXRl X3N1YnNjcmlwdHMoJDEsIDEpIGknCisgICAgdXNpbmcgJDE7CisgIGVuZDsKKyQkIGxhbmd1 YWdlIHBscGdzcWwgaW1tdXRhYmxlOworCistLSBtYXRlcmlhbGl6ZSBtb2RlIHJlcXVpcmVz IGEgcmVzdWx0IFR1cGxlRGVzYzoKK3NlbGVjdCBhcnJheV90b19zZXQyKGFycmF5WydvbmUn LCAndHdvJ10pOyAtLSBmYWlsCitzZWxlY3QgKiBmcm9tIGFycmF5X3RvX3NldDIoYXJyYXlb J29uZScsICd0d28nXSkgYXMgdChmMSBpbnQsZjIgdGV4dCk7CitzZWxlY3QgKiBmcm9tIGFy cmF5X3RvX3NldDIoYXJyYXlbJ29uZScsICd0d28nXSk7IC0tIGZhaWwKK3NlbGVjdCAqIGZy b20gYXJyYXlfdG9fc2V0MihhcnJheVsnb25lJywgJ3R3byddKSBhcyB0KGYxIG51bWVyaWMo NCwyKSxmMiB0ZXh0KTsgLS0gZmFpbAorc2VsZWN0ICogZnJvbSBhcnJheV90b19zZXQyKGFy cmF5WydvbmUnLCAndHdvJ10pIGFzIHQoZjEgcG9pbnQsZjIgdGV4dCk7IC0tIGZhaWwKK2V4 cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKKyAgc2VsZWN0ICogZnJvbSBhcnJheV90b19z ZXQyKGFycmF5WydvbmUnLCAndHdvJ10pIGFzIHQoZjEgaW50LCBmMiB0ZXh0KTsKK2Ryb3Ag ZnVuY3Rpb24gYXJyYXlfdG9fc2V0MjsKKworLS0KKy0tIHRlc3QgdXNlIG9mIFBML3BnU1FM IGZ1bmN0aW9ucyByZXR1cm5pbmcgdGFibGUKKy0tCisKK2NyZWF0ZSBvciByZXBsYWNlIGZ1 bmN0aW9uIGFycmF5X3RvX3NldDIoYW55YXJyYXkpIHJldHVybnMgdGFibGUoaW5kZXggaW50 LCB2YWx1ZSBhbnllbGVtZW50KSBhcyAkJAorICBiZWdpbgorICByZXR1cm4gcXVlcnkgZXhl Y3V0ZSAnc2VsZWN0IGkgQVMgImluZGV4IiwgJDFbaV0gQVMgInZhbHVlIiBmcm9tIGdlbmVy YXRlX3N1YnNjcmlwdHMoJDEsIDEpIGknCisgICAgdXNpbmcgJDE7CisgIGVuZDsKKyQkIGxh bmd1YWdlIHBscGdzcWwgaW1tdXRhYmxlOworCistLSBtYXRlcmlhbGl6ZSBtb2RlIHJlcXVp cmVzIGEgcmVzdWx0IFR1cGxlRGVzYzoKK3NlbGVjdCBhcnJheV90b19zZXQyKGFycmF5Wydv bmUnLCAndHdvJ10pOworc2VsZWN0ICogZnJvbSBhcnJheV90b19zZXQyKGFycmF5WydvbmUn LCAndHdvJ10pIGFzIHQoZjEgaW50LGYyIHRleHQpOyAtLSBmYWlsCitzZWxlY3QgKiBmcm9t IGFycmF5X3RvX3NldDIoYXJyYXlbJ29uZScsICd0d28nXSk7CitzZWxlY3QgKiBmcm9tIGFy cmF5X3RvX3NldDIoYXJyYXlbJ29uZScsICd0d28nXSkgYXMgdChmMSBudW1lcmljKDQsMiks ZjIgdGV4dCk7IC0tIGZhaWwKK3NlbGVjdCAqIGZyb20gYXJyYXlfdG9fc2V0MihhcnJheVsn b25lJywgJ3R3byddKSBhcyB0KGYxIHBvaW50LGYyIHRleHQpOyAtLSBmYWlsCitleHBsYWlu ICh2ZXJib3NlLCBjb3N0cyBvZmYpCisgIHNlbGVjdCAqIGZyb20gYXJyYXlfdG9fc2V0Mihh cnJheVsnb25lJywgJ3R3byddKTsKK2Ryb3AgZnVuY3Rpb24gYXJyYXlfdG9fc2V0MjsKKwog LS0KIC0tIENoZWNrIHNvbWUgY2FzZXMgaW52b2x2aW5nIGFkZGVkL2Ryb3BwZWQgY29sdW1u cyBpbiBhIHJvd3R5cGUgcmVzdWx0CiAtLQotLSAKMi40NS4wCgo= --------------RCf54thZhmeYn0OZpRu6ncm0--