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 1rXZx0-00BMqa-CP for pgsql-hackers@arkaria.postgresql.org; Wed, 07 Feb 2024 04:54:23 +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 1rXZwx-0080ld-Ju for pgsql-hackers@arkaria.postgresql.org; Wed, 07 Feb 2024 04:54:19 +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 1rXZww-0080lT-54 for pgsql-hackers@lists.postgresql.org; Wed, 07 Feb 2024 04:54:19 +0000 Received: from wfhigh2-smtp.messagingengine.com ([64.147.123.153]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rXZwp-005Teu-TH for pgsql-hackers@lists.postgresql.org; Wed, 07 Feb 2024 04:54:16 +0000 Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailfhigh.west.internal (Postfix) with ESMTP id 5F4C71800078; Tue, 6 Feb 2024 23:54:09 -0500 (EST) Received: from imap49 ([10.202.2.99]) by compute2.internal (MEProxy); Tue, 06 Feb 2024 23:54:10 -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=fm1; t=1707281648; x=1707368048; bh=W95IDahEo1 CWfbH6iSOJJ6ki43w4Kr+UurgQcAk7ChI=; b=Cm3w/mjVNdP0jIVOgXHRjZ7H6e mDopNfHL7W0oK/c0Nv0d1yXd0GieUjOV3CwL9j2YBfybHIkvKm70dvAzB+1YRLjm CWX+z3quyYXjELEpe7TV/3Z6yL4SMIoVOGitN+EHMEVWMDeeOU+sWGUJz7MCBh5g grGGGgB02wyzxF2ugEs4JsHUeR4YdC7kSqEkAbDMfR3lsJIyq/aq2NSwrBq8IN5l wQN5ZiSjOZf1JFMDEb4G/nr0ZXSgBkDvgT93BoxXtNroiu3U0KVkZF0ixElgxyDO gmJ/ikal3aaKK5slt8pB8DTJgxgDgbu2B1J9VS0UlGbucQ2O1/WVCWgXk54Q== 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= fm3; t=1707281648; x=1707368048; bh=W95IDahEo1CWfbH6iSOJJ6ki43w4 Kr+UurgQcAk7ChI=; b=rjb0Q4Jp8IQfehSRnu8AicQtITvhkDijR7LOe4A2DbPp y8WwlIQcyTm258QWu+MC2g1RxfROFCi0NgfoHsttSig9zAaS0vMnkC+AIQ1xUmoy 73HSK0tlnCidHCppYzcFPW/OZPJqsX+lbT1PCPvC91cLoX98UMr6LsWOlzi7EwSe sF6W/byI9/CyXAif9oCVzc5isWgnPvMXgAZ19AB+GjhIHlXFhQJjI8LJTVw3Sn1a 1jL3dhFLGbsDBetqQwN/QBNFN9Ha9tl7WYe3zhjz6lMV0Zup7/080b9est4hLaqM rpvzcvuzuZ9h6qfh/NrJy54legyNor7c/gBePLbRCw== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvledrtddugdejhecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefofgggkfgjfhffhffvvefutgesmhdtreerreertdenucfhrhhomhepfdfguhhl vghrucfvrghvvghirhgrfdcuoegvuhhlvghrsegvuhhlvghrthhordgtohhmqeenucggtf frrghtthgvrhhnpeeuhfejfedufeefuefgheetledvgeekkeeuueduvefgudfhlefghfel ueehtdeihfenucffohhmrghinhepvghnthgvrhhprhhishgvuggsrdgtohhmnecuvehluh hsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepvghulhgvrhesvghu lhgvrhhtohdrtghomh X-ME-Proxy: Feedback-ID: i0c21471d:Fastmail Received: by mailuser.nyi.internal (Postfix, from userid 501) id 7CAB415A0092; Tue, 6 Feb 2024 23:54:08 -0500 (EST) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.11.0-alpha0-144-ge5821d614e-fm-20240125.002-ge5821d61 MIME-Version: 1.0 Message-Id: <370673e8-e2da-4249-8f07-cb67e9d9c20e@app.fastmail.com> In-Reply-To: References: <9a9c7e65-c47b-4400-a63e-ac6169c0860e@app.fastmail.com> <8d8d9960-8130-4216-b0e4-adf36b8b1c43@app.fastmail.com> Date: Wed, 07 Feb 2024 01:53:37 -0300 From: "Euler Taveira" To: "kuroda.hayato@fujitsu.com" , =?UTF-8?Q?Fabr=C3=ADzio_de_Royes_Mello?= Cc: "pgsql-hackers@lists.postgresql.org" , "vignesh C" , "Michael Paquier" , "Peter Eisentraut" , "Andres Freund" , "Ashutosh Bapat" , "Amit Kapila" , "Shlok Kyal" Subject: Re: speed up a logical replica setup Content-Type: multipart/mixed; boundary=d24a19afbdcb42d1975b6ae6885b656c List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --d24a19afbdcb42d1975b6ae6885b656c Content-Type: multipart/alternative; boundary=e6cdacd1b9474282ad3bb454630ea260 --e6cdacd1b9474282ad3bb454630ea260 Content-Type: text/plain On Fri, Feb 2, 2024, at 6:41 AM, Hayato Kuroda (Fujitsu) wrote: > Thanks for updating the patch! Thanks for taking a look. > > > I'm still working on the data structures to group options. I don't like the way > it was grouped in v13-0005. There is too many levels to reach database name. > The setup_subscriber() function requires the 3 data structures. > > > > Right, your refactoring looks fewer stack. So I pause to revise my refactoring > patch. I didn't complete this task yet so I didn't include it in this patch. > > > The documentation update is almost there. I will include the modifications in > the next patch. > > > > OK. I think it should be modified before native speakers will attend to the > thread. Same for this one. > > > Regarding v13-0004, it seems a good UI that's why I wrote a comment about it. > However, it comes with a restriction that requires a similar HBA rule for both > regular and replication connections. Is it an acceptable restriction? We might > paint ourselves into the corner. A reasonable proposal is not to remove this > option. Instead, it should be optional. If it is not provided, primary_conninfo > is used. > > > > I didn't have such a point of view. However, it is not related whether -P exists > or not. Even v14-0001 requires primary to accept both normal/replication connections. > If we want to avoid it, the connection from pg_createsubscriber can be restored > to replication-connection. > (I felt we do not have to use replication protocol even if we change the connection mode) That's correct. We made a decision to use non physical replication connections (besides the one used to connect primary <-> standby). Hence, my concern about a HBA rule falls apart. I'm not convinced that using a modified primary_conninfo is the only/right answer to fill the subscription connection string. Physical vs logical replication has different requirements when we talk about users. The physical replication requires only the REPLICATION privilege. On the other hand, to create a subscription you must have the privileges of pg_create_subscription role and also CREATE privilege on the specified database. Unless, you are always recommending the superuser for this tool, I'm afraid there will be cases that reusing primary_conninfo will be an issue. The more I think about this UI, the more I think that, if it is not hundreds of lines of code, it uses the primary_conninfo the -P is not specified. > The motivation why -P is not needed is to ensure the consistency of nodes. > pg_createsubscriber assumes that the -P option can connect to the upstream node, > but no one checks it. Parsing two connection strings may be a solution but be > confusing. E.g., what if some options are different? > I think using a same parameter is a simplest solution. Ugh. An error will occur the first time (get_primary_sysid) it tries to connect to primary. > I found that no one refers the name of temporary slot. Can we remove the variable? It is gone. I did a refactor in the create_logical_replication_slot function. Slot name is assigned internally (no need for slot_name or temp_replslot) and temporary parameter is included. > Initialization by `CreateSubscriberOptions opt = {0};` seems enough. > All values are set to 0x0. It is. However, I keep the assignments for 2 reasons: (a) there might be parameters whose default value is not zero, (b) the standard does not say that a null pointer must be represented by zero and (c) there is no harm in being paranoid during initial assignment. > You said "target server must be a standby" in [1], but I cannot find checks for it. > IIUC, there are two approaches: > a) check the existence "standby.signal" in the data directory > b) call an SQL function "pg_is_in_recovery" I applied v16-0004 that implements option (b). > I still think they can be combined as "bindir". I applied a patch that has a single variable for BINDIR. > WriteRecoveryConfig() writes GUC parameters to postgresql.auto.conf, but not > sure it is good. These settings would remain on new subscriber even after the > pg_createsubscriber. Can we avoid it? I come up with passing these parameters > via pg_ctl -o option, but it requires parsing output from GenerateRecoveryConfig() > (all GUCs must be allign like "-c XXX -c XXX -c XXX..."). I applied a modified version of v16-0006. > Functions arguments should not be struct because they are passing by value. > They should be a pointer. Or, for modify_subscriber_sysid and wait_for_end_recovery, > we can pass a value which would be really used. Done. > 07. > ``` > static char *get_base_conninfo(char *conninfo, char *dbname, > const char *noderole); > ``` > > Not sure noderole should be passed here. It is used only for the logging. > Can we output string before calling the function? > (The parameter is not needed anymore if -P is removed) Done. > 08. > The terminology is still not consistent. Some functions call the target as standby, > but others call it as subscriber. The terminology should reflect the actual server role. I'm calling it "standby" if it is a physical replica and "subscriber" if it is a logical replica. Maybe "standby" isn't clear enough. > 09. > v14 does not work if the standby server has already been set recovery_target* > options. PSA the reproducer. I considered two approaches: > > a) raise an ERROR when these parameter were set. check_subscriber() can do it > b) overwrite these GUCs as empty strings. I prefer (b) that's exactly what you provided in v16-0006. > 10. > The execution always fails if users execute --dry-run just before. Because > pg_createsubscriber stops the standby anyway. Doing dry run first is quite normal > use-case, so current implementation seems not user-friendly. How should we fix? > Below bullets are my idea: > > a) avoid stopping the standby in case of dry_run: seems possible. > b) accept even if the standby is stopped: seems possible. > c) start the standby at the end of run: how arguments like pg_ctl -l should be specified? I prefer (a). I applied a slightly modified version of v16-0005. This new patch contains the following changes: * check whether the target is really a standby server (0004) * refactor: pg_create_logical_replication_slot function * use a single variable for pg_ctl and pg_resetwal directory * avoid recovery errors applying default settings for some GUCs (0006) * don't stop/start the standby in dry run mode (0005) * miscellaneous fixes I don't understand why v16-0002 is required. In a previous version, this patch was using connections in logical replication mode. After some discussion we decided to change it to regular connections and use SQL functions (instead of replication commands). Is it a requirement for v16-0003? I started reviewing v16-0007 but didn't finish yet. The general idea is ok. However, I'm still worried about preventing some use cases if it provides only the local connection option. What if you want to keep monitoring this instance while the transformation is happening? Let's say it has a backlog that will take some time to apply. Unless, you have a local agent, you have no data about this server until pg_createsubscriber terminates. Even the local agent might not connect to the server unless you use the current port. -- Euler Taveira EDB https://www.enterprisedb.com/ --e6cdacd1b9474282ad3bb454630ea260 Content-Type: text/html Content-Transfer-Encoding: quoted-printable
On Fri, Feb 2, = 2024, at 6:41 AM, Hayato Kuroda (Fujitsu) wrote:
Thanks for updating the patch!
=

Thanks for taking a look.

>= ;
I'm still working on the data structures to group option= s. I don't like the way
it was grouped in v13-0005. There = is too many levels to reach database name.
The setup_subsc= riber() function requires the 3 data structures.
>
<= /div>

Right, your refactoring looks fewer stack. So I= pause to revise my refactoring
patch.

I didn't complete this task yet so I didn't inclu= de it in this patch.

>
The documentation update is = almost there. I will include the modifications in
the next= patch.
>

OK. I think it s= hould be modified before native speakers will attend to the
thread.

Same for this one.

>
Regarding v13-0004, it seems a good UI that's why = I wrote a comment about it.
However, it comes with a restr= iction that requires a similar HBA rule for both
regular a= nd replication connections. Is it an acceptable restriction? We might
paint ourselves into the corner. A reasonable proposal is no= t to remove this
option. Instead, it should be optional. I= f it is not provided, primary_conninfo
is used.
<= div>>

I didn't have such a point of view= . However, it is not related whether -P exists
or not. Eve= n v14-0001 requires primary to accept both normal/replication connection= s.
If we want to avoid it, the connection from pg_createsu= bscriber can be restored
to replication-connection.
(I felt we do not have to use replication protocol even if we ch= ange the connection mode)

That= 's correct. We made a decision to use non physical replication connectio= ns
(besides the one used to connect primary <-> stan= dby). Hence, my concern about
a HBA rule falls apart. I'm = not convinced that using a modified
primary_conninfo is th= e only/right answer to fill the subscription connection
st= ring. Physical vs logical replication has different requirements when we= talk
about users. The physical replication requires only = the REPLICATION privilege.
On the other hand, to create a = subscription you must have the privileges of
pg_create_sub= scription role and also CREATE privilege on the specified
= database. Unless, you are always recommending the superuser for this too= l, I'm
afraid there will be cases that reusing primary_con= ninfo will be an issue. The
more I think about this UI, th= e more I think that, if it is not hundreds of
lines of cod= e, it uses the primary_conninfo the -P is not specified.
<= br>
The motivat= ion why -P is not needed is to ensure the consistency of nodes.
pg_createsubscriber assumes that the -P option can connect to the = upstream node,
but no one checks it. Parsing two connectio= n strings may be a solution but be
confusing. E.g., what i= f some options are different?
I think using a same paramet= er is a simplest solution.

Ugh= . An error will occur the first time (get_primary_sysid) it tries to con= nect
to primary.

I found that no one refers the name of = temporary slot. Can we remove the variable?
<= br>
It is gone. I did a refactor in the create_logical_replica= tion_slot function.
Slot name is assigned internally (no n= eed for slot_name or temp_replslot) and
temporary paramete= r is included.

Initialization by `CreateSubscriberOptions opt =3D {0= };` seems enough.
All values are set to 0x0.

It is. However, I keep the assignments for = 2 reasons: (a) there might be
parameters whose default val= ue is not zero, (b) the standard does not say that
a null = pointer must be represented by zero and (c) there is no harm in being
paranoid during initial assignment.

=
You said "target ser= ver must be a standby" in [1], but I cannot find checks for it.
IIUC, there are two approaches:
a) check the existen= ce "standby.signal" in the data directory
b) call an SQL f= unction "pg_is_in_recovery"

I = applied v16-0004 that implements option (b).

I still think they can = be combined as "bindir".

I app= lied a patch that has a single variable for BINDIR.

WriteRecoveryCon= fig() writes GUC parameters to postgresql.auto.conf, but not
sure it is good. These settings would remain on new subscriber even a= fter the
pg_createsubscriber. Can we avoid it? I come up w= ith passing these parameters
via pg_ctl -o option, but it = requires parsing output from GenerateRecoveryConfig()
(all= GUCs must be allign like "-c XXX -c XXX -c XXX...").

I applied a modified version of v16-0006.

Fu= nctions arguments should not be struct because they are passing by value= .
They should be a pointer. Or, for modify_subscriber_sysi= d and wait_for_end_recovery,
we can pass a value which wou= ld be really used.

Done.

0= 7.
```
static char *get_base_conninfo(char *= conninfo, char *dbname,
   const char *noderole)= ;
```

Not sure noderole shoul= d be passed here. It is used only for the logging.
Can we = output string before calling the function?
(The parameter = is not needed anymore if -P is removed)

<= /div>
Done.

08.
The terminology is still not consi= stent. Some functions call the target as standby,
but othe= rs call it as subscriber.

The = terminology should reflect the actual server role. I'm calling it "stand= by"
if it is a physical replica and "subscriber" if it is = a logical replica. Maybe
"standby" isn't clear enough.
=

09.
v14 does not work if the standby server has already b= een set recovery_target*
options. PSA the reproducer. I co= nsidered two approaches:

a) raise an ERROR = when these parameter were set. check_subscriber() can do it
b) overwrite these GUCs as empty strings. 
=

I prefer (b) that's exactly what you provided in v16= -0006. 

10.
The execution always fails if users e= xecute --dry-run just before. Because
pg_createsubscriber = stops the standby anyway. Doing dry run first is quite normal
<= div>use-case, so current implementation seems not user-friendly. How sho= uld we fix?
Below bullets are my idea:

<= /div>
a) avoid stopping the standby in case of dry_run: seems possib= le.
b) accept even if the standby is stopped: seems possib= le.
c) start the standby at the end of run: how arguments = like pg_ctl -l should be specified?

I prefer (a). I applied a slightly modified version of v16-0005.

This new patch contains the following change= s:

* check whether the target is really a s= tandby server (0004)
* refactor: pg_create_logical_replica= tion_slot function
* use a single variable for pg_ctl and = pg_resetwal directory
* avoid recovery errors applying def= ault settings for some GUCs (0006)
* don't stop/start the = standby in dry run mode (0005)
* miscellaneous fixes

I don't understand why v16-0002 is required. In = a previous version, this patch
was using connections in lo= gical replication mode. After some discussion we
decided t= o change it to regular connections and use SQL functions (instead of
=
replication commands). Is it a requirement for v16-0003?
<= /div>

I started reviewing v16-0007 but didn't finish = yet. The general idea is ok.
However, I'm still worried ab= out preventing some use cases if it provides only
the loca= l connection option. What if you want to keep monitoring this instance
while the transformation is happening? Let's say it has a b= acklog that will
take some time to apply. Unless, you have= a local agent, you have no data about
this server until p= g_createsubscriber terminates. Even the local agent might
= not connect to the server unless you use the current port.


--
Euler Taveira

--e6cdacd1b9474282ad3bb454630ea260-- --d24a19afbdcb42d1975b6ae6885b656c Content-Disposition: attachment; filename*0="v17-0001-Creates-a-new-logical-replica-from-a-standby-ser.pat"; filename*1="ch" Content-Type: text/x-patch; name="=?UTF-8?Q?v17-0001-Creates-a-new-logical-replica-from-a-standby-ser.patc?= =?UTF-8?Q?h?=" Content-Transfer-Encoding: BASE64 RnJvbSBhZTVhMGVmZTZiMDA1NmZiMTA4YzM3NjRmZTk5Y2FlYmMwNTU0Zjc2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBFdWxlciBUYXZlaXJhIDxldWxlci50YXZlaXJhQGVu dGVycHJpc2VkYi5jb20+CkRhdGU6IE1vbiwgNSBKdW4gMjAyMyAxNDozOTo0MCAtMDQwMApT dWJqZWN0OiBbUEFUQ0ggdjE3XSBDcmVhdGVzIGEgbmV3IGxvZ2ljYWwgcmVwbGljYSBmcm9t IGEgc3RhbmRieSBzZXJ2ZXIKCkEgbmV3IHRvb2wgY2FsbGVkIHBnX2NyZWF0ZXN1YnNjcmli ZXIgY2FuIGNvbnZlcnQgYSBwaHlzaWNhbCByZXBsaWNhCmludG8gYSBsb2dpY2FsIHJlcGxp Y2EuIEl0IHJ1bnMgb24gdGhlIHRhcmdldCBzZXJ2ZXIgYW5kIHNob3VsZCBiZSBhYmxlCnRv IGNvbm5lY3QgdG8gdGhlIHNvdXJjZSBzZXJ2ZXIgKHB1Ymxpc2hlcikgYW5kIHRoZSB0YXJn ZXQgc2VydmVyCihzdWJzY3JpYmVyKS4KClRoZSBjb252ZXJzaW9uIHJlcXVpcmVzIGEgZmV3 IHN0ZXBzLiBDaGVjayBpZiB0aGUgdGFyZ2V0IGRhdGEgZGlyZWN0b3J5CmhhcyB0aGUgc2Ft ZSBzeXN0ZW0gaWRlbnRpZmllciB0aGFuIHRoZSBzb3VyY2UgZGF0YSBkaXJlY3RvcnkuIFN0 b3AgdGhlCnRhcmdldCBzZXJ2ZXIgaWYgaXQgaXMgcnVubmluZyBhcyBhIHN0YW5kYnkgc2Vy dmVyLiBDcmVhdGUgb25lCnJlcGxpY2F0aW9uIHNsb3QgcGVyIHNwZWNpZmllZCBkYXRhYmFz ZSBvbiB0aGUgc291cmNlIHNlcnZlci4gT25lCmFkZGl0aW9uYWwgcmVwbGljYXRpb24gc2xv dCBpcyBjcmVhdGVkIGF0IHRoZSBlbmQgdG8gZ2V0IHRoZSBjb25zaXN0ZW50CkxTTiAoVGhp cyBjb25zaXN0ZW50IExTTiB3aWxsIGJlIHVzZWQgYXMgKGEpIGEgc3RvcHBpbmcgcG9pbnQg Zm9yIHRoZQpyZWNvdmVyeSBwcm9jZXNzIGFuZCAoYikgYSBzdGFydGluZyBwb2ludCBmb3Ig dGhlIHN1YnNjcmlwdGlvbnMpLiBXcml0ZQpyZWNvdmVyeSBwYXJhbWV0ZXJzIGludG8gdGhl IHRhcmdldCBkYXRhIGRpcmVjdG9yeSBhbmQgc3RhcnQgdGhlIHRhcmdldApzZXJ2ZXIgKFdh aXQgdW50aWwgdGhlIHRhcmdldCBzZXJ2ZXIgaXMgcHJvbW90ZWQpLiBDcmVhdGUgb25lCnB1 YmxpY2F0aW9uIChGT1IgQUxMIFRBQkxFUykgcGVyIHNwZWNpZmllZCBkYXRhYmFzZSBvbiB0 aGUgc291cmNlCnNlcnZlci4gQ3JlYXRlIG9uZSBzdWJzY3JpcHRpb24gcGVyIHNwZWNpZmll ZCBkYXRhYmFzZSBvbiB0aGUgdGFyZ2V0CnNlcnZlciAoVXNlIHJlcGxpY2F0aW9uIHNsb3Qg YW5kIHB1YmxpY2F0aW9uIGNyZWF0ZWQgaW4gYSBwcmV2aW91cyBzdGVwLgpEb24ndCBlbmFi bGUgdGhlIHN1YnNjcmlwdGlvbnMgeWV0KS4gU2V0cyB0aGUgcmVwbGljYXRpb24gcHJvZ3Jl c3MgdG8KdGhlIGNvbnNpc3RlbnQgTFNOIHRoYXQgd2FzIGdvdCBpbiBhIHByZXZpb3VzIHN0 ZXAuIEVuYWJsZSB0aGUKc3Vic2NyaXB0aW9uIGZvciBlYWNoIHNwZWNpZmllZCBkYXRhYmFz ZSBvbiB0aGUgdGFyZ2V0IHNlcnZlci4gIFN0b3AgdGhlCnRhcmdldCBzZXJ2ZXIuIENoYW5n ZSB0aGUgc3lzdGVtIGlkZW50aWZpZXIgZnJvbSB0aGUgdGFyZ2V0IHNlcnZlci4KCkRlcGVu ZGluZyBvbiB5b3VyIHdvcmtsb2FkIGFuZCBkYXRhYmFzZSBzaXplLCBjcmVhdGluZyBhIGxv Z2ljYWwgcmVwbGljYQpjb3VsZG4ndCBiZSBhbiBvcHRpb24gZHVlIHRvIHJlc291cmNlIGNv bnN0cmFpbnRzIChXQUwgYmFja2xvZyBzaG91bGQgYmUKYXZhaWxhYmxlIHVudGlsIGFsbCB0 YWJsZSBkYXRhIGlzIHN5bmNocm9uaXplZCkuIFRoZSBpbml0aWFsIGRhdGEgY29weQphbmQg dGhlIHJlcGxpY2F0aW9uIHByb2dyZXNzIHRlbmRzIHRvIGJlIGZhc3RlciBvbiBhIHBoeXNp Y2FsIHJlcGxpY2EuClRoZSBwdXJwb3NlIG9mIHRoaXMgdG9vbCBpcyB0byBzcGVlZCB1cCBh IGxvZ2ljYWwgcmVwbGljYSBzZXR1cC4KLS0tCiBkb2Mvc3JjL3NnbWwvcmVmL2FsbGZpbGVz LnNnbWwgICAgICAgICAgICAgICAgfCAgICAxICsKIGRvYy9zcmMvc2dtbC9yZWYvcGdfY3Jl YXRlc3Vic2NyaWJlci5zZ21sICAgICB8ICAzMjAgKysrCiBkb2Mvc3JjL3NnbWwvcmVmZXJl bmNlLnNnbWwgICAgICAgICAgICAgICAgICAgfCAgICAxICsKIHNyYy9iaW4vcGdfYmFzZWJh Y2t1cC8uZ2l0aWdub3JlICAgICAgICAgICAgICB8ICAgIDEgKwogc3JjL2Jpbi9wZ19iYXNl YmFja3VwL01ha2VmaWxlICAgICAgICAgICAgICAgIHwgICAgOCArLQogc3JjL2Jpbi9wZ19i YXNlYmFja3VwL21lc29uLmJ1aWxkICAgICAgICAgICAgIHwgICAxOSArCiBzcmMvYmluL3Bn X2Jhc2ViYWNrdXAvcGdfY3JlYXRlc3Vic2NyaWJlci5jICAgfCAxODY5ICsrKysrKysrKysr KysrKysrCiAuLi4vdC8wNDBfcGdfY3JlYXRlc3Vic2NyaWJlci5wbCAgICAgICAgICAgICAg fCAgIDQ0ICsKIC4uLi90LzA0MV9wZ19jcmVhdGVzdWJzY3JpYmVyX3N0YW5kYnkucGwgICAg ICB8ICAxMzUgKysKIHNyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0ICAgICAgICAg ICAgICB8ICAgIDIgKwogMTAgZmlsZXMgY2hhbmdlZCwgMjM5OSBpbnNlcnRpb25zKCspLCAx IGRlbGV0aW9uKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZG9jL3NyYy9zZ21sL3JlZi9wZ19j cmVhdGVzdWJzY3JpYmVyLnNnbWwKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvYmluL3BnX2Jh c2ViYWNrdXAvcGdfY3JlYXRlc3Vic2NyaWJlci5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3Jj L2Jpbi9wZ19iYXNlYmFja3VwL3QvMDQwX3BnX2NyZWF0ZXN1YnNjcmliZXIucGwKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBzcmMvYmluL3BnX2Jhc2ViYWNrdXAvdC8wNDFfcGdfY3JlYXRlc3Vi c2NyaWJlcl9zdGFuZGJ5LnBsCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL3JlZi9hbGxm aWxlcy5zZ21sIGIvZG9jL3NyYy9zZ21sL3JlZi9hbGxmaWxlcy5zZ21sCmluZGV4IDRhNDI5 OTliMTguLmEyYjVlZWEwZTAgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9yZWYvYWxsZmls ZXMuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvcmVmL2FsbGZpbGVzLnNnbWwKQEAgLTIxNCw2 ICsyMTQsNyBAQCBDb21wbGV0ZSBsaXN0IG9mIHVzYWJsZSBzZ21sIHNvdXJjZSBmaWxlcyBp biB0aGlzIGRpcmVjdG9yeS4KIDwhRU5USVRZIHBnUmVzZXR3YWwgICAgICAgICBTWVNURU0g InBnX3Jlc2V0d2FsLnNnbWwiPgogPCFFTlRJVFkgcGdSZXN0b3JlICAgICAgICAgIFNZU1RF TSAicGdfcmVzdG9yZS5zZ21sIj4KIDwhRU5USVRZIHBnUmV3aW5kICAgICAgICAgICBTWVNU RU0gInBnX3Jld2luZC5zZ21sIj4KKzwhRU5USVRZIHBnQ3JlYXRlU3Vic2NyaWJlciBTWVNU RU0gInBnX2NyZWF0ZXN1YnNjcmliZXIuc2dtbCI+CiA8IUVOVElUWSBwZ1ZlcmlmeUJhY2t1 cCAgICAgU1lTVEVNICJwZ192ZXJpZnliYWNrdXAuc2dtbCI+CiA8IUVOVElUWSBwZ3Rlc3Rm c3luYyAgICAgICAgU1lTVEVNICJwZ3Rlc3Rmc3luYy5zZ21sIj4KIDwhRU5USVRZIHBndGVz dHRpbWluZyAgICAgICBTWVNURU0gInBndGVzdHRpbWluZy5zZ21sIj4KZGlmZiAtLWdpdCBh L2RvYy9zcmMvc2dtbC9yZWYvcGdfY3JlYXRlc3Vic2NyaWJlci5zZ21sIGIvZG9jL3NyYy9z Z21sL3JlZi9wZ19jcmVhdGVzdWJzY3JpYmVyLnNnbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMC4uZjUyMzg3NzFiNwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9z cmMvc2dtbC9yZWYvcGdfY3JlYXRlc3Vic2NyaWJlci5zZ21sCkBAIC0wLDAgKzEsMzIwIEBA Cis8IS0tCitkb2Mvc3JjL3NnbWwvcmVmL3BnX2NyZWF0ZXN1YnNjcmliZXIuc2dtbAorUG9z dGdyZVNRTCBkb2N1bWVudGF0aW9uCistLT4KKworPHJlZmVudHJ5IGlkPSJhcHAtcGdjcmVh dGVzdWJzY3JpYmVyIj4KKyA8aW5kZXh0ZXJtIHpvbmU9ImFwcC1wZ2NyZWF0ZXN1YnNjcmli ZXIiPgorICA8cHJpbWFyeT5wZ19jcmVhdGVzdWJzY3JpYmVyPC9wcmltYXJ5PgorIDwvaW5k ZXh0ZXJtPgorCisgPHJlZm1ldGE+CisgIDxyZWZlbnRyeXRpdGxlPjxhcHBsaWNhdGlvbj5w Z19jcmVhdGVzdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj48L3JlZmVudHJ5dGl0bGU+CisgIDxt YW52b2xudW0+MTwvbWFudm9sbnVtPgorICA8cmVmbWlzY2luZm8+QXBwbGljYXRpb248L3Jl Zm1pc2NpbmZvPgorIDwvcmVmbWV0YT4KKworIDxyZWZuYW1lZGl2PgorICA8cmVmbmFtZT5w Z19jcmVhdGVzdWJzY3JpYmVyPC9yZWZuYW1lPgorICA8cmVmcHVycG9zZT5jb252ZXJ0IGEg cGh5c2ljYWwgcmVwbGljYSBpbnRvIGEgbmV3IGxvZ2ljYWwgcmVwbGljYTwvcmVmcHVycG9z ZT4KKyA8L3JlZm5hbWVkaXY+CisKKyA8cmVmc3lub3BzaXNkaXY+CisgIDxjbWRzeW5vcHNp cz4KKyAgIDxjb21tYW5kPnBnX2NyZWF0ZXN1YnNjcmliZXI8L2NvbW1hbmQ+CisgICA8YXJn IHJlcD0icmVwZWF0Ij48cmVwbGFjZWFibGU+b3B0aW9uPC9yZXBsYWNlYWJsZT48L2FyZz4K KyAgIDxncm91cCBjaG9pY2U9InBsYWluIj4KKyAgICA8Z3JvdXAgY2hvaWNlPSJyZXEiPgor ICAgICA8YXJnIGNob2ljZT0icGxhaW4iPjxvcHRpb24+LUQ8L29wdGlvbj4gPC9hcmc+Cisg ICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+PG9wdGlvbj4tLXBnZGF0YTwvb3B0aW9uPjwvYXJn PgorICAgIDwvZ3JvdXA+CisgICAgPHJlcGxhY2VhYmxlPmRhdGFkaXI8L3JlcGxhY2VhYmxl PgorICAgIDxncm91cCBjaG9pY2U9InJlcSI+CisgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+ PG9wdGlvbj4tUDwvb3B0aW9uPjwvYXJnPgorICAgICA8YXJnIGNob2ljZT0icGxhaW4iPjxv cHRpb24+LS1wdWJsaXNoZXItc2VydmVyPC9vcHRpb24+PC9hcmc+CisgICAgPC9ncm91cD4K KyAgICA8cmVwbGFjZWFibGU+Y29ubnN0cjwvcmVwbGFjZWFibGU+CisgICAgPGdyb3VwIGNo b2ljZT0icmVxIj4KKyAgICAgPGFyZyBjaG9pY2U9InBsYWluIj48b3B0aW9uPi1TPC9vcHRp b24+PC9hcmc+CisgICAgIDxhcmcgY2hvaWNlPSJwbGFpbiI+PG9wdGlvbj4tLXN1YnNjcmli ZXItc2VydmVyPC9vcHRpb24+PC9hcmc+CisgICAgPC9ncm91cD4KKyAgICA8cmVwbGFjZWFi bGU+Y29ubnN0cjwvcmVwbGFjZWFibGU+CisgICAgPGdyb3VwIGNob2ljZT0icmVxIj4KKyAg ICAgPGFyZyBjaG9pY2U9InBsYWluIj48b3B0aW9uPi1kPC9vcHRpb24+PC9hcmc+CisgICAg IDxhcmcgY2hvaWNlPSJwbGFpbiI+PG9wdGlvbj4tLWRhdGFiYXNlPC9vcHRpb24+PC9hcmc+ CisgICAgPC9ncm91cD4KKyAgICA8cmVwbGFjZWFibGU+ZGJuYW1lPC9yZXBsYWNlYWJsZT4K KyAgIDwvZ3JvdXA+CisgIDwvY21kc3lub3BzaXM+CisgPC9yZWZzeW5vcHNpc2Rpdj4KKwor IDxyZWZzZWN0MT4KKyAgPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KKyAgPHBhcmE+Cisg ICAgPGFwcGxpY2F0aW9uPnBnX2NyZWF0ZXN1YnNjcmliZXI8L2FwcGxpY2F0aW9uPiBjcmVh dGVzIGEgbmV3IGxvZ2ljYWwKKyAgICByZXBsaWNhIGZyb20gYSBwaHlzaWNhbCBzdGFuZGJ5 IHNlcnZlci4KKyAgPC9wYXJhPgorCisgIDxwYXJhPgorICAgVGhlIDxhcHBsaWNhdGlvbj5w Z19jcmVhdGVzdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj4gc2hvdWxkIGJlIHJ1biBhdCB0aGUg dGFyZ2V0CisgICBzZXJ2ZXIuIFRoZSBzb3VyY2Ugc2VydmVyIChrbm93biBhcyBwdWJsaXNo ZXIgc2VydmVyKSBzaG91bGQgYWNjZXB0IGxvZ2ljYWwKKyAgIHJlcGxpY2F0aW9uIGNvbm5l Y3Rpb25zIGZyb20gdGhlIHRhcmdldCBzZXJ2ZXIgKGtub3duIGFzIHN1YnNjcmliZXIgc2Vy dmVyKS4KKyAgIFRoZSB0YXJnZXQgc2VydmVyIHNob3VsZCBhY2NlcHQgbG9jYWwgbG9naWNh bCByZXBsaWNhdGlvbiBjb25uZWN0aW9uLgorICA8L3BhcmE+CisgPC9yZWZzZWN0MT4KKwor IDxyZWZzZWN0MT4KKyAgPHRpdGxlPk9wdGlvbnM8L3RpdGxlPgorCisgICA8cGFyYT4KKyAg ICA8YXBwbGljYXRpb24+cGdfY3JlYXRlc3Vic2NyaWJlcjwvYXBwbGljYXRpb24+IGFjY2Vw dHMgdGhlIGZvbGxvd2luZworICAgIGNvbW1hbmQtbGluZSBhcmd1bWVudHM6CisKKyAgICA8 dmFyaWFibGVsaXN0PgorICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgPHRlcm0+PG9wdGlv bj4tRCA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+ZGlyZWN0b3J5PC9yZXBsYWNl YWJsZT48L29wdGlvbj48L3Rlcm0+CisgICAgICA8dGVybT48b3B0aW9uPi0tcGdkYXRhPTxy ZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5kaXJlY3Rvcnk8L3JlcGxhY2VhYmxlPjwv b3B0aW9uPjwvdGVybT4KKyAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8cGFyYT4KKyAgICAg ICAgVGhlIHRhcmdldCBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBhIGNsdXN0ZXIgZGlyZWN0 b3J5IGZyb20gYSBwaHlzaWNhbAorICAgICAgICByZXBsaWNhLgorICAgICAgIDwvcGFyYT4K KyAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgIDx2YXJs aXN0ZW50cnk+CisgICAgICA8dGVybT48b3B0aW9uPi1QIDxyZXBsYWNlYWJsZSBjbGFzcz0i cGFyYW1ldGVyIj5jb25uc3RyPC9yZXBsYWNlYWJsZT48L29wdGlvbj48L3Rlcm0+CisgICAg ICA8dGVybT48b3B0aW9uPi0tcHVibGlzaGVyLXNlcnZlcj08cmVwbGFjZWFibGUgY2xhc3M9 InBhcmFtZXRlciI+Y29ubnN0cjwvcmVwbGFjZWFibGU+PC9vcHRpb24+PC90ZXJtPgorICAg ICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgICBUaGUgY29ubmVjdGlvbiBz dHJpbmcgdG8gdGhlIHB1Ymxpc2hlci4gRm9yIGRldGFpbHMgc2VlIDx4cmVmIGxpbmtlbmQ9 ImxpYnBxLWNvbm5zdHJpbmciLz4uCisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRl bT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAg IDx0ZXJtPjxvcHRpb24+LVMgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmNvbm5z dHI8L3JlcGxhY2VhYmxlPjwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+ LS1zdWJzY3JpYmVyLXNlcnZlcj08cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+Y29u bnN0cjwvcmVwbGFjZWFibGU+PC9vcHRpb24+PC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgor ICAgICAgIDxwYXJhPgorICAgICAgICBUaGUgY29ubmVjdGlvbiBzdHJpbmcgdG8gdGhlIHN1 YnNjcmliZXIuIEZvciBkZXRhaWxzIHNlZSA8eHJlZiBsaW5rZW5kPSJsaWJwcS1jb25uc3Ry aW5nIi8+LgorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvdmFy bGlzdGVudHJ5PgorCisgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICA8dGVybT48b3B0aW9u Pi1kIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5kYm5hbWU8L3JlcGxhY2VhYmxl Pjwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+LS1kYXRhYmFzZT08cmVw bGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+ZGJuYW1lPC9yZXBsYWNlYWJsZT48L29wdGlv bj48L3Rlcm0+CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgIFRo ZSBkYXRhYmFzZSBuYW1lIHRvIGNyZWF0ZSB0aGUgc3Vic2NyaXB0aW9uLiBNdWx0aXBsZSBk YXRhYmFzZXMgY2FuIGJlCisgICAgICAgIHNlbGVjdGVkIGJ5IHdyaXRpbmcgbXVsdGlwbGUg PG9wdGlvbj4tZDwvb3B0aW9uPiBzd2l0Y2hlcy4KKyAgICAgICA8L3BhcmE+CisgICAgICA8 L2xpc3RpdGVtPgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICA8dmFybGlzdGVudHJ5 PgorICAgICAgPHRlcm0+PG9wdGlvbj4tbjwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDx0ZXJt PjxvcHRpb24+LS1kcnktcnVuPC9vcHRpb24+PC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgor ICAgICAgIDxwYXJhPgorICAgICAgICBEbyBldmVyeXRoaW5nIGV4Y2VwdCBhY3R1YWxseSBt b2RpZnlpbmcgdGhlIHRhcmdldCBkaXJlY3RvcnkuCisgICAgICAgPC9wYXJhPgorICAgICAg PC9saXN0aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgPHZhcmxpc3RlbnRy eT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+LXI8L29wdGlvbj48L3Rlcm0+CisgICAgICA8dGVy bT48b3B0aW9uPi0tcmV0YWluPC9vcHRpb24+PC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgor ICAgICAgIDxwYXJhPgorICAgICAgICBSZXRhaW4gbG9nIGZpbGUgZXZlbiBhZnRlciBzdWNj ZXNzZnVsIGNvbXBsZXRpb24uCisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4K KyAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICA8 dGVybT48b3B0aW9uPi10IDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5zZWNvbmRz PC9yZXBsYWNlYWJsZT48L29wdGlvbj48L3Rlcm0+CisgICAgICAgPHRlcm0+PG9wdGlvbj4t LXJlY292ZXJ5LXRpbWVvdXQ9PHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPnNlY29u ZHM8L3JlcGxhY2VhYmxlPjwvb3B0aW9uPjwvdGVybT4KKyAgICAgICA8bGlzdGl0ZW0+Cisg ICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIHRv IHdhaXQgZm9yIHJlY292ZXJ5IHRvIGVuZC4gU2V0dGluZyB0byAwCisgICAgICAgIGRpc2Fi bGVzLiBUaGUgZGVmYXVsdCBpcyAwLgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8L2xpc3Rp dGVtPgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICA8dmFybGlzdGVudHJ5PgorICAg ICAgPHRlcm0+PG9wdGlvbj4tdjwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDx0ZXJtPjxvcHRp b24+LS12ZXJib3NlPC9vcHRpb24+PC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgorICAgICAg IDxwYXJhPgorICAgICAgICBFbmFibGVzIHZlcmJvc2UgbW9kZS4gVGhpcyB3aWxsIGNhdXNl CisgICAgICAgIDxhcHBsaWNhdGlvbj5wZ19jcmVhdGVzdWJzY3JpYmVyPC9hcHBsaWNhdGlv bj4gdG8gb3V0cHV0IHByb2dyZXNzIG1lc3NhZ2VzCisgICAgICAgIGFuZCBkZXRhaWxlZCBp bmZvcm1hdGlvbiBhYm91dCBlYWNoIHN0ZXAgdG8gc3RhbmRhcmQgZXJyb3IuCisgICAgICAg IFJlcGVhdGluZyB0aGUgb3B0aW9uIGNhdXNlcyBhZGRpdGlvbmFsIGRlYnVnLWxldmVsIG1l c3NhZ2VzIHRvIGFwcGVhciBvbgorICAgICAgICBzdGFuZGFyZCBlcnJvci4KKyAgICAgICA8 L3BhcmE+CisgICAgICA8L2xpc3RpdGVtPgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICA8 L3ZhcmlhYmxlbGlzdD4KKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgT3RoZXIgb3B0 aW9ucyBhcmUgYWxzbyBhdmFpbGFibGU6CisKKyAgICA8dmFyaWFibGVsaXN0PgorICAgICA8 dmFybGlzdGVudHJ5PgorICAgICAgIDx0ZXJtPjxvcHRpb24+LVY8L29wdGlvbj48L3Rlcm0+ CisgICAgICAgPHRlcm0+PG9wdGlvbj4tLXZlcnNpb248L29wdGlvbj48L3Rlcm0+CisgICAg ICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgIFByaW50IHRoZSA8YXBwbGlj YXRpb24+cGdfY3JlYXRlc3Vic2NyaWJlcjwvYXBwbGljYXRpb24+IHZlcnNpb24gYW5kIGV4 aXQuCisgICAgICAgPC9wYXJhPgorICAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvdmFybGlz dGVudHJ5PgorCisgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgPHRlcm0+PG9wdGlvbj4t Pzwvb3B0aW9uPjwvdGVybT4KKyAgICAgICA8dGVybT48b3B0aW9uPi0taGVscDwvb3B0aW9u PjwvdGVybT4KKyAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgU2hv dyBoZWxwIGFib3V0IDxhcHBsaWNhdGlvbj5wZ19jcmVhdGVzdWJzY3JpYmVyPC9hcHBsaWNh dGlvbj4gY29tbWFuZAorICAgICAgIGxpbmUgYXJndW1lbnRzLCBhbmQgZXhpdC4KKyAgICAg ICA8L3BhcmE+CisgICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisK KyAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgIDwvcGFyYT4KKworIDwvcmVmc2VjdDE+CisKKyA8 cmVmc2VjdDE+CisgIDx0aXRsZT5Ob3RlczwvdGl0bGU+CisKKyAgPHBhcmE+CisgICBUaGUg dHJhbnNmb3JtYXRpb24gcHJvY2VlZHMgaW4gdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgPC9w YXJhPgorCisgIDxwcm9jZWR1cmU+CisgICA8c3RlcD4KKyAgICA8cGFyYT4KKyAgICAgPGFw cGxpY2F0aW9uPnBnX2NyZWF0ZXN1YnNjcmliZXI8L2FwcGxpY2F0aW9uPiBjaGVja3MgaWYg dGhlIGdpdmVuIHRhcmdldCBkYXRhCisgICAgIGRpcmVjdG9yeSBoYXMgdGhlIHNhbWUgc3lz dGVtIGlkZW50aWZpZXIgdGhhbiB0aGUgc291cmNlIGRhdGEgZGlyZWN0b3J5LgorICAgICBT aW5jZSBpdCB1c2VzIHRoZSByZWNvdmVyeSBwcm9jZXNzIGFzIG9uZSBvZiB0aGUgc3RlcHMs IGl0IHN0YXJ0cyB0aGUKKyAgICAgdGFyZ2V0IHNlcnZlciBhcyBhIHJlcGxpY2EgZnJvbSB0 aGUgc291cmNlIHNlcnZlci4gSWYgdGhlIHN5c3RlbQorICAgICBpZGVudGlmaWVyIGlzIG5v dCB0aGUgc2FtZSwgPGFwcGxpY2F0aW9uPnBnX2NyZWF0ZXN1YnNjcmliZXI8L2FwcGxpY2F0 aW9uPiB3aWxsCisgICAgIHRlcm1pbmF0ZSB3aXRoIGFuIGVycm9yLgorICAgIDwvcGFyYT4K KyAgIDwvc3RlcD4KKworICAgPHN0ZXA+CisgICAgPHBhcmE+CisgICAgIDxhcHBsaWNhdGlv bj5wZ19jcmVhdGVzdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj4gY2hlY2tzIGlmIHRoZSB0YXJn ZXQgZGF0YQorICAgICBkaXJlY3RvcnkgaXMgdXNlZCBieSBhIHBoeXNpY2FsIHJlcGxpY2Eu IFN0b3AgdGhlIHBoeXNpY2FsIHJlcGxpY2EgaWYgaXQgaXMKKyAgICAgcnVubmluZy4gT25l IG9mIHRoZSBuZXh0IHN0ZXBzIGlzIHRvIGFkZCBzb21lIHJlY292ZXJ5IHBhcmFtZXRlcnMg dGhhdAorICAgICByZXF1aXJlcyBhIHNlcnZlciBzdGFydC4gVGhpcyBzdGVwIGF2b2lkcyBh biBlcnJvci4KKyAgICA8L3BhcmE+CisgICA8L3N0ZXA+CisKKyAgIDxzdGVwPgorICAgIDxw YXJhPgorICAgICA8YXBwbGljYXRpb24+cGdfY3JlYXRlc3Vic2NyaWJlcjwvYXBwbGljYXRp b24+IGNyZWF0ZXMgb25lIHJlcGxpY2F0aW9uIHNsb3QgZm9yCisgICAgIGVhY2ggc3BlY2lm aWVkIGRhdGFiYXNlIG9uIHRoZSBzb3VyY2Ugc2VydmVyLiBUaGUgcmVwbGljYXRpb24gc2xv dCBuYW1lCisgICAgIGNvbnRhaW5zIGEgPGxpdGVyYWw+cGdfY3JlYXRlc3Vic2NyaWJlcjwv bGl0ZXJhbD4gcHJlZml4LiBUaGVzZSByZXBsaWNhdGlvbgorICAgICBzbG90cyB3aWxsIGJl IHVzZWQgYnkgdGhlIHN1YnNjcmlwdGlvbnMgaW4gYSBmdXR1cmUgc3RlcC4gIEEgdGVtcG9y YXJ5CisgICAgIHJlcGxpY2F0aW9uIHNsb3QgaXMgdXNlZCB0byBnZXQgYSBjb25zaXN0ZW50 IHN0YXJ0IGxvY2F0aW9uLiBUaGlzCisgICAgIGNvbnNpc3RlbnQgTFNOIHdpbGwgYmUgdXNl ZCBhcyBhIHN0b3BwaW5nIHBvaW50IGluIHRoZSA8eHJlZgorICAgICBsaW5rZW5kPSJndWMt cmVjb3ZlcnktdGFyZ2V0LWxzbiIvPiBwYXJhbWV0ZXIgYW5kIGJ5IHRoZQorICAgICBzdWJz Y3JpcHRpb25zIGFzIGEgcmVwbGljYXRpb24gc3RhcnRpbmcgcG9pbnQuIEl0IGd1YXJhbnRl ZXMgdGhhdCBubworICAgICB0cmFuc2FjdGlvbiB3aWxsIGJlIGxvc3QuCisgICAgPC9wYXJh PgorICAgPC9zdGVwPgorCisgICA8c3RlcD4KKyAgICA8cGFyYT4KKyAgICAgPGFwcGxpY2F0 aW9uPnBnX2NyZWF0ZXN1YnNjcmliZXI8L2FwcGxpY2F0aW9uPiB3cml0ZXMgcmVjb3Zlcnkg cGFyYW1ldGVycyBpbnRvCisgICAgIHRoZSB0YXJnZXQgZGF0YSBkaXJlY3RvcnkgYW5kIHN0 YXJ0IHRoZSB0YXJnZXQgc2VydmVyLiBJdCBzcGVjaWZpZXMgYSBMU04KKyAgICAgKGNvbnNp c3RlbnQgTFNOIHRoYXQgd2FzIG9idGFpbmVkIGluIHRoZSBwcmV2aW91cyBzdGVwKSBvZiB3 cml0ZS1haGVhZAorICAgICBsb2cgbG9jYXRpb24gdXAgdG8gd2hpY2ggcmVjb3Zlcnkgd2ls bCBwcm9jZWVkLiBJdCBhbHNvIHNwZWNpZmllcworICAgICA8bGl0ZXJhbD5wcm9tb3RlPC9s aXRlcmFsPiBhcyB0aGUgYWN0aW9uIHRoYXQgdGhlIHNlcnZlciBzaG91bGQgdGFrZSBvbmNl CisgICAgIHRoZSByZWNvdmVyeSB0YXJnZXQgaXMgcmVhY2hlZC4gVGhpcyBzdGVwIGZpbmlz aGVzIG9uY2UgdGhlIHNlcnZlciBlbmRzCisgICAgIHN0YW5kYnkgbW9kZSBhbmQgaXMgYWNj ZXB0aW5nIHJlYWQtd3JpdGUgb3BlcmF0aW9ucy4KKyAgICA8L3BhcmE+CisgICA8L3N0ZXA+ CisKKyAgIDxzdGVwPgorICAgIDxwYXJhPgorICAgICBOZXh0LCA8YXBwbGljYXRpb24+cGdf Y3JlYXRlc3Vic2NyaWJlcjwvYXBwbGljYXRpb24+IGNyZWF0ZXMgb25lIHB1YmxpY2F0aW9u CisgICAgIGZvciBlYWNoIHNwZWNpZmllZCBkYXRhYmFzZSBvbiB0aGUgc291cmNlIHNlcnZl ci4gRWFjaCBwdWJsaWNhdGlvbgorICAgICByZXBsaWNhdGVzIGNoYW5nZXMgZm9yIGFsbCB0 YWJsZXMgaW4gdGhlIGRhdGFiYXNlLiBUaGUgcHVibGljYXRpb24gbmFtZQorICAgICBjb250 YWlucyBhIDxsaXRlcmFsPnBnX2NyZWF0ZXN1YnNjcmliZXI8L2xpdGVyYWw+IHByZWZpeC4g VGhlc2UgcHVibGljYXRpb24KKyAgICAgd2lsbCBiZSB1c2VkIGJ5IGEgY29ycmVzcG9uZGlu ZyBzdWJzY3JpcHRpb24gaW4gYSBuZXh0IHN0ZXAuCisgICAgPC9wYXJhPgorICAgPC9zdGVw PgorCisgICA8c3RlcD4KKyAgICA8cGFyYT4KKyAgICAgPGFwcGxpY2F0aW9uPnBnX2NyZWF0 ZXN1YnNjcmliZXI8L2FwcGxpY2F0aW9uPiBjcmVhdGVzIG9uZSBzdWJzY3JpcHRpb24gZm9y CisgICAgIGVhY2ggc3BlY2lmaWVkIGRhdGFiYXNlIG9uIHRoZSB0YXJnZXQgc2VydmVyLiBF YWNoIHN1YnNjcmlwdGlvbiBuYW1lCisgICAgIGNvbnRhaW5zIGEgPGxpdGVyYWw+cGdfY3Jl YXRlc3Vic2NyaWJlcjwvbGl0ZXJhbD4gcHJlZml4LiBUaGUgcmVwbGljYXRpb24gc2xvdAor ICAgICBuYW1lIGlzIGlkZW50aWNhbCB0byB0aGUgc3Vic2NyaXB0aW9uIG5hbWUuIEl0IGRv ZXMgbm90IGNvcHkgZXhpc3RpbmcgZGF0YQorICAgICBmcm9tIHRoZSBzb3VyY2Ugc2VydmVy LiBJdCBkb2VzIG5vdCBjcmVhdGUgYSByZXBsaWNhdGlvbiBzbG90LiBJbnN0ZWFkLCBpdAor ICAgICB1c2VzIHRoZSByZXBsaWNhdGlvbiBzbG90IHRoYXQgd2FzIGNyZWF0ZWQgaW4gYSBw cmV2aW91cyBzdGVwLiBUaGUKKyAgICAgc3Vic2NyaXB0aW9uIGlzIGNyZWF0ZWQgYnV0IGl0 IGlzIG5vdCBlbmFibGVkIHlldC4gVGhlIHJlYXNvbiBpcyB0aGUKKyAgICAgcmVwbGljYXRp b24gcHJvZ3Jlc3MgbXVzdCBiZSBzZXQgdG8gdGhlIGNvbnNpc3RlbnQgTFNOIGJ1dCByZXBs aWNhdGlvbgorICAgICBvcmlnaW4gbmFtZSBjb250YWlucyB0aGUgc3Vic2NyaXB0aW9uIG9p ZCBpbiBpdHMgbmFtZS4gSGVuY2UsIHRoZQorICAgICBzdWJzY3JpcHRpb24gd2lsbCBiZSBl bmFibGVkIGluIGEgc2VwYXJhdGUgc3RlcC4KKyAgICA8L3BhcmE+CisgICA8L3N0ZXA+CisK KyAgIDxzdGVwPgorICAgIDxwYXJhPgorICAgICA8YXBwbGljYXRpb24+cGdfY3JlYXRlc3Vi c2NyaWJlcjwvYXBwbGljYXRpb24+IHNldHMgdGhlIHJlcGxpY2F0aW9uIHByb2dyZXNzIHRv CisgICAgIHRoZSBjb25zaXN0ZW50IExTTiB0aGF0IHdhcyBvYnRhaW5lZCBpbiBhIHByZXZp b3VzIHN0ZXAuIFdoZW4gdGhlIHRhcmdldAorICAgICBzZXJ2ZXIgc3RhcnRlZCB0aGUgcmVj b3ZlcnkgcHJvY2VzcywgaXQgY2F1Z2h0IHVwIHRvIHRoZSBjb25zaXN0ZW50IExTTi4KKyAg ICAgVGhpcyBpcyB0aGUgZXhhY3QgTFNOIHRvIGJlIHVzZWQgYXMgYSBpbml0aWFsIGxvY2F0 aW9uIGZvciBlYWNoCisgICAgIHN1YnNjcmlwdGlvbi4KKyAgICA8L3BhcmE+CisgICA8L3N0 ZXA+CisKKyAgIDxzdGVwPgorICAgIDxwYXJhPgorICAgICBGaW5hbGx5LCA8YXBwbGljYXRp b24+cGdfY3JlYXRlc3Vic2NyaWJlcjwvYXBwbGljYXRpb24+IGVuYWJsZXMgdGhlIHN1YnNj cmlwdGlvbgorICAgICBmb3IgZWFjaCBzcGVjaWZpZWQgZGF0YWJhc2Ugb24gdGhlIHRhcmdl dCBzZXJ2ZXIuIFRoZSBzdWJzY3JpcHRpb24gc3RhcnRzCisgICAgIHN0cmVhbWluZyBmcm9t IHRoZSBjb25zaXN0ZW50IExTTi4KKyAgICA8L3BhcmE+CisgICA8L3N0ZXA+CisKKyAgIDxz dGVwPgorICAgIDxwYXJhPgorICAgICA8YXBwbGljYXRpb24+cGdfY3JlYXRlc3Vic2NyaWJl cjwvYXBwbGljYXRpb24+IHN0b3BzIHRoZSB0YXJnZXQgc2VydmVyIHRvIGNoYW5nZQorICAg ICBpdHMgc3lzdGVtIGlkZW50aWZpZXIuCisgICAgPC9wYXJhPgorICAgPC9zdGVwPgorICA8 L3Byb2NlZHVyZT4KKyA8L3JlZnNlY3QxPgorCisgPHJlZnNlY3QxPgorICA8dGl0bGU+RXhh bXBsZXM8L3RpdGxlPgorCisgIDxwYXJhPgorICAgVG8gY3JlYXRlIGEgbG9naWNhbCByZXBs aWNhIGZvciBkYXRhYmFzZXMgPGxpdGVyYWw+aHI8L2xpdGVyYWw+IGFuZAorICAgPGxpdGVy YWw+ZmluYW5jZTwvbGl0ZXJhbD4gZnJvbSBhIHBoeXNpY2FsIHJlcGxpY2EgYXQgPGxpdGVy YWw+Zm9vPC9saXRlcmFsPjoKKzxzY3JlZW4+Cis8cHJvbXB0PiQ8L3Byb21wdD4gPHVzZXJp bnB1dD5wZ19jcmVhdGVzdWJzY3JpYmVyIC1EIC91c3IvbG9jYWwvcGdzcWwvZGF0YSAtUCAi aG9zdD1mb28iIC1TICJob3N0PWxvY2FsaG9zdCIgLWQgaHIgLWQgZmluYW5jZTwvdXNlcmlu cHV0PgorPC9zY3JlZW4+CisgIDwvcGFyYT4KKworIDwvcmVmc2VjdDE+CisKKyA8cmVmc2Vj dDE+CisgIDx0aXRsZT5TZWUgQWxzbzwvdGl0bGU+CisKKyAgPHNpbXBsZWxpc3QgdHlwZT0i aW5saW5lIj4KKyAgIDxtZW1iZXI+PHhyZWYgbGlua2VuZD0iYXBwLXBnYmFzZWJhY2t1cCIv PjwvbWVtYmVyPgorICA8L3NpbXBsZWxpc3Q+CisgPC9yZWZzZWN0MT4KKworPC9yZWZlbnRy eT4KZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9yZWZlcmVuY2Uuc2dtbCBiL2RvYy9zcmMv c2dtbC9yZWZlcmVuY2Uuc2dtbAppbmRleCBhYTk0ZjZhZGY2Li5jNWVkZDI0NGVmIDEwMDY0 NAotLS0gYS9kb2Mvc3JjL3NnbWwvcmVmZXJlbmNlLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21s L3JlZmVyZW5jZS5zZ21sCkBAIC0yODUsNiArMjg1LDcgQEAKICAgICZwZ0N0bDsKICAgICZw Z1Jlc2V0d2FsOwogICAgJnBnUmV3aW5kOworICAgJnBnQ3JlYXRlU3Vic2NyaWJlcjsKICAg ICZwZ3Rlc3Rmc3luYzsKICAgICZwZ3Rlc3R0aW1pbmc7CiAgICAmcGd1cGdyYWRlOwpkaWZm IC0tZ2l0IGEvc3JjL2Jpbi9wZ19iYXNlYmFja3VwLy5naXRpZ25vcmUgYi9zcmMvYmluL3Bn X2Jhc2ViYWNrdXAvLmdpdGlnbm9yZQppbmRleCAyNjA0OGJkYmQ4Li5iM2E2ZjVhMmZlIDEw MDY0NAotLS0gYS9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvLmdpdGlnbm9yZQorKysgYi9zcmMv YmluL3BnX2Jhc2ViYWNrdXAvLmdpdGlnbm9yZQpAQCAtMSw1ICsxLDYgQEAKIC9wZ19iYXNl YmFja3VwCiAvcGdfcmVjZWl2ZXdhbAogL3BnX3JlY3Zsb2dpY2FsCisvcGdfY3JlYXRlc3Vi c2NyaWJlcgogCiAvdG1wX2NoZWNrLwpkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9wZ19iYXNlYmFj a3VwL01ha2VmaWxlIGIvc3JjL2Jpbi9wZ19iYXNlYmFja3VwL01ha2VmaWxlCmluZGV4IGFi ZmI2NDQwZWMuLmRlZDQzNGI2ODMgMTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcGdfYmFzZWJhY2t1 cC9NYWtlZmlsZQorKysgYi9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvTWFrZWZpbGUKQEAgLTQ0 LDcgKzQ0LDcgQEAgQkJPQkpTID0gXAogCWJic3RyZWFtZXJfdGFyLm8gXAogCWJic3RyZWFt ZXJfenN0ZC5vCiAKLWFsbDogcGdfYmFzZWJhY2t1cCBwZ19yZWNlaXZld2FsIHBnX3JlY3Zs b2dpY2FsCithbGw6IHBnX2Jhc2ViYWNrdXAgcGdfcmVjZWl2ZXdhbCBwZ19yZWN2bG9naWNh bCBwZ19jcmVhdGVzdWJzY3JpYmVyCiAKIHBnX2Jhc2ViYWNrdXA6ICQoQkJPQkpTKSAkKE9C SlMpIHwgc3VibWFrZS1saWJwcSBzdWJtYWtlLWxpYnBncG9ydCBzdWJtYWtlLWxpYnBnZmV1 dGlscwogCSQoQ0MpICQoQ0ZMQUdTKSAkKEJCT0JKUykgJChPQkpTKSAkKExERkxBR1MpICQo TERGTEFHU19FWCkgJChMSUJTKSAtbyAkQCQoWCkKQEAgLTU1LDEwICs1NSwxNCBAQCBwZ19y ZWNlaXZld2FsOiBwZ19yZWNlaXZld2FsLm8gJChPQkpTKSB8IHN1Ym1ha2UtbGlicHEgc3Vi bWFrZS1saWJwZ3BvcnQgc3VibWFrZQogcGdfcmVjdmxvZ2ljYWw6IHBnX3JlY3Zsb2dpY2Fs Lm8gJChPQkpTKSB8IHN1Ym1ha2UtbGlicHEgc3VibWFrZS1saWJwZ3BvcnQgc3VibWFrZS1s aWJwZ2ZldXRpbHMKIAkkKENDKSAkKENGTEFHUykgcGdfcmVjdmxvZ2ljYWwubyAkKE9CSlMp ICQoTERGTEFHUykgJChMREZMQUdTX0VYKSAkKExJQlMpIC1vICRAJChYKQogCitwZ19jcmVh dGVzdWJzY3JpYmVyOiAkKFdJTjMyUkVTKSBwZ19jcmVhdGVzdWJzY3JpYmVyLm8gfCBzdWJt YWtlLWxpYnBxIHN1Ym1ha2UtbGlicGdwb3J0IHN1Ym1ha2UtbGlicGdmZXV0aWxzCisJJChD QykgJChDRkxBR1MpICReICQoTERGTEFHUykgJChMREZMQUdTX0VYKSAkKExJQlMpIC1vICRA JChYKQorCiBpbnN0YWxsOiBhbGwgaW5zdGFsbGRpcnMKIAkkKElOU1RBTExfUFJPR1JBTSkg cGdfYmFzZWJhY2t1cCQoWCkgJyQoREVTVERJUikkKGJpbmRpcikvcGdfYmFzZWJhY2t1cCQo WCknCiAJJChJTlNUQUxMX1BST0dSQU0pIHBnX3JlY2VpdmV3YWwkKFgpICckKERFU1RESVIp JChiaW5kaXIpL3BnX3JlY2VpdmV3YWwkKFgpJwogCSQoSU5TVEFMTF9QUk9HUkFNKSBwZ19y ZWN2bG9naWNhbCQoWCkgJyQoREVTVERJUikkKGJpbmRpcikvcGdfcmVjdmxvZ2ljYWwkKFgp JworCSQoSU5TVEFMTF9QUk9HUkFNKSBwZ19jcmVhdGVzdWJzY3JpYmVyJChYKSAnJChERVNU RElSKSQoYmluZGlyKS9wZ19jcmVhdGVzdWJzY3JpYmVyJChYKScKIAogaW5zdGFsbGRpcnM6 CiAJJChNS0RJUl9QKSAnJChERVNURElSKSQoYmluZGlyKScKQEAgLTY3LDEwICs3MSwxMiBA QCB1bmluc3RhbGw6CiAJcm0gLWYgJyQoREVTVERJUikkKGJpbmRpcikvcGdfYmFzZWJhY2t1 cCQoWCknCiAJcm0gLWYgJyQoREVTVERJUikkKGJpbmRpcikvcGdfcmVjZWl2ZXdhbCQoWCkn CiAJcm0gLWYgJyQoREVTVERJUikkKGJpbmRpcikvcGdfcmVjdmxvZ2ljYWwkKFgpJworCXJt IC1mICckKERFU1RESVIpJChiaW5kaXIpL3BnX2NyZWF0ZXN1YnNjcmliZXIkKFgpJwogCiBj bGVhbiBkaXN0Y2xlYW46CiAJcm0gLWYgcGdfYmFzZWJhY2t1cCQoWCkgcGdfcmVjZWl2ZXdh bCQoWCkgcGdfcmVjdmxvZ2ljYWwkKFgpIFwKIAkJJChCQk9CSlMpIHBnX3JlY2VpdmV3YWwu byBwZ19yZWN2bG9naWNhbC5vIFwKKwkJcGdfY3JlYXRlc3Vic2NyaWJlciQoWCkgcGdfY3Jl YXRlc3Vic2NyaWJlci5vIFwKIAkJJChPQkpTKQogCXJtIC1yZiB0bXBfY2hlY2sKIApkaWZm IC0tZ2l0IGEvc3JjL2Jpbi9wZ19iYXNlYmFja3VwL21lc29uLmJ1aWxkIGIvc3JjL2Jpbi9w Z19iYXNlYmFja3VwL21lc29uLmJ1aWxkCmluZGV4IGY3ZTYwZTY2NzAuLjM0NWEyZDZmY2Qg MTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcGdfYmFzZWJhY2t1cC9tZXNvbi5idWlsZAorKysgYi9z cmMvYmluL3BnX2Jhc2ViYWNrdXAvbWVzb24uYnVpbGQKQEAgLTc1LDYgKzc1LDIzIEBAIHBn X3JlY3Zsb2dpY2FsID0gZXhlY3V0YWJsZSgncGdfcmVjdmxvZ2ljYWwnLAogKQogYmluX3Rh cmdldHMgKz0gcGdfcmVjdmxvZ2ljYWwKIAorcGdfY3JlYXRlc3Vic2NyaWJlcl9zb3VyY2Vz ID0gZmlsZXMoCisgICdwZ19jcmVhdGVzdWJzY3JpYmVyLmMnCispCisKK2lmIGhvc3Rfc3lz dGVtID09ICd3aW5kb3dzJworICBwZ19jcmVhdGVzdWJzY3JpYmVyX3NvdXJjZXMgKz0gcmNf YmluX2dlbi5wcm9jZXNzKHdpbjMydmVyX3JjLCBleHRyYV9hcmdzOiBbCisJJy0tTkFNRScs ICdwZ19jcmVhdGVzdWJzY3JpYmVyJywKKwknLS1GSUxFREVTQycsICdwZ19jcmVhdGVzdWJz Y3JpYmVyIC0gY3JlYXRlIGEgbmV3IGxvZ2ljYWwgcmVwbGljYSBmcm9tIGEgc3RhbmRieSBz ZXJ2ZXInLF0pCitlbmRpZgorCitwZ19jcmVhdGVzdWJzY3JpYmVyID0gZXhlY3V0YWJsZSgn cGdfY3JlYXRlc3Vic2NyaWJlcicsCisgIHBnX2NyZWF0ZXN1YnNjcmliZXJfc291cmNlcywK KyAgZGVwZW5kZW5jaWVzOiBbZnJvbnRlbmRfY29kZSwgbGlicHFdLAorICBrd2FyZ3M6IGRl ZmF1bHRfYmluX2FyZ3MsCispCitiaW5fdGFyZ2V0cyArPSBwZ19jcmVhdGVzdWJzY3JpYmVy CisKIHRlc3RzICs9IHsKICAgJ25hbWUnOiAncGdfYmFzZWJhY2t1cCcsCiAgICdzZCc6IG1l c29uLmN1cnJlbnRfc291cmNlX2RpcigpLApAQCAtODksNiArMTA2LDggQEAgdGVzdHMgKz0g ewogICAgICAgJ3QvMDExX2luX3BsYWNlX3RhYmxlc3BhY2UucGwnLAogICAgICAgJ3QvMDIw X3BnX3JlY2VpdmV3YWwucGwnLAogICAgICAgJ3QvMDMwX3BnX3JlY3Zsb2dpY2FsLnBsJywK KyAgICAgICd0LzA0MF9wZ19jcmVhdGVzdWJzY3JpYmVyLnBsJywKKyAgICAgICd0LzA0MV9w Z19jcmVhdGVzdWJzY3JpYmVyX3N0YW5kYnkucGwnLAogICAgIF0sCiAgIH0sCiB9CmRpZmYg LS1naXQgYS9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvcGdfY3JlYXRlc3Vic2NyaWJlci5jIGIv c3JjL2Jpbi9wZ19iYXNlYmFja3VwL3BnX2NyZWF0ZXN1YnNjcmliZXIuYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi45NjI4ZjMyYTNlCi0tLSAvZGV2L251bGwK KysrIGIvc3JjL2Jpbi9wZ19iYXNlYmFja3VwL3BnX2NyZWF0ZXN1YnNjcmliZXIuYwpAQCAt MCwwICsxLDE4NjkgQEAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIHBnX2NyZWF0 ZXN1YnNjcmliZXIuYworICoJICBDcmVhdGUgYSBuZXcgbG9naWNhbCByZXBsaWNhIGZyb20g YSBzdGFuZGJ5IHNlcnZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyNCwgUG9zdGdyZVNR TCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqCisgKiBJREVOVElGSUNBVElPTgorICoJ CXNyYy9iaW4vcGdfYmFzZWJhY2t1cC9wZ19jcmVhdGVzdWJzY3JpYmVyLmMKKyAqCisgKi0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgInBvc3RncmVzX2ZlLmgiCisKKyNp bmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5 cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisK KyNpbmNsdWRlICJhY2Nlc3MveGxvZ2RlZnMuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX2F1 dGhpZF9kLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19jb250cm9sLmgiCisjaW5jbHVkZSAi Y29tbW9uL2Nvbm5lY3QuaCIKKyNpbmNsdWRlICJjb21tb24vY29udHJvbGRhdGFfdXRpbHMu aCIKKyNpbmNsdWRlICJjb21tb24vZmlsZV9wZXJtLmgiCisjaW5jbHVkZSAiY29tbW9uL2Zp bGVfdXRpbHMuaCIKKyNpbmNsdWRlICJjb21tb24vbG9nZ2luZy5oIgorI2luY2x1ZGUgImNv bW1vbi9yZXN0cmljdGVkX3Rva2VuLmgiCisjaW5jbHVkZSAiZmVfdXRpbHMvcmVjb3Zlcnlf Z2VuLmgiCisjaW5jbHVkZSAiZmVfdXRpbHMvc2ltcGxlX2xpc3QuaCIKKyNpbmNsdWRlICJn ZXRvcHRfbG9uZy5oIgorI2luY2x1ZGUgInV0aWxzL3BpZGZpbGUuaCIKKworI2RlZmluZQlQ R1NfT1VUUFVUX0RJUgkicGdfY3JlYXRlc3Vic2NyaWJlcl9vdXRwdXQuZCIKKworLyogQ29t bWFuZC1saW5lIG9wdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IENyZWF0ZVN1YnNjcmliZXJP cHRpb25zCit7CisJY2hhcgkgICAqc3Vic2NyaWJlcl9kaXI7IC8qIHN0YW5kYnkvc3Vic2Ny aWJlciBkYXRhIGRpcmVjdG9yeSAqLworCWNoYXIJICAgKnB1Yl9jb25uaW5mb19zdHI7CS8q IHB1Ymxpc2hlciBjb25uZWN0aW9uIHN0cmluZyAqLworCWNoYXIJICAgKnN1Yl9jb25uaW5m b19zdHI7CS8qIHN1YnNjcmliZXIgY29ubmVjdGlvbiBzdHJpbmcgKi8KKwlTaW1wbGVTdHJp bmdMaXN0IGRhdGFiYXNlX25hbWVzOwkvKiBsaXN0IG9mIGRhdGFiYXNlIG5hbWVzICovCisJ Ym9vbAkJcmV0YWluOwkJCS8qIHJldGFpbiBsb2cgZmlsZT8gKi8KKwlpbnQJCQlyZWNvdmVy eV90aW1lb3V0OwkvKiBzdG9wIHJlY292ZXJ5IGFmdGVyIHRoaXMgdGltZSAqLworfSBDcmVh dGVTdWJzY3JpYmVyT3B0aW9uczsKKwordHlwZWRlZiBzdHJ1Y3QgTG9naWNhbFJlcEluZm8K K3sKKwlPaWQJCQlvaWQ7CQkJLyogZGF0YWJhc2UgT0lEICovCisJY2hhcgkgICAqZGJuYW1l OwkJCS8qIGRhdGFiYXNlIG5hbWUgKi8KKwljaGFyCSAgICpwdWJjb25uaW5mbzsJLyogcHVi bGlzaGVyIGNvbm5lY3Rpb24gc3RyaW5nICovCisJY2hhcgkgICAqc3ViY29ubmluZm87CS8q IHN1YnNjcmliZXIgY29ubmVjdGlvbiBzdHJpbmcgKi8KKwljaGFyCSAgICpwdWJuYW1lOwkJ LyogcHVibGljYXRpb24gbmFtZSAqLworCWNoYXIJICAgKnN1Ym5hbWU7CQkvKiBzdWJzY3Jp cHRpb24gbmFtZSAoYWxzbyByZXBsaWNhdGlvbiBzbG90CisJCQkJCQkJCSAqIG5hbWUpICov CisKKwlib29sCQltYWRlX3JlcGxzbG90OwkvKiByZXBsaWNhdGlvbiBzbG90IHdhcyBjcmVh dGVkICovCisJYm9vbAkJbWFkZV9wdWJsaWNhdGlvbjsJLyogcHVibGljYXRpb24gd2FzIGNy ZWF0ZWQgKi8KKwlib29sCQltYWRlX3N1YnNjcmlwdGlvbjsJLyogc3Vic2NyaXB0aW9uIHdh cyBjcmVhdGVkICovCit9IExvZ2ljYWxSZXBJbmZvOworCitzdGF0aWMgdm9pZCBjbGVhbnVw X29iamVjdHNfYXRleGl0KHZvaWQpOworc3RhdGljIHZvaWQgdXNhZ2UoKTsKK3N0YXRpYyBj aGFyICpnZXRfYmFzZV9jb25uaW5mbyhjaGFyICpjb25uaW5mbywgY2hhciAqZGJuYW1lKTsK K3N0YXRpYyBjaGFyICpnZXRfYmluX2RpcmVjdG9yeShjb25zdCBjaGFyICpwYXRoKTsKK3N0 YXRpYyBib29sIGNoZWNrX2RhdGFfZGlyZWN0b3J5KGNvbnN0IGNoYXIgKmRhdGFkaXIpOwor c3RhdGljIGNoYXIgKmNvbmNhdF9jb25uaW5mb19kYm5hbWUoY29uc3QgY2hhciAqY29ubmlu Zm8sIGNvbnN0IGNoYXIgKmRibmFtZSk7CitzdGF0aWMgTG9naWNhbFJlcEluZm8gKnN0b3Jl X3B1Yl9zdWJfaW5mbyhTaW1wbGVTdHJpbmdMaXN0IGRibmFtZXMsIGNvbnN0IGNoYXIgKnB1 Yl9iYXNlX2Nvbm5pbmZvLCBjb25zdCBjaGFyICpzdWJfYmFzZV9jb25uaW5mbyk7CitzdGF0 aWMgUEdjb25uICpjb25uZWN0X2RhdGFiYXNlKGNvbnN0IGNoYXIgKmNvbm5pbmZvKTsKK3N0 YXRpYyB2b2lkIGRpc2Nvbm5lY3RfZGF0YWJhc2UoUEdjb25uICpjb25uKTsKK3N0YXRpYyB1 aW50NjQgZ2V0X3ByaW1hcnlfc3lzaWQoY29uc3QgY2hhciAqY29ubmluZm8pOworc3RhdGlj IHVpbnQ2NCBnZXRfc3RhbmRieV9zeXNpZChjb25zdCBjaGFyICpkYXRhZGlyKTsKK3N0YXRp YyB2b2lkIG1vZGlmeV9zdWJzY3JpYmVyX3N5c2lkKGNvbnN0IGNoYXIgKnBnX2Jpbl9kaXIs IENyZWF0ZVN1YnNjcmliZXJPcHRpb25zICpvcHQpOworc3RhdGljIGJvb2wgY2hlY2tfcHVi bGlzaGVyKExvZ2ljYWxSZXBJbmZvICpkYmluZm8pOworc3RhdGljIGJvb2wgc2V0dXBfcHVi bGlzaGVyKExvZ2ljYWxSZXBJbmZvICpkYmluZm8pOworc3RhdGljIGJvb2wgY2hlY2tfc3Vi c2NyaWJlcihMb2dpY2FsUmVwSW5mbyAqZGJpbmZvKTsKK3N0YXRpYyBib29sIHNldHVwX3N1 YnNjcmliZXIoTG9naWNhbFJlcEluZm8gKmRiaW5mbywgY29uc3QgY2hhciAqY29uc2lzdGVu dF9sc24pOworc3RhdGljIGNoYXIgKmNyZWF0ZV9sb2dpY2FsX3JlcGxpY2F0aW9uX3Nsb3Qo UEdjb25uICpjb25uLCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvLAorCQkJCQkJCQkJCQkgYm9v bCB0ZW1wb3JhcnkpOworc3RhdGljIHZvaWQgZHJvcF9yZXBsaWNhdGlvbl9zbG90KFBHY29u biAqY29ubiwgTG9naWNhbFJlcEluZm8gKmRiaW5mbywgY29uc3QgY2hhciAqc2xvdF9uYW1l KTsKK3N0YXRpYyBjaGFyICpzZXR1cF9zZXJ2ZXJfbG9nZmlsZShjb25zdCBjaGFyICpkYXRh ZGlyKTsKK3N0YXRpYyB2b2lkIHN0YXJ0X3N0YW5kYnlfc2VydmVyKGNvbnN0IGNoYXIgKnBn X2Jpbl9kaXIsIGNvbnN0IGNoYXIgKmRhdGFkaXIsIGNvbnN0IGNoYXIgKmxvZ2ZpbGUpOwor c3RhdGljIHZvaWQgc3RvcF9zdGFuZGJ5X3NlcnZlcihjb25zdCBjaGFyICpwZ19iaW5fZGly LCBjb25zdCBjaGFyICpkYXRhZGlyKTsKK3N0YXRpYyB2b2lkIHBnX2N0bF9zdGF0dXMoY29u c3QgY2hhciAqcGdfY3RsX2NtZCwgaW50IHJjLCBpbnQgYWN0aW9uKTsKK3N0YXRpYyB2b2lk IHdhaXRfZm9yX2VuZF9yZWNvdmVyeShjb25zdCBjaGFyICpjb25uaW5mbywgY29uc3QgY2hh ciAqcGdfYmluX2RpciwgQ3JlYXRlU3Vic2NyaWJlck9wdGlvbnMgKm9wdCk7CitzdGF0aWMg dm9pZCBjcmVhdGVfcHVibGljYXRpb24oUEdjb25uICpjb25uLCBMb2dpY2FsUmVwSW5mbyAq ZGJpbmZvKTsKK3N0YXRpYyB2b2lkIGRyb3BfcHVibGljYXRpb24oUEdjb25uICpjb25uLCBM b2dpY2FsUmVwSW5mbyAqZGJpbmZvKTsKK3N0YXRpYyB2b2lkIGNyZWF0ZV9zdWJzY3JpcHRp b24oUEdjb25uICpjb25uLCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvKTsKK3N0YXRpYyB2b2lk IGRyb3Bfc3Vic2NyaXB0aW9uKFBHY29ubiAqY29ubiwgTG9naWNhbFJlcEluZm8gKmRiaW5m byk7CitzdGF0aWMgdm9pZCBzZXRfcmVwbGljYXRpb25fcHJvZ3Jlc3MoUEdjb25uICpjb25u LCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvLCBjb25zdCBjaGFyICpsc24pOworc3RhdGljIHZv aWQgZW5hYmxlX3N1YnNjcmlwdGlvbihQR2Nvbm4gKmNvbm4sIExvZ2ljYWxSZXBJbmZvICpk YmluZm8pOworCisjZGVmaW5lCVVTRUNfUEVSX1NFQwkxMDAwMDAwCisjZGVmaW5lCVdBSVRf SU5URVJWQUwJMQkJLyogMSBzZWNvbmQgKi8KKworLyogT3B0aW9ucyAqLworc3RhdGljIGNv bnN0IGNoYXIgKnByb2duYW1lOworCitzdGF0aWMgY2hhciAqcHJpbWFyeV9zbG90X25hbWUg PSBOVUxMOworc3RhdGljIGJvb2wgZHJ5X3J1biA9IGZhbHNlOworCitzdGF0aWMgYm9vbCBz dWNjZXNzID0gZmFsc2U7CisKK3N0YXRpYyBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvOworc3Rh dGljIGludAludW1fZGJzID0gMDsKKworZW51bSBXYWl0UE1SZXN1bHQKK3sKKwlQT1NUTUFT VEVSX1JFQURZLAorCVBPU1RNQVNURVJfU1RBTkRCWSwKKwlQT1NUTUFTVEVSX1NUSUxMX1NU QVJUSU5HLAorCVBPU1RNQVNURVJfRkFJTEVECit9OworCisKKy8qCisgKiBDbGVhbnVwIG9i amVjdHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYnkgcGdfY3JlYXRlc3Vic2NyaWJlciBpZiB0aGVy ZSBpcyBhbiBlcnJvci4KKyAqCisgKiBSZXBsaWNhdGlvbiBzbG90cywgcHVibGljYXRpb25z IGFuZCBzdWJzY3JpcHRpb25zIGFyZSBjcmVhdGVkLiBEZXBlbmRpbmcgb24KKyAqIHRoZSBz dGVwIGl0IGZhaWxlZCwgaXQgc2hvdWxkIHJlbW92ZSB0aGUgYWxyZWFkeSBjcmVhdGVkIG9i amVjdHMgaWYgaXQgaXMKKyAqIHBvc3NpYmxlIChzb21ldGltZXMgaXQgd29uJ3Qgd29yayBk dWUgdG8gYSBjb25uZWN0aW9uIGlzc3VlKS4KKyAqLworc3RhdGljIHZvaWQKK2NsZWFudXBf b2JqZWN0c19hdGV4aXQodm9pZCkKK3sKKwlQR2Nvbm4JICAgKmNvbm47CisJaW50CQkJaTsK KworCWlmIChzdWNjZXNzKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Ri czsgaSsrKQorCXsKKwkJaWYgKGRiaW5mb1tpXS5tYWRlX3N1YnNjcmlwdGlvbikKKwkJewor CQkJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoZGJpbmZvW2ldLnN1YmNvbm5pbmZvKTsKKwkJ CWlmIChjb25uICE9IE5VTEwpCisJCQl7CisJCQkJZHJvcF9zdWJzY3JpcHRpb24oY29ubiwg JmRiaW5mb1tpXSk7CisJCQkJaWYgKGRiaW5mb1tpXS5tYWRlX3B1YmxpY2F0aW9uKQorCQkJ CQlkcm9wX3B1YmxpY2F0aW9uKGNvbm4sICZkYmluZm9baV0pOworCQkJCWRpc2Nvbm5lY3Rf ZGF0YWJhc2UoY29ubik7CisJCQl9CisJCX0KKworCQlpZiAoZGJpbmZvW2ldLm1hZGVfcHVi bGljYXRpb24gfHwgZGJpbmZvW2ldLm1hZGVfcmVwbHNsb3QpCisJCXsKKwkJCWNvbm4gPSBj b25uZWN0X2RhdGFiYXNlKGRiaW5mb1tpXS5wdWJjb25uaW5mbyk7CisJCQlpZiAoY29ubiAh PSBOVUxMKQorCQkJeworCQkJCWlmIChkYmluZm9baV0ubWFkZV9wdWJsaWNhdGlvbikKKwkJ CQkJZHJvcF9wdWJsaWNhdGlvbihjb25uLCAmZGJpbmZvW2ldKTsKKwkJCQlpZiAoZGJpbmZv W2ldLm1hZGVfcmVwbHNsb3QpCisJCQkJCWRyb3BfcmVwbGljYXRpb25fc2xvdChjb25uLCAm ZGJpbmZvW2ldLCBkYmluZm9baV0uc3VibmFtZSk7CisJCQkJZGlzY29ubmVjdF9kYXRhYmFz ZShjb25uKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3VzYWdlKHZvaWQp Cit7CisJcHJpbnRmKF8oIiVzIGNyZWF0ZXMgYSBuZXcgbG9naWNhbCByZXBsaWNhIGZyb20g YSBzdGFuZGJ5IHNlcnZlci5cblxuIiksCisJCSAgIHByb2duYW1lKTsKKwlwcmludGYoXygi VXNhZ2U6XG4iKSk7CisJcHJpbnRmKF8oIiAgJXMgW09QVElPTl0uLi5cbiIpLCBwcm9nbmFt ZSk7CisJcHJpbnRmKF8oIlxuT3B0aW9uczpcbiIpKTsKKwlwcmludGYoXygiIC1ELCAtLXBn ZGF0YT1EQVRBRElSICAgICAgICAgICAgICAgIGxvY2F0aW9uIGZvciB0aGUgc3Vic2NyaWJl ciBkYXRhIGRpcmVjdG9yeVxuIikpOworCXByaW50ZihfKCIgLVAsIC0tcHVibGlzaGVyLXNl cnZlcj1DT05OU1RSICAgICAgcHVibGlzaGVyIGNvbm5lY3Rpb24gc3RyaW5nXG4iKSk7CisJ cHJpbnRmKF8oIiAtUywgLS1zdWJzY3JpYmVyLXNlcnZlcj1DT05OU1RSICAgICBzdWJzY3Jp YmVyIGNvbm5lY3Rpb24gc3RyaW5nXG4iKSk7CisJcHJpbnRmKF8oIiAtZCwgLS1kYXRhYmFz ZT1EQk5BTUUgICAgICAgICAgICAgICBkYXRhYmFzZSB0byBjcmVhdGUgYSBzdWJzY3JpcHRp b25cbiIpKTsKKwlwcmludGYoXygiIC1uLCAtLWRyeS1ydW4gICAgICAgICAgICAgICAgICAg ICAgIHN0b3AgYmVmb3JlIG1vZGlmeWluZyBhbnl0aGluZ1xuIikpOworCXByaW50ZihfKCIg LXQsIC0tcmVjb3ZlcnktdGltZW91dD1TRUNTICAgICAgICAgc2Vjb25kcyB0byB3YWl0IGZv ciByZWNvdmVyeSB0byBlbmRcbiIpKTsKKwlwcmludGYoXygiIC1yLCAtLXJldGFpbiAgICAg ICAgICAgICAgICAgICAgICAgIHJldGFpbiBsb2cgZmlsZSBhZnRlciBzdWNjZXNzXG4iKSk7 CisJcHJpbnRmKF8oIiAtdiwgLS12ZXJib3NlICAgICAgICAgICAgICAgICAgICAgICBvdXRw dXQgdmVyYm9zZSBtZXNzYWdlc1xuIikpOworCXByaW50ZihfKCIgLVYsIC0tdmVyc2lvbiAg ICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24sIHRoZW4g ZXhpdFxuIikpOworCXByaW50ZihfKCIgLT8sIC0taGVscCAgICAgICAgICAgICAgICAgICAg ICAgICAgc2hvdyB0aGlzIGhlbHAsIHRoZW4gZXhpdFxuIikpOworCXByaW50ZihfKCJcblJl cG9ydCBidWdzIHRvIDwlcz4uXG4iKSwgUEFDS0FHRV9CVUdSRVBPUlQpOworCXByaW50Zihf KCIlcyBob21lIHBhZ2U6IDwlcz5cbiIpLCBQQUNLQUdFX05BTUUsIFBBQ0tBR0VfVVJMKTsK K30KKworLyoKKyAqIFZhbGlkYXRlIGEgY29ubmVjdGlvbiBzdHJpbmcuIFJldHVybnMgYSBi YXNlIGNvbm5lY3Rpb24gc3RyaW5nIHRoYXQgaXMgYQorICogY29ubmVjdGlvbiBzdHJpbmcg d2l0aG91dCBhIGRhdGFiYXNlIG5hbWUuCisgKiBTaW5jZSB3ZSBtaWdodCBwcm9jZXNzIG11 bHRpcGxlIGRhdGFiYXNlcywgZWFjaCBkYXRhYmFzZSBuYW1lIHdpbGwgYmUKKyAqIGFwcGVu ZGVkIHRvIHRoaXMgYmFzZSBjb25uZWN0aW9uIHN0cmluZyB0byBwcm92aWRlIGEgZmluYWwg Y29ubmVjdGlvbiBzdHJpbmcuCisgKiBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IChkYm5hbWUp IGlzIG5vdCBudWxsLCByZXR1cm5zIGRibmFtZSBpZiB0aGUgcHJvdmlkZWQKKyAqIGNvbm5l Y3Rpb24gc3RyaW5nIGNvbnRhaW5zIGl0LiBJZiBvcHRpb24gLS1kYXRhYmFzZSBpcyBub3Qg cHJvdmlkZWQsIHVzZXMKKyAqIGRibmFtZSBhcyB0aGUgb25seSBkYXRhYmFzZSB0byBzZXR1 cCB0aGUgbG9naWNhbCByZXBsaWNhLgorICogSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNp YmlsaXR5IHRvIGZyZWUgdGhlIHJldHVybmVkIGNvbm5lY3Rpb24gc3RyaW5nIGFuZAorICog ZGJuYW1lLgorICovCitzdGF0aWMgY2hhciAqCitnZXRfYmFzZV9jb25uaW5mbyhjaGFyICpj b25uaW5mbywgY2hhciAqZGJuYW1lKQoreworCVBRRXhwQnVmZmVyIGJ1ZiA9IGNyZWF0ZVBR RXhwQnVmZmVyKCk7CisJUFFjb25uaW5mb09wdGlvbiAqY29ubl9vcHRzID0gTlVMTDsKKwlQ UWNvbm5pbmZvT3B0aW9uICpjb25uX29wdDsKKwljaGFyCSAgICplcnJtc2cgPSBOVUxMOwor CWNoYXIJICAgKnJldDsKKwlpbnQJCQlpOworCisJY29ubl9vcHRzID0gUFFjb25uaW5mb1Bh cnNlKGNvbm5pbmZvLCAmZXJybXNnKTsKKwlpZiAoY29ubl9vcHRzID09IE5VTEwpCisJewor CQlwZ19sb2dfZXJyb3IoImNvdWxkIG5vdCBwYXJzZSBjb25uZWN0aW9uIHN0cmluZzogJXMi LCBlcnJtc2cpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpID0gMDsKKwlmb3IgKGNvbm5f b3B0ID0gY29ubl9vcHRzOyBjb25uX29wdC0+a2V5d29yZCAhPSBOVUxMOyBjb25uX29wdCsr KQorCXsKKwkJaWYgKHN0cmNtcChjb25uX29wdC0+a2V5d29yZCwgImRibmFtZSIpID09IDAg JiYgY29ubl9vcHQtPnZhbCAhPSBOVUxMKQorCQl7CisJCQlpZiAoZGJuYW1lKQorCQkJCWRi bmFtZSA9IHBnX3N0cmR1cChjb25uX29wdC0+dmFsKTsKKwkJCWNvbnRpbnVlOworCQl9CisK KwkJaWYgKGNvbm5fb3B0LT52YWwgIT0gTlVMTCAmJiBjb25uX29wdC0+dmFsWzBdICE9ICdc MCcpCisJCXsKKwkJCWlmIChpID4gMCkKKwkJCQlhcHBlbmRQUUV4cEJ1ZmZlckNoYXIoYnVm LCAnICcpOworCQkJYXBwZW5kUFFFeHBCdWZmZXIoYnVmLCAiJXM9JXMiLCBjb25uX29wdC0+ a2V5d29yZCwgY29ubl9vcHQtPnZhbCk7CisJCQlpKys7CisJCX0KKwl9CisKKwlyZXQgPSBw Z19zdHJkdXAoYnVmLT5kYXRhKTsKKworCWRlc3Ryb3lQUUV4cEJ1ZmZlcihidWYpOworCVBR Y29ubmluZm9GcmVlKGNvbm5fb3B0cyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICog R2V0IHRoZSBkaXJlY3RvcnkgdGhhdCB0aGUgcGdfY3JlYXRlc3Vic2NyaWJlciBpcyBpbi4g U2luY2UgaXQgdXNlcyBvdGhlcgorICogUG9zdGdyZVNRTCBiaW5hcmllcyAocGdfY3RsIGFu ZCBwZ19yZXNldHdhbCksIHRoZSBkaXJlY3RvcnkgaXMgdXNlZCB0byBidWlsZAorICogdGhl IGZ1bGwgcGF0aCBmb3IgaXQuCisgKi8KK3N0YXRpYyBjaGFyICoKK2dldF9iaW5fZGlyZWN0 b3J5KGNvbnN0IGNoYXIgKnBhdGgpCit7CisJY2hhcgkJZnVsbF9wYXRoW01BWFBHUEFUSF07 CisJY2hhcgkgICAqZGlybmFtZTsKKwljaGFyCSAgICpzZXA7CisKKwlpZiAoZmluZF9teV9l eGVjKHBhdGgsIGZ1bGxfcGF0aCkgPCAwKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJUaGUgcHJv Z3JhbSBcIiVzXCIgaXMgbmVlZGVkIGJ5ICVzIGJ1dCB3YXMgbm90IGZvdW5kIGluIHRoZVxu IgorCQkJCQkgInNhbWUgZGlyZWN0b3J5IGFzIFwiJXNcIi5cbiIsCisJCQkJCSAicGdfY3Rs IiwgcHJvZ25hbWUsIGZ1bGxfcGF0aCk7CisJCXBnX2xvZ19lcnJvcl9oaW50KCJDaGVjayB5 b3VyIGluc3RhbGxhdGlvbi4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKgorCSAqIFN0cmlw IHRoZSBmaWxlIG5hbWUgZnJvbSB0aGUgcGF0aC4gSXQgd2lsbCBiZSB1c2VkIHRvIGJ1aWxk IHRoZSBmdWxsCisJICogcGF0aCBmb3IgYmluYXJpZXMgdXNlZCBieSB0aGlzIHRvb2wuCisJ ICovCisJZGlybmFtZSA9IHBnX21hbGxvYyhNQVhQR1BBVEgpOworCXNlcCA9IHN0cnJjaHIo ZnVsbF9wYXRoLCAncCcpOworCUFzc2VydChzZXAgIT0gTlVMTCk7CisJc3RybGNweShkaXJu YW1lLCBmdWxsX3BhdGgsIHNlcCAtIGZ1bGxfcGF0aCk7CisKKwlwZ19sb2dfZGVidWcoInBn X2N0bCBwYXRoIGlzOiAgJXMvJXMiLCBkaXJuYW1lLCAicGdfY3RsIik7CisJcGdfbG9nX2Rl YnVnKCJwZ19yZXNldHdhbCBwYXRoIGlzOiAgJXMvJXMiLCBkaXJuYW1lLCAicGdfcmVzZXR3 YWwiKTsKKworCXJldHVybiBkaXJuYW1lOworfQorCisvKgorICogSXMgaXQgYSBjbHVzdGVy IGRpcmVjdG9yeT8gVGhlc2UgYXJlIHByZWxpbWluYXJ5IGNoZWNrcy4gSXQgaXMgZmFyIGZy b20KKyAqIG1ha2luZyBhbiBhY2N1cmF0ZSBjaGVjay4gSWYgaXQgaXMgbm90IGEgY2xvbmUg ZnJvbSB0aGUgcHVibGlzaGVyLCBpdCB3aWxsCisgKiBldmVudHVhbGx5IGZhaWwgaW4gYSBm dXR1cmUgc3RlcC4KKyAqLworc3RhdGljIGJvb2wKK2NoZWNrX2RhdGFfZGlyZWN0b3J5KGNv bnN0IGNoYXIgKmRhdGFkaXIpCit7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwljaGFyCQl2 ZXJzaW9uZmlsZVtNQVhQR1BBVEhdOworCisJcGdfbG9nX2luZm8oImNoZWNraW5nIGlmIGRp cmVjdG9yeSBcIiVzXCIgaXMgYSBjbHVzdGVyIGRhdGEgZGlyZWN0b3J5IiwKKwkJCQlkYXRh ZGlyKTsKKworCWlmIChzdGF0KGRhdGFkaXIsICZzdGF0YnVmKSAhPSAwKQorCXsKKwkJaWYg KGVycm5vID09IEVOT0VOVCkKKwkJCXBnX2xvZ19lcnJvcigiZGF0YSBkaXJlY3RvcnkgXCIl c1wiIGRvZXMgbm90IGV4aXN0IiwgZGF0YWRpcik7CisJCWVsc2UKKwkJCXBnX2xvZ19lcnJv cigiY291bGQgbm90IGFjY2VzcyBkaXJlY3RvcnkgXCIlc1wiOiAlcyIsIGRhdGFkaXIsIHN0 cmVycm9yKGVycm5vKSk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXNucHJpbnRmKHZl cnNpb25maWxlLCBNQVhQR1BBVEgsICIlcy9QR19WRVJTSU9OIiwgZGF0YWRpcik7CisJaWYg KHN0YXQodmVyc2lvbmZpbGUsICZzdGF0YnVmKSAhPSAwICYmIGVycm5vID09IEVOT0VOVCkK Kwl7CisJCXBnX2xvZ19lcnJvcigiZGlyZWN0b3J5IFwiJXNcIiBpcyBub3QgYSBkYXRhYmFz ZSBjbHVzdGVyIGRpcmVjdG9yeSIsIGRhdGFkaXIpOworCQlyZXR1cm4gZmFsc2U7CisJfQor CisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBBcHBlbmQgZGF0YWJhc2UgbmFtZSBpbnRv IGEgYmFzZSBjb25uZWN0aW9uIHN0cmluZy4KKyAqCisgKiBkYm5hbWUgaXMgdGhlIG9ubHkg cGFyYW1ldGVyIHRoYXQgY2hhbmdlcyBzbyBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGJh c2UKKyAqIGNvbm5lY3Rpb24gc3RyaW5nLiBUaGlzIGZ1bmN0aW9uIGNvbmNhdGVuYXRlcyBk Ym5hbWUgdG8gYnVpbGQgYSAicmVhbCIKKyAqIGNvbm5lY3Rpb24gc3RyaW5nLgorICovCitz dGF0aWMgY2hhciAqCitjb25jYXRfY29ubmluZm9fZGJuYW1lKGNvbnN0IGNoYXIgKmNvbm5p bmZvLCBjb25zdCBjaGFyICpkYm5hbWUpCit7CisJUFFFeHBCdWZmZXIgYnVmID0gY3JlYXRl UFFFeHBCdWZmZXIoKTsKKwljaGFyCSAgICpyZXQ7CisKKwlBc3NlcnQoY29ubmluZm8gIT0g TlVMTCk7CisKKwlhcHBlbmRQUUV4cEJ1ZmZlclN0cihidWYsIGNvbm5pbmZvKTsKKwlhcHBl bmRQUUV4cEJ1ZmZlcihidWYsICIgZGJuYW1lPSVzIiwgZGJuYW1lKTsKKworCXJldCA9IHBn X3N0cmR1cChidWYtPmRhdGEpOworCWRlc3Ryb3lQUUV4cEJ1ZmZlcihidWYpOworCisJcmV0 dXJuIHJldDsKK30KKworLyoKKyAqIFN0b3JlIHB1YmxpY2F0aW9uIGFuZCBzdWJzY3JpcHRp b24gaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyBMb2dpY2FsUmVwSW5mbyAqCitzdG9yZV9w dWJfc3ViX2luZm8oU2ltcGxlU3RyaW5nTGlzdCBkYm5hbWVzLCBjb25zdCBjaGFyICpwdWJf YmFzZV9jb25uaW5mbywgY29uc3QgY2hhciAqc3ViX2Jhc2VfY29ubmluZm8pCit7CisJTG9n aWNhbFJlcEluZm8gKmRiaW5mbzsKKwlTaW1wbGVTdHJpbmdMaXN0Q2VsbCAqY2VsbDsKKwlp bnQJCQlpID0gMDsKKworCWRiaW5mbyA9IChMb2dpY2FsUmVwSW5mbyAqKSBwZ19tYWxsb2Mo bnVtX2RicyAqIHNpemVvZihMb2dpY2FsUmVwSW5mbykpOworCisJZm9yIChjZWxsID0gZGJu YW1lcy5oZWFkOyBjZWxsOyBjZWxsID0gY2VsbC0+bmV4dCkKKwl7CisJCWNoYXIJICAgKmNv bm5pbmZvOworCisJCS8qIFB1Ymxpc2hlci4gKi8KKwkJY29ubmluZm8gPSBjb25jYXRfY29u bmluZm9fZGJuYW1lKHB1Yl9iYXNlX2Nvbm5pbmZvLCBjZWxsLT52YWwpOworCQlkYmluZm9b aV0ucHViY29ubmluZm8gPSBjb25uaW5mbzsKKwkJZGJpbmZvW2ldLmRibmFtZSA9IGNlbGwt PnZhbDsKKwkJZGJpbmZvW2ldLm1hZGVfcmVwbHNsb3QgPSBmYWxzZTsKKwkJZGJpbmZvW2ld Lm1hZGVfcHVibGljYXRpb24gPSBmYWxzZTsKKwkJZGJpbmZvW2ldLm1hZGVfc3Vic2NyaXB0 aW9uID0gZmFsc2U7CisJCS8qIG90aGVyIHN0cnVjdCBmaWVsZHMgd2lsbCBiZSBmaWxsZWQg bGF0ZXIuICovCisKKwkJLyogU3Vic2NyaWJlci4gKi8KKwkJY29ubmluZm8gPSBjb25jYXRf Y29ubmluZm9fZGJuYW1lKHN1Yl9iYXNlX2Nvbm5pbmZvLCBjZWxsLT52YWwpOworCQlkYmlu Zm9baV0uc3ViY29ubmluZm8gPSBjb25uaW5mbzsKKworCQlpKys7CisJfQorCisJcmV0dXJu IGRiaW5mbzsKK30KKworc3RhdGljIFBHY29ubiAqCitjb25uZWN0X2RhdGFiYXNlKGNvbnN0 IGNoYXIgKmNvbm5pbmZvKQoreworCVBHY29ubgkgICAqY29ubjsKKwlQR3Jlc3VsdCAgICpy ZXM7CisKKwljb25uID0gUFFjb25uZWN0ZGIoY29ubmluZm8pOworCWlmIChQUXN0YXR1cyhj b25uKSAhPSBDT05ORUNUSU9OX09LKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJjb25uZWN0aW9u IHRvIGRhdGFiYXNlIGZhaWxlZDogJXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisJCXJl dHVybiBOVUxMOworCX0KKworCS8qIHNlY3VyZSBzZWFyY2hfcGF0aCAqLworCXJlcyA9IFBR ZXhlYyhjb25uLCBBTFdBWVNfU0VDVVJFX1NFQVJDSF9QQVRIX1NRTCk7CisJaWYgKFBRcmVz dWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfVFVQTEVTX09LKQorCXsKKwkJcGdfbG9nX2Vycm9y KCJjb3VsZCBub3QgY2xlYXIgc2VhcmNoX3BhdGg6ICVzIiwgUFFyZXN1bHRFcnJvck1lc3Nh Z2UocmVzKSk7CisJCXJldHVybiBOVUxMOworCX0KKwlQUWNsZWFyKHJlcyk7CisKKwlyZXR1 cm4gY29ubjsKK30KKworc3RhdGljIHZvaWQKK2Rpc2Nvbm5lY3RfZGF0YWJhc2UoUEdjb25u ICpjb25uKQoreworCUFzc2VydChjb25uICE9IE5VTEwpOworCisJUFFmaW5pc2goY29ubik7 Cit9CisKKy8qCisgKiBPYnRhaW4gdGhlIHN5c3RlbSBpZGVudGlmaWVyIHVzaW5nIHRoZSBw cm92aWRlZCBjb25uZWN0aW9uLiBJdCB3aWxsIGJlIHVzZWQKKyAqIHRvIGNvbXBhcmUgaWYg YSBkYXRhIGRpcmVjdG9yeSBpcyBhIGNsb25lIG9mIGFub3RoZXIgb25lLgorICovCitzdGF0 aWMgdWludDY0CitnZXRfcHJpbWFyeV9zeXNpZChjb25zdCBjaGFyICpjb25uaW5mbykKK3sK KwlQR2Nvbm4JICAgKmNvbm47CisJUEdyZXN1bHQgICAqcmVzOworCXVpbnQ2NAkJc3lzaWQ7 CisKKwlwZ19sb2dfaW5mbygiZ2V0dGluZyBzeXN0ZW0gaWRlbnRpZmllciBmcm9tIHB1Ymxp c2hlciIpOworCisJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoY29ubmluZm8pOworCWlmIChj b25uID09IE5VTEwpCisJCWV4aXQoMSk7CisKKwlyZXMgPSBQUWV4ZWMoY29ubiwgIlNFTEVD VCBzeXN0ZW1faWRlbnRpZmllciBGUk9NIHBnX2NvbnRyb2xfc3lzdGVtKCkiKTsKKwlpZiAo UFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19UVVBMRVNfT0spCisJeworCQlQUWNsZWFy KHJlcyk7CisJCWRpc2Nvbm5lY3RfZGF0YWJhc2UoY29ubik7CisJCXBnX2ZhdGFsKCJjb3Vs ZCBub3QgZ2V0IHN5c3RlbSBpZGVudGlmaWVyOiAlcyIsIFBRcmVzdWx0RXJyb3JNZXNzYWdl KHJlcykpOworCX0KKwlpZiAoUFFudHVwbGVzKHJlcykgIT0gMSkKKwl7CisJCVBRY2xlYXIo cmVzKTsKKwkJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uKTsKKwkJcGdfZmF0YWwoImNvdWxk IG5vdCBnZXQgc3lzdGVtIGlkZW50aWZpZXI6IGdvdCAlZCByb3dzLCBleHBlY3RlZCAlZCBy b3ciLAorCQkJCSBQUW50dXBsZXMocmVzKSwgMSk7CisJfQorCisJc3lzaWQgPSBzdHJ0b3U2 NChQUWdldHZhbHVlKHJlcywgMCwgMCksIE5VTEwsIDEwKTsKKworCXBnX2xvZ19pbmZvKCJz eXN0ZW0gaWRlbnRpZmllciBpcyAlbGx1IG9uIHB1Ymxpc2hlciIsICh1bnNpZ25lZCBsb25n IGxvbmcpIHN5c2lkKTsKKworCVBRY2xlYXIocmVzKTsKKwlkaXNjb25uZWN0X2RhdGFiYXNl KGNvbm4pOworCisJcmV0dXJuIHN5c2lkOworfQorCisvKgorICogT2J0YWluIHRoZSBzeXN0 ZW0gaWRlbnRpZmllciBmcm9tIGNvbnRyb2wgZmlsZS4gSXQgd2lsbCBiZSB1c2VkIHRvIGNv bXBhcmUKKyAqIGlmIGEgZGF0YSBkaXJlY3RvcnkgaXMgYSBjbG9uZSBvZiBhbm90aGVyIG9u ZS4gVGhpcyByb3V0aW5lIGlzIHVzZWQgbG9jYWxseQorICogYW5kIGF2b2lkcyBhIGNvbm5l Y3Rpb24uCisgKi8KK3N0YXRpYyB1aW50NjQKK2dldF9zdGFuZGJ5X3N5c2lkKGNvbnN0IGNo YXIgKmRhdGFkaXIpCit7CisJQ29udHJvbEZpbGVEYXRhICpjZjsKKwlib29sCQljcmNfb2s7 CisJdWludDY0CQlzeXNpZDsKKworCXBnX2xvZ19pbmZvKCJnZXR0aW5nIHN5c3RlbSBpZGVu dGlmaWVyIGZyb20gc3Vic2NyaWJlciIpOworCisJY2YgPSBnZXRfY29udHJvbGZpbGUoZGF0 YWRpciwgJmNyY19vayk7CisJaWYgKCFjcmNfb2spCisJCXBnX2ZhdGFsKCJjb250cm9sIGZp bGUgYXBwZWFycyB0byBiZSBjb3JydXB0Iik7CisKKwlzeXNpZCA9IGNmLT5zeXN0ZW1faWRl bnRpZmllcjsKKworCXBnX2xvZ19pbmZvKCJzeXN0ZW0gaWRlbnRpZmllciBpcyAlbGx1IG9u IHN1YnNjcmliZXIiLCAodW5zaWduZWQgbG9uZyBsb25nKSBzeXNpZCk7CisKKwlwZnJlZShj Zik7CisKKwlyZXR1cm4gc3lzaWQ7Cit9CisKKy8qCisgKiBNb2RpZnkgdGhlIHN5c3RlbSBp ZGVudGlmaWVyLiBTaW5jZSBhIHN0YW5kYnkgc2VydmVyIHByZXNlcnZlcyB0aGUgc3lzdGVt CisgKiBpZGVudGlmaWVyLCBpdCBtYWtlcyBzZW5zZSB0byBjaGFuZ2UgaXQgdG8gYXZvaWQg c2l0dWF0aW9ucyBpbiB3aGljaCBXQUwKKyAqIGZpbGVzIGZyb20gb25lIG9mIHRoZSBzeXN0 ZW1zIG1pZ2h0IGJlIHVzZWQgaW4gdGhlIG90aGVyIG9uZS4KKyAqLworc3RhdGljIHZvaWQK K21vZGlmeV9zdWJzY3JpYmVyX3N5c2lkKGNvbnN0IGNoYXIgKnBnX2Jpbl9kaXIsIENyZWF0 ZVN1YnNjcmliZXJPcHRpb25zICpvcHQpCit7CisJQ29udHJvbEZpbGVEYXRhICpjZjsKKwli b29sCQljcmNfb2s7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwljaGFyCSAgICpjbWRfc3Ry OworCWludAkJCXJjOworCisJcGdfbG9nX2luZm8oIm1vZGlmeWluZyBzeXN0ZW0gaWRlbnRp ZmllciBmcm9tIHN1YnNjcmliZXIiKTsKKworCWNmID0gZ2V0X2NvbnRyb2xmaWxlKG9wdC0+ c3Vic2NyaWJlcl9kaXIsICZjcmNfb2spOworCWlmICghY3JjX29rKQorCQlwZ19mYXRhbCgi Y29udHJvbCBmaWxlIGFwcGVhcnMgdG8gYmUgY29ycnVwdCIpOworCisJLyoKKwkgKiBTZWxl Y3QgYSBuZXcgc3lzdGVtIGlkZW50aWZpZXIuCisJICoKKwkgKiBYWFggdGhpcyBjb2RlIHdh cyBleHRyYWN0ZWQgZnJvbSBCb290U3RyYXBYTE9HKCkuCisJICovCisJZ2V0dGltZW9mZGF5 KCZ0diwgTlVMTCk7CisJY2YtPnN5c3RlbV9pZGVudGlmaWVyID0gKCh1aW50NjQpIHR2LnR2 X3NlYykgPDwgMzI7CisJY2YtPnN5c3RlbV9pZGVudGlmaWVyIHw9ICgodWludDY0KSB0di50 dl91c2VjKSA8PCAxMjsKKwljZi0+c3lzdGVtX2lkZW50aWZpZXIgfD0gZ2V0cGlkKCkgJiAw eEZGRjsKKworCWlmICghZHJ5X3J1bikKKwkJdXBkYXRlX2NvbnRyb2xmaWxlKG9wdC0+c3Vi c2NyaWJlcl9kaXIsIGNmLCB0cnVlKTsKKworCXBnX2xvZ19pbmZvKCJzeXN0ZW0gaWRlbnRp ZmllciBpcyAlbGx1IG9uIHN1YnNjcmliZXIiLCAodW5zaWduZWQgbG9uZyBsb25nKSBjZi0+ c3lzdGVtX2lkZW50aWZpZXIpOworCisJcGdfbG9nX2luZm8oInJ1bm5pbmcgcGdfcmVzZXR3 YWwgb24gdGhlIHN1YnNjcmliZXIiKTsKKworCWNtZF9zdHIgPSBwc3ByaW50ZigiXCIlcy9w Z19yZXNldHdhbFwiIC1EIFwiJXNcIiA+IFwiJXNcIiIsIHBnX2Jpbl9kaXIsIG9wdC0+c3Vi c2NyaWJlcl9kaXIsIERFVk5VTEwpOworCisJcGdfbG9nX2RlYnVnKCJjb21tYW5kIGlzOiAl cyIsIGNtZF9zdHIpOworCisJaWYgKCFkcnlfcnVuKQorCXsKKwkJcmMgPSBzeXN0ZW0oY21k X3N0cik7CisJCWlmIChyYyA9PSAwKQorCQkJcGdfbG9nX2luZm8oInN1YnNjcmliZXIgc3Vj Y2Vzc2Z1bGx5IGNoYW5nZWQgdGhlIHN5c3RlbSBpZGVudGlmaWVyIik7CisJCWVsc2UKKwkJ CXBnX2ZhdGFsKCJzdWJzY3JpYmVyIGZhaWxlZCB0byBjaGFuZ2Ugc3lzdGVtIGlkZW50aWZp ZXI6IGV4aXQgY29kZTogJWQiLCByYyk7CisJfQorCisJcGZyZWUoY2YpOworfQorCisvKgor ICogQ3JlYXRlIHRoZSBwdWJsaWNhdGlvbnMgYW5kIHJlcGxpY2F0aW9uIHNsb3RzIGluIHBy ZXBhcmF0aW9uIGZvciBsb2dpY2FsCisgKiByZXBsaWNhdGlvbi4KKyAqLworc3RhdGljIGJv b2wKK3NldHVwX3B1Ymxpc2hlcihMb2dpY2FsUmVwSW5mbyAqZGJpbmZvKQoreworCVBHY29u bgkgICAqY29ubjsKKwlQR3Jlc3VsdCAgICpyZXM7CisKKwlmb3IgKGludCBpID0gMDsgaSA8 IG51bV9kYnM7IGkrKykKKwl7CisJCWNoYXIJCXB1Ym5hbWVbTkFNRURBVEFMRU5dOworCQlj aGFyCQlyZXBsc2xvdG5hbWVbTkFNRURBVEFMRU5dOworCisJCWNvbm4gPSBjb25uZWN0X2Rh dGFiYXNlKGRiaW5mb1tpXS5wdWJjb25uaW5mbyk7CisJCWlmIChjb25uID09IE5VTEwpCisJ CQlleGl0KDEpOworCisJCXJlcyA9IFBRZXhlYyhjb25uLAorCQkJCQkgIlNFTEVDVCBvaWQg RlJPTSBwZ19jYXRhbG9nLnBnX2RhdGFiYXNlIFdIRVJFIGRhdG5hbWUgPSBjdXJyZW50X2Rh dGFiYXNlKCkiKTsKKwkJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfVFVQTEVT X09LKQorCQl7CisJCQlwZ19sb2dfZXJyb3IoImNvdWxkIG5vdCBvYnRhaW4gZGF0YWJhc2Ug T0lEOiAlcyIsIFBRcmVzdWx0RXJyb3JNZXNzYWdlKHJlcykpOworCQkJcmV0dXJuIGZhbHNl OworCQl9CisKKwkJaWYgKFBRbnR1cGxlcyhyZXMpICE9IDEpCisJCXsKKwkJCXBnX2xvZ19l cnJvcigiY291bGQgbm90IG9idGFpbiBkYXRhYmFzZSBPSUQ6IGdvdCAlZCByb3dzLCBleHBl Y3RlZCAlZCByb3dzIiwKKwkJCQkJCSBQUW50dXBsZXMocmVzKSwgMSk7CisJCQlyZXR1cm4g ZmFsc2U7CisJCX0KKworCQkvKiBSZW1lbWJlciBkYXRhYmFzZSBPSUQuICovCisJCWRiaW5m b1tpXS5vaWQgPSBzdHJ0b3VsKFBRZ2V0dmFsdWUocmVzLCAwLCAwKSwgTlVMTCwgMTApOwor CisJCVBRY2xlYXIocmVzKTsKKworCQkvKgorCQkgKiBCdWlsZCB0aGUgcHVibGljYXRpb24g bmFtZS4gVGhlIG5hbWUgbXVzdCBub3QgZXhjZWVkIE5BTUVEQVRBTEVOIC0KKwkJICogMS4g VGhpcyBjdXJyZW50IHNjaGVtYSB1c2VzIGEgbWF4aW11bSBvZiAzMSBjaGFyYWN0ZXJzICgy MCArIDEwICsKKwkJICogJ1wwJykuCisJCSAqLworCQlzbnByaW50ZihwdWJuYW1lLCBzaXpl b2YocHVibmFtZSksICJwZ19jcmVhdGVzdWJzY3JpYmVyXyV1IiwgZGJpbmZvW2ldLm9pZCk7 CisJCWRiaW5mb1tpXS5wdWJuYW1lID0gcGdfc3RyZHVwKHB1Ym5hbWUpOworCisJCS8qCisJ CSAqIENyZWF0ZSBwdWJsaWNhdGlvbiBvbiBwdWJsaXNoZXIuIFRoaXMgc3RlcCBzaG91bGQg YmUgZXhlY3V0ZWQKKwkJICogKmJlZm9yZSogcHJvbW90aW5nIHRoZSBzdWJzY3JpYmVyIHRv IGF2b2lkIGFueSB0cmFuc2FjdGlvbnMgYmV0d2VlbgorCQkgKiBjb25zaXN0ZW50IExTTiBh bmQgdGhlIG5ldyBwdWJsaWNhdGlvbiByb3dzIChzdWNoIHRyYW5zYWN0aW9ucworCQkgKiB3 b3VsZG4ndCBzZWUgdGhlIG5ldyBwdWJsaWNhdGlvbiByb3dzIHJlc3VsdGluZyBpbiBhbiBl cnJvcikuCisJCSAqLworCQljcmVhdGVfcHVibGljYXRpb24oY29ubiwgJmRiaW5mb1tpXSk7 CisKKwkJLyoKKwkJICogQnVpbGQgdGhlIHJlcGxpY2F0aW9uIHNsb3QgbmFtZS4gVGhlIG5h bWUgbXVzdCBub3QgZXhjZWVkCisJCSAqIE5BTUVEQVRBTEVOIC0gMS4gVGhpcyBjdXJyZW50 IHNjaGVtYSB1c2VzIGEgbWF4aW11bSBvZiA0MgorCQkgKiBjaGFyYWN0ZXJzICgyMCArIDEw ICsgMSArIDEwICsgJ1wwJykuIFBJRCBpcyBpbmNsdWRlZCB0byByZWR1Y2UgdGhlCisJCSAq IHByb2JhYmlsaXR5IG9mIGNvbGxpc2lvbi4gQnkgZGVmYXVsdCwgc3Vic2NyaXB0aW9uIG5h bWUgaXMgdXNlZCBhcworCQkgKiByZXBsaWNhdGlvbiBzbG90IG5hbWUuCisJCSAqLworCQlz bnByaW50ZihyZXBsc2xvdG5hbWUsIHNpemVvZihyZXBsc2xvdG5hbWUpLAorCQkJCSAicGdf Y3JlYXRlc3Vic2NyaWJlcl8ldV8lZCIsCisJCQkJIGRiaW5mb1tpXS5vaWQsCisJCQkJIChp bnQpIGdldHBpZCgpKTsKKwkJZGJpbmZvW2ldLnN1Ym5hbWUgPSBwZ19zdHJkdXAocmVwbHNs b3RuYW1lKTsKKworCQkvKiBDcmVhdGUgcmVwbGljYXRpb24gc2xvdCBvbiBwdWJsaXNoZXIu ICovCisJCWlmIChjcmVhdGVfbG9naWNhbF9yZXBsaWNhdGlvbl9zbG90KGNvbm4sICZkYmlu Zm9baV0sIGZhbHNlKSAhPSBOVUxMIHx8IGRyeV9ydW4pCisJCQlwZ19sb2dfaW5mbygiY3Jl YXRlIHJlcGxpY2F0aW9uIHNsb3QgXCIlc1wiIG9uIHB1Ymxpc2hlciIsIHJlcGxzbG90bmFt ZSk7CisJCWVsc2UKKwkJCXJldHVybiBmYWxzZTsKKworCQlkaXNjb25uZWN0X2RhdGFiYXNl KGNvbm4pOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKgorICogSXMgdGhlIHByaW1h cnkgc2VydmVyIHJlYWR5IGZvciBsb2dpY2FsIHJlcGxpY2F0aW9uPworICovCitzdGF0aWMg Ym9vbAorY2hlY2tfcHVibGlzaGVyKExvZ2ljYWxSZXBJbmZvICpkYmluZm8pCit7CisJUEdj b25uCSAgICpjb25uOworCVBHcmVzdWx0ICAgKnJlczsKKwlQUUV4cEJ1ZmZlciBzdHIgPSBj cmVhdGVQUUV4cEJ1ZmZlcigpOworCisJY2hhcgkgICAqd2FsX2xldmVsOworCWludAkJCW1h eF9yZXBzbG90czsKKwlpbnQJCQljdXJfcmVwc2xvdHM7CisJaW50CQkJbWF4X3dhbHNlbmRl cnM7CisJaW50CQkJY3VyX3dhbHNlbmRlcnM7CisKKwlwZ19sb2dfaW5mbygiY2hlY2tpbmcg c2V0dGluZ3Mgb24gcHVibGlzaGVyIik7CisKKwkvKgorCSAqIExvZ2ljYWwgcmVwbGljYXRp b24gcmVxdWlyZXMgYSBmZXcgcGFyYW1ldGVycyB0byBiZSBzZXQgb24gcHVibGlzaGVyLgor CSAqIFNpbmNlIHRoZXNlIHBhcmFtZXRlcnMgYXJlIG5vdCBhIHJlcXVpcmVtZW50IGZvciBw aHlzaWNhbCByZXBsaWNhdGlvbiwKKwkgKiB3ZSBzaG91bGQgY2hlY2sgaXQgdG8gbWFrZSBz dXJlIGl0IHdvbid0IGZhaWwuCisJICoKKwkgKiB3YWxfbGV2ZWwgPSBsb2dpY2FsIG1heF9y ZXBsaWNhdGlvbl9zbG90cyA+PSBjdXJyZW50ICsgbnVtYmVyIG9mIGRicyB0bworCSAqIGJl IGNvbnZlcnRlZCBtYXhfd2FsX3NlbmRlcnMgPj0gY3VycmVudCArIG51bWJlciBvZiBkYnMg dG8gYmUgY29udmVydGVkCisJICovCisJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoZGJpbmZv WzBdLnB1YmNvbm5pbmZvKTsKKwlpZiAoY29ubiA9PSBOVUxMKQorCQlleGl0KDEpOworCisJ cmVzID0gUFFleGVjKGNvbm4sCisJCQkJICJXSVRIIHdsIEFTIChTRUxFQ1Qgc2V0dGluZyBB UyB3YWxsZXZlbCBGUk9NIHBnX3NldHRpbmdzIFdIRVJFIG5hbWUgPSAnd2FsX2xldmVsJyks IgorCQkJCSAiICAgICB0b3RhbF9tcnMgQVMgKFNFTEVDVCBzZXR0aW5nIEFTIHRtcnMgRlJP TSBwZ19zZXR0aW5ncyBXSEVSRSBuYW1lID0gJ21heF9yZXBsaWNhdGlvbl9zbG90cycpLCIK KwkJCQkgIiAgICAgY3VyX21ycyBBUyAoU0VMRUNUIGNvdW50KCopIEFTIGNtcnMgRlJPTSBw Z19yZXBsaWNhdGlvbl9zbG90cyksIgorCQkJCSAiICAgICB0b3RhbF9td3MgQVMgKFNFTEVD VCBzZXR0aW5nIEFTIHRtd3MgRlJPTSBwZ19zZXR0aW5ncyBXSEVSRSBuYW1lID0gJ21heF93 YWxfc2VuZGVycycpLCIKKwkJCQkgIiAgICAgY3VyX213cyBBUyAoU0VMRUNUIGNvdW50KCop IEFTIGNtd3MgRlJPTSBwZ19zdGF0X2FjdGl2aXR5IFdIRVJFIGJhY2tlbmRfdHlwZSA9ICd3 YWxzZW5kZXInKSIKKwkJCQkgIlNFTEVDVCB3YWxsZXZlbCwgdG1ycywgY21ycywgdG13cywg Y213cyBGUk9NIHdsLCB0b3RhbF9tcnMsIGN1cl9tcnMsIHRvdGFsX213cywgY3VyX213cyIp OworCisJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfVFVQTEVTX09LKQorCXsK KwkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3Qgb2J0YWluIHB1Ymxpc2hlciBzZXR0aW5nczog JXMiLCBQUXJlc3VsdEVycm9yTWVzc2FnZShyZXMpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0K KworCXdhbF9sZXZlbCA9IHN0cmR1cChQUWdldHZhbHVlKHJlcywgMCwgMCkpOworCW1heF9y ZXBzbG90cyA9IGF0b2koUFFnZXR2YWx1ZShyZXMsIDAsIDEpKTsKKwljdXJfcmVwc2xvdHMg PSBhdG9pKFBRZ2V0dmFsdWUocmVzLCAwLCAyKSk7CisJbWF4X3dhbHNlbmRlcnMgPSBhdG9p KFBRZ2V0dmFsdWUocmVzLCAwLCAzKSk7CisJY3VyX3dhbHNlbmRlcnMgPSBhdG9pKFBRZ2V0 dmFsdWUocmVzLCAwLCA0KSk7CisKKwlQUWNsZWFyKHJlcyk7CisKKwlwZ19sb2dfZGVidWco InN1YnNjcmliZXI6IHdhbF9sZXZlbDogJXMiLCB3YWxfbGV2ZWwpOworCXBnX2xvZ19kZWJ1 Zygic3Vic2NyaWJlcjogbWF4X3JlcGxpY2F0aW9uX3Nsb3RzOiAlZCIsIG1heF9yZXBzbG90 cyk7CisJcGdfbG9nX2RlYnVnKCJzdWJzY3JpYmVyOiBjdXJyZW50IHJlcGxpY2F0aW9uIHNs b3RzOiAlZCIsIGN1cl9yZXBzbG90cyk7CisJcGdfbG9nX2RlYnVnKCJzdWJzY3JpYmVyOiBt YXhfd2FsX3NlbmRlcnM6ICVkIiwgbWF4X3dhbHNlbmRlcnMpOworCXBnX2xvZ19kZWJ1Zygi c3Vic2NyaWJlcjogY3VycmVudCB3YWwgc2VuZGVyczogJWQiLCBjdXJfd2Fsc2VuZGVycyk7 CisKKwkvKgorCSAqIElmIHN0YW5kYnkgc2V0cyBwcmltYXJ5X3Nsb3RfbmFtZSwgY2hlY2sg aWYgdGhpcyByZXBsaWNhdGlvbiBzbG90IGlzIGluCisJICogdXNlIG9uIHByaW1hcnkgZm9y IFdBTCByZXRlbnRpb24gcHVycG9zZXMuIFRoaXMgcmVwbGljYXRpb24gc2xvdCBoYXMgbm8K KwkgKiB1c2UgYWZ0ZXIgdGhlIHRyYW5zZm9ybWF0aW9uLCBoZW5jZSwgaXQgd2lsbCBiZSBy ZW1vdmVkIGF0IHRoZSBlbmQgb2YKKwkgKiB0aGlzIHByb2Nlc3MuCisJICovCisJaWYgKHBy aW1hcnlfc2xvdF9uYW1lKQorCXsKKwkJYXBwZW5kUFFFeHBCdWZmZXIoc3RyLAorCQkJCQkJ ICAiU0VMRUNUIDEgRlJPTSBwZ19yZXBsaWNhdGlvbl9zbG90cyBXSEVSRSBhY3RpdmUgQU5E IHNsb3RfbmFtZSA9ICclcyciLCBwcmltYXJ5X3Nsb3RfbmFtZSk7CisKKwkJcGdfbG9nX2Rl YnVnKCJjb21tYW5kIGlzOiAlcyIsIHN0ci0+ZGF0YSk7CisKKwkJcmVzID0gUFFleGVjKGNv bm4sIHN0ci0+ZGF0YSk7CisJCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX1RV UExFU19PSykKKwkJeworCQkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3Qgb2J0YWluIHJlcGxp Y2F0aW9uIHNsb3QgaW5mb3JtYXRpb246ICVzIiwgUFFyZXN1bHRFcnJvck1lc3NhZ2UocmVz KSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoUFFudHVwbGVzKHJlcykgIT0g MSkKKwkJeworCQkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3Qgb2J0YWluIHJlcGxpY2F0aW9u IHNsb3QgaW5mb3JtYXRpb246IGdvdCAlZCByb3dzLCBleHBlY3RlZCAlZCByb3ciLAorCQkJ CQkJIFBRbnR1cGxlcyhyZXMpLCAxKTsKKwkJCXBnX2ZyZWUocHJpbWFyeV9zbG90X25hbWUp OyAvKiBpdCBpcyBub3QgYmVpbmcgdXNlZC4gKi8KKwkJCXByaW1hcnlfc2xvdF9uYW1lID0g TlVMTDsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXBnX2xvZ19p bmZvKCJwcmltYXJ5IGhhcyByZXBsaWNhdGlvbiBzbG90IFwiJXNcIiIsIHByaW1hcnlfc2xv dF9uYW1lKTsKKwkJfQorCisJCVBRY2xlYXIocmVzKTsKKwl9CisKKwlkaXNjb25uZWN0X2Rh dGFiYXNlKGNvbm4pOworCisJaWYgKHN0cmNtcCh3YWxfbGV2ZWwsICJsb2dpY2FsIikgIT0g MCkKKwl7CisJCXBnX2xvZ19lcnJvcigicHVibGlzaGVyIHJlcXVpcmVzIHdhbF9sZXZlbCA+ PSBsb2dpY2FsIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAobWF4X3JlcHNsb3Rz IC0gY3VyX3JlcHNsb3RzIDwgbnVtX2RicykKKwl7CisJCXBnX2xvZ19lcnJvcigicHVibGlz aGVyIHJlcXVpcmVzICVkIHJlcGxpY2F0aW9uIHNsb3RzLCBidXQgb25seSAlZCByZW1haW4i LCBudW1fZGJzLCBtYXhfcmVwc2xvdHMgLSBjdXJfcmVwc2xvdHMpOworCQlwZ19sb2dfZXJy b3JfaGludCgiQ29uc2lkZXIgaW5jcmVhc2luZyBtYXhfcmVwbGljYXRpb25fc2xvdHMgdG8g YXQgbGVhc3QgJWQuIiwgY3VyX3JlcHNsb3RzICsgbnVtX2Ricyk7CisJCXJldHVybiBmYWxz ZTsKKwl9CisKKwlpZiAobWF4X3dhbHNlbmRlcnMgLSBjdXJfd2Fsc2VuZGVycyA8IG51bV9k YnMpCisJeworCQlwZ19sb2dfZXJyb3IoInB1Ymxpc2hlciByZXF1aXJlcyAlZCB3YWwgc2Vu ZGVyIHByb2Nlc3NlcywgYnV0IG9ubHkgJWQgcmVtYWluIiwgbnVtX2RicywgbWF4X3dhbHNl bmRlcnMgLSBjdXJfd2Fsc2VuZGVycyk7CisJCXBnX2xvZ19lcnJvcl9oaW50KCJDb25zaWRl ciBpbmNyZWFzaW5nIG1heF93YWxfc2VuZGVycyB0byBhdCBsZWFzdCAlZC4iLCBjdXJfd2Fs c2VuZGVycyArIG51bV9kYnMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRy dWU7Cit9CisKKy8qCisgKiBJcyB0aGUgc3RhbmRieSBzZXJ2ZXIgcmVhZHkgZm9yIGxvZ2lj YWwgcmVwbGljYXRpb24/CisgKi8KK3N0YXRpYyBib29sCitjaGVja19zdWJzY3JpYmVyKExv Z2ljYWxSZXBJbmZvICpkYmluZm8pCit7CisJUEdjb25uCSAgICpjb25uOworCVBHcmVzdWx0 ICAgKnJlczsKKwlQUUV4cEJ1ZmZlciBzdHIgPSBjcmVhdGVQUUV4cEJ1ZmZlcigpOworCisJ aW50CQkJbWF4X2xyd29ya2VyczsKKwlpbnQJCQltYXhfcmVwc2xvdHM7CisJaW50CQkJbWF4 X3dwcm9jczsKKworCXBnX2xvZ19pbmZvKCJjaGVja2luZyBzZXR0aW5ncyBvbiBzdWJzY3Jp YmVyIik7CisKKwljb25uID0gY29ubmVjdF9kYXRhYmFzZShkYmluZm9bMF0uc3ViY29ubmlu Zm8pOworCWlmIChjb25uID09IE5VTEwpCisJCWV4aXQoMSk7CisKKwkvKiBUaGUgdGFyZ2V0 IHNlcnZlciBtdXN0IGJlIGEgc3RhbmRieSAqLworCXJlcyA9IFBRZXhlYyhjb25uLCAiU0VM RUNUIHBnX2NhdGFsb2cucGdfaXNfaW5fcmVjb3ZlcnkoKSIpOworCisJaWYgKFBRcmVzdWx0 U3RhdHVzKHJlcykgIT0gUEdSRVNfVFVQTEVTX09LKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJj b3VsZCBub3Qgb2J0YWluIHJlY292ZXJ5IHByb2dyZXNzIik7CisJCXJldHVybiBmYWxzZTsK Kwl9CisKKwlpZiAoc3RyY21wKFBRZ2V0dmFsdWUocmVzLCAwLCAwKSwgInQiKSAhPSAwKQor CXsKKwkJcGdfbG9nX2Vycm9yKCJUaGUgdGFyZ2V0IHNlcnZlciBpcyBub3QgYSBzdGFuZGJ5 Iik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIFN1YnNjcmlwdGlvbnMgY2Fu IG9ubHkgYmUgY3JlYXRlZCBieSByb2xlcyB0aGF0IGhhdmUgdGhlIHByaXZpbGVnZXMgb2YK KwkgKiBwZ19jcmVhdGVfc3Vic2NyaXB0aW9uIHJvbGUgYW5kIENSRUFURSBwcml2aWxlZ2Vz IG9uIHRoZSBzcGVjaWZpZWQKKwkgKiBkYXRhYmFzZS4KKwkgKi8KKwlhcHBlbmRQUUV4cEJ1 ZmZlcihzdHIsICJTRUxFQ1QgcGdfaGFzX3JvbGUoY3VycmVudF91c2VyLCAldSwgJ01FTUJF UicpLCBoYXNfZGF0YWJhc2VfcHJpdmlsZWdlKGN1cnJlbnRfdXNlciwgJyVzJywgJ0NSRUFU RScpLCBoYXNfZnVuY3Rpb25fcHJpdmlsZWdlKGN1cnJlbnRfdXNlciwgJ3BnX2NhdGFsb2cu cGdfcmVwbGljYXRpb25fb3JpZ2luX2FkdmFuY2UodGV4dCwgcGdfbHNuKScsICdFWEVDVVRF JykiLCBST0xFX1BHX0NSRUFURV9TVUJTQ1JJUFRJT04sIGRiaW5mb1swXS5kYm5hbWUpOwor CisJcGdfbG9nX2RlYnVnKCJjb21tYW5kIGlzOiAlcyIsIHN0ci0+ZGF0YSk7CisKKwlyZXMg PSBQUWV4ZWMoY29ubiwgc3RyLT5kYXRhKTsKKworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMp ICE9IFBHUkVTX1RVUExFU19PSykKKwl7CisJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IG9i dGFpbiBhY2Nlc3MgcHJpdmlsZWdlIGluZm9ybWF0aW9uOiAlcyIsIFBRcmVzdWx0RXJyb3JN ZXNzYWdlKHJlcykpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHN0cmNtcChQUWdl dHZhbHVlKHJlcywgMCwgMCksICJ0IikgIT0gMCkKKwl7CisJCXBnX2xvZ19lcnJvcigicGVy bWlzc2lvbiBkZW5pZWQgdG8gY3JlYXRlIHN1YnNjcmlwdGlvbiIpOworCQlwZ19sb2dfZXJy b3JfaGludCgiT25seSByb2xlcyB3aXRoIHByaXZpbGVnZXMgb2YgdGhlIFwiJXNcIiByb2xl IG1heSBjcmVhdGUgc3Vic2NyaXB0aW9ucy4iLAorCQkJCQkJICAicGdfY3JlYXRlX3N1YnNj cmlwdGlvbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChzdHJjbXAoUFFnZXR2YWx1 ZShyZXMsIDAsIDEpLCAidCIpICE9IDApCisJeworCQlwZ19sb2dfZXJyb3IoInBlcm1pc3Np b24gZGVuaWVkIGZvciBkYXRhYmFzZSAlcyIsIGRiaW5mb1swXS5kYm5hbWUpOworCQlyZXR1 cm4gZmFsc2U7CisJfQorCWlmIChzdHJjbXAoUFFnZXR2YWx1ZShyZXMsIDAsIDEpLCAidCIp ICE9IDApCisJeworCQlwZ19sb2dfZXJyb3IoInBlcm1pc3Npb24gZGVuaWVkIGZvciBmdW5j dGlvbiBcIiVzXCIiLCAicGdfY2F0YWxvZy5wZ19yZXBsaWNhdGlvbl9vcmlnaW5fYWR2YW5j ZSh0ZXh0LCBwZ19sc24pIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlkZXN0cm95UFFF eHBCdWZmZXIoc3RyKTsKKwlQUWNsZWFyKHJlcyk7CisKKwkvKgorCSAqIExvZ2ljYWwgcmVw bGljYXRpb24gcmVxdWlyZXMgYSBmZXcgcGFyYW1ldGVycyB0byBiZSBzZXQgb24gc3Vic2Ny aWJlci4KKwkgKiBTaW5jZSB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBub3QgYSByZXF1aXJlbWVu dCBmb3IgcGh5c2ljYWwgcmVwbGljYXRpb24sCisJICogd2Ugc2hvdWxkIGNoZWNrIGl0IHRv IG1ha2Ugc3VyZSBpdCB3b24ndCBmYWlsLgorCSAqCisJICogbWF4X3JlcGxpY2F0aW9uX3Ns b3RzID49IG51bWJlciBvZiBkYnMgdG8gYmUgY29udmVydGVkCisJICogbWF4X2xvZ2ljYWxf cmVwbGljYXRpb25fd29ya2VycyA+PSBudW1iZXIgb2YgZGJzIHRvIGJlIGNvbnZlcnRlZAor CSAqIG1heF93b3JrZXJfcHJvY2Vzc2VzID49IDEgKyBudW1iZXIgb2YgZGJzIHRvIGJlIGNv bnZlcnRlZAorCSAqLworCXJlcyA9IFBRZXhlYyhjb25uLAorCQkJCSAiU0VMRUNUIHNldHRp bmcgRlJPTSBwZ19zZXR0aW5ncyBXSEVSRSBuYW1lIElOICgnbWF4X2xvZ2ljYWxfcmVwbGlj YXRpb25fd29ya2VycycsICdtYXhfcmVwbGljYXRpb25fc2xvdHMnLCAnbWF4X3dvcmtlcl9w cm9jZXNzZXMnLCAncHJpbWFyeV9zbG90X25hbWUnKSBPUkRFUiBCWSBuYW1lIik7CisKKwlp ZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19UVVBMRVNfT0spCisJeworCQlwZ19s b2dfZXJyb3IoImNvdWxkIG5vdCBvYnRhaW4gc3Vic2NyaWJlciBzZXR0aW5nczogJXMiLCBQ UXJlc3VsdEVycm9yTWVzc2FnZShyZXMpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCW1h eF9scndvcmtlcnMgPSBhdG9pKFBRZ2V0dmFsdWUocmVzLCAwLCAwKSk7CisJbWF4X3JlcHNs b3RzID0gYXRvaShQUWdldHZhbHVlKHJlcywgMSwgMCkpOworCW1heF93cHJvY3MgPSBhdG9p KFBRZ2V0dmFsdWUocmVzLCAyLCAwKSk7CisJaWYgKHN0cmNtcChQUWdldHZhbHVlKHJlcywg MywgMCksICIiKSAhPSAwKQorCQlwcmltYXJ5X3Nsb3RfbmFtZSA9IHBnX3N0cmR1cChQUWdl dHZhbHVlKHJlcywgMywgMCkpOworCisJcGdfbG9nX2RlYnVnKCJzdWJzY3JpYmVyOiBtYXhf bG9naWNhbF9yZXBsaWNhdGlvbl93b3JrZXJzOiAlZCIsIG1heF9scndvcmtlcnMpOworCXBn X2xvZ19kZWJ1Zygic3Vic2NyaWJlcjogbWF4X3JlcGxpY2F0aW9uX3Nsb3RzOiAlZCIsIG1h eF9yZXBzbG90cyk7CisJcGdfbG9nX2RlYnVnKCJzdWJzY3JpYmVyOiBtYXhfd29ya2VyX3By b2Nlc3NlczogJWQiLCBtYXhfd3Byb2NzKTsKKwlwZ19sb2dfZGVidWcoInN1YnNjcmliZXI6 IHByaW1hcnlfc2xvdF9uYW1lOiAlcyIsIHByaW1hcnlfc2xvdF9uYW1lKTsKKworCVBRY2xl YXIocmVzKTsKKworCWRpc2Nvbm5lY3RfZGF0YWJhc2UoY29ubik7CisKKwlpZiAobWF4X3Jl cHNsb3RzIDwgbnVtX2RicykKKwl7CisJCXBnX2xvZ19lcnJvcigic3Vic2NyaWJlciByZXF1 aXJlcyAlZCByZXBsaWNhdGlvbiBzbG90cywgYnV0IG9ubHkgJWQgcmVtYWluIiwgbnVtX2Ri cywgbWF4X3JlcHNsb3RzKTsKKwkJcGdfbG9nX2Vycm9yX2hpbnQoIkNvbnNpZGVyIGluY3Jl YXNpbmcgbWF4X3JlcGxpY2F0aW9uX3Nsb3RzIHRvIGF0IGxlYXN0ICVkLiIsIG51bV9kYnMp OworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKG1heF9scndvcmtlcnMgPCBudW1fZGJz KQorCXsKKwkJcGdfbG9nX2Vycm9yKCJzdWJzY3JpYmVyIHJlcXVpcmVzICVkIGxvZ2ljYWwg cmVwbGljYXRpb24gd29ya2VycywgYnV0IG9ubHkgJWQgcmVtYWluIiwgbnVtX2RicywgbWF4 X2xyd29ya2Vycyk7CisJCXBnX2xvZ19lcnJvcl9oaW50KCJDb25zaWRlciBpbmNyZWFzaW5n IG1heF9sb2dpY2FsX3JlcGxpY2F0aW9uX3dvcmtlcnMgdG8gYXQgbGVhc3QgJWQuIiwgbnVt X2Ricyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAobWF4X3dwcm9jcyA8IG51bV9k YnMgKyAxKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJzdWJzY3JpYmVyIHJlcXVpcmVzICVkIHdv cmtlciBwcm9jZXNzZXMsIGJ1dCBvbmx5ICVkIHJlbWFpbiIsIG51bV9kYnMgKyAxLCBtYXhf d3Byb2NzKTsKKwkJcGdfbG9nX2Vycm9yX2hpbnQoIkNvbnNpZGVyIGluY3JlYXNpbmcgbWF4 X3dvcmtlcl9wcm9jZXNzZXMgdG8gYXQgbGVhc3QgJWQuIiwgbnVtX2RicyArIDEpOworCQly ZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBDcmVhdGUg dGhlIHN1YnNjcmlwdGlvbnMsIGFkanVzdCB0aGUgaW5pdGlhbCBsb2NhdGlvbiBmb3IgbG9n aWNhbCByZXBsaWNhdGlvbiBhbmQKKyAqIGVuYWJsZSB0aGUgc3Vic2NyaXB0aW9ucy4gVGhh dCdzIHRoZSBsYXN0IHN0ZXAgZm9yIGxvZ2ljYWwgcmVwbGlhdGlvbiBzZXR1cC4KKyAqLwor c3RhdGljIGJvb2wKK3NldHVwX3N1YnNjcmliZXIoTG9naWNhbFJlcEluZm8gKmRiaW5mbywg Y29uc3QgY2hhciAqY29uc2lzdGVudF9sc24pCit7CisJUEdjb25uCSAgICpjb25uOworCisJ Zm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZGJzOyBpKyspCisJeworCQkvKiBDb25uZWN0IHRv IHN1YnNjcmliZXIuICovCisJCWNvbm4gPSBjb25uZWN0X2RhdGFiYXNlKGRiaW5mb1tpXS5z dWJjb25uaW5mbyk7CisJCWlmIChjb25uID09IE5VTEwpCisJCQlleGl0KDEpOworCisJCS8q CisJCSAqIFNpbmNlIHRoZSBwdWJsaWNhdGlvbiB3YXMgY3JlYXRlZCBiZWZvcmUgdGhlIGNv bnNpc3RlbnQgTFNOLCBpdCBpcworCQkgKiBhdmFpbGFibGUgb24gdGhlIHN1YnNjcmliZXIg d2hlbiB0aGUgcGh5c2ljYWwgcmVwbGljYSBpcyBwcm9tb3RlZC4KKwkJICogUmVtb3ZlIHB1 YmxpY2F0aW9ucyBmcm9tIHRoZSBzdWJzY3JpYmVyIGJlY2F1c2UgaXQgaGFzIG5vIHVzZS4K KwkJICovCisJCWRyb3BfcHVibGljYXRpb24oY29ubiwgJmRiaW5mb1tpXSk7CisKKwkJY3Jl YXRlX3N1YnNjcmlwdGlvbihjb25uLCAmZGJpbmZvW2ldKTsKKworCQkvKiBTZXQgdGhlIHJl cGxpY2F0aW9uIHByb2dyZXNzIHRvIHRoZSBjb3JyZWN0IExTTi4gKi8KKwkJc2V0X3JlcGxp Y2F0aW9uX3Byb2dyZXNzKGNvbm4sICZkYmluZm9baV0sIGNvbnNpc3RlbnRfbHNuKTsKKwor CQkvKiBFbmFibGUgc3Vic2NyaXB0aW9uLiAqLworCQllbmFibGVfc3Vic2NyaXB0aW9uKGNv bm4sICZkYmluZm9baV0pOworCisJCWRpc2Nvbm5lY3RfZGF0YWJhc2UoY29ubik7CisJfQor CisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBsb2dpY2FsIHJlcGxpY2F0 aW9uIHNsb3QgYW5kIHJldHVybnMgYSBMU04uCisgKgorICogQ3JlYXRlUmVwbGljYXRpb25T bG90KCkgaXMgbm90IHVzZWQgYmVjYXVzZSBpdCBkb2VzIG5vdCBwcm92aWRlIHRoZSBvbmUt cm93CisgKiByZXN1bHQgc2V0IHRoYXQgY29udGFpbnMgdGhlIExTTi4KKyAqLworc3RhdGlj IGNoYXIgKgorY3JlYXRlX2xvZ2ljYWxfcmVwbGljYXRpb25fc2xvdChQR2Nvbm4gKmNvbm4s IExvZ2ljYWxSZXBJbmZvICpkYmluZm8sCisJCQkJCQkJCWJvb2wgdGVtcG9yYXJ5KQorewor CVBRRXhwQnVmZmVyIHN0ciA9IGNyZWF0ZVBRRXhwQnVmZmVyKCk7CisJUEdyZXN1bHQgICAq cmVzID0gTlVMTDsKKwljaGFyCQlzbG90X25hbWVbTkFNRURBVEFMRU5dOworCWNoYXIJICAg KmxzbiA9IE5VTEw7CisKKwlBc3NlcnQoY29ubiAhPSBOVUxMKTsKKworCS8qCisJICogVGhp cyB0ZW1wb3JhcnkgcmVwbGljYXRpb24gc2xvdCBpcyBvbmx5IHVzZWQgZm9yIGNhdGNodXAg cHVycG9zZXMuCisJICovCisJaWYgKHRlbXBvcmFyeSkKKwl7CisJCXNucHJpbnRmKHNsb3Rf bmFtZSwgTkFNRURBVEFMRU4sICJwZ19jcmVhdGVzdWJzY3JpYmVyXyVkX3N0YXJ0cG9pbnQi LAorCQkJCSAoaW50KSBnZXRwaWQoKSk7CisJfQorCWVsc2UKKwl7CisJCXNucHJpbnRmKHNs b3RfbmFtZSwgTkFNRURBVEFMRU4sICIlcyIsIGRiaW5mby0+c3VibmFtZSk7CisJfQorCisJ cGdfbG9nX2luZm8oImNyZWF0aW5nIHRoZSByZXBsaWNhdGlvbiBzbG90IFwiJXNcIiBvbiBk YXRhYmFzZSBcIiVzXCIiLCBzbG90X25hbWUsIGRiaW5mby0+ZGJuYW1lKTsKKworCWFwcGVu ZFBRRXhwQnVmZmVyKHN0ciwgIlNFTEVDVCBsc24gRlJPTSBwZ19jcmVhdGVfbG9naWNhbF9y ZXBsaWNhdGlvbl9zbG90KCclcycsICclcycsICVzLCBmYWxzZSwgZmFsc2UpIiwKKwkJCQkJ ICBzbG90X25hbWUsICJwZ291dHB1dCIsIHRlbXBvcmFyeSA/ICJ0cnVlIiA6ICJmYWxzZSIp OworCisJcGdfbG9nX2RlYnVnKCJjb21tYW5kIGlzOiAlcyIsIHN0ci0+ZGF0YSk7CisKKwlp ZiAoIWRyeV9ydW4pCisJeworCQlyZXMgPSBQUWV4ZWMoY29ubiwgc3RyLT5kYXRhKTsKKwkJ aWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfVFVQTEVTX09LKQorCQl7CisJCQlw Z19sb2dfZXJyb3IoImNvdWxkIG5vdCBjcmVhdGUgcmVwbGljYXRpb24gc2xvdCBcIiVzXCIg b24gZGF0YWJhc2UgXCIlc1wiOiAlcyIsIHNsb3RfbmFtZSwgZGJpbmZvLT5kYm5hbWUsCisJ CQkJCQkgUFFyZXN1bHRFcnJvck1lc3NhZ2UocmVzKSk7CisJCQlyZXR1cm4gbHNuOworCQl9 CisJfQorCisJLyogZm9yIGNsZWFudXAgcHVycG9zZXMgKi8KKwlpZiAoIXRlbXBvcmFyeSkK KwkJZGJpbmZvLT5tYWRlX3JlcGxzbG90ID0gdHJ1ZTsKKworCWlmICghZHJ5X3J1bikKKwl7 CisJCWxzbiA9IHBnX3N0cmR1cChQUWdldHZhbHVlKHJlcywgMCwgMCkpOworCQlQUWNsZWFy KHJlcyk7CisJfQorCisJZGVzdHJveVBRRXhwQnVmZmVyKHN0cik7CisKKwlyZXR1cm4gbHNu OworfQorCitzdGF0aWMgdm9pZAorZHJvcF9yZXBsaWNhdGlvbl9zbG90KFBHY29ubiAqY29u biwgTG9naWNhbFJlcEluZm8gKmRiaW5mbywgY29uc3QgY2hhciAqc2xvdF9uYW1lKQorewor CVBRRXhwQnVmZmVyIHN0ciA9IGNyZWF0ZVBRRXhwQnVmZmVyKCk7CisJUEdyZXN1bHQgICAq cmVzOworCisJQXNzZXJ0KGNvbm4gIT0gTlVMTCk7CisKKwlwZ19sb2dfaW5mbygiZHJvcHBp bmcgdGhlIHJlcGxpY2F0aW9uIHNsb3QgXCIlc1wiIG9uIGRhdGFiYXNlIFwiJXNcIiIsIHNs b3RfbmFtZSwgZGJpbmZvLT5kYm5hbWUpOworCisJYXBwZW5kUFFFeHBCdWZmZXIoc3RyLCAi U0VMRUNUIHBnX2Ryb3BfcmVwbGljYXRpb25fc2xvdCgnJXMnKSIsIHNsb3RfbmFtZSk7CisK KwlwZ19sb2dfZGVidWcoImNvbW1hbmQgaXM6ICVzIiwgc3RyLT5kYXRhKTsKKworCWlmICgh ZHJ5X3J1bikKKwl7CisJCXJlcyA9IFBRZXhlYyhjb25uLCBzdHItPmRhdGEpOworCQlpZiAo UFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19UVVBMRVNfT0spCisJCQlwZ19sb2dfZXJy b3IoImNvdWxkIG5vdCBkcm9wIHJlcGxpY2F0aW9uIHNsb3QgXCIlc1wiIG9uIGRhdGFiYXNl IFwiJXNcIjogJXMiLCBzbG90X25hbWUsIGRiaW5mby0+ZGJuYW1lLAorCQkJCQkJIFBRZXJy b3JNZXNzYWdlKGNvbm4pKTsKKworCQlQUWNsZWFyKHJlcyk7CisJfQorCisJZGVzdHJveVBR RXhwQnVmZmVyKHN0cik7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBkaXJlY3RvcnkgdG8gc3Rv cmUgYW55IGxvZyBpbmZvcm1hdGlvbi4gQWRqdXN0IHRoZSBwZXJtaXNzaW9ucy4KKyAqIFJl dHVybiBhIGZpbGUgbmFtZSAoZnVsbCBwYXRoKSB0aGF0J3MgdXNlZCBieSB0aGUgc3RhbmRi eSBzZXJ2ZXIgd2hlbiBpdCBpcworICogcnVuLgorICovCitzdGF0aWMgY2hhciAqCitzZXR1 cF9zZXJ2ZXJfbG9nZmlsZShjb25zdCBjaGFyICpkYXRhZGlyKQoreworCWNoYXIJCXRpbWVi dWZbMTI4XTsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lOworCXRpbWVfdAkJdHQ7CisJaW50CQkJ bGVuOworCWNoYXIJICAgKmJhc2VfZGlyOworCWNoYXIJICAgKmZpbGVuYW1lOworCisJYmFz ZV9kaXIgPSAoY2hhciAqKSBwZ19tYWxsb2MwKE1BWFBHUEFUSCk7CisJbGVuID0gc25wcmlu dGYoYmFzZV9kaXIsIE1BWFBHUEFUSCwgIiVzLyVzIiwgZGF0YWRpciwgUEdTX09VVFBVVF9E SVIpOworCWlmIChsZW4gPj0gTUFYUEdQQVRIKQorCQlwZ19mYXRhbCgiZGlyZWN0b3J5IHBh dGggZm9yIHN1YnNjcmliZXIgaXMgdG9vIGxvbmciKTsKKworCWlmICghR2V0RGF0YURpcmVj dG9yeUNyZWF0ZVBlcm0oZGF0YWRpcikpCisJCXBnX2ZhdGFsKCJjb3VsZCBub3QgcmVhZCBw ZXJtaXNzaW9ucyBvZiBkaXJlY3RvcnkgXCIlc1wiOiAlbSIsCisJCQkJIGRhdGFkaXIpOwor CisJaWYgKG1rZGlyKGJhc2VfZGlyLCBwZ19kaXJfY3JlYXRlX21vZGUpIDwgMCAmJiBlcnJu byAhPSBFRVhJU1QpCisJCXBnX2ZhdGFsKCJjb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeSBc IiVzXCI6ICVtIiwgYmFzZV9kaXIpOworCisJLyogYXBwZW5kIHRpbWVzdGFtcCB3aXRoIElT TyA4NjAxIGZvcm1hdC4gKi8KKwlnZXR0aW1lb2ZkYXkoJnRpbWUsIE5VTEwpOworCXR0ID0g KHRpbWVfdCkgdGltZS50dl9zZWM7CisJc3RyZnRpbWUodGltZWJ1Ziwgc2l6ZW9mKHRpbWVi dWYpLCAiJVklbSVkVCVIJU0lUyIsIGxvY2FsdGltZSgmdHQpKTsKKwlzbnByaW50Zih0aW1l YnVmICsgc3RybGVuKHRpbWVidWYpLCBzaXplb2YodGltZWJ1ZikgLSBzdHJsZW4odGltZWJ1 ZiksCisJCQkgIi4lMDNkIiwgKGludCkgKHRpbWUudHZfdXNlYyAvIDEwMDApKTsKKworCWZp bGVuYW1lID0gKGNoYXIgKikgcGdfbWFsbG9jMChNQVhQR1BBVEgpOworCWxlbiA9IHNucHJp bnRmKGZpbGVuYW1lLCBNQVhQR1BBVEgsICIlcy8lcy9zZXJ2ZXJfc3RhcnRfJXMubG9nIiwg ZGF0YWRpciwgUEdTX09VVFBVVF9ESVIsIHRpbWVidWYpOworCWlmIChsZW4gPj0gTUFYUEdQ QVRIKQorCQlwZ19mYXRhbCgibG9nIGZpbGUgcGF0aCBpcyB0b28gbG9uZyIpOworCisJcmV0 dXJuIGZpbGVuYW1lOworfQorCitzdGF0aWMgdm9pZAorc3RhcnRfc3RhbmRieV9zZXJ2ZXIo Y29uc3QgY2hhciAqcGdfYmluX2RpciwgY29uc3QgY2hhciAqZGF0YWRpciwgY29uc3QgY2hh ciAqbG9nZmlsZSkKK3sKKwljaGFyCSAgICpwZ19jdGxfY21kOworCWludAkJCXJjOworCisJ cGdfY3RsX2NtZCA9IHBzcHJpbnRmKCJcIiVzL3BnX2N0bFwiIHN0YXJ0IC1EIFwiJXNcIiAt cyAtbCBcIiVzXCIiLCBwZ19iaW5fZGlyLCBkYXRhZGlyLCBsb2dmaWxlKTsKKwlyYyA9IHN5 c3RlbShwZ19jdGxfY21kKTsKKwlwZ19jdGxfc3RhdHVzKHBnX2N0bF9jbWQsIHJjLCAxKTsK K30KKworc3RhdGljIHZvaWQKK3N0b3Bfc3RhbmRieV9zZXJ2ZXIoY29uc3QgY2hhciAqcGdf YmluX2RpciwgY29uc3QgY2hhciAqZGF0YWRpcikKK3sKKwljaGFyCSAgICpwZ19jdGxfY21k OworCWludAkJCXJjOworCisJcGdfY3RsX2NtZCA9IHBzcHJpbnRmKCJcIiVzL3BnX2N0bFwi IHN0b3AgLUQgXCIlc1wiIC1zIiwgcGdfYmluX2RpciwgZGF0YWRpcik7CisJcmMgPSBzeXN0 ZW0ocGdfY3RsX2NtZCk7CisJcGdfY3RsX3N0YXR1cyhwZ19jdGxfY21kLCByYywgMCk7Cit9 CisKKy8qCisgKiBSZXBvcnRzIGEgc3VpdGFibGUgbWVzc2FnZSBpZiBwZ19jdGwgZmFpbHMu CisgKi8KK3N0YXRpYyB2b2lkCitwZ19jdGxfc3RhdHVzKGNvbnN0IGNoYXIgKnBnX2N0bF9j bWQsIGludCByYywgaW50IGFjdGlvbikKK3sKKwlpZiAocmMgIT0gMCkKKwl7CisJCWlmIChX SUZFWElURUQocmMpKQorCQl7CisJCQlwZ19sb2dfZXJyb3IoInBnX2N0bCBmYWlsZWQgd2l0 aCBleGl0IGNvZGUgJWQiLCBXRVhJVFNUQVRVUyhyYykpOworCQl9CisJCWVsc2UgaWYgKFdJ RlNJR05BTEVEKHJjKSkKKwkJeworI2lmIGRlZmluZWQoV0lOMzIpCisJCQlwZ19sb2dfZXJy b3IoInBnX2N0bCB3YXMgdGVybWluYXRlZCBieSBleGNlcHRpb24gMHglWCIsIFdURVJNU0lH KHJjKSk7CisJCQlwZ19sb2dfZXJyb3JfZGV0YWlsKCJTZWUgQyBpbmNsdWRlIGZpbGUgXCJu dHN0YXR1cy5oXCIgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGhleGFkZWNpbWFsIHZhbHVl LiIpOworI2Vsc2UKKwkJCXBnX2xvZ19lcnJvcigicGdfY3RsIHdhcyB0ZXJtaW5hdGVkIGJ5 IHNpZ25hbCAlZDogJXMiLAorCQkJCQkJIFdURVJNU0lHKHJjKSwgcGdfc3Ryc2lnbmFsKFdU RVJNU0lHKHJjKSkpOworI2VuZGlmCisJCX0KKwkJZWxzZQorCQl7CisJCQlwZ19sb2dfZXJy b3IoInBnX2N0bCBleGl0ZWQgd2l0aCB1bnJlY29nbml6ZWQgc3RhdHVzICVkIiwgcmMpOwor CQl9CisKKwkJcGdfbG9nX2Vycm9yX2RldGFpbCgiVGhlIGZhaWxlZCBjb21tYW5kIHdhczog JXMiLCBwZ19jdGxfY21kKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoYWN0aW9uKQorCQlw Z19sb2dfaW5mbygicG9zdG1hc3RlciB3YXMgc3RhcnRlZCIpOworCWVsc2UKKwkJcGdfbG9n X2luZm8oInBvc3RtYXN0ZXIgd2FzIHN0b3BwZWQiKTsKK30KKworLyoKKyAqIFJldHVybnMg YWZ0ZXIgdGhlIHNlcnZlciBmaW5pc2hlcyB0aGUgcmVjb3ZlcnkgcHJvY2Vzcy4KKyAqCisg KiBJZiByZWNvdmVyeV90aW1lb3V0IG9wdGlvbiBpcyBzZXQsIHRlcm1pbmF0ZSBhYm5vcm1h bGx5IHdpdGhvdXQgZmluaXNoaW5nCisgKiB0aGUgcmVjb3ZlcnkgcHJvY2Vzcy4gQnkgZGVm YXVsdCwgaXQgd2FpdHMgZm9yZXZlci4KKyAqLworc3RhdGljIHZvaWQKK3dhaXRfZm9yX2Vu ZF9yZWNvdmVyeShjb25zdCBjaGFyICpjb25uaW5mbywgY29uc3QgY2hhciAqcGdfYmluX2Rp ciwgQ3JlYXRlU3Vic2NyaWJlck9wdGlvbnMgKm9wdCkKK3sKKwlQR2Nvbm4JICAgKmNvbm47 CisJUEdyZXN1bHQgICAqcmVzOworCWludAkJCXN0YXR1cyA9IFBPU1RNQVNURVJfU1RJTExf U1RBUlRJTkc7CisJaW50CQkJdGltZXIgPSAwOworCisJcGdfbG9nX2luZm8oIndhaXRpbmcg dGhlIHBvc3RtYXN0ZXIgdG8gcmVhY2ggdGhlIGNvbnNpc3RlbnQgc3RhdGUiKTsKKworCWNv bm4gPSBjb25uZWN0X2RhdGFiYXNlKGNvbm5pbmZvKTsKKwlpZiAoY29ubiA9PSBOVUxMKQor CQlleGl0KDEpOworCisJZm9yICg7OykKKwl7CisJCWJvb2wJCWluX3JlY292ZXJ5OworCisJ CXJlcyA9IFBRZXhlYyhjb25uLCAiU0VMRUNUIHBnX2NhdGFsb2cucGdfaXNfaW5fcmVjb3Zl cnkoKSIpOworCisJCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX1RVUExFU19P SykKKwkJCXBnX2ZhdGFsKCJjb3VsZCBub3Qgb2J0YWluIHJlY292ZXJ5IHByb2dyZXNzIik7 CisKKwkJaWYgKFBRbnR1cGxlcyhyZXMpICE9IDEpCisJCQlwZ19mYXRhbCgidW5leHBlY3Rl ZCByZXN1bHQgZnJvbSBwZ19pc19pbl9yZWNvdmVyeSBmdW5jdGlvbiIpOworCisJCWluX3Jl Y292ZXJ5ID0gKHN0cmNtcChQUWdldHZhbHVlKHJlcywgMCwgMCksICJ0IikgPT0gMCk7CisK KwkJUFFjbGVhcihyZXMpOworCisJCS8qCisJCSAqIERvZXMgdGhlIHJlY292ZXJ5IHByb2Nl c3MgZmluaXNoPyBJbiBkcnkgcnVuIG1vZGUsIHRoZXJlIGlzIG5vCisJCSAqIHJlY292ZXJ5 IG1vZGUuIEJhaWwgb3V0IGFzIHRoZSByZWNvdmVyeSBwcm9jZXNzIGhhcyBlbmRlZC4KKwkJ ICovCisJCWlmICghaW5fcmVjb3ZlcnkgfHwgZHJ5X3J1bikKKwkJeworCQkJc3RhdHVzID0g UE9TVE1BU1RFUl9SRUFEWTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogQmFpbCBv dXQgYWZ0ZXIgcmVjb3ZlcnlfdGltZW91dCBzZWNvbmRzIGlmIHRoaXMgb3B0aW9uIGlzIHNl dC4KKwkJICovCisJCWlmIChvcHQtPnJlY292ZXJ5X3RpbWVvdXQgPiAwICYmIHRpbWVyID49 IG9wdC0+cmVjb3ZlcnlfdGltZW91dCkKKwkJeworCQkJc3RvcF9zdGFuZGJ5X3NlcnZlcihw Z19iaW5fZGlyLCBvcHQtPnN1YnNjcmliZXJfZGlyKTsKKwkJCXBnX2ZhdGFsKCJyZWNvdmVy eSB0aW1lZCBvdXQiKTsKKwkJfQorCisJCS8qIEtlZXAgd2FpdGluZy4gKi8KKwkJcGdfdXNs ZWVwKFdBSVRfSU5URVJWQUwgKiBVU0VDX1BFUl9TRUMpOworCisJCXRpbWVyICs9IFdBSVRf SU5URVJWQUw7CisJfQorCisJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uKTsKKworCWlmIChz dGF0dXMgPT0gUE9TVE1BU1RFUl9TVElMTF9TVEFSVElORykKKwkJcGdfZmF0YWwoInNlcnZl ciBkaWQgbm90IGVuZCByZWNvdmVyeSIpOworCisJcGdfbG9nX2luZm8oInBvc3RtYXN0ZXIg cmVhY2hlZCB0aGUgY29uc2lzdGVudCBzdGF0ZSIpOworfQorCisvKgorICogQ3JlYXRlIGEg cHVibGljYXRpb24gdGhhdCBpbmNsdWRlcyBhbGwgdGFibGVzIGluIHRoZSBkYXRhYmFzZS4K KyAqLworc3RhdGljIHZvaWQKK2NyZWF0ZV9wdWJsaWNhdGlvbihQR2Nvbm4gKmNvbm4sIExv Z2ljYWxSZXBJbmZvICpkYmluZm8pCit7CisJUFFFeHBCdWZmZXIgc3RyID0gY3JlYXRlUFFF eHBCdWZmZXIoKTsKKwlQR3Jlc3VsdCAgICpyZXM7CisKKwlBc3NlcnQoY29ubiAhPSBOVUxM KTsKKworCS8qIENoZWNrIGlmIHRoZSBwdWJsaWNhdGlvbiBuZWVkcyB0byBiZSBjcmVhdGVk LiAqLworCWFwcGVuZFBRRXhwQnVmZmVyKHN0ciwKKwkJCQkJICAiU0VMRUNUIHB1YmFsbHRh YmxlcyBGUk9NIHBnX2NhdGFsb2cucGdfcHVibGljYXRpb24gV0hFUkUgcHVibmFtZSA9ICcl cyciLAorCQkJCQkgIGRiaW5mby0+cHVibmFtZSk7CisJcmVzID0gUFFleGVjKGNvbm4sIHN0 ci0+ZGF0YSk7CisJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfVFVQTEVTX09L KQorCXsKKwkJUFFjbGVhcihyZXMpOworCQlQUWZpbmlzaChjb25uKTsKKwkJcGdfZmF0YWwo ImNvdWxkIG5vdCBvYnRhaW4gcHVibGljYXRpb24gaW5mb3JtYXRpb246ICVzIiwKKwkJCQkg UFFyZXN1bHRFcnJvck1lc3NhZ2UocmVzKSk7CisJfQorCisJaWYgKFBRbnR1cGxlcyhyZXMp ID09IDEpCisJeworCQkvKgorCQkgKiBJZiBwdWJsaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhp c3RzIGFuZCBwdWJhbGx0YWJsZXMgaXMgdHJ1ZSwgbGV0J3MKKwkJICogdXNlIGl0LiBBIHBy ZXZpb3VzIHJ1biBvZiBwZ19jcmVhdGVzdWJzY3JpYmVyIG11c3QgaGF2ZSBjcmVhdGVkCisJ CSAqIHRoaXMgcHVibGljYXRpb24uIEJhaWwgb3V0LgorCQkgKi8KKwkJaWYgKHN0cmNtcChQ UWdldHZhbHVlKHJlcywgMCwgMCksICJ0IikgPT0gMCkKKwkJeworCQkJcGdfbG9nX2luZm8o InB1YmxpY2F0aW9uIFwiJXNcIiBhbHJlYWR5IGV4aXN0cyIsIGRiaW5mby0+cHVibmFtZSk7 CisJCQlyZXR1cm47CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKgorCQkJICogVW5mb3J0dW5h dGVseSwgaWYgaXQgcmVhY2hlcyB0aGlzIGNvZGUgcGF0aCwgaXQgd2lsbCBhbHdheXMKKwkJ CSAqIGZhaWwgKHVubGVzcyB5b3UgZGVjaWRlIHRvIGNoYW5nZSB0aGUgZXhpc3RpbmcgcHVi bGljYXRpb24KKwkJCSAqIG5hbWUpLiBUaGF0J3MgYmFkIGJ1dCBpdCBpcyB2ZXJ5IHVubGlr ZWx5IHRoYXQgdGhlIHVzZXIgd2lsbAorCQkJICogY2hvb3NlIGEgbmFtZSB3aXRoIHBnX2Ny ZWF0ZXN1YnNjcmliZXJfIHByZWZpeCBmb2xsb3dlZCBieSB0aGUKKwkJCSAqIGV4YWN0IGRh dGFiYXNlIG9pZCBpbiB3aGljaCBwdWJhbGx0YWJsZXMgaXMgZmFsc2UuCisJCQkgKi8KKwkJ CXBnX2xvZ19lcnJvcigicHVibGljYXRpb24gXCIlc1wiIGRvZXMgbm90IHJlcGxpY2F0ZSBj aGFuZ2VzIGZvciBhbGwgdGFibGVzIiwKKwkJCQkJCSBkYmluZm8tPnB1Ym5hbWUpOworCQkJ cGdfbG9nX2Vycm9yX2hpbnQoIkNvbnNpZGVyIHJlbmFtaW5nIHRoaXMgcHVibGljYXRpb24u Iik7CisJCQlQUWNsZWFyKHJlcyk7CisJCQlQUWZpbmlzaChjb25uKTsKKwkJCWV4aXQoMSk7 CisJCX0KKwl9CisKKwlQUWNsZWFyKHJlcyk7CisJcmVzZXRQUUV4cEJ1ZmZlcihzdHIpOwor CisJcGdfbG9nX2luZm8oImNyZWF0aW5nIHB1YmxpY2F0aW9uIFwiJXNcIiBvbiBkYXRhYmFz ZSBcIiVzXCIiLCBkYmluZm8tPnB1Ym5hbWUsIGRiaW5mby0+ZGJuYW1lKTsKKworCWFwcGVu ZFBRRXhwQnVmZmVyKHN0ciwgIkNSRUFURSBQVUJMSUNBVElPTiAlcyBGT1IgQUxMIFRBQkxF UyIsIGRiaW5mby0+cHVibmFtZSk7CisKKwlwZ19sb2dfZGVidWcoImNvbW1hbmQgaXM6ICVz Iiwgc3RyLT5kYXRhKTsKKworCWlmICghZHJ5X3J1bikKKwl7CisJCXJlcyA9IFBRZXhlYyhj b25uLCBzdHItPmRhdGEpOworCQlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19D T01NQU5EX09LKQorCQl7CisJCQlQUWZpbmlzaChjb25uKTsKKwkJCXBnX2ZhdGFsKCJjb3Vs ZCBub3QgY3JlYXRlIHB1YmxpY2F0aW9uIFwiJXNcIiBvbiBkYXRhYmFzZSBcIiVzXCI6ICVz IiwKKwkJCQkJIGRiaW5mby0+cHVibmFtZSwgZGJpbmZvLT5kYm5hbWUsIFBRZXJyb3JNZXNz YWdlKGNvbm4pKTsKKwkJfQorCX0KKworCS8qIGZvciBjbGVhbnVwIHB1cnBvc2VzICovCisJ ZGJpbmZvLT5tYWRlX3B1YmxpY2F0aW9uID0gdHJ1ZTsKKworCWlmICghZHJ5X3J1bikKKwkJ UFFjbGVhcihyZXMpOworCisJZGVzdHJveVBRRXhwQnVmZmVyKHN0cik7Cit9CisKKy8qCisg KiBSZW1vdmUgcHVibGljYXRpb24gaWYgaXQgY291bGRuJ3QgZmluaXNoIGFsbCBzdGVwcy4K KyAqLworc3RhdGljIHZvaWQKK2Ryb3BfcHVibGljYXRpb24oUEdjb25uICpjb25uLCBMb2dp Y2FsUmVwSW5mbyAqZGJpbmZvKQoreworCVBRRXhwQnVmZmVyIHN0ciA9IGNyZWF0ZVBRRXhw QnVmZmVyKCk7CisJUEdyZXN1bHQgICAqcmVzOworCisJQXNzZXJ0KGNvbm4gIT0gTlVMTCk7 CisKKwlwZ19sb2dfaW5mbygiZHJvcHBpbmcgcHVibGljYXRpb24gXCIlc1wiIG9uIGRhdGFi YXNlIFwiJXNcIiIsIGRiaW5mby0+cHVibmFtZSwgZGJpbmZvLT5kYm5hbWUpOworCisJYXBw ZW5kUFFFeHBCdWZmZXIoc3RyLCAiRFJPUCBQVUJMSUNBVElPTiAlcyIsIGRiaW5mby0+cHVi bmFtZSk7CisKKwlwZ19sb2dfZGVidWcoImNvbW1hbmQgaXM6ICVzIiwgc3RyLT5kYXRhKTsK KworCWlmICghZHJ5X3J1bikKKwl7CisJCXJlcyA9IFBRZXhlYyhjb25uLCBzdHItPmRhdGEp OworCQlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQkJ cGdfbG9nX2Vycm9yKCJjb3VsZCBub3QgZHJvcCBwdWJsaWNhdGlvbiBcIiVzXCIgb24gZGF0 YWJhc2UgXCIlc1wiOiAlcyIsIGRiaW5mby0+cHVibmFtZSwgZGJpbmZvLT5kYm5hbWUsIFBR ZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCQlQUWNsZWFyKHJlcyk7CisJfQorCisJZGVzdHJv eVBRRXhwQnVmZmVyKHN0cik7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBzdWJzY3JpcHRpb24g d2l0aCBzb21lIHByZWRlZmluZWQgb3B0aW9ucy4KKyAqCisgKiBBIHJlcGxpY2F0aW9uIHNs b3Qgd2FzIGFscmVhZHkgY3JlYXRlZCBpbiBhIHByZXZpb3VzIHN0ZXAuIExldCdzIHVzZSBp dC4gQnkKKyAqIGRlZmF1bHQsIHRoZSBzdWJzY3JpcHRpb24gbmFtZSBpcyB1c2VkIGFzIHJl cGxpY2F0aW9uIHNsb3QgbmFtZS4gSXQgaXMKKyAqIG5vdCByZXF1aXJlZCB0byBjb3B5IGRh dGEuIFRoZSBzdWJzY3JpcHRpb24gd2lsbCBiZSBjcmVhdGVkIGJ1dCBpdCB3aWxsIG5vdAor ICogYmUgZW5hYmxlZCBub3cuIFRoYXQncyBiZWNhdXNlIHRoZSByZXBsaWNhdGlvbiBwcm9n cmVzcyBtdXN0IGJlIHNldCBhbmQgdGhlCisgKiByZXBsaWNhdGlvbiBvcmlnaW4gbmFtZSAo b25lIG9mIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMpIGNvbnRhaW5zIHRoZQorICogc3Vic2Ny aXB0aW9uIE9JRCBpbiBpdHMgbmFtZS4gT25jZSB0aGUgc3Vic2NyaXB0aW9uIGlzIGNyZWF0 ZWQsCisgKiBzZXRfcmVwbGljYXRpb25fcHJvZ3Jlc3MoKSBjYW4gb2J0YWluIHRoZSBjaG9z ZW4gb3JpZ2luIG5hbWUgYW5kIHNldCB1cCBpdHMKKyAqIGluaXRpYWwgbG9jYXRpb24uCisg Ki8KK3N0YXRpYyB2b2lkCitjcmVhdGVfc3Vic2NyaXB0aW9uKFBHY29ubiAqY29ubiwgTG9n aWNhbFJlcEluZm8gKmRiaW5mbykKK3sKKwlQUUV4cEJ1ZmZlciBzdHIgPSBjcmVhdGVQUUV4 cEJ1ZmZlcigpOworCVBHcmVzdWx0ICAgKnJlczsKKworCUFzc2VydChjb25uICE9IE5VTEwp OworCisJcGdfbG9nX2luZm8oImNyZWF0aW5nIHN1YnNjcmlwdGlvbiBcIiVzXCIgb24gZGF0 YWJhc2UgXCIlc1wiIiwgZGJpbmZvLT5zdWJuYW1lLCBkYmluZm8tPmRibmFtZSk7CisKKwlh cHBlbmRQUUV4cEJ1ZmZlcihzdHIsCisJCQkJCSAgIkNSRUFURSBTVUJTQ1JJUFRJT04gJXMg Q09OTkVDVElPTiAnJXMnIFBVQkxJQ0FUSU9OICVzICIKKwkJCQkJICAiV0lUSCAoY3JlYXRl X3Nsb3QgPSBmYWxzZSwgY29weV9kYXRhID0gZmFsc2UsIGVuYWJsZWQgPSBmYWxzZSkiLAor CQkJCQkgIGRiaW5mby0+c3VibmFtZSwgZGJpbmZvLT5wdWJjb25uaW5mbywgZGJpbmZvLT5w dWJuYW1lKTsKKworCXBnX2xvZ19kZWJ1ZygiY29tbWFuZCBpczogJXMiLCBzdHItPmRhdGEp OworCisJaWYgKCFkcnlfcnVuKQorCXsKKwkJcmVzID0gUFFleGVjKGNvbm4sIHN0ci0+ZGF0 YSk7CisJCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRfT0spCisJ CXsKKwkJCVBRZmluaXNoKGNvbm4pOworCQkJcGdfZmF0YWwoImNvdWxkIG5vdCBjcmVhdGUg c3Vic2NyaXB0aW9uIFwiJXNcIiBvbiBkYXRhYmFzZSBcIiVzXCI6ICVzIiwKKwkJCQkJIGRi aW5mby0+c3VibmFtZSwgZGJpbmZvLT5kYm5hbWUsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsK KwkJfQorCX0KKworCS8qIGZvciBjbGVhbnVwIHB1cnBvc2VzICovCisJZGJpbmZvLT5tYWRl X3N1YnNjcmlwdGlvbiA9IHRydWU7CisKKwlpZiAoIWRyeV9ydW4pCisJCVBRY2xlYXIocmVz KTsKKworCWRlc3Ryb3lQUUV4cEJ1ZmZlcihzdHIpOworfQorCisvKgorICogUmVtb3ZlIHN1 YnNjcmlwdGlvbiBpZiBpdCBjb3VsZG4ndCBmaW5pc2ggYWxsIHN0ZXBzLgorICovCitzdGF0 aWMgdm9pZAorZHJvcF9zdWJzY3JpcHRpb24oUEdjb25uICpjb25uLCBMb2dpY2FsUmVwSW5m byAqZGJpbmZvKQoreworCVBRRXhwQnVmZmVyIHN0ciA9IGNyZWF0ZVBRRXhwQnVmZmVyKCk7 CisJUEdyZXN1bHQgICAqcmVzOworCisJQXNzZXJ0KGNvbm4gIT0gTlVMTCk7CisKKwlwZ19s b2dfaW5mbygiZHJvcHBpbmcgc3Vic2NyaXB0aW9uIFwiJXNcIiBvbiBkYXRhYmFzZSBcIiVz XCIiLCBkYmluZm8tPnN1Ym5hbWUsIGRiaW5mby0+ZGJuYW1lKTsKKworCWFwcGVuZFBRRXhw QnVmZmVyKHN0ciwgIkRST1AgU1VCU0NSSVBUSU9OICVzIiwgZGJpbmZvLT5zdWJuYW1lKTsK KworCXBnX2xvZ19kZWJ1ZygiY29tbWFuZCBpczogJXMiLCBzdHItPmRhdGEpOworCisJaWYg KCFkcnlfcnVuKQorCXsKKwkJcmVzID0gUFFleGVjKGNvbm4sIHN0ci0+ZGF0YSk7CisJCWlm IChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRfT0spCisJCQlwZ19sb2df ZXJyb3IoImNvdWxkIG5vdCBkcm9wIHN1YnNjcmlwdGlvbiBcIiVzXCIgb24gZGF0YWJhc2Ug XCIlc1wiOiAlcyIsIGRiaW5mby0+c3VibmFtZSwgZGJpbmZvLT5kYm5hbWUsIFBRZXJyb3JN ZXNzYWdlKGNvbm4pKTsKKworCQlQUWNsZWFyKHJlcyk7CisJfQorCisJZGVzdHJveVBRRXhw QnVmZmVyKHN0cik7Cit9CisKKy8qCisgKiBTZXRzIHRoZSByZXBsaWNhdGlvbiBwcm9ncmVz cyB0byB0aGUgY29uc2lzdGVudCBMU04uCisgKgorICogVGhlIHN1YnNjcmliZXIgY2F1Z2h0 IHVwIHRvIHRoZSBjb25zaXN0ZW50IExTTiBwcm92aWRlZCBieSB0aGUgdGVtcG9yYXJ5Cisg KiByZXBsaWNhdGlvbiBzbG90LiBUaGUgZ29hbCBpcyB0byBzZXQgdXAgdGhlIGluaXRpYWwg bG9jYXRpb24gZm9yIHRoZSBsb2dpY2FsCisgKiByZXBsaWNhdGlvbiB0aGF0IGlzIHRoZSBl eGFjdCBMU04gdGhhdCB0aGUgc3Vic2NyaWJlciB3YXMgcHJvbW90ZWQuIE9uY2UgdGhlCisg KiBzdWJzY3JpcHRpb24gaXMgZW5hYmxlZCBpdCB3aWxsIHN0YXJ0IHN0cmVhbWluZyBmcm9t IHRoYXQgbG9jYXRpb24gb253YXJkcy4KKyAqIEluIGRyeSBydW4gbW9kZSwgdGhlIHN1YnNj cmlwdGlvbiBPSUQgYW5kIExTTiBhcmUgc2V0IHRvIGludmFsaWQgdmFsdWVzIGZvcgorICog cHJpbnRpbmcgcHVycG9zZXMuCisgKi8KK3N0YXRpYyB2b2lkCitzZXRfcmVwbGljYXRpb25f cHJvZ3Jlc3MoUEdjb25uICpjb25uLCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvLCBjb25zdCBj aGFyICpsc24pCit7CisJUFFFeHBCdWZmZXIgc3RyID0gY3JlYXRlUFFFeHBCdWZmZXIoKTsK KwlQR3Jlc3VsdCAgICpyZXM7CisJT2lkCQkJc3Vib2lkOworCWNoYXIJCW9yaWdpbm5hbWVb TkFNRURBVEFMRU5dOworCWNoYXIJCWxzbnN0clsxNyArIDFdOyAvKiBNQVhQR19MU05MRU4g PSAxNyAqLworCisJQXNzZXJ0KGNvbm4gIT0gTlVMTCk7CisKKwlhcHBlbmRQUUV4cEJ1ZmZl cihzdHIsCisJCQkJCSAgIlNFTEVDVCBvaWQgRlJPTSBwZ19jYXRhbG9nLnBnX3N1YnNjcmlw dGlvbiBXSEVSRSBzdWJuYW1lID0gJyVzJyIsIGRiaW5mby0+c3VibmFtZSk7CisKKwlyZXMg PSBQUWV4ZWMoY29ubiwgc3RyLT5kYXRhKTsKKwlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAh PSBQR1JFU19UVVBMRVNfT0spCisJeworCQlQUWNsZWFyKHJlcyk7CisJCVBRZmluaXNoKGNv bm4pOworCQlwZ19mYXRhbCgiY291bGQgbm90IG9idGFpbiBzdWJzY3JpcHRpb24gT0lEOiAl cyIsCisJCQkJIFBRcmVzdWx0RXJyb3JNZXNzYWdlKHJlcykpOworCX0KKworCWlmIChQUW50 dXBsZXMocmVzKSAhPSAxICYmICFkcnlfcnVuKQorCXsKKwkJUFFjbGVhcihyZXMpOworCQlQ UWZpbmlzaChjb25uKTsKKwkJcGdfZmF0YWwoImNvdWxkIG5vdCBvYnRhaW4gc3Vic2NyaXB0 aW9uIE9JRDogZ290ICVkIHJvd3MsIGV4cGVjdGVkICVkIHJvd3MiLAorCQkJCSBQUW50dXBs ZXMocmVzKSwgMSk7CisJfQorCisJaWYgKGRyeV9ydW4pCisJeworCQlzdWJvaWQgPSBJbnZh bGlkT2lkOworCQlzbnByaW50Zihsc25zdHIsIHNpemVvZihsc25zdHIpLCAiJVgvJVgiLCBM U05fRk9STUFUX0FSR1MoKFhMb2dSZWNQdHIpIEludmFsaWRYTG9nUmVjUHRyKSk7CisJfQor CWVsc2UKKwl7CisJCXN1Ym9pZCA9IHN0cnRvdWwoUFFnZXR2YWx1ZShyZXMsIDAsIDApLCBO VUxMLCAxMCk7CisJCXNucHJpbnRmKGxzbnN0ciwgc2l6ZW9mKGxzbnN0ciksICIlcyIsIGxz bik7CisJfQorCisJLyoKKwkgKiBUaGUgb3JpZ2luIG5hbWUgaXMgZGVmaW5lZCBhcyBwZ18l dS4gJXUgaXMgdGhlIHN1YnNjcmlwdGlvbiBPSUQuIFNlZQorCSAqIEFwcGx5V29ya2VyTWFp bigpLgorCSAqLworCXNucHJpbnRmKG9yaWdpbm5hbWUsIHNpemVvZihvcmlnaW5uYW1lKSwg InBnXyV1Iiwgc3Vib2lkKTsKKworCVBRY2xlYXIocmVzKTsKKworCXBnX2xvZ19pbmZvKCJz ZXR0aW5nIHRoZSByZXBsaWNhdGlvbiBwcm9ncmVzcyAobm9kZSBuYW1lIFwiJXNcIiA7IExT TiAlcykgb24gZGF0YWJhc2UgXCIlc1wiIiwKKwkJCQlvcmlnaW5uYW1lLCBsc25zdHIsIGRi aW5mby0+ZGJuYW1lKTsKKworCXJlc2V0UFFFeHBCdWZmZXIoc3RyKTsKKwlhcHBlbmRQUUV4 cEJ1ZmZlcihzdHIsCisJCQkJCSAgIlNFTEVDVCBwZ19jYXRhbG9nLnBnX3JlcGxpY2F0aW9u X29yaWdpbl9hZHZhbmNlKCclcycsICclcycpIiwgb3JpZ2lubmFtZSwgbHNuc3RyKTsKKwor CXBnX2xvZ19kZWJ1ZygiY29tbWFuZCBpczogJXMiLCBzdHItPmRhdGEpOworCisJaWYgKCFk cnlfcnVuKQorCXsKKwkJcmVzID0gUFFleGVjKGNvbm4sIHN0ci0+ZGF0YSk7CisJCWlmIChQ UXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX1RVUExFU19PSykKKwkJeworCQkJUFFmaW5p c2goY29ubik7CisJCQlwZ19mYXRhbCgiY291bGQgbm90IHNldCByZXBsaWNhdGlvbiBwcm9n cmVzcyBmb3IgdGhlIHN1YnNjcmlwdGlvbiBcIiVzXCI6ICVzIiwKKwkJCQkJIGRiaW5mby0+ c3VibmFtZSwgUFFyZXN1bHRFcnJvck1lc3NhZ2UocmVzKSk7CisJCX0KKworCQlQUWNsZWFy KHJlcyk7CisJfQorCisJZGVzdHJveVBRRXhwQnVmZmVyKHN0cik7Cit9CisKKy8qCisgKiBF bmFibGVzIHRoZSBzdWJzY3JpcHRpb24uCisgKgorICogVGhlIHN1YnNjcmlwdGlvbiB3YXMg Y3JlYXRlZCBpbiBhIHByZXZpb3VzIHN0ZXAgYnV0IGl0IHdhcyBkaXNhYmxlZC4gQWZ0ZXIK KyAqIGFkanVzdGluZyB0aGUgaW5pdGlhbCBsb2NhdGlvbiwgZW5hYmxpbmcgdGhlIHN1YnNj cmlwdGlvbiBpcyB0aGUgbGFzdCBzdGVwCisgKiBvZiB0aGlzIHNldHVwLgorICovCitzdGF0 aWMgdm9pZAorZW5hYmxlX3N1YnNjcmlwdGlvbihQR2Nvbm4gKmNvbm4sIExvZ2ljYWxSZXBJ bmZvICpkYmluZm8pCit7CisJUFFFeHBCdWZmZXIgc3RyID0gY3JlYXRlUFFFeHBCdWZmZXIo KTsKKwlQR3Jlc3VsdCAgICpyZXM7CisKKwlBc3NlcnQoY29ubiAhPSBOVUxMKTsKKworCXBn X2xvZ19pbmZvKCJlbmFibGluZyBzdWJzY3JpcHRpb24gXCIlc1wiIG9uIGRhdGFiYXNlIFwi JXNcIiIsIGRiaW5mby0+c3VibmFtZSwgZGJpbmZvLT5kYm5hbWUpOworCisJYXBwZW5kUFFF eHBCdWZmZXIoc3RyLCAiQUxURVIgU1VCU0NSSVBUSU9OICVzIEVOQUJMRSIsIGRiaW5mby0+ c3VibmFtZSk7CisKKwlwZ19sb2dfZGVidWcoImNvbW1hbmQgaXM6ICVzIiwgc3RyLT5kYXRh KTsKKworCWlmICghZHJ5X3J1bikKKwl7CisJCXJlcyA9IFBRZXhlYyhjb25uLCBzdHItPmRh dGEpOworCQlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQor CQl7CisJCQlQUWZpbmlzaChjb25uKTsKKwkJCXBnX2ZhdGFsKCJjb3VsZCBub3QgZW5hYmxl IHN1YnNjcmlwdGlvbiBcIiVzXCI6ICVzIiwgZGJpbmZvLT5zdWJuYW1lLAorCQkJCQkgUFFl cnJvck1lc3NhZ2UoY29ubikpOworCQl9CisKKwkJUFFjbGVhcihyZXMpOworCX0KKworCWRl c3Ryb3lQUUV4cEJ1ZmZlcihzdHIpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIg Kiphcmd2KQoreworCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0KKwl7 CisJCXsiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnPyd9LAorCQl7InZlcnNpb24iLCBu b19hcmd1bWVudCwgTlVMTCwgJ1YnfSwKKwkJeyJwZ2RhdGEiLCByZXF1aXJlZF9hcmd1bWVu dCwgTlVMTCwgJ0QnfSwKKwkJeyJwdWJsaXNoZXItc2VydmVyIiwgcmVxdWlyZWRfYXJndW1l bnQsIE5VTEwsICdQJ30sCisJCXsic3Vic2NyaWJlci1zZXJ2ZXIiLCByZXF1aXJlZF9hcmd1 bWVudCwgTlVMTCwgJ1MnfSwKKwkJeyJkYXRhYmFzZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBO VUxMLCAnZCd9LAorCQl7ImRyeS1ydW4iLCBub19hcmd1bWVudCwgTlVMTCwgJ24nfSwKKwkJ eyJyZWNvdmVyeS10aW1lb3V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICd0J30sCisJ CXsicmV0YWluIiwgbm9fYXJndW1lbnQsIE5VTEwsICdyJ30sCisJCXsidmVyYm9zZSIsIG5v X2FyZ3VtZW50LCBOVUxMLCAndid9LAorCQl7TlVMTCwgMCwgTlVMTCwgMH0KKwl9OworCisJ Q3JlYXRlU3Vic2NyaWJlck9wdGlvbnMgb3B0ID0gezB9OworCisJaW50CQkJYzsKKwlpbnQJ CQlvcHRpb25faW5kZXg7CisKKwljaGFyCSAgICpwZ19iaW5fZGlyID0gTlVMTDsKKworCWNo YXIJICAgKnNlcnZlcl9zdGFydF9sb2c7CisKKwljaGFyCSAgICpwdWJfYmFzZV9jb25uaW5m byA9IE5VTEw7CisJY2hhcgkgICAqc3ViX2Jhc2VfY29ubmluZm8gPSBOVUxMOworCWNoYXIJ ICAgKmRibmFtZV9jb25uaW5mbyA9IE5VTEw7CisKKwl1aW50NjQJCXB1Yl9zeXNpZDsKKwl1 aW50NjQJCXN1Yl9zeXNpZDsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCisJUEdjb25uCSAg ICpjb25uOworCWNoYXIJICAgKmNvbnNpc3RlbnRfbHNuOworCisJUFFFeHBCdWZmZXIgcmVj b3Zlcnljb25mY29udGVudHMgPSBOVUxMOworCisJY2hhcgkJcGlkZmlsZVtNQVhQR1BBVEhd OworCisJcGdfbG9nZ2luZ19pbml0KGFyZ3ZbMF0pOworCXBnX2xvZ2dpbmdfc2V0X2xldmVs KFBHX0xPR19XQVJOSU5HKTsKKwlwcm9nbmFtZSA9IGdldF9wcm9nbmFtZShhcmd2WzBdKTsK KwlzZXRfcGdsb2NhbGVfcGdzZXJ2aWNlKGFyZ3ZbMF0sIFBHX1RFWFRET01BSU4oInBnX2Ny ZWF0ZXN1YnNjcmliZXIiKSk7CisKKwlpZiAoYXJnYyA+IDEpCisJeworCQlpZiAoc3RyY21w KGFyZ3ZbMV0sICItLWhlbHAiKSA9PSAwIHx8IHN0cmNtcChhcmd2WzFdLCAiLT8iKSA9PSAw KQorCQl7CisJCQl1c2FnZSgpOworCQkJZXhpdCgwKTsKKwkJfQorCQllbHNlIGlmIChzdHJj bXAoYXJndlsxXSwgIi1WIikgPT0gMAorCQkJCSB8fCBzdHJjbXAoYXJndlsxXSwgIi0tdmVy c2lvbiIpID09IDApCisJCXsKKwkJCXB1dHMoInBnX2NyZWF0ZXN1YnNjcmliZXIgKFBvc3Rn cmVTUUwpICIgUEdfVkVSU0lPTik7CisJCQlleGl0KDApOworCQl9CisJfQorCisJLyogRGVm YXVsdCBzZXR0aW5ncyAqLworCW9wdC5zdWJzY3JpYmVyX2RpciA9IE5VTEw7CisJb3B0LnB1 Yl9jb25uaW5mb19zdHIgPSBOVUxMOworCW9wdC5zdWJfY29ubmluZm9fc3RyID0gTlVMTDsK KwlvcHQuZGF0YWJhc2VfbmFtZXMgPSAoU2ltcGxlU3RyaW5nTGlzdCkKKwl7CisJCU5VTEws IE5VTEwKKwl9OworCW9wdC5yZXRhaW4gPSBmYWxzZTsKKwlvcHQucmVjb3ZlcnlfdGltZW91 dCA9IDA7CisKKwkvKgorCSAqIERvbid0IGFsbG93IGl0IHRvIGJlIHJ1biBhcyByb290LiBJ dCB1c2VzIHBnX2N0bCB3aGljaCBkb2VzIG5vdCBhbGxvdworCSAqIGl0IGVpdGhlci4KKwkg Ki8KKyNpZm5kZWYgV0lOMzIKKwlpZiAoZ2V0ZXVpZCgpID09IDApCisJeworCQlwZ19sb2df ZXJyb3IoImNhbm5vdCBiZSBleGVjdXRlZCBieSBcInJvb3RcIiIpOworCQlwZ19sb2dfZXJy b3JfaGludCgiWW91IG11c3QgcnVuICVzIGFzIHRoZSBQb3N0Z3JlU1FMIHN1cGVydXNlci4i LAorCQkJCQkJICBwcm9nbmFtZSk7CisJCWV4aXQoMSk7CisJfQorI2VuZGlmCisKKwlnZXRf cmVzdHJpY3RlZF90b2tlbigpOworCisJd2hpbGUgKChjID0gZ2V0b3B0X2xvbmcoYXJnYywg YXJndiwgIkQ6UDpTOmQ6bnJ0OnYiLAorCQkJCQkJCWxvbmdfb3B0aW9ucywgJm9wdGlvbl9p bmRleCkpICE9IC0xKQorCXsKKwkJc3dpdGNoIChjKQorCQl7CisJCQljYXNlICdEJzoKKwkJ CQlvcHQuc3Vic2NyaWJlcl9kaXIgPSBwZ19zdHJkdXAob3B0YXJnKTsKKwkJCQlicmVhazsK KwkJCWNhc2UgJ1AnOgorCQkJCW9wdC5wdWJfY29ubmluZm9fc3RyID0gcGdfc3RyZHVwKG9w dGFyZyk7CisJCQkJYnJlYWs7CisJCQljYXNlICdTJzoKKwkJCQlvcHQuc3ViX2Nvbm5pbmZv X3N0ciA9IHBnX3N0cmR1cChvcHRhcmcpOworCQkJCWJyZWFrOworCQkJY2FzZSAnZCc6CisJ CQkJLyogSWdub3JlIGR1cGxpY2F0ZWQgZGF0YWJhc2UgbmFtZXMuICovCisJCQkJaWYgKCFz aW1wbGVfc3RyaW5nX2xpc3RfbWVtYmVyKCZvcHQuZGF0YWJhc2VfbmFtZXMsIG9wdGFyZykp CisJCQkJeworCQkJCQlzaW1wbGVfc3RyaW5nX2xpc3RfYXBwZW5kKCZvcHQuZGF0YWJhc2Vf bmFtZXMsIG9wdGFyZyk7CisJCQkJCW51bV9kYnMrKzsKKwkJCQl9CisJCQkJYnJlYWs7CisJ CQljYXNlICduJzoKKwkJCQlkcnlfcnVuID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCWNhc2Ug J3InOgorCQkJCW9wdC5yZXRhaW4gPSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAndCc6 CisJCQkJb3B0LnJlY292ZXJ5X3RpbWVvdXQgPSBhdG9pKG9wdGFyZyk7CisJCQkJYnJlYWs7 CisJCQljYXNlICd2JzoKKwkJCQlwZ19sb2dnaW5nX2luY3JlYXNlX3ZlcmJvc2l0eSgpOwor CQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBnZXRvcHRfbG9uZyBhbHJlYWR5IGVt aXR0ZWQgYSBjb21wbGFpbnQgKi8KKwkJCQlwZ19sb2dfZXJyb3JfaGludCgiVHJ5IFwiJXMg LS1oZWxwXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiwgcHJvZ25hbWUpOworCQkJCWV4aXQo MSk7CisJCX0KKwl9CisKKwkvKgorCSAqIEFueSBub24tb3B0aW9uIGFyZ3VtZW50cz8KKwkg Ki8KKwlpZiAob3B0aW5kIDwgYXJnYykKKwl7CisJCXBnX2xvZ19lcnJvcigidG9vIG1hbnkg Y29tbWFuZC1saW5lIGFyZ3VtZW50cyAoZmlyc3QgaXMgXCIlc1wiKSIsCisJCQkJCSBhcmd2 W29wdGluZF0pOworCQlwZ19sb2dfZXJyb3JfaGludCgiVHJ5IFwiJXMgLS1oZWxwXCIgZm9y IG1vcmUgaW5mb3JtYXRpb24uIiwgcHJvZ25hbWUpOworCQlleGl0KDEpOworCX0KKworCS8q CisJICogUmVxdWlyZWQgYXJndW1lbnRzCisJICovCisJaWYgKG9wdC5zdWJzY3JpYmVyX2Rp ciA9PSBOVUxMKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJubyBzdWJzY3JpYmVyIGRhdGEgZGly ZWN0b3J5IHNwZWNpZmllZCIpOworCQlwZ19sb2dfZXJyb3JfaGludCgiVHJ5IFwiJXMgLS1o ZWxwXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiwgcHJvZ25hbWUpOworCQlleGl0KDEpOwor CX0KKworCS8qCisJICogUGFyc2UgY29ubmVjdGlvbiBzdHJpbmcuIEJ1aWxkIGEgYmFzZSBj b25uZWN0aW9uIHN0cmluZyB0aGF0IG1pZ2h0IGJlCisJICogcmV1c2VkIGJ5IG11bHRpcGxl IGRhdGFiYXNlcy4KKwkgKi8KKwlpZiAob3B0LnB1Yl9jb25uaW5mb19zdHIgPT0gTlVMTCkK Kwl7CisJCS8qCisJCSAqIFRPRE8gdXNlIHByaW1hcnlfY29ubmluZm8gKGlmIGF2YWlsYWJs ZSkgZnJvbSBzdWJzY3JpYmVyIGFuZAorCQkgKiBleHRyYWN0IHB1Ymxpc2hlciBjb25uZWN0 aW9uIHN0cmluZy4gQXNzdW1lIHRoYXQgdGhlcmUgYXJlCisJCSAqIGlkZW50aWNhbCBlbnRy aWVzIGZvciBwaHlzaWNhbCBhbmQgbG9naWNhbCByZXBsaWNhdGlvbi4gSWYgdGhlcmUgaXMK KwkJICogbm90LCB3ZSB3b3VsZCBmYWlsIGFueXdheS4KKwkJICovCisJCXBnX2xvZ19lcnJv cigibm8gcHVibGlzaGVyIGNvbm5lY3Rpb24gc3RyaW5nIHNwZWNpZmllZCIpOworCQlwZ19s b2dfZXJyb3JfaGludCgiVHJ5IFwiJXMgLS1oZWxwXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24u IiwgcHJvZ25hbWUpOworCQlleGl0KDEpOworCX0KKwlwZ19sb2dfaW5mbygidmFsaWRhdGlu ZyBjb25uZWN0aW9uIHN0cmluZyBvbiBwdWJsaXNoZXIiKTsKKwlwdWJfYmFzZV9jb25uaW5m byA9IGdldF9iYXNlX2Nvbm5pbmZvKG9wdC5wdWJfY29ubmluZm9fc3RyLCBkYm5hbWVfY29u bmluZm8pOworCWlmIChwdWJfYmFzZV9jb25uaW5mbyA9PSBOVUxMKQorCQlleGl0KDEpOwor CisJaWYgKG9wdC5zdWJfY29ubmluZm9fc3RyID09IE5VTEwpCisJeworCQlwZ19sb2dfZXJy b3IoIm5vIHN1YnNjcmliZXIgY29ubmVjdGlvbiBzdHJpbmcgc3BlY2lmaWVkIik7CisJCXBn X2xvZ19lcnJvcl9oaW50KCJUcnkgXCIlcyAtLWhlbHBcIiBmb3IgbW9yZSBpbmZvcm1hdGlv bi4iLCBwcm9nbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCXBnX2xvZ19pbmZvKCJ2YWxpZGF0 aW5nIGNvbm5lY3Rpb24gc3RyaW5nIG9uIHN1YnNjcmliZXIiKTsKKwlzdWJfYmFzZV9jb25u aW5mbyA9IGdldF9iYXNlX2Nvbm5pbmZvKG9wdC5zdWJfY29ubmluZm9fc3RyLCBOVUxMKTsK KwlpZiAoc3ViX2Jhc2VfY29ubmluZm8gPT0gTlVMTCkKKwkJZXhpdCgxKTsKKworCWlmIChv cHQuZGF0YWJhc2VfbmFtZXMuaGVhZCA9PSBOVUxMKQorCXsKKwkJcGdfbG9nX2luZm8oIm5v IGRhdGFiYXNlIHdhcyBzcGVjaWZpZWQiKTsKKworCQkvKgorCQkgKiBJZiAtLWRhdGFiYXNl IG9wdGlvbiBpcyBub3QgcHJvdmlkZWQsIHRyeSB0byBvYnRhaW4gdGhlIGRibmFtZSBmcm9t CisJCSAqIHRoZSBwdWJsaXNoZXIgY29ubmluZm8uIElmIGRibmFtZSBwYXJhbWV0ZXIgaXMg bm90IGF2YWlsYWJsZSwgZXJyb3IKKwkJICogb3V0LgorCQkgKi8KKwkJaWYgKGRibmFtZV9j b25uaW5mbykKKwkJeworCQkJc2ltcGxlX3N0cmluZ19saXN0X2FwcGVuZCgmb3B0LmRhdGFi YXNlX25hbWVzLCBkYm5hbWVfY29ubmluZm8pOworCQkJbnVtX2RicysrOworCisJCQlwZ19s b2dfaW5mbygiZGF0YWJhc2UgXCIlc1wiIHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgcHVibGlz aGVyIGNvbm5lY3Rpb24gc3RyaW5nIiwKKwkJCQkJCWRibmFtZV9jb25uaW5mbyk7CisJCX0K KwkJZWxzZQorCQl7CisJCQlwZ19sb2dfZXJyb3IoIm5vIGRhdGFiYXNlIG5hbWUgc3BlY2lm aWVkIik7CisJCQlwZ19sb2dfZXJyb3JfaGludCgiVHJ5IFwiJXMgLS1oZWxwXCIgZm9yIG1v cmUgaW5mb3JtYXRpb24uIiwgcHJvZ25hbWUpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKwor CS8qCisJICogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHBnX2N0bCBhbmQgcGdfcmVzZXR3 YWwgb24gdGhlIHN1YnNjcmliZXIuCisJICovCisJcGdfYmluX2RpciA9IGdldF9iaW5fZGly ZWN0b3J5KGFyZ3ZbMF0pOworCisJLyogcnVkaW1lbnRhcnkgY2hlY2sgZm9yIGEgZGF0YSBk aXJlY3RvcnkuICovCisJaWYgKCFjaGVja19kYXRhX2RpcmVjdG9yeShvcHQuc3Vic2NyaWJl cl9kaXIpKQorCQlleGl0KDEpOworCisJLyogU3RvcmUgZGF0YWJhc2UgaW5mb3JtYXRpb24g Zm9yIHB1Ymxpc2hlciBhbmQgc3Vic2NyaWJlci4gKi8KKwlkYmluZm8gPSBzdG9yZV9wdWJf c3ViX2luZm8ob3B0LmRhdGFiYXNlX25hbWVzLCBwdWJfYmFzZV9jb25uaW5mbywgc3ViX2Jh c2VfY29ubmluZm8pOworCisJLyogUmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBjbGVhbiB1cCBv YmplY3RzIGluIGNhc2Ugb2YgZmFpbHVyZS4gKi8KKwlhdGV4aXQoY2xlYW51cF9vYmplY3Rz X2F0ZXhpdCk7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBzdWJzY3JpYmVyIGRhdGEgZGly ZWN0b3J5IGhhcyB0aGUgc2FtZSBzeXN0ZW0gaWRlbnRpZmllcgorCSAqIHRoYW4gdGhlIHB1 Ymxpc2hlciBkYXRhIGRpcmVjdG9yeS4KKwkgKi8KKwlwdWJfc3lzaWQgPSBnZXRfcHJpbWFy eV9zeXNpZChkYmluZm9bMF0ucHViY29ubmluZm8pOworCXN1Yl9zeXNpZCA9IGdldF9zdGFu ZGJ5X3N5c2lkKG9wdC5zdWJzY3JpYmVyX2Rpcik7CisJaWYgKHB1Yl9zeXNpZCAhPSBzdWJf c3lzaWQpCisJCXBnX2ZhdGFsKCJzdWJzY3JpYmVyIGRhdGEgZGlyZWN0b3J5IGlzIG5vdCBh IGNvcHkgb2YgdGhlIHNvdXJjZSBkYXRhYmFzZSBjbHVzdGVyIik7CisKKwkvKgorCSAqIENy ZWF0ZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSB0byBzdG9yZSBhbnkgZGF0YSBnZW5lcmF0ZWQg YnkgdGhpcyB0b29sLgorCSAqLworCXNlcnZlcl9zdGFydF9sb2cgPSBzZXR1cF9zZXJ2ZXJf bG9nZmlsZShvcHQuc3Vic2NyaWJlcl9kaXIpOworCisJLyogc3Vic2NyaWJlciBQSUQgZmls ZS4gKi8KKwlzbnByaW50ZihwaWRmaWxlLCBNQVhQR1BBVEgsICIlcy9wb3N0bWFzdGVyLnBp ZCIsIG9wdC5zdWJzY3JpYmVyX2Rpcik7CisKKwkvKgorCSAqIFRoZSBzdGFuZGJ5IHNlcnZl ciBtdXN0IGJlIHJ1bm5pbmcuIFRoYXQncyBiZWNhdXNlIHNvbWUgY2hlY2tzIHdpbGwgYmUK KwkgKiBkb25lIChpcyBpdCByZWFkeSBmb3IgYSBsb2dpY2FsIHJlcGxpY2F0aW9uIHNldHVw PykuIEFmdGVyIHRoYXQsIHN0b3AKKwkgKiB0aGUgc3Vic2NyaWJlciBpbiBwcmVwYXJhdGlv biB0byBtb2RpZnkgc29tZSByZWNvdmVyeSBwYXJhbWV0ZXJzIHRoYXQKKwkgKiByZXF1aXJl IGEgcmVzdGFydC4KKwkgKi8KKwlpZiAoc3RhdChwaWRmaWxlLCAmc3RhdGJ1ZikgPT0gMCkK Kwl7CisJCS8qCisJCSAqIENoZWNrIGlmIHRoZSBzdGFuZGJ5IHNlcnZlciBpcyByZWFkeSBm b3IgbG9naWNhbCByZXBsaWNhdGlvbi4KKwkJICovCisJCWlmICghY2hlY2tfc3Vic2NyaWJl cihkYmluZm8pKQorCQkJZXhpdCgxKTsKKworCQkvKgorCQkgKiBDaGVjayBpZiB0aGUgcHJp bWFyeSBzZXJ2ZXIgaXMgcmVhZHkgZm9yIGxvZ2ljYWwgcmVwbGljYXRpb24uIFRoaXMKKwkJ ICogcm91dGluZSBjaGVja3MgaWYgYSByZXBsaWNhdGlvbiBzbG90IGlzIGluIHVzZSBvbiBw cmltYXJ5IHNvIGl0CisJCSAqIHJlbGllcyBvbiBjaGVja19zdWJzY3JpYmVyKCkgdG8gb2J0 YWluIHRoZSBwcmltYXJ5X3Nsb3RfbmFtZS4KKwkJICogVGhhdCdzIHdoeSBpdCBpcyBjYWxs ZWQgYWZ0ZXIgaXQuCisJCSAqLworCQlpZiAoIWNoZWNrX3B1Ymxpc2hlcihkYmluZm8pKQor CQkJZXhpdCgxKTsKKworCQkvKgorCQkgKiBDcmVhdGUgdGhlIHJlcXVpcmVkIG9iamVjdHMg Zm9yIGVhY2ggZGF0YWJhc2Ugb24gcHVibGlzaGVyLiBUaGlzCisJCSAqIHN0ZXAgaXMgaGVy ZSBtYWlubHkgYmVjYXVzZSBpZiB3ZSBzdG9wIHRoZSBzdGFuZGJ5IHdlIGNhbm5vdCB2ZXJp ZnkKKwkJICogaWYgdGhlIHByaW1hcnkgc2xvdCBpcyBpbiB1c2UuIFdlIGNvdWxkIHVzZSBh biBleHRyYSBjb25uZWN0aW9uIGZvcgorCQkgKiBpdCBidXQgaXQgZG9lc24ndCBzZWVtIHdv cnRoLgorCQkgKi8KKwkJaWYgKCFzZXR1cF9wdWJsaXNoZXIoZGJpbmZvKSkKKwkJCWV4aXQo MSk7CisKKwkJLyogU3RvcCB0aGUgc3RhbmRieSBzZXJ2ZXIuICovCisJCXBnX2xvZ19pbmZv KCJzdGFuZGJ5IGlzIHVwIGFuZCBydW5uaW5nIik7CisJCXBnX2xvZ19pbmZvKCJzdG9wcGlu ZyB0aGUgc2VydmVyIHRvIHN0YXJ0IHRoZSB0cmFuc2Zvcm1hdGlvbiBzdGVwcyIpOworCQlp ZiAoIWRyeV9ydW4pCisJCQlzdG9wX3N0YW5kYnlfc2VydmVyKHBnX2Jpbl9kaXIsIG9wdC5z dWJzY3JpYmVyX2Rpcik7CisJfQorCWVsc2UKKwl7CisJCXBnX2xvZ19lcnJvcigic3RhbmRi eSBpcyBub3QgcnVubmluZyIpOworCQlwZ19sb2dfZXJyb3JfaGludCgiU3RhcnQgdGhlIHN0 YW5kYnkgYW5kIHRyeSBhZ2Fpbi4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKgorCSAqIENy ZWF0ZSBhIHRlbXBvcmFyeSBsb2dpY2FsIHJlcGxpY2F0aW9uIHNsb3QgdG8gZ2V0IGEgY29u c2lzdGVudCBMU04uCisJICoKKwkgKiBUaGlzIGNvbnNpc3RlbnQgTFNOIHdpbGwgYmUgdXNl ZCBsYXRlciB0byBhZHZhbmNlZCB0aGUgcmVjZW50bHkgY3JlYXRlZAorCSAqIHJlcGxpY2F0 aW9uIHNsb3RzLiBJdCBpcyBvayB0byB1c2UgYSB0ZW1wb3JhcnkgcmVwbGljYXRpb24gc2xv dCBoZXJlCisJICogYmVjYXVzZSBpdCB3aWxsIGhhdmUgYSBzaG9ydCBsaWZldGltZSBhbmQg aXQgaXMgb25seSB1c2VkIGFzIGEgbWFyayB0bworCSAqIHN0YXJ0IHRoZSBsb2dpY2FsIHJl cGxpY2F0aW9uLgorCSAqCisJICogWFhYIHdlIHNob3VsZCBwcm9iYWJseSB1c2UgdGhlIGxh c3QgY3JlYXRlZCByZXBsaWNhdGlvbiBzbG90IHRvIGdldCBhCisJICogY29uc2lzdGVudCBM U04gYnV0IGl0IHNob3VsZCBiZSBjaGFuZ2VkIGFmdGVyIGFkZGluZyBwZ19iYXNlYmFja3Vw CisJICogc3VwcG9ydC4KKwkgKi8KKwljb25uID0gY29ubmVjdF9kYXRhYmFzZShkYmluZm9b MF0ucHViY29ubmluZm8pOworCWlmIChjb25uID09IE5VTEwpCisJCWV4aXQoMSk7CisJY29u c2lzdGVudF9sc24gPSBjcmVhdGVfbG9naWNhbF9yZXBsaWNhdGlvbl9zbG90KGNvbm4sICZk YmluZm9bMF0sIHRydWUpOworCisJLyoKKwkgKiBXcml0ZSByZWNvdmVyeSBwYXJhbWV0ZXJz LgorCSAqCisJICogRGVzcGl0ZSBvZiB0aGUgcmVjb3ZlcnkgcGFyYW1ldGVycyB3aWxsIGJl IHdyaXR0ZW4gdG8gdGhlIHN1YnNjcmliZXIsCisJICogdXNlIGEgcHVibGlzaGVyIGNvbm5l Y3Rpb24gZm9yIHRoZSBmb2xsb3dpbmcgcmVjb3ZlcnkgZnVuY3Rpb25zLiBUaGUKKwkgKiBj b25uZWN0aW9uIGlzIG9ubHkgdXNlZCB0byBjaGVjayB0aGUgY3VycmVudCBzZXJ2ZXIgdmVy c2lvbiAocGh5c2ljYWwKKwkgKiByZXBsaWNhLCBzYW1lIHNlcnZlciB2ZXJzaW9uKS4gVGhl IHN1YnNjcmliZXIgaXMgbm90IHJ1bm5pbmcgeWV0LiBJbgorCSAqIGRyeSBydW4gbW9kZSwg dGhlIHJlY292ZXJ5IHBhcmFtZXRlcnMgKndvbid0KiBiZSB3cml0dGVuLiBBbiBpbnZhbGlk CisJICogTFNOIGlzIHVzZWQgZm9yIHByaW50aW5nIHB1cnBvc2VzLiBBZGRpdGlvbmFsIHJl Y292ZXJ5IHBhcmFtZXRlcnMgYXJlCisJICogYWRkZWQgaGVyZS4gSXQgYXZvaWRzIHVuZXhw ZWN0ZWQgYmVoYXZpb3Igc3VjaCBhcyBlbmQgb2YgcmVjb3ZlcnkgYXMKKwkgKiBzb29uIGFz IGEgY29uc2lzdGVudCBzdGF0ZSBpcyByZWFjaGVkIChyZWNvdmVyeV90YXJnZXQpIGFuZCBm YWlsdXJlIGR1ZQorCSAqIHRvIG11bHRpcGxlIHJlY292ZXJ5IHRhcmdldHMgKG5hbWUsIHRp bWUsIHhpZCwgTFNOKS4KKwkgKi8KKwlyZWNvdmVyeWNvbmZjb250ZW50cyA9IEdlbmVyYXRl UmVjb3ZlcnlDb25maWcoY29ubiwgTlVMTCk7CisJYXBwZW5kUFFFeHBCdWZmZXIocmVjb3Zl cnljb25mY29udGVudHMsICJyZWNvdmVyeV90YXJnZXQgPSAnJ1xuIik7CisJYXBwZW5kUFFF eHBCdWZmZXIocmVjb3Zlcnljb25mY29udGVudHMsICJyZWNvdmVyeV90YXJnZXRfdGltZWxp bmUgPSAnbGF0ZXN0J1xuIik7CisJYXBwZW5kUFFFeHBCdWZmZXIocmVjb3Zlcnljb25mY29u dGVudHMsICJyZWNvdmVyeV90YXJnZXRfaW5jbHVzaXZlID0gdHJ1ZVxuIik7CisJYXBwZW5k UFFFeHBCdWZmZXIocmVjb3Zlcnljb25mY29udGVudHMsICJyZWNvdmVyeV90YXJnZXRfYWN0 aW9uID0gcHJvbW90ZVxuIik7CisJYXBwZW5kUFFFeHBCdWZmZXIocmVjb3Zlcnljb25mY29u dGVudHMsICJyZWNvdmVyeV90YXJnZXRfbmFtZSA9ICcnXG4iKTsKKwlhcHBlbmRQUUV4cEJ1 ZmZlcihyZWNvdmVyeWNvbmZjb250ZW50cywgInJlY292ZXJ5X3RhcmdldF90aW1lID0gJydc biIpOworCWFwcGVuZFBRRXhwQnVmZmVyKHJlY292ZXJ5Y29uZmNvbnRlbnRzLCAicmVjb3Zl cnlfdGFyZ2V0X3hpZCA9ICcnXG4iKTsKKworCWlmIChkcnlfcnVuKQorCXsKKwkJYXBwZW5k UFFFeHBCdWZmZXIocmVjb3Zlcnljb25mY29udGVudHMsICIjIGRyeSBydW4gbW9kZSIpOwor CQlhcHBlbmRQUUV4cEJ1ZmZlcihyZWNvdmVyeWNvbmZjb250ZW50cywgInJlY292ZXJ5X3Rh cmdldF9sc24gPSAnJVgvJVgnXG4iLAorCQkJCQkJICBMU05fRk9STUFUX0FSR1MoKFhMb2dS ZWNQdHIpIEludmFsaWRYTG9nUmVjUHRyKSk7CisJfQorCWVsc2UKKwl7CisJCWFwcGVuZFBR RXhwQnVmZmVyKHJlY292ZXJ5Y29uZmNvbnRlbnRzLCAicmVjb3ZlcnlfdGFyZ2V0X2xzbiA9 ICclcydcbiIsCisJCQkJCQkgIGNvbnNpc3RlbnRfbHNuKTsKKwkJV3JpdGVSZWNvdmVyeUNv bmZpZyhjb25uLCBvcHQuc3Vic2NyaWJlcl9kaXIsIHJlY292ZXJ5Y29uZmNvbnRlbnRzKTsK Kwl9CisJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uKTsKKworCXBnX2xvZ19kZWJ1ZygicmVj b3ZlcnkgcGFyYW1ldGVyczpcbiVzIiwgcmVjb3Zlcnljb25mY29udGVudHMtPmRhdGEpOwor CisJLyoKKwkgKiBTdGFydCBzdWJzY3JpYmVyIGFuZCB3YWl0IHVudGlsIGFjY2VwdGluZyBj b25uZWN0aW9ucy4KKwkgKi8KKwlwZ19sb2dfaW5mbygic3RhcnRpbmcgdGhlIHN1YnNjcmli ZXIiKTsKKwlpZiAoIWRyeV9ydW4pCisJCXN0YXJ0X3N0YW5kYnlfc2VydmVyKHBnX2Jpbl9k aXIsIG9wdC5zdWJzY3JpYmVyX2Rpciwgc2VydmVyX3N0YXJ0X2xvZyk7CisKKwkvKgorCSAq IFdhaXRpbmcgdGhlIHN1YnNjcmliZXIgdG8gYmUgcHJvbW90ZWQuCisJICovCisJd2FpdF9m b3JfZW5kX3JlY292ZXJ5KGRiaW5mb1swXS5zdWJjb25uaW5mbywgcGdfYmluX2RpciwgJm9w dCk7CisKKwkvKgorCSAqIENyZWF0ZSB0aGUgc3Vic2NyaXB0aW9uIGZvciBlYWNoIGRhdGFi YXNlIG9uIHN1YnNjcmliZXIuIEl0IGRvZXMgbm90CisJICogZW5hYmxlIGl0IGltbWVkaWF0 ZWx5IGJlY2F1c2UgaXQgbmVlZHMgdG8gYWRqdXN0IHRoZSBsb2dpY2FsCisJICogcmVwbGlj YXRpb24gc3RhcnQgcG9pbnQgdG8gdGhlIExTTiByZXBvcnRlZCBieSBjb25zaXN0ZW50X2xz biAoc2VlCisJICogc2V0X3JlcGxpY2F0aW9uX3Byb2dyZXNzKS4gSXQgYWxzbyBjbGVhbnMg dXAgcHVibGljYXRpb25zIGNyZWF0ZWQgYnkKKwkgKiB0aGlzIHRvb2wgYW5kIHJlcGxpY2F0 aW9uIHRvIHRoZSBzdGFuZGJ5LgorCSAqLworCWlmICghc2V0dXBfc3Vic2NyaWJlcihkYmlu Zm8sIGNvbnNpc3RlbnRfbHNuKSkKKwkJZXhpdCgxKTsKKworCS8qCisJICogSWYgdGhlIHBy aW1hcnlfc2xvdF9uYW1lIGV4aXN0cyBvbiBwcmltYXJ5LCBkcm9wIGl0LgorCSAqCisJICog WFhYIHdlIG1pZ2h0IG5vdCBmYWlsIGhlcmUuIEluc3RlYWQsIHdlIHByb3ZpZGUgYSB3YXJu aW5nIHNvIHRoZSB1c2VyCisJICogZXZlbnR1YWxseSBkcm9wcyB0aGlzIHJlcGxpY2F0aW9u IHNsb3QgbGF0ZXIuCisJICovCisJaWYgKHByaW1hcnlfc2xvdF9uYW1lICE9IE5VTEwpCisJ eworCQljb25uID0gY29ubmVjdF9kYXRhYmFzZShkYmluZm9bMF0ucHViY29ubmluZm8pOwor CQlpZiAoY29ubiAhPSBOVUxMKQorCQl7CisJCQlkcm9wX3JlcGxpY2F0aW9uX3Nsb3QoY29u biwgJmRiaW5mb1swXSwgcHJpbWFyeV9zbG90X25hbWUpOworCQl9CisJCWVsc2UKKwkJewor CQkJcGdfbG9nX3dhcm5pbmcoImNvdWxkIG5vdCBkcm9wIHJlcGxpY2F0aW9uIHNsb3QgXCIl c1wiIG9uIHByaW1hcnkiLCBwcmltYXJ5X3Nsb3RfbmFtZSk7CisJCQlwZ19sb2dfd2Fybmlu Z19oaW50KCJEcm9wIHRoaXMgcmVwbGljYXRpb24gc2xvdCBzb29uIHRvIGF2b2lkIHJldGVu dGlvbiBvZiBXQUwgZmlsZXMuIik7CisJCX0KKwkJZGlzY29ubmVjdF9kYXRhYmFzZShjb25u KTsKKwl9CisKKwkvKgorCSAqIFN0b3AgdGhlIHN1YnNjcmliZXIuCisJICovCisJcGdfbG9n X2luZm8oInN0b3BwaW5nIHRoZSBzdWJzY3JpYmVyIik7CisJaWYgKCFkcnlfcnVuKQorCQlz dG9wX3N0YW5kYnlfc2VydmVyKHBnX2Jpbl9kaXIsIG9wdC5zdWJzY3JpYmVyX2Rpcik7CisK KwkvKgorCSAqIENoYW5nZSBzeXN0ZW0gaWRlbnRpZmllciBmcm9tIHN1YnNjcmliZXIuCisJ ICovCisJbW9kaWZ5X3N1YnNjcmliZXJfc3lzaWQocGdfYmluX2RpciwgJm9wdCk7CisKKwkv KgorCSAqIFRoZSBsb2cgZmlsZSBpcyBrZXB0IGlmIHJldGFpbiBvcHRpb24gaXMgc3BlY2lm aWVkIG9yIHRoaXMgdG9vbCBkb2VzCisJICogbm90IHJ1biBzdWNjZXNzZnVsbHkuIE90aGVy d2lzZSwgbG9nIGZpbGUgaXMgcmVtb3ZlZC4KKwkgKi8KKwlpZiAoIW9wdC5yZXRhaW4pCisJ CXVubGluayhzZXJ2ZXJfc3RhcnRfbG9nKTsKKworCXN1Y2Nlc3MgPSB0cnVlOworCisJcGdf bG9nX2luZm8oIkRvbmUhIik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9i aW4vcGdfYmFzZWJhY2t1cC90LzA0MF9wZ19jcmVhdGVzdWJzY3JpYmVyLnBsIGIvc3JjL2Jp bi9wZ19iYXNlYmFja3VwL3QvMDQwX3BnX2NyZWF0ZXN1YnNjcmliZXIucGwKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uMGYwMmIxYmZhYwotLS0gL2Rldi9udWxs CisrKyBiL3NyYy9iaW4vcGdfYmFzZWJhY2t1cC90LzA0MF9wZ19jcmVhdGVzdWJzY3JpYmVy LnBsCkBAIC0wLDAgKzEsNDQgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDI0LCBQb3N0Z3JlU1FM IEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorCisjCisjIFRlc3QgY2hlY2tpbmcgb3B0aW9u cyBvZiBwZ19jcmVhdGVzdWJzY3JpYmVyLgorIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5p bmdzOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxzOwordXNlIFRlc3Q6Ok1vcmU7CisK K3Byb2dyYW1faGVscF9vaygncGdfY3JlYXRlc3Vic2NyaWJlcicpOworcHJvZ3JhbV92ZXJz aW9uX29rKCdwZ19jcmVhdGVzdWJzY3JpYmVyJyk7Citwcm9ncmFtX29wdGlvbnNfaGFuZGxp bmdfb2soJ3BnX2NyZWF0ZXN1YnNjcmliZXInKTsKKworbXkgJGRhdGFkaXIgPSBQb3N0Z3Jl U1FMOjpUZXN0OjpVdGlsczo6dGVtcGRpcjsKKworY29tbWFuZF9mYWlscyhbJ3BnX2NyZWF0 ZXN1YnNjcmliZXInXSwKKwknbm8gc3Vic2NyaWJlciBkYXRhIGRpcmVjdG9yeSBzcGVjaWZp ZWQnKTsKK2NvbW1hbmRfZmFpbHMoCisJWworCQkncGdfY3JlYXRlc3Vic2NyaWJlcicsCisJ CSctLXBnZGF0YScsICRkYXRhZGlyCisJXSwKKwknbm8gcHVibGlzaGVyIGNvbm5lY3Rpb24g c3RyaW5nIHNwZWNpZmllZCcpOworY29tbWFuZF9mYWlscygKKwlbCisJCSdwZ19jcmVhdGVz dWJzY3JpYmVyJywKKwkJJy0tZHJ5LXJ1bicsCisJCSctLXBnZGF0YScsICRkYXRhZGlyLAor CQknLS1wdWJsaXNoZXItc2VydmVyJywgJ2RibmFtZT1wb3N0Z3JlcycKKwldLAorCSdubyBz dWJzY3JpYmVyIGNvbm5lY3Rpb24gc3RyaW5nIHNwZWNpZmllZCcpOworY29tbWFuZF9mYWls cygKKwlbCisJCSdwZ19jcmVhdGVzdWJzY3JpYmVyJywKKwkJJy0tdmVyYm9zZScsCisJCSct LXBnZGF0YScsICRkYXRhZGlyLAorCQknLS1wdWJsaXNoZXItc2VydmVyJywgJ2RibmFtZT1w b3N0Z3JlcycsCisJCSctLXN1YnNjcmliZXItc2VydmVyJywgJ2RibmFtZT1wb3N0Z3JlcycK KwldLAorCSdubyBkYXRhYmFzZSBuYW1lIHNwZWNpZmllZCcpOworCitkb25lX3Rlc3Rpbmco KTsKZGlmZiAtLWdpdCBhL3NyYy9iaW4vcGdfYmFzZWJhY2t1cC90LzA0MV9wZ19jcmVhdGVz dWJzY3JpYmVyX3N0YW5kYnkucGwgYi9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvdC8wNDFfcGdf Y3JlYXRlc3Vic2NyaWJlcl9zdGFuZGJ5LnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAuLjJkYjQxY2JjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmluL3Bn X2Jhc2ViYWNrdXAvdC8wNDFfcGdfY3JlYXRlc3Vic2NyaWJlcl9zdGFuZGJ5LnBsCkBAIC0w LDAgKzEsMTM1IEBACisjIENvcHlyaWdodCAoYykgMjAyNCwgUG9zdGdyZVNRTCBHbG9iYWwg RGV2ZWxvcG1lbnQgR3JvdXAKKworIworIyBUZXN0IHVzaW5nIGEgc3RhbmRieSBzZXJ2ZXIg YXMgdGhlIHN1YnNjcmliZXIuCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2Ug UG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3RlcjsKK3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpVdGls czsKK3VzZSBUZXN0OjpNb3JlOworCitteSAkbm9kZV9wOworbXkgJG5vZGVfZjsKK215ICRu b2RlX3M7CitteSAkcmVzdWx0OworCisjIFNldCB1cCBub2RlIFAgYXMgcHJpbWFyeQorJG5v ZGVfcCA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygnbm9kZV9wJyk7Ciskbm9k ZV9wLT5pbml0KGFsbG93c19zdHJlYW1pbmcgPT4gJ2xvZ2ljYWwnKTsKKyRub2RlX3AtPnN0 YXJ0OworCisjIFNldCB1cCBub2RlIEYgYXMgYWJvdXQtdG8tZmFpbCBub2RlCisjIFRoZSBl eHRyYSBvcHRpb24gZm9yY2VzIGl0IHRvIGluaXRpYWxpemUgYSBuZXcgY2x1c3RlciBpbnN0 ZWFkIG9mIGNvcHlpbmcgYQorIyBwcmV2aW91c2x5IGluaXRkYidzIGNsdXN0ZXIuCiskbm9k ZV9mID0gUG9zdGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCdub2RlX2YnKTsKKyRub2Rl X2YtPmluaXQoYWxsb3dzX3N0cmVhbWluZyA9PiAnbG9naWNhbCcsIGV4dHJhID0+IFsgJy0t bm8taW5zdHJ1Y3Rpb25zJyBdKTsKKyRub2RlX2YtPnN0YXJ0OworCisjIE9uIG5vZGUgUAor IyAtIGNyZWF0ZSBkYXRhYmFzZXMKKyMgLSBjcmVhdGUgdGVzdCB0YWJsZXMKKyMgLSBpbnNl cnQgYSByb3cKKyRub2RlX3AtPnNhZmVfcHNxbCgKKwkncG9zdGdyZXMnLCBxKAorCUNSRUFU RSBEQVRBQkFTRSBwZzE7CisJQ1JFQVRFIERBVEFCQVNFIHBnMjsKKykpOworJG5vZGVfcC0+ c2FmZV9wc3FsKCdwZzEnLCAnQ1JFQVRFIFRBQkxFIHRibDEgKGEgdGV4dCknKTsKKyRub2Rl X3AtPnNhZmVfcHNxbCgncGcxJywgIklOU0VSVCBJTlRPIHRibDEgVkFMVUVTKCdmaXJzdCBy b3cnKSIpOworJG5vZGVfcC0+c2FmZV9wc3FsKCdwZzInLCAnQ1JFQVRFIFRBQkxFIHRibDIg KGEgdGV4dCknKTsKKworIyBTZXQgdXAgbm9kZSBTIGFzIHN0YW5kYnkgbGlua2luZyB0byBu b2RlIFAKKyRub2RlX3AtPmJhY2t1cCgnYmFja3VwXzEnKTsKKyRub2RlX3MgPSBQb3N0Z3Jl U1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoJ25vZGVfcycpOworJG5vZGVfcy0+aW5pdF9mcm9t X2JhY2t1cCgkbm9kZV9wLCAnYmFja3VwXzEnLCBoYXNfc3RyZWFtaW5nID0+IDEpOworJG5v ZGVfcy0+YXBwZW5kX2NvbmYoJ3Bvc3RncmVzcWwuY29uZicsICdsb2dfbWluX21lc3NhZ2Vz ID0gZGVidWcyJyk7Ciskbm9kZV9zLT5zZXRfc3RhbmRieV9tb2RlKCk7Ciskbm9kZV9zLT5z dGFydDsKKworIyBJbnNlcnQgYW5vdGhlciByb3cgb24gbm9kZSBQIGFuZCB3YWl0IG5vZGUg UyB0byBjYXRjaCB1cAorJG5vZGVfcC0+c2FmZV9wc3FsKCdwZzEnLCAiSU5TRVJUIElOVE8g dGJsMSBWQUxVRVMoJ3NlY29uZCByb3cnKSIpOworJG5vZGVfcC0+d2FpdF9mb3JfcmVwbGF5 X2NhdGNodXAoJG5vZGVfcyk7CisKKyMgUnVuIHBnX2NyZWF0ZXN1YnNjcmliZXIgb24gYWJv dXQtdG8tZmFpbCBub2RlIEYKK2NvbW1hbmRfZmFpbHMoCisJWworCQkncGdfY3JlYXRlc3Vi c2NyaWJlcicsICctLXZlcmJvc2UnLAorCQknLS1wZ2RhdGEnLCAkbm9kZV9mLT5kYXRhX2Rp ciwKKwkJJy0tcHVibGlzaGVyLXNlcnZlcicsICRub2RlX3AtPmNvbm5zdHIoJ3BnMScpLAor CQknLS1zdWJzY3JpYmVyLXNlcnZlcicsICRub2RlX2YtPmNvbm5zdHIoJ3BnMScpLAorCQkn LS1kYXRhYmFzZScsICdwZzEnLAorCQknLS1kYXRhYmFzZScsICdwZzInCisJXSwKKwknc3Vi c2NyaWJlciBkYXRhIGRpcmVjdG9yeSBpcyBub3QgYSBjb3B5IG9mIHRoZSBzb3VyY2UgZGF0 YWJhc2UgY2x1c3RlcicpOworCisjIGRyeSBydW4gbW9kZSBvbiBub2RlIFMKK2NvbW1hbmRf b2soCisJWworCQkncGdfY3JlYXRlc3Vic2NyaWJlcicsICctLXZlcmJvc2UnLCAnLS1kcnkt cnVuJywKKwkJJy0tcGdkYXRhJywgJG5vZGVfcy0+ZGF0YV9kaXIsCisJCSctLXB1Ymxpc2hl ci1zZXJ2ZXInLCAkbm9kZV9wLT5jb25uc3RyKCdwZzEnKSwKKwkJJy0tc3Vic2NyaWJlci1z ZXJ2ZXInLCAkbm9kZV9zLT5jb25uc3RyKCdwZzEnKSwKKwkJJy0tZGF0YWJhc2UnLCAncGcx JywKKwkJJy0tZGF0YWJhc2UnLCAncGcyJworCV0sCisJJ3J1biBwZ19jcmVhdGVzdWJzY3Jp YmVyIC0tZHJ5LXJ1biBvbiBub2RlIFMnKTsKKworIyBDaGVjayBpZiBub2RlIFMgaXMgc3Rp bGwgYSBzdGFuZGJ5Citpcygkbm9kZV9zLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywgJ1NFTEVD VCBwZ19pc19pbl9yZWNvdmVyeSgpJyksCisJJ3QnLCAnc3RhbmRieSBpcyBpbiByZWNvdmVy eScpOworCisjIFJ1biBwZ19jcmVhdGVzdWJzY3JpYmVyIG9uIG5vZGUgUworY29tbWFuZF9v aygKKwlbCisJCSdwZ19jcmVhdGVzdWJzY3JpYmVyJywgJy0tdmVyYm9zZScsCisJCSctLXBn ZGF0YScsICRub2RlX3MtPmRhdGFfZGlyLAorCQknLS1wdWJsaXNoZXItc2VydmVyJywgJG5v ZGVfcC0+Y29ubnN0cigncGcxJyksCisJCSctLXN1YnNjcmliZXItc2VydmVyJywgJG5vZGVf cy0+Y29ubnN0cigncGcxJyksCisJCSctLWRhdGFiYXNlJywgJ3BnMScsCisJCSctLWRhdGFi YXNlJywgJ3BnMicKKwldLAorCSdydW4gcGdfY3JlYXRlc3Vic2NyaWJlciBvbiBub2RlIFMn KTsKKworIyBJbnNlcnQgcm93cyBvbiBQCiskbm9kZV9wLT5zYWZlX3BzcWwoJ3BnMScsICJJ TlNFUlQgSU5UTyB0YmwxIFZBTFVFUygndGhpcmQgcm93JykiKTsKKyRub2RlX3AtPnNhZmVf cHNxbCgncGcyJywgIklOU0VSVCBJTlRPIHRibDIgVkFMVUVTKCdyb3cgMScpIik7CisKKyMg UElEIHNldHMgdG8gdW5kZWZpbmVkIGJlY2F1c2Ugc3Vic2NyaWJlciB3YXMgc3RvcHBlZCBi ZWhpbmQgdGhlIHNjZW5lcy4KKyMgU3RhcnQgc3Vic2NyaWJlcgorJG5vZGVfcy0+e19waWR9 ID0gdW5kZWY7Ciskbm9kZV9zLT5zdGFydDsKKworIyBHZXQgc3Vic2NyaXB0aW9uIG5hbWVz CiskcmVzdWx0ID0gJG5vZGVfcy0+c2FmZV9wc3FsKAorCSdwb3N0Z3JlcycsIHFxKAorCVNF TEVDVCBzdWJuYW1lIEZST00gcGdfc3Vic2NyaXB0aW9uIFdIRVJFIHN1Ym5hbWUgfiAnXnBn X2NyZWF0ZXN1YnNjcmliZXJfJworKSk7CitteSBAc3VibmFtZXMgPSBzcGxpdCgiXG4iLCAk cmVzdWx0KTsKKworIyBXYWl0IHN1YnNjcmliZXIgdG8gY2F0Y2ggdXAKKyRub2RlX3MtPndh aXRfZm9yX3N1YnNjcmlwdGlvbl9zeW5jKCRub2RlX3AsICRzdWJuYW1lc1swXSk7Ciskbm9k ZV9zLT53YWl0X2Zvcl9zdWJzY3JpcHRpb25fc3luYygkbm9kZV9wLCAkc3VibmFtZXNbMV0p OworCisjIENoZWNrIHJlc3VsdCBvbiBkYXRhYmFzZSBwZzEKKyRyZXN1bHQgPSAkbm9kZV9z LT5zYWZlX3BzcWwoJ3BnMScsICdTRUxFQ1QgKiBGUk9NIHRibDEnKTsKK2lzKCAkcmVzdWx0 LCBxcShmaXJzdCByb3cKK3NlY29uZCByb3cKK3RoaXJkIHJvdyksCisJJ2xvZ2ljYWwgcmVw bGljYXRpb24gd29ya3Mgb24gZGF0YWJhc2UgcGcxJyk7CisKKyMgQ2hlY2sgcmVzdWx0IG9u IGRhdGFiYXNlIHBnMgorJHJlc3VsdCA9ICRub2RlX3MtPnNhZmVfcHNxbCgncGcyJywgJ1NF TEVDVCAqIEZST00gdGJsMicpOworaXMoICRyZXN1bHQsIHFxKHJvdyAxKSwKKwknbG9naWNh bCByZXBsaWNhdGlvbiB3b3JrcyBvbiBkYXRhYmFzZSBwZzInKTsKKworIyBEaWZmZXJlbnQg c3lzdGVtIGlkZW50aWZpZXI/CitteSAkc3lzaWRfcCA9ICRub2RlX3AtPnNhZmVfcHNxbCgn cG9zdGdyZXMnLCAnU0VMRUNUIHN5c3RlbV9pZGVudGlmaWVyIEZST00gcGdfY29udHJvbF9z eXN0ZW0oKScpOworbXkgJHN5c2lkX3MgPSAkbm9kZV9zLT5zYWZlX3BzcWwoJ3Bvc3RncmVz JywgJ1NFTEVDVCBzeXN0ZW1faWRlbnRpZmllciBGUk9NIHBnX2NvbnRyb2xfc3lzdGVtKCkn KTsKK29rKCRzeXNpZF9wICE9ICRzeXNpZF9zLCAnc3lzdGVtIGlkZW50aWZpZXIgd2FzIGNo YW5nZWQnKTsKKworIyBjbGVhbiB1cAorJG5vZGVfcC0+dGVhcmRvd25fbm9kZTsKKyRub2Rl X3MtPnRlYXJkb3duX25vZGU7CisKK2RvbmVfdGVzdGluZygpOwpkaWZmIC0tZ2l0IGEvc3Jj L3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlw ZWRlZnMubGlzdAppbmRleCA5MTQzM2Q0MzliLi4xMDI5NzExNjRmIDEwMDY0NAotLS0gYS9z cmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdAorKysgYi9zcmMvdG9vbHMvcGdpbmRl bnQvdHlwZWRlZnMubGlzdApAQCAtNTE3LDYgKzUxNyw3IEBAIENyZWF0ZVNlcVN0bXQKIENy ZWF0ZVN0YXRzU3RtdAogQ3JlYXRlU3RtdAogQ3JlYXRlU3RtdENvbnRleHQKK0NyZWF0ZVN1 YnNjcmliZXJPcHRpb25zCiBDcmVhdGVTdWJzY3JpcHRpb25TdG10CiBDcmVhdGVUYWJsZUFz U3RtdAogQ3JlYXRlVGFibGVTcGFjZVN0bXQKQEAgLTE1MDUsNiArMTUwNiw3IEBAIExvZ2lj YWxSZXBCZWdpbkRhdGEKIExvZ2ljYWxSZXBDb21taXREYXRhCiBMb2dpY2FsUmVwQ29tbWl0 UHJlcGFyZWRUeG5EYXRhCiBMb2dpY2FsUmVwQ3R4U3RydWN0CitMb2dpY2FsUmVwSW5mbwog TG9naWNhbFJlcE1zZ1R5cGUKIExvZ2ljYWxSZXBQYXJ0TWFwRW50cnkKIExvZ2ljYWxSZXBQ cmVwYXJlZFR4bkRhdGEKLS0gCjIuMzAuMgoK --d24a19afbdcb42d1975b6ae6885b656c--