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 1rmi2z-009POm-Ue for pgsql-hackers@arkaria.postgresql.org; Tue, 19 Mar 2024 22:35:07 +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 1rmi2y-0013b7-9r for pgsql-hackers@arkaria.postgresql.org; Tue, 19 Mar 2024 22:35:04 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rmi2x-0013at-K1 for pgsql-hackers@lists.postgresql.org; Tue, 19 Mar 2024 22:35:04 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by makus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rmi2o-005Ocu-BY for pgsql-hackers@lists.postgresql.org; Tue, 19 Mar 2024 22:35:02 +0000 Received: from mail.postgrespro.ru (unknown [192.168.2.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) (Authenticated sender: i.kartyshov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 12C85E20E96; Wed, 20 Mar 2024 01:34:51 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1710887691; bh=GNVC1INJGS6ERfAlxKhpJwjCKMP5oRtO9nYgoCKEG9s=; h=Date:From:To:Cc:Subject:In-Reply-To:References:User-Agent: Message-ID:From; b=pIfkcskYpT2a3sve4/QGXaP+HtKe3PRltbrrbLd11NqUGW5/oCIa6/cuDOFN8GGi+ uOuCmztlhyy5KZV4CDhK+c6vjGDSn2+LKwxcYuyXeS838TG0hSkkIlSfz3dY3c7fYR nSd0oGq/vKz8WuYuC8K5znPB1bHV/p90JtRwvKBuZSIMrLQs6MvHqD0GWgaPs+irB4 9Vy75TqjJUiTQvhDHiu/5BKQ8lzHnGGLoFwVMT7G2tth6ltBpOhPoPt1YYS8oKLLYF 9VkmUlh8rjzLSypoTdg/HkWjWKIO/gf2JCDNhBGFB19HZYoGrfRifeJgZyUogb2m+9 hNxL+10qNw41A== MIME-Version: 1.0 Date: Wed, 20 Mar 2024 01:34:51 +0300 From: Kartyshov Ivan To: Bharath Rupireddy Cc: Alexander Korotkov , Amit Kapila , dilipbalaut@gmail.com, smithpb2250@gmail.com, pgsql-hackers@lists.postgresql.org Subject: Re: [HACKERS] make async slave to wait for lsn to be replayed In-Reply-To: References: <22f122-655b3e80-3-688b3700@97587957> <4953563546cb8c8851f84c7debf723ef@postgrespro.ru> <31547e4e8c263392a768ea89a3f57833@postgrespro.ru> <9e0ad3332c0bf7c4f00ff10677245e46@postgrespro.ru> <59cf2cbdc6f9bf81602e3515acca22b0@postgrespro.ru> User-Agent: Roundcube Webmail/1.6.5 Message-ID: X-Sender: i.kartyshov@postgrespro.ru Content-Type: multipart/mixed; boundary="=_edf11a9b3c74638d02172718957f613c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_edf11a9b3c74638d02172718957f613c Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed Bharath Rupireddy, thank you for you review. But here is some points. On 2024-03-16 10:02, Bharath Rupireddy wrote: > 4.1 With invalid LSN succeeds, shouldn't it error out? Or at least, > add a fast path/quick exit to WaitForLSN()? > BEGIN AFTER '0/0'; In postgresql '0/0' is Valid pg_lsn, but it is always reached. > 4.2 With an unreasonably high future LSN, BEGIN command waits > unboundedly, shouldn't we check if the specified LSN is more than > pg_last_wal_receive_lsn() error out? > BEGIN AFTER '0/FFFFFFFF'; > SELECT pg_last_wal_receive_lsn() + 1 AS future_receive_lsn \gset > BEGIN AFTER :'future_receive_lsn'; This case will give ERROR cause '0/FFFFFFFF' + 1 is invalid pg_lsn > 4.3 With an unreasonably high wait time, BEGIN command waits > unboundedly, shouldn't we restrict the wait time to some max value, > say a day or so? > SELECT pg_last_wal_receive_lsn() + 1 AS future_receive_lsn \gset > BEGIN AFTER :'future_receive_lsn' WITHIN 100000; Good idea, I put it 1 day. But this limit we should to discuss. > 6. > +/* Set all latches in shared memory to signal that new LSN has been > replayed */ > +void > +WaitLSNSetLatches(XLogRecPtr curLSN) > +{ > > I see this patch is waking up all the waiters in the recovery path > after applying every WAL record, which IMO is a hot path. Is the > impact of this change on recovery measured, perhaps using > https://github.com/macdice/redo-bench or similar tools? > > 7. In continuation to comment #6, why not use Conditional Variables > instead of proc latches to sleep and wait for all the waiters in > WaitLSNSetLatches? Waiters are stored in the array sorted by LSN. This help us to wake only PIDs with replayed LSN. This saves us from scanning of whole array. So it`s not so hot path. Add some fixes 1) make waiting timeont more simple (as pg_terminate_backend()) 2) removed the 1 minute wait because INTERRUPTS don’t arrive for a long time, changed it to 0.5 seconds 3) add more tests 4) added and expanded sections in the documentation 5) add default variant of timeout pg_wait_lsn(trg_lsn pg_lsn, delay int8 DEFAULT 0) example: pg_wait_lsn('0/31B1B60') equal pg_wait_lsn('0/31B1B60', 0) 6) now big timeout will be restricted to 1 day (86400000ms) CALL pg_wait_lsn('0/34FB5A1',10000000000); WARNING: Timeout for pg_wait_lsn() restricted to 1 day -- Ivan Kartyshov Postgres Professional: www.postgrespro.com --=_edf11a9b3c74638d02172718957f613c Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v13_0001-Procedure-wait-lsn.patch Content-Disposition: attachment; filename=v13_0001-Procedure-wait-lsn.patch; size=17808 ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9mdW5jLnNnbWwgYi9kb2Mvc3JjL3NnbWwvZnVuYy5z Z21sCmluZGV4IDViMjI1Y2NmNGYuLjEwNmJjYTliNzMgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dt bC9mdW5jLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbApAQCAtMjc4NjEsNiArMjc4 NjEsMTkgQEAgcG9zdGdyZXM9IyBTRUxFQ1QgJzAvMCc6OnBnX2xzbiArIHBkLnNlZ21lbnRfbnVt YmVyICogcHMuc2V0dGluZzo6aW50ICsgOm9mZnNldAogICAgICAgICBleHRlbnNpb24uCiAgICAg ICAgPC9wYXJhPjwvZW50cnk+CiAgICAgICA8L3Jvdz4KKworICAgICAgPHJvdz4KKyAgICAgICA8 ZW50cnkgcm9sZT0iZnVuY190YWJsZV9lbnRyeSI+PHBhcmEgcm9sZT0iZnVuY19zaWduYXR1cmUi PgorICAgICAgICA8aW5kZXh0ZXJtPgorICAgICAgICAgPHByaW1hcnk+cGdfd2FpdF9sc248L3By aW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8ZnVuY3Rpb24+cGdfd2FpdF9s c248L2Z1bmN0aW9uPiAodHJnX2xzbiBwZ19sc24sIGRlbGF5IGludDggREVGQVVMVCAwKQorICAg ICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgSWYgPHBhcmFtZXRlcj50aW1lb3V0 PC9wYXJhbWV0ZXI+IDw9IDAgdGhlbiB0aW1lb3V0IGlzIG9mZi4KKyAgICAgICAgUmV0dXJucyBF UlJPUiBpZiB0YXJnZXQgPHBhcmFtZXRlcj53YWl0X2xzbjwvcGFyYW1ldGVyPiB3YXMgbm90IHJl cGxheWVkLgorICAgICAgIDwvcGFyYT48L2VudHJ5PgorICAgICAgPC9yb3c+CiAgICAgIDwvdGJv ZHk+CiAgICAgPC90Z3JvdXA+CiAgICA8L3RhYmxlPgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv YWNjZXNzL3RyYW5zYW0veGxvZ3JlY292ZXJ5LmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNh bS94bG9ncmVjb3ZlcnkuYwppbmRleCAyOWM1YmVjMDg0Li4wYjc4M2RjNzMzIDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ncmVjb3ZlcnkuYworKysgYi9zcmMvYmFj a2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ncmVjb3ZlcnkuYwpAQCAtNDMsNiArNDMsNyBAQAogI2lu Y2x1ZGUgImJhY2t1cC9iYXNlYmFja3VwLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19jb250cm9s LmgiCiAjaW5jbHVkZSAiY29tbWFuZHMvdGFibGVzcGFjZS5oIgorI2luY2x1ZGUgImNvbW1hbmRz L3dhaXRsc24uaCIKICNpbmNsdWRlICJjb21tb24vZmlsZV91dGlscy5oIgogI2luY2x1ZGUgIm1p c2NhZG1pbi5oIgogI2luY2x1ZGUgInBnc3RhdC5oIgpAQCAtMTgyOCw2ICsxODI5LDE0IEBAIFBl cmZvcm1XYWxSZWNvdmVyeSh2b2lkKQogCQkJCWJyZWFrOwogCQkJfQogCisJCQkvKgorCQkJICog SWYgd2UgcmVwbGF5ZWQgYW4gTFNOIHRoYXQgc29tZW9uZSB3YXMgd2FpdGluZyBmb3IsIHNldCBs YXRjaGVzCisJCQkgKiBpbiBzaGFyZWQgbWVtb3J5IGFycmF5IHRvIG5vdGlmeSB0aGUgd2FpdGVy LgorCQkJICovCisJCQlpZiAod2FpdExTTiAmJgorCQkJCShYTG9nUmVjb3ZlcnlDdGwtPmxhc3RS ZXBsYXllZEVuZFJlY1B0ciA+PSBwZ19hdG9taWNfcmVhZF91NjQoJndhaXRMU04tPm1pbkxTTikp KQorCQkJCVdhaXRMU05TZXRMYXRjaGVzKFhMb2dSZWNvdmVyeUN0bC0+bGFzdFJlcGxheWVkRW5k UmVjUHRyKTsKKwogCQkJLyogRWxzZSwgdHJ5IHRvIGZldGNoIHRoZSBuZXh0IFdBTCByZWNvcmQg Ki8KIAkJCXJlY29yZCA9IFJlYWRSZWNvcmQoeGxvZ3ByZWZldGNoZXIsIExPRywgZmFsc2UsIHJl cGxheVRMSSk7CiAJCX0gd2hpbGUgKHJlY29yZCAhPSBOVUxMKTsKZGlmZiAtLWdpdCBhL3NyYy9i YWNrZW5kL2NhdGFsb2cvc3lzdGVtX2Z1bmN0aW9ucy5zcWwgYi9zcmMvYmFja2VuZC9jYXRhbG9n L3N5c3RlbV9mdW5jdGlvbnMuc3FsCmluZGV4IGZlMmJiNTBmNDYuLmZmODJkZmZhYzAgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvc3lzdGVtX2Z1bmN0aW9ucy5zcWwKKysrIGIvc3Jj L2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fZnVuY3Rpb25zLnNxbApAQCAtNDE0LDYgKzQxNCw5IEBA IENSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OCiAgIGpzb25fcG9wdWxhdGVfcmVjb3Jkc2V0KGJh c2UgYW55ZWxlbWVudCwgZnJvbV9qc29uIGpzb24sIHVzZV9qc29uX2FzX3RleHQgYm9vbGVhbiBE RUZBVUxUIGZhbHNlKQogICBSRVRVUk5TIFNFVE9GIGFueWVsZW1lbnQgTEFOR1VBR0UgaW50ZXJu YWwgU1RBQkxFIFJPV1MgMTAwICBBUyAnanNvbl9wb3B1bGF0ZV9yZWNvcmRzZXQnIFBBUkFMTEVM IFNBRkU7CiAKK0NSRUFURSBPUiBSRVBMQUNFIFBST0NFRFVSRSBwZ193YWl0X2xzbih0cmdfbHNu IHBnX2xzbiwgZGVsYXkgaW50OCBERUZBVUxUIDApCisgIExBTkdVQUdFIGludGVybmFsIEFTICdw Z193YWl0X2xzbic7CisKIENSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIHBnX2xvZ2ljYWxfc2xv dF9nZXRfY2hhbmdlcygKICAgICBJTiBzbG90X25hbWUgbmFtZSwgSU4gdXB0b19sc24gcGdfbHNu LCBJTiB1cHRvX25jaGFuZ2VzIGludCwgVkFSSUFESUMgb3B0aW9ucyB0ZXh0W10gREVGQVVMVCAn e30nLAogICAgIE9VVCBsc24gcGdfbHNuLCBPVVQgeGlkIHhpZCwgT1VUIGRhdGEgdGV4dCkKZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL01ha2VmaWxlIGIvc3JjL2JhY2tlbmQvY29t bWFuZHMvTWFrZWZpbGUKaW5kZXggNDhmNzM0OGY5MS4uY2VkZTkwYzNiOSAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvY29tbWFuZHMvTWFrZWZpbGUKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMv TWFrZWZpbGUKQEAgLTYxLDYgKzYxLDcgQEAgT0JKUyA9IFwKIAl2YWN1dW0ubyBcCiAJdmFjdXVt cGFyYWxsZWwubyBcCiAJdmFyaWFibGUubyBcCi0Jdmlldy5vCisJdmlldy5vIFwKKwl3YWl0bHNu Lm8KIAogaW5jbHVkZSAkKHRvcF9zcmNkaXIpL3NyYy9iYWNrZW5kL2NvbW1vbi5tawpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvbWVzb24uYnVpbGQgYi9zcmMvYmFja2VuZC9jb21t YW5kcy9tZXNvbi5idWlsZAppbmRleCA2ZGQwMGE0YWJkLi43NTQ5YmU1ZGMzIDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9jb21tYW5kcy9tZXNvbi5idWlsZAorKysgYi9zcmMvYmFja2VuZC9jb21t YW5kcy9tZXNvbi5idWlsZApAQCAtNTAsNCArNTAsNSBAQCBiYWNrZW5kX3NvdXJjZXMgKz0gZmls ZXMoCiAgICd2YWN1dW1wYXJhbGxlbC5jJywKICAgJ3ZhcmlhYmxlLmMnLAogICAndmlldy5jJywK KyAgJ3dhaXRsc24uYycsCiApCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy93YWl0 bHNuLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy93YWl0bHNuLmMKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKaW5kZXggMDAwMDAwMDAwMC4uYjA3ZDc1NmY3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9i YWNrZW5kL2NvbW1hbmRzL3dhaXRsc24uYwpAQCAtMCwwICsxLDMxMyBAQAorLyotLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgKgorICogd2FpdGxzbi5jCisgKgkgIEltcGxlbWVudHMgd2FpdGluZyBmb3IgdGhl IGdpdmVuIExTTiwgd2hpY2ggaXMgdXNlZCBpbgorICoJICBDQUxMIHBnX3dhaXRfbHNuKHdhaXRf bHNuIHBnX2xzbiwgdGltZW91dCBpbnQpLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAyNCwgUG9z dGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqCisgKiBJREVOVElGSUNBVElPTgor ICoJICBzcmMvYmFja2VuZC9jb21tYW5kcy93YWl0bHNuLmMKKyAqCisgKi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyAqLworCisjaW5jbHVkZSAicG9zdGdyZXMuaCIKKworI2luY2x1ZGUgPGZsb2F0Lmg+Cisj aW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAicGdzdGF0LmgiCisjaW5jbHVkZSAiZm1nci5o IgorI2luY2x1ZGUgImFjY2Vzcy90cmFuc2FtLmgiCisjaW5jbHVkZSAiYWNjZXNzL3hhY3QuaCIK KyNpbmNsdWRlICJhY2Nlc3MveGxvZy5oIgorI2luY2x1ZGUgImFjY2Vzcy94bG9nZGVmcy5oIgor I2luY2x1ZGUgImFjY2Vzcy94bG9ncmVjb3ZlcnkuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX3R5 cGUuaCIKKyNpbmNsdWRlICJjb21tYW5kcy93YWl0bHNuLmgiCisjaW5jbHVkZSAiZXhlY3V0b3Iv c3BpLmgiCisjaW5jbHVkZSAiZnVuY2FwaS5oIgorI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgorI2lu Y2x1ZGUgInN0b3JhZ2UvaXBjLmgiCisjaW5jbHVkZSAic3RvcmFnZS9sYXRjaC5oIgorI2luY2x1 ZGUgInN0b3JhZ2UvcG1zaWduYWwuaCIKKyNpbmNsdWRlICJzdG9yYWdlL3Byb2MuaCIKKyNpbmNs dWRlICJzdG9yYWdlL3NobWVtLmgiCisjaW5jbHVkZSAic3RvcmFnZS9zaW52YWxhZHQuaCIKKyNp bmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUgInV0aWxzL3BnX2xzbi5oIgorI2lu Y2x1ZGUgInV0aWxzL3NuYXBtZ3IuaCIKKyNpbmNsdWRlICJ1dGlscy90aW1lc3RhbXAuaCIKKyNp bmNsdWRlICJ1dGlscy9mbWdycHJvdG9zLmgiCisKKy8qIEFkZCB0byAvIGRlbGV0ZSBmcm9tIHNo YXJlZCBtZW1vcnkgYXJyYXkgKi8KK3N0YXRpYyB2b2lkIGFkZExTTldhaXRlcihYTG9nUmVjUHRy IGxzbik7CitzdGF0aWMgdm9pZCBkZWxldGVMU05XYWl0ZXIodm9pZCk7CisKK3N0cnVjdCBXYWl0 TFNOU3RhdGUgKndhaXRMU04gPSBOVUxMOworc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBo YXZlU2htZW1JdGVtID0gZmFsc2U7CisKKy8qCisgKiBSZXBvcnQgdGhlIGFtb3VudCBvZiBzaGFy ZWQgbWVtb3J5IHNwYWNlIG5lZWRlZCBmb3IgV2FpdExTTlN0YXRlCisgKi8KK1NpemUKK1dhaXRM U05TaG1lbVNpemUodm9pZCkKK3sKKwlTaXplCQlzaXplOworCisJc2l6ZSA9IG9mZnNldG9mKFdh aXRMU05TdGF0ZSwgcHJvY0luZm9zKTsKKwlzaXplID0gYWRkX3NpemUoc2l6ZSwgbXVsX3NpemUo TWF4QmFja2VuZHMsIHNpemVvZihXYWl0TFNOUHJvY0luZm8pKSk7CisJcmV0dXJuIHNpemU7Cit9 CisKKy8qIEluaXRpYWxpemUgdGhlIFdhaXRMU05TdGF0ZSBpbiB0aGUgc2hhcmVkIG1lbW9yeSAq Lwordm9pZAorV2FpdExTTlNobWVtSW5pdCh2b2lkKQoreworCWJvb2wJCWZvdW5kOworCisJd2Fp dExTTiA9IChXYWl0TFNOU3RhdGUgKikgU2htZW1Jbml0U3RydWN0KCJXYWl0TFNOU3RhdGUiLAor CQkJCQkJCQkJCQkgICBXYWl0TFNOU2htZW1TaXplKCksCisJCQkJCQkJCQkJCSAgICZmb3VuZCk7 CisJaWYgKCFmb3VuZCkKKwl7CisJCVNwaW5Mb2NrSW5pdCgmd2FpdExTTi0+bXV0ZXgpOworCQl3 YWl0TFNOLT5udW1XYWl0ZWRQcm9jcyA9IDA7CisJCXBnX2F0b21pY19pbml0X3U2NCgmd2FpdExT Ti0+bWluTFNOLCBQR19VSU5UNjRfTUFYKTsKKwl9Cit9CisKKy8qCisgKiBBZGQgdGhlIGluZm9y bWF0aW9uIGFib3V0IHRoZSBMU04gd2FpdGVyIGJhY2tlbmQgdG8gdGhlIHNoYXJlZCBtZW1vcnkK KyAqIGFycmF5LgorICovCitzdGF0aWMgdm9pZAorYWRkTFNOV2FpdGVyKFhMb2dSZWNQdHIgbHNu KQoreworCVdhaXRMU05Qcm9jSW5mbyBjdXI7CisJaW50CQkJaTsKKworCVNwaW5Mb2NrQWNxdWly ZSgmd2FpdExTTi0+bXV0ZXgpOworCisJY3VyLnByb2NudW0gPSBNeVByb2NOdW1iZXI7CisJY3Vy LndhaXRMU04gPSBsc247CisKKwlmb3IgKGkgPSAwOyBpIDwgd2FpdExTTi0+bnVtV2FpdGVkUHJv Y3M7IGkrKykKKwl7CisJCWlmICh3YWl0TFNOLT5wcm9jSW5mb3NbaV0ud2FpdExTTiA+PSBjdXIu d2FpdExTTikKKwkJeworCQkJV2FpdExTTlByb2NJbmZvIHRtcDsKKworCQkJdG1wID0gd2FpdExT Ti0+cHJvY0luZm9zW2ldOworCQkJd2FpdExTTi0+cHJvY0luZm9zW2ldID0gY3VyOworCQkJY3Vy ID0gdG1wOworCQl9CisJfQorCXdhaXRMU04tPnByb2NJbmZvc1tpXSA9IGN1cjsKKwl3YWl0TFNO LT5udW1XYWl0ZWRQcm9jcysrOworCisJcGdfYXRvbWljX3dyaXRlX3U2NCgmd2FpdExTTi0+bWlu TFNOLCB3YWl0TFNOLT5wcm9jSW5mb3NbaV0ud2FpdExTTik7CisJU3BpbkxvY2tSZWxlYXNlKCZ3 YWl0TFNOLT5tdXRleCk7Cit9CisKKy8qCisgKiBEZWxldGUgdGhlIGluZm9ybWF0aW9uIGFib3V0 IHRoZSBMU04gd2FpdGVyIGJhY2tlbmQgZnJvbSB0aGUgc2hhcmVkIG1lbW9yeQorICogYXJyYXku CisgKi8KK3N0YXRpYyB2b2lkCitkZWxldGVMU05XYWl0ZXIodm9pZCkKK3sKKwlpbnQJCQlpOwor CWJvb2wJCWZvdW5kID0gZmFsc2U7CisKKwlTcGluTG9ja0FjcXVpcmUoJndhaXRMU04tPm11dGV4 KTsKKworCWZvciAoaSA9IDA7IGkgPCB3YWl0TFNOLT5udW1XYWl0ZWRQcm9jczsgaSsrKQorCXsK KwkJaWYgKHdhaXRMU04tPnByb2NJbmZvc1tpXS5wcm9jbnVtID09IE15UHJvY051bWJlcikKKwkJ CWZvdW5kID0gdHJ1ZTsKKworCQlpZiAoZm91bmQgJiYgaSA8IHdhaXRMU04tPm51bVdhaXRlZFBy b2NzIC0gMSkKKwkJeworCQkJd2FpdExTTi0+cHJvY0luZm9zW2ldID0gd2FpdExTTi0+cHJvY0lu Zm9zW2kgKyAxXTsKKwkJfQorCX0KKworCWlmICghZm91bmQpCisJeworCQlTcGluTG9ja1JlbGVh c2UoJndhaXRMU04tPm11dGV4KTsKKwkJcmV0dXJuOworCX0KKwl3YWl0TFNOLT5udW1XYWl0ZWRQ cm9jcy0tOworCisJaWYgKHdhaXRMU04tPm51bVdhaXRlZFByb2NzICE9IDApCisJCXBnX2F0b21p Y193cml0ZV91NjQoJndhaXRMU04tPm1pbkxTTiwgd2FpdExTTi0+cHJvY0luZm9zW2ldLndhaXRM U04pOworCWVsc2UKKwkJcGdfYXRvbWljX3dyaXRlX3U2NCgmd2FpdExTTi0+bWluTFNOLCBQR19V SU5UNjRfTUFYKTsKKworCVNwaW5Mb2NrUmVsZWFzZSgmd2FpdExTTi0+bXV0ZXgpOworfQorCisv KgorICogU2V0IGFsbCBsYXRjaGVzIGluIHNoYXJlZCBtZW1vcnkgdG8gc2lnbmFsIHRoYXQgbmV3 IExTTiBoYXMgYmVlbiByZXBsYXllZAorKi8KK3ZvaWQKK1dhaXRMU05TZXRMYXRjaGVzKFhMb2dS ZWNQdHIgY3VyTFNOKQoreworCXVpbnQzMgkJaSwKKwkJCQludW1XYWtlVXBQcm9jczsKKworCVNw aW5Mb2NrQWNxdWlyZSgmd2FpdExTTi0+bXV0ZXgpOworCisJLyoKKwkgKiBTZXQgbGF0Y2hlcyBm b3IgcHJvY2Vzcywgd2hvc2Ugd2FpdGVkIExTTnMgYXJlIGFscmVhZHkgcmVwbGF5ZWQuCisJICov CisJZm9yIChpID0gMDsgaSA8IHdhaXRMU04tPm51bVdhaXRlZFByb2NzOyBpKyspCisJeworCQlQ R1BST0MJICAgKmJhY2tlbmQ7CisKKwkJaWYgKHdhaXRMU04tPnByb2NJbmZvc1tpXS53YWl0TFNO ID4gY3VyTFNOKQorCQkJYnJlYWs7CisKKwkJYmFja2VuZCA9IEdldFBHUHJvY0J5TnVtYmVyKHdh aXRMU04tPnByb2NJbmZvc1tpXS5wcm9jbnVtKTsKKwkJU2V0TGF0Y2goJmJhY2tlbmQtPnByb2NM YXRjaCk7CisJfQorCisJLyoKKwkgKiBJbW1lZGlhdGVseSByZW1vdmUgdGhvc2UgcHJvY2Vzc2Vz IGZyb20gdGhlIHNobWVtIGFycmF5LiAgT3RoZXJ3aXNlLAorCSAqIHNobWVtIGFycmF5IGl0ZW1z IHdpbGwgYmUgaGVyZSB0aWxsIGNvcnJlc3BvbmRpbmcgcHJvY2Vzc2VzIHdha2UgdXAgYW5kCisJ ICogZGVsZXRlIHRoZW1zZWx2ZXMuCisJICovCisJbnVtV2FrZVVwUHJvY3MgPSBpOworCWZvciAo aSA9IDA7IGkgPCB3YWl0TFNOLT5udW1XYWl0ZWRQcm9jcyAtIG51bVdha2VVcFByb2NzOyBpKysp CisJCXdhaXRMU04tPnByb2NJbmZvc1tpXSA9IHdhaXRMU04tPnByb2NJbmZvc1tpICsgbnVtV2Fr ZVVwUHJvY3NdOworCXdhaXRMU04tPm51bVdhaXRlZFByb2NzIC09IG51bVdha2VVcFByb2NzOwor CisJaWYgKHdhaXRMU04tPm51bVdhaXRlZFByb2NzICE9IDApCisJCXBnX2F0b21pY193cml0ZV91 NjQoJndhaXRMU04tPm1pbkxTTiwgd2FpdExTTi0+cHJvY0luZm9zW2ldLndhaXRMU04pOworCWVs c2UKKwkJcGdfYXRvbWljX3dyaXRlX3U2NCgmd2FpdExTTi0+bWluTFNOLCBQR19VSU5UNjRfTUFY KTsKKworCVNwaW5Mb2NrUmVsZWFzZSgmd2FpdExTTi0+bXV0ZXgpOworfQorCisvKgorICogRGVs ZXRlIG91ciBpdGVtIGZyb20gc2htZW0gYXJyYXkgaWYgYW55LgorICovCit2b2lkCitXYWl0TFNO Q2xlYW51cCh2b2lkKQoreworCWlmIChoYXZlU2htZW1JdGVtKQorCQlkZWxldGVMU05XYWl0ZXIo KTsKK30KKworLyoKKyAqIFdhaXQgdXNpbmcgTXlMYXRjaCB0byB3YWl0IHRpbGwgdGhlIGdpdmVu IExTTiBpcyByZXBsYXllZCwgdGhlIHBvc3RtYXN0ZXIgZGllcyBvcgorICogdGltZW91dCBoYXBw ZW5zLgorICovCit2b2lkCitXYWl0Rm9yTFNOKFhMb2dSZWNQdHIgbHNuLCB1aW50NjQgbWlsbGlz ZWNzKQoreworCVhMb2dSZWNQdHIJY3VyTFNOOworCWludAkJCWxhdGNoX2V2ZW50czsKKwlpbnQ2 NAkJd2FpdHRpbWUgPSA1MDA7CisJaW50NjQJCXJlbWFpbmluZ3RpbWU7CisKKwkvKiBTaG91bGRu J3QgYmUgY2FsbGVkIHdoZW4gc2htZW0gaXNuJ3QgaW5pdGlhbGl6ZWQgKi8KKwlBc3NlcnQod2Fp dExTTik7CisKKwkvKiBTaG91bGQgYmUgb25seSBjYWxsZWQgYnkgYSBiYWNrZW5kICovCisJQXNz ZXJ0KE15QmFja2VuZFR5cGUgPT0gQl9CQUNLRU5EKTsKKworCWlmICghUmVjb3ZlcnlJblByb2dy ZXNzKCkpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9PQkpFQ1RfTk9U X0lOX1BSRVJFUVVJU0lURV9TVEFURSksCisJCQkJIGVycm1zZygicmVjb3ZlcnkgaXMgbm90IGlu IHByb2dyZXNzIiksCisJCQkJIGVycmhpbnQoIldhaXRpbmcgZm9yIExTTiBjYW4gb25seSBiZSBl eGVjdXRlZCBkdXJpbmcgcmVjb3ZlcnkuIikpKTsKKworCS8qIEJoYXJhdCBSdXBpcmVkZHkgc3Vn Z2VzdGVkIGxpbWl0aW5nIHRpbWUtb3V0IHRvIG9uZSBkYXkgKi8KKwlpZiAobWlsbGlzZWNzID4g ODY0MDAwMDApCisJeworCQltaWxsaXNlY3MgPSA4NjQwMDAwMDsKKwkJZWxvZyhXQVJOSU5HLCJU aW1lb3V0IGZvciBwZ193YWl0X2xzbigpIHJlc3RyaWN0ZWQgdG8gMSBkYXkiKTsKKwl9CisKKwly ZW1haW5pbmd0aW1lID0gbWlsbGlzZWNzOworCisJbGF0Y2hfZXZlbnRzID0gV0xfVElNRU9VVCB8 IFdMX0xBVENIX1NFVCB8IFdMX0VYSVRfT05fUE1fREVBVEg7CisJYWRkTFNOV2FpdGVyKGxzbik7 CisJaGF2ZVNobWVtSXRlbSA9IHRydWU7CisKKwlmb3IgKDs7KQorCXsKKwkJaW50CQkJcmM7CisK KwkJLyogQ2hlY2sgaWYgdGhlIHdhaXRlZCBMU04gaGFzIGJlZW4gcmVwbGF5ZWQgKi8KKwkJY3Vy TFNOID0gR2V0WExvZ1JlcGxheVJlY1B0cihOVUxMKTsKKwkJaWYgKGxzbiA8PSBjdXJMU04pCisJ CQlicmVhazsKKworCQkvKiBJZiBubyB0aW1lb3V0IGlzIHNldCB0aGVuIHdha2UgdXAgaW4gMSBt aW51dGUgZm9yIGludGVycnVwdHMgKi8KKwkJaWYgKG1pbGxpc2VjcyA8PSAwKQorCQkJcmVtYWlu aW5ndGltZSA9IDYwMDAwOworCisJCWlmIChyZW1haW5pbmd0aW1lIDwgd2FpdHRpbWUpCisJCQl3 YWl0dGltZSA9IHJlbWFpbmluZ3RpbWU7CisKKwkJaWYgKHdhaXR0aW1lIDw9IDApCisJCQlicmVh azsKKworCQkvKgorCQkgKiBJZiByZWNlaXZlZCBhbiBpbnRlcnJ1cHRpb24gZnJvbSBDSEVDS19G T1JfSU5URVJSVVBUUywgdGhlbiBkZWxldGUKKwkJICogdGhlIGN1cnJlbnQgZXZlbnQgZnJvbSBh cnJheS4KKwkJICovCisJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CisKKwkJLyogSWYgcG9zdG1h c3RlciBkaWVzLCBmaW5pc2ggaW1tZWRpYXRlbHkgKi8KKwkJaWYgKCFQb3N0bWFzdGVySXNBbGl2 ZSgpKQorCQkJYnJlYWs7CisKKwkJcmMgPSBXYWl0TGF0Y2goTXlMYXRjaCwgbGF0Y2hfZXZlbnRz LCB3YWl0dGltZSwKKwkJCQkJICAgV0FJVF9FVkVOVF9XQUlUX0ZPUl9TVEFOREJZX0NPTkZJUk1B VElPTik7CisKKwkJaWYgKHJjICYgV0xfTEFUQ0hfU0VUKQorCQkJUmVzZXRMYXRjaChNeUxhdGNo KTsKKworCQlyZW1haW5pbmd0aW1lIC09IHdhaXR0aW1lOworCX0KKworCWlmIChsc24gPiBjdXJM U04pCisJeworCQlkZWxldGVMU05XYWl0ZXIoKTsKKwkJaGF2ZVNobWVtSXRlbSA9IGZhbHNlOwor CQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfUVVFUllfQ0FOQ0VMRUQpLAor CQkJCSBlcnJtc2coImNhbmNlbGluZyB3YWl0aW5nIGZvciBMU04gZHVlIHRvIHRpbWVvdXQiKSkp OworCX0KKwllbHNlCisJeworCQloYXZlU2htZW1JdGVtID0gZmFsc2U7CisJfQorfQorCitEYXR1 bQorcGdfd2FpdF9sc24oUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlYTG9nUmVjUHRyCXRyZ19sc24g PSBQR19HRVRBUkdfTFNOKDApOworCXVpbnQ2NF90CWRlbGF5ID0gUEdfR0VUQVJHX0lOVDMyKDEp OworCUNhbGxDb250ZXh0ICpjb250ZXh0ID0gKENhbGxDb250ZXh0ICopIGZjaW5mby0+Y29udGV4 dDsKKworCWlmIChjb250ZXh0LT5hdG9taWMpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNv ZGUoRVJSQ09ERV9PQkpFQ1RfTk9UX0lOX1BSRVJFUVVJU0lURV9TVEFURSksCisJCQkJIGVycm1z ZygicGdfd2FpdF9sc24oKSBtdXN0IGJlIG9ubHkgY2FsbGVkIGluIG5vbi1hdG9taWMgY29udGV4 dCIpKSk7CisKKwlpZiAoQWN0aXZlU25hcHNob3RTZXQoKSkKKwkJUG9wQWN0aXZlU25hcHNob3Qo KTsKKwlBc3NlcnQoIUFjdGl2ZVNuYXBzaG90U2V0KCkpOworCisJKHZvaWQpIFdhaXRGb3JMU04o dHJnX2xzbiwgZGVsYXkpOworCisJUEdfUkVUVVJOX1ZPSUQoKTsKK30KZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lwY2kuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lw Y2kuYwppbmRleCA1MjFlZDU0MThjLi41YWVkOTBjOTM1IDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9zdG9yYWdlL2lwYy9pcGNpLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvaXBjaS5j CkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAiYWNjZXNzL3hsb2dwcmVmZXRjaGVyLmgiCiAj aW5jbHVkZSAiYWNjZXNzL3hsb2dyZWNvdmVyeS5oIgogI2luY2x1ZGUgImNvbW1hbmRzL2FzeW5j LmgiCisjaW5jbHVkZSAiY29tbWFuZHMvd2FpdGxzbi5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5o IgogI2luY2x1ZGUgInBnc3RhdC5oIgogI2luY2x1ZGUgInBvc3RtYXN0ZXIvYXV0b3ZhY3V1bS5o IgpAQCAtMTUyLDYgKzE1Myw3IEBAIENhbGN1bGF0ZVNobWVtU2l6ZShpbnQgKm51bV9zZW1hcGhv cmVzKQogCXNpemUgPSBhZGRfc2l6ZShzaXplLCBXYWl0RXZlbnRFeHRlbnNpb25TaG1lbVNpemUo KSk7CiAJc2l6ZSA9IGFkZF9zaXplKHNpemUsIEluamVjdGlvblBvaW50U2htZW1TaXplKCkpOwog CXNpemUgPSBhZGRfc2l6ZShzaXplLCBTbG90U3luY1NobWVtU2l6ZSgpKTsKKwlzaXplID0gYWRk X3NpemUoc2l6ZSwgV2FpdExTTlNobWVtU2l6ZSgpKTsKICNpZmRlZiBFWEVDX0JBQ0tFTkQKIAlz aXplID0gYWRkX3NpemUoc2l6ZSwgU2htZW1CYWNrZW5kQXJyYXlTaXplKCkpOwogI2VuZGlmCkBA IC0yNDQsNiArMjQ2LDExIEBAIENyZWF0ZVNoYXJlZE1lbW9yeUFuZFNlbWFwaG9yZXModm9pZCkK IAkvKiBJbml0aWFsaXplIHN1YnN5c3RlbXMgKi8KIAlDcmVhdGVPckF0dGFjaFNobWVtU3RydWN0 cygpOwogCisJLyoKKwkgKiBJbml0IGFycmF5IG9mIExhdGNoZXMgaW4gc2hhcmVkIG1lbW9yeSBm b3Igd2FpdCBsc24KKwkgKi8KKwlXYWl0TFNOU2htZW1Jbml0KCk7CisKICNpZmRlZiBFWEVDX0JB Q0tFTkQKIAogCS8qCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvcHJvYy5j IGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9sbWdyL3Byb2MuYwppbmRleCAxNjJiMWY5MTlkLi40Yjgz MGRjM2M4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2xtZ3IvcHJvYy5jCisrKyBi L3NyYy9iYWNrZW5kL3N0b3JhZ2UvbG1nci9wcm9jLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNs dWRlICJhY2Nlc3MvdHJhbnNhbS5oIgogI2luY2x1ZGUgImFjY2Vzcy90d29waGFzZS5oIgogI2lu Y2x1ZGUgImFjY2Vzcy94bG9ndXRpbHMuaCIKKyNpbmNsdWRlICJjb21tYW5kcy93YWl0bHNuLmgi CiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAicGdzdGF0LmgiCiAjaW5jbHVkZSAi cG9zdG1hc3Rlci9hdXRvdmFjdXVtLmgiCkBAIC04NjIsNiArODYzLDExIEBAIFByb2NLaWxsKGlu dCBjb2RlLCBEYXR1bSBhcmcpCiAJICovCiAJTFdMb2NrUmVsZWFzZUFsbCgpOwogCisJLyoKKwkg KiBDbGVhbnVwIHdhaXRpbmcgZm9yIExTTiBpZiBhbnkuCisJICovCisJV2FpdExTTkNsZWFudXAo KTsKKwogCS8qIENhbmNlbCBhbnkgcGVuZGluZyBjb25kaXRpb24gdmFyaWFibGUgc2xlZXAsIHRv byAqLwogCUNvbmRpdGlvblZhcmlhYmxlQ2FuY2VsU2xlZXAoKTsKIApkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJv Yy5kYXQKaW5kZXggMTc3ZDgxYTg5MS4uMjEyMjJiZjE4YyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1 ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2Mu ZGF0CkBAIC0xMjEzNSw2ICsxMjEzNSwxMSBAQAogICBwcm9yZXR0eXBlID0+ICdieXRlYScsIHBy b2FyZ3R5cGVzID0+ICdwZ19icmluX21pbm1heF9tdWx0aV9zdW1tYXJ5JywKICAgcHJvc3JjID0+ ICdicmluX21pbm1heF9tdWx0aV9zdW1tYXJ5X3NlbmQnIH0sCiAKK3sgb2lkID0+ICcxNjM4Nycs IGRlc2NyID0+ICd3YWl0IGZvciBMU04gdW50aWwgdGltZW91dCcsCisgIHByb25hbWUgPT4gJ3Bn X3dhaXRfbHNuJywgcHJva2luZCA9PiAncCcsIHByb3JldHR5cGUgPT4gJ3ZvaWQnLAorICBwcm9h cmd0eXBlcyA9PiAncGdfbHNuIGludDgnLCBwcm9hcmduYW1lcyA9PiAne3RyZ19sc24sZGVsYXl9 JywKKyAgcHJvc3JjID0+ICdwZ193YWl0X2xzbicgfSwKKwogeyBvaWQgPT4gJzYyOTEnLCBkZXNj ciA9PiAnYXJiaXRyYXJ5IHZhbHVlIGZyb20gYW1vbmcgaW5wdXQgdmFsdWVzJywKICAgcHJvbmFt ZSA9PiAnYW55X3ZhbHVlJywgcHJva2luZCA9PiAnYScsIHByb2lzc3RyaWN0ID0+ICdmJywKICAg cHJvcmV0dHlwZSA9PiAnYW55ZWxlbWVudCcsIHByb2FyZ3R5cGVzID0+ICdhbnllbGVtZW50JywK ZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NvbW1hbmRzL3dhaXRsc24uaCBiL3NyYy9pbmNsdWRl L2NvbW1hbmRzL3dhaXRsc24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw Li4xOTJlNDM0ZDg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvd2Fp dGxzbi5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIHdhaXRs c24uaAorICoJICBEZWNsYXJhdGlvbnMgZm9yIExTTiB3YWl0aW5nIHJvdXRpbmVzLgorICoKKyAq IENvcHlyaWdodCAoYykgMjAyNCwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAK KyAqCisgKiBzcmMvaW5jbHVkZS9jb21tYW5kcy93YWl0bHNuLmgKKyAqCisgKi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyAqLworI2lmbmRlZiBXQUlUX0xTTl9ICisjZGVmaW5lIFdBSVRfTFNOX0gKKworI2lu Y2x1ZGUgInBvc3RncmVzLmgiCisjaW5jbHVkZSAicG9ydC9hdG9taWNzLmgiCisjaW5jbHVkZSAi c3RvcmFnZS9zcGluLmgiCisjaW5jbHVkZSAidGNvcC9kZXN0LmgiCisKKy8qIFNoYXJlZCBtZW1v cnkgc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBXYWl0TFNOUHJvY0luZm8KK3sKKwlpbnQJ CQlwcm9jbnVtOworCVhMb2dSZWNQdHIJd2FpdExTTjsKK30JCQlXYWl0TFNOUHJvY0luZm87CisK K3R5cGVkZWYgc3RydWN0IFdhaXRMU05TdGF0ZQoreworCXBnX2F0b21pY191aW50NjQgbWluTFNO OworCXNsb2NrX3QJCW11dGV4OworCWludAkJCW51bVdhaXRlZFByb2NzOworCVdhaXRMU05Qcm9j SW5mbyBwcm9jSW5mb3NbRkxFWElCTEVfQVJSQVlfTUVNQkVSXTsKK30JCQlXYWl0TFNOU3RhdGU7 CisKK2V4dGVybiBQR0RMTElNUE9SVCBzdHJ1Y3QgV2FpdExTTlN0YXRlICp3YWl0TFNOOworCitl eHRlcm4gdm9pZCBXYWl0Rm9yTFNOKFhMb2dSZWNQdHIgbHNuLCB1aW50NjQgbWlsbGlzZWNzKTsK K2V4dGVybiBTaXplIFdhaXRMU05TaG1lbVNpemUodm9pZCk7CitleHRlcm4gdm9pZCBXYWl0TFNO U2htZW1Jbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgV2FpdExTTlNldExhdGNoZXMoWExvZ1JlY1B0 ciBjdXJMU04pOworZXh0ZXJuIHZvaWQgV2FpdExTTkNsZWFudXAodm9pZCk7CisKKyNlbmRpZgkJ CQkJCQkvKiBXQUlUX0xTTl9IICovCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWNvdmVyeS9tZXNv bi5idWlsZCBiL3NyYy90ZXN0L3JlY292ZXJ5L21lc29uLmJ1aWxkCmluZGV4IGIxZWI3N2IxZWMu LmJjNDdjOTM5MDIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlY292ZXJ5L21lc29uLmJ1aWxkCisr KyBiL3NyYy90ZXN0L3JlY292ZXJ5L21lc29uLmJ1aWxkCkBAIC01MSw2ICs1MSw3IEBAIHRlc3Rz ICs9IHsKICAgICAgICd0LzA0MF9zdGFuZGJ5X2ZhaWxvdmVyX3Nsb3RzX3N5bmMucGwnLAogICAg ICAgJ3QvMDQxX2NoZWNrcG9pbnRfYXRfcHJvbW90ZS5wbCcsCiAgICAgICAndC8wNDJfbG93X2xl dmVsX2JhY2t1cC5wbCcsCisgICAgICAndC8wNDNfd2FpdF9sc24ucGwnLAogICAgIF0sCiAgIH0s CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWNvdmVyeS90LzA0M193YWl0X2xzbi5wbCBiL3Ny Yy90ZXN0L3JlY292ZXJ5L3QvMDQzX3dhaXRfbHNuLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAuLjcxMTAxNTk3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9y ZWNvdmVyeS90LzA0M193YWl0X2xzbi5wbApAQCAtMCwwICsxLDc3IEBACisjIENoZWNrcyB3YWl0 aW5nIGZvciBsc24gb24gc3RhbmRieSBwZ193YWl0X2xzbigpCit1c2Ugc3RyaWN0OwordXNlIHdh cm5pbmdzOworCit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3RlcjsKK3VzZSBQb3N0Z3JlU1FM OjpUZXN0OjpVdGlsczsKK3VzZSBUZXN0OjpNb3JlOworCisjIEluaXRpYWxpemUgcHJpbWFyeSBu b2RlCitteSAkbm9kZV9wcmltYXJ5ID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCdw cmltYXJ5Jyk7Ciskbm9kZV9wcmltYXJ5LT5pbml0KGFsbG93c19zdHJlYW1pbmcgPT4gMSk7Cisk bm9kZV9wcmltYXJ5LT5zdGFydDsKKworIyBBbmQgc29tZSBjb250ZW50IGFuZCB0YWtlIGEgYmFj a3VwCiskbm9kZV9wcmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkiQ1JFQVRFIFRBQkxF IHdhaXRfdGVzdCBBUyBTRUxFQ1QgZ2VuZXJhdGVfc2VyaWVzKDEsMTApIEFTIGEiKTsKK215ICRi YWNrdXBfbmFtZSA9ICdteV9iYWNrdXAnOworJG5vZGVfcHJpbWFyeS0+YmFja3VwKCRiYWNrdXBf bmFtZSk7CisKKyMgQ3JlYXRlIGEgc3RyZWFtaW5nIHN0YW5kYnkgd2l0aCBhIDEgc2Vjb25kIGRl bGF5IGZyb20gdGhlIGJhY2t1cAorbXkgJG5vZGVfc3RhbmRieSA9IFBvc3RncmVTUUw6OlRlc3Q6 OkNsdXN0ZXItPm5ldygnc3RhbmRieScpOworbXkgJGRlbGF5ID0gMTsKKyRub2RlX3N0YW5kYnkt PmluaXRfZnJvbV9iYWNrdXAoJG5vZGVfcHJpbWFyeSwgJGJhY2t1cF9uYW1lLAorCWhhc19zdHJl YW1pbmcgPT4gMSk7Ciskbm9kZV9zdGFuZGJ5LT5hcHBlbmRfY29uZigKKwkncG9zdGdyZXNxbC5j b25mJywgcXFbCisJcmVjb3ZlcnlfbWluX2FwcGx5X2RlbGF5ID0gJyR7ZGVsYXl9cycKK10pOwor JG5vZGVfc3RhbmRieS0+c3RhcnQ7CisKKworIyBNYWtlIHN1cmUgdGhhdCBwZ193YWl0X2xzbigp IHdvcmtzOiBhZGQgbmV3IGNvbnRlbnQgdG8gcHJpbWFyeSBhbmQgbWVtb3JpemUKKyMgcHJpbWFy eSdzIG5ldyBMU04sIHRoZW4gd2FpdCBmb3IgcHJpbWFyeSdzIExTTiBvbiBzdGFuZGJ5LiBQcm92 ZSB0aGF0IHBnX3dhaXRfbHNuKCkgaXMKKyMgYWJsZSB0byBzZXR1cCBhbiBpbmZpbml0ZSB3YWl0 aW5nIGxvb3AgYW5kIGV4aXQgaXQgaWYgZ2l2ZW4gbm8gd2FpdCB0aW1lb3V0LgorJG5vZGVfcHJp bWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJIklOU0VSVCBJTlRPIHdhaXRfdGVzdCBWQUxV RVMgKGdlbmVyYXRlX3NlcmllcygxMSwgMjApKSIpOworbXkgJGxzbjEgPQorICAkbm9kZV9wcmlt YXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIlNFTEVDVCBwZ19jdXJyZW50X3dhbF9sc24oKSIp OworbXkgJG91dHB1dCA9ICRub2RlX3N0YW5kYnktPnNhZmVfcHNxbCgKKwkncG9zdGdyZXMnLCBx cVsKKwlDQUxMIHBnX3dhaXRfbHNuKCcke2xzbjF9JywgMTAwMDAwMCk7CisJU0VMRUNUIHBnX2xz bl9jbXAocGdfbGFzdF93YWxfcmVwbGF5X2xzbigpLCAnJHtsc24xfSc6OnBnX2xzbik7CitdKTsK KworIyBHZXQgdGhlIGN1cnJlbnQgTFNOIG9uIHN0YW5kYnkgYW5kIG1ha2Ugc3VyZSBpdCdzIHRo ZSBzYW1lIGFzIHByaW1hcnkncyBMU04KK29rKCRvdXRwdXQgZXEgMCwgInN0YW5kYnkgcmVhY2hl ZCB0aGUgc2FtZSBMU04gYXMgcHJpbWFyeSBwZ193YWl0X2xzbigpIik7CisKK215ICRsc24yID0K KyAgJG5vZGVfcHJpbWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJTRUxFQ1QgcGdfY3VycmVu dF93YWxfbHNuKCkgKyAxIik7CitteSAkc3RkZXJyOworJG5vZGVfc3RhbmRieS0+c2FmZV9wc3Fs KCdwb3N0Z3JlcycsICJDQUxMIHBnX3dhaXRfbHNuKCcke2xzbjF9JywgMSk7Iik7Ciskbm9kZV9z dGFuZGJ5LT5wc3FsKAorCSdwb3N0Z3JlcycsCisJIkNBTEwgcGdfd2FpdF9sc24oJyR7bHNuMn0n LCAxKTsiLAorCXN0ZGVyciA9PiBcJHN0ZGVycik7CitvayggJHN0ZGVyciA9fiAvY2FuY2VsaW5n IHdhaXRpbmcgZm9yIExTTiBkdWUgdG8gdGltZW91dC8sCisJImdldCB0aW1lb3V0IG9uIHdhaXRp bmcgZm9yIHVucmVhY2hhYmxlIExTTiIpOworCisjIE1ha2Ugc3VyZSB0aGF0IHBnX3dhaXRfbHNu KCkgd29ya3M6IGFkZCBuZXcgY29udGVudCB0byBwcmltYXJ5IGFuZCBtZW1vcml6ZQorIyBwcmlt YXJ5J3MgbmV3IExTTiwgdGhlbiB3YWl0IGZvciBwcmltYXJ5J3MgTFNOIG9uIHN0YW5kYnkuIFBy b3ZlIHRoYXQgcGdfd2FpdF9sc24oKSBpcworIyBhYmxlIHRvIHNldHVwIGFuIGluZmluaXRlIHdh aXRpbmcgbG9vcCBhbmQgZXhpdCBpdCBpZiBjdXJyZW50IExTTiByZXBsYXllZC4KKyRub2RlX3By aW1hcnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJJTlNFUlQgSU5UTyB3YWl0X3Rlc3QgVkFM VUVTIChnZW5lcmF0ZV9zZXJpZXMoMjEsIDMwKSkiKTsKK215ICRsc24zID0KKyAgJG5vZGVfcHJp bWFyeS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICJTRUxFQ1QgcGdfY3VycmVudF93YWxfbHNuKCki KTsKKyRvdXRwdXQgPSAkbm9kZV9zdGFuZGJ5LT5zYWZlX3BzcWwoCisJJ3Bvc3RncmVzJywgcXFb CisJQ0FMTCBwZ193YWl0X2xzbignJHtsc24zfScpOworCVNFTEVDVCBwZ19sc25fY21wKHBnX2xh c3Rfd2FsX3JlcGxheV9sc24oKSwgJyR7bHNuM30nOjpwZ19sc24pOworXSk7CisKKyMgR2V0IHRo ZSBjdXJyZW50IExTTiBvbiBzdGFuZGJ5IGFuZCBtYWtlIHN1cmUgaXQncyB0aGUgc2FtZSBhcyBw cmltYXJ5J3MgTFNOCitvaygkb3V0cHV0IGVxIDAsICJzdGFuZGJ5IHJlYWNoZWQgdGhlIHNhbWUg TFNOIGFzIHByaW1hcnkiKTsKKworJG5vZGVfc3RhbmRieS0+c3RvcDsKKyRub2RlX3ByaW1hcnkt PnN0b3A7Citkb25lX3Rlc3RpbmcoKTsK --=_edf11a9b3c74638d02172718957f613c--