[mapserver-users] Mapserver / PostGIS Connection troubles
Dave Blasby
dblasby@refractions.net
Wed, 18 Sep 2002 08:58:57 -0700
This is a multi-part message in MIME format.
--------------B3E645280CC9A5A17468A5A8
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
"Lowther, David W" wrote:
> We are getting a, "msPOSTGISLayerOpen(): Query error. Error parsing POSTGIS
> connection information."
You should use the newest version of mappostgis.c since it will give you
much better error reporting.
Is your postmaster running and accepting TCP/IP connections (ie. did you
run it with the -i option)?
I've attached mappostgis.c - replace your copy of mappostgis.c with this
one & recompile & re-install.
dave
--------------B3E645280CC9A5A17468A5A8
Content-Type: application/x-unknown-content-type-cfile;
name="mappostgis.c"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="mappostgis.c"
I2luY2x1ZGUgIm1hcC5oIg0KDQojaWZuZGVmIEZMVF9NQVgNCiNkZWZpbmUgRkxUX01BWCAy
NTAwMDAwMC4wDQojZW5kaWYNCg0KI2lmZGVmIFVTRV9QT1NUR0lTDQoNCiNpZm5kZWYgTElU
VExFX0VORElBTg0KI2RlZmluZSBMSVRUTEVfRU5ESUFOIDENCiNlbmRpZg0KI2lmbmRlZiBC
SUdfRU5ESUFODQojZGVmaW5lIEJJR19FTkRJQU4gMg0KI2VuZGlmDQoNCiNpbmNsdWRlICJs
aWJwcS1mZS5oIg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KDQoNCg0KDQp2b2lkIHBvc3RyZXNx
bF9OT1RJQ0VfSEFORExFUih2b2lkICphcmcsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOw0KDQoN
CmNoYXIgKkRBVEFFUlJPUk1FU1NBR0UoY2hhciAqZGF0YVN0cmluZywgY2hhciAqcHJlYW1i
bGUpDQp7DQoJY2hhcgkqbWVzc2FnZTsNCgljaGFyCXRtcFs1MDAwXTsNCg0KCW1lc3NhZ2Ug
PSBtYWxsb2MoNzAwMCk7DQoNCglzcHJpbnRmKG1lc3NhZ2UsIiVzIixwcmVhbWJsZSk7DQoN
CgkJc3ByaW50Zih0bXAsIkVycm9yIHBhcnNpbmcgUE9TVEdJUyBkYXRhIHZhcmlhYmxlLiBZ
b3Ugc3BlY2lmaWVkICclcycuPGJyPlxuU3RhbmRhcmQgd2F5cyBvZiBzcGVjaWZpeWluZyBh
cmUgOiA8YnI+XG4oMSkgJ2dlb21ldHJ5X2NvbHVtbiBmcm9tIGdlb21ldHJ5X3RhYmxlJyA8
YnI+XG4oMikgJ2dlb21ldHJ5X2NvbHVtbiBmcm9tICgmbHQ7c3ViIHF1ZXJ5Jmd0OykgYXMg
Zm9vIHVzaW5nIHVuaXF1ZSAmbHQ7Y29sdW1uIG5hbWUmZ3Q7IHVzaW5nIFNSSUQ9Jmx0O3Ny
aWQjJmd0OycgPGJyPjxicj5cblxuIiwNCgkJCQkJCQkJCQkJCQkJCQkJCSAgZGF0YVN0cmlu
Zyk7DQoJCXN0cmNhdChtZXNzYWdlLHRtcCk7DQoNCgkJc3ByaW50Zih0bXAsIk5PVEU6IGZv
ciAoMikgJ3VzaW5nIHVuaXF1ZScgYW5kICdTUklEPScgYXJlIG9wdGlvbmFsLCBidXQgaXRz
IGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgdGhlbSEhISA8YnI+PGJyPlxuXG4i
KTsNCgkJc3RyY2F0KG1lc3NhZ2UsdG1wKTsNCg0KCQlzcHJpbnRmKHRtcCwiVGhlIG1vc3Qg
Y29tbW9uIHByb2JsZW0gd2l0aCAoMSkgaXMgaW5jb3JyZWN0bHkgdXBsb2FkaW5nIHlvdXIg
ZGF0YS4gIFRoZXJlIG11c3QgYmUgYW4gZW50cnkgaW4gdGhlIGdlb21ldHJ5X2NvbHVtbnMg
dGFibGUuICBUaGlzIHdpbGwgYmUgYXV0b21hdGljYWxseSBkb25lIGlmIHlvdSB1c2VkIHRo
ZSBzaHAycGdzcWwgcHJvZ3JhbSBvciBjcmVhdGVkIHlvdXIgZ2VvbWV0cnkgY29sdW1uIHdp
dGggdGhlIEFkZEdlb21ldHJ5Q29sdW1uKCkgcG9zdGdpcyBmdW5jdGlvbi4gPGJyPjxicj5c
blxuIik7DQoJCXN0cmNhdChtZXNzYWdlLHRtcCk7DQoNCgkJc3ByaW50Zih0bXAsIkFub3Ro
ZXIgaW1wb3J0YW50IHRoaW5nIHRvIGNoZWNrIGlzIHRoYXQgdGhlIHBvc3RnaXMgdXNlciBz
cGVjaWZpZWQgaW4gdGhlIENPTk5FQ1RJT04gc3RyaW5nIGRvZXMgaGF2ZSBTRUxFQ1QgcGVy
bWlzc2lvbnMgb24gdGhlIHRhYmxlKHMpIHNwZWNpZmllZCBpbiB5b3VyIERBVEEgc3RyaW5n
LiA8YnI+PGJyPlxuXG4iKTsNCgkJc3RyY2F0KG1lc3NhZ2UsdG1wKTsNCg0KCQlzcHJpbnRm
KHRtcCwiSWYgeW91IGFyZSB1c2luZyB0aGUgKDIpIG1ldGhvZCwgeW91J3ZlIHByb2JhYmx5
IG1hZGUgYSB0eXBvLjxicj5cbkV4YW1wbGU6ICAndGhlX2dlb20gZnJvbSAoc2VsZWN0IHRo
ZV9nZW9tLG9pZCBmcm9tIG15dGFibGUpIGFzIGZvbyB1c2luZyB1bmlxdWUgb2lkIHVzaW5n
IFNSSUQ9NzYnPGJyPlxuVGhpcyBpcyB2ZXJ5IG11Y2ggbGlrZSB0aGUgKDEpIGV4YW1wbGUu
ICBUaGUgc3VicXVlcnkgKCdzZWxlY3QgdGhlX2dlb20sb2lkIGZyb20gbXl0YWJsZScpIHdp
bGwgYmUgZXhlY3V0ZWQsIGFuZCBtYXBzZXJ2ZXIgd2lsbCB1c2UgJ29pZCcgKGEgcG9zdGdy
ZXNxbCBzeXN0ZW0gY29sdW1uKSBmb3IgdW5pcXVlbHkgc3BlY2lmeWluZyBhIGdlb21ldHJ5
IChmb3IgbWFwc2VydmVyIHF1ZXJpZXMpLiAgVGhlIGdlb21ldHJ5ICh0aGVfZ2VvbSkgbXVz
dCBoYXZlIGEgU1JJRCBvZiA3Ni4gPGJyPjxicj5cblxuIik7DQoJCXN0cmNhdChtZXNzYWdl
LHRtcCk7DQoNCgkJc3ByaW50Zih0bXAsIkV4YW1wbGU6ICAncm9hZHMgZnJvbSAoc2VsZWN0
IHRhYmxlMS5yb2Fkcyx0YWJsZTEucmRfc2VnbWVudF9pZCx0YWJsZTIucmRfbmFtZSx0YWJs
ZTIucmRfdHlwZSBmcm9tIHRhYmxlMSx0YWJsZTIgd2hlcmUgdGFibGUxLnJkX3NlZ21lbnRf
aWQ9dGFibGUyLnJkX3NlZ21lbnRfaWQpIGFzIGZvbyB1c2luZyB1bmlxdWUgcmRfc2VnbWVu
dF9pZCB1c2luZyBTUklEPTg5JyA8YnI+PEJyPlxuXG4iKTsNCgkJc3RyY2F0KG1lc3NhZ2Us
dG1wKTsNCg0KCQlzcHJpbnRmKHRtcCwiVGhpcyBpcyBhIG1vcmUgY29tcGxleCBzdWItcXVl
cnkgaW52b2x2aW5nIGpvaW5pbmcgdHdvIHRhYmxlcy4gIFRoZSByZXN1bHRpbmcgZ2VvbWV0
cnkgKGNvbHVtbiAncm9hZHMnKSBoYXMgU1JJRD04OSwgYW5kIG1hcHNlcnZlciB3aWxsIHVz
ZSByZF9zZWdtZW50X2lkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgZ2VvbWV0cnkuICBUaGUg
YXR0cmlidXRlcyByZF90eXBlIGFuZCByZF9uYW1lIGFyZSB1c2VhYmxlIGJ5IG90aGVyIHBh
cnRzIG9mIG1hcHNlcnZlci48YnI+PGJyPlxuXG4iKTsNCgkJc3RyY2F0KG1lc3NhZ2UsdG1w
KTsNCg0KDQoJCXNwcmludGYodG1wLCJUbyB1c2UgYSB2aWV3LCBkbyBzb21ldGhpbmcgbGlr
ZTo8QlI+XG4nPGdlb21ldHJ5X2NvbHVtbj4gZnJvbSAoU0VMRUNUICogRlJPTSA8dmlldz4p
IGFzIGZvbyB1c2luZyB1bmlxdWUgPGNvbHVtbiBuYW1lPiB1c2luZyBTUklEPTxzcmlkIz4n
PGJyPlxuRm9yIGV4YW1wbGU6ICd0aGVfZ2VvbSBmcm9tIChTRUxFQ1QgKiBGUk9NIG15dmll
dykgYXMgZm9vIHVzaW5nIHVuaXF1ZSBnaWQgdXNpbmcgU1JJRD0tMScgPGJyPjxicj5cblxu
Iik7DQoJCXN0cmNhdChtZXNzYWdlLHRtcCk7DQoNCgkJc3ByaW50Zih0bXAsIk5PVEU6IGZv
ciB0aGUgKDIpIGNhc2UsIHRoZSAnIGFzIGZvbyAnIGlzIHJlcXVyZWQuICBUaGUgJ3VzaW5n
IHVuaXF1ZSAmbHQ7Y29sdW1uJmd0OycgYW5kICd1c2luZyBTUklEPScgYXJlIGNhc2Ugc2Vu
c2l0aXZlLjxicj5cbiAiKTsNCgkJc3RyY2F0KG1lc3NhZ2UsdG1wKTsNCg0KDQoJCXNwcmlu
dGYodG1wLCJOT1RFOiAndXNpbmcgdW5pcXVlICZsdDtjb2x1bW4mZ3Q7JyB3b3VsZCBub3Jt
YWxseSBiZSB0aGUgc3lzdGVtIGNvbHVtbiAnb2lkJywgYnV0IGZvciB2aWV3cyBhbmQgam9p
bnMgeW91J2xsIGFsbW9zdCBjZXJ0YWlubHkgd2FudCB0byB1c2UgYSByZWFsIGNvbHVtbiBp
biBvbmUgb2YgeW91ciB0YWJsZXMuIDxCcj5cbiIpOw0KCQlzdHJjYXQobWVzc2FnZSx0bXAp
Ow0KDQoJCXNwcmludGYodG1wLCJOT1RFOiB5b3UnbGwgd2FudCB0byBidWlsZCBhIHNwYXRp
YWwgaW5kZXggb24geW91ciBnZW9tZXRyaWMgZGF0YTo8YnI+XG4iKTsNCgkJc3RyY2F0KG1l
c3NhZ2UsdG1wKTsNCg0KCQlzcHJpbnRmKHRtcCwiQ1JFQVRFIElOREVYICZsdDtpbmRleG5h
bWUmZ3Q7IE9OICZsdDt0YWJsZSZndDsgVVNJTkcgR0lTVCAoJmx0O2dlb21ldHJ5Y29sdW1u
Jmd0OyBHSVNUX0dFT01FVFJZX09QUyApIDxicj5cbiIpOw0KCQlzdHJjYXQobWVzc2FnZSx0
bXApOw0KDQoJCXNwcmludGYodG1wLCJZb3UnbGwgYWxzbyB3YW50IHRvIHB1dCBhbiBpbmRl
eCBvbiBlaXRoZXIgb2lkIG9yIHdoYXRldmVyIHlvdSB1c2VkIGZvciB5b3VyIHVuaXF1ZSBj
b2x1bW46PGJyPlxuIik7DQoJCXN0cmNhdChtZXNzYWdlLHRtcCk7DQoNCgkJc3ByaW50Zih0
bXAsIkNSRUFURSBJTkRFWCAmbHQ7aW5kZXhuYW1lJmd0OyBPTiAmbHQ7dGFibGUmZ3Q7ICgm
bHQ7dW5pcXVlY29sdW1uJmd0OykiKTsNCgkJc3RyY2F0KG1lc3NhZ2UsdG1wKTsNCg0KDQoJ
cmV0dXJuIG1lc3NhZ2U7DQoNCg0KfQ0KDQp0eXBlZGVmIHN0cnVjdCBtc19QT1NUR0lTX2xh
eWVyX2luZm9fdA0Kew0KCWNoYXIJCSpzcWw7CQkvL3NxbCBxdWVyeSB0byBzZW5kIHRvIERC
DQoJUEdjb25uICAgICAqY29ubjsgCS8vY29ubmVjdGlvbiB0byBkYg0KCWxvbmcJIAlyb3df
bnVtOyAgCS8vd2hhdCByb3cgaXMgdGhlIE5FWFQgdG8gYmUgcmVhZCAoZm9yIHJhbmRvbSBh
Y2Nlc3MpDQogCVBHcmVzdWx0ICAgKnF1ZXJ5X3Jlc3VsdDsvL2ZvciBmZXRjaGluZyByb3dz
IGZyb20gdGhlIGRiDQoJY2hhcgkgICAgICpmaWVsZHM7CSAvLyByZXN1bHRzIGZyb20gRVhQ
TEFJTiBWRVJCT1NFIChvciBudWxsKQ0KCWNoYXIJCSp1cmlkX25hbWU7IC8vIG5hbWUgb2Yg
dXNlci1zcGVjaWZpZWQgdW5pcXVlIGlkZW50aWZpZXIgb3IgT0lEDQoJY2hhcgkJKnVzZXJf
c3JpZDsgLy96ZXJvIGxlbmd0aCA9IGNhbGN1bGF0ZSwgbm9uLXplcm8gbWVhbnMgdXNpbmcg
dGhpcyB2YWx1ZSENCg0KfSBtc1BPU1RHSVNMYXllckluZm87DQoNCg0KaW50IG1zUE9TVEdJ
U0xheWVyUGFyc2VEYXRhKGNoYXIgKmRhdGEsIGNoYXIgKmdlb21fY29sdW1uX25hbWUsDQoJ
CQkJCWNoYXIgKnRhYmxlX25hbWUsIGNoYXIgKnVyaWRfbmFtZSxjaGFyICp1c2VyX3NyaWQp
Ow0KDQp2b2lkIHBvc3RyZXNxbF9OT1RJQ0VfSEFORExFUih2b2lkICphcmcsIGNvbnN0IGNo
YXIgKm1lc3NhZ2UpDQp7DQoJY2hhcgkqc3RyLCpzdHIyOw0KCWNoYXIgICpyZXN1bHQ7DQoN
CglpZiAoc3Ryc3RyKG1lc3NhZ2UsIlFVRVJZIERVTVAiKSkNCgl7DQoJCWlmICgJKChtc1BP
U1RHSVNMYXllckluZm8gKikgYXJnKS0+ZmllbGRzKQ0KCQl7DQoJCQlmcmVlKCgobXNQT1NU
R0lTTGF5ZXJJbmZvICopIGFyZyktPmZpZWxkcyk7IAkvLyBmcmVlIHVwIHNwYWNlDQoNCgkJ
fQ0KCQkJcmVzdWx0ID0gbWFsbG9jICggNjAwMCkgOw0KCQkJKChtc1BPU1RHSVNMYXllcklu
Zm8gKikgYXJnKS0+ZmllbGRzID0gcmVzdWx0Ow0KCQkJcmVzdWx0WzBdID0gMDsgLy9udWxs
IHRlcm1pbmF0ZSBpdA0KDQoJCS8vbmVlZCB0byBwYXJzZSBpdCBhIGJpdA0KCQlzdHIgPSAo
Y2hhciAqKSBtZXNzYWdlOw0KCQl3aGlsZSAoc3RyICE9IE5VTEwpDQoJCXsNCgkJCXN0ciA9
IHN0cnN0cihzdHIsIiA6cmVzbmFtZSAiKTsNCgkJCWlmIChzdHIgIT0gTlVMTCkNCgkJCXsN
CgkJCQlzdHIrKzsgLy8gbm93IHBvaW50cyBhdCAiOiINCgkJCQlzdHI9IHN0cnN0cihzdHIs
IiAiKTsJLy9ub3cgcG9pbnRzIHRvIGxhc3QgIiAiDQoJCQkJc3RyKys7IC8vbm93IHBvaW50
cyB0byBzdGFydCBvZiBuZXh0IHdvcmQNCg0KCQkJCXN0cjIgPSBzdHJzdHIoc3RyLCIgIik7
CS8vcG9pbnRzIHRvIGVuZCBvZiBuZXh0IHdvcmQNCgkJCQlpZiAoc3RybmNtcChzdHIsICI8
PiIsIChzdHIyLXN0cikpKSB7IC8vIE5vdCBhIGJvZ3VzIHJlc25hbWUNCgkJCQlpZiAoc3Ry
bGVuKHJlc3VsdCkgPiAwKQ0KCQkJCXsNCgkJCQkJc3RyY2F0KHJlc3VsdCwiLCIpOw0KCQkJ
CX0NCg0KCQkJCQlzdHJuY2F0KHJlc3VsdCxzdHIsIChzdHIyLXN0cikgKTsNCgkJCQl9DQoJ
CQl9DQoJCX0NCgkJLy9mcHJpbnRmKHN0ZGVyciwibm90aWNlIHJldHVybnM6ICVzXG4iLHJl
c3VsdCk7DQoJfQ0KfQ0KDQoNCnN0YXRpYyBpbnQgZ0JZVEVfT1JERVIgPSAwOw0KDQovL29w
ZW4gdXAgYSBjb25uZWN0aW9uIHRvIHRoZSBwb3N0Z3Jlc3FsIGRhdGFiYXNlIHVzaW5nIHRo
ZSBjb25uZWN0aW9uIHN0cmluZyBpbiBsYXllci0+Y29ubmVjdGlvbg0KLy8gaWUuICJob3N0
PTE5Mi4xNjguNTAuMyB1c2VyPXBvc3RncmVzIHBvcnQ9NTU1NSBkYm5hbWU9bWFwc2VydiIN
CmludCBtc1BPU1RHSVNMYXllck9wZW4obGF5ZXJPYmogKmxheWVyKQ0Kew0KCW1zUE9TVEdJ
U0xheWVySW5mbwkqbGF5ZXJpbmZvOw0KICAgICAgICBpbnQJCQlvcmRlcl90ZXN0ID0gMTsN
Cg0KLy9mcHJpbnRmKHN0ZGVyciwibXNQT1NUR0lTTGF5ZXJPcGVuIGNhbGxlZFxuIik7DQoJ
aWYgKGxheWVyLT5wb3N0Z2lzbGF5ZXJpbmZvKQ0KCQlyZXR1cm4gTVNfU1VDQ0VTUzsJLy9h
bHJlYWR5IG9wZW4NCg0KICAgICAgICBpZiggbGF5ZXItPmRhdGEgPT0gTlVMTCApDQogICAg
ICAgIHsNCg0KDQogICAgICAgICAgICBtc1NldEVycm9yKE1TX1FVRVJZRVJSLA0KCQkJCQlE
QVRBRVJST1JNRVNTQUdFKCIiLCJFcnJvciBwYXJzaW5nIFBPU1RHSVMgZGF0YSB2YXJpYWJs
ZTogbm90aGluZyBzcGVjaWZpZWQgaW4gREFUQSBzdGF0ZW1lbnQuPGJyPjxicj5cblxuTW9y
ZSBIZWxwOjxicj48YnI+XG5cbiIpLA0KCQkJCQkibXNQT1NUR0lTTGF5ZXJPcGVuKCkiKTsN
Cg0KICAgICAgICAgICAgcmV0dXJuKE1TX0ZBSUxVUkUpOw0KICAgICAgICB9DQoNCgkvL2hh
dmUgdG8gc2V0dXAgYSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhYmFzZQ0KDQoJbGF5ZXJpbmZv
ID0gKG1zUE9TVEdJU0xheWVySW5mbyAqKSBtYWxsb2MoIHNpemVvZihtc1BPU1RHSVNMYXll
ckluZm8pICk7DQoJbGF5ZXJpbmZvLT5zcWwgPSBOVUxMOyAvL2NhbGMgbGF0ZXINCglsYXll
cmluZm8tPnJvd19udW09MDsNCglsYXllcmluZm8tPnF1ZXJ5X3Jlc3VsdD0gTlVMTDsNCgls
YXllcmluZm8tPmZpZWxkcyA9IE5VTEw7DQoNCglsYXllcmluZm8tPmNvbm4gPSBQUWNvbm5l
Y3RkYiggbGF5ZXItPmNvbm5lY3Rpb24gKTsNCg0KICAgIGlmIChQUXN0YXR1cyhsYXllcmlu
Zm8tPmNvbm4pID09IENPTk5FQ1RJT05fQkFEKQ0KICAgIHsNCiAgICAgICAgbXNTZXRFcnJv
cihNU19RVUVSWUVSUiwgImNvdWxkbnQgbWFrZSBjb25uZWN0aW9uIHRvIERCIHdpdGggY29u
bmVjdCBzdHJpbmcgJyVzJy5cbjxicj5cbkVycm9yIHJlcG9ydGVkIHdhcyAnJXMnLlxuPGJy
PlxuXG5UaGlzIGVycm9yIG9jY3VyZWQgd2hlbiB0cnlpbmcgdG8gbWFrZSBhIGNvbm5lY3Rp
b24gdG8gdGhlIHNwZWNpZmllZCBwb3N0Z3Jlc3FsIHNlcnZlci4gIFxuPGJyPlxuTW9zdCBj
b21tb25seSB0aGlzIGlzIGNhdXNlZCBieSA8YnI+XG4oMSkgaW5jb3JyZWN0IGNvbm5lY3Rp
b24gc3RyaW5nIDxicj5cbigyKSB5b3UgZGlkbnQgc3BlY2lmeSBhICd1c2VyPS4uLicgaW4g
eW91ciBjb25uZWN0aW9uIHN0cmluZyA8YnI+XG4oMykgdGhlIHBvc3RtYXN0ZXIgKHBvc3Rn
cmVzcWwgc2VydmVyKSBpc250IHJ1bm5pbmcgPGJyPlxuKDQpIHlvdSBhcmUgbm90IGFsbG93
aW5nIFRDUC9JUCBjb25uZWN0aW9uIHRvIHRoZSBwb3N0bWFzdGVyIDxicj5cbig1KSB5b3Vy
IHBvc3RtYXN0ZXIgaXMgbm90IHJ1bm5pbmcgb24gdGhlIGNvcnJlY3QgcG9ydCAtIGlmIGl0
cyBub3Qgb24gNTQzMiB5b3UgbXVzdCBzcGVjaWZ5IGEgJ3BvcnQ9Li4uJyA8YnI+XG4gKDYp
IHRoZSBzZWN1cml0eSBvbiB5b3VyIHN5c3RlbSBkb2VzIG5vdCBhbGxvdyB0aGUgd2Vic2Vy
dmVyICh1c3VhbGx5IHVzZXIgJ25vYm9keScpIHRvIG1ha2Ugc29ja2V0IGNvbm5lY3Rpb25z
IHRvIHRoZSBwb3N0bWFzdGVyIDxicj5cbig3KSB5b3UgZm9yZ290IHRvIHNwZWNpZnkgYSAn
aG9zdD0uLi4nIGlmIHRoZSBwb3N0bWFzdGVyIGlzIG9uIGEgZGlmZmVyZW50IG1hY2hpbmU8
YnI+XG4oOCkgeW91IG1hZGUgYSB0eXBvIDxicj5cbiAgIiwNCiAgICAgICAgICAgICAgICAg
Im1zUE9TVEdJU0xheWVyT3BlbigpIiwgbGF5ZXItPmNvbm5lY3Rpb24sUFFlcnJvck1lc3Nh
Z2UobGF5ZXJpbmZvLT5jb25uKSApOw0KDQoJICBmcmVlKGxheWVyaW5mbyk7DQoJICByZXR1
cm4oTVNfRkFJTFVSRSk7DQogICAgfQ0KDQoJUFFzZXROb3RpY2VQcm9jZXNzb3IobGF5ZXJp
bmZvLT5jb25uLCBwb3N0cmVzcWxfTk9USUNFX0hBTkRMRVIgLCh2b2lkICopIGxheWVyaW5m
byk7DQoNCg0KDQoJbGF5ZXItPnBvc3RnaXNsYXllcmluZm8gPSAodm9pZCAqKSBsYXllcmlu
Zm87DQoNCiAgICAgICAgaWYoICgoY2hhciAqKSAmb3JkZXJfdGVzdClbMF0gPT0gMSApDQog
ICAgICAgICAgICBnQllURV9PUkRFUiA9IExJVFRMRV9FTkRJQU47DQogICAgICAgIGVsc2UN
CiAgICAgICAgICAgIGdCWVRFX09SREVSID0gQklHX0VORElBTjsNCg0KCXJldHVybiBNU19T
VUNDRVNTOw0KfQ0KDQoNCi8vIEZyZWUgdGhlIGl0ZW1pbmRleGVzIGFycmF5IGluIGEgbGF5
ZXIuDQp2b2lkICAgIG1zUE9TVEdJU0xheWVyRnJlZUl0ZW1JbmZvKGxheWVyT2JqICpsYXll
cikNCnsNCi8vZnByaW50ZihzdGRlcnIsIm1zUE9TVEdJU0xheWVyRnJlZUl0ZW1JbmZvIGNh
bGxlZFxuIik7DQoNCiAJaWYgKGxheWVyLT5pdGVtaW5mbykNCiAgICAgIAlmcmVlKGxheWVy
LT5pdGVtaW5mbyk7DQogIAlsYXllci0+aXRlbWluZm8gPSBOVUxMOw0KfQ0KDQoNCi8vYWxs
b2NhdGUgdGhlIGl0ZW1pbmZvIGluZGV4IGFycmF5IC0gc2FtZSBvcmRlciBhcyB0aGUgaXRl
bSBsaXN0DQppbnQgbXNQT1NUR0lTTGF5ZXJJbml0SXRlbUluZm8obGF5ZXJPYmogKmxheWVy
KQ0Kew0KCWludCAgIGk7DQoJaW50ICppdGVtaW5kZXhlcyA7DQoNCi8vZnByaW50ZihzdGRl
cnIsIm1zUE9TVEdJU0xheWVySW5pdEl0ZW1JbmZvIGNhbGxlZFxuIik7DQoNCg0KDQoJaWYg
KGxheWVyLT5udW1pdGVtcyA9PSAwKQ0KICAgICAgCXJldHVybiBNU19TVUNDRVNTOw0KDQoJ
aWYgKGxheWVyLT5pdGVtaW5mbykNCiAgICAgCSAJZnJlZShsYXllci0+aXRlbWluZm8pOw0K
DQogCWlmKChsYXllci0+aXRlbWluZm8gPSAoaW50ICopbWFsbG9jKHNpemVvZihpbnQpKmxh
eWVyLT5udW1pdGVtcykpPT0gTlVMTCkNCiAgCXsNCiAgIAkJbXNTZXRFcnJvcihNU19NRU1F
UlIsIE5VTEwsICJtc1BPU1RHSVNMYXllckluaXRJdGVtSW5mbygpIik7DQogICAJIAlyZXR1
cm4oTVNfRkFJTFVSRSk7DQogIAl9DQoNCglpdGVtaW5kZXhlcyA9IChpbnQqKWxheWVyLT5p
dGVtaW5mbzsNCiAgCWZvcihpPTA7aTxsYXllci0+bnVtaXRlbXM7aSsrKQ0KIAl7DQoJCWl0
ZW1pbmRleGVzW2ldID0gaTsgLy9sYXN0IG9uZSBpcyBhbHdheXMgdGhlIGdlb21ldHJ5IG9u
ZSAtIHRoZSByZXN0IGFyZSBub24tZ2VvbQ0KCX0NCg0KIAlyZXR1cm4oTVNfU1VDQ0VTUyk7
DQp9DQoNCg0KLy9TaW5jZSB3ZSBub3cgaGF2ZSBQb3N0R0lTVCAwLjUsIDAuNiwgYW5kIDAu
NyAobm90IHJlbGVhc2VkIHlldCkgY2FsbGluZyBjb252ZW50aW9ucywNCi8vIHdlIGhhdmUg
dG8gYXR0ZW1wdCB0byBoYW5kbGUgdGhlIGRhdGFiYXNlIGluIHNldmVyYWwgd2F5cy4gIElm
IHdlIGRvIHRoZSB3cm9uZw0KLy8gdGhpbmcsIHRoZW4gaXQnbGwgdGhyb3cgYW4gZXJyb3Ig
YW5kIHdlIGNhbiByb2xsYmFjayBhbmQgdHJ5IGFnYWluLg0KLy8NCi8vIDEuIGF0dGVtcHQg
dG8gZG8gMC43IGNhbGxpbmcgY29udmVudGlvbiAobm90IGltcGxlbWVudGVkIHlldCkNCi8v
IDIuIGF0dGVtcHQgdG8gZG8gMC42IGNhbGxpbmcgY29udmVudGlvbiAoc3BhdGlhbCByZWYg
c3lzdGVtIG5lZWRlZCkNCi8vIDMuIGF0dGVtcHQgdG8gZG8gMC41IGNhbGxpbmcgY29udmVu
dGlvbiAobm8gc3BhdGlhbCByZWYgc3lzdGVtKQ0KDQovLyBUaGUgZGlmZmVyZW5jZSBiZXR3
ZWVuIDAuNSBhbmQgMC42IGlzIHRoYXQgdGhlIGJvdW5kaW5nIGJveCBtdXN0IGJlDQovLyBk
ZWNsYXJlZCB0byBiZSBpbiB0aGUgc2FtZSB0aGUgc2FtZSBzcGF0aWFsIHJlZmVyZW5jZSBz
eXN0ZW0gYXMgdGhlDQovLyBnZW9tZXRyeSBjb2x1bW4uICBGb3IgMC42LCB3ZSBkZXRlcm1p
bmUgdGhlIFNSSUQgb2YgdGhlIGNvbHVtbiBhbmQgdGhlbg0KLy8gdGFnIHRoZSBib3VuZGlu
ZyBib3ggYXMgdGhlIHNhbWUgU1JJRC4NCg0KaW50IHByZXBfREIoY2hhcgkqZ2VvbV90YWJs
ZSxjaGFyICAqZ2VvbV9jb2x1bW4sbGF5ZXJPYmogKmxheWVyLCBQR3Jlc3VsdCAqKnNxbF9y
ZXN1bHRzLHJlY3RPYmogcmVjdCxjaGFyICpxdWVyeV9zdHJpbmcsIGNoYXIgKnVyaWRfbmFt
ZSwgY2hhciAqdXNlcl9zcmlkKQ0Kew0KCVBHcmVzdWx0CSpyZXN1bHQ7DQoJY2hhcgljb2x1
bW5zX3dhbnRlZFs1MDAwXTsNCgljaGFyCXRlbXBbNTAwMF07DQoJY2hhcgl0bXBbNTAwMF07
DQoJY2hhcgl0bXAyWzUwMDBdOw0KCWNoYXIJcXVlcnlfc3RyaW5nXzBfNVs2MDAwXTsNCglj
aGFyCXF1ZXJ5X3N0cmluZ18wXzZbNjAwMF07DQoJaW50CXQ7DQoJY2hhcglib3gzZFsyMDBd
Ow0KCW1zUE9TVEdJU0xheWVySW5mbyAqbGF5ZXJpbmZvOw0KCWNoYXIgKnBvc19mcm9tLCAq
cG9zX2Z0YWIsICpwb3Nfc3BhY2UsICpwb3NfcGFyZW47DQoJY2hhciBmX3RhYmxlX25hbWVb
NTAwMF07DQoNCglsYXllcmluZm8gPSAobXNQT1NUR0lTTGF5ZXJJbmZvICopIGxheWVyLT5w
b3N0Z2lzbGF5ZXJpbmZvOw0KDQoJLyogU2V0IHRoZSB1cmlkIG5hbWUgKi8NCglsYXllcmlu
Zm8tPnVyaWRfbmFtZSA9IHVyaWRfbmFtZTsNCg0KCS8qIEV4dHJhY3QgdGhlIHByb3BlciBm
X3RhYmxlX25hbWUgZnJvbSB0aGUgZ2VvbV90YWJsZSBzdHJpbmcuDQoJICogV2UgYXJlIGV4
cGVjdGluZyB0aGUgZ2VvbV90YWJsZSB0byBiZSBlaXRoZXIgYSBzaW5nbGUgd29yZA0KCSAq
IG9yIGEgc3ViLXNlbGVjdCBjbGF1c2UgdGhhdCBwb3NzaWJseSBpbmNsdWRlcyBhIGpvaW4g
LS0NCgkgKg0KCSAqIChzZWxlY3QgY29sdW1uWyxjb2x1bW5bLC4uLl1dIGZyb20gZnRhYlsg
bmF0dXJhbCBqb2luIHRhYmxlMl0pIGFzIGZvbw0KCSAqDQoJICogV2UgYXJlIGV4cGVjdGlu
ZyB3aGl0ZXNwYWNlIG9yIGEgJyknIGFmdGVyIHRoZSBmdGFiIG5hbWUuDQoJICoNCgkgKi8N
Cg0KCXBvc19mcm9tID0gc3Ryc3RyKGdlb21fdGFibGUsICIgZnJvbSAiKTsNCglpZiAocG9z
X2Zyb20gPT0gTlVMTCkgew0KCQlzdHJjcHkoZl90YWJsZV9uYW1lLCBnZW9tX3RhYmxlKTsN
Cgl9DQoJZWxzZSB7IC8vIGdlb21fdGFibGUgaXMgYSBzdWItc2VsZWN0IGNsYXVzZQ0KCQlw
b3NfZnRhYiA9IHBvc19mcm9tICsgNjsgLy8gVGhpcyBzaG91bGQgYmUgdGhlIHN0YXJ0IG9m
IHRoZSBmdGFiIG5hbWUNCgkJcG9zX3NwYWNlID0gc3Ryc3RyKHBvc19mdGFiLCAiICIpOyAv
LyBGaXJzdCBzcGFjZQ0KCQlwb3NfcGFyZW4gPSBzdHJzdHIocG9zX2Z0YWIsICIpIik7IC8v
IENsb3NpbmcgcGFyZW4gb2YgY2xhdXNlDQoJCWlmICggIChwb3Nfc3BhY2UgPT1OVUxMKSAg
fHwgKHBvc19wYXJlbiA9PU5VTEwpICkgew0KDQoJCQkgICAgICAgICAgICBtc1NldEVycm9y
KE1TX1FVRVJZRVJSLA0KCQkJCQkJCQlEQVRBRVJST1JNRVNTQUdFKGdlb21fdGFibGUsIkVy
cm9yIHBhcnNpbmcgUE9TVEdJUyBkYXRhIHZhcmlhYmxlOiBTb21ldGhpbmcgaXMgd3Jvbmcg
d2l0aCB5b3VyIHN1YnNlbGVjdCBzdGF0ZW1lbnQuPGJyPjxicj5cblxuTW9yZSBIZWxwOjxi
cj48YnI+XG5cbiIpLA0KCQkJCQkicHJlcF9EQigpIik7DQoNCgkJCXJldHVybihNU19GQUlM
VVJFKTsNCgkJfQ0KCQlpZiAocG9zX3BhcmVuIDwgcG9zX3NwYWNlKSB7IC8vIGNsb3Npbmcg
cGFyZW50aGVzaXMgcHJlY2VlZHMgYW55IHNwYWNlDQoJCQlzdHJuY3B5KGZfdGFibGVfbmFt
ZSwgcG9zX2Z0YWIsIHBvc19wYXJlbiAtIHBvc19mdGFiKTsNCgkJfQ0KCQllbHNlIHsNCgkJ
CXN0cm5jcHkoZl90YWJsZV9uYW1lLCBwb3NfZnRhYiwgcG9zX3NwYWNlIC0gcG9zX2Z0YWIp
Ow0KCQl9DQoJfQ0KDQoJaWYgKGxheWVyLT5udW1pdGVtcyA9PTApDQoJew0KCQlpZiAoZ0JZ
VEVfT1JERVIgPT0gTElUVExFX0VORElBTikNCgkJCXNwcmludGYoY29sdW1uc193YW50ZWQs
ImFzYmluYXJ5KGZvcmNlX2NvbGxlY3Rpb24oZm9yY2VfMmQoJXMpKSwnTkRSJyksJXM6OnRl
eHQiLCBnZW9tX2NvbHVtbiwgdXJpZF9uYW1lKTsNCgkJZWxzZQ0KCQkJc3ByaW50Zihjb2x1
bW5zX3dhbnRlZCwiYXNiaW5hcnkoZm9yY2VfY29sbGVjdGlvbihmb3JjZV8yZCglcykpLCdY
RFInKSwlczo6dGV4dCIsIGdlb21fY29sdW1uLCB1cmlkX25hbWUpOw0KCX0NCgllbHNlDQoJ
ew0KCQljb2x1bW5zX3dhbnRlZFswXSA9IDA7IC8vbGVuPTANCgkJZm9yICh0PTA7dDxsYXll
ci0+bnVtaXRlbXM7IHQrKykNCgkJew0KCQkJc3ByaW50Zih0ZW1wLCIlczo6dGV4dCwiLGxh
eWVyLT5pdGVtc1t0XSk7DQoJCQlzdHJjYXQoY29sdW1uc193YW50ZWQsdGVtcCk7DQoJCX0N
CgkJaWYgKGdCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4pDQoJCQlzcHJpbnRmKHRlbXAs
ImFzYmluYXJ5KGZvcmNlX2NvbGxlY3Rpb24oZm9yY2VfMmQoJXMpKSwnTkRSJyksJXM6OnRl
eHQiLCBnZW9tX2NvbHVtbiwgdXJpZF9uYW1lKTsNCgkJZWxzZQ0KCQkJc3ByaW50Zih0ZW1w
LCJhc2JpbmFyeShmb3JjZV9jb2xsZWN0aW9uKGZvcmNlXzJkKCVzKSksJ1hEUicpLCVzOjp0
ZXh0IiwgZ2VvbV9jb2x1bW4sIHVyaWRfbmFtZSk7DQoNCgkJc3RyY2F0KGNvbHVtbnNfd2Fu
dGVkLHRlbXApOw0KCX0NCg0KCXNwcmludGYoYm94M2QsIidCT1gzRCglLjE1ZyAlLjE1Zywl
LjE1ZyAlLjE1ZyknOjpCT1gzRCIscmVjdC5taW54LCByZWN0Lm1pbnksIHJlY3QubWF4eCwg
cmVjdC5tYXh5KTsNCg0KDQoJLy8gc3Vic3RpdHV0ZSB0b2tlbiAnIUJPWCEnIGluIGdlb21f
dGFibGUgd2l0aCB0aGUgYm94M2QgLSBkbyBhdCBtb3N0IDEgc3Vic3RpdHV0aW9uDQoNCgkJ
aWYgKHN0cnN0cihnZW9tX3RhYmxlLCIhQk9YISIpKQ0KCQl7DQoJCQkJLy8gbmVlZCB0byBk
byBhIHN1YnN0aXRpb24NCgkJCQljaGFyCSpzdGFydCwgKmVuZDsNCgkJCQljaGFyCSpyZXN1
bHQ7DQoNCgkJCQlyZXN1bHQgPSBtYWxsb2MoNzAwMCk7DQoNCgkJCQlzdGFydCA9IHN0cnN0
cihnZW9tX3RhYmxlLCIhQk9YISIpOw0KCQkJCWVuZCA9IHN0YXJ0KzU7DQoNCgkJCQlzdGFy
dFswXSA9MDsNCgkJCQlyZXN1bHRbMF09MDsNCgkJCQlzdHJjYXQocmVzdWx0LGdlb21fdGFi
bGUpOw0KCQkJCXN0cmNhdChyZXN1bHQsYm94M2QpOw0KCQkJCXN0cmNhdChyZXN1bHQsZW5k
KTsNCgkJCQlnZW9tX3RhYmxlPSByZXN1bHQ7DQoJCX0NCg0KDQoJaWYgKGxheWVyLT5maWx0
ZXIuc3RyaW5nID09IE5VTEwpDQoJew0KCQlzcHJpbnRmKHF1ZXJ5X3N0cmluZ18wXzUsIkRF
Q0xBUkUgbXljdXJzb3IgQklOQVJZIENVUlNPUiBGT1IgU0VMRUNUICVzIGZyb20gJXMgV0hF
UkUgJXMgJiYgJXMiLA0KCQkJCQkJY29sdW1uc193YW50ZWQsZ2VvbV90YWJsZSxnZW9tX2Nv
bHVtbixib3gzZCk7DQoJCWlmIChzdHJsZW4odXNlcl9zcmlkKSA9PSAwKQ0KCQl7DQoJCQlz
cHJpbnRmKHF1ZXJ5X3N0cmluZ18wXzYsIkRFQ0xBUkUgbXljdXJzb3IgQklOQVJZIENVUlNP
UiBGT1IgU0VMRUNUICVzIGZyb20gJXMgV0hFUkUgJXMgJiYgc2V0U1JJRCglcywgZmluZF9z
cmlkKCcnLCclcycsJyVzJykgKSIsDQoJCQkJCQljb2x1bW5zX3dhbnRlZCxnZW9tX3RhYmxl
LGdlb21fY29sdW1uLGJveDNkLGZfdGFibGVfbmFtZSxnZW9tX2NvbHVtbik7DQoJCX0NCgkJ
ZWxzZQkvL3VzZSB0aGUgdXNlciBzcGVjaWZpZWQgdmVyc2lvbg0KCQl7DQoJCQlzcHJpbnRm
KHF1ZXJ5X3N0cmluZ18wXzYsIkRFQ0xBUkUgbXljdXJzb3IgQklOQVJZIENVUlNPUiBGT1Ig
U0VMRUNUICVzIGZyb20gJXMgV0hFUkUgJXMgJiYgc2V0U1JJRCglcywgJXMgKSIsDQoJCQkJ
CQljb2x1bW5zX3dhbnRlZCxnZW9tX3RhYmxlLGdlb21fY29sdW1uLGJveDNkLHVzZXJfc3Jp
ZCk7DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJc3ByaW50ZihxdWVyeV9zdHJpbmdfMF81LCJE
RUNMQVJFIG15Y3Vyc29yIEJJTkFSWSBDVVJTT1IgRk9SIFNFTEVDVCAlcyBmcm9tICVzIFdI
RVJFICglcykgYW5kICglcyAmJiAlcykiLA0KCQkJCQkJY29sdW1uc193YW50ZWQsZ2VvbV90
YWJsZSxsYXllci0+ZmlsdGVyLnN0cmluZyxnZW9tX2NvbHVtbixib3gzZCk7DQoJCWlmIChz
dHJsZW4odXNlcl9zcmlkKSA9PSAwKQ0KCQl7DQoJCQlzcHJpbnRmKHF1ZXJ5X3N0cmluZ18w
XzYsIkRFQ0xBUkUgbXljdXJzb3IgQklOQVJZIENVUlNPUiBGT1IgU0VMRUNUICVzIGZyb20g
JXMgV0hFUkUgKCVzKSBhbmQgKCVzICYmIHNldFNSSUQoICVzLGZpbmRfc3JpZCgnJywnJXMn
LCclcycpICkpIiwNCgkJCQkJCWNvbHVtbnNfd2FudGVkLGdlb21fdGFibGUsbGF5ZXItPmZp
bHRlci5zdHJpbmcsZ2VvbV9jb2x1bW4sYm94M2QsZl90YWJsZV9uYW1lLGdlb21fY29sdW1u
KTsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXNwcmludGYocXVlcnlfc3RyaW5nXzBfNiwiREVD
TEFSRSBteWN1cnNvciBCSU5BUlkgQ1VSU09SIEZPUiBTRUxFQ1QgJXMgZnJvbSAlcyBXSEVS
RSAoJXMpIGFuZCAoJXMgJiYgc2V0U1JJRCggJXMsJXMpICkiLA0KCQkJCQkJY29sdW1uc193
YW50ZWQsZ2VvbV90YWJsZSxsYXllci0+ZmlsdGVyLnN0cmluZyxnZW9tX2NvbHVtbixib3gz
ZCx1c2VyX3NyaWQpOw0KDQoJCX0NCgl9DQoNCg0KCS8vYWxsb3cgaW5kZXggc2VhcmNoaW5n
DQogICAgcmVzdWx0ICA9IFBRZXhlYyhsYXllcmluZm8tPmNvbm4sICJzZXQgZW5hYmxlX3Nl
cXNjYW4gPSBvZmYiKTsNCiAgICBpZiAoIShyZXN1bHQpIHx8IFBRcmVzdWx0U3RhdHVzKHJl
c3VsdCkgIT0gUEdSRVNfQ09NTUFORF9PSykNCiAgICB7DQoJICAgICAgbXNTZXRFcnJvcihN
U19RVUVSWUVSUiwgIkVycm9yIGV4ZWN1dGluZyBQT1NUR0lTICAnc2V0IGVuYWJsZV9zZXFz
Y2FuIG9mZicgICBzdGF0ZW1lbnQuIiwNCiAgICAgICAgICAgICAgICAgIm1zUE9TVEdJU0xh
eWVyV2hpY2hTaGFwZXMoKSIpOw0KDQogICAgICAgIAlQUWNsZWFyKHJlc3VsdCk7DQoJICAJ
bGF5ZXJpbmZvLT5xdWVyeV9yZXN1bHQgPSBOVUxMOw0KCQlyZXR1cm4oTVNfRkFJTFVSRSk7
CQkJLy90b3RhbGx5IHNjcmV3ZWQhDQogICAgfQ0KDQoNCgkvL3N0YXJ0IHRyYW5zYWN0aW9u
IHJlcXVpcmVkIGJ5IGN1cnNvcg0KDQogICAgcmVzdWx0ID0gUFFleGVjKGxheWVyaW5mby0+
Y29ubiwgIkJFR0lOIik7DQogICAgaWYgKCEocmVzdWx0KSB8fCBQUXJlc3VsdFN0YXR1cyhy
ZXN1bHQpICE9IFBHUkVTX0NPTU1BTkRfT0spDQogICAgew0KCSAgICAgIG1zU2V0RXJyb3Io
TVNfUVVFUllFUlIsICJFcnJvciBleGVjdXRpbmcgUE9TVEdJUyAgQkVHSU4gICBzdGF0ZW1l
bnQuIiwNCiAgICAgICAgICAgICAgICAgIm1zUE9TVEdJU0xheWVyV2hpY2hTaGFwZXMoKSIp
Ow0KDQogICAgICAgIAlQUWNsZWFyKHJlc3VsdCk7DQoJICAJbGF5ZXJpbmZvLT5xdWVyeV9y
ZXN1bHQgPSBOVUxMOw0KCQlyZXR1cm4oTVNfRkFJTFVSRSk7CQkvLyB0b3RhbGx5IHNjcmV3
ZWQNCiAgICB9DQoNCg0KICAgIFBRY2xlYXIocmVzdWx0KTsNCg0KCS8vc2V0IGVuYWJsZV9z
ZXFzY2FuPW9mZiBub3QgcmVxdWlyZWQgKGFscmVhZHkgZG9uZSkNCg0KLy9mcHJpbnRmIChz
dGRlcnIsInF1ZXJ5X3N0cmluZ18wXzY6JXNcbiIscXVlcnlfc3RyaW5nXzBfNik7DQogICAg
cmVzdWx0ID0gUFFleGVjKGxheWVyaW5mby0+Y29ubiwgcXVlcnlfc3RyaW5nXzBfNiApOw0K
DQogICAgaWYgKCAocmVzdWx0IT1OVUxMKSAmJiAoUFFyZXN1bHRTdGF0dXMocmVzdWx0KSA9
PSBQR1JFU19DT01NQU5EX09LKSApDQogICAgew0KCSAgIAlQUWNsZWFyKHJlc3VsdCk7DQoJ
CSpzcWxfcmVzdWx0cyA9IHJlc3VsdDsNCgkJc3RyY3B5KHF1ZXJ5X3N0cmluZywgcXVlcnlf
c3RyaW5nXzBfNiApOw0KIAkJcmV0dXJuIChNU19TVUNDRVNTKTsNCiAgICB9DQoNCgkvL29r
YXksIHRoYXQgY29tbWFuZCBkaWRudCB3b3JrLiAgSXRzIHByb2JhYmx5IGEgMC41IGRhdGFi
YXNlDQoJLy8gV2UgaGF2ZSB0byBldmVyeXRoaW5nIGFnYWluLCBhZnRlciBwZXJmb3JtaW5n
IGEgcm9sbGJhY2suDQoNCgkgUFFjbGVhcihyZXN1bHQpOw0KICAgICAgIHJlc3VsdCA9IFBR
ZXhlYyhsYXllcmluZm8tPmNvbm4sICJyb2xsYmFjayIgKTsNCgkgUFFjbGVhcihyZXN1bHQp
Ow0KCSByZXN1bHQgPSBQUWV4ZWMobGF5ZXJpbmZvLT5jb25uLCAiYmVnaW4iICk7DQoNCiAg
ICBpZiAoIShyZXN1bHQpIHx8IFBRcmVzdWx0U3RhdHVzKHJlc3VsdCkgIT0gUEdSRVNfQ09N
TUFORF9PSykNCiAgICB7DQoJICAgICAgbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIkNvdWxk
bnQgcmVjb3ZlciBmcm9tIGEgYmFkIHF1ZXJ5OiBcbiclcydcbiIsDQogICAgICAgICAgICAg
ICAgICJwcmVwX0RCKCkiLHF1ZXJ5X3N0cmluZ18wXzYpOw0KDQoNCg0KICAgICAgICAJUFFj
bGVhcihyZXN1bHQpOw0KCSAgCWxheWVyaW5mby0+cXVlcnlfcmVzdWx0ID0gTlVMTDsNCgkJ
cmV0dXJuKE1TX0ZBSUxVUkUpOwkJLy8gdG90YWxseSBzY3Jld2VkDQogICAgfQ0KDQogICAg
UFFjbGVhcihyZXN1bHQpOw0KDQovL2ZwcmludGYgKHN0ZGVyciwicHJlcF9EQjpxdWVyeV9z
dHJpbmdfMF81OiVzXG4iLHF1ZXJ5X3N0cmluZ18wXzUpOw0KDQoNCiAgICByZXN1bHQgPSBQ
UWV4ZWMobGF5ZXJpbmZvLT5jb25uLCBxdWVyeV9zdHJpbmdfMF81ICk7DQoNCiAgICBpZiAo
IChyZXN1bHQhPU5VTEwpICYmIChQUXJlc3VsdFN0YXR1cyhyZXN1bHQpID09IFBHUkVTX0NP
TU1BTkRfT0spICkNCiAgICB7DQoJICAgCVBRY2xlYXIocmVzdWx0KTsNCgkJKnNxbF9yZXN1
bHRzID0gcmVzdWx0Ow0KCQlzdHJjcHkocXVlcnlfc3RyaW5nLCBxdWVyeV9zdHJpbmdfMF81
ICk7DQogCQlyZXR1cm4gKE1TX1NVQ0NFU1MpOw0KICAgIH0NCgkJLy9zcHJpbnRmKHRtcCwi
RXJyb3IgZXhlY3V0aW5nIFBPU1RHSVMgIERFQ0xBUkUgKHRoZSBhY3R1YWwgcXVlcnkpIHN0
YXRlbWVudDogJyVzJyA8YnI+PGJyPlxuXG5Qb3N0Z3Jlc3FsIHJlcG9ydHMgdGhlIGVycm9y
ICclcyc8YnI+PGJyPlxuXG5Nb3JlIEhlbHA6PGJyPjxicj5cblxuIiwNCgkJLy8JCQlxdWVy
eV9zdHJpbmdfMF82LA0KCQkvLwkJCVBRZXJyb3JNZXNzYWdlKGxheWVyaW5mby0+Y29ubikN
CgkJLy8JICAgKTsNCg0KDQoJCS8vZm9yIHNvbWUgcmVhc29uIGl0IGNyYXNoZXMgaWYgeW91
IGhhdmUgYmlnIHN0cmluZ3MgYXMgYXJndW1lbnRzOg0KDQoJCXNwcmludGYodG1wMiwgIkVy
cm9yIGV4ZWN1dGluZyBQT1NUR0lTICBERUNMQVJFICh0aGUgYWN0dWFsIHF1ZXJ5KSBzdGF0
ZW1lbnQ6ICclcycgPGJyPjxicj5cblxuUG9zdGdyZXNxbCByZXBvcnRzIHRoZSBlcnJvciAn
JXMnPGJyPjxicj5cblxuTW9yZSBIZWxwOjxicj48YnI+XG5cbiIsDQoJCQkJcXVlcnlfc3Ry
aW5nXzBfNiwNCgkJCQkJUFFlcnJvck1lc3NhZ2UobGF5ZXJpbmZvLT5jb25uKQ0KCQkJIAkp
Ow0KDQoNCgkJc3ByaW50Zih0bXAsICIlcyVzIiwNCgkJCQkJdG1wMiwNCgkJCQkJREFUQUVS
Uk9STUVTU0FHRSgiJmx0O2NoZWNrIHlvdXIgLm1hcCBmaWxlJmd0OyIgLCIiKQ0KCQkJIAkp
Ow0KDQoNCg0KICAgICAgICBtc1NldEVycm9yKE1TX1FVRVJZRVJSLHRtcCwicHJlcF9EQigp
Iik7DQoNCg0KICAgICAgICBQUWNsZWFyKHJlc3VsdCk7DQoJICAJbGF5ZXJpbmZvLT5xdWVy
eV9yZXN1bHQgPSBOVUxMOw0KCQlyZXR1cm4oTVNfRkFJTFVSRSk7CQkvLyB0b3RhbGx5IHNj
cmV3ZWQNCg0KDQp9DQoNCg0KLy8gYnVpbGQgdGhlIG5lY2Nlc3NhcnkgU1FMDQovLyBhbGxv
Y2F0ZSBhIGN1cnNvciBmb3IgdGhlIFNRTCBxdWVyeQ0KLy8gZ2V0IHJlYWR5IHRvIHJlYWQg
ZnJvbSB0aGUgY3Vyc29yDQovLw0KLy8gRm9yIHF1ZXJpZXMsIHdlIG5lZWQgdG8gYWxzbyBy
ZXRyZWl2ZSB0aGUgT0lEIGZvciBlYWNoIG9mIHRoZSByb3dzDQovLyBTbyBHZXRTaGFwZSgp
IGNhbiByYW5kb21seSBhY2Nlc3MgYSByb3cuDQoNCmludCBtc1BPU1RHSVNMYXllcldoaWNo
U2hhcGVzKGxheWVyT2JqICpsYXllciwgcmVjdE9iaiByZWN0KQ0Kew0KCWNoYXIJKnF1ZXJ5
X3N0cjsNCgljaGFyCXRhYmxlX25hbWVbNTAwMF07DQoJY2hhcglnZW9tX2NvbHVtbl9uYW1l
WzUwMDBdOw0KCWNoYXIJdXJpZF9uYW1lWzUwMDBdOw0KCWNoYXIJdXNlcl9zcmlkWzUwMDBd
Ow0KDQoJaW50CXNldF91cF9yZXN1bHQ7DQoNCgltc1BPU1RHSVNMYXllckluZm8JKmxheWVy
aW5mbzsNCg0KLy9mcHJpbnRmKHN0ZGVyciwibXNQT1NUR0lTTGF5ZXJXaGljaFNoYXBlcyBj
YWxsZWRcbiIpOw0KDQoJbGF5ZXJpbmZvID0gKG1zUE9TVEdJU0xheWVySW5mbyAqKSBsYXll
ci0+cG9zdGdpc2xheWVyaW5mbzsNCglpZiAobGF5ZXJpbmZvID09IE5VTEwpDQoJew0KCQkv
L2xheWVyIG5vdCBvcGVuZWQgeWV0DQoJCW1zU2V0RXJyb3IoTVNfUVVFUllFUlIsICJtc1BP
U1RHSVNMYXllcldoaWNoU2hhcGVzIGNhbGxlZCBvbiB1bm9wZW5lZCBsYXllciAobGF5ZXJp
bmZvID0gTlVMTCkiLA0KICAgICAgICAgICAgICAgICAibXNQT1NUR0lTTGF5ZXJXaGljaFNo
YXBlcygpIik7DQoJCXJldHVybihNU19GQUlMVVJFKTsNCgl9DQoNCiAgICAgICAgaWYoIGxh
eWVyLT5kYXRhID09IE5VTEwgKQ0KICAgICAgICB7DQogICAgICAgICAgICBtc1NldEVycm9y
KE1TX1FVRVJZRVJSLA0KICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBEQVRBIGNs
YXVzZSBpbiBQb3N0R0lTIExheWVyIGRlZmluaXRpb24uICBEQVRBIHN0YXRlbWVudCBtdXN0
IGNvbnRhaW4gJ2dlb21ldHJ5X2NvbHVtbiBmcm9tIHRhYmxlX25hbWUnIG9yICdnZW9tZXRy
eV9jb2x1bW4gZnJvbSAoc3ViLXF1ZXJ5KSBhcyBmb28nLiIsDQogICAgICAgICAgICAgICAg
ICAgICAgICJtc1BPU1RHSVNMYXllcldoaWNoU2hhcGVzKCkiKTsNCiAgICAgICAgICAgIHJl
dHVybihNU19GQUlMVVJFKTsNCiAgICAgICAgfQ0KDQoJcXVlcnlfc3RyID0gKGNoYXIgKikg
bWFsbG9jKDYwMDApOyAvL3Nob3VsZCBiZSBiaWcgZW5vdWdoDQoJbWVtc2V0KHF1ZXJ5X3N0
ciwwLDYwMDApOwkJLy96ZXJvIGl0IG91dA0KDQoJbXNQT1NUR0lTTGF5ZXJQYXJzZURhdGEo
bGF5ZXItPmRhdGEsIGdlb21fY29sdW1uX25hbWUsIHRhYmxlX25hbWUsIHVyaWRfbmFtZSx1
c2VyX3NyaWQpOw0KDQoJc2V0X3VwX3Jlc3VsdD0gcHJlcF9EQih0YWJsZV9uYW1lLGdlb21f
Y29sdW1uX25hbWUsIGxheWVyLCAmKGxheWVyaW5mby0+cXVlcnlfcmVzdWx0KSwgcmVjdCxx
dWVyeV9zdHIsIHVyaWRfbmFtZSx1c2VyX3NyaWQpOw0KCWlmIChzZXRfdXBfcmVzdWx0ICE9
IE1TX1NVQ0NFU1MpDQoJCXJldHVybiBzZXRfdXBfcmVzdWx0OyAvL3JlbGF5IGVycm9yDQoJ
bGF5ZXJpbmZvLT5zcWwgPSBxdWVyeV9zdHI7DQoNCg0KICAgIGxheWVyaW5mby0+cXVlcnlf
cmVzdWx0ID0gUFFleGVjKGxheWVyaW5mby0+Y29ubiwgIkZFVENIIEFMTCBpbiBteWN1cnNv
ciIpOw0KICAgIGlmICghKGxheWVyaW5mby0+cXVlcnlfcmVzdWx0KSB8fCBQUXJlc3VsdFN0
YXR1cyhsYXllcmluZm8tPnF1ZXJ5X3Jlc3VsdCkgIT0gIFBHUkVTX1RVUExFU19PSykNCiAg
ICB7DQoJCWNoYXIgdG1wWzQwMDBdOw0KDQoJCXNwcmludGYodG1wLCAiRXJyb3IgZXhlY3V0
aW5nIFBPU1RHSVMgIFNRTCAgIHN0YXRlbWVudCAoaW4gRkVUQ0ggQUxMKTogJXMiLCBsYXll
cmluZm8tPnNxbCk7DQogICAgICAgIAltc1NldEVycm9yKE1TX1FVRVJZRVJSLCB0bXAsDQog
ICAgICAgICAgICAgICAgICJtc1BPU1RHSVNMYXllcldoaWNoU2hhcGVzKCkiKTsNCg0KICAg
ICAgICAJUFFjbGVhcihsYXllcmluZm8tPnF1ZXJ5X3Jlc3VsdCk7DQoJICAJbGF5ZXJpbmZv
LT5xdWVyeV9yZXN1bHQgPSBOVUxMOw0KCQlyZXR1cm4oTVNfRkFJTFVSRSk7DQogICAgfQ0K
DQoJbGF5ZXJpbmZvLT5yb3dfbnVtID0wOw0KDQoNCiAgICByZXR1cm4oTVNfU1VDQ0VTUyk7
DQp9DQoNCi8vIENsb3NlIHRoZSBwb3N0Z2lzIHJlY29yZCBzZXQgYW5kIGNvbm5lY3Rpb24N
CmludCBtc1BPU1RHSVNMYXllckNsb3NlKGxheWVyT2JqICpsYXllcikNCnsNCgltc1BPU1RH
SVNMYXllckluZm8JKmxheWVyaW5mbzsNCg0KLy9mcHJpbnRmKHN0ZGVyciwibXNQT1NUR0lT
TGF5ZXJDbG9zZSBjYWxsZWRcbiIpOw0KCWxheWVyaW5mbyA9IChtc1BPU1RHSVNMYXllcklu
Zm8gKikgbGF5ZXItPnBvc3RnaXNsYXllcmluZm87DQoNCg0KCWlmIChsYXllcmluZm8gIT0g
TlVMTCkNCgl7DQoJCQlQUWNsZWFyKGxheWVyaW5mby0+cXVlcnlfcmVzdWx0KTsNCgkJCWxh
eWVyaW5mby0+cXVlcnlfcmVzdWx0ID0gTlVMTDsNCg0KCQkJUFFmaW5pc2gobGF5ZXJpbmZv
LT5jb25uKTsNCgkJCWxheWVyaW5mby0+Y29ubiA9IE5VTEw7DQoNCgkJZnJlZShsYXllcmlu
Zm8pOw0KCQlsYXllci0+cG9zdGdpc2xheWVyaW5mbyA9IE5VTEw7DQoJfQ0KDQoJcmV0dXJu
KE1TX1NVQ0NFU1MpOw0KfQ0KDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioqKioqKioqKioNCi8vIHdrYiBpcyBhc3N1bWVkIHRvIGJlIDJkIChm
b3JjZV8yZCkNCi8vIGFuZCB3a2IgaXMgYSBHRU9NRVRSWUNPTExFQ1RJT04gKGZvcmNlX2Nv
bGxlY3Rpb24pDQovLyBhbmQgd2tiIGlzIGluIHRoZSBlbmRpYW4gb2YgdGhpcyBjb21wdXRl
ciAoYXNiaW5hcnkoLi4uLCdbWE5dRFInKSkNCi8vIGVhY2ggb2YgdGhlIHN1Yi1nZW9tIGlu
c2lkZSB0aGUgY29sbGVjdGlvbiBhcmUgcG9pbnQsbGluZXN0cmluZywgb3IgcG9seWdvbg0K
Ly8NCi8vIGFsc28sIGludCBpcyAzMmJpdHMgbG9uZw0KLy8gICAgICAgZG91YmxlIGlzIDY0
Yml0cyBsb25nDQovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq
KioqKioqKioqKioqKioNCg0KDQovLyBjb252ZXJ0IHRoZSB3a2IgaW50byBwb2ludHMNCi8v
CXBvaW50cyAtPiBwYXNzIHRocm91Z2gNCi8vCWxpbmVzLT4gICBjb25zdGl0dWVudCBwb2lu
dHMNCi8vCXBvbHlzLT4gICB0cmVhdCByaW5nIGxpa2UgbGluZSBhbmQgcHVsbCBvdXQgdGhl
IGNvbnNpdHVlbnQgcG9pbnRzDQoNCmludAlmb3JjZV90b19wb2ludHMoY2hhcgkqd2tiLCBz
aGFwZU9iaiAqc2hhcGUpDQp7DQoJLy93ZSdyZSBnb2luZyB0byBtYWtlIGEgJ2xpbmUnIGZv
ciBlYWNoIGVudGl0eSAocG9pbnQsIGxpbmUgb3IgcmluZykgaW4gdGhlIGdlb20gY29sbGVj
dGlvbg0KDQoJaW50IG9mZnNldCA9MCxwdF9vZmZzZXQ7DQoJaW50IG5nZW9tcyA7DQoJaW50
CXQsdSx2Ow0KCWludAl0eXBlLG5yaW5ncyxucG9pbnRzOw0KCWxpbmVPYmoJbGluZT17MCxO
VUxMfTsNCg0KCXNoYXBlLT50eXBlID0gTVNfU0hBUEVfTlVMTDsgIC8vbm90aGluZyBpbiBp
dA0KDQoJbWVtY3B5KCAmbmdlb21zLCAmd2tiWzVdLCA0KTsNCglvZmZzZXQgPSA5OyAgLy93
ZXJlIHRoZSBmaXJzdCBnZW9tZXRyeSBpcw0KCWZvciAodD0wOyB0PG5nZW9tczsgdCsrKQ0K
CXsNCgkJbWVtY3B5KCAmdHlwZSwgJndrYltvZmZzZXQrMV0sIDQpOyAgLy8gdHlwZSBvZiB0
aGlzIGdlb21ldHJ5DQoNCgkJaWYgKHR5cGUgPT0xKQkvL1BPSU5UDQoJCXsNCgkJCXNoYXBl
LT50eXBlID0gTVNfU0hBUEVfUE9JTlQ7DQoJCQlsaW5lLm51bXBvaW50cyA9IDE7DQoJCQls
aW5lLnBvaW50ID0gKHBvaW50T2JqICopIG1hbGxvYyAoc2l6ZW9mKHBvaW50T2JqKSk7DQoN
CgkJCQltZW1jcHkoICZsaW5lLnBvaW50WzBdLnggLCAmd2tiW29mZnNldCs1ICBdLCA4KTsN
CgkJCQltZW1jcHkoICZsaW5lLnBvaW50WzBdLnkgLCAmd2tiW29mZnNldCs1KzhdLCA4KTsN
CgkJCW9mZnNldCArPSA1KzE2Ow0KCQkJbXNBZGRMaW5lKHNoYXBlLCZsaW5lKTsNCgkJCWZy
ZWUobGluZS5wb2ludCk7DQoJCX0NCg0KCQlpZiAodHlwZSA9PSAyKSAvL2xpbmVzdHJpbmcN
CgkJew0KCQkJc2hhcGUtPnR5cGUgPSBNU19TSEFQRV9QT0lOVDsNCgkJCW1lbWNweSgmbGlu
ZS5udW1wb2ludHMsICZ3a2Jbb2Zmc2V0KzVdLDQpOyAvL251bSBwb2ludHMNCgkJCWxpbmUu
cG9pbnQgPSAocG9pbnRPYmogKikgbWFsbG9jIChzaXplb2YocG9pbnRPYmopKiBsaW5lLm51
bXBvaW50cyApOyAvL3BvaW50IHN0cnVjdA0KCQkJZm9yKHU9MDt1PGxpbmUubnVtcG9pbnRz
IDsgdSsrKQ0KCQkJew0KCQkJCW1lbWNweSggJmxpbmUucG9pbnRbdV0ueCAsICZ3a2Jbb2Zm
c2V0KzkgKyAoMTYgKiB1KV0sIDgpOw0KCQkJCW1lbWNweSggJmxpbmUucG9pbnRbdV0ueSAs
ICZ3a2Jbb2Zmc2V0KzkgKyAoMTYgKiB1KSs4XSwgOCk7DQoJCQl9DQoJCQlvZmZzZXQgKz0g
OSArKDE2KSpsaW5lLm51bXBvaW50czsgIC8vbGVuZ3RoIG9mIG9iamVjdA0KCQkJbXNBZGRM
aW5lKHNoYXBlLCZsaW5lKTsNCgkJCWZyZWUobGluZS5wb2ludCk7DQoJCX0NCgkJaWYgKHR5
cGUgPT0gMykgLy9wb2x5Z29uDQoJCXsNCgkJCXNoYXBlLT50eXBlID0gTVNfU0hBUEVfUE9J
TlQ7DQoJCQltZW1jcHkoJm5yaW5ncywgJndrYltvZmZzZXQrNV0sNCk7IC8vbnVtIHJpbmdz
DQoJCQkvL2FkZCBhIGxpbmUgZm9yIGVhY2ggcG9seWdvbiByaW5nDQoJCQlwdF9vZmZzZXQg
PSAwOw0KCQkJb2Zmc2V0ICs9IDk7IC8vbm93IHBvaW50cyBhdCAxc3QgbGluZWFyIHJpbmcN
CgkJCWZvciAodT0wO3U8bnJpbmdzO3UrKykJLy9mb3IgZWFjaCByaW5nLCBtYWtlIGEgbGlu
ZQ0KCQkJew0KCQkJCW1lbWNweSgmbnBvaW50cywgJndrYltvZmZzZXRdLDQpOyAvL251bSBw
b2ludHMNCgkJCQlsaW5lLm51bXBvaW50cyA9IG5wb2ludHM7DQoJCQkJbGluZS5wb2ludCA9
IChwb2ludE9iaiAqKSBtYWxsb2MgKHNpemVvZihwb2ludE9iaikqIG5wb2ludHMpOyAvL3Bv
aW50IHN0cnVjdA0KCQkJCWZvcih2PTA7djxucG9pbnRzO3YrKykNCgkJCQl7DQoJCQkJCW1l
bWNweSggJmxpbmUucG9pbnRbdl0ueCAsICZ3a2Jbb2Zmc2V0KzQgKyAoMTYgKiB2KV0sIDgp
Ow0KCQkJCQltZW1jcHkoICZsaW5lLnBvaW50W3ZdLnkgLCAmd2tiW29mZnNldCs0ICsgKDE2
ICogdikrOF0sIDgpOw0KCQkJCX0NCgkJCQkvL21ha2Ugb2Zmc2V0IHBvaW50IHRvIG5leHQg
bGluZWFyIHJpbmcNCgkJCQltc0FkZExpbmUoc2hhcGUsJmxpbmUpOw0KCQkJCWZyZWUobGlu
ZS5wb2ludCk7DQoJCQkJb2Zmc2V0ICs9IDQrICgxNikqbnBvaW50czsNCgkJCX0NCgkJfQ0K
CX0NCg0KCXJldHVybihNU19TVUNDRVNTKTsNCn0NCg0KLy9jb252ZXJ0IHRoZSB3a2IgaW50
byBsaW5lcw0KLy8gIHBvaW50cy0+IHJlbW92ZQ0KLy8gIGxpbmVzIC0+IHBhc3MgdGhyb3Vn
aA0KLy8gIHBvbHlzIC0+IHRyZWF0IHJpbmdzIGFzIGxpbmVzDQoNCmludAlmb3JjZV90b19s
aW5lcyhjaGFyCSp3a2IsIHNoYXBlT2JqICpzaGFwZSkNCnsNCglpbnQgb2Zmc2V0ID0wLHB0
X29mZnNldDsNCglpbnQgbmdlb21zIDsNCglpbnQJdCx1LHY7DQoJaW50CXR5cGUsbnJpbmdz
LG5wb2ludHM7DQoJbGluZU9iaglsaW5lPXswLE5VTEx9Ow0KDQoNCglzaGFwZS0+dHlwZSA9
IE1TX1NIQVBFX05VTEw7ICAvL25vdGhpbmcgaW4gaXQNCg0KCW1lbWNweSggJm5nZW9tcywg
JndrYls1XSwgNCk7DQoJb2Zmc2V0ID0gOTsgIC8vd2VyZSB0aGUgZmlyc3QgZ2VvbWV0cnkg
aXMNCglmb3IgKHQ9MDsgdDxuZ2VvbXM7IHQrKykNCgl7DQoJCW1lbWNweSggJnR5cGUsICZ3
a2Jbb2Zmc2V0KzFdLCA0KTsgIC8vIHR5cGUgb2YgdGhpcyBnZW9tZXRyeQ0KDQoJCS8vY2Fu
bm90IGRvIGFueXRoaW5nIHdpdGggYSBwb2ludA0KDQoJCWlmICh0eXBlID09IDIpIC8vbGlu
ZXN0cmluZw0KCQl7DQoJCQlzaGFwZS0+dHlwZSA9IE1TX1NIQVBFX0xJTkU7DQoJCQltZW1j
cHkoJmxpbmUubnVtcG9pbnRzLCAmd2tiW29mZnNldCs1XSw0KTsgLy9udW0gcG9pbnRzDQoJ
CQlsaW5lLnBvaW50ID0gKHBvaW50T2JqICopIG1hbGxvYyAoc2l6ZW9mKHBvaW50T2JqKSog
bGluZS5udW1wb2ludHMgKTsgLy9wb2ludCBzdHJ1Y3QNCgkJCWZvcih1PTA7dTxsaW5lLm51
bXBvaW50cyA7IHUrKykNCgkJCXsNCgkJCQltZW1jcHkoICZsaW5lLnBvaW50W3VdLnggLCAm
d2tiW29mZnNldCs5ICsgKDE2ICogdSldLCA4KTsNCgkJCQltZW1jcHkoICZsaW5lLnBvaW50
W3VdLnkgLCAmd2tiW29mZnNldCs5ICsgKDE2ICogdSkrOF0sIDgpOw0KCQkJfQ0KCQkJb2Zm
c2V0ICs9IDkgKygxNikqbGluZS5udW1wb2ludHM7ICAvL2xlbmd0aCBvZiBvYmplY3QNCgkJ
CW1zQWRkTGluZShzaGFwZSwmbGluZSk7DQoJCQlmcmVlKGxpbmUucG9pbnQpOw0KCQl9DQoJ
CWlmICh0eXBlID09IDMpIC8vcG9seWdvbg0KCQl7DQoJCQlzaGFwZS0+dHlwZSA9IE1TX1NI
QVBFX0xJTkU7DQoJCQltZW1jcHkoJm5yaW5ncywgJndrYltvZmZzZXQrNV0sNCk7IC8vbnVt
IHJpbmdzDQoJCQkvL2FkZCBhIGxpbmUgZm9yIGVhY2ggcG9seWdvbiByaW5nDQoJCQlwdF9v
ZmZzZXQgPSAwOw0KCQkJb2Zmc2V0ICs9IDk7IC8vbm93IHBvaW50cyBhdCAxc3QgbGluZWFy
IHJpbmcNCgkJCWZvciAodT0wO3U8bnJpbmdzO3UrKykJLy9mb3IgZWFjaCByaW5nLCBtYWtl
IGEgbGluZQ0KCQkJew0KCQkJCW1lbWNweSgmbnBvaW50cywgJndrYltvZmZzZXRdLDQpOyAv
L251bSBwb2ludHMNCgkJCQlsaW5lLm51bXBvaW50cyA9IG5wb2ludHM7DQoJCQkJbGluZS5w
b2ludCA9IChwb2ludE9iaiAqKSBtYWxsb2MgKHNpemVvZihwb2ludE9iaikqIG5wb2ludHMp
OyAvL3BvaW50IHN0cnVjdA0KCQkJCWZvcih2PTA7djxucG9pbnRzO3YrKykNCgkJCQl7DQoJ
CQkJCW1lbWNweSggJmxpbmUucG9pbnRbdl0ueCAsICZ3a2Jbb2Zmc2V0KzQgKyAoMTYgKiB2
KV0sIDgpOw0KCQkJCQltZW1jcHkoICZsaW5lLnBvaW50W3ZdLnkgLCAmd2tiW29mZnNldCs0
ICsgKDE2ICogdikrOF0sIDgpOw0KCQkJCX0NCgkJCQkvL21ha2Ugb2Zmc2V0IHBvaW50IHRv
IG5leHQgbGluZWFyIHJpbmcNCgkJCQltc0FkZExpbmUoc2hhcGUsJmxpbmUpOw0KCQkJCWZy
ZWUobGluZS5wb2ludCk7DQoJCQkJb2Zmc2V0ICs9IDQrICgxNikqbnBvaW50czsNCgkJCX0N
CgkJfQ0KCX0NCglyZXR1cm4oTVNfU1VDQ0VTUyk7DQp9DQoNCi8vIHBvaW50ICAgLT4gcmVq
ZWN0DQovLyBsaW5lICAgIC0+IHJlamVjdA0KLy8gcG9seWdvbiAtPiBsaW5lcyBvZiBsaW5l
YXIgcmluZ3MNCmludAlmb3JjZV90b19wb2x5Z29ucyhjaGFyCSp3a2IsIHNoYXBlT2JqICpz
aGFwZSkNCnsNCg0KCWludCBvZmZzZXQgPTAscHRfb2Zmc2V0Ow0KCWludCBuZ2VvbXMgOw0K
CWludAl0LHUsdjsNCglpbnQJdHlwZSxucmluZ3MsbnBvaW50czsNCglsaW5lT2JqCWxpbmU9
ezAsTlVMTH07DQoNCg0KCXNoYXBlLT50eXBlID0gTVNfU0hBUEVfTlVMTDsgIC8vbm90aGlu
ZyBpbiBpdA0KDQoJbWVtY3B5KCAmbmdlb21zLCAmd2tiWzVdLCA0KTsNCglvZmZzZXQgPSA5
OyAgLy93ZXJlIHRoZSBmaXJzdCBnZW9tZXRyeSBpcw0KCWZvciAodD0wOyB0PG5nZW9tczsg
dCsrKQ0KCXsNCgkJbWVtY3B5KCAmdHlwZSwgJndrYltvZmZzZXQrMV0sIDQpOyAgLy8gdHlw
ZSBvZiB0aGlzIGdlb21ldHJ5DQoNCgkJaWYgKHR5cGUgPT0gMykgLy9wb2x5Z29uDQoJCXsN
CgkJCXNoYXBlLT50eXBlID0gTVNfU0hBUEVfUE9MWUdPTjsNCgkJCW1lbWNweSgmbnJpbmdz
LCAmd2tiW29mZnNldCs1XSw0KTsgLy9udW0gcmluZ3MNCgkJCS8vYWRkIGEgbGluZSBmb3Ig
ZWFjaCBwb2x5Z29uIHJpbmcNCgkJCXB0X29mZnNldCA9IDA7DQoJCQlvZmZzZXQgKz0gOTsg
Ly9ub3cgcG9pbnRzIGF0IDFzdCBsaW5lYXIgcmluZw0KCQkJZm9yICh1PTA7dTxucmluZ3M7
dSsrKQkvL2ZvciBlYWNoIHJpbmcsIG1ha2UgYSBsaW5lDQoJCQl7DQoJCQkJbWVtY3B5KCZu
cG9pbnRzLCAmd2tiW29mZnNldF0sNCk7IC8vbnVtIHBvaW50cw0KCQkJCWxpbmUubnVtcG9p
bnRzID0gbnBvaW50czsNCgkJCQlsaW5lLnBvaW50ID0gKHBvaW50T2JqICopIG1hbGxvYyAo
c2l6ZW9mKHBvaW50T2JqKSogbnBvaW50cyk7IC8vcG9pbnQgc3RydWN0DQoJCQkJZm9yKHY9
MDt2PG5wb2ludHM7disrKQ0KCQkJCXsNCgkJCQkJbWVtY3B5KCAmbGluZS5wb2ludFt2XS54
ICwgJndrYltvZmZzZXQrNCArICgxNiAqIHYpXSwgOCk7DQoJCQkJCW1lbWNweSggJmxpbmUu
cG9pbnRbdl0ueSAsICZ3a2Jbb2Zmc2V0KzQgKyAoMTYgKiB2KSs4XSwgOCk7DQoJCQkJfQ0K
CQkJCS8vbWFrZSBvZmZzZXQgcG9pbnQgdG8gbmV4dCBsaW5lYXIgcmluZw0KCQkJCW1zQWRk
TGluZShzaGFwZSwmbGluZSk7DQoJCQkJZnJlZShsaW5lLnBvaW50KTsNCgkJCQlvZmZzZXQg
Kz0gNCsgKDE2KSpucG9pbnRzOw0KCQkJfQ0KCQl9DQoJfQ0KCXJldHVybihNU19TVUNDRVNT
KTsNCn0NCg0KLy8gaWYgdGhlcmUgaXMgYW55IHBvbHlnb24gaW4gd2tiLCByZXR1cm4gZm9y
Y2VfcG9seWdvbg0KLy8gaWYgdGhlcmUgaXMgYW55IGxpbmUgaW4gd2tiLCByZXR1cm4gZm9y
Y2VfbGluZQ0KLy8gb3RoZXJ3aXNlIHJldHVybiBmb3JjZV9wb2ludA0KDQppbnQJZG9udF9m
b3JjZShjaGFyCSp3a2IsIHNoYXBlT2JqICpzaGFwZSkNCnsNCglpbnQgb2Zmc2V0ID0wOw0K
CWludCBuZ2VvbXMgOw0KCWludAl0eXBlLHQ7DQoJaW50CQliZXN0X3R5cGU7DQoNCi8vcHJp
bnRmKCJkb250IGZvcmNlIik7DQoNCgliZXN0X3R5cGUgPSBNU19TSEFQRV9OVUxMOyAgLy9u
b3RoaW5nIGluIGl0DQoNCgltZW1jcHkoICZuZ2VvbXMsICZ3a2JbNV0sIDQpOw0KCW9mZnNl
dCA9IDk7ICAvL3dlcmUgdGhlIGZpcnN0IGdlb21ldHJ5IGlzDQoJZm9yICh0PTA7IHQ8bmdl
b21zOyB0KyspDQoJew0KCQltZW1jcHkoICZ0eXBlLCAmd2tiW29mZnNldCsxXSwgNCk7ICAv
LyB0eXBlIG9mIHRoaXMgZ2VvbWV0cnkNCg0KCQlpZiAodHlwZSA9PSAzKSAvL3BvbHlnb24N
CgkJew0KCQkJYmVzdF90eXBlID0gTVNfU0hBUEVfUE9MWUdPTjsNCgkJfQ0KCQlpZiAoICh0
eXBlID09MikgJiYgKCBiZXN0X3R5cGUgIT0gTVNfU0hBUEVfUE9MWUdPTikgKQ0KCQl7DQoJ
CQliZXN0X3R5cGUgPSBNU19TSEFQRV9MSU5FOw0KCQl9DQoJCWlmICggICAodHlwZT09MSkg
JiYgKGJlc3RfdHlwZSA9PSBNU19TSEFQRV9OVUxMKSApDQoJCXsNCgkJCWJlc3RfdHlwZSA9
IE1TX1NIQVBFX1BPSU5UOw0KCQl9DQoJfQ0KDQoJaWYgKGJlc3RfdHlwZSA9PSBNU19TSEFQ
RV9QT0lOVCkNCgl7DQoJCXJldHVybiBmb3JjZV90b19wb2ludHMod2tiLHNoYXBlKTsNCgl9
DQoJaWYgKGJlc3RfdHlwZSA9PSBNU19TSEFQRV9MSU5FKQ0KCXsNCgkJcmV0dXJuIGZvcmNl
X3RvX2xpbmVzKHdrYixzaGFwZSk7DQoJfQ0KCWlmIChiZXN0X3R5cGUgPT0gTVNfU0hBUEVf
UE9MWUdPTikNCgl7DQoJCXJldHVybiBmb3JjZV90b19wb2x5Z29ucyh3a2Isc2hhcGUpOw0K
CX0NCg0KDQoJcmV0dXJuKE1TX0ZBSUxVUkUpOyAvL3Vua25vd24gdHlwZQ0KfQ0KDQovL2Zp
bmQgdGhlIGJvdW5kcyBvZiB0aGUgc2hhcGUNCnZvaWQgZmluZF9ib3VuZHMoc2hhcGVPYmog
KnNoYXBlKQ0Kew0KCWludCB0LHU7DQoJaW50IGZpcnN0X29uZSA9IDE7DQoNCglmb3IgKHQ9
MDsgdDwgc2hhcGUtPm51bWxpbmVzOyB0KyspDQoJew0KCQlmb3IodT0wO3U8c2hhcGUtPmxp
bmVbdF0ubnVtcG9pbnRzOyB1KyspDQoJCXsNCgkJCWlmIChmaXJzdF9vbmUpDQoJCQl7DQoJ
CQkJc2hhcGUtPmJvdW5kcy5taW54ID0gc2hhcGUtPmxpbmVbdF0ucG9pbnRbdV0ueDsNCgkJ
CQlzaGFwZS0+Ym91bmRzLm1heHggPSBzaGFwZS0+bGluZVt0XS5wb2ludFt1XS54Ow0KDQoJ
CQkJc2hhcGUtPmJvdW5kcy5taW55ID0gc2hhcGUtPmxpbmVbdF0ucG9pbnRbdV0ueTsNCgkJ
CQlzaGFwZS0+Ym91bmRzLm1heHkgPSBzaGFwZS0+bGluZVt0XS5wb2ludFt1XS55Ow0KCQkJ
CWZpcnN0X29uZSA9IDA7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJaWYgKHNoYXBlLT5s
aW5lW3RdLnBvaW50W3VdLnggPCBzaGFwZS0+Ym91bmRzLm1pbngpDQoJCQkJCXNoYXBlLT5i
b3VuZHMubWlueCA9IHNoYXBlLT5saW5lW3RdLnBvaW50W3VdLng7DQoJCQkJaWYgKHNoYXBl
LT5saW5lW3RdLnBvaW50W3VdLnggPiBzaGFwZS0+Ym91bmRzLm1heHgpDQoJCQkJCXNoYXBl
LT5ib3VuZHMubWF4eCA9IHNoYXBlLT5saW5lW3RdLnBvaW50W3VdLng7DQoNCgkJCQlpZiAo
c2hhcGUtPmxpbmVbdF0ucG9pbnRbdV0ueSA8IHNoYXBlLT5ib3VuZHMubWlueSkNCgkJCQkJ
c2hhcGUtPmJvdW5kcy5taW55ID0gc2hhcGUtPmxpbmVbdF0ucG9pbnRbdV0ueTsNCgkJCQlp
ZiAoc2hhcGUtPmxpbmVbdF0ucG9pbnRbdV0ueSA+IHNoYXBlLT5ib3VuZHMubWF4eSkNCgkJ
CQkJc2hhcGUtPmJvdW5kcy5tYXh5ID0gc2hhcGUtPmxpbmVbdF0ucG9pbnRbdV0ueTsNCg0K
CQkJfQ0KCQl9DQoJfQ0KfQ0KDQoNCi8vZmluZCB0aGUgbmV4dCBzaGFwZSB3aXRoIHRoZSBh
cHByb3ByaWF0ZSBzaGFwZSB0eXBlIChjb252ZXJ0IGl0IGlmIG5lY2Vzc2FyeSkNCi8vIGFs
c28sIGxvYWQgaW4gdGhlIGF0dHJpYnV0ZSBkYXRhDQovL01TX0RPTkUgPT4gbm8gbW9yZSBk
YXRhDQoNCmludCBtc1BPU1RHSVNMYXllck5leHRTaGFwZShsYXllck9iaiAqbGF5ZXIsIHNo
YXBlT2JqICpzaGFwZSkNCnsNCglpbnQJcmVzdWx0Ow0KDQoJbXNQT1NUR0lTTGF5ZXJJbmZv
CSpsYXllcmluZm87DQoNCglsYXllcmluZm8gPSAobXNQT1NUR0lTTGF5ZXJJbmZvICopIGxh
eWVyLT5wb3N0Z2lzbGF5ZXJpbmZvOw0KDQoNCi8vZnByaW50ZihzdGRlcnIsIm1zUE9TVEdJ
U0xheWVyTmV4dFNoYXBlIGNhbGxlZFxuIik7DQoNCglpZiAobGF5ZXJpbmZvID09IE5VTEwp
DQoJew0KICAgICAgICAJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIk5leHRTaGFwZSBjYWxs
ZWQgd2l0aCBsYXllcmluZm8gPSBOVUxMIiwNCiAgICAgICAgICAgICAgICAgIm1zUE9TVEdJ
U0xheWVyTmV4dFNoYXBlKCkiKTsNCgkJcmV0dXJuKE1TX0ZBSUxVUkUpOw0KCX0NCg0KDQoJ
cmVzdWx0PSBtc1BPU1RHSVNMYXllckdldFNoYXBlUmFuZG9tKGxheWVyLCBzaGFwZSwgJihs
YXllcmluZm8tPnJvd19udW0pICAgKTsNCgkvLyBnZXRzaGFwZXJhbmRvbSB3aWxsIGluY3Jl
bWVudCB0aGUgcm93X251bQ0KCS8vbGF5ZXJpbmZvLT5yb3dfbnVtICAgKys7DQoNCglyZXR1
cm4gcmVzdWx0Ow0KfQ0KDQoNCg0KLy9Vc2VkIGJ5IE5leHRTaGFwZSgpIHRvIGFjY2VzcyBh
IHNoYXBlIGluIHRoZSBxdWVyeSBzZXQNCi8vIFRPRE86IG9ubHkgZmV0Y2ggMTAwMCByb3dz
IGF0IGEgdGltZS4gIFRoaXMgc2hvdWxkIGNoZWNrIHRvIHNlZSBpZiB0aGUNCi8vICAgICAg
IHJlcXVlc3RlZCBmZWF0dXJlIGlzIGluIHRoZSBzZXQuICBJZiBpdCBpcywgcmV0dXJuIGl0
LCBvdGhlcndpc2UNCi8vIAkgICBncmFiIHRoZSBuZXh0IDEwMDAgcm93cy4NCmludCBtc1BP
U1RHSVNMYXllckdldFNoYXBlUmFuZG9tKGxheWVyT2JqICpsYXllciwgc2hhcGVPYmogKnNo
YXBlLCBsb25nICpyZWNvcmQpDQp7DQoJbXNQT1NUR0lTTGF5ZXJJbmZvCSpsYXllcmluZm87
DQoJY2hhcgkJCQkqd2tiOw0KCWludAkJCQlyZXN1bHQsdCxzaXplOw0KCWNoYXIJCQkJKnRl
bXAsKnRlbXAyOw0KCWxvbmcJCQkJcmVjb3JkX29pZDsNCg0KDQoJbGF5ZXJpbmZvID0gKG1z
UE9TVEdJU0xheWVySW5mbyAqKSBsYXllci0+cG9zdGdpc2xheWVyaW5mbzsNCg0KLy9mcHJp
bnRmKHN0ZGVyciwibXNQT1NUR0lTTGF5ZXJHZXRTaGFwZVJhbmRvbSA6IGNhbGxlZCByb3cg
JWxpXG4iLHJlY29yZCk7DQoNCglpZiAobGF5ZXJpbmZvID09IE5VTEwpDQoJew0KICAgICAg
ICAJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIkdldFNoYXBlIGNhbGxlZCB3aXRoIGxheWVy
aW5mbyA9IE5VTEwiLA0KICAgICAgICAgICAgICAgICAibXNQT1NUR0lTTGF5ZXJHZXRTaGFw
ZSgpIik7DQoJCXJldHVybihNU19GQUlMVVJFKTsNCgl9DQoNCglpZiAobGF5ZXJpbmZvLT5j
b25uID09IE5VTEwpDQoJew0KICAgICAgICAJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIk5l
eHRTaGFwZSBjYWxsZWQgb24gUE9TVEdJUyBsYXllciB3aXRoIG5vIGNvbm5lY3Rpb24gdG8g
REIuIiwNCiAgICAgICAgICAgICAgICAgIm1zUE9TVEdJU0xheWVyR2V0U2hhcGUoKSIpOw0K
CQlyZXR1cm4oTVNfRkFJTFVSRSk7DQoJfQ0KDQoJaWYgKGxheWVyaW5mby0+cXVlcnlfcmVz
dWx0ID09IE5VTEwpDQoJew0KICAgICAgICAJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIkdl
dFNoYXBlIGNhbGxlZCBvbiBQT1NUR0lTIGxheWVyIHdpdGggaW52YWxpZCBEQiBxdWVyeSBy
ZXN1bHRzLiIsDQogICAgICAgICAgICAgICAgICJtc1BPU1RHSVNMYXllckdldFNoYXBlUmFu
ZG9tKCkiKTsNCgkJcmV0dXJuKE1TX0ZBSUxVUkUpOw0KCX0NCglzaGFwZS0+dHlwZSA9IE1T
X1NIQVBFX05VTEw7DQoNCgl3aGlsZShzaGFwZS0+dHlwZSA9PSBNU19TSEFQRV9OVUxMKQ0K
CXsNCg0KCQlpZiAoICAoKnJlY29yZCkgPCBQUW50dXBsZXMobGF5ZXJpbmZvLT5xdWVyeV9y
ZXN1bHQpICkNCgkJew0KCQkJLy9yZXRyZWl2ZSBhbiBpdGVtDQoJCQl3a2IgPSAoY2hhciAq
KSBQUWdldHZhbHVlKGxheWVyaW5mby0+cXVlcnlfcmVzdWx0LCAoKnJlY29yZCksIGxheWVy
LT5udW1pdGVtcyk7DQoJCQlzd2l0Y2gobGF5ZXItPnR5cGUpDQoJCQl7DQoJCQkJY2FzZSBN
U19MQVlFUl9QT0lOVDoNCgkJCQkJcmVzdWx0ID0gZm9yY2VfdG9fcG9pbnRzKHdrYiwgc2hh
cGUpOw0KCQkJCQlicmVhazsNCgkJCQljYXNlIE1TX0xBWUVSX0xJTkU6DQoJCQkJCXJlc3Vs
dCA9IGZvcmNlX3RvX2xpbmVzKHdrYiwgc2hhcGUpOw0KCQkJCQlicmVhazsNCg0KCQkJCWNh
c2UgTVNfTEFZRVJfUE9MWUdPTjoNCgkJCQkJcmVzdWx0ID0gCWZvcmNlX3RvX3BvbHlnb25z
KHdrYiwgc2hhcGUpOw0KCQkJCQlicmVhazsNCgkJCQljYXNlIE1TX0xBWUVSX0FOTk9UQVRJ
T046DQoJCQkJY2FzZSBNU19MQVlFUl9RVUVSWToNCgkJCQkJcmVzdWx0ID0gZG9udF9mb3Jj
ZSh3a2Isc2hhcGUpOw0KCQkJCQlicmVhazsNCgogICAgICAgICAgICAgICAgY2FzZSBNU19M
QVlFUl9SQVNURVI6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bXNEZWJ1ZyggIklnbm9yaW5nIE1TX0xBWUVSX1JBU1RFUiBpbiBtYXBwb3N0Z2lzLmNcbiIg
KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAg
ICAgICAgICAgICAgICBjYXNlIE1TX0xBWUVSX0NJUkNMRToNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBtc0RlYnVnKCAiSWdub3JpbmcgTVNfTEFZRVJfUkFT
VEVSIGluIG1hcHBvc3RnaXMuY1xuIiApOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOw0KCgkJCX0NCgkJCWlmIChzaGFwZS0+dHlwZSAhPSBNU19T
SEFQRV9OVUxMKQ0KCQkJew0KCQkJCS8vaGF2ZSB0byByZXRyZWl2ZSB0aGUgYXR0cmlidXRl
cw0KCQkJICAgICAgICBzaGFwZS0+dmFsdWVzID0gKGNoYXIgKiopIG1hbGxvYyhzaXplb2Yo
Y2hhciAqKSAqIGxheWVyLT5udW1pdGVtcyk7DQoJCQkJZm9yICh0PTA7dDxsYXllci0+bnVt
aXRlbXM7dCsrKQ0KCQkJCXsNCg0KCQkJCQkgdGVtcCA9IChjaGFyICopIFBRZ2V0dmFsdWUo
bGF5ZXJpbmZvLT5xdWVyeV9yZXN1bHQsICgqcmVjb3JkKSwgdCk7DQoJCQkJCSBzaXplID0g
UFFnZXRsZW5ndGgobGF5ZXJpbmZvLT5xdWVyeV9yZXN1bHQsKCpyZWNvcmQpLCB0ICkgOw0K
CQkJCQkgdGVtcDIgPSAoY2hhciAqKSBtYWxsb2Moc2l6ZSsxICk7DQoJCQkJCSBtZW1jcHko
dGVtcDIsIHRlbXAsIHNpemUpOw0KCQkJCQkgdGVtcDJbc2l6ZV0gPSAwOyAvL251bGwgdGVy
bWluYXRlIGl0DQoNCgkJCQkJIHNoYXBlLT52YWx1ZXNbdF0gPSB0ZW1wMjsNCgkJCQl9DQoJ
CQkJdGVtcCA9IChjaGFyICopIFBRZ2V0dmFsdWUobGF5ZXJpbmZvLT5xdWVyeV9yZXN1bHQs
ICgqcmVjb3JkKSwgdCsxKTsgLy8gdCBpcyBXS0IsIHQrMSBpcyBPSUQNCgkJCQlyZWNvcmRf
b2lkID0gc3RydG9sICh0ZW1wLE5VTEwsMTApOw0KDQoJCQkJc2hhcGUtPmluZGV4ID0gcmVj
b3JkX29pZDsNCgkJCQlzaGFwZS0+bnVtdmFsdWVzID0gbGF5ZXItPm51bWl0ZW1zOw0KDQoJ
CQkJZmluZF9ib3VuZHMoc2hhcGUpOw0KCQkJCSgqcmVjb3JkKSsrOyAJCS8vbW92ZSB0byBu
ZXh0IHNoYXBlDQoJCQkJcmV0dXJuIChNU19TVUNDRVNTKTsNCgkJCX0NCgkJCWVsc2UNCgkJ
CXsNCgkJCQkoKnJlY29yZCkrKzsgLy9tb3ZlIHRvIG5leHQgc2hhcGUNCgkJCX0NCgkJfQ0K
CQllbHNlDQoJCXsNCgkJCXJldHVybiAoTVNfRE9ORSk7DQoJCX0NCgl9DQoNCg0KCW1zRnJl
ZVNoYXBlKHNoYXBlKTsNCg0KCXJldHVybihNU19GQUlMVVJFKTsNCn0NCg0KDQovLyBFeGVj
dXRlIGEgcXVlcnkgb24gdGhlIERCIGJhc2VkIG9uIHJlY29yZCBiZWluZyBhbiBPSUQuDQoN
CmludCBtc1BPU1RHSVNMYXllckdldFNoYXBlKGxheWVyT2JqICpsYXllciwgc2hhcGVPYmog
KnNoYXBlLCBsb25nIHJlY29yZCkNCnsNCg0KCWNoYXIJKnF1ZXJ5X3N0cjsNCgljaGFyCXRh
YmxlX25hbWVbNTAwMF07DQoJY2hhcglnZW9tX2NvbHVtbl9uYW1lWzUwMDBdOw0KCWNoYXIJ
dXJpZF9uYW1lWzUwMDBdOw0KCWNoYXIJdXNlcl9zcmlkWzUwMDBdOw0KCS8vaW50CW5pdGVt
czsNCgljaGFyCWNvbHVtbnNfd2FudGVkWzUwMDBdOw0KCWNoYXIJdGVtcFs1MDAwXTsNCg0K
DQoJUEdyZXN1bHQgICAqcXVlcnlfcmVzdWx0Ow0KCW1zUE9TVEdJU0xheWVySW5mbwkqbGF5
ZXJpbmZvOw0KCWNoYXIJCQkJKndrYjsNCglpbnQJCQkJcmVzdWx0LHQsc2l6ZTsNCgljaGFy
CQkJCSp0ZW1wMSwqdGVtcDI7DQoNCi8vZnByaW50ZihzdGRlcnIsIm1zUE9TVEdJU0xheWVy
R2V0U2hhcGUgY2FsbGVkIGZvciByZWNvcmQgPSAlaVxuIixyZWNvcmQpOw0KDQoJbGF5ZXJp
bmZvID0gKG1zUE9TVEdJU0xheWVySW5mbyAqKSBsYXllci0+cG9zdGdpc2xheWVyaW5mbzsN
CglpZiAobGF5ZXJpbmZvID09IE5VTEwpDQoJew0KCQkvL2xheWVyIG5vdCBvcGVuZWQgeWV0
DQoJCW1zU2V0RXJyb3IoTVNfUVVFUllFUlIsICJtc1BPU1RHSVNMYXllckdldFNoYXBlIGNh
bGxlZCBvbiB1bm9wZW5lZCBsYXllciAobGF5ZXJpbmZvID0gTlVMTCkiLA0KICAgICAgICAg
ICAgICAgICAibXNQT1NUR0lTTGF5ZXJHZXRTaGFwZSgpIik7DQoJCXJldHVybihNU19GQUlM
VVJFKTsNCgl9DQoNCglxdWVyeV9zdHIgPSAoY2hhciAqKSBtYWxsb2MoNjAwMCk7IC8vc2hv
dWxkIGJlIGJpZyBlbm91Z2gNCgltZW1zZXQocXVlcnlfc3RyLDAsNjAwMCk7CQkvL3plcm8g
aXQgb3V0DQoNCgltc1BPU1RHSVNMYXllclBhcnNlRGF0YShsYXllci0+ZGF0YSwgZ2VvbV9j
b2x1bW5fbmFtZSwgdGFibGVfbmFtZSwgdXJpZF9uYW1lLHVzZXJfc3JpZCk7DQoNCglpZiAo
bGF5ZXItPm51bWl0ZW1zID09MCkgLy9kb250IG5lZWQgdGhlIG9pZCBzaW5jZSBpdHMgcmVh
bGx5IHJlY29yZA0KCXsNCgkJaWYgKGdCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4pDQoJ
CQlzcHJpbnRmKGNvbHVtbnNfd2FudGVkLCJhc2JpbmFyeShmb3JjZV9jb2xsZWN0aW9uKGZv
cmNlXzJkKCVzKSksJ05EUicpIiwgZ2VvbV9jb2x1bW5fbmFtZSk7DQoJCWVsc2UNCgkJCXNw
cmludGYoY29sdW1uc193YW50ZWQsImFzYmluYXJ5KGZvcmNlX2NvbGxlY3Rpb24oZm9yY2Vf
MmQoJXMpKSwnWERSJykiLCBnZW9tX2NvbHVtbl9uYW1lKTsNCgl9DQoJZWxzZQ0KCXsNCgkJ
Y29sdW1uc193YW50ZWRbMF0gPSAwOyAvL2xlbj0wDQoJCWZvciAodD0wO3Q8bGF5ZXItPm51
bWl0ZW1zOyB0KyspDQoJCXsNCgkJCXNwcmludGYodGVtcCwiJXM6OnRleHQsIixsYXllci0+
aXRlbXNbdF0pOw0KCQkJc3RyY2F0KGNvbHVtbnNfd2FudGVkLHRlbXApOw0KCQl9DQoJCWlm
IChnQllURV9PUkRFUiA9PSBMSVRUTEVfRU5ESUFOKQ0KCQkJc3ByaW50Zih0ZW1wLCJhc2Jp
bmFyeShmb3JjZV9jb2xsZWN0aW9uKGZvcmNlXzJkKCVzKSksJ05EUicpIiwgZ2VvbV9jb2x1
bW5fbmFtZSk7DQoJCWVsc2UNCgkJCXNwcmludGYodGVtcCwiYXNiaW5hcnkoZm9yY2VfY29s
bGVjdGlvbihmb3JjZV8yZCglcykpLCdYRFInKSIsIGdlb21fY29sdW1uX25hbWUpOw0KDQoJ
CXN0cmNhdChjb2x1bW5zX3dhbnRlZCx0ZW1wKTsNCgl9DQoNCg0KDQoJCXNwcmludGYocXVl
cnlfc3RyLCJERUNMQVJFIG15Y3Vyc29yIEJJTkFSWSBDVVJTT1IgRk9SIFNFTEVDVCAlcyBm
cm9tICVzIFdIRVJFICVzID0gJWxpIiwgY29sdW1uc193YW50ZWQsdGFibGVfbmFtZSx1cmlk
X25hbWUscmVjb3JkKTsNCg0KDQovL2ZwcmludGYoc3RkZXJyLCJtc1BPU1RHSVNMYXllckdl
dFNoYXBlOiAlcyBcbiIscXVlcnlfc3RyKTsNCg0KICAgIHF1ZXJ5X3Jlc3VsdCA9IFBRZXhl
YyhsYXllcmluZm8tPmNvbm4sICJCRUdJTiIpOw0KICAgIGlmICghKHF1ZXJ5X3Jlc3VsdCkg
fHwgUFFyZXN1bHRTdGF0dXMocXVlcnlfcmVzdWx0KSAhPSBQR1JFU19DT01NQU5EX09LKQ0K
ICAgIHsNCgkgICAgICBtc1NldEVycm9yKE1TX1FVRVJZRVJSLCAiRXJyb3IgZXhlY3V0aW5n
IFBPU1RHSVMgIEJFR0lOICAgc3RhdGVtZW50LiIsDQogICAgICAgICAgICAgICAgICJtc1BP
U1RHSVNMYXllckdldFNoYXBlKCkiKTsNCg0KICAgICAgICAJUFFjbGVhcihxdWVyeV9yZXN1
bHQpOw0KCSAgCXF1ZXJ5X3Jlc3VsdCA9IE5VTEw7DQoJCXJldHVybihNU19GQUlMVVJFKTsN
CiAgICB9DQoNCiAgICBxdWVyeV9yZXN1bHQgPSBQUWV4ZWMobGF5ZXJpbmZvLT5jb25uLCAi
c2V0IGVuYWJsZV9zZXFzY2FuID0gb2ZmIik7DQogICAgaWYgKCEocXVlcnlfcmVzdWx0KSB8
fCBQUXJlc3VsdFN0YXR1cyhxdWVyeV9yZXN1bHQpICE9IFBHUkVTX0NPTU1BTkRfT0spDQog
ICAgew0KCSAgICAgIG1zU2V0RXJyb3IoTVNfUVVFUllFUlIsICJFcnJvciBleGVjdXRpbmcg
UE9TVEdJUyAgJ3NldCBlbmFibGVfc2Vxc2NhbiBvZmYnICAgc3RhdGVtZW50LiIsDQogICAg
ICAgICAgICAgICAgICJtc1BPU1RHSVNMYXllckdldFNoYXBlKCkiKTsNCg0KICAgICAgICAJ
UFFjbGVhcihxdWVyeV9yZXN1bHQpOw0KCSAgCXF1ZXJ5X3Jlc3VsdCA9IE5VTEw7DQoJCXJl
dHVybihNU19GQUlMVVJFKTsNCiAgICB9DQoNCg0KICAgIFBRY2xlYXIocXVlcnlfcmVzdWx0
KTsNCg0KICAgIHF1ZXJ5X3Jlc3VsdCA9IFBRZXhlYyhsYXllcmluZm8tPmNvbm4sIHF1ZXJ5
X3N0ciApOw0KDQogICAgaWYgKCEocXVlcnlfcmVzdWx0KSB8fCBQUXJlc3VsdFN0YXR1cyhx
dWVyeV9yZXN1bHQpICE9IFBHUkVTX0NPTU1BTkRfT0spDQogICAgew0KCQljaGFyIHRtcFs0
MDAwXTsNCg0KCQlzcHJpbnRmKHRtcCwgIkVycm9yIGV4ZWN1dGluZyBQT1NUR0lTICBTUUwg
ICBzdGF0ZW1lbnQ6ICVzIiwgcXVlcnlfc3RyKTsNCiAgICAgICAgCW1zU2V0RXJyb3IoTVNf
UVVFUllFUlIsIHRtcCwNCiAgICAgICAgICAgICAgICAgIm1zUE9TVEdJU0xheWVyR2V0U2hh
cGUoKSIpOw0KDQogICAgICAgIAlQUWNsZWFyKHF1ZXJ5X3Jlc3VsdCk7DQoJICAJcXVlcnlf
cmVzdWx0ID0gTlVMTDsNCgkJcmV0dXJuKE1TX0ZBSUxVUkUpOw0KDQogICAgfQ0KICAgIFBR
Y2xlYXIocXVlcnlfcmVzdWx0KTsNCg0KICAgIHF1ZXJ5X3Jlc3VsdCA9IFBRZXhlYyhsYXll
cmluZm8tPmNvbm4sICJGRVRDSCBBTEwgaW4gbXljdXJzb3IiKTsNCiAgICBpZiAoIShxdWVy
eV9yZXN1bHQpIHx8IFBRcmVzdWx0U3RhdHVzKHF1ZXJ5X3Jlc3VsdCkgIT0gIFBHUkVTX1RV
UExFU19PSykNCiAgICB7DQoJCWNoYXIgdG1wWzQwMDBdOw0KDQoJCXNwcmludGYodG1wLCAi
RXJyb3IgZXhlY3V0aW5nIFBPU1RHSVMgIFNRTCAgIHN0YXRlbWVudCAoaW4gRkVUQ0ggQUxM
KTogJXMgPGJyPjxicj5cblxuTW9yZSBIZWxwOiIsIHF1ZXJ5X3N0cik7DQogICAgICAgIAlt
c1NldEVycm9yKE1TX1FVRVJZRVJSLCB0bXAsDQogICAgICAgICAgICAgICAgICJtc1BPU1RH
SVNMYXllcldoaWNoU2hhcGVzKCkiKTsNCg0KICAgICAgICAJUFFjbGVhcihxdWVyeV9yZXN1
bHQpOw0KCSAgCXF1ZXJ5X3Jlc3VsdCA9IE5VTEw7DQoJCXJldHVybihNU19GQUlMVVJFKTsN
CiAgICB9DQoNCgkJCS8vcXVlcnkgaGFzIGJlZW4gZG9uZSwgc28gd2UgY2FuIHJldHJlaXZl
IHRoZSByZXN1bHRzDQoNCg0KICAgIAlzaGFwZS0+dHlwZSA9IE1TX1NIQVBFX05VTEw7DQoN
CgkJaWYgKCAgMCA8IFBRbnR1cGxlcyhxdWVyeV9yZXN1bHQpICkgIC8vb25seSBuZWVkIHRv
IGdldCBvbmUgc2hhcGUNCgkJew0KCQkJLy9yZXRyZWl2ZSBhbiBpdGVtDQoJCQl3a2IgPSAo
Y2hhciAqKSBQUWdldHZhbHVlKHF1ZXJ5X3Jlc3VsdCwgMCwgbGF5ZXItPm51bWl0ZW1zKTsg
IC8vIGxheWVyLT5udW1pdGVtcyBpcyB0aGUgd2t0IGNvbHVtbg0KCQkJc3dpdGNoKGxheWVy
LT50eXBlKQ0KCQkJew0KCQkJCWNhc2UgTVNfTEFZRVJfUE9JTlQ6DQoJCQkJCXJlc3VsdCA9
IGZvcmNlX3RvX3BvaW50cyh3a2IsIHNoYXBlKTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSBN
U19MQVlFUl9MSU5FOg0KCQkJCQlyZXN1bHQgPSBmb3JjZV90b19saW5lcyh3a2IsIHNoYXBl
KTsNCgkJCQkJYnJlYWs7DQoJCQkJY2FzZSBNU19MQVlFUl9QT0xZR09OOg0KCQkJCQlyZXN1
bHQgPSAJZm9yY2VfdG9fcG9seWdvbnMod2tiLCBzaGFwZSk7DQoJCQkJCWJyZWFrOw0KCQkJ
CWNhc2UgTVNfTEFZRVJfQU5OT1RBVElPTjoNCgkJCQljYXNlIE1TX0xBWUVSX1FVRVJZOg0K
CQkJCQlyZXN1bHQgPSBkb250X2ZvcmNlKHdrYixzaGFwZSk7DQoJCQkJCWJyZWFrOw0KICAg
ICAgICAgICAgICAgIGNhc2UgTVNfTEFZRVJfUkFTVEVSOg0KICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1zRGVidWcoICJJZ25vcmluZyBNU19MQVlFUl9SQVNU
RVIgaW4gbWFwcG9zdGdpcy5jXG4iICk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSBNU19MQVlFUl9DSVJD
TEU6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNEZWJ1Zygg
Iklnbm9yaW5nIE1TX0xBWUVSX1JBU1RFUiBpbiBtYXBwb3N0Z2lzLmNcbiIgKTsKDQoJCQl9
DQoJCQlpZiAoc2hhcGUtPnR5cGUgIT0gTVNfU0hBUEVfTlVMTCkNCgkJCXsNCgkJCQkvL2hh
dmUgdG8gcmV0cmVpdmUgdGhlIGF0dHJpYnV0ZXMNCgkJCQlzaGFwZS0+dmFsdWVzID0gKGNo
YXIgKiopIG1hbGxvYyhzaXplb2YoY2hhciAqKSAqIGxheWVyLT5udW1pdGVtcyk7DQoJCQkJ
Zm9yICh0PTA7dDxsYXllci0+bnVtaXRlbXM7dCsrKQ0KCQkJCXsNCi8vZnByaW50ZihzdGRl
cnIsIm1zUE9TVEdJU0xheWVyR2V0U2hhcGU6IGZpbmRpbmcgYXR0cmlidXRlIGluZm8gZm9y
ICclcydcbiIsbGF5ZXItPml0ZW1zW3RdKTsNCg0KDQoJCQkJCSB0ZW1wMT0gKGNoYXIgKikg
UFFnZXR2YWx1ZShxdWVyeV9yZXN1bHQsIDAsIHQpOw0KCQkJCQkgc2l6ZSA9IFBRZ2V0bGVu
Z3RoKHF1ZXJ5X3Jlc3VsdCwwLCB0ICkgOw0KCQkJCQkgdGVtcDIgPSAoY2hhciAqKSBtYWxs
b2Moc2l6ZSsxICk7DQoJCQkJCSBtZW1jcHkodGVtcDIsIHRlbXAxLCBzaXplKTsNCgkJCQkJ
IHRlbXAyW3NpemVdID0gMDsgLy9udWxsIHRlcm1pbmF0ZSBpdA0KDQoJCQkJCSBzaGFwZS0+
dmFsdWVzW3RdID0gdGVtcDI7DQovL2ZwcmludGYoc3RkZXJyLCJtc1BPU1RHSVNMYXllckdl
dFNoYXBlOiBzaGFwZS0+dmFsdWVzWyVpXSBoYXMgdmFsdWUgJyVzJ1xuIix0LHNoYXBlLT52
YWx1ZXNbdF0pOw0KDQoJCQkJfQ0KCQkJCXNoYXBlLT5pbmRleCA9IHJlY29yZDsNCgkJCQlz
aGFwZS0+bnVtdmFsdWVzID0gbGF5ZXItPm51bWl0ZW1zOw0KDQoJCQkJZmluZF9ib3VuZHMo
c2hhcGUpOw0KDQoJCQkJcmV0dXJuIChNU19TVUNDRVNTKTsNCgkJCX0NCgkJfQ0KCQllbHNl
DQoJCXsNCgkJCXJldHVybiAoTVNfRE9ORSk7DQoJCX0NCg0KDQoNCgltc0ZyZWVTaGFwZShz
aGFwZSk7DQoNCglyZXR1cm4oTVNfRkFJTFVSRSk7DQoNCg0KfQ0KDQoNCg0KDQovL3F1ZXJ5
IHRoZSBEQiBmb3IgaW5mbyBhYm91dCB0aGUgcmVxdWVzdGVkIHRhYmxlDQovLw0KLy8gQ0hF
QVQ6IGRvbnQgbG9vayBpbiB0aGUgc3lzdGVtIHRhYmxlcywgZ2V0IHF1ZXJ5IG9wdGltaXph
dGlvbiBpbmZvbWF0aW9uDQovLw0KLy8gZ2V0IHRoZSB0YWJsZSBuYW1lLCByZXR1cm4gYSBs
aXN0IG9mIHRoZSBwb3NzaWJsZSBjb2x1bW5zIChleGNlcHQgR0VPTUVUUlkgY29sdW1uKQ0K
Ly8NCi8vIGZvdW5kIG91dCB0aGlzIGlzIGNhbGxlZCBkdXJpbmcgYSBxdWVyeQ0KDQppbnQg
bXNQT1NUR0lTTGF5ZXJHZXRJdGVtcyhsYXllck9iaiAqbGF5ZXIpDQp7DQoJbXNQT1NUR0lT
TGF5ZXJJbmZvCSpsYXllcmluZm87DQoJY2hhcgkJCQl0YWJsZV9uYW1lWzUwMDBdOw0KCWNo
YXIJCQkJZ2VvbV9jb2x1bW5fbmFtZVs1MDAwXTsNCgljaGFyCXVyaWRfbmFtZVs1MDAwXTsN
CgljaGFyIHVzZXJfc3JpZFs1MDAwXTsNCgljaGFyCQkJCXNxbFs2MDAwXTsNCgkvL2ludAkJ
CQluaXRlbXM7DQoNCg0KCVBHcmVzdWx0ICAgKnF1ZXJ5X3Jlc3VsdDsNCglpbnQJCXQ7DQoJ
Y2hhcgkJKnN0ciwqc3RyMjsNCg0KDQovL2ZwcmludGYoc3RkZXJyLCAiaW4gbXNQT1NUR0lT
TGF5ZXJHZXRJdGVtcyAgKGZpbmQgY29sdW1uIG5hbWVzKVxuIik7DQoNCglsYXllcmluZm8g
PSAobXNQT1NUR0lTTGF5ZXJJbmZvICopIGxheWVyLT5wb3N0Z2lzbGF5ZXJpbmZvOw0KDQoJ
aWYgKGxheWVyaW5mbyA9PSBOVUxMKQ0KCXsNCgkJLy9sYXllciBub3Qgb3BlbmVkIHlldA0K
CQltc1NldEVycm9yKE1TX1FVRVJZRVJSLCAibXNQT1NUR0lTTGF5ZXJHZXRJdGVtcyBjYWxs
ZWQgb24gdW5vcGVuZWQgbGF5ZXIiLA0KICAgICAgICAgICAgICAgICAibXNQT1NUR0lTTGF5
ZXJHZXRJdGVtcygpIik7DQoJCXJldHVybihNU19GQUlMVVJFKTsNCgl9DQoNCglpZiAobGF5
ZXJpbmZvLT5jb25uID09IE5VTEwpDQoJew0KICAgICAgICAJbXNTZXRFcnJvcihNU19RVUVS
WUVSUiwgIm1zUE9TVEdJU0xheWVyR2V0SXRlbXMgY2FsbGVkIG9uIFBPU1RHSVMgbGF5ZXIg
d2l0aCBubyBjb25uZWN0aW9uIHRvIERCLiIsDQogICAgICAgICAgICAgICAgICJtc1BPU1RH
SVNMYXllckdldEl0ZW1zKCkiKTsNCgkJcmV0dXJuKE1TX0ZBSUxVUkUpOw0KCX0NCgkvL2dl
dCB0aGUgdGFibGUgbmFtZSBhbmQgZ2VvbWV0cnkgY29sdW1uIG5hbWUNCg0KCW1zUE9TVEdJ
U0xheWVyUGFyc2VEYXRhKGxheWVyLT5kYXRhLCBnZW9tX2NvbHVtbl9uYW1lLCB0YWJsZV9u
YW1lLCB1cmlkX25hbWUsIHVzZXJfc3JpZCk7DQoNCgkvLyB0d28gY2FzZXMgaGVyZS4gIE9u
ZSwgaXRzIGEgdGFibGUgKHVzZSBzZWxlY3QgKiBmcm9tIHRhYmxlKSBvdGhlcndpc2UsIGp1
c3QgdXNlIHRoZSBzZWxlY3QgY2xhdXNlDQoJc3ByaW50ZihzcWwsIkVYUExBSU4gVkVSQk9T
RSBTRUxFQ1QgKiBGUk9NICVzIix0YWJsZV9uYW1lKTsNCgkJLy8gdGhpcyB3aWxsIGNhbGwg
dGhlIHBvc3RyZXNxbF9OT1RJQ0VfSEFORExFUigpIGNhbGxiYWNrISAgbGF5ZXItPmZpZWxk
cyB3aWxsIGJlIHBvcHVsYXRlZA0KCXF1ZXJ5X3Jlc3VsdCA9IFBRZXhlYyhsYXllcmluZm8t
PmNvbm4sIHNxbCApOw0KDQoNCiAgICBpZiAoIShxdWVyeV9yZXN1bHQpIHx8IFBRcmVzdWx0
U3RhdHVzKHF1ZXJ5X3Jlc3VsdCkgIT0gUEdSRVNfQ09NTUFORF9PSykNCiAgICB7DQoJCWNo
YXIgdG1wWzQwMDBdOw0KDQoJCXNwcmludGYodG1wLCAiRXJyb3IgZXhlY3V0aW5nIFBPU1RH
SVMgIFNRTCAgIHN0YXRlbWVudDogJXMiLCBzcWwpOw0KICAgICAgICAJbXNTZXRFcnJvcihN
U19RVUVSWUVSUiwgdG1wLA0KICAgICAgICAgICAgICAgICAibXNQT1NUR0lTTGF5ZXJHZXRJ
dGVtcygpIik7DQoNCiAgICAgICAgCVBRY2xlYXIocXVlcnlfcmVzdWx0KTsNCgkgIAlxdWVy
eV9yZXN1bHQgPSBOVUxMOw0KCQlyZXR1cm4oTVNfRkFJTFVSRSk7DQogICAgfQ0KCS8vbGF5
ZXJpbmZvLT5maWVsZHMgaXMgYSBzdHJpbmcgd2l0aCBhIGxpc3Qgb2YgYWxsIHRoZSBjb2x1
bW5zDQoNCgkJLy8gIyBvZiBpdGVtcyBpcyBudW1iZXIgb2YgIiwiIGluIHN0cmluZyArIDEN
CgkJLy9sYXllcmluZm8tPmZpZWxkcyBsb29rcyBsaWtlICJnZW9fdmFsdWUsZ2VvX2lkLGRl
c2MiDQoJCQkvL3NpbmNlIHdlIGRvbnQgd2FudCB0byByZXR1cm4gdGhlIGdlb21ldHJ5IGNv
bHVtbiwgd2UgcmVtb3ZlIGl0Lg0KCQkJCS8vICMgY29sdW1ucyBpcyByZWR1Y2VkIGJ5IDEN
Cg0KCQlzdHIgPSBsYXllcmluZm8tPmZpZWxkczsNCgkJdCA9IDA7DQoJCXdoaWxlICgoc3Ry
ID0gc3Ryc3RyKHN0ciwiLCIpKSkNCgkJew0KCQkJc3RyKys7DQoJCQl0Kys7DQoJCX0NCg0K
DQoJbGF5ZXItPm51bWl0ZW1zID0gIHQ7IC8vIG9uZSBsZXNzIGJlY2F1c2UgZG9udCB3YW50
IHRvIGRvIGFueXRoaW5nIHdpdGggZ2VvbWV0cnkgY29sdW1uDQoJbGF5ZXItPml0ZW1zID0g
bWFsbG9jIChzaXplb2YoY2hhciAqKSAqIGxheWVyLT5udW1pdGVtcyk7DQoNCg0KCXN0ciA9
IGxheWVyaW5mby0+ZmllbGRzIDsNCgl0ID0gMDsNCgl3aGlsZSAoc3RyICE9IE5VTEwpDQoJ
ew0KCQlzdHIyID0gc3Ryc3RyKHN0ciwiLCIpOyAvL05VTEwgb3IgcG9pbnRzIHRvIHRoZSBu
ZXh0ICIsIg0KCQlpZiAoc3RyMiAhPSBOVUxMKQ0KCQl7DQoNCgkJCWlmIChzdHJuY21wKGdl
b21fY29sdW1uX25hbWUsIHN0ciwgc3RyMi1zdHIpICE9IDApDQoJCQl7DQoJCQkJLy9pdHMg
bm90IHRoZSBnZW9tZXRyeSBjb2x1bW4NCgkJCQlsYXllci0+aXRlbXNbdF0gPSBtYWxsb2Mo
c3RyMi1zdHIgKzEpIDsNCgkJCQltZW1zZXQobGF5ZXItPml0ZW1zW3RdLDAsIHN0cjItc3Ry
ICsxKTsNCgkJCQlzdHJuY3B5KGxheWVyLT5pdGVtc1t0XSwgc3RyLCBzdHIyLXN0cik7DQoJ
CQkJCS8vbWVtc2V0IHdpbGwgbnVsbCB0ZXJtaW5hdGUgaXQNCgkJCQl0Kys7DQoJCQl9DQoJ
CX0NCgkJZWxzZQ0KCQl7DQoJCQlpZiAoc3RyY21wKGdlb21fY29sdW1uX25hbWUsIHN0cikg
IT0gMCkNCgkJCXsNCgkJCQlsYXllci0+aXRlbXNbdF0gPSBtYWxsb2MoIHN0cmxlbihzdHIp
KzEgKSAgOw0KCQkJCW1lbXNldChsYXllci0+aXRlbXNbdF0sMCwgc3RybGVuKHN0cikgKzEp
Ow0KCQkJCXN0cmNweShsYXllci0+aXRlbXNbdF0sIHN0cik7DQoJCQkJdCsrOw0KCQkJfQ0K
CQl9DQoJCWlmIChzdHIyICE9IE5VTEwpDQoJCXsNCgkJCXN0ciA9IHN0cjI7DQoJCQlzdHIr
KzsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCXN0ciA9IE5VTEw7DQoJCX0NCgl9DQoNCglyZXR1
cm4gbXNQT1NUR0lTTGF5ZXJJbml0SXRlbUluZm8obGF5ZXIpOw0KfQ0KDQoNCi8vd2UgcmV0
dXJuIGFuIGluZmluaXRlIGV4dGVudA0KLy8gd2UgY291bGQgY2FsbCB0aGUgU1FMIEFHR1JF
R0FURSBleHRlbnQoR0VPTUVUUlkpLCBidXQgdGhhdCB3b3VsZCB0YWtlIEZPUkVWRVINCi8v
IHRvIHJldHVybiAoaXQgaGFzIHRvIHJlYWQgdGhlIGVudGlyZSB0YWJsZSkuDQovLyBTbywg
d2UganVzdCB0ZWxsIGl0IHRoYXQgd2UncmUgZXZlcnl3aGVyZSBhbmQgbGV0cyB0aGUgc3Bh
dGlhbCBpbmRleGluZyBmaWd1cmUgdGhpbmdzIG91dCBmb3IgdXMNCi8vDQovLyBOZXZlciBz
ZWVuIHRoaXMgZnVuY3Rpb24gYWN0dWFsbHkgY2FsbGVkDQppbnQgbXNQT1NUR0lTTGF5ZXJH
ZXRFeHRlbnQobGF5ZXJPYmogKmxheWVyLCByZWN0T2JqICpleHRlbnQpDQp7DQovL2Zwcmlu
dGYoc3RkZXJyLCJtc1BPU1RHSVNMYXllckdldEV4dGVudCBjYWxsZWRcbiIpOw0KDQoNCgll
eHRlbnQtPm1pbnggPSBleHRlbnQtPm1pbnkgPSAgLTEuMCpGTFRfTUFYIDsNCglleHRlbnQt
Pm1heHggPSBleHRlbnQtPm1heHkgPSAgRkxUX01BWDsNCg0KCXJldHVybihNU19TVUNDRVNT
KTsNCn0NCg0KLyogRnVuY3Rpb24gdG8gcGFyc2UgdGhlIE1hcHNlcnZlciBEQVRBIHBhcmFt
ZXRlciBmb3IgZ2VvbWV0cnkNCiAqIGNvbHVtbiBuYW1lLCB0YWJsZSBuYW1lIGFuZCBuYW1l
IG9mIGEgY29sdW1uIHRvIHNlcnZlIGFzIGENCiAqIHVuaXF1ZSByZWNvcmQgaWQNCiAqLw0K
DQppbnQgbXNQT1NUR0lTTGF5ZXJQYXJzZURhdGEoY2hhciAqZGF0YSwgY2hhciAqZ2VvbV9j
b2x1bW5fbmFtZSwNCgljaGFyICp0YWJsZV9uYW1lLCBjaGFyICp1cmlkX25hbWUsY2hhciAq
dXNlcl9zcmlkKQ0Kew0KCWNoYXIgKnBvc19vcHQsICpwb3Nfc2NuLCAqdG1wLCAqcG9zX3Ny
aWQ7DQoJaW50IAlzbGVuZ3RoOw0KDQoNCg0KDQoNCgkvKiBnaXZlbiBhIHN0cmluZyBvZiB0
aGUgZnJvbSAnZ2VvbSBmcm9tIGN0aXZhbHVlcycgb3IgJ2dlb20gZnJvbSAoKSBhcyBmb28n
DQoJICogcmV0dXJuIGdlb21fY29sdW1uX25hbWUgYXMgJ2dlb20nDQoJICogYW5kIHRhYmxl
IG5hbWUgYXMgJ2N0aXZhbHVlcycgb3IgJ2dlb20gZnJvbSAoKSBhcyBmb28nDQoJICovDQoN
CgkvKiBGaXJzdCBsb29rIGZvciB0aGUgb3B0aW9uYWwgJyB1c2luZyB1bmlxdWUgSUQnIHN0
cmluZyAqLw0KCXBvc19vcHQgPSBzdHJzdHIoZGF0YSwgIiB1c2luZyB1bmlxdWUgIik7DQoJ
aWYgKHBvc19vcHQgPT0gTlVMTCkgew0KCQkvKiBObyB1c2VyIHNwZWNpZmllZCB1bmlxdWUg
aWQgc28gd2Ugd2lsbCB1c2UgdGhlIFBvc3RnZXNxbCBPSUQgKi8NCgkJc3RyY3B5KHVyaWRf
bmFtZSwgIk9JRCIpOw0KCX0NCgllbHNlIHsNCgkJLy8gQ0hBTkdFIC0gcHJvdGVjdCB0aGUg
dHJhaWxpbmcgZWRnZSBmb3IgdGhpbmcgbGlrZSAndXNpbmcgdW5pcXVlIGZ0YWJfaWQgdXNp
bmcgc3JpZD0zMycNCgkJdG1wID0gc3Ryc3RyKHBvc19vcHQgKyAxNCwiICIpOw0KCQlpZiAo
dG1wID09IE5VTEwpIC8vaXQgbG9va2VzIGxpa2UgJ3VzaW5nIHVuaXF1ZSBmdGFiX2lkJw0K
CQl7DQoJCQlzdHJjcHkodXJpZF9uYW1lLCBwb3Nfb3B0ICsgMTQpOw0KCQl9DQoJCWVsc2UN
CgkJew0KCQkJLy9sb29rcyBsaWtlICcgdXNpbmcgdW5pcXVlIGZ0YWJfaWQgJyAoc3BhY2Ug
YXQgZW5kKQ0KCQkJc3RybmNweSh1cmlkX25hbWUsIHBvc19vcHQgKyAxNCwgdG1wLShwb3Nf
b3B0ICsgMTQgICkgKTsNCgkJfQ0KCX0NCg0KCXBvc19zcmlkID0gc3Ryc3RyKGRhdGEsIiB1
c2luZyBTUklEPSIpOw0KCWlmIChwb3Nfc3JpZCA9PSBOVUxMKQ0KCXsNCgkJdXNlcl9zcmlk
WzBdID0gMDsgLy8gPSAiIg0KCX0NCgllbHNlDQoJew0KCQkvL2ZpbmQgdGhlIHNyaWQNCgkJ
c2xlbmd0aD1zdHJzcG4ocG9zX3NyaWQrMTIsIi0wMTIzNDU2Nzg5Iik7DQoJCWlmIChzbGVu
Z3RoID09IDApDQoJCXsNCgkJCW1zU2V0RXJyb3IoTVNfUVVFUllFUlIsDQoJCQkJCURBVEFF
UlJPUk1FU1NBR0UoZGF0YSwiRXJyb3IgcGFyc2luZyBQT1NUR0lTIGRhdGEgdmFyaWFibGU6
IFlvdSBzcGVjaWZpZWQgJ3VzaW5nIFNSSUQ9IycgYnV0IGRpZG50IGhhdmUgYW55IG51bWJl
cnMhPGJyPjxicj5cblxuTW9yZSBIZWxwOjxicj48YnI+XG5cbiIpLA0KCQkJCQkibXNQT1NU
R0lTTGF5ZXJQYXJzZURhdGEoKSIpOw0KDQoJCQlyZXR1cm4oTVNfRkFJTFVSRSk7DQoJCX0N
CgkJZWxzZQ0KCQl7DQoJCQlzdHJuY3B5KHVzZXJfc3JpZCxwb3Nfc3JpZCsxMixzbGVuZ3Ro
KTsNCgkJfQ0KCX0NCg0KDQoJLy8gdGhpcyBpcyBhIGxpdHRsZSBoYWNrIHNvIHRoZSByZXN0
IG9mIHRoZSBjb2RlIHdvcmtzLiAgSWYgdGhlICcgdXNpbmcgU1JJRD0nIGNvbWVzIGJlZm9y
ZQ0KCS8vIHRoZSAnIHVzaW5nIHVuaXF1ZSAnLCB0aGVuIG1ha2Ugc3VyZSBwb3Nfb3B0IHBv
aW50cyB0byB3aGVyZSB0aGUgJyB1c2luZyBTUklEJyBzdGFydHMhDQoNCglpZiAocG9zX29w
dCA9PSBOVUxMKQ0KCXsNCgkJcG9zX29wdCA9IHBvc19zcmlkOw0KCX0NCgllbHNlDQoJew0K
CQlpZiAocG9zX3NyaWQgIT0gTlVMTCkNCgkJew0KCQkJaWYgKHBvc19vcHQ+cG9zX3NyaWQp
DQoJCQkJcG9zX29wdCA9IHBvc19zcmlkOw0KCQl9DQoNCgl9DQoNCgkvKiBTY2FuIGZvciB0
aGUgdGFibGUgb3Igc3ViLXNlbGVjdCBjbGF1c2UgKi8NCglwb3Nfc2NuID0gc3Ryc3RyKGRh
dGEsICIgZnJvbSAiKTsNCglpZiAocG9zX3NjbiA9PSBOVUxMKSB7DQoJCW1zU2V0RXJyb3Io
TVNfUVVFUllFUlIsDQoJCQkJCURBVEFFUlJPUk1FU1NBR0UoZGF0YSwiRXJyb3IgcGFyc2lu
ZyBQT1NUR0lTIGRhdGEgdmFyaWFibGUuICBNdXN0IGNvbnRhaW4gJ2dlb21ldHJ5X2NvbHVt
biBmcm9tIHRhYmxlX25hbWUnIG9yICdnZW9tIGZyb20gKHN1YnNlbGVjdCkgYXMgZm9vJyAo
Y291bGRudCBmaW5kICcgZnJvbSAnKS4gIE1vcmUgaGVscDogPGJyPjxicj5cblxuIiksDQoJ
CQkJCSJtc1BPU1RHSVNMYXllclBhcnNlRGF0YSgpIik7DQoNCgkJLy9tc1NldEVycm9yKE1T
X1FVRVJZRVJSLCAiRXJyb3IgcGFyc2luZyBQT1NUR0lTIGRhdGEgdmFyaWFibGUuICBNdXN0
IGNvbnRhaW4gJ2dlb21ldHJ5X2NvbHVtbiBmcm9tIHRhYmxlX25hbWUnIG9yICdnZW9tIGZy
b20gKHN1YnNlbGVjdCkgYXMgZm9vJyAoY291bGRudCBmaW5kICcgZnJvbSAnKS4iLCAibXNQ
T1NUR0lTTGF5ZXJQYXJzZURhdGEoKSIpOw0KCQlyZXR1cm4oTVNfRkFJTFVSRSk7DQoJfQ0K
DQoJLyogQ29weSB0aGUgZ2VvbWV0cnkgY29sdW1uIG5hbWUgKi8NCgltZW1jcHkoZ2VvbV9j
b2x1bW5fbmFtZSwgZGF0YSwgKHBvc19zY24pLShkYXRhKSk7DQoJZ2VvbV9jb2x1bW5fbmFt
ZVsocG9zX3NjbiktKGRhdGEpXSA9IDA7IC8vbnVsbCB0ZXJtaW5hdGUgaXQNCg0KCS8qIENv
cHkgb3V0IHRoZSB0YWJsZSBuYW1lIG9yIHN1Yi1zZWxlY3QgY2xhdXNlICovDQoJaWYgKHBv
c19vcHQgPT0gTlVMTCkgew0KCQlzdHJjcHkodGFibGVfbmFtZSwgcG9zX3NjbiArIDYpOwkv
L3RhYmxlIG5hbWUgb3Igc3ViLXNlbGVjdCBjbGF1c2UNCgl9DQoJZWxzZSB7DQoJCXN0cm5j
cHkodGFibGVfbmFtZSwgcG9zX3NjbiArIDYsIChwb3Nfb3B0KSAtIChwb3Nfc2NuICsgNikp
Ow0KCQl0YWJsZV9uYW1lWyhwb3Nfb3B0KSAtIChwb3Nfc2NuICsgNildID0gMDsgLy9udWxs
IHRlcm1pbmF0ZSBpdA0KCX0NCg0KCWlmICggKHN0cmxlbih0YWJsZV9uYW1lKSA8IDEgKSB8
fCAgKHN0cmxlbihnZW9tX2NvbHVtbl9uYW1lKSA8IDEgKSApIHsNCgkJbXNTZXRFcnJvcihN
U19RVUVSWUVSUiwNCgkJCQkJREFUQUVSUk9STUVTU0FHRShkYXRhLCJFcnJvciBwYXJzaW5n
IFBPU1RHSVMgZGF0YSB2YXJpYWJsZS4gIE11c3QgY29udGFpbiAnZ2VvbWV0cnlfY29sdW1u
IGZyb20gdGFibGVfbmFtZScgb3IgJ2dlb20gZnJvbSAoc3Vic2VsZWN0KSBhcyBmb28nIChj
b3VsZG50IGZpbmQgYSBnZW9tZXRyeV9jb2x1bW4gb3IgdGFibGUvc3Vic2VsZWN0KS4gIE1v
cmUgaGVscDogPGJyPjxicj5cblxuIiksDQoJCQkJCSJtc1BPU1RHSVNMYXllclBhcnNlRGF0
YSgpIik7DQoJCXJldHVybihNU19GQUlMVVJFKTsNCgl9DQovL3ByaW50ZigidW5pcXVlIGNv
bHVtbiA9ICVzLCBzcmlkPSclcydcbiIsIHVyaWRfbmFtZSx1c2VyX3NyaWQpOw0KCXJldHVy
bihNU19TVUNDRVNTKTsNCn0NCg0KI2Vsc2UNCg0KLy9wcm90b3R5cGVzIGlmIHBvc3RnaXMg
aXNudCBzdXBwb3NlZCB0byBiZSBjb21waWxlZA0KDQppbnQgbXNQT1NUR0lTTGF5ZXJPcGVu
KGxheWVyT2JqICpsYXllcikNCnsNCgkJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIm1zUE9T
VEdJU0xheWVyT3BlbiBjYWxsZWQgYnV0IHVuaW1wbGVtZW50ZWQhICAobWFwc2VydmVyIG5v
dCBjb21waWxlZCB3aXRoIHBvc3RnaXMgc3VwcG9ydCkiLA0KICAgICAgICAgICAgICAgICAi
bXNQT1NUR0lTTGF5ZXJPcGVuKCkiKTsNCgkJcmV0dXJuKE1TX0ZBSUxVUkUpOw0KfQ0KDQp2
b2lkIG1zUE9TVEdJU0xheWVyRnJlZUl0ZW1JbmZvKGxheWVyT2JqICpsYXllcikNCnsNCgkJ
bXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIm1zUE9TVEdJU0xheWVyRnJlZUl0ZW1JbmZvIGNh
bGxlZCBidXQgdW5pbXBsZW1lbnRlZCEobWFwc2VydmVyIG5vdCBjb21waWxlZCB3aXRoIHBv
c3RnaXMgc3VwcG9ydCkiLA0KICAgICAgICAgICAgICAgICAibXNQT1NUR0lTTGF5ZXJGcmVl
SXRlbUluZm8oKSIpOw0KfQ0KaW50IG1zUE9TVEdJU0xheWVySW5pdEl0ZW1JbmZvKGxheWVy
T2JqICpsYXllcikNCnsNCgkJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIm1zUE9TVEdJU0xh
eWVySW5pdEl0ZW1JbmZvIGNhbGxlZCBidXQgdW5pbXBsZW1lbnRlZCEobWFwc2VydmVyIG5v
dCBjb21waWxlZCB3aXRoIHBvc3RnaXMgc3VwcG9ydCkiLA0KICAgICAgICAgICAgICAgICAi
bXNQT1NUR0lTTGF5ZXJJbml0SXRlbUluZm8oKSIpOw0KCQlyZXR1cm4oTVNfRkFJTFVSRSk7
DQp9DQppbnQgbXNQT1NUR0lTTGF5ZXJXaGljaFNoYXBlcyhsYXllck9iaiAqbGF5ZXIsIHJl
Y3RPYmogcmVjdCkNCnsNCgkJbXNTZXRFcnJvcihNU19RVUVSWUVSUiwgIm1zUE9TVEdJU0xh
eWVyV2hpY2hTaGFwZXMgY2FsbGVkIGJ1dCB1bmltcGxlbWVudGVkIShtYXBzZXJ2ZXIgbm90
IGNvbXBpbGVkIHdpdGggcG9zdGdpcyBzdXBwb3J0KSIsDQogICAgICAgICAgICAgICAgICJt
c1BPU1RHSVNMYXllcldoaWNoU2hhcGVzKCkiKTsNCgkJcmV0dXJuKE1TX0ZBSUxVUkUpOw0K
fQ0KDQppbnQgbXNQT1NUR0lTTGF5ZXJDbG9zZShsYXllck9iaiAqbGF5ZXIpDQp7DQoJCW1z
U2V0RXJyb3IoTVNfUVVFUllFUlIsICJtc1BPU1RHSVNMYXllckNsb3NlIGNhbGxlZCBidXQg
dW5pbXBsZW1lbnRlZCEobWFwc2VydmVyIG5vdCBjb21waWxlZCB3aXRoIHBvc3RnaXMgc3Vw
cG9ydCkiLA0KICAgICAgICAgICAgICAgICAibXNQT1NUR0lTTGF5ZXJDbG9zZSgpIik7DQoJ
CXJldHVybihNU19GQUlMVVJFKTsNCn0NCg0KaW50IG1zUE9TVEdJU0xheWVyTmV4dFNoYXBl
KGxheWVyT2JqICpsYXllciwgc2hhcGVPYmogKnNoYXBlKQ0Kew0KCQltc1NldEVycm9yKE1T
X1FVRVJZRVJSLCAibXNQT1NUR0lTTGF5ZXJOZXh0U2hhcGUgY2FsbGVkIGJ1dCB1bmltcGxl
bWVudGVkIShtYXBzZXJ2ZXIgbm90IGNvbXBpbGVkIHdpdGggcG9zdGdpcyBzdXBwb3J0KSIs
DQogICAgICAgICAgICAgICAgICJtc1BPU1RHSVNMYXllck5leHRTaGFwZSgpIik7DQoJCXJl
dHVybihNU19GQUlMVVJFKTsNCn0NCg0KaW50IG1zUE9TVEdJU0xheWVyR2V0U2hhcGUobGF5
ZXJPYmogKmxheWVyLCBzaGFwZU9iaiAqc2hhcGUsIGxvbmcgcmVjb3JkKQ0Kew0KCQltc1Nl
dEVycm9yKE1TX1FVRVJZRVJSLCAibXNQT1NUR0lTTGF5ZXJHZXRTaGFwZSBjYWxsZWQgYnV0
IHVuaW1wbGVtZW50ZWQhKG1hcHNlcnZlciBub3QgY29tcGlsZWQgd2l0aCBwb3N0Z2lzIHN1
cHBvcnQpIiwNCiAgICAgICAgICAgICAgICAgIm1zUE9TVEdJU0xheWVyR2V0U2hhcGUoKSIp
Ow0KCQlyZXR1cm4oTVNfRkFJTFVSRSk7DQp9DQoNCmludCBtc1BPU1RHSVNMYXllckdldEV4
dGVudChsYXllck9iaiAqbGF5ZXIsIHJlY3RPYmogKmV4dGVudCkNCnsNCgkJbXNTZXRFcnJv
cihNU19RVUVSWUVSUiwgIm1zUE9TVEdJU0xheWVyR2V0RXh0ZW50IGNhbGxlZCBidXQgdW5p
bXBsZW1lbnRlZCEobWFwc2VydmVyIG5vdCBjb21waWxlZCB3aXRoIHBvc3RnaXMgc3VwcG9y
dCkiLA0KICAgICAgICAgICAgICAgICAibXNQT1NUR0lTTGF5ZXJHZXRFeHRlbnQoKSIpOw0K
CQlyZXR1cm4oTVNfRkFJTFVSRSk7DQp9DQoNCmludCBtc1BPU1RHSVNMYXllckdldFNoYXBl
UmFuZG9tKGxheWVyT2JqICpsYXllciwgc2hhcGVPYmogKnNoYXBlLCBsb25nICpyZWNvcmQp
DQp7DQoJCW1zU2V0RXJyb3IoTVNfUVVFUllFUlIsICJtc1BPU1RHSVNMYXllckdldFNoYXBl
UmFuZG9tIGNhbGxlZCBidXQgdW5pbXBsZW1lbnRlZCEobWFwc2VydmVyIG5vdCBjb21waWxl
ZCB3aXRoIHBvc3RnaXMgc3VwcG9ydCkiLA0KICAgICAgICAgICAgICAgICAibXNQT1NUR0lT
TGF5ZXJHZXRTaGFwZVJhbmRvbSgpIik7DQoJCXJldHVybihNU19GQUlMVVJFKTsNCn0NCg0K
aW50IG1zUE9TVEdJU0xheWVyR2V0SXRlbXMobGF5ZXJPYmogKmxheWVyKQ0Kew0KCQltc1Nl
dEVycm9yKE1TX1FVRVJZRVJSLCAibXNQT1NUR0lTTGF5ZXJHZXRJdGVtcyBjYWxsZWQgYnV0
IHVuaW1wbGVtZW50ZWQhKG1hcHNlcnZlciBub3QgY29tcGlsZWQgd2l0aCBwb3N0Z2lzIHN1
cHBvcnQpIiwNCiAgICAgICAgICAgICAgICAgIm1zUE9TVEdJU0xheWVyR2V0SXRlbXMoKSIp
Ow0KCQlyZXR1cm4oTVNfRkFJTFVSRSk7DQp9DQoNCg0KLy8gZW5kIGFib3ZlJ3MgI2lmZGVm
IFVTRV9QT1NUR0lTDQojZW5kaWYNCg==
--------------B3E645280CC9A5A17468A5A8--