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 1rp7SB-00595g-DD for pgsql-hackers@arkaria.postgresql.org; Tue, 26 Mar 2024 14:07:04 +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 1rp7SA-00FNq8-B6 for pgsql-hackers@arkaria.postgresql.org; Tue, 26 Mar 2024 14:07:02 +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 1rp7S9-00FNpq-MG for pgsql-hackers@lists.postgresql.org; Tue, 26 Mar 2024 14:07:02 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rp7S1-006arv-DG for pgsql-hackers@lists.postgresql.org; Tue, 26 Mar 2024 14:07:00 +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 060D6E20E92; Tue, 26 Mar 2024 17:06:52 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1711462012; bh=GunVhdMvTs/vFIhMAhSESmoyD6RvGEqcsCPyeqTwaqk=; h=Date:From:To:Cc:Subject:In-Reply-To:References:User-Agent: Message-ID:From; b=pcYe8B5bRW21ZJ9OruWuWQmf22ZxLP2IUI76u4uEowfJi+a5T/YKH/RyTd9jQCYh7 pXXkPsVW/MBB44P55PKLlNHg58DkQ/vlHCVmv43WA2WrcpYEckHKyV60CXj5jZIhGd FSP658MaEcRpeOeQwKLfLT7DIEmXfASMe1RgDTSbjzhhB7EBB8fDvkGqvC4xyTrjMO gSx135c5XsN4b2ZDBPnVD0isre4B8zYVBQE82jvLKuHLyiTgjou7ZW3MUA04Hmc020 xOCuyXDBLeFYr4xWTRpuzqELhiIQ/MqVKF/Z7At+ZPrYnl0C4YqSslBvxwAm7zSoOs EubetNpIdZxCw== MIME-Version: 1.0 Date: Tue, 26 Mar 2024 17:06:51 +0300 From: Kartyshov Ivan To: Bharath Rupireddy Cc: Peter Eisentraut , 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> User-Agent: Roundcube Webmail/1.6.5 Message-ID: <5358d911a08ef2952b1e9f74062426ee@postgrespro.ru> X-Sender: i.kartyshov@postgrespro.ru Content-Type: multipart/mixed; boundary="=_fc127f79f91959ca375970b823a923ff" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_fc127f79f91959ca375970b823a923ff Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed Thank you for your interest to the patch. I understand you questions, but I fully support Alexander Korotkov idea to commit the minimal required functionality. And then keep working on other improvements. On 2024-03-24 05:39, Bharath Rupireddy wrote: > On Fri, Mar 22, 2024 at 4:28 AM Peter Eisentraut > wrote: >> >> I had written in [0] about my questions related to using this with >> connection poolers. I don't think this was addressed at all. I >> haven't >> seen any discussion about how to make this kind of facility usable in >> a >> full system. You have to manually query and send LSNs; that seems >> pretty cumbersome. Sure, this is part of something that could be >> useful, but how would an actual user with actual application code get >> to >> use this? >> >> [0]: >> https://www.postgresql.org/message-id/8b5b172f-0ae7-d644-8358-e2851dded43b%40enterprisedb.com >>> But I wonder how a client is going to get the LSN. How would all of >>> this be used by a client? I can think of a scenarios where you have >>> an application that issues a bunch of SQL commands and you have some >>> kind of pooler in the middle that redirects those commands to >>> different hosts, and what you really want is to have it transparently >>> behave as if it's just a single host. Do we want to inject a bunch >>> of "SELECT pg_get_lsn()", "SELECT pg_wait_lsn()" calls into that? As I understand your question, application make dml on the primary server, get LSN of changes and send bunch SQL read-only commands to pooler. Transparent behave we can get using #synchronous_commit, but it is very slow. >>> I'm tempted to think this could be a protocol-layer facility. Every >>> query automatically returns the current LSN, and every query can also >>> send along an LSN to wait for, and the client library would just keep >>> track of the LSN for (what it thinks of as) the connection. So you >>> get some automatic serialization without having to modify your client >>> code. Thank you, it is a good question for future versions. You say about a protocol-layer facility, what you meen. May be we can use signals, like hot_standby_feedback. > I share the same concern as yours and had proposed something upthread > [1]. The idea is something like how each query takes a snapshot at the > beginning of txn/query (depending on isolation level), the same way > the standby can wait for the primary's current LSN as of the moment > (at the time of taking snapshot). And, primary keeps sending its > current LSN as part of regular WAL to standbys so that the standbys > doesn't have to make connections to the primary to know its current > LSN every time. Perhps, this may not even fully guarantee (considered > to be achieving) the read-after-write consistency on standbys unless > there's a way for the application to tell the wait LSN. > > Thoughts? > > [1] > https://www.postgresql.org/message-id/CALj2ACUfS7LH1PaWmSZ5KwH4BpQxO9izeMw4qC3a1DAwi6nfbQ%40mail.gmail.com > +1 to have support for implicit txns. A strawman solution I can think > of is to let primary send its current insert LSN to the standby every > time it sends a bunch of WAL, and the standby waits for that LSN to be > replayed on it at the start of every implicit txn automatically. And how standby will get lsn to wait for? All solutions I can think of are very invasive and poorly scalable. For example, every dml can send back LSN if dml is success. And application could use it to wait actual changes. > The new BEGIN syntax requires application code changes. This led me to > think how one can achieve read-after-write consistency today in a > primary - standby set up. All the logic of this patch, that is, waiting > for the standby to pass a given primary LSN needs to be done in the > application code (or in proxy or in load balancer?). I believe there > might be someone doing this already, it's good to hear from them. You may use #synchronous_commit mode but it slow. So my implementation don`t make primary to wait all standby to sent its feedbacks. -- Ivan Kartyshov Postgres Professional: www.postgrespro.com --=_fc127f79f91959ca375970b823a923ff Content-Transfer-Encoding: base64 Content-Type: text/x-diff; name=v14_0002-Procedure-wait-lsn.patch Content-Disposition: attachment; filename=v14_0002-Procedure-wait-lsn.patch; size=18887 ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9mdW5jLnNnbWwgYi9kb2Mvc3JjL3NnbWwvZnVuYy5z Z21sCmluZGV4IDhlY2MwMmYyYjkuLjgwNDIyMDFiYWIgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dt bC9mdW5jLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbApAQCAtMjgwODYsMTAgKzI4 MDg2LDU1IEBAIHBvc3RncmVzPSMgU0VMRUNUICcwLzAnOjpwZ19sc24gKyBwZC5zZWdtZW50X251 bWJlciAqIHBzLnNldHRpbmc6OmludCArIDpvZmZzZXQKICAgICAgICAgZXh0ZW5zaW9uLgogICAg ICAgIDwvcGFyYT48L2VudHJ5PgogICAgICAgPC9yb3c+CisKKyAgICAgIDxyb3c+CisgICAgICAg PGVudHJ5IHJvbGU9ImZ1bmNfdGFibGVfZW50cnkiPjxwYXJhIHJvbGU9ImZ1bmNfc2lnbmF0dXJl Ij4KKyAgICAgICAgPGluZGV4dGVybT4KKyAgICAgICAgIDxwcmltYXJ5PnBnX3dhaXRfbHNuPC9w cmltYXJ5PgorICAgICAgICA8L2luZGV4dGVybT4KKyAgICAgICAgPGZ1bmN0aW9uPnBnX3dhaXRf bHNuPC9mdW5jdGlvbj4gKHRyZ19sc24gcGdfbHNuLCBkZWxheSBpbnQ4IERFRkFVTFQgMCkKKyAg ICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIFJldHVybnMgRVJST1IgaWYgdGFy Z2V0IExTTiB3YXMgbm90IHJlcGxheWVkIG9uIHN0YW5kYnkuCisgICAgICAgIFBhcmFtZXRlciA8 cGFyYW1ldGVyPmRlbGF5PC9wYXJhbWV0ZXI+IHNldHMgc2Vjb25kcywgdGhlIHRpbWUgdG8gd2Fp dCB0byB0aGUgTFNOLgorICAgICAgIDwvcGFyYT48L2VudHJ5PgorICAgICAgPC9yb3c+CiAgICAg IDwvdGJvZHk+CiAgICAgPC90Z3JvdXA+CiAgICA8L3RhYmxlPgogCisgICA8cGFyYT4KKyAgICA8 ZnVuY3Rpb24+cGdfd2FpdF9sc248L2Z1bmN0aW9uPiB3YWl0cyB0aWxsIDxwYXJhbWV0ZXI+d2Fp dF9sc248L3BhcmFtZXRlcj4KKyAgICB0byBiZSByZXBsYXllZCBvbiBzdGFuZGJ5IHRvIGFjaGll dmUgcmVhZC15b3VyLXdyaXRlcy1jb25zaXN0ZW5jeSwgd2hpbGUKKyAgICB1c2luZyBhc3luYyBy ZXBsaWNhIGZvciByZWFkcyBhbmQgcHJpbWFyeSBmb3Igd3JpdGVzLiBJbiB0aGF0IGNhc2UgbHNu IG9mCisgICAgbGFzdCBtb2RpZmljYXRpb24gaXMgc3RvcmVkIGluc2lkZSBhcHBsaWNhdGlvbi4K KyAgICBOb3RlOiBwZ193YWl0X2xzbih0cmdfbHNuIHBnX2xzbiwgZGVsYXkgaW50OCBERUZBVUxU IDApCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgIFlvdSBjYW4gdXNlIDxmdW5jdGlvbj5w Z193YWl0X2xzbjwvZnVuY3Rpb24+IHRvIHdhaXQgdGhlIDx0eXBlPnBnX2xzbjwvdHlwZT4KKyAg ICB2YWx1ZS4gRm9yIGV4YW1wbGU6CisgICA8cHJvZ3JhbWxpc3Rpbmc+CisgICBSZXBsaWNhOgor ICAgcG9zdGdyZXNxbC5jb25mCisgICAgIHJlY292ZXJ5X21pbl9hcHBseV9kZWxheSA9IDEwczsK KworICAgUHJpbWFyeTogQXBwbGljYXRpb24gdXBkYXRlIHRhYmxlIGFuZCBnZXQgbHNuIG9mIGNo YW5nZXMKKyAgIHBvc3RncmVzPSMgVVBEQVRFIGZpbG1zIFNFVCBraW5kID0gJ0RyYW1hdGljJyBX SEVSRSBraW5kID0gJ0RyYW1hJzsKKyAgIHBvc3RncmVzPSMgU0VMRUNUIHBnX2N1cnJlbnRfd2Fs X2xzbigpOworICAgcGdfY3VycmVudF93YWxfbHNuCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQor ICAgMC8zMDZFRTIwCisgICAoMSByb3cpCisKKyAgIFJlcGxpY2E6IFdhaXQgYW5kIHJlYWQgdXBk YXRlZCBkYXRhCisgICBwb3N0Z3Jlcz0jIENBTEwgcGdfd2FpdF9sc24oJzAvMzA2RUUyMCcsIDEw MCk7IC8vIFRpbWVvdXQgMTAwbXMgaXMgaW5zdWZmaWNlbnQKKyAgIEVSUk9SOiAgY2FuY2VsaW5n IHdhaXRpbmcgZm9yIExTTiBkdWUgdG8gdGltZW91dAorICAgcG9zdGdyZXM9IyBDQUxMIHBnX3dh aXRfbHNuKCcwLzMwNkVFMjAnKTsKKyAgIHBvc3RncmVzPSMgU0VMRUNUICogRlJPTSBmaWxtcyBX SEVSRSBraW5kID0gJ0RyYW1hJzsKKyAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICA8L3BhcmE+CisK ICAgIDxwYXJhPgogICAgIFRoZSBmdW5jdGlvbnMgc2hvd24gaW4gPHhyZWYKICAgICBsaW5rZW5k PSJmdW5jdGlvbnMtcmVjb3ZlcnktY29udHJvbC10YWJsZSIvPiBjb250cm9sIHRoZSBwcm9ncmVz cyBvZiByZWNvdmVyeS4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hs b2dyZWNvdmVyeS5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5zYW0veGxvZ3JlY292ZXJ5LmMK aW5kZXggMjljNWJlYzA4NC4uMGI3ODNkYzczMyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNj ZXNzL3RyYW5zYW0veGxvZ3JlY292ZXJ5LmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL3RyYW5z YW0veGxvZ3JlY292ZXJ5LmMKQEAgLTQzLDYgKzQzLDcgQEAKICNpbmNsdWRlICJiYWNrdXAvYmFz ZWJhY2t1cC5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfY29udHJvbC5oIgogI2luY2x1ZGUgImNv bW1hbmRzL3RhYmxlc3BhY2UuaCIKKyNpbmNsdWRlICJjb21tYW5kcy93YWl0bHNuLmgiCiAjaW5j bHVkZSAiY29tbW9uL2ZpbGVfdXRpbHMuaCIKICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICNpbmNs dWRlICJwZ3N0YXQuaCIKQEAgLTE4MjgsNiArMTgyOSwxNCBAQCBQZXJmb3JtV2FsUmVjb3Zlcnko dm9pZCkKIAkJCQlicmVhazsKIAkJCX0KIAorCQkJLyoKKwkJCSAqIElmIHdlIHJlcGxheWVkIGFu IExTTiB0aGF0IHNvbWVvbmUgd2FzIHdhaXRpbmcgZm9yLCBzZXQgbGF0Y2hlcworCQkJICogaW4g c2hhcmVkIG1lbW9yeSBhcnJheSB0byBub3RpZnkgdGhlIHdhaXRlci4KKwkJCSAqLworCQkJaWYg KHdhaXRMU04gJiYKKwkJCQkoWExvZ1JlY292ZXJ5Q3RsLT5sYXN0UmVwbGF5ZWRFbmRSZWNQdHIg Pj0gcGdfYXRvbWljX3JlYWRfdTY0KCZ3YWl0TFNOLT5taW5MU04pKSkKKwkJCQlXYWl0TFNOU2V0 TGF0Y2hlcyhYTG9nUmVjb3ZlcnlDdGwtPmxhc3RSZXBsYXllZEVuZFJlY1B0cik7CisKIAkJCS8q IEVsc2UsIHRyeSB0byBmZXRjaCB0aGUgbmV4dCBXQUwgcmVjb3JkICovCiAJCQlyZWNvcmQgPSBS ZWFkUmVjb3JkKHhsb2dwcmVmZXRjaGVyLCBMT0csIGZhbHNlLCByZXBsYXlUTEkpOwogCQl9IHdo aWxlIChyZWNvcmQgIT0gTlVMTCk7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jYXRhbG9nL3N5 c3RlbV9mdW5jdGlvbnMuc3FsIGIvc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fZnVuY3Rpb25z LnNxbAppbmRleCBmZTJiYjUwZjQ2Li41YzRmOWM3OGExIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9jYXRhbG9nL3N5c3RlbV9mdW5jdGlvbnMuc3FsCisrKyBiL3NyYy9iYWNrZW5kL2NhdGFsb2cv c3lzdGVtX2Z1bmN0aW9ucy5zcWwKQEAgLTQxNCw2ICs0MTQsOSBAQCBDUkVBVEUgT1IgUkVQTEFD RSBGVU5DVElPTgogICBqc29uX3BvcHVsYXRlX3JlY29yZHNldChiYXNlIGFueWVsZW1lbnQsIGZy b21fanNvbiBqc29uLCB1c2VfanNvbl9hc190ZXh0IGJvb2xlYW4gREVGQVVMVCBmYWxzZSkKICAg UkVUVVJOUyBTRVRPRiBhbnllbGVtZW50IExBTkdVQUdFIGludGVybmFsIFNUQUJMRSBST1dTIDEw MCAgQVMgJ2pzb25fcG9wdWxhdGVfcmVjb3Jkc2V0JyBQQVJBTExFTCBTQUZFOwogCitDUkVBVEUg T1IgUkVQTEFDRSBQUk9DRURVUkUgcGdfd2FpdF9sc24odHJnX2xzbiBwZ19sc24sIGRlbGF5IGZs b2F0OCBERUZBVUxUIDApCisgIExBTkdVQUdFIGludGVybmFsIEFTICdwZ193YWl0X2xzbic7CisK IENSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIHBnX2xvZ2ljYWxfc2xvdF9nZXRfY2hhbmdlcygK ICAgICBJTiBzbG90X25hbWUgbmFtZSwgSU4gdXB0b19sc24gcGdfbHNuLCBJTiB1cHRvX25jaGFu Z2VzIGludCwgVkFSSUFESUMgb3B0aW9ucyB0ZXh0W10gREVGQVVMVCAne30nLAogICAgIE9VVCBs c24gcGdfbHNuLCBPVVQgeGlkIHhpZCwgT1VUIGRhdGEgdGV4dCkKZGlmZiAtLWdpdCBhL3NyYy9i YWNrZW5kL2NvbW1hbmRzL01ha2VmaWxlIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvTWFrZWZpbGUK aW5kZXggNDhmNzM0OGY5MS4uY2VkZTkwYzNiOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29t bWFuZHMvTWFrZWZpbGUKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvTWFrZWZpbGUKQEAgLTYx LDYgKzYxLDcgQEAgT0JKUyA9IFwKIAl2YWN1dW0ubyBcCiAJdmFjdXVtcGFyYWxsZWwubyBcCiAJ dmFyaWFibGUubyBcCi0Jdmlldy5vCisJdmlldy5vIFwKKwl3YWl0bHNuLm8KIAogaW5jbHVkZSAk KHRvcF9zcmNkaXIpL3NyYy9iYWNrZW5kL2NvbW1vbi5tawpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvY29tbWFuZHMvbWVzb24uYnVpbGQgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9tZXNvbi5idWls ZAppbmRleCA2ZGQwMGE0YWJkLi43NTQ5YmU1ZGMzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9j b21tYW5kcy9tZXNvbi5idWlsZAorKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9tZXNvbi5idWls ZApAQCAtNTAsNCArNTAsNSBAQCBiYWNrZW5kX3NvdXJjZXMgKz0gZmlsZXMoCiAgICd2YWN1dW1w YXJhbGxlbC5jJywKICAgJ3ZhcmlhYmxlLmMnLAogICAndmlldy5jJywKKyAgJ3dhaXRsc24uYycs CiApCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy93YWl0bHNuLmMgYi9zcmMvYmFj a2VuZC9jb21tYW5kcy93YWl0bHNuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMC4uYmQ5ZWE2YjdkYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRz L3dhaXRsc24uYwpAQCAtMCwwICsxLDMwMyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICog d2FpdGxzbi5jCisgKgkgIEltcGxlbWVudHMgd2FpdGluZyBmb3IgdGhlIGdpdmVuIExTTiwgd2hp Y2ggaXMgdXNlZCBpbgorICoJICBDQUxMIHBnX3dhaXRfbHNuKHdhaXRfbHNuIHBnX2xzbiwgdGlt ZW91dCBpbnQpLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAyNCwgUG9zdGdyZVNRTCBHbG9iYWwg RGV2ZWxvcG1lbnQgR3JvdXAKKyAqCisgKiBJREVOVElGSUNBVElPTgorICoJICBzcmMvYmFja2Vu ZC9jb21tYW5kcy93YWl0bHNuLmMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaW5j bHVkZSAicG9zdGdyZXMuaCIKKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5o PgorCisjaW5jbHVkZSAicGdzdGF0LmgiCisjaW5jbHVkZSAiZm1nci5oIgorI2luY2x1ZGUgImFj Y2Vzcy90cmFuc2FtLmgiCisjaW5jbHVkZSAiYWNjZXNzL3hhY3QuaCIKKyNpbmNsdWRlICJhY2Nl c3MveGxvZy5oIgorI2luY2x1ZGUgImFjY2Vzcy94bG9nZGVmcy5oIgorI2luY2x1ZGUgImFjY2Vz cy94bG9ncmVjb3ZlcnkuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX3R5cGUuaCIKKyNpbmNsdWRl ICJjb21tYW5kcy93YWl0bHNuLmgiCisjaW5jbHVkZSAiZXhlY3V0b3Ivc3BpLmgiCisjaW5jbHVk ZSAiZnVuY2FwaS5oIgorI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgorI2luY2x1ZGUgInN0b3JhZ2Uv aXBjLmgiCisjaW5jbHVkZSAic3RvcmFnZS9sYXRjaC5oIgorI2luY2x1ZGUgInN0b3JhZ2UvcG1z aWduYWwuaCIKKyNpbmNsdWRlICJzdG9yYWdlL3Byb2MuaCIKKyNpbmNsdWRlICJzdG9yYWdlL3No bWVtLmgiCisjaW5jbHVkZSAic3RvcmFnZS9zaW52YWxhZHQuaCIKKyNpbmNsdWRlICJ1dGlscy9i dWlsdGlucy5oIgorI2luY2x1ZGUgInV0aWxzL3BnX2xzbi5oIgorI2luY2x1ZGUgInV0aWxzL3Nu YXBtZ3IuaCIKKyNpbmNsdWRlICJ1dGlscy90aW1lc3RhbXAuaCIKKyNpbmNsdWRlICJ1dGlscy9m bWdycHJvdG9zLmgiCisKKy8qIEFkZCB0byAvIGRlbGV0ZSBmcm9tIHNoYXJlZCBtZW1vcnkgYXJy YXkgKi8KK3N0YXRpYyB2b2lkIGFkZExTTldhaXRlcihYTG9nUmVjUHRyIGxzbik7CitzdGF0aWMg dm9pZCBkZWxldGVMU05XYWl0ZXIodm9pZCk7CisKK3N0cnVjdCBXYWl0TFNOU3RhdGUgKndhaXRM U04gPSBOVUxMOworc3RhdGljIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBoYXZlU2htZW1JdGVtID0g ZmFsc2U7CisKKy8qCisgKiBSZXBvcnQgdGhlIGFtb3VudCBvZiBzaGFyZWQgbWVtb3J5IHNwYWNl IG5lZWRlZCBmb3IgV2FpdExTTlN0YXRlCisgKi8KK1NpemUKK1dhaXRMU05TaG1lbVNpemUodm9p ZCkKK3sKKwlTaXplCQlzaXplOworCisJc2l6ZSA9IG9mZnNldG9mKFdhaXRMU05TdGF0ZSwgcHJv Y0luZm9zKTsKKwlzaXplID0gYWRkX3NpemUoc2l6ZSwgbXVsX3NpemUoTWF4QmFja2VuZHMsIHNp emVvZihXYWl0TFNOUHJvY0luZm8pKSk7CisJcmV0dXJuIHNpemU7Cit9CisKKy8qIEluaXRpYWxp emUgdGhlIFdhaXRMU05TdGF0ZSBpbiB0aGUgc2hhcmVkIG1lbW9yeSAqLwordm9pZAorV2FpdExT TlNobWVtSW5pdCh2b2lkKQoreworCWJvb2wJCWZvdW5kOworCisJd2FpdExTTiA9IChXYWl0TFNO U3RhdGUgKikgU2htZW1Jbml0U3RydWN0KCJXYWl0TFNOU3RhdGUiLAorCQkJCQkJCQkJCQkgICBX YWl0TFNOU2htZW1TaXplKCksCisJCQkJCQkJCQkJCSAgICZmb3VuZCk7CisJaWYgKCFmb3VuZCkK Kwl7CisJCVNwaW5Mb2NrSW5pdCgmd2FpdExTTi0+bXV0ZXgpOworCQl3YWl0TFNOLT5udW1XYWl0 ZWRQcm9jcyA9IDA7CisJCXBnX2F0b21pY19pbml0X3U2NCgmd2FpdExTTi0+bWluTFNOLCBQR19V SU5UNjRfTUFYKTsKKwl9Cit9CisKKy8qCisgKiBBZGQgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRo ZSBMU04gd2FpdGVyIGJhY2tlbmQgdG8gdGhlIHNoYXJlZCBtZW1vcnkKKyAqIGFycmF5LgorICov CitzdGF0aWMgdm9pZAorYWRkTFNOV2FpdGVyKFhMb2dSZWNQdHIgbHNuKQoreworCVdhaXRMU05Q cm9jSW5mbyBjdXI7CisJaW50CQkJaTsKKworCVNwaW5Mb2NrQWNxdWlyZSgmd2FpdExTTi0+bXV0 ZXgpOworCisJY3VyLnByb2NudW0gPSBNeVByb2NOdW1iZXI7CisJY3VyLndhaXRMU04gPSBsc247 CisKKwlmb3IgKGkgPSAwOyBpIDwgd2FpdExTTi0+bnVtV2FpdGVkUHJvY3M7IGkrKykKKwl7CisJ CWlmICh3YWl0TFNOLT5wcm9jSW5mb3NbaV0ud2FpdExTTiA+PSBjdXIud2FpdExTTikKKwkJewor CQkJV2FpdExTTlByb2NJbmZvIHRtcDsKKworCQkJdG1wID0gd2FpdExTTi0+cHJvY0luZm9zW2ld OworCQkJd2FpdExTTi0+cHJvY0luZm9zW2ldID0gY3VyOworCQkJY3VyID0gdG1wOworCQl9CisJ fQorCXdhaXRMU04tPnByb2NJbmZvc1tpXSA9IGN1cjsKKwl3YWl0TFNOLT5udW1XYWl0ZWRQcm9j cysrOworCisJcGdfYXRvbWljX3dyaXRlX3U2NCgmd2FpdExTTi0+bWluTFNOLCB3YWl0TFNOLT5w cm9jSW5mb3NbaV0ud2FpdExTTik7CisJU3BpbkxvY2tSZWxlYXNlKCZ3YWl0TFNOLT5tdXRleCk7 Cit9CisKKy8qCisgKiBEZWxldGUgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBMU04gd2FpdGVy IGJhY2tlbmQgZnJvbSB0aGUgc2hhcmVkIG1lbW9yeQorICogYXJyYXkuCisgKi8KK3N0YXRpYyB2 b2lkCitkZWxldGVMU05XYWl0ZXIodm9pZCkKK3sKKwlpbnQJCQlpOworCWJvb2wJCWZvdW5kID0g ZmFsc2U7CisKKwlTcGluTG9ja0FjcXVpcmUoJndhaXRMU04tPm11dGV4KTsKKworCWZvciAoaSA9 IDA7IGkgPCB3YWl0TFNOLT5udW1XYWl0ZWRQcm9jczsgaSsrKQorCXsKKwkJaWYgKHdhaXRMU04t PnByb2NJbmZvc1tpXS5wcm9jbnVtID09IE15UHJvY051bWJlcikKKwkJCWZvdW5kID0gdHJ1ZTsK KworCQlpZiAoZm91bmQgJiYgaSA8IHdhaXRMU04tPm51bVdhaXRlZFByb2NzIC0gMSkKKwkJewor CQkJd2FpdExTTi0+cHJvY0luZm9zW2ldID0gd2FpdExTTi0+cHJvY0luZm9zW2kgKyAxXTsKKwkJ fQorCX0KKworCWlmICghZm91bmQpCisJeworCQlTcGluTG9ja1JlbGVhc2UoJndhaXRMU04tPm11 dGV4KTsKKwkJcmV0dXJuOworCX0KKwl3YWl0TFNOLT5udW1XYWl0ZWRQcm9jcy0tOworCisJaWYg KHdhaXRMU04tPm51bVdhaXRlZFByb2NzICE9IDApCisJCXBnX2F0b21pY193cml0ZV91NjQoJndh aXRMU04tPm1pbkxTTiwgd2FpdExTTi0+cHJvY0luZm9zW2ldLndhaXRMU04pOworCWVsc2UKKwkJ cGdfYXRvbWljX3dyaXRlX3U2NCgmd2FpdExTTi0+bWluTFNOLCBQR19VSU5UNjRfTUFYKTsKKwor CVNwaW5Mb2NrUmVsZWFzZSgmd2FpdExTTi0+bXV0ZXgpOworfQorCisvKgorICogU2V0IGFsbCBs YXRjaGVzIGluIHNoYXJlZCBtZW1vcnkgdG8gc2lnbmFsIHRoYXQgbmV3IExTTiBoYXMgYmVlbiBy ZXBsYXllZAorKi8KK3ZvaWQKK1dhaXRMU05TZXRMYXRjaGVzKFhMb2dSZWNQdHIgY3VyTFNOKQor eworCXVpbnQzMgkJaSwKKwkJCQludW1XYWtlVXBQcm9jczsKKworCVNwaW5Mb2NrQWNxdWlyZSgm d2FpdExTTi0+bXV0ZXgpOworCisJLyoKKwkgKiBTZXQgbGF0Y2hlcyBmb3IgcHJvY2Vzcywgd2hv c2Ugd2FpdGVkIExTTnMgYXJlIGFscmVhZHkgcmVwbGF5ZWQuCisJICovCisJZm9yIChpID0gMDsg aSA8IHdhaXRMU04tPm51bVdhaXRlZFByb2NzOyBpKyspCisJeworCQlQR1BST0MJICAgKmJhY2tl bmQ7CisKKwkJaWYgKHdhaXRMU04tPnByb2NJbmZvc1tpXS53YWl0TFNOID4gY3VyTFNOKQorCQkJ YnJlYWs7CisKKwkJYmFja2VuZCA9IEdldFBHUHJvY0J5TnVtYmVyKHdhaXRMU04tPnByb2NJbmZv c1tpXS5wcm9jbnVtKTsKKwkJU2V0TGF0Y2goJmJhY2tlbmQtPnByb2NMYXRjaCk7CisJfQorCisJ LyoKKwkgKiBJbW1lZGlhdGVseSByZW1vdmUgdGhvc2UgcHJvY2Vzc2VzIGZyb20gdGhlIHNobWVt IGFycmF5LiAgT3RoZXJ3aXNlLAorCSAqIHNobWVtIGFycmF5IGl0ZW1zIHdpbGwgYmUgaGVyZSB0 aWxsIGNvcnJlc3BvbmRpbmcgcHJvY2Vzc2VzIHdha2UgdXAgYW5kCisJICogZGVsZXRlIHRoZW1z ZWx2ZXMuCisJICovCisJbnVtV2FrZVVwUHJvY3MgPSBpOworCWZvciAoaSA9IDA7IGkgPCB3YWl0 TFNOLT5udW1XYWl0ZWRQcm9jcyAtIG51bVdha2VVcFByb2NzOyBpKyspCisJCXdhaXRMU04tPnBy b2NJbmZvc1tpXSA9IHdhaXRMU04tPnByb2NJbmZvc1tpICsgbnVtV2FrZVVwUHJvY3NdOworCXdh aXRMU04tPm51bVdhaXRlZFByb2NzIC09IG51bVdha2VVcFByb2NzOworCisJaWYgKHdhaXRMU04t Pm51bVdhaXRlZFByb2NzICE9IDApCisJCXBnX2F0b21pY193cml0ZV91NjQoJndhaXRMU04tPm1p bkxTTiwgd2FpdExTTi0+cHJvY0luZm9zW2ldLndhaXRMU04pOworCWVsc2UKKwkJcGdfYXRvbWlj X3dyaXRlX3U2NCgmd2FpdExTTi0+bWluTFNOLCBQR19VSU5UNjRfTUFYKTsKKworCVNwaW5Mb2Nr UmVsZWFzZSgmd2FpdExTTi0+bXV0ZXgpOworfQorCisvKgorICogRGVsZXRlIG91ciBpdGVtIGZy b20gc2htZW0gYXJyYXkgaWYgYW55LgorICovCit2b2lkCitXYWl0TFNOQ2xlYW51cCh2b2lkKQor eworCWlmIChoYXZlU2htZW1JdGVtKQorCQlkZWxldGVMU05XYWl0ZXIoKTsKK30KKworLyoKKyAq IFdhaXQgdXNpbmcgTXlMYXRjaCB0byB3YWl0IHRpbGwgdGhlIGdpdmVuIExTTiBpcyByZXBsYXll ZCwgdGhlIHBvc3RtYXN0ZXIgZGllcyBvcgorICogdGltZW91dCBoYXBwZW5zLgorICovCit2b2lk CitXYWl0Rm9yTFNOKFhMb2dSZWNQdHIgbHNuLCBmbG9hdDggc2VjKQoreworCVhMb2dSZWNQdHIJ Y3VyTFNOOworCWludAkJCWxhdGNoX2V2ZW50czsKKwlUaW1lc3RhbXBUeiBlbmR0aW1lOworCisJ LyogU2hvdWxkbid0IGJlIGNhbGxlZCB3aGVuIHNobWVtIGlzbid0IGluaXRpYWxpemVkICovCisJ QXNzZXJ0KHdhaXRMU04pOworCisJLyogU2hvdWxkIGJlIG9ubHkgY2FsbGVkIGJ5IGEgYmFja2Vu ZCAqLworCUFzc2VydChNeUJhY2tlbmRUeXBlID09IEJfQkFDS0VORCk7CisKKwlpZiAoIVJlY292 ZXJ5SW5Qcm9ncmVzcygpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVf T0JKRUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorCQkJCSBlcnJtc2coInJlY292ZXJ5 IGlzIG5vdCBpbiBwcm9ncmVzcyIpLAorCQkJCSBlcnJoaW50KCJXYWl0aW5nIGZvciBMU04gY2Fu IG9ubHkgYmUgZXhlY3V0ZWQgZHVyaW5nIHJlY292ZXJ5LiIpKSk7CisKKwllbmR0aW1lID0gR2V0 Q3VycmVudFRpbWVzdGFtcCgpICsgKGludDY0KShzZWMgKiAxMDAwICogMTAwMCk7CisKKwlsYXRj aF9ldmVudHMgPSBXTF9USU1FT1VUIHwgV0xfTEFUQ0hfU0VUIHwgV0xfRVhJVF9PTl9QTV9ERUFU SDsKKwlhZGRMU05XYWl0ZXIobHNuKTsKKwloYXZlU2htZW1JdGVtID0gdHJ1ZTsKKworCWZvciAo OzspCisJeworCQlpbnQJCQlyYzsKKwkJbG9uZwkJZGVsYXlfbXM7CisKKwkJLyogQ2hlY2sgaWYg dGhlIHdhaXRlZCBMU04gaGFzIGJlZW4gcmVwbGF5ZWQgKi8KKwkJY3VyTFNOID0gR2V0WExvZ1Jl cGxheVJlY1B0cihOVUxMKTsKKwkJaWYgKGxzbiA8PSBjdXJMU04pCisJCQlicmVhazsKKworCQlp ZiAoc2VjID49IDEpCisJCQlkZWxheV9tcyA9IChlbmR0aW1lIC0gR2V0Q3VycmVudFRpbWVzdGFt cCgpKSAvIDEwMDA7CisJCWVsc2UKKwkJCS8qIElmIG5vIHRpbWVvdXQgaXMgc2V0IHRoZW4gd2Fr ZSB1cCBpbiAxIG1pbnV0ZSBmb3IgaW50ZXJydXB0cyAqLworCQkJZGVsYXlfbXMgPSA2MDAwMDsK KworCQlpZiAoZGVsYXlfbXMgPD0gMCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIElmIHJlY2Vp dmVkIGFuIGludGVycnVwdGlvbiBmcm9tIENIRUNLX0ZPUl9JTlRFUlJVUFRTLCB0aGVuIGRlbGV0 ZQorCQkgKiB0aGUgY3VycmVudCBldmVudCBmcm9tIGFycmF5LgorCQkgKi8KKwkJQ0hFQ0tfRk9S X0lOVEVSUlVQVFMoKTsKKworCQkvKiBJZiBwb3N0bWFzdGVyIGRpZXMsIGZpbmlzaCBpbW1lZGlh dGVseSAqLworCQlpZiAoIVBvc3RtYXN0ZXJJc0FsaXZlKCkpCisJCQlicmVhazsKKworCQlyYyA9 IFdhaXRMYXRjaChNeUxhdGNoLCBsYXRjaF9ldmVudHMsIGRlbGF5X21zLAorCQkJCQkgICBXQUlU X0VWRU5UX1dBSVRfRk9SX1NUQU5EQllfQ09ORklSTUFUSU9OKTsKKworCQlpZiAocmMgJiBXTF9M QVRDSF9TRVQpCisJCQlSZXNldExhdGNoKE15TGF0Y2gpOworCX0KKworCWlmIChsc24gPiBjdXJM U04pCisJeworCQlkZWxldGVMU05XYWl0ZXIoKTsKKwkJaGF2ZVNobWVtSXRlbSA9IGZhbHNlOwor CQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfUVVFUllfQ0FOQ0VMRUQpLAor CQkJCSBlcnJtc2coImNhbmNlbGluZyB3YWl0aW5nIGZvciBMU04gZHVlIHRvIHRpbWVvdXQiKSkp OworCX0KKwllbHNlCisJeworCQloYXZlU2htZW1JdGVtID0gZmFsc2U7CisJfQorfQorCitEYXR1 bQorcGdfd2FpdF9sc24oUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlYTG9nUmVjUHRyCXRyZ19sc24g PSBQR19HRVRBUkdfTFNOKDApOworCWZsb2F0OAkJZGVsYXkgPSBQR19HRVRBUkdfRkxPQVQ4KDEp 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 Yy5kYXQKaW5kZXggMGQyNmU1YjQyMi4uY2IzMjViM2JlMCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1 ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2Mu ZGF0CkBAIC0xMjEzOCw2ICsxMjEzOCwxMSBAQAogICBwcm9yZXR0eXBlID0+ICdieXRlYScsIHBy b2FyZ3R5cGVzID0+ICdwZ19icmluX21pbm1heF9tdWx0aV9zdW1tYXJ5JywKICAgcHJvc3JjID0+ ICdicmluX21pbm1heF9tdWx0aV9zdW1tYXJ5X3NlbmQnIH0sCiAKK3sgb2lkID0+ICcxNjM4Nycs IGRlc2NyID0+ICd3YWl0IGZvciBMU04gdW50aWwgdGltZW91dCcsCisgIHByb25hbWUgPT4gJ3Bn X3dhaXRfbHNuJywgcHJva2luZCA9PiAncCcsIHByb3JldHR5cGUgPT4gJ3ZvaWQnLAorICBwcm9h cmd0eXBlcyA9PiAncGdfbHNuIGZsb2F0OCcsIHByb2FyZ25hbWVzID0+ICd7dHJnX2xzbixkZWxh eX0nLAorICBwcm9zcmMgPT4gJ3BnX3dhaXRfbHNuJyB9LAorCiB7IG9pZCA9PiAnNjI5MScsIGRl c2NyID0+ICdhcmJpdHJhcnkgdmFsdWUgZnJvbSBhbW9uZyBpbnB1dCB2YWx1ZXMnLAogICBwcm9u YW1lID0+ICdhbnlfdmFsdWUnLCBwcm9raW5kID0+ICdhJywgcHJvaXNzdHJpY3QgPT4gJ2YnLAog ICBwcm9yZXR0eXBlID0+ICdhbnllbGVtZW50JywgcHJvYXJndHlwZXMgPT4gJ2FueWVsZW1lbnQn LApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY29tbWFuZHMvd2FpdGxzbi5oIGIvc3JjL2luY2x1 ZGUvY29tbWFuZHMvd2FpdGxzbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAuLjUzYWI5YjdiNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaW5jbHVkZS9jb21tYW5kcy93 YWl0bHNuLmgKQEAgLTAsMCArMSw0MyBAQAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogd2Fp dGxzbi5oCisgKgkgIERlY2xhcmF0aW9ucyBmb3IgTFNOIHdhaXRpbmcgcm91dGluZXMuCisgKgor ICogQ29weXJpZ2h0IChjKSAyMDI0LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91 cAorICoKKyAqIHNyYy9pbmNsdWRlL2NvbW1hbmRzL3dhaXRsc24uaAorICoKKyAqLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorICovCisjaWZuZGVmIFdBSVRfTFNOX0gKKyNkZWZpbmUgV0FJVF9MU05fSAorCisj aW5jbHVkZSAicG9zdGdyZXMuaCIKKyNpbmNsdWRlICJwb3J0L2F0b21pY3MuaCIKKyNpbmNsdWRl ICJzdG9yYWdlL3NwaW4uaCIKKyNpbmNsdWRlICJ0Y29wL2Rlc3QuaCIKKworLyogU2hhcmVkIG1l bW9yeSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IFdhaXRMU05Qcm9jSW5mbworeworCWlu dAkJCXByb2NudW07CisJWExvZ1JlY1B0cgl3YWl0TFNOOworfQkJCVdhaXRMU05Qcm9jSW5mbzsK KwordHlwZWRlZiBzdHJ1Y3QgV2FpdExTTlN0YXRlCit7CisJcGdfYXRvbWljX3VpbnQ2NCBtaW5M U047CisJc2xvY2tfdAkJbXV0ZXg7CisJaW50CQkJbnVtV2FpdGVkUHJvY3M7CisJV2FpdExTTlBy b2NJbmZvIHByb2NJbmZvc1tGTEVYSUJMRV9BUlJBWV9NRU1CRVJdOworfQkJCVdhaXRMU05TdGF0 ZTsKKworZXh0ZXJuIFBHRExMSU1QT1JUIHN0cnVjdCBXYWl0TFNOU3RhdGUgKndhaXRMU047CisK K2V4dGVybiB2b2lkIFdhaXRGb3JMU04oWExvZ1JlY1B0ciBsc24sIGZsb2F0OCBzZWMpOworZXh0 ZXJuIFNpemUgV2FpdExTTlNobWVtU2l6ZSh2b2lkKTsKK2V4dGVybiB2b2lkIFdhaXRMU05TaG1l bUluaXQodm9pZCk7CitleHRlcm4gdm9pZCBXYWl0TFNOU2V0TGF0Y2hlcyhYTG9nUmVjUHRyIGN1 ckxTTik7CitleHRlcm4gdm9pZCBXYWl0TFNOQ2xlYW51cCh2b2lkKTsKKworI2VuZGlmCQkJCQkJ CS8qIFdBSVRfTFNOX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlY292ZXJ5L21lc29uLmJ1 aWxkIGIvc3JjL3Rlc3QvcmVjb3ZlcnkvbWVzb24uYnVpbGQKaW5kZXggYjFlYjc3YjFlYy4uYmM0 N2M5MzkwMiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVjb3ZlcnkvbWVzb24uYnVpbGQKKysrIGIv c3JjL3Rlc3QvcmVjb3ZlcnkvbWVzb24uYnVpbGQKQEAgLTUxLDYgKzUxLDcgQEAgdGVzdHMgKz0g ewogICAgICAgJ3QvMDQwX3N0YW5kYnlfZmFpbG92ZXJfc2xvdHNfc3luYy5wbCcsCiAgICAgICAn dC8wNDFfY2hlY2twb2ludF9hdF9wcm9tb3RlLnBsJywKICAgICAgICd0LzA0Ml9sb3dfbGV2ZWxf YmFja3VwLnBsJywKKyAgICAgICd0LzA0M193YWl0X2xzbi5wbCcsCiAgICAgXSwKICAgfSwKIH0K ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlY292ZXJ5L3QvMDQzX3dhaXRfbHNuLnBsIGIvc3JjL3Rl c3QvcmVjb3ZlcnkvdC8wNDNfd2FpdF9sc24ucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMC4uMTg3NTcwMmM5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3JlY292 ZXJ5L3QvMDQzX3dhaXRfbHNuLnBsCkBAIC0wLDAgKzEsNzcgQEAKKyMgQ2hlY2tzIHdhaXRpbmcg Zm9yIGxzbiBvbiBzdGFuZGJ5IHBnX3dhaXRfbHNuKCkKK3VzZSBzdHJpY3Q7Cit1c2Ugd2Fybmlu Z3M7CisKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyOwordXNlIFBvc3RncmVTUUw6OlRl c3Q6OlV0aWxzOwordXNlIFRlc3Q6Ok1vcmU7CisKKyMgSW5pdGlhbGl6ZSBwcmltYXJ5IG5vZGUK K215ICRub2RlX3ByaW1hcnkgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoJ3ByaW1h cnknKTsKKyRub2RlX3ByaW1hcnktPmluaXQoYWxsb3dzX3N0cmVhbWluZyA9PiAxKTsKKyRub2Rl X3ByaW1hcnktPnN0YXJ0OworCisjIEFuZCBzb21lIGNvbnRlbnQgYW5kIHRha2UgYSBiYWNrdXAK KyRub2RlX3ByaW1hcnktPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSJDUkVBVEUgVEFCTEUgd2Fp dF90ZXN0IEFTIFNFTEVDVCBnZW5lcmF0ZV9zZXJpZXMoMSwxMCkgQVMgYSIpOworbXkgJGJhY2t1 cF9uYW1lID0gJ215X2JhY2t1cCc7Ciskbm9kZV9wcmltYXJ5LT5iYWNrdXAoJGJhY2t1cF9uYW1l KTsKKworIyBDcmVhdGUgYSBzdHJlYW1pbmcgc3RhbmRieSB3aXRoIGEgMSBzZWNvbmQgZGVsYXkg ZnJvbSB0aGUgYmFja3VwCitteSAkbm9kZV9zdGFuZGJ5ID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1 c3Rlci0+bmV3KCdzdGFuZGJ5Jyk7CitteSAkZGVsYXkgPSAzOworJG5vZGVfc3RhbmRieS0+aW5p dF9mcm9tX2JhY2t1cCgkbm9kZV9wcmltYXJ5LCAkYmFja3VwX25hbWUsCisJaGFzX3N0cmVhbWlu ZyA9PiAxKTsKKyRub2RlX3N0YW5kYnktPmFwcGVuZF9jb25mKAorCSdwb3N0Z3Jlc3FsLmNvbmYn LCBxcVsKKwlyZWNvdmVyeV9taW5fYXBwbHlfZGVsYXkgPSAnJHtkZWxheX1zJworXSk7Ciskbm9k ZV9zdGFuZGJ5LT5zdGFydDsKKworCisjIE1ha2Ugc3VyZSB0aGF0IHBnX3dhaXRfbHNuKCkgd29y a3M6IGFkZCBuZXcgY29udGVudCB0byBwcmltYXJ5IGFuZCBtZW1vcml6ZQorIyBwcmltYXJ5J3Mg bmV3IExTTiwgdGhlbiB3YWl0IGZvciBwcmltYXJ5J3MgTFNOIG9uIHN0YW5kYnkuIFByb3ZlIHRo YXQgcGdfd2FpdF9sc24oKSBpcworIyBhYmxlIHRvIHNldHVwIGFuIGluZmluaXRlIHdhaXRpbmcg bG9vcCBhbmQgZXhpdCBpdCBpZiBnaXZlbiBubyB3YWl0IHRpbWVvdXQuCiskbm9kZV9wcmltYXJ5 LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywKKwkiSU5TRVJUIElOVE8gd2FpdF90ZXN0IFZBTFVFUyAo Z2VuZXJhdGVfc2VyaWVzKDExLCAyMCkpIik7CitteSAkbHNuMSA9CisgICRub2RlX3ByaW1hcnkt PnNhZmVfcHNxbCgncG9zdGdyZXMnLCAiU0VMRUNUIHBnX2N1cnJlbnRfd2FsX2xzbigpIik7Citt eSAkb3V0cHV0ID0gJG5vZGVfc3RhbmRieS0+c2FmZV9wc3FsKAorCSdwb3N0Z3JlcycsIHFxWwor CUNBTEwgcGdfd2FpdF9sc24oJyR7bHNuMX0nLCAxMDAwMDAwKTsKKwlTRUxFQ1QgcGdfbHNuX2Nt cChwZ19sYXN0X3dhbF9yZXBsYXlfbHNuKCksICcke2xzbjF9Jzo6cGdfbHNuKTsKK10pOworCisj IEdldCB0aGUgY3VycmVudCBMU04gb24gc3RhbmRieSBhbmQgbWFrZSBzdXJlIGl0J3MgdGhlIHNh bWUgYXMgcHJpbWFyeSdzIExTTgorb2soJG91dHB1dCBlcSAwLCAic3RhbmRieSByZWFjaGVkIHRo ZSBzYW1lIExTTiBhcyBwcmltYXJ5IHBnX3dhaXRfbHNuKCkiKTsKKworbXkgJGxzbjIgPQorICAk bm9kZV9wcmltYXJ5LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIlNFTEVDVCBwZ19jdXJyZW50X3dh bF9sc24oKSArIDEiKTsKK215ICRzdGRlcnI7Ciskbm9kZV9zdGFuZGJ5LT5zYWZlX3BzcWwoJ3Bv c3RncmVzJywgIkNBTEwgcGdfd2FpdF9sc24oJyR7bHNuMX0nLCAxKTsiKTsKKyRub2RlX3N0YW5k YnktPnBzcWwoCisJJ3Bvc3RncmVzJywKKwkiQ0FMTCBwZ193YWl0X2xzbignJHtsc24yfScsIDEp OyIsCisJc3RkZXJyID0+IFwkc3RkZXJyKTsKK29rKCAkc3RkZXJyID1+IC9jYW5jZWxpbmcgd2Fp dGluZyBmb3IgTFNOIGR1ZSB0byB0aW1lb3V0LywKKwkiZ2V0IHRpbWVvdXQgb24gd2FpdGluZyBm b3IgdW5yZWFjaGFibGUgTFNOIik7CisKKyMgTWFrZSBzdXJlIHRoYXQgcGdfd2FpdF9sc24oKSB3 b3JrczogYWRkIG5ldyBjb250ZW50IHRvIHByaW1hcnkgYW5kIG1lbW9yaXplCisjIHByaW1hcnkn cyBuZXcgTFNOLCB0aGVuIHdhaXQgZm9yIHByaW1hcnkncyBMU04gb24gc3RhbmRieS4gUHJvdmUg dGhhdCBwZ193YWl0X2xzbigpIGlzCisjIGFibGUgdG8gc2V0dXAgYW4gaW5maW5pdGUgd2FpdGlu ZyBsb29wIGFuZCBleGl0IGl0IGlmIGN1cnJlbnQgTFNOIHJlcGxheWVkLgorJG5vZGVfcHJpbWFy eS0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsCisJIklOU0VSVCBJTlRPIHdhaXRfdGVzdCBWQUxVRVMg KGdlbmVyYXRlX3NlcmllcygyMSwgMzApKSIpOworbXkgJGxzbjMgPQorICAkbm9kZV9wcmltYXJ5 LT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgIlNFTEVDVCBwZ19jdXJyZW50X3dhbF9sc24oKSIpOwor JG91dHB1dCA9ICRub2RlX3N0YW5kYnktPnNhZmVfcHNxbCgKKwkncG9zdGdyZXMnLCBxcVsKKwlD QUxMIHBnX3dhaXRfbHNuKCcke2xzbjN9Jyk7CisJU0VMRUNUIHBnX2xzbl9jbXAocGdfbGFzdF93 YWxfcmVwbGF5X2xzbigpLCAnJHtsc24zfSc6OnBnX2xzbik7CitdKTsKKworIyBHZXQgdGhlIGN1 cnJlbnQgTFNOIG9uIHN0YW5kYnkgYW5kIG1ha2Ugc3VyZSBpdCdzIHRoZSBzYW1lIGFzIHByaW1h cnkncyBMU04KK29rKCRvdXRwdXQgZXEgMCwgInN0YW5kYnkgcmVhY2hlZCB0aGUgc2FtZSBMU04g YXMgcHJpbWFyeSIpOworCiskbm9kZV9zdGFuZGJ5LT5zdG9wOworJG5vZGVfcHJpbWFyeS0+c3Rv cDsKK2RvbmVfdGVzdGluZygpOwo= --=_fc127f79f91959ca375970b823a923ff--