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 1teugm-00GL2y-9J for pgsql-hackers@arkaria.postgresql.org; Mon, 03 Feb 2025 11:32:28 +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 1teugk-00CaZ0-Sm for pgsql-hackers@arkaria.postgresql.org; Mon, 03 Feb 2025 11:32:26 +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 1teugk-00CaYp-9D for pgsql-hackers@lists.postgresql.org; Mon, 03 Feb 2025 11:32:26 +0000 Received: from mail-ed1-x52e.google.com ([2a00:1450:4864:20::52e]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1teugh-002wA1-13 for pgsql-hackers@lists.postgresql.org; Mon, 03 Feb 2025 11:32:25 +0000 Received: by mail-ed1-x52e.google.com with SMTP id 4fb4d7f45d1cf-5d3cf094768so7886052a12.0 for ; Mon, 03 Feb 2025 03:32:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1738582342; x=1739187142; 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=7e0FCNKCL9MmrlH0Oag2uwHAiN+iCUW/Ib/HZkSn6Vc=; b=KijrHhKazvYxmnd0dnDucg/nL0KEporzVRkzdN6MxxvgtCWidR6okyUEGZg9yg3Vyx gwfarRcLnLI+MDRlvCjqx4ZG2W1lWHkmv8kceQbsNPQecmUE5IHMrP2FDJROcw1ME41s WOvq0DTXJILYOAVfWVtGRTxql7zDv0kvVSQHuyx11yStwwmBvgE/cgVLz53iNJQY1siw JF+bK72N2S+Hu/x8GouMLkhzQkIUqRCSNNcPdFDwlGDkQ4xvdhpAY33ZNWcI4jUdwKBr CXPGdvvRyikaJQZqZVDSrMHTsksA6zIXYhbn/76T2OaZFBHuwfppSb4ScdMfH6l4zb8i 3dQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738582342; x=1739187142; 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=7e0FCNKCL9MmrlH0Oag2uwHAiN+iCUW/Ib/HZkSn6Vc=; b=ckME+pPTmT/lCoWfFnl2jjlN03Kz1shqMFR1gVMd8jU4Qn+DlaqCo1xKKrmvXmnfma WTR1O3xRFd95gIZ7SxnuwuoyaX0kxAS5bLQFhF/lAe8XloJIahEE8XD9YSOhddXql09G oIQwWe/uA4rzx96hRoAuEQIxIMGXJ/h4EM4Yshe3tF3NsJkDIoCq+P3MJDOrvcWQgV0L vW/0n7uHjnCxpK693/g6uD194ym7viAMWuxDb7hCbEU0KexqylcCxtzskmhRpaHi1LQG 5gN93Gakki16OzQ4JgrjEaY+Uakoo5hpgfLzYPEdCfw1yndhGoh0fxisApsgqLjPa5mQ 0iCg== X-Forwarded-Encrypted: i=1; AJvYcCXAYwujrXD5Xj0pMwTXS/MiUtNdOz5rIhmNwPD4XEGu0jAODcCbEGRWfH4DrCxSB8pxoXqu4LZyfbd+sEGe@lists.postgresql.org X-Gm-Message-State: AOJu0Ywtjd8n1/8QtE371+YEMEknhXn72UYbc7+fb/D6fGHkT0RHHMvJ DSulbc/KvqI6EvMXNPFdnmqPi3fqky7dD0EAS3zxU6DdBNX+OUB0nOTjWYmRxPeCmwCmkAHo6oU Fsnsf73tRZb91ZoEIx6XmHGzBKuI= X-Gm-Gg: ASbGncsRAnt+BWt0lmOBayxJgJyIRulfHTd5ywNsddHw06CnT0b+U1hobuk6TA0Ip/5 n8Ab6h7+1vZB7n5CsFz4lxw8xR546UE5XRaiP+NMQNqj3X53m5Am+FBn2wn8dydodUBh0ebEr X-Google-Smtp-Source: AGHT+IFk8tXfTtt7UKKPzf7wmyi6c7e4qrVANJ1zSzFr+BNxMzhY4BQ+IpxAUUeBM1LvFcGqxJ4i1hXunYNmYUBWQw8= X-Received: by 2002:a05:6402:249a:b0:5dc:a44d:36a2 with SMTP id 4fb4d7f45d1cf-5dca44d3707mr5613555a12.18.1738582341502; Mon, 03 Feb 2025 03:32:21 -0800 (PST) MIME-Version: 1.0 References: <567ED6CA.2040504@sigaev.ru> <37bf870a-22e0-4aba-b845-549482118f8d@gmail.com> <8174de69-9e1a-0827-0e81-ef97f56a5939@gmail.com> <3b717020-14d9-425f-8c60-ce336b5a23b3@postgrespro.ru> <43db6a40-5c5f-4909-ad62-3060b297e686@postgrespro.ru> <41ba3d47-2a48-476c-88d4-6ebd889a7af2@gmail.com> <036d64e6-4d47-485c-b047-6664d452b3e8@postgrespro.ru> In-Reply-To: <036d64e6-4d47-485c-b047-6664d452b3e8@postgrespro.ru> From: Alexander Korotkov Date: Mon, 3 Feb 2025 13:32:10 +0200 X-Gm-Features: AWEUYZk5KQyJv_fvPqNmvPNTDFegKKNs8O2ZK6RjN6hKtbZS5eC8D8ikowVqQBk Message-ID: Subject: Re: POC, WIP: OR-clause support for indexes To: Alena Rybakina Cc: Ranier Vilela , Alexander Lakhin , jian he , Robert Haas , Nikolay Shaplov , pgsql-hackers@lists.postgresql.org, pgsql-hackers@postgresql.org, Peter Geoghegan , Marcos Pegoraro , teodor@sigaev.ru, Peter Eisentraut , Andrei Lepikhov Content-Type: multipart/mixed; boundary="000000000000e141fb062d3b3e7c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000e141fb062d3b3e7c Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Feb 3, 2025 at 12:22=E2=80=AFPM Alena Rybakina wrote: > > Thank you for updated version! I agree for your version of the code. > > On 02.02.2025 21:00, Alexander Korotkov wrote: > > On Fri, Jan 31, 2025 at 4:31=E2=80=AFPM Alena Rybakina > wrote: > > I started reviewing at the patch and saw some output "ERROR" in the outpu= t of the test and is it okay here? > > SELECT * FROM tenk1 t1 > WHERE t1.thousand =3D 42 OR t1.thousand =3D (SELECT t2.tenthous FROM tenk= 1 t2 WHERE t2.thousand =3D t1.tenthous); > ERROR: more than one row returned by a subquery used as an expression > > The output is correct for this query. But the query is very > unfortunate for the regression test. I've revised query in the v47 > revision [1]. > > Links. > 1. https://www.postgresql.org/message-id/CAPpHfdsBZmNt9qUoJBqsQFiVDX1%3Dy= CKpuVAt1YnR7JCpP%3Dk8%2BA%40mail.gmail.com > > While analyzing the modified query plan from the regression test, I notic= ed that despite using a full seqscan for table t2 in the original plan, > its results are cached by Materialize node, and this can significantly sp= eed up the execution of the NestedLoop algorithm. > > For example, after running the query several times, I got results that sh= ow that the query execution time was twice as bad. > > Original plan: > > EXPLAIN ANALYZE SELECT * FROM bitmap_split_or t1, bitmap_split_or t2 WHER= E t1.a=3Dt2.b OR t1.a=3D1; QUERY PLAN -------------------------------------= ---------------------------------------------------------------------------= ---------------- Nested Loop (cost=3D0.00..70067.00 rows=3D2502499 width=3D= 24) (actual time=3D0.015..1123.247 rows=3D2003000 loops=3D1) Join Filter: (= (t1.a =3D t2.b) OR (t1.a =3D 1)) Rows Removed by Join Filter: 1997000 Buffe= rs: shared hit=3D22 -> Seq Scan on bitmap_split_or t1 (cost=3D0.00..31.00 r= ows=3D2000 width=3D12) (actual time=3D0.006..0.372 rows=3D2000 loops=3D1) B= uffers: shared hit=3D11 -> Materialize (cost=3D0.00..41.00 rows=3D2000 widt= h=3D12) (actual time=3D0.000..0.111 rows=3D2000 loops=3D2000) Storage: Memo= ry Maximum Storage: 110kB Buffers: shared hit=3D11 -> Seq Scan on bitmap_sp= lit_or t2 (cost=3D0.00..31.00 rows=3D2000 width=3D12) (actual time=3D0.003.= .0.188 rows=3D2000 loops=3D1) Buffers: shared hit=3D11 Planning Time: 0.118= ms Execution Time: 1204.874 ms (13 rows) > > Query plan after the patch: > > EXPLAIN ANALYZE SELECT * FROM bitmap_split_or t1, bitmap_split_or t2 WHER= E t1.a=3Dt2.b OR t1.a=3D1; QUERY PLAN -------------------------------------= ---------------------------------------------------------------------------= ------------------------------- Nested Loop (cost=3D0.28..56369.00 rows=3D2= 502499 width=3D24) (actual time=3D0.121..2126.606 rows=3D2003000 loops=3D1)= Buffers: shared hit=3D16009 read=3D2 -> Seq Scan on bitmap_split_or t2 (co= st=3D0.00..31.00 rows=3D2000 width=3D12) (actual time=3D0.017..0.652 rows= =3D2000 loops=3D1) Buffers: shared hit=3D11 -> Index Scan using t_a_b_idx o= n bitmap_split_or t1 (cost=3D0.28..18.15 rows=3D1002 width=3D12) (actual ti= me=3D0.044..0.627 rows=3D1002 loops=3D2000) Index Cond: (a =3D ANY (ARRAY[t= 2.b, 1])) Buffers: shared hit=3D15998 read=3D2 Planning Time: 0.282 ms Exec= ution Time: 2344.367 ms (9 rows) > > I'm afraid that we may lose this with this optimization. Maybe this can b= e taken into account somehow, what do you think? The important aspect is that the second plan have lower cost than the first one. So, that's the question to the cost model. The patch just lets optimizer consider more comprehensive plurality of paths. You can let optimizer select the first plan by tuning *_cost params. For example, setting cpu_index_tuple_cost =3D 0.02 makes first plan win for me. Other than that the test query is quite unfortunate as t1.a=3D1 is very frequent. I've adjusted the query so that nested loop with index scan wins both in cost and execution time. I've also adjusted another test query as proposed by Andrei. I'm going to push this patch is there is no more notes. Links. 1. https://www.postgresql.org/message-id/fc1017ca-877b-4f86-b491-154cf123ee= dd%40gmail.com ------ Regards, Alexander Korotkov Supabase --000000000000e141fb062d3b3e7c Content-Type: application/octet-stream; name="v48-0001-Revise-the-header-comment-for-match_clause_to_in.patch" Content-Disposition: attachment; filename="v48-0001-Revise-the-header-comment-for-match_clause_to_in.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m6oyllbk0 RnJvbSAwZmU3ZjFlYjY0NDdiODZmOGM5ZThlYzQ3MjMzM2UxM2VkMzZhMjU1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgS29yb3Rrb3YgPGFrb3JvdGtvdkBwb3N0Z3Jl c3FsLm9yZz4KRGF0ZTogU2F0LCAxIEZlYiAyMDI1IDE2OjUzOjMyICswMjAwClN1YmplY3Q6IFtQ QVRDSCB2NDggMS8yXSBSZXZpc2UgdGhlIGhlYWRlciBjb21tZW50IGZvcgogbWF0Y2hfY2xhdXNl X3RvX2luZGV4Y29sKCkKClNpbmNlIGQ0Mzc4YzAwMDVlNiwgbWF0Y2hfY2xhdXNlX3RvX2luZGV4 Y29sKCkgZG9lc24ndCBhbHdheXMgcmV0dXJuIE5VTEwKZm9yIGFuIE9SIGNsYXVzZS4gIFRoaXMg Y29tbWl0IHJlZmxlY3RzIHRoYXQgaW4gdGhlIGhlYWRlciBjb21tZW50LgoKUmVwb3J0ZWQtYnk6 IFBhdmVsIEJvcmlzb3YgPHBhc2hraW4uZWxmZUBnbWFpbC5jb20+Ci0tLQogc3JjL2JhY2tlbmQv b3B0aW1pemVyL3BhdGgvaW5keHBhdGguYyB8IDUgKysrLS0KIDEgZmlsZSBjaGFuZ2VkLCAzIGlu c2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BhdGgvaW5keHBhdGguYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhw YXRoLmMKaW5kZXggZmEzZWRmNjBmM2MuLmE1OGNmNWJhZDFhIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXpl ci9wYXRoL2luZHhwYXRoLmMKQEAgLTI2MzksOCArMjYzOSw5IEBAIG1hdGNoX2NsYXVzZV90b19p bmRleChQbGFubmVySW5mbyAqcm9vdCwKICAqIFJldHVybnMgYW4gSW5kZXhDbGF1c2UgaWYgdGhl IGNsYXVzZSBjYW4gYmUgdXNlZCB3aXRoIHRoaXMgaW5kZXgga2V5LAogICogb3IgTlVMTCBpZiBu b3QuCiAgKgotICogTk9URTogIHJldHVybnMgTlVMTCBpZiBjbGF1c2UgaXMgYW4gT1Igb3IgQU5E IGNsYXVzZTsgaXQgaXMgdGhlCi0gKiByZXNwb25zaWJpbGl0eSBvZiBoaWdoZXItbGV2ZWwgcm91 dGluZXMgdG8gY29wZSB3aXRoIHRob3NlLgorICogTk9URTogIFRoaXMgcm91dGluZSBhbHdheXMg cmV0dXJucyBOVUxMIGlmIHRoZSBjbGF1c2UgaXMgYW4gQU5EIGNsYXVzZS4KKyAqIEhpZ2hlci1s ZXZlbCByb3V0aW5lcyBkZWFsIHdpdGggT1IgYW5kIEFORCBjbGF1c2VzLiBPUiBjbGF1c2UgY2Fu IGJlCisgKiBtYXRjaGVkIGFzIGEgd2hvbGUgYnkgbWF0Y2hfb3JjbGF1c2VfdG9faW5kZXhjb2wo KSB0aG91Z2guCiAgKi8KIHN0YXRpYyBJbmRleENsYXVzZSAqCiBtYXRjaF9jbGF1c2VfdG9faW5k ZXhjb2woUGxhbm5lckluZm8gKnJvb3QsCi0tIAoyLjM5LjUgKEFwcGxlIEdpdC0xNTQpCgo= --000000000000e141fb062d3b3e7c Content-Type: application/octet-stream; name="v48-0002-Allow-usage-of-match_orclause_to_indexcol-for-jo.patch" Content-Disposition: attachment; filename="v48-0002-Allow-usage-of-match_orclause_to_indexcol-for-jo.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m6oyllbp1 RnJvbSBjMzVkM2I3MWJkOGRiOWRlODk0MWFmMWQwNzQyMWJhMjQ1NmMyMjNiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgS29yb3Rrb3YgPGFrb3JvdGtvdkBwb3N0Z3Jl c3FsLm9yZz4KRGF0ZTogV2VkLCA5IE9jdCAyMDI0IDE4OjQ0OjI1ICswMzAwClN1YmplY3Q6IFtQ QVRDSCB2NDggMi8yXSBBbGxvdyB1c2FnZSBvZiBtYXRjaF9vcmNsYXVzZV90b19pbmRleGNvbCgp IGZvciBqb2lucwoKVGhpcyBjb21taXQgYWxsb3dzIHRyYW5zZm9ybWF0aW9uIG9mIE9SLWNsYXVz ZXMgaW50byBTQU9QJ3MgZm9yIGluZGV4IHNjYW5zCndpdGhpbiBuZXN0ZWQgbG9vcCBqb2lucy4g IFRoYXQgcmVxdWlyZWQgdGhlIGZvbGxvd2luZyBjaGFuZ2VzLgoKIDEuIE1ha2UgbWF0Y2hfb3Jj bGF1c2VfdG9faW5kZXhjb2woKSBhbmQgZ3JvdXBfc2ltaWxhcl9vcl9hcmdzKCkgdW5kZXJzdGFu ZAogICAgY29uc3QtbmVzcyBpbiB0aGUgc2FtZSB3YXkgYXMgbWF0Y2hfb3BjbGF1c2VfdG9faW5k ZXhjb2woKS4gIFRoaXMKICAgIGdlbmVyYWxseSBtYWtlcyBvdXIgYXBwcm9hY2ggbW9yZSB1bmlm b3JtLgogMi4gTWFrZSBtYXRjaF9qb2luX2NsYXVzZXNfdG9faW5kZXgoKSBwYXNzIE9SLWNsYXVz ZXMgdG8KICAgIG1hdGNoX2NsYXVzZV90b19pbmRleCgpLgogMy4gQWxzbyBzd2l0Y2ggbWF0Y2hf am9pbl9jbGF1c2VzX3RvX2luZGV4KCkgdG8gdXNlIGxpc3RfYXBwZW5kX3VuaXF1ZV9wdHIoKQog ICAgZm9yIGFkZGluZyBjbGF1c2VzIHRvICpqb2lub3JjbGF1c2VzLiAgVGhhdCBhdm9pZHMgcG9z c2libGUgZHVwbGljYXRlcwogICAgd2hlbiBwcm9jZXNzaW5nIHRoZSBzYW1lIGNsYXVzZXMgd2l0 aCBkaWZmZXJlbnQgaW5kZXhlcy4gIFByZXZpb3VzbHkgc3VjaAogICAgZHVwbGljYXRlcyB3ZXJl IGVsaW1pdGVkIGluIG1hdGNoX2NsYXVzZV90b19pbmRleCgpLCBidXQgbm93CiAgICBncm91cF9z aW1pbGFyX29yX2FyZ3MoKSBlYWNoIHRpbWUgZ2VuZXJhdGVzIGRpc3RpbmN0IGNvcGllcyBvZiBn cm91cGVkCiAgICBPUiBjbGF1c2VzLgoKRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS9D QVBwSGZkdiUyQmp0TndvZmctcDV6ODZqTFlaVVR0NnRSMTdXeTAwdGEwZEwlM0R3SFFOM1pBJTQw bWFpbC5nbWFpbC5jb20KUmV2aWV3ZWQtYnk6IEFuZHJlaSBMZXBpa2hvdiA8bGVwaWhvdkBnbWFp bC5jb20+ClJldmlld2VkLWJ5OiBBbGVuYSBSeWJha2luYSA8YS5yeWJha2luYUBwb3N0Z3Jlc3By by5ydT4KUmV2aWV3ZWQtYnk6IFBhdmVsIEJvcmlzb3YgPHBhc2hraW4uZWxmZUBnbWFpbC5jb20+ Ci0tLQogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYyAgICAgICAgfCA3MCAr KysrKysrKysrKystLS0tLS0tLQogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jcmVhdGVfaW5k ZXgub3V0ICAgfCAzMiArKysrKysrKysKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5v dXQgICAgICAgICAgIHwgNTEgKysrKysrKysrKysrLS0KIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvcGFydGl0aW9uX2pvaW4ub3V0IHwgMTIgKystLQogc3JjL3Rlc3QvcmVncmVzcy9zcWwvY3Jl YXRlX2luZGV4LnNxbCAgICAgICAgfCAgOSArKysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4u c3FsICAgICAgICAgICAgICAgIHwgMTggKysrKy0KIDYgZmlsZXMgY2hhbmdlZCwgMTUwIGluc2Vy dGlvbnMoKyksIDQyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGlt aXplci9wYXRoL2luZHhwYXRoLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0 aC5jCmluZGV4IGE1OGNmNWJhZDFhLi42ZTIwNTFlZmM2NSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv cGF0aC9pbmR4cGF0aC5jCkBAIC0xMjU1LDYgKzEyNTUsNyBAQCBncm91cF9zaW1pbGFyX29yX2Fy Z3MoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwgUmVzdHJpY3RJbmZvICpyaW5m bykKIAlMaXN0Q2VsbCAgICpsYzI7CiAJTGlzdAkgICAqb3JhcmdzOwogCUxpc3QJICAgKnJlc3Vs dCA9IE5JTDsKKwlJbmRleAkJcmVsaWQgPSByZWwtPnJlbGlkOwogCiAJQXNzZXJ0KElzQShyaW5m by0+b3JjbGF1c2UsIEJvb2xFeHByKSk7CiAJb3JhcmdzID0gKChCb29sRXhwciAqKSByaW5mby0+ b3JjbGF1c2UpLT5hcmdzOwpAQCAtMTMxOSwxMCArMTMyMCwxMyBAQCBncm91cF9zaW1pbGFyX29y X2FyZ3MoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwgUmVzdHJpY3RJbmZvICpy aW5mbykKIAkJLyoKIAkJICogQ2hlY2sgZm9yIGNsYXVzZXMgb2YgdGhlIGZvcm06IChpbmRleGtl eSBvcGVyYXRvciBjb25zdGFudCkgb3IKIAkJICogKGNvbnN0YW50IG9wZXJhdG9yIGluZGV4a2V5 KS4gIEJ1dCB3ZSBkb24ndCBrbm93IGEgcGFydGljdWxhciBpbmRleAotCQkgKiB5ZXQuICBGaXJz dCBjaGVjayBmb3IgYSBjb25zdGFudCwgd2hpY2ggbXVzdCBiZSBDb25zdCBvciBQYXJhbS4KLQkJ ICogVGhhdCdzIGNoZWFwZXIgdGhhbiBzZWFyY2ggZm9yIGFuIGluZGV4IGtleSBhbW9uZyBhbGwg aW5kZXhlcy4KKwkJICogeWV0LiAgVGhlcmVmb3JlLCB3ZSB0cnkgdG8gZGlzdGluZ3Vpc2ggdGhl IHBvdGVudGlhbCBpbmRleCBrZXkgYW5kCisJCSAqIGNvbnN0YW50IGZpcnN0LCB0aGVuIHNlYXJj aCBmb3IgYSBtYXRjaGluZyBpbmRleCBrZXkgYW1vbmcgYWxsCisJCSAqIGluZGV4ZXMuCiAJCSAq LwotCQlpZiAoSXNBKGxlZnRvcCwgQ29uc3QpIHx8IElzQShsZWZ0b3AsIFBhcmFtKSkKKwkJaWYg KGJtc19pc19tZW1iZXIocmVsaWQsIGFyZ3JpbmZvLT5yaWdodF9yZWxpZHMpICYmCisJCQkhYm1z X2lzX21lbWJlcihyZWxpZCwgYXJncmluZm8tPmxlZnRfcmVsaWRzKSAmJgorCQkJIWNvbnRhaW5f dm9sYXRpbGVfZnVuY3Rpb25zKGxlZnRvcCkpCiAJCXsKIAkJCW9wbm8gPSBnZXRfY29tbXV0YXRv cihvcG5vKTsKIApAQCAtMTMzMyw3ICsxMzM3LDkgQEAgZ3JvdXBfc2ltaWxhcl9vcl9hcmdzKFBs YW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsIFJlc3RyaWN0SW5mbyAqcmluZm8pCiAJ CQl9CiAJCQlub25Db25zdEV4cHIgPSByaWdodG9wOwogCQl9Ci0JCWVsc2UgaWYgKElzQShyaWdo dG9wLCBDb25zdCkgfHwgSXNBKHJpZ2h0b3AsIFBhcmFtKSkKKwkJZWxzZSBpZiAoYm1zX2lzX21l bWJlcihyZWxpZCwgYXJncmluZm8tPmxlZnRfcmVsaWRzKSAmJgorCQkJCSAhYm1zX2lzX21lbWJl cihyZWxpZCwgYXJncmluZm8tPnJpZ2h0X3JlbGlkcykgJiYKKwkJCQkgIWNvbnRhaW5fdm9sYXRp bGVfZnVuY3Rpb25zKHJpZ2h0b3ApKQogCQl7CiAJCQlub25Db25zdEV4cHIgPSBsZWZ0b3A7CiAJ CX0KQEAgLTI0MTQsNiArMjQyMCw3IEBAIG1hdGNoX3Jlc3RyaWN0aW9uX2NsYXVzZXNfdG9faW5k ZXgoUGxhbm5lckluZm8gKnJvb3QsCiAgKgkgIElkZW50aWZ5IGpvaW4gY2xhdXNlcyBmb3IgdGhl IHJlbCB0aGF0IG1hdGNoIHRoZSBpbmRleC4KICAqCSAgTWF0Y2hpbmcgY2xhdXNlcyBhcmUgYWRk ZWQgdG8gKmNsYXVzZXNldC4KICAqCSAgQWxzbywgYWRkIGFueSBwb3RlbnRpYWxseSB1c2FibGUg am9pbiBPUiBjbGF1c2VzIHRvICpqb2lub3JjbGF1c2VzLgorICoJICBUaGV5IGFsc28gbWlnaHQg YmUgcHJvY2Vzc2VkIGJ5IG1hdGNoX2NsYXVzZV90b19pbmRleCgpIGFzIGEgd2hvbGUuCiAgKi8K IHN0YXRpYyB2b2lkCiBtYXRjaF9qb2luX2NsYXVzZXNfdG9faW5kZXgoUGxhbm5lckluZm8gKnJv b3QsCkBAIC0yNDMyLDExICsyNDM5LDE1IEBAIG1hdGNoX2pvaW5fY2xhdXNlc190b19pbmRleChQ bGFubmVySW5mbyAqcm9vdCwKIAkJaWYgKCFqb2luX2NsYXVzZV9pc19tb3ZhYmxlX3RvKHJpbmZv LCByZWwpKQogCQkJY29udGludWU7CiAKLQkJLyogUG90ZW50aWFsbHkgdXNhYmxlLCBzbyBzZWUg aWYgaXQgbWF0Y2hlcyB0aGUgaW5kZXggb3IgaXMgYW4gT1IgKi8KKwkJLyoKKwkJICogUG90ZW50 aWFsbHkgdXNhYmxlLCBzbyBzZWUgaWYgaXQgbWF0Y2hlcyB0aGUgaW5kZXggb3IgaXMgYW4gT1Iu IFVzZQorCQkgKiBsaXN0X2FwcGVuZF91bmlxdWVfcHRyKCkgaGVyZSB0byBhdm9pZCBwb3NzaWJs ZSBkdXBsaWNhdGVzIHdoZW4KKwkJICogcHJvY2Vzc2luZyB0aGUgc2FtZSBjbGF1c2VzIHdpdGgg ZGlmZmVyZW50IGluZGV4ZXMuCisJCSAqLwogCQlpZiAocmVzdHJpY3Rpb25faXNfb3JfY2xhdXNl KHJpbmZvKSkKLQkJCSpqb2lub3JjbGF1c2VzID0gbGFwcGVuZCgqam9pbm9yY2xhdXNlcywgcmlu Zm8pOwotCQllbHNlCi0JCQltYXRjaF9jbGF1c2VfdG9faW5kZXgocm9vdCwgcmluZm8sIGluZGV4 LCBjbGF1c2VzZXQpOworCQkJKmpvaW5vcmNsYXVzZXMgPSBsaXN0X2FwcGVuZF91bmlxdWVfcHRy KCpqb2lub3JjbGF1c2VzLCByaW5mbyk7CisKKwkJbWF0Y2hfY2xhdXNlX3RvX2luZGV4KHJvb3Qs IHJpbmZvLCBpbmRleCwgY2xhdXNlc2V0KTsKIAl9CiB9CiAKQEAgLTI1ODUsMTAgKzI1OTYsNyBA QCBtYXRjaF9jbGF1c2VfdG9faW5kZXgoUGxhbm5lckluZm8gKnJvb3QsCiAgKgkgICgzKSAgbXVz dCBtYXRjaCB0aGUgY29sbGF0aW9uIG9mIHRoZSBpbmRleCwgaWYgY29sbGF0aW9uIGlzIHJlbGV2 YW50LgogICoKICAqCSAgT3VyIGRlZmluaXRpb24gb2YgImNvbnN0IiBpcyBleGNlZWRpbmdseSBs aWJlcmFsOiB3ZSBhbGxvdyBhbnl0aGluZyB0aGF0Ci0gKgkgIGRvZXNuJ3QgaW52b2x2ZSBhIHZv bGF0aWxlIGZ1bmN0aW9uIG9yIGEgVmFyIG9mIHRoZSBpbmRleCdzIHJlbGF0aW9uCi0gKgkgIGV4 Y2VwdCBmb3IgYSBib29sZWFuIE9SIGV4cHJlc3Npb24gaW5wdXQ6IGR1ZSB0byBhIHRyYWRlLW9m ZiBiZXR3ZWVuIHRoZQotICoJICBleHBlY3RlZCBleGVjdXRpb24gc3BlZWR1cCBhbmQgcGxhbm5p bmcgY29tcGxleGl0eSwgd2UgbGltaXQgb3ItPnNhb3AKLSAqCSAgdHJhbnNmb3JtYXRpb24gYnkg b2J2aW91cyBjYXNlcyB3aGVuIGFuIGluZGV4IHNjYW4gY2FuIGdldCBhIHByb2ZpdC4KKyAqCSAg ZG9lc24ndCBpbnZvbHZlIGEgdm9sYXRpbGUgZnVuY3Rpb24gb3IgYSBWYXIgb2YgdGhlIGluZGV4 J3MgcmVsYXRpb24uCiAgKgkgIEluIHBhcnRpY3VsYXIsIFZhcnMgYmVsb25naW5nIHRvIG90aGVy IHJlbGF0aW9ucyBvZiB0aGUgcXVlcnkgYXJlCiAgKgkgIGFjY2VwdGVkIGhlcmUsIHNpbmNlIGEg Y2xhdXNlIG9mIHRoYXQgZm9ybSBjYW4gYmUgdXNlZCBpbiBhCiAgKgkgIHBhcmFtZXRlcml6ZWQg aW5kZXhzY2FuLiAgSXQncyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgaGlnaGVyIGNvZGUgbGV2ZWxz CkBAIC0zMjQ3LDcgKzMyNTUsOCBAQCBtYXRjaF9vcmNsYXVzZV90b19pbmRleGNvbChQbGFubmVy SW5mbyAqcm9vdCwKIAlPaWQJCQlhcnJheXR5cGUgPSBJbnZhbGlkT2lkOwogCU9pZAkJCWlucHV0 Y29sbGlkID0gSW52YWxpZE9pZDsKIAlib29sCQlmaXJzdFRpbWUgPSB0cnVlOwotCWJvb2wJCWhh dmVQYXJhbSA9IGZhbHNlOworCWJvb2wJCWhhdmVOb25Db25zdCA9IGZhbHNlOworCUluZGV4CQlp bmRleFJlbGlkID0gaW5kZXgtPnJlbC0+cmVsaWQ7CiAKIAlBc3NlcnQoSXNBKG9yY2xhdXNlLCBC b29sRXhwcikpOwogCUFzc2VydChvcmNsYXVzZS0+Ym9vbG9wID09IE9SX0VYUFIpOwpAQCAtMzI1 OSwxMCArMzI2OCw5IEBAIG1hdGNoX29yY2xhdXNlX3RvX2luZGV4Y29sKFBsYW5uZXJJbmZvICpy b290LAogCS8qCiAJICogVHJ5IHRvIGNvbnZlcnQgYSBsaXN0IG9mIE9SLWNsYXVzZXMgdG8gYSBz aW5nbGUgU0FPUCBleHByZXNzaW9uLiBFYWNoCiAJICogT1IgZW50cnkgbXVzdCBiZSBpbiB0aGUg Zm9ybTogKGluZGV4a2V5IG9wZXJhdG9yIGNvbnN0YW50KSBvciAoY29uc3RhbnQKLQkgKiBvcGVy YXRvciBpbmRleGtleSkuICBPcGVyYXRvcnMgb2YgYWxsIHRoZSBlbnRyaWVzIG11c3QgbWF0Y2gu ICBDb25zdGFudAotCSAqIG1pZ2h0IGJlIGVpdGhlciBDb25zdCBvciBQYXJhbS4gIFRvIGJlIGVm ZmVjdGl2ZSwgZ2l2ZSB1cCBvbiB0aGUgZmlyc3QKLQkgKiBub24tbWF0Y2hpbmcgZW50cnkuICBF eGl0IGlzIGltcGxlbWVudGVkIGFzIGEgYnJlYWsgZnJvbSB0aGUgbG9vcCwKLQkgKiB3aGljaCBp cyBjYXRjaGVkIGFmdGVyd2FyZHMuCisJICogb3BlcmF0b3IgaW5kZXhrZXkpLiAgT3BlcmF0b3Jz IG9mIGFsbCB0aGUgZW50cmllcyBtdXN0IG1hdGNoLiAgVG8gYmUKKwkgKiBlZmZlY3RpdmUsIGdp dmUgdXAgb24gdGhlIGZpcnN0IG5vbi1tYXRjaGluZyBlbnRyeS4gIEV4aXQgaXMKKwkgKiBpbXBs ZW1lbnRlZCBhcyBhIGJyZWFrIGZyb20gdGhlIGxvb3AsIHdoaWNoIGlzIGNhdGNoZWQgYWZ0ZXJ3 YXJkcy4KIAkgKi8KIAlmb3JlYWNoKGxjLCBvcmNsYXVzZS0+YXJncykKIAl7CkBAIC0zMzEzLDE3 ICszMzIxLDIxIEBAIG1hdGNoX29yY2xhdXNlX3RvX2luZGV4Y29sKFBsYW5uZXJJbmZvICpyb290 LAogCiAJCS8qCiAJCSAqIENoZWNrIGZvciBjbGF1c2VzIG9mIHRoZSBmb3JtOiAoaW5kZXhrZXkg b3BlcmF0b3IgY29uc3RhbnQpIG9yCi0JCSAqIChjb25zdGFudCBvcGVyYXRvciBpbmRleGtleSku ICBEZXRlcm1pbmUgaW5kZXhrZXkgc2lkZSBmaXJzdCwgY2hlY2sKLQkJICogdGhlIGNvbnN0YW50 IGxhdGVyLgorCQkgKiAoY29uc3RhbnQgb3BlcmF0b3IgaW5kZXhrZXkpLiAgU2VlIG1hdGNoX2Ns YXVzZV90b19pbmRleGNvbCdzIG5vdGVzCisJCSAqIGFib3V0IGNvbnN0LW5lc3MuCiAJCSAqLwog CQlsZWZ0b3AgPSAoTm9kZSAqKSBsaW5pdGlhbChzdWJDbGF1c2UtPmFyZ3MpOwogCQlyaWdodG9w ID0gKE5vZGUgKikgbHNlY29uZChzdWJDbGF1c2UtPmFyZ3MpOwotCQlpZiAobWF0Y2hfaW5kZXhf dG9fb3BlcmFuZChsZWZ0b3AsIGluZGV4Y29sLCBpbmRleCkpCisJCWlmIChtYXRjaF9pbmRleF90 b19vcGVyYW5kKGxlZnRvcCwgaW5kZXhjb2wsIGluZGV4KSAmJgorCQkJIWJtc19pc19tZW1iZXIo aW5kZXhSZWxpZCwgc3ViUmluZm8tPnJpZ2h0X3JlbGlkcykgJiYKKwkJCSFjb250YWluX3ZvbGF0 aWxlX2Z1bmN0aW9ucyhyaWdodG9wKSkKIAkJewogCQkJaW5kZXhFeHByID0gbGVmdG9wOwogCQkJ Y29uc3RFeHByID0gcmlnaHRvcDsKIAkJfQotCQllbHNlIGlmIChtYXRjaF9pbmRleF90b19vcGVy YW5kKHJpZ2h0b3AsIGluZGV4Y29sLCBpbmRleCkpCisJCWVsc2UgaWYgKG1hdGNoX2luZGV4X3Rv X29wZXJhbmQocmlnaHRvcCwgaW5kZXhjb2wsIGluZGV4KSAmJgorCQkJCSAhYm1zX2lzX21lbWJl cihpbmRleFJlbGlkLCBzdWJSaW5mby0+bGVmdF9yZWxpZHMpICYmCisJCQkJICFjb250YWluX3Zv bGF0aWxlX2Z1bmN0aW9ucyhsZWZ0b3ApKQogCQl7CiAJCQlvcG5vID0gZ2V0X2NvbW11dGF0b3Io b3Bubyk7CiAJCQlpZiAoIU9pZElzVmFsaWQob3BubykpCkBAIC0zMzUwLDEwICszMzYyLDYgQEAg bWF0Y2hfb3JjbGF1c2VfdG9faW5kZXhjb2woUGxhbm5lckluZm8gKnJvb3QsCiAJCWlmIChJc0Eo aW5kZXhFeHByLCBSZWxhYmVsVHlwZSkpCiAJCQlpbmRleEV4cHIgPSAoTm9kZSAqKSAoKFJlbGFi ZWxUeXBlICopIGluZGV4RXhwciktPmFyZzsKIAotCQkvKiBXZSBhbGxvdyBjb25zdGFudCB0byBi ZSBDb25zdCBvciBQYXJhbSAqLwotCQlpZiAoIUlzQShjb25zdEV4cHIsIENvbnN0KSAmJiAhSXNB KGNvbnN0RXhwciwgUGFyYW0pKQotCQkJYnJlYWs7Ci0KIAkJLyogRm9yYmlkIHRyYW5zZm9ybWF0 aW9uIGZvciBjb21wb3NpdGUgdHlwZXMsIHJlY29yZHMuICovCiAJCWlmICh0eXBlX2lzX3Jvd3R5 cGUoZXhwclR5cGUoY29uc3RFeHByKSkgfHwKIAkJCXR5cGVfaXNfcm93dHlwZShleHByVHlwZShp bmRleEV4cHIpKSkKQEAgLTMzOTAsOCArMzM5OCwxMiBAQCBtYXRjaF9vcmNsYXVzZV90b19pbmRl eGNvbChQbGFubmVySW5mbyAqcm9vdCwKIAkJCQlicmVhazsKIAkJfQogCi0JCWlmIChJc0EoY29u c3RFeHByLCBQYXJhbSkpCi0JCQloYXZlUGFyYW0gPSB0cnVlOworCQkvKgorCQkgKiBDaGVjayBp ZiBvdXIgbGlzdCBvZiBjb25zdGFudHMgaW4gbWF0Y2hfY2xhdXNlX3RvX2luZGV4Y29sJ3MKKwkJ ICogdW5kZXJzdGFuZGluZyBvZiBjb25zdC1uZXNzIGhhdmUgc29tZXRoaW5nIG90aGVyIHRoYW4g Q29uc3QuCisJCSAqLworCQlpZiAoIUlzQShjb25zdEV4cHIsIENvbnN0KSkKKwkJCWhhdmVOb25D b25zdCA9IHRydWU7CiAJCWNvbnN0cyA9IGxhcHBlbmQoY29uc3RzLCBjb25zdEV4cHIpOwogCX0K IApAQCAtMzQwOCwxMCArMzQyMCwxMCBAQCBtYXRjaF9vcmNsYXVzZV90b19pbmRleGNvbChQbGFu bmVySW5mbyAqcm9vdCwKIAogCS8qCiAJICogQXNzZW1ibGUgYW4gYXJyYXkgZnJvbSB0aGUgbGlz dCBvZiBjb25zdGFudHMuICBJdCBzZWVtcyBtb3JlIHByb2ZpdGFibGUKLQkgKiB0byBidWlsZCBh IGNvbnN0IGFycmF5LiAgQnV0IGluIHRoZSBwcmVzZW5jZSBvZiBwYXJhbWV0ZXJzLCB3ZSBkb24n dAorCSAqIHRvIGJ1aWxkIGEgY29uc3QgYXJyYXkuICBCdXQgaW4gdGhlIHByZXNlbmNlIG9mIG90 aGVyIG5vZGVzLCB3ZSBkb24ndAogCSAqIGhhdmUgYSBzcGVjaWZpYyB2YWx1ZSBoZXJlIGFuZCBt dXN0IGVtcGxveSBhbiBBcnJheUV4cHIgaW5zdGVhZC4KIAkgKi8KLQlpZiAoaGF2ZVBhcmFtKQor CWlmIChoYXZlTm9uQ29uc3QpCiAJewogCQlBcnJheUV4cHIgICphcnJheUV4cHIgPSBtYWtlTm9k ZShBcnJheUV4cHIpOwogCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2Ny ZWF0ZV9pbmRleC5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5v dXQKaW5kZXggODAxMWMxNDFiZjguLmJkNWYwMDJjZjIwIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9jcmVhdGVfaW5kZXgub3V0CkBAIC0yMDA2LDYgKzIwMDYsMjcgQEAgU0VMRUNUICog RlJPTSB0ZW5rMQogICAgRmlsdGVyOiAoKCh0ZW50aG91cyk6Om51bWVyaWMgPSAnMSc6Om51bWVy aWMpIE9SICh0ZW50aG91cyA9IDMpIE9SICgodGVudGhvdXMpOjpudW1lcmljID0gJzQyJzo6bnVt ZXJpYykpCiAoMiByb3dzKQogCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgY291bnQoKikg RlJPTSB0ZW5rMSB0MQorICBXSEVSRSB0MS50aG91c2FuZCA9IDQyIE9SIHQxLnRob3VzYW5kID0g KFNFTEVDVCB0Mi50ZW50aG91cyBGUk9NIHRlbmsxIHQyIFdIRVJFIHQyLnRob3VzYW5kID0gdDEu dGVudGhvdXMgKyAxIExJTUlUIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyB0ZW5rMV90 aG91c190ZW50aG91cyBvbiB0ZW5rMSB0MQorICAgICAgICAgRmlsdGVyOiAoKHRob3VzYW5kID0g NDIpIE9SICh0aG91c2FuZCA9IChTdWJQbGFuIDEpKSkKKyAgICAgICAgIFN1YlBsYW4gMQorICAg ICAgICAgICAtPiAgTGltaXQKKyAgICAgICAgICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1 c2luZyB0ZW5rMV90aG91c190ZW50aG91cyBvbiB0ZW5rMSB0MgorICAgICAgICAgICAgICAgICAg ICAgICBJbmRleCBDb25kOiAodGhvdXNhbmQgPSAodDEudGVudGhvdXMgKyAxKSkKKyg3IHJvd3Mp CisKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHRlbmsxIHQxCisgIFdIRVJFIHQxLnRob3VzYW5kID0g NDIgT1IgdDEudGhvdXNhbmQgPSAoU0VMRUNUIHQyLnRlbnRob3VzIEZST00gdGVuazEgdDIgV0hF UkUgdDIudGhvdXNhbmQgPSB0MS50ZW50aG91cyArIDEgTElNSVQgMSk7CisgY291bnQgCistLS0t LS0tCisgICAgMTAKKygxIHJvdykKKwogRVhQTEFJTiAoQ09TVFMgT0ZGKQogU0VMRUNUIGNvdW50 KCopIEZST00gdGVuazEKICAgV0hFUkUgaHVuZHJlZCA9IDQyIEFORCAodGhvdXNhbmQgPSA0MiBP UiB0aG91c2FuZCA9IDk5KTsKQEAgLTMyNTUsNiArMzI3NiwxNyBAQCBDUkVBVEUgSU5ERVggdF9i X2NfaWR4IE9OIGJpdG1hcF9zcGxpdF9vciAoYiwgYyk7CiBDUkVBVEUgU1RBVElTVElDUyB0X2Ff Yl9zdGF0IChtY3YpIE9OIGEsIGIgRlJPTSBiaXRtYXBfc3BsaXRfb3I7CiBDUkVBVEUgU1RBVElT VElDUyB0X2JfY19zdGF0IChtY3YpIE9OIGIsIGMgRlJPTSBiaXRtYXBfc3BsaXRfb3I7CiBBTkFM WVpFIGJpdG1hcF9zcGxpdF9vcjsKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00g Yml0bWFwX3NwbGl0X29yIHQxLCBiaXRtYXBfc3BsaXRfb3IgdDIKK1dIRVJFIHQxLmEgPSB0Mi5i IE9SIHQxLmEgPSAyOworICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIC0+ICBTZXEgU2NhbiBvbiBiaXRtYXBf c3BsaXRfb3IgdDIKKyAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIHRfYV9iX2lkeCBvbiBiaXRtYXBf c3BsaXRfb3IgdDEKKyAgICAgICAgIEluZGV4IENvbmQ6IChhID0gQU5ZIChBUlJBWVt0Mi5iLCAy XSkpCisoNCByb3dzKQorCiBFWFBMQUlOIChDT1NUUyBPRkYpCiBTRUxFQ1QgKiBGUk9NIGJpdG1h cF9zcGxpdF9vciBXSEVSRSBhID0gMSBBTkQgKGIgPSAxIE9SIGIgPSAyKSBBTkQgYyA9IDI7CiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQg Yi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CmluZGV4IDA3OWZjZjQ2ZjBkLi4z ZmZjMDY2YjFmOCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91 dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CkBAIC0zODQ5LDE0ICsz ODQ5LDExIEBAIHdoZXJlIHExID0gdGhvdXNhbmQgb3IgcTIgPSB0aG91c2FuZDsKICAgICAgICAg ICAgICAgIC0+ICBTZXEgU2NhbiBvbiBxMgogICAgICAgICAgLT4gIEJpdG1hcCBIZWFwIFNjYW4g b24gdGVuazEKICAgICAgICAgICAgICAgIFJlY2hlY2sgQ29uZDogKChxMS5xMSA9IHRob3VzYW5k KSBPUiAocTIucTIgPSB0aG91c2FuZCkpCi0gICAgICAgICAgICAgICAtPiAgQml0bWFwT3IKLSAg ICAgICAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV90aG91c190 ZW50aG91cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKHRob3VzYW5k ID0gcTEucTEpCi0gICAgICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24g dGVuazFfdGhvdXNfdGVudGhvdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENv bmQ6ICh0aG91c2FuZCA9IHEyLnEyKQorICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBT Y2FuIG9uIHRlbmsxX3Rob3VzX3RlbnRob3VzCisgICAgICAgICAgICAgICAgICAgICBJbmRleCBD b25kOiAodGhvdXNhbmQgPSBBTlkgKEFSUkFZW3ExLnExLCBxMi5xMl0pKQogICAgLT4gIEhhc2gK ICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBpbnQ0X3RibAotKDE1IHJvd3MpCisoMTIgcm93cykK IAogZXhwbGFpbiAoY29zdHMgb2ZmKQogc2VsZWN0ICogZnJvbQpAQCAtODIzOSwzICs4MjM2LDQ1 IEBAIEdST1VQIEJZIHMuYzEsIHMuYzI7CiAoNyByb3dzKQogCiBEUk9QIFRBQkxFIGdyb3VwX3Ri bDsKKy0tCistLSBUZXN0IGZvciBhIG5lc3RlZCBsb29wIGpvaW4gaW52b2x2aW5nIGluZGV4IHNj YW4sIHRyYW5zZm9ybWluZyBPUi1jbGF1c2VzCistLSB0byBTQU9QLgorLS0KK0VYUExBSU4gKENP U1RTIE9GRikKK1NFTEVDVCBDT1VOVCgqKSBGUk9NIHRlbmsxIHQxLCB0ZW5rMSB0MgorV0hFUkUg dDIudGhvdXNhbmQgPSB0MS50ZW50aG91cyBPUiB0Mi50aG91c2FuZCA9IHQxLnVuaXF1ZTEgT1Ig dDIudGhvdXNhbmQgPSB0MS51bmlxdWUyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWdncmVnYXRlCisgICAtPiAg TmVzdGVkIExvb3AKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0ZW5rMSB0MQorICAgICAgICAg LT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyB0ZW5rMV90aG91c190ZW50aG91cyBvbiB0ZW5rMSB0 MgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKHRob3VzYW5kID0gQU5ZIChBUlJBWVt0MS50 ZW50aG91cywgdDEudW5pcXVlMSwgdDEudW5pcXVlMl0pKQorKDUgcm93cykKKworU0VMRUNUIENP VU5UKCopIEZST00gdGVuazEgdDEsIHRlbmsxIHQyCitXSEVSRSB0Mi50aG91c2FuZCA9IHQxLnRl bnRob3VzIE9SIHQyLnRob3VzYW5kID0gdDEudW5pcXVlMSBPUiB0Mi50aG91c2FuZCA9IHQxLnVu aXF1ZTI7CisgY291bnQgCistLS0tLS0tCisgMjAwMDAKKygxIHJvdykKKworRVhQTEFJTiAoQ09T VFMgT0ZGKQorU0VMRUNUIENPVU5UKCopIEZST00gb25layB0MSBMRUZUIEpPSU4gdGVuazEgdDIK KyAgICBPTiAodDIudGhvdXNhbmQgPSB0MS50ZW50aG91cyBPUiB0Mi50aG91c2FuZCA9IHQxLnRo b3VzYW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg QWdncmVnYXRlCisgICAtPiAgTmVzdGVkIExvb3AgTGVmdCBKb2luCisgICAgICAgICAtPiAgU2Vx IFNjYW4gb24gb25layB0MQorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyB0ZW5r MV90aG91c190ZW50aG91cyBvbiB0ZW5rMSB0MgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDog KHRob3VzYW5kID0gQU5ZIChBUlJBWVt0MS50ZW50aG91cywgdDEudGhvdXNhbmRdKSkKKyg1IHJv d3MpCisKK1NFTEVDVCBDT1VOVCgqKSBGUk9NIG9uZWsgdDEgTEVGVCBKT0lOIHRlbmsxIHQyCisg ICAgT04gKHQyLnRob3VzYW5kID0gdDEudGVudGhvdXMgT1IgdDIudGhvdXNhbmQgPSB0MS50aG91 c2FuZCk7CisgY291bnQgCistLS0tLS0tCisgMTkwMDAKKygxIHJvdykKKwpkaWZmIC0tZ2l0IGEv c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wYXJ0aXRpb25fam9pbi5vdXQgYi9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL3BhcnRpdGlvbl9qb2luLm91dAppbmRleCAxMDhmOWVjYjQ0NS4uYWY0 Njg2ODJhMmQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcGFydGl0aW9u X2pvaW4ub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcGFydGl0aW9uX2pvaW4u b3V0CkBAIC0yNTMzLDI0ICsyNTMzLDI0IEBAIHdoZXJlIG5vdCBleGlzdHMgKHNlbGVjdCAxIGZy b20gcHJ0eDIKICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBwcnR4MV8xCiAgICAgICAgICAgICAg ICBGaWx0ZXI6ICgoYSA8IDIwKSBBTkQgKGMgPSA5MSkpCiAgICAgICAgICAtPiAgQml0bWFwIEhl YXAgU2NhbiBvbiBwcnR4Ml8xCi0gICAgICAgICAgICAgICBSZWNoZWNrIENvbmQ6ICgoYiA9IChw cnR4MV8xLmIgKyAxKSkgT1IgKGMgPSA5OSkpCisgICAgICAgICAgICAgICBSZWNoZWNrIENvbmQ6 ICgoYyA9IDk5KSBPUiAoYiA9IChwcnR4MV8xLmIgKyAxKSkpCiAgICAgICAgICAgICAgICBGaWx0 ZXI6IChhID0gcHJ0eDFfMS5hKQogICAgICAgICAgICAgICAgLT4gIEJpdG1hcE9yCi0gICAgICAg ICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gcHJ0eDJfMV9iX2lkeAotICAg ICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGIgPSAocHJ0eDFfMS5iICsgMSkp CiAgICAgICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gcHJ0eDJfMV9j X2lkeAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGMgPSA5OSkKKyAg ICAgICAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiBwcnR4Ml8xX2JfaWR4 CisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoYiA9IChwcnR4MV8xLmIg KyAxKSkKICAgIC0+ICBOZXN0ZWQgTG9vcCBBbnRpIEpvaW4KICAgICAgICAgIC0+ICBTZXEgU2Nh biBvbiBwcnR4MV8yCiAgICAgICAgICAgICAgICBGaWx0ZXI6ICgoYSA8IDIwKSBBTkQgKGMgPSA5 MSkpCiAgICAgICAgICAtPiAgQml0bWFwIEhlYXAgU2NhbiBvbiBwcnR4Ml8yCi0gICAgICAgICAg ICAgICBSZWNoZWNrIENvbmQ6ICgoYiA9IChwcnR4MV8yLmIgKyAxKSkgT1IgKGMgPSA5OSkpCisg ICAgICAgICAgICAgICBSZWNoZWNrIENvbmQ6ICgoYyA9IDk5KSBPUiAoYiA9IChwcnR4MV8yLmIg KyAxKSkpCiAgICAgICAgICAgICAgICBGaWx0ZXI6IChhID0gcHJ0eDFfMi5hKQogICAgICAgICAg ICAgICAgLT4gIEJpdG1hcE9yCi0gICAgICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4 IFNjYW4gb24gcHJ0eDJfMl9iX2lkeAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgg Q29uZDogKGIgPSAocHJ0eDFfMi5iICsgMSkpCiAgICAgICAgICAgICAgICAgICAgICAtPiAgQml0 bWFwIEluZGV4IFNjYW4gb24gcHJ0eDJfMl9jX2lkeAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgSW5kZXggQ29uZDogKGMgPSA5OSkKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBCaXRtYXAg SW5kZXggU2NhbiBvbiBwcnR4Ml8yX2JfaWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICBJ bmRleCBDb25kOiAoYiA9IChwcnR4MV8yLmIgKyAxKSkKICgyMyByb3dzKQogCiBzZWxlY3QgKiBm cm9tIHBydHgxCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jcmVhdGVfaW5kZXgu c3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY3JlYXRlX2luZGV4LnNxbAppbmRleCAwNjhjNjZi OTVhNS4uYmU1NzBkYTA4YTAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0 ZV9pbmRleC5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY3JlYXRlX2luZGV4LnNxbApA QCAtNzgxLDYgKzc4MSwxMiBAQCBFWFBMQUlOIChDT1NUUyBPRkYpCiBTRUxFQ1QgKiBGUk9NIHRl bmsxCiAgIFdIRVJFIHRlbnRob3VzID0gMTo6bnVtZXJpYyBPUiB0ZW50aG91cyA9IDM6OmludDQg T1IgdGVudGhvdXMgPSA0Mjo6bnVtZXJpYzsKIAorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNU IGNvdW50KCopIEZST00gdGVuazEgdDEKKyAgV0hFUkUgdDEudGhvdXNhbmQgPSA0MiBPUiB0MS50 aG91c2FuZCA9IChTRUxFQ1QgdDIudGVudGhvdXMgRlJPTSB0ZW5rMSB0MiBXSEVSRSB0Mi50aG91 c2FuZCA9IHQxLnRlbnRob3VzICsgMSBMSU1JVCAxKTsKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHRl bmsxIHQxCisgIFdIRVJFIHQxLnRob3VzYW5kID0gNDIgT1IgdDEudGhvdXNhbmQgPSAoU0VMRUNU IHQyLnRlbnRob3VzIEZST00gdGVuazEgdDIgV0hFUkUgdDIudGhvdXNhbmQgPSB0MS50ZW50aG91 cyArIDEgTElNSVQgMSk7CisKIEVYUExBSU4gKENPU1RTIE9GRikKIFNFTEVDVCBjb3VudCgqKSBG Uk9NIHRlbmsxCiAgIFdIRVJFIGh1bmRyZWQgPSA0MiBBTkQgKHRob3VzYW5kID0gNDIgT1IgdGhv dXNhbmQgPSA5OSk7CkBAIC0xMzY3LDYgKzEzNzMsOSBAQCBDUkVBVEUgU1RBVElTVElDUyB0X2Ff Yl9zdGF0IChtY3YpIE9OIGEsIGIgRlJPTSBiaXRtYXBfc3BsaXRfb3I7CiBDUkVBVEUgU1RBVElT VElDUyB0X2JfY19zdGF0IChtY3YpIE9OIGIsIGMgRlJPTSBiaXRtYXBfc3BsaXRfb3I7CiBBTkFM WVpFIGJpdG1hcF9zcGxpdF9vcjsKIEVYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00g Yml0bWFwX3NwbGl0X29yIHQxLCBiaXRtYXBfc3BsaXRfb3IgdDIKK1dIRVJFIHQxLmEgPSB0Mi5i IE9SIHQxLmEgPSAyOworRVhQTEFJTiAoQ09TVFMgT0ZGKQogU0VMRUNUICogRlJPTSBiaXRtYXBf c3BsaXRfb3IgV0hFUkUgYSA9IDEgQU5EIChiID0gMSBPUiBiID0gMikgQU5EIGMgPSAyOwogRFJP UCBUQUJMRSBiaXRtYXBfc3BsaXRfb3I7CiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL2pvaW4uc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwKaW5kZXggNzc5ZDU2 Y2IzMGYuLmM3MzQ5ZWFiOTMzIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2lu LnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbApAQCAtMzAxNiw3ICszMDE2 LDYgQEAgU0VMRUNUIHQxLmEgRlJPTSBza2lwX2ZldGNoIHQxIExFRlQgSk9JTiBza2lwX2ZldGNo IHQyIE9OIHQyLmEgPSAxIFdIRVJFIHQyLmEgSVMKIAogUkVTRVQgZW5hYmxlX2luZGV4b25seXNj YW47CiBSRVNFVCBlbmFibGVfc2Vxc2NhbjsKLQogLS0gVGVzdCBCaXRtYXBIZWFwU2NhbiB3aXRo IGEgcmVzY2FuIHJlbGVhc2VzIHJlc291cmNlcyBjb3JyZWN0bHkKIFNFVCBlbmFibGVfc2Vxc2Nh biA9IG9mZjsKIFNFVCBlbmFibGVfaW5kZXhzY2FuID0gb2ZmOwpAQCAtMzA0NiwzICszMDQ1LDIw IEBAIFNFTEVDVCAxIEZST00gZ3JvdXBfdGJsIHQxCiBHUk9VUCBCWSBzLmMxLCBzLmMyOwogCiBE Uk9QIFRBQkxFIGdyb3VwX3RibDsKKworLS0KKy0tIFRlc3QgZm9yIGEgbmVzdGVkIGxvb3Agam9p biBpbnZvbHZpbmcgaW5kZXggc2NhbiwgdHJhbnNmb3JtaW5nIE9SLWNsYXVzZXMKKy0tIHRvIFNB T1AuCistLQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgQ09VTlQoKikgRlJPTSB0ZW5r MSB0MSwgdGVuazEgdDIKK1dIRVJFIHQyLnRob3VzYW5kID0gdDEudGVudGhvdXMgT1IgdDIudGhv dXNhbmQgPSB0MS51bmlxdWUxIE9SIHQyLnRob3VzYW5kID0gdDEudW5pcXVlMjsKK1NFTEVDVCBD T1VOVCgqKSBGUk9NIHRlbmsxIHQxLCB0ZW5rMSB0MgorV0hFUkUgdDIudGhvdXNhbmQgPSB0MS50 ZW50aG91cyBPUiB0Mi50aG91c2FuZCA9IHQxLnVuaXF1ZTEgT1IgdDIudGhvdXNhbmQgPSB0MS51 bmlxdWUyOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgQ09VTlQoKikgRlJPTSBvbmVr IHQxIExFRlQgSk9JTiB0ZW5rMSB0MgorICAgIE9OICh0Mi50aG91c2FuZCA9IHQxLnRlbnRob3Vz IE9SIHQyLnRob3VzYW5kID0gdDEudGhvdXNhbmQpOworU0VMRUNUIENPVU5UKCopIEZST00gb25l ayB0MSBMRUZUIEpPSU4gdGVuazEgdDIKKyAgICBPTiAodDIudGhvdXNhbmQgPSB0MS50ZW50aG91 cyBPUiB0Mi50aG91c2FuZCA9IHQxLnRob3VzYW5kKTsKLS0gCjIuMzkuNSAoQXBwbGUgR2l0LTE1 NCkKCg== --000000000000e141fb062d3b3e7c--