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 1tSguM-000pMC-Da for pgsql-hackers@arkaria.postgresql.org; Tue, 31 Dec 2024 18:23:59 +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 1tSguL-004ObO-QD for pgsql-hackers@arkaria.postgresql.org; Tue, 31 Dec 2024 18:23:57 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tSguL-004ObG-A9 for pgsql-hackers@lists.postgresql.org; Tue, 31 Dec 2024 18:23:57 +0000 Received: from mail-wr1-x431.google.com ([2a00:1450:4864:20::431]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1tSguH-002XkE-MS for pgsql-hackers@postgresql.org; Tue, 31 Dec 2024 18:23:56 +0000 Received: by mail-wr1-x431.google.com with SMTP id ffacd0b85a97d-3863494591bso5506510f8f.1 for ; Tue, 31 Dec 2024 10:23:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1735669433; x=1736274233; darn=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=ivttid0UZV0PiGJTORQkyCLyt6WKbrgyW9yh6W9OEbg=; b=jJJ0AOjEd2l+1dLNr1cKaPJKj92uD1ERQePHabNDvh+NRbpygRtYc4MzrBkhceP3z0 eJhEQPaoX/9XgBUPbEFfPeJV7G2WhgrDQkCI7wv9z3IRNTXiJPiP5MW6ydLD0MmJYYPN NzZLAxXdrXsdbfIZ5ihHdU+st9gdZ/5oUNRHVZ3soP0ci1rXDbFyqfYjgCLSUYfDHdTY 8AkErv8Q7+DngAeJdr9V1pdA3eHqIXh3P5vhIYhTH2m2k0rL7AJEy+83gOV91hdGugXC uqx7aHpaTYmh30Gq+jPvx7uZXbLUgQPk6Es5E8dISxe8M4FEQg7JYlgW/Hako4OEMsF5 8TqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1735669433; x=1736274233; 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=ivttid0UZV0PiGJTORQkyCLyt6WKbrgyW9yh6W9OEbg=; b=sTCk3LityU/hoBON+EtV9oF+0fcP/zHzl9ish+Q5H5oLzVX+Cwa2hHUmJM1ZTM4aIj Gi0RO/yvgH+6Q1cqpTKZXsrkimV/QGo0bOUAvXtPx4/9QiRngXtRZVOXrN9K0nQg0ZOH QKPONOrLwQu6nu3yRzSx+eGNbTu0DYB1eBvLDQ+n1wgYYAeZW6QFBPa5+wDgV25ISPpL h5nqhUTVVzbzocagqe+skXno2Jeb8hQiT69CpFkzclOarLTW84tZAr9Giq5DvRP5AAVF +osr7yHcLjk2sdE3vVRNNk0beK3AYgPWrUIPRJwsR0cgJV1+L3vckc6UaJ2dCvdgOqbO xYUA== X-Forwarded-Encrypted: i=1; AJvYcCW3wIO2Yxj/ISuRhurny1+G+F0uavQNIdhuFJzxNGrZWewfCUOEYkjHRXbCOuGS1+fVnj8ArRd452NNCVa/@postgresql.org X-Gm-Message-State: AOJu0YxHb67xFFTEhGcZfKJX4YLJ8jr9x59MN5u3pNvY9QdC3xKMctrG gPJwaXkXa0Z7dZ+CRuLKcruZh/l7ePTokaZDxx7uK7B2M5KSiZc+ZMA82lYRejOQuZbWEzE6ME/ WK5xpMfm51Nbuogrf+TP9LmpB3es= X-Gm-Gg: ASbGnctsGK0RDa8rwk4phuphq4U7BFX/4+6uA0x+h6CVUrRmYkiUpHLsO38Em3y/jBG 0aiYZapBD2xc0CzGWHXKO7aJeQ0wX6xUBMsJbVyqG X-Google-Smtp-Source: AGHT+IFE4qGNNIPT4Su2KoC+Gr9vP0UfFBqqoHVOsw4OPGwnEiUZa/BW+H6C1w18/WcBsrvcGLYQnMZQrZQNYF2Ev8A= X-Received: by 2002:a5d:6c66:0:b0:385:f7ef:a57f with SMTP id ffacd0b85a97d-38a22200168mr31314352f8f.27.1735669432564; Tue, 31 Dec 2024 10:23:52 -0800 (PST) MIME-Version: 1.0 References: <740696.1718036463@sss.pgh.pa.us> In-Reply-To: From: Mahendra Singh Thalor Date: Tue, 31 Dec 2024 23:53:40 +0530 Message-ID: Subject: Re: Non-text mode for pg_dumpall To: Magnus Hagander Cc: Tom Lane , Nathan Bossart , Andrew Dunstan , PostgreSQL-development , Dilip Kumar Content-Type: multipart/mixed; boundary="000000000000f9e90b062a9507e3" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000f9e90b062a9507e3 Content-Type: multipart/alternative; boundary="000000000000f9e908062a9507e1" --000000000000f9e908062a9507e1 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi all, With the help of Andrew and Dilip Kumar, I made a poc patch to dump all the databases in archive format and then restore them using pg_restore. Brief about the patch: new option to pg_dumpall: -F, --format=3Dd|p (directory|plain) output file format (directory, plain text (default)) Ex: ./pg_dumpall --format=3Ddirectory --file=3DdumpDirName dumps are as: global.dat ::: global sql commands in simple plain format map.dat. ::: dboid dbname ---entries for all databases in simple text for= m databases. ::: subdir dboid1 -> toc.dat and data files in archive format subdir dboid2. -> toc.dat and data files in archive format etc --------------------------------------------------------------------------- new options to pg_restore: -g, --globals-only restore only global objects, no databases --exclude-database=3DPATTERN exclude databases whose name matches PATTERN When we give -g/--globals-only option, then only restore globals, no db restoring. *Design*: When --format=3Ddirectory is specified and there is no toc.dat file in the main directory, then check for global.dat and map.dat to restore all databases. If both files exist in a directory, then first restore all globals from global.dat and then restore all databases one by one from map.dat list. While restoring, skip the databases that are given with exclude-database. --------------------------------------------------------------------------- NOTE: if needed, restore single db by particular subdir Ex: ./pg_restore --format=3Ddirectory -d postgres dumpDirName/databases/5 -- here, 5 is the dboid of postgres db -- to get dboid, refer dbname in map.file -------------------------------------------------------------------------- Please let me know feedback for the attached patch. On Tue, 11 Jun 2024 at 01:06, Magnus Hagander wrote: > On Mon, Jun 10, 2024 at 6:21=E2=80=AFPM Tom Lane wrot= e: > >> Magnus Hagander writes: >> > On Mon, Jun 10, 2024 at 5:03=E2=80=AFPM Nathan Bossart < >> nathandbossart@gmail.com> >> > wrote: >> >> Is there a particular advantage to that approach as opposed to just >> using >> >> "directory" mode for everything? >> >> > A gazillion files to deal with? Much easier to work with individual >> custom >> > files if you're moving databases around and things like that. >> > Much easier to monitor eg sizes/dates if you're using it for backups. >> >> You can always tar up the directory tree after-the-fact if you want >> one file. Sure, that step's not parallelized, but I think we'd need >> some non-parallelized copying to create such a file anyway. >> > > That would require double the disk space. > > But you can also just run pg_dump manually on each database and a > pg_dumpall -g like people are doing today -- I thought this whole thing w= as > about making it more convenient :) > > -- > Magnus Hagander > Me: https://www.hagander.net/ > Work: https://www.redpill-linpro.com/ > --=20 Thanks and Regards Mahendra Singh Thalor EnterpriseDB: http://www.enterprisedb.com --000000000000f9e908062a9507e1 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi all,
With the help of Andrew and D= ilip Kumar, I made a poc patch to dump all the databases in archive format = and then restore=C2=A0them using pg_restore.

Brief= about the patch:
new option to pg_dumpall:
-F, --format=3Dd|p= (directory|plain) output file format (directory, plain text (default))
=
Ex: ./pg_dumpall --format=3Ddirectory --file=3DdumpDirName

dumps= are as:
global.dat ::: global sql commands in simple plain format
ma= p.dat. =C2=A0 ::: dboid dbname ---entries for all databases in simple text = form
databases. :::
=C2=A0 =C2=A0 =C2=A0 subdir =C2=A0 =C2=A0 dboid1 = =C2=A0-> toc.dat and data files in archive format
=C2=A0 =C2=A0 =C2= =A0 subdir =C2=A0 =C2=A0 dboid2. -> toc.dat and data files in archive fo= rmat
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 etc
-----------= ----------------------------------------------------------------

new= options to pg_restore:
-g, --globals-only =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 restore only global objects, no databases
--exclude-database=3DPA= TTERN =C2=A0 exclude databases whose name matches PATTERN

When we gi= ve -g/--globals-only option, then only restore globals, no db restoring.

Design:
When --format=3Ddirectory is speci= fied and there is no toc.dat file in the main directory, then check
for = global.dat and map.dat to restore all databases. If both files exist in a d= irectory,
then first restore all globals from global.dat and then restor= e all databases one by one
from map.dat list.
While restoring,= skip the databases=C2=A0that are given=C2=A0with exclude-database.

---------------------------------------------------------= ------------------
NOTE:
if needed, restore single db by particular s= ubdir

Ex: ./pg_restore --format=3Ddirectory -d postgres dumpDirName/= databases/5
=C2=A0 =C2=A0-- here, 5 is the dboid of postgres db
=C2= =A0 =C2=A0-- to get dboid, refer dbname in map.file
--------------------= ------------------------------------------------------

=
Please let me know feedback for the attached=C2=A0patch.
On Tue, 11 Jun 2024 at 01:06, Magnus Hagander <magnus@hagander.net> wrote:
On Mon, Jun 10, 2024 at 6:21=E2=80=AFPM Tom Lane <tgl@sss.pgh.pa.us> wrote:=
Magnus Hagander <magnus@hagander.net> writes:
> On Mon, Jun 10, 2024 at 5:03=E2=80=AFPM Nathan Bossart <nathandbossart@gmail.com= >
> wrote:
>> Is there a particular advantage to that approach as opposed to jus= t using
>> "directory" mode for everything?

> A gazillion files to deal with? Much easier to work with individual cu= stom
> files if you're moving databases around and things like that.
> Much easier to monitor eg sizes/dates if you're using it for backu= ps.

You can always tar up the directory tree after-the-fact if you want
one file.=C2=A0 Sure, that step's not parallelized, but I think we'= d need
some non-parallelized copying to create such a file anyway.

That would require double the disk space.
But you can also just run pg_dump manually on each database an= d a pg_dumpall -g like people are doing today -- I thought this whole thing= was about making it more convenient :)
=C2=A0
--
=C2=A0Magnus Hagander
=C2=A0Me: https://www.hagander.net= /
=C2=A0Work: https://www.redpill-linpro.com/


--
Thanks and Regards
Mahendra Singh Thalor
EnterpriseDB: http://www.enterprise= db.com
--000000000000f9e908062a9507e1-- --000000000000f9e90b062a9507e3 Content-Type: application/octet-stream; name="v01_poc_pg_dumpall_with_directory_31dec.patch" Content-Disposition: attachment; filename="v01_poc_pg_dumpall_with_directory_31dec.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m5csp4yd0 RnJvbSAzMzI1MzBjMTdmMmZiNDZhZjU1NzkxZTdjN2VlNjM5Mzc2N2EyOWViIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYWhlbmRyYSBTaW5naCBUaGFsb3IgPG1haGk2cnVuQGdtYWls LmNvbT4KRGF0ZTogVHVlLCAzMSBEZWMgMjAyNCAwOTo1ODoyMCAtMDgwMApTdWJqZWN0OiBbUEFU Q0hdIHBnX2R1bXBhbGwgd2l0aCBkaXJlY3RvcnkgZm9ybWF0IGFuZCByZXN0b3JlIGl0IGJ5IHBn X3Jlc3RvcmUKCm5ldyBvcHRpb24gdG8gcGdfZHVtcGFsbDoKLUYsIC0tZm9ybWF0PWR8cHxkaXJl Y3Rvcnl8cGxhaW4gb3V0cHV0IGZpbGUgZm9ybWF0IChkaXJlY3RvcnksIHBsYWluIHRleHQgKGRl ZmF1bHQpKQoKRXg6IC4vcGdfZHVtcGFsbCAtLWZvcm1hdD1kaXJlY3RvcnkgLS1maWxlPWR1bXBE aXJOYW1lCgpkdW1wcyBhcmUgYXM6Cmdsb2JhbC5kYXQgOjo6IGdsb2JhbCBzcWwgY29tbWFuZHMg aW4gc2ltcGxlIHBsYWluIGZvcm1hdAptYXAuZGF0LiAgIDo6OiBkYm9pZCBkYm5hbWUgLS0tZW50 cmllcyBmb3IgYWxsIGRhdGFiYXNlcyBpbiBzaW1wbGUgdGV4dCBmb3JtCmRhdGFiYXNlcy4gOjo6 CiAgICAgIHN1YmRpciAgICAgZGJvaWQxICAtPiB0b2MuZGF0IGFuZCBkYXRhIGZpbGVzIGluIGFy Y2hpdmUgZm9ybWF0CiAgICAgIHN1YmRpciAgICAgZGJvaWQyLiAtPiB0b2MuZGF0IGFuZCBkYXRh IGZpbGVzIGluIGFyY2hpdmUgZm9ybWF0CiAgICAgICAgICAgICAgZXRjCi0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQpOT1RFOgppZiBuZWVkZWQsIHJlc3RvcmUgc2luZ2xlIGRiIGJ5IHBhcnRpY3VsYXIgc3Vi ZGlyCgpFeDogLi9wZ19yZXN0b3JlIC0tZm9ybWF0PWRpcmVjdG9yeSAtZCBwb3N0Z3JlcyBkdW1w RGlyTmFtZS9kYXRhYmFzZXMvNQogICAtLSBoZXJlLCA1IGlzIHRoZSBkYm9pZCBvZiBwb3N0Z3Jl cyBkYgogICAtLSB0byBnZXQgZGJvaWQsIHJlZmVyIGRibmFtZSBpbiBtYXAuZmlsZQoKLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KbmV3IG9wdGlvbnMgdG8gcGdfcmVzdG9yZToKLWcsIC0tZ2xvYmFscy1vbmx5 ICAgICAgICAgICByZXN0b3JlIG9ubHkgZ2xvYmFsIG9iamVjdHMsIG5vIGRhdGFiYXNlcwotLWV4 Y2x1ZGUtZGF0YWJhc2U9UEFUVEVSTiAgIGV4Y2x1ZGUgZGF0YWJhc2VzIHdob3NlIG5hbWUgbWF0 Y2hlcyBQQVRURVJOCgpXaGVuIHdlIGdpdmUgLWcvLS1nbG9iYWxzLW9ubHkgb3B0aW9uLCB0aGVu IG9ubHkgcmVzdG9yZSBnbG9iYWxzLCBubyBkYiByZXN0b3JpbmcuCgpEZXNpZ246CldoZW4gLS1m b3JtYXQ9ZGlyZWN0b3J5IGlzIHNwZWNpZmllZCBhbmQgdGhlcmUgaXMgbm8gdG9jLmRhdCBpbiBt YWluIGRpcmVjdG9yeSwgdGhlbiBjaGVjawpmb3IgZ2xvYmFsLmRhdCBhbmQgbWFwLmRhdCB0byBy ZXN0b3JlIGFsbCBkYXRhYmFzZXMuIElmIGJvdGggZmlsZXMgYXJlIGV4aXN0cyBpbiBkaXJlY3Rv cnksCnRoZW4gZmlyZXN0IHJlc3RvcmUgYWxsIGdsb2JhbHMgZnJvbSBnbG9iYWwuZGF0IGFuZCB0 aGVuIHJlc3RvcmUgYWxsIGRhdGFiYXNlcyBvbmUgYnkgb25lCmZyb20gbWFwLmRhdCBsaXN0Lgot LS0KIGRvYy9zcmMvc2dtbC9yZWYvcGdfZHVtcGFsbC5zZ21sIHwgIDMwICsrCiBkb2Mvc3JjL3Nn bWwvcmVmL3BnX3Jlc3RvcmUuc2dtbCB8ICAzMCArKwogc3JjL2Jpbi9wZ19kdW1wL3BnX2R1bXBh bGwuYyAgICAgfCAxMzggKysrKysrKystLQogc3JjL2Jpbi9wZ19kdW1wL3BnX3Jlc3RvcmUuYyAg ICAgfCA1NzEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCiA0IGZpbGVz IGNoYW5nZWQsIDczOSBpbnNlcnRpb25zKCspLCAzMCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg YS9kb2Mvc3JjL3NnbWwvcmVmL3BnX2R1bXBhbGwuc2dtbCBiL2RvYy9zcmMvc2dtbC9yZWYvcGdf ZHVtcGFsbC5zZ21sCmluZGV4IDAxNGYyNzkuLmI2YzlmZWIgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMv c2dtbC9yZWYvcGdfZHVtcGFsbC5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9yZWYvcGdfZHVtcGFs bC5zZ21sCkBAIC01ODIsNiArNTgyLDM2IEBAIGV4Y2x1ZGUgZGF0YWJhc2UgPHJlcGxhY2VhYmxl IGNsYXNzPSJwYXJhbWV0ZXIiPlBBVFRFUk48L3JlcGxhY2VhYmxlPgogICAgICAgPC9saXN0aXRl bT4KICAgICAgPC92YXJsaXN0ZW50cnk+CiAKKyAgICA8dmFybGlzdGVudHJ5PgorICAgICAgPHRl cm0+PG9wdGlvbj4tRiA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+Zm9ybWF0PC9yZXBs YWNlYWJsZT48L29wdGlvbj48L3Rlcm0+CisgICAgICA8dGVybT48b3B0aW9uPi0tZm9ybWF0PTxy ZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5mb3JtYXQ8L3JlcGxhY2VhYmxlPjwvb3B0aW9u PjwvdGVybT4KKyAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgU3BlY2lm eSBmb3JtYXQgb2YgZHVtcCBmaWxlcy4gIElmIHdlIHdhbnQgdG8gZHVtcCBhbGwgdGhlIGRhdGFi YXNlcywgdGhlbiBwYXNzIHRoaXMgYXMgZGlyZWN0b3J5IHNvIHRoYXQgZHVtcCBvZiBhbGwgZGF0 YWJhc2VzIGNhbiBiZSB0YWtlbiBpbiBzZXBhcmF0ZSBzdWJkaXJlY3RvcnkgaW4gYXJjaGl2ZSBm b3JtYXQuCitieSBkZWZhdWx0LCB0aGlzIGlzIHBsYWluLgorCisgICAgICAgPHZhcmlhYmxlbGlz dD4KKyAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgIDx0ZXJtPjxsaXRlcmFsPmQ8L2xp dGVyYWw+PC90ZXJtPgorICAgICAgICAgPHRlcm0+PGxpdGVyYWw+ZGlyZWN0b3J5PC9saXRlcmFs PjwvdGVybT4KKyAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAg ICAgVGhlIGFyY2hpdmUgaXMgYSBkaXJlY3RvcnkgYXJjaGl2ZS4KKyAgICAgICAgICA8L3BhcmE+ CisgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICAg IDx2YXJpYWJsZWxpc3Q+CisgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICA8dGVybT48 bGl0ZXJhbD5wPC9saXRlcmFsPjwvdGVybT4KKyAgICAgICAgIDx0ZXJtPjxsaXRlcmFsPnBsYWlu PC9saXRlcmFsPjwvdGVybT4KKyAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8cGFyYT4K KyAgICAgICAgICAgVGhlIGFyY2hpdmUgaXMgYSBwbGFpbiBhcmNoaXZlLihieSBkZWZhdWx0IGFs c28pCisgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC92 YXJsaXN0ZW50cnk+CisKICAgICAgPHZhcmxpc3RlbnRyeT4KICAgICAgICA8dGVybT48b3B0aW9u Pi0/PC9vcHRpb24+PC90ZXJtPgogICAgICAgIDx0ZXJtPjxvcHRpb24+LS1oZWxwPC9vcHRpb24+ PC90ZXJtPgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL3JlZi9wZ19yZXN0b3JlLnNnbWwgYi9k b2Mvc3JjL3NnbWwvcmVmL3BnX3Jlc3RvcmUuc2dtbAppbmRleCBiOGIyN2UxLi5hYjJlMDM1IDEw MDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvcmVmL3BnX3Jlc3RvcmUuc2dtbAorKysgYi9kb2Mvc3Jj L3NnbWwvcmVmL3BnX3Jlc3RvcmUuc2dtbApAQCAtMzE2LDYgKzMxNiwxNiBAQCBQb3N0Z3JlU1FM IGRvY3VtZW50YXRpb24KICAgICAgPC92YXJsaXN0ZW50cnk+CiAKICAgICAgPHZhcmxpc3RlbnRy eT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+LWc8L29wdGlvbj48L3Rlcm0+CisgICAgICA8dGVybT48 b3B0aW9uPi0tZ2xvYmFscy1vbmx5PC9vcHRpb24+PC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgor ICAgICAgIDxwYXJhPgorICAgICAgICBSZXN0b3JlIG9ubHkgZ2xvYmFsIG9iamVjdHMgKHJvbGVz IGFuZCB0YWJsZXNwYWNlcyksIG5vIGRhdGFiYXNlcy4KKyAgICAgICA8L3BhcmE+CisgICAgICA8 L2xpc3RpdGVtPgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICA8dmFybGlzdGVudHJ5Pgog ICAgICAgPHRlcm0+PG9wdGlvbj4tSSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+aW5k ZXg8L3JlcGxhY2VhYmxlPjwvb3B0aW9uPjwvdGVybT4KICAgICAgIDx0ZXJtPjxvcHRpb24+LS1p bmRleD08cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+aW5kZXg8L3JlcGxhY2VhYmxlPjwv b3B0aW9uPjwvdGVybT4KICAgICAgIDxsaXN0aXRlbT4KQEAgLTkzMiw2ICs5NDIsMjYgQEAgUG9z dGdyZVNRTCBkb2N1bWVudGF0aW9uCiAgICAgICA8L2xpc3RpdGVtPgogICAgICA8L3Zhcmxpc3Rl bnRyeT4KIAorICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgPHRlcm0+PG9wdGlvbj4tLWV4Y2x1 ZGUtZGF0YWJhc2U9PHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPnBhdHRlcm48L3JlcGxh Y2VhYmxlPjwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8cGFyYT4K KyAgICAgICAgRG8gbm90IHJlc3RvcmUgZGF0YWJhc2VzIHdob3NlIG5hbWUgbWF0Y2hlcworICAg ICAgICA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+cGF0dGVybjwvcmVwbGFjZWFibGU+ LgorICAgICAgICBNdWx0aXBsZSBwYXR0ZXJucyBjYW4gYmUgZXhjbHVkZWQgYnkgd3JpdGluZyBt dWx0aXBsZQorICAgICAgICA8b3B0aW9uPi0tZXhjbHVkZS1kYXRhYmFzZTwvb3B0aW9uPiBzd2l0 Y2hlcy4gIFRoZQorICAgICAgICA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+cGF0dGVy bjwvcmVwbGFjZWFibGU+IHBhcmFtZXRlciBpcworICAgICAgICBpbnRlcnByZXRlZCBhcyBhIHBh dHRlcm4gYWNjb3JkaW5nIHRvIHRoZSBzYW1lIHJ1bGVzIHVzZWQgYnkKKyAgICAgICAgPGFwcGxp Y2F0aW9uPnBzcWw8L2FwcGxpY2F0aW9uPidzIDxsaXRlcmFsPlxkPC9saXRlcmFsPgorICAgICAg ICBjb21tYW5kcyAoc2VlIDx4cmVmIGxpbmtlbmQ9ImFwcC1wc3FsLXBhdHRlcm5zIi8+KSwKKyAg ICAgICAgc28gbXVsdGlwbGUgZGF0YWJhc2VzIGNhbiBhbHNvIGJlIGV4Y2x1ZGVkIGJ5IHdyaXRp bmcgd2lsZGNhcmQKKyAgICAgICAgY2hhcmFjdGVycyBpbiB0aGUgcGF0dGVybi4gIFdoZW4gdXNp bmcgd2lsZGNhcmRzLCBiZSBjYXJlZnVsIHRvCisgICAgICAgIHF1b3RlIHRoZSBwYXR0ZXJuIGlm IG5lZWRlZCB0byBwcmV2ZW50IHNoZWxsIHdpbGRjYXJkIGV4cGFuc2lvbi4KKyAgICAgICA8L3Bh cmE+CisgICAgICA8L2xpc3RpdGVtPgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKworCiAgICAgPC92 YXJpYWJsZWxpc3Q+CiAgICA8L3BhcmE+CiAgPC9yZWZzZWN0MT4KZGlmZiAtLWdpdCBhL3NyYy9i aW4vcGdfZHVtcC9wZ19kdW1wYWxsLmMgYi9zcmMvYmluL3BnX2R1bXAvcGdfZHVtcGFsbC5jCmlu ZGV4IDlhMDRlNTEuLmE3NDg5NjIgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcGdfZHVtcC9wZ19kdW1w YWxsLmMKKysrIGIvc3JjL2Jpbi9wZ19kdW1wL3BnX2R1bXBhbGwuYwpAQCAtMTUsNiArMTUsNyBA QAogCiAjaW5jbHVkZSAicG9zdGdyZXNfZmUuaCIKIAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAj aW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCkBAIC0yOSw2ICszMCw3IEBA CiAjaW5jbHVkZSAiZmlsdGVyLmgiCiAjaW5jbHVkZSAiZ2V0b3B0X2xvbmcuaCIKICNpbmNsdWRl ICJwZ19iYWNrdXAuaCIKKyNpbmNsdWRlICJwZ19iYWNrdXBfYXJjaGl2ZXIuaCIKIAogLyogdmVy c2lvbiBzdHJpbmcgd2UgZXhwZWN0IGJhY2sgZnJvbSBwZ19kdW1wICovCiAjZGVmaW5lIFBHRFVN UF9WRVJTSU9OU1RSICJwZ19kdW1wIChQb3N0Z3JlU1FMKSAiIFBHX1ZFUlNJT04gIlxuIgpAQCAt NjQsOSArNjYsMTAgQEAgc3RhdGljIHZvaWQgZHJvcFRhYmxlc3BhY2VzKFBHY29ubiAqY29ubik7 CiBzdGF0aWMgdm9pZCBkdW1wVGFibGVzcGFjZXMoUEdjb25uICpjb25uKTsKIHN0YXRpYyB2b2lk IGRyb3BEQnMoUEdjb25uICpjb25uKTsKIHN0YXRpYyB2b2lkIGR1bXBVc2VyQ29uZmlnKFBHY29u biAqY29ubiwgY29uc3QgY2hhciAqdXNlcm5hbWUpOwotc3RhdGljIHZvaWQgZHVtcERhdGFiYXNl cyhQR2Nvbm4gKmNvbm4pOworc3RhdGljIHZvaWQgZHVtcERhdGFiYXNlcyhQR2Nvbm4gKmNvbm4s IGJvb2wgZGlyZWN0b3J5X2Zvcm1hdCk7CiBzdGF0aWMgdm9pZCBkdW1wVGltZXN0YW1wKGNvbnN0 IGNoYXIgKm1zZyk7Ci1zdGF0aWMgaW50CXJ1blBnRHVtcChjb25zdCBjaGFyICpkYm5hbWUsIGNv bnN0IGNoYXIgKmNyZWF0ZV9vcHRzKTsKK3N0YXRpYyBpbnQgcnVuUGdEdW1wKGNvbnN0IGNoYXIg KmRibmFtZSwgY29uc3QgY2hhciAqY3JlYXRlX29wdHMsCisJCQkJCSBjaGFyICpkYmZpbGUpOwog c3RhdGljIHZvaWQgYnVpbGRTaFNlY0xhYmVscyhQR2Nvbm4gKmNvbm4sCiAJCQkJCQkJIGNvbnN0 IGNoYXIgKmNhdGFsb2dfbmFtZSwgT2lkIG9iamVjdElkLAogCQkJCQkJCSBjb25zdCBjaGFyICpv Ymp0eXBlLCBjb25zdCBjaGFyICpvYmpuYW1lLApAQCAtMTQ3LDYgKzE1MCw3IEBAIG1haW4oaW50 IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIAkJeyJwYXNzd29yZCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAn Vyd9LAogCQl7Im5vLXByaXZpbGVnZXMiLCBub19hcmd1bWVudCwgTlVMTCwgJ3gnfSwKIAkJeyJu by1hY2wiLCBub19hcmd1bWVudCwgTlVMTCwgJ3gnfSwKKwkJeyJmb3JtYXQiLCByZXF1aXJlZF9h cmd1bWVudCwgTlVMTCwgJ0YnfSwKIAogCQkvKgogCQkgKiB0aGUgZm9sbG93aW5nIG9wdGlvbnMg ZG9uJ3QgaGF2ZSBhbiBlcXVpdmFsZW50IHNob3J0IG9wdGlvbiBsZXR0ZXIKQEAgLTE4OCwxMSAr MTkyLDEzIEBAIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKIAljaGFyCSAgICpwZ2RiID0g TlVMTDsKIAljaGFyCSAgICp1c2Vfcm9sZSA9IE5VTEw7CiAJY29uc3QgY2hhciAqZHVtcGVuY29k aW5nID0gTlVMTDsKKwljb25zdCBjaGFyICpmb3JtYXQ7CiAJdHJpdmFsdWUJcHJvbXB0X3Bhc3N3 b3JkID0gVFJJX0RFRkFVTFQ7CiAJYm9vbAkJZGF0YV9vbmx5ID0gZmFsc2U7CiAJYm9vbAkJZ2xv YmFsc19vbmx5ID0gZmFsc2U7CiAJYm9vbAkJcm9sZXNfb25seSA9IGZhbHNlOwogCWJvb2wJCXRh Ymxlc3BhY2VzX29ubHkgPSBmYWxzZTsKKwlib29sCQlkaXJlY3RvcnlfZm9ybWF0ID0gZmFsc2U7 CiAJUEdjb25uCSAgICpjb25uOwogCWludAkJCWVuY29kaW5nOwogCWNvbnN0IGNoYXIgKnN0ZF9z dHJpbmdzOwpAQCAtMjM3LDcgKzI0Myw3IEBAIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkK IAogCXBnZHVtcG9wdHMgPSBjcmVhdGVQUUV4cEJ1ZmZlcigpOwogCi0Jd2hpbGUgKChjID0gZ2V0 b3B0X2xvbmcoYXJnYywgYXJndiwgImFjZDpFOmY6Z2g6bDpPcDpyc1M6dFU6dndXeCIsIGxvbmdf b3B0aW9ucywgJm9wdGluZGV4KSkgIT0gLTEpCisJd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJn YywgYXJndiwgImFjZDpFOmY6RjpnaDpsOk9wOnJzUzp0VTp2d1d4IiwgbG9uZ19vcHRpb25zLCAm b3B0aW5kZXgpKSAhPSAtMSkKIAl7CiAJCXN3aXRjaCAoYykKIAkJewpAQCAtMjY1LDcgKzI3MSwx NyBAQCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiAJCQkJYXBwZW5kUFFFeHBCdWZmZXJT dHIocGdkdW1wb3B0cywgIiAtZiAiKTsKIAkJCQlhcHBlbmRTaGVsbFN0cmluZyhwZ2R1bXBvcHRz LCBmaWxlbmFtZSk7CiAJCQkJYnJlYWs7Ci0KKwkJCWNhc2UgJ0YnOgorCQkJCWZvcm1hdCA9IG9w dGFyZzsKKwkJCQlpZiAoKHN0cmNtcChmb3JtYXQsICJkaXJlY3RvcnkiKSA9PSAwIHx8IHN0cmNt cChmb3JtYXQsICJkIikgPT0gMCkpCisJCQkJCWRpcmVjdG9yeV9mb3JtYXQgPSB0cnVlOworCQkJ CWVsc2UgaWYgKHN0cmNtcChmb3JtYXQsICJwbGFpbiIpICE9IDAgfHwgc3RyY21wKGZvcm1hdCwg InAiKSA9PSAwKQorCQkJCXsKKwkJCQkJcGdfbG9nX2Vycm9yKCJpbnZhbGlkIGZvcm1hdCBzcGVj aWZpZWQ6ICVzIiwgZm9ybWF0KTsKKwkJCQkJcGdfbG9nX2Vycm9yX2hpbnQoIlRyeSBcIiVzIC0t aGVscFwiIGZvciBtb3JlIGluZm9ybWF0aW9uLiIsIHByb2duYW1lKTsKKwkJCQkJZXhpdF9uaWNl bHkoMSk7CisJCQkJfQorCQkJCWJyZWFrOwogCQkJY2FzZSAnZyc6CiAJCQkJZ2xvYmFsc19vbmx5 ID0gdHJ1ZTsKIAkJCQlicmVhazsKQEAgLTQ5Nyw5ICs1MTMsMzEgQEAgbWFpbihpbnQgYXJnYywg Y2hhciAqYXJndltdKQogCQkJCQkJICAgJmRhdGFiYXNlX2V4Y2x1ZGVfbmFtZXMpOwogCiAJLyoK LQkgKiBPcGVuIHRoZSBvdXRwdXQgZmlsZSBpZiByZXF1aXJlZCwgb3RoZXJ3aXNlIHVzZSBzdGRv dXQKKwkgKiBPcGVuIHRoZSBvdXRwdXQgZmlsZSBpZiByZXF1aXJlZCwgb3RoZXJ3aXNlIHVzZSBz dGRvdXQuCiAJICovCi0JaWYgKGZpbGVuYW1lKQorCWlmIChkaXJlY3RvcnlfZm9ybWF0KQorCXsK KwkJY2hhcgl0b2NfcGF0aFtNQVhQR1BBVEhdOworCisJCS8qCisJCSAqIElmIGRpcmVjdG9yeSBm b3JtYXQgaXMgc3BlY2lmaWVkIHRoZW4gd2UgbXVzdCBwcm92aWRlIHRoZSBkaXJlY3RvcnkKKwkJ ICogbmFtZS4KKwkJICovCisJCWlmICghZmlsZW5hbWUgfHwgc3RyY21wKGZpbGVuYW1lLCAiIikg PT0gMCkKKwkJCXBnX2ZhdGFsKCJubyBvdXRwdXQgZGlyZWN0b3J5IHNwZWNpZmllZCIpOworCisJ CS8qIFRPRE86IGFjY2VwdCB0aGUgZW1wdHkgZXhpc3RpbmcgZGlyZWN0b3J5LiAqLworCQlpZiAo bWtkaXIoZmlsZW5hbWUsIDA3MDApIDwgMCkKKwkJCXBnX2ZhdGFsKCJjb3VsZCBub3QgY3JlYXRl IGRpcmVjdG9yeSBcIiVzXCI6ICVtIiwKKwkJCQkJIGZpbGVuYW1lKTsKKworCQlzbnByaW50Zih0 b2NfcGF0aCwgTUFYUEdQQVRILCAiJXMvZ2xvYmFsLmRhdCIsIGZpbGVuYW1lKTsKKworCQlPUEYg PSBmb3Blbih0b2NfcGF0aCwgInciKTsKKwkJaWYgKCFPUEYpCisJCQlwZ19mYXRhbCgiY291bGQg bm90IG9wZW4gZ2xvYmFsLmRhdCBmaWxlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCWVs c2UgaWYgKGZpbGVuYW1lKQogCXsKIAkJT1BGID0gZm9wZW4oZmlsZW5hbWUsIFBHX0JJTkFSWV9X KTsKIAkJaWYgKCFPUEYpCkBAIC02MDcsNyArNjQ1LDcgQEAgbWFpbihpbnQgYXJnYywgY2hhciAq YXJndltdKQogCX0KIAogCWlmICghZ2xvYmFsc19vbmx5ICYmICFyb2xlc19vbmx5ICYmICF0YWJs ZXNwYWNlc19vbmx5KQotCQlkdW1wRGF0YWJhc2VzKGNvbm4pOworCQlkdW1wRGF0YWJhc2VzKGNv bm4sIGRpcmVjdG9yeV9mb3JtYXQpOwogCiAJUFFmaW5pc2goY29ubik7CiAKQEAgLTYyMCw3ICs2 NTgsNyBAQCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiAJCWZjbG9zZShPUEYpOwogCiAJ CS8qIHN5bmMgdGhlIHJlc3VsdGluZyBmaWxlLCBlcnJvcnMgYXJlIG5vdCBmYXRhbCAqLwotCQlp ZiAoZG9zeW5jKQorCQlpZiAoZG9zeW5jICYmICFkaXJlY3RvcnlfZm9ybWF0KQogCQkJKHZvaWQp IGZzeW5jX2ZuYW1lKGZpbGVuYW1lLCBmYWxzZSk7CiAJfQogCkBAIC02MzcsNiArNjc1LDcgQEAg aGVscCh2b2lkKQogCiAJcHJpbnRmKF8oIlxuR2VuZXJhbCBvcHRpb25zOlxuIikpOwogCXByaW50 ZihfKCIgIC1mLCAtLWZpbGU9RklMRU5BTUUgICAgICAgICAgb3V0cHV0IGZpbGUgbmFtZVxuIikp OworCXByaW50ZihfKCIgIC1GLCAtLWZvcm1hdD1kfHAgICAgICAgICAgICAgb3V0cHV0IGZpbGUg Zm9ybWF0IChkaXJlY3RvcnksIHBsYWluIHRleHQgKGRlZmF1bHQpKVxuIikpOwogCXByaW50Zihf KCIgIC12LCAtLXZlcmJvc2UgICAgICAgICAgICAgICAgdmVyYm9zZSBtb2RlXG4iKSk7CiAJcHJp bnRmKF8oIiAgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgICAgICBvdXRwdXQgdmVyc2lvbiBpbmZv cm1hdGlvbiwgdGhlbiBleGl0XG4iKSk7CiAJcHJpbnRmKF8oIiAgLS1sb2NrLXdhaXQtdGltZW91 dD1USU1FT1VUICBmYWlsIGFmdGVyIHdhaXRpbmcgVElNRU9VVCBmb3IgYSB0YWJsZSBsb2NrXG4i KSk7CkBAIC0xNDg3LDEwICsxNTI2LDEzIEBAIGV4cGFuZF9kYm5hbWVfcGF0dGVybnMoUEdjb25u ICpjb25uLAogICogRHVtcCBjb250ZW50cyBvZiBkYXRhYmFzZXMuCiAgKi8KIHN0YXRpYyB2b2lk Ci1kdW1wRGF0YWJhc2VzKFBHY29ubiAqY29ubikKK2R1bXBEYXRhYmFzZXMoUEdjb25uICpjb25u LCBib29sIGRpcmVjdG9yeV9mb3JtYXQpCiB7CiAJUEdyZXN1bHQgICAqcmVzOwogCWludAkJCWk7 CisJY2hhcgkJZGJfc3ViZGlyW01BWFBHUEFUSF07CisJY2hhcgkJZGJmaWxlcGF0aFtNQVhQR1BB VEhdOworCUZJTEUgICAgICAgKm1hcF9maWxlOwogCiAJLyoKIAkgKiBTa2lwIGRhdGFiYXNlcyBt YXJrZWQgbm90IGRhdGFsbG93Y29ubiwgc2luY2Ugd2UnZCBiZSB1bmFibGUgdG8gY29ubmVjdApA QCAtMTUwNCw3ICsxNTQ2LDcgQEAgZHVtcERhdGFiYXNlcyhQR2Nvbm4gKmNvbm4pCiAJICogZG9l c24ndCBoYXZlIHNvbWUgZmFpbHVyZSBtb2RlIHdpdGggLS1jbGVhbi4KIAkgKi8KIAlyZXMgPSBl eGVjdXRlUXVlcnkoY29ubiwKLQkJCQkJICAgIlNFTEVDVCBkYXRuYW1lICIKKwkJCQkJICAgIlNF TEVDVCBkYXRuYW1lLCBvaWQgIgogCQkJCQkgICAiRlJPTSBwZ19kYXRhYmFzZSBkICIKIAkJCQkJ ICAgIldIRVJFIGRhdGFsbG93Y29ubiBBTkQgZGF0Y29ubmxpbWl0ICE9IC0yICIKIAkJCQkJICAg Ik9SREVSIEJZIChkYXRuYW1lIDw+ICd0ZW1wbGF0ZTEnKSwgZGF0bmFtZSIpOwpAQCAtMTUxMiw5 ICsxNTU0LDMwIEBAIGR1bXBEYXRhYmFzZXMoUEdjb25uICpjb25uKQogCWlmIChQUW50dXBsZXMo cmVzKSA+IDApCiAJCWZwcmludGYoT1BGLCAiLS1cbi0tIERhdGFiYXNlc1xuLS1cblxuIik7CiAK KwkvKgorCSAqIElmIGRpcmVjdG9yeSBmb3JtYXQgaXMgc3BlY2lmaWVkIHRoZW4gY3JlYXRlIGEg c3ViZGlyZWN0b3J5IHVuZGVyIHRoZQorCSAqIG1haW4gZGlyZWN0b3J5IGFuZCBlYWNoIGRhdGFi YXNlIGR1bXAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgdW5kZXIgdGhlCisJICogc3ViZGlyZWN0b3J5 IGluIGFyY2hpdmUgbW9kZSBhcyBwZXIgc2luZ2xlIGRiIHBnX2R1bXAuCisJICovCisJaWYgKGRp cmVjdG9yeV9mb3JtYXQpCisJeworCQljaGFyICAgIG1hcF9maWxlX3BhdGhbTUFYUEdQQVRIXTsK KworCQlzbnByaW50ZihkYl9zdWJkaXIsIE1BWFBHUEFUSCwgIiVzL2RhdGFiYXNlcyIsIGZpbGVu YW1lKTsKKwkJaWYgKG1rZGlyKGRiX3N1YmRpciwgMDc1NSkgIT0gMCkKKwkJCXBnX2xvZ19lcnJv cigiY291bGQgbm90IGNyZWF0ZSBzdWJkaXJlY3RvcnkgXCIlc1wiOiAlbSIsIGRiX3N1YmRpcik7 CisKKwkJLyogQ3JlYXRlIGEgbWFwIGZpbGUgKHRvIHN0b3JlIGRib2lkIGFuZCBkYm5hbWUpICov CisJCXNucHJpbnRmKG1hcF9maWxlX3BhdGgsIE1BWFBHUEFUSCwgIiVzL21hcC5kYXQiLCBmaWxl bmFtZSk7CisJCW1hcF9maWxlID0gZm9wZW4obWFwX2ZpbGVfcGF0aCwgInciKTsKKwkJaWYgKCFt YXBfZmlsZSkKKwkJCXBnX2ZhdGFsKCJjb3VsZCBub3Qgb3BlbiBtYXAgZmlsZTogJXMiLCBzdHJl cnJvcihlcnJubykpOworCX0KKwogCWZvciAoaSA9IDA7IGkgPCBQUW50dXBsZXMocmVzKTsgaSsr KQogCXsKIAkJY2hhcgkgICAqZGJuYW1lID0gUFFnZXR2YWx1ZShyZXMsIGksIDApOworCQljaGFy CSAgICpvaWQgPSBQUWdldHZhbHVlKHJlcywgaSwgMSk7CiAJCWNvbnN0IGNoYXIgKmNyZWF0ZV9v cHRzOwogCQlpbnQJCQlyZXQ7CiAKQEAgLTE1MjIsNiArMTU4NSwxNCBAQCBkdW1wRGF0YWJhc2Vz KFBHY29ubiAqY29ubikKIAkJaWYgKHN0cmNtcChkYm5hbWUsICJ0ZW1wbGF0ZTAiKSA9PSAwKQog CQkJY29udGludWU7CiAKKwkJaWYgKGRpcmVjdG9yeV9mb3JtYXQpCisJCXsKKwkJCXNucHJpbnRm KGRiZmlsZXBhdGgsIE1BWFBHUEFUSCwgIi1mICVzLyVzIiwgZGJfc3ViZGlyLCBvaWQpOworCisJ CQkvKiBhcHBlbmQgZGJvaWQgYW5kIGRibmFtZSBpbiBtYXAgZmlsZS4gKi8KKwkJCWZwcmludGYo bWFwX2ZpbGUsICIlcyAlc1xuIiwgb2lkLCBkYm5hbWUpOworCQl9CisKIAkJLyogU2tpcCBhbnkg ZXhwbGljaXRseSBleGNsdWRlZCBkYXRhYmFzZSAqLwogCQlpZiAoc2ltcGxlX3N0cmluZ19saXN0 X21lbWJlcigmZGF0YWJhc2VfZXhjbHVkZV9uYW1lcywgZGJuYW1lKSkKIAkJewpAQCAtMTUzMSw3 ICsxNjAyLDggQEAgZHVtcERhdGFiYXNlcyhQR2Nvbm4gKmNvbm4pCiAKIAkJcGdfbG9nX2luZm8o ImR1bXBpbmcgZGF0YWJhc2UgXCIlc1wiIiwgZGJuYW1lKTsKIAotCQlmcHJpbnRmKE9QRiwgIi0t XG4tLSBEYXRhYmFzZSBcIiVzXCIgZHVtcFxuLS1cblxuIiwgZGJuYW1lKTsKKwkJaWYgKCFkaXJl Y3RvcnlfZm9ybWF0KQorCQkJZnByaW50ZihPUEYsICItLVxuLS0gRGF0YWJhc2UgXCIlc1wiIGR1 bXBcbi0tXG5cbiIsIGRibmFtZSk7CiAKIAkJLyoKIAkJICogV2UgYXNzdW1lIHRoYXQgInRlbXBs YXRlMSIgYW5kICJwb3N0Z3JlcyIgYWxyZWFkeSBleGlzdCBpbiB0aGUKQEAgLTE1NDksMjAgKzE2 MjEsMjEgQEAgZHVtcERhdGFiYXNlcyhQR2Nvbm4gKmNvbm4pCiAJCQl7CiAJCQkJY3JlYXRlX29w dHMgPSAiIjsKIAkJCQkvKiBTaW5jZSBwZ19kdW1wIHdvbid0IGVtaXQgYSBcY29ubmVjdCBjb21t YW5kLCB3ZSBtdXN0ICovCi0JCQkJZnByaW50ZihPUEYsICJcXGNvbm5lY3QgJXNcblxuIiwgZGJu YW1lKTsKKwkJCQlpZiAoIWRpcmVjdG9yeV9mb3JtYXQpCisJCQkJCWZwcmludGYoT1BGLCAiXFxj b25uZWN0ICVzXG5cbiIsIGRibmFtZSk7CiAJCQl9CiAJCX0KIAkJZWxzZQogCQkJY3JlYXRlX29w dHMgPSAiLS1jcmVhdGUiOwogCi0JCWlmIChmaWxlbmFtZSkKKwkJaWYgKCFkaXJlY3RvcnlfZm9y bWF0ICYmIGZpbGVuYW1lKQogCQkJZmNsb3NlKE9QRik7CiAKLQkJcmV0ID0gcnVuUGdEdW1wKGRi bmFtZSwgY3JlYXRlX29wdHMpOworCQlyZXQgPSBydW5QZ0R1bXAoZGJuYW1lLCBjcmVhdGVfb3B0 cywgZGJmaWxlcGF0aCk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCXBnX2ZhdGFsKCJwZ19kdW1wIGZh aWxlZCBvbiBkYXRhYmFzZSBcIiVzXCIsIGV4aXRpbmciLCBkYm5hbWUpOwogCi0JCWlmIChmaWxl bmFtZSkKKwkJaWYgKCFkaXJlY3RvcnlfZm9ybWF0ICYmIGZpbGVuYW1lKQogCQl7CiAJCQlPUEYg PSBmb3BlbihmaWxlbmFtZSwgUEdfQklOQVJZX0EpOwogCQkJaWYgKCFPUEYpCkBAIC0xNTcxLDYg KzE2NDQsMTAgQEAgZHVtcERhdGFiYXNlcyhQR2Nvbm4gKmNvbm4pCiAJCX0KIAl9CiAKKwkvKiBj bG9zZSBtYXAgZmlsZSAqLworCWlmIChkaXJlY3RvcnlfZm9ybWF0KQorCQlmY2xvc2UobWFwX2Zp bGUpOworCiAJUFFjbGVhcihyZXMpOwogfQogCkBAIC0xNTgwLDcgKzE2NTcsNyBAQCBkdW1wRGF0 YWJhc2VzKFBHY29ubiAqY29ubikKICAqIFJ1biBwZ19kdW1wIG9uIGRibmFtZSwgd2l0aCBzcGVj aWZpZWQgb3B0aW9ucy4KICAqLwogc3RhdGljIGludAotcnVuUGdEdW1wKGNvbnN0IGNoYXIgKmRi bmFtZSwgY29uc3QgY2hhciAqY3JlYXRlX29wdHMpCitydW5QZ0R1bXAoY29uc3QgY2hhciAqZGJu YW1lLCBjb25zdCBjaGFyICpjcmVhdGVfb3B0cywgY2hhciAqZGJmaWxlKQogewogCVBRRXhwQnVm ZmVyRGF0YSBjb25uc3RyYnVmOwogCVBRRXhwQnVmZmVyRGF0YSBjbWQ7CkBAIC0xNTg5LDE3ICsx NjY2LDI2IEBAIHJ1blBnRHVtcChjb25zdCBjaGFyICpkYm5hbWUsIGNvbnN0IGNoYXIgKmNyZWF0 ZV9vcHRzKQogCWluaXRQUUV4cEJ1ZmZlcigmY29ubnN0cmJ1Zik7CiAJaW5pdFBRRXhwQnVmZmVy KCZjbWQpOwogCi0JcHJpbnRmUFFFeHBCdWZmZXIoJmNtZCwgIlwiJXNcIiAlcyAlcyIsIHBnX2R1 bXBfYmluLAotCQkJCQkgIHBnZHVtcG9wdHMtPmRhdGEsIGNyZWF0ZV9vcHRzKTsKLQotCS8qCi0J ICogSWYgd2UgaGF2ZSBhIGZpbGVuYW1lLCB1c2UgdGhlIHVuZG9jdW1lbnRlZCBwbGFpbi1hcHBl bmQgcGdfZHVtcAotCSAqIGZvcm1hdC4KLQkgKi8KLQlpZiAoZmlsZW5hbWUpCi0JCWFwcGVuZFBR RXhwQnVmZmVyU3RyKCZjbWQsICIgLUZhICIpOworCWlmIChkYmZpbGUpCisJeworCQlwcmludGZQ UUV4cEJ1ZmZlcigmY21kLCAiXCIlc1wiICVzICVzIiwgcGdfZHVtcF9iaW4sCisJCQkJCQkgIGRi ZmlsZSwgY3JlYXRlX29wdHMpOworCQlhcHBlbmRQUUV4cEJ1ZmZlclN0cigmY21kLCAiIC1GIGQg Iik7CisJfQogCWVsc2UKLQkJYXBwZW5kUFFFeHBCdWZmZXJTdHIoJmNtZCwgIiAtRnAgIik7CisJ eworCQlwcmludGZQUUV4cEJ1ZmZlcigmY21kLCAiXCIlc1wiICVzICVzIiwgcGdfZHVtcF9iaW4s CisJCQkJCQlwZ2R1bXBvcHRzLT5kYXRhLCBjcmVhdGVfb3B0cyk7CisKKwkJLyoKKwkJKiBJZiB3 ZSBoYXZlIGEgZmlsZW5hbWUsIHVzZSB0aGUgdW5kb2N1bWVudGVkIHBsYWluLWFwcGVuZCBwZ19k dW1wCisJCSogZm9ybWF0LgorCQkqLworCQlpZiAoZmlsZW5hbWUpCisJCQlhcHBlbmRQUUV4cEJ1 ZmZlclN0cigmY21kLCAiIC1GYSAiKTsKKwkJZWxzZQorCQkJYXBwZW5kUFFFeHBCdWZmZXJTdHIo JmNtZCwgIiAtRnAgIik7CisJfQogCiAJLyoKIAkgKiBBcHBlbmQgdGhlIGRhdGFiYXNlIG5hbWUg dG8gdGhlIGFscmVhZHktY29uc3RydWN0ZWQgc3RlbSBvZiBjb25uZWN0aW9uCmRpZmYgLS1naXQg YS9zcmMvYmluL3BnX2R1bXAvcGdfcmVzdG9yZS5jIGIvc3JjL2Jpbi9wZ19kdW1wL3BnX3Jlc3Rv cmUuYwppbmRleCA4OGFlMzlkLi41OTRhZTI3IDEwMDY0NAotLS0gYS9zcmMvYmluL3BnX2R1bXAv cGdfcmVzdG9yZS5jCisrKyBiL3NyYy9iaW4vcGdfZHVtcC9wZ19yZXN0b3JlLmMKQEAgLTQxLDI3 ICs0MSw0NSBAQAogI2luY2x1ZGUgInBvc3RncmVzX2ZlLmgiCiAKICNpbmNsdWRlIDxjdHlwZS5o PgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaWZkZWYgSEFWRV9URVJNSU9TX0gKICNpbmNsdWRl IDx0ZXJtaW9zLmg+CiAjZW5kaWYKIAorI2luY2x1ZGUgImNvbW1vbi9jb25uZWN0LmgiCisjaW5j bHVkZSAiY29tcHJlc3NfaW8uaCIKKyNpbmNsdWRlICJjb21tb24vc3RyaW5nLmgiCiAjaW5jbHVk ZSAiZmVfdXRpbHMvb3B0aW9uX3V0aWxzLmgiCisjaW5jbHVkZSAiZmVfdXRpbHMvc3RyaW5nX3V0 aWxzLmgiCiAjaW5jbHVkZSAiZmlsdGVyLmgiCiAjaW5jbHVkZSAiZ2V0b3B0X2xvbmcuaCIKICNp bmNsdWRlICJwYXJhbGxlbC5oIgorI2luY2x1ZGUgInBnX2JhY2t1cF9hcmNoaXZlci5oIgogI2lu Y2x1ZGUgInBnX2JhY2t1cF91dGlscy5oIgogCiBzdGF0aWMgdm9pZCB1c2FnZShjb25zdCBjaGFy ICpwcm9nbmFtZSk7CiBzdGF0aWMgdm9pZCByZWFkX3Jlc3RvcmVfZmlsdGVycyhjb25zdCBjaGFy ICpmaWxlbmFtZSwgUmVzdG9yZU9wdGlvbnMgKm9wdHMpOworc3RhdGljIGJvb2wgX2ZpbGVFeGlz dHNJbkRpcmVjdG9yeShjb25zdCBjaGFyICpkaXIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKK3N0 YXRpYyBib29sIHJlc3RvcmVPbmVEYXRhYmFzZShjb25zdCBjaGFyICppbnB1dEZpbGVTcGVjLAor CQlSZXN0b3JlT3B0aW9ucyAqb3B0cywgaW50IG51bVdvcmtlcnMpOworc3RhdGljIHZvaWQgZXhw YW5kX2RibmFtZV9wYXR0ZXJucyhQR2Nvbm4gKmNvbm4sIFNpbXBsZVN0cmluZ0xpc3QgKnBhdHRl cm5zLAorCQlTaW1wbGVTdHJpbmdMaXN0ICpuYW1lcyk7CitzdGF0aWMgUEdjb25uICpjb25uZWN0 RGF0YWJhc2UoY29uc3QgY2hhciAqZGJuYW1lLCBjb25zdCBjaGFyICpjb25uZWN0aW9uX3N0cmlu ZywKKwkJY29uc3QgY2hhciAqcGdob3N0LCBjb25zdCBjaGFyICpwZ3BvcnQsIGNvbnN0IGNoYXIg KnBndXNlciwKKwkJdHJpdmFsdWUgcHJvbXB0X3Bhc3N3b3JkLCBib29sIGZhaWxfb25fZXJyb3Ip Oworc3RhdGljIFBHcmVzdWx0ICpleGVjdXRlUXVlcnkoUEdjb25uICpjb25uLCBjb25zdCBjaGFy ICpxdWVyeSk7CitzdGF0aWMgaW50IFJlYWRPbmVTdGF0ZW1lbnQoU3RyaW5nSW5mbyBpbkJ1Ziwg RklMRSAqZl9nbG8pOworc3RhdGljIGludCByZXN0b3JlQWxsRGF0YWJhc2VzKGNvbnN0IGNoYXIg KmR1bXBkaXJwYXRoLAorCQlTaW1wbGVTdHJpbmdMaXN0IGRhdGFiYXNlX2V4Y2x1ZGVfbmFtZXMs IFJlc3RvcmVPcHRpb25zICpvcHRzLAorCQlpbnQgbnVtV29ya2Vycyk7CitzdGF0aWMgdm9pZCBl eGVjdXRlX2dsb2JhbF9zcWxfY29tbWFuZHMoUEdjb25uICpjb25uLCBjb25zdCBjaGFyICpkdW1w ZGlycGF0aCk7CiAKIGludAogbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiB7CiAJUmVzdG9y ZU9wdGlvbnMgKm9wdHM7CiAJaW50CQkJYzsKLQlpbnQJCQlleGl0X2NvZGU7CiAJaW50CQkJbnVt V29ya2VycyA9IDE7Ci0JQXJjaGl2ZSAgICAqQUg7CiAJY2hhcgkgICAqaW5wdXRGaWxlU3BlYzsK IAlzdGF0aWMgaW50CWRpc2FibGVfdHJpZ2dlcnMgPSAwOwogCXN0YXRpYyBpbnQJZW5hYmxlX3Jv d19zZWN1cml0eSA9IDA7CkBAIC03NywxMSArOTUsMTQgQEAgbWFpbihpbnQgYXJnYywgY2hhciAq KmFyZ3YpCiAJc3RhdGljIGludAlzdHJpY3RfbmFtZXMgPSAwOwogCWJvb2wJCWRhdGFfb25seSA9 IGZhbHNlOwogCWJvb2wJCXNjaGVtYV9vbmx5ID0gZmFsc2U7CisJU2ltcGxlU3RyaW5nTGlzdCAg ICBkYXRhYmFzZV9leGNsdWRlX3BhdHRlcm5zID0ge05VTEwsIE5VTEx9OworCWJvb2wJCQkJZ2xv YmFsc19vbmx5ID0gZmFsc2U7CiAKIAlzdHJ1Y3Qgb3B0aW9uIGNtZG9wdHNbXSA9IHsKIAkJeyJj bGVhbiIsIDAsIE5VTEwsICdjJ30sCiAJCXsiY3JlYXRlIiwgMCwgTlVMTCwgJ0MnfSwKIAkJeyJk YXRhLW9ubHkiLCAwLCBOVUxMLCAnYSd9LAorCQl7Imdsb2JhbHMtb25seSIsIDAsIE5VTEwsICdn J30sCiAJCXsiZGJuYW1lIiwgMSwgTlVMTCwgJ2QnfSwKIAkJeyJleGl0LW9uLWVycm9yIiwgMCwg TlVMTCwgJ2UnfSwKIAkJeyJleGNsdWRlLXNjaGVtYSIsIDEsIE5VTEwsICdOJ30sCkBAIC0xMjgs NiArMTQ5LDcgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCXsibm8tc2VjdXJpdHkt bGFiZWxzIiwgbm9fYXJndW1lbnQsICZub19zZWN1cml0eV9sYWJlbHMsIDF9LAogCQl7Im5vLXN1 YnNjcmlwdGlvbnMiLCBub19hcmd1bWVudCwgJm5vX3N1YnNjcmlwdGlvbnMsIDF9LAogCQl7ImZp bHRlciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCA0fSwKKwkJeyJleGNsdWRlLWRhdGFiYXNl IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsIDZ9LAogCiAJCXtOVUxMLCAwLCBOVUxMLCAwfQog CX07CkBAIC0xNTYsNyArMTc4LDcgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCX0K IAl9CiAKLQl3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiYWNDZDplZjpGOmg6 STpqOmxMOm46TjpPcDpQOlJzUzp0OlQ6VTp2d1d4MSIsCisJd2hpbGUgKChjID0gZ2V0b3B0X2xv bmcoYXJnYywgYXJndiwgImFBY0NkOmVmOkY6Z2g6STpqOmxMOm46TjpPcDpQOlJzUzp0OlQ6VTp2 d1d4MSIsCiAJCQkJCQkJY21kb3B0cywgTlVMTCkpICE9IC0xKQogCXsKIAkJc3dpdGNoIChjKQpA QCAtMTgzLDExICsyMDUsMTQgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJCQkJaWYg KHN0cmxlbihvcHRhcmcpICE9IDApCiAJCQkJCW9wdHMtPmZvcm1hdE5hbWUgPSBwZ19zdHJkdXAo b3B0YXJnKTsKIAkJCQlicmVhazsKKwkJCWNhc2UgJ2cnOgorCQkJCS8qIHJlc3RvcmUgb25seSBn bG9iYWwuZGF0IGZpbGUgZnJvbSBkaXJlY3RvcnkgKi8KKwkJCQlnbG9iYWxzX29ubHkgPSB0cnVl OworCQkJCWJyZWFrOwogCQkJY2FzZSAnaCc6CiAJCQkJaWYgKHN0cmxlbihvcHRhcmcpICE9IDAp CiAJCQkJCW9wdHMtPmNwYXJhbXMucGdob3N0ID0gcGdfc3RyZHVwKG9wdGFyZyk7CiAJCQkJYnJl YWs7Ci0KIAkJCWNhc2UgJ2onOgkJCS8qIG51bWJlciBvZiByZXN0b3JlIGpvYnMgKi8KIAkJCQlp ZiAoIW9wdGlvbl9wYXJzZV9pbnQob3B0YXJnLCAiLWovLS1qb2JzIiwgMSwKIAkJCQkJCQkJCSAg UEdfTUFYX0pPQlMsCkBAIC0zMDIsNiArMzI3LDEwIEBAIG1haW4oaW50IGFyZ2MsIGNoYXIgKiph cmd2KQogCQkJCQlleGl0KDEpOwogCQkJCW9wdHMtPmV4aXRfb25fZXJyb3IgPSB0cnVlOwogCQkJ CWJyZWFrOworCQkJY2FzZSA2OgorCQkJCS8qIGxpc3Qgb2YgZGF0YWJhc2VzIHRob3NlIG5lZWRz IHRvIHNraXAgd2hpbGUgcmVzdG9yaW5nICovCisJCQkJc2ltcGxlX3N0cmluZ19saXN0X2FwcGVu ZCgmZGF0YWJhc2VfZXhjbHVkZV9wYXR0ZXJucywgb3B0YXJnKTsKKwkJCQlicmVhazsKIAogCQkJ ZGVmYXVsdDoKIAkJCQkvKiBnZXRvcHRfbG9uZyBhbHJlYWR5IGVtaXR0ZWQgYSBjb21wbGFpbnQg Ki8KQEAgLTMyOSw2ICszNTgsMTYgQEAgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCiAJaWYg KCFvcHRzLT5jcGFyYW1zLmRibmFtZSAmJiAhb3B0cy0+ZmlsZW5hbWUgJiYgIW9wdHMtPnRvY1N1 bW1hcnkpCiAJCXBnX2ZhdGFsKCJvbmUgb2YgLWQvLS1kYm5hbWUgYW5kIC1mLy0tZmlsZSBtdXN0 IGJlIHNwZWNpZmllZCIpOwogCisJaWYgKGRhdGFiYXNlX2V4Y2x1ZGVfcGF0dGVybnMuaGVhZCAh PSBOVUxMICYmIGdsb2JhbHNfb25seSkKKwl7CisJCXBnX2xvZ19lcnJvcigib3B0aW9uIC0tZXhj bHVkZS1kYXRhYmFzZSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlciB3aXRoIC1nLy0tZ2xvYmFscy1v bmx5Iik7CisJCXBnX2xvZ19lcnJvcl9oaW50KCJUcnkgXCIlcyAtLWhlbHBcIiBmb3IgbW9yZSBp bmZvcm1hdGlvbi4iLCBwcm9nbmFtZSk7CisJCWV4aXRfbmljZWx5KDEpOworCX0KKworCWlmIChn bG9iYWxzX29ubHkgJiYgb3B0cy0+Y3BhcmFtcy5kYm5hbWUgPT0gTlVMTCkKKwkJcGdfZmF0YWwo Im9wdGlvbiAtZy8tLWdsb2JhbHMtb25seSByZXF1aXJlcyBvcHRpb24gLWQvLS1kYm5hbWUiKTsK KwogCS8qIFNob3VsZCBnZXQgYXQgbW9zdCBvbmUgb2YgLWQgYW5kIC1mLCBlbHNlIHVzZXIgaXMg Y29uZnVzZWQgKi8KIAlpZiAob3B0cy0+Y3BhcmFtcy5kYm5hbWUpCiAJewpAQCAtNDA2LDYgKzQ0 NSw3NiBAQCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIAkJfQogCX0KIAorCS8qCisJICog SWYgZGlyZWN0b3J5IGZvcm1hdCwgdGhlbiBmaXJzdCBjaGVjayB0aGF0IHRvYy5kYXQgZmlsZSBl eGlzdCBvciBub3Q/CisJICoKKwkgKiBpZiB0b2MuZGF0IGV4aXN0LCB0aGVuIG5vIG5lZWQgdG8g Y2hlY2sgZm9yIG1hcC5kYXQgYW5kIGdsb2JhbC5kYXQKKwkgKgorCSAqLworCWlmIChvcHRzLT5m b3JtYXQgPT0gYXJjaERpcmVjdG9yeSAmJgorCQkJaW5wdXRGaWxlU3BlYyAhPSBOVUxMICYmCisJ CQkhX2ZpbGVFeGlzdHNJbkRpcmVjdG9yeShpbnB1dEZpbGVTcGVjLCAidG9jLmRhdCIpKQorCXsK KwkJLyogaWYgZ2xvYmFsLmRhdCBhbmQgbWFwLmRhdCBhcmUgZXhpc3QsIHRoZW4gb3BlbiB0aGVt ICovCisJCWlmIChfZmlsZUV4aXN0c0luRGlyZWN0b3J5KHBnX3N0cmR1cChpbnB1dEZpbGVTcGVj KSwgImdsb2JhbC5kYXQiKQorCQkJCSYmIF9maWxlRXhpc3RzSW5EaXJlY3RvcnkocGdfc3RyZHVw KGlucHV0RmlsZVNwZWMpLCAibWFwLmRhdCIpKQorCQl7CisJCQkvKiBGb3VuZCB0aGUgZ2xvYmFs LmRhdCBhbmQgbWFwLmRhdCBmaWxlIHNvIHByb2Nlc3MuICovCisJCQlQR2Nvbm4JCQkJKmNvbm4g PSBOVUxMOworCQkJU2ltcGxlU3RyaW5nTGlzdAlkYXRhYmFzZV9leGNsdWRlX25hbWVzID0ge05V TEwsIE5VTEx9OworCisJCQlpZiAob3B0cy0+Y3BhcmFtcy5kYm5hbWUgPT0gTlVMTCkKKwkJCQlw Z19mYXRhbCgiIC1kLy0tZGJhbm1lIHNob3VsZCBiZSBnaXZlbiBpZiB1c2luZyBkdW1wIG9mIGR1 bXBhbGwgYW5kIGdsb2JhbC5kYXQiKTsKKworCQkJaWYgKG9wdHMtPmNyZWF0ZURCICE9IDEpCisJ CQkJcGdfZmF0YWwoIm9wdGlvbiAtQy8tLWNyZWF0ZSBzaG91bGQgYmUgc3BlY2lmaWVkIGlmIHVz aW5nIGR1bXAgb2YgZHVtcGFsbCB3aXRoIGdsb2JhbC5kYXQiKTsKKworCQkJLyogQ29ubmVjdCB0 byBkYXRhYmFzZSBzbyB0aGF0IHdlIGNhbiBleGVjdXRlIGdsb2JhbC5kYXQgKi8KKwkJCWNvbm4g PSBjb25uZWN0RGF0YWJhc2Uob3B0cy0+Y3BhcmFtcy5kYm5hbWUsIE5VTEwsCisJCQkJCW9wdHMt PmNwYXJhbXMucGdob3N0LCBvcHRzLT5jcGFyYW1zLnBncG9ydCwgb3B0cy0+Y3BhcmFtcy51c2Vy bmFtZSwKKwkJCQkJVFJJX0RFRkFVTFQsIGZhbHNlKTsKKworCQkJaWYgKCFjb25uKQorCQkJCXBn X2ZhdGFsKCJjb3VsZCBub3QgY29ubmVjdCB0byBkYXRhYmFzZSBcIiVzXCIiLCBvcHRzLT5jcGFy YW1zLmRibmFtZSk7CisKKwkJCS8qIE9wZW4gZ2xvYmFsLmRhdCBmaWxlIGFuZCBleGVjdXRlIGFs bCB0aGUgc3FsIGNvbW1hbmRzICovCisJCQlleGVjdXRlX2dsb2JhbF9zcWxfY29tbWFuZHMoY29u biwgaW5wdXRGaWxlU3BlYyk7CisKKwkJCS8qIGlmIGdsb2JhbHMtb25seSwgdGhlbiByZXR1cm4g ZnJvbSBoZXJlICovCisJCQlpZiAoZ2xvYmFsc19vbmx5KQorCQkJeworCQkJCVBRZmluaXNoKGNv bm4pOyAvKiBjbG9zZSB0aGUgY29ubmVjdGlvbiAqLworCQkJCXJldHVybiAwOworCQkJfQorCisJ CQkvKiBHZXQgYSBsaXN0IG9mIGRhdGFiYXNlIG5hbWVzIHRoYXQgbWF0Y2ggdGhlIGV4Y2x1ZGUg cGF0dGVybnMgKi8KKwkJCWV4cGFuZF9kYm5hbWVfcGF0dGVybnMoY29ubiwgJmRhdGFiYXNlX2V4 Y2x1ZGVfcGF0dGVybnMsCisJCQkJCSZkYXRhYmFzZV9leGNsdWRlX25hbWVzKTsKKworCQkJLyog Q2xvc2UgdGhlIGRiIGNvbm5lY3Rpb24gYXMgd2UgYXJlIGRvbmUgd2l0aCBnbG9iYWxzICovCisJ CQlQUWZpbmlzaChjb25uKTsKKworCQkJLyogTm93IHJlc3RvcmUgYWxsIHRoZSBkYXRhYmFzZXMg ZnJvbSBtYXAuZGF0IGZpbGUgKi8KKwkJCXJldHVybiByZXN0b3JlQWxsRGF0YWJhc2VzKGlucHV0 RmlsZVNwZWMsIGRhdGFiYXNlX2V4Y2x1ZGVfbmFtZXMsCisJCQkJCW9wdHMsIG51bVdvcmtlcnMp OworCQl9LyogZW5kIGlmICovCisJfS8qIGVuZCBpZiAqLworCisJcmV0dXJuIHJlc3RvcmVPbmVE YXRhYmFzZShpbnB1dEZpbGVTcGVjLCBvcHRzLCBudW1Xb3JrZXJzKTsKK30KKworLyoKKyAqIHJl c3RvcmVPbmVEYXRhYmFzZQorICoKKyAqIFRoaXMgd2lsbCByZXN0b3JlIG9uZSBkYXRhYmFzZSB1 c2luZyB0b2MuZGF0IGZpbGUuCisgKi8KK3N0YXRpYyBib29sCityZXN0b3JlT25lRGF0YWJhc2Uo Y29uc3QgY2hhciAqaW5wdXRGaWxlU3BlYywgUmVzdG9yZU9wdGlvbnMgKm9wdHMsCisJCWludCBu dW1Xb3JrZXJzKQoreworCUFyY2hpdmUJCSpBSDsKKwlib29sCQlleGl0X2NvZGU7CisKIAlBSCA9 IE9wZW5BcmNoaXZlKGlucHV0RmlsZVNwZWMsIG9wdHMtPmZvcm1hdCk7CiAKIAlTZXRBcmNoaXZl T3B0aW9ucyhBSCwgTlVMTCwgb3B0cyk7CkBAIC00NzEsNiArNTgwLDcgQEAgdXNhZ2UoY29uc3Qg Y2hhciAqcHJvZ25hbWUpCiAJcHJpbnRmKF8oIiAgLWMsIC0tY2xlYW4gICAgICAgICAgICAgICAg ICBjbGVhbiAoZHJvcCkgZGF0YWJhc2Ugb2JqZWN0cyBiZWZvcmUgcmVjcmVhdGluZ1xuIikpOwog CXByaW50ZihfKCIgIC1DLCAtLWNyZWF0ZSAgICAgICAgICAgICAgICAgY3JlYXRlIHRoZSB0YXJn ZXQgZGF0YWJhc2VcbiIpKTsKIAlwcmludGYoXygiICAtZSwgLS1leGl0LW9uLWVycm9yICAgICAg ICAgIGV4aXQgb24gZXJyb3IsIGRlZmF1bHQgaXMgdG8gY29udGludWVcbiIpKTsKKwlwcmludGYo XygiICAtZywgLS1nbG9iYWxzLW9ubHkgICAgICAgICAgIHJlc3RvcmUgb25seSBnbG9iYWwgb2Jq ZWN0cywgbm8gZGF0YWJhc2VzXG4iKSk7CiAJcHJpbnRmKF8oIiAgLUksIC0taW5kZXg9TkFNRSAg ICAgICAgICAgICByZXN0b3JlIG5hbWVkIGluZGV4XG4iKSk7CiAJcHJpbnRmKF8oIiAgLWosIC0t am9icz1OVU0gICAgICAgICAgICAgICB1c2UgdGhpcyBtYW55IHBhcmFsbGVsIGpvYnMgdG8gcmVz dG9yZVxuIikpOwogCXByaW50ZihfKCIgIC1MLCAtLXVzZS1saXN0PUZJTEVOQU1FICAgICAgdXNl IHRhYmxlIG9mIGNvbnRlbnRzIGZyb20gdGhpcyBmaWxlIGZvclxuIgpAQCAtNDgzLDYgKzU5Myw3 IEBAIHVzYWdlKGNvbnN0IGNoYXIgKnByb2duYW1lKQogCXByaW50ZihfKCIgIC1TLCAtLXN1cGVy dXNlcj1OQU1FICAgICAgICAgc3VwZXJ1c2VyIHVzZXIgbmFtZSB0byB1c2UgZm9yIGRpc2FibGlu ZyB0cmlnZ2Vyc1xuIikpOwogCXByaW50ZihfKCIgIC10LCAtLXRhYmxlPU5BTUUgICAgICAgICAg ICAgcmVzdG9yZSBuYW1lZCByZWxhdGlvbiAodGFibGUsIHZpZXcsIGV0Yy4pXG4iKSk7CiAJcHJp bnRmKF8oIiAgLVQsIC0tdHJpZ2dlcj1OQU1FICAgICAgICAgICByZXN0b3JlIG5hbWVkIHRyaWdn ZXJcbiIpKTsKKwlwcmludGYoXygiICAtLWV4Y2x1ZGUtZGF0YWJhc2U9UEFUVEVSTiAgIGV4Y2x1 ZGUgZGF0YWJhc2VzIHdob3NlIG5hbWUgbWF0Y2hlcyBQQVRURVJOXG4iKSk7CiAJcHJpbnRmKF8o IiAgLXgsIC0tbm8tcHJpdmlsZWdlcyAgICAgICAgICBza2lwIHJlc3RvcmF0aW9uIG9mIGFjY2Vz cyBwcml2aWxlZ2VzIChncmFudC9yZXZva2UpXG4iKSk7CiAJcHJpbnRmKF8oIiAgLTEsIC0tc2lu Z2xlLXRyYW5zYWN0aW9uICAgICByZXN0b3JlIGFzIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4iKSk7 CiAJcHJpbnRmKF8oIiAgLS1kaXNhYmxlLXRyaWdnZXJzICAgICAgICAgICBkaXNhYmxlIHRyaWdn ZXJzIGR1cmluZyBkYXRhLW9ubHkgcmVzdG9yZVxuIikpOwpAQCAtNjIxLDMgKzczMiw0NTUgQEAg cmVhZF9yZXN0b3JlX2ZpbHRlcnMoY29uc3QgY2hhciAqZmlsZW5hbWUsIFJlc3RvcmVPcHRpb25z ICpvcHRzKQogCiAJZmlsdGVyX2ZyZWUoJmZzdGF0ZSk7CiB9CisKK3N0YXRpYyBib29sCitfZmls ZUV4aXN0c0luRGlyZWN0b3J5KGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqZmlsZW5hbWUp Cit7CisJc3RydWN0IHN0YXQJCXN0OworCWNoYXIJCQkgYnVmW01BWFBHUEFUSF07CisKKwlpZiAo c25wcmludGYoYnVmLCBNQVhQR1BBVEgsICIlcy8lcyIsIGRpciwgZmlsZW5hbWUpID49IE1BWFBH UEFUSCkKKwkJcGdfZmF0YWwoImRpcmVjdG9yeSBuYW1lIHRvbyBsb25nOiBcIiVzXCIiLCBkaXIp OworCisJcmV0dXJuIChzdGF0KGJ1ZiwgJnN0KSA9PSAwICYmIFNfSVNSRUcoc3Quc3RfbW9kZSkp OworfQorCisvKgorICogRmluZCBhIGxpc3Qgb2YgZGF0YWJhc2UgbmFtZXMgdGhhdCBtYXRjaCB0 aGUgZ2l2ZW4gcGF0dGVybnMuCisgKiBTZWUgYWxzbyBleHBhbmRfdGFibGVfbmFtZV9wYXR0ZXJu cygpIGluIHBnX2R1bXAuYworICovCitzdGF0aWMgdm9pZAorZXhwYW5kX2RibmFtZV9wYXR0ZXJu cyhQR2Nvbm4gKmNvbm4sCisJCQkJCSAgIFNpbXBsZVN0cmluZ0xpc3QgKnBhdHRlcm5zLAorCQkJ CQkgICBTaW1wbGVTdHJpbmdMaXN0ICpuYW1lcykKK3sKKwlQUUV4cEJ1ZmZlciBxdWVyeTsKKwlQ R3Jlc3VsdCAgICpyZXM7CisKKwlpZiAocGF0dGVybnMtPmhlYWQgPT0gTlVMTCkKKwkJcmV0dXJu OwkJCQkJLyogbm90aGluZyB0byBkbyAqLworCisJcXVlcnkgPSBjcmVhdGVQUUV4cEJ1ZmZlcigp OworCisJLyoKKwkgKiBUaGUgbG9vcCBiZWxvdyBydW5zIG11bHRpcGxlIFNFTEVDVHMsIHdoaWNo IG1pZ2h0IHNvbWV0aW1lcyByZXN1bHQgaW4KKwkgKiBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUg bmFtZSBsaXN0LCBidXQgd2UgZG9uJ3QgY2FyZSwgc2luY2UgYWxsIHdlJ3JlCisJICogZ29pbmcg dG8gZG8gaXMgdGVzdCBtZW1iZXJzaGlwIG9mIHRoZSBsaXN0LgorCSAqLworCisJZm9yIChTaW1w bGVTdHJpbmdMaXN0Q2VsbCAqY2VsbCA9IHBhdHRlcm5zLT5oZWFkOyBjZWxsOyBjZWxsID0gY2Vs bC0+bmV4dCkKKwl7CisJCWludAkJCWRvdGNudDsKKworCQlhcHBlbmRQUUV4cEJ1ZmZlclN0cihx dWVyeSwKKwkJCQkJCQkgIlNFTEVDVCBkYXRuYW1lIEZST00gcGdfY2F0YWxvZy5wZ19kYXRhYmFz ZSBuXG4iKTsKKwkJcHJvY2Vzc1NRTE5hbWVQYXR0ZXJuKGNvbm4sIHF1ZXJ5LCBjZWxsLT52YWws IGZhbHNlLAorCQkJCQkJCSAgZmFsc2UsIE5VTEwsICJkYXRuYW1lIiwgTlVMTCwgTlVMTCwgTlVM TCwKKwkJCQkJCQkgICZkb3RjbnQpOworCisJCWlmIChkb3RjbnQgPiAwKQorCQl7CisJCQlwZ19s b2dfZXJyb3IoImltcHJvcGVyIHF1YWxpZmllZCBuYW1lICh0b28gbWFueSBkb3R0ZWQgbmFtZXMp OiAlcyIsCisJCQkJCQkgY2VsbC0+dmFsKTsKKwkJCVBRZmluaXNoKGNvbm4pOworCQkJZXhpdF9u aWNlbHkoMSk7CisJCX0KKworCQlyZXMgPSBleGVjdXRlUXVlcnkoY29ubiwgcXVlcnktPmRhdGEp OworCQlmb3IgKGludCBpID0gMDsgaSA8IFBRbnR1cGxlcyhyZXMpOyBpKyspCisJCXsKKwkJCXNp bXBsZV9zdHJpbmdfbGlzdF9hcHBlbmQobmFtZXMsIFBRZ2V0dmFsdWUocmVzLCBpLCAwKSk7CisJ CX0KKworCQlQUWNsZWFyKHJlcyk7CisJCXJlc2V0UFFFeHBCdWZmZXIocXVlcnkpOworCX0KKwor CWRlc3Ryb3lQUUV4cEJ1ZmZlcihxdWVyeSk7Cit9CisKKy8qCisgKiBNYWtlIGEgZGF0YWJhc2Ug Y29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiAgQW4KKyAqIGludGVyYWN0aXZl IHBhc3N3b3JkIHByb21wdCBpcyBhdXRvbWF0aWNhbGx5IGlzc3VlZCBpZiByZXF1aXJlZC4KKyAq CisgKiBJZiBmYWlsX29uX2Vycm9yIGlzIGZhbHNlLCB3ZSByZXR1cm4gTlVMTCB3aXRob3V0IHBy aW50aW5nIGFueSBtZXNzYWdlCisgKiBvbiBmYWlsdXJlLCBidXQgcHJlc2VydmUgYW55IHByb21w dGVkIHBhc3N3b3JkIGZvciB0aGUgbmV4dCB0cnkuCisgKgorICovCitzdGF0aWMgUEdjb25uICoK K2Nvbm5lY3REYXRhYmFzZShjb25zdCBjaGFyICpkYm5hbWUsIGNvbnN0IGNoYXIgKmNvbm5lY3Rp b25fc3RyaW5nLAorCQkJCWNvbnN0IGNoYXIgKnBnaG9zdCwgY29uc3QgY2hhciAqcGdwb3J0LCBj b25zdCBjaGFyICpwZ3VzZXIsCisJCQkJdHJpdmFsdWUgcHJvbXB0X3Bhc3N3b3JkLCBib29sIGZh aWxfb25fZXJyb3IpCit7CisJUEdjb25uCSAgICpjb25uOworCWJvb2wJCW5ld19wYXNzOworCWNv bnN0IGNoYXIgKnJlbW90ZXZlcnNpb25fc3RyOworCWludAkJCW15X3ZlcnNpb247CisJY29uc3Qg Y2hhciAqKmtleXdvcmRzID0gTlVMTDsKKwljb25zdCBjaGFyICoqdmFsdWVzID0gTlVMTDsKKwlQ UWNvbm5pbmZvT3B0aW9uICpjb25uX29wdHMgPSBOVUxMOworCXN0YXRpYyBjaGFyICpwYXNzd29y ZCA9IE5VTEw7CisJc3RhdGljIGludCAgc2VydmVyX3ZlcnNpb247CisKKwlpZiAocHJvbXB0X3Bh c3N3b3JkID09IFRSSV9ZRVMgJiYgIXBhc3N3b3JkKQorCQlwYXNzd29yZCA9IHNpbXBsZV9wcm9t cHQoIlBhc3N3b3JkOiAiLCBmYWxzZSk7CisKKwkvKgorCSAqIFN0YXJ0IHRoZSBjb25uZWN0aW9u LiAgTG9vcCB1bnRpbCB3ZSBoYXZlIGEgcGFzc3dvcmQgaWYgcmVxdWVzdGVkIGJ5CisJICogYmFj a2VuZC4KKwkgKi8KKwlkbworCXsKKwkJaW50CQkJYXJnY291bnQgPSA2OworCQlQUWNvbm5pbmZv T3B0aW9uICpjb25uX29wdDsKKwkJY2hhcgkgICAqZXJyX21zZyA9IE5VTEw7CisJCWludAkJCWkg PSAwOworCisJCWZyZWUoa2V5d29yZHMpOworCQlmcmVlKHZhbHVlcyk7CisJCVBRY29ubmluZm9G cmVlKGNvbm5fb3B0cyk7CisKKwkJLyoKKwkJICogTWVyZ2UgdGhlIGNvbm5lY3Rpb24gaW5mbyBp bnB1dHMgZ2l2ZW4gaW4gZm9ybSBvZiBjb25uZWN0aW9uIHN0cmluZworCQkgKiBhbmQgb3RoZXIg b3B0aW9ucy4gIEV4cGxpY2l0bHkgZGlzY2FyZCBhbnkgZGJuYW1lIHZhbHVlIGluIHRoZQorCQkg KiBjb25uZWN0aW9uIHN0cmluZzsgb3RoZXJ3aXNlLCBQUWNvbm5lY3RkYlBhcmFtcygpIHdvdWxk IGludGVycHJldAorCQkgKiB0aGF0IHZhbHVlIGFzIGJlaW5nIGl0c2VsZiBhIGNvbm5lY3Rpb24g c3RyaW5nLgorCQkgKi8KKwkJaWYgKGNvbm5lY3Rpb25fc3RyaW5nKQorCQl7CisJCQljb25uX29w dHMgPSBQUWNvbm5pbmZvUGFyc2UoY29ubmVjdGlvbl9zdHJpbmcsICZlcnJfbXNnKTsKKwkJCWlm IChjb25uX29wdHMgPT0gTlVMTCkKKwkJCQlwZ19mYXRhbCgiJXMiLCBlcnJfbXNnKTsKKworCQkJ Zm9yIChjb25uX29wdCA9IGNvbm5fb3B0czsgY29ubl9vcHQtPmtleXdvcmQgIT0gTlVMTDsgY29u bl9vcHQrKykKKwkJCXsKKwkJCQlpZiAoY29ubl9vcHQtPnZhbCAhPSBOVUxMICYmIGNvbm5fb3B0 LT52YWxbMF0gIT0gJ1wwJyAmJgorCQkJCQlzdHJjbXAoY29ubl9vcHQtPmtleXdvcmQsICJkYm5h bWUiKSAhPSAwKQorCQkJCQlhcmdjb3VudCsrOworCQkJfQorCisJCQlrZXl3b3JkcyA9IHBnX21h bGxvYzAoKGFyZ2NvdW50ICsgMSkgKiBzaXplb2YoKmtleXdvcmRzKSk7CisJCQl2YWx1ZXMgPSBw Z19tYWxsb2MwKChhcmdjb3VudCArIDEpICogc2l6ZW9mKCp2YWx1ZXMpKTsKKworCQkJZm9yIChj b25uX29wdCA9IGNvbm5fb3B0czsgY29ubl9vcHQtPmtleXdvcmQgIT0gTlVMTDsgY29ubl9vcHQr KykKKwkJCXsKKwkJCQlpZiAoY29ubl9vcHQtPnZhbCAhPSBOVUxMICYmIGNvbm5fb3B0LT52YWxb MF0gIT0gJ1wwJyAmJgorCQkJCQlzdHJjbXAoY29ubl9vcHQtPmtleXdvcmQsICJkYm5hbWUiKSAh PSAwKQorCQkJCXsKKwkJCQkJa2V5d29yZHNbaV0gPSBjb25uX29wdC0+a2V5d29yZDsKKwkJCQkJ dmFsdWVzW2ldID0gY29ubl9vcHQtPnZhbDsKKwkJCQkJaSsrOworCQkJCX0KKwkJCX0KKwkJfQor CQllbHNlCisJCXsKKwkJCWtleXdvcmRzID0gcGdfbWFsbG9jMCgoYXJnY291bnQgKyAxKSAqIHNp emVvZigqa2V5d29yZHMpKTsKKwkJCXZhbHVlcyA9IHBnX21hbGxvYzAoKGFyZ2NvdW50ICsgMSkg KiBzaXplb2YoKnZhbHVlcykpOworCQl9CisKKwkJaWYgKHBnaG9zdCkKKwkJeworCQkJa2V5d29y ZHNbaV0gPSAiaG9zdCI7CisJCQl2YWx1ZXNbaV0gPSBwZ2hvc3Q7CisJCQlpKys7CisJCX0KKwkJ aWYgKHBncG9ydCkKKwkJeworCQkJa2V5d29yZHNbaV0gPSAicG9ydCI7CisJCQl2YWx1ZXNbaV0g PSBwZ3BvcnQ7CisJCQlpKys7CisJCX0KKwkJaWYgKHBndXNlcikKKwkJeworCQkJa2V5d29yZHNb aV0gPSAidXNlciI7CisJCQl2YWx1ZXNbaV0gPSBwZ3VzZXI7CisJCQlpKys7CisJCX0KKwkJaWYg KHBhc3N3b3JkKQorCQl7CisJCQlrZXl3b3Jkc1tpXSA9ICJwYXNzd29yZCI7CisJCQl2YWx1ZXNb aV0gPSBwYXNzd29yZDsKKwkJCWkrKzsKKwkJfQorCQlpZiAoZGJuYW1lKQorCQl7CisJCQlrZXl3 b3Jkc1tpXSA9ICJkYm5hbWUiOworCQkJdmFsdWVzW2ldID0gZGJuYW1lOworCQkJaSsrOworCQl9 CisJCWtleXdvcmRzW2ldID0gImZhbGxiYWNrX2FwcGxpY2F0aW9uX25hbWUiOworCQl2YWx1ZXNb aV0gPSBwcm9nbmFtZTsKKwkJaSsrOworCisJCW5ld19wYXNzID0gZmFsc2U7CisJCWNvbm4gPSBQ UWNvbm5lY3RkYlBhcmFtcyhrZXl3b3JkcywgdmFsdWVzLCB0cnVlKTsKKworCQlpZiAoIWNvbm4p CisJCQlwZ19mYXRhbCgiY291bGQgbm90IGNvbm5lY3QgdG8gZGF0YWJhc2UgXCIlc1wiIiwgZGJu YW1lKTsKKworCQlpZiAoUFFzdGF0dXMoY29ubikgPT0gQ09OTkVDVElPTl9CQUQgJiYKKwkJCVBR Y29ubmVjdGlvbk5lZWRzUGFzc3dvcmQoY29ubikgJiYKKwkJCSFwYXNzd29yZCAmJgorCQkJcHJv bXB0X3Bhc3N3b3JkICE9IFRSSV9OTykKKwkJeworCQkJUFFmaW5pc2goY29ubik7CisJCQlwYXNz d29yZCA9IHNpbXBsZV9wcm9tcHQoIlBhc3N3b3JkOiAiLCBmYWxzZSk7CisJCQluZXdfcGFzcyA9 IHRydWU7CisJCX0KKwl9IHdoaWxlIChuZXdfcGFzcyk7CisKKwkvKiBjaGVjayB0byBzZWUgdGhh dCB0aGUgYmFja2VuZCBjb25uZWN0aW9uIHdhcyBzdWNjZXNzZnVsbHkgbWFkZSAqLworCWlmIChQ UXN0YXR1cyhjb25uKSA9PSBDT05ORUNUSU9OX0JBRCkKKwl7CisJCWlmIChmYWlsX29uX2Vycm9y KQorCQkJcGdfZmF0YWwoIiVzIiwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCQllbHNlCisJCXsK KwkJCVBRZmluaXNoKGNvbm4pOworCisJCQlmcmVlKGtleXdvcmRzKTsKKwkJCWZyZWUodmFsdWVz KTsKKwkJCVBRY29ubmluZm9GcmVlKGNvbm5fb3B0cyk7CisKKwkJCXJldHVybiBOVUxMOworCQl9 CisJfQorCisJZnJlZShrZXl3b3Jkcyk7CisJZnJlZSh2YWx1ZXMpOworCVBRY29ubmluZm9GcmVl KGNvbm5fb3B0cyk7CisKKwkvKiBDaGVjayB2ZXJzaW9uICovCisJcmVtb3RldmVyc2lvbl9zdHIg PSBQUXBhcmFtZXRlclN0YXR1cyhjb25uLCAic2VydmVyX3ZlcnNpb24iKTsKKwlpZiAoIXJlbW90 ZXZlcnNpb25fc3RyKQorCQlwZ19mYXRhbCgiY291bGQgbm90IGdldCBzZXJ2ZXIgdmVyc2lvbiIp OworCXNlcnZlcl92ZXJzaW9uID0gUFFzZXJ2ZXJWZXJzaW9uKGNvbm4pOworCWlmIChzZXJ2ZXJf dmVyc2lvbiA9PSAwKQorCQlwZ19mYXRhbCgiY291bGQgbm90IHBhcnNlIHNlcnZlciB2ZXJzaW9u IFwiJXNcIiIsCisJCQkJIHJlbW90ZXZlcnNpb25fc3RyKTsKKworCW15X3ZlcnNpb24gPSBQR19W RVJTSU9OX05VTTsKKworCS8qCisJICogV2UgYWxsb3cgdGhlIHNlcnZlciB0byBiZSBiYWNrIHRv IDkuMiwgYW5kIHVwIHRvIGFueSBtaW5vciByZWxlYXNlIG9mCisJICogb3VyIG93biBtYWpvciB2 ZXJzaW9uLiAgKFNlZSBhbHNvIHZlcnNpb24gY2hlY2sgaW4gcGdfZHVtcC5jLikKKwkgKi8KKwlp ZiAobXlfdmVyc2lvbiAhPSBzZXJ2ZXJfdmVyc2lvbgorCQkmJiAoc2VydmVyX3ZlcnNpb24gPCA5 MDIwMCB8fAorCQkJKHNlcnZlcl92ZXJzaW9uIC8gMTAwKSA+IChteV92ZXJzaW9uIC8gMTAwKSkp CisJeworCQlwZ19sb2dfZXJyb3IoImFib3J0aW5nIGJlY2F1c2Ugb2Ygc2VydmVyIHZlcnNpb24g bWlzbWF0Y2giKTsKKwkJcGdfbG9nX2Vycm9yX2RldGFpbCgic2VydmVyIHZlcnNpb246ICVzOyAl cyB2ZXJzaW9uOiAlcyIsCisJCQkJCQkJcmVtb3RldmVyc2lvbl9zdHIsIHByb2duYW1lLCBQR19W RVJTSU9OKTsKKwkJZXhpdF9uaWNlbHkoMSk7CisJfQorCisJUFFjbGVhcihleGVjdXRlUXVlcnko Y29ubiwgQUxXQVlTX1NFQ1VSRV9TRUFSQ0hfUEFUSF9TUUwpKTsKKworCXJldHVybiBjb25uOwor fQorCisvKgorICogUnVuIGEgcXVlcnksIHJldHVybiB0aGUgcmVzdWx0cywgZXhpdCBwcm9ncmFt IG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBQR3Jlc3VsdCAqCitleGVjdXRlUXVlcnkoUEdjb25u ICpjb25uLCBjb25zdCBjaGFyICpxdWVyeSkKK3sKKwlQR3Jlc3VsdCAgICpyZXM7CisKKwlwZ19s b2dfaW5mbygiZXhlY3V0aW5nICVzIiwgcXVlcnkpOworCisJcmVzID0gUFFleGVjKGNvbm4sIHF1 ZXJ5KTsKKwlpZiAoIXJlcyB8fCBQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX1RVUExFU19P SykKKwl7CisJCXBnX2xvZ19lcnJvcigicXVlcnkgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdl KGNvbm4pKTsKKwkJcGdfbG9nX2Vycm9yX2RldGFpbCgiUXVlcnkgd2FzOiAlcyIsIHF1ZXJ5KTsK KwkJUFFmaW5pc2goY29ubik7CisJCWV4aXRfbmljZWx5KDEpOworCX0KKworCXJldHVybiByZXM7 Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0KKyAqCVJlYWRPbmVTdGF0ZW1lbnQoKQorICoKKyAq IFRoaXMgd2lsbCBzdGFydCByZWFkaW5nIGZyb20gcGFzc2VkIGZpbGUgcG9pbnRlciB1c2luZyBm Z2V0YyBhbmQgcmVhZCB0aWxsCisgKiBzZW1pY29sb24oc3FsIHN0YXRlbWVudCB0ZXJtaW5hdG9y IGZvciBnbG9iYWwuc3FsIGZpbGUpCisgKgorICoJRU9GIGlzIHJldHVybmVkIGlmIGVuZC1vZi1m aWxlIGlucHV0IGlzIHNlZW47IHRpbWUgdG8gc2h1dCBkb3duLgorICogLS0tLS0tLS0tLS0tLS0t LQorICovCisKK3N0YXRpYyBpbnQKK1JlYWRPbmVTdGF0ZW1lbnQoU3RyaW5nSW5mbyBpbkJ1Ziwg RklMRSAqZl9nbG8pCit7CisJaW50CQkJYzsJCQkJLyogY2hhcmFjdGVyIHJlYWQgZnJvbSBnZXRj KCkgKi8KKworCXJlc2V0U3RyaW5nSW5mbyhpbkJ1Zik7CisKKwkvKgorCSAqIFJlYWQgY2hhcmFj dGVycyB1bnRpbCBFT0Ygb3IgdGhlIGFwcHJvcHJpYXRlIGRlbGltaXRlciBpcyBzZWVuLgorCSAq LworCXdoaWxlICgoYyA9IGZnZXRjKGZfZ2xvKSkgIT0gRU9GKQorCXsKKwkJYXBwZW5kU3RyaW5n SW5mb0NoYXIoaW5CdWYsIChjaGFyKSBjKTsKKworCQlpZiAoYyA9PSAnXG4nKQorCQl7CisJCQlp ZihpbkJ1Zi0+bGVuID4gMSAmJgorCQkJCQlpbkJ1Zi0+ZGF0YVtpbkJ1Zi0+bGVuIC0gMl0gPT0g JzsnKQorCQkJCWJyZWFrOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCQl9CisJfQorCisJLyog Tm8gaW5wdXQgYmVmb3JlIEVPRiBzaWduYWwgbWVhbnMgdGltZSB0byBxdWl0LiAqLworCWlmIChj ID09IEVPRiAmJiBpbkJ1Zi0+bGVuID09IDApCisJCXJldHVybiBFT0Y7CisKKwkvKiBBZGQgJ1ww JyB0byBtYWtlIGl0IGxvb2sgdGhlIHNhbWUgYXMgbWVzc2FnZSBjYXNlLiAqLworCWFwcGVuZFN0 cmluZ0luZm9DaGFyKGluQnVmLCAoY2hhcikgJ1wwJyk7CisKKwlyZXR1cm4gJ1EnOworfQorCisv KgorICogVGhpcyB3aWxsIHJlc3RvcmUgZGF0YWJhc2VzIHRob3NlIGR1bXBzIGFyZSBwcmVzZW50 IGluCisgKiBkaXJlY3RvcnkuCisgKgorICogVGhpcyB3aWxsIHByb2Nlc3MgZGIgb25lIGJ5IG9u ZSBhcyBuYW1lcyBhbmQgZGJvaWQgYXJlIG1lbnRpb25lZCBpbiBtYXAuZGF0CisgKiBmaWxlLgor ICovCitzdGF0aWMgaW50CityZXN0b3JlQWxsRGF0YWJhc2VzKGNvbnN0IGNoYXIgKmR1bXBkaXJw YXRoLAorCQlTaW1wbGVTdHJpbmdMaXN0IGRhdGFiYXNlX2V4Y2x1ZGVfbmFtZXMsIFJlc3RvcmVP cHRpb25zICpvcHRzLAorCQlpbnQgbnVtV29ya2VycykKK3sKKwljaGFyCW1hcF9maWxlX3BhdGhb TUFYUEdQQVRIXTsKKwljaGFyCWxpbmVbTUFYUEdQQVRIXTsKKwlpbnQJCWxpbmVubyA9IDA7CisJ aW50CQlleGl0X2NvZGUgPSAwOworCWludAkJcHJvY2Vzc2VkX2RiID0gMDsKKwlGSUxFCSpwZmls ZTsKKworCXNucHJpbnRmKG1hcF9maWxlX3BhdGgsIE1BWFBHUEFUSCwgIiVzL21hcC5kYXQiLCBk dW1wZGlycGF0aCk7CisKKwkvKiBPcGVuIG1hcC5kYXQgZmlsZS4gKi8KKwlwZmlsZSA9IGZvcGVu KG1hcF9maWxlX3BhdGgsICJyIik7CisKKwlpZiAocGZpbGUgPT0gTlVMTCkKKwkJcGdfZmF0YWwo ImNvdWxkIG5vdCBvcGVuIG1hcC5kYXQgZmlsZTogJXMiLCBzdHJlcnJvcihlcnJubykpOworCisJ LyoKKwkgKiBSZWFkIG9uZSBsaW5lIGZyb20gbWFwLmRhdCBhbmQgZXh0cmFjdCBkYm5hbWUgYW5k IGRib2lkIHRvIHJlc3RvcmUgaXQuCisJICovCisJd2hpbGUoKGZnZXRzKGxpbmUsIE1BWFBHUEFU SCwgcGZpbGUpKSAhPSBOVUxMKQorCXsKKwkJY2hhcgkJc3ViZGlycGF0aFtNQVhQR1BBVEhdOwor CQlPaWQJCQlkYm9pZDsKKwkJY2hhcgkJZGJuYW1lW01BWFBHUEFUSCArIDFdOworCQlpbnQJCQlk YmV4aXRfY29kZTsKKworCQlsaW5lbm8rKzsKKworCQkvKgorCQkgKiBXZSBuZWVkIHRvIHJlc2V0 IG92ZXJyaWRlX2RibmFtZSBzbyB0aGF0IG9iamVjdHMgY2FuIGJlIHJlc3RvcmVkIGludG8KKwkJ ICogYWxyZWFkeSBjcmVhdGVkIGRhdGFiYXNlLiAodXNlZCB3aXRoIC1kLy0tZGJuYW1lIG9wdGlv bikKKwkJICovCisJCWlmIChvcHRzLT5jcGFyYW1zLm92ZXJyaWRlX2RibmFtZSkKKwkJeworCQkJ cGZyZWUob3B0cy0+Y3BhcmFtcy5vdmVycmlkZV9kYm5hbWUpOworCQkJb3B0cy0+Y3BhcmFtcy5v dmVycmlkZV9kYm5hbWUgPSBOVUxMOworCQl9CisKKwkJLyogRXh0cmFjdCBkYm5hbWUgYW5kIGRi b2lkIGZyb20gbGluZSAqLworCQlzc2NhbmYobGluZSwgIiV1ICVzIiAsICZkYm9pZCwgZGJuYW1l KTsKKworCQlwZ19sb2dfaW5mbygiZm91bmQgZGJuYW1lIGFzIDolcyBhbmQgZGJvaWQ6JWQgaW4g bWFwLmRhdCBmaWxlIHdoaWxlIHJlc3RvcmluZyIsIGRibmFtZSwgZGJvaWQpOworCisJCS8qIFJl cG9ydCBlcnJvciBpZiBmaWxlIGhhcyBhbnkgY29ycnVwdGVkIGRhdGEuICovCisJCWlmICghT2lk SXNWYWxpZChkYm9pZCkgfHwgc3RybGVuKGRibmFtZSkgPT0gMCkKKwkJCXBnX2ZhdGFsKCJpbnZh bGlkIGVudHJ5IGluIG1hcC5kYXQgZmlsZSBhdCBsaW5lIDogJWQiLCBsaW5lbm8pOworCisJCXNu cHJpbnRmKHN1YmRpcnBhdGgsIE1BWFBHUEFUSCwgIiVzL2RhdGFiYXNlcy8ldSIsIGR1bXBkaXJw YXRoLCBkYm9pZCk7CisKKwkJLyoKKwkJICogRGF0YWJhc2UgLWQvLS1kYm5hbWUgaXMgYWxyZWFk eSBjcmVhdGVkIHNvIHJlc2V0IGNyZWF0ZURCIHRvIGlnbm9yZQorCQkgKiBkYXRhYmFzZSBjcmVh dGlvbiBlcnJvci4KKwkJICovCisJCWlmIChzdHJjbXAoZGJuYW1lLCBvcHRzLT5jcGFyYW1zLmRi bmFtZSkgPT0gMCkKKwkJCW9wdHMtPmNyZWF0ZURCID0gMDsKKworCQkvKiBTa2lwIGFueSBleHBs aWNpdGx5IGV4Y2x1ZGVkIGRhdGFiYXNlICovCisJCWlmIChzaW1wbGVfc3RyaW5nX2xpc3RfbWVt YmVyKCZkYXRhYmFzZV9leGNsdWRlX25hbWVzLCBkYm5hbWUpKQorCQl7CisJCQlwZ19sb2dfaW5m bygiZXhjbHVkaW5nIGRhdGFiYXNlIFwiJXNcIiIsIGRibmFtZSk7CisJCQljb250aW51ZTsKKwkJ fQorCisJCXBnX2xvZ19pbmZvKCJyZXN0b3JpbmcgZGF0YWJhc2UgXCIlc1wiIiwgZGJuYW1lKTsK KworCQlkYmV4aXRfY29kZSA9IHJlc3RvcmVPbmVEYXRhYmFzZShzdWJkaXJwYXRoLCBvcHRzLCBu dW1Xb3JrZXJzKTsKKworCQkvKiBTdG9yZSBleGl0X2NvZGUgdG8gcmVwb3J0IGl0IGJhY2suICov CisJCWlmIChleGl0X2NvZGUgPT0gMCAmJiBkYmV4aXRfY29kZSAhPSAwKQorCQkJZXhpdF9jb2Rl ID0gZGJleGl0X2NvZGU7CisKKwkJcHJvY2Vzc2VkX2RiKys7CisKKwkJLyogU2V0IGNyZWF0ZURC IG9wdGlvbiB0byBjcmVhdGUgbmV3IGRhdGFiYXNlLiAqLworCQlpZiAoc3RyY21wKGRibmFtZSwg b3B0cy0+Y3BhcmFtcy5kYm5hbWUpID09IDApCisJCQlvcHRzLT5jcmVhdGVEQiA9IDE7CisJfSAv KiBlbmQgd2hpbGUgKi8KKworCS8qIExvZyBudW1iZXIgb2YgcHJvY2Vzc2VkIGRhdGFiYXNlcy4q LworCXBnX2xvZ19pbmZvKCJudW1iZXIgb2YgcmVzdG9yZWQgZGF0YWJhc2VzIGFyZSAlZCIsIHBy b2Nlc3NlZF9kYik7CisKKwlyZXR1cm4gZXhpdF9jb2RlOworfQorCisvKgorICogVGhpcyB3aWxs IG9wZW4gZ2xvYmFsLmRhdCBmaWxlIGFuZCB3aWxsIGV4ZWN1dGUgYWxsIGdsb2JhbCBzcWwgY29t bWFuZHMgb25lCisgKiBieSBvbmUgc3RhdGVtZW50LgorICoKKyAqIHNlbWljb2xvbiBpcyBjb25z aWRlcmVkIGFzIHN0YXRlbWVudCB0ZXJtaW5hdG9yLgorICovCitzdGF0aWMgdm9pZAorZXhlY3V0 ZV9nbG9iYWxfc3FsX2NvbW1hbmRzKFBHY29ubiAqY29ubiwgY29uc3QgY2hhciAqZHVtcGRpcnBh dGgpCit7CisJY2hhciAgICAgICAgICAgIGdsb2JhbF9maWxlX3BhdGhbTUFYUEdQQVRIXTsKKwlQ R3Jlc3VsdAkJKnJlc3VsdDsKKwlTdHJpbmdJbmZvRGF0YQlzcWxzdGF0ZW1lbnQ7CisJRklMRQkJ CSpwZmlsZTsKKworCXNucHJpbnRmKGdsb2JhbF9maWxlX3BhdGgsIE1BWFBHUEFUSCwgIiVzL2ds b2JhbC5kYXQiLCBkdW1wZGlycGF0aCk7CisKKwkvKiBub3cgb3BlbiBnbG9iYWwuZGF0IGZpbGUg Ki8KKwlwZmlsZSA9IGZvcGVuKGdsb2JhbF9maWxlX3BhdGgsICJyIik7CisKKwlpZiAocGZpbGUg PT0gTlVMTCkKKwkJcGdfZmF0YWwoImNvdWxkIG5vdCBvcGVuIGdsb2JhbC5kYXQgZmlsZTogJXMi LCBzdHJlcnJvcihlcnJubykpOworCisJLyogSW5pdCBzcWxzdGF0ZW1lbnQgdG8gYXBwZW5kIGNv bW1hbmRzICovCisJaW5pdFN0cmluZ0luZm8oJnNxbHN0YXRlbWVudCk7CisKKwkvKiBQcm9jZXNz IGZpbGUgdGlsbCBFT0YgYW5kIGV4ZWN1dGUgc3FsIHN0YXRlbWVudHMgKi8KKwl3aGlsZSAoUmVh ZE9uZVN0YXRlbWVudCgmc3Fsc3RhdGVtZW50LCBwZmlsZSkgIT0gRU9GKQorCXsKKwkJcmVzdWx0 ID0gUFFleGVjKGNvbm4sIHNxbHN0YXRlbWVudC5kYXRhKTsKKworCQlzd2l0Y2ggKFBRcmVzdWx0 U3RhdHVzKHJlc3VsdCkpCisJCXsKKwkJCWNhc2UgUEdSRVNfQ09NTUFORF9PSzoKKwkJCWNhc2Ug UEdSRVNfVFVQTEVTX09LOgorCQkJY2FzZSBQR1JFU19FTVBUWV9RVUVSWToKKwkJCWNhc2UgUEdS RVNfQ09QWV9JTjoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcGdfbG9nX2Vycm9yKCJj b3VsZCBub3QgZXhlY3V0ZSBxdWVyeTogJXMgXG5Db21tYW5kIHdhczogJXMiLCBQUWVycm9yTWVz c2FnZShjb25uKSwgc3Fsc3RhdGVtZW50LmRhdGEpOworCQl9CisJfQorfQotLSAKMS44LjMuMQoK --000000000000f9e90b062a9507e3--