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 1tiVAZ-00GjUh-QX for pgsql-hackers@arkaria.postgresql.org; Thu, 13 Feb 2025 09:06:04 +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 1tiVAX-004QqH-TT for pgsql-hackers@arkaria.postgresql.org; Thu, 13 Feb 2025 09:06:02 +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 1tiVAX-004Qmi-FP for pgsql-hackers@lists.postgresql.org; Thu, 13 Feb 2025 09:06:02 +0000 Received: from forward500a.mail.yandex.net ([178.154.239.80]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1tiVAV-000aFR-1g for pgsql-hackers@lists.postgresql.org; Thu, 13 Feb 2025 09:06:01 +0000 Received: from mail-nwsmtp-smtp-production-main-73.iva.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-73.iva.yp-c.yandex.net [IPv6:2a02:6b8:c0c:788:0:640:d3db:0]) by forward500a.mail.yandex.net (Yandex) with ESMTPS id 2C2206161D; Thu, 13 Feb 2025 12:05:58 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-73.iva.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id t5MHuB1OmiE0-Cdgxiifj; Thu, 13 Feb 2025 12:05:57 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1739437557; bh=P2yk+FXi7MmM83INLQv4GKrkUKKPry8veyEqmeQb92w=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=zhvHNlEA7FxNQp/d+EfR3Qy4Q1Rs7svF//i5zsrYfyd7mT+cQyk78kVDCrzq1QmLx i40cotatDvpdsKF7LYr8gEnW28IgooCwMtNYunnPaJGSjexAjh4jqFtdZhFYp6erfu ZHFFSkWWMjxSn4r6nO/Vc8ETw0s5GUag2VxIcuSk= Authentication-Results: mail-nwsmtp-smtp-production-main-73.iva.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------retXDkxedXx2JPZyCAnrNafM" Message-ID: Date: Thu, 13 Feb 2025 12:05:55 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: explain analyze rows=%.0f To: pgsql-hackers@lists.postgresql.org Cc: Tom Lane , Matheus Alcantara , Guillaume Lelarge , Daniel Gustafsson , Ibrar Ahmed , "Gregory Stark (as CFM)" , Amit Kapila , Justin Pryzby , Peter Geoghegan , vignesh C , "David G. Johnston" , Alena Rybakina , Andrei Lepikhov , Robert Haas References: <55695d15-c738-4401-8883-58bc855c9b03@tantorlabs.com> <58bb3a5b-c92a-408c-b02a-f47aedc1c0e2@tantorlabs.com> <70bc1af0-6910-4f71-84ba-fa02095fe9ba@tantorlabs.com> <3212947.1739306803@sss.pgh.pa.us> <3365160.1739385615@sss.pgh.pa.us> <0e4c813a-18eb-41e2-8edb-89b78d43c82d@gmail.com> Content-Language: en-US From: Ilia Evdokimov 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. --------------retXDkxedXx2JPZyCAnrNafM Content-Type: multipart/alternative; boundary="------------mzH5hldpvC1vG5Cjp9pcKpNl" --------------mzH5hldpvC1vG5Cjp9pcKpNl Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 12.02.2025 22:56, Robert Haas wrote: > On Wed, Feb 12, 2025 at 2:55 PM Andrei Lepikhov wrote: >> On 13/2/2025 01:40, Tom Lane wrote: >>> I was idly speculating yesterday about letting the Ryu code print >>> the division result, so that we get a variable number of digits. >>> Realistically, that'd probably result in many cases in more digits >>> than anybody wants, so it's not a serious proposal. I'm cool with >>> the fixed-two-digits approach to start with. >> Okay, since no one else voted for the meaningful-numbers approach, I >> would say that fixed size is better than nothing. It may cover some of >> my practical cases, but unfortunately, not the most problematic ones. > I don't love it either, but I do think it is significantly better than nothing. > I'm in favor of having some improvement rather than nothing at all—otherwise, we might never reach a consensus. 1. Documentation (v9-0001-Clarify-display-of-rows-as-decimal-fractions-DOC.patch) One thing that bothers me is that the documentation explains how to compute total time, but it does not clarify how to compute total rows. Maybe this was obvious to others before, but now that we are displaying |rows| as a fraction, we should explicitly document how to interpret it alongside total time. I believe it would be helpful to show a non-integer rows value in an example query. However, to achieve this, we need the index scan results to vary across iterations. One way to accomplish this is by using the condition t1.unique2 > t2.unique2. Additionally, I suggest making loops a round number (e.g., 100) for better readability, which can be achieved using t1.thousand < 10. The final query would look like this: EXPLAIN ANALYZE SELECT * FROM tenk1 t1, tenk2 t2 WHERE t1.thousand < 10 AND t1.unique2 > t2.unique2; I believe this is an ideal example for the documentation because it not only demonstrates fractional rows, but also keeps the execution plan nearly unchanged. While the estimated and actual average row counts become slightly rounded, I don't see another way to ensure different results for each index scan. I'm open to any feedback or suggestions for a better example to use in the documentation or additional explaining fractional rows in the text. 2. Code and tests (v9-0002-Clarify-display-of-rows-as-decimal-fractions.patch) I left the code and tests unchanged since we agreed on a fixed format of two decimal places. -- Best regards, Ilia Evdokimov, Tantor Labs LLC. --------------mzH5hldpvC1vG5Cjp9pcKpNl Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit


On 12.02.2025 22:56, Robert Haas wrote:
On Wed, Feb 12, 2025 at 2:55 PM Andrei Lepikhov <lepihov@gmail.com> wrote:
On 13/2/2025 01:40, Tom Lane wrote:
I was idly speculating yesterday about letting the Ryu code print
the division result, so that we get a variable number of digits.
Realistically, that'd probably result in many cases in more digits
than anybody wants, so it's not a serious proposal.  I'm cool with
the fixed-two-digits approach to start with.
Okay, since no one else voted for the meaningful-numbers approach, I
would say that fixed size is better than nothing. It may cover some of
my practical cases, but unfortunately, not the most problematic ones.
I don't love it either, but I do think it is significantly better than nothing.



I'm in favor of having some improvement rather than nothing at all—otherwise, we might never reach a consensus.

1. Documentation (v9-0001-Clarify-display-of-rows-as-decimal-fractions-DOC.patch)

One thing that bothers me is that the documentation explains how to compute total time, but it does not clarify how to compute total rows. Maybe this was obvious to others before, but now that we are displaying rows as a fraction, we should explicitly document how to interpret it alongside total time.

I believe it would be helpful to show a non-integer rows value in an example query. However, to achieve this, we need the index scan results to vary across iterations. One way to accomplish this is by using the condition t1.unique2 > t2.unique2. Additionally, I suggest making loops a round number (e.g., 100) for better readability, which can be achieved using t1.thousand < 10. The final query would look like this:

EXPLAIN ANALYZE SELECT *
FROM tenk1 t1, tenk2 t2
WHERE t1.thousand < 10 AND t1.unique2 > t2.unique2;

I believe this is an ideal example for the documentation because it not only demonstrates fractional rows, but also keeps the execution plan nearly unchanged. While the estimated and actual average row counts become slightly rounded, I don't see another way to ensure different results for each index scan.

I'm open to any feedback or suggestions for a better example to use in the documentation or additional explaining fractional rows in the text.

2. Code and tests (v9-0002-Clarify-display-of-rows-as-decimal-fractions.patch)

I left the code and tests unchanged since we agreed on a fixed format of two decimal places.

--
Best regards,
Ilia Evdokimov,
Tantor Labs LLC.

--------------mzH5hldpvC1vG5Cjp9pcKpNl-- --------------retXDkxedXx2JPZyCAnrNafM Content-Type: text/x-patch; charset=UTF-8; name="v9-0001-Clarify-display-of-rows-as-decimal-fractions-DOC.patch" Content-Disposition: attachment; filename*0="v9-0001-Clarify-display-of-rows-as-decimal-fractions-DOC.pat"; filename*1="ch" Content-Transfer-Encoding: base64 RnJvbSA3ODlkOTgzODM5ODhlZjZkM2IwYmMyYzZiOWI1YzczYTgzZmZkNmQ0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5ydT4KRGF0ZTogVGh1LCAxMyBGZWIgMjAyNSAxMToxOTowMyArMDMwMApT dWJqZWN0OiBbUEFUQ0ggdjldIENsYXJpZnkgZGlzcGxheSBvZiByb3dzIGFzIGRlY2ltYWwg ZnJhY3Rpb25zCgpXaGVuIGxvb3BzID4gMSwgdGhlIGF2ZXJhZ2Ugcm93cyB2YWx1ZSBpcyBu b3cgZGlzcGxheWVkIGFzIGEgZGVjaW1hbCBmcmFjdGlvbgp3aXRoIHR3byBkaWdpdHMgYWZ0 ZXIgdGhlIGRlY2ltYWwgcG9pbnQgaW4gRVhQTEFJTiBBTkFMWVpFLgoKUHJldmlvdXNseSwg dGhlIGF2ZXJhZ2Ugcm93cyB2YWx1ZSB3YXMgYWx3YXlzIHJvdW5kZWQgdG8gYW4gaW50ZWdl ciwKd2hpY2ggY291bGQgbGVhZCB0byBtaXNsZWFkaW5nIHJlc3VsdHMgd2hlbiBlc3RpbWF0 aW5nIHRvdGFsIHJvd3MKYnkgbXVsdGlwbHlpbmcgcm93cyBieSBsb29wLiBUaGlzIGNoYW5n ZSBlbnN1cmVzIHRoYXQgdXNlcnMKZ2V0IGEgbW9yZSBhY2N1cmF0ZSByZXByZXNlbnRhdGlv biBvZiB0aGUgZGF0YSBmbG93IHRocm91Z2ggZXhlY3V0aW9uIG5vZGVzLgotLS0KIGRvYy9z cmMvc2dtbC9wZXJmb3JtLnNnbWwgfCA0MSArKysrKysrKysrKysrKysrKysrKy0tLS0tLS0t LS0tLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAyMSBpbnNlcnRpb25zKCspLCAyMCBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvcGVyZm9ybS5zZ21sIGIvZG9j L3NyYy9zZ21sL3BlcmZvcm0uc2dtbAppbmRleCBhNTAyYTJhYWJhLi5kZDYxYWU0NTA3IDEw MDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvcGVyZm9ybS5zZ21sCisrKyBiL2RvYy9zcmMvc2dt bC9wZXJmb3JtLnNnbWwKQEAgLTcxNywyNiArNzE3LDI2IEBAIEZST00gdGVuazEgdDEgV0hF UkUgdDEudGVuID0gKFNFTEVDVCAocmFuZG9tKCkgKiAxMCk6OmludGVnZXIpOwogPHNjcmVl bj4KIEVYUExBSU4gQU5BTFlaRSBTRUxFQ1QgKgogRlJPTSB0ZW5rMSB0MSwgdGVuazIgdDIK LVdIRVJFIHQxLnVuaXF1ZTEgJmx0OyAxMCBBTkQgdDEudW5pcXVlMiA9IHQyLnVuaXF1ZTI7 Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSZ6d3NwOy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gTmVz dGVkIExvb3AgIChjb3N0PTQuNjUuLjExOC41MCByb3dzPTEwIHdpZHRoPTQ4OCkgKGFjdHVh bCB0aW1lPTAuMDE3Li4wLjA1MSByb3dzPTEwIGxvb3BzPTEpCi0gICBCdWZmZXJzOiBzaGFy ZWQgaGl0PTM2IHJlYWQ9NgotICAgLSZndDsgIEJpdG1hcCBIZWFwIFNjYW4gb24gdGVuazEg dDEgIChjb3N0PTQuMzYuLjM5LjM4IHJvd3M9MTAgd2lkdGg9MjQ0KSAoYWN0dWFsIHRpbWU9 MC4wMDkuLjAuMDE3IHJvd3M9MTAgbG9vcHM9MSkKLSAgICAgICAgIFJlY2hlY2sgQ29uZDog KHVuaXF1ZTEgJmx0OyAxMCkKLSAgICAgICAgIEhlYXAgQmxvY2tzOiBleGFjdD0xMAotICAg ICAgICAgQnVmZmVyczogc2hhcmVkIGhpdD0zIHJlYWQ9NSB3cml0dGVuPTQKLSAgICAgICAg IC0mZ3Q7ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV91bmlxdWUxICAoY29zdD0wLjAw Li40LjM2IHJvd3M9MTAgd2lkdGg9MCkgKGFjdHVhbCB0aW1lPTAuMDA0Li4wLjAwNCByb3dz PTEwIGxvb3BzPTEpCi0gICAgICAgICAgICAgICBJbmRleCBDb25kOiAodW5pcXVlMSAmbHQ7 IDEwKQorV0hFUkUgdDEudGhvdXNhbmQgJmx0OyAxMCBBTkQgdDEudW5pcXVlMiAmZ3Q7IHQy LnVuaXF1ZTI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTgorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSZ6d3Nw Oy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCAgKGNvc3Q9NS40MC4uMTE1NzEu NDQgcm93cz0zNTY2Njcgd2lkdGg9NDg4KSAoYWN0dWFsIHRpbWU9MC4wNDIuLjExNy4yMDUg cm93cz01MTM4MzIgbG9vcHM9MSkKKyAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MTkzNzcgcmVh ZD0yOQorICAgLSZndDsgIEJpdG1hcCBIZWFwIFNjYW4gb24gdGVuazEgdDEgIChjb3N0PTUu MTEuLjIzMy42MCByb3dzPTEwNyB3aWR0aD0yNDQpIChhY3R1YWwgdGltZT0wLjAyMS4uMC4x MDMgcm93cz0xMDAgbG9vcHM9MSkKKyAgICAgICAgIFJlY2hlY2sgQ29uZDogKHRob3VzYW5k ICZsdDsgMTApCisgICAgICAgICBIZWFwIEJsb2NrczogZXhhY3Q9OTAKKyAgICAgICAgIEJ1 ZmZlcnM6IHNoYXJlZCBoaXQ9OTIKKyAgICAgICAgIC0mZ3Q7ICBCaXRtYXAgSW5kZXggU2Nh biBvbiB0ZW5rMV90aG91c190ZW50aG91cyAgKGNvc3Q9MC4wMC4uNS4wOSByb3dzPTEwNyB3 aWR0aD0wKSAoYWN0dWFsIHRpbWU9MC4wMTAuLjAuMDEwIHJvd3M9MTAwIGxvb3BzPTEpCisg ICAgICAgICAgICAgICBJbmRleCBDb25kOiAodGhvdXNhbmQgJmx0OyAxMCkKICAgICAgICAg ICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MgotICAgLSZndDsgIEluZGV4IFNjYW4gdXNp bmcgdGVuazJfdW5pcXVlMiBvbiB0ZW5rMiB0MiAgKGNvc3Q9MC4yOS4uNy45MCByb3dzPTEg d2lkdGg9MjQ0KSAoYWN0dWFsIHRpbWU9MC4wMDMuLjAuMDAzIHJvd3M9MSBsb29wcz0xMCkK LSAgICAgICAgIEluZGV4IENvbmQ6ICh1bmlxdWUyID0gdDEudW5pcXVlMikKLSAgICAgICAg IEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MjQgcmVhZD02CisgICAtJmd0OyAgSW5kZXggU2NhbiB1 c2luZyB0ZW5rMl91bmlxdWUyIG9uIHRlbmsyIHQyICAoY29zdD0wLjI5Li43Mi42MyByb3dz PTMzMzMgd2lkdGg9MjQ0KSAoYWN0dWFsIHRpbWU9MC4wMDYuLjAuNDEwIHJvd3M9NTEzOC4z MiBsb29wcz0xMDApCisgICAgICAgICBJbmRleCBDb25kOiAodW5pcXVlMiAmbHQ7IHQxLnVu aXF1ZTIpCisgICAgICAgICBCdWZmZXJzOiBzaGFyZWQgaGl0PTE5Mjg1IHJlYWQ9MjkKICBQ bGFubmluZzoKLSAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MTUgZGlydGllZD05Ci0gUGxhbm5p bmcgVGltZTogMC40ODUgbXMKLSBFeGVjdXRpb24gVGltZTogMC4wNzMgbXMKKyAgIEJ1ZmZl cnM6IHNoYXJlZCBoaXQ9MjU4IHJlYWQ9OSBkaXJ0aWVkPTIKKyBQbGFubmluZyBUaW1lOiAw LjUxOSBtcworIEV4ZWN1dGlvbiBUaW1lOiAxMzEuMzc4IG1zCiA8L3NjcmVlbj4KIAogICAg IE5vdGUgdGhhdCB0aGUgPHF1b3RlPmFjdHVhbCB0aW1lPC9xdW90ZT4gdmFsdWVzIGFyZSBp biBtaWxsaXNlY29uZHMgb2YKQEAgLTc1Niw4ICs3NTYsOSBAQCBXSEVSRSB0MS51bmlxdWUx ICZsdDsgMTAgQU5EIHQxLnVuaXF1ZTIgPSB0Mi51bmlxdWUyOwogICAgIHZhbHVlcyBzaG93 biBhcmUgYXZlcmFnZXMgcGVyLWV4ZWN1dGlvbi4gIFRoaXMgaXMgZG9uZSB0byBtYWtlIHRo ZSBudW1iZXJzCiAgICAgY29tcGFyYWJsZSB3aXRoIHRoZSB3YXkgdGhhdCB0aGUgY29zdCBl c3RpbWF0ZXMgYXJlIHNob3duLiAgTXVsdGlwbHkgYnkKICAgICB0aGUgPGxpdGVyYWw+bG9v cHM8L2xpdGVyYWw+IHZhbHVlIHRvIGdldCB0aGUgdG90YWwgdGltZSBhY3R1YWxseSBzcGVu dCBpbgotICAgIHRoZSBub2RlLiAgSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHdlIHNwZW50IGEg dG90YWwgb2YgMC4wMzAgbWlsbGlzZWNvbmRzCi0gICAgZXhlY3V0aW5nIHRoZSBpbmRleCBz Y2FucyBvbiA8bGl0ZXJhbD50ZW5rMjwvbGl0ZXJhbD4uCisgICAgdGhlIG5vZGUsIGFuZCB0 byBnZXQgdGhlIHRvdGFsIHJvd3MgcHJvY2Vzc2VkIGluIHRoZSBub2RlLiBJbiB0aGUgYWJv dmUgZXhhbXBsZSwKKyAgICB3ZSBzcGVudCBhIHRvdGFsIG9mIDQxIG1pbGxpc2Vjb25kcyBl eGVjdXRpbmcgdGhlIGluZGV4IHNjYW5zLAorICAgIGFuZCB0aGUgbm9kZSBwcm9jZXNzZWQg YSB0b3RhbCBvZiA1MTM4MzIgcm93cyBvbiA8bGl0ZXJhbD50ZW5rMjwvbGl0ZXJhbD4uCiAg ICA8L3BhcmE+CiAKICAgIDxwYXJhPgotLSAKMi4zNC4xCgo= --------------retXDkxedXx2JPZyCAnrNafM Content-Type: text/x-patch; charset=UTF-8; name="v9-0002-Clarify-display-of-rows-as-decimal-fractions.patch" Content-Disposition: attachment; filename*0="v9-0002-Clarify-display-of-rows-as-decimal-fractions.patch" Content-Transfer-Encoding: base64 RnJvbSBhMzBlZTcxMjQwZDczMWMzODZmOWRkNGViMzdiMjgxN2UzMjM4ODA3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5ydT4KRGF0ZTogVGh1LCAxMyBGZWIgMjAyNSAxMToyNDowMyArMDMwMApT dWJqZWN0OiBbUEFUQ0ggdjldIENsYXJpZnkgZGlzcGxheSBvZiByb3dzIGFzIGRlY2ltYWwg ZnJhY3Rpb25zCgpXaGVuIGxvb3BzID4gMSwgdGhlIGF2ZXJhZ2Ugcm93cyB2YWx1ZSBpcyBu b3cgZGlzcGxheWVkIGFzIGEgZGVjaW1hbCBmcmFjdGlvbgp3aXRoIHR3byBkaWdpdHMgYWZ0 ZXIgdGhlIGRlY2ltYWwgcG9pbnQgaW4gRVhQTEFJTiBBTkFMWVpFLgoKUHJldmlvdXNseSwg dGhlIGF2ZXJhZ2Ugcm93cyB2YWx1ZSB3YXMgYWx3YXlzIHJvdW5kZWQgdG8gYW4gaW50ZWdl ciwKd2hpY2ggY291bGQgbGVhZCB0byBtaXNsZWFkaW5nIHJlc3VsdHMgd2hlbiBlc3RpbWF0 aW5nIHRvdGFsIHJvd3MKYnkgbXVsdGlwbHlpbmcgcm93cyBieSBsb29wLiBUaGlzIGNoYW5n ZSBlbnN1cmVzIHRoYXQgdXNlcnMKZ2V0IGEgbW9yZSBhY2N1cmF0ZSByZXByZXNlbnRhdGlv biBvZiB0aGUgZGF0YSBmbG93IHRocm91Z2ggZXhlY3V0aW9uIG5vZGVzLgotLS0KIHNyYy9i YWNrZW5kL2NvbW1hbmRzL2V4cGxhaW4uYyAgICAgICAgICAgICAgICB8IDU1ICsrKysrKysr KysrKystLS0tLS0KIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcGFydGl0aW9uX3BydW5l Lm91dCB8IDE4ICsrKy0tLQogc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGFydGl0aW9uX3BydW5l LnNxbCAgICAgIHwgIDIgKy0KIDMgZmlsZXMgY2hhbmdlZCwgNDkgaW5zZXJ0aW9ucygrKSwg MjYgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvZXhw bGFpbi5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvZXhwbGFpbi5jCmluZGV4IGMyNGU2NmY4 MmUuLmFlODFhZWVhMTMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2V4cGxh aW4uYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMKQEAgLTEzLDYgKzEz LDggQEAKICAqLwogI2luY2x1ZGUgInBvc3RncmVzLmgiCiAKKyNpbmNsdWRlIDxtYXRoLmg+ CisKICNpbmNsdWRlICJhY2Nlc3MveGFjdC5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfdHlw ZS5oIgogI2luY2x1ZGUgImNvbW1hbmRzL2NyZWF0ZWFzLmgiCkBAIC02OSw2ICs3MSw5IEBA IHR5cGVkZWYgc3RydWN0IFNlcmlhbGl6ZU1ldHJpY3MKICAqLwogI2RlZmluZSBCWVRFU19U T19LSUxPQllURVMoYikgKCgoYikgKyAxMDIzKSAvIDEwMjQpCiAKKy8qIENoZWNrIGlmIGZs b2F0L2RvdWJsZSBoYXMgYW55IGRlY2ltYWwgbnVtYmVyICovCisjZGVmaW5lIEhBU19ERUNJ TUFMKHgpIChmbG9vcih4KSAhPSB4KQorCiBzdGF0aWMgdm9pZCBFeHBsYWluT25lUXVlcnko UXVlcnkgKnF1ZXJ5LCBpbnQgY3Vyc29yT3B0aW9ucywKIAkJCQkJCQlJbnRvQ2xhdXNlICpp bnRvLCBFeHBsYWluU3RhdGUgKmVzLAogCQkJCQkJCVBhcnNlU3RhdGUgKnBzdGF0ZSwgUGFy YW1MaXN0SW5mbyBwYXJhbXMpOwpAQCAtMTk4MSwxNCArMTk4NiwxNSBAQCBFeHBsYWluTm9k ZShQbGFuU3RhdGUgKnBsYW5zdGF0ZSwgTGlzdCAqYW5jZXN0b3JzLAogCiAJCWlmIChlcy0+ Zm9ybWF0ID09IEVYUExBSU5fRk9STUFUX1RFWFQpCiAJCXsKKwkJCWFwcGVuZFN0cmluZ0lu Zm8oZXMtPnN0ciwgIiAoYWN0dWFsICIpOworCiAJCQlpZiAoZXMtPnRpbWluZykKLQkJCQlh cHBlbmRTdHJpbmdJbmZvKGVzLT5zdHIsCi0JCQkJCQkJCSAiIChhY3R1YWwgdGltZT0lLjNm Li4lLjNmIHJvd3M9JS4wZiBsb29wcz0lLjBmKSIsCi0JCQkJCQkJCSBzdGFydHVwX21zLCB0 b3RhbF9tcywgcm93cywgbmxvb3BzKTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZvKGVzLT5zdHIs ICJ0aW1lPSUuM2YuLiUuM2YgIiwgc3RhcnR1cF9tcywgdG90YWxfbXMpOworCisJCQlpZiAo bmxvb3BzID4gMSAmJiBIQVNfREVDSU1BTChyb3dzKSkKKwkJCQlhcHBlbmRTdHJpbmdJbmZv KGVzLT5zdHIsICJyb3dzPSUuMmYgbG9vcHM9JS4wZikiLCByb3dzLCBubG9vcHMpOwogCQkJ ZWxzZQotCQkJCWFwcGVuZFN0cmluZ0luZm8oZXMtPnN0ciwKLQkJCQkJCQkJICIgKGFjdHVh bCByb3dzPSUuMGYgbG9vcHM9JS4wZikiLAotCQkJCQkJCQkgcm93cywgbmxvb3BzKTsKKwkJ CQlhcHBlbmRTdHJpbmdJbmZvKGVzLT5zdHIsICJyb3dzPSUuMGYgbG9vcHM9JS4wZikiLCBy b3dzLCBubG9vcHMpOwogCQl9CiAJCWVsc2UKIAkJewpAQCAtMTk5OSw4ICsyMDA1LDE2IEBA IEV4cGxhaW5Ob2RlKFBsYW5TdGF0ZSAqcGxhbnN0YXRlLCBMaXN0ICphbmNlc3RvcnMsCiAJ CQkJRXhwbGFpblByb3BlcnR5RmxvYXQoIkFjdHVhbCBUb3RhbCBUaW1lIiwgIm1zIiwgdG90 YWxfbXMsCiAJCQkJCQkJCQkgMywgZXMpOwogCQkJfQotCQkJRXhwbGFpblByb3BlcnR5Rmxv YXQoIkFjdHVhbCBSb3dzIiwgTlVMTCwgcm93cywgMCwgZXMpOwotCQkJRXhwbGFpblByb3Bl cnR5RmxvYXQoIkFjdHVhbCBMb29wcyIsIE5VTEwsIG5sb29wcywgMCwgZXMpOworCQkJaWYg KG5sb29wcyA+IDEgJiYgSEFTX0RFQ0lNQUwocm93cykpCisJCQl7CisJCQkJRXhwbGFpblBy b3BlcnR5RmxvYXQoIkFjdHVhbCBSb3dzIiwgTlVMTCwgcm93cywgMiwgZXMpOworCQkJCUV4 cGxhaW5Qcm9wZXJ0eUZsb2F0KCJBY3R1YWwgTG9vcHMiLCBOVUxMLCBubG9vcHMsIDAsIGVz KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlFeHBsYWluUHJvcGVydHlGbG9hdCgiQWN0 dWFsIFJvd3MiLCBOVUxMLCByb3dzLCAwLCBlcyk7CisJCQkJRXhwbGFpblByb3BlcnR5Rmxv YXQoIkFjdHVhbCBMb29wcyIsIE5VTEwsIG5sb29wcywgMCwgZXMpOworCQkJfQogCQl9CiAJ fQogCWVsc2UgaWYgKGVzLT5hbmFseXplKQpAQCAtMjA1MiwxNCArMjA2NiwxNCBAQCBFeHBs YWluTm9kZShQbGFuU3RhdGUgKnBsYW5zdGF0ZSwgTGlzdCAqYW5jZXN0b3JzLAogCQkJaWYg KGVzLT5mb3JtYXQgPT0gRVhQTEFJTl9GT1JNQVRfVEVYVCkKIAkJCXsKIAkJCQlFeHBsYWlu SW5kZW50VGV4dChlcyk7CisJCQkJYXBwZW5kU3RyaW5nSW5mbyhlcy0+c3RyLCAiYWN0dWFs ICIpOwogCQkJCWlmIChlcy0+dGltaW5nKQotCQkJCQlhcHBlbmRTdHJpbmdJbmZvKGVzLT5z dHIsCi0JCQkJCQkJCQkgImFjdHVhbCB0aW1lPSUuM2YuLiUuM2Ygcm93cz0lLjBmIGxvb3Bz PSUuMGZcbiIsCi0JCQkJCQkJCQkgc3RhcnR1cF9tcywgdG90YWxfbXMsIHJvd3MsIG5sb29w cyk7CisJCQkJCWFwcGVuZFN0cmluZ0luZm8oZXMtPnN0ciwgInRpbWU9JS4zZi4uJS4zZiIs IHN0YXJ0dXBfbXMsIHRvdGFsX21zKTsKKworCQkJCWlmIChubG9vcHMgPiAxICYmIEhBU19E RUNJTUFMKHJvd3MpKQorCQkJCQlhcHBlbmRTdHJpbmdJbmZvKGVzLT5zdHIsICJyb3dzPSUu MmYgbG9vcHM9JS4wZlxuIiwgcm93cywgbmxvb3BzKTsKIAkJCQllbHNlCi0JCQkJCWFwcGVu ZFN0cmluZ0luZm8oZXMtPnN0ciwKLQkJCQkJCQkJCSAiYWN0dWFsIHJvd3M9JS4wZiBsb29w cz0lLjBmXG4iLAotCQkJCQkJCQkJIHJvd3MsIG5sb29wcyk7CisJCQkJCWFwcGVuZFN0cmlu Z0luZm8oZXMtPnN0ciwgInJvd3M9JS4wZiBsb29wcz0lLjBmXG4iLCByb3dzLCBubG9vcHMp OwogCQkJfQogCQkJZWxzZQogCQkJewpAQCAtMjA3MCw4ICsyMDg0LDE3IEBAIEV4cGxhaW5O b2RlKFBsYW5TdGF0ZSAqcGxhbnN0YXRlLCBMaXN0ICphbmNlc3RvcnMsCiAJCQkJCUV4cGxh aW5Qcm9wZXJ0eUZsb2F0KCJBY3R1YWwgVG90YWwgVGltZSIsICJtcyIsCiAJCQkJCQkJCQkJ IHRvdGFsX21zLCAzLCBlcyk7CiAJCQkJfQotCQkJCUV4cGxhaW5Qcm9wZXJ0eUZsb2F0KCJB Y3R1YWwgUm93cyIsIE5VTEwsIHJvd3MsIDAsIGVzKTsKLQkJCQlFeHBsYWluUHJvcGVydHlG bG9hdCgiQWN0dWFsIExvb3BzIiwgTlVMTCwgbmxvb3BzLCAwLCBlcyk7CisKKwkJCQlpZiAo bmxvb3BzID4gMSAmJiBIQVNfREVDSU1BTChyb3dzKSkKKwkJCQl7CisJCQkJCUV4cGxhaW5Q cm9wZXJ0eUZsb2F0KCJBY3R1YWwgUm93cyIsIE5VTEwsIHJvd3MsIDIsIGVzKTsKKwkJCQkJ RXhwbGFpblByb3BlcnR5RmxvYXQoIkFjdHVhbCBMb29wcyIsIE5VTEwsIG5sb29wcywgMCwg ZXMpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlFeHBsYWluUHJvcGVydHlGbG9h dCgiQWN0dWFsIFJvd3MiLCBOVUxMLCByb3dzLCAwLCBlcyk7CisJCQkJCUV4cGxhaW5Qcm9w ZXJ0eUZsb2F0KCJBY3R1YWwgTG9vcHMiLCBOVUxMLCBubG9vcHMsIDAsIGVzKTsKKwkJCQl9 CiAJCQl9CiAKIAkJCUV4cGxhaW5DbG9zZVdvcmtlcihuLCBlcyk7CmRpZmYgLS1naXQgYS9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3BhcnRpdGlvbl9wcnVuZS5vdXQgYi9zcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL3BhcnRpdGlvbl9wcnVuZS5vdXQKaW5kZXggZTY2NzUwM2M5 Ni4uZmRlNDRkYjFhMCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9w YXJ0aXRpb25fcHJ1bmUub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcGFy dGl0aW9uX3BydW5lLm91dApAQCAtMjM2Nyw3ICsyMzY3LDcgQEAgYmVnaW4KICAgICAgICAg ICAgICQxKQogICAgIGxvb3AKICAgICAgICAgbG4gOj0gcmVnZXhwX3JlcGxhY2UobG4sICdX b3JrZXJzIExhdW5jaGVkOiBcZCsnLCAnV29ya2VycyBMYXVuY2hlZDogTicpOwotICAgICAg ICBsbiA6PSByZWdleHBfcmVwbGFjZShsbiwgJ2FjdHVhbCByb3dzPVxkKyBsb29wcz1cZCsn LCAnYWN0dWFsIHJvd3M9TiBsb29wcz1OJyk7CisgICAgICAgIGxuIDo9IHJlZ2V4cF9yZXBs YWNlKGxuLCAnYWN0dWFsIHJvd3M9XGQrKD86XC5cZCspPyBsb29wcz1cZCsnLCAnYWN0dWFs IHJvd3M9TiBsb29wcz1OJyk7CiAgICAgICAgIGxuIDo9IHJlZ2V4cF9yZXBsYWNlKGxuLCAn Um93cyBSZW1vdmVkIGJ5IEZpbHRlcjogXGQrJywgJ1Jvd3MgUmVtb3ZlZCBieSBGaWx0ZXI6 IE4nKTsKICAgICAgICAgcmV0dXJuIG5leHQgbG47CiAgICAgZW5kIGxvb3A7CkBAIC0zMDQ5 LDE0ICszMDQ5LDE0IEBAIG9yZGVyIGJ5IHRibDEuY29sMSwgdHBydC5jb2wxOwogaW5zZXJ0 IGludG8gdGJsMSB2YWx1ZXMgKDEwMDEpLCAoMTAxMCksICgxMDExKTsKIGV4cGxhaW4gKGFu YWx5emUsIGNvc3RzIG9mZiwgc3VtbWFyeSBvZmYsIHRpbWluZyBvZmYsIGJ1ZmZlcnMgb2Zm KQogc2VsZWN0ICogZnJvbSB0YmwxIGlubmVyIGpvaW4gdHBydCBvbiB0YmwxLmNvbDEgPiB0 cHJ0LmNvbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIE5l c3RlZCBMb29wIChhY3R1YWwgcm93cz0yMyBsb29wcz0xKQogICAgLT4gIFNlcSBTY2FuIG9u IHRibDEgKGFjdHVhbCByb3dzPTUgbG9vcHM9MSkKLSAgIC0+ICBBcHBlbmQgKGFjdHVhbCBy b3dzPTUgbG9vcHM9NSkKKyAgIC0+ICBBcHBlbmQgKGFjdHVhbCByb3dzPTQuNjAgbG9vcHM9 NSkKICAgICAgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIHRwcnQxX2lkeCBvbiB0cHJ0XzEg KGFjdHVhbCByb3dzPTIgbG9vcHM9NSkKICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChj b2wxIDwgdGJsMS5jb2wxKQotICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgdHBydDJf aWR4IG9uIHRwcnRfMiAoYWN0dWFsIHJvd3M9MyBsb29wcz00KQorICAgICAgICAgLT4gIElu ZGV4IFNjYW4gdXNpbmcgdHBydDJfaWR4IG9uIHRwcnRfMiAoYWN0dWFsIHJvd3M9Mi43NSBs b29wcz00KQogICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGNvbDEgPCB0YmwxLmNvbDEp CiAgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyB0cHJ0M19pZHggb24gdHBydF8zIChh Y3R1YWwgcm93cz0xIGxvb3BzPTIpCiAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoY29s MSA8IHRibDEuY29sMSkKQEAgLTMwNzAsMTYgKzMwNzAsMTYgQEAgc2VsZWN0ICogZnJvbSB0 YmwxIGlubmVyIGpvaW4gdHBydCBvbiB0YmwxLmNvbDEgPiB0cHJ0LmNvbDE7CiAKIGV4cGxh aW4gKGFuYWx5emUsIGNvc3RzIG9mZiwgc3VtbWFyeSBvZmYsIHRpbWluZyBvZmYsIGJ1ZmZl cnMgb2ZmKQogc2VsZWN0ICogZnJvbSB0YmwxIGlubmVyIGpvaW4gdHBydCBvbiB0YmwxLmNv bDEgPSB0cHJ0LmNvbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQogIE5lc3RlZCBMb29wIChhY3R1YWwgcm93cz0zIGxvb3BzPTEpCiAgICAtPiAgU2VxIFNj YW4gb24gdGJsMSAoYWN0dWFsIHJvd3M9NSBsb29wcz0xKQotICAgLT4gIEFwcGVuZCAoYWN0 dWFsIHJvd3M9MSBsb29wcz01KQorICAgLT4gIEFwcGVuZCAoYWN0dWFsIHJvd3M9MC42MCBs b29wcz01KQogICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgdHBydDFfaWR4IG9uIHRw cnRfMSAobmV2ZXIgZXhlY3V0ZWQpCiAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoY29s MSA9IHRibDEuY29sMSkKICAgICAgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIHRwcnQyX2lk eCBvbiB0cHJ0XzIgKGFjdHVhbCByb3dzPTEgbG9vcHM9MikKICAgICAgICAgICAgICAgIElu ZGV4IENvbmQ6IChjb2wxID0gdGJsMS5jb2wxKQotICAgICAgICAgLT4gIEluZGV4IFNjYW4g dXNpbmcgdHBydDNfaWR4IG9uIHRwcnRfMyAoYWN0dWFsIHJvd3M9MCBsb29wcz0zKQorICAg ICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgdHBydDNfaWR4IG9uIHRwcnRfMyAoYWN0dWFs IHJvd3M9MC4zMyBsb29wcz0zKQogICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGNvbDEg PSB0YmwxLmNvbDEpCiAgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyB0cHJ0NF9pZHgg b24gdHBydF80IChuZXZlciBleGVjdXRlZCkKICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6 IChjb2wxID0gdGJsMS5jb2wxKQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwv cGFydGl0aW9uX3BydW5lLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3BhcnRpdGlvbl9w cnVuZS5zcWwKaW5kZXggNzMwNTQ1ZTg2YS4uNTg3NTZlMGIxOCAxMDA2NDQKLS0tIGEvc3Jj L3Rlc3QvcmVncmVzcy9zcWwvcGFydGl0aW9uX3BydW5lLnNxbAorKysgYi9zcmMvdGVzdC9y ZWdyZXNzL3NxbC9wYXJ0aXRpb25fcHJ1bmUuc3FsCkBAIC01ODYsNyArNTg2LDcgQEAgYmVn aW4KICAgICAgICAgICAgICQxKQogICAgIGxvb3AKICAgICAgICAgbG4gOj0gcmVnZXhwX3Jl cGxhY2UobG4sICdXb3JrZXJzIExhdW5jaGVkOiBcZCsnLCAnV29ya2VycyBMYXVuY2hlZDog TicpOwotICAgICAgICBsbiA6PSByZWdleHBfcmVwbGFjZShsbiwgJ2FjdHVhbCByb3dzPVxk KyBsb29wcz1cZCsnLCAnYWN0dWFsIHJvd3M9TiBsb29wcz1OJyk7CisgICAgICAgIGxuIDo9 IHJlZ2V4cF9yZXBsYWNlKGxuLCAnYWN0dWFsIHJvd3M9XGQrKD86XC5cZCspPyBsb29wcz1c ZCsnLCAnYWN0dWFsIHJvd3M9TiBsb29wcz1OJyk7CiAgICAgICAgIGxuIDo9IHJlZ2V4cF9y ZXBsYWNlKGxuLCAnUm93cyBSZW1vdmVkIGJ5IEZpbHRlcjogXGQrJywgJ1Jvd3MgUmVtb3Zl ZCBieSBGaWx0ZXI6IE4nKTsKICAgICAgICAgcmV0dXJuIG5leHQgbG47CiAgICAgZW5kIGxv b3A7Ci0tIAoyLjM0LjEKCg== --------------retXDkxedXx2JPZyCAnrNafM--