Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kaqVB-0002Gz-HO for pgsql-hackers@arkaria.postgresql.org; Fri, 06 Nov 2020 01:25:17 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1kaqVA-0005vu-AG for pgsql-hackers@arkaria.postgresql.org; Fri, 06 Nov 2020 01:25:16 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kaqVA-0005vn-0q for pgsql-hackers@lists.postgresql.org; Fri, 06 Nov 2020 01:25:16 +0000 Received: from oss.nttdata.com ([49.212.34.109]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kaqV6-00040K-Av for pgsql-hackers@postgresql.org; Fri, 06 Nov 2020 01:25:15 +0000 Received: from oss.nttdata.com (localhost [127.0.0.1]) by oss.nttdata.com (Postfix) with ESMTP id 0569A623C4; Fri, 6 Nov 2020 10:25:07 +0900 (JST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.102.3 at oss.nttdata.com MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_95e60433ebdc14c16aa56645da0e52ed" Date: Fri, 06 Nov 2020 10:25:07 +0900 From: Masahiro Ikeda To: Fujii Masao Cc: pgsql-hackers Subject: Re: Add statistics to pg_stat_wal view for wal related parameter tuning In-Reply-To: References: <35ef960128b90bfae3b3fdf60a3a860f@oss.nttdata.com> Message-ID: X-Sender: ikedamsh@oss.nttdata.com User-Agent: Roundcube Webmail/1.1.9 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --=_95e60433ebdc14c16aa56645da0e52ed Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed On 2020-10-30 11:50, Fujii Masao wrote: > On 2020/10/29 17:03, Masahiro Ikeda wrote: >> Hi, >> >> Thanks for your comments and advice. I updated the patch. >> >> On 2020-10-21 18:03, Kyotaro Horiguchi wrote: >>> At Tue, 20 Oct 2020 16:11:29 +0900, Masahiro Ikeda >>> wrote in >>>> On 2020-10-20 12:46, Amit Kapila wrote: >>>> > I see that we also need to add extra code to capture these stats (some >>>> > of which is in performance-critical path especially in >>>> > XLogInsertRecord) which again makes me a bit uncomfortable. It might >>>> > be that it is all fine as it is very important to collect these stats >>>> > at cluster-level in spite that the same information can be gathered at >>>> > statement-level to help customers but I don't see a very strong case >>>> > for that in your proposal. >>> >>> We should avoid that duplication as possible even if the both number >>> are important. >>> >>>> Also about performance, I thought there are few impacts because it >>>> increments stats in memory. If I can implement to reuse pgWalUsage's >>>> value which already collects these stats, there is no impact in >>>> XLogInsertRecord. >>>> For example, how about pg_stat_wal() calculates the accumulated >>>> value of wal_records, wal_fpi, and wal_bytes to use pgWalUsage's >>>> value? >>> >>> I don't think that works, but it would work that pgstat_send_wal() >>> takes the difference of that values between two successive calls. >>> >>> WalUsage prevWalUsage; >>> ... >>> pgstat_send_wal() >>> { >>> .. >>>    /* fill in some values using pgWalUsage */ >>>    WalStats.m_wal_bytes   = pgWalUsage.wal_bytes   - >>> prevWalUsage.wal_bytes; >>>    WalStats.m_wal_records = pgWalUsage.wal_records - >>> prevWalUsage.wal_records; >>>    WalStats.m_wal_wal_fpi = pgWalUsage.wal_fpi     - >>> prevWalUsage.wal_fpi; >>> ... >>>    pgstat_send(&WalStats, sizeof(WalStats)); >>> >>>    /* remember the current numbers */ >>>    prevWalUsage = pgWalUsage; >> >> Thanks for Horiguchi-san's advice, I changed to reuse pgWalUsage >> which is already defined and eliminates the extra overhead. > > + /* fill in some values using pgWalUsage */ > + WalStats.m_wal_bytes = pgWalUsage.wal_bytes - prevWalUsage.wal_bytes; > + WalStats.m_wal_records = pgWalUsage.wal_records - > prevWalUsage.wal_records; > + WalStats.m_wal_fpi = pgWalUsage.wal_fpi - prevWalUsage.wal_fpi; > > It's better to use WalUsageAccumDiff() here? Yes, thanks. I fixed it. > prevWalUsage needs to be initialized with pgWalUsage? > > + if (AmWalWriterProcess()){ > + WalStats.m_wal_write_walwriter++; > + } > + else > + { > + WalStats.m_wal_write_backend++; > + } > > I think that it's better not to separate m_wal_write_xxx into two for > walwriter and other processes. Instead, we can use one m_wal_write_xxx > counter and make pgstat_send_wal() send also the process type to > the stats collector. Then the stats collector can accumulate the > counters > per process type if necessary. If we adopt this approach, we can easily > extend pg_stat_wal so that any fields can be reported per process type. I'll remove the above source code because these counters are not useful. On 2020-10-30 12:00, Fujii Masao wrote: > On 2020/10/20 11:31, Masahiro Ikeda wrote: >> Hi, >> >> I think we need to add some statistics to pg_stat_wal view. >> >> Although there are some parameter related WAL, >> there are few statistics for tuning them. >> >> I think it's better to provide the following statistics. >> Please let me know your comments. >> >> ``` >> postgres=# SELECT * from pg_stat_wal; >> -[ RECORD 1 ]-------+------------------------------ >> wal_records         | 2000224 >> wal_fpi             | 47 >> wal_bytes           | 248216337 >> wal_buffers_full    | 20954 >> wal_init_file       | 8 >> wal_write_backend   | 20960 >> wal_write_walwriter | 46 >> wal_write_time      | 51 >> wal_sync_backend    | 7 >> wal_sync_walwriter  | 8 >> wal_sync_time       | 0 >> stats_reset         | 2020-10-20 11:04:51.307771+09 >> ``` >> >> 1. Basic statistics of WAL activity >> >> - wal_records: Total number of WAL records generated >> - wal_fpi: Total number of WAL full page images generated >> - wal_bytes: Total amount of WAL bytes generated >> >> To understand DB's performance, first, we will check the performance >> trends for the entire database instance. >> For example, if the number of wal_fpi becomes higher, users may tune >> "wal_compression", "checkpoint_timeout" and so on. >> >> Although users can check the above statistics via EXPLAIN, >> auto_explain, >> autovacuum and pg_stat_statements now, >> if users want to see the performance trends  for the entire database, >> they must recalculate the statistics. >> >> I think it is useful to add the sum of the basic statistics. >> >> >> 2.  WAL segment file creation >> >> - wal_init_file: Total number of WAL segment files created. >> >> To create a new WAL file may have an impact on the performance of >> a write-heavy workload generating lots of WAL. If this number is >> reported high, >> to reduce the number of this initialization, we can tune WAL-related >> parameters >> so that more "recycled" WAL files can be held. >> >> >> >> 3. Number of when WAL is flushed >> >> - wal_write_backend : Total number of WAL data written to the disk by >> backends >> - wal_write_walwriter : Total number of WAL data written to the disk >> by walwriter >> - wal_sync_backend : Total number of WAL data synced to the disk by >> backends >> - wal_sync_walwriter : Total number of WAL data synced to the disk by >> walwrite >> >> I think it's useful for tuning "synchronous_commit" and "commit_delay" >> for query executions. >> If the number of WAL is flushed is high, users can know >> "synchronous_commit" is useful for the workload. > > I just wonder how useful these counters are. Even without these > counters, > we already know synchronous_commit=off is likely to cause the better > performance (but has the risk of data loss). So ISTM that these > counters are > not so useful when tuning synchronous_commit. Thanks, my understanding was wrong. I agreed that your comments. I merged the statistics of *_backend and *_walwriter. I think the sum of them is useful to calculate the average per write/sync time. For example, per write time is equals wal_write_time / wal_write. Regards, -- Masahiro Ikeda NTT DATA CORPORATION --=_95e60433ebdc14c16aa56645da0e52ed Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=0003_add_statistics_to_pg_stat_wal_view.patch Content-Disposition: attachment; filename=0003_add_statistics_to_pg_stat_wal_view.patch; size=13930 ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9tb25pdG9yaW5nLnNnbWwgYi9kb2Mvc3JjL3NnbWwv bW9uaXRvcmluZy5zZ21sCmluZGV4IDk4ZTE5OTU0Li5mZDQzOTQyZSAxMDA2NDQKLS0tIGEvZG9j L3NyYy9zZ21sL21vbml0b3Jpbmcuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvbW9uaXRvcmluZy5z Z21sCkBAIC0zNDQ3LDEyICszNDQ3LDg4IEBAIFNFTEVDVCBwaWQsIHdhaXRfZXZlbnRfdHlwZSwg d2FpdF9ldmVudCBGUk9NIHBnX3N0YXRfYWN0aXZpdHkgV0hFUkUgd2FpdF9ldmVudCBpCiAgICAg PC90aGVhZD4KIAogICAgIDx0Ym9keT4KKyAgICAgPHJvdz4KKyAgICAgIDxlbnRyeSByb2xlPSJj YXRhbG9nX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJjb2x1bW5fZGVmaW5pdGlvbiI+CisgICAg ICAgPHN0cnVjdGZpZWxkPndhbF9yZWNvcmRzPC9zdHJ1Y3RmaWVsZD4gPHR5cGU+YmlnaW50PC90 eXBlPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAgICAgVG90YWwgbnVtYmVyIG9m IFdBTCByZWNvcmRzIGdlbmVyYXRlZAorICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgIDwvcm93 PgorCisgICAgIDxyb3c+CisgICAgICA8ZW50cnkgcm9sZT0iY2F0YWxvZ190YWJsZV9lbnRyeSI+ PHBhcmEgcm9sZT0iY29sdW1uX2RlZmluaXRpb24iPgorICAgICAgIDxzdHJ1Y3RmaWVsZD53YWxf ZnBpPC9zdHJ1Y3RmaWVsZD4gPHR5cGU+YmlnaW50PC90eXBlPgorICAgICAgPC9wYXJhPgorICAg ICAgPHBhcmE+CisgICAgICAgVG90YWwgbnVtYmVyIG9mIFdBTCBmdWxsIHBhZ2UgaW1hZ2VzIGdl bmVyYXRlZAorICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgIDwvcm93PgorCisgICAgIDxyb3c+ CisgICAgICA8ZW50cnkgcm9sZT0iY2F0YWxvZ190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iY29s dW1uX2RlZmluaXRpb24iPgorICAgICAgIDxzdHJ1Y3RmaWVsZD53YWxfYnl0ZXM8L3N0cnVjdGZp ZWxkPiA8dHlwZT5iaWdpbnQ8L3R5cGU+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAg ICAgICBUb3RhbCBhbW91bnQgb2YgV0FMIGJ5dGVzIGdlbmVyYXRlZAorICAgICAgPC9wYXJhPjwv ZW50cnk+CisgICAgIDwvcm93PgorCiAgICAgIDxyb3c+CiAgICAgICA8ZW50cnkgcm9sZT0iY2F0 YWxvZ190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iY29sdW1uX2RlZmluaXRpb24iPgogICAgICAg IDxzdHJ1Y3RmaWVsZD53YWxfYnVmZmVyc19mdWxsPC9zdHJ1Y3RmaWVsZD4gPHR5cGU+YmlnaW50 PC90eXBlPgogICAgICAgPC9wYXJhPgogICAgICAgPHBhcmE+Ci0gICAgICAgTnVtYmVyIG9mIHRp bWVzIFdBTCBkYXRhIHdhcyB3cml0dGVuIHRvIHRoZSBkaXNrIGJlY2F1c2UgV0FMIGJ1ZmZlcnMg Z290IGZ1bGwKKyAgICAgICBUb3RhbCBudW1iZXIgb2YgdGltZXMgV0FMIGRhdGEgd3JpdHRlbiB0 byB0aGUgZGlzayBiZWNhdXNlIFdBTCBidWZmZXJzIGdvdCBmdWxsCisgICAgICA8L3BhcmE+PC9l bnRyeT4KKyAgICAgPC9yb3c+CisKKyAgICAgPHJvdz4KKyAgICAgIDxlbnRyeSByb2xlPSJjYXRh bG9nX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJjb2x1bW5fZGVmaW5pdGlvbiI+CisgICAgICAg PHN0cnVjdGZpZWxkPndhbF9pbml0X2ZpbGU8L3N0cnVjdGZpZWxkPiA8dHlwZT5iaWdpbnQ8L3R5 cGU+CisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICBUb3RhbCBudW1iZXIgb2Yg V0FMIGZpbGUgc2VnbWVudCBjcmVhdGVkCisgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgPC9y b3c+CisKKyAgICAgPHJvdz4KKyAgICAgIDxlbnRyeSByb2xlPSJjYXRhbG9nX3RhYmxlX2VudHJ5 Ij48cGFyYSByb2xlPSJjb2x1bW5fZGVmaW5pdGlvbiI+CisgICAgICAgPHN0cnVjdGZpZWxkPndh bF93cml0ZTwvc3RydWN0ZmllbGQ+IDx0eXBlPmJpZ2ludDwvdHlwZT4KKyAgICAgIDwvcGFyYT4K KyAgICAgIDxwYXJhPgorICAgICAgIFRvdGFsIG51bWJlciBvZiB0aW1lcyB0byB3cml0ZSBXQUwg ZGF0YSB0byB0aGUgZGlzaworICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgIDwvcm93PgorCisg ICAgIDxyb3c+CisgICAgICA8ZW50cnkgcm9sZT0iY2F0YWxvZ190YWJsZV9lbnRyeSI+PHBhcmEg cm9sZT0iY29sdW1uX2RlZmluaXRpb24iPgorICAgICAgIDxzdHJ1Y3RmaWVsZD53YWxfd3JpdGVf dGltZTwvc3RydWN0ZmllbGQ+IDx0eXBlPmJpZ2ludDwvdHlwZT4KKyAgICAgIDwvcGFyYT4KKyAg ICAgIDxwYXJhPgorICAgICAgIFRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgaGFzIGJlZW4gc3Bl bnQgaW4gdGhlIHBvcnRpb24gb2YKKyAgICAgICBXQUwgZGF0YSB3YXMgd3JpdHRlbiB0byBkaXNr IGJ5IGJhY2tlbmQgYW5kIHdhbHdyaXRlciwgaW4gbWlsbGlzZWNvbmRzCisgICAgICAgKGlmIDx4 cmVmIGxpbmtlbmQ9Imd1Yy10cmFjay1pby10aW1pbmciLz4gaXMgZW5hYmxlZCwgb3RoZXJ3aXNl IHplcm8pCisgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgPC9yb3c+CisKKyAgICAgPHJvdz4K KyAgICAgIDxlbnRyeSByb2xlPSJjYXRhbG9nX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJjb2x1 bW5fZGVmaW5pdGlvbiI+CisgICAgICAgPHN0cnVjdGZpZWxkPndhbF9zeW5jPC9zdHJ1Y3RmaWVs ZD4gPHR5cGU+YmlnaW50PC90eXBlPgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisgICAg ICAgVG90YWwgbnVtYmVyIG9mIHRpbWVzIHRvIHN5bmMgV0FMIGRhdGEgdG8gdGhlIGRpc2sKKyAg ICAgIDwvcGFyYT48L2VudHJ5PgorICAgICA8L3Jvdz4KKworICAgICA8cm93PgorICAgICAgPGVu dHJ5IHJvbGU9ImNhdGFsb2dfdGFibGVfZW50cnkiPjxwYXJhIHJvbGU9ImNvbHVtbl9kZWZpbml0 aW9uIj4KKyAgICAgICA8c3RydWN0ZmllbGQ+d2FsX3N5bmNfdGltZTwvc3RydWN0ZmllbGQ+IDx0 eXBlPmJpZ2ludDwvdHlwZT4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgIFRv dGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgaGFzIGJlZW4gc3BlbnQgaW4gdGhlIHBvcnRpb24gb2YK KyAgICAgICBXQUwgZGF0YSB3YXMgc3luY2VkIHRvIGRpc2sgYnkgYmFja2VuZCBhbmQgd2Fsd3Jp dGVyLCBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAoaWYgPHhyZWYgbGlua2VuZD0iZ3VjLXRyYWNr LWlvLXRpbWluZyIvPiBpcyBlbmFibGVkLCBvdGhlcndpc2UgemVybykKICAgICAgIDwvcGFyYT48 L2VudHJ5PgogICAgICA8L3Jvdz4KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL3Ry YW5zYW0veGxvZy5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZy5jCmluZGV4IGUw ODFiZjkyLi5jNmQyZjhhYiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0v eGxvZy5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2cuYwpAQCAtMjUyNyw2 ICsyNTI3LDggQEAgWExvZ1dyaXRlKFhMb2d3cnRScXN0IFdyaXRlUnFzdCwgYm9vbCBmbGV4aWJs ZSkKIAkJCVNpemUJCW5ieXRlczsKIAkJCVNpemUJCW5sZWZ0OwogCQkJaW50CQkJd3JpdHRlbjsK KwkJCWluc3RyX3RpbWUJc3RhcnQ7CisJCQlpbnN0cl90aW1lCWR1cmF0aW9uOwogCiAJCQkvKiBP SyB0byB3cml0ZSB0aGUgcGFnZShzKSAqLwogCQkJZnJvbSA9IFhMb2dDdGwtPnBhZ2VzICsgc3Rh cnRpZHggKiAoU2l6ZSkgWExPR19CTENLU1o7CkBAIC0yNTM1LDkgKzI1MzcsMjIgQEAgWExvZ1dy aXRlKFhMb2d3cnRScXN0IFdyaXRlUnFzdCwgYm9vbCBmbGV4aWJsZSkKIAkJCWRvCiAJCQl7CiAJ CQkJZXJybm8gPSAwOworCQkJCWlmICh0cmFja19pb190aW1pbmcpCisJCQkJCUlOU1RSX1RJTUVf U0VUX0NVUlJFTlQoc3RhcnQpOworCiAJCQkJcGdzdGF0X3JlcG9ydF93YWl0X3N0YXJ0KFdBSVRf RVZFTlRfV0FMX1dSSVRFKTsKIAkJCQl3cml0dGVuID0gcGdfcHdyaXRlKG9wZW5Mb2dGaWxlLCBm cm9tLCBubGVmdCwgc3RhcnRvZmZzZXQpOwogCQkJCXBnc3RhdF9yZXBvcnRfd2FpdF9lbmQoKTsK KworCQkJCWlmICh0cmFja19pb190aW1pbmcpCisJCQkJeworCQkJCQlJTlNUUl9USU1FX1NFVF9D VVJSRU5UKGR1cmF0aW9uKTsKKwkJCQkJSU5TVFJfVElNRV9TVUJUUkFDVChkdXJhdGlvbiwgc3Rh cnQpOworCQkJCQlXYWxTdGF0cy5tX3dhbF93cml0ZV90aW1lICs9IElOU1RSX1RJTUVfR0VUX01J TExJU0VDKGR1cmF0aW9uKTsKKwkJCQl9CisKKwkJCQlXYWxTdGF0cy5tX3dhbF93cml0ZSsrOwor CiAJCQkJaWYgKHdyaXR0ZW4gPD0gMCkKIAkJCQl7CiAJCQkJCWNoYXIJCXhsb2dmbmFtZVtNQVhG TkFNRUxFTl07CkBAIC0zNDE4LDYgKzM0MzMsNyBAQCBYTG9nRmlsZUluaXQoWExvZ1NlZ05vIGxv Z3NlZ25vLCBib29sICp1c2VfZXhpc3RlbnQsIGJvb2wgdXNlX2xvY2spCiAJCQkJIGVycm1zZygi Y291bGQgbm90IG9wZW4gZmlsZSBcIiVzXCI6ICVtIiwgcGF0aCkpKTsKIAogCWVsb2coREVCVUcy LCAiZG9uZSBjcmVhdGluZyBhbmQgZmlsbGluZyBuZXcgV0FMIGZpbGUiKTsKKwlXYWxTdGF0cy5t X3dhbF9pbml0X2ZpbGUrKzsKIAogCXJldHVybiBmZDsKIH0KQEAgLTEwNDI2LDggKzEwNDQyLDEz IEBAIGFzc2lnbl94bG9nX3N5bmNfbWV0aG9kKGludCBuZXdfc3luY19tZXRob2QsIHZvaWQgKmV4 dHJhKQogdm9pZAogaXNzdWVfeGxvZ19mc3luYyhpbnQgZmQsIFhMb2dTZWdObyBzZWdubykKIHsK KwlpbnN0cl90aW1lCXN0YXJ0OworCWluc3RyX3RpbWUJZHVyYXRpb247CiAJY2hhcgkgICAqbXNn ID0gTlVMTDsKIAorCWlmICh0cmFja19pb190aW1pbmcpCisJCUlOU1RSX1RJTUVfU0VUX0NVUlJF TlQoc3RhcnQpOworCiAJcGdzdGF0X3JlcG9ydF93YWl0X3N0YXJ0KFdBSVRfRVZFTlRfV0FMX1NZ TkMpOwogCXN3aXRjaCAoc3luY19tZXRob2QpCiAJewpAQCAtMTA0NzEsNiArMTA0OTIsMTUgQEAg aXNzdWVfeGxvZ19mc3luYyhpbnQgZmQsIFhMb2dTZWdObyBzZWdubykKIAl9CiAKIAlwZ3N0YXRf cmVwb3J0X3dhaXRfZW5kKCk7CisKKwlpZiAodHJhY2tfaW9fdGltaW5nKQorCXsKKwkJSU5TVFJf VElNRV9TRVRfQ1VSUkVOVChkdXJhdGlvbik7CisJCUlOU1RSX1RJTUVfU1VCVFJBQ1QoZHVyYXRp b24sIHN0YXJ0KTsKKwkJV2FsU3RhdHMubV93YWxfc3luY190aW1lICs9IElOU1RSX1RJTUVfR0VU X01JTExJU0VDKGR1cmF0aW9uKTsKKwl9CisKKwlXYWxTdGF0cy5tX3dhbF9zeW5jKys7CiB9CiAK IC8qCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jYXRhbG9nL3N5c3RlbV92aWV3cy5zcWwgYi9z cmMvYmFja2VuZC9jYXRhbG9nL3N5c3RlbV92aWV3cy5zcWwKaW5kZXggMmU0YWExYzQuLjg5N2Ji NTliIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jYXRhbG9nL3N5c3RlbV92aWV3cy5zcWwKKysr IGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fdmlld3Muc3FsCkBAIC05OTMsNyArOTkzLDE1 IEBAIENSRUFURSBWSUVXIHBnX3N0YXRfYmd3cml0ZXIgQVMKIAogQ1JFQVRFIFZJRVcgcGdfc3Rh dF93YWwgQVMKICAgICBTRUxFQ1QKKyAgICAgICAgdy53YWxfcmVjb3JkcywKKyAgICAgICAgdy53 YWxfZnBpLAorICAgICAgICB3LndhbF9ieXRlcywKICAgICAgICAgdy53YWxfYnVmZmVyc19mdWxs LAorICAgICAgICB3LndhbF9pbml0X2ZpbGUsCisgICAgICAgIHcud2FsX3dyaXRlLAorICAgICAg ICB3LndhbF93cml0ZV90aW1lLAorICAgICAgICB3LndhbF9zeW5jLAorICAgICAgICB3LndhbF9z eW5jX3RpbWUsCiAgICAgICAgIHcuc3RhdHNfcmVzZXQKICAgICBGUk9NIHBnX3N0YXRfZ2V0X3dh bCgpIHc7CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvcGdzdGF0LmMgYi9z cmMvYmFja2VuZC9wb3N0bWFzdGVyL3Bnc3RhdC5jCmluZGV4IGYxZGNhMmYyLi42NmI1YjRmOSAx MDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9wZ3N0YXQuYworKysgYi9zcmMvYmFj a2VuZC9wb3N0bWFzdGVyL3Bnc3RhdC5jCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSAiY2F0 YWxvZy9wZ19kYXRhYmFzZS5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfcHJvYy5oIgogI2luY2x1 ZGUgImNvbW1vbi9pcC5oIgorI2luY2x1ZGUgImV4ZWN1dG9yL2luc3RydW1lbnQuaCIKICNpbmNs dWRlICJsaWJwcS9saWJwcS5oIgogI2luY2x1ZGUgImxpYnBxL3Bxc2lnbmFsLmgiCiAjaW5jbHVk ZSAibWIvcGdfd2NoYXIuaCIKQEAgLTE0Miw2ICsxNDMsNyBAQCBjaGFyCSAgICpwZ3N0YXRfc3Rh dF90bXBuYW1lID0gTlVMTDsKICAqLwogUGdTdGF0X01zZ0JnV3JpdGVyIEJnV3JpdGVyU3RhdHM7 CiBQZ1N0YXRfTXNnV2FsIFdhbFN0YXRzOworV2FsVXNhZ2UgcHJldldhbFVzYWdlOwogCiAvKgog ICogTGlzdCBvZiBTTFJVIG5hbWVzIHRoYXQgd2Uga2VlcCBzdGF0cyBmb3IuICBUaGVyZSBpcyBu byBjZW50cmFsIHJlZ2lzdHJ5IG9mCkBAIC00NTc0LDYgKzQ1NzYsMTUgQEAgcGdzdGF0X3NlbmRf Ymd3cml0ZXIodm9pZCkKIHZvaWQKIHBnc3RhdF9zZW5kX3dhbCh2b2lkKQogeworCS8qIGZpbGwg aW4gc29tZSB2YWx1ZXMgdXNpbmcgcGdXYWxVc2FnZSAqLworCVdhbFVzYWdlIHdhbHVzYWdlOwor CW1lbXNldCgmd2FsdXNhZ2UsIDAsIHNpemVvZihXYWxVc2FnZSkpOworCVdhbFVzYWdlQWNjdW1E aWZmKCZ3YWx1c2FnZSwgJnBnV2FsVXNhZ2UsICZwcmV2V2FsVXNhZ2UpOworCisJV2FsU3RhdHMu bV93YWxfYnl0ZXMgPSB3YWx1c2FnZS53YWxfYnl0ZXM7CisJV2FsU3RhdHMubV93YWxfcmVjb3Jk cyA9IHdhbHVzYWdlLndhbF9yZWNvcmRzOworCVdhbFN0YXRzLm1fd2FsX2ZwaSA9IHdhbHVzYWdl LndhbF9mcGk7CisKIAkvKiBXZSBhc3N1bWUgdGhpcyBpbml0aWFsaXplcyB0byB6ZXJvZXMgKi8K IAlzdGF0aWMgY29uc3QgUGdTdGF0X01zZ1dhbCBhbGxfemVyb2VzOwogCkBAIC00NTkxLDYgKzQ2 MDIsOSBAQCBwZ3N0YXRfc2VuZF93YWwodm9pZCkKIAlwZ3N0YXRfc2V0aGVhZGVyKCZXYWxTdGF0 cy5tX2hkciwgUEdTVEFUX01UWVBFX1dBTCk7CiAJcGdzdGF0X3NlbmQoJldhbFN0YXRzLCBzaXpl b2YoV2FsU3RhdHMpKTsKIAorCS8qIHJlbWVtYmVyIHRoZSBjdXJyZW50IG51bWJlcnMgKi8KKwlw cmV2V2FsVXNhZ2UgPSBwZ1dhbFVzYWdlOworCiAJLyoKIAkgKiBDbGVhciBvdXQgdGhlIHN0YXRp c3RpY3MgYnVmZmVyLCBzbyBpdCBjYW4gYmUgcmUtdXNlZC4KIAkgKi8KQEAgLTY3NTksNyArNjc3 MywxNSBAQCBwZ3N0YXRfcmVjdl9iZ3dyaXRlcihQZ1N0YXRfTXNnQmdXcml0ZXIgKm1zZywgaW50 IGxlbikKIHN0YXRpYyB2b2lkCiBwZ3N0YXRfcmVjdl93YWwoUGdTdGF0X01zZ1dhbCAqbXNnLCBp bnQgbGVuKQogeworCXdhbFN0YXRzLndhbF9yZWNvcmRzICs9IG1zZy0+bV93YWxfcmVjb3JkczsK Kwl3YWxTdGF0cy53YWxfZnBpICs9IG1zZy0+bV93YWxfZnBpOworCXdhbFN0YXRzLndhbF9ieXRl cyArPSBtc2ctPm1fd2FsX2J5dGVzOwogCXdhbFN0YXRzLndhbF9idWZmZXJzX2Z1bGwgKz0gbXNn LT5tX3dhbF9idWZmZXJzX2Z1bGw7CisJd2FsU3RhdHMud2FsX2luaXRfZmlsZSArPSBtc2ctPm1f d2FsX2luaXRfZmlsZTsKKwl3YWxTdGF0cy53YWxfd3JpdGUgKz0gbXNnLT5tX3dhbF93cml0ZTsK Kwl3YWxTdGF0cy53YWxfd3JpdGVfdGltZSArPSBtc2ctPm1fd2FsX3dyaXRlX3RpbWU7CisJd2Fs U3RhdHMud2FsX3N5bmMgKz0gbXNnLT5tX3dhbF9zeW5jOworCXdhbFN0YXRzLndhbF9zeW5jX3Rp bWUgKz0gbXNnLT5tX3dhbF9zeW5jX3RpbWU7CiB9CiAKIC8qIC0tLS0tLS0tLS0KZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvd2Fsd3JpdGVyLmMgYi9zcmMvYmFja2VuZC9wb3N0 bWFzdGVyL3dhbHdyaXRlci5jCmluZGV4IGE1MjgzMmZlLi5jZTlmNGI3YyAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvcG9zdG1hc3Rlci93YWx3cml0ZXIuYworKysgYi9zcmMvYmFja2VuZC9wb3N0 bWFzdGVyL3dhbHdyaXRlci5jCkBAIC0yNTMsNiArMjUzLDkgQEAgV2FsV3JpdGVyTWFpbih2b2lk KQogCQllbHNlIGlmIChsZWZ0X3RpbGxfaGliZXJuYXRlID4gMCkKIAkJCWxlZnRfdGlsbF9oaWJl cm5hdGUtLTsKIAorCQkvKiBTZW5kIFdBTCBzdGF0aXN0aWNzICovCisJCXBnc3RhdF9zZW5kX3dh bCgpOworCiAJCS8qCiAJCSAqIFNsZWVwIHVudGlsIHdlIGFyZSBzaWduYWxlZCBvciBXYWxXcml0 ZXJEZWxheSBoYXMgZWxhcHNlZC4gIElmIHdlCiAJCSAqIGhhdmVuJ3QgZG9uZSBhbnl0aGluZyB1 c2VmdWwgZm9yIHF1aXRlIHNvbWUgdGltZSwgbGVuZ3RoZW4gdGhlCmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC91dGlscy9hZHQvcGdzdGF0ZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9w Z3N0YXRmdW5jcy5jCmluZGV4IGEyMTBmYzkzLi41NTczM2M3MCAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L3Bnc3RhdGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L3Bnc3RhdGZ1bmNzLmMKQEAgLTE3MDMsNyArMTcwMyw3IEBAIHBnX3N0YXRfZ2V0X2J1Zl9hbGxv YyhQR19GVU5DVElPTl9BUkdTKQogRGF0dW0KIHBnX3N0YXRfZ2V0X3dhbChQR19GVU5DVElPTl9B UkdTKQogewotI2RlZmluZSBQR19TVEFUX0dFVF9XQUxfQ09MUwkyCisjZGVmaW5lIFBHX1NUQVRf R0VUX1dBTF9DT0xTCTEwCiAJVHVwbGVEZXNjCXR1cGRlc2M7CiAJRGF0dW0JCXZhbHVlc1tQR19T VEFUX0dFVF9XQUxfQ09MU107CiAJYm9vbAkJbnVsbHNbUEdfU1RBVF9HRVRfV0FMX0NPTFNdOwpA QCAtMTcxNSw5ICsxNzE1LDI1IEBAIHBnX3N0YXRfZ2V0X3dhbChQR19GVU5DVElPTl9BUkdTKQog CiAJLyogSW5pdGlhbGlzZSBhdHRyaWJ1dGVzIGluZm9ybWF0aW9uIGluIHRoZSB0dXBsZSBkZXNj cmlwdG9yICovCiAJdHVwZGVzYyA9IENyZWF0ZVRlbXBsYXRlVHVwbGVEZXNjKFBHX1NUQVRfR0VU X1dBTF9DT0xTKTsKLQlUdXBsZURlc2NJbml0RW50cnkodHVwZGVzYywgKEF0dHJOdW1iZXIpIDEs ICJ3YWxfYnVmZmVyc19mdWxsIiwKKwlUdXBsZURlc2NJbml0RW50cnkodHVwZGVzYywgKEF0dHJO dW1iZXIpIDEsICJ3YWxfcmVjb3JkcyIsCiAJCQkJCSAgIElOVDhPSUQsIC0xLCAwKTsKLQlUdXBs ZURlc2NJbml0RW50cnkodHVwZGVzYywgKEF0dHJOdW1iZXIpIDIsICJzdGF0c19yZXNldCIsCisJ VHVwbGVEZXNjSW5pdEVudHJ5KHR1cGRlc2MsIChBdHRyTnVtYmVyKSAyLCAid2FsX2ZwaSIsCisJ CQkJCSAgIElOVDhPSUQsIC0xLCAwKTsKKwlUdXBsZURlc2NJbml0RW50cnkodHVwZGVzYywgKEF0 dHJOdW1iZXIpIDMsICJ3YWxfYnl0ZXMiLAorCQkJCQkgICBJTlQ4T0lELCAtMSwgMCk7CisJVHVw bGVEZXNjSW5pdEVudHJ5KHR1cGRlc2MsIChBdHRyTnVtYmVyKSA0LCAid2FsX2J1ZmZlcnNfZnVs bCIsCisJCQkJCSAgIElOVDhPSUQsIC0xLCAwKTsKKwlUdXBsZURlc2NJbml0RW50cnkodHVwZGVz YywgKEF0dHJOdW1iZXIpIDUsICJ3YWxfaW5pdF9maWxlIiwKKwkJCQkJICAgSU5UOE9JRCwgLTEs IDApOworCVR1cGxlRGVzY0luaXRFbnRyeSh0dXBkZXNjLCAoQXR0ck51bWJlcikgNiwgIndhbF93 cml0ZSIsCisJCQkJCSAgIElOVDhPSUQsIC0xLCAwKTsKKwlUdXBsZURlc2NJbml0RW50cnkodHVw ZGVzYywgKEF0dHJOdW1iZXIpIDcsICJ3YWxfd3JpdGVfdGltZSIsCisJCQkJCSAgIElOVDhPSUQs IC0xLCAwKTsKKwlUdXBsZURlc2NJbml0RW50cnkodHVwZGVzYywgKEF0dHJOdW1iZXIpIDgsICJ3 YWxfc3luYyIsCisJCQkJCSAgIElOVDhPSUQsIC0xLCAwKTsKKwlUdXBsZURlc2NJbml0RW50cnko dHVwZGVzYywgKEF0dHJOdW1iZXIpIDksICJ3YWxfc3luY190aW1lIiwKKwkJCQkJICAgSU5UOE9J RCwgLTEsIDApOworCVR1cGxlRGVzY0luaXRFbnRyeSh0dXBkZXNjLCAoQXR0ck51bWJlcikgMTAs ICJzdGF0c19yZXNldCIsCiAJCQkJCSAgIFRJTUVTVEFNUFRaT0lELCAtMSwgMCk7CiAKIAlCbGVz c1R1cGxlRGVzYyh0dXBkZXNjKTsKQEAgLTE3MjYsOCArMTc0MiwxNiBAQCBwZ19zdGF0X2dldF93 YWwoUEdfRlVOQ1RJT05fQVJHUykKIAl3YWxfc3RhdHMgPSBwZ3N0YXRfZmV0Y2hfc3RhdF93YWwo KTsKIAogCS8qIEZpbGwgdmFsdWVzIGFuZCBOVUxMcyAqLwotCXZhbHVlc1swXSA9IEludDY0R2V0 RGF0dW0od2FsX3N0YXRzLT53YWxfYnVmZmVyc19mdWxsKTsKLQl2YWx1ZXNbMV0gPSBUaW1lc3Rh bXBUekdldERhdHVtKHdhbF9zdGF0cy0+c3RhdF9yZXNldF90aW1lc3RhbXApOworCXZhbHVlc1sw XSA9IEludDY0R2V0RGF0dW0od2FsX3N0YXRzLT53YWxfcmVjb3Jkcyk7CisJdmFsdWVzWzFdID0g SW50NjRHZXREYXR1bSh3YWxfc3RhdHMtPndhbF9mcGkpOworCXZhbHVlc1syXSA9IEludDY0R2V0 RGF0dW0od2FsX3N0YXRzLT53YWxfYnl0ZXMpOworCXZhbHVlc1szXSA9IEludDY0R2V0RGF0dW0o d2FsX3N0YXRzLT53YWxfYnVmZmVyc19mdWxsKTsKKwl2YWx1ZXNbNF0gPSBJbnQ2NEdldERhdHVt KHdhbF9zdGF0cy0+d2FsX2luaXRfZmlsZSk7CisJdmFsdWVzWzVdID0gSW50NjRHZXREYXR1bSh3 YWxfc3RhdHMtPndhbF93cml0ZSk7CisJdmFsdWVzWzZdID0gSW50NjRHZXREYXR1bSh3YWxfc3Rh dHMtPndhbF93cml0ZV90aW1lKTsKKwl2YWx1ZXNbN10gPSBJbnQ2NEdldERhdHVtKHdhbF9zdGF0 cy0+d2FsX3N5bmMpOworCXZhbHVlc1s4XSA9IEludDY0R2V0RGF0dW0od2FsX3N0YXRzLT53YWxf c3luY190aW1lKTsKKwl2YWx1ZXNbOV0gPSBUaW1lc3RhbXBUekdldERhdHVtKHdhbF9zdGF0cy0+ c3RhdF9yZXNldF90aW1lc3RhbXApOwogCiAJLyogUmV0dXJucyB0aGUgcmVjb3JkIGFzIERhdHVt ICovCiAJUEdfUkVUVVJOX0RBVFVNKEhlYXBUdXBsZUdldERhdHVtKGhlYXBfZm9ybV90dXBsZSh0 dXBkZXNjLCB2YWx1ZXMsIG51bGxzKSkpOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxv Zy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKaW5kZXggODgz Nzg5NTMuLjU1ZmY5MzdjIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2Mu ZGF0CisrKyBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKQEAgLTU0OTEsOSArNTQ5 MSw5IEBACiB7IG9pZCA9PiAnMTEzNicsIGRlc2NyID0+ICdzdGF0aXN0aWNzOiBpbmZvcm1hdGlv biBhYm91dCBXQUwgYWN0aXZpdHknLAogICBwcm9uYW1lID0+ICdwZ19zdGF0X2dldF93YWwnLCBw cm9pc3N0cmljdCA9PiAnZicsIHByb3ZvbGF0aWxlID0+ICdzJywKICAgcHJvcGFyYWxsZWwgPT4g J3InLCBwcm9yZXR0eXBlID0+ICdyZWNvcmQnLCBwcm9hcmd0eXBlcyA9PiAnJywKLSAgcHJvYWxs YXJndHlwZXMgPT4gJ3tpbnQ4LHRpbWVzdGFtcHR6fScsCi0gIHByb2FyZ21vZGVzID0+ICd7byxv fScsCi0gIHByb2FyZ25hbWVzID0+ICd7d2FsX2J1ZmZlcnNfZnVsbCxzdGF0c19yZXNldH0nLAor ICBwcm9hbGxhcmd0eXBlcyA9PiAne2ludDgsaW50OCxpbnQ4LGludDgsaW50OCxpbnQ4LGludDgs aW50OCxpbnQ4LHRpbWVzdGFtcHR6fScsCisgIHByb2FyZ21vZGVzID0+ICd7byxvLG8sbyxvLG8s byxvLG8sb30nLAorICBwcm9hcmduYW1lcyA9PiAne3dhbF9yZWNvcmRzLHdhbF9mcGksd2FsX2J5 dGVzLHdhbF9idWZmZXJzX2Z1bGwsd2FsX2luaXRfZmlsZSx3YWxfd3JpdGUsd2FsX3dyaXRlX3Rp bWUsd2FsX3N5bmMsd2FsX3N5bmNfdGltZSxzdGF0c19yZXNldH0nLAogICBwcm9zcmMgPT4gJ3Bn X3N0YXRfZ2V0X3dhbCcgfSwKIAogeyBvaWQgPT4gJzIzMDYnLCBkZXNjciA9PiAnc3RhdGlzdGlj czogaW5mb3JtYXRpb24gYWJvdXQgU0xSVSBjYWNoZXMnLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1 ZGUvcGdzdGF0LmggYi9zcmMvaW5jbHVkZS9wZ3N0YXQuaAppbmRleCAyNTdlNTE1Yi4uMTZjZTky NDYgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3Bnc3RhdC5oCisrKyBiL3NyYy9pbmNsdWRlL3Bn c3RhdC5oCkBAIC00NTksNyArNDU5LDE1IEBAIHR5cGVkZWYgc3RydWN0IFBnU3RhdF9Nc2dCZ1dy aXRlcgogdHlwZWRlZiBzdHJ1Y3QgUGdTdGF0X01zZ1dhbAogewogCVBnU3RhdF9Nc2dIZHIgbV9o ZHI7CisJUGdTdGF0X0NvdW50ZXIgbV93YWxfcmVjb3JkczsKKwlQZ1N0YXRfQ291bnRlciBtX3dh bF9mcGk7CisJUGdTdGF0X0NvdW50ZXIgbV93YWxfYnl0ZXM7CiAJUGdTdGF0X0NvdW50ZXIgbV93 YWxfYnVmZmVyc19mdWxsOworCVBnU3RhdF9Db3VudGVyIG1fd2FsX2luaXRfZmlsZTsKKwlQZ1N0 YXRfQ291bnRlciBtX3dhbF93cml0ZTsKKwlQZ1N0YXRfQ291bnRlciBtX3dhbF93cml0ZV90aW1l OwkvKiBhY2N1bXVsYXRlIHRpbWVzIGluIG1pbGxpc2Vjb25kcyAqLworCVBnU3RhdF9Db3VudGVy IG1fd2FsX3N5bmM7CisJUGdTdGF0X0NvdW50ZXIgbV93YWxfc3luY190aW1lOwkvKiBhY2N1bXVs YXRlIHRpbWVzIGluIG1pbGxpc2Vjb25kcyAqLwogfSBQZ1N0YXRfTXNnV2FsOwogCiAvKiAtLS0t LS0tLS0tCkBAIC03OTgsNyArODA2LDE2IEBAIHR5cGVkZWYgc3RydWN0IFBnU3RhdF9HbG9iYWxT dGF0cwogICovCiB0eXBlZGVmIHN0cnVjdCBQZ1N0YXRfV2FsU3RhdHMKIHsKKwlQZ1N0YXRfQ291 bnRlciB3YWxfcmVjb3JkczsKKwlQZ1N0YXRfQ291bnRlciB3YWxfZnBpOworCVBnU3RhdF9Db3Vu dGVyIHdhbF9ieXRlczsKIAlQZ1N0YXRfQ291bnRlciB3YWxfYnVmZmVyc19mdWxsOworCVBnU3Rh dF9Db3VudGVyIHdhbF9pbml0X2ZpbGU7CisJUGdTdGF0X0NvdW50ZXIgd2FsX3dyaXRlOworCVBn U3RhdF9Db3VudGVyIHdhbF93cml0ZV90aW1lOworCVBnU3RhdF9Db3VudGVyIHdhbF9zeW5jOwor CVBnU3RhdF9Db3VudGVyIHdhbF9zeW5jX3RpbWU7CisKIAlUaW1lc3RhbXBUeiBzdGF0X3Jlc2V0 X3RpbWVzdGFtcDsKIH0gUGdTdGF0X1dhbFN0YXRzOwogCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL3J1bGVzLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcnVs ZXMub3V0CmluZGV4IDA5N2ZmNWQxLi4zMDJlY2FhOCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9ydWxlcy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9y dWxlcy5vdXQKQEAgLTIxMzgsOSArMjEzOCwxNyBAQCBwZ19zdGF0X3VzZXJfdGFibGVzfCBTRUxF Q1QgcGdfc3RhdF9hbGxfdGFibGVzLnJlbGlkLAogICAgIHBnX3N0YXRfYWxsX3RhYmxlcy5hdXRv YW5hbHl6ZV9jb3VudAogICAgRlJPTSBwZ19zdGF0X2FsbF90YWJsZXMKICAgV0hFUkUgKChwZ19z dGF0X2FsbF90YWJsZXMuc2NoZW1hbmFtZSA8PiBBTEwgKEFSUkFZWydwZ19jYXRhbG9nJzo6bmFt ZSwgJ2luZm9ybWF0aW9uX3NjaGVtYSc6Om5hbWVdKSkgQU5EIChwZ19zdGF0X2FsbF90YWJsZXMu c2NoZW1hbmFtZSAhfiAnXnBnX3RvYXN0Jzo6dGV4dCkpOwotcGdfc3RhdF93YWx8IFNFTEVDVCB3 LndhbF9idWZmZXJzX2Z1bGwsCitwZ19zdGF0X3dhbHwgU0VMRUNUIHcud2FsX3JlY29yZHMsCisg ICAgdy53YWxfZnBpLAorICAgIHcud2FsX2J5dGVzLAorICAgIHcud2FsX2J1ZmZlcnNfZnVsbCwK KyAgICB3LndhbF9pbml0X2ZpbGUsCisgICAgdy53YWxfd3JpdGUsCisgICAgdy53YWxfd3JpdGVf dGltZSwKKyAgICB3LndhbF9zeW5jLAorICAgIHcud2FsX3N5bmNfdGltZSwKICAgICB3LnN0YXRz X3Jlc2V0Ci0gICBGUk9NIHBnX3N0YXRfZ2V0X3dhbCgpIHcod2FsX2J1ZmZlcnNfZnVsbCwgc3Rh dHNfcmVzZXQpOworICAgRlJPTSBwZ19zdGF0X2dldF93YWwoKSB3KHdhbF9yZWNvcmRzLCB3YWxf ZnBpLCB3YWxfYnl0ZXMsIHdhbF9idWZmZXJzX2Z1bGwsIHdhbF9pbml0X2ZpbGUsIHdhbF93cml0 ZSwgd2FsX3dyaXRlX3RpbWUsIHdhbF9zeW5jLCB3YWxfc3luY190aW1lLCBzdGF0c19yZXNldCk7 CiBwZ19zdGF0X3dhbF9yZWNlaXZlcnwgU0VMRUNUIHMucGlkLAogICAgIHMuc3RhdHVzLAogICAg IHMucmVjZWl2ZV9zdGFydF9sc24sCg== --=_95e60433ebdc14c16aa56645da0e52ed--