Feature: per-target port specification (with patch!)
Jan GocnÃk <[email protected]> Tue, 2 Apr 2019 15:07:15 +0200
| Newsgroups | gmane.comp.security.nmap.devel |
|---|---|
| Message-ID | <OF7C9CFB6B.C9072B6D-ONC12583D0.0047F42F-C12583D0.0048135B@dcit.cz> |
--=_mixed 0048135AC12583D0_=
Content-Type: multipart/alternative; boundary="=_alternative 0048135AC12583D0_="
--=_alternative 0048135AC12583D0_=
Content-Type: text/plain; charset="US-ASCII"
Hey,
I would like to propose a feature enabling specifying ports for each
target separately.
Rationale:
It often happens that we already have an nmap scan of 200 machines, and we
want to do a service scan on those same machines. Usually that forces us
to scan the whole network for all the ports that appeared at least once.
That is a big waste of time and bandwidth. What we want to have is
essentially a rescan-like feature, that would rescan just ports that were
found to be open before.
User experience:
Everywhere where you could specify a target (-iL file, command line) you
can supply a "target^ports". It works with all the nmap magic ranges, so
"192.168.1.1-255^22-60" works. The common ports (supplied with -p) are
scanned on all targets.
Implementation details:
I tried to keep it so that if you don't use any "^" in the targets, the
code path should remain largely the same, so there should be no
regressions. However, I had to do some tuning in functions that expected
they can just get the number of probes by multiplying common ports by
targets.
There's a small issue, in that the results of the scan are not sorted
properly, as the target-specific ports get scanned last.
Usage example:
===paste start===
$ nmap -v -Pn -n -p22 "165.227.141.119^80,443" "40.113.73.59^8080"
Starting Nmap 7.70SVN ( https://nmap.org ) at 2019-04-01 19:46 CEST
Initiating SYN Stealth Scan at 19:46
Scanning 2 hosts [max 3 ports/host]
Discovered open port 22/tcp
Discovered open port 80/tcp
Discovered open port 443/tcp
Discovered open port 22/tcp
Completed SYN Stealth Scan at 19:46, 1.45s elapsed (1626388576 total ports
max)
Nmap scan report for 165.227.141.119
Host is up (0.0090s latency).
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
443/tcp open https
Nmap scan report for 40.113.73.59
Host is up (0.038s latency).
PORT STATE SERVICE
22/tcp open ssh
8080/tcp filtered http-proxy
Read data files from: /home/gocnik/nmap
Nmap done: 2 IP addresses (2 hosts up) scanned in 1.52 seconds
Raw packets sent: 6 (264B) | Rcvd: 4 (176B)
===paste end===
If done the usual way:
$ nmap -v -Pn -n -p22,80,443,8080 165.227.141.119 40.113.73.59
[...]
Raw packets sent: 10 (440B) | Rcvd: 6 (260B)
The patch is against svn trunk at this moment (revision 37608).
Looking forward to all comments!
JaGoTu
P.S.: Sorry if you recieve this e-mail twice, but the previous one
apparently got caught in a moderation queue or something, as it doesn't
show on seclists.org
--=_alternative 0048135AC12583D0_=
Content-Type: text/html; charset="US-ASCII"
<span style=" font-size:10pt;font-family:sans-serif">Hey,</span>
<br>
<br><span style=" font-size:10pt;font-family:sans-serif">I would like to
propose a feature enabling specifying ports for each target separately.</span>
<br>
<br><span style=" font-size:10pt;font-family:sans-serif">Rationale:</span>
<br><span style=" font-size:10pt;font-family:sans-serif">It often happens
that we already have an nmap scan of 200 machines, and we want to do a
service scan on those same machines. Usually that forces us to scan the
whole network for all the ports that appeared at least once.</span>
<br><span style=" font-size:10pt;font-family:sans-serif">That is a big
waste of time and bandwidth. What we want to have is essentially a rescan-like
feature, that would rescan just ports that were found to be open before.</span>
<br>
<br><span style=" font-size:10pt;font-family:sans-serif">User experience:</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Everywhere where
you could specify a target (-iL file, command line) you can supply a "target^ports".
It works with all the nmap magic ranges, so "192.168.1.1-255^22-60"
works. The common ports (supplied with -p) are scanned on all targets.</span>
<br>
<br><span style=" font-size:10pt;font-family:sans-serif">Implementation
details:</span>
<br><span style=" font-size:10pt;font-family:sans-serif">I tried to keep
it so that if you don't use any "^" in the targets, the code
path should remain largely the same, so there should be no regressions.
However, I had to do some tuning in functions that expected they can just
get the number of probes by multiplying common ports by targets.</span>
<br><span style=" font-size:10pt;font-family:sans-serif">There's a small
issue, in that the results of the scan are not sorted properly, as the
target-specific ports get scanned last.</span>
<br>
<br><span style=" font-size:10pt;font-family:sans-serif">Usage example:</span>
<br><span style=" font-size:10pt;font-family:sans-serif">===paste start===</span>
<br><span style=" font-size:10pt;font-family:sans-serif">$ nmap -v -Pn
-n -p22 "165.227.141.119^80,443" "40.113.73.59^8080"</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Starting Nmap
7.70SVN ( </span><a href=https://nmap.org/><span style=" font-size:10pt;color:blue;font-family:sans-serif">https://nmap.org</span></a><span style=" font-size:10pt;font-family:sans-serif">
) at 2019-04-01 19:46 CEST</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Initiating SYN
Stealth Scan at 19:46</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Scanning 2 hosts
[max 3 ports/host]</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Discovered open
port 22/tcp</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Discovered open
port 80/tcp</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Discovered open
port 443/tcp</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Discovered open
port 22/tcp</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Completed SYN
Stealth Scan at 19:46, 1.45s elapsed (1626388576 total ports max)</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Nmap scan report
for 165.227.141.119</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Host is up (0.0090s
latency).</span>
<br>
<br><span style=" font-size:10pt;font-family:sans-serif">PORT STATE
SERVICE</span>
<br><span style=" font-size:10pt;font-family:sans-serif">22/tcp open
ssh</span>
<br><span style=" font-size:10pt;font-family:sans-serif">80/tcp open
http</span>
<br><span style=" font-size:10pt;font-family:sans-serif">443/tcp open https</span>
<br>
<br><span style=" font-size:10pt;font-family:sans-serif">Nmap scan report
for 40.113.73.59</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Host is up (0.038s
latency).</span>
<br>
<br><span style=" font-size:10pt;font-family:sans-serif">PORT
STATE SERVICE</span>
<br><span style=" font-size:10pt;font-family:sans-serif">22/tcp
open ssh</span>
<br><span style=" font-size:10pt;font-family:sans-serif">8080/tcp filtered
http-proxy</span>
<br>
<br><span style=" font-size:10pt;font-family:sans-serif">Read data files
from: /home/gocnik/nmap</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Nmap done: 2 IP
addresses (2 hosts up) scanned in 1.52 seconds</span>
<br><span style=" font-size:10pt;font-family:sans-serif">
Raw packets sent: 6 (264B) | Rcvd: 4 (176B)</span>
<br><span style=" font-size:10pt;font-family:sans-serif">===paste end===</span>
<br>
<br><span style=" font-size:10pt;font-family:sans-serif">If done the usual
way:</span>
<br><span style=" font-size:10pt;font-family:sans-serif">$ nmap -v -Pn
-n -p22,80,443,8080 165.227.141.119 40.113.73.59</span>
<br><span style=" font-size:10pt;font-family:sans-serif">[...]</span>
<br><span style=" font-size:10pt;font-family:sans-serif">Raw packets sent:
10 (440B) | Rcvd: 6 (260B)</span>
<br>
<br>
<br><span style=" font-size:10pt;font-family:sans-serif">The patch is against
svn trunk at this moment (revision 37608).</span>
<br>
<br>
<br>
<br><span style=" font-size:10pt;font-family:sans-serif">Looking forward
to all comments!</span>
<br><span style=" font-size:10pt;font-family:sans-serif">JaGoTu</span>
<br>
<br><span style=" font-size:10pt;font-family:sans-serif">P.S.: Sorry if
you recieve this e-mail twice, but the previous one apparently got caught
in a moderation queue or something, as it doesn't show on seclists.org</span>
<br>
--=_alternative 0048135AC12583D0_=--
--=_mixed 0048135AC12583D0_=
Content-Type: application/octet-stream; name="nmap_pertarget_37608.patch"
Content-Disposition: attachment; filename="nmap_pertarget_37608.patch"
Content-Transfer-Encoding: base64
SW5kZXg6IE5tYXBPcHMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBObWFwT3BzLmgJKHJldmlzaW9uIDM3NjA4
KQorKysgTm1hcE9wcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNTQsNiArMzU0LDcgQEAKICAgaW50
IHhtYXNzY2FuOwogICBib29sIG5vcmVzb2x2ZTsKICAgYm9vbCBub3BvcnRzY2FuOworICBib29s
IG5vY29tbW9ucG9ydHM7CiAgIGJvb2wgYXBwZW5kX291dHB1dDsgLyogQXBwZW5kIHRvIGFueSBv
dXRwdXQgZmlsZXMgcmF0aGVyIHRoYW4gb3ZlcndyaXRlICovCiAgIEZJTEUgKmxvZ2ZkW0xPR19O
VU1fRklMRVNdOwogICBGSUxFICpubWFwX3N0ZG91dDsgLyogTm1hcCBzdGFuZGFyZCBvdXRwdXQg
Ki8KSW5kZXg6IFRhcmdldC5jYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUYXJnZXQuY2MJKHJldmlzaW9uIDM3
NjA4KQorKysgVGFyZ2V0LmNjCSh3b3JraW5nIGNvcHkpCkBAIC0xODIsNiArMTgyLDcgQEAKICAg
c3RhdGVfcmVhc29uX2luaXQoJnJlYXNvbik7CiAgIG1lbXNldCgmcGluZ3Byb2JlLCAwLCBzaXpl
b2YocGluZ3Byb2JlKSk7CiAgIHBpbmdwcm9iZV9zdGF0ZSA9IFBPUlRfVU5LTk9XTjsKKyAgbWVt
c2V0KCZ0YXJnZXRfcG9ydHMsIDAsIHNpemVvZih0YXJnZXRfcG9ydHMpKTsKIH0KIAogCkBAIC0y
MTYsNiArMjE3LDggQEAKICAgaWYgKHRhcmdldG5hbWUpCiAgICAgZnJlZSh0YXJnZXRuYW1lKTsK
IAorICBmcmVlX3NjYW5fbGlzdHMoJnRhcmdldF9wb3J0cyk7CisKICAgaWYgKG5hbWVJUEJ1Zikg
ewogICAgIGZyZWUobmFtZUlQQnVmKTsKICAgICBuYW1lSVBCdWYgPSBOVUxMOwpJbmRleDogVGFy
Z2V0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVGFyZ2V0LmgJKHJldmlzaW9uIDM3NjA4KQorKysgVGFyZ2V0
LmgJKHdvcmtpbmcgY29weSkKQEAgLTMxOCw2ICszMTgsNyBAQAogICBlbnVtIGRpc3RfY2FsY19t
ZXRob2QgZGlzdGFuY2VfY2FsY3VsYXRpb25fbWV0aG9kOwogICBGaW5nZXJQcmludFJlc3VsdHMg
KkZQUjsgLyogRlAgcmVzdWx0cyBnZXQgYnkgdGhlIE9TIHNjYW4gc3lzdGVtLiAqLwogICBQb3J0
TGlzdCBwb3J0czsKKyAgc3RydWN0IHNjYW5fbGlzdHMgdGFyZ2V0X3BvcnRzOwogCiAgIGludCB3
ZWlyZF9yZXNwb25zZXM7IC8qIGVjaG8gcmVzcG9uc2VzIGZyb20gb3RoZXIgYWRkcmVzc2VzLCBJ
ZSBhIG5ldHdvcmsgYnJvYWRjYXN0IGFkZHJlc3MgKi8KICAgdW5zaWduZWQgaW50IGZsYWdzOyAv
KiBIT1NUX1VOS05PV04sIEhPU1RfVVAsIG9yIEhPU1RfRE9XTi4gKi8KSW5kZXg6IFRhcmdldEdy
b3VwLmNjCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRhcmdldEdyb3VwLmNjCShyZXZpc2lvbiAzNzYwOCkKKysr
IFRhcmdldEdyb3VwLmNjCSh3b3JraW5nIGNvcHkpCkBAIC04MzksNyArODM5LDI1IEBACiBpbnQg
VGFyZ2V0R3JvdXA6OnBhcnNlX2V4cHIoY29uc3QgY2hhciAqdGFyZ2V0X2V4cHIsIGludCBhZikg
ewogICBpZiAodGhpcy0+bmV0YmxvY2sgIT0gTlVMTCkKICAgICBkZWxldGUgdGhpcy0+bmV0Ymxv
Y2s7Ci0gIHRoaXMtPm5ldGJsb2NrID0gTmV0QmxvY2s6OnBhcnNlX2V4cHIodGFyZ2V0X2V4cHIs
IGFmKTsKKworICBmcmVlX3NjYW5fbGlzdHMoJmdyb3VwX3BvcnRzKTsKKyAgbWVtc2V0KCZncm91
cF9wb3J0cywgMCwgc2l6ZW9mKGdyb3VwX3BvcnRzKSk7CisKKyAgY29uc3QgY2hhciogcGFyID0g
c3RycmNocih0YXJnZXRfZXhwciwgJ14nKTsKKworICBpZiAocGFyICE9IE5VTEwpCisgIHsKKwkg
IGdldHB0cyhwYXIgKyAxLCAmdGhpcy0+Z3JvdXBfcG9ydHMpOworCisJICBjaGFyKiBleHByX3dp
dGhvdXRfcG9ydHMgPSBta3N0cih0YXJnZXRfZXhwciwgcGFyKTsKKwkgIHRoaXMtPm5ldGJsb2Nr
ID0gTmV0QmxvY2s6OnBhcnNlX2V4cHIoZXhwcl93aXRob3V0X3BvcnRzLCBhZik7CisJICBmcmVl
KGV4cHJfd2l0aG91dF9wb3J0cyk7CisgIH0KKyAgZWxzZSB7CisJICB0aGlzLT5uZXRibG9jayA9
IE5ldEJsb2NrOjpwYXJzZV9leHByKHRhcmdldF9leHByLCBhZik7CisgIH0KKworICAKICAgaWYg
KHRoaXMtPm5ldGJsb2NrICE9IE5VTEwpCiAgICAgcmV0dXJuIDA7CiAgIGVsc2UKSW5kZXg6IFRh
cmdldEdyb3VwLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVGFyZ2V0R3JvdXAuaAkocmV2aXNpb24gMzc2MDgp
CisrKyBUYXJnZXRHcm91cC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMzcsNiArMTM3LDcgQEAKIAog
I2luY2x1ZGUgPGxpc3Q+CiAjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlICJzY2FuX2xpc3Rz
LmgiCiAKIGNsYXNzIE5ldEJsb2NrOwogCkBAIC0xNDMsOSArMTQ0LDExIEBACiBjbGFzcyBUYXJn
ZXRHcm91cCB7CiBwdWJsaWM6CiAgIE5ldEJsb2NrICpuZXRibG9jazsKKyAgc3RydWN0IHNjYW5f
bGlzdHMgZ3JvdXBfcG9ydHM7CiAKICAgVGFyZ2V0R3JvdXAoKSB7CiAgICAgdGhpcy0+bmV0Ymxv
Y2sgPSBOVUxMOworICAgIG1lbXNldCgmdGhpcy0+Z3JvdXBfcG9ydHMsIDAsIHNpemVvZih0aGlz
LT5ncm91cF9wb3J0cykpOwogICB9CiAKICAgflRhcmdldEdyb3VwKCk7CkluZGV4OiBubWFwLmNj
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIG5tYXAuY2MJKHJldmlzaW9uIDM3NjA4KQorKysgbm1hcC5jYwkod29y
a2luZyBjb3B5KQpAQCAtMjYwLDYgKzI2MCw4IEBACiAgICAgICAgICAiVEFSR0VUIFNQRUNJRklD
QVRJT046XG4iCiAgICAgICAgICAiICBDYW4gcGFzcyBob3N0bmFtZXMsIElQIGFkZHJlc3Nlcywg
bmV0d29ya3MsIGV0Yy5cbiIKICAgICAgICAgICIgIEV4OiBzY2FubWUubm1hcC5vcmcsIG1pY3Jv
c29mdC5jb20vMjQsIDE5Mi4xNjguMC4xOyAxMC4wLjAtMjU1LjEtMjU0XG4iCisgICAgICAgICAi
ICBBbHNvIGNhbiBjb250YWluIHBvcnRzIHdoaWNoIHdpbGwgYmUgc2Nhbm5lZCBpbiBhZGRpdGlv
biB0b1xuIgorICAgICAgICAgIiAgY29tbW9uIHBvcnRzLiBFeDogc2Nhbm1lLm5tYXAub3JnXjQ0
MywgMTAuMC4wLTI1NS4xLTI1NF4yMlxuIgogICAgICAgICAgIiAgLWlMIDxpbnB1dGZpbGVuYW1l
PjogSW5wdXQgZnJvbSBsaXN0IG9mIGhvc3RzL25ldHdvcmtzXG4iCiAgICAgICAgICAiICAtaVIg
PG51bSBob3N0cz46IENob29zZSByYW5kb20gdGFyZ2V0c1xuIgogICAgICAgICAgIiAgLS1leGNs
dWRlIDxob3N0MVssaG9zdDJdWyxob3N0M10sLi4uPjogRXhjbHVkZSBob3N0cy9uZXR3b3Jrc1xu
IgpAQCAtMjg1LDcgKzI4Nyw3IEBACiAgICAgICAgICAiICAtc086IElQIHByb3RvY29sIHNjYW5c
biIKICAgICAgICAgICIgIC1iIDxGVFAgcmVsYXkgaG9zdD46IEZUUCBib3VuY2Ugc2NhblxuIgog
ICAgICAgICAgIlBPUlQgU1BFQ0lGSUNBVElPTiBBTkQgU0NBTiBPUkRFUjpcbiIKLSAgICAgICAg
ICIgIC1wIDxwb3J0IHJhbmdlcz46IE9ubHkgc2NhbiBzcGVjaWZpZWQgcG9ydHNcbiIKKyAgICAg
ICAgICIgIC1wIDxwb3J0IHJhbmdlcz46IFNjYW4gc3BlY2lmaWVkIHBvcnRzIG9uIGVhY2ggdGFy
Z2V0XG4iCiAgICAgICAgICAiICAgIEV4OiAtcDIyOyAtcDEtNjU1MzU7IC1wIFU6NTMsMTExLDEz
NyxUOjIxLTI1LDgwLDEzOSw4MDgwLFM6OVxuIgogICAgICAgICAgIiAgLS1leGNsdWRlLXBvcnRz
IDxwb3J0IHJhbmdlcz46IEV4Y2x1ZGUgdGhlIHNwZWNpZmllZCBwb3J0cyBmcm9tIHNjYW5uaW5n
XG4iCiAgICAgICAgICAiICAtRjogRmFzdCBtb2RlIC0gU2NhbiBmZXdlciBwb3J0cyB0aGFuIHRo
ZSBkZWZhdWx0IHNjYW5cbiIKQEAgLTM4Nyw1MiArMzg5LDggQEAKIH0KICNlbmRpZgogCi1zdGF0
aWMgdm9pZCBpbnNlcnRfcG9ydF9pbnRvX21lcmdlX2xpc3QodW5zaWduZWQgc2hvcnQgKm1saXN0
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbWVyZ2VkX3Bv
cnRfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWdu
ZWQgc2hvcnQgcCkgewotICBpbnQgaTsKLSAgLy8gbWFrZSBzdXJlIHRoZSBwb3J0IGlzbid0IGFs
cmVhZHkgaW4gdGhlIGxpc3QKLSAgZm9yIChpID0gMDsgaSA8ICptZXJnZWRfcG9ydF9jb3VudDsg
aSsrKSB7Ci0gICAgaWYgKG1saXN0W2ldID09IHApIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0g
IH0KLSAgbWxpc3RbKm1lcmdlZF9wb3J0X2NvdW50XSA9IHA7Ci0gICgqbWVyZ2VkX3BvcnRfY291
bnQpKys7Ci19CiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCAqbWVyZ2VfcG9ydF9saXN0cyh1bnNp
Z25lZCBzaG9ydCAqcG9ydF9saXN0MSwgaW50IGNvdW50MSwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqcG9ydF9saXN0MiwgaW50IGNvdW50
MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm1lcmdlZF9w
b3J0X2NvdW50KSB7Ci0gIGludCBpOwotICB1bnNpZ25lZCBzaG9ydCAqbWVyZ2VkX3BvcnRfbGlz
dCA9IE5VTEw7CiAKLSAgKm1lcmdlZF9wb3J0X2NvdW50ID0gMDsKLQotICBtZXJnZWRfcG9ydF9s
aXN0ID0KLSAgICAodW5zaWduZWQgc2hvcnQgKikgc2FmZV96YWxsb2MoKGNvdW50MSArIGNvdW50
MikgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgY291bnQx
OyBpKyspIHsKLSAgICBpbnNlcnRfcG9ydF9pbnRvX21lcmdlX2xpc3QobWVyZ2VkX3BvcnRfbGlz
dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkX3BvcnRfY291bnQsCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRfbGlzdDFbaV0pOwotICB9Ci0gIGZv
ciAoaSA9IDA7IGkgPCBjb3VudDI7IGkrKykgewotICAgIGluc2VydF9wb3J0X2ludG9fbWVyZ2Vf
bGlzdChtZXJnZWRfcG9ydF9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBt
ZXJnZWRfcG9ydF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydF9s
aXN0MltpXSk7Ci0gIH0KLQotICAvLyBpZiB0aGVyZSB3ZXJlIGR1cGxpY2F0ZSBwb3J0cyB0aGVu
IHdlIGNhbiBzYXZlIHNvbWUgbWVtb3J5Ci0gIGlmICgqbWVyZ2VkX3BvcnRfY291bnQgPCAoY291
bnQxICsgY291bnQyKSkgewotICAgIG1lcmdlZF9wb3J0X2xpc3QgPSAodW5zaWduZWQgc2hvcnQq
KQotICAgICAgICAgICAgICAgICAgICAgICBzYWZlX3JlYWxsb2MobWVyZ2VkX3BvcnRfbGlzdCwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqbWVyZ2VkX3BvcnRfY291bnQp
ICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7Ci0gIH0KLQotICByZXR1cm4gbWVyZ2VkX3BvcnRf
bGlzdDsKLX0KLQogdm9pZCB2YWxpZGF0ZV9zY2FuX2xpc3RzKHNjYW5fbGlzdHMgJnBvcnRzLCBO
bWFwT3BzICZvKSB7CiAgIGlmIChvLnBpbmd0eXBlID09IFBJTkdUWVBFX1VOS05PV04pIHsKICAg
ICBpZiAoby5pc3IwMHQpIHsKQEAgLTE1ODUsMTUgKzE1NDMsMTkgQEAKICAgaWYgKG8ucG9ydGxp
c3QgJiYgby5mYXN0c2NhbikKICAgICBmYXRhbCgiWW91IGNhbm5vdCB1c2UgLUYgKGZhc3Qgc2Nh
bikgd2l0aCAtcCAoZXhwbGljaXQgcG9ydCBzZWxlY3Rpb24pIGJ1dCBzZWUgLS10b3AtcG9ydHMg
YW5kIC0tcG9ydC1yYXRpbyB0byBmYXN0IHNjYW4gYSByYW5nZSBvZiBwb3J0cyIpOwogCisgIAog
ICBpZiAoby5pcHByb3RzY2FuKSB7CiAgICAgaWYgKG8ucG9ydGxpc3QpCiAgICAgICBnZXRwdHMo
by5wb3J0bGlzdCwgJnBvcnRzKTsKICAgICBlbHNlCi0gICAgICBnZXRwdHMoKGNoYXIgKikgKG8u
ZmFzdHNjYW4gPyAiW1A6MC1dIiA6ICIwLSIpLCAmcG9ydHMpOyAgLy8gRGVmYXVsdCBwcm90b2Nv
bHMgdG8gc2NhbgotICB9IGVsc2UgaWYgKCFvLm5vcG9ydHNjYW4pIHsKKyAgICAgIGdldHB0cygo
Y2hhciAqKShvLmZhc3RzY2FuID8gIltQOjAtXSIgOiAiMC0iKSwgJnBvcnRzKTsgIC8vIERlZmF1
bHQgcHJvdG9jb2xzIHRvIHNjYW4KKyAgfQorICBlbHNlIGlmICghby5ub3BvcnRzY2FuKSB7CiAg
ICAgZ2V0dG9wcHRzKG8udG9wcG9ydGxldmVsLCBvLnBvcnRsaXN0LCAmcG9ydHMsIG8uZXhjbHVk
ZV9wb3J0bGlzdCk7CiAgIH0KKyAgCiAKKwogICAvLyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBs
aW5lIHRvIHVzZSB0aGUgY29tbW9uIGxpc3AgcG9ydCBzcGVjIHRlc3Qgc3VpdGUKICAgLy9wcmlu
dGYoInBvcnQgc3BlYzogKCVkICVkICVkICVkKVxuIiwgcG9ydHMudGNwX2NvdW50LCBwb3J0cy51
ZHBfY291bnQsIHBvcnRzLnNjdHBfY291bnQsIHBvcnRzLnByb3RfY291bnQpOyBleGl0KDApOwog
CkBAIC0xNjY0LDE2ICsxNjI2LDE5IEBACiAgICAqIChzdWNoIGFzIE9TIGlkZW50IHNjYW4pIG1p
Z2h0IGJyZWFrIGNhdXNlIG5vIHBvcnRzIHdlcmUgc3BlY2lmaWVkLCAgYnV0CiAgICAqIHdlJ3Zl
IGdpdmVuIG91ciB3YXJuaW5nLi4uCiAgICAqLwotICBpZiAoKG8uVENQU2NhbigpKSAmJiBwb3J0
cy50Y3BfY291bnQgPT0gMCkKLSAgICBlcnJvcigiV0FSTklORzogYSBUQ1Agc2NhbiB0eXBlIHdh
cyByZXF1ZXN0ZWQsIGJ1dCBubyB0Y3AgcG9ydHMgd2VyZSBzcGVjaWZpZWQuICBTa2lwcGluZyB0
aGlzIHNjYW4gdHlwZS4iKTsKLSAgaWYgKG8uU0NUUFNjYW4oKSAmJiBwb3J0cy5zY3RwX2NvdW50
ID09IDApCi0gICAgZXJyb3IoIldBUk5JTkc6IGEgU0NUUCBzY2FuIHR5cGUgd2FzIHJlcXVlc3Rl
ZCwgYnV0IG5vIHNjdHAgcG9ydHMgd2VyZSBzcGVjaWZpZWQuICBTa2lwcGluZyB0aGlzIHNjYW4g
dHlwZS4iKTsKLSAgaWYgKG8uVURQU2NhbigpICYmIHBvcnRzLnVkcF9jb3VudCA9PSAwKQotICAg
IGVycm9yKCJXQVJOSU5HOiBVRFAgc2NhbiB3YXMgcmVxdWVzdGVkLCBidXQgbm8gdWRwIHBvcnRz
IHdlcmUgc3BlY2lmaWVkLiAgU2tpcHBpbmcgdGhpcyBzY2FuIHR5cGUuIik7Ci0gIGlmIChvLmlw
cHJvdHNjYW4gJiYgcG9ydHMucHJvdF9jb3VudCA9PSAwKQotICAgIGVycm9yKCJXQVJOSU5HOiBw
cm90b2NvbCBzY2FuIHdhcyByZXF1ZXN0ZWQsIGJ1dCBubyBwcm90b2NvbHMgd2VyZSBzcGVjaWZp
ZWQgdG8gYmUgc2Nhbm5lZC4gIFNraXBwaW5nIHRoaXMgc2NhbiB0eXBlLiIpOworICBpZiAoIW8u
bm9jb21tb25wb3J0cykKKyAgeworICAgIGlmICgoby5UQ1BTY2FuKCkpICYmIHBvcnRzLnRjcF9j
b3VudCA9PSAwKQorICAgICAgZXJyb3IoIldBUk5JTkc6IGEgVENQIHNjYW4gdHlwZSB3YXMgcmVx
dWVzdGVkLCBidXQgbm8gY29tbW9uIHRjcCBwb3J0cyB3ZXJlIHNwZWNpZmllZC4gVW5sZXNzIHlv
dSBzcGVjaWZpZWQgcGVyLXRhcmdldCBwb3J0cywgdGhlIHNjYW4gd2lsbCBiZSB1c2VsZXNzLiIp
OworICAgIGlmIChvLlNDVFBTY2FuKCkgJiYgcG9ydHMuc2N0cF9jb3VudCA9PSAwKQorICAgICAg
ZXJyb3IoIldBUk5JTkc6IGEgU0NUUCBzY2FuIHR5cGUgd2FzIHJlcXVlc3RlZCwgYnV0IG5vIGNv
bW1vbiBzY3RwIHBvcnRzIHdlcmUgc3BlY2lmaWVkLiBVbmxlc3MgeW91IHNwZWNpZmllZCBwZXIt
dGFyZ2V0IHBvcnRzLCB0aGUgc2NhbiB3aWxsIGJlIHVzZWxlc3MuIik7CisgICAgaWYgKG8uVURQ
U2NhbigpICYmIHBvcnRzLnVkcF9jb3VudCA9PSAwKQorICAgICAgZXJyb3IoIldBUk5JTkc6IFVE
UCBzY2FuIHdhcyByZXF1ZXN0ZWQsIGJ1dCBubyBjb21tb24gdWRwIHBvcnRzIHdlcmUgc3BlY2lm
aWVkLiBVbmxlc3MgeW91IHNwZWNpZmllZCBwZXItdGFyZ2V0IHBvcnRzLCB0aGUgc2NhbiB3aWxs
IGJlIHVzZWxlc3MuIik7CisgICAgaWYgKG8uaXBwcm90c2NhbiAmJiBwb3J0cy5wcm90X2NvdW50
ID09IDApCisgICAgICBlcnJvcigiV0FSTklORzogcHJvdG9jb2wgc2NhbiB3YXMgcmVxdWVzdGVk
LCBidXQgbm8gY29tbW9uIHByb3RvY29scyB3ZXJlIHNwZWNpZmllZCB0byBiZSBzY2FubmVkLiBV
bmxlc3MgeW91IHNwZWNpZmllZCBwZXItdGFyZ2V0IHBvcnRzLCB0aGUgc2NhbiB3aWxsIGJlIHVz
ZWxlc3MuIik7CisgIH0KIAotICBpZiAoby5waW5ndHlwZSAmIFBJTkdUWVBFX1RDUCAmJiBwb3J0
cy5zeW5fcGluZ19jb3VudCtwb3J0cy5hY2tfcGluZ19jb3VudCA9PSAwKQorICBpZiAoby5waW5n
dHlwZSAmIFBJTkdUWVBFX1RDUCAmJiBwb3J0cy5zeW5fcGluZ19jb3VudCArIHBvcnRzLmFja19w
aW5nX2NvdW50ID09IDApCiAgICAgZXJyb3IoIldBUk5JTkc6IGEgVENQIHBpbmcgc2NhbiB3YXMg
cmVxdWVzdGVkLCBidXQgYWZ0ZXIgZXhjbHVkaW5nIHJlcXVlc3RlZCBUQ1AgcG9ydHMsIG5vbmUg
cmVtYWluLiBTa2lwcGluZyB0aGlzIHNjYW4gdHlwZS4iKTsKICAgaWYgKG8ucGluZ3R5cGUgJiBQ
SU5HVFlQRV9VRFAgJiYgcG9ydHMudWRwX3BpbmdfY291bnQgPT0gMCkKICAgICBlcnJvcigiV0FS
TklORzogYSBVRFAgcGluZyBzY2FuIHdhcyByZXF1ZXN0ZWQsIGJ1dCBhZnRlciBleGNsdWRpbmcg
cmVxdWVzdGVkIFVEUCBwb3J0cywgbm9uZSByZW1haW4uIFNraXBwaW5nIHRoaXMgc2NhbiB0eXBl
LiIpOwpAQCAtMTc4Myw3ICsxNzQ4LDcgQEAKIC8vIEZyZWUgc29tZSBnbG9iYWwgbWVtb3J5IGFs
bG9jYXRpb25zLgogLy8gVGhpcyBpcyB1c2VkIGZvciBkZXRlY3RpbmcgbWVtb3J5IGxlYWtzLgog
dm9pZCBubWFwX2ZyZWVfbWVtKCkgewotICBQb3J0TGlzdDo6ZnJlZVBvcnRNYXAoKTsKKyAgUG9y
dExpc3Q6OmZyZWVDb21tb25Qb3J0TWFwKCk7CiAgIGNwX2ZyZWUoKTsKICAgZnJlZV9zZXJ2aWNl
cygpOwogICBBbGxQcm9iZXM6OnNlcnZpY2Vfc2Nhbl9mcmVlKCk7CkBAIC0xOTQ3LDcgKzE5MTIs
NyBAQAogICAvKiBCZWZvcmUgd2UgcmFuZG9taXplIHRoZSBwb3J0cyBzY2FubmVkLCBsZXRzIG91
dHB1dCB0aGVtIHRvIG1hY2hpbmUKICAgICAgcGFyc2VhYmxlIG91dHB1dCAqLwogICBpZiAoby52
ZXJib3NlKQotICAgIG91dHB1dF9wb3J0c190b19tYWNoaW5lX3BhcnNlYWJsZV9vdXRwdXQoJnBv
cnRzKTsKKyAgICBvdXRwdXRfY29tbW9uX3BvcnRzX3RvX21hY2hpbmVfcGFyc2VhYmxlX291dHB1
dCgmcG9ydHMpOwogCiAjaWYgZGVmaW5lZChIQVZFX1NJR05BTCkgJiYgZGVmaW5lZChTSUdQSVBF
KQogICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7IC8qIGlnbm9yZSBTSUdQSVBFIHNvIG91ciBw
cm9ncmFtIGRvZXNuJ3QgY3Jhc2ggYmVjYXVzZQpAQCAtMTk3NiwxMyArMTk0MSwxMyBAQAogCiAg
IC8qIEJlZm9yZSB3ZSByYW5kb21pemUgdGhlIHBvcnRzIHNjYW5uZWQsIHdlIG11c3QgaW5pdGlh
bGl6ZSBQb3J0TGlzdCBjbGFzcy4gKi8KICAgaWYgKG8uaXBwcm90c2NhbikKLSAgICBQb3J0TGlz
dDo6aW5pdGlhbGl6ZVBvcnRNYXAoSVBQUk9UT19JUCwgIHBvcnRzLnByb3RzLCBwb3J0cy5wcm90
X2NvdW50KTsKKyAgICBQb3J0TGlzdDo6aW5pdGlhbGl6ZUNvbW1vblBvcnRNYXAoSVBQUk9UT19J
UCwgIHBvcnRzLnByb3RzLCBwb3J0cy5wcm90X2NvdW50KTsKICAgaWYgKG8uVENQU2NhbigpKQot
ICAgIFBvcnRMaXN0Ojppbml0aWFsaXplUG9ydE1hcChJUFBST1RPX1RDUCwgcG9ydHMudGNwX3Bv
cnRzLCBwb3J0cy50Y3BfY291bnQpOworICAgIFBvcnRMaXN0Ojppbml0aWFsaXplQ29tbW9uUG9y
dE1hcChJUFBST1RPX1RDUCwgcG9ydHMudGNwX3BvcnRzLCBwb3J0cy50Y3BfY291bnQpOwogICBp
ZiAoby5VRFBTY2FuKCkpCi0gICAgUG9ydExpc3Q6OmluaXRpYWxpemVQb3J0TWFwKElQUFJPVE9f
VURQLCBwb3J0cy51ZHBfcG9ydHMsIHBvcnRzLnVkcF9jb3VudCk7CisgICAgUG9ydExpc3Q6Omlu
aXRpYWxpemVDb21tb25Qb3J0TWFwKElQUFJPVE9fVURQLCBwb3J0cy51ZHBfcG9ydHMsIHBvcnRz
LnVkcF9jb3VudCk7CiAgIGlmIChvLlNDVFBTY2FuKCkpCi0gICAgUG9ydExpc3Q6OmluaXRpYWxp
emVQb3J0TWFwKElQUFJPVE9fU0NUUCwgcG9ydHMuc2N0cF9wb3J0cywgcG9ydHMuc2N0cF9jb3Vu
dCk7CisgICAgUG9ydExpc3Q6OmluaXRpYWxpemVDb21tb25Qb3J0TWFwKElQUFJPVE9fU0NUUCwg
cG9ydHMuc2N0cF9wb3J0cywgcG9ydHMuc2N0cF9jb3VudCk7CiAKICAgaWYgKG8ucmFuZG9taXpl
X3BvcnRzKSB7CiAgICAgaWYgKHBvcnRzLnRjcF9jb3VudCkgewpAQCAtMjA0Nyw2ICsyMDEyLDcg
QEAKICAgICAgIGlmICghY3VycmVudGhzKQogICAgICAgICBicmVhazsKIAorCiAgICAgICBpZiAo
Y3VycmVudGhzLT5mbGFncyAmIEhPU1RfVVAgJiYgIW8ubGlzdHNjYW4pCiAgICAgICAgIG8ubnVt
aG9zdHNfdXArKzsKIApAQCAtMjE4NywxMiArMjE1MywxOSBAQAogICAgICAgLyogVGhlc2UgbGFt
ZSBmdW5jdGlvbnMgY2FuIG9ubHkgaGFuZGxlIG9uZSB0YXJnZXQgYXQgYSB0aW1lICovCiAgICAg
ICBpZiAoby5pZGxlc2NhbikgewogICAgICAgICBmb3IgKHRhcmdldG5vID0gMDsgdGFyZ2V0bm8g
PCBUYXJnZXRzLnNpemUoKTsgdGFyZ2V0bm8rKykgeworICAgICAgICAgIHVuc2lnbmVkIHNob3J0
ICogbWVyZ2VkX3RjcF9wb3J0cyA9IE5VTEw7CisgICAgICAgICAgaW50IG1lcmdlZF90Y3BfcG9y
dHNfY291bnQgPSAwOworICAgICAgICAgIG1lcmdlZF90Y3BfcG9ydHMgPSBtZXJnZV9wb3J0X2xp
c3RzKHBvcnRzLnRjcF9wb3J0cywgcG9ydHMudGNwX2NvdW50LCBUYXJnZXRzW3RhcmdldG5vXS0+
dGFyZ2V0X3BvcnRzLnRjcF9wb3J0cywgVGFyZ2V0c1t0YXJnZXRub10tPnRhcmdldF9wb3J0cy50
Y3BfY291bnQsICZtZXJnZWRfdGNwX3BvcnRzX2NvdW50KTsKICAgICAgICAgICBvLmN1cnJlbnRf
c2NhbnR5cGUgPSBJRExFX1NDQU47CiAgICAgICAgICAga2V5V2FzUHJlc3NlZCgpOyAvLyBDaGVj
ayBpZiBhIHN0YXR1cyBtZXNzYWdlIHNob3VsZCBiZSBwcmludGVkCi0gICAgICAgICAgaWRsZV9z
Y2FuKFRhcmdldHNbdGFyZ2V0bm9dLCBwb3J0cy50Y3BfcG9ydHMsCi0gICAgICAgICAgICAgICAg
ICAgIHBvcnRzLnRjcF9jb3VudCwgby5pZGxlUHJveHksICZwb3J0cyk7CisKKyAgICAgICAgICAv
L1RoZSBwb3J0cyBzdHJ1Y3R1cmUgYXQgdGhlIGVuZCBpcyBvbmx5IHVzZWQgZm9yIHByb2Jpbmcg
dGhlIHByb3h5LCBzbyB3ZSBkb24ndCBuZWVkIHRvIG1lcmdlIHRoYXQuCisgICAgICAgICAgaWRs
ZV9zY2FuKFRhcmdldHNbdGFyZ2V0bm9dLCBtZXJnZWRfdGNwX3BvcnRzLAorICAgICAgICAgICAg
ICAgICAgICBtZXJnZWRfdGNwX3BvcnRzX2NvdW50LCBvLmlkbGVQcm94eSwgJnBvcnRzKTsKKyAg
ICAgICAgICBmcmVlKG1lcmdlZF90Y3BfcG9ydHMpOwogICAgICAgICB9CiAgICAgICB9CisKICAg
ICAgIGlmIChvLmJvdW5jZXNjYW4pIHsKICAgICAgICAgZm9yICh0YXJnZXRubyA9IDA7IHRhcmdl
dG5vIDwgVGFyZ2V0cy5zaXplKCk7IHRhcmdldG5vKyspIHsKICAgICAgICAgICBvLmN1cnJlbnRf
c2NhbnR5cGUgPSBCT1VOQ0VfU0NBTjsKQEAgLTIyMDAsNyArMjE3MywxMyBAQAogICAgICAgICAg
IGlmIChmdHAuc2QgPD0gMCkKICAgICAgICAgICAgIGZ0cF9hbm9uX2Nvbm5lY3QoJmZ0cCk7CiAg
ICAgICAgICAgaWYgKGZ0cC5zZCA+IDApCi0gICAgICAgICAgICBib3VuY2Vfc2NhbihUYXJnZXRz
W3RhcmdldG5vXSwgcG9ydHMudGNwX3BvcnRzLCBwb3J0cy50Y3BfY291bnQsICZmdHApOworICAg
ICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0ICogbWVyZ2VkX3RjcF9wb3J0cyA9
IE5VTEw7CisgICAgICAgICAgICBpbnQgbWVyZ2VkX3RjcF9wb3J0c19jb3VudCA9IDA7CisgICAg
ICAgICAgICBtZXJnZWRfdGNwX3BvcnRzID0gbWVyZ2VfcG9ydF9saXN0cyhwb3J0cy50Y3BfcG9y
dHMsIHBvcnRzLnRjcF9jb3VudCwgVGFyZ2V0c1t0YXJnZXRub10tPnRhcmdldF9wb3J0cy50Y3Bf
cG9ydHMsIFRhcmdldHNbdGFyZ2V0bm9dLT50YXJnZXRfcG9ydHMudGNwX2NvdW50LCAmbWVyZ2Vk
X3RjcF9wb3J0c19jb3VudCk7CisgICAgICAgICAgICBib3VuY2Vfc2NhbihUYXJnZXRzW3Rhcmdl
dG5vXSwgbWVyZ2VkX3RjcF9wb3J0cywgbWVyZ2VkX3RjcF9wb3J0c19jb3VudCwgJmZ0cCk7Cisg
ICAgICAgICAgICBmcmVlKG1lcmdlZF90Y3BfcG9ydHMpOworICAgICAgICAgIH0KICAgICAgICAg
fQogICAgICAgfQogCkluZGV4OiBvdXRwdXQuY2MKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gb3V0cHV0LmNjCShy
ZXZpc2lvbiAzNzYwOCkKKysrIG91dHB1dC5jYwkod29ya2luZyBjb3B5KQpAQCAtODc4LDYgKzg3
OCw5IEBACiAgIHhtbF9lbmRfdGFnKCk7IC8qIHBvcnRzICovCiAgIHhtbF9uZXdsaW5lKCk7CiAK
KyAgCisgICAgCisKICAgaWYgKG8uZGVmZWF0X3JzdF9yYXRlbGltaXQgJiYgby5UQ1BTY2FuKCkg
JiYgcGxpc3QtPmdldFN0YXRlQ291bnRzKFBPUlRfRklMVEVSRUQpID4gMCkgewogICAgIGxvZ193
cml0ZShMT0dfUExBSU4sICJTb21lIGNsb3NlZCBwb3J0cyBtYXkgYmUgcmVwb3J0ZWQgYXMgZmls
dGVyZWQgZHVlIHRvIC0tZGVmZWF0LXJzdC1yYXRlbGltaXRcbiIpOwogICB9CkBAIC0xMTc2LDcg
KzExNzksNyBAQAogICBpbnQgdWRwcG9ydHNzY2FubmVkID0gcG9ydHMtPnVkcF9jb3VudDsKICAg
aW50IHNjdHBwb3J0c3NjYW5uZWQgPSBwb3J0cy0+c2N0cF9jb3VudDsKICAgaW50IHByb3Rzc2Nh
bm5lZCA9IHBvcnRzLT5wcm90X2NvdW50OwotICBsb2dfd3JpdGUoTE9HX01BQ0hJTkUsICIjIFBv
cnRzIHNjYW5uZWQ6IFRDUCglZDsiLCB0Y3Bwb3J0c3NjYW5uZWQpOworICBsb2dfd3JpdGUoTE9H
X01BQ0hJTkUsICJUQ1AoJWQ7IiwgdGNwcG9ydHNzY2FubmVkKTsKICAgaWYgKHRjcHBvcnRzc2Nh
bm5lZCkKICAgICBvdXRwdXRfcmFuZ2VsaXN0X2dpdmVuX3BvcnRzKExPR19NQUNISU5FLCBwb3J0
cy0+dGNwX3BvcnRzLCB0Y3Bwb3J0c3NjYW5uZWQpOwogICBsb2dfd3JpdGUoTE9HX01BQ0hJTkUs
ICIpIFVEUCglZDsiLCB1ZHBwb3J0c3NjYW5uZWQpOwpAQCAtMTE4OSw5ICsxMTkyLDI2IEBACiAg
IGlmIChwcm90c3NjYW5uZWQpCiAgICAgb3V0cHV0X3JhbmdlbGlzdF9naXZlbl9wb3J0cyhMT0df
TUFDSElORSwgcG9ydHMtPnByb3RzLCBwcm90c3NjYW5uZWQpOwogICBsb2dfd3JpdGUoTE9HX01B
Q0hJTkUsICIpXG4iKTsKK30KKwordm9pZCBvdXRwdXRfY29tbW9uX3BvcnRzX3RvX21hY2hpbmVf
cGFyc2VhYmxlX291dHB1dChzdHJ1Y3Qgc2Nhbl9saXN0cyAqcG9ydHMpCit7CisgIGxvZ193cml0
ZShMT0dfTUFDSElORSwgIiMgUG9ydHMgc2Nhbm5lZCA6ICIpOworICBvdXRwdXRfcG9ydHNfdG9f
bWFjaGluZV9wYXJzZWFibGVfb3V0cHV0KHBvcnRzKTsKICAgbG9nX2ZsdXNoX2FsbCgpOwogfQog
CisvKiBPdXRwdXQgdGhlIGxpc3Qgb2YgcG9ydHMgc2Nhbm5lZCB0byB0aGUgdG9wIG9mIG1hY2hp
bmUgcGFyc2VhYmxlCitsb2dzIChpbiBhIGNvbW1lbnQsIHVuZm9ydHVuYXRlbHkpLiAgVGhlIGl0
ZW1zIGluIHBvcnRzIHNob3VsZCBiZQoraW4gc2VxdWVudGlhbCBvcmRlciBmb3Igc3BhY2Ugc2F2
aW5ncyBhbmQgZWFzaWVyIHRvIHJlYWQgb3V0cHV0ICovCit2b2lkIG91dHB1dF90YXJnZXRfcG9y
dHNfdG9fbWFjaGluZV9wYXJzZWFibGVfb3V0cHV0KFRhcmdldCAqY3VycmVudGhzKSB7CisgIGlm
IChjdXJyZW50aHMtPnRhcmdldF9wb3J0cy50Y3BfY291bnQgPT0gMCAmJiBjdXJyZW50aHMtPnRh
cmdldF9wb3J0cy51ZHBfY291bnQgPT0gMCAmJiBjdXJyZW50aHMtPnRhcmdldF9wb3J0cy5zY3Rw
X2NvdW50ID09IDAgJiYgY3VycmVudGhzLT50YXJnZXRfcG9ydHMucHJvdF9jb3VudCA9PSAwKQor
ICAgIHJldHVybjsKKyAgbG9nX3dyaXRlKExPR19NQUNISU5FLCAiSG9zdDogJXMgKCVzKVx0QWRk
aXRpb25hbCBwb3J0cyBzY2FubmVkOiAiLAorICAgIGN1cnJlbnRocy0+dGFyZ2V0aXBzdHIoKSwg
Y3VycmVudGhzLT5Ib3N0TmFtZSgpKTsKKyAgb3V0cHV0X3BvcnRzX3RvX21hY2hpbmVfcGFyc2Vh
YmxlX291dHB1dCgmY3VycmVudGhzLT50YXJnZXRfcG9ydHMpOworfQorCiAvLyBBIHNpbXBsZSBo
ZWxwZXIgZnVuY3Rpb24gZm9yIGRvc2NhbmluZm8gaGFuZGxlcyB0aGUgYzE0biBvZiBvLnNjYW5m
bGFncwogc3RhdGljIHZvaWQgZG9zY2FuZmxhZ3MoKSB7CiAgIHN0cnVjdCB7CkBAIC0xMzYxLDYg
KzEzODEsOCBAQAogICAgIHhtbF9lbmRfdGFnKCk7CiAgICAgeG1sX25ld2xpbmUoKTsKICAgfQor
ICB4bWxfbmV3bGluZSgpOworICBvdXRwdXRfeG1sX3NjYW5pbmZvX3JlY29yZHMoJmN1cnJlbnRo
cy0+dGFyZ2V0X3BvcnRzKTsKICAgbG9nX2ZsdXNoX2FsbCgpOwogfQogCkBAIC0xNDY1LDYgKzE0
ODcsOSBAQAogICAgIGxvZ193cml0ZShMT0dfUExBSU4sICJyRE5TIHJlY29yZCBmb3IgJXM6ICVz
XG4iLAogICAgICAgY3VycmVudGhzLT50YXJnZXRpcHN0cigpLCBjdXJyZW50aHMtPkhvc3ROYW1l
KCkpOwogICB9CisKKyAgaWYgKG8udmVyYm9zZSkKKyAgICBvdXRwdXRfdGFyZ2V0X3BvcnRzX3Rv
X21hY2hpbmVfcGFyc2VhYmxlX291dHB1dChjdXJyZW50aHMpOwogfQogCiAvKiBXcml0ZXMgaG9z
dCBzdGF0dXMgaW5mbyB0byB0aGUgbG9nIHN0cmVhbXMgKGluY2x1ZGluZyBTVERPVVQpLiAgQW4K
SW5kZXg6IG91dHB1dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIG91dHB1dC5oCShyZXZpc2lvbiAzNzYwOCkK
KysrIG91dHB1dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMzAsMTAgKzIzMCwxNiBAQAogICAgaXQg
YWxyZWFkeSBleGlzdHMuICBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBj
cmVhdGVkICovCiBpbnQgbG9nX29wZW4oaW50IGxvZ3QsIGJvb2wgYXBwZW5kLCBjaGFyICpmaWxl
bmFtZSk7CiAKLS8qIE91dHB1dCB0aGUgbGlzdCBvZiBwb3J0cyBzY2FubmVkIHRvIHRoZSB0b3Ag
b2YgbWFjaGluZSBwYXJzZWFibGUKKworLyogT3V0cHV0IHRoZSBsaXN0IG9mIHBvcnRzIHNjYW5u
ZWQgZm9yIHRoaXMgc3BlY2lmaWMgdGFyZ2V0CisgICB0byBtYWNoaW5lIHBhcnNlYWJsZSBsb2dz
ICBXaGVuIHVzaW5nIHBlci10YXJnZXQgcG9ydHMsIHRoaXMgaW5mb3JtYXRpb24KKyAgIGlzIG1v
cmUgdmFsdWFibGUgdGhhbiBwb3J0cyB1c2VkIGluIGEgcmVndWxhciBzY2FuLCBzbyBpdCdzIG5v
dCBhIGNvbW1lbnQuKi8KK3ZvaWQgb3V0cHV0X3RhcmdldF9wb3J0c190b19tYWNoaW5lX3BhcnNl
YWJsZV9vdXRwdXQoVGFyZ2V0ICpjdXJyZW50aHMpOworCisvKiBPdXRwdXQgdGhlIGxpc3Qgb2Yg
Y29tbW9uIHBvcnRzIHNjYW5uZWQgdG8gdGhlIHRvcCBvZiBtYWNoaW5lIHBhcnNlYWJsZQogICAg
bG9ncyAoaW4gYSBjb21tZW50LCB1bmZvcnR1bmF0ZWx5KS4gIFRoZSBpdGVtcyBpbiBwb3J0cyBz
aG91bGQgYmUKICAgIGluIHNlcXVlbnRpYWwgb3JkZXIgZm9yIHNwYWNlIHNhdmluZ3MgYW5kIGVh
c2llciB0byByZWFkIG91dHB1dCAqLwotdm9pZCBvdXRwdXRfcG9ydHNfdG9fbWFjaGluZV9wYXJz
ZWFibGVfb3V0cHV0KHN0cnVjdCBzY2FuX2xpc3RzICpwb3J0cyk7Cit2b2lkIG91dHB1dF9jb21t
b25fcG9ydHNfdG9fbWFjaGluZV9wYXJzZWFibGVfb3V0cHV0KHN0cnVjdCBzY2FuX2xpc3RzICpw
b3J0cyk7CiAKIC8qIFJldHVybiBhIHN0ZDo6c3RyaW5nIGNvbnRhaW5pbmcgYWxsIG4gc3RyaW5n
cyBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSwgYW5kCiAgICBpbmRpdmlkdWFsbHkgcXVvdGVkIGlm
IG5lZWRlZC4gKi8KSW5kZXg6IHBvcnRsaXN0LmNjCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBvcnRsaXN0LmNj
CShyZXZpc2lvbiAzNzYwOCkKKysrIHBvcnRsaXN0LmNjCSh3b3JraW5nIGNvcHkpCkBAIC00NzEs
MTMgKzQ3MSwxOSBAQAogICBtZW1zZXQocG9ydF9saXN0LCAwLCBzaXplb2YocG9ydF9saXN0KSk7
CiAKICAgZm9yKHByb3RvPTA7IHByb3RvIDwgUE9SVExJU1RfUFJPVE9fTUFYOyBwcm90bysrKSB7
Ci0gICAgaWYocG9ydF9saXN0X2NvdW50W3Byb3RvXSA+IDApCi0gICAgICBwb3J0X2xpc3RbcHJv
dG9dID0gKFBvcnQqKikgc2FmZV96YWxsb2Moc2l6ZW9mKFBvcnQqKSpwb3J0X2xpc3RfY291bnRb
cHJvdG9dKTsKKyAgICBpZihjb21tb25fcG9ydF9saXN0X2NvdW50W3Byb3RvXSA+IDApCisgICAg
ICBwb3J0X2xpc3RbcHJvdG9dID0gKFBvcnQqKikgc2FmZV96YWxsb2Moc2l6ZW9mKFBvcnQqKSpj
b21tb25fcG9ydF9saXN0X2NvdW50W3Byb3RvXSk7CiAgICAgZGVmYXVsdF9wb3J0X3N0YXRlW3By
b3RvXS5wcm90byA9IFBPUlRMSVNUUFJPVE8ySU5QUk9UTyhwcm90byk7CiAgICAgZGVmYXVsdF9w
b3J0X3N0YXRlW3Byb3RvXS5yZWFzb24ucmVhc29uX2lkID0gRVJfTk9SRVNQT05TRTsKLSAgICBz
dGF0ZV9jb3VudHNfcHJvdG9bcHJvdG9dW2RlZmF1bHRfcG9ydF9zdGF0ZVtwcm90b10uc3RhdGVd
ID0gcG9ydF9saXN0X2NvdW50W3Byb3RvXTsKKyAgICBzdGF0ZV9jb3VudHNfcHJvdG9bcHJvdG9d
W2RlZmF1bHRfcG9ydF9zdGF0ZVtwcm90b10uc3RhdGVdID0gY29tbW9uX3BvcnRfbGlzdF9jb3Vu
dFtwcm90b107CisKKyAgICBoYXNfc3BlY2lmaWNfcG9ydHNbcHJvdG9dID0gZmFsc2U7CisgICAg
cG9ydF9tYXBbcHJvdG9dID0gY29tbW9uX3BvcnRfbWFwW3Byb3RvXTsKKyAgICBwb3J0X21hcF9y
ZXZbcHJvdG9dID0gY29tbW9uX3BvcnRfbWFwX3Jldltwcm90b107CisgICAgcG9ydF9saXN0X2Nv
dW50W3Byb3RvXSA9IGNvbW1vbl9wb3J0X2xpc3RfY291bnRbcHJvdG9dOwogICB9CiAKKwogICBu
dW1zY3JpcHRyZXN1bHRzID0gMDsKICAgaWRzdHIgPSBOVUxMOwogfQpAQCAtNzQzLDQ5ICs3NDks
NTEgQEAKIAogLyogSnVzdCBmcmVlIG1lbW9yeSB1c2VkIGJ5IFBvcnRMaXN0Ojpwb3J0X21hcFtd
LiBTaG91bGQgYmUgZG9uZSBzb21ld2hlcmUKICAqIGJlZm9yZSBjbG9zaW5nIG5tYXAuICovCi12
b2lkIFBvcnRMaXN0OjpmcmVlUG9ydE1hcCgpIHsKK3ZvaWQgUG9ydExpc3Q6OmZyZWVDb21tb25Q
b3J0TWFwKCkgewogICBpbnQgcHJvdG87CiAKICAgZm9yIChwcm90bz0wOyBwcm90byA8IFBPUlRM
SVNUX1BST1RPX01BWDsgcHJvdG8rKykgewotICAgIGlmIChwb3J0X21hcFtwcm90b10pIHsKLSAg
ICAgIGZyZWUocG9ydF9tYXBbcHJvdG9dKTsKLSAgICAgIHBvcnRfbWFwW3Byb3RvXSA9IE5VTEw7
CisgICAgaWYgKGNvbW1vbl9wb3J0X21hcFtwcm90b10pIHsKKyAgICAgIGZyZWUoY29tbW9uX3Bv
cnRfbWFwW3Byb3RvXSk7CisgICAgICBjb21tb25fcG9ydF9tYXBbcHJvdG9dID0gTlVMTDsKICAg
ICB9Ci0gICAgaWYgKHBvcnRfbWFwX3Jldltwcm90b10pIHsKLSAgICAgIGZyZWUocG9ydF9tYXBf
cmV2W3Byb3RvXSk7Ci0gICAgICBwb3J0X21hcF9yZXZbcHJvdG9dID0gTlVMTDsKKyAgICBpZiAo
Y29tbW9uX3BvcnRfbWFwX3Jldltwcm90b10pIHsKKyAgICAgIGZyZWUoY29tbW9uX3BvcnRfbWFw
X3Jldltwcm90b10pOworICAgICAgY29tbW9uX3BvcnRfbWFwX3Jldltwcm90b10gPSBOVUxMOwog
ICAgIH0KLSAgICBwb3J0X2xpc3RfY291bnRbcHJvdG9dID0gMDsKKyAgICBjb21tb25fcG9ydF9s
aXN0X2NvdW50W3Byb3RvXSA9IDA7CiAgIH0KIH0KIAogCi11MTYgKlBvcnRMaXN0Ojpwb3J0X21h
cFtQT1JUTElTVF9QUk9UT19NQVhdOwotdTE2ICpQb3J0TGlzdDo6cG9ydF9tYXBfcmV2W1BPUlRM
SVNUX1BST1RPX01BWF07Ci1pbnQgUG9ydExpc3Q6OnBvcnRfbGlzdF9jb3VudFtQT1JUTElTVF9Q
Uk9UT19NQVhdOwordTE2ICpQb3J0TGlzdDo6Y29tbW9uX3BvcnRfbWFwW1BPUlRMSVNUX1BST1RP
X01BWF07Cit1MTYgKlBvcnRMaXN0Ojpjb21tb25fcG9ydF9tYXBfcmV2W1BPUlRMSVNUX1BST1RP
X01BWF07CitpbnQgUG9ydExpc3Q6OmNvbW1vbl9wb3J0X2xpc3RfY291bnRbUE9SVExJU1RfUFJP
VE9fTUFYXTsKIAogLyogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHJ1biBiZWZvcmUgYW55IFBvcnRM
aXN0IG9iamVjdCBpcyBjcmVhdGVkLgogICogSXQgbXVzdCBiZSBydW4gZm9yIGV2ZXJ5IHVzZWQg
cHJvdG9jb2wuIFRoZSBkYXRhIGluICJwb3J0cyIKICAqIHNob3VsZCBiZSBzb3J0ZWQuICovCi12
b2lkIFBvcnRMaXN0Ojppbml0aWFsaXplUG9ydE1hcChpbnQgcHJvdG9jb2wsIHUxNiAqcG9ydHMs
IGludCBwb3J0Y291bnQpIHsKK3ZvaWQgUG9ydExpc3Q6OmluaXRpYWxpemVDb21tb25Qb3J0TWFw
KGludCBwcm90b2NvbCwgdTE2ICpwb3J0cywgaW50IHBvcnRjb3VudCkgeworICBpZiAocG9ydGNv
dW50ID09IDApCisgICAgcmV0dXJuOwogICBpbnQgaTsKICAgaW50IHBvcnRzX21heCA9IChwcm90
b2NvbCA9PSBJUFBST1RPX0lQKSA/IDI1NiA6IDY1NTM2OwogICBpbnQgcHJvdG8gPSBJTlBST1RP
MlBPUlRMSVNUUFJPVE8ocHJvdG9jb2wpOwogCi0gIGlmIChwb3J0X21hcFtwcm90b10gIT0gTlVM
TCB8fCBwb3J0X21hcF9yZXZbcHJvdG9dICE9IE5VTEwpCisgIGlmIChjb21tb25fcG9ydF9tYXBb
cHJvdG9dICE9IE5VTEwgfHwgY29tbW9uX3BvcnRfbWFwX3Jldltwcm90b10gIT0gTlVMTCkKICAg
ICBmYXRhbCgiJXM6IHBvcnRtYXAgZm9yIHByb3RvY29sICVpIGFscmVhZHkgaW5pdGlhbGl6ZWQi
LCBfX2Z1bmNfXywgcHJvdG9jb2wpOwogCi0gIGFzc2VydChwb3J0X2xpc3RfY291bnRbcHJvdG9d
PT0wKTsKKyAgYXNzZXJ0KGNvbW1vbl9wb3J0X2xpc3RfY291bnRbcHJvdG9dPT0wKTsKIAogICAv
KiB0aGlzIG1lbW9yeSB3aWxsIG5ldmVyIGJlIGZyZWVkLCBidXQgdGhpcyBpcyB0aGUgd2F5IGl0
IGhhcyB0byBiZS4gKi8KLSAgcG9ydF9tYXBbcHJvdG9dID0gKHUxNiAqKSBzYWZlX3phbGxvYyhz
aXplb2YodTE2KSAqIHBvcnRzX21heCk7Ci0gIHBvcnRfbWFwX3Jldltwcm90b10gPSAodTE2ICop
IHNhZmVfemFsbG9jKHNpemVvZih1MTYpICogcG9ydGNvdW50KTsKKyAgY29tbW9uX3BvcnRfbWFw
W3Byb3RvXSA9ICh1MTYgKikgc2FmZV96YWxsb2Moc2l6ZW9mKHUxNikgKiBwb3J0c19tYXgpOwor
ICBjb21tb25fcG9ydF9tYXBfcmV2W3Byb3RvXSA9ICh1MTYgKikgc2FmZV96YWxsb2Moc2l6ZW9m
KHUxNikgKiBwb3J0Y291bnQpOwogCi0gIHBvcnRfbGlzdF9jb3VudFtwcm90b10gPSBwb3J0Y291
bnQ7CisgIGNvbW1vbl9wb3J0X2xpc3RfY291bnRbcHJvdG9dID0gcG9ydGNvdW50OwogCiAgIGZv
cihpPTA7IGkgPCBwb3J0Y291bnQ7IGkrKykgewotICAgIHBvcnRfbWFwW3Byb3RvXVtwb3J0c1tp
XV0gPSBpOwotICAgIHBvcnRfbWFwX3Jldltwcm90b11baV0gPSBwb3J0c1tpXTsKKyAgICBjb21t
b25fcG9ydF9tYXBbcHJvdG9dW3BvcnRzW2ldXSA9IGk7CisgICAgY29tbW9uX3BvcnRfbWFwX3Jl
dltwcm90b11baV0gPSBwb3J0c1tpXTsKICAgfQogICAvKiBTbyBub3cgcG9ydF9tYXAgc2hvdWxk
IGhhdmUgc3VjaCBzdHJ1Y3R1cmUgKGxldHMgc2NhbiAybmQsNHRoIGFuZCA2dGggcG9ydCk6CiAg
ICAqIAlwb3J0X21hcFswLDAsMSwwLDIsMCwzLC4uLl0JICAgICAgICA8LSBpbmRleGVzIHRvIHBv
cnRfbGlzdCBzdHJ1Y3R1cmUKQEAgLTc5Miw2ICs4MDAsODQgQEAKICAgICogCXBvcnRfbGlzdFtw
b3J0XzIscG9ydF80LHBvcnRfNl0gKi8KIH0KIAordm9pZCBQb3J0TGlzdDo6bWVyZ2VIb3N0U3Bl
Y2lmaWNQb3J0cyhpbnQgcHJvdG9jb2wsIHUxNiAqcG9ydHMsIGludCBwb3J0Y291bnQpCit7Cisg
IGlmIChwb3J0Y291bnQgPT0gMCkgcmV0dXJuOworCisgIGludCBpOworICBpbnQgcG9ydHNfbWF4
ID0gKHByb3RvY29sID09IElQUFJPVE9fSVApID8gMjU2IDogNjU1MzY7CisgIGludCBwcm90byA9
IElOUFJPVE8yUE9SVExJU1RQUk9UTyhwcm90b2NvbCk7CisKKyAgaWYgKHBvcnRfbWFwW3Byb3Rv
XSA9PSBOVUxMKQorICB7CisgICAgcG9ydF9tYXBbcHJvdG9dID0gKHUxNiAqKXNhZmVfemFsbG9j
KHNpemVvZih1MTYpICogcG9ydHNfbWF4KTsKKyAgICBwb3J0X21hcF9yZXZbcHJvdG9dID0gKHUx
NiAqKXNhZmVfemFsbG9jKHNpemVvZih1MTYpICogcG9ydGNvdW50KTsKKworICAgIHBvcnRfbGlz
dF9jb3VudFtwcm90b10gPSBwb3J0Y291bnQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcG9ydGNv
dW50OyBpKyspIHsKKyAgICAgIHBvcnRfbWFwW3Byb3RvXVtwb3J0c1tpXV0gPSBpOworICAgICAg
cG9ydF9tYXBfcmV2W3Byb3RvXVtpXSA9IHBvcnRzW2ldOworICAgIH0KKworICAgIGhhc19zcGVj
aWZpY19wb3J0c1twcm90b10gPSB0cnVlOworICB9CisgIGVsc2UgeworCisgICAgaW50IG5ld19w
b3J0c19jb3VudCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHBvcnRjb3VudDsgaSsrKSB7Cisg
ICAgICBpZiAocG9ydF9tYXBbcHJvdG9dW2ldID09IDAgJiYgcG9ydF9tYXBfcmV2W3Byb3RvXVsw
XSAhPSBpKQorICAgICAgICBuZXdfcG9ydHNfY291bnQrKzsKKyAgICB9CisKKyAgICBpbnQgb2xk
X2NvdW50ID0gcG9ydF9saXN0X2NvdW50W3Byb3RvXTsKKyAgICBpbnQgbmV3X2NvdW50ID0gb2xk
X2NvdW50ICsgbmV3X3BvcnRzX2NvdW50OworICAgIHUxNiogbmV3X3BvcnRfbWFwID0gKHUxNiAq
KXNhZmVfemFsbG9jKHNpemVvZih1MTYpICogcG9ydHNfbWF4KTsKKyAgICB1MTYqIG5ld19wb3J0
X21hcF9yZXYgPSAodTE2ICopc2FmZV96YWxsb2Moc2l6ZW9mKHUxNikgKiBuZXdfY291bnQpOwor
CisgICAgbWVtY3B5KG5ld19wb3J0X21hcCwgcG9ydF9tYXBbcHJvdG9dLCBzaXplb2YodTE2KSAq
IHBvcnRzX21heCk7CisgICAgbWVtY3B5KG5ld19wb3J0X21hcF9yZXYsIHBvcnRfbWFwX3Jldltw
cm90b10sIHNpemVvZih1MTYpICogb2xkX2NvdW50KTsKKworICAgIGlmIChoYXNfc3BlY2lmaWNf
cG9ydHNbcHJvdG9dKQorICAgIHsKKyAgICAgIGZyZWUocG9ydF9tYXBbcHJvdG9dKTsKKyAgICAg
IGZyZWUocG9ydF9tYXBfcmV2W3Byb3RvXSk7CisgICAgfQorCisgICAgaGFzX3NwZWNpZmljX3Bv
cnRzW3Byb3RvXSA9IHRydWU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcG9ydGNvdW50OyBpKysp
IHsKKyAgICAgIGlmIChuZXdfcG9ydF9tYXBbcG9ydHNbaV1dICE9IDAgfHwgbmV3X3BvcnRfbWFw
X3JldlswXSA9PSBpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgbmV3X3BvcnRfbWFwW3Bv
cnRzW2ldXSA9IG9sZF9jb3VudDsKKyAgICAgIG5ld19wb3J0X21hcF9yZXZbb2xkX2NvdW50XSA9
IHBvcnRzW2ldOworICAgICAgb2xkX2NvdW50Kys7CisgICAgfQorCisgICAgcG9ydF9tYXBbcHJv
dG9dID0gbmV3X3BvcnRfbWFwOworICAgIHBvcnRfbWFwX3Jldltwcm90b10gPSBuZXdfcG9ydF9t
YXBfcmV2OworICAgIHBvcnRfbGlzdF9jb3VudFtwcm90b10gPSBuZXdfY291bnQ7CisgIH0KKwor
ICBmb3IgKHByb3RvID0gMDsgcHJvdG8gPCBQT1JUTElTVF9QUk9UT19NQVg7IHByb3RvKyspIHsK
KworICAgIGlmIChwb3J0X2xpc3RbcHJvdG9dKQorICAgICAgZnJlZShwb3J0X2xpc3RbcHJvdG9d
KTsKKworICAgIGlmIChwb3J0X2xpc3RfY291bnRbcHJvdG9dID4gMCkKKyAgICAgIHBvcnRfbGlz
dFtwcm90b10gPSAoUG9ydCoqKXNhZmVfemFsbG9jKHNpemVvZihQb3J0KikqcG9ydF9saXN0X2Nv
dW50W3Byb3RvXSk7CisKKyAgICBkZWZhdWx0X3BvcnRfc3RhdGVbcHJvdG9dLnByb3RvID0gUE9S
VExJU1RQUk9UTzJJTlBST1RPKHByb3RvKTsKKyAgICBkZWZhdWx0X3BvcnRfc3RhdGVbcHJvdG9d
LnJlYXNvbi5yZWFzb25faWQgPSBFUl9OT1JFU1BPTlNFOworICAgIHN0YXRlX2NvdW50c19wcm90
b1twcm90b11bZGVmYXVsdF9wb3J0X3N0YXRlW3Byb3RvXS5zdGF0ZV0gPSBwb3J0X2xpc3RfY291
bnRbcHJvdG9dOworICB9CisKKyAgbnVtc2NyaXB0cmVzdWx0cyA9IDA7CisgIGlkc3RyID0gTlVM
TDsKKworfQorCiAgIC8qIEN5Y2xlcyB0aHJvdWdoIHRoZSAwIG9yIG1vcmUgImlnbm9yZWQiIHBv
cnRzIHdoaWNoIHNob3VsZCBiZQogICAgY29uc29saWRhdGVkIGZvciBObWFwIG91dHB1dC4gIFRo
ZXkgYXJlIHJldHVybmVkIHNvcnRlZCBieSB0aGUKICAgIG51bWJlciBvZiBwb3J0cyBpbiB0aGUg
c3RhdGUsIHN0YXJ0aW5nIHdpdGggdGhlIG1vc3QgY29tbW9uLiAgSXQKQEAgLTEwMDQsNCArMTA5
MCwzIEBACiAgIH0KICAgcmV0dXJuICJ1bmtub3duIjsKIH0KLQpJbmRleDogcG9ydGxpc3QuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBwb3J0bGlzdC5oCShyZXZpc2lvbiAzNzYwOCkKKysrIHBvcnRsaXN0LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTI0Niw5ICsyNDYsMTAgQEAKICAgflBvcnRMaXN0KCk7CiAgIC8q
IFNldCBwb3J0cyB0aGF0IHdpbGwgYmUgc2Nhbm5lZCBmb3IgZWFjaCBwcm90b2NvbC4gVGhpcyBm
dW5jdGlvbgogICAgKiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IFBvcnRMaXN0IG9iamVjdCB3
aWxsIGJlIGNyZWF0ZWQuICovCi0gIHN0YXRpYyB2b2lkIGluaXRpYWxpemVQb3J0TWFwKGludCBw
cm90b2NvbCwgdTE2ICpwb3J0cywgaW50IHBvcnRjb3VudCk7CisgIHN0YXRpYyB2b2lkIGluaXRp
YWxpemVDb21tb25Qb3J0TWFwKGludCBwcm90b2NvbCwgdTE2ICpwb3J0cywgaW50IHBvcnRjb3Vu
dCk7CisgIHZvaWQgbWVyZ2VIb3N0U3BlY2lmaWNQb3J0cyhpbnQgcHJvdG9jb2wsIHUxNiAqcG9y
dHMsIGludCBwb3J0Y291bnQpOwogICAvKiBGcmVlIG1lbW9yeSB1c2VkIGJ5IHBvcnRfbWFwLiBJ
dCBzaG91bGQgYmUgZG9uZSBzb21ld2hlcmUgYmVmb3JlIHF1aXR0aW5nKi8KLSAgc3RhdGljIHZv
aWQgZnJlZVBvcnRNYXAoKTsKKyAgc3RhdGljIHZvaWQgZnJlZUNvbW1vblBvcnRNYXAoKTsKIAog
ICB2b2lkIHNldERlZmF1bHRQb3J0U3RhdGUodTggcHJvdG9jb2wsIGludCBzdGF0ZSk7CiAgIHZv
aWQgc2V0UG9ydFN0YXRlKHUxNiBwb3J0bm8sIHU4IHByb3RvY29sLCBpbnQgc3RhdGUpOwpAQCAt
MzQ2LDE0ICszNDcsMjAgQEAKICAgLyogTnVtYmVyIG9mIHBvcnRzIGluIGVhY2ggc3RhdGUgcGVy
IGVhY2ggcHJvdG9jb2wuICovCiAgIGludCBzdGF0ZV9jb3VudHNfcHJvdG9bUE9SVExJU1RfUFJP
VE9fTUFYXVtQT1JUX0hJR0hFU1RfU1RBVEVdOwogICBQb3J0ICoqcG9ydF9saXN0W1BPUlRMSVNU
X1BST1RPX01BWF07CisKKyAgdTE2ICpwb3J0X21hcFtQT1JUTElTVF9QUk9UT19NQVhdOworICB1
MTYgKnBvcnRfbWFwX3JldltQT1JUTElTVF9QUk9UT19NQVhdOworICBpbnQgcG9ydF9saXN0X2Nv
dW50W1BPUlRMSVNUX1BST1RPX01BWF07CisKKyAgYm9vbCBoYXNfc3BlY2lmaWNfcG9ydHNbUE9S
VExJU1RfUFJPVE9fTUFYXTsKICBwcm90ZWN0ZWQ6CiAgIC8qIE1hcHMgcG9ydF9udW1iZXIgdG8g
aW5kZXggaW4gcG9ydF9saXN0IGFycmF5LgogICAgKiBPbmx5IGZ1bmN0aW9uczogZ2V0UG9ydEVu
dHJ5LCBzZXRQb3J0RW50cnksIGluaXRpYWxpemVQb3J0TWFwIGFuZAogICAgKiBuZXh0UG9ydCBz
aG91bGQgYWNjZXNzIHRoaXMgc3RydWN0dXJlIGRpcmVjdGx5LiAqLwotICBzdGF0aWMgdTE2ICpw
b3J0X21hcFtQT1JUTElTVF9QUk9UT19NQVhdOwotICBzdGF0aWMgdTE2ICpwb3J0X21hcF9yZXZb
UE9SVExJU1RfUFJPVE9fTUFYXTsKKyAgc3RhdGljIHUxNiAqY29tbW9uX3BvcnRfbWFwW1BPUlRM
SVNUX1BST1RPX01BWF07CisgIHN0YXRpYyB1MTYgKmNvbW1vbl9wb3J0X21hcF9yZXZbUE9SVExJ
U1RfUFJPVE9fTUFYXTsKICAgLyogTnVtYmVyIG9mIGFsbG9jYXRlZCBlbGVtZW50cyBpbiBwb3J0
X2xpc3QgcGVyIGVhY2ggcHJvdG9jb2wuICovCi0gIHN0YXRpYyBpbnQgcG9ydF9saXN0X2NvdW50
W1BPUlRMSVNUX1BST1RPX01BWF07CisgIHN0YXRpYyBpbnQgY29tbW9uX3BvcnRfbGlzdF9jb3Vu
dFtQT1JUTElTVF9QUk9UT19NQVhdOwogICBQb3J0IGRlZmF1bHRfcG9ydF9zdGF0ZVtQT1JUTElT
VF9QUk9UT19NQVhdOwogfTsKIApJbmRleDogc2Nhbl9lbmdpbmUuY2MKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
c2Nhbl9lbmdpbmUuY2MJKHJldmlzaW9uIDM3NjA4KQorKysgc2Nhbl9lbmdpbmUuY2MJKHdvcmtp
bmcgY29weSkKQEAgLTMzNSw3ICszMzUsNyBAQAogICAgIHRvLnRpbWVvdXQgPSBNQVgoby5taW5S
dHRUaW1lb3V0KCksIE1JTihvLmluaXRpYWxSdHRUaW1lb3V0KCksIElOSVRJQUxfQVJQX1JUVF9U
SU1FT1VUKSkgKiAxMDAwOwogICBudW1fcHJvYmVzX2FjdGl2ZSA9IDA7CiAgIG51bXRhcmdldHMg
PSBVU0ktPm51bUluY29tcGxldGVIb3N0cygpOyAvLyBUaGV5IGFyZSBhbGwgaW5jb21wbGV0ZSBh
dCB0aGUgYmVnaW5uaW5nCi0gIG51bXByb2JlcyA9IFVTSS0+bnVtUHJvYmVzUGVySG9zdCgpOwor
ICBudW1wcm9iZXMgPSBVU0ktPm1heE51bVByb2Jlc1Blckhvc3QoKTsKIAogICBpZiAoVVNJLT5z
Y2FudHlwZSA9PSBDT05ORUNUX1NDQU4gfHwgVVNJLT5wdGVjaC5jb25uZWN0dGNwc2NhbikKICAg
ICBDU0kgPSBuZXcgQ29ubmVjdFNjYW5JbmZvOwpAQCAtODQ2LDcgKzg0Niw3IEBACiAgICAgLy8g
VGhpcyBpcyBpbmV4YWN0IChtYXh0cmllcyAtIDEpIGJlY2F1c2UgbnVtcHJvYmVzX3NlbnQgaW5j
bHVkZXMKICAgICAvLyBhdCBsZWFzdCBvbmUgdHJ5IG9mIHBvcnRzX2ZpbmlzaGVkLgogICAgIHRo
aXNob3N0cGVyY2RvbmUgPSBob3N0LT5wb3J0c19maW5pc2hlZCAqIChtYXh0cmllcyAtIDEpICsg
aG9zdC0+bnVtcHJvYmVzX3NlbnQ7Ci0gICAgdGhpc2hvc3RwZXJjZG9uZSAvPSBtYXh0cmllcyAq
IGdzdGF0cy0+bnVtcHJvYmVzOworICAgIHRoaXNob3N0cGVyY2RvbmUgLz0gbWF4dHJpZXMgKiBu
dW1Qcm9iZXNQZXJIb3N0KGhvc3QpOwogICAgIGlmICh0aGlzaG9zdHBlcmNkb25lID49IDAuOTk5
OSkKICAgICAgIHRoaXNob3N0cGVyY2RvbmUgPSAwLjk5OTk7CiAgICAgdG90YWwgKz0gdGhpc2hv
c3RwZXJjZG9uZTsKQEAgLTg2MSw2ICs4NjEsNyBAQAogICBzdGQ6OnZlY3RvcjxUYXJnZXQgKj46
Oml0ZXJhdG9yIHRhcmdldDsKIAogICBmb3IgKHRhcmdldCA9IHRhcmdldHMuYmVnaW4oKTsgdGFy
Z2V0ICE9IHRhcmdldHMuZW5kKCk7IHRhcmdldCsrKSB7CisgIAogICAgIHN3aXRjaCAoc2NhbnR5
cGUpIHsKICAgICBjYXNlIFNZTl9TQ0FOOgogICAgIGNhc2UgQUNLX1NDQU46CkBAIC0xMDM0LDE5
ICsxMDM1LDI4IEBACiAgIH0KIH0KIAorI2RlZmluZSBtYXhfbWFjcm8oeCwgeSkgKCgoeCkgPiAo
eSkpID8gKHgpIDogKHkpKQorI2RlZmluZSBjb2xsZWN0KEEsQikgZm9yIChob3N0ID0gaW5jb21w
bGV0ZUhvc3RzLmJlZ2luKCk7IGhvc3QgIT0gaW5jb21wbGV0ZUhvc3RzLmVuZCgpOyBob3N0Kysp
IEEgPSBtYXhfbWFjcm8oQSwgcG9ydHMtPkIgKyAoKmhvc3QpLT50YXJnZXQtPnRhcmdldF9wb3J0
cy5CKTsgXAorICAgICAgICAgICAgICAgICAgICAgZm9yIChob3N0ID0gY29tcGxldGVkSG9zdHMu
YmVnaW4oKTsgaG9zdCAhPSBjb21wbGV0ZWRIb3N0cy5lbmQoKTsgaG9zdCsrKSBBID0gbWF4X21h
Y3JvKEEsIHBvcnRzLT5CICsgKCpob3N0KS0+dGFyZ2V0LT50YXJnZXRfcG9ydHMuQik7CisKIC8q
IFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIHByb2JlcyB0aGF0IG1heSBiZSBzZW50IHRvIGVh
Y2ggaG9zdC4gVGhpcyBuZXZlcgogICAgY2hhbmdlcyBhZnRlciBpbml0aWFsaXphdGlvbi4gKi8K
LXVuc2lnbmVkIGludCBVbHRyYVNjYW5JbmZvOjpudW1Qcm9iZXNQZXJIb3N0KCkgewotICB1bnNp
Z25lZCBpbnQgbnVtcHJvYmVzID0gMDsKK3Vuc2lnbmVkIGludCBVbHRyYVNjYW5JbmZvOjptYXhO
dW1Qcm9iZXNQZXJIb3N0KCkgeworICBpbnQgbnVtcHJvYmVzID0gMDsKKyAgc3RkOjptdWx0aXNl
dDxIb3N0U2NhblN0YXRzICosIEhzc1ByZWRpY2F0ZT46Oml0ZXJhdG9yIGhvc3Q7CiAKICAgaWYg
KHRjcF9zY2FuKSB7CiAgICAgbnVtcHJvYmVzID0gcG9ydHMtPnRjcF9jb3VudDsKKyAgICBjb2xs
ZWN0KG51bXByb2JlcywgdGNwX2NvdW50KTsKICAgfSBlbHNlIGlmICh1ZHBfc2NhbikgewogICAg
IG51bXByb2JlcyA9IHBvcnRzLT51ZHBfY291bnQ7CisgICAgY29sbGVjdChudW1wcm9iZXMsIHVk
cF9jb3VudCk7CiAgIH0gZWxzZSBpZiAoc2N0cF9zY2FuKSB7CiAgICAgbnVtcHJvYmVzID0gcG9y
dHMtPnNjdHBfY291bnQ7CisgICAgY29sbGVjdChudW1wcm9iZXMsIHNjdHBfY291bnQpOwogICB9
IGVsc2UgaWYgKHByb3Rfc2NhbikgewogICAgIG51bXByb2JlcyA9IHBvcnRzLT5wcm90X2NvdW50
OworICAgIGNvbGxlY3QobnVtcHJvYmVzLCBwcm90X2NvdW50KTsKICAgfSBlbHNlIGlmIChwaW5n
X3NjYW5fYXJwKSB7CiAgICAgbnVtcHJvYmVzID0gMTsKICAgfSBlbHNlIGlmIChwaW5nX3NjYW5f
bmQpIHsKQEAgLTEwNzcsOSArMTA4Nyw2NCBAQAogICAgICAgbnVtcHJvYmVzICs9IHBvcnRzLT5z
eW5fcGluZ19jb3VudDsKICAgfSBlbHNlIGFzc2VydCgwKTsKIAorICBhc3NlcnQobnVtcHJvYmVz
ID49IDApOworCiAgIHJldHVybiBudW1wcm9iZXM7CiB9CiAKKy8qIFJldHVybiB0aGUgdG90YWwg
bnVtYmVyIG9mIHByb2JlcyB0aGF0IHdpbGwgYmUgc2VudCB0byBlYWNoIGhvc3QuICovCit1bnNp
Z25lZCBpbnQgVWx0cmFTY2FuSW5mbzo6bnVtUHJvYmVzUGVySG9zdChIb3N0U2NhblN0YXRzKiBo
b3N0KSB7CisgIGludCBudW1wcm9iZXM7CisKKworICBpZiAodGNwX3NjYW4pIHsKKyAgICBudW1w
cm9iZXMgPSBwb3J0cy0+dGNwX2NvdW50ICsgaG9zdC0+dGFyZ2V0LT50YXJnZXRfcG9ydHMudGNw
X2NvdW50OworICB9CisgIGVsc2UgaWYgKHVkcF9zY2FuKSB7CisgICAgbnVtcHJvYmVzID0gcG9y
dHMtPnVkcF9jb3VudCArIGhvc3QtPnRhcmdldC0+dGFyZ2V0X3BvcnRzLnVkcF9jb3VudDsKKyAg
fQorICBlbHNlIGlmIChzY3RwX3NjYW4pIHsKKyAgICBudW1wcm9iZXMgPSBwb3J0cy0+c2N0cF9j
b3VudCArIGhvc3QtPnRhcmdldC0+dGFyZ2V0X3BvcnRzLnNjdHBfY291bnQ7CisgIH0KKyAgZWxz
ZSBpZiAocHJvdF9zY2FuKSB7CisgICAgbnVtcHJvYmVzID0gcG9ydHMtPnByb3RfY291bnQgKyBo
b3N0LT50YXJnZXQtPnRhcmdldF9wb3J0cy5wcm90X2NvdW50OworICB9CisgIGVsc2UgaWYgKHBp
bmdfc2Nhbl9hcnApIHsKKyAgICBudW1wcm9iZXMgPSAxOworICB9CisgIGVsc2UgaWYgKHBpbmdf
c2Nhbl9uZCkgeworICAgIG51bXByb2JlcyA9IDE7CisgIH0KKyAgZWxzZSBpZiAocGluZ19zY2Fu
KSB7CisgICAgbnVtcHJvYmVzID0gMDsKKyAgICBpZiAocHRlY2gucmF3dGNwc2NhbikgeworICAg
ICAgaWYgKG8ucGluZ3R5cGUgJiBQSU5HVFlQRV9UQ1BfVVNFX0FDSykKKyAgICAgICAgbnVtcHJv
YmVzICs9IHBvcnRzLT5hY2tfcGluZ19jb3VudDsKKyAgICAgIGlmIChvLnBpbmd0eXBlICYgUElO
R1RZUEVfVENQX1VTRV9TWU4pCisgICAgICAgIG51bXByb2JlcyArPSBwb3J0cy0+c3luX3Bpbmdf
Y291bnQ7CisgICAgfQorICAgIGlmIChwdGVjaC5yYXd1ZHBzY2FuKQorICAgICAgbnVtcHJvYmVz
ICs9IHBvcnRzLT51ZHBfcGluZ19jb3VudDsKKyAgICBpZiAocHRlY2gucmF3c2N0cHNjYW4pCisg
ICAgICBudW1wcm9iZXMgKz0gcG9ydHMtPnNjdHBfcGluZ19jb3VudDsKKyAgICBpZiAocHRlY2gu
cmF3aWNtcHNjYW4pIHsKKyAgICAgIGlmIChvLnBpbmd0eXBlICYgUElOR1RZUEVfSUNNUF9QSU5H
KQorICAgICAgICBudW1wcm9iZXMrKzsKKyAgICAgIGlmIChvLnBpbmd0eXBlICYgUElOR1RZUEVf
SUNNUF9NQVNLKQorICAgICAgICBudW1wcm9iZXMrKzsKKyAgICAgIGlmIChvLnBpbmd0eXBlICYg
UElOR1RZUEVfSUNNUF9UUykKKyAgICAgICAgbnVtcHJvYmVzKys7CisgICAgfQorICAgIGlmIChw
dGVjaC5yYXdwcm90b3NjYW4pCisgICAgICBudW1wcm9iZXMgKz0gcG9ydHMtPnByb3RvX3Bpbmdf
Y291bnQ7CisgICAgaWYgKHB0ZWNoLmNvbm5lY3R0Y3BzY2FuKQorICAgICAgbnVtcHJvYmVzICs9
IHBvcnRzLT5zeW5fcGluZ19jb3VudDsKKyAgfQorICBlbHNlIGFzc2VydCgwKTsKKworICByZXR1
cm4gbnVtcHJvYmVzOworfQorCiAvKiBDb25zdWx0cyB3aXRoIHRoZSBncm91cCBzdGF0cywgYW5k
IHRoZSBoc3RhdHMgZm9yIGV2ZXJ5CiAgICBpbmNvbXBsZXRlIGhvc3RzIHRvIGRldGVybWluZSB3
aGV0aGVyIGFueSBwcm9iZXMgbWF5IGJlIHNlbnQuCiAgICBSZXR1cm5zIHRydWUgaWYgdGhleSBj
YW4gYmUgc2VudCBpbW1lZGlhdGVseS4gIElmIHdoZW4gaXMKQEAgLTEzNDksNyArMTQxNCw3IEBA
CiAgIGFzc2VydChwc3BlYyk7CiAKICAgaWYgKFVTSS0+dGNwX3NjYW4pIHsKLSAgICBpZiAoaHNz
LT5uZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+dGNwX2NvdW50KQorICAgIGlmIChoc3MtPm5l
eHRfcG9ydGlkeCA+PSBVU0ktPnBvcnRzLT50Y3BfY291bnQgKyBoc3MtPnRhcmdldC0+dGFyZ2V0
X3BvcnRzLnRjcF9jb3VudCkKICAgICAgIHJldHVybiAtMTsKICAgICBpZiAoVVNJLT5zY2FudHlw
ZSA9PSBDT05ORUNUX1NDQU4pCiAgICAgICBwc3BlYy0+dHlwZSA9IFBTX0NPTk5FQ1RUQ1A7CkBA
IC0xMzU3LDcgKzE0MjIsMTQgQEAKICAgICAgIHBzcGVjLT50eXBlID0gUFNfVENQOwogICAgIHBz
cGVjLT5wcm90byA9IElQUFJPVE9fVENQOwogCi0gICAgcHNwZWMtPnBkLnRjcC5kcG9ydCA9IFVT
SS0+cG9ydHMtPnRjcF9wb3J0c1toc3MtPm5leHRfcG9ydGlkeCsrXTsKKyAgICBpZiAoaHNzLT5u
ZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+dGNwX2NvdW50KQorICAgIHsKKyAgICAgIHBzcGVj
LT5wZC50Y3AuZHBvcnQgPSBoc3MtPnRhcmdldC0+dGFyZ2V0X3BvcnRzLnRjcF9wb3J0c1soaHNz
LT5uZXh0X3BvcnRpZHgrKyktKFVTSS0+cG9ydHMtPnRjcF9jb3VudCldOworICAgIH0KKyAgICBl
bHNlIHsKKyAgICAgIHBzcGVjLT5wZC50Y3AuZHBvcnQgPSBVU0ktPnBvcnRzLT50Y3BfcG9ydHNb
aHNzLT5uZXh0X3BvcnRpZHgrK107CisgICAgfQorICAgIAogICAgIGlmIChVU0ktPnNjYW50eXBl
ID09IENPTk5FQ1RfU0NBTikKICAgICAgIHBzcGVjLT5wZC50Y3AuZmxhZ3MgPSBUSF9TWU47CiAg
ICAgZWxzZSBpZiAoby5zY2FuZmxhZ3MgIT0gLTEpCkBAIC0xMzkyLDE4ICsxNDY0LDMwIEBACiAg
ICAgfQogICAgIHJldHVybiAwOwogICB9IGVsc2UgaWYgKFVTSS0+dWRwX3NjYW4pIHsKLSAgICBp
ZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+dWRwX2NvdW50KQorICAgIGlmICho
c3MtPm5leHRfcG9ydGlkeCA+PSBVU0ktPnBvcnRzLT51ZHBfY291bnQgKyBoc3MtPnRhcmdldC0+
dGFyZ2V0X3BvcnRzLnVkcF9jb3VudCkKICAgICAgIHJldHVybiAtMTsKICAgICBwc3BlYy0+dHlw
ZSA9IFBTX1VEUDsKICAgICBwc3BlYy0+cHJvdG8gPSBJUFBST1RPX1VEUDsKLSAgICBwc3BlYy0+
cGQudWRwLmRwb3J0ID0gVVNJLT5wb3J0cy0+dWRwX3BvcnRzW2hzcy0+bmV4dF9wb3J0aWR4Kytd
OworICAgIGlmIChoc3MtPm5leHRfcG9ydGlkeCA+PSBVU0ktPnBvcnRzLT51ZHBfY291bnQpCisg
ICAgeworICAgICAgcHNwZWMtPnBkLnVkcC5kcG9ydCA9IGhzcy0+dGFyZ2V0LT50YXJnZXRfcG9y
dHMudWRwX3BvcnRzWyhoc3MtPm5leHRfcG9ydGlkeCsrKSAtIChVU0ktPnBvcnRzLT51ZHBfY291
bnQpXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICBwc3BlYy0+cGQudWRwLmRwb3J0ID0gVVNJ
LT5wb3J0cy0+dWRwX3BvcnRzW2hzcy0+bmV4dF9wb3J0aWR4KytdOworICAgIH0KICAgICByZXR1
cm4gMDsKICAgfSBlbHNlIGlmIChVU0ktPnNjdHBfc2NhbikgewotICAgIGlmIChoc3MtPm5leHRf
cG9ydGlkeCA+PSBVU0ktPnBvcnRzLT5zY3RwX2NvdW50KQorICAgIGlmIChoc3MtPm5leHRfcG9y
dGlkeCA+PSBVU0ktPnBvcnRzLT5zY3RwX2NvdW50ICsgaHNzLT50YXJnZXQtPnRhcmdldF9wb3J0
cy5zY3RwX2NvdW50KQogICAgICAgcmV0dXJuIC0xOwogICAgIHBzcGVjLT50eXBlID0gUFNfU0NU
UDsKICAgICBwc3BlYy0+cHJvdG8gPSBJUFBST1RPX1NDVFA7Ci0gICAgcHNwZWMtPnBkLnNjdHAu
ZHBvcnQgPSBVU0ktPnBvcnRzLT5zY3RwX3BvcnRzW2hzcy0+bmV4dF9wb3J0aWR4KytdOworICAg
IGlmIChoc3MtPm5leHRfcG9ydGlkeCA+PSBVU0ktPnBvcnRzLT5zY3RwX2NvdW50KQorICAgIHsK
KyAgICAgIHBzcGVjLT5wZC5zY3RwLmRwb3J0ID0gaHNzLT50YXJnZXQtPnRhcmdldF9wb3J0cy5z
Y3RwX3BvcnRzWyhoc3MtPm5leHRfcG9ydGlkeCsrKSAtIChVU0ktPnBvcnRzLT5zY3RwX2NvdW50
KV07CisgICAgfQorICAgIGVsc2UgeworICAgICAgcHNwZWMtPnBkLnNjdHAuZHBvcnQgPSBVU0kt
PnBvcnRzLT5zY3RwX3BvcnRzW2hzcy0+bmV4dF9wb3J0aWR4KytdOworICAgIH0KICAgICBzd2l0
Y2ggKFVTSS0+c2NhbnR5cGUpIHsKICAgICBjYXNlIFNDVFBfSU5JVF9TQ0FOOgogICAgICAgcHNw
ZWMtPnBkLnNjdHAuY2h1bmt0eXBlID0gU0NUUF9JTklUOwpAQCAtMTQxNiw5ICsxNTAwLDE2IEBA
CiAgICAgfQogICAgIHJldHVybiAwOwogICB9IGVsc2UgaWYgKFVTSS0+cHJvdF9zY2FuKSB7Ci0g
ICAgaWYgKGhzcy0+bmV4dF9wb3J0aWR4ID49IFVTSS0+cG9ydHMtPnByb3RfY291bnQpCisgICAg
aWYgKGhzcy0+bmV4dF9wb3J0aWR4ID49IFVTSS0+cG9ydHMtPnByb3RfY291bnQgKyBoc3MtPnRh
cmdldC0+dGFyZ2V0X3BvcnRzLnByb3RfY291bnQpCiAgICAgICByZXR1cm4gLTE7CiAgICAgcHNw
ZWMtPnR5cGUgPSBQU19QUk9UTzsKKyAgICBpZiAoaHNzLT5uZXh0X3BvcnRpZHggPj0gVVNJLT5w
b3J0cy0+cHJvdF9jb3VudCkKKyAgICB7CisgICAgICBwc3BlYy0+cHJvdG8gPSBoc3MtPnRhcmdl
dC0+dGFyZ2V0X3BvcnRzLnByb3RzWyhoc3MtPm5leHRfcG9ydGlkeCsrKSAtIChVU0ktPnBvcnRz
LT5wcm90X2NvdW50KV07CisgICAgfQorICAgIGVsc2UgeworICAgICAgcHNwZWMtPnByb3RvID0g
VVNJLT5wb3J0cy0+cHJvdHNbaHNzLT5uZXh0X3BvcnRpZHgrK107CisgICAgfQogICAgIHBzcGVj
LT5wcm90byA9IFVTSS0+cG9ydHMtPnByb3RzW2hzcy0+bmV4dF9wb3J0aWR4KytdOwogICAgIHJl
dHVybiAwOwogICB9IGVsc2UgaWYgKFVTSS0+cGluZ19zY2FuX2FycCkgewpAQCAtMTUyNywyMSAr
MTYxOCwyMSBAQAogLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBvcnRzIHJlbWFpbmluZyB0byBw
cm9iZSAqLwogaW50IEhvc3RTY2FuU3RhdHM6OmZyZXNoUG9ydHNMZWZ0KCkgewogICBpZiAoVVNJ
LT50Y3Bfc2NhbikgewotICAgIGlmIChuZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+dGNwX2Nv
dW50KQorICAgIGlmIChuZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+dGNwX2NvdW50ICsgdGFy
Z2V0LT50YXJnZXRfcG9ydHMudGNwX2NvdW50KQogICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJu
IFVTSS0+cG9ydHMtPnRjcF9jb3VudCAtIG5leHRfcG9ydGlkeDsKKyAgICByZXR1cm4gVVNJLT5w
b3J0cy0+dGNwX2NvdW50ICsgdGFyZ2V0LT50YXJnZXRfcG9ydHMudGNwX2NvdW50IC0gbmV4dF9w
b3J0aWR4OwogICB9IGVsc2UgaWYgKFVTSS0+dWRwX3NjYW4pIHsKLSAgICBpZiAobmV4dF9wb3J0
aWR4ID49IFVTSS0+cG9ydHMtPnVkcF9jb3VudCkKKyAgICBpZiAobmV4dF9wb3J0aWR4ID49IFVT
SS0+cG9ydHMtPnVkcF9jb3VudCArIHRhcmdldC0+dGFyZ2V0X3BvcnRzLnVkcF9jb3VudCkKICAg
ICAgIHJldHVybiAwOwotICAgIHJldHVybiBVU0ktPnBvcnRzLT51ZHBfY291bnQgLSBuZXh0X3Bv
cnRpZHg7CisgICAgcmV0dXJuIFVTSS0+cG9ydHMtPnVkcF9jb3VudCArIHRhcmdldC0+dGFyZ2V0
X3BvcnRzLnVkcF9jb3VudCAtIG5leHRfcG9ydGlkeDsKICAgfSBlbHNlIGlmIChVU0ktPnNjdHBf
c2NhbikgewotICAgIGlmIChuZXh0X3BvcnRpZHggPj0gVVNJLT5wb3J0cy0+c2N0cF9jb3VudCkK
KyAgICBpZiAobmV4dF9wb3J0aWR4ID49IFVTSS0+cG9ydHMtPnNjdHBfY291bnQgKyB0YXJnZXQt
PnRhcmdldF9wb3J0cy5zY3RwX2NvdW50KQogICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIFVT
SS0+cG9ydHMtPnNjdHBfY291bnQgLSBuZXh0X3BvcnRpZHg7CisgICAgcmV0dXJuIFVTSS0+cG9y
dHMtPnNjdHBfY291bnQgKyB0YXJnZXQtPnRhcmdldF9wb3J0cy5zY3RwX2NvdW50IC0gbmV4dF9w
b3J0aWR4OwogICB9IGVsc2UgaWYgKFVTSS0+cHJvdF9zY2FuKSB7Ci0gICAgaWYgKG5leHRfcG9y
dGlkeCA+PSBVU0ktPnBvcnRzLT5wcm90X2NvdW50KQorICAgIGlmIChuZXh0X3BvcnRpZHggPj0g
VVNJLT5wb3J0cy0+cHJvdF9jb3VudCArIHRhcmdldC0+dGFyZ2V0X3BvcnRzLnByb3RfY291bnQp
CiAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gVVNJLT5wb3J0cy0+cHJvdF9jb3VudCAtIG5l
eHRfcG9ydGlkeDsKKyAgICByZXR1cm4gVVNJLT5wb3J0cy0+cHJvdF9jb3VudCArIHRhcmdldC0+
dGFyZ2V0X3BvcnRzLnByb3RfY291bnQgLSBuZXh0X3BvcnRpZHg7CiAgIH0gZWxzZSBpZiAoVVNJ
LT5waW5nX3NjYW5fYXJwKSB7CiAgICAgaWYgKHNlbnRfYXJwKQogICAgICAgcmV0dXJuIDA7CkBA
IC0yNzQ3LDcgKzI4MzgsNyBAQAogICAgIGlmICghcGx1cmFsKSB7CiAgICAgICAoKihUYXJnZXRz
LmJlZ2luKCkpKS0+TmFtZUlQKHRhcmdldHN0ciwgc2l6ZW9mKHRhcmdldHN0cikpOwogICAgIH0g
ZWxzZSBTbnByaW50Zih0YXJnZXRzdHIsIHNpemVvZih0YXJnZXRzdHIpLCAiJWQgaG9zdHMiLCAo
aW50KSBUYXJnZXRzLnNpemUoKSk7Ci0gICAgbG9nX3dyaXRlKExPR19TVERPVVQsICJTY2Fubmlu
ZyAlcyBbJWQgcG9ydCVzJXNdXG4iLCB0YXJnZXRzdHIsIFVTSS5nc3RhdHMtPm51bXByb2Jlcywg
KFVTSS5nc3RhdHMtPm51bXByb2JlcyAhPSAxKSA/ICJzIiA6ICIiLCBwbHVyYWwgPyAiL2hvc3Qi
IDogIiIpOworICAgIGxvZ193cml0ZShMT0dfU1RET1VULCAiU2Nhbm5pbmcgJXMgW21heCAlZCBw
b3J0JXMlc11cbiIsIHRhcmdldHN0ciwgVVNJLmdzdGF0cy0+bnVtcHJvYmVzLCAoVVNJLmdzdGF0
cy0+bnVtcHJvYmVzICE9IDEpID8gInMiIDogIiIsIHBsdXJhbCA/ICIvaG9zdCIgOiAiIik7CiAg
IH0KIAogICBpZiAoVVNJLmlzUmF3U2NhbigpKQpAQCAtMjc5Nyw4ICsyODg4LDggQEAKICAgICAg
ICAgU25wcmludGYoYWRkaXRpb25hbF9pbmZvLCBzaXplb2YoYWRkaXRpb25hbF9pbmZvKSwgIiVs
dSB0b3RhbCBob3N0cyIsCiAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBUYXJnZXRz
LnNpemUoKSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBTbnByaW50ZihhZGRpdGlvbmFsX2lu
Zm8sIHNpemVvZihhZGRpdGlvbmFsX2luZm8pLCAiJWx1IHRvdGFsIHBvcnRzIiwKLSAgICAgICAg
ICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIFVTSS5nc3RhdHMtPm51bXByb2JlcyAqIFRhcmdldHMu
c2l6ZSgpKTsKKyAgICAgICAgU25wcmludGYoYWRkaXRpb25hbF9pbmZvLCBzaXplb2YoYWRkaXRp
b25hbF9pbmZvKSwgIiVsdSB0b3RhbCBwb3J0cyBtYXgiLAorICAgICAgICAgICAgICAgICAodW5z
aWduZWQgbG9uZykgVVNJLmdzdGF0cy0+dG90YWxwcm9iZXMgKiBUYXJnZXRzLnNpemUoKSk7CiAg
ICAgICB9CiAgICAgZWxzZSBTbnByaW50ZihhZGRpdGlvbmFsX2luZm8sIHNpemVvZihhZGRpdGlv
bmFsX2luZm8pLCAiJWQgJXMgdGltZWQgb3V0IiwKICAgICAgICAgICAgICAgICAgICAgVVNJLmdz
dGF0cy0+bnVtX2hvc3RzX3RpbWVkb3V0LApJbmRleDogc2Nhbl9lbmdpbmUuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBzY2FuX2VuZ2luZS5oCShyZXZpc2lvbiAzNzYwOCkKKysrIHNjYW5fZW5naW5lLmgJKHdv
cmtpbmcgY29weSkKQEAgLTM2MCw2ICszNjAsNyBAQAogICBzdHJ1Y3QgdGltZW91dF9pbmZvIHRv
OyAvKiBHcm91cC13aWRlIHBhY2tldCBydHQvdGltZW91dCBpbmZvICovCiAgIGludCBudW10YXJn
ZXRzOyAvKiBUb3RhbCAjIG9mIHRhcmdldHMgc2Nhbm5lZCAtLSBpbmNsdWRlcyBmaW5pc2hlZCBh
bmQgaW5jb21wbGV0ZSBob3N0cyAqLwogICBpbnQgbnVtcHJvYmVzOyAvKiBOdW1iZXIgb2YgcHJv
YmVzL3BvcnRzIHNjYW5uZWQgb24gZWFjaCBob3N0ICovCisgIGludCB0b3RhbHByb2JlczsKICAg
LyogVGhlIGxhc3QgdGltZSB3YWl0Rm9yUmVzcG9uc2VzIGZpbmlzaGVkIChpbml0aWFsaXplZCB0
byBHU1MgY3JlYXRpb24gdGltZSAqLwogICBpbnQgcHJvYmVzX3NlbnQ7IC8qIE51bWJlciBvZiBw
cm9iZXMgc2VudCBpbiB0b3RhbC4gIFRoaXMgRE9FUyBpbmNsdWRlIHBpbmdzIGFuZCByZXRyYW5z
bWlzc2lvbnMgKi8KIApAQCAtNjI4LDcgKzYyOSw4IEBACiAgIC8qIE11c3QgY2FsbCBJbml0IGlm
IHlvdSBjcmVhdGUgb2JqZWN0IHdpdGggZGVmYXVsdCBjb25zdHJ1Y3RvciAqLwogICB2b2lkIElu
aXQoc3RkOjp2ZWN0b3I8VGFyZ2V0ICo+ICZUYXJnZXRzLCBzdHJ1Y3Qgc2Nhbl9saXN0cyAqcHRz
LCBzdHlwZSBzY2FudHApOwogCi0gIHVuc2lnbmVkIGludCBudW1Qcm9iZXNQZXJIb3N0KCk7Cisg
IHVuc2lnbmVkIGludCBudW1Qcm9iZXNQZXJIb3N0KEhvc3RTY2FuU3RhdHMqIGhvc3QpOworICB1
bnNpZ25lZCBpbnQgbWF4TnVtUHJvYmVzUGVySG9zdCgpOwogCiAgIC8qIENvbnN1bHRzIHdpdGgg
dGhlIGdyb3VwIHN0YXRzLCBhbmQgdGhlIGhzdGF0cyBmb3IgZXZlcnkKICAgICAgaW5jb21wbGV0
ZSBob3N0cyB0byBkZXRlcm1pbmUgd2hldGhlciBhbnkgcHJvYmVzIG1heSBiZSBzZW50LgpJbmRl
eDogc2Nhbl9saXN0cy5jYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzY2FuX2xpc3RzLmNjCShyZXZpc2lvbiAz
NzYwOCkKKysrIHNjYW5fbGlzdHMuY2MJKHdvcmtpbmcgY29weSkKQEAgLTIzOSw3ICsyMzksMTEg
QEAKICAgfQogCiAgIGlmIChyYW5nZV90eXBlICE9IDAgJiYgMCA9PSAocG9ydHMtPnRjcF9jb3Vu
dCArIHBvcnRzLT51ZHBfY291bnQgKyBwb3J0cy0+c2N0cF9jb3VudCArIHBvcnRzLT5wcm90X2Nv
dW50KSkKLSAgICBmYXRhbCgiTm8gcG9ydHMgc3BlY2lmaWVkIC0tIElmIHlvdSByZWFsbHkgZG9u
J3Qgd2FudCB0byBzY2FuIGFueSBwb3J0cyB1c2UgcGluZyBzY2FuLi4uIik7CisgIHsKKyAgICBl
cnJvcigiTm8gY29tbW9uIHBvcnRzIHNwZWNpZmllZCAtIFVubGVzcyB5b3Ugc3BlY2lmaWVkIHBv
cnRzIGZvciBzcGVjaWZpYyB0YXJnZXRzLCB5b3Ugc2hvdWxkIHVzZSBwaW5nIHNjYW4uLi4iKTsK
KyAgICBvLm5vY29tbW9ucG9ydHMgPSB0cnVlOworICB9CisgICAgCiAKICAgaWYgKHBvcnRzLT50
Y3BfY291bnQpIHsKICAgICBwb3J0cy0+dGNwX3BvcnRzID0gKHVuc2lnbmVkIHNob3J0ICopc2Fm
ZV96YWxsb2MocG9ydHMtPnRjcF9jb3VudCAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwpAQCAt
NTkzLDggKzU5Nyw0NiBAQAogICAgIGZyZWUocG9ydHMtPnByb3RvX3BpbmdfcG9ydHMpOwogfQog
CitzdHJ1Y3Qgc2Nhbl9saXN0cyBjbG9uZV9zY2FuX2xpc3RzKGNvbnN0IHN0cnVjdCBzY2FuX2xp
c3RzICpwb3J0cykKK3sKKwlzY2FuX2xpc3RzIHMgPSB7IDAgfTsKKwlpZiAocG9ydHMtPnRjcF9w
b3J0cykKKwl7CisJCXMudGNwX2NvdW50ID0gcG9ydHMtPnRjcF9jb3VudDsKKwkJc2l6ZV90IHRj
cF9zaXplID0gcG9ydHMtPnRjcF9jb3VudCAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJCXMu
dGNwX3BvcnRzID0gKHVuc2lnbmVkIHNob3J0ICopc2FmZV96YWxsb2ModGNwX3NpemUpOworCQlt
ZW1jcHkocy50Y3BfcG9ydHMsIHBvcnRzLT50Y3BfcG9ydHMsIHRjcF9zaXplKTsKKwl9CiAKKwlp
ZiAocG9ydHMtPnVkcF9wb3J0cykKKwl7CisJCXMudWRwX2NvdW50ID0gcG9ydHMtPnVkcF9jb3Vu
dDsKKwkJc2l6ZV90IHVkcF9zaXplID0gcG9ydHMtPnVkcF9jb3VudCAqIHNpemVvZih1bnNpZ25l
ZCBzaG9ydCk7CisJCXMudWRwX3BvcnRzID0gKHVuc2lnbmVkIHNob3J0ICopc2FmZV96YWxsb2Mo
dWRwX3NpemUpOworCQltZW1jcHkocy51ZHBfcG9ydHMsIHBvcnRzLT51ZHBfcG9ydHMsIHVkcF9z
aXplKTsKKwl9CiAKKwlpZiAocG9ydHMtPnNjdHBfcG9ydHMpCisJeworCQlzLnNjdHBfY291bnQg
PSBwb3J0cy0+c2N0cF9jb3VudDsKKwkJc2l6ZV90IHNjdHBfc2l6ZSA9IHBvcnRzLT5zY3RwX2Nv
dW50ICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKwkJcy5zY3RwX3BvcnRzID0gKHVuc2lnbmVk
IHNob3J0ICopc2FmZV96YWxsb2Moc2N0cF9zaXplKTsKKwkJbWVtY3B5KHMuc2N0cF9wb3J0cywg
cG9ydHMtPnNjdHBfcG9ydHMsIHNjdHBfc2l6ZSk7CisJfQorCisJaWYgKHBvcnRzLT5wcm90cykK
Kwl7CisJCXMucHJvdF9jb3VudCA9IHBvcnRzLT5wcm90X2NvdW50OworCQlzaXplX3QgcHJvdHNf
c2l6ZSA9IHBvcnRzLT5wcm90X2NvdW50ICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKwkJcy5w
cm90cyA9ICh1bnNpZ25lZCBzaG9ydCAqKXNhZmVfemFsbG9jKHByb3RzX3NpemUpOworCQltZW1j
cHkocy5wcm90cywgcG9ydHMtPnByb3RzLCBwcm90c19zaXplKTsKKwl9CisKKwlyZXR1cm4gczsK
K30KKworCisKIC8qIEp1c3QgYSByb3V0aW5lIGZvciBvYnRhaW5pbmcgYSBzdHJpbmcgZm9yIHBy
aW50aW5nIGJhc2VkIG9uIHRoZSBzY2FudHlwZSAqLwogY29uc3QgY2hhciAqc2NhbnR5cGUyc3Ry
KHN0eXBlIHNjYW50eXBlKSB7CiAKQEAgLTY4MywzICs3MjUsNDggQEAKIAogfQogCitzdGF0aWMg
dm9pZCBpbnNlcnRfcG9ydF9pbnRvX21lcmdlX2xpc3QodW5zaWduZWQgc2hvcnQgKm1saXN0LAor
ICBpbnQgKm1lcmdlZF9wb3J0X2NvdW50LAorICB1bnNpZ25lZCBzaG9ydCBwKSB7CisgIGludCBp
OworICAvLyBtYWtlIHN1cmUgdGhlIHBvcnQgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgbGlzdAorICBm
b3IgKGkgPSAwOyBpIDwgKm1lcmdlZF9wb3J0X2NvdW50OyBpKyspIHsKKyAgICBpZiAobWxpc3Rb
aV0gPT0gcCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBtbGlzdFsqbWVyZ2VkX3Bv
cnRfY291bnRdID0gcDsKKyAgKCptZXJnZWRfcG9ydF9jb3VudCkrKzsKK30KKwordW5zaWduZWQg
c2hvcnQgKm1lcmdlX3BvcnRfbGlzdHModW5zaWduZWQgc2hvcnQgKnBvcnRfbGlzdDEsIGludCBj
b3VudDEsCisgIHVuc2lnbmVkIHNob3J0ICpwb3J0X2xpc3QyLCBpbnQgY291bnQyLAorICBpbnQg
Km1lcmdlZF9wb3J0X2NvdW50KSB7CisgIGludCBpOworICB1bnNpZ25lZCBzaG9ydCAqbWVyZ2Vk
X3BvcnRfbGlzdCA9IE5VTEw7CisKKyAgKm1lcmdlZF9wb3J0X2NvdW50ID0gMDsKKworICBtZXJn
ZWRfcG9ydF9saXN0ID0KKyAgICAodW5zaWduZWQgc2hvcnQgKilzYWZlX3phbGxvYygoY291bnQx
ICsgY291bnQyKSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworCisgIGZvciAoaSA9IDA7IGkg
PCBjb3VudDE7IGkrKykgeworICAgIGluc2VydF9wb3J0X2ludG9fbWVyZ2VfbGlzdChtZXJnZWRf
cG9ydF9saXN0LAorICAgICAgbWVyZ2VkX3BvcnRfY291bnQsCisgICAgICBwb3J0X2xpc3QxW2ld
KTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgY291bnQyOyBpKyspIHsKKyAgICBpbnNlcnRfcG9y
dF9pbnRvX21lcmdlX2xpc3QobWVyZ2VkX3BvcnRfbGlzdCwKKyAgICAgIG1lcmdlZF9wb3J0X2Nv
dW50LAorICAgICAgcG9ydF9saXN0MltpXSk7CisgIH0KKworICAvLyBpZiB0aGVyZSB3ZXJlIGR1
cGxpY2F0ZSBwb3J0cyB0aGVuIHdlIGNhbiBzYXZlIHNvbWUgbWVtb3J5CisgIGlmICgqbWVyZ2Vk
X3BvcnRfY291bnQgPCAoY291bnQxICsgY291bnQyKSkgeworICAgIG1lcmdlZF9wb3J0X2xpc3Qg
PSAodW5zaWduZWQgc2hvcnQqKQorICAgICAgc2FmZV9yZWFsbG9jKG1lcmdlZF9wb3J0X2xpc3Qs
CisgICAgICAoKm1lcmdlZF9wb3J0X2NvdW50KSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwor
ICB9CisKKyAgcmV0dXJuIG1lcmdlZF9wb3J0X2xpc3Q7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQg
b2YgZmlsZQpJbmRleDogc2Nhbl9saXN0cy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHNjYW5fbGlzdHMuaAko
cmV2aXNpb24gMzc2MDgpCisrKyBzY2FuX2xpc3RzLmgJKHdvcmtpbmcgY29weSkKQEAgLTE5MCw4
ICsxOTAsMTAgQEAKICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqKmxpc3QsIGlu
dCAqY291bnQpOwogdm9pZCByZW1vdmVwdHMoY29uc3QgY2hhciAqZXhwciwgc3RydWN0IHNjYW5f
bGlzdHMgKiBwb3J0cyk7CiB2b2lkIGZyZWVfc2Nhbl9saXN0cyhzdHJ1Y3Qgc2Nhbl9saXN0cyAq
cG9ydHMpOworc3RydWN0IHNjYW5fbGlzdHMgY2xvbmVfc2Nhbl9saXN0cyhjb25zdCBzdHJ1Y3Qg
c2Nhbl9saXN0cyAqcG9ydHMpOwogCiAvKiBnZW5lcmFsIGhlbHBlciBmdW5jdGlvbnMgKi8KIGNv
bnN0IGNoYXIgKnNjYW50eXBlMnN0cihzdHlwZSBzY2FudHlwZSk7Cit1bnNpZ25lZCBzaG9ydCAq
bWVyZ2VfcG9ydF9saXN0cyh1bnNpZ25lZCBzaG9ydCAqcG9ydF9saXN0MSwgaW50IGNvdW50MSwg
dW5zaWduZWQgc2hvcnQgKnBvcnRfbGlzdDIsIGludCBjb3VudDIsIGludCAqbWVyZ2VkX3BvcnRf
Y291bnQpOwogCiAjZW5kaWYgLyogU0NBTl9MSVNUU19IICovCkluZGV4OiB0YXJnZXRzLmNjCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIHRhcmdldHMuY2MJKHJldmlzaW9uIDM3NjA4KQorKysgdGFyZ2V0cy5jYwko
d29ya2luZyBjb3B5KQpAQCAtNDQ2LDYgKzQ0NiwxMyBAQAogICAgIHQtPnVuc2Nhbm5lZF9hZGRy
cyA9IGhzLT5jdXJyZW50X2dyb3VwLmdldF91bnNjYW5uZWRfYWRkcnMoKTsKICAgfQogCisgIGNv
bnN0IHNjYW5fbGlzdHMqIHRhcmdldF9wb3J0cyA9ICZocy0+Y3VycmVudF9ncm91cC5ncm91cF9w
b3J0czsKKyAgdC0+dGFyZ2V0X3BvcnRzID0gY2xvbmVfc2Nhbl9saXN0cygmaHMtPmN1cnJlbnRf
Z3JvdXAuZ3JvdXBfcG9ydHMpOworICB0LT5wb3J0cy5tZXJnZUhvc3RTcGVjaWZpY1BvcnRzKElQ
UFJPVE9fSVAsIHRhcmdldF9wb3J0cy0+cHJvdHMsIHRhcmdldF9wb3J0cy0+cHJvdF9jb3VudCk7
CisgIHQtPnBvcnRzLm1lcmdlSG9zdFNwZWNpZmljUG9ydHMoSVBQUk9UT19UQ1AsIHRhcmdldF9w
b3J0cy0+dGNwX3BvcnRzLCB0YXJnZXRfcG9ydHMtPnRjcF9jb3VudCk7CisgIHQtPnBvcnRzLm1l
cmdlSG9zdFNwZWNpZmljUG9ydHMoSVBQUk9UT19VRFAsIHRhcmdldF9wb3J0cy0+dWRwX3BvcnRz
LCB0YXJnZXRfcG9ydHMtPnVkcF9jb3VudCk7CisgIHQtPnBvcnRzLm1lcmdlSG9zdFNwZWNpZmlj
UG9ydHMoSVBQUk9UT19TQ1RQLCB0YXJnZXRfcG9ydHMtPnNjdHBfcG9ydHMsIHRhcmdldF9wb3J0
cy0+c2N0cF9jb3VudCk7CisKICAgLyogV2UgZmlndXJlIG91dCB0aGUgc291cmNlIElQL2Rldmlj
ZSBJRkYKICAgICogdGhlIHNjYW4gdHlwZSByZXF1aXJlcyB1cyB0byAqLwogICBpZiAoby5SYXdT
Y2FuKCkpIHsK
--=_mixed 0048135AC12583D0_=
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
Sent through the dev mailing list
https://nmap.org/mailman/listinfo/dev
Archived at http://seclists.org/nmap-dev/
--=_mixed 0048135AC12583D0_=--