Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 28 Jul 2010 02:04:14 +0530
From:      "Jayachandran C." <c.jayachandran@gmail.com>
To:        freebsd-mips@freebsd.org
Subject:   Support for 64bit userspace.
Message-ID:  <AANLkTikAjRTMn0m1DemdmUXKMydmyQPxij%2BN=1d9L2=y@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
--0016e64757dcd58fd3048c646c04
Content-Type: text/plain; charset=ISO-8859-1

Here's my initial work to get 64bit user space.  With this set of
changes, I can boot to the single user shell with n64 /sbin/init and
/bin/sh.  There are still issues to fix, and the dynamic loader is
still not working, but I think this would be a good time to get some
initial feedback.

The changes mainly add a 3 level page table for both userspace and
kernel. The PTE entries are 32bit still (this will be changed to 64bit
once I get the current code more stable) and the PDE entries are 64
bit, which would give us 40bit (9+9+10+12) virtual address space.

Managing a both 32bit and 64 bit pagetables in one pmap.c was tough,
so I have moved all the 64bit pmap code to a new file pmap64.c, and
added a config option for 64bit. But otherwise the 32bit code is
almost completely untouched. But once things are stable, we can see if
some part of pmap.c and pmap64.c can be move to a common file.

The changes have been grouped into (files are also at
http://people.freebsd.org/~jchandra/mips-n64/ )

mips-n64-other.patch - header file and other minor changes
- param.h - add PDRSHIFT/MASK for mid-level, rename SEGOFSET to
SEGMASK for consistency.
- _stdint.h/profile.h - 64 bit defs I missed in the last pass
- vm_machdep.c/pm_machdep.c - add UX bit to status register where needed.

mips-n64-asm.patch - changes for assembly files
- exception.S - add second level page table lookup
- excption.S/locore.S - enable UX in status
- exception.S - the kernel stack is in XKSEG, so we need to set KX
before saving registers
- support.S -  fuword should be 64bit in n64
- swtch.S kstack in XKSEG

mips-n64-pmap.patch - move 64bit code to pmap64.c
- revert the 64bit additions to pmap.c
- create pmap64.c which will be used in 64 bit compilation, (this has
some debugging code still in there, and there are still a few issues
I'm looking at)

mips-n64-config.patch - add config option for 64bit compile, so that
we pick pmap.c in 32bit and pmap64.c in 64bit compile. I'm not sure if
there is a better way to do this,.
- options.mips, mips/conf/DEFAULTS - adds options KERNEL_32 and
KERNEL_64, make KERNEL_32 default option
- files.mips - use pmap.c or pmap64.c depending on kernel_32 or kernel_64

rmi-n64-rge.patch
- support for 64 bit in RMI gmac driver.

Let me know your comments (buildworld needs -DWITHOUT_DYNAMICROOT
-DWITHOUT_CDDL -DWITHOUT_USB -DWITHOUT_BLUETOOTH, for now)

Thanks,
JC.

--0016e64757dcd58fd3048c646c04
Content-Type: application/octet-stream; name="mips-n64-other.patch"
Content-Disposition: attachment; filename="mips-n64-other.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gc55slvs0

SW5kZXg6IHN5cy9taXBzL2luY2x1ZGUvcGFyYW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9p
bmNsdWRlL3BhcmFtLmgJKHJldmlzaW9uIDIxMDUzNCkKKysrIHN5cy9taXBzL2luY2x1ZGUvcGFy
YW0uaAkod29ya2luZyBjb3B5KQpAQCAtMTAzLDkgKzEwMywyMiBAQAogI2RlZmluZQlQQUdFX1NI
SUZUCTEyCQkvKiBMT0cyKFBBR0VfU0laRSkgKi8KICNkZWZpbmUJUEFHRV9TSVpFCSgxPDxQQUdF
X1NISUZUKSAvKiBieXRlcy9wYWdlICovCiAjZGVmaW5lCVBBR0VfTUFTSwkoUEFHRV9TSVpFLTEp
CisKICNkZWZpbmUJTlBURVBHCQkoUEFHRV9TSVpFLyhzaXplb2YgKHB0X2VudHJ5X3QpKSkKICNk
ZWZpbmUJTlBERVBHCQkoUEFHRV9TSVpFLyhzaXplb2YgKHBkX2VudHJ5X3QpKSkKIAorI2lmIGRl
ZmluZWQoX19taXBzX242NCkKKyNkZWZpbmUJU0VHU0hJRlQJMzEJCS8qIExPRzIoTkJTRUcpICov
CisjZGVmaW5lCU5CU0VHCQkoMXVsIDw8IFNFR1NISUZUKQkvKiBieXRlcy9zZWdtZW50ICovCisj
ZWxzZQorI2RlZmluZQlTRUdTSElGVAkyMgkJLyogTE9HMihOQlNFRykgKi8KKyNkZWZpbmUJTkJT
RUcJCSgxIDw8IFNFR1NISUZUKQkvKiBieXRlcy9zZWdtZW50ICovCisjZW5kaWYKKyNkZWZpbmUJ
UERSU0hJRlQJMjIgICAgICAgICAgICAgIC8qIG9ubHkgdXNlZCBpbiBuNjQgKi8KKyNkZWZpbmUJ
UERSTUFTSwkJKCgxIDw8IFBEUlNISUZUKSAtIDEpCisjZGVmaW5lCU5CUERSCQkoMSA8PCBQRFJT
SElGVCkJLyogYnl0ZXMvcGFnZWRpciAqLworI2RlZmluZQlTRUdNQVNLCQkoTkJTRUctMSkJLyog
Ynl0ZSBvZmZzZXQgaW50byBzZWdtZW50ICovCisKICNkZWZpbmUJTUFYUEFHRVNJWkVTCTEJCS8q
IG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBwYWdlIHNpemVzICovCiAKICNkZWZpbmUJQkxL
REVWX0lPU0laRQkyMDQ4CQkvKiB4eHg6IFdoeSBpcyB0aGlzIDEvMiBwYWdlPyAqLwpJbmRleDog
c3lzL21pcHMvaW5jbHVkZS9fc3RkaW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL21pcHMvaW5jbHVk
ZS9fc3RkaW50LmgJKHJldmlzaW9uIDIxMDUzNCkKKysrIHN5cy9taXBzL2luY2x1ZGUvX3N0ZGlu
dC5oCSh3b3JraW5nIGNvcHkpCkBAIC00NiwxNSArNDYsMjggQEAKICNkZWZpbmUJSU5UOF9DKGMp
CQkoYykKICNkZWZpbmUJSU5UMTZfQyhjKQkJKGMpCiAjZGVmaW5lCUlOVDMyX0MoYykJCShjKQor
I2lmIGRlZmluZWQoX19taXBzX242NCkKKyNkZWZpbmUJSU5UNjRfQyhjKQkJKGMgIyMgTCkKKyNl
bHNlCiAjZGVmaW5lCUlOVDY0X0MoYykJCShjICMjIExMKQorI2VuZGlmCiAKICNkZWZpbmUJVUlO
VDhfQyhjKQkJKGMpCiAjZGVmaW5lCVVJTlQxNl9DKGMpCQkoYykKICNkZWZpbmUJVUlOVDMyX0Mo
YykJCShjICMjIFUpCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KQorI2RlZmluZQlVSU5UNjRfQyhj
KQkJKGMgIyMgVUwpCisjZWxzZQogI2RlZmluZQlVSU5UNjRfQyhjKQkJKGMgIyMgVUxMKQorI2Vu
ZGlmCiAKKyNpZiBkZWZpbmVkKF9fbWlwc19uNjQpCisjZGVmaW5lCUlOVE1BWF9DKGMpCQkoYyAj
IyBMKQorI2RlZmluZQlVSU5UTUFYX0MoYykJCShjICMjIFVMKQorI2Vsc2UKICNkZWZpbmUJSU5U
TUFYX0MoYykJCShjICMjIExMKQogI2RlZmluZQlVSU5UTUFYX0MoYykJCShjICMjIFVMTCkKKyNl
bmRpZgogCiAjZW5kaWYgLyogIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoX19TVERD
X0NPTlNUQU5UX01BQ1JPUykgKi8KIApJbmRleDogc3lzL21pcHMvaW5jbHVkZS9wcm9maWxlLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gc3lzL21pcHMvaW5jbHVkZS9wcm9maWxlLmgJKHJldmlzaW9uIDIxMDUz
NCkKKysrIHN5cy9taXBzL2luY2x1ZGUvcHJvZmlsZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMTUs
NyArMTE1LDExIEBACiAKICNkZWZpbmUJRlVOQ1RJT05fQUxJR05NRU5UCTQKIAorI2lmZGVmIF9f
bWlwc19uNjQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZwl1aW50ZnB0cl90OworI2Vsc2UKIHR5cGVk
ZWYgdW5zaWduZWQgaW50CXVpbnRmcHRyX3Q7CisjZW5kaWYKIAogI2VuZGlmIC8qIF9LRVJORUwg
Ki8KIApAQCAtMTIzLDcgKzEyNywxMSBAQAogICogQW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSB0
aGF0IGNhbiBob2xkIG5vbi1uZWdhdGl2ZSBkaWZmZXJlbmNlIGJldHdlZW4KICAqIGZ1bmN0aW9u
IHBvaW50ZXJzLgogICovCisjaWZkZWYgX19taXBzX242NAordHlwZWRlZiB1X2xvbmcJZnB0cmRp
ZmZfdDsKKyNlbHNlCiB0eXBlZGVmIHVfaW50CWZwdHJkaWZmX3Q7CisjZW5kaWYKIAogI2lmZGVm
IF9LRVJORUwKIApJbmRleDogc3lzL21pcHMvaW5jbHVkZS9ydW5xLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
c3lzL21pcHMvaW5jbHVkZS9ydW5xLmgJKHJldmlzaW9uIDIxMDUzNCkKKysrIHN5cy9taXBzL2lu
Y2x1ZGUvcnVucS5oCSh3b3JraW5nIGNvcHkpCkBAIC00Miw3ICs0MiwxMSBAQAogI2RlZmluZQlS
UUJfQklUKHByaSkJKDF1bCA8PCAoKHByaSkgJiAoUlFCX0JQVyAtIDEpKSkKICNkZWZpbmUJUlFC
X1dPUkQocHJpKQkoKHByaSkgPj4gUlFCX0wyQlBXKQogCisjaWYgZGVmaW5lZChfX21pcHNfbjY0
KQorI2RlZmluZQlSUUJfRkZTKHdvcmQpCShmZnNsKHdvcmQpIC0gMSkKKyNlbHNlCiAjZGVmaW5l
CVJRQl9GRlMod29yZCkJKGZmcyh3b3JkKSAtIDEpCisjZW5kaWYKIAogLyoKICAqIFR5cGUgb2Yg
cnVuIHF1ZXVlIHN0YXR1cyB3b3JkLgpJbmRleDogc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gc3lzL21pcHMvaW5jbHVkZS9wbWFwLmgJKHJldmlzaW9uIDIxMDUzNCkKKysr
IHN5cy9taXBzL2luY2x1ZGUvcG1hcC5oCSh3b3JraW5nIGNvcHkpCkBAIC00OSw3ICs0OSw4IEBA
CiAjaW5jbHVkZSA8bWFjaGluZS92bXBhcmFtLmg+CiAjaW5jbHVkZSA8bWFjaGluZS9wdGUuaD4K
IAotI2RlZmluZQlOS1BUCQkxMjAJLyogYWN0dWFsIG51bWJlciBvZiBrZXJuZWwgcGFnZSB0YWJs
ZXMgKi8KKyNkZWZpbmUJTktQVAkJMTIwCQkvKiBhY3R1YWwgbnVtYmVyIG9mIGtlcm5lbCBwYWdl
IHRhYmxlcyAqLworI2RlZmluZQlOVVBERQkJKE5QREVQRyAqIE5QREVQRykgLyogIyBvZiB1c2Vy
c3BhY2UgcGFnZSB0YWJsZSBwYWdlcyAqLwogCiAjaWZuZGVmIExPQ09SRQogCkluZGV4OiBzeXMv
bWlwcy9pbmNsdWRlL3ZtcGFyYW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9pbmNsdWRlL3Zt
cGFyYW0uaAkocmV2aXNpb24gMjEwNTM0KQorKysgc3lzL21pcHMvaW5jbHVkZS92bXBhcmFtLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTUxLDEyICs1MSw2IEBACiAgKiBpcyB0aGUgdG9wIChlbmQpIG9m
IHRoZSB1c2VyIHN0YWNrLgogICovCiAjZGVmaW5lCVVTUlRFWFQJCSgxKlBBR0VfU0laRSkKLS8q
Ci0gKiBVU1JTVEFDSyBuZWVkcyB0byBzdGFydCBhIGxpdHRsZSBiZWxvdyAweDgwMDAwMDAgYmVj
YXVzZSB0aGUgUjgwMDAKLSAqIGFuZCBzb21lIFFFRCBDUFVzIHBlcmZvcm0gc29tZSB2aXJ0dWFs
IGFkZHJlc3MgY2hlY2tzIGJlZm9yZSB0aGUKLSAqIG9mZnNldCBpcyBjYWxjdWxhdGVkLgotICov
Ci0jZGVmaW5lCVVTUlNUQUNLCTB4N2ZmZmYwMDAJLyogU3RhcnQgb2YgdXNlciBzdGFjayAqLwog
CiAvKgogICogVmlydHVhbCBtZW1vcnkgcmVsYXRlZCBjb25zdGFudHMsIGFsbCBpbiBieXRlcwpA
QCAtMTAzLDE5ICs5NywyMiBAQAogI2RlZmluZQlWTV9NQVhfTU1BUF9BRERSCVZNX01BWFVTRVJf
QUREUkVTUwogCiAjaWYgZGVmaW5lZChfX21pcHNfbjY0KQotI2RlZmluZQlWTV9NQVhVU0VSX0FE
RFJFU1MJKFZNX01JTlVTRVJfQUREUkVTUyArIChOUERFUEcgKiBOUFRFUEcgKiBQQUdFX1NJWkUp
KQorI2RlZmluZQlWTV9NQVhVU0VSX0FERFJFU1MJKFZNX01JTlVTRVJfQUREUkVTUyArIChOUERF
UEcgKiBOUERFUEcgKiBOUFRFUEcgKiBQQUdFX1NJWkUpKQogI2RlZmluZQlWTV9NSU5fS0VSTkVM
X0FERFJFU1MJKCh2bV9vZmZzZXRfdCkweGMwMDAwMDAwMDAwMDAwMDApCi0jZGVmaW5lCVZNX01B
WF9LRVJORUxfQUREUkVTUwkoVk1fTUlOX0tFUk5FTF9BRERSRVNTICsgKE5QREVQRyAqIE5QVEVQ
RyAqIFBBR0VfU0laRSkpCisjZGVmaW5lCVZNX01BWF9LRVJORUxfQUREUkVTUwkoVk1fTUlOX0tF
Uk5FTF9BRERSRVNTICsgKE5QREVQRyAqIE5QREVQRyAqIE5QVEVQRyAqIFBBR0VfU0laRSkpCiAj
ZWxzZQogI2RlZmluZQlWTV9NQVhVU0VSX0FERFJFU1MJKCh2bV9vZmZzZXRfdCkweDgwMDAwMDAw
KQogI2RlZmluZQlWTV9NSU5fS0VSTkVMX0FERFJFU1MJKCh2bV9vZmZzZXRfdCkweEMwMDAwMDAw
KQogI2RlZmluZQlWTV9NQVhfS0VSTkVMX0FERFJFU1MJKCh2bV9vZmZzZXRfdCkweEZGRkZDMDAw
KQogI2VuZGlmCi0jaWYgMAotI2RlZmluZQlLRVJOQkFTRQkJKFZNX01JTl9LRVJORUxfQUREUkVT
UykKLSNlbHNlCisKICNkZWZpbmUJS0VSTkJBU0UJCSgodm1fb2Zmc2V0X3QpKGludHB0cl90KShp
bnQzMl90KTB4ODAwMDAwMDApCi0jZW5kaWYKKy8qCisgKiBVU1JTVEFDSyBuZWVkcyB0byBzdGFy
dCBhIGxpdHRsZSBiZWxvdyAweDgwMDAwMDAgYmVjYXVzZSB0aGUgUjgwMDAKKyAqIGFuZCBzb21l
IFFFRCBDUFVzIHBlcmZvcm0gc29tZSB2aXJ0dWFsIGFkZHJlc3MgY2hlY2tzIGJlZm9yZSB0aGUK
KyAqIG9mZnNldCBpcyBjYWxjdWxhdGVkLgorICovCisjZGVmaW5lCVVTUlNUQUNLCQkoVk1fTUFY
VVNFUl9BRERSRVNTIC0gUEFHRV9TSVpFKSAvKiBTdGFydCBvZiB1c2VyIHN0YWNrICovCiAKIC8q
CiAgKiBEaXNhYmxlIHN1cGVycGFnZSByZXNlcnZhdGlvbnMuIChub3Qgc3VyZSBpZiB0aGlzIGlz
IHJpZ2h0CkBAIC0xOTgsOCArMTk1LDQgQEAKICAqLwogI2RlZmluZQlWTV9ORlJFRU9SREVSCQk5
CiAKLSNkZWZpbmUgU0VHU0hJRlQJMjIJCS8qIExPRzIoTkJTRUcpICovCi0jZGVmaW5lIE5CU0VH
CQkoMSA8PCBTRUdTSElGVCkJLyogYnl0ZXMvc2VnbWVudCAqLwotI2RlZmluZSBTRUdPRlNFVAko
TkJTRUctMSkJLyogYnl0ZSBvZmZzZXQgaW50byBzZWdtZW50ICovCi0KICNlbmRpZiAvKiAhX01B
Q0hJTkVfVk1QQVJBTV9IXyAqLwpJbmRleDogc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gc3lzL21pcHMvbWlwcy92bV9tYWNoZGVwLmMJKHJldmlzaW9uIDIxMDUzNCkK
KysrIHN5cy9taXBzL21pcHMvdm1fbWFjaGRlcC5jCSh3b3JraW5nIGNvcHkpCkBAIC0xNDgsOCAr
MTQ4LDggQEAKIAlwY2IyLT5wY2JfY29udGV4dFtQQ0JfUkVHX1MwXSA9IChyZWdpc3Rlcl90KShp
bnRwdHJfdClmb3JrX3JldHVybjsKIAlwY2IyLT5wY2JfY29udGV4dFtQQ0JfUkVHX1MxXSA9IChy
ZWdpc3Rlcl90KShpbnRwdHJfdCl0ZDI7CiAJcGNiMi0+cGNiX2NvbnRleHRbUENCX1JFR19TMl0g
PSAocmVnaXN0ZXJfdCkoaW50cHRyX3QpdGQyLT50ZF9mcmFtZTsKLQlwY2IyLT5wY2JfY29udGV4
dFtQQ0JfUkVHX1NSXSA9IChNSVBTX1NSX0tYIHwgTUlQU19TUl9JTlRfTUFTSykgJgotCSAgICBt
aXBzX3JkX3N0YXR1cygpOworCXBjYjItPnBjYl9jb250ZXh0W1BDQl9SRUdfU1JdID0gbWlwc19y
ZF9zdGF0dXMoKSAmCisJICAgIChNSVBTX1NSX0tYIHwgTUlQU19TUl9VWCB8IE1JUFNfU1JfSU5U
X01BU0spOwogCS8qCiAJICogRlJFRUJTRF9ERVZFTE9QRVJTX0ZJWE1FOgogCSAqIFNldHVwIGFu
eSBvdGhlciBDUFUtU3BlY2lmaWMgcmVnaXN0ZXJzIChOb3QgTUlQUyBTdGFuZGFyZCkKQEAgLTM1
MSw4ICszNTEsOCBAQAogCXBjYjItPnBjYl9jb250ZXh0W1BDQl9SRUdfUzFdID0gKHJlZ2lzdGVy
X3QpKGludHB0cl90KXRkOwogCXBjYjItPnBjYl9jb250ZXh0W1BDQl9SRUdfUzJdID0gKHJlZ2lz
dGVyX3QpKGludHB0cl90KXRkLT50ZF9mcmFtZTsKIAkvKiBEb250IHNldCBJRSBiaXQgaW4gU1Iu
IHNjaGVkIGxvY2sgcmVsZWFzZSB3aWxsIHRha2UgY2FyZSBvZiBpdCAqLwotCXBjYjItPnBjYl9j
b250ZXh0W1BDQl9SRUdfU1JdID0gKE1JUFNfU1JfS1ggfCBNSVBTX1NSX0lOVF9NQVNLKSAmCi0J
ICAgIG1pcHNfcmRfc3RhdHVzKCk7CisJcGNiMi0+cGNiX2NvbnRleHRbUENCX1JFR19TUl0gPSBt
aXBzX3JkX3N0YXR1cygpICYKKwkgICAgKE1JUFNfU1JfS1ggfCBNSVBTX1NSX1VYIHwgTUlQU19T
Ul9JTlRfTUFTSyk7CiAKICNpZmRlZiBDUFVfQ05NSVBTCiAJcGNiMi0+cGNiX2NvbnRleHRbUENC
X1JFR19TUl0gfD0gTUlQU19TUl9DT1BfMl9CSVQgfCBNSVBTX1NSX0NPUF8wX0JJVCB8CkluZGV4
OiBzeXMvbWlwcy9taXBzL3BtX21hY2hkZXAuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9taXBz
L3BtX21hY2hkZXAuYwkocmV2aXNpb24gMjEwNTM0KQorKysgc3lzL21pcHMvbWlwcy9wbV9tYWNo
ZGVwLmMJKHdvcmtpbmcgY29weSkKQEAgLTQ4Niw4ICs0ODYsMTAgQEAKIAl0ZC0+dGRfZnJhbWUt
PnQ5ID0gaW1ncC0+ZW50cnlfYWRkciAmIH4zOyAvKiBhYmljYWxsIHJlcSAqLwogCXRkLT50ZF9m
cmFtZS0+c3IgPSBNSVBTX1NSX0tTVV9VU0VSIHwgTUlQU19TUl9FWEwgfCBNSVBTX1NSX0lOVF9J
RSB8CiAJICAgIChtaXBzX3JkX3N0YXR1cygpICYgTUlQU19TUl9JTlRfTUFTSyk7Ci0jaWYgZGVm
aW5lZChfX21pcHNfbjMyKSB8fCBkZWZpbmVkKF9fbWlwc19uNjQpCisjaWYgZGVmaW5lZChfX21p
cHNfbjMyKSAKIAl0ZC0+dGRfZnJhbWUtPnNyIHw9IE1JUFNfU1JfUFg7CisjZWxpZiAgZGVmaW5l
ZChfX21pcHNfbjY0KQorCXRkLT50ZF9mcmFtZS0+c3IgfD0gTUlQU19TUl9QWCB8IE1JUFNfU1Jf
VVg7CiAjZW5kaWYKICNpZmRlZiBDUFVfQ05NSVBTCiAJdGQtPnRkX2ZyYW1lLT5zciB8PSBNSVBT
X1NSX0NPUF8yX0JJVCB8IE1JUFNfU1JfUFggfCBNSVBTX1NSX1VYIHwK
--0016e64757dcd58fd3048c646c04
Content-Type: application/octet-stream; name="mips-n64-asm.patch"
Content-Disposition: attachment; filename="mips-n64-asm.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gc572v7t1

SW5kZXg6IHN5cy9taXBzL21pcHMvZXhjZXB0aW9uLlMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL21pcHMv
bWlwcy9leGNlcHRpb24uUwkocmV2aXNpb24gMjEwNTM0KQorKysgc3lzL21pcHMvbWlwcy9leGNl
cHRpb24uUwkod29ya2luZyBjb3B5KQpAQCAtMTM3LDcgKzEzNywxNSBAQAogCVBUUl9MCQlrMSwg
MChrMSkJCQkjMDg6IGsxPXNlZyBlbnRyeQogCU1GQzAJCWswLCBNSVBTX0NPUF8wX0JBRF9WQURE
UgkjMDk6IGswPWJhZCBhZGRyZXNzIChhZ2FpbikKIAliZXEJCWsxLCB6ZXJvLCAyZgkJCSMwYTog
PT0wIC0tIG5vIHBhZ2UgdGFibGUKLQlzcmwJCWswLCBQQUdFX1NISUZUIC0gMgkJIzBiOiBrMD1W
UE4gKGFrYSB2YT4+MTApCisjaWZkZWYgX19taXBzX242NAorCVBUUl9TUkwJCWswLCBQRFJTSElG
VCAtIFBUUlNISUZUCQkjIGswPVZQTgorCWFuZGkJCWswLCBrMCwgUFRSTUFTSwkJCSMgazA9cGRl
IG9mZnNldAorCVBUUl9BRERVCWsxLCBrMCwgazEJCQkjIGsxPXBkZSBlbnRyeSBhZGRyZXNzCisJ
UFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9cGRlIGVudHJ5CisJTUZDMAkJazAsIE1JUFNfQ09QXzBf
QkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQorCWJlcQkJazEsIHplcm8sIDJmCQkJ
IyA9PTAgLS0gbm8gcGFnZSB0YWJsZQorI2VuZGlmCisJUFRSX1NSTAkJazAsIFBBR0VfU0hJRlQg
LSAyCQkjMGI6IGswPVZQTiAoYWthIHZhPj4xMCkKIAlhbmRpCQlrMCwgazAsIDB4ZmY4CQkJIzBj
OiBrMD1wYWdlIHRhYiBvZmZzZXQKIAlQVFJfQUREVQlrMSwgazEsIGswCQkJIzBkOiBrMT1wdGUg
YWRkcmVzcwogCWx3CQlrMCwgMChrMSkJCQkjMGU6IGswPWxvMCBwdGUKQEAgLTIzOCw3ICsyNDYs
NyBAQAogI2VsaWYgZGVmaW5lZChUQVJHRVRfWExSX1hMUykKICNkZWZpbmUgQ0xFQVJfU1RBVFVT
IFwKIAltZmMwICAgIGEwLCBNSVBTX0NPUF8wX1NUQVRVUyAgIDtcCi0JbGkgICAgICBhMiwgKE1J
UFNfU1JfS1ggfCBNSVBTX1NSX0NPUF8yX0JJVCkgOyBcCisJbGkgICAgICBhMiwgKE1JUFNfU1Jf
S1ggfCBNSVBTX1NSX1VYIHwgTUlQU19TUl9DT1BfMl9CSVQpIDsgXAogCW9yICAgICAgYTAsIGEw
LCBhMgkgICAgICAgIDsgXAogCWxpICAgICAgYTIsIH4oTUlQU19TUl9JTlRfSUUgfCBNSVBTX1NS
X0VYTCB8IFNSX0tTVV9VU0VSKSAgIDsgXAogCWFuZCAgICAgYTAsIGEwLCBhMiAgICAgICAgICAg
ICAgOyBcCkBAIC00MjYsNiArNDM0LDEyIEBACiAvKgogICogU2F2ZSBhbGwgb2YgdGhlIHJlZ2lz
dGVycyBleGNlcHQgZm9yIHRoZSBrZXJuZWwgdGVtcG9yYXJpZXMgaW4gdS51X3BjYi4KICAqLwor
CW1mYzAJazAsIE1JUFNfQ09QXzBfU1RBVFVTCisJSEFaQVJEX0RFTEFZCisjaWZkZWYgX19taXBz
X242NAorCW9yaQlrMSwgazAsIE1JUFNfU1JfS1gKKwltdGMwCWsxLCBNSVBTX0NPUF8wX1NUQVRV
UworI2VuZGlmCiAJR0VUX0NQVV9QQ1BVKGsxKQogCVBUUl9MCWsxLCBQQ19DVVJQQ0IoazEpCiAJ
U0FWRV9VX1BDQl9SRUcoQVQsIEFTVCwgazEpCkBAIC00NDMsNyArNDU3LDcgQEAKIAlTQVZFX1Vf
UENCX1JFRyh0MiwgVDIsIGsxKQogCVNBVkVfVV9QQ0JfUkVHKHQzLCBUMywgazEpCiAJU0FWRV9V
X1BDQl9SRUcodGEwLCBUQTAsIGsxKQotCW1mYzAJYTAsIE1JUFNfQ09QXzBfU1RBVFVTCQkjIEZp
cnN0IGFyZyBpcyB0aGUgc3RhdHVzIHJlZy4KKwltb3ZlCWEwLCBrMAkJCQkjIEZpcnN0IGFyZyBp
cyB0aGUgc3RhdHVzIHJlZy4KIAlTQVZFX1VfUENCX1JFRyh0YTEsIFRBMSwgazEpCiAJU0FWRV9V
X1BDQl9SRUcodGEyLCBUQTIsIGsxKQogCVNBVkVfVV9QQ0JfUkVHKHRhMywgVEEzLCBrMSkKQEAg
LTQ3OCw3ICs0OTIsNyBAQAogI2lmIGRlZmluZWQoQ1BVX0NOTUlQUykKIAlvciAgICAgIHQwLCB0
MCwgKE1JUFNfU1JfS1ggfCBNSVBTX1NSX1NYIHwgTUlQU19TUl9VWCB8IE1JUFNfU1JfUFgpCiAj
ZWxpZiBkZWZpbmVkKFRBUkdFVF9YTFJfWExTKQkKLQlvciAgICAgIHQwLCB0MCwgKE1JUFNfU1Jf
S1ggfCBNSVBTX1NSX0NPUF8yX0JJVCkKKwlvciAgICAgIHQwLCB0MCwgKE1JUFNfU1JfS1ggfCBN
SVBTX1NSX1VYIHwgTUlQU19TUl9DT1BfMl9CSVQpCiAjZW5kaWYJCiAJbXRjMAl0MCwgTUlQU19D
T1BfMF9TVEFUVVMKIAlQVFJfQUREVSBhMCwgazEsIFVfUENCX1JFR1MKQEAgLTY0Miw2ICs2NTYs
MTIgQEAKICAqIFNhdmUgdGhlIHJlbGV2YW50IHVzZXIgcmVnaXN0ZXJzIGludG8gdGhlIHUudV9w
Y2Igc3RydWN0LgogICogV2UgZG9uJ3QgbmVlZCB0byBzYXZlIHMwIC0gczggYmVjYXVzZSB0aGUg
Y29tcGlsZXIgZG9lcyBpdCBmb3IgdXMuCiAgKi8KKwltZmMwCWswLCBNSVBTX0NPUF8wX1NUQVRV
UworCUhBWkFSRF9ERUxBWQorI2lmZGVmIF9fbWlwc19uNjQKKwlvcmkJazEsIGswLCBNSVBTX1NS
X0tYCisJbXRjMAlrMSwgTUlQU19DT1BfMF9TVEFUVVMKKyNlbmRpZgogCUdFVF9DUFVfUENQVShr
MSkKIAlQVFJfTAlrMSwgUENfQ1VSUENCKGsxKQogCVNBVkVfVV9QQ0JfUkVHKEFULCBBU1QsIGsx
KQpAQCAtNjgwLDcgKzcwMCw3IEBACiAKIAltZmxvCXYwCQkJIyBnZXQgbG8vaGkgbGF0ZSB0byBh
dm9pZCBzdGFsbAogCW1maGkJdjEKLQltZmMwCWEwLCBNSVBTX0NPUF8wX1NUQVRVUworCW1vdmUJ
YTAsIGswCiAJbWZjMAlhMSwgTUlQU19DT1BfMF9DQVVTRQogCU1GQzAJYTMsIE1JUFNfQ09QXzBf
RVhDX1BDCiAJU0FWRV9VX1BDQl9SRUcodjAsIE1VTExPLCBrMSkKQEAgLTY5Niw3ICs3MTYsNyBA
QAogI2lmZGVmIENQVV9DTk1JUFMKIAlvciAgICAgIHQwLCB0MCwgKE1JUFNfU1JfS1ggfCBNSVBT
X1NSX1NYIHwgTUlQU19TUl9VWCB8IE1JUFNfU1JfUFgpCiAjZWxpZiBkZWZpbmVkKFRBUkdFVF9Y
TFJfWExTKQkKLQlvciAgICAgIHQwLCB0MCwgKE1JUFNfU1JfS1ggfCBNSVBTX1NSX0NPUF8yX0JJ
VCkKKwlvciAgICAgIHQwLCB0MCwgKE1JUFNfU1JfS1ggfCBNSVBTX1NSX1VYIHwgTUlQU19TUl9D
T1BfMl9CSVQpCiAjZW5kaWYJCiAJbXRjMAl0MCwgTUlQU19DT1BfMF9TVEFUVVMKIAlJVExCTk9Q
RklYCkBAIC04MjQsNiArODQ0LDE4IEBACiAJYmVxegkJazEsIDNmCiAJbm9wCiAKKyNpZmRlZiBf
X21pcHNfbjY0CisJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCisJUFRSX1NSTAkJazAs
IFBEUlNISUZUIC0gUFRSU0hJRlQJCSMgazA9cGRlIG9mZnNldCAoYWxtb3N0KQorCWJlcQkJazEs
IHplcm8sIE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5vIHBkZSB0YWIKKwlhbmRpCQlr
MCwgazAsIFBUUk1BU0sJCQkjIGswPXBkZSBvZmZzZXQKKwlQVFJfQUREVQlrMSwgazAsIGsxCQkJ
IyBrMT1wZGUgZW50cnkgYWRkcmVzcworCVBUUl9MCQlrMSwgMChrMSkJCQkjIGsxPXBkZSBlbnRy
eQorCisJLyogVmFsaWRhdGUgcGRlIHRhYmxlIHBvaW50ZXIuICAqLworCWJlcXoJCWsxLCAzZgor
CW5vcAorI2VuZGlmCiAJTUZDMAkJazAsIE1JUFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFk
ZHJlc3MgKGFnYWluKQogCVBUUl9TUkwJCWswLCBQQUdFX1NISUZUIC0gMgkJIyBrMD1WUE4KIAlh
bmRpCQlrMCwgazAsIDB4ZmZjCQkJIyBrMD1wYWdlIHRhYiBvZmZzZXQKQEAgLTk4NCw2ICsxMDE2
LDE0IEBACiAJUFRSX0wJCWsxLCAwKGsxKQkJCSMgazE9c2VnIGVudHJ5CiAJTUZDMAkJazAsIE1J
UFNfQ09QXzBfQkFEX1ZBRERSCSMgazA9YmFkIGFkZHJlc3MgKGFnYWluKQogCWJlcQkJazEsIHpl
cm8sIE1pcHNLZXJuR2VuRXhjZXB0aW9uCSMgPT0wIC0tIG5vIHBhZ2UgdGFibGUKKyNpZmRlZiBf
X21pcHNfbjY0CisJUFRSX1NSTAkJazAsIFBEUlNISUZUIC0gUFRSU0hJRlQJCSMgazA9VlBOCisJ
YW5kaQkJazAsIGswLCBQVFJNQVNLCQkJIyBrMD1wZGUgb2Zmc2V0CisJUFRSX0FERFUJazEsIGsw
LCBrMQkJCSMgazE9cGRlIGVudHJ5IGFkZHJlc3MKKwlQVFJfTAkJazEsIDAoazEpCQkJIyBrMT1w
ZGUgZW50cnkKKwlNRkMwCQlrMCwgTUlQU19DT1BfMF9CQURfVkFERFIJIyBrMD1iYWQgYWRkcmVz
cyAoYWdhaW4pCisgIAliZXEJCWsxLCB6ZXJvLCBNaXBzS2VybkdlbkV4Y2VwdGlvbgkjID09MCAt
LSBubyBwYWdlIHRhYmxlCisjZW5kaWYKIAlQVFJfU1JMCQlrMCwgUEFHRV9TSElGVCAtIDIJCSMg
azA9VlBOCiAJYW5kaQkJazAsIGswLCAweGZmOAkJCSMgazA9cGFnZSB0YWIgb2Zmc2V0CiAJUFRS
X0FERFUJazEsIGsxLCBrMAkJCSMgazE9cHRlIGFkZHJlc3MKSW5kZXg6IHN5cy9taXBzL21pcHMv
Z2VuYXNzeW0uYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9taXBzL2dlbmFzc3ltLmMJKHJldmlz
aW9uIDIxMDUzNCkKKysrIHN5cy9taXBzL21pcHMvZ2VuYXNzeW0uYwkod29ya2luZyBjb3B5KQpA
QCAtOTQsNiArOTQsNyBAQAogQVNTWU0oUEFHRV9TSVpFLCBQQUdFX1NJWkUpOwogQVNTWU0oUEFH
RV9NQVNLLCBQQUdFX01BU0spOwogQVNTWU0oU0VHU0hJRlQsIFNFR1NISUZUKTsKK0FTU1lNKFBE
UlNISUZULCBQRFJTSElGVCk7CiBBU1NZTShOUFRFUEcsIE5QVEVQRyk7CiBBU1NZTShUREZfTkVF
RFJFU0NIRUQsIFRERl9ORUVEUkVTQ0hFRCk7CiBBU1NZTShUREZfQVNUUEVORElORywgVERGX0FT
VFBFTkRJTkcpOwpAQCAtMTAzLDMgKzEwNCw0IEBACiBBU1NZTShNSVBTX0tTRUcwX1NUQVJULCBN
SVBTX0tTRUcwX1NUQVJUKTsKIEFTU1lNKE1JUFNfS1NFRzFfU1RBUlQsIE1JUFNfS1NFRzFfU1RB
UlQpOwogQVNTWU0oTUlQU19LU0VHMl9TVEFSVCwgTUlQU19LU0VHMl9TVEFSVCk7CitBU1NZTShN
SVBTX1hLU0VHX1NUQVJULCBNSVBTX1hLU0VHX1NUQVJUKTsKSW5kZXg6IHN5cy9taXBzL21pcHMv
bG9jb3JlLlMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL21pcHMvbWlwcy9sb2NvcmUuUwkocmV2aXNpb24g
MjEwNTM0KQorKysgc3lzL21pcHMvbWlwcy9sb2NvcmUuUwkod29ya2luZyBjb3B5KQpAQCAtMTAx
LDcgKzEwMSw3IEBACiAgICAgICAgIGxpCXQwLCB+KE1JUFNfU1JfREUgfCBNSVBTX1NSX1NPRlRf
UkVTRVQgfCBNSVBTX1NSX0VSTCB8IE1JUFNfU1JfRVhMIHwgTUlQU19TUl9JTlRfSUUpCiAjZWxp
ZiBkZWZpbmVkIChUQVJHRVRfWExSX1hMUykKIAkvKiBTZXQgdGhlc2UgYml0cyAqLwotICAgICAg
ICBsaQl0MSwgKE1JUFNfU1JfQ09QXzJfQklUIHwgTUlQU19TUl9DT1BfMF9CSVQgfCBNSVBTX1NS
X0tYKQorICAgICAgICBsaQl0MSwgKE1JUFNfU1JfQ09QXzJfQklUIHwgTUlQU19TUl9DT1BfMF9C
SVQgfCBNSVBTX1NSX0tYIHwgTUlQU19TUl9VWCApCiAKIAkvKiBSZXNldCB0aGVzZSBiaXRzICov
CiAgICAgICAgIGxpCXQwLCB+KE1JUFNfU1JfQkVWIHwgTUlQU19TUl9TT0ZUX1JFU0VUIHwgTUlQ
U19TUl9JTlRfSUUpCkluZGV4OiBzeXMvbWlwcy9taXBzL3N3dGNoLlMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
c3lzL21pcHMvbWlwcy9zd3RjaC5TCShyZXZpc2lvbiAyMTA1MzQpCisrKyBzeXMvbWlwcy9taXBz
L3N3dGNoLlMJKHdvcmtpbmcgY29weSkKQEAgLTI3OCwxMCArMjc4LDEyIEBACiAJUFRSX0wJYTIs
IFREX1BDQihhMSkKIAlQVFJfUwlhMiwgUENfQ1VSUENCKGEzKQogCVBUUl9MCXYwLCBURF9LU1RB
Q0soYTEpCi0jaWYgIWRlZmluZWQoX19taXBzX242NCkKKyNpZiBkZWZpbmVkKF9fbWlwc19uNjQp
CisJUFRSX0xJCXMwLCBNSVBTX1hLU0VHX1NUQVJUCisjZWxzZQogCVBUUl9MSQlzMCwgTUlQU19L
U0VHMl9TVEFSVAkJIyBJZiBVYXJlYSBhZGRyIGlzIGJlbG93IGtzZWcyLAorI2VuZGlmCiAJYmx0
dQl2MCwgczAsIHN3MgkJCSMgbm8gbmVlZCB0byBpbnNlcnQgaW4gVExCLgotI2VuZGlmCiAJbHcJ
YTEsIFREX1VQVEUgKyAwKHM3KQkJIyBhMSA9IHUuIHB0ZSAjMAogCWx3CWEyLCBURF9VUFRFICsg
NChzNykJCSMgYTIgPSB1LiBwdGUgIzEKIC8qCkluZGV4OiBzeXMvbWlwcy9taXBzL3N1cHBvcnQu
Uwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBzeXMvbWlwcy9taXBzL3N1cHBvcnQuUwkocmV2aXNpb24gMjEwNTM0
KQorKysgc3lzL21pcHMvbWlwcy9zdXBwb3J0LlMJKHdvcmtpbmcgY29weSkKQEAgLTQyOSw4ICs0
MjksOSBAQAogICoge2Z1LHN1fSx7Ynl0ZSxzd29yZCx3b3JkfSwgZmV0Y2ggb3Igc3RvcmUgYSBi
eXRlLCBzaG9ydCBvciB3b3JkIHRvCiAgKiB1c2VyIGRhdGEgc3BhY2UuCiAgKi8KLUxFQUYoZnV3
b3JkKQotQUxFQUYoZnV3b3JkMzIpCisjaWYgZGVmaW5lZChfX21pcHNfbjY0KQorTEVBRihmdXdv
cmQ2NCkKK0FMRUFGKGZ1d29yZCkKIEFMRUFGKGZ1aXdvcmQpCiAJUFRSX0xBCXYwLCBmc3diZXJy
CiAJYmx0CWEwLCB6ZXJvLCBmc3diZXJyCSMgbWFrZSBzdXJlIGFkZHJlc3MgaXMgaW4gdXNlciBz
cGFjZQpAQCAtNDM4LDEwICs0MzksMjYgQEAKIAlHRVRfQ1BVX1BDUFUodjEpCiAJUFRSX0wJdjEs
IFBDX0NVUlBDQih2MSkKIAlQVFJfUwl2MCwgVV9QQ0JfT05GQVVMVCh2MSkKKwlsZAl2MCwgMChh
MCkJCSMgZmV0Y2ggd29yZAorCWoJcmEKKwlQVFJfUwl6ZXJvLCBVX1BDQl9PTkZBVUxUKHYxKQor
RU5EKGZ1d29yZDY0KQorI2VuZGlmCisKK0xFQUYoZnV3b3JkMzIpCisjaWYgIWRlZmluZWQoX19t
aXBzX242NCkKK0FMRUFGKGZ1d29yZCkKKyNlbmRpZgorCVBUUl9MQQl2MCwgZnN3YmVycgorCWJs
dAlhMCwgemVybywgZnN3YmVycgkjIG1ha2Ugc3VyZSBhZGRyZXNzIGlzIGluIHVzZXIgc3BhY2UK
Kwlub3AKKwlHRVRfQ1BVX1BDUFUodjEpCisJUFRSX0wJdjEsIFBDX0NVUlBDQih2MSkKKwlQVFJf
Uwl2MCwgVV9QQ0JfT05GQVVMVCh2MSkKIAlsdwl2MCwgMChhMCkJCSMgZmV0Y2ggd29yZAogCWoJ
cmEKIAlQVFJfUwl6ZXJvLCBVX1BDQl9PTkZBVUxUKHYxKQotRU5EKGZ1d29yZCkKK0VORChmdXdv
cmQzMikKIAogTEVBRihmdXN3b3JkKQogQUxFQUYoZnVpc3dvcmQpCg==
--0016e64757dcd58fd3048c646c04
Content-Type: application/octet-stream; name="mips-n64-pmap.patch"
Content-Disposition: attachment; filename="mips-n64-pmap.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gc572w172

SW5kZXg6IHN5cy9taXBzL21pcHMvcG1hcDY0LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL21pcHMvbWlw
cy9wbWFwNjQuYwkocmV2aXNpb24gMCkKKysrIHN5cy9taXBzL21pcHMvcG1hcDY0LmMJKHJldmlz
aW9uIDApCkBAIC0wLDAgKzEsMzAwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MSBSZWdl
bnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChjKSAxOTk0IEpvaG4gUy4gRHlzb24KKyAqIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTQgRGF2aWQgR3JlZW5tYW4KKyAqIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2Fy
ZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogdGhlIFN5c3RlbXMgUHJvZ3JhbW1pbmcg
R3JvdXAgb2YgdGhlIFVuaXZlcnNpdHkgb2YgVXRhaCBDb21wdXRlcgorICogU2NpZW5jZSBEZXBh
cnRtZW50IGFuZCBXaWxsaWFtIEpvbGl0eiBvZiBVVU5FVCBUZWNobm9sb2dpZXMgSW5jLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5h
bWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBB
TkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKglmcm9tOglAKCMpcG1hcC5jCTcuNyAo
QmVya2VsZXkpCTUvMTIvOTEKKyAqCWZyb206IHNyYy9zeXMvaTM4Ni9pMzg2L3BtYXAuYyx2IDEu
MjUwLjIuOCAyMDAwLzExLzIxIDAwOjA5OjE0IHBzCisgKglKTlBSOiBwbWFwLmMsdiAxLjExLjIu
MSAyMDA3LzA4LzE2IDExOjUxOjA2IGdpcmlzaAorICovCisKKy8qCisgKglNYW5hZ2VzIHBoeXNp
Y2FsIGFkZHJlc3MgbWFwcy4KKyAqCisgKglJbiBhZGRpdGlvbiB0byBoYXJkd2FyZSBhZGRyZXNz
IG1hcHMsIHRoaXMKKyAqCW1vZHVsZSBpcyBjYWxsZWQgdXBvbiB0byBwcm92aWRlIHNvZnR3YXJl
LXVzZS1vbmx5CisgKgltYXBzIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIHN0b3JlZCBpbiB0aGUg
c2FtZQorICoJZm9ybSBhcyBoYXJkd2FyZSBtYXBzLglUaGVzZSBwc2V1ZG8tbWFwcyBhcmUKKyAq
CXVzZWQgdG8gc3RvcmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgZnJvbSBjb3B5CisgKglvcGVyYXRp
b25zIHRvIGFuZCBmcm9tIGFkZHJlc3Mgc3BhY2VzLgorICoKKyAqCVNpbmNlIHRoZSBpbmZvcm1h
dGlvbiBtYW5hZ2VkIGJ5IHRoaXMgbW9kdWxlIGlzCisgKglhbHNvIHN0b3JlZCBieSB0aGUgbG9n
aWNhbCBhZGRyZXNzIG1hcHBpbmcgbW9kdWxlLAorICoJdGhpcyBtb2R1bGUgbWF5IHRocm93IGF3
YXkgdmFsaWQgdmlydHVhbC10by1waHlzaWNhbAorICoJbWFwcGluZ3MgYXQgYWxtb3N0IGFueSB0
aW1lLiAgSG93ZXZlciwgaW52YWxpZGF0aW9ucworICoJb2YgdmlydHVhbC10by1waHlzaWNhbCBt
YXBwaW5ncyBtdXN0IGJlIGRvbmUgYXMKKyAqCXJlcXVlc3RlZC4KKyAqCisgKglJbiBvcmRlciB0
byBjb3BlIHdpdGggaGFyZHdhcmUgYXJjaGl0ZWN0dXJlcyB3aGljaAorICoJbWFrZSB2aXJ0dWFs
LXRvLXBoeXNpY2FsIG1hcCBpbnZhbGlkYXRlcyBleHBlbnNpdmUsCisgKgl0aGlzIG1vZHVsZSBt
YXkgZGVsYXkgaW52YWxpZGF0ZSBvciByZWR1Y2VkIHByb3RlY3Rpb24KKyAqCW9wZXJhdGlvbnMg
dW50aWwgc3VjaCB0aW1lIGFzIHRoZXkgYXJlIGFjdHVhbGx5CisgKgluZWNlc3NhcnkuICBUaGlz
IG1vZHVsZSBpcyBnaXZlbiBmdWxsIGluZm9ybWF0aW9uIGFzCisgKgl0byB3aGljaCBwcm9jZXNz
b3JzIGFyZSBjdXJyZW50bHkgdXNpbmcgd2hpY2ggbWFwcywKKyAqCWFuZCB0byB3aGVuIHBoeXNp
Y2FsIG1hcHMgbXVzdCBiZSBtYWRlIGNvcnJlY3QuCisgKi8KKworI2luY2x1ZGUgPHN5cy9jZGVm
cy5oPgorX19GQlNESUQoIiRGcmVlQlNEOiBoZWFkL3N5cy9taXBzL21pcHMvcG1hcC5jIDIxMDMy
NyAyMDEwLTA3LTIxIDA5OjI3OjAwWiBqY2hhbmRyYSAkIik7CisKKyNpbmNsdWRlICJvcHRfbXNn
YnVmLmgiCisjaW5jbHVkZSAib3B0X2RkYi5oIgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+Cisj
aW5jbHVkZSA8c3lzL3N5c3RtLmg+CisjaW5jbHVkZSA8c3lzL3Byb2MuaD4KKyNpbmNsdWRlIDxz
eXMvbXNnYnVmLmg+CisjaW5jbHVkZSA8c3lzL3ZtbWV0ZXIuaD4KKyNpbmNsdWRlIDxzeXMvbW1h
bi5oPgorI2luY2x1ZGUgPHN5cy9zbXAuaD4KKyNpZmRlZiBEREIKKyNpbmNsdWRlIDxkZGIvZGRi
Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHZtL3ZtLmg+CisjaW5jbHVkZSA8dm0vdm1fcGFyYW0u
aD4KKyNpbmNsdWRlIDx2bS92bV9waHlzLmg+CisjaW5jbHVkZSA8c3lzL2xvY2suaD4KKyNpbmNs
dWRlIDxzeXMvbXV0ZXguaD4KKyNpbmNsdWRlIDx2bS92bV9rZXJuLmg+CisjaW5jbHVkZSA8dm0v
dm1fcGFnZS5oPgorI2luY2x1ZGUgPHZtL3ZtX21hcC5oPgorI2luY2x1ZGUgPHZtL3ZtX29iamVj
dC5oPgorI2luY2x1ZGUgPHZtL3ZtX2V4dGVybi5oPgorI2luY2x1ZGUgPHZtL3ZtX3BhZ2VvdXQu
aD4KKyNpbmNsdWRlIDx2bS92bV9wYWdlci5oPgorI2luY2x1ZGUgPHZtL3VtYS5oPgorI2luY2x1
ZGUgPHN5cy9wY3B1Lmg+CisjaW5jbHVkZSA8c3lzL3NjaGVkLmg+CisjaWZkZWYgU01QCisjaW5j
bHVkZSA8c3lzL3NtcC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxtYWNoaW5lL2NhY2hlLmg+Cisj
aW5jbHVkZSA8bWFjaGluZS9tZF92YXIuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3RsYi5oPgorCisj
aWYgZGVmaW5lZChESUFHTk9TVElDKQorI2RlZmluZQlQTUFQX0RJQUdOT1NUSUMKKyNlbmRpZgor
CisjdW5kZWYgUE1BUF9ERUJVRworCisjaWZuZGVmIFBNQVBfU0hQR1BFUlBST0MKKyNkZWZpbmUJ
UE1BUF9TSFBHUEVSUFJPQyAyMDAKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoUE1BUF9ESUFHTk9T
VElDKQorI2RlZmluZQlQTUFQX0lOTElORSBfX2lubGluZQorI2Vsc2UKKyNkZWZpbmUJUE1BUF9J
TkxJTkUKKyNlbmRpZgorCisvKgorICogR2V0IFBERXMgYW5kIFBURXMgZm9yIHVzZXIva2VybmVs
IGFkZHJlc3Mgc3BhY2UKKyAqCisgKiBYWFggVGhlICYgZm9yIHBtYXBfc2Vnc2hpZnQoKSBpcyB3
cm9uZywgYXMgaXMgdGhlIGZhY3QgdGhhdCBpdCBkb2Vzbid0CisgKiAgICAgdHJpbSBvZmYgZ3Jh
dHVpdG91cyBiaXRzIG9mIHRoZSBhZGRyZXNzIHNwYWNlLiAgQnkgaGF2aW5nIHRoZSAmCisgKiAg
ICAgdGhlcmUsIHdlIGJyZWFrIGRlZmluaW5nIE5VU0VSUEdUQkxTIGJlbG93IGJlY2F1c2UgdGhl
IGFkZHJlc3Mgc3BhY2UKKyAqICAgICBpcyBkZWZpbmVkIHN1Y2ggdGhhdCBpdCBlbmRzIGltbWVk
aWF0ZWx5IGFmdGVyIE5QREVQRypOUFRFUEcqUEFHRV9TSVpFLAorICogICAgIHNvIHdlIGVuZCB1
cCBnZXR0aW5nIE5VU0VSUEdUQkxTIG9mIDAuCisgKi8KKworI2RlZmluZQlwbWFwX3NlZ19pbmRl
eCh2KQkoKCh2KSA+PiBTRUdTSElGVCkgJiAoTlBERVBHIC0gMSkpCisjZGVmaW5lCXBtYXBfcGRl
X2luZGV4KHYpCSgoKHYpID4+IFBEUlNISUZUKSAmIChOUERFUEcgLSAxKSkKKyNkZWZpbmUJcG1h
cF9wdGVfaW5kZXgodikJKCgodikgPj4gUEFHRV9TSElGVCkgJiAoTlBURVBHIC0gMSkpCisjZGVm
aW5lIHBtYXBfcGRlX3BpbmRleCh2KSAgICAgICgodikgPj4gUERSU0hJRlQpCisgIAorI2RlZmlu
ZQlOVVNFUlBHVEJMUwkJKHBtYXBfcGRlX3BpbmRleChWTV9NQVhVU0VSX0FERFJFU1MpKQorI2Rl
ZmluZQlpc19rZXJuZWxfcG1hcCh4KQkoKHgpID09IGtlcm5lbF9wbWFwKQorCitzdHJ1Y3QgcG1h
cCBrZXJuZWxfcG1hcF9zdG9yZTsKK3BkX2VudHJ5X3QgKmtlcm5lbF9zZWdtYXA7CisKK3ZtX29m
ZnNldF90IHZpcnR1YWxfYXZhaWw7CS8qIFZBIG9mIGZpcnN0IGF2YWlsIHBhZ2UgKGFmdGVyIGtl
cm5lbCBic3MpICovCit2bV9vZmZzZXRfdCB2aXJ0dWFsX2VuZDsJLyogVkEgb2YgbGFzdCBhdmFp
bCBwYWdlIChlbmQgb2Yga2VybmVsIEFTKSAqLworCitzdGF0aWMgaW50IG5rcHQ7Cit1bnNpZ25l
ZCBwbWFwX21heF9hc2lkOwkJLyogbWF4IEFTSUQgc3VwcG9ydGVkIGJ5IHRoZSBzeXN0ZW0gKi8K
KworI2RlZmluZQlQTUFQX0FTSURfUkVTRVJWRUQJMAorCit2bV9vZmZzZXRfdCBrZXJuZWxfdm1f
ZW5kID0gVk1fTUlOX0tFUk5FTF9BRERSRVNTOworCitzdGF0aWMgdm9pZCBwbWFwX2FzaWRfYWxs
b2MocG1hcF90IHBtYXApOworCisvKgorICogRGF0YSBmb3IgdGhlIHB2IGVudHJ5IGFsbG9jYXRp
b24gbWVjaGFuaXNtCisgKi8KK3N0YXRpYyB1bWFfem9uZV90IHB2em9uZTsKK3N0YXRpYyBzdHJ1
Y3Qgdm1fb2JqZWN0IHB2em9uZV9vYmo7CitzdGF0aWMgaW50IHB2X2VudHJ5X2NvdW50ID0gMCwg
cHZfZW50cnlfbWF4ID0gMCwgcHZfZW50cnlfaGlnaF93YXRlciA9IDA7CisKK3N0YXRpYyBQTUFQ
X0lOTElORSB2b2lkIGZyZWVfcHZfZW50cnkocHZfZW50cnlfdCBwdik7CitzdGF0aWMgcHZfZW50
cnlfdCBnZXRfcHZfZW50cnkocG1hcF90IGxvY2tlZF9wbWFwKTsKK3N0YXRpYyB2b2lkIHBtYXBf
cHZoX2ZyZWUoc3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZh
KTsKK3N0YXRpYyBwdl9lbnRyeV90IHBtYXBfcHZoX3JlbW92ZShzdHJ1Y3QgbWRfcGFnZSAqcHZo
LCBwbWFwX3QgcG1hcCwKKyAgICB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgX19pbmxpbmUgdm9p
ZCBwbWFwX2NoYW5nZWJpdCh2bV9wYWdlX3QgbSwgaW50IGJpdCwgYm9vbGVhbl90IHNldGVtKTsK
Kworc3RhdGljIHZtX3BhZ2VfdCBwbWFwX2VudGVyX3F1aWNrX2xvY2tlZChwbWFwX3QgcG1hcCwg
dm1fb2Zmc2V0X3QgdmEsCisgICAgdm1fcGFnZV90IG0sIHZtX3Byb3RfdCBwcm90LCB2bV9wYWdl
X3QgbXB0ZSk7CitzdGF0aWMgaW50IHBtYXBfcmVtb3ZlX3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwg
cHRfZW50cnlfdCAqcHRxLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm9pZCBwbWFwX3JlbW92
ZV9wYWdlKHN0cnVjdCBwbWFwICpwbWFwLCB2bV9vZmZzZXRfdCB2YSk7CitzdGF0aWMgdm9pZCBw
bWFwX3JlbW92ZV9lbnRyeShzdHJ1Y3QgcG1hcCAqcG1hcCwgdm1fcGFnZV90IG0sIHZtX29mZnNl
dF90IHZhKTsKK3N0YXRpYyBib29sZWFuX3QgcG1hcF90cnlfaW5zZXJ0X3B2X2VudHJ5KHBtYXBf
dCBwbWFwLCB2bV9wYWdlX3QgbXB0ZSwKKyAgICB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0p
Oworc3RhdGljIF9faW5saW5lIHZvaWQgcG1hcF9pbnZhbGlkYXRlX3BhZ2UocG1hcF90IHBtYXAs
IHZtX29mZnNldF90IHZhKTsKK3N0YXRpYyBpbnQgX3BtYXBfdW53aXJlX3B0ZV9ob2xkKHBtYXBf
dCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0pOworCitzdGF0aWMgdm1fcGFnZV90
IHBtYXBfYWxsb2NwdGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCBpbnQgZmxhZ3MpOwor
c3RhdGljIHZtX3BhZ2VfdCBfcG1hcF9hbGxvY3B0ZShwbWFwX3QgcG1hcCwgdW5zaWduZWQgcHRl
cGluZGV4LCBpbnQgZmxhZ3MpOworc3RhdGljIGludCBwbWFwX3VudXNlX3B0KHBtYXBfdCwgdm1f
b2Zmc2V0X3QsIHZtX3BhZ2VfdCk7CitzdGF0aWMgaW50IGluaXRfcHRlX3Byb3Qodm1fb2Zmc2V0
X3QgdmEsIHZtX3BhZ2VfdCBtLCB2bV9wcm90X3QgcHJvdCk7CitzdGF0aWMgdm1fcGFnZV90IHBt
YXBfYWxsb2NfcHRlX3BhZ2UodW5zaWduZWQgaW50IGluZGV4LCBpbnQgcmVxKTsKK3N0YXRpYyB2
b2lkIHBtYXBfZ3Jvd19wdGVfcGFnZV9jYWNoZSh2b2lkKTsKKworI2lmZGVmIFNNUAorc3RhdGlj
IHZvaWQgcG1hcF9pbnZhbGlkYXRlX3BhZ2VfYWN0aW9uKHZvaWQgKmFyZyk7CitzdGF0aWMgdm9p
ZCBwbWFwX2ludmFsaWRhdGVfYWxsX2FjdGlvbih2b2lkICphcmcpOworc3RhdGljIHZvaWQgcG1h
cF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKTsKKyNlbmRpZgorCisvKgorICogVG9wIGxl
dmVsIHBhZ2UgdGFibGUgZW50cnkgZm9yIGEgdmEKKyAqLworc3RhdGljIGlubGluZSBwZF9lbnRy
eV90ICoKK3BtYXBfc2VnbWFwKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlyZXR1
cm4gKCZwbWFwLT5wbV9zZWd0YWJbcG1hcF9zZWdfaW5kZXgodmEpXSk7Cit9CisKK3N0YXRpYyBp
bmxpbmUgcGRfZW50cnlfdCAqCitwbWFwX3BkcGVfdG9fcGRlKHBkX2VudHJ5X3QgKnBkcGUsIHZt
X29mZnNldF90IHZhKQoreworCXBkX2VudHJ5X3QgKnBkZTsKKworCXBkZSA9IChwZF9lbnRyeV90
ICopKnBkcGU7CisJcmV0dXJuICgmcGRlW3BtYXBfcGRlX2luZGV4KHZhKV0pOworfQorCisvKgor
ICogUmV0dXJuIHBhZ2UgZGlyZWN0b3J5IGVudHJ5IGZvciBhIHZhCisgKi8KK3N0YXRpYyBfX2lu
bGluZSBwZF9lbnRyeV90ICoKK3BtYXBfcGRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkK
K3sKKwlwZF9lbnRyeV90ICpwZHBlLCAqcGRlOworCisJcGRwZSA9IHBtYXBfc2VnbWFwKHBtYXAs
IHZhKTsKKwlpZiAocGRwZSA9PSBOVUxMIHx8ICpwZHBlID09IE5VTEwpCisJCXJldHVybiAoTlVM
TCk7CisKKwlwZGUgPSAocGRfZW50cnlfdCAqKSpwZHBlOworCXJldHVybiAoJnBkZVtwbWFwX3Bk
ZV9pbmRleCh2YSldKTsKK30KKworc3RhdGljIGlubGluZSBwdF9lbnRyeV90ICoKK3BtYXBfcGRl
X3RvX3B0ZShwZF9lbnRyeV90ICpwZGUsIHZtX29mZnNldF90IHZhKQoreworCXB0X2VudHJ5X3Qg
KnB0ZTsKKworCXB0ZSA9IChwdF9lbnRyeV90ICopKnBkZTsKKwlyZXR1cm4gKCZwdGVbcG1hcF9w
dGVfaW5kZXgodmEpXSk7Cit9CisKKy8qCisgKglSb3V0aW5lOglwbWFwX3B0ZQorICoJRnVuY3Rp
b246CisgKgkJRXh0cmFjdCB0aGUgcGFnZSB0YWJsZSBlbnRyeSBhc3NvY2lhdGVkCisgKgkJd2l0
aCB0aGUgZ2l2ZW4gbWFwL3ZpcnR1YWxfYWRkcmVzcyBwYWlyLgorICovCitwdF9lbnRyeV90ICoK
K3BtYXBfcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwZF9lbnRyeV90ICpw
ZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJcGRlID0gcG1hcF9wZGUocG1hcCwgdmEpOworCWlm
IChwZGUgPT0gTlVMTCB8fCAqcGRlID09IE5VTEwpCisJCXJldHVybiAoTlVMTCk7CisKKwlwdGUg
PSAocHRfZW50cnlfdCAqKSpwZGU7CisJcmV0dXJuICgmcHRlW3BtYXBfcHRlX2luZGV4KHZhKV0p
OworfQorCisKK3ZtX29mZnNldF90CitwbWFwX3N0ZWFsX21lbW9yeSh2bV9zaXplX3Qgc2l6ZSkK
K3sKKwl2bV9zaXplX3QgYmFua19zaXplOworCXZtX29mZnNldF90IHBhLCB2YTsKKworCXNpemUg
PSByb3VuZF9wYWdlKHNpemUpOworCisJYmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNf
YXZhaWxbMF07CisJd2hpbGUgKHNpemUgPiBiYW5rX3NpemUpIHsKKwkJaW50IGk7CisKKwkJZm9y
IChpID0gMDsgcGh5c19hdmFpbFtpICsgMl07IGkgKz0gMikgeworCQkJcGh5c19hdmFpbFtpXSA9
IHBoeXNfYXZhaWxbaSArIDJdOworCQkJcGh5c19hdmFpbFtpICsgMV0gPSBwaHlzX2F2YWlsW2kg
KyAzXTsKKwkJfQorCQlwaHlzX2F2YWlsW2ldID0gMDsKKwkJcGh5c19hdmFpbFtpICsgMV0gPSAw
OworCQlpZiAoIXBoeXNfYXZhaWxbMF0pCisJCQlwYW5pYygicG1hcF9zdGVhbF9tZW1vcnk6IG91
dCBvZiBtZW1vcnkiKTsKKwkJYmFua19zaXplID0gcGh5c19hdmFpbFsxXSAtIHBoeXNfYXZhaWxb
MF07CisJfQorCisJcGEgPSBwaHlzX2F2YWlsWzBdOworCXBoeXNfYXZhaWxbMF0gKz0gc2l6ZTsK
KwlpZiAocGEgPj0gTUlQU19LU0VHMF9MQVJHRVNUX1BIWVMpIHsKKwkJcGFuaWMoIk91dCBvZiBt
ZW1vcnkgYmVsb3cgNTEyTWVnPyIpOworCX0KKwl2YSA9IE1JUFNfUEhZU19UT19LU0VHMChwYSk7
CisJYnplcm8oKGNhZGRyX3QpdmEsIHNpemUpOworCXJldHVybiB2YTsKK30KKworLyoKKyAqIEJv
b3RzdHJhcCB0aGUgc3lzdGVtIGVub3VnaCB0byBydW4gd2l0aCB2aXJ0dWFsIG1lbW9yeS4gIFRo
aXMKKyAqIGFzc3VtZXMgdGhhdCB0aGUgcGh5c19hdmFpbCBhcnJheSBoYXMgYmVlbiBpbml0aWFs
aXplZC4KKyAqLworc3RhdGljIHZvaWQgCitjcmVhdGVfa2Vybl9wYWdlX3RhYmxlKHZvaWQpCit7
CisJaW50IG5wZGU7CisJaW50IGksIGosIG5wdDsKKwl2bV9vZmZzZXRfdCBwZGFkZHIsIHB0YWRk
cjsKKwlwZF9lbnRyeV90ICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOworCisJa2VybmVsX3NlZ21h
cCA9IChwZF9lbnRyeV90ICopcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFKTsKKworCS8qCisJ
ICogQWxsb2NhdGUgc2Vjb25kIGxldmVsIHBhZ2UgdGFibGVzIGZvciB0aGUga2VybmVsCisJICov
CisJbnBkZSA9IGhvd21hbnkoTktQVCwgTlBERVBHKTsKKwlua3B0ID0gTktQVDsKKwlwZGFkZHIg
PSBwbWFwX3N0ZWFsX21lbW9yeShQQUdFX1NJWkUgKiBucGRlKTsKKwlwdGFkZHIgPSBwbWFwX3N0
ZWFsX21lbW9yeShQQUdFX1NJWkUgKiBua3B0KTsKKwlwcmludGYoIk5QREUgJWx4IE5QS1BUICVs
eCBcbiIsICh1X2xvbmcpbnBkZSwgKHVfbG9uZylua3B0KTsKKwkvKgorCSAqIFRoZSBSWzQtN10/
MDAgc3RvcmVzIG9ubHkgb25lIGNvcHkgb2YgdGhlIEdsb2JhbCBiaXQgaW4gdGhlCisJICogdHJh
bnNsYXRpb24gbG9va2FzaWRlIGJ1ZmZlciBmb3IgZWFjaCAyIHBhZ2UgZW50cnkuIFRodXMgaW52
YWxpZAorCSAqIGVudHJ5cyBtdXN0IGhhdmUgdGhlIEdsb2JhbCBiaXQgc2V0IHNvIHdoZW4gRW50
cnkgTE8gYW5kIEVudHJ5IEhJCisJICogRyBiaXRzIGFyZSBhbmRlZCB0b2dldGhlciB0aGV5IHdp
bGwgcHJvZHVjZSBhIGdsb2JhbCBiaXQgdG8gc3RvcmUKKwkgKiBpbiB0aGUgdGxiLgorCSAqLwor
CWZvciAoaSA9IDAsIHB0ZSA9IChwdF9lbnRyeV90ICopcHRhZGRyOyBpIDwgKG5rcHQgKiBOUFRF
UEcpOyBpKyssIHB0ZSsrKQorCQkqcHRlID0gUFRFX0c7CisKKwlmb3IgKGkgPSAwLCAgbnB0ID0g
bmtwdDsgbnB0ID4gMDsgaSsrKSB7CisJCWtlcm5lbF9zZWdtYXBbaV0gPSAocGRfZW50cnlfdCko
cGRhZGRyICsgaSAqIFBBR0VfU0laRSk7CisJCXBkZSA9IChwZF9lbnRyeV90ICopa2VybmVsX3Nl
Z21hcFtpXTsKKworCQlmb3IgKGogPSAwOyBqIDwgTlBERVBHICYmIG5wdCA+IDA7IGorKywgbnB0
LS0pCisJCQlwZGVbal0gPSAocGRfZW50cnlfdCkocHRhZGRyICsgKGkgKiBOUERFUEcgKyBqKSAq
IFBBR0VfU0laRSk7CisJfQorCisJUE1BUF9MT0NLX0lOSVQoa2VybmVsX3BtYXApOworCWtlcm5l
bF9wbWFwLT5wbV9zZWd0YWIgPSBrZXJuZWxfc2VnbWFwOworCWtlcm5lbF9wbWFwLT5wbV9hY3Rp
dmUgPSB+MDsKKwlUQUlMUV9JTklUKCZrZXJuZWxfcG1hcC0+cG1fcHZsaXN0KTsKKwlrZXJuZWxf
cG1hcC0+cG1fYXNpZFswXS5hc2lkID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCWtlcm5lbF9wbWFw
LT5wbV9hc2lkWzBdLmdlbiA9IDA7Cit9CisKK3ZvaWQKK3BtYXBfYm9vdHN0cmFwKHZvaWQpCit7
CisJaW50IGk7CisKKwkvKiBTb3J0LiAqLworYWdhaW46CisJZm9yIChpID0gMDsgcGh5c19hdmFp
bFtpICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCS8qCisJCSAqIEtlZXAgdGhlIG1lbW9yeSBhbGln
bmVkIG9uIHBhZ2UgYm91bmRhcnkuCisJCSAqLworCQlwaHlzX2F2YWlsW2ldID0gcm91bmRfcGFn
ZShwaHlzX2F2YWlsW2ldKTsKKwkJcGh5c19hdmFpbFtpICsgMV0gPSB0cnVuY19wYWdlKHBoeXNf
YXZhaWxbaSArIDFdKTsKKworCQlpZiAoaSA8IDIpCisJCQljb250aW51ZTsKKwkJaWYgKHBoeXNf
YXZhaWxbaSAtIDJdID4gcGh5c19hdmFpbFtpXSkgeworCQkJdm1fcGFkZHJfdCBwdGVtcFsyXTsK
KworCQkJcHRlbXBbMF0gPSBwaHlzX2F2YWlsW2kgKyAwXTsKKwkJCXB0ZW1wWzFdID0gcGh5c19h
dmFpbFtpICsgMV07CisKKwkJCXBoeXNfYXZhaWxbaSArIDBdID0gcGh5c19hdmFpbFtpIC0gMl07
CisJCQlwaHlzX2F2YWlsW2kgKyAxXSA9IHBoeXNfYXZhaWxbaSAtIDFdOworCisJCQlwaHlzX2F2
YWlsW2kgLSAyXSA9IHB0ZW1wWzBdOworCQkJcGh5c19hdmFpbFtpIC0gMV0gPSBwdGVtcFsxXTsK
KwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CisKKwkvKgorCSAqIENvcHkgdGhlIHBoeXNfYXZhaWxb
XSBhcnJheSBiZWZvcmUgd2Ugc3RhcnQgc3RlYWxpbmcgbWVtb3J5IGZyb20gaXQuCisJICovCisJ
Zm9yIChpID0gMDsgcGh5c19hdmFpbFtpICsgMV0gIT0gMDsgaSArPSAyKSB7CisJCXBoeXNtZW1f
ZGVzY1tpXSA9IHBoeXNfYXZhaWxbaV07CisJCXBoeXNtZW1fZGVzY1tpICsgMV0gPSBwaHlzX2F2
YWlsW2kgKyAxXTsKKwl9CisKKwlNYXhtZW0gPSBhdG9wKHBoeXNfYXZhaWxbaSAtIDFdKTsKKwor
CWlmIChib290dmVyYm9zZSkgeworCQlwcmludGYoIlBoeXNpY2FsIG1lbW9yeSBjaHVuayhzKTpc
biIpOworCQlmb3IgKGkgPSAwOyBwaHlzX2F2YWlsW2kgKyAxXSAhPSAwOyBpICs9IDIpIHsKKwkJ
CXZtX3BhZGRyX3Qgc2l6ZTsKKworCQkJc2l6ZSA9IHBoeXNfYXZhaWxbaSArIDFdIC0gcGh5c19h
dmFpbFtpXTsKKwkJCXByaW50ZigiJSMwOGp4IC0gJSMwOGp4LCAlanUgYnl0ZXMgKCVqdSBwYWdl
cylcbiIsCisJCQkgICAgKHVpbnRtYXhfdCkgcGh5c19hdmFpbFtpXSwKKwkJCSAgICAodWludG1h
eF90KSBwaHlzX2F2YWlsW2kgKyAxXSAtIDEsCisJCQkgICAgKHVpbnRtYXhfdCkgc2l6ZSwgKHVp
bnRtYXhfdCkgc2l6ZSAvIFBBR0VfU0laRSk7CisJCX0KKwkJcHJpbnRmKCJNYXhtZW0gaXMgMHgl
MGx4XG4iLCBwdG9hKE1heG1lbSkpOworCX0KKwkvKgorCSAqIFN0ZWFsIHRoZSBtZXNzYWdlIGJ1
ZmZlciBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgbWVtb3J5LgorCSAqLworCW1zZ2J1ZnAgPSAoc3Ry
dWN0IG1zZ2J1ZiAqKXBtYXBfc3RlYWxfbWVtb3J5KE1TR0JVRl9TSVpFKTsKKwltc2didWZpbml0
KG1zZ2J1ZnAsIE1TR0JVRl9TSVpFKTsKKworCS8qCisJICogU3RlYWwgdGhyZWFkMCBrc3RhY2su
CisJICovCisJa3N0YWNrMCA9IHBtYXBfc3RlYWxfbWVtb3J5KEtTVEFDS19QQUdFUyA8PCBQQUdF
X1NISUZUKTsKKworCXZpcnR1YWxfYXZhaWwgPSBWTV9NSU5fS0VSTkVMX0FERFJFU1M7CisJdmly
dHVhbF9lbmQgPSBWTV9NQVhfS0VSTkVMX0FERFJFU1M7CisKKyNpZmRlZiBTTVAKKwkvKgorCSAq
IFN0ZWFsIHNvbWUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIHRvIG1hcCB0aGUgcGNwdSBhcmVhLgor
CSAqLworCXZpcnR1YWxfYXZhaWwgPSByb3VuZHVwMih2aXJ0dWFsX2F2YWlsLCBQQUdFX1NJWkUg
KiAyKTsKKwlwY3B1cCA9IChzdHJ1Y3QgcGNwdSAqKXZpcnR1YWxfYXZhaWw7CisJdmlydHVhbF9h
dmFpbCArPSBQQUdFX1NJWkUgKiAyOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB3aXJlZCBU
TEIgZW50cnkgbWFwcGluZyB0aGUgcGNwdSByZWdpb24gZm9yCisJICogdGhlIEJTUCBhdCAncGNw
dXAnLiBVcCB1bnRpbCB0aGlzIHBvaW50IHdlIHdlcmUgb3BlcmF0aW5nCisJICogd2l0aCB0aGUg
J3BjcHVwJyBmb3IgdGhlIEJTUCBwb2ludGluZyB0byBhIHZpcnR1YWwgYWRkcmVzcworCSAqIGlu
IEtTRUcwIHNvIHRoZXJlIHdhcyBubyBuZWVkIGZvciBhIFRMQiBtYXBwaW5nLgorCSAqLworCW1p
cHNfcGNwdV90bGJfaW5pdChQQ1BVX0FERFIoMCkpOworCisJaWYgKGJvb3R2ZXJib3NlKQorCQlw
cmludGYoInBjcHUgaXMgYXZhaWxhYmxlIGF0IHZpcnR1YWwgYWRkcmVzcyAlcC5cbiIsIHBjcHVw
KTsKKyNlbmRpZgorCisJLyoKKwkgKiBBbGxvY2F0ZSBzZWdtZW50IHRhYmxlIGZvciB0aGUga2Vy
bmVsCisJICovCisJY3JlYXRlX2tlcm5fcGFnZV90YWJsZSgpOworCXBtYXBfbWF4X2FzaWQgPSBW
TU5VTV9QSURTOworCW1pcHNfd3JfZW50cnloaSgwKTsKKwltaXBzX3dyX3BhZ2VtYXNrKDApOwor
fQorCisvKgorICogSW5pdGlhbGl6ZSBhIHZtX3BhZ2UncyBtYWNoaW5lLWRlcGVuZGVudCBmaWVs
ZHMuCisgKi8KK3ZvaWQKK3BtYXBfcGFnZV9pbml0KHZtX3BhZ2VfdCBtKQoreworCisJVEFJTFFf
SU5JVCgmbS0+bWQucHZfbGlzdCk7CisJbS0+bWQucHZfbGlzdF9jb3VudCA9IDA7CisJbS0+bWQu
cHZfZmxhZ3MgPSAwOworfQorCisvKgorICoJSW5pdGlhbGl6ZSB0aGUgcG1hcCBtb2R1bGUuCisg
KglDYWxsZWQgYnkgdm1faW5pdCwgdG8gaW5pdGlhbGl6ZSBhbnkgc3RydWN0dXJlcyB0aGF0IHRo
ZSBwbWFwCisgKglzeXN0ZW0gbmVlZHMgdG8gbWFwIHZpcnR1YWwgbWVtb3J5LgorICoJcG1hcF9p
bml0IGhhcyBiZWVuIGVuaGFuY2VkIHRvIHN1cHBvcnQgaW4gYSBmYWlybHkgY29uc2lzdGFudAor
ICoJd2F5LCBkaXNjb250aWd1b3VzIHBoeXNpY2FsIG1lbW9yeS4KKyAqLwordm9pZAorcG1hcF9p
bml0KHZvaWQpCit7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGFkZHJlc3Mgc3BhY2UgKHpv
bmUpIGZvciB0aGUgcHYgZW50cmllcy4gIFNldCBhCisJICogaGlnaCB3YXRlciBtYXJrIHNvIHRo
YXQgdGhlIHN5c3RlbSBjYW4gcmVjb3ZlciBmcm9tIGV4Y2Vzc2l2ZQorCSAqIG51bWJlcnMgb2Yg
cHYgZW50cmllcy4KKwkgKi8KKwlwdnpvbmUgPSB1bWFfemNyZWF0ZSgiUFYgRU5UUlkiLCBzaXpl
b2Yoc3RydWN0IHB2X2VudHJ5KSwgTlVMTCwgTlVMTCwKKwkgICAgTlVMTCwgTlVMTCwgVU1BX0FM
SUdOX1BUUiwgVU1BX1pPTkVfVk0gfCBVTUFfWk9ORV9OT0ZSRUUpOworCXB2X2VudHJ5X21heCA9
IFBNQVBfU0hQR1BFUlBST0MgKiBtYXhwcm9jICsgY250LnZfcGFnZV9jb3VudDsKKwlwdl9lbnRy
eV9oaWdoX3dhdGVyID0gOSAqIChwdl9lbnRyeV9tYXggLyAxMCk7CisJdW1hX3pvbmVfc2V0X29i
aihwdnpvbmUsICZwdnpvbmVfb2JqLCBwdl9lbnRyeV9tYXgpOworfQorCisvKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBMb3cgbGV2ZWwgaGVs
cGVyIHJvdXRpbmVzLi4uLi4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKiovCisKKyNpZiBkZWZpbmVkKFBNQVBfRElBR05PU1RJQykKKworLyoKKyAq
IFRoaXMgY29kZSBjaGVja3MgZm9yIG5vbi13cml0ZWFibGUvbW9kaWZpZWQgcGFnZXMuCisgKiBU
aGlzIHNob3VsZCBiZSBhbiBpbnZhbGlkIGNvbmRpdGlvbi4KKyAqLworc3RhdGljIGludAorcG1h
cF9ud19tb2RpZmllZChwdF9lbnRyeV90IHB0ZSkKK3sKKwlpZiAoKHB0ZSAmIChQVEVfRCB8IFBU
RV9STykpID09IChQVEVfRCB8IFBURV9STykpCisJCXJldHVybiAoMSk7CisJZWxzZQorCQlyZXR1
cm4gKDApOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQKK3BtYXBfaW52YWxpZGF0ZV9hbGwo
cG1hcF90IHBtYXApCit7CisjaWZkZWYgU01QCisJc21wX3JlbmRlenZvdXMoMCwgcG1hcF9pbnZh
bGlkYXRlX2FsbF9hY3Rpb24sIDAsICh2b2lkICopcG1hcCk7Cit9CisKK3N0YXRpYyB2b2lkCitw
bWFwX2ludmFsaWRhdGVfYWxsX2FjdGlvbih2b2lkICphcmcpCit7CisJcG1hcF90IHBtYXAgPSAo
cG1hcF90KWFyZzsKKworI2VuZGlmCisKKwlpZiAocG1hcCA9PSBrZXJuZWxfcG1hcCkgeworCQl0
bGJfaW52YWxpZGF0ZV9hbGwoKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChwbWFwLT5wbV9hY3Rp
dmUgJiBQQ1BVX0dFVChjcHVtYXNrKSkKKwkJdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIocG1hcCk7
CisJZWxzZQorCQlwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uZ2VuID0gMDsKK30KKwor
c3RydWN0IHBtYXBfaW52YWxpZGF0ZV9wYWdlX2FyZyB7CisJcG1hcF90IHBtYXA7CisJdm1fb2Zm
c2V0X3QgdmE7Cit9OworCitzdGF0aWMgX19pbmxpbmUgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3Bh
Z2UocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworI2lmZGVmIFNNUAorCXN0cnVjdCBw
bWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgYXJnOworCisJYXJnLnBtYXAgPSBwbWFwOworCWFyZy52
YSA9IHZhOworCisJc21wX3JlbmRlenZvdXMoMCwgcG1hcF9pbnZhbGlkYXRlX3BhZ2VfYWN0aW9u
LCAwLCAodm9pZCAqKSZhcmcpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF9pbnZhbGlkYXRlX3Bh
Z2VfYWN0aW9uKHZvaWQgKmFyZykKK3sKKwlwbWFwX3QgcG1hcCA9ICgoc3RydWN0IHBtYXBfaW52
YWxpZGF0ZV9wYWdlX2FyZyAqKWFyZyktPnBtYXA7CisJdm1fb2Zmc2V0X3QgdmEgPSAoKHN0cnVj
dCBwbWFwX2ludmFsaWRhdGVfcGFnZV9hcmcgKilhcmcpLT52YTsKKworI2VuZGlmCisKKwlpZiAo
aXNfa2VybmVsX3BtYXAocG1hcCkpIHsKKwkJdGxiX2ludmFsaWRhdGVfYWRkcmVzcyhwbWFwLCB2
YSk7CisJCXJldHVybjsKKwl9CisJaWYgKHBtYXAtPnBtX2FzaWRbUENQVV9HRVQoY3B1aWQpXS5n
ZW4gIT0gUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSkKKwkJcmV0dXJuOworCWVsc2UgaWYgKCEo
cG1hcC0+cG1fYWN0aXZlICYgUENQVV9HRVQoY3B1bWFzaykpKSB7CisJCXBtYXAtPnBtX2FzaWRb
UENQVV9HRVQoY3B1aWQpXS5nZW4gPSAwOworCQlyZXR1cm47CisJfQorCXRsYl9pbnZhbGlkYXRl
X2FkZHJlc3MocG1hcCwgdmEpOworfQorCitzdHJ1Y3QgcG1hcF91cGRhdGVfcGFnZV9hcmcgewor
CXBtYXBfdCBwbWFwOworCXZtX29mZnNldF90IHZhOworCXB0X2VudHJ5X3QgcHRlOworfTsKKwor
dm9pZAorcG1hcF91cGRhdGVfcGFnZShwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHB0X2Vu
dHJ5X3QgcHRlKQoreworI2lmZGVmIFNNUAorCXN0cnVjdCBwbWFwX3VwZGF0ZV9wYWdlX2FyZyBh
cmc7CisKKwlhcmcucG1hcCA9IHBtYXA7CisJYXJnLnZhID0gdmE7CisJYXJnLnB0ZSA9IHB0ZTsK
KworCXNtcF9yZW5kZXp2b3VzKDAsIHBtYXBfdXBkYXRlX3BhZ2VfYWN0aW9uLCAwLCAodm9pZCAq
KSZhcmcpOworfQorCitzdGF0aWMgdm9pZAorcG1hcF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAq
YXJnKQoreworCXBtYXBfdCBwbWFwID0gKChzdHJ1Y3QgcG1hcF91cGRhdGVfcGFnZV9hcmcgKilh
cmcpLT5wbWFwOworCXZtX29mZnNldF90IHZhID0gKChzdHJ1Y3QgcG1hcF91cGRhdGVfcGFnZV9h
cmcgKilhcmcpLT52YTsKKwlwdF9lbnRyeV90IHB0ZSA9ICgoc3RydWN0IHBtYXBfdXBkYXRlX3Bh
Z2VfYXJnICopYXJnKS0+cHRlOworCisjZW5kaWYKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkp
IHsKKwkJdGxiX3VwZGF0ZShwbWFwLCB2YSwgcHRlKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocG1h
cC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiAhPSBQQ1BVX0dFVChhc2lkX2dlbmVyYXRp
b24pKQorCQlyZXR1cm47CisJZWxzZSBpZiAoIShwbWFwLT5wbV9hY3RpdmUgJiBQQ1BVX0dFVChj
cHVtYXNrKSkpIHsKKwkJcG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9IDA7CisJ
CXJldHVybjsKKwl9CisJdGxiX3VwZGF0ZShwbWFwLCB2YSwgcHRlKTsKK30KKworLyoKKyAqCVJv
dXRpbmU6CXBtYXBfZXh0cmFjdAorICoJRnVuY3Rpb246CisgKgkJRXh0cmFjdCB0aGUgcGh5c2lj
YWwgcGFnZSBhZGRyZXNzIGFzc29jaWF0ZWQKKyAqCQl3aXRoIHRoZSBnaXZlbiBtYXAvdmlydHVh
bF9hZGRyZXNzIHBhaXIuCisgKi8KK3ZtX3BhZGRyX3QKK3BtYXBfZXh0cmFjdChwbWFwX3QgcG1h
cCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAqcHRlOworCXZtX29mZnNldF90IHJl
dHZhbCA9IDA7CisKKwlQTUFQX0xPQ0socG1hcCk7CisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEp
OworCWlmIChwdGUpIHsKKwkJcmV0dmFsID0gVExCTE9fUFRFX1RPX1BBKCpwdGUpIHwgKHZhICYg
UEFHRV9NQVNLKTsKKwl9CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuIHJldHZhbDsKK30K
KworLyoKKyAqCVJvdXRpbmU6CXBtYXBfZXh0cmFjdF9hbmRfaG9sZAorICoJRnVuY3Rpb246Cisg
KgkJQXRvbWljYWxseSBleHRyYWN0IGFuZCBob2xkIHRoZSBwaHlzaWNhbCBwYWdlCisgKgkJd2l0
aCB0aGUgZ2l2ZW4gcG1hcCBhbmQgdmlydHVhbCBhZGRyZXNzIHBhaXIKKyAqCQlpZiB0aGF0IG1h
cHBpbmcgcGVybWl0cyB0aGUgZ2l2ZW4gcHJvdGVjdGlvbi4KKyAqLwordm1fcGFnZV90CitwbWFw
X2V4dHJhY3RfYW5kX2hvbGQocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wcm90X3Qg
cHJvdCkKK3sKKwlwdF9lbnRyeV90IHB0ZTsKKwl2bV9wYWdlX3QgbTsKKwl2bV9wYWRkcl90IHBh
OworCisJbSA9IE5VTEw7CisJcGEgPSAwOworCVBNQVBfTE9DSyhwbWFwKTsKK3JldHJ5OgorCXB0
ZSA9ICpwbWFwX3B0ZShwbWFwLCB2YSk7CisJaWYgKHB0ZSAhPSAwICYmIHB0ZV90ZXN0KCZwdGUs
IFBURV9WKSAmJgorCSAgICAocHRlX3Rlc3QoJnB0ZSwgUFRFX0QpIHx8IChwcm90ICYgVk1fUFJP
VF9XUklURSkgPT0gMCkpIHsKKwkJaWYgKHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIFRMQkxP
X1BURV9UT19QQShwdGUpLCAmcGEpKQorCQkJZ290byByZXRyeTsKKworCQltID0gUEhZU19UT19W
TV9QQUdFKFRMQkxPX1BURV9UT19QQShwdGUpKTsKKwkJdm1fcGFnZV9ob2xkKG0pOworCX0KKwlQ
QV9VTkxPQ0tfQ09ORChwYSk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJcmV0dXJuIChtKTsKK30K
KworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgor
ICogTG93IGxldmVsIG1hcHBpbmcgcm91dGluZXMuLi4uLgorICoqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGFkZCBhIHdpcmVkIHBh
Z2UgdG8gdGhlIGt2YQorICovCisgLyogUE1BUF9JTkxJTkUgKi8gdm9pZAorcG1hcF9rZW50ZXIo
dm1fb2Zmc2V0X3QgdmEsIHZtX3BhZGRyX3QgcGEpCit7CisJcHRfZW50cnlfdCAqcHRlOworCXB0
X2VudHJ5X3Qgb3B0ZSwgbnB0ZTsKKworI2lmZGVmIFBNQVBfREVCVUcKKwlwcmludGYoInBtYXBf
a2VudGVyOiAgdmE6ICVwIC0+IHBhOiAlcFxuIiwgKHZvaWQgKil2YSwgKHZvaWQgKilwYSk7Cisj
ZW5kaWYKKwlucHRlID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8IFBURV9EIHwgUFRFX1YgfCBQVEVf
RyB8IFBURV9XOworCisJaWYgKGlzX2NhY2hlYWJsZV9tZW0ocGEpKQorCQlucHRlIHw9IFBURV9D
X0NBQ0hFOworCWVsc2UKKwkJbnB0ZSB8PSBQVEVfQ19VTkNBQ0hFRDsKKworCXB0ZSA9IHBtYXBf
cHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJb3B0ZSA9ICpwdGU7CisJKnB0ZSA9IG5wdGU7CisKKwlw
bWFwX3VwZGF0ZV9wYWdlKGtlcm5lbF9wbWFwLCB2YSwgbnB0ZSk7Cit9CisKKy8qCisgKiByZW1v
dmUgYSBwYWdlIGZyb20gdGhlIGtlcm5lbCBwYWdldGFibGVzCisgKi8KKyAvKiBQTUFQX0lOTElO
RSAqLyB2b2lkCitwbWFwX2tyZW1vdmUodm1fb2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAq
cHRlOworCisJLyoKKwkgKiBXcml0ZSBiYWNrIGFsbCBjYWNoZXMgZnJvbSB0aGUgcGFnZSBiZWlu
ZyBkZXN0cm95ZWQKKwkgKi8KKwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleCh2YSwgUEFH
RV9TSVpFKTsKKworCXB0ZSA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJKnB0ZSA9IFBU
RV9HOworCXBtYXBfaW52YWxpZGF0ZV9wYWdlKGtlcm5lbF9wbWFwLCB2YSk7Cit9CisKKy8qCisg
KglVc2VkIHRvIG1hcCBhIHJhbmdlIG9mIHBoeXNpY2FsIGFkZHJlc3NlcyBpbnRvIGtlcm5lbAor
ICoJdmlydHVhbCBhZGRyZXNzIHNwYWNlLgorICoKKyAqCVRoZSB2YWx1ZSBwYXNzZWQgaW4gJyp2
aXJ0JyBpcyBhIHN1Z2dlc3RlZCB2aXJ0dWFsIGFkZHJlc3MgZm9yCisgKgl0aGUgbWFwcGluZy4g
QXJjaGl0ZWN0dXJlcyB3aGljaCBjYW4gc3VwcG9ydCBhIGRpcmVjdC1tYXBwZWQKKyAqCXBoeXNp
Y2FsIHRvIHZpcnR1YWwgcmVnaW9uIGNhbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3MK
KyAqCXdpdGhpbiB0aGF0IHJlZ2lvbiwgbGVhdmluZyAnKnZpcnQnIHVuY2hhbmdlZC4gT3RoZXIK
KyAqCWFyY2hpdGVjdHVyZXMgc2hvdWxkIG1hcCB0aGUgcGFnZXMgc3RhcnRpbmcgYXQgJyp2aXJ0
JyBhbmQKKyAqCXVwZGF0ZSAnKnZpcnQnIHdpdGggdGhlIGZpcnN0IHVzYWJsZSBhZGRyZXNzIGFm
dGVyIHRoZSBtYXBwZWQKKyAqCXJlZ2lvbi4KKyAqCisgKglVc2UgWEtQSFlTIGZvciA2NCBiaXQs
IGFuZCBLU0VHMCB3aGVyZSBwb3NzaWJsZSBmb3IgMzIgYml0LgorICovCit2bV9vZmZzZXRfdAor
cG1hcF9tYXAodm1fb2Zmc2V0X3QgKnZpcnQsIHZtX29mZnNldF90IHN0YXJ0LCB2bV9vZmZzZXRf
dCBlbmQsIGludCBwcm90KQoreworCXJldHVybiAoTUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQo
c3RhcnQpKTsKK30KKworLyoKKyAqIEFkZCBhIGxpc3Qgb2Ygd2lyZWQgcGFnZXMgdG8gdGhlIGt2
YQorICogdGhpcyByb3V0aW5lIGlzIG9ubHkgdXNlZCBmb3IgdGVtcG9yYXJ5CisgKiBrZXJuZWwg
bWFwcGluZ3MgdGhhdCBkbyBub3QgbmVlZCB0byBoYXZlCisgKiBwYWdlIG1vZGlmaWNhdGlvbiBv
ciByZWZlcmVuY2VzIHJlY29yZGVkLgorICogTm90ZSB0aGF0IG9sZCBtYXBwaW5ncyBhcmUgc2lt
cGx5IHdyaXR0ZW4KKyAqIG92ZXIuICBUaGUgcGFnZSAqbXVzdCogYmUgd2lyZWQuCisgKi8KK3Zv
aWQKK3BtYXBfcWVudGVyKHZtX29mZnNldF90IHZhLCB2bV9wYWdlX3QgKm0sIGludCBjb3VudCkK
K3sKKwlpbnQgaTsKKwl2bV9vZmZzZXRfdCBvcmlndmEgPSB2YTsKKworCWZvciAoaSA9IDA7IGkg
PCBjb3VudDsgaSsrKSB7CisJCXBtYXBfZmx1c2hfcHZjYWNoZShtW2ldKTsKKwkJcG1hcF9rZW50
ZXIodmEsIFZNX1BBR0VfVE9fUEhZUyhtW2ldKSk7CisJCXZhICs9IFBBR0VfU0laRTsKKwl9CisK
KwltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChvcmlndmEsIFBBR0VfU0laRSpjb3VudCk7
Cit9CisKKy8qCisgKiB0aGlzIHJvdXRpbmUgamVya3MgcGFnZSBtYXBwaW5ncyBmcm9tIHRoZQor
ICoga2VybmVsIC0tIGl0IGlzIG1lYW50IG9ubHkgZm9yIHRlbXBvcmFyeSBtYXBwaW5ncy4KKyAq
Lwordm9pZAorcG1hcF9xcmVtb3ZlKHZtX29mZnNldF90IHZhLCBpbnQgY291bnQpCit7CisJLyoK
KwkgKiBObyBuZWVkIHRvIHdiL2ludiBjYWNoZXMgaGVyZSwgCisJICogICBwbWFwX2tyZW1vdmUg
d2lsbCBkbyBpdCBmb3IgdXMKKwkgKi8KKworCXdoaWxlIChjb3VudC0tID4gMCkgeworCQlwbWFw
X2tyZW1vdmUodmEpOworCQl2YSArPSBQQUdFX1NJWkU7CisJfQorfQorCisvKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQYWdlIHRhYmxlIHBh
Z2UgbWFuYWdlbWVudCByb3V0aW5lcy4uLi4uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAgUmV2aXNpb24gMS41MDcKKyAqCisgKiBT
aW1wbGlmeSB0aGUgcmVmZXJlbmNlIGNvdW50aW5nIG9mIHBhZ2UgdGFibGUgcGFnZXMuCSBTcGVj
aWZpY2FsbHksIHVzZQorICogdGhlIHBhZ2UgdGFibGUgcGFnZSdzIHdpcmVkIGNvdW50IHJhdGhl
ciB0aGFuIGl0cyBob2xkIGNvdW50IHRvIGNvbnRhaW4KKyAqIHRoZSByZWZlcmVuY2UgY291bnQu
CisgKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSB1bmhvbGRzIHBhZ2UgdGFibGUgcGFnZXMsIGFu
ZCBpZiB0aGUgaG9sZCBjb3VudAorICogZHJvcHMgdG8gemVybywgdGhlbiBpdCBkZWNyZW1lbnRz
IHRoZSB3aXJlIGNvdW50LgorICovCitzdGF0aWMgUE1BUF9JTkxJTkUgaW50CitwbWFwX3Vud2ly
ZV9wdGVfaG9sZChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIHZtX3BhZ2VfdCBtKQorewor
CS0tbS0+d2lyZV9jb3VudDsKKwlpZiAobS0+d2lyZV9jb3VudCA9PSAwKQorCQlyZXR1cm4gKF9w
bWFwX3Vud2lyZV9wdGVfaG9sZChwbWFwLCB2YSwgbSkpOworCWVsc2UKKwkJcmV0dXJuICgwKTsK
K30KKworc3RhdGljIGludAorX3BtYXBfdW53aXJlX3B0ZV9ob2xkKHBtYXBfdCBwbWFwLCB2bV9v
ZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0pCit7CisJcGRfZW50cnlfdCAqcGRlLCAqcGRwOworCXZt
X3BhZ2VfdCBwZHBnOworCisgICAgICAgIFBNQVBfTE9DS19BU1NFUlQocG1hcCwgTUFfT1dORUQp
OworCS8qCisJICogdW5tYXAgdGhlIHBhZ2UgdGFibGUgcGFnZQorCSAqLworCisJaWYgKG0tPnBp
bmRleCA8IE5VUERFKSB7CisJCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJKnBkZSA9IDA7
CisJfSBlbHNlIHsKKwkJcGRlID0gcG1hcF9zZWdtYXAocG1hcCwgdmEpOworCQkqcGRlID0gMDsK
Kwl9CisKKyAgICAgICAgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQtLTsKKworCWlmICht
LT5waW5kZXggPCBOVVBERSkgeworCQkvKgorCQkgKiBSZWN1cnNpdmVseSBkZWNyZW1lbnQgbmV4
dCBsZXZlbCBwYWdldGFibGUgcmVmY291bnQKKwkJICovCisJCWlmIChwbWFwLT5wbV9wdHBoaW50
ID09IG0pCisJCQlwbWFwLT5wbV9wdHBoaW50ID0gTlVMTDsKKworCQlwZHAgPSAocGRfZW50cnlf
dCAqKSpwbWFwX3NlZ21hcChwbWFwLCB2YSk7CisJCXBkcGcgPSBQSFlTX1RPX1ZNX1BBR0UoTUlQ
U19LU0VHMF9UT19QSFlTKHBkcCkpOworCQlwbWFwX3Vud2lyZV9wdGVfaG9sZChwbWFwLCB2YSwg
cGRwZyk7CisJfQorCS8qCisJICogSWYgdGhlIHBhZ2UgaXMgZmluYWxseSB1bndpcmVkLCBzaW1w
bHkgZnJlZSBpdC4KKwkgKi8KKwlwcmludGYoIlslZF0gZnJlZSBwaW5kZXhbJXhdIG0gJXAsIHZh
ICVwXG4iLAorCQljdXJ0aHJlYWQtPnRkX3Byb2MtPnBfcGlkLCAoaW50KW0tPnBpbmRleCwgbSwg
KHZvaWQgKil2YSk7CisKKwl2bV9wYWdlX2ZyZWVfemVybyhtKTsKKwlhdG9taWNfc3VidHJhY3Rf
aW50KCZjbnQudl93aXJlX2NvdW50LCAxKTsKKwlyZXR1cm4gKDEpOworfQorCisvKgorICogQWZ0
ZXIgcmVtb3ZpbmcgYSBwYWdlIHRhYmxlIGVudHJ5LCB0aGlzIHJvdXRpbmUgaXMgdXNlZCB0bwor
ICogY29uZGl0aW9uYWxseSBmcmVlIHRoZSBwYWdlLCBhbmQgbWFuYWdlIHRoZSBob2xkL3dpcmUg
Y291bnRzLgorICovCitzdGF0aWMgaW50CitwbWFwX3VudXNlX3B0KHBtYXBfdCBwbWFwLCB2bV9v
ZmZzZXRfdCB2YSwgdm1fcGFnZV90IG1wdGUpCit7CisJdW5zaWduZWQgcHRlcGluZGV4OworCXBk
X2VudHJ5X3QgcHRldmE7CisKKwlpZiAodmEgPj0gVk1fTUFYVVNFUl9BRERSRVNTKQorCQlyZXR1
cm4gKDApOworCisJaWYgKG1wdGUgPT0gTlVMTCkgeworCQlwdGVwaW5kZXggPSBwbWFwX3BkZV9w
aW5kZXgodmEpOworCQlpZiAocG1hcC0+cG1fcHRwaGludCAmJgorCQkgICAgKHBtYXAtPnBtX3B0
cGhpbnQtPnBpbmRleCA9PSBwdGVwaW5kZXgpKSB7CisJCQltcHRlID0gcG1hcC0+cG1fcHRwaGlu
dDsKKwkJfSBlbHNlIHsKKwkJCXB0ZXZhID0gKnBtYXBfcGRlKHBtYXAsIHZhKTsKKwkJCW1wdGUg
PSBQSFlTX1RPX1ZNX1BBR0UoTUlQU19LU0VHMF9UT19QSFlTKHB0ZXZhKSk7CisJCQlwbWFwLT5w
bV9wdHBoaW50ID0gbXB0ZTsKKwkJfQorCX0KKwlyZXR1cm4gcG1hcF91bndpcmVfcHRlX2hvbGQo
cG1hcCwgdmEsIG1wdGUpOworfQorCit2b2lkCitwbWFwX3Bpbml0MChwbWFwX3QgcG1hcCkKK3sK
KwlpbnQgaTsKKworCVBNQVBfTE9DS19JTklUKHBtYXApOworCXBtYXAtPnBtX3NlZ3RhYiA9IGtl
cm5lbF9zZWdtYXA7CisJcG1hcC0+cG1fYWN0aXZlID0gMDsKKwlwbWFwLT5wbV9wdHBoaW50ID0g
TlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQ1BVOyBpKyspIHsKKwkJcG1hcC0+cG1fYXNpZFtp
XS5hc2lkID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCQlwbWFwLT5wbV9hc2lkW2ldLmdlbiA9IDA7
CisJfQorCVBDUFVfU0VUKGN1cnBtYXAsIHBtYXApOworCVRBSUxRX0lOSVQoJnBtYXAtPnBtX3B2
bGlzdCk7CisJYnplcm8oJnBtYXAtPnBtX3N0YXRzLCBzaXplb2YgcG1hcC0+cG1fc3RhdHMpOwor
fQorCitzdGF0aWMgdm9pZAorcG1hcF9ncm93X3B0ZV9wYWdlX2NhY2hlKCkKK3sKKworCXZtX2Nv
bnRpZ19ncm93X2NhY2hlKDMsIDAsIE1JUFNfS1NFRzBfTEFSR0VTVF9QSFlTKTsKK30KKworc3Rh
dGljIHZtX3BhZ2VfdAorcG1hcF9hbGxvY19wdGVfcGFnZSh1bnNpZ25lZCBpbnQgaW5kZXgsIGlu
dCByZXEpCit7CisJdm1fcGFnZV90IG07CisKKwltID0gdm1fcGFnZV9hbGxvY19mcmVlbGlzdChW
TV9GUkVFTElTVF9ESVJFQ1QsIDAsIHJlcSk7CisJaWYgKG0gPT0gTlVMTCkKKwkJcmV0dXJuIChO
VUxMKTsKKworCWlmICgobS0+ZmxhZ3MgJiBQR19aRVJPKSA9PSAwKQorCQlwbWFwX3plcm9fcGFn
ZShtKTsKKworCW0tPnBpbmRleCA9IGluZGV4OworCWF0b21pY19hZGRfaW50KCZjbnQudl93aXJl
X2NvdW50LCAxKTsKKwltLT53aXJlX2NvdW50ID0gMTsKKwlyZXR1cm4gKG0pOworfQorCisvKgor
ICogSW5pdGlhbGl6ZSBhIHByZWFsbG9jYXRlZCBhbmQgemVyb2VkIHBtYXAgc3RydWN0dXJlLAor
ICogc3VjaCBhcyBvbmUgaW4gYSB2bXNwYWNlIHN0cnVjdHVyZS4KKyAqLworaW50CitwbWFwX3Bp
bml0KHBtYXBfdCBwbWFwKQoreworCXZtX29mZnNldF90IHB0ZHZhOworCXZtX3BhZ2VfdCBwdGRw
ZzsKKwlpbnQgaTsKKworCVBNQVBfTE9DS19JTklUKHBtYXApOworCisJLyoKKwkgKiBhbGxvY2F0
ZSB0aGUgcGFnZSBkaXJlY3RvcnkgcGFnZQorCSAqLworCXdoaWxlICgocHRkcGcgPSBwbWFwX2Fs
bG9jX3B0ZV9wYWdlKE5VU0VSUEdUQkxTLCBWTV9BTExPQ19OT1JNQUwpKSA9PSBOVUxMKQorCSAg
ICAgICBwbWFwX2dyb3dfcHRlX3BhZ2VfY2FjaGUoKTsKKworCXB0ZHZhID0gTUlQU19QSFlTX1RP
X0tTRUcwKFZNX1BBR0VfVE9fUEhZUyhwdGRwZykpOworCXBtYXAtPnBtX3NlZ3RhYiA9IChwZF9l
bnRyeV90ICopcHRkdmE7CisJcG1hcC0+cG1fYWN0aXZlID0gMDsKKwlwbWFwLT5wbV9wdHBoaW50
ID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQ1BVOyBpKyspIHsKKwkJcG1hcC0+cG1fYXNp
ZFtpXS5hc2lkID0gUE1BUF9BU0lEX1JFU0VSVkVEOworCQlwbWFwLT5wbV9hc2lkW2ldLmdlbiA9
IDA7CisJfQorCVRBSUxRX0lOSVQoJnBtYXAtPnBtX3B2bGlzdCk7CisJYnplcm8oJnBtYXAtPnBt
X3N0YXRzLCBzaXplb2YgcG1hcC0+cG1fc3RhdHMpOworCisJcmV0dXJuICgxKTsKK30KKworLyoK
KyAqIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgaWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBub3QK
KyAqIG1hcHBlZCBjb3JyZWN0bHkuCisgKi8KK3N0YXRpYyB2bV9wYWdlX3QKK19wbWFwX2FsbG9j
cHRlKHBtYXBfdCBwbWFwLCB1bnNpZ25lZCBwdGVwaW5kZXgsIGludCBmbGFncykKK3sKKwl2bV9v
ZmZzZXRfdCBwYWdldmE7CisJdm1fcGFnZV90IG07CisJaW50IHBpZCA9IGN1cnRocmVhZC0+dGRf
cHJvYy0+cF9waWQ7CisKKwlLQVNTRVJUKChmbGFncyAmIChNX05PV0FJVCB8IE1fV0FJVE9LKSkg
PT0gTV9OT1dBSVQgfHwKKwkgICAgKGZsYWdzICYgKE1fTk9XQUlUIHwgTV9XQUlUT0spKSA9PSBN
X1dBSVRPSywKKwkgICAgKCJfcG1hcF9hbGxvY3B0ZTogZmxhZ3MgaXMgbmVpdGhlciBNX05PV0FJ
VCBub3IgTV9XQUlUT0siKSk7CisKKwkvKgorCSAqIEZpbmQgb3IgZmFicmljYXRlIGEgbmV3IHBh
Z2V0YWJsZSBwYWdlCisJICovCisJaWYgKChtID0gcG1hcF9hbGxvY19wdGVfcGFnZShwdGVwaW5k
ZXgsIFZNX0FMTE9DX05PUk1BTCkpID09IE5VTEwpIHsKKwkJaWYgKGZsYWdzICYgTV9XQUlUT0sp
IHsKKwkJCVBNQVBfVU5MT0NLKHBtYXApOworCQkJdm1fcGFnZV91bmxvY2tfcXVldWVzKCk7CisJ
CQlwbWFwX2dyb3dfcHRlX3BhZ2VfY2FjaGUoKTsKKwkJCXZtX3BhZ2VfbG9ja19xdWV1ZXMoKTsK
KwkJCVBNQVBfTE9DSyhwbWFwKTsKKwkJfQorCisJCS8qCisJCSAqIEluZGljYXRlIHRoZSBuZWVk
IHRvIHJldHJ5LglXaGlsZSB3YWl0aW5nLCB0aGUgcGFnZQorCQkgKiB0YWJsZSBwYWdlIG1heSBo
YXZlIGJlZW4gYWxsb2NhdGVkLgorCQkgKi8KKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlwYWdl
dmEgPSBNSVBTX1BIWVNfVE9fS1NFRzAoVk1fUEFHRV9UT19QSFlTKG0pKTsKKwlwcmludGYoIl9w
bWFwX2FsbG9jcHRlOiBpbmRleCAleCAoJWx4KSwgZmxhZ3MgJXggcGFnZXZhICVseFxuIiwKKwkJ
CXB0ZXBpbmRleCwgTlVQREUsIGZsYWdzLCAodV9sb25nKXBhZ2V2YSk7CisJLyoKKwkgKiBNYXAg
dGhlIHBhZ2V0YWJsZSBwYWdlIGludG8gdGhlIHByb2Nlc3MgYWRkcmVzcyBzcGFjZSwgaWYgaXQK
KwkgKiBpc24ndCBhbHJlYWR5IHRoZXJlLgorCSAqLworCWlmIChwdGVwaW5kZXggPj0gTlVQREUp
IHsKKwkJcG1hcC0+cG1fc2VndGFiW3B0ZXBpbmRleCAtIE5VUERFXSA9IChwZF9lbnRyeV90KXBh
Z2V2YTsKKwkJaWYoMClwcmludGYoIlslZF1zZWd0YWJbJWx1XSA9ICVwXG4iLCBwaWQsIHB0ZXBp
bmRleCAtIE5VUERFLCAodm9pZCAqKXBhZ2V2YSk7CisJfSBlbHNlIHsKKwkJcGRfZW50cnlfdCAq
cGRlcCwgKnBkZTsKKwkJaW50IHNlZ2luZGV4ID0gcHRlcGluZGV4ID4+IChTRUdTSElGVCAtIFBE
UlNISUZUKTsKKwkJaW50IHBkZWluZGV4ID0gcHRlcGluZGV4ICYgKE5QREVQRyAtIDEpOworCQl2
bV9wYWdlX3QgcGc7CisJCQorCQlwZGVwID0gJnBtYXAtPnBtX3NlZ3RhYltzZWdpbmRleF07CisJ
CWlmICgqcGRlcCA9PSBOVUxMKSB7IAorCQkJLyogcmVjdXJzZSBmb3IgYWxsb2NhdGluZyBwYWdl
IGRpciAqLworCQkJaWYgKF9wbWFwX2FsbG9jcHRlKHBtYXAsIE5VUERFICsgc2VnaW5kZXgsIAor
CQkJICAgIGZsYWdzKSA9PSBOVUxMKSB7CisJCQkJLyogYWxsb2MgZmFpbGVkLCByZWxlYXNlIGN1
cnJlbnQgKi8KKwkJCQktLW0tPndpcmVfY291bnQ7CisJCQkJYXRvbWljX3N1YnRyYWN0X2ludCgm
Y250LnZfd2lyZV9jb3VudCwgMSk7CisJCQkJdm1fcGFnZV9mcmVlX3plcm8obSk7CisJCQkJcmV0
dXJuIChOVUxMKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXBnID0gUEhZU19UT19WTV9QQUdFKE1J
UFNfS1NFRzBfVE9fUEhZUygqcGRlcCkpOworCQkJcGctPndpcmVfY291bnQrKzsKKwkJfQorCQkv
KiBOZXh0IGxldmVsIGVudHJ5ICovCisJCXBkZSA9IChwZF9lbnRyeV90ICopKnBkZXA7CisJCXBk
ZVtwZGVpbmRleF0gPSAocGRfZW50cnlfdClwYWdldmE7CisJCXBtYXAtPnBtX3B0cGhpbnQgPSBt
OworCQlpZigwKXByaW50ZigiWyVkXSBwZGUoJXApWyVkXSA9ICVwXG4iLCBwaWQsIHBkZSwgcGRl
aW5kZXgsICh2b2lkICopcGFnZXZhKTsKKwl9CisJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291
bnQrKzsKKworCS8qCisJICogU2V0IHRoZSBwYWdlIHRhYmxlIGhpbnQKKwkgKi8KKwlwbWFwLT5w
bV9wdHBoaW50ID0gbTsKKwlyZXR1cm4gKG0pOworfQorCitzdGF0aWMgdm1fcGFnZV90CitwbWFw
X2FsbG9jcHRlKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgaW50IGZsYWdzKQoreworCXVu
c2lnbmVkIHB0ZXBpbmRleDsKKwlwZF9lbnRyeV90ICpwZGU7CisJdm1fcGFnZV90IG07CisKKwlL
QVNTRVJUKChmbGFncyAmIChNX05PV0FJVCB8IE1fV0FJVE9LKSkgPT0gTV9OT1dBSVQgfHwKKwkg
ICAgKGZsYWdzICYgKE1fTk9XQUlUIHwgTV9XQUlUT0spKSA9PSBNX1dBSVRPSywKKwkgICAgKCJw
bWFwX2FsbG9jcHRlOiBmbGFncyBpcyBuZWl0aGVyIE1fTk9XQUlUIG5vciBNX1dBSVRPSyIpKTsK
KworCS8qCisJICogQ2FsY3VsYXRlIHBhZ2V0YWJsZSBwYWdlIGluZGV4CisJICovCisJcHRlcGlu
ZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKK3JldHJ5OgorCS8qCisJICogR2V0IHRoZSBwYWdl
IGRpcmVjdG9yeSBlbnRyeQorCSAqLworCXBkZSA9IHBtYXBfcGRlKHBtYXAsIHZhKTsKKworCS8q
CisJICogSWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBpcyBtYXBwZWQsIHdlIGp1c3QgaW5jcmVtZW50
IHRoZSBob2xkCisJICogY291bnQsIGFuZCBhY3RpdmF0ZSBpdC4KKwkgKi8KKwlpZiAocGRlICE9
IE5VTEwgJiYgKnBkZSAhPSBOVUxMKSB7CisJCS8qCisJCSAqIEluIG9yZGVyIHRvIGdldCB0aGUg
cGFnZSB0YWJsZSBwYWdlLCB0cnkgdGhlIGhpbnQgZmlyc3QuCisJCSAqLworCQlpZiAocG1hcC0+
cG1fcHRwaGludCAmJgorCQkgICAgKHBtYXAtPnBtX3B0cGhpbnQtPnBpbmRleCA9PSBwdGVwaW5k
ZXgpKSB7CisJCQltID0gcG1hcC0+cG1fcHRwaGludDsKKwkJfSBlbHNlIHsKKwkJCW0gPSBQSFlT
X1RPX1ZNX1BBR0UoTUlQU19LU0VHMF9UT19QSFlTKCpwZGUpKTsKKwkJCXBtYXAtPnBtX3B0cGhp
bnQgPSBtOworCQl9CisJCW0tPndpcmVfY291bnQrKzsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBI
ZXJlIGlmIHRoZSBwdGUgcGFnZSBpc24ndCBtYXBwZWQsIG9yIGlmIGl0IGhhcyBiZWVuCisJCSAq
IGRlYWxsb2NhdGVkLgorCQkgKi8KKwkJbSA9IF9wbWFwX2FsbG9jcHRlKHBtYXAsIHB0ZXBpbmRl
eCwgZmxhZ3MpOworCQlpZiAobSA9PSBOVUxMICYmIChmbGFncyAmIE1fV0FJVE9LKSkKKwkJCWdv
dG8gcmV0cnk7CisJfQorCXJldHVybiAobSk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBQbWFwIGFsbG9jYXRpb24vZGVhbGxv
Y2F0aW9uIHJvdXRpbmVzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKi8KKy8qCisgKiAgUmV2aXNpb24gMS4zOTcKKyAqICAtIE1lcmdlZCBwbWFw
X3JlbGVhc2UgYW5kIHBtYXBfcmVsZWFzZV9mcmVlX3BhZ2UuICBXaGVuIHBtYXBfcmVsZWFzZSBp
cworICogICAgY2FsbGVkIG9ubHkgdGhlIHBhZ2UgZGlyZWN0b3J5IHBhZ2UocykgY2FuIGJlIGxl
ZnQgaW4gdGhlIHBtYXAgcHRlCisgKiAgICBvYmplY3QsIHNpbmNlIGFsbCBwYWdlIHRhYmxlIHBh
Z2VzIHdpbGwgaGF2ZSBiZWVuIGZyZWVkIGJ5CisgKiAgICBwbWFwX3JlbW92ZV9wYWdlcyBhbmQg
cG1hcF9yZW1vdmUuICBJbiBhZGRpdGlvbiwgdGhlcmUgY2FuIG9ubHkgYmUgb25lCisgKiAgICBy
ZWZlcmVuY2UgdG8gdGhlIHBtYXAgYW5kIHRoZSBwYWdlIGRpcmVjdG9yeSBpcyB3aXJlZCwgc28g
dGhlIHBhZ2UocykKKyAqICAgIGNhbiBuZXZlciBiZSBidXN5LiAgU28gYWxsIHRoZXJlIGlzIHRv
IGRvIGlzIGNsZWFyIHRoZSBtYWdpYyBtYXBwaW5ncworICogICAgZnJvbSB0aGUgcGFnZSBkaXJl
Y3RvcnkgYW5kIGZyZWUgdGhlIHBhZ2UocykuCisgKi8KKworCisvKgorICogUmVsZWFzZSBhbnkg
cmVzb3VyY2VzIGhlbGQgYnkgdGhlIGdpdmVuIHBoeXNpY2FsIG1hcC4KKyAqIENhbGxlZCB3aGVu
IGEgcG1hcCBpbml0aWFsaXplZCBieSBwbWFwX3Bpbml0IGlzIGJlaW5nIHJlbGVhc2VkLgorICog
U2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBtYXAgY29udGFpbnMgbm8gdmFsaWQgbWFwcGlu
Z3MuCisgKi8KK3ZvaWQKK3BtYXBfcmVsZWFzZShwbWFwX3QgcG1hcCkKK3sKKwl2bV9vZmZzZXRf
dCBwdGR2YTsKKwl2bV9wYWdlX3QgcHRkcGc7CisKKwlLQVNTRVJUKHBtYXAtPnBtX3N0YXRzLnJl
c2lkZW50X2NvdW50ID09IDAsCisJICAgICgicG1hcF9yZWxlYXNlOiBwbWFwIHJlc2lkZW50IGNv
dW50ICVsZCAhPSAwIiwKKwkgICAgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQpKTsKKwor
CXB0ZHZhID0gKHZtX29mZnNldF90KXBtYXAtPnBtX3NlZ3RhYjsKKwlwdGRwZyA9IFBIWVNfVE9f
Vk1fUEFHRShNSVBTX0tTRUcwX1RPX1BIWVMocHRkdmEpKTsKKworCXB0ZHBnLT53aXJlX2NvdW50
LS07CisJYXRvbWljX3N1YnRyYWN0X2ludCgmY250LnZfd2lyZV9jb3VudCwgMSk7CisJdm1fcGFn
ZV9mcmVlX3plcm8ocHRkcGcpOworCVBNQVBfTE9DS19ERVNUUk9ZKHBtYXApOworfQorCisvKgor
ICogZ3JvdyB0aGUgbnVtYmVyIG9mIGtlcm5lbCBwYWdlIHRhYmxlIGVudHJpZXMsIGlmIG5lZWRl
ZAorICovCit2b2lkCitwbWFwX2dyb3drZXJuZWwodm1fb2Zmc2V0X3QgYWRkcikKK3sKKwl2bV9w
YWdlX3QgbmtwZzsKKwlwdF9lbnRyeV90ICpwdGU7CisJcGRfZW50cnlfdCAqcGRwZSwgKnBkZTsK
KwlpbnQgaTsKKworCWlmICgwKSBwcmludGYoInBtYXBfZ3Jvd2tlcm5lbCwgYWRkciAlbHggbWF4
X29mZnNldCAlbHgsIGtlcm5lbF92bV9lbmQgJWx4LCBua3B0ICVkXG4iLAorCSAgICAgICAodV9s
b25nKWFkZHIsICh1X2xvbmcpa2VybmVsX21hcC0+bWF4X29mZnNldCwgKHVfbG9uZylrZXJuZWxf
dm1fZW5kLCBua3B0KTsKKwltdHhfYXNzZXJ0KCZrZXJuZWxfbWFwLT5zeXN0ZW1fbXR4LCBNQV9P
V05FRCk7CisJYWRkciA9IHJvdW5kdXAyKGFkZHIsIFBBR0VfU0laRSAqIE5QVEVQRyk7CisJaWYg
KGFkZHIgLSAxID49IGtlcm5lbF9tYXAtPm1heF9vZmZzZXQpCisJCWFkZHIgPSBrZXJuZWxfbWFw
LT5tYXhfb2Zmc2V0OworCXdoaWxlIChrZXJuZWxfdm1fZW5kIDwgYWRkcikgeworCQlwZHBlID0g
cG1hcF9zZWdtYXAoa2VybmVsX3BtYXAsIGtlcm5lbF92bV9lbmQpOworCQlpZiAoKnBkcGUgPT0g
MCkgeworCQkJLyogbmV3IGludGVybWVkaWF0ZSBwYWdlIHRhYmxlIGVudHJ5ICovCisJCQlua3Bn
ID0gcG1hcF9hbGxvY19wdGVfcGFnZShua3B0LCBWTV9BTExPQ19JTlRFUlJVUFQpOworCQkJaWYg
KG5rcGcgPT0gTlVMTCkKKwkJCQlwYW5pYygicG1hcF9ncm93a2VybmVsOiBubyBtZW1vcnkgdG8g
Z3JvdyBrZXJuZWwiKTsKKwkJCSpwZHBlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0tTRUcw
KFZNX1BBR0VfVE9fUEhZUyhua3BnKSk7CisJCQljb250aW51ZTsgLyogdHJ5IGFnYWluICovCisJ
CX0KKworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUsIGtlcm5lbF92bV9lbmQpOworCQlp
ZiAoKnBkZSAhPSAwKSB7CisJCQlrZXJuZWxfdm1fZW5kID0gKGtlcm5lbF92bV9lbmQgKyBOQlBE
UikgJiB+UERSTUFTSzsKKwkJCWlmIChrZXJuZWxfdm1fZW5kIC0gMSA+PSBrZXJuZWxfbWFwLT5t
YXhfb2Zmc2V0KSB7CisJCQkJa2VybmVsX3ZtX2VuZCA9IGtlcm5lbF9tYXAtPm1heF9vZmZzZXQ7
CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMg
aW5kZXggaXMgYm9ndXMsIGJ1dCBvdXQgb2YgdGhlIHdheQorCQkqLworCQlua3BnID0gcG1hcF9h
bGxvY19wdGVfcGFnZShua3B0LCBWTV9BTExPQ19JTlRFUlJVUFQpOworCQlpZiAoIW5rcGcpCisJ
CQlwYW5pYygicG1hcF9ncm93a2VybmVsOiBubyBtZW1vcnkgdG8gZ3JvdyBrZXJuZWwiKTsKKwkJ
bmtwdCsrOworCQkqcGRlID0gKHBkX2VudHJ5X3QpTUlQU19QSFlTX1RPX0tTRUcwKFZNX1BBR0Vf
VE9fUEhZUyhua3BnKSk7CisKKwkJLyoKKwkJICogVGhlIFJbNC03XT8wMCBzdG9yZXMgb25seSBv
bmUgY29weSBvZiB0aGUgR2xvYmFsIGJpdCBpbgorCQkgKiB0aGUgdHJhbnNsYXRpb24gbG9va2Fz
aWRlIGJ1ZmZlciBmb3IgZWFjaCAyIHBhZ2UgZW50cnkuCisJCSAqIFRodXMgaW52YWxpZCBlbnRy
eXMgbXVzdCBoYXZlIHRoZSBHbG9iYWwgYml0IHNldCBzbyB3aGVuCisJCSAqIEVudHJ5IExPIGFu
ZCBFbnRyeSBISSBHIGJpdHMgYXJlIGFuZGVkIHRvZ2V0aGVyIHRoZXkgd2lsbAorCQkgKiBwcm9k
dWNlIGEgZ2xvYmFsIGJpdCB0byBzdG9yZSBpbiB0aGUgdGxiLgorCQkgKi8KKwkJcHRlID0gKHB0
X2VudHJ5X3QgKikqcGRlOworCQlmb3IgKGkgPSAwOyBpIDwgTlBURVBHOyBpKyspCisJCQlwdGVb
aV0gPSBQVEVfRzsKKworCQlrZXJuZWxfdm1fZW5kID0gKGtlcm5lbF92bV9lbmQgKyBOQlBEUikg
JiB+UERSTUFTSzsKKwkJaWYgKGtlcm5lbF92bV9lbmQgLSAxID49IGtlcm5lbF9tYXAtPm1heF9v
ZmZzZXQpIHsKKwkJCWtlcm5lbF92bV9lbmQgPSBrZXJuZWxfbWFwLT5tYXhfb2Zmc2V0OworCQkJ
YnJlYWs7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioKKyogcGFnZSBtYW5hZ2VtZW50IHJvdXRpbmVzLgorICoqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIGZy
ZWUgdGhlIHB2X2VudHJ5IGJhY2sgdG8gdGhlIGZyZWUgbGlzdAorICovCitzdGF0aWMgUE1BUF9J
TkxJTkUgdm9pZAorZnJlZV9wdl9lbnRyeShwdl9lbnRyeV90IHB2KQoreworCisJcHZfZW50cnlf
Y291bnQtLTsKKwl1bWFfemZyZWUocHZ6b25lLCBwdik7Cit9CisKKy8qCisgKiBnZXQgYSBuZXcg
cHZfZW50cnksIGFsbG9jYXRpbmcgYSBibG9jayBmcm9tIHRoZSBzeXN0ZW0KKyAqIHdoZW4gbmVl
ZGVkLgorICogdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGlzIHBlcmZvcm1lZCBieXBhc3NpbmcgdGhl
IG1hbGxvYyBjb2RlCisgKiBiZWNhdXNlIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBhbGxvY2F0aW9u
cyBhdCBpbnRlcnJ1cHQgdGltZS4KKyAqLworc3RhdGljIHB2X2VudHJ5X3QKK2dldF9wdl9lbnRy
eShwbWFwX3QgbG9ja2VkX3BtYXApCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCB0aW1ldmFsIHBy
aW50aW50ZXJ2YWwgPSB7IDYwLCAwIH07CisJc3RhdGljIHN0cnVjdCB0aW1ldmFsIGxhc3Rwcmlu
dDsKKwlzdHJ1Y3QgdnBncXVldWVzICp2cHE7CisJcHRfZW50cnlfdCAqcHRlLCBvbGRwdGU7CisJ
cG1hcF90IHBtYXA7CisJcHZfZW50cnlfdCBhbGxvY2F0ZWRfcHYsIG5leHRfcHYsIHB2OworCXZt
X29mZnNldF90IHZhOworCXZtX3BhZ2VfdCBtOworCisJUE1BUF9MT0NLX0FTU0VSVChsb2NrZWRf
cG1hcCwgTUFfT1dORUQpOworCW10eF9hc3NlcnQoJnZtX3BhZ2VfcXVldWVfbXR4LCBNQV9PV05F
RCk7CisJYWxsb2NhdGVkX3B2ID0gdW1hX3phbGxvYyhwdnpvbmUsIE1fTk9XQUlUKTsKKwlpZiAo
YWxsb2NhdGVkX3B2ICE9IE5VTEwpIHsKKwkJcHZfZW50cnlfY291bnQrKzsKKwkJaWYgKHB2X2Vu
dHJ5X2NvdW50ID4gcHZfZW50cnlfaGlnaF93YXRlcikKKwkJCXBhZ2VkYWVtb25fd2FrZXVwKCk7
CisJCWVsc2UKKwkJCXJldHVybiAoYWxsb2NhdGVkX3B2KTsKKwl9CisJLyoKKwkgKiBSZWNsYWlt
IHB2IGVudHJpZXM6IEF0IGZpcnN0LCBkZXN0cm95IG1hcHBpbmdzIHRvIGluYWN0aXZlCisJICog
cGFnZXMuICBBZnRlciB0aGF0LCBpZiBhIHB2IGVudHJ5IGlzIHN0aWxsIG5lZWRlZCwgZGVzdHJv
eQorCSAqIG1hcHBpbmdzIHRvIGFjdGl2ZSBwYWdlcy4KKwkgKi8KKwlpZiAocmF0ZWNoZWNrKCZs
YXN0cHJpbnQsICZwcmludGludGVydmFsKSkKKwkJcHJpbnRmKCJBcHByb2FjaGluZyB0aGUgbGlt
aXQgb24gUFYgZW50cmllcywgIgorCQkgICAgImluY3JlYXNlIHRoZSB2bS5wbWFwLnNocGdwZXJw
cm9jIHR1bmFibGUuXG4iKTsKKwl2cHEgPSAmdm1fcGFnZV9xdWV1ZXNbUFFfSU5BQ1RJVkVdOwor
cmV0cnk6CisJVEFJTFFfRk9SRUFDSChtLCAmdnBxLT5wbCwgcGFnZXEpIHsKKwkJaWYgKG0tPmhv
bGRfY291bnQgfHwgbS0+YnVzeSkKKwkJCWNvbnRpbnVlOworCQlUQUlMUV9GT1JFQUNIX1NBRkUo
cHYsICZtLT5tZC5wdl9saXN0LCBwdl9saXN0LCBuZXh0X3B2KSB7CisJCQl2YSA9IHB2LT5wdl92
YTsKKwkJCXBtYXAgPSBwdi0+cHZfcG1hcDsKKwkJCS8qIEF2b2lkIGRlYWRsb2NrIGFuZCBsb2Nr
IHJlY3Vyc2lvbi4gKi8KKwkJCWlmIChwbWFwID4gbG9ja2VkX3BtYXApCisJCQkJUE1BUF9MT0NL
KHBtYXApOworCQkJZWxzZSBpZiAocG1hcCAhPSBsb2NrZWRfcG1hcCAmJiAhUE1BUF9UUllMT0NL
KHBtYXApKQorCQkJCWNvbnRpbnVlOworCQkJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQt
LTsKKwkJCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIHZhKTsKKwkJCUtBU1NFUlQocHRlICE9IE5VTEws
ICgicHRlIikpOworCQkJb2xkcHRlID0gbG9hZGFuZGNsZWFyKCh1X2ludCAqKXB0ZSk7CisJCQlp
ZiAoaXNfa2VybmVsX3BtYXAocG1hcCkpCisJCQkJKnB0ZSA9IFBURV9HOworCQkJS0FTU0VSVCgh
cHRlX3Rlc3QoJm9sZHB0ZSwgUFRFX1cpLAorCQkJICAgICgid2lyZWQgcHRlIGZvciB1bndpcmVk
IHBhZ2UiKSk7CisJCQlpZiAobS0+bWQucHZfZmxhZ3MgJiBQVl9UQUJMRV9SRUYpCisJCQkJdm1f
cGFnZV9mbGFnX3NldChtLCBQR19SRUZFUkVOQ0VEKTsKKwkJCWlmIChwdGVfdGVzdCgmb2xkcHRl
LCBQVEVfRCkpCisJCQkJdm1fcGFnZV9kaXJ0eShtKTsKKwkJCXBtYXBfaW52YWxpZGF0ZV9wYWdl
KHBtYXAsIHZhKTsKKwkJCVRBSUxRX1JFTU9WRSgmcG1hcC0+cG1fcHZsaXN0LCBwdiwgcHZfcGxp
c3QpOworCQkJbS0+bWQucHZfbGlzdF9jb3VudC0tOworCQkJVEFJTFFfUkVNT1ZFKCZtLT5tZC5w
dl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCQlwbWFwX3VudXNlX3B0KHBtYXAsIHZhLCBwdi0+cHZf
cHRlbSk7CisJCQlpZiAocG1hcCAhPSBsb2NrZWRfcG1hcCkKKwkJCQlQTUFQX1VOTE9DSyhwbWFw
KTsKKwkJCWlmIChhbGxvY2F0ZWRfcHYgPT0gTlVMTCkKKwkJCQlhbGxvY2F0ZWRfcHYgPSBwdjsK
KwkJCWVsc2UKKwkJCQlmcmVlX3B2X2VudHJ5KHB2KTsKKwkJfQorCQlpZiAoVEFJTFFfRU1QVFko
Jm0tPm1kLnB2X2xpc3QpKSB7CisJCQl2bV9wYWdlX2ZsYWdfY2xlYXIobSwgUEdfV1JJVEVBQkxF
KTsKKwkJCW0tPm1kLnB2X2ZsYWdzICY9IH4oUFZfVEFCTEVfUkVGIHwgUFZfVEFCTEVfTU9EKTsK
KwkJfQorCX0KKwlpZiAoYWxsb2NhdGVkX3B2ID09IE5VTEwpIHsKKwkJaWYgKHZwcSA9PSAmdm1f
cGFnZV9xdWV1ZXNbUFFfSU5BQ1RJVkVdKSB7CisJCQl2cHEgPSAmdm1fcGFnZV9xdWV1ZXNbUFFf
QUNUSVZFXTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJcGFuaWMoImdldF9wdl9lbnRyeTogaW5j
cmVhc2UgdGhlIHZtLnBtYXAuc2hwZ3BlcnByb2MgdHVuYWJsZSIpOworCX0KKwlyZXR1cm4gKGFs
bG9jYXRlZF9wdik7Cit9CisKKy8qCisgKiAgUmV2aXNpb24gMS4zNzAKKyAqCisgKiAgTW92ZSBw
bWFwX2NvbGxlY3QoKSBvdXQgb2YgdGhlIG1hY2hpbmUtZGVwZW5kZW50IGNvZGUsIHJlbmFtZSBp
dAorICogIHRvIHJlZmxlY3QgaXRzIG5ldyBsb2NhdGlvbiwgYW5kIGFkZCBwYWdlIHF1ZXVlIGFu
ZCBmbGFnIGxvY2tpbmcuCisgKgorICogIE5vdGVzOiAoMSkgYWxwaGEsIGkzODYsIGFuZCBpYTY0
IGhhZCBpZGVudGljYWwgaW1wbGVtZW50YXRpb25zCisgKiAgb2YgcG1hcF9jb2xsZWN0KCkgaW4g
dGVybXMgb2YgbWFjaGluZS1pbmRlcGVuZGVudCBpbnRlcmZhY2VzOworICogICgyKSBzcGFyYzY0
IGRvZXNuJ3QgcmVxdWlyZSBpdDsgKDMpIHBvd2VycGMgaGFkIGl0IGFzIGEgVE9ETy4KKyAqCisg
KiAgTUlQUyBpbXBsZW1lbnRhdGlvbiB3YXMgaWRlbnRpY2FsIHRvIGFscGhhIFtKdW5vcyA4LjJd
CisgKi8KKworLyoKKyAqIElmIGl0IGlzIHRoZSBmaXJzdCBlbnRyeSBvbiB0aGUgbGlzdCwgaXQg
aXMgYWN0dWFsbHkKKyAqIGluIHRoZSBoZWFkZXIgYW5kIHdlIG11c3QgY29weSB0aGUgZm9sbG93
aW5nIGVudHJ5IHVwCisgKiB0byB0aGUgaGVhZGVyLiAgT3RoZXJ3aXNlIHdlIG11c3Qgc2VhcmNo
IHRoZSBsaXN0IGZvcgorICogdGhlIGVudHJ5LiAgSW4gZWl0aGVyIGNhc2Ugd2UgZnJlZSB0aGUg
bm93IHVudXNlZCBlbnRyeS4KKyAqLworCitzdGF0aWMgcHZfZW50cnlfdAorcG1hcF9wdmhfcmVt
b3ZlKHN0cnVjdCBtZF9wYWdlICpwdmgsIHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSkKK3sK
Kwlwdl9lbnRyeV90IHB2OworCisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisJ
bXR4X2Fzc2VydCgmdm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwlpZiAocHZoLT5wdl9s
aXN0X2NvdW50IDwgcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291bnQpIHsKKwkJVEFJTFFfRk9S
RUFDSChwdiwgJnB2aC0+cHZfbGlzdCwgcHZfbGlzdCkgeworCQkJaWYgKHBtYXAgPT0gcHYtPnB2
X3BtYXAgJiYgdmEgPT0gcHYtPnB2X3ZhKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJ
VEFJTFFfRk9SRUFDSChwdiwgJnBtYXAtPnBtX3B2bGlzdCwgcHZfcGxpc3QpIHsKKwkJCWlmICh2
YSA9PSBwdi0+cHZfdmEpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHB2ICE9IE5VTEwpIHsK
KwkJVEFJTFFfUkVNT1ZFKCZwdmgtPnB2X2xpc3QsIHB2LCBwdl9saXN0KTsKKwkJcHZoLT5wdl9s
aXN0X2NvdW50LS07CisJCVRBSUxRX1JFTU9WRSgmcG1hcC0+cG1fcHZsaXN0LCBwdiwgcHZfcGxp
c3QpOworCX0KKwlyZXR1cm4gKHB2KTsKK30KKworc3RhdGljIHZvaWQKK3BtYXBfcHZoX2ZyZWUo
c3RydWN0IG1kX3BhZ2UgKnB2aCwgcG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQoreworCXB2
X2VudHJ5X3QgcHY7CisKKwlwdiA9IHBtYXBfcHZoX3JlbW92ZShwdmgsIHBtYXAsIHZhKTsKKwlL
QVNTRVJUKHB2ICE9IE5VTEwsICgicG1hcF9wdmhfZnJlZTogcHYgbm90IGZvdW5kLCBwYSAlbHgg
dmEgJWx4IiwKKwkgICAgICh1X2xvbmcpVk1fUEFHRV9UT19QSFlTKG1lbWJlcjJzdHJ1Y3Qodm1f
cGFnZSwgbWQsIHB2aCkpLAorCSAgICAgKHVfbG9uZyl2YSkpOworCWZyZWVfcHZfZW50cnkocHYp
OworfQorCitzdGF0aWMgdm9pZAorcG1hcF9yZW1vdmVfZW50cnkocG1hcF90IHBtYXAsIHZtX3Bh
Z2VfdCBtLCB2bV9vZmZzZXRfdCB2YSkKK3sKKworCW10eF9hc3NlcnQoJnZtX3BhZ2VfcXVldWVf
bXR4LCBNQV9PV05FRCk7CisJcG1hcF9wdmhfZnJlZSgmbS0+bWQsIHBtYXAsIHZhKTsKKwlpZiAo
VEFJTFFfRU1QVFkoJm0tPm1kLnB2X2xpc3QpKQorCQl2bV9wYWdlX2ZsYWdfY2xlYXIobSwgUEdf
V1JJVEVBQkxFKTsKK30KKworLyoKKyAqIENvbmRpdGlvbmFsbHkgY3JlYXRlIGEgcHYgZW50cnku
CisgKi8KK3N0YXRpYyBib29sZWFuX3QKK3BtYXBfdHJ5X2luc2VydF9wdl9lbnRyeShwbWFwX3Qg
cG1hcCwgdm1fcGFnZV90IG1wdGUsIHZtX29mZnNldF90IHZhLAorICAgIHZtX3BhZ2VfdCBtKQor
eworCXB2X2VudHJ5X3QgcHY7CisKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1BX09XTkVEKTsK
KwltdHhfYXNzZXJ0KCZ2bV9wYWdlX3F1ZXVlX210eCwgTUFfT1dORUQpOworCWlmIChwdl9lbnRy
eV9jb3VudCA8IHB2X2VudHJ5X2hpZ2hfd2F0ZXIgJiYgCisJICAgIChwdiA9IHVtYV96YWxsb2Mo
cHZ6b25lLCBNX05PV0FJVCkpICE9IE5VTEwpIHsKKwkJcHZfZW50cnlfY291bnQrKzsKKwkJcHYt
PnB2X3ZhID0gdmE7CisJCXB2LT5wdl9wbWFwID0gcG1hcDsKKwkJcHYtPnB2X3B0ZW0gPSBtcHRl
OworCQlwdi0+cHZfd2lyZWQgPSBGQUxTRTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJnBtYXAtPnBt
X3B2bGlzdCwgcHYsIHB2X3BsaXN0KTsKKwkJVEFJTFFfSU5TRVJUX1RBSUwoJm0tPm1kLnB2X2xp
c3QsIHB2LCBwdl9saXN0KTsKKwkJbS0+bWQucHZfbGlzdF9jb3VudCsrOworCQlyZXR1cm4gKFRS
VUUpOworCX0gZWxzZQorCQlyZXR1cm4gKEZBTFNFKTsKK30KKworLyoKKyAqIHBtYXBfcmVtb3Zl
X3B0ZTogZG8gdGhlIHRoaW5ncyB0byB1bm1hcCBhIHBhZ2UgaW4gYSBwcm9jZXNzCisgKi8KK3N0
YXRpYyBpbnQKK3BtYXBfcmVtb3ZlX3B0ZShzdHJ1Y3QgcG1hcCAqcG1hcCwgcHRfZW50cnlfdCAq
cHRxLCB2bV9vZmZzZXRfdCB2YSkKK3sKKwlwdF9lbnRyeV90IG9sZHB0ZTsKKwl2bV9wYWdlX3Qg
bTsKKwl2bV9vZmZzZXRfdCBwYTsKKworCW10eF9hc3NlcnQoJnZtX3BhZ2VfcXVldWVfbXR4LCBN
QV9PV05FRCk7CisJUE1BUF9MT0NLX0FTU0VSVChwbWFwLCBNQV9PV05FRCk7CisKKwlvbGRwdGUg
PSBsb2FkYW5kY2xlYXIoKHVfaW50ICopcHRxKTsKKwlpZiAoaXNfa2VybmVsX3BtYXAocG1hcCkp
CisJCSpwdHEgPSBQVEVfRzsKKworCWlmIChwdGVfdGVzdCgmb2xkcHRlLCBQVEVfVykpCisJCXBt
YXAtPnBtX3N0YXRzLndpcmVkX2NvdW50IC09IDE7CisKKwlwbWFwLT5wbV9zdGF0cy5yZXNpZGVu
dF9jb3VudCAtPSAxOworCXBhID0gVExCTE9fUFRFX1RPX1BBKG9sZHB0ZSk7CisKKwlpZiAocGFn
ZV9pc19tYW5hZ2VkKHBhKSkgeworCQltID0gUEhZU19UT19WTV9QQUdFKHBhKTsKKwkJaWYgKHB0
ZV90ZXN0KCZvbGRwdGUsIFBURV9EKSkgeworI2lmIGRlZmluZWQoUE1BUF9ESUFHTk9TVElDKQor
CQkJaWYgKHBtYXBfbndfbW9kaWZpZWQob2xkcHRlKSkgeworCQkJCXByaW50ZigKKwkJCQkgICAg
InBtYXBfcmVtb3ZlOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6IDB4JXgsIHB0ZTog
MHgleFxuIiwKKwkJCQkgICAgdmEsIG9sZHB0ZSk7CisJCQl9CisjZW5kaWYKKwkJCXZtX3BhZ2Vf
ZGlydHkobSk7CisJCX0KKwkJaWYgKG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQorCQkJ
dm1fcGFnZV9mbGFnX3NldChtLCBQR19SRUZFUkVOQ0VEKTsKKwkJbS0+bWQucHZfZmxhZ3MgJj0g
fihQVl9UQUJMRV9SRUYgfCBQVl9UQUJMRV9NT0QpOworCisJCXBtYXBfcmVtb3ZlX2VudHJ5KHBt
YXAsIG0sIHZhKTsKKwl9CisJcmV0dXJuIHBtYXBfdW51c2VfcHQocG1hcCwgdmEsIE5VTEwpOwor
fQorCisvKgorICogUmVtb3ZlIGEgc2luZ2xlIHBhZ2UgZnJvbSBhIHByb2Nlc3MgYWRkcmVzcyBz
cGFjZQorICovCitzdGF0aWMgdm9pZAorcG1hcF9yZW1vdmVfcGFnZShzdHJ1Y3QgcG1hcCAqcG1h
cCwgdm1fb2Zmc2V0X3QgdmEpCit7CisJcHRfZW50cnlfdCAqcHRxOworCisJbXR4X2Fzc2VydCgm
dm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1B
X09XTkVEKTsKKwlwdHEgPSBwbWFwX3B0ZShwbWFwLCB2YSk7CisKKwkvKgorCSAqIGlmIHRoZXJl
IGlzIG5vIHB0ZSBmb3IgdGhpcyBhZGRyZXNzLCBqdXN0IHNraXAgaXQhISEKKwkgKi8KKwlpZiAo
IXB0cSB8fCAhcHRlX3Rlc3QocHRxLCBQVEVfVikpIHsKKwkJcmV0dXJuOworCX0KKworCS8qCisJ
ICogV3JpdGUgYmFjayBhbGwgY2FjaGVzIGZyb20gdGhlIHBhZ2UgYmVpbmcgZGVzdHJveWVkCisJ
ICovCisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgodmEsIFBBR0VfU0laRSk7CisKKwkv
KgorCSAqIGdldCBhIGxvY2FsIHZhIGZvciBtYXBwaW5ncyBmb3IgdGhpcyBwbWFwLgorCSAqLwor
CSh2b2lkKXBtYXBfcmVtb3ZlX3B0ZShwbWFwLCBwdHEsIHZhKTsKKwlwbWFwX2ludmFsaWRhdGVf
cGFnZShwbWFwLCB2YSk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKglSZW1vdmUgdGhlIGdpdmVu
IHJhbmdlIG9mIGFkZHJlc3NlcyBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwLgorICoKKyAqCUl0IGlz
IGFzc3VtZWQgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBhcmUgcHJvcGVybHkKKyAqCXJvdW5kZWQg
dG8gdGhlIHBhZ2Ugc2l6ZS4KKyAqLwordm9pZAorcG1hcF9yZW1vdmUoc3RydWN0IHBtYXAgKnBt
YXAsIHZtX29mZnNldF90IHN2YSwgdm1fb2Zmc2V0X3QgZXZhKQoreworCXZtX29mZnNldF90IHZh
LCB2YV9uZXh0OworCXBkX2VudHJ5X3QgKnBkcGUsICpwZGU7CisJcHRfZW50cnlfdCAqcHRlOwor
CisJaWYgKHBtYXAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKHBtYXAtPnBtX3N0YXRzLnJl
c2lkZW50X2NvdW50ID09IDApCisJCXJldHVybjsKKworCXZtX3BhZ2VfbG9ja19xdWV1ZXMoKTsK
KwlQTUFQX0xPQ0socG1hcCk7CisKKwkvKgorCSAqIHNwZWNpYWwgaGFuZGxpbmcgb2YgcmVtb3Zp
bmcgb25lIHBhZ2UuICBhIHZlcnkgY29tbW9uIG9wZXJhdGlvbgorCSAqIGFuZCBlYXN5IHRvIHNo
b3J0IGNpcmN1aXQgc29tZSBjb2RlLgorCSAqLworCWlmICgoc3ZhICsgUEFHRV9TSVpFKSA9PSBl
dmEpIHsKKwkJcG1hcF9yZW1vdmVfcGFnZShwbWFwLCBzdmEpOworCQlnb3RvIG91dDsKKwl9CisJ
Zm9yICh2YSA9IHN2YTsgdmEgPCBldmE7IHZhID0gdmFfbmV4dCkgeworCQlwZHBlID0gcG1hcF9z
ZWdtYXAocG1hcCwgc3ZhKTsKKwkJaWYgKCpwZHBlID09IDApIHsKKwkJCXZhX25leHQgPSAoc3Zh
ICsgTkJTRUcpICYgflNFR01BU0s7CisJCQlpZiAodmFfbmV4dCA8IHN2YSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdmFfbmV4dCA9IGV2YTsKKwkJCWNvbnRpbnVlOworCQl9Cisg
CisJCXZhX25leHQgPSAoc3ZhICsgTkJQRFIpICYgflBEUk1BU0s7CisJCWlmICh2YV9uZXh0IDwg
c3ZhKQorCQkJdmFfbmV4dCA9IGV2YTsKKworCQlwZGUgPSBwbWFwX3BkcGVfdG9fcGRlKHBkcGUs
IHN2YSk7CisJCWlmICgqcGRlID09IDApCisJCQljb250aW51ZTsKKwkJcHRlID0gcG1hcF9wZGVf
dG9fcHRlKHBkZSwgc3ZhKTsKKworCQlmb3IgKDsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLCBzdmEg
Kz0gUEFHRV9TSVpFKSB7CisJCSAgICAgICBpZiAoKnB0ZSA9PSAwKQorCQkJICAgICAgIGNvbnRp
bnVlOworCQkgICAgICAgcG1hcF9yZW1vdmVfcGFnZShwbWFwLCBzdmEpOworCX0KKworICAgICAg
ICB9CitvdXQ6CisJdm1fcGFnZV91bmxvY2tfcXVldWVzKCk7CisJUE1BUF9VTkxPQ0socG1hcCk7
Cit9CisKKy8qCisgKglSb3V0aW5lOglwbWFwX3JlbW92ZV9hbGwKKyAqCUZ1bmN0aW9uOgorICoJ
CVJlbW92ZXMgdGhpcyBwaHlzaWNhbCBwYWdlIGZyb20KKyAqCQlhbGwgcGh5c2ljYWwgbWFwcyBp
biB3aGljaCBpdCByZXNpZGVzLgorICoJCVJlZmxlY3RzIGJhY2sgbW9kaWZ5IGJpdHMgdG8gdGhl
IHBhZ2VyLgorICoKKyAqCU5vdGVzOgorICoJCU9yaWdpbmFsIHZlcnNpb25zIG9mIHRoaXMgcm91
dGluZSB3ZXJlIHZlcnkKKyAqCQlpbmVmZmljaWVudCBiZWNhdXNlIHRoZXkgaXRlcmF0aXZlbHkg
Y2FsbGVkCisgKgkJcG1hcF9yZW1vdmUgKHNsb3cuLi4pCisgKi8KKwordm9pZAorcG1hcF9yZW1v
dmVfYWxsKHZtX3BhZ2VfdCBtKQoreworCXB2X2VudHJ5X3QgcHY7CisJcHRfZW50cnlfdCAqcHRl
LCB0cHRlOworCisJS0FTU0VSVCgobS0+ZmxhZ3MgJiBQR19GSUNUSVRJT1VTKSA9PSAwLAorCSAg
ICAoInBtYXBfcmVtb3ZlX2FsbDogcGFnZSAlcCBpcyBmaWN0aXRpb3VzIiwgbSkpOworCXZtX3Bh
Z2VfbG9ja19xdWV1ZXMoKTsKKworCWlmIChtLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikK
KwkJdm1fcGFnZV9mbGFnX3NldChtLCBQR19SRUZFUkVOQ0VEKTsKKworCXdoaWxlICgocHYgPSBU
QUlMUV9GSVJTVCgmbS0+bWQucHZfbGlzdCkpICE9IE5VTEwpIHsKKwkJUE1BUF9MT0NLKHB2LT5w
dl9wbWFwKTsKKworCQkvKgorCQkgKiBJZiBpdCdzIGxhc3QgbWFwcGluZyB3cml0ZWJhY2sgYWxs
IGNhY2hlcyBmcm9tIAorCQkgKiB0aGUgcGFnZSBiZWluZyBkZXN0cm95ZWQKKwkgCSAqLworCQlp
ZiAobS0+bWQucHZfbGlzdF9jb3VudCA9PSAxKSAKKwkJCW1pcHNfZGNhY2hlX3diaW52X3Jhbmdl
X2luZGV4KHB2LT5wdl92YSwgUEFHRV9TSVpFKTsKKworCQlwdi0+cHZfcG1hcC0+cG1fc3RhdHMu
cmVzaWRlbnRfY291bnQtLTsKKworCQlwdGUgPSBwbWFwX3B0ZShwdi0+cHZfcG1hcCwgcHYtPnB2
X3ZhKTsKKworCQl0cHRlID0gbG9hZGFuZGNsZWFyKCh1X2ludCAqKXB0ZSk7CisJCWlmIChpc19r
ZXJuZWxfcG1hcChwdi0+cHZfcG1hcCkpCisJCQkqcHRlID0gUFRFX0c7CisKKwkJaWYgKHB0ZV90
ZXN0KCZ0cHRlLCBQVEVfVykpCisJCQlwdi0+cHZfcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQt
LTsKKworCQkvKgorCQkgKiBVcGRhdGUgdGhlIHZtX3BhZ2VfdCBjbGVhbiBhbmQgcmVmZXJlbmNl
IGJpdHMuCisJCSAqLworCQlpZiAocHRlX3Rlc3QoJnRwdGUsIFBURV9EKSkgeworI2lmIGRlZmlu
ZWQoUE1BUF9ESUFHTk9TVElDKQorCQkJaWYgKHBtYXBfbndfbW9kaWZpZWQodHB0ZSkpIHsKKwkJ
CQlwcmludGYoCisJCQkJICAgICJwbWFwX3JlbW92ZV9hbGw6IG1vZGlmaWVkIHBhZ2Ugbm90IHdy
aXRhYmxlOiB2YTogMHgleCwgcHRlOiAweCV4XG4iLAorCQkJCSAgICBwdi0+cHZfdmEsIHRwdGUp
OworCQkJfQorI2VuZGlmCisJCQl2bV9wYWdlX2RpcnR5KG0pOworCQl9CisJCXBtYXBfaW52YWxp
ZGF0ZV9wYWdlKHB2LT5wdl9wbWFwLCBwdi0+cHZfdmEpOworCisJCVRBSUxRX1JFTU9WRSgmcHYt
PnB2X3BtYXAtPnBtX3B2bGlzdCwgcHYsIHB2X3BsaXN0KTsKKwkJVEFJTFFfUkVNT1ZFKCZtLT5t
ZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCW0tPm1kLnB2X2xpc3RfY291bnQtLTsKKwkJcG1h
cF91bnVzZV9wdChwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhLCBwdi0+cHZfcHRlbSk7CisJCVBNQVBf
VU5MT0NLKHB2LT5wdl9wbWFwKTsKKwkJZnJlZV9wdl9lbnRyeShwdik7CisJfQorCisJdm1fcGFn
ZV9mbGFnX2NsZWFyKG0sIFBHX1dSSVRFQUJMRSk7CisJbS0+bWQucHZfZmxhZ3MgJj0gfihQVl9U
QUJMRV9SRUYgfCBQVl9UQUJMRV9NT0QpOworCXZtX3BhZ2VfdW5sb2NrX3F1ZXVlcygpOworfQor
CisvKgorICoJU2V0IHRoZSBwaHlzaWNhbCBwcm90ZWN0aW9uIG9uIHRoZQorICoJc3BlY2lmaWVk
IHJhbmdlIG9mIHRoaXMgbWFwIGFzIHJlcXVlc3RlZC4KKyAqLwordm9pZAorcG1hcF9wcm90ZWN0
KHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCBzdmEsIHZtX29mZnNldF90IGV2YSwgdm1fcHJvdF90
IHByb3QpCit7CisJcHRfZW50cnlfdCAqcHRwYWRkciwgKnB0ZTsKKwlwZF9lbnRyeV90ICpwZHBl
LCAqcGRlOworCXZtX29mZnNldF90IHZhX25leHQ7CisKKwlpZiAocG1hcCA9PSBOVUxMKQorCQly
ZXR1cm47CisKKwlwcmludGYoIlBNQVAgcHJvdCBzdmEgJXAgZXZhICVwICV4XG4iLCh2b2lkICop
c3ZhLCh2b2lkICopZXZhLCAoaW50KXByb3QpOworCWlmICgocHJvdCAmIFZNX1BST1RfUkVBRCkg
PT0gVk1fUFJPVF9OT05FKSB7CisJCXBtYXBfcmVtb3ZlKHBtYXAsIHN2YSwgZXZhKTsKKwkJcmV0
dXJuOworCX0KKwlpZiAocHJvdCAmIFZNX1BST1RfV1JJVEUpCisJCXJldHVybjsKKworCXZtX3Bh
Z2VfbG9ja19xdWV1ZXMoKTsKKwlQTUFQX0xPQ0socG1hcCk7CisJd2hpbGUgKHN2YSA8IGV2YSkg
eworCQkvKgorCQkgKiBJZiBzZWdtZW50IHRhYmxlIGVudHJ5IGlzIGVtcHR5LCBza2lwIHRoaXMg
c2VnbWVudC4KKwkJICovCisJCXBkcGUgPSBwbWFwX3NlZ21hcChwbWFwLCBzdmEpOworCQlpZiAo
KnBkcGUgPT0gMCkgeworCQkJdmFfbmV4dCA9IChzdmEgKyBOQlNFRykgJiB+U0VHTUFTSzsKKwkJ
CWlmICh2YV9uZXh0IDwgc3ZhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9u
ZXh0ID0gZXZhOworCQkJY29udGludWU7CisJCX0KKworCQl2YV9uZXh0ID0gKHN2YSArIE5CUERS
KSAmIH5QRFJNQVNLOworICAgICAgICAgICAgICAgIGlmICh2YV9uZXh0IDwgc3ZhKQorICAgICAg
ICAgICAgICAgICAgICAgICAgdmFfbmV4dCA9IGV2YTsKKworICAgICAgICAgICAgICAgIHBkZSA9
IHBtYXBfcGRwZV90b19wZGUocGRwZSwgc3ZhKTsKKyAgICAgICAgICAgICAgICBwdHBhZGRyID0g
KnBkZTsKKworCQkvKgorICAgICAgICAgICAgICAgICAqIFdlZWQgb3V0IGludmFsaWQgbWFwcGlu
Z3MuCisJCSAqLworICAgICAgICAgICAgICAgIGlmIChwdHBhZGRyID09IDApCisJCQljb250aW51
ZTsKKworICAgICAgICAgICAgICAgIGlmICh2YV9uZXh0ID4gZXZhKQorICAgICAgICAgICAgICAg
ICAgICAgICAgdmFfbmV4dCA9IGV2YTsKKworICAgICAgICAgICAgICAgIGZvciAocHRlID0gcHRw
YWRkcjsgc3ZhICE9IHZhX25leHQ7IHB0ZSsrLAorCQkJICAgICBzdmEgKz0gUEFHRV9TSVpFKSB7
CisgICAgICAgICAgICAgICAgICAgICAgICBwdF9lbnRyeV90IG9iaXRzLCBwYml0czsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHZtX3BhZ2VfdCBtOworCQkJdm1fcGFkZHJfdCBwYTsKKwkJCQor
cmV0cnk6CisJCW9iaXRzID0gcGJpdHMgPSAqcHRlOworCQlwYSA9IFRMQkxPX1BURV9UT19QQShw
Yml0cyk7CisKKwkJaWYgKHBhZ2VfaXNfbWFuYWdlZChwYSkgJiYgcHRlX3Rlc3QoJnBiaXRzLCBQ
VEVfRCkpIHsKKwkJCW0gPSBQSFlTX1RPX1ZNX1BBR0UocGEpOworCQkJdm1fcGFnZV9kaXJ0eSht
KTsKKwkJCW0tPm1kLnB2X2ZsYWdzICY9IH5QVl9UQUJMRV9NT0Q7CisJCX0KKwkJcHRlX2NsZWFy
KCZwYml0cywgUFRFX0QpOworCQlwdGVfc2V0KCZwYml0cywgUFRFX1JPKTsKKworCQlpZiAocGJp
dHMgIT0gKnB0ZSkgeworCQkJaWYgKCFhdG9taWNfY21wc2V0X2ludCgodV9pbnQgKilwdGUsIG9i
aXRzLCBwYml0cykpCisJCQkJZ290byByZXRyeTsKKwkJCXBtYXBfdXBkYXRlX3BhZ2UocG1hcCwg
c3ZhLCBwYml0cyk7CisJCX0KKwkJfQorCX0KKwl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKKwlQ
TUFQX1VOTE9DSyhwbWFwKTsKK30KKworLyoKKyAqCUluc2VydCB0aGUgZ2l2ZW4gcGh5c2ljYWwg
cGFnZSAocCkgYXQKKyAqCXRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzICh2KSBpbiB0aGUK
KyAqCXRhcmdldCBwaHlzaWNhbCBtYXAgd2l0aCB0aGUgcHJvdGVjdGlvbiByZXF1ZXN0ZWQuCisg
KgorICoJSWYgc3BlY2lmaWVkLCB0aGUgcGFnZSB3aWxsIGJlIHdpcmVkIGRvd24sIG1lYW5pbmcK
KyAqCXRoYXQgdGhlIHJlbGF0ZWQgcHRlIGNhbiBub3QgYmUgcmVjbGFpbWVkLgorICoKKyAqCU5C
OiAgVGhpcyBpcyB0aGUgb25seSByb3V0aW5lIHdoaWNoIE1BWSBOT1QgbGF6eS1ldmFsdWF0ZQor
ICoJb3IgbG9zZSBpbmZvcm1hdGlvbi4gIFRoYXQgaXMsIHRoaXMgcm91dGluZSBtdXN0IGFjdHVh
bGx5CisgKglpbnNlcnQgdGhpcyBwYWdlIGludG8gdGhlIGdpdmVuIG1hcCBOT1cuCisgKi8KK3Zv
aWQKK3BtYXBfZW50ZXIocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhLCB2bV9wcm90X3QgYWNj
ZXNzLCB2bV9wYWdlX3QgbSwKKyAgICB2bV9wcm90X3QgcHJvdCwgYm9vbGVhbl90IHdpcmVkKQor
eworCXZtX29mZnNldF90IHBhLCBvcGE7CisJcHRfZW50cnlfdCAqcHRlOworCXB0X2VudHJ5X3Qg
b3JpZ3B0ZSwgbmV3cHRlOworCXB2X2VudHJ5X3QgcHY7CisJdm1fcGFnZV90IG1wdGUsIG9tOwor
CWludCBydyA9IDA7CisJaW50IGRlYnVnID0gMDsgLyp2YSA8IFZNX01BWFVTRVJfQUREUkVTUzsq
LworCWludCBwaWQgPSBjdXJ0aHJlYWQtPnRkX3Byb2MtPnBfcGlkOworCisJaWYgKHBtYXAgPT0g
TlVMTCkgeworCQlwcmludGYoIk51bGwgcG1wXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZGVi
dWcpCisJCXByaW50ZigiWyVkXVZBICVseCBwYWdlICVwXG4iLCBwaWQsICh1X2xvbmcpdmEsIG0p
OworCisJdmEgJj0gflBBR0VfTUFTSzsKKyAJS0FTU0VSVCh2YSA8PSBWTV9NQVhfS0VSTkVMX0FE
RFJFU1MsICgicG1hcF9lbnRlcjogdG9vYmlnIikpOworCUtBU1NFUlQoKG0tPmZsYWdzICYgKFBH
X0ZJQ1RJVElPVVMgfCBQR19VTk1BTkFHRUQpKSAhPSAwIHx8CisJICAgIChtLT5vZmxhZ3MgJiBW
UE9fQlVTWSkgIT0gMCwKKwkgICAgKCJwbWFwX2VudGVyOiBwYWdlICVwIGlzIG5vdCBidXN5Iiwg
bSkpOworCisJbXB0ZSA9IE5VTEw7CisKKwl2bV9wYWdlX2xvY2tfcXVldWVzKCk7CisJUE1BUF9M
T0NLKHBtYXApOworCisJLyoKKwkgKiBJbiB0aGUgY2FzZSB0aGF0IGEgcGFnZSB0YWJsZSBwYWdl
IGlzIG5vdCByZXNpZGVudCwgd2UgYXJlCisJICogY3JlYXRpbmcgaXQgaGVyZS4KKwkgKi8KKwlp
ZiAodmEgPCBWTV9NQVhVU0VSX0FERFJFU1MpIHsKKwkJbXB0ZSA9IHBtYXBfYWxsb2NwdGUocG1h
cCwgdmEsIE1fV0FJVE9LKTsKKwl9CisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOworCisJLyoK
KwkgKiBQYWdlIERpcmVjdG9yeSB0YWJsZSBlbnRyeSBub3QgdmFsaWQsIHdlIG5lZWQgYSBuZXcg
UFQgcGFnZQorCSAqLworCWlmIChwdGUgPT0gTlVMTCkgeworCQlwYW5pYygicG1hcF9lbnRlcjog
aW52YWxpZCBwYWdlIGRpcmVjdG9yeSwgcGRpcj0lcCwgdmE9JXBcbiIsCisJCSAgICAodm9pZCAq
KXBtYXAtPnBtX3NlZ3RhYiwgKHZvaWQgKil2YSk7CisJfQorCXBhID0gVk1fUEFHRV9UT19QSFlT
KG0pOworCW9tID0gTlVMTDsKKwlvcmlncHRlID0gKnB0ZTsKKwlvcGEgPSBUTEJMT19QVEVfVE9f
UEEob3JpZ3B0ZSk7CisKKwkvKgorCSAqIE1hcHBpbmcgaGFzIG5vdCBjaGFuZ2VkLCBtdXN0IGJl
IHByb3RlY3Rpb24gb3Igd2lyaW5nIGNoYW5nZS4KKwkgKi8KKwlpZiAocHRlX3Rlc3QoJm9yaWdw
dGUsIFBURV9WKSAmJiBvcGEgPT0gcGEpIHsKKwkJLyoKKwkJICogV2lyaW5nIGNoYW5nZSwganVz
dCB1cGRhdGUgc3RhdHMuIFdlIGRvbid0IHdvcnJ5IGFib3V0CisJCSAqIHdpcmluZyBQVCBwYWdl
cyBhcyB0aGV5IHJlbWFpbiByZXNpZGVudCBhcyBsb25nIGFzIHRoZXJlCisJCSAqIGFyZSB2YWxp
ZCBtYXBwaW5ncyBpbiB0aGVtLiBIZW5jZSwgaWYgYSB1c2VyIHBhZ2UgaXMKKwkJICogd2lyZWQs
IHRoZSBQVCBwYWdlIHdpbGwgYmUgYWxzby4KKwkJICovCisJCWlmICh3aXJlZCAmJiAhcHRlX3Rl
c3QoJm9yaWdwdGUsIFBURV9XKSkKKwkJCXBtYXAtPnBtX3N0YXRzLndpcmVkX2NvdW50Kys7CisJ
CWVsc2UgaWYgKCF3aXJlZCAmJiBwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1cpKQorCQkJcG1hcC0+
cG1fc3RhdHMud2lyZWRfY291bnQtLTsKKworI2lmIGRlZmluZWQoUE1BUF9ESUFHTk9TVElDKQor
CQlpZiAocG1hcF9ud19tb2RpZmllZChvcmlncHRlKSkgeworCQkJcHJpbnRmKAorCQkJICAgICJw
bWFwX2VudGVyOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZTogdmE6IDB4JXgsIHB0ZTogMHgl
eFxuIiwKKwkJCSAgICB2YSwgb3JpZ3B0ZSk7CisJCX0KKyNlbmRpZgorCQkvKgorCQkgKiBSZW1v
dmUgZXh0cmEgcHRlIHJlZmVyZW5jZQorCQkgKi8KKwkJaWYgKG1wdGUpCisJCQltcHRlLT53aXJl
X2NvdW50LS07CisKKwkJaWYgKHBhZ2VfaXNfbWFuYWdlZChvcGEpKSB7CisJCQlvbSA9IG07CisJ
CX0KKwkJZ290byB2YWxpZGF0ZTsKKwl9CisKKwlwdiA9IE5VTEw7CisKKwkvKgorCSAqIE1hcHBp
bmcgaGFzIGNoYW5nZWQsIGludmFsaWRhdGUgb2xkIHJhbmdlIGFuZCBmYWxsIHRocm91Z2ggdG8K
KwkgKiBoYW5kbGUgdmFsaWRhdGluZyBuZXcgbWFwcGluZy4KKwkgKi8KKwlpZiAob3BhKSB7CisJ
CWlmIChwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1cpKQorCQkJcG1hcC0+cG1fc3RhdHMud2lyZWRf
Y291bnQtLTsKKworCQlpZiAocGFnZV9pc19tYW5hZ2VkKG9wYSkpIHsKKwkJCW9tID0gUEhZU19U
T19WTV9QQUdFKG9wYSk7CisJCQlwdiA9IHBtYXBfcHZoX3JlbW92ZSgmb20tPm1kLCBwbWFwLCB2
YSk7CisJCX0KKwkJaWYgKG1wdGUgIT0gTlVMTCkgeworCQkJbXB0ZS0+d2lyZV9jb3VudC0tOwor
CQkJS0FTU0VSVChtcHRlLT53aXJlX2NvdW50ID4gMCwKKwkJCSAgICAoInBtYXBfZW50ZXI6IG1p
c3NpbmcgcmVmZXJlbmNlIHRvIHBhZ2UgdGFibGUgcGFnZSwiCisJCQkgICAgIiB2YTogJXAiLCAo
dm9pZCAqKXZhKSk7CisJCX0KKwl9IGVsc2UKKwkJcG1hcC0+cG1fc3RhdHMucmVzaWRlbnRfY291
bnQrKzsKKworCS8qCisJICogRW50ZXIgb24gdGhlIFBWIGxpc3QgaWYgcGFydCBvZiBvdXIgbWFu
YWdlZCBtZW1vcnkuIE5vdGUgdGhhdCB3ZQorCSAqIHJhaXNlIElQTCB3aGlsZSBtYW5pcHVsYXRp
bmcgcHZfdGFibGUgc2luY2UgcG1hcF9lbnRlciBjYW4gYmUKKwkgKiBjYWxsZWQgYXQgaW50ZXJy
dXB0IHRpbWUuCisJICovCisJaWYgKChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5N
QU5BR0VEKSkgPT0gMCkgeworCQlLQVNTRVJUKHZhIDwga21pLmNsZWFuX3N2YSB8fCB2YSA+PSBr
bWkuY2xlYW5fZXZhLAorCQkgICAgKCJwbWFwX2VudGVyOiBtYW5hZ2VkIG1hcHBpbmcgd2l0aGlu
IHRoZSBjbGVhbiBzdWJtYXAiKSk7CisJCWlmIChwdiA9PSBOVUxMKQorCQkJcHYgPSBnZXRfcHZf
ZW50cnkocG1hcCk7CisJCXB2LT5wdl92YSA9IHZhOworCQlwdi0+cHZfcG1hcCA9IHBtYXA7CisJ
CXB2LT5wdl9wdGVtID0gbXB0ZTsKKwkJcHYtPnB2X3dpcmVkID0gd2lyZWQ7CisJCVRBSUxRX0lO
U0VSVF9UQUlMKCZwbWFwLT5wbV9wdmxpc3QsIHB2LCBwdl9wbGlzdCk7CisJCVRBSUxRX0lOU0VS
VF9UQUlMKCZtLT5tZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCW0tPm1kLnB2X2xpc3RfY291
bnQrKzsKKwl9IGVsc2UgaWYgKHB2ICE9IE5VTEwpCisJCWZyZWVfcHZfZW50cnkocHYpOworCisJ
LyoKKwkgKiBJbmNyZW1lbnQgY291bnRlcnMKKwkgKi8KKwlpZiAod2lyZWQpCisJCXBtYXAtPnBt
X3N0YXRzLndpcmVkX2NvdW50Kys7CisKK3ZhbGlkYXRlOgorCWlmICgoYWNjZXNzICYgVk1fUFJP
VF9XUklURSkgIT0gMCkKKwkJbS0+bWQucHZfZmxhZ3MgfD0gUFZfVEFCTEVfTU9EIHwgUFZfVEFC
TEVfUkVGOworCXJ3ID0gaW5pdF9wdGVfcHJvdCh2YSwgbSwgcHJvdCk7CisKKyNpZmRlZiBQTUFQ
X0RFQlVHCisJcHJpbnRmKCJbJWRdIHBtYXBfZW50ZXI6ICB2YTogJXAgLT4gcGE6ICVwXG4iLCBw
aWQsICh2b2lkICopdmEsICh2b2lkICopcGEpOworI2VuZGlmCisJLyoKKwkgKiBOb3cgdmFsaWRh
dGUgbWFwcGluZyB3aXRoIGRlc2lyZWQgcHJvdGVjdGlvbi93aXJpbmcuCisJICovCisJbmV3cHRl
ID0gVExCTE9fUEFfVE9fUEZOKHBhKSB8IHJ3IHwgUFRFX1Y7CisKKwlpZiAoaXNfY2FjaGVhYmxl
X21lbShwYSkpCisJCW5ld3B0ZSB8PSBQVEVfQ19DQUNIRTsKKwllbHNlCisJCW5ld3B0ZSB8PSBQ
VEVfQ19VTkNBQ0hFRDsKKworCWlmICh3aXJlZCkKKwkJbmV3cHRlIHw9IFBURV9XOworCisJaWYg
KGlzX2tlcm5lbF9wbWFwKHBtYXApKQorCSAgICAgICAgIG5ld3B0ZSB8PSBQVEVfRzsKKworCS8q
CisJICogaWYgdGhlIG1hcHBpbmcgb3IgcGVybWlzc2lvbiBiaXRzIGFyZSBkaWZmZXJlbnQsIHdl
IG5lZWQgdG8KKwkgKiB1cGRhdGUgdGhlIHB0ZS4KKwkgKi8KKwlpZiAob3JpZ3B0ZSAhPSBuZXdw
dGUpIHsKKwkJaWYgKHB0ZV90ZXN0KCZvcmlncHRlLCBQVEVfVikpIHsKKwkJCSpwdGUgPSBuZXdw
dGU7CisJCQlpZiAocGFnZV9pc19tYW5hZ2VkKG9wYSkgJiYgKG9wYSAhPSBwYSkpIHsKKwkJCQlp
ZiAob20tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfUkVGKQorCQkJCQl2bV9wYWdlX2ZsYWdfc2V0
KG9tLCBQR19SRUZFUkVOQ0VEKTsKKwkJCQlvbS0+bWQucHZfZmxhZ3MgJj0KKwkJCQkgICAgfihQ
Vl9UQUJMRV9SRUYgfCBQVl9UQUJMRV9NT0QpOworCQkJfQorCQkJaWYgKHB0ZV90ZXN0KCZvcmln
cHRlLCBQVEVfRCkpIHsKKwkJCQlLQVNTRVJUKCFwdGVfdGVzdCgmb3JpZ3B0ZSwgUFRFX1JPKSwK
KwkJCQkgICAgKCJwbWFwX2VudGVyOiBtb2RpZmllZCBwYWdlIG5vdCB3cml0YWJsZToiCisJCQkJ
ICAgICIgdmE6ICVwLCBwdGU6IDB4JXgiLCAodm9pZCAqKXZhLCBvcmlncHRlKSk7CisJCQkJaWYg
KHBhZ2VfaXNfbWFuYWdlZChvcGEpKQorCQkJCQl2bV9wYWdlX2RpcnR5KG9tKTsKKwkJCX0KKwkJ
CWlmIChwYWdlX2lzX21hbmFnZWQob3BhKSAmJgorCQkJICAgIFRBSUxRX0VNUFRZKCZvbS0+bWQu
cHZfbGlzdCkpCisJCQkJdm1fcGFnZV9mbGFnX2NsZWFyKG9tLCBQR19XUklURUFCTEUpOworCQl9
IGVsc2UgeworCQkJKnB0ZSA9IG5ld3B0ZTsKKwkJfQorCX0KKwlwbWFwX3VwZGF0ZV9wYWdlKHBt
YXAsIHZhLCBuZXdwdGUpOworCisJLyoKKwkgKiBTeW5jIEkgJiBEIGNhY2hlcyBmb3IgZXhlY3V0
YWJsZSBwYWdlcy4gIERvIHRoaXMgb25seSBpZiB0aGUgdGhlCisJICogdGFyZ2V0IHBtYXAgYmVs
b25ncyB0byB0aGUgY3VycmVudCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBhbgorCSAqIHVucmVzb2x2
YWJsZSBUTEIgbWlzcyBtYXkgb2NjdXIuCisJICovCisJaWYgKCFpc19rZXJuZWxfcG1hcChwbWFw
KSAmJiAocG1hcCA9PSAmY3VycHJvYy0+cF92bXNwYWNlLT52bV9wbWFwKSAmJgorCSAgICAocHJv
dCAmIFZNX1BST1RfRVhFQ1VURSkpIHsKKwkJbWlwc19pY2FjaGVfc3luY19yYW5nZSh2YSwgUEFH
RV9TSVpFKTsKKwkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisJfQor
CXZtX3BhZ2VfdW5sb2NrX3F1ZXVlcygpOworCVBNQVBfVU5MT0NLKHBtYXApOworCWlmIChkZWJ1
ZykgeworCQlpbnQgaSwgaiwgazsKKwkJcGRfZW50cnlfdCAqcDE7CisJICAgICAgIAlwdF9lbnRy
eV90ICpwMjsKKworCQlpID0gcG1hcF9zZWdfaW5kZXgodmEpOworCQlwMSA9IChwZF9lbnRyeV90
ICopcG1hcC0+cG1fc2VndGFiW2ldOworCQlqID0gcG1hcF9wZGVfaW5kZXgodmEpOworCQlwMiA9
IChwdF9lbnRyeV90ICopcDFbal07CisJCWsgPSBwbWFwX3B0ZV9pbmRleCh2YSk7CisKKwkJcHJp
bnRmKCJzZWdtYXBbJWRdID0gJXAsIHBkZVslZF0gPSAlcCBwdGVbJWRdID0gJXhcbiIsCisJCQlp
LCBwMSwgaiwgcDIsIGsgLCBwMltrXSk7CisJCXByaW50ZigicG1hcCBlbnRlciAtICVwICV4IC0+
ICV4IGRvbmVcbiIsIHB0ZSwgb3JpZ3B0ZSwgbmV3cHRlKTsKKwl9Cit9CisKKy8qCisgKiB0aGlz
IGNvZGUgbWFrZXMgc29tZSAqTUFKT1IqIGFzc3VtcHRpb25zOgorICogMS4gQ3VycmVudCBwbWFw
ICYgcG1hcCBleGlzdHMuCisgKiAyLiBOb3Qgd2lyZWQuCisgKiAzLiBSZWFkIGFjY2Vzcy4KKyAq
IDQuIE5vIHBhZ2UgdGFibGUgcGFnZXMuCisgKiBidXQgaXMgKk1VQ0gqIGZhc3RlciB0aGFuIHBt
YXBfZW50ZXIuLi4KKyAqLworCit2b2lkCitwbWFwX2VudGVyX3F1aWNrKHBtYXBfdCBwbWFwLCB2
bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sIHZtX3Byb3RfdCBwcm90KQoreworCisJdm1fcGFn
ZV9sb2NrX3F1ZXVlcygpOworCVBNQVBfTE9DSyhwbWFwKTsKKwkodm9pZClwbWFwX2VudGVyX3F1
aWNrX2xvY2tlZChwbWFwLCB2YSwgbSwgcHJvdCwgTlVMTCk7CisJdm1fcGFnZV91bmxvY2tfcXVl
dWVzKCk7CisJUE1BUF9VTkxPQ0socG1hcCk7Cit9CisKK3N0YXRpYyB2bV9wYWdlX3QKK3BtYXBf
ZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXBfdCBwbWFwLCB2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90
IG0sCisgICAgdm1fcHJvdF90IHByb3QsIHZtX3BhZ2VfdCBtcHRlKQoreworCXB0X2VudHJ5X3Qg
KnB0ZTsKKwl2bV9vZmZzZXRfdCBwYTsKKworCUtBU1NFUlQodmEgPCBrbWkuY2xlYW5fc3ZhIHx8
IHZhID49IGttaS5jbGVhbl9ldmEgfHwKKwkgICAgKG0tPmZsYWdzICYgKFBHX0ZJQ1RJVElPVVMg
fCBQR19VTk1BTkFHRUQpKSAhPSAwLAorCSAgICAoInBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkOiBt
YW5hZ2VkIG1hcHBpbmcgd2l0aGluIHRoZSBjbGVhbiBzdWJtYXAiKSk7CisJbXR4X2Fzc2VydCgm
dm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwlQTUFQX0xPQ0tfQVNTRVJUKHBtYXAsIE1B
X09XTkVEKTsKKworCS8qCisJICogSW4gdGhlIGNhc2UgdGhhdCBhIHBhZ2UgdGFibGUgcGFnZSBp
cyBub3QgcmVzaWRlbnQsIHdlIGFyZQorCSAqIGNyZWF0aW5nIGl0IGhlcmUuCisJICovCisJaWYg
KHZhIDwgVk1fTUFYVVNFUl9BRERSRVNTKSB7CisJCXBkX2VudHJ5X3QgKnBkZTsKKwkJdW5zaWdu
ZWQgcHRlcGluZGV4OworCisJCS8qCisJCSAqIENhbGN1bGF0ZSBwYWdldGFibGUgcGFnZSBpbmRl
eAorCQkgKi8KKwkJcHRlcGluZGV4ID0gcG1hcF9wZGVfcGluZGV4KHZhKTsKKwkJaWYgKDApIHBy
aW50ZigicG1hcF9lbnRlcl9xdWljazogbSAlcCBpbmRleCAleCB2YTogJXAgXG4iLCBtLCAoaW50
KXB0ZXBpbmRleCwgKHZvaWQgKil2YSk7CisJCWlmIChtcHRlICYmIChtcHRlLT5waW5kZXggPT0g
cHRlcGluZGV4KSkgeworCQkJbXB0ZS0+d2lyZV9jb3VudCsrOworCQl9IGVsc2UgeworCQkJLyoK
KwkJCSAqIEdldCB0aGUgcGFnZSBkaXJlY3RvcnkgZW50cnkKKwkJCSAqLworCQkJcGRlID0gcG1h
cF9wZGUocG1hcCwgdmEpOworCisJCQkvKgorCQkJICogSWYgdGhlIHBhZ2UgdGFibGUgcGFnZSBp
cyBtYXBwZWQsIHdlIGp1c3QKKwkJCSAqIGluY3JlbWVudCB0aGUgaG9sZCBjb3VudCwgYW5kIGFj
dGl2YXRlIGl0LgorCQkJICovCisJCQlpZiAocGRlICYmICpwZGUgIT0gMCkgeworCQkJCWlmIChw
bWFwLT5wbV9wdHBoaW50ICYmCisJCQkJICAgIChwbWFwLT5wbV9wdHBoaW50LT5waW5kZXggPT0g
cHRlcGluZGV4KSkgeworCQkJCQltcHRlID0gcG1hcC0+cG1fcHRwaGludDsKKwkJCQl9IGVsc2Ug
eworCQkJCQltcHRlID0gUEhZU19UT19WTV9QQUdFKAorCQkJCQkJTUlQU19LU0VHMF9UT19QSFlT
KCpwZGUpKTsKKwkJCQkJcG1hcC0+cG1fcHRwaGludCA9IG1wdGU7CisJCQkJfQorCQkJCW1wdGUt
PndpcmVfY291bnQrKzsKKwkJCX0gZWxzZSB7CisJCQkJbXB0ZSA9IF9wbWFwX2FsbG9jcHRlKHBt
YXAsIHB0ZXBpbmRleCwKKwkJCQkgICAgTV9OT1dBSVQpOworCQkJCWlmIChtcHRlID09IE5VTEwp
CisJCQkJCXJldHVybiAobXB0ZSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQltcHRlID0gTlVM
TDsKKwl9CisKKwlwdGUgPSBwbWFwX3B0ZShwbWFwLCB2YSk7CisJaWYgKHB0ZV90ZXN0KHB0ZSwg
UFRFX1YpKSB7CisJCWlmIChtcHRlICE9IE5VTEwpIHsKKwkJCW1wdGUtPndpcmVfY291bnQtLTsK
KwkJCW1wdGUgPSBOVUxMOworCQl9CisJCXJldHVybiAobXB0ZSk7CisJfQorCisJLyoKKwkgKiBF
bnRlciBvbiB0aGUgUFYgbGlzdCBpZiBwYXJ0IG9mIG91ciBtYW5hZ2VkIG1lbW9yeS4KKwkgKi8K
KwlpZiAoKG0tPmZsYWdzICYgKFBHX0ZJQ1RJVElPVVMgfCBQR19VTk1BTkFHRUQpKSA9PSAwICYm
CisJICAgICFwbWFwX3RyeV9pbnNlcnRfcHZfZW50cnkocG1hcCwgbXB0ZSwgdmEsIG0pKSB7CisJ
CWlmIChtcHRlICE9IE5VTEwpIHsKKwkJCXBtYXBfdW53aXJlX3B0ZV9ob2xkKHBtYXAsIHZhLCBt
cHRlKTsKKwkJCW1wdGUgPSBOVUxMOworCQl9CisJCXJldHVybiAobXB0ZSk7CisJfQorCisJLyoK
KwkgKiBJbmNyZW1lbnQgY291bnRlcnMKKwkgKi8KKwlwbWFwLT5wbV9zdGF0cy5yZXNpZGVudF9j
b3VudCsrOworCisJcGEgPSBWTV9QQUdFX1RPX1BIWVMobSk7CisKKwkvKgorCSAqIE5vdyB2YWxp
ZGF0ZSBtYXBwaW5nIHdpdGggUk8gcHJvdGVjdGlvbgorCSAqLworCSpwdGUgPSBUTEJMT19QQV9U
T19QRk4ocGEpIHwgUFRFX1Y7CisKKwlpZiAoaXNfY2FjaGVhYmxlX21lbShwYSkpCisJCSpwdGUg
fD0gUFRFX0NfQ0FDSEU7CisJZWxzZQorCQkqcHRlIHw9IFBURV9DX1VOQ0FDSEVEOworCisJaWYg
KGlzX2tlcm5lbF9wbWFwKHBtYXApKQorCQkqcHRlIHw9IFBURV9HOworCWVsc2UgeworCQkqcHRl
IHw9IFBURV9STzsKKwkJLyoKKwkJICogU3luYyBJICYgRCBjYWNoZXMuICBEbyB0aGlzIG9ubHkg
aWYgdGhlIHRoZSB0YXJnZXQgcG1hcAorCQkgKiBiZWxvbmdzIHRvIHRoZSBjdXJyZW50IHByb2Nl
c3MuICBPdGhlcndpc2UsIGFuCisJCSAqIHVucmVzb2x2YWJsZSBUTEIgbWlzcyBtYXkgb2NjdXIu
ICovCisJCWlmIChwbWFwID09ICZjdXJwcm9jLT5wX3Ztc3BhY2UtPnZtX3BtYXApIHsKKwkJCXZh
ICY9IH5QQUdFX01BU0s7CisJCQltaXBzX2ljYWNoZV9zeW5jX3JhbmdlKHZhLCBQQUdFX1NJWkUp
OworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7CisJCX0KKwl9CisJ
cmV0dXJuIChtcHRlKTsKK30KKworLyoKKyAqIE1ha2UgYSB0ZW1wb3JhcnkgbWFwcGluZyBmb3Ig
YSBwaHlzaWNhbCBhZGRyZXNzLiAgVGhpcyBpcyBvbmx5IGludGVuZGVkCisgKiB0byBiZSB1c2Vk
IGZvciBwYW5pYyBkdW1wcy4KKyAqCisgKiBVc2UgWEtQSFlTIGZvciA2NCBiaXQsIGFuZCBLU0VH
MCB3aGVyZSBwb3NzaWJsZSBmb3IgMzIgYml0LgorICovCit2b2lkICoKK3BtYXBfa2VudGVyX3Rl
bXBvcmFyeSh2bV9wYWRkcl90IHBhLCBpbnQgaSkKK3sKKwlyZXR1cm4gKCh2b2lkICopTUlQU19Q
SFlTX1RPX1hLUEhZU19DQUNIRUQocGEpKTsKK30KK3ZvaWQKK3BtYXBfa2VudGVyX3RlbXBvcmFy
eV9mcmVlKHZtX3BhZGRyX3QgcGEpCit7Cit9CisKKy8qCisgKiBNb3ZlZCB0aGUgY29kZSB0byBN
YWNoaW5lIEluZGVwZW5kZW50CisgKgkgdm1fbWFwX3BtYXBfZW50ZXIoKQorICovCisKKy8qCisg
KiBNYXBzIGEgc2VxdWVuY2Ugb2YgcmVzaWRlbnQgcGFnZXMgYmVsb25naW5nIHRvIHRoZSBzYW1l
IG9iamVjdC4KKyAqIFRoZSBzZXF1ZW5jZSBiZWdpbnMgd2l0aCB0aGUgZ2l2ZW4gcGFnZSBtX3N0
YXJ0LiAgVGhpcyBwYWdlIGlzCisgKiBtYXBwZWQgYXQgdGhlIGdpdmVuIHZpcnR1YWwgYWRkcmVz
cyBzdGFydC4gIEVhY2ggc3Vic2VxdWVudCBwYWdlIGlzCisgKiBtYXBwZWQgYXQgYSB2aXJ0dWFs
IGFkZHJlc3MgdGhhdCBpcyBvZmZzZXQgZnJvbSBzdGFydCBieSB0aGUgc2FtZQorICogYW1vdW50
IGFzIHRoZSBwYWdlIGlzIG9mZnNldCBmcm9tIG1fc3RhcnQgd2l0aGluIHRoZSBvYmplY3QuICBU
aGUKKyAqIGxhc3QgcGFnZSBpbiB0aGUgc2VxdWVuY2UgaXMgdGhlIHBhZ2Ugd2l0aCB0aGUgbGFy
Z2VzdCBvZmZzZXQgZnJvbQorICogbV9zdGFydCB0aGF0IGNhbiBiZSBtYXBwZWQgYXQgYSB2aXJ0
dWFsIGFkZHJlc3MgbGVzcyB0aGFuIHRoZSBnaXZlbgorICogdmlydHVhbCBhZGRyZXNzIGVuZC4g
IE5vdCBldmVyeSB2aXJ0dWFsIHBhZ2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kCisgKiBpcyBtYXBw
ZWQ7IG9ubHkgdGhvc2UgZm9yIHdoaWNoIGEgcmVzaWRlbnQgcGFnZSBleGlzdHMgd2l0aCB0aGUK
KyAqIGNvcnJlc3BvbmRpbmcgb2Zmc2V0IGZyb20gbV9zdGFydCBhcmUgbWFwcGVkLgorICovCit2
b2lkCitwbWFwX2VudGVyX29iamVjdChwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3Qgc3RhcnQsIHZt
X29mZnNldF90IGVuZCwKKyAgICB2bV9wYWdlX3QgbV9zdGFydCwgdm1fcHJvdF90IHByb3QpCit7
CisJdm1fcGFnZV90IG0sIG1wdGU7CisJdm1fcGluZGV4X3QgZGlmZiwgcHNpemU7CisKKwlWTV9P
QkpFQ1RfTE9DS19BU1NFUlQobV9zdGFydC0+b2JqZWN0LCBNQV9PV05FRCk7CisJcHNpemUgPSBh
dG9wKGVuZCAtIHN0YXJ0KTsKKwltcHRlID0gTlVMTDsKKwltID0gbV9zdGFydDsKKwl2bV9wYWdl
X2xvY2tfcXVldWVzKCk7CisJUE1BUF9MT0NLKHBtYXApOworCXdoaWxlIChtICE9IE5VTEwgJiYg
KGRpZmYgPSBtLT5waW5kZXggLSBtX3N0YXJ0LT5waW5kZXgpIDwgcHNpemUpIHsKKwkJbXB0ZSA9
IHBtYXBfZW50ZXJfcXVpY2tfbG9ja2VkKHBtYXAsIHN0YXJ0ICsgcHRvYShkaWZmKSwgbSwKKwkJ
ICAgIHByb3QsIG1wdGUpOworCQltID0gVEFJTFFfTkVYVChtLCBsaXN0cSk7CisJfQorCXZtX3Bh
Z2VfdW5sb2NrX3F1ZXVlcygpOworIAlQTUFQX1VOTE9DSyhwbWFwKTsKK30KKworLyoKKyAqIHBt
YXBfb2JqZWN0X2luaXRfcHQgcHJlbG9hZHMgdGhlIHB0ZXMgZm9yIGEgZ2l2ZW4gb2JqZWN0Cisg
KiBpbnRvIHRoZSBzcGVjaWZpZWQgcG1hcC4gIFRoaXMgZWxpbWluYXRlcyB0aGUgYmxhc3Qgb2Yg
c29mdAorICogZmF1bHRzIG9uIHByb2Nlc3Mgc3RhcnR1cCBhbmQgaW1tZWRpYXRlbHkgYWZ0ZXIg
YW4gbW1hcC4KKyAqLwordm9pZAorcG1hcF9vYmplY3RfaW5pdF9wdChwbWFwX3QgcG1hcCwgdm1f
b2Zmc2V0X3QgYWRkciwKKyAgICB2bV9vYmplY3RfdCBvYmplY3QsIHZtX3BpbmRleF90IHBpbmRl
eCwgdm1fc2l6ZV90IHNpemUpCit7CisJVk1fT0JKRUNUX0xPQ0tfQVNTRVJUKG9iamVjdCwgTUFf
T1dORUQpOworCUtBU1NFUlQob2JqZWN0LT50eXBlID09IE9CSlRfREVWSUNFIHx8IG9iamVjdC0+
dHlwZSA9PSBPQkpUX1NHLAorCSAgICAoInBtYXBfb2JqZWN0X2luaXRfcHQ6IG5vbi1kZXZpY2Ug
b2JqZWN0IikpOworfQorCisvKgorICoJUm91dGluZToJcG1hcF9jaGFuZ2Vfd2lyaW5nCisgKglG
dW5jdGlvbjoJQ2hhbmdlIHRoZSB3aXJpbmcgYXR0cmlidXRlIGZvciBhIG1hcC92aXJ0dWFsLWFk
ZHJlc3MKKyAqCQkJcGFpci4KKyAqCUluL291dCBjb25kaXRpb25zOgorICoJCQlUaGUgbWFwcGlu
ZyBtdXN0IGFscmVhZHkgZXhpc3QgaW4gdGhlIHBtYXAuCisgKi8KK3ZvaWQKK3BtYXBfY2hhbmdl
X3dpcmluZyhwbWFwX3QgcG1hcCwgdm1fb2Zmc2V0X3QgdmEsIGJvb2xlYW5fdCB3aXJlZCkKK3sK
KwlwdF9lbnRyeV90ICpwdGU7CisKKwlpZiAocG1hcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlQ
TUFQX0xPQ0socG1hcCk7CisJcHRlID0gcG1hcF9wdGUocG1hcCwgdmEpOworCisJaWYgKHdpcmVk
ICYmICFwdGVfdGVzdChwdGUsIFBURV9XKSkKKwkJcG1hcC0+cG1fc3RhdHMud2lyZWRfY291bnQr
KzsKKwllbHNlIGlmICghd2lyZWQgJiYgcHRlX3Rlc3QocHRlLCBQVEVfVykpCisJCXBtYXAtPnBt
X3N0YXRzLndpcmVkX2NvdW50LS07CisKKwkvKgorCSAqIFdpcmluZyBpcyBub3QgYSBoYXJkd2Fy
ZSBjaGFyYWN0ZXJpc3RpYyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvCisJICogaW52YWxpZGF0ZSBU
TEIuCisJICovCisJaWYgKHdpcmVkKQorCQlwdGVfc2V0KHB0ZSwgUFRFX1cpOworCWVsc2UKKwkJ
cHRlX2NsZWFyKHB0ZSwgUFRFX1cpOworCVBNQVBfVU5MT0NLKHBtYXApOworfQorCisvKgorICoJ
Q29weSB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHNyY19hZGRyL2xlbgorICoJZnJvbSB0aGUgc291
cmNlIG1hcCB0byB0aGUgcmFuZ2UgZHN0X2FkZHIvbGVuCisgKglpbiB0aGUgZGVzdGluYXRpb24g
bWFwLgorICoKKyAqCVRoaXMgcm91dGluZSBpcyBvbmx5IGFkdmlzb3J5IGFuZCBuZWVkIG5vdCBk
byBhbnl0aGluZy4KKyAqLworCit2b2lkCitwbWFwX2NvcHkocG1hcF90IGRzdF9wbWFwLCBwbWFw
X3Qgc3JjX3BtYXAsIHZtX29mZnNldF90IGRzdF9hZGRyLAorICAgIHZtX3NpemVfdCBsZW4sIHZt
X29mZnNldF90IHNyY19hZGRyKQoreworfQorCisvKgorICoJcG1hcF96ZXJvX3BhZ2UgemVyb3Mg
dGhlIHNwZWNpZmllZCBoYXJkd2FyZSBwYWdlIGJ5IG1hcHBpbmcKKyAqCXRoZSBwYWdlIGludG8g
S1ZNIGFuZCB1c2luZyBiemVybyB0byBjbGVhciBpdHMgY29udGVudHMuCisgKgorICogCVVzZSBY
S1BIWVMgZm9yIDY0IGJpdCwgYW5kIEtTRUcwIHdoZXJlIHBvc3NpYmxlIGZvciAzMiBiaXQuCisg
Ki8KK3ZvaWQKK3BtYXBfemVyb19wYWdlKHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNldF90IHZh
OworCXZtX3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19Q
SFlTX1RPX1hLUEhZU19DQUNIRUQocGh5cyk7CisJYnplcm8oKGNhZGRyX3QpdmEsIFBBR0VfU0la
RSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7Cit9CisKKy8qCisg
KglwbWFwX3plcm9fcGFnZV9hcmVhIHplcm9zIHRoZSBzcGVjaWZpZWQgaGFyZHdhcmUgcGFnZSBi
eSBtYXBwaW5nCisgKgl0aGUgcGFnZSBpbnRvIEtWTSBhbmQgdXNpbmcgYnplcm8gdG8gY2xlYXIg
aXRzIGNvbnRlbnRzLgorICoKKyAqCW9mZiBhbmQgc2l6ZSBtYXkgbm90IGNvdmVyIGFuIGFyZWEg
YmV5b25kIGEgc2luZ2xlIGhhcmR3YXJlIHBhZ2UuCisgKi8KK3ZvaWQKK3BtYXBfemVyb19wYWdl
X2FyZWEodm1fcGFnZV90IG0sIGludCBvZmYsIGludCBzaXplKQoreworCXZtX29mZnNldF90IHZh
OworCXZtX3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0gTUlQU19Q
SFlTX1RPX1hLUEhZU19DQUNIRUQocGh5cyk7CisJYnplcm8oKGNoYXIgKikoY2FkZHJfdCl2YSAr
IG9mZiwgc2l6ZSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEgKyBvZmYsIHNpemUpOwor
fQorCit2b2lkCitwbWFwX3plcm9fcGFnZV9pZGxlKHZtX3BhZ2VfdCBtKQoreworCXZtX29mZnNl
dF90IHZhOworCXZtX3BhZGRyX3QgcGh5cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKKworCXZhID0g
TUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQocGh5cyk7CisJYnplcm8oKGNhZGRyX3QpdmEsIFBB
R0VfU0laRSk7CisJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7Cit9CisK
Ky8qCisgKglwbWFwX2NvcHlfcGFnZSBjb3BpZXMgdGhlIHNwZWNpZmllZCAobWFjaGluZSBpbmRl
cGVuZGVudCkKKyAqCXBhZ2UgYnkgbWFwcGluZyB0aGUgcGFnZSBpbnRvIHZpcnR1YWwgbWVtb3J5
IGFuZCB1c2luZworICoJYmNvcHkgdG8gY29weSB0aGUgcGFnZSwgb25lIG1hY2hpbmUgZGVwZW5k
ZW50IHBhZ2UgYXQgYQorICoJdGltZS4KKyAqCisgKiAJVXNlIFhLUEhZUyBmb3IgNjQgYml0LCBh
bmQgS1NFRzAgd2hlcmUgcG9zc2libGUgZm9yIDMyIGJpdC4KKyAqLwordm9pZAorcG1hcF9jb3B5
X3BhZ2Uodm1fcGFnZV90IHNyYywgdm1fcGFnZV90IGRzdCkKK3sKKwl2bV9vZmZzZXRfdCB2YV9z
cmMsIHZhX2RzdDsKKwl2bV9wYWRkcl90IHBoeV9zcmMgPSBWTV9QQUdFX1RPX1BIWVMoc3JjKTsK
Kwl2bV9wYWRkcl90IHBoeV9kc3QgPSBWTV9QQUdFX1RPX1BIWVMoZHN0KTsKKworCXBtYXBfZmx1
c2hfcHZjYWNoZShzcmMpOworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlX2luZGV4KE1JUFNfUEhZ
U19UT19YS1BIWVNfQ0FDSEVEKHBoeV9kc3QpLCBQQUdFX1NJWkUpOworCXZhX3NyYyA9IE1JUFNf
UEhZU19UT19YS1BIWVNfQ0FDSEVEKHBoeV9zcmMpOworCXZhX2RzdCA9IE1JUFNfUEhZU19UT19Y
S1BIWVNfQ0FDSEVEKHBoeV9kc3QpOworCWJjb3B5KChjYWRkcl90KXZhX3NyYywgKGNhZGRyX3Qp
dmFfZHN0LCBQQUdFX1NJWkUpOworCW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhX2RzdCwgUEFH
RV9TSVpFKTsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG1hcCdzIHB2IGlzIG9u
ZSBvZiB0aGUgZmlyc3QKKyAqIDE2IHB2cyBsaW5rZWQgdG8gZnJvbSB0aGlzIHBhZ2UuICBUaGlz
IGNvdW50IG1heQorICogYmUgY2hhbmdlZCB1cHdhcmRzIG9yIGRvd253YXJkcyBpbiB0aGUgZnV0
dXJlOyBpdAorICogaXMgb25seSBuZWNlc3NhcnkgdGhhdCB0cnVlIGJlIHJldHVybmVkIGZvciBh
IHNtYWxsCisgKiBzdWJzZXQgb2YgcG1hcHMgZm9yIHByb3BlciBwYWdlIGFnaW5nLgorICovCiti
b29sZWFuX3QKK3BtYXBfcGFnZV9leGlzdHNfcXVpY2socG1hcF90IHBtYXAsIHZtX3BhZ2VfdCBt
KQoreworCXB2X2VudHJ5X3QgcHY7CisJaW50IGxvb3BzID0gMDsKKwlib29sZWFuX3QgcnY7CisK
KwlLQVNTRVJUKChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgPT0g
MCwKKwkgICAgKCJwbWFwX3BhZ2VfZXhpc3RzX3F1aWNrOiBwYWdlICVwIGlzIG5vdCBtYW5hZ2Vk
IiwgbSkpOworCXJ2ID0gRkFMU0U7CisJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOworCVRBSUxRX0ZP
UkVBQ0gocHYsICZtLT5tZC5wdl9saXN0LCBwdl9saXN0KSB7CisJCWlmIChwdi0+cHZfcG1hcCA9
PSBwbWFwKSB7CisJCQlydiA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorCQlsb29wcysrOworCQlp
ZiAobG9vcHMgPj0gMTYpCisJCQlicmVhazsKKwl9CisJdm1fcGFnZV91bmxvY2tfcXVldWVzKCk7
CisJcmV0dXJuIChydik7Cit9CisKKy8qCisgKiBSZW1vdmUgYWxsIHBhZ2VzIGZyb20gc3BlY2lm
aWVkIGFkZHJlc3Mgc3BhY2UKKyAqIHRoaXMgYWlkcyBwcm9jZXNzIGV4aXQgc3BlZWRzLiAgQWxz
bywgdGhpcyBjb2RlCisgKiBpcyBzcGVjaWFsIGNhc2VkIGZvciBjdXJyZW50IHByb2Nlc3Mgb25s
eSwgYnV0CisgKiBjYW4gaGF2ZSB0aGUgbW9yZSBnZW5lcmljIChhbmQgc2xpZ2h0bHkgc2xvd2Vy
KQorICogbW9kZSBlbmFibGVkLiAgVGhpcyBpcyBtdWNoIGZhc3RlciB0aGFuIHBtYXBfcmVtb3Zl
CisgKiBpbiB0aGUgY2FzZSBvZiBydW5uaW5nIGRvd24gYW4gZW50aXJlIGFkZHJlc3Mgc3BhY2Uu
CisgKi8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3BhZ2VzKHBtYXBfdCBwbWFwKQoreworCXB0X2VudHJ5
X3QgKnB0ZSwgdHB0ZTsKKwlwdl9lbnRyeV90IHB2LCBucHY7CisJdm1fcGFnZV90IG07CisKKwlp
ZiAocG1hcCAhPSB2bXNwYWNlX3BtYXAoY3VydGhyZWFkLT50ZF9wcm9jLT5wX3Ztc3BhY2UpKSB7
CisJCXByaW50Zigid2FybmluZzogcG1hcF9yZW1vdmVfcGFnZXMgY2FsbGVkIHdpdGggbm9uLWN1
cnJlbnQgcG1hcFxuIik7CisJCXJldHVybjsKKwl9CisJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOwor
CVBNQVBfTE9DSyhwbWFwKTsKKwlzY2hlZF9waW4oKTsKKwkvL1hYWCBuZWVkIHRvIGJlIFRBSUxR
X0ZPUkVBQ0hfU0FGRSA/CisJZm9yIChwdiA9IFRBSUxRX0ZJUlNUKCZwbWFwLT5wbV9wdmxpc3Qp
OyBwdjsgcHYgPSBucHYpIHsKKwkJcHRlID0gcG1hcF9wdGUocHYtPnB2X3BtYXAsIHB2LT5wdl92
YSk7CisJCWlmIChwdGUgPT1OVUxMKQorCQkJcHJpbnRmKCJwdGUgZmFpbCAtICVwIHZhICVwXG4i
LAorCQkJCQlwdi0+cHZfcG1hcCwgKHZvaWQgKilwdi0+cHZfdmEpOworCQlpZiAoIXB0ZV90ZXN0
KHB0ZSwgUFRFX1YpKQorCQkJcGFuaWMoInBtYXBfcmVtb3ZlX3BhZ2VzOiBwYWdlIG9uIHBtX3B2
bGlzdCBoYXMgbm8gcHRlXG4iKTsKKwkJdHB0ZSA9ICpwdGU7CisKKy8qCisgKiBXZSBjYW5ub3Qg
cmVtb3ZlIHdpcmVkIHBhZ2VzIGZyb20gYSBwcm9jZXNzJyBtYXBwaW5nIGF0IHRoaXMgdGltZQor
ICovCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX1cpKSB7CisJCQlucHYgPSBUQUlMUV9ORVhU
KHB2LCBwdl9wbGlzdCk7CisJCQljb250aW51ZTsKKwkJfQorCQkqcHRlID0gaXNfa2VybmVsX3Bt
YXAocG1hcCkgPyBQVEVfRyA6IDA7CisKKwkJbSA9IFBIWVNfVE9fVk1fUEFHRShUTEJMT19QVEVf
VE9fUEEodHB0ZSkpOworCQlLQVNTRVJUKG0gIT0gTlVMTCwKKwkJICAgICgicG1hcF9yZW1vdmVf
cGFnZXM6IGJhZCB0cHRlICV4IiwgdHB0ZSkpOworCisJCXB2LT5wdl9wbWFwLT5wbV9zdGF0cy5y
ZXNpZGVudF9jb3VudC0tOworCisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgdm1fcGFnZV90IGNsZWFu
IGFuZCByZWZlcmVuY2UgYml0cy4KKwkJICovCisJCWlmIChwdGVfdGVzdCgmdHB0ZSwgUFRFX0Qp
KSB7CisJCQl2bV9wYWdlX2RpcnR5KG0pOworCQl9CisJCW5wdiA9IFRBSUxRX05FWFQocHYsIHB2
X3BsaXN0KTsKKwkJVEFJTFFfUkVNT1ZFKCZwdi0+cHZfcG1hcC0+cG1fcHZsaXN0LCBwdiwgcHZf
cGxpc3QpOworCisJCW0tPm1kLnB2X2xpc3RfY291bnQtLTsKKwkJVEFJTFFfUkVNT1ZFKCZtLT5t
ZC5wdl9saXN0LCBwdiwgcHZfbGlzdCk7CisJCWlmIChUQUlMUV9GSVJTVCgmbS0+bWQucHZfbGlz
dCkgPT0gTlVMTCkgeworCQkJdm1fcGFnZV9mbGFnX2NsZWFyKG0sIFBHX1dSSVRFQUJMRSk7CisJ
CX0KKwkJcG1hcF91bnVzZV9wdChwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhLCBwdi0+cHZfcHRlbSk7
CisJCWZyZWVfcHZfZW50cnkocHYpOworCX0KKwlzY2hlZF91bnBpbigpOworCXBtYXBfaW52YWxp
ZGF0ZV9hbGwocG1hcCk7CisJUE1BUF9VTkxPQ0socG1hcCk7CisJdm1fcGFnZV91bmxvY2tfcXVl
dWVzKCk7Cit9CisKKy8qCisgKiBwbWFwX3Rlc3RiaXQgdGVzdHMgYml0cyBpbiBwdGUncworICog
bm90ZSB0aGF0IHRoZSB0ZXN0Yml0L2NoYW5nZWJpdCByb3V0aW5lcyBhcmUgaW5saW5lLAorICog
YW5kIGEgbG90IG9mIHRoaW5ncyBjb21waWxlLXRpbWUgZXZhbHVhdGUuCisgKi8KK3N0YXRpYyBi
b29sZWFuX3QKK3BtYXBfdGVzdGJpdCh2bV9wYWdlX3QgbSwgaW50IGJpdCkKK3sKKwlwdl9lbnRy
eV90IHB2OworCXB0X2VudHJ5X3QgKnB0ZTsKKwlib29sZWFuX3QgcnYgPSBGQUxTRTsKKworCWlm
IChtLT5mbGFncyAmIFBHX0ZJQ1RJVElPVVMpCisJCXJldHVybiBydjsKKworCWlmIChUQUlMUV9G
SVJTVCgmbS0+bWQucHZfbGlzdCkgPT0gTlVMTCkKKwkJcmV0dXJuIHJ2OworCisJbXR4X2Fzc2Vy
dCgmdm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+
bWQucHZfbGlzdCwgcHZfbGlzdCkgeworI2lmIGRlZmluZWQoUE1BUF9ESUFHTk9TVElDKQorCQlp
ZiAoIXB2LT5wdl9wbWFwKSB7CisJCQlwcmludGYoIk51bGwgcG1hcCAodGIpIGF0IHZhOiAweCV4
XG4iLCBwdi0+cHZfdmEpOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCQlQTUFQX0xPQ0so
cHYtPnB2X3BtYXApOworCQlwdGUgPSBwbWFwX3B0ZShwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhKTsK
KwkJcnYgPSBwdGVfdGVzdChwdGUsIGJpdCk7CisJCVBNQVBfVU5MT0NLKHB2LT5wdl9wbWFwKTsK
KwkJaWYgKHJ2KQorCQkJYnJlYWs7CisJfQorCXJldHVybiAocnYpOworfQorCisvKgorICogdGhp
cyByb3V0aW5lIGlzIHVzZWQgdG8gY2xlYXIgZGlydHkgYml0cyBpbiBwdGVzCisgKi8KK3N0YXRp
YyBfX2lubGluZSB2b2lkCitwbWFwX2NoYW5nZWJpdCh2bV9wYWdlX3QgbSwgaW50IGJpdCwgYm9v
bGVhbl90IHNldGVtKQoreworCXB2X2VudHJ5X3QgcHY7CisJcHRfZW50cnlfdCAqcHRlOworCisJ
aWYgKG0tPmZsYWdzICYgUEdfRklDVElUSU9VUykKKwkJcmV0dXJuOworCisJbXR4X2Fzc2VydCgm
dm1fcGFnZV9xdWV1ZV9tdHgsIE1BX09XTkVEKTsKKwkvKgorCSAqIExvb3Agb3ZlciBhbGwgY3Vy
cmVudCBtYXBwaW5ncyBzZXR0aW5nL2NsZWFyaW5nIGFzIGFwcHJvcG9zIElmCisJICogc2V0dGlu
ZyBSTyBkbyB3ZSBuZWVkIHRvIGNsZWFyIHRoZSBWQUM/CisJICovCisJVEFJTFFfRk9SRUFDSChw
diwgJm0tPm1kLnB2X2xpc3QsIHB2X2xpc3QpIHsKKyNpZiBkZWZpbmVkKFBNQVBfRElBR05PU1RJ
QykKKwkJaWYgKCFwdi0+cHZfcG1hcCkgeworCQkJcHJpbnRmKCJOdWxsIHBtYXAgKGNiKSBhdCB2
YTogMHgleFxuIiwgcHYtPnB2X3ZhKTsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKworCQlQ
TUFQX0xPQ0socHYtPnB2X3BtYXApOworCQlwdGUgPSBwbWFwX3B0ZShwdi0+cHZfcG1hcCwgcHYt
PnB2X3ZhKTsKKwkJaWYgKHNldGVtKSB7CisJCQkqcHRlIHw9IGJpdDsKKwkJCXBtYXBfdXBkYXRl
X3BhZ2UocHYtPnB2X3BtYXAsIHB2LT5wdl92YSwgKnB0ZSk7CisJCX0gZWxzZSB7CisJCQlwdF9l
bnRyeV90ICBwYml0cyA9ICpwdGU7CisKKwkJCWlmIChwYml0cyAmIGJpdCkgeworCQkJCWlmIChi
aXQgPT0gUFRFX0QpIHsKKwkJCQkJaWYgKHBiaXRzICYgUFRFX0QpIHsKKwkJCQkJCXZtX3BhZ2Vf
ZGlydHkobSk7CisJCQkJCX0KKwkJCQkJKnB0ZSA9IChwYml0cyAmIH5QVEVfRCkgfCBQVEVfUk87
CisJCQkJfSBlbHNlIHsKKwkJCQkJKnB0ZSA9IHBiaXRzICYgfmJpdDsKKwkJCQl9CisJCQkJcG1h
cF91cGRhdGVfcGFnZShwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhLCAqcHRlKTsKKwkJCX0KKwkJfQor
CQlQTUFQX1VOTE9DSyhwdi0+cHZfcG1hcCk7CisJfQorCWlmICghc2V0ZW0gJiYgYml0ID09IFBU
RV9EKQorCQl2bV9wYWdlX2ZsYWdfY2xlYXIobSwgUEdfV1JJVEVBQkxFKTsKK30KKworLyoKKyAq
CXBtYXBfcGFnZV93aXJlZF9tYXBwaW5nczoKKyAqCisgKglSZXR1cm4gdGhlIG51bWJlciBvZiBt
YW5hZ2VkIG1hcHBpbmdzIHRvIHRoZSBnaXZlbiBwaHlzaWNhbCBwYWdlCisgKgl0aGF0IGFyZSB3
aXJlZC4KKyAqLworaW50CitwbWFwX3BhZ2Vfd2lyZWRfbWFwcGluZ3Modm1fcGFnZV90IG0pCit7
CisJcHZfZW50cnlfdCBwdjsKKwlpbnQgY291bnQ7CisKKwljb3VudCA9IDA7CisJaWYgKChtLT5m
bGFncyAmIFBHX0ZJQ1RJVElPVVMpICE9IDApCisJCXJldHVybiAoY291bnQpOworCXZtX3BhZ2Vf
bG9ja19xdWV1ZXMoKTsKKwlUQUlMUV9GT1JFQUNIKHB2LCAmbS0+bWQucHZfbGlzdCwgcHZfbGlz
dCkKKwkgICAgaWYgKHB2LT5wdl93aXJlZCkKKwkJY291bnQrKzsKKwl2bV9wYWdlX3VubG9ja19x
dWV1ZXMoKTsKKwlyZXR1cm4gKGNvdW50KTsKK30KKworLyoKKyAqIENsZWFyIHRoZSB3cml0ZSBh
bmQgbW9kaWZpZWQgYml0cyBpbiBlYWNoIG9mIHRoZSBnaXZlbiBwYWdlJ3MgbWFwcGluZ3MuCisg
Ki8KK3ZvaWQKK3BtYXBfcmVtb3ZlX3dyaXRlKHZtX3BhZ2VfdCBtKQoreworCXB2X2VudHJ5X3Qg
cHYsIG5wdjsKKwl2bV9vZmZzZXRfdCB2YTsKKwlwdF9lbnRyeV90ICpwdGU7CisKKwlLQVNTRVJU
KChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdfVU5NQU5BR0VEKSkgPT0gMCwKKwkgICAg
KCJwbWFwX3JlbW92ZV93cml0ZTogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKworCS8q
CisJICogSWYgdGhlIHBhZ2UgaXMgbm90IFZQT19CVVNZLCB0aGVuIFBHX1dSSVRFQUJMRSBjYW5u
b3QgYmUgc2V0IGJ5CisJICogYW5vdGhlciB0aHJlYWQgd2hpbGUgdGhlIG9iamVjdCBpcyBsb2Nr
ZWQuICBUaHVzLCBpZiBQR19XUklURUFCTEUKKwkgKiBpcyBjbGVhciwgbm8gcGFnZSB0YWJsZSBl
bnRyaWVzIG5lZWQgdXBkYXRpbmcuCisJICovCisJVk1fT0JKRUNUX0xPQ0tfQVNTRVJUKG0tPm9i
amVjdCwgTUFfT1dORUQpOworCWlmICgobS0+b2ZsYWdzICYgVlBPX0JVU1kpID09IDAgJiYKKwkg
ICAgKG0tPmZsYWdzICYgUEdfV1JJVEVBQkxFKSA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAq
IExvb3Agb3ZlciBhbGwgY3VycmVudCBtYXBwaW5ncyBzZXR0aW5nL2NsZWFyaW5nIGFzIGFwcHJv
cG9zLgorCSAqLworCXZtX3BhZ2VfbG9ja19xdWV1ZXMoKTsKKwlmb3IgKHB2ID0gVEFJTFFfRklS
U1QoJm0tPm1kLnB2X2xpc3QpOyBwdjsgcHYgPSBucHYpIHsKKwkJbnB2ID0gVEFJTFFfTkVYVChw
diwgcHZfcGxpc3QpOworCQlwdGUgPSBwbWFwX3B0ZShwdi0+cHZfcG1hcCwgcHYtPnB2X3ZhKTsK
KwkJaWYgKHB0ZSA9PSBOVUxMIHx8ICFwdGVfdGVzdChwdGUsIFBURV9WKSkKKwkJCXBhbmljKCJw
YWdlIG9uIHBtX3B2bGlzdCBoYXMgbm8gcHRlXG4iKTsKKworCQl2YSA9IHB2LT5wdl92YTsKKwkJ
cG1hcF9wcm90ZWN0KHB2LT5wdl9wbWFwLCB2YSwgdmEgKyBQQUdFX1NJWkUsCisJCSAgICBWTV9Q
Uk9UX1JFQUQgfCBWTV9QUk9UX0VYRUNVVEUpOworCX0KKwl2bV9wYWdlX2ZsYWdfY2xlYXIobSwg
UEdfV1JJVEVBQkxFKTsKKwl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKK30KKworLyoKKyAqCXBt
YXBfdHNfcmVmZXJlbmNlZDoKKyAqCisgKglSZXR1cm4gdGhlIGNvdW50IG9mIHJlZmVyZW5jZSBi
aXRzIGZvciBhIHBhZ2UsIGNsZWFyaW5nIGFsbCBvZiB0aGVtLgorICovCitpbnQKK3BtYXBfdHNf
cmVmZXJlbmNlZCh2bV9wYWdlX3QgbSkKK3sKKworCUtBU1NFUlQoKG0tPmZsYWdzICYgKFBHX0ZJ
Q1RJVElPVVMgfCBQR19VTk1BTkFHRUQpKSA9PSAwLAorCSAgICAoInBtYXBfdHNfcmVmZXJlbmNl
ZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKwlpZiAobS0+bWQucHZfZmxhZ3MgJiBQ
Vl9UQUJMRV9SRUYpIHsKKwkJdm1fcGFnZV9sb2NrX3F1ZXVlcygpOworCQltLT5tZC5wdl9mbGFn
cyAmPSB+UFZfVEFCTEVfUkVGOworCQl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKKwkJcmV0dXJu
ICgxKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqCXBtYXBfaXNfbW9kaWZpZWQ6Cisg
KgorICoJUmV0dXJuIHdoZXRoZXIgb3Igbm90IHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwgcGFnZSB3
YXMgbW9kaWZpZWQKKyAqCWluIGFueSBwaHlzaWNhbCBtYXBzLgorICovCitib29sZWFuX3QKK3Bt
YXBfaXNfbW9kaWZpZWQodm1fcGFnZV90IG0pCit7CisJYm9vbGVhbl90IHJ2OworCisJS0FTU0VS
VCgobS0+ZmxhZ3MgJiAoUEdfRklDVElUSU9VUyB8IFBHX1VOTUFOQUdFRCkpID09IDAsCisJICAg
ICgicG1hcF9pc19tb2RpZmllZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsKKworCS8q
CisJICogSWYgdGhlIHBhZ2UgaXMgbm90IFZQT19CVVNZLCB0aGVuIFBHX1dSSVRFQUJMRSBjYW5u
b3QgYmUKKwkgKiBjb25jdXJyZW50bHkgc2V0IHdoaWxlIHRoZSBvYmplY3QgaXMgbG9ja2VkLiAg
VGh1cywgaWYgUEdfV1JJVEVBQkxFCisJICogaXMgY2xlYXIsIG5vIFBURXMgY2FuIGhhdmUgUFRF
X0Qgc2V0LgorCSAqLworCVZNX09CSkVDVF9MT0NLX0FTU0VSVChtLT5vYmplY3QsIE1BX09XTkVE
KTsKKwlpZiAoKG0tPm9mbGFncyAmIFZQT19CVVNZKSA9PSAwICYmCisJICAgIChtLT5mbGFncyAm
IFBHX1dSSVRFQUJMRSkgPT0gMCkKKwkJcmV0dXJuIChGQUxTRSk7CisJdm1fcGFnZV9sb2NrX3F1
ZXVlcygpOworCWlmIChtLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX01PRCkKKwkJcnYgPSBUUlVF
OworCWVsc2UKKwkJcnYgPSBwbWFwX3Rlc3RiaXQobSwgUFRFX0QpOworCXZtX3BhZ2VfdW5sb2Nr
X3F1ZXVlcygpOworCXJldHVybiAocnYpOworfQorCisvKiBOL0MgKi8KKworLyoKKyAqCXBtYXBf
aXNfcHJlZmF1bHRhYmxlOgorICoKKyAqCVJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lm
aWVkIHZpcnR1YWwgYWRkcmVzcyBpcyBlbGdpYmxlCisgKglmb3IgcHJlZmF1bHQuCisgKi8KK2Jv
b2xlYW5fdAorcG1hcF9pc19wcmVmYXVsdGFibGUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFk
ZHIpCit7CisJcHRfZW50cnlfdCAqcHRlOworCWJvb2xlYW5fdCBydjsKKworCXJ2ID0gRkFMU0U7
CisJUE1BUF9MT0NLKHBtYXApOworCWlmIChwbWFwX3NlZ21hcChwbWFwLCBhZGRyKSAhPSBOVUxM
KSB7CisJCXB0ZSA9IHBtYXBfcHRlKHBtYXAsIGFkZHIpOworCQlydiA9ICgqcHRlID09IDApOwor
CX0KKwlQTUFQX1VOTE9DSyhwbWFwKTsKKwlyZXR1cm4gKHJ2KTsKK30KKworLyoKKyAqCUNsZWFy
IHRoZSBtb2RpZnkgYml0cyBvbiB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHBhZ2UuCisgKi8KK3Zv
aWQKK3BtYXBfY2xlYXJfbW9kaWZ5KHZtX3BhZ2VfdCBtKQoreworCisJS0FTU0VSVCgobS0+Zmxh
Z3MgJiAoUEdfRklDVElUSU9VUyB8IFBHX1VOTUFOQUdFRCkpID09IDAsCisJICAgICgicG1hcF9j
bGVhcl9tb2RpZnk6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJVk1fT0JKRUNUX0xP
Q0tfQVNTRVJUKG0tPm9iamVjdCwgTUFfT1dORUQpOworCUtBU1NFUlQoKG0tPm9mbGFncyAmIFZQ
T19CVVNZKSA9PSAwLAorCSAgICAoInBtYXBfY2xlYXJfbW9kaWZ5OiBwYWdlICVwIGlzIGJ1c3ki
LCBtKSk7CisKKwkvKgorCSAqIElmIHRoZSBwYWdlIGlzIG5vdCBQR19XUklURUFCTEUsIHRoZW4g
bm8gUFRFcyBjYW4gaGF2ZSBQVEVfRCBzZXQuCisJICogSWYgdGhlIG9iamVjdCBjb250YWluaW5n
IHRoZSBwYWdlIGlzIGxvY2tlZCBhbmQgdGhlIHBhZ2UgaXMgbm90CisJICogVlBPX0JVU1ksIHRo
ZW4gUEdfV1JJVEVBQkxFIGNhbm5vdCBiZSBjb25jdXJyZW50bHkgc2V0LgorCSAqLworCWlmICgo
bS0+ZmxhZ3MgJiBQR19XUklURUFCTEUpID09IDApCisJCXJldHVybjsKKwl2bV9wYWdlX2xvY2tf
cXVldWVzKCk7CisJaWYgKG0tPm1kLnB2X2ZsYWdzICYgUFZfVEFCTEVfTU9EKSB7CisJCXBtYXBf
Y2hhbmdlYml0KG0sIFBURV9ELCBGQUxTRSk7CisJCW0tPm1kLnB2X2ZsYWdzICY9IH5QVl9UQUJM
RV9NT0Q7CisJfQorCXZtX3BhZ2VfdW5sb2NrX3F1ZXVlcygpOworfQorCisvKgorICoJcG1hcF9p
c19yZWZlcmVuY2VkOgorICoKKyAqCVJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVk
IHBoeXNpY2FsIHBhZ2Ugd2FzIHJlZmVyZW5jZWQKKyAqCWluIGFueSBwaHlzaWNhbCBtYXBzLgor
ICovCitib29sZWFuX3QKK3BtYXBfaXNfcmVmZXJlbmNlZCh2bV9wYWdlX3QgbSkKK3sKKworCUtB
U1NFUlQoKG0tPmZsYWdzICYgKFBHX0ZJQ1RJVElPVVMgfCBQR19VTk1BTkFHRUQpKSA9PSAwLAor
CSAgICAoInBtYXBfaXNfcmVmZXJlbmNlZDogcGFnZSAlcCBpcyBub3QgbWFuYWdlZCIsIG0pKTsK
KwlyZXR1cm4gKChtLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikgIT0gMCk7Cit9CisKKy8q
CisgKglwbWFwX2NsZWFyX3JlZmVyZW5jZToKKyAqCisgKglDbGVhciB0aGUgcmVmZXJlbmNlIGJp
dCBvbiB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHBhZ2UuCisgKi8KK3ZvaWQKK3BtYXBfY2xlYXJf
cmVmZXJlbmNlKHZtX3BhZ2VfdCBtKQoreworCisJS0FTU0VSVCgobS0+ZmxhZ3MgJiAoUEdfRklD
VElUSU9VUyB8IFBHX1VOTUFOQUdFRCkpID09IDAsCisJICAgICgicG1hcF9jbGVhcl9yZWZlcmVu
Y2U6IHBhZ2UgJXAgaXMgbm90IG1hbmFnZWQiLCBtKSk7CisJdm1fcGFnZV9sb2NrX3F1ZXVlcygp
OworCWlmIChtLT5tZC5wdl9mbGFncyAmIFBWX1RBQkxFX1JFRikgeworCQltLT5tZC5wdl9mbGFn
cyAmPSB+UFZfVEFCTEVfUkVGOworCX0KKwl2bV9wYWdlX3VubG9ja19xdWV1ZXMoKTsKK30KKwor
LyoKKyAqIE1pc2NlbGxhbmVvdXMgc3VwcG9ydCByb3V0aW5lcyBmb2xsb3cKKyAqLworCisvKgor
ICogTWFwIGEgc2V0IG9mIHBoeXNpY2FsIG1lbW9yeSBwYWdlcyBpbnRvIHRoZSBrZXJuZWwgdmly
dHVhbAorICogYWRkcmVzcyBzcGFjZS4gUmV0dXJuIGEgcG9pbnRlciB0byB3aGVyZSBpdCBpcyBt
YXBwZWQuIFRoaXMKKyAqIHJvdXRpbmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbWFwcGlu
ZyBkZXZpY2UgbWVtb3J5LAorICogTk9UIHJlYWwgbWVtb3J5LgorICovCisKKy8qCisgKiBNYXAg
YSBzZXQgb2YgcGh5c2ljYWwgbWVtb3J5IHBhZ2VzIGludG8gdGhlIGtlcm5lbCB2aXJ0dWFsCisg
KiBhZGRyZXNzIHNwYWNlLiBSZXR1cm4gYSBwb2ludGVyIHRvIHdoZXJlIGl0IGlzIG1hcHBlZC4g
VGhpcworICogcm91dGluZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBtYXBwaW5nIGRldmlj
ZSBtZW1vcnksCisgKiBOT1QgcmVhbCBtZW1vcnkuCisgKgorICogVXNlIFhLUEhZUyB1bmNhY2hl
ZCBmb3IgNjQgYml0LCBhbmQgS1NFRzEgd2hlcmUgcG9zc2libGUgZm9yIDMyIGJpdC4KKyAqLwor
dm9pZCAqCitwbWFwX21hcGRldih2bV9vZmZzZXRfdCBwYSwgdm1fc2l6ZV90IHNpemUpCit7CisJ
cmV0dXJuICgodm9pZCAqKU1JUFNfUEhZU19UT19YS1BIWVNfVU5DQUNIRUQocGEpKTsKK30KKwor
dm9pZAorcG1hcF91bm1hcGRldih2bV9vZmZzZXRfdCB2YSwgdm1fc2l6ZV90IHNpemUpCit7Cit9
CisKKy8qCisgKiBwZXJmb3JtIHRoZSBwbWFwIHdvcmsgZm9yIG1pbmNvcmUKKyAqLworaW50Citw
bWFwX21pbmNvcmUocG1hcF90IHBtYXAsIHZtX29mZnNldF90IGFkZHIsIHZtX3BhZGRyX3QgKmxv
Y2tlZF9wYSkKK3sKKwlwdF9lbnRyeV90ICpwdGVwLCBwdGU7CisJdm1fb2Zmc2V0X3QgcGE7CisJ
dm1fcGFnZV90IG07CisJaW50IHZhbDsKKwlib29sZWFuX3QgbWFuYWdlZDsKKworCVBNQVBfTE9D
SyhwbWFwKTsKK3JldHJ5OgorCXB0ZXAgPSBwbWFwX3B0ZShwbWFwLCBhZGRyKTsKKwlwdGUgPSAo
cHRlcCAhPSBOVUxMKSA/ICpwdGVwIDogMDsKKwlpZiAoIXB0ZV90ZXN0KCZwdGUsIFBURV9WKSkg
eworCQl2YWwgPSAwOworCQlnb3RvIG91dDsKKwl9CisJdmFsID0gTUlOQ09SRV9JTkNPUkU7CisJ
aWYgKHB0ZV90ZXN0KCZwdGUsIFBURV9EKSkKKwkJdmFsIHw9IE1JTkNPUkVfTU9ESUZJRUQgfCBN
SU5DT1JFX01PRElGSUVEX09USEVSOworCXBhID0gVExCTE9fUFRFX1RPX1BBKHB0ZSk7CisJbWFu
YWdlZCA9IHBhZ2VfaXNfbWFuYWdlZChwYSk7CisJaWYgKG1hbmFnZWQpIHsKKwkJLyoKKwkJICog
VGhpcyBtYXkgZmFsc2VseSByZXBvcnQgdGhlIGdpdmVuIGFkZHJlc3MgYXMKKwkJICogTUlOQ09S
RV9SRUZFUkVOQ0VELiAgVW5mb3J0dW5hdGVseSwgZHVlIHRvIHRoZSBsYWNrIG9mCisJCSAqIHBl
ci1QVEUgcmVmZXJlbmNlIGluZm9ybWF0aW9uLCBpdCBpcyBpbXBvc3NpYmxlIHRvCisJCSAqIGRl
dGVybWluZSBpZiB0aGUgYWRkcmVzcyBpcyBNSU5DT1JFX1JFRkVSRU5DRUQuICAKKwkJICovCisJ
CW0gPSBQSFlTX1RPX1ZNX1BBR0UocGEpOworCQlpZiAoKG0tPmZsYWdzICYgUEdfUkVGRVJFTkNF
RCkgIT0gMCkKKwkJCXZhbCB8PSBNSU5DT1JFX1JFRkVSRU5DRUQgfCBNSU5DT1JFX1JFRkVSRU5D
RURfT1RIRVI7CisJfQorCWlmICgodmFsICYgKE1JTkNPUkVfTU9ESUZJRURfT1RIRVIgfCBNSU5D
T1JFX1JFRkVSRU5DRURfT1RIRVIpKSAhPQorCSAgICAoTUlOQ09SRV9NT0RJRklFRF9PVEhFUiB8
IE1JTkNPUkVfUkVGRVJFTkNFRF9PVEhFUikgJiYgbWFuYWdlZCkgeworCQkvKiBFbnN1cmUgdGhh
dCAiUEhZU19UT19WTV9QQUdFKHBhKS0+b2JqZWN0IiBkb2Vzbid0IGNoYW5nZS4gKi8KKwkJaWYg
KHZtX3BhZ2VfcGFfdHJ5cmVsb2NrKHBtYXAsIHBhLCBsb2NrZWRfcGEpKQorCQkJZ290byByZXRy
eTsKKwl9IGVsc2UKK291dDoKKwkJUEFfVU5MT0NLX0NPTkQoKmxvY2tlZF9wYSk7CisJUE1BUF9V
TkxPQ0socG1hcCk7CisJcmV0dXJuICh2YWwpOworfQorCit2b2lkCitwbWFwX2FjdGl2YXRlKHN0
cnVjdCB0aHJlYWQgKnRkKQoreworCXBtYXBfdCBwbWFwLCBvbGRwbWFwOworCXN0cnVjdCBwcm9j
ICpwID0gdGQtPnRkX3Byb2M7CisKKwljcml0aWNhbF9lbnRlcigpOworCisJcG1hcCA9IHZtc3Bh
Y2VfcG1hcChwLT5wX3Ztc3BhY2UpOworCW9sZHBtYXAgPSBQQ1BVX0dFVChjdXJwbWFwKTsKKwor
CWlmIChvbGRwbWFwKQorCQlhdG9taWNfY2xlYXJfMzIoJm9sZHBtYXAtPnBtX2FjdGl2ZSwgUENQ
VV9HRVQoY3B1bWFzaykpOworCWF0b21pY19zZXRfMzIoJnBtYXAtPnBtX2FjdGl2ZSwgUENQVV9H
RVQoY3B1bWFzaykpOworCXBtYXBfYXNpZF9hbGxvYyhwbWFwKTsKKwlpZiAodGQgPT0gY3VydGhy
ZWFkKSB7CisJCVBDUFVfU0VUKHNlZ2Jhc2UsIHBtYXAtPnBtX3NlZ3RhYik7CisJCW1pcHNfd3Jf
ZW50cnloaShwbWFwLT5wbV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uYXNpZCk7CisJfQorCisJUENQ
VV9TRVQoY3VycG1hcCwgcG1hcCk7CisJY3JpdGljYWxfZXhpdCgpOworfQorCit2b2lkCitwbWFw
X3N5bmNfaWNhY2hlKHBtYXBfdCBwbSwgdm1fb2Zmc2V0X3QgdmEsIHZtX3NpemVfdCBzeikKK3sK
K30KKworLyoKKyAqCUluY3JlYXNlIHRoZSBzdGFydGluZyB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhl
IGdpdmVuIG1hcHBpbmcgaWYgYQorICoJZGlmZmVyZW50IGFsaWdubWVudCBtaWdodCByZXN1bHQg
aW4gbW9yZSBzdXBlcnBhZ2UgbWFwcGluZ3MuCisgKi8KK3ZvaWQKK3BtYXBfYWxpZ25fc3VwZXJw
YWdlKHZtX29iamVjdF90IG9iamVjdCwgdm1fb29mZnNldF90IG9mZnNldCwKKyAgICB2bV9vZmZz
ZXRfdCAqYWRkciwgdm1fc2l6ZV90IHNpemUpCit7CisJdm1fb2Zmc2V0X3Qgc3VwZXJwYWdlX29m
ZnNldDsKKworCWlmIChzaXplIDwgTkJTRUcpCisJCXJldHVybjsKKwlpZiAob2JqZWN0ICE9IE5V
TEwgJiYgKG9iamVjdC0+ZmxhZ3MgJiBPQkpfQ09MT1JFRCkgIT0gMCkKKwkJb2Zmc2V0ICs9IHB0
b2Eob2JqZWN0LT5wZ19jb2xvcik7CisJc3VwZXJwYWdlX29mZnNldCA9IG9mZnNldCAmIFNFR01B
U0s7CisJaWYgKHNpemUgLSAoKE5CU0VHIC0gc3VwZXJwYWdlX29mZnNldCkgJiBTRUdNQVNLKSA8
IE5CU0VHIHx8CisJICAgICgqYWRkciAmIFNFR01BU0spID09IHN1cGVycGFnZV9vZmZzZXQpCisJ
CXJldHVybjsKKwlpZiAoKCphZGRyICYgU0VHTUFTSykgPCBzdXBlcnBhZ2Vfb2Zmc2V0KQorCQkq
YWRkciA9ICgqYWRkciAmIH5TRUdNQVNLKSArIHN1cGVycGFnZV9vZmZzZXQ7CisJZWxzZQorCQkq
YWRkciA9ICgoKmFkZHIgKyBTRUdNQVNLKSAmIH5TRUdNQVNLKSArIHN1cGVycGFnZV9vZmZzZXQ7
Cit9CisKKy8qCisgKiAJSW5jcmVhc2UgdGhlIHN0YXJ0aW5nIHZpcnR1YWwgYWRkcmVzcyBvZiB0
aGUgZ2l2ZW4gbWFwcGluZyBzbworICogCXRoYXQgaXQgaXMgYWxpZ25lZCB0byBub3QgYmUgdGhl
IHNlY29uZCBwYWdlIGluIGEgVExCIGVudHJ5LgorICogCVRoaXMgcm91dGluZSBhc3N1bWVzIHRo
YXQgdGhlIGxlbmd0aCBpcyBhcHByb3ByaWF0ZWx5LXNpemVkIHNvCisgKiAJdGhhdCB0aGUgYWxs
b2NhdGlvbiBkb2VzIG5vdCBzaGFyZSBhIFRMQiBlbnRyeSBhdCBhbGwgaWYgcmVxdWlyZWQuCisg
Ki8KK3ZvaWQKK3BtYXBfYWxpZ25fdGxiKHZtX29mZnNldF90ICphZGRyKQoreworCWlmICgoKmFk
ZHIgJiBQQUdFX1NJWkUpID09IDApCisJCXJldHVybjsKKwkqYWRkciArPSBQQUdFX1NJWkU7CisJ
cmV0dXJuOworfQorCitEQl9TSE9XX0NPTU1BTkQocHRhYmxlLCBkZGJfcGlkX2R1bXApCit7CisJ
cG1hcF90IHBtYXA7CisJc3RydWN0IHRocmVhZCAqdGQgPSBOVUxMOworCXN0cnVjdCBwcm9jICpw
OworCWludCBpLCBqLCBrOworCXZtX3BhZGRyX3QgcGE7CisJdm1fb2Zmc2V0X3QgdmE7CisKKwlp
ZiAoaGF2ZV9hZGRyKSB7CisJCXRkID0gZGJfbG9va3VwX3RocmVhZChhZGRyLCBUUlVFKTsKKwkJ
aWYgKHRkID09IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiSW52YWxpZCBwaWQgb3IgdGlkIik7CisJ
CQlyZXR1cm47CisJCX0KKwkJcCA9IHRkLT50ZF9wcm9jOworCQlpZiAocC0+cF92bXNwYWNlID09
IE5VTEwpIHsKKwkJCWRiX3ByaW50ZigiTm8gdm1zcGFjZSBmb3IgcHJvY2VzcyIpOworCQkJcmV0
dXJuOworCQl9CisJCQlwbWFwID0gdm1zcGFjZV9wbWFwKHAtPnBfdm1zcGFjZSk7CisJfSBlbHNl
CisJCXBtYXAgPSBrZXJuZWxfcG1hcDsKKworCXByaW50ZigicG1hcDolcCBzZWd0YWI6JXAgYXNp
ZDoleCBnZW5lcmF0aW9uOiV4XG4iLAorCSAgICBwbWFwLCBwbWFwLT5wbV9zZWd0YWIsCisJCQkg
ICAgICAgcG1hcC0+cG1fYXNpZFswXS5hc2lkLAorCQkJICAgICAgIHBtYXAtPnBtX2FzaWRbMF0u
Z2VuKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlBERVBHOyBpKyspIHsKKwkJcGRfZW50cnlfdCAqcGRw
ZTsKKwkJcHRfZW50cnlfdCAqcGRlOworCQlwdF9lbnRyeV90IHB0ZTsKKworCQlwZHBlID0gKHBk
X2VudHJ5X3QgKilwbWFwLT5wbV9zZWd0YWJbaV07CisJCWlmIChwZHBlID09IE5VTEwpCisJCQlj
b250aW51ZTsKKwkJZGJfcHJpbnRmKCJbJTRkXSAlcFxuIiwgaSwgcGRwZSk7CisJCWZvciAoaiA9
IDA7IGogPCBOUERFUEc7IGorKykgeworCQkJcGRlID0gKHB0X2VudHJ5X3QgKilwZHBlW2pdOwor
CQkJaWYgKHBkZSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJZGJfcHJpbnRmKCJcdFslNGRd
ICVwXG4iLCBqLCBwZGUpOworCQkJZm9yIChrID0gMDsgayA8IE5QVEVQRzsgaysrKSB7CisJCQkJ
cHRlID0gcGRlW2tdOworCQkJCWlmIChwdGUgPT0gMCB8fCAhcHRlX3Rlc3QoJnB0ZSwgUFRFX1Yp
KQorCQkJCQljb250aW51ZTsKKwkJCQlwYSA9IFRMQkxPX1BURV9UT19QQShwdGUpOworCQkJCXZh
ID0gKCh1X2xvbmcpaSA8PCBTRUdTSElGVCkgfCAoaiA8PCBQRFJTSElGVCkgfCAoayA8PCBQQUdF
X1NISUZUKTsKKwkJCQlwcmludGYoIlx0XHRbJTA0ZF0gdmE6ICVwIHB0ZTogJTh4IHBhOiVseFxu
IiwKKwkJCQkJCWssICh2b2lkICopdmEsIHB0ZSwgKHVfbG9uZylwYSk7CisKKyNpZiAwCisJCQkJ
CQkJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJCQkJcHJpbnRmKCJcdFx0WyUwNGRdIHZhOiAl
cCwgcHQ6ICVwLCBoOiAlZCwgdzogJWQsIGY6IDB4JXhcbiIsCisJCQkJICAgICAgIGssICh2b2lk
ICopdmEsICh2b2lkICopcGEsICBtLT5ob2xkX2NvdW50LAorCQkJCQkJCSAgICBtLT53aXJlX2Nv
dW50LAorCQkJCQkJCSAgICBtLT5mbGFncyk7CisjZW5kaWYKKwkJCX0KKwkJfQorCX0KK30KKwor
CisjaWYgZGVmaW5lZChERUJVRykKKworc3RhdGljIHZvaWQgcGFkcyhwbWFwX3QgcG0pOwordm9p
ZCBwbWFwX3B2ZHVtcCh2bV9vZmZzZXRfdCBwYSk7CisKKy8qIHByaW50IGFkZHJlc3Mgc3BhY2Ug
b2YgcG1hcCovCitzdGF0aWMgdm9pZAorcGFkcyhwbWFwX3QgcG0pCit7CisJdW5zaWduZWQgdmEs
IGksIGo7CisJcHRfZW50cnlfdCAqcHRlcDsKKworCWlmIChwbSA9PSBrZXJuZWxfcG1hcCkKKwkJ
cmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBOUFRFUEc7IGkrKykKKwkJaWYgKHBtLT5wbV9zZWd0
YWJbaV0pCisJCQlmb3IgKGogPSAwOyBqIDwgTlBURVBHOyBqKyspIHsKKwkJCQl2YSA9IChpIDw8
IFNFR1NISUZUKSArIChqIDw8IFBBR0VfU0hJRlQpOworCQkJCWlmIChwbSA9PSBrZXJuZWxfcG1h
cCAmJiB2YSA8IEtFUk5CQVNFKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAocG0gIT0ga2VybmVs
X3BtYXAgJiYKKwkJCQkgICAgdmEgPj0gVk1fTUFYVVNFUl9BRERSRVNTKQorCQkJCQljb250aW51
ZTsKKwkJCQlwdGVwID0gcG1hcF9wdGUocG0sIHZhKTsKKwkJCQlpZiAocG1hcF9wdGVfdihwdGVw
KSkKKwkJCQkJcHJpbnRmKCIleDoleCAiLCB2YSwgKihpbnQgKilwdGVwKTsKKwkJCX0KKworfQor
Cit2b2lkCitwbWFwX3B2ZHVtcCh2bV9vZmZzZXRfdCBwYSkKK3sKKwlyZWdpc3RlciBwdl9lbnRy
eV90IHB2OworCXZtX3BhZ2VfdCBtOworCisJcHJpbnRmKCJwYSAleCIsIHBhKTsKKwltID0gUEhZ
U19UT19WTV9QQUdFKHBhKTsKKwlmb3IgKHB2ID0gVEFJTFFfRklSU1QoJm0tPm1kLnB2X2xpc3Qp
OyBwdjsKKwkgICAgcHYgPSBUQUlMUV9ORVhUKHB2LCBwdl9saXN0KSkgeworCQlwcmludGYoIiAt
PiBwbWFwICVwLCB2YSAleCIsICh2b2lkICopcHYtPnB2X3BtYXAsIHB2LT5wdl92YSk7CisJCXBh
ZHMocHYtPnB2X3BtYXApOworCX0KKwlwcmludGYoIiAiKTsKK30KKworLyogTi9DICovCisjZW5k
aWYKKworCisvKgorICogQWxsb2NhdGUgVExCIGFkZHJlc3Mgc3BhY2UgdGFnIChjYWxsZWQgQVNJ
RCBvciBUTEJQSUQpIGFuZCByZXR1cm4gaXQuCisgKiBJdCB0YWtlcyBhbG1vc3QgYXMgbXVjaCBv
ciBtb3JlIHRpbWUgdG8gc2VhcmNoIHRoZSBUTEIgZm9yIGEKKyAqIHNwZWNpZmljIEFTSUQgYW5k
IGZsdXNoIHRob3NlIGVudHJpZXMgYXMgaXQgZG9lcyB0byBmbHVzaCB0aGUgZW50aXJlIFRMQi4K
KyAqIFRoZXJlZm9yZSwgd2hlbiB3ZSBhbGxvY2F0ZSBhIG5ldyBBU0lELCB3ZSBqdXN0IHRha2Ug
dGhlIG5leHQgbnVtYmVyLiBXaGVuCisgKiB3ZSBydW4gb3V0IG9mIG51bWJlcnMsIHdlIGZsdXNo
IHRoZSBUTEIsIGluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiBjb3VudAorICogYW5kIHN0YXJ0IG92
ZXIuIEFTSUQgemVybyBpcyByZXNlcnZlZCBmb3Iga2VybmVsIHVzZS4KKyAqLworc3RhdGljIHZv
aWQKK3BtYXBfYXNpZF9hbGxvYyhwbWFwKQorCXBtYXBfdCBwbWFwOworeworCWlmIChwbWFwLT5w
bV9hc2lkW1BDUFVfR0VUKGNwdWlkKV0uYXNpZCAhPSBQTUFQX0FTSURfUkVTRVJWRUQgJiYKKwkg
ICAgcG1hcC0+cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9PSBQQ1BVX0dFVChhc2lkX2dl
bmVyYXRpb24pKTsKKwllbHNlIHsKKwkJaWYgKFBDUFVfR0VUKG5leHRfYXNpZCkgPT0gcG1hcF9t
YXhfYXNpZCkgeworCQkJdGxiX2ludmFsaWRhdGVfYWxsX3VzZXIoTlVMTCk7CisJCQlQQ1BVX1NF
VChhc2lkX2dlbmVyYXRpb24sCisJCQkgICAgKFBDUFVfR0VUKGFzaWRfZ2VuZXJhdGlvbikgKyAx
KSAmIEFTSURHRU5fTUFTSyk7CisJCQlpZiAoUENQVV9HRVQoYXNpZF9nZW5lcmF0aW9uKSA9PSAw
KSB7CisJCQkJUENQVV9TRVQoYXNpZF9nZW5lcmF0aW9uLCAxKTsKKwkJCX0KKwkJCVBDUFVfU0VU
KG5leHRfYXNpZCwgMSk7CS8qIDAgbWVhbnMgaW52YWxpZCAqLworCQl9CisJCXBtYXAtPnBtX2Fz
aWRbUENQVV9HRVQoY3B1aWQpXS5hc2lkID0gUENQVV9HRVQobmV4dF9hc2lkKTsKKwkJcG1hcC0+
cG1fYXNpZFtQQ1BVX0dFVChjcHVpZCldLmdlbiA9IFBDUFVfR0VUKGFzaWRfZ2VuZXJhdGlvbik7
CisJCVBDUFVfU0VUKG5leHRfYXNpZCwgUENQVV9HRVQobmV4dF9hc2lkKSArIDEpOworCX0KK30K
KworaW50CitwYWdlX2lzX21hbmFnZWQodm1fb2Zmc2V0X3QgcGEpCit7CisJdm1fb2Zmc2V0X3Qg
cGdudW0gPSBtaXBzX2J0b3AocGEpOworCisJaWYgKHBnbnVtID49IGZpcnN0X3BhZ2UpIHsKKwkJ
dm1fcGFnZV90IG07CisKKwkJbSA9IFBIWVNfVE9fVk1fUEFHRShwYSk7CisJCWlmIChtID09IE5V
TEwpCisJCQlyZXR1cm4gMDsKKwkJaWYgKChtLT5mbGFncyAmIChQR19GSUNUSVRJT1VTIHwgUEdf
VU5NQU5BR0VEKSkgPT0gMCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3Rh
dGljIGludAoraW5pdF9wdGVfcHJvdCh2bV9vZmZzZXRfdCB2YSwgdm1fcGFnZV90IG0sIHZtX3By
b3RfdCBwcm90KQoreworCWludCBydzsKKworCWlmICghKHByb3QgJiBWTV9QUk9UX1dSSVRFKSkK
KwkJcncgPSAgUFRFX1YgfCBQVEVfUk8gfCBQVEVfQ19DQUNIRTsKKwllbHNlIGlmICgobS0+Zmxh
Z3MgJiAoUEdfRklDVElUSU9VUyB8IFBHX1VOTUFOQUdFRCkpID09IDApIHsKKwkJaWYgKChtLT5t
ZC5wdl9mbGFncyAmIFBWX1RBQkxFX01PRCkgIT0gMCkKKwkJCXJ3ID0gIFBURV9WIHwgUFRFX0Qg
fCBQVEVfQ19DQUNIRTsKKwkJZWxzZQorCQkJcncgPSBQVEVfViB8IFBURV9DX0NBQ0hFOworCQl2
bV9wYWdlX2ZsYWdfc2V0KG0sIFBHX1dSSVRFQUJMRSk7CisJfSBlbHNlCisJCS8qIE5lZWRuJ3Qg
ZW11bGF0ZSBhIG1vZGlmaWVkIGJpdCBmb3IgdW5tYW5hZ2VkIHBhZ2VzLiAqLworCQlydyA9ICBQ
VEVfViB8IFBURV9EIHwgUFRFX0NfQ0FDSEU7CisJcmV0dXJuIChydyk7Cit9CisKKy8qCisgKglw
bWFwX3NldF9tb2RpZmllZDoKKyAqCisgKglTZXRzIHRoZSBwYWdlIG1vZGlmaWVkIGFuZCByZWZl
cmVuY2UgYml0cyBmb3IgdGhlIHNwZWNpZmllZCBwYWdlLgorICovCit2b2lkCitwbWFwX3NldF9t
b2RpZmllZCh2bV9vZmZzZXRfdCBwYSkKK3sKKworCVBIWVNfVE9fVk1fUEFHRShwYSktPm1kLnB2
X2ZsYWdzIHw9IChQVl9UQUJMRV9SRUYgfCBQVl9UQUJMRV9NT0QpOworfQorCisKKy8qCisgKglS
b3V0aW5lOglwbWFwX2tleHRyYWN0CisgKglGdW5jdGlvbjoKKyAqCQlFeHRyYWN0IHRoZSBwaHlz
aWNhbCBwYWdlIGFkZHJlc3MgYXNzb2NpYXRlZAorICoJCXZpcnR1YWwgYWRkcmVzcy4KKyAqLwor
IC8qIFBNQVBfSU5MSU5FICovIHZtX29mZnNldF90CitwbWFwX2tleHRyYWN0KHZtX29mZnNldF90
IHZhKQoreworCWludCBtYXBwZWQ7CisKKwkvKgorCSAqIEZpcnN0LCB0aGUgZGlyZWN0LW1hcHBl
ZCByZWdpb25zLgorCSAqLworCWlmICh2YSA+PSBNSVBTX1hLUEhZU19TVEFSVCAmJiB2YSA8IE1J
UFNfWEtQSFlTX0VORCkKKwkJcmV0dXJuIChNSVBTX1hLUEhZU19UT19QSFlTKHZhKSk7CisKKwlp
ZiAodmEgPj0gTUlQU19LU0VHMF9TVEFSVCAmJiB2YSA8IE1JUFNfS1NFRzBfRU5EKQorCQlyZXR1
cm4gKE1JUFNfS1NFRzBfVE9fUEhZUyh2YSkpOworCisJaWYgKHZhID49IE1JUFNfS1NFRzFfU1RB
UlQgJiYgdmEgPCBNSVBTX0tTRUcxX0VORCkKKwkJcmV0dXJuIChNSVBTX0tTRUcxX1RPX1BIWVMo
dmEpKTsKKworCS8qCisJICogVXNlciB2aXJ0dWFsIGFkZHJlc3Nlcy4KKwkgKi8KKwlpZiAodmEg
PCBWTV9NQVhVU0VSX0FERFJFU1MpIHsKKwkJcHRfZW50cnlfdCAqcHRlcDsKKworCQlpZiAoY3Vy
cHJvYyAmJiBjdXJwcm9jLT5wX3Ztc3BhY2UpIHsKKwkJCXB0ZXAgPSBwbWFwX3B0ZSgmY3VycHJv
Yy0+cF92bXNwYWNlLT52bV9wbWFwLCB2YSk7CisJCQlpZiAocHRlcCkgeworCQkJCXJldHVybiAo
VExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJICAgICh2YSAmIFBBR0VfTUFTSykpOworCQkJ
fQorCQkJcmV0dXJuICgwKTsKKwkJfQorCX0KKworCS8qCisJICogU2hvdWxkIGJlIGtlcm5lbCB2
aXJ0dWFsIGhlcmUsIG90aGVyd2lzZSBmYWlsCisJICovCisJbWFwcGVkID0gKHZhID49IE1JUFNf
S1NFRzJfU1RBUlQgfHwgdmEgPCBNSVBTX0tTRUcyX0VORCk7CisJbWFwcGVkID0gbWFwcGVkIHx8
ICh2YSA+PSBNSVBTX1hLU0VHX1NUQVJUIHx8IHZhIDwgTUlQU19YS1NFR19FTkQpOworCS8qCisJ
ICogS2VybmVsIHZpcnR1YWwuCisJICovCisKKwlpZiAobWFwcGVkKSB7CisJCXB0X2VudHJ5X3Qg
KnB0ZXA7CisKKwkJLyogSXMgdGhlIGtlcm5lbCBwbWFwIGluaXRpYWxpemVkPyAqLworCQlpZiAo
a2VybmVsX3BtYXAtPnBtX2FjdGl2ZSkgeworCQkJLyogSXQncyBpbnNpZGUgdGhlIHZpcnR1YWwg
YWRkcmVzcyByYW5nZSAqLworCQkJcHRlcCA9IHBtYXBfcHRlKGtlcm5lbF9wbWFwLCB2YSk7CisJ
CQlpZiAocHRlcCkgeworCQkJCXJldHVybiAoVExCTE9fUFRFX1RPX1BBKCpwdGVwKSB8CisJCQkJ
ICAgICh2YSAmIFBBR0VfTUFTSykpOworCQkJfQorCQl9CisJCXJldHVybiAoMCk7CisJfQorCisJ
cGFuaWMoIiVzIGZvciB1bmtub3duIGFkZHJlc3Mgc3BhY2UgJXAuIiwgX19mdW5jX18sICh2b2lk
ICopdmEpOworfQorCisKK3ZvaWQgCitwbWFwX2ZsdXNoX3B2Y2FjaGUodm1fcGFnZV90IG0pCit7
CisJcHZfZW50cnlfdCBwdjsKKworCWlmIChtICE9IE5VTEwpIHsKKwkJZm9yIChwdiA9IFRBSUxR
X0ZJUlNUKCZtLT5tZC5wdl9saXN0KTsgcHY7CisJICAgIAkgICAgcHYgPSBUQUlMUV9ORVhUKHB2
LCBwdl9saXN0KSkgeworCQkJbWlwc19kY2FjaGVfd2JpbnZfcmFuZ2VfaW5kZXgocHYtPnB2X3Zh
LCBQQUdFX1NJWkUpOworCQl9CisJfQorfQpJbmRleDogc3lzL21pcHMvbWlwcy9wbWFwLmMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gc3lzL21pcHMvbWlwcy9wbWFwLmMJKHJldmlzaW9uIDIxMDUzNCkKKysrIHN5
cy9taXBzL21pcHMvcG1hcC5jCSh3b3JraW5nIGNvcHkpCkBAIC0xMjgsMTIgKzEyOCw4IEBACiAj
ZGVmaW5lCXBtYXBfc2Vnc2hpZnQodikJKCgodikgPj4gU0VHU0hJRlQpICYgKE5QREVQRyAtIDEp
KQogI2RlZmluZQlzZWd0YWJfcGRlKG0sIHYpCSgobSlbcG1hcF9zZWdzaGlmdCgodikpXSkKIAot
I2lmIGRlZmluZWQoX19taXBzX242NCkKLSNkZWZpbmUJTlVTRVJQR1RCTFMJCShOUERFUEcpCi0j
ZWxzZQogI2RlZmluZQlOVVNFUlBHVEJMUwkJKHBtYXBfc2Vnc2hpZnQoVk1fTUFYVVNFUl9BRERS
RVNTKSkKLSNlbmRpZgotI2RlZmluZQltaXBzX3NlZ3RydW5jKHZhKQkoKHZhKSAmIH5TRUdPRlNF
VCkKKyNkZWZpbmUJbWlwc19zZWd0cnVuYyh2YSkJKCh2YSkgJiB+U0VHTUFTSykKICNkZWZpbmUJ
aXNfa2VybmVsX3BtYXAoeCkJKCh4KSA9PSBrZXJuZWxfcG1hcCkKIAogLyoKQEAgLTE5Niw3ICsx
OTIsNiBAQAogc3RhdGljIHZvaWQgcG1hcF91cGRhdGVfcGFnZV9hY3Rpb24odm9pZCAqYXJnKTsK
ICNlbmRpZgogCi0jaWYgIWRlZmluZWQoX19taXBzX242NCkKIHN0cnVjdCBsb2NhbF9zeXNtYXBz
IHsKIAl2bV9vZmZzZXRfdCBiYXNlOwogCXVpbnQxNl90IHZhbGlkMSwgdmFsaWQyOwpAQCAtMjU3
LDcgKzI1Miw2IEBACiAJdGxiX2ludmFsaWRhdGVfYWRkcmVzcyhrZXJuZWxfcG1hcCwgc3lzbS0+
YmFzZSArIFBBR0VfU0laRSk7CVwKIAlzeXNtLT52YWxpZDIgPSAwOwkJCQkJCVwKIAlpbnRyX3Jl
c3RvcmUoaW50cikKLSNlbmRpZgogCiBzdGF0aWMgaW5saW5lIHB0X2VudHJ5X3QgKgogcG1hcF9z
ZWdtYXAocG1hcF90IHBtYXAsIHZtX29mZnNldF90IHZhKQpAQCAtMzMyLDkgKzMyNiw3IEBACiAJ
cHRfZW50cnlfdCAqcGd0YWI7CiAJcHRfZW50cnlfdCAqcHRlOwogCWludCBpLCBqOwotI2lmICFk
ZWZpbmVkKF9fbWlwc19uNjQpCiAJaW50IG1lbW9yeV9sYXJnZXJfdGhhbl81MTJtZWcgPSAwOwot
I2VuZGlmCiAKIAkvKiBTb3J0LiAqLwogYWdhaW46CkBAIC0zNjIsMTAgKzM1NCw4IEBACiAJCX0K
IAl9CiAKLSNpZiAhZGVmaW5lZChfX21pcHNfbjY0KQogCWlmIChwaHlzX2F2YWlsW2kgLSAxXSA+
PSBNSVBTX0tTRUcwX0xBUkdFU1RfUEhZUykKIAkJbWVtb3J5X2xhcmdlcl90aGFuXzUxMm1lZyA9
IDE7Ci0jZW5kaWYKIAogCS8qCiAJICogQ29weSB0aGUgcGh5c19hdmFpbFtdIGFycmF5IGJlZm9y
ZSB3ZSBzdGFydCBzdGVhbGluZyBtZW1vcnkgZnJvbSBpdC4KQEAgLTQyNCw3ICs0MTQsNiBAQAog
CQlwcmludGYoInBjcHUgaXMgYXZhaWxhYmxlIGF0IHZpcnR1YWwgYWRkcmVzcyAlcC5cbiIsIHBj
cHVwKTsKICNlbmRpZgogCi0jaWYgIWRlZmluZWQoX19taXBzX242NCkKIAkvKgogCSAqIFN0ZWFs
IHNvbWUgdmlydHVhbCBzcGFjZSB0aGF0IHdpbGwgbm90IGJlIGluIGtlcm5lbF9zZWdtYXAuIFRo
aXMKIAkgKiB2YSBtZW1vcnkgc3BhY2Ugd2lsbCBiZSB1c2VkIHRvIG1hcCBpbiBrZXJuZWwgcGFn
ZXMgdGhhdCBhcmUKQEAgLTQzOSw3ICs0MjgsNiBAQAogCQkJc3lzbWFwX2xtZW1baV0udmFsaWQx
ID0gc3lzbWFwX2xtZW1baV0udmFsaWQyID0gMDsKIAkJfQogCX0KLSNlbmRpZgogCiAJLyoKIAkg
KiBBbGxvY2F0ZSBzZWdtZW50IHRhYmxlIGZvciB0aGUga2VybmVsCkBAIC00NTAsNyArNDM4LDYg
QEAKIAkgKiBBbGxvY2F0ZSBzZWNvbmQgbGV2ZWwgcGFnZSB0YWJsZXMgZm9yIHRoZSBrZXJuZWwK
IAkgKi8KIAlua3B0ID0gTktQVDsKLSNpZiAhZGVmaW5lZChfX21pcHNfbjY0KQogCWlmIChtZW1v
cnlfbGFyZ2VyX3RoYW5fNTEybWVnKSB7CiAJCS8qCiAJCSAqIElmIHdlIGhhdmUgYSBsYXJnZSBt
ZW1vcnkgc3lzdGVtIHdlIENBTk5PVCBhZmZvcmQgdG8gaGl0CkBAIC00NjcsNyArNDU0LDYgQEAK
IAkJICovCiAJCW5rcHQgPSAoUEFHRV9TSVpFIC8gc2l6ZW9mKHBkX2VudHJ5X3QpKSAtICh2aXJ0
dWFsX2F2YWlsID4+IFNFR1NISUZUKTsKIAl9Ci0jZW5kaWYKIAlwZ3RhYiA9IChwdF9lbnRyeV90
ICopcG1hcF9zdGVhbF9tZW1vcnkoUEFHRV9TSVpFICogbmtwdCk7CiAKIAkvKgpAQCAtNzc2LDE2
ICs3NjIsOSBAQAogICoKICAqCVVzZSBYS1BIWVMgZm9yIDY0IGJpdCwgYW5kIEtTRUcwIHdoZXJl
IHBvc3NpYmxlIGZvciAzMiBiaXQuCiAgKi8KLSNpZiBkZWZpbmVkKF9fbWlwc19uNjQpCiB2bV9v
ZmZzZXRfdAogcG1hcF9tYXAodm1fb2Zmc2V0X3QgKnZpcnQsIHZtX29mZnNldF90IHN0YXJ0LCB2
bV9vZmZzZXRfdCBlbmQsIGludCBwcm90KQogewotCXJldHVybiAoTUlQU19QSFlTX1RPX1hLUEhZ
U19DQUNIRUQoc3RhcnQpKTsKLX0KLSNlbHNlCi12bV9vZmZzZXRfdAotcG1hcF9tYXAodm1fb2Zm
c2V0X3QgKnZpcnQsIHZtX29mZnNldF90IHN0YXJ0LCB2bV9vZmZzZXRfdCBlbmQsIGludCBwcm90
KQotewogCXZtX29mZnNldF90IHZhLCBzdmE7CiAKIAlpZiAoZW5kIDw9IE1JUFNfS1NFRzBfTEFS
R0VTVF9QSFlTKQpAQCAtODAwLDcgKzc3OSw2IEBACiAJKnZpcnQgPSB2YTsKIAlyZXR1cm4gKHN2
YSk7CiB9Ci0jZW5kaWYKIAogLyoKICAqIEFkZCBhIGxpc3Qgb2Ygd2lyZWQgcGFnZXMgdG8gdGhl
IGt2YQpAQCAtMjAwMCwyMCArMTk3OCw5IEBACiAgKgogICogVXNlIFhLUEhZUyBmb3IgNjQgYml0
LCBhbmQgS1NFRzAgd2hlcmUgcG9zc2libGUgZm9yIDMyIGJpdC4KICAqLwotI2lmIGRlZmluZWQo
X19taXBzX242NCkKIHZvaWQgKgogcG1hcF9rZW50ZXJfdGVtcG9yYXJ5KHZtX3BhZGRyX3QgcGEs
IGludCBpKQogewotCXJldHVybiAoKHZvaWQgKilNSVBTX1BIWVNfVE9fWEtQSFlTX0NBQ0hFRChw
YSkpOwotfQotdm9pZAotcG1hcF9rZW50ZXJfdGVtcG9yYXJ5X2ZyZWUodm1fcGFkZHJfdCBwYSkK
LXsKLX0KLSNlbHNlCi12b2lkICoKLXBtYXBfa2VudGVyX3RlbXBvcmFyeSh2bV9wYWRkcl90IHBh
LCBpbnQgaSkKLXsKIAl2bV9vZmZzZXRfdCB2YTsKIAlyZWdpc3Rlcl90IGludHI7CiAJaWYgKGkg
IT0gMCkKQEAgLTIwNzEsNyArMjAzOCw2IEBACiAJCXN5c20tPnZhbGlkMSA9IDA7CiAJfQogfQot
I2VuZGlmCiAKIC8qCiAgKiBNb3ZlZCB0aGUgY29kZSB0byBNYWNoaW5lIEluZGVwZW5kZW50CkBA
IC0yMTc3LDI2ICsyMTQzLDEyIEBACiAvKgogICoJcG1hcF96ZXJvX3BhZ2UgemVyb3MgdGhlIHNw
ZWNpZmllZCBoYXJkd2FyZSBwYWdlIGJ5IG1hcHBpbmcKICAqCXRoZSBwYWdlIGludG8gS1ZNIGFu
ZCB1c2luZyBiemVybyB0byBjbGVhciBpdHMgY29udGVudHMuCi0gKgotICogCVVzZSBYS1BIWVMg
Zm9yIDY0IGJpdCwgYW5kIEtTRUcwIHdoZXJlIHBvc3NpYmxlIGZvciAzMiBiaXQuCiAgKi8KLSNp
ZiBkZWZpbmVkIChfX21pcHNfbjY0KQogdm9pZAogcG1hcF96ZXJvX3BhZ2Uodm1fcGFnZV90IG0p
CiB7CiAJdm1fb2Zmc2V0X3QgdmE7CiAJdm1fcGFkZHJfdCBwaHlzID0gVk1fUEFHRV9UT19QSFlT
KG0pOwotCi0JdmEgPSBNSVBTX1BIWVNfVE9fWEtQSFlTX0NBQ0hFRChwaHlzKTsKLQliemVybygo
Y2FkZHJfdCl2YSwgUEFHRV9TSVpFKTsKLQltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YSwgUEFH
RV9TSVpFKTsKLX0KLSNlbHNlCi12b2lkCi1wbWFwX3plcm9fcGFnZSh2bV9wYWdlX3QgbSkKLXsK
LQl2bV9vZmZzZXRfdCB2YTsKLQl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7
CiAJcmVnaXN0ZXJfdCBpbnRyOwogCiAJaWYgKHBoeXMgPCBNSVBTX0tTRUcwX0xBUkdFU1RfUEhZ
UykgewpAQCAtMjIxMywzMCArMjE2NSwxOCBAQAogCQlQTUFQX0xNRU1fVU5NQVAoKTsKIAl9CiB9
Ci0jZW5kaWYKKwogLyoKICAqCXBtYXBfemVyb19wYWdlX2FyZWEgemVyb3MgdGhlIHNwZWNpZmll
ZCBoYXJkd2FyZSBwYWdlIGJ5IG1hcHBpbmcKICAqCXRoZSBwYWdlIGludG8gS1ZNIGFuZCB1c2lu
ZyBiemVybyB0byBjbGVhciBpdHMgY29udGVudHMuCiAgKgogICoJb2ZmIGFuZCBzaXplIG1heSBu
b3QgY292ZXIgYW4gYXJlYSBiZXlvbmQgYSBzaW5nbGUgaGFyZHdhcmUgcGFnZS4KICAqLwotI2lm
IGRlZmluZWQgKF9fbWlwc19uNjQpCiB2b2lkCiBwbWFwX3plcm9fcGFnZV9hcmVhKHZtX3BhZ2Vf
dCBtLCBpbnQgb2ZmLCBpbnQgc2l6ZSkKIHsKIAl2bV9vZmZzZXRfdCB2YTsKIAl2bV9wYWRkcl90
IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7Ci0KLQl2YSA9IE1JUFNfUEhZU19UT19YS1BIWVNf
Q0FDSEVEKHBoeXMpOwotCWJ6ZXJvKChjaGFyICopKGNhZGRyX3QpdmEgKyBvZmYsIHNpemUpOwot
CW1pcHNfZGNhY2hlX3diaW52X3JhbmdlKHZhICsgb2ZmLCBzaXplKTsKLX0KLSNlbHNlCi12b2lk
Ci1wbWFwX3plcm9fcGFnZV9hcmVhKHZtX3BhZ2VfdCBtLCBpbnQgb2ZmLCBpbnQgc2l6ZSkKLXsK
LQl2bV9vZmZzZXRfdCB2YTsKLQl2bV9wYWRkcl90IHBoeXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7
CiAJcmVnaXN0ZXJfdCBpbnRyOwogCiAJaWYgKHBoeXMgPCBNSVBTX0tTRUcwX0xBUkdFU1RfUEhZ
UykgewpAQCAtMjI1MiwyNSArMjE5MiwxMiBAQAogCQlQTUFQX0xNRU1fVU5NQVAoKTsKIAl9CiB9
Ci0jZW5kaWYKIAotI2lmIGRlZmluZWQgKF9fbWlwc19uNjQpCiB2b2lkCiBwbWFwX3plcm9fcGFn
ZV9pZGxlKHZtX3BhZ2VfdCBtKQogewogCXZtX29mZnNldF90IHZhOwogCXZtX3BhZGRyX3QgcGh5
cyA9IFZNX1BBR0VfVE9fUEhZUyhtKTsKLQotCXZhID0gTUlQU19QSFlTX1RPX1hLUEhZU19DQUNI
RUQocGh5cyk7Ci0JYnplcm8oKGNhZGRyX3QpdmEsIFBBR0VfU0laRSk7Ci0JbWlwc19kY2FjaGVf
d2JpbnZfcmFuZ2UodmEsIFBBR0VfU0laRSk7Ci19Ci0jZWxzZQotdm9pZAotcG1hcF96ZXJvX3Bh
Z2VfaWRsZSh2bV9wYWdlX3QgbSkKLXsKLQl2bV9vZmZzZXRfdCB2YTsKLQl2bV9wYWRkcl90IHBo
eXMgPSBWTV9QQUdFX1RPX1BIWVMobSk7CiAJcmVnaXN0ZXJfdCBpbnRyOwogCiAJaWYgKHBoeXMg
PCBNSVBTX0tTRUcwX0xBUkdFU1RfUEhZUykgewpAQCAtMjI4NiwzOCArMjIxMywxOSBAQAogCQlQ
TUFQX0xNRU1fVU5NQVAoKTsKIAl9CiB9Ci0jZW5kaWYKIAogLyoKICAqCXBtYXBfY29weV9wYWdl
IGNvcGllcyB0aGUgc3BlY2lmaWVkIChtYWNoaW5lIGluZGVwZW5kZW50KQogICoJcGFnZSBieSBt
YXBwaW5nIHRoZSBwYWdlIGludG8gdmlydHVhbCBtZW1vcnkgYW5kIHVzaW5nCiAgKgliY29weSB0
byBjb3B5IHRoZSBwYWdlLCBvbmUgbWFjaGluZSBkZXBlbmRlbnQgcGFnZSBhdCBhCiAgKgl0aW1l
LgotICoKLSAqIAlVc2UgWEtQSFlTIGZvciA2NCBiaXQsIGFuZCBLU0VHMCB3aGVyZSBwb3NzaWJs
ZSBmb3IgMzIgYml0LgogICovCi0jaWYgZGVmaW5lZCAoX19taXBzX242NCkKIHZvaWQKIHBtYXBf
Y29weV9wYWdlKHZtX3BhZ2VfdCBzcmMsIHZtX3BhZ2VfdCBkc3QpCiB7CiAJdm1fb2Zmc2V0X3Qg
dmFfc3JjLCB2YV9kc3Q7CiAJdm1fcGFkZHJfdCBwaHlfc3JjID0gVk1fUEFHRV9UT19QSFlTKHNy
Yyk7CiAJdm1fcGFkZHJfdCBwaHlfZHN0ID0gVk1fUEFHRV9UT19QSFlTKGRzdCk7Ci0KLQlwbWFw
X2ZsdXNoX3B2Y2FjaGUoc3JjKTsKLQltaXBzX2RjYWNoZV93Ymludl9yYW5nZV9pbmRleChNSVBT
X1BIWVNfVE9fWEtQSFlTX0NBQ0hFRChwaHlfZHN0KSwgUEFHRV9TSVpFKTsKLQl2YV9zcmMgPSBN
SVBTX1BIWVNfVE9fWEtQSFlTX0NBQ0hFRChwaHlfc3JjKTsKLQl2YV9kc3QgPSBNSVBTX1BIWVNf
VE9fWEtQSFlTX0NBQ0hFRChwaHlfZHN0KTsKLQliY29weSgoY2FkZHJfdCl2YV9zcmMsIChjYWRk
cl90KXZhX2RzdCwgUEFHRV9TSVpFKTsKLQltaXBzX2RjYWNoZV93Ymludl9yYW5nZSh2YV9kc3Qs
IFBBR0VfU0laRSk7Ci19Ci0jZWxzZQotdm9pZAotcG1hcF9jb3B5X3BhZ2Uodm1fcGFnZV90IHNy
Yywgdm1fcGFnZV90IGRzdCkKLXsKLQl2bV9vZmZzZXRfdCB2YV9zcmMsIHZhX2RzdDsKLQl2bV9w
YWRkcl90IHBoeV9zcmMgPSBWTV9QQUdFX1RPX1BIWVMoc3JjKTsKLQl2bV9wYWRkcl90IHBoeV9k
c3QgPSBWTV9QQUdFX1RPX1BIWVMoZHN0KTsKIAlyZWdpc3Rlcl90IGludHI7CiAKIAlpZiAoKHBo
eV9zcmMgPCBNSVBTX0tTRUcwX0xBUkdFU1RfUEhZUykgJiYgKHBoeV9kc3QgPCBNSVBTX0tTRUcw
X0xBUkdFU1RfUEhZUykpIHsKQEAgLTIzNDIsNyArMjI1MCw2IEBACiAJCVBNQVBfTE1FTV9VTk1B
UCgpOwogCX0KIH0KLSNlbmRpZgogCiAvKgogICogUmV0dXJucyB0cnVlIGlmIHRoZSBwbWFwJ3Mg
cHYgaXMgb25lIG9mIHRoZSBmaXJzdApAQCAtMjc0OCwyNCArMjY1NSwxMCBAQAogICogYWRkcmVz
cyBzcGFjZS4gUmV0dXJuIGEgcG9pbnRlciB0byB3aGVyZSBpdCBpcyBtYXBwZWQuIFRoaXMKICAq
IHJvdXRpbmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgbWFwcGluZyBkZXZpY2UgbWVtb3J5
LAogICogTk9UIHJlYWwgbWVtb3J5LgotICoKLSAqIFVzZSBYS1BIWVMgdW5jYWNoZWQgZm9yIDY0
IGJpdCwgYW5kIEtTRUcxIHdoZXJlIHBvc3NpYmxlIGZvciAzMiBiaXQuCiAgKi8KLSNpZiBkZWZp
bmVkKF9fbWlwc19uNjQpCiB2b2lkICoKIHBtYXBfbWFwZGV2KHZtX29mZnNldF90IHBhLCB2bV9z
aXplX3Qgc2l6ZSkKIHsKLQlyZXR1cm4gKCh2b2lkICopTUlQU19QSFlTX1RPX1hLUEhZU19VTkNB
Q0hFRChwYSkpOwotfQotCi12b2lkCi1wbWFwX3VubWFwZGV2KHZtX29mZnNldF90IHZhLCB2bV9z
aXplX3Qgc2l6ZSkKLXsKLX0KLSNlbHNlCi12b2lkICoKLXBtYXBfbWFwZGV2KHZtX29mZnNldF90
IHBhLCB2bV9zaXplX3Qgc2l6ZSkKLXsKICAgICAgICAgdm1fb2Zmc2V0X3QgdmEsIHRtcHZhLCBv
ZmZzZXQ7CiAKIAkvKiAKQEAgLTI4MDksNyArMjcwMiw2IEBACiAJCXBtYXBfa3JlbW92ZSh0bXB2
YSk7CiAJa21lbV9mcmVlKGtlcm5lbF9tYXAsIGJhc2UsIHNpemUpOwogfQotI2VuZGlmCiAKIC8q
CiAgKiBwZXJmb3JtIHRoZSBwbWFwIHdvcmsgZm9yIG1pbmNvcmUKQEAgLTI5MDIsMTQgKzI3OTQs
MTQgQEAKIAkJcmV0dXJuOwogCWlmIChvYmplY3QgIT0gTlVMTCAmJiAob2JqZWN0LT5mbGFncyAm
IE9CSl9DT0xPUkVEKSAhPSAwKQogCQlvZmZzZXQgKz0gcHRvYShvYmplY3QtPnBnX2NvbG9yKTsK
LQlzdXBlcnBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgU0VHT0ZTRVQ7Ci0JaWYgKHNpemUgLSAoKE5C
U0VHIC0gc3VwZXJwYWdlX29mZnNldCkgJiBTRUdPRlNFVCkgPCBOQlNFRyB8fAotCSAgICAoKmFk
ZHIgJiBTRUdPRlNFVCkgPT0gc3VwZXJwYWdlX29mZnNldCkKKwlzdXBlcnBhZ2Vfb2Zmc2V0ID0g
b2Zmc2V0ICYgU0VHTUFTSzsKKwlpZiAoc2l6ZSAtICgoTkJTRUcgLSBzdXBlcnBhZ2Vfb2Zmc2V0
KSAmIFNFR01BU0spIDwgTkJTRUcgfHwKKwkgICAgKCphZGRyICYgU0VHTUFTSykgPT0gc3VwZXJw
YWdlX29mZnNldCkKIAkJcmV0dXJuOwotCWlmICgoKmFkZHIgJiBTRUdPRlNFVCkgPCBzdXBlcnBh
Z2Vfb2Zmc2V0KQotCQkqYWRkciA9ICgqYWRkciAmIH5TRUdPRlNFVCkgKyBzdXBlcnBhZ2Vfb2Zm
c2V0OworCWlmICgoKmFkZHIgJiBTRUdNQVNLKSA8IHN1cGVycGFnZV9vZmZzZXQpCisJCSphZGRy
ID0gKCphZGRyICYgflNFR01BU0spICsgc3VwZXJwYWdlX29mZnNldDsKIAllbHNlCi0JCSphZGRy
ID0gKCgqYWRkciArIFNFR09GU0VUKSAmIH5TRUdPRlNFVCkgKyBzdXBlcnBhZ2Vfb2Zmc2V0Owor
CQkqYWRkciA9ICgoKmFkZHIgKyBTRUdNQVNLKSAmIH5TRUdNQVNLKSArIHN1cGVycGFnZV9vZmZz
ZXQ7CiB9CiAKIC8qCkBAIC0zMTQxLDExICszMDMzLDYgQEAKIAkvKgogCSAqIEZpcnN0LCB0aGUg
ZGlyZWN0LW1hcHBlZCByZWdpb25zLgogCSAqLwotI2lmIGRlZmluZWQoX19taXBzX242NCkKLQlp
ZiAodmEgPj0gTUlQU19YS1BIWVNfU1RBUlQgJiYgdmEgPCBNSVBTX1hLUEhZU19FTkQpCi0JCXJl
dHVybiAoTUlQU19YS1BIWVNfVE9fUEhZUyh2YSkpOwotI2VuZGlmCi0KIAlpZiAodmEgPj0gTUlQ
U19LU0VHMF9TVEFSVCAmJiB2YSA8IE1JUFNfS1NFRzBfRU5EKQogCQlyZXR1cm4gKE1JUFNfS1NF
RzBfVE9fUEhZUyh2YSkpOwogCkBAIC0zMTcyLDkgKzMwNTksNiBAQAogCSAqIFNob3VsZCBiZSBr
ZXJuZWwgdmlydHVhbCBoZXJlLCBvdGhlcndpc2UgZmFpbAogCSAqLwogCW1hcHBlZCA9ICh2YSA+
PSBNSVBTX0tTRUcyX1NUQVJUIHx8IHZhIDwgTUlQU19LU0VHMl9FTkQpOwotI2lmIGRlZmluZWQo
X19taXBzX242NCkKLQltYXBwZWQgPSBtYXBwZWQgfHwgKHZhID49IE1JUFNfWEtTRUdfU1RBUlQg
fHwgdmEgPCBNSVBTX1hLU0VHX0VORCk7Ci0jZW5kaWYgCiAJLyoKIAkgKiBLZXJuZWwgdmlydHVh
bC4KIAkgKi8K
--0016e64757dcd58fd3048c646c04
Content-Type: application/octet-stream; name="mips-n64-config.patch"
Content-Disposition: attachment; filename="mips-n64-config.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gc572wx23

SW5kZXg6IHN5cy9jb25mL29wdGlvbnMubWlwcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzeXMvY29uZi9vcHRp
b25zLm1pcHMJKHJldmlzaW9uIDIxMDUzNCkKKysrIHN5cy9jb25mL29wdGlvbnMubWlwcwkod29y
a2luZyBjb3B5KQpAQCAtNTMsNiArNTMsOSBAQAogVEFSR0VUX0VNVUxBVE9SCW9wdF9kZGIuaAog
VEFSR0VUX1hMUl9YTFMgIG9wdF9nbG9iYWwuaAogCitLRVJORUxfNjQJb3B0X2dsb2JhbC5oCitL
RVJORUxfMzIJb3B0X2dsb2JhbC5oCisKIFRJQ0tfVVNFX1lBTU9OX0ZSRVEJb3B0X2dsb2JhbC5o
CiBUSUNLX1VTRV9NQUxUQV9SVEMJb3B0X2dsb2JhbC5oCiAKSW5kZXg6IHN5cy9jb25mL2ZpbGVz
Lm1pcHMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gc3lzL2NvbmYvZmlsZXMubWlwcwkocmV2aXNpb24gMjEwNTM0
KQorKysgc3lzL2NvbmYvZmlsZXMubWlwcwkod29ya2luZyBjb3B5KQpAQCAtMzIsNyArMzIsOCBA
QAogbWlwcy9taXBzL2V4Y2VwdGlvbi5TCQlzdGFuZGFyZAogbWlwcy9taXBzL2dkYl9tYWNoZGVw
LmMJCXN0YW5kYXJkCiAjIG1pcHMvbWlwcy9tYWluYnVzLmMJCXN0YW5kYXJkCi1taXBzL21pcHMv
cG1hcC5jCQlzdGFuZGFyZAorbWlwcy9taXBzL3BtYXAuYwkJb3B0aW9uYWwga2VybmVsXzMyCitt
aXBzL21pcHMvcG1hcDY0LmMJCW9wdGlvbmFsIGtlcm5lbF82NAogbWlwcy9taXBzL3RyYXAuYwkJ
c3RhbmRhcmQKIG1pcHMvbWlwcy92bV9tYWNoZGVwLmMJCXN0YW5kYXJkCiAjIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0KSW5kZXg6IHN5cy9taXBzL2NvbmYvWExSNjQKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL21pcHMvY29u
Zi9YTFI2NAkocmV2aXNpb24gMjEwNTM0KQorKysgc3lzL21pcHMvY29uZi9YTFI2NAkod29ya2lu
ZyBjb3B5KQpAQCAtMjUsNiArMjUsOCBAQAogbWFrZW9wdGlvbnMgICAgIFRBUkdFVF9CSUdfRU5E
SUFOCiAKIGluY2x1ZGUJCSIuLi9ybWkvc3RkLnhsciIKK25vb3B0aW9uCUtFUk5FTF8zMgorb3B0
aW9ucwkJS0VSTkVMXzY0CiAKIG1ha2VvcHRpb25zCURFQlVHPS1nCQkjIEJ1aWxkIGtlcm5lbCB3
aXRoIGdkYigxKSBkZWJ1ZyBzeW1ib2xzCiBtYWtlb3B0aW9ucwlBUkNIX0ZMQUdTPSItbWFyY2g9
bWlwczY0IC1tYWJpPTY0IgpJbmRleDogc3lzL21pcHMvY29uZi9ERUZBVUxUUwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBzeXMvbWlwcy9jb25mL0RFRkFVTFRTCShyZXZpc2lvbiAyMTA1MzQpCisrKyBzeXMvbWlw
cy9jb25mL0RFRkFVTFRTCSh3b3JraW5nIGNvcHkpCkBAIC0xMSwzICsxMSw0IEBACiAKIG9wdGlv
bnMgCUdFT01fUEFSVF9CU0QKIG9wdGlvbnMgCUdFT01fUEFSVF9NQlIKK29wdGlvbnMJCUtFUk5F
TF8zMgo=
--0016e64757dcd58fd3048c646c04
Content-Type: application/octet-stream; name="rmi-n64-rge.patch"
Content-Disposition: attachment; filename="rmi-n64-rge.patch"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_gc572xjt4

SW5kZXg6IHN5cy9taXBzL3JtaS9kZXYveGxyL3JnZS5jCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHN5cy9taXBz
L3JtaS9kZXYveGxyL3JnZS5jCShyZXZpc2lvbiAyMTA1MzQpCisrKyBzeXMvbWlwcy9ybWkvZGV2
L3hsci9yZ2UuYwkod29ya2luZyBjb3B5KQpAQCAtNTY3LDggKzU2Nyw4IEBACiAJcGFkZHIgPSB2
dG9waHlzKCh2bV9vZmZzZXRfdCl0eF9kZXNjKTsKIAl0eF9kZXNjLT5mcmFnW25mcmFnXSA9ICgx
VUxMIDw8IDYzKSB8IChmcl9zdGlkIDw8IDU0KSB8IHBhZGRyOwogCW5mcmFnKys7Ci0JdHhfZGVz
Yy0+ZnJhZ1tYTFJfTUFYX1RYX0ZSQUdTXSA9ICh1aW50NjRfdCkgKHZtX29mZnNldF90KXR4X2Rl
c2M7Ci0JdHhfZGVzYy0+ZnJhZ1tYTFJfTUFYX1RYX0ZSQUdTICsgMV0gPSAodWludDY0X3QpICh2
bV9vZmZzZXRfdCltX2hlYWQ7CisJdHhfZGVzYy0+ZnJhZ1tYTFJfTUFYX1RYX0ZSQUdTXSA9ICh1
aW50NjRfdCkoaW50cHRyX3QpdHhfZGVzYzsKKwl0eF9kZXNjLT5mcmFnW1hMUl9NQVhfVFhfRlJB
R1MgKyAxXSA9ICh1aW50NjRfdCkoaW50cHRyX3QpbV9oZWFkOwogCiAJcDJkX2xlbiA9IChuZnJh
ZyAqIDgpOwogCXAycF9tc2ctPm1zZzAgPSAoMVVMTCA8PCA2MykgfCAoMVVMTCA8PCA2MikgfCAo
MTI3VUxMIDw8IDU0KSB8CkBAIC02MTQsMTkgKzYxNCwyNyBAQAogZnJlZV9idWYodm1fcGFkZHJf
dCBwYWRkcikKIHsKIAlzdHJ1Y3QgbWJ1ZiAqbTsKLQl1aW50MzJfdCBtYWcsIHVtLCBzcjsKKwl1
aW50MzJfdCBtYWc7CisjaWZkZWYgX19taXBzX242NAorCXVpbnQ2NF90ICp2YWRkcjsKIAorCXZh
ZGRyID0gKHVpbnQ2NF90ICopTUlQU19QSFlTX1RPX1hLUEhZU19DQUNIRUQocGFkZHIpOworCW0g
PSAoc3RydWN0IG1idWYgKil2YWRkclswXTsKKwltYWcgPSAodWludDMyX3QpdmFkZHJbMV07Cisj
ZWxzZQorCXVpbnQzMl90IHNyOworCiAJc3IgPSB4bHJfZW5hYmxlX2t4KCk7Ci0JdW0gPSB4bHJf
cGFkZHJfbHcocGFkZHIgLSBYTFJfQ0FDSEVMSU5FX1NJWkUpOwotCW1hZyA9IHhscl9wYWRkcl9s
dyhwYWRkciAtIFhMUl9DQUNIRUxJTkVfU0laRSArIHNpemVvZih1aW50MzJfdCkpOworCW0gPSAo
c3RydWN0IG1idWYgKikoaW50cHRyX3QpeGxyX3BhZGRyX2x3KHBhZGRyIC0gWExSX0NBQ0hFTElO
RV9TSVpFICsgc2l6ZW9mKHVpbnQzMl90KSk7CisJbWFnID0geGxyX3BhZGRyX2x3KHBhZGRyIC0g
WExSX0NBQ0hFTElORV9TSVpFICsgMyAqIHNpemVvZih1aW50MzJfdCkpOwogCW1pcHNfd3Jfc3Rh
dHVzKHNyKTsKKyNlbmRpZgogCiAJaWYgKG1hZyAhPSAweGYwMGJhZCkgewogCQlwcmludGYoIlNv
bWV0aGluZyBpcyB3cm9uZyBrc2VnOiVseCBmb3VuZCBtYWc6JXggbm90IDB4ZjAwYmFkXG4iLAog
CQkgICAgKHVfbG9uZylwYWRkciwgbWFnKTsKIAkJcmV0dXJuOwogCX0KLQltID0gKHN0cnVjdCBt
YnVmICopKGludHB0cl90KXVtOwogCWlmIChtICE9IE5VTEwpCiAJCW1fZnJlZW0obSk7CiB9CkBA
IC02MzUsNyArNjQzLDcgQEAKIGdldF9idWYodm9pZCkKIHsKIAlzdHJ1Y3QgbWJ1ZiAqbV9uZXcg
PSBOVUxMOwotCXVuc2lnbmVkIGludCAqbWQ7CisJdWludDY0X3QgKm1kOwogI2lmZGVmIElOVkFS
SUFOVFMKIAl2bV9wYWRkcl90IHRlbXAxLCB0ZW1wMjsKICNlbmRpZgpAQCAtNjQ1LDcgKzY1Myw3
IEBACiAJCXJldHVybiBOVUxMOwogCiAJbV9hZGoobV9uZXcsIFhMUl9DQUNIRUxJTkVfU0laRSAt
ICgodWludHB0cl90KW1fbmV3LT5tX2RhdGEgJiAweDFmKSk7Ci0JbWQgPSAodW5zaWduZWQgaW50
ICopbV9uZXctPm1fZGF0YTsKKwltZCA9ICh1aW50NjRfdCAqKW1fbmV3LT5tX2RhdGE7CiAJbWRb
MF0gPSAodWludHB0cl90KW1fbmV3OwkvKiBCYWNrIFB0ciAqLwogCW1kWzFdID0gMHhmMDBiYWQ7
CiAJbV9hZGoobV9uZXcsIFhMUl9DQUNIRUxJTkVfU0laRSk7CkBAIC0yMDMzLDE4ICsyMDQxLDMw
IEBACiByZ2Vfcngoc3RydWN0IHJnZV9zb2Z0YyAqc2MsIHZtX3BhZGRyX3QgcGFkZHIsIGludCBs
ZW4pCiB7CiAJc3RydWN0IG1idWYgKm07Ci0JdWludDMyX3QgdG0sIG1hZywgc3I7CisJdWludDMy
X3QgbWFnOwogCXN0cnVjdCBpZm5ldCAqaWZwID0gc2MtPnJnZV9pZnA7CisjaWZkZWYgX19taXBz
X242NAorCXVpbnQ2NF90ICp2YWRkcjsKIAorCXZhZGRyID0odWludDY0X3QgKilNSVBTX1BIWVNf
VE9fWEtQSFlTX0NBQ0hFRChwYWRkciAtIFhMUl9DQUNIRUxJTkVfU0laRSk7CisJbSA9IChzdHJ1
Y3QgbWJ1ZiAqKXZhZGRyWzBdOworCW1hZyA9ICh1aW50MzJfdCl2YWRkclsxXTsKKyNlbHNlCisJ
dWludDMyX3Qgc3I7CisJLyoKKwkgKiBPbiAzMiBiaXQgbWFjaGluZXMgd2UgdXNlIFhLUEhZUyB0
byBnZXQgdGhlIHZhbHVlcyBzdG9yZXMgd2l0aAorCSAqIHRoZSBtYnVmLCBuZWVkIHRvIGV4cGxp
Y2l0bHkgZW5hYmxlIEtYLiBEaXNhYmxlIGludGVycnVwdHMgd2hpbGUKKwkgKiBLWCBpcyBlbmFi
bGVkIHRvIHByZXZlbnQgdGhpcyBzZXR0aW5nIGxlYWtpbmcgdG8gb3RoZXIgY29kZS4KKwkgKi8K
IAlzciA9IHhscl9lbmFibGVfa3goKTsKLQl0bSA9IHhscl9wYWRkcl9sdyhwYWRkciAtIFhMUl9D
QUNIRUxJTkVfU0laRSk7Ci0JbWFnID0geGxyX3BhZGRyX2x3KHBhZGRyIC0gWExSX0NBQ0hFTElO
RV9TSVpFICsgc2l6ZW9mKHVpbnQzMl90KSk7CisJbSA9IChzdHJ1Y3QgbWJ1ZiAqKShpbnRwdHJf
dCl4bHJfcGFkZHJfbHcocGFkZHIgLSBYTFJfQ0FDSEVMSU5FX1NJWkUgKyBzaXplb2YodWludDMy
X3QpKTsKKwltYWcgPSB4bHJfcGFkZHJfbHcocGFkZHIgLSBYTFJfQ0FDSEVMSU5FX1NJWkUgKyAz
ICogc2l6ZW9mKHVpbnQzMl90KSk7CiAJbWlwc193cl9zdGF0dXMoc3IpOwotCi0JbSA9IChzdHJ1
Y3QgbWJ1ZiAqKShpbnRwdHJfdCl0bTsKKyNlbmRpZgogCWlmIChtYWcgIT0gMHhmMDBiYWQpIHsK
IAkJLyogc29tZWJvZHkgZWxzZSBwYWNrZXQgRXJyb3IgLSBGSVhNRSBpbiBpbnRpYWxpemF0aW9u
ICovCi0JCXByaW50ZigiY3B1ICVkOiAqRVJST1IqIE5vdCBteSBwYWNrZXQgcGFkZHIgJXBcbiIs
IHhscl9jcHVfaWQoKSwgKHZvaWQgKilwYWRkcik7CisJCXByaW50ZigiY3B1ICVkOiAqRVJST1Iq
IE5vdCBteSBwYWNrZXQgcGFkZHIgJXBcbiIsCisJCSAgICB4bHJfY3B1X2lkKCksICh2b2lkICop
cGFkZHIpOwogCQlyZXR1cm47CiAJfQogCS8qIGFsaWduIHRoZSBkYXRhICovCg==
--0016e64757dcd58fd3048c646c04--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTikAjRTMn0m1DemdmUXKMydmyQPxij%2BN=1d9L2=y>