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 1v2IsC-002EkT-1K for pgsql-hackers@arkaria.postgresql.org; Sat, 27 Sep 2025 00:33:12 +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 1v2Is9-006tza-Je for pgsql-hackers@arkaria.postgresql.org; Sat, 27 Sep 2025 00:33:10 +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 1v2Is9-006tzS-5F for pgsql-hackers@lists.postgresql.org; Sat, 27 Sep 2025 00:33:09 +0000 Received: from mail-pg1-x530.google.com ([2607:f8b0:4864:20::530]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1v2Is6-00076m-2d for pgsql-hackers@postgresql.org; Sat, 27 Sep 2025 00:33:08 +0000 Received: by mail-pg1-x530.google.com with SMTP id 41be03b00d2f7-b55562f3130so1973025a12.2 for ; Fri, 26 Sep 2025 17:33:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1758933186; x=1759537986; darn=postgresql.org; h=cc:to:subject:message-id:date:from:reply-to:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=BAD+SGHH6BnOdnoL+ir+Iy9oURTImFXJI4IGM7GRg/k=; b=LLqTeQyKuWuoPqBx1nZzSQg8egP/mTa0N/tioQLHfesx4JyN4G6w2bwXNv7Q9NW2kw hbq8Foh9U56AKJm90Bq2PaMiK+uTzM1hX/dNOlNVJYD5oTWaEoUdfo7LXmRQvY+oFs4T gkQYKT6FJw8IPMnNdFfsMZ0VEinOiXBx+hkcvuCCiQahG5IOznaX1F3mXBZfbY+VloW7 bEakWEvS2JRt8dZezhRAcDVtqfayIHW4XU+IW1Mfw8Hlor9FpHiCqkw2+HHUFyUUY3hN Yyxo2AJpUhCs9CkFVyHrXfRZaKgR+1Kor8dKwgkKoeLzmZ+5dC0hWhrDVgWPsM83Sw4v 5BFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758933186; x=1759537986; h=cc:to:subject:message-id:date:from:reply-to:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=BAD+SGHH6BnOdnoL+ir+Iy9oURTImFXJI4IGM7GRg/k=; b=D0tqRn+5CMF0bIaCufZdrM9bu9L9A/EGANSw8//MInKGABjoH8L1N7IFD3zZhytZCS uf/GKGWBeJhsu3lRL/yM63VsNxG2qmakvR1lrC+EOfSAmLzrlKZy15e9OqwmMx5Y1bd9 kR5qLuvr/LaH38hhPtRULdktIlbxhB2ib3P2zj6Hh/ZeLXmVky+aF/1CyION1LwNx82F S+OyoYBJ3I8/x19E1JiNISoI1j7XEeA2IDV5knbN01TsfOzeuU6kbcHUGVygLawFKNd4 dbYOA8zFFrA1adeG6nthoKPfxSlxMx2lmOo0F1CVpJwOotAfDI9eT61/M7/R3p48GsSD DOQg== X-Forwarded-Encrypted: i=1; AJvYcCW81kpA67eqvHDHZNBvbnGGjFPH3E4Baq7usHoHHmUqnfeq3yiuENGT7yYK7MHXCUgBMQxpxTSlkSppjzm8@postgresql.org X-Gm-Message-State: AOJu0YxspYGXmbsHypXGr772HHRfSfpsYpt8AJtrweA33CsDvPcbh+PL y/3Jmk4AqzZMxniP0OQ9EZJ+li+rOHUPlXzXEhGzdWKSsYOdD7Hk5sQmdpsHvNsTyCT4+u+Vf1w zYwdWvMbu3g9KbfifhEgRdaGg/VLfuDA= X-Gm-Gg: ASbGnctSLE7swepvnPpmOSGRNajEKyvGupKP4M3HqNKX/ejJkSfIXHPJTgBxiy+1V/g aZtRDDVvHOlDJFM4d40QGNa+QgAAeJk+juH8oTdE01QgontA3nqN7PYaAVhMP3R+j3QHHf68OXV 1PGwb3/dab1ZyVpb2MYa4s2M/v6tcNvAWkfFGIF2RK6gSBsQqA09pxPQCGYg3pnm3VNM/KwooFe QNBt+wp3ahbn2m/BZziWZuEPw34mKoVzQsuyTIwkLJkyN33MkY= X-Google-Smtp-Source: AGHT+IHYyVBcyQ9GONWIZKk0ylSzu8YGQCfdVWCAJkQmQrXuJPCyHg4azlScFaOb3flF13g9tjgF0+IkXjI2dhpR5dY= X-Received: by 2002:a17:902:f60e:b0:264:befb:828e with SMTP id d9443c01a7336-27ed49df231mr97779445ad.11.1758933186486; Fri, 26 Sep 2025 17:33:06 -0700 (PDT) MIME-Version: 1.0 References: <34604.1758921116@sss.pgh.pa.us> In-Reply-To: <34604.1758921116@sss.pgh.pa.us> Reply-To: maciek@sakrejda.org From: Maciek Sakrejda Date: Fri, 26 Sep 2025 17:31:43 -0700 X-Gm-Features: AS18NWB9IjbVHWTkxMbsvCbRgiPRm3kwuDTOnVdYbOtsSguu76CXPKXy6eLXbUw Message-ID: Subject: Re: V18 change on EXPLAIN ANALYZE To: Tom Lane Cc: maciek@sakrejda.org, Robert Haas , Marcos Pegoraro , pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000c3c752063fbd8b52" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000c3c752063fbd8b52 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Fri, Sep 26, 2025 at 2:12=E2=80=AFPM Tom Lane wrote: > Maciek Sakrejda writes: > > The page you link says > > > In some query plans, it is possible for a subplan node to be > > executed more than once. For example, the inner index scan will be > > executed once per outer row in the above nested-loop plan. In such > > cases, the loops value reports the total number of executions of the > > node, and the actual time and rows values shown are averages > > per-execution. This is done to make the numbers comparable with the > > way that the cost estimates are shown. Multiply by the loops value to > > get the total time actually spent in the node. In the above example, > > we spent a total of 0.030 milliseconds executing the index scans on > > tenk2. > > > in the second paragraph after the example in this section. Do you > > think that's not sufficiently clear? > > It's not wrong, but it feels a little incomplete now. Maybe change > the last two sentences to > > Multiply by the loops value to get the total time actually spent in > the node and the total number of rows processed by the node across all > executions. In the above example, we spent a total of 0.030 > milliseconds executing the index scans on tenk2, and they handled a > total of 10 rows. > > A bigger gap in perform.sgml is that it doesn't address parallel > query cases at all AFAICS. I think that was one of the main drivers > of this change, so it feels a little sad that it's not covered here. Fair point. I included your proposed change and took a stab at briefly covering parallelism in the attached (admittedly, my understanding of how that works is a little shaky, so apologies if I'm way off on some of this). However, to get a parallel query in the regression database (I chose EXPLAIN ANALYZE SELECT * FROM tenk2), I had to change some settings: SET min_parallel_table_scan_size =3D 0; SET parallel_tuple_cost =3D 0; SET parallel_setup_cost =3D 0; Should I mention that in the example? Or should I generate a bigger table so using these is not necessary? If we say nothing and use the example, I think it may be confusing if someone wants to use the example as a starting point for their own exploration of how this works. Or is there a better query that works out of the box and does not need changes to the settings? It also seems like the EXPLAIN ANALYZE section is getting a little unwieldy. Should we subdivide it, or is this still okay? Thanks, Maciek --000000000000c3c752063fbd8b52 Content-Type: text/x-patch; charset="US-ASCII"; name="v1-0001-Improve-EXPLAIN-docs.patch" Content-Disposition: attachment; filename="v1-0001-Improve-EXPLAIN-docs.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mg1j8evq0 RnJvbSAxYzc3N2IwN2ZmMWMwODU4ODRmMjczZGZkNDAyOTBhMDY5MjFlMjI0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYWNpZWsgU2FrcmVqZGEgPG0uc2FrcmVqZGFAZ21haWwuY29t PgpEYXRlOiBGcmksIDI2IFNlcCAyMDI1IDE3OjE3OjQxIC0wNzAwClN1YmplY3Q6IFtQQVRDSCB2 MV0gSW1wcm92ZSBFWFBMQUlOIGRvY3MKCiAtIGNsYXJpZnkgZnJhY3Rpb25hbCByb3dzIGluIGxv b3BzCiAtIGFkZCBzb21lIGJhc2ljIGluZm8gb24gcGFyYWxsZWwgZXhlY3V0aW9uCi0tLQogZG9j L3NyYy9zZ21sL3BlcmZvcm0uc2dtbCB8IDgwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKystLQogMSBmaWxlIGNoYW5nZWQsIDc2IGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL3BlcmZvcm0uc2dtbCBiL2RvYy9zcmMvc2dt bC9wZXJmb3JtLnNnbWwKaW5kZXggMTA2NTgzZmIyOTYuLjgyYjcxNTcxYjg2IDEwMDY0NAotLS0g YS9kb2Mvc3JjL3NnbWwvcGVyZm9ybS5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9wZXJmb3JtLnNn bWwKQEAgLTc1NiwxMiArNzU2LDg0IEBAIFdIRVJFIHQxLnVuaXF1ZTEgJmx0OyAxMCBBTkQgdDEu dW5pcXVlMiA9IHQyLnVuaXF1ZTI7CiAgICAgPGxpdGVyYWw+bG9vcHM8L2xpdGVyYWw+IHZhbHVl IHJlcG9ydHMgdGhlCiAgICAgdG90YWwgbnVtYmVyIG9mIGV4ZWN1dGlvbnMgb2YgdGhlIG5vZGUs IGFuZCB0aGUgYWN0dWFsIHRpbWUgYW5kIHJvd3MKICAgICB2YWx1ZXMgc2hvd24gYXJlIGF2ZXJh Z2VzIHBlci1leGVjdXRpb24uICBUaGlzIGlzIGRvbmUgdG8gbWFrZSB0aGUgbnVtYmVycwotICAg IGNvbXBhcmFibGUgd2l0aCB0aGUgd2F5IHRoYXQgdGhlIGNvc3QgZXN0aW1hdGVzIGFyZSBzaG93 bi4gIE11bHRpcGx5IGJ5Ci0gICAgdGhlIDxsaXRlcmFsPmxvb3BzPC9saXRlcmFsPiB2YWx1ZSB0 byBnZXQgdGhlIHRvdGFsIHRpbWUgYWN0dWFsbHkgc3BlbnQgaW4KLSAgICB0aGUgbm9kZS4gIElu IHRoZSBhYm92ZSBleGFtcGxlLCB3ZSBzcGVudCBhIHRvdGFsIG9mIDAuMDMwIG1pbGxpc2Vjb25k cwotICAgIGV4ZWN1dGluZyB0aGUgaW5kZXggc2NhbnMgb24gPGxpdGVyYWw+dGVuazI8L2xpdGVy YWw+LgorICAgIGNvbXBhcmFibGUgd2l0aCB0aGUgd2F5IHRoYXQgdGhlIGNvc3QgZXN0aW1hdGVz IGFyZSBzaG93bi4gIE11bHRpcGx5IGJ5IHRoZQorICAgIDxsaXRlcmFsPmxvb3BzPC9saXRlcmFs PiB2YWx1ZSB0byBnZXQgdGhlIHRvdGFsIHRpbWUgYWN0dWFsbHkgc3BlbnQgaW4gdGhlCisgICAg bm9kZSBhbmQgdGhlIHRvdGFsIG51bWJlciBvZiByb3dzIHByb2Nlc3NlZCBieSB0aGUgbm9kZSBh Y3Jvc3MgYWxsCisgICAgZXhlY3V0aW9ucy4gSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHdlIHNwZW50 IGEgdG90YWwgb2YgMC4wMzAKKyAgICBtaWxsaXNlY29uZHMgZXhlY3V0aW5nIHRoZSBpbmRleCBz Y2FucyBvbiA8bGl0ZXJhbD50ZW5rMjwvbGl0ZXJhbD4sIGFuZAorICAgIHRoZXkgaGFuZGxlZCBh IHRvdGFsIG9mIDEwIHJvd3MuCiAgICA8L3BhcmE+CiAKKyAgIDxwYXJhPgorICAgICBQYXJhbGxl bCBleGVjdXRpb24gd2lsbCBhbHNvIGNhdXNlIG5vZGVzIHRvIGJlIGV4ZWN1dGVkIG1vcmUgdGhh biBvbmNlLgorICAgICBUaGlzIGlzIGFsc28gaW5kaWNhdGVkIHdpdGggdGhlIDxsaXRlcmFsPmxv b3BzPC9saXRlcmFsPiB2YWx1ZToKKyAgIDwvcGFyYT4KKworPHNjcmVlbj4KK0VYUExBSU4gQU5B TFlaRSBTRUxFQ1QgKiBGUk9NIHRlbmsyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBHYXRoZXIg IChjb3N0PTAuMDAuLjM4Ni42NyByb3dzPTEwMDAwIHdpZHRoPTI0NCkgKGFjdHVhbCB0aW1lPTEu MjkxLi4xOS4zMDggcm93cz0xMDAwMC4wMCBsb29wcz0xKQorICAgV29ya2VycyBQbGFubmVkOiAy CisgICBXb3JrZXJzIExhdW5jaGVkOiAyCisgICBCdWZmZXJzOiBzaGFyZWQgaGl0PTM0NQorICAg LT4gIFBhcmFsbGVsIFNlcSBTY2FuIG9uIHRlbmsyICAoY29zdD0wLjAwLi4zODYuNjcgcm93cz00 MTY3IHdpZHRoPTI0NCkgKGFjdHVhbCB0aW1lPTAuMDA2Li4wLjU1NiByb3dzPTMzMzMuMzMgbG9v cHM9MykKKyAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MzQ1CisgUGxhbm5pbmc6CisgICBC dWZmZXJzOiBzaGFyZWQgaGl0PTEyNgorIFBsYW5uaW5nIFRpbWU6IDEuMzc1IG1zCisgRXhlY3V0 aW9uIFRpbWU6IDIwLjIxNCBtcworKDEwIHJvd3MpCis8L3NjcmVlbj4KKworICA8cGFyYT4KKyAg ICBUaGUgc2VxdWVudGlhbCBzY2FuIHdhcyBleGVjdXRlZCB0aHJlZSBzZXBhcmF0ZSB0aW1lcyBp biBwYXJhbGxlbDogb25jZQorICAgIGluIHRoZSBsZWFkZXIgKHNpbmNlIDx4cmVmIGxpbmtlbmQ9 Imd1Yy1wYXJhbGxlbC1sZWFkZXItcGFydGljaXBhdGlvbiIvPgorICAgIGlzIG9uIGJ5IGRlZmF1 bHQpLCBhbmQgb25jZSBpbiBlYWNoIG9mIHRoZSB0d28gbGF1bmNoZWQgd29ya2Vycy4gIFNpbWls YXJseQorICAgIHRvIHNlcXVlbnRpYWwgcmVwZWF0ZWQgZXhlY3V0aW9ucywgcm93cyBhbmQgYWN0 dWFsIHRpbWUgYXJlIGF2ZXJhZ2VzCisgICAgcGVyLXdvcmtlci4gIE11bHRpcGx5IGJ5IHRoZSA8 bGl0ZXJhbD5sb29wczwvbGl0ZXJhbD4gdmFsdWUgdG8gZ2V0IHRoZQorICAgIHRvdGFsIG51bWJl ciBvZiByb3dzIHByb2Nlc3NlZCBieSB0aGUgbm9kZSBhY3Jvc3MgYWxsIHdvcmtlcnMuICBUaGUg dG90YWwKKyAgICB0aW1lIHNwZW50IGluIGFsbCB3b3JrZXJzIGNhbiBiZSBzaW1pbGFybHkgY2Fs Y3VsYXRlZCwgYnV0IG5vdGUgdGhpcyB0aW1lCisgICAgaXMgc3BlbnQgY29uY3VycmVudGx5LCBz byBpdCBpcyBub3QgZXF1aXZhbGVudCB0byB0b3RhbCB0aW1lIHNwZW50IGluIHRoZQorICAgIG5v ZGUuCisgIDwvcGFyYT4KKworICA8cGFyYT4KKyAgICBNb3JlIGRldGFpbGVkIGluZm9ybWF0aW9u IGFib3V0IHBhcmFsbGVsIGV4ZWN1dGlvbiBpcyBhdmFpbGFibGUgd2l0aCB0aGUKKyAgICBWRVJC T1NFIG9wdGlvbjoKKyAgPC9wYXJhPgorCis8c2NyZWVuPgorRVhQTEFJTiAoQU5BTFlaRSwgVkVS Qk9TRSkgU0VMRUNUICogRlJPTSB0ZW5rMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBHYXRoZXIg IChjb3N0PTAuMDAuLjM4Ni42NyByb3dzPTEwMDAwIHdpZHRoPTI0NCkgKGFjdHVhbCB0aW1lPTAu OTAxLi44LjM4OSByb3dzPTEwMDAwLjAwIGxvb3BzPTEpCisgICBPdXRwdXQ6IHVuaXF1ZTEsIHVu aXF1ZTIsIHR3bywgZm91ciwgdGVuLCB0d2VudHksIGh1bmRyZWQsIHRob3VzYW5kLCB0d290aG91 c2FuZCwgZml2ZXRob3VzLCB0ZW50aG91cywgb2RkLCBldmVuLCBzdHJpbmd1MSwgc3RyaW5ndTIs IHN0cmluZzQKKyAgIFdvcmtlcnMgUGxhbm5lZDogMgorICAgV29ya2VycyBMYXVuY2hlZDogMgor ICAgQnVmZmVyczogc2hhcmVkIGhpdD0zNDUKKyAgIC0+ICBQYXJhbGxlbCBTZXEgU2NhbiBvbiBw dWJsaWMudGVuazIgIChjb3N0PTAuMDAuLjM4Ni42NyByb3dzPTQxNjcgd2lkdGg9MjQ0KSAoYWN0 dWFsIHRpbWU9MC4wMTEuLjAuNjY5IHJvd3M9MzMzMy4zMyBsb29wcz0zKQorICAgICAgICAgT3V0 cHV0OiB1bmlxdWUxLCB1bmlxdWUyLCB0d28sIGZvdXIsIHRlbiwgdHdlbnR5LCBodW5kcmVkLCB0 aG91c2FuZCwgdHdvdGhvdXNhbmQsIGZpdmV0aG91cywgdGVudGhvdXMsIG9kZCwgZXZlbiwgc3Ry aW5ndTEsIHN0cmluZ3UyLCBzdHJpbmc0CisgICAgICAgICBCdWZmZXJzOiBzaGFyZWQgaGl0PTM0 NQorICAgICAgICAgV29ya2VyIDA6ICBhY3R1YWwgdGltZT0wLjAwOS4uMC4wNzEgcm93cz01MTcu MDAgbG9vcHM9MQorICAgICAgICAgICBCdWZmZXJzOiBzaGFyZWQgaGl0PTE4CisgICAgICAgICBX b3JrZXIgMTogIGFjdHVhbCB0aW1lPTAuMDA5Li4wLjA2MiByb3dzPTQzNS4wMCBsb29wcz0xCisg ICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MTUKKyBQbGFubmluZyBUaW1lOiAwLjE4NyBt cworIEV4ZWN1dGlvbiBUaW1lOiA5LjUyNCBtcworKDE0IHJvd3MpCis8L3NjcmVlbj4KKworICA8 cGFyYT4KKyAgICBUaGlzIHNob3dzIGFjdHVhbCB0aW1lLCByb3dzLCBsb29wcywgYW5kIGJ1ZmZl ciB1c2FnZSBmb3IgZWFjaCB3b3JrZXIuCisgICAgV2hlbiA8eHJlZiBsaW5rZW5kPSJndWMtcGFy YWxsZWwtbGVhZGVyLXBhcnRpY2lwYXRpb24iLz4gaXMgb24sIHRoZQorICAgIGNvcnJlc3BvbmRp bmcgc3RhdHMgZm9yIHRoZSBsZWFkZXIgY2FuIGJlIGNhbGN1bGF0ZWQgYnkgc3VidHJhY3Rpbmcg dGhlCisgICAgc3VtIG9mIHRoZSB3b3JrZXJzJyBzdGF0cyBmcm9tIHRoZSB0b3RhbC4gSW4gdGhl IGFib3ZlIGV4YW1wbGUsIHRoZSBsZWFkZXIKKyAgICBzcGVudCAxLjg3NCBtaWxsaXNlY29uZHMg KDAuNjY5ICogMyAtIDAuMDcxIC0gMC4wNjIpIGV4ZWN1dGluZyBpdHMgcG9ydGlvbgorICAgIG9m IHRoZSB3b3JrIGFuZCBwcm9jZXNzZWQgOTA0OCByb3dzICgzMzMzLjMzICogMyAtIDUxNy4wMCAt IDQzNS4wMCwgcm91bmRlZAorICAgIHVwKS4KKyAgPC9wYXJhPgorCiAgICA8cGFyYT4KICAgICBJ biBzb21lIGNhc2VzIDxjb21tYW5kPkVYUExBSU4gQU5BTFlaRTwvY29tbWFuZD4gc2hvd3MgYWRk aXRpb25hbCBleGVjdXRpb24KICAgICBzdGF0aXN0aWNzIGJleW9uZCB0aGUgcGxhbiBub2RlIGV4 ZWN1dGlvbiB0aW1lcyBhbmQgcm93IGNvdW50cy4KLS0gCjIuNDMuMAoK --000000000000c3c752063fbd8b52--