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 1uioV5-00G8hq-Sw for pgsql-hackers@arkaria.postgresql.org; Mon, 04 Aug 2025 06:16:48 +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 1uioV4-00GY2b-S9 for pgsql-hackers@arkaria.postgresql.org; Mon, 04 Aug 2025 06:16:46 +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 1uioV4-00GY2P-Ga for pgsql-hackers@lists.postgresql.org; Mon, 04 Aug 2025 06:16:46 +0000 Received: from mail-ed1-x52d.google.com ([2a00:1450:4864:20::52d]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1uioV2-000e8r-0O for pgsql-hackers@postgresql.org; Mon, 04 Aug 2025 06:16:46 +0000 Received: by mail-ed1-x52d.google.com with SMTP id 4fb4d7f45d1cf-615a115f0c0so6707604a12.0 for ; Sun, 03 Aug 2025 23:16:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1754288203; x=1754893003; 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=YvSoXJ5xAPQdBWKqQx79hA/RPlPT8aPlTgi3FEYrBaI=; b=VMNsOMtbxLKwi2ua6WbftzGU0ajSFg/VgTPIJ1bYQlxQ3me7TsxFxchTZcQWeDFzvT +EW8CgI9g4MwdiI/cZszLCblSV3spXtDmlCD6BG1YOVc/HjzrwWW14D8FVK0HJax5tFi vcExjTHiQuZGanNC8GdxCJwI5eJ2H0hOy8JUQiUOD8Cqe9WBedLkdhjOBOYgpDs4uLx2 npCuCRW8pILsFrntlDjcusuuk4hST0gb7DZnH0bB7wCEwiVUMUxrMmr2EnG6aqR3s6nK VBeknkZdO2vc5KeKjNIdRFLY3TXj5dVdoKYIq/YuvnzgPeHrZeowJeCOsbzLCyJ9xos4 mM6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1754288203; x=1754893003; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=YvSoXJ5xAPQdBWKqQx79hA/RPlPT8aPlTgi3FEYrBaI=; b=vabyudsYgNG/dMnqzUgGkFxPu8zsHtgjP3ZsD5RGh/5B5ovlj86fgzerHXO+nCZ8oX R51snWRxNJAL9p8p67u0QC7iPu5tqQqZhxjIG53TWKUwakrh7h+Pl04w3LAXi/Ij0+bk cCVSv30QFAIC7fqtRt0MeYxhPftpc+wqVkmUR9nSELHKTvR93j2/BSWer3EnvISMGcgM qrk6k7cKPT2O/M19XpLY/4emKK5J1tU1+tyCeX7s6rhjdaYqflyNA3TxBV4dX0qlx0hd aAAiwkdcYLE19eO8znnaU3l2jrOmhBipaFBvXS1Orb40kkSuyw9buTVMCl490H4jLtuq Ur+g== X-Forwarded-Encrypted: i=1; AJvYcCWirNP9KQNCDiMUEeX/zmgALzqdUezpEhFbABbwy1mQi7Il5I8BEWPGRzfYPlpA7Pjd1ZI3raRE6rpQ65yy@postgresql.org X-Gm-Message-State: AOJu0Yx+khqCGprtsOjE0SRga/msi64Mgyapi0EnMlYnFgMDA3hANot7 6ALU3dssyMvWxO+xAoyDTqdBcdCNawR1gLT6A8VztUY95kmP65XZxDuZ2ZcDCbOQDOg8iM8VI07 Uf8UhybL7cSCBYzhActu3ezhIKneCz2c= X-Gm-Gg: ASbGncvMUnA31D1Rv3YjA4RA33guABMd+vIeKz3JSgIFpZp3Otx4ghw8CvCSrI4h4Ba UKDqtBg0djsLZSeWpUKHSVKDYQgRsRJHiw+RBlg36I4rUPQJELXpOD15p+J9pn9vdGg5LXzQx6a vjVQyS9Bs+dGM3IsF5eoxo++f0zGGIV/BdMzrCK+ZxBM4w5S2KZ0+jsKantDHvhl7zg0fGUQX9y tkbwT4= X-Google-Smtp-Source: AGHT+IFWEtqGI3miLYGXd95sMUXk4wtk3PpvPvtqMeKzNe6/A9TX6XmqiXeEaUj3PDtpKTVoJMcOjw7k2/IFFxOyz0o= X-Received: by 2002:a17:907:2d28:b0:af9:3d0a:f386 with SMTP id a640c23a62f3a-af94004b8f2mr853846866b.24.1754288202983; Sun, 03 Aug 2025 23:16:42 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Naga Appani Date: Mon, 4 Aug 2025 01:16:30 -0500 X-Gm-Features: Ac12FXxLT8j4U_heFhLWdPs--teNGGPBa0KgNaKN0unkejJxb8lGyRZ3xOWhYvE Message-ID: Subject: Re: [Proposal] Expose internal MultiXact member count function for efficient monitoring To: Ashutosh Bapat Cc: Michael Paquier , Kirill Reshke , pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="0000000000002c65b8063b840dab" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000002c65b8063b840dab Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Ashutosh, Michael, Thanks for the detailed reviews. I have incorporated the feedback; please find attached v2 and my responses inline below. On Fri, Jul 25, 2025 at 5:57=E2=80=AFAM Ashutosh Bapat wrote: > In [1], we decided to document pg_get_multixact_member() in section > "Transaction ID and Snapshot Information Functions". I think the > discussion in the email thread applies to this function as well. Done -- the function is now documented under =E2=80=9CTransaction ID and Snapshot Information Functions=E2=80=9D for consistency. > The description here doesn't follow the format of the other functions > in this section. Updated the description in func.sgml to match the style of other functions. Extended usage guidance is now in maintenance.sgml. > Throwing an error causes the surrounding transaction to abort, so it > should be avoided in a monitoring/reporting function if possible. The function now returns NULL instead of throwing an error when counts can=E2=80=99t be read. > If ReadMultiXactCounts() returns false, MultiXactMemberFreezeThreshold() = returns 0... Noted -- the docs now mention that the function can be used to anticipate more aggressive autovacuum behavior in such cases. > In PG14+, the transaction wraparound is triggered if the size of the > directory exceeds 10GB. This function does not help monitoring that > condition. So a user will need to use du or pg_ls_multixactdir() > anyway, which defeats the purpose of this function being more > efficient than those methods. Am I correct? Can we also report the > size of the directory in this function? Correct, that is the intent of the function. The members count returned by this function already provides the necessary information to determine the directory size, since each member entry has a fixed size. The constants and formulas in [0] and discussed in [1] show that each group stores four bytes of flags plus four TransactionIds (20 bytes total), yielding 409 groups per 8=E2=80=AFKB page and a fixed members=E2=80=91to=E2=80=91bytes ratio. This means ~2=E2=80=AFbillion membe= rs corresponds to ~10=E2=80=AFGB (aggressive autovacuum threshold) and ~4=E2=80=AFbillion mem= bers corresponds to ~20=E2=80=AFGB (wraparound). Since the function already provides the member count, including the physical size in its output would duplicate information and add no extra benefit. > The patch needs tests. Added an isolation test to cover initial state, MultiXact creation, counts, and oldest MultiXact reporting. On Mon, Jul 28, 2025 at 1:00=E2=80=AFAM Ashutosh Bapat wrote: > Let's say if the user knows that the counts are so high that a > wraparound is imminent, but vacuuming isn't solving the problem... > Here's a quick patch implementing the same. Please feel free to > incorporate and refine it in your patch if you like it. Thank you for sharing the patch. I have incorporated it into this version with minor adjustments, and it fits well with the overall design of the function. On Mon, Jul 28, 2025 at 4:22=E2=80=AFAM Michael Paquier wrote: > Yep, let's be consistent. Done -- placed in =E2=80=9CTransaction ID and Snapshot Information Function= s=E2=80=9D for consistency. > Most likely returning NULL is the best thing we can do, as a safe fallbac= k. Implemented -- the function now returns NULL if counts can=E2=80=99t be rea= d. > The patch needs tests. Isolation tests have been added as described above. > May I also suggest a split of the multixact SQL functions into a > separate file, a src/backend/utils/adt/multixactfuncs.c? I agree that would be cleaner, but I=E2=80=99d prefer to keep the implementation in multixact.c for now to maintain focus on this patch and revisit the refactoring later. > +PG_FUNCTION_INFO_V1(pg_get_multixact_count); Removed -- now handled entirely by pg_proc.dat. > ...You may want to add an example of how one can use it for monitoring in= the docs. I=E2=80=99ve added a usage example with sample output in the docs. If you h= ad a different kind of demo in mind (e.g., creating multixacts manually and showing the output), please let me know. References: [0] https://github.com/postgres/postgres/blob/master/src/backend/access/tra= nsam/multixact.c#L130-L156 [1] https://www.postgresql.org/message-id/flat/CACbFw60UOk6fCC02KsyT3OfU9Dn= uq5roYxdw2aFisiN_p1L0bg%40mail.gmail.com Best regards, Naga Appani --0000000000002c65b8063b840dab Content-Type: application/octet-stream; name="v2-0001-Add-pg_get_multixact_stats-SQL-function-for-monit.patch" Content-Disposition: attachment; filename="v2-0001-Add-pg_get_multixact_stats-SQL-function-for-monit.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mdwp8trl0 RnJvbSAxODBlZjQ2MzgwODAyM2ZhMTE3NTk1Y2U1NTQzMjYwMjg3MjRjZjQzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYWdhIEFwcGFuaSA8bmFnbnJpa0BnbWFpbC5jb20+CkRhdGU6 IE1vbiwgNCBBdWcgMjAyNSAwMzoxNzoyOCArMDAwMApTdWJqZWN0OiBbUEFUQ0ggdjJdIEFkZCBw Z19nZXRfbXVsdGl4YWN0X3N0YXRzKCkgU1FMIGZ1bmN0aW9uIGZvciBtb25pdG9yaW5nCiBNdWx0 aVhhY3QgdXNhZ2UKClRoaXMgcGF0Y2ggYWRkcyBwZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCksIGEg U1FMLWNhbGxhYmxlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucwpNdWx0aVhhY3Qgc3RhdGlzdGljcyB0 byBhaWQgaW4gbW9uaXRvcmluZyB3cmFwYXJvdW5kIHJpc2sgYW5kIHZhY3V1bSBiZWhhdmlvci4K SXQgcmVwb3J0czoKCm11bHRpeGFjdHM6IHRoZSBudW1iZXIgb2YgTXVsdGlYYWN0IElEcyBjcmVh dGVkIHNpbmNlIHRoZSBvbGRlc3Qgb25lIHN0aWxsIG5lZWRlZAptZW1iZXJzOiB0aGUgbnVtYmVy IG9mIE11bHRpWGFjdCBtZW1iZXIgZW50cmllcyB0aGF0IGN1cnJlbnRseSBleGlzdApvbGRlc3Rf bXVsdGl4YWN0OiB0aGUgb2xkZXN0IE11bHRpWGFjdCBJRCBzdGlsbCBuZWVkZWQgYnkgYW55IGRh dGFiYXNlCgpUaGUgZnVuY3Rpb24gbW9kaWZpZXMgUmVhZE11bHRpWGFjdENvdW50cygpIHRvIGV4 cG9zZSB0aGUgb2xkZXN0TXVsdGlYYWN0SWQgYW5kCnJldHVybnMgYWxsIHRocmVlIHZhbHVlcyBp biBhIGNvbXBvc2l0ZSByZWNvcmQuIFRoaXMgYWxsb3dzIHVzZXJzIHRvIG1vbml0b3IKTXVsdGlY YWN0IHVzYWdlIGFuZCBpZGVudGlmeSBwb3RlbnRpYWwgd3JhcGFyb3VuZCBpc3N1ZXMsIHBhcnRp Y3VsYXJseSB1c2VmdWwKd2hlbiBjb21iaW5lZCB3aXRoIHBnX2dldF9tdWx0aXhhY3RfbWVtYmVy cygpIHRvIGludmVzdGlnYXRlIHNwZWNpZmljIE11bHRpWGFjdHMuCgpVc2FnZToKU0VMRUNUICog RlJPTSBwZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCk7CgpEb2N1bWVudGF0aW9uIGlzIGFkZGVkIHRv OgotICJUcmFuc2FjdGlvbiBJRCBhbmQgU25hcHNob3QgSW5mb3JtYXRpb24gRnVuY3Rpb25zIiBz ZWN0aW9uIGluIGZ1bmMuc2dtbAotICJNdWx0aXhhY3RzIGFuZCBXcmFwYXJvdW5kIiBzZWN0aW9u IGluIG1haW50ZW5hbmNlLnNnbWwKICAocm91dGluZS12YWN1dW1pbmcuaHRtbCNWQUNVVU0tRk9S LU1VTFRJWEFDVC1XUkFQQVJPVU5EKQoKSXNvbGF0aW9uIHRlc3RzIGFyZSBhZGRlZCB0byB2ZXJp Znk6Ci0gSW5pdGlhbCBzdGF0ZSB3aXRoIHplcm8gTXVsdGlYYWN0cwotIE11bHRpWGFjdCBjcmVh dGlvbiB3aXRoIG92ZXJsYXBwaW5nIHNoYXJlZCBsb2NrcwotIENvcnJlY3QgY291bnRpbmcgb2Yg TXVsdGlYYWN0cyBhbmQgbWVtYmVycwotIFByb3BlciB0cmFja2luZyBvZiBvbGRlc3QgTXVsdGlY YWN0IElECgpBdXRob3I6IE5hZ2EgQXBwYW5pIDxuYWduaWZrQGdtYWlsLmNvbT4KUmV2aWV3ZWQt Ynk6IEFzaHV0b3NoIEJhcGF0IDxhc2h1dG9zaC5iYXBhdEBlbnRlcnByaXNlZGIuY29tPgpSZXZp ZXdlZC1ieTogTWljaGFlbCBQYXF1aWVyIDxtaWNoYWVsQHBhcXVpZXIueHl6PgpEaXNjdXNzaW9u OiBodHRwczovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkL2ZsYXQvQ0FNMkJlb1glMkJS YXNLZkc2Vzh3NHFZWlp6NEJuaHlFUU1BX3k1Y0VEbktFWV96OG85Q3pnJTQwbWFpbC5nbWFpbC5j b20KLS0tCiBkb2Mvc3JjL3NnbWwvZnVuYy5zZ21sICAgICAgICAgICAgICAgICAgICAgICAgfCAz MiArKysrKysrKwogZG9jL3NyYy9zZ21sL21haW50ZW5hbmNlLnNnbWwgICAgICAgICAgICAgICAg IHwgMzcgKysrKysrKystCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS9tdWx0aXhhY3QuYyAg ICAgICAgfCA3OSArKysrKysrKysrKysrKy0tLS0tCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3By b2MuZGF0ICAgICAgICAgICAgICAgfCAxNCArKysrCiAuLi4vaXNvbGF0aW9uL2V4cGVjdGVkL211 bHRpeGFjdF9zdGF0cy5vdXQgICAgfCA1OSArKysrKysrKysrKysrKwogc3JjL3Rlc3QvaXNvbGF0 aW9uL3NwZWNzL211bHRpeGFjdF9zdGF0cy5zcGVjIHwgMzUgKysrKysrKysKIDYgZmlsZXMgY2hh bmdlZCwgMjMzIGluc2VydGlvbnMoKyksIDIzIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAw NjQ0IHNyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC9tdWx0aXhhY3Rfc3RhdHMub3V0CiBjcmVh dGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvaXNvbGF0aW9uL3NwZWNzL211bHRpeGFjdF9zdGF0cy5z cGVjCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbCBiL2RvYy9zcmMvc2dtbC9m dW5jLnNnbWwKaW5kZXggNzRhMTZhZjA0YWQuLjAyNTVhNTFjZGFkIDEwMDY0NAotLS0gYS9kb2Mv c3JjL3NnbWwvZnVuYy5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9mdW5jLnNnbWwKQEAgLTI3NzMy LDYgKzI3NzMyLDM4IEBAIGFjbCAgICAgIHwge3Bvc3RncmVzPWFyd2REeHRtL3Bvc3RncmVzLGZv bz1yL3Bvc3RncmVzfQogICAgICAgICBtb2RpZnkga2V5IGNvbHVtbnMuCiAgICAgICAgPC9wYXJh PjwvZW50cnk+CiAgICAgICA8L3Jvdz4KKworICAgICA8cm93PgorICAgICAgPGVudHJ5IHJvbGU9 ImZ1bmNfdGFibGVfZW50cnkiPgorICAgICAgIDxwYXJhIHJvbGU9ImZ1bmNfc2lnbmF0dXJlIj4K KyAgICAgICAgPGluZGV4dGVybT48cHJpbWFyeT5wZ19nZXRfbXVsdGl4YWN0X3N0YXRzPC9wcmlt YXJ5PjwvaW5kZXh0ZXJtPgorICAgICAgICA8ZnVuY3Rpb24+cGdfZ2V0X211bHRpeGFjdF9zdGF0 czwvZnVuY3Rpb24+ICgpCisgICAgICAgIDxyZXR1cm52YWx1ZT5yZWNvcmQ8L3JldHVybnZhbHVl PgorICAgICAgICAoIDxwYXJhbWV0ZXI+bXVsdGl4YWN0czwvcGFyYW1ldGVyPiA8dHlwZT5pbnRl Z2VyPC90eXBlPiwKKyAgICAgICAgICA8cGFyYW1ldGVyPm1lbWJlcnM8L3BhcmFtZXRlcj4gPHR5 cGU+YmlnaW50PC90eXBlPiwKKyAgICAgICAgICA8cGFyYW1ldGVyPm9sZGVzdF9tdWx0aXhhY3Q8 L3BhcmFtZXRlcj4gPHR5cGU+aW50ZWdlcjwvdHlwZT4gKQorICAgICAgIDwvcGFyYT4KKworICAg ICAgIDxwYXJhPgorICAgICAgICBSZXR1cm5zIHN0YXRpc3RpY3MgYWJvdXQgY3VycmVudCBtdWx0 aXhhY3QgdXNhZ2U6CisgICAgICAgIDxsaXRlcmFsPm11bHRpeGFjdHM8L2xpdGVyYWw+IGlzIHRo ZSBudW1iZXIgb2YgbXVsdGl4YWN0IElEcyBhc3NpZ25lZCwKKyAgICAgICAgPGxpdGVyYWw+bWVt YmVyczwvbGl0ZXJhbD4gaXMgdGhlIG51bWJlciBvZiBtdWx0aXhhY3QgbWVtYmVyIGVudHJpZXMg Y3JlYXRlZCwKKyAgICAgICAgYW5kIDxsaXRlcmFsPm9sZGVzdF9tdWx0aXhhY3Q8L2xpdGVyYWw+ IGlzIHRoZSBvbGRlc3QgbXVsdGl4YWN0IElEIHN0aWxsIGluIHVzZS4KKyAgICAgICAgVGhlc2Ug dmFsdWVzIGNhbiBiZSB1c2VkIHRvIG1vbml0b3IgbXVsdGl4YWN0IGNvbnN1bXB0aW9uIGFuZCBh bnRpY2lwYXRlCisgICAgICAgIGF1dG92YWN1dW0gYmVoYXZpb3IuIFNlZSA8eHJlZiBsaW5rZW5k PSJ2YWN1dW0tZm9yLW11bHRpeGFjdC13cmFwYXJvdW5kIi8+CisgICAgICAgIGZvciBmdXJ0aGVy IGRldGFpbHMgb24gbXVsdGl4YWN0IHdyYXBhcm91bmQuCisgICAgICAgPC9wYXJhPgorCisgICAg ICAgPHBhcmE+CisgICAgICAgIDxsaXRlcmFsPlNFTEVDVCAqIEZST00gcGdfZ2V0X211bHRpeGFj dF9zdGF0cygpOzwvbGl0ZXJhbD4KKzxwcm9ncmFtbGlzdGluZz4KKyBtdWx0aXhhY3RzIHwgICBt ZW1iZXJzICAgfCBvbGRlc3RfbXVsdGl4YWN0CistLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSst LS0tLS0tLS0tLS0tLS0tLS0KKyAxODIzNzEzOTYgIHwgMjgyNjIyMTE3NCAgfCA3NTQzMjEKKzwv cHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgPC9wYXJhPgorICAgICAgPC9lbnRyeT4KKyAgICAgPC9y b3c+CiAgICAgIDwvdGJvZHk+CiAgICAgPC90Z3JvdXA+CiAgICA8L3RhYmxlPgpkaWZmIC0tZ2l0 IGEvZG9jL3NyYy9zZ21sL21haW50ZW5hbmNlLnNnbWwgYi9kb2Mvc3JjL3NnbWwvbWFpbnRlbmFu Y2Uuc2dtbAppbmRleCBlN2E5ZjU4YzAxNS4uZDZiZDMwNWIwYjAgMTAwNjQ0Ci0tLSBhL2RvYy9z cmMvc2dtbC9tYWludGVuYW5jZS5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9tYWludGVuYW5jZS5z Z21sCkBAIC04MTMsMTIgKzgxMyw0MSBAQCBISU5UOiAgRXhlY3V0ZSBhIGRhdGFiYXNlLXdpZGUg VkFDVVVNIGluIHRoYXQgZGF0YWJhc2UuCiAgICAgPHBhcmE+CiAgICAgIEFzIGEgc2FmZXR5IGRl dmljZSwgYW4gYWdncmVzc2l2ZSB2YWN1dW0gc2NhbiB3aWxsCiAgICAgIG9jY3VyIGZvciBhbnkg dGFibGUgd2hvc2UgbXVsdGl4YWN0LWFnZSBpcyBncmVhdGVyIHRoYW4gPHhyZWYKLSAgICAgbGlu a2VuZD0iZ3VjLWF1dG92YWN1dW0tbXVsdGl4YWN0LWZyZWV6ZS1tYXgtYWdlIi8+LiAgQWxzbywg aWYgdGhlCi0gICAgIHN0b3JhZ2Ugb2NjdXBpZWQgYnkgbXVsdGl4YWN0cyBtZW1iZXJzIGV4Y2Vl ZHMgYWJvdXQgMTBHQiwgYWdncmVzc2l2ZSB2YWN1dW0KKyAgICAgbGlua2VuZD0iZ3VjLWF1dG92 YWN1dW0tbXVsdGl4YWN0LWZyZWV6ZS1tYXgtYWdlIi8+LiBBbHNvLCBpZiBlaXRoZXIKKyAgICAg dGhlIHN0b3JhZ2Ugb2NjdXBpZWQgYnkgbXVsdGl4YWN0IG1lbWJlcnMgZXhjZWVkcyBhYm91dCAx MEdCIG9yIHRoZSBudW1iZXIKKyAgICAgb2YgbWVtYmVycyBjcmVhdGVkIGV4Y2VlZHMgYXBwcm94 aW1hdGVseSAyIGJpbGxpb24gZW50cmllcywgYWdncmVzc2l2ZSB2YWN1dW0KICAgICAgc2NhbnMg d2lsbCBvY2N1ciBtb3JlIG9mdGVuIGZvciBhbGwgdGFibGVzLCBzdGFydGluZyB3aXRoIHRob3Nl IHRoYXQKLSAgICAgaGF2ZSB0aGUgb2xkZXN0IG11bHRpeGFjdC1hZ2UuICBCb3RoIG9mIHRoZXNl IGtpbmRzIG9mIGFnZ3Jlc3NpdmUKKyAgICAgaGF2ZSB0aGUgb2xkZXN0IG11bHRpeGFjdC1hZ2Uu IEJvdGggb2YgdGhlc2Uga2luZHMgb2YgYWdncmVzc2l2ZQogICAgICBzY2FucyB3aWxsIG9jY3Vy IGV2ZW4gaWYgYXV0b3ZhY3V1bSBpcyBub21pbmFsbHkgZGlzYWJsZWQuIFRoZSBtZW1iZXJzIHN0 b3JhZ2UKLSAgICAgYXJlYSBjYW4gZ3JvdyB1cCB0byBhYm91dCAyMEdCIGJlZm9yZSByZWFjaGlu ZyB3cmFwYXJvdW5kLgorICAgICBhcmVhIGNhbiBncm93IHVwIHRvIGFib3V0IDIwR0Igb3IgYXBw cm94aW1hdGVseSA0IGJpbGxpb24gZW50cmllcyBiZWZvcmUKKyAgICAgcmVhY2hpbmcgd3JhcGFy b3VuZC4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgVGhlIDxmdW5jdGlvbj5wZ19n ZXRfbXVsdGl4YWN0X3N0YXRzKCk8L2Z1bmN0aW9uPiBmdW5jdGlvbiBwcm92aWRlcyBhIHdheQor ICAgICB0byBtb25pdG9yIG11bHRpeGFjdCBhbGxvY2F0aW9uIGFuZCB1c2FnZSBwYXR0ZXJucyBp biByZWFsIHRpbWUuIEJ5IGV4cG9zaW5nCisgICAgIHRoZSBhZ2Ugb2YgdGhlIG9sZGVzdCBtdWx0 aXhhY3QgSUQsIG51bWJlciBvZiBtZW1iZXIgZW50cmllcywgYW5kIHRoZSBvbGRlc3QgbXVsdGl4 YWN0IElEIHN0aWxsIGluIHVzZSwgaXQgaGVscHM6CisgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAg IDxsaXN0aXRlbT4KKyAgICAgICA8c2ltcGFyYT4KKyAgICAgICAgIElkZW50aWZ5IHVudXN1YWwg bXVsdGl4YWN0IGFjdGl2aXR5IGZyb20gY29uY3VycmVudCByb3ctbGV2ZWwgbG9ja3MKKyAgICAg ICAgIG9yIGZvcmVpZ24ga2V5IG9wZXJhdGlvbnMKKyAgICAgICA8L3NpbXBhcmE+CisgICAgICA8 L2xpc3RpdGVtPgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxzaW1wYXJhPgorICAgICAgICAg TW9uaXRvciBwcm9ncmVzcyB0b3dhcmQgd3JhcGFyb3VuZCB0aHJlc2hvbGRzIHRoYXQgdHJpZ2dl ciBhZ2dyZXNzaXZlCisgICAgICAgICBhdXRvdmFjdXVtIChhcHByb3hpbWF0ZWx5IDIgYmlsbGlv biBtZW1iZXJzIG9yIDEwR0Igc3RvcmFnZSkKKyAgICAgICA8L3NpbXBhcmE+CisgICAgICA8L2xp c3RpdGVtPgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxzaW1wYXJhPgorICAgICAgICAgVmVy aWZ5IHdoZXRoZXIgYXV0b3ZhY3V1bSBpcyBlZmZlY3RpdmVseSBtYW5hZ2luZyBtdWx0aXhhY3Qg Y2xlYW51cAorICAgICAgICAgYmVmb3JlIHJlYWNoaW5nIGNyaXRpY2FsIHRocmVzaG9sZHMKKyAg ICAgICA8L3NpbXBhcmE+CisgICAgICA8L2xpc3RpdGVtPgorICAgICA8L29yZGVyZWRsaXN0Pgor ICAgICBTZWUgPHhyZWYgbGlua2VuZD0iZnVuY3Rpb25zLWluZm8tc25hcHNob3QiLz4gZm9yIGRl dGFpbHMuCiAgICAgPC9wYXJhPgogCiAgICAgPHBhcmE+CmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9hY2Nlc3MvdHJhbnNhbS9tdWx0aXhhY3QuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2Ft L211bHRpeGFjdC5jCmluZGV4IDNjYjA5YzNkNTk4Li41OWU4ZmMxN2I3ZiAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0vbXVsdGl4YWN0LmMKKysrIGIvc3JjL2JhY2tlbmQv YWNjZXNzL3RyYW5zYW0vbXVsdGl4YWN0LmMKQEAgLTI4NjMsMjggKzI4NjMsMjcgQEAgZmluZF9t dWx0aXhhY3Rfc3RhcnQoTXVsdGlYYWN0SWQgbXVsdGksIE11bHRpWGFjdE9mZnNldCAqcmVzdWx0 KQogICogZXhpc3QuICBSZXR1cm4gZmFsc2UgaWYgdW5hYmxlIHRvIGRldGVybWluZS4KICAqLwog c3RhdGljIGJvb2wKLVJlYWRNdWx0aVhhY3RDb3VudHModWludDMyICptdWx0aXhhY3RzLCBNdWx0 aVhhY3RPZmZzZXQgKm1lbWJlcnMpCitSZWFkTXVsdGlYYWN0Q291bnRzKHVpbnQzMiAqbXVsdGl4 YWN0cywgTXVsdGlYYWN0T2Zmc2V0ICptZW1iZXJzLCBNdWx0aVhhY3RJZCAqb2xkZXN0TXVsdGlY YWN0SWQpCiB7Ci0JTXVsdGlYYWN0T2Zmc2V0IG5leHRPZmZzZXQ7Ci0JTXVsdGlYYWN0T2Zmc2V0 IG9sZGVzdE9mZnNldDsKLQlNdWx0aVhhY3RJZCBvbGRlc3RNdWx0aVhhY3RJZDsKLQlNdWx0aVhh Y3RJZCBuZXh0TXVsdGlYYWN0SWQ7Ci0JYm9vbAkJb2xkZXN0T2Zmc2V0S25vd247CisgICAgTXVs dGlYYWN0T2Zmc2V0IG5leHRPZmZzZXQ7CisgICAgTXVsdGlYYWN0T2Zmc2V0IG9sZGVzdE9mZnNl dDsKKyAgICBNdWx0aVhhY3RJZCBuZXh0TXVsdGlYYWN0SWQ7CisgICAgYm9vbCBvbGRlc3RPZmZz ZXRLbm93bjsKIAotCUxXTG9ja0FjcXVpcmUoTXVsdGlYYWN0R2VuTG9jaywgTFdfU0hBUkVEKTsK LQluZXh0T2Zmc2V0ID0gTXVsdGlYYWN0U3RhdGUtPm5leHRPZmZzZXQ7Ci0Jb2xkZXN0TXVsdGlY YWN0SWQgPSBNdWx0aVhhY3RTdGF0ZS0+b2xkZXN0TXVsdGlYYWN0SWQ7Ci0JbmV4dE11bHRpWGFj dElkID0gTXVsdGlYYWN0U3RhdGUtPm5leHRNWGFjdDsKLQlvbGRlc3RPZmZzZXQgPSBNdWx0aVhh Y3RTdGF0ZS0+b2xkZXN0T2Zmc2V0OwotCW9sZGVzdE9mZnNldEtub3duID0gTXVsdGlYYWN0U3Rh dGUtPm9sZGVzdE9mZnNldEtub3duOwotCUxXTG9ja1JlbGVhc2UoTXVsdGlYYWN0R2VuTG9jayk7 CisgICAgTFdMb2NrQWNxdWlyZShNdWx0aVhhY3RHZW5Mb2NrLCBMV19TSEFSRUQpOworICAgIG5l eHRPZmZzZXQgPSBNdWx0aVhhY3RTdGF0ZS0+bmV4dE9mZnNldDsKKyAgICAqb2xkZXN0TXVsdGlY YWN0SWQgPSBNdWx0aVhhY3RTdGF0ZS0+b2xkZXN0TXVsdGlYYWN0SWQ7ICAvKiBVc2UgdGhlIHBh cmFtZXRlciBkaXJlY3RseSAqLworICAgIG5leHRNdWx0aVhhY3RJZCA9IE11bHRpWGFjdFN0YXRl LT5uZXh0TVhhY3Q7CisgICAgb2xkZXN0T2Zmc2V0ID0gTXVsdGlYYWN0U3RhdGUtPm9sZGVzdE9m ZnNldDsKKyAgICBvbGRlc3RPZmZzZXRLbm93biA9IE11bHRpWGFjdFN0YXRlLT5vbGRlc3RPZmZz ZXRLbm93bjsKKyAgICBMV0xvY2tSZWxlYXNlKE11bHRpWGFjdEdlbkxvY2spOwogCi0JaWYgKCFv bGRlc3RPZmZzZXRLbm93bikKLQkJcmV0dXJuIGZhbHNlOworICAgIGlmICghb2xkZXN0T2Zmc2V0 S25vd24pCisgICAgICAgIHJldHVybiBmYWxzZTsKIAotCSptZW1iZXJzID0gbmV4dE9mZnNldCAt IG9sZGVzdE9mZnNldDsKLQkqbXVsdGl4YWN0cyA9IG5leHRNdWx0aVhhY3RJZCAtIG9sZGVzdE11 bHRpWGFjdElkOwotCXJldHVybiB0cnVlOworICAgICptZW1iZXJzID0gbmV4dE9mZnNldCAtIG9s ZGVzdE9mZnNldDsKKyAgICAqbXVsdGl4YWN0cyA9IG5leHRNdWx0aVhhY3RJZCAtICpvbGRlc3RN dWx0aVhhY3RJZDsgIC8qIFVzZSB0aGUgcGFyYW1ldGVyICovCisgICAgcmV0dXJuIHRydWU7CiB9 CiAKIC8qCkBAIC0yOTIyLDkgKzI5MjEsMTAgQEAgTXVsdGlYYWN0TWVtYmVyRnJlZXplVGhyZXNo b2xkKHZvaWQpCiAJdWludDMyCQl2aWN0aW1fbXVsdGl4YWN0czsKIAlkb3VibGUJCWZyYWN0aW9u OwogCWludAkJCXJlc3VsdDsKKwlNdWx0aVhhY3RJZCBvbGRlc3RNdWx0aVhhY3RJZDsKIAogCS8q IElmIHdlIGNhbid0IGRldGVybWluZSBtZW1iZXIgc3BhY2UgdXRpbGl6YXRpb24sIGFzc3VtZSB0 aGUgd29yc3QuICovCi0JaWYgKCFSZWFkTXVsdGlYYWN0Q291bnRzKCZtdWx0aXhhY3RzLCAmbWVt YmVycykpCisJaWYgKCFSZWFkTXVsdGlYYWN0Q291bnRzKCZtdWx0aXhhY3RzLCAmbWVtYmVycywg Jm9sZGVzdE11bHRpWGFjdElkKSkKIAkJcmV0dXJuIDA7CiAKIAkvKiBJZiBtZW1iZXIgc3BhY2Ug dXRpbGl6YXRpb24gaXMgbG93LCBubyBzcGVjaWFsIGFjdGlvbiBpcyByZXF1aXJlZC4gKi8KQEAg LTM0OTMsMyArMzQ5Myw0NCBAQCBtdWx0aXhhY3RtZW1iZXJzc3luY2ZpbGV0YWcoY29uc3QgRmls ZVRhZyAqZnRhZywgY2hhciAqcGF0aCkKIHsKIAlyZXR1cm4gU2xydVN5bmNGaWxlVGFnKE11bHRp WGFjdE1lbWJlckN0bCwgZnRhZywgcGF0aCk7CiB9CisKKy8qCisgKiBwZ19nZXRfbXVsdGl4YWN0 X3N0YXRzCisgKgorICogU1FMLWNhbGxhYmxlIGZ1bmN0aW9uIHRvIHJldHJpZXZlIE11bHRpWGFj dCBzdGF0aXN0aWNzLgorICoKKyAqIFJldHVybnMgYSBjb21wb3NpdGUgcm93IGNvbnRhaW5pbmc6 CisgKiAtIHRvdGFsIG51bWJlciBvZiBNdWx0aVhhY3QgSURzIGNyZWF0ZWQgc2luY2Ugc3RhcnR1 cCwKKyAqIC0gdG90YWwgbnVtYmVyIG9mIE11bHRpWGFjdCBtZW1iZXJzIGNyZWF0ZWQsCisgKiAt IHRoZSBvbGRlc3QgZXhpc3RpbmcgTXVsdGlYYWN0IElELgorICoKKyAqIFRoaXMgaXMgcHJpbWFy aWx5IHVzZWZ1bCBmb3IgbW9uaXRvcmluZyBNdWx0aVhhY3QgdXNhZ2UgYW5kIGVuc3VyaW5nCisg KiBhcHByb3ByaWF0ZSB3cmFwYXJvdW5kIHByb3RlY3Rpb24uCisgKi8KK0RhdHVtCitwZ19nZXRf bXVsdGl4YWN0X3N0YXRzKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJVHVwbGVEZXNjCXR1cGRlc2M7 CisJRGF0dW0JCXZhbHVlc1szXTsKKwlib29sCQludWxsc1szXSA9IHtmYWxzZSwgZmFsc2UsIGZh bHNlfTsKKwlNdWx0aVhhY3RPZmZzZXQgbWVtYmVyczsKKwlNdWx0aVhhY3RJZCBvbGRlc3RNdWx0 aVhhY3RJZDsKKwl1aW50MzIJCW11bHRpeGFjdHM7CisJSGVhcFR1cGxlCXR1cGxlOworCisJaWYg KGdldF9jYWxsX3Jlc3VsdF90eXBlKGZjaW5mbywgTlVMTCwgJnR1cGRlc2MpICE9IFRZUEVGVU5D X0NPTVBPU0lURSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJybXNnKCJyZXR1cm4gdHlwZSBt dXN0IGJlIGEgcm93IHR5cGUiKSkpOworCisJaWYgKCFSZWFkTXVsdGlYYWN0Q291bnRzKCZtdWx0 aXhhY3RzLCAmbWVtYmVycywgJm9sZGVzdE11bHRpWGFjdElkKSkKKwkJUEdfUkVUVVJOX05VTEwo KTsKKworCXZhbHVlc1swXSA9IFVJbnQzMkdldERhdHVtKG11bHRpeGFjdHMpOworCXZhbHVlc1sx XSA9IFVJbnQzMkdldERhdHVtKG1lbWJlcnMpOworCXZhbHVlc1syXSA9IFVJbnQzMkdldERhdHVt KG9sZGVzdE11bHRpWGFjdElkKTsKKworCXR1cGxlID0gaGVhcF9mb3JtX3R1cGxlKHR1cGRlc2Ms IHZhbHVlcywgbnVsbHMpOworCisJUEdfUkVUVVJOX0RBVFVNKEhlYXBUdXBsZUdldERhdHVtKHR1 cGxlKSk7Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQg Yi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CmluZGV4IDNlZThmZWQ3ZTUzLi43NTZi YTM5NDI1YyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysg Yi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CkBAIC0xMjU3Niw0ICsxMjU3NiwxOCBA QAogICBwcm9hcmduYW1lcyA9PiAne3BpZCxpb19pZCxpb19nZW5lcmF0aW9uLHN0YXRlLG9wZXJh dGlvbixvZmYsbGVuZ3RoLHRhcmdldCxoYW5kbGVfZGF0YV9sZW4scmF3X3Jlc3VsdCxyZXN1bHQs dGFyZ2V0X2Rlc2MsZl9zeW5jLGZfbG9jYWxtZW0sZl9idWZmZXJlZH0nLAogICBwcm9zcmMgPT4g J3BnX2dldF9haW9zJyB9LAogCit7CisgIG9pZCA9PiAnOTAwMScsCisgIGRlc2NyID0+ICdnZXQg Y3VycmVudCBtdWx0aXhhY3QgbWVtYmVyIGFuZCBtdWx0aXhhY3QgSUQgY291bnRzIGFuZCBvbGRl c3QgbXVsdGl4YWN0JywKKyAgcHJvbmFtZSA9PiAncGdfZ2V0X211bHRpeGFjdF9zdGF0cycsCisg IHByb3JldHR5cGUgPT4gJ3JlY29yZCcsCisgIHByb2FyZ3R5cGVzID0+ICcnLAorICBwcm9hbGxh cmd0eXBlcyA9PiAne2ludDQsaW50OCxpbnQ0fScsCisgIHByb2FyZ21vZGVzID0+ICd7byxvLG99 JywKKyAgcHJvYXJnbmFtZXMgPT4gJ3ttdWx0aXhhY3RzLG1lbWJlcnMsb2xkZXN0X211bHRpeGFj dH0nLAorICBwcm92b2xhdGlsZSA9PiAndicsCisgIHByb3BhcmFsbGVsID0+ICdzJywKKyAgcHJv c3JjID0+ICdwZ19nZXRfbXVsdGl4YWN0X3N0YXRzJworfSwKKwogXQpkaWZmIC0tZ2l0IGEvc3Jj L3Rlc3QvaXNvbGF0aW9uL2V4cGVjdGVkL211bHRpeGFjdF9zdGF0cy5vdXQgYi9zcmMvdGVzdC9p c29sYXRpb24vZXhwZWN0ZWQvbXVsdGl4YWN0X3N0YXRzLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwMC4uNTRlMzIzOGQ3MjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMv dGVzdC9pc29sYXRpb24vZXhwZWN0ZWQvbXVsdGl4YWN0X3N0YXRzLm91dApAQCAtMCwwICsxLDU5 IEBACitQYXJzZWQgdGVzdCBzcGVjIHdpdGggMyBzZXNzaW9ucworCitzdGFydGluZyBwZXJtdXRh dGlvbjogc3RhdHNfaW5pdCBjaGVjayBiZWdpbjEgbG9jazEgYmVnaW4yIGxvY2syIGNoZWNrIGNv bW1pdDEgY29tbWl0MiBjaGVjaworc3RlcCBzdGF0c19pbml0OiAKKyAgICBDUkVBVEUgVEVNUCBU QUJMRSBzdGF0c19iZWZvcmUgQVMgCisgICAgU0VMRUNUIG11bHRpeGFjdHMsIG1lbWJlcnMsIG9s ZGVzdF9tdWx0aXhhY3QgRlJPTSBwZ19nZXRfbXVsdGl4YWN0X3N0YXRzKCk7IAorCitzdGVwIGNo ZWNrOiAKKyAgICBTRUxFQ1QgCisgICAgICAgIG11bHRpeGFjdHMsCisgICAgICAgIG1lbWJlcnMs CisgICAgICAgIG9sZGVzdF9tdWx0aXhhY3QgCisgICAgRlJPTSBwZ19nZXRfbXVsdGl4YWN0X3N0 YXRzKCk7CisKK211bHRpeGFjdHN8bWVtYmVyc3xvbGRlc3RfbXVsdGl4YWN0CistLS0tLS0tLS0t Ky0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgMHwgICAgICAwfCAgICAgICAgICAg ICAgIDEKKygxIHJvdykKKworc3RlcCBiZWdpbjE6IEJFR0lOOworc3RlcCBsb2NrMTogU0VMRUNU ICogRlJPTSBtdWx0aXhhY3RfdGVzdCBXSEVSRSBpZCA9IDEgRk9SIFNIQVJFOworaWR8dmFsCist LSstLS0KKyAxfCAxMAorKDEgcm93KQorCitzdGVwIGJlZ2luMjogQkVHSU47CitzdGVwIGxvY2sy OiBTRUxFQ1QgKiBGUk9NIG11bHRpeGFjdF90ZXN0IFdIRVJFIGlkID0gMSBGT1IgU0hBUkU7Citp ZHx2YWwKKy0tKy0tLQorIDF8IDEwCisoMSByb3cpCisKK3N0ZXAgY2hlY2s6IAorICAgIFNFTEVD VCAKKyAgICAgICAgbXVsdGl4YWN0cywKKyAgICAgICAgbWVtYmVycywKKyAgICAgICAgb2xkZXN0 X211bHRpeGFjdCAKKyAgICBGUk9NIHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMoKTsKKworbXVsdGl4 YWN0c3xtZW1iZXJzfG9sZGVzdF9tdWx0aXhhY3QKKy0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0t LS0tLS0tLS0tCisgICAgICAgICAxfCAgICAgIDN8ICAgICAgICAgICAgICAgMQorKDEgcm93KQor CitzdGVwIGNvbW1pdDE6IENPTU1JVDsKK3N0ZXAgY29tbWl0MjogQ09NTUlUOworc3RlcCBjaGVj azogCisgICAgU0VMRUNUIAorICAgICAgICBtdWx0aXhhY3RzLAorICAgICAgICBtZW1iZXJzLAor ICAgICAgICBvbGRlc3RfbXVsdGl4YWN0IAorICAgIEZST00gcGdfZ2V0X211bHRpeGFjdF9zdGF0 cygpOworCittdWx0aXhhY3RzfG1lbWJlcnN8b2xkZXN0X211bHRpeGFjdAorLS0tLS0tLS0tLSst LS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgIDF8ICAgICAgM3wgICAgICAgICAgICAg ICAxCisoMSByb3cpCisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2lzb2xhdGlvbi9zcGVjcy9tdWx0 aXhhY3Rfc3RhdHMuc3BlYyBiL3NyYy90ZXN0L2lzb2xhdGlvbi9zcGVjcy9tdWx0aXhhY3Rfc3Rh dHMuc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNTNmY2FkMzhj NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9pc29sYXRpb24vc3BlY3MvbXVsdGl4YWN0 X3N0YXRzLnNwZWMKQEAgLTAsMCArMSwzNSBAQAorc2V0dXAKK3sKKyAgICBDUkVBVEUgVEFCTEUg bXVsdGl4YWN0X3Rlc3QoaWQgaW50IFBSSU1BUlkgS0VZLCB2YWwgaW50KTsKKyAgICBJTlNFUlQg SU5UTyBtdWx0aXhhY3RfdGVzdCBWQUxVRVMgKDEsIDEwKTsKK30KKwordGVhcmRvd24KK3sKKyAg ICBEUk9QIFRBQkxFIG11bHRpeGFjdF90ZXN0OworfQorCitzZXNzaW9uIHMxCitzdGVwIGJlZ2lu MSAgICAgeyBCRUdJTjsgfQorc3RlcCBsb2NrMSAgICAgIHsgU0VMRUNUICogRlJPTSBtdWx0aXhh Y3RfdGVzdCBXSEVSRSBpZCA9IDEgRk9SIFNIQVJFOyB9CitzdGVwIGNvbW1pdDEgICAgeyBDT01N SVQ7IH0KKworc2Vzc2lvbiBzMgorc3RlcCBiZWdpbjIgICAgIHsgQkVHSU47IH0KK3N0ZXAgbG9j azIgICAgICB7IFNFTEVDVCAqIEZST00gbXVsdGl4YWN0X3Rlc3QgV0hFUkUgaWQgPSAxIEZPUiBT SEFSRTsgfQorc3RlcCBjb21taXQyICAgIHsgQ09NTUlUOyB9CisKK3Nlc3Npb24gczMKK3N0ZXAg c3RhdHNfaW5pdCB7IAorICAgIENSRUFURSBURU1QIFRBQkxFIHN0YXRzX2JlZm9yZSBBUyAKKyAg ICBTRUxFQ1QgbXVsdGl4YWN0cywgbWVtYmVycywgb2xkZXN0X211bHRpeGFjdCBGUk9NIHBnX2dl dF9tdWx0aXhhY3Rfc3RhdHMoKTsgCit9CitzdGVwIGNoZWNrICAgICAgeworICAgIFNFTEVDVCAK KyAgICAgICAgbXVsdGl4YWN0cywKKyAgICAgICAgbWVtYmVycywKKyAgICAgICAgb2xkZXN0X211 bHRpeGFjdCAKKyAgICBGUk9NIHBnX2dldF9tdWx0aXhhY3Rfc3RhdHMoKTsKK30KKworcGVybXV0 YXRpb24gc3RhdHNfaW5pdCBjaGVjayBiZWdpbjEgbG9jazEgYmVnaW4yIGxvY2syIGNoZWNrIGNv bW1pdDEgY29tbWl0MiBjaGVjawotLSAKMi40Ny4zCgo= --0000000000002c65b8063b840dab--