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.96) (envelope-from ) id 1vwEUE-00BI4r-1k for pgsql-hackers@arkaria.postgresql.org; Sat, 28 Feb 2026 07:11:38 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vwEUD-00AKUf-1a for pgsql-hackers@arkaria.postgresql.org; Sat, 28 Feb 2026 07:11:37 +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.96) (envelope-from ) id 1vwEUC-00AKUX-2c for pgsql-hackers@lists.postgresql.org; Sat, 28 Feb 2026 07:11:37 +0000 Received: from mail-yx1-xb136.google.com ([2607:f8b0:4864:20::b136]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vwEU7-00000001dmx-3uD8 for pgsql-hackers@lists.postgresql.org; Sat, 28 Feb 2026 07:11:35 +0000 Received: by mail-yx1-xb136.google.com with SMTP id 956f58d0204a3-64c9c8f8783so3022337d50.1 for ; Fri, 27 Feb 2026 23:11:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1772262691; cv=none; d=google.com; s=arc-20240605; b=KpZPMT2D36OLXVnJdbraPxnjzMJVOYzIXg9PIFdHK/xHkPycELLzvW/s6M/9ZWe9cr 9JlSg5jHNE/8BaJxJKhJ5vryiEJycHHmMdu5cK2zlae5mrl62Jj0expQZJzuvSJKtEPe e56/i2dejAgPzrqOPV5ONEjzR0tA7df0DAlEQR5NV74pbXWO1896/D0lZgs1NVS+OaMW xoFfzftHAy6qy16yojl5MMEadvF1tu17HwHMk17Hm8kzuq67nrQVYkB31r9qYMjavPT7 sjRzaDPaZ/7RSKyaVlo94tGxgN6M6MclCwg1ZpxR1bhdBSawPATPr55p4x+xGC4hw9Eq 2Tdg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=gUxbTP2ecfEBgApBXkXUAMfz3GnT1PsOnxAe4PlF168=; fh=dxJXJbLzq9Nah1LUdsj4QTuQ3JoDScd0wp1YHY64NXM=; b=iSieQQk98BrImdtWoET0kZyEewB8N8rhzCSd7eTEEhULa2wVbQzK/CSSA8oABxL5MQ tJ44TECXgJ4NXDtQXvSPLuaYfJ2/1FfsCU5BgvdS7t6z+mTZeJBAj2xJU2frCYljTDub auVHdecFR4Tz3Fq6el3BXWCXZJQy3mXfTK7lO3xAzBVv6xoHneZZkNrlNTCBgf6gFg6+ S26KxwnCRqQPo353vEzHaVFrBoVaW5RAjDvAsI7aFwNFACf8X0eSq03EhEfLoIpyzFT1 xzeYyEcATK0hgZ6DsQrjt6YRY8n/1tsiJ3bCLsTQwLI1zK9MF08Dr/5jgv66f+garT2O mTOA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772262691; x=1772867491; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=gUxbTP2ecfEBgApBXkXUAMfz3GnT1PsOnxAe4PlF168=; b=UabrbjH96MD0ySY3vm2bf8y/YHOw8VTjCXQmijkBhf99/jtqytFdR/Av9RAvQqiLR1 k/B6mSv3JZnSsgX/UJcH2Wwe8ZC5lNHaFBRyP3Fb8lJAWrXMMHXUZNg4OEUOcfcrPD2b KTZx2+YufONuN707Pb8hDNO4bRAsnwYGV4xDjmGGy00xoQoUEFcbbd30XP2TtAyCoMBk rRVGGPvDmltfEKx94C2Po0EmU6eOvlGCZWE2zdlsp6bBxMUv3WmoFwxvFk2nwXrI1U9B LHH0T37ANPksp4TwZS1fVvDQjPp/fHfZE+dpnm5M6HIrIlfWJkUE/Fd2a/L4paeUxRVy C8Iw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772262691; x=1772867491; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=gUxbTP2ecfEBgApBXkXUAMfz3GnT1PsOnxAe4PlF168=; b=XhWHka/Qftgpl/efL3Nji+ZTY8h1ItU8RtT/uIKGtNC1kwqir4NnDrcgRQ8JQwf79H 6KzNjLeZ6fQ3Utg6p610UntXI3GlF1lQRd2UlyRhZhNgZxXLVlZmfk0fC6ZjHU0eVrRT J2uZv5ppfpgryxtUq9zkOD/FAioR/tioKCoLyyXFIwMWoxEh1dIyyrjDVany5AygBuIK ytsmZUupGkS9MAxHoWMY7DrCebF/NU8GodxMl8c8OxsF+yn+YcUa2svAkDoyF3G2CAIc JaiWfkGzzt/kFm3vlLf6pHWUZMLX8/a1K1q5pKWWgc2nGESlKe+B9fQflvnZL6OAi3OI lLVw== X-Gm-Message-State: AOJu0YwokaJDeXpKaEs/7oeDXmYINFdtS6iYOdyhzmFQksU6q2tQHeFG LRfCpTx1RUdBPa9MyvajLGOul4djo7NlXJo0G8av6jVhcXiR6bszT6/WDpKwfTnu7hLYW3IDaRJ DjmS13SLpWYlKNzP7ob9CrbHSSHUEnkxQqOHU X-Gm-Gg: ATEYQzwnJvL0Gvky5ZhfVOE1kWfVHtUP5LOg8kiUL7uzckqnKdF2CEVpSQcvXSEfO8J RVl9USkClfxRCHhW3hCm0AgF4jMhw0vJbP3UkRWxHa7ZAY5gG3EZX3Pi9EXnhAgC9bST16FwLEu NOsYFUKB7NU6lHrsVyImjjo85juLJ/soMbaC2cns3LYQFYHERjJFhrJjmnjd66PiWbh8O3XgMKl 4ZXdstlij33P4NnLNgvCUph9EnLN8EI/b6k2KJRY7Gu+EzxDnRlDpA1VGEWcXUVZ7yCftBLFYkY DboPT5mo+KAE/Kidi3OkBh6sFjAMsxEOrYf1gtliLisbHI8ByjOcx5XEcLFbO0x1IDnKH9x9l2c KSxEVBnd0L/XJqU1r71Q2r0UrLJiSkJTnBfDpGa8e0XQpvOfDx0YdHexcFQ== X-Received: by 2002:a53:c055:0:20b0:649:61b6:8a97 with SMTP id 956f58d0204a3-64cb6f6f3demr5191550d50.42.1772262691176; Fri, 27 Feb 2026 23:11:31 -0800 (PST) MIME-Version: 1.0 From: Pavel Stehule Date: Sat, 28 Feb 2026 08:10:53 +0100 X-Gm-Features: AaiRm50ljFj_sKPalkTR8OeEzw12Yk1MPta7_GTQX6to6U8IJ-DTrXr4GAoUmEI Message-ID: Subject: POC: PLpgSQL FOREACH IN JSON ARRAY To: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="00000000000028821c064bdd1098" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000028821c064bdd1098 Content-Type: multipart/alternative; boundary="00000000000028821b064bdd1096" --00000000000028821b064bdd1096 Content-Type: text/plain; charset="UTF-8" Hi I wrote PoC for previously proposed plpgsql statement FOREACH IN JSON ARRAY It looks like: do $$ declare x int; begin foreach x in json array '[1,2,3,4]' loop raise notice 'x: %', x; end loop; end; $$ do $$ declare x int; y int; begin foreach x, y in json array '[{"x": 100, "y": 1000}, {"y": 1000, "x": 100}]' loop raise notice 'x: %, y: %', x, y; end loop; end $$ My first motivation for this patch is performance. This is faster (3 - 4 x) than using FOR IN SELECT FROM json_array_elements, because there is no overhead of SQL executor. Second motivation is a little bit better readability, because inside plpgsql' statements we have info about used variables and we can use it. The behavior is very similar to FOREACH IN ARRAY with one significant difference - the values of JSON objects are assigned to the composite variable or lists of variables by names (not by position). It made this decision because jsonb doesn't preserve the position of the field in object, and then assignment based on position cannot work. The code is relatively short now - about 400 lines +/- and the code is simple without risks. There are some open questions - mainly if default mode for mapping json fields to plpgsql variables should be in lax or strict mode. Now, it is something between (cast errors are raised) - it is consistent with jsonb_populate_record - but it should not be the final design. I cannot say what is better - currently implemented behavior is consistent with common plpgsql behaviour, but SQL/JSON is different. I can imagine that default behaviour will be lax, and with some optional clauses we can push behave to strict mode. I have no strong opinion about it. Maybe I prefer the current "strict" behaviour a little bit, because it is more "safe", but it is only my personal opinion. But again, I have no strong opinion about this question and I very much invite any discussion about it. This is proof of concept patch - casting between plpgsql arrays and json arrays is not supported, documentation and regress tests are minimalistic, but it is good enough for testing and good enough for decision, if this feature is wanted or not (or if it needs some modifications). This is a new feature (and proprietary feature). There should not be any compatibility issues. What do you think about this feature? Regards Pavel --00000000000028821b064bdd1096 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi

I wrote PoC for previousl= y proposed plpgsql statement FOREACH IN JSON ARRAY

It looks like:

do $$
declare x = int;
begin
=C2=A0 foreach x in json arra= y '[1,2,3,4]'=C2=A0
=C2=A0 loop
= =C2=A0 =C2=A0 raise notice 'x: %', x;
=C2=A0 end loop;
end;
$$

do $$
= declare x int; y int;
begin
=C2=A0 foreach x, y in json array '[{"x= ": 100, "y": 1000}, {"y": 1000, "x": 100= }]'
=C2=A0 loop<= /span>
=C2=A0 =C2=A0 raise = notice 'x: %, y: %', x, y;
=C2=A0 end loop;
end
$$

My first motivation for this patch is perfor= mance. This is faster (3 - 4 x) than using FOR IN SELECT FROM json_array_el= ements, because there is no overhead of SQL executor. Second motivation is = a little bit better readability, because inside plpgsql' statements we = have info about used variables and we can use it.

= The behavior is very similar to FOREACH IN ARRAY with one significant diffe= rence - the values of JSON objects are assigned to the composite variable o= r lists of variables by names (not by position). It made this decision beca= use jsonb doesn't preserve the position of the field in object, and the= n assignment based on position cannot work.

The co= de is relatively short now - about 400 lines=C2=A0+/- and the code is simpl= e without risks.

There are some open questions - m= ainly if default mode for mapping json fields to plpgsql variables should b= e in lax or strict mode. Now, it is something between (cast errors are rais= ed) - it is consistent with=C2=A0jsonb_populate_record - but it should not = be the final design. I cannot say what is better - currently implemented be= havior is consistent with common plpgsql behaviour, but SQL/JSON is differe= nt. I can imagine that default behaviour will be lax, and with some optiona= l clauses we can push behave to strict mode. I have no strong opinion about= it. Maybe I prefer the current "strict" behaviour a little=C2=A0= bit, because it is more "safe", but it is only my personal opinio= n. But again, I have no strong opinion about this question and I very much = invite any discussion about it.

This is proof of c= oncept patch - casting between plpgsql arrays and json arrays is not suppor= ted, documentation and regress tests are minimalistic, but it is good enoug= h for testing and good enough for decision, if this feature is wanted or no= t (or if it needs some modifications).

This is a n= ew feature (and proprietary feature). There should not be any compatibility= issues.=C2=A0

What do you think about this featur= e?=C2=A0

Regards

Pavel

--00000000000028821b064bdd1096-- --00000000000028821c064bdd1098 Content-Type: text/x-patch; charset="US-ASCII"; name="v20260228-1-0001-FOREACH-scalar-IN-JSON-ARRAY.patch" Content-Disposition: attachment; filename="v20260228-1-0001-FOREACH-scalar-IN-JSON-ARRAY.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mm5zb8gd0 RnJvbSBjOWYwNDFlNTQwODM1MTk2MTQyNWVhYmVlZjE2MWM0YjcyYjkzZDFjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiAib2tib2JAZ2l0aHViLmNvbSIgPHBhdmVsLnN0ZWh1bGVAZ21h aWwuY29tPgpEYXRlOiBNb24sIDIzIEZlYiAyMDI2IDEyOjUzOjQ0ICswMTAwClN1YmplY3Q6IFtQ QVRDSF0gRk9SRUFDSCBzY2FsYXIgSU4gSlNPTiBBUlJBWQoKdGhpcyBwYXRjaCBpbnRyb2R1Y2Ug Rk9SRUFDSCBzY2FsYXJfdmFyIElOIEpTT04gQVJSQVkuIFRoZSBkZXNpZ24gaXMgYmFzZWQKb24g YmVoYXZlIG9mIGpzb25iX2FycmF5X2VsZW1lbnRzIGZ1bmN0aW9ucy4gSW4gdGhpcyBjYXNlLCBG T1JFQUNIIGVuZm9yY2UKY2FzdGluZyB0byB0YXJnZXQgdHlwZSAoYmVjYXVzZSB3ZSBrbm93IHRh cmdldCB0eXBlKSBhbmQgdHJ5IHRvIHJlZHVjZQpJTyBjYXN0aW5nLiBBdHRlbnRpb246IElPIGNh c3RpbmcgY2FuIGJlIG1vcmUgc3RyaWN0LCB0aGVuIGNhc3RpbmcgYmFzZWQKb24gY2FzdCBmdW5j dGlvbnMuCgpERUNMQVJFIHQgaW50OwpCRUdJTgogIC0tIHRoaXMgY2FuIHdvcmsgYmVjYXVzZSB3 ZSB1c2UgY2FzdCBudW1lcmljIC0+IGludAogIEZPUkVBQ0ggdCBJTiBKU09OIEFSUkFZICdbMSwy LDMuMTRdJwogIExPT1AKCiAgLS0gdGhpcyBmYWlscywgYmVjYXVzZSBJTyBjYXN0IGlzIHVzZWQs IGFuZCBpbnRlZ2VyIGlucHV0IGZ1bmN0aW9uCiAgLS0gYWxsb3dzIG9ubHkgZGlnaXRzCiAgRk9S RUFDIHQgSU4gSlNPTiBBUlJBWSAnWzEsMiwzLCIzLjE0Il0nCiAgTE9PUAoKQ29uY2VwdHVhbCBx dWVzdGlvbiBpcyBpZiBjYXN0aW5nIHNob3VsZCBiZSBzdHJpY3QgbGlrZSAib2xkIiBQb3N0Z3Jl U1FMCmpzb24gZnVuY3Rpb24gb3IgbGF4IGFzICJuZXciIFNRTC9KU09OIGZ1bmN0aW9ucz8gSSBj YW4gaW1hZ2luZSBsYXggbW9kZQphcyBkZWZhdWx0IHdpdGggcG9zc2liaWxpdHkgdG8gc3dpdGNo IHRvIHN0cmljdCBtb2RlICh0aGlzIGlzIG5vdCBpbXBsZW1lbnRlZApub3cpOgoKICBGT1JFQUNI IHQgSU4gSlNPTiBBUlJBWSAnWzEsMiwzXScgRVJST1IgT04gRU1QVFkgRVJST1IgT04gRVJST1IK ICBMT09QCiAgICAuLi4KClRoZSBwZXJmb3JtYW5jZSAoYmVzdCBjYXNlIGZvciBpdGVyYXRpb24g b3ZlciAxMDAwIGZpZWxkcyBhcnJheSkgaXMgYWJvdXQKNHggYmV0dGVyIHRoYW4gd2hlbiBGT1Ig SU4gU0VMRUNUIGpzb25iX2FycmF5X2VsZW1lbnRzIGlzIHVzZWQuCi0tLQogZG9jL3NyYy9zZ21s L3BscGdzcWwuc2dtbCAgICAgICAgICAgICAgICAgICAgIHwgIDYzICsrKysKIHNyYy9iYWNrZW5k L3V0aWxzL2FkdC9qc29uYl91dGlsLmMgICAgICAgICAgICB8ICAgMSArCiBzcmMvcGwvcGxwZ3Nx bC9zcmMvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgfCAgIDIgKy0KIC4uLi9wbHBnc3FsL3Ny Yy9leHBlY3RlZC9wbHBnc3FsX2ZvcmVhY2gub3V0ICB8IDExOSArKysrKysrCiBzcmMvcGwvcGxw Z3NxbC9zcmMvbWVzb24uYnVpbGQgICAgICAgICAgICAgICAgfCAgIDEgKwogc3JjL3BsL3BscGdz cWwvc3JjL3BsX2NvbXAuYyAgICAgICAgICAgICAgICAgIHwgICA0ICstCiBzcmMvcGwvcGxwZ3Nx bC9zcmMvcGxfZXhlYy5jICAgICAgICAgICAgICAgICAgfCAyOTYgKysrKysrKysrKysrKysrKyst CiBzcmMvcGwvcGxwZ3NxbC9zcmMvcGxfZnVuY3MuYyAgICAgICAgICAgICAgICAgfCAgMjkgKysK IHNyYy9wbC9wbHBnc3FsL3NyYy9wbF9ncmFtLnkgICAgICAgICAgICAgICAgICB8ICAzOSArKy0K IHNyYy9wbC9wbHBnc3FsL3NyYy9wbF91bnJlc2VydmVkX2t3bGlzdC5oICAgICB8ICAgMSArCiBz cmMvcGwvcGxwZ3NxbC9zcmMvcGxwZ3NxbC5oICAgICAgICAgICAgICAgICAgfCAgMzUgKystCiBz cmMvcGwvcGxwZ3NxbC9zcmMvc3FsL3BscGdzcWxfZm9yZWFjaC5zcWwgICAgfCAgODkgKysrKysr CiAxMiBmaWxlcyBjaGFuZ2VkLCA2NjkgaW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25zKC0pCiBj cmVhdGUgbW9kZSAxMDA2NDQgc3JjL3BsL3BscGdzcWwvc3JjL2V4cGVjdGVkL3BscGdzcWxfZm9y ZWFjaC5vdXQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvcGwvcGxwZ3NxbC9zcmMvc3FsL3BscGdz cWxfZm9yZWFjaC5zcWwKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvcGxwZ3NxbC5zZ21sIGIv ZG9jL3NyYy9zZ21sL3BscGdzcWwuc2dtbAppbmRleCA1NjFmNmU1MGQ2My4uYzExZjQ0Njc2YmYg MTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9wbHBnc3FsLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21s L3BscGdzcWwuc2dtbApAQCAtMjc4MCw2ICsyNzgwLDY5IEBAIE5PVElDRTogIHJvdyA9IHsxMCwx MSwxMn0KICAgICA8L3BhcmE+CiAgICA8L3NlY3QyPgogCisgICA8c2VjdDIgaWQ9InBscGdzcWwt Zm9yZWFjaC1qc29uLWFycmF5Ij4KKyAgICA8dGl0bGU+TG9vcGluZyB0aHJvdWdoIEpTT04gYXJy YXlzPC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICBUaGUgPGxpdGVyYWw+Rk9SRUFDSDwvbGl0 ZXJhbD4gbG9vcCBpcyBtdWNoIGxpa2UgYSA8bGl0ZXJhbD5GT1JFQUNIPC9saXRlcmFsPiBsb29w LAorICAgICBidXQgaW5zdGVhZCBvZiBpdGVyYXRpbmcgdGhyb3VnaCBlbGVtZW50cyBvZiB0aGUg YXJyYXksCisgICAgIGl0IGl0ZXJhdGVzIHRocm91Z2ggdGhlIGVsZW1lbnRzIG9mIGFuIEpTT04g YXJyYXkgdmFsdWUKKyAgICAgKGV4cHJlc3Npb24gaXMgaW50ZXJuYWx5IGNhc3RlZCB0byBqc29u YiB0eXBlKS4KKworPHN5bm9wc2lzPgorPG9wdGlvbmFsPiAmbHQ7Jmx0OzxyZXBsYWNlYWJsZT5s YWJlbDwvcmVwbGFjZWFibGU+Jmd0OyZndDsgPC9vcHRpb25hbD4KK0ZPUkVBQ0ggPHJlcGxhY2Vh YmxlPnRhcmdldDwvcmVwbGFjZWFibGU+IElOIEpTT04gQVJSQVkgPHJlcGxhY2VhYmxlPmV4cHJl c3Npb248L3JlcGxhY2VhYmxlPiBMT09QCisgICAgPHJlcGxhY2VhYmxlPnN0YXRlbWVudHM8L3Jl cGxhY2VhYmxlPgorRU5EIExPT1AgPG9wdGlvbmFsPiA8cmVwbGFjZWFibGU+bGFiZWw8L3JlcGxh Y2VhYmxlPiA8L29wdGlvbmFsPjsKKzwvc3lub3BzaXM+CisgICAgPC9wYXJhPgorCisgICAgPHBh cmE+CisgICAgIFRhcmdldCBjYW4gYmUgc2NhbGFyIHZhcmlhYmxlLCBjb21wb3NpdGUgdmFyaWFi bGUgb3IgbGlzdCBvZgorICAgICBzY2FsYXIgdmFyaWFibGVzLiBXaGVuIHZhcmlhYmxlIGlzIG5v dCBzY2FsYXIsIHRoZW4gYXNzaWduZWQgdmFsdWUKKyAgICAgc2hvdWxkIGJlIGEgSlNPTiBvYmpl Y3QgYW5kIHRoZSBKU09OIGF0dHJpYnV0ZXMgYXJlIGFzc2lnbmVkIGJ5IG5hbWVzLgorCis8cHJv Z3JhbWxpc3Rpbmc+CitDUkVBVEUgRlVOQ1RJT04gc2Nhbl9yb3dzKGpzb25iKSBSRVRVUk5TIHZv aWQgQVMgJCQKK0RFQ0xBUkUKKyAgeCBpbnQ7CitCRUdJTgorICBGT1JFQUNIIHggSU4gSlNPTiBB UlJBWSAkMQorICBMT09QCisgICAgUkFJU0UgTk9USUNFICdyb3cgPSAlJywgeDsKKyAgRU5EIExP T1A7CitFTkQ7CiskJCBMQU5HVUFHRSBwbHBnc3FsOworCitTRUxFQ1Qgc2Nhbl9yb3dzKCdbMSwy LDNdJyk7CitOT1RJQ0U6ICByb3cgPSAxCitOT1RJQ0U6ICByb3cgPSAyCitOT1RJQ0U6ICByb3cg PSAzCisKK0NSRUFURSBGVU5DVElPTiBzY2FuX3Jvd3MoanNvbmIpIFJFVFVSTlMgdm9pZCBBUyAk JAorREVDTEFSRQorICB4IGludDsgeSB2YXJjaGFyOworQkVHSU4KKyAgRk9SRUFDSCB4LCB5IElO IEpTT04gQVJSQVkgJDEKKyAgTE9PUAorICAgIFJBSVNFIE5PVElDRSAneDogJSwgeTogJScsIHgs IHk7CisgIEVORCBMT09QOworRU5EOworJCQgTEFOR1VBR0UgcGxwZ3NxbDsKKworU0VMRUNUIHNj YW5fcm93cygnW3t9LHsieCI6MTB9LHsieSI6IkhpIn0seyJ5IjoiSGkiLCAieCI6MTAwMH1dJyk7 CitOT1RJQ0U6ICB4OiAmbHQ7TlVMTCZndDssIHk6ICZsdDtOVUxMJmd0OworTk9USUNFOiAgeDog MTAsIHk6ICZsdDtOVUxMJmd0OworTk9USUNFOiAgeDogJmx0O05VTEwmZ3Q7LCB5OiBIaQorTk9U SUNFOiAgeDogMTAwMCwgeTogSGkKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgPC9wYXJhPgorCisg ICAgPHBhcmE+CisgICAgIEFzc2lnbmluZyB0byBQTHBnU1FMIGFycmF5IHZhcmlhYmxlcyBpcyBu b3Qgc3VwcG9ydGVkLgorICAgIDwvcGFyYT4KKyAgIDwvc2VjdDI+CisKICAgIDxzZWN0MiBpZD0i cGxwZ3NxbC1lcnJvci10cmFwcGluZyI+CiAgICAgPHRpdGxlPlRyYXBwaW5nIEVycm9yczwvdGl0 bGU+CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29uYl91dGlsLmMgYi9z cmMvYmFja2VuZC91dGlscy9hZHQvanNvbmJfdXRpbC5jCmluZGV4IDkxZmI5ZWEwOWJmLi43NTEz YjExOThkZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25iX3V0aWwuYwor KysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbmJfdXRpbC5jCkBAIC0xOCw2ICsxOCw3IEBA CiAjaW5jbHVkZSAiY29tbW9uL2hhc2hmbi5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgogI2lu Y2x1ZGUgInBvcnQvcGdfYml0dXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgog I2luY2x1ZGUgInV0aWxzL2RhdGUuaCIKICNpbmNsdWRlICJ1dGlscy9kYXRldGltZS5oIgogI2lu Y2x1ZGUgInV0aWxzL2RhdHVtLmgiCmRpZmYgLS1naXQgYS9zcmMvcGwvcGxwZ3NxbC9zcmMvTWFr ZWZpbGUgYi9zcmMvcGwvcGxwZ3NxbC9zcmMvTWFrZWZpbGUKaW5kZXggNjNjYjk2ZmFlM2UuLjVi ZDBjZjMxZGZjIDEwMDY0NAotLS0gYS9zcmMvcGwvcGxwZ3NxbC9zcmMvTWFrZWZpbGUKKysrIGIv c3JjL3BsL3BscGdzcWwvc3JjL01ha2VmaWxlCkBAIC0zNSw3ICszNSw3IEBAIFJFR1JFU1NfT1BU UyA9IC0tZGJuYW1lPSQoUExfVEVTVERCKQogUkVHUkVTUyA9IHBscGdzcWxfYXJyYXkgcGxwZ3Nx bF9jYWNoZSBwbHBnc3FsX2NhbGwgcGxwZ3NxbF9jb250cm9sIFwKIAlwbHBnc3FsX2NvcHkgcGxw Z3NxbF9kb21haW4gcGxwZ3NxbF9taXNjIFwKIAlwbHBnc3FsX3JlY29yZCBwbHBnc3FsX3NpbXBs ZSBwbHBnc3FsX3RyYW5zYWN0aW9uIFwKLQlwbHBnc3FsX3RyYXAgcGxwZ3NxbF90cmlnZ2VyIHBs cGdzcWxfdmFycHJvcHMKKwlwbHBnc3FsX3RyYXAgcGxwZ3NxbF90cmlnZ2VyIHBscGdzcWxfdmFy cHJvcHMgcGxwZ3NxbF9mb3JlYWNoCiAKICMgd2hlcmUgdG8gZmluZCBnZW5fa2V5d29yZGxpc3Qu cGwgYW5kIHN1YnNpZGlhcnkgZmlsZXMKIFRPT0xTRElSID0gJCh0b3Bfc3JjZGlyKS9zcmMvdG9v bHMKZGlmZiAtLWdpdCBhL3NyYy9wbC9wbHBnc3FsL3NyYy9leHBlY3RlZC9wbHBnc3FsX2ZvcmVh Y2gub3V0IGIvc3JjL3BsL3BscGdzcWwvc3JjL2V4cGVjdGVkL3BscGdzcWxfZm9yZWFjaC5vdXQK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjQzYWU4NDQxMmYxCi0tLSAv ZGV2L251bGwKKysrIGIvc3JjL3BsL3BscGdzcWwvc3JjL2V4cGVjdGVkL3BscGdzcWxfZm9yZWFj aC5vdXQKQEAgLTAsMCArMSwxMTkgQEAKKy0tIG51bWVyaWMgdG8gbnVtZXJpYworZG8gJCQKK2Rl Y2xhcmUgeCBudW1lcmljOworYmVnaW4KKyAgZm9yZWFjaCB4IGluIGpzb24gYXJyYXkgJ1sxMCwy MCwzMCwzLjE0LCBudWxsXScKKyAgbG9vcAorICAgIHJhaXNlIG5vdGljZSAnJScsIHg7CisgIGVu ZCBsb29wOworZW5kOworJCQ7CitOT1RJQ0U6ICAxMAorTk9USUNFOiAgMjAKK05PVElDRTogIDMw CitOT1RJQ0U6ICAzLjE0CitOT1RJQ0U6ICA8TlVMTD4KKy0tIG51bWVyaWMgdG8gaW50IGJ5IGNh c3QKK2RvICQkCitkZWNsYXJlIHggaW50OworYmVnaW4KKyAgZm9yZWFjaCB4IGluIGpzb24gYXJy YXkgJ1sxMCwyMCwzMCwzLjE0LCBudWxsXScKKyAgbG9vcAorICAgIHJhaXNlIG5vdGljZSAnJScs IHg7CisgIGVuZCBsb29wOworZW5kOworJCQ7CitOT1RJQ0U6ICAxMAorTk9USUNFOiAgMjAKK05P VElDRTogIDMwCitOT1RJQ0U6ICAzCitOT1RJQ0U6ICA8TlVMTD4KKy0tIGNvbnZlcnNpb24gIjMu MTQiIHRvIGludCBzaG91bGQgdG8gZmFpbCBkdWUgSU8gY2FzdAorZG8gJCQKK2RlY2xhcmUgeCBp bnQ7CitiZWdpbgorICBmb3JlYWNoIHggaW4ganNvbiBhcnJheSAnWyIxMCIsMjAsMzAsIjMuMTQi XScKKyAgbG9vcAorICAgIHJhaXNlIG5vdGljZSAnJScsIHg7CisgIGVuZCBsb29wOworZW5kOwor JCQ7CitOT1RJQ0U6ICAxMAorTk9USUNFOiAgMjAKK05PVElDRTogIDMwCitFUlJPUjogIGludmFs aWQgaW5wdXQgc3ludGF4IGZvciB0eXBlIGludGVnZXI6ICIzLjE0IgorQ09OVEVYVDogIFBML3Bn U1FMIGZ1bmN0aW9uIGlubGluZV9jb2RlX2Jsb2NrIGxpbmUgNCBhdCBGT1JFQUNIIG92ZXIganNv biBhcnJheQorLS0ganNvbmIgdG8ganNvbmIKK2RvICQkCitkZWNsYXJlIHgganNvbmI7CitiZWdp bgorICBmb3JlYWNoIHggaW4ganNvbiBhcnJheSAnWzEwLDIwLDMwLDMuMTQsIG51bGwsICJIaSJd JworICBsb29wCisgICAgcmFpc2Ugbm90aWNlICclJywgeDsKKyAgZW5kIGxvb3A7CitlbmQ7Cisk JDsKK05PVElDRTogIDEwCitOT1RJQ0U6ICAyMAorTk9USUNFOiAgMzAKK05PVElDRTogIDMuMTQK K05PVElDRTogIG51bGwKK05PVElDRTogICJIaSIKKy0tIGpzb25iIHRvIGpzb24KK2RvICQkCitk ZWNsYXJlIHgganNvbjsKK2JlZ2luCisgIGZvcmVhY2ggeCBpbiBqc29uIGFycmF5ICdbMTAsMjAs MzAsMy4xNCwgbnVsbCwgIkhpIl0nCisgIGxvb3AKKyAgICByYWlzZSBub3RpY2UgJyUnLCB4Owor ICBlbmQgbG9vcDsKK2VuZDsKKyQkOworTk9USUNFOiAgMTAKK05PVElDRTogIDIwCitOT1RJQ0U6 ICAzMAorTk9USUNFOiAgMy4xNAorTk9USUNFOiAgbnVsbAorTk9USUNFOiAgIkhpIgorLS0gaXRl cmF0aW9uIG92ZXIgY29tcG9zaXRlcworZG8gJCQKK2RlY2xhcmUgeCBpbnQ7IHkgbnVtZXJpYzsg eiB2YXJjaGFyOworYmVnaW4KKyAgZm9yZWFjaCB4LCB5LCB6IGluIGpzb24gYXJyYXkgJ1t7fSwg eyJ6IjoiSGkifSwgeyJ5IjogMy4xNH0sIHsieiI6IkhpIiwgIngiOjEwLCAieSI6My4xNH1dJwor ICBsb29wCisgICAgcmFpc2Ugbm90aWNlICd4OiAlLCB5OiAlLCB6OiAlJywgeCwgeSwgejsKKyAg ZW5kIGxvb3A7CitlbmQ7CiskJDsKK05PVElDRTogIHg6IDxOVUxMPiwgeTogPE5VTEw+LCB6OiA8 TlVMTD4KK05PVElDRTogIHg6IDxOVUxMPiwgeTogPE5VTEw+LCB6OiBIaQorTk9USUNFOiAgeDog PE5VTEw+LCB5OiAzLjE0LCB6OiA8TlVMTD4KK05PVElDRTogIHg6IDEwLCB5OiAzLjE0LCB6OiBI aQorY3JlYXRlIHR5cGUgdDMgYXMgKHggaW50LCB5IG51bWVyaWMsIHogdmFyY2hhcik7CitkbyAk JAorZGVjbGFyZSBjIHQzOworYmVnaW4KKyAgZm9yZWFjaCBjIGluIGpzb24gYXJyYXkgJ1t7fSwg eyJ6IjoiSGkifSwgeyJ5IjogMy4xNH0sIHsieiI6IkhpIiwgIngiOjEwLCAieSI6My4xNH1dJwor ICBsb29wCisgICAgcmFpc2Ugbm90aWNlICd4OiAlLCB5OiAlLCB6OiAlJywgYy54LCBjLnksIGMu ejsKKyAgZW5kIGxvb3A7CitlbmQ7CiskJDsKK05PVElDRTogIHg6IDxOVUxMPiwgeTogPE5VTEw+ LCB6OiA8TlVMTD4KK05PVElDRTogIHg6IDxOVUxMPiwgeTogPE5VTEw+LCB6OiBIaQorTk9USUNF OiAgeDogPE5VTEw+LCB5OiAzLjE0LCB6OiA8TlVMTD4KK05PVElDRTogIHg6IDEwLCB5OiAzLjE0 LCB6OiBIaQorZG8gJCQKK2RlY2xhcmUgYyB0MzsKK2JlZ2luCisgIGZvcmVhY2ggYy54LCBjLnks IGMueiBpbiBqc29uIGFycmF5ICdbe30sIHsieiI6IkhpIn0sIHsieSI6IDMuMTR9LCB7InoiOiJI aSIsICJ4IjoxMCwgInkiOjMuMTR9XScKKyAgbG9vcAorICAgIHJhaXNlIG5vdGljZSAneDogJSwg eTogJSwgejogJScsIGMueCwgYy55LCBjLno7CisgIGVuZCBsb29wOworZW5kOworJCQ7CitOT1RJ Q0U6ICB4OiA8TlVMTD4sIHk6IDxOVUxMPiwgejogPE5VTEw+CitOT1RJQ0U6ICB4OiA8TlVMTD4s IHk6IDxOVUxMPiwgejogSGkKK05PVElDRTogIHg6IDxOVUxMPiwgeTogMy4xNCwgejogPE5VTEw+ CitOT1RJQ0U6ICB4OiAxMCwgeTogMy4xNCwgejogSGkKK2Ryb3AgdHlwZSB0MzsKZGlmZiAtLWdp dCBhL3NyYy9wbC9wbHBnc3FsL3NyYy9tZXNvbi5idWlsZCBiL3NyYy9wbC9wbHBnc3FsL3NyYy9t ZXNvbi5idWlsZAppbmRleCA2ZmYyNzAwNmNmYy4uNjA5ZWVkN2EyOGQgMTAwNjQ0Ci0tLSBhL3Ny Yy9wbC9wbHBnc3FsL3NyYy9tZXNvbi5idWlsZAorKysgYi9zcmMvcGwvcGxwZ3NxbC9zcmMvbWVz b24uYnVpbGQKQEAgLTg4LDYgKzg4LDcgQEAgdGVzdHMgKz0gewogICAgICAgJ3BscGdzcWxfdHJh cCcsCiAgICAgICAncGxwZ3NxbF90cmlnZ2VyJywKICAgICAgICdwbHBnc3FsX3ZhcnByb3BzJywK KyAgICAgICdwbHBnc3FsX2ZvcmVhY2gnLAogICAgIF0sCiAgIH0sCiB9CmRpZmYgLS1naXQgYS9z cmMvcGwvcGxwZ3NxbC9zcmMvcGxfY29tcC5jIGIvc3JjL3BsL3BscGdzcWwvc3JjL3BsX2NvbXAu YwppbmRleCA1ZWNjNzc2Njc1Ny4uOGZhNjA5NzZjZmQgMTAwNjQ0Ci0tLSBhL3NyYy9wbC9wbHBn c3FsL3NyYy9wbF9jb21wLmMKKysrIGIvc3JjL3BsL3BscGdzcWwvc3JjL3BsX2NvbXAuYwpAQCAt MTI1Myw2ICsxMjUzLDcgQEAgbWFrZV9kYXR1bV9wYXJhbShQTHBnU1FMX2V4cHIgKmV4cHIsIGlu dCBkbm8sIGludCBsb2NhdGlvbikKIAlQTHBnU1FMX2RhdHVtICpkYXR1bTsKIAlQYXJhbQkgICAq cGFyYW07CiAJTWVtb3J5Q29udGV4dCBvbGRjb250ZXh0OworCWNoYXIJICAgKnJlZm5hbWU7CiAK IAkvKiBzZWUgY29tbWVudCBpbiByZXNvbHZlX2NvbHVtbl9yZWYgKi8KIAllc3RhdGUgPSBleHBy LT5mdW5jLT5jdXJfZXN0YXRlOwpAQCAtMTI3Myw3ICsxMjc0LDggQEAgbWFrZV9kYXR1bV9wYXJh bShQTHBnU1FMX2V4cHIgKmV4cHIsIGludCBkbm8sIGludCBsb2NhdGlvbikKIAkJCQkJCQkJCSBk YXR1bSwKIAkJCQkJCQkJCSAmcGFyYW0tPnBhcmFtdHlwZSwKIAkJCQkJCQkJCSAmcGFyYW0tPnBh cmFtdHlwbW9kLAotCQkJCQkJCQkJICZwYXJhbS0+cGFyYW1jb2xsaWQpOworCQkJCQkJCQkJICZw YXJhbS0+cGFyYW1jb2xsaWQsCisJCQkJCQkJCQkgJnJlZm5hbWUpOwogCXBhcmFtLT5sb2NhdGlv biA9IGxvY2F0aW9uOwogCiAJcmV0dXJuIChOb2RlICopIHBhcmFtOwpkaWZmIC0tZ2l0IGEvc3Jj L3BsL3BscGdzcWwvc3JjL3BsX2V4ZWMuYyBiL3NyYy9wbC9wbHBnc3FsL3NyYy9wbF9leGVjLmMK aW5kZXggODQ1NTJlMzJjODcuLjMzODNiNDJjMzlhIDEwMDY0NAotLS0gYS9zcmMvcGwvcGxwZ3Nx bC9zcmMvcGxfZXhlYy5jCisrKyBiL3NyYy9wbC9wbHBnc3FsL3NyYy9wbF9leGVjLmMKQEAgLTQx LDYgKzQxLDggQEAKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2luY2x1ZGUgInV0aWxz L2RhdHVtLmgiCiAjaW5jbHVkZSAidXRpbHMvZm1ncm9pZHMuaCIKKyNpbmNsdWRlICJ1dGlscy9q c29uYi5oIgorI2luY2x1ZGUgInV0aWxzL2pzb25mdW5jcy5oIgogI2luY2x1ZGUgInV0aWxzL2xz eXNjYWNoZS5oIgogI2luY2x1ZGUgInV0aWxzL21lbXV0aWxzLmgiCiAjaW5jbHVkZSAidXRpbHMv cmVsLmgiCkBAIC0zMDUsNiArMzA3LDggQEAgc3RhdGljIGludAlleGVjX3N0bXRfZm9yYyhQTHBn U1FMX2V4ZWNzdGF0ZSAqZXN0YXRlLAogCQkJCQkJICAgUExwZ1NRTF9zdG10X2ZvcmMgKnN0bXQp Owogc3RhdGljIGludAlleGVjX3N0bXRfZm9yZWFjaF9hKFBMcGdTUUxfZXhlY3N0YXRlICplc3Rh dGUsCiAJCQkJCQkJCVBMcGdTUUxfc3RtdF9mb3JlYWNoX2EgKnN0bXQpOworc3RhdGljIGludAll eGVjX3N0bXRfZm9yZWFjaF9qc29uX2EoUExwZ1NRTF9leGVjc3RhdGUgKmVzdGF0ZSwKKwkJCQkJ CQkJCSBQTHBnU1FMX3N0bXRfZm9yZWFjaF9qc29uX2EgKnN0bXQpOwogc3RhdGljIGludAlleGVj X3N0bXRfb3BlbihQTHBnU1FMX2V4ZWNzdGF0ZSAqZXN0YXRlLAogCQkJCQkJICAgUExwZ1NRTF9z dG10X29wZW4gKnN0bXQpOwogc3RhdGljIGludAlleGVjX3N0bXRfZmV0Y2goUExwZ1NRTF9leGVj c3RhdGUgKmVzdGF0ZSwKQEAgLTIwNzUsNiArMjA3OSwxMCBAQCBleGVjX3N0bXRzKFBMcGdTUUxf ZXhlY3N0YXRlICplc3RhdGUsIExpc3QgKnN0bXRzKQogCQkJCXJjID0gZXhlY19zdG10X2ZvcmVh Y2hfYShlc3RhdGUsIChQTHBnU1FMX3N0bXRfZm9yZWFjaF9hICopIHN0bXQpOwogCQkJCWJyZWFr OwogCisJCQljYXNlIFBMUEdTUUxfU1RNVF9GT1JFQUNIX0pTT05fQToKKwkJCQlyYyA9IGV4ZWNf c3RtdF9mb3JlYWNoX2pzb25fYShlc3RhdGUsIChQTHBnU1FMX3N0bXRfZm9yZWFjaF9qc29uX2Eg Kikgc3RtdCk7CisJCQkJYnJlYWs7CisKIAkJCWNhc2UgUExQR1NRTF9TVE1UX0VYSVQ6CiAJCQkJ cmMgPSBleGVjX3N0bXRfZXhpdChlc3RhdGUsIChQTHBnU1FMX3N0bXRfZXhpdCAqKSBzdG10KTsK IAkJCQlicmVhazsKQEAgLTI5OTUsNiArMzAwMywyNDAgQEAgZXhlY19zdG10X2ZvcmMoUExwZ1NR TF9leGVjc3RhdGUgKmVzdGF0ZSwgUExwZ1NRTF9zdG10X2ZvcmMgKnN0bXQpCiB9CiAKIAorLyoK KyAqIENvbnZlcnQgSnNvbmJWYWx1ZSB0byBEYXR1bSB0aGF0IGNhbiBiZSBhc3NpZ25lZCB0byBQ THBnU1FMX3Zhci4KKyAqLworc3RhdGljIERhdHVtCitKc29uYlZhbHVlVG9EYXR1bShKc29uYlZh bHVlICpqYnYsCisJCQkJICBPaWQgKnR5cGlkLCBpbnQzMiAqdHlwbW9kLCBib29sICppc251bGws CisJCQkJICBPaWQgZXhwZWN0ZWRfdHlwaWQsIGludDMyIGV4cGVjdGVkX3R5cG1vZCwKKwkJCQkg IHZvaWQgKipjYWNoZSwgTWVtb3J5Q29udGV4dCBtY3h0KQoreworCWlmIChleHBlY3RlZF90eXBp ZCA9PSBKU09OQk9JRCkKKwl7CisJCSp0eXBpZCA9IEpTT05CT0lEOworCQkqdHlwbW9kID0gLTE7 CisJCSppc251bGwgPSBmYWxzZTsKKworCQlyZXR1cm4gUG9pbnRlckdldERhdHVtKEpzb25iVmFs dWVUb0pzb25iKGpidikpOworCX0KKwllbHNlIGlmIChleHBlY3RlZF90eXBpZCA9PSBKU09OT0lE KQorCXsKKwkJSnNvbmIJICAgKmpzb25iOworCQljaGFyCSAgICpzdHI7CisKKwkJLyogc2VyaWFs aXplIEpzb25WYWx1ZSB0byBKU09OIHRleHQgKi8KKwkJanNvbmIgPSBKc29uYlZhbHVlVG9Kc29u YihqYnYpOworCQlzdHIgPSBKc29uYlRvQ1N0cmluZyhOVUxMLCAmanNvbmItPnJvb3QsIFZBUlNJ WkUoanNvbmIpKTsKKworCQkqdHlwaWQgPSBURVhUT0lEOworCQkqdHlwbW9kID0gLTE7CisJCSpp c251bGwgPSBmYWxzZTsKKworCQlyZXR1cm4gUG9pbnRlckdldERhdHVtKGNzdHJpbmdfdG9fdGV4 dChzdHIpKTsKKwl9CisJZWxzZSBpZiAoamJ2LT50eXBlID09IGpidk51bGwpCisJeworCQkqdHlw aWQgPSBleHBlY3RlZF90eXBpZDsKKwkJKnR5cG1vZCA9IC0xOworCQkqaXNudWxsID0gdHJ1ZTsK KworCQlyZXR1cm4gKERhdHVtKSAwOworCX0KKwllbHNlIGlmIChqYnYtPnR5cGUgPT0gamJ2U3Ry aW5nKQorCXsKKwkJKnR5cGlkID0gVEVYVE9JRDsKKwkJKnR5cG1vZCA9IC0xOworCQkqaXNudWxs ID0gZmFsc2U7CisKKwkJcmV0dXJuIFBvaW50ZXJHZXREYXR1bShjc3RyaW5nX3RvX3RleHRfd2l0 aF9sZW4oamJ2LT52YWwuc3RyaW5nLnZhbCwgamJ2LT52YWwuc3RyaW5nLmxlbikpOworCX0KKwll bHNlIGlmIChqYnYtPnR5cGUgPT0gamJ2TnVtZXJpYykKKwl7CisJCSp0eXBpZCA9IE5VTUVSSUNP SUQ7CisJCSp0eXBtb2QgPSAtMTsKKwkJKmlzbnVsbCA9IGZhbHNlOworCisJCXJldHVybiBQb2lu dGVyR2V0RGF0dW0oamJ2LT52YWwubnVtZXJpYyk7CisJfQorCWVsc2UgaWYgKGpidi0+dHlwZSA9 PSBqYnZCb29sKQorCXsKKwkJKnR5cGlkID0gQk9PTE9JRDsKKwkJKnR5cG1vZCA9IC0xOworCQkq aXNudWxsID0gZmFsc2U7CisKKwkJcmV0dXJuIEJvb2xHZXREYXR1bShqYnYtPnZhbC5ib29sZWFu KTsKKwl9CisJZWxzZQorCXsKKwkJSnNvbmIJKmpzb25iOworCQlEYXR1bQlyZXN1bHQ7CisKKwkJ anNvbmIgPSBKc29uYlZhbHVlVG9Kc29uYihqYnYpOworCQlyZXN1bHQgPSBqc29uX3BvcHVsYXRl X3R5cGUoUG9pbnRlckdldERhdHVtKGpzb25iKSwgSlNPTkJPSUQsCisJCQkJCQkJCQlleHBlY3Rl ZF90eXBpZCwgZXhwZWN0ZWRfdHlwbW9kLAorCQkJCQkJCQkJY2FjaGUsIG1jeHQsCisJCQkJCQkJ CQlpc251bGwsIGZhbHNlLCBOVUxMKTsKKworCQkqdHlwaWQgPSBleHBlY3RlZF90eXBpZDsKKwkJ KnR5cG1vZCA9IGV4cGVjdGVkX3R5cG1vZDsKKworCQlyZXR1cm4gcmVzdWx0OworCX0KK30KKwor LyogLS0tLS0tLS0tLQorICogZXhlY19zdG10X2ZvcmVhY2hfanNvbl9hCQkJTG9vcCBvdmVyIGVs ZW1lbnRzIGluIGpzb24gYXJyYXkKKyAqCisgKiBXaGVuIHRhcmdldCBpcyBhIGNvbXBvc2l0ZSwg dGhlbiB0YXJnZXQgaXMgcG9wdWxhdGVkIGxpa2UganNvbl90b19wb3B1bGF0ZV9yZWNvcmQuCisg KiBqc29uYiBkb2Vzbid0IHByZXNlcnZlIGF0dHJpYnV0ZSBvcmRlciwgc28gcG9zaXRpb24gYmFz ZWQgbWFwcGluZyBiZXR3ZWVuCisgKiB0YXJnZXQgYW5kIHNvdXJjZSBjYW4gYmUgcG9zc2libHkg ZGFuZ2Vyb3VzICh3aXRoIHVuZXhwZWN0ZWQgYmVoYXZlKS4KKyAqIC0tLS0tLS0tLS0KKyAqLwor c3RhdGljIGludAorZXhlY19zdG10X2ZvcmVhY2hfanNvbl9hKFBMcGdTUUxfZXhlY3N0YXRlICpl c3RhdGUsCisJCQkJCQkgUExwZ1NRTF9zdG10X2ZvcmVhY2hfanNvbl9hICpzdG10KQoreworCU9p ZAkJCWV4cHJ0eXBlaWQ7CisJaW50MzIJCWV4cHJ0eXBtb2Q7CisJRGF0dW0JCWV4cHJkYXR1bTsK KwlQTHBnU1FMX2RhdHVtICpsb29wX3ZhcjsKKwlPaWQJCQlsb29wX3Zhcl90eXBpZDsKKwlpbnQz MgkJbG9vcF92YXJfdHlwbW9kOworCU9pZAkJCWxvb3BfdmFyX2NvbGxhdGlvbjsKKwljaGFyCSAg ICpsb29wX3Zhcl9uYW1lOworCUpzb25iCSAgICpqYjsKKwlKc29uYkl0ZXJhdG9yICppdDsKKwlK c29uYlZhbHVlCWpidjsKKwlKc29uYkl0ZXJhdG9yVG9rZW4gcjsKKwlNZW1vcnlDb250ZXh0IHN0 bXRfbWNvbnRleHQ7CisJTWVtb3J5Q29udGV4dCBvbGRjb250ZXh0OworCU1lbW9yeUNvbnRleHQg dG1wX2N4dDsKKwlib29sCQlmb3VuZCA9IGZhbHNlOworCWJvb2wJCWlzbnVsbDsKKwlib29sCQlz a2lwTmVzdGVkID0gZmFsc2U7CisJaW50CQkJcmMgPSBQTFBHU1FMX1JDX09LOworCXZvaWQJICAg KmNhY2hlID0gTlVMTDsKKworCS8qIGdldCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gKi8K KwlleHByZGF0dW0gPSBleGVjX2V2YWxfZXhwcihlc3RhdGUsIHN0bXQtPmV4cHIsICZpc251bGws CisJCQkJCQkJICAgJmV4cHJ0eXBlaWQsICZleHBydHlwbW9kKTsKKwlpZiAoaXNudWxsKQorCQll cmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVfTlVMTF9WQUxVRV9OT1RfQUxMT1dF RCksCisJCQkJIGVycm1zZygiRk9SRUFDSCBleHByZXNzaW9uIG11c3Qgbm90IGJlIG51bGwiKSkp OworCisJLyoKKwkgKiBEbyBhcyBtdWNoIGFzIHBvc3NpYmxlIG9mIHRoZSBjb2RlIGJlbG93IGlu IHN0bXRfbWNvbnRleHQsIHRvIGF2b2lkIGFueQorCSAqIGxlYWtzIGZyb20gY2FsbGVkIHN1YnJv dXRpbmVzLiAgV2UgbmVlZCBhIHByaXZhdGUgc3RtdF9tY29udGV4dCBzaW5jZQorCSAqIHdlJ2xs IGJlIGNhbGxpbmcgYXJiaXRyYXJ5IHN0YXRlbWVudCBjb2RlLgorCSAqLworCXN0bXRfbWNvbnRl eHQgPSBnZXRfc3RtdF9tY29udGV4dChlc3RhdGUpOworCXB1c2hfc3RtdF9tY29udGV4dChlc3Rh dGUpOworCW9sZGNvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oc3RtdF9tY29udGV4dCk7 CisKKwl0bXBfY3h0ID0gQWxsb2NTZXRDb250ZXh0Q3JlYXRlKEN1cnJlbnRNZW1vcnlDb250ZXh0 LAorCQkJCQkJCQkJIkZPUkVBQ0ggSU4gSlNPTiBBUlJBWSB0ZW1wb3JhcnkgY3h0IiwKKwkJCQkJ CQkJCUFMTE9DU0VUX0RFRkFVTFRfU0laRVMpOworCisJLyogY2FzdCB0byBqc29uYiAqLworCWV4 cHJkYXR1bSA9IGV4ZWNfY2FzdF92YWx1ZShlc3RhdGUsIGV4cHJkYXR1bSwgJmlzbnVsbCwKKwkJ CQkJCQkJZXhwcnR5cGVpZCwgZXhwcnR5cG1vZCwKKwkJCQkJCQkJSlNPTkJPSUQsIC0xKTsKKwor CUFzc2VydCghaXNudWxsKTsKKworCS8qCisJICogV2UgbXVzdCBjb3B5IHRoZSBhcnJheSBpbnRv IHN0bXRfbWNvbnRleHQsIGVsc2UgaXQgd2lsbCBkaXNhcHBlYXIgaW4KKwkgKiBleGVjX2V2YWxf Y2xlYW51cC4gIFRoaXMgaXMgYW5ub3lpbmcsIGJ1dCBjbGVhbnVwIHdpbGwgY2VydGFpbmx5IGhh cHBlbgorCSAqIHdoaWxlIHJ1bm5pbmcgdGhlIGxvb3AgYm9keSwgc28gd2UgaGF2ZSBsaXR0bGUg Y2hvaWNlLgorCSAqLworCWpiID0gRGF0dW1HZXRKc29uYlBDb3B5KGV4cHJkYXR1bSk7CisKKwkv KiBDbGVhbiB1cCBhbnkgbGVmdG92ZXIgdGVtcG9yYXJ5IG1lbW9yeSAqLworCWV4ZWNfZXZhbF9j bGVhbnVwKGVzdGF0ZSk7CisKKwkvKgorCSAqIFRoaXMgaXMgY29tcGF0aWJsZSB3aXRoIGpzb25i X2FycmF5X2VsZW1lbnQuIFNRTC9KU09OIGZ1bmN0aW9ucyBhcmUgbm90CisJICogdG9vIHN0cmlj dCBsaWtlIFBvc3RncmVTUUwgcHJvcHJpZXRhcnkgKG9sZCBqc29uKSBmdW5jdGlvbnMuIEluIFNR TC9KU09OCisJICogYSBzY2FsYXIgaXMgZXF1YWwgdG8gb25lIGVsZW1lbnQgYXJyYXkuIFRoZSBi YXNpYyBxdWVzdGlvbiBpcyBpZiBGT1JFQUNICisJICogc2hvdWxkIGJlIG1vcmUgcmVzdHJpY3Rp dmUgbGlrZSBvbGQgSlNPTiBmdW5jdGlvbiwgb3IgbGVzcyByZXN0cmljdGl2ZQorCSAqIGxpa2Ug U1FML0pTT04gZnVuY3Rpb25zLgorCSAqLworCWlmIChKQl9ST09UX0lTX1NDQUxBUihqYikpCisJ CWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX1BBUkFNRVRFUl9W QUxVRSksCisJCQkJIGVycm1zZygiY2Fubm90IGV4dHJhY3QgZWxlbWVudHMgZnJvbSBhIHNjYWxh ciIpKSk7CisJZWxzZSBpZiAoIUpCX1JPT1RfSVNfQVJSQVkoamIpKQorCQllcmVwb3J0KEVSUk9S LAorCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9QQVJBTUVURVJfVkFMVUUpLAorCQkJCSBl cnJtc2coImNhbm5vdCBleHRyYWN0IGVsZW1lbnRzIGZyb20gYW4gb2JqZWN0IikpKTsKKworCS8q IFNldCB1cCB0aGUgbG9vcCB2YXJpYWJsZSBhbmQgc2VlIGlmIGl0IGlzIG9mIGFuIGFycmF5IHR5 cGUgKi8KKwlsb29wX3ZhciA9IGVzdGF0ZS0+ZGF0dW1zW3N0bXQtPnZhcm5vXTsKKworCXBscGdz cWxfZXhlY19nZXRfZGF0dW1fdHlwZV9pbmZvKGVzdGF0ZSwgbG9vcF92YXIsCisJCQkJCQkJCQkg Jmxvb3BfdmFyX3R5cGlkLCAmbG9vcF92YXJfdHlwbW9kLAorCQkJCQkJCQkJICZsb29wX3Zhcl9j b2xsYXRpb24sICZsb29wX3Zhcl9uYW1lKTsKKworCWl0ID0gSnNvbmJJdGVyYXRvckluaXQoJmpi LT5yb290KTsKKworCXdoaWxlICgociA9IEpzb25iSXRlcmF0b3JOZXh0KCZpdCwgJmpidiwgc2tp cE5lc3RlZCkpICE9IFdKQl9ET05FKQorCXsKKwkJc2tpcE5lc3RlZCA9IHRydWU7CisKKwkJaWYg KHIgPT0gV0pCX0VMRU0pCisJCXsKKwkJCURhdHVtCQl2YWw7CisJCQlPaWQJCQl2YWx0eXBpZDsK KwkJCWludDMyCQl2YWx0eXBtb2Q7CisJCQlib29sCQl2YWxpc251bGw7CisKKwkJCU1lbW9yeUNv bnRleHRTd2l0Y2hUbyh0bXBfY3h0KTsKKworCQkJdmFsID0gSnNvbmJWYWx1ZVRvRGF0dW0oJmpi diwKKwkJCQkJCQkJCSZ2YWx0eXBpZCwgJnZhbHR5cG1vZCwgJnZhbGlzbnVsbCwKKwkJCQkJCQkJ CWxvb3BfdmFyX3R5cGlkLCBsb29wX3Zhcl90eXBtb2QsCisJCQkJCQkJCQkmY2FjaGUsIHN0bXRf bWNvbnRleHQpOworCisJCQkvKiBleGVjX2Fzc2lnbl92YWx1ZSBhbmQgZXhlY19zdG10cyBtdXN0 IHJ1biBpbiB0aGUgbWFpbiBjb250ZXh0ICovCisJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xk Y29udGV4dCk7CisKKwkJCS8qIEFzc2lnbiBjdXJyZW50IGVsZW1lbnQvc2xpY2UgdG8gdGhlIGxv b3AgdmFyaWFibGUgKi8KKwkJCWV4ZWNfYXNzaWduX3ZhbHVlKGVzdGF0ZSwgbG9vcF92YXIsIHZh bCwKKwkJCQkJCQkgIHZhbGlzbnVsbCwgdmFsdHlwaWQsIHZhbHR5cG1vZCk7CisKKwkJCU1lbW9y eUNvbnRleHRSZXNldCh0bXBfY3h0KTsKKworCQkJLyoKKwkJCSAqIEV4ZWN1dGUgdGhlIHN0YXRl bWVudHMKKwkJCSAqLworCQkJcmMgPSBleGVjX3N0bXRzKGVzdGF0ZSwgc3RtdC0+Ym9keSk7CisK KwkJCUxPT1BfUkNfUFJPQ0VTU0lORyhzdG10LT5sYWJlbCwgYnJlYWspOworCisJCQlNZW1vcnlD b250ZXh0U3dpdGNoVG8oc3RtdF9tY29udGV4dCk7CisJCX0KKwl9CisKKwkvKiBSZXN0b3JlIG1l bW9yeSBjb250ZXh0IHN0YXRlICovCisJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQp OworCXBvcF9zdG10X21jb250ZXh0KGVzdGF0ZSk7CisKKwkvKiBSZWxlYXNlIHRlbXBvcmFyeSBt ZW1vcnksIGluY2x1ZGluZyB0aGUgYXJyYXkgdmFsdWUgKi8KKwlNZW1vcnlDb250ZXh0UmVzZXQo c3RtdF9tY29udGV4dCk7CisKKwkvKgorCSAqIFNldCB0aGUgRk9VTkQgdmFyaWFibGUgdG8gaW5k aWNhdGUgdGhlIHJlc3VsdCBvZiBleGVjdXRpbmcgdGhlIGxvb3AKKwkgKiAobmFtZWx5LCB3aGV0 aGVyIHdlIGxvb3BlZCBvbmUgb3IgbW9yZSB0aW1lcykuIFRoaXMgbXVzdCBiZSBzZXQgaGVyZSBz bworCSAqIHRoYXQgaXQgZG9lcyBub3QgaW50ZXJmZXJlIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBG T1VORCB2YXJpYWJsZSBpbnNpZGUKKwkgKiB0aGUgbG9vcCBwcm9jZXNzaW5nIGl0c2VsZi4KKwkg Ki8KKwlleGVjX3NldF9mb3VuZChlc3RhdGUsIGZvdW5kKTsKKworCXJldHVybiByYzsKK30KKwog LyogLS0tLS0tLS0tLQogICogZXhlY19zdG10X2ZvcmVhY2hfYQkJCUxvb3Agb3ZlciBlbGVtZW50 cyBvciBzbGljZXMgb2YgYW4gYXJyYXkKICAqCkBAIC01NTIyLDcgKzU3NjQsOCBAQCBwbHBnc3Fs X2V4ZWNfZ2V0X2RhdHVtX3R5cGUoUExwZ1NRTF9leGVjc3RhdGUgKmVzdGF0ZSwKIHZvaWQKIHBs cGdzcWxfZXhlY19nZXRfZGF0dW1fdHlwZV9pbmZvKFBMcGdTUUxfZXhlY3N0YXRlICplc3RhdGUs CiAJCQkJCQkJCSBQTHBnU1FMX2RhdHVtICpkYXR1bSwKLQkJCQkJCQkJIE9pZCAqdHlwZUlkLCBp bnQzMiAqdHlwTW9kLCBPaWQgKmNvbGxhdGlvbikKKwkJCQkJCQkJIE9pZCAqdHlwZUlkLCBpbnQz MiAqdHlwTW9kLCBPaWQgKmNvbGxhdGlvbiwKKwkJCQkJCQkJIGNoYXIgKipyZWZuYW1lKQogewog CXN3aXRjaCAoZGF0dW0tPmR0eXBlKQogCXsKQEAgLTU1MzQsNiArNTc3Nyw1NCBAQCBwbHBnc3Fs X2V4ZWNfZ2V0X2RhdHVtX3R5cGVfaW5mbyhQTHBnU1FMX2V4ZWNzdGF0ZSAqZXN0YXRlLAogCQkJ CSp0eXBlSWQgPSB2YXItPmRhdGF0eXBlLT50eXBvaWQ7CiAJCQkJKnR5cE1vZCA9IHZhci0+ZGF0 YXR5cGUtPmF0dHR5cG1vZDsKIAkJCQkqY29sbGF0aW9uID0gdmFyLT5kYXRhdHlwZS0+Y29sbGF0 aW9uOworCQkJCSpyZWZuYW1lID0gdmFyLT5yZWZuYW1lOworCQkJCWJyZWFrOworCQkJfQorCisJ CWNhc2UgUExQR1NRTF9EVFlQRV9ST1c6CisJCQl7CisJCQkJUExwZ1NRTF9yb3cgKnJvdyA9IChQ THBnU1FMX3JvdyAqKSBkYXR1bTsKKworCQkJCWlmICghcm93LT5yb3d0dXBkZXNjKQorCQkJCXsK KwkJCQkJaW50CQkJaTsKKworCQkJCQlyb3ctPnJvd3R1cGRlc2MgPSBDcmVhdGVUZW1wbGF0ZVR1 cGxlRGVzYyhyb3ctPm5maWVsZHMpOworCisJCQkJCWZvciAoaSA9IDA7IGkgPCByb3ctPm5maWVs ZHM7IGkrKykKKwkJCQkJeworCQkJCQkJUExwZ1NRTF9kYXR1bSAqdmFyID0gZXN0YXRlLT5kYXR1 bXNbcm93LT52YXJub3NbaV1dOworCQkJCQkJT2lkCQkJdmFydHlwaWQ7CisJCQkJCQlpbnQzMgkJ dmFydHlwbW9kOworCQkJCQkJT2lkCQkJdmFyY29sbGF0aW9uOworCQkJCQkJY2hhcgkgICAqdmFy bmFtZTsKKworCQkJCQkJLyoKKwkJCQkJCSAqIFdlIGNhbm5vdCB0byB1c2UgZmllbGRuYW1lcyBm b3IgdHVwZGVzY2VudHJ5LCBiZWNhdXNlCisJCQkJCQkgKiB0aGVzZSBuYW1lcyBjYW4gYmUgc3Vm Zml4ZWQgYnkgbmFtZSBvZiByb3cgdmFyaWFibGUuCisJCQkJCQkgKiBVbmZvcnR1bmF0ZWx5LCB0 aGUgUExwZ1NRTF9yZWNmaWVsZCBpcyBub3QgY2FzdGVkIHRvCisJCQkJCQkgKiBQTHBnU1FMX3Zh cmlhYmxlLgorCQkJCQkJICovCisJCQkJCQlwbHBnc3FsX2V4ZWNfZ2V0X2RhdHVtX3R5cGVfaW5m byhlc3RhdGUsIHZhciwKKwkJCQkJCQkJCQkJCQkJICZ2YXJ0eXBpZCwgJnZhcnR5cG1vZCwKKwkJ CQkJCQkJCQkJCQkJICZ2YXJjb2xsYXRpb24sICZ2YXJuYW1lKTsKKworCQkJCQkJVHVwbGVEZXNj SW5pdEVudHJ5KHJvdy0+cm93dHVwZGVzYywgaSArIDEsCisJCQkJCQkJCQkJICAgdmFybmFtZSwg dmFydHlwaWQsIHZhcnR5cG1vZCwKKwkJCQkJCQkJCQkgICAwKTsKKwkJCQkJCVR1cGxlRGVzY0lu aXRFbnRyeUNvbGxhdGlvbihyb3ctPnJvd3R1cGRlc2MsIGkgKyAxLAorCQkJCQkJCQkJCQkJCXZh cmNvbGxhdGlvbik7CisJCQkJCX0KKworCQkJCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIHZhbGlk IHR5cGUvdHlwbW9kIHNldHRpbmcgKi8KKwkJCQkJQmxlc3NUdXBsZURlc2Mocm93LT5yb3d0dXBk ZXNjKTsKKwkJCQl9CisKKwkJCQkqdHlwZUlkID0gcm93LT5yb3d0dXBkZXNjLT50ZHR5cGVpZDsK KwkJCQkqdHlwTW9kID0gcm93LT5yb3d0dXBkZXNjLT50ZHR5cG1vZDsKKwkJCQkvKiBjb21wb3Np dGUgdHlwZXMgYXJlIG5ldmVyIGNvbGxhdGFibGUgKi8KKwkJCQkqY29sbGF0aW9uID0gSW52YWxp ZE9pZDsKKwkJCQkqcmVmbmFtZSA9IHJvdy0+cmVmbmFtZTsKIAkJCQlicmVhazsKIAkJCX0KIApA QCAtNTU1Niw2ICs1ODQ3LDcgQEAgcGxwZ3NxbF9leGVjX2dldF9kYXR1bV90eXBlX2luZm8oUExw Z1NRTF9leGVjc3RhdGUgKmVzdGF0ZSwKIAkJCQl9CiAJCQkJLyogY29tcG9zaXRlIHR5cGVzIGFy ZSBuZXZlciBjb2xsYXRhYmxlICovCiAJCQkJKmNvbGxhdGlvbiA9IEludmFsaWRPaWQ7CisJCQkJ KnJlZm5hbWUgPSByZWMtPnJlZm5hbWU7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTU1OTMsNiAr NTg4NSw3IEBAIHBscGdzcWxfZXhlY19nZXRfZGF0dW1fdHlwZV9pbmZvKFBMcGdTUUxfZXhlY3N0 YXRlICplc3RhdGUsCiAJCQkJKnR5cGVJZCA9IHJlY2ZpZWxkLT5maW5mby5mdHlwZWlkOwogCQkJ CSp0eXBNb2QgPSByZWNmaWVsZC0+ZmluZm8uZnR5cG1vZDsKIAkJCQkqY29sbGF0aW9uID0gcmVj ZmllbGQtPmZpbmZvLmZjb2xsYXRpb247CisJCQkJKnJlZm5hbWUgPSByZWNmaWVsZC0+ZmllbGRu YW1lOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC01NjAxLDYgKzU4OTQsNyBAQCBwbHBnc3FsX2V4 ZWNfZ2V0X2RhdHVtX3R5cGVfaW5mbyhQTHBnU1FMX2V4ZWNzdGF0ZSAqZXN0YXRlLAogCQkJKnR5 cGVJZCA9IEludmFsaWRPaWQ7CS8qIGtlZXAgY29tcGlsZXIgcXVpZXQgKi8KIAkJCSp0eXBNb2Qg PSAtMTsKIAkJCSpjb2xsYXRpb24gPSBJbnZhbGlkT2lkOworCQkJKnJlZm5hbWUgPSBOVUxMOwog CQkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3BsL3BscGdzcWwvc3JjL3BsX2Z1bmNz LmMgYi9zcmMvcGwvcGxwZ3NxbC9zcmMvcGxfZnVuY3MuYwppbmRleCA5MmNkOTExNmMwZS4uNzUx MWZhYjdlNjggMTAwNjQ0Ci0tLSBhL3NyYy9wbC9wbHBnc3FsL3NyYy9wbF9mdW5jcy5jCisrKyBi L3NyYy9wbC9wbHBnc3FsL3NyYy9wbF9mdW5jcy5jCkBAIC0yNTMsNiArMjUzLDggQEAgcGxwZ3Nx bF9zdG10X3R5cGVuYW1lKFBMcGdTUUxfc3RtdCAqc3RtdCkKIAkJCXJldHVybiBfKCJGT1Igb3Zl ciBjdXJzb3IiKTsKIAkJY2FzZSBQTFBHU1FMX1NUTVRfRk9SRUFDSF9BOgogCQkJcmV0dXJuIF8o IkZPUkVBQ0ggb3ZlciBhcnJheSIpOworCQljYXNlIFBMUEdTUUxfU1RNVF9GT1JFQUNIX0pTT05f QToKKwkJCXJldHVybiBfKCJGT1JFQUNIIG92ZXIganNvbiBhcnJheSIpOwogCQljYXNlIFBMUEdT UUxfU1RNVF9FWElUOgogCQkJcmV0dXJuICgoUExwZ1NRTF9zdG10X2V4aXQgKikgc3RtdCktPmlz X2V4aXQgPyAiRVhJVCIgOiAiQ09OVElOVUUiOwogCQljYXNlIFBMUEdTUUxfU1RNVF9SRVRVUk46 CkBAIC00NjcsNiArNDY5LDE0IEBAIHBscGdzcWxfc3RhdGVtZW50X3RyZWVfd2Fsa2VyX2ltcGwo UExwZ1NRTF9zdG10ICpzdG10LAogCQkJewogCQkJCVBMcGdTUUxfc3RtdF9mb3JlYWNoX2EgKmZz dG10ID0gKFBMcGdTUUxfc3RtdF9mb3JlYWNoX2EgKikgc3RtdDsKIAorCQkJCUVfV0FMSyhmc3Rt dC0+ZXhwcik7CisJCQkJU19MSVNUX1dBTEsoZnN0bXQtPmJvZHkpOworCQkJCWJyZWFrOworCQkJ fQorCQljYXNlIFBMUEdTUUxfU1RNVF9GT1JFQUNIX0pTT05fQToKKwkJCXsKKwkJCQlQTHBnU1FM X3N0bXRfZm9yZWFjaF9qc29uX2EgKmZzdG10ID0gKFBMcGdTUUxfc3RtdF9mb3JlYWNoX2pzb25f YSAqKSBzdG10OworCiAJCQkJRV9XQUxLKGZzdG10LT5leHByKTsKIAkJCQlTX0xJU1RfV0FMSyhm c3RtdC0+Ym9keSk7CiAJCQkJYnJlYWs7CkBAIC03OTUsNiArODA1LDcgQEAgc3RhdGljIHZvaWQg ZHVtcF9mb3JpKFBMcGdTUUxfc3RtdF9mb3JpICpzdG10KTsKIHN0YXRpYyB2b2lkIGR1bXBfZm9y cyhQTHBnU1FMX3N0bXRfZm9ycyAqc3RtdCk7CiBzdGF0aWMgdm9pZCBkdW1wX2ZvcmMoUExwZ1NR TF9zdG10X2ZvcmMgKnN0bXQpOwogc3RhdGljIHZvaWQgZHVtcF9mb3JlYWNoX2EoUExwZ1NRTF9z dG10X2ZvcmVhY2hfYSAqc3RtdCk7CitzdGF0aWMgdm9pZCBkdW1wX2ZvcmVhY2hfanNvbl9hKFBM cGdTUUxfc3RtdF9mb3JlYWNoX2pzb25fYSAqc3RtdCk7CiBzdGF0aWMgdm9pZCBkdW1wX2V4aXQo UExwZ1NRTF9zdG10X2V4aXQgKnN0bXQpOwogc3RhdGljIHZvaWQgZHVtcF9yZXR1cm4oUExwZ1NR TF9zdG10X3JldHVybiAqc3RtdCk7CiBzdGF0aWMgdm9pZCBkdW1wX3JldHVybl9uZXh0KFBMcGdT UUxfc3RtdF9yZXR1cm5fbmV4dCAqc3RtdCk7CkBAIC04NjEsNiArODcyLDkgQEAgZHVtcF9zdG10 KFBMcGdTUUxfc3RtdCAqc3RtdCkKIAkJY2FzZSBQTFBHU1FMX1NUTVRfRk9SRUFDSF9BOgogCQkJ ZHVtcF9mb3JlYWNoX2EoKFBMcGdTUUxfc3RtdF9mb3JlYWNoX2EgKikgc3RtdCk7CiAJCQlicmVh azsKKwkJY2FzZSBQTFBHU1FMX1NUTVRfRk9SRUFDSF9KU09OX0E6CisJCQlkdW1wX2ZvcmVhY2hf anNvbl9hKChQTHBnU1FMX3N0bXRfZm9yZWFjaF9qc29uX2EgKikgc3RtdCk7CisJCQlicmVhazsK IAkJY2FzZSBQTFBHU1FMX1NUTVRfRVhJVDoKIAkJCWR1bXBfZXhpdCgoUExwZ1NRTF9zdG10X2V4 aXQgKikgc3RtdCk7CiAJCQlicmVhazsKQEAgLTExNTcsNiArMTE3MSwyMSBAQCBkdW1wX2ZvcmVh Y2hfYShQTHBnU1FMX3N0bXRfZm9yZWFjaF9hICpzdG10KQogCXByaW50ZigiICAgIEVOREZPUkVB Q0hBIik7CiB9CiAKK3N0YXRpYyB2b2lkCitkdW1wX2ZvcmVhY2hfanNvbl9hKFBMcGdTUUxfc3Rt dF9mb3JlYWNoX2pzb25fYSAqc3RtdCkKK3sKKwlkdW1wX2luZCgpOworCXByaW50ZigiRk9SRUFD SEEgdmFyICVkICIsIHN0bXQtPnZhcm5vKTsKKwlwcmludGYoIklOIEpTT04gQVJSQVkgIik7CisJ ZHVtcF9leHByKHN0bXQtPmV4cHIpOworCXByaW50ZigiXG4iKTsKKworCWR1bXBfc3RtdHMoc3Rt dC0+Ym9keSk7CisKKwlkdW1wX2luZCgpOworCXByaW50ZigiICAgIEVOREZPUkVBQ0hBIik7Cit9 CisKIHN0YXRpYyB2b2lkCiBkdW1wX29wZW4oUExwZ1NRTF9zdG10X29wZW4gKnN0bXQpCiB7CmRp ZmYgLS1naXQgYS9zcmMvcGwvcGxwZ3NxbC9zcmMvcGxfZ3JhbS55IGIvc3JjL3BsL3BscGdzcWwv c3JjL3BsX2dyYW0ueQppbmRleCA1MDA5ZTU5YTc4Zi4uMjNiNDY1YjEwZDUgMTAwNjQ0Ci0tLSBh L3NyYy9wbC9wbHBnc3FsL3NyYy9wbF9ncmFtLnkKKysrIGIvc3JjL3BsL3BscGdzcWwvc3JjL3Bs X2dyYW0ueQpAQCAtMTc4LDYgKzE3OCw3IEBAIHN0YXRpYwl2b2lkCQkJY2hlY2tfcmFpc2VfcGFy YW1ldGVycyhQTHBnU1FMX3N0bXRfcmFpc2UgKnN0bXQpOwogCVBMcGdTUUxfZGlhZ19pdGVtICpk aWFnaXRlbTsKIAlQTHBnU1FMX3N0bXRfZmV0Y2ggKmZldGNoOwogCVBMcGdTUUxfY2FzZV93aGVu ICpjYXNld2hlbjsKKwlQTHBnU1FMX3N0bXRfZm9yZWFjaCAqZm9yZWFjaDsKIH0KIAogJXR5cGUg PGRlY2xoZHI+IGRlY2xfc2VjdApAQCAtMjIwLDYgKzIyMSw3IEBAIHN0YXRpYwl2b2lkCQkJY2hl Y2tfcmFpc2VfcGFyYW1ldGVycyhQTHBnU1FMX3N0bXRfcmFpc2UgKnN0bXQpOwogCiAldHlwZSA8 Y2FzZXdoZW4+CWNhc2Vfd2hlbgogJXR5cGUgPGxpc3Q+CWNhc2Vfd2hlbl9saXN0IG9wdF9jYXNl X2Vsc2UKKyV0eXBlIDxmb3JlYWNoPglmb3JlYWNoX3R5cGUKIAogJXR5cGUgPGJvb2xlYW4+CWdl dGRpYWdfYXJlYV9vcHQKICV0eXBlIDxsaXN0PglnZXRkaWFnX2xpc3QKQEAgLTM0MSw2ICszNDMs NyBAQCBzdGF0aWMJdm9pZAkJCWNoZWNrX3JhaXNlX3BhcmFtZXRlcnMoUExwZ1NRTF9zdG10X3Jh aXNlICpzdG10KTsKICV0b2tlbiA8a2V5d29yZD4JS19QUklOVF9TVFJJQ1RfUEFSQU1TCiAldG9r ZW4gPGtleXdvcmQ+CUtfUFJJT1IKICV0b2tlbiA8a2V5d29yZD4JS19RVUVSWQorJXRva2VuIDxr ZXl3b3JkPglLX0pTT04KICV0b2tlbiA8a2V5d29yZD4JS19SQUlTRQogJXRva2VuIDxrZXl3b3Jk PglLX1JFTEFUSVZFCiAldG9rZW4gPGtleXdvcmQ+CUtfUkVUVVJOCkBAIC0xNjcxLDE2ICsxNjc0 LDI5IEBAIGZvcl92YXJpYWJsZQk6IFRfREFUVU0KIAkJCQkJfQogCQkJCTsKIAotc3RtdF9mb3Jl YWNoX2EJOiBvcHRfbG9vcF9sYWJlbCBLX0ZPUkVBQ0ggZm9yX3ZhcmlhYmxlIGZvcmVhY2hfc2xp Y2UgS19JTiBLX0FSUkFZIGV4cHJfdW50aWxfbG9vcCBsb29wX2JvZHkKK3N0bXRfZm9yZWFjaF9h CTogb3B0X2xvb3BfbGFiZWwgS19GT1JFQUNIIGZvcl92YXJpYWJsZSBmb3JlYWNoX3NsaWNlIEtf SU4gZm9yZWFjaF90eXBlIGV4cHJfdW50aWxfbG9vcCBsb29wX2JvZHkKIAkJCQkJewotCQkJCQkJ UExwZ1NRTF9zdG10X2ZvcmVhY2hfYSAqbmV3OworCQkJCQkJUExwZ1NRTF9zdG10X2ZvcmVhY2gg Km5ldzsKIAotCQkJCQkJbmV3ID0gcGFsbG9jMF9vYmplY3QoUExwZ1NRTF9zdG10X2ZvcmVhY2hf YSk7Ci0JCQkJCQluZXctPmNtZF90eXBlID0gUExQR1NRTF9TVE1UX0ZPUkVBQ0hfQTsKKwkJCQkJ CW5ldyA9ICQ2OwogCQkJCQkJbmV3LT5saW5lbm8gPSBwbHBnc3FsX2xvY2F0aW9uX3RvX2xpbmVu byhAMiwgeXlzY2FubmVyKTsKIAkJCQkJCW5ldy0+c3RtdGlkID0gKytwbHBnc3FsX2N1cnJfY29t cGlsZS0+bnN0YXRlbWVudHM7CiAJCQkJCQluZXctPmxhYmVsID0gJDE7Ci0JCQkJCQluZXctPnNs aWNlID0gJDQ7CisKKwkJCQkJCWlmICgkNCA+IDApCisJCQkJCQl7CisJCQkJCQkJLyogc2xpY2lu ZyBpcyBzdXBwb3J0ZWQgb25seSBieSBGT1JFQUNIIElOIEFSUkFZICovCisJCQkJCQkJaWYgKG5l dy0+Y21kX3R5cGUgPT0gUExQR1NRTF9TVE1UX0ZPUkVBQ0hfQSkKKwkJCQkJCQl7CisJCQkJCQkJ CSgoUExwZ1NRTF9zdG10X2ZvcmVhY2hfYSAqKSBuZXcpLT5zbGljZSA9ICQ0OworCQkJCQkJCX0K KwkJCQkJCQllbHNlCisJCQkJCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJCQkJCQkJKGVycmNvZGUo RVJSQ09ERV9TWU5UQVhfRVJST1IpLAorCQkJCQkJCQkJCSBlcnJtc2coIm5vdCB6ZXJvIHNsaWNl IGlzIGFsbG93ZWQgb25seSBmb3IgYXJyYXlzIiksCisJCQkJCQkJCQkJCQkgcGFyc2VyX2VycnBv c2l0aW9uKEA0KSkpOworCQkJCQkJfQorCiAJCQkJCQluZXctPmV4cHIgPSAkNzsKIAkJCQkJCW5l dy0+Ym9keSA9ICQ4LnN0bXRzOwogCkBAIC0xNzE5LDYgKzE3MzUsMTkgQEAgZm9yZWFjaF9zbGlj ZQk6CiAJCQkJCX0KIAkJCQk7CiAKK2ZvcmVhY2hfdHlwZQk6CisJCQkJICBLX0FSUkFZCisJCQkJ CXsKKwkJCQkJCSQkID0gKFBMcGdTUUxfc3RtdF9mb3JlYWNoICopIHBhbGxvYzBfb2JqZWN0KFBM cGdTUUxfc3RtdF9mb3JlYWNoX2EpOworCQkJCQkJJCQtPmNtZF90eXBlID0gUExQR1NRTF9TVE1U X0ZPUkVBQ0hfQTsKKwkJCQkJfQorCQkJCXwgS19KU09OIEtfQVJSQVkKKwkJCQkJeworCQkJCQkJ JCQgPSAoUExwZ1NRTF9zdG10X2ZvcmVhY2ggKikgcGFsbG9jMF9vYmplY3QoUExwZ1NRTF9zdG10 X2ZvcmVhY2hfanNvbl9hKTsKKwkJCQkJCSQkLT5jbWRfdHlwZSA9IFBMUEdTUUxfU1RNVF9GT1JF QUNIX0pTT05fQTsKKwkJCQkJfQorCQkJCTsKKwogc3RtdF9leGl0CQk6IGV4aXRfdHlwZSBvcHRf bGFiZWwgb3B0X2V4aXRjb25kCiAJCQkJCXsKIAkJCQkJCVBMcGdTUUxfc3RtdF9leGl0ICpuZXc7 CmRpZmYgLS1naXQgYS9zcmMvcGwvcGxwZ3NxbC9zcmMvcGxfdW5yZXNlcnZlZF9rd2xpc3QuaCBi L3NyYy9wbC9wbHBnc3FsL3NyYy9wbF91bnJlc2VydmVkX2t3bGlzdC5oCmluZGV4IDYzNzllODZj OGNiLi5kNzU4OGQzYjRhZCAxMDA2NDQKLS0tIGEvc3JjL3BsL3BscGdzcWwvc3JjL3BsX3VucmVz ZXJ2ZWRfa3dsaXN0LmgKKysrIGIvc3JjL3BsL3BscGdzcWwvc3JjL3BsX3VucmVzZXJ2ZWRfa3ds aXN0LmgKQEAgLTY5LDYgKzY5LDcgQEAgUEdfS0VZV09SRCgiaW1wb3J0IiwgS19JTVBPUlQpCiBQ R19LRVlXT1JEKCJpbmZvIiwgS19JTkZPKQogUEdfS0VZV09SRCgiaW5zZXJ0IiwgS19JTlNFUlQp CiBQR19LRVlXT1JEKCJpcyIsIEtfSVMpCitQR19LRVlXT1JEKCJqc29uIiwgS19KU09OKQogUEdf S0VZV09SRCgibGFzdCIsIEtfTEFTVCkKIFBHX0tFWVdPUkQoImxvZyIsIEtfTE9HKQogUEdfS0VZ V09SRCgibWVyZ2UiLCBLX01FUkdFKQpkaWZmIC0tZ2l0IGEvc3JjL3BsL3BscGdzcWwvc3JjL3Bs cGdzcWwuaCBiL3NyYy9wbC9wbHBnc3FsL3NyYy9wbHBnc3FsLmgKaW5kZXggYWRkYjE0YTk5NTku LjRhMWU5YmE2NWJjIDEwMDY0NAotLS0gYS9zcmMvcGwvcGxwZ3NxbC9zcmMvcGxwZ3NxbC5oCisr KyBiL3NyYy9wbC9wbHBnc3FsL3NyYy9wbHBnc3FsLmgKQEAgLTExMiw2ICsxMTIsNyBAQCB0eXBl ZGVmIGVudW0gUExwZ1NRTF9zdG10X3R5cGUKIAlQTFBHU1FMX1NUTVRfRk9SUywKIAlQTFBHU1FM X1NUTVRfRk9SQywKIAlQTFBHU1FMX1NUTVRfRk9SRUFDSF9BLAorCVBMUEdTUUxfU1RNVF9GT1JF QUNIX0pTT05fQSwKIAlQTFBHU1FMX1NUTVRfRVhJVCwKIAlQTFBHU1FMX1NUTVRfUkVUVVJOLAog CVBMUEdTUUxfU1RNVF9SRVRVUk5fTkVYVCwKQEAgLTc2Niw2ICs3NjcsMjAgQEAgdHlwZWRlZiBz dHJ1Y3QgUExwZ1NRTF9zdG10X2R5bmZvcnMKIAlMaXN0CSAgICpwYXJhbXM7CQkJLyogVVNJTkcg ZXhwcmVzc2lvbnMgKi8KIH0gUExwZ1NRTF9zdG10X2R5bmZvcnM7CiAKKy8qCisgKiBGT1JFQUNI IGxvb3AgKGFuY2VzdG9yIElOIEFSUkFZIGFuZCBJTiBKU09OIEFSUkFZIGxvb3ApCisgKi8KK3R5 cGVkZWYgc3RydWN0IFBMcGdTUUxfc3RtdF9mb3JlYWNoCit7CisJUExwZ1NRTF9zdG10X3R5cGUg Y21kX3R5cGU7CisJaW50CQkJbGluZW5vOworCXVuc2lnbmVkIGludCBzdG10aWQ7CisJY2hhcgkg ICAqbGFiZWw7CisJaW50CQkJdmFybm87CQkJLyogbG9vcCB0YXJnZXQgdmFyaWFibGUgKi8KKwlQ THBnU1FMX2V4cHIgKmV4cHI7CQkJLyogc2V0IGV4cHJlc3Npb24gKi8KKwlMaXN0CSAgICpib2R5 OwkJCS8qIExpc3Qgb2Ygc3RhdGVtZW50cyAqLworfSBQTHBnU1FMX3N0bXRfZm9yZWFjaDsKKwog LyoKICAqIEZPUkVBQ0ggaXRlbSBpbiBhcnJheSBsb29wCiAgKi8KQEAgLTc3NiwxMSArNzkxLDI3 IEBAIHR5cGVkZWYgc3RydWN0IFBMcGdTUUxfc3RtdF9mb3JlYWNoX2EKIAl1bnNpZ25lZCBpbnQg c3RtdGlkOwogCWNoYXIJICAgKmxhYmVsOwogCWludAkJCXZhcm5vOwkJCS8qIGxvb3AgdGFyZ2V0 IHZhcmlhYmxlICovCi0JaW50CQkJc2xpY2U7CQkJLyogc2xpY2UgZGltZW5zaW9uLCBvciAwICov CiAJUExwZ1NRTF9leHByICpleHByOwkJCS8qIGFycmF5IGV4cHJlc3Npb24gKi8KIAlMaXN0CSAg ICpib2R5OwkJCS8qIExpc3Qgb2Ygc3RhdGVtZW50cyAqLworCS8qIGVuZCBvZiBmaWVsZHMgdGhh dCBtdXN0IG1hdGNoIFBMcGdTUUxfc3RtdF9mb3JlYWNoICovCisJaW50CQkJc2xpY2U7CQkJLyog c2xpY2UgZGltZW5zaW9uLCBvciAwICovCiB9IFBMcGdTUUxfc3RtdF9mb3JlYWNoX2E7CiAKKy8q CisgKiBGT1JFQUNIIGl0ZW0gaW4gYXJyYXkgbG9vcAorICovCit0eXBlZGVmIHN0cnVjdCBQTHBn U1FMX3N0bXRfZm9yZWFjaF9qc29uX2EKK3sKKwlQTHBnU1FMX3N0bXRfdHlwZSBjbWRfdHlwZTsK KwlpbnQJCQlsaW5lbm87CisJdW5zaWduZWQgaW50IHN0bXRpZDsKKwljaGFyCSAgICpsYWJlbDsK KwlpbnQJCQl2YXJubzsJCQkvKiBsb29wIHRhcmdldCB2YXJpYWJsZSAqLworCVBMcGdTUUxfZXhw ciAqZXhwcjsJCQkvKiBhcnJheSBleHByZXNzaW9uICovCisJTGlzdAkgICAqYm9keTsJCQkvKiBM aXN0IG9mIHN0YXRlbWVudHMgKi8KKwkvKiBlbmQgb2YgZmllbGRzIHRoYXQgbXVzdCBtYXRjaCBQ THBnU1FMX3N0bXRfZm9yZWFjaCAqLworfSBQTHBnU1FMX3N0bXRfZm9yZWFjaF9qc29uX2E7CisK IC8qCiAgKiBPUEVOIGEgY3VydmFyCiAgKi8KQEAgLTEyNzQsNyArMTMwNSw3IEBAIGV4dGVybiBQ R0RMTEVYUE9SVCBPaWQgcGxwZ3NxbF9leGVjX2dldF9kYXR1bV90eXBlKFBMcGdTUUxfZXhlY3N0 YXRlICplc3RhdGUsCiBleHRlcm4gdm9pZCBwbHBnc3FsX2V4ZWNfZ2V0X2RhdHVtX3R5cGVfaW5m byhQTHBnU1FMX2V4ZWNzdGF0ZSAqZXN0YXRlLAogCQkJCQkJCQkJCQkgUExwZ1NRTF9kYXR1bSAq ZGF0dW0sCiAJCQkJCQkJCQkJCSBPaWQgKnR5cGVJZCwgaW50MzIgKnR5cE1vZCwKLQkJCQkJCQkJ CQkJIE9pZCAqY29sbGF0aW9uKTsKKwkJCQkJCQkJCQkJIE9pZCAqY29sbGF0aW9uLCBjaGFyICoq cmVmbmFtZSk7CiAKIC8qCiAgKiBGdW5jdGlvbnMgZm9yIG5hbWVzcGFjZSBoYW5kbGluZyBpbiBw bF9mdW5jcy5jCmRpZmYgLS1naXQgYS9zcmMvcGwvcGxwZ3NxbC9zcmMvc3FsL3BscGdzcWxfZm9y ZWFjaC5zcWwgYi9zcmMvcGwvcGxwZ3NxbC9zcmMvc3FsL3BscGdzcWxfZm9yZWFjaC5zcWwKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLjdlN2FiZmUyNTY4Ci0tLSAvZGV2 L251bGwKKysrIGIvc3JjL3BsL3BscGdzcWwvc3JjL3NxbC9wbHBnc3FsX2ZvcmVhY2guc3FsCkBA IC0wLDAgKzEsODkgQEAKKy0tIG51bWVyaWMgdG8gbnVtZXJpYworZG8gJCQKK2RlY2xhcmUgeCBu dW1lcmljOworYmVnaW4KKyAgZm9yZWFjaCB4IGluIGpzb24gYXJyYXkgJ1sxMCwyMCwzMCwzLjE0 LCBudWxsXScKKyAgbG9vcAorICAgIHJhaXNlIG5vdGljZSAnJScsIHg7CisgIGVuZCBsb29wOwor ZW5kOworJCQ7CisKKy0tIG51bWVyaWMgdG8gaW50IGJ5IGNhc3QKK2RvICQkCitkZWNsYXJlIHgg aW50OworYmVnaW4KKyAgZm9yZWFjaCB4IGluIGpzb24gYXJyYXkgJ1sxMCwyMCwzMCwzLjE0LCBu dWxsXScKKyAgbG9vcAorICAgIHJhaXNlIG5vdGljZSAnJScsIHg7CisgIGVuZCBsb29wOworZW5k OworJCQ7CisKKy0tIGNvbnZlcnNpb24gIjMuMTQiIHRvIGludCBzaG91bGQgdG8gZmFpbCBkdWUg SU8gY2FzdAorZG8gJCQKK2RlY2xhcmUgeCBpbnQ7CitiZWdpbgorICBmb3JlYWNoIHggaW4ganNv biBhcnJheSAnWyIxMCIsMjAsMzAsIjMuMTQiXScKKyAgbG9vcAorICAgIHJhaXNlIG5vdGljZSAn JScsIHg7CisgIGVuZCBsb29wOworZW5kOworJCQ7CisKKy0tIGpzb25iIHRvIGpzb25iCitkbyAk JAorZGVjbGFyZSB4IGpzb25iOworYmVnaW4KKyAgZm9yZWFjaCB4IGluIGpzb24gYXJyYXkgJ1sx MCwyMCwzMCwzLjE0LCBudWxsLCAiSGkiXScKKyAgbG9vcAorICAgIHJhaXNlIG5vdGljZSAnJScs IHg7CisgIGVuZCBsb29wOworZW5kOworJCQ7CisKKy0tIGpzb25iIHRvIGpzb24KK2RvICQkCitk ZWNsYXJlIHgganNvbjsKK2JlZ2luCisgIGZvcmVhY2ggeCBpbiBqc29uIGFycmF5ICdbMTAsMjAs MzAsMy4xNCwgbnVsbCwgIkhpIl0nCisgIGxvb3AKKyAgICByYWlzZSBub3RpY2UgJyUnLCB4Owor ICBlbmQgbG9vcDsKK2VuZDsKKyQkOworCistLSBpdGVyYXRpb24gb3ZlciBjb21wb3NpdGVzCitk byAkJAorZGVjbGFyZSB4IGludDsgeSBudW1lcmljOyB6IHZhcmNoYXI7CitiZWdpbgorICBmb3Jl YWNoIHgsIHksIHogaW4ganNvbiBhcnJheSAnW3t9LCB7InoiOiJIaSJ9LCB7InkiOiAzLjE0fSwg eyJ6IjoiSGkiLCAieCI6MTAsICJ5IjozLjE0fV0nCisgIGxvb3AKKyAgICByYWlzZSBub3RpY2Ug J3g6ICUsIHk6ICUsIHo6ICUnLCB4LCB5LCB6OworICBlbmQgbG9vcDsKK2VuZDsKKyQkOworCitj cmVhdGUgdHlwZSB0MyBhcyAoeCBpbnQsIHkgbnVtZXJpYywgeiB2YXJjaGFyKTsKKworZG8gJCQK K2RlY2xhcmUgYyB0MzsKK2JlZ2luCisgIGZvcmVhY2ggYyBpbiBqc29uIGFycmF5ICdbe30sIHsi eiI6IkhpIn0sIHsieSI6IDMuMTR9LCB7InoiOiJIaSIsICJ4IjoxMCwgInkiOjMuMTR9XScKKyAg bG9vcAorICAgIHJhaXNlIG5vdGljZSAneDogJSwgeTogJSwgejogJScsIGMueCwgYy55LCBjLno7 CisgIGVuZCBsb29wOworZW5kOworJCQ7CisKK2RvICQkCitkZWNsYXJlIGMgdDM7CitiZWdpbgor ICBmb3JlYWNoIGMueCwgYy55LCBjLnogaW4ganNvbiBhcnJheSAnW3t9LCB7InoiOiJIaSJ9LCB7 InkiOiAzLjE0fSwgeyJ6IjoiSGkiLCAieCI6MTAsICJ5IjozLjE0fV0nCisgIGxvb3AKKyAgICBy YWlzZSBub3RpY2UgJ3g6ICUsIHk6ICUsIHo6ICUnLCBjLngsIGMueSwgYy56OworICBlbmQgbG9v cDsKK2VuZDsKKyQkOworCitkcm9wIHR5cGUgdDM7Ci0tIAoyLjUzLjAKCg== --00000000000028821c064bdd1098--