This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

c/4454: Suboptimal schedule following unroll of "reversed" loops in gcc



>Number:         4454
>Category:       c
>Synopsis:       Suboptimal schedule following unroll of "reversed" loops in gcc
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          pessimizes-code
>Submitter-Id:   net
>Arrival-Date:   Wed Oct 03 06:56:01 PDT 2001
>Closed-Date:
>Last-Modified:
>Originator:     George Almasi
>Release:        gcc version 2.95.2 19991024 (release); gcc version 2.95.3 20010315 (release); possibly 3.0.1 also.
>Organization:
>Environment:
MIPS running IRIX 6.5, -n32 ABI. Possibly many
other architectures affected.
PPC/AIX, Intel/Linux, Sparc/Solaris not affected, but
proprietary architecture derived from MIPS affected.
>Description:
On certain architectures (notably MIPS) the following
loops are scheduled suboptimally:

1) the number of iterations in the loop is unknown (or odd)
at compile time.

2) the compiler attempts to "reverse" the loop counter to
match a "decrement-and-branch" instruction. This happens on
the MIPS platform.

3) the compiler attempts to unroll the loop (the options -O2
and -funroll-loops have to be set)

Under these circumstances the unrolled loop reuses the same
register several times *even when many other registers would
be available*, resulting in false register dependencies and
suboptimal scheduling.
>How-To-Repeat:
Compile the following snippet of code on the MIPS platform
with gcc 2.95.2 using the -O2 -funroll-loops option:

double worker(double *array, int size, int stride)
{
  double s = 0.0;
  int i;
  for(i = 0; i < size; i++)  s += array[i];
  return s;
}

The unrolled portion of the corresponding assembly file looks
as follows:

        l.d     $f1,0($4)
        add.d   $f0,$f0,$f1
        l.d     $f1,8($4)
        add.d   $f0,$f0,$f1
        l.d     $f1,16($4)
        add.d   $f0,$f0,$f1
        l.d     $f1,24($4)

>Fix:
The cause of the bug is that loop reversal destroys the 
so-called LUIDs in the code (linearized UIDs).

On of the steps in unrolling is to figure out what registers
are only live inside the loop body. These can be renamed
when unrolling. However, this feature only works if the 
LUIDs are correct. With broken LUIDs all registers are assumed
to have dependences outside the loop body; thus, the 
registers are not renamed and hence the operations cannot
be scheduled independently.

The file attachment I am including fixes this problem by
not using the LUIDs when figuring out the live registers.
It parses the non-linearized UID linked list instead.


>Release-Note:
>Audit-Trail:
>Unformatted:
----gnatsweb-attachment----
Content-Type: application/octet-stream; name="unroll.c.ga"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="unroll.c.ga"

LyogVHJ5IHRvIHVucm9sbCBsb29wcywgYW5kIHNwbGl0IGluZHVjdGlvbiB2YXJpYWJsZXMuCiAg
IENvcHlyaWdodCAoQykgMTk5MiwgOTMsIDk0LCA5NSwgOTcsIDk4LCAxOTk5IEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLgogICBDb250cmlidXRlZCBieSBKYW1lcyBFLiBXaWxzb24sIEN5
Z251cyBTdXBwb3J0L1VDIEJlcmtlbGV5LgoKVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIENDLgoK
R05VIENDIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt
b2RpZnkKaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkKdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl
cnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQphbnkgbGF0ZXIgdmVyc2lvbi4KCkdOVSBDQyBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hv
dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQphbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRl
IHRvCnRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRl
IDMzMCwKQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLwoKLyogVHJ5IHRvIHVucm9sbCBh
IGxvb3AsIGFuZCBzcGxpdCBpbmR1Y3Rpb24gdmFyaWFibGVzLgoKICAgTG9vcHMgZm9yIHdoaWNo
IHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBjYW4gYmUgY2FsY3VsYXRlZCBleGFjdGx5IGFyZQog
ICBoYW5kbGVkIHNwZWNpYWxseS4gIElmIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0aW1lcyB0
aGUgaW5zbl9jb3VudCBpcwogICBsZXNzIHRoYW4gTUFYX1VOUk9MTEVEX0lOU05TLCB0aGVuIHRo
ZSBsb29wIGlzIHVucm9sbGVkIGNvbXBsZXRlbHkuCiAgIE90aGVyd2lzZSwgd2UgdHJ5IHRvIHVu
cm9sbCB0aGUgbG9vcCBhIG51bWJlciBvZiB0aW1lcyBtb2R1bG8gdGhlIG51bWJlcgogICBvZiBp
dGVyYXRpb25zLCBzbyB0aGF0IG9ubHkgb25lIGV4aXQgdGVzdCB3aWxsIGJlIG5lZWRlZC4gIEl0
IGlzIHVucm9sbGVkCiAgIGEgbnVtYmVyIG9mIHRpbWVzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8g
TUFYX1VOUk9MTEVEX0lOU05TIGRpdmlkZWQgYnkKICAgdGhlIGluc24gY291bnQuCgogICBPdGhl
cndpc2UsIGlmIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBjYW4gYmUgY2FsY3VsYXRlZCBleGFj
dGx5IGF0CiAgIHJ1biB0aW1lLCBhbmQgdGhlIGxvb3AgaXMgYWx3YXlzIGVudGVyZWQgYXQgdGhl
IHRvcCwgdGhlbiB3ZSB0cnkgdG8KICAgcHJlY29uZGl0aW9uIHRoZSBsb29wLiAgVGhhdCBpcywg
YXQgcnVuIHRpbWUsIGNhbGN1bGF0ZSBob3cgbWFueSB0aW1lcwogICB0aGUgbG9vcCB3aWxsIGV4
ZWN1dGUsIGFuZCB0aGVuIGV4ZWN1dGUgdGhlIGxvb3AgYm9keSBhIGZldyB0aW1lcyBzbwogICB0
aGF0IHRoZSByZW1haW5pbmcgaXRlcmF0aW9ucyB3aWxsIGJlIHNvbWUgbXVsdGlwbGUgb2YgNCAo
b3IgMiBpZiB0aGUKICAgbG9vcCBpcyBsYXJnZSkuICBUaGVuIGZhbGwgdGhyb3VnaCB0byBhIGxv
b3AgdW5yb2xsZWQgNCAob3IgMikgdGltZXMsCiAgIHdpdGggb25seSBvbmUgZXhpdCB0ZXN0IG5l
ZWRlZCBhdCB0aGUgZW5kIG9mIHRoZSBsb29wLgoKICAgT3RoZXJ3aXNlLCBpZiB0aGUgbnVtYmVy
IG9mIGl0ZXJhdGlvbnMgY2FuIG5vdCBiZSBjYWxjdWxhdGVkIGV4YWN0bHksCiAgIG5vdCBldmVu
IGF0IHJ1biB0aW1lLCB0aGVuIHdlIHN0aWxsIHVucm9sbCB0aGUgbG9vcCBhIG51bWJlciBvZiB0
aW1lcwogICBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvIE1BWF9VTlJPTExFRF9JTlNOUyBkaXZpZGVk
IGJ5IHRoZSBpbnNuIGNvdW50LAogICBidXQgdGhlcmUgbXVzdCBiZSBhbiBleGl0IHRlc3QgYWZ0
ZXIgZWFjaCBjb3B5IG9mIHRoZSBsb29wIGJvZHkuCgogICBGb3IgZWFjaCBpbmR1Y3Rpb24gdmFy
aWFibGUsIHdoaWNoIGlzIGRlYWQgb3V0c2lkZSB0aGUgbG9vcCAocmVwbGFjZWFibGUpCiAgIG9y
IGZvciB3aGljaCB3ZSBjYW4gZWFzaWx5IGNhbGN1bGF0ZSB0aGUgZmluYWwgdmFsdWUsIGlmIHdl
IGNhbiBlYXNpbHkKICAgY2FsY3VsYXRlIGl0cyB2YWx1ZSBhdCBlYWNoIHBsYWNlIHdoZXJlIGl0
IGlzIHNldCBhcyBhIGZ1bmN0aW9uIG9mIHRoZQogICBjdXJyZW50IGxvb3AgdW5yb2xsIGNvdW50
IGFuZCB0aGUgdmFyaWFibGUncyB2YWx1ZSBhdCBsb29wIGVudHJ5LCB0aGVuCiAgIHRoZSBpbmR1
Y3Rpb24gdmFyaWFibGUgaXMgc3BsaXQgaW50byBgTicgZGlmZmVyZW50IHZhcmlhYmxlcywgb25l
IGZvcgogICBlYWNoIGNvcHkgb2YgdGhlIGxvb3AgYm9keS4gIE9uZSB2YXJpYWJsZSBpcyBsaXZl
IGFjcm9zcyB0aGUgYmFja3dhcmQKICAgYnJhbmNoLCBhbmQgdGhlIG90aGVycyBhcmUgYWxsIGNh
bGN1bGF0ZWQgYXMgYSBmdW5jdGlvbiBvZiB0aGlzIHZhcmlhYmxlLgogICBUaGlzIGhlbHBzIGVs
aW1pbmF0ZSBkYXRhIGRlcGVuZGVuY2llcywgYW5kIGxlYWRzIHRvIGZ1cnRoZXIgb3Bwb3J0dW5p
dGllcwogICBmb3IgY3NlLiAgKi8KCi8qIFBvc3NpYmxlIGltcHJvdmVtZW50cyBmb2xsb3c6ICAq
LwoKLyogPz8/IEFkZCBhbiBleHRyYSBwYXNzIHNvbWV3aGVyZSB0byBkZXRlcm1pbmUgd2hldGhl
ciB1bnJvbGxpbmcgd2lsbAogICBnaXZlIGFueSBiZW5lZml0LiAgRS5nLiBhZnRlciBnZW5lcmF0
aW5nIGFsbCB1bnJvbGxlZCBpbnNucywgY29tcHV0ZSB0aGUKICAgY29zdCBvZiBhbGwgaW5zbnMg
YW5kIGNvbXBhcmUgYWdhaW5zdCBjb3N0IG9mIGluc25zIGluIHJvbGxlZCBsb29wLgoKICAgLSBP
biB0cmFkaXRpb25hbCBhcmNoaXRlY3R1cmVzLCB1bnJvbGxpbmcgYSBub24tY29uc3RhbnQgYm91
bmQgbG9vcAogICAgIGlzIGEgd2luIGlmIHRoZXJlIGlzIGEgZ2l2IHdob3NlIG9ubHkgdXNlIGlz
IGluIG1lbW9yeSBhZGRyZXNzZXMsIHRoZQogICAgIG1lbW9yeSBhZGRyZXNzZXMgY2FuIGJlIHNw
bGl0LCBhbmQgaGVuY2UgZ2l2IGluY3JlbWVudHMgY2FuIGJlCiAgICAgZWxpbWluYXRlZC4KICAg
LSBJdCBpcyBhbHNvIGEgd2luIGlmIHRoZSBsb29wIGlzIGV4ZWN1dGVkIG1hbnkgdGltZXMsIGFu
ZCBwcmVjb25kaXRpb25pbmcKICAgICBjYW4gYmUgcGVyZm9ybWVkIGZvciB0aGUgbG9vcC4KICAg
QWRkIGNvZGUgdG8gY2hlY2sgZm9yIHRoZXNlIGFuZCBzaW1pbGFyIGNhc2VzLiAgKi8KCi8qID8/
PyBJbXByb3ZlIGNvbnRyb2wgb2Ygd2hpY2ggbG9vcHMgZ2V0IHVucm9sbGVkLiAgQ291bGQgdXNl
IHByb2ZpbGluZwogICBpbmZvIHRvIG9ubHkgdW5yb2xsIHRoZSBtb3N0IGNvbW1vbmx5IGV4ZWN1
dGVkIGxvb3BzLiAgUGVyaGFwcyBoYXZlCiAgIGEgdXNlciBzcGVjaWZ5YWJsZSBvcHRpb24gdG8g
Y29udHJvbCB0aGUgYW1vdW50IG9mIGNvZGUgZXhwYW5zaW9uLAogICBvciB0aGUgcGVyY2VudCBv
ZiBsb29wcyB0byBjb25zaWRlciBmb3IgdW5yb2xsaW5nLiAgRXRjLiAgKi8KCi8qID8/PyBMb29r
IGF0IHRoZSByZWdpc3RlciBjb3BpZXMgaW5zaWRlIHRoZSBsb29wIHRvIHNlZSBpZiB0aGV5IGZv
cm0gYQogICBzaW1wbGUgcGVybXV0YXRpb24uICBJZiBzbywgaXRlcmF0ZSB0aGUgcGVybXV0YXRp
b24gdW50aWwgaXQgZ2V0cyBiYWNrIHRvCiAgIHRoZSBzdGFydCBzdGF0ZS4gIFRoaXMgaXMgaG93
IG1hbnkgdGltZXMgd2Ugc2hvdWxkIHVucm9sbCB0aGUgbG9vcCwgZm9yCiAgIGJlc3QgcmVzdWx0
cywgYmVjYXVzZSB0aGVuIGFsbCByZWdpc3RlciBjb3BpZXMgY2FuIGJlIGVsaW1pbmF0ZWQuCiAg
IEZvciBleGFtcGxlLCB0aGUgbGlzcCBucmV2ZXJzZSBmdW5jdGlvbiBzaG91bGQgYmUgdW5yb2xs
ZWQgMyB0aW1lcwogICB3aGlsZSAodGhpcykKICAgICB7CiAgICAgICBuZXh0ID0gdGhpcy0+Y2Ry
OwogICAgICAgdGhpcy0+Y2RyID0gcHJldjsKICAgICAgIHByZXYgPSB0aGlzOwogICAgICAgdGhp
cyA9IG5leHQ7CiAgICAgfQoKICAgPz8/IFRoZSBudW1iZXIgb2YgdGltZXMgdG8gdW5yb2xsIHRo
ZSBsb29wIG1heSBhbHNvIGJlIGJhc2VkIG9uIGRhdGEKICAgcmVmZXJlbmNlcyBpbiB0aGUgbG9v
cC4gIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIGEgbG9vcCB0aGF0IHJlZmVyZW5jZXMKICAgeFtp
LTFdLCB4W2ldLCBhbmQgeFtpKzFdLCB3ZSBzaG91bGQgdW5yb2xsIGl0IGEgbXVsdGlwbGUgb2Yg
MyB0aW1lcy4gICovCgovKiA/Pz8gQWRkIHNvbWUgc2ltcGxlIGxpbmVhciBlcXVhdGlvbiBzb2x2
aW5nIGNhcGFiaWxpdHkgc28gdGhhdCB3ZSBjYW4KICAgZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Yg
bG9vcCBpdGVyYXRpb25zIGZvciBtb3JlIGNvbXBsZXggbG9vcHMuCiAgIEZvciBleGFtcGxlLCBj
b25zaWRlciB0aGlzIGxvb3AgZnJvbSBnZGIKICAgI2RlZmluZSBTV0FQX1RBUkdFVF9BTkRfSE9T
VChidWZmZXIsbGVuKQogICAgIHsKICAgICAgIGNoYXIgdG1wOwogICAgICAgY2hhciAqcCA9IChj
aGFyICopIGJ1ZmZlcjsKICAgICAgIGNoYXIgKnEgPSAoKGNoYXIgKikgYnVmZmVyKSArIGxlbiAt
IDE7CiAgICAgICBpbnQgaXRlcmF0aW9ucyA9IChsZW4gKyAxKSA+PiAxOwogICAgICAgaW50IGk7
CiAgICAgICBmb3IgKHA7IHAgPCBxOyBwKyssIHEtLTspCgkgewoJICAgdG1wID0gKnE7CgkgICAq
cSA9ICpwOwoJICAgKnAgPSB0bXA7CgkgfQogICAgIH0KICAgTm90ZSB0aGF0OgogICAgIHN0YXJ0
IHZhbHVlID0gcCA9ICZidWZmZXIgKyBjdXJyZW50X2l0ZXJhdGlvbgogICAgIGVuZCB2YWx1ZSAg
ID0gcSA9ICZidWZmZXIgKyBsZW4gLSAxIC0gY3VycmVudF9pdGVyYXRpb24KICAgR2l2ZW4gdGhl
IGxvb3AgZXhpdCB0ZXN0IG9mICJwIDwgcSIsIHRoZW4gdGhlcmUgbXVzdCBiZSAicSAtIHAiIGl0
ZXJhdGlvbnMsCiAgIHNldCBlcXVhbCB0byB6ZXJvIGFuZCBzb2x2ZSBmb3IgbnVtYmVyIG9mIGl0
ZXJhdGlvbnM6CiAgICAgcSAtIHAgPSBsZW4gLSAxIC0gMipjdXJyZW50X2l0ZXJhdGlvbiA9IDAK
ICAgICBjdXJyZW50X2l0ZXJhdGlvbiA9IChsZW4gLSAxKSAvIDIKICAgSGVuY2UsIHRoZXJlIGFy
ZSAobGVuIC0gMSkgLyAyIChyb3VuZGVkIHVwIHRvIHRoZSBuZWFyZXN0IGludGVnZXIpCiAgIGl0
ZXJhdGlvbnMgb2YgdGhpcyBsb29wLiAgKi8KCi8qID8/PyBDdXJyZW50bHksIG5vIGxhYmVscyBh
cmUgbWFya2VkIGFzIGxvb3AgaW52YXJpYW50IHdoZW4gZG9pbmcgbG9vcAogICB1bnJvbGxpbmcu
ICBUaGlzIGlzIGJlY2F1c2UgYW4gaW5zbiBpbnNpZGUgdGhlIGxvb3AsIHRoYXQgbG9hZHMgdGhl
IGFkZHJlc3MKICAgb2YgYSBsYWJlbCBpbnNpZGUgdGhlIGxvb3AgaW50byBhIHJlZ2lzdGVyLCBj
b3VsZCBiZSBtb3ZlZCBvdXRzaWRlIHRoZSBsb29wCiAgIGJ5IHRoZSBpbnZhcmlhbnQgY29kZSBt
b3Rpb24gcGFzcyBpZiBsYWJlbHMgd2VyZSBpbnZhcmlhbnQuICBJZiB0aGUgbG9vcAogICBpcyBz
dWJzZXF1ZW50bHkgdW5yb2xsZWQsIHRoZSBjb2RlIHdpbGwgYmUgd3JvbmcgYmVjYXVzZSBlYWNo
IHVucm9sbGVkCiAgIGJvZHkgb2YgdGhlIGxvb3Agd2lsbCB1c2UgdGhlIHNhbWUgYWRkcmVzcywg
d2hlcmVhcyBlYWNoIGFjdHVhbGx5IG5lZWRzIGEKICAgZGlmZmVyZW50IGFkZHJlc3MuICBBIGNh
c2Ugd2hlcmUgdGhpcyBoYXBwZW5zIGlzIHdoZW4gYSBsb29wIGNvbnRhaW5pbmcKICAgYSBzd2l0
Y2ggc3RhdGVtZW50IGlzIHVucm9sbGVkLgoKICAgSXQgd291bGQgYmUgYmV0dGVyIHRvIGxldCBs
YWJlbHMgYmUgY29uc2lkZXJlZCBpbnZhcmlhbnQuICBXaGVuIHdlCiAgIHVucm9sbCBsb29wcyBo
ZXJlLCBjaGVjayB0byBzZWUgaWYgYW55IGluc25zIHVzaW5nIGEgbGFiZWwgbG9jYWwgdG8gdGhl
CiAgIGxvb3Agd2VyZSBtb3ZlZCBiZWZvcmUgdGhlIGxvb3AuICBJZiBzbywgdGhlbiBjb3JyZWN0
IHRoZSBwcm9ibGVtLCBieQogICBtb3ZpbmcgdGhlIGluc24gYmFjayBpbnRvIHRoZSBsb29wLCBv
ciBwZXJoYXBzIHJlcGxpY2F0ZSB0aGUgaW5zbiBiZWZvcmUKICAgdGhlIGxvb3AsIG9uZSBjb3B5
IGZvciBlYWNoIHRpbWUgdGhlIGxvb3AgaXMgdW5yb2xsZWQuICAqLwoKLyogVGhlIHByaW1lIGZh
Y3RvcnMgbG9va2VkIGZvciB3aGVuIHRyeWluZyB0byB1bnJvbGwgYSBsb29wIGJ5IHNvbWUKICAg
bnVtYmVyIHdoaWNoIGlzIG1vZHVsbyB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuICBK
dXN0IGNoZWNraW5nCiAgIGZvciB0aGVzZSA0IHByaW1lIGZhY3RvcnMgd2lsbCBmaW5kIGF0IGxl
YXN0IG9uZSBmYWN0b3IgZm9yIDc1JSBvZgogICBhbGwgbnVtYmVycyB0aGVvcmV0aWNhbGx5LiAg
UHJhY3RpY2FsbHkgc3BlYWtpbmcsIHRoaXMgd2lsbCBzdWNjZWVkCiAgIGFsbW9zdCBhbGwgb2Yg
dGhlIHRpbWUgc2luY2UgbG9vcHMgYXJlIGdlbmVyYWxseSBhIG11bHRpcGxlIG9mIDIKICAgYW5k
L29yIDUuICAqLwoKI2RlZmluZSBOVU1fRkFDVE9SUyA0CgpzdHJ1Y3QgX2ZhY3RvciB7IGludCBm
YWN0b3IsIGNvdW50OyB9IGZhY3RvcnNbTlVNX0ZBQ1RPUlNdCiAgPSB7IHsyLCAwfSwgezMsIDB9
LCB7NSwgMH0sIHs3LCAwfX07CgovKiBEZXNjcmliZXMgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBs
b29wIHVucm9sbGluZyBwZXJmb3JtZWQuICAqLwoKZW51bSB1bnJvbGxfdHlwZXMgeyBVTlJPTExf
Q09NUExFVEVMWSwgVU5ST0xMX01PRFVMTywgVU5ST0xMX05BSVZFIH07CgojaW5jbHVkZSAiY29u
ZmlnLmgiCiNpbmNsdWRlICJzeXN0ZW0uaCIKI2luY2x1ZGUgInJ0bC5oIgojaW5jbHVkZSAiaW5z
bi1jb25maWcuaCIKI2luY2x1ZGUgImludGVncmF0ZS5oIgojaW5jbHVkZSAicmVncy5oIgojaW5j
bHVkZSAicmVjb2cuaCIKI2luY2x1ZGUgImZsYWdzLmgiCiNpbmNsdWRlICJleHByLmgiCiNpbmNs
dWRlICJsb29wLmgiCiNpbmNsdWRlICJ0b3BsZXYuaCIKCi8qIFRoaXMgY29udHJvbHMgd2hpY2gg
bG9vcHMgYXJlIHVucm9sbGVkLCBhbmQgYnkgaG93IG11Y2ggd2UgdW5yb2xsCiAgIHRoZW0uICAq
LwoKI2lmbmRlZiBNQVhfVU5ST0xMRURfSU5TTlMKI2RlZmluZSBNQVhfVU5ST0xMRURfSU5TTlMg
MTAwCiNlbmRpZgoKLyogSW5kZXhlZCBieSByZWdpc3RlciBudW1iZXIsIGlmIG5vbi16ZXJvLCB0
aGVuIGl0IGNvbnRhaW5zIGEgcG9pbnRlcgogICB0byBhIHN0cnVjdCBpbmR1Y3Rpb24gZm9yIGEg
REVTVF9SRUcgZ2l2IHdoaWNoIGhhcyBiZWVuIGNvbWJpbmVkIHdpdGgKICAgb25lIG9mIG1vcmUg
YWRkcmVzcyBnaXZzLiAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3aGVuZXZlciBzdWNoIGEgREVT
VF9SRUcKICAgZ2l2IGlzIG1vZGlmaWVkLCB3ZSBtdXN0IG1vZGlmeSB0aGUgdmFsdWUgb2YgYWxs
IHNwbGl0IGFkZHJlc3MgZ2l2cwogICB0aGF0IHdlcmUgY29tYmluZWQgd2l0aCB0aGlzIERFU1Rf
UkVHIGdpdi4gICovCgpzdGF0aWMgc3RydWN0IGluZHVjdGlvbiAqKmFkZHJfY29tYmluZWRfcmVn
czsKCi8qIEluZGV4ZWQgYnkgcmVnaXN0ZXIgbnVtYmVyLCBpZiB0aGlzIGlzIGEgc3BsaXR0YWJs
ZSBpbmR1Y3Rpb24gdmFyaWFibGUsCiAgIHRoZW4gdGhpcyB3aWxsIGhvbGQgdGhlIGN1cnJlbnQg
dmFsdWUgb2YgdGhlIHJlZ2lzdGVyLCB3aGljaCBkZXBlbmRzIG9uIHRoZQogICBpdGVyYXRpb24g
bnVtYmVyLiAgKi8KCnN0YXRpYyBydHggKnNwbGl0dGFibGVfcmVnczsKCi8qIEluZGV4ZWQgYnkg
cmVnaXN0ZXIgbnVtYmVyLCBpZiB0aGlzIGlzIGEgc3BsaXR0YWJsZSBpbmR1Y3Rpb24gdmFyaWFi
bGUsCiAgIHRoaXMgaW5kaWNhdGVzIGlmIGl0IHdhcyBtYWRlIGZyb20gYSBkZXJpdmVkIGdpdi4g
ICovCnN0YXRpYyBjaGFyICpkZXJpdmVkX3JlZ3M7CgovKiBJbmRleGVkIGJ5IHJlZ2lzdGVyIG51
bWJlciwgaWYgdGhpcyBpcyBhIHNwbGl0dGFibGUgaW5kdWN0aW9uIHZhcmlhYmxlLAogICB0aGVu
IHRoaXMgd2lsbCBob2xkIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGluIHRoZSBsb29wIHRo
YXQgbW9kaWZ5CiAgIHRoZSBpbmR1Y3Rpb24gdmFyaWFibGUuICBVc2VkIHRvIGVuc3VyZSB0aGF0
IG9ubHkgdGhlIGxhc3QgaW5zbiBtb2RpZnlpbmcKICAgYSBzcGxpdCBpdiB3aWxsIHVwZGF0ZSB0
aGUgb3JpZ2luYWwgaXYgb2YgdGhlIGRlc3QuICAqLwoKc3RhdGljIGludCAqc3BsaXR0YWJsZV9y
ZWdzX3VwZGF0ZXM7CgovKiBGb3J3YXJkIGRlY2xhcmF0aW9ucy4gICovCgpzdGF0aWMgdm9pZCBp
bml0X3JlZ19tYXAgUFJPVE8oKHN0cnVjdCBpbmxpbmVfcmVtYXAgKiwgaW50KSk7CnN0YXRpYyBy
dHggY2FsY3VsYXRlX2dpdl9pbmMgUFJPVE8oKHJ0eCwgcnR4LCBpbnQpKTsKc3RhdGljIHJ0eCBp
bml0aWFsX3JlZ19ub3RlX2NvcHkgUFJPVE8oKHJ0eCwgc3RydWN0IGlubGluZV9yZW1hcCAqKSk7
CnN0YXRpYyB2b2lkIGZpbmFsX3JlZ19ub3RlX2NvcHkgUFJPVE8oKHJ0eCwgc3RydWN0IGlubGlu
ZV9yZW1hcCAqKSk7CnN0YXRpYyB2b2lkIGNvcHlfbG9vcF9ib2R5IFBST1RPKChydHgsIHJ0eCwg
c3RydWN0IGlubGluZV9yZW1hcCAqLCBydHgsIGludCwKCQkJCSAgZW51bSB1bnJvbGxfdHlwZXMs
IHJ0eCwgcnR4LCBydHgsIHJ0eCkpOwpzdGF0aWMgdm9pZCBpdGVyYXRpb25faW5mbyBQUk9UTygo
cnR4LCBydHggKiwgcnR4ICosIHJ0eCwgcnR4KSk7CnN0YXRpYyBpbnQgZmluZF9zcGxpdHRhYmxl
X3JlZ3MgUFJPVE8oKGVudW0gdW5yb2xsX3R5cGVzLCBydHgsIHJ0eCwgcnR4LCBpbnQsCgkJCQkg
ICAgICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCkpOwpzdGF0aWMgaW50IGZpbmRfc3BsaXR0YWJs
ZV9naXZzIFBST1RPKChzdHJ1Y3QgaXZfY2xhc3MgKiwgZW51bSB1bnJvbGxfdHlwZXMsCgkJCQkg
ICAgICAgcnR4LCBydHgsIHJ0eCwgaW50KSk7CnN0YXRpYyBpbnQgcmVnX2RlYWRfYWZ0ZXJfbG9v
cCBQUk9UTygocnR4LCBydHgsIHJ0eCkpOwpzdGF0aWMgcnR4IGZvbGRfcnR4X211bHRfYWRkIFBS
T1RPKChydHgsIHJ0eCwgcnR4LCBlbnVtIG1hY2hpbmVfbW9kZSkpOwpzdGF0aWMgaW50IHZlcmlm
eV9hZGRyZXNzZXMgUFJPVE8oKHN0cnVjdCBpbmR1Y3Rpb24gKiwgcnR4LCBpbnQpKTsKc3RhdGlj
IHJ0eCByZW1hcF9zcGxpdF9iaXZzIFBST1RPKChydHgpKTsKCi8qIFRyeSB0byB1bnJvbGwgb25l
IGxvb3AgYW5kIHNwbGl0IGluZHVjdGlvbiB2YXJpYWJsZXMgaW4gdGhlIGxvb3AuCgogICBUaGUg
bG9vcCBpcyBkZXNjcmliZWQgYnkgdGhlIGFyZ3VtZW50cyBMT09QX0VORCwgSU5TTl9DT1VOVCwg
YW5kCiAgIExPT1BfU1RBUlQuICBFTkRfSU5TRVJUX0JFRk9SRSBpbmRpY2F0ZXMgd2hlcmUgaW5z
bnMgc2hvdWxkIGJlIGFkZGVkCiAgIHdoaWNoIG5lZWQgdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUg
bG9vcCBmYWxscyB0aHJvdWdoLiAgU1RSRU5HVEhfUkVEVUNUSU9OX1AKICAgaW5kaWNhdGVzIHdo
ZXRoZXIgaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGluIHRoZSBzdHJlbmd0aCByZWR1Y3Rpb24gcGFz
cwogICBpcyBhdmFpbGFibGUuCgogICBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIGNh
bGxlZCBmcm9tIHdpdGhpbiBgc3RyZW5ndGhfcmVkdWNlJwogICBpbiBsb29wLmMuICAqLwoKdm9p
ZAp1bnJvbGxfbG9vcCAobG9vcF9lbmQsIGluc25fY291bnQsIGxvb3Bfc3RhcnQsIGVuZF9pbnNl
cnRfYmVmb3JlLAoJICAgICBsb29wX2luZm8sIHN0cmVuZ3RoX3JlZHVjZV9wKQogICAgIHJ0eCBs
b29wX2VuZDsKICAgICBpbnQgaW5zbl9jb3VudDsKICAgICBydHggbG9vcF9zdGFydDsKICAgICBy
dHggZW5kX2luc2VydF9iZWZvcmU7CiAgICAgc3RydWN0IGxvb3BfaW5mbyAqbG9vcF9pbmZvOwog
ICAgIGludCBzdHJlbmd0aF9yZWR1Y2VfcDsKewogIGludCBpLCBqLCB0ZW1wOwogIGludCB1bnJv
bGxfbnVtYmVyID0gMTsKICBydHggY29weV9zdGFydCwgY29weV9lbmQ7CiAgcnR4IGluc24sIHNl
cXVlbmNlLCBwYXR0ZXJuLCB0ZW07CiAgaW50IG1heF9sYWJlbG5vLCBtYXhfaW5zbm5vOwogIHJ0
eCBpbnNlcnRfYmVmb3JlOwogIHN0cnVjdCBpbmxpbmVfcmVtYXAgKm1hcDsKICBjaGFyICpsb2Nh
bF9sYWJlbDsKICBjaGFyICpsb2NhbF9yZWdubzsKICBpbnQgbWF4X2xvY2FsX3JlZ251bTsKICBp
bnQgbWF4cmVnbnVtOwogIHJ0eCBleGl0X2xhYmVsID0gMDsKICBydHggc3RhcnRfbGFiZWw7CiAg
c3RydWN0IGl2X2NsYXNzICpibDsKICBpbnQgc3BsaXR0aW5nX25vdF9zYWZlID0gMDsKICBlbnVt
IHVucm9sbF90eXBlcyB1bnJvbGxfdHlwZTsKICBpbnQgbG9vcF9wcmVjb25kaXRpb25lZCA9IDA7
CiAgcnR4IHNhZmV0eV9sYWJlbDsKICAvKiBUaGlzIHBvaW50cyB0byB0aGUgbGFzdCByZWFsIGlu
c24gaW4gdGhlIGxvb3AsIHdoaWNoIHNob3VsZCBiZSBlaXRoZXIKICAgICBhIEpVTVBfSU5TTiAo
Zm9yIGNvbmRpdGlvbmFsIGp1bXBzKSBvciBhIEJBUlJJRVIgKGZvciB1bmNvbmRpdGlvbmFsCiAg
ICAganVtcHMpLiAgKi8KICBydHggbGFzdF9sb29wX2luc247CgogIC8qIERvbid0IGJvdGhlciB1
bnJvbGxpbmcgaHVnZSBsb29wcy4gIFNpbmNlIHRoZSBtaW5pbXVtIGZhY3RvciBpcwogICAgIHR3
bywgbG9vcHMgZ3JlYXRlciB0aGFuIG9uZSBoYWxmIG9mIE1BWF9VTlJPTExFRF9JTlNOUyB3aWxs
IG5ldmVyCiAgICAgYmUgdW5yb2xsZWQuICAqLwogIGlmIChpbnNuX2NvdW50ID4gTUFYX1VOUk9M
TEVEX0lOU05TIC8gMikKICAgIHsKICAgICAgaWYgKGxvb3BfZHVtcF9zdHJlYW0pCglmcHJpbnRm
IChsb29wX2R1bXBfc3RyZWFtLCAiVW5yb2xsaW5nIGZhaWx1cmU6IExvb3AgdG9vIGJpZy5cbiIp
OwogICAgICByZXR1cm47CiAgICB9CgogIC8qIFdoZW4gZW1pdHRpbmcgZGVidWdnZXIgaW5mbywg
d2UgY2FuJ3QgdW5yb2xsIGxvb3BzIHdpdGggdW5lcXVhbCBudW1iZXJzCiAgICAgb2YgYmxvY2tf
YmVnIGFuZCBibG9ja19lbmQgbm90ZXMsIGJlY2F1c2UgdGhhdCB3b3VsZCB1bmJhbGFuY2UgdGhl
IGJsb2NrCiAgICAgc3RydWN0dXJlIG9mIHRoZSBmdW5jdGlvbi4gIFRoaXMgY2FuIGhhcHBlbiBh
cyBhIHJlc3VsdCBvZiB0aGUKICAgICAiaWYgKGZvbykgYmFyOyBlbHNlIGJyZWFrOyIgb3B0aW1p
emF0aW9uIGluIGp1bXAuYy4gICovCiAgLyogPz8/IEdjYyBoYXMgYSBnZW5lcmFsIHBvbGljeSB0
aGF0IC1nIGlzIG5ldmVyIHN1cHBvc2VkIHRvIGNoYW5nZSB0aGUgY29kZQogICAgIHRoYXQgdGhl
IGNvbXBpbGVyIGVtaXRzLCBzbyB3ZSBtdXN0IGRpc2FibGUgdGhpcyBvcHRpbWl6YXRpb24gYWx3
YXlzLAogICAgIGV2ZW4gaWYgZGVidWcgaW5mbyBpcyBub3QgYmVpbmcgb3V0cHV0LiAgVGhpcyBp
cyByYXJlLCBzbyB0aGlzIHNob3VsZAogICAgIG5vdCBiZSBhIHNpZ25pZmljYW50IHBlcmZvcm1h
bmNlIHByb2JsZW0uICAqLwoKICBpZiAoMSAvKiB3cml0ZV9zeW1ib2xzICE9IE5PX0RFQlVHICov
KQogICAgewogICAgICBpbnQgYmxvY2tfYmVnaW5zID0gMDsKICAgICAgaW50IGJsb2NrX2VuZHMg
PSAwOwoKICAgICAgZm9yIChpbnNuID0gbG9vcF9zdGFydDsgaW5zbiAhPSBsb29wX2VuZDsgaW5z
biA9IE5FWFRfSU5TTiAoaW5zbikpCgl7CgkgIGlmIChHRVRfQ09ERSAoaW5zbikgPT0gTk9URSkK
CSAgICB7CgkgICAgICBpZiAoTk9URV9MSU5FX05VTUJFUiAoaW5zbikgPT0gTk9URV9JTlNOX0JM
T0NLX0JFRykKCQlibG9ja19iZWdpbnMrKzsKCSAgICAgIGVsc2UgaWYgKE5PVEVfTElORV9OVU1C
RVIgKGluc24pID09IE5PVEVfSU5TTl9CTE9DS19FTkQpCgkJYmxvY2tfZW5kcysrOwoJICAgIH0K
CX0KCiAgICAgIGlmIChibG9ja19iZWdpbnMgIT0gYmxvY2tfZW5kcykKCXsKCSAgaWYgKGxvb3Bf
ZHVtcF9zdHJlYW0pCgkgICAgZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgICAgICJVbnJv
bGxpbmcgZmFpbHVyZTogVW5iYWxhbmNlZCBibG9jayBub3Rlcy5cbiIpOwoJICByZXR1cm47Cgl9
CiAgICB9CgogIC8qIERldGVybWluZSB0eXBlIG9mIHVucm9sbCB0byBwZXJmb3JtLiAgRGVwZW5k
cyBvbiB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKICAgICBhbmQgdGhlIHNpemUgb2YgdGhlIGxv
b3AuICAqLwoKICAvKiBJZiB0aGVyZSBpcyBubyBzdHJlbmd0aCByZWR1Y2UgaW5mbywgdGhlbiBz
ZXQKICAgICBsb29wX2luZm8tPm5faXRlcmF0aW9ucyB0byB6ZXJvLiAgVGhpcyBjYW4gaGFwcGVu
IGlmCiAgICAgc3RyZW5ndGhfcmVkdWNlIGNhbid0IGZpbmQgYW55IGJpdnMgaW4gdGhlIGxvb3Au
ICBBIHZhbHVlIG9mIHplcm8KICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgbnVtYmVyIG9mIGl0ZXJh
dGlvbnMgY291bGQgbm90IGJlIGNhbGN1bGF0ZWQuICAqLwoKICBpZiAoISBzdHJlbmd0aF9yZWR1
Y2VfcCkKICAgIGxvb3BfaW5mby0+bl9pdGVyYXRpb25zID0gMDsKCiAgaWYgKGxvb3BfZHVtcF9z
dHJlYW0gJiYgbG9vcF9pbmZvLT5uX2l0ZXJhdGlvbnMgPiAwKQogICAgewogICAgICBmcHV0cyAo
Ikxvb3AgdW5yb2xsaW5nOiAiLCBsb29wX2R1bXBfc3RyZWFtKTsKICAgICAgZnByaW50ZiAobG9v
cF9kdW1wX3N0cmVhbSwgSE9TVF9XSURFX0lOVF9QUklOVF9ERUMsCgkgICAgICAgbG9vcF9pbmZv
LT5uX2l0ZXJhdGlvbnMpOwogICAgICBmcHV0cyAoIiBpdGVyYXRpb25zLlxuIiwgbG9vcF9kdW1w
X3N0cmVhbSk7CiAgICB9CgogIC8qIEZpbmQgYW5kIHNhdmUgYSBwb2ludGVyIHRvIHRoZSBsYXN0
IG5vbm5vdGUgaW5zbiBpbiB0aGUgbG9vcC4gICovCgogIGxhc3RfbG9vcF9pbnNuID0gcHJldl9u
b25ub3RlX2luc24gKGxvb3BfZW5kKTsKCiAgLyogQ2FsY3VsYXRlIGhvdyBtYW55IHRpbWVzIHRv
IHVucm9sbCB0aGUgbG9vcC4gIEluZGljYXRlIHdoZXRoZXIgb3IKICAgICBub3QgdGhlIGxvb3Ag
aXMgYmVpbmcgY29tcGxldGVseSB1bnJvbGxlZC4gICovCgogIGlmIChsb29wX2luZm8tPm5faXRl
cmF0aW9ucyA9PSAxKQogICAgewogICAgICAvKiBJZiBudW1iZXIgb2YgaXRlcmF0aW9ucyBpcyBl
eGFjdGx5IDEsIHRoZW4gZWxpbWluYXRlIHRoZSBjb21wYXJlIGFuZAoJIGJyYW5jaCBhdCB0aGUg
ZW5kIG9mIHRoZSBsb29wIHNpbmNlIHRoZXkgd2lsbCBuZXZlciBiZSB0YWtlbi4KCSBUaGVuIHJl
dHVybiwgc2luY2Ugbm8gb3RoZXIgYWN0aW9uIGlzIG5lZWRlZCBoZXJlLiAgKi8KCiAgICAgIC8q
IElmIHRoZSBsYXN0IGluc3RydWN0aW9uIGlzIG5vdCBhIEJBUlJJRVIgb3IgYSBKVU1QX0lOU04s
IHRoZW4KCSBkb24ndCBkbyBhbnl0aGluZy4gICovCgogICAgICBpZiAoR0VUX0NPREUgKGxhc3Rf
bG9vcF9pbnNuKSA9PSBCQVJSSUVSKQoJewoJICAvKiBEZWxldGUgdGhlIGp1bXAgaW5zbi4gIFRo
aXMgd2lsbCBkZWxldGUgdGhlIGJhcnJpZXIgYWxzby4gICovCgkgIGRlbGV0ZV9pbnNuIChQUkVW
X0lOU04gKGxhc3RfbG9vcF9pbnNuKSk7Cgl9CiAgICAgIGVsc2UgaWYgKEdFVF9DT0RFIChsYXN0
X2xvb3BfaW5zbikgPT0gSlVNUF9JTlNOKQoJewojaWZkZWYgSEFWRV9jYzAKCSAgLyogVGhlIGlt
bWVkaWF0ZWx5IHByZWNlZGluZyBpbnNuIGlzIGEgY29tcGFyZSB3aGljaCBtdXN0IGJlCgkgICAg
IGRlbGV0ZWQuICAqLwoJICBkZWxldGVfaW5zbiAobGFzdF9sb29wX2luc24pOwoJICBkZWxldGVf
aW5zbiAoUFJFVl9JTlNOIChsYXN0X2xvb3BfaW5zbikpOwojZWxzZQoJICAvKiBUaGUgaW1tZWRp
YXRlbHkgcHJlY2VkaW5nIGluc24gbWF5IG5vdCBiZSB0aGUgY29tcGFyZSwgc28gZG9uJ3QKCSAg
ICAgZGVsZXRlIGl0LiAgKi8KCSAgZGVsZXRlX2luc24gKGxhc3RfbG9vcF9pbnNuKTsKI2VuZGlm
Cgl9CiAgICAgIHJldHVybjsKICAgIH0KICBlbHNlIGlmIChsb29wX2luZm8tPm5faXRlcmF0aW9u
cyA+IDAKICAgICAgJiYgbG9vcF9pbmZvLT5uX2l0ZXJhdGlvbnMgKiBpbnNuX2NvdW50IDwgTUFY
X1VOUk9MTEVEX0lOU05TKQogICAgewogICAgICB1bnJvbGxfbnVtYmVyID0gbG9vcF9pbmZvLT5u
X2l0ZXJhdGlvbnM7CiAgICAgIHVucm9sbF90eXBlID0gVU5ST0xMX0NPTVBMRVRFTFk7CiAgICB9
CiAgZWxzZSBpZiAobG9vcF9pbmZvLT5uX2l0ZXJhdGlvbnMgPiAwKQogICAgewogICAgICAvKiBU
cnkgdG8gZmFjdG9yIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucy4gIERvbid0IGJvdGhlciB3aXRo
IHRoZQoJIGdlbmVyYWwgY2FzZSwgb25seSB1c2luZyAyLCAzLCA1LCBhbmQgNyB3aWxsIGdldCA3
NSUgb2YgYWxsCgkgbnVtYmVycyB0aGVvcmV0aWNhbGx5LCBhbmQgYWxtb3N0IGFsbCBpbiBwcmFj
dGljZS4gICovCgogICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0ZBQ1RPUlM7IGkrKykKCWZhY3Rv
cnNbaV0uY291bnQgPSAwOwoKICAgICAgdGVtcCA9IGxvb3BfaW5mby0+bl9pdGVyYXRpb25zOwog
ICAgICBmb3IgKGkgPSBOVU1fRkFDVE9SUyAtIDE7IGkgPj0gMDsgaS0tKQoJd2hpbGUgKHRlbXAg
JSBmYWN0b3JzW2ldLmZhY3RvciA9PSAwKQoJICB7CgkgICAgZmFjdG9yc1tpXS5jb3VudCsrOwoJ
ICAgIHRlbXAgPSB0ZW1wIC8gZmFjdG9yc1tpXS5mYWN0b3I7CgkgIH0KCiAgICAgIC8qIFN0YXJ0
IHdpdGggdGhlIGxhcmdlciBmYWN0b3JzIGZpcnN0IHNvIHRoYXQgd2UgZ2VuZXJhbGx5CgkgZ2V0
IGxvdHMgb2YgdW5yb2xsaW5nLiAgKi8KCiAgICAgIHVucm9sbF9udW1iZXIgPSAxOwogICAgICB0
ZW1wID0gaW5zbl9jb3VudDsKICAgICAgZm9yIChpID0gMzsgaSA+PSAwOyBpLS0pCgl3aGlsZSAo
ZmFjdG9yc1tpXS5jb3VudC0tKQoJICB7CgkgICAgaWYgKHRlbXAgKiBmYWN0b3JzW2ldLmZhY3Rv
ciA8IE1BWF9VTlJPTExFRF9JTlNOUykKCSAgICAgIHsKCQl1bnJvbGxfbnVtYmVyICo9IGZhY3Rv
cnNbaV0uZmFjdG9yOwoJCXRlbXAgKj0gZmFjdG9yc1tpXS5mYWN0b3I7CgkgICAgICB9CgkgICAg
ZWxzZQoJICAgICAgYnJlYWs7CgkgIH0KCiAgICAgIC8qIElmIHdlIGNvdWxkbid0IGZpbmQgYW55
IGZhY3RvcnMsIHRoZW4gdW5yb2xsIGFzIGluIHRoZSBub3JtYWwKCSBjYXNlLiAgKi8KICAgICAg
aWYgKHVucm9sbF9udW1iZXIgPT0gMSkKCXsKCSAgaWYgKGxvb3BfZHVtcF9zdHJlYW0pCgkgICAg
ZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgICAgICJMb29wIHVucm9sbGluZzogTm8gZmFj
dG9ycyBmb3VuZC5cbiIpOwoJfQogICAgICBlbHNlCgl1bnJvbGxfdHlwZSA9IFVOUk9MTF9NT0RV
TE87CiAgICB9CgoKICAvKiBEZWZhdWx0IGNhc2UsIGNhbGN1bGF0ZSBudW1iZXIgb2YgdGltZXMg
dG8gdW5yb2xsIGxvb3AgYmFzZWQgb24gaXRzCiAgICAgc2l6ZS4gICovCiAgaWYgKHVucm9sbF9u
dW1iZXIgPT0gMSkKICAgIHsKICAgICAgaWYgKDggKiBpbnNuX2NvdW50IDwgTUFYX1VOUk9MTEVE
X0lOU05TKQoJdW5yb2xsX251bWJlciA9IDg7CiAgICAgIGVsc2UgaWYgKDQgKiBpbnNuX2NvdW50
IDwgTUFYX1VOUk9MTEVEX0lOU05TKQoJdW5yb2xsX251bWJlciA9IDQ7CiAgICAgIGVsc2UKCXVu
cm9sbF9udW1iZXIgPSAyOwoKICAgICAgdW5yb2xsX3R5cGUgPSBVTlJPTExfTkFJVkU7CiAgICB9
CgogIC8qIE5vdyB3ZSBrbm93IGhvdyBtYW55IHRpbWVzIHRvIHVucm9sbCB0aGUgbG9vcC4gICov
CgogIGlmIChsb29wX2R1bXBfc3RyZWFtKQogICAgZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwK
CSAgICAgIlVucm9sbGluZyBsb29wICVkIHRpbWVzLlxuIiwgdW5yb2xsX251bWJlcik7CgoKICBp
ZiAodW5yb2xsX3R5cGUgPT0gVU5ST0xMX0NPTVBMRVRFTFkgfHwgdW5yb2xsX3R5cGUgPT0gVU5S
T0xMX01PRFVMTykKICAgIHsKICAgICAgLyogTG9vcHMgb2YgdGhlc2UgdHlwZXMgY2FuIHN0YXJ0
IHdpdGgganVtcCBkb3duIHRvIHRoZSBleGl0IGNvbmRpdGlvbgoJIGluIHJhcmUgY2lyY3Vtc3Rh
bmNlcy4KCgkgQ29uc2lkZXIgYSBwYWlyIG9mIG5lc3RlZCBsb29wcyB3aGVyZSB0aGUgaW5uZXIg
bG9vcCBpcyBwYXJ0Cgkgb2YgdGhlIGV4aXQgY29kZSBmb3IgdGhlIG91dGVyIGxvb3AuCgoJIElu
IHRoaXMgY2FzZSBqdW1wLmMgd2lsbCBub3QgZHVwbGljYXRlIHRoZSBleGl0IHRlc3QgZm9yIHRo
ZSBvdXRlcgoJIGxvb3AsIHNvIGl0IHdpbGwgc3RhcnQgd2l0aCBhIGp1bXAgdG8gdGhlIGV4aXQg
Y29kZS4KCgkgVGhlbiBjb25zaWRlciBpZiB0aGUgaW5uZXIgbG9vcCB0dXJucyBvdXQgdG8gaXRl
cmF0ZSBvbmNlIGFuZAoJIG9ubHkgb25jZS4gIFdlIHdpbGwgZW5kIHVwIGRlbGV0aW5nIHRoZSBq
dW1wcyBhc3NvY2lhdGVkIHdpdGgKCSB0aGUgaW5uZXIgbG9vcC4gIEhvd2V2ZXIsIHRoZSBsb29w
IG5vdGVzIGFyZSBub3QgcmVtb3ZlZCBmcm9tCgkgdGhlIGluc3RydWN0aW9uIHN0cmVhbS4KCgkg
QW5kIGZpbmFsbHkgYXNzdW1lIHRoYXQgd2UgY2FuIGNvbXB1dGUgdGhlIG51bWJlciBvZiBpdGVy
YXRpb25zCgkgZm9yIHRoZSBvdXRlciBsb29wLgoKCSBJbiB0aGlzIGNhc2UgdW5yb2xsIG1heSB3
YW50IHRvIHVucm9sbCB0aGUgb3V0ZXIgbG9vcCBldmVuIHRob3VnaAoJIGl0IHN0YXJ0cyB3aXRo
IGEganVtcCB0byB0aGUgb3V0ZXIgbG9vcCdzIGV4aXQgY29kZS4KCgkgV2UgY291bGQgdHJ5IHRv
IG9wdGltaXplIHRoaXMgY2FzZSwgYnV0IGl0IGhhcmRseSBzZWVtcyB3b3J0aCBpdC4KCSBKdXN0
IHJldHVybiB3aXRob3V0IHVucm9sbGluZyB0aGUgbG9vcCBpbiBzdWNoIGNhc2VzLiAgKi8KCiAg
ICAgIGluc24gPSBsb29wX3N0YXJ0OwogICAgICB3aGlsZSAoR0VUX0NPREUgKGluc24pICE9IENP
REVfTEFCRUwgJiYgR0VUX0NPREUgKGluc24pICE9IEpVTVBfSU5TTikKCWluc24gPSBORVhUX0lO
U04gKGluc24pOwogICAgICBpZiAoR0VUX0NPREUgKGluc24pID09IEpVTVBfSU5TTikKCXJldHVy
bjsKICAgIH0KCiAgaWYgKHVucm9sbF90eXBlID09IFVOUk9MTF9DT01QTEVURUxZKQogICAgewog
ICAgICAvKiBDb21wbGV0ZWx5IHVucm9sbGluZyB0aGUgbG9vcDogIERlbGV0ZSB0aGUgY29tcGFy
ZSBhbmQgYnJhbmNoIGF0CgkgdGhlIGVuZCAodGhlIGxhc3QgdHdvIGluc3RydWN0aW9ucykuICAg
VGhpcyBkZWxldGUgbXVzdCBkb25lIGF0IHRoZQoJIHZlcnkgZW5kIG9mIGxvb3AgdW5yb2xsaW5n
LCB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGNhbGxzIHRvCgkgYmFja19icmFuY2hfaW5fcmFuZ2Vf
cCwgd2hpY2ggaXMgY2FsbGVkIGJ5IGZpbmRfc3BsaXR0YWJsZV9yZWdzLgoJIEFsbCBpbmNyZW1l
bnRzIG9mIHNwbGl0dGFibGUgYml2cy9naXZzIGFyZSBjaGFuZ2VkIHRvIGxvYWQgY29uc3RhbnQK
CSBpbnN0cnVjdGlvbnMuICAqLwoKICAgICAgY29weV9zdGFydCA9IGxvb3Bfc3RhcnQ7CgogICAg
ICAvKiBTZXQgaW5zZXJ0X2JlZm9yZSB0byB0aGUgaW5zdHJ1Y3Rpb24gaW1tZWRpYXRlbHkgYWZ0
ZXIgdGhlIEpVTVBfSU5TTgoJIChvciBCQVJSSUVSKSwgc28gdGhhdCBhbnkgTk9URXMgYmV0d2Vl
biB0aGUgSlVNUF9JTlNOIGFuZCB0aGUgZW5kIG9mCgkgdGhlIGxvb3Agd2lsbCBiZSBjb3JyZWN0
bHkgaGFuZGxlZCBieSBjb3B5X2xvb3BfYm9keS4gICovCiAgICAgIGluc2VydF9iZWZvcmUgPSBO
RVhUX0lOU04gKGxhc3RfbG9vcF9pbnNuKTsKCiAgICAgIC8qIFNldCBjb3B5X2VuZCB0byB0aGUg
aW5zbiBiZWZvcmUgdGhlIGp1bXAgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcC4gICovCiAgICAgIGlm
IChHRVRfQ09ERSAobGFzdF9sb29wX2luc24pID09IEJBUlJJRVIpCgljb3B5X2VuZCA9IFBSRVZf
SU5TTiAoUFJFVl9JTlNOIChsYXN0X2xvb3BfaW5zbikpOwogICAgICBlbHNlIGlmIChHRVRfQ09E
RSAobGFzdF9sb29wX2luc24pID09IEpVTVBfSU5TTikKCXsKI2lmZGVmIEhBVkVfY2MwCgkgIC8q
IFRoZSBpbnN0cnVjdGlvbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIEpVTVBfSU5TTiBpcyBhIGNv
bXBhcmUKCSAgICAgaW5zdHJ1Y3Rpb24gd2hpY2ggd2UgZG8gbm90IHdhbnQgdG8gY29weS4gICov
CgkgIGNvcHlfZW5kID0gUFJFVl9JTlNOIChQUkVWX0lOU04gKGxhc3RfbG9vcF9pbnNuKSk7CiNl
bHNlCgkgIC8qIFRoZSBpbnN0cnVjdGlvbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIEpVTVBfSU5T
TiBtYXkgbm90IGJlIHRoZQoJICAgICBjb21wYXJlLCBzbyB3ZSBtdXN0IGNvcHkgaXQuICAqLwoJ
ICBjb3B5X2VuZCA9IFBSRVZfSU5TTiAobGFzdF9sb29wX2luc24pOwojZW5kaWYKCX0KICAgICAg
ZWxzZQoJewoJICAvKiBXZSBjdXJyZW50bHkgY2FuJ3QgdW5yb2xsIGEgbG9vcCBpZiBpdCBkb2Vz
bid0IGVuZCB3aXRoIGEKCSAgICAgSlVNUF9JTlNOLiAgVGhlcmUgd291bGQgbmVlZCB0byBiZSBh
IG1lY2hhbmlzbSB0aGF0IHJlY29nbml6ZXMKCSAgICAgdGhpcyBjYXNlLCBhbmQgdGhlbiBpbnNl
cnRzIGEganVtcCBhZnRlciBlYWNoIGxvb3AgYm9keSwgd2hpY2gKCSAgICAganVtcHMgdG8gYWZ0
ZXIgdGhlIGxhc3QgbG9vcCBib2R5LiAgKi8KCSAgaWYgKGxvb3BfZHVtcF9zdHJlYW0pCgkgICAg
ZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgICAgICJVbnJvbGxpbmcgZmFpbHVyZTogbG9v
cCBkb2VzIG5vdCBlbmQgd2l0aCBhIEpVTVBfSU5TTi5cbiIpOwoJICByZXR1cm47Cgl9CiAgICB9
CiAgZWxzZSBpZiAodW5yb2xsX3R5cGUgPT0gVU5ST0xMX01PRFVMTykKICAgIHsKICAgICAgLyog
UGFydGlhbGx5IHVucm9sbGluZyB0aGUgbG9vcDogIFRoZSBjb21wYXJlIGFuZCBicmFuY2ggYXQg
dGhlIGVuZAoJICh0aGUgbGFzdCB0d28gaW5zdHJ1Y3Rpb25zKSBtdXN0IHJlbWFpbi4gIERvbid0
IGNvcHkgdGhlIGNvbXBhcmUKCSBhbmQgYnJhbmNoIGluc3RydWN0aW9ucyBhdCB0aGUgZW5kIG9m
IHRoZSBsb29wLiAgSW5zZXJ0IHRoZSB1bnJvbGxlZAoJIGNvZGUgaW1tZWRpYXRlbHkgYmVmb3Jl
IHRoZSBjb21wYXJlL2JyYW5jaCBhdCB0aGUgZW5kIHNvIHRoYXQgdGhlCgkgY29kZSB3aWxsIGZh
bGwgdGhyb3VnaCB0byB0aGVtIGFzIGJlZm9yZS4gICovCgogICAgICBjb3B5X3N0YXJ0ID0gbG9v
cF9zdGFydDsKCiAgICAgIC8qIFNldCBpbnNlcnRfYmVmb3JlIHRvIHRoZSBqdW1wIGluc24gYXQg
dGhlIGVuZCBvZiB0aGUgbG9vcC4KCSBTZXQgY29weV9lbmQgdG8gYmVmb3JlIHRoZSBqdW1wIGlu
c24gYXQgdGhlIGVuZCBvZiB0aGUgbG9vcC4gICovCiAgICAgIGlmIChHRVRfQ09ERSAobGFzdF9s
b29wX2luc24pID09IEJBUlJJRVIpCgl7CgkgIGluc2VydF9iZWZvcmUgPSBQUkVWX0lOU04gKGxh
c3RfbG9vcF9pbnNuKTsKCSAgY29weV9lbmQgPSBQUkVWX0lOU04gKGluc2VydF9iZWZvcmUpOwoJ
fQogICAgICBlbHNlIGlmIChHRVRfQ09ERSAobGFzdF9sb29wX2luc24pID09IEpVTVBfSU5TTikK
CXsKI2lmZGVmIEhBVkVfY2MwCgkgIC8qIFRoZSBpbnN0cnVjdGlvbiBpbW1lZGlhdGVseSBiZWZv
cmUgdGhlIEpVTVBfSU5TTiBpcyBhIGNvbXBhcmUKCSAgICAgaW5zdHJ1Y3Rpb24gd2hpY2ggd2Ug
ZG8gbm90IHdhbnQgdG8gY29weSBvciBkZWxldGUuICAqLwoJICBpbnNlcnRfYmVmb3JlID0gUFJF
Vl9JTlNOIChsYXN0X2xvb3BfaW5zbik7CgkgIGNvcHlfZW5kID0gUFJFVl9JTlNOIChpbnNlcnRf
YmVmb3JlKTsKI2Vsc2UKCSAgLyogVGhlIGluc3RydWN0aW9uIGltbWVkaWF0ZWx5IGJlZm9yZSB0
aGUgSlVNUF9JTlNOIG1heSBub3QgYmUgdGhlCgkgICAgIGNvbXBhcmUsIHNvIHdlIG11c3QgY29w
eSBpdC4gICovCgkgIGluc2VydF9iZWZvcmUgPSBsYXN0X2xvb3BfaW5zbjsKCSAgY29weV9lbmQg
PSBQUkVWX0lOU04gKGxhc3RfbG9vcF9pbnNuKTsKI2VuZGlmCgl9CiAgICAgIGVsc2UKCXsKCSAg
LyogV2UgY3VycmVudGx5IGNhbid0IHVucm9sbCBhIGxvb3AgaWYgaXQgZG9lc24ndCBlbmQgd2l0
aCBhCgkgICAgIEpVTVBfSU5TTi4gIFRoZXJlIHdvdWxkIG5lZWQgdG8gYmUgYSBtZWNoYW5pc20g
dGhhdCByZWNvZ25pemVzCgkgICAgIHRoaXMgY2FzZSwgYW5kIHRoZW4gaW5zZXJ0cyBhIGp1bXAg
YWZ0ZXIgZWFjaCBsb29wIGJvZHksIHdoaWNoCgkgICAgIGp1bXBzIHRvIGFmdGVyIHRoZSBsYXN0
IGxvb3AgYm9keS4gICovCgkgIGlmIChsb29wX2R1bXBfc3RyZWFtKQoJICAgIGZwcmludGYgKGxv
b3BfZHVtcF9zdHJlYW0sCgkJICAgICAiVW5yb2xsaW5nIGZhaWx1cmU6IGxvb3AgZG9lcyBub3Qg
ZW5kIHdpdGggYSBKVU1QX0lOU04uXG4iKTsKCSAgcmV0dXJuOwoJfQogICAgfQogIGVsc2UKICAg
IHsKICAgICAgLyogTm9ybWFsIGNhc2U6IE11c3QgY29weSB0aGUgY29tcGFyZSBhbmQgYnJhbmNo
IGluc3RydWN0aW9ucyBhdCB0aGUKCSBlbmQgb2YgdGhlIGxvb3AuICAqLwoKICAgICAgaWYgKEdF
VF9DT0RFIChsYXN0X2xvb3BfaW5zbikgPT0gQkFSUklFUikKCXsKCSAgLyogTG9vcCBlbmRzIHdp
dGggYW4gdW5jb25kaXRpb25hbCBqdW1wIGFuZCBhIGJhcnJpZXIuCgkgICAgIEhhbmRsZSB0aGlz
IGxpa2UgYWJvdmUsIGRvbid0IGNvcHkganVtcCBhbmQgYmFycmllci4KCSAgICAgVGhpcyBpcyBu
b3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQgZG9pbmcgc28gcHJldmVudHMgZ2VuZXJhdGluZwoJ
ICAgICB1bmNvbmRpdGlvbmFsIGp1bXBzIHRvIGFuIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBsYWJl
bC4KCgkgICAgIFRoaXMgd2lsbCBiZSBjb3JyZWN0ZWQgYmVsb3cgaWYgdGhlIHRhcmdldCBvZiB0
aGlzIGp1bXAgaXMKCSAgICAgbm90IHRoZSBzdGFydF9sYWJlbC4gICovCgoJICBpbnNlcnRfYmVm
b3JlID0gUFJFVl9JTlNOIChsYXN0X2xvb3BfaW5zbik7CgkgIGNvcHlfZW5kID0gUFJFVl9JTlNO
IChpbnNlcnRfYmVmb3JlKTsKCX0KICAgICAgZWxzZSBpZiAoR0VUX0NPREUgKGxhc3RfbG9vcF9p
bnNuKSA9PSBKVU1QX0lOU04pCgl7CgkgIC8qIFNldCBpbnNlcnRfYmVmb3JlIHRvIGltbWVkaWF0
ZWx5IGFmdGVyIHRoZSBKVU1QX0lOU04sIHNvIHRoYXQKCSAgICAgTk9URXMgYXQgdGhlIGVuZCBv
ZiB0aGUgbG9vcCB3aWxsIGJlIGNvcnJlY3RseSBoYW5kbGVkIGJ5CgkgICAgIGNvcHlfbG9vcF9i
b2R5LiAgKi8KCSAgaW5zZXJ0X2JlZm9yZSA9IE5FWFRfSU5TTiAobGFzdF9sb29wX2luc24pOwoJ
ICBjb3B5X2VuZCA9IGxhc3RfbG9vcF9pbnNuOwoJfQogICAgICBlbHNlCgl7CgkgIC8qIFdlIGN1
cnJlbnRseSBjYW4ndCB1bnJvbGwgYSBsb29wIGlmIGl0IGRvZXNuJ3QgZW5kIHdpdGggYQoJICAg
ICBKVU1QX0lOU04uICBUaGVyZSB3b3VsZCBuZWVkIHRvIGJlIGEgbWVjaGFuaXNtIHRoYXQgcmVj
b2duaXplcwoJICAgICB0aGlzIGNhc2UsIGFuZCB0aGVuIGluc2VydHMgYSBqdW1wIGFmdGVyIGVh
Y2ggbG9vcCBib2R5LCB3aGljaAoJICAgICBqdW1wcyB0byBhZnRlciB0aGUgbGFzdCBsb29wIGJv
ZHkuICAqLwoJICBpZiAobG9vcF9kdW1wX3N0cmVhbSkKCSAgICBmcHJpbnRmIChsb29wX2R1bXBf
c3RyZWFtLAoJCSAgICAgIlVucm9sbGluZyBmYWlsdXJlOiBsb29wIGRvZXMgbm90IGVuZCB3aXRo
IGEgSlVNUF9JTlNOLlxuIik7CgkgIHJldHVybjsKCX0KCiAgICAgIC8qIElmIGNvcHlpbmcgZXhp
dCB0ZXN0IGJyYW5jaGVzIGJlY2F1c2UgdGhleSBjYW4gbm90IGJlIGVsaW1pbmF0ZWQsCgkgdGhl
biBtdXN0IGNvbnZlcnQgdGhlIGZhbGwgdGhyb3VnaCBjYXNlIG9mIHRoZSBicmFuY2ggdG8gYSBq
dW1wIHBhc3QKCSB0aGUgZW5kIG9mIHRoZSBsb29wLiAgQ3JlYXRlIGEgbGFiZWwgdG8gZW1pdCBh
ZnRlciB0aGUgbG9vcCBhbmQgc2F2ZQoJIGl0IGZvciBsYXRlciB1c2UuICBEbyBub3QgdXNlIHRo
ZSBsYWJlbCBhZnRlciB0aGUgbG9vcCwgaWYgYW55LCBzaW5jZQoJIGl0IG1pZ2h0IGJlIHVzZWQg
YnkgaW5zbnMgb3V0c2lkZSB0aGUgbG9vcCwgb3IgdGhlcmUgbWlnaHQgYmUgaW5zbnMKCSBhZGRl
ZCBiZWZvcmUgaXQgbGF0ZXIgYnkgZmluYWxfW2JnXWl2X3ZhbHVlIHdoaWNoIG11c3QgYmUgYWZ0
ZXIKCSB0aGUgcmVhbCBleGl0IGxhYmVsLiAgKi8KICAgICAgZXhpdF9sYWJlbCA9IGdlbl9sYWJl
bF9ydHggKCk7CgogICAgICBpbnNuID0gbG9vcF9zdGFydDsKICAgICAgd2hpbGUgKEdFVF9DT0RF
IChpbnNuKSAhPSBDT0RFX0xBQkVMICYmIEdFVF9DT0RFIChpbnNuKSAhPSBKVU1QX0lOU04pCglp
bnNuID0gTkVYVF9JTlNOIChpbnNuKTsKCiAgICAgIGlmIChHRVRfQ09ERSAoaW5zbikgPT0gSlVN
UF9JTlNOKQoJewoJICAvKiBUaGUgbG9vcCBzdGFydHMgd2l0aCBhIGp1bXAgZG93biB0byB0aGUg
ZXhpdCBjb25kaXRpb24gdGVzdC4KCSAgICAgU3RhcnQgY29weWluZyB0aGUgbG9vcCBhZnRlciB0
aGUgYmFycmllciBmb2xsb3dpbmcgdGhpcwoJICAgICBqdW1wIGluc24uICAqLwoJICBjb3B5X3N0
YXJ0ID0gTkVYVF9JTlNOIChpbnNuKTsKCgkgIC8qIFNwbGl0dGluZyBpbmR1Y3Rpb24gdmFyaWFi
bGVzIGRvZXNuJ3Qgd29yayB3aGVuIHRoZSBsb29wIGlzCgkgICAgIGVudGVyZWQgdmlhIGEganVt
cCB0byB0aGUgYm90dG9tLCBiZWNhdXNlIHRoZW4gd2UgZW5kIHVwIGRvaW5nCgkgICAgIGEgY29t
cGFyaXNvbiBhZ2FpbnN0IGEgbmV3IHJlZ2lzdGVyIGZvciBhIHNwbGl0IHZhcmlhYmxlLCBidXQK
CSAgICAgd2UgZGlkIG5vdCBleGVjdXRlIHRoZSBzZXQgaW5zbiBmb3IgdGhlIG5ldyByZWdpc3Rl
ciBiZWNhdXNlCgkgICAgIGl0IHdhcyBza2lwcGVkIG92ZXIuICAqLwoJICBzcGxpdHRpbmdfbm90
X3NhZmUgPSAxOwoJICBpZiAobG9vcF9kdW1wX3N0cmVhbSkKCSAgICBmcHJpbnRmIChsb29wX2R1
bXBfc3RyZWFtLAoJCSAgICAgIlNwbGl0dGluZyBub3Qgc2FmZSwgYmVjYXVzZSBsb29wIG5vdCBl
bnRlcmVkIGF0IHRvcC5cbiIpOwoJfQogICAgICBlbHNlCgljb3B5X3N0YXJ0ID0gbG9vcF9zdGFy
dDsKICAgIH0KCiAgLyogVGhpcyBzaG91bGQgYWx3YXlzIGJlIHRoZSBmaXJzdCBsYWJlbCBpbiB0
aGUgbG9vcC4gICovCiAgc3RhcnRfbGFiZWwgPSBORVhUX0lOU04gKGNvcHlfc3RhcnQpOwogIC8q
IFRoZXJlIG1heSBiZSBhIGxpbmUgbnVtYmVyIG5vdGUgYW5kL29yIGEgbG9vcCBjb250aW51ZSBu
b3RlIGhlcmUuICAqLwogIHdoaWxlIChHRVRfQ09ERSAoc3RhcnRfbGFiZWwpID09IE5PVEUpCiAg
ICBzdGFydF9sYWJlbCA9IE5FWFRfSU5TTiAoc3RhcnRfbGFiZWwpOwogIGlmIChHRVRfQ09ERSAo
c3RhcnRfbGFiZWwpICE9IENPREVfTEFCRUwpCiAgICB7CiAgICAgIC8qIFRoaXMgY2FuIGhhcHBl
biBhcyBhIHJlc3VsdCBvZiBqdW1wIHRocmVhZGluZy4gIElmIHRoZSBmaXJzdCBpbnNucyBpbgoJ
IHRoZSBsb29wIHRlc3QgdGhlIHNhbWUgY29uZGl0aW9uIGFzIHRoZSBsb29wJ3MgYmFja3dhcmQg
anVtcCwgb3IgdGhlCgkgb3Bwb3NpdGUgY29uZGl0aW9uLCB0aGVuIHRoZSBiYWNrd2FyZCBqdW1w
IHdpbGwgYmUgbW9kaWZpZWQgdG8gcG9pbnQKCSB0byBlbHNld2hlcmUsIGFuZCB0aGUgbG9vcCdz
IHN0YXJ0IGxhYmVsIGlzIGRlbGV0ZWQuCgoJIFRoaXMgY2FzZSBjdXJyZW50bHkgY2FuIG5vdCBi
ZSBoYW5kbGVkIGJ5IHRoZSBsb29wIHVucm9sbGluZyBjb2RlLiAgKi8KCiAgICAgIGlmIChsb29w
X2R1bXBfc3RyZWFtKQoJZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgIlVucm9sbGluZyBm
YWlsdXJlOiB1bmtub3duIGluc25zIGJldHdlZW4gQkVHIG5vdGUgYW5kIGxvb3AgbGFiZWwuXG4i
KTsKICAgICAgcmV0dXJuOwogICAgfQogIGlmIChMQUJFTF9OQU1FIChzdGFydF9sYWJlbCkpCiAg
ICB7CiAgICAgIC8qIFRoZSBqdW1wIG9wdGltaXphdGlvbiBwYXNzIG11c3QgaGF2ZSBjb21iaW5l
ZCB0aGUgb3JpZ2luYWwgc3RhcnQgbGFiZWwKCSB3aXRoIGEgbmFtZWQgbGFiZWwgZm9yIGEgZ290
by4gIFdlIGNhbid0IHVucm9sbCB0aGlzIGNhc2UgYmVjYXVzZQoJIGp1bXBzIHdoaWNoIGdvIHRv
IHRoZSBuYW1lZCBsYWJlbCBtdXN0IGJlIGhhbmRsZWQgZGlmZmVyZW50bHkgdGhhbgoJIGp1bXBz
IHRvIHRoZSBsb29wIHN0YXJ0LCBhbmQgaXQgaXMgaW1wb3NzaWJsZSB0byBkaWZmZXJlbnRpYXRl
IHRoZW0KCSBpbiB0aGlzIGNhc2UuICAqLwogICAgICBpZiAobG9vcF9kdW1wX3N0cmVhbSkKCWZw
cmludGYgKGxvb3BfZHVtcF9zdHJlYW0sCgkJICJVbnJvbGxpbmcgZmFpbHVyZTogbG9vcCBzdGFy
dCBsYWJlbCBpcyBnb25lXG4iKTsKICAgICAgcmV0dXJuOwogICAgfQoKICBpZiAodW5yb2xsX3R5
cGUgPT0gVU5ST0xMX05BSVZFCiAgICAgICYmIEdFVF9DT0RFIChsYXN0X2xvb3BfaW5zbikgPT0g
QkFSUklFUgogICAgICAmJiBzdGFydF9sYWJlbCAhPSBKVU1QX0xBQkVMIChQUkVWX0lOU04gKGxh
c3RfbG9vcF9pbnNuKSkpCiAgICB7CiAgICAgIC8qIEluIHRoaXMgY2FzZSwgd2UgbXVzdCBjb3B5
IHRoZSBqdW1wIGFuZCBiYXJyaWVyLCBiZWNhdXNlIHRoZXkgd2lsbAoJIG5vdCBiZSBjb252ZXJ0
ZWQgdG8ganVtcHMgdG8gYW4gaW1tZWRpYXRlbHkgZm9sbG93aW5nIGxhYmVsLiAgKi8KCiAgICAg
IGluc2VydF9iZWZvcmUgPSBORVhUX0lOU04gKGxhc3RfbG9vcF9pbnNuKTsKICAgICAgY29weV9l
bmQgPSBsYXN0X2xvb3BfaW5zbjsKICAgIH0KCiAgaWYgKHVucm9sbF90eXBlID09IFVOUk9MTF9O
QUlWRQogICAgICAmJiBHRVRfQ09ERSAobGFzdF9sb29wX2luc24pID09IEpVTVBfSU5TTgogICAg
ICAmJiBzdGFydF9sYWJlbCAhPSBKVU1QX0xBQkVMIChsYXN0X2xvb3BfaW5zbikpCiAgICB7CiAg
ICAgIC8qID8/PyBUaGUgbG9vcCBlbmRzIHdpdGggYSBjb25kaXRpb25hbCBicmFuY2ggdGhhdCBk
b2VzIG5vdCBicmFuY2ggYmFjawoJIHRvIHRoZSBsb29wIHN0YXJ0IGxhYmVsLiAgSW4gdGhpcyBj
YXNlLCB3ZSBtdXN0IGVtaXQgYW4gdW5jb25kaXRpb25hbAoJIGJyYW5jaCB0byB0aGUgbG9vcCBl
eGl0IGFmdGVyIGVtaXR0aW5nIHRoZSBmaW5hbCBicmFuY2guCgkgY29weV9sb29wX2JvZHkgZG9l
cyBub3QgaGF2ZSBzdXBwb3J0IGZvciB0aGlzIGN1cnJlbnRseSwgc28gd2UKCSBnaXZlIHVwLiAg
SXQgZG9lc24ndCBzZWVtIHdvcnRod2hpbGUgdG8gdW5yb2xsIGFueXdheXMgc2luY2UKCSB1bnJv
bGxpbmcgd291bGQgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBicmFuY2ggaW5zdHJ1Y3Rpb25zCgkg
ZXhlY3V0ZWQuICAqLwogICAgICBpZiAobG9vcF9kdW1wX3N0cmVhbSkKCWZwcmludGYgKGxvb3Bf
ZHVtcF9zdHJlYW0sCgkJICJVbnJvbGxpbmcgZmFpbHVyZTogZmluYWwgY29uZGl0aW9uYWwgYnJh
bmNoIG5vdCB0byBsb29wIHN0YXJ0XG4iKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAvKiBBbGxv
Y2F0ZSBhIHRyYW5zbGF0aW9uIHRhYmxlIGZvciB0aGUgbGFiZWxzIGFuZCBpbnNuIG51bWJlcnMu
CiAgICAgVGhleSB3aWxsIGJlIGZpbGxlZCBpbiBhcyB3ZSBjb3B5IHRoZSBpbnNucyBpbiB0aGUg
bG9vcC4gICovCgogIG1heF9sYWJlbG5vID0gbWF4X2xhYmVsX251bSAoKTsKICBtYXhfaW5zbm5v
ID0gZ2V0X21heF91aWQgKCk7CgogIG1hcCA9IChzdHJ1Y3QgaW5saW5lX3JlbWFwICopIGFsbG9j
YSAoc2l6ZW9mIChzdHJ1Y3QgaW5saW5lX3JlbWFwKSk7CgogIG1hcC0+aW50ZWdyYXRpbmcgPSAw
OwogIG1hcC0+Y29uc3RfZXF1aXZfdmFycmF5ID0gMDsKCiAgLyogQWxsb2NhdGUgdGhlIGxhYmVs
IG1hcC4gICovCgogIGlmIChtYXhfbGFiZWxubyA+IDApCiAgICB7CiAgICAgIG1hcC0+bGFiZWxf
bWFwID0gKHJ0eCAqKSBhbGxvY2EgKG1heF9sYWJlbG5vICogc2l6ZW9mIChydHgpKTsKCiAgICAg
IGxvY2FsX2xhYmVsID0gKGNoYXIgKikgYWxsb2NhIChtYXhfbGFiZWxubyk7CiAgICAgIGJ6ZXJv
IChsb2NhbF9sYWJlbCwgbWF4X2xhYmVsbm8pOwogICAgfQogIGVsc2UKICAgIG1hcC0+bGFiZWxf
bWFwID0gMDsKCiAgLyogU2VhcmNoIHRoZSBsb29wIGFuZCBtYXJrIGFsbCBsb2NhbCBsYWJlbHMs
IGkuZS4gdGhlIG9uZXMgd2hpY2ggaGF2ZSB0bwogICAgIGJlIGRpc3RpbmN0IGxhYmVscyB3aGVu
IGNvcGllZC4gIEZvciBhbGwgbGFiZWxzIHdoaWNoIG1pZ2h0IGJlCiAgICAgbm9uLWxvY2FsLCBz
ZXQgdGhlaXIgbGFiZWxfbWFwIGVudHJpZXMgdG8gcG9pbnQgdG8gdGhlbXNlbHZlcy4KICAgICBJ
ZiB0aGV5IGhhcHBlbiB0byBiZSBsb2NhbCB0aGVpciBsYWJlbF9tYXAgZW50cmllcyB3aWxsIGJl
IG92ZXJ3cml0dGVuCiAgICAgYmVmb3JlIHRoZSBsb29wIGJvZHkgaXMgY29waWVkLiAgVGhlIGxh
YmVsX21hcCBlbnRyaWVzIGZvciBsb2NhbCBsYWJlbHMKICAgICB3aWxsIGJlIHNldCB0byBhIGRp
ZmZlcmVudCB2YWx1ZSBlYWNoIHRpbWUgdGhlIGxvb3AgYm9keSBpcyBjb3BpZWQuICAqLwoKICBm
b3IgKGluc24gPSBjb3B5X3N0YXJ0OyBpbnNuICE9IGxvb3BfZW5kOyBpbnNuID0gTkVYVF9JTlNO
IChpbnNuKSkKICAgIHsKICAgICAgcnR4IG5vdGU7CgogICAgICBpZiAoR0VUX0NPREUgKGluc24p
ID09IENPREVfTEFCRUwpCglsb2NhbF9sYWJlbFtDT0RFX0xBQkVMX05VTUJFUiAoaW5zbildID0g
MTsKICAgICAgZWxzZSBpZiAoR0VUX0NPREUgKGluc24pID09IEpVTVBfSU5TTikKCXsKCSAgaWYg
KEpVTVBfTEFCRUwgKGluc24pKQoJICAgIHNldF9sYWJlbF9pbl9tYXAgKG1hcCwKCQkJICAgICAg
Q09ERV9MQUJFTF9OVU1CRVIgKEpVTVBfTEFCRUwgKGluc24pKSwKCQkJICAgICAgSlVNUF9MQUJF
TCAoaW5zbikpOwoJICBlbHNlIGlmIChHRVRfQ09ERSAoUEFUVEVSTiAoaW5zbikpID09IEFERFJf
VkVDCgkJICAgfHwgR0VUX0NPREUgKFBBVFRFUk4gKGluc24pKSA9PSBBRERSX0RJRkZfVkVDKQoJ
ICAgIHsKCSAgICAgIHJ0eCBwYXQgPSBQQVRURVJOIChpbnNuKTsKCSAgICAgIGludCBkaWZmX3Zl
Y19wID0gR0VUX0NPREUgKFBBVFRFUk4gKGluc24pKSA9PSBBRERSX0RJRkZfVkVDOwoJICAgICAg
aW50IGxlbiA9IFhWRUNMRU4gKHBhdCwgZGlmZl92ZWNfcCk7CgkgICAgICBydHggbGFiZWw7CgoJ
ICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQoJCXsKCQkgIGxhYmVsID0gWEVYUCAoWFZF
Q0VYUCAocGF0LCBkaWZmX3ZlY19wLCBpKSwgMCk7CgkJICBzZXRfbGFiZWxfaW5fbWFwIChtYXAs
CgkJCQkgICAgQ09ERV9MQUJFTF9OVU1CRVIgKGxhYmVsKSwKCQkJCSAgICBsYWJlbCk7CgkJfQoJ
ICAgIH0KCX0KICAgICAgZWxzZSBpZiAoKG5vdGUgPSBmaW5kX3JlZ19ub3RlIChpbnNuLCBSRUdf
TEFCRUwsIE5VTExfUlRYKSkpCglzZXRfbGFiZWxfaW5fbWFwIChtYXAsIENPREVfTEFCRUxfTlVN
QkVSIChYRVhQIChub3RlLCAwKSksCgkJCSAgWEVYUCAobm90ZSwgMCkpOwogICAgfQoKICAvKiBB
bGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGluc24gbWFwLiAgKi8KCiAgbWFwLT5pbnNuX21hcCA9IChy
dHggKikgYWxsb2NhIChtYXhfaW5zbm5vICogc2l6ZW9mIChydHgpKTsKCiAgLyogU2V0IHRoaXMg
dG8gemVybywgdG8gaW5kaWNhdGUgdGhhdCB3ZSBhcmUgZG9pbmcgbG9vcCB1bnJvbGxpbmcsCiAg
ICAgbm90IGZ1bmN0aW9uIGlubGluaW5nLiAgKi8KICBtYXAtPmlubGluZV90YXJnZXQgPSAwOwoK
ICAvKiBUaGUgcmVnaXN0ZXIgYW5kIGNvbnN0YW50IG1hcHMgZGVwZW5kIG9uIHRoZSBudW1iZXIg
b2YgcmVnaXN0ZXJzCiAgICAgcHJlc2VudCwgc28gdGhlIGZpbmFsIG1hcHMgY2FuJ3QgYmUgY3Jl
YXRlZCB1bnRpbCBhZnRlcgogICAgIGZpbmRfc3BsaXR0YWJsZV9yZWdzIGlzIGNhbGxlZC4gIEhv
d2V2ZXIsIHRoZXkgYXJlIG5lZWRlZCBmb3IKICAgICBwcmVjb25kaXRpb25pbmcsIHNvIHdlIGNy
ZWF0ZSB0ZW1wb3JhcnkgbWFwcyB3aGVuIHByZWNvbmRpdGlvbmluZwogICAgIGlzIHBlcmZvcm1l
ZC4gICovCgogIC8qIFRoZSBwcmVjb25kaXRpb25pbmcgY29kZSBtYXkgYWxsb2NhdGUgdHdvIG5l
dyBwc2V1ZG8gcmVnaXN0ZXJzLiAgKi8KICBtYXhyZWdudW0gPSBtYXhfcmVnX251bSAoKTsKCiAg
LyogbG9jYWxfcmVnbm8gaXMgb25seSB2YWxpZCBmb3IgcmVnbm9zIDwgbWF4X2xvY2FsX3JlZ251
bS4gICovCiAgbWF4X2xvY2FsX3JlZ251bSA9IG1heHJlZ251bTsKCiAgLyogQWxsb2NhdGUgYW5k
IHplcm8gb3V0IHRoZSBzcGxpdHRhYmxlX3JlZ3MgYW5kIGFkZHJfY29tYmluZWRfcmVncwogICAg
IGFycmF5cy4gIFRoZXNlIG11c3QgYmUgemVyb2VkIGhlcmUgYmVjYXVzZSB0aGV5IHdpbGwgYmUg
dXNlZCBpZgogICAgIGxvb3AgcHJlY29uZGl0aW9uaW5nIGlzIHBlcmZvcm1lZCwgYW5kIG11c3Qg
YmUgemVybyBmb3IgdGhhdCBjYXNlLgoKICAgICBJdCBpcyBzYWZlIHRvIGRvIHRoaXMgaGVyZSwg
c2luY2UgdGhlIGV4dHJhIHJlZ2lzdGVycyBjcmVhdGVkIGJ5IHRoZQogICAgIHByZWNvbmRpdGlv
bmluZyBjb2RlIGFuZCBmaW5kX3NwbGl0dGFibGVfcmVncyB3aWxsIG5ldmVyIGJlIHVzZWQKICAg
ICB0byBhY2Nlc3MgdGhlIHNwbGl0dGFibGVfcmVnc1tdIGFuZCBhZGRyX2NvbWJpbmVkX3JlZ3Nb
XSBhcnJheXMuICAqLwoKICBzcGxpdHRhYmxlX3JlZ3MgPSAocnR4ICopIGFsbG9jYSAobWF4cmVn
bnVtICogc2l6ZW9mIChydHgpKTsKICBiemVybyAoKGNoYXIgKikgc3BsaXR0YWJsZV9yZWdzLCBt
YXhyZWdudW0gKiBzaXplb2YgKHJ0eCkpOwogIGRlcml2ZWRfcmVncyA9IGFsbG9jYSAobWF4cmVn
bnVtKTsKICBiemVybyAoZGVyaXZlZF9yZWdzLCBtYXhyZWdudW0pOwogIHNwbGl0dGFibGVfcmVn
c191cGRhdGVzID0gKGludCAqKSBhbGxvY2EgKG1heHJlZ251bSAqIHNpemVvZiAoaW50KSk7CiAg
Ynplcm8gKChjaGFyICopIHNwbGl0dGFibGVfcmVnc191cGRhdGVzLCBtYXhyZWdudW0gKiBzaXpl
b2YgKGludCkpOwogIGFkZHJfY29tYmluZWRfcmVncwogICAgPSAoc3RydWN0IGluZHVjdGlvbiAq
KikgYWxsb2NhIChtYXhyZWdudW0gKiBzaXplb2YgKHN0cnVjdCBpbmR1Y3Rpb24gKikpOwogIGJ6
ZXJvICgoY2hhciAqKSBhZGRyX2NvbWJpbmVkX3JlZ3MsIG1heHJlZ251bSAqIHNpemVvZiAoc3Ry
dWN0IGluZHVjdGlvbiAqKSk7CiAgbG9jYWxfcmVnbm8gPSAoY2hhciAqKSBhbGxvY2EgKG1heHJl
Z251bSk7CiAgYnplcm8gKGxvY2FsX3JlZ25vLCBtYXhyZWdudW0pOwoKICAvKiBNYXJrIGFsbCBs
b2NhbCByZWdpc3RlcnMsIGkuZS4gdGhlIG9uZXMgd2hpY2ggYXJlIHJlZmVyZW5jZWQgb25seQog
ICAgIGluc2lkZSB0aGUgbG9vcC4gICovCiAgLyogIGlmIChJTlNOX1VJRCAoY29weV9lbmQpIDwg
bWF4X3VpZF9mb3JfbG9vcCkgKi8gLyogR0EgKi8KICB7CiAgICBydHggc2Nhbl9zdGFydCwgc2Nh
bl9lbmQ7CiAgICAvKiBJZiBjb3B5X3N0YXJ0IHBvaW50cyB0byB0aGUgTk9URSB0aGF0IHN0YXJ0
cyB0aGUgbG9vcCwgdGhlbiB3ZSBtdXN0CiAgICAgICB1c2UgdGhlIG5leHQgbHVpZCwgYmVjYXVz
ZSBpbnZhcmlhbnQgcHNldWRvLXJlZ3MgbW92ZWQgb3V0IG9mIHRoZSBsb29wCiAgICAgICBoYXZl
IHRoZWlyIGxpZmV0aW1lcyBtb2RpZmllZCB0byBzdGFydCBoZXJlLCBidXQgdGhleSBhcmUgbm90
IHNhZmUKICAgICAgIHRvIGR1cGxpY2F0ZS4gICovCiAgICBzY2FuX3N0YXJ0ID0gY29weV9zdGFy
dDsKICAgIGlmIChjb3B5X3N0YXJ0PT1sb29wX3N0YXJ0KSBzY2FuX3N0YXJ0ID0gTkVYVF9JTlNO
KHNjYW5fc3RhcnQpOwoKICAgIHNjYW5fZW5kID0gY29weV9lbmQ7CiAgICAvKiBJZiBhIHJlZ2lz
dGVyIGlzIHVzZWQgaW4gdGhlIGp1bXAgaW5zbiwgd2UgbXVzdCBub3QgZHVwbGljYXRlIGl0CiAg
ICAgICBzaW5jZSBpdCB3aWxsIGFsc28gYmUgdXNlZCBvdXRzaWRlIHRoZSBsb29wLiAgKi8KICAg
IGlmIChHRVRfQ09ERSAoc2Nhbl9lbmQpID09IEpVTVBfSU5TTikgc2Nhbl9lbmQgPSBQUkVWX0lO
U04oc2Nhbl9lbmQpOwoKICAgIC8qIElmIHdlIGhhdmUgYSB0YXJnZXQgdGhhdCB1c2VzIGNjMCwg
dGhlbiB3ZSBhbHNvIG11c3Qgbm90IGR1cGxpY2F0ZQogICAgICAgdGhlIGluc24gdGhhdCBzZXRz
IGNjMCBiZWZvcmUgdGhlIGp1bXAgaW5zbi4gICovCiNpZmRlZiBIQVZFX2NjMAogICAgaWYgKEdF
VF9DT0RFIChzY2FuX2VuZCkgPT0gSlVNUF9JTlNOKSBzY2FuX2VuZCA9IFBSRVZfSU5TTihzY2Fu
X2VuZCk7CiNlbmRpZgoKICAgIC8qIElmIGEgcHNldWRvJ3MgbGlmZXRpbWUgaXMgZW50aXJlbHkg
Y29udGFpbmVkIHdpdGhpbiB0aGlzIGxvb3AsIHRoZW4gd2UKICAgICAgIGNhbiB1c2UgYSBkaWZm
ZXJlbnQgcHNldWRvIGluIGVhY2ggdW5yb2xsZWQgY29weSBvZiB0aGUgbG9vcC4gIFRoaXMKICAg
ICAgIHJlc3VsdHMgaW4gYmV0dGVyIGNvZGUuICAqLwogICAgLyogV2UgbXVzdCBsaW1pdCB0aGUg
Z2VuZXJpYyB0ZXN0IHRvIG1heF9yZWdfYmVmb3JlX2xvb3AsIGJlY2F1c2Ugb25seQogICAgICAg
dGhlc2UgcHNldWRvIHJlZ2lzdGVycyBoYXZlIHZhbGlkIHJlZ25vX2ZpcnN0X3VpZCBpbmZvLiAg
Ki8KICAgIGZvciAoaiA9IEZJUlNUX1BTRVVET19SRUdJU1RFUjsgaiA8IG1heF9yZWdfYmVmb3Jl
X2xvb3A7ICsraikKICAgICAgewoJLyogd2UgbmVlZCB0byBwcm92ZSB0aGF0IFJFR05PX0ZJUlNU
X1VJRChqKSBhbmQgUkVHTk9fTEFTVF9VSUQoaikKCSAgIGFyZSBib3RoIGJldHdlZW4gY29weV9z
dGFydCBhbmQgY29weV9lbmQgKi8KCWludCBsZmxhZyA9IDAsIC8qIGxmbGFnID0gMSBtZWFucyBS
RUdOT19MQVNUX1VJRChqKSBmb3VuZCAqLwoJICBmZmxhZyA9IDA7ICAgLyogZmZsYWcgPSAxIG1l
YW5zIFJFR05PX0ZJUlNUX1VJRChqKSBmb3VuZCAqLwoJcnR4IHg7Cglmb3IgKHggPSBzY2FuX3N0
YXJ0OyB4OyB4ID0gTkVYVF9JTlNOKHgpKQoJICB7CgkgICAgaWYgKElOU05fVUlEKHgpID09IFJF
R05PX0ZJUlNUX1VJRChqKSkgZmZsYWcgPSAxOwoJICAgIGlmIChJTlNOX1VJRCh4KSA9PSBSRUdO
T19MQVNUX1VJRChqKSkgbGZsYWcgPSAxOwoJICAgIGlmICh4ID09IHNjYW5fZW5kIHx8IChmZmxh
ZyYmbGZsYWcpKSBicmVhazsKCSAgfQoKCWlmIChsb29wX2R1bXBfc3RyZWFtKQoJICB7CgkgICAg
ZnByaW50Zihsb29wX2R1bXBfc3RyZWFtLCAicmVnICVkOiAlZCAlZFxuIiwgaiwgZmZsYWcsIGxm
bGFnKTsKCSAgfQoKCWlmIChmZmxhZyAmJiBsZmxhZykKCSAgewoJICAgIC8qIEhvd2V2ZXIsIHdl
IG11c3QgYWxzbyBjaGVjayBmb3IgbG9vcC1jYXJyaWVkIGRlcGVuZGVuY2llcy4KCSAgICAgICBJ
ZiB0aGUgdmFsdWUgdGhlIHBzZXVkbyBoYXMgYXQgdGhlIGVuZCBvZiBpdGVyYXRpb24gWCBpcwoJ
ICAgICAgIHVzZWQgYnkgaXRlcmF0aW9uIFgrMSwgdGhlbiB3ZSBjYW4gbm90IHVzZSBhIGRpZmZl
cmVudCBwc2V1ZG8KCSAgICAgICBmb3IgZWFjaCB1bnJvbGxlZCBjb3B5IG9mIHRoZSBsb29wLiAg
Ki8KCSAgICAvKiBBIHBzZXVkbyBpcyBzYWZlIGlmIHJlZ25vX2ZpcnN0X3VpZCBpcyBhIHNldCwg
YW5kIHRoaXMKCSAgICAgICBzZXQgZG9taW5hdGVzIGFsbCBpbnN0cnVjdGlvbnMgZnJvbSByZWdu
b19maXJzdF91aWQgdG8KCSAgICAgICByZWdub19sYXN0X3VpZC4gICovCgkgICAgLyogPz8/IFRo
aXMgY2hlY2sgaXMgc2ltcGxpc3RpYy4gIFdlIHdvdWxkIGdldCBiZXR0ZXIgY29kZSBpZgoJICAg
ICAgIHRoaXMgY2hlY2sgd2FzIG1vcmUgc29waGlzdGljYXRlZC4gICovCgkgICAgaWYgKHNldF9k
b21pbmF0ZXNfdXNlIChqLCBSRUdOT19GSVJTVF9VSUQgKGopLCBSRUdOT19MQVNUX1VJRCAoaiks
CgkJCQkgICBjb3B5X3N0YXJ0LCBjb3B5X2VuZCkpCgkgICAgICBsb2NhbF9yZWdub1tqXSA9IDE7
CgkgICAgCgkgICAgaWYgKGxvb3BfZHVtcF9zdHJlYW0pCgkgICAgICB7CgkJaWYgKGxvY2FsX3Jl
Z25vW2pdKQoJCSAgZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwgIk1hcmtlZCByZWcgJWQgYXMg
bG9jYWxcbiIsIGopOwoJCWVsc2UKCQkgIGZwcmludGYgKGxvb3BfZHVtcF9zdHJlYW0sICJEaWQg
bm90IG1hcmsgcmVnICVkIGFzIGxvY2FsXG4iLAoJCQkgICBqKTsKCSAgICAgIH0KCSAgfQogICAg
ICB9CiAgICAvKiBHaXZzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQgZnJvbSBtdWx0aXBsZSBiaXYg
aW5jcmVtZW50cyBhbHdheXMgaGF2ZQogICAgICAgbG9jYWwgcmVnaXN0ZXJzLiAgKi8KICAgIGZv
ciAoaiA9IGZpcnN0X2luY3JlbWVudF9naXY7IGogPD0gbGFzdF9pbmNyZW1lbnRfZ2l2OyBqKysp
CiAgICAgIHsKCWxvY2FsX3JlZ25vW2pdID0gMTsKCWlmIChsb29wX2R1bXBfc3RyZWFtKQoJICBm
cHJpbnRmIChsb29wX2R1bXBfc3RyZWFtLCAiTWFya2VkIHJlZyAlZCBhcyBsb2NhbFxuIiwgaik7
CiAgICAgIH0KICB9CgogIC8qIElmIHRoaXMgbG9vcCByZXF1aXJlcyBleGl0IHRlc3RzIHdoZW4g
dW5yb2xsZWQsIGNoZWNrIHRvIHNlZSBpZiB3ZQogICAgIGNhbiBwcmVjb25kaXRpb24gdGhlIGxv
b3Agc28gYXMgdG8gbWFrZSB0aGUgZXhpdCB0ZXN0cyB1bm5lY2Vzc2FyeS4KICAgICBKdXN0IGxp
a2UgdmFyaWFibGUgc3BsaXR0aW5nLCB0aGlzIGlzIG5vdCBzYWZlIGlmIHRoZSBsb29wIGlzIGVu
dGVyZWQKICAgICB2aWEgYSBqdW1wIHRvIHRoZSBib3R0b20uICBBbHNvLCBjYW4gbm90IGRvIHRo
aXMgaWYgbm8gc3RyZW5ndGgKICAgICByZWR1Y2UgaW5mbywgYmVjYXVzZSBwcmVjb25kaXRpb25f
bG9vcF9wIHVzZXMgdGhpcyBpbmZvLiAgKi8KCiAgLyogTXVzdCBjb3B5IHRoZSBsb29wIGJvZHkg
Zm9yIHByZWNvbmRpdGlvbmluZyBiZWZvcmUgdGhlIGZvbGxvd2luZwogICAgIGZpbmRfc3BsaXR0
YWJsZV9yZWdzIGNhbGwgc2luY2UgdGhhdCB3aWxsIGVtaXQgaW5zbnMgd2hpY2ggbmVlZCB0bwog
ICAgIGJlIGFmdGVyIHRoZSBwcmVjb25kaXRpb25lZCBsb29wIGNvcGllcywgYnV0IGltbWVkaWF0
ZWx5IGJlZm9yZSB0aGUKICAgICB1bnJvbGxlZCBsb29wIGNvcGllcy4gICovCgogIC8qIEFsc28s
IGl0IGlzIG5vdCBzYWZlIHRvIHNwbGl0IGluZHVjdGlvbiB2YXJpYWJsZXMgZm9yIHRoZSBwcmVj
b25kaXRpb25lZAogICAgIGNvcGllcyBvZiB0aGUgbG9vcCBib2R5LiAgSWYgd2Ugc3BsaXQgaW5k
dWN0aW9uIHZhcmlhYmxlcywgdGhlbiB0aGUgY29kZQogICAgIGFzc3VtZXMgdGhhdCBlYWNoIGlu
ZHVjdGlvbiB2YXJpYWJsZSBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBmdW5jdGlvbgogICAgIG9m
IGl0cyBpbml0aWFsIHZhbHVlIGFuZCB0aGUgbG9vcCBpdGVyYXRpb24gbnVtYmVyLiAgVGhpcyBp
cyBub3QgdHJ1ZQogICAgIGluIHRoaXMgY2FzZSwgYmVjYXVzZSB0aGUgbGFzdCBwcmVjb25kaXRp
b25lZCBjb3B5IG9mIHRoZSBsb29wIGJvZHkKICAgICBjb3VsZCBiZSBhbnkgaXRlcmF0aW9uIGZy
b20gdGhlIGZpcnN0IHVwIHRvIHRoZSBgdW5yb2xsX251bWJlci0xJ3RoLAogICAgIGRlcGVuZGlu
ZyBvbiB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgaXRlcmF0aW9uIHZhcmlhYmxlLiAgVGhlcmVm
b3JlCiAgICAgd2UgY2FuIG5vdCBzcGxpdCBpbmR1Y3Rpb24gdmFyaWFibGVzIGhlcmUsIGJlY2F1
c2Ugd2UgY2FuIG5vdCBjYWxjdWxhdGUKICAgICB0aGVpciB2YWx1ZS4gIEhlbmNlLCB0aGlzIGNv
ZGUgbXVzdCBvY2N1ciBiZWZvcmUgZmluZF9zcGxpdHRhYmxlX3JlZ3MKICAgICBpcyBjYWxsZWQu
ICAqLwoKICBpZiAodW5yb2xsX3R5cGUgPT0gVU5ST0xMX05BSVZFICYmICEgc3BsaXR0aW5nX25v
dF9zYWZlICYmIHN0cmVuZ3RoX3JlZHVjZV9wKQogICAgewogICAgICBydHggaW5pdGlhbF92YWx1
ZSwgZmluYWxfdmFsdWUsIGluY3JlbWVudDsKICAgICAgZW51bSBtYWNoaW5lX21vZGUgbW9kZTsK
CiAgICAgIGlmIChwcmVjb25kaXRpb25fbG9vcF9wIChsb29wX3N0YXJ0LCBsb29wX2luZm8sCgkJ
CSAgICAgICAmaW5pdGlhbF92YWx1ZSwgJmZpbmFsX3ZhbHVlLCAmaW5jcmVtZW50LAoJCQkgICAg
ICAgJm1vZGUpKQoJewoJICByZWdpc3RlciBydHggZGlmZiA7CgkgIHJ0eCAqbGFiZWxzOwoJICBp
bnQgYWJzX2luYywgbmVnX2luYzsKCgkgIG1hcC0+cmVnX21hcCA9IChydHggKikgYWxsb2NhICht
YXhyZWdudW0gKiBzaXplb2YgKHJ0eCkpOwoKCSAgVkFSUkFZX0NPTlNUX0VRVUlWX0lOSVQgKG1h
cC0+Y29uc3RfZXF1aXZfdmFycmF5LCBtYXhyZWdudW0sCgkJCQkgICAidW5yb2xsX2xvb3AiKTsK
CSAgZ2xvYmFsX2NvbnN0X2VxdWl2X3ZhcnJheSA9IG1hcC0+Y29uc3RfZXF1aXZfdmFycmF5OwoK
CSAgaW5pdF9yZWdfbWFwIChtYXAsIG1heHJlZ251bSk7CgoJICAvKiBMaW1pdCBsb29wIHVucm9s
bGluZyB0byA0LCBzaW5jZSB0aGlzIHdpbGwgbWFrZSA3IGNvcGllcyBvZgoJICAgICB0aGUgbG9v
cCBib2R5LiAgKi8KCSAgaWYgKHVucm9sbF9udW1iZXIgPiA0KQoJICAgIHVucm9sbF9udW1iZXIg
PSA0OwoKCSAgLyogU2F2ZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGluY3JlbWVudCwgYW5k
IGFsc28gd2hldGhlciBvcgoJICAgICBub3QgaXQgaXMgbmVnYXRpdmUuICAqLwoJICBuZWdfaW5j
ID0gMDsKCSAgYWJzX2luYyA9IElOVFZBTCAoaW5jcmVtZW50KTsKCSAgaWYgKGFic19pbmMgPCAw
KQoJICAgIHsKCSAgICAgIGFic19pbmMgPSAtIGFic19pbmM7CgkgICAgICBuZWdfaW5jID0gMTsK
CSAgICB9CgoJICBzdGFydF9zZXF1ZW5jZSAoKTsKCgkgIC8qIENhbGN1bGF0ZSB0aGUgZGlmZmVy
ZW5jZSBiZXR3ZWVuIHRoZSBmaW5hbCBhbmQgaW5pdGlhbCB2YWx1ZXMuCgkgICAgIEZpbmFsIHZh
bHVlIG1heSBiZSBhIChwbHVzIChyZWcgeCkgKGNvbnN0X2ludCAxKSkgcnR4LgoJICAgICBMZXQg
dGhlIGZvbGxvd2luZyBjc2UgcGFzcyBzaW1wbGlmeSB0aGlzIGlmIGluaXRpYWwgdmFsdWUgaXMK
CSAgICAgYSBjb25zdGFudC4KCgkgICAgIFdlIG11c3QgY29weSB0aGUgZmluYWwgYW5kIGluaXRp
YWwgdmFsdWVzIGhlcmUgdG8gYXZvaWQKCSAgICAgaW1wcm9wZXJseSBzaGFyZWQgcnRsLiAgKi8K
CgkgIGRpZmYgPSBleHBhbmRfYmlub3AgKG1vZGUsIHN1Yl9vcHRhYiwgY29weV9ydHggKGZpbmFs
X3ZhbHVlKSwKCQkJICAgICAgIGNvcHlfcnR4IChpbml0aWFsX3ZhbHVlKSwgTlVMTF9SVFgsIDAs
CgkJCSAgICAgICBPUFRBQl9MSUJfV0lERU4pOwoKCSAgLyogTm93IGNhbGN1bGF0ZSAoZGlmZiAl
ICh1bnJvbGwgKiBhYnMgKGluY3JlbWVudCkpKSBieSB1c2luZyBhbgoJICAgICBhbmQgaW5zdHJ1
Y3Rpb24uICAqLwoJICBkaWZmID0gZXhwYW5kX2Jpbm9wIChHRVRfTU9ERSAoZGlmZiksIGFuZF9v
cHRhYiwgZGlmZiwKCQkJICAgICAgIEdFTl9JTlQgKHVucm9sbF9udW1iZXIgKiBhYnNfaW5jIC0g
MSksCgkJCSAgICAgICBOVUxMX1JUWCwgMCwgT1BUQUJfTElCX1dJREVOKTsKCgkgIC8qIE5vdyBl
bWl0IGEgc2VxdWVuY2Ugb2YgYnJhbmNoZXMgdG8ganVtcCB0byB0aGUgcHJvcGVyIHByZWNvbmQK
CSAgICAgbG9vcCBlbnRyeSBwb2ludC4gICovCgoJICBsYWJlbHMgPSAocnR4ICopIGFsbG9jYSAo
c2l6ZW9mIChydHgpICogdW5yb2xsX251bWJlcik7CgkgIGZvciAoaSA9IDA7IGkgPCB1bnJvbGxf
bnVtYmVyOyBpKyspCgkgICAgbGFiZWxzW2ldID0gZ2VuX2xhYmVsX3J0eCAoKTsKCgkgIC8qIENo
ZWNrIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgaW5pdGlhbCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4g
b3IKCSAgICAgZXF1YWwgdG8gdGhlIGZpbmFsIHZhbHVlLiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50
IHRvIGV4ZWN1dGUKCSAgICAgZXhhY3RseSBvbmUgbG9vcCBpdGVyYXRpb24uICBUaGUgY29kZSBi
ZWxvdyB3aWxsIGZhaWwgZm9yIHRoaXMKCSAgICAgY2FzZS4gIFRoaXMgY2hlY2sgZG9lcyBub3Qg
YXBwbHkgaWYgdGhlIGxvb3AgaGFzIGEgTkUKCSAgICAgY29tcGFyaXNvbiBhdCB0aGUgZW5kLiAg
Ki8KCgkgIGlmIChsb29wX2luZm8tPmNvbXBhcmlzb25fY29kZSAhPSBORSkKCSAgICB7CgkgICAg
ICBlbWl0X2NtcF9hbmRfanVtcF9pbnNucyAoaW5pdGlhbF92YWx1ZSwgZmluYWxfdmFsdWUsCgkJ
CQkgICAgICAgbmVnX2luYyA/IExFIDogR0UsCgkJCQkgICAgICAgTlVMTF9SVFgsIG1vZGUsIDAs
IDAsIGxhYmVsc1sxXSk7CgkgICAgICBKVU1QX0xBQkVMIChnZXRfbGFzdF9pbnNuICgpKSA9IGxh
YmVsc1sxXTsKCSAgICAgIExBQkVMX05VU0VTIChsYWJlbHNbMV0pKys7CgkgICAgfQoKCSAgLyog
QXNzdW1pbmcgdGhlIHVucm9sbF9udW1iZXIgaXMgNCwgYW5kIHRoZSBpbmNyZW1lbnQgaXMgMiwg
dGhlbgoJICAgICBmb3IgYSBuZWdhdGl2ZSBpbmNyZW1lbnQ6CWZvciBhIHBvc2l0aXZlIGluY3Jl
bWVudDoKCSAgICAgZGlmZiA9IDAsMSAgIHByZWNvbmQgMAlkaWZmID0gMCw3ICAgcHJlY29uZCAw
CgkgICAgIGRpZmYgPSAyLDMgICBwcmVjb25kIDMgICAgIGRpZmYgPSAxLDIgICBwcmVjb25kIDEK
CSAgICAgZGlmZiA9IDQsNSAgIHByZWNvbmQgMiAgICAgZGlmZiA9IDMsNCAgIHByZWNvbmQgMgoJ
ICAgICBkaWZmID0gNiw3ICAgcHJlY29uZCAxICAgICBkaWZmID0gNSw2ICAgcHJlY29uZCAzICAq
LwoKCSAgLyogV2Ugb25seSBuZWVkIHRvIGVtaXQgKHVucm9sbF9udW1iZXIgLSAxKSBicmFuY2hl
cyBoZXJlLCB0aGUKCSAgICAgbGFzdCBjYXNlIGp1c3QgZmFsbHMgdGhyb3VnaCB0byB0aGUgZm9s
bG93aW5nIGNvZGUuICAqLwoKCSAgLyogPz8/IFRoaXMgd291bGQgZ2l2ZSBiZXR0ZXIgY29kZSBp
ZiB3ZSBlbWl0dGVkIGEgdHJlZSBvZiBicmFuY2hlcwoJICAgICBpbnN0ZWFkIG9mIHRoZSBjdXJy
ZW50IGxpbmVhciBsaXN0IG9mIGJyYW5jaGVzLiAgKi8KCgkgIGZvciAoaSA9IDA7IGkgPCB1bnJv
bGxfbnVtYmVyIC0gMTsgaSsrKQoJICAgIHsKCSAgICAgIGludCBjbXBfY29uc3Q7CgkgICAgICBl
bnVtIHJ0eF9jb2RlIGNtcF9jb2RlOwoKCSAgICAgIC8qIEZvciBuZWdhdGl2ZSBpbmNyZW1lbnRz
LCBtdXN0IGludmVydCB0aGUgY29uc3RhbnQgY29tcGFyZWQKCQkgYWdhaW5zdCwgZXhjZXB0IHdo
ZW4gY29tcGFyaW5nIGFnYWluc3QgemVyby4gICovCgkgICAgICBpZiAoaSA9PSAwKQoJCXsKCQkg
IGNtcF9jb25zdCA9IDA7CgkJICBjbXBfY29kZSA9IEVROwoJCX0KCSAgICAgIGVsc2UgaWYgKG5l
Z19pbmMpCgkJewoJCSAgY21wX2NvbnN0ID0gdW5yb2xsX251bWJlciAtIGk7CgkJICBjbXBfY29k
ZSA9IEdFOwoJCX0KCSAgICAgIGVsc2UKCQl7CgkJICBjbXBfY29uc3QgPSBpOwoJCSAgY21wX2Nv
ZGUgPSBMRTsKCQl9CgoJICAgICAgZW1pdF9jbXBfYW5kX2p1bXBfaW5zbnMgKGRpZmYsIEdFTl9J
TlQgKGFic19pbmMgKiBjbXBfY29uc3QpLAoJCQkJICAgICAgIGNtcF9jb2RlLCBOVUxMX1JUWCwg
bW9kZSwgMCwgMCwKCQkJCSAgICAgICBsYWJlbHNbaV0pOwoJICAgICAgSlVNUF9MQUJFTCAoZ2V0
X2xhc3RfaW5zbiAoKSkgPSBsYWJlbHNbaV07CgkgICAgICBMQUJFTF9OVVNFUyAobGFiZWxzW2ld
KSsrOwoJICAgIH0KCgkgIC8qIElmIHRoZSBpbmNyZW1lbnQgaXMgZ3JlYXRlciB0aGFuIG9uZSwg
dGhlbiB3ZSBuZWVkIGFub3RoZXIgYnJhbmNoLAoJICAgICB0byBoYW5kbGUgb3RoZXIgY2FzZXMg
ZXF1aXZhbGVudCB0byAwLiAgKi8KCgkgIC8qID8/PyBUaGlzIHNob3VsZCBiZSBtZXJnZWQgaW50
byB0aGUgY29kZSBhYm92ZSBzb21laG93IHRvIGhlbHAKCSAgICAgc2ltcGxpZnkgdGhlIGNvZGUg
aGVyZSwgYW5kIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGJyYW5jaGVzIGVtaXR0ZWQuCgkgICAgIEZv
ciB0aGUgbmVnYXRpdmUgaW5jcmVtZW50IGNhc2UsIHRoZSBicmFuY2ggaGVyZSBjb3VsZCBlYXNp
bHkKCSAgICAgYmUgbWVyZ2VkIHdpdGggdGhlIGAwJyBjYXNlIGJyYW5jaCBhYm92ZS4gIEZvciB0
aGUgcG9zaXRpdmUKCSAgICAgaW5jcmVtZW50IGNhc2UsIGl0IGlzIG5vdCBjbGVhciBob3cgdGhp
cyBjYW4gYmUgc2ltcGxpZmllZC4gICovCgoJICBpZiAoYWJzX2luYyAhPSAxKQoJICAgIHsKCSAg
ICAgIGludCBjbXBfY29uc3Q7CgkgICAgICBlbnVtIHJ0eF9jb2RlIGNtcF9jb2RlOwoKCSAgICAg
IGlmIChuZWdfaW5jKQoJCXsKCQkgIGNtcF9jb25zdCA9IGFic19pbmMgLSAxOwoJCSAgY21wX2Nv
ZGUgPSBMRTsKCQl9CgkgICAgICBlbHNlCgkJewoJCSAgY21wX2NvbnN0ID0gYWJzX2luYyAqICh1
bnJvbGxfbnVtYmVyIC0gMSkgKyAxOwoJCSAgY21wX2NvZGUgPSBHRTsKCQl9CgoJICAgICAgZW1p
dF9jbXBfYW5kX2p1bXBfaW5zbnMgKGRpZmYsIEdFTl9JTlQgKGNtcF9jb25zdCksIGNtcF9jb2Rl
LAoJCQkJICAgICAgIE5VTExfUlRYLCBtb2RlLCAwLCAwLCBsYWJlbHNbMF0pOwoJICAgICAgSlVN
UF9MQUJFTCAoZ2V0X2xhc3RfaW5zbiAoKSkgPSBsYWJlbHNbMF07CgkgICAgICBMQUJFTF9OVVNF
UyAobGFiZWxzWzBdKSsrOwoJICAgIH0KCgkgIHNlcXVlbmNlID0gZ2VuX3NlcXVlbmNlICgpOwoJ
ICBlbmRfc2VxdWVuY2UgKCk7CgkgIGVtaXRfaW5zbl9iZWZvcmUgKHNlcXVlbmNlLCBsb29wX3N0
YXJ0KTsKCgkgIC8qIE9ubHkgdGhlIGxhc3QgY29weSBvZiB0aGUgbG9vcCBib2R5IGhlcmUgbmVl
ZHMgdGhlIGV4aXQKCSAgICAgdGVzdCwgc28gc2V0IGNvcHlfZW5kIHRvIGV4Y2x1ZGUgdGhlIGNv
bXBhcmUvYnJhbmNoIGhlcmUsCgkgICAgIGFuZCB0aGVuIHJlc2V0IGl0IGluc2lkZSB0aGUgbG9v
cCB3aGVuIGdldCB0byB0aGUgbGFzdAoJICAgICBjb3B5LiAgKi8KCgkgIGlmIChHRVRfQ09ERSAo
bGFzdF9sb29wX2luc24pID09IEJBUlJJRVIpCgkgICAgY29weV9lbmQgPSBQUkVWX0lOU04gKFBS
RVZfSU5TTiAobGFzdF9sb29wX2luc24pKTsKCSAgZWxzZSBpZiAoR0VUX0NPREUgKGxhc3RfbG9v
cF9pbnNuKSA9PSBKVU1QX0lOU04pCgkgICAgewojaWZkZWYgSEFWRV9jYzAKCSAgICAgIC8qIFRo
ZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgaW5zbiBpcyBhIGNvbXBhcmUgd2hpY2ggd2UgZG8gbm90
CgkJIHdhbnQgdG8gY29weS4gICovCgkgICAgICBjb3B5X2VuZCA9IFBSRVZfSU5TTiAoUFJFVl9J
TlNOIChsYXN0X2xvb3BfaW5zbikpOwojZWxzZQoJICAgICAgLyogVGhlIGltbWVkaWF0ZWx5IHBy
ZWNlZGluZyBpbnNuIG1heSBub3QgYmUgYSBjb21wYXJlLCBzbyB3ZQoJCSBtdXN0IGNvcHkgaXQu
ICAqLwoJICAgICAgY29weV9lbmQgPSBQUkVWX0lOU04gKGxhc3RfbG9vcF9pbnNuKTsKI2VuZGlm
CgkgICAgfQoJICBlbHNlCgkgICAgYWJvcnQgKCk7CgoJICBmb3IgKGkgPSAxOyBpIDwgdW5yb2xs
X251bWJlcjsgaSsrKQoJICAgIHsKCSAgICAgIGVtaXRfbGFiZWxfYWZ0ZXIgKGxhYmVsc1t1bnJv
bGxfbnVtYmVyIC0gaV0sCgkJCQlQUkVWX0lOU04gKGxvb3Bfc3RhcnQpKTsKCgkgICAgICBiemVy
byAoKGNoYXIgKikgbWFwLT5pbnNuX21hcCwgbWF4X2luc25ubyAqIHNpemVvZiAocnR4KSk7Cgkg
ICAgICBiemVybyAoKGNoYXIgKikgJlZBUlJBWV9DT05TVF9FUVVJViAobWFwLT5jb25zdF9lcXVp
dl92YXJyYXksIDApLAoJCSAgICAgKFZBUlJBWV9TSVpFIChtYXAtPmNvbnN0X2VxdWl2X3ZhcnJh
eSkKCQkgICAgICAqIHNpemVvZiAoc3RydWN0IGNvbnN0X2VxdWl2X2RhdGEpKSk7CgkgICAgICBt
YXAtPmNvbnN0X2FnZSA9IDA7CgoJICAgICAgZm9yIChqID0gMDsgaiA8IG1heF9sYWJlbG5vOyBq
KyspCgkJaWYgKGxvY2FsX2xhYmVsW2pdKQoJCSAgc2V0X2xhYmVsX2luX21hcCAobWFwLCBqLCBn
ZW5fbGFiZWxfcnR4ICgpKTsKCgkgICAgICBmb3IgKGogPSBGSVJTVF9QU0VVRE9fUkVHSVNURVI7
IGogPCBtYXhfbG9jYWxfcmVnbnVtOyBqKyspCgkJaWYgKGxvY2FsX3JlZ25vW2pdKQoJCSAgewoJ
CSAgICBtYXAtPnJlZ19tYXBbal0gPSBnZW5fcmVnX3J0eCAoR0VUX01PREUgKHJlZ25vX3JlZ19y
dHhbal0pKTsKCQkgICAgcmVjb3JkX2Jhc2VfdmFsdWUgKFJFR05PIChtYXAtPnJlZ19tYXBbal0p
LAoJCQkJICAgICAgIHJlZ25vX3JlZ19ydHhbal0sIDApOwoJCSAgfQoJICAgICAgLyogVGhlIGxh
c3QgY29weSBuZWVkcyB0aGUgY29tcGFyZS9icmFuY2ggaW5zbnMgYXQgdGhlIGVuZCwKCQkgc28g
cmVzZXQgY29weV9lbmQgaGVyZSBpZiB0aGUgbG9vcCBlbmRzIHdpdGggYSBjb25kaXRpb25hbAoJ
CSBicmFuY2guICAqLwoKCSAgICAgIGlmIChpID09IHVucm9sbF9udW1iZXIgLSAxKQoJCXsKCQkg
IGlmIChHRVRfQ09ERSAobGFzdF9sb29wX2luc24pID09IEJBUlJJRVIpCgkJICAgIGNvcHlfZW5k
ID0gUFJFVl9JTlNOIChQUkVWX0lOU04gKGxhc3RfbG9vcF9pbnNuKSk7CgkJICBlbHNlCgkJICAg
IGNvcHlfZW5kID0gbGFzdF9sb29wX2luc247CgkJfQoKCSAgICAgIC8qIE5vbmUgb2YgdGhlIGNv
cGllcyBhcmUgdGhlIGBsYXN0X2l0ZXJhdGlvbicsIHNvIGp1c3QKCQkgcGFzcyB6ZXJvIGZvciB0
aGF0IHBhcmFtZXRlci4gICovCgkgICAgICBjb3B5X2xvb3BfYm9keSAoY29weV9zdGFydCwgY29w
eV9lbmQsIG1hcCwgZXhpdF9sYWJlbCwgMCwKCQkJICAgICAgdW5yb2xsX3R5cGUsIHN0YXJ0X2xh
YmVsLCBsb29wX2VuZCwKCQkJICAgICAgbG9vcF9zdGFydCwgY29weV9lbmQpOwoJICAgIH0KCSAg
ZW1pdF9sYWJlbF9hZnRlciAobGFiZWxzWzBdLCBQUkVWX0lOU04gKGxvb3Bfc3RhcnQpKTsKCgkg
IGlmIChHRVRfQ09ERSAobGFzdF9sb29wX2luc24pID09IEJBUlJJRVIpCgkgICAgewoJICAgICAg
aW5zZXJ0X2JlZm9yZSA9IFBSRVZfSU5TTiAobGFzdF9sb29wX2luc24pOwoJICAgICAgY29weV9l
bmQgPSBQUkVWX0lOU04gKGluc2VydF9iZWZvcmUpOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKI2lm
ZGVmIEhBVkVfY2MwCgkgICAgICAvKiBUaGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIGluc24gaXMg
YSBjb21wYXJlIHdoaWNoIHdlIGRvIG5vdAoJCSB3YW50IHRvIGNvcHkuICAqLwoJICAgICAgaW5z
ZXJ0X2JlZm9yZSA9IFBSRVZfSU5TTiAobGFzdF9sb29wX2luc24pOwoJICAgICAgY29weV9lbmQg
PSBQUkVWX0lOU04gKGluc2VydF9iZWZvcmUpOwojZWxzZQoJICAgICAgLyogVGhlIGltbWVkaWF0
ZWx5IHByZWNlZGluZyBpbnNuIG1heSBub3QgYmUgYSBjb21wYXJlLCBzbyB3ZQoJCSBtdXN0IGNv
cHkgaXQuICAqLwoJICAgICAgaW5zZXJ0X2JlZm9yZSA9IGxhc3RfbG9vcF9pbnNuOwoJICAgICAg
Y29weV9lbmQgPSBQUkVWX0lOU04gKGxhc3RfbG9vcF9pbnNuKTsKI2VuZGlmCgkgICAgfQoKCSAg
LyogU2V0IHVucm9sbCB0eXBlIHRvIE1PRFVMTyBub3cuICAqLwoJICB1bnJvbGxfdHlwZSA9IFVO
Uk9MTF9NT0RVTE87CgkgIGxvb3BfcHJlY29uZGl0aW9uZWQgPSAxOwoJfQogICAgfQoKICAvKiBJ
ZiByZWFjaCBoZXJlLCBhbmQgdGhlIGxvb3AgdHlwZSBpcyBVTlJPTExfTkFJVkUsIHRoZW4gZG9u
J3QgdW5yb2xsCiAgICAgdGhlIGxvb3AgdW5sZXNzIGFsbCBsb29wcyBhcmUgYmVpbmcgdW5yb2xs
ZWQuICAqLwogIGlmICh1bnJvbGxfdHlwZSA9PSBVTlJPTExfTkFJVkUgJiYgISBmbGFnX3Vucm9s
bF9hbGxfbG9vcHMpCiAgICB7CiAgICAgIGlmIChsb29wX2R1bXBfc3RyZWFtKQoJZnByaW50ZiAo
bG9vcF9kdW1wX3N0cmVhbSwgIlVucm9sbGluZyBmYWlsdXJlOiBOYWl2ZSB1bnJvbGxpbmcgbm90
IGJlaW5nIGRvbmUuXG4iKTsKICAgICAgZ290byBlZ3Jlc3M7CiAgICB9CgogIC8qIEF0IHRoaXMg
cG9pbnQsIHdlIGFyZSBndWFyYW50ZWVkIHRvIHVucm9sbCB0aGUgbG9vcC4gICovCgogIC8qIEtl
ZXAgdHJhY2sgb2YgdGhlIHVucm9sbCBmYWN0b3IgZm9yIHRoZSBsb29wLiAgKi8KICBpZiAodW5y
b2xsX3R5cGUgPT0gVU5ST0xMX0NPTVBMRVRFTFkpCiAgICBsb29wX2luZm8tPnVucm9sbF9udW1i
ZXIgPSAtMTsKICBlbHNlCiAgICBsb29wX2luZm8tPnVucm9sbF9udW1iZXIgPSB1bnJvbGxfbnVt
YmVyOwoKCiAgLyogRm9yIGVhY2ggYml2IGFuZCBnaXYsIGRldGVybWluZSB3aGV0aGVyIGl0IGNh
biBiZSBzYWZlbHkgc3BsaXQgaW50bwogICAgIGEgZGlmZmVyZW50IHZhcmlhYmxlIGZvciBlYWNo
IHVucm9sbGVkIGNvcHkgb2YgdGhlIGxvb3AgYm9keS4KICAgICBXZSBwcmVjYWxjdWxhdGUgYW5k
IHNhdmUgdGhpcyBpbmZvIGhlcmUsIHNpbmNlIGNvbXB1dGluZyBpdCBpcwogICAgIGV4cGVuc2l2
ZS4KCiAgICAgRG8gdGhpcyBiZWZvcmUgZGVsZXRpbmcgYW55IGluc3RydWN0aW9ucyBmcm9tIHRo
ZSBsb29wLCBzbyB0aGF0CiAgICAgYmFja19icmFuY2hfaW5fcmFuZ2VfcCB3aWxsIHdvcmsgY29y
cmVjdGx5LiAgKi8KCiAgaWYgKHNwbGl0dGluZ19ub3Rfc2FmZSkKICAgIHRlbXAgPSAwOwogIGVs
c2UKICAgIHRlbXAgPSBmaW5kX3NwbGl0dGFibGVfcmVncyAodW5yb2xsX3R5cGUsIGxvb3Bfc3Rh
cnQsIGxvb3BfZW5kLAoJCQkJIGVuZF9pbnNlcnRfYmVmb3JlLCB1bnJvbGxfbnVtYmVyLAoJCQkJ
IGxvb3BfaW5mby0+bl9pdGVyYXRpb25zKTsKCiAgLyogZmluZF9zcGxpdHRhYmxlX3JlZ3MgbWF5
IGhhdmUgY3JlYXRlZCBzb21lIG5ldyByZWdpc3RlcnMsIHNvIG11c3QKICAgICByZWFsbG9jYXRl
IHRoZSByZWdfbWFwIHdpdGggdGhlIG5ldyBsYXJnZXIgc2l6ZSwgYW5kIG11c3QgcmVhbGxvYwog
ICAgIHRoZSBjb25zdGFudCBtYXBzIGFsc28uICAqLwoKICBtYXhyZWdudW0gPSBtYXhfcmVnX251
bSAoKTsKICBtYXAtPnJlZ19tYXAgPSAocnR4ICopIGFsbG9jYSAobWF4cmVnbnVtICogc2l6ZW9m
IChydHgpKTsKCiAgaW5pdF9yZWdfbWFwIChtYXAsIG1heHJlZ251bSk7CgogIGlmIChtYXAtPmNv
bnN0X2VxdWl2X3ZhcnJheSA9PSAwKQogICAgVkFSUkFZX0NPTlNUX0VRVUlWX0lOSVQgKG1hcC0+
Y29uc3RfZXF1aXZfdmFycmF5LAoJCQkgICAgIG1heHJlZ251bSArIHRlbXAgKiB1bnJvbGxfbnVt
YmVyICogMiwKCQkJICAgICAidW5yb2xsX2xvb3AiKTsKICBnbG9iYWxfY29uc3RfZXF1aXZfdmFy
cmF5ID0gbWFwLT5jb25zdF9lcXVpdl92YXJyYXk7CgogIC8qIFNlYXJjaCB0aGUgbGlzdCBvZiBi
aXZzIGFuZCBnaXZzIHRvIGZpbmQgb25lcyB3aGljaCBuZWVkIHRvIGJlIHJlbWFwcGVkCiAgICAg
d2hlbiBzcGxpdCwgYW5kIHNldCB0aGVpciByZWdfbWFwIGVudHJ5IGFwcHJvcHJpYXRlbHkuICAq
LwoKICBmb3IgKGJsID0gbG9vcF9pdl9saXN0OyBibDsgYmwgPSBibC0+bmV4dCkKICAgIHsKICAg
ICAgaWYgKFJFR05PIChibC0+Yml2LT5zcmNfcmVnKSAhPSBibC0+cmVnbm8pCgltYXAtPnJlZ19t
YXBbYmwtPnJlZ25vXSA9IGJsLT5iaXYtPnNyY19yZWc7CiNpZiAwCiAgICAgIC8qIEN1cnJlbnRs
eSwgbm9uLXJlZHVjZWQvZmluYWwtdmFsdWUgZ2l2cyBhcmUgbmV2ZXIgc3BsaXQuICAqLwogICAg
ICBmb3IgKHYgPSBibC0+Z2l2OyB2OyB2ID0gdi0+bmV4dF9pdikKCWlmIChSRUdOTyAodi0+c3Jj
X3JlZykgIT0gYmwtPnJlZ25vKQoJICBtYXAtPnJlZ19tYXBbUkVHTk8gKHYtPmRlc3RfcmVnKV0g
PSB2LT5zcmNfcmVnOwojZW5kaWYKICAgIH0KCiAgLyogVXNlIG91ciBjdXJyZW50IHJlZ2lzdGVy
IGFsaWdubWVudCBhbmQgcG9pbnRlciBmbGFncy4gICovCiAgbWFwLT5yZWdub19wb2ludGVyX2Zs
YWcgPSByZWdub19wb2ludGVyX2ZsYWc7CiAgbWFwLT5yZWdub19wb2ludGVyX2FsaWduID0gcmVn
bm9fcG9pbnRlcl9hbGlnbjsKCiAgLyogSWYgdGhlIGxvb3AgaXMgYmVpbmcgcGFydGlhbGx5IHVu
cm9sbGVkLCBhbmQgdGhlIGl0ZXJhdGlvbiB2YXJpYWJsZXMKICAgICBhcmUgYmVpbmcgc3BsaXQs
IGFuZCBhcmUgYmVpbmcgcmVuYW1lZCBmb3IgdGhlIHNwbGl0LCB0aGVuIG11c3QgZml4IHVwCiAg
ICAgdGhlIGNvbXBhcmUvanVtcCBpbnN0cnVjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBsb29wIHRv
IHJlZmVyIHRvIHRoZSBuZXcKICAgICByZWdpc3RlcnMuICBUaGlzIGNvbXBhcmUgaXNuJ3QgY29w
aWVkLCBzbyB0aGUgcmVnaXN0ZXJzIHVzZWQgaW4gaXQKICAgICB3aWxsIG5ldmVyIGJlIHJlcGxh
Y2VkIGlmIGl0IGlzbid0IGRvbmUgaGVyZS4gICovCgogIGlmICh1bnJvbGxfdHlwZSA9PSBVTlJP
TExfTU9EVUxPKQogICAgewogICAgICBpbnNuID0gTkVYVF9JTlNOIChjb3B5X2VuZCk7CiAgICAg
IGlmIChHRVRfQ09ERSAoaW5zbikgPT0gSU5TTiB8fCBHRVRfQ09ERSAoaW5zbikgPT0gSlVNUF9J
TlNOKQoJUEFUVEVSTiAoaW5zbikgPSByZW1hcF9zcGxpdF9iaXZzIChQQVRURVJOIChpbnNuKSk7
CiAgICB9CgogIC8qIEZvciB1bnJvbGxfbnVtYmVyIHRpbWVzLCBtYWtlIGEgY29weSBvZiBlYWNo
IGluc3RydWN0aW9uCiAgICAgYmV0d2VlbiBjb3B5X3N0YXJ0IGFuZCBjb3B5X2VuZCwgYW5kIGlu
c2VydCB0aGVzZSBuZXcgaW5zdHJ1Y3Rpb25zCiAgICAgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGxv
b3AuICAqLwoKICBmb3IgKGkgPSAwOyBpIDwgdW5yb2xsX251bWJlcjsgaSsrKQogICAgewogICAg
ICBiemVybyAoKGNoYXIgKikgbWFwLT5pbnNuX21hcCwgbWF4X2luc25ubyAqIHNpemVvZiAocnR4
KSk7CiAgICAgIGJ6ZXJvICgoY2hhciAqKSAmVkFSUkFZX0NPTlNUX0VRVUlWIChtYXAtPmNvbnN0
X2VxdWl2X3ZhcnJheSwgMCksCgkgICAgIFZBUlJBWV9TSVpFIChtYXAtPmNvbnN0X2VxdWl2X3Zh
cnJheSkgKiBzaXplb2YgKHN0cnVjdCBjb25zdF9lcXVpdl9kYXRhKSk7CiAgICAgIG1hcC0+Y29u
c3RfYWdlID0gMDsKCiAgICAgIGZvciAoaiA9IDA7IGogPCBtYXhfbGFiZWxubzsgaisrKQoJaWYg
KGxvY2FsX2xhYmVsW2pdKQoJICBzZXRfbGFiZWxfaW5fbWFwIChtYXAsIGosIGdlbl9sYWJlbF9y
dHggKCkpOwoKICAgICAgZm9yIChqID0gRklSU1RfUFNFVURPX1JFR0lTVEVSOyBqIDwgbWF4X2xv
Y2FsX3JlZ251bTsgaisrKQoJaWYgKGxvY2FsX3JlZ25vW2pdKQoJICB7CgkgICAgbWFwLT5yZWdf
bWFwW2pdID0gZ2VuX3JlZ19ydHggKEdFVF9NT0RFIChyZWdub19yZWdfcnR4W2pdKSk7CgkgICAg
cmVjb3JkX2Jhc2VfdmFsdWUgKFJFR05PIChtYXAtPnJlZ19tYXBbal0pLAoJCQkgICAgICAgcmVn
bm9fcmVnX3J0eFtqXSwgMCk7CgkgIH0KCiAgICAgIC8qIElmIGxvb3Agc3RhcnRzIHdpdGggYSBi
cmFuY2ggdG8gdGhlIHRlc3QsIHRoZW4gZml4IGl0IHNvIHRoYXQKCSBpdCBwb2ludHMgdG8gdGhl
IHRlc3Qgb2YgdGhlIGZpcnN0IHVucm9sbGVkIGNvcHkgb2YgdGhlIGxvb3AuICAqLwogICAgICBp
ZiAoaSA9PSAwICYmIGxvb3Bfc3RhcnQgIT0gY29weV9zdGFydCkKCXsKCSAgaW5zbiA9IFBSRVZf
SU5TTiAoY29weV9zdGFydCk7CgkgIHBhdHRlcm4gPSBQQVRURVJOIChpbnNuKTsKCgkgIHRlbSA9
IGdldF9sYWJlbF9mcm9tX21hcCAobWFwLAoJCQkJICAgIENPREVfTEFCRUxfTlVNQkVSCgkJCQkg
ICAgKFhFWFAgKFNFVF9TUkMgKHBhdHRlcm4pLCAwKSkpOwoJICBTRVRfU1JDIChwYXR0ZXJuKSA9
IGdlbl9ydHhfTEFCRUxfUkVGIChWT0lEbW9kZSwgdGVtKTsKCgkgIC8qIFNldCB0aGUganVtcCBs
YWJlbCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IGxhdGVyIGxvb3AgdW5yb2xsaW5nCgkgICAg
IHBhc3Nlcy4gICovCgkgIEpVTVBfTEFCRUwgKGluc24pID0gdGVtOwoJICBMQUJFTF9OVVNFUyAo
dGVtKSsrOwoJfQoKICAgICAgY29weV9sb29wX2JvZHkgKGNvcHlfc3RhcnQsIGNvcHlfZW5kLCBt
YXAsIGV4aXRfbGFiZWwsCgkJICAgICAgaSA9PSB1bnJvbGxfbnVtYmVyIC0gMSwgdW5yb2xsX3R5
cGUsIHN0YXJ0X2xhYmVsLAoJCSAgICAgIGxvb3BfZW5kLCBpbnNlcnRfYmVmb3JlLCBpbnNlcnRf
YmVmb3JlKTsKICAgIH0KCiAgLyogQmVmb3JlIGRlbGV0aW5nIGFueSBpbnNucywgZW1pdCBhIENP
REVfTEFCRUwgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGxhc3QKICAgICBpbnNuIHRvIGJlIGRlbGV0
ZWQuICBUaGlzIHByZXZlbnRzIGFueSBydW5hd2F5IGRlbGV0ZV9pbnNuIGNhbGwgZnJvbQogICAg
IG1vcmUgaW5zbnMgdGhhdCBpdCBzaG91bGQsIGFzIGl0IGFsd2F5cyBzdG9wcyBhdCBhIENPREVf
TEFCRUwuICAqLwoKICAvKiBEZWxldGUgdGhlIGNvbXBhcmUgYW5kIGJyYW5jaCBhdCB0aGUgZW5k
IG9mIHRoZSBsb29wIGlmIGNvbXBsZXRlbHkKICAgICB1bnJvbGxpbmcgdGhlIGxvb3AuICBEZWxl
dGluZyB0aGUgYmFja3dhcmQgYnJhbmNoIGF0IHRoZSBlbmQgYWxzbwogICAgIGRlbGV0ZXMgdGhl
IGNvZGUgbGFiZWwgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsb29wLiAgVGhpcyBpcyBkb25lIGF0CiAg
ICAgdGhlIHZlcnkgZW5kIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggYmFja19icmFuY2hfaW5fcmFu
Z2VfcC4gICovCgogIGlmICh1bnJvbGxfdHlwZSA9PSBVTlJPTExfQ09NUExFVEVMWSkKICAgIHNh
ZmV0eV9sYWJlbCA9IGVtaXRfbGFiZWxfYWZ0ZXIgKGdlbl9sYWJlbF9ydHggKCksIGxhc3RfbG9v
cF9pbnNuKTsKICBlbHNlCiAgICBzYWZldHlfbGFiZWwgPSBlbWl0X2xhYmVsX2FmdGVyIChnZW5f
bGFiZWxfcnR4ICgpLCBjb3B5X2VuZCk7CgogIC8qIERlbGV0ZSBhbGwgb2YgdGhlIG9yaWdpbmFs
IGxvb3AgaW5zdHJ1Y3Rpb25zLiAgRG9uJ3QgZGVsZXRlIHRoZQogICAgIExPT1BfQkVHIG5vdGUs
IG9yIHRoZSBmaXJzdCBjb2RlIGxhYmVsIGluIHRoZSBsb29wLiAgKi8KCiAgaW5zbiA9IE5FWFRf
SU5TTiAoY29weV9zdGFydCk7CiAgd2hpbGUgKGluc24gIT0gc2FmZXR5X2xhYmVsKQogICAgewog
ICAgICAvKiA/Pz8gRG9uJ3QgZGVsZXRlIG5hbWVkIGNvZGUgbGFiZWxzLiAgVGhleSB3aWxsIGJl
IGRlbGV0ZWQgd2hlbiB0aGUKCSBqdW1wIHRoYXQgcmVmZXJlbmNlcyB0aGVtIGlzIGRlbGV0ZWQu
ICBPdGhlcndpc2UsIHdlIGVuZCB1cCBkZWxldGluZwoJIHRoZW0gdHdpY2UsIHdoaWNoIGNhdXNl
cyB0aGVtIHRvIGNvbXBsZXRlbHkgZGlzYXBwZWFyIGluc3RlYWQgb2YgdHVybgoJIGludG8gTk9U
RV9JTlNOX0RFTEVURURfTEFCRUwgbm90ZXMuICBUaGlzIGluIHR1cm4gY2F1c2VzIGFib3J0cyBp
bgoJIGR3YXJmb3V0LmMvZHdhcmYyb3V0LmMuICBXZSBjb3VsZCBwZXJoYXBzIGZpeCB0aGUgZHdh
cmYqb3V0LmMgZmlsZXMKCSB0byBoYW5kbGUgZGVsZXRlZCBsYWJlbHMgaW5zdGVhZC4gIE9yIHBl
cmhhcHMgZml4IERFQ0xfUlRMIG9mIHRoZQoJIGFzc29jaWF0ZWQgTEFCRUxfREVDTCB0byBwb2lu
dCB0byBvbmUgb2YgdGhlIG5ldyBsYWJlbCBpbnN0YW5jZXMuICAqLwogICAgICAvKiA/Pz8gTGlr
ZXdpc2UsIHdlIGNhbid0IGRlbGV0ZSBhIE5PVEVfSU5TTl9ERUxFVEVEX0xBQkVMIG5vdGUuICAq
LwogICAgICBpZiAoaW5zbiAhPSBzdGFydF9sYWJlbAoJICAmJiAhIChHRVRfQ09ERSAoaW5zbikg
PT0gQ09ERV9MQUJFTCAmJiBMQUJFTF9OQU1FIChpbnNuKSkKCSAgJiYgISAoR0VUX0NPREUgKGlu
c24pID09IE5PVEUKCQkmJiBOT1RFX0xJTkVfTlVNQkVSIChpbnNuKSA9PSBOT1RFX0lOU05fREVM
RVRFRF9MQUJFTCkpCglpbnNuID0gZGVsZXRlX2luc24gKGluc24pOwogICAgICBlbHNlCglpbnNu
ID0gTkVYVF9JTlNOIChpbnNuKTsKICAgIH0KCiAgLyogQ2FuIG5vdyBkZWxldGUgdGhlICdzYWZl
dHknIGxhYmVsIGVtaXR0ZWQgdG8gcHJvdGVjdCB1cyBmcm9tIHJ1bmF3YXkKICAgICBkZWxldGVf
aW5zbiBjYWxscy4gICovCiAgaWYgKElOU05fREVMRVRFRF9QIChzYWZldHlfbGFiZWwpKQogICAg
YWJvcnQgKCk7CiAgZGVsZXRlX2luc24gKHNhZmV0eV9sYWJlbCk7CgogIC8qIElmIGV4aXRfbGFi
ZWwgZXhpc3RzLCBlbWl0IGl0IGFmdGVyIHRoZSBsb29wLiAgRG9pbmcgdGhlIGVtaXQgaGVyZQog
ICAgIGZvcmNlcyBpdCB0byBoYXZlIGEgaGlnaGVyIElOU05fVUlEIHRoYW4gYW55IGluc24gaW4g
dGhlIHVucm9sbGVkIGxvb3AuCiAgICAgVGhpcyBpcyBuZWVkZWQgc28gdGhhdCBtb3N0bHlfdHJ1
ZV9qdW1wIGluIHJlb3JnLmMgd2lsbCB0cmVhdCBqdW1wcwogICAgIHRvIHRoaXMgbG9vcCBlbmQg
bGFiZWwgY29ycmVjdGx5LCBpLmUuIHByZWRpY3QgdGhhdCB0aGV5IGFyZSB1c3VhbGx5CiAgICAg
bm90IHRha2VuLiAgKi8KICBpZiAoZXhpdF9sYWJlbCkKICAgIGVtaXRfbGFiZWxfYWZ0ZXIgKGV4
aXRfbGFiZWwsIGxvb3BfZW5kKTsKCiBlZ3Jlc3M6CiAgaWYgKG1hcCAmJiBtYXAtPmNvbnN0X2Vx
dWl2X3ZhcnJheSkKICAgIFZBUlJBWV9GUkVFIChtYXAtPmNvbnN0X2VxdWl2X3ZhcnJheSk7Cn0K
DAovKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbG9vcCBjYW4gYmUgc2FmZWx5LCBhbmQgcHJvZml0YWJs
eSwgcHJlY29uZGl0aW9uZWQKICAgc28gdGhhdCB0aGUgdW5yb2xsZWQgY29waWVzIG9mIHRoZSBs
b29wIGJvZHkgZG9uJ3QgbmVlZCBleGl0IHRlc3RzLgoKICAgVGhpcyBvbmx5IHdvcmtzIGlmIGZp
bmFsX3ZhbHVlLCBpbml0aWFsX3ZhbHVlIGFuZCBpbmNyZW1lbnQgY2FuIGJlCiAgIGRldGVybWlu
ZWQsIGFuZCBpZiBpbmNyZW1lbnQgaXMgYSBjb25zdGFudCBwb3dlciBvZiAyLgogICBJZiBpbmNy
ZW1lbnQgaXMgbm90IGEgcG93ZXIgb2YgMiwgdGhlbiB0aGUgcHJlY29uZGl0aW9uaW5nIG1vZHVs
bwogICBvcGVyYXRpb24gd291bGQgcmVxdWlyZSBhIHJlYWwgbW9kdWxvIGluc3RlYWQgb2YgYSBi
b29sZWFuIEFORCwgYW5kIHRoaXMKICAgaXMgbm90IGNvbnNpZGVyZWQgYHByb2ZpdGFibGUnLiAg
Ki8KCi8qID8/PyBJZiB0aGUgbG9vcCBpcyBrbm93biB0byBiZSBleGVjdXRlZCB2ZXJ5IG1hbnkg
dGltZXMsIG9yIHRoZSBtYWNoaW5lCiAgIGhhcyBhIHZlcnkgY2hlYXAgZGl2aWRlIGluc3RydWN0
aW9uLCB0aGVuIHByZWNvbmRpdGlvbmluZyBpcyBhIHdpbiBldmVuCiAgIHdoZW4gdGhlIGluY3Jl
bWVudCBpcyBub3QgYSBwb3dlciBvZiAyLiAgVXNlIFJUWF9DT1NUIHRvIGNvbXB1dGUKICAgd2hl
dGhlciBkaXZpZGUgaXMgY2hlYXAuCiAgID8/PyBBIGRpdmlkZSBieSBjb25zdGFudCBkb2Vzbid0
IGFjdHVhbGx5IG5lZWQgYSBkaXZpZGUsIGxvb2sgYXQKICAgZXhwYW5kX2Rpdm1vZC4gIFRoZSBy
ZWR1Y2VkIGNvc3Qgb2YgdGhpcyBvcHRpbWl6ZWQgbW9kdWxvIGlzIG5vdAogICByZWZsZWN0ZWQg
aW4gUlRYX0NPU1QuICAqLwoKaW50CnByZWNvbmRpdGlvbl9sb29wX3AgKGxvb3Bfc3RhcnQsIGxv
b3BfaW5mbywKCQkgICAgIGluaXRpYWxfdmFsdWUsIGZpbmFsX3ZhbHVlLCBpbmNyZW1lbnQsIG1v
ZGUpCiAgICAgcnR4IGxvb3Bfc3RhcnQ7CiAgICAgc3RydWN0IGxvb3BfaW5mbyAqbG9vcF9pbmZv
OwogICAgIHJ0eCAqaW5pdGlhbF92YWx1ZSwgKmZpbmFsX3ZhbHVlLCAqaW5jcmVtZW50OwogICAg
IGVudW0gbWFjaGluZV9tb2RlICptb2RlOwp7CgogIGlmIChsb29wX2luZm8tPm5faXRlcmF0aW9u
cyA+IDApCiAgICB7CiAgICAgICppbml0aWFsX3ZhbHVlID0gY29uc3QwX3J0eDsKICAgICAgKmlu
Y3JlbWVudCA9IGNvbnN0MV9ydHg7CiAgICAgICpmaW5hbF92YWx1ZSA9IEdFTl9JTlQgKGxvb3Bf
aW5mby0+bl9pdGVyYXRpb25zKTsKICAgICAgKm1vZGUgPSB3b3JkX21vZGU7CgogICAgICBpZiAo
bG9vcF9kdW1wX3N0cmVhbSkKCXsKCSAgZnB1dHMgKCJQcmVjb25kaXRpb25pbmc6IFN1Y2Nlc3Ms
IG51bWJlciBvZiBpdGVyYXRpb25zIGtub3duLCAiLAoJCSBsb29wX2R1bXBfc3RyZWFtKTsKCSAg
ZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwgSE9TVF9XSURFX0lOVF9QUklOVF9ERUMsCgkJICAg
bG9vcF9pbmZvLT5uX2l0ZXJhdGlvbnMpOwoJICBmcHV0cyAoIi5cbiIsIGxvb3BfZHVtcF9zdHJl
YW0pOwoJfQogICAgICByZXR1cm4gMTsKICAgIH0KCiAgaWYgKGxvb3BfaW5mby0+aW5pdGlhbF92
YWx1ZSA9PSAwKQogICAgewogICAgICBpZiAobG9vcF9kdW1wX3N0cmVhbSkKCWZwcmludGYgKGxv
b3BfZHVtcF9zdHJlYW0sCgkJICJQcmVjb25kaXRpb25pbmc6IENvdWxkIG5vdCBmaW5kIGluaXRp
YWwgdmFsdWUuXG4iKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgZWxzZSBpZiAobG9vcF9pbmZv
LT5pbmNyZW1lbnQgPT0gMCkKICAgIHsKICAgICAgaWYgKGxvb3BfZHVtcF9zdHJlYW0pCglmcHJp
bnRmIChsb29wX2R1bXBfc3RyZWFtLAoJCSAiUHJlY29uZGl0aW9uaW5nOiBDb3VsZCBub3QgZmlu
ZCBpbmNyZW1lbnQgdmFsdWUuXG4iKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgZWxzZSBpZiAo
R0VUX0NPREUgKGxvb3BfaW5mby0+aW5jcmVtZW50KSAhPSBDT05TVF9JTlQpCiAgICB7CiAgICAg
IGlmIChsb29wX2R1bXBfc3RyZWFtKQoJZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgIlBy
ZWNvbmRpdGlvbmluZzogSW5jcmVtZW50IG5vdCBhIGNvbnN0YW50LlxuIik7CiAgICAgIHJldHVy
biAwOwogICAgfQogIGVsc2UgaWYgKChleGFjdF9sb2cyIChJTlRWQUwgKGxvb3BfaW5mby0+aW5j
cmVtZW50KSkgPCAwKQoJICAgJiYgKGV4YWN0X2xvZzIgKC0gSU5UVkFMIChsb29wX2luZm8tPmlu
Y3JlbWVudCkpIDwgMCkpCiAgICB7CiAgICAgIGlmIChsb29wX2R1bXBfc3RyZWFtKQoJZnByaW50
ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgIlByZWNvbmRpdGlvbmluZzogSW5jcmVtZW50IG5vdCBh
IGNvbnN0YW50IHBvd2VyIG9mIDIuXG4iKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogIC8qIFVu
c2lnbmVkX2NvbXBhcmUgYW5kIGNvbXBhcmVfZGlyIGNhbiBiZSBpZ25vcmVkIGhlcmUsIHNpbmNl
IHRoZXkgZG8KICAgICBub3QgbWF0dGVyIGZvciBwcmVjb25kaXRpb25pbmcuICAqLwoKICBpZiAo
bG9vcF9pbmZvLT5maW5hbF92YWx1ZSA9PSAwKQogICAgewogICAgICBpZiAobG9vcF9kdW1wX3N0
cmVhbSkKCWZwcmludGYgKGxvb3BfZHVtcF9zdHJlYW0sCgkJICJQcmVjb25kaXRpb25pbmc6IEVR
IGNvbXBhcmlzb24gbG9vcC5cbiIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgLyogTXVzdCBl
bnN1cmUgdGhhdCBmaW5hbF92YWx1ZSBpcyBpbnZhcmlhbnQsIHNvIGNhbGwgaW52YXJpYW50X3Ag
dG8KICAgICBjaGVjay4gIEJlZm9yZSBkb2luZyBzbywgbXVzdCBjaGVjayByZWdubyBhZ2FpbnN0
IG1heF9yZWdfYmVmb3JlX2xvb3AKICAgICB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVnaXN0ZXIg
aXMgaW4gdGhlIHJhbmdlIGNvdmVyZWQgYnkgaW52YXJpYW50X3AuCiAgICAgSWYgaXQgaXNuJ3Qs
IHRoZW4gaXQgaXMgbW9zdCBsaWtlbHkgYSBiaXYvZ2l2IHdoaWNoIGJ5IGRlZmluaXRpb24gYXJl
CiAgICAgbm90IGludmFyaWFudC4gICovCiAgaWYgKChHRVRfQ09ERSAobG9vcF9pbmZvLT5maW5h
bF92YWx1ZSkgPT0gUkVHCiAgICAgICAmJiBSRUdOTyAobG9vcF9pbmZvLT5maW5hbF92YWx1ZSkg
Pj0gbWF4X3JlZ19iZWZvcmVfbG9vcCkKICAgICAgfHwgKEdFVF9DT0RFIChsb29wX2luZm8tPmZp
bmFsX3ZhbHVlKSA9PSBQTFVTCgkgICYmIFJFR05PIChYRVhQIChsb29wX2luZm8tPmZpbmFsX3Zh
bHVlLCAwKSkgPj0gbWF4X3JlZ19iZWZvcmVfbG9vcCkKICAgICAgfHwgISBpbnZhcmlhbnRfcCAo
bG9vcF9pbmZvLT5maW5hbF92YWx1ZSkpCiAgICB7CiAgICAgIGlmIChsb29wX2R1bXBfc3RyZWFt
KQoJZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgIlByZWNvbmRpdGlvbmluZzogRmluYWwg
dmFsdWUgbm90IGludmFyaWFudC5cbiIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgLyogRmFp
bCBmb3IgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLCBzaW5jZSB0aGUgY2FsbGVyIG9mIHRoaXMgZnVu
Y3Rpb24KICAgICBkb2VzIG5vdCBoYXZlIGNvZGUgdG8gZGVhbCB3aXRoIHRoZW0uICAqLwogIGlm
IChHRVRfTU9ERV9DTEFTUyAoR0VUX01PREUgKGxvb3BfaW5mby0+ZmluYWxfdmFsdWUpKSA9PSBN
T0RFX0ZMT0FUCiAgICAgIHx8IEdFVF9NT0RFX0NMQVNTIChHRVRfTU9ERSAobG9vcF9pbmZvLT5p
bml0aWFsX3ZhbHVlKSkgPT0gTU9ERV9GTE9BVCkKICAgIHsKICAgICAgaWYgKGxvb3BfZHVtcF9z
dHJlYW0pCglmcHJpbnRmIChsb29wX2R1bXBfc3RyZWFtLAoJCSAiUHJlY29uZGl0aW9uaW5nOiBG
bG9hdGluZyBwb2ludCBmaW5hbCBvciBpbml0aWFsIHZhbHVlLlxuIik7CiAgICAgIHJldHVybiAw
OwogICAgfQoKICAvKiBGYWlsIGlmIGxvb3BfaW5mby0+aXRlcmF0aW9uX3ZhciBpcyBub3QgbGl2
ZSBiZWZvcmUgbG9vcF9zdGFydCwKICAgICBzaW5jZSB3ZSBuZWVkIHRvIHRlc3QgaXRzIHZhbHVl
IGluIHRoZSBwcmVjb25kaXRpb25pbmcgY29kZS4gICovCgogIGlmICh1aWRfbHVpZFtSRUdOT19G
SVJTVF9VSUQgKFJFR05PIChsb29wX2luZm8tPml0ZXJhdGlvbl92YXIpKV0KICAgICAgPiBJTlNO
X0xVSUQgKGxvb3Bfc3RhcnQpKQogICAgewogICAgICBpZiAobG9vcF9kdW1wX3N0cmVhbSkKCWZw
cmludGYgKGxvb3BfZHVtcF9zdHJlYW0sCgkJICJQcmVjb25kaXRpb25pbmc6IEl0ZXJhdGlvbiB2
YXIgbm90IGxpdmUgYmVmb3JlIGxvb3Agc3RhcnQuXG4iKTsKICAgICAgcmV0dXJuIDA7CiAgICB9
CgogIC8qIE5vdGUgdGhhdCBpdGVyYXRpb25faW5mbyBiaWFzZXMgdGhlIGluaXRpYWwgdmFsdWUg
Zm9yIEdJViBpdGVyYXRvcnMKICAgICBzdWNoIGFzICJ3aGlsZSAoaS0tID4gMCkiIHNvIHRoYXQg
d2UgY2FuIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mCiAgICAgaXRlcmF0aW9ucyBqdXN0IGxpa2Ug
Zm9yIEJJViBpdGVyYXRvcnMuCgogICAgIEFsc28gbm90ZSB0aGF0IHRoZSBhYnNvbHV0ZSB2YWx1
ZXMgb2YgaW5pdGlhbF92YWx1ZSBhbmQKICAgICBmaW5hbF92YWx1ZSBhcmUgdW5pbXBvcnRhbnQg
YXMgb25seSB0aGVpciBkaWZmZXJlbmNlIGlzIHVzZWQgZm9yCiAgICAgY2FsY3VsYXRpbmcgdGhl
IG51bWJlciBvZiBsb29wIGl0ZXJhdGlvbnMuICAqLwogICppbml0aWFsX3ZhbHVlID0gbG9vcF9p
bmZvLT5pbml0aWFsX3ZhbHVlOwogICppbmNyZW1lbnQgPSBsb29wX2luZm8tPmluY3JlbWVudDsK
ICAqZmluYWxfdmFsdWUgPSBsb29wX2luZm8tPmZpbmFsX3ZhbHVlOwoKICAvKiBEZWNpZGUgd2hh
dCBtb2RlIHRvIGRvIHRoZXNlIGNhbGN1bGF0aW9ucyBpbi4gIENob29zZSB0aGUgbGFyZ2VyCiAg
ICAgb2YgZmluYWxfdmFsdWUncyBtb2RlIGFuZCBpbml0aWFsX3ZhbHVlJ3MgbW9kZSwgb3IgYSBm
dWxsLXdvcmQgaWYKICAgICBib3RoIGFyZSBjb25zdGFudHMuICAqLwogICptb2RlID0gR0VUX01P
REUgKCpmaW5hbF92YWx1ZSk7CiAgaWYgKCptb2RlID09IFZPSURtb2RlKQogICAgewogICAgICAq
bW9kZSA9IEdFVF9NT0RFICgqaW5pdGlhbF92YWx1ZSk7CiAgICAgIGlmICgqbW9kZSA9PSBWT0lE
bW9kZSkKCSptb2RlID0gd29yZF9tb2RlOwogICAgfQogIGVsc2UgaWYgKCptb2RlICE9IEdFVF9N
T0RFICgqaW5pdGlhbF92YWx1ZSkKCSAgICYmIChHRVRfTU9ERV9TSVpFICgqbW9kZSkKCSAgICAg
ICA8IEdFVF9NT0RFX1NJWkUgKEdFVF9NT0RFICgqaW5pdGlhbF92YWx1ZSkpKSkKICAgICptb2Rl
ID0gR0VUX01PREUgKCppbml0aWFsX3ZhbHVlKTsKCiAgLyogU3VjY2VzcyEgKi8KICBpZiAobG9v
cF9kdW1wX3N0cmVhbSkKICAgIGZwcmludGYgKGxvb3BfZHVtcF9zdHJlYW0sICJQcmVjb25kaXRp
b25pbmc6IFN1Y2Nlc3NmdWwuXG4iKTsKICByZXR1cm4gMTsKfQoKCi8qIEFsbCBwc2V1ZG8tcmVn
aXN0ZXJzIG11c3QgYmUgbWFwcGVkIHRvIHRoZW1zZWx2ZXMuICBUd28gaGFyZCByZWdpc3RlcnMK
ICAgbXVzdCBiZSBtYXBwZWQsIFZJUlRVQUxfU1RBQ0tfVkFSU19SRUdOVU0gYW5kIFZJUlRVQUxf
SU5DT01JTkdfQVJHU18KICAgUkVHTlVNLCB0byBhdm9pZCBmdW5jdGlvbi1pbmxpbmluZyBzcGVj
aWZpYyBjb252ZXJzaW9ucyBvZiB0aGVzZQogICByZWdpc3RlcnMuICBBbGwgb3RoZXIgaGFyZCBy
ZWdzIGNhbiBub3QgYmUgbWFwcGVkIGJlY2F1c2UgdGhleSBtYXkgYmUKICAgdXNlZCB3aXRoIGRp
ZmZlcmVudAogICBtb2Rlcy4gICovCgpzdGF0aWMgdm9pZAppbml0X3JlZ19tYXAgKG1hcCwgbWF4
cmVnbnVtKQogICAgIHN0cnVjdCBpbmxpbmVfcmVtYXAgKm1hcDsKICAgICBpbnQgbWF4cmVnbnVt
Owp7CiAgaW50IGk7CgogIGZvciAoaSA9IG1heHJlZ251bSAtIDE7IGkgPiBMQVNUX1ZJUlRVQUxf
UkVHSVNURVI7IGktLSkKICAgIG1hcC0+cmVnX21hcFtpXSA9IHJlZ25vX3JlZ19ydHhbaV07CiAg
LyogSnVzdCBjbGVhciB0aGUgcmVzdCBvZiB0aGUgZW50cmllcy4gICovCiAgZm9yIChpID0gTEFT
VF9WSVJUVUFMX1JFR0lTVEVSOyBpID49IDA7IGktLSkKICAgIG1hcC0+cmVnX21hcFtpXSA9IDA7
CgogIG1hcC0+cmVnX21hcFtWSVJUVUFMX1NUQUNLX1ZBUlNfUkVHTlVNXQogICAgPSByZWdub19y
ZWdfcnR4W1ZJUlRVQUxfU1RBQ0tfVkFSU19SRUdOVU1dOwogIG1hcC0+cmVnX21hcFtWSVJUVUFM
X0lOQ09NSU5HX0FSR1NfUkVHTlVNXQogICAgPSByZWdub19yZWdfcnR4W1ZJUlRVQUxfSU5DT01J
TkdfQVJHU19SRUdOVU1dOwp9CgwKLyogU3RyZW5ndGgtcmVkdWN0aW9uIHdpbGwgb2Z0ZW4gZW1p
dCBjb2RlIGZvciBvcHRpbWl6ZWQgYml2L2dpdnMgd2hpY2gKICAgY2FsY3VsYXRlcyB0aGVpciB2
YWx1ZSBpbiBhIHRlbXBvcmFyeSByZWdpc3RlciwgYW5kIHRoZW4gY29waWVzIHRoZSByZXN1bHQK
ICAgdG8gdGhlIGl2LiAgVGhpcyBwcm9jZWR1cmUgcmVjb25zdHJ1Y3RzIHRoZSBwYXR0ZXJuIGNv
bXB1dGluZyB0aGUgaXY7CiAgIHZlcmlmeWluZyB0aGF0IGFsbCBvcGVyYW5kcyBhcmUgb2YgdGhl
IHByb3BlciBmb3JtLgoKICAgUEFUVEVSTiBtdXN0IGJlIHRoZSByZXN1bHQgb2Ygc2luZ2xlX3Nl
dC4KICAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgYW1vdW50IHRoYXQgdGhlIGdpdiBpcyBpbmNy
ZW1lbnRlZCBieS4gICovCgpzdGF0aWMgcnR4CmNhbGN1bGF0ZV9naXZfaW5jIChwYXR0ZXJuLCBz
cmNfaW5zbiwgcmVnbm8pCiAgICAgcnR4IHBhdHRlcm4sIHNyY19pbnNuOwogICAgIGludCByZWdu
bzsKewogIHJ0eCBpbmNyZW1lbnQ7CiAgcnR4IGluY3JlbWVudF90b3RhbCA9IDA7CiAgaW50IHRy
aWVzID0gMDsKCiByZXRyeToKICAvKiBWZXJpZnkgdGhhdCB3ZSBoYXZlIGFuIGluY3JlbWVudCBp
bnNuIGhlcmUuICBGaXJzdCBjaGVjayBmb3IgYSBwbHVzCiAgICAgYXMgdGhlIHNldCBzb3VyY2Uu
ICAqLwogIGlmIChHRVRfQ09ERSAoU0VUX1NSQyAocGF0dGVybikpICE9IFBMVVMpCiAgICB7CiAg
ICAgIC8qIFNSIHNvbWV0aW1lcyBjb21wdXRlcyB0aGUgbmV3IGdpdiB2YWx1ZSBpbiBhIHRlbXAs
IHRoZW4gY29waWVzIGl0CgkgdG8gdGhlIG5ld19yZWcuICAqLwogICAgICBzcmNfaW5zbiA9IFBS
RVZfSU5TTiAoc3JjX2luc24pOwogICAgICBwYXR0ZXJuID0gUEFUVEVSTiAoc3JjX2luc24pOwog
ICAgICBpZiAoR0VUX0NPREUgKFNFVF9TUkMgKHBhdHRlcm4pKSAhPSBQTFVTKQoJYWJvcnQgKCk7
CgogICAgICAvKiBUaGUgbGFzdCBpbnNuIGVtaXR0ZWQgaXMgbm90IG5lZWRlZCwgc28gZGVsZXRl
IGl0IHRvIGF2b2lkIGNvbmZ1c2luZwoJIHRoZSBzZWNvbmQgY3NlIHBhc3MuICBUaGlzIGluc24g
c2V0cyB0aGUgZ2l2IHVubmVjZXNzYXJpbHkuICAqLwogICAgICBkZWxldGVfaW5zbiAoZ2V0X2xh
c3RfaW5zbiAoKSk7CiAgICB9CgogIC8qIFZlcmlmeSB0aGF0IHdlIGhhdmUgYSBjb25zdGFudCBh
cyB0aGUgc2Vjb25kIG9wZXJhbmQgb2YgdGhlIHBsdXMuICAqLwogIGluY3JlbWVudCA9IFhFWFAg
KFNFVF9TUkMgKHBhdHRlcm4pLCAxKTsKICBpZiAoR0VUX0NPREUgKGluY3JlbWVudCkgIT0gQ09O
U1RfSU5UKQogICAgewogICAgICAvKiBTUiBzb21ldGltZXMgcHV0cyB0aGUgY29uc3RhbnQgaW4g
YSByZWdpc3RlciwgZXNwZWNpYWxseSBpZiBpdCBpcwoJIHRvbyBiaWcgdG8gYmUgYW4gYWRkIGlt
bWVkIG9wZXJhbmQuICAqLwogICAgICBzcmNfaW5zbiA9IFBSRVZfSU5TTiAoc3JjX2luc24pOwog
ICAgICBpbmNyZW1lbnQgPSBTRVRfU1JDIChQQVRURVJOIChzcmNfaW5zbikpOwoKICAgICAgLyog
U1IgbWF5IGhhdmUgdXNlZCBMT19TVU0gdG8gY29tcHV0ZSB0aGUgY29uc3RhbnQgaWYgaXQgaXMg
dG9vIGxhcmdlCgkgZm9yIGEgbG9hZCBpbW1lZCBvcGVyYW5kLiAgSW4gdGhpcyBjYXNlLCB0aGUg
Y29uc3RhbnQgaXMgaW4gb3BlcmFuZAoJIG9uZSBvZiB0aGUgTE9fU1VNIHJ0eC4gICovCiAgICAg
IGlmIChHRVRfQ09ERSAoaW5jcmVtZW50KSA9PSBMT19TVU0pCglpbmNyZW1lbnQgPSBYRVhQIChp
bmNyZW1lbnQsIDEpOwoKICAgICAgLyogU29tZSBwb3J0cyBzdG9yZSBsYXJnZSBjb25zdGFudHMg
aW4gbWVtb3J5IGFuZCBhZGQgYSBSRUdfRVFVQUwKCSBub3RlIHRvIHRoZSBzdG9yZSBpbnNuLiAg
Ki8KICAgICAgZWxzZSBpZiAoR0VUX0NPREUgKGluY3JlbWVudCkgPT0gTUVNKQoJewoJICBydHgg
bm90ZSA9IGZpbmRfcmVnX25vdGUgKHNyY19pbnNuLCBSRUdfRVFVQUwsIDApOwoJICBpZiAobm90
ZSkKCSAgICBpbmNyZW1lbnQgPSBYRVhQIChub3RlLCAwKTsKCX0KCiAgICAgIGVsc2UgaWYgKEdF
VF9DT0RFIChpbmNyZW1lbnQpID09IElPUgoJICAgICAgIHx8IEdFVF9DT0RFIChpbmNyZW1lbnQp
ID09IEFTSElGVAoJICAgICAgIHx8IEdFVF9DT0RFIChpbmNyZW1lbnQpID09IFBMVVMpCgl7Cgkg
IC8qIFRoZSByczYwMDAgcG9ydCBsb2FkcyBzb21lIGNvbnN0YW50cyB3aXRoIElPUi4KCSAgICAg
VGhlIGFscGhhIHBvcnQgbG9hZHMgc29tZSBjb25zdGFudHMgd2l0aCBBU0hJRlQgYW5kIFBMVVMu
ICAqLwoJICBydHggc2Vjb25kX3BhcnQgPSBYRVhQIChpbmNyZW1lbnQsIDEpOwoJICBlbnVtIHJ0
eF9jb2RlIGNvZGUgPSBHRVRfQ09ERSAoaW5jcmVtZW50KTsKCgkgIHNyY19pbnNuID0gUFJFVl9J
TlNOIChzcmNfaW5zbik7CgkgIGluY3JlbWVudCA9IFNFVF9TUkMgKFBBVFRFUk4gKHNyY19pbnNu
KSk7CgkgIC8qIERvbid0IG5lZWQgdGhlIGxhc3QgaW5zbiBhbnltb3JlLiAgKi8KCSAgZGVsZXRl
X2luc24gKGdldF9sYXN0X2luc24gKCkpOwoKCSAgaWYgKEdFVF9DT0RFIChzZWNvbmRfcGFydCkg
IT0gQ09OU1RfSU5UCgkgICAgICB8fCBHRVRfQ09ERSAoaW5jcmVtZW50KSAhPSBDT05TVF9JTlQp
CgkgICAgYWJvcnQgKCk7CgoJICBpZiAoY29kZSA9PSBJT1IpCgkgICAgaW5jcmVtZW50ID0gR0VO
X0lOVCAoSU5UVkFMIChpbmNyZW1lbnQpIHwgSU5UVkFMIChzZWNvbmRfcGFydCkpOwoJICBlbHNl
IGlmIChjb2RlID09IFBMVVMpCgkgICAgaW5jcmVtZW50ID0gR0VOX0lOVCAoSU5UVkFMIChpbmNy
ZW1lbnQpICsgSU5UVkFMIChzZWNvbmRfcGFydCkpOwoJICBlbHNlCgkgICAgaW5jcmVtZW50ID0g
R0VOX0lOVCAoSU5UVkFMIChpbmNyZW1lbnQpIDw8IElOVFZBTCAoc2Vjb25kX3BhcnQpKTsKCX0K
CiAgICAgIGlmIChHRVRfQ09ERSAoaW5jcmVtZW50KSAhPSBDT05TVF9JTlQpCglhYm9ydCAoKTsK
CiAgICAgIC8qIFRoZSBpbnNuIGxvYWRpbmcgdGhlIGNvbnN0YW50IGludG8gYSByZWdpc3RlciBp
cyBubyBsb25nZXIgbmVlZGVkLAoJIHNvIGRlbGV0ZSBpdC4gICovCiAgICAgIGRlbGV0ZV9pbnNu
IChnZXRfbGFzdF9pbnNuICgpKTsKICAgIH0KCiAgaWYgKGluY3JlbWVudF90b3RhbCkKICAgIGlu
Y3JlbWVudF90b3RhbCA9IEdFTl9JTlQgKElOVFZBTCAoaW5jcmVtZW50X3RvdGFsKSArIElOVFZB
TCAoaW5jcmVtZW50KSk7CiAgZWxzZQogICAgaW5jcmVtZW50X3RvdGFsID0gaW5jcmVtZW50OwoK
ICAvKiBDaGVjayB0aGF0IHRoZSBzb3VyY2UgcmVnaXN0ZXIgaXMgdGhlIHNhbWUgYXMgdGhlIHJl
Z2lzdGVyIHdlIGV4cGVjdGVkCiAgICAgdG8gc2VlIGFzIHRoZSBzb3VyY2UuICBJZiBub3QsIHNv
bWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcuICAqLwogIGlmIChHRVRfQ09ERSAoWEVYUCAoU0VU
X1NSQyAocGF0dGVybiksIDApKSAhPSBSRUcKICAgICAgfHwgUkVHTk8gKFhFWFAgKFNFVF9TUkMg
KHBhdHRlcm4pLCAwKSkgIT0gcmVnbm8pCiAgICB7CiAgICAgIC8qIFNvbWUgbWFjaGluZXMgKGUu
Zy4gdGhlIHJvbXApLCBtYXkgZW1pdCB0d28gYWRkIGluc3RydWN0aW9ucyBmb3IKCSBjZXJ0YWlu
IGNvbnN0YW50cywgc28gbGV0cyB0cnkgbG9va2luZyBmb3IgYW5vdGhlciBhZGQgaW1tZWRpYXRl
bHkKCSBiZWZvcmUgdGhpcyBvbmUgaWYgd2UgaGF2ZSBvbmx5IHNlZW4gb25lIGFkZCBpbnNuIHNv
IGZhci4gICovCgogICAgICBpZiAodHJpZXMgPT0gMCkKCXsKCSAgdHJpZXMrKzsKCgkgIHNyY19p
bnNuID0gUFJFVl9JTlNOIChzcmNfaW5zbik7CgkgIHBhdHRlcm4gPSBQQVRURVJOIChzcmNfaW5z
bik7CgoJICBkZWxldGVfaW5zbiAoZ2V0X2xhc3RfaW5zbiAoKSk7CgoJICBnb3RvIHJldHJ5OwoJ
fQoKICAgICAgYWJvcnQgKCk7CiAgICB9CgogIHJldHVybiBpbmNyZW1lbnRfdG90YWw7Cn0KCi8q
IENvcHkgUkVHX05PVEVTLCBleGNlcHQgZm9yIGluc24gcmVmZXJlbmNlcywgYmVjYXVzZSBub3Qg
YWxsIGluc25fbWFwCiAgIGVudHJpZXMgYXJlIHZhbGlkIHlldC4gIFdlIGRvIG5lZWQgdG8gY29w
eSByZWdpc3RlcnMgbm93IHRob3VnaCwgYmVjYXVzZQogICB0aGUgcmVnX21hcCBlbnRyaWVzIGNh
biBjaGFuZ2UgZHVyaW5nIGNvcHlpbmcuICAqLwoKc3RhdGljIHJ0eAppbml0aWFsX3JlZ19ub3Rl
X2NvcHkgKG5vdGVzLCBtYXApCiAgICAgcnR4IG5vdGVzOwogICAgIHN0cnVjdCBpbmxpbmVfcmVt
YXAgKm1hcDsKewogIHJ0eCBjb3B5OwoKICBpZiAobm90ZXMgPT0gMCkKICAgIHJldHVybiAwOwoK
ICBjb3B5ID0gcnR4X2FsbG9jIChHRVRfQ09ERSAobm90ZXMpKTsKICBQVVRfTU9ERSAoY29weSwg
R0VUX01PREUgKG5vdGVzKSk7CgogIGlmIChHRVRfQ09ERSAobm90ZXMpID09IEVYUFJfTElTVCkK
ICAgIFhFWFAgKGNvcHksIDApID0gY29weV9ydHhfYW5kX3N1YnN0aXR1dGUgKFhFWFAgKG5vdGVz
LCAwKSwgbWFwKTsKICBlbHNlIGlmIChHRVRfQ09ERSAobm90ZXMpID09IElOU05fTElTVCkKICAg
IC8qIERvbid0IHN1YnN0aXR1dGUgZm9yIHRoZXNlIHlldC4gICovCiAgICBYRVhQIChjb3B5LCAw
KSA9IFhFWFAgKG5vdGVzLCAwKTsKICBlbHNlCiAgICBhYm9ydCAoKTsKCiAgWEVYUCAoY29weSwg
MSkgPSBpbml0aWFsX3JlZ19ub3RlX2NvcHkgKFhFWFAgKG5vdGVzLCAxKSwgbWFwKTsKCiAgcmV0
dXJuIGNvcHk7Cn0KCi8qIEZpeHVwIGluc24gcmVmZXJlbmNlcyBpbiBjb3BpZWQgUkVHX05PVEVT
LiAgKi8KCnN0YXRpYyB2b2lkCmZpbmFsX3JlZ19ub3RlX2NvcHkgKG5vdGVzLCBtYXApCiAgICAg
cnR4IG5vdGVzOwogICAgIHN0cnVjdCBpbmxpbmVfcmVtYXAgKm1hcDsKewogIHJ0eCBub3RlOwoK
ICBmb3IgKG5vdGUgPSBub3Rlczsgbm90ZTsgbm90ZSA9IFhFWFAgKG5vdGUsIDEpKQogICAgaWYg
KEdFVF9DT0RFIChub3RlKSA9PSBJTlNOX0xJU1QpCiAgICAgIFhFWFAgKG5vdGUsIDApID0gbWFw
LT5pbnNuX21hcFtJTlNOX1VJRCAoWEVYUCAobm90ZSwgMCkpXTsKfQoKLyogQ29weSBlYWNoIGlu
c3RydWN0aW9uIGluIHRoZSBsb29wLCBzdWJzdGl0dXRpbmcgZnJvbSBtYXAgYXMgYXBwcm9wcmlh
dGUuCiAgIFRoaXMgaXMgdmVyeSBzaW1pbGFyIHRvIGEgbG9vcCBpbiBleHBhbmRfaW5saW5lX2Z1
bmN0aW9uLiAgKi8KCnN0YXRpYyB2b2lkCmNvcHlfbG9vcF9ib2R5IChjb3B5X3N0YXJ0LCBjb3B5
X2VuZCwgbWFwLCBleGl0X2xhYmVsLCBsYXN0X2l0ZXJhdGlvbiwKCQl1bnJvbGxfdHlwZSwgc3Rh
cnRfbGFiZWwsIGxvb3BfZW5kLCBpbnNlcnRfYmVmb3JlLAoJCWNvcHlfbm90ZXNfZnJvbSkKICAg
ICBydHggY29weV9zdGFydCwgY29weV9lbmQ7CiAgICAgc3RydWN0IGlubGluZV9yZW1hcCAqbWFw
OwogICAgIHJ0eCBleGl0X2xhYmVsOwogICAgIGludCBsYXN0X2l0ZXJhdGlvbjsKICAgICBlbnVt
IHVucm9sbF90eXBlcyB1bnJvbGxfdHlwZTsKICAgICBydHggc3RhcnRfbGFiZWwsIGxvb3BfZW5k
LCBpbnNlcnRfYmVmb3JlLCBjb3B5X25vdGVzX2Zyb207CnsKICBydHggaW5zbiwgcGF0dGVybjsK
ICBydHggc2V0LCB0ZW0sIGNvcHk7CiAgaW50IGRlc3RfcmVnX3dhc19zcGxpdCwgaTsKI2lmZGVm
IEhBVkVfY2MwCiAgcnR4IGNjMF9pbnNuID0gMDsKI2VuZGlmCiAgcnR4IGZpbmFsX2xhYmVsID0g
MDsKICBydHggZ2l2X2luYywgZ2l2X2Rlc3RfcmVnLCBnaXZfc3JjX3JlZzsKCiAgLyogSWYgdGhp
cyBpc24ndCB0aGUgbGFzdCBpdGVyYXRpb24sIHRoZW4gbWFwIGFueSByZWZlcmVuY2VzIHRvIHRo
ZQogICAgIHN0YXJ0X2xhYmVsIHRvIGZpbmFsX2xhYmVsLiAgRmluYWwgbGFiZWwgd2lsbCB0aGVu
IGJlIGVtaXR0ZWQgaW1tZWRpYXRlbHkKICAgICBhZnRlciB0aGUgZW5kIG9mIHRoaXMgbG9vcCBi
b2R5IGlmIGl0IHdhcyBldmVyIHVzZWQuCgogICAgIElmIHRoaXMgaXMgdGhlIGxhc3QgaXRlcmF0
aW9uLCB0aGVuIG1hcCByZWZlcmVuY2VzIHRvIHRoZSBzdGFydF9sYWJlbAogICAgIHRvIGl0c2Vs
Zi4gICovCiAgaWYgKCEgbGFzdF9pdGVyYXRpb24pCiAgICB7CiAgICAgIGZpbmFsX2xhYmVsID0g
Z2VuX2xhYmVsX3J0eCAoKTsKICAgICAgc2V0X2xhYmVsX2luX21hcCAobWFwLCBDT0RFX0xBQkVM
X05VTUJFUiAoc3RhcnRfbGFiZWwpLAoJCQlmaW5hbF9sYWJlbCk7CiAgICB9CiAgZWxzZQogICAg
c2V0X2xhYmVsX2luX21hcCAobWFwLCBDT0RFX0xBQkVMX05VTUJFUiAoc3RhcnRfbGFiZWwpLCBz
dGFydF9sYWJlbCk7CgogIHN0YXJ0X3NlcXVlbmNlICgpOwoKICAvKiBFbWl0IGEgTk9URV9JTlNO
X0RFTEVURUQgdG8gZm9yY2UgYXQgbGVhc3QgdHdvIGluc25zIG9udG8gdGhlIHNlcXVlbmNlLgog
ICAgIEVsc2UgZ2VuX3NlcXVlbmNlIGNvdWxkIHJldHVybiBhIHJhdyBwYXR0ZXJuIGZvciBhIGp1
bXAgd2hpY2ggd2UgcGFzcwogICAgIG9mZiB0byBlbWl0X2luc25fYmVmb3JlIChpbnN0ZWFkIG9m
IGVtaXRfanVtcF9pbnNuX2JlZm9yZSkgd2hpY2ggY2F1c2VzCiAgICAgYSB2YXJpZXR5IG9mIGxv
c2luZyBiZWhhdmlvcnMgbGF0ZXIuICAqLwogIGVtaXRfbm90ZSAoMCwgTk9URV9JTlNOX0RFTEVU
RUQpOwoKICBpbnNuID0gY29weV9zdGFydDsKICBkbwogICAgewogICAgICBpbnNuID0gTkVYVF9J
TlNOIChpbnNuKTsKCiAgICAgIG1hcC0+b3JpZ19hc21fb3BlcmFuZHNfdmVjdG9yID0gMDsKCiAg
ICAgIHN3aXRjaCAoR0VUX0NPREUgKGluc24pKQoJewoJY2FzZSBJTlNOOgoJICBwYXR0ZXJuID0g
UEFUVEVSTiAoaW5zbik7CgkgIGNvcHkgPSAwOwoJICBnaXZfaW5jID0gMDsKCgkgIC8qIENoZWNr
IHRvIHNlZSBpZiB0aGlzIGlzIGEgZ2l2IHRoYXQgaGFzIGJlZW4gY29tYmluZWQgd2l0aAoJICAg
ICBzb21lIHNwbGl0IGFkZHJlc3MgZ2l2cy4gIChDb21iaW5lZCBpbiB0aGUgc2Vuc2UgdGhhdAoJ
ICAgICBgY29tYmluZV9naXZzJyBpbiBsb29wLmMgaGFzIHB1dCB0d28gZ2l2cyBpbiB0aGUgc2Ft
ZSByZWdpc3Rlci4pCgkgICAgIEluIHRoaXMgY2FzZSwgd2UgbXVzdCBzZWFyY2ggYWxsIGdpdnMg
YmFzZWQgb24gdGhlIHNhbWUgYml2IHRvCgkgICAgIGZpbmQgdGhlIGFkZHJlc3MgZ2l2cy4gIFRo
ZW4gc3BsaXQgdGhlIGFkZHJlc3MgZ2l2cy4KCSAgICAgRG8gdGhpcyBiZWZvcmUgc3BsaXR0aW5n
IHRoZSBnaXYsIHNpbmNlIHRoYXQgbWF5IG1hcCB0aGUKCSAgICAgU0VUX0RFU1QgdG8gYSBuZXcg
cmVnaXN0ZXIuICAqLwoKCSAgaWYgKChzZXQgPSBzaW5nbGVfc2V0IChpbnNuKSkKCSAgICAgICYm
IEdFVF9DT0RFIChTRVRfREVTVCAoc2V0KSkgPT0gUkVHCgkgICAgICAmJiBhZGRyX2NvbWJpbmVk
X3JlZ3NbUkVHTk8gKFNFVF9ERVNUIChzZXQpKV0pCgkgICAgewoJICAgICAgc3RydWN0IGl2X2Ns
YXNzICpibDsKCSAgICAgIHN0cnVjdCBpbmR1Y3Rpb24gKnYsICp0djsKCSAgICAgIGludCByZWdu
byA9IFJFR05PIChTRVRfREVTVCAoc2V0KSk7CgoJICAgICAgdiA9IGFkZHJfY29tYmluZWRfcmVn
c1tSRUdOTyAoU0VUX0RFU1QgKHNldCkpXTsKCSAgICAgIGJsID0gcmVnX2Jpdl9jbGFzc1tSRUdO
TyAodi0+c3JjX3JlZyldOwoKCSAgICAgIC8qIEFsdGhvdWdoIHRoZSBnaXZfaW5jIGFtb3VudCBp
cyBub3QgbmVlZGVkIGhlcmUsIHdlIG11c3QgY2FsbAoJCSBjYWxjdWxhdGVfZ2l2X2luYyBoZXJl
IHNpbmNlIGl0IG1pZ2h0IHRyeSB0byBkZWxldGUgdGhlCgkJIGxhc3QgaW5zbiBlbWl0dGVkLiAg
SWYgd2Ugd2FpdCB1bnRpbCBsYXRlciB0byBjYWxsIGl0LAoJCSB3ZSBtaWdodCBhY2NpZGVudGFs
bHkgZGVsZXRlIGluc25zIGdlbmVyYXRlZCBpbW1lZGlhdGVseQoJCSBiZWxvdyBieSBlbWl0X3Vu
cm9sbGVkX2FkZC4gICovCgoJICAgICAgaWYgKCEgZGVyaXZlZF9yZWdzW3JlZ25vXSkKCQlnaXZf
aW5jID0gY2FsY3VsYXRlX2dpdl9pbmMgKHNldCwgaW5zbiwgcmVnbm8pOwoKCSAgICAgIC8qIE5v
dyBmaW5kIGFsbCBhZGRyZXNzIGdpdidzIHRoYXQgd2VyZSBjb21iaW5lZCB3aXRoIHRoaXMKCQkg
Z2l2ICd2Jy4gICovCgkgICAgICBmb3IgKHR2ID0gYmwtPmdpdjsgdHY7IHR2ID0gdHYtPm5leHRf
aXYpCgkJaWYgKHR2LT5naXZfdHlwZSA9PSBERVNUX0FERFIgJiYgdHYtPnNhbWUgPT0gdikKCQkg
IHsKCQkgICAgaW50IHRoaXNfZ2l2X2luYzsKCgkJICAgIC8qIElmIHRoaXMgREVTVF9BRERSIGdp
diB3YXMgbm90IHNwbGl0LCB0aGVuIGlnbm9yZSBpdC4gICovCgkJICAgIGlmICgqdHYtPmxvY2F0
aW9uICE9IHR2LT5kZXN0X3JlZykKCQkgICAgICBjb250aW51ZTsKCgkJICAgIC8qIFNjYWxlIHRo
aXNfZ2l2X2luYyBpZiB0aGUgbXVsdGlwbGljYXRpdmUgZmFjdG9ycyBvZgoJCSAgICAgICB0aGUg
dHdvIGdpdnMgYXJlIGRpZmZlcmVudC4gICovCgkJICAgIHRoaXNfZ2l2X2luYyA9IElOVFZBTCAo
Z2l2X2luYyk7CgkJICAgIGlmICh0di0+bXVsdF92YWwgIT0gdi0+bXVsdF92YWwpCgkJICAgICAg
dGhpc19naXZfaW5jID0gKHRoaXNfZ2l2X2luYyAvIElOVFZBTCAodi0+bXVsdF92YWwpCgkJCQkg
ICAgICAqIElOVFZBTCAodHYtPm11bHRfdmFsKSk7CgoJCSAgICB0di0+ZGVzdF9yZWcgPSBwbHVz
X2NvbnN0YW50ICh0di0+ZGVzdF9yZWcsIHRoaXNfZ2l2X2luYyk7CgkJICAgICp0di0+bG9jYXRp
b24gPSB0di0+ZGVzdF9yZWc7CgoJCSAgICBpZiAobGFzdF9pdGVyYXRpb24gJiYgdW5yb2xsX3R5
cGUgIT0gVU5ST0xMX0NPTVBMRVRFTFkpCgkJICAgICAgewoJCQkvKiBNdXN0IGVtaXQgYW4gaW5z
biB0byBpbmNyZW1lbnQgdGhlIHNwbGl0IGFkZHJlc3MKCQkJICAgZ2l2LiAgQWRkIGluIHRoZSBj
b25zdF9hZGp1c3QgZmllbGQgaW4gY2FzZSB0aGVyZQoJCQkgICB3YXMgYSBjb25zdGFudCBlbGlt
aW5hdGVkIGZyb20gdGhlIGFkZHJlc3MuICAqLwoJCQlydHggdmFsdWUsIGRlc3RfcmVnOwoKCQkJ
LyogdHYtPmRlc3RfcmVnIHdpbGwgYmUgZWl0aGVyIGEgYmFyZSByZWdpc3RlciwKCQkJICAgb3Ig
ZWxzZSBhIHJlZ2lzdGVyIHBsdXMgYSBjb25zdGFudC4gICovCgkJCWlmIChHRVRfQ09ERSAodHYt
PmRlc3RfcmVnKSA9PSBSRUcpCgkJCSAgZGVzdF9yZWcgPSB0di0+ZGVzdF9yZWc7CgkJCWVsc2UK
CQkJICBkZXN0X3JlZyA9IFhFWFAgKHR2LT5kZXN0X3JlZywgMCk7CgoJCQkvKiBDaGVjayBmb3Ig
c2hhcmVkIGFkZHJlc3MgZ2l2cywgYW5kIGF2b2lkCgkJCSAgIGluY3JlbWVudGluZyB0aGUgc2hh
cmVkIHBzZXVkbyByZWcgbW9yZSB0aGFuCgkJCSAgIG9uY2UuICAqLwoJCQlpZiAoISB0di0+c2Ft
ZV9pbnNuICYmICEgdHYtPnNoYXJlZCkKCQkJICB7CgkJCSAgICAvKiB0di0+ZGVzdF9yZWcgbWF5
IGFjdHVhbGx5IGJlIGEgKFBMVVMgKFJFRykKCQkJICAgICAgIChDT05TVCkpIGhlcmUsIHNvIHdl
IG11c3QgY2FsbCBwbHVzX2NvbnN0YW50CgkJCSAgICAgICB0byBhZGQgdGhlIGNvbnN0X2FkanVz
dCBhbW91bnQgYmVmb3JlIGNhbGxpbmcKCQkJICAgICAgIGVtaXRfdW5yb2xsZWRfYWRkIGJlbG93
LiAgKi8KCQkJICAgIHZhbHVlID0gcGx1c19jb25zdGFudCAodHYtPmRlc3RfcmVnLAoJCQkJCQkg
ICB0di0+Y29uc3RfYWRqdXN0KTsKCgkJCSAgICAvKiBUaGUgY29uc3RhbnQgY291bGQgYmUgdG9v
IGxhcmdlIGZvciBhbiBhZGQKCQkJICAgICAgIGltbWVkaWF0ZSwgc28gY2FuJ3QgZGlyZWN0bHkg
ZW1pdCBhbiBpbnNuCgkJCSAgICAgICBoZXJlLiAgKi8KCQkJICAgIGVtaXRfdW5yb2xsZWRfYWRk
IChkZXN0X3JlZywgWEVYUCAodmFsdWUsIDApLAoJCQkJCSAgICAgICBYRVhQICh2YWx1ZSwgMSkp
OwoJCQkgIH0KCgkJCS8qIFJlc2V0IHRoZSBnaXYgdG8gYmUganVzdCB0aGUgcmVnaXN0ZXIgYWdh
aW4sIGluIGNhc2UKCQkJICAgaXQgaXMgdXNlZCBhZnRlciB0aGUgc2V0IHdlIGhhdmUganVzdCBl
bWl0dGVkLgoJCQkgICBXZSBtdXN0IHN1YnRyYWN0IHRoZSBjb25zdF9hZGp1c3QgZmFjdG9yIGFk
ZGVkIGluCgkJCSAgIGFib3ZlLiAgKi8KCQkJdHYtPmRlc3RfcmVnID0gcGx1c19jb25zdGFudCAo
ZGVzdF9yZWcsCgkJCQkJCSAgICAgIC0gdHYtPmNvbnN0X2FkanVzdCk7CgkJCSp0di0+bG9jYXRp
b24gPSB0di0+ZGVzdF9yZWc7CgkJICAgICAgfQoJCSAgfQoJICAgIH0KCgkgIC8qIElmIHRoaXMg
aXMgYSBzZXR0aW5nIG9mIGEgc3BsaXR0YWJsZSB2YXJpYWJsZSwgdGhlbiBkZXRlcm1pbmUKCSAg
ICAgaG93IHRvIHNwbGl0IHRoZSB2YXJpYWJsZSwgY3JlYXRlIGEgbmV3IHNldCBiYXNlZCBvbiB0
aGlzIHNwbGl0LAoJICAgICBhbmQgc2V0IHVwIHRoZSByZWdfbWFwIHNvIHRoYXQgbGF0ZXIgdXNl
cyBvZiB0aGUgdmFyaWFibGUgd2lsbAoJICAgICB1c2UgdGhlIG5ldyBzcGxpdCB2YXJpYWJsZS4g
ICovCgoJICBkZXN0X3JlZ193YXNfc3BsaXQgPSAwOwoKCSAgaWYgKChzZXQgPSBzaW5nbGVfc2V0
IChpbnNuKSkKCSAgICAgICYmIEdFVF9DT0RFIChTRVRfREVTVCAoc2V0KSkgPT0gUkVHCgkgICAg
ICAmJiBzcGxpdHRhYmxlX3JlZ3NbUkVHTk8gKFNFVF9ERVNUIChzZXQpKV0pCgkgICAgewoJICAg
ICAgaW50IHJlZ25vID0gUkVHTk8gKFNFVF9ERVNUIChzZXQpKTsKCSAgICAgIGludCBzcmNfcmVn
bm87CgoJICAgICAgZGVzdF9yZWdfd2FzX3NwbGl0ID0gMTsKCgkgICAgICBnaXZfZGVzdF9yZWcg
PSBTRVRfREVTVCAoc2V0KTsKCSAgICAgIGlmIChkZXJpdmVkX3JlZ3NbcmVnbm9dKQoJCXsKCQkg
IC8qID8/PyBUaGlzIHJlbGllcyBvbiBTRVRfU1JDIChTRVQpIHRvIGJlIG9mCgkJICAgICB0aGUg
Zm9ybSAocGx1cyAocmVnKSAoY29uc3RfaW50KSksIGFuZCB0aHVzCgkJICAgICBmb3JjZXMgcmVj
b21iaW5lX2dpdnMgdG8gcmVzdHJpY3QgdGhlIGtpbmQKCQkgICAgIG9mIGdpdiBkZXJpdmF0aW9u
cyBpdCBkb2VzIGJlZm9yZSB1bnJvbGxpbmcuICAqLwoJCSAgZ2l2X3NyY19yZWcgPSBYRVhQIChT
RVRfU1JDIChzZXQpLCAwKTsKCQkgIGdpdl9pbmMgPSBYRVhQIChTRVRfU1JDIChzZXQpLCAxKTsK
CQl9CgkgICAgICBlbHNlCgkJewoJCSAgZ2l2X3NyY19yZWcgPSBnaXZfZGVzdF9yZWc7CgkJICAv
KiBDb21wdXRlIHRoZSBpbmNyZW1lbnQgdmFsdWUgZm9yIHRoZSBnaXYsIGlmIGl0IHdhc24ndAoJ
CSAgICAgYWxyZWFkeSBjb21wdXRlZCBhYm92ZS4gICovCgkJICBpZiAoZ2l2X2luYyA9PSAwKQoJ
CSAgICBnaXZfaW5jID0gY2FsY3VsYXRlX2dpdl9pbmMgKHNldCwgaW5zbiwgcmVnbm8pOwoJCX0K
CSAgICAgIHNyY19yZWdubyA9IFJFR05PIChnaXZfc3JjX3JlZyk7CgoJICAgICAgaWYgKHVucm9s
bF90eXBlID09IFVOUk9MTF9DT01QTEVURUxZKQoJCXsKCQkgIC8qIENvbXBsZXRlbHkgdW5yb2xs
aW5nIHRoZSBsb29wLiAgU2V0IHRoZSBpbmR1Y3Rpb24KCQkgICAgIHZhcmlhYmxlIHRvIGEga25v
d24gY29uc3RhbnQgdmFsdWUuICAqLwoKCQkgIC8qIFRoZSB2YWx1ZSBpbiBzcGxpdHRhYmxlX3Jl
Z3MgbWF5IGJlIGFuIGludmFyaWFudAoJCSAgICAgdmFsdWUsIHNvIHdlIG11c3QgdXNlIHBsdXNf
Y29uc3RhbnQgaGVyZS4gICovCgkJICBzcGxpdHRhYmxlX3JlZ3NbcmVnbm9dCgkJICAgID0gcGx1
c19jb25zdGFudCAoc3BsaXR0YWJsZV9yZWdzW3NyY19yZWdub10sCgkJCQkgICAgIElOVFZBTCAo
Z2l2X2luYykpOwoKCQkgIGlmIChHRVRfQ09ERSAoc3BsaXR0YWJsZV9yZWdzW3JlZ25vXSkgPT0g
UExVUykKCQkgICAgewoJCSAgICAgIGdpdl9zcmNfcmVnID0gWEVYUCAoc3BsaXR0YWJsZV9yZWdz
W3JlZ25vXSwgMCk7CgkJICAgICAgZ2l2X2luYyA9IFhFWFAgKHNwbGl0dGFibGVfcmVnc1tyZWdu
b10sIDEpOwoJCSAgICB9CgkJICBlbHNlCgkJICAgIHsKCQkgICAgICAvKiBUaGUgc3BsaXR0YWJs
ZV9yZWdzIHZhbHVlIG11c3QgYmUgYSBSRUcgb3IgYQoJCQkgQ09OU1RfSU5ULCBzbyBwdXQgdGhl
IGVudGlyZSB2YWx1ZSBpbiB0aGUgZ2l2X3NyY19yZWcKCQkJIHZhcmlhYmxlLiAgKi8KCQkgICAg
ICBnaXZfc3JjX3JlZyA9IHNwbGl0dGFibGVfcmVnc1tyZWdub107CgkJICAgICAgZ2l2X2luYyA9
IGNvbnN0MF9ydHg7CgkJICAgIH0KCQl9CgkgICAgICBlbHNlCgkJewoJCSAgLyogUGFydGlhbGx5
IHVucm9sbGluZyBsb29wLiAgQ3JlYXRlIGEgbmV3IHBzZXVkbwoJCSAgICAgcmVnaXN0ZXIgZm9y
IHRoZSBpdGVyYXRpb24gdmFyaWFibGUsIGFuZCBzZXQgaXQgdG8KCQkgICAgIGJlIGEgY29uc3Rh
bnQgcGx1cyB0aGUgb3JpZ2luYWwgcmVnaXN0ZXIuICBFeGNlcHQKCQkgICAgIG9uIHRoZSBsYXN0
IGl0ZXJhdGlvbiwgd2hlbiB0aGUgcmVzdWx0IGhhcyB0bwoJCSAgICAgZ28gYmFjayBpbnRvIHRo
ZSBvcmlnaW5hbCBpdGVyYXRpb24gdmFyIHJlZ2lzdGVyLiAgKi8KCgkJICAvKiBIYW5kbGUgYml2
cyB3aGljaCBtdXN0IGJlIG1hcHBlZCB0byBhIG5ldyByZWdpc3RlcgoJCSAgICAgd2hlbiBzcGxp
dC4gIFRoaXMgaGFwcGVucyBmb3IgYml2cyB3aGljaCBuZWVkIHRoZWlyCgkJICAgICBmaW5hbCB2
YWx1ZSBzZXQgYmVmb3JlIGxvb3AgZW50cnkuICBUaGUgbmV3IHJlZ2lzdGVyCgkJICAgICBmb3Ig
dGhlIGJpdiB3YXMgc3RvcmVkIGluIHRoZSBiaXYncyBmaXJzdCBzdHJ1Y3QKCQkgICAgIGluZHVj
dGlvbiBlbnRyeSBieSBmaW5kX3NwbGl0dGFibGVfcmVncy4gICovCgoJCSAgaWYgKHJlZ25vIDwg
bWF4X3JlZ19iZWZvcmVfbG9vcAoJCSAgICAgICYmIFJFR19JVl9UWVBFIChyZWdubykgPT0gQkFT
SUNfSU5EVUNUKQoJCSAgICB7CgkJICAgICAgZ2l2X3NyY19yZWcgPSByZWdfYml2X2NsYXNzW3Jl
Z25vXS0+Yml2LT5zcmNfcmVnOwoJCSAgICAgIGdpdl9kZXN0X3JlZyA9IGdpdl9zcmNfcmVnOwoJ
CSAgICB9CgojaWYgMAoJCSAgLyogSWYgbm9uLXJlZHVjZWQvZmluYWwtdmFsdWUgZ2l2cyB3ZXJl
IHNwbGl0LCB0aGVuCgkJICAgICB0aGlzIHdvdWxkIGhhdmUgdG8gcmVtYXAgdGhvc2UgZ2l2cyBh
bHNvLiAgU2VlCgkJICAgICBmaW5kX3NwbGl0dGFibGVfcmVncy4gICovCiNlbmRpZgoKCQkgIHNw
bGl0dGFibGVfcmVnc1tyZWdub10KCQkgICAgPSBHRU5fSU5UIChJTlRWQUwgKGdpdl9pbmMpCgkJ
CSAgICAgICArIElOVFZBTCAoc3BsaXR0YWJsZV9yZWdzW3NyY19yZWdub10pKTsKCQkgIGdpdl9p
bmMgPSBzcGxpdHRhYmxlX3JlZ3NbcmVnbm9dOwoKCQkgIC8qIE5vdyBzcGxpdCB0aGUgaW5kdWN0
aW9uIHZhcmlhYmxlIGJ5IGNoYW5naW5nIHRoZSBkZXN0CgkJICAgICBvZiB0aGlzIGluc24gdG8g
YSBuZXcgcmVnaXN0ZXIsIGFuZCBzZXR0aW5nIGl0cwoJCSAgICAgcmVnX21hcCBlbnRyeSB0byBw
b2ludCB0byB0aGlzIG5ldyByZWdpc3Rlci4KCgkJICAgICBJZiB0aGlzIGlzIHRoZSBsYXN0IGl0
ZXJhdGlvbiwgYW5kIHRoaXMgaXMgdGhlIGxhc3QgaW5zbgoJCSAgICAgdGhhdCB3aWxsIHVwZGF0
ZSB0aGUgaXYsIHRoZW4gcmV1c2UgdGhlIG9yaWdpbmFsIGRlc3QsCgkJICAgICB0byBlbnN1cmUg
dGhhdCB0aGUgaXYgd2lsbCBoYXZlIHRoZSBwcm9wZXIgdmFsdWUgd2hlbgoJCSAgICAgdGhlIGxv
b3AgZXhpdHMgb3IgcmVwZWF0cy4KCgkJICAgICBVc2luZyBzcGxpdHRhYmxlX3JlZ3NfdXBkYXRl
cyBoZXJlIGxpa2UgdGhpcyBpcyBzYWZlLAoJCSAgICAgYmVjYXVzZSBpdCBjYW4gb25seSBiZSBn
cmVhdGVyIHRoYW4gb25lIGlmIGFsbAoJCSAgICAgaW5zdHJ1Y3Rpb25zIG1vZGlmeWluZyB0aGUg
aXYgYXJlIGFsd2F5cyBleGVjdXRlZCBpbgoJCSAgICAgb3JkZXIuICAqLwoKCQkgIGlmICghIGxh
c3RfaXRlcmF0aW9uCgkJICAgICAgfHwgKHNwbGl0dGFibGVfcmVnc191cGRhdGVzW3JlZ25vXS0t
ICE9IDEpKQoJCSAgICB7CgkJICAgICAgdGVtID0gZ2VuX3JlZ19ydHggKEdFVF9NT0RFIChnaXZf
c3JjX3JlZykpOwoJCSAgICAgIGdpdl9kZXN0X3JlZyA9IHRlbTsKCQkgICAgICBtYXAtPnJlZ19t
YXBbcmVnbm9dID0gdGVtOwoJCSAgICAgIHJlY29yZF9iYXNlX3ZhbHVlIChSRUdOTyAodGVtKSwK
CQkJCQkgZ2l2X2luYyA9PSBjb25zdDBfcnR4CgkJCQkJID8gZ2l2X3NyY19yZWcKCQkJCQkgOiBn
ZW5fcnR4X1BMVVMgKEdFVF9NT0RFIChnaXZfc3JjX3JlZyksCgkJCQkJCQkgZ2l2X3NyY19yZWcs
IGdpdl9pbmMpLAoJCQkJCSAxKTsKCQkgICAgfQoJCSAgZWxzZQoJCSAgICBtYXAtPnJlZ19tYXBb
cmVnbm9dID0gZ2l2X3NyY19yZWc7CgkJfQoKCSAgICAgIC8qIFRoZSBjb25zdGFudCBiZWluZyBh
ZGRlZCBjb3VsZCBiZSB0b28gbGFyZ2UgZm9yIGFuIGFkZAoJCSBpbW1lZGlhdGUsIHNvIGNhbid0
IGRpcmVjdGx5IGVtaXQgYW4gaW5zbiBoZXJlLiAgKi8KCSAgICAgIGVtaXRfdW5yb2xsZWRfYWRk
IChnaXZfZGVzdF9yZWcsIGdpdl9zcmNfcmVnLCBnaXZfaW5jKTsKCSAgICAgIGNvcHkgPSBnZXRf
bGFzdF9pbnNuICgpOwoJICAgICAgcGF0dGVybiA9IFBBVFRFUk4gKGNvcHkpOwoJICAgIH0KCSAg
ZWxzZQoJICAgIHsKCSAgICAgIHBhdHRlcm4gPSBjb3B5X3J0eF9hbmRfc3Vic3RpdHV0ZSAocGF0
dGVybiwgbWFwKTsKCSAgICAgIGNvcHkgPSBlbWl0X2luc24gKHBhdHRlcm4pOwoJICAgIH0KCSAg
UkVHX05PVEVTIChjb3B5KSA9IGluaXRpYWxfcmVnX25vdGVfY29weSAoUkVHX05PVEVTIChpbnNu
KSwgbWFwKTsKCiNpZmRlZiBIQVZFX2NjMAoJICAvKiBJZiB0aGlzIGluc24gaXMgc2V0dGluZyBD
QzAsIGl0IG1heSBuZWVkIHRvIGxvb2sgYXQKCSAgICAgdGhlIGluc24gdGhhdCB1c2VzIENDMCB0
byBzZWUgd2hhdCB0eXBlIG9mIGluc24gaXQgaXMuCgkgICAgIEluIHRoYXQgY2FzZSwgdGhlIGNh
bGwgdG8gcmVjb2cgdmlhIHZhbGlkYXRlX2NoYW5nZSB3aWxsCgkgICAgIGZhaWwuICBTbyBkb24n
dCBzdWJzdGl0dXRlIGNvbnN0YW50cyBoZXJlLiAgSW5zdGVhZCwKCSAgICAgZG8gaXQgd2hlbiB3
ZSBlbWl0IHRoZSBmb2xsb3dpbmcgaW5zbi4KCgkgICAgIEZvciBleGFtcGxlLCBzZWUgdGhlIHB5
ci5tZCBmaWxlLiAgVGhhdCBtYWNoaW5lIGhhcyBzaWduZWQgYW5kCgkgICAgIHVuc2lnbmVkIGNv
bXBhcmVzLiAgVGhlIGNvbXBhcmUgcGF0dGVybnMgbXVzdCBjaGVjayB0aGUKCSAgICAgZm9sbG93
aW5nIGJyYW5jaCBpbnNuIHRvIHNlZSB3aGljaCB3aGF0IGtpbmQgb2YgY29tcGFyZSB0bwoJICAg
ICBlbWl0LgoKCSAgICAgSWYgdGhlIHByZXZpb3VzIGluc24gc2V0IENDMCwgc3Vic3RpdHV0ZSBj
b25zdGFudHMgb24gaXQgYXMKCSAgICAgd2VsbC4gICovCgkgIGlmIChzZXRzX2NjMF9wIChQQVRU
RVJOIChjb3B5KSkgIT0gMCkKCSAgICBjYzBfaW5zbiA9IGNvcHk7CgkgIGVsc2UKCSAgICB7Cgkg
ICAgICBpZiAoY2MwX2luc24pCgkJdHJ5X2NvbnN0YW50cyAoY2MwX2luc24sIG1hcCk7CgkgICAg
ICBjYzBfaW5zbiA9IDA7CgkgICAgICB0cnlfY29uc3RhbnRzIChjb3B5LCBtYXApOwoJICAgIH0K
I2Vsc2UKCSAgdHJ5X2NvbnN0YW50cyAoY29weSwgbWFwKTsKI2VuZGlmCgoJICAvKiBNYWtlIHNw
bGl0IGluZHVjdGlvbiB2YXJpYWJsZSBjb25zdGFudHMgYHBlcm1hbmVudCcgc2luY2Ugd2UKCSAg
ICAga25vdyB0aGVyZSBhcmUgbm8gYmFja3dhcmQgYnJhbmNoZXMgYWNyb3NzIGl0ZXJhdGlvbiB2
YXJpYWJsZQoJICAgICBzZXR0aW5ncyB3aGljaCB3b3VsZCBpbnZhbGlkYXRlIHRoaXMuICAqLwoJ
ICBpZiAoZGVzdF9yZWdfd2FzX3NwbGl0KQoJICAgIHsKCSAgICAgIGludCByZWdubyA9IFJFR05P
IChTRVRfREVTVCAocGF0dGVybikpOwoKCSAgICAgIGlmIChyZWdubyA8IFZBUlJBWV9TSVpFICht
YXAtPmNvbnN0X2VxdWl2X3ZhcnJheSkKCQkgICYmIChWQVJSQVlfQ09OU1RfRVFVSVYgKG1hcC0+
Y29uc3RfZXF1aXZfdmFycmF5LCByZWdubykuYWdlCgkJICAgICAgPT0gbWFwLT5jb25zdF9hZ2Up
KQoJCVZBUlJBWV9DT05TVF9FUVVJViAobWFwLT5jb25zdF9lcXVpdl92YXJyYXksIHJlZ25vKS5h
Z2UgPSAtMTsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgSlVNUF9JTlNOOgoJICBwYXR0ZXJuID0g
Y29weV9ydHhfYW5kX3N1YnN0aXR1dGUgKFBBVFRFUk4gKGluc24pLCBtYXApOwoJICBjb3B5ID0g
ZW1pdF9qdW1wX2luc24gKHBhdHRlcm4pOwoJICBSRUdfTk9URVMgKGNvcHkpID0gaW5pdGlhbF9y
ZWdfbm90ZV9jb3B5IChSRUdfTk9URVMgKGluc24pLCBtYXApOwoKCSAgaWYgKEpVTVBfTEFCRUwg
KGluc24pID09IHN0YXJ0X2xhYmVsICYmIGluc24gPT0gY29weV9lbmQKCSAgICAgICYmICEgbGFz
dF9pdGVyYXRpb24pCgkgICAgewoJICAgICAgLyogVGhpcyBpcyBhIGJyYW5jaCB0byB0aGUgYmVn
aW5uaW5nIG9mIHRoZSBsb29wOyB0aGlzIGlzIHRoZQoJCSBsYXN0IGluc24gYmVpbmcgY29waWVk
OyBhbmQgdGhpcyBpcyBub3QgdGhlIGxhc3QgaXRlcmF0aW9uLgoJCSBJbiB0aGlzIGNhc2UsIHdl
IHdhbnQgdG8gY2hhbmdlIHRoZSBvcmlnaW5hbCBmYWxsIHRocm91Z2gKCQkgY2FzZSB0byBiZSBh
IGJyYW5jaCBwYXN0IHRoZSBlbmQgb2YgdGhlIGxvb3AsIGFuZCB0aGUKCQkgb3JpZ2luYWwganVt
cCBsYWJlbCBjYXNlIHRvIGZhbGxfdGhyb3VnaC4gICovCgoJICAgICAgaWYgKGludmVydF9leHAg
KHBhdHRlcm4sIGNvcHkpKQoJCXsKCQkgIGlmICghIHJlZGlyZWN0X2V4cCAoJnBhdHRlcm4sCgkJ
CQkgICAgICBnZXRfbGFiZWxfZnJvbV9tYXAgKG1hcCwKCQkJCQkJCSAgQ09ERV9MQUJFTF9OVU1C
RVIKCQkJCQkJCSAgKEpVTVBfTEFCRUwgKGluc24pKSksCgkJCQkgICAgICBleGl0X2xhYmVsLCBj
b3B5KSkKCQkgICAgYWJvcnQgKCk7CgkJfQoJICAgICAgZWxzZQoJCXsKCQkgIHJ0eCBqbXA7CgkJ
ICBydHggbGFiID0gZ2VuX2xhYmVsX3J0eCAoKTsKCQkgIC8qIENhbid0IGRvIGl0IGJ5IHJldmVy
c2luZyB0aGUganVtcCAocHJvYmFibHkgYmVjYXVzZSB3ZQoJCSAgICAgY291bGRuJ3QgcmV2ZXJz
ZSB0aGUgY29uZGl0aW9ucyksIHNvIGVtaXQgYSBuZXcKCQkgICAgIGp1bXBfaW5zbiBhZnRlciBD
T1BZLCBhbmQgcmVkaXJlY3QgdGhlIGp1bXAgYXJvdW5kCgkJICAgICB0aGF0LiAgKi8KCQkgIGpt
cCA9IGVtaXRfanVtcF9pbnNuX2FmdGVyIChnZW5fanVtcCAoZXhpdF9sYWJlbCksIGNvcHkpOwoJ
CSAgam1wID0gZW1pdF9iYXJyaWVyX2FmdGVyIChqbXApOwoJCSAgZW1pdF9sYWJlbF9hZnRlciAo
bGFiLCBqbXApOwoJCSAgTEFCRUxfTlVTRVMgKGxhYikgPSAwOwoJCSAgaWYgKCEgcmVkaXJlY3Rf
ZXhwICgmcGF0dGVybiwKCQkJCSAgICAgIGdldF9sYWJlbF9mcm9tX21hcCAobWFwLAoJCQkJCQkJ
ICBDT0RFX0xBQkVMX05VTUJFUgoJCQkJCQkJICAoSlVNUF9MQUJFTCAoaW5zbikpKSwKCQkJCSAg
ICAgIGxhYiwgY29weSkpCgkJICAgIGFib3J0ICgpOwoJCX0KCSAgICB9CgojaWZkZWYgSEFWRV9j
YzAKCSAgaWYgKGNjMF9pbnNuKQoJICAgIHRyeV9jb25zdGFudHMgKGNjMF9pbnNuLCBtYXApOwoJ
ICBjYzBfaW5zbiA9IDA7CiNlbmRpZgoJICB0cnlfY29uc3RhbnRzIChjb3B5LCBtYXApOwoKCSAg
LyogU2V0IHRoZSBqdW1wIGxhYmVsIG9mIENPUFkgY29ycmVjdGx5IHRvIGF2b2lkIHByb2JsZW1z
IHdpdGgKCSAgICAgbGF0ZXIgcGFzc2VzIG9mIHVucm9sbF9sb29wLCBpZiBJTlNOIGhhZCBqdW1w
IGxhYmVsIHNldC4gICovCgkgIGlmIChKVU1QX0xBQkVMIChpbnNuKSkKCSAgICB7CgkgICAgICBy
dHggbGFiZWwgPSAwOwoKCSAgICAgIC8qIENhbid0IHVzZSB0aGUgbGFiZWxfbWFwIGZvciBldmVy
eSBpbnNuLCBzaW5jZSB0aGlzIG1heSBiZQoJCSB0aGUgYmFja3dhcmQgYnJhbmNoLCBhbmQgaGVu
Y2UgdGhlIGxhYmVsIHdhcyBub3QgbWFwcGVkLiAgKi8KCSAgICAgIGlmICgoc2V0ID0gc2luZ2xl
X3NldCAoY29weSkpKQoJCXsKCQkgIHRlbSA9IFNFVF9TUkMgKHNldCk7CgkJICBpZiAoR0VUX0NP
REUgKHRlbSkgPT0gTEFCRUxfUkVGKQoJCSAgICBsYWJlbCA9IFhFWFAgKHRlbSwgMCk7CgkJICBl
bHNlIGlmIChHRVRfQ09ERSAodGVtKSA9PSBJRl9USEVOX0VMU0UpCgkJICAgIHsKCQkgICAgICBp
ZiAoWEVYUCAodGVtLCAxKSAhPSBwY19ydHgpCgkJCWxhYmVsID0gWEVYUCAoWEVYUCAodGVtLCAx
KSwgMCk7CgkJICAgICAgZWxzZQoJCQlsYWJlbCA9IFhFWFAgKFhFWFAgKHRlbSwgMiksIDApOwoJ
CSAgICB9CgkJfQoKCSAgICAgIGlmIChsYWJlbCAmJiBHRVRfQ09ERSAobGFiZWwpID09IENPREVf
TEFCRUwpCgkJSlVNUF9MQUJFTCAoY29weSkgPSBsYWJlbDsKCSAgICAgIGVsc2UKCQl7CgkJICAv
KiBBbiB1bnJlY29nbml6YWJsZSBqdW1wIGluc24sIHByb2JhYmx5IHRoZSBlbnRyeSBqdW1wCgkJ
ICAgICBmb3IgYSBzd2l0Y2ggc3RhdGVtZW50LiAgVGhpcyBsYWJlbCBtdXN0IGhhdmUgYmVlbiBt
YXBwZWQsCgkJICAgICBzbyBqdXN0IHVzZSB0aGUgbGFiZWxfbWFwIHRvIGdldCB0aGUgbmV3IGp1
bXAgbGFiZWwuICAqLwoJCSAgSlVNUF9MQUJFTCAoY29weSkKCQkgICAgPSBnZXRfbGFiZWxfZnJv
bV9tYXAgKG1hcCwKCQkJCQkgIENPREVfTEFCRUxfTlVNQkVSIChKVU1QX0xBQkVMIChpbnNuKSkp
OwoJCX0KCgkgICAgICAvKiBJZiB0aGlzIGlzIGEgbm9uLWxvY2FsIGp1bXAsIHRoZW4gbXVzdCBp
bmNyZWFzZSB0aGUgbGFiZWwKCQkgdXNlIGNvdW50IHNvIHRoYXQgdGhlIGxhYmVsIHdpbGwgbm90
IGJlIGRlbGV0ZWQgd2hlbiB0aGUKCQkgb3JpZ2luYWwganVtcCBpcyBkZWxldGVkLiAgKi8KCSAg
ICAgIExBQkVMX05VU0VTIChKVU1QX0xBQkVMIChjb3B5KSkrKzsKCSAgICB9CgkgIGVsc2UgaWYg
KEdFVF9DT0RFIChQQVRURVJOIChjb3B5KSkgPT0gQUREUl9WRUMKCQkgICB8fCBHRVRfQ09ERSAo
UEFUVEVSTiAoY29weSkpID09IEFERFJfRElGRl9WRUMpCgkgICAgewoJICAgICAgcnR4IHBhdCA9
IFBBVFRFUk4gKGNvcHkpOwoJICAgICAgaW50IGRpZmZfdmVjX3AgPSBHRVRfQ09ERSAocGF0KSA9
PSBBRERSX0RJRkZfVkVDOwoJICAgICAgaW50IGxlbiA9IFhWRUNMRU4gKHBhdCwgZGlmZl92ZWNf
cCk7CgkgICAgICBpbnQgaTsKCgkgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCgkJTEFC
RUxfTlVTRVMgKFhFWFAgKFhWRUNFWFAgKHBhdCwgZGlmZl92ZWNfcCwgaSksIDApKSsrOwoJICAg
IH0KCgkgIC8qIElmIHRoaXMgdXNlZCB0byBiZSBhIGNvbmRpdGlvbmFsIGp1bXAgaW5zbiBidXQg
d2hvc2UgYnJhbmNoCgkgICAgIGRpcmVjdGlvbiBpcyBub3cga25vd24sIHdlIG11c3QgZG8gc29t
ZXRoaW5nIHNwZWNpYWwuICAqLwoJICBpZiAoY29uZGp1bXBfcCAoaW5zbikgJiYgIXNpbXBsZWp1
bXBfcCAoaW5zbikgJiYgbWFwLT5sYXN0X3BjX3ZhbHVlKQoJICAgIHsKI2lmZGVmIEhBVkVfY2Mw
CgkgICAgICAvKiBUaGUgcHJldmlvdXMgaW5zbiBzZXQgY2MwIGZvciB1cy4gIFNvIGRlbGV0ZSBp
dC4gICovCgkgICAgICBkZWxldGVfaW5zbiAoUFJFVl9JTlNOIChjb3B5KSk7CiNlbmRpZgoKCSAg
ICAgIC8qIElmIHRoaXMgaXMgbm93IGEgbm8tb3AsIGRlbGV0ZSBpdC4gICovCgkgICAgICBpZiAo
bWFwLT5sYXN0X3BjX3ZhbHVlID09IHBjX3J0eCkKCQl7CgkJICAvKiBEb24ndCBsZXQgZGVsZXRl
X2luc24gZGVsZXRlIHRoZSBsYWJlbCByZWZlcmVuY2VkIGhlcmUsCgkJICAgICBiZWNhdXNlIHdl
IG1pZ2h0IHBvc3NpYmx5IG5lZWQgaXQgbGF0ZXIgZm9yIHNvbWUgb3RoZXIKCQkgICAgIGluc3Ry
dWN0aW9uIGluIHRoZSBsb29wLiAgKi8KCQkgIGlmIChKVU1QX0xBQkVMIChjb3B5KSkKCQkgICAg
TEFCRUxfTlVTRVMgKEpVTVBfTEFCRUwgKGNvcHkpKSsrOwoJCSAgZGVsZXRlX2luc24gKGNvcHkp
OwoJCSAgaWYgKEpVTVBfTEFCRUwgKGNvcHkpKQoJCSAgICBMQUJFTF9OVVNFUyAoSlVNUF9MQUJF
TCAoY29weSkpLS07CgkJICBjb3B5ID0gMDsKCQl9CgkgICAgICBlbHNlCgkJLyogT3RoZXJ3aXNl
LCB0aGlzIGlzIHVuY29uZGl0aW9uYWwganVtcCBzbyB3ZSBtdXN0IHB1dCBhCgkJICAgQkFSUklF
UiBhZnRlciBpdC4gIFdlIGNvdWxkIGRvIHNvbWUgZGVhZCBjb2RlIGVsaW1pbmF0aW9uCgkJICAg
aGVyZSwgYnV0IGp1bXAuYyB3aWxsIGRvIGl0IGp1c3QgYXMgd2VsbC4gICovCgkJZW1pdF9iYXJy
aWVyICgpOwoJICAgIH0KCSAgYnJlYWs7CgoJY2FzZSBDQUxMX0lOU046CgkgIHBhdHRlcm4gPSBj
b3B5X3J0eF9hbmRfc3Vic3RpdHV0ZSAoUEFUVEVSTiAoaW5zbiksIG1hcCk7CgkgIGNvcHkgPSBl
bWl0X2NhbGxfaW5zbiAocGF0dGVybik7CgkgIFJFR19OT1RFUyAoY29weSkgPSBpbml0aWFsX3Jl
Z19ub3RlX2NvcHkgKFJFR19OT1RFUyAoaW5zbiksIG1hcCk7CgoJICAvKiBCZWNhdXNlIHRoZSBV
U0FHRSBpbmZvcm1hdGlvbiBwb3RlbnRpYWxseSBjb250YWlucyBvYmplY3RzIG90aGVyCgkgICAg
IHRoYW4gaGFyZCByZWdpc3RlcnMsIHdlIG5lZWQgdG8gY29weSBpdC4gICovCgkgIENBTExfSU5T
Tl9GVU5DVElPTl9VU0FHRSAoY29weSkKCSAgICA9IGNvcHlfcnR4X2FuZF9zdWJzdGl0dXRlIChD
QUxMX0lOU05fRlVOQ1RJT05fVVNBR0UgKGluc24pLCBtYXApOwoKI2lmZGVmIEhBVkVfY2MwCgkg
IGlmIChjYzBfaW5zbikKCSAgICB0cnlfY29uc3RhbnRzIChjYzBfaW5zbiwgbWFwKTsKCSAgY2Mw
X2luc24gPSAwOwojZW5kaWYKCSAgdHJ5X2NvbnN0YW50cyAoY29weSwgbWFwKTsKCgkgIC8qIEJl
IGxhenkgYW5kIGFzc3VtZSBDQUxMX0lOU05zIGNsb2JiZXIgYWxsIGhhcmQgcmVnaXN0ZXJzLiAg
Ki8KCSAgZm9yIChpID0gMDsgaSA8IEZJUlNUX1BTRVVET19SRUdJU1RFUjsgaSsrKQoJICAgIFZB
UlJBWV9DT05TVF9FUVVJViAobWFwLT5jb25zdF9lcXVpdl92YXJyYXksIGkpLnJ0eCA9IDA7Cgkg
IGJyZWFrOwoKCWNhc2UgQ09ERV9MQUJFTDoKCSAgLyogSWYgdGhpcyBpcyB0aGUgbG9vcCBzdGFy
dCBsYWJlbCwgdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGVtaXQgYQoJICAgICBjb3B5IG9mIHRoaXMg
bGFiZWwgc2luY2Ugbm8gb25lIHdpbGwgdXNlIGl0LiAgKi8KCgkgIGlmIChpbnNuICE9IHN0YXJ0
X2xhYmVsKQoJICAgIHsKCSAgICAgIGNvcHkgPSBlbWl0X2xhYmVsIChnZXRfbGFiZWxfZnJvbV9t
YXAgKG1hcCwKCQkJCQkJICAgICBDT0RFX0xBQkVMX05VTUJFUiAoaW5zbikpKTsKCSAgICAgIG1h
cC0+Y29uc3RfYWdlKys7CgkgICAgfQoJICBicmVhazsKCgljYXNlIEJBUlJJRVI6CgkgIGNvcHkg
PSBlbWl0X2JhcnJpZXIgKCk7CgkgIGJyZWFrOwoKCWNhc2UgTk9URToKCSAgLyogVlRPUCBhbmQg
Q09OVCBub3RlcyBhcmUgdmFsaWQgb25seSBiZWZvcmUgdGhlIGxvb3AgZXhpdCB0ZXN0LgoJICAg
ICBJZiBwbGFjZWQgYW55d2hlcmUgZWxzZSwgbG9vcCBtYXkgZ2VuZXJhdGUgYmFkIGNvZGUuICAq
LwoJICAvKiBCQVNJQ19CTE9DSyBub3RlcyBleGlzdCB0byBzdGFiaWxpemUgYmFzaWMgYmxvY2sg
c3RydWN0dXJlcyB3aXRoCgkgICAgIHRoZSBhc3NvY2lhdGVkIHJ0bC4gIFdlIGRvIG5vdCB3YW50
IHRvIHNoYXJlIHRoZSBzdHJ1Y3R1cmUgaW4gCgkgICAgIHRoaXMgbmV3IGJsb2NrLiAgKi8KCgkg
IGlmIChOT1RFX0xJTkVfTlVNQkVSIChpbnNuKSAhPSBOT1RFX0lOU05fREVMRVRFRAoJICAgICAg
JiYgTk9URV9MSU5FX05VTUJFUiAoaW5zbikgIT0gTk9URV9JTlNOX0JBU0lDX0JMT0NLCgkgICAg
ICAmJiAoKE5PVEVfTElORV9OVU1CRVIgKGluc24pICE9IE5PVEVfSU5TTl9MT09QX1ZUT1AKCQkg
ICAmJiBOT1RFX0xJTkVfTlVNQkVSIChpbnNuKSAhPSBOT1RFX0lOU05fTE9PUF9DT05UKQoJCSAg
fHwgKGxhc3RfaXRlcmF0aW9uICYmIHVucm9sbF90eXBlICE9IFVOUk9MTF9DT01QTEVURUxZKSkp
CgkgICAgY29weSA9IGVtaXRfbm90ZSAoTk9URV9TT1VSQ0VfRklMRSAoaW5zbiksCgkJCSAgICAg
IE5PVEVfTElORV9OVU1CRVIgKGluc24pKTsKCSAgZWxzZQoJICAgIGNvcHkgPSAwOwoJICBicmVh
azsKCglkZWZhdWx0OgoJICBhYm9ydCAoKTsKCSAgYnJlYWs7Cgl9CgogICAgICBtYXAtPmluc25f
bWFwW0lOU05fVUlEIChpbnNuKV0gPSBjb3B5OwogICAgfQogIHdoaWxlIChpbnNuICE9IGNvcHlf
ZW5kKTsKCiAgLyogTm93IGZpbmlzaCBjb3BpbmcgdGhlIFJFR19OT1RFUy4gICovCiAgaW5zbiA9
IGNvcHlfc3RhcnQ7CiAgZG8KICAgIHsKICAgICAgaW5zbiA9IE5FWFRfSU5TTiAoaW5zbik7CiAg
ICAgIGlmICgoR0VUX0NPREUgKGluc24pID09IElOU04gfHwgR0VUX0NPREUgKGluc24pID09IEpV
TVBfSU5TTgoJICAgfHwgR0VUX0NPREUgKGluc24pID09IENBTExfSU5TTikKCSAgJiYgbWFwLT5p
bnNuX21hcFtJTlNOX1VJRCAoaW5zbildKQoJZmluYWxfcmVnX25vdGVfY29weSAoUkVHX05PVEVT
IChtYXAtPmluc25fbWFwW0lOU05fVUlEIChpbnNuKV0pLCBtYXApOwogICAgfQogIHdoaWxlIChp
bnNuICE9IGNvcHlfZW5kKTsKCiAgLyogVGhlcmUgbWF5IGJlIG5vdGVzIGJldHdlZW4gY29weV9u
b3Rlc19mcm9tIGFuZCBsb29wX2VuZC4gIEVtaXQgYSBjb3B5IG9mCiAgICAgZWFjaCBvZiB0aGVz
ZSBub3RlcyBoZXJlLCBzaW5jZSB0aGVyZSBtYXkgYmUgc29tZSBpbXBvcnRhbnQgb25lcywgc3Vj
aCBhcwogICAgIE5PVEVfSU5TTl9CTE9DS19FTkQgbm90ZXMsIGluIHRoaXMgZ3JvdXAuICBXZSBk
b24ndCBkbyB0aGlzIG9uIHRoZSBsYXN0CiAgICAgaXRlcmF0aW9uLCBiZWNhdXNlIHRoZSBvcmln
aW5hbCBub3RlcyB3b24ndCBiZSBkZWxldGVkLgoKICAgICBXZSBjYW4ndCB1c2UgaW5zZXJ0X2Jl
Zm9yZSBoZXJlLCBiZWNhdXNlIHdoZW4gZnJvbSBwcmVjb25kaXRpb25pbmcsCiAgICAgaW5zZXJ0
X2JlZm9yZSBwb2ludHMgYmVmb3JlIHRoZSBsb29wLiAgV2UgY2FuJ3QgdXNlIGNvcHlfZW5kLCBi
ZWNhdXNlCiAgICAgdGhlcmUgbWF5IGJlIGluc25zIGFscmVhZHkgaW5zZXJ0ZWQgYWZ0ZXIgaXQg
KHdoaWNoIHdlIGRvbid0IHdhbnQgdG8KICAgICBjb3B5KSB3aGVuIG5vdCBmcm9tIHByZWNvbmRp
dGlvbmluZyBjb2RlLiAgKi8KCiAgaWYgKCEgbGFzdF9pdGVyYXRpb24pCiAgICB7CiAgICAgIGZv
ciAoaW5zbiA9IGNvcHlfbm90ZXNfZnJvbTsgaW5zbiAhPSBsb29wX2VuZDsgaW5zbiA9IE5FWFRf
SU5TTiAoaW5zbikpCgl7CgkgIC8qIFZUT1Agbm90ZXMgYXJlIHZhbGlkIG9ubHkgYmVmb3JlIHRo
ZSBsb29wIGV4aXQgdGVzdC4KCSAgICAgSWYgcGxhY2VkIGFueXdoZXJlIGVsc2UsIGxvb3AgbWF5
IGdlbmVyYXRlIGJhZCBjb2RlLgoJICAgICBUaGVyZSBpcyBubyBuZWVkIHRvIHRlc3QgZm9yIE5P
VEVfSU5TTl9MT09QX0NPTlQgbm90ZXMKCSAgICAgaGVyZSwgc2luY2UgQ09QWV9OT1RFU19GUk9N
IHdpbGwgYmUgYXQgbW9zdCBvbmUgb3IgdHdvIChmb3IgY2MwKQoJICAgICBpbnN0cnVjdGlvbnMg
YmVmb3JlIHRoZSBsYXN0IGluc24gaW4gdGhlIGxvb3AsIGFuZCBpZiB0aGUKCSAgICAgZW5kIHRl
c3QgaXMgdGhhdCBzaG9ydCwgdGhlcmUgd2lsbCBiZSBhIFZUT1Agbm90ZSBiZXR3ZWVuCgkgICAg
IHRoZSBDT05UIG5vdGUgYW5kIHRoZSB0ZXN0LiAgKi8KCSAgaWYgKEdFVF9DT0RFIChpbnNuKSA9
PSBOT1RFCgkgICAgICAmJiBOT1RFX0xJTkVfTlVNQkVSIChpbnNuKSAhPSBOT1RFX0lOU05fREVM
RVRFRAoJICAgICAgJiYgTk9URV9MSU5FX05VTUJFUiAoaW5zbikgIT0gTk9URV9JTlNOX0JBU0lD
X0JMT0NLCgkgICAgICAmJiBOT1RFX0xJTkVfTlVNQkVSIChpbnNuKSAhPSBOT1RFX0lOU05fTE9P
UF9WVE9QKQoJICAgIGVtaXRfbm90ZSAoTk9URV9TT1VSQ0VfRklMRSAoaW5zbiksIE5PVEVfTElO
RV9OVU1CRVIgKGluc24pKTsKCX0KICAgIH0KCiAgaWYgKGZpbmFsX2xhYmVsICYmIExBQkVMX05V
U0VTIChmaW5hbF9sYWJlbCkgPiAwKQogICAgZW1pdF9sYWJlbCAoZmluYWxfbGFiZWwpOwoKICB0
ZW0gPSBnZW5fc2VxdWVuY2UgKCk7CiAgZW5kX3NlcXVlbmNlICgpOwogIGVtaXRfaW5zbl9iZWZv
cmUgKHRlbSwgaW5zZXJ0X2JlZm9yZSk7Cn0KDAovKiBFbWl0IGFuIGluc24sIHVzaW5nIHRoZSBl
eHBhbmRfYmlub3AgdG8gZW5zdXJlIHRoYXQgYSB2YWxpZCBpbnNuIGlzCiAgIGVtaXR0ZWQuICBU
aGlzIHdpbGwgY29ycmVjdGx5IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgaW5jcmVtZW50IHZh
bHVlCiAgIHdvbid0IGZpdCBpbiB0aGUgaW1tZWRpYXRlIGZpZWxkIG9mIGEgUExVUyBpbnNucy4g
ICovCgp2b2lkCmVtaXRfdW5yb2xsZWRfYWRkIChkZXN0X3JlZywgc3JjX3JlZywgaW5jcmVtZW50
KQogICAgIHJ0eCBkZXN0X3JlZywgc3JjX3JlZywgaW5jcmVtZW50Owp7CiAgcnR4IHJlc3VsdDsK
CiAgcmVzdWx0ID0gZXhwYW5kX2Jpbm9wIChHRVRfTU9ERSAoZGVzdF9yZWcpLCBhZGRfb3B0YWIs
IHNyY19yZWcsIGluY3JlbWVudCwKCQkJIGRlc3RfcmVnLCAwLCBPUFRBQl9MSUJfV0lERU4pOwoK
ICBpZiAoZGVzdF9yZWcgIT0gcmVzdWx0KQogICAgZW1pdF9tb3ZlX2luc24gKGRlc3RfcmVnLCBy
ZXN1bHQpOwp9CgwKLyogU2VhcmNoZXMgdGhlIGluc25zIGJldHdlZW4gSU5TTiBhbmQgTE9PUF9F
TkQuICBSZXR1cm5zIDEgaWYgdGhlcmUKICAgaXMgYSBiYWNrd2FyZCBicmFuY2ggaW4gdGhhdCBy
YW5nZSB0aGF0IGJyYW5jaGVzIHRvIHNvbWV3aGVyZSBiZXR3ZWVuCiAgIExPT1BfU1RBUlQgYW5k
IElOU04uICBSZXR1cm5zIDAgb3RoZXJ3aXNlLiAgKi8KCi8qID8/PyBUaGlzIGlzIHF1YWRyYXRp
YyBhbGdvcml0aG0uICBDb3VsZCBiZSByZXdyaXR0ZW4gdG8gYmUgbGluZWFyLgogICBJbiBwcmFj
dGljZSwgdGhpcyBpcyBub3QgYSBwcm9ibGVtLCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgc2Vs
ZG9tIGNhbGxlZCwKICAgYW5kIHVzZXMgYSBuZWdsaWdpYmxlIGFtb3VudCBvZiBDUFUgdGltZSBv
biBhdmVyYWdlLiAgKi8KCmludApiYWNrX2JyYW5jaF9pbl9yYW5nZV9wIChpbnNuLCBsb29wX3N0
YXJ0LCBsb29wX2VuZCkKICAgICBydHggaW5zbjsKICAgICBydHggbG9vcF9zdGFydCwgbG9vcF9l
bmQ7CnsKICBydHggcCwgcSwgdGFyZ2V0X2luc247CiAgcnR4IG9yaWdfbG9vcF9lbmQgPSBsb29w
X2VuZDsKCiAgLyogU3RvcCBiZWZvcmUgd2UgZ2V0IHRvIHRoZSBiYWNrd2FyZCBicmFuY2ggYXQg
dGhlIGVuZCBvZiB0aGUgbG9vcC4gICovCiAgbG9vcF9lbmQgPSBwcmV2X25vbm5vdGVfaW5zbiAo
bG9vcF9lbmQpOwogIGlmIChHRVRfQ09ERSAobG9vcF9lbmQpID09IEJBUlJJRVIpCiAgICBsb29w
X2VuZCA9IFBSRVZfSU5TTiAobG9vcF9lbmQpOwoKICAvKiBDaGVjayBpbiBjYXNlIGluc24gaGFz
IGJlZW4gZGVsZXRlZCwgc2VhcmNoIGZvcndhcmQgZm9yIGZpcnN0IG5vbgogICAgIGRlbGV0ZWQg
aW5zbiBmb2xsb3dpbmcgaXQuICAqLwogIHdoaWxlIChJTlNOX0RFTEVURURfUCAoaW5zbikpCiAg
ICBpbnNuID0gTkVYVF9JTlNOIChpbnNuKTsKCiAgLyogQ2hlY2sgZm9yIHRoZSBjYXNlIHdoZXJl
IGluc24gaXMgdGhlIGxhc3QgaW5zbiBpbiB0aGUgbG9vcC4gIERlYWwKICAgICB3aXRoIHRoZSBj
YXNlIHdoZXJlIElOU04gd2FzIGEgZGVsZXRlZCBsb29wIHRlc3QgaW5zbiwgaW4gd2hpY2ggY2Fz
ZQogICAgIGl0IHdpbGwgbm93IGJlIHRoZSBOT1RFX0xPT1BfRU5ELiAgKi8KICBpZiAoaW5zbiA9
PSBsb29wX2VuZCB8fCBpbnNuID09IG9yaWdfbG9vcF9lbmQpCiAgICByZXR1cm4gMDsKCiAgZm9y
IChwID0gTkVYVF9JTlNOIChpbnNuKTsgcCAhPSBsb29wX2VuZDsgcCA9IE5FWFRfSU5TTiAocCkp
CiAgICB7CiAgICAgIGlmIChHRVRfQ09ERSAocCkgPT0gSlVNUF9JTlNOKQoJewoJICB0YXJnZXRf
aW5zbiA9IEpVTVBfTEFCRUwgKHApOwoKCSAgLyogU2VhcmNoIGZyb20gbG9vcF9zdGFydCB0byBp
bnNuLCB0byBzZWUgaWYgb25lIG9mIHRoZW0gaXMKCSAgICAgdGhlIHRhcmdldF9pbnNuLiAgV2Ug
Y2FuJ3QgdXNlIElOU05fTFVJRCBjb21wYXJpc29ucyBoZXJlLAoJICAgICBzaW5jZSBpbnNuIG1h
eSBub3QgaGF2ZSBhbiBMVUlEIGVudHJ5LiAgKi8KCSAgZm9yIChxID0gbG9vcF9zdGFydDsgcSAh
PSBpbnNuOyBxID0gTkVYVF9JTlNOIChxKSkKCSAgICBpZiAocSA9PSB0YXJnZXRfaW5zbikKCSAg
ICAgIHJldHVybiAxOwoJfQogICAgfQoKICByZXR1cm4gMDsKfQoKLyogVHJ5IHRvIGdlbmVyYXRl
IHRoZSBzaW1wbGVzdCBydHggZm9yIHRoZSBleHByZXNzaW9uCiAgIChQTFVTIChNVUxUIG11bHQx
IG11bHQyKSBhZGQxKS4gIFRoaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGluaXRpYWwKICAg
dmFsdWUgb2YgZ2l2J3MuICAqLwoKc3RhdGljIHJ0eApmb2xkX3J0eF9tdWx0X2FkZCAobXVsdDEs
IG11bHQyLCBhZGQxLCBtb2RlKQogICAgIHJ0eCBtdWx0MSwgbXVsdDIsIGFkZDE7CiAgICAgZW51
bSBtYWNoaW5lX21vZGUgbW9kZTsKewogIHJ0eCB0ZW1wLCBtdWx0X3JlczsKICBydHggcmVzdWx0
OwoKICAvKiBUaGUgbW9kZXMgbXVzdCBhbGwgYmUgdGhlIHNhbWUuICBUaGlzIHNob3VsZCBhbHdh
eXMgYmUgdHJ1ZS4gIEZvciBub3csCiAgICAgY2hlY2sgdG8gbWFrZSBzdXJlLiAgKi8KICBpZiAo
KEdFVF9NT0RFIChtdWx0MSkgIT0gbW9kZSAmJiBHRVRfTU9ERSAobXVsdDEpICE9IFZPSURtb2Rl
KQogICAgICB8fCAoR0VUX01PREUgKG11bHQyKSAhPSBtb2RlICYmIEdFVF9NT0RFIChtdWx0Mikg
IT0gVk9JRG1vZGUpCiAgICAgIHx8IChHRVRfTU9ERSAoYWRkMSkgIT0gbW9kZSAmJiBHRVRfTU9E
RSAoYWRkMSkgIT0gVk9JRG1vZGUpKQogICAgYWJvcnQgKCk7CgogIC8qIEVuc3VyZSB0aGF0IGlm
IGF0IGxlYXN0IG9uZSBvZiBtdWx0MS9tdWx0MiBhcmUgY29uc3RhbnQsIHRoZW4gbXVsdDIKICAg
ICB3aWxsIGJlIGEgY29uc3RhbnQuICAqLwogIGlmIChHRVRfQ09ERSAobXVsdDEpID09IENPTlNU
X0lOVCkKICAgIHsKICAgICAgdGVtcCA9IG11bHQyOwogICAgICBtdWx0MiA9IG11bHQxOwogICAg
ICBtdWx0MSA9IHRlbXA7CiAgICB9CgogIG11bHRfcmVzID0gc2ltcGxpZnlfYmluYXJ5X29wZXJh
dGlvbiAoTVVMVCwgbW9kZSwgbXVsdDEsIG11bHQyKTsKICBpZiAoISBtdWx0X3JlcykKICAgIG11
bHRfcmVzID0gZ2VuX3J0eF9NVUxUIChtb2RlLCBtdWx0MSwgbXVsdDIpOwoKICAvKiBBZ2Fpbiwg
cHV0IHRoZSBjb25zdGFudCBzZWNvbmQuICAqLwogIGlmIChHRVRfQ09ERSAoYWRkMSkgPT0gQ09O
U1RfSU5UKQogICAgewogICAgICB0ZW1wID0gYWRkMTsKICAgICAgYWRkMSA9IG11bHRfcmVzOwog
ICAgICBtdWx0X3JlcyA9IHRlbXA7CiAgICB9CgogIHJlc3VsdCA9IHNpbXBsaWZ5X2JpbmFyeV9v
cGVyYXRpb24gKFBMVVMsIG1vZGUsIGFkZDEsIG11bHRfcmVzKTsKICBpZiAoISByZXN1bHQpCiAg
ICByZXN1bHQgPSBnZW5fcnR4X1BMVVMgKG1vZGUsIGFkZDEsIG11bHRfcmVzKTsKCiAgcmV0dXJu
IHJlc3VsdDsKfQoKLyogU2VhcmNoZXMgdGhlIGxpc3Qgb2YgaW5kdWN0aW9uIHN0cnVjdCdzIGZv
ciB0aGUgYml2IEJMLCB0byB0cnkgdG8gY2FsY3VsYXRlCiAgIHRoZSB0b3RhbCBpbmNyZW1lbnQg
dmFsdWUgZm9yIG9uZSBpdGVyYXRpb24gb2YgdGhlIGxvb3AgYXMgYSBjb25zdGFudC4KCiAgIFJl
dHVybnMgdGhlIGluY3JlbWVudCB2YWx1ZSBhcyBhbiBydHgsIHNpbXBsaWZpZWQgYXMgbXVjaCBh
cyBwb3NzaWJsZSwKICAgaWYgaXQgY2FuIGJlIGNhbGN1bGF0ZWQuICBPdGhlcndpc2UsIHJldHVy
bnMgMC4gICovCgpydHgKYml2X3RvdGFsX2luY3JlbWVudCAoYmwsIGxvb3Bfc3RhcnQsIGxvb3Bf
ZW5kKQogICAgIHN0cnVjdCBpdl9jbGFzcyAqYmw7CiAgICAgcnR4IGxvb3Bfc3RhcnQsIGxvb3Bf
ZW5kOwp7CiAgc3RydWN0IGluZHVjdGlvbiAqdjsKICBydHggcmVzdWx0OwoKICAvKiBGb3IgaW5j
cmVtZW50LCBtdXN0IGNoZWNrIGV2ZXJ5IGluc3RydWN0aW9uIHRoYXQgc2V0cyBpdC4gIEVhY2gK
ICAgICBpbnN0cnVjdGlvbiBtdXN0IGJlIGV4ZWN1dGVkIG9ubHkgb25jZSBlYWNoIHRpbWUgdGhy
b3VnaCB0aGUgbG9vcC4KICAgICBUbyB2ZXJpZnkgdGhpcywgd2UgY2hlY2sgdGhhdCB0aGUgaW5z
biBpcyBhbHdheXMgZXhlY3V0ZWQsIGFuZCB0aGF0CiAgICAgdGhlcmUgYXJlIG5vIGJhY2t3YXJk
IGJyYW5jaGVzIGFmdGVyIHRoZSBpbnNuIHRoYXQgYnJhbmNoIHRvIGJlZm9yZSBpdC4KICAgICBB
bHNvLCB0aGUgaW5zbiBtdXN0IGhhdmUgYSBtdWx0X3ZhbCBvZiBvbmUgKHRvIG1ha2Ugc3VyZSBp
dCByZWFsbHkgaXMKICAgICBhbiBpbmNyZW1lbnQpLiAgKi8KCiAgcmVzdWx0ID0gY29uc3QwX3J0
eDsKICBmb3IgKHYgPSBibC0+Yml2OyB2OyB2ID0gdi0+bmV4dF9pdikKICAgIHsKICAgICAgaWYg
KHYtPmFsd2F5c19jb21wdXRhYmxlICYmIHYtPm11bHRfdmFsID09IGNvbnN0MV9ydHgKCSAgJiYg
ISB2LT5tYXliZV9tdWx0aXBsZSkKCXJlc3VsdCA9IGZvbGRfcnR4X211bHRfYWRkIChyZXN1bHQs
IGNvbnN0MV9ydHgsIHYtPmFkZF92YWwsIHYtPm1vZGUpOwogICAgICBlbHNlCglyZXR1cm4gMDsK
ICAgIH0KCiAgcmV0dXJuIHJlc3VsdDsKfQoKLyogRGV0ZXJtaW5lIHRoZSBpbml0aWFsIHZhbHVl
IG9mIHRoZSBpdGVyYXRpb24gdmFyaWFibGUsIGFuZCB0aGUgYW1vdW50CiAgIHRoYXQgaXQgaXMg
aW5jcmVtZW50ZWQgZWFjaCBsb29wLiAgVXNlIHRoZSB0YWJsZXMgY29uc3RydWN0ZWQgYnkKICAg
dGhlIHN0cmVuZ3RoIHJlZHVjdGlvbiBwYXNzIHRvIGNhbGN1bGF0ZSB0aGVzZSB2YWx1ZXMuCgog
ICBJbml0aWFsX3ZhbHVlIGFuZC9vciBpbmNyZW1lbnQgYXJlIHNldCB0byB6ZXJvIGlmIHRoZWly
IHZhbHVlcyBjb3VsZCBub3QKICAgYmUgY2FsY3VsYXRlZC4gICovCgpzdGF0aWMgdm9pZAppdGVy
YXRpb25faW5mbyAoaXRlcmF0aW9uX3ZhciwgaW5pdGlhbF92YWx1ZSwgaW5jcmVtZW50LCBsb29w
X3N0YXJ0LCBsb29wX2VuZCkKICAgICBydHggaXRlcmF0aW9uX3ZhciwgKmluaXRpYWxfdmFsdWUs
ICppbmNyZW1lbnQ7CiAgICAgcnR4IGxvb3Bfc3RhcnQsIGxvb3BfZW5kOwp7CiAgc3RydWN0IGl2
X2NsYXNzICpibDsKI2lmIDAKICBzdHJ1Y3QgaW5kdWN0aW9uICp2OwojZW5kaWYKCiAgLyogQ2xl
YXIgdGhlIHJlc3VsdCB2YWx1ZXMsIGluIGNhc2Ugbm8gYW5zd2VyIGNhbiBiZSBmb3VuZC4gICov
CiAgKmluaXRpYWxfdmFsdWUgPSAwOwogICppbmNyZW1lbnQgPSAwOwoKICAvKiBUaGUgaXRlcmF0
aW9uIHZhcmlhYmxlIGNhbiBiZSBlaXRoZXIgYSBnaXYgb3IgYSBiaXYuICBDaGVjayB0byBzZWUK
ICAgICB3aGljaCBpdCBpcywgYW5kIGNvbXB1dGUgdGhlIHZhcmlhYmxlJ3MgaW5pdGlhbCB2YWx1
ZSwgYW5kIGluY3JlbWVudAogICAgIHZhbHVlIGlmIHBvc3NpYmxlLiAgKi8KCiAgLyogSWYgdGhp
cyBpcyBhIG5ldyByZWdpc3RlciwgY2FuJ3QgaGFuZGxlIGl0IHNpbmNlIHdlIGRvbid0IGhhdmUg
YW55CiAgICAgcmVnX2l2X3R5cGUgZW50cnkgZm9yIGl0LiAgKi8KICBpZiAoKHVuc2lnbmVkKSBS
RUdOTyAoaXRlcmF0aW9uX3ZhcikgPj0gcmVnX2l2X3R5cGUtPm51bV9lbGVtZW50cykKICAgIHsK
ICAgICAgaWYgKGxvb3BfZHVtcF9zdHJlYW0pCglmcHJpbnRmIChsb29wX2R1bXBfc3RyZWFtLAoJ
CSAiTG9vcCB1bnJvbGxpbmc6IE5vIHJlZ19pdl90eXBlIGVudHJ5IGZvciBpdGVyYXRpb24gdmFy
LlxuIik7CiAgICAgIHJldHVybjsKICAgIH0KCiAgLyogUmVqZWN0IGl0ZXJhdGlvbiB2YXJpYWJs
ZXMgbGFyZ2VyIHRoYW4gdGhlIGhvc3Qgd2lkZSBpbnQgc2l6ZSwgc2luY2UgdGhleQogICAgIGNv
dWxkIHJlc3VsdCBpbiBhIG51bWJlciBvZiBpdGVyYXRpb25zIGdyZWF0ZXIgdGhhbiB0aGUgcmFu
Z2Ugb2Ygb3VyCiAgICAgYHVuc2lnbmVkIEhPU1RfV0lERV9JTlQnIHZhcmlhYmxlIGxvb3BfaW5m
by0+bl9pdGVyYXRpb25zLiAgKi8KICBlbHNlIGlmICgoR0VUX01PREVfQklUU0laRSAoR0VUX01P
REUgKGl0ZXJhdGlvbl92YXIpKQoJICAgID4gSE9TVF9CSVRTX1BFUl9XSURFX0lOVCkpCiAgICB7
CiAgICAgIGlmIChsb29wX2R1bXBfc3RyZWFtKQoJZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwK
CQkgIkxvb3AgdW5yb2xsaW5nOiBJdGVyYXRpb24gdmFyIHJlamVjdGVkIGJlY2F1c2UgbW9kZSB0
b28gbGFyZ2UuXG4iKTsKICAgICAgcmV0dXJuOwogICAgfQogIGVsc2UgaWYgKEdFVF9NT0RFX0NM
QVNTIChHRVRfTU9ERSAoaXRlcmF0aW9uX3ZhcikpICE9IE1PREVfSU5UKQogICAgewogICAgICBp
ZiAobG9vcF9kdW1wX3N0cmVhbSkKCWZwcmludGYgKGxvb3BfZHVtcF9zdHJlYW0sCgkJICJMb29w
IHVucm9sbGluZzogSXRlcmF0aW9uIHZhciBub3QgYW4gaW50ZWdlci5cbiIpOwogICAgICByZXR1
cm47CiAgICB9CiAgZWxzZSBpZiAoUkVHX0lWX1RZUEUgKFJFR05PIChpdGVyYXRpb25fdmFyKSkg
PT0gQkFTSUNfSU5EVUNUKQogICAgewogICAgICAvKiBXaGVuIHJlZ19pdl90eXBlIC8gcmVnX2l2
X2luZm8gaXMgcmVzaXplZCBmb3IgYml2IGluY3JlbWVudHMKCSB0aGF0IGFyZSB0dXJuZWQgaW50
byBnaXZzLCByZWdfYml2X2NsYXNzIGlzIG5vdCByZXNpemVkLgoJIFNvIGNoZWNrIGhlcmUgdGhh
dCB3ZSBkb24ndCBtYWtlIGFuIG91dC1vZi1ib3VuZHMgYWNjZXNzLiAgKi8KICAgICAgaWYgKFJF
R05PIChpdGVyYXRpb25fdmFyKSA+PSBtYXhfcmVnX2JlZm9yZV9sb29wKQoJYWJvcnQgKCk7Cgog
ICAgICAvKiBHcmFiIGluaXRpYWwgdmFsdWUsIG9ubHkgdXNlZnVsIGlmIGl0IGlzIGEgY29uc3Rh
bnQuICAqLwogICAgICBibCA9IHJlZ19iaXZfY2xhc3NbUkVHTk8gKGl0ZXJhdGlvbl92YXIpXTsK
ICAgICAgKmluaXRpYWxfdmFsdWUgPSBibC0+aW5pdGlhbF92YWx1ZTsKCiAgICAgICppbmNyZW1l
bnQgPSBiaXZfdG90YWxfaW5jcmVtZW50IChibCwgbG9vcF9zdGFydCwgbG9vcF9lbmQpOwogICAg
fQogIGVsc2UgaWYgKFJFR19JVl9UWVBFIChSRUdOTyAoaXRlcmF0aW9uX3ZhcikpID09IEdFTkVS
QUxfSU5EVUNUKQogICAgewogICAgICBIT1NUX1dJREVfSU5UIG9mZnNldCA9IDA7CiAgICAgIHN0
cnVjdCBpbmR1Y3Rpb24gKnYgPSBSRUdfSVZfSU5GTyAoUkVHTk8gKGl0ZXJhdGlvbl92YXIpKTsK
CiAgICAgIGlmIChSRUdOTyAodi0+c3JjX3JlZykgPj0gbWF4X3JlZ19iZWZvcmVfbG9vcCkKCWFi
b3J0ICgpOwoKICAgICAgYmwgPSByZWdfYml2X2NsYXNzW1JFR05PICh2LT5zcmNfcmVnKV07Cgog
ICAgICAvKiBJbmNyZW1lbnQgdmFsdWUgaXMgbXVsdF92YWwgdGltZXMgdGhlIGluY3JlbWVudCB2
YWx1ZSBvZiB0aGUgYml2LiAgKi8KCiAgICAgICppbmNyZW1lbnQgPSBiaXZfdG90YWxfaW5jcmVt
ZW50IChibCwgbG9vcF9zdGFydCwgbG9vcF9lbmQpOwogICAgICBpZiAoKmluY3JlbWVudCkKCXsK
CSAgc3RydWN0IGluZHVjdGlvbiAqYml2X2luYzsKCgkgICppbmNyZW1lbnQKCSAgICA9IGZvbGRf
cnR4X211bHRfYWRkICh2LT5tdWx0X3ZhbCwgKmluY3JlbWVudCwgY29uc3QwX3J0eCwgdi0+bW9k
ZSk7CgkgIC8qIFRoZSBjYWxsZXIgYXNzdW1lcyB0aGF0IG9uZSBmdWxsIGluY3JlbWVudCBoYXMg
b2NjdXJlZCBhdCB0aGUKCSAgICAgZmlyc3QgbG9vcCB0ZXN0LiAgQnV0IHRoYXQncyBub3QgdHJ1
ZSB3aGVuIHRoZSBiaXYgaXMgaW5jcmVtZW50ZWQKCSAgICAgYWZ0ZXIgdGhlIGdpdiBpcyBzZXQg
KHdoaWNoIGlzIHRoZSB1c3VhbCBjYXNlKSwgZS5nLjoKCSAgICAgaSA9IDY7IGRvIHs7fSB3aGls
ZSAoaSsrIDwgOSkgLgoJICAgICBUaGVyZWZvcmUsIHdlIGJpYXMgdGhlIGluaXRpYWwgdmFsdWUg
Ynkgc3VidHJhY3RpbmcgdGhlIGFtb3VudCBvZgoJICAgICB0aGUgaW5jcmVtZW50IHRoYXQgb2Nj
dXJzIGJldHdlZW4gdGhlIGdpdiBzZXQgYW5kIHRoZSBnaXYgdGVzdC4gICovCgkgIGZvciAoYml2
X2luYyA9IGJsLT5iaXY7IGJpdl9pbmM7IGJpdl9pbmMgPSBiaXZfaW5jLT5uZXh0X2l2KQoJICAg
IHsKCSAgICAgIGlmIChsb29wX2luc25fZmlyc3RfcCAodi0+aW5zbiwgYml2X2luYy0+aW5zbikp
CgkJb2Zmc2V0IC09IElOVFZBTCAoYml2X2luYy0+YWRkX3ZhbCk7CgkgICAgfQoJICBvZmZzZXQg
Kj0gSU5UVkFMICh2LT5tdWx0X3ZhbCk7Cgl9CiAgICAgIGlmIChsb29wX2R1bXBfc3RyZWFtKQoJ
ZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgIkxvb3AgdW5yb2xsaW5nOiBHaXYgaXRlcmF0
b3IsIGluaXRpYWwgdmFsdWUgYmlhcyAlbGQuXG4iLAoJCSAobG9uZykgb2Zmc2V0KTsKICAgICAg
LyogSW5pdGlhbCB2YWx1ZSBpcyBtdWx0X3ZhbCB0aW1lcyB0aGUgYml2J3MgaW5pdGlhbCB2YWx1
ZSBwbHVzCgkgYWRkX3ZhbC4gIE9ubHkgdXNlZnVsIGlmIGl0IGlzIGEgY29uc3RhbnQuICAqLwog
ICAgICAqaW5pdGlhbF92YWx1ZQoJPSBmb2xkX3J0eF9tdWx0X2FkZCAodi0+bXVsdF92YWwsCgkJ
CSAgICAgcGx1c19jb25zdGFudCAoYmwtPmluaXRpYWxfdmFsdWUsIG9mZnNldCksCgkJCSAgICAg
di0+YWRkX3ZhbCwgdi0+bW9kZSk7CiAgICB9CiAgZWxzZQogICAgewogICAgICBpZiAobG9vcF9k
dW1wX3N0cmVhbSkKCWZwcmludGYgKGxvb3BfZHVtcF9zdHJlYW0sCgkJICJMb29wIHVucm9sbGlu
ZzogTm90IGJhc2ljIG9yIGdlbmVyYWwgaW5kdWN0aW9uIHZhci5cbiIpOwogICAgICByZXR1cm47
CiAgICB9Cn0KCgovKiBGb3IgZWFjaCBiaXYgYW5kIGdpdiwgZGV0ZXJtaW5lIHdoZXRoZXIgaXQg
Y2FuIGJlIHNhZmVseSBzcGxpdCBpbnRvCiAgIGEgZGlmZmVyZW50IHZhcmlhYmxlIGZvciBlYWNo
IHVucm9sbGVkIGNvcHkgb2YgdGhlIGxvb3AgYm9keS4gIElmIGl0CiAgIGlzIHNhZmUgdG8gc3Bs
aXQsIHRoZW4gaW5kaWNhdGUgdGhhdCBieSBzYXZpbmcgc29tZSB1c2VmdWwgaW5mbwogICBpbiB0
aGUgc3BsaXR0YWJsZV9yZWdzIGFycmF5LgoKICAgSWYgdGhlIGxvb3AgaXMgYmVpbmcgY29tcGxl
dGVseSB1bnJvbGxlZCwgdGhlbiBzcGxpdHRhYmxlX3JlZ3Mgd2lsbCBob2xkCiAgIHRoZSBjdXJy
ZW50IHZhbHVlIG9mIHRoZSBpbmR1Y3Rpb24gdmFyaWFibGUgd2hpbGUgdGhlIGxvb3AgaXMgdW5y
b2xsZWQuCiAgIEl0IG11c3QgYmUgc2V0IHRvIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBpbmR1
Y3Rpb24gdmFyaWFibGUgaGVyZS4KICAgT3RoZXJ3aXNlLCBzcGxpdHRhYmxlX3JlZ3Mgd2lsbCBo
b2xkIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQKICAgdmFsdWUgb2YgdGhlIGlu
ZHVjdGlvbiB2YXJpYWJsZSBhbmQgdGhlIHZhbHVlIHRoZSBpbmR1Y3Rpb24gdmFyaWFibGUgaGFk
CiAgIGF0IHRoZSB0b3Agb2YgdGhlIGxvb3AuICBJdCBtdXN0IGJlIHNldCB0byB0aGUgdmFsdWUg
MCBoZXJlLgoKICAgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0aGF0
IHNldCByZWdpc3RlcnMgdGhhdCBhcmUKICAgc3BsaXR0YWJsZS4gICovCgovKiA/PyBJZiB0aGUg
bG9vcCBpcyBvbmx5IHVucm9sbGVkIHR3aWNlLCB0aGVuIG1vc3Qgb2YgdGhlIHJlc3RyaWN0aW9u
cyB0bwogICBjb25zdGFudCB2YWx1ZXMgYXJlIHVubmVjZXNzYXJ5LCBzaW5jZSB3ZSBjYW4gZWFz
aWx5IGNhbGN1bGF0ZSBpbmNyZW1lbnQKICAgdmFsdWVzIGluIHRoaXMgY2FzZSBldmVuIGlmIG5v
dGhpbmcgaXMgY29uc3RhbnQuICBUaGUgaW5jcmVtZW50IHZhbHVlCiAgIHNob3VsZCBub3QgaW52
b2x2ZSBhIG11bHRpcGx5IGhvd2V2ZXIuICAqLwoKLyogPz8gRXZlbiBpZiB0aGUgYml2L2dpdiBp
bmNyZW1lbnQgdmFsdWVzIGFyZW4ndCBjb25zdGFudCwgaXQgbWF5IHN0aWxsCiAgIGJlIGJlbmVm
aWNpYWwgdG8gc3BsaXQgdGhlIHZhcmlhYmxlIGlmIHRoZSBsb29wIGlzIG9ubHkgdW5yb2xsZWQg
YSBmZXcKICAgdGltZXMsIHNpbmNlIG11bHRpcGxpZXMgYnkgc21hbGwgaW50ZWdlcnMgKDEsMiwz
LDQpIGFyZSB2ZXJ5IGNoZWFwLiAgKi8KCnN0YXRpYyBpbnQKZmluZF9zcGxpdHRhYmxlX3JlZ3Mg
KHVucm9sbF90eXBlLCBsb29wX3N0YXJ0LCBsb29wX2VuZCwgZW5kX2luc2VydF9iZWZvcmUsCgkJ
ICAgICB1bnJvbGxfbnVtYmVyLCBuX2l0ZXJhdGlvbnMpCiAgICAgZW51bSB1bnJvbGxfdHlwZXMg
dW5yb2xsX3R5cGU7CiAgICAgcnR4IGxvb3Bfc3RhcnQsIGxvb3BfZW5kOwogICAgIHJ0eCBlbmRf
aW5zZXJ0X2JlZm9yZTsKICAgICBpbnQgdW5yb2xsX251bWJlcjsKICAgICB1bnNpZ25lZCBIT1NU
X1dJREVfSU5UIG5faXRlcmF0aW9uczsKewogIHN0cnVjdCBpdl9jbGFzcyAqYmw7CiAgc3RydWN0
IGluZHVjdGlvbiAqdjsKICBydHggaW5jcmVtZW50LCB0ZW07CiAgcnR4IGJpdl9maW5hbF92YWx1
ZTsKICBpbnQgYml2X3NwbGl0dGFibGU7CiAgaW50IHJlc3VsdCA9IDA7CgogIGZvciAoYmwgPSBs
b29wX2l2X2xpc3Q7IGJsOyBibCA9IGJsLT5uZXh0KQogICAgewogICAgICAvKiBCaXZfdG90YWxf
aW5jcmVtZW50IG11c3QgcmV0dXJuIGEgY29uc3RhbnQgdmFsdWUsCgkgb3RoZXJ3aXNlIHdlIGNh
biBub3QgY2FsY3VsYXRlIHRoZSBzcGxpdCB2YWx1ZXMuICAqLwoKICAgICAgaW5jcmVtZW50ID0g
Yml2X3RvdGFsX2luY3JlbWVudCAoYmwsIGxvb3Bfc3RhcnQsIGxvb3BfZW5kKTsKICAgICAgaWYg
KCEgaW5jcmVtZW50IHx8IEdFVF9DT0RFIChpbmNyZW1lbnQpICE9IENPTlNUX0lOVCkKCWNvbnRp
bnVlOwoKICAgICAgLyogVGhlIGxvb3AgbXVzdCBiZSB1bnJvbGxlZCBjb21wbGV0ZWx5LCBvciBl
bHNlIGhhdmUgYSBrbm93biBudW1iZXIKCSBvZiBpdGVyYXRpb25zIGFuZCBvbmx5IG9uZSBleGl0
LCBvciBlbHNlIHRoZSBiaXYgbXVzdCBiZSBkZWFkCgkgb3V0c2lkZSB0aGUgbG9vcCwgb3IgZWxz
ZSB0aGUgZmluYWwgdmFsdWUgbXVzdCBiZSBrbm93bi4gIE90aGVyd2lzZSwKCSBpdCBpcyB1bnNh
ZmUgdG8gc3BsaXQgdGhlIGJpdiBzaW5jZSBpdCBtYXkgbm90IGhhdmUgdGhlIHByb3BlcgoJIHZh
bHVlIG9uIGxvb3AgZXhpdC4gICovCgogICAgICAvKiBsb29wX251bWJlcl9leGl0X2NvdW50IGlz
IG5vbi16ZXJvIGlmIHRoZSBsb29wIGhhcyBhbiBleGl0IG90aGVyIHRoYW4KCSBhIGZhbGwgdGhy
b3VnaCBhdCB0aGUgZW5kLiAgKi8KCiAgICAgIGJpdl9zcGxpdHRhYmxlID0gMTsKICAgICAgYml2
X2ZpbmFsX3ZhbHVlID0gMDsKICAgICAgaWYgKHVucm9sbF90eXBlICE9IFVOUk9MTF9DT01QTEVU
RUxZCgkgICYmIChsb29wX251bWJlcl9leGl0X2NvdW50W3VpZF9sb29wX251bVtJTlNOX1VJRCAo
bG9vcF9zdGFydCldXQoJICAgICAgfHwgdW5yb2xsX3R5cGUgPT0gVU5ST0xMX05BSVZFKQoJICAm
JiAodWlkX2x1aWRbUkVHTk9fTEFTVF9VSUQgKGJsLT5yZWdubyldID49IElOU05fTFVJRCAobG9v
cF9lbmQpCgkgICAgICB8fCAhIGJsLT5pbml0X2luc24KCSAgICAgIHx8IElOU05fVUlEIChibC0+
aW5pdF9pbnNuKSA+PSBtYXhfdWlkX2Zvcl9sb29wCgkgICAgICB8fCAodWlkX2x1aWRbUkVHTk9f
RklSU1RfVUlEIChibC0+cmVnbm8pXQoJCSAgPCBJTlNOX0xVSUQgKGJsLT5pbml0X2luc24pKQoJ
ICAgICAgfHwgcmVnX21lbnRpb25lZF9wIChibC0+Yml2LT5kZXN0X3JlZywgU0VUX1NSQyAoYmwt
PmluaXRfc2V0KSkpCgkgICYmICEgKGJpdl9maW5hbF92YWx1ZSA9IGZpbmFsX2Jpdl92YWx1ZSAo
YmwsIGxvb3Bfc3RhcnQsIGxvb3BfZW5kLAoJCQkJCQkgICBuX2l0ZXJhdGlvbnMpKSkKCWJpdl9z
cGxpdHRhYmxlID0gMDsKCiAgICAgIC8qIElmIGFueSBvZiB0aGUgaW5zbnMgc2V0dGluZyB0aGUg
QklWIGRvbid0IGRvIHNvIHdpdGggYSBzaW1wbGUKCSBQTFVTLCB3ZSBkb24ndCBrbm93IGhvdyB0
byBzcGxpdCBpdC4gICovCiAgICAgIGZvciAodiA9IGJsLT5iaXY7IGJpdl9zcGxpdHRhYmxlICYm
IHY7IHYgPSB2LT5uZXh0X2l2KQoJaWYgKCh0ZW0gPSBzaW5nbGVfc2V0ICh2LT5pbnNuKSkgPT0g
MAoJICAgIHx8IEdFVF9DT0RFIChTRVRfREVTVCAodGVtKSkgIT0gUkVHCgkgICAgfHwgUkVHTk8g
KFNFVF9ERVNUICh0ZW0pKSAhPSBibC0+cmVnbm8KCSAgICB8fCBHRVRfQ09ERSAoU0VUX1NSQyAo
dGVtKSkgIT0gUExVUykKCSAgYml2X3NwbGl0dGFibGUgPSAwOwoKICAgICAgLyogSWYgZmluYWwg
dmFsdWUgaXMgbm9uLXplcm8sIHRoZW4gbXVzdCBlbWl0IGFuIGluc3RydWN0aW9uIHdoaWNoIHNl
dHMKCSB0aGUgdmFsdWUgb2YgdGhlIGJpdiB0byB0aGUgcHJvcGVyIHZhbHVlLiAgVGhpcyBpcyBk
b25lIGFmdGVyCgkgaGFuZGxpbmcgYWxsIG9mIHRoZSBnaXZzLCBzaW5jZSBzb21lIG9mIHRoZW0g
bWF5IG5lZWQgdG8gdXNlIHRoZQoJIGJpdidzIHZhbHVlIGluIHRoZWlyIGluaXRpYWxpemF0aW9u
IGNvZGUuICAqLwoKICAgICAgLyogVGhpcyBiaXYgaXMgc3BsaXR0YWJsZS4gIElmIGNvbXBsZXRl
bHkgdW5yb2xsaW5nIHRoZSBsb29wLCBzYXZlCgkgdGhlIGJpdidzIGluaXRpYWwgdmFsdWUuICBP
dGhlcndpc2UsIHNhdmUgdGhlIGNvbnN0YW50IHplcm8uICAqLwoKICAgICAgaWYgKGJpdl9zcGxp
dHRhYmxlID09IDEpCgl7CgkgIGlmICh1bnJvbGxfdHlwZSA9PSBVTlJPTExfQ09NUExFVEVMWSkK
CSAgICB7CgkgICAgICAvKiBJZiB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgYml2IGlzIGl0c2Vs
ZiAoaS5lLiBpdCBpcyB0b28KCQkgY29tcGxpY2F0ZWQgZm9yIHN0cmVuZ3RoX3JlZHVjZSB0byBj
b21wdXRlKSwgb3IgaXMgYSBoYXJkCgkJIHJlZ2lzdGVyLCBvciBpdCBpc24ndCBpbnZhcmlhbnQs
IHRoZW4gd2UgbXVzdCBjcmVhdGUgYSBuZXcKCQkgcHNldWRvIHJlZyB0byBob2xkIHRoZSBpbml0
aWFsIHZhbHVlIG9mIHRoZSBiaXYuICAqLwoKCSAgICAgIGlmIChHRVRfQ09ERSAoYmwtPmluaXRp
YWxfdmFsdWUpID09IFJFRwoJCSAgJiYgKFJFR05PIChibC0+aW5pdGlhbF92YWx1ZSkgPT0gYmwt
PnJlZ25vCgkJICAgICAgfHwgUkVHTk8gKGJsLT5pbml0aWFsX3ZhbHVlKSA8IEZJUlNUX1BTRVVE
T19SRUdJU1RFUgoJCSAgICAgIHx8ICEgaW52YXJpYW50X3AgKGJsLT5pbml0aWFsX3ZhbHVlKSkp
CgkJewoJCSAgcnR4IHRlbSA9IGdlbl9yZWdfcnR4IChibC0+Yml2LT5tb2RlKTsKCgkJICByZWNv
cmRfYmFzZV92YWx1ZSAoUkVHTk8gKHRlbSksIGJsLT5iaXYtPmFkZF92YWwsIDApOwoJCSAgZW1p
dF9pbnNuX2JlZm9yZSAoZ2VuX21vdmVfaW5zbiAodGVtLCBibC0+Yml2LT5zcmNfcmVnKSwKCQkJ
CSAgICBsb29wX3N0YXJ0KTsKCgkJICBpZiAobG9vcF9kdW1wX3N0cmVhbSkKCQkgICAgZnByaW50
ZiAobG9vcF9kdW1wX3N0cmVhbSwgIkJpdiAlZCBpbml0aWFsIHZhbHVlIHJlbWFwcGVkIHRvICVk
LlxuIiwKCQkJICAgICBibC0+cmVnbm8sIFJFR05PICh0ZW0pKTsKCgkJICBzcGxpdHRhYmxlX3Jl
Z3NbYmwtPnJlZ25vXSA9IHRlbTsKCQl9CgkgICAgICBlbHNlCgkJc3BsaXR0YWJsZV9yZWdzW2Js
LT5yZWdub10gPSBibC0+aW5pdGlhbF92YWx1ZTsKCSAgICB9CgkgIGVsc2UKCSAgICBzcGxpdHRh
YmxlX3JlZ3NbYmwtPnJlZ25vXSA9IGNvbnN0MF9ydHg7CgoJICAvKiBTYXZlIHRoZSBudW1iZXIg
b2YgaW5zdHJ1Y3Rpb25zIHRoYXQgbW9kaWZ5IHRoZSBiaXYsIHNvIHRoYXQKCSAgICAgd2UgY2Fu
IHRyZWF0IHRoZSBsYXN0IG9uZSBzcGVjaWFsbHkuICAqLwoKCSAgc3BsaXR0YWJsZV9yZWdzX3Vw
ZGF0ZXNbYmwtPnJlZ25vXSA9IGJsLT5iaXZfY291bnQ7CgkgIHJlc3VsdCArPSBibC0+Yml2X2Nv
dW50OwoKCSAgaWYgKGxvb3BfZHVtcF9zdHJlYW0pCgkgICAgZnByaW50ZiAobG9vcF9kdW1wX3N0
cmVhbSwKCQkgICAgICJCaXYgJWQgc2FmZSB0byBzcGxpdC5cbiIsIGJsLT5yZWdubyk7Cgl9Cgog
ICAgICAvKiBDaGVjayBldmVyeSBnaXYgdGhhdCBkZXBlbmRzIG9uIHRoaXMgYml2IHRvIHNlZSB3
aGV0aGVyIGl0IGlzCgkgc3BsaXR0YWJsZSBhbHNvLiAgRXZlbiBpZiB0aGUgYml2IGlzbid0IHNw
bGl0dGFibGUsIGdpdnMgd2hpY2gKCSBkZXBlbmQgb24gaXQgbWF5IGJlIHNwbGl0dGFibGUgaWYg
dGhlIGJpdiBpcyBsaXZlIG91dHNpZGUgdGhlCgkgbG9vcCwgYW5kIHRoZSBnaXZzIGFyZW4ndC4g
ICovCgogICAgICByZXN1bHQgKz0gZmluZF9zcGxpdHRhYmxlX2dpdnMgKGJsLCB1bnJvbGxfdHlw
ZSwgbG9vcF9zdGFydCwgbG9vcF9lbmQsCgkJCQkgICAgIGluY3JlbWVudCwgdW5yb2xsX251bWJl
cik7CgogICAgICAvKiBJZiBmaW5hbCB2YWx1ZSBpcyBub24temVybywgdGhlbiBtdXN0IGVtaXQg
YW4gaW5zdHJ1Y3Rpb24gd2hpY2ggc2V0cwoJIHRoZSB2YWx1ZSBvZiB0aGUgYml2IHRvIHRoZSBw
cm9wZXIgdmFsdWUuICBUaGlzIGlzIGRvbmUgYWZ0ZXIKCSBoYW5kbGluZyBhbGwgb2YgdGhlIGdp
dnMsIHNpbmNlIHNvbWUgb2YgdGhlbSBtYXkgbmVlZCB0byB1c2UgdGhlCgkgYml2J3MgdmFsdWUg
aW4gdGhlaXIgaW5pdGlhbGl6YXRpb24gY29kZS4gICovCiAgICAgIGlmIChiaXZfZmluYWxfdmFs
dWUpCgl7CgkgIC8qIElmIHRoZSBsb29wIGhhcyBtdWx0aXBsZSBleGl0cywgZW1pdCB0aGUgaW5z
bnMgYmVmb3JlIHRoZQoJICAgICBsb29wIHRvIGVuc3VyZSB0aGF0IGl0IHdpbGwgYWx3YXlzIGJl
IGV4ZWN1dGVkIG5vIG1hdHRlcgoJICAgICBob3cgdGhlIGxvb3AgZXhpdHMuICBPdGhlcndpc2Ug
ZW1pdCB0aGUgaW5zbiBhZnRlciB0aGUgbG9vcCwKCSAgICAgc2luY2UgdGhpcyBpcyBzbGlnaHRs
eSBtb3JlIGVmZmljaWVudC4gICovCgkgIGlmICghIGxvb3BfbnVtYmVyX2V4aXRfY291bnRbdWlk
X2xvb3BfbnVtW0lOU05fVUlEIChsb29wX3N0YXJ0KV1dKQoJICAgIGVtaXRfaW5zbl9iZWZvcmUg
KGdlbl9tb3ZlX2luc24gKGJsLT5iaXYtPnNyY19yZWcsCgkJCQkJICAgICBiaXZfZmluYWxfdmFs
dWUpLAoJCQkgICAgICBlbmRfaW5zZXJ0X2JlZm9yZSk7CgkgIGVsc2UKCSAgICB7CgkgICAgICAv
KiBDcmVhdGUgYSBuZXcgcmVnaXN0ZXIgdG8gaG9sZCB0aGUgdmFsdWUgb2YgdGhlIGJpdiwgYW5k
IHRoZW4KCQkgc2V0IHRoZSBiaXYgdG8gaXRzIGZpbmFsIHZhbHVlIGJlZm9yZSB0aGUgbG9vcCBz
dGFydC4gIFRoZSBiaXYKCQkgaXMgc2V0IHRvIGl0cyBmaW5hbCB2YWx1ZSBiZWZvcmUgbG9vcCBz
dGFydCB0byBlbnN1cmUgdGhhdAoJCSB0aGlzIGluc24gd2lsbCBhbHdheXMgYmUgZXhlY3V0ZWQs
IG5vIG1hdHRlciBob3cgdGhlIGxvb3AKCQkgZXhpdHMuICAqLwoJICAgICAgcnR4IHRlbSA9IGdl
bl9yZWdfcnR4IChibC0+Yml2LT5tb2RlKTsKCSAgICAgIHJlY29yZF9iYXNlX3ZhbHVlIChSRUdO
TyAodGVtKSwgYmwtPmJpdi0+YWRkX3ZhbCwgMCk7CgoJICAgICAgZW1pdF9pbnNuX2JlZm9yZSAo
Z2VuX21vdmVfaW5zbiAodGVtLCBibC0+Yml2LT5zcmNfcmVnKSwKCQkJCWxvb3Bfc3RhcnQpOwoJ
ICAgICAgZW1pdF9pbnNuX2JlZm9yZSAoZ2VuX21vdmVfaW5zbiAoYmwtPmJpdi0+c3JjX3JlZywK
CQkJCQkgICAgICAgYml2X2ZpbmFsX3ZhbHVlKSwKCQkJCWxvb3Bfc3RhcnQpOwoKCSAgICAgIGlm
IChsb29wX2R1bXBfc3RyZWFtKQoJCWZwcmludGYgKGxvb3BfZHVtcF9zdHJlYW0sICJCaXYgJWQg
bWFwcGVkIHRvICVkIGZvciBzcGxpdC5cbiIsCgkJCSBSRUdOTyAoYmwtPmJpdi0+c3JjX3JlZyks
IFJFR05PICh0ZW0pKTsKCgkgICAgICAvKiBTZXQgdXAgdGhlIG1hcHBpbmcgZnJvbSB0aGUgb3Jp
Z2luYWwgYml2IHJlZ2lzdGVyIHRvIHRoZSBuZXcKCQkgcmVnaXN0ZXIuICAqLwoJICAgICAgYmwt
PmJpdi0+c3JjX3JlZyA9IHRlbTsKCSAgICB9Cgl9CiAgICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoK
LyogUmV0dXJuIDEgaWYgdGhlIGZpcnN0IGFuZCBsYXN0IHVucm9sbGVkIGNvcHkgb2YgdGhlIGFk
ZHJlc3MgZ2l2IFYgaXMgdmFsaWQKICAgZm9yIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGlzIHVzaW5n
IGl0LiAgRG8gbm90IG1ha2UgYW55IGNoYW5nZXMgdG8gdGhhdAogICBpbnN0cnVjdGlvbi4gICov
CgpzdGF0aWMgaW50CnZlcmlmeV9hZGRyZXNzZXMgKHYsIGdpdl9pbmMsIHVucm9sbF9udW1iZXIp
CiAgICAgc3RydWN0IGluZHVjdGlvbiAqdjsKICAgICBydHggZ2l2X2luYzsKICAgICBpbnQgdW5y
b2xsX251bWJlcjsKewogIGludCByZXQgPSAxOwogIHJ0eCBvcmlnX2FkZHIgPSAqdi0+bG9jYXRp
b247CiAgcnR4IGxhc3RfYWRkciA9IHBsdXNfY29uc3RhbnQgKHYtPmRlc3RfcmVnLAoJCQkJIElO
VFZBTCAoZ2l2X2luYykgKiAodW5yb2xsX251bWJlciAtIDEpKTsKCiAgLyogRmlyc3QgY2hlY2sg
dG8gc2VlIGlmIGVpdGhlciBhZGRyZXNzIHdvdWxkIGZhaWwuICAgSGFuZGxlIHRoZSBmYWN0CiAg
ICAgdGhhdCB3ZSBoYXZlIG1heSBoYXZlIGEgbWF0Y2hfZHVwLiAgKi8KICBpZiAoISB2YWxpZGF0
ZV9yZXBsYWNlX3J0eCAoKnYtPmxvY2F0aW9uLCB2LT5kZXN0X3JlZywgdi0+aW5zbikKICAgICAg
fHwgISB2YWxpZGF0ZV9yZXBsYWNlX3J0eCAoKnYtPmxvY2F0aW9uLCBsYXN0X2FkZHIsIHYtPmlu
c24pKQogICAgcmV0ID0gMDsKCiAgLyogTm93IHB1dCB0aGluZ3MgYmFjayB0aGUgd2F5IHRoZXkg
d2VyZSBiZWZvcmUuICBUaGlzIHNob3VsZCBhbHdheXMKICAgc3VjY2VlZC4gICovCiAgaWYgKCEg
dmFsaWRhdGVfcmVwbGFjZV9ydHggKCp2LT5sb2NhdGlvbiwgb3JpZ19hZGRyLCB2LT5pbnNuKSkK
ICAgIGFib3J0ICgpOwoKICByZXR1cm4gcmV0Owp9CgovKiBGb3IgZXZlcnkgZ2l2IGJhc2VkIG9u
IHRoZSBiaXYgQkwsIGNoZWNrIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGlzCiAgIHNwbGl0dGFi
bGUuICBUaGlzIGlzIGEgc3Vicm91dGluZSB0byBmaW5kX3NwbGl0dGFibGVfcmVncyAoKS4KCiAg
IFJldHVybiB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0aGF0IHNldCBzcGxpdHRhYmxlIHJl
Z2lzdGVycy4gICovCgpzdGF0aWMgaW50CmZpbmRfc3BsaXR0YWJsZV9naXZzIChibCwgdW5yb2xs
X3R5cGUsIGxvb3Bfc3RhcnQsIGxvb3BfZW5kLCBpbmNyZW1lbnQsCgkJICAgICAgdW5yb2xsX251
bWJlcikKICAgICBzdHJ1Y3QgaXZfY2xhc3MgKmJsOwogICAgIGVudW0gdW5yb2xsX3R5cGVzIHVu
cm9sbF90eXBlOwogICAgIHJ0eCBsb29wX3N0YXJ0LCBsb29wX2VuZDsKICAgICBydHggaW5jcmVt
ZW50OwogICAgIGludCB1bnJvbGxfbnVtYmVyOwp7CiAgc3RydWN0IGluZHVjdGlvbiAqdiwgKnYy
OwogIHJ0eCBmaW5hbF92YWx1ZTsKICBydHggdGVtOwogIGludCByZXN1bHQgPSAwOwoKICAvKiBT
Y2FuIHRoZSBsaXN0IG9mIGdpdnMsIGFuZCBzZXQgdGhlIHNhbWVfaW5zbiBmaWVsZCB3aGVuIHRo
ZXJlIGFyZQogICAgIG11bHRpcGxlIGlkZW50aWNhbCBnaXZzIGluIHRoZSBzYW1lIGluc24uICAq
LwogIGZvciAodiA9IGJsLT5naXY7IHY7IHYgPSB2LT5uZXh0X2l2KQogICAgZm9yICh2MiA9IHYt
Pm5leHRfaXY7IHYyOyB2MiA9IHYyLT5uZXh0X2l2KQogICAgICBpZiAodi0+aW5zbiA9PSB2Mi0+
aW5zbiAmJiBydHhfZXF1YWxfcCAodi0+bmV3X3JlZywgdjItPm5ld19yZWcpCgkgICYmICEgdjIt
PnNhbWVfaW5zbikKCXYyLT5zYW1lX2luc24gPSB2OwoKICBmb3IgKHYgPSBibC0+Z2l2OyB2OyB2
ID0gdi0+bmV4dF9pdikKICAgIHsKICAgICAgcnR4IGdpdl9pbmMsIHZhbHVlOwoKICAgICAgLyog
T25seSBzcGxpdCB0aGUgZ2l2IGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmVkdWNlZCwgb3IgaWYg
dGhlIGxvb3AgaXMKCSBiZWluZyBjb21wbGV0ZWx5IHVucm9sbGVkLiAgKi8KICAgICAgaWYgKHVu
cm9sbF90eXBlICE9IFVOUk9MTF9DT01QTEVURUxZICYmIHYtPmlnbm9yZSkKCWNvbnRpbnVlOwoK
ICAgICAgLyogVGhlIGdpdiBjYW4gYmUgc3BsaXQgaWYgdGhlIGluc24gdGhhdCBzZXRzIHRoZSBn
aXYgaXMgZXhlY3V0ZWQgb25jZQoJIGFuZCBvbmx5IG9uY2Ugb24gZXZlcnkgaXRlcmF0aW9uIG9m
IHRoZSBsb29wLiAgKi8KICAgICAgLyogQW4gYWRkcmVzcyBnaXYgY2FuIGFsd2F5cyBiZSBzcGxp
dC4gIHYtPmluc24gaXMganVzdCBhIHVzZSBub3QgYSBzZXQsCgkgYW5kIGhlbmNlIGl0IGRvZXMg
bm90IG1hdHRlciB3aGV0aGVyIGl0IGlzIGFsd2F5cyBleGVjdXRlZC4gIEFsbCB0aGF0CgkgbWF0
dGVycyBpcyB0aGF0IGFsbCB0aGUgYml2IGluY3JlbWVudHMgYXJlIGFsd2F5cyBleGVjdXRlZCwg
YW5kIHdlCgkgd29uJ3QgcmVhY2ggaGVyZSBpZiB0aGV5IGFyZW4ndC4gICovCiAgICAgIGlmICh2
LT5naXZfdHlwZSAhPSBERVNUX0FERFIKCSAgJiYgKCEgdi0+YWx3YXlzX2NvbXB1dGFibGUKCSAg
ICAgIHx8IGJhY2tfYnJhbmNoX2luX3JhbmdlX3AgKHYtPmluc24sIGxvb3Bfc3RhcnQsIGxvb3Bf
ZW5kKSkpCgljb250aW51ZTsKCiAgICAgIC8qIFRoZSBnaXYgaW5jcmVtZW50IHZhbHVlIG11c3Qg
YmUgYSBjb25zdGFudC4gICovCiAgICAgIGdpdl9pbmMgPSBmb2xkX3J0eF9tdWx0X2FkZCAodi0+
bXVsdF92YWwsIGluY3JlbWVudCwgY29uc3QwX3J0eCwKCQkJCSAgIHYtPm1vZGUpOwogICAgICBp
ZiAoISBnaXZfaW5jIHx8IEdFVF9DT0RFIChnaXZfaW5jKSAhPSBDT05TVF9JTlQpCgljb250aW51
ZTsKCiAgICAgIC8qIFRoZSBsb29wIG11c3QgYmUgdW5yb2xsZWQgY29tcGxldGVseSwgb3IgZWxz
ZSBoYXZlIGEga25vd24gbnVtYmVyIG9mCgkgaXRlcmF0aW9ucyBhbmQgb25seSBvbmUgZXhpdCwg
b3IgZWxzZSB0aGUgZ2l2IG11c3QgYmUgZGVhZCBvdXRzaWRlCgkgdGhlIGxvb3AsIG9yIGVsc2Ug
dGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBnaXYgbXVzdCBiZSBrbm93bi4KCSBPdGhlcndpc2UsIGl0
IGlzIG5vdCBzYWZlIHRvIHNwbGl0IHRoZSBnaXYgc2luY2UgaXQgbWF5IG5vdCBoYXZlIHRoZQoJ
IHByb3BlciB2YWx1ZSBvbiBsb29wIGV4aXQuICAqLwoKICAgICAgLyogVGhlIHVzZWQgb3V0c2lk
ZSBsb29wIHRlc3Qgd2lsbCBmYWlsIGZvciBERVNUX0FERFIgZ2l2cy4gIFRoZXkgYXJlCgkgbmV2
ZXIgdXNlZCBvdXRzaWRlIHRoZSBsb29wIGFueXdheXMsIHNvIGl0IGlzIGFsd2F5cyBzYWZlIHRv
IHNwbGl0IGEKCSBERVNUX0FERFIgZ2l2LiAgKi8KCiAgICAgIGZpbmFsX3ZhbHVlID0gMDsKICAg
ICAgaWYgKHVucm9sbF90eXBlICE9IFVOUk9MTF9DT01QTEVURUxZCgkgICYmIChsb29wX251bWJl
cl9leGl0X2NvdW50W3VpZF9sb29wX251bVtJTlNOX1VJRCAobG9vcF9zdGFydCldXQoJICAgICAg
fHwgdW5yb2xsX3R5cGUgPT0gVU5ST0xMX05BSVZFKQoJICAmJiB2LT5naXZfdHlwZSAhPSBERVNU
X0FERFIKCSAgLyogVGhlIG5leHQgcGFydCBpcyB0cnVlIGlmIHRoZSBwc2V1ZG8gaXMgdXNlZCBv
dXRzaWRlIHRoZSBsb29wLgoJICAgICBXZSBhc3N1bWUgdGhhdCB0aGlzIGlzIHRydWUgZm9yIGFu
eSBwc2V1ZG8gY3JlYXRlZCBhZnRlciBsb29wCgkgICAgIHN0YXJ0cywgYmVjYXVzZSB3ZSBkb24n
dCBoYXZlIGEgcmVnX25faW5mbyBlbnRyeSBmb3IgdGhlbS4gICovCgkgICYmIChSRUdOTyAodi0+
ZGVzdF9yZWcpID49IG1heF9yZWdfYmVmb3JlX2xvb3AKCSAgICAgIHx8IChSRUdOT19GSVJTVF9V
SUQgKFJFR05PICh2LT5kZXN0X3JlZykpICE9IElOU05fVUlEICh2LT5pbnNuKQoJCSAgLyogQ2hl
Y2sgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBwc2V1ZG8gaXMgc2V0IGJ5IGEgc2hpZnQvYWRkCgkJ
ICAgICBzZXF1ZW5jZSwgaW4gd2hpY2ggY2FzZSB0aGUgZmlyc3QgaW5zbiBzZXR0aW5nIHRoZSBw
c2V1ZG8KCQkgICAgIGlzIHRoZSBmaXJzdCBpbnNuIG9mIHRoZSBzaGlmdC9hZGQgc2VxdWVuY2Uu
ICAqLwoJCSAgJiYgKCEgKHRlbSA9IGZpbmRfcmVnX25vdGUgKHYtPmluc24sIFJFR19SRVRWQUws
IE5VTExfUlRYKSkKCQkgICAgICB8fCAoUkVHTk9fRklSU1RfVUlEIChSRUdOTyAodi0+ZGVzdF9y
ZWcpKQoJCQkgICE9IElOU05fVUlEIChYRVhQICh0ZW0sIDApKSkpKQoJICAgICAgLyogTGluZSBh
Ym92ZSBhbHdheXMgZmFpbHMgaWYgSU5TTiB3YXMgbW92ZWQgYnkgbG9vcCBvcHQuICAqLwoJICAg
ICAgfHwgKHVpZF9sdWlkW1JFR05PX0xBU1RfVUlEIChSRUdOTyAodi0+ZGVzdF9yZWcpKV0KCQkg
ID49IElOU05fTFVJRCAobG9vcF9lbmQpKSkKCSAgLyogR2l2cyBtYWRlIGZyb20gYml2IGluY3Jl
bWVudHMgYXJlIG1pc3NlZCBieSB0aGUgYWJvdmUgdGVzdCwgc28KCSAgICAgdGVzdCBleHBsaWNp
dGx5IGZvciB0aGVtLiAgKi8KCSAgJiYgKFJFR05PICh2LT5kZXN0X3JlZykgPCBmaXJzdF9pbmNy
ZW1lbnRfZ2l2CgkgICAgICB8fCBSRUdOTyAodi0+ZGVzdF9yZWcpID4gbGFzdF9pbmNyZW1lbnRf
Z2l2KQoJICAmJiAhIChmaW5hbF92YWx1ZSA9IHYtPmZpbmFsX3ZhbHVlKSkKCWNvbnRpbnVlOwoK
I2lmIDAKICAgICAgLyogQ3VycmVudGx5LCBub24tcmVkdWNlZC9maW5hbC12YWx1ZSBnaXZzIGFy
ZSBuZXZlciBzcGxpdC4gICovCiAgICAgIC8qIFNob3VsZCBlbWl0IGluc25zIGFmdGVyIHRoZSBs
b29wIGlmIHBvc3NpYmxlLCBhcyB0aGUgYml2IGZpbmFsIHZhbHVlCgkgY29kZSBiZWxvdyBkb2Vz
LiAgKi8KCiAgICAgIC8qIElmIHRoZSBmaW5hbCB2YWx1ZSBpcyBub24temVybywgYW5kIHRoZSBn
aXYgaGFzIG5vdCBiZWVuIHJlZHVjZWQsCgkgdGhlbiBtdXN0IGVtaXQgYW4gaW5zdHJ1Y3Rpb24g
dG8gc2V0IHRoZSBmaW5hbCB2YWx1ZS4gICovCiAgICAgIGlmIChmaW5hbF92YWx1ZSAmJiAhdi0+
bmV3X3JlZykKCXsKCSAgLyogQ3JlYXRlIGEgbmV3IHJlZ2lzdGVyIHRvIGhvbGQgdGhlIHZhbHVl
IG9mIHRoZSBnaXYsIGFuZCB0aGVuIHNldAoJICAgICB0aGUgZ2l2IHRvIGl0cyBmaW5hbCB2YWx1
ZSBiZWZvcmUgdGhlIGxvb3Agc3RhcnQuICBUaGUgZ2l2IGlzIHNldAoJICAgICB0byBpdHMgZmlu
YWwgdmFsdWUgYmVmb3JlIGxvb3Agc3RhcnQgdG8gZW5zdXJlIHRoYXQgdGhpcyBpbnNuCgkgICAg
IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBubyBtYXR0ZXIgaG93IHdlIGV4aXQuICAqLwoJICB0
ZW0gPSBnZW5fcmVnX3J0eCAodi0+bW9kZSk7CgkgIGVtaXRfaW5zbl9iZWZvcmUgKGdlbl9tb3Zl
X2luc24gKHRlbSwgdi0+ZGVzdF9yZWcpLCBsb29wX3N0YXJ0KTsKCSAgZW1pdF9pbnNuX2JlZm9y
ZSAoZ2VuX21vdmVfaW5zbiAodi0+ZGVzdF9yZWcsIGZpbmFsX3ZhbHVlKSwKCQkJICAgIGxvb3Bf
c3RhcnQpOwoKCSAgaWYgKGxvb3BfZHVtcF9zdHJlYW0pCgkgICAgZnByaW50ZiAobG9vcF9kdW1w
X3N0cmVhbSwgIkdpdiAlZCBtYXBwZWQgdG8gJWQgZm9yIHNwbGl0LlxuIiwKCQkgICAgIFJFR05P
ICh2LT5kZXN0X3JlZyksIFJFR05PICh0ZW0pKTsKCgkgIHYtPnNyY19yZWcgPSB0ZW07Cgl9CiNl
bmRpZgoKICAgICAgLyogVGhpcyBnaXYgaXMgc3BsaXR0YWJsZS4gIElmIGNvbXBsZXRlbHkgdW5y
b2xsaW5nIHRoZSBsb29wLCBzYXZlIHRoZQoJIGdpdidzIGluaXRpYWwgdmFsdWUuICBPdGhlcndp
c2UsIHNhdmUgdGhlIGNvbnN0YW50IHplcm8gZm9yIGl0LiAgKi8KCiAgICAgIGlmICh1bnJvbGxf
dHlwZSA9PSBVTlJPTExfQ09NUExFVEVMWSkKCXsKCSAgLyogSXQgaXMgbm90IHNhZmUgdG8gdXNl
IGJsLT5pbml0aWFsX3ZhbHVlIGhlcmUsIGJlY2F1c2UgaXQgbWF5IG5vdAoJICAgICBiZSBpbnZh
cmlhbnQuICBJdCBpcyBzYWZlIHRvIHVzZSB0aGUgaW5pdGlhbCB2YWx1ZSBzdG9yZWQgaW4KCSAg
ICAgdGhlIHNwbGl0dGFibGVfcmVncyBhcnJheSBpZiBpdCBpcyBzZXQuICBJbiByYXJlIGNhc2Vz
LCBpdCB3b24ndAoJICAgICBiZSBzZXQsIHNvIHRoZW4gd2UgZG8gZXhhY3RseSB0aGUgc2FtZSB0
aGluZyBhcwoJICAgICBmaW5kX3NwbGl0dGFibGVfcmVncyBkb2VzIHRvIGdldCBhIHNhZmUgdmFs
dWUuICAqLwoJICBydHggYml2X2luaXRpYWxfdmFsdWU7CgoJICBpZiAoc3BsaXR0YWJsZV9yZWdz
W2JsLT5yZWdub10pCgkgICAgYml2X2luaXRpYWxfdmFsdWUgPSBzcGxpdHRhYmxlX3JlZ3NbYmwt
PnJlZ25vXTsKCSAgZWxzZSBpZiAoR0VUX0NPREUgKGJsLT5pbml0aWFsX3ZhbHVlKSAhPSBSRUcK
CQkgICB8fCAoUkVHTk8gKGJsLT5pbml0aWFsX3ZhbHVlKSAhPSBibC0+cmVnbm8KCQkgICAgICAg
JiYgUkVHTk8gKGJsLT5pbml0aWFsX3ZhbHVlKSA+PSBGSVJTVF9QU0VVRE9fUkVHSVNURVIpKQoJ
ICAgIGJpdl9pbml0aWFsX3ZhbHVlID0gYmwtPmluaXRpYWxfdmFsdWU7CgkgIGVsc2UKCSAgICB7
CgkgICAgICBydHggdGVtID0gZ2VuX3JlZ19ydHggKGJsLT5iaXYtPm1vZGUpOwoKCSAgICAgIHJl
Y29yZF9iYXNlX3ZhbHVlIChSRUdOTyAodGVtKSwgYmwtPmJpdi0+YWRkX3ZhbCwgMCk7CgkgICAg
ICBlbWl0X2luc25fYmVmb3JlIChnZW5fbW92ZV9pbnNuICh0ZW0sIGJsLT5iaXYtPnNyY19yZWcp
LAoJCQkJbG9vcF9zdGFydCk7CgkgICAgICBiaXZfaW5pdGlhbF92YWx1ZSA9IHRlbTsKCSAgICB9
CgkgIHZhbHVlID0gZm9sZF9ydHhfbXVsdF9hZGQgKHYtPm11bHRfdmFsLCBiaXZfaW5pdGlhbF92
YWx1ZSwKCQkJCSAgICAgdi0+YWRkX3ZhbCwgdi0+bW9kZSk7Cgl9CiAgICAgIGVsc2UKCXZhbHVl
ID0gY29uc3QwX3J0eDsKCiAgICAgIGlmICh2LT5uZXdfcmVnKQoJewoJICAvKiBJZiBhIGdpdiB3
YXMgY29tYmluZWQgd2l0aCBhbm90aGVyIGdpdiwgdGhlbiB3ZSBjYW4gb25seSBzcGxpdAoJICAg
ICB0aGlzIGdpdiBpZiB0aGUgZ2l2IGl0IHdhcyBjb21iaW5lZCB3aXRoIHdhcyByZWR1Y2VkLiAg
VGhpcwoJICAgICBpcyBiZWNhdXNlIHRoZSB2YWx1ZSBvZiB2LT5uZXdfcmVnIGlzIG1lYW5pbmds
ZXNzIGluIHRoaXMKCSAgICAgY2FzZS4gICovCgkgIGlmICh2LT5zYW1lICYmICEgdi0+c2FtZS0+
bmV3X3JlZykKCSAgICB7CgkgICAgICBpZiAobG9vcF9kdW1wX3N0cmVhbSkKCQlmcHJpbnRmIChs
b29wX2R1bXBfc3RyZWFtLAoJCQkgImdpdiBjb21iaW5lZCB3aXRoIHVucmVkdWNlZCBnaXYgbm90
IHNwbGl0LlxuIik7CgkgICAgICBjb250aW51ZTsKCSAgICB9CgkgIC8qIElmIHRoZSBnaXYgaXMg
YW4gYWRkcmVzcyBkZXN0aW5hdGlvbiwgaXQgY291bGQgYmUgc29tZXRoaW5nIG90aGVyCgkgICAg
IHRoYW4gYSBzaW1wbGUgcmVnaXN0ZXIsIHRoZXNlIGhhdmUgdG8gYmUgdHJlYXRlZCBkaWZmZXJl
bnRseS4gICovCgkgIGVsc2UgaWYgKHYtPmdpdl90eXBlID09IERFU1RfUkVHKQoJICAgIHsKCSAg
ICAgIC8qIElmIHZhbHVlIGlzIG5vdCBhIGNvbnN0YW50LCByZWdpc3Rlciwgb3IgcmVnaXN0ZXIg
cGx1cwoJCSBjb25zdGFudCwgdGhlbiBjb21wdXRlIGl0cyB2YWx1ZSBpbnRvIGEgcmVnaXN0ZXIg
YmVmb3JlCgkJIGxvb3Agc3RhcnQuICBUaGlzIHByZXZlbnRzIGludmFsaWQgcnR4IHNoYXJpbmcs
IGFuZCBzaG91bGQKCQkgZ2VuZXJhdGUgYmV0dGVyIGNvZGUuICBXZSBjYW4gdXNlIGJsLT5pbml0
aWFsX3ZhbHVlIGhlcmUKCQkgaW5zdGVhZCBvZiBzcGxpdHRhYmxlX3JlZ3NbYmwtPnJlZ25vXSBi
ZWNhdXNlIHRoaXMgY29kZQoJCSBpcyBnb2luZyBiZWZvcmUgdGhlIGxvb3Agc3RhcnQuICAqLwoJ
ICAgICAgaWYgKHVucm9sbF90eXBlID09IFVOUk9MTF9DT01QTEVURUxZCgkJICAmJiBHRVRfQ09E
RSAodmFsdWUpICE9IENPTlNUX0lOVAoJCSAgJiYgR0VUX0NPREUgKHZhbHVlKSAhPSBSRUcKCQkg
ICYmIChHRVRfQ09ERSAodmFsdWUpICE9IFBMVVMKCQkgICAgICB8fCBHRVRfQ09ERSAoWEVYUCAo
dmFsdWUsIDApKSAhPSBSRUcKCQkgICAgICB8fCBHRVRfQ09ERSAoWEVYUCAodmFsdWUsIDEpKSAh
PSBDT05TVF9JTlQpKQoJCXsKCQkgIHJ0eCB0ZW0gPSBnZW5fcmVnX3J0eCAodi0+bW9kZSk7CgkJ
ICByZWNvcmRfYmFzZV92YWx1ZSAoUkVHTk8gKHRlbSksIHYtPmFkZF92YWwsIDApOwoJCSAgZW1p
dF9pdl9hZGRfbXVsdCAoYmwtPmluaXRpYWxfdmFsdWUsIHYtPm11bHRfdmFsLAoJCQkJICAgIHYt
PmFkZF92YWwsIHRlbSwgbG9vcF9zdGFydCk7CgkJICB2YWx1ZSA9IHRlbTsKCQl9CgoJICAgICAg
c3BsaXR0YWJsZV9yZWdzW1JFR05PICh2LT5uZXdfcmVnKV0gPSB2YWx1ZTsKCSAgICAgIGRlcml2
ZWRfcmVnc1tSRUdOTyAodi0+bmV3X3JlZyldID0gdi0+ZGVyaXZlZF9mcm9tICE9IDA7CgkgICAg
fQoJICBlbHNlCgkgICAgewoJICAgICAgLyogU3BsaXR0aW5nIGFkZHJlc3MgZ2l2cyBpcyB1c2Vm
dWwgc2luY2UgaXQgd2lsbCBvZnRlbiBhbGxvdyB1cwoJCSB0byBlbGltaW5hdGUgc29tZSBpbmNy
ZW1lbnQgaW5zbnMgZm9yIHRoZSBiYXNlIGdpdiBhcwoJCSB1bm5lY2Vzc2FyeS4gICovCgoJICAg
ICAgLyogSWYgdGhlIGFkZHIgZ2l2IGlzIGNvbWJpbmVkIHdpdGggYSBkZXN0X3JlZyBnaXYsIHRo
ZW4gYWxsCgkJIHJlZmVyZW5jZXMgdG8gdGhhdCBkZXN0IHJlZyB3aWxsIGJlIHJlbWFwcGVkLCB3
aGljaCBpcyBOT1QKCQkgd2hhdCB3ZSB3YW50IGZvciBzcGxpdCBhZGRyIHJlZ3MuIFdlIGFsd2F5
cyBjcmVhdGUgYSBuZXcKCQkgcmVnaXN0ZXIgZm9yIHRoZSBzcGxpdCBhZGRyIGdpdiwganVzdCB0
byBiZSBzYWZlLiAgKi8KCgkgICAgICAvKiBJZiB3ZSBoYXZlIG11bHRpcGxlIGlkZW50aWNhbCBh
ZGRyZXNzIGdpdnMgd2l0aGluIGEKCQkgc2luZ2xlIGluc3RydWN0aW9uLCB0aGVuIHVzZSBhIHNp
bmdsZSBwc2V1ZG8gcmVnIGZvcgoJCSBib3RoLiAgVGhpcyBpcyBuZWNlc3NhcnkgaW4gY2FzZSBv
bmUgaXMgYSBtYXRjaF9kdXAKCQkgb2YgdGhlIG90aGVyLiAgKi8KCgkgICAgICB2LT5jb25zdF9h
ZGp1c3QgPSAwOwoKCSAgICAgIGlmICh2LT5zYW1lX2luc24pCgkJewoJCSAgdi0+ZGVzdF9yZWcg
PSB2LT5zYW1lX2luc24tPmRlc3RfcmVnOwoJCSAgaWYgKGxvb3BfZHVtcF9zdHJlYW0pCgkJICAg
IGZwcmludGYgKGxvb3BfZHVtcF9zdHJlYW0sCgkJCSAgICAgIlNoYXJpbmcgYWRkcmVzcyBnaXZz
IGluIGluc24gJWRcbiIsCgkJCSAgICAgSU5TTl9VSUQgKHYtPmluc24pKTsKCQl9CgkgICAgICAv
KiBJZiBtdWx0aXBsZSBhZGRyZXNzIEdJVnMgaGF2ZSBiZWVuIGNvbWJpbmVkIHdpdGggdGhlCgkJ
IHNhbWUgZGVzdF9yZWcgR0lWLCBkbyBub3QgY3JlYXRlIGEgbmV3IHJlZ2lzdGVyIGZvcgoJCSBl
YWNoLiAgKi8KCSAgICAgIGVsc2UgaWYgKHVucm9sbF90eXBlICE9IFVOUk9MTF9DT01QTEVURUxZ
CgkJICAgICAgICYmIHYtPmdpdl90eXBlID09IERFU1RfQUREUgoJCSAgICAgICAmJiB2LT5zYW1l
ICYmIHYtPnNhbWUtPmdpdl90eXBlID09IERFU1RfQUREUgoJCSAgICAgICAmJiB2LT5zYW1lLT51
bnJvbGxlZAoJCSAgICAgICAvKiBjb21iaW5lX2dpdnNfcCBtYXkgcmV0dXJuIHRydWUgZm9yIHNv
bWUgY2FzZXMKCQkJICB3aGVyZSB0aGUgYWRkIGFuZCBtdWx0IHZhbHVlcyBhcmUgbm90IGVxdWFs
LgoJCQkgIFRvIHNoYXJlIGEgcmVnaXN0ZXIgaGVyZSwgdGhlIHZhbHVlcyBtdXN0IGJlCgkJCSAg
ZXF1YWwuICAqLwoJCSAgICAgICAmJiBydHhfZXF1YWxfcCAodi0+c2FtZS0+bXVsdF92YWwsIHYt
Pm11bHRfdmFsKQoJCSAgICAgICAmJiBydHhfZXF1YWxfcCAodi0+c2FtZS0+YWRkX3ZhbCwgdi0+
YWRkX3ZhbCkKCQkgICAgICAgLyogSWYgdGhlIG1lbW9yeSByZWZlcmVuY2VzIGhhdmUgZGlmZmVy
ZW50IG1vZGVzLAoJCQkgIHRoZW4gdGhlIGFkZHJlc3MgbWF5IG5vdCBiZSB2YWxpZCBhbmQgd2Ug
bXVzdAoJCQkgIG5vdCBzaGFyZSByZWdpc3RlcnMuICAqLwoJCSAgICAgICAmJiB2ZXJpZnlfYWRk
cmVzc2VzICh2LCBnaXZfaW5jLCB1bnJvbGxfbnVtYmVyKSkKCQl7CgkJICB2LT5kZXN0X3JlZyA9
IHYtPnNhbWUtPmRlc3RfcmVnOwoJCSAgdi0+c2hhcmVkID0gMTsKCQl9CgkgICAgICBlbHNlIGlm
ICh1bnJvbGxfdHlwZSAhPSBVTlJPTExfQ09NUExFVEVMWSkKCQl7CgkJICAvKiBJZiBub3QgY29t
cGxldGVseSB1bnJvbGxpbmcgdGhlIGxvb3AsIHRoZW4gY3JlYXRlIGEgbmV3CgkJICAgICByZWdp
c3RlciB0byBob2xkIHRoZSBzcGxpdCB2YWx1ZSBvZiB0aGUgREVTVF9BRERSIGdpdi4KCQkgICAg
IEVtaXQgaW5zbiB0byBpbml0aWFsaXplIGl0cyB2YWx1ZSBiZWZvcmUgbG9vcCBzdGFydC4gICov
CgoJCSAgcnR4IHRlbSA9IGdlbl9yZWdfcnR4ICh2LT5tb2RlKTsKCQkgIHN0cnVjdCBpbmR1Y3Rp
b24gKnNhbWUgPSB2LT5zYW1lOwoJCSAgcnR4IG5ld19yZWcgPSB2LT5uZXdfcmVnOwoJCSAgcmVj
b3JkX2Jhc2VfdmFsdWUgKFJFR05PICh0ZW0pLCB2LT5hZGRfdmFsLCAwKTsKCgkJICBpZiAoc2Ft
ZSAmJiBzYW1lLT5kZXJpdmVkX2Zyb20pCgkJICAgIHsKCQkgICAgICAvKiBjYWxjdWxhdGVfZ2l2
X2luYyBkb2Vzbid0IHdvcmsgZm9yIGRlcml2ZWQgZ2l2cy4KCQkJIGNvcHlfbG9vcF9ib2R5IHdv
cmtzIGFyb3VuZCB0aGUgcHJvYmxlbSBmb3IgdGhlCgkJCSBERVNUX1JFRyBnaXZzIHRoZW1zZWx2
ZXMsIGJ1dCBpdCBjYW4ndCBoYW5kbGUKCQkJIERFU1RfQUREUiBnaXZzIHRoYXQgaGF2ZSBiZWVu
IGNvbWJpbmVkIHdpdGgKCQkJIGEgZGVyaXZlZCBERVNUX1JFRyBnaXYuCgkJCSBTbyBIYW5kbGUg
ViBhcyBpZiB0aGUgZ2l2IGZyb20gd2hpY2ggVi0+U0FNRSBoYXMKCQkJIGJlZW4gZGVyaXZlZCBo
YXMgYmVlbiBjb21iaW5lZCB3aXRoIFYuCgkJCSByZWNvbWJpbmVfZ2l2cyBvbmx5IGRlcml2ZXMg
Z2l2cyBmcm9tIGdpdnMgdGhhdAoJCQkgYXJlIHJlZHVjZWQgdGhlIG9yZGluYXJ5LCBzbyB3ZSBu
ZWVkIG5vdCB3b3JyeQoJCQkgYWJvdXQgc2FtZS0+ZGVyaXZlZF9mcm9tIGJlaW5nIGluIHR1cm4g
ZGVyaXZlZC4gICovCgoJCSAgICAgIHNhbWUgPSBzYW1lLT5kZXJpdmVkX2Zyb207CgkJICAgICAg
bmV3X3JlZyA9IGV4cHJlc3NfZnJvbSAoc2FtZSwgdik7CgkJICAgICAgbmV3X3JlZyA9IHJlcGxh
Y2VfcnR4IChuZXdfcmVnLCBzYW1lLT5kZXN0X3JlZywKCQkJCQkgICAgIHNhbWUtPm5ld19yZWcp
OwoJCSAgICB9CgoJCSAgLyogSWYgdGhlIGFkZHJlc3MgZ2l2IGhhcyBhIGNvbnN0YW50IGluIGl0
cyBuZXdfcmVnIHZhbHVlLAoJCSAgICAgdGhlbiB0aGlzIGNvbnN0YW50IGNhbiBiZSBwdWxsZWQg
b3V0IGFuZCBwdXQgaW4gdmFsdWUsCgkJICAgICBpbnN0ZWFkIG9mIGJlaW5nIHBhcnQgb2YgdGhl
IGluaXRpYWxpemF0aW9uIGNvZGUuICAqLwoKCQkgIGlmIChHRVRfQ09ERSAobmV3X3JlZykgPT0g
UExVUwoJCSAgICAgICYmIEdFVF9DT0RFIChYRVhQIChuZXdfcmVnLCAxKSkgPT0gQ09OU1RfSU5U
KQoJCSAgICB7CgkJICAgICAgdi0+ZGVzdF9yZWcKCQkJPSBwbHVzX2NvbnN0YW50ICh0ZW0sIElO
VFZBTCAoWEVYUCAobmV3X3JlZywgMSkpKTsKCgkJICAgICAgLyogT25seSBzdWNjZWVkIGlmIHRo
aXMgd2lsbCBnaXZlIHZhbGlkIGFkZHJlc3Nlcy4KCQkJIFRyeSB0byB2YWxpZGF0ZSBib3RoIHRo
ZSBmaXJzdCBhbmQgdGhlIGxhc3QKCQkJIGFkZHJlc3MgcmVzdWx0aW5nIGZyb20gbG9vcCB1bnJv
bGxpbmcsIGlmCgkJCSBvbmUgZmFpbHMsIHRoZW4gY2FuJ3QgZG8gY29uc3QgZWxpbSBoZXJlLiAg
Ki8KCQkgICAgICBpZiAodmVyaWZ5X2FkZHJlc3NlcyAodiwgZ2l2X2luYywgdW5yb2xsX251bWJl
cikpCgkJCXsKCQkJICAvKiBTYXZlIHRoZSBuZWdhdGl2ZSBvZiB0aGUgZWxpbWluYXRlZCBjb25z
dCwgc28KCQkJICAgICB0aGF0IHdlIGNhbiBjYWxjdWxhdGUgdGhlIGRlc3RfcmVnJ3MgaW5jcmVt
ZW50CgkJCSAgICAgdmFsdWUgbGF0ZXIuICAqLwoJCQkgIHYtPmNvbnN0X2FkanVzdCA9IC0gSU5U
VkFMIChYRVhQIChuZXdfcmVnLCAxKSk7CgoJCQkgIG5ld19yZWcgPSBYRVhQIChuZXdfcmVnLCAw
KTsKCQkJICBpZiAobG9vcF9kdW1wX3N0cmVhbSkKCQkJICAgIGZwcmludGYgKGxvb3BfZHVtcF9z
dHJlYW0sCgkJCQkgICAgICJFbGltaW5hdGluZyBjb25zdGFudCBmcm9tIGdpdiAlZFxuIiwKCQkJ
CSAgICAgUkVHTk8gKHRlbSkpOwoJCQl9CgkJICAgICAgZWxzZQoJCQl2LT5kZXN0X3JlZyA9IHRl
bTsKCQkgICAgfQoJCSAgZWxzZQoJCSAgICB2LT5kZXN0X3JlZyA9IHRlbTsKCgkJICAvKiBJZiB0
aGUgYWRkcmVzcyBoYXNuJ3QgYmVlbiBjaGVja2VkIGZvciB2YWxpZGl0eSB5ZXQsIGRvIHNvCgkJ
ICAgICBub3csIGFuZCBmYWlsIGNvbXBsZXRlbHkgaWYgZWl0aGVyIHRoZSBmaXJzdCBvciB0aGUg
bGFzdAoJCSAgICAgdW5yb2xsZWQgY29weSBvZiB0aGUgYWRkcmVzcyBpcyBub3QgYSB2YWxpZCBh
ZGRyZXNzCgkJICAgICBmb3IgdGhlIGluc3RydWN0aW9uIHRoYXQgdXNlcyBpdC4gICovCgkJICBp
ZiAodi0+ZGVzdF9yZWcgPT0gdGVtCgkJICAgICAgJiYgISB2ZXJpZnlfYWRkcmVzc2VzICh2LCBn
aXZfaW5jLCB1bnJvbGxfbnVtYmVyKSkKCQkgICAgewoJCSAgICAgIGZvciAodjIgPSB2LT5uZXh0
X2l2OyB2MjsgdjIgPSB2Mi0+bmV4dF9pdikKCQkJaWYgKHYyLT5zYW1lX2luc24gPT0gdikKCQkJ
ICB2Mi0+c2FtZV9pbnNuID0gMDsKCgkJICAgICAgaWYgKGxvb3BfZHVtcF9zdHJlYW0pCgkJCWZw
cmludGYgKGxvb3BfZHVtcF9zdHJlYW0sCgkJCQkgIkludmFsaWQgYWRkcmVzcyBmb3IgZ2l2IGF0
IGluc24gJWRcbiIsCgkJCQkgSU5TTl9VSUQgKHYtPmluc24pKTsKCQkgICAgICBjb250aW51ZTsK
CQkgICAgfQoKCQkgIHYtPm5ld19yZWcgPSBuZXdfcmVnOwoJCSAgdi0+c2FtZSA9IHNhbWU7CgoJ
CSAgLyogV2Ugc2V0IHRoaXMgYWZ0ZXIgdGhlIGFkZHJlc3MgY2hlY2ssIHRvIGd1YXJhbnRlZSB0
aGF0CgkJICAgICB0aGUgcmVnaXN0ZXIgd2lsbCBiZSBpbml0aWFsaXplZC4gICovCgkJICB2LT51
bnJvbGxlZCA9IDE7CgoJCSAgLyogVG8gaW5pdGlhbGl6ZSB0aGUgbmV3IHJlZ2lzdGVyLCBqdXN0
IG1vdmUgdGhlIHZhbHVlIG9mCgkJICAgICBuZXdfcmVnIGludG8gaXQuICBUaGlzIGlzIG5vdCBn
dWFyYW50ZWVkIHRvIGdpdmUgYSB2YWxpZAoJCSAgICAgaW5zdHJ1Y3Rpb24gb24gbWFjaGluZXMg
d2l0aCBjb21wbGV4IGFkZHJlc3NpbmcgbW9kZXMuCgkJICAgICBJZiB3ZSBjYW4ndCByZWNvZ25p
emUgaXQsIHRoZW4gZGVsZXRlIGl0IGFuZCBlbWl0IGluc25zCgkJICAgICB0byBjYWxjdWxhdGUg
dGhlIHZhbHVlIGZyb20gc2NyYXRjaC4gICovCgkJICBlbWl0X2luc25fYmVmb3JlIChnZW5fcnR4
X1NFVCAoVk9JRG1vZGUsIHRlbSwKCQkJCQkJIGNvcHlfcnR4ICh2LT5uZXdfcmVnKSksCgkJCQkg
ICAgbG9vcF9zdGFydCk7CgkJICBpZiAocmVjb2dfbWVtb2l6ZWQgKFBSRVZfSU5TTiAobG9vcF9z
dGFydCkpIDwgMCkKCQkgICAgewoJCSAgICAgIHJ0eCBzZXF1ZW5jZSwgcmV0OwoKCQkgICAgICAv
KiBXZSBjYW4ndCB1c2UgYmwtPmluaXRpYWxfdmFsdWUgdG8gY29tcHV0ZSB0aGUgaW5pdGlhbAoJ
CQkgdmFsdWUsIGJlY2F1c2UgdGhlIGxvb3AgbWF5IGhhdmUgYmVlbiBwcmVjb25kaXRpb25lZC4K
CQkJIFdlIG11c3QgY2FsY3VsYXRlIGl0IGZyb20gTkVXX1JFRy4gIFRyeSB1c2luZwoJCQkgZm9y
Y2Vfb3BlcmFuZCBpbnN0ZWFkIG9mIGVtaXRfaXZfYWRkX211bHQuICAqLwoJCSAgICAgIGRlbGV0
ZV9pbnNuIChQUkVWX0lOU04gKGxvb3Bfc3RhcnQpKTsKCgkJICAgICAgc3RhcnRfc2VxdWVuY2Ug
KCk7CgkJICAgICAgcmV0ID0gZm9yY2Vfb3BlcmFuZCAodi0+bmV3X3JlZywgdGVtKTsKCQkgICAg
ICBpZiAocmV0ICE9IHRlbSkKCQkJZW1pdF9tb3ZlX2luc24gKHRlbSwgcmV0KTsKCQkgICAgICBz
ZXF1ZW5jZSA9IGdlbl9zZXF1ZW5jZSAoKTsKCQkgICAgICBlbmRfc2VxdWVuY2UgKCk7CgkJICAg
ICAgZW1pdF9pbnNuX2JlZm9yZSAoc2VxdWVuY2UsIGxvb3Bfc3RhcnQpOwoKCQkgICAgICBpZiAo
bG9vcF9kdW1wX3N0cmVhbSkKCQkJZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkJCSAiSW52
YWxpZCBpbml0IGluc24sIHJld3JpdHRlbi5cbiIpOwoJCSAgICB9CgkJfQoJICAgICAgZWxzZQoJ
CXsKCQkgIHYtPmRlc3RfcmVnID0gdmFsdWU7CgoJCSAgLyogQ2hlY2sgdGhlIHJlc3VsdGluZyBh
ZGRyZXNzIGZvciB2YWxpZGl0eSwgYW5kIGZhaWwKCQkgICAgIGlmIHRoZSByZXN1bHRpbmcgYWRk
cmVzcyB3b3VsZCBiZSBpbnZhbGlkLiAgKi8KCQkgIGlmICghIHZlcmlmeV9hZGRyZXNzZXMgKHYs
IGdpdl9pbmMsIHVucm9sbF9udW1iZXIpKQoJCSAgICB7CgkJICAgICAgZm9yICh2MiA9IHYtPm5l
eHRfaXY7IHYyOyB2MiA9IHYyLT5uZXh0X2l2KQoJCQlpZiAodjItPnNhbWVfaW5zbiA9PSB2KQoJ
CQkgIHYyLT5zYW1lX2luc24gPSAwOwoKCQkgICAgICBpZiAobG9vcF9kdW1wX3N0cmVhbSkKCQkJ
ZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkJCSAiSW52YWxpZCBhZGRyZXNzIGZvciBnaXYg
YXQgaW5zbiAlZFxuIiwKCQkJCSBJTlNOX1VJRCAodi0+aW5zbikpOwoJCSAgICAgIGNvbnRpbnVl
OwoJCSAgICB9CgkJICBpZiAodi0+c2FtZSAmJiB2LT5zYW1lLT5kZXJpdmVkX2Zyb20pCgkJICAg
IHsKCQkgICAgICAvKiBIYW5kbGUgViBhcyBpZiB0aGUgZ2l2IGZyb20gd2hpY2ggVi0+U0FNRSBo
YXMKCQkJIGJlZW4gZGVyaXZlZCBoYXMgYmVlbiBjb21iaW5lZCB3aXRoIFYuICAqLwoKCQkgICAg
ICB2LT5zYW1lID0gdi0+c2FtZS0+ZGVyaXZlZF9mcm9tOwoJCSAgICAgIHYtPm5ld19yZWcgPSBl
eHByZXNzX2Zyb20gKHYtPnNhbWUsIHYpOwoJCSAgICAgIHYtPm5ld19yZWcgPSByZXBsYWNlX3J0
eCAodi0+bmV3X3JlZywgdi0+c2FtZS0+ZGVzdF9yZWcsCgkJCQkJCXYtPnNhbWUtPm5ld19yZWcp
OwoJCSAgICB9CgoJCX0KCgkgICAgICAvKiBTdG9yZSB0aGUgdmFsdWUgb2YgZGVzdF9yZWcgaW50
byB0aGUgaW5zbi4gIFRoaXMgc2hhcmluZwoJCSB3aWxsIG5vdCBiZSBhIHByb2JsZW0gYXMgdGhp
cyBpbnNuIHdpbGwgYWx3YXlzIGJlIGNvcGllZAoJCSBsYXRlci4gICovCgoJICAgICAgKnYtPmxv
Y2F0aW9uID0gdi0+ZGVzdF9yZWc7CgoJICAgICAgLyogSWYgdGhpcyBhZGRyZXNzIGdpdiBpcyBj
b21iaW5lZCB3aXRoIGEgZGVzdCByZWcgZ2l2LCB0aGVuCgkJIHNhdmUgdGhlIGJhc2UgZ2l2J3Mg
aW5kdWN0aW9uIHBvaW50ZXIgc28gdGhhdCB3ZSB3aWxsIGJlCgkJIGFibGUgdG8gaGFuZGxlIHRo
aXMgYWRkcmVzcyBnaXYgcHJvcGVybHkuICBUaGUgYmFzZSBnaXYKCQkgaXRzZWxmIGRvZXMgbm90
IGhhdmUgdG8gYmUgc3BsaXR0YWJsZS4gICovCgoJICAgICAgaWYgKHYtPnNhbWUgJiYgdi0+c2Ft
ZS0+Z2l2X3R5cGUgPT0gREVTVF9SRUcpCgkJYWRkcl9jb21iaW5lZF9yZWdzW1JFR05PICh2LT5z
YW1lLT5uZXdfcmVnKV0gPSB2LT5zYW1lOwoKCSAgICAgIGlmIChHRVRfQ09ERSAodi0+bmV3X3Jl
ZykgPT0gUkVHKQoJCXsKCQkgIC8qIFRoaXMgZ2l2IG1heWJlIGhhc24ndCBiZWVuIGNvbWJpbmVk
IHdpdGggYW55IG90aGVycy4KCQkgICAgIE1ha2Ugc3VyZSB0aGF0IGl0J3MgZ2l2IGlzIG1hcmtl
ZCBhcyBzcGxpdHRhYmxlIGhlcmUuICAqLwoKCQkgIHNwbGl0dGFibGVfcmVnc1tSRUdOTyAodi0+
bmV3X3JlZyldID0gdmFsdWU7CgkJICBkZXJpdmVkX3JlZ3NbUkVHTk8gKHYtPm5ld19yZWcpXSA9
IHYtPmRlcml2ZWRfZnJvbSAhPSAwOwoKCQkgIC8qIE1ha2UgaXQgYXBwZWFyIHRvIGRlcGVuZCB1
cG9uIGl0c2VsZiwgc28gdGhhdCB0aGUKCQkgICAgIGdpdiB3aWxsIGJlIHByb3Blcmx5IHNwbGl0
IGluIHRoZSBtYWluIGxvb3AgYWJvdmUuICAqLwoJCSAgaWYgKCEgdi0+c2FtZSkKCQkgICAgewoJ
CSAgICAgIHYtPnNhbWUgPSB2OwoJCSAgICAgIGFkZHJfY29tYmluZWRfcmVnc1tSRUdOTyAodi0+
bmV3X3JlZyldID0gdjsKCQkgICAgfQoJCX0KCgkgICAgICBpZiAobG9vcF9kdW1wX3N0cmVhbSkK
CQlmcHJpbnRmIChsb29wX2R1bXBfc3RyZWFtLCAiREVTVF9BRERSIGdpdiBiZWluZyBzcGxpdC5c
biIpOwoJICAgIH0KCX0KICAgICAgZWxzZQoJewojaWYgMAoJICAvKiBDdXJyZW50bHksIHVucmVk
dWNlZCBnaXYncyBjYW4ndCBiZSBzcGxpdC4gIFRoaXMgaXMgbm90IHRvbyBtdWNoCgkgICAgIG9m
IGEgcHJvYmxlbSBzaW5jZSB1bnJlZHVjZWQgZ2l2J3MgYXJlIG5vdCBsaXZlIGFjcm9zcyBsb29w
CgkgICAgIGl0ZXJhdGlvbnMgYW55d2F5cy4gIFdoZW4gdW5yb2xsaW5nIGEgbG9vcCBjb21wbGV0
ZWx5IHRob3VnaCwKCSAgICAgaXQgbWFrZXMgc2Vuc2UgdG8gcmVkdWNlJnNwbGl0IGdpdnMgd2hl
biBwb3NzaWJsZSwgYXMgdGhpcyB3aWxsCgkgICAgIHJlc3VsdCBpbiBzaW1wbGVyIGluc3RydWN0
aW9ucywgYW5kIHdpbGwgbm90IHJlcXVpcmUgdGhhdCBhIHJlZwoJICAgICBiZSBsaXZlIGFjcm9z
cyBsb29wIGl0ZXJhdGlvbnMuICAqLwoKCSAgc3BsaXR0YWJsZV9yZWdzW1JFR05PICh2LT5kZXN0
X3JlZyldID0gdmFsdWU7CgkgIGZwcmludGYgKHN0ZGVyciwgIkdpdiAlZCBhdCBpbnNuICVkIG5v
dCByZWR1Y2VkXG4iLAoJCSAgIFJFR05PICh2LT5kZXN0X3JlZyksIElOU05fVUlEICh2LT5pbnNu
KSk7CiNlbHNlCgkgIGNvbnRpbnVlOwojZW5kaWYKCX0KCiAgICAgIC8qIFVucmVkdWNlZCBnaXZz
IGFyZSBvbmx5IHVwZGF0ZWQgb25jZSBieSBkZWZpbml0aW9uLiAgUmVkdWNlZCBnaXZzCgkgYXJl
IHVwZGF0ZWQgYXMgbWFueSB0aW1lcyBhcyB0aGVpciBiaXYgaXMuICBNYXJrIGl0IHNvIGlmIHRo
aXMgaXMKCSBhIHNwbGl0dGFibGUgcmVnaXN0ZXIuICBEb24ndCBuZWVkIHRvIGRvIGFueXRoaW5n
IGZvciBhZGRyZXNzIGdpdnMKCSB3aGVyZSB0aGlzIG1heSBub3QgYmUgYSByZWdpc3Rlci4gICov
CgogICAgICBpZiAoR0VUX0NPREUgKHYtPm5ld19yZWcpID09IFJFRykKCXsKCSAgaW50IGNvdW50
ID0gMTsKCSAgaWYgKCEgdi0+aWdub3JlKQoJICAgIGNvdW50ID0gcmVnX2Jpdl9jbGFzc1tSRUdO
TyAodi0+c3JjX3JlZyldLT5iaXZfY291bnQ7CgoJICBpZiAoY291bnQgPiAxICYmIHYtPmRlcml2
ZWRfZnJvbSkKCSAgICAgLyogSW4gdGhpcyBjYXNlLCB0aGVyZSBpcyBvbmUgc2V0IHdoZXJlIHRo
ZSBnaXYgaW5zbiB3YXMgYW5kIG9uZQoJCXNldCBlYWNoIGFmdGVyIGVhY2ggYml2IGluY3JlbWVu
dC4gIChNb3N0IGFyZSBsaWtlbHkgZGVhZC4pICAqLwoJICAgIGNvdW50Kys7CgoJICBzcGxpdHRh
YmxlX3JlZ3NfdXBkYXRlc1tSRUdOTyAodi0+bmV3X3JlZyldID0gY291bnQ7Cgl9CgogICAgICBy
ZXN1bHQrKzsKCiAgICAgIGlmIChsb29wX2R1bXBfc3RyZWFtKQoJewoJICBpbnQgcmVnbnVtOwoK
CSAgaWYgKEdFVF9DT0RFICh2LT5kZXN0X3JlZykgPT0gQ09OU1RfSU5UKQoJICAgIHJlZ251bSA9
IC0xOwoJICBlbHNlIGlmIChHRVRfQ09ERSAodi0+ZGVzdF9yZWcpICE9IFJFRykKCSAgICByZWdu
dW0gPSBSRUdOTyAoWEVYUCAodi0+ZGVzdF9yZWcsIDApKTsKCSAgZWxzZQoJICAgIHJlZ251bSA9
IFJFR05PICh2LT5kZXN0X3JlZyk7CgkgIGZwcmludGYgKGxvb3BfZHVtcF9zdHJlYW0sICJHaXYg
JWQgYXQgaW5zbiAlZCBzYWZlIHRvIHNwbGl0LlxuIiwKCQkgICByZWdudW0sIElOU05fVUlEICh2
LT5pbnNuKSk7Cgl9CiAgICB9CgogIHJldHVybiByZXN1bHQ7Cn0KDAovKiBUcnkgdG8gcHJvdmUg
dGhhdCB0aGUgcmVnaXN0ZXIgaXMgZGVhZCBhZnRlciB0aGUgbG9vcCBleGl0cy4gIFRyYWNlIGV2
ZXJ5CiAgIGxvb3AgZXhpdCBsb29raW5nIGZvciBhbiBpbnNuIHRoYXQgd2lsbCBhbHdheXMgYmUg
ZXhlY3V0ZWQsIHdoaWNoIHNldHMKICAgdGhlIHJlZ2lzdGVyIHRvIHNvbWUgdmFsdWUsIGFuZCBh
cHBlYXJzIGJlZm9yZSB0aGUgZmlyc3QgdXNlIG9mIHRoZSByZWdpc3RlcgogICBpcyBmb3VuZC4g
IElmIHN1Y2Nlc3NmdWwsIHRoZW4gcmV0dXJuIDEsIG90aGVyd2lzZSByZXR1cm4gMC4gICovCgov
KiA/PyBDb3VsZCBiZSBtYWRlIG1vcmUgaW50ZWxsaWdlbnQgaW4gdGhlIGhhbmRsaW5nIG9mIGp1
bXBzLCBzbyB0aGF0CiAgIGl0IGNhbiBzZWFyY2ggcGFzdCBpZiBzdGF0ZW1lbnRzIGFuZCBvdGhl
ciBzaW1pbGFyIHN0cnVjdHVyZXMuICAqLwoKc3RhdGljIGludApyZWdfZGVhZF9hZnRlcl9sb29w
IChyZWcsIGxvb3Bfc3RhcnQsIGxvb3BfZW5kKQogICAgIHJ0eCByZWcsIGxvb3Bfc3RhcnQsIGxv
b3BfZW5kOwp7CiAgcnR4IGluc24sIGxhYmVsOwogIGVudW0gcnR4X2NvZGUgY29kZTsKICBpbnQg
anVtcF9jb3VudCA9IDA7CiAgaW50IGxhYmVsX2NvdW50ID0gMDsKICBpbnQgdGhpc19sb29wX251
bSA9IHVpZF9sb29wX251bVtJTlNOX1VJRCAobG9vcF9zdGFydCldOwoKICAvKiBJbiBhZGRpdGlv
biB0byBjaGVja2luZyBhbGwgZXhpdHMgb2YgdGhpcyBsb29wLCB3ZSBtdXN0IGFsc28gY2hlY2sK
ICAgICBhbGwgZXhpdHMgb2YgaW5uZXIgbmVzdGVkIGxvb3BzIHRoYXQgd291bGQgZXhpdCB0aGlz
IGxvb3AuICBXZSBkb24ndAogICAgIGhhdmUgYW55IHdheSB0byBpZGVudGlmeSB0aG9zZSwgc28g
d2UganVzdCBnaXZlIHVwIGlmIHRoZXJlIGFyZSBhbnkKICAgICBzdWNoIGlubmVyIGxvb3AgZXhp
dHMuICAqLwoKICBmb3IgKGxhYmVsID0gbG9vcF9udW1iZXJfZXhpdF9sYWJlbHNbdGhpc19sb29w
X251bV07IGxhYmVsOwogICAgICAgbGFiZWwgPSBMQUJFTF9ORVhUUkVGIChsYWJlbCkpCiAgICBs
YWJlbF9jb3VudCsrOwoKICBpZiAobGFiZWxfY291bnQgIT0gbG9vcF9udW1iZXJfZXhpdF9jb3Vu
dFt0aGlzX2xvb3BfbnVtXSkKICAgIHJldHVybiAwOwoKICAvKiBIQUNLOiBNdXN0IGFsc28gc2Vh
cmNoIHRoZSBsb29wIGZhbGwgdGhyb3VnaCBleGl0LCBjcmVhdGUgYSBsYWJlbF9yZWYKICAgICBo
ZXJlIHdoaWNoIHBvaW50cyB0byB0aGUgbG9vcF9lbmQsIGFuZCBhcHBlbmQgdGhlIGxvb3BfbnVt
YmVyX2V4aXRfbGFiZWxzCiAgICAgbGlzdCB0byBpdC4gICovCiAgbGFiZWwgPSBnZW5fcnR4X0xB
QkVMX1JFRiAoVk9JRG1vZGUsIGxvb3BfZW5kKTsKICBMQUJFTF9ORVhUUkVGIChsYWJlbCkgPSBs
b29wX251bWJlcl9leGl0X2xhYmVsc1t0aGlzX2xvb3BfbnVtXTsKCiAgZm9yICggOyBsYWJlbDsg
bGFiZWwgPSBMQUJFTF9ORVhUUkVGIChsYWJlbCkpCiAgICB7CiAgICAgIC8qIFN1Y2NlZWQgaWYg
ZmluZCBhbiBpbnNuIHdoaWNoIHNldHMgdGhlIGJpdiBvciBpZiByZWFjaCBlbmQgb2YKCSBmdW5j
dGlvbi4gIEZhaWwgaWYgZmluZCBhbiBpbnNuIHRoYXQgdXNlcyB0aGUgYml2LCBvciBpZiBjb21l
IHRvCgkgYSBjb25kaXRpb25hbCBqdW1wLiAgKi8KCiAgICAgIGluc24gPSBORVhUX0lOU04gKFhF
WFAgKGxhYmVsLCAwKSk7CiAgICAgIHdoaWxlIChpbnNuKQoJewoJICBjb2RlID0gR0VUX0NPREUg
KGluc24pOwoJICBpZiAoR0VUX1JUWF9DTEFTUyAoY29kZSkgPT0gJ2knKQoJICAgIHsKCSAgICAg
IHJ0eCBzZXQ7CgoJICAgICAgaWYgKHJlZ19yZWZlcmVuY2VkX3AgKHJlZywgUEFUVEVSTiAoaW5z
bikpKQoJCXJldHVybiAwOwoKCSAgICAgIHNldCA9IHNpbmdsZV9zZXQgKGluc24pOwoJICAgICAg
aWYgKHNldCAmJiBydHhfZXF1YWxfcCAoU0VUX0RFU1QgKHNldCksIHJlZykpCgkJYnJlYWs7Cgkg
ICAgfQoKCSAgaWYgKGNvZGUgPT0gSlVNUF9JTlNOKQoJICAgIHsKCSAgICAgIGlmIChHRVRfQ09E
RSAoUEFUVEVSTiAoaW5zbikpID09IFJFVFVSTikKCQlicmVhazsKCSAgICAgIGVsc2UgaWYgKCEg
c2ltcGxlanVtcF9wIChpbnNuKQoJCSAgICAgICAvKiBQcmV2ZW50IGluZmluaXRlIGxvb3AgZm9s
bG93aW5nIGluZmluaXRlIGxvb3BzLiAgKi8KCQkgICAgICAgfHwganVtcF9jb3VudCsrID4gMjAp
CgkJcmV0dXJuIDA7CgkgICAgICBlbHNlCgkJaW5zbiA9IEpVTVBfTEFCRUwgKGluc24pOwoJICAg
IH0KCgkgIGluc24gPSBORVhUX0lOU04gKGluc24pOwoJfQogICAgfQoKICAvKiBTdWNjZXNzLCB0
aGUgcmVnaXN0ZXIgaXMgZGVhZCBvbiBhbGwgbG9vcCBleGl0cy4gICovCiAgcmV0dXJuIDE7Cn0K
Ci8qIFRyeSB0byBjYWxjdWxhdGUgdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBiaXYsIHRoZSB2YWx1
ZSBpdCB3aWxsIGhhdmUgYXQKICAgdGhlIGVuZCBvZiB0aGUgbG9vcC4gIElmIHdlIGNhbiBkbyBp
dCwgcmV0dXJuIHRoYXQgdmFsdWUuICAqLwoKcnR4CmZpbmFsX2Jpdl92YWx1ZSAoYmwsIGxvb3Bf
c3RhcnQsIGxvb3BfZW5kLCBuX2l0ZXJhdGlvbnMpCiAgICAgc3RydWN0IGl2X2NsYXNzICpibDsK
ICAgICBydHggbG9vcF9zdGFydCwgbG9vcF9lbmQ7CiAgICAgdW5zaWduZWQgSE9TVF9XSURFX0lO
VCBuX2l0ZXJhdGlvbnM7CnsKICBydHggaW5jcmVtZW50LCB0ZW07CgogIC8qID8/PyBUaGlzIG9u
bHkgd29ya3MgZm9yIE1PREVfSU5UIGJpdidzLiAgUmVqZWN0IGFsbCBvdGhlcnMgZm9yIG5vdy4g
ICovCgogIGlmIChHRVRfTU9ERV9DTEFTUyAoYmwtPmJpdi0+bW9kZSkgIT0gTU9ERV9JTlQpCiAg
ICByZXR1cm4gMDsKCiAgLyogVGhlIGZpbmFsIHZhbHVlIGZvciByZXZlcnNlZCBiaXZzIG11c3Qg
YmUgY2FsY3VsYXRlZCBkaWZmZXJlbnRseSB0aGFuCiAgICAgIGZvciBvcmRpbmFyeSBiaXZzLiAg
SW4gdGhpcyBjYXNlLCB0aGVyZSBpcyBhbHJlYWR5IGFuIGluc24gYWZ0ZXIgdGhlCiAgICAgbG9v
cCB3aGljaCBzZXRzIHRoaXMgYml2J3MgZmluYWwgdmFsdWUgKGlmIG5lY2Vzc2FyeSksIGFuZCB0
aGVyZSBhcmUKICAgICBubyBvdGhlciBsb29wIGV4aXRzLCBzbyB3ZSBjYW4gcmV0dXJuIGFueSB2
YWx1ZS4gICovCiAgaWYgKGJsLT5yZXZlcnNlZCkKICAgIHsKICAgICAgaWYgKGxvb3BfZHVtcF9z
dHJlYW0pCglmcHJpbnRmIChsb29wX2R1bXBfc3RyZWFtLAoJCSAiRmluYWwgYml2IHZhbHVlIGZv
ciAlZCwgcmV2ZXJzZWQgYml2LlxuIiwgYmwtPnJlZ25vKTsKCiAgICAgIHJldHVybiBjb25zdDBf
cnR4OwogICAgfQoKICAvKiBUcnkgdG8gY2FsY3VsYXRlIHRoZSBmaW5hbCB2YWx1ZSBhcyBpbml0
aWFsIHZhbHVlICsgKG51bWJlciBvZiBpdGVyYXRpb25zCiAgICAgKiBpbmNyZW1lbnQpLiAgRm9y
IHRoaXMgdG8gd29yaywgaW5jcmVtZW50IG11c3QgYmUgaW52YXJpYW50LCB0aGUgb25seQogICAg
IGV4aXQgZnJvbSB0aGUgbG9vcCBtdXN0IGJlIHRoZSBmYWxsIHRocm91Z2ggYXQgdGhlIGJvdHRv
bSAob3RoZXJ3aXNlCiAgICAgaXQgbWF5IG5vdCBoYXZlIGl0cyBmaW5hbCB2YWx1ZSB3aGVuIHRo
ZSBsb29wIGV4aXRzKSwgYW5kIHRoZSBpbml0aWFsCiAgICAgdmFsdWUgb2YgdGhlIGJpdiBtdXN0
IGJlIGludmFyaWFudC4gICovCgogIGlmIChuX2l0ZXJhdGlvbnMgIT0gMAogICAgICAmJiAhIGxv
b3BfbnVtYmVyX2V4aXRfY291bnRbdWlkX2xvb3BfbnVtW0lOU05fVUlEIChsb29wX3N0YXJ0KV1d
CiAgICAgICYmIGludmFyaWFudF9wIChibC0+aW5pdGlhbF92YWx1ZSkpCiAgICB7CiAgICAgIGlu
Y3JlbWVudCA9IGJpdl90b3RhbF9pbmNyZW1lbnQgKGJsLCBsb29wX3N0YXJ0LCBsb29wX2VuZCk7
CgogICAgICBpZiAoaW5jcmVtZW50ICYmIGludmFyaWFudF9wIChpbmNyZW1lbnQpKQoJewoJICAv
KiBDYW4gY2FsY3VsYXRlIHRoZSBsb29wIGV4aXQgdmFsdWUsIGVtaXQgaW5zbnMgYWZ0ZXIgbG9v
cAoJICAgICBlbmQgdG8gY2FsY3VsYXRlIHRoaXMgdmFsdWUgaW50byBhIHRlbXBvcmFyeSByZWdp
c3RlciBpbgoJICAgICBjYXNlIGl0IGlzIG5lZWRlZCBsYXRlci4gICovCgoJICB0ZW0gPSBnZW5f
cmVnX3J0eCAoYmwtPmJpdi0+bW9kZSk7CgkgIHJlY29yZF9iYXNlX3ZhbHVlIChSRUdOTyAodGVt
KSwgYmwtPmJpdi0+YWRkX3ZhbCwgMCk7CgkgIC8qIE1ha2Ugc3VyZSBsb29wX2VuZCBpcyBub3Qg
dGhlIGxhc3QgaW5zbi4gICovCgkgIGlmIChORVhUX0lOU04gKGxvb3BfZW5kKSA9PSAwKQoJICAg
IGVtaXRfbm90ZV9hZnRlciAoTk9URV9JTlNOX0RFTEVURUQsIGxvb3BfZW5kKTsKCSAgZW1pdF9p
dl9hZGRfbXVsdCAoaW5jcmVtZW50LCBHRU5fSU5UIChuX2l0ZXJhdGlvbnMpLAoJCQkgICAgYmwt
PmluaXRpYWxfdmFsdWUsIHRlbSwgTkVYVF9JTlNOIChsb29wX2VuZCkpOwoKCSAgaWYgKGxvb3Bf
ZHVtcF9zdHJlYW0pCgkgICAgZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgICAgICJGaW5h
bCBiaXYgdmFsdWUgZm9yICVkLCBjYWxjdWxhdGVkLlxuIiwgYmwtPnJlZ25vKTsKCgkgIHJldHVy
biB0ZW07Cgl9CiAgICB9CgogIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgYml2IGlzIGRlYWQgYXQg
YWxsIGxvb3AgZXhpdHMuICAqLwogIGlmIChyZWdfZGVhZF9hZnRlcl9sb29wIChibC0+Yml2LT5z
cmNfcmVnLCBsb29wX3N0YXJ0LCBsb29wX2VuZCkpCiAgICB7CiAgICAgIGlmIChsb29wX2R1bXBf
c3RyZWFtKQoJZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgIkZpbmFsIGJpdiB2YWx1ZSBm
b3IgJWQsIGJpdiBkZWFkIGFmdGVyIGxvb3AgZXhpdC5cbiIsCgkJIGJsLT5yZWdubyk7CgogICAg
ICByZXR1cm4gY29uc3QwX3J0eDsKICAgIH0KCiAgcmV0dXJuIDA7Cn0KCi8qIFRyeSB0byBjYWxj
dWxhdGUgdGhlIGZpbmFsIHZhbHVlIG9mIHRoZSBnaXYsIHRoZSB2YWx1ZSBpdCB3aWxsIGhhdmUg
YXQKICAgdGhlIGVuZCBvZiB0aGUgbG9vcC4gIElmIHdlIGNhbiBkbyBpdCwgcmV0dXJuIHRoYXQg
dmFsdWUuICAqLwoKcnR4CmZpbmFsX2dpdl92YWx1ZSAodiwgbG9vcF9zdGFydCwgbG9vcF9lbmQs
IG5faXRlcmF0aW9ucykKICAgICBzdHJ1Y3QgaW5kdWN0aW9uICp2OwogICAgIHJ0eCBsb29wX3N0
YXJ0LCBsb29wX2VuZDsKICAgICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIG5faXRlcmF0aW9uczsK
ewogIHN0cnVjdCBpdl9jbGFzcyAqYmw7CiAgcnR4IGluc247CiAgcnR4IGluY3JlbWVudCwgdGVt
OwogIHJ0eCBpbnNlcnRfYmVmb3JlLCBzZXE7CgogIGJsID0gcmVnX2Jpdl9jbGFzc1tSRUdOTyAo
di0+c3JjX3JlZyldOwoKICAvKiBUaGUgZmluYWwgdmFsdWUgZm9yIGdpdnMgd2hpY2ggZGVwZW5k
IG9uIHJldmVyc2VkIGJpdnMgbXVzdCBiZSBjYWxjdWxhdGVkCiAgICAgZGlmZmVyZW50bHkgdGhh
biBmb3Igb3JkaW5hcnkgZ2l2cy4gIEluIHRoaXMgY2FzZSwgdGhlcmUgaXMgYWxyZWFkeSBhbgog
ICAgIGluc24gYWZ0ZXIgdGhlIGxvb3Agd2hpY2ggc2V0cyB0aGlzIGdpdidzIGZpbmFsIHZhbHVl
IChpZiBuZWNlc3NhcnkpLAogICAgIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgbG9vcCBleGl0cywg
c28gd2UgY2FuIHJldHVybiBhbnkgdmFsdWUuICAqLwogIGlmIChibC0+cmV2ZXJzZWQpCiAgICB7
CiAgICAgIGlmIChsb29wX2R1bXBfc3RyZWFtKQoJZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwK
CQkgIkZpbmFsIGdpdiB2YWx1ZSBmb3IgJWQsIGRlcGVuZHMgb24gcmV2ZXJzZWQgYml2XG4iLAoJ
CSBSRUdOTyAodi0+ZGVzdF9yZWcpKTsKICAgICAgcmV0dXJuIGNvbnN0MF9ydHg7CiAgICB9Cgog
IC8qIFRyeSB0byBjYWxjdWxhdGUgdGhlIGZpbmFsIHZhbHVlIGFzIGEgZnVuY3Rpb24gb2YgdGhl
IGJpdiBpdCBkZXBlbmRzCiAgICAgdXBvbi4gIFRoZSBvbmx5IGV4aXQgZnJvbSB0aGUgbG9vcCBt
dXN0IGJlIHRoZSBmYWxsIHRocm91Z2ggYXQgdGhlIGJvdHRvbQogICAgIChvdGhlcndpc2UgaXQg
bWF5IG5vdCBoYXZlIGl0cyBmaW5hbCB2YWx1ZSB3aGVuIHRoZSBsb29wIGV4aXRzKS4gICovCgog
IC8qID8/PyBDYW4gY2FsY3VsYXRlIHRoZSBmaW5hbCBnaXYgdmFsdWUgYnkgc3VidHJhY3Rpbmcg
b2ZmIHRoZQogICAgIGV4dHJhIGJpdiBpbmNyZW1lbnRzIHRpbWVzIHRoZSBnaXYncyBtdWx0X3Zh
bC4gIFRoZSBsb29wIG11c3QgaGF2ZQogICAgIG9ubHkgb25lIGV4aXQgZm9yIHRoaXMgdG8gd29y
aywgYnV0IHRoZSBsb29wIGl0ZXJhdGlvbnMgZG9lcyBub3QgbmVlZAogICAgIHRvIGJlIGtub3du
LiAgKi8KCiAgaWYgKG5faXRlcmF0aW9ucyAhPSAwCiAgICAgICYmICEgbG9vcF9udW1iZXJfZXhp
dF9jb3VudFt1aWRfbG9vcF9udW1bSU5TTl9VSUQgKGxvb3Bfc3RhcnQpXV0pCiAgICB7CiAgICAg
IC8qID8/IEl0IGlzIHRlbXB0aW5nIHRvIHVzZSB0aGUgYml2J3MgdmFsdWUgaGVyZSBzaW5jZSB0
aGVzZSBpbnNucyB3aWxsCgkgYmUgcHV0IGFmdGVyIHRoZSBsb29wLCBhbmQgaGVuY2UgdGhlIGJp
diB3aWxsIGhhdmUgaXRzIGZpbmFsIHZhbHVlCgkgdGhlbi4gIEhvd2V2ZXIsIHRoaXMgZmFpbHMg
aWYgdGhlIGJpdiBpcyBzdWJzZXF1ZW50bHkgZWxpbWluYXRlZC4KCSBQZXJoYXBzIGRldGVybWlu
ZSB3aGV0aGVyIGJpdidzIGFyZSBlbGltaW5hYmxlIGJlZm9yZSB0cnlpbmcgdG8KCSBkZXRlcm1p
bmUgd2hldGhlciBnaXYncyBhcmUgcmVwbGFjZWFibGUgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZQoJ
IGJpdiB2YWx1ZSBoZXJlIGlmIGl0IGlzIG5vdCBlbGltaW5hYmxlLiAgKi8KCiAgICAgIC8qIFdl
IGFyZSBlbWl0dGluZyBjb2RlIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGxvb3AsIHNvIHdlIG11c3Qg
bWFrZQoJIHN1cmUgdGhhdCBibC0+aW5pdGlhbF92YWx1ZSBpcyBzdGlsbCB2YWxpZCB0aGVuLiAg
SXQgd2lsbCBzdGlsbAoJIGJlIHZhbGlkIGlmIGl0IGlzIGludmFyaWFudC4gICovCgogICAgICBp
bmNyZW1lbnQgPSBiaXZfdG90YWxfaW5jcmVtZW50IChibCwgbG9vcF9zdGFydCwgbG9vcF9lbmQp
OwoKICAgICAgaWYgKGluY3JlbWVudCAmJiBpbnZhcmlhbnRfcCAoaW5jcmVtZW50KQoJICAmJiBp
bnZhcmlhbnRfcCAoYmwtPmluaXRpYWxfdmFsdWUpKQoJewoJICAvKiBDYW4gY2FsY3VsYXRlIHRo
ZSBsb29wIGV4aXQgdmFsdWUgb2YgaXRzIGJpdiBhcwoJICAgICAobl9pdGVyYXRpb25zICogaW5j
cmVtZW50KSArIGluaXRpYWxfdmFsdWUgKi8KCgkgIC8qIFRoZSBsb29wIGV4aXQgdmFsdWUgb2Yg
dGhlIGdpdiBpcyB0aGVuCgkgICAgIChmaW5hbF9iaXZfdmFsdWUgLSBleHRyYSBpbmNyZW1lbnRz
KSAqIG11bHRfdmFsICsgYWRkX3ZhbC4KCSAgICAgVGhlIGV4dHJhIGluY3JlbWVudHMgYXJlIGFu
eSBpbmNyZW1lbnRzIHRvIHRoZSBiaXYgd2hpY2gKCSAgICAgb2NjdXIgaW4gdGhlIGxvb3AgYWZ0
ZXIgdGhlIGdpdidzIHZhbHVlIGlzIGNhbGN1bGF0ZWQuCgkgICAgIFdlIG11c3Qgc2VhcmNoIGZy
b20gdGhlIGluc24gdGhhdCBzZXRzIHRoZSBnaXYgdG8gdGhlIGVuZAoJICAgICBvZiB0aGUgbG9v
cCB0byBjYWxjdWxhdGUgdGhpcyB2YWx1ZS4gICovCgoJICBpbnNlcnRfYmVmb3JlID0gTkVYVF9J
TlNOIChsb29wX2VuZCk7CgoJICAvKiBQdXQgdGhlIGZpbmFsIGJpdiB2YWx1ZSBpbiB0ZW0uICAq
LwoJICB0ZW0gPSBnZW5fcmVnX3J0eCAoYmwtPmJpdi0+bW9kZSk7CgkgIHJlY29yZF9iYXNlX3Zh
bHVlIChSRUdOTyAodGVtKSwgYmwtPmJpdi0+YWRkX3ZhbCwgMCk7CgkgIGVtaXRfaXZfYWRkX211
bHQgKGluY3JlbWVudCwgR0VOX0lOVCAobl9pdGVyYXRpb25zKSwKCQkJICAgIGJsLT5pbml0aWFs
X3ZhbHVlLCB0ZW0sIGluc2VydF9iZWZvcmUpOwoKCSAgLyogU3VidHJhY3Qgb2ZmIGV4dHJhIGlu
Y3JlbWVudHMgYXMgd2UgZmluZCB0aGVtLiAgKi8KCSAgZm9yIChpbnNuID0gTkVYVF9JTlNOICh2
LT5pbnNuKTsgaW5zbiAhPSBsb29wX2VuZDsKCSAgICAgICBpbnNuID0gTkVYVF9JTlNOIChpbnNu
KSkKCSAgICB7CgkgICAgICBzdHJ1Y3QgaW5kdWN0aW9uICpiaXY7CgoJICAgICAgZm9yIChiaXYg
PSBibC0+Yml2OyBiaXY7IGJpdiA9IGJpdi0+bmV4dF9pdikKCQlpZiAoYml2LT5pbnNuID09IGlu
c24pCgkJICB7CgkJICAgIHN0YXJ0X3NlcXVlbmNlICgpOwoJCSAgICB0ZW0gPSBleHBhbmRfYmlu
b3AgKEdFVF9NT0RFICh0ZW0pLCBzdWJfb3B0YWIsIHRlbSwKCQkJCQliaXYtPmFkZF92YWwsIE5V
TExfUlRYLCAwLAoJCQkJCU9QVEFCX0xJQl9XSURFTik7CgkJICAgIHNlcSA9IGdlbl9zZXF1ZW5j
ZSAoKTsKCQkgICAgZW5kX3NlcXVlbmNlICgpOwoJCSAgICBlbWl0X2luc25fYmVmb3JlIChzZXEs
IGluc2VydF9iZWZvcmUpOwoJCSAgfQoJICAgIH0KCgkgIC8qIE5vdyBjYWxjdWxhdGUgdGhlIGdp
didzIGZpbmFsIHZhbHVlLiAgKi8KCSAgZW1pdF9pdl9hZGRfbXVsdCAodGVtLCB2LT5tdWx0X3Zh
bCwgdi0+YWRkX3ZhbCwgdGVtLAoJCQkgICAgaW5zZXJ0X2JlZm9yZSk7CgoJICBpZiAobG9vcF9k
dW1wX3N0cmVhbSkKCSAgICBmcHJpbnRmIChsb29wX2R1bXBfc3RyZWFtLAoJCSAgICAgIkZpbmFs
IGdpdiB2YWx1ZSBmb3IgJWQsIGNhbGMgZnJvbSBiaXYncyB2YWx1ZS5cbiIsCgkJICAgICBSRUdO
TyAodi0+ZGVzdF9yZWcpKTsKCgkgIHJldHVybiB0ZW07Cgl9CiAgICB9CgogIC8qIFJlcGxhY2Vh
YmxlIGdpdidzIHNob3VsZCBuZXZlciByZWFjaCBoZXJlLiAgKi8KICBpZiAodi0+cmVwbGFjZWFi
bGUpCiAgICBhYm9ydCAoKTsKCiAgLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBiaXYgaXMgZGVhZCBh
dCBhbGwgbG9vcCBleGl0cy4gICovCiAgaWYgKHJlZ19kZWFkX2FmdGVyX2xvb3AgKHYtPmRlc3Rf
cmVnLCBsb29wX3N0YXJ0LCBsb29wX2VuZCkpCiAgICB7CiAgICAgIGlmIChsb29wX2R1bXBfc3Ry
ZWFtKQoJZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgIkZpbmFsIGdpdiB2YWx1ZSBmb3Ig
JWQsIGdpdiBkZWFkIGFmdGVyIGxvb3AgZXhpdC5cbiIsCgkJIFJFR05PICh2LT5kZXN0X3JlZykp
OwoKICAgICAgcmV0dXJuIGNvbnN0MF9ydHg7CiAgICB9CgogIHJldHVybiAwOwp9CgoKLyogTG9v
ayBiYWNrIGJlZm9yZSBMT09QX1NUQVJUIGZvciB0aGVuIGluc24gdGhhdCBzZXRzIFJFRyBhbmQg
cmV0dXJuCiAgIHRoZSBlcXVpdmFsZW50IGNvbnN0YW50IGlmIHRoZXJlIGlzIGEgUkVHX0VRVUFM
IG5vdGUgb3RoZXJ3aXNlIGp1c3QKICAgdGhlIFNFVF9TUkMgb2YgUkVHLiAgKi8KCnN0YXRpYyBy
dHgKbG9vcF9maW5kX2VxdWl2X3ZhbHVlIChsb29wX3N0YXJ0LCByZWcpCiAgICAgcnR4IGxvb3Bf
c3RhcnQ7CiAgICAgcnR4IHJlZzsKewogIHJ0eCBpbnNuLCBzZXQ7CiAgcnR4IHJldDsKCiAgcmV0
ID0gcmVnOwogIGZvciAoaW5zbiA9IFBSRVZfSU5TTiAobG9vcF9zdGFydCk7IGluc24gOyBpbnNu
ID0gUFJFVl9JTlNOIChpbnNuKSkKICAgIHsKICAgICAgaWYgKEdFVF9DT0RFIChpbnNuKSA9PSBD
T0RFX0xBQkVMKQoJYnJlYWs7CgogICAgICBlbHNlIGlmIChHRVRfUlRYX0NMQVNTIChHRVRfQ09E
RSAoaW5zbikpID09ICdpJwoJICAgICAgICYmIHJlZ19zZXRfcCAocmVnLCBpbnNuKSkKCXsKCSAg
LyogV2UgZm91bmQgdGhlIGxhc3QgaW5zbiBiZWZvcmUgdGhlIGxvb3AgdGhhdCBzZXRzIHRoZSBy
ZWdpc3Rlci4KCSAgICAgSWYgaXQgc2V0cyB0aGUgZW50aXJlIHJlZ2lzdGVyLCBhbmQgaGFzIGEg
UkVHX0VRVUFMIG5vdGUsCgkgICAgIHRoZW4gdXNlIHRoZSB2YWx1ZSBvZiB0aGUgUkVHX0VRVUFM
IG5vdGUuICAqLwoJICBpZiAoKHNldCA9IHNpbmdsZV9zZXQgKGluc24pKQoJCSAgJiYgKFNFVF9E
RVNUIChzZXQpID09IHJlZykpCgkgICAgewoJICAgICAgcnR4IG5vdGUgPSBmaW5kX3JlZ19ub3Rl
IChpbnNuLCBSRUdfRVFVQUwsIE5VTExfUlRYKTsKCgkgICAgICAvKiBPbmx5IHVzZSB0aGUgUkVH
X0VRVUFMIG5vdGUgaWYgaXQgaXMgYSBjb25zdGFudC4KCQkgT3RoZXIgdGhpbmdzLCBkaXZpZGUg
aW4gcGFydGljdWxhciwgd2lsbCBjYXVzZQoJCSBwcm9ibGVtcyBsYXRlciBpZiB3ZSB1c2UgdGhl
bS4gICovCgkgICAgICBpZiAobm90ZSAmJiBHRVRfQ09ERSAoWEVYUCAobm90ZSwgMCkpICE9IEVY
UFJfTElTVAoJCSAgJiYgQ09OU1RBTlRfUCAoWEVYUCAobm90ZSwgMCkpKQoJCXJldCA9IFhFWFAg
KG5vdGUsIDApOwoJICAgICAgZWxzZQoJCXJldCA9IFNFVF9TUkMgKHNldCk7CgkgICAgfQoJICBi
cmVhazsKCX0KICAgIH0KICByZXR1cm4gcmV0Owp9CgoKLyogUmV0dXJuIGEgc2ltcGxpZmllZCBy
dHggZm9yIHRoZSBleHByZXNzaW9uIE9QIC0gUkVHLgoKICAgUkVHIG11c3QgYXBwZWFyIGluIE9Q
LCBhbmQgT1AgbXVzdCBiZSBhIHJlZ2lzdGVyIG9yIHRoZSBzdW0gb2YgYSByZWdpc3RlcgogICBh
bmQgYSBzZWNvbmQgdGVybS4KCiAgIFRodXMsIHRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBjb25z
dDBfcnR4IG9yIHRoZSBzZWNvbmQgdGVybS4KCiAgIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUg
Zm9yIHZlcmlmeWluZyB0aGF0IFJFRyBhcHBlYXJzIGluIE9QIGFuZCBPUCBoYXMKICAgdGhlIHBy
b3BlciBmb3JtLiAgKi8KCnN0YXRpYyBydHgKc3VidHJhY3RfcmVnX3Rlcm0gKG9wLCByZWcpCiAg
ICAgcnR4IG9wLCByZWc7CnsKICBpZiAob3AgPT0gcmVnKQogICAgcmV0dXJuIGNvbnN0MF9ydHg7
CiAgaWYgKEdFVF9DT0RFIChvcCkgPT0gUExVUykKICAgIHsKICAgICAgaWYgKFhFWFAgKG9wLCAw
KSA9PSByZWcpCglyZXR1cm4gWEVYUCAob3AsIDEpOwogICAgICBlbHNlIGlmIChYRVhQIChvcCwg
MSkgPT0gcmVnKQoJcmV0dXJuIFhFWFAgKG9wLCAwKTsKICAgIH0KICAvKiBPUCBkb2VzIG5vdCBj
b250YWluIFJFRyBhcyBhIHRlcm0uICAqLwogIGFib3J0ICgpOwp9CgoKLyogRmluZCBhbmQgcmV0
dXJuIHJlZ2lzdGVyIHRlcm0gY29tbW9uIHRvIGJvdGggZXhwcmVzc2lvbnMgT1AwIGFuZAogICBP
UDEgb3IgTlVMTF9SVFggaWYgbm8gc3VjaCB0ZXJtIGV4aXN0cy4gIEVhY2ggZXhwcmVzc2lvbiBt
dXN0IGJlIGEKICAgUkVHIG9yIGEgUExVUyBvZiBhIFJFRy4gICovCgpzdGF0aWMgcnR4CmZpbmRf
Y29tbW9uX3JlZ190ZXJtIChvcDAsIG9wMSkKICAgICBydHggb3AwLCBvcDE7CnsKICBpZiAoKEdF
VF9DT0RFIChvcDApID09IFJFRyB8fCBHRVRfQ09ERSAob3AwKSA9PSBQTFVTKQogICAgICAmJiAo
R0VUX0NPREUgKG9wMSkgPT0gUkVHIHx8IEdFVF9DT0RFIChvcDEpID09IFBMVVMpKQogICAgewog
ICAgICBydHggb3AwMDsKICAgICAgcnR4IG9wMDE7CiAgICAgIHJ0eCBvcDEwOwogICAgICBydHgg
b3AxMTsKCiAgICAgIGlmIChHRVRfQ09ERSAob3AwKSA9PSBQTFVTKQoJb3AwMSA9IFhFWFAgKG9w
MCwgMSksIG9wMDAgPSBYRVhQIChvcDAsIDApOwogICAgICBlbHNlCglvcDAxID0gY29uc3QwX3J0
eCwgb3AwMCA9IG9wMDsKCiAgICAgIGlmIChHRVRfQ09ERSAob3AxKSA9PSBQTFVTKQoJb3AxMSA9
IFhFWFAgKG9wMSwgMSksIG9wMTAgPSBYRVhQIChvcDEsIDApOwogICAgICBlbHNlCglvcDExID0g
Y29uc3QwX3J0eCwgb3AxMCA9IG9wMTsKCiAgICAgIC8qIEZpbmQgYW5kIHJldHVybiBjb21tb24g
cmVnaXN0ZXIgdGVybSBpZiBwcmVzZW50LiAgKi8KICAgICAgaWYgKFJFR19QIChvcDAwKSAmJiAo
b3AwMCA9PSBvcDEwIHx8IG9wMDAgPT0gb3AxMSkpCglyZXR1cm4gb3AwMDsKICAgICAgZWxzZSBp
ZiAoUkVHX1AgKG9wMDEpICYmIChvcDAxID09IG9wMTAgfHwgb3AwMSA9PSBvcDExKSkKCXJldHVy
biBvcDAxOwogICAgfQoKICAvKiBObyBjb21tb24gcmVnaXN0ZXIgdGVybSBmb3VuZC4gICovCiAg
cmV0dXJuIE5VTExfUlRYOwp9CgoKLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgbG9vcCBpdGVy
YXRpb25zLiAgUmV0dXJucyB0aGUgZXhhY3QgbnVtYmVyIG9mIGxvb3AKICAgaXRlcmF0aW9ucyBp
ZiBpdCBjYW4gYmUgY2FsY3VsYXRlZCwgb3RoZXJ3aXNlIHJldHVybnMgemVyby4gICovCgp1bnNp
Z25lZCBIT1NUX1dJREVfSU5UCmxvb3BfaXRlcmF0aW9ucyAobG9vcF9zdGFydCwgbG9vcF9lbmQs
IGxvb3BfaW5mbykKICAgICBydHggbG9vcF9zdGFydCwgbG9vcF9lbmQ7CiAgICAgc3RydWN0IGxv
b3BfaW5mbyAqbG9vcF9pbmZvOwp7CiAgcnR4IGNvbXBhcmlzb24sIGNvbXBhcmlzb25fdmFsdWU7
CiAgcnR4IGl0ZXJhdGlvbl92YXIsIGluaXRpYWxfdmFsdWUsIGluY3JlbWVudCwgZmluYWxfdmFs
dWU7CiAgZW51bSBydHhfY29kZSBjb21wYXJpc29uX2NvZGU7CiAgSE9TVF9XSURFX0lOVCBhYnNf
aW5jOwogIHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgYWJzX2RpZmY7CiAgaW50IG9mZl9ieV9vbmU7
CiAgaW50IGluY3JlbWVudF9kaXI7CiAgaW50IHVuc2lnbmVkX3AsIGNvbXBhcmVfZGlyLCBmaW5h
bF9sYXJnZXI7CiAgcnR4IGxhc3RfbG9vcF9pbnNuOwogIHJ0eCB2dG9wOwogIHJ0eCByZWdfdGVy
bTsKCiAgbG9vcF9pbmZvLT5uX2l0ZXJhdGlvbnMgPSAwOwogIGxvb3BfaW5mby0+aW5pdGlhbF92
YWx1ZSA9IDA7CiAgbG9vcF9pbmZvLT5pbml0aWFsX2VxdWl2X3ZhbHVlID0gMDsKICBsb29wX2lu
Zm8tPmNvbXBhcmlzb25fdmFsdWUgPSAwOwogIGxvb3BfaW5mby0+ZmluYWxfdmFsdWUgPSAwOwog
IGxvb3BfaW5mby0+ZmluYWxfZXF1aXZfdmFsdWUgPSAwOwogIGxvb3BfaW5mby0+aW5jcmVtZW50
ID0gMDsKICBsb29wX2luZm8tPml0ZXJhdGlvbl92YXIgPSAwOwogIGxvb3BfaW5mby0+dW5yb2xs
X251bWJlciA9IDE7CiAgbG9vcF9pbmZvLT52dG9wID0gMDsKCiAgLyogV2UgdXNlZCB0byB1c2Ug
cHJldl9ub25ub3RlX2luc24gaGVyZSwgYnV0IHRoYXQgZmFpbHMgYmVjYXVzZSBpdCBtaWdodAog
ICAgIGFjY2lkZW50YWxseSBnZXQgdGhlIGJyYW5jaCBmb3IgYSBjb250YWluZWQgbG9vcCBpZiB0
aGUgYnJhbmNoIGZvciB0aGlzCiAgICAgbG9vcCB3YXMgZGVsZXRlZC4gIFdlIGNhbiBvbmx5IHRy
dXN0IGJyYW5jaGVzIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUKICAgICBsb29wX2VuZC4gICovCiAg
bGFzdF9sb29wX2luc24gPSBQUkVWX0lOU04gKGxvb3BfZW5kKTsKCiAgLyogPz8/IFdlIHNob3Vs
ZCBwcm9iYWJseSB0cnkgaGFyZGVyIHRvIGZpbmQgdGhlIGp1bXAgaW5zbgogICAgIGF0IHRoZSBl
bmQgb2YgdGhlIGxvb3AuICBUaGUgZm9sbG93aW5nIGNvZGUgYXNzdW1lcyB0aGF0CiAgICAgdGhl
IGxhc3QgbG9vcCBpbnNuIGlzIGEganVtcCB0byB0aGUgdG9wIG9mIHRoZSBsb29wLiAgKi8KICBp
ZiAoR0VUX0NPREUgKGxhc3RfbG9vcF9pbnNuKSAhPSBKVU1QX0lOU04pCiAgICB7CiAgICAgIGlm
IChsb29wX2R1bXBfc3RyZWFtKQoJZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgIkxvb3Ag
aXRlcmF0aW9uczogTm8gZmluYWwgY29uZGl0aW9uYWwgYnJhbmNoIGZvdW5kLlxuIik7CiAgICAg
IHJldHVybiAwOwogICAgfQoKICAvKiBJZiB0aGVyZSBpcyBhIG1vcmUgdGhhbiBhIHNpbmdsZSBq
dW1wIHRvIHRoZSB0b3Agb2YgdGhlIGxvb3AKICAgICB3ZSBjYW5ub3QgKGVhc2lseSkgZGV0ZXJt
aW5lIHRoZSBpdGVyYXRpb24gY291bnQuICAqLwogIGlmIChMQUJFTF9OVVNFUyAoSlVNUF9MQUJF
TCAobGFzdF9sb29wX2luc24pKSA+IDEpCiAgICB7CiAgICAgIGlmIChsb29wX2R1bXBfc3RyZWFt
KQoJZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgIkxvb3AgaXRlcmF0aW9uczogTG9vcCBo
YXMgbXVsdGlwbGUgYmFjayBlZGdlcy5cbiIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgLyog
RmluZCB0aGUgaXRlcmF0aW9uIHZhcmlhYmxlLiAgSWYgdGhlIGxhc3QgaW5zbiBpcyBhIGNvbmRp
dGlvbmFsCiAgICAgYnJhbmNoLCBhbmQgdGhlIGluc24gYmVmb3JlIHRlc3RzIGEgcmVnaXN0ZXIg
dmFsdWUsIG1ha2UgdGhhdCB0aGUKICAgICBpdGVyYXRpb24gdmFyaWFibGUuICAqLwoKICBjb21w
YXJpc29uID0gZ2V0X2NvbmRpdGlvbl9mb3JfbG9vcCAobGFzdF9sb29wX2luc24pOwogIGlmIChj
b21wYXJpc29uID09IDApCiAgICB7CiAgICAgIGlmIChsb29wX2R1bXBfc3RyZWFtKQoJZnByaW50
ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgIkxvb3AgaXRlcmF0aW9uczogTm8gZmluYWwgY29tcGFy
aXNvbiBmb3VuZC5cbiIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgLyogPz8/IEdldF9jb25k
aXRpb24gbWF5IHN3aXRjaCBwb3NpdGlvbiBvZiBpbmR1Y3Rpb24gdmFyaWFibGUgYW5kCiAgICAg
aW52YXJpYW50IHJlZ2lzdGVyIHdoZW4gaXQgY2Fub25pY2FsaXplcyB0aGUgY29tcGFyaXNvbi4g
ICovCgogIGNvbXBhcmlzb25fY29kZSA9IEdFVF9DT0RFIChjb21wYXJpc29uKTsKICBpdGVyYXRp
b25fdmFyID0gWEVYUCAoY29tcGFyaXNvbiwgMCk7CiAgY29tcGFyaXNvbl92YWx1ZSA9IFhFWFAg
KGNvbXBhcmlzb24sIDEpOwoKICAvKiBDaGVjayBpZiB0aGVyZSBpcyBhIE5PVEVfSU5TTl9MT09Q
X1ZUT1Agbm90ZS4gIElmIHRoZXJlIGlzLAogICAgIHRoYXQgbWVhbnMgdGhhdCB0aGlzIGlzIGEg
Zm9yIG9yIHdoaWxlIHN0eWxlIGxvb3AsIHdpdGgKICAgICBhIGxvb3AgZXhpdCB0ZXN0IGF0IHRo
ZSBzdGFydC4gIFRodXMsIHdlIGNhbiBhc3N1bWUgdGhhdAogICAgIHRoZSBsb29wIGNvbmRpdGlv
biB3YXMgdHJ1ZSB3aGVuIHRoZSBsb29wIHdhcyBlbnRlcmVkLgoKICAgICBXZSBzdGFydCBhdCB0
aGUgZW5kIGFuZCBzZWFyY2ggYmFja3dhcmRzIGZvciB0aGUgcHJldmlvdXMKICAgICBOT1RFLiAg
SWYgdGhlcmUgaXMgbm8gTk9URV9JTlNOX0xPT1BfVlRPUCBmb3IgdGhpcyBsb29wLAogICAgIHRo
ZSBzZWFyY2ggd2lsbCBzdG9wIGF0IHRoZSBOT1RFX0lOU05fTE9PUF9DT05ULiAgKi8KICB2dG9w
ID0gbG9vcF9lbmQ7CiAgZG8KICAgIHZ0b3AgPSBQUkVWX0lOU04gKHZ0b3ApOwogIHdoaWxlIChH
RVRfQ09ERSAodnRvcCkgIT0gTk9URQoJIHx8IE5PVEVfTElORV9OVU1CRVIgKHZ0b3ApID4gMAoJ
IHx8IE5PVEVfTElORV9OVU1CRVIgKHZ0b3ApID09IE5PVEVfUkVQRUFURURfTElORV9OVU1CRVIK
CSB8fCBOT1RFX0xJTkVfTlVNQkVSICh2dG9wKSA9PSBOT1RFX0lOU05fREVMRVRFRCk7CiAgaWYg
KE5PVEVfTElORV9OVU1CRVIgKHZ0b3ApICE9IE5PVEVfSU5TTl9MT09QX1ZUT1ApCiAgICB2dG9w
ID0gTlVMTF9SVFg7CiAgbG9vcF9pbmZvLT52dG9wID0gdnRvcDsKCiAgaWYgKEdFVF9DT0RFIChp
dGVyYXRpb25fdmFyKSAhPSBSRUcpCiAgICB7CiAgICAgIGlmIChsb29wX2R1bXBfc3RyZWFtKQoJ
ZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgIkxvb3AgaXRlcmF0aW9uczogQ29tcGFyaXNv
biBub3QgYWdhaW5zdCByZWdpc3Rlci5cbiIpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgLyog
VGhlIG9ubHkgbmV3IHJlZ2lzdGVycyB0aGF0IGNhcmUgY3JlYXRlZCBiZWZvcmUgbG9vcCBpdGVy
YXRpb25zIGFyZQogICAgIGdpdnMgbWFkZSBmcm9tIGJpdiBpbmNyZW1lbnRzLCBzbyB0aGlzIHNo
b3VsZCBuZXZlciBvY2N1ci4gICovCgogIGlmICgodW5zaWduZWQpIFJFR05PIChpdGVyYXRpb25f
dmFyKSA+PSByZWdfaXZfdHlwZS0+bnVtX2VsZW1lbnRzKQogICAgYWJvcnQgKCk7CgogIGl0ZXJh
dGlvbl9pbmZvIChpdGVyYXRpb25fdmFyLCAmaW5pdGlhbF92YWx1ZSwgJmluY3JlbWVudCwKCQkg
IGxvb3Bfc3RhcnQsIGxvb3BfZW5kKTsKICBpZiAoaW5pdGlhbF92YWx1ZSA9PSAwKQogICAgLyog
aXRlcmF0aW9uX2luZm8gYWxyZWFkeSBwcmludGVkIGEgbWVzc2FnZS4gICovCiAgICByZXR1cm4g
MDsKCiAgdW5zaWduZWRfcCA9IDA7CiAgb2ZmX2J5X29uZSA9IDA7CiAgc3dpdGNoIChjb21wYXJp
c29uX2NvZGUpCiAgICB7CiAgICBjYXNlIExFVToKICAgICAgdW5zaWduZWRfcCA9IDE7CiAgICBj
YXNlIExFOgogICAgICBjb21wYXJlX2RpciA9IDE7CiAgICAgIG9mZl9ieV9vbmUgPSAxOwogICAg
ICBicmVhazsKICAgIGNhc2UgR0VVOgogICAgICB1bnNpZ25lZF9wID0gMTsKICAgIGNhc2UgR0U6
CiAgICAgIGNvbXBhcmVfZGlyID0gLTE7CiAgICAgIG9mZl9ieV9vbmUgPSAtMTsKICAgICAgYnJl
YWs7CiAgICBjYXNlIEVROgogICAgICAvKiBDYW5ub3QgZGV0ZXJtaW5lIGxvb3AgaXRlcmF0aW9u
cyB3aXRoIHRoaXMgY2FzZS4gICovCiAgICAgIGNvbXBhcmVfZGlyID0gMDsKICAgICAgYnJlYWs7
CiAgICBjYXNlIExUVToKICAgICAgdW5zaWduZWRfcCA9IDE7CiAgICBjYXNlIExUOgogICAgICBj
b21wYXJlX2RpciA9IDE7CiAgICAgIGJyZWFrOwogICAgY2FzZSBHVFU6CiAgICAgIHVuc2lnbmVk
X3AgPSAxOwogICAgY2FzZSBHVDoKICAgICAgY29tcGFyZV9kaXIgPSAtMTsKICAgIGNhc2UgTkU6
CiAgICAgIGNvbXBhcmVfZGlyID0gMDsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBh
Ym9ydCAoKTsKICAgIH0KCiAgLyogSWYgdGhlIGNvbXBhcmlzb24gdmFsdWUgaXMgYW4gaW52YXJp
YW50IHJlZ2lzdGVyLCB0aGVuIHRyeSB0byBmaW5kCiAgICAgaXRzIHZhbHVlIGZyb20gdGhlIGlu
c25zIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIGxvb3AuICAqLwoKICBmaW5hbF92YWx1ZSA9IGNv
bXBhcmlzb25fdmFsdWU7CiAgaWYgKEdFVF9DT0RFIChjb21wYXJpc29uX3ZhbHVlKSA9PSBSRUcg
JiYgaW52YXJpYW50X3AgKGNvbXBhcmlzb25fdmFsdWUpKQogICAgewogICAgICBmaW5hbF92YWx1
ZSA9IGxvb3BfZmluZF9lcXVpdl92YWx1ZSAobG9vcF9zdGFydCwgY29tcGFyaXNvbl92YWx1ZSk7
CiAgICAgIC8qIElmIHdlIGRvbid0IGdldCBhbiBpbnZhcmlhbnQgZmluYWwgdmFsdWUsIHdlIGFy
ZSBiZXR0ZXIKCSBvZmYgd2l0aCB0aGUgb3JpZ2luYWwgcmVnaXN0ZXIuICAqLwogICAgICBpZiAo
IWludmFyaWFudF9wIChmaW5hbF92YWx1ZSkpCglmaW5hbF92YWx1ZSA9IGNvbXBhcmlzb25fdmFs
dWU7CiAgICB9CgogIC8qIENhbGN1bGF0ZSB0aGUgYXBwcm94aW1hdGUgZmluYWwgdmFsdWUgb2Yg
dGhlIGluZHVjdGlvbiB2YXJpYWJsZQogICAgIChvbiB0aGUgbGFzdCBzdWNjZXNzZnVsIGl0ZXJh
dGlvbikuICBUaGUgZXhhY3QgZmluYWwgdmFsdWUKICAgICBkZXBlbmRzIG9uIHRoZSBicmFuY2gg
b3BlcmF0b3IsIGFuZCBpbmNyZW1lbnQgc2lnbi4gIEl0IHdpbGwgYmUKICAgICB3cm9uZyBpZiB0
aGUgaXRlcmF0aW9uIHZhcmlhYmxlIGlzIG5vdCBpbmNyZW1lbnRlZCBieSBvbmUgZWFjaAogICAg
IHRpbWUgdGhyb3VnaCB0aGUgbG9vcCBhbmQgKGNvbXBhcmlzb25fdmFsdWUgKyBvZmZfYnlfb25l
IC0KICAgICBpbml0aWFsX3ZhbHVlKSAlIGluY3JlbWVudCAhPSAwLgogICAgID8/PyBOb3RlIHRo
YXQgdGhlIGZpbmFsX3ZhbHVlIG1heSBvdmVyZmxvdyBhbmQgdGh1cyBmaW5hbF9sYXJnZXIKICAg
ICB3aWxsIGJlIGJvZ3VzLiAgQSBwb3RlbnRpYWxseSBpbmZpbml0ZSBsb29wIHdpbGwgYmUgY2xh
c3NpZmllZAogICAgIGFzIGltbWVkaWF0ZSwgZS5nLiBmb3IgKGkgPSAweDdmZmZmZmYwOyBpIDw9
IDB4N2ZmZmZmZmY7IGkrKykgICovCiAgaWYgKG9mZl9ieV9vbmUpCiAgICBmaW5hbF92YWx1ZSA9
IHBsdXNfY29uc3RhbnQgKGZpbmFsX3ZhbHVlLCBvZmZfYnlfb25lKTsKCiAgLyogU2F2ZSB0aGUg
Y2FsY3VsYXRlZCB2YWx1ZXMgZGVzY3JpYmluZyB0aGlzIGxvb3AncyBib3VuZHMsIGluIGNhc2UK
ICAgICBwcmVjb25kaXRpb25fbG9vcF9wIHdpbGwgbmVlZCB0aGVtIGxhdGVyLiAgVGhlc2UgdmFs
dWVzIGNhbiBub3QgYmUKICAgICByZWNhbGN1bGF0ZWQgaW5zaWRlIHByZWNvbmRpdGlvbl9sb29w
X3AgYmVjYXVzZSBzdHJlbmd0aCByZWR1Y3Rpb24KICAgICBvcHRpbWl6YXRpb25zIG1heSBvYnNj
dXJlIHRoZSBsb29wJ3Mgc3RydWN0dXJlLgoKICAgICBUaGVzZSB2YWx1ZXMgYXJlIG9ubHkgcmVx
dWlyZWQgYnkgcHJlY29uZGl0aW9uX2xvb3BfcCBhbmQgaW5zZXJ0X2JjdAogICAgIHdoZW5ldmVy
IHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBjYW5ub3QgYmUgY29tcHV0ZWQgYXQgY29tcGlsZSB0
aW1lLgogICAgIE9ubHkgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBmaW5hbF92YWx1ZSBhbmQgaW5p
dGlhbF92YWx1ZSBpcwogICAgIGltcG9ydGFudC4gIE5vdGUgdGhhdCBmaW5hbF92YWx1ZSBpcyBv
bmx5IGFwcHJveGltYXRlLiAgKi8KICBsb29wX2luZm8tPmluaXRpYWxfdmFsdWUgPSBpbml0aWFs
X3ZhbHVlOwogIGxvb3BfaW5mby0+Y29tcGFyaXNvbl92YWx1ZSA9IGNvbXBhcmlzb25fdmFsdWU7
CiAgbG9vcF9pbmZvLT5maW5hbF92YWx1ZSA9IHBsdXNfY29uc3RhbnQgKGNvbXBhcmlzb25fdmFs
dWUsIG9mZl9ieV9vbmUpOwogIGxvb3BfaW5mby0+aW5jcmVtZW50ID0gaW5jcmVtZW50OwogIGxv
b3BfaW5mby0+aXRlcmF0aW9uX3ZhciA9IGl0ZXJhdGlvbl92YXI7CiAgbG9vcF9pbmZvLT5jb21w
YXJpc29uX2NvZGUgPSBjb21wYXJpc29uX2NvZGU7CgogIC8qIFRyeSB0byBkZXRlcm1pbmUgdGhl
IGl0ZXJhdGlvbiBjb3VudCBmb3IgbG9vcHMgc3VjaAogICAgIGFzIChmb3IgaSA9IGluaXQ7IGkg
PCBpbml0ICsgY29uc3Q7IGkrKykuICBXaGVuIHJ1bm5pbmcgdGhlCiAgICAgbG9vcCBvcHRpbWl6
YXRpb24gdHdpY2UsIHRoZSBmaXJzdCBwYXNzIG9mdGVuIGNvbnZlcnRzIHNpbXBsZQogICAgIGxv
b3BzIGludG8gdGhpcyBmb3JtLiAgKi8KCiAgaWYgKFJFR19QIChpbml0aWFsX3ZhbHVlKSkKICAg
IHsKICAgICAgcnR4IHJlZzE7CiAgICAgIHJ0eCByZWcyOwogICAgICBydHggY29uc3QyOwoKICAg
ICAgcmVnMSA9IGluaXRpYWxfdmFsdWU7CiAgICAgIGlmIChHRVRfQ09ERSAoZmluYWxfdmFsdWUp
ID09IFBMVVMpCglyZWcyID0gWEVYUCAoZmluYWxfdmFsdWUsIDApLCBjb25zdDIgPSBYRVhQIChm
aW5hbF92YWx1ZSwgMSk7CiAgICAgIGVsc2UKCXJlZzIgPSBmaW5hbF92YWx1ZSwgY29uc3QyID0g
Y29uc3QwX3J0eDsKCiAgICAgIC8qIENoZWNrIGZvciBpbml0aWFsX3ZhbHVlID0gcmVnMSwgZmlu
YWxfdmFsdWUgPSByZWcyICsgY29uc3QyLAoJIHdoZXJlIHJlZzEgIT0gcmVnMi4gICovCiAgICAg
IGlmIChSRUdfUCAocmVnMikgJiYgcmVnMiAhPSByZWcxKQoJewoJICBydHggdGVtcDsKCgkgIC8q
IEZpbmQgd2hhdCByZWcxIGlzIGVxdWl2YWxlbnQgdG8uICBIb3BlZnVsbHkgaXQgd2lsbAoJICAg
ICBlaXRoZXIgYmUgcmVnMiBvciByZWcyIHBsdXMgYSBjb25zdGFudC4gICovCgkgIHRlbXAgPSBs
b29wX2ZpbmRfZXF1aXZfdmFsdWUgKGxvb3Bfc3RhcnQsIHJlZzEpOwoJICBpZiAoZmluZF9jb21t
b25fcmVnX3Rlcm0gKHRlbXAsIHJlZzIpKQoJICAgIGluaXRpYWxfdmFsdWUgPSB0ZW1wOwoJICBl
bHNlCgkgICAgewoJICAgICAgLyogRmluZCB3aGF0IHJlZzIgaXMgZXF1aXZhbGVudCB0by4gIEhv
cGVmdWxseSBpdCB3aWxsCgkJIGVpdGhlciBiZSByZWcxIG9yIHJlZzEgcGx1cyBhIGNvbnN0YW50
LiAgTGV0J3MgaWdub3JlCgkJIHRoZSBsYXR0ZXIgY2FzZSBmb3Igbm93IHNpbmNlIGl0IGlzIG5v
dCBzbyBjb21tb24uICAqLwoJICAgICAgdGVtcCA9IGxvb3BfZmluZF9lcXVpdl92YWx1ZSAobG9v
cF9zdGFydCwgcmVnMik7CgkgICAgICBpZiAodGVtcCA9PSBsb29wX2luZm8tPml0ZXJhdGlvbl92
YXIpCgkJdGVtcCA9IGluaXRpYWxfdmFsdWU7CgkgICAgICBpZiAodGVtcCA9PSByZWcxKQoJCWZp
bmFsX3ZhbHVlID0gKGNvbnN0MiA9PSBjb25zdDBfcnR4KQoJCSAgPyByZWcxIDogZ2VuX3J0eF9Q
TFVTIChHRVRfTU9ERSAocmVnMSksIHJlZzEsIGNvbnN0Mik7CgkgICAgfQoJfQogICAgICBlbHNl
IGlmIChsb29wX2luZm8tPnZ0b3AgJiYgR0VUX0NPREUgKHJlZzIpID09IENPTlNUX0lOVCkKCXsK
CSAgcnR4IHRlbXA7CgoJICAvKiAgV2hlbiBydW5uaW5nIHRoZSBsb29wIG9wdGltaXplciB0d2lj
ZSwgY2hlY2tfZGJyYV9sb29wCgkgICAgICBmdXJ0aGVyIG9iZnVzY2F0ZXMgcmV2ZXJzaWJsZSBs
b29wcyBvZiB0aGUgZm9ybToKCSAgICAgIGZvciAoaSA9IGluaXQ7IGkgPCBpbml0ICsgY29uc3Q7
IGkrKykuICBXZSBvZnRlbiBlbmQgdXAgd2l0aAoJICAgICAgZmluYWxfdmFsdWUgPSAwLCBpbml0
aWFsX3ZhbHVlID0gdGVtcCwgdGVtcCA9IHRlbXAyIC0gaW5pdCwKCSAgICAgIHdoZXJlIHRlbXAy
ID0gaW5pdCArIGNvbnN0LiAgSWYgdGhlIGxvb3AgaGFzIGEgdnRvcCB3ZQoJICAgICAgY2FuIHJl
cGxhY2UgaW5pdGlhbF92YWx1ZSB3aXRoIGNvbnN0LiAgKi8KCgkgIHRlbXAgPSBsb29wX2ZpbmRf
ZXF1aXZfdmFsdWUgKGxvb3Bfc3RhcnQsIHJlZzEpOwoJICBpZiAoR0VUX0NPREUgKHRlbXApID09
IE1JTlVTICYmIFJFR19QIChYRVhQICh0ZW1wLCAwKSkpCgkgICAgewoJICAgICAgcnR4IHRlbXAy
ID0gbG9vcF9maW5kX2VxdWl2X3ZhbHVlIChsb29wX3N0YXJ0LCBYRVhQICh0ZW1wLCAwKSk7Cgkg
ICAgICBpZiAoR0VUX0NPREUgKHRlbXAyKSA9PSBQTFVTCgkJICAmJiBYRVhQICh0ZW1wMiwgMCkg
PT0gWEVYUCAodGVtcCwgMSkpCgkJaW5pdGlhbF92YWx1ZSA9IFhFWFAgKHRlbXAyLCAxKTsKCSAg
ICB9Cgl9CiAgICB9CgogIC8qIElmIGhhdmUgaW5pdGlhbF92YWx1ZSA9IHJlZyArIGNvbnN0MSBh
bmQgZmluYWxfdmFsdWUgPSByZWcgKwogICAgIGNvbnN0MiwgdGhlbiByZXBsYWNlIGluaXRpYWxf
dmFsdWUgd2l0aCBjb25zdDEgYW5kIGZpbmFsX3ZhbHVlCiAgICAgd2l0aCBjb25zdDIuICBUaGlz
IHNob3VsZCBiZSBzYWZlIHNpbmNlIHdlIGFyZSBwcm90ZWN0ZWQgYnkgdGhlCiAgICAgaW5pdGlh
bCBjb21wYXJpc29uIGJlZm9yZSBlbnRlcmluZyB0aGUgbG9vcCBpZiB3ZSBoYXZlIGEgdnRvcC4K
ICAgICBGb3IgZXhhbXBsZSwgYSArIGIgPCBhICsgYyBpcyBub3QgZXF1aXZhbGVudCB0byBiIDwg
YyBmb3IgYWxsIGEKICAgICB3aGVuIHVzaW5nIG1vZHVsbyBhcml0aG1ldGljLgoKICAgICA/Pz8g
V2l0aG91dCBhIHZ0b3Agd2UgY291bGQgc3RpbGwgcGVyZm9ybSB0aGUgb3B0aW1pemF0aW9uIGlm
IHdlIGNoZWNrCiAgICAgdGhlIGluaXRpYWwgYW5kIGZpbmFsIHZhbHVlcyBjYXJlZnVsbHkuICAq
LwogIGlmIChsb29wX2luZm8tPnZ0b3AKICAgICAgJiYgKHJlZ190ZXJtID0gZmluZF9jb21tb25f
cmVnX3Rlcm0gKGluaXRpYWxfdmFsdWUsIGZpbmFsX3ZhbHVlKSkpCiAgICB7CiAgICAgIGluaXRp
YWxfdmFsdWUgPSBzdWJ0cmFjdF9yZWdfdGVybSAoaW5pdGlhbF92YWx1ZSwgcmVnX3Rlcm0pOwog
ICAgICBmaW5hbF92YWx1ZSA9IHN1YnRyYWN0X3JlZ190ZXJtIChmaW5hbF92YWx1ZSwgcmVnX3Rl
cm0pOwogICAgfQoKICBsb29wX2luZm8tPmluaXRpYWxfZXF1aXZfdmFsdWUgPSBpbml0aWFsX3Zh
bHVlOwogIGxvb3BfaW5mby0+ZmluYWxfZXF1aXZfdmFsdWUgPSBmaW5hbF92YWx1ZTsKCiAgLyog
Rm9yIEVRIGNvbXBhcmlzb24gbG9vcHMsIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBmaW5hbCB2YWx1
ZS4KICAgICBDaGVjayB0aGlzIG5vdyBzbyB0aGF0IHdlIHdvbid0IGxlYXZlIGFuIGludmFsaWQg
dmFsdWUgaWYgd2UKICAgICByZXR1cm4gZWFybHkgZm9yIGFueSBvdGhlciByZWFzb24uICAqLwog
IGlmIChjb21wYXJpc29uX2NvZGUgPT0gRVEpCiAgICAgIGxvb3BfaW5mby0+ZmluYWxfZXF1aXZf
dmFsdWUgPSBsb29wX2luZm8tPmZpbmFsX3ZhbHVlID0gMDsKCiAgaWYgKGluY3JlbWVudCA9PSAw
KQogICAgewogICAgICBpZiAobG9vcF9kdW1wX3N0cmVhbSkKCWZwcmludGYgKGxvb3BfZHVtcF9z
dHJlYW0sCgkJICJMb29wIGl0ZXJhdGlvbnM6IEluY3JlbWVudCB2YWx1ZSBjYW4ndCBiZSBjYWxj
dWxhdGVkLlxuIik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICBpZiAoR0VUX0NPREUgKGluY3Jl
bWVudCkgIT0gQ09OU1RfSU5UKQogICAgewogICAgICAvKiBJZiB3ZSBoYXZlIGEgUkVHLCBjaGVj
ayB0byBzZWUgaWYgUkVHIGhvbGRzIGEgY29uc3RhbnQgdmFsdWUuICAqLwogICAgICAvKiA/Pz8g
T3RoZXIgUlRMLCBzdWNoIGFzIChuZWcgKHJlZykpIGlzIHBvc3NpYmxlIGhlcmUsIGJ1dCBpdCBp
c24ndAoJIGNsZWFyIGlmIGl0IGlzIHdvcnRod2hpbGUgdG8gdHJ5IHRvIGhhbmRsZSBzdWNoIFJU
TC4gICovCiAgICAgIGlmIChHRVRfQ09ERSAoaW5jcmVtZW50KSA9PSBSRUcgfHwgR0VUX0NPREUg
KGluY3JlbWVudCkgPT0gU1VCUkVHKQoJaW5jcmVtZW50ID0gbG9vcF9maW5kX2VxdWl2X3ZhbHVl
IChsb29wX3N0YXJ0LCBpbmNyZW1lbnQpOwoKICAgICAgaWYgKEdFVF9DT0RFIChpbmNyZW1lbnQp
ICE9IENPTlNUX0lOVCkKCXsKCSAgaWYgKGxvb3BfZHVtcF9zdHJlYW0pCgkgICAgewoJICAgICAg
ZnByaW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgICAgICAgIkxvb3AgaXRlcmF0aW9uczogSW5j
cmVtZW50IHZhbHVlIG5vdCBjb25zdGFudCAiKTsKCSAgICAgIHByaW50X3J0bCAobG9vcF9kdW1w
X3N0cmVhbSwgaW5jcmVtZW50KTsKCSAgICAgIGZwcmludGYgKGxvb3BfZHVtcF9zdHJlYW0sICIu
XG4iKTsKCSAgICB9CgkgIHJldHVybiAwOwoJfQogICAgICBsb29wX2luZm8tPmluY3JlbWVudCA9
IGluY3JlbWVudDsKICAgIH0KCiAgaWYgKEdFVF9DT0RFIChpbml0aWFsX3ZhbHVlKSAhPSBDT05T
VF9JTlQpCiAgICB7CiAgICAgIGlmIChsb29wX2R1bXBfc3RyZWFtKQoJewoJICBmcHJpbnRmIChs
b29wX2R1bXBfc3RyZWFtLAoJCSAgICJMb29wIGl0ZXJhdGlvbnM6IEluaXRpYWwgdmFsdWUgbm90
IGNvbnN0YW50ICIpOwoJICBwcmludF9ydGwgKGxvb3BfZHVtcF9zdHJlYW0sIGluaXRpYWxfdmFs
dWUpOwoJICBmcHJpbnRmIChsb29wX2R1bXBfc3RyZWFtLCAiLlxuIik7Cgl9CiAgICAgIHJldHVy
biAwOwogICAgfQogIGVsc2UgaWYgKGNvbXBhcmlzb25fY29kZSA9PSBFUSkKICAgIHsKICAgICAg
aWYgKGxvb3BfZHVtcF9zdHJlYW0pCglmcHJpbnRmIChsb29wX2R1bXBfc3RyZWFtLAoJCSAiTG9v
cCBpdGVyYXRpb25zOiBFUSBjb21wYXJpc29uIGxvb3AuXG4iKTsKICAgICAgcmV0dXJuIDA7CiAg
ICB9CiAgZWxzZSBpZiAoR0VUX0NPREUgKGZpbmFsX3ZhbHVlKSAhPSBDT05TVF9JTlQpCiAgICB7
CiAgICAgIGlmIChsb29wX2R1bXBfc3RyZWFtKQoJewoJICBmcHJpbnRmIChsb29wX2R1bXBfc3Ry
ZWFtLAoJCSAgICJMb29wIGl0ZXJhdGlvbnM6IEZpbmFsIHZhbHVlIG5vdCBjb25zdGFudCAiKTsK
CSAgcHJpbnRfcnRsIChsb29wX2R1bXBfc3RyZWFtLCBmaW5hbF92YWx1ZSk7CgkgIGZwcmludGYg
KGxvb3BfZHVtcF9zdHJlYW0sICIuXG4iKTsKCX0KICAgICAgcmV0dXJuIDA7CiAgICB9CgogIC8q
IEZpbmFsX2xhcmdlciBpcyAxIGlmIGZpbmFsIGxhcmdlciwgMCBpZiB0aGV5IGFyZSBlcXVhbCwg
b3RoZXJ3aXNlIC0xLiAgKi8KICBpZiAodW5zaWduZWRfcCkKICAgIGZpbmFsX2xhcmdlcgogICAg
ICA9ICgodW5zaWduZWQgSE9TVF9XSURFX0lOVCkgSU5UVkFMIChmaW5hbF92YWx1ZSkKCSA+ICh1
bnNpZ25lZCBIT1NUX1dJREVfSU5UKSBJTlRWQUwgKGluaXRpYWxfdmFsdWUpKQoJLSAoKHVuc2ln
bmVkIEhPU1RfV0lERV9JTlQpIElOVFZBTCAoZmluYWxfdmFsdWUpCgkgICA8ICh1bnNpZ25lZCBI
T1NUX1dJREVfSU5UKSBJTlRWQUwgKGluaXRpYWxfdmFsdWUpKTsKICBlbHNlCiAgICBmaW5hbF9s
YXJnZXIgPSAoSU5UVkFMIChmaW5hbF92YWx1ZSkgPiBJTlRWQUwgKGluaXRpYWxfdmFsdWUpKQog
ICAgICAtIChJTlRWQUwgKGZpbmFsX3ZhbHVlKSA8IElOVFZBTCAoaW5pdGlhbF92YWx1ZSkpOwoK
ICBpZiAoSU5UVkFMIChpbmNyZW1lbnQpID4gMCkKICAgIGluY3JlbWVudF9kaXIgPSAxOwogIGVs
c2UgaWYgKElOVFZBTCAoaW5jcmVtZW50KSA9PSAwKQogICAgaW5jcmVtZW50X2RpciA9IDA7CiAg
ZWxzZQogICAgaW5jcmVtZW50X2RpciA9IC0xOwoKICAvKiBUaGVyZSBhcmUgMjcgZGlmZmVyZW50
IGNhc2VzOiBjb21wYXJlX2RpciA9IC0xLCAwLCAxOwogICAgIGZpbmFsX2xhcmdlciA9IC0xLCAw
LCAxOyBpbmNyZW1lbnRfZGlyID0gLTEsIDAsIDEuCiAgICAgVGhlcmUgYXJlIDQgbm9ybWFsIGNh
c2VzLCA0IHJldmVyc2UgY2FzZXMgKHdoZXJlIHRoZSBpdGVyYXRpb24gdmFyaWFibGUKICAgICB3
aWxsIG92ZXJmbG93IGJlZm9yZSB0aGUgbG9vcCBleGl0cyksIDQgaW5maW5pdGUgbG9vcCBjYXNl
cywgYW5kIDE1CiAgICAgaW1tZWRpYXRlIGV4aXQgKDAgb3IgMSBpdGVyYXRpb24gZGVwZW5kaW5n
IG9uIGxvb3AgdHlwZSkgY2FzZXMuCiAgICAgT25seSB0cnkgdG8gb3B0aW1pemUgdGhlIG5vcm1h
bCBjYXNlcy4gICovCgogIC8qIChjb21wYXJlX2Rpci9maW5hbF9sYXJnZXIvaW5jcmVtZW50X2Rp
cikKICAgICBOb3JtYWwgY2FzZXM6ICgwLy0xLy0xKSwgKDAvMS8xKSwgKC0xLy0xLy0xKSwgKDEv
MS8xKQogICAgIFJldmVyc2UgY2FzZXM6ICgwLy0xLzEpLCAoMC8xLy0xKSwgKC0xLy0xLzEpLCAo
MS8xLy0xKQogICAgIEluZmluaXRlIGxvb3BzOiAoMC8tMS8wKSwgKDAvMS8wKSwgKC0xLy0xLzAp
LCAoMS8xLzApCiAgICAgSW1tZWRpYXRlIGV4aXQ6ICgwLzAvWCksICgtMS8wL1gpLCAoLTEvMS9Y
KSwgKDEvMC9YKSwgKDEvLTEvWCkgKi8KCiAgLyogPz8gSWYgdGhlIG1lYW5pbmcgb2YgcmV2ZXJz
ZSBsb29wcyAod2hlcmUgdGhlIGl0ZXJhdGlvbiB2YXJpYWJsZQogICAgIHdpbGwgb3ZlcmZsb3cg
YmVmb3JlIHRoZSBsb29wIGV4aXRzKSBpcyB1bmRlZmluZWQsIHRoZW4gY291bGQKICAgICBlbGlt
aW5hdGUgYWxsIG9mIHRoZXNlIHNwZWNpYWwgY2hlY2tzLCBhbmQganVzdCBhbHdheXMgYXNzdW1l
CiAgICAgdGhlIGxvb3BzIGFyZSBub3JtYWwvaW1tZWRpYXRlL2luZmluaXRlLiAgTm90ZSB0aGF0
IHRoaXMgbWVhbnMKICAgICB0aGUgc2lnbiBvZiBpbmNyZW1lbnRfZGlyIGRvZXMgbm90IGhhdmUg
dG8gYmUga25vd24uICBBbHNvLAogICAgIHNpbmNlIGl0IGRvZXMgbm90IHJlYWxseSBodXJ0IGlm
IGltbWVkaWF0ZSBleGl0IGxvb3BzIG9yIGluZmluaXRlIGxvb3BzCiAgICAgYXJlIG9wdGltaXpl
ZCwgdGhlbiB0aGF0IGNhc2UgY291bGQgYmUgaWdub3JlZCBhbHNvLCBhbmQgaGVuY2UgYWxsCiAg
ICAgbG9vcHMgY2FuIGJlIG9wdGltaXplZC4KCiAgICAgQWNjb3JkaW5nIHRvIEFOU0kgU3BlYywg
dGhlIHJldmVyc2UgbG9vcCBjYXNlIHJlc3VsdCBpcyB1bmRlZmluZWQsCiAgICAgYmVjYXVzZSB0
aGUgYWN0aW9uIG9uIG92ZXJmbG93IGlzIHVuZGVmaW5lZC4KCiAgICAgU2VlIGFsc28gdGhlIHNw
ZWNpYWwgdGVzdCBmb3IgTkUgbG9vcHMgYmVsb3cuICAqLwoKICBpZiAoZmluYWxfbGFyZ2VyID09
IGluY3JlbWVudF9kaXIgJiYgZmluYWxfbGFyZ2VyICE9IDAKICAgICAgJiYgKGZpbmFsX2xhcmdl
ciA9PSBjb21wYXJlX2RpciB8fCBjb21wYXJlX2RpciA9PSAwKSkKICAgIC8qIE5vcm1hbCBjYXNl
LiAgKi8KICAgIDsKICBlbHNlCiAgICB7CiAgICAgIGlmIChsb29wX2R1bXBfc3RyZWFtKQoJZnBy
aW50ZiAobG9vcF9kdW1wX3N0cmVhbSwKCQkgIkxvb3AgaXRlcmF0aW9uczogTm90IG5vcm1hbCBs
b29wLlxuIik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAvKiBDYWxjdWxhdGUgdGhlIG51bWJl
ciBvZiBpdGVyYXRpb25zLCBmaW5hbF92YWx1ZSBpcyBvbmx5IGFuIGFwcHJveGltYXRpb24sCiAg
ICAgc28gY29ycmVjdCBmb3IgdGhhdC4gIE5vdGUgdGhhdCBhYnNfZGlmZiBhbmQgbl9pdGVyYXRp
b25zIGFyZQogICAgIHVuc2lnbmVkLCBiZWNhdXNlIHRoZXkgY2FuIGJlIGFzIGxhcmdlIGFzIDJe
biAtIDEuICAqLwoKICBhYnNfaW5jID0gSU5UVkFMIChpbmNyZW1lbnQpOwogIGlmIChhYnNfaW5j
ID4gMCkKICAgIGFic19kaWZmID0gSU5UVkFMIChmaW5hbF92YWx1ZSkgLSBJTlRWQUwgKGluaXRp
YWxfdmFsdWUpOwogIGVsc2UgaWYgKGFic19pbmMgPCAwKQogICAgewogICAgICBhYnNfZGlmZiA9
IElOVFZBTCAoaW5pdGlhbF92YWx1ZSkgLSBJTlRWQUwgKGZpbmFsX3ZhbHVlKTsKICAgICAgYWJz
X2luYyA9IC1hYnNfaW5jOwogICAgfQogIGVsc2UKICAgIGFib3J0ICgpOwoKICAvKiBGb3IgTkUg
dGVzdHMsIG1ha2Ugc3VyZSB0aGF0IHRoZSBpdGVyYXRpb24gdmFyaWFibGUgd29uJ3QgbWlzcwog
ICAgIHRoZSBmaW5hbCB2YWx1ZS4gIElmIGFic19kaWZmIG1vZCBhYnNfaW5jciBpcyBub3QgemVy
bywgdGhlbiB0aGUKICAgICBpdGVyYXRpb24gdmFyaWFibGUgd2lsbCBvdmVyZmxvdyBiZWZvcmUg
dGhlIGxvb3AgZXhpdHMsIGFuZCB3ZQogICAgIGNhbiBub3QgY2FsY3VsYXRlIHRoZSBudW1iZXIg
b2YgaXRlcmF0aW9ucy4gICovCiAgaWYgKGNvbXBhcmVfZGlyID09IDAgJiYgKGFic19kaWZmICUg
YWJzX2luYykgIT0gMCkKICAgIHJldHVybiAwOwoKICAvKiBOb3RlIHRoYXQgdGhlIG51bWJlciBv
ZiBpdGVyYXRpb25zIGNvdWxkIGJlIGNhbGN1bGF0ZWQgdXNpbmcKICAgICAoYWJzX2RpZmYgKyBh
YnNfaW5jIC0gMSkgLyBhYnNfaW5jLCBwcm92aWRlZCBjYXJlIHdhcyB0YWtlbiB0bwogICAgIGhh
bmRsZSBwb3RlbnRpYWwgb3ZlcmZsb3cgb2YgdGhlIHN1bW1hdGlvbi4gICovCiAgbG9vcF9pbmZv
LT5uX2l0ZXJhdGlvbnMgPSBhYnNfZGlmZiAvIGFic19pbmMgKyAoKGFic19kaWZmICUgYWJzX2lu
YykgIT0gMCk7CiAgcmV0dXJuIGxvb3BfaW5mby0+bl9pdGVyYXRpb25zOwp9CgoKLyogUmVwbGFj
ZSB1c2VzIG9mIHNwbGl0IGJpdnMgd2l0aCB0aGVpciBzcGxpdCBwc2V1ZG8gcmVnaXN0ZXIuICBU
aGlzIGlzCiAgIGZvciBvcmlnaW5hbCBpbnN0cnVjdGlvbnMgd2hpY2ggcmVtYWluIGFmdGVyIGxv
b3AgdW5yb2xsaW5nIHdpdGhvdXQKICAgY29weWluZy4gICovCgpzdGF0aWMgcnR4CnJlbWFwX3Nw
bGl0X2JpdnMgKHgpCiAgICAgcnR4IHg7CnsKICByZWdpc3RlciBlbnVtIHJ0eF9jb2RlIGNvZGU7
CiAgcmVnaXN0ZXIgaW50IGk7CiAgcmVnaXN0ZXIgY2hhciAqZm10OwoKICBpZiAoeCA9PSAwKQog
ICAgcmV0dXJuIHg7CgogIGNvZGUgPSBHRVRfQ09ERSAoeCk7CiAgc3dpdGNoIChjb2RlKQogICAg
ewogICAgY2FzZSBTQ1JBVENIOgogICAgY2FzZSBQQzoKICAgIGNhc2UgQ0MwOgogICAgY2FzZSBD
T05TVF9JTlQ6CiAgICBjYXNlIENPTlNUX0RPVUJMRToKICAgIGNhc2UgQ09OU1Q6CiAgICBjYXNl
IFNZTUJPTF9SRUY6CiAgICBjYXNlIExBQkVMX1JFRjoKICAgICAgcmV0dXJuIHg7CgogICAgY2Fz
ZSBSRUc6CiNpZiAwCiAgICAgIC8qIElmIG5vbi1yZWR1Y2VkL2ZpbmFsLXZhbHVlIGdpdnMgd2Vy
ZSBzcGxpdCwgdGhlbiB0aGlzIHdvdWxkIGFsc28KCSBoYXZlIHRvIHJlbWFwIHRob3NlIGdpdnMg
YWxzby4gICovCiNlbmRpZgogICAgICBpZiAoUkVHTk8gKHgpIDwgbWF4X3JlZ19iZWZvcmVfbG9v
cAoJICAmJiBSRUdfSVZfVFlQRSAoUkVHTk8gKHgpKSA9PSBCQVNJQ19JTkRVQ1QpCglyZXR1cm4g
cmVnX2Jpdl9jbGFzc1tSRUdOTyAoeCldLT5iaXYtPnNyY19yZWc7CiAgICAgIGJyZWFrOwoKICAg
IGRlZmF1bHQ6CiAgICAgIGJyZWFrOwogICAgfQoKICBmbXQgPSBHRVRfUlRYX0ZPUk1BVCAoY29k
ZSk7CiAgZm9yIChpID0gR0VUX1JUWF9MRU5HVEggKGNvZGUpIC0gMTsgaSA+PSAwOyBpLS0pCiAg
ICB7CiAgICAgIGlmIChmbXRbaV0gPT0gJ2UnKQoJWEVYUCAoeCwgaSkgPSByZW1hcF9zcGxpdF9i
aXZzIChYRVhQICh4LCBpKSk7CiAgICAgIGlmIChmbXRbaV0gPT0gJ0UnKQoJewoJICByZWdpc3Rl
ciBpbnQgajsKCSAgZm9yIChqID0gMDsgaiA8IFhWRUNMRU4gKHgsIGkpOyBqKyspCgkgICAgWFZF
Q0VYUCAoeCwgaSwgaikgPSByZW1hcF9zcGxpdF9iaXZzIChYVkVDRVhQICh4LCBpLCBqKSk7Cgl9
CiAgICB9CiAgcmV0dXJuIHg7Cn0KCi8qIElmIEZJUlNUX1VJRCBpcyBhIHNldCBvZiBSRUdOTywg
YW5kIEZJUlNUX1VJRCBkb21pbmF0ZXMgTEFTVF9VSUQgKGUuZy4KICAgRklTVF9VSUQgaXMgYWx3
YXlzIGV4ZWN1dGVkIGlmIExBU1RfVUlEIGlzKSwgdGhlbiByZXR1cm4gMS4gIE90aGVyd2lzZQog
ICByZXR1cm4gMC4gIENPUFlfU1RBUlQgaXMgd2hlcmUgd2UgY2FuIHN0YXJ0IGxvb2tpbmcgZm9y
IHRoZSBpbnNucwogICBGSVJTVF9VSUQgYW5kIExBU1RfVUlELiAgQ09QWV9FTkQgaXMgd2hlcmUg
d2Ugc3RvcCBsb29raW5nIGZvciB0aGVzZQogICBpbnNucy4KCiAgIElmIHRoZXJlIGlzIG5vIEpV
TVBfSU5TTiBiZXR3ZWVuIExPT1BfU1RBUlQgYW5kIEZJUlNUX1VJRCwgdGhlbiBGSVJTVF9VSUQK
ICAgbXVzdCBkb21pbmF0ZSBMQVNUX1VJRC4KCiAgIElmIHRoZXJlIGlzIGEgQ09ERV9MQUJFTCBi
ZXR3ZWVuIEZJUlNUX1VJRCBhbmQgTEFTVF9VSUQsIHRoZW4gRklSU1RfVUlECiAgIG1heSBub3Qg
ZG9taW5hdGUgTEFTVF9VSUQuCgogICBJZiB0aGVyZSBpcyBubyBDT0RFX0xBQkVMIGJldHdlZW4g
RklSU1RfVUlEIGFuZCBMQVNUX1VJRCwgdGhlbiBGSVJTVF9VSUQKICAgbXVzdCBkb21pbmF0ZSBM
QVNUX1VJRC4gICovCgppbnQKc2V0X2RvbWluYXRlc191c2UgKHJlZ25vLCBmaXJzdF91aWQsIGxh
c3RfdWlkLCBjb3B5X3N0YXJ0LCBjb3B5X2VuZCkKICAgICBpbnQgcmVnbm87CiAgICAgaW50IGZp
cnN0X3VpZDsKICAgICBpbnQgbGFzdF91aWQ7CiAgICAgcnR4IGNvcHlfc3RhcnQ7CiAgICAgcnR4
IGNvcHlfZW5kOwp7CiAgaW50IHBhc3NlZF9qdW1wID0gMDsKICBydHggcCA9IE5FWFRfSU5TTiAo
Y29weV9zdGFydCk7CgogIHdoaWxlIChJTlNOX1VJRCAocCkgIT0gZmlyc3RfdWlkKQogICAgewog
ICAgICBpZiAoR0VUX0NPREUgKHApID09IEpVTVBfSU5TTikKCXBhc3NlZF9qdW1wPSAxOwogICAg
ICAvKiBDb3VsZCBub3QgZmluZCBGSVJTVF9VSUQuICAqLwogICAgICBpZiAocCA9PSBjb3B5X2Vu
ZCkKCXJldHVybiAwOwogICAgICBwID0gTkVYVF9JTlNOIChwKTsKICAgIH0KCiAgLyogVmVyaWZ5
IHRoYXQgRklSU1RfVUlEIGlzIGFuIGluc24gdGhhdCBlbnRpcmVseSBzZXRzIFJFR05PLiAgKi8K
ICBpZiAoR0VUX1JUWF9DTEFTUyAoR0VUX0NPREUgKHApKSAhPSAnaScKICAgICAgfHwgISBkZWFk
X29yX3NldF9yZWdub19wIChwLCByZWdubykpCiAgICByZXR1cm4gMDsKCiAgLyogRklSU1RfVUlE
IGlzIGFsd2F5cyBleGVjdXRlZC4gICovCiAgaWYgKHBhc3NlZF9qdW1wID09IDApCiAgICByZXR1
cm4gMTsKCiAgd2hpbGUgKElOU05fVUlEIChwKSAhPSBsYXN0X3VpZCkKICAgIHsKICAgICAgLyog
SWYgd2Ugc2VlIGEgQ09ERV9MQUJFTCBiZXR3ZWVuIEZJUlNUX1VJRCBhbmQgTEFTVF9VSUQsIHRo
ZW4gd2UKCSBjYW4gbm90IGJlIHN1cmUgdGhhdCBGSVJTVF9VSUQgZG9taW5hdGVzIExBU1RfVUlE
LiAgKi8KICAgICAgaWYgKEdFVF9DT0RFIChwKSA9PSBDT0RFX0xBQkVMKQoJcmV0dXJuIDA7CiAg
ICAgIC8qIENvdWxkIG5vdCBmaW5kIExBU1RfVUlELCBidXQgd2UgcmVhY2hlZCB0aGUgZW5kIG9m
IHRoZSBsb29wLCBzbwoJIGl0IG11c3QgYmUgc2FmZS4gICovCiAgICAgIGVsc2UgaWYgKHAgPT0g
Y29weV9lbmQpCglyZXR1cm4gMTsKICAgICAgcCA9IE5FWFRfSU5TTiAocCk7CiAgICB9CgogIC8q
IEZJUlNUX1VJRCBpcyBhbHdheXMgZXhlY3V0ZWQgaWYgTEFTVF9VSUQgaXMgZXhlY3V0ZWQuICAq
LwogIHJldHVybiAxOwp9Cg==


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]