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.96) (envelope-from ) id 1vLGgU-00AWxm-1w for pgsql-hackers@arkaria.postgresql.org; Tue, 18 Nov 2025 08:03:31 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vLGgS-004lHo-1z for pgsql-hackers@arkaria.postgresql.org; Tue, 18 Nov 2025 08:03:28 +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.96) (envelope-from ) id 1vLGgR-004lHa-2u for pgsql-hackers@lists.postgresql.org; Tue, 18 Nov 2025 08:03:28 +0000 Received: from mail-ej1-x634.google.com ([2a00:1450:4864:20::634]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vLGgN-00083k-34 for pgsql-hackers@postgresql.org; Tue, 18 Nov 2025 08:03:26 +0000 Received: by mail-ej1-x634.google.com with SMTP id a640c23a62f3a-b735b7326e5so746794866b.0 for ; Tue, 18 Nov 2025 00:03:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1763453003; x=1764057803; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=7/Ifjg6J/jTgKneCRVqXFdqCuDuLmEvCu280finiQ70=; b=NNiFthL0Eeibri2A02Bh6UyR5vhn5O30TCpCvqzBYraCB4ZyDmGMxYJmteUPcURFGY eB/vpp9vTT7VZOP/kFwcsKGG2ifwVd/AQ9EpVXNOF3S1wduD6LVfjKUcRFiawVzgCiLw l2UeuutdrnOqAPPnyAuev8SZ84MdL5iNLKmkqILcFI30zVEZKOhdQ5EexV6YVndpZc5R vZ04B3PNKRCWnn8pNtrD5HOUk/c4d2HzKzZ4H4IHjpkK/3pLUgKTzMQTXnB7wVSAkYzC sabuwTGJnuPrLLaReXWef5SUT08bMawP8qSEgyYZH9BX0CLyKO+f4WLk0LUx0W4ewihT GC2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1763453003; x=1764057803; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=7/Ifjg6J/jTgKneCRVqXFdqCuDuLmEvCu280finiQ70=; b=Mwyv9CpHRDWIgYeAvW9G0R3N4SMWtFNc+2GGMJER/93XuuO8MJcj7i/nfQ6jNGbF5I Q82Bw86Xf9j+grwAw9H7Syxt0w/UiSDwZqqQIrKp4oEMBDfdMn53lXx2DbIqa++iNuoP o+7FrNQYEq0PYXYdvvIAnZJ0qKKZc1yBKt7SUJ7DsZEpoLl26IGghTUgf3ZLrQhI2luA cFJGWia0nbnmsKQNdAJUwowXbnBnugTO28wEcftEC2iBadKD6pnsbrLxjXe9mYROYlCa xRxKj9wcFBDOyv7UXDLvLj3NviBa4uDMGimdPRzE0NEonyo36QCkfOwpuS11zw7VdC9Y wyrQ== X-Forwarded-Encrypted: i=1; AJvYcCVlZh54Ribjtlu9XTM5f7k37p5drxeEYCosj8jsg1L3DF3OYUv4UrhPW+MPAvKqiEEwGu6GiFglmVy8aIgd@postgresql.org X-Gm-Message-State: AOJu0YwK2VQpnby9I4yrAR2M6emkbLRI9KzdQUm0OP7zQaLTgW8sPQTB YnfblNBBpTiuexevo7CjgQC80HKej9iovn767acDusPZkA4qiC2P7rQPwRHQ1l80rInposXDaFZ v53umrC2oYbwF98OXpElxW+csj+i4z0IEizXo20mV X-Gm-Gg: ASbGncucwh75oiGsiWRQEYh3AakABbyiKcTSZnOLdWzq+IU77H/ifkjykGEDkyUaWyL eZL2AawJyM/6nWwThbVe/ztkGduiDw3zlnCEVmSUsXTx2/Yj5VLDLTV4/eOola62YaGseVkyUUY Rqz9PD395ZXYOCRzv+WS3m3WmSuDAD06tChZb2E+nchU7VzWppR5zZq4YAtsXu7ZPvfB9CPyGW6 H9PUaVpSqMIWt2UApVn7cLuC121y418cSus++IeBWXlnAXRWPtHdySHJ/CYpwgJWns6HqCW X-Google-Smtp-Source: AGHT+IHie8wQeHy6uflcl2XWQfPGnjzqUbFQuFIlyvZiT9Yn1Ew3sPC2UvMF82823Z7M8KZJDGOsbyXMh6G9Gr21mdg= X-Received: by 2002:a17:907:d16:b0:b72:e158:8229 with SMTP id a640c23a62f3a-b75a09f290bmr315797566b.15.1763453002611; Tue, 18 Nov 2025 00:03:22 -0800 (PST) MIME-Version: 1.0 References: <7daf5cec-4eae-48e0-883e-684476b57531@yeah.net> In-Reply-To: From: Akshay Joshi Date: Tue, 18 Nov 2025 13:33:10 +0530 X-Gm-Features: AWmQ_blZ8imAwRpuT0Q6odl1pjeeZHMhDmRiAHs40K8vxCsJ3dDSudEMO_dde-U Message-ID: Subject: Re: [PATCH] Add pg_get_database_ddl() function to reconstruct CREATE DATABASE statement To: Chao Li Cc: =?UTF-8?Q?=C3=81lvaro_Herrera?= , Japin Li , Quan Zongliang , pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000ccc5fe0643d9e5e7" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000ccc5fe0643d9e5e7 Content-Type: multipart/alternative; boundary="000000000000ccc5fe0643d9e5e5" --000000000000ccc5fe0643d9e5e5 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Chao Thanks for reviewing my patch. On Tue, Nov 18, 2025 at 5:59=E2=80=AFAM Chao Li wr= ote: > Hi Akshay, > > I just reviewed v3 and got some comments: > > > On Nov 17, 2025, at 22:34, Akshay Joshi > wrote: > > > > All the review comments have been addressed in v3 patch. > > > 1 - ruleutils.c > ``` > + if (dbForm->datconnlimit !=3D 0) > + get_formatted_string(&buf, prettyFlags, 1, "CONNECTION > LIMIT =3D %d", > + > dbForm->datconnlimit); > ``` > > I think this is wrong. Default value of CONNECTION_LIMIT is -1 rather tha= n > 0. 0 means no connection is allowed, users should intentionally set the > value, thus 0 should be printed. > > 2 - ruleutils.c > ``` > + if (!attrIsNull) > + get_formatted_string(&buf, prettyFlags, 1, "ICU_RULES =3D > %s", > + > quote_identifier(TextDatumGetCString(dbValue))); > ``` > > ICU_RULES should be omitted if provider is not icu. > > 3 - ruleutils.c > ``` > + if (!HeapTupleIsValid(tupleDatabase)) > + ereport(ERROR, > + errcode(ERRCODE_UNDEFINED_OBJECT), > + errmsg("database with oid %d does not > exist", dbOid)); > ``` > > I believe all existing code use %u to format oid. I ever raised the same > comment to the other get_xxx_ddl patch. > Fixed all above in the attached v4 patch. > > 4 - ruleutils.c > ``` > + /* > + * User must have connect privilege for target database. > + */ > + aclresult =3D object_aclcheck(DatabaseRelationId, dbOid, GetUserI= d(), > + > ACL_CONNECT); > + if (aclresult !=3D ACLCHECK_OK) > + { > + aclcheck_error(aclresult, OBJECT_DATABASE, > + get_database_name(dbOid)); > + } > ``` > > I don=E2=80=99t think CONNECT privilege is good enough. By default, a new= user > gets CONNECT privilege via the PUBLIC role. I just did a quick test to > confirm that. > > ``` > # Create a new cluster > % initdb . > % pg_ctl -D . start > % createdb evantest > % createdb evan > > # connect to the db > % psql -d evantest -U evan > psql (19devel) > Type "help" for help. # Got into the database successfully > > # Without any privilege grant, the user can get ddl of the system > database, which seems not good > evantest=3D> select pg_get_database_ddl('postgres', true); > pg_get_database_ddl > ------------------------------------ > CREATE DATABASE postgres + > WITH + > OWNER =3D chaol + > ENCODING =3D "UTF8" + > LC_COLLATE =3D "en_US.UTF-8"+ > LC_CTYPE =3D "en_US.UTF-8" + > LOCALE_PROVIDER =3D 'libc' + > TABLESPACE =3D pg_default + > ALLOW_CONNECTIONS =3D true + > CONNECTION LIMIT =3D -1; > (1 row) > ``` > > IMO, only super user and database owner should be to get ddl of the > database. > I wasn't entirely sure, but after reviewing the *pg_database_size*() function, I've concluded that its usage extends beyond the Superuser and Database Owner. Specifically, other roles can view the database size if they have the *CONNECT* privilege or are Members of the *pg_read_all_stats* role. > > 5 - as you can see from the above test output, =E2=80=9C+=E2=80=9D in the= end of every > line is weird. > The plus sign (+) is merely an artifact of *psql's* output formatting when a result cell contains a newline character (\n). It serves as a visual cue to the user that the data continues on the next line. This is confirmed by the absence of the + sign when viewing the same data in a different client, such as *pgAdmin*." To suppress this visual cue in psql, you can use the command: \pset format unaligned > > 6 - =E2=80=9CWITH=E2=80=9D has the same indent as the parameters, which d= oesn=E2=80=99t good look. > If we look at the doc > https://www.postgresql.org/docs/18/sql-createdatabase.html, =E2=80=9CWITH= =E2=80=9D takes > the first level of indent, and parameters take the second level of indent= . > Fixed in the v4 patch and followed the docs. > > 7 - For those parameters that have default values should be omitted. For > example: > ``` > evantest=3D> select pg_get_database_ddl('evantest', true); > pg_get_database_ddl > ------------------------------------ > CREATE DATABASE evantest + > WITH + > OWNER =3D chaol + > ENCODING =3D "UTF8" + > LC_COLLATE =3D "en_US.UTF-8"+ > LC_CTYPE =3D "en_US.UTF-8" + > LOCALE_PROVIDER =3D 'libc' + > TABLESPACE =3D pg_default + > ALLOW_CONNECTIONS =3D true + > CONNECTION LIMIT =3D -1; > (1 row) > ``` > > I created the database =E2=80=9Cevantest=E2=80=9D without providing any p= arameter. I think > at least OWNER, TABLESPACE and ALLOW_CNONNECTIONS should be omitted. For > CONNECTION LIMIT, you already have a logic to omit it but the logic has > some problem as comment 1. > IMHO, parameters with default values *should not* be omitted from the output of the pg_get_xxx_ddl functions. The primary purpose of these functions is to accurately reconstruct the DDL. Including all parameters ensures clarity, as not everyone is familiar with the default value of every single parameter. > > 8 - ruleutils.c > ``` > +/* > + * get_formatted_string > + * > + * Return a formatted version of the string. > + * > + * prettyFlags - Based on prettyFlags the output includes tabs (\t) and > + * newlines (\n). > + * nTabChars - indent with specified number of tab characters. > + * fmt - printf-style format string used by appendStringInfoVA. > + */ > +static void > +get_formatted_string(StringInfo buf, int prettyFlags, int nTabChars, > const char *fmt,...) > ``` > > I don=E2=80=99t feel good with this function, but not because of the > implementation of the function. > > I have reviewed a bunch of get_xxx_ddl patches submitted by different > persons. All of them are under a big project, however, looks like to me > that all authors work independently without properly coordinated. A > function like this one should be common for all those patches. Maybe Alva= ro > can help here, pushing a common function that is used to format DDL and > requesting all patches to use the function. > Yes, all pg_get_xxx_ddl functions are part of a larger project, and different authors have implemented output formatting in different ways; some implementations may lack formatting altogether. Yes I agree one common function should be developed and committed so that all other authors can reuse it, ensuring consistency across the entire suite of DDL functions." > > Best regards, > -- > Chao Li (Evan) > HighGo Software Co., Ltd. > https://www.highgo.com/ > > > > > --000000000000ccc5fe0643d9e5e5 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi=C2=A0Chao

Thanks for reviewing=C2=A0my patch.

On Tue, No= v 18, 2025 at 5:59=E2=80=AFAM Chao Li <li.evan.chao@gmail.com> wrote:
Hi Akshay,

I just reviewed v3 and got some comments:

> On Nov 17, 2025, at 22:34, Akshay Joshi <akshay.joshi@enterprisedb.com&= gt; wrote:
>
> All the review comments have been addressed in v3 patch.


1 - ruleutils.c
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (dbForm->datconnlimit !=3D 0)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0get_formatted_strin= g(&buf, prettyFlags, 1, "CONNECTION LIMIT =3D %d",
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dbForm->datconnlimit);<= br> ```

I think this is wrong. Default value of CONNECTION_LIMIT is -1 rather than = 0. 0 means no connection is allowed, users should intentionally set the val= ue, thus 0 should be printed.

2 - ruleutils.c
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (!attrIsNull)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0get_formatted_strin= g(&buf, prettyFlags, 1, "ICU_RULES =3D %s",
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 quote_identifier(TextDatum= GetCString(dbValue)));
```

ICU_RULES should be omitted if provider is not icu.

3 - ruleutils.c
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (!HeapTupleIsValid(tupleDatabase))
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ereport(ERROR,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0errcode(ERRCODE_UNDEFINED_OBJECT), +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0errmsg("database with oid %d doe= s not exist", dbOid));
```

I believe all existing code use %u to format oid. I ever raised the same co= mment to the other get_xxx_ddl patch.

=C2=A0Fixed = all above in the attached v4 patch.=C2=A0

4 - ruleutils.c
```
+=C2=A0 =C2=A0 =C2=A0 =C2=A0/*
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 * User must have connect privilege for target = database.
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0aclresult =3D object_aclcheck(DatabaseRelationI= d, dbOid, GetUserId(),
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0ACL_CONNECT);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0if (aclresult !=3D ACLCHECK_OK)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0{
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0aclcheck_error(aclr= esult, OBJECT_DATABASE,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 g= et_database_name(dbOid));
+=C2=A0 =C2=A0 =C2=A0 =C2=A0}
```

I don=E2=80=99t think CONNECT privilege is good enough. By default, a new u= ser gets CONNECT privilege via the PUBLIC role. I just did a quick test to = confirm that.

```
# Create a new cluster
% initdb .
% pg_ctl -D . start
% createdb evantest
% createdb evan

# connect to the db
% psql -d evantest -U evan
psql (19devel)
Type "help" for help. # Got into the database successfully

# Without any privilege grant, the user can get ddl of the system database,= which seems not good
evantest=3D> select pg_get_database_ddl('postgres', true);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 pg_get_database_ddl
------------------------------------
=C2=A0CREATE DATABASE postgres=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 +
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0WITH=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 +
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0OWNER =3D chaol=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0+
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ENCODING =3D "UTF8"=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0+
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0LC_COLLATE =3D "en_US.UTF-8"+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0LC_CTYPE =3D "en_US.UTF-8"=C2= =A0 +
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0LOCALE_PROVIDER =3D 'libc'=C2=A0 = +
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0TABLESPACE =3D pg_default=C2=A0 =C2=A0+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ALLOW_CONNECTIONS =3D true=C2=A0 +
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0CONNECTION LIMIT =3D -1;
(1 row)
```

IMO, only super user and database owner should be to get ddl of the databas= e.

=C2=A0I wasn't entirely sure, but after rev= iewing the pg_database_size() function, I've concluded that its = usage extends beyond the Superuser and Database Owner. Specifically, other = roles can view the database size if they have the CONNECT privilege = or are Members of the pg_read_all_stats role.

5 - as you can see from the above test output, =E2=80=9C+=E2=80=9D in the e= nd of every line is weird.
=C2=A0
The plus sign (+)= is merely an artifact of psql's output formatting when a result= cell contains a newline character (\n). It serves as a visual cue to the u= ser that the data continues on the next line. This is confirmed by the abse= nce of the + sign when viewing the same data in a different client, such as= pgAdmin." =C2=A0To suppress this visual cue in psql, you can u= se the command: \pset format unaligned

6 - =E2=80=9CWITH=E2=80=9D has the same indent as the parameters, which doe= sn=E2=80=99t good look. If we look at the doc https://www.postgresql.org/docs/18/sql-createdatabase.html, =E2=80= =9CWITH=E2=80=9D takes the first level of indent, and parameters take the s= econd level of indent.

Fixed in the v4 patch and f= ollowed the docs.=C2=A0

7 - For those parameters that have default values should be omitted. For ex= ample:
```
evantest=3D> select pg_get_database_ddl('evantest', true);
=C2=A0 =C2=A0 =C2=A0 =C2=A0 pg_get_database_ddl
------------------------------------
=C2=A0CREATE DATABASE evantest=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 +
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0WITH=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 +
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0OWNER =3D chaol=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0+
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ENCODING =3D "UTF8"=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0+
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0LC_COLLATE =3D "en_US.UTF-8"+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0LC_CTYPE =3D "en_US.UTF-8"=C2= =A0 +
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0LOCALE_PROVIDER =3D 'libc'=C2=A0 = +
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0TABLESPACE =3D pg_default=C2=A0 =C2=A0+ =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0ALLOW_CONNECTIONS =3D true=C2=A0 +
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0CONNECTION LIMIT =3D -1;
(1 row)
```

I created the database =E2=80=9Cevantest=E2=80=9D without providing any par= ameter. I think at least OWNER, TABLESPACE and ALLOW_CNONNECTIONS should be= omitted. For CONNECTION LIMIT, you already have a logic to omit it but the= logic has some problem as comment 1.

IMHO, parame= ters with default values should not be omitted from the output of th= e pg_get_xxx_ddl functions. The primary purpose of these functions is to ac= curately reconstruct the DDL. Including all parameters ensures clarity, as = not everyone is familiar with the default value of every single parameter.<= /div>

8 - ruleutils.c
```
+/*
+ * get_formatted_string
+ *
+ * Return a formatted version of the string.
+ *
+ * prettyFlags - Based on prettyFlags the output includes tabs (\t) and + *=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0newlines (\n). + * nTabChars - indent with specified number of tab characters.
+ * fmt - printf-style format string used by appendStringInfoVA.
+ */
+static void
+get_formatted_string(StringInfo buf, int prettyFlags, int nTabChars, const= char *fmt,...)
```

I don=E2=80=99t feel good with this function, but not because of the implem= entation of the function.

I have reviewed a bunch of get_xxx_ddl patches submitted by different perso= ns. All of them are under a big project, however, looks like to me that all= authors work independently without properly coordinated. A function like t= his one should be common for all those patches. Maybe Alvaro can help here,= pushing a common function that is used to format DDL and requesting all pa= tches to use the function.

Yes, all pg_get_xxx_ddl= functions are part of a larger project, and different authors have impleme= nted output formatting in different ways; some implementations may lack for= matting altogether. Yes I agree one common function should be developed and= committed so that all other authors can reuse it, ensuring consistency acr= oss the entire suite of DDL functions."=C2=A0

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
ht= tps://www.highgo.com/




--000000000000ccc5fe0643d9e5e5-- --000000000000ccc5fe0643d9e5e7 Content-Type: application/octet-stream; name="v4-0001-Add-pg_get_database_ddl-function-to-reconstruct-CREATE.patch" Content-Disposition: attachment; filename="v4-0001-Add-pg_get_database_ddl-function-to-reconstruct-CREATE.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mi4adjzj0 RnJvbSA2NjRmMTRkMDMwMjMyNjA3ZGExYzY0NGZiYjgwODczMWY4NjQ4YTJkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBXZWQsIDI0IFNlcCAyMDI1IDE3OjQ3OjU5ICswNTMwClN1YmplY3Q6IFtQ QVRDSCB2NF0gQWRkIHBnX2dldF9kYXRhYmFzZV9kZGwoKSBmdW5jdGlvbiB0byByZWNvbnN0cnVj dCBDUkVBVEUKIERBVEFCQVNFIHN0YXRlbWVudHMuCk1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQt VHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5n OiA4Yml0CgpUaGlzIGFkZHMgYSBuZXcgc3lzdGVtIGZ1bmN0aW9uLCBwZ19nZXRfZGF0YWJhc2Vf ZGRsKGRhdGFiYXNlX25hbWUvZGF0YWJhc2Vfb2lkLCBwcmV0dHkpLAp3aGljaCByZWNvbnN0cnVj dHMgdGhlIENSRUFURSBEQVRBQkFTRSBzdGF0ZW1lbnQgZm9yIGEgZ2l2ZW4gZGF0YWJhc2UgbmFt ZSBvciBkYXRhYmFzZSBvaWQuCgpVc2FnZToKICBTRUxFQ1QgcGdfZ2V0X2RhdGFiYXNlX2RkbCgn cG9zdGdyZXMnKTsgLy8gTm9uIHByZXR0eS1mb3JtYXR0ZWQgRERMCiAgU0VMRUNUIHBnX2dldF9k YXRhYmFzZV9kZGwoMTY4MzUpOyAvLyBOb24gcHJldHR5LWZvcm1hdHRlZCBEREwKICBTRUxFQ1Qg cGdfZ2V0X2RhdGFiYXNlX2RkbCgncG9zdGdyZXMnLCB0cnVlKTsgLy8gcHJldHR5LWZvcm1hdHRl ZCBEREwKICBTRUxFQ1QgcGdfZ2V0X2RhdGFiYXNlX2RkbCgxNjgzNSwgdHJ1ZSk7IC8vIHByZXR0 eS1mb3JtYXR0ZWQgRERMCgpSZWZlcmVuY2U6IFBHLTE1MApBdXRob3I6IEFrc2hheSBKb3NoaSA8 YWtzaGF5Lmpvc2hpQGVudGVycHJpc2VkYi5jb20+ClJldmlld2VkLWJ5OiDDgWx2YXJvIEhlcnJl cmEgPGFsdmhlcnJlQGt1cmlsZW11LmRlPgotLS0KIGRvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5m by5zZ21sICAgICAgICAgfCAgNjMgKysrKysrKwogc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1f ZnVuY3Rpb25zLnNxbCB8ICAxMiArKwogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3J1bGV1dGlscy5j ICAgICAgICB8IDIxNyArKysrKysrKysrKysrKysrKysrKysrKwogc3JjL2luY2x1ZGUvY2F0YWxv Zy9wZ19wcm9jLmRhdCAgICAgICAgICB8ICAgNiArCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L2RhdGFiYXNlLm91dCAgIHwgIDc1ICsrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9kYXRh YmFzZS5zcWwgICAgICAgIHwgIDYyICsrKysrKysKIDYgZmlsZXMgY2hhbmdlZCwgNDM1IGluc2Vy dGlvbnMoKykKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbCBi L2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sCmluZGV4IGQ0NTA4MTE0YTQ4Li5hOTE4 YTE2OTRjNCAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwKKysr IGIvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwKQEAgLTM3OTcsNCArMzc5Nyw2NyBA QCBhY2wgICAgICB8IHtwb3N0Z3Jlcz1hcndkRHh0bS9wb3N0Z3Jlcyxmb289ci9wb3N0Z3Jlc30K IAogICA8L3NlY3QyPgogCisgIDxzZWN0MiBpZD0iZnVuY3Rpb25zLWdldC1vYmplY3QtZGRsIj4K KyAgIDx0aXRsZT5HZXQgT2JqZWN0IERETCBGdW5jdGlvbnM8L3RpdGxlPgorCisgICA8cGFyYT4K KyAgICBUaGUgZnVuY3Rpb25zIGRlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJmdW5jdGlvbnMt Z2V0LW9iamVjdC1kZGwtdGFibGUiLz4KKyAgICByZXR1cm4gdGhlIERhdGEgRGVmaW5pdGlvbiBM YW5ndWFnZSAoRERMKSBzdGF0ZW1lbnQgZm9yIGFueSBnaXZlbiBkYXRhYmFzZSBvYmplY3QuCisg ICAgVGhpcyBmZWF0dXJlIGlzIGltcGxlbWVudGVkIGFzIGEgc2V0IG9mIGRpc3RpbmN0IGZ1bmN0 aW9ucyBmb3IgZWFjaCBvYmplY3QgdHlwZS4KKyAgIDwvcGFyYT4KKworICAgPHRhYmxlIGlkPSJm dW5jdGlvbnMtZ2V0LW9iamVjdC1kZGwtdGFibGUiPgorICAgIDx0aXRsZT5HZXQgT2JqZWN0IERE TCBGdW5jdGlvbnM8L3RpdGxlPgorICAgIDx0Z3JvdXAgY29scz0iMSI+CisgICAgIDx0aGVhZD4K KyAgICAgIDxyb3c+CisgICAgICAgPGVudHJ5IHJvbGU9ImZ1bmNfdGFibGVfZW50cnkiPjxwYXJh IHJvbGU9ImZ1bmNfc2lnbmF0dXJlIj4KKyAgICAgICAgRnVuY3Rpb24KKyAgICAgICA8L3BhcmE+ CisgICAgICAgPHBhcmE+CisgICAgICAgIERlc2NyaXB0aW9uCisgICAgICAgPC9wYXJhPjwvZW50 cnk+CisgICAgICA8L3Jvdz4KKyAgICAgPC90aGVhZD4KKworICAgICA8dGJvZHk+CisgICAgICA8 cm93PgorICAgICAgIDxlbnRyeSByb2xlPSJmdW5jX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJm dW5jX3NpZ25hdHVyZSI+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICA8cHJpbWFyeT5w Z19nZXRfZGF0YWJhc2VfZGRsPC9wcmltYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAg ICAgPGZ1bmN0aW9uPnBnX2dldF9kYXRhYmFzZV9kZGw8L2Z1bmN0aW9uPgorICAgICAgICAoIDxw YXJhbWV0ZXI+ZGF0YWJhc2VfbmFtZTwvcGFyYW1ldGVyPiA8dHlwZT5uYW1lPC90eXBlPiwgPG9w dGlvbmFsPiA8cGFyYW1ldGVyPnByZXR0eTwvcGFyYW1ldGVyPiA8dHlwZT5ib29sZWFuPC90eXBl PiA8L29wdGlvbmFsPiApCisgICAgICAgIDxyZXR1cm52YWx1ZT50ZXh0PC9yZXR1cm52YWx1ZT4K KyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmEgcm9sZT0iZnVuY19zaWduYXR1cmUiPgorICAg ICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgPHByaW1hcnk+cGdfZ2V0X2RhdGFiYXNlX2RkbDwv cHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxmdW5jdGlvbj5wZ19nZXRf ZGF0YWJhc2VfZGRsPC9mdW5jdGlvbj4KKyAgICAgICAgKCA8cGFyYW1ldGVyPmRhdGFiYXNlX29p ZDwvcGFyYW1ldGVyPiA8dHlwZT5vaWQ8L3R5cGU+LCA8b3B0aW9uYWw+IDxwYXJhbWV0ZXI+cHJl dHR5PC9wYXJhbWV0ZXI+IDx0eXBlPmJvb2xlYW48L3R5cGU+IDwvb3B0aW9uYWw+ICkKKyAgICAg ICAgPHJldHVybnZhbHVlPnRleHQ8L3JldHVybnZhbHVlPgorICAgICAgIDwvcGFyYT4KKyAgICAg ICA8cGFyYT4KKyAgICAgICAgUmVjb25zdHJ1Y3RzIHRoZSA8Y29tbWFuZD5DUkVBVEUgREFUQUJB U0U8L2NvbW1hbmQ+IHN0YXRlbWVudCBmcm9tIHRoZQorICAgICAgICBzeXN0ZW0gY2F0YWxvZ3Mg Zm9yIGEgc3BlY2lmaWVkIGRhdGFiYXNlIG5hbWUgb3IgZGF0YWJhc2Ugb2lkLiBUaGUKKyAgICAg ICAgcmVzdWx0IGlzIGEgY29tcHJlaGVuc2l2ZSA8Y29tbWFuZD5DUkVBVEUgREFUQUJBU0U8L2Nv bW1hbmQ+IHN0YXRlbWVudC4KKyAgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgIDwvcm93Pgor ICAgICA8L3Rib2R5PgorICAgIDwvdGdyb3VwPgorICAgPC90YWJsZT4KKworICA8cGFyYT4KKyAg IE1vc3Qgb2YgdGhlIGZ1bmN0aW9ucyB0aGF0IHJlY29uc3RydWN0IChkZWNvbXBpbGUpIGRhdGFi YXNlIG9iamVjdHMgaGF2ZSBhbgorICAgb3B0aW9uYWwgPHBhcmFtZXRlcj5wcmV0dHk8L3BhcmFt ZXRlcj4gZmxhZywgd2hpY2ggaWYKKyAgIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+IGNhdXNlcyB0 aGUgcmVzdWx0IHRvIGJlCisgICA8cXVvdGU+cHJldHR5LXByaW50ZWQ8L3F1b3RlPi4gUHJldHR5 LXByaW50aW5nIGFkZHMgdGFiIGNoYXJhY3RlciBhbmQgbmV3CisgICBsaW5lIGNoYXJhY3RlciBm b3IgbGVnaWJpbGl0eS4gUGFzc2luZyA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4gZm9yIHRoZQor ICAgPHBhcmFtZXRlcj5wcmV0dHk8L3BhcmFtZXRlcj4gcGFyYW1ldGVyIHlpZWxkcyB0aGUgc2Ft ZSByZXN1bHQgYXMgb21pdHRpbmcKKyAgIHRoZSBwYXJhbWV0ZXIuCisgIDwvcGFyYT4KKworICA8 L3NlY3QyPgorCiAgIDwvc2VjdDE+CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jYXRhbG9nL3N5 c3RlbV9mdW5jdGlvbnMuc3FsIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fZnVuY3Rpb25z LnNxbAppbmRleCAyZDk0NmQ2ZDllOS4uMmRiOWQzYmJjZmMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL2NhdGFsb2cvc3lzdGVtX2Z1bmN0aW9ucy5zcWwKKysrIGIvc3JjL2JhY2tlbmQvY2F0YWxv Zy9zeXN0ZW1fZnVuY3Rpb25zLnNxbApAQCAtNjU3LDYgKzY1NywxOCBAQCBMQU5HVUFHRSBJTlRF Uk5BTAogU1RSSUNUIFZPTEFUSUxFIFBBUkFMTEVMIFVOU0FGRQogQVMgJ3BnX3JlcGxpY2F0aW9u X29yaWdpbl9zZXNzaW9uX3NldHVwJzsKIAorQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04KKyAg cGdfZ2V0X2RhdGFiYXNlX2RkbChkYXRhYmFzZV9uYW1lIG5hbWUsIHByZXR0eSBib29sIERFRkFV TFQgZmFsc2UpCitSRVRVUk5TIHRleHQKK0xBTkdVQUdFIGludGVybmFsCitBUyAncGdfZ2V0X2Rh dGFiYXNlX2RkbF9uYW1lJzsKKworQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04KKyAgcGdfZ2V0 X2RhdGFiYXNlX2RkbChkYXRhYmFzZV9vaWQgb2lkLCBwcmV0dHkgYm9vbCBERUZBVUxUIGZhbHNl KQorUkVUVVJOUyB0ZXh0CitMQU5HVUFHRSBpbnRlcm5hbAorQVMgJ3BnX2dldF9kYXRhYmFzZV9k ZGxfb2lkJzsKKwogLS0KIC0tIFRoZSBkZWZhdWx0IHBlcm1pc3Npb25zIGZvciBmdW5jdGlvbnMg bWVhbiB0aGF0IGFueW9uZSBjYW4gZXhlY3V0ZSB0aGVtLgogLS0gQSBudW1iZXIgb2YgZnVuY3Rp b25zIHNob3VsZG4ndCBiZSBleGVjdXRhYmxlIGJ5IGp1c3QgYW55b25lLCBidXQgcmF0aGVyCmRp ZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcnVsZXV0aWxzLmMgYi9zcmMvYmFja2Vu ZC91dGlscy9hZHQvcnVsZXV0aWxzLmMKaW5kZXggNTU2YWIwNTdlNWEuLmIzOTcyM2IwODU1IDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcnVsZXV0aWxzLmMKKysrIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L3J1bGV1dGlscy5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAi Y2F0YWxvZy9wZ19hdXRoaWQuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2NvbGxhdGlvbi5oIgog I2luY2x1ZGUgImNhdGFsb2cvcGdfY29uc3RyYWludC5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdf ZGF0YWJhc2UuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2RlcGVuZC5oIgogI2luY2x1ZGUgImNh dGFsb2cvcGdfbGFuZ3VhZ2UuaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX29wY2xhc3MuaCIKQEAg LTU3LDYgKzU4LDcgQEAKICNpbmNsdWRlICJyZXdyaXRlL3Jld3JpdGVIYW5kbGVyLmgiCiAjaW5j bHVkZSAicmV3cml0ZS9yZXdyaXRlTWFuaXAuaCIKICNpbmNsdWRlICJyZXdyaXRlL3Jld3JpdGVT dXBwb3J0LmgiCisjaW5jbHVkZSAidXRpbHMvYWNsLmgiCiAjaW5jbHVkZSAidXRpbHMvYXJyYXku aCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2luY2x1ZGUgInV0aWxzL2ZtZ3JvaWRz LmgiCkBAIC05NCw2ICs5NiwxMCBAQAogCSgocHJldHR5KSA/IChQUkVUVFlGTEFHX1BBUkVOIHwg UFJFVFRZRkxBR19JTkRFTlQgfCBQUkVUVFlGTEFHX1NDSEVNQSkgXAogCSA6IFBSRVRUWUZMQUdf SU5ERU5UKQogCisjZGVmaW5lIEdFVF9ERExfUFJFVFRZX0ZMQUdTKHByZXR0eSkgXAorCSgocHJl dHR5KSA/IChQUkVUVFlGTEFHX1BBUkVOIHwgUFJFVFRZRkxBR19JTkRFTlQgfCBQUkVUVFlGTEFH X1NDSEVNQSkgXAorCSA6IDApCisKIC8qIERlZmF1bHQgbGluZSBsZW5ndGggZm9yIHByZXR0eS1w cmludCB3cmFwcGluZzogMCBtZWFucyB3cmFwIGFsd2F5cyAqLwogI2RlZmluZSBXUkFQX0NPTFVN Tl9ERUZBVUxUCQkwCiAKQEAgLTU0Niw2ICs1NTIsMTEgQEAgc3RhdGljIHZvaWQgZ2V0X2pzb25f dGFibGVfbmVzdGVkX2NvbHVtbnMoVGFibGVGdW5jICp0ZiwgSnNvblRhYmxlUGxhbiAqcGxhbiwK IAkJCQkJCQkJCQkgIGRlcGFyc2VfY29udGV4dCAqY29udGV4dCwKIAkJCQkJCQkJCQkgIGJvb2wg c2hvd2ltcGxpY2l0LAogCQkJCQkJCQkJCSAgYm9vbCBuZWVkY29tbWEpOworc3RhdGljIHZvaWQg Z2V0X2Zvcm1hdHRlZF9zdHJpbmcoU3RyaW5nSW5mbyBidWYsCisJCQkJCQkJCSBpbnQgcHJldHR5 RmxhZ3MsCisJCQkJCQkJCSBpbnQgblRhYkNoYXJzLAorCQkJCQkJCQkgY29uc3QgY2hhciAqZm10 LC4uLikgcGdfYXR0cmlidXRlX3ByaW50Zig0LCA1KTsKK3N0YXRpYyBjaGFyICpwZ19nZXRfZGF0 YWJhc2VfZGRsX3dvcmtlcihPaWQgZGJPaWQsIGludCBwcmV0dHlGbGFncyk7CiAKICNkZWZpbmUg b25seV9tYXJrZXIocnRlKSAgKChydGUpLT5pbmggPyAiIiA6ICJPTkxZICIpCiAKQEAgLTEzNzQz LDMgKzEzNzU0LDIwOSBAQCBnZXRfcmFuZ2VfcGFydGJvdW5kX3N0cmluZyhMaXN0ICpib3VuZF9k YXR1bXMpCiAKIAlyZXR1cm4gYnVmLmRhdGE7CiB9CisKKy8qCisgKiBnZXRfZm9ybWF0dGVkX3N0 cmluZworICoKKyAqIFJldHVybiBhIGZvcm1hdHRlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuCisg KgorICogcHJldHR5RmxhZ3MgLSBCYXNlZCBvbiBwcmV0dHlGbGFncyB0aGUgb3V0cHV0IGluY2x1 ZGVzIHRhYnMgKFx0KSBhbmQKKyAqICAgICAgICAgICAgICAgbmV3bGluZXMgKFxuKS4KKyAqIG5U YWJDaGFycyAtIGluZGVudCB3aXRoIHNwZWNpZmllZCBudW1iZXIgb2YgdGFiIGNoYXJhY3RlcnMu CisgKiBmbXQgLSBwcmludGYtc3R5bGUgZm9ybWF0IHN0cmluZyB1c2VkIGJ5IGFwcGVuZFN0cmlu Z0luZm9WQS4KKyAqLworc3RhdGljIHZvaWQKK2dldF9mb3JtYXR0ZWRfc3RyaW5nKFN0cmluZ0lu Zm8gYnVmLCBpbnQgcHJldHR5RmxhZ3MsIGludCBuVGFiQ2hhcnMsIGNvbnN0IGNoYXIgKmZtdCwu Li4pCit7CisJdmFfbGlzdAkJYXJnczsKKworCWlmIChwcmV0dHlGbGFncyAmIFBSRVRUWUZMQUdf SU5ERU5UKQorCXsKKwkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnXG4nKTsKKwkJLyogSW5k ZW50IHdpdGggdGFicyAqLworCQlmb3IgKGludCBpID0gMDsgaSA8IG5UYWJDaGFyczsgaSsrKQor CQl7CisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICdcdCcpOworCQl9CisJfQorCWVsc2UK KwkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnICcpOworCisJdmFfc3RhcnQoYXJncywgZm10 KTsKKwlhcHBlbmRTdHJpbmdJbmZvVkEoYnVmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsK K30KKworLyoKKyAqIHBnX2dldF9kYXRhYmFzZV9kZGxfbmFtZQorICoKKyAqIEdlbmVyYXRlIGEg Q1JFQVRFIERBVEFCQVNFIHN0YXRlbWVudCBmb3IgdGhlIHNwZWNpZmllZCBkYXRhYmFzZSBuYW1l LgorICoKKyAqIGRiTmFtZSAtIE5hbWUgb2YgdGhlIGRhdGFiYXNlIGZvciB3aGljaCB0byBnZW5l cmF0ZSB0aGUgRERMLgorICogcHJldHR5IC0gSWYgdHJ1ZSwgZm9ybWF0IHRoZSBEREwgd2l0aCBp bmRlbnRhdGlvbiBhbmQgbGluZSBicmVha3MuCisgKi8KK0RhdHVtCitwZ19nZXRfZGF0YWJhc2Vf ZGRsX25hbWUoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlOYW1lCQlkYk5hbWUgPSBQR19HRVRBUkdf TkFNRSgwKTsKKwlib29sCQlwcmV0dHkgPSBQR19HRVRBUkdfQk9PTCgxKTsKKwlpbnQJCQlwcmV0 dHlGbGFnczsKKwljaGFyCSAgICpyZXM7CisKKwkvKiBHZXQgdGhlIGRhdGFiYXNlIG9pZCByZXNw ZWN0aXZlIHRvIHRoZSBnaXZlbiBkYXRhYmFzZSBuYW1lICovCisJT2lkCQkJZGJPaWQgPSBnZXRf ZGF0YWJhc2Vfb2lkKE5hbWVTdHIoKmRiTmFtZSksIGZhbHNlKTsKKworCXByZXR0eUZsYWdzID0g R0VUX0RETF9QUkVUVFlfRkxBR1MocHJldHR5KTsKKwlyZXMgPSBwZ19nZXRfZGF0YWJhc2VfZGRs X3dvcmtlcihkYk9pZCwgcHJldHR5RmxhZ3MpOworCisJaWYgKHJlcyA9PSBOVUxMKQorCQlQR19S RVRVUk5fTlVMTCgpOworCisJUEdfUkVUVVJOX1RFWFRfUChzdHJpbmdfdG9fdGV4dChyZXMpKTsK K30KKworLyoKKyAqIHBnX2dldF9kYXRhYmFzZV9kZGxfb2lkCisgKgorICogR2VuZXJhdGUgYSBD UkVBVEUgREFUQUJBU0Ugc3RhdGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9pZC4K KyAqCisgKiBkYk9pZCAtIE9JRCBvZiB0aGUgZGF0YWJhc2UgZm9yIHdoaWNoIHRvIGdlbmVyYXRl IHRoZSBEREwuCisgKiBwcmV0dHkgLSBJZiB0cnVlLCBmb3JtYXQgdGhlIERETCB3aXRoIGluZGVu dGF0aW9uIGFuZCBsaW5lIGJyZWFrcy4KKyAqLworRGF0dW0KK3BnX2dldF9kYXRhYmFzZV9kZGxf b2lkKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJT2lkCQkJZGJPaWQgPSBQR19HRVRBUkdfT0lEKDAp OworCWJvb2wJCXByZXR0eSA9IFBHX0dFVEFSR19CT09MKDEpOworCWludAkJCXByZXR0eUZsYWdz OworCWNoYXIJICAgKnJlczsKKworCXByZXR0eUZsYWdzID0gR0VUX0RETF9QUkVUVFlfRkxBR1Mo cHJldHR5KTsKKwlyZXMgPSBwZ19nZXRfZGF0YWJhc2VfZGRsX3dvcmtlcihkYk9pZCwgcHJldHR5 RmxhZ3MpOworCisJaWYgKHJlcyA9PSBOVUxMKQorCQlQR19SRVRVUk5fTlVMTCgpOworCisJUEdf UkVUVVJOX1RFWFRfUChzdHJpbmdfdG9fdGV4dChyZXMpKTsKK30KKworc3RhdGljIGNoYXIgKgor cGdfZ2V0X2RhdGFiYXNlX2RkbF93b3JrZXIoT2lkIGRiT2lkLCBpbnQgcHJldHR5RmxhZ3MpCit7 CisJY2hhcgkgICAqZGJPd25lciA9IE5VTEw7CisJY2hhcgkgICAqZGJUYWJsZXNwYWNlID0gTlVM TDsKKwlib29sCQlhdHRySXNOdWxsOworCURhdHVtCQlkYlZhbHVlOworCUhlYXBUdXBsZQl0dXBs ZURhdGFiYXNlOworCUZvcm1fcGdfZGF0YWJhc2UgZGJGb3JtOworCVN0cmluZ0luZm9EYXRhIGJ1 ZjsKKwlBY2xSZXN1bHQJYWNscmVzdWx0OworCisJLyoKKwkgKiBVc2VyIG11c3QgaGF2ZSBjb25u ZWN0IHByaXZpbGVnZSBmb3IgdGFyZ2V0IGRhdGFiYXNlLgorCSAqLworCWFjbHJlc3VsdCA9IG9i amVjdF9hY2xjaGVjayhEYXRhYmFzZVJlbGF0aW9uSWQsIGRiT2lkLCBHZXRVc2VySWQoKSwKKwkJ CQkJCQkJQUNMX0NPTk5FQ1QpOworCWlmIChhY2xyZXN1bHQgIT0gQUNMQ0hFQ0tfT0sgJiYKKwkJ IWhhc19wcml2c19vZl9yb2xlKEdldFVzZXJJZCgpLCBST0xFX1BHX1JFQURfQUxMX1NUQVRTKSkK Kwl7CisJCWFjbGNoZWNrX2Vycm9yKGFjbHJlc3VsdCwgT0JKRUNUX0RBVEFCQVNFLAorCQkJCQkg ICBnZXRfZGF0YWJhc2VfbmFtZShkYk9pZCkpOworCX0KKworCS8qIExvb2sgdXAgdGhlIGRhdGFi YXNlIGluIHBnX2RhdGFiYXNlICovCisJdHVwbGVEYXRhYmFzZSA9IFNlYXJjaFN5c0NhY2hlMShE QVRBQkFTRU9JRCwgT2JqZWN0SWRHZXREYXR1bShkYk9pZCkpOworCWlmICghSGVhcFR1cGxlSXNW YWxpZCh0dXBsZURhdGFiYXNlKSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQllcnJjb2RlKEVSUkNP REVfVU5ERUZJTkVEX09CSkVDVCksCisJCQkJZXJybXNnKCJkYXRhYmFzZSB3aXRoIG9pZCAldSBk b2VzIG5vdCBleGlzdCIsIGRiT2lkKSk7CisKKwlkYkZvcm0gPSAoRm9ybV9wZ19kYXRhYmFzZSkg R0VUU1RSVUNUKHR1cGxlRGF0YWJhc2UpOworCisJaW5pdFN0cmluZ0luZm8oJmJ1Zik7CisKKwkv KiBMb29rIHVwIHRoZSBvd25lciBpbiB0aGUgc3lzdGVtIGNhdGFsb2cgKi8KKwlpZiAoT2lkSXNW YWxpZChkYkZvcm0tPmRhdGRiYSkpCisJCWRiT3duZXIgPSBHZXRVc2VyTmFtZUZyb21JZChkYkZv cm0tPmRhdGRiYSwgZmFsc2UpOworCisJLyogQnVpbGQgdGhlIENSRUFURSBEQVRBQkFTRSBzdGF0 ZW1lbnQgKi8KKwlhcHBlbmRTdHJpbmdJbmZvKCZidWYsICJDUkVBVEUgREFUQUJBU0UgJXMiLAor CQkJCQkgcXVvdGVfaWRlbnRpZmllcihkYkZvcm0tPmRhdG5hbWUuZGF0YSkpOworCWdldF9mb3Jt YXR0ZWRfc3RyaW5nKCZidWYsIHByZXR0eUZsYWdzLCAxLCAiV0lUSCBPV05FUiA9ICVzIiwKKwkJ CQkJCSBxdW90ZV9pZGVudGlmaWVyKGRiT3duZXIpKTsKKworCWlmIChkYkZvcm0tPmVuY29kaW5n ICE9IDApCisJCWdldF9mb3JtYXR0ZWRfc3RyaW5nKCZidWYsIHByZXR0eUZsYWdzLCAyLCAiRU5D T0RJTkcgPSAlcyIsCisJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIocGdfZW5jb2RpbmdfdG9fY2hh cihkYkZvcm0tPmVuY29kaW5nKSkpOworCisJLyogRmV0Y2ggdGhlIHZhbHVlIG9mIExDX0NPTExB VEUgKi8KKwlkYlZhbHVlID0gU3lzQ2FjaGVHZXRBdHRyKERBVEFCQVNFT0lELCB0dXBsZURhdGFi YXNlLAorCQkJCQkJCSAgQW51bV9wZ19kYXRhYmFzZV9kYXRjb2xsYXRlLCAmYXR0cklzTnVsbCk7 CisJaWYgKCFhdHRySXNOdWxsKQorCQlnZXRfZm9ybWF0dGVkX3N0cmluZygmYnVmLCBwcmV0dHlG bGFncywgMiwgIkxDX0NPTExBVEUgPSAlcyIsCisJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoVGV4 dERhdHVtR2V0Q1N0cmluZyhkYlZhbHVlKSkpOworCisJLyogRmV0Y2ggdGhlIHZhbHVlIG9mIExD X0NUWVBFICovCisJZGJWYWx1ZSA9IFN5c0NhY2hlR2V0QXR0cihEQVRBQkFTRU9JRCwgdHVwbGVE YXRhYmFzZSwKKwkJCQkJCQkgIEFudW1fcGdfZGF0YWJhc2VfZGF0Y3R5cGUsICZhdHRySXNOdWxs KTsKKwlpZiAoIWF0dHJJc051bGwpCisJCWdldF9mb3JtYXR0ZWRfc3RyaW5nKCZidWYsIHByZXR0 eUZsYWdzLCAyLCAiTENfQ1RZUEUgPSAlcyIsCisJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIoVGV4 dERhdHVtR2V0Q1N0cmluZyhkYlZhbHVlKSkpOworCisJLyogRmV0Y2ggdGhlIHZhbHVlIG9mIExP Q0FMRSAqLworCWRiVmFsdWUgPSBTeXNDYWNoZUdldEF0dHIoREFUQUJBU0VPSUQsIHR1cGxlRGF0 YWJhc2UsCisJCQkJCQkJICBBbnVtX3BnX2RhdGFiYXNlX2RhdGxvY2FsZSwgJmF0dHJJc051bGwp OworCWlmICghYXR0cklzTnVsbCAmJiBkYkZvcm0tPmRhdGxvY3Byb3ZpZGVyID09IENPTExQUk9W SURFUl9CVUlMVElOKQorCQlnZXRfZm9ybWF0dGVkX3N0cmluZygmYnVmLCBwcmV0dHlGbGFncywg MiwgIkJVSUxUSU5fTE9DQUxFID0gJXMiLAorCQkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKFRleHRE YXR1bUdldENTdHJpbmcoZGJWYWx1ZSkpKTsKKwllbHNlIGlmICghYXR0cklzTnVsbCAmJiBkYkZv cm0tPmRhdGxvY3Byb3ZpZGVyID09IENPTExQUk9WSURFUl9JQ1UpCisJCWdldF9mb3JtYXR0ZWRf c3RyaW5nKCZidWYsIHByZXR0eUZsYWdzLCAyLCAiSUNVX0xPQ0FMRSA9ICVzIiwKKwkJCQkJCQkg cXVvdGVfaWRlbnRpZmllcihUZXh0RGF0dW1HZXRDU3RyaW5nKGRiVmFsdWUpKSk7CisKKwkvKiBG ZXRjaCB0aGUgdmFsdWUgb2YgSUNVX1JVTEVTICovCisJZGJWYWx1ZSA9IFN5c0NhY2hlR2V0QXR0 cihEQVRBQkFTRU9JRCwgdHVwbGVEYXRhYmFzZSwKKwkJCQkJCQkgIEFudW1fcGdfZGF0YWJhc2Vf ZGF0aWN1cnVsZXMsICZhdHRySXNOdWxsKTsKKwlpZiAoIWF0dHJJc051bGwgJiYgZGJGb3JtLT5k YXRsb2Nwcm92aWRlciA9PSBDT0xMUFJPVklERVJfSUNVKQorCQlnZXRfZm9ybWF0dGVkX3N0cmlu ZygmYnVmLCBwcmV0dHlGbGFncywgMiwgIklDVV9SVUxFUyA9ICVzIiwKKwkJCQkJCQkgcXVvdGVf aWRlbnRpZmllcihUZXh0RGF0dW1HZXRDU3RyaW5nKGRiVmFsdWUpKSk7CisKKwkvKiBGZXRjaCB0 aGUgdmFsdWUgb2YgQ09MTEFUSU9OX1ZFUlNJT04gKi8KKwlkYlZhbHVlID0gU3lzQ2FjaGVHZXRB dHRyKERBVEFCQVNFT0lELCB0dXBsZURhdGFiYXNlLAorCQkJCQkJCSAgQW51bV9wZ19kYXRhYmFz ZV9kYXRjb2xsdmVyc2lvbiwgJmF0dHJJc051bGwpOworCWlmICghYXR0cklzTnVsbCkKKwkJZ2V0 X2Zvcm1hdHRlZF9zdHJpbmcoJmJ1ZiwgcHJldHR5RmxhZ3MsIDIsICJDT0xMQVRJT05fVkVSU0lP TiA9ICVzIiwKKwkJCQkJCQkgcXVvdGVfaWRlbnRpZmllcihUZXh0RGF0dW1HZXRDU3RyaW5nKGRi VmFsdWUpKSk7CisKKwkvKiBTZXQgdGhlIGFwcHJvcHJpYXRlIExPQ0FMRV9QUk9WSURFUiAqLwor CWlmIChkYkZvcm0tPmRhdGxvY3Byb3ZpZGVyID09IENPTExQUk9WSURFUl9CVUlMVElOKQorCQln ZXRfZm9ybWF0dGVkX3N0cmluZygmYnVmLCBwcmV0dHlGbGFncywgMiwgIkxPQ0FMRV9QUk9WSURF UiA9ICdidWlsdGluJyIpOworCWVsc2UgaWYgKGRiRm9ybS0+ZGF0bG9jcHJvdmlkZXIgPT0gQ09M TFBST1ZJREVSX0lDVSkKKwkJZ2V0X2Zvcm1hdHRlZF9zdHJpbmcoJmJ1ZiwgcHJldHR5RmxhZ3Ms IDIsICJMT0NBTEVfUFJPVklERVIgPSAnaWN1JyIpOworCWVsc2UKKwkJZ2V0X2Zvcm1hdHRlZF9z dHJpbmcoJmJ1ZiwgcHJldHR5RmxhZ3MsIDIsICJMT0NBTEVfUFJPVklERVIgPSAnbGliYyciKTsK KworCS8qIEdldCB0aGUgdGFibGVzcGFjZSBuYW1lIHJlc3BlY3RpdmUgdG8gdGhlIGdpdmVuIHRh Ymxlc3BhY2Ugb2lkICovCisJaWYgKE9pZElzVmFsaWQoZGJGb3JtLT5kYXR0YWJsZXNwYWNlKSkK Kwl7CisJCWRiVGFibGVzcGFjZSA9IGdldF90YWJsZXNwYWNlX25hbWUoZGJGb3JtLT5kYXR0YWJs ZXNwYWNlKTsKKwkJaWYgKGRiVGFibGVzcGFjZSkKKwkJCWdldF9mb3JtYXR0ZWRfc3RyaW5nKCZi dWYsIHByZXR0eUZsYWdzLCAyLCAiVEFCTEVTUEFDRSA9ICVzIiwKKwkJCQkJCQkJIHF1b3RlX2lk ZW50aWZpZXIoZGJUYWJsZXNwYWNlKSk7CisJfQorCisJZ2V0X2Zvcm1hdHRlZF9zdHJpbmcoJmJ1 ZiwgcHJldHR5RmxhZ3MsIDIsICJBTExPV19DT05ORUNUSU9OUyA9ICVzIiwKKwkJCQkJCSBkYkZv cm0tPmRhdGFsbG93Y29ubiA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCisJZ2V0X2Zvcm1hdHRlZF9z dHJpbmcoJmJ1ZiwgcHJldHR5RmxhZ3MsIDIsICJDT05ORUNUSU9OIExJTUlUID0gJWQiLAorCQkJ CQkJIGRiRm9ybS0+ZGF0Y29ubmxpbWl0KTsKKworCWlmIChkYkZvcm0tPmRhdGlzdGVtcGxhdGUp CisJCWdldF9mb3JtYXR0ZWRfc3RyaW5nKCZidWYsIHByZXR0eUZsYWdzLCAyLCAiSVNfVEVNUExB VEUgPSAlcyIsCisJCQkJCQkJIGRiRm9ybS0+ZGF0aXN0ZW1wbGF0ZSA/ICJ0cnVlIiA6ICJmYWxz ZSIpOworCisJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmJ1ZiwgJzsnKTsKKworCVJlbGVhc2VTeXND YWNoZSh0dXBsZURhdGFiYXNlKTsKKworCXJldHVybiBidWYuZGF0YTsKK30KZGlmZiAtLWdpdCBh L3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3Bn X3Byb2MuZGF0CmluZGV4IDVjZjllMTJmY2I5Li4yN2ZiYjcxMjk3ZiAxMDA2NDQKLS0tIGEvc3Jj L2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3Bn X3Byb2MuZGF0CkBAIC00MDIxLDYgKzQwMjEsMTIgQEAKICAgcHJvbmFtZSA9PiAncGdfZ2V0X2Z1 bmN0aW9uX3NxbGJvZHknLCBwcm92b2xhdGlsZSA9PiAncycsCiAgIHByb3JldHR5cGUgPT4gJ3Rl eHQnLCBwcm9hcmd0eXBlcyA9PiAnb2lkJywKICAgcHJvc3JjID0+ICdwZ19nZXRfZnVuY3Rpb25f c3FsYm9keScgfSwKK3sgb2lkID0+ICc5NDkyJywgZGVzY3IgPT4gJ2dldCBDUkVBVEUgc3RhdGVt ZW50IGZvciBkYXRhYmFzZSBuYW1lJywKKyAgcHJvbmFtZSA9PiAncGdfZ2V0X2RhdGFiYXNlX2Rk bCcsIHByb3JldHR5cGUgPT4gJ3RleHQnLAorICBwcm9hcmd0eXBlcyA9PiAnbmFtZSBib29sJywg cHJvc3JjID0+ICdwZ19nZXRfZGF0YWJhc2VfZGRsX25hbWUnIH0sCit7IG9pZCA9PiAnOTQ5Mycs IGRlc2NyID0+ICdnZXQgQ1JFQVRFIHN0YXRlbWVudCBmb3IgZGF0YWJhc2Ugb2lkJywKKyAgcHJv bmFtZSA9PiAncGdfZ2V0X2RhdGFiYXNlX2RkbCcsIHByb3JldHR5cGUgPT4gJ3RleHQnLAorICBw cm9hcmd0eXBlcyA9PiAnb2lkIGJvb2wnLCBwcm9zcmMgPT4gJ3BnX2dldF9kYXRhYmFzZV9kZGxf b2lkJyB9LAogCiB7IG9pZCA9PiAnMTY4NicsIGRlc2NyID0+ICdsaXN0IG9mIFNRTCBrZXl3b3Jk cycsCiAgIHByb25hbWUgPT4gJ3BnX2dldF9rZXl3b3JkcycsIHByb2Nvc3QgPT4gJzEwJywgcHJv cm93cyA9PiAnNTAwJywKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZGF0 YWJhc2Uub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9kYXRhYmFzZS5vdXQKaW5kZXgg NmI4NzliMGY2MmEuLmZhMGQxYjAxZTY3IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL2RhdGFiYXNlLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2RhdGFi YXNlLm91dApAQCAtMSwzICsxLDQ5IEBACistLQorLS0gUmVjb25zdHVyY3QgRERMCistLQorLS0g VG8gcHJvZHVjZSBzdGFibGUgcmVncmVzc2lvbiB0ZXN0IG91dHB1dCwgaXQncyB1c3VhbGx5IG5l Y2Vzc2FyeSB0bworLS0gaWdub3JlIGNvbGxhdGlvbiBhbmQgbG9jYWxlIHJlbGF0ZWQgZGV0YWls cy4gVGhpcyBmaWx0ZXIKKy0tIGZ1bmN0aW9ucyByZW1vdmVzIGNvbGxhdGlvbiBhbmQgbG9jYWxl IHJlbGF0ZWQgZGV0YWlscy4KK0NSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIGRkbF9maWx0ZXIo ZGRsX2lucHV0IFRFWFQpCitSRVRVUk5TIFRFWFQgQVMgJCQKK0RFQ0xBUkUKKyAgICBjbGVhbmVk X2RkbCBURVhUOworQkVHSU4KKwktLSBSZW1vdmUgTENfQ09MTEFURSBhc3NpZ25tZW50cyAKKyAg ICBjbGVhbmVkX2RkbCA6PSByZWdleHBfcmVwbGFjZSgKKyAgICAgICAgZGRsX2lucHV0LAorICAg ICAgICAnXHMqTENfQ09MTEFURVxzKj1ccyooWycnIl0pW14nJyJdKlwxJywKKyAgICAgICAgJycs CisgICAgICAgICdnaScKKyAgICApOworCisgICAgLS0gUmVtb3ZlIExDX0NUWVBFIGFzc2lnbm1l bnRzCisgICAgY2xlYW5lZF9kZGwgOj0gcmVnZXhwX3JlcGxhY2UoCisgICAgICAgIGNsZWFuZWRf ZGRsLAorICAgICAgICAnXHMqTENfQ1RZUEVccyo9XHMqKFsnJyJdKVteJyciXSpcMScsCisgICAg ICAgICcnLAorICAgICAgICAnZ2knCisgICAgKTsKKworICAgIC0tIFJlbW92ZSAlTE9DQUxFJSBw bGFjZWhvbGRlcnMKKyAgICBjbGVhbmVkX2RkbCA6PSByZWdleHBfcmVwbGFjZSgKKyAgICAgICAg Y2xlYW5lZF9kZGwsCisgICAgICAgICdccypcUypMT0NBTEVcUypccyo9P1xzKihbJyciXSlbXicn Il0qXDEnLAorCQknJywKKwkJJ2dpJworCSk7CisKKyAgICAtLSBSZW1vdmUgJUNPTExBVElPTiUg cGxhY2Vob2xkZXJzCisgICAgY2xlYW5lZF9kZGwgOj0gcmVnZXhwX3JlcGxhY2UoCisgICAgICAg IGNsZWFuZWRfZGRsLAorICAgICAgICAnXHMqXFMqQ09MTEFUSU9OXFMqXHMqPT9ccyooWycnIl0p W14nJyJdKlwxJywKKyAgICAgICAgJycsCisgICAgICAgICdnaScKKyAgICApOworCisgICAgUkVU VVJOIGNsZWFuZWRfZGRsOworRU5EOworJCQgTEFOR1VBR0UgcGxwZ3NxbDsKIENSRUFURSBEQVRB QkFTRSByZWdyZXNzaW9uX3RiZAogCUVOQ09ESU5HIHV0ZjggTENfQ09MTEFURSAiQyIgTENfQ1RZ UEUgIkMiIFRFTVBMQVRFIHRlbXBsYXRlMDsKIEFMVEVSIERBVEFCQVNFIHJlZ3Jlc3Npb25fdGJk IFJFTkFNRSBUTyByZWdyZXNzaW9uX3V0Zjg7CkBAIC0xNiw2ICs2MiwzNSBAQCBDUkVBVEUgUk9M RSByZWdyZXNzX2RhdGRiYV9iZWZvcmU7CiBDUkVBVEUgUk9MRSByZWdyZXNzX2RhdGRiYV9hZnRl cjsKIEFMVEVSIERBVEFCQVNFIHJlZ3Jlc3Npb25fdXRmOCBPV05FUiBUTyByZWdyZXNzX2RhdGRi YV9iZWZvcmU7CiBSRUFTU0lHTiBPV05FRCBCWSByZWdyZXNzX2RhdGRiYV9iZWZvcmUgVE8gcmVn cmVzc19kYXRkYmFfYWZ0ZXI7CistLSBUZXN0IHBnX2dldF9kYXRhYmFzZV9kZGwKKy0tIERhdGFi YXNlIGRvZXNuJ3QgZXhpc3RzCitTRUxFQ1QgcGdfZ2V0X2RhdGFiYXNlX2RkbCgncmVncmVzc2lv bl9kYXRhYmFzZScsIGZhbHNlKTsKK0VSUk9SOiAgZGF0YWJhc2UgInJlZ3Jlc3Npb25fZGF0YWJh c2UiIGRvZXMgbm90IGV4aXN0CistLSBUZXN0IE5VTEwgdmFsdWUKK1NFTEVDVCBwZ19nZXRfZGF0 YWJhc2VfZGRsKE5VTEwpOworIHBnX2dldF9kYXRhYmFzZV9kZGwgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyAKKygxIHJvdykKKworLS0gV2l0aG91dCBwcmV0dHkKK1NFTEVDVCBkZGxfZmlsdGVy KHBnX2dldF9kYXRhYmFzZV9kZGwoJ3JlZ3Jlc3Npb25fdXRmOCcpKTsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgZGRsX2ZpbHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBEQVRBQkFTRSByZWdyZXNzaW9uX3V0ZjggV0lU SCBPV05FUiA9IHJlZ3Jlc3NfZGF0ZGJhX2FmdGVyIEVOQ09ESU5HID0gIlVURjgiIFRBQkxFU1BB Q0UgPSBwZ19kZWZhdWx0IEFMTE9XX0NPTk5FQ1RJT05TID0gdHJ1ZSBDT05ORUNUSU9OIExJTUlU ID0gMTIzOworKDEgcm93KQorCistLSBXaXRoIFByZXR0eSBmb3JtYXR0ZWQKK1xwc2V0IGZvcm1h dCB1bmFsaWduZWQKK1NFTEVDVCBkZGxfZmlsdGVyKHBnX2dldF9kYXRhYmFzZV9kZGwoJ3JlZ3Jl c3Npb25fdXRmOCcsIHRydWUpKTsKK2RkbF9maWx0ZXIKK0NSRUFURSBEQVRBQkFTRSByZWdyZXNz aW9uX3V0ZjgKKwlXSVRIIE9XTkVSID0gcmVncmVzc19kYXRkYmFfYWZ0ZXIKKwkJRU5DT0RJTkcg PSAiVVRGOCIKKwkJVEFCTEVTUEFDRSA9IHBnX2RlZmF1bHQKKwkJQUxMT1dfQ09OTkVDVElPTlMg PSB0cnVlCisJCUNPTk5FQ1RJT04gTElNSVQgPSAxMjM7CisoMSByb3cpCiBEUk9QIERBVEFCQVNF IHJlZ3Jlc3Npb25fdXRmODsKIERST1AgUk9MRSByZWdyZXNzX2RhdGRiYV9iZWZvcmU7CiBEUk9Q IFJPTEUgcmVncmVzc19kYXRkYmFfYWZ0ZXI7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNz L3NxbC9kYXRhYmFzZS5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9kYXRhYmFzZS5zcWwKaW5k ZXggNGVmMzYxMjcyOTEuLjM5MmE0ZDk2YmI1IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNz L3NxbC9kYXRhYmFzZS5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZGF0YWJhc2Uuc3Fs CkBAIC0xLDMgKzEsNTEgQEAKKy0tCistLSBSZWNvbnN0dXJjdCBEREwKKy0tCistLSBUbyBwcm9k dWNlIHN0YWJsZSByZWdyZXNzaW9uIHRlc3Qgb3V0cHV0LCBpdCdzIHVzdWFsbHkgbmVjZXNzYXJ5 IHRvCistLSBpZ25vcmUgY29sbGF0aW9uIGFuZCBsb2NhbGUgcmVsYXRlZCBkZXRhaWxzLiBUaGlz IGZpbHRlcgorLS0gZnVuY3Rpb25zIHJlbW92ZXMgY29sbGF0aW9uIGFuZCBsb2NhbGUgcmVsYXRl ZCBkZXRhaWxzLgorCitDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBkZGxfZmlsdGVyKGRkbF9p bnB1dCBURVhUKQorUkVUVVJOUyBURVhUIEFTICQkCitERUNMQVJFCisgICAgY2xlYW5lZF9kZGwg VEVYVDsKK0JFR0lOCisJLS0gUmVtb3ZlIExDX0NPTExBVEUgYXNzaWdubWVudHMgCisgICAgY2xl YW5lZF9kZGwgOj0gcmVnZXhwX3JlcGxhY2UoCisgICAgICAgIGRkbF9pbnB1dCwKKyAgICAgICAg J1xzKkxDX0NPTExBVEVccyo9XHMqKFsnJyJdKVteJyciXSpcMScsCisgICAgICAgICcnLAorICAg ICAgICAnZ2knCisgICAgKTsKKworICAgIC0tIFJlbW92ZSBMQ19DVFlQRSBhc3NpZ25tZW50cwor ICAgIGNsZWFuZWRfZGRsIDo9IHJlZ2V4cF9yZXBsYWNlKAorICAgICAgICBjbGVhbmVkX2RkbCwK KyAgICAgICAgJ1xzKkxDX0NUWVBFXHMqPVxzKihbJyciXSlbXicnIl0qXDEnLAorICAgICAgICAn JywKKyAgICAgICAgJ2dpJworICAgICk7CisKKyAgICAtLSBSZW1vdmUgJUxPQ0FMRSUgcGxhY2Vo b2xkZXJzCisgICAgY2xlYW5lZF9kZGwgOj0gcmVnZXhwX3JlcGxhY2UoCisgICAgICAgIGNsZWFu ZWRfZGRsLAorICAgICAgICAnXHMqXFMqTE9DQUxFXFMqXHMqPT9ccyooWycnIl0pW14nJyJdKlwx JywKKwkJJycsCisJCSdnaScKKwkpOworCisgICAgLS0gUmVtb3ZlICVDT0xMQVRJT04lIHBsYWNl aG9sZGVycworICAgIGNsZWFuZWRfZGRsIDo9IHJlZ2V4cF9yZXBsYWNlKAorICAgICAgICBjbGVh bmVkX2RkbCwKKyAgICAgICAgJ1xzKlxTKkNPTExBVElPTlxTKlxzKj0/XHMqKFsnJyJdKVteJyci XSpcMScsCisgICAgICAgICcnLAorICAgICAgICAnZ2knCisgICAgKTsKKworICAgIFJFVFVSTiBj bGVhbmVkX2RkbDsKK0VORDsKKyQkIExBTkdVQUdFIHBscGdzcWw7CisKIENSRUFURSBEQVRBQkFT RSByZWdyZXNzaW9uX3RiZAogCUVOQ09ESU5HIHV0ZjggTENfQ09MTEFURSAiQyIgTENfQ1RZUEUg IkMiIFRFTVBMQVRFIHRlbXBsYXRlMDsKIEFMVEVSIERBVEFCQVNFIHJlZ3Jlc3Npb25fdGJkIFJF TkFNRSBUTyByZWdyZXNzaW9uX3V0Zjg7CkBAIC0xOSw2ICs2NywyMCBAQCBDUkVBVEUgUk9MRSBy ZWdyZXNzX2RhdGRiYV9hZnRlcjsKIEFMVEVSIERBVEFCQVNFIHJlZ3Jlc3Npb25fdXRmOCBPV05F UiBUTyByZWdyZXNzX2RhdGRiYV9iZWZvcmU7CiBSRUFTU0lHTiBPV05FRCBCWSByZWdyZXNzX2Rh dGRiYV9iZWZvcmUgVE8gcmVncmVzc19kYXRkYmFfYWZ0ZXI7CiAKKy0tIFRlc3QgcGdfZ2V0X2Rh dGFiYXNlX2RkbAorLS0gRGF0YWJhc2UgZG9lc24ndCBleGlzdHMKK1NFTEVDVCBwZ19nZXRfZGF0 YWJhc2VfZGRsKCdyZWdyZXNzaW9uX2RhdGFiYXNlJywgZmFsc2UpOworCistLSBUZXN0IE5VTEwg dmFsdWUKK1NFTEVDVCBwZ19nZXRfZGF0YWJhc2VfZGRsKE5VTEwpOworCistLSBXaXRob3V0IHBy ZXR0eQorU0VMRUNUIGRkbF9maWx0ZXIocGdfZ2V0X2RhdGFiYXNlX2RkbCgncmVncmVzc2lvbl91 dGY4JykpOworCistLSBXaXRoIFByZXR0eSBmb3JtYXR0ZWQKK1xwc2V0IGZvcm1hdCB1bmFsaWdu ZWQKK1NFTEVDVCBkZGxfZmlsdGVyKHBnX2dldF9kYXRhYmFzZV9kZGwoJ3JlZ3Jlc3Npb25fdXRm OCcsIHRydWUpKTsKKwogRFJPUCBEQVRBQkFTRSByZWdyZXNzaW9uX3V0Zjg7CiBEUk9QIFJPTEUg cmVncmVzc19kYXRkYmFfYmVmb3JlOwogRFJPUCBST0xFIHJlZ3Jlc3NfZGF0ZGJhX2FmdGVyOwot LSAKMi41MS4wCgo= --000000000000ccc5fe0643d9e5e7--