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 1rXpma-00CtqO-5J for pgsql-hackers@arkaria.postgresql.org; Wed, 07 Feb 2024 21:48:41 +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 1rXpmZ-00DVbI-AU for pgsql-hackers@arkaria.postgresql.org; Wed, 07 Feb 2024 21:48:39 +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 1rXpmY-00DVbA-Cl for pgsql-hackers@lists.postgresql.org; Wed, 07 Feb 2024 21:48:38 +0000 Received: from mail-pj1-x102c.google.com ([2607:f8b0:4864:20::102c]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rXpmR-005bby-Dv for pgsql-hackers@lists.postgresql.org; Wed, 07 Feb 2024 21:48:37 +0000 Received: by mail-pj1-x102c.google.com with SMTP id 98e67ed59e1d1-29026523507so878432a91.0 for ; Wed, 07 Feb 2024 13:48:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1707342510; x=1707947310; darn=lists.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=Q2KPmuygyA24QEQffU3tuTbna3RMstuo+/lsGAYbROg=; b=OwAevraYJiUNlcPL0FeSYAKSUxdrOkFqdmG34k7Wxm4W+BB0otErPrZlebG7MvALyD XN5+GEgJJ/9hNYWltClNfuuaiveLtSzwl4XHb5t/4MeZO0snkBJc1TwsQ6vTEzaauTJF ukSquJQmBkBfTX2onjwaRUM9k+rdVoF0SI14ndXNFOeU/YLK9LqCUDy4CdGxAw3S5kiF EPlPp2KjkJh3EuhllqT4Vjs818wR+VgxAxwmpx8qwYAa5toSO2fH4OS5a8LBH0xw1/5t JblNAwrNTkLoNTEnDtMkYwxh9QLwROgfCKnr/qE+1Laa0Myldki67H16sXBwdP1PG1qC 1MGQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707342510; x=1707947310; 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=Q2KPmuygyA24QEQffU3tuTbna3RMstuo+/lsGAYbROg=; b=wm4l3ndeX3YwhK82y/E9VJ6A7Okyuu039OBLXb4vdh/CuNafsZuZ4vG4ER9p8j6ZC0 92dtSm/sprYM4BWkOAs40cNCTgYfLu/266I6UYP0Q93stxv4NjRXmFOwzXgUxX39zLL2 ardbTDeLoIYK+8kayY9WQJX45BiOWlaHZ0bjezQ+YefLg/hU5SHKHGJ/SmJHXkSk9QM5 KmIDZVtDAlS8UjtGD7q/3CS9bsPZe9Hnk2IB46WMeArCr9R35DAdYcNI6po3rBKdJGb8 dCUhdF67Z5XBDtcROlkqlqM9hKx3mzuqjQDYAbgbGvsPoOKqdZX80ZjiFE5YwJXS4U2X ZuLw== X-Forwarded-Encrypted: i=1; AJvYcCUlahKgoI5YqZ0Pg6uAifrLaRywMJUaFaHBPcUcqtQrVCsRpd3zoa+Ug4stoU3CNoXVIqlB/kIk2OttrO8O1extEKgKt5Zq0Ps7TxDXpiv1vKQs X-Gm-Message-State: AOJu0YyeqmwyoXrBFdEDm/7+S0vuW113mBGSt0yrruBhVBEFfc82LTf4 NuI8yHX9DdTrnnQwzxVu23BXE8qlMnZpg4wmP1WnECaU3dbf10Yybk2Tqv4sHgJbPvxGoYVBJ5C QYaFSVDJfMua1CaeRo6D6bb5MUEA= X-Google-Smtp-Source: AGHT+IHCSsVgmnKYh/Q2u65vIMC36cEggAtGdIGH4lJbp3sIUt44DqzdIthosojY0LMGkaUH+Q4McsqZC1+oevkMKd4= X-Received: by 2002:a17:90b:1b0a:b0:296:9d63:1d9f with SMTP id nu10-20020a17090b1b0a00b002969d631d9fmr4232441pjb.47.1707342509970; Wed, 07 Feb 2024 13:48:29 -0800 (PST) MIME-Version: 1.0 References: <8ec36f51-b863-60e3-20e2-b9c981c5ce5e@enterprisedb.com> <367160ea-b1ed-4481-e804-bca509128878@enterprisedb.com> <280dc83c-a16f-4424-1319-95e7e3f798bd@enterprisedb.com> <98ba4b25-fae8-c1f4-1597-8093375a1986@enterprisedb.com> <20231221134314.wf2rs62d37u62j7t@alap3.anarazel.de> <20231221154352.ijtg6wloa3nowivh@alap3.anarazel.de> <482ec3ff-52ad-415d-96fd-f3832a894023@enterprisedb.com> <56176b8d-956c-487e-ab09-310db4581c07@enterprisedb.com> <4867452a-b853-4813-a6da-9bb06a336f8b@enterprisedb.com> In-Reply-To: From: Melanie Plageman Date: Wed, 7 Feb 2024 16:48:18 -0500 Message-ID: Subject: Re: index prefetching To: Tomas Vondra Cc: Robert Haas , Andres Freund , PostgreSQL Hackers , Georgios , Thomas Munro , Konstantin Knizhnik , Dilip Kumar Content-Type: multipart/mixed; boundary="000000000000d13be10610d1a7c5" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000d13be10610d1a7c5 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Jan 24, 2024 at 3:20=E2=80=AFPM Melanie Plageman wrote: > > On Wed, Jan 24, 2024 at 4:19=E2=80=AFAM Tomas Vondra > wrote: > > > > On 1/24/24 01:51, Melanie Plageman wrote: > > >> But I'm not sure what to do about optimizations that are more specif= ic > > >> to the access path. Consider for example the index-only scans. We do= n't > > >> want to prefetch all the pages, we need to inspect the VM and prefet= ch > > >> just the not-all-visible ones. And then pass the info to the index s= can, > > >> so that it does not need to check the VM again. It's not clear to me= how > > >> to do this with this approach. > > > > > > Yea, this is an issue I'll need to think about. To really spell out > > > the problem: the callback dequeues a TID from the tid_queue and looks > > > up its block in the VM. It's all visible. So, it shouldn't return tha= t > > > block to the streaming read API to fetch from the heap because it > > > doesn't need to be read. But, where does the callback put the TID so > > > that the caller can get it? I'm going to think more about this. > > > > > > > Yes, that's the problem for index-only scans. I'd generalize it so that > > it's about the callback being able to (a) decide if it needs to read th= e > > heap page, and (b) store some custom info for the TID. > > Actually, I think this is no big deal. See attached. I just don't > enqueue tids whose blocks are all visible. I had to switch the order > from fetch heap then fill queue to fill queue then fetch heap. > > While doing this I noticed some wrong results in the regression tests > (like in the alter table test), so I suspect I have some kind of > control flow issue. Perhaps I should fix the resource leak so I can > actually see the failing tests :) Attached is a patch which implements a real queue and fixes some of the issues with the previous version. It doesn't pass tests yet and has issues. Some are bugs in my implementation I need to fix. Some are issues we would need to solve in the streaming read API. Some are issues with index prefetching generally. Note that these two patches have to be applied before 21d9c3ee4e because Thomas hasn't released a rebased version of the streaming read API patches yet. Issues --- - kill prior tuple This optimization doesn't work with index prefetching with the current design. Kill prior tuple relies on alternating between fetching a single index tuple and visiting the heap. After visiting the heap we can potentially kill the immediately preceding index tuple. Once we fetch multiple index tuples, enqueue their TIDs, and later visit the heap, the next index page we visit may not contain all of the index tuples deemed killable by our visit to the heap. In our case, we could try and fix this by prefetching only heap blocks referred to by index tuples on the same index page. Or we could try and keep a pool of index pages pinned and go back and kill index tuples on those pages. Having disabled kill_prior_tuple is why the mvcc test fails. Perhaps there is an easier way to fix this, as I don't think the mvcc test failed on Tomas' version. - switching scan directions If the index scan switches directions on a given invocation of IndexNext(), heap blocks may have already been prefetched and read for blocks containing tuples beyond the point at which we want to switch directions. We could fix this by having some kind of streaming read "reset" callback to drop all of the buffers which have been prefetched which are now no longer needed. We'd have to go backwards from the last TID which was yielded to the caller and figure out which buffers in the pgsr buffer ranges are associated with all of the TIDs which were prefetched after that TID. The TIDs are in the per_buffer_data associated with each buffer in pgsr. The issue would be searching through those efficiently. The other issue is that the streaming read API does not currently support backwards scans. So, if we switch to a backwards scan from a forwards scan, we would need to fallback to the non streaming read method. We could do this by just setting the TID queue size to 1 (which is what I have currently implemented). Or we could add backwards scan support to the streaming read API. - mark and restore Similar to the issue with switching the scan direction, mark and restore requires us to reset the TID queue and streaming read queue. For now, I've hacked in something to the PlannerInfo and Plan to set the TID queue size to 1 for plans containing a merge join (yikes). - multiple executions For reasons I don't entirely understand yet, multiple executions (not rescan -- see ExecutorRun(...execute_once)) do not work. As in Tomas' patch, I have disabled prefetching (and made the TID queue size 1) when execute_once is false. - Index Only Scans need to return IndexTuples Because index only scans return either the IndexTuple pointed to by IndexScanDesc->xs_itup or the HeapTuple pointed to by IndexScanDesc->xs_hitup -- both of which are populated by the index AM, we have to save copies of those IndexTupleData and HeapTupleDatas for every TID whose block we prefetch. This might be okay, but it is a bit sad to have to make copies of those tup= les. In this patch, I still haven't figured out the memory management part. I copy over the tuples when enqueuing a TID queue item and then copy them back again when the streaming read API returns the per_buffer_data to us. Something is still not quite right here. I suspect this is part of the reason why some of the other tests are failing. Other issues/gaps in my implementation: Determining where to allocate the memory for the streaming read object and the TID queue is an outstanding TODO. To implement a fallback method for cases in which streaming read doesn't work, I set the queue size to 1. This is obviously not good. Right now, I allocate the TID queue and streaming read objects in IndexNext() and IndexOnlyNext(). This doesn't seem ideal. Doing it in index_beginscan() (and index_beginscan_parallel()) is tricky though because we don't know the scan direction at that point (and the scan direction can change). There are also callers of index_beginscan() who do not call Index[Only]Next() (like systable_getnext() which calls index_getnext_slot() directly). Also, my implementation does not yet have the optimization Tomas does to skip prefetching recently prefetched blocks. As he has said, it probably makes sense to add something to do this in a lower layer -- such as in the streaming read API or even in bufmgr.c (maybe in PrefetchSharedBuffer()). - Melanie --000000000000d13be10610d1a7c5 Content-Type: text/x-patch; charset="US-ASCII"; name="v4-0001-Streaming-Read-API.patch" Content-Disposition: attachment; filename="v4-0001-Streaming-Read-API.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lscbjkb00 RnJvbSA1NTBlM2E0YjU1ZWIwZjNlZGMwZjhjNGY2OTFjZmYxMzRiMjU2MzcxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBUaG9tYXMgTXVucm8gPHRob21hcy5tdW5yb0BnbWFpbC5jb20+ CkRhdGU6IFNhdCwgMjIgSnVsIDIwMjMgMTc6MzE6NTQgKzEyMDAKU3ViamVjdDogW1BBVENIIHY0 IDEvMl0gU3RyZWFtaW5nIFJlYWQgQVBJCgotLS0KIGNvbnRyaWIvcGdfcHJld2FybS9wZ19wcmV3 YXJtLmMgICAgICAgICAgfCAgNDAgKy0KIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2d1 dGlscy5jICAgfCAgIDIgKy0KIHNyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvYmd3cml0ZXIuYyAgICAg ICAgfCAgIDggKy0KIHNyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvY2hlY2twb2ludGVyLmMgICAgfCAg MTUgKy0KIHNyYy9iYWNrZW5kL3N0b3JhZ2UvTWFrZWZpbGUgICAgICAgICAgICAgfCAgIDIgKy0K IHNyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL01ha2VmaWxlICAgICAgICAgfCAgMTQgKwogc3JjL2Jh Y2tlbmQvc3RvcmFnZS9haW8vbWVzb24uYnVpbGQgICAgICB8ICAgNSArCiBzcmMvYmFja2VuZC9z dG9yYWdlL2Fpby9zdHJlYW1pbmdfcmVhZC5jIHwgNDM1ICsrKysrKysrKysrKysrKysrKwogc3Jj L2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmbWdyLmMgICAgICB8IDU2MCArKysrKysrKysrKysr KystLS0tLS0tLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvbG9jYWxidWYuYyAgICB8ICAx NCArLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9tZXNvbi5idWlsZCAgICAgICAgICB8ICAgMSArCiBz cmMvYmFja2VuZC9zdG9yYWdlL3NtZ3Ivc21nci5jICAgICAgICAgIHwgIDQ5ICstCiBzcmMvaW5j bHVkZS9zdG9yYWdlL2J1Zm1nci5oICAgICAgICAgICAgIHwgIDIyICsKIHNyYy9pbmNsdWRlL3N0 b3JhZ2Uvc21nci5oICAgICAgICAgICAgICAgfCAgIDQgKy0KIHNyYy9pbmNsdWRlL3N0b3JhZ2Uv c3RyZWFtaW5nX3JlYWQuaCAgICAgfCAgNDUgKysKIHNyYy9pbmNsdWRlL3V0aWxzL3JlbC5oICAg ICAgICAgICAgICAgICAgfCAgIDYgLQogc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3Qg ICAgICAgICB8ICAgMiArCiAxNyBmaWxlcyBjaGFuZ2VkLCA5ODYgaW5zZXJ0aW9ucygrKSwgMjM4 IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9iYWNrZW5kL3N0b3JhZ2UvYWlv L01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2JhY2tlbmQvc3RvcmFnZS9haW8vbWVz b24uYnVpbGQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9zdHJl YW1pbmdfcmVhZC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2luY2x1ZGUvc3RvcmFnZS9zdHJl YW1pbmdfcmVhZC5oCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wZ19wcmV3YXJtL3BnX3ByZXdhcm0u YyBiL2NvbnRyaWIvcGdfcHJld2FybS9wZ19wcmV3YXJtLmMKaW5kZXggODU0MWU0ZDZlNC4uOTYx N2JmMTMwYiAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ19wcmV3YXJtL3BnX3ByZXdhcm0uYworKysg Yi9jb250cmliL3BnX3ByZXdhcm0vcGdfcHJld2FybS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5j bHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9idWZtZ3IuaCIKICNpbmNsdWRl ICJzdG9yYWdlL3NtZ3IuaCIKKyNpbmNsdWRlICJzdG9yYWdlL3N0cmVhbWluZ19yZWFkLmgiCiAj aW5jbHVkZSAidXRpbHMvYWNsLmgiCiAjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKICNpbmNs dWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKQEAgLTM4LDYgKzM5LDI1IEBAIHR5cGVkZWYgZW51bQog CiBzdGF0aWMgUEdJT0FsaWduZWRCbG9jayBibG9ja2J1ZmZlcjsKIAorc3RydWN0IHBnX3ByZXdh cm1fc3RyZWFtaW5nX3JlYWRfcHJpdmF0ZQoreworCUJsb2NrTnVtYmVyIGJsb2NrbnVtOworCWlu dDY0CQlsYXN0X2Jsb2NrOworfTsKKworc3RhdGljIEJsb2NrTnVtYmVyCitwZ19wcmV3YXJtX3N0 cmVhbWluZ19yZWFkX25leHQoUGdTdHJlYW1pbmdSZWFkICpwZ3NyLAorCQkJCQkJCSAgIHZvaWQg KnBnc3JfcHJpdmF0ZSwKKwkJCQkJCQkgICB2b2lkICpwZXJfYnVmZmVyX2RhdGEpCit7CisJc3Ry dWN0IHBnX3ByZXdhcm1fc3RyZWFtaW5nX3JlYWRfcHJpdmF0ZSAqcCA9IHBnc3JfcHJpdmF0ZTsK KworCWlmIChwLT5ibG9ja251bSA8PSBwLT5sYXN0X2Jsb2NrKQorCQlyZXR1cm4gcC0+YmxvY2tu dW0rKzsKKworCXJldHVybiBJbnZhbGlkQmxvY2tOdW1iZXI7Cit9CisKIC8qCiAgKiBwZ19wcmV3 YXJtKHJlZ2NsYXNzLCBtb2RlIHRleHQsIGZvcmsgdGV4dCwKICAqCQkJICBmaXJzdF9ibG9jayBp bnQ4LCBsYXN0X2Jsb2NrIGludDgpCkBAIC0xODMsMTggKzIwMywzNiBAQCBwZ19wcmV3YXJtKFBH X0ZVTkNUSU9OX0FSR1MpCiAJfQogCWVsc2UgaWYgKHB0eXBlID09IFBSRVdBUk1fQlVGRkVSKQog CXsKKwkJc3RydWN0IHBnX3ByZXdhcm1fc3RyZWFtaW5nX3JlYWRfcHJpdmF0ZSBwOworCQlQZ1N0 cmVhbWluZ1JlYWQgKnBnc3I7CisKIAkJLyoKIAkJICogSW4gYnVmZmVyIG1vZGUsIHdlIGFjdHVh bGx5IHB1bGwgdGhlIGRhdGEgaW50byBzaGFyZWRfYnVmZmVycy4KIAkJICovCisKKwkJLyogU2V0 IHVwIHRoZSBwcml2YXRlIHN0YXRlIGZvciBvdXIgc3RyZWFtaW5nIGJ1ZmZlciByZWFkIGNhbGxi YWNrLiAqLworCQlwLmJsb2NrbnVtID0gZmlyc3RfYmxvY2s7CisJCXAubGFzdF9ibG9jayA9IGxh c3RfYmxvY2s7CisKKwkJcGdzciA9IHBnX3N0cmVhbWluZ19yZWFkX2J1ZmZlcl9hbGxvYyhQR1NS X0ZMQUdfREVGQVVMVCwKKwkJCQkJCQkJCQkJICAmcCwKKwkJCQkJCQkJCQkJICAwLAorCQkJCQkJ CQkJCQkgIE5VTEwsCisJCQkJCQkJCQkJCSAgQk1SX1JFTChyZWwpLAorCQkJCQkJCQkJCQkgIGZv cmtOdW1iZXIsCisJCQkJCQkJCQkJCSAgcGdfcHJld2FybV9zdHJlYW1pbmdfcmVhZF9uZXh0KTsK KwogCQlmb3IgKGJsb2NrID0gZmlyc3RfYmxvY2s7IGJsb2NrIDw9IGxhc3RfYmxvY2s7ICsrYmxv Y2spCiAJCXsKIAkJCUJ1ZmZlcgkJYnVmOwogCiAJCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOwot CQkJYnVmID0gUmVhZEJ1ZmZlckV4dGVuZGVkKHJlbCwgZm9ya051bWJlciwgYmxvY2ssIFJCTV9O T1JNQUwsIE5VTEwpOworCQkJYnVmID0gcGdfc3RyZWFtaW5nX3JlYWRfYnVmZmVyX2dldF9uZXh0 KHBnc3IsIE5VTEwpOwogCQkJUmVsZWFzZUJ1ZmZlcihidWYpOwogCQkJKytibG9ja3NfZG9uZTsK IAkJfQorCQlBc3NlcnQocGdfc3RyZWFtaW5nX3JlYWRfYnVmZmVyX2dldF9uZXh0KHBnc3IsIE5V TEwpID09IEludmFsaWRCdWZmZXIpOworCQlwZ19zdHJlYW1pbmdfcmVhZF9mcmVlKHBnc3IpOwog CX0KIAogCS8qIENsb3NlIHJlbGF0aW9uLCByZWxlYXNlIGxvY2suICovCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ndXRpbHMuYyBiL3NyYy9iYWNrZW5kL2FjY2Vz cy90cmFuc2FtL3hsb2d1dGlscy5jCmluZGV4IGFhODY2N2FiZDEuLjg3NzViNTc4OWIgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2d1dGlscy5jCisrKyBiL3NyYy9i YWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2d1dGlscy5jCkBAIC02NTcsNyArNjU3LDcgQEAgWExv Z0Ryb3BEYXRhYmFzZShPaWQgZGJpZCkKIAkgKiBUaGlzIGlzIHVubmVjZXNzYXJpbHkgaGVhdnkt aGFuZGVkLCBhcyBpdCB3aWxsIGNsb3NlIFNNZ3JSZWxhdGlvbgogCSAqIG9iamVjdHMgZm9yIG90 aGVyIGRhdGFiYXNlcyBhcyB3ZWxsLiBEUk9QIERBVEFCQVNFIG9jY3VycyBzZWxkb20gZW5vdWdo CiAJICogdGhhdCBpdCdzIG5vdCB3b3J0aCBpbnRyb2R1Y2luZyBhIHZhcmlhbnQgb2Ygc21ncmNs b3NlIGZvciBqdXN0IHRoaXMKLQkgKiBwdXJwb3NlLiBYWFg6IE9yIHNob3VsZCB3ZSByYXRoZXIg bGVhdmUgdGhlIHNtZ3IgZW50cmllcyBkYW5nbGluZz8KKwkgKiBwdXJwb3NlLgogCSAqLwogCXNt Z3JjbG9zZWFsbCgpOwogCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL2Jnd3Jp dGVyLmMgYi9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL2Jnd3JpdGVyLmMKaW5kZXggZDdkNmNjMGNk Ny4uMTNlNTM3NjYxOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9iZ3dyaXRl ci5jCisrKyBiL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvYmd3cml0ZXIuYwpAQCAtMjQ2LDEwICsy NDYsMTIgQEAgQmFja2dyb3VuZFdyaXRlck1haW4odm9pZCkKIAkJaWYgKEZpcnN0Q2FsbFNpbmNl TGFzdENoZWNrcG9pbnQoKSkKIAkJewogCQkJLyoKLQkJCSAqIEFmdGVyIGFueSBjaGVja3BvaW50 LCBjbG9zZSBhbGwgc21nciBmaWxlcy4gIFRoaXMgaXMgc28gd2UKLQkJCSAqIHdvbid0IGhhbmcg b250byBzbWdyIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBmaWxlcyBpbmRlZmluaXRlbHkuCisJCQkg KiBBZnRlciBhbnkgY2hlY2twb2ludCwgZnJlZSBhbGwgc21nciBvYmplY3RzLiAgT3RoZXJ3aXNl IHdlCisJCQkgKiB3b3VsZCBuZXZlciBkbyBzbyBmb3IgZHJvcHBlZCByZWxhdGlvbnMsIGFzIHRo ZSBiZ3dyaXRlciBkb2VzCisJCQkgKiBub3QgcHJvY2VzcyBzaGFyZWQgaW52YWxpZGF0aW9uIG1l c3NhZ2VzIG9yIGNhbGwKKwkJCSAqIEF0RU9YYWN0X1NNZ3IoKS4KIAkJCSAqLwotCQkJc21ncmNs b3NlYWxsKCk7CisJCQlzbWdyZGVzdHJveWFsbCgpOwogCQl9CiAKIAkJLyoKZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvY2hlY2twb2ludGVyLmMgYi9zcmMvYmFja2VuZC9wb3N0 bWFzdGVyL2NoZWNrcG9pbnRlci5jCmluZGV4IDVlOTQ5ZmM4ODUuLjVkODQzYjYxNDIgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvY2hlY2twb2ludGVyLmMKKysrIGIvc3JjL2Jh Y2tlbmQvcG9zdG1hc3Rlci9jaGVja3BvaW50ZXIuYwpAQCAtNDY5LDEwICs0NjksMTIgQEAgQ2hl Y2twb2ludGVyTWFpbih2b2lkKQogCQkJCWNrcHRfcGVyZm9ybWVkID0gQ3JlYXRlUmVzdGFydFBv aW50KGZsYWdzKTsKIAogCQkJLyoKLQkJCSAqIEFmdGVyIGFueSBjaGVja3BvaW50LCBjbG9zZSBh bGwgc21nciBmaWxlcy4gIFRoaXMgaXMgc28gd2UKLQkJCSAqIHdvbid0IGhhbmcgb250byBzbWdy IHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBmaWxlcyBpbmRlZmluaXRlbHkuCisJCQkgKiBBZnRlciBh bnkgY2hlY2twb2ludCwgZnJlZSBhbGwgc21nciBvYmplY3RzLiAgT3RoZXJ3aXNlIHdlCisJCQkg KiB3b3VsZCBuZXZlciBkbyBzbyBmb3IgZHJvcHBlZCByZWxhdGlvbnMsIGFzIHRoZSBjaGVja3Bv aW50ZXIKKwkJCSAqIGRvZXMgbm90IHByb2Nlc3Mgc2hhcmVkIGludmFsaWRhdGlvbiBtZXNzYWdl cyBvciBjYWxsCisJCQkgKiBBdEVPWGFjdF9TTWdyKCkuCiAJCQkgKi8KLQkJCXNtZ3JjbG9zZWFs bCgpOworCQkJc21ncmRlc3Ryb3lhbGwoKTsKIAogCQkJLyoKIAkJCSAqIEluZGljYXRlIGNoZWNr cG9pbnQgY29tcGxldGlvbiB0byBhbnkgd2FpdGluZyBiYWNrZW5kcy4KQEAgLTk1OCwxMSArOTYw LDggQEAgUmVxdWVzdENoZWNrcG9pbnQoaW50IGZsYWdzKQogCQkgKi8KIAkJQ3JlYXRlQ2hlY2tQ b2ludChmbGFncyB8IENIRUNLUE9JTlRfSU1NRURJQVRFKTsKIAotCQkvKgotCQkgKiBBZnRlciBh bnkgY2hlY2twb2ludCwgY2xvc2UgYWxsIHNtZ3IgZmlsZXMuICBUaGlzIGlzIHNvIHdlIHdvbid0 Ci0JCSAqIGhhbmcgb250byBzbWdyIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBmaWxlcyBpbmRlZmlu aXRlbHkuCi0JCSAqLwotCQlzbWdyY2xvc2VhbGwoKTsKKwkJLyogRnJlZSBhbGwgc21nciBvYmpl Y3RzLCBhcyBDaGVja3BvaW50ZXJNYWluKCkgbm9ybWFsbHkgd291bGQuICovCisJCXNtZ3JkZXN0 cm95YWxsKCk7CiAKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3Jh Z2UvTWFrZWZpbGUgYi9zcmMvYmFja2VuZC9zdG9yYWdlL01ha2VmaWxlCmluZGV4IDgzNzZjZGZj YTIuLmVlYzAzZjZmMmIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvTWFrZWZpbGUK KysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9NYWtlZmlsZQpAQCAtOCw2ICs4LDYgQEAgc3ViZGly ID0gc3JjL2JhY2tlbmQvc3RvcmFnZQogdG9wX2J1aWxkZGlyID0gLi4vLi4vLi4KIGluY2x1ZGUg JCh0b3BfYnVpbGRkaXIpL3NyYy9NYWtlZmlsZS5nbG9iYWwKIAotU1VCRElSUyAgICAgPSBidWZm ZXIgZmlsZSBmcmVlc3BhY2UgaXBjIGxhcmdlX29iamVjdCBsbWdyIHBhZ2Ugc21nciBzeW5jCitT VUJESVJTICAgICA9IGFpbyBidWZmZXIgZmlsZSBmcmVlc3BhY2UgaXBjIGxhcmdlX29iamVjdCBs bWdyIHBhZ2Ugc21nciBzeW5jCiAKIGluY2x1ZGUgJCh0b3Bfc3JjZGlyKS9zcmMvYmFja2VuZC9j b21tb24ubWsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL01ha2VmaWxlIGIv c3JjL2JhY2tlbmQvc3RvcmFnZS9haW8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMC4uYmNhYjQ0YzgwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iYWNrZW5k L3N0b3JhZ2UvYWlvL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9y IHN0b3JhZ2UvYWlvCisjCisjIHNyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL01ha2VmaWxlCisjCisK K3N1YmRpciA9IHNyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvCit0b3BfYnVpbGRkaXIgPSAuLi8uLi8u Li8uLgoraW5jbHVkZSAkKHRvcF9idWlsZGRpcikvc3JjL01ha2VmaWxlLmdsb2JhbAorCitPQkpT ID0gXAorCXN0cmVhbWluZ19yZWFkLm8KKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL3NyYy9iYWNr ZW5kL2NvbW1vbi5tawpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9haW8vbWVzb24u YnVpbGQgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi4zOWFlZjJhODRhCi0tLSAvZGV2L251bGwKKysrIGIv c3JjL2JhY2tlbmQvc3RvcmFnZS9haW8vbWVzb24uYnVpbGQKQEAgLTAsMCArMSw1IEBACisjIENv cHlyaWdodCAoYykgMjAyNCwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKwor YmFja2VuZF9zb3VyY2VzICs9IGZpbGVzKAorICAnc3RyZWFtaW5nX3JlYWQuYycsCispCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9zdHJlYW1pbmdfcmVhZC5jIGIvc3JjL2Jh Y2tlbmQvc3RvcmFnZS9haW8vc3RyZWFtaW5nX3JlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwLi4xOTYwNTA5MGZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2JhY2tl bmQvc3RvcmFnZS9haW8vc3RyZWFtaW5nX3JlYWQuYwpAQCAtMCwwICsxLDQzNSBAQAorI2luY2x1 ZGUgInBvc3RncmVzLmgiCisKKyNpbmNsdWRlICJzdG9yYWdlL3N0cmVhbWluZ19yZWFkLmgiCisj aW5jbHVkZSAidXRpbHMvcmVsLmgiCisKKy8qCisgKiBFbGVtZW50IHR5cGUgZm9yIFBnU3RyZWFt aW5nUmVhZCdzIGNpcmN1bGFyIGFycmF5IG9mIGJsb2NrIHJhbmdlcy4KKyAqCisgKiBGb3IgaGl0 cywgbmVlZF90b19jb21wbGV0ZSBpcyBmYWxzZSBhbmQgdGhlcmUgaXMganVzdCBvbmUgYmxvY2sg cGVyCisgKiByYW5nZSwgYWxyZWFkeSBwaW5uZWQgYW5kIHJlYWR5IGZvciB1c2UuCisgKgorICog Rm9yIG1pc3NlcywgbmVlZF90b19jb21wbGV0ZSBpcyB0cnVlIGFuZCBidWZmZXJzW10gaG9sZHMg YSByYW5nZSBvZgorICogYmxvY2tzIHRoYXQgYXJlIGNvbnRpZ3VvdXMgaW4gc3RvcmFnZSAodGhv dWdoIHRoZSBidWZmZXJzIG1heSBub3QgYmUKKyAqIGNvbnRpZ3VvdXMgaW4gbWVtb3J5KSwgc28g d2UgY2FuIGNvbXBsZXRlIHRoZW0gd2l0aCBhIHNpbmdsZSBjYWxsIHRvCisgKiBDb21wbGV0ZVJl YWRCdWZmZXJzKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IFBnU3RyZWFtaW5nUmVhZFJhbmdlCit7 CisJYm9vbAkJYWR2aWNlX2lzc3VlZDsKKwlib29sCQluZWVkX2NvbXBsZXRlOworCUJsb2NrTnVt YmVyIGJsb2NrbnVtOworCWludAkJCW5ibG9ja3M7CisJaW50CQkJcGVyX2J1ZmZlcl9kYXRhX2lu ZGV4W01BWF9CVUZGRVJTX1BFUl9UUkFOU0ZFUl07CisJQnVmZmVyCQlidWZmZXJzW01BWF9CVUZG RVJTX1BFUl9UUkFOU0ZFUl07Cit9IFBnU3RyZWFtaW5nUmVhZFJhbmdlOworCitzdHJ1Y3QgUGdT dHJlYW1pbmdSZWFkCit7CisJaW50CQkJbWF4X2lvczsKKwlpbnQJCQlpb3NfaW5fcHJvZ3Jlc3M7 CisJaW50CQkJaW9zX2luX3Byb2dyZXNzX3RyaWdnZXI7CisJaW50CQkJbWF4X3Bpbm5lZF9idWZm ZXJzOworCWludAkJCXBpbm5lZF9idWZmZXJzOworCWludAkJCXBpbm5lZF9idWZmZXJzX3RyaWdn ZXI7CisJaW50CQkJbmV4dF90YWlsX2J1ZmZlcjsKKwlib29sCQlmaW5pc2hlZDsKKwl2b2lkCSAg ICpwZ3NyX3ByaXZhdGU7CisJUGdTdHJlYW1pbmdSZWFkQnVmZmVyQ0IgY2FsbGJhY2s7CisJQnVm ZmVyQWNjZXNzU3RyYXRlZ3kgc3RyYXRlZ3k7CisJQnVmZmVyTWFuYWdlclJlbGF0aW9uIGJtcjsK KwlGb3JrTnVtYmVyCWZvcmtudW07CisKKwlib29sCQlhZHZpY2VfZW5hYmxlZDsKKworCS8qIE5l eHQgZXhwZWN0ZWQgYmxvY2ssIGZvciBkZXRlY3Rpbmcgc2VxdWVudGlhbCBhY2Nlc3MuICovCisJ QmxvY2tOdW1iZXIgc2VxX2Jsb2NrbnVtOworCisJLyogU3BhY2UgZm9yIG9wdGlvbmFsIHBlci1i dWZmZXIgcHJpdmF0ZSBkYXRhLiAqLworCXNpemVfdAkJcGVyX2J1ZmZlcl9kYXRhX3NpemU7CisJ dm9pZAkgICAqcGVyX2J1ZmZlcl9kYXRhOworCWludAkJCXBlcl9idWZmZXJfZGF0YV9uZXh0Owor CisJLyogQ2lyY3VsYXIgYnVmZmVyIG9mIHJhbmdlcy4gKi8KKwlpbnQJCQlzaXplOworCWludAkJ CWhlYWQ7CisJaW50CQkJdGFpbDsKKwlQZ1N0cmVhbWluZ1JlYWRSYW5nZSByYW5nZXNbRkxFWElC TEVfQVJSQVlfTUVNQkVSXTsKK307CisKK3N0YXRpYyBQZ1N0cmVhbWluZ1JlYWQgKgorcGdfc3Ry ZWFtaW5nX3JlYWRfYnVmZmVyX2FsbG9jX2ludGVybmFsKGludCBmbGFncywKKwkJCQkJCQkJCQl2 b2lkICpwZ3NyX3ByaXZhdGUsCisJCQkJCQkJCQkJc2l6ZV90IHBlcl9idWZmZXJfZGF0YV9zaXpl LAorCQkJCQkJCQkJCUJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5KQoreworCVBnU3RyZWFt aW5nUmVhZCAqcGdzcjsKKwlpbnQJCQlzaXplOworCWludAkJCW1heF9pb3M7CisJdWludDMyCQlt YXhfcGlubmVkX2J1ZmZlcnM7CisKKworCS8qCisJICogRGVjaWRlIGhvdyBtYW55IGFzc3VtZWQg SS9PcyB3ZSB3aWxsIGFsbG93IHRvIHJ1biBjb25jdXJyZW50bHkuICBUaGF0CisJICogaXMsIGFk dmljZSB0byB0aGUga2VybmVsIHRvIHRlbGwgaXQgdGhhdCB3ZSB3aWxsIHNvb24gcmVhZC4gIFRo aXMKKwkgKiBudW1iZXIgYWxzbyBhZmZlY3RzIGhvdyBmYXIgd2UgbG9vayBhaGVhZCBmb3Igb3Bw b3J0dW5pdGllcyB0byBzdGFydAorCSAqIG1vcmUgSS9Pcy4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBQ R1NSX0ZMQUdfTUFJTlRFTkFOQ0UpCisJCW1heF9pb3MgPSBtYWludGVuYW5jZV9pb19jb25jdXJy ZW5jeTsKKwllbHNlCisJCW1heF9pb3MgPSBlZmZlY3RpdmVfaW9fY29uY3VycmVuY3k7CisKKwkv KgorCSAqIFRoZSBkZXNpcmVkIGxldmVsIG9mIEkvTyBjb25jdXJyZW5jeSBjb250cm9scyBob3cg ZmFyIGFoZWFkIHdlIGFyZQorCSAqIHdpbGxpbmcgdG8gbG9vayBhaGVhZC4gIFdlIGFsc28gY2xh bXAgaXQgdG8gYXQgbGVhc3QKKwkgKiBNQVhfQlVGRkVSX1BFUl9UUkFORkVSIHNvIHRoYXQgd2Ug Y2FuIGhhdmUgYSBjaGFuY2UgdG8gYnVpbGQgdXAgYSBmdWxsCisJICogc2l6ZWQgcmVhZCwgZXZl biB3aGVuIG1heF9pb3MgaXMgemVyby4KKwkgKi8KKwltYXhfcGlubmVkX2J1ZmZlcnMgPSBNYXgo bWF4X2lvcyAqIDQsIE1BWF9CVUZGRVJTX1BFUl9UUkFOU0ZFUik7CisKKwkvKgorCSAqIFRoZSAq X2lvX2NvbmN1cnJlbmN5IEdVQ3MsIHdlIG1pZ2h0IGhhdmUgMC4gIFdlIHdhbnQgdG8gYWxsb3cg YXQgbGVhc3QKKwkgKiBvbmUsIHRvIGtlZXAgb3VyIGdhdGluZyBsb2dpYyBzaW1wbGUuCisJICov CisJbWF4X2lvcyA9IE1heChtYXhfaW9zLCAxKTsKKworCS8qCisJICogRG9uJ3QgYWxsb3cgdGhp cyBiYWNrZW5kIHRvIHBpbiB0b28gbWFueSBidWZmZXJzLiAgRm9yIG5vdyB3ZSdsbCBhcHBseQor CSAqIHRoZSBsaW1pdCBmb3IgdGhlIHNoYXJlZCBidWZmZXIgcG9vbCBhbmQgdGhlIGxvY2FsIGJ1 ZmZlciBwb29sLCB3aXRob3V0CisJICogd29ycnlpbmcgd2hpY2ggaXQgaXMuCisJICovCisJTGlt aXRBZGRpdGlvbmFsUGlucygmbWF4X3Bpbm5lZF9idWZmZXJzKTsKKwlMaW1pdEFkZGl0aW9uYWxM b2NhbFBpbnMoJm1heF9waW5uZWRfYnVmZmVycyk7CisJQXNzZXJ0KG1heF9waW5uZWRfYnVmZmVy cyA+IDApOworCisJLyoKKwkgKiBwZ3NyLT5yYW5nZXMgaXMgYSBjaXJjdWxhciBidWZmZXIuICBX aGVuIGl0IGlzIGVtcHR5LCBoZWFkID09IHRhaWwuCisJICogV2hlbiBpdCBpcyBmdWxsLCB0aGVy ZSBpcyBhbiBlbXB0eSBlbGVtZW50IGJldHdlZW4gaGVhZCBhbmQgdGFpbC4gIEhlYWQKKwkgKiBj YW4gYWxzbyBiZSBlbXB0eSAobmJsb2NrcyA9PSAwKSwgdGhlcmVmb3JlIHdlIG5lZWQgdHdvIGV4 dHJhIGVsZW1lbnRzCisJICogZm9yIG5vbi1vY2N1cGllZCByYW5nZXMsIG9uIHRvcCBvZiBtYXhf cGlubmVkX2J1ZmZlcnMgdG8gYWxsb3cgZm9yIHRoZQorCSAqIG1heG1pbXVtIHBvc3NpYmxlIG51 bWJlciBvZiBvY2N1cGllZCByYW5nZXMgb2YgdGhlIHNtYWxsZXN0IHBvc3NpYmxlCisJICogc2l6 ZSBvZiBvbmUuCisJICovCisJc2l6ZSA9IG1heF9waW5uZWRfYnVmZmVycyArIDI7CisKKwlwZ3Ny ID0gKFBnU3RyZWFtaW5nUmVhZCAqKQorCQlwYWxsb2MwKG9mZnNldG9mKFBnU3RyZWFtaW5nUmVh ZCwgcmFuZ2VzKSArCisJCQkJc2l6ZW9mKHBnc3ItPnJhbmdlc1swXSkgKiBzaXplKTsKKworCXBn c3ItPm1heF9pb3MgPSBtYXhfaW9zOworCXBnc3ItPnBlcl9idWZmZXJfZGF0YV9zaXplID0gcGVy X2J1ZmZlcl9kYXRhX3NpemU7CisJcGdzci0+bWF4X3Bpbm5lZF9idWZmZXJzID0gbWF4X3Bpbm5l ZF9idWZmZXJzOworCXBnc3ItPnBnc3JfcHJpdmF0ZSA9IHBnc3JfcHJpdmF0ZTsKKwlwZ3NyLT5z dHJhdGVneSA9IHN0cmF0ZWd5OworCXBnc3ItPnNpemUgPSBzaXplOworCisjaWZkZWYgVVNFX1BS RUZFVENICisKKwkvKgorCSAqIFRoaXMgc3lzdGVtIHN1cHBvcnRzIHByZWZldGNoaW5nIGFkdmlj ZS4gIEFzIGxvbmcgYXMgZGlyZWN0IEkvTyBpc24ndAorCSAqIGVuYWJsZWQsIGFuZCB0aGUgY2Fs bGVyIGhhc24ndCBwcm9taXNlZCBzZXF1ZW50aWFsIGFjY2Vzcywgd2UgY2FuIHVzZQorCSAqIGl0 LgorCSAqLworCWlmICgoaW9fZGlyZWN0X2ZsYWdzICYgSU9fRElSRUNUX0RBVEEpID09IDAgJiYK KwkJKGZsYWdzICYgUEdTUl9GTEFHX1NFUVVFTlRJQUwpID09IDApCisJCXBnc3ItPmFkdmljZV9l bmFibGVkID0gdHJ1ZTsKKyNlbmRpZgorCisJLyoKKwkgKiBXZSB3YW50IHRvIGF2b2lkIGNyZWF0 aW5nIHJhbmdlcyB0aGF0IGFyZSBzbWFsbGVyIHRoYW4gdGhleSBjb3VsZCBiZQorCSAqIGp1c3Qg YmVjYXVzZSB3ZSBoaXQgbWF4X3Bpbm5lZF9idWZmZXJzLiAgV2Ugb25seSBsb29rIGFoZWFkIHdo ZW4gdGhlCisJICogbnVtYmVyIG9mIHBpbm5lZCBidWZmZXJzIGZhbGxzIGJlbG93IHRoaXMgdHJp Z2dlciBudW1iZXIsIG9yIHB1dAorCSAqIGFub3RoZXIgd2F5LCB3ZSBzdG9wIGxvb2tpbmcgYWhl YWQgd2hlbiB3ZSB3b3VsZG4ndCBiZSBhYmxlIHRvIGJ1aWxkIGEKKwkgKiAiZnVsbCBzaXplZCIg cmFuZ2UuCisJICovCisJcGdzci0+cGlubmVkX2J1ZmZlcnNfdHJpZ2dlciA9CisJCU1heCgxLCAo aW50KSBtYXhfcGlubmVkX2J1ZmZlcnMgLSBNQVhfQlVGRkVSU19QRVJfVFJBTlNGRVIpOworCisJ LyogU3BhY2UgdGhlIGNhbGxiYWNrIHRvIHN0b3JlIGV4dHJhIGRhdGEgYWxvbmcgd2l0aCBlYWNo IGJsb2NrLiAqLworCWlmIChwZXJfYnVmZmVyX2RhdGFfc2l6ZSkKKwkJcGdzci0+cGVyX2J1ZmZl cl9kYXRhID0gcGFsbG9jKHBlcl9idWZmZXJfZGF0YV9zaXplICogbWF4X3Bpbm5lZF9idWZmZXJz KTsKKworCXJldHVybiBwZ3NyOworfQorCisvKgorICogQ3JlYXRlIGEgbmV3IHN0cmVhbWluZyBy ZWFkIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gdGhlCisgKiBlcXVpdmFsZW50 IG9mIGEgc2VyaWVzIG9mIFJlYWRCdWZmZXIoKSBjYWxscyBmb3Igb25lIGZvcmsgb2Ygb25lIHJl bGF0aW9uLgorICogSW50ZXJuYWxseSwgaXQgZ2VuZXJhdGVzIGxhcmdlciB2ZWN0b3JlZCByZWFk cyB3aGVyZSBwb3NzaWJsZSBieSBsb29raW5nCisgKiBhaGVhZC4KKyAqLworUGdTdHJlYW1pbmdS ZWFkICoKK3BnX3N0cmVhbWluZ19yZWFkX2J1ZmZlcl9hbGxvYyhpbnQgZmxhZ3MsCisJCQkJCQkJ ICAgdm9pZCAqcGdzcl9wcml2YXRlLAorCQkJCQkJCSAgIHNpemVfdCBwZXJfYnVmZmVyX2RhdGFf c2l6ZSwKKwkJCQkJCQkgICBCdWZmZXJBY2Nlc3NTdHJhdGVneSBzdHJhdGVneSwKKwkJCQkJCQkg ICBCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yLAorCQkJCQkJCSAgIEZvcmtOdW1iZXIgZm9ya251 bSwKKwkJCQkJCQkgICBQZ1N0cmVhbWluZ1JlYWRCdWZmZXJDQiBuZXh0X2Jsb2NrX2NiKQorewor CVBnU3RyZWFtaW5nUmVhZCAqcmVzdWx0OworCisJcmVzdWx0ID0gcGdfc3RyZWFtaW5nX3JlYWRf YnVmZmVyX2FsbG9jX2ludGVybmFsKGZsYWdzLAorCQkJCQkJCQkJCQkJCSBwZ3NyX3ByaXZhdGUs CisJCQkJCQkJCQkJCQkJIHBlcl9idWZmZXJfZGF0YV9zaXplLAorCQkJCQkJCQkJCQkJCSBzdHJh dGVneSk7CisJcmVzdWx0LT5jYWxsYmFjayA9IG5leHRfYmxvY2tfY2I7CisJcmVzdWx0LT5ibXIg PSBibXI7CisJcmVzdWx0LT5mb3JrbnVtID0gZm9ya251bTsKKworCXJldHVybiByZXN1bHQ7Cit9 CisKKy8qCisgKiBTdGFydCBidWlsZGluZyBhIG5ldyByYW5nZS4gIFRoaXMgaXMgY2FsbGVkIGFm dGVyIHRoZSBwcmV2aW91cyBvbmUKKyAqIHJlYWNoZWQgbWF4aW11bSBzaXplLCBvciB0aGUgY2Fs bGJhY2sncyBuZXh0IGJsb2NrIGNhbid0IGJlIG1lcmdlZCB3aXRoIGl0LgorICoKKyAqIFNpbmNl IHRoZSBwcmV2aW91cyBoZWFkIHJhbmdlIGhhcyBub3cgcmVhY2hlZCBpdHMgZnVsbCBwb3RlbnRp YWwgc2l6ZSwgdGhpcworICogaXMgYWxzbyBhIGdvb2QgdGltZSB0byBpc3N1ZSAncHJlZmV0Y2gn IGFkdmljZSwgYmVjYXVzZSB3ZSBrbm93IHRoYXQnbGwKKyAqIHNvb24gYmUgcmVhZGluZy4gIElu IGZ1dHVyZSwgd2UgY291bGQgc3RhcnQgYW4gYWN0dWFsIEkvTyBoZXJlLgorICovCitzdGF0aWMg UGdTdHJlYW1pbmdSZWFkUmFuZ2UgKgorcGdfc3RyZWFtaW5nX3JlYWRfbmV3X3JhbmdlKFBnU3Ry ZWFtaW5nUmVhZCAqcGdzcikKK3sKKwlQZ1N0cmVhbWluZ1JlYWRSYW5nZSAqaGVhZF9yYW5nZTsK KworCWhlYWRfcmFuZ2UgPSAmcGdzci0+cmFuZ2VzW3Bnc3ItPmhlYWRdOworCUFzc2VydChoZWFk X3JhbmdlLT5uYmxvY2tzID4gMCk7CisKKwkvKgorCSAqIElmIGEgY2FsbCB0byBDb21wbGV0ZVJl YWRCdWZmZXJzKCkgd2lsbCBiZSBuZWVkZWQsIGFuZCB3ZSBjYW4gaXNzdWUKKwkgKiBhZHZpY2Ug dG8gdGhlIGtlcm5lbCB0byBnZXQgdGhlIHJlYWQgc3RhcnRlZC4gIFdlIHN1cHByZXNzIGl0IGlm IHRoZQorCSAqIGFjY2VzcyBwYXR0ZXJuIGFwcGVhcnMgdG8gYmUgY29tcGxldGVseSBzZXF1ZW50 aWFsLCB0aG91Z2gsIGJlY2F1c2Ugb24KKwkgKiBzb21lIHN5c3RlbXMgdGhhdCBpbnRlcmZlcnMg d2l0aCB0aGUga2VybmVsJ3Mgb3duIHNlcXVlbnRpYWwgcmVhZCBhaGVhZAorCSAqIGhldXJzdGlj cyBhbmQgaHVydHMgcGVyZm9ybWFuY2UuCisJICovCisJaWYgKHBnc3ItPmFkdmljZV9lbmFibGVk KQorCXsKKwkJQmxvY2tOdW1iZXIgYmxvY2tudW0gPSBoZWFkX3JhbmdlLT5ibG9ja251bTsKKwkJ aW50CQkJbmJsb2NrcyA9IGhlYWRfcmFuZ2UtPm5ibG9ja3M7CisKKwkJaWYgKGhlYWRfcmFuZ2Ut Pm5lZWRfY29tcGxldGUgJiYgYmxvY2tudW0gIT0gcGdzci0+c2VxX2Jsb2NrbnVtKQorCQl7CisJ CQlTTWdyUmVsYXRpb24gc21nciA9CisJCQkJcGdzci0+Ym1yLnNtZ3IgPyBwZ3NyLT5ibXIuc21n ciA6CisJCQkJUmVsYXRpb25HZXRTbWdyKHBnc3ItPmJtci5yZWwpOworCisJCQlBc3NlcnQoIWhl YWRfcmFuZ2UtPmFkdmljZV9pc3N1ZWQpOworCisJCQlzbWdycHJlZmV0Y2goc21nciwgcGdzci0+ Zm9ya251bSwgYmxvY2tudW0sIG5ibG9ja3MpOworCisJCQkvKgorCQkJICogQ291bnQgdGhpcyBh cyBhbiBJL08gdGhhdCBpcyBjb25jdXJyZW50bHkgaW4gcHJvZ3Jlc3MsIHRob3VnaAorCQkJICog d2UgZG9uJ3QgcmVhbGx5IGtub3cgaWYgdGhlIGtlcm5lbCBnZW5lcmF0ZXMgYSBwaHlzaWNhbCBJ L08uCisJCQkgKi8KKwkJCWhlYWRfcmFuZ2UtPmFkdmljZV9pc3N1ZWQgPSB0cnVlOworCQkJcGdz ci0+aW9zX2luX3Byb2dyZXNzKys7CisJCX0KKworCQkvKiBSZW1lbWJlciB0aGUgYmxvY2sgYWZ0 ZXIgdGhpcyByYW5nZSwgZm9yIHNlcXVlbmNlIGRldGVjdGlvbi4gKi8KKwkJcGdzci0+c2VxX2Js b2NrbnVtID0gYmxvY2tudW0gKyBuYmxvY2tzOworCX0KKworCS8qIENyZWF0ZSBhIG5ldyBoZWFk IHJhbmdlLiAgVGhlcmUgbXVzdCBiZSBzcGFjZS4gKi8KKwlBc3NlcnQocGdzci0+c2l6ZSA+IHBn c3ItPm1heF9waW5uZWRfYnVmZmVycyk7CisJQXNzZXJ0KChwZ3NyLT5oZWFkICsgMSkgJSBwZ3Ny LT5zaXplICE9IHBnc3ItPnRhaWwpOworCWlmICgrK3Bnc3ItPmhlYWQgPT0gcGdzci0+c2l6ZSkK KwkJcGdzci0+aGVhZCA9IDA7CisJaGVhZF9yYW5nZSA9ICZwZ3NyLT5yYW5nZXNbcGdzci0+aGVh ZF07CisJaGVhZF9yYW5nZS0+bmJsb2NrcyA9IDA7CisKKwlyZXR1cm4gaGVhZF9yYW5nZTsKK30K Kworc3RhdGljIHZvaWQKK3BnX3N0cmVhbWluZ19yZWFkX2xvb2tfYWhlYWQoUGdTdHJlYW1pbmdS ZWFkICpwZ3NyKQoreworCS8qCisJICogSWYgd2UncmUgZmluaXNoZWQgb3IgY2FuJ3Qgc3RhcnQg bW9yZSBJL08sIHRoZW4gZG9uJ3QgbG9vayBhaGVhZC4KKwkgKi8KKwlpZiAocGdzci0+ZmluaXNo ZWQgfHwgcGdzci0+aW9zX2luX3Byb2dyZXNzID09IHBnc3ItPm1heF9pb3MpCisJCXJldHVybjsK KworCS8qCisJICogV2UnbGwgYWxzbyB3YWl0IHVudGlsIHRoZSBudW1iZXIgb2YgcGlubmVkIGJ1 ZmZlcnMgZmFsbHMgYmVsb3cgb3VyCisJICogdHJpZ2dlciBsZXZlbCwgc28gdGhhdCB3ZSBoYXZl IHRoZSBjaGFuY2UgdG8gY3JlYXRlIGEgZnVsbCByYW5nZS4KKwkgKi8KKwlpZiAocGdzci0+cGlu bmVkX2J1ZmZlcnMgPj0gcGdzci0+cGlubmVkX2J1ZmZlcnNfdHJpZ2dlcikKKwkJcmV0dXJuOwor CisJZG8KKwl7CisJCUJ1ZmZlck1hbmFnZXJSZWxhdGlvbiBibXI7CisJCUZvcmtOdW1iZXIJZm9y a251bTsKKwkJQmxvY2tOdW1iZXIgYmxvY2tudW07CisJCUJ1ZmZlcgkJYnVmZmVyOworCQlib29s CQlmb3VuZDsKKwkJYm9vbAkJbmVlZF9jb21wbGV0ZTsKKwkJUGdTdHJlYW1pbmdSZWFkUmFuZ2Ug KmhlYWRfcmFuZ2U7CisJCXZvaWQJICAgKnBlcl9idWZmZXJfZGF0YTsKKworCQkvKiBEbyB3ZSBo YXZlIGEgZnVsbC1zaXplZCByYW5nZT8gKi8KKwkJaGVhZF9yYW5nZSA9ICZwZ3NyLT5yYW5nZXNb cGdzci0+aGVhZF07CisJCWlmIChoZWFkX3JhbmdlLT5uYmxvY2tzID09IGxlbmd0aG9mKGhlYWRf cmFuZ2UtPmJ1ZmZlcnMpKQorCQl7CisJCQlBc3NlcnQoaGVhZF9yYW5nZS0+bmVlZF9jb21wbGV0 ZSk7CisJCQloZWFkX3JhbmdlID0gcGdfc3RyZWFtaW5nX3JlYWRfbmV3X3JhbmdlKHBnc3IpOwor CisJCQkvKgorCQkJICogR2l2ZSB1cCBub3cgaWYgSS9PIGlzIHNhdHVyYXRlZCwgb3Igd2Ugd291 bGRuJ3QgYmUgYWJsZSBmb3JtCisJCQkgKiBhbm90aGVyIGZ1bGwgcmFuZ2UgYWZ0ZXIgdGhpcyBk dWUgdG8gdGhlIHBpbiBsaW1pdC4KKwkJCSAqLworCQkJaWYgKHBnc3ItPnBpbm5lZF9idWZmZXJz ID49IHBnc3ItPnBpbm5lZF9idWZmZXJzX3RyaWdnZXIgfHwKKwkJCQlwZ3NyLT5pb3NfaW5fcHJv Z3Jlc3MgPT0gcGdzci0+bWF4X2lvcykKKwkJCQlicmVhazsKKwkJfQorCisJCXBlcl9idWZmZXJf ZGF0YSA9IChjaGFyICopIHBnc3ItPnBlcl9idWZmZXJfZGF0YSArCisJCQlwZ3NyLT5wZXJfYnVm ZmVyX2RhdGFfc2l6ZSAqIHBnc3ItPnBlcl9idWZmZXJfZGF0YV9uZXh0OworCisJCS8qIEZpbmQg b3V0IHdoaWNoIGJsb2NrIHRoZSBjYWxsYmFjayB3YW50cyB0byByZWFkIG5leHQuICovCisJCWJs b2NrbnVtID0gcGdzci0+Y2FsbGJhY2socGdzciwgcGdzci0+cGdzcl9wcml2YXRlLCBwZXJfYnVm ZmVyX2RhdGEpOworCQlpZiAoYmxvY2tudW0gPT0gSW52YWxpZEJsb2NrTnVtYmVyKQorCQl7CisJ CQlwZ3NyLT5maW5pc2hlZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQlibXIgPSBwZ3NyLT5i bXI7CisJCWZvcmtudW0gPSBwZ3NyLT5mb3JrbnVtOworCisJCUFzc2VydChwZ3NyLT5waW5uZWRf YnVmZmVycyA8IHBnc3ItPm1heF9waW5uZWRfYnVmZmVycyk7CisKKwkJYnVmZmVyID0gUHJlcGFy ZVJlYWRCdWZmZXIoYm1yLAorCQkJCQkJCQkgICBmb3JrbnVtLAorCQkJCQkJCQkgICBibG9ja251 bSwKKwkJCQkJCQkJICAgcGdzci0+c3RyYXRlZ3ksCisJCQkJCQkJCSAgICZmb3VuZCk7CisJCXBn c3ItPnBpbm5lZF9idWZmZXJzKys7CisKKwkJbmVlZF9jb21wbGV0ZSA9ICFmb3VuZDsKKworCQkv KiBJcyB0aGVyZSBhIGhlYWQgcmFuZ2UgdGhhdCB3ZSBjYW4ndCBleHRlbmQ/ICovCisJCWhlYWRf cmFuZ2UgPSAmcGdzci0+cmFuZ2VzW3Bnc3ItPmhlYWRdOworCQlpZiAoaGVhZF9yYW5nZS0+bmJs b2NrcyA+IDAgJiYKKwkJCSghbmVlZF9jb21wbGV0ZSB8fAorCQkJICFoZWFkX3JhbmdlLT5uZWVk X2NvbXBsZXRlIHx8CisJCQkgaGVhZF9yYW5nZS0+YmxvY2tudW0gKyBoZWFkX3JhbmdlLT5uYmxv Y2tzICE9IGJsb2NrbnVtKSkKKwkJeworCQkJLyogWWVzLCB0aW1lIHRvIHN0YXJ0IGJ1aWxkaW5n IGEgbmV3IG9uZS4gKi8KKwkJCWhlYWRfcmFuZ2UgPSBwZ19zdHJlYW1pbmdfcmVhZF9uZXdfcmFu Z2UocGdzcik7CisJCQlBc3NlcnQoaGVhZF9yYW5nZS0+bmJsb2NrcyA9PSAwKTsKKwkJfQorCisJ CWlmIChoZWFkX3JhbmdlLT5uYmxvY2tzID09IDApCisJCXsKKwkJCS8qIEluaXRpYWxpemUgYSBu ZXcgcmFuZ2UgYmVnaW5uaW5nIGF0IHRoaXMgYmxvY2suICovCisJCQloZWFkX3JhbmdlLT5ibG9j a251bSA9IGJsb2NrbnVtOworCQkJaGVhZF9yYW5nZS0+bmVlZF9jb21wbGV0ZSA9IG5lZWRfY29t cGxldGU7CisJCQloZWFkX3JhbmdlLT5hZHZpY2VfaXNzdWVkID0gZmFsc2U7CisJCX0KKwkJZWxz ZQorCQl7CisJCQkvKiBXZSBjYW4gZXh0ZW5kIGFuIGV4aXN0aW5nIHJhbmdlIGJ5IG9uZSBibG9j ay4gKi8KKwkJCUFzc2VydChoZWFkX3JhbmdlLT5ibG9ja251bSArIGhlYWRfcmFuZ2UtPm5ibG9j a3MgPT0gYmxvY2tudW0pOworCQkJQXNzZXJ0KGhlYWRfcmFuZ2UtPm5lZWRfY29tcGxldGUpOwor CQl9CisKKwkJaGVhZF9yYW5nZS0+cGVyX2J1ZmZlcl9kYXRhX2luZGV4W2hlYWRfcmFuZ2UtPm5i bG9ja3NdID0gcGdzci0+cGVyX2J1ZmZlcl9kYXRhX25leHQrKzsKKwkJaGVhZF9yYW5nZS0+YnVm ZmVyc1toZWFkX3JhbmdlLT5uYmxvY2tzXSA9IGJ1ZmZlcjsKKwkJaGVhZF9yYW5nZS0+bmJsb2Nr cysrOworCisJCWlmIChwZ3NyLT5wZXJfYnVmZmVyX2RhdGFfbmV4dCA9PSBwZ3NyLT5tYXhfcGlu bmVkX2J1ZmZlcnMpCisJCQlwZ3NyLT5wZXJfYnVmZmVyX2RhdGFfbmV4dCA9IDA7CisKKwl9IHdo aWxlIChwZ3NyLT5waW5uZWRfYnVmZmVycyA8IHBnc3ItPm1heF9waW5uZWRfYnVmZmVycyAmJgor CQkJIHBnc3ItPmlvc19pbl9wcm9ncmVzcyA8IHBnc3ItPm1heF9pb3MpOworCisJaWYgKHBnc3It PnJhbmdlc1twZ3NyLT5oZWFkXS5uYmxvY2tzID4gMCkKKwkJcGdfc3RyZWFtaW5nX3JlYWRfbmV3 X3JhbmdlKHBnc3IpOworfQorCitCdWZmZXIKK3BnX3N0cmVhbWluZ19yZWFkX2J1ZmZlcl9nZXRf bmV4dChQZ1N0cmVhbWluZ1JlYWQgKnBnc3IsIHZvaWQgKipwZXJfYnVmZmVyX2RhdGEpCit7CisJ cGdfc3RyZWFtaW5nX3JlYWRfbG9va19haGVhZChwZ3NyKTsKKworCS8qIFNlZSBpZiB3ZSBoYXZl IG9uZSBidWZmZXIgdG8gcmV0dXJuLiAqLworCXdoaWxlIChwZ3NyLT50YWlsICE9IHBnc3ItPmhl YWQpCisJeworCQlQZ1N0cmVhbWluZ1JlYWRSYW5nZSAqdGFpbF9yYW5nZTsKKworCQl0YWlsX3Jh bmdlID0gJnBnc3ItPnJhbmdlc1twZ3NyLT50YWlsXTsKKworCQkvKgorCQkgKiBEbyB3ZSBuZWVk IHRvIHBlcmZvcm0gYW4gSS9PIGJlZm9yZSByZXR1cm5pbmcgdGhlIGJ1ZmZlcnMgZnJvbSB0aGlz CisJCSAqIHJhbmdlPworCQkgKi8KKwkJaWYgKHRhaWxfcmFuZ2UtPm5lZWRfY29tcGxldGUpCisJ CXsKKwkJCUNvbXBsZXRlUmVhZEJ1ZmZlcnMocGdzci0+Ym1yLAorCQkJCQkJCQl0YWlsX3Jhbmdl LT5idWZmZXJzLAorCQkJCQkJCQlwZ3NyLT5mb3JrbnVtLAorCQkJCQkJCQl0YWlsX3JhbmdlLT5i bG9ja251bSwKKwkJCQkJCQkJdGFpbF9yYW5nZS0+bmJsb2NrcywKKwkJCQkJCQkJZmFsc2UsCisJ CQkJCQkJCXBnc3ItPnN0cmF0ZWd5KTsKKwkJCXRhaWxfcmFuZ2UtPm5lZWRfY29tcGxldGUgPSBm YWxzZTsKKworCQkJLyoKKwkJCSAqIFdlIGRvbid0IHJlYWxseSBrbm93IGlmIHRoZSBrZXJuZWwg Z2VuZXJhdGVkIGFuIHBoeXNpY2FsIEkvTworCQkJICogd2hlbiB3ZSBpc3N1ZWQgYWR2aWNlLCBs ZXQgYWxvbmUgd2hlbiBpdCBmaW5pc2hlZCwgYnV0IGl0IGhhcworCQkJICogY2VydGFpbmx5IGZp bmlzaGVkIGFmdGVyIGEgcmVhZCBjYWxsIHJldHVybnMuCisJCQkgKi8KKwkJCWlmICh0YWlsX3Jh bmdlLT5hZHZpY2VfaXNzdWVkKQorCQkJCXBnc3ItPmlvc19pbl9wcm9ncmVzcy0tOworCQl9CisK KwkJLyogQXJlIHRoZXJlIG1vcmUgYnVmZmVycyBhdmFpbGFibGUgaW4gdGhpcyByYW5nZT8gKi8K KwkJaWYgKHBnc3ItPm5leHRfdGFpbF9idWZmZXIgPCB0YWlsX3JhbmdlLT5uYmxvY2tzKQorCQl7 CisJCQlpbnQJCQlidWZmZXJfaW5kZXg7CisJCQlCdWZmZXIJCWJ1ZmZlcjsKKworCQkJYnVmZmVy X2luZGV4ID0gcGdzci0+bmV4dF90YWlsX2J1ZmZlcisrOworCQkJYnVmZmVyID0gdGFpbF9yYW5n ZS0+YnVmZmVyc1tidWZmZXJfaW5kZXhdOworCisJCQlBc3NlcnQoQnVmZmVySXNWYWxpZChidWZm ZXIpKTsKKworCQkJLyogV2UgYXJlIGdpdmluZyBhd2F5IG93bmVyc2hpcCBvZiB0aGlzIHBpbm5l ZCBidWZmZXIuICovCisJCQlBc3NlcnQocGdzci0+cGlubmVkX2J1ZmZlcnMgPiAwKTsKKwkJCXBn c3ItPnBpbm5lZF9idWZmZXJzLS07CisKKwkJCWlmIChwZXJfYnVmZmVyX2RhdGEpCisJCQkJKnBl cl9idWZmZXJfZGF0YSA9IChjaGFyICopIHBnc3ItPnBlcl9idWZmZXJfZGF0YSArCisJCQkJCXRh aWxfcmFuZ2UtPnBlcl9idWZmZXJfZGF0YV9pbmRleFtidWZmZXJfaW5kZXhdICoKKwkJCQkJcGdz ci0+cGVyX2J1ZmZlcl9kYXRhX3NpemU7CisKKwkJCXJldHVybiBidWZmZXI7CisJCX0KKworCQkv KiBBZHZhbmNlIHRhaWwgdG8gbmV4dCByYW5nZSwgaWYgdGhlcmUgaXMgb25lLiAqLworCQlpZiAo KytwZ3NyLT50YWlsID09IHBnc3ItPnNpemUpCisJCQlwZ3NyLT50YWlsID0gMDsKKwkJcGdzci0+ bmV4dF90YWlsX2J1ZmZlciA9IDA7CisJfQorCisJQXNzZXJ0KHBnc3ItPnBpbm5lZF9idWZmZXJz ID09IDApOworCisJcmV0dXJuIEludmFsaWRCdWZmZXI7Cit9CisKK3ZvaWQKK3BnX3N0cmVhbWlu Z19yZWFkX2ZyZWUoUGdTdHJlYW1pbmdSZWFkICpwZ3NyKQoreworCUJ1ZmZlcgkJYnVmZmVyOwor CisJLyogU3RvcCBsb29raW5nIGFoZWFkLCBhbmQgdW5waW4gYW55dGhpbmcgdGhhdCB3YXNuJ3Qg Y29uc3VtZWQuICovCisJcGdzci0+ZmluaXNoZWQgPSB0cnVlOworCXdoaWxlICgoYnVmZmVyID0g cGdfc3RyZWFtaW5nX3JlYWRfYnVmZmVyX2dldF9uZXh0KHBnc3IsIE5VTEwpKSAhPSBJbnZhbGlk QnVmZmVyKQorCQlSZWxlYXNlQnVmZmVyKGJ1ZmZlcik7CisKKwlpZiAocGdzci0+cGVyX2J1ZmZl cl9kYXRhKQorCQlwZnJlZShwZ3NyLT5wZXJfYnVmZmVyX2RhdGEpOworCXBmcmVlKHBnc3IpOwor fQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmbWdyLmMgYi9zcmMv YmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYwppbmRleCA3ZDYwMWJlZjZkLi4yMTU3YTk3 Yjk3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYworKysg Yi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYwpAQCAtNDcyLDcgKzQ3Miw3IEBA IEZvcmdldFByaXZhdGVSZWZDb3VudEVudHJ5KFByaXZhdGVSZWZDb3VudEVudHJ5ICpyZWYpCiAp CiAKIAotc3RhdGljIEJ1ZmZlciBSZWFkQnVmZmVyX2NvbW1vbihTTWdyUmVsYXRpb24gc21nciwg Y2hhciByZWxwZXJzaXN0ZW5jZSwKK3N0YXRpYyBCdWZmZXIgUmVhZEJ1ZmZlcl9jb21tb24oQnVm ZmVyTWFuYWdlclJlbGF0aW9uIGJtciwKIAkJCQkJCQkJRm9ya051bWJlciBmb3JrTnVtLCBCbG9j a051bWJlciBibG9ja051bSwKIAkJCQkJCQkJUmVhZEJ1ZmZlck1vZGUgbW9kZSwgQnVmZmVyQWNj ZXNzU3RyYXRlZ3kgc3RyYXRlZ3ksCiAJCQkJCQkJCWJvb2wgKmhpdCk7CkBAIC01MDEsNyArNTAx LDcgQEAgc3RhdGljIHVpbnQzMiBXYWl0QnVmSGRyVW5sb2NrZWQoQnVmZmVyRGVzYyAqYnVmKTsK IHN0YXRpYyBpbnQJU3luY09uZUJ1ZmZlcihpbnQgYnVmX2lkLCBib29sIHNraXBfcmVjZW50bHlf dXNlZCwKIAkJCQkJCSAgV3JpdGViYWNrQ29udGV4dCAqd2JfY29udGV4dCk7CiBzdGF0aWMgdm9p ZCBXYWl0SU8oQnVmZmVyRGVzYyAqYnVmKTsKLXN0YXRpYyBib29sIFN0YXJ0QnVmZmVySU8oQnVm ZmVyRGVzYyAqYnVmLCBib29sIGZvcklucHV0KTsKK3N0YXRpYyBib29sIFN0YXJ0QnVmZmVySU8o QnVmZmVyRGVzYyAqYnVmLCBib29sIGZvcklucHV0LCBib29sIG5vd2FpdCk7CiBzdGF0aWMgdm9p ZCBUZXJtaW5hdGVCdWZmZXJJTyhCdWZmZXJEZXNjICpidWYsIGJvb2wgY2xlYXJfZGlydHksCiAJ CQkJCQkJICB1aW50MzIgc2V0X2ZsYWdfYml0cywgYm9vbCBmb3JnZXRfb3duZXIpOwogc3RhdGlj IHZvaWQgQWJvcnRCdWZmZXJJTyhCdWZmZXIgYnVmZmVyKTsKQEAgLTc5NSwxNSArNzk1LDkgQEAg UmVhZEJ1ZmZlckV4dGVuZGVkKFJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya051bSwgQmxv Y2tOdW1iZXIgYmxvY2tOdW0sCiAJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQ T1JURUQpLAogCQkJCSBlcnJtc2coImNhbm5vdCBhY2Nlc3MgdGVtcG9yYXJ5IHRhYmxlcyBvZiBv dGhlciBzZXNzaW9ucyIpKSk7CiAKLQkvKgotCSAqIFJlYWQgdGhlIGJ1ZmZlciwgYW5kIHVwZGF0 ZSBwZ3N0YXQgY291bnRlcnMgdG8gcmVmbGVjdCBhIGNhY2hlIGhpdCBvcgotCSAqIG1pc3MuCi0J ICovCi0JcGdzdGF0X2NvdW50X2J1ZmZlcl9yZWFkKHJlbG4pOwotCWJ1ZiA9IFJlYWRCdWZmZXJf Y29tbW9uKFJlbGF0aW9uR2V0U21ncihyZWxuKSwgcmVsbi0+cmRfcmVsLT5yZWxwZXJzaXN0ZW5j ZSwKKwlidWYgPSBSZWFkQnVmZmVyX2NvbW1vbihCTVJfUkVMKHJlbG4pLAogCQkJCQkJCWZvcmtO dW0sIGJsb2NrTnVtLCBtb2RlLCBzdHJhdGVneSwgJmhpdCk7Ci0JaWYgKGhpdCkKLQkJcGdzdGF0 X2NvdW50X2J1ZmZlcl9oaXQocmVsbik7CisKIAlyZXR1cm4gYnVmOwogfQogCkBAIC04MjcsOCAr ODIxLDkgQEAgUmVhZEJ1ZmZlcldpdGhvdXRSZWxjYWNoZShSZWxGaWxlTG9jYXRvciBybG9jYXRv ciwgRm9ya051bWJlciBmb3JrTnVtLAogCiAJU01nclJlbGF0aW9uIHNtZ3IgPSBzbWdyb3Blbihy bG9jYXRvciwgSW52YWxpZEJhY2tlbmRJZCk7CiAKLQlyZXR1cm4gUmVhZEJ1ZmZlcl9jb21tb24o c21nciwgcGVybWFuZW50ID8gUkVMUEVSU0lTVEVOQ0VfUEVSTUFORU5UIDoKLQkJCQkJCQkgUkVM UEVSU0lTVEVOQ0VfVU5MT0dHRUQsIGZvcmtOdW0sIGJsb2NrTnVtLAorCXJldHVybiBSZWFkQnVm ZmVyX2NvbW1vbihCTVJfU01HUihzbWdyLCBwZXJtYW5lbnQgPyBSRUxQRVJTSVNURU5DRV9QRVJN QU5FTlQgOgorCQkJCQkJCQkJICBSRUxQRVJTSVNURU5DRV9VTkxPR0dFRCksCisJCQkJCQkJIGZv cmtOdW0sIGJsb2NrTnVtLAogCQkJCQkJCSBtb2RlLCBzdHJhdGVneSwgJmhpdCk7CiB9CiAKQEAg LTEwMDIsNyArOTk3LDcgQEAgRXh0ZW5kQnVmZmVyZWRSZWxUbyhCdWZmZXJNYW5hZ2VyUmVsYXRp b24gYm1yLAogCQlib29sCQloaXQ7CiAKIAkJQXNzZXJ0KGV4dGVuZGVkX2J5ID09IDApOwotCQli dWZmZXIgPSBSZWFkQnVmZmVyX2NvbW1vbihibXIuc21nciwgYm1yLnJlbHBlcnNpc3RlbmNlLAor CQlidWZmZXIgPSBSZWFkQnVmZmVyX2NvbW1vbihibXIsCiAJCQkJCQkJCSAgIGZvcmssIGV4dGVu ZF90byAtIDEsIG1vZGUsIHN0cmF0ZWd5LAogCQkJCQkJCQkgICAmaGl0KTsKIAl9CkBAIC0xMDE2 LDE4ICsxMDExLDExIEBAIEV4dGVuZEJ1ZmZlcmVkUmVsVG8oQnVmZmVyTWFuYWdlclJlbGF0aW9u IGJtciwKICAqICpoaXQgaXMgc2V0IHRvIHRydWUgaWYgdGhlIHJlcXVlc3Qgd2FzIHNhdGlzZmll ZCBmcm9tIHNoYXJlZCBidWZmZXIgY2FjaGUuCiAgKi8KIHN0YXRpYyBCdWZmZXIKLVJlYWRCdWZm ZXJfY29tbW9uKFNNZ3JSZWxhdGlvbiBzbWdyLCBjaGFyIHJlbHBlcnNpc3RlbmNlLCBGb3JrTnVt YmVyIGZvcmtOdW0sCitSZWFkQnVmZmVyX2NvbW1vbihCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1y LCBGb3JrTnVtYmVyIGZvcmtOdW0sCiAJCQkJICBCbG9ja051bWJlciBibG9ja051bSwgUmVhZEJ1 ZmZlck1vZGUgbW9kZSwKIAkJCQkgIEJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5LCBib29s ICpoaXQpCiB7Ci0JQnVmZmVyRGVzYyAqYnVmSGRyOwotCUJsb2NrCQlidWZCbG9jazsKLQlib29s CQlmb3VuZDsKLQlJT0NvbnRleHQJaW9fY29udGV4dDsKLQlJT09iamVjdAlpb19vYmplY3Q7Ci0J Ym9vbAkJaXNMb2NhbEJ1ZiA9IFNtZ3JJc1RlbXAoc21ncik7Ci0KLQkqaGl0ID0gZmFsc2U7CisJ QnVmZmVyCQlidWZmZXI7CiAKIAkvKgogCSAqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcGF0aCwg bW9zdCBjb2RlIHNob3VsZCB1c2UgRXh0ZW5kQnVmZmVyZWRSZWwoKQpAQCAtMTA0NiwxNzUgKzEw MzQsMzM5IEBAIFJlYWRCdWZmZXJfY29tbW9uKFNNZ3JSZWxhdGlvbiBzbWdyLCBjaGFyIHJlbHBl cnNpc3RlbmNlLCBGb3JrTnVtYmVyIGZvcmtOdW0sCiAJCWlmIChtb2RlID09IFJCTV9aRVJPX0FO RF9MT0NLIHx8IG1vZGUgPT0gUkJNX1pFUk9fQU5EX0NMRUFOVVBfTE9DSykKIAkJCWZsYWdzIHw9 IEVCX0xPQ0tfRklSU1Q7CiAKLQkJcmV0dXJuIEV4dGVuZEJ1ZmZlcmVkUmVsKEJNUl9TTUdSKHNt Z3IsIHJlbHBlcnNpc3RlbmNlKSwKLQkJCQkJCQkJIGZvcmtOdW0sIHN0cmF0ZWd5LCBmbGFncyk7 CisJCSpoaXQgPSBmYWxzZTsKKworCQlyZXR1cm4gRXh0ZW5kQnVmZmVyZWRSZWwoYm1yLCBmb3Jr TnVtLCBzdHJhdGVneSwgZmxhZ3MpOwogCX0KIAotCVRSQUNFX1BPU1RHUkVTUUxfQlVGRkVSX1JF QURfU1RBUlQoZm9ya051bSwgYmxvY2tOdW0sCi0JCQkJCQkJCQkgICBzbWdyLT5zbWdyX3Jsb2Nh dG9yLmxvY2F0b3Iuc3BjT2lkLAotCQkJCQkJCQkJICAgc21nci0+c21ncl9ybG9jYXRvci5sb2Nh dG9yLmRiT2lkLAotCQkJCQkJCQkJICAgc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLnJlbE51 bWJlciwKLQkJCQkJCQkJCSAgIHNtZ3ItPnNtZ3JfcmxvY2F0b3IuYmFja2VuZCk7CisJYnVmZmVy ID0gUHJlcGFyZVJlYWRCdWZmZXIoYm1yLAorCQkJCQkJCSAgIGZvcmtOdW0sCisJCQkJCQkJICAg YmxvY2tOdW0sCisJCQkJCQkJICAgc3RyYXRlZ3ksCisJCQkJCQkJICAgaGl0KTsKKworCS8qIEF0 IHRoaXMgcG9pbnQgd2UgZG8gTk9UIGhvbGQgYW55IGxvY2tzLiAqLwogCisJaWYgKG1vZGUgPT0g UkJNX1pFUk9fQU5EX0NMRUFOVVBfTE9DSyB8fCBtb2RlID09IFJCTV9aRVJPX0FORF9MT0NLKQor CXsKKwkJLyogaWYgd2UganVzdCB3YW50IHplcm9lcyBhbmQgYSBsb2NrLCB3ZSdyZSBkb25lICov CisJCVplcm9CdWZmZXIoYnVmZmVyLCBtb2RlKTsKKwl9CisJZWxzZSBpZiAoISpoaXQpCisJewor CQkvKiB3ZSBtaWdodCBuZWVkIHRvIHBlcmZvcm0gSS9PICovCisJCUNvbXBsZXRlUmVhZEJ1ZmZl cnMoYm1yLAorCQkJCQkJCSZidWZmZXIsCisJCQkJCQkJZm9ya051bSwKKwkJCQkJCQlibG9ja051 bSwKKwkJCQkJCQkxLAorCQkJCQkJCW1vZGUgPT0gUkJNX1pFUk9fT05fRVJST1IsCisJCQkJCQkJ c3RyYXRlZ3kpOworCX0KKworCXJldHVybiBidWZmZXI7Cit9CisKKy8qCisgKiBQcmVwYXJlIHRv IHJlYWQgYSBibG9jay4gIFRoZSBidWZmZXIgaXMgcGlubmVkLiAgSWYgdGhpcyBpcyBhICdoaXQn LCB0aGVuCisgKiB0aGUgcmV0dXJuZWQgYnVmZmVyIGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5LiAg T3RoZXJ3aXNlLCBhIHBoeXNpY2FsIHJlYWQKKyAqIHNob3VsZCBiZSBjb21wbGV0ZWQgd2l0aCBD b21wbGV0ZVJlYWRCdWZmZXJzKCksIG9yIHRoZSBidWZmZXIgc2hvdWxkIGJlCisgKiB6ZXJvZWQg d2l0aCBaZXJvQnVmZmVyKCkuICBQcmVwYXJlUmVhZEJ1ZmZlcigpIGZvbGxvd2VkIGJ5CisgKiBD b21wbGV0ZVJlYWRCdWZmZXJzKCkgb3IgWmVyb0J1ZmZlcigpIGlzIGVxdWl2YWxlbnQgdG8gUmVh ZEJ1ZmZlcigpLCBidXQKKyAqIHRoZSBjYWxsZXIgaGFzIHRoZSBvcHBvcnR1bml0eSB0byBjb21i aW5lIHJlYWRzIG9mIG11bHRpcGxlIG5laWdoYm9yaW5nCisgKiBibG9ja3MgaW50byBvbmUgQ29t cGxldGVSZWFkQnVmZmVycygpIGNhbGwuCisgKgorICogKmZvdW5kUHRyIGlzIHNldCB0byB0cnVl IGZvciBhIGhpdCwgYW5kIGZhbHNlIGZvciBhIG1pc3MuCisgKi8KK0J1ZmZlcgorUHJlcGFyZVJl YWRCdWZmZXIoQnVmZmVyTWFuYWdlclJlbGF0aW9uIGJtciwKKwkJCQkgIEZvcmtOdW1iZXIgZm9y a051bSwKKwkJCQkgIEJsb2NrTnVtYmVyIGJsb2NrTnVtLAorCQkJCSAgQnVmZmVyQWNjZXNzU3Ry YXRlZ3kgc3RyYXRlZ3ksCisJCQkJICBib29sICpmb3VuZFB0cikKK3sKKwlCdWZmZXJEZXNjICpi dWZIZHI7CisJYm9vbAkJaXNMb2NhbEJ1ZjsKKwlJT0NvbnRleHQJaW9fY29udGV4dDsKKwlJT09i amVjdAlpb19vYmplY3Q7CisKKwlBc3NlcnQoYmxvY2tOdW0gIT0gUF9ORVcpOworCisJaWYgKGJt ci5yZWwpCisJeworCQlibXIuc21nciA9IFJlbGF0aW9uR2V0U21ncihibXIucmVsKTsKKwkJYm1y LnJlbHBlcnNpc3RlbmNlID0gYm1yLnJlbC0+cmRfcmVsLT5yZWxwZXJzaXN0ZW5jZTsKKwl9CisK Kwlpc0xvY2FsQnVmID0gU21ncklzVGVtcChibXIuc21ncik7CiAJaWYgKGlzTG9jYWxCdWYpCiAJ ewotCQkvKgotCQkgKiBXZSBkbyBub3QgdXNlIGEgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgZm9yIEkv TyBvZiB0ZW1wb3JhcnkgdGFibGVzLgotCQkgKiBIb3dldmVyLCBpbiBzb21lIGNhc2VzLCB0aGUg InN0cmF0ZWd5IiBtYXkgbm90IGJlIE5VTEwsIHNvIHdlIGNhbid0Ci0JCSAqIHJlbHkgb24gSU9D b250ZXh0Rm9yU3RyYXRlZ3koKSB0byBzZXQgdGhlIHJpZ2h0IElPQ29udGV4dCBmb3IgdXMuCi0J CSAqIFRoaXMgbWF5IGhhcHBlbiBpbiBjYXNlcyBsaWtlIENSRUFURSBURU1QT1JBUlkgVEFCTEUg QVMuLi4KLQkJICovCiAJCWlvX2NvbnRleHQgPSBJT0NPTlRFWFRfTk9STUFMOwogCQlpb19vYmpl Y3QgPSBJT09CSkVDVF9URU1QX1JFTEFUSU9OOwotCQlidWZIZHIgPSBMb2NhbEJ1ZmZlckFsbG9j KHNtZ3IsIGZvcmtOdW0sIGJsb2NrTnVtLCAmZm91bmQpOwotCQlpZiAoZm91bmQpCi0JCQlwZ0J1 ZmZlclVzYWdlLmxvY2FsX2Jsa3NfaGl0Kys7Ci0JCWVsc2UgaWYgKG1vZGUgPT0gUkJNX05PUk1B TCB8fCBtb2RlID09IFJCTV9OT1JNQUxfTk9fTE9HIHx8Ci0JCQkJIG1vZGUgPT0gUkJNX1pFUk9f T05fRVJST1IpCi0JCQlwZ0J1ZmZlclVzYWdlLmxvY2FsX2Jsa3NfcmVhZCsrOwogCX0KIAllbHNl CiAJewotCQkvKgotCQkgKiBsb29rdXAgdGhlIGJ1ZmZlci4gIElPX0lOX1BST0dSRVNTIGlzIHNl dCBpZiB0aGUgcmVxdWVzdGVkIGJsb2NrIGlzCi0JCSAqIG5vdCBjdXJyZW50bHkgaW4gbWVtb3J5 LgotCQkgKi8KIAkJaW9fY29udGV4dCA9IElPQ29udGV4dEZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsK IAkJaW9fb2JqZWN0ID0gSU9PQkpFQ1RfUkVMQVRJT047Ci0JCWJ1ZkhkciA9IEJ1ZmZlckFsbG9j KHNtZ3IsIHJlbHBlcnNpc3RlbmNlLCBmb3JrTnVtLCBibG9ja051bSwKLQkJCQkJCQkgc3RyYXRl Z3ksICZmb3VuZCwgaW9fY29udGV4dCk7Ci0JCWlmIChmb3VuZCkKLQkJCXBnQnVmZmVyVXNhZ2Uu c2hhcmVkX2Jsa3NfaGl0Kys7Ci0JCWVsc2UgaWYgKG1vZGUgPT0gUkJNX05PUk1BTCB8fCBtb2Rl ID09IFJCTV9OT1JNQUxfTk9fTE9HIHx8Ci0JCQkJIG1vZGUgPT0gUkJNX1pFUk9fT05fRVJST1Ip Ci0JCQlwZ0J1ZmZlclVzYWdlLnNoYXJlZF9ibGtzX3JlYWQrKzsKIAl9CiAKLQkvKiBBdCB0aGlz IHBvaW50IHdlIGRvIE5PVCBob2xkIGFueSBsb2Nrcy4gKi8KKwlUUkFDRV9QT1NUR1JFU1FMX0JV RkZFUl9SRUFEX1NUQVJUKGZvcmtOdW0sIGJsb2NrTnVtLAorCQkJCQkJCQkJICAgYm1yLnNtZ3It PnNtZ3JfcmxvY2F0b3IubG9jYXRvci5zcGNPaWQsCisJCQkJCQkJCQkgICBibXIuc21nci0+c21n cl9ybG9jYXRvci5sb2NhdG9yLmRiT2lkLAorCQkJCQkJCQkJICAgYm1yLnNtZ3ItPnNtZ3Jfcmxv Y2F0b3IubG9jYXRvci5yZWxOdW1iZXIsCisJCQkJCQkJCQkgICBibXIuc21nci0+c21ncl9ybG9j YXRvci5iYWNrZW5kKTsKIAotCS8qIGlmIGl0IHdhcyBhbHJlYWR5IGluIHRoZSBidWZmZXIgcG9v bCwgd2UncmUgZG9uZSAqLwotCWlmIChmb3VuZCkKKwlSZXNvdXJjZU93bmVyRW5sYXJnZShDdXJy ZW50UmVzb3VyY2VPd25lcik7CisJaWYgKGlzTG9jYWxCdWYpCisJeworCQlidWZIZHIgPSBMb2Nh bEJ1ZmZlckFsbG9jKGJtci5zbWdyLCBmb3JrTnVtLCBibG9ja051bSwgZm91bmRQdHIpOworCQlp ZiAoKmZvdW5kUHRyKQorCQkJcGdCdWZmZXJVc2FnZS5sb2NhbF9ibGtzX2hpdCsrOworCX0KKwll bHNlCisJeworCQlidWZIZHIgPSBCdWZmZXJBbGxvYyhibXIuc21nciwgYm1yLnJlbHBlcnNpc3Rl bmNlLCBmb3JrTnVtLCBibG9ja051bSwKKwkJCQkJCQkgc3RyYXRlZ3ksIGZvdW5kUHRyLCBpb19j b250ZXh0KTsKKwkJaWYgKCpmb3VuZFB0cikKKwkJCXBnQnVmZmVyVXNhZ2Uuc2hhcmVkX2Jsa3Nf aGl0Kys7CisJfQorCWlmIChibXIucmVsKQorCXsKKwkJLyoKKwkJICogV2hpbGUgcGdCdWZmZXJV c2FnZSdzICJyZWFkIiBjb3VudGVyIGlzbid0IGJ1bXBlZCB1bmxlc3Mgd2UgcmVhY2gKKwkJICog Q29tcGxldGVSZWFkQnVmZmVycygpIChzbywgbm90IGZvciBoaXRzLCBhbmQgbm90IGZvciBidWZm ZXJzIHRoYXQKKwkJICogYXJlIHplcm9lZCBpbnN0ZWFkKSwgdGhlIHBlci1yZWxhdGlvbiBzdGF0 cyBhbHdheXMgY291bnQgdGhlbS4KKwkJICovCisJCXBnc3RhdF9jb3VudF9idWZmZXJfcmVhZChi bXIucmVsKTsKKwkJaWYgKCpmb3VuZFB0cikKKwkJCXBnc3RhdF9jb3VudF9idWZmZXJfaGl0KGJt ci5yZWwpOworCX0KKwlpZiAoKmZvdW5kUHRyKQogCXsKLQkJLyogSnVzdCBuZWVkIHRvIHVwZGF0 ZSBzdGF0cyBiZWZvcmUgd2UgZXhpdCAqLwotCQkqaGl0ID0gdHJ1ZTsKIAkJVmFjdXVtUGFnZUhp dCsrOwogCQlwZ3N0YXRfY291bnRfaW9fb3AoaW9fb2JqZWN0LCBpb19jb250ZXh0LCBJT09QX0hJ VCk7Ci0KIAkJaWYgKFZhY3V1bUNvc3RBY3RpdmUpCiAJCQlWYWN1dW1Db3N0QmFsYW5jZSArPSBW YWN1dW1Db3N0UGFnZUhpdDsKIAogCQlUUkFDRV9QT1NUR1JFU1FMX0JVRkZFUl9SRUFEX0RPTkUo Zm9ya051bSwgYmxvY2tOdW0sCi0JCQkJCQkJCQkJICBzbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0 b3Iuc3BjT2lkLAotCQkJCQkJCQkJCSAgc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLmRiT2lk LAotCQkJCQkJCQkJCSAgc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLnJlbE51bWJlciwKLQkJ CQkJCQkJCQkgIHNtZ3ItPnNtZ3JfcmxvY2F0b3IuYmFja2VuZCwKLQkJCQkJCQkJCQkgIGZvdW5k KTsKKwkJCQkJCQkJCQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3Iuc3BjT2lkLAor CQkJCQkJCQkJCSAgYm1yLnNtZ3ItPnNtZ3JfcmxvY2F0b3IubG9jYXRvci5kYk9pZCwKKwkJCQkJ CQkJCQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3IucmVsTnVtYmVyLAorCQkJCQkJ CQkJCSAgYm1yLnNtZ3ItPnNtZ3JfcmxvY2F0b3IuYmFja2VuZCwKKwkJCQkJCQkJCQkgIHRydWUp OworCX0KIAotCQkvKgotCQkgKiBJbiBSQk1fWkVST19BTkRfTE9DSyBtb2RlIHRoZSBjYWxsZXIg ZXhwZWN0cyB0aGUgcGFnZSB0byBiZSBsb2NrZWQKLQkJICogb24gcmV0dXJuLgotCQkgKi8KLQkJ aWYgKCFpc0xvY2FsQnVmKQotCQl7Ci0JCQlpZiAobW9kZSA9PSBSQk1fWkVST19BTkRfTE9DSykK LQkJCQlMV0xvY2tBY3F1aXJlKEJ1ZmZlckRlc2NyaXB0b3JHZXRDb250ZW50TG9jayhidWZIZHIp LAotCQkJCQkJCSAgTFdfRVhDTFVTSVZFKTsKLQkJCWVsc2UgaWYgKG1vZGUgPT0gUkJNX1pFUk9f QU5EX0NMRUFOVVBfTE9DSykKLQkJCQlMb2NrQnVmZmVyRm9yQ2xlYW51cChCdWZmZXJEZXNjcmlw dG9yR2V0QnVmZmVyKGJ1ZkhkcikpOwotCQl9CisJcmV0dXJuIEJ1ZmZlckRlc2NyaXB0b3JHZXRC dWZmZXIoYnVmSGRyKTsKK30KIAotCQlyZXR1cm4gQnVmZmVyRGVzY3JpcHRvckdldEJ1ZmZlcihi dWZIZHIpOworc3RhdGljIGlubGluZSBib29sCitDb21wbGV0ZVJlYWRCdWZmZXJzQ2FuU3RhcnRJ TyhCdWZmZXIgYnVmZmVyLCBib29sIG5vd2FpdCkKK3sKKwlpZiAoQnVmZmVySXNMb2NhbChidWZm ZXIpKQorCXsKKwkJQnVmZmVyRGVzYyAqYnVmSGRyID0gR2V0TG9jYWxCdWZmZXJEZXNjcmlwdG9y KC1idWZmZXIgLSAxKTsKKworCQlyZXR1cm4gKHBnX2F0b21pY19yZWFkX3UzMigmYnVmSGRyLT5z dGF0ZSkgJiBCTV9WQUxJRCkgPT0gMDsKIAl9CisJZWxzZQorCQlyZXR1cm4gU3RhcnRCdWZmZXJJ TyhHZXRCdWZmZXJEZXNjcmlwdG9yKGJ1ZmZlciAtIDEpLCB0cnVlLCBub3dhaXQpOworfQogCi0J LyoKLQkgKiBpZiB3ZSBoYXZlIGdvdHRlbiB0byB0aGlzIHBvaW50LCB3ZSBoYXZlIGFsbG9jYXRl ZCBhIGJ1ZmZlciBmb3IgdGhlCi0JICogcGFnZSBidXQgaXRzIGNvbnRlbnRzIGFyZSBub3QgeWV0 IHZhbGlkLiAgSU9fSU5fUFJPR1JFU1MgaXMgc2V0IGZvciBpdCwKLQkgKiBpZiBpdCdzIGEgc2hh cmVkIGJ1ZmZlci4KLQkgKi8KLQlBc3NlcnQoIShwZ19hdG9taWNfcmVhZF91MzIoJmJ1Zkhkci0+ c3RhdGUpICYgQk1fVkFMSUQpKTsJLyogc3BpbmxvY2sgbm90IG5lZWRlZCAqLworLyoKKyAqIENv bXBsZXRlIGEgc2V0IHJlYWRzIHByZXBhcmVkIHdpdGggUHJlcGFyZVJlYWRCdWZmZXJzKCkuICBU aGUgYnVmZmVycyBtdXN0CisgKiBjb3ZlciBhIGNsdXN0ZXIgb2YgbmVpZ2hib3JpbmcgYmxvY2sg bnVtYmVycy4KKyAqCisgKiBUeXBpY2FsbHkgdGhpcyBwZXJmb3JtcyBvbmUgcGh5c2ljYWwgdmVj dG9yIHJlYWQgY292ZXJpbmcgdGhlIGJsb2NrIHJhbmdlLAorICogYnV0IGlmIHNvbWUgb2YgdGhl IGJ1ZmZlcnMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBpbiB0aGUgbWVhbnRpbWUgYnkgYW55Cisg KiBiYWNrZW5kLCB6ZXJvIG9yIG11bHRpcGxlIHJlYWRzIG1heSBiZSBwZXJmb3JtZWQuCisgKi8K K3ZvaWQKK0NvbXBsZXRlUmVhZEJ1ZmZlcnMoQnVmZmVyTWFuYWdlclJlbGF0aW9uIGJtciwKKwkJ CQkJQnVmZmVyICpidWZmZXJzLAorCQkJCQlGb3JrTnVtYmVyIGZvcmtudW0sCisJCQkJCUJsb2Nr TnVtYmVyIGJsb2NrbnVtLAorCQkJCQlpbnQgbmJsb2NrcywKKwkJCQkJYm9vbCB6ZXJvX29uX2Vy cm9yLAorCQkJCQlCdWZmZXJBY2Nlc3NTdHJhdGVneSBzdHJhdGVneSkKK3sKKwlib29sCQlpc0xv Y2FsQnVmOworCUlPQ29udGV4dAlpb19jb250ZXh0OworCUlPT2JqZWN0CWlvX29iamVjdDsKIAot CWJ1ZkJsb2NrID0gaXNMb2NhbEJ1ZiA/IExvY2FsQnVmSGRyR2V0QmxvY2soYnVmSGRyKSA6IEJ1 ZkhkckdldEJsb2NrKGJ1Zkhkcik7CisJaWYgKGJtci5yZWwpCisJeworCQlibXIuc21nciA9IFJl bGF0aW9uR2V0U21ncihibXIucmVsKTsKKwkJYm1yLnJlbHBlcnNpc3RlbmNlID0gYm1yLnJlbC0+ cmRfcmVsLT5yZWxwZXJzaXN0ZW5jZTsKKwl9CisKKwlpc0xvY2FsQnVmID0gU21ncklzVGVtcChi bXIuc21ncik7CisJaWYgKGlzTG9jYWxCdWYpCisJeworCQlpb19jb250ZXh0ID0gSU9DT05URVhU X05PUk1BTDsKKwkJaW9fb2JqZWN0ID0gSU9PQkpFQ1RfVEVNUF9SRUxBVElPTjsKKwl9CisJZWxz ZQorCXsKKwkJaW9fY29udGV4dCA9IElPQ29udGV4dEZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKKwkJ aW9fb2JqZWN0ID0gSU9PQkpFQ1RfUkVMQVRJT047CisJfQogCiAJLyoKLQkgKiBSZWFkIGluIHRo ZSBwYWdlLCB1bmxlc3MgdGhlIGNhbGxlciBpbnRlbmRzIHRvIG92ZXJ3cml0ZSBpdCBhbmQganVz dAotCSAqIHdhbnRzIHVzIHRvIGFsbG9jYXRlIGEgYnVmZmVyLgorCSAqIFdlIGNvdW50IGFsbCB0 aGVzZSBibG9ja3MgYXMgcmVhZCBieSB0aGlzIGJhY2tlbmQuICBUaGlzIGlzIHRyYWRpdGlvbmFs CisJICogYmVoYXZpb3IsIGJ1dCBtaWdodCB0dXJuIG91dCB0byBiZSBub3QgdHJ1ZSBpZiB3ZSBm aW5kIHRoYXQgc29tZW9uZQorCSAqIGVsc2UgaGFzIGJlYXRlbiB1cyBhbmQgY29tcGxldGVkIHRo ZSByZWFkIG9mIHNvbWUgb2YgdGhlc2UgYmxvY2tzLiAgSW4KKwkgKiB0aGF0IGNhc2UgdGhlIHN5 c3RlbSBnbG9iYWxseSBkb3VibGUtY291bnRzLCBidXQgd2UgdHJhZGl0aW9uYWxseSBkb24ndAor CSAqIGNvdW50IHRoaXMgYXMgYSAiaGl0IiwgYW5kIHdlIGRvbid0IGhhdmUgYSBzZXBhcmF0ZSBj b3VudGVyIGZvciAibWlzcywKKwkgKiBidXQgYW5vdGhlciBiYWNrZW5kIGNvbXBsZXRlZCB0aGUg cmVhZCIuCiAJICovCi0JaWYgKG1vZGUgPT0gUkJNX1pFUk9fQU5EX0xPQ0sgfHwgbW9kZSA9PSBS Qk1fWkVST19BTkRfQ0xFQU5VUF9MT0NLKQotCQlNZW1TZXQoKGNoYXIgKikgYnVmQmxvY2ssIDAs IEJMQ0tTWik7CisJaWYgKGlzTG9jYWxCdWYpCisJCXBnQnVmZmVyVXNhZ2UubG9jYWxfYmxrc19y ZWFkICs9IG5ibG9ja3M7CiAJZWxzZQorCQlwZ0J1ZmZlclVzYWdlLnNoYXJlZF9ibGtzX3JlYWQg Kz0gbmJsb2NrczsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgbmJsb2NrczsgKytpKQogCXsKLQkJ aW5zdHJfdGltZQlpb19zdGFydCA9IHBnc3RhdF9wcmVwYXJlX2lvX3RpbWUodHJhY2tfaW9fdGlt aW5nKTsKKwkJaW50CQkJaW9fYnVmZmVyc19sZW47CisJCUJ1ZmZlcgkJaW9fYnVmZmVyc1tNQVhf QlVGRkVSU19QRVJfVFJBTlNGRVJdOworCQl2b2lkCSAgICppb19wYWdlc1tNQVhfQlVGRkVSU19Q RVJfVFJBTlNGRVJdOworCQlpbnN0cl90aW1lCWlvX3N0YXJ0OworCQlCbG9ja051bWJlciBpb19m aXJzdF9ibG9jazsKIAotCQlzbWdycmVhZChzbWdyLCBmb3JrTnVtLCBibG9ja051bSwgYnVmQmxv Y2spOworI2lmZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKIAotCQlwZ3N0YXRfY291bnRfaW9fb3Bf dGltZShpb19vYmplY3QsIGlvX2NvbnRleHQsCi0JCQkJCQkJCUlPT1BfUkVBRCwgaW9fc3RhcnQs IDEpOworCQkvKgorCQkgKiBXZSBjb3VsZCBnZXQgYWxsIHRoZSBpbmZvcm1hdGlvbiBmcm9tIGJ1 ZmZlciBoZWFkZXJzLCBidXQgaXQgY2FuIGJlCisJCSAqIGV4cGVuc2l2ZSB0byBhY2Nlc3MgYnVm ZmVyIGhlYWRlciBjYWNoZSBsaW5lcyBzbyB3ZSBtYWtlIHRoZSBjYWxsZXIKKwkJICogcHJvdmlk ZSBhbGwgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQsIGFuZCBhc3NlcnQgdGhhdCBpdCBpcworCQkg KiBjb25zaXN0ZW50LgorCQkgKi8KKwkJeworCQkJUmVsRmlsZUxvY2F0b3IgeGxvY2F0b3I7CisJ CQlGb3JrTnVtYmVyCXhmb3JrbnVtOworCQkJQmxvY2tOdW1iZXIgeGJsb2NrbnVtOworCisJCQlC dWZmZXJHZXRUYWcoYnVmZmVyc1tpXSwgJnhsb2NhdG9yLCAmeGZvcmtudW0sICZ4YmxvY2tudW0p OworCQkJQXNzZXJ0KFJlbEZpbGVMb2NhdG9yRXF1YWxzKGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9y LmxvY2F0b3IsIHhsb2NhdG9yKSk7CisJCQlBc3NlcnQoeGZvcmtudW0gPT0gZm9ya251bSk7CisJ CQlBc3NlcnQoeGJsb2NrbnVtID09IGJsb2NrbnVtICsgaSk7CisJCX0KKyNlbmRpZgorCisJCS8q CisJCSAqIFNraXAgdGhpcyBibG9jayBpZiBzb21lb25lIGVsc2UgaGFzIGFscmVhZHkgY29tcGxl dGVkIGl0LiAgSWYgYW4KKwkJICogSS9PIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgaW4gYW5vdGhl ciBiYWNrZW5kLCB0aGlzIHdpbGwgd2FpdCBmb3IKKwkJICogdGhlIG91dGNvbWU6IGVpdGhlciBk b25lLCBvciBzb21ldGhpbmcgd2VudCB3cm9uZyBhbmQgd2Ugd2lsbAorCQkgKiByZXRyeS4KKwkJ ICovCisJCWlmICghQ29tcGxldGVSZWFkQnVmZmVyc0NhblN0YXJ0SU8oYnVmZmVyc1tpXSwgZmFs c2UpKQorCQl7CisJCQkvKgorCQkJICogUmVwb3J0IHRoaXMgYXMgYSAnaGl0JyBmb3IgdGhpcyBi YWNrZW5kLCBldmVuIHRob3VnaCBpdCBtdXN0CisJCQkgKiBoYXZlIHN0YXJ0ZWQgb3V0IGFzIGEg bWlzcyBpbiBQcmVwYXJlUmVhZEJ1ZmZlcigpLgorCQkJICovCisJCQlUUkFDRV9QT1NUR1JFU1FM X0JVRkZFUl9SRUFEX0RPTkUoZm9ya251bSwgYmxvY2tudW0gKyBpLAorCQkJCQkJCQkJCQkgIGJt ci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3Iuc3BjT2lkLAorCQkJCQkJCQkJCQkgIGJtci5z bWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3IuZGJPaWQsCisJCQkJCQkJCQkJCSAgYm1yLnNtZ3It PnNtZ3JfcmxvY2F0b3IubG9jYXRvci5yZWxOdW1iZXIsCisJCQkJCQkJCQkJCSAgYm1yLnNtZ3It PnNtZ3JfcmxvY2F0b3IuYmFja2VuZCwKKwkJCQkJCQkJCQkJICB0cnVlKTsKKwkJCWNvbnRpbnVl OworCQl9CisKKwkJLyogV2UgZm91bmQgYSBidWZmZXIgdGhhdCB3ZSBuZWVkIHRvIHJlYWQgaW4u ICovCisJCWlvX2J1ZmZlcnNbMF0gPSBidWZmZXJzW2ldOworCQlpb19wYWdlc1swXSA9IEJ1ZmZl ckdldEJsb2NrKGJ1ZmZlcnNbaV0pOworCQlpb19maXJzdF9ibG9jayA9IGJsb2NrbnVtICsgaTsK KwkJaW9fYnVmZmVyc19sZW4gPSAxOwogCi0JCS8qIGNoZWNrIGZvciBnYXJiYWdlIGRhdGEgKi8K LQkJaWYgKCFQYWdlSXNWZXJpZmllZEV4dGVuZGVkKChQYWdlKSBidWZCbG9jaywgYmxvY2tOdW0s Ci0JCQkJCQkJCQlQSVZfTE9HX1dBUk5JTkcgfCBQSVZfUkVQT1JUX1NUQVQpKQorCQkvKgorCQkg KiBIb3cgbWFueSBuZWlnaGJvcmluZy1vbi1kaXNrIGJsb2NrcyBjYW4gd2UgY2FuIHNjYXR0ZXIt cmVhZCBpbnRvCisJCSAqIG90aGVyIGJ1ZmZlcnMgYXQgdGhlIHNhbWUgdGltZT8gIEluIHRoaXMg Y2FzZSB3ZSBkb24ndCB3YWl0IGlmIHdlCisJCSAqIHNlZSBhbiBJL08gYWxyZWFkeSBpbiBwcm9n cmVzcy4gIFdlIGFscmVhZHkgaG9sZCBCTV9JT19JTl9QUk9HUkVTUworCQkgKiBmb3IgdGhlIGhl YWQgYmxvY2ssIHNvIHdlIHNob3VsZCBnZXQgb24gd2l0aCB0aGF0IEkvTyBhcyBzb29uIGFzCisJ CSAqIHBvc3NpYmxlLiAgV2UnbGwgY29tZSBiYWNrIHRvIHRoaXMgYmxvY2sgYWdhaW4sIGFib3Zl LgorCQkgKi8KKwkJd2hpbGUgKChpICsgMSkgPCBuYmxvY2tzICYmCisJCQkgICBDb21wbGV0ZVJl YWRCdWZmZXJzQ2FuU3RhcnRJTyhidWZmZXJzW2kgKyAxXSwgdHJ1ZSkpCisJCXsKKwkJCS8qIE11 c3QgYmUgY29uc2VjdXRpdmUgYmxvY2sgbnVtYmVycy4gKi8KKwkJCUFzc2VydChCdWZmZXJHZXRC bG9ja051bWJlcihidWZmZXJzW2kgKyAxXSkgPT0KKwkJCQkgICBCdWZmZXJHZXRCbG9ja051bWJl cihidWZmZXJzW2ldKSArIDEpOworCisJCQlpb19idWZmZXJzW2lvX2J1ZmZlcnNfbGVuXSA9IGJ1 ZmZlcnNbKytpXTsKKwkJCWlvX3BhZ2VzW2lvX2J1ZmZlcnNfbGVuKytdID0gQnVmZmVyR2V0Qmxv Y2soYnVmZmVyc1tpXSk7CisJCX0KKworCQlpb19zdGFydCA9IHBnc3RhdF9wcmVwYXJlX2lvX3Rp bWUodHJhY2tfaW9fdGltaW5nKTsKKwkJc21ncnJlYWR2KGJtci5zbWdyLCBmb3JrbnVtLCBpb19m aXJzdF9ibG9jaywgaW9fcGFnZXMsIGlvX2J1ZmZlcnNfbGVuKTsKKwkJcGdzdGF0X2NvdW50X2lv X29wX3RpbWUoaW9fb2JqZWN0LCBpb19jb250ZXh0LCBJT09QX1JFQUQsIGlvX3N0YXJ0LAorCQkJ CQkJCQlpb19idWZmZXJzX2xlbik7CisKKwkJLyogVmVyaWZ5IGVhY2ggYmxvY2sgd2UgcmVhZCwg YW5kIHRlcm1pbmF0ZSB0aGUgSS9PLiAqLworCQlmb3IgKGludCBqID0gMDsgaiA8IGlvX2J1ZmZl cnNfbGVuOyArK2opCiAJCXsKLQkJCWlmIChtb2RlID09IFJCTV9aRVJPX09OX0VSUk9SIHx8IHpl cm9fZGFtYWdlZF9wYWdlcykKKwkJCUJ1ZmZlckRlc2MgKmJ1ZkhkcjsKKwkJCUJsb2NrCQlidWZC bG9jazsKKworCQkJaWYgKGlzTG9jYWxCdWYpCiAJCQl7Ci0JCQkJZXJlcG9ydChXQVJOSU5HLAot CQkJCQkJKGVycmNvZGUoRVJSQ09ERV9EQVRBX0NPUlJVUFRFRCksCi0JCQkJCQkgZXJybXNnKCJp bnZhbGlkIHBhZ2UgaW4gYmxvY2sgJXUgb2YgcmVsYXRpb24gJXM7IHplcm9pbmcgb3V0IHBhZ2Ui LAotCQkJCQkJCQlibG9ja051bSwKLQkJCQkJCQkJcmVscGF0aChzbWdyLT5zbWdyX3Jsb2NhdG9y LCBmb3JrTnVtKSkpKTsKLQkJCQlNZW1TZXQoKGNoYXIgKikgYnVmQmxvY2ssIDAsIEJMQ0tTWik7 CisJCQkJYnVmSGRyID0gR2V0TG9jYWxCdWZmZXJEZXNjcmlwdG9yKC1pb19idWZmZXJzW2pdIC0g MSk7CisJCQkJYnVmQmxvY2sgPSBMb2NhbEJ1ZkhkckdldEJsb2NrKGJ1Zkhkcik7CiAJCQl9CiAJ CQllbHNlCi0JCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJCShlcnJjb2RlKEVSUkNPREVfREFUQV9D T1JSVVBURUQpLAotCQkJCQkJIGVycm1zZygiaW52YWxpZCBwYWdlIGluIGJsb2NrICV1IG9mIHJl bGF0aW9uICVzIiwKLQkJCQkJCQkJYmxvY2tOdW0sCi0JCQkJCQkJCXJlbHBhdGgoc21nci0+c21n cl9ybG9jYXRvciwgZm9ya051bSkpKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEluIFJCTV9aRVJP X0FORF9MT0NLIC8gUkJNX1pFUk9fQU5EX0NMRUFOVVBfTE9DSyBtb2RlLCBncmFiIHRoZSBidWZm ZXIKLQkgKiBjb250ZW50IGxvY2sgYmVmb3JlIG1hcmtpbmcgdGhlIHBhZ2UgYXMgdmFsaWQsIHRv IG1ha2Ugc3VyZSB0aGF0IG5vCi0JICogb3RoZXIgYmFja2VuZCBzZWVzIHRoZSB6ZXJvZWQgcGFn ZSBiZWZvcmUgdGhlIGNhbGxlciBoYXMgaGFkIGEgY2hhbmNlCi0JICogdG8gaW5pdGlhbGl6ZSBp dC4KLQkgKgotCSAqIFNpbmNlIG5vLW9uZSBlbHNlIGNhbiBiZSBsb29raW5nIGF0IHRoZSBwYWdl IGNvbnRlbnRzIHlldCwgdGhlcmUgaXMgbm8KLQkgKiBkaWZmZXJlbmNlIGJldHdlZW4gYW4gZXhj bHVzaXZlIGxvY2sgYW5kIGEgY2xlYW51cC1zdHJlbmd0aCBsb2NrLiAoTm90ZQotCSAqIHRoYXQg d2UgY2Fubm90IHVzZSBMb2NrQnVmZmVyKCkgb3IgTG9ja0J1ZmZlckZvckNsZWFudXAoKSBoZXJl LCBiZWNhdXNlCi0JICogdGhleSBhc3NlcnQgdGhhdCB0aGUgYnVmZmVyIGlzIGFscmVhZHkgdmFs aWQuKQotCSAqLwotCWlmICgobW9kZSA9PSBSQk1fWkVST19BTkRfTE9DSyB8fCBtb2RlID09IFJC TV9aRVJPX0FORF9DTEVBTlVQX0xPQ0spICYmCi0JCSFpc0xvY2FsQnVmKQotCXsKLQkJTFdMb2Nr QWNxdWlyZShCdWZmZXJEZXNjcmlwdG9yR2V0Q29udGVudExvY2soYnVmSGRyKSwgTFdfRVhDTFVT SVZFKTsKLQl9CisJCQl7CisJCQkJYnVmSGRyID0gR2V0QnVmZmVyRGVzY3JpcHRvcihpb19idWZm ZXJzW2pdIC0gMSk7CisJCQkJYnVmQmxvY2sgPSBCdWZIZHJHZXRCbG9jayhidWZIZHIpOworCQkJ fQogCi0JaWYgKGlzTG9jYWxCdWYpCi0JewotCQkvKiBPbmx5IG5lZWQgdG8gYWRqdXN0IGZsYWdz ICovCi0JCXVpbnQzMgkJYnVmX3N0YXRlID0gcGdfYXRvbWljX3JlYWRfdTMyKCZidWZIZHItPnN0 YXRlKTsKKwkJCS8qIGNoZWNrIGZvciBnYXJiYWdlIGRhdGEgKi8KKwkJCWlmICghUGFnZUlzVmVy aWZpZWRFeHRlbmRlZCgoUGFnZSkgYnVmQmxvY2ssIGlvX2ZpcnN0X2Jsb2NrICsgaiwKKwkJCQkJ CQkJCQlQSVZfTE9HX1dBUk5JTkcgfCBQSVZfUkVQT1JUX1NUQVQpKQorCQkJeworCQkJCWlmICh6 ZXJvX29uX2Vycm9yIHx8IHplcm9fZGFtYWdlZF9wYWdlcykKKwkJCQl7CisJCQkJCWVyZXBvcnQo V0FSTklORywKKwkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0RBVEFfQ09SUlVQVEVEKSwKKwkJCQkJ CQkgZXJybXNnKCJpbnZhbGlkIHBhZ2UgaW4gYmxvY2sgJXUgb2YgcmVsYXRpb24gJXM7IHplcm9p bmcgb3V0IHBhZ2UiLAorCQkJCQkJCQkJaW9fZmlyc3RfYmxvY2sgKyBqLAorCQkJCQkJCQkJcmVs cGF0aChibXIuc21nci0+c21ncl9ybG9jYXRvciwgZm9ya251bSkpKSk7CisJCQkJCW1lbXNldChi dWZCbG9jaywgMCwgQkxDS1NaKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQllcmVwb3J0KEVSUk9S LAorCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfREFUQV9DT1JSVVBURUQpLAorCQkJCQkJCSBlcnJt c2coImludmFsaWQgcGFnZSBpbiBibG9jayAldSBvZiByZWxhdGlvbiAlcyIsCisJCQkJCQkJCQlp b19maXJzdF9ibG9jayArIGosCisJCQkJCQkJCQlyZWxwYXRoKGJtci5zbWdyLT5zbWdyX3Jsb2Nh dG9yLCBmb3JrbnVtKSkpKTsKKwkJCX0KIAotCQlidWZfc3RhdGUgfD0gQk1fVkFMSUQ7Ci0JCXBn X2F0b21pY191bmxvY2tlZF93cml0ZV91MzIoJmJ1Zkhkci0+c3RhdGUsIGJ1Zl9zdGF0ZSk7Ci0J fQotCWVsc2UKLQl7Ci0JCS8qIFNldCBCTV9WQUxJRCwgdGVybWluYXRlIElPLCBhbmQgd2FrZSB1 cCBhbnkgd2FpdGVycyAqLwotCQlUZXJtaW5hdGVCdWZmZXJJTyhidWZIZHIsIGZhbHNlLCBCTV9W QUxJRCwgdHJ1ZSk7Ci0JfQorCQkJLyogVGVybWluYXRlIEkvTyBhbmQgc2V0IEJNX1ZBTElELiAq LworCQkJaWYgKGlzTG9jYWxCdWYpCisJCQl7CisJCQkJdWludDMyCQlidWZfc3RhdGUgPSBwZ19h dG9taWNfcmVhZF91MzIoJmJ1Zkhkci0+c3RhdGUpOwogCi0JVmFjdXVtUGFnZU1pc3MrKzsKLQlp ZiAoVmFjdXVtQ29zdEFjdGl2ZSkKLQkJVmFjdXVtQ29zdEJhbGFuY2UgKz0gVmFjdXVtQ29zdFBh Z2VNaXNzOworCQkJCWJ1Zl9zdGF0ZSB8PSBCTV9WQUxJRDsKKwkJCQlwZ19hdG9taWNfdW5sb2Nr ZWRfd3JpdGVfdTMyKCZidWZIZHItPnN0YXRlLCBidWZfc3RhdGUpOworCQkJfQorCQkJZWxzZQor CQkJeworCQkJCS8qIFNldCBCTV9WQUxJRCwgdGVybWluYXRlIElPLCBhbmQgd2FrZSB1cCBhbnkg d2FpdGVycyAqLworCQkJCVRlcm1pbmF0ZUJ1ZmZlcklPKGJ1ZkhkciwgZmFsc2UsIEJNX1ZBTElE LCB0cnVlKTsKKwkJCX0KIAotCVRSQUNFX1BPU1RHUkVTUUxfQlVGRkVSX1JFQURfRE9ORShmb3Jr TnVtLCBibG9ja051bSwKLQkJCQkJCQkJCSAgc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLnNw Y09pZCwKLQkJCQkJCQkJCSAgc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLmRiT2lkLAotCQkJ CQkJCQkJICBzbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3IucmVsTnVtYmVyLAotCQkJCQkJCQkJ ICBzbWdyLT5zbWdyX3Jsb2NhdG9yLmJhY2tlbmQsCi0JCQkJCQkJCQkgIGZvdW5kKTsKKwkJCS8q IFJlcG9ydCBJL09zIGFzIGNvbXBsZXRpbmcgaW5kaXZpZHVhbGx5LiAqLworCQkJVFJBQ0VfUE9T VEdSRVNRTF9CVUZGRVJfUkVBRF9ET05FKGZvcmtudW0sIGlvX2ZpcnN0X2Jsb2NrICsgaiwKKwkJ CQkJCQkJCQkJICBibXIuc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLnNwY09pZCwKKwkJCQkJ CQkJCQkJICBibXIuc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLmRiT2lkLAorCQkJCQkJCQkJ CQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3IucmVsTnVtYmVyLAorCQkJCQkJCQkJ CQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmJhY2tlbmQsCisJCQkJCQkJCQkJCSAgZmFsc2Up OworCQl9CiAKLQlyZXR1cm4gQnVmZmVyRGVzY3JpcHRvckdldEJ1ZmZlcihidWZIZHIpOworCQlW YWN1dW1QYWdlTWlzcyArPSBpb19idWZmZXJzX2xlbjsKKwkJaWYgKFZhY3V1bUNvc3RBY3RpdmUp CisJCQlWYWN1dW1Db3N0QmFsYW5jZSArPSBWYWN1dW1Db3N0UGFnZU1pc3MgKiBpb19idWZmZXJz X2xlbjsKKwl9CiB9CiAKIC8qCkBAIC0xMjI4LDExICsxMzgwLDggQEAgUmVhZEJ1ZmZlcl9jb21t b24oU01nclJlbGF0aW9uIHNtZ3IsIGNoYXIgcmVscGVyc2lzdGVuY2UsIEZvcmtOdW1iZXIgZm9y a051bSwKICAqCiAgKiBUaGUgcmV0dXJuZWQgYnVmZmVyIGlzIHBpbm5lZCBhbmQgaXMgYWxyZWFk eSBtYXJrZWQgYXMgaG9sZGluZyB0aGUKICAqIGRlc2lyZWQgcGFnZS4gIElmIGl0IGFscmVhZHkg ZGlkIGhhdmUgdGhlIGRlc2lyZWQgcGFnZSwgKmZvdW5kUHRyIGlzCi0gKiBzZXQgdHJ1ZS4gIE90 aGVyd2lzZSwgKmZvdW5kUHRyIGlzIHNldCBmYWxzZSBhbmQgdGhlIGJ1ZmZlciBpcyBtYXJrZWQK LSAqIGFzIElPX0lOX1BST0dSRVNTOyBSZWFkQnVmZmVyIHdpbGwgbm93IG5lZWQgdG8gZG8gSS9P IHRvIGZpbGwgaXQuCi0gKgotICogKmZvdW5kUHRyIGlzIGFjdHVhbGx5IHJlZHVuZGFudCB3aXRo IHRoZSBidWZmZXIncyBCTV9WQUxJRCBmbGFnLCBidXQKLSAqIHdlIGtlZXAgaXQgZm9yIHNpbXBs aWNpdHkgaW4gUmVhZEJ1ZmZlci4KKyAqIHNldCB0cnVlLiAgT3RoZXJ3aXNlLCAqZm91bmRQdHIg aXMgc2V0IGZhbHNlLiAgQSByZWFkIHNob3VsZCBiZQorICogcGVyZm9ybWVkIHdpdGggQ29tcGxl dGVSZWFkQnVmZmVycygpLgogICoKICAqIGlvX2NvbnRleHQgaXMgcGFzc2VkIGFzIGFuIG91dHB1 dCBwYXJhbWV0ZXIgdG8gYXZvaWQgY2FsbGluZwogICogSU9Db250ZXh0Rm9yU3RyYXRlZ3koKSB3 aGVuIHRoZXJlIGlzIGEgc2hhcmVkIGJ1ZmZlcnMgaGl0IGFuZCBubyBJTwpAQCAtMTI5MSwxOSAr MTQ0MCwxMCBAQCBCdWZmZXJBbGxvYyhTTWdyUmVsYXRpb24gc21nciwgY2hhciByZWxwZXJzaXN0 ZW5jZSwgRm9ya051bWJlciBmb3JrTnVtLAogCQl7CiAJCQkvKgogCQkJICogV2UgY2FuIG9ubHkg Z2V0IGhlcmUgaWYgKGEpIHNvbWVvbmUgZWxzZSBpcyBzdGlsbCByZWFkaW5nIGluCi0JCQkgKiB0 aGUgcGFnZSwgb3IgKGIpIGEgcHJldmlvdXMgcmVhZCBhdHRlbXB0IGZhaWxlZC4gIFdlIGhhdmUg dG8KLQkJCSAqIHdhaXQgZm9yIGFueSBhY3RpdmUgcmVhZCBhdHRlbXB0IHRvIGZpbmlzaCwgYW5k IHRoZW4gc2V0IHVwIG91cgotCQkJICogb3duIHJlYWQgYXR0ZW1wdCBpZiB0aGUgcGFnZSBpcyBz dGlsbCBub3QgQk1fVkFMSUQuCi0JCQkgKiBTdGFydEJ1ZmZlcklPIGRvZXMgaXQgYWxsLgorCQkJ ICogdGhlIHBhZ2UsIChiKSBhIHByZXZpb3VzIHJlYWQgYXR0ZW1wdCBmYWlsZWQsIG9yIChjKSBz b21lb25lCisJCQkgKiBjYWxsZWQgUHJlcGFyZVJlYWRCdWZmZXIoKSBidXQgbm90IHlldCBDb21w bGV0ZVJlYWRCdWZmZXJzKCkuCiAJCQkgKi8KLQkJCWlmIChTdGFydEJ1ZmZlcklPKGJ1ZiwgdHJ1 ZSkpCi0JCQl7Ci0JCQkJLyoKLQkJCQkgKiBJZiB3ZSBnZXQgaGVyZSwgcHJldmlvdXMgYXR0ZW1w dHMgdG8gcmVhZCB0aGUgYnVmZmVyIG11c3QKLQkJCQkgKiBoYXZlIGZhaWxlZCAuLi4gYnV0IHdl IHNoYWxsIGJyYXZlbHkgdHJ5IGFnYWluLgotCQkJCSAqLwotCQkJCSpmb3VuZFB0ciA9IGZhbHNl OwotCQkJfQorCQkJKmZvdW5kUHRyID0gZmFsc2U7CiAJCX0KIAogCQlyZXR1cm4gYnVmOwpAQCAt MTM2OCwxOSArMTUwOCwxMCBAQCBCdWZmZXJBbGxvYyhTTWdyUmVsYXRpb24gc21nciwgY2hhciBy ZWxwZXJzaXN0ZW5jZSwgRm9ya051bWJlciBmb3JrTnVtLAogCQl7CiAJCQkvKgogCQkJICogV2Ug Y2FuIG9ubHkgZ2V0IGhlcmUgaWYgKGEpIHNvbWVvbmUgZWxzZSBpcyBzdGlsbCByZWFkaW5nIGlu Ci0JCQkgKiB0aGUgcGFnZSwgb3IgKGIpIGEgcHJldmlvdXMgcmVhZCBhdHRlbXB0IGZhaWxlZC4g IFdlIGhhdmUgdG8KLQkJCSAqIHdhaXQgZm9yIGFueSBhY3RpdmUgcmVhZCBhdHRlbXB0IHRvIGZp bmlzaCwgYW5kIHRoZW4gc2V0IHVwIG91cgotCQkJICogb3duIHJlYWQgYXR0ZW1wdCBpZiB0aGUg cGFnZSBpcyBzdGlsbCBub3QgQk1fVkFMSUQuCi0JCQkgKiBTdGFydEJ1ZmZlcklPIGRvZXMgaXQg YWxsLgorCQkJICogdGhlIHBhZ2UsIChiKSBhIHByZXZpb3VzIHJlYWQgYXR0ZW1wdCBmYWlsZWQs IG9yIChjKSBzb21lb25lCisJCQkgKiBjYWxsZWQgUHJlcGFyZVJlYWRCdWZmZXIoKSBidXQgbm90 IHlldCBDb21wbGV0ZVJlYWRCdWZmZXJzKCkuCiAJCQkgKi8KLQkJCWlmIChTdGFydEJ1ZmZlcklP KGV4aXN0aW5nX2J1Zl9oZHIsIHRydWUpKQotCQkJewotCQkJCS8qCi0JCQkJICogSWYgd2UgZ2V0 IGhlcmUsIHByZXZpb3VzIGF0dGVtcHRzIHRvIHJlYWQgdGhlIGJ1ZmZlciBtdXN0Ci0JCQkJICog aGF2ZSBmYWlsZWQgLi4uIGJ1dCB3ZSBzaGFsbCBicmF2ZWx5IHRyeSBhZ2Fpbi4KLQkJCQkgKi8K LQkJCQkqZm91bmRQdHIgPSBmYWxzZTsKLQkJCX0KKwkJCSpmb3VuZFB0ciA9IGZhbHNlOwogCQl9 CiAKIAkJcmV0dXJuIGV4aXN0aW5nX2J1Zl9oZHI7CkBAIC0xNDEyLDE1ICsxNTQzLDkgQEAgQnVm ZmVyQWxsb2MoU01nclJlbGF0aW9uIHNtZ3IsIGNoYXIgcmVscGVyc2lzdGVuY2UsIEZvcmtOdW1i ZXIgZm9ya051bSwKIAlMV0xvY2tSZWxlYXNlKG5ld1BhcnRpdGlvbkxvY2spOwogCiAJLyoKLQkg KiBCdWZmZXIgY29udGVudHMgYXJlIGN1cnJlbnRseSBpbnZhbGlkLiAgVHJ5IHRvIG9idGFpbiB0 aGUgcmlnaHQgdG8KLQkgKiBzdGFydCBJL08uICBJZiBTdGFydEJ1ZmZlcklPIHJldHVybnMgZmFs c2UsIHRoZW4gc29tZW9uZSBlbHNlIG1hbmFnZWQKLQkgKiB0byByZWFkIGl0IGJlZm9yZSB3ZSBk aWQsIHNvIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IGZvciBCdWZmZXJBbGxvYygpIHRvCi0JICogZG8u CisJICogQnVmZmVyIGNvbnRlbnRzIGFyZSBjdXJyZW50bHkgaW52YWxpZC4KIAkgKi8KLQlpZiAo U3RhcnRCdWZmZXJJTyh2aWN0aW1fYnVmX2hkciwgdHJ1ZSkpCi0JCSpmb3VuZFB0ciA9IGZhbHNl OwotCWVsc2UKLQkJKmZvdW5kUHRyID0gdHJ1ZTsKKwkqZm91bmRQdHIgPSBmYWxzZTsKIAogCXJl dHVybiB2aWN0aW1fYnVmX2hkcjsKIH0KQEAgLTE3NzQsNyArMTg5OSw3IEBAIGFnYWluOgogICog cGVzc2ltaXN0aWMsIGJ1dCBvdXRzaWRlIG9mIHRveS1zaXplZCBzaGFyZWRfYnVmZmVycyBpdCBz aG91bGQgYWxsb3cKICAqIHN1ZmZpY2llbnQgcGlucy4KICAqLwotc3RhdGljIHZvaWQKK3ZvaWQK IExpbWl0QWRkaXRpb25hbFBpbnModWludDMyICphZGRpdGlvbmFsX3BpbnMpCiB7CiAJdWludDMy CQltYXhfYmFja2VuZHM7CkBAIC0yMDQzLDcgKzIxNjgsNyBAQCBFeHRlbmRCdWZmZXJlZFJlbFNo YXJlZChCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yLAogCiAJCQkJYnVmX3N0YXRlICY9IH5CTV9W QUxJRDsKIAkJCQlVbmxvY2tCdWZIZHIoZXhpc3RpbmdfaGRyLCBidWZfc3RhdGUpOwotCQkJfSB3 aGlsZSAoIVN0YXJ0QnVmZmVySU8oZXhpc3RpbmdfaGRyLCB0cnVlKSk7CisJCQl9IHdoaWxlICgh U3RhcnRCdWZmZXJJTyhleGlzdGluZ19oZHIsIHRydWUsIGZhbHNlKSk7CiAJCX0KIAkJZWxzZQog CQl7CkBAIC0yMDY2LDcgKzIxOTEsNyBAQCBFeHRlbmRCdWZmZXJlZFJlbFNoYXJlZChCdWZmZXJN YW5hZ2VyUmVsYXRpb24gYm1yLAogCQkJTFdMb2NrUmVsZWFzZShwYXJ0aXRpb25fbG9jayk7CiAK IAkJCS8qIFhYWDogY291bGQgY29tYmluZSB0aGUgbG9ja2VkIG9wZXJhdGlvbnMgaW4gaXQgd2l0 aCB0aGUgYWJvdmUgKi8KLQkJCVN0YXJ0QnVmZmVySU8odmljdGltX2J1Zl9oZHIsIHRydWUpOwor CQkJU3RhcnRCdWZmZXJJTyh2aWN0aW1fYnVmX2hkciwgdHJ1ZSwgZmFsc2UpOwogCQl9CiAJfQog CkBAIC0yMzgxLDcgKzI1MDYsMTIgQEAgUGluQnVmZmVyKEJ1ZmZlckRlc2MgKmJ1ZiwgQnVmZmVy QWNjZXNzU3RyYXRlZ3kgc3RyYXRlZ3kpCiAJZWxzZQogCXsKIAkJLyoKLQkJICogSWYgd2UgcHJl dmlvdXNseSBwaW5uZWQgdGhlIGJ1ZmZlciwgaXQgbXVzdCBzdXJlbHkgYmUgdmFsaWQuCisJCSAq IElmIHdlIHByZXZpb3VzbHkgcGlubmVkIHRoZSBidWZmZXIsIGl0IGlzIGxpa2VseSB0byBiZSB2 YWxpZCwgYnV0CisJCSAqIGl0IG1heSBub3QgYmUgaWYgUHJlcGFyZVJlYWRCdWZmZXIoKSB3YXMg Y2FsbGVkIGFuZAorCQkgKiBDb21wbGV0ZVJlYWRCdWZmZXJzKCkgaGFzbid0IGJlZW4gY2FsbGVk IHlldC4gIFdlJ2xsIGNoZWNrIGJ5CisJCSAqIGxvYWRpbmcgdGhlIGZsYWdzIHdpdGhvdXQgbG9j a2luZy4gIFRoaXMgaXMgcmFjeSwgYnV0IGl0J3MgT0sgdG8KKwkJICogcmV0dXJuIGZhbHNlIHNw dXJpb3VzbHk6IHdoZW4gQ29tcGxldGVSZWFkQnVmZmVycygpIGNhbGxzCisJCSAqIFN0YXJ0QnVm ZmVySU8oKSwgaXQnbGwgc2VlIHRoYXQgaXQncyBub3cgdmFsaWQuCiAJCSAqCiAJCSAqIE5vdGU6 IFdlIGRlbGliZXJhdGVseSBhdm9pZCBhIFZhbGdyaW5kIGNsaWVudCByZXF1ZXN0IGhlcmUuCiAJ CSAqIEluZGl2aWR1YWwgYWNjZXNzIG1ldGhvZHMgY2FuIG9wdGlvbmFsbHkgc3VwZXJpbXBvc2Ug YnVmZmVyIHBhZ2UKQEAgLTIzOTAsNyArMjUyMCw3IEBAIFBpbkJ1ZmZlcihCdWZmZXJEZXNjICpi dWYsIEJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5KQogCQkgKiB0aGF0IHRoZSBidWZmZXIg cGFnZSBpcyBsZWdpdGltYXRlbHkgbm9uLWFjY2Vzc2libGUgaGVyZS4gIFdlCiAJCSAqIGNhbm5v dCBtZWRkbGUgd2l0aCB0aGF0LgogCQkgKi8KLQkJcmVzdWx0ID0gdHJ1ZTsKKwkJcmVzdWx0ID0g KHBnX2F0b21pY19yZWFkX3UzMigmYnVmLT5zdGF0ZSkgJiBCTV9WQUxJRCkgIT0gMDsKIAl9CiAK IAlyZWYtPnJlZmNvdW50Kys7CkBAIC0zNDU4LDcgKzM1ODgsNyBAQCBGbHVzaEJ1ZmZlcihCdWZm ZXJEZXNjICpidWYsIFNNZ3JSZWxhdGlvbiByZWxuLCBJT09iamVjdCBpb19vYmplY3QsCiAJICog c29tZW9uZSBlbHNlIGZsdXNoZWQgdGhlIGJ1ZmZlciBiZWZvcmUgd2UgY291bGQsIHNvIHdlIG5l ZWQgbm90IGRvCiAJICogYW55dGhpbmcuCiAJICovCi0JaWYgKCFTdGFydEJ1ZmZlcklPKGJ1Ziwg ZmFsc2UpKQorCWlmICghU3RhcnRCdWZmZXJJTyhidWYsIGZhbHNlLCBmYWxzZSkpCiAJCXJldHVy bjsKIAogCS8qIFNldHVwIGVycm9yIHRyYWNlYmFjayBzdXBwb3J0IGZvciBlcmVwb3J0KCkgKi8K QEAgLTQ4NDUsNiArNDk3NSw0NiBAQCBDb25kaXRpb25hbExvY2tCdWZmZXIoQnVmZmVyIGJ1ZmZl cikKIAkJCQkJCQkJCUxXX0VYQ0xVU0lWRSk7CiB9CiAKKy8qCisgKiBaZXJvIGEgYnVmZmVyLCBh bmQgbG9jayBpdCBhcyBSQk1fWkVST19BTkRfTE9DSyBvcgorICogUkJNX1pFUk9fQU5EX0NMRUFO VVBfTE9DSyB3b3VsZC4gIFRoZSBidWZmZXIgbXVzdCBiZSBhbHJlYWR5IHBpbm5lZC4gIEl0Cisg KiBkb2VzIG5vdCBoYXZlIHRvIGJlIHZhbGlkLCBidXQgaXQgaXMgdmFsaWQgYW5kIGxvY2tlZCBv biByZXR1cm4uCisgKi8KK3ZvaWQKK1plcm9CdWZmZXIoQnVmZmVyIGJ1ZmZlciwgUmVhZEJ1ZmZl ck1vZGUgbW9kZSkKK3sKKwlCdWZmZXJEZXNjICpidWZIZHI7CisJdWludDMyCQlidWZfc3RhdGU7 CisKKwlBc3NlcnQobW9kZSA9PSBSQk1fWkVST19BTkRfTE9DSyB8fCBtb2RlID09IFJCTV9aRVJP X0FORF9DTEVBTlVQX0xPQ0spOworCisJaWYgKEJ1ZmZlcklzTG9jYWwoYnVmZmVyKSkKKwkJYnVm SGRyID0gR2V0TG9jYWxCdWZmZXJEZXNjcmlwdG9yKC1idWZmZXIgLSAxKTsKKwllbHNlCisJewor CQlidWZIZHIgPSBHZXRCdWZmZXJEZXNjcmlwdG9yKGJ1ZmZlciAtIDEpOworCQlpZiAobW9kZSA9 PSBSQk1fWkVST19BTkRfTE9DSykKKwkJCUxvY2tCdWZmZXIoYnVmZmVyLCBCVUZGRVJfTE9DS19F WENMVVNJVkUpOworCQllbHNlCisJCQlMb2NrQnVmZmVyRm9yQ2xlYW51cChidWZmZXIpOworCX0K KworCW1lbXNldChCdWZmZXJHZXRQYWdlKGJ1ZmZlciksIDAsIEJMQ0tTWik7CisKKwlpZiAoQnVm ZmVySXNMb2NhbChidWZmZXIpKQorCXsKKwkJYnVmX3N0YXRlID0gcGdfYXRvbWljX3JlYWRfdTMy KCZidWZIZHItPnN0YXRlKTsKKwkJYnVmX3N0YXRlIHw9IEJNX1ZBTElEOworCQlwZ19hdG9taWNf dW5sb2NrZWRfd3JpdGVfdTMyKCZidWZIZHItPnN0YXRlLCBidWZfc3RhdGUpOworCX0KKwllbHNl CisJeworCQlidWZfc3RhdGUgPSBMb2NrQnVmSGRyKGJ1Zkhkcik7CisJCWJ1Zl9zdGF0ZSB8PSBC TV9WQUxJRDsKKwkJVW5sb2NrQnVmSGRyKGJ1ZkhkciwgYnVmX3N0YXRlKTsKKwl9Cit9CisKIC8q CiAgKiBWZXJpZnkgdGhhdCB0aGlzIGJhY2tlbmQgaXMgcGlubmluZyB0aGUgYnVmZmVyIGV4YWN0 bHkgb25jZS4KICAqCkBAIC01MTk3LDkgKzUzNjcsMTUgQEAgV2FpdElPKEJ1ZmZlckRlc2MgKmJ1 ZikKICAqCiAgKiBSZXR1cm5zIHRydWUgaWYgd2Ugc3VjY2Vzc2Z1bGx5IG1hcmtlZCB0aGUgYnVm ZmVyIGFzIEkvTyBidXN5LAogICogZmFsc2UgaWYgc29tZW9uZSBlbHNlIGFscmVhZHkgZGlkIHRo ZSB3b3JrLgorICoKKyAqIElmIG5vd2FpdCBpcyB0cnVlLCB0aGVuIHdlIGRvbid0IHdhaXQgZm9y IGFuIEkvTyB0byBiZSBmaW5pc2hlZCBieSBhbm90aGVyCisgKiBiYWNrZW5kLiAgSW4gdGhhdCBj YXNlLCBmYWxzZSBpbmRpY2F0ZXMgZWl0aGVyIHRoYXQgdGhlIEkvTyB3YXMgYWxyZWFkeQorICog ZmluaXNoZWQsIG9yIGlzIHN0aWxsIGluIHByb2dyZXNzLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNh bGxlcnMgdGhhdCB3YW50IHRvCisgKiBmaW5kIG91dCBpZiB0aGV5IGNhbiBwZXJmb3JtIHRoZSBJ L08gYXMgcGFydCBvZiBhIGxhcmdlciBvcGVyYXRpb24sIHdpdGhvdXQKKyAqIHdhaXRpbmcgZm9y IHRoZSBhbnN3ZXIgb3IgZGlzdGluZ3Vpc2hpbmcgdGhlIHJlYXNvbnMgd2h5IG5vdC4KICAqLwog c3RhdGljIGJvb2wKLVN0YXJ0QnVmZmVySU8oQnVmZmVyRGVzYyAqYnVmLCBib29sIGZvcklucHV0 KQorU3RhcnRCdWZmZXJJTyhCdWZmZXJEZXNjICpidWYsIGJvb2wgZm9ySW5wdXQsIGJvb2wgbm93 YWl0KQogewogCXVpbnQzMgkJYnVmX3N0YXRlOwogCkBAIC01MjEyLDYgKzUzODgsOCBAQCBTdGFy dEJ1ZmZlcklPKEJ1ZmZlckRlc2MgKmJ1ZiwgYm9vbCBmb3JJbnB1dCkKIAkJaWYgKCEoYnVmX3N0 YXRlICYgQk1fSU9fSU5fUFJPR1JFU1MpKQogCQkJYnJlYWs7CiAJCVVubG9ja0J1ZkhkcihidWYs IGJ1Zl9zdGF0ZSk7CisJCWlmIChub3dhaXQpCisJCQlyZXR1cm4gZmFsc2U7CiAJCVdhaXRJTyhi dWYpOwogCX0KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvbG9jYWxi dWYuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2xvY2FsYnVmLmMKaW5kZXggMWJlNGY0 ZjhkYS4uNzE3YjhmNThkYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIv bG9jYWxidWYuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9sb2NhbGJ1Zi5jCkBA IC0xMDksMTAgKzEwOSw5IEBAIFByZWZldGNoTG9jYWxCdWZmZXIoU01nclJlbGF0aW9uIHNtZ3Is IEZvcmtOdW1iZXIgZm9ya051bSwKICAqIExvY2FsQnVmZmVyQWxsb2MgLQogICoJICBGaW5kIG9y IGNyZWF0ZSBhIGxvY2FsIGJ1ZmZlciBmb3IgdGhlIGdpdmVuIHBhZ2Ugb2YgdGhlIGdpdmVuIHJl bGF0aW9uLgogICoKLSAqIEFQSSBpcyBzaW1pbGFyIHRvIGJ1Zm1nci5jJ3MgQnVmZmVyQWxsb2Ms IGV4Y2VwdCB0aGF0IHdlIGRvIG5vdCBuZWVkCi0gKiB0byBkbyBhbnkgbG9ja2luZyBzaW5jZSB0 aGlzIGlzIGFsbCBsb2NhbC4gICBBbHNvLCBJT19JTl9QUk9HUkVTUwotICogZG9lcyBub3QgZ2V0 IHNldC4gIExhc3RseSwgd2Ugc3VwcG9ydCBvbmx5IGRlZmF1bHQgYWNjZXNzIHN0cmF0ZWd5Ci0g KiAoaGVuY2UsIHVzYWdlX2NvdW50IGlzIGFsd2F5cyBhZHZhbmNlZCkuCisgKiBBUEkgaXMgc2lt aWxhciB0byBidWZtZ3IuYydzIEJ1ZmZlckFsbG9jLCBleGNlcHQgdGhhdCB3ZSBkbyBub3QgbmVl ZCB0byBkbworICogYW55IGxvY2tpbmcgc2luY2UgdGhpcyBpcyBhbGwgbG9jYWwuICBXZSBzdXBw b3J0IG9ubHkgZGVmYXVsdCBhY2Nlc3MKKyAqIHN0cmF0ZWd5IChoZW5jZSwgdXNhZ2VfY291bnQg aXMgYWx3YXlzIGFkdmFuY2VkKS4KICAqLwogQnVmZmVyRGVzYyAqCiBMb2NhbEJ1ZmZlckFsbG9j KFNNZ3JSZWxhdGlvbiBzbWdyLCBGb3JrTnVtYmVyIGZvcmtOdW0sIEJsb2NrTnVtYmVyIGJsb2Nr TnVtLApAQCAtMjg4LDcgKzI4Nyw3IEBAIEdldExvY2FsVmljdGltQnVmZmVyKHZvaWQpCiB9CiAK IC8qIHNlZSBMaW1pdEFkZGl0aW9uYWxQaW5zKCkgKi8KLXN0YXRpYyB2b2lkCit2b2lkCiBMaW1p dEFkZGl0aW9uYWxMb2NhbFBpbnModWludDMyICphZGRpdGlvbmFsX3BpbnMpCiB7CiAJdWludDMy CQltYXhfcGluczsKQEAgLTI5OCw5ICsyOTcsMTAgQEAgTGltaXRBZGRpdGlvbmFsTG9jYWxQaW5z KHVpbnQzMiAqYWRkaXRpb25hbF9waW5zKQogCiAJLyoKIAkgKiBJbiBjb250cmFzdCB0byBMaW1p dEFkZGl0aW9uYWxQaW5zKCkgb3RoZXIgYmFja2VuZHMgZG9uJ3QgcGxheSBhIHJvbGUKLQkgKiBo ZXJlLiBXZSBjYW4gYWxsb3cgdXAgdG8gTkxvY0J1ZmZlciBwaW5zIGluIHRvdGFsLgorCSAqIGhl cmUuIFdlIGNhbiBhbGxvdyB1cCB0byBOTG9jQnVmZmVyIHBpbnMgaW4gdG90YWwsIGJ1dCBpdCBt aWdodCBub3QgYmUKKwkgKiBpbml0aWFsaXplZCB5ZXQgc28gcmVhZCBudW1fdGVtcF9idWZmZXJz LgogCSAqLwotCW1heF9waW5zID0gKE5Mb2NCdWZmZXIgLSBOTG9jYWxQaW5uZWRCdWZmZXJzKTsK KwltYXhfcGlucyA9IChudW1fdGVtcF9idWZmZXJzIC0gTkxvY2FsUGlubmVkQnVmZmVycyk7CiAK IAlpZiAoKmFkZGl0aW9uYWxfcGlucyA+PSBtYXhfcGlucykKIAkJKmFkZGl0aW9uYWxfcGlucyA9 IG1heF9waW5zOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9tZXNvbi5idWlsZCBi L3NyYy9iYWNrZW5kL3N0b3JhZ2UvbWVzb24uYnVpbGQKaW5kZXggNDAzNDViZGNhMi4uNzM5ZDEz MjkzZiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9tZXNvbi5idWlsZAorKysgYi9z cmMvYmFja2VuZC9zdG9yYWdlL21lc29uLmJ1aWxkCkBAIC0xLDUgKzEsNiBAQAogIyBDb3B5cmln aHQgKGMpIDIwMjItMjAyNCwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKIAor c3ViZGlyKCdhaW8nKQogc3ViZGlyKCdidWZmZXInKQogc3ViZGlyKCdmaWxlJykKIHN1YmRpcign ZnJlZXNwYWNlJykKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9zbWdyLmMg Yi9zcmMvYmFja2VuZC9zdG9yYWdlL3NtZ3Ivc21nci5jCmluZGV4IDU2M2EwYmU1YzcuLjBkNzI3 MmU3OTYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9zbWdyLmMKKysrIGIv c3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdyL3NtZ3IuYwpAQCAtMTQ3LDcgKzE0Nyw5IEBAIHNtZ3Jz aHV0ZG93bihpbnQgY29kZSwgRGF0dW0gYXJnKQogLyoKICAqIHNtZ3JvcGVuKCkgLS0gUmV0dXJu IGFuIFNNZ3JSZWxhdGlvbiBvYmplY3QsIGNyZWF0aW5nIGl0IGlmIG5lZWQgYmUuCiAgKgotICog VGhpcyBkb2VzIG5vdCBhdHRlbXB0IHRvIGFjdHVhbGx5IG9wZW4gdGhlIHVuZGVybHlpbmcgZmls ZS4KKyAqIFRoaXMgZG9lcyBub3QgYXR0ZW1wdCB0byBhY3R1YWxseSBvcGVuIHRoZSB1bmRlcmx5 aW5nIGZpbGVzLiAgVGhlIHJldHVybmVkCisgKiBvYmplY3QgcmVtYWlucyB2YWxpZCBhdCBsZWFz dCB1bnRpbCBBdEVPWGFjdF9TTWdyKCkgaXMgY2FsbGVkLCBvciB1bnRpbAorICogc21ncmRlc3Ry b3koKSBpcyBjYWxsZWQgaW4gbm9uLXRyYW5zYWN0aW9uIGJhY2tlbmRzLgogICovCiBTTWdyUmVs YXRpb24KIHNtZ3JvcGVuKFJlbEZpbGVMb2NhdG9yIHJsb2NhdG9yLCBCYWNrZW5kSWQgYmFja2Vu ZCkKQEAgLTI1OSwxMCArMjYxLDEwIEBAIHNtZ3JleGlzdHMoU01nclJlbGF0aW9uIHJlbG4sIEZv cmtOdW1iZXIgZm9ya251bSkKIH0KIAogLyoKLSAqIHNtZ3JjbG9zZSgpIC0tIENsb3NlIGFuZCBk ZWxldGUgYW4gU01nclJlbGF0aW9uIG9iamVjdC4KKyAqIHNtZ3JkZXN0cm95KCkgLS0gRGVsZXRl IGFuIFNNZ3JSZWxhdGlvbiBvYmplY3QuCiAgKi8KIHZvaWQKLXNtZ3JjbG9zZShTTWdyUmVsYXRp b24gcmVsbikKK3NtZ3JkZXN0cm95KFNNZ3JSZWxhdGlvbiByZWxuKQogewogCVNNZ3JSZWxhdGlv biAqb3duZXI7CiAJRm9ya051bWJlcglmb3JrbnVtOwpAQCAtMjg5LDEyICsyOTEsMTQgQEAgc21n cmNsb3NlKFNNZ3JSZWxhdGlvbiByZWxuKQogfQogCiAvKgotICogc21ncnJlbGVhc2UoKSAtLSBS ZWxlYXNlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGlzIG9iamVjdC4KKyAqIHNtZ3JjbG9zZSgp IC0tIFJlbGVhc2UgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoaXMgb2JqZWN0LgogICoKLSAqIFRo ZSBvYmplY3QgcmVtYWlucyB2YWxpZC4KKyAqIFRoZSBvYmplY3QgcmVtYWlucyB2YWxpZCwgYnV0 IGlzIG1vdmVkIHRvIHRoZSB1bmtub3duIGxpc3Qgd2hlcmUgaXQgd2lsbAorICogYmUgZGVzdHJv eWVkIGJ5IEF0RU9YYWN0X1NNZ3IoKS4gIEl0IG1heSBiZSByZS1vd25lZCBpZiBpdCBpcyBhY2Nl c3NlZCBieSBhCisgKiByZWxhdGlvbiBiZWZvcmUgdGhlbi4KICAqLwogdm9pZAotc21ncnJlbGVh c2UoU01nclJlbGF0aW9uIHJlbG4pCitzbWdyY2xvc2UoU01nclJlbGF0aW9uIHJlbG4pCiB7CiAJ Zm9yIChGb3JrTnVtYmVyIGZvcmtudW0gPSAwOyBmb3JrbnVtIDw9IE1BWF9GT1JLTlVNOyBmb3Jr bnVtKyspCiAJewpAQCAtMzAyLDE1ICszMDYsMjAgQEAgc21ncnJlbGVhc2UoU01nclJlbGF0aW9u IHJlbG4pCiAJCXJlbG4tPnNtZ3JfY2FjaGVkX25ibG9ja3NbZm9ya251bV0gPSBJbnZhbGlkQmxv Y2tOdW1iZXI7CiAJfQogCXJlbG4tPnNtZ3JfdGFyZ2Jsb2NrID0gSW52YWxpZEJsb2NrTnVtYmVy OworCisJaWYgKHJlbG4tPnNtZ3Jfb3duZXIpCisJeworCQkqcmVsbi0+c21ncl9vd25lciA9IE5V TEw7CisJCXJlbG4tPnNtZ3Jfb3duZXIgPSBOVUxMOworCQlkbGlzdF9wdXNoX3RhaWwoJnVub3du ZWRfcmVsbnMsICZyZWxuLT5ub2RlKTsKKwl9CiB9CiAKIC8qCi0gKiBzbWdycmVsZWFzZWFsbCgp IC0tIFJlbGVhc2UgcmVzb3VyY2VzIHVzZWQgYnkgYWxsIG9iamVjdHMuCi0gKgotICogVGhpcyBp cyBjYWxsZWQgZm9yIFBST0NTSUdOQUxfQkFSUklFUl9TTUdSUkVMRUFTRS4KKyAqIHNtZ3JjbG9z ZWFsbCgpIC0tIENsb3NlIGFsbCBvYmplY3RzLgogICovCiB2b2lkCi1zbWdycmVsZWFzZWFsbCh2 b2lkKQorc21ncmNsb3NlYWxsKHZvaWQpCiB7CiAJSEFTSF9TRVFfU1RBVFVTIHN0YXR1czsKIAlT TWdyUmVsYXRpb24gcmVsbjsKQEAgLTMyMiwxNCArMzMxLDE3IEBAIHNtZ3JyZWxlYXNlYWxsKHZv aWQpCiAJaGFzaF9zZXFfaW5pdCgmc3RhdHVzLCBTTWdyUmVsYXRpb25IYXNoKTsKIAogCXdoaWxl ICgocmVsbiA9IChTTWdyUmVsYXRpb24pIGhhc2hfc2VxX3NlYXJjaCgmc3RhdHVzKSkgIT0gTlVM TCkKLQkJc21ncnJlbGVhc2UocmVsbik7CisJCXNtZ3JjbG9zZShyZWxuKTsKIH0KIAogLyoKLSAq IHNtZ3JjbG9zZWFsbCgpIC0tIENsb3NlIGFsbCBleGlzdGluZyBTTWdyUmVsYXRpb24gb2JqZWN0 cy4KKyAqIHNtZ3JkZXN0cm95YWxsKCkgLS0gRGVzdHJveSBhbGwgU01nclJlbGF0aW9uIG9iamVj dHMuCisgKgorICogSXQgbXVzdCBiZSBrbm93biB0aGF0IHRoZXJlIGFyZSBubyBwb2ludGVycyB0 byBTTWdyUmVsYXRpb25zLCBvdGhlciB0aGFuCisgKiB0aG9zZSByZWdpc3RlcmVkIHdpdGggc21n cnNldG93bmVyKCkuCiAgKi8KIHZvaWQKLXNtZ3JjbG9zZWFsbCh2b2lkKQorc21ncmRlc3Ryb3lh bGwodm9pZCkKIHsKIAlIQVNIX1NFUV9TVEFUVVMgc3RhdHVzOwogCVNNZ3JSZWxhdGlvbiByZWxu OwpAQCAtMzQxLDcgKzM1Myw3IEBAIHNtZ3JjbG9zZWFsbCh2b2lkKQogCWhhc2hfc2VxX2luaXQo JnN0YXR1cywgU01nclJlbGF0aW9uSGFzaCk7CiAKIAl3aGlsZSAoKHJlbG4gPSAoU01nclJlbGF0 aW9uKSBoYXNoX3NlcV9zZWFyY2goJnN0YXR1cykpICE9IE5VTEwpCi0JCXNtZ3JjbG9zZShyZWxu KTsKKwkJc21ncmRlc3Ryb3kocmVsbik7CiB9CiAKIC8qCkBAIC03MzMsNyArNzQ1LDggQEAgc21n cmltbWVkc3luYyhTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtKQogICogQXRF T1hhY3RfU01ncgogICoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZHVyaW5nIHRyYW5zYWN0 aW9uIGNvbW1pdCBvciBhYm9ydCAoaXQgZG9lc24ndAotICogcGFydGljdWxhcmx5IGNhcmUgd2hp Y2gpLiAgQWxsIHRyYW5zaWVudCBTTWdyUmVsYXRpb24gb2JqZWN0cyBhcmUgY2xvc2VkLgorICog cGFydGljdWxhcmx5IGNhcmUgd2hpY2gpLiAgQWxsIHRyYW5zaWVudCBTTWdyUmVsYXRpb24gb2Jq ZWN0cyBhcmUKKyAqIGRlc3Ryb3llZC4KICAqCiAgKiBXZSBkbyB0aGlzIGFzIGEgY29tcHJvbWlz ZSBiZXR3ZWVuIHdhbnRpbmcgdHJhbnNpZW50IFNNZ3JSZWxhdGlvbnMgdG8KICAqIGxpdmUgYXdo aWxlICh0byBhbW9ydGl6ZSB0aGUgY29zdHMgb2YgYmxpbmQgd3JpdGVzIG9mIG11bHRpcGxlIGJs b2NrcykKQEAgLTc0Nyw3ICs3NjAsNyBAQCBBdEVPWGFjdF9TTWdyKHZvaWQpCiAJZGxpc3RfbXV0 YWJsZV9pdGVyIGl0ZXI7CiAKIAkvKgotCSAqIFphcCBhbGwgdW5vd25lZCBTTWdyUmVsYXRpb25z LiAgV2UgcmVseSBvbiBzbWdyY2xvc2UoKSB0byByZW1vdmUgZWFjaAorCSAqIFphcCBhbGwgdW5v d25lZCBTTWdyUmVsYXRpb25zLiAgV2UgcmVseSBvbiBzbWdyZGVzdHJveSgpIHRvIHJlbW92ZSBl YWNoCiAJICogb25lIGZyb20gdGhlIGxpc3QuCiAJICovCiAJZGxpc3RfZm9yZWFjaF9tb2RpZnko aXRlciwgJnVub3duZWRfcmVsbnMpCkBAIC03NTcsNyArNzcwLDcgQEAgQXRFT1hhY3RfU01ncih2 b2lkKQogCiAJCUFzc2VydChyZWwtPnNtZ3Jfb3duZXIgPT0gTlVMTCk7CiAKLQkJc21ncmNsb3Nl KHJlbCk7CisJCXNtZ3JkZXN0cm95KHJlbCk7CiAJfQogfQogCkBAIC03NjgsNiArNzgxLDYgQEAg QXRFT1hhY3RfU01ncih2b2lkKQogYm9vbAogUHJvY2Vzc0JhcnJpZXJTbWdyUmVsZWFzZSh2b2lk KQogewotCXNtZ3JyZWxlYXNlYWxsKCk7CisJc21ncmNsb3NlYWxsKCk7CiAJcmV0dXJuIHRydWU7 CiB9CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2J1Zm1nci5oIGIvc3JjL2luY2x1 ZGUvc3RvcmFnZS9idWZtZ3IuaAppbmRleCBkNTFkNDZkMzM1Li5hMzhmMWFjYjM3IDEwMDY0NAot LS0gYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2J1Zm1nci5oCisrKyBiL3NyYy9pbmNsdWRlL3N0b3Jh Z2UvYnVmbWdyLmgKQEAgLTE0LDYgKzE0LDcgQEAKICNpZm5kZWYgQlVGTUdSX0gKICNkZWZpbmUg QlVGTUdSX0gKIAorI2luY2x1ZGUgInBvcnQvcGdfaW92ZWMuaCIKICNpbmNsdWRlICJzdG9yYWdl L2Jsb2NrLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9idWYuaCIKICNpbmNsdWRlICJzdG9yYWdlL2J1 ZnBhZ2UuaCIKQEAgLTE1OCw2ICsxNTksMTEgQEAgZXh0ZXJuIFBHRExMSU1QT1JUIGludDMyICpM b2NhbFJlZkNvdW50OwogI2RlZmluZSBCVUZGRVJfTE9DS19TSEFSRQkJMQogI2RlZmluZSBCVUZG RVJfTE9DS19FWENMVVNJVkUJMgogCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgYnVmZmVycyBm b3IgbXVsdGktYnVmZmVyIEkvTyBmdW5jdGlvbnMuICBUaGlzIGlzIHNldCB0bworICogYWxsb3cg MTI4a0IgdHJhbnNmZXJzLCB1bmxlc3MgQkxDS1NaIGFuZCBJT1ZfTUFYIGltcGx5IGEgYSBzbWFs bGVyIG1heGltdW0uCisgKi8KKyNkZWZpbmUgTUFYX0JVRkZFUlNfUEVSX1RSQU5TRkVSIE1pbihQ R19JT1ZfTUFYLCAoMTI4ICogMTAyNCkgLyBCTENLU1opCiAKIC8qCiAgKiBwcm90b3R5cGVzIGZv ciBmdW5jdGlvbnMgaW4gYnVmbWdyLmMKQEAgLTE3Nyw2ICsxODMsMTggQEAgZXh0ZXJuIEJ1ZmZl ciBSZWFkQnVmZmVyV2l0aG91dFJlbGNhY2hlKFJlbEZpbGVMb2NhdG9yIHJsb2NhdG9yLAogCQkJ CQkJCQkJCUZvcmtOdW1iZXIgZm9ya051bSwgQmxvY2tOdW1iZXIgYmxvY2tOdW0sCiAJCQkJCQkJ CQkJUmVhZEJ1ZmZlck1vZGUgbW9kZSwgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgc3RyYXRlZ3ksCiAJ CQkJCQkJCQkJYm9vbCBwZXJtYW5lbnQpOworZXh0ZXJuIEJ1ZmZlciBQcmVwYXJlUmVhZEJ1ZmZl cihCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yLAorCQkJCQkJCQlGb3JrTnVtYmVyIGZvcmtOdW0s CisJCQkJCQkJCUJsb2NrTnVtYmVyIGJsb2NrTnVtLAorCQkJCQkJCQlCdWZmZXJBY2Nlc3NTdHJh dGVneSBzdHJhdGVneSwKKwkJCQkJCQkJYm9vbCAqZm91bmRQdHIpOworZXh0ZXJuIHZvaWQgQ29t cGxldGVSZWFkQnVmZmVycyhCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yLAorCQkJCQkJCQlCdWZm ZXIgKmJ1ZmZlcnMsCisJCQkJCQkJCUZvcmtOdW1iZXIgZm9ya251bSwKKwkJCQkJCQkJQmxvY2tO dW1iZXIgYmxvY2tudW0sCisJCQkJCQkJCWludCBuYmxvY2tzLAorCQkJCQkJCQlib29sIHplcm9f b25fZXJyb3IsCisJCQkJCQkJCUJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5KTsKIGV4dGVy biB2b2lkIFJlbGVhc2VCdWZmZXIoQnVmZmVyIGJ1ZmZlcik7CiBleHRlcm4gdm9pZCBVbmxvY2tS ZWxlYXNlQnVmZmVyKEJ1ZmZlciBidWZmZXIpOwogZXh0ZXJuIGJvb2wgQnVmZmVySXNFeGNsdXNp dmVMb2NrZWQoQnVmZmVyIGJ1ZmZlcik7CkBAIC0yNDcsOSArMjY1LDEzIEBAIGV4dGVybiB2b2lk IExvY2tCdWZmZXJGb3JDbGVhbnVwKEJ1ZmZlciBidWZmZXIpOwogZXh0ZXJuIGJvb2wgQ29uZGl0 aW9uYWxMb2NrQnVmZmVyRm9yQ2xlYW51cChCdWZmZXIgYnVmZmVyKTsKIGV4dGVybiBib29sIElz QnVmZmVyQ2xlYW51cE9LKEJ1ZmZlciBidWZmZXIpOwogZXh0ZXJuIGJvb2wgSG9sZGluZ0J1ZmZl clBpblRoYXREZWxheXNSZWNvdmVyeSh2b2lkKTsKK2V4dGVybiB2b2lkIFplcm9CdWZmZXIoQnVm ZmVyIGJ1ZmZlciwgUmVhZEJ1ZmZlck1vZGUgbW9kZSk7CiAKIGV4dGVybiBib29sIEJnQnVmZmVy U3luYyhzdHJ1Y3QgV3JpdGViYWNrQ29udGV4dCAqd2JfY29udGV4dCk7CiAKK2V4dGVybiB2b2lk IExpbWl0QWRkaXRpb25hbFBpbnModWludDMyICphZGRpdGlvbmFsX3BpbnMpOworZXh0ZXJuIHZv aWQgTGltaXRBZGRpdGlvbmFsTG9jYWxQaW5zKHVpbnQzMiAqYWRkaXRpb25hbF9waW5zKTsKKwog LyogaW4gYnVmX2luaXQuYyAqLwogZXh0ZXJuIHZvaWQgSW5pdEJ1ZmZlclBvb2wodm9pZCk7CiBl eHRlcm4gU2l6ZSBCdWZmZXJTaG1lbVNpemUodm9pZCk7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVk ZS9zdG9yYWdlL3NtZ3IuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21nci5oCmluZGV4IDUyN2Nk MmEwNTYuLmQ4ZmZlMzk3ZmEgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21nci5o CisrKyBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21nci5oCkBAIC04NSw4ICs4NSw4IEBAIGV4dGVy biB2b2lkIHNtZ3JjbGVhcm93bmVyKFNNZ3JSZWxhdGlvbiAqb3duZXIsIFNNZ3JSZWxhdGlvbiBy ZWxuKTsKIGV4dGVybiB2b2lkIHNtZ3JjbG9zZShTTWdyUmVsYXRpb24gcmVsbik7CiBleHRlcm4g dm9pZCBzbWdyY2xvc2VhbGwodm9pZCk7CiBleHRlcm4gdm9pZCBzbWdyY2xvc2VyZWxsb2NhdG9y KFJlbEZpbGVMb2NhdG9yQmFja2VuZCBybG9jYXRvcik7Ci1leHRlcm4gdm9pZCBzbWdycmVsZWFz ZShTTWdyUmVsYXRpb24gcmVsbik7Ci1leHRlcm4gdm9pZCBzbWdycmVsZWFzZWFsbCh2b2lkKTsK K2V4dGVybiB2b2lkIHNtZ3JkZXN0cm95KFNNZ3JSZWxhdGlvbiByZWxuKTsKK2V4dGVybiB2b2lk IHNtZ3JkZXN0cm95YWxsKHZvaWQpOwogZXh0ZXJuIHZvaWQgc21ncmNyZWF0ZShTTWdyUmVsYXRp b24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtLCBib29sIGlzUmVkbyk7CiBleHRlcm4gdm9pZCBz bWdyZG9zeW5jYWxsKFNNZ3JSZWxhdGlvbiAqcmVscywgaW50IG5yZWxzKTsKIGV4dGVybiB2b2lk IHNtZ3Jkb3VubGlua2FsbChTTWdyUmVsYXRpb24gKnJlbHMsIGludCBucmVscywgYm9vbCBpc1Jl ZG8pOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9zdHJlYW1pbmdfcmVhZC5oIGIv c3JjL2luY2x1ZGUvc3RvcmFnZS9zdHJlYW1pbmdfcmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAuLjQwYzM0MDhjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaW5j bHVkZS9zdG9yYWdlL3N0cmVhbWluZ19yZWFkLmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBT VFJFQU1JTkdfUkVBRF9ICisjZGVmaW5lIFNUUkVBTUlOR19SRUFEX0gKKworI2luY2x1ZGUgInN0 b3JhZ2UvYnVmbWdyLmgiCisjaW5jbHVkZSAic3RvcmFnZS9mZC5oIgorI2luY2x1ZGUgInN0b3Jh Z2Uvc21nci5oIgorCisvKiBEZWZhdWx0IHR1bmluZywgcmVhc29uYWJsZSBmb3IgbWFueSB1c2Vy cy4gKi8KKyNkZWZpbmUgUEdTUl9GTEFHX0RFRkFVTFQgMHgwMAorCisvKgorICogSS9PIHN0cmVh bXMgdGhhdCBhcmUgcGVyZm9ybWluZyBtYWludGVuYW5jZSB3b3JrIG9uIGJlaGFsZiBvZiBwb3Rl bnRpYWxseQorICogbWFueSB1c2Vycy4KKyAqLworI2RlZmluZSBQR1NSX0ZMQUdfTUFJTlRFTkFO Q0UgMHgwMQorCisvKgorICogV2UgdXN1YWxseSBhdm9pZCBpc3N1aW5nIHByZWZldGNoIGFkdmlj ZSBhdXRvbWF0aWNhbGx5IHdoZW4gc2VxdWVudGlhbAorICogYWNjZXNzIGlzIGRldGVjdGVkLCBi dXQgdGhpcyBmbGFnIGV4cGxpY2l0bHkgZGlzYWJsZXMgaXQsIGZvciBjYXNlcyB0aGF0CisgKiBt aWdodCBub3QgYmUgY29ycmVjdGx5IGRldGVjdGVkLiAgRXhwbGljaXQgYWR2aWNlIGlzIGtub3du IHRvIHBlcmZvcm0gd29yc2UKKyAqIHRoYW4gbGV0dGluZyB0aGUga2VybmVsIChhdCBsZWFzdCBM aW51eCkgZGV0ZWN0IHNlcXVlbnRpYWwgYWNjZXNzLgorICovCisjZGVmaW5lIFBHU1JfRkxBR19T RVFVRU5USUFMIDB4MDIKKworc3RydWN0IFBnU3RyZWFtaW5nUmVhZDsKK3R5cGVkZWYgc3RydWN0 IFBnU3RyZWFtaW5nUmVhZCBQZ1N0cmVhbWluZ1JlYWQ7CisKKy8qIENhbGxiYWNrIHRoYXQgcmV0 dXJucyB0aGUgbmV4dCBibG9jayBudW1iZXIgdG8gcmVhZC4gKi8KK3R5cGVkZWYgQmxvY2tOdW1i ZXIgKCpQZ1N0cmVhbWluZ1JlYWRCdWZmZXJDQikgKFBnU3RyZWFtaW5nUmVhZCAqcGdzciwKKwkJ CQkJCQkJCQkJCXZvaWQgKnBnc3JfcHJpdmF0ZSwKKwkJCQkJCQkJCQkJCXZvaWQgKnBlcl9idWZm ZXJfcHJpdmF0ZSk7CisKK2V4dGVybiBQZ1N0cmVhbWluZ1JlYWQgKnBnX3N0cmVhbWluZ19yZWFk X2J1ZmZlcl9hbGxvYyhpbnQgZmxhZ3MsCisJCQkJCQkJCQkJCQkJICAgdm9pZCAqcGdzcl9wcml2 YXRlLAorCQkJCQkJCQkJCQkJCSAgIHNpemVfdCBwZXJfYnVmZmVyX3ByaXZhdGVfc2l6ZSwKKwkJ CQkJCQkJCQkJCQkgICBCdWZmZXJBY2Nlc3NTdHJhdGVneSBzdHJhdGVneSwKKwkJCQkJCQkJCQkJ CQkgICBCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yLAorCQkJCQkJCQkJCQkJCSAgIEZvcmtOdW1i ZXIgZm9ya251bSwKKwkJCQkJCQkJCQkJCQkgICBQZ1N0cmVhbWluZ1JlYWRCdWZmZXJDQiBuZXh0 X2Jsb2NrX2NiKTsKKworZXh0ZXJuIHZvaWQgcGdfc3RyZWFtaW5nX3JlYWRfcHJlZmV0Y2goUGdT dHJlYW1pbmdSZWFkICpwZ3NyKTsKK2V4dGVybiBCdWZmZXIgcGdfc3RyZWFtaW5nX3JlYWRfYnVm ZmVyX2dldF9uZXh0KFBnU3RyZWFtaW5nUmVhZCAqcGdzciwgdm9pZCAqKnBlcl9idWZmZXJfcHJp dmF0ZSk7CitleHRlcm4gdm9pZCBwZ19zdHJlYW1pbmdfcmVhZF9mcmVlKFBnU3RyZWFtaW5nUmVh ZCAqcGdzcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvdXRpbHMvcmVsLmgg Yi9zcmMvaW5jbHVkZS91dGlscy9yZWwuaAppbmRleCBhNTg0YjFkZGZmLi42NjM2Y2M4MmMwIDEw MDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy9yZWwuaAorKysgYi9zcmMvaW5jbHVkZS91dGls cy9yZWwuaApAQCAtNTYxLDEyICs1NjEsNiBAQCB0eXBlZGVmIHN0cnVjdCBWaWV3T3B0aW9ucwog ICoKICAqIFZlcnkgbGl0dGxlIGNvZGUgaXMgYXV0aG9yaXplZCB0byB0b3VjaCByZWwtPnJkX3Nt Z3IgZGlyZWN0bHkuICBJbnN0ZWFkCiAgKiB1c2UgdGhpcyBmdW5jdGlvbiB0byBmZXRjaCBpdHMg dmFsdWUuCi0gKgotICogTm90ZTogc2luY2UgYSByZWxjYWNoZSBmbHVzaCBjYW4gY2F1c2UgdGhl IGZpbGUgaGFuZGxlIHRvIGJlIGNsb3NlZCBhZ2FpbiwKLSAqIGl0J3MgdW53aXNlIHRvIGhvbGQg b250byB0aGUgcG9pbnRlciByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGZvciBhbnkKLSAqIGxv bmcgcGVyaW9kLiAgUmVjb21tZW5kZWQgcHJhY3RpY2UgaXMgdG8ganVzdCByZS1leGVjdXRlIFJl bGF0aW9uR2V0U21ncgotICogZWFjaCB0aW1lIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgU01nclJl bGF0aW9uLiAgSXQncyBxdWl0ZSBjaGVhcCBpbgotICogY29tcGFyaXNvbiB0byB3aGF0ZXZlciBh biBzbWdyIGZ1bmN0aW9uIGlzIGdvaW5nIHRvIGRvLgogICovCiBzdGF0aWMgaW5saW5lIFNNZ3JS ZWxhdGlvbgogUmVsYXRpb25HZXRTbWdyKFJlbGF0aW9uIHJlbCkKZGlmZiAtLWdpdCBhL3NyYy90 b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0IGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZz Lmxpc3QKaW5kZXggN2U4NjZlM2MzZC4uMGUzNDE0NTE4NyAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xz L3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKKysrIGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZz Lmxpc3QKQEAgLTIwOTMsNiArMjA5Myw4IEBAIFBnU3RhdF9UYWJsZUNvdW50cwogUGdTdGF0X1Rh YmxlU3RhdHVzCiBQZ1N0YXRfVGFibGVYYWN0U3RhdHVzCiBQZ1N0YXRfV2FsU3RhdHMKK1BnU3Ry ZWFtaW5nUmVhZAorUGdTdHJlYW1pbmdSZWFkUmFuZ2UKIFBnWG1sRXJyb3JDb250ZXh0CiBQZ1ht bFN0cmljdG5lc3MKIFBnX2ZpbmZvX3JlY29yZAotLSAKMi4zNy4yCgo= --000000000000d13be10610d1a7c5 Content-Type: text/x-patch; charset="US-ASCII"; name="v4-0002-Index-scans-prefetch-with-streaming-read-API.patch" Content-Disposition: attachment; filename="v4-0002-Index-scans-prefetch-with-streaming-read-API.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lscbjkb61 RnJvbSBlYzgwOWUwOGZlNTlmZmMzZWFlZTc3MmQyMjY5Y2I0N2YzNjVjMGE2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNZWxhbmllIFBsYWdlbWFuIDxtZWxhbmllcGxhZ2VtYW5AZ21h aWwuY29tPgpEYXRlOiBXZWQsIDcgRmViIDIwMjQgMTI6NDc6NTEgLTA1MDAKU3ViamVjdDogW1BB VENIIHY0IDIvMl0gSW5kZXggc2NhbnMgcHJlZmV0Y2ggd2l0aCBzdHJlYW1pbmcgcmVhZCBBUEkK Ci0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX2hhbmRsZXIuYyB8ICA1NSArKysr KysrLQogc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYyAgICAgICB8IDEwNCArKysr KysrKysrKysrKy0KIHNyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNNYWluLmMgICAgICAgICAgfCAg IDQgKwogc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUluZGV4b25seXNjYW4uYyB8IDE1MyArKysr KysrKysrKysrKysrLS0tLS0tLQogc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUluZGV4c2Nhbi5j ICAgICB8ICA2MSArKysrKysrKy0KIHNyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2NyZWF0ZXBs YW4uYyAgfCAgIDEgKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm5lci5jICAgICB8 ICAgMyArCiBzcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9zdHJlYW1pbmdfcmVhZC5jIHwgIDExICst CiBzcmMvaW5jbHVkZS9hY2Nlc3MvZ2VuYW0uaCAgICAgICAgICAgICAgIHwgIDQxICsrKysrKwog c3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNjYW4uaCAgICAgICAgICAgICB8ICAxMSArKwogc3JjL2lu Y2x1ZGUvbm9kZXMvZXhlY25vZGVzLmggICAgICAgICAgICB8ICAgMSArCiBzcmMvaW5jbHVkZS9u b2Rlcy9wYXRobm9kZXMuaCAgICAgICAgICAgIHwgICAxICsKIHNyYy9pbmNsdWRlL25vZGVzL3Bs YW5ub2Rlcy5oICAgICAgICAgICAgfCAgIDEgKwogc3JjL2luY2x1ZGUvc3RvcmFnZS9zdHJlYW1p bmdfcmVhZC5oICAgICB8ICAgMiArCiBzcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCAg ICAgICAgIHwgICAyICsKIDE1IGZpbGVzIGNoYW5nZWQsIDQwMSBpbnNlcnRpb25zKCspLCA1MCBk ZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1f aGFuZGxlci5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX2hhbmRsZXIuYwppbmRl eCBkMTVhMDJiMmJlLi4wM2U2YjUyMmE4IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3Mv aGVhcC9oZWFwYW1faGFuZGxlci5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBh bV9oYW5kbGVyLmMKQEAgLTEwOCw2ICsxMDgsMTIgQEAgaGVhcGFtX2luZGV4X2ZldGNoX2VuZChJ bmRleEZldGNoVGFibGVEYXRhICpzY2FuKQogCXBmcmVlKGhzY2FuKTsKIH0KIAorLyoKKyAqIEZv ciB0aG9zZSB1c2luZyB0aGUgc3RyZWFtaW5nIHJlYWQgdXNlciwgdGlkIGlzIGFuIG91dHB1dCBw YXJhbWV0ZXIgc2V0IHdpdGgKKyAqIHRoZSBsYXRlc3QgVElEIG9idGFpbmVkIGZyb20gdGhlIHN0 cmVhbWluZyByZWFkIEFQSS4gRm9yIG5vbi1zdHJlYW1pbmcgcmVhZAorICogdXNlcnMsIHRpZCBp cyBhbiBpbnB1dCBwYXJhbWV0ZXIgYW5kIGNvbnRhaW5zIHRoZSBuZXh0IGJsb2NrIHRvIGJlIHJl YWQgZnJvbQorICogdGhlIGhlYXAuCisgKi8KIHN0YXRpYyBib29sCiBoZWFwYW1faW5kZXhfZmV0 Y2hfdHVwbGUoc3RydWN0IEluZGV4RmV0Y2hUYWJsZURhdGEgKnNjYW4sCiAJCQkJCQkgSXRlbVBv aW50ZXIgdGlkLApAQCAtMTI3LDkgKzEzMyw1MiBAQCBoZWFwYW1faW5kZXhfZmV0Y2hfdHVwbGUo c3RydWN0IEluZGV4RmV0Y2hUYWJsZURhdGEgKnNjYW4sCiAJCS8qIFN3aXRjaCB0byBjb3JyZWN0 IGJ1ZmZlciBpZiB3ZSBkb24ndCBoYXZlIGl0IGFscmVhZHkgKi8KIAkJQnVmZmVyCQlwcmV2X2J1 ZiA9IGhzY2FuLT54c19jYnVmOwogCi0JCWhzY2FuLT54c19jYnVmID0gUmVsZWFzZUFuZFJlYWRC dWZmZXIoaHNjYW4tPnhzX2NidWYsCi0JCQkJCQkJCQkJCSAgaHNjYW4tPnhzX2Jhc2UucmVsLAot CQkJCQkJCQkJCQkgIEl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIodGlkKSk7CisJCWlmIChzY2Fu LT5wZ3NyKQorCQl7CisJCQlUSURRdWV1ZUl0ZW0gKnJlc3VsdDsKKworCQkJaWYgKEJ1ZmZlcklz VmFsaWQoaHNjYW4tPnhzX2NidWYpKQorCQkJCVJlbGVhc2VCdWZmZXIoaHNjYW4tPnhzX2NidWYp OworCisJCQloc2Nhbi0+eHNfY2J1ZiA9IHBnX3N0cmVhbWluZ19yZWFkX2J1ZmZlcl9nZXRfbmV4 dChzY2FuLT5wZ3NyLCAodm9pZCAqKikgJnJlc3VsdCk7CisJCQlpZiAoIUJ1ZmZlcklzVmFsaWQo aHNjYW4tPnhzX2NidWYpKQorCQkJeworCQkJCS8qCisJCQkJICogSW52YWxpZGF0ZSB0aGUgaXRl bSBwb2ludGVyIHRvIGFsbG93IHRoZSBjYWxsZXIgdG8KKwkJCQkgKiBkaXN0aW5ndWlzaCBiZXR3 ZWVuIGluZGV4X2ZldGNoX2hlYXAoKSByZXR1cm5pbmcgZmFsc2UKKwkJCQkgKiBiZWNhdXNlIHRo ZSB0dXBsZSBpcyBub3QgdmlzaWJsZSBhbmQgYmVjYXVzZSB0aGUgc3RyZWFtaW5nCisJCQkJICog cmVhZCBjYWxsYmFjayByYW4gb3V0IG9mIHF1ZXVlIGl0ZW1zLgorCQkJCSAqLworCQkJCUl0ZW1Q b2ludGVyU2V0SW52YWxpZCh0aWQpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKworCQkJLyog U2V0IHRoaXMgZm9yIHVzZSBiZWxvdyAqLworCQkJKnRpZCA9IHJlc3VsdC0+dGlkOworCisJCQlz Y2FuLT50aWQgPSByZXN1bHQtPnRpZDsKKwkJCXNjYW4tPnJlY2hlY2sgPSByZXN1bHQtPnJlY2hl Y2s7CisKKwkJCWlmIChzY2FuLT5pdHVwKQorCQkJCXBmcmVlKHNjYW4tPml0dXApOworCQkJc2Nh bi0+aXR1cCA9IE5VTEw7CisKKwkJCWlmIChzY2FuLT5odHVwKQorCQkJCXBmcmVlKHNjYW4tPmh0 dXApOworCQkJc2Nhbi0+aHR1cCA9IE5VTEw7CisKKwkJCWlmIChyZXN1bHQtPml0dXApCisJCQkJ c2Nhbi0+aXR1cCA9IENvcHlJbmRleFR1cGxlKHJlc3VsdC0+aXR1cCk7CisJCQlpZiAocmVzdWx0 LT5odHVwKQorCQkJCXNjYW4tPmh0dXAgPSBoZWFwX2NvcHl0dXBsZShyZXN1bHQtPmh0dXApOwor CQl9CisJCWVsc2UKKwkJeworCQkJaHNjYW4tPnhzX2NidWYgPSBSZWxlYXNlQW5kUmVhZEJ1ZmZl cihoc2Nhbi0+eHNfY2J1ZiwKKwkJCQkJCQkJCQkJCSAgaHNjYW4tPnhzX2Jhc2UucmVsLAorCQkJ CQkJCQkJCQkJICBJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKHRpZCkpOworCQl9CisKIAogCQkv KgogCQkgKiBQcnVuZSBwYWdlLCBidXQgb25seSBpZiB3ZSB3ZXJlbid0IGFscmVhZHkgb24gdGhp cyBwYWdlCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgvaW5kZXhhbS5jIGIv c3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYwppbmRleCBiYmQ0OTlhYmNmLi4wYmY1 MGJjZDgzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgvaW5kZXhhbS5jCisr KyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9pbmRleC9pbmRleGFtLmMKQEAgLTI0OCw2ICsyNDgsOTEg QEAgaW5kZXhfaW5zZXJ0X2NsZWFudXAoUmVsYXRpb24gaW5kZXhSZWxhdGlvbiwKIAkJaW5kZXhS ZWxhdGlvbi0+cmRfaW5kYW0tPmFtaW5zZXJ0Y2xlYW51cChpbmRleEluZm8pOwogfQogCit2b2lk Cit0aWRfcXVldWVfcmVzZXQoVElEUXVldWUgKnEpCit7CisJcS0+aGVhZCA9IHEtPnRhaWwgPSAw OworfQorCitUSURRdWV1ZSAqCit0aWRfcXVldWVfYWxsb2MoaW50IHNpemUpCit7CisJVElEUXVl dWUgICAqcmVzdWx0OworCisJcmVzdWx0ID0gcGFsbG9jKHNpemVvZihUSURRdWV1ZSkgKyAoc2l6 ZW9mKFRJRFF1ZXVlSXRlbSkgKiBzaXplKSk7CisJcmVzdWx0LT5zaXplID0gc2l6ZTsKKwl0aWRf cXVldWVfcmVzZXQocmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgVElEUXVl dWVJdGVtCitpbmRleF90aWRfZGVxdWV1ZShUSURRdWV1ZSAqdGlkX3F1ZXVlKQoreworCVRJRFF1 ZXVlSXRlbSByZXN1bHQ7CisKKwlBc3NlcnQodGlkX3F1ZXVlLT50YWlsID4gdGlkX3F1ZXVlLT5o ZWFkKTsKKwlyZXN1bHQgPSB0aWRfcXVldWUtPmRhdGFbdGlkX3F1ZXVlLT5oZWFkICUgdGlkX3F1 ZXVlLT5zaXplXTsKKwl0aWRfcXVldWUtPmhlYWQrKzsKKworCXJldHVybiByZXN1bHQ7Cit9CisK K3ZvaWQKK2luZGV4X3RpZF9lbnF1ZXVlKFRJRFF1ZXVlICp0aWRfcXVldWUsIEl0ZW1Qb2ludGVy IHRpZCwgYm9vbCByZWNoZWNrLAorCQkJCSAgSGVhcFR1cGxlIGh0dXAsIEluZGV4VHVwbGUgaXR1 cCkKK3sKKwlUSURRdWV1ZUl0ZW0gKmN1cjsKKworCUFzc2VydCh0aWRfcXVldWUtPnRhaWwgPj0g dGlkX3F1ZXVlLT5oZWFkKTsKKwlBc3NlcnQoIVRJRF9RVUVVRV9GVUxMKHRpZF9xdWV1ZSkpOwor CWN1ciA9ICZ0aWRfcXVldWUtPmRhdGFbdGlkX3F1ZXVlLT50YWlsICUgdGlkX3F1ZXVlLT5zaXpl XTsKKwlJdGVtUG9pbnRlclNldCgmY3VyLT50aWQsCisJCQkJICAgSXRlbVBvaW50ZXJHZXRCbG9j a051bWJlcih0aWQpLCBJdGVtUG9pbnRlckdldE9mZnNldE51bWJlcih0aWQpKTsKKwljdXItPnJl Y2hlY2sgPSByZWNoZWNrOworCWN1ci0+aXR1cCA9IE5VTEw7CisJY3VyLT5odHVwID0gTlVMTDsK KworCWlmIChpdHVwKQorCQljdXItPml0dXAgPSBDb3B5SW5kZXhUdXBsZShpdHVwKTsKKworCWlm IChodHVwKQorCQljdXItPmh0dXAgPSBoZWFwX2NvcHl0dXBsZShodHVwKTsKKworCXRpZF9xdWV1 ZS0+dGFpbCsrOworfQorCitzdGF0aWMgQmxvY2tOdW1iZXIKK2luZGV4X3Bnc3JfbmV4dF9zaW5n bGUoUGdTdHJlYW1pbmdSZWFkICpwZ3NyLCB2b2lkICpwZ3NyX3ByaXZhdGUsIHZvaWQgKnBlcl9i dWZmZXJfZGF0YSkKK3sKKwlJbmRleFNjYW5EZXNjIHNjYW4gPSBwZ3NyX3ByaXZhdGU7CisJVElE UXVldWVJdGVtICpyZXN1bHQgPSBwZXJfYnVmZmVyX2RhdGE7CisKKwlzY2FuLT5raWxsX3ByaW9y X3R1cGxlID0gZmFsc2U7CisJc2Nhbi0+eHNfaGVhcF9jb250aW51ZSA9IGZhbHNlOworCisJaWYg KFRJRF9RVUVVRV9FTVBUWShzY2FuLT50aWRfcXVldWUpKQorCQlyZXR1cm4gSW52YWxpZEJsb2Nr TnVtYmVyOworCisJKnJlc3VsdCA9IGluZGV4X3RpZF9kZXF1ZXVlKHNjYW4tPnRpZF9xdWV1ZSk7 CisJcmV0dXJuIEl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIoJnJlc3VsdC0+dGlkKTsKK30KKwor dm9pZAoraW5kZXhfcGdzcl9hbGxvYyhJbmRleFNjYW5EZXNjIHNjYW4pCit7CisJaWYgKHNjYW4t PnhzX2hlYXBmZXRjaC0+cGdzcikKKwkJcGdfc3RyZWFtaW5nX3JlYWRfZnJlZShzY2FuLT54c19o ZWFwZmV0Y2gtPnBnc3IpOworCXNjYW4tPnhzX2hlYXBmZXRjaC0+cGdzciA9IHBnX3N0cmVhbWlu Z19yZWFkX2J1ZmZlcl9hbGxvYyhQR1NSX0ZMQUdfREVGQVVMVCwKKwkJCQkJCQkJCQkJCQkJCSAg c2NhbiwKKwkJCQkJCQkJCQkJCQkJCSAgc2l6ZW9mKFRJRFF1ZXVlSXRlbSksCisJCQkJCQkJCQkJ CQkJCQkgIE5VTEwsCisJCQkJCQkJCQkJCQkJCQkgIEJNUl9SRUwoc2Nhbi0+aGVhcFJlbGF0aW9u KSwKKwkJCQkJCQkJCQkJCQkJCSAgTUFJTl9GT1JLTlVNLAorCQkJCQkJCQkJCQkJCQkJICBpbmRl eF9wZ3NyX25leHRfc2luZ2xlKTsKKworCXBnX3N0cmVhbWluZ19yZWFkX3NldF9yZXN1bWFibGUo c2Nhbi0+eHNfaGVhcGZldGNoLT5wZ3NyKTsKK30KKwogLyoKICAqIGluZGV4X2JlZ2luc2NhbiAt IHN0YXJ0IGEgc2NhbiBvZiBhbiBpbmRleCB3aXRoIGFtZ2V0dHVwbGUKICAqCkBAIC0zMzMsNiAr NDE4LDggQEAgaW5kZXhfYmVnaW5zY2FuX2ludGVybmFsKFJlbGF0aW9uIGluZGV4UmVsYXRpb24s CiAJLyogSW5pdGlhbGl6ZSBpbmZvcm1hdGlvbiBmb3IgcGFyYWxsZWwgc2Nhbi4gKi8KIAlzY2Fu LT5wYXJhbGxlbF9zY2FuID0gcHNjYW47CiAJc2Nhbi0+eHNfdGVtcF9zbmFwID0gdGVtcF9zbmFw OworCXNjYW4tPmluZGV4X2RvbmUgPSBmYWxzZTsKKwlzY2FuLT50aWRfcXVldWUgPSBOVUxMOwog CiAJcmV0dXJuIHNjYW47CiB9CkBAIC0zNjQsOCArNDUxLDEyIEBAIGluZGV4X3Jlc2NhbihJbmRl eFNjYW5EZXNjIHNjYW4sCiAJaWYgKHNjYW4tPnhzX2hlYXBmZXRjaCkKIAkJdGFibGVfaW5kZXhf ZmV0Y2hfcmVzZXQoc2Nhbi0+eHNfaGVhcGZldGNoKTsKIAorCXNjYW4tPmluZGV4X2RvbmUgPSBm YWxzZTsKKwogCXNjYW4tPmtpbGxfcHJpb3JfdHVwbGUgPSBmYWxzZTsgLyogZm9yIHNhZmV0eSAq LwogCXNjYW4tPnhzX2hlYXBfY29udGludWUgPSBmYWxzZTsKKwlpZiAoc2Nhbi0+dGlkX3F1ZXVl KQorCQl0aWRfcXVldWVfcmVzZXQoc2Nhbi0+dGlkX3F1ZXVlKTsKIAogCXNjYW4tPmluZGV4UmVs YXRpb24tPnJkX2luZGFtLT5hbXJlc2NhbihzY2FuLCBrZXlzLCBua2V5cywKIAkJCQkJCQkJCQkJ b3JkZXJieXMsIG5vcmRlcmJ5cyk7CkBAIC0zODQsMTAgKzQ3NSwxNyBAQCBpbmRleF9lbmRzY2Fu KEluZGV4U2NhbkRlc2Mgc2NhbikKIAkvKiBSZWxlYXNlIHJlc291cmNlcyAobGlrZSBidWZmZXIg cGlucykgZnJvbSB0YWJsZSBhY2Nlc3NlcyAqLwogCWlmIChzY2FuLT54c19oZWFwZmV0Y2gpCiAJ eworCQlpZiAoc2Nhbi0+eHNfaGVhcGZldGNoLT5wZ3NyKQorCQkJcGdfc3RyZWFtaW5nX3JlYWRf ZnJlZShzY2FuLT54c19oZWFwZmV0Y2gtPnBnc3IpOworCQlzY2FuLT54c19oZWFwZmV0Y2gtPnBn c3IgPSBOVUxMOwogCQl0YWJsZV9pbmRleF9mZXRjaF9lbmQoc2Nhbi0+eHNfaGVhcGZldGNoKTsK IAkJc2Nhbi0+eHNfaGVhcGZldGNoID0gTlVMTDsKIAl9CiAKKwlpZiAoc2Nhbi0+dGlkX3F1ZXVl KQorCQlwZnJlZShzY2FuLT50aWRfcXVldWUpOworCXNjYW4tPnRpZF9xdWV1ZSA9IE5VTEw7CisK IAkvKiBFbmQgdGhlIEFNJ3Mgc2NhbiAqLwogCXNjYW4tPmluZGV4UmVsYXRpb24tPnJkX2luZGFt LT5hbWVuZHNjYW4oc2Nhbik7CiAKQEAgLTUzMCw2ICs2MjgsOSBAQCBpbmRleF9wYXJhbGxlbHJl c2NhbihJbmRleFNjYW5EZXNjIHNjYW4pCiAJaWYgKHNjYW4tPnhzX2hlYXBmZXRjaCkKIAkJdGFi bGVfaW5kZXhfZmV0Y2hfcmVzZXQoc2Nhbi0+eHNfaGVhcGZldGNoKTsKIAorCWlmIChzY2FuLT50 aWRfcXVldWUpCisJCXRpZF9xdWV1ZV9yZXNldChzY2FuLT50aWRfcXVldWUpOworCiAJLyogYW1w YXJhbGxlbHJlc2NhbiBpcyBvcHRpb25hbDsgYXNzdW1lIG5vLW9wIGlmIG5vdCBwcm92aWRlZCBi eSBBTSAqLwogCWlmIChzY2FuLT5pbmRleFJlbGF0aW9uLT5yZF9pbmRhbS0+YW1wYXJhbGxlbHJl c2NhbiAhPSBOVUxMKQogCQlzY2FuLT5pbmRleFJlbGF0aW9uLT5yZF9pbmRhbS0+YW1wYXJhbGxl bHJlc2NhbihzY2FuKTsKQEAgLTYwMyw2ICs3MDQsNyBAQCBpbmRleF9nZXRuZXh0X3RpZChJbmRl eFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uKQogCQlpZiAoc2Nhbi0+eHNf aGVhcGZldGNoKQogCQkJdGFibGVfaW5kZXhfZmV0Y2hfcmVzZXQoc2Nhbi0+eHNfaGVhcGZldGNo KTsKIAorCQlzY2FuLT5pbmRleF9kb25lID0gdHJ1ZTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCUFz c2VydChJdGVtUG9pbnRlcklzVmFsaWQoJnNjYW4tPnhzX2hlYXB0aWQpKTsKQEAgLTY1MSw3ICs3 NTMsNyBAQCBpbmRleF9mZXRjaF9oZWFwKEluZGV4U2NhbkRlc2Mgc2NhbiwgVHVwbGVUYWJsZVNs b3QgKnNsb3QpCiAJICogcmVjb3ZlcnkgYmVjYXVzZSBpdCBtYXkgdmlvbGF0ZSBNVkNDIHRvIGRv IHNvLiAgU2VlIGNvbW1lbnRzIGluCiAJICogUmVsYXRpb25HZXRJbmRleFNjYW4oKS4KIAkgKi8K LQlpZiAoIXNjYW4tPnhhY3RTdGFydGVkSW5SZWNvdmVyeSkKKwlpZiAoIXNjYW4tPnhhY3RTdGFy dGVkSW5SZWNvdmVyeSAmJiAhc2Nhbi0+eHNfaGVhcGZldGNoLT5wZ3NyKQogCQlzY2FuLT5raWxs X3ByaW9yX3R1cGxlID0gYWxsX2RlYWQ7CiAKIAlyZXR1cm4gZm91bmQ7CmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9leGVjdXRvci9leGVjTWFpbi5jIGIvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhl Y01haW4uYwppbmRleCAxM2E5YjdkYTgzLi45ZTk1MWE2OWFiIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9leGVjdXRvci9leGVjTWFpbi5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNN YWluLmMKQEAgLTE2NTIsNiArMTY1MiwxMCBAQCBFeGVjdXRlUGxhbihFU3RhdGUgKmVzdGF0ZSwK IAlpZiAoIWV4ZWN1dGVfb25jZSkKIAkJdXNlX3BhcmFsbGVsX21vZGUgPSBmYWxzZTsKIAorCWVz dGF0ZS0+ZXNfdXNlX3ByZWZldGNoaW5nID0gZXhlY3V0ZV9vbmNlOworCWlmICghcGxhbnN0YXRl LT5wbGFuLT5hbGxvd19wcmVmZXRjaCkKKwkJZXN0YXRlLT5lc191c2VfcHJlZmV0Y2hpbmcgPSBm YWxzZTsKKwogCWVzdGF0ZS0+ZXNfdXNlX3BhcmFsbGVsX21vZGUgPSB1c2VfcGFyYWxsZWxfbW9k ZTsKIAlpZiAodXNlX3BhcmFsbGVsX21vZGUpCiAJCUVudGVyUGFyYWxsZWxNb2RlKCk7CmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlSW5kZXhvbmx5c2Nhbi5jIGIvc3JjL2Jh Y2tlbmQvZXhlY3V0b3Ivbm9kZUluZGV4b25seXNjYW4uYwppbmRleCAyYzJjOWMxMGI1Li5lMzgy NGMyNWUwIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlSW5kZXhvbmx5c2Nh bi5jCisrKyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVJbmRleG9ubHlzY2FuLmMKQEAgLTEx Myw2MSArMTEzLDEwOSBAQCBJbmRleE9ubHlOZXh0KEluZGV4T25seVNjYW5TdGF0ZSAqbm9kZSkK IAkJCQkJCSBub2RlLT5pb3NzX051bU9yZGVyQnlLZXlzKTsKIAl9CiAKKwlpZiAoIXNjYW5kZXNj LT50aWRfcXVldWUpCisJeworCQkvKiBGYWxsIGJhY2sgdG8gYSBxdWV1ZSBzaXplIG9mIDEgZm9y IG5vdyAqLworCQlpbnQJCQlxdWV1ZV9zaXplID0gMTsKKworCQlpZiAoZXN0YXRlLT5lc191c2Vf cHJlZmV0Y2hpbmcgJiYgU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXJlY3Rpb24pKQorCQkJcXVl dWVfc2l6ZSA9IFRJRF9RVUVVRV9TSVpFOworCQlzY2FuZGVzYy0+dGlkX3F1ZXVlID0gdGlkX3F1 ZXVlX2FsbG9jKHF1ZXVlX3NpemUpOworCQlpbmRleF9wZ3NyX2FsbG9jKHNjYW5kZXNjKTsKKwl9 CisKIAkvKgogCSAqIE9LLCBub3cgdGhhdCB3ZSBoYXZlIHdoYXQgd2UgbmVlZCwgZmV0Y2ggdGhl IG5leHQgdHVwbGUuCiAJICovCi0Jd2hpbGUgKCh0aWQgPSBpbmRleF9nZXRuZXh0X3RpZChzY2Fu ZGVzYywgZGlyZWN0aW9uKSkgIT0gTlVMTCkKKwlmb3IgKDs7KQogCXsKLQkJYm9vbAkJdHVwbGVf ZnJvbV9oZWFwID0gZmFsc2U7CisJCWJvb2wJCXR1cGxlX2Zyb21faGVhcCA9IHRydWU7CiAKIAkJ Q0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKIAotCQkvKgotCQkgKiBXZSBjYW4gc2tpcCB0aGUgaGVh cCBmZXRjaCBpZiB0aGUgVElEIHJlZmVyZW5jZXMgYSBoZWFwIHBhZ2Ugb24KLQkJICogd2hpY2gg YWxsIHR1cGxlcyBhcmUga25vd24gdmlzaWJsZSB0byBldmVyeWJvZHkuICBJbiBhbnkgY2FzZSwK LQkJICogd2UnbGwgdXNlIHRoZSBpbmRleCB0dXBsZSBub3QgdGhlIGhlYXAgdHVwbGUgYXMgdGhl IGRhdGEgc291cmNlLgotCQkgKgotCQkgKiBOb3RlIG9uIE1lbW9yeSBPcmRlcmluZyBFZmZlY3Rz OiB2aXNpYmlsaXR5bWFwX2dldF9zdGF0dXMgZG9lcyBub3QKLQkJICogbG9jayB0aGUgdmlzaWJp bGl0eSBtYXAgYnVmZmVyLCBhbmQgdGhlcmVmb3JlIHRoZSByZXN1bHQgd2UgcmVhZAotCQkgKiBo ZXJlIGNvdWxkIGJlIHNsaWdodGx5IHN0YWxlLiAgSG93ZXZlciwgaXQgY2FuJ3QgYmUgc3RhbGUg ZW5vdWdoIHRvCi0JCSAqIG1hdHRlci4KLQkJICoKLQkJICogV2UgbmVlZCB0byBkZXRlY3QgY2xl YXJpbmcgYSBWTSBiaXQgZHVlIHRvIGFuIGluc2VydCByaWdodCBhd2F5LAotCQkgKiBiZWNhdXNl IHRoZSB0dXBsZSBpcyBwcmVzZW50IGluIHRoZSBpbmRleCBwYWdlIGJ1dCBub3QgdmlzaWJsZS4g VGhlCi0JCSAqIHJlYWRpbmcgb2YgdGhlIFRJRCBieSB0aGlzIHNjYW4gKHVzaW5nIGEgc2hhcmVk IGxvY2sgb24gdGhlIGluZGV4Ci0JCSAqIGJ1ZmZlcikgaXMgc2VyaWFsaXplZCB3aXRoIHRoZSBp bnNlcnQgb2YgdGhlIFRJRCBpbnRvIHRoZSBpbmRleAotCQkgKiAodXNpbmcgYW4gZXhjbHVzaXZl IGxvY2sgb24gdGhlIGluZGV4IGJ1ZmZlcikuIEJlY2F1c2UgdGhlIFZNIGJpdAotCQkgKiBpcyBj bGVhcmVkIGJlZm9yZSB1cGRhdGluZyB0aGUgaW5kZXgsIGFuZCBsb2NraW5nL3VubG9ja2luZyBv ZiB0aGUKLQkJICogaW5kZXggcGFnZSBhY3RzIGFzIGEgZnVsbCBtZW1vcnkgYmFycmllciwgd2Ug YXJlIHN1cmUgdG8gc2VlIHRoZQotCQkgKiBjbGVhcmVkIGJpdCBpZiB3ZSBzZWUgYSByZWNlbnRs eS1pbnNlcnRlZCBUSUQuCi0JCSAqCi0JCSAqIERlbGV0ZXMgZG8gbm90IHVwZGF0ZSB0aGUgaW5k ZXggcGFnZSAob25seSBWQUNVVU0gd2lsbCBjbGVhciBvdXQKLQkJICogdGhlIFRJRCksIHNvIHRo ZSBjbGVhcmluZyBvZiB0aGUgVk0gYml0IGJ5IGEgZGVsZXRlIGlzIG5vdAotCQkgKiBzZXJpYWxp emVkIHdpdGggdGhpcyB0ZXN0IGJlbG93LCBhbmQgd2UgbWF5IHNlZSBhIHZhbHVlIHRoYXQgaXMK LQkJICogc2lnbmlmaWNhbnRseSBzdGFsZS4gSG93ZXZlciwgd2UgZG9uJ3QgY2FyZSBhYm91dCB0 aGUgZGVsZXRlIHJpZ2h0Ci0JCSAqIGF3YXksIGJlY2F1c2UgdGhlIHR1cGxlIGlzIHN0aWxsIHZp c2libGUgdW50aWwgdGhlIGRlbGV0aW5nCi0JCSAqIHRyYW5zYWN0aW9uIGNvbW1pdHMgb3IgdGhl IHN0YXRlbWVudCBlbmRzIChpZiBpdCdzIG91cgotCQkgKiB0cmFuc2FjdGlvbikuIEluIGVpdGhl ciBjYXNlLCB0aGUgbG9jayBvbiB0aGUgVk0gYnVmZmVyIHdpbGwgaGF2ZQotCQkgKiBiZWVuIHJl bGVhc2VkIChhY3RpbmcgYXMgYSB3cml0ZSBiYXJyaWVyKSBhZnRlciBjbGVhcmluZyB0aGUgYml0 LgotCQkgKiBBbmQgZm9yIHVzIHRvIGhhdmUgYSBzbmFwc2hvdCB0aGF0IGluY2x1ZGVzIHRoZSBk ZWxldGluZwotCQkgKiB0cmFuc2FjdGlvbiAobWFraW5nIHRoZSB0dXBsZSBpbnZpc2libGUpLCB3 ZSBtdXN0IGhhdmUgYWNxdWlyZWQKLQkJICogUHJvY0FycmF5TG9jayBhZnRlciB0aGF0IHRpbWUs IGFjdGluZyBhcyBhIHJlYWQgYmFycmllci4KLQkJICoKLQkJICogSXQncyB3b3J0aCBnb2luZyB0 aHJvdWdoIHRoaXMgY29tcGxleGl0eSB0byBhdm9pZCBuZWVkaW5nIHRvIGxvY2sKLQkJICogdGhl IFZNIGJ1ZmZlciwgd2hpY2ggY291bGQgY2F1c2Ugc2lnbmlmaWNhbnQgY29udGVudGlvbi4KLQkJ ICovCi0JCWlmICghVk1fQUxMX1ZJU0lCTEUoc2NhbmRlc2MtPmhlYXBSZWxhdGlvbiwKLQkJCQkJ CQlJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKHRpZCksCi0JCQkJCQkJJm5vZGUtPmlvc3NfVk1C dWZmZXIpKQorCQlpZiAoIXNjYW5kZXNjLT5pbmRleF9kb25lKQorCQl7CisJCQl3aGlsZSAoIVRJ RF9RVUVVRV9GVUxMKHNjYW5kZXNjLT50aWRfcXVldWUpKQorCQkJeworCQkJCWlmICgodGlkID0g aW5kZXhfZ2V0bmV4dF90aWQoc2NhbmRlc2MsIGRpcmVjdGlvbikpID09IE5VTEwpCisJCQkJewor CQkJCQlzY2FuZGVzYy0+aW5kZXhfZG9uZSA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwor CQkJCS8qCisJCQkJICogV2UgY2FuIHNraXAgdGhlIGhlYXAgZmV0Y2ggaWYgdGhlIFRJRCByZWZl cmVuY2VzIGEgaGVhcAorCQkJCSAqIHBhZ2Ugb24gd2hpY2ggYWxsIHR1cGxlcyBhcmUga25vd24g dmlzaWJsZSB0byBldmVyeWJvZHkuIEluCisJCQkJICogYW55IGNhc2UsIHdlJ2xsIHVzZSB0aGUg aW5kZXggdHVwbGUgbm90IHRoZSBoZWFwIHR1cGxlIGFzCisJCQkJICogdGhlIGRhdGEgc291cmNl LgorCQkJCSAqCisJCQkJICogTm90ZSBvbiBNZW1vcnkgT3JkZXJpbmcgRWZmZWN0czogdmlzaWJp bGl0eW1hcF9nZXRfc3RhdHVzCisJCQkJICogZG9lcyBub3QgbG9jayB0aGUgdmlzaWJpbGl0eSBt YXAgYnVmZmVyLCBhbmQgdGhlcmVmb3JlIHRoZQorCQkJCSAqIHJlc3VsdCB3ZSByZWFkIGhlcmUg Y291bGQgYmUgc2xpZ2h0bHkgc3RhbGUuICBIb3dldmVyLCBpdAorCQkJCSAqIGNhbid0IGJlIHN0 YWxlIGVub3VnaCB0byBtYXR0ZXIuCisJCQkJICoKKwkJCQkgKiBXZSBuZWVkIHRvIGRldGVjdCBj bGVhcmluZyBhIFZNIGJpdCBkdWUgdG8gYW4gaW5zZXJ0IHJpZ2h0CisJCQkJICogYXdheSwgYmVj YXVzZSB0aGUgdHVwbGUgaXMgcHJlc2VudCBpbiB0aGUgaW5kZXggcGFnZSBidXQKKwkJCQkgKiBu b3QgdmlzaWJsZS4gVGhlIHJlYWRpbmcgb2YgdGhlIFRJRCBieSB0aGlzIHNjYW4gKHVzaW5nIGEK KwkJCQkgKiBzaGFyZWQgbG9jayBvbiB0aGUgaW5kZXggYnVmZmVyKSBpcyBzZXJpYWxpemVkIHdp dGggdGhlCisJCQkJICogaW5zZXJ0IG9mIHRoZSBUSUQgaW50byB0aGUgaW5kZXggKHVzaW5nIGFu IGV4Y2x1c2l2ZSBsb2NrCisJCQkJICogb24gdGhlIGluZGV4IGJ1ZmZlcikuIEJlY2F1c2UgdGhl IFZNIGJpdCBpcyBjbGVhcmVkIGJlZm9yZQorCQkJCSAqIHVwZGF0aW5nIHRoZSBpbmRleCwgYW5k IGxvY2tpbmcvdW5sb2NraW5nIG9mIHRoZSBpbmRleCBwYWdlCisJCQkJICogYWN0cyBhcyBhIGZ1 bGwgbWVtb3J5IGJhcnJpZXIsIHdlIGFyZSBzdXJlIHRvIHNlZSB0aGUKKwkJCQkgKiBjbGVhcmVk IGJpdCBpZiB3ZSBzZWUgYSByZWNlbnRseS1pbnNlcnRlZCBUSUQuCisJCQkJICoKKwkJCQkgKiBE ZWxldGVzIGRvIG5vdCB1cGRhdGUgdGhlIGluZGV4IHBhZ2UgKG9ubHkgVkFDVVVNIHdpbGwKKwkJ CQkgKiBjbGVhciBvdXQgdGhlIFRJRCksIHNvIHRoZSBjbGVhcmluZyBvZiB0aGUgVk0gYml0IGJ5 IGEKKwkJCQkgKiBkZWxldGUgaXMgbm90IHNlcmlhbGl6ZWQgd2l0aCB0aGlzIHRlc3QgYmVsb3cs IGFuZCB3ZSBtYXkKKwkJCQkgKiBzZWUgYSB2YWx1ZSB0aGF0IGlzIHNpZ25pZmljYW50bHkgc3Rh bGUuIEhvd2V2ZXIsIHdlIGRvbid0CisJCQkJICogY2FyZSBhYm91dCB0aGUgZGVsZXRlIHJpZ2h0 IGF3YXksIGJlY2F1c2UgdGhlIHR1cGxlIGlzCisJCQkJICogc3RpbGwgdmlzaWJsZSB1bnRpbCB0 aGUgZGVsZXRpbmcgdHJhbnNhY3Rpb24gY29tbWl0cyBvciB0aGUKKwkJCQkgKiBzdGF0ZW1lbnQg ZW5kcyAoaWYgaXQncyBvdXIgdHJhbnNhY3Rpb24pLiBJbiBlaXRoZXIgY2FzZSwKKwkJCQkgKiB0 aGUgbG9jayBvbiB0aGUgVk0gYnVmZmVyIHdpbGwgaGF2ZSBiZWVuIHJlbGVhc2VkIChhY3RpbmcK KwkJCQkgKiBhcyBhIHdyaXRlIGJhcnJpZXIpIGFmdGVyIGNsZWFyaW5nIHRoZSBiaXQuIEFuZCBm b3IgdXMgdG8KKwkJCQkgKiBoYXZlIGEgc25hcHNob3QgdGhhdCBpbmNsdWRlcyB0aGUgZGVsZXRp bmcgdHJhbnNhY3Rpb24KKwkJCQkgKiAobWFraW5nIHRoZSB0dXBsZSBpbnZpc2libGUpLCB3ZSBt dXN0IGhhdmUgYWNxdWlyZWQKKwkJCQkgKiBQcm9jQXJyYXlMb2NrIGFmdGVyIHRoYXQgdGltZSwg YWN0aW5nIGFzIGEgcmVhZCBiYXJyaWVyLgorCQkJCSAqCisJCQkJICogSXQncyB3b3J0aCBnb2lu ZyB0aHJvdWdoIHRoaXMgY29tcGxleGl0eSB0byBhdm9pZCBuZWVkaW5nCisJCQkJICogdG8gbG9j ayB0aGUgVk0gYnVmZmVyLCB3aGljaCBjb3VsZCBjYXVzZSBzaWduaWZpY2FudAorCQkJCSAqIGNv bnRlbnRpb24uCisJCQkJICovCisKKwkJCQlpZiAoVk1fQUxMX1ZJU0lCTEUoc2NhbmRlc2MtPmhl YXBSZWxhdGlvbiwKKwkJCQkJCQkJICAgSXRlbVBvaW50ZXJHZXRCbG9ja051bWJlcih0aWQpLAor CQkJCQkJCQkgICAmbm9kZS0+aW9zc19WTUJ1ZmZlcikpCisJCQkJeworCQkJCQl0dXBsZV9mcm9t X2hlYXAgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaW5kZXhfdGlkX2VucXVl dWUoc2NhbmRlc2MtPnRpZF9xdWV1ZSwgdGlkLCBzY2FuZGVzYy0+eHNfcmVjaGVjaywKKwkJCQkJ CQkJICBzY2FuZGVzYy0+eHNfaGl0dXAsIHNjYW5kZXNjLT54c19pdHVwKTsKKwkJCX0KKwkJfQor CisJCWlmICh0dXBsZV9mcm9tX2hlYXApCiAJCXsKIAkJCS8qCiAJCQkgKiBSYXRzLCB3ZSBoYXZl IHRvIHZpc2l0IHRoZSBoZWFwIHRvIGNoZWNrIHZpc2liaWxpdHkuCiAJCQkgKi8KIAkJCUluc3Ry Q291bnRUdXBsZXMyKG5vZGUsIDEpOworCiAJCQlpZiAoIWluZGV4X2ZldGNoX2hlYXAoc2NhbmRl c2MsIG5vZGUtPmlvc3NfVGFibGVTbG90KSkKLQkJCQljb250aW51ZTsJCS8qIG5vIHZpc2libGUg dHVwbGUsIHRyeSBuZXh0IGluZGV4IGVudHJ5ICovCisJCQl7CisJCQkJLyoKKwkJCQkgKiBFaXRo ZXIgdGhlcmUgaXMgbm8gdmlzaWJsZSB0dXBsZSBvciB0aGUgc3RyZWFtaW5nIHJlYWQgcmFuCisJ CQkJICogb3V0IG9mIHF1ZXVlIGl0ZW1zIGFuZCBpdCBpcyB0aW1lIHRvIGFkZCBtb3JlLgorCQkJ CSAqLworCQkJCWlmIChJdGVtUG9pbnRlcklzVmFsaWQoJnNjYW5kZXNjLT54c19oZWFwdGlkKSkK KwkJCQkJY29udGludWU7CiAKLQkJCUV4ZWNDbGVhclR1cGxlKG5vZGUtPmlvc3NfVGFibGVTbG90 KTsKKwkJCQlpZiAoIXNjYW5kZXNjLT5pbmRleF9kb25lKQorCQkJCQljb250aW51ZTsKKworCQkJ CWJyZWFrOworCQkJfQogCiAJCQkvKgogCQkJICogT25seSBNVkNDIHNuYXBzaG90cyBhcmUgc3Vw cG9ydGVkIGhlcmUsIHNvIHRoZXJlIHNob3VsZCBiZSBubwpAQCAtMTg1LDE1ICsyMzMsMzIgQEAg SW5kZXhPbmx5TmV4dChJbmRleE9ubHlTY2FuU3RhdGUgKm5vZGUpCiAJCQkgKiBlbnRyeSBtaWdo dCByZXF1aXJlIGEgdmlzaXQgdG8gdGhlIHNhbWUgaGVhcCBwYWdlLgogCQkJICovCiAKLQkJCXR1 cGxlX2Zyb21faGVhcCA9IHRydWU7CisJCQkvKgorCQkJICogSWYgd2UgdmlzaXQgdGhlIHVuZGVy bHlpbmcgdGFibGUsIHdlIG5lZWQgdG8gcmVzZXQgdGhlCisJCQkgKiBJbmRleFNjYW5EZXNjJ3Mg ZmllbGRzIHRvIG1hdGNoIHRoZSBwZXIgdHVwbGUgc3RhdGUgcmV0dXJuZWQgYnkKKwkJCSAqIHRo ZSBzdHJlYW1pbmcgcmVhZCBBUEkuIFRoZSBtb3N0IHJlY2VudCBpbmRleCB0dXBsZSBmZXRjaGVk CisJCQkgKiB3aWxsIG5vdCBuZWNlc3NhcmlseSBtYXRjaCB0aGUgY3VycmVudCBUSUQgYmVpbmcg cHJvY2Vzc2VkCisJCQkgKiBhZnRlciByZXR1cm5pbmcgZnJvbSBpbmRleF9mZXRjaF9oZWFwKCku CisJCQkgKi8KKwkJCXNjYW5kZXNjLT54c19yZWNoZWNrID0gc2NhbmRlc2MtPnhzX2hlYXBmZXRj aC0+cmVjaGVjazsKKwkJCXNjYW5kZXNjLT54c19oZWFwdGlkID0gc2NhbmRlc2MtPnhzX2hlYXBm ZXRjaC0+dGlkOworCisJCQlzY2FuZGVzYy0+eHNfaGl0dXAgPSBzY2FuZGVzYy0+eHNfaGVhcGZl dGNoLT5odHVwOworCQkJc2NhbmRlc2MtPnhzX2l0dXAgPSBzY2FuZGVzYy0+eHNfaGVhcGZldGNo LT5pdHVwOwogCQl9CiAKIAkJLyoKIAkJICogRmlsbCB0aGUgc2NhbiB0dXBsZSBzbG90IHdpdGgg ZGF0YSBmcm9tIHRoZSBpbmRleC4gIFRoaXMgbWlnaHQgYmUKLQkJICogcHJvdmlkZWQgaW4gZWl0 aGVyIEhlYXBUdXBsZSBvciBJbmRleFR1cGxlIGZvcm1hdC4gIENvbmNlaXZhYmx5IGFuCisJCSAq IHByb3ZpZGVkIGluIGVpdGhlciBIZWFwVHVwbGUgb3IgSW5kZXhUdXBsZSBmb3JtYXQuIENvbmNl aXZhYmx5IGFuCiAJCSAqIGluZGV4IEFNIG1pZ2h0IGZpbGwgYm90aCBmaWVsZHMsIGluIHdoaWNo IGNhc2Ugd2UgcHJlZmVyIHRoZSBoZWFwCi0JCSAqIGZvcm1hdCwgc2luY2UgaXQncyBwcm9iYWJs eSBhIGJpdCBjaGVhcGVyIHRvIGZpbGwgYSBzbG90IGZyb20uCisJCSAqIGZvcm1hdCwgc2luY2Ug aXQncyBwcm9iYWJseSBhIGJpdCBjaGVhcGVyIHRvIGZpbGwgYSBzbG90IGZyb20uIEFzCisJCSAq IHNvb24gYXMgd2UgZW5jb3VudGVyIGEgdHVwbGUgZnJvbSBhbiBhbGwgdmlzaWJsZSBibG9jaywg d2Ugc3RvcAorCQkgKiBwcmVmZXRjaGluZyBhbmQgeWllbGQgdGhlIHR1cGxlLiBBcyBzdWNoLCB3 ZSBjYW4gdXNlIHRoZSBJbmRleFR1cGxlCisJCSAqIGFuZCBIZWFwVHVwbGUgdGhhdCB0aGUgaW5k ZXggQU0gZmlsbGVkIGluIHRoZSBzY2FuIGRlc2NyaXB0b3IKKwkJICogaW5zdGVhZCBvZiBoYXZp bmcgdG8gZ2V0IHRoZW0gZnJvbSB0aGUgcGVyIHR1cGxlIHN0YXRlIHlpZWxkZWQgYnkKKwkJICog dGhlIHN0cmVhbWluZyByZWFkIEFQSS4KIAkJICovCisJCUV4ZWNDbGVhclR1cGxlKG5vZGUtPmlv c3NfVGFibGVTbG90KTsKIAkJaWYgKHNjYW5kZXNjLT54c19oaXR1cCkKIAkJewogCQkJLyoKZGlm ZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVJbmRleHNjYW4uYyBiL3NyYy9iYWNr ZW5kL2V4ZWN1dG9yL25vZGVJbmRleHNjYW4uYwppbmRleCAwMzE0MmI0YTk0Li5hYTcyNDc5ZGYx IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlSW5kZXhzY2FuLmMKKysrIGIv c3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUluZGV4c2Nhbi5jCkBAIC0xMjUsMTMgKzEyNSw3MiBA QCBJbmRleE5leHQoSW5kZXhTY2FuU3RhdGUgKm5vZGUpCiAJCQkJCQkgbm9kZS0+aXNzX09yZGVy QnlLZXlzLCBub2RlLT5pc3NfTnVtT3JkZXJCeUtleXMpOwogCX0KIAorCWlmICghc2NhbmRlc2Mt PnRpZF9xdWV1ZSkKKwl7CisJCS8qIEZhbGwgYmFjayB0byBhIHF1ZXVlIHNpemUgb2YgMSBmb3Ig bm93ICovCisJCWludAkJCXF1ZXVlX3NpemUgPSAxOworCisJCWlmIChlc3RhdGUtPmVzX3VzZV9w cmVmZXRjaGluZyAmJiBTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcmVjdGlvbikpCisJCQlxdWV1 ZV9zaXplID0gVElEX1FVRVVFX1NJWkU7CisJCXNjYW5kZXNjLT50aWRfcXVldWUgPSB0aWRfcXVl dWVfYWxsb2MocXVldWVfc2l6ZSk7CisJCWluZGV4X3Bnc3JfYWxsb2Moc2NhbmRlc2MpOworCX0K KwogCS8qCiAJICogb2ssIG5vdyB0aGF0IHdlIGhhdmUgd2hhdCB3ZSBuZWVkLCBmZXRjaCB0aGUg bmV4dCB0dXBsZS4KIAkgKi8KLQl3aGlsZSAoaW5kZXhfZ2V0bmV4dF9zbG90KHNjYW5kZXNjLCBk aXJlY3Rpb24sIHNsb3QpKQorCWZvciAoOzspCiAJeworCQlJdGVtUG9pbnRlckRhdGEgbGFzdF90 aWQgPSBzY2FuZGVzYy0+eHNfaGVhcHRpZDsKKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlbid0IGV4 aGF1c3RlZCBUSURzIGZyb20gdGhlIGluZGV4LCB0aGVuIGZpbGwgdGhlIHF1ZXVlCisJCSAqIHdp dGggVElEcyBmcm9tIHRoZSBpbmRleCB1bnRpbCB0aGUgcXVldWUgaXMgZnVsbC4gTWFyayB0aGUg aW5kZXggYXMKKwkJICogZXhoYXVzdGVkIGlmIHdlIHJlYWNoIHRoZSBlbmQgb2YgaXQuCisJCSAq LworCQlpZiAoIXNjYW5kZXNjLT5pbmRleF9kb25lKQorCQl7CisJCQl3aGlsZSAoIVRJRF9RVUVV RV9GVUxMKHNjYW5kZXNjLT50aWRfcXVldWUpKQorCQkJeworCQkJCUl0ZW1Qb2ludGVyIHRpZDsK KworCQkJCWlmICgodGlkID0gaW5kZXhfZ2V0bmV4dF90aWQoc2NhbmRlc2MsIGRpcmVjdGlvbikp ID09IE5VTEwpCisJCQkJeworCQkJCQlzY2FuZGVzYy0+aW5kZXhfZG9uZSA9IHRydWU7CisJCQkJ CWJyZWFrOworCQkJCX0KKworCQkJCWluZGV4X3RpZF9lbnF1ZXVlKHNjYW5kZXNjLT50aWRfcXVl dWUsIHRpZCwgc2NhbmRlc2MtPnhzX3JlY2hlY2ssCisJCQkJCQkJCSAgTlVMTCwgTlVMTCk7CisJ CQl9CisJCX0KKworCQlpZiAoc2NhbmRlc2MtPnhzX2hlYXBfY29udGludWUpCisJCQlzY2FuZGVz Yy0+eHNfaGVhcHRpZCA9IGxhc3RfdGlkOworCisJCS8qCisJCSAqIGluZGV4X2ZldGNoX2hlYXAo KSByZXR1cm5zIGZhbHNlIHdoZW4gZWl0aGVyIHRoZSB0dXBsZSBpc24ndAorCQkgKiB2aXNpYmxl IG9yIHdoZW4gdGhlcmUncyBubyBtb3JlIHRvIHJlYWQKKwkJICovCisJCWlmICghaW5kZXhfZmV0 Y2hfaGVhcChzY2FuZGVzYywgc2xvdCkpCisJCXsKKwkJCWlmIChJdGVtUG9pbnRlcklzVmFsaWQo JnNjYW5kZXNjLT54c19oZWFwdGlkKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCFzY2FuZGVz Yy0+aW5kZXhfZG9uZSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNjYW5kZXNjLT54c19oZWFw X2NvbnRpbnVlKQorCQkJCWNvbnRpbnVlOworCisJCQlicmVhazsKKwkJfQorCiAJCUNIRUNLX0ZP Ul9JTlRFUlJVUFRTKCk7CiAKKwkJc2NhbmRlc2MtPnhzX3JlY2hlY2sgPSBzY2FuZGVzYy0+eHNf aGVhcGZldGNoLT5yZWNoZWNrOworCQlzY2FuZGVzYy0+eHNfaGVhcHRpZCA9IHNjYW5kZXNjLT54 c19oZWFwZmV0Y2gtPnRpZDsKKwogCQkvKgogCQkgKiBJZiB0aGUgaW5kZXggd2FzIGxvc3N5LCB3 ZSBoYXZlIHRvIHJlY2hlY2sgdGhlIGluZGV4IHF1YWxzIHVzaW5nCiAJCSAqIHRoZSBmZXRjaGVk IHR1cGxlLgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vY3JlYXRlcGxh bi5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vY3JlYXRlcGxhbi5jCmluZGV4IDYxMGY0 YTU2ZDYuLjMzNjBkYTgyODggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFu L2NyZWF0ZXBsYW4uYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9jcmVhdGVwbGFu LmMKQEAgLTQ3MTksNiArNDcxOSw3IEBAIGNyZWF0ZV9tZXJnZWpvaW5fcGxhbihQbGFubmVySW5m byAqcm9vdCwKIAogCS8qIENvc3RzIG9mIHNvcnQgYW5kIG1hdGVyaWFsIHN0ZXBzIGFyZSBpbmNs dWRlZCBpbiBwYXRoIGNvc3QgYWxyZWFkeSAqLwogCWNvcHlfZ2VuZXJpY19wYXRoX2luZm8oJmpv aW5fcGxhbi0+am9pbi5wbGFuLCAmYmVzdF9wYXRoLT5qcGF0aC5wYXRoKTsKKwlyb290LT5hbGxv d19wcmVmZXRjaCA9IGZhbHNlOwogCiAJcmV0dXJuIGpvaW5fcGxhbjsKIH0KZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5uZXIuYyBiL3NyYy9iYWNrZW5kL29wdGlt aXplci9wbGFuL3BsYW5uZXIuYwppbmRleCAyZTI0NThiMTI4Li4zYmUxMzNmNzU3IDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFubmVyLmMKKysrIGIvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3BsYW4vcGxhbm5lci5jCkBAIC00MTMsMTEgKzQxMywxNCBAQCBzdGFuZGFy ZF9wbGFubmVyKFF1ZXJ5ICpwYXJzZSwgY29uc3QgY2hhciAqcXVlcnlfc3RyaW5nLCBpbnQgY3Vy c29yT3B0aW9ucywKIAlyb290ID0gc3VicXVlcnlfcGxhbm5lcihnbG9iLCBwYXJzZSwgTlVMTCwK IAkJCQkJCQlmYWxzZSwgdHVwbGVfZnJhY3Rpb24pOwogCisJcm9vdC0+YWxsb3dfcHJlZmV0Y2gg PSB0cnVlOworCiAJLyogU2VsZWN0IGJlc3QgUGF0aCBhbmQgdHVybiBpdCBpbnRvIGEgUGxhbiAq LwogCWZpbmFsX3JlbCA9IGZldGNoX3VwcGVyX3JlbChyb290LCBVUFBFUlJFTF9GSU5BTCwgTlVM TCk7CiAJYmVzdF9wYXRoID0gZ2V0X2NoZWFwZXN0X2ZyYWN0aW9uYWxfcGF0aChmaW5hbF9yZWws IHR1cGxlX2ZyYWN0aW9uKTsKIAogCXRvcF9wbGFuID0gY3JlYXRlX3BsYW4ocm9vdCwgYmVzdF9w YXRoKTsKKwl0b3BfcGxhbi0+YWxsb3dfcHJlZmV0Y2ggPSByb290LT5hbGxvd19wcmVmZXRjaDsK IAogCS8qCiAJICogSWYgY3JlYXRpbmcgYSBwbGFuIGZvciBhIHNjcm9sbGFibGUgY3Vyc29yLCBt YWtlIHN1cmUgaXQgY2FuIHJ1bgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9haW8v c3RyZWFtaW5nX3JlYWQuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL3N0cmVhbWluZ19yZWFk LmMKaW5kZXggMTk2MDUwOTBmZS4uYWFjY2YyNWE3ZiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv c3RvcmFnZS9haW8vc3RyZWFtaW5nX3JlYWQuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2Fp by9zdHJlYW1pbmdfcmVhZC5jCkBAIC0zNCw2ICszNCw3IEBAIHN0cnVjdCBQZ1N0cmVhbWluZ1Jl YWQKIAlpbnQJCQlwaW5uZWRfYnVmZmVyc190cmlnZ2VyOwogCWludAkJCW5leHRfdGFpbF9idWZm ZXI7CiAJYm9vbAkJZmluaXNoZWQ7CisJYm9vbAkJcmVzdW1hYmxlOwogCXZvaWQJICAgKnBnc3Jf cHJpdmF0ZTsKIAlQZ1N0cmVhbWluZ1JlYWRCdWZmZXJDQiBjYWxsYmFjazsKIAlCdWZmZXJBY2Nl c3NTdHJhdGVneSBzdHJhdGVneTsKQEAgLTI0NSwxMCArMjQ2LDEyIEBAIHBnX3N0cmVhbWluZ19y ZWFkX25ld19yYW5nZShQZ1N0cmVhbWluZ1JlYWQgKnBnc3IpCiBzdGF0aWMgdm9pZAogcGdfc3Ry ZWFtaW5nX3JlYWRfbG9va19haGVhZChQZ1N0cmVhbWluZ1JlYWQgKnBnc3IpCiB7CisJYm9vbAkJ ZG9uZSA9IHBnc3ItPmZpbmlzaGVkICYmICFwZ3NyLT5yZXN1bWFibGU7CisKIAkvKgogCSAqIElm IHdlJ3JlIGZpbmlzaGVkIG9yIGNhbid0IHN0YXJ0IG1vcmUgSS9PLCB0aGVuIGRvbid0IGxvb2sg YWhlYWQuCiAJICovCi0JaWYgKHBnc3ItPmZpbmlzaGVkIHx8IHBnc3ItPmlvc19pbl9wcm9ncmVz cyA9PSBwZ3NyLT5tYXhfaW9zKQorCWlmIChkb25lIHx8IHBnc3ItPmlvc19pbl9wcm9ncmVzcyA9 PSBwZ3NyLT5tYXhfaW9zKQogCQlyZXR1cm47CiAKIAkvKgpAQCAtNDMzLDMgKzQzNiw5IEBAIHBn X3N0cmVhbWluZ19yZWFkX2ZyZWUoUGdTdHJlYW1pbmdSZWFkICpwZ3NyKQogCQlwZnJlZShwZ3Ny LT5wZXJfYnVmZmVyX2RhdGEpOwogCXBmcmVlKHBnc3IpOwogfQorCit2b2lkCitwZ19zdHJlYW1p bmdfcmVhZF9zZXRfcmVzdW1hYmxlKFBnU3RyZWFtaW5nUmVhZCAqcGdzcikKK3sKKwlwZ3NyLT5y ZXN1bWFibGUgPSB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL2dlbmFt LmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2VuYW0uaAppbmRleCA4MDI2YzJiMzZkLi4xM2Q2ZmFi MzE4IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2VuYW0uaAorKysgYi9zcmMvaW5j bHVkZS9hY2Nlc3MvZ2VuYW0uaApAQCAtMTQsNiArMTQsNyBAQAogI2lmbmRlZiBHRU5BTV9ICiAj ZGVmaW5lIEdFTkFNX0gKIAorI2luY2x1ZGUgImFjY2Vzcy9yZWxzY2FuLmgiCiAjaW5jbHVkZSAi YWNjZXNzL3NkaXIuaCIKICNpbmNsdWRlICJhY2Nlc3Mvc2tleS5oIgogI2luY2x1ZGUgIm5vZGVz L3RpZGJpdG1hcC5oIgpAQCAtMjQsNiArMjUsMjIgQEAKIC8qIFdlIGRvbid0IHdhbnQgdGhpcyBm aWxlIHRvIGRlcGVuZCBvbiBleGVjbm9kZXMuaC4gKi8KIHN0cnVjdCBJbmRleEluZm87CiAKK3R5 cGVkZWYgc3RydWN0IFRJRFF1ZXVlSXRlbQoreworCUl0ZW1Qb2ludGVyRGF0YSB0aWQ7CisJYm9v bAkJcmVjaGVjazsKKwlJbmRleFR1cGxlCWl0dXA7CisJSGVhcFR1cGxlCWh0dXA7Cit9IFRJRFF1 ZXVlSXRlbTsKKwordHlwZWRlZiBzdHJ1Y3QgVElEUXVldWUKK3sKKwl1aW50NjQJCWhlYWQ7CisJ dWludDY0CQl0YWlsOworCWludAkJCXNpemU7CisJVElEUXVldWVJdGVtIGRhdGFbRkxFWElCTEVf QVJSQVlfTUVNQkVSIC8qIHNpemUgKi8gXTsKK30gVElEUXVldWU7CisKIC8qCiAgKiBTdHJ1Y3Qg Zm9yIHN0YXRpc3RpY3MgcmV0dXJuZWQgYnkgYW1idWlsZAogICovCkBAIC0xNzUsNiArMTkyLDMw IEBAIGV4dGVybiBJbmRleFNjYW5EZXNjIGluZGV4X2JlZ2luc2Nhbl9wYXJhbGxlbChSZWxhdGlv biBoZWFwcmVsLAogCQkJCQkJCQkJCQkgIFBhcmFsbGVsSW5kZXhTY2FuRGVzYyBwc2Nhbik7CiBl eHRlcm4gSXRlbVBvaW50ZXIgaW5kZXhfZ2V0bmV4dF90aWQoSW5kZXhTY2FuRGVzYyBzY2FuLAog CQkJCQkJCQkJIFNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworZXh0ZXJuIHZvaWQgaW5kZXhf cGdzcl9hbGxvYyhJbmRleFNjYW5EZXNjIHNjYW4pOworCitleHRlcm4gdm9pZCB0aWRfcXVldWVf cmVzZXQoVElEUXVldWUgKnEpOworCitleHRlcm4gdm9pZCBpbmRleF90aWRfZW5xdWV1ZShUSURR dWV1ZSAqdGlkX3F1ZXVlLCBJdGVtUG9pbnRlciB0aWQsIGJvb2wgcmVjaGVjaywKKwkJCQkJCQkg IEhlYXBUdXBsZSBodHVwLCBJbmRleFR1cGxlIGl0dXApOworCisjZGVmaW5lIFRJRF9RVUVVRV9T SVpFIDYKKworZXh0ZXJuIFRJRFF1ZXVlICp0aWRfcXVldWVfYWxsb2MoaW50IHNpemUpOworCitz dGF0aWMgaW5saW5lIGJvb2wKK1RJRF9RVUVVRV9GVUxMKFRJRFF1ZXVlICpxKQoreworCXJldHVy biBxLT50YWlsIC0gcS0+aGVhZCA9PSBxLT5zaXplOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wK K1RJRF9RVUVVRV9FTVBUWShUSURRdWV1ZSAqcSkKK3sKKwlyZXR1cm4gcS0+aGVhZCA9PSBxLT50 YWlsOworfQorCiBzdHJ1Y3QgVHVwbGVUYWJsZVNsb3Q7CiBleHRlcm4gYm9vbCBpbmRleF9mZXRj aF9oZWFwKEluZGV4U2NhbkRlc2Mgc2Nhbiwgc3RydWN0IFR1cGxlVGFibGVTbG90ICpzbG90KTsK IGV4dGVybiBib29sIGluZGV4X2dldG5leHRfc2xvdChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5E aXJlY3Rpb24gZGlyZWN0aW9uLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNj YW4uaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9yZWxzY2FuLmgKaW5kZXggNTIxMDQzMzA0YS4uNjZi M2Q5MGM4MyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNjYW4uaAorKysgYi9z cmMvaW5jbHVkZS9hY2Nlc3MvcmVsc2Nhbi5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAi YWNjZXNzL2l0dXAuaCIKICNpbmNsdWRlICJwb3J0L2F0b21pY3MuaCIKICNpbmNsdWRlICJzdG9y YWdlL2J1Zi5oIgorI2luY2x1ZGUgInN0b3JhZ2Uvc3RyZWFtaW5nX3JlYWQuaCIKICNpbmNsdWRl ICJzdG9yYWdlL3NwaW4uaCIKICNpbmNsdWRlICJ1dGlscy9yZWxjYWNoZS5oIgogCkBAIC0xMDQs OCArMTA1LDE2IEBAIHR5cGVkZWYgc3RydWN0IFBhcmFsbGVsQmxvY2tUYWJsZVNjYW5Xb3JrZXJE YXRhICpQYXJhbGxlbEJsb2NrVGFibGVTY2FuV29ya2VyOwogdHlwZWRlZiBzdHJ1Y3QgSW5kZXhG ZXRjaFRhYmxlRGF0YQogewogCVJlbGF0aW9uCXJlbDsKKwlQZ1N0cmVhbWluZ1JlYWQgKnBnc3I7 CisKKwlJdGVtUG9pbnRlckRhdGEgdGlkOworCWJvb2wJCXJlY2hlY2s7CisJSW5kZXhUdXBsZQlp dHVwOworCUhlYXBUdXBsZQlodHVwOwogfSBJbmRleEZldGNoVGFibGVEYXRhOwogCit0eXBlZGVm IHN0cnVjdCBUSURRdWV1ZSBUSURRdWV1ZTsKKwogLyoKICAqIFdlIHVzZSB0aGUgc2FtZSBJbmRl eFNjYW5EZXNjRGF0YSBzdHJ1Y3R1cmUgZm9yIGJvdGggYW1nZXR0dXBsZS1iYXNlZAogICogYW5k IGFtZ2V0Yml0bWFwLWJhc2VkIGluZGV4IHNjYW5zLiAgU29tZSBmaWVsZHMgYXJlIG9ubHkgcmVs ZXZhbnQgaW4KQEAgLTE0OCw2ICsxNTcsOCBAQCB0eXBlZGVmIHN0cnVjdCBJbmRleFNjYW5EZXNj RGF0YQogCWJvb2wJCXhzX2hlYXBfY29udGludWU7CS8qIFQgaWYgbXVzdCBrZWVwIHdhbGtpbmcs IHBvdGVudGlhbAogCQkJCQkJCQkJICogZnVydGhlciByZXN1bHRzICovCiAJSW5kZXhGZXRjaFRh YmxlRGF0YSAqeHNfaGVhcGZldGNoOworCVRJRFF1ZXVlICAgKnRpZF9xdWV1ZTsKKwlib29sCQlp bmRleF9kb25lOwogCiAJYm9vbAkJeHNfcmVjaGVjazsJCS8qIFQgbWVhbnMgc2NhbiBrZXlzIG11 c3QgYmUgcmVjaGVja2VkICovCiAKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL25vZGVzL2V4ZWNu b2Rlcy5oIGIvc3JjL2luY2x1ZGUvbm9kZXMvZXhlY25vZGVzLmgKaW5kZXggNDQ0YTVmMGZkNS4u YTgwNDJhYmY5NSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9kZXMvZXhlY25vZGVzLmgKKysr IGIvc3JjL2luY2x1ZGUvbm9kZXMvZXhlY25vZGVzLmgKQEAgLTY5Nyw2ICs2OTcsNyBAQCB0eXBl ZGVmIHN0cnVjdCBFU3RhdGUKIAlzdHJ1Y3QgRVBRU3RhdGUgKmVzX2VwcV9hY3RpdmU7CiAKIAli b29sCQllc191c2VfcGFyYWxsZWxfbW9kZTsJLyogY2FuIHdlIHVzZSBwYXJhbGxlbCB3b3JrZXJz PyAqLworCWJvb2wJCWVzX3VzZV9wcmVmZXRjaGluZzsKIAogCS8qIFRoZSBwZXItcXVlcnkgc2hh cmVkIG1lbW9yeSBhcmVhIHRvIHVzZSBmb3IgcGFyYWxsZWwgZXhlY3V0aW9uLiAqLwogCXN0cnVj dCBkc2FfYXJlYSAqZXNfcXVlcnlfZHNhOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbm9kZXMv cGF0aG5vZGVzLmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMuaAppbmRleCA1MzQ2OTJi ZWUxLi4xNzEwNjZiMTRlIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMu aAorKysgYi9zcmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMuaApAQCAtMjAzLDYgKzIwMyw3IEBA IHN0cnVjdCBQbGFubmVySW5mbwogCiAJLyogMSBhdCB0aGUgb3V0ZXJtb3N0IFF1ZXJ5ICovCiAJ SW5kZXgJCXF1ZXJ5X2xldmVsOworCWJvb2wJCWFsbG93X3ByZWZldGNoOwogCiAJLyogTlVMTCBh dCBvdXRlcm1vc3QgUXVlcnkgKi8KIAlQbGFubmVySW5mbyAqcGFyZW50X3Jvb3QgcGdfbm9kZV9h dHRyKHJlYWRfd3JpdGVfaWdub3JlKTsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL25vZGVzL3Bs YW5ub2Rlcy5oIGIvc3JjL2luY2x1ZGUvbm9kZXMvcGxhbm5vZGVzLmgKaW5kZXggYjRlZjZiYzQ0 Yy4uMzE3ZGUyZDc4MSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9kZXMvcGxhbm5vZGVzLmgK KysrIGIvc3JjL2luY2x1ZGUvbm9kZXMvcGxhbm5vZGVzLmgKQEAgLTE2OSw2ICsxNjksNyBAQCB0 eXBlZGVmIHN0cnVjdCBQbGFuCiAJICovCiAJQml0bWFwc2V0ICAqZXh0UGFyYW07CiAJQml0bWFw c2V0ICAqYWxsUGFyYW07CisJYm9vbAkJYWxsb3dfcHJlZmV0Y2g7CiB9IFBsYW47CiAKIC8qIC0t LS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc3RyZWFtaW5n X3JlYWQuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc3RyZWFtaW5nX3JlYWQuaAppbmRleCA0MGMz NDA4YzU0Li4yMjg4YjdiNWViIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9zdG9yYWdlL3N0cmVh bWluZ19yZWFkLmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9zdHJlYW1pbmdfcmVhZC5oCkBA IC00Miw0ICs0Miw2IEBAIGV4dGVybiB2b2lkIHBnX3N0cmVhbWluZ19yZWFkX3ByZWZldGNoKFBn U3RyZWFtaW5nUmVhZCAqcGdzcik7CiBleHRlcm4gQnVmZmVyIHBnX3N0cmVhbWluZ19yZWFkX2J1 ZmZlcl9nZXRfbmV4dChQZ1N0cmVhbWluZ1JlYWQgKnBnc3IsIHZvaWQgKipwZXJfYnVmZmVyX3By aXZhdGUpOwogZXh0ZXJuIHZvaWQgcGdfc3RyZWFtaW5nX3JlYWRfZnJlZShQZ1N0cmVhbWluZ1Jl YWQgKnBnc3IpOwogCitleHRlcm4gdm9pZCBwZ19zdHJlYW1pbmdfcmVhZF9zZXRfcmVzdW1hYmxl KFBnU3RyZWFtaW5nUmVhZCAqcGdzcik7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xz L3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlz dAppbmRleCAwZTM0MTQ1MTg3Li5lY2M5MTBmZjM1IDEwMDY0NAotLS0gYS9zcmMvdG9vbHMvcGdp bmRlbnQvdHlwZWRlZnMubGlzdAorKysgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlz dApAQCAtMjcyNiw2ICsyNzI2LDggQEAgVEJNU2hhcmVkSXRlcmF0b3JTdGF0ZQogVEJNU3RhdHVz CiBUQmxvY2tTdGF0ZQogVElEQml0bWFwCitUSURRdWV1ZQorVElEUXVldWVJdGVtCiBUTV9GYWls dXJlRGF0YQogVE1fSW5kZXhEZWxldGUKIFRNX0luZGV4RGVsZXRlT3AKLS0gCjIuMzcuMgoK --000000000000d13be10610d1a7c5--