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 1rg9ox-004WCn-Te for pgsql-hackers@arkaria.postgresql.org; Fri, 01 Mar 2024 20:49:33 +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 1rg9ov-00F13u-OM for pgsql-hackers@arkaria.postgresql.org; Fri, 01 Mar 2024 20:49:30 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rg9ou-00F13m-EL for pgsql-hackers@lists.postgresql.org; Fri, 01 Mar 2024 20:49:29 +0000 Received: from fhigh7-smtp.messagingengine.com ([103.168.172.158]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rg9on-002NeV-HS for pgsql-hackers@lists.postgresql.org; Fri, 01 Mar 2024 20:49:27 +0000 Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailfhigh.nyi.internal (Postfix) with ESMTP id 2D7771140105; Fri, 1 Mar 2024 15:49:21 -0500 (EST) Received: from imap49 ([10.202.2.99]) by compute2.internal (MEProxy); Fri, 01 Mar 2024 15:49:21 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=eulerto.com; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm2; t=1709326161; x=1709412561; bh=zXwCf+QJjS Oy8pqRnBGzR/NCRxbxVk+w8cwx60fQ9pQ=; b=YPGtC35rXQO6NoNyGpVFKXuVY8 hy/FbkQDPDRmhifxKyicdJw7QGbkV4JZ34dgNbzVFAskAsKgBjhCA3+3ofvO5U0X mqikdipoQGgZIMFQl1XDDfGBmu0rvp2h9+a8BIusUyUHV8hosUpBp2+vCqHiEGqg XoU+xULYy8+qWEpW9fGTO+2zz3xdhX4yCvGFAAaYQWHOpG/0DYUj2kWpiqFud30o BXlsuNK07NPM0Y/FLPyogkdlGzFdzx2+eq5hF8SAQ3015/hV0x9Va78LuAk013U0 z50eYgKJZvM4SQB9LjUYllRWGSDwrLYgwIfayYPux3Ihr+hHb1V2ZSajuyCg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; t=1709326161; x=1709412561; bh=zXwCf+QJjSOy8pqRnBGzR/NCRxbx Vk+w8cwx60fQ9pQ=; b=ORnPVqq2fzSeUQRTa/gortwQukG1WtePrJ5chiUJSCHx obRJMbz/lJ8CjfbpzMBvvV8wpZCAii/2khm9XbLAAg5ydGMcjCb8tVxVD79ctZKb RFCwVJhfhbyd/rfG82YmTDR4TSvuf2vlc3xZC3ZKlNul9byxH/eN6GIPuMfppiTk YXWDtAlSn7xTchVNtusSB5l6TBUYDHcqjzpVcvxQT2Lcqct2qUIgeGuMfHtHbfSZ 9O35yszVV8zvrXr3Ch8N/KjiEKcti+FJmZHc07MccTTkgV+n6eeiRf+WUonDyoUD ZdihTj/hcvAll+5w0TDvMAtJAoLr9j8Dnaxo34+BDw== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvledrhedugddugedtucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepofgfggfkjghffffhvfevufgtsehmtderreerredtnecuhfhrohhmpedfgfhu lhgvrhcuvfgrvhgvihhrrgdfuceovghulhgvrhesvghulhgvrhhtohdrtghomheqnecugg ftrfgrthhtvghrnhepieehueelvddvjeetjeeiudetfeeghffgfedtgefgkeehgfeuteei keevudeitefgnecuffhomhgrihhnpehpohhsthhgrhgvshhqlhdrohhrghdpvghnthgvrh hprhhishgvuggsrdgtohhmnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehm rghilhhfrhhomhepvghulhgvrhesvghulhgvrhhtohdrtghomh X-ME-Proxy: Feedback-ID: i0c21471d:Fastmail Received: by mailuser.nyi.internal (Postfix, from userid 501) id 910E715A0093; Fri, 1 Mar 2024 15:49:20 -0500 (EST) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.11.0-alpha0-205-g4dbcac4545-fm-20240301.001-g4dbcac45 MIME-Version: 1.0 Message-Id: In-Reply-To: References: <9a9c7e65-c47b-4400-a63e-ac6169c0860e@app.fastmail.com> <8d8d9960-8130-4216-b0e4-adf36b8b1c43@app.fastmail.com> <370673e8-e2da-4249-8f07-cb67e9d9c20e@app.fastmail.com> <34075bd4-c85d-4654-a782-0cd6713b2c89@app.fastmail.com> <2edde173-5ff9-45fd-b881-cd04eb13049f@app.fastmail.com> <2231a04b-f2d4-4a4e-b5cd-56be8b002427@app.fastmail.com> Date: Fri, 01 Mar 2024 17:48:20 -0300 From: "Euler Taveira" To: "kuroda.hayato@fujitsu.com" , "vignesh C" Cc: "pgsql-hackers@lists.postgresql.org" , "Michael Paquier" , "Peter Eisentraut" , "Andres Freund" , "Ashutosh Bapat" , "Amit Kapila" , "Shlok Kyal" , =?UTF-8?Q?Fabr=C3=ADzio_de_Royes_Mello?= Subject: Re: speed up a logical replica setup Content-Type: multipart/mixed; boundary=6ea8fa9c7f69458b892b1878d0005ba3 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --6ea8fa9c7f69458b892b1878d0005ba3 Content-Type: multipart/alternative; boundary=727cadf0aa2a4a7bace7571629a2c9e5 --727cadf0aa2a4a7bace7571629a2c9e5 Content-Type: text/plain On Thu, Feb 22, 2024, at 12:45 PM, Hayato Kuroda (Fujitsu) wrote: > Based on idea from Euler, I roughly implemented. Thought? > > 0001-0013 were not changed from the previous version. > > V24-0014: addressed your comment in the replied e-mail. > V24-0015: Add disconnect_database() again, per [3] > V24-0016: addressed your comment in [4]. > V24-0017: addressed your comment in [5]. > V24-0018: addressed your comment in [6]. Thanks for your review. I'm attaching v25 that hopefully addresses all pending points. Regarding your comments [1] on v21, I included changes for almost all items except 2, 20, 23, 24, and 25. It still think item 2 is not required because pg_ctl will provide a suitable message. I decided not to rearrange the block of SQL commands (item 20) mainly because it would avoid these objects on node_f. Do we really need command_checks_all? Depending on the output it uses additional cycles than command_ok. In summary: v24-0002: documentation is updated. I didn't apply this patch as-is. Instead, I checked what you wrote and fix some gaps in what I've been written. v24-0003: as I said I don't think we need to add it, however, I won't fight against it if people want to add this check. v24-0004: I spent some time on it. This patch is not completed. I cleaned it up and include the start_standby_server code. It starts the server using the specified socket directory, port and username, hence, preventing external client connections during the execution. v24-0005: partially applied v24-0006: applied with cosmetic change v24-0007: applied with cosmetic change v24-0008: applied v24-0009: applied with cosmetic change v24-0010: not applied. Base on #15, I refactored this code a bit. pg_fatal is not used when there is a database connection open. Instead, pg_log_error() followed by disconnect_database(). In cases that it should exit immediately, disconnect_database() has a new parameter (exit_on_error) that controls if it needs to call exit(1). I go ahead and did the same for connect_database(). v24-0011: partially applied. I included some of the suggestions (18, 19, and 21). v24-0012: not applied. Under reflection, after working on v24-0004, the target server will start with new parameters (that only accepts local connections), hence, during the execution is not possible anymore to detect if the target server is a primary for another server. I added a sentence for it in the documentation (Warning section). v24-0013: good catch. Applied. v24-0014: partially applied. After some experiments I decided to use a small number of attempts. The current code didn't reset the counter if the connection is reestablished. I included the documentation suggestion. I didn't include the IF EXISTS in the DROP PUBLICATION because it doesn't solve the issue. Instead, I refactored the drop_publication() to not try again if the DROP PUBLICATION failed. v24-0015: not applied. I refactored the exit code to do the right thing: print error message, disconnect database (if applicable) and exit. v24-0016: not applied. But checked if the information was presented in the documentation; it is. v24-0017: good catch. Applied. v24-0018: not applied. I removed almost all boolean return and include the error logic inside the function. It reads better. I also changed the connect|disconnect_database functions to include the error logic inside it. There is a new parameter on_error_exit for it. I removed the action parameter from pg_ctl_status() -- I think someone suggested it -- and the error message was moved to outside the function. I improved the cleanup routine. It provides useful information if it cannot remove the object (publication or replication slot) from the primary. Since I applied v24-0004, I realized that extra start / stop service are required. It mean pg_createsubscriber doesn't start the transformation with the current standby settings. Instead, it stops the standby if it is running and start it with the provided command-line options (socket, port, listen_addresses). It has a few drawbacks: * See v34-0012. It cannot detect if the target server is a primary for another server. It is documented. * I also removed the check for standby is running. If the standby was stopped a long time ago, it will take some time to reach the start point. * Dry run mode has to start / stop the service to work correctly. Is it an issue? However, I decided to include --retain option, I'm thinking about to remove it. If the logging is enabled, the information during the pg_createsubscriber will be available. The client log can be redirected to a file for future inspection. Comments? [1] https://www.postgresql.org/message-id/TYCPR01MB12077756323B79042F29DDAEDF54C2%40TYCPR01MB12077.jpnprd01.prod.outlook.com -- Euler Taveira EDB https://www.enterprisedb.com/ --727cadf0aa2a4a7bace7571629a2c9e5 Content-Type: text/html Content-Transfer-Encoding: quoted-printable
On Thu, Feb 22,= 2024, at 12:45 PM, Hayato Kuroda (Fujitsu) wrote:
Based on idea from Euler, I roug= hly implemented. Thought?

0001-0013 were no= t changed from the previous version.

V24-00= 14: addressed your comment in the replied e-mail.
V24-0015= : Add disconnect_database() again, per [3]
V24-0016: addre= ssed your comment in [4].
V24-0017: addressed your comment= in [5].
V24-0018: addressed your comment in [6].

Thanks for your review. I'm attaching = v25 that hopefully addresses all pending
points.
=

Regarding your comments [1] on v21, I included chang= es for almost all items
except 2, 20, 23, 24, and 25. It s= till think item 2 is not required because
pg_ctl will prov= ide a suitable message. I decided not to rearrange the block of
SQL commands (item 20) mainly because it would avoid these objects= on node_f.
Do we really need command_checks_all? Dependin= g on the output it uses
additional cycles than command_ok.=

In summary:

v= 24-0002: documentation is updated. I didn't apply this patch as-is. Inst= ead, I
checked what you wrote and fix some gaps in what I'= ve been written.
v24-0003: as I said I don't think we need= to add it, however, I won't fight
against it if people wa= nt to add this check.
v24-0004: I spent some time on it. T= his patch is not completed. I cleaned it up
and include th= e start_standby_server code. It starts the server using the
specified socket directory, port and username, hence, preventing exter= nal client
connections during the execution.
v24-0005: partially applied
v24-0006: applied with cosmet= ic change
v24-0007: applied with cosmetic change
=
v24-0008: applied
v24-0009: applied with cosmetic cha= nge
v24-0010: not applied. Base on #15, I refactored this = code a bit. pg_fatal is
not used when there is a database = connection open. Instead, pg_log_error()
followed by disco= nnect_database(). In cases that it should exit immediately,
disconnect_database() has a new parameter (exit_on_error) that control= s if it
needs to call exit(1). I go ahead and did the same= for connect_database().
v24-0011: partially applied. I in= cluded some of the suggestions (18, 19, and 21).
v24-0012:= not applied. Under reflection, after working on v24-0004, the target
server will start with new parameters (that only accepts loc= al connections),
hence, during the execution is not possib= le anymore to detect if the target
server is a primary for= another server. I added a sentence for it in the
document= ation (Warning section).
v24-0013: good catch. Applied.
v24-0014: partially applied. After some experiments I decide= d to use a small
number of attempts. The current code didn= 't reset the counter if the connection
is reestablished. I= included the documentation suggestion. I didn't include the
IF EXISTS in the DROP PUBLICATION because it doesn't solve the issue.= Instead,
I refactored the drop_publication() to not try a= gain if the DROP PUBLICATION
failed.
v24-001= 5: not applied. I refactored the exit code to do the right thing: print<= br>
error message, disconnect database (if applicable) and exi= t.
v24-0016: not applied. But checked if the information w= as presented in the
documentation; it is.
v2= 4-0017: good catch. Applied.
v24-0018: not applied.

I removed almost all boolean return and include t= he error logic inside the
function. It reads better. I als= o changed the connect|disconnect_database
functions to inc= lude the error logic inside it. There is a new parameter
o= n_error_exit for it. I removed the action parameter from pg_ctl_status()= -- I
think someone suggested it -- and the error message = was moved to outside the
function. I improved the cleanup = routine. It provides useful information if it
cannot remov= e the object (publication or replication slot) from the primary.

Since I applied v24-0004, I realized that extra st= art / stop service are
required. It mean pg_createsubscrib= er doesn't start the transformation with the
current stand= by settings. Instead, it stops the standby if it is running and
start it with the provided command-line options (socket, port,
=
listen_addresses). It has a few drawbacks:
* Se= e v34-0012. It cannot detect if the target server is a primary for anoth= er
  server. It is documented.
* I also= removed the check for standby is running. If the standby was stopped a<= br>
  long time ago, it will take some time to reach the = start point.
* Dry run mode has to start / stop the servic= e to work correctly. Is it an
  issue?
=
However, I decided to include --retain option, I'm thinki= ng about to remove it.
If the logging is enabled, the info= rmation during the pg_createsubscriber will
be available. = The client log can be redirected to a file for future inspection.

Comments?


=


--
Euler Taveira

--727cadf0aa2a4a7bace7571629a2c9e5-- --6ea8fa9c7f69458b892b1878d0005ba3 Content-Disposition: attachment; filename*0="v25-0001-pg_createsubscriber-creates-a-new-logical-replic.pat"; filename*1="ch" Content-Type: text/x-patch; name="=?UTF-8?Q?v25-0001-pg=5Fcreatesubscriber-creates-a-new-logical-replic.pa?= =?UTF-8?Q?tch?=" Content-Transfer-Encoding: BASE64 RnJvbSA0MWYyMjJiNjhhYjRlMzY1YmUwMTIzMDc1ZDU0ZDVkYTg0NjhiY2QyIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBFdWxlciBUYXZlaXJhIDxldWxlci50YXZlaXJhQGVu dGVycHJpc2VkYi5jb20+CkRhdGU6IE1vbiwgNSBKdW4gMjAyMyAxNDozOTo0MCAtMDQwMApT dWJqZWN0OiBbUEFUQ0ggdjI1XSBwZ19jcmVhdGVzdWJzY3JpYmVyOiBjcmVhdGVzIGEgbmV3 IGxvZ2ljYWwgcmVwbGljYSBmcm9tIGEKIHN0YW5kYnkgc2VydmVyCgpJdCBtdXN0IGJlIHJ1 biBvbiB0aGUgdGFyZ2V0IHNlcnZlciBhbmQgc2hvdWxkIGJlIGFibGUgdG8gY29ubmVjdCB0 byB0aGUKc291cmNlIHNlcnZlciAocHVibGlzaGVyKSBhbmQgdGhlIHRhcmdldCBzZXJ2ZXIg KHN1YnNjcmliZXIpLgoKU29tZSBwcmVyZXF1aXNpdGVzIG11c3QgYmUgbWV0IHRvIHN1Y2Nl c3NmdWxseSBydW4gaXQuIEl0IGlzIGJhc2ljYWxseQp0aGUgbG9naWNhbCByZXBsaWNhdGlv biByZXF1aXJlbWVudHMuIEl0IHN0YXJ0cyBjcmVhdGluZyBhIHB1YmxpY2F0aW9uCmZvciBl YWNoIHNwZWNpZmllZCBkYXRhYmFzZS4gQWZ0ZXIgdGhhdCwgaXQgc3RvcHMgdGhlIHRhcmdl dCBzZXJ2ZXIuIE9uZQp0ZW1wb3JhcnkgcmVwbGljYXRpb24gc2xvdCBpcyBjcmVhdGVkIHRv IGdldCB0aGUgcmVwbGljYXRpb24gc3RhcnQKcG9pbnQuIEl0IGlzIHVzZWQgYXMgKGEpIGEg c3RvcHBpbmcgcG9pbnQgZm9yIHRoZSByZWNvdmVyeSBwcm9jZXNzIGFuZAooYikgYSBzdGFy dGluZyBwb2ludCBmb3IgdGhlIHN1YnNjcmlwdGlvbnMuIFdyaXRlIHJlY292ZXJ5IHBhcmFt ZXRlcnMKaW50byB0aGUgdGFyZ2V0IGRhdGEgZGlyZWN0b3J5IGFuZCBzdGFydCB0aGUgdGFy Z2V0IHNlcnZlci4gV2FpdCB1bnRpbAp0aGUgdGFyZ2V0IHNlcnZlciBpcyBwcm9tb3RlZC4g Q3JlYXRlIG9uZSBzdWJzY3JpcHRpb24gcGVyIHNwZWNpZmllZApkYXRhYmFzZSAodXNpbmcg cmVwbGljYXRpb24gc2xvdCBhbmQgcHVibGljYXRpb24gY3JlYXRlZCBpbiBhIHByZXZpb3Vz CnN0ZXApIG9uIHRoZSB0YXJnZXQgc2VydmVyLiBTZXQgdGhlIHJlcGxpY2F0aW9uIHByb2dy ZXNzIHRvIHRoZQpyZXBsaWNhdGlvbiBzdGFydCBwb2ludCBmb3IgZWFjaCBzdWJzY3JpcHRp b24uIEVuYWJsZSB0aGUgc3Vic2NyaXB0aW9uCmZvciBlYWNoIHNwZWNpZmllZCBkYXRhYmFz ZSBvbiB0aGUgdGFyZ2V0IHNlcnZlci4gQW5kIGZpbmFsbHksIGNoYW5nZQp0aGUgc3lzdGVt IGlkZW50aWZpZXIgb24gdGhlIHRhcmdldCBzZXJ2ZXIuCgpEZXBlbmRpbmcgb24geW91ciB3 b3JrbG9hZCBhbmQgZGF0YWJhc2Ugc2l6ZSwgY3JlYXRpbmcgYSBsb2dpY2FsIHJlcGxpY2EK Y291bGRuJ3QgYmUgYW4gb3B0aW9uIGR1ZSB0byByZXNvdXJjZSBjb25zdHJhaW50cyAoV0FM IGJhY2tsb2cgc2hvdWxkIGJlCmF2YWlsYWJsZSB1bnRpbCBhbGwgdGFibGUgZGF0YSBpcyBz eW5jaHJvbml6ZWQpLiBUaGUgaW5pdGlhbCBkYXRhIGNvcHkKYW5kIHRoZSByZXBsaWNhdGlv biBwcm9ncmVzcyB0ZW5kcyB0byBiZSBmYXN0ZXIgb24gYSBwaHlzaWNhbCByZXBsaWNhLgpU aGUgcHVycG9zZSBvZiB0aGlzIHRvb2wgaXMgdG8gc3BlZWQgdXAgYSBsb2dpY2FsIHJlcGxp Y2Egc2V0dXAuCi0tLQogZG9jL3NyYy9zZ21sL3JlZi9hbGxmaWxlcy5zZ21sICAgICAgICAg ICAgICAgIHwgICAgMSArCiBkb2Mvc3JjL3NnbWwvcmVmL3BnX2NyZWF0ZXN1YnNjcmliZXIu c2dtbCAgICAgfCAgNTIzICsrKysrCiBkb2Mvc3JjL3NnbWwvcmVmZXJlbmNlLnNnbWwgICAg ICAgICAgICAgICAgICAgfCAgICAxICsKIHNyYy9iaW4vcGdfYmFzZWJhY2t1cC8uZ2l0aWdu b3JlICAgICAgICAgICAgICB8ICAgIDEgKwogc3JjL2Jpbi9wZ19iYXNlYmFja3VwL01ha2Vm aWxlICAgICAgICAgICAgICAgIHwgICAxMSArLQogc3JjL2Jpbi9wZ19iYXNlYmFja3VwL21l c29uLmJ1aWxkICAgICAgICAgICAgIHwgICAxOSArCiBzcmMvYmluL3BnX2Jhc2ViYWNrdXAv cGdfY3JlYXRlc3Vic2NyaWJlci5jICAgfCAyMDM4ICsrKysrKysrKysrKysrKysrCiAuLi4v dC8wNDBfcGdfY3JlYXRlc3Vic2NyaWJlci5wbCAgICAgICAgICAgICAgfCAgMjE0ICsrCiA4 IGZpbGVzIGNoYW5nZWQsIDI4MDUgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkb2Mvc3JjL3NnbWwvcmVmL3BnX2NyZWF0ZXN1YnNjcmliZXIu c2dtbAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9iaW4vcGdfYmFzZWJhY2t1cC9wZ19jcmVh dGVzdWJzY3JpYmVyLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvYmluL3BnX2Jhc2ViYWNr dXAvdC8wNDBfcGdfY3JlYXRlc3Vic2NyaWJlci5wbAoKZGlmZiAtLWdpdCBhL2RvYy9zcmMv c2dtbC9yZWYvYWxsZmlsZXMuc2dtbCBiL2RvYy9zcmMvc2dtbC9yZWYvYWxsZmlsZXMuc2dt bAppbmRleCA0YTQyOTk5YjE4Li5mNWJlNjM4ODY3IDEwMDY0NAotLS0gYS9kb2Mvc3JjL3Nn bWwvcmVmL2FsbGZpbGVzLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL3JlZi9hbGxmaWxlcy5z Z21sCkBAIC0yMDUsNiArMjA1LDcgQEAgQ29tcGxldGUgbGlzdCBvZiB1c2FibGUgc2dtbCBz b3VyY2UgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkuCiA8IUVOVElUWSBwZ0NvbWJpbmViYWNr dXAgICAgU1lTVEVNICJwZ19jb21iaW5lYmFja3VwLnNnbWwiPgogPCFFTlRJVFkgcGdDb25m aWcgICAgICAgICAgIFNZU1RFTSAicGdfY29uZmlnLXJlZi5zZ21sIj4KIDwhRU5USVRZIHBn Q29udHJvbGRhdGEgICAgICBTWVNURU0gInBnX2NvbnRyb2xkYXRhLnNnbWwiPgorPCFFTlRJ VFkgcGdDcmVhdGVTdWJzY3JpYmVyIFNZU1RFTSAicGdfY3JlYXRlc3Vic2NyaWJlci5zZ21s Ij4KIDwhRU5USVRZIHBnQ3RsICAgICAgICAgICAgICBTWVNURU0gInBnX2N0bC1yZWYuc2dt bCI+CiA8IUVOVElUWSBwZ0R1bXAgICAgICAgICAgICAgU1lTVEVNICJwZ19kdW1wLnNnbWwi PgogPCFFTlRJVFkgcGdEdW1wYWxsICAgICAgICAgIFNZU1RFTSAicGdfZHVtcGFsbC5zZ21s Ij4KZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9yZWYvcGdfY3JlYXRlc3Vic2NyaWJlci5z Z21sIGIvZG9jL3NyYy9zZ21sL3JlZi9wZ19jcmVhdGVzdWJzY3JpYmVyLnNnbWwKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uNDQ3MDViMmM1MgotLS0gL2Rldi9u dWxsCisrKyBiL2RvYy9zcmMvc2dtbC9yZWYvcGdfY3JlYXRlc3Vic2NyaWJlci5zZ21sCkBA IC0wLDAgKzEsNTIzIEBACis8IS0tCitkb2Mvc3JjL3NnbWwvcmVmL3BnX2NyZWF0ZXN1YnNj cmliZXIuc2dtbAorUG9zdGdyZVNRTCBkb2N1bWVudGF0aW9uCistLT4KKworPHJlZmVudHJ5 IGlkPSJhcHAtcGdjcmVhdGVzdWJzY3JpYmVyIj4KKyA8aW5kZXh0ZXJtIHpvbmU9ImFwcC1w Z2NyZWF0ZXN1YnNjcmliZXIiPgorICA8cHJpbWFyeT5wZ19jcmVhdGVzdWJzY3JpYmVyPC9w cmltYXJ5PgorIDwvaW5kZXh0ZXJtPgorCisgPHJlZm1ldGE+CisgIDxyZWZlbnRyeXRpdGxl PjxhcHBsaWNhdGlvbj5wZ19jcmVhdGVzdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj48L3JlZmVu dHJ5dGl0bGU+CisgIDxtYW52b2xudW0+MTwvbWFudm9sbnVtPgorICA8cmVmbWlzY2luZm8+ QXBwbGljYXRpb248L3JlZm1pc2NpbmZvPgorIDwvcmVmbWV0YT4KKworIDxyZWZuYW1lZGl2 PgorICA8cmVmbmFtZT5wZ19jcmVhdGVzdWJzY3JpYmVyPC9yZWZuYW1lPgorICA8cmVmcHVy cG9zZT5jb252ZXJ0IGEgcGh5c2ljYWwgcmVwbGljYSBpbnRvIGEgbmV3IGxvZ2ljYWwgcmVw bGljYTwvcmVmcHVycG9zZT4KKyA8L3JlZm5hbWVkaXY+CisKKyA8cmVmc3lub3BzaXNkaXY+ CisgIDxjbWRzeW5vcHNpcz4KKyAgIDxjb21tYW5kPnBnX2NyZWF0ZXN1YnNjcmliZXI8L2Nv bW1hbmQ+CisgICA8YXJnIHJlcD0icmVwZWF0Ij48cmVwbGFjZWFibGU+b3B0aW9uPC9yZXBs YWNlYWJsZT48L2FyZz4KKyAgIDxncm91cCBjaG9pY2U9InBsYWluIj4KKyAgICA8Z3JvdXAg Y2hvaWNlPSJyZXEiPgorICAgICA8YXJnIGNob2ljZT0icGxhaW4iPjxvcHRpb24+LWQ8L29w dGlvbj48L2FyZz4KKyAgICAgPGFyZyBjaG9pY2U9InBsYWluIj48b3B0aW9uPi0tZGF0YWJh c2U8L29wdGlvbj48L2FyZz4KKyAgICA8L2dyb3VwPgorICAgIDxyZXBsYWNlYWJsZT5kYm5h bWU8L3JlcGxhY2VhYmxlPgorICAgIDxncm91cCBjaG9pY2U9InJlcSI+CisgICAgIDxhcmcg Y2hvaWNlPSJwbGFpbiI+PG9wdGlvbj4tRDwvb3B0aW9uPiA8L2FyZz4KKyAgICAgPGFyZyBj aG9pY2U9InBsYWluIj48b3B0aW9uPi0tcGdkYXRhPC9vcHRpb24+PC9hcmc+CisgICAgPC9n cm91cD4KKyAgICA8cmVwbGFjZWFibGU+ZGF0YWRpcjwvcmVwbGFjZWFibGU+CisgICAgPGdy b3VwIGNob2ljZT0icmVxIj4KKyAgICAgPGFyZyBjaG9pY2U9InBsYWluIj48b3B0aW9uPi1Q PC9vcHRpb24+PC9hcmc+CisgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+PG9wdGlvbj4tLXB1 Ymxpc2hlci1zZXJ2ZXI8L29wdGlvbj48L2FyZz4KKyAgICA8L2dyb3VwPgorICAgIDxyZXBs YWNlYWJsZT5jb25uc3RyPC9yZXBsYWNlYWJsZT4KKyAgIDwvZ3JvdXA+CisgIDwvY21kc3lu b3BzaXM+CisgPC9yZWZzeW5vcHNpc2Rpdj4KKworIDxyZWZzZWN0MT4KKyAgPHRpdGxlPkRl c2NyaXB0aW9uPC90aXRsZT4KKyAgPHBhcmE+CisgICAgPGFwcGxpY2F0aW9uPnBnX2NyZWF0 ZXN1YnNjcmliZXI8L2FwcGxpY2F0aW9uPiBjcmVhdGVzIGEgbmV3IGxvZ2ljYWwKKyAgICBy ZXBsaWNhIGZyb20gYSBwaHlzaWNhbCBzdGFuZGJ5IHNlcnZlci4gSXQgbXVzdCBiZSBydW4g YXQgdGhlIHRhcmdldCBzZXJ2ZXIuCisgIDwvcGFyYT4KKworICA8cGFyYT4KKyAgIFRoZSA8 YXBwbGljYXRpb24+cGdfY3JlYXRlc3Vic2NyaWJlcjwvYXBwbGljYXRpb24+IHRhcmdldHMg bGFyZ2UgZGF0YWJhc2UKKyAgIHN5c3RlbXMgYmVjYXVzZSBpdCBzcGVlZHMgdXAgdGhlIGxv Z2ljYWwgcmVwbGljYXRpb24gc2V0dXAuIEZvciBzbWFsbGVyCisgICBkYXRhYmFzZXMsIDxs aW5rIGxpbmtlbmQ9ImxvZ2ljYWwtcmVwbGljYXRpb24iPmluaXRpYWwgZGF0YSBzeW5jaHJv bml6YXRpb248L2xpbms+CisgICBpcyByZWNvbW1lbmRlZC4KKyAgPC9wYXJhPgorCisgIDxw YXJhPgorICAgVGhlcmUgYXJlIHNvbWUgcHJlcmVxdWlzaXRlcyBmb3IgPGFwcGxpY2F0aW9u PnBnX2NyZWF0ZXN1YnNjcmliZXI8L2FwcGxpY2F0aW9uPgorICAgdG8gY29udmVydCB0aGUg dGFyZ2V0IHNlcnZlciBpbnRvIGEgbG9naWNhbCByZXBsaWNhLiBJZiB0aGVzZSBhcmUgbm90 IG1ldCBhbgorICAgZXJyb3Igd2lsbCBiZSByZXBvcnRlZC4KKyAgPC9wYXJhPgorCisgIDxp dGVtaXplZGxpc3QgaWQ9ImFwcC1wZy1jcmVhdGVzdWJzY3JpYmVyLWRlc2NyaXB0aW9uLXBy ZXJlcXVpc2l0ZXMiPgorICAgPGxpc3RpdGVtPgorICAgIDxwYXJhPgorICAgICBUaGUgc291 cmNlIGFuZCB0YXJnZXQgc2VydmVycyBtdXN0IGhhdmUgdGhlIHNhbWUgbWFqb3IgdmVyc2lv biBhcyB0aGUKKyAgICAgPGFwcGxpY2F0aW9uPnBnX2NyZWF0ZXN1YnNjcmliZXI8L2FwcGxp Y2F0aW9uPi4KKyAgICA8L3BhcmE+CisgICA8L2xpc3RpdGVtPgorCisgICA8bGlzdGl0ZW0+ CisgICAgPHBhcmE+CisgICAgIFRoZSBnaXZlbiB0YXJnZXQgZGF0YSBkaXJlY3RvcnkgbXVz dCBoYXZlIHRoZSBzYW1lIHN5c3RlbSBpZGVudGlmaWVyIHRoYW4KKyAgICAgdGhlIHNvdXJj ZSBkYXRhIGRpcmVjdG9yeS4gSWYgYSBzdGFuZGJ5IHNlcnZlciBpcyBydW5uaW5nIG9uIHRo ZSB0YXJnZXQKKyAgICAgZGF0YSBkaXJlY3Rvcnkgb3IgaXQgaXMgYSBiYXNlIGJhY2t1cCBm cm9tIHRoZSBzb3VyY2UgZGF0YSBkaXJlY3RvcnksCisgICAgIHN5c3RlbSBpZGVudGlmaWVy cyBhcmUgdGhlIHNhbWUuCisgICAgPC9wYXJhPgorICAgPC9saXN0aXRlbT4KKworICAgPGxp c3RpdGVtPgorICAgIDxwYXJhPgorICAgICBUaGUgdGFyZ2V0IHNlcnZlciBtdXN0IGJlIHVz ZWQgYXMgYSBwaHlzaWNhbCBzdGFuZGJ5LgorICAgIDwvcGFyYT4KKyAgIDwvbGlzdGl0ZW0+ CisKKyAgIDxsaXN0aXRlbT4KKyAgICA8cGFyYT4KKyAgICAgVGhlIGdpdmVuIGRhdGFiYXNl IHVzZXIgZm9yIHRoZSB0YXJnZXQgZGF0YSBkaXJlY3RvcnkgbXVzdCBoYXZlIHByaXZpbGVn ZXMKKyAgICAgZm9yIGNyZWF0aW5nIDxsaW5rIGxpbmtlbmQ9InNxbC1jcmVhdGVzdWJzY3Jp cHRpb24iPnN1YnNjcmlwdGlvbnM8L2xpbms+CisgICAgIGFuZCB1c2luZyA8bGluayBsaW5r ZW5kPSJwZy1yZXBsaWNhdGlvbi1vcmlnaW4tYWR2YW5jZSI+PGZ1bmN0aW9uPnBnX3JlcGxp Y2F0aW9uX29yaWdpbl9hZHZhbmNlKCk8L2Z1bmN0aW9uPjwvbGluaz4uCisgICAgPC9wYXJh PgorICAgPC9saXN0aXRlbT4KKworICAgPGxpc3RpdGVtPgorICAgIDxwYXJhPgorICAgICBU aGUgdGFyZ2V0IHNlcnZlciBtdXN0IGhhdmUKKyAgICAgPGxpbmsgbGlua2VuZD0iZ3VjLW1h eC1yZXBsaWNhdGlvbi1zbG90cyI+PHZhcm5hbWU+bWF4X3JlcGxpY2F0aW9uX3Nsb3RzPC92 YXJuYW1lPjwvbGluaz4KKyAgICAgYW5kCisgICAgIDxsaW5rIGxpbmtlbmQ9Imd1Yy1tYXgt bG9naWNhbC1yZXBsaWNhdGlvbi13b3JrZXJzIj48dmFybmFtZT5tYXhfbG9naWNhbF9yZXBs aWNhdGlvbl93b3JrZXJzPC92YXJuYW1lPjwvbGluaz4KKyAgICAgY29uZmlndXJlZCB0byBh IHZhbHVlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHNwZWNpZmll ZCBkYXRhYmFzZXMuCisgICAgPC9wYXJhPgorICAgPC9saXN0aXRlbT4KKworICAgPGxpc3Rp dGVtPgorICAgIDxwYXJhPgorICAgICBUaGUgdGFyZ2V0IHNlcnZlciBtdXN0IGhhdmUKKyAg ICAgPGxpbmsgbGlua2VuZD0iZ3VjLW1heC13b3JrZXItcHJvY2Vzc2VzIj48dmFybmFtZT5t YXhfd29ya2VyX3Byb2Nlc3NlczwvdmFybmFtZT48L2xpbms+CisgICAgIGNvbmZpZ3VyZWQg dG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgZGF0YWJh c2VzLgorICAgIDwvcGFyYT4KKyAgIDwvbGlzdGl0ZW0+CisKKyAgIDxsaXN0aXRlbT4KKyAg ICA8cGFyYT4KKyAgICAgVGhlIHRhcmdldCBzZXJ2ZXIgbXVzdCBhY2NlcHQgbG9jYWwgY29u bmVjdGlvbnMuCisgICAgPC9wYXJhPgorICAgPC9saXN0aXRlbT4KKworICAgPGxpc3RpdGVt PgorICAgIDxwYXJhPgorICAgICBUaGUgc291cmNlIHNlcnZlciBtdXN0IGFjY2VwdCBjb25u ZWN0aW9ucyBmcm9tIHRoZSB0YXJnZXQgc2VydmVyLgorICAgIDwvcGFyYT4KKyAgIDwvbGlz dGl0ZW0+CisKKyAgIDxsaXN0aXRlbT4KKyAgICA8cGFyYT4KKyAgICAgVGhlIHNvdXJjZSBz ZXJ2ZXIgbXVzdCBub3QgYmUgaW4gcmVjb3ZlcnkuIFB1YmxpY2F0aW9ucyBjYW5ub3QgYmUg Y3JlYXRlZAorICAgICBpbiBhIHJlYWQtb25seSBjbHVzdGVyLgorICAgIDwvcGFyYT4KKyAg IDwvbGlzdGl0ZW0+CisKKyAgIDxsaXN0aXRlbT4KKyAgICA8cGFyYT4KKyAgICAgVGhlIHNv dXJjZSBzZXJ2ZXIgbXVzdCBoYXZlCisgICAgIDxsaW5rIGxpbmtlbmQ9Imd1Yy13YWwtbGV2 ZWwiPjx2YXJuYW1lPndhbF9sZXZlbDwvdmFybmFtZT48L2xpbms+IGFzCisgICAgIDxsaXRl cmFsPmxvZ2ljYWw8L2xpdGVyYWw+LgorICAgIDwvcGFyYT4KKyAgIDwvbGlzdGl0ZW0+CisK KyAgIDxsaXN0aXRlbT4KKyAgICA8cGFyYT4KKyAgICAgVGhlIHNvdXJjZSBzZXJ2ZXIgbXVz dCBoYXZlCisgICAgIDxsaW5rIGxpbmtlbmQ9Imd1Yy1tYXgtcmVwbGljYXRpb24tc2xvdHMi Pjx2YXJuYW1lPm1heF9yZXBsaWNhdGlvbl9zbG90czwvdmFybmFtZT48L2xpbms+CisgICAg IGNvbmZpZ3VyZWQgdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBzcGVj aWZpZWQgZGF0YWJhc2VzIHBsdXMKKyAgICAgZXhpc3RpbmcgcmVwbGljYXRpb24gc2xvdHMu CisgICAgPC9wYXJhPgorICAgPC9saXN0aXRlbT4KKworICAgPGxpc3RpdGVtPgorICAgIDxw YXJhPgorICAgICBUaGUgc291cmNlIHNlcnZlciBtdXN0IGhhdmUKKyAgICAgPGxpbmsgbGlu a2VuZD0iZ3VjLW1heC13YWwtc2VuZGVycyI+PHZhcm5hbWU+bWF4X3dhbF9zZW5kZXJzPC92 YXJuYW1lPjwvbGluaz4KKyAgICAgY29uZmlndXJlZCB0byBhIHZhbHVlIGdyZWF0ZXIgdGhh biBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHNwZWNpZmllZAorICAgICBkYXRhYmFzZXMg YW5kIGV4aXN0aW5nIDxsaXRlcmFsPndhbHNlbmRlcjwvbGl0ZXJhbD4gcHJvY2Vzc2VzLgor ICAgIDwvcGFyYT4KKyAgIDwvbGlzdGl0ZW0+CisgIDwvaXRlbWl6ZWRsaXN0PgorCisgIDx3 YXJuaW5nPgorICAgPHRpdGxlPldhcm5pbmc8L3RpdGxlPgorICAgPHBhcmE+CisgICAgSWYg PGFwcGxpY2F0aW9uPnBnX2NyZWF0ZXN1YnNjcmliZXI8L2FwcGxpY2F0aW9uPiBmYWlscyB3 aGlsZSBwcm9jZXNzaW5nLAorICAgIHRoZW4gdGhlIGRhdGEgZGlyZWN0b3J5IGlzIGxpa2Vs eSBub3QgaW4gYSBzdGF0ZSB0aGF0IGNhbiBiZSByZWNvdmVyZWQuIEl0CisgICAgaXMgdHJ1 ZSBpZiB0aGUgdGFyZ2V0IHNlcnZlciB3YXMgcHJvbW90ZWQuIEluIHN1Y2ggYSBjYXNlLCBj cmVhdGluZyBhIG5ldworICAgIHN0YW5kYnkgc2VydmVyIGlzIHJlY29tbWVuZGVkLgorICAg PC9wYXJhPgorCisgICA8cGFyYT4KKyAgICA8YXBwbGljYXRpb24+cGdfY3JlYXRlc3Vic2Ny aWJlcjwvYXBwbGljYXRpb24+IHVzdWFsbHkgc3RhcnRzIHRoZSB0YXJnZXQKKyAgICBzZXJ2 ZXIgd2l0aCBkaWZmZXJlbnQgY29ubmVjdGlvbiBzZXR0aW5ncyBkdXJpbmcgdGhlIHRyYW5z Zm9ybWF0aW9uIHN0ZXBzLgorICAgIEhlbmNlLCBjb25uZWN0aW9ucyB0byB0YXJnZXQgc2Vy dmVyIG1pZ2h0IGZhaWwuCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgIER1cmluZyB0 aGUgcmVjb3ZlcnkgcHJvY2VzcywgaWYgdGhlIHRhcmdldCBzZXJ2ZXIgZGlzY29ubmVjdHMg ZnJvbSB0aGUKKyAgICBzb3VyY2Ugc2VydmVyLCA8YXBwbGljYXRpb24+cGdfY3JlYXRlc3Vi c2NyaWJlcjwvYXBwbGljYXRpb24+IHdpbGwgY2hlY2sKKyAgICBhIGZldyB0aW1lcyBpZiB0 aGUgY29ubmVjdGlvbiBoYXMgYmVlbiByZWVzdGFibGlzaGVkIHRvIHN0cmVhbSB0aGUgcmVx dWlyZWQKKyAgICBXQUwuIEFmdGVyIGEgZmV3IGF0dGVtcHRzLCBpdCB0ZXJtaW5hdGVzIHdp dGggYW4gZXJyb3IuCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgIEV4ZWN1dGluZyBE REwgY29tbWFuZHMgb24gdGhlIHNvdXJjZSBzZXJ2ZXIgd2hpbGUgcnVubmluZworICAgIDxh cHBsaWNhdGlvbj5wZ19jcmVhdGVzdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj4gaXMgbm90IHJl Y29tbWVuZGVkLiBJZiB0aGUKKyAgICB0YXJnZXQgc2VydmVyIGhhcyBhbHJlYWR5IGJlZW4g Y29udmVydGVkIHRvIGxvZ2ljYWwgcmVwbGljYSwgdGhlIERETAorICAgIGNvbW1hbmRzIG11 c3Qgbm90IGJlIHJlcGxpY2F0ZWQgc28gYW4gZXJyb3Igd291bGQgb2NjdXIuCisgICA8L3Bh cmE+CisKKyAgIDxwYXJhPgorICAgIElmIDxhcHBsaWNhdGlvbj5wZ19jcmVhdGVzdWJzY3Jp YmVyPC9hcHBsaWNhdGlvbj4gZmFpbHMgd2hpbGUgcHJvY2Vzc2luZywKKyAgICBvYmplY3Rz IChwdWJsaWNhdGlvbnMsIHJlcGxpY2F0aW9uIHNsb3RzKSBjcmVhdGVkIG9uIHRoZSBzb3Vy Y2Ugc2VydmVyCisgICAgc2hvdWxkIGJlIHJlbW92ZWQuIFRoZSByZW1vdmFsIG1pZ2h0IGZh aWwgaWYgdGhlIHRhcmdldCBzZXJ2ZXIgY2Fubm90CisgICAgY29ubmVjdCB0byB0aGUgc291 cmNlIHNlcnZlci4gSW4gc3VjaCBhIGNhc2UsIGEgd2FybmluZyBtZXNzYWdlIHdpbGwgaW5m b3JtCisgICAgdGhlIG9iamVjdHMgbGVmdC4KKyAgIDwvcGFyYT4KKworICAgPHBhcmE+Cisg ICAgSWYgdGhlIHJlcGxpY2F0aW9uIGlzIHVzaW5nIGEKKyAgICA8bGluayBsaW5rZW5kPSJn dWMtcHJpbWFyeS1zbG90LW5hbWUiPjx2YXJuYW1lPnByaW1hcnlfc2xvdF9uYW1lPC92YXJu YW1lPjwvbGluaz4sCisgICAgaXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHNvdXJjZSBz ZXJ2ZXIgYWZ0ZXIgdGhlIGxvZ2ljYWwgcmVwbGljYXRpb24gc2V0dXAuCisgICA8L3BhcmE+ CisKKyAgIDxwYXJhPgorICAgIDxhcHBsaWNhdGlvbj5wZ19jcmVhdGVzdWJzY3JpYmVyPC9h cHBsaWNhdGlvbj4gY2hhbmdlcyB0aGUgc3lzdGVtIGlkZW50aWZpZXIKKyAgICB1c2luZyA8 YXBwbGljYXRpb24+cGdfcmVzZXR3YWw8L2FwcGxpY2F0aW9uPi4gSXQgd291bGQgYXZvaWQg c2l0dWF0aW9ucyBpbgorICAgIHdoaWNoIFdBTCBmaWxlcyBmcm9tIHRoZSBzb3VyY2Ugc2Vy dmVyIG1pZ2h0IGJlIHVzZWQgYnkgdGhlIHRhcmdldCBzZXJ2ZXIuCisgICAgSWYgdGhlIHRh cmdldCBzZXJ2ZXIgaGFzIGEgc3RhbmRieSwgcmVwbGljYXRpb24gd2lsbCBicmVhayBhbmQg YSBmcmVzaAorICAgIHN0YW5kYnkgc2hvdWxkIGJlIGNyZWF0ZWQuCisgICA8L3BhcmE+Cisg IDwvd2FybmluZz4KKworIDwvcmVmc2VjdDE+CisKKyA8cmVmc2VjdDE+CisgIDx0aXRsZT5P cHRpb25zPC90aXRsZT4KKworICAgPHBhcmE+CisgICAgPGFwcGxpY2F0aW9uPnBnX2NyZWF0 ZXN1YnNjcmliZXI8L2FwcGxpY2F0aW9uPiBhY2NlcHRzIHRoZSBmb2xsb3dpbmcKKyAgICBj b21tYW5kLWxpbmUgYXJndW1lbnRzOgorCisgICAgPHZhcmlhYmxlbGlzdD4KKyAgICAgPHZh cmxpc3RlbnRyeT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+LWQgPHJlcGxhY2VhYmxlIGNsYXNz PSJwYXJhbWV0ZXIiPmRibmFtZTwvcmVwbGFjZWFibGU+PC9vcHRpb24+PC90ZXJtPgorICAg ICAgPHRlcm0+PG9wdGlvbj4tLWRhdGFiYXNlPTxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1l dGVyIj5kYm5hbWU8L3JlcGxhY2VhYmxlPjwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDxsaXN0 aXRlbT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGRhdGFiYXNlIG5hbWUgdG8gY3Jl YXRlIHRoZSBzdWJzY3JpcHRpb24uIE11bHRpcGxlIGRhdGFiYXNlcyBjYW4gYmUKKyAgICAg ICAgc2VsZWN0ZWQgYnkgd3JpdGluZyBtdWx0aXBsZSA8b3B0aW9uPi1kPC9vcHRpb24+IHN3 aXRjaGVzLgorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvdmFy bGlzdGVudHJ5PgorCisgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICA8dGVybT48b3B0aW9u Pi1EIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5kaXJlY3Rvcnk8L3JlcGxhY2Vh YmxlPjwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+LS1wZ2RhdGE9PHJl cGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmRpcmVjdG9yeTwvcmVwbGFjZWFibGU+PC9v cHRpb24+PC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAg ICBUaGUgdGFyZ2V0IGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGEgY2x1c3RlciBkaXJlY3Rv cnkgZnJvbSBhIHBoeXNpY2FsCisgICAgICAgIHJlcGxpY2EuCisgICAgICAgPC9wYXJhPgor ICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgPHZhcmxp c3RlbnRyeT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+LW48L29wdGlvbj48L3Rlcm0+CisgICAg ICA8dGVybT48b3B0aW9uPi0tZHJ5LXJ1bjwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDxsaXN0 aXRlbT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgRG8gZXZlcnl0aGluZyBleGNlcHQgYWN0 dWFsbHkgbW9kaWZ5aW5nIHRoZSB0YXJnZXQgZGlyZWN0b3J5LgorICAgICAgIDwvcGFyYT4K KyAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgIDx2YXJs aXN0ZW50cnk+CisgICAgICA8dGVybT48b3B0aW9uPi1wIDxyZXBsYWNlYWJsZSBjbGFzcz0i cGFyYW1ldGVyIj5wb3J0PC9yZXBsYWNlYWJsZT48L29wdGlvbj48L3Rlcm0+CisgICAgICA8 dGVybT48b3B0aW9uPi0tc3Vic2NyaWJlci1wb3J0PTxyZXBsYWNlYWJsZSBjbGFzcz0icGFy YW1ldGVyIj5wb3J0PC9yZXBsYWNlYWJsZT48L29wdGlvbj48L3Rlcm0+CisgICAgICA8bGlz dGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBwb3J0IG51bWJlciBvbiB3aGlj aCB0aGUgdGFyZ2V0IHNlcnZlciBpcyBsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zLgorICAg ICAgICBEZWZhdWx0cyB0byBydW5uaW5nIHRoZSB0YXJnZXQgc2VydmVyIG9uIHBvcnQgNTA0 MzIgdG8gYXZvaWQgdW5pbnRlbmRlZAorICAgICAgICBjbGllbnQgY29ubm5lY3Rpb25zLgor ICAgICAgIDwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvdmFybGlzdGVudHJ5 PgorCisgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICA8dGVybT48b3B0aW9uPi1QIDxyZXBs YWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5jb25uc3RyPC9yZXBsYWNlYWJsZT48L29wdGlv bj48L3Rlcm0+CisgICAgICA8dGVybT48b3B0aW9uPi0tcHVibGlzaGVyLXNlcnZlcj08cmVw bGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+Y29ubnN0cjwvcmVwbGFjZWFibGU+PC9vcHRp b24+PC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgICBU aGUgY29ubmVjdGlvbiBzdHJpbmcgdG8gdGhlIHB1Ymxpc2hlci4gRm9yIGRldGFpbHMgc2Vl IDx4cmVmIGxpbmtlbmQ9ImxpYnBxLWNvbm5zdHJpbmciLz4uCisgICAgICAgPC9wYXJhPgor ICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgPHZhcmxp c3RlbnRyeT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+LXI8L29wdGlvbj48L3Rlcm0+CisgICAg ICA8dGVybT48b3B0aW9uPi0tcmV0YWluPC9vcHRpb24+PC90ZXJtPgorICAgICAgPGxpc3Rp dGVtPgorICAgICAgIDxwYXJhPgorICAgICAgICBSZXRhaW4gbG9nIGZpbGUgZXZlbiBhZnRl ciBzdWNjZXNzZnVsIGNvbXBsZXRpb24uCisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0 aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgPHZhcmxpc3RlbnRyeT4KKyAg ICAgIDx0ZXJtPjxvcHRpb24+LXMgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmRp cjwvcmVwbGFjZWFibGU+PC9vcHRpb24+PC90ZXJtPgorICAgICAgPHRlcm0+PG9wdGlvbj4t LXNvY2tldC1kaXJlY3Rvcnk9PHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmRpcjwv cmVwbGFjZWFibGU+PC9vcHRpb24+PC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgorICAgICAg IDxwYXJhPgorICAgICAgICBUaGUgZGlyZWN0b3J5IHRvIHVzZSBmb3IgcG9zdG1hc3RlciBz b2NrZXRzIG9uIHRhcmdldCBzZXJ2ZXIuIFRoZQorICAgICAgICBkZWZhdWx0IGlzIGN1cnJl bnQgZGlyZWN0b3J5LgorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisgICAg IDwvdmFybGlzdGVudHJ5PgorCisgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgPHRlcm0+ PG9wdGlvbj4tdCA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+c2Vjb25kczwvcmVw bGFjZWFibGU+PC9vcHRpb24+PC90ZXJtPgorICAgICAgIDx0ZXJtPjxvcHRpb24+LS1yZWNv dmVyeS10aW1lb3V0PTxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5zZWNvbmRzPC9y ZXBsYWNlYWJsZT48L29wdGlvbj48L3Rlcm0+CisgICAgICAgPGxpc3RpdGVtPgorICAgICAg IDxwYXJhPgorICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0 IGZvciByZWNvdmVyeSB0byBlbmQuIFNldHRpbmcgdG8gMAorICAgICAgICBkaXNhYmxlcy4g VGhlIGRlZmF1bHQgaXMgMC4KKyAgICAgICA8L3BhcmE+CisgICAgICAgPC9saXN0aXRlbT4K KyAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgIDx0 ZXJtPjxvcHRpb24+LVUgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPnVzZXJuYW1l PC9yZXBsYWNlYWJsZT48L29wdGlvbj48L3Rlcm0+CisgICAgICA8dGVybT48b3B0aW9uPi0t c3Vic2NyaWJlci11c2VybmFtZT08cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+dXNl cm5hbWU8L3JlcGxhY2VhYmxlPjwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDxsaXN0aXRlbT4K KyAgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIHVzZXJuYW1lIHRvIGNvbm5lY3QgYXMgb24g dGFyZ2V0IHNlcnZlci4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQKKyAgICAgICAgb3BlcmF0 aW5nIHN5c3RlbSB1c2VyIG5hbWUuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRl bT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAg IDx0ZXJtPjxvcHRpb24+LXY8L29wdGlvbj48L3Rlcm0+CisgICAgICA8dGVybT48b3B0aW9u Pi0tdmVyYm9zZTwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8 cGFyYT4KKyAgICAgICAgRW5hYmxlcyB2ZXJib3NlIG1vZGUuIFRoaXMgd2lsbCBjYXVzZQor ICAgICAgICA8YXBwbGljYXRpb24+cGdfY3JlYXRlc3Vic2NyaWJlcjwvYXBwbGljYXRpb24+ IHRvIG91dHB1dCBwcm9ncmVzcyBtZXNzYWdlcworICAgICAgICBhbmQgZGV0YWlsZWQgaW5m b3JtYXRpb24gYWJvdXQgZWFjaCBzdGVwIHRvIHN0YW5kYXJkIGVycm9yLgorICAgICAgICBS ZXBlYXRpbmcgdGhlIG9wdGlvbiBjYXVzZXMgYWRkaXRpb25hbCBkZWJ1Zy1sZXZlbCBtZXNz YWdlcyB0byBhcHBlYXIgb24KKyAgICAgICAgc3RhbmRhcmQgZXJyb3IuCisgICAgICAgPC9w YXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgPC92 YXJpYWJsZWxpc3Q+CisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgIE90aGVyIG9wdGlv bnMgYXJlIGFsc28gYXZhaWxhYmxlOgorCisgICAgPHZhcmlhYmxlbGlzdD4KKyAgICAgPHZh cmxpc3RlbnRyeT4KKyAgICAgICA8dGVybT48b3B0aW9uPi0/PC9vcHRpb24+PC90ZXJtPgor ICAgICAgIDx0ZXJtPjxvcHRpb24+LS1oZWxwPC9vcHRpb24+PC90ZXJtPgorICAgICAgIDxs aXN0aXRlbT4KKyAgICAgICA8cGFyYT4KKyAgICAgICBTaG93IGhlbHAgYWJvdXQgPGFwcGxp Y2F0aW9uPnBnX2NyZWF0ZXN1YnNjcmliZXI8L2FwcGxpY2F0aW9uPiBjb21tYW5kCisgICAg ICAgbGluZSBhcmd1bWVudHMsIGFuZCBleGl0LgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8 L2xpc3RpdGVtPgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICA8dmFybGlzdGVudHJ5 PgorICAgICAgIDx0ZXJtPjxvcHRpb24+LVY8L29wdGlvbj48L3Rlcm0+CisgICAgICAgPHRl cm0+PG9wdGlvbj4tLXZlcnNpb248L29wdGlvbj48L3Rlcm0+CisgICAgICAgPGxpc3RpdGVt PgorICAgICAgIDxwYXJhPgorICAgICAgIFByaW50IHRoZSA8YXBwbGljYXRpb24+cGdfY3Jl YXRlc3Vic2NyaWJlcjwvYXBwbGljYXRpb24+IHZlcnNpb24gYW5kIGV4aXQuCisgICAgICAg PC9wYXJhPgorICAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvdmFybGlzdGVudHJ5PgorCisg ICAgPC92YXJpYWJsZWxpc3Q+CisgICA8L3BhcmE+CisKKyA8L3JlZnNlY3QxPgorCisgPHJl ZnNlY3QxPgorICA8dGl0bGU+SG93IEl0IFdvcmtzPC90aXRsZT4KKworICA8cGFyYT4KKyAg ICBUaGUgYmFzaWMgaWRlYSBpcyB0byBoYXZlIGEgcmVwbGljYXRpb24gc3RhcnQgcG9pbnQg ZnJvbSB0aGUgc291cmNlIHNlcnZlcgorICAgIGFuZCBzZXQgdXAgYSBsb2dpY2FsIHJlcGxp Y2F0aW9uIHRvIHN0YXJ0IGZyb20gdGhpcyBwb2ludDoKKyAgPC9wYXJhPgorCisgIDxwcm9j ZWR1cmU+CisgICA8c3RlcD4KKyAgICA8cGFyYT4KKyAgICAgU3RhcnQgdGhlIHRhcmdldCBz ZXJ2ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbW1hbmQtbGluZSBvcHRpb25zLiBJZiB0aGUK KyAgICAgdGFyZ2V0IHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcsIHN0b3AgaXQgYmVjYXVz ZSBzb21lIHBhcmFtZXRlcnMgY2FuIG9ubHkKKyAgICAgYmUgc2V0IGF0IHNlcnZlciBzdGFy dC4KKyAgICA8L3BhcmE+CisgICA8L3N0ZXA+CisKKyAgIDxzdGVwPgorICAgIDxwYXJhPgor ICAgICBDaGVjayBpZiB0aGUgdGFyZ2V0IHNlcnZlciBjYW4gYmUgY29udmVydGVkLiBUaGVy ZSBhcmUgYWxzbyBhIGZldyBjaGVja3MKKyAgICAgb24gdGhlIHNvdXJjZSBzZXJ2ZXIuIEFs bAorICAgICA8bGluayBsaW5rZW5kPSJhcHAtcGctY3JlYXRlc3Vic2NyaWJlci1kZXNjcmlw dGlvbi1wcmVyZXF1aXNpdGVzIj5wcmVyZXF1aXNpdGVzPC9saW5rPgorICAgICBhcmUgY2hl Y2tlZC4gSWYgYW55IG9mIHRoZW0gYXJlIG5vdCBtZXQsIDxhcHBsaWNhdGlvbj5wZ19jcmVh dGVzdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj4KKyAgICAgd2lsbCB0ZXJtaW5hdGUgd2l0aCBh biBlcnJvci4KKyAgICA8L3BhcmE+CisgICA8L3N0ZXA+CisKKyAgIDxzdGVwPgorICAgIDxw YXJhPgorICAgICBDcmVhdGUgYSBwdWJsaWNhdGlvbiBhbmQgcmVwbGljYXRpb24gc2xvdCBm b3IgZWFjaCBzcGVjaWZpZWQgZGF0YWJhc2Ugb24KKyAgICAgdGhlIHNvdXJjZSBzZXJ2ZXIu IEVhY2ggcHVibGljYXRpb24gaGFzIHRoZSBmb2xsb3dpbmcgbmFtZSBwYXR0ZXJuOgorICAg ICA8cXVvdGU+PGxpdGVyYWw+cGdfY3JlYXRlc3Vic2NyaWJlcl8ldTwvbGl0ZXJhbD48L3F1 b3RlPiAocGFyYW1ldGVyOgorICAgICBkYXRhYmFzZSA8cGFyYW1ldGVyPm9pZDwvcGFyYW1l dGVyPikuIEVhY2ggcmVwbGljYXRpb24gc2xvdCBoYXMgdGhlCisgICAgIGZvbGxvd2luZyBu YW1lIHBhdHRlcm46CisgICAgIDxxdW90ZT48bGl0ZXJhbD5wZ19jcmVhdGVzdWJzY3JpYmVy XyV1XyVkPC9saXRlcmFsPjwvcXVvdGU+IChwYXJhbWV0ZXJzOgorICAgICBkYXRhYmFzZSA8 cGFyYW1ldGVyPm9pZDwvcGFyYW1ldGVyPiwgUElEIDxwYXJhbWV0ZXI+aW50PC9wYXJhbWV0 ZXI+KS4KKyAgICAgVGhlc2UgcmVwbGljYXRpb24gc2xvdHMgd2lsbCBiZSB1c2VkIGJ5IHRo ZSBzdWJzY3JpcHRpb25zIGluIGEgZnV0dXJlIHN0ZXAuCisgICAgPC9wYXJhPgorICAgPC9z dGVwPgorCisgICA8c3RlcD4KKyAgICA8cGFyYT4KKyAgICAgQ3JlYXRlIGEgdGVtcG9yYXJ5 IHJlcGxpY2F0aW9uIHNsb3QgdG8gZ2V0IGEgY29uc2lzdGVudCBzdGFydCBsb2NhdGlvbi4K KyAgICAgVGhpcyByZXBsaWNhdGlvbiBzbG90IGhhcyB0aGUgZm9sbG93aW5nIG5hbWUgcGF0 dGVybjoKKyAgICAgPHF1b3RlPjxsaXRlcmFsPnBnX2NyZWF0ZXN1YnNjcmliZXJfJWRfc3Rh cnRwb2ludDwvbGl0ZXJhbD48L3F1b3RlPgorICAgICAocGFyYW1ldGVyOiBQSUQgPHBhcmFt ZXRlcj5pbnQ8L3BhcmFtZXRlcj4pLiBUaGUgTFNOIHJldHVybmVkIGJ5CisgICAgIDxsaW5r IGxpbmtlbmQ9InBnLWNyZWF0ZS1sb2dpY2FsLXJlcGxpY2F0aW9uLXNsb3QiPjxmdW5jdGlv bj5wZ19jcmVhdGVfbG9naWNhbF9yZXBsaWNhdGlvbl9zbG90KCk8L2Z1bmN0aW9uPjwvbGlu az4KKyAgICAgaXMgdXNlZCBhcyBhIHN0b3BwaW5nIHBvaW50IGluIHRoZSA8eHJlZiBsaW5r ZW5kPSJndWMtcmVjb3ZlcnktdGFyZ2V0LWxzbiIvPgorICAgICBwYXJhbWV0ZXIgYW5kIGJ5 IHRoZSBzdWJzY3JpcHRpb25zIGFzIGEgcmVwbGljYXRpb24gc3RhcnQgcG9pbnQuIEl0Cisg ICAgIGd1YXJhbnRlZXMgdGhhdCBubyB0cmFuc2FjdGlvbiB3aWxsIGJlIGxvc3QuCisgICAg PC9wYXJhPgorICAgPC9zdGVwPgorCisgICA8c3RlcD4KKyAgICA8cGFyYT4KKyAgICAgQ2hl Y2sKKyAgICAgV3JpdGUgcmVjb3ZlcnkgcGFyYW1ldGVycyBpbnRvIHRoZSB0YXJnZXQgZGF0 YSBkaXJlY3RvcnkgYW5kIHJlc3RhcnQgdGhlCisgICAgIHRhcmdldCBzZXJ2ZXIuIEl0IHNw ZWNpZmllcyBhIExTTiAoPHhyZWYgbGlua2VuZD0iZ3VjLXJlY292ZXJ5LXRhcmdldC1sc24i Lz4pCisgICAgIG9mIHdyaXRlLWFoZWFkIGxvZyBsb2NhdGlvbiB1cCB0byB3aGljaCByZWNv dmVyeSB3aWxsIHByb2NlZWQuIEl0IGFsc28KKyAgICAgc3BlY2lmaWVzIDxsaXRlcmFsPnBy b21vdGU8L2xpdGVyYWw+IGFzIHRoZSBhY3Rpb24gdGhhdCB0aGUgc2VydmVyIHNob3VsZAor ICAgICB0YWtlIG9uY2UgdGhlIHJlY292ZXJ5IHRhcmdldCBpcyByZWFjaGVkLiBBZGRpdGlv bmFsCisgICAgIDxsaW5rIGxpbmtlbmQ9InJ1bnRpbWUtY29uZmlnLXdhbC1yZWNvdmVyeS10 YXJnZXQiPnJlY292ZXJ5IHBhcmFtZXRlcnM8L2xpbms+CisgICAgIGFyZSBhbHNvIGFkZGVk IHNvIGl0IGF2b2lkcyB1bmV4cGVjdGVkIGJlaGF2aW9yIGR1cmluZyB0aGUgcmVjb3ZlcnkK KyAgICAgcHJvY2VzcyBzdWNoIGFzIGVuZCBvZiB0aGUgcmVjb3ZlcnkgYXMgc29vbiBhcyBh IGNvbnNpc3RlbnQgc3RhdGUgaXMKKyAgICAgcmVhY2hlZCAoV0FMIHNob3VsZCBiZSBhcHBs aWVkIHVudGlsIHRoZSBjb25zaXN0ZW50IHN0YXJ0IGxvY2F0aW9uKSBhbmQKKyAgICAgbXVs dGlwbGUgcmVjb3ZlcnkgdGFyZ2V0cyB0aGF0IGNhbiBjYXVzZSBhIGZhaWx1cmUuIFRoaXMg c3RlcCBmaW5pc2hlcworICAgICBvbmNlIHRoZSBzZXJ2ZXIgZW5kcyBzdGFuZGJ5IG1vZGUg YW5kIGlzIGFjY2VwdGluZyByZWFkLXdyaXRlIHRyYW5zYWN0aW9ucy4KKyAgICAgSWYgPG9w dGlvbj4tLXJlY292ZXJ5LXRpbWVvdXQ8L29wdGlvbj4gb3B0aW9uIGlzIHNldCwKKyAgICAg PGFwcGxpY2F0aW9uPnBnX2NyZWF0ZXN1YnNjcmliZXI8L2FwcGxpY2F0aW9uPiB0ZXJtaW5h dGVzIGlmIHJlY292ZXJ5IGRvZXMKKyAgICAgbm90IGVuZCB1bnRpbCB0aGUgZ2l2ZW4gbnVt YmVyIG9mIHNlY29uZHMuCisgICAgPC9wYXJhPgorICAgPC9zdGVwPgorCisgICA8c3RlcD4K KyAgICA8cGFyYT4KKyAgICAgQ3JlYXRlIGEgc3Vic2NyaXB0aW9uIGZvciBlYWNoIHNwZWNp ZmllZCBkYXRhYmFzZSBvbiB0aGUgdGFyZ2V0IHNlcnZlci4KKyAgICAgVGhlIHN1YnNjcmlw dGlvbiBoYXMgdGhlIGZvbGxvd2luZyBuYW1lIHBhdHRlcm46CisgICAgIDxxdW90ZT48bGl0 ZXJhbD5wZ19jcmVhdGVzdWJzY3JpYmVyXyV1XyVkPC9saXRlcmFsPjwvcXVvdGU+IChwYXJh bWV0ZXJzOgorICAgICBkYXRhYmFzZSA8cGFyYW1ldGVyPm9pZDwvcGFyYW1ldGVyPiwgUElE IDxwYXJhbWV0ZXI+aW50PC9wYXJhbWV0ZXI+KS4gVGhlCisgICAgIHJlcGxpY2F0aW9uIHNs b3QgbmFtZSBpcyBpZGVudGljYWwgdG8gdGhlIHN1YnNjcmlwdGlvbiBuYW1lLiBJdCBkb2Vz IG5vdAorICAgICBjb3B5IGV4aXN0aW5nIGRhdGEgZnJvbSB0aGUgc291cmNlIHNlcnZlci4g SXQgZG9lcyBub3QgY3JlYXRlIGEKKyAgICAgcmVwbGljYXRpb24gc2xvdC4gSW5zdGVhZCwg aXQgdXNlcyB0aGUgcmVwbGljYXRpb24gc2xvdCB0aGF0IHdhcyBjcmVhdGVkCisgICAgIGlu IGEgcHJldmlvdXMgc3RlcC4gVGhlIHN1YnNjcmlwdGlvbiBpcyBjcmVhdGVkIGJ1dCBpdCBp cyBub3QgZW5hYmxlZCB5ZXQuCisgICAgIFRoZSByZWFzb24gaXMgdGhlIHJlcGxpY2F0aW9u IHByb2dyZXNzIG11c3QgYmUgc2V0IHRvIHRoZSBjb25zaXN0ZW50IExTTgorICAgICBidXQg cmVwbGljYXRpb24gb3JpZ2luIG5hbWUgY29udGFpbnMgdGhlIHN1YnNjcmlwdGlvbiBvaWQg aW4gaXRzIG5hbWUuCisgICAgIEhlbmNlLCB0aGUgc3Vic2NyaXB0aW9uIHdpbGwgYmUgZW5h YmxlZCBpbiBhIHNlcGFyYXRlIHN0ZXAuCisgICAgPC9wYXJhPgorICAgPC9zdGVwPgorCisg ICA8c3RlcD4KKyAgICA8cGFyYT4KKyAgICAgRHJvcCBwdWJsaWNhdGlvbnMgb24gdGhlIHRh cmdldCBzZXJ2ZXIgdGhhdCB3ZXJlIHJlcGxpY2F0ZWQgYmVjYXVzZSB0aGV5CisgICAgIHdl cmUgY3JlYXRlZCBiZWZvcmUgdGhlIGNvbnNpc3RlbnQgc3RhcnQgbG9jYXRpb24uIEl0IGhh cyBubyB1c2Ugb24gdGhlCisgICAgIHN1YnNjcmliZXIuCisgICAgPC9wYXJhPgorICAgPC9z dGVwPgorCisgICA8c3RlcD4KKyAgICA8cGFyYT4KKyAgICAgU2V0IHRoZSByZXBsaWNhdGlv biBwcm9ncmVzcyB0byB0aGUgY29uc2lzdGVudCBzdGFydCBwb2ludCBmb3IgZWFjaAorICAg ICBzdWJzY3JpcHRpb24uIFdoZW4gdGhlIHRhcmdldCBzZXJ2ZXIgc3RhcnRzIHRoZSByZWNv dmVyeSBwcm9jZXNzLCBpdAorICAgICBjYXRjaGVzIHVwIHRvIHRoZSBjb25zaXN0ZW50IHN0 YXJ0IHBvaW50LiBUaGlzIGlzIHRoZSBleGFjdCBMU04gdG8gYmUgdXNlZAorICAgICBhcyBh IGluaXRpYWwgbG9jYXRpb24gZm9yIGVhY2ggc3Vic2NyaXB0aW9uLiBUaGUgcmVwbGljYXRp b24gb3JpZ2luIG5hbWUKKyAgICAgaXMgb2J0YWluZWQgc2luY2UgdGhlIHN1YnNjcmlwdGlv biB3YXMgY3JlYXRlZC4gVGhlIHJlcGxpY2F0aW9uIG9yaWdpbgorICAgICBuYW1lIGFuZCB0 aGUgY29uc2lzdGVudCBzdGFydCBwb2ludCBhcmUgdXNlZCBpbgorICAgICA8bGluayBsaW5r ZW5kPSJwZy1yZXBsaWNhdGlvbi1vcmlnaW4tYWR2YW5jZSI+PGZ1bmN0aW9uPnBnX3JlcGxp Y2F0aW9uX29yaWdpbl9hZHZhbmNlKCk8L2Z1bmN0aW9uPjwvbGluaz4KKyAgICAgdG8gc2V0 IHVwIHRoZSBpbml0aWFsIHJlcGxpY2F0aW9uIGxvY2F0aW9uLgorICAgIDwvcGFyYT4KKyAg IDwvc3RlcD4KKworICAgPHN0ZXA+CisgICAgPHBhcmE+CisgICAgIEVuYWJsZSB0aGUgc3Vi c2NyaXB0aW9uIGZvciBlYWNoIHNwZWNpZmllZCBkYXRhYmFzZSBvbiB0aGUgdGFyZ2V0IHNl cnZlci4KKyAgICAgVGhlIHN1YnNjcmlwdGlvbiBzdGFydHMgYXBwbHlpbmcgdHJhbnNhY3Rp b25zIGZyb20gdGhlIGNvbnNpc3RlbnQgc3RhcnQKKyAgICAgcG9pbnQuCisgICAgPC9wYXJh PgorICAgPC9zdGVwPgorCisgICA8c3RlcD4KKyAgICA8cGFyYT4KKyAgICAgSWYgdGhlIHN0 YW5kYnkgc2VydmVyIHdhcyB1c2luZworICAgICA8bGluayBsaW5rZW5kPSJndWMtcHJpbWFy eS1zbG90LW5hbWUiPjx2YXJuYW1lPnByaW1hcnlfc2xvdF9uYW1lPC92YXJuYW1lPjwvbGlu az4sCisgICAgIGl0IGhhcyBubyB1c2UgZnJvbSBub3cgb24gc28gZHJvcCBpdC4KKyAgICA8 L3BhcmE+CisgICA8L3N0ZXA+CisKKyAgIDxzdGVwPgorICAgIDxwYXJhPgorICAgICBVcGRh dGUgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9uIHRoZSB0YXJnZXQgc2VydmVyLiBUaGUKKyAg ICAgPHhyZWYgbGlua2VuZD0iYXBwLXBncmVzZXR3YWwiLz4gaXMgcnVuIHRvIG1vZGlmeSB0 aGUgc3lzdGVtIGlkZW50aWZpZXIuCisgICAgIFRoZSB0YXJnZXQgc2VydmVyIGlzIHN0b3Bw ZWQgYXMgYSA8Y29tbWFuZD5wZ19yZXNldHdhbDwvY29tbWFuZD4gcmVxdWlyZW1lbnQuCisg ICAgPC9wYXJhPgorICAgPC9zdGVwPgorICA8L3Byb2NlZHVyZT4KKyA8L3JlZnNlY3QxPgor CisgPHJlZnNlY3QxPgorICA8dGl0bGU+RXhhbXBsZXM8L3RpdGxlPgorCisgIDxwYXJhPgor ICAgVG8gY3JlYXRlIGEgbG9naWNhbCByZXBsaWNhIGZvciBkYXRhYmFzZXMgPGxpdGVyYWw+ aHI8L2xpdGVyYWw+IGFuZAorICAgPGxpdGVyYWw+ZmluYW5jZTwvbGl0ZXJhbD4gZnJvbSBh IHBoeXNpY2FsIHJlcGxpY2EgYXQgPGxpdGVyYWw+Zm9vPC9saXRlcmFsPjoKKzxzY3JlZW4+ Cis8cHJvbXB0PiQ8L3Byb21wdD4gPHVzZXJpbnB1dD5wZ19jcmVhdGVzdWJzY3JpYmVyIC1E IC91c3IvbG9jYWwvcGdzcWwvZGF0YSAtUCAiaG9zdD1mb28iIC1kIGhyIC1kIGZpbmFuY2U8 L3VzZXJpbnB1dD4KKzwvc2NyZWVuPgorICA8L3BhcmE+CisKKyA8L3JlZnNlY3QxPgorCisg PHJlZnNlY3QxPgorICA8dGl0bGU+U2VlIEFsc288L3RpdGxlPgorCisgIDxzaW1wbGVsaXN0 IHR5cGU9ImlubGluZSI+CisgICA8bWVtYmVyPjx4cmVmIGxpbmtlbmQ9ImFwcC1wZ2Jhc2Vi YWNrdXAiLz48L21lbWJlcj4KKyAgPC9zaW1wbGVsaXN0PgorIDwvcmVmc2VjdDE+CisKKzwv cmVmZW50cnk+CmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvcmVmZXJlbmNlLnNnbWwgYi9k b2Mvc3JjL3NnbWwvcmVmZXJlbmNlLnNnbWwKaW5kZXggYWE5NGY2YWRmNi4uZmY4NWFjZTgz ZiAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL3JlZmVyZW5jZS5zZ21sCisrKyBiL2RvYy9z cmMvc2dtbC9yZWZlcmVuY2Uuc2dtbApAQCAtMjgyLDYgKzI4Miw3IEBACiAgICAmcGdhcmNo aXZlY2xlYW51cDsKICAgICZwZ0NoZWNrc3VtczsKICAgICZwZ0NvbnRyb2xkYXRhOworICAg JnBnQ3JlYXRlU3Vic2NyaWJlcjsKICAgICZwZ0N0bDsKICAgICZwZ1Jlc2V0d2FsOwogICAg JnBnUmV3aW5kOwpkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9wZ19iYXNlYmFja3VwLy5naXRpZ25v cmUgYi9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvLmdpdGlnbm9yZQppbmRleCAyNjA0OGJkYmQ4 Li4xNGQ1ZGU2YzAxIDEwMDY0NAotLS0gYS9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvLmdpdGln bm9yZQorKysgYi9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvLmdpdGlnbm9yZQpAQCAtMSw0ICsx LDUgQEAKIC9wZ19iYXNlYmFja3VwCisvcGdfY3JlYXRlc3Vic2NyaWJlcgogL3BnX3JlY2Vp dmV3YWwKIC9wZ19yZWN2bG9naWNhbAogCmRpZmYgLS1naXQgYS9zcmMvYmluL3BnX2Jhc2Vi YWNrdXAvTWFrZWZpbGUgYi9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvTWFrZWZpbGUKaW5kZXgg YWJmYjY0NDBlYy4uZTlhOTIwZGJjZCAxMDA2NDQKLS0tIGEvc3JjL2Jpbi9wZ19iYXNlYmFj a3VwL01ha2VmaWxlCisrKyBiL3NyYy9iaW4vcGdfYmFzZWJhY2t1cC9NYWtlZmlsZQpAQCAt NDQsMTEgKzQ0LDE0IEBAIEJCT0JKUyA9IFwKIAliYnN0cmVhbWVyX3Rhci5vIFwKIAliYnN0 cmVhbWVyX3pzdGQubwogCi1hbGw6IHBnX2Jhc2ViYWNrdXAgcGdfcmVjZWl2ZXdhbCBwZ19y ZWN2bG9naWNhbAorYWxsOiBwZ19iYXNlYmFja3VwIHBnX2NyZWF0ZXN1YnNjcmliZXIgcGdf cmVjZWl2ZXdhbCBwZ19yZWN2bG9naWNhbAogCiBwZ19iYXNlYmFja3VwOiAkKEJCT0JKUykg JChPQkpTKSB8IHN1Ym1ha2UtbGlicHEgc3VibWFrZS1saWJwZ3BvcnQgc3VibWFrZS1saWJw Z2ZldXRpbHMKIAkkKENDKSAkKENGTEFHUykgJChCQk9CSlMpICQoT0JKUykgJChMREZMQUdT KSAkKExERkxBR1NfRVgpICQoTElCUykgLW8gJEAkKFgpCiAKK3BnX2NyZWF0ZXN1YnNjcmli ZXI6ICQoV0lOMzJSRVMpIHBnX2NyZWF0ZXN1YnNjcmliZXIubyB8IHN1Ym1ha2UtbGlicHEg c3VibWFrZS1saWJwZ3BvcnQgc3VibWFrZS1saWJwZ2ZldXRpbHMKKwkkKENDKSAkKENGTEFH UykgJF4gJChMREZMQUdTKSAkKExERkxBR1NfRVgpICQoTElCUykgLW8gJEAkKFgpCisKIHBn X3JlY2VpdmV3YWw6IHBnX3JlY2VpdmV3YWwubyAkKE9CSlMpIHwgc3VibWFrZS1saWJwcSBz dWJtYWtlLWxpYnBncG9ydCBzdWJtYWtlLWxpYnBnZmV1dGlscwogCSQoQ0MpICQoQ0ZMQUdT KSBwZ19yZWNlaXZld2FsLm8gJChPQkpTKSAkKExERkxBR1MpICQoTERGTEFHU19FWCkgJChM SUJTKSAtbyAkQCQoWCkKIApAQCAtNTcsNiArNjAsNyBAQCBwZ19yZWN2bG9naWNhbDogcGdf cmVjdmxvZ2ljYWwubyAkKE9CSlMpIHwgc3VibWFrZS1saWJwcSBzdWJtYWtlLWxpYnBncG9y dCBzdWJtYQogCiBpbnN0YWxsOiBhbGwgaW5zdGFsbGRpcnMKIAkkKElOU1RBTExfUFJPR1JB TSkgcGdfYmFzZWJhY2t1cCQoWCkgJyQoREVTVERJUikkKGJpbmRpcikvcGdfYmFzZWJhY2t1 cCQoWCknCisJJChJTlNUQUxMX1BST0dSQU0pIHBnX2NyZWF0ZXN1YnNjcmliZXIkKFgpICck KERFU1RESVIpJChiaW5kaXIpL3BnX2NyZWF0ZXN1YnNjcmliZXIkKFgpJwogCSQoSU5TVEFM TF9QUk9HUkFNKSBwZ19yZWNlaXZld2FsJChYKSAnJChERVNURElSKSQoYmluZGlyKS9wZ19y ZWNlaXZld2FsJChYKScKIAkkKElOU1RBTExfUFJPR1JBTSkgcGdfcmVjdmxvZ2ljYWwkKFgp ICckKERFU1RESVIpJChiaW5kaXIpL3BnX3JlY3Zsb2dpY2FsJChYKScKIApAQCAtNjUsMTIg KzY5LDEzIEBAIGluc3RhbGxkaXJzOgogCiB1bmluc3RhbGw6CiAJcm0gLWYgJyQoREVTVERJ UikkKGJpbmRpcikvcGdfYmFzZWJhY2t1cCQoWCknCisJcm0gLWYgJyQoREVTVERJUikkKGJp bmRpcikvcGdfY3JlYXRlc3Vic2NyaWJlciQoWCknCiAJcm0gLWYgJyQoREVTVERJUikkKGJp bmRpcikvcGdfcmVjZWl2ZXdhbCQoWCknCiAJcm0gLWYgJyQoREVTVERJUikkKGJpbmRpcikv cGdfcmVjdmxvZ2ljYWwkKFgpJwogCiBjbGVhbiBkaXN0Y2xlYW46Ci0Jcm0gLWYgcGdfYmFz ZWJhY2t1cCQoWCkgcGdfcmVjZWl2ZXdhbCQoWCkgcGdfcmVjdmxvZ2ljYWwkKFgpIFwKLQkJ JChCQk9CSlMpIHBnX3JlY2VpdmV3YWwubyBwZ19yZWN2bG9naWNhbC5vIFwKKwlybSAtZiBw Z19iYXNlYmFja3VwJChYKSBwZ19jcmVhdGVzdWJzY3JpYmVyJChYKSBwZ19yZWNlaXZld2Fs JChYKSBwZ19yZWN2bG9naWNhbCQoWCkgXAorCQkkKEJCT0JKUykgcGdfY3JlYXRlc3Vic2Ny aWJlci5vIHBnX3JlY2VpdmV3YWwubyBwZ19yZWN2bG9naWNhbC5vIFwKIAkJJChPQkpTKQog CXJtIC1yZiB0bXBfY2hlY2sKIApkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9wZ19iYXNlYmFja3Vw L21lc29uLmJ1aWxkIGIvc3JjL2Jpbi9wZ19iYXNlYmFja3VwL21lc29uLmJ1aWxkCmluZGV4 IGY3ZTYwZTY2NzAuLmMwMGFjZDVlMTEgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcGdfYmFzZWJh Y2t1cC9tZXNvbi5idWlsZAorKysgYi9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvbWVzb24uYnVp bGQKQEAgLTM4LDYgKzM4LDI0IEBAIHBnX2Jhc2ViYWNrdXAgPSBleGVjdXRhYmxlKCdwZ19i YXNlYmFja3VwJywKIGJpbl90YXJnZXRzICs9IHBnX2Jhc2ViYWNrdXAKIAogCitwZ19jcmVh dGVzdWJzY3JpYmVyX3NvdXJjZXMgPSBmaWxlcygKKyAgJ3BnX2NyZWF0ZXN1YnNjcmliZXIu YycKKykKKworaWYgaG9zdF9zeXN0ZW0gPT0gJ3dpbmRvd3MnCisgIHBnX2NyZWF0ZXN1YnNj cmliZXJfc291cmNlcyArPSByY19iaW5fZ2VuLnByb2Nlc3Mod2luMzJ2ZXJfcmMsIGV4dHJh X2FyZ3M6IFsKKwknLS1OQU1FJywgJ3BnX2NyZWF0ZXN1YnNjcmliZXInLAorCSctLUZJTEVE RVNDJywgJ3BnX2NyZWF0ZXN1YnNjcmliZXIgLSBjcmVhdGUgYSBuZXcgbG9naWNhbCByZXBs aWNhIGZyb20gYSBzdGFuZGJ5IHNlcnZlcicsXSkKK2VuZGlmCisKK3BnX2NyZWF0ZXN1YnNj cmliZXIgPSBleGVjdXRhYmxlKCdwZ19jcmVhdGVzdWJzY3JpYmVyJywKKyAgcGdfY3JlYXRl c3Vic2NyaWJlcl9zb3VyY2VzLAorICBkZXBlbmRlbmNpZXM6IFtmcm9udGVuZF9jb2RlLCBs aWJwcV0sCisgIGt3YXJnczogZGVmYXVsdF9iaW5fYXJncywKKykKK2Jpbl90YXJnZXRzICs9 IHBnX2NyZWF0ZXN1YnNjcmliZXIKKworCiBwZ19yZWNlaXZld2FsX3NvdXJjZXMgPSBmaWxl cygKICAgJ3BnX3JlY2VpdmV3YWwuYycsCiApCkBAIC04OSw2ICsxMDcsNyBAQCB0ZXN0cyAr PSB7CiAgICAgICAndC8wMTFfaW5fcGxhY2VfdGFibGVzcGFjZS5wbCcsCiAgICAgICAndC8w MjBfcGdfcmVjZWl2ZXdhbC5wbCcsCiAgICAgICAndC8wMzBfcGdfcmVjdmxvZ2ljYWwucGwn LAorICAgICAgJ3QvMDQwX3BnX2NyZWF0ZXN1YnNjcmliZXIucGwnLAogICAgIF0sCiAgIH0s CiB9CmRpZmYgLS1naXQgYS9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvcGdfY3JlYXRlc3Vic2Ny aWJlci5jIGIvc3JjL2Jpbi9wZ19iYXNlYmFja3VwL3BnX2NyZWF0ZXN1YnNjcmliZXIuYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi5lNzBmYzVkY2EwCi0tLSAv ZGV2L251bGwKKysrIGIvc3JjL2Jpbi9wZ19iYXNlYmFja3VwL3BnX2NyZWF0ZXN1YnNjcmli ZXIuYwpAQCAtMCwwICsxLDIwMzggQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAq IHBnX2NyZWF0ZXN1YnNjcmliZXIuYworICoJICBDcmVhdGUgYSBuZXcgbG9naWNhbCByZXBs aWNhIGZyb20gYSBzdGFuZGJ5IHNlcnZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyNCwg UG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqCisgKiBJREVOVElGSUNB VElPTgorICoJICBzcmMvYmluL3BnX2Jhc2ViYWNrdXAvcGdfY3JlYXRlc3Vic2NyaWJlci5j CisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2luY2x1ZGUgInBvc3RncmVz X2ZlLmgiCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+ CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19hdXRoaWRfZC5o IgorI2luY2x1ZGUgImNvbW1vbi9jb25uZWN0LmgiCisjaW5jbHVkZSAiY29tbW9uL2NvbnRy b2xkYXRhX3V0aWxzLmgiCisjaW5jbHVkZSAiY29tbW9uL2ZpbGVfcGVybS5oIgorI2luY2x1 ZGUgImNvbW1vbi9sb2dnaW5nLmgiCisjaW5jbHVkZSAiY29tbW9uL3Jlc3RyaWN0ZWRfdG9r ZW4uaCIKKyNpbmNsdWRlICJjb21tb24vdXNlcm5hbWUuaCIKKyNpbmNsdWRlICJmZV91dGls cy9yZWNvdmVyeV9nZW4uaCIKKyNpbmNsdWRlICJmZV91dGlscy9zaW1wbGVfbGlzdC5oIgor I2luY2x1ZGUgImdldG9wdF9sb25nLmgiCisKKyNkZWZpbmUJREVGQVVMVF9TVUJfUE9SVAk1 MDQzMgorI2RlZmluZQlCQVNFX09VVFBVVF9ESVIJCSJwZ19jcmVhdGVzdWJzY3JpYmVyX291 dHB1dC5kIgorCisvKiBDb21tYW5kLWxpbmUgb3B0aW9ucyAqLworc3RydWN0IENyZWF0ZVN1 YnNjcmliZXJPcHRpb25zCit7CisJY2hhcgkgICAqc3Vic2NyaWJlcl9kaXI7IC8qIHN0YW5k Ynkvc3Vic2NyaWJlciBkYXRhIGRpcmVjdG9yeSAqLworCWNoYXIJICAgKnB1Yl9jb25uaW5m b19zdHI7CS8qIHB1Ymxpc2hlciBjb25uZWN0aW9uIHN0cmluZyAqLworCWNoYXIJICAgKnNv Y2tldF9kaXI7CQkvKiBkaXJlY3RvcnkgZm9yIFVuaXgtZG9tYWluIHNvY2tldCwgaWYgYW55 ICovCisJdW5zaWduZWQgc2hvcnQgc3ViX3BvcnQ7CS8qIHN1YnNjcmliZXIgcG9ydCBudW1i ZXIgKi8KKwljb25zdCBjaGFyICpzdWJfdXNlcm5hbWU7CS8qIHN1YnNjcmliZXIgdXNlcm5h bWUgKi8KKwlTaW1wbGVTdHJpbmdMaXN0IGRhdGFiYXNlX25hbWVzOwkvKiBsaXN0IG9mIGRh dGFiYXNlIG5hbWVzICovCisJYm9vbAkJcmV0YWluOwkJCS8qIHJldGFpbiBsb2cgZmlsZT8g Ki8KKwlpbnQJCQlyZWNvdmVyeV90aW1lb3V0OwkvKiBzdG9wIHJlY292ZXJ5IGFmdGVyIHRo aXMgdGltZSAqLworfQkJCUNyZWF0ZVN1YnNjcmliZXJPcHRpb25zOworCitzdHJ1Y3QgTG9n aWNhbFJlcEluZm8KK3sKKwlPaWQJCQlvaWQ7CQkJLyogZGF0YWJhc2UgT0lEICovCisJY2hh cgkgICAqZGJuYW1lOwkJCS8qIGRhdGFiYXNlIG5hbWUgKi8KKwljaGFyCSAgICpwdWJjb25u aW5mbzsJLyogcHVibGlzaGVyIGNvbm5lY3Rpb24gc3RyaW5nICovCisJY2hhcgkgICAqc3Vi Y29ubmluZm87CS8qIHN1YnNjcmliZXIgY29ubmVjdGlvbiBzdHJpbmcgKi8KKwljaGFyCSAg ICpwdWJuYW1lOwkJLyogcHVibGljYXRpb24gbmFtZSAqLworCWNoYXIJICAgKnN1Ym5hbWU7 CQkvKiBzdWJzY3JpcHRpb24gbmFtZSAvIHJlcGxpY2F0aW9uIHNsb3QgbmFtZSAqLworCisJ Ym9vbAkJbWFkZV9yZXBsc2xvdDsJLyogcmVwbGljYXRpb24gc2xvdCB3YXMgY3JlYXRlZCAq LworCWJvb2wJCW1hZGVfcHVibGljYXRpb247CS8qIHB1YmxpY2F0aW9uIHdhcyBjcmVhdGVk ICovCit9CQkJTG9naWNhbFJlcEluZm87CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfb2JqZWN0 c19hdGV4aXQodm9pZCk7CitzdGF0aWMgdm9pZCB1c2FnZSgpOworc3RhdGljIGNoYXIgKmdl dF9iYXNlX2Nvbm5pbmZvKGNoYXIgKmNvbm5pbmZvLCBjaGFyICoqZGJuYW1lKTsKK3N0YXRp YyBjaGFyICpnZXRfZXhlY19wYXRoKGNvbnN0IGNoYXIgKmFyZ3YwLCBjb25zdCBjaGFyICpw cm9nbmFtZSk7CitzdGF0aWMgdm9pZCBjaGVja19kYXRhX2RpcmVjdG9yeShjb25zdCBjaGFy ICpkYXRhZGlyKTsKK3N0YXRpYyBjaGFyICpjb25jYXRfY29ubmluZm9fZGJuYW1lKGNvbnN0 IGNoYXIgKmNvbm5pbmZvLCBjb25zdCBjaGFyICpkYm5hbWUpOworc3RhdGljIHN0cnVjdCBM b2dpY2FsUmVwSW5mbyAqc3RvcmVfcHViX3N1Yl9pbmZvKFNpbXBsZVN0cmluZ0xpc3QgZGJu YW1lcywKKwkJCQkJCQkJCQkJCSBjb25zdCBjaGFyICpwdWJfYmFzZV9jb25uaW5mbywKKwkJ CQkJCQkJCQkJCSBjb25zdCBjaGFyICpzdWJfYmFzZV9jb25uaW5mbyk7CitzdGF0aWMgUEdj b25uICpjb25uZWN0X2RhdGFiYXNlKGNvbnN0IGNoYXIgKmNvbm5pbmZvLCBib29sIGV4aXRf b25fZXJyb3IpOworc3RhdGljIHZvaWQgZGlzY29ubmVjdF9kYXRhYmFzZShQR2Nvbm4gKmNv bm4sIGJvb2wgZXhpdF9vbl9lcnJvcik7CitzdGF0aWMgdWludDY0IGdldF9wcmltYXJ5X3N5 c2lkKGNvbnN0IGNoYXIgKmNvbm5pbmZvKTsKK3N0YXRpYyB1aW50NjQgZ2V0X3N0YW5kYnlf c3lzaWQoY29uc3QgY2hhciAqZGF0YWRpcik7CitzdGF0aWMgdm9pZCBtb2RpZnlfc3Vic2Ny aWJlcl9zeXNpZChjb25zdCBjaGFyICpwZ19yZXNldHdhbF9wYXRoLAorCQkJCQkJCQkJc3Ry dWN0IENyZWF0ZVN1YnNjcmliZXJPcHRpb25zICpvcHQpOworc3RhdGljIGJvb2wgc2VydmVy X2lzX2luX3JlY292ZXJ5KFBHY29ubiAqY29ubik7CitzdGF0aWMgdm9pZCBjaGVja19wdWJs aXNoZXIoc3RydWN0IExvZ2ljYWxSZXBJbmZvICpkYmluZm8pOworc3RhdGljIHZvaWQgc2V0 dXBfcHVibGlzaGVyKHN0cnVjdCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvKTsKK3N0YXRpYyB2 b2lkIGNoZWNrX3N1YnNjcmliZXIoc3RydWN0IExvZ2ljYWxSZXBJbmZvICpkYmluZm8pOwor c3RhdGljIHZvaWQgc2V0dXBfc3Vic2NyaWJlcihzdHJ1Y3QgTG9naWNhbFJlcEluZm8gKmRi aW5mbywKKwkJCQkJCQkgY29uc3QgY2hhciAqY29uc2lzdGVudF9sc24pOworc3RhdGljIGNo YXIgKmNyZWF0ZV9sb2dpY2FsX3JlcGxpY2F0aW9uX3Nsb3QoUEdjb25uICpjb25uLAorCQkJ CQkJCQkJCQkgc3RydWN0IExvZ2ljYWxSZXBJbmZvICpkYmluZm8sCisJCQkJCQkJCQkJCSBi b29sIHRlbXBvcmFyeSk7CitzdGF0aWMgdm9pZCBkcm9wX3JlcGxpY2F0aW9uX3Nsb3QoUEdj b25uICpjb25uLCBzdHJ1Y3QgTG9naWNhbFJlcEluZm8gKmRiaW5mbywKKwkJCQkJCQkJICBj b25zdCBjaGFyICpzbG90X25hbWUpOworc3RhdGljIGNoYXIgKnNldHVwX3NlcnZlcl9sb2dm aWxlKGNvbnN0IGNoYXIgKmRhdGFkaXIpOworc3RhdGljIHZvaWQgcGdfY3RsX3N0YXR1cyhj b25zdCBjaGFyICpwZ19jdGxfY21kLCBpbnQgcmMpOworc3RhdGljIHZvaWQgc3RhcnRfc3Rh bmRieV9zZXJ2ZXIoc3RydWN0IENyZWF0ZVN1YnNjcmliZXJPcHRpb25zICpvcHQsCisJCQkJ CQkJCSBjb25zdCBjaGFyICpwZ19jdGxfcGF0aCwgY29uc3QgY2hhciAqbG9nZmlsZSwKKwkJ CQkJCQkJIGJvb2wgd2l0aF9vcHRpb25zKTsKK3N0YXRpYyB2b2lkIHN0b3Bfc3RhbmRieV9z ZXJ2ZXIoY29uc3QgY2hhciAqcGdfY3RsX3BhdGgsIGNvbnN0IGNoYXIgKmRhdGFkaXIpOwor c3RhdGljIHZvaWQgd2FpdF9mb3JfZW5kX3JlY292ZXJ5KGNvbnN0IGNoYXIgKmNvbm5pbmZv LCBjb25zdCBjaGFyICpwZ19jdGxfcGF0aCwKKwkJCQkJCQkJICBzdHJ1Y3QgQ3JlYXRlU3Vi c2NyaWJlck9wdGlvbnMgKm9wdCk7CitzdGF0aWMgdm9pZCBjcmVhdGVfcHVibGljYXRpb24o UEdjb25uICpjb25uLCBzdHJ1Y3QgTG9naWNhbFJlcEluZm8gKmRiaW5mbyk7CitzdGF0aWMg dm9pZCBkcm9wX3B1YmxpY2F0aW9uKFBHY29ubiAqY29ubiwgc3RydWN0IExvZ2ljYWxSZXBJ bmZvICpkYmluZm8pOworc3RhdGljIHZvaWQgY3JlYXRlX3N1YnNjcmlwdGlvbihQR2Nvbm4g KmNvbm4sIHN0cnVjdCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvKTsKK3N0YXRpYyB2b2lkIHNl dF9yZXBsaWNhdGlvbl9wcm9ncmVzcyhQR2Nvbm4gKmNvbm4sIHN0cnVjdCBMb2dpY2FsUmVw SW5mbyAqZGJpbmZvLAorCQkJCQkJCQkJIGNvbnN0IGNoYXIgKmxzbik7CitzdGF0aWMgdm9p ZCBlbmFibGVfc3Vic2NyaXB0aW9uKFBHY29ubiAqY29ubiwgc3RydWN0IExvZ2ljYWxSZXBJ bmZvICpkYmluZm8pOworCisjZGVmaW5lCVVTRUNfUEVSX1NFQwkxMDAwMDAwCisjZGVmaW5l CVdBSVRfSU5URVJWQUwJMQkJLyogMSBzZWNvbmQgKi8KKworc3RhdGljIGNvbnN0IGNoYXIg KnByb2duYW1lOworCitzdGF0aWMgY2hhciAqcHJpbWFyeV9zbG90X25hbWUgPSBOVUxMOwor c3RhdGljIGJvb2wgZHJ5X3J1biA9IGZhbHNlOworCitzdGF0aWMgYm9vbCBzdWNjZXNzID0g ZmFsc2U7CisKK3N0YXRpYyBzdHJ1Y3QgTG9naWNhbFJlcEluZm8gKmRiaW5mbzsKK3N0YXRp YyBpbnQJbnVtX2RicyA9IDA7CisKK3N0YXRpYyBib29sIHJlY292ZXJ5X2VuZGVkID0gZmFs c2U7CisKK2VudW0gV2FpdFBNUmVzdWx0Cit7CisJUE9TVE1BU1RFUl9SRUFEWSwKKwlQT1NU TUFTVEVSX1NUSUxMX1NUQVJUSU5HCit9OworCisKKy8qCisgKiBDbGVhbnVwIG9iamVjdHMg dGhhdCB3ZXJlIGNyZWF0ZWQgYnkgcGdfY3JlYXRlc3Vic2NyaWJlciBpZiB0aGVyZSBpcyBh bgorICogZXJyb3IuCisgKgorICogUmVwbGljYXRpb24gc2xvdHMsIHB1YmxpY2F0aW9ucyBh bmQgc3Vic2NyaXB0aW9ucyBhcmUgY3JlYXRlZC4gRGVwZW5kaW5nIG9uCisgKiB0aGUgc3Rl cCBpdCBmYWlsZWQsIGl0IHNob3VsZCByZW1vdmUgdGhlIGFscmVhZHkgY3JlYXRlZCBvYmpl Y3RzIGlmIGl0IGlzCisgKiBwb3NzaWJsZSAoc29tZXRpbWVzIGl0IHdvbid0IHdvcmsgZHVl IHRvIGEgY29ubmVjdGlvbiBpc3N1ZSkuCisgKi8KK3N0YXRpYyB2b2lkCitjbGVhbnVwX29i amVjdHNfYXRleGl0KHZvaWQpCit7CisJUEdjb25uCSAgICpjb25uOworCWludAkJCWk7CisK KwlpZiAoc3VjY2VzcykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiB0aGUgc2VydmVyIGlz IHByb21vdGVkLCB0aGVyZSBpcyBubyB3YXkgdG8gdXNlIHRoZSBjdXJyZW50IHNldHVwCisJ ICogYWdhaW4uIFdhcm4gdGhlIHVzZXIgdGhhdCBhIG5ldyByZXBsaWNhdGlvbiBzZXR1cCBz aG91bGQgYmUgZG9uZSBiZWZvcmUKKwkgKiB0cnlpbmcgYWdhaW4uCisJICovCisJaWYgKHJl Y292ZXJ5X2VuZGVkKQorCXsKKwkJcGdfbG9nX3dhcm5pbmcoInBnX2NyZWF0ZXN1YnNjcmli ZXIgZmFpbGVkIGFmdGVyIHRoZSBlbmQgb2YgcmVjb3ZlcnkiKTsKKwkJcGdfbG9nX3dhcm5p bmdfaGludCgiVGhlIHRhcmdldCBzZXJ2ZXIgY2Fubm90IGJlIHVzZWQgYXMgYSBwaHlzaWNh bCByZXBsaWNhIGFueW1vcmUuIik7CisJCXBnX2xvZ193YXJuaW5nX2hpbnQoIllvdSBtdXN0 IHJlY3JlYXRlIHRoZSBwaHlzaWNhbCByZXBsaWNhIGJlZm9yZSBjb250aW51aW5nLiIpOwor CX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1fZGJzOyBpKyspCisJeworCisJCWlmIChkYmlu Zm9baV0ubWFkZV9wdWJsaWNhdGlvbiB8fCBkYmluZm9baV0ubWFkZV9yZXBsc2xvdCkKKwkJ eworCQkJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoZGJpbmZvW2ldLnB1YmNvbm5pbmZvLCBm YWxzZSk7CisJCQlpZiAoY29ubiAhPSBOVUxMKQorCQkJeworCQkJCWlmIChkYmluZm9baV0u bWFkZV9wdWJsaWNhdGlvbikKKwkJCQkJZHJvcF9wdWJsaWNhdGlvbihjb25uLCAmZGJpbmZv W2ldKTsKKwkJCQlpZiAoZGJpbmZvW2ldLm1hZGVfcmVwbHNsb3QpCisJCQkJCWRyb3BfcmVw bGljYXRpb25fc2xvdChjb25uLCAmZGJpbmZvW2ldLCBkYmluZm9baV0uc3VibmFtZSk7CisJ CQkJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uLCBmYWxzZSk7CisJCQl9CisJCQllbHNlCisJ CQl7CisJCQkJLyoKKwkJCQkgKiBJZiBhIGNvbm5lY3Rpb24gY291bGQgbm90IGJlIGVzdGFi bGlzaGVkLCBpbmZvcm0gdGhlIHVzZXIKKwkJCQkgKiB0aGF0IHNvbWUgb2JqZWN0cyB3ZXJl IGxlZnQgb24gcHJpbWFyeSBhbmQgc2hvdWxkIGJlCisJCQkJICogcmVtb3ZlZCBiZWZvcmUg dHJ5aW5nIGFnYWluLgorCQkJCSAqLworCQkJCWlmIChkYmluZm9baV0ubWFkZV9wdWJsaWNh dGlvbikKKwkJCQl7CisJCQkJCXBnX2xvZ193YXJuaW5nKCJUaGVyZSBtaWdodCBiZSBhIHB1 YmxpY2F0aW9uIFwiJXNcIiBpbiBkYXRhYmFzZSBcIiVzXCIgb24gcHJpbWFyeSIsCisJCQkJ CQkJCSAgIGRiaW5mb1tpXS5wdWJuYW1lLCBkYmluZm9baV0uZGJuYW1lKTsKKwkJCQkJcGdf bG9nX3dhcm5pbmdfaGludCgiQ29uc2lkZXIgZHJvcHBpbmcgdGhpcyBwdWJsaWNhdGlvbiBi ZWZvcmUgdHJ5aW5nIGFnYWluLiIpOworCQkJCX0KKwkJCQlpZiAoZGJpbmZvW2ldLm1hZGVf cmVwbHNsb3QpCisJCQkJeworCQkJCQlwZ19sb2dfd2FybmluZygiVGhlcmUgbWlnaHQgYmUg YSByZXBsaWNhdGlvbiBzbG90IFwiJXNcIiBpbiBkYXRhYmFzZSBcIiVzXCIgb24gcHJpbWFy eSIsCisJCQkJCQkJCSAgIGRiaW5mb1tpXS5zdWJuYW1lLCBkYmluZm9baV0uZGJuYW1lKTsK KwkJCQkJcGdfbG9nX3dhcm5pbmdfaGludCgiRHJvcCB0aGlzIHJlcGxpY2F0aW9uIHNsb3Qg c29vbiB0byBhdm9pZCByZXRlbnRpb24gb2YgV0FMIGZpbGVzLiIpOworCQkJCX0KKwkJCX0K KwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3VzYWdlKHZvaWQpCit7CisJcHJpbnRmKF8o IiVzIGNyZWF0ZXMgYSBuZXcgbG9naWNhbCByZXBsaWNhIGZyb20gYSBzdGFuZGJ5IHNlcnZl ci5cblxuIiksCisJCSAgIHByb2duYW1lKTsKKwlwcmludGYoXygiVXNhZ2U6XG4iKSk7CisJ cHJpbnRmKF8oIiAgJXMgW09QVElPTl0uLi5cbiIpLCBwcm9nbmFtZSk7CisJcHJpbnRmKF8o IlxuT3B0aW9uczpcbiIpKTsKKwlwcmludGYoXygiIC1kLCAtLWRhdGFiYXNlPURCTkFNRSAg ICAgICAgICAgICAgIGRhdGFiYXNlIHRvIGNyZWF0ZSBhIHN1YnNjcmlwdGlvblxuIikpOwor CXByaW50ZihfKCIgLUQsIC0tcGdkYXRhPURBVEFESVIgICAgICAgICAgICAgICAgbG9jYXRp b24gZm9yIHRoZSBzdWJzY3JpYmVyIGRhdGEgZGlyZWN0b3J5XG4iKSk7CisJcHJpbnRmKF8o IiAtbiwgLS1kcnktcnVuICAgICAgICAgICAgICAgICAgICAgICBkcnkgcnVuLCBqdXN0IHNo b3cgd2hhdCB3b3VsZCBiZSBkb25lXG4iKSk7CisJcHJpbnRmKF8oIiAtcCwgLS1zdWJzY3Jp YmVyLXBvcnQ9UE9SVCAgICAgICAgICBzdWJzY3JpYmVyIHBvcnQgbnVtYmVyIChkZWZhdWx0 ICVkKVxuIiksIERFRkFVTFRfU1VCX1BPUlQpOworCXByaW50ZihfKCIgLVAsIC0tcHVibGlz aGVyLXNlcnZlcj1DT05OU1RSICAgICAgcHVibGlzaGVyIGNvbm5lY3Rpb24gc3RyaW5nXG4i KSk7CisJcHJpbnRmKF8oIiAtciwgLS1yZXRhaW4gICAgICAgICAgICAgICAgICAgICAgICBy ZXRhaW4gbG9nIGZpbGUgYWZ0ZXIgc3VjY2Vzc1xuIikpOworCXByaW50ZihfKCIgLXMsIC0t c29ja2V0LWRpcmVjdG9yeT1ESVIgICAgICAgICAgc29ja2V0IGRpcmVjdG9yeSB0byB1c2Ug KGRlZmF1bHQgY3VycmVudCBkaXJlY3RvcnkpXG4iKSk7CisJcHJpbnRmKF8oIiAtdCwgLS1y ZWNvdmVyeS10aW1lb3V0PVNFQ1MgICAgICAgICBzZWNvbmRzIHRvIHdhaXQgZm9yIHJlY292 ZXJ5IHRvIGVuZFxuIikpOworCXByaW50ZihfKCIgLVUsIC0tc3Vic2NyaWJlci11c2VybmFt ZT1OQU1FICAgICAgc3Vic2NyaWJlciB1c2VybmFtZVxuIikpOworCXByaW50ZihfKCIgLXYs IC0tdmVyYm9zZSAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHZlcmJvc2UgbWVzc2Fn ZXNcbiIpKTsKKwlwcmludGYoXygiIC1WLCAtLXZlcnNpb24gICAgICAgICAgICAgICAgICAg ICAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uLCB0aGVuIGV4aXRcbiIpKTsKKwlwcmlu dGYoXygiIC0/LCAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3cgdGhpcyBo ZWxwLCB0aGVuIGV4aXRcbiIpKTsKKwlwcmludGYoXygiXG5SZXBvcnQgYnVncyB0byA8JXM+ LlxuIiksIFBBQ0tBR0VfQlVHUkVQT1JUKTsKKwlwcmludGYoXygiJXMgaG9tZSBwYWdlOiA8 JXM+XG4iKSwgUEFDS0FHRV9OQU1FLCBQQUNLQUdFX1VSTCk7Cit9CisKKy8qCisgKiBWYWxp ZGF0ZSBhIGNvbm5lY3Rpb24gc3RyaW5nLiBSZXR1cm5zIGEgYmFzZSBjb25uZWN0aW9uIHN0 cmluZyB0aGF0IGlzIGEKKyAqIGNvbm5lY3Rpb24gc3RyaW5nIHdpdGhvdXQgYSBkYXRhYmFz ZSBuYW1lLgorICoKKyAqIFNpbmNlIHdlIG1pZ2h0IHByb2Nlc3MgbXVsdGlwbGUgZGF0YWJh c2VzLCBlYWNoIGRhdGFiYXNlIG5hbWUgd2lsbCBiZQorICogYXBwZW5kZWQgdG8gdGhpcyBi YXNlIGNvbm5lY3Rpb24gc3RyaW5nIHRvIHByb3ZpZGUgYSBmaW5hbCBjb25uZWN0aW9uCisg KiBzdHJpbmcuIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgKGRibmFtZSkgaXMgbm90IG51bGws IHJldHVybnMgZGJuYW1lIGlmIHRoZQorICogcHJvdmlkZWQgY29ubmVjdGlvbiBzdHJpbmcg Y29udGFpbnMgaXQuIElmIG9wdGlvbiAtLWRhdGFiYXNlIGlzIG5vdAorICogcHJvdmlkZWQs IHVzZXMgZGJuYW1lIGFzIHRoZSBvbmx5IGRhdGFiYXNlIHRvIHNldHVwIHRoZSBsb2dpY2Fs IHJlcGxpY2EuCisgKgorICogSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRv IGZyZWUgdGhlIHJldHVybmVkIGNvbm5lY3Rpb24gc3RyaW5nIGFuZAorICogZGJuYW1lLgor ICovCitzdGF0aWMgY2hhciAqCitnZXRfYmFzZV9jb25uaW5mbyhjaGFyICpjb25uaW5mbywg Y2hhciAqKmRibmFtZSkKK3sKKwlQUUV4cEJ1ZmZlciBidWYgPSBjcmVhdGVQUUV4cEJ1ZmZl cigpOworCVBRY29ubmluZm9PcHRpb24gKmNvbm5fb3B0cyA9IE5VTEw7CisJUFFjb25uaW5m b09wdGlvbiAqY29ubl9vcHQ7CisJY2hhcgkgICAqZXJybXNnID0gTlVMTDsKKwljaGFyCSAg ICpyZXQ7CisJaW50CQkJaTsKKworCWNvbm5fb3B0cyA9IFBRY29ubmluZm9QYXJzZShjb25u aW5mbywgJmVycm1zZyk7CisJaWYgKGNvbm5fb3B0cyA9PSBOVUxMKQorCXsKKwkJcGdfbG9n X2Vycm9yKCJjb3VsZCBub3QgcGFyc2UgY29ubmVjdGlvbiBzdHJpbmc6ICVzIiwgZXJybXNn KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaSA9IDA7CisJZm9yIChjb25uX29wdCA9IGNv bm5fb3B0czsgY29ubl9vcHQtPmtleXdvcmQgIT0gTlVMTDsgY29ubl9vcHQrKykKKwl7CisJ CWlmIChzdHJjbXAoY29ubl9vcHQtPmtleXdvcmQsICJkYm5hbWUiKSA9PSAwICYmIGNvbm5f b3B0LT52YWwgIT0gTlVMTCkKKwkJeworCQkJaWYgKGRibmFtZSkKKwkJCQkqZGJuYW1lID0g cGdfc3RyZHVwKGNvbm5fb3B0LT52YWwpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAo Y29ubl9vcHQtPnZhbCAhPSBOVUxMICYmIGNvbm5fb3B0LT52YWxbMF0gIT0gJ1wwJykKKwkJ eworCQkJaWYgKGkgPiAwKQorCQkJCWFwcGVuZFBRRXhwQnVmZmVyQ2hhcihidWYsICcgJyk7 CisJCQlhcHBlbmRQUUV4cEJ1ZmZlcihidWYsICIlcz0lcyIsIGNvbm5fb3B0LT5rZXl3b3Jk LCBjb25uX29wdC0+dmFsKTsKKwkJCWkrKzsKKwkJfQorCX0KKworCXJldCA9IHBnX3N0cmR1 cChidWYtPmRhdGEpOworCisJZGVzdHJveVBRRXhwQnVmZmVyKGJ1Zik7CisJUFFjb25uaW5m b0ZyZWUoY29ubl9vcHRzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBWZXJpZnkg aWYgYSBQb3N0Z3JlU1FMIGJpbmFyeSAocHJvZ25hbWUpIGlzIGF2YWlsYWJsZSBpbiB0aGUg c2FtZSBkaXJlY3RvcnkgYXMKKyAqIHBnX2NyZWF0ZXN1YnNjcmliZXIgYW5kIGl0IGhhcyB0 aGUgc2FtZSB2ZXJzaW9uLiAgSXQgcmV0dXJucyB0aGUgYWJzb2x1dGUKKyAqIHBhdGggb2Yg dGhlIHByb2duYW1lLgorICovCitzdGF0aWMgY2hhciAqCitnZXRfZXhlY19wYXRoKGNvbnN0 IGNoYXIgKmFyZ3YwLCBjb25zdCBjaGFyICpwcm9nbmFtZSkKK3sKKwljaGFyCSAgICp2ZXJz aW9uc3RyOworCWNoYXIJICAgKmV4ZWNfcGF0aDsKKwlpbnQJCQlyZXQ7CisKKwl2ZXJzaW9u c3RyID0gcHNwcmludGYoIiVzIChQb3N0Z3JlU1FMKSAlc1xuIiwgcHJvZ25hbWUsIFBHX1ZF UlNJT04pOworCWV4ZWNfcGF0aCA9IHBnX21hbGxvYyhNQVhQR1BBVEgpOworCXJldCA9IGZp bmRfb3RoZXJfZXhlYyhhcmd2MCwgcHJvZ25hbWUsIHZlcnNpb25zdHIsIGV4ZWNfcGF0aCk7 CisKKwlpZiAocmV0IDwgMCkKKwl7CisJCWNoYXIJCWZ1bGxfcGF0aFtNQVhQR1BBVEhdOwor CisJCWlmIChmaW5kX215X2V4ZWMoYXJndjAsIGZ1bGxfcGF0aCkgPCAwKQorCQkJc3RybGNw eShmdWxsX3BhdGgsIHByb2duYW1lLCBzaXplb2YoZnVsbF9wYXRoKSk7CisKKwkJaWYgKHJl dCA9PSAtMSkKKwkJCXBnX2ZhdGFsKCJwcm9ncmFtIFwiJXNcIiBpcyBuZWVkZWQgYnkgJXMg YnV0IHdhcyBub3QgZm91bmQgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIFwiJXNcIiIsCisJ CQkJCSBwcm9nbmFtZSwgInBnX2NyZWF0ZXN1YnNjcmliZXIiLCBmdWxsX3BhdGgpOworCQll bHNlCisJCQlwZ19mYXRhbCgicHJvZ3JhbSBcIiVzXCIgd2FzIGZvdW5kIGJ5IFwiJXNcIiBi dXQgd2FzIG5vdCB0aGUgc2FtZSB2ZXJzaW9uIGFzICVzIiwKKwkJCQkJIHByb2duYW1lLCBm dWxsX3BhdGgsICJwZ19jcmVhdGVzdWJzY3JpYmVyIik7CisJfQorCisJcGdfbG9nX2RlYnVn KCIlcyBwYXRoIGlzOiAgJXMiLCBwcm9nbmFtZSwgZXhlY19wYXRoKTsKKworCXJldHVybiBl eGVjX3BhdGg7Cit9CisKKy8qCisgKiBJcyBpdCBhIGNsdXN0ZXIgZGlyZWN0b3J5PyBUaGVz ZSBhcmUgcHJlbGltaW5hcnkgY2hlY2tzLiBJdCBpcyBmYXIgZnJvbQorICogbWFraW5nIGFu IGFjY3VyYXRlIGNoZWNrLiBJZiBpdCBpcyBub3QgYSBjbG9uZSBmcm9tIHRoZSBwdWJsaXNo ZXIsIGl0IHdpbGwKKyAqIGV2ZW50dWFsbHkgZmFpbCBpbiBhIGZ1dHVyZSBzdGVwLgorICov CitzdGF0aWMgdm9pZAorY2hlY2tfZGF0YV9kaXJlY3RvcnkoY29uc3QgY2hhciAqZGF0YWRp cikKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWNoYXIJCXZlcnNpb25maWxlW01BWFBH UEFUSF07CisKKwlwZ19sb2dfaW5mbygiY2hlY2tpbmcgaWYgZGlyZWN0b3J5IFwiJXNcIiBp cyBhIGNsdXN0ZXIgZGF0YSBkaXJlY3RvcnkiLAorCQkJCWRhdGFkaXIpOworCisJaWYgKHN0 YXQoZGF0YWRpciwgJnN0YXRidWYpICE9IDApCisJeworCQlpZiAoZXJybm8gPT0gRU5PRU5U KQorCQkJcGdfZmF0YWwoImRhdGEgZGlyZWN0b3J5IFwiJXNcIiBkb2VzIG5vdCBleGlzdCIs IGRhdGFkaXIpOworCQllbHNlCisJCQlwZ19mYXRhbCgiY291bGQgbm90IGFjY2VzcyBkaXJl Y3RvcnkgXCIlc1wiOiAlcyIsIGRhdGFkaXIsCisJCQkJCSBzdHJlcnJvcihlcnJubykpOwor CX0KKworCXNucHJpbnRmKHZlcnNpb25maWxlLCBNQVhQR1BBVEgsICIlcy9QR19WRVJTSU9O IiwgZGF0YWRpcik7CisJaWYgKHN0YXQodmVyc2lvbmZpbGUsICZzdGF0YnVmKSAhPSAwICYm IGVycm5vID09IEVOT0VOVCkKKwl7CisJCXBnX2ZhdGFsKCJkaXJlY3RvcnkgXCIlc1wiIGlz IG5vdCBhIGRhdGFiYXNlIGNsdXN0ZXIgZGlyZWN0b3J5IiwKKwkJCQkgZGF0YWRpcik7CisJ fQorfQorCisvKgorICogQXBwZW5kIGRhdGFiYXNlIG5hbWUgaW50byBhIGJhc2UgY29ubmVj dGlvbiBzdHJpbmcuCisgKgorICogZGJuYW1lIGlzIHRoZSBvbmx5IHBhcmFtZXRlciB0aGF0 IGNoYW5nZXMgc28gaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBiYXNlCisgKiBjb25uZWN0 aW9uIHN0cmluZy4gVGhpcyBmdW5jdGlvbiBjb25jYXRlbmF0ZXMgZGJuYW1lIHRvIGJ1aWxk IGEgInJlYWwiCisgKiBjb25uZWN0aW9uIHN0cmluZy4KKyAqLworc3RhdGljIGNoYXIgKgor Y29uY2F0X2Nvbm5pbmZvX2RibmFtZShjb25zdCBjaGFyICpjb25uaW5mbywgY29uc3QgY2hh ciAqZGJuYW1lKQoreworCVBRRXhwQnVmZmVyIGJ1ZiA9IGNyZWF0ZVBRRXhwQnVmZmVyKCk7 CisJY2hhcgkgICAqcmV0OworCisJQXNzZXJ0KGNvbm5pbmZvICE9IE5VTEwpOworCisJYXBw ZW5kUFFFeHBCdWZmZXJTdHIoYnVmLCBjb25uaW5mbyk7CisJYXBwZW5kUFFFeHBCdWZmZXIo YnVmLCAiIGRibmFtZT0lcyIsIGRibmFtZSk7CisKKwlyZXQgPSBwZ19zdHJkdXAoYnVmLT5k YXRhKTsKKwlkZXN0cm95UFFFeHBCdWZmZXIoYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisK Ky8qCisgKiBTdG9yZSBwdWJsaWNhdGlvbiBhbmQgc3Vic2NyaXB0aW9uIGluZm9ybWF0aW9u LgorICovCitzdGF0aWMgc3RydWN0IExvZ2ljYWxSZXBJbmZvICoKK3N0b3JlX3B1Yl9zdWJf aW5mbyhTaW1wbGVTdHJpbmdMaXN0IGRibmFtZXMsIGNvbnN0IGNoYXIgKnB1Yl9iYXNlX2Nv bm5pbmZvLAorCQkJCSAgIGNvbnN0IGNoYXIgKnN1Yl9iYXNlX2Nvbm5pbmZvKQoreworCXN0 cnVjdCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvOworCWludAkJCWkgPSAwOworCisJZGJpbmZv ID0gKHN0cnVjdCBMb2dpY2FsUmVwSW5mbyAqKSBwZ19tYWxsb2MobnVtX2RicyAqIHNpemVv ZihzdHJ1Y3QgTG9naWNhbFJlcEluZm8pKTsKKworCWZvciAoU2ltcGxlU3RyaW5nTGlzdENl bGwgKmNlbGwgPSBkYm5hbWVzLmhlYWQ7IGNlbGw7IGNlbGwgPSBjZWxsLT5uZXh0KQorCXsK KwkJY2hhcgkgICAqY29ubmluZm87CisKKwkJLyogRmlsbCBwdWJsaXNoZXIgYXR0cmlidXRl cyAqLworCQljb25uaW5mbyA9IGNvbmNhdF9jb25uaW5mb19kYm5hbWUocHViX2Jhc2VfY29u bmluZm8sIGNlbGwtPnZhbCk7CisJCWRiaW5mb1tpXS5wdWJjb25uaW5mbyA9IGNvbm5pbmZv OworCQlkYmluZm9baV0uZGJuYW1lID0gY2VsbC0+dmFsOworCQlkYmluZm9baV0ubWFkZV9y ZXBsc2xvdCA9IGZhbHNlOworCQlkYmluZm9baV0ubWFkZV9wdWJsaWNhdGlvbiA9IGZhbHNl OworCQkvKiBGaWxsIHN1YnNjcmliZXIgYXR0cmlidXRlcyAqLworCQljb25uaW5mbyA9IGNv bmNhdF9jb25uaW5mb19kYm5hbWUoc3ViX2Jhc2VfY29ubmluZm8sIGNlbGwtPnZhbCk7CisJ CWRiaW5mb1tpXS5zdWJjb25uaW5mbyA9IGNvbm5pbmZvOworCQkvKiBPdGhlciBmaWVsZHMg d2lsbCBiZSBmaWxsZWQgbGF0ZXIgKi8KKworCQlwZ19sb2dfZGVidWcoInB1Ymxpc2hlcigl ZCk6IGNvbm5lY3Rpb24gc3RyaW5nOiAlcyIsIGksIGRiaW5mb1tpXS5wdWJjb25uaW5mbyk7 CisJCXBnX2xvZ19kZWJ1Zygic3Vic2NyaWJlciglZCk6IGNvbm5lY3Rpb24gc3RyaW5nOiAl cyIsIGksIGRiaW5mb1tpXS5zdWJjb25uaW5mbyk7CisKKwkJaSsrOworCX0KKworCXJldHVy biBkYmluZm87Cit9CisKKy8qCisgKiBPcGVuIGEgbmV3IGNvbm5lY3Rpb24uIElmIGV4aXRf b25fZXJyb3IgaXMgdHJ1ZSwgaXQgaGFzIGFuIHVuZGVzaXJlZAorICogY29uZGl0aW9uIGFu ZCBpdCBzaG91bGQgZXhpdCBpbW1lZGlhdGVseS4KKyAqLworc3RhdGljIFBHY29ubiAqCitj b25uZWN0X2RhdGFiYXNlKGNvbnN0IGNoYXIgKmNvbm5pbmZvLCBib29sIGV4aXRfb25fZXJy b3IpCit7CisJUEdjb25uCSAgICpjb25uOworCVBHcmVzdWx0ICAgKnJlczsKKworCWNvbm4g PSBQUWNvbm5lY3RkYihjb25uaW5mbyk7CisJaWYgKFBRc3RhdHVzKGNvbm4pICE9IENPTk5F Q1RJT05fT0spCisJeworCQlwZ19sb2dfZXJyb3IoImNvbm5lY3Rpb24gdG8gZGF0YWJhc2Ug ZmFpbGVkOiAlcyIsCisJCQkJCSBQUWVycm9yTWVzc2FnZShjb25uKSk7CisJCWlmIChleGl0 X29uX2Vycm9yKQorCQkJZXhpdCgxKTsKKworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBT ZWN1cmUgc2VhcmNoX3BhdGggKi8KKwlyZXMgPSBQUWV4ZWMoY29ubiwgQUxXQVlTX1NFQ1VS RV9TRUFSQ0hfUEFUSF9TUUwpOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVT X1RVUExFU19PSykKKwl7CisJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGNsZWFyIHNlYXJj aF9wYXRoOiAlcyIsCisJCQkJCSBQUXJlc3VsdEVycm9yTWVzc2FnZShyZXMpKTsKKwkJaWYg KGV4aXRfb25fZXJyb3IpCisJCQlleGl0KDEpOworCisJCXJldHVybiBOVUxMOworCX0KKwlQ UWNsZWFyKHJlcyk7CisKKwlyZXR1cm4gY29ubjsKK30KKworLyoKKyAqIENsb3NlIHRoZSBj b25uZWN0aW9uLiBJZiBleGl0X29uX2Vycm9yIGlzIHRydWUsIGl0IGhhcyBhbiB1bmRlc2ly ZWQKKyAqIGNvbmRpdGlvbiBhbmQgaXQgc2hvdWxkIGV4aXQgaW1tZWRpYXRlbHkuCisgKi8K K3N0YXRpYyB2b2lkCitkaXNjb25uZWN0X2RhdGFiYXNlKFBHY29ubiAqY29ubiwgYm9vbCBl eGl0X29uX2Vycm9yKQoreworCUFzc2VydChjb25uICE9IE5VTEwpOworCisJUFFmaW5pc2go Y29ubik7CisKKwlpZiAoZXhpdF9vbl9lcnJvcikKKwkJZXhpdCgxKTsKK30KKworLyoKKyAq IE9idGFpbiB0aGUgc3lzdGVtIGlkZW50aWZpZXIgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbm5l Y3Rpb24uIEl0IHdpbGwgYmUgdXNlZAorICogdG8gY29tcGFyZSBpZiBhIGRhdGEgZGlyZWN0 b3J5IGlzIGEgY2xvbmUgb2YgYW5vdGhlciBvbmUuCisgKi8KK3N0YXRpYyB1aW50NjQKK2dl dF9wcmltYXJ5X3N5c2lkKGNvbnN0IGNoYXIgKmNvbm5pbmZvKQoreworCVBHY29ubgkgICAq Y29ubjsKKwlQR3Jlc3VsdCAgICpyZXM7CisJdWludDY0CQlzeXNpZDsKKworCXBnX2xvZ19p bmZvKCJnZXR0aW5nIHN5c3RlbSBpZGVudGlmaWVyIGZyb20gcHVibGlzaGVyIik7CisKKwlj b25uID0gY29ubmVjdF9kYXRhYmFzZShjb25uaW5mbywgdHJ1ZSk7CisKKwlyZXMgPSBQUWV4 ZWMoY29ubiwgIlNFTEVDVCBzeXN0ZW1faWRlbnRpZmllciBGUk9NIHBnX2NhdGFsb2cucGdf Y29udHJvbF9zeXN0ZW0oKSIpOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVT X1RVUExFU19PSykKKwl7CisJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGdldCBzeXN0ZW0g aWRlbnRpZmllcjogJXMiLAorCQkJCQkgUFFyZXN1bHRFcnJvck1lc3NhZ2UocmVzKSk7CisJ CWRpc2Nvbm5lY3RfZGF0YWJhc2UoY29ubiwgdHJ1ZSk7CisJfQorCWlmIChQUW50dXBsZXMo cmVzKSAhPSAxKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3QgZ2V0IHN5c3RlbSBp ZGVudGlmaWVyOiBnb3QgJWQgcm93cywgZXhwZWN0ZWQgJWQgcm93IiwKKwkJCQkJIFBRbnR1 cGxlcyhyZXMpLCAxKTsKKwkJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uLCB0cnVlKTsKKwl9 CisKKwlzeXNpZCA9IHN0cnRvdTY0KFBRZ2V0dmFsdWUocmVzLCAwLCAwKSwgTlVMTCwgMTAp OworCisJcGdfbG9nX2luZm8oInN5c3RlbSBpZGVudGlmaWVyIGlzICVsbHUgb24gcHVibGlz aGVyIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBzeXNpZCk7CisKKwlQUWNsZWFyKHJl cyk7CisJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uLCBmYWxzZSk7CisKKwlyZXR1cm4gc3lz aWQ7Cit9CisKKy8qCisgKiBPYnRhaW4gdGhlIHN5c3RlbSBpZGVudGlmaWVyIGZyb20gY29u dHJvbCBmaWxlLiBJdCB3aWxsIGJlIHVzZWQgdG8gY29tcGFyZQorICogaWYgYSBkYXRhIGRp cmVjdG9yeSBpcyBhIGNsb25lIG9mIGFub3RoZXIgb25lLiBUaGlzIHJvdXRpbmUgaXMgdXNl ZCBsb2NhbGx5CisgKiBhbmQgYXZvaWRzIGEgY29ubmVjdGlvbi4KKyAqLworc3RhdGljIHVp bnQ2NAorZ2V0X3N0YW5kYnlfc3lzaWQoY29uc3QgY2hhciAqZGF0YWRpcikKK3sKKwlDb250 cm9sRmlsZURhdGEgKmNmOworCWJvb2wJCWNyY19vazsKKwl1aW50NjQJCXN5c2lkOworCisJ cGdfbG9nX2luZm8oImdldHRpbmcgc3lzdGVtIGlkZW50aWZpZXIgZnJvbSBzdWJzY3JpYmVy Iik7CisKKwljZiA9IGdldF9jb250cm9sZmlsZShkYXRhZGlyLCAmY3JjX29rKTsKKwlpZiAo IWNyY19vaykKKwkJcGdfZmF0YWwoImNvbnRyb2wgZmlsZSBhcHBlYXJzIHRvIGJlIGNvcnJ1 cHQiKTsKKworCXN5c2lkID0gY2YtPnN5c3RlbV9pZGVudGlmaWVyOworCisJcGdfbG9nX2lu Zm8oInN5c3RlbSBpZGVudGlmaWVyIGlzICVsbHUgb24gc3Vic2NyaWJlciIsCisJCQkJKHVu c2lnbmVkIGxvbmcgbG9uZykgc3lzaWQpOworCisJcGdfZnJlZShjZik7CisKKwlyZXR1cm4g c3lzaWQ7Cit9CisKKy8qCisgKiBNb2RpZnkgdGhlIHN5c3RlbSBpZGVudGlmaWVyLiBTaW5j ZSBhIHN0YW5kYnkgc2VydmVyIHByZXNlcnZlcyB0aGUgc3lzdGVtCisgKiBpZGVudGlmaWVy LCBpdCBtYWtlcyBzZW5zZSB0byBjaGFuZ2UgaXQgdG8gYXZvaWQgc2l0dWF0aW9ucyBpbiB3 aGljaCBXQUwKKyAqIGZpbGVzIGZyb20gb25lIG9mIHRoZSBzeXN0ZW1zIG1pZ2h0IGJlIHVz ZWQgaW4gdGhlIG90aGVyIG9uZS4KKyAqLworc3RhdGljIHZvaWQKK21vZGlmeV9zdWJzY3Jp YmVyX3N5c2lkKGNvbnN0IGNoYXIgKnBnX3Jlc2V0d2FsX3BhdGgsIHN0cnVjdCBDcmVhdGVT dWJzY3JpYmVyT3B0aW9ucyAqb3B0KQoreworCUNvbnRyb2xGaWxlRGF0YSAqY2Y7CisJYm9v bAkJY3JjX29rOworCXN0cnVjdCB0aW1ldmFsIHR2OworCisJY2hhcgkgICAqY21kX3N0cjsK KworCXBnX2xvZ19pbmZvKCJtb2RpZnlpbmcgc3lzdGVtIGlkZW50aWZpZXIgZnJvbSBzdWJz Y3JpYmVyIik7CisKKwljZiA9IGdldF9jb250cm9sZmlsZShvcHQtPnN1YnNjcmliZXJfZGly LCAmY3JjX29rKTsKKwlpZiAoIWNyY19vaykKKwkJcGdfZmF0YWwoImNvbnRyb2wgZmlsZSBh cHBlYXJzIHRvIGJlIGNvcnJ1cHQiKTsKKworCS8qCisJICogU2VsZWN0IGEgbmV3IHN5c3Rl bSBpZGVudGlmaWVyLgorCSAqCisJICogWFhYIHRoaXMgY29kZSB3YXMgZXh0cmFjdGVkIGZy b20gQm9vdFN0cmFwWExPRygpLgorCSAqLworCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwor CWNmLT5zeXN0ZW1faWRlbnRpZmllciA9ICgodWludDY0KSB0di50dl9zZWMpIDw8IDMyOwor CWNmLT5zeXN0ZW1faWRlbnRpZmllciB8PSAoKHVpbnQ2NCkgdHYudHZfdXNlYykgPDwgMTI7 CisJY2YtPnN5c3RlbV9pZGVudGlmaWVyIHw9IGdldHBpZCgpICYgMHhGRkY7CisKKwlpZiAo IWRyeV9ydW4pCisJCXVwZGF0ZV9jb250cm9sZmlsZShvcHQtPnN1YnNjcmliZXJfZGlyLCBj ZiwgdHJ1ZSk7CisKKwlwZ19sb2dfaW5mbygic3lzdGVtIGlkZW50aWZpZXIgaXMgJWxsdSBv biBzdWJzY3JpYmVyIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBjZi0+c3lzdGVtX2lk ZW50aWZpZXIpOworCisJcGdfbG9nX2luZm8oInJ1bm5pbmcgcGdfcmVzZXR3YWwgb24gdGhl IHN1YnNjcmliZXIiKTsKKworCWNtZF9zdHIgPSBwc3ByaW50ZigiXCIlc1wiIC1EIFwiJXNc IiA+IFwiJXNcIiIsIHBnX3Jlc2V0d2FsX3BhdGgsCisJCQkJCSAgIG9wdC0+c3Vic2NyaWJl cl9kaXIsIERFVk5VTEwpOworCisJcGdfbG9nX2RlYnVnKCJjb21tYW5kIGlzOiAlcyIsIGNt ZF9zdHIpOworCisJaWYgKCFkcnlfcnVuKQorCXsKKwkJaW50CQkJcmMgPSBzeXN0ZW0oY21k X3N0cik7CisKKwkJaWYgKHJjID09IDApCisJCQlwZ19sb2dfaW5mbygic3Vic2NyaWJlciBz dWNjZXNzZnVsbHkgY2hhbmdlZCB0aGUgc3lzdGVtIGlkZW50aWZpZXIiKTsKKwkJZWxzZQor CQkJcGdfZmF0YWwoInN1YnNjcmliZXIgZmFpbGVkIHRvIGNoYW5nZSBzeXN0ZW0gaWRlbnRp ZmllcjogZXhpdCBjb2RlOiAlZCIsIHJjKTsKKwl9CisKKwlwZ19mcmVlKGNmKTsKK30KKwor LyoKKyAqIENyZWF0ZSB0aGUgcHVibGljYXRpb25zIGFuZCByZXBsaWNhdGlvbiBzbG90cyBp biBwcmVwYXJhdGlvbiBmb3IgbG9naWNhbAorICogcmVwbGljYXRpb24uCisgKi8KK3N0YXRp YyB2b2lkCitzZXR1cF9wdWJsaXNoZXIoc3RydWN0IExvZ2ljYWxSZXBJbmZvICpkYmluZm8p Cit7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZGJzOyBpKyspCisJeworCQlQR2Nvbm4J ICAgKmNvbm47CisJCVBHcmVzdWx0ICAgKnJlczsKKwkJY2hhcgkJcHVibmFtZVtOQU1FREFU QUxFTl07CisJCWNoYXIJCXJlcGxzbG90bmFtZVtOQU1FREFUQUxFTl07CisKKwkJY29ubiA9 IGNvbm5lY3RfZGF0YWJhc2UoZGJpbmZvW2ldLnB1YmNvbm5pbmZvLCB0cnVlKTsKKworCQly ZXMgPSBQUWV4ZWMoY29ubiwKKwkJCQkJICJTRUxFQ1Qgb2lkIEZST00gcGdfY2F0YWxvZy5w Z19kYXRhYmFzZSAiCisJCQkJCSAiV0hFUkUgZGF0bmFtZSA9IHBnX2NhdGFsb2cuY3VycmVu dF9kYXRhYmFzZSgpIik7CisJCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX1RV UExFU19PSykKKwkJeworCQkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3Qgb2J0YWluIGRhdGFi YXNlIE9JRDogJXMiLAorCQkJCQkJIFBRcmVzdWx0RXJyb3JNZXNzYWdlKHJlcykpOworCQkJ ZGlzY29ubmVjdF9kYXRhYmFzZShjb25uLCB0cnVlKTsKKwkJfQorCisJCWlmIChQUW50dXBs ZXMocmVzKSAhPSAxKQorCQl7CisJCQlwZ19sb2dfZXJyb3IoImNvdWxkIG5vdCBvYnRhaW4g ZGF0YWJhc2UgT0lEOiBnb3QgJWQgcm93cywgZXhwZWN0ZWQgJWQgcm93cyIsCisJCQkJCQkg UFFudHVwbGVzKHJlcyksIDEpOworCQkJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uLCB0cnVl KTsKKwkJfQorCisJCS8qIFJlbWVtYmVyIGRhdGFiYXNlIE9JRCAqLworCQlkYmluZm9baV0u b2lkID0gc3RydG91bChQUWdldHZhbHVlKHJlcywgMCwgMCksIE5VTEwsIDEwKTsKKworCQlQ UWNsZWFyKHJlcyk7CisKKwkJLyoKKwkJICogQnVpbGQgdGhlIHB1YmxpY2F0aW9uIG5hbWUu IFRoZSBuYW1lIG11c3Qgbm90IGV4Y2VlZCBOQU1FREFUQUxFTiAtCisJCSAqIDEuIFRoaXMg Y3VycmVudCBzY2hlbWEgdXNlcyBhIG1heGltdW0gb2YgMzEgY2hhcmFjdGVycyAoMjAgKyAx MCArCisJCSAqICdcMCcpLgorCQkgKi8KKwkJc25wcmludGYocHVibmFtZSwgc2l6ZW9mKHB1 Ym5hbWUpLCAicGdfY3JlYXRlc3Vic2NyaWJlcl8ldSIsCisJCQkJIGRiaW5mb1tpXS5vaWQp OworCQlkYmluZm9baV0ucHVibmFtZSA9IHBnX3N0cmR1cChwdWJuYW1lKTsKKworCQkvKgor CQkgKiBDcmVhdGUgcHVibGljYXRpb24gb24gcHVibGlzaGVyLiBUaGlzIHN0ZXAgc2hvdWxk IGJlIGV4ZWN1dGVkCisJCSAqICpiZWZvcmUqIHByb21vdGluZyB0aGUgc3Vic2NyaWJlciB0 byBhdm9pZCBhbnkgdHJhbnNhY3Rpb25zIGJldHdlZW4KKwkJICogY29uc2lzdGVudCBMU04g YW5kIHRoZSBuZXcgcHVibGljYXRpb24gcm93cyAoc3VjaCB0cmFuc2FjdGlvbnMKKwkJICog d291bGRuJ3Qgc2VlIHRoZSBuZXcgcHVibGljYXRpb24gcm93cyByZXN1bHRpbmcgaW4gYW4g ZXJyb3IpLgorCQkgKi8KKwkJY3JlYXRlX3B1YmxpY2F0aW9uKGNvbm4sICZkYmluZm9baV0p OworCisJCS8qCisJCSAqIEJ1aWxkIHRoZSByZXBsaWNhdGlvbiBzbG90IG5hbWUuIFRoZSBu YW1lIG11c3Qgbm90IGV4Y2VlZAorCQkgKiBOQU1FREFUQUxFTiAtIDEuIFRoaXMgY3VycmVu dCBzY2hlbWEgdXNlcyBhIG1heGltdW0gb2YgNDIKKwkJICogY2hhcmFjdGVycyAoMjAgKyAx MCArIDEgKyAxMCArICdcMCcpLiBQSUQgaXMgaW5jbHVkZWQgdG8gcmVkdWNlIHRoZQorCQkg KiBwcm9iYWJpbGl0eSBvZiBjb2xsaXNpb24uIEJ5IGRlZmF1bHQsIHN1YnNjcmlwdGlvbiBu YW1lIGlzIHVzZWQgYXMKKwkJICogcmVwbGljYXRpb24gc2xvdCBuYW1lLgorCQkgKi8KKwkJ c25wcmludGYocmVwbHNsb3RuYW1lLCBzaXplb2YocmVwbHNsb3RuYW1lKSwKKwkJCQkgInBn X2NyZWF0ZXN1YnNjcmliZXJfJXVfJWQiLAorCQkJCSBkYmluZm9baV0ub2lkLAorCQkJCSAo aW50KSBnZXRwaWQoKSk7CisJCWRiaW5mb1tpXS5zdWJuYW1lID0gcGdfc3RyZHVwKHJlcGxz bG90bmFtZSk7CisKKwkJLyogQ3JlYXRlIHJlcGxpY2F0aW9uIHNsb3Qgb24gcHVibGlzaGVy ICovCisJCWlmIChjcmVhdGVfbG9naWNhbF9yZXBsaWNhdGlvbl9zbG90KGNvbm4sICZkYmlu Zm9baV0sIGZhbHNlKSAhPSBOVUxMIHx8CisJCQlkcnlfcnVuKQorCQkJcGdfbG9nX2luZm8o ImNyZWF0ZSByZXBsaWNhdGlvbiBzbG90IFwiJXNcIiBvbiBwdWJsaXNoZXIiLAorCQkJCQkJ cmVwbHNsb3RuYW1lKTsKKwkJZWxzZQorCQkJZXhpdCgxKTsKKworCQlkaXNjb25uZWN0X2Rh dGFiYXNlKGNvbm4sIGZhbHNlKTsKKwl9Cit9CisKKy8qCisgKiBJcyByZWNvdmVyeSBzdGls bCBpbiBwcm9ncmVzcz8KKyAqLworc3RhdGljIGJvb2wKK3NlcnZlcl9pc19pbl9yZWNvdmVy eShQR2Nvbm4gKmNvbm4pCit7CisJUEdyZXN1bHQgICAqcmVzOworCWludAkJCXJldDsKKwor CXJlcyA9IFBRZXhlYyhjb25uLCAiU0VMRUNUIHBnX2NhdGFsb2cucGdfaXNfaW5fcmVjb3Zl cnkoKSIpOworCisJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfVFVQTEVTX09L KQorCXsKKwkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3Qgb2J0YWluIHJlY292ZXJ5IHByb2dy ZXNzOiAlcyIsCisJCQkJCSBQUXJlc3VsdEVycm9yTWVzc2FnZShyZXMpKTsKKwkJZGlzY29u bmVjdF9kYXRhYmFzZShjb25uLCB0cnVlKTsKKwl9CisKKworCXJldCA9IHN0cmNtcCgidCIs IFBRZ2V0dmFsdWUocmVzLCAwLCAwKSk7CisKKwlQUWNsZWFyKHJlcyk7CisKKwlyZXR1cm4g cmV0ID09IDA7Cit9CisKKy8qCisgKiBJcyB0aGUgcHJpbWFyeSBzZXJ2ZXIgcmVhZHkgZm9y IGxvZ2ljYWwgcmVwbGljYXRpb24/CisgKi8KK3N0YXRpYyB2b2lkCitjaGVja19wdWJsaXNo ZXIoc3RydWN0IExvZ2ljYWxSZXBJbmZvICpkYmluZm8pCit7CisJUEdjb25uCSAgICpjb25u OworCVBHcmVzdWx0ICAgKnJlczsKKworCWNoYXIJICAgKndhbF9sZXZlbDsKKwlpbnQJCQlt YXhfcmVwc2xvdHM7CisJaW50CQkJY3VyX3JlcHNsb3RzOworCWludAkJCW1heF93YWxzZW5k ZXJzOworCWludAkJCWN1cl93YWxzZW5kZXJzOworCisJcGdfbG9nX2luZm8oImNoZWNraW5n IHNldHRpbmdzIG9uIHB1Ymxpc2hlciIpOworCisJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2Uo ZGJpbmZvWzBdLnB1YmNvbm5pbmZvLCB0cnVlKTsKKworCS8qCisJICogSWYgdGhlIHByaW1h cnkgc2VydmVyIGlzIGluIHJlY292ZXJ5IChpLmUuIGNhc2NhZGluZyByZXBsaWNhdGlvbiks CisJICogb2JqZWN0cyAocHVibGljYXRpb24pIGNhbm5vdCBiZSBjcmVhdGVkIGJlY2F1c2Ug aXQgaXMgcmVhZCBvbmx5LgorCSAqLworCWlmIChzZXJ2ZXJfaXNfaW5fcmVjb3ZlcnkoY29u bikpCisJeworCQlwZ19sb2dfZXJyb3IoInByaW1hcnkgc2VydmVyIGNhbm5vdCBiZSBpbiBy ZWNvdmVyeSIpOworCQlkaXNjb25uZWN0X2RhdGFiYXNlKGNvbm4sIHRydWUpOworCX0KKwor CS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogTG9naWNhbCByZXBsaWNhdGlvbiByZXF1aXJl cyBhIGZldyBwYXJhbWV0ZXJzIHRvIGJlIHNldCBvbiBwdWJsaXNoZXIuCisJICogU2luY2Ug dGhlc2UgcGFyYW1ldGVycyBhcmUgbm90IGEgcmVxdWlyZW1lbnQgZm9yIHBoeXNpY2FsIHJl cGxpY2F0aW9uLAorCSAqIHdlIHNob3VsZCBjaGVjayBpdCB0byBtYWtlIHN1cmUgaXQgd29u J3QgZmFpbC4KKwkgKgorCSAqIC0gd2FsX2xldmVsID0gbG9naWNhbAorCSAqIC0gbWF4X3Jl cGxpY2F0aW9uX3Nsb3RzID49IGN1cnJlbnQgKyBudW1iZXIgb2YgZGJzIHRvIGJlIGNvbnZl cnRlZCArCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIHRlbXBvcmFyeSBs b2dpY2FsIHJlcGxpY2F0aW9uIHNsb3QKKwkgKiAtIG1heF93YWxfc2VuZGVycyA+PSBjdXJy ZW50ICsgbnVtYmVyIG9mIGRicyB0byBiZSBjb252ZXJ0ZWQKKwkgKiAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorCSAqLworCXJlcyA9IFBRZXhlYyhjb25uLAorCQkJCSAiV0lUSCB3bCBBUyAiCisJ CQkJICIoU0VMRUNUIHNldHRpbmcgQVMgd2FsbGV2ZWwgRlJPTSBwZ19jYXRhbG9nLnBnX3Nl dHRpbmdzICIKKwkJCQkgIldIRVJFIG5hbWUgPSAnd2FsX2xldmVsJyksICIKKwkJCQkgInRv dGFsX21ycyBBUyAiCisJCQkJICIoU0VMRUNUIHNldHRpbmcgQVMgdG1ycyBGUk9NIHBnX2Nh dGFsb2cucGdfc2V0dGluZ3MgIgorCQkJCSAiV0hFUkUgbmFtZSA9ICdtYXhfcmVwbGljYXRp b25fc2xvdHMnKSwgIgorCQkJCSAiY3VyX21ycyBBUyAiCisJCQkJICIoU0VMRUNUIGNvdW50 KCopIEFTIGNtcnMgIgorCQkJCSAiRlJPTSBwZ19jYXRhbG9nLnBnX3JlcGxpY2F0aW9uX3Ns b3RzKSwgIgorCQkJCSAidG90YWxfbXdzIEFTICIKKwkJCQkgIihTRUxFQ1Qgc2V0dGluZyBB UyB0bXdzIEZST00gcGdfY2F0YWxvZy5wZ19zZXR0aW5ncyAiCisJCQkJICJXSEVSRSBuYW1l ID0gJ21heF93YWxfc2VuZGVycycpLCAiCisJCQkJICJjdXJfbXdzIEFTICIKKwkJCQkgIihT RUxFQ1QgY291bnQoKikgQVMgY213cyBGUk9NIHBnX2NhdGFsb2cucGdfc3RhdF9hY3Rpdml0 eSAiCisJCQkJICJXSEVSRSBiYWNrZW5kX3R5cGUgPSAnd2Fsc2VuZGVyJykgIgorCQkJCSAi U0VMRUNUIHdhbGxldmVsLCB0bXJzLCBjbXJzLCB0bXdzLCBjbXdzICIKKwkJCQkgIkZST00g d2wsIHRvdGFsX21ycywgY3VyX21ycywgdG90YWxfbXdzLCBjdXJfbXdzIik7CisKKwlpZiAo UFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19UVVBMRVNfT0spCisJeworCQlwZ19sb2df ZXJyb3IoImNvdWxkIG5vdCBvYnRhaW4gcHVibGlzaGVyIHNldHRpbmdzOiAlcyIsCisJCQkJ CSBQUXJlc3VsdEVycm9yTWVzc2FnZShyZXMpKTsKKwkJZGlzY29ubmVjdF9kYXRhYmFzZShj b25uLCB0cnVlKTsKKwl9CisKKwl3YWxfbGV2ZWwgPSBzdHJkdXAoUFFnZXR2YWx1ZShyZXMs IDAsIDApKTsKKwltYXhfcmVwc2xvdHMgPSBhdG9pKFBRZ2V0dmFsdWUocmVzLCAwLCAxKSk7 CisJY3VyX3JlcHNsb3RzID0gYXRvaShQUWdldHZhbHVlKHJlcywgMCwgMikpOworCW1heF93 YWxzZW5kZXJzID0gYXRvaShQUWdldHZhbHVlKHJlcywgMCwgMykpOworCWN1cl93YWxzZW5k ZXJzID0gYXRvaShQUWdldHZhbHVlKHJlcywgMCwgNCkpOworCisJUFFjbGVhcihyZXMpOwor CisJcGdfbG9nX2RlYnVnKCJwdWJsaXNoZXI6IHdhbF9sZXZlbDogJXMiLCB3YWxfbGV2ZWwp OworCXBnX2xvZ19kZWJ1ZygicHVibGlzaGVyOiBtYXhfcmVwbGljYXRpb25fc2xvdHM6ICVk IiwgbWF4X3JlcHNsb3RzKTsKKwlwZ19sb2dfZGVidWcoInB1Ymxpc2hlcjogY3VycmVudCBy ZXBsaWNhdGlvbiBzbG90czogJWQiLCBjdXJfcmVwc2xvdHMpOworCXBnX2xvZ19kZWJ1Zygi cHVibGlzaGVyOiBtYXhfd2FsX3NlbmRlcnM6ICVkIiwgbWF4X3dhbHNlbmRlcnMpOworCXBn X2xvZ19kZWJ1ZygicHVibGlzaGVyOiBjdXJyZW50IHdhbCBzZW5kZXJzOiAlZCIsIGN1cl93 YWxzZW5kZXJzKTsKKworCS8qCisJICogSWYgc3RhbmRieSBzZXRzIHByaW1hcnlfc2xvdF9u YW1lLCBjaGVjayBpZiB0aGlzIHJlcGxpY2F0aW9uIHNsb3QgaXMgaW4KKwkgKiB1c2Ugb24g cHJpbWFyeSBmb3IgV0FMIHJldGVudGlvbiBwdXJwb3Nlcy4gVGhpcyByZXBsaWNhdGlvbiBz bG90IGhhcyBubworCSAqIHVzZSBhZnRlciB0aGUgdHJhbnNmb3JtYXRpb24sIGhlbmNlLCBp dCB3aWxsIGJlIHJlbW92ZWQgYXQgdGhlIGVuZCBvZgorCSAqIHRoaXMgcHJvY2Vzcy4KKwkg Ki8KKwlpZiAocHJpbWFyeV9zbG90X25hbWUpCisJeworCQlQUUV4cEJ1ZmZlciBzdHIgPSBj cmVhdGVQUUV4cEJ1ZmZlcigpOworCisJCWFwcGVuZFBRRXhwQnVmZmVyKHN0ciwKKwkJCQkJ CSAgIlNFTEVDVCAxIEZST00gcGdfY2F0YWxvZy5wZ19yZXBsaWNhdGlvbl9zbG90cyAiCisJ CQkJCQkgICJXSEVSRSBhY3RpdmUgQU5EIHNsb3RfbmFtZSA9ICclcyciLAorCQkJCQkJICBw cmltYXJ5X3Nsb3RfbmFtZSk7CisKKwkJcGdfbG9nX2RlYnVnKCJjb21tYW5kIGlzOiAlcyIs IHN0ci0+ZGF0YSk7CisKKwkJcmVzID0gUFFleGVjKGNvbm4sIHN0ci0+ZGF0YSk7CisJCWlm IChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX1RVUExFU19PSykKKwkJeworCQkJcGdf bG9nX2Vycm9yKCJjb3VsZCBub3Qgb2J0YWluIHJlcGxpY2F0aW9uIHNsb3QgaW5mb3JtYXRp b246ICVzIiwKKwkJCQkJCSBQUXJlc3VsdEVycm9yTWVzc2FnZShyZXMpKTsKKwkJCWRpc2Nv bm5lY3RfZGF0YWJhc2UoY29ubiwgdHJ1ZSk7CisJCX0KKworCQlpZiAoUFFudHVwbGVzKHJl cykgIT0gMSkKKwkJeworCQkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3Qgb2J0YWluIHJlcGxp Y2F0aW9uIHNsb3QgaW5mb3JtYXRpb246IGdvdCAlZCByb3dzLCBleHBlY3RlZCAlZCByb3ci LAorCQkJCQkJIFBRbnR1cGxlcyhyZXMpLCAxKTsKKwkJCWRpc2Nvbm5lY3RfZGF0YWJhc2Uo Y29ubiwgdHJ1ZSk7CisJCX0KKwkJZWxzZQorCQkJcGdfbG9nX2luZm8oInByaW1hcnkgaGFz IHJlcGxpY2F0aW9uIHNsb3QgXCIlc1wiIiwKKwkJCQkJCXByaW1hcnlfc2xvdF9uYW1lKTsK KworCQlQUWNsZWFyKHJlcyk7CisJfQorCisJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uLCBm YWxzZSk7CisKKwlpZiAoc3RyY21wKHdhbF9sZXZlbCwgImxvZ2ljYWwiKSAhPSAwKQorCQlw Z19mYXRhbCgicHVibGlzaGVyIHJlcXVpcmVzIHdhbF9sZXZlbCA+PSBsb2dpY2FsIik7CisK KwkvKiBPbmUgYWRkaXRpb25hbCB0ZW1wb3JhcnkgbG9naWNhbCByZXBsaWNhdGlvbiBzbG90 ICovCisJaWYgKG1heF9yZXBzbG90cyAtIGN1cl9yZXBzbG90cyA8IG51bV9kYnMgKyAxKQor CXsKKwkJcGdfbG9nX2Vycm9yKCJwdWJsaXNoZXIgcmVxdWlyZXMgJWQgcmVwbGljYXRpb24g c2xvdHMsIGJ1dCBvbmx5ICVkIHJlbWFpbiIsCisJCQkJCSBudW1fZGJzICsgMSwgbWF4X3Jl cHNsb3RzIC0gY3VyX3JlcHNsb3RzKTsKKwkJcGdfbG9nX2Vycm9yX2hpbnQoIkNvbnNpZGVy IGluY3JlYXNpbmcgbWF4X3JlcGxpY2F0aW9uX3Nsb3RzIHRvIGF0IGxlYXN0ICVkLiIsCisJ CQkJCQkgIGN1cl9yZXBzbG90cyArIG51bV9kYnMgKyAxKTsKKwkJZXhpdCgxKTsKKwl9CisK KwlpZiAobWF4X3dhbHNlbmRlcnMgLSBjdXJfd2Fsc2VuZGVycyA8IG51bV9kYnMpCisJewor CQlwZ19sb2dfZXJyb3IoInB1Ymxpc2hlciByZXF1aXJlcyAlZCB3YWwgc2VuZGVyIHByb2Nl c3NlcywgYnV0IG9ubHkgJWQgcmVtYWluIiwKKwkJCQkJIG51bV9kYnMsIG1heF93YWxzZW5k ZXJzIC0gY3VyX3dhbHNlbmRlcnMpOworCQlwZ19sb2dfZXJyb3JfaGludCgiQ29uc2lkZXIg aW5jcmVhc2luZyBtYXhfd2FsX3NlbmRlcnMgdG8gYXQgbGVhc3QgJWQuIiwKKwkJCQkJCSAg Y3VyX3dhbHNlbmRlcnMgKyBudW1fZGJzKTsKKwkJZXhpdCgxKTsKKwl9Cit9CisKKy8qCisg KiBJcyB0aGUgc3RhbmRieSBzZXJ2ZXIgcmVhZHkgZm9yIGxvZ2ljYWwgcmVwbGljYXRpb24/ CisgKi8KK3N0YXRpYyB2b2lkCitjaGVja19zdWJzY3JpYmVyKHN0cnVjdCBMb2dpY2FsUmVw SW5mbyAqZGJpbmZvKQoreworCVBHY29ubgkgICAqY29ubjsKKwlQR3Jlc3VsdCAgICpyZXM7 CisJUFFFeHBCdWZmZXIgc3RyID0gY3JlYXRlUFFFeHBCdWZmZXIoKTsKKworCWludAkJCW1h eF9scndvcmtlcnM7CisJaW50CQkJbWF4X3JlcHNsb3RzOworCWludAkJCW1heF93cHJvY3M7 CisKKwlwZ19sb2dfaW5mbygiY2hlY2tpbmcgc2V0dGluZ3Mgb24gc3Vic2NyaWJlciIpOwor CisJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoZGJpbmZvWzBdLnN1YmNvbm5pbmZvLCB0cnVl KTsKKworCS8qIFRoZSB0YXJnZXQgc2VydmVyIG11c3QgYmUgYSBzdGFuZGJ5ICovCisJaWYg KCFzZXJ2ZXJfaXNfaW5fcmVjb3ZlcnkoY29ubikpCisJeworCQlwZ19sb2dfZXJyb3IoIlRo ZSB0YXJnZXQgc2VydmVyIG11c3QgYmUgYSBzdGFuZGJ5Iik7CisJCWRpc2Nvbm5lY3RfZGF0 YWJhc2UoY29ubiwgdHJ1ZSk7CisJfQorCisJLyoKKwkgKiBTdWJzY3JpcHRpb25zIGNhbiBv bmx5IGJlIGNyZWF0ZWQgYnkgcm9sZXMgdGhhdCBoYXZlIHRoZSBwcml2aWxlZ2VzIG9mCisJ ICogcGdfY3JlYXRlX3N1YnNjcmlwdGlvbiByb2xlIGFuZCBDUkVBVEUgcHJpdmlsZWdlcyBv biB0aGUgc3BlY2lmaWVkCisJICogZGF0YWJhc2UuCisJICovCisJYXBwZW5kUFFFeHBCdWZm ZXIoc3RyLAorCQkJCQkgICJTRUxFQ1QgcGdfY2F0YWxvZy5wZ19oYXNfcm9sZShjdXJyZW50 X3VzZXIsICV1LCAnTUVNQkVSJyksICIKKwkJCQkJICAicGdfY2F0YWxvZy5oYXNfZGF0YWJh c2VfcHJpdmlsZWdlKGN1cnJlbnRfdXNlciwgJyVzJywgJ0NSRUFURScpLCAiCisJCQkJCSAg InBnX2NhdGFsb2cuaGFzX2Z1bmN0aW9uX3ByaXZpbGVnZShjdXJyZW50X3VzZXIsICdwZ19j YXRhbG9nLnBnX3JlcGxpY2F0aW9uX29yaWdpbl9hZHZhbmNlKHRleHQsIHBnX2xzbiknLCAn RVhFQ1VURScpIiwKKwkJCQkJICBST0xFX1BHX0NSRUFURV9TVUJTQ1JJUFRJT04sIGRiaW5m b1swXS5kYm5hbWUpOworCisJcGdfbG9nX2RlYnVnKCJjb21tYW5kIGlzOiAlcyIsIHN0ci0+ ZGF0YSk7CisKKwlyZXMgPSBQUWV4ZWMoY29ubiwgc3RyLT5kYXRhKTsKKworCWlmIChQUXJl c3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX1RVUExFU19PSykKKwl7CisJCXBnX2xvZ19lcnJv cigiY291bGQgbm90IG9idGFpbiBhY2Nlc3MgcHJpdmlsZWdlIGluZm9ybWF0aW9uOiAlcyIs CisJCQkJCSBQUXJlc3VsdEVycm9yTWVzc2FnZShyZXMpKTsKKwkJZGlzY29ubmVjdF9kYXRh YmFzZShjb25uLCB0cnVlKTsKKwl9CisKKwlpZiAoc3RyY21wKFBRZ2V0dmFsdWUocmVzLCAw LCAwKSwgInQiKSAhPSAwKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJwZXJtaXNzaW9uIGRlbmll ZCB0byBjcmVhdGUgc3Vic2NyaXB0aW9uIik7CisJCXBnX2xvZ19lcnJvcl9oaW50KCJPbmx5 IHJvbGVzIHdpdGggcHJpdmlsZWdlcyBvZiB0aGUgXCIlc1wiIHJvbGUgbWF5IGNyZWF0ZSBz dWJzY3JpcHRpb25zLiIsCisJCQkJCQkgICJwZ19jcmVhdGVfc3Vic2NyaXB0aW9uIik7CisJ CWRpc2Nvbm5lY3RfZGF0YWJhc2UoY29ubiwgdHJ1ZSk7CisJfQorCWlmIChzdHJjbXAoUFFn ZXR2YWx1ZShyZXMsIDAsIDEpLCAidCIpICE9IDApCisJeworCQlwZ19sb2dfZXJyb3IoInBl cm1pc3Npb24gZGVuaWVkIGZvciBkYXRhYmFzZSAlcyIsIGRiaW5mb1swXS5kYm5hbWUpOwor CQlkaXNjb25uZWN0X2RhdGFiYXNlKGNvbm4sIHRydWUpOworCX0KKwlpZiAoc3RyY21wKFBR Z2V0dmFsdWUocmVzLCAwLCAyKSwgInQiKSAhPSAwKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJw ZXJtaXNzaW9uIGRlbmllZCBmb3IgZnVuY3Rpb24gXCIlc1wiIiwKKwkJCQkJICJwZ19jYXRh bG9nLnBnX3JlcGxpY2F0aW9uX29yaWdpbl9hZHZhbmNlKHRleHQsIHBnX2xzbikiKTsKKwkJ ZGlzY29ubmVjdF9kYXRhYmFzZShjb25uLCB0cnVlKTsKKwl9CisKKwlkZXN0cm95UFFFeHBC dWZmZXIoc3RyKTsKKwlQUWNsZWFyKHJlcyk7CisKKwkvKi0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor CSAqIExvZ2ljYWwgcmVwbGljYXRpb24gcmVxdWlyZXMgYSBmZXcgcGFyYW1ldGVycyB0byBi ZSBzZXQgb24gc3Vic2NyaWJlci4KKwkgKiBTaW5jZSB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBu b3QgYSByZXF1aXJlbWVudCBmb3IgcGh5c2ljYWwgcmVwbGljYXRpb24sCisJICogd2Ugc2hv dWxkIGNoZWNrIGl0IHRvIG1ha2Ugc3VyZSBpdCB3b24ndCBmYWlsLgorCSAqCisJICogLSBt YXhfcmVwbGljYXRpb25fc2xvdHMgPj0gbnVtYmVyIG9mIGRicyB0byBiZSBjb252ZXJ0ZWQK KwkgKiAtIG1heF9sb2dpY2FsX3JlcGxpY2F0aW9uX3dvcmtlcnMgPj0gbnVtYmVyIG9mIGRi cyB0byBiZSBjb252ZXJ0ZWQKKwkgKiAtIG1heF93b3JrZXJfcHJvY2Vzc2VzID49IDEgKyBu dW1iZXIgb2YgZGJzIHRvIGJlIGNvbnZlcnRlZAorCSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJ ICovCisJcmVzID0gUFFleGVjKGNvbm4sCisJCQkJICJTRUxFQ1Qgc2V0dGluZyBGUk9NIHBn X2NhdGFsb2cucGdfc2V0dGluZ3MgV0hFUkUgbmFtZSBJTiAoIgorCQkJCSAiJ21heF9sb2dp Y2FsX3JlcGxpY2F0aW9uX3dvcmtlcnMnLCAiCisJCQkJICInbWF4X3JlcGxpY2F0aW9uX3Ns b3RzJywgIgorCQkJCSAiJ21heF93b3JrZXJfcHJvY2Vzc2VzJywgIgorCQkJCSAiJ3ByaW1h cnlfc2xvdF9uYW1lJykgIgorCQkJCSAiT1JERVIgQlkgbmFtZSIpOworCisJaWYgKFBRcmVz dWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfVFVQTEVTX09LKQorCXsKKwkJcGdfbG9nX2Vycm9y KCJjb3VsZCBub3Qgb2J0YWluIHN1YnNjcmliZXIgc2V0dGluZ3M6ICVzIiwKKwkJCQkJIFBR cmVzdWx0RXJyb3JNZXNzYWdlKHJlcykpOworCQlkaXNjb25uZWN0X2RhdGFiYXNlKGNvbm4s IHRydWUpOworCX0KKworCW1heF9scndvcmtlcnMgPSBhdG9pKFBRZ2V0dmFsdWUocmVzLCAw LCAwKSk7CisJbWF4X3JlcHNsb3RzID0gYXRvaShQUWdldHZhbHVlKHJlcywgMSwgMCkpOwor CW1heF93cHJvY3MgPSBhdG9pKFBRZ2V0dmFsdWUocmVzLCAyLCAwKSk7CisJaWYgKHN0cmNt cChQUWdldHZhbHVlKHJlcywgMywgMCksICIiKSAhPSAwKQorCQlwcmltYXJ5X3Nsb3RfbmFt ZSA9IHBnX3N0cmR1cChQUWdldHZhbHVlKHJlcywgMywgMCkpOworCisJcGdfbG9nX2RlYnVn KCJzdWJzY3JpYmVyOiBtYXhfbG9naWNhbF9yZXBsaWNhdGlvbl93b3JrZXJzOiAlZCIsCisJ CQkJIG1heF9scndvcmtlcnMpOworCXBnX2xvZ19kZWJ1Zygic3Vic2NyaWJlcjogbWF4X3Jl cGxpY2F0aW9uX3Nsb3RzOiAlZCIsIG1heF9yZXBzbG90cyk7CisJcGdfbG9nX2RlYnVnKCJz dWJzY3JpYmVyOiBtYXhfd29ya2VyX3Byb2Nlc3NlczogJWQiLCBtYXhfd3Byb2NzKTsKKwlp ZiAocHJpbWFyeV9zbG90X25hbWUpCisJCXBnX2xvZ19kZWJ1Zygic3Vic2NyaWJlcjogcHJp bWFyeV9zbG90X25hbWU6ICVzIiwgcHJpbWFyeV9zbG90X25hbWUpOworCisJUFFjbGVhcihy ZXMpOworCisJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uLCBmYWxzZSk7CisKKwlpZiAobWF4 X3JlcHNsb3RzIDwgbnVtX2RicykKKwl7CisJCXBnX2xvZ19lcnJvcigic3Vic2NyaWJlciBy ZXF1aXJlcyAlZCByZXBsaWNhdGlvbiBzbG90cywgYnV0IG9ubHkgJWQgcmVtYWluIiwKKwkJ CQkJIG51bV9kYnMsIG1heF9yZXBzbG90cyk7CisJCXBnX2xvZ19lcnJvcl9oaW50KCJDb25z aWRlciBpbmNyZWFzaW5nIG1heF9yZXBsaWNhdGlvbl9zbG90cyB0byBhdCBsZWFzdCAlZC4i LAorCQkJCQkJICBudW1fZGJzKTsKKwkJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uLCB0cnVl KTsKKwl9CisKKwlpZiAobWF4X2xyd29ya2VycyA8IG51bV9kYnMpCisJeworCQlwZ19sb2df ZXJyb3IoInN1YnNjcmliZXIgcmVxdWlyZXMgJWQgbG9naWNhbCByZXBsaWNhdGlvbiB3b3Jr ZXJzLCBidXQgb25seSAlZCByZW1haW4iLAorCQkJCQkgbnVtX2RicywgbWF4X2xyd29ya2Vy cyk7CisJCXBnX2xvZ19lcnJvcl9oaW50KCJDb25zaWRlciBpbmNyZWFzaW5nIG1heF9sb2dp Y2FsX3JlcGxpY2F0aW9uX3dvcmtlcnMgdG8gYXQgbGVhc3QgJWQuIiwKKwkJCQkJCSAgbnVt X2Ricyk7CisJCWRpc2Nvbm5lY3RfZGF0YWJhc2UoY29ubiwgdHJ1ZSk7CisJfQorCisJaWYg KG1heF93cHJvY3MgPCBudW1fZGJzICsgMSkKKwl7CisJCXBnX2xvZ19lcnJvcigic3Vic2Ny aWJlciByZXF1aXJlcyAlZCB3b3JrZXIgcHJvY2Vzc2VzLCBidXQgb25seSAlZCByZW1haW4i LAorCQkJCQkgbnVtX2RicyArIDEsIG1heF93cHJvY3MpOworCQlwZ19sb2dfZXJyb3JfaGlu dCgiQ29uc2lkZXIgaW5jcmVhc2luZyBtYXhfd29ya2VyX3Byb2Nlc3NlcyB0byBhdCBsZWFz dCAlZC4iLAorCQkJCQkJICBudW1fZGJzICsgMSk7CisJCWRpc2Nvbm5lY3RfZGF0YWJhc2Uo Y29ubiwgdHJ1ZSk7CisJfQorfQorCisvKgorICogQ3JlYXRlIHRoZSBzdWJzY3JpcHRpb25z LCBhZGp1c3QgdGhlIGluaXRpYWwgbG9jYXRpb24gZm9yIGxvZ2ljYWwKKyAqIHJlcGxpY2F0 aW9uIGFuZCBlbmFibGUgdGhlIHN1YnNjcmlwdGlvbnMuIFRoYXQncyB0aGUgbGFzdCBzdGVw IGZvciBsb2dpY2FsCisgKiByZXBsaWF0aW9uIHNldHVwLgorICovCitzdGF0aWMgdm9pZAor c2V0dXBfc3Vic2NyaWJlcihzdHJ1Y3QgTG9naWNhbFJlcEluZm8gKmRiaW5mbywgY29uc3Qg Y2hhciAqY29uc2lzdGVudF9sc24pCit7CisJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZGJz OyBpKyspCisJeworCQlQR2Nvbm4JICAgKmNvbm47CisKKwkJLyogQ29ubmVjdCB0byBzdWJz Y3JpYmVyLiAqLworCQljb25uID0gY29ubmVjdF9kYXRhYmFzZShkYmluZm9baV0uc3ViY29u bmluZm8sIHRydWUpOworCisJCS8qCisJCSAqIFNpbmNlIHRoZSBwdWJsaWNhdGlvbiB3YXMg Y3JlYXRlZCBiZWZvcmUgdGhlIGNvbnNpc3RlbnQgTFNOLCBpdCBpcworCQkgKiBhdmFpbGFi bGUgb24gdGhlIHN1YnNjcmliZXIgd2hlbiB0aGUgcGh5c2ljYWwgcmVwbGljYSBpcyBwcm9t b3RlZC4KKwkJICogUmVtb3ZlIHB1YmxpY2F0aW9ucyBmcm9tIHRoZSBzdWJzY3JpYmVyIGJl Y2F1c2UgaXQgaGFzIG5vIHVzZS4KKwkJICovCisJCWRyb3BfcHVibGljYXRpb24oY29ubiwg JmRiaW5mb1tpXSk7CisKKwkJY3JlYXRlX3N1YnNjcmlwdGlvbihjb25uLCAmZGJpbmZvW2ld KTsKKworCQkvKiBTZXQgdGhlIHJlcGxpY2F0aW9uIHByb2dyZXNzIHRvIHRoZSBjb3JyZWN0 IExTTiAqLworCQlzZXRfcmVwbGljYXRpb25fcHJvZ3Jlc3MoY29ubiwgJmRiaW5mb1tpXSwg Y29uc2lzdGVudF9sc24pOworCisJCS8qIEVuYWJsZSBzdWJzY3JpcHRpb24gKi8KKwkJZW5h YmxlX3N1YnNjcmlwdGlvbihjb25uLCAmZGJpbmZvW2ldKTsKKworCQlkaXNjb25uZWN0X2Rh dGFiYXNlKGNvbm4sIGZhbHNlKTsKKwl9Cit9CisKKy8qCisgKiBDcmVhdGUgYSBsb2dpY2Fs IHJlcGxpY2F0aW9uIHNsb3QgYW5kIHJldHVybnMgYSBMU04uCisgKgorICogQ3JlYXRlUmVw bGljYXRpb25TbG90KCkgaXMgbm90IHVzZWQgYmVjYXVzZSBpdCBkb2VzIG5vdCBwcm92aWRl IHRoZSBvbmUtcm93CisgKiByZXN1bHQgc2V0IHRoYXQgY29udGFpbnMgdGhlIExTTi4KKyAq Lworc3RhdGljIGNoYXIgKgorY3JlYXRlX2xvZ2ljYWxfcmVwbGljYXRpb25fc2xvdChQR2Nv bm4gKmNvbm4sIHN0cnVjdCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvLAorCQkJCQkJCQlib29s IHRlbXBvcmFyeSkKK3sKKwlQUUV4cEJ1ZmZlciBzdHIgPSBjcmVhdGVQUUV4cEJ1ZmZlcigp OworCVBHcmVzdWx0ICAgKnJlcyA9IE5VTEw7CisJY2hhcgkJc2xvdF9uYW1lW05BTUVEQVRB TEVOXTsKKwljaGFyCSAgICpsc24gPSBOVUxMOworCisJQXNzZXJ0KGNvbm4gIT0gTlVMTCk7 CisKKwkvKiBUaGlzIHRlbXBvcmFyeSByZXBsaWNhdGlvbiBzbG90IGlzIG9ubHkgdXNlZCBm b3IgY2F0Y2h1cCBwdXJwb3NlcyAqLworCWlmICh0ZW1wb3JhcnkpCisJeworCQlzbnByaW50 ZihzbG90X25hbWUsIE5BTUVEQVRBTEVOLCAicGdfY3JlYXRlc3Vic2NyaWJlcl8lZF9zdGFy dHBvaW50IiwKKwkJCQkgKGludCkgZ2V0cGlkKCkpOworCX0KKwllbHNlCisJCXNucHJpbnRm KHNsb3RfbmFtZSwgTkFNRURBVEFMRU4sICIlcyIsIGRiaW5mby0+c3VibmFtZSk7CisKKwlw Z19sb2dfaW5mbygiY3JlYXRpbmcgdGhlIHJlcGxpY2F0aW9uIHNsb3QgXCIlc1wiIG9uIGRh dGFiYXNlIFwiJXNcIiIsCisJCQkJc2xvdF9uYW1lLCBkYmluZm8tPmRibmFtZSk7CisKKwlh cHBlbmRQUUV4cEJ1ZmZlcihzdHIsCisJCQkJCSAgIlNFTEVDVCBsc24gRlJPTSBwZ19jYXRh bG9nLnBnX2NyZWF0ZV9sb2dpY2FsX3JlcGxpY2F0aW9uX3Nsb3QoJyVzJywgJyVzJywgJXMs IGZhbHNlLCBmYWxzZSkiLAorCQkJCQkgIHNsb3RfbmFtZSwgInBnb3V0cHV0IiwgdGVtcG9y YXJ5ID8gInRydWUiIDogImZhbHNlIik7CisKKwlwZ19sb2dfZGVidWcoImNvbW1hbmQgaXM6 ICVzIiwgc3RyLT5kYXRhKTsKKworCWlmICghZHJ5X3J1bikKKwl7CisJCXJlcyA9IFBRZXhl Yyhjb25uLCBzdHItPmRhdGEpOworCQlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JF U19UVVBMRVNfT0spCisJCXsKKwkJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGNyZWF0ZSBy ZXBsaWNhdGlvbiBzbG90IFwiJXNcIiBvbiBkYXRhYmFzZSBcIiVzXCI6ICVzIiwKKwkJCQkJ CSBzbG90X25hbWUsIGRiaW5mby0+ZGJuYW1lLAorCQkJCQkJIFBRcmVzdWx0RXJyb3JNZXNz YWdlKHJlcykpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlsc24gPSBwZ19zdHJkdXAo UFFnZXR2YWx1ZShyZXMsIDAsIDApKTsKKwkJUFFjbGVhcihyZXMpOworCX0KKworCS8qIEZv ciBjbGVhbnVwIHB1cnBvc2VzICovCisJaWYgKCF0ZW1wb3JhcnkpCisJCWRiaW5mby0+bWFk ZV9yZXBsc2xvdCA9IHRydWU7CisKKwlkZXN0cm95UFFFeHBCdWZmZXIoc3RyKTsKKworCXJl dHVybiBsc247Cit9CisKK3N0YXRpYyB2b2lkCitkcm9wX3JlcGxpY2F0aW9uX3Nsb3QoUEdj b25uICpjb25uLCBzdHJ1Y3QgTG9naWNhbFJlcEluZm8gKmRiaW5mbywKKwkJCQkJICBjb25z dCBjaGFyICpzbG90X25hbWUpCit7CisJUFFFeHBCdWZmZXIgc3RyID0gY3JlYXRlUFFFeHBC dWZmZXIoKTsKKwlQR3Jlc3VsdCAgICpyZXM7CisKKwlBc3NlcnQoY29ubiAhPSBOVUxMKTsK KworCXBnX2xvZ19pbmZvKCJkcm9wcGluZyB0aGUgcmVwbGljYXRpb24gc2xvdCBcIiVzXCIg b24gZGF0YWJhc2UgXCIlc1wiIiwKKwkJCQlzbG90X25hbWUsIGRiaW5mby0+ZGJuYW1lKTsK KworCWFwcGVuZFBRRXhwQnVmZmVyKHN0ciwgIlNFTEVDVCBwZ19jYXRhbG9nLnBnX2Ryb3Bf cmVwbGljYXRpb25fc2xvdCgnJXMnKSIsIHNsb3RfbmFtZSk7CisKKwlwZ19sb2dfZGVidWco ImNvbW1hbmQgaXM6ICVzIiwgc3RyLT5kYXRhKTsKKworCWlmICghZHJ5X3J1bikKKwl7CisJ CXJlcyA9IFBRZXhlYyhjb25uLCBzdHItPmRhdGEpOworCQlpZiAoUFFyZXN1bHRTdGF0dXMo cmVzKSAhPSBQR1JFU19UVVBMRVNfT0spCisJCXsKKwkJCXBnX2xvZ19lcnJvcigiY291bGQg bm90IGRyb3AgcmVwbGljYXRpb24gc2xvdCBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiOiAl cyIsCisJCQkJCQkgc2xvdF9uYW1lLCBkYmluZm8tPmRibmFtZSwgUFFyZXN1bHRFcnJvck1l c3NhZ2UocmVzKSk7CisJCQlkYmluZm8tPm1hZGVfcmVwbHNsb3QgPSBmYWxzZTsJLyogZG9u J3QgdHJ5IGFnYWluLiAqLworCQl9CisKKwkJUFFjbGVhcihyZXMpOworCX0KKworCWRlc3Ry b3lQUUV4cEJ1ZmZlcihzdHIpOworfQorCisvKgorICogQ3JlYXRlIGEgZGlyZWN0b3J5IHRv IHN0b3JlIGFueSBsb2cgaW5mb3JtYXRpb24uIEFkanVzdCB0aGUgcGVybWlzc2lvbnMuCisg KiBSZXR1cm4gYSBmaWxlIG5hbWUgKGZ1bGwgcGF0aCkgdGhhdCdzIHVzZWQgYnkgdGhlIHN0 YW5kYnkgc2VydmVyIHdoZW4gaXQKKyAqIHN0YXJ0cyB0aGUgdHJhbnNmb3JtYXRpb24uCisg KiBJbiBkcnkgcnVuIG1vZGUsIGRvZXNuJ3QgY3JlYXRlIHRoZSBCQVNFX09VVFBVVF9ESVIg ZGlyZWN0b3J5LCBpbnN0ZWFkCisgKiByZXR1cm5zIHRoZSBmdWxsIGxvZyBmaWxlIHBhdGgu CisgKi8KK3N0YXRpYyBjaGFyICoKK3NldHVwX3NlcnZlcl9sb2dmaWxlKGNvbnN0IGNoYXIg KmRhdGFkaXIpCit7CisJY2hhcgkJdGltZWJ1ZlsxMjhdOworCXN0cnVjdCB0aW1ldmFsIHRp bWU7CisJdGltZV90CQl0dDsKKwlpbnQJCQlsZW47CisJY2hhcgkgICAqYmFzZV9kaXI7CisJ Y2hhcgkgICAqZmlsZW5hbWU7CisKKwliYXNlX2RpciA9IChjaGFyICopIHBnX21hbGxvYzAo TUFYUEdQQVRIKTsKKwlsZW4gPSBzbnByaW50ZihiYXNlX2RpciwgTUFYUEdQQVRILCAiJXMv JXMiLCBkYXRhZGlyLCBCQVNFX09VVFBVVF9ESVIpOworCWlmIChsZW4gPj0gTUFYUEdQQVRI KQorCQlwZ19mYXRhbCgiZGlyZWN0b3J5IHBhdGggZm9yIHN1YnNjcmliZXIgaXMgdG9vIGxv bmciKTsKKworCWlmICghR2V0RGF0YURpcmVjdG9yeUNyZWF0ZVBlcm0oZGF0YWRpcikpCisJ CXBnX2ZhdGFsKCJjb3VsZCBub3QgcmVhZCBwZXJtaXNzaW9ucyBvZiBkaXJlY3RvcnkgXCIl c1wiOiAlbSIsCisJCQkJIGRhdGFkaXIpOworCisJaWYgKCFkcnlfcnVuICYmIG1rZGlyKGJh c2VfZGlyLCBwZ19kaXJfY3JlYXRlX21vZGUpIDwgMCAmJiBlcnJubyAhPSBFRVhJU1QpCisJ CXBnX2ZhdGFsKCJjb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiVzXCI6ICVtIiwgYmFz ZV9kaXIpOworCisJLyogQXBwZW5kIHRpbWVzdGFtcCB3aXRoIElTTyA4NjAxIGZvcm1hdCAq LworCWdldHRpbWVvZmRheSgmdGltZSwgTlVMTCk7CisJdHQgPSAodGltZV90KSB0aW1lLnR2 X3NlYzsKKwlzdHJmdGltZSh0aW1lYnVmLCBzaXplb2YodGltZWJ1ZiksICIlWSVtJWRUJUgl TSVTIiwgbG9jYWx0aW1lKCZ0dCkpOworCXNucHJpbnRmKHRpbWVidWYgKyBzdHJsZW4odGlt ZWJ1ZiksIHNpemVvZih0aW1lYnVmKSAtIHN0cmxlbih0aW1lYnVmKSwKKwkJCSAiLiUwM2Qi LCAoaW50KSAodGltZS50dl91c2VjIC8gMTAwMCkpOworCisJZmlsZW5hbWUgPSAoY2hhciAq KSBwZ19tYWxsb2MwKE1BWFBHUEFUSCk7CisJbGVuID0gc25wcmludGYoZmlsZW5hbWUsIE1B WFBHUEFUSCwgIiVzL3NlcnZlcl9zdGFydF8lcy5sb2ciLCBiYXNlX2RpciwgdGltZWJ1Zik7 CisJcGdfbG9nX2RlYnVnKCJsb2cgZmlsZSBpczogJXMiLCBmaWxlbmFtZSk7CisJaWYgKGxl biA+PSBNQVhQR1BBVEgpCisJCXBnX2ZhdGFsKCJsb2cgZmlsZSBwYXRoIGlzIHRvbyBsb25n Iik7CisKKwlyZXR1cm4gZmlsZW5hbWU7Cit9CisKKy8qCisgKiBSZXBvcnRzIGEgc3VpdGFi bGUgbWVzc2FnZSBpZiBwZ19jdGwgZmFpbHMuCisgKi8KK3N0YXRpYyB2b2lkCitwZ19jdGxf c3RhdHVzKGNvbnN0IGNoYXIgKnBnX2N0bF9jbWQsIGludCByYykKK3sKKwlpZiAocmMgIT0g MCkKKwl7CisJCWlmIChXSUZFWElURUQocmMpKQorCQl7CisJCQlwZ19sb2dfZXJyb3IoInBn X2N0bCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJWQiLCBXRVhJVFNUQVRVUyhyYykpOworCQl9 CisJCWVsc2UgaWYgKFdJRlNJR05BTEVEKHJjKSkKKwkJeworI2lmIGRlZmluZWQoV0lOMzIp CisJCQlwZ19sb2dfZXJyb3IoInBnX2N0bCB3YXMgdGVybWluYXRlZCBieSBleGNlcHRpb24g MHglWCIsCisJCQkJCQkgV1RFUk1TSUcocmMpKTsKKwkJCXBnX2xvZ19lcnJvcl9kZXRhaWwo IlNlZSBDIGluY2x1ZGUgZmlsZSBcIm50c3RhdHVzLmhcIiBmb3IgYSBkZXNjcmlwdGlvbiBv ZiB0aGUgaGV4YWRlY2ltYWwgdmFsdWUuIik7CisjZWxzZQorCQkJcGdfbG9nX2Vycm9yKCJw Z19jdGwgd2FzIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICVkOiAlcyIsCisJCQkJCQkgV1RFUk1T SUcocmMpLCBwZ19zdHJzaWduYWwoV1RFUk1TSUcocmMpKSk7CisjZW5kaWYKKwkJfQorCQll bHNlCisJCXsKKwkJCXBnX2xvZ19lcnJvcigicGdfY3RsIGV4aXRlZCB3aXRoIHVucmVjb2du aXplZCBzdGF0dXMgJWQiLCByYyk7CisJCX0KKworCQlwZ19sb2dfZXJyb3JfZGV0YWlsKCJU aGUgZmFpbGVkIGNvbW1hbmQgd2FzOiAlcyIsIHBnX2N0bF9jbWQpOworCQlleGl0KDEpOwor CX0KK30KKworc3RhdGljIHZvaWQKK3N0YXJ0X3N0YW5kYnlfc2VydmVyKHN0cnVjdCBDcmVh dGVTdWJzY3JpYmVyT3B0aW9ucyAqb3B0LCBjb25zdCBjaGFyICpwZ19jdGxfcGF0aCwKKwkJ CQkJIGNvbnN0IGNoYXIgKmxvZ2ZpbGUsIGJvb2wgd2l0aF9vcHRpb25zKQoreworCVBRRXhw QnVmZmVyIHBnX2N0bF9jbWQgPSBjcmVhdGVQUUV4cEJ1ZmZlcigpOworCWNoYXIJCXNvY2tl dF9zdHJpbmdbTUFYUEdQQVRIICsgMjAwXTsKKwlpbnQJCQlyYzsKKworCXNvY2tldF9zdHJp bmdbMF0gPSAnXDAnOworCisjaWYgIWRlZmluZWQoV0lOMzIpCisKKwkvKgorCSAqIEFuIGVt cHR5IGxpc3Rlbl9hZGRyZXNzZXMgbGlzdCBtZWFucyB0aGUgc2VydmVyIGRvZXMgbm90IGxp c3RlbiBvbiBhbnkKKwkgKiBJUCBpbnRlcmZhY2VzOyBvbmx5IFVuaXgtZG9tYWluIHNvY2tl dHMgY2FuIGJlIHVzZWQgdG8gY29ubmVjdCB0byB0aGUKKwkgKiBzZXJ2ZXIuIFByZXZlbnQg ZXh0ZXJuYWwgY29ubmVjdGlvbnMgdG8gbWluaW1pemUgdGhlIGNoYW5jZSBvZiBmYWlsdXJl LgorCSAqLworCXN0cmNhdChzb2NrZXRfc3RyaW5nLAorCQkgICAiIC1jIGxpc3Rlbl9hZGRy ZXNzZXM9JycgLWMgdW5peF9zb2NrZXRfcGVybWlzc2lvbnM9MDcwMCIpOworCisJaWYgKG9w dC0+c29ja2V0X2RpcikKKwkJc25wcmludGYoc29ja2V0X3N0cmluZyArIHN0cmxlbihzb2Nr ZXRfc3RyaW5nKSwKKwkJCQkgc2l6ZW9mKHNvY2tldF9zdHJpbmcpIC0gc3RybGVuKHNvY2tl dF9zdHJpbmcpLAorCQkJCSAiIC1jIHVuaXhfc29ja2V0X2RpcmVjdG9yaWVzPSclcyciLAor CQkJCSBvcHQtPnNvY2tldF9kaXIpOworI2VuZGlmCisKKwlhcHBlbmRQUUV4cEJ1ZmZlcihw Z19jdGxfY21kLCAiXCIlc1wiIHN0YXJ0IC1EIFwiJXNcIiAtcyIsCisJCQkJCSAgcGdfY3Rs X3BhdGgsIG9wdC0+c3Vic2NyaWJlcl9kaXIpOworCWlmICh3aXRoX29wdGlvbnMpCisJewor CQkvKgorCQkgKiBEb24ndCBpbmNsdWRlIHRoZSBsb2cgZmlsZSBpbiBkcnkgcnVuIG1vZGUg YmVjYXVzZSB0aGUgZGlyZWN0b3J5CisJCSAqIHRoYXQgY29udGFpbnMgaXQgd2FzIG5vdCBj cmVhdGVkIGluIHNldHVwX3NlcnZlcl9sb2dmaWxlKCkuCisJCSAqLworCQlpZiAoIWRyeV9y dW4pCisJCQlhcHBlbmRQUUV4cEJ1ZmZlcihwZ19jdGxfY21kLCAiIC1sIFwiJXNcIiIsIGxv Z2ZpbGUpOworCQlhcHBlbmRQUUV4cEJ1ZmZlcihwZ19jdGxfY21kLCAiIC1vIFwiLXAgJXUl c1wiIiwKKwkJCQkJCSAgb3B0LT5zdWJfcG9ydCwgc29ja2V0X3N0cmluZyk7CisJfQorCXBn X2xvZ19kZWJ1ZygicGdfY3RsIGNvbW1hbmQgaXM6ICVzIiwgcGdfY3RsX2NtZC0+ZGF0YSk7 CisJcmMgPSBzeXN0ZW0ocGdfY3RsX2NtZC0+ZGF0YSk7CisJcGdfY3RsX3N0YXR1cyhwZ19j dGxfY21kLT5kYXRhLCByYyk7CisJZGVzdHJveVBRRXhwQnVmZmVyKHBnX2N0bF9jbWQpOwor CXBnX2xvZ19pbmZvKCJzZXJ2ZXIgd2FzIHN0YXJ0ZWQiKTsKK30KKworc3RhdGljIHZvaWQK K3N0b3Bfc3RhbmRieV9zZXJ2ZXIoY29uc3QgY2hhciAqcGdfY3RsX3BhdGgsIGNvbnN0IGNo YXIgKmRhdGFkaXIpCit7CisJY2hhcgkgICAqcGdfY3RsX2NtZDsKKwlpbnQJCQlyYzsKKwor CXBnX2N0bF9jbWQgPSBwc3ByaW50ZigiXCIlc1wiIHN0b3AgLUQgXCIlc1wiIC1zIiwgcGdf Y3RsX3BhdGgsCisJCQkJCQkgIGRhdGFkaXIpOworCXBnX2xvZ19kZWJ1ZygicGdfY3RsIGNv bW1hbmQgaXM6ICVzIiwgcGdfY3RsX2NtZCk7CisJcmMgPSBzeXN0ZW0ocGdfY3RsX2NtZCk7 CisJcGdfY3RsX3N0YXR1cyhwZ19jdGxfY21kLCByYyk7CisJcGdfbG9nX2luZm8oInNlcnZl ciB3YXMgc3RvcHBlZCIpOworfQorCisvKgorICogUmV0dXJucyBhZnRlciB0aGUgc2VydmVy IGZpbmlzaGVzIHRoZSByZWNvdmVyeSBwcm9jZXNzLgorICoKKyAqIElmIHJlY292ZXJ5X3Rp bWVvdXQgb3B0aW9uIGlzIHNldCwgdGVybWluYXRlIGFibm9ybWFsbHkgd2l0aG91dCBmaW5p c2hpbmcKKyAqIHRoZSByZWNvdmVyeSBwcm9jZXNzLiBCeSBkZWZhdWx0LCBpdCB3YWl0cyBm b3JldmVyLgorICovCitzdGF0aWMgdm9pZAord2FpdF9mb3JfZW5kX3JlY292ZXJ5KGNvbnN0 IGNoYXIgKmNvbm5pbmZvLCBjb25zdCBjaGFyICpwZ19jdGxfcGF0aCwKKwkJCQkJICBzdHJ1 Y3QgQ3JlYXRlU3Vic2NyaWJlck9wdGlvbnMgKm9wdCkKK3sKKwlQR2Nvbm4JICAgKmNvbm47 CisJaW50CQkJc3RhdHVzID0gUE9TVE1BU1RFUl9TVElMTF9TVEFSVElORzsKKwlpbnQJCQl0 aW1lciA9IDA7CisJaW50CQkJY291bnQgPSAwOwkJLyogbnVtYmVyIG9mIGNvbnNlY3V0aXZl IGNvbm5lY3Rpb24gYXR0ZW1wdHMgKi8KKworI2RlZmluZSBOVU1fQ09OTl9BVFRFTVBUUwk1 CisKKwlwZ19sb2dfaW5mbygid2FpdGluZyB0aGUgdGFyZ2V0IHNlcnZlciB0byByZWFjaCB0 aGUgY29uc2lzdGVudCBzdGF0ZSIpOworCisJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoY29u bmluZm8sIHRydWUpOworCisJZm9yICg7OykKKwl7CisJCVBHcmVzdWx0ICAgKnJlczsKKwkJ Ym9vbAkJaW5fcmVjb3ZlcnkgPSBzZXJ2ZXJfaXNfaW5fcmVjb3ZlcnkoY29ubik7CisKKwkJ LyoKKwkJICogRG9lcyB0aGUgcmVjb3ZlcnkgcHJvY2VzcyBmaW5pc2g/IEluIGRyeSBydW4g bW9kZSwgdGhlcmUgaXMgbm8KKwkJICogcmVjb3ZlcnkgbW9kZS4gQmFpbCBvdXQgYXMgdGhl IHJlY292ZXJ5IHByb2Nlc3MgaGFzIGVuZGVkLgorCQkgKi8KKwkJaWYgKCFpbl9yZWNvdmVy eSB8fCBkcnlfcnVuKQorCQl7CisJCQlzdGF0dXMgPSBQT1NUTUFTVEVSX1JFQURZOworCQkJ cmVjb3ZlcnlfZW5kZWQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBJ ZiBpdCBpcyBzdGlsbCBpbiByZWNvdmVyeSwgbWFrZSBzdXJlIHRoZSB0YXJnZXQgc2VydmVy IGlzCisJCSAqIGNvbm5lY3RlZCB0byB0aGUgcHJpbWFyeSBzbyBpdCBjYW4gcmVjZWl2ZSB0 aGUgcmVxdWlyZWQgV0FMIHRvCisJCSAqIGZpbmlzaCB0aGUgcmVjb3ZlcnkgcHJvY2Vzcy4g SWYgaXQgaXMgZGlzY29ubmVjdGVkIHRyeQorCQkgKiBOVU1fQ09OTl9BVFRFTVBUUyBpbiBh IHJvdyBhbmQgYmFpbCBvdXQgaWYgbm90IHN1Y2NlZWQuCisJCSAqLworCQlyZXMgPSBQUWV4 ZWMoY29ubiwKKwkJCQkJICJTRUxFQ1QgMSBGUk9NIHBnX2NhdGFsb2cucGdfc3RhdF93YWxf cmVjZWl2ZXIiKTsKKwkJaWYgKFBRbnR1cGxlcyhyZXMpID09IDApCisJCXsKKwkJCWlmICgr K2NvdW50ID4gTlVNX0NPTk5fQVRURU1QVFMpCisJCQl7CisJCQkJc3RvcF9zdGFuZGJ5X3Nl cnZlcihwZ19jdGxfcGF0aCwgb3B0LT5zdWJzY3JpYmVyX2Rpcik7CisJCQkJcGdfbG9nX2Vy cm9yKCJzdGFuZGJ5IHNlcnZlciBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgcHJpbWFyeSIpOwor CQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJCWNvdW50ID0gMDsJCQkvKiByZXNl dCBjb3VudGVyIGlmIGl0IGNvbm5lY3RzIGFnYWluICovCisKKwkJUFFjbGVhcihyZXMpOwor CisJCS8qIEJhaWwgb3V0IGFmdGVyIHJlY292ZXJ5X3RpbWVvdXQgc2Vjb25kcyBpZiB0aGlz IG9wdGlvbiBpcyBzZXQgKi8KKwkJaWYgKG9wdC0+cmVjb3ZlcnlfdGltZW91dCA+IDAgJiYg dGltZXIgPj0gb3B0LT5yZWNvdmVyeV90aW1lb3V0KQorCQl7CisJCQlzdG9wX3N0YW5kYnlf c2VydmVyKHBnX2N0bF9wYXRoLCBvcHQtPnN1YnNjcmliZXJfZGlyKTsKKwkJCXBnX2xvZ19l cnJvcigicmVjb3ZlcnkgdGltZWQgb3V0Iik7CisJCQlkaXNjb25uZWN0X2RhdGFiYXNlKGNv bm4sIHRydWUpOworCQl9CisKKwkJLyogS2VlcCB3YWl0aW5nICovCisJCXBnX3VzbGVlcChX QUlUX0lOVEVSVkFMICogVVNFQ19QRVJfU0VDKTsKKworCQl0aW1lciArPSBXQUlUX0lOVEVS VkFMOworCX0KKworCWRpc2Nvbm5lY3RfZGF0YWJhc2UoY29ubiwgZmFsc2UpOworCisJaWYg KHN0YXR1cyA9PSBQT1NUTUFTVEVSX1NUSUxMX1NUQVJUSU5HKQorCQlwZ19mYXRhbCgic2Vy dmVyIGRpZCBub3QgZW5kIHJlY292ZXJ5Iik7CisKKwlwZ19sb2dfaW5mbygidGFyZ2V0IHNl cnZlciByZWFjaGVkIHRoZSBjb25zaXN0ZW50IHN0YXRlIik7CisJcGdfbG9nX2luZm9faGlu dCgiSWYgcGdfY3JlYXRlc3Vic2NyaWJlciBmYWlscyBhZnRlciB0aGlzIHBvaW50LCAiCisJ CQkJCSAieW91IG11c3QgcmVjcmVhdGUgdGhlIHBoeXNpY2FsIHJlcGxpY2EgYmVmb3JlIGNv bnRpbnVpbmcuIik7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBwdWJsaWNhdGlvbiB0aGF0IGlu Y2x1ZGVzIGFsbCB0YWJsZXMgaW4gdGhlIGRhdGFiYXNlLgorICovCitzdGF0aWMgdm9pZAor Y3JlYXRlX3B1YmxpY2F0aW9uKFBHY29ubiAqY29ubiwgc3RydWN0IExvZ2ljYWxSZXBJbmZv ICpkYmluZm8pCit7CisJUFFFeHBCdWZmZXIgc3RyID0gY3JlYXRlUFFFeHBCdWZmZXIoKTsK KwlQR3Jlc3VsdCAgICpyZXM7CisKKwlBc3NlcnQoY29ubiAhPSBOVUxMKTsKKworCS8qIENo ZWNrIGlmIHRoZSBwdWJsaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyAqLworCWFwcGVuZFBRRXhw QnVmZmVyKHN0ciwKKwkJCQkJICAiU0VMRUNUIDEgRlJPTSBwZ19jYXRhbG9nLnBnX3B1Ymxp Y2F0aW9uICIKKwkJCQkJICAiV0hFUkUgcHVibmFtZSA9ICclcyciLAorCQkJCQkgIGRiaW5m by0+cHVibmFtZSk7CisJcmVzID0gUFFleGVjKGNvbm4sIHN0ci0+ZGF0YSk7CisJaWYgKFBR cmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfVFVQTEVTX09LKQorCXsKKwkJcGdfbG9nX2Vy cm9yKCJjb3VsZCBub3Qgb2J0YWluIHB1YmxpY2F0aW9uIGluZm9ybWF0aW9uOiAlcyIsCisJ CQkJCSBQUXJlc3VsdEVycm9yTWVzc2FnZShyZXMpKTsKKwkJZGlzY29ubmVjdF9kYXRhYmFz ZShjb25uLCB0cnVlKTsKKwl9CisKKwlpZiAoUFFudHVwbGVzKHJlcykgPT0gMSkKKwl7CisJ CS8qCisJCSAqIFVuZm9ydHVuYXRlbHksIGlmIGl0IHJlYWNoZXMgdGhpcyBjb2RlIHBhdGgs IGl0IHdpbGwgYWx3YXlzIGZhaWwKKwkJICogKHVubGVzcyB5b3UgZGVjaWRlIHRvIGNoYW5n ZSB0aGUgZXhpc3RpbmcgcHVibGljYXRpb24gbmFtZSkuIFRoYXQncworCQkgKiBiYWQgYnV0 IGl0IGlzIHZlcnkgdW5saWtlbHkgdGhhdCB0aGUgdXNlciB3aWxsIGNob29zZSBhIG5hbWUg d2l0aAorCQkgKiBwZ19jcmVhdGVzdWJzY3JpYmVyXyBwcmVmaXggZm9sbG93ZWQgYnkgdGhl IGV4YWN0IGRhdGFiYXNlIG9pZC4KKwkJICovCisJCXBnX2xvZ19lcnJvcigicHVibGljYXRp b24gXCIlc1wiIGFscmVhZHkgZXhpc3RzIiwgZGJpbmZvLT5wdWJuYW1lKTsKKwkJcGdfbG9n X2Vycm9yX2hpbnQoIkNvbnNpZGVyIHJlbmFtaW5nIHRoaXMgcHVibGljYXRpb24gYmVmb3Jl IGNvbnRpbnVpbmcuIik7CisJCWRpc2Nvbm5lY3RfZGF0YWJhc2UoY29ubiwgdHJ1ZSk7CisJ fQorCisJUFFjbGVhcihyZXMpOworCXJlc2V0UFFFeHBCdWZmZXIoc3RyKTsKKworCXBnX2xv Z19pbmZvKCJjcmVhdGluZyBwdWJsaWNhdGlvbiBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wi IiwKKwkJCQlkYmluZm8tPnB1Ym5hbWUsIGRiaW5mby0+ZGJuYW1lKTsKKworCWFwcGVuZFBR RXhwQnVmZmVyKHN0ciwgIkNSRUFURSBQVUJMSUNBVElPTiAlcyBGT1IgQUxMIFRBQkxFUyIs CisJCQkJCSAgZGJpbmZvLT5wdWJuYW1lKTsKKworCXBnX2xvZ19kZWJ1ZygiY29tbWFuZCBp czogJXMiLCBzdHItPmRhdGEpOworCisJaWYgKCFkcnlfcnVuKQorCXsKKwkJcmVzID0gUFFl eGVjKGNvbm4sIHN0ci0+ZGF0YSk7CisJCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBH UkVTX0NPTU1BTkRfT0spCisJCXsKKwkJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGNyZWF0 ZSBwdWJsaWNhdGlvbiBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiOiAlcyIsCisJCQkJCQkg ZGJpbmZvLT5wdWJuYW1lLCBkYmluZm8tPmRibmFtZSwgUFFyZXN1bHRFcnJvck1lc3NhZ2Uo cmVzKSk7CisJCQlkaXNjb25uZWN0X2RhdGFiYXNlKGNvbm4sIHRydWUpOworCQl9CisJCVBR Y2xlYXIocmVzKTsKKwl9CisKKwkvKiBGb3IgY2xlYW51cCBwdXJwb3NlcyAqLworCWRiaW5m by0+bWFkZV9wdWJsaWNhdGlvbiA9IHRydWU7CisKKwlkZXN0cm95UFFFeHBCdWZmZXIoc3Ry KTsKK30KKworLyoKKyAqIFJlbW92ZSBwdWJsaWNhdGlvbiBpZiBpdCBjb3VsZG4ndCBmaW5p c2ggYWxsIHN0ZXBzLgorICovCitzdGF0aWMgdm9pZAorZHJvcF9wdWJsaWNhdGlvbihQR2Nv bm4gKmNvbm4sIHN0cnVjdCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvKQoreworCVBRRXhwQnVm ZmVyIHN0ciA9IGNyZWF0ZVBRRXhwQnVmZmVyKCk7CisJUEdyZXN1bHQgICAqcmVzOworCisJ QXNzZXJ0KGNvbm4gIT0gTlVMTCk7CisKKwlwZ19sb2dfaW5mbygiZHJvcHBpbmcgcHVibGlj YXRpb24gXCIlc1wiIG9uIGRhdGFiYXNlIFwiJXNcIiIsCisJCQkJZGJpbmZvLT5wdWJuYW1l LCBkYmluZm8tPmRibmFtZSk7CisKKwlhcHBlbmRQUUV4cEJ1ZmZlcihzdHIsICJEUk9QIFBV QkxJQ0FUSU9OICVzIiwgZGJpbmZvLT5wdWJuYW1lKTsKKworCXBnX2xvZ19kZWJ1ZygiY29t bWFuZCBpczogJXMiLCBzdHItPmRhdGEpOworCisJaWYgKCFkcnlfcnVuKQorCXsKKwkJcmVz ID0gUFFleGVjKGNvbm4sIHN0ci0+ZGF0YSk7CisJCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMp ICE9IFBHUkVTX0NPTU1BTkRfT0spCisJCXsKKwkJCXBnX2xvZ19lcnJvcigiY291bGQgbm90 IGRyb3AgcHVibGljYXRpb24gXCIlc1wiIG9uIGRhdGFiYXNlIFwiJXNcIjogJXMiLAorCQkJ CQkJIGRiaW5mby0+cHVibmFtZSwgZGJpbmZvLT5kYm5hbWUsIFBRcmVzdWx0RXJyb3JNZXNz YWdlKHJlcykpOworCQkJZGJpbmZvLT5tYWRlX3B1YmxpY2F0aW9uID0gZmFsc2U7CS8qIGRv bid0IHRyeSBhZ2Fpbi4gKi8KKworCQkJLyoKKwkJCSAqIERvbid0IGRpc2Nvbm5lY3QgYW5k IGV4aXQgaGVyZS4gVGhpcyByb3V0aW5lIGlzIHVzZWQgYnkgcHJpbWFyeQorCQkJICogKGNs ZWFudXAgcHVibGljYXRpb24gLyByZXBsaWNhdGlvbiBzbG90IGR1ZSB0byBhbiBlcnJvcikg YW5kCisJCQkgKiBzdWJzY3JpYmVyIChyZW1vdmUgdGhlIHJlcGxpY2F0ZWQgcHVibGljYXRp b25zKS4gSW4gYm90aCBjYXNlcywKKwkJCSAqIGl0IGNhbiBjb250aW51ZSBhbmQgcHJvdmlk ZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSB1c2VyIHRvIHJlbW92ZQorCQkJICogaXQgbGF0ZXIg aWYgY2xlYW51cCBmYWlscy4KKwkJCSAqLworCQl9CisJCVBRY2xlYXIocmVzKTsKKwl9CisK KwlkZXN0cm95UFFFeHBCdWZmZXIoc3RyKTsKK30KKworLyoKKyAqIENyZWF0ZSBhIHN1YnNj cmlwdGlvbiB3aXRoIHNvbWUgcHJlZGVmaW5lZCBvcHRpb25zLgorICoKKyAqIEEgcmVwbGlj YXRpb24gc2xvdCB3YXMgYWxyZWFkeSBjcmVhdGVkIGluIGEgcHJldmlvdXMgc3RlcC4gTGV0 J3MgdXNlIGl0LiBCeQorICogZGVmYXVsdCwgdGhlIHN1YnNjcmlwdGlvbiBuYW1lIGlzIHVz ZWQgYXMgcmVwbGljYXRpb24gc2xvdCBuYW1lLiBJdCBpcworICogbm90IHJlcXVpcmVkIHRv IGNvcHkgZGF0YS4gVGhlIHN1YnNjcmlwdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYnV0IGl0IHdp bGwgbm90CisgKiBiZSBlbmFibGVkIG5vdy4gVGhhdCdzIGJlY2F1c2UgdGhlIHJlcGxpY2F0 aW9uIHByb2dyZXNzIG11c3QgYmUgc2V0IGFuZCB0aGUKKyAqIHJlcGxpY2F0aW9uIG9yaWdp biBuYW1lIChvbmUgb2YgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cykgY29udGFpbnMgdGhlCisg KiBzdWJzY3JpcHRpb24gT0lEIGluIGl0cyBuYW1lLiBPbmNlIHRoZSBzdWJzY3JpcHRpb24g aXMgY3JlYXRlZCwKKyAqIHNldF9yZXBsaWNhdGlvbl9wcm9ncmVzcygpIGNhbiBvYnRhaW4g dGhlIGNob3NlbiBvcmlnaW4gbmFtZSBhbmQgc2V0IHVwIGl0cworICogaW5pdGlhbCBsb2Nh dGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2NyZWF0ZV9zdWJzY3JpcHRpb24oUEdjb25uICpj b25uLCBzdHJ1Y3QgTG9naWNhbFJlcEluZm8gKmRiaW5mbykKK3sKKwlQUUV4cEJ1ZmZlciBz dHIgPSBjcmVhdGVQUUV4cEJ1ZmZlcigpOworCVBHcmVzdWx0ICAgKnJlczsKKworCUFzc2Vy dChjb25uICE9IE5VTEwpOworCisJcGdfbG9nX2luZm8oImNyZWF0aW5nIHN1YnNjcmlwdGlv biBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiIiwKKwkJCQlkYmluZm8tPnN1Ym5hbWUsIGRi aW5mby0+ZGJuYW1lKTsKKworCWFwcGVuZFBRRXhwQnVmZmVyKHN0ciwKKwkJCQkJICAiQ1JF QVRFIFNVQlNDUklQVElPTiAlcyBDT05ORUNUSU9OICclcycgUFVCTElDQVRJT04gJXMgIgor CQkJCQkgICJXSVRIIChjcmVhdGVfc2xvdCA9IGZhbHNlLCBjb3B5X2RhdGEgPSBmYWxzZSwg ZW5hYmxlZCA9IGZhbHNlKSIsCisJCQkJCSAgZGJpbmZvLT5zdWJuYW1lLCBkYmluZm8tPnB1 YmNvbm5pbmZvLCBkYmluZm8tPnB1Ym5hbWUpOworCisJcGdfbG9nX2RlYnVnKCJjb21tYW5k IGlzOiAlcyIsIHN0ci0+ZGF0YSk7CisKKwlpZiAoIWRyeV9ydW4pCisJeworCQlyZXMgPSBQ UWV4ZWMoY29ubiwgc3RyLT5kYXRhKTsKKwkJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0g UEdSRVNfQ09NTUFORF9PSykKKwkJeworCQkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3QgY3Jl YXRlIHN1YnNjcmlwdGlvbiBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiOiAlcyIsCisJCQkJ CQkgZGJpbmZvLT5zdWJuYW1lLCBkYmluZm8tPmRibmFtZSwgUFFyZXN1bHRFcnJvck1lc3Nh Z2UocmVzKSk7CisJCQlkaXNjb25uZWN0X2RhdGFiYXNlKGNvbm4sIHRydWUpOworCQl9CisJ CVBRY2xlYXIocmVzKTsKKwl9CisKKwlkZXN0cm95UFFFeHBCdWZmZXIoc3RyKTsKK30KKwor LyoKKyAqIFNldHMgdGhlIHJlcGxpY2F0aW9uIHByb2dyZXNzIHRvIHRoZSBjb25zaXN0ZW50 IExTTi4KKyAqCisgKiBUaGUgc3Vic2NyaWJlciBjYXVnaHQgdXAgdG8gdGhlIGNvbnNpc3Rl bnQgTFNOIHByb3ZpZGVkIGJ5IHRoZSB0ZW1wb3JhcnkKKyAqIHJlcGxpY2F0aW9uIHNsb3Qu IFRoZSBnb2FsIGlzIHRvIHNldCB1cCB0aGUgaW5pdGlhbCBsb2NhdGlvbiBmb3IgdGhlIGxv Z2ljYWwKKyAqIHJlcGxpY2F0aW9uIHRoYXQgaXMgdGhlIGV4YWN0IExTTiB0aGF0IHRoZSBz dWJzY3JpYmVyIHdhcyBwcm9tb3RlZC4gT25jZSB0aGUKKyAqIHN1YnNjcmlwdGlvbiBpcyBl bmFibGVkIGl0IHdpbGwgc3RhcnQgc3RyZWFtaW5nIGZyb20gdGhhdCBsb2NhdGlvbiBvbndh cmRzLgorICogSW4gZHJ5IHJ1biBtb2RlLCB0aGUgc3Vic2NyaXB0aW9uIE9JRCBhbmQgTFNO IGFyZSBzZXQgdG8gaW52YWxpZCB2YWx1ZXMgZm9yCisgKiBwcmludGluZyBwdXJwb3Nlcy4K KyAqLworc3RhdGljIHZvaWQKK3NldF9yZXBsaWNhdGlvbl9wcm9ncmVzcyhQR2Nvbm4gKmNv bm4sIHN0cnVjdCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvLCBjb25zdCBjaGFyICpsc24pCit7 CisJUFFFeHBCdWZmZXIgc3RyID0gY3JlYXRlUFFFeHBCdWZmZXIoKTsKKwlQR3Jlc3VsdCAg ICpyZXM7CisJT2lkCQkJc3Vib2lkOworCWNoYXIJCW9yaWdpbm5hbWVbTkFNRURBVEFMRU5d OworCWNoYXIJCWxzbnN0clsxNyArIDFdOyAvKiBNQVhQR19MU05MRU4gPSAxNyAqLworCisJ QXNzZXJ0KGNvbm4gIT0gTlVMTCk7CisKKwlhcHBlbmRQUUV4cEJ1ZmZlcihzdHIsCisJCQkJ CSAgIlNFTEVDVCBvaWQgRlJPTSBwZ19jYXRhbG9nLnBnX3N1YnNjcmlwdGlvbiAiCisJCQkJ CSAgIldIRVJFIHN1Ym5hbWUgPSAnJXMnIiwKKwkJCQkJICBkYmluZm8tPnN1Ym5hbWUpOwor CisJcmVzID0gUFFleGVjKGNvbm4sIHN0ci0+ZGF0YSk7CisJaWYgKFBRcmVzdWx0U3RhdHVz KHJlcykgIT0gUEdSRVNfVFVQTEVTX09LKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJjb3VsZCBu b3Qgb2J0YWluIHN1YnNjcmlwdGlvbiBPSUQ6ICVzIiwKKwkJCQkJIFBRcmVzdWx0RXJyb3JN ZXNzYWdlKHJlcykpOworCQlkaXNjb25uZWN0X2RhdGFiYXNlKGNvbm4sIHRydWUpOworCX0K KworCWlmIChQUW50dXBsZXMocmVzKSAhPSAxICYmICFkcnlfcnVuKQorCXsKKwkJcGdfbG9n X2Vycm9yKCJjb3VsZCBub3Qgb2J0YWluIHN1YnNjcmlwdGlvbiBPSUQ6IGdvdCAlZCByb3dz LCBleHBlY3RlZCAlZCByb3dzIiwKKwkJCQkJIFBRbnR1cGxlcyhyZXMpLCAxKTsKKwkJZGlz Y29ubmVjdF9kYXRhYmFzZShjb25uLCB0cnVlKTsKKwl9CisKKwlpZiAoZHJ5X3J1bikKKwl7 CisJCXN1Ym9pZCA9IEludmFsaWRPaWQ7CisJCXNucHJpbnRmKGxzbnN0ciwgc2l6ZW9mKGxz bnN0ciksICIlWC8lWCIsCisJCQkJIExTTl9GT1JNQVRfQVJHUygoWExvZ1JlY1B0cikgSW52 YWxpZFhMb2dSZWNQdHIpKTsKKwl9CisJZWxzZQorCXsKKwkJc3Vib2lkID0gc3RydG91bChQ UWdldHZhbHVlKHJlcywgMCwgMCksIE5VTEwsIDEwKTsKKwkJc25wcmludGYobHNuc3RyLCBz aXplb2YobHNuc3RyKSwgIiVzIiwgbHNuKTsKKwl9CisKKwlQUWNsZWFyKHJlcyk7CisKKwkv KgorCSAqIFRoZSBvcmlnaW4gbmFtZSBpcyBkZWZpbmVkIGFzIHBnXyV1LiAldSBpcyB0aGUg c3Vic2NyaXB0aW9uIE9JRC4gU2VlCisJICogQXBwbHlXb3JrZXJNYWluKCkuCisJICovCisJ c25wcmludGYob3JpZ2lubmFtZSwgc2l6ZW9mKG9yaWdpbm5hbWUpLCAicGdfJXUiLCBzdWJv aWQpOworCisJcGdfbG9nX2luZm8oInNldHRpbmcgdGhlIHJlcGxpY2F0aW9uIHByb2dyZXNz IChub2RlIG5hbWUgXCIlc1wiIDsgTFNOICVzKSBvbiBkYXRhYmFzZSBcIiVzXCIiLAorCQkJ CW9yaWdpbm5hbWUsIGxzbnN0ciwgZGJpbmZvLT5kYm5hbWUpOworCisJcmVzZXRQUUV4cEJ1 ZmZlcihzdHIpOworCWFwcGVuZFBRRXhwQnVmZmVyKHN0ciwKKwkJCQkJICAiU0VMRUNUIHBn X2NhdGFsb2cucGdfcmVwbGljYXRpb25fb3JpZ2luX2FkdmFuY2UoJyVzJywgJyVzJykiLAor CQkJCQkgIG9yaWdpbm5hbWUsIGxzbnN0cik7CisKKwlwZ19sb2dfZGVidWcoImNvbW1hbmQg aXM6ICVzIiwgc3RyLT5kYXRhKTsKKworCWlmICghZHJ5X3J1bikKKwl7CisJCXJlcyA9IFBR ZXhlYyhjb25uLCBzdHItPmRhdGEpOworCQlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQ R1JFU19UVVBMRVNfT0spCisJCXsKKwkJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IHNldCBy ZXBsaWNhdGlvbiBwcm9ncmVzcyBmb3IgdGhlIHN1YnNjcmlwdGlvbiBcIiVzXCI6ICVzIiwK KwkJCQkJCSBkYmluZm8tPnN1Ym5hbWUsIFBRcmVzdWx0RXJyb3JNZXNzYWdlKHJlcykpOwor CQkJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uLCB0cnVlKTsKKwkJfQorCQlQUWNsZWFyKHJl cyk7CisJfQorCisJZGVzdHJveVBRRXhwQnVmZmVyKHN0cik7Cit9CisKKy8qCisgKiBFbmFi bGVzIHRoZSBzdWJzY3JpcHRpb24uCisgKgorICogVGhlIHN1YnNjcmlwdGlvbiB3YXMgY3Jl YXRlZCBpbiBhIHByZXZpb3VzIHN0ZXAgYnV0IGl0IHdhcyBkaXNhYmxlZC4gQWZ0ZXIKKyAq IGFkanVzdGluZyB0aGUgaW5pdGlhbCBsb2dpY2FsIHJlcGxpY2F0aW9uIGxvY2F0aW9uLCBl bmFibGUgdGhlIHN1YnNjcmlwdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2VuYWJsZV9zdWJz Y3JpcHRpb24oUEdjb25uICpjb25uLCBzdHJ1Y3QgTG9naWNhbFJlcEluZm8gKmRiaW5mbykK K3sKKwlQUUV4cEJ1ZmZlciBzdHIgPSBjcmVhdGVQUUV4cEJ1ZmZlcigpOworCVBHcmVzdWx0 ICAgKnJlczsKKworCUFzc2VydChjb25uICE9IE5VTEwpOworCisJcGdfbG9nX2luZm8oImVu YWJsaW5nIHN1YnNjcmlwdGlvbiBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiIiwKKwkJCQlk YmluZm8tPnN1Ym5hbWUsIGRiaW5mby0+ZGJuYW1lKTsKKworCWFwcGVuZFBRRXhwQnVmZmVy KHN0ciwgIkFMVEVSIFNVQlNDUklQVElPTiAlcyBFTkFCTEUiLCBkYmluZm8tPnN1Ym5hbWUp OworCisJcGdfbG9nX2RlYnVnKCJjb21tYW5kIGlzOiAlcyIsIHN0ci0+ZGF0YSk7CisKKwlp ZiAoIWRyeV9ydW4pCisJeworCQlyZXMgPSBQUWV4ZWMoY29ubiwgc3RyLT5kYXRhKTsKKwkJ aWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfQ09NTUFORF9PSykKKwkJeworCQkJ cGdfbG9nX2Vycm9yKCJjb3VsZCBub3QgZW5hYmxlIHN1YnNjcmlwdGlvbiBcIiVzXCI6ICVz IiwKKwkJCQkJCSBkYmluZm8tPnN1Ym5hbWUsIFBRcmVzdWx0RXJyb3JNZXNzYWdlKHJlcykp OworCQkJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uLCB0cnVlKTsKKwkJfQorCisJCVBRY2xl YXIocmVzKTsKKwl9CisKKwlkZXN0cm95UFFFeHBCdWZmZXIoc3RyKTsKK30KKworaW50Citt YWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgc3RydWN0IG9wdGlvbiBs b25nX29wdGlvbnNbXSA9CisJeworCQl7ImRhdGFiYXNlIiwgcmVxdWlyZWRfYXJndW1lbnQs IE5VTEwsICdkJ30sCisJCXsicGdkYXRhIiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdE J30sCisJCXsiZHJ5LXJ1biIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnbid9LAorCQl7InN1YnNj cmliZXItcG9ydCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAncCd9LAorCQl7InB1Ymxp c2hlci1zZXJ2ZXIiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1AnfSwKKwkJeyJyZXRh aW4iLCBub19hcmd1bWVudCwgTlVMTCwgJ3InfSwKKwkJeyJzb2NrZXQtZGlyZWN0b3J5Iiwg cmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdzJ30sCisJCXsicmVjb3ZlcnktdGltZW91dCIs IHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAndCd9LAorCQl7InN1YnNjcmliZXItdXNlcm5h bWUiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1UnfSwKKwkJeyJ2ZXJib3NlIiwgbm9f YXJndW1lbnQsIE5VTEwsICd2J30sCisJCXsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxM LCAnVid9LAorCQl7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJz8nfSwKKwkJe05VTEws IDAsIE5VTEwsIDB9CisJfTsKKworCXN0cnVjdCBDcmVhdGVTdWJzY3JpYmVyT3B0aW9ucyBv cHQgPSB7MH07CisKKwlpbnQJCQljOworCWludAkJCW9wdGlvbl9pbmRleDsKKworCWNoYXIJ ICAgKnBnX2N0bF9wYXRoID0gTlVMTDsKKwljaGFyCSAgICpwZ19yZXNldHdhbF9wYXRoID0g TlVMTDsKKworCWNoYXIJICAgKnNlcnZlcl9zdGFydF9sb2c7CisKKwljaGFyCSAgICpwdWJf YmFzZV9jb25uaW5mbyA9IE5VTEw7CisJY2hhcgkgICAqc3ViX2Jhc2VfY29ubmluZm8gPSBO VUxMOworCWNoYXIJICAgKmRibmFtZV9jb25uaW5mbyA9IE5VTEw7CisKKwl1aW50NjQJCXB1 Yl9zeXNpZDsKKwl1aW50NjQJCXN1Yl9zeXNpZDsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwor CisJUEdjb25uCSAgICpjb25uOworCWNoYXIJICAgKmNvbnNpc3RlbnRfbHNuOworCisJUFFF eHBCdWZmZXIgc3ViX2Nvbm5pbmZvX3N0ciA9IGNyZWF0ZVBRRXhwQnVmZmVyKCk7CisJUFFF eHBCdWZmZXIgcmVjb3Zlcnljb25mY29udGVudHMgPSBOVUxMOworCisJY2hhcgkJcGlkZmls ZVtNQVhQR1BBVEhdOworCisJcGdfbG9nZ2luZ19pbml0KGFyZ3ZbMF0pOworCXBnX2xvZ2dp bmdfc2V0X2xldmVsKFBHX0xPR19XQVJOSU5HKTsKKwlwcm9nbmFtZSA9IGdldF9wcm9nbmFt ZShhcmd2WzBdKTsKKwlzZXRfcGdsb2NhbGVfcGdzZXJ2aWNlKGFyZ3ZbMF0sIFBHX1RFWFRE T01BSU4oInBnX2NyZWF0ZXN1YnNjcmliZXIiKSk7CisKKwlpZiAoYXJnYyA+IDEpCisJewor CQlpZiAoc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSA9PSAwIHx8IHN0cmNtcChhcmd2WzFd LCAiLT8iKSA9PSAwKQorCQl7CisJCQl1c2FnZSgpOworCQkJZXhpdCgwKTsKKwkJfQorCQll bHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIi1WIikgPT0gMAorCQkJCSB8fCBzdHJjbXAoYXJn dlsxXSwgIi0tdmVyc2lvbiIpID09IDApCisJCXsKKwkJCXB1dHMoInBnX2NyZWF0ZXN1YnNj cmliZXIgKFBvc3RncmVTUUwpICIgUEdfVkVSU0lPTik7CisJCQlleGl0KDApOworCQl9CisJ fQorCisJLyogRGVmYXVsdCBzZXR0aW5ncyAqLworCW9wdC5zdWJzY3JpYmVyX2RpciA9IE5V TEw7CisJb3B0LnB1Yl9jb25uaW5mb19zdHIgPSBOVUxMOworCW9wdC5zb2NrZXRfZGlyID0g TlVMTDsKKwlvcHQuc3ViX3BvcnQgPSBERUZBVUxUX1NVQl9QT1JUOworCW9wdC5zdWJfdXNl cm5hbWUgPSBOVUxMOworCW9wdC5kYXRhYmFzZV9uYW1lcyA9IChTaW1wbGVTdHJpbmdMaXN0 KQorCXsKKwkJTlVMTCwgTlVMTAorCX07CisJb3B0LnJldGFpbiA9IGZhbHNlOworCW9wdC5y ZWNvdmVyeV90aW1lb3V0ID0gMDsKKworCS8qCisJICogRG9uJ3QgYWxsb3cgaXQgdG8gYmUg cnVuIGFzIHJvb3QuIEl0IHVzZXMgcGdfY3RsIHdoaWNoIGRvZXMgbm90IGFsbG93CisJICog aXQgZWl0aGVyLgorCSAqLworI2lmbmRlZiBXSU4zMgorCWlmIChnZXRldWlkKCkgPT0gMCkK Kwl7CisJCXBnX2xvZ19lcnJvcigiY2Fubm90IGJlIGV4ZWN1dGVkIGJ5IFwicm9vdFwiIik7 CisJCXBnX2xvZ19lcnJvcl9oaW50KCJZb3UgbXVzdCBydW4gJXMgYXMgdGhlIFBvc3RncmVT UUwgc3VwZXJ1c2VyLiIsCisJCQkJCQkgIHByb2duYW1lKTsKKwkJZXhpdCgxKTsKKwl9Cisj ZW5kaWYKKworCWdldF9yZXN0cmljdGVkX3Rva2VuKCk7CisKKwl3aGlsZSAoKGMgPSBnZXRv cHRfbG9uZyhhcmdjLCBhcmd2LCAiZDpEOm5QOnJTOnQ6diIsCisJCQkJCQkJbG9uZ19vcHRp b25zLCAmb3B0aW9uX2luZGV4KSkgIT0gLTEpCisJeworCQlzd2l0Y2ggKGMpCisJCXsKKwkJ CWNhc2UgJ2QnOgorCQkJCS8qIElnbm9yZSBkdXBsaWNhdGVkIGRhdGFiYXNlIG5hbWVzICov CisJCQkJaWYgKCFzaW1wbGVfc3RyaW5nX2xpc3RfbWVtYmVyKCZvcHQuZGF0YWJhc2VfbmFt ZXMsIG9wdGFyZykpCisJCQkJeworCQkJCQlzaW1wbGVfc3RyaW5nX2xpc3RfYXBwZW5kKCZv cHQuZGF0YWJhc2VfbmFtZXMsIG9wdGFyZyk7CisJCQkJCW51bV9kYnMrKzsKKwkJCQl9CisJ CQkJYnJlYWs7CisJCQljYXNlICdEJzoKKwkJCQlvcHQuc3Vic2NyaWJlcl9kaXIgPSBwZ19z dHJkdXAob3B0YXJnKTsKKwkJCQljYW5vbmljYWxpemVfcGF0aChvcHQuc3Vic2NyaWJlcl9k aXIpOworCQkJCWJyZWFrOworCQkJY2FzZSAnbic6CisJCQkJZHJ5X3J1biA9IHRydWU7CisJ CQkJYnJlYWs7CisJCQljYXNlICdwJzoKKwkJCQlpZiAoKG9wdC5zdWJfcG9ydCA9IGF0b2ko b3B0YXJnKSkgPD0gMCkKKwkJCQkJcGdfZmF0YWwoImludmFsaWQgc3Vic2NyaWJlciBwb3J0 IG51bWJlciIpOworCQkJCWJyZWFrOworCQkJY2FzZSAnUCc6CisJCQkJb3B0LnB1Yl9jb25u aW5mb19zdHIgPSBwZ19zdHJkdXAob3B0YXJnKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3In OgorCQkJCW9wdC5yZXRhaW4gPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6CisJ CQkJb3B0LnNvY2tldF9kaXIgPSBwZ19zdHJkdXAob3B0YXJnKTsKKwkJCQlicmVhazsKKwkJ CWNhc2UgJ3QnOgorCQkJCW9wdC5yZWNvdmVyeV90aW1lb3V0ID0gYXRvaShvcHRhcmcpOwor CQkJCWJyZWFrOworCQkJY2FzZSAnVSc6CisJCQkJb3B0LnN1Yl91c2VybmFtZSA9IHBnX3N0 cmR1cChvcHRhcmcpOworCQkJCWJyZWFrOworCQkJY2FzZSAndic6CisJCQkJcGdfbG9nZ2lu Z19pbmNyZWFzZV92ZXJib3NpdHkoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJ LyogZ2V0b3B0X2xvbmcgYWxyZWFkeSBlbWl0dGVkIGEgY29tcGxhaW50ICovCisJCQkJcGdf bG9nX2Vycm9yX2hpbnQoIlRyeSBcIiVzIC0taGVscFwiIGZvciBtb3JlIGluZm9ybWF0aW9u LiIsIHByb2duYW1lKTsKKwkJCQlleGl0KDEpOworCQl9CisJfQorCisJLyoKKwkgKiBBbnkg bm9uLW9wdGlvbiBhcmd1bWVudHM/CisJICovCisJaWYgKG9wdGluZCA8IGFyZ2MpCisJewor CQlwZ19sb2dfZXJyb3IoInRvbyBtYW55IGNvbW1hbmQtbGluZSBhcmd1bWVudHMgKGZpcnN0 IGlzIFwiJXNcIikiLAorCQkJCQkgYXJndltvcHRpbmRdKTsKKwkJcGdfbG9nX2Vycm9yX2hp bnQoIlRyeSBcIiVzIC0taGVscFwiIGZvciBtb3JlIGluZm9ybWF0aW9uLiIsIHByb2duYW1l KTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKgorCSAqIFJlcXVpcmVkIGFyZ3VtZW50cworCSAq LworCWlmIChvcHQuc3Vic2NyaWJlcl9kaXIgPT0gTlVMTCkKKwl7CisJCXBnX2xvZ19lcnJv cigibm8gc3Vic2NyaWJlciBkYXRhIGRpcmVjdG9yeSBzcGVjaWZpZWQiKTsKKwkJcGdfbG9n X2Vycm9yX2hpbnQoIlRyeSBcIiVzIC0taGVscFwiIGZvciBtb3JlIGluZm9ybWF0aW9uLiIs IHByb2duYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKgorCSAqIElmIHNvY2tldCBkaXJl Y3RvcnkgaXMgbm90IHByb3ZpZGVkLCB1c2UgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorCSAq LworCWlmIChvcHQuc29ja2V0X2RpciA9PSBOVUxMKQorCXsKKwkJY2hhcgkJY3dkW01BWFBH UEFUSF07CisKKwkJaWYgKCFnZXRjd2QoY3dkLCBNQVhQR1BBVEgpKQorCQkJcGdfZmF0YWwo ImNvdWxkIG5vdCBkZXRlcm1pbmUgY3VycmVudCBkaXJlY3RvcnkiKTsKKwkJb3B0LnNvY2tl dF9kaXIgPSBwZ19zdHJkdXAoY3dkKTsKKwkJY2Fub25pY2FsaXplX3BhdGgob3B0LnNvY2tl dF9kaXIpOworCX0KKworCS8qCisJICoKKwkgKiBJZiBzdWJzY3JpYmVyIHVzZXJuYW1lIGlz IG5vdCBwcm92aWRlZCwgY2hlY2sgaWYgdGhlIGVudmlyb25tZW50CisJICogdmFyaWFibGUg c2V0cyBpdC4gSWYgbm90LCBvYnRhaW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gbmFtZSBvZiB0 aGUgdXNlcgorCSAqIHJ1bm5pbmcgaXQuCisJICovCisJaWYgKG9wdC5zdWJfdXNlcm5hbWUg PT0gTlVMTCkKKwl7CisJCWNoYXIJICAgKmVycnN0ciA9IE5VTEw7CisKKwkJaWYgKGdldGVu digiUEdVU0VSIikpCisJCXsKKwkJCW9wdC5zdWJfdXNlcm5hbWUgPSBnZXRlbnYoIlBHVVNF UiIpOworCQl9CisJCWVsc2UKKwkJeworCQkJb3B0LnN1Yl91c2VybmFtZSA9IGdldF91c2Vy X25hbWUoJmVycnN0cik7CisJCQlpZiAoZXJyc3RyKQorCQkJCXBnX2ZhdGFsKCIlcyIsIGVy cnN0cik7CisJCX0KKwl9CisKKwkvKgorCSAqIFBhcnNlIGNvbm5lY3Rpb24gc3RyaW5nLiBC dWlsZCBhIGJhc2UgY29ubmVjdGlvbiBzdHJpbmcgdGhhdCBtaWdodCBiZQorCSAqIHJldXNl ZCBieSBtdWx0aXBsZSBkYXRhYmFzZXMuCisJICovCisJaWYgKG9wdC5wdWJfY29ubmluZm9f c3RyID09IE5VTEwpCisJeworCQkvKgorCQkgKiBUT0RPIHVzZSBwcmltYXJ5X2Nvbm5pbmZv IChpZiBhdmFpbGFibGUpIGZyb20gc3Vic2NyaWJlciBhbmQKKwkJICogZXh0cmFjdCBwdWJs aXNoZXIgY29ubmVjdGlvbiBzdHJpbmcuIEFzc3VtZSB0aGF0IHRoZXJlIGFyZQorCQkgKiBp ZGVudGljYWwgZW50cmllcyBmb3IgcGh5c2ljYWwgYW5kIGxvZ2ljYWwgcmVwbGljYXRpb24u IElmIHRoZXJlIGlzCisJCSAqIG5vdCwgd2Ugd291bGQgZmFpbCBhbnl3YXkuCisJCSAqLwor CQlwZ19sb2dfZXJyb3IoIm5vIHB1Ymxpc2hlciBjb25uZWN0aW9uIHN0cmluZyBzcGVjaWZp ZWQiKTsKKwkJcGdfbG9nX2Vycm9yX2hpbnQoIlRyeSBcIiVzIC0taGVscFwiIGZvciBtb3Jl IGluZm9ybWF0aW9uLiIsIHByb2duYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJcGdfbG9nX2lu Zm8oInZhbGlkYXRpbmcgY29ubmVjdGlvbiBzdHJpbmcgb24gcHVibGlzaGVyIik7CisJcHVi X2Jhc2VfY29ubmluZm8gPSBnZXRfYmFzZV9jb25uaW5mbyhvcHQucHViX2Nvbm5pbmZvX3N0 ciwKKwkJCQkJCQkJCQkgICZkYm5hbWVfY29ubmluZm8pOworCWlmIChwdWJfYmFzZV9jb25u aW5mbyA9PSBOVUxMKQorCQlleGl0KDEpOworCisJcGdfbG9nX2luZm8oInZhbGlkYXRpbmcg Y29ubmVjdGlvbiBzdHJpbmcgb24gc3Vic2NyaWJlciIpOworCWFwcGVuZFBRRXhwQnVmZmVy KHN1Yl9jb25uaW5mb19zdHIsICJob3N0PSVzIHBvcnQ9JXUgdXNlcj0lcyBmYWxsYmFja19h cHBsaWNhdGlvbl9uYW1lPSVzIiwKKwkJCQkJICBvcHQuc29ja2V0X2Rpciwgb3B0LnN1Yl9w b3J0LCBvcHQuc3ViX3VzZXJuYW1lLCBwcm9nbmFtZSk7CisJc3ViX2Jhc2VfY29ubmluZm8g PSBnZXRfYmFzZV9jb25uaW5mbyhzdWJfY29ubmluZm9fc3RyLT5kYXRhLCBOVUxMKTsKKwlp ZiAoc3ViX2Jhc2VfY29ubmluZm8gPT0gTlVMTCkKKwkJZXhpdCgxKTsKKworCWlmIChvcHQu ZGF0YWJhc2VfbmFtZXMuaGVhZCA9PSBOVUxMKQorCXsKKwkJcGdfbG9nX2luZm8oIm5vIGRh dGFiYXNlIHdhcyBzcGVjaWZpZWQiKTsKKworCQkvKgorCQkgKiBJZiAtLWRhdGFiYXNlIG9w dGlvbiBpcyBub3QgcHJvdmlkZWQsIHRyeSB0byBvYnRhaW4gdGhlIGRibmFtZSBmcm9tCisJ CSAqIHRoZSBwdWJsaXNoZXIgY29ubmluZm8uIElmIGRibmFtZSBwYXJhbWV0ZXIgaXMgbm90 IGF2YWlsYWJsZSwgZXJyb3IKKwkJICogb3V0LgorCQkgKi8KKwkJaWYgKGRibmFtZV9jb25u aW5mbykKKwkJeworCQkJc2ltcGxlX3N0cmluZ19saXN0X2FwcGVuZCgmb3B0LmRhdGFiYXNl X25hbWVzLCBkYm5hbWVfY29ubmluZm8pOworCQkJbnVtX2RicysrOworCisJCQlwZ19sb2df aW5mbygiZGF0YWJhc2UgXCIlc1wiIHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgcHVibGlzaGVy IGNvbm5lY3Rpb24gc3RyaW5nIiwKKwkJCQkJCWRibmFtZV9jb25uaW5mbyk7CisJCX0KKwkJ ZWxzZQorCQl7CisJCQlwZ19sb2dfZXJyb3IoIm5vIGRhdGFiYXNlIG5hbWUgc3BlY2lmaWVk Iik7CisJCQlwZ19sb2dfZXJyb3JfaGludCgiVHJ5IFwiJXMgLS1oZWxwXCIgZm9yIG1vcmUg aW5mb3JtYXRpb24uIiwKKwkJCQkJCQkgIHByb2duYW1lKTsKKwkJCWV4aXQoMSk7CisJCX0K Kwl9CisKKwkvKiBHZXQgdGhlIGFic29sdXRlIHBhdGggb2YgcGdfY3RsIGFuZCBwZ19yZXNl dHdhbCBvbiB0aGUgc3Vic2NyaWJlciAqLworCXBnX2N0bF9wYXRoID0gZ2V0X2V4ZWNfcGF0 aChhcmd2WzBdLCAicGdfY3RsIik7CisJcGdfcmVzZXR3YWxfcGF0aCA9IGdldF9leGVjX3Bh dGgoYXJndlswXSwgInBnX3Jlc2V0d2FsIik7CisKKwkvKiBSdWRpbWVudGFyeSBjaGVjayBm b3IgYSBkYXRhIGRpcmVjdG9yeSAqLworCWNoZWNrX2RhdGFfZGlyZWN0b3J5KG9wdC5zdWJz Y3JpYmVyX2Rpcik7CisKKwkvKgorCSAqIFN0b3JlIGRhdGFiYXNlIGluZm9ybWF0aW9uIGZv ciBwdWJsaXNoZXIgYW5kIHN1YnNjcmliZXIuIEl0IHNob3VsZCBiZQorCSAqIGNhbGxlZCBi ZWZvcmUgYXRleGl0KCkgYmVjYXVzZSBpdHMgcmV0dXJuIGlzIHVzZWQgaW4gdGhlCisJICog Y2xlYW51cF9vYmplY3RzX2F0ZXhpdCgpLgorCSAqLworCWRiaW5mbyA9IHN0b3JlX3B1Yl9z dWJfaW5mbyhvcHQuZGF0YWJhc2VfbmFtZXMsIHB1Yl9iYXNlX2Nvbm5pbmZvLAorCQkJCQkJ CQlzdWJfYmFzZV9jb25uaW5mbyk7CisKKwkvKiBSZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGNs ZWFuIHVwIG9iamVjdHMgaW4gY2FzZSBvZiBmYWlsdXJlICovCisJYXRleGl0KGNsZWFudXBf b2JqZWN0c19hdGV4aXQpOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgc3Vic2NyaWJlciBk YXRhIGRpcmVjdG9yeSBoYXMgdGhlIHNhbWUgc3lzdGVtIGlkZW50aWZpZXIKKwkgKiB0aGFu IHRoZSBwdWJsaXNoZXIgZGF0YSBkaXJlY3RvcnkuCisJICovCisJcHViX3N5c2lkID0gZ2V0 X3ByaW1hcnlfc3lzaWQoZGJpbmZvWzBdLnB1YmNvbm5pbmZvKTsKKwlzdWJfc3lzaWQgPSBn ZXRfc3RhbmRieV9zeXNpZChvcHQuc3Vic2NyaWJlcl9kaXIpOworCWlmIChwdWJfc3lzaWQg IT0gc3ViX3N5c2lkKQorCQlwZ19mYXRhbCgic3Vic2NyaWJlciBkYXRhIGRpcmVjdG9yeSBp cyBub3QgYSBjb3B5IG9mIHRoZSBzb3VyY2UgZGF0YWJhc2UgY2x1c3RlciIpOworCisJLyog Q3JlYXRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHRvIHN0b3JlIGFueSBkYXRhIGdlbmVyYXRl ZCBieSB0aGlzIHRvb2wgKi8KKwlzZXJ2ZXJfc3RhcnRfbG9nID0gc2V0dXBfc2VydmVyX2xv Z2ZpbGUob3B0LnN1YnNjcmliZXJfZGlyKTsKKworCS8qIFN1YnNjcmliZXIgUElEIGZpbGUg Ki8KKwlzbnByaW50ZihwaWRmaWxlLCBNQVhQR1BBVEgsICIlcy9wb3N0bWFzdGVyLnBpZCIs IG9wdC5zdWJzY3JpYmVyX2Rpcik7CisKKwkvKgorCSAqIElmIHRoZSBzdGFuZGJ5IHNlcnZl ciBpcyBydW5uaW5nLCBzdG9wIGl0LiBTb21lIHBhcmFtZXRlcnMgKHRoYXQgY2FuCisJICog b25seSBiZSBzZXQgYXQgc2VydmVyIHN0YXJ0KSBhcmUgaW5mb3JtZWQgYnkgY29tbWFuZC1s aW5lIG9wdGlvbnMuCisJICovCisJaWYgKHN0YXQocGlkZmlsZSwgJnN0YXRidWYpID09IDAp CisJeworCisJCXBnX2xvZ19pbmZvKCJzdGFuZGJ5IGlzIHVwIGFuZCBydW5uaW5nIik7CisJ CXBnX2xvZ19pbmZvKCJzdG9wcGluZyB0aGUgc2VydmVyIHRvIHN0YXJ0IHRoZSB0cmFuc2Zv cm1hdGlvbiBzdGVwcyIpOworCQlzdG9wX3N0YW5kYnlfc2VydmVyKHBnX2N0bF9wYXRoLCBv cHQuc3Vic2NyaWJlcl9kaXIpOworCX0KKworCS8qCisJICogU3RhcnQgYSBzaG9ydC1saXZl ZCBzdGFuZGJ5IHNlcnZlciB3aXRoIHRlbXBvcmFyeSBwYXJhbWV0ZXJzIChwcm92aWRlZAor CSAqIGJ5IGNvbW1hbmQtbGluZSBvcHRpb25zKS4gVGhlIGdvYWwgaXMgdG8gYXZvaWQgY29u bmVjdGlvbnMgZHVyaW5nIHRoZQorCSAqIHRyYW5zZm9ybWF0aW9uIHN0ZXBzLgorCSAqLwor CXBnX2xvZ19pbmZvKCJzdGFydGluZyB0aGUgc3RhbmRieSB3aXRoIGNvbW1hbmQtbGluZSBv cHRpb25zIik7CisJc3RhcnRfc3RhbmRieV9zZXJ2ZXIoJm9wdCwgcGdfY3RsX3BhdGgsIHNl cnZlcl9zdGFydF9sb2csIHRydWUpOworCisJLyogQ2hlY2sgaWYgdGhlIHN0YW5kYnkgc2Vy dmVyIGlzIHJlYWR5IGZvciBsb2dpY2FsIHJlcGxpY2F0aW9uICovCisJY2hlY2tfc3Vic2Ny aWJlcihkYmluZm8pOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgcHJpbWFyeSBzZXJ2ZXIg aXMgcmVhZHkgZm9yIGxvZ2ljYWwgcmVwbGljYXRpb24uIFRoaXMKKwkgKiByb3V0aW5lIGNo ZWNrcyBpZiBhIHJlcGxpY2F0aW9uIHNsb3QgaXMgaW4gdXNlIG9uIHByaW1hcnkgc28gaXQg cmVsaWVzCisJICogb24gY2hlY2tfc3Vic2NyaWJlcigpIHRvIG9idGFpbiB0aGUgcHJpbWFy eV9zbG90X25hbWUuIFRoYXQncyB3aHkgaXQgaXMKKwkgKiBjYWxsZWQgYWZ0ZXIgaXQuCisJ ICovCisJY2hlY2tfcHVibGlzaGVyKGRiaW5mbyk7CisKKwkvKgorCSAqIENyZWF0ZSB0aGUg cmVxdWlyZWQgb2JqZWN0cyBmb3IgZWFjaCBkYXRhYmFzZSBvbiBwdWJsaXNoZXIuIFRoaXMg c3RlcAorCSAqIGlzIGhlcmUgbWFpbmx5IGJlY2F1c2UgaWYgd2Ugc3RvcCB0aGUgc3RhbmRi eSB3ZSBjYW5ub3QgdmVyaWZ5IGlmIHRoZQorCSAqIHByaW1hcnkgc2xvdCBpcyBpbiB1c2Uu IFdlIGNvdWxkIHVzZSBhbiBleHRyYSBjb25uZWN0aW9uIGZvciBpdCBidXQgaXQKKwkgKiBk b2Vzbid0IHNlZW0gd29ydGguCisJICovCisJc2V0dXBfcHVibGlzaGVyKGRiaW5mbyk7CisK KwkvKgorCSAqIENyZWF0ZSBhIHRlbXBvcmFyeSBsb2dpY2FsIHJlcGxpY2F0aW9uIHNsb3Qg dG8gZ2V0IGEgY29uc2lzdGVudCBMU04uCisJICoKKwkgKiBUaGlzIGNvbnNpc3RlbnQgTFNO IHdpbGwgYmUgdXNlZCBsYXRlciB0byBhZHZhbmNlZCB0aGUgcmVjZW50bHkgY3JlYXRlZAor CSAqIHJlcGxpY2F0aW9uIHNsb3RzLiBJdCBpcyBvayB0byB1c2UgYSB0ZW1wb3JhcnkgcmVw bGljYXRpb24gc2xvdCBoZXJlCisJICogYmVjYXVzZSBpdCB3aWxsIGhhdmUgYSBzaG9ydCBs aWZldGltZSBhbmQgaXQgaXMgb25seSB1c2VkIGFzIGEgbWFyayB0bworCSAqIHN0YXJ0IHRo ZSBsb2dpY2FsIHJlcGxpY2F0aW9uLgorCSAqCisJICogWFhYIHdlIHNob3VsZCBwcm9iYWJs eSB1c2UgdGhlIGxhc3QgY3JlYXRlZCByZXBsaWNhdGlvbiBzbG90IHRvIGdldCBhCisJICog Y29uc2lzdGVudCBMU04gYnV0IGl0IHNob3VsZCBiZSBjaGFuZ2VkIGFmdGVyIGFkZGluZyBw Z19iYXNlYmFja3VwCisJICogc3VwcG9ydC4KKwkgKi8KKwljb25uID0gY29ubmVjdF9kYXRh YmFzZShkYmluZm9bMF0ucHViY29ubmluZm8sIHRydWUpOworCWNvbnNpc3RlbnRfbHNuID0g Y3JlYXRlX2xvZ2ljYWxfcmVwbGljYXRpb25fc2xvdChjb25uLCAmZGJpbmZvWzBdLCB0cnVl KTsKKworCS8qCisJICogV3JpdGUgcmVjb3ZlcnkgcGFyYW1ldGVycy4KKwkgKgorCSAqIERl c3BpdGUgb2YgdGhlIHJlY292ZXJ5IHBhcmFtZXRlcnMgd2lsbCBiZSB3cml0dGVuIHRvIHRo ZSBzdWJzY3JpYmVyLAorCSAqIHVzZSBhIHB1Ymxpc2hlciBjb25uZWN0aW9uIGZvciB0aGUg Zm9sbG93aW5nIHJlY292ZXJ5IGZ1bmN0aW9ucy4gVGhlCisJICogY29ubmVjdGlvbiBpcyBv bmx5IHVzZWQgdG8gY2hlY2sgdGhlIGN1cnJlbnQgc2VydmVyIHZlcnNpb24gKHBoeXNpY2Fs CisJICogcmVwbGljYSwgc2FtZSBzZXJ2ZXIgdmVyc2lvbikuIFRoZSBzdWJzY3JpYmVyIGlz IG5vdCBydW5uaW5nIHlldC4gSW4KKwkgKiBkcnkgcnVuIG1vZGUsIHRoZSByZWNvdmVyeSBw YXJhbWV0ZXJzICp3b24ndCogYmUgd3JpdHRlbi4gQW4gaW52YWxpZAorCSAqIExTTiBpcyB1 c2VkIGZvciBwcmludGluZyBwdXJwb3Nlcy4gQWRkaXRpb25hbCByZWNvdmVyeSBwYXJhbWV0 ZXJzIGFyZQorCSAqIGFkZGVkIGhlcmUuIEl0IGF2b2lkcyB1bmV4cGVjdGVkIGJlaGF2aW9y IHN1Y2ggYXMgZW5kIG9mIHJlY292ZXJ5IGFzCisJICogc29vbiBhcyBhIGNvbnNpc3RlbnQg c3RhdGUgaXMgcmVhY2hlZCAocmVjb3ZlcnlfdGFyZ2V0KSBhbmQgZmFpbHVyZSBkdWUKKwkg KiB0byBtdWx0aXBsZSByZWNvdmVyeSB0YXJnZXRzIChuYW1lLCB0aW1lLCB4aWQsIExTTiku CisJICovCisJcmVjb3Zlcnljb25mY29udGVudHMgPSBHZW5lcmF0ZVJlY292ZXJ5Q29uZmln KGNvbm4sIE5VTEwpOworCWFwcGVuZFBRRXhwQnVmZmVyKHJlY292ZXJ5Y29uZmNvbnRlbnRz LCAicmVjb3ZlcnlfdGFyZ2V0ID0gJydcbiIpOworCWFwcGVuZFBRRXhwQnVmZmVyKHJlY292 ZXJ5Y29uZmNvbnRlbnRzLAorCQkJCQkgICJyZWNvdmVyeV90YXJnZXRfdGltZWxpbmUgPSAn bGF0ZXN0J1xuIik7CisJYXBwZW5kUFFFeHBCdWZmZXIocmVjb3Zlcnljb25mY29udGVudHMs CisJCQkJCSAgInJlY292ZXJ5X3RhcmdldF9pbmNsdXNpdmUgPSB0cnVlXG4iKTsKKwlhcHBl bmRQUUV4cEJ1ZmZlcihyZWNvdmVyeWNvbmZjb250ZW50cywKKwkJCQkJICAicmVjb3Zlcnlf dGFyZ2V0X2FjdGlvbiA9IHByb21vdGVcbiIpOworCWFwcGVuZFBRRXhwQnVmZmVyKHJlY292 ZXJ5Y29uZmNvbnRlbnRzLCAicmVjb3ZlcnlfdGFyZ2V0X25hbWUgPSAnJ1xuIik7CisJYXBw ZW5kUFFFeHBCdWZmZXIocmVjb3Zlcnljb25mY29udGVudHMsICJyZWNvdmVyeV90YXJnZXRf dGltZSA9ICcnXG4iKTsKKwlhcHBlbmRQUUV4cEJ1ZmZlcihyZWNvdmVyeWNvbmZjb250ZW50 cywgInJlY292ZXJ5X3RhcmdldF94aWQgPSAnJ1xuIik7CisKKwlpZiAoZHJ5X3J1bikKKwl7 CisJCWFwcGVuZFBRRXhwQnVmZmVyKHJlY292ZXJ5Y29uZmNvbnRlbnRzLCAiIyBkcnkgcnVu IG1vZGUiKTsKKwkJYXBwZW5kUFFFeHBCdWZmZXIocmVjb3Zlcnljb25mY29udGVudHMsCisJ CQkJCQkgICJyZWNvdmVyeV90YXJnZXRfbHNuID0gJyVYLyVYJ1xuIiwKKwkJCQkJCSAgTFNO X0ZPUk1BVF9BUkdTKChYTG9nUmVjUHRyKSBJbnZhbGlkWExvZ1JlY1B0cikpOworCX0KKwll bHNlCisJeworCQlhcHBlbmRQUUV4cEJ1ZmZlcihyZWNvdmVyeWNvbmZjb250ZW50cywgInJl Y292ZXJ5X3RhcmdldF9sc24gPSAnJXMnXG4iLAorCQkJCQkJICBjb25zaXN0ZW50X2xzbik7 CisJCVdyaXRlUmVjb3ZlcnlDb25maWcoY29ubiwgb3B0LnN1YnNjcmliZXJfZGlyLCByZWNv dmVyeWNvbmZjb250ZW50cyk7CisJfQorCWRpc2Nvbm5lY3RfZGF0YWJhc2UoY29ubiwgZmFs c2UpOworCisJcGdfbG9nX2RlYnVnKCJyZWNvdmVyeSBwYXJhbWV0ZXJzOlxuJXMiLCByZWNv dmVyeWNvbmZjb250ZW50cy0+ZGF0YSk7CisKKwkvKgorCSAqIFJlc3RhcnQgc3Vic2NyaWJl ciBzbyB0aGUgcmVjb3ZlcnkgcGFyYW1ldGVycyB3aWxsIHRha2UgZWZmZWN0LiBXYWl0CisJ ICogdW50aWwgYWNjZXB0aW5nIGNvbm5lY3Rpb25zLgorCSAqLworCXBnX2xvZ19pbmZvKCJz dG9wcGluZyBhbmQgc3RhcnRpbmcgdGhlIHN1YnNjcmliZXIiKTsKKwlzdG9wX3N0YW5kYnlf c2VydmVyKHBnX2N0bF9wYXRoLCBvcHQuc3Vic2NyaWJlcl9kaXIpOworCXN0YXJ0X3N0YW5k Ynlfc2VydmVyKCZvcHQsIHBnX2N0bF9wYXRoLCBzZXJ2ZXJfc3RhcnRfbG9nLCB0cnVlKTsK KworCS8qIFdhaXRpbmcgdGhlIHN1YnNjcmliZXIgdG8gYmUgcHJvbW90ZWQgKi8KKwl3YWl0 X2Zvcl9lbmRfcmVjb3ZlcnkoZGJpbmZvWzBdLnN1YmNvbm5pbmZvLCBwZ19jdGxfcGF0aCwg Jm9wdCk7CisKKwkvKgorCSAqIENyZWF0ZSB0aGUgc3Vic2NyaXB0aW9uIGZvciBlYWNoIGRh dGFiYXNlIG9uIHN1YnNjcmliZXIuIEl0IGRvZXMgbm90CisJICogZW5hYmxlIGl0IGltbWVk aWF0ZWx5IGJlY2F1c2UgaXQgbmVlZHMgdG8gYWRqdXN0IHRoZSBsb2dpY2FsCisJICogcmVw bGljYXRpb24gc3RhcnQgcG9pbnQgdG8gdGhlIExTTiByZXBvcnRlZCBieSBjb25zaXN0ZW50 X2xzbiAoc2VlCisJICogc2V0X3JlcGxpY2F0aW9uX3Byb2dyZXNzKS4gSXQgYWxzbyBjbGVh bnMgdXAgcHVibGljYXRpb25zIGNyZWF0ZWQgYnkKKwkgKiB0aGlzIHRvb2wgYW5kIHJlcGxp Y2F0aW9uIHRvIHRoZSBzdGFuZGJ5LgorCSAqLworCXNldHVwX3N1YnNjcmliZXIoZGJpbmZv LCBjb25zaXN0ZW50X2xzbik7CisKKwkvKgorCSAqIElmIHRoZSBwcmltYXJ5X3Nsb3RfbmFt ZSBleGlzdHMgb24gcHJpbWFyeSwgZHJvcCBpdC4KKwkgKgorCSAqIFhYWCB3ZSBtaWdodCBu b3QgZmFpbCBoZXJlLiBJbnN0ZWFkLCB3ZSBwcm92aWRlIGEgd2FybmluZyBzbyB0aGUgdXNl cgorCSAqIGV2ZW50dWFsbHkgZHJvcHMgdGhpcyByZXBsaWNhdGlvbiBzbG90IGxhdGVyLgor CSAqLworCWlmIChwcmltYXJ5X3Nsb3RfbmFtZSAhPSBOVUxMKQorCXsKKwkJY29ubiA9IGNv bm5lY3RfZGF0YWJhc2UoZGJpbmZvWzBdLnB1YmNvbm5pbmZvLCBmYWxzZSk7CisJCWlmIChj b25uICE9IE5VTEwpCisJCXsKKwkJCWRyb3BfcmVwbGljYXRpb25fc2xvdChjb25uLCAmZGJp bmZvWzBdLCBwcmltYXJ5X3Nsb3RfbmFtZSk7CisJCQlkaXNjb25uZWN0X2RhdGFiYXNlKGNv bm4sIGZhbHNlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBnX2xvZ193YXJuaW5nKCJjb3Vs ZCBub3QgZHJvcCByZXBsaWNhdGlvbiBzbG90IFwiJXNcIiBvbiBwcmltYXJ5IiwKKwkJCQkJ CSAgIHByaW1hcnlfc2xvdF9uYW1lKTsKKwkJCXBnX2xvZ193YXJuaW5nX2hpbnQoIkRyb3Ag dGhpcyByZXBsaWNhdGlvbiBzbG90IHNvb24gdG8gYXZvaWQgcmV0ZW50aW9uIG9mIFdBTCBm aWxlcy4iKTsKKwkJfQorCX0KKworCS8qIFN0b3AgdGhlIHN1YnNjcmliZXIgKi8KKwlwZ19s b2dfaW5mbygic3RvcHBpbmcgdGhlIHN1YnNjcmliZXIiKTsKKwlzdG9wX3N0YW5kYnlfc2Vy dmVyKHBnX2N0bF9wYXRoLCBvcHQuc3Vic2NyaWJlcl9kaXIpOworCisJLyogQ2hhbmdlIHN5 c3RlbSBpZGVudGlmaWVyIGZyb20gc3Vic2NyaWJlciAqLworCW1vZGlmeV9zdWJzY3JpYmVy X3N5c2lkKHBnX3Jlc2V0d2FsX3BhdGgsICZvcHQpOworCisJLyoKKwkgKiBJbiBkcnkgcnVu IG1vZGUsIHRoZSBzZXJ2ZXIgaXMgcmVzdGFydGVkIHdpdGggdGhlIHByb3ZpZGVkIGNvbW1h bmQtbGluZQorCSAqIG9wdGlvbnMgc28gdmFsaWRhdGlvbiBjYW4gYmUgYXBwbGllZCBpbiB0 aGUgdGFyZ2V0IHNlcnZlci4gSW4gb3JkZXIgdG8KKwkgKiBwcmVzZXJ2ZSB0aGUgaW5pdGlh bCBzdGF0ZSBvZiB0aGUgc2VydmVyIChydW5uaW5nKSwgc3RhcnQgaXQgd2l0aG91dAorCSAq IHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucy4KKwkgKi8KKwlpZiAoZHJ5X3J1bikKKwkJc3Rh cnRfc3RhbmRieV9zZXJ2ZXIoJm9wdCwgcGdfY3RsX3BhdGgsIE5VTEwsIGZhbHNlKTsKKwor CS8qCisJICogVGhlIGxvZyBmaWxlIGlzIGtlcHQgaWYgcmV0YWluIG9wdGlvbiBpcyBzcGVj aWZpZWQgb3IgdGhpcyB0b29sIGRvZXMKKwkgKiBub3QgcnVuIHN1Y2Nlc3NmdWxseS4gT3Ro ZXJ3aXNlLCBsb2cgZmlsZSBpcyByZW1vdmVkLgorCSAqLworCWlmICghZHJ5X3J1biAmJiAh b3B0LnJldGFpbikKKwkJdW5saW5rKHNlcnZlcl9zdGFydF9sb2cpOworCisJc3VjY2VzcyA9 IHRydWU7CisKKwlwZ19sb2dfaW5mbygiRG9uZSEiKTsKKworCXJldHVybiAwOworfQpkaWZm IC0tZ2l0IGEvc3JjL2Jpbi9wZ19iYXNlYmFja3VwL3QvMDQwX3BnX2NyZWF0ZXN1YnNjcmli ZXIucGwgYi9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvdC8wNDBfcGdfY3JlYXRlc3Vic2NyaWJl ci5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi41YTJiOGU5YTU2 Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Jpbi9wZ19iYXNlYmFja3VwL3QvMDQwX3BnX2Ny ZWF0ZXN1YnNjcmliZXIucGwKQEAgLTAsMCArMSwyMTQgQEAKKyMgQ29weXJpZ2h0IChjKSAy MDI0LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorCisjCisjIFRlc3Qg dXNpbmcgYSBzdGFuZGJ5IHNlcnZlciBhcyB0aGUgc3Vic2NyaWJlci4KKwordXNlIHN0cmlj dDsKK3VzZSB3YXJuaW5ncyBGQVRBTCA9PiAnYWxsJzsKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0 OjpDbHVzdGVyOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOwordXNlIFRlc3Q6Ok1v cmU7CisKK3Byb2dyYW1faGVscF9vaygncGdfY3JlYXRlc3Vic2NyaWJlcicpOworcHJvZ3Jh bV92ZXJzaW9uX29rKCdwZ19jcmVhdGVzdWJzY3JpYmVyJyk7Citwcm9ncmFtX29wdGlvbnNf aGFuZGxpbmdfb2soJ3BnX2NyZWF0ZXN1YnNjcmliZXInKTsKKworbXkgJGRhdGFkaXIgPSBQ b3N0Z3JlU1FMOjpUZXN0OjpVdGlsczo6dGVtcGRpcjsKKworIworIyBUZXN0IG1hbmRhdG9y eSBvcHRpb25zCitjb21tYW5kX2ZhaWxzKFsncGdfY3JlYXRlc3Vic2NyaWJlciddLAorCSdu byBzdWJzY3JpYmVyIGRhdGEgZGlyZWN0b3J5IHNwZWNpZmllZCcpOworY29tbWFuZF9mYWls cygKKwlbICdwZ19jcmVhdGVzdWJzY3JpYmVyJywgJy0tcGdkYXRhJywgJGRhdGFkaXIgXSwK Kwknbm8gcHVibGlzaGVyIGNvbm5lY3Rpb24gc3RyaW5nIHNwZWNpZmllZCcpOworY29tbWFu ZF9mYWlscygKKwlbCisJCSdwZ19jcmVhdGVzdWJzY3JpYmVyJywgJy0tdmVyYm9zZScsCisJ CSctLXBnZGF0YScsICRkYXRhZGlyLAorCQknLS1wdWJsaXNoZXItc2VydmVyJywgJ3BvcnQ9 NTQzMicKKwldLAorCSdubyBkYXRhYmFzZSBuYW1lIHNwZWNpZmllZCcpOworCisjIFNldCB1 cCBub2RlIFAgYXMgcHJpbWFyeQorbXkgJG5vZGVfcCA9IFBvc3RncmVTUUw6OlRlc3Q6OkNs dXN0ZXItPm5ldygnbm9kZV9wJyk7Ciskbm9kZV9wLT5pbml0KGFsbG93c19zdHJlYW1pbmcg PT4gJ2xvZ2ljYWwnKTsKKyRub2RlX3AtPnN0YXJ0OworCisjIFNldCB1cCBub2RlIEYgYXMg YWJvdXQtdG8tZmFpbCBub2RlCisjIEZvcmNlIGl0IHRvIGluaXRpYWxpemUgYSBuZXcgY2x1 c3RlciBpbnN0ZWFkIG9mIGNvcHlpbmcgYQorIyBwcmV2aW91c2x5IGluaXRkYidkIGNsdXN0 ZXIuIE5ldyBjbHVzdGVyIGhhcyBhIGRpZmZlcmVudCBzeXN0ZW0gaWRlbnRpZmllciBzbwor IyB3ZSBjYW4gdGVzdCBpZiB0aGUgdGFyZ2V0IGNsdXN0ZXIgaXMgYSBjb3B5IG9mIHRoZSBz b3VyY2UgY2x1c3Rlci4KK215ICRub2RlX2YgPSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVy LT5uZXcoJ25vZGVfZicpOworJG5vZGVfZi0+aW5pdChmb3JjZV9pbml0ZGIgPT4gMSwgYWxs b3dzX3N0cmVhbWluZyA9PiAnbG9naWNhbCcpOworJG5vZGVfZi0+c3RhcnQ7CisKKyMgT24g bm9kZSBQCisjIC0gY3JlYXRlIGRhdGFiYXNlcworIyAtIGNyZWF0ZSB0ZXN0IHRhYmxlcwor IyAtIGluc2VydCBhIHJvdworIyAtIGNyZWF0ZSBhIHBoeXNpY2FsIHJlcGxpY2F0aW9uIHNs b3QKKyRub2RlX3AtPnNhZmVfcHNxbCgKKwkncG9zdGdyZXMnLCBxKAorCUNSRUFURSBEQVRB QkFTRSBwZzE7CisJQ1JFQVRFIERBVEFCQVNFIHBnMjsKKykpOworJG5vZGVfcC0+c2FmZV9w c3FsKCdwZzEnLCAnQ1JFQVRFIFRBQkxFIHRibDEgKGEgdGV4dCknKTsKKyRub2RlX3AtPnNh ZmVfcHNxbCgncGcxJywgIklOU0VSVCBJTlRPIHRibDEgVkFMVUVTKCdmaXJzdCByb3cnKSIp OworJG5vZGVfcC0+c2FmZV9wc3FsKCdwZzInLCAnQ1JFQVRFIFRBQkxFIHRibDIgKGEgdGV4 dCknKTsKK215ICRzbG90bmFtZSA9ICdwaHlzaWNhbF9zbG90JzsKKyRub2RlX3AtPnNhZmVf cHNxbCgncGcyJywKKwkiU0VMRUNUIHBnX2NyZWF0ZV9waHlzaWNhbF9yZXBsaWNhdGlvbl9z bG90KCckc2xvdG5hbWUnKSIpOworCisjIFNldCB1cCBub2RlIFMgYXMgc3RhbmRieSBsaW5r aW5nIHRvIG5vZGUgUAorJG5vZGVfcC0+YmFja3VwKCdiYWNrdXBfMScpOworbXkgJG5vZGVf cyA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygnbm9kZV9zJyk7Ciskbm9kZV9z LT5pbml0X2Zyb21fYmFja3VwKCRub2RlX3AsICdiYWNrdXBfMScsIGhhc19zdHJlYW1pbmcg PT4gMSk7Ciskbm9kZV9zLT5hcHBlbmRfY29uZigKKwkncG9zdGdyZXNxbC5jb25mJywgcXFb CitwcmltYXJ5X3Nsb3RfbmFtZSA9ICckc2xvdG5hbWUnCitdKTsKKyRub2RlX3MtPnNldF9z dGFuZGJ5X21vZGUoKTsKKyRub2RlX3MtPnN0YXJ0OworCisjIFJ1biBwZ19jcmVhdGVzdWJz Y3JpYmVyIG9uIGFib3V0LXRvLWZhaWwgbm9kZSBGCitjb21tYW5kX2ZhaWxzKAorCVsKKwkJ J3BnX2NyZWF0ZXN1YnNjcmliZXInLCAnLS12ZXJib3NlJywKKwkJJy0tcGdkYXRhJywgJG5v ZGVfZi0+ZGF0YV9kaXIsCisJCSctLXB1Ymxpc2hlci1zZXJ2ZXInLCAkbm9kZV9wLT5jb25u c3RyKCdwZzEnKSwKKwkJJy0tc29ja2V0LWRpcmVjdG9yeScsICRub2RlX2YtPmhvc3QsCisJ CSctLXN1YnNjcmliZXItcG9ydCcsICRub2RlX2YtPnBvcnQsCisJCSctLWRhdGFiYXNlJywg J3BnMScsCisJCSctLWRhdGFiYXNlJywgJ3BnMicKKwldLAorCSdzdWJzY3JpYmVyIGRhdGEg ZGlyZWN0b3J5IGlzIG5vdCBhIGNvcHkgb2YgdGhlIHNvdXJjZSBkYXRhYmFzZSBjbHVzdGVy Jyk7CisKKyMgU2V0IHVwIG5vZGUgQyBhcyBzdGFuZGJ5IGxpbmtpbmcgdG8gbm9kZSBTCisk bm9kZV9zLT5iYWNrdXAoJ2JhY2t1cF8yJyk7CitteSAkbm9kZV9jID0gUG9zdGdyZVNRTDo6 VGVzdDo6Q2x1c3Rlci0+bmV3KCdub2RlX2MnKTsKKyRub2RlX2MtPmluaXRfZnJvbV9iYWNr dXAoJG5vZGVfcywgJ2JhY2t1cF8yJywgaGFzX3N0cmVhbWluZyA9PiAxKTsKKyRub2RlX2Mt PnNldF9zdGFuZGJ5X21vZGUoKTsKKyRub2RlX2MtPnN0YXJ0OworCisjIFJ1biBwZ19jcmVh dGVzdWJzY3JpYmVyIG9uIG5vZGUgQyAoUCAtPiBTIC0+IEMpCitjb21tYW5kX2ZhaWxzKAor CVsKKwkJJ3BnX2NyZWF0ZXN1YnNjcmliZXInLCAnLS12ZXJib3NlJywKKwkJJy0tZHJ5LXJ1 bicsICctLXBnZGF0YScsCisJCSRub2RlX2MtPmRhdGFfZGlyLCAnLS1wdWJsaXNoZXItc2Vy dmVyJywKKwkJJG5vZGVfcy0+Y29ubnN0cigncGcxJyksCisJCSctLXNvY2tldC1kaXJlY3Rv cnknLCAkbm9kZV9jLT5ob3N0LAorCQknLS1zdWJzY3JpYmVyLXBvcnQnLCAkbm9kZV9jLT5w b3J0LAorCQknLS1kYXRhYmFzZScsICdwZzEnLAorCQknLS1kYXRhYmFzZScsICdwZzInCisJ XSwKKwkncHJpbWFyeSBzZXJ2ZXIgaXMgaW4gcmVjb3ZlcnknKTsKKworIyBTdG9wIG5vZGUg QworJG5vZGVfYy0+dGVhcmRvd25fbm9kZTsKKworIyBJbnNlcnQgYW5vdGhlciByb3cgb24g bm9kZSBQIGFuZCB3YWl0IG5vZGUgUyB0byBjYXRjaCB1cAorJG5vZGVfcC0+c2FmZV9wc3Fs KCdwZzEnLCAiSU5TRVJUIElOVE8gdGJsMSBWQUxVRVMoJ3NlY29uZCByb3cnKSIpOworJG5v ZGVfcC0+d2FpdF9mb3JfcmVwbGF5X2NhdGNodXAoJG5vZGVfcyk7CisKKyMgZHJ5IHJ1biBt b2RlIG9uIG5vZGUgUworY29tbWFuZF9vaygKKwlbCisJCSdwZ19jcmVhdGVzdWJzY3JpYmVy JywgJy0tdmVyYm9zZScsCisJCSctLWRyeS1ydW4nLCAnLS1wZ2RhdGEnLAorCQkkbm9kZV9z LT5kYXRhX2RpciwgJy0tcHVibGlzaGVyLXNlcnZlcicsCisJCSRub2RlX3AtPmNvbm5zdHIo J3BnMScpLAorCQknLS1zb2NrZXQtZGlyZWN0b3J5JywgJG5vZGVfcy0+aG9zdCwKKwkJJy0t c3Vic2NyaWJlci1wb3J0JywgJG5vZGVfcy0+cG9ydCwKKwkJJy0tZGF0YWJhc2UnLCAncGcx JywKKwkJJy0tZGF0YWJhc2UnLCAncGcyJworCV0sCisJJ3J1biBwZ19jcmVhdGVzdWJzY3Jp YmVyIC0tZHJ5LXJ1biBvbiBub2RlIFMnKTsKKworIyBDaGVjayBpZiBub2RlIFMgaXMgc3Rp bGwgYSBzdGFuZGJ5Citpcygkbm9kZV9zLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJ1NFTEVD VCBwZ19jYXRhbG9nLnBnX2lzX2luX3JlY292ZXJ5KCknKSwKKwkndCcsICdzdGFuZGJ5IGlz IGluIHJlY292ZXJ5Jyk7CisKKyMgcGdfY3JlYXRlc3Vic2NyaWJlciBjYW4gcnVuIHdpdGhv dXQgLS1kYXRhYmFzZXMgb3B0aW9uCitjb21tYW5kX29rKAorCVsKKwkJJ3BnX2NyZWF0ZXN1 YnNjcmliZXInLCAnLS12ZXJib3NlJywKKwkJJy0tZHJ5LXJ1bicsICctLXBnZGF0YScsCisJ CSRub2RlX3MtPmRhdGFfZGlyLCAnLS1wdWJsaXNoZXItc2VydmVyJywKKwkJJG5vZGVfcC0+ Y29ubnN0cigncGcxJyksCisJCSctLXNvY2tldC1kaXJlY3RvcnknLCAkbm9kZV9zLT5ob3N0 LAorCQknLS1zdWJzY3JpYmVyLXBvcnQnLCAkbm9kZV9zLT5wb3J0CisJXSwKKwkncnVuIHBn X2NyZWF0ZXN1YnNjcmliZXIgd2l0aG91dCAtLWRhdGFiYXNlcycpOworCisjIFJ1biBwZ19j cmVhdGVzdWJzY3JpYmVyIG9uIG5vZGUgUworY29tbWFuZF9vaygKKwlbCisJCSdwZ19jcmVh dGVzdWJzY3JpYmVyJywgJy0tdmVyYm9zZScsCisJCSctLXZlcmJvc2UnLCAnLS1wZ2RhdGEn LAorCQkkbm9kZV9zLT5kYXRhX2RpciwgJy0tcHVibGlzaGVyLXNlcnZlcicsCisJCSRub2Rl X3AtPmNvbm5zdHIoJ3BnMScpLAorCQknLS1zb2NrZXQtZGlyZWN0b3J5JywgJG5vZGVfcy0+ aG9zdCwKKwkJJy0tc3Vic2NyaWJlci1wb3J0JywgJG5vZGVfcy0+cG9ydCwKKwkJJy0tZGF0 YWJhc2UnLCAncGcxJywKKwkJJy0tZGF0YWJhc2UnLCAncGcyJworCV0sCisJJ3J1biBwZ19j cmVhdGVzdWJzY3JpYmVyIG9uIG5vZGUgUycpOworCitvayggLWQgJG5vZGVfcy0+ZGF0YV9k aXIgLiAiL3BnX2NyZWF0ZXN1YnNjcmliZXJfb3V0cHV0LmQiLAorCSJwZ19jcmVhdGVzdWJz Y3JpYmVyX291dHB1dC5kLyByZW1vdmVkIGFmdGVyIHBnX2NyZWF0ZXN1YnNjcmliZXIgc3Vj Y2VzcyIKKyk7CisKKyMgQ29uZmlybSB0aGUgcGh5c2ljYWwgcmVwbGljYXRpb24gc2xvdCBo YXMgYmVlbiByZW1vdmVkCitteSAkcmVzdWx0ID0gJG5vZGVfcC0+c2FmZV9wc3FsKCdwZzEn LAorCSJTRUxFQ1QgY291bnQoKikgRlJPTSBwZ19yZXBsaWNhdGlvbl9zbG90cyBXSEVSRSBz bG90X25hbWUgPSAnJHNsb3RuYW1lJyIKKyk7CitpcygkcmVzdWx0LCBxcSgwKSwKKwkndGhl IHBoeXNpY2FsIHJlcGxpY2F0aW9uIHNsb3QgdXNlZCBhcyBwcmltYXJ5X3Nsb3RfbmFtZSBo YXMgYmVlbiByZW1vdmVkJworKTsKKworIyBJbnNlcnQgcm93cyBvbiBQCiskbm9kZV9wLT5z YWZlX3BzcWwoJ3BnMScsICJJTlNFUlQgSU5UTyB0YmwxIFZBTFVFUygndGhpcmQgcm93Jyki KTsKKyRub2RlX3AtPnNhZmVfcHNxbCgncGcyJywgIklOU0VSVCBJTlRPIHRibDIgVkFMVUVT KCdyb3cgMScpIik7CisKKyMgUElEIHNldHMgdG8gdW5kZWZpbmVkIGJlY2F1c2Ugc3Vic2Ny aWJlciB3YXMgc3RvcHBlZCBiZWhpbmQgdGhlIHNjZW5lcy4KKyMgU3RhcnQgc3Vic2NyaWJl cgorJG5vZGVfcy0+e19waWR9ID0gdW5kZWY7Ciskbm9kZV9zLT5zdGFydDsKKworIyBHZXQg c3Vic2NyaXB0aW9uIG5hbWVzCiskcmVzdWx0ID0gJG5vZGVfcy0+c2FmZV9wc3FsKAorCSdw b3N0Z3JlcycsIHFxKAorCVNFTEVDVCBzdWJuYW1lIEZST00gcGdfc3Vic2NyaXB0aW9uIFdI RVJFIHN1Ym5hbWUgfiAnXnBnX2NyZWF0ZXN1YnNjcmliZXJfJworKSk7CitteSBAc3VibmFt ZXMgPSBzcGxpdCgiXG4iLCAkcmVzdWx0KTsKKworIyBXYWl0IHN1YnNjcmliZXIgdG8gY2F0 Y2ggdXAKKyRub2RlX3MtPndhaXRfZm9yX3N1YnNjcmlwdGlvbl9zeW5jKCRub2RlX3AsICRz dWJuYW1lc1swXSk7Ciskbm9kZV9zLT53YWl0X2Zvcl9zdWJzY3JpcHRpb25fc3luYygkbm9k ZV9wLCAkc3VibmFtZXNbMV0pOworCisjIENoZWNrIHJlc3VsdCBvbiBkYXRhYmFzZSBwZzEK KyRyZXN1bHQgPSAkbm9kZV9zLT5zYWZlX3BzcWwoJ3BnMScsICdTRUxFQ1QgKiBGUk9NIHRi bDEnKTsKK2lzKCAkcmVzdWx0LCBxcShmaXJzdCByb3cKK3NlY29uZCByb3cKK3RoaXJkIHJv dyksCisJJ2xvZ2ljYWwgcmVwbGljYXRpb24gd29ya3Mgb24gZGF0YWJhc2UgcGcxJyk7CisK KyMgQ2hlY2sgcmVzdWx0IG9uIGRhdGFiYXNlIHBnMgorJHJlc3VsdCA9ICRub2RlX3MtPnNh ZmVfcHNxbCgncGcyJywgJ1NFTEVDVCAqIEZST00gdGJsMicpOworaXMoJHJlc3VsdCwgcXEo cm93IDEpLCAnbG9naWNhbCByZXBsaWNhdGlvbiB3b3JrcyBvbiBkYXRhYmFzZSBwZzInKTsK KworIyBEaWZmZXJlbnQgc3lzdGVtIGlkZW50aWZpZXI/CitteSAkc3lzaWRfcCA9ICRub2Rl X3AtPnNhZmVfcHNxbCgncG9zdGdyZXMnLAorCSdTRUxFQ1Qgc3lzdGVtX2lkZW50aWZpZXIg RlJPTSBwZ19jb250cm9sX3N5c3RlbSgpJyk7CitteSAkc3lzaWRfcyA9ICRub2RlX3MtPnNh ZmVfcHNxbCgncG9zdGdyZXMnLAorCSdTRUxFQ1Qgc3lzdGVtX2lkZW50aWZpZXIgRlJPTSBw Z19jb250cm9sX3N5c3RlbSgpJyk7Citvaygkc3lzaWRfcCAhPSAkc3lzaWRfcywgJ3N5c3Rl bSBpZGVudGlmaWVyIHdhcyBjaGFuZ2VkJyk7CisKKyMgY2xlYW4gdXAKKyRub2RlX3AtPnRl YXJkb3duX25vZGU7Ciskbm9kZV9zLT50ZWFyZG93bl9ub2RlOworJG5vZGVfZi0+dGVhcmRv d25fbm9kZTsKKworZG9uZV90ZXN0aW5nKCk7Ci0tIAoyLjMwLjIKCg== --6ea8fa9c7f69458b892b1878d0005ba3--