Textpattern CMS support forum
You are not logged in. Register | Login | Help
- Topics: Active | Unanswered
Managing dynamic tables in textpattern
I have a requirement to output a sortable table. This table will be listing events (multiple events per week, each with a different contact and a different venue) and so needs to be maintained by my editors, who are very non-technical. I can think of a few ways of doing this, but I’m not sure what the best approach would be.
My first thought is to create this as a separate database, where clicking on ‘sort’ icon simply reload the page with a differently sorted SQL call, but what’s the best way to allow my editors to be able to add new records to it?
I’ve not spotted any plugins that seem immediately useful.
Any suggestions?
Stuart
Offline
#2 2014-04-27 18:27:54
- ax
- Plugin Author
- From: Germany
- Registered: 2009-08-19
- Posts: 165
Re: Managing dynamic tables in textpattern
phual wrote #280419:
I have a requirement to output a sortable table.
You can build a table by extracting the data with the smd_query
plugin:
<table class="sortable">
<thead><tr><th>Item 1</th><th>Item 2</th></tr>
</thead><tbody>
<txp:smd_query query="
SELECT DISTINCT txp.custom_1, txp.custom_2
FROM textpattern AS txp
WHERE txp.section = 'testsection' "
wraptag="" break="tr">
<td>{custom_1}</td>
<td>{custom_2}</td>
</txp:smd_query>
</tbody></table>
and make it sortable with Javascript.
Last edited by ax (2014-04-27 18:28:38)
Offline
Re: Managing dynamic tables in textpattern
Also, take a look at tablesorter.com/ – I haven’t used it, but I’ve heard good things.
Offline
Re: Managing dynamic tables in textpattern
Thanks for both responses. I’ve been away from my emails and have a couple of issues to sort out, but rest assured, I’m extremely grateful for the suggestions.
Thanks
Stuart
Offline
#5 2014-05-14 13:42:44
- txpdevcoder
- Member
- Registered: 2012-06-07
- Posts: 58
Re: Managing dynamic tables in textpattern
I have another suggestion. I have used rcb_excel in the past that lets you get textpattern to to turn an excel spreadsheet into a table. It uses textpattern files, so to update the table on the site, you just replace the spreadsheet in the backend. Piece of cake. The plugin dissappeard, but i have a copy right here:
# rcb_excel v0.1
# Outputs a Microsoft Excel (.xls) spreadsheet as an HTML table
# Russell Brown
# http://www.russellbrown.co.uk/
# ......................................................................
# This is a plugin for Textpattern - http://textpattern.com/
# To install: textpattern > admin > plugins
# Paste the following text into the 'Install plugin' box:
# ......................................................................
YTo5OntzOjc6InZlcnNpb24iO3M6MzoiMC4xIjtzOjY6ImF1dGhvciI7czoxMzoiUnVzc2Vs
bCBCcm93biI7czoxMDoiYXV0aG9yX3VyaSI7czozMDoiaHR0cDovL3d3dy5ydXNzZWxsYnJv
d24uY28udWsvIjtzOjExOiJkZXNjcmlwdGlvbiI7czo2MToiT3V0cHV0cyBhIE1pY3Jvc29m
dCBFeGNlbCAoLnhscykgc3ByZWFkc2hlZXQgYXMgYW4gSFRNTCB0YWJsZSI7czo0OiJ0eXBl
IjtpOjA7czo0OiJuYW1lIjtzOjk6InJjYl9leGNlbCI7czo0OiJoZWxwIjtzOjMxOTg6Igo8
aDE+Jmx0O3R4cDpyY2JfZXhjZWwgLyZndDs8L2gxPgoKPGgyPlN1bW1hcnk8L2gyPgoKPHA+
T3V0cHV0cyB0aGUgc3BlY2lmaWVkIE1pY3Jvc29mdCBFeGNlbCAoLnhscykgZmlsZSBhcyBh
biB4SFRNTCB0YWJsZS4gIEluY2x1ZGVzIHNlcnZlci1zaWRlIGNhY2hpbmcgZm9yIG9wdGlt
dW0gcGVyZm9ybWFuY2UuPC9wPgoKPHA+VGhpcyBwbHVnaW4gaXMgaWRlYWwgZm9yIGVuYWJs
aW5nIGNsaWVudHMgdG8gcHVibGlzaC9tYWludGFpbiB0YWJ1bGFyIGRhdGEgd2l0aG91dCBo
YXZpbmcgdG8ga25vdyB4SFRNTC4gIEEgbmV3IHhIVE1MIHRhYmxlIGlzIGNyZWF0ZWQgYW5k
IGNhY2hlZCBldmVyeSB0aW1lIGEgbmV3IHZlcnNpb24gb2YgdGhlIHNwcmVhZHNoZWV0IGlz
IHVwbG9hZGVkLjwvcD4KCjxoMj5CYXNpYyB1c2FnZTwvaDI+Cgo8cD4mbHQ7dHhwOnJjYl9l
eGNlbCBmaWxlPSZxdW90O3NwcmVhZHNoZWV0LnhscyZxdW90OyAvJmd0OzwvcD4KCjxwPlRo
ZSA8ZW0+ZmlsZTwvZW0+IGF0dHJpYnV0ZSBhY2NlcHRzIGVpdGhlciB0aGUgbmFtZSBvciBJ
RCBvZiBhbiB1cGxvYWRlZCBNUyBFeGNlbCAoLnhscykgZmlsZS48L3A+Cgo8cD5Ob3RlOiB0
aGUgcGx1Z2luIHdpbGwgYXR0ZW1wdCB0byBjcmVhdGUgYSBjYWNoZSBkaXJlY3RvcnkgaW4g
eW91ciBmaWxlcyBkaXJlY3RvcnkuICBJZiBQSFAgbGFja3MgdGhlIHBlcm1pc3Npb25zIHRv
IGRvIHRoaXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIHRoZSBkaXJlY3RvcnkgeW91cnNl
bGYuICBUaGUgZGVmYXVsdCBuYW1lIGZvciB0aGlzIGRpcmVjdG9yeSBpcyA8ZW0+Y2FjaGU8
L2VtPiwgdGhvdWdoIHlvdSBjYW4gY2FsbCBpdCB3aGF0ZXZlciB5b3Ugd2FudC4gIElmIHlv
dSBjaG9vc2UgYSBkaWZmZXJlbnQgbmFtZSwgcmVtZW1iZXIgdG8gdXNlIHRoZSA8ZW0+Y2Fj
aGVkaXI8L2VtPiBhdHRyaWJ1dGUgKHNlZSBiZWxvdykuPC9wPgoKPGgyPkFkZGl0aW9uYWwg
dGFnIGF0dHJpYnV0ZXM8L2gyPgoKPHRhYmxlIHN0eWxlPSJjb2xvcjojMzMzO2ZvbnQ6bm9y
bWFsIDFlbSB2ZXJkYW5hO3dpZHRoOiAxMDAlO3BhZGRpbmc6IDAgMCAyMHB4O21hcmdpbjog
MCBhdXRvIDIwcHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzY2NjsiIGlkPSJsaXN0Ij4K
CTx0aGVhZD4KCQk8dHI+CgkJCTx0aD5BdHRyaWJ1dGU8L3RoPgoJCQk8dGg+RGVzY3JpcHRp
b248L3RoPgoJCQk8dGg+RGVmYXVsdDwvdGg+CgkJPC90cj4KCTwvdGhlYWQ+Cgk8dGJvZHk+
CgkJPHRyPgoJCQk8dGQ+ZmlsZTwvdGQ+CgkJCTx0ZD5UaGUgTWljcm9zb2Z0IEV4Y2VsIHNv
dXJjZSBmaWxlLiAgQWNjZXB0cyBlaXRoZXIgYSBmaWxlbmFtZSBvciBmaWxlIElELiAgVGhl
IGZpbGUgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiB1cGxvYWRlZCBmcm9tIHdpdGhpbiB0aGUg
JmxzcXVvO0ZpbGVzJnJzcXVvOyB0YWIgaW4geW91ciBUZXh0cGF0dGVybiBjb250cm9sIHBh
bmVsLjwvdGQ+CgkJCTx0ZD51bnNldDwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD5zaGVl
dDwvdGQ+CgkJCTx0ZD5UaGUgd29ya3NoZWV0IG51bWJlciB0byBvdXRwdXQuPC90ZD4KCQkJ
PHRkPjE8L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQ+c3R5bGU8L3RkPgoJCQk8dGQ+V2hl
dGhlciB0byByZXRhaW4gdGhlIHdvcmtzaGVldCZyc3F1bztzIGZvcm1hdHRpbmcgc3R5bGVz
ICgxKSBvciByZXR1cm4gdW5zdHlsZWQgZGF0YSBhbmQgbWFya3VwICgwLCBkZWZhdWx0KS48
L3RkPgoJCQk8dGQ+MDwvdGQ+CgkJPC90cj4KCQk8dHI+CgkJCTx0ZD5zaG93cm93bnVtYmVy
czwvdGQ+CgkJCTx0ZD5XaGV0aGVyIG9yIG5vdCB0byBvdXRwdXQgdGhlIHNwcmVhZHNoZWV0
JnJzcXVvO3Mgcm93IG51bWJlcnM8L3RkPgoJCQk8dGQ+MDwvdGQ+CgkJPC90cj4KCQk8dHI+
CgkJCTx0ZD5zaG93Y29sbGV0dGVyczwvdGQ+CgkJCTx0ZD5XaGV0aGVyIG9yIG5vdCB0byBv
dXRwdXQgdGhlIHNwcmVhZHNoZWV0JnJzcXVvO3MgY29sdW1uIGxldHRlcnMuICBJZiB0cnVl
ICgxKSwgdGhlIGNvbHVtbiBsZXR0ZXJzIHdpbGwgYmUgbWFya2VkIHVwIGFzICZsdDt0aCZn
dDsgZWxlbWVudHMuPC90ZD4KCQkJPHRkPjA8L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQ+
aGVhZGVyczwvdGQ+CgkJCTx0ZD5JZiB0cnVlICgxKSB0aGUgZmlyc3Qgcm93IGluIHRoZSBy
ZXN1bHRzZXQgd2lsbCBiZSBtYXJrZWQgdXAgYXMgJmx0O3RoJmd0OyBlbGVtZW50cy4gIE5v
dCBhcHBsaWNhYmxlIGlmIHNob3djb2xsZXR0ZXJzIGlzIHRydWUuPC90ZD4KCQkJPHRkPjE8
L3RkPgoJCTwvdHI+CgkJPHRyPgoJCQk8dGQ+dGFibGVjbGFzczwvdGQ+CgkJCTx0ZD5UaGUg
eEhUTUwgY2xhc3MgbmFtZSB0byBhcHBseSB0byB0aGUgdGFibGUuPC90ZD4KCQkJPHRkPnVu
c2V0PC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRkPm9kZGNsYXNzPC90ZD4KCQkJPHRkPlRo
ZSB4SFRNTCBjbGFzcyBuYW1lIHRvIGFwcGx5IHRvIGV2ZXJ5IG9kZCAmbHQ7dHImZ3Q7IGVs
ZW1lbnQgaW4gdGhlIHJlc3VsdHNldC48L3RkPgoJCQk8dGQ+dW5zZXQ8L3RkPgoJCTwvdHI+
CgkJPHRyPgoJCQk8dGQ+ZXZlbmNsYXNzPC90ZD4KCQkJPHRkPlRoZSB4SFRNTCBjbGFzcyBu
YW1lIHRvIGFwcGx5IHRvIGV2ZXJ5IGV2ZW4gJmx0O3RyJmd0OyBlbGVtZW50IGluIHRoZSBy
ZXN1bHRzZXQuPC90ZD4KCQkJPHRkPnVuc2V0PC90ZD4KCQk8L3RyPgoJCTx0cj4KCQkJPHRk
PmNhY2hlZGlyPC90ZD4KCQkJPHRkPlRoZSBuYW1lIG9mIHRoZSBjYWNoZSBkaXJlY3Rvcnkg
bG9jYXRlZCBpbiB0aGUgZmlsZXMgZGlyZWN0b3J5LiAgVGhpcyBhdHRyaWJ1dGUgb25seSBu
ZWVkcyB0byBiZSBzZXQgaWYgeW91IGNob29zZSBhIGRpcmVjdG9yeSBuYW1lIG90aGVyIHRo
YW4gJmxzcXVvO2NhY2hlJnJzcXVvOy48L3RkPgoJCQk8dGQ+Y2FjaGU8L3RkPgoJCTwvdHI+
Cgk8L3Rib2R5Pgo8L3RhYmxlPgoKPGgyPkFib3V0IHRoaXMgcGx1Z2luPC9oMj4KCjxwPlRo
aXMgVGV4dHBhdHRlcm4gcGx1Z2luIGluY29ycG9yYXRlcyB0aGUgZXhjZWxsZW50IDxlbT5Q
SFAgRXhjZWwgUmVhZGVyPC9lbT4gY2xhc3MsIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBWYWRp
bSBUa2FjaGVua28gYW5kIGVuaGFuY2VkIGJ5IE1hdHQgS3J1c2UgYW5kIE1hdHQgUm94YnVy
Z2guICBEZXZlbG9wZWQgaW50byBhIFRleHRwYXR0ZXJuIHBsdWdpbiBieSBSdXNzZWxsIEJy
b3duLjwvcD4KCiI7czo0OiJjb2RlIjtzOjYzNjMwOiIKCgoKLyoqCiAqIEEgY2xhc3MgZm9y
IHJlYWRpbmcgTWljcm9zb2Z0IEV4Y2VsICg5Ny8yMDAzKSBTcHJlYWRzaGVldHMuCiAqCiAq
IFZlcnNpb24gMi4yMQogKgogKiBFbmhhbmNlZCBhbmQgbWFpbnRhaW5lZCBieSBNYXR0IEty
dXNlIDwgaHR0cDovL21hdHRrcnVzZS5jb20gPgogKiBNYWludGFpbmVkIGF0IGh0dHA6Ly9j
b2RlLmdvb2dsZS5jb20vcC9waHAtZXhjZWwtcmVhZGVyLwogKgogKiBGb3JtYXQgcGFyc2lu
ZyBhbmQgTVVDSCBtb3JlIGNvbnRyaWJ1dGVkIGJ5OgogKiAgICBNYXR0IFJveGJ1cmdoIDwg
aHR0cDovL3d3dy5yb3hidXJnaC5tZS51ayA+CiAqCiAqIERPQ1VNRU5UQVRJT04KICogPT09
PT09PT09PT09PQogKiAgIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9waHAtZXhjZWwtcmVh
ZGVyL3dpa2kvRG9jdW1lbnRhdGlvbgogKgogKiBDSEFOR0UgTE9HCiAqID09PT09PT09PT0K
ICogICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcGhwLWV4Y2VsLXJlYWRlci93aWtpL0No
YW5nZUhpc3RvcnkKICoKICogRElTQ1VTU0lPTi9TVVBQT1JUCiAqID09PT09PT09PT09PT09
PT09PQogKiAgIGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9waHAtZXhjZWwtcmVh
ZGVyLWRpc2N1c3MvdG9waWNzCiAqCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIE9y
aWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IFZhZGltIFRrYWNoZW5rbyB1bmRlciB0aGUgbmFtZSBQ
SFBFeGNlbFJlYWRlci4KICogKGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvcGhw
ZXhjZWxyZWFkZXIpCiAqIEJhc2VkIG9uIHRoZSBKYXZhIHZlcnNpb24gYnkgQW5keSBLaGFu
IChodHRwOi8vd3d3LmFuZHlraGFuLmNvbSkuICBOb3cKICogbWFpbnRhaW5lZCBieSBEYXZp
ZCBTYW5kZXJzLiAgUmVhZHMgb25seSBCaWZmIDcgYW5kIEJpZmYgOCBmb3JtYXRzLgogKgog
KiBQSFAgdmVyc2lvbnMgNCBhbmQgNQogKgogKiBMSUNFTlNFOiBUaGlzIHNvdXJjZSBmaWxl
IGlzIHN1YmplY3QgdG8gdmVyc2lvbiAzLjAgb2YgdGhlIFBIUCBsaWNlbnNlCiAqIHRoYXQg
aXMgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dp
bmcgVVJJOgogKiBodHRwOi8vd3d3LnBocC5uZXQvbGljZW5zZS8zXzAudHh0LiAgSWYgeW91
IGRpZCBub3QgcmVjZWl2ZSBhIGNvcHkgb2YKICogdGhlIFBIUCBMaWNlbnNlIGFuZCBhcmUg
dW5hYmxlIHRvIG9idGFpbiBpdCB0aHJvdWdoIHRoZSB3ZWIsIHBsZWFzZQogKiBzZW5kIGEg
bm90ZSB0byBsaWNlbnNlQHBocC5uZXQgc28gd2UgY2FuIG1haWwgeW91IGEgY29weSBpbW1l
ZGlhdGVseS4KICoKICogQGNhdGVnb3J5ICAgU3ByZWFkc2hlZXQKICogQHBhY2thZ2UJU3By
ZWFkc2hlZXRfRXhjZWxfUmVhZGVyCiAqIEBhdXRob3IJIFZhZGltIFRrYWNoZW5rbyA8dnRA
YXBhY2hlcGhwLmNvbT4KICogQGxpY2Vuc2UJaHR0cDovL3d3dy5waHAubmV0L2xpY2Vuc2Uv
M18wLnR4dCAgUEhQIExpY2Vuc2UgMy4wCiAqIEB2ZXJzaW9uCUNWUzogJElkOiByZWFkZXIu
cGhwIDE5IDIwMDctMDMtMTMgMTI6NDI6NDFaIHNoYW5neGlhbyAkCiAqIEBsaW5rCSAgIGh0
dHA6Ly9wZWFyLnBocC5uZXQvcGFja2FnZS9TcHJlYWRzaGVldF9FeGNlbF9SZWFkZXIKICog
QHNlZQkJT0xFLCBTcHJlYWRzaGVldF9FeGNlbF9Xcml0ZXIKICogLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KICovCgpkZWZpbmUoJ05VTV9CSUdfQkxPQ0tfREVQT1RfQkxPQ0tTX1BPUycsIDB4
MmMpOwpkZWZpbmUoJ1NNQUxMX0JMT0NLX0RFUE9UX0JMT0NLX1BPUycsIDB4M2MpOwpkZWZp
bmUoJ1JPT1RfU1RBUlRfQkxPQ0tfUE9TJywgMHgzMCk7CmRlZmluZSgnQklHX0JMT0NLX1NJ
WkUnLCAweDIwMCk7CmRlZmluZSgnU01BTExfQkxPQ0tfU0laRScsIDB4NDApOwpkZWZpbmUo
J0VYVEVOU0lPTl9CTE9DS19QT1MnLCAweDQ0KTsKZGVmaW5lKCdOVU1fRVhURU5TSU9OX0JM
T0NLX1BPUycsIDB4NDgpOwpkZWZpbmUoJ1BST1BFUlRZX1NUT1JBR0VfQkxPQ0tfU0laRScs
IDB4ODApOwpkZWZpbmUoJ0JJR19CTE9DS19ERVBPVF9CTE9DS1NfUE9TJywgMHg0Yyk7CmRl
ZmluZSgnU01BTExfQkxPQ0tfVEhSRVNIT0xEJywgMHgxMDAwKTsKLy8gcHJvcGVydHkgc3Rv
cmFnZSBvZmZzZXRzCmRlZmluZSgnU0laRV9PRl9OQU1FX1BPUycsIDB4NDApOwpkZWZpbmUo
J1RZUEVfUE9TJywgMHg0Mik7CmRlZmluZSgnU1RBUlRfQkxPQ0tfUE9TJywgMHg3NCk7CmRl
ZmluZSgnU0laRV9QT1MnLCAweDc4KTsKZGVmaW5lKCdJREVOVElGSUVSX09MRScsIHBhY2so
IkNDQ0NDQ0NDIiwweGQwLDB4Y2YsMHgxMSwweGUwLDB4YTEsMHhiMSwweDFhLDB4ZTEpKTsK
CgpmdW5jdGlvbiBHZXRJbnQ0ZCgkZGF0YSwgJHBvcykgewoJJHZhbHVlID0gb3JkKCRkYXRh
WyRwb3NdKSB8IChvcmQoJGRhdGFbJHBvcysxXSkJPDwgOCkgfCAob3JkKCRkYXRhWyRwb3Mr
Ml0pIDw8IDE2KSB8IChvcmQoJGRhdGFbJHBvcyszXSkgPDwgMjQpOwoJaWYgKCR2YWx1ZT49
NDI5NDk2NzI5NCkgewoJCSR2YWx1ZT0tMjsKCX0KCXJldHVybiAkdmFsdWU7Cn0KCi8vIGh0
dHA6Ly91ay5waHAubmV0L21hbnVhbC9lbi9mdW5jdGlvbi5nZXRkYXRlLnBocApmdW5jdGlv
biBnbWdldGRhdGUoJHRzID0gbnVsbCl7CgkkayA9IGFycmF5KCdzZWNvbmRzJywnbWludXRl
cycsJ2hvdXJzJywnbWRheScsJ3dkYXknLCdtb24nLCd5ZWFyJywneWRheScsJ3dlZWtkYXkn
LCdtb250aCcsMCk7CglyZXR1cm4oYXJyYXlfY29tYigkayxzcGxpdCgiOiIsZ21kYXRlKCdz
Omk6RzpqOnc6bjpZOno6bDpGOlUnLGlzX251bGwoJHRzKT90aW1lKCk6JHRzKSkpKTsKCX0K
Ci8vIEFkZGVkIGZvciBQSFA0IGNvbXBhdGliaWxpdHkKZnVuY3Rpb24gYXJyYXlfY29tYigk
YXJyYXkxLCAkYXJyYXkyKSB7Cgkkb3V0ID0gYXJyYXkoKTsKCWZvcmVhY2ggKCRhcnJheTEg
YXMgJGtleSA9PiAkdmFsdWUpIHsKCQkkb3V0WyR2YWx1ZV0gPSAkYXJyYXkyWyRrZXldOwoJ
fQoJcmV0dXJuICRvdXQ7Cn0KCmZ1bmN0aW9uIHYoJGRhdGEsJHBvcykgewoJcmV0dXJuIG9y
ZCgkZGF0YVskcG9zXSkgfCBvcmQoJGRhdGFbJHBvcysxXSk8PDg7Cn0KCmNsYXNzIE9MRVJl
YWQgewoJdmFyICRkYXRhID0gJyc7CglmdW5jdGlvbiBPTEVSZWFkKCl7CX0KCglmdW5jdGlv
biByZWFkKCRzRmlsZU5hbWUpewoJCS8vIGNoZWNrIGlmIGZpbGUgZXhpc3QgYW5kIGlzIHJl
YWRhYmxlIChEYXJrbyBNaWxqYW5vdmljKQoJCWlmKCFpc19yZWFkYWJsZSgkc0ZpbGVOYW1l
KSkgewoJCQkkdGhpcy0+ZXJyb3IgPSAxOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCSR0aGlz
LT5kYXRhID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRzRmlsZU5hbWUpOwoJCWlmICghJHRoaXMt
PmRhdGEpIHsKCQkJJHRoaXMtPmVycm9yID0gMTsKCQkJcmV0dXJuIGZhbHNlOwogICAJCX0K
ICAgCQlpZiAoc3Vic3RyKCR0aGlzLT5kYXRhLCAwLCA4KSAhPSBJREVOVElGSUVSX09MRSkg
ewoJCQkkdGhpcy0+ZXJyb3IgPSAxOwoJCQlyZXR1cm4gZmFsc2U7CiAgIAkJfQoJCSR0aGlz
LT5udW1CaWdCbG9ja0RlcG90QmxvY2tzID0gR2V0SW50NGQoJHRoaXMtPmRhdGEsIE5VTV9C
SUdfQkxPQ0tfREVQT1RfQkxPQ0tTX1BPUyk7CgkJJHRoaXMtPnNiZFN0YXJ0QmxvY2sgPSBH
ZXRJbnQ0ZCgkdGhpcy0+ZGF0YSwgU01BTExfQkxPQ0tfREVQT1RfQkxPQ0tfUE9TKTsKCQkk
dGhpcy0+cm9vdFN0YXJ0QmxvY2sgPSBHZXRJbnQ0ZCgkdGhpcy0+ZGF0YSwgUk9PVF9TVEFS
VF9CTE9DS19QT1MpOwoJCSR0aGlzLT5leHRlbnNpb25CbG9jayA9IEdldEludDRkKCR0aGlz
LT5kYXRhLCBFWFRFTlNJT05fQkxPQ0tfUE9TKTsKCQkkdGhpcy0+bnVtRXh0ZW5zaW9uQmxv
Y2tzID0gR2V0SW50NGQoJHRoaXMtPmRhdGEsIE5VTV9FWFRFTlNJT05fQkxPQ0tfUE9TKTsK
CgkJJGJpZ0Jsb2NrRGVwb3RCbG9ja3MgPSBhcnJheSgpOwoJCSRwb3MgPSBCSUdfQkxPQ0tf
REVQT1RfQkxPQ0tTX1BPUzsKCQkkYmJkQmxvY2tzID0gJHRoaXMtPm51bUJpZ0Jsb2NrRGVw
b3RCbG9ja3M7CgkJaWYgKCR0aGlzLT5udW1FeHRlbnNpb25CbG9ja3MgIT0gMCkgewoJCQkk
YmJkQmxvY2tzID0gKEJJR19CTE9DS19TSVpFIC0gQklHX0JMT0NLX0RFUE9UX0JMT0NLU19Q
T1MpLzQ7CgkJfQoKCQlmb3IgKCRpID0gMDsgJGkgPCAkYmJkQmxvY2tzOyAkaSsrKSB7CgkJ
CSRiaWdCbG9ja0RlcG90QmxvY2tzWyRpXSA9IEdldEludDRkKCR0aGlzLT5kYXRhLCAkcG9z
KTsKCQkJJHBvcyArPSA0OwoJCX0KCgoJCWZvciAoJGogPSAwOyAkaiA8ICR0aGlzLT5udW1F
eHRlbnNpb25CbG9ja3M7ICRqKyspIHsKCQkJJHBvcyA9ICgkdGhpcy0+ZXh0ZW5zaW9uQmxv
Y2sgKyAxKSAqIEJJR19CTE9DS19TSVpFOwoJCQkkYmxvY2tzVG9SZWFkID0gbWluKCR0aGlz
LT5udW1CaWdCbG9ja0RlcG90QmxvY2tzIC0gJGJiZEJsb2NrcywgQklHX0JMT0NLX1NJWkUg
LyA0IC0gMSk7CgoJCQlmb3IgKCRpID0gJGJiZEJsb2NrczsgJGkgPCAkYmJkQmxvY2tzICsg
JGJsb2Nrc1RvUmVhZDsgJGkrKykgewoJCQkJJGJpZ0Jsb2NrRGVwb3RCbG9ja3NbJGldID0g
R2V0SW50NGQoJHRoaXMtPmRhdGEsICRwb3MpOwoJCQkJJHBvcyArPSA0OwoJCQl9CgoJCQkk
YmJkQmxvY2tzICs9ICRibG9ja3NUb1JlYWQ7CgkJCWlmICgkYmJkQmxvY2tzIDwgJHRoaXMt
Pm51bUJpZ0Jsb2NrRGVwb3RCbG9ja3MpIHsKCQkJCSR0aGlzLT5leHRlbnNpb25CbG9jayA9
IEdldEludDRkKCR0aGlzLT5kYXRhLCAkcG9zKTsKCQkJfQoJCX0KCgkJLy8gcmVhZEJpZ0Js
b2NrRGVwb3QKCQkkcG9zID0gMDsKCQkkaW5kZXggPSAwOwoJCSR0aGlzLT5iaWdCbG9ja0No
YWluID0gYXJyYXkoKTsKCgkJZm9yICgkaSA9IDA7ICRpIDwgJHRoaXMtPm51bUJpZ0Jsb2Nr
RGVwb3RCbG9ja3M7ICRpKyspIHsKCQkJJHBvcyA9ICgkYmlnQmxvY2tEZXBvdEJsb2Nrc1sk
aV0gKyAxKSAqIEJJR19CTE9DS19TSVpFOwoJCQkvL2VjaG8gInBvcyA9ICRwb3MiOwoJCQlm
b3IgKCRqID0gMCA7ICRqIDwgQklHX0JMT0NLX1NJWkUgLyA0OyAkaisrKSB7CgkJCQkkdGhp
cy0+YmlnQmxvY2tDaGFpblskaW5kZXhdID0gR2V0SW50NGQoJHRoaXMtPmRhdGEsICRwb3Mp
OwoJCQkJJHBvcyArPSA0IDsKCQkJCSRpbmRleCsrOwoJCQl9CgkJfQoKCQkvLyByZWFkU21h
bGxCbG9ja0RlcG90KCk7CgkJJHBvcyA9IDA7CgkJJGluZGV4ID0gMDsKCQkkc2JkQmxvY2sg
PSAkdGhpcy0+c2JkU3RhcnRCbG9jazsKCQkkdGhpcy0+c21hbGxCbG9ja0NoYWluID0gYXJy
YXkoKTsKCgkJd2hpbGUgKCRzYmRCbG9jayAhPSAtMikgewoJCSAgJHBvcyA9ICgkc2JkQmxv
Y2sgKyAxKSAqIEJJR19CTE9DS19TSVpFOwoJCSAgZm9yICgkaiA9IDA7ICRqIDwgQklHX0JM
T0NLX1NJWkUgLyA0OyAkaisrKSB7CgkJCSR0aGlzLT5zbWFsbEJsb2NrQ2hhaW5bJGluZGV4
XSA9IEdldEludDRkKCR0aGlzLT5kYXRhLCAkcG9zKTsKCQkJJHBvcyArPSA0OwoJCQkkaW5k
ZXgrKzsKCQkgIH0KCQkgICRzYmRCbG9jayA9ICR0aGlzLT5iaWdCbG9ja0NoYWluWyRzYmRC
bG9ja107CgkJfQoKCgkJLy8gcmVhZERhdGEocm9vdFN0YXJ0QmxvY2spCgkJJGJsb2NrID0g
JHRoaXMtPnJvb3RTdGFydEJsb2NrOwoJCSRwb3MgPSAwOwoJCSR0aGlzLT5lbnRyeSA9ICR0
aGlzLT5fX3JlYWREYXRhKCRibG9jayk7CgkJJHRoaXMtPl9fcmVhZFByb3BlcnR5U2V0cygp
OwoJfQoKCWZ1bmN0aW9uIF9fcmVhZERhdGEoJGJsKSB7CgkJJGJsb2NrID0gJGJsOwoJCSRw
b3MgPSAwOwoJCSRkYXRhID0gJyc7CgkJd2hpbGUgKCRibG9jayAhPSAtMikgIHsKCQkJJHBv
cyA9ICgkYmxvY2sgKyAxKSAqIEJJR19CTE9DS19TSVpFOwoJCQkkZGF0YSA9ICRkYXRhLnN1
YnN0cigkdGhpcy0+ZGF0YSwgJHBvcywgQklHX0JMT0NLX1NJWkUpOwoJCQkkYmxvY2sgPSAk
dGhpcy0+YmlnQmxvY2tDaGFpblskYmxvY2tdOwoJCX0KCQlyZXR1cm4gJGRhdGE7CgkgfQoK
CWZ1bmN0aW9uIF9fcmVhZFByb3BlcnR5U2V0cygpewoJCSRvZmZzZXQgPSAwOwoJCXdoaWxl
ICgkb2Zmc2V0IDwgc3RybGVuKCR0aGlzLT5lbnRyeSkpIHsKCQkJJGQgPSBzdWJzdHIoJHRo
aXMtPmVudHJ5LCAkb2Zmc2V0LCBQUk9QRVJUWV9TVE9SQUdFX0JMT0NLX1NJWkUpOwoJCQkk
bmFtZVNpemUgPSBvcmQoJGRbU0laRV9PRl9OQU1FX1BPU10pIHwgKG9yZCgkZFtTSVpFX09G
X05BTUVfUE9TKzFdKSA8PCA4KTsKCQkJJHR5cGUgPSBvcmQoJGRbVFlQRV9QT1NdKTsKCQkJ
JHN0YXJ0QmxvY2sgPSBHZXRJbnQ0ZCgkZCwgU1RBUlRfQkxPQ0tfUE9TKTsKCQkJJHNpemUg
PSBHZXRJbnQ0ZCgkZCwgU0laRV9QT1MpOwoJCQkkbmFtZSA9ICcnOwoJCQlmb3IgKCRpID0g
MDsgJGkgPCAkbmFtZVNpemUgOyAkaSsrKSB7CgkJCQkkbmFtZSAuPSAkZFskaV07CgkJCX0K
CQkJJG5hbWUgPSBzdHJfcmVwbGFjZSgiXHgwMCIsICIiLCAkbmFtZSk7CgkJCSR0aGlzLT5w
cm9wc1tdID0gYXJyYXkgKAoJCQkJJ25hbWUnID0+ICRuYW1lLAoJCQkJJ3R5cGUnID0+ICR0
eXBlLAoJCQkJJ3N0YXJ0QmxvY2snID0+ICRzdGFydEJsb2NrLAoJCQkJJ3NpemUnID0+ICRz
aXplKTsKCQkJaWYgKChzdHJ0b2xvd2VyKCRuYW1lKSA9PSAid29ya2Jvb2siKSB8fCAoIHN0
cnRvbG93ZXIoJG5hbWUpID09ICJib29rIikpIHsKCQkJCSR0aGlzLT53cmtib29rID0gY291
bnQoJHRoaXMtPnByb3BzKSAtIDE7CgkJCX0KCQkJaWYgKCRuYW1lID09ICJSb290IEVudHJ5
IikgewoJCQkJJHRoaXMtPnJvb3RlbnRyeSA9IGNvdW50KCR0aGlzLT5wcm9wcykgLSAxOwoJ
CQl9CgkJCSRvZmZzZXQgKz0gUFJPUEVSVFlfU1RPUkFHRV9CTE9DS19TSVpFOwoJCX0KCgl9
CgoKCWZ1bmN0aW9uIGdldFdvcmtCb29rKCl7CgkJaWYgKCR0aGlzLT5wcm9wc1skdGhpcy0+
d3JrYm9va11bJ3NpemUnXSA8IFNNQUxMX0JMT0NLX1RIUkVTSE9MRCl7CgkJCSRyb290ZGF0
YSA9ICR0aGlzLT5fX3JlYWREYXRhKCR0aGlzLT5wcm9wc1skdGhpcy0+cm9vdGVudHJ5XVsn
c3RhcnRCbG9jayddKTsKCQkJJHN0cmVhbURhdGEgPSAnJzsKCQkJJGJsb2NrID0gJHRoaXMt
PnByb3BzWyR0aGlzLT53cmtib29rXVsnc3RhcnRCbG9jayddOwoJCQkkcG9zID0gMDsKCQkJ
d2hpbGUgKCRibG9jayAhPSAtMikgewoJICAJCQkgICRwb3MgPSAkYmxvY2sgKiBTTUFMTF9C
TE9DS19TSVpFOwoJCQkJICAkc3RyZWFtRGF0YSAuPSBzdWJzdHIoJHJvb3RkYXRhLCAkcG9z
LCBTTUFMTF9CTE9DS19TSVpFKTsKCQkJCSAgJGJsb2NrID0gJHRoaXMtPnNtYWxsQmxvY2tD
aGFpblskYmxvY2tdOwoJCQl9CgkJCXJldHVybiAkc3RyZWFtRGF0YTsKCQl9ZWxzZXsKCQkJ
JG51bUJsb2NrcyA9ICR0aGlzLT5wcm9wc1skdGhpcy0+d3JrYm9va11bJ3NpemUnXSAvIEJJ
R19CTE9DS19TSVpFOwoJCQlpZiAoJHRoaXMtPnByb3BzWyR0aGlzLT53cmtib29rXVsnc2l6
ZSddICUgQklHX0JMT0NLX1NJWkUgIT0gMCkgewoJCQkJJG51bUJsb2NrcysrOwoJCQl9CgoJ
CQlpZiAoJG51bUJsb2NrcyA9PSAwKSByZXR1cm4gJyc7CgkJCSRzdHJlYW1EYXRhID0gJyc7
CgkJCSRibG9jayA9ICR0aGlzLT5wcm9wc1skdGhpcy0+d3JrYm9va11bJ3N0YXJ0QmxvY2sn
XTsKCQkJJHBvcyA9IDA7CgkJCXdoaWxlICgkYmxvY2sgIT0gLTIpIHsKCQkJICAkcG9zID0g
KCRibG9jayArIDEpICogQklHX0JMT0NLX1NJWkU7CgkJCSAgJHN0cmVhbURhdGEgLj0gc3Vi
c3RyKCR0aGlzLT5kYXRhLCAkcG9zLCBCSUdfQkxPQ0tfU0laRSk7CgkJCSAgJGJsb2NrID0g
JHRoaXMtPmJpZ0Jsb2NrQ2hhaW5bJGJsb2NrXTsKCQkJfQoJCQlyZXR1cm4gJHN0cmVhbURh
dGE7CgkJfQoJfQoKfQoKZGVmaW5lKCdTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfQklGRjgn
LAkJCSAweDYwMCk7CmRlZmluZSgnU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX0JJRkY3JywJ
CQkgMHg1MDApOwpkZWZpbmUoJ1NQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9XT1JLQk9PS0dM
T0JBTFMnLCAgIDB4NSk7CmRlZmluZSgnU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1dPUktT
SEVFVCcsCQkgMHgxMCk7CmRlZmluZSgnU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZUEVf
Qk9GJywJCSAgMHg4MDkpOwpkZWZpbmUoJ1NQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9UWVBF
X0VPRicsCQkgIDB4MGEpOwpkZWZpbmUoJ1NQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9UWVBF
X0JPVU5EU0hFRVQnLCAgIDB4ODUpOwpkZWZpbmUoJ1NQUkVBRFNIRUVUX0VYQ0VMX1JFQURF
Ul9UWVBFX0RJTUVOU0lPTicsCTB4MjAwKTsKZGVmaW5lKCdTUFJFQURTSEVFVF9FWENFTF9S
RUFERVJfVFlQRV9ST1cnLAkJICAweDIwOCk7CmRlZmluZSgnU1BSRUFEU0hFRVRfRVhDRUxf
UkVBREVSX1RZUEVfREJDRUxMJywJICAgMHhkNyk7CmRlZmluZSgnU1BSRUFEU0hFRVRfRVhD
RUxfUkVBREVSX1RZUEVfRklMRVBBU1MnLAkgMHgyZik7CmRlZmluZSgnU1BSRUFEU0hFRVRf
RVhDRUxfUkVBREVSX1RZUEVfTk9URScsCQkgMHgxYyk7CmRlZmluZSgnU1BSRUFEU0hFRVRf
RVhDRUxfUkVBREVSX1RZUEVfVFhPJywJCSAgMHgxYjYpOwpkZWZpbmUoJ1NQUkVBRFNIRUVU
X0VYQ0VMX1JFQURFUl9UWVBFX1JLJywJCSAgIDB4N2UpOwpkZWZpbmUoJ1NQUkVBRFNIRUVU
X0VYQ0VMX1JFQURFUl9UWVBFX1JLMicsCQkgIDB4MjdlKTsKZGVmaW5lKCdTUFJFQURTSEVF
VF9FWENFTF9SRUFERVJfVFlQRV9NVUxSSycsCQkweGJkKTsKZGVmaW5lKCdTUFJFQURTSEVF
VF9FWENFTF9SRUFERVJfVFlQRV9NVUxCTEFOSycsCSAweGJlKTsKZGVmaW5lKCdTUFJFQURT
SEVFVF9FWENFTF9SRUFERVJfVFlQRV9JTkRFWCcsCQkweDIwYik7CmRlZmluZSgnU1BSRUFE
U0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfU1NUJywJCSAgMHhmYyk7CmRlZmluZSgnU1BSRUFE
U0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfRVhUU1NUJywJICAgMHhmZik7CmRlZmluZSgnU1BS
RUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfQ09OVElOVUUnLAkgMHgzYyk7CmRlZmluZSgn
U1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfTEFCRUwnLAkJMHgyMDQpOwpkZWZpbmUo
J1NQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9UWVBFX0xBQkVMU1NUJywJIDB4ZmQpOwpkZWZp
bmUoJ1NQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9UWVBFX05VTUJFUicsCSAgIDB4MjAzKTsK
ZGVmaW5lKCdTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQRV9OQU1FJywJCSAweDE4KTsK
ZGVmaW5lKCdTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQRV9BUlJBWScsCQkweDIyMSk7
CmRlZmluZSgnU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfU1RSSU5HJywJICAgMHgy
MDcpOwpkZWZpbmUoJ1NQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9UWVBFX0ZPUk1VTEEnLAkg
IDB4NDA2KTsKZGVmaW5lKCdTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQRV9GT1JNVUxB
MicsCSAweDYpOwpkZWZpbmUoJ1NQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9UWVBFX0ZPUk1B
VCcsCSAgIDB4NDFlKTsKZGVmaW5lKCdTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQRV9Y
RicsCQkgICAweGUwKTsKZGVmaW5lKCdTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQRV9C
T09MRVJSJywJICAweDIwNSk7CmRlZmluZSgnU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZ
UEVfRk9OVCcsCSAgMHgwMDMxKTsKZGVmaW5lKCdTUFJFQURTSEVFVF9FWENFTF9SRUFERVJf
VFlQRV9QQUxFVFRFJywJICAweDAwOTIpOwpkZWZpbmUoJ1NQUkVBRFNIRUVUX0VYQ0VMX1JF
QURFUl9UWVBFX1VOS05PV04nLAkgIDB4ZmZmZik7CmRlZmluZSgnU1BSRUFEU0hFRVRfRVhD
RUxfUkVBREVSX1RZUEVfTklORVRFRU5GT1VSJywgMHgyMik7CmRlZmluZSgnU1BSRUFEU0hF
RVRfRVhDRUxfUkVBREVSX1RZUEVfTUVSR0VEQ0VMTFMnLCAgMHhFNSk7CmRlZmluZSgnU1BS
RUFEU0hFRVRfRVhDRUxfUkVBREVSX1VUQ09GRlNFVERBWVMnICwJMjU1NjkpOwpkZWZpbmUo
J1NQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9VVENPRkZTRVREQVlTMTkwNCcsIDI0MTA3KTsK
ZGVmaW5lKCdTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfTVNJTkFEQVknLAkJICA4NjQwMCk7
CmRlZmluZSgnU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfSFlQRVInLAkgICAgIDB4
MDFiOCk7CmRlZmluZSgnU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfQ09MSU5GTycs
CSAgICAgMHg3ZCk7CmRlZmluZSgnU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfREVG
Q09MV0lEVEgnLCAgMHg1NSk7CmRlZmluZSgnU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZ
UEVfU1RBTkRBUkRXSURUSCcsIDB4OTkpOwpkZWZpbmUoJ1NQUkVBRFNIRUVUX0VYQ0VMX1JF
QURFUl9ERUZfTlVNX0ZPUk1BVCcsCSIlcyIpOwoKCi8qCiogTWFpbiBDbGFzcwoqLwpjbGFz
cyBTcHJlYWRzaGVldF9FeGNlbF9SZWFkZXIgewoKCS8vIE1LOiBBZGRlZCB0byBtYWtlIGRh
dGEgcmV0cmlldmFsIGVhc2llcgoJdmFyICRjb2xuYW1lcyA9IGFycmF5KCk7Cgl2YXIgJGNv
bGluZGV4ZXMgPSBhcnJheSgpOwoJdmFyICRzdGFuZGFyZENvbFdpZHRoID0gMDsKCXZhciAk
ZGVmYXVsdENvbFdpZHRoID0gMDsKCglmdW5jdGlvbiBteUhleCgkZCkgewoJCWlmICgkZCA8
IDE2KSByZXR1cm4gIjAiIC4gZGVjaGV4KCRkKTsKCQlyZXR1cm4gZGVjaGV4KCRkKTsKCX0K
CglmdW5jdGlvbiBkdW1wSGV4RGF0YSgkZGF0YSwgJHBvcywgJGxlbmd0aCkgewoJCSRpbmZv
ID0gIiI7CgkJZm9yICgkaSA9IDA7ICRpIDw9ICRsZW5ndGg7ICRpKyspIHsKCQkJJGluZm8g
Lj0gKCRpPT0wPyIiOiIgIikgLiAkdGhpcy0+bXlIZXgob3JkKCRkYXRhWyRwb3MgKyAkaV0p
KSAuIChvcmQoJGRhdGFbJHBvcyArICRpXSk+MzE/ICJbIiAuICRkYXRhWyRwb3MgKyAkaV0g
LiAiXSI6JycpOwoJCX0KCQlyZXR1cm4gJGluZm87Cgl9CgoJZnVuY3Rpb24gZ2V0Q29sKCRj
b2wpIHsKCQlpZiAoaXNfc3RyaW5nKCRjb2wpKSB7CgkJCSRjb2wgPSBzdHJ0b2xvd2VyKCRj
b2wpOwoJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkY29sLCR0aGlzLT5jb2xuYW1lcykpIHsK
CQkJCSRjb2wgPSAkdGhpcy0+Y29sbmFtZXNbJGNvbF07CgkJCX0KCQl9CgkJcmV0dXJuICRj
b2w7Cgl9CgoJLy8gUFVCTElDIEFQSSBGVU5DVElPTlMKCS8vIC0tLS0tLS0tLS0tLS0tLS0t
LS0tCgoJZnVuY3Rpb24gdmFsKCRyb3csJGNvbCwkc2hlZXQ9MCkgewoJCSRjb2wgPSAkdGhp
cy0+Z2V0Q29sKCRjb2wpOwoJCWlmIChhcnJheV9rZXlfZXhpc3RzKCRyb3csJHRoaXMtPnNo
ZWV0c1skc2hlZXRdWydjZWxscyddKSAmJiBhcnJheV9rZXlfZXhpc3RzKCRjb2wsJHRoaXMt
PnNoZWV0c1skc2hlZXRdWydjZWxscyddWyRyb3ddKSkgewoJCQlyZXR1cm4gJHRoaXMtPnNo
ZWV0c1skc2hlZXRdWydjZWxscyddWyRyb3ddWyRjb2xdOwoJCX0KCQlyZXR1cm4gIiI7Cgl9
CglmdW5jdGlvbiB2YWx1ZSgkcm93LCRjb2wsJHNoZWV0PTApIHsKCQlyZXR1cm4gJHRoaXMt
PnZhbCgkcm93LCRjb2wsJHNoZWV0KTsKCX0KCWZ1bmN0aW9uIGluZm8oJHJvdywkY29sLCR0
eXBlPScnLCRzaGVldD0wKSB7CgkJJGNvbCA9ICR0aGlzLT5nZXRDb2woJGNvbCk7CgkJaWYg
KGFycmF5X2tleV9leGlzdHMoJ2NlbGxzSW5mbycsJHRoaXMtPnNoZWV0c1skc2hlZXRdKQoJ
CQkJJiYgYXJyYXlfa2V5X2V4aXN0cygkcm93LCR0aGlzLT5zaGVldHNbJHNoZWV0XVsnY2Vs
bHNJbmZvJ10pCgkJCQkmJiBhcnJheV9rZXlfZXhpc3RzKCRjb2wsJHRoaXMtPnNoZWV0c1sk
c2hlZXRdWydjZWxsc0luZm8nXVskcm93XSkKCQkJCSYmIGFycmF5X2tleV9leGlzdHMoJHR5
cGUsJHRoaXMtPnNoZWV0c1skc2hlZXRdWydjZWxsc0luZm8nXVskcm93XVskY29sXSkpIHsK
CQkJcmV0dXJuICR0aGlzLT5zaGVldHNbJHNoZWV0XVsnY2VsbHNJbmZvJ11bJHJvd11bJGNv
bF1bJHR5cGVdOwoJCX0KCQlyZXR1cm4gIiI7Cgl9CglmdW5jdGlvbiB0eXBlKCRyb3csJGNv
bCwkc2hlZXQ9MCkgewoJCXJldHVybiAkdGhpcy0+aW5mbygkcm93LCRjb2wsJ3R5cGUnLCRz
aGVldCk7Cgl9CglmdW5jdGlvbiByYXcoJHJvdywkY29sLCRzaGVldD0wKSB7CgkJcmV0dXJu
ICR0aGlzLT5pbmZvKCRyb3csJGNvbCwncmF3Jywkc2hlZXQpOwoJfQoJZnVuY3Rpb24gcm93
c3Bhbigkcm93LCRjb2wsJHNoZWV0PTApIHsKCQkkdmFsID0gJHRoaXMtPmluZm8oJHJvdywk
Y29sLCdyb3dzcGFuJywkc2hlZXQpOwoJCWlmICgkdmFsPT0iIikgeyByZXR1cm4gMTsgfQoJ
CXJldHVybiAkdmFsOwoJfQoJZnVuY3Rpb24gY29sc3Bhbigkcm93LCRjb2wsJHNoZWV0PTAp
IHsKCQkkdmFsID0gJHRoaXMtPmluZm8oJHJvdywkY29sLCdjb2xzcGFuJywkc2hlZXQpOwoJ
CWlmICgkdmFsPT0iIikgeyByZXR1cm4gMTsgfQoJCXJldHVybiAkdmFsOwoJfQoJZnVuY3Rp
b24gaHlwZXJsaW5rKCRyb3csJGNvbCwkc2hlZXQ9MCkgewoJCSRsaW5rID0gJHRoaXMtPnNo
ZWV0c1skc2hlZXRdWydjZWxsc0luZm8nXVskcm93XVskY29sXVsnaHlwZXJsaW5rJ107CgkJ
aWYgKCRsaW5rKSB7CgkJCXJldHVybiAkbGlua1snbGluayddOwoJCX0KCQlyZXR1cm4gJyc7
Cgl9CglmdW5jdGlvbiByb3djb3VudCgkc2hlZXQ9MCkgewoJCXJldHVybiAkdGhpcy0+c2hl
ZXRzWyRzaGVldF1bJ251bVJvd3MnXTsKCX0KCWZ1bmN0aW9uIGNvbGNvdW50KCRzaGVldD0w
KSB7CgkJcmV0dXJuICR0aGlzLT5zaGVldHNbJHNoZWV0XVsnbnVtQ29scyddOwoJfQoJZnVu
Y3Rpb24gY29sd2lkdGgoJGNvbCwkc2hlZXQ9MCkgewoJCS8vIENvbCB3aWR0aCBpcyBhY3R1
YWxseSB0aGUgd2lkdGggb2YgdGhlIG51bWJlciAwLiBTbyB3ZSBoYXZlIHRvIGVzdGltYXRl
IGFuZCBjb21lIGNsb3NlCgkJcmV0dXJuICR0aGlzLT5jb2xJbmZvWyRzaGVldF1bJGNvbF1b
J3dpZHRoJ10vOTE0MioyMDA7Cgl9CglmdW5jdGlvbiBjb2xoaWRkZW4oJGNvbCwkc2hlZXQ9
MCkgewoJCXJldHVybiAhISR0aGlzLT5jb2xJbmZvWyRzaGVldF1bJGNvbF1bJ2hpZGRlbidd
OwoJfQoJZnVuY3Rpb24gcm93aGVpZ2h0KCRyb3csJHNoZWV0PTApIHsKCQlyZXR1cm4gJHRo
aXMtPnJvd0luZm9bJHNoZWV0XVskcm93XVsnaGVpZ2h0J107Cgl9CglmdW5jdGlvbiByb3do
aWRkZW4oJHJvdywkc2hlZXQ9MCkgewoJCXJldHVybiAhISR0aGlzLT5yb3dJbmZvWyRzaGVl
dF1bJHJvd11bJ2hpZGRlbiddOwoJfQoKCS8vIEdFVCBUSEUgQ1NTIEZPUiBGT1JNQVRUSU5H
CgkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PQoJZnVuY3Rpb24gc3R5bGUoJHJvdywk
Y29sLCRzaGVldD0wLCRwcm9wZXJ0aWVzPScnKSB7CgkJJGNzcyA9ICIiOwoJCSRmb250PSR0
aGlzLT5mb250KCRyb3csJGNvbCwkc2hlZXQpOwoJCWlmICgkZm9udCE9IiIpIHsKCQkJJGNz
cyAuPSAiZm9udC1mYW1pbHk6JGZvbnQ7IjsKCQl9CgkJJGFsaWduPSR0aGlzLT5hbGlnbigk
cm93LCRjb2wsJHNoZWV0KTsKCQlpZiAoJGFsaWduIT0iIikgewoJCQkkY3NzIC49ICJ0ZXh0
LWFsaWduOiRhbGlnbjsiOwoJCX0KCQkkaGVpZ2h0PSR0aGlzLT5oZWlnaHQoJHJvdywkY29s
LCRzaGVldCk7CgkJaWYgKCRoZWlnaHQhPSIiKSB7CgkJCSRjc3MgLj0gImZvbnQtc2l6ZTok
aGVpZ2h0Ii4icHg7IjsKCQl9CgkJJGJnY29sb3I9JHRoaXMtPmJnQ29sb3IoJHJvdywkY29s
LCRzaGVldCk7CgkJaWYgKCRiZ2NvbG9yIT0iIikgewoJCQkkYmdjb2xvciA9ICR0aGlzLT5j
b2xvcnNbJGJnY29sb3JdOwoJCQkkY3NzIC49ICJiYWNrZ3JvdW5kLWNvbG9yOiRiZ2NvbG9y
OyI7CgkJfQoJCSRjb2xvcj0kdGhpcy0+Y29sb3IoJHJvdywkY29sLCRzaGVldCk7CgkJaWYg
KCRjb2xvciE9IiIpIHsKCQkJJGNzcyAuPSAiY29sb3I6JGNvbG9yOyI7CgkJfQoJCSRib2xk
PSR0aGlzLT5ib2xkKCRyb3csJGNvbCwkc2hlZXQpOwoJCWlmICgkYm9sZCkgewoJCQkkY3Nz
IC49ICJmb250LXdlaWdodDpib2xkOyI7CgkJfQoJCSRpdGFsaWM9JHRoaXMtPml0YWxpYygk
cm93LCRjb2wsJHNoZWV0KTsKCQlpZiAoJGl0YWxpYykgewoJCQkkY3NzIC49ICJmb250LXN0
eWxlOml0YWxpYzsiOwoJCX0KCQkkdW5kZXJsaW5lPSR0aGlzLT51bmRlcmxpbmUoJHJvdywk
Y29sLCRzaGVldCk7CgkJaWYgKCR1bmRlcmxpbmUpIHsKCQkJJGNzcyAuPSAidGV4dC1kZWNv
cmF0aW9uOnVuZGVybGluZTsiOwoJCX0KCQkvLyBCb3JkZXJzCgkJJGJMZWZ0ID0gJHRoaXMt
PmJvcmRlckxlZnQoJHJvdywkY29sLCRzaGVldCk7CgkJJGJSaWdodCA9ICR0aGlzLT5ib3Jk
ZXJSaWdodCgkcm93LCRjb2wsJHNoZWV0KTsKCQkkYlRvcCA9ICR0aGlzLT5ib3JkZXJUb3Ao
JHJvdywkY29sLCRzaGVldCk7CgkJJGJCb3R0b20gPSAkdGhpcy0+Ym9yZGVyQm90dG9tKCRy
b3csJGNvbCwkc2hlZXQpOwoJCSRiTGVmdENvbCA9ICR0aGlzLT5ib3JkZXJMZWZ0Q29sb3Io
JHJvdywkY29sLCRzaGVldCk7CgkJJGJSaWdodENvbCA9ICR0aGlzLT5ib3JkZXJSaWdodENv
bG9yKCRyb3csJGNvbCwkc2hlZXQpOwoJCSRiVG9wQ29sID0gJHRoaXMtPmJvcmRlclRvcENv
bG9yKCRyb3csJGNvbCwkc2hlZXQpOwoJCSRiQm90dG9tQ29sID0gJHRoaXMtPmJvcmRlckJv
dHRvbUNvbG9yKCRyb3csJGNvbCwkc2hlZXQpOwoJCS8vIFRyeSB0byBvdXRwdXQgdGhlIG1p
bmltYWwgcmVxdWlyZWQgc3R5bGUKCQlpZiAoJGJMZWZ0IT0iIiAmJiAkYkxlZnQ9PSRiUmln
aHQgJiYgJGJSaWdodD09JGJUb3AgJiYgJGJUb3A9PSRiQm90dG9tKSB7CgkJCSRjc3MgLj0g
ImJvcmRlcjoiIC4gJHRoaXMtPmxpbmVTdHlsZXNDc3NbJGJMZWZ0XSAuIjsiOwoJCX0KCQll
bHNlIHsKCQkJaWYgKCRiTGVmdCE9IiIpIHsgJGNzcyAuPSAiYm9yZGVyLWxlZnQ6IiAuICR0
aGlzLT5saW5lU3R5bGVzQ3NzWyRiTGVmdF0gLiI7IjsgfQoJCQlpZiAoJGJSaWdodCE9IiIp
IHsgJGNzcyAuPSAiYm9yZGVyLXJpZ2h0OiIgLiAkdGhpcy0+bGluZVN0eWxlc0Nzc1skYlJp
Z2h0XSAuIjsiOyB9CgkJCWlmICgkYlRvcCE9IiIpIHsgJGNzcyAuPSAiYm9yZGVyLXRvcDoi
IC4gJHRoaXMtPmxpbmVTdHlsZXNDc3NbJGJUb3BdIC4iOyI7IH0KCQkJaWYgKCRiQm90dG9t
IT0iIikgeyAkY3NzIC49ICJib3JkZXItYm90dG9tOiIgLiAkdGhpcy0+bGluZVN0eWxlc0Nz
c1skYkJvdHRvbV0gLiI7IjsgfQoJCX0KCQkvLyBPbmx5IG91dHB1dCBib3JkZXIgY29sb3Jz
IGlmIHRoZXJlIGlzIGFuIGFjdHVhbCBib3JkZXIgc3BlY2lmaWVkCgkJaWYgKCRiTGVmdCE9
IiIgJiYgJGJMZWZ0Q29sIT0iIikgeyAkY3NzIC49ICJib3JkZXItbGVmdC1jb2xvcjoiIC4g
JGJMZWZ0Q29sIC4iOyI7IH0KCQlpZiAoJGJSaWdodCE9IiIgJiYgJGJSaWdodENvbCE9IiIp
IHsgJGNzcyAuPSAiYm9yZGVyLXJpZ2h0LWNvbG9yOiIgLiAkYlJpZ2h0Q29sIC4iOyI7IH0K
CQlpZiAoJGJUb3AhPSIiICYmICRiVG9wQ29sIT0iIikgeyAkY3NzIC49ICJib3JkZXItdG9w
LWNvbG9yOiIgLiAkYlRvcENvbCAuICI7IjsgfQoJCWlmICgkYkJvdHRvbSE9IiIgJiYgJGJC
b3R0b21Db2whPSIiKSB7ICRjc3MgLj0gImJvcmRlci1ib3R0b20tY29sb3I6IiAuICRiQm90
dG9tQ29sIC4iOyI7IH0KCgkJcmV0dXJuICRjc3M7Cgl9CgoJLy8gRk9STUFUIFBST1BFUlRJ
RVMKCS8vID09PT09PT09PT09PT09PT09CglmdW5jdGlvbiBmb3JtYXQoJHJvdywkY29sLCRz
aGVldD0wKSB7CgkJcmV0dXJuICR0aGlzLT5pbmZvKCRyb3csJGNvbCwnZm9ybWF0Jywkc2hl
ZXQpOwoJfQoJZnVuY3Rpb24gZm9ybWF0SW5kZXgoJHJvdywkY29sLCRzaGVldD0wKSB7CgkJ
cmV0dXJuICR0aGlzLT5pbmZvKCRyb3csJGNvbCwnZm9ybWF0SW5kZXgnLCRzaGVldCk7Cgl9
CglmdW5jdGlvbiBmb3JtYXRDb2xvcigkcm93LCRjb2wsJHNoZWV0PTApIHsKCQlyZXR1cm4g
JHRoaXMtPmluZm8oJHJvdywkY29sLCdmb3JtYXRDb2xvcicsJHNoZWV0KTsKCX0KCgkvLyBD
RUxMIChYRikgUFJPUEVSVElFUwoJLy8gPT09PT09PT09PT09PT09PT09PT0KCWZ1bmN0aW9u
IHhmUmVjb3JkKCRyb3csJGNvbCwkc2hlZXQ9MCkgewoJCSR4ZkluZGV4ID0gJHRoaXMtPmlu
Zm8oJHJvdywkY29sLCd4ZkluZGV4Jywkc2hlZXQpOwoJCWlmICgkeGZJbmRleCE9IiIpIHsK
CQkJcmV0dXJuICR0aGlzLT54ZlJlY29yZHNbJHhmSW5kZXhdOwoJCX0KCQlyZXR1cm4gbnVs
bDsKCX0KCWZ1bmN0aW9uIHhmUHJvcGVydHkoJHJvdywkY29sLCRzaGVldCwkcHJvcCkgewoJ
CSR4ZlJlY29yZCA9ICR0aGlzLT54ZlJlY29yZCgkcm93LCRjb2wsJHNoZWV0KTsKCQlpZiAo
JHhmUmVjb3JkIT1udWxsKSB7CgkJCXJldHVybiAkeGZSZWNvcmRbJHByb3BdOwoJCX0KCQly
ZXR1cm4gIiI7Cgl9CglmdW5jdGlvbiBhbGlnbigkcm93LCRjb2wsJHNoZWV0PTApIHsKCQly
ZXR1cm4gJHRoaXMtPnhmUHJvcGVydHkoJHJvdywkY29sLCRzaGVldCwnYWxpZ24nKTsKCX0K
CWZ1bmN0aW9uIGJnQ29sb3IoJHJvdywkY29sLCRzaGVldD0wKSB7CgkJcmV0dXJuICR0aGlz
LT54ZlByb3BlcnR5KCRyb3csJGNvbCwkc2hlZXQsJ2JnQ29sb3InKTsKCX0KCWZ1bmN0aW9u
IGJvcmRlckxlZnQoJHJvdywkY29sLCRzaGVldD0wKSB7CgkJcmV0dXJuICR0aGlzLT54ZlBy
b3BlcnR5KCRyb3csJGNvbCwkc2hlZXQsJ2JvcmRlckxlZnQnKTsKCX0KCWZ1bmN0aW9uIGJv
cmRlclJpZ2h0KCRyb3csJGNvbCwkc2hlZXQ9MCkgewoJCXJldHVybiAkdGhpcy0+eGZQcm9w
ZXJ0eSgkcm93LCRjb2wsJHNoZWV0LCdib3JkZXJSaWdodCcpOwoJfQoJZnVuY3Rpb24gYm9y
ZGVyVG9wKCRyb3csJGNvbCwkc2hlZXQ9MCkgewoJCXJldHVybiAkdGhpcy0+eGZQcm9wZXJ0
eSgkcm93LCRjb2wsJHNoZWV0LCdib3JkZXJUb3AnKTsKCX0KCWZ1bmN0aW9uIGJvcmRlckJv
dHRvbSgkcm93LCRjb2wsJHNoZWV0PTApIHsKCQlyZXR1cm4gJHRoaXMtPnhmUHJvcGVydHko
JHJvdywkY29sLCRzaGVldCwnYm9yZGVyQm90dG9tJyk7Cgl9CglmdW5jdGlvbiBib3JkZXJM
ZWZ0Q29sb3IoJHJvdywkY29sLCRzaGVldD0wKSB7CgkJcmV0dXJuICR0aGlzLT5jb2xvcnNb
JHRoaXMtPnhmUHJvcGVydHkoJHJvdywkY29sLCRzaGVldCwnYm9yZGVyTGVmdENvbG9yJyld
OwoJfQoJZnVuY3Rpb24gYm9yZGVyUmlnaHRDb2xvcigkcm93LCRjb2wsJHNoZWV0PTApIHsK
CQlyZXR1cm4gJHRoaXMtPmNvbG9yc1skdGhpcy0+eGZQcm9wZXJ0eSgkcm93LCRjb2wsJHNo
ZWV0LCdib3JkZXJSaWdodENvbG9yJyldOwoJfQoJZnVuY3Rpb24gYm9yZGVyVG9wQ29sb3Io
JHJvdywkY29sLCRzaGVldD0wKSB7CgkJcmV0dXJuICR0aGlzLT5jb2xvcnNbJHRoaXMtPnhm
UHJvcGVydHkoJHJvdywkY29sLCRzaGVldCwnYm9yZGVyVG9wQ29sb3InKV07Cgl9CglmdW5j
dGlvbiBib3JkZXJCb3R0b21Db2xvcigkcm93LCRjb2wsJHNoZWV0PTApIHsKCQlyZXR1cm4g
JHRoaXMtPmNvbG9yc1skdGhpcy0+eGZQcm9wZXJ0eSgkcm93LCRjb2wsJHNoZWV0LCdib3Jk
ZXJCb3R0b21Db2xvcicpXTsKCX0KCgkvLyBGT05UIFBST1BFUlRJRVMKCS8vID09PT09PT09
PT09PT09PQoJZnVuY3Rpb24gZm9udFJlY29yZCgkcm93LCRjb2wsJHNoZWV0PTApIHsKCSAg
ICAkeGZSZWNvcmQgPSAkdGhpcy0+eGZSZWNvcmQoJHJvdywkY29sLCRzaGVldCk7CgkJaWYg
KCR4ZlJlY29yZCE9bnVsbCkgewoJCQkkZm9udCA9ICR4ZlJlY29yZFsnZm9udEluZGV4J107
CgkJCWlmICgkZm9udCE9bnVsbCkgewoJCQkJcmV0dXJuICR0aGlzLT5mb250UmVjb3Jkc1sk
Zm9udF07CgkJCX0KCQl9CgkJcmV0dXJuIG51bGw7Cgl9CglmdW5jdGlvbiBmb250UHJvcGVy
dHkoJHJvdywkY29sLCRzaGVldD0wLCRwcm9wKSB7CgkJJGZvbnQgPSAkdGhpcy0+Zm9udFJl
Y29yZCgkcm93LCRjb2wsJHNoZWV0KTsKCQlpZiAoJGZvbnQhPW51bGwpIHsKCQkJcmV0dXJu
ICRmb250WyRwcm9wXTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoJZnVuY3Rpb24gZm9udElu
ZGV4KCRyb3csJGNvbCwkc2hlZXQ9MCkgewoJCXJldHVybiAkdGhpcy0+eGZQcm9wZXJ0eSgk
cm93LCRjb2wsJHNoZWV0LCdmb250SW5kZXgnKTsKCX0KCWZ1bmN0aW9uIGNvbG9yKCRyb3cs
JGNvbCwkc2hlZXQ9MCkgewoJCSRmb3JtYXRDb2xvciA9ICR0aGlzLT5mb3JtYXRDb2xvcigk
cm93LCRjb2wsJHNoZWV0KTsKCQlpZiAoJGZvcm1hdENvbG9yIT0iIikgewoJCQlyZXR1cm4g
JGZvcm1hdENvbG9yOwoJCX0KCQkkY2kgPSAkdGhpcy0+Zm9udFByb3BlcnR5KCRyb3csJGNv
bCwkc2hlZXQsJ2NvbG9yJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRoaXMtPnJhd0Nv
bG9yKCRjaSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHJhd0NvbG9yKCRjaSkgewoJ
CWlmICgoJGNpIDw+IDB4N0ZGRikgJiYgKCRjaSA8PiAnJykpIHsKCQkJcmV0dXJuICR0aGlz
LT5jb2xvcnNbJGNpXTsKCQl9CgkJcmV0dXJuICIiOwoJfQoJZnVuY3Rpb24gYm9sZCgkcm93
LCRjb2wsJHNoZWV0PTApIHsKCQlyZXR1cm4gJHRoaXMtPmZvbnRQcm9wZXJ0eSgkcm93LCRj
b2wsJHNoZWV0LCdib2xkJyk7Cgl9CglmdW5jdGlvbiBpdGFsaWMoJHJvdywkY29sLCRzaGVl
dD0wKSB7CgkJcmV0dXJuICR0aGlzLT5mb250UHJvcGVydHkoJHJvdywkY29sLCRzaGVldCwn
aXRhbGljJyk7Cgl9CglmdW5jdGlvbiB1bmRlcmxpbmUoJHJvdywkY29sLCRzaGVldD0wKSB7
CgkJcmV0dXJuICR0aGlzLT5mb250UHJvcGVydHkoJHJvdywkY29sLCRzaGVldCwndW5kZXIn
KTsKCX0KCWZ1bmN0aW9uIGhlaWdodCgkcm93LCRjb2wsJHNoZWV0PTApIHsKCQlyZXR1cm4g
JHRoaXMtPmZvbnRQcm9wZXJ0eSgkcm93LCRjb2wsJHNoZWV0LCdoZWlnaHQnKTsKCX0KCWZ1
bmN0aW9uIGZvbnQoJHJvdywkY29sLCRzaGVldD0wKSB7CgkJcmV0dXJuICR0aGlzLT5mb250
UHJvcGVydHkoJHJvdywkY29sLCRzaGVldCwnZm9udCcpOwoJfQoKCS8vIERVTVAgQU4gSFRN
TCBUQUJMRSBPRiBUSEUgRU5USVJFIFhMUyBEQVRBCgkvLyA9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQoJZnVuY3Rpb24gZHVtcCgkcm93X251bWJlcnM9ZmFs
c2UsJGNvbF9sZXR0ZXJzPWZhbHNlLCRzaGVldD0wLCR0YWJsZV9jbGFzcz0nZXhjZWwnKSB7
CgkJJG91dCA9ICI8dGFibGUgY2xhc3M9XCIkdGFibGVfY2xhc3NcIiBjZWxsc3BhY2luZz0w
PiI7CgkJaWYgKCRjb2xfbGV0dGVycykgewoJCQkkb3V0IC49ICI8dGhlYWQ+XG5cdDx0cj4i
OwoJCQlpZiAoJHJvd19udW1iZXJzKSB7CgkJCQkkb3V0IC49ICJcblx0XHQ8dGg+Jm5ic3A8
L3RoPiI7CgkJCX0KCQkJZm9yKCRpPTE7JGk8PSR0aGlzLT5jb2xjb3VudCgkc2hlZXQpOyRp
KyspIHsKCQkJCSRzdHlsZSA9ICJ3aWR0aDoiIC4gKCR0aGlzLT5jb2x3aWR0aCgkaSwkc2hl
ZXQpKjEpIC4gInB4OyI7CgkJCQlpZiAoJHRoaXMtPmNvbGhpZGRlbigkaSwkc2hlZXQpKSB7
CgkJCQkJJHN0eWxlIC49ICJkaXNwbGF5Om5vbmU7IjsKCQkJCX0KCQkJCSRvdXQgLj0gIlxu
XHRcdDx0aCBzdHlsZT1cIiRzdHlsZVwiPiIgLiBzdHJ0b3VwcGVyKCR0aGlzLT5jb2xpbmRl
eGVzWyRpXSkgLiAiPC90aD4iOwoJCQl9CgkJCSRvdXQgLj0gIjwvdHI+PC90aGVhZD5cbiI7
CgkJfQoKCQkkb3V0IC49ICI8dGJvZHk+XG4iOwoJCWZvcigkcm93PTE7JHJvdzw9JHRoaXMt
PnJvd2NvdW50KCRzaGVldCk7JHJvdysrKSB7CgkJCSRyb3doZWlnaHQgPSAkdGhpcy0+cm93
aGVpZ2h0KCRyb3csJHNoZWV0KTsKCQkJJHN0eWxlID0gImhlaWdodDoiIC4gKCRyb3doZWln
aHQqKDQvMykpIC4gInB4OyI7CgkJCWlmICgkdGhpcy0+cm93aGlkZGVuKCRyb3csJHNoZWV0
KSkgewoJCQkJJHN0eWxlIC49ICJkaXNwbGF5Om5vbmU7IjsKCQkJfQoJCQkkb3V0IC49ICJc
blx0PHRyIHN0eWxlPVwiJHN0eWxlXCI+IjsKCQkJaWYgKCRyb3dfbnVtYmVycykgewoJCQkJ
JG91dCAuPSAiXG5cdFx0PHRoPiRyb3c8L3RoPiI7CgkJCX0KCQkJZm9yKCRjb2w9MTskY29s
PD0kdGhpcy0+Y29sY291bnQoJHNoZWV0KTskY29sKyspIHsKCQkJCS8vIEFjY291bnQgZm9y
IFJvd3NwYW5zL0NvbHNwYW5zCgkJCQkkcm93c3BhbiA9ICR0aGlzLT5yb3dzcGFuKCRyb3cs
JGNvbCwkc2hlZXQpOwoJCQkJJGNvbHNwYW4gPSAkdGhpcy0+Y29sc3Bhbigkcm93LCRjb2ws
JHNoZWV0KTsKCQkJCWZvcigkaT0wOyRpPCRyb3dzcGFuOyRpKyspIHsKCQkJCQlmb3IoJGo9
MDskajwkY29sc3BhbjskaisrKSB7CgkJCQkJCWlmICgkaT4wIHx8ICRqPjApIHsKCQkJCQkJ
CSR0aGlzLT5zaGVldHNbJHNoZWV0XVsnY2VsbHNJbmZvJ11bJHJvdyskaV1bJGNvbCskal1b
J2RvbnRwcmludCddPTE7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlpZighJHRoaXMtPnNo
ZWV0c1skc2hlZXRdWydjZWxsc0luZm8nXVskcm93XVskY29sXVsnZG9udHByaW50J10pIHsK
CQkJCQkkc3R5bGUgPSAkdGhpcy0+c3R5bGUoJHJvdywkY29sLCRzaGVldCk7CgkJCQkJaWYg
KCR0aGlzLT5jb2xoaWRkZW4oJGNvbCwkc2hlZXQpKSB7CgkJCQkJCSRzdHlsZSAuPSAiZGlz
cGxheTpub25lOyI7CgkJCQkJfQoJCQkJCSRvdXQgLj0gIlxuXHRcdDx0ZCBzdHlsZT1cIiRz
dHlsZVwiIiAuICgkY29sc3BhbiA+IDE/IiBjb2xzcGFuPSRjb2xzcGFuIjoiIikgLiAoJHJv
d3NwYW4gPiAxPyIgcm93c3Bhbj0kcm93c3BhbiI6IiIpIC4gIj4iOwoJCQkJCSR2YWwgPSAk
dGhpcy0+dmFsKCRyb3csJGNvbCwkc2hlZXQpOwoJCQkJCWlmICgkdmFsPT0nJykgeyAkdmFs
PSImbmJzcDsiOyB9CgkJCQkJZWxzZSB7CgkJCQkJCSR2YWwgPSBodG1sZW50aXRpZXMoJHZh
bCk7CgkJCQkJCSRsaW5rID0gJHRoaXMtPmh5cGVybGluaygkcm93LCRjb2wsJHNoZWV0KTsK
CQkJCQkJaWYgKCRsaW5rIT0nJykgewoJCQkJCQkJJHZhbCA9ICI8YSBocmVmPVwiJGxpbmtc
Ij4kdmFsPC9hPiI7CgkJCQkJCX0KCQkJCQl9CgkJCQkJJG91dCAuPSAiPG5vYnI+Ii5ubDJi
cigkdmFsKS4iPC9ub2JyPiI7CgkJCQkJJG91dCAuPSAiPC90ZD4iOwoJCQkJfQoJCQl9CgkJ
CSRvdXQgLj0gIjwvdHI+XG4iOwoJCX0KCQkkb3V0IC49ICI8L3Rib2R5PjwvdGFibGU+IjsK
CQlyZXR1cm4gJG91dDsKCX0KCgkvLyAtLS0tLS0tLS0tLS0tLQoJLy8gRU5EIFBVQkxJQyBB
UEkKCgoJdmFyICRib3VuZHNoZWV0cyA9IGFycmF5KCk7Cgl2YXIgJGZvcm1hdFJlY29yZHMg
PSBhcnJheSgpOwoJdmFyICRmb250UmVjb3JkcyA9IGFycmF5KCk7Cgl2YXIgJHhmUmVjb3Jk
cyA9IGFycmF5KCk7Cgl2YXIgJGNvbEluZm8gPSBhcnJheSgpOwogICAJdmFyICRyb3dJbmZv
ID0gYXJyYXkoKTsKCgl2YXIgJHNzdCA9IGFycmF5KCk7Cgl2YXIgJHNoZWV0cyA9IGFycmF5
KCk7CgoJdmFyICRkYXRhOwoJdmFyICRfb2xlOwoJdmFyICRfZGVmYXVsdEVuY29kaW5nID0g
IlVURi04IjsKCXZhciAkX2RlZmF1bHRGb3JtYXQgPSBTUFJFQURTSEVFVF9FWENFTF9SRUFE
RVJfREVGX05VTV9GT1JNQVQ7Cgl2YXIgJF9jb2x1bW5zRm9ybWF0ID0gYXJyYXkoKTsKCXZh
ciAkX3Jvd29mZnNldCA9IDE7Cgl2YXIgJF9jb2xvZmZzZXQgPSAxOwoKCS8qKgoJICogTGlz
dCBvZiBkZWZhdWx0IGRhdGUgZm9ybWF0cyB1c2VkIGJ5IEV4Y2VsCgkgKi8KCXZhciAkZGF0
ZUZvcm1hdHMgPSBhcnJheSAoCgkJMHhlID0+ICJtL2QvWSIsCgkJMHhmID0+ICJNLWQtWSIs
CgkJMHgxMCA9PiAiZC1NIiwKCQkweDExID0+ICJNLVkiLAoJCTB4MTIgPT4gImg6aSBhIiwK
CQkweDEzID0+ICJoOmk6cyBhIiwKCQkweDE0ID0+ICJIOmkiLAoJCTB4MTUgPT4gIkg6aTpz
IiwKCQkweDE2ID0+ICJkL20vWSBIOmkiLAoJCTB4MmQgPT4gImk6cyIsCgkJMHgyZSA9PiAi
SDppOnMiLAoJCTB4MmYgPT4gImk6cy5TIgoJKTsKCgkvKioKCSAqIERlZmF1bHQgbnVtYmVy
IGZvcm1hdHMgdXNlZCBieSBFeGNlbAoJICovCgl2YXIgJG51bWJlckZvcm1hdHMgPSBhcnJh
eSgKCQkweDEgPT4gIjAiLAoJCTB4MiA9PiAiMC4wMCIsCgkJMHgzID0+ICIjLCMjMCIsCgkJ
MHg0ID0+ICIjLCMjMC4wMCIsCgkJMHg1ID0+ICJcJCMsIyMwOyhcJCMsIyMwKSIsCgkJMHg2
ID0+ICJcJCMsIyMwO1tSZWRdKFwkIywjIzApIiwKCQkweDcgPT4gIlwkIywjIzAuMDA7KFwk
IywjIzAuMDApIiwKCQkweDggPT4gIlwkIywjIzAuMDA7W1JlZF0oXCQjLCMjMC4wMCkiLAoJ
CTB4OSA9PiAiMCUiLAoJCTB4YSA9PiAiMC4wMCUiLAoJCTB4YiA9PiAiMC4wMEUrMDAiLAoJ
CTB4MjUgPT4gIiMsIyMwOygjLCMjMCkiLAoJCTB4MjYgPT4gIiMsIyMwO1tSZWRdKCMsIyMw
KSIsCgkJMHgyNyA9PiAiIywjIzAuMDA7KCMsIyMwLjAwKSIsCgkJMHgyOCA9PiAiIywjIzAu
MDA7W1JlZF0oIywjIzAuMDApIiwKCQkweDI5ID0+ICIjLCMjMDsoIywjIzApIiwgIC8vIE5v
dCBleGFjdGx5CgkJMHgyYSA9PiAiXCQjLCMjMDsoXCQjLCMjMCkiLCAgLy8gTm90IGV4YWN0
bHkKCQkweDJiID0+ICIjLCMjMC4wMDsoIywjIzAuMDApIiwgIC8vIE5vdCBleGFjdGx5CgkJ
MHgyYyA9PiAiXCQjLCMjMC4wMDsoXCQjLCMjMC4wMCkiLCAgLy8gTm90IGV4YWN0bHkKCQkw
eDMwID0+ICIjIzAuMEUrMCIKCSk7CgogICAgdmFyICRjb2xvcnMgPSBBcnJheSgKICAgICAg
ICAweDAwID0+ICIjMDAwMDAwIiwKICAgICAgICAweDAxID0+ICIjRkZGRkZGIiwKICAgICAg
ICAweDAyID0+ICIjRkYwMDAwIiwKICAgICAgICAweDAzID0+ICIjMDBGRjAwIiwKICAgICAg
ICAweDA0ID0+ICIjMDAwMEZGIiwKICAgICAgICAweDA1ID0+ICIjRkZGRjAwIiwKICAgICAg
ICAweDA2ID0+ICIjRkYwMEZGIiwKICAgICAgICAweDA3ID0+ICIjMDBGRkZGIiwKICAgICAg
ICAweDA4ID0+ICIjMDAwMDAwIiwKICAgICAgICAweDA5ID0+ICIjRkZGRkZGIiwKICAgICAg
ICAweDBBID0+ICIjRkYwMDAwIiwKICAgICAgICAweDBCID0+ICIjMDBGRjAwIiwKICAgICAg
ICAweDBDID0+ICIjMDAwMEZGIiwKICAgICAgICAweDBEID0+ICIjRkZGRjAwIiwKICAgICAg
ICAweDBFID0+ICIjRkYwMEZGIiwKICAgICAgICAweDBGID0+ICIjMDBGRkZGIiwKICAgICAg
ICAweDEwID0+ICIjODAwMDAwIiwKICAgICAgICAweDExID0+ICIjMDA4MDAwIiwKICAgICAg
ICAweDEyID0+ICIjMDAwMDgwIiwKICAgICAgICAweDEzID0+ICIjODA4MDAwIiwKICAgICAg
ICAweDE0ID0+ICIjODAwMDgwIiwKICAgICAgICAweDE1ID0+ICIjMDA4MDgwIiwKICAgICAg
ICAweDE2ID0+ICIjQzBDMEMwIiwKICAgICAgICAweDE3ID0+ICIjODA4MDgwIiwKICAgICAg
ICAweDE4ID0+ICIjOTk5OUZGIiwKICAgICAgICAweDE5ID0+ICIjOTkzMzY2IiwKICAgICAg
ICAweDFBID0+ICIjRkZGRkNDIiwKICAgICAgICAweDFCID0+ICIjQ0NGRkZGIiwKICAgICAg
ICAweDFDID0+ICIjNjYwMDY2IiwKICAgICAgICAweDFEID0+ICIjRkY4MDgwIiwKICAgICAg
ICAweDFFID0+ICIjMDA2NkNDIiwKICAgICAgICAweDFGID0+ICIjQ0NDQ0ZGIiwKICAgICAg
ICAweDIwID0+ICIjMDAwMDgwIiwKICAgICAgICAweDIxID0+ICIjRkYwMEZGIiwKICAgICAg
ICAweDIyID0+ICIjRkZGRjAwIiwKICAgICAgICAweDIzID0+ICIjMDBGRkZGIiwKICAgICAg
ICAweDI0ID0+ICIjODAwMDgwIiwKICAgICAgICAweDI1ID0+ICIjODAwMDAwIiwKICAgICAg
ICAweDI2ID0+ICIjMDA4MDgwIiwKICAgICAgICAweDI3ID0+ICIjMDAwMEZGIiwKICAgICAg
ICAweDI4ID0+ICIjMDBDQ0ZGIiwKICAgICAgICAweDI5ID0+ICIjQ0NGRkZGIiwKICAgICAg
ICAweDJBID0+ICIjQ0NGRkNDIiwKICAgICAgICAweDJCID0+ICIjRkZGRjk5IiwKICAgICAg
ICAweDJDID0+ICIjOTlDQ0ZGIiwKICAgICAgICAweDJEID0+ICIjRkY5OUNDIiwKICAgICAg
ICAweDJFID0+ICIjQ0M5OUZGIiwKICAgICAgICAweDJGID0+ICIjRkZDQzk5IiwKICAgICAg
ICAweDMwID0+ICIjMzM2NkZGIiwKICAgICAgICAweDMxID0+ICIjMzNDQ0NDIiwKICAgICAg
ICAweDMyID0+ICIjOTlDQzAwIiwKICAgICAgICAweDMzID0+ICIjRkZDQzAwIiwKICAgICAg
ICAweDM0ID0+ICIjRkY5OTAwIiwKICAgICAgICAweDM1ID0+ICIjRkY2NjAwIiwKICAgICAg
ICAweDM2ID0+ICIjNjY2Njk5IiwKICAgICAgICAweDM3ID0+ICIjOTY5Njk2IiwKICAgICAg
ICAweDM4ID0+ICIjMDAzMzY2IiwKICAgICAgICAweDM5ID0+ICIjMzM5OTY2IiwKICAgICAg
ICAweDNBID0+ICIjMDAzMzAwIiwKICAgICAgICAweDNCID0+ICIjMzMzMzAwIiwKICAgICAg
ICAweDNDID0+ICIjOTkzMzAwIiwKICAgICAgICAweDNEID0+ICIjOTkzMzY2IiwKICAgICAg
ICAweDNFID0+ICIjMzMzMzk5IiwKICAgICAgICAweDNGID0+ICIjMzMzMzMzIiwKICAgICAg
ICAweDQwID0+ICIjMDAwMDAwIiwKICAgICAgICAweDQxID0+ICIjRkZGRkZGIiwKCiAgICAg
ICAgMHg0MyA9PiAiIzAwMDAwMCIsCiAgICAgICAgMHg0RCA9PiAiIzAwMDAwMCIsCiAgICAg
ICAgMHg0RSA9PiAiI0ZGRkZGRiIsCiAgICAgICAgMHg0RiA9PiAiIzAwMDAwMCIsCiAgICAg
ICAgMHg1MCA9PiAiI0ZGRkZGRiIsCiAgICAgICAgMHg1MSA9PiAiIzAwMDAwMCIsCgogICAg
ICAgIDB4N0ZGRiA9PiAiIzAwMDAwMCIKICAgICk7CgoJdmFyICRsaW5lU3R5bGVzID0gYXJy
YXkoCgkJMHgwMCA9PiAiIiwKCQkweDAxID0+ICJUaGluIiwKCQkweDAyID0+ICJNZWRpdW0i
LAoJCTB4MDMgPT4gIkRhc2hlZCIsCgkJMHgwNCA9PiAiRG90dGVkIiwKCQkweDA1ID0+ICJU
aGljayIsCgkJMHgwNiA9PiAiRG91YmxlIiwKCQkweDA3ID0+ICJIYWlyIiwKCQkweDA4ID0+
ICJNZWRpdW0gZGFzaGVkIiwKCQkweDA5ID0+ICJUaGluIGRhc2gtZG90dGVkIiwKCQkweDBB
ID0+ICJNZWRpdW0gZGFzaC1kb3R0ZWQiLAoJCTB4MEIgPT4gIlRoaW4gZGFzaC1kb3QtZG90
dGVkIiwKCQkweDBDID0+ICJNZWRpdW0gZGFzaC1kb3QtZG90dGVkIiwKCQkweDBEID0+ICJT
bGFudGVkIG1lZGl1bSBkYXNoLWRvdHRlZCIKCSk7CgoJdmFyICRsaW5lU3R5bGVzQ3NzID0g
YXJyYXkoCgkJIlRoaW4iID0+ICIxcHggc29saWQiLAoJCSJNZWRpdW0iID0+ICIycHggc29s
aWQiLAoJCSJEYXNoZWQiID0+ICIxcHggZGFzaGVkIiwKCQkiRG90dGVkIiA9PiAiMXB4IGRv
dHRlZCIsCgkJIlRoaWNrIiA9PiAiM3B4IHNvbGlkIiwKCQkiRG91YmxlIiA9PiAiZG91Ymxl
IiwKCQkiSGFpciIgPT4gIjFweCBzb2xpZCIsCgkJIk1lZGl1bSBkYXNoZWQiID0+ICIycHgg
ZGFzaGVkIiwKCQkiVGhpbiBkYXNoLWRvdHRlZCIgPT4gIjFweCBkYXNoZWQiLAoJCSJNZWRp
dW0gZGFzaC1kb3R0ZWQiID0+ICIycHggZGFzaGVkIiwKCQkiVGhpbiBkYXNoLWRvdC1kb3R0
ZWQiID0+ICIxcHggZGFzaGVkIiwKCQkiTWVkaXVtIGRhc2gtZG90LWRvdHRlZCIgPT4gIjJw
eCBkYXNoZWQiLAoJCSJTbGFudGVkIG1lZGl1bSBkYXNoLWRvdHRlIiA9PiAiMnB4IGRhc2hl
ZCIKCSk7CgoJZnVuY3Rpb24gcmVhZDE2Yml0c3RyaW5nKCRkYXRhLCAkc3RhcnQpIHsKCQkk
bGVuID0gMDsKCQl3aGlsZSAob3JkKCRkYXRhWyRzdGFydCArICRsZW5dKSArIG9yZCgkZGF0
YVskc3RhcnQgKyAkbGVuICsgMV0pID4gMCkgJGxlbisrOwoJCXJldHVybiBzdWJzdHIoJGRh
dGEsICRzdGFydCwgJGxlbik7Cgl9CgoJLy8gQURERUQgYnkgTWF0dCBLcnVzZSBmb3IgYmV0
dGVyIGZvcm1hdHRpbmcKCWZ1bmN0aW9uIF9mb3JtYXRfdmFsdWUoJGZvcm1hdCwkbnVtLCRm
KSB7CgkJLy8gNDk9PVRFWFQgZm9ybWF0CgkJLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9w
L3BocC1leGNlbC1yZWFkZXIvaXNzdWVzL2RldGFpbD9pZD03CgkJaWYgKCAoISRmICYmICRm
b3JtYXQ9PSIlcyIpIHx8ICgkZj09NDkpIHx8ICgkZm9ybWF0PT0iR0VORVJBTCIpICkgewoJ
CQlyZXR1cm4gYXJyYXkoJ3N0cmluZyc9PiRudW0sICdmb3JtYXRDb2xvcic9Pm51bGwpOwoJ
CX0KCgkJLy8gQ3VzdG9tIHBhdHRlcm4gY2FuIGJlIFBPU0lUSVZFO05FR0FUSVZFO1pFUk8K
CQkvLyBUaGUgInRleHQiIG9wdGlvbiBhcyA0dGggcGFyYW1ldGVyIGlzIG5vdCBoYW5kbGVk
CgkJJHBhcnRzID0gc3BsaXQoIjsiLCRmb3JtYXQpOwoJCSRwYXR0ZXJuID0gJHBhcnRzWzBd
OwoJCS8vIE5lZ2F0aXZlIHBhdHRlcm4KCQlpZiAoY291bnQoJHBhcnRzKT4yICYmICRudW09
PTApIHsKCQkJJHBhdHRlcm4gPSAkcGFydHNbMl07CgkJfQoJCS8vIFplcm8gcGF0dGVybgoJ
CWlmIChjb3VudCgkcGFydHMpPjEgJiYgJG51bTwwKSB7CgkJCSRwYXR0ZXJuID0gJHBhcnRz
WzFdOwoJCQkkbnVtID0gYWJzKCRudW0pOwoJCX0KCgkJJGNvbG9yID0gIiI7CgkJJG1hdGNo
ZXMgPSBhcnJheSgpOwoJCSRjb2xvcl9yZWdleCA9ICIvXlxbKEJMQUNLfEJMVUV8Q1lBTnxH
UkVFTnxNQUdFTlRBfFJFRHxXSElURXxZRUxMT1cpXF0vaSI7CgkJaWYgKHByZWdfbWF0Y2go
JGNvbG9yX3JlZ2V4LCRwYXR0ZXJuLCRtYXRjaGVzKSkgewoJCQkkY29sb3IgPSBzdHJ0b2xv
d2VyKCRtYXRjaGVzWzFdKTsKCQkJJHBhdHRlcm4gPSBwcmVnX3JlcGxhY2UoJGNvbG9yX3Jl
Z2V4LCIiLCRwYXR0ZXJuKTsKCQl9CgoJCS8vIEluIEV4Y2VsIGZvcm1hdHMsICJfIiBpcyB1
c2VkIHRvIGFkZCBzcGFjaW5nLCB3aGljaCB3ZSBjYW4ndCBkbyBpbiBIVE1MCgkJJHBhdHRl
cm4gPSBwcmVnX3JlcGxhY2UoIi9fLi8iLCIiLCRwYXR0ZXJuKTsKCgkJLy8gU29tZSBub24t
bnVtYmVyIGNoYXJhY3RlcnMgYXJlIGVzY2FwZWQgd2l0aCBcLCB3aGljaCB3ZSBkb24ndCBu
ZWVkCgkJJHBhdHRlcm4gPSBwcmVnX3JlcGxhY2UoIi9cXFwvIiwiIiwkcGF0dGVybik7CgoJ
CS8vIFNvbWUgbm9uLW51bWJlciBzdHJpbmdzIGFyZSBxdW90ZWQsIHNvIHdlJ2xsIGdldCBy
aWQgb2YgdGhlIHF1b3RlcwoJCSRwYXR0ZXJuID0gcHJlZ19yZXBsYWNlKCIvXCIvIiwiIiwk
cGF0dGVybik7CgoJCS8vIFRFTVBPUkFSWSAtIENvbnZlcnQgIyB0byAwCgkJJHBhdHRlcm4g
PSBwcmVnX3JlcGxhY2UoIi9cIy8iLCIwIiwkcGF0dGVybik7CgoJCS8vIEZpbmQgb3V0IGlm
IHdlIG5lZWQgY29tbWEgZm9ybWF0dGluZwoJCSRoYXNfY29tbWFzID0gcHJlZ19tYXRjaCgi
LywvIiwkcGF0dGVybik7CgkJaWYgKCRoYXNfY29tbWFzKSB7CgkJCSRwYXR0ZXJuID0gcHJl
Z19yZXBsYWNlKCIvLC8iLCIiLCRwYXR0ZXJuKTsKCQl9CgoJCS8vIEhhbmRsZSBQZXJjZW50
YWdlcwoJCWlmIChwcmVnX21hdGNoKCIvXGQoXCUpKFteXCVdfCQpLyIsJHBhdHRlcm4sJG1h
dGNoZXMpKSB7CgkJCSRudW0gPSAkbnVtICogMTAwOwoJCQkkcGF0dGVybiA9IHByZWdfcmVw
bGFjZSgiLyhcZCkoXCUpKFteXCVdfCQpLyIsIiQxJSQzIiwkcGF0dGVybik7CgkJfQoKCQkv
LyBIYW5kbGUgdGhlIG51bWJlciBpdHNlbGYKCQkkbnVtYmVyX3JlZ2V4ID0gIi8oXGQrKShc
Lj8pKFxkKikvIjsKCQlpZiAocHJlZ19tYXRjaCgkbnVtYmVyX3JlZ2V4LCRwYXR0ZXJuLCRt
YXRjaGVzKSkgewoJCQkkbGVmdCA9ICRtYXRjaGVzWzFdOwoJCQkkZGVjID0gJG1hdGNoZXNb
Ml07CgkJCSRyaWdodCA9ICRtYXRjaGVzWzNdOwoJCQlpZiAoJGhhc19jb21tYXMpIHsKCQkJ
CSRmb3JtYXR0ZWQgPSBudW1iZXJfZm9ybWF0KCRudW0sc3RybGVuKCRyaWdodCkpOwoJCQl9
CgkJCWVsc2UgewoJCQkJJHNwcmludGZfcGF0dGVybiA9ICIlMS4iLnN0cmxlbigkcmlnaHQp
LiJmIjsKCQkJCSRmb3JtYXR0ZWQgPSBzcHJpbnRmKCRzcHJpbnRmX3BhdHRlcm4sICRudW0p
OwoJCQl9CgkJCSRwYXR0ZXJuID0gcHJlZ19yZXBsYWNlKCRudW1iZXJfcmVnZXgsICRmb3Jt
YXR0ZWQsICRwYXR0ZXJuKTsKCQl9CgoJCXJldHVybiBhcnJheSgKCQkJJ3N0cmluZyc9PiRw
YXR0ZXJuLAoJCQknZm9ybWF0Q29sb3InPT4kY29sb3IKCQkpOwoJfQoKCS8qKgoJICogQ29u
c3RydWN0b3IKCSAqCgkgKiBTb21lIGJhc2ljIGluaXRpYWxpc2F0aW9uCgkgKi8KCWZ1bmN0
aW9uIFNwcmVhZHNoZWV0X0V4Y2VsX1JlYWRlcigkZmlsZT0nJywkc3RvcmVfZXh0ZW5kZWRf
aW5mbz10cnVlLCRvdXRwdXRFbmNvZGluZz0nJykgewoJCSR0aGlzLT5fb2xlID0mIG5ldyBP
TEVSZWFkKCk7CgkJJHRoaXMtPnNldFVURkVuY29kZXIoJ2ljb252Jyk7CgkJaWYgKCRvdXRw
dXRFbmNvZGluZyAhPSAnJykgewoJCQkkdGhpcy0+c2V0T3V0cHV0RW5jb2RpbmcoJG91dHB1
dEVuY29kaW5nKTsKCQl9CgkJZm9yICgkaT0xOyAkaTwyNDU7ICRpKyspIHsKCQkJJG5hbWUg
PSBzdHJ0b2xvd2VyKCggKCgkaS0xKS8yNj49MSk/Y2hyKCgkaS0xKS8yNis2NCk6JycpIC4g
Y2hyKCgkaS0xKSUyNis2NSkpOwoJCQkkdGhpcy0+Y29sbmFtZXNbJG5hbWVdID0gJGk7CgkJ
CSR0aGlzLT5jb2xpbmRleGVzWyRpXSA9ICRuYW1lOwoJCX0KCQkkdGhpcy0+c3RvcmVfZXh0
ZW5kZWRfaW5mbyA9ICRzdG9yZV9leHRlbmRlZF9pbmZvOwoJCWlmICgkZmlsZSE9IiIpIHsK
CQkJJHRoaXMtPnJlYWQoJGZpbGUpOwoJCX0KCX0KCgkvKioKCSAqIFNldCB0aGUgZW5jb2Rp
bmcgbWV0aG9kCgkgKi8KCWZ1bmN0aW9uIHNldE91dHB1dEVuY29kaW5nKCRlbmNvZGluZykg
ewoJCSR0aGlzLT5fZGVmYXVsdEVuY29kaW5nID0gJGVuY29kaW5nOwoJfQoKCS8qKgoJICog
ICRlbmNvZGVyID0gJ2ljb252JyBvciAnbWInCgkgKiAgc2V0IGljb252IGlmIHlvdSB3b3Vs
ZCBsaWtlIHVzZSAnaWNvbnYnIGZvciBlbmNvZGUgVVRGLTE2TEUgdG8geW91ciBlbmNvZGlu
ZwoJICogIHNldCBtYiBpZiB5b3Ugd291bGQgbGlrZSB1c2UgJ21iX2NvbnZlcnRfZW5jb2Rp
bmcnIGZvciBlbmNvZGUgVVRGLTE2TEUgdG8geW91ciBlbmNvZGluZwoJICovCglmdW5jdGlv
biBzZXRVVEZFbmNvZGVyKCRlbmNvZGVyID0gJ2ljb252JykgewoJCSR0aGlzLT5fZW5jb2Rl
ckZ1bmN0aW9uID0gJyc7CgkJaWYgKCRlbmNvZGVyID09ICdpY29udicpIHsKCQkJJHRoaXMt
Pl9lbmNvZGVyRnVuY3Rpb24gPSBmdW5jdGlvbl9leGlzdHMoJ2ljb252JykgPyAnaWNvbnYn
IDogJyc7CgkJfSBlbHNlaWYgKCRlbmNvZGVyID09ICdtYicpIHsKCQkJJHRoaXMtPl9lbmNv
ZGVyRnVuY3Rpb24gPSBmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfZW5jb2RpbmcnKSA/
ICdtYl9jb252ZXJ0X2VuY29kaW5nJyA6ICcnOwoJCX0KCX0KCglmdW5jdGlvbiBzZXRSb3dD
b2xPZmZzZXQoJGlPZmZzZXQpIHsKCQkkdGhpcy0+X3Jvd29mZnNldCA9ICRpT2Zmc2V0OwoJ
CSR0aGlzLT5fY29sb2Zmc2V0ID0gJGlPZmZzZXQ7Cgl9CgoJLyoqCgkgKiBTZXQgdGhlIGRl
ZmF1bHQgbnVtYmVyIGZvcm1hdAoJICovCglmdW5jdGlvbiBzZXREZWZhdWx0Rm9ybWF0KCRz
Rm9ybWF0KSB7CgkJJHRoaXMtPl9kZWZhdWx0Rm9ybWF0ID0gJHNGb3JtYXQ7Cgl9CgoJLyoq
CgkgKiBGb3JjZSBhIGNvbHVtbiB0byB1c2UgYSBjZXJ0YWluIGZvcm1hdAoJICovCglmdW5j
dGlvbiBzZXRDb2x1bW5Gb3JtYXQoJGNvbHVtbiwgJHNGb3JtYXQpIHsKCQkkdGhpcy0+X2Nv
bHVtbnNGb3JtYXRbJGNvbHVtbl0gPSAkc0Zvcm1hdDsKCX0KCgkvKioKCSAqIFJlYWQgdGhl
IHNwcmVhZHNoZWV0IGZpbGUgdXNpbmcgT0xFLCB0aGVuIHBhcnNlCgkgKi8KCWZ1bmN0aW9u
IHJlYWQoJHNGaWxlTmFtZSkgewoJCSRyZXMgPSAkdGhpcy0+X29sZS0+cmVhZCgkc0ZpbGVO
YW1lKTsKCgkJLy8gb29wcywgc29tZXRoaW5nIGdvZXMgd3JvbmcgKERhcmtvIE1pbGphbm92
aWMpCgkJaWYoJHJlcyA9PT0gZmFsc2UpIHsKCQkJLy8gY2hlY2sgZXJyb3IgY29kZQoJCQlp
ZigkdGhpcy0+X29sZS0+ZXJyb3IgPT0gMSkgewoJCQkJLy8gYmFkIGZpbGUKCQkJCWRpZSgn
VGhlIGZpbGVuYW1lICcgLiAkc0ZpbGVOYW1lIC4gJyBpcyBub3QgcmVhZGFibGUnKTsKCQkJ
fQoJCQkvLyBjaGVjayBvdGhlciBlcnJvciBjb2RlcyBoZXJlIChlZyBiYWQgZmlsZWZvcm1h
dCwgZXRjLi4uKQoJCX0KCQkkdGhpcy0+ZGF0YSA9ICR0aGlzLT5fb2xlLT5nZXRXb3JrQm9v
aygpOwoJCSR0aGlzLT5fcGFyc2UoKTsKCX0KCgkvKioKCSAqIFBhcnNlIGEgd29ya2Jvb2sK
CSAqCgkgKiBAYWNjZXNzIHByaXZhdGUKCSAqIEByZXR1cm4gYm9vbAoJICovCglmdW5jdGlv
biBfcGFyc2UoKSB7CgkJJHBvcyA9IDA7CgkJJGRhdGEgPSAkdGhpcy0+ZGF0YTsKCgkJJGNv
ZGUgPSB2KCRkYXRhLCRwb3MpOwoJCSRsZW5ndGggPSB2KCRkYXRhLCRwb3MrMik7CgkJJHZl
cnNpb24gPSB2KCRkYXRhLCRwb3MrNCk7CgkJJHN1YnN0cmVhbVR5cGUgPSB2KCRkYXRhLCRw
b3MrNik7CgoJCSR0aGlzLT52ZXJzaW9uID0gJHZlcnNpb247CgoJCWlmICgoJHZlcnNpb24g
IT0gU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX0JJRkY4KSAmJgoJCQkoJHZlcnNpb24gIT0g
U1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX0JJRkY3KSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJ
fQoKCQlpZiAoJHN1YnN0cmVhbVR5cGUgIT0gU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1dP
UktCT09LR0xPQkFMUyl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCSRwb3MgKz0gJGxlbmd0
aCArIDQ7CgoJCSRjb2RlID0gdigkZGF0YSwkcG9zKTsKCQkkbGVuZ3RoID0gdigkZGF0YSwk
cG9zKzIpOwoKCQl3aGlsZSAoJGNvZGUgIT0gU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZ
UEVfRU9GKSB7CgkJCXN3aXRjaCAoJGNvZGUpIHsKCQkJCWNhc2UgU1BSRUFEU0hFRVRfRVhD
RUxfUkVBREVSX1RZUEVfU1NUOgoJCQkJCSRzcG9zID0gJHBvcyArIDQ7CgkJCQkJJGxpbWl0
cG9zID0gJHNwb3MgKyAkbGVuZ3RoOwoJCQkJCSR1bmlxdWVTdHJpbmdzID0gJHRoaXMtPl9H
ZXRJbnQ0ZCgkZGF0YSwgJHNwb3MrNCk7CgkJCQkJJHNwb3MgKz0gODsKCQkJCQlmb3IgKCRp
ID0gMDsgJGkgPCAkdW5pcXVlU3RyaW5nczsgJGkrKykgewoJCQkJCQkvLyBSZWFkIGluIHRo
ZSBudW1iZXIgb2YgY2hhcmFjdGVycwoJCQkJCQlpZiAoJHNwb3MgPT0gJGxpbWl0cG9zKSB7
CgkJCQkJCQkkb3Bjb2RlID0gdigkZGF0YSwkc3Bvcyk7CgkJCQkJCQkkY29ubGVuZ3RoID0g
digkZGF0YSwkc3BvcysyKTsKCQkJCQkJCWlmICgkb3Bjb2RlICE9IDB4M2MpIHsKCQkJCQkJ
CQlyZXR1cm4gLTE7CgkJCQkJCQl9CgkJCQkJCQkkc3BvcyArPSA0OwoJCQkJCQkJJGxpbWl0
cG9zID0gJHNwb3MgKyAkY29ubGVuZ3RoOwoJCQkJCQl9CgkJCQkJCSRudW1DaGFycyA9IG9y
ZCgkZGF0YVskc3Bvc10pIHwgKG9yZCgkZGF0YVskc3BvcysxXSkgPDwgOCk7CgkJCQkJCSRz
cG9zICs9IDI7CgkJCQkJCSRvcHRpb25GbGFncyA9IG9yZCgkZGF0YVskc3Bvc10pOwoJCQkJ
CQkkc3BvcysrOwoJCQkJCQkkYXNjaWlFbmNvZGluZyA9ICgoJG9wdGlvbkZsYWdzICYgMHgw
MSkgPT0gMCkgOwoJCQkJCQkkZXh0ZW5kZWRTdHJpbmcgPSAoICgkb3B0aW9uRmxhZ3MgJiAw
eDA0KSAhPSAwKTsKCgkJCQkJCS8vIFNlZSBpZiBzdHJpbmcgY29udGFpbnMgZm9ybWF0dGlu
ZyBpbmZvcm1hdGlvbgoJCQkJCQkkcmljaFN0cmluZyA9ICggKCRvcHRpb25GbGFncyAmIDB4
MDgpICE9IDApOwoKCQkJCQkJaWYgKCRyaWNoU3RyaW5nKSB7CgkJCQkJCQkvLyBSZWFkIGlu
IHRoZSBjcnVuCgkJCQkJCQkkZm9ybWF0dGluZ1J1bnMgPSB2KCRkYXRhLCRzcG9zKTsKCQkJ
CQkJCSRzcG9zICs9IDI7CgkJCQkJCX0KCgkJCQkJCWlmICgkZXh0ZW5kZWRTdHJpbmcpIHsK
CQkJCQkJCS8vIFJlYWQgaW4gY2NoRXh0UnN0CgkJCQkJCQkkZXh0ZW5kZWRSdW5MZW5ndGgg
PSAkdGhpcy0+X0dldEludDRkKCRkYXRhLCAkc3Bvcyk7CgkJCQkJCQkkc3BvcyArPSA0OwoJ
CQkJCQl9CgoJCQkJCQkkbGVuID0gKCRhc2NpaUVuY29kaW5nKT8gJG51bUNoYXJzIDogJG51
bUNoYXJzKjI7CgkJCQkJCWlmICgkc3BvcyArICRsZW4gPCAkbGltaXRwb3MpIHsKCQkJCQkJ
CSRyZXRzdHIgPSBzdWJzdHIoJGRhdGEsICRzcG9zLCAkbGVuKTsKCQkJCQkJCSRzcG9zICs9
ICRsZW47CgkJCQkJCX0KCQkJCQkJZWxzZXsKCQkJCQkJCS8vIGZvdW5kIGNvdW50aW51ZQoJ
CQkJCQkJJHJldHN0ciA9IHN1YnN0cigkZGF0YSwgJHNwb3MsICRsaW1pdHBvcyAtICRzcG9z
KTsKCQkJCQkJCSRieXRlc1JlYWQgPSAkbGltaXRwb3MgLSAkc3BvczsKCQkJCQkJCSRjaGFy
c0xlZnQgPSAkbnVtQ2hhcnMgLSAoKCRhc2NpaUVuY29kaW5nKSA/ICRieXRlc1JlYWQgOiAo
JGJ5dGVzUmVhZCAvIDIpKTsKCQkJCQkJCSRzcG9zID0gJGxpbWl0cG9zOwoKCQkJCQkJCXdo
aWxlICgkY2hhcnNMZWZ0ID4gMCl7CgkJCQkJCQkJJG9wY29kZSA9IHYoJGRhdGEsJHNwb3Mp
OwoJCQkJCQkJCSRjb25sZW5ndGggPSB2KCRkYXRhLCRzcG9zKzIpOwoJCQkJCQkJCWlmICgk
b3Bjb2RlICE9IDB4M2MpIHsKCQkJCQkJCQkJcmV0dXJuIC0xOwoJCQkJCQkJCX0KCQkJCQkJ
CQkkc3BvcyArPSA0OwoJCQkJCQkJCSRsaW1pdHBvcyA9ICRzcG9zICsgJGNvbmxlbmd0aDsK
CQkJCQkJCQkkb3B0aW9uID0gb3JkKCRkYXRhWyRzcG9zXSk7CgkJCQkJCQkJJHNwb3MgKz0g
MTsKCQkJCQkJCQlpZiAoJGFzY2lpRW5jb2RpbmcgJiYgKCRvcHRpb24gPT0gMCkpIHsKCQkJ
CQkJCQkJJGxlbiA9IG1pbigkY2hhcnNMZWZ0LCAkbGltaXRwb3MgLSAkc3Bvcyk7IC8vIG1p
bigkY2hhcnNMZWZ0LCAkY29ubGVuZ3RoKTsKCQkJCQkJCQkJJHJldHN0ciAuPSBzdWJzdHIo
JGRhdGEsICRzcG9zLCAkbGVuKTsKCQkJCQkJCQkJJGNoYXJzTGVmdCAtPSAkbGVuOwoJCQkJ
CQkJCQkkYXNjaWlFbmNvZGluZyA9IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2VpZiAo
ISRhc2NpaUVuY29kaW5nICYmICgkb3B0aW9uICE9IDApKSB7CgkJCQkJCQkJCSRsZW4gPSBt
aW4oJGNoYXJzTGVmdCAqIDIsICRsaW1pdHBvcyAtICRzcG9zKTsgLy8gbWluKCRjaGFyc0xl
ZnQsICRjb25sZW5ndGgpOwoJCQkJCQkJCQkkcmV0c3RyIC49IHN1YnN0cigkZGF0YSwgJHNw
b3MsICRsZW4pOwoJCQkJCQkJCQkkY2hhcnNMZWZ0IC09ICRsZW4vMjsKCQkJCQkJCQkJJGFz
Y2lpRW5jb2RpbmcgPSBmYWxzZTsKCQkJCQkJCQl9CgkJCQkJCQkJZWxzZWlmICghJGFzY2lp
RW5jb2RpbmcgJiYgKCRvcHRpb24gPT0gMCkpIHsKCQkJCQkJCQkJLy8gQnVtbWVyIC0gdGhl
IHN0cmluZyBzdGFydHMgb2ZmIGFzIFVuaWNvZGUsIGJ1dCBhZnRlciB0aGUKCQkJCQkJCQkJ
Ly8gY29udGludWF0aW9uIGl0IGlzIGluIHN0cmFpZ2h0Zm9yd2FyZCBBU0NJSSBlbmNvZGlu
ZwoJCQkJCQkJCQkkbGVuID0gbWluKCRjaGFyc0xlZnQsICRsaW1pdHBvcyAtICRzcG9zKTsg
Ly8gbWluKCRjaGFyc0xlZnQsICRjb25sZW5ndGgpOwoJCQkJCQkJCQlmb3IgKCRqID0gMDsg
JGogPCAkbGVuOyAkaisrKSB7CgkJCQkJCQkJCQkkcmV0c3RyIC49ICRkYXRhWyRzcG9zICsg
JGpdLmNocigwKTsKCQkJCQkJCQkJfQoJCQkJCQkJCQkkY2hhcnNMZWZ0IC09ICRsZW47CgkJ
CQkJCQkJCSRhc2NpaUVuY29kaW5nID0gZmFsc2U7CgkJCQkJCQkJfQoJCQkJCQkJCWVsc2V7
CgkJCQkJCQkJCSRuZXdzdHIgPSAnJzsKCQkJCQkJCQkJZm9yICgkaiA9IDA7ICRqIDwgc3Ry
bGVuKCRyZXRzdHIpOyAkaisrKSB7CgkJCQkJCQkJCQkkbmV3c3RyID0gJHJldHN0clskal0u
Y2hyKDApOwoJCQkJCQkJCQl9CgkJCQkJCQkJCSRyZXRzdHIgPSAkbmV3c3RyOwoJCQkJCQkJ
CQkkbGVuID0gbWluKCRjaGFyc0xlZnQgKiAyLCAkbGltaXRwb3MgLSAkc3Bvcyk7IC8vIG1p
bigkY2hhcnNMZWZ0LCAkY29ubGVuZ3RoKTsKCQkJCQkJCQkJJHJldHN0ciAuPSBzdWJzdHIo
JGRhdGEsICRzcG9zLCAkbGVuKTsKCQkJCQkJCQkJJGNoYXJzTGVmdCAtPSAkbGVuLzI7CgkJ
CQkJCQkJCSRhc2NpaUVuY29kaW5nID0gZmFsc2U7CgkJCQkJCQkJfQoJCQkJCQkJCSRzcG9z
ICs9ICRsZW47CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJJHJldHN0ciA9ICgkYXNjaWlFbmNv
ZGluZykgPyAkcmV0c3RyIDogJHRoaXMtPl9lbmNvZGVVVEYxNigkcmV0c3RyKTsKCgkJCQkJ
CWlmICgkcmljaFN0cmluZyl7CgkJCQkJCQkkc3BvcyArPSA0ICogJGZvcm1hdHRpbmdSdW5z
OwoJCQkJCQl9CgoJCQkJCQkvLyBGb3IgZXh0ZW5kZWQgc3RyaW5ncywgc2tpcCBvdmVyIHRo
ZSBleHRlbmRlZCBzdHJpbmcgZGF0YQoJCQkJCQlpZiAoJGV4dGVuZGVkU3RyaW5nKSB7CgkJ
CQkJCQkkc3BvcyArPSAkZXh0ZW5kZWRSdW5MZW5ndGg7CgkJCQkJCX0KCQkJCQkJJHRoaXMt
PnNzdFtdPSRyZXRzdHI7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSBTUFJFQURTSEVF
VF9FWENFTF9SRUFERVJfVFlQRV9GSUxFUEFTUzoKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJ
YnJlYWs7CgkJCQljYXNlIFNQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9UWVBFX05BTUU6CgkJ
CQkJYnJlYWs7CgkJCQljYXNlIFNQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9UWVBFX0ZPUk1B
VDoKCQkJCQkkaW5kZXhDb2RlID0gdigkZGF0YSwkcG9zKzQpOwoJCQkJCWlmICgkdmVyc2lv
biA9PSBTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfQklGRjgpIHsKCQkJCQkJJG51bWNoYXJz
ID0gdigkZGF0YSwkcG9zKzYpOwoJCQkJCQlpZiAob3JkKCRkYXRhWyRwb3MrOF0pID09IDAp
ewoJCQkJCQkJJGZvcm1hdFN0cmluZyA9IHN1YnN0cigkZGF0YSwgJHBvcys5LCAkbnVtY2hh
cnMpOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJGZvcm1hdFN0cmluZyA9IHN1YnN0cigkZGF0
YSwgJHBvcys5LCAkbnVtY2hhcnMqMik7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQkk
bnVtY2hhcnMgPSBvcmQoJGRhdGFbJHBvcys2XSk7CgkJCQkJCSRmb3JtYXRTdHJpbmcgPSBz
dWJzdHIoJGRhdGEsICRwb3MrNywgJG51bWNoYXJzKjIpOwoJCQkJCX0KCQkJCQkkdGhpcy0+
Zm9ybWF0UmVjb3Jkc1skaW5kZXhDb2RlXSA9ICRmb3JtYXRTdHJpbmc7CgkJCQkJYnJlYWs7
CgkJCQljYXNlIFNQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9UWVBFX0ZPTlQ6CgkJCQkJCSRo
ZWlnaHQgPSB2KCRkYXRhLCRwb3MrNCk7CgkJCQkJCSRvcHRpb24gPSB2KCRkYXRhLCRwb3Mr
Nik7CgkJCQkJCSRjb2xvciA9IHYoJGRhdGEsJHBvcys4KTsKCQkJCQkJJHdlaWdodCA9IHYo
JGRhdGEsJHBvcysxMCk7CgkJCQkJCSR1bmRlciAgPSBvcmQoJGRhdGFbJHBvcysxNF0pOwoJ
CQkJCQkkZm9udCA9ICIiOwoJCQkJCQkvLyBGb250IG5hbWUKCQkJCQkJJG51bWNoYXJzID0g
b3JkKCRkYXRhWyRwb3MrMThdKTsKCQkJCQkJaWYgKChvcmQoJGRhdGFbJHBvcysxOV0pICYg
MSkgPT0gMCl7CgkJCQkJCSAgICAkZm9udCA9IHN1YnN0cigkZGF0YSwgJHBvcysyMCwgJG51
bWNoYXJzKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJICAgICRmb250ID0gc3Vic3RyKCRkYXRh
LCAkcG9zKzIwLCAkbnVtY2hhcnMqMik7CgkJCQkJCSAgICAkZm9udCA9ICAkdGhpcy0+X2Vu
Y29kZVVURjE2KCRmb250KTsKCQkJCQkJfQoJCQkJCQkkdGhpcy0+Zm9udFJlY29yZHNbXSA9
IGFycmF5KAoJCQkJCQkJCSdoZWlnaHQnID0+ICRoZWlnaHQgLyAyMCwKCQkJCQkJCQknaXRh
bGljJyA9PiAhISgkb3B0aW9uICYgMiksCgkJCQkJCQkJJ2NvbG9yJyA9PiAkY29sb3IsCgkJ
CQkJCQkJJ3VuZGVyJyA9PiAhKCR1bmRlcj09MCksCgkJCQkJCQkJJ2JvbGQnID0+ICgkd2Vp
Z2h0PT03MDApLAoJCQkJCQkJCSdmb250JyA9PiAkZm9udCwKCQkJCQkJCQkncmF3JyA9PiAk
dGhpcy0+ZHVtcEhleERhdGEoJGRhdGEsICRwb3MrMywgJGxlbmd0aCkKCQkJCQkJCQkpOwoJ
CQkJCSAgICBicmVhazsKCgkJCQljYXNlIFNQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9UWVBF
X1BBTEVUVEU6CgkJCQkJCSRjb2xvcnMgPSBvcmQoJGRhdGFbJHBvcys0XSkgfCBvcmQoJGRh
dGFbJHBvcys1XSkgPDwgODsKCQkJCQkJZm9yICgkY29saSA9IDA7ICRjb2xpIDwgJGNvbG9y
czsgJGNvbGkrKykgewoJCQkJCQkgICAgJGNvbE9mZiA9ICRwb3MgKyAyICsgKCRjb2xpICog
NCk7CiAgCQkJCQkJICAgICRjb2xyID0gb3JkKCRkYXRhWyRjb2xPZmZdKTsKICAJCQkJCQkg
ICAgJGNvbGcgPSBvcmQoJGRhdGFbJGNvbE9mZisxXSk7CiAgCQkJCQkJICAgICRjb2xiID0g
b3JkKCRkYXRhWyRjb2xPZmYrMl0pOwoJCQkJCQkJJHRoaXMtPmNvbG9yc1sweDA3ICsgJGNv
bGldID0gJyMnIC4gJHRoaXMtPm15aGV4KCRjb2xyKSAuICR0aGlzLT5teWhleCgkY29sZykg
LiAkdGhpcy0+bXloZXgoJGNvbGIpOwoJCQkJCQl9CgkJCQkJICAgIGJyZWFrOwoKCQkJCWNh
c2UgU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfWEY6CgkJCQkJCSRmb250SW5kZXhD
b2RlID0gKG9yZCgkZGF0YVskcG9zKzRdKSB8IG9yZCgkZGF0YVskcG9zKzVdKSA8PCA4KSAt
IDE7CgkJCQkJCSRmb250SW5kZXhDb2RlID0gbWF4KDAsJGZvbnRJbmRleENvZGUpOwoJCQkJ
CQkkaW5kZXhDb2RlID0gb3JkKCRkYXRhWyRwb3MrNl0pIHwgb3JkKCRkYXRhWyRwb3MrN10p
IDw8IDg7CgkJCQkJCSRhbGlnbmJpdCA9IG9yZCgkZGF0YVskcG9zKzEwXSkgJiAzOwoJCQkJ
CQkkYmdpID0gKG9yZCgkZGF0YVskcG9zKzIyXSkgfCBvcmQoJGRhdGFbJHBvcysyM10pIDw8
IDgpICYgMHgzRkZGOwoJCQkJCQkkYmdjb2xvciA9ICgkYmdpICYgMHg3Rik7Ci8vCQkJCQkJ
JGJnY29sb3IgPSAoJGJnaSAmIDB4M2Y4MCkgPj4gNzsKCQkJCQkJJGFsaWduID0gIiI7CgkJ
CQkJCWlmICgkYWxpZ25iaXQ9PTMpIHsgJGFsaWduPSJyaWdodCI7IH0KCQkJCQkJaWYgKCRh
bGlnbmJpdD09MikgeyAkYWxpZ249ImNlbnRlciI7IH0KCgkJCQkJCSRmaWxsUGF0dGVybiA9
IChvcmQoJGRhdGFbJHBvcysyMV0pICYgMHhGQykgPj4gMjsKCQkJCQkJaWYgKCRmaWxsUGF0
dGVybiA9PSAwKSB7CgkJCQkJCQkkYmdjb2xvciA9ICIiOwoJCQkJCQl9CgoJCQkJCQkkeGYg
PSBhcnJheSgpOwoJCQkJCQkkeGZbJ2Zvcm1hdEluZGV4J10gPSAkaW5kZXhDb2RlOwoJCQkJ
CQkkeGZbJ2FsaWduJ10gPSAkYWxpZ247CgkJCQkJCSR4ZlsnZm9udEluZGV4J10gPSAkZm9u
dEluZGV4Q29kZTsKCQkJCQkJJHhmWydiZ0NvbG9yJ10gPSAkYmdjb2xvcjsKCQkJCQkJJHhm
WydmaWxsUGF0dGVybiddID0gJGZpbGxQYXR0ZXJuOwoKCQkJCQkJJGJvcmRlciA9IG9yZCgk
ZGF0YVskcG9zKzE0XSkgfCAob3JkKCRkYXRhWyRwb3MrMTVdKSA8PCA4KSB8IChvcmQoJGRh
dGFbJHBvcysxNl0pIDw8IDE2KSB8IChvcmQoJGRhdGFbJHBvcysxN10pIDw8IDI0KTsKCQkJ
CQkJJHhmWydib3JkZXJMZWZ0J10gPSAkdGhpcy0+bGluZVN0eWxlc1soJGJvcmRlciAmIDB4
RildOwoJCQkJCQkkeGZbJ2JvcmRlclJpZ2h0J10gPSAkdGhpcy0+bGluZVN0eWxlc1soJGJv
cmRlciAmIDB4RjApID4+IDRdOwoJCQkJCQkkeGZbJ2JvcmRlclRvcCddID0gJHRoaXMtPmxp
bmVTdHlsZXNbKCRib3JkZXIgJiAweEYwMCkgPj4gOF07CgkJCQkJCSR4ZlsnYm9yZGVyQm90
dG9tJ10gPSAkdGhpcy0+bGluZVN0eWxlc1soJGJvcmRlciAmIDB4RjAwMCkgPj4gMTJdOwoK
CQkJCQkJJHhmWydib3JkZXJMZWZ0Q29sb3InXSA9ICgkYm9yZGVyICYgMHg3RjAwMDApID4+
IDE2OwoJCQkJCQkkeGZbJ2JvcmRlclJpZ2h0Q29sb3InXSA9ICgkYm9yZGVyICYgMHgzRjgw
MDAwMCkgPj4gMjM7CgkJCQkJCSRib3JkZXIgPSAob3JkKCRkYXRhWyRwb3MrMThdKSB8IG9y
ZCgkZGF0YVskcG9zKzE5XSkgPDwgOCk7CgoJCQkJCQkkeGZbJ2JvcmRlclRvcENvbG9yJ10g
PSAoJGJvcmRlciAmIDB4N0YpOwoJCQkJCQkkeGZbJ2JvcmRlckJvdHRvbUNvbG9yJ10gPSAo
JGJvcmRlciAmIDB4M0Y4MCkgPj4gNzsKCgkJCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCRp
bmRleENvZGUsICR0aGlzLT5kYXRlRm9ybWF0cykpIHsKCQkJCQkJCSR4ZlsndHlwZSddID0g
J2RhdGUnOwoJCQkJCQkJJHhmWydmb3JtYXQnXSA9ICR0aGlzLT5kYXRlRm9ybWF0c1skaW5k
ZXhDb2RlXTsKCQkJCQkJCWlmICgkYWxpZ249PScnKSB7ICR4ZlsnYWxpZ24nXSA9ICdyaWdo
dCc7IH0KCQkJCQkJfWVsc2VpZiAoYXJyYXlfa2V5X2V4aXN0cygkaW5kZXhDb2RlLCAkdGhp
cy0+bnVtYmVyRm9ybWF0cykpIHsKCQkJCQkJCSR4ZlsndHlwZSddID0gJ251bWJlcic7CgkJ
CQkJCQkkeGZbJ2Zvcm1hdCddID0gJHRoaXMtPm51bWJlckZvcm1hdHNbJGluZGV4Q29kZV07
CgkJCQkJCQlpZiAoJGFsaWduPT0nJykgeyAkeGZbJ2FsaWduJ10gPSAncmlnaHQnOyB9CgkJ
CQkJCX1lbHNlewoJCQkJCQkJJGlzZGF0ZSA9IEZBTFNFOwoJCQkJCQkJJGZvcm1hdHN0ciA9
ICcnOwoJCQkJCQkJaWYgKCRpbmRleENvZGUgPiAwKXsKCQkJCQkJCQlpZiAoaXNzZXQoJHRo
aXMtPmZvcm1hdFJlY29yZHNbJGluZGV4Q29kZV0pKQoJCQkJCQkJCQkkZm9ybWF0c3RyID0g
JHRoaXMtPmZvcm1hdFJlY29yZHNbJGluZGV4Q29kZV07CgkJCQkJCQkJaWYgKCRmb3JtYXRz
dHIhPSIiKSB7CgkJCQkJCQkJCSR0bXAgPSBwcmVnX3JlcGxhY2UoIi9cOy4qLyIsIiIsJGZv
cm1hdHN0cik7CgkJCQkJCQkJCSR0bXAgPSBwcmVnX3JlcGxhY2UoIi9eXFtbXlxdXSpcXS8i
LCIiLCR0bXApOwoJCQkJCQkJCQlpZiAocHJlZ19tYXRjaCgiL1teaG1zZGF5XC9cLTpcc1xc
XCxBTVBdL2kiLCAkdG1wKSA9PSAwKSB7IC8vIGZvdW5kIGRheSBhbmQgdGltZSBmb3JtYXQK
CQkJCQkJCQkJCSRpc2RhdGUgPSBUUlVFOwoJCQkJCQkJCQkJJGZvcm1hdHN0ciA9ICR0bXA7
CgkJCQkJCQkJCQkkZm9ybWF0c3RyID0gc3RyX3JlcGxhY2UoYXJyYXkoJ0FNL1BNJywnbW1t
bScsJ21tbScpLCBhcnJheSgnYScsJ0YnLCdNJyksICRmb3JtYXRzdHIpOwoJCQkJCQkJCQkJ
Ly8gbS9tbSBhcmUgdXNlZCBmb3IgYm90aCBtaW51dGVzIGFuZCBtb250aHMgLSBvaCBTTkFQ
IQoJCQkJCQkJCQkJLy8gVGhpcyBtZXNzIHRyaWVzIHRvIGZpeCBmb3IgdGhhdC4KCQkJCQkJ
CQkJCS8vICdtJyA9PSBtaW51dGVzIG9ubHkgaWYgZm9sbG93aW5nIGgvaGggb3IgcHJlY2Vk
aW5nIHMvc3MKCQkJCQkJCQkJCSRmb3JtYXRzdHIgPSBwcmVnX3JlcGxhY2UoIi8oaDo/KW1t
Py8iLCIkMWkiLCAkZm9ybWF0c3RyKTsKCQkJCQkJCQkJCSRmb3JtYXRzdHIgPSBwcmVnX3Jl
cGxhY2UoIi9tbT8oOj9zKS8iLCJpJDEiLCAkZm9ybWF0c3RyKTsKCQkJCQkJCQkJCS8vIEEg
c2luZ2xlICdtJyA9IG4gaW4gUEhQCgkJCQkJCQkJCQkkZm9ybWF0c3RyID0gcHJlZ19yZXBs
YWNlKCIvKF58W15tXSltKFtebV18JCkvIiwgJyQxbiQyJywgJGZvcm1hdHN0cik7CgkJCQkJ
CQkJCQkkZm9ybWF0c3RyID0gcHJlZ19yZXBsYWNlKCIvKF58W15tXSltKFtebV18JCkvIiwg
JyQxbiQyJywgJGZvcm1hdHN0cik7CgkJCQkJCQkJCQkvLyBlbHNlIGl0J3MgbW9udGhzCgkJ
CQkJCQkJCQkkZm9ybWF0c3RyID0gc3RyX3JlcGxhY2UoJ21tJywgJ20nLCAkZm9ybWF0c3Ry
KTsKCQkJCQkJCQkJCS8vIENvbnZlcnQgc2luZ2xlICdkJyB0byAnaicKCQkJCQkJCQkJCSRm
b3JtYXRzdHIgPSBwcmVnX3JlcGxhY2UoIi8oXnxbXmRdKWQoW15kXXwkKS8iLCAnJDFqJDIn
LCAkZm9ybWF0c3RyKTsKCQkJCQkJCQkJCSRmb3JtYXRzdHIgPSBzdHJfcmVwbGFjZShhcnJh
eSgnZGRkZCcsJ2RkZCcsJ2RkJywneXl5eScsJ3l5JywnaGgnLCdoJyksIGFycmF5KCdsJywn
RCcsJ2QnLCdZJywneScsJ0gnLCdnJyksICRmb3JtYXRzdHIpOwoJCQkJCQkJCQkJJGZvcm1h
dHN0ciA9IHByZWdfcmVwbGFjZSgiL3NzPy8iLCAncycsICRmb3JtYXRzdHIpOwoJCQkJCQkJ
CQl9CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJaWYgKCRpc2RhdGUpewoJCQkJCQkJCSR4
ZlsndHlwZSddID0gJ2RhdGUnOwoJCQkJCQkJCSR4ZlsnZm9ybWF0J10gPSAkZm9ybWF0c3Ry
OwoJCQkJCQkJCWlmICgkYWxpZ249PScnKSB7ICR4ZlsnYWxpZ24nXSA9ICdyaWdodCc7IH0K
CQkJCQkJCX1lbHNlewoJCQkJCQkJCS8vIElmIHRoZSBmb3JtYXQgc3RyaW5nIGhhcyBhIDAg
b3IgIyBpbiBpdCwgd2UnbGwgYXNzdW1lIGl0J3MgYSBudW1iZXIKCQkJCQkJCQlpZiAocHJl
Z19tYXRjaCgiL1swI10vIiwgJGZvcm1hdHN0cikpIHsKCQkJCQkJCQkJJHhmWyd0eXBlJ10g
PSAnbnVtYmVyJzsKCQkJCQkJCQkJaWYgKCRhbGlnbj09JycpIHsgJHhmWydhbGlnbiddPSdy
aWdodCc7IH0KCQkJCQkJCQl9CgkJCQkJCQkJZWxzZSB7CgkJCQkJCQkJJHhmWyd0eXBlJ10g
PSAnb3RoZXInOwoJCQkJCQkJCX0KCQkJCQkJCQkkeGZbJ2Zvcm1hdCddID0gJGZvcm1hdHN0
cjsKCQkJCQkJCQkkeGZbJ2NvZGUnXSA9ICRpbmRleENvZGU7CgkJCQkJCQl9CgkJCQkJCX0K
CQkJCQkJJHRoaXMtPnhmUmVjb3Jkc1tdID0gJHhmOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBT
UFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQRV9OSU5FVEVFTkZPVVI6CgkJCQkJJHRoaXMt
Pm5pbmV0ZWVuRm91ciA9IChvcmQoJGRhdGFbJHBvcys0XSkgPT0gMSk7CgkJCQkJYnJlYWs7
CgkJCQljYXNlIFNQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9UWVBFX0JPVU5EU0hFRVQ6CgkJ
CQkJCSRyZWNfb2Zmc2V0ID0gJHRoaXMtPl9HZXRJbnQ0ZCgkZGF0YSwgJHBvcys0KTsKCQkJ
CQkJJHJlY190eXBlRmxhZyA9IG9yZCgkZGF0YVskcG9zKzhdKTsKCQkJCQkJJHJlY192aXNp
YmlsaXR5RmxhZyA9IG9yZCgkZGF0YVskcG9zKzldKTsKCQkJCQkJJHJlY19sZW5ndGggPSBv
cmQoJGRhdGFbJHBvcysxMF0pOwoKCQkJCQkJaWYgKCR2ZXJzaW9uID09IFNQUkVBRFNIRUVU
X0VYQ0VMX1JFQURFUl9CSUZGOCl7CgkJCQkJCQkkY2hhcnR5cGUgPSAgb3JkKCRkYXRhWyRw
b3MrMTFdKTsKCQkJCQkJCWlmICgkY2hhcnR5cGUgPT0gMCl7CgkJCQkJCQkJJHJlY19uYW1l
CT0gc3Vic3RyKCRkYXRhLCAkcG9zKzEyLCAkcmVjX2xlbmd0aCk7CgkJCQkJCQl9IGVsc2Ug
ewoJCQkJCQkJCSRyZWNfbmFtZQk9ICR0aGlzLT5fZW5jb2RlVVRGMTYoc3Vic3RyKCRkYXRh
LCAkcG9zKzEyLCAkcmVjX2xlbmd0aCoyKSk7CgkJCQkJCQl9CgkJCQkJCX1lbHNlaWYgKCR2
ZXJzaW9uID09IFNQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9CSUZGNyl7CgkJCQkJCQkJJHJl
Y19uYW1lCT0gc3Vic3RyKCRkYXRhLCAkcG9zKzExLCAkcmVjX2xlbmd0aCk7CgkJCQkJCX0K
CQkJCQkkdGhpcy0+Ym91bmRzaGVldHNbXSA9IGFycmF5KCduYW1lJz0+JHJlY19uYW1lLCdv
ZmZzZXQnPT4kcmVjX29mZnNldCk7CgkJCQkJYnJlYWs7CgoJCQl9CgoJCQkkcG9zICs9ICRs
ZW5ndGggKyA0OwoJCQkkY29kZSA9IG9yZCgkZGF0YVskcG9zXSkgfCBvcmQoJGRhdGFbJHBv
cysxXSk8PDg7CgkJCSRsZW5ndGggPSBvcmQoJGRhdGFbJHBvcysyXSkgfCBvcmQoJGRhdGFb
JHBvcyszXSk8PDg7CgkJfQoKCQlmb3JlYWNoICgkdGhpcy0+Ym91bmRzaGVldHMgYXMgJGtl
eT0+JHZhbCl7CgkJCSR0aGlzLT5zbiA9ICRrZXk7CgkJCSR0aGlzLT5fcGFyc2VzaGVldCgk
dmFsWydvZmZzZXQnXSk7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoKCS8qKgoJICogUGFyc2Ug
YSB3b3Jrc2hlZXQKCSAqLwoJZnVuY3Rpb24gX3BhcnNlc2hlZXQoJHNwb3MpIHsKCQkkY29u
dCA9IHRydWU7CgkJJGRhdGEgPSAkdGhpcy0+ZGF0YTsKCQkvLyByZWFkIEJPRgoJCSRjb2Rl
ID0gb3JkKCRkYXRhWyRzcG9zXSkgfCBvcmQoJGRhdGFbJHNwb3MrMV0pPDw4OwoJCSRsZW5n
dGggPSBvcmQoJGRhdGFbJHNwb3MrMl0pIHwgb3JkKCRkYXRhWyRzcG9zKzNdKTw8ODsKCgkJ
JHZlcnNpb24gPSBvcmQoJGRhdGFbJHNwb3MgKyA0XSkgfCBvcmQoJGRhdGFbJHNwb3MgKyA1
XSk8PDg7CgkJJHN1YnN0cmVhbVR5cGUgPSBvcmQoJGRhdGFbJHNwb3MgKyA2XSkgfCBvcmQo
JGRhdGFbJHNwb3MgKyA3XSk8PDg7CgoJCWlmICgoJHZlcnNpb24gIT0gU1BSRUFEU0hFRVRf
RVhDRUxfUkVBREVSX0JJRkY4KSAmJiAoJHZlcnNpb24gIT0gU1BSRUFEU0hFRVRfRVhDRUxf
UkVBREVSX0JJRkY3KSkgewoJCQlyZXR1cm4gLTE7CgkJfQoKCQlpZiAoJHN1YnN0cmVhbVR5
cGUgIT0gU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1dPUktTSEVFVCl7CgkJCXJldHVybiAt
MjsKCQl9CgkJJHNwb3MgKz0gJGxlbmd0aCArIDQ7CgkJd2hpbGUoJGNvbnQpIHsKCQkJJGxv
d2NvZGUgPSBvcmQoJGRhdGFbJHNwb3NdKTsKCQkJaWYgKCRsb3djb2RlID09IFNQUkVBRFNI
RUVUX0VYQ0VMX1JFQURFUl9UWVBFX0VPRikgYnJlYWs7CgkJCSRjb2RlID0gJGxvd2NvZGUg
fCBvcmQoJGRhdGFbJHNwb3MrMV0pPDw4OwoJCQkkbGVuZ3RoID0gb3JkKCRkYXRhWyRzcG9z
KzJdKSB8IG9yZCgkZGF0YVskc3BvcyszXSk8PDg7CgkJCSRzcG9zICs9IDQ7CgkJCSR0aGlz
LT5zaGVldHNbJHRoaXMtPnNuXVsnbWF4cm93J10gPSAkdGhpcy0+X3Jvd29mZnNldCAtIDE7
CgkJCSR0aGlzLT5zaGVldHNbJHRoaXMtPnNuXVsnbWF4Y29sJ10gPSAkdGhpcy0+X2NvbG9m
ZnNldCAtIDE7CgkJCXVuc2V0KCR0aGlzLT5yZWN0eXBlKTsKCQkJc3dpdGNoICgkY29kZSkg
ewoJCQkJY2FzZSBTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQRV9ESU1FTlNJT046CgkJ
CQkJaWYgKCFpc3NldCgkdGhpcy0+bnVtUm93cykpIHsKCQkJCQkJaWYgKCgkbGVuZ3RoID09
IDEwKSB8fCAgKCR2ZXJzaW9uID09IFNQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9CSUZGNykp
ewoJCQkJCQkJJHRoaXMtPnNoZWV0c1skdGhpcy0+c25dWydudW1Sb3dzJ10gPSBvcmQoJGRh
dGFbJHNwb3MrMl0pIHwgb3JkKCRkYXRhWyRzcG9zKzNdKSA8PCA4OwoJCQkJCQkJJHRoaXMt
PnNoZWV0c1skdGhpcy0+c25dWydudW1Db2xzJ10gPSBvcmQoJGRhdGFbJHNwb3MrNl0pIHwg
b3JkKCRkYXRhWyRzcG9zKzddKSA8PCA4OwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJHRoaXMt
PnNoZWV0c1skdGhpcy0+c25dWydudW1Sb3dzJ10gPSBvcmQoJGRhdGFbJHNwb3MrNF0pIHwg
b3JkKCRkYXRhWyRzcG9zKzVdKSA8PCA4OwoJCQkJCQkJJHRoaXMtPnNoZWV0c1skdGhpcy0+
c25dWydudW1Db2xzJ10gPSBvcmQoJGRhdGFbJHNwb3MrMTBdKSB8IG9yZCgkZGF0YVskc3Bv
cysxMV0pIDw8IDg7CgkJCQkJCX0KCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIFNQUkVB
RFNIRUVUX0VYQ0VMX1JFQURFUl9UWVBFX01FUkdFRENFTExTOgoJCQkJCSRjZWxsUmFuZ2Vz
ID0gb3JkKCRkYXRhWyRzcG9zXSkgfCBvcmQoJGRhdGFbJHNwb3MrMV0pPDw4OwoJCQkJCWZv
ciAoJGkgPSAwOyAkaSA8ICRjZWxsUmFuZ2VzOyAkaSsrKSB7CgkJCQkJCSRmciA9ICBvcmQo
JGRhdGFbJHNwb3MgKyA4KiRpICsgMl0pIHwgb3JkKCRkYXRhWyRzcG9zICsgOCokaSArIDNd
KTw8ODsKCQkJCQkJJGxyID0gIG9yZCgkZGF0YVskc3BvcyArIDgqJGkgKyA0XSkgfCBvcmQo
JGRhdGFbJHNwb3MgKyA4KiRpICsgNV0pPDw4OwoJCQkJCQkkZmMgPSAgb3JkKCRkYXRhWyRz
cG9zICsgOCokaSArIDZdKSB8IG9yZCgkZGF0YVskc3BvcyArIDgqJGkgKyA3XSk8PDg7CgkJ
CQkJCSRsYyA9ICBvcmQoJGRhdGFbJHNwb3MgKyA4KiRpICsgOF0pIHwgb3JkKCRkYXRhWyRz
cG9zICsgOCokaSArIDldKTw8ODsKCQkJCQkJaWYgKCRsciAtICRmciA+IDApIHsKCQkJCQkJ
CSR0aGlzLT5zaGVldHNbJHRoaXMtPnNuXVsnY2VsbHNJbmZvJ11bJGZyKzFdWyRmYysxXVsn
cm93c3BhbiddID0gJGxyIC0gJGZyICsgMTsKCQkJCQkJfQoJCQkJCQlpZiAoJGxjIC0gJGZj
ID4gMCkgewoJCQkJCQkJJHRoaXMtPnNoZWV0c1skdGhpcy0+c25dWydjZWxsc0luZm8nXVsk
ZnIrMV1bJGZjKzFdWydjb2xzcGFuJ10gPSAkbGMgLSAkZmMgKyAxOwoJCQkJCQl9CgkJCQkJ
fQoJCQkJCWJyZWFrOwoJCQkJY2FzZSBTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQRV9S
SzoKCQkJCWNhc2UgU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfUksyOgoJCQkJCSRy
b3cgPSBvcmQoJGRhdGFbJHNwb3NdKSB8IG9yZCgkZGF0YVskc3BvcysxXSk8PDg7CgkJCQkJ
JGNvbHVtbiA9IG9yZCgkZGF0YVskc3BvcysyXSkgfCBvcmQoJGRhdGFbJHNwb3MrM10pPDw4
OwoJCQkJCSRya251bSA9ICR0aGlzLT5fR2V0SW50NGQoJGRhdGEsICRzcG9zICsgNik7CgkJ
CQkJJG51bVZhbHVlID0gJHRoaXMtPl9HZXRJRUVFNzU0KCRya251bSk7CgkJCQkJJGluZm8g
PSAkdGhpcy0+X2dldENlbGxEZXRhaWxzKCRzcG9zLCRudW1WYWx1ZSwkY29sdW1uKTsKCQkJ
CQkkdGhpcy0+YWRkY2VsbCgkcm93LCAkY29sdW1uLCAkaW5mb1snc3RyaW5nJ10sJGluZm8p
OwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQRV9M
QUJFTFNTVDoKCQkJCQkkcm93CQk9IG9yZCgkZGF0YVskc3Bvc10pIHwgb3JkKCRkYXRhWyRz
cG9zKzFdKTw8ODsKCQkJCQkkY29sdW1uCSA9IG9yZCgkZGF0YVskc3BvcysyXSkgfCBvcmQo
JGRhdGFbJHNwb3MrM10pPDw4OwoJCQkJCSR4ZmluZGV4CT0gb3JkKCRkYXRhWyRzcG9zKzRd
KSB8IG9yZCgkZGF0YVskc3Bvcys1XSk8PDg7CgkJCQkJJGluZGV4ICA9ICR0aGlzLT5fR2V0
SW50NGQoJGRhdGEsICRzcG9zICsgNik7CgkJCQkJJHRoaXMtPmFkZGNlbGwoJHJvdywgJGNv
bHVtbiwgJHRoaXMtPnNzdFskaW5kZXhdLCBhcnJheSgneGZJbmRleCc9PiR4ZmluZGV4KSAp
OwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQRV9N
VUxSSzoKCQkJCQkkcm93CQk9IG9yZCgkZGF0YVskc3Bvc10pIHwgb3JkKCRkYXRhWyRzcG9z
KzFdKTw8ODsKCQkJCQkkY29sRmlyc3QgICA9IG9yZCgkZGF0YVskc3BvcysyXSkgfCBvcmQo
JGRhdGFbJHNwb3MrM10pPDw4OwoJCQkJCSRjb2xMYXN0CT0gb3JkKCRkYXRhWyRzcG9zICsg
JGxlbmd0aCAtIDJdKSB8IG9yZCgkZGF0YVskc3BvcyArICRsZW5ndGggLSAxXSk8PDg7CgkJ
CQkJJGNvbHVtbnMJPSAkY29sTGFzdCAtICRjb2xGaXJzdCArIDE7CgkJCQkJJHRtcHBvcyA9
ICRzcG9zKzQ7CgkJCQkJZm9yICgkaSA9IDA7ICRpIDwgJGNvbHVtbnM7ICRpKyspIHsKCQkJ
CQkJJG51bVZhbHVlID0gJHRoaXMtPl9HZXRJRUVFNzU0KCR0aGlzLT5fR2V0SW50NGQoJGRh
dGEsICR0bXBwb3MgKyAyKSk7CgkJCQkJCSRpbmZvID0gJHRoaXMtPl9nZXRDZWxsRGV0YWls
cygkdG1wcG9zLTQsJG51bVZhbHVlLCRjb2xGaXJzdCArICRpICsgMSk7CgkJCQkJCSR0bXBw
b3MgKz0gNjsKCQkJCQkJJHRoaXMtPmFkZGNlbGwoJHJvdywgJGNvbEZpcnN0ICsgJGksICRp
bmZvWydzdHJpbmcnXSwgJGluZm8pOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2UgU1BS
RUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfTlVNQkVSOgoJCQkJCSRyb3cJPSBvcmQoJGRh
dGFbJHNwb3NdKSB8IG9yZCgkZGF0YVskc3BvcysxXSk8PDg7CgkJCQkJJGNvbHVtbiA9IG9y
ZCgkZGF0YVskc3BvcysyXSkgfCBvcmQoJGRhdGFbJHNwb3MrM10pPDw4OwoJCQkJCSR0bXAg
PSB1bnBhY2soImRkb3VibGUiLCBzdWJzdHIoJGRhdGEsICRzcG9zICsgNiwgOCkpOyAvLyBJ
dCBtYWNoaW5lIG1hY2hpbmUgZGVwZW5kZW50CgkJCQkJaWYgKCR0aGlzLT5pc0RhdGUoJHNw
b3MpKSB7CgkJCQkJCSRudW1WYWx1ZSA9ICR0bXBbJ2RvdWJsZSddOwoJCQkJCX0KCQkJCQll
bHNlIHsKCQkJCQkJJG51bVZhbHVlID0gJHRoaXMtPmNyZWF0ZU51bWJlcigkc3Bvcyk7CgkJ
CQkJfQoJCQkJCSRpbmZvID0gJHRoaXMtPl9nZXRDZWxsRGV0YWlscygkc3BvcywkbnVtVmFs
dWUsJGNvbHVtbik7CgkJCQkJJHRoaXMtPmFkZGNlbGwoJHJvdywgJGNvbHVtbiwgJGluZm9b
J3N0cmluZyddLCAkaW5mbyk7CgkJCQkJYnJlYWs7CgoJCQkJY2FzZSBTUFJFQURTSEVFVF9F
WENFTF9SRUFERVJfVFlQRV9GT1JNVUxBOgoJCQkJY2FzZSBTUFJFQURTSEVFVF9FWENFTF9S
RUFERVJfVFlQRV9GT1JNVUxBMjoKCQkJCQkkcm93CT0gb3JkKCRkYXRhWyRzcG9zXSkgfCBv
cmQoJGRhdGFbJHNwb3MrMV0pPDw4OwoJCQkJCSRjb2x1bW4gPSBvcmQoJGRhdGFbJHNwb3Mr
Ml0pIHwgb3JkKCRkYXRhWyRzcG9zKzNdKTw8ODsKCQkJCQlpZiAoKG9yZCgkZGF0YVskc3Bv
cys2XSk9PTApICYmIChvcmQoJGRhdGFbJHNwb3MrMTJdKT09MjU1KSAmJiAob3JkKCRkYXRh
WyRzcG9zKzEzXSk9PTI1NSkpIHsKCQkJCQkJLy9TdHJpbmcgZm9ybXVsYS4gUmVzdWx0IGZv
bGxvd3MgaW4gYSBTVFJJTkcgcmVjb3JkCgkJCQkJCS8vIFRoaXMgcm93L2NvbCBhcmUgc3Rv
cmVkIHRvIGJlIHJlZmVyZW5jZWQgaW4gdGhhdCByZWNvcmQKCQkJCQkJLy8gaHR0cDovL2Nv
ZGUuZ29vZ2xlLmNvbS9wL3BocC1leGNlbC1yZWFkZXIvaXNzdWVzL2RldGFpbD9pZD00CgkJ
CQkJCSRwcmV2aW91c1JvdyA9ICRyb3c7CgkJCQkJCSRwcmV2aW91c0NvbCA9ICRjb2x1bW47
CgkJCQkJfSBlbHNlaWYgKChvcmQoJGRhdGFbJHNwb3MrNl0pPT0xKSAmJiAob3JkKCRkYXRh
WyRzcG9zKzEyXSk9PTI1NSkgJiYgKG9yZCgkZGF0YVskc3BvcysxM10pPT0yNTUpKSB7CgkJ
CQkJCS8vQm9vbGVhbiBmb3JtdWxhLiBSZXN1bHQgaXMgaW4gKzI7IDA9ZmFsc2UsMT10cnVl
CgkJCQkJCS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9waHAtZXhjZWwtcmVhZGVyL2lz
c3Vlcy9kZXRhaWw/aWQ9NAogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JkKCR0aGlz
LT5kYXRhWyRzcG9zKzhdKT09MSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRo
aXMtPmFkZGNlbGwoJHJvdywgJGNvbHVtbiwgIlRSVUUiKTsKICAgICAgICAgICAgICAgICAg
ICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5hZGRj
ZWxsKCRyb3csICRjb2x1bW4sICJGQUxTRSIpOwogICAgICAgICAgICAgICAgICAgICAgICB9
CgkJCQkJfSBlbHNlaWYgKChvcmQoJGRhdGFbJHNwb3MrNl0pPT0yKSAmJiAob3JkKCRkYXRh
WyRzcG9zKzEyXSk9PTI1NSkgJiYgKG9yZCgkZGF0YVskc3BvcysxM10pPT0yNTUpKSB7CgkJ
CQkJCS8vRXJyb3IgZm9ybXVsYS4gRXJyb3IgY29kZSBpcyBpbiArMjsKCQkJCQl9IGVsc2Vp
ZiAoKG9yZCgkZGF0YVskc3Bvcys2XSk9PTMpICYmIChvcmQoJGRhdGFbJHNwb3MrMTJdKT09
MjU1KSAmJiAob3JkKCRkYXRhWyRzcG9zKzEzXSk9PTI1NSkpIHsKCQkJCQkJLy9Gb3JtdWxh
IHJlc3VsdCBpcyBhIG51bGwgc3RyaW5nLgoJCQkJCQkkdGhpcy0+YWRkY2VsbCgkcm93LCAk
Y29sdW1uLCAnJyk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJLy8gcmVzdWx0IGlzIGEgbnVtYmVy
LCBzbyBmaXJzdCAxNCBieXRlcyBhcmUganVzdCBsaWtlIGEgX05VTUJFUiByZWNvcmQKCQkJ
CQkJJHRtcCA9IHVucGFjaygiZGRvdWJsZSIsIHN1YnN0cigkZGF0YSwgJHNwb3MgKyA2LCA4
KSk7IC8vIEl0IG1hY2hpbmUgbWFjaGluZSBkZXBlbmRlbnQKCQkJCQkJCSAgaWYgKCR0aGlz
LT5pc0RhdGUoJHNwb3MpKSB7CgkJCQkJCQkJJG51bVZhbHVlID0gJHRtcFsnZG91YmxlJ107
CgkJCQkJCQkgIH0KCQkJCQkJCSAgZWxzZSB7CgkJCQkJCQkJJG51bVZhbHVlID0gJHRoaXMt
PmNyZWF0ZU51bWJlcigkc3Bvcyk7CgkJCQkJCQkgIH0KCQkJCQkJJGluZm8gPSAkdGhpcy0+
X2dldENlbGxEZXRhaWxzKCRzcG9zLCRudW1WYWx1ZSwkY29sdW1uKTsKCQkJCQkJJHRoaXMt
PmFkZGNlbGwoJHJvdywgJGNvbHVtbiwgJGluZm9bJ3N0cmluZyddLCAkaW5mbyk7CgkJCQkJ
fQoJCQkJCWJyZWFrOwoJCQkJY2FzZSBTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQRV9C
T09MRVJSOgoJCQkJCSRyb3cJPSBvcmQoJGRhdGFbJHNwb3NdKSB8IG9yZCgkZGF0YVskc3Bv
cysxXSk8PDg7CgkJCQkJJGNvbHVtbiA9IG9yZCgkZGF0YVskc3BvcysyXSkgfCBvcmQoJGRh
dGFbJHNwb3MrM10pPDw4OwoJCQkJCSRzdHJpbmcgPSBvcmQoJGRhdGFbJHNwb3MrNl0pOwoJ
CQkJCSR0aGlzLT5hZGRjZWxsKCRyb3csICRjb2x1bW4sICRzdHJpbmcpOwoJCQkJCWJyZWFr
OwogICAgICAgICAgICAgICAgY2FzZSBTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQRV9T
VFJJTkc6CgkJCQkJLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3BocC1leGNlbC1yZWFk
ZXIvaXNzdWVzL2RldGFpbD9pZD00CgkJCQkJaWYgKCR2ZXJzaW9uID09IFNQUkVBRFNIRUVU
X0VYQ0VMX1JFQURFUl9CSUZGOCl7CgkJCQkJCS8vIFVuaWNvZGUgMTYgc3RyaW5nLCBsaWtl
IGFuIFNTVCByZWNvcmQKCQkJCQkJJHhwb3MgPSAkc3BvczsKCQkJCQkJJG51bUNoYXJzID1v
cmQoJGRhdGFbJHhwb3NdKSB8IChvcmQoJGRhdGFbJHhwb3MrMV0pIDw8IDgpOwoJCQkJCQkk
eHBvcyArPSAyOwoJCQkJCQkkb3B0aW9uRmxhZ3MgPW9yZCgkZGF0YVskeHBvc10pOwoJCQkJ
CQkkeHBvcysrOwoJCQkJCQkkYXNjaWlFbmNvZGluZyA9ICgoJG9wdGlvbkZsYWdzICYweDAx
KSA9PSAwKSA7CgkJCQkJCSRleHRlbmRlZFN0cmluZyA9ICgoJG9wdGlvbkZsYWdzICYgMHgw
NCkgIT0gMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBpZiBzdHJpbmcgY29u
dGFpbnMgZm9ybWF0dGluZyBpbmZvcm1hdGlvbgoJCQkJCQkkcmljaFN0cmluZyA9ICgoJG9w
dGlvbkZsYWdzICYgMHgwOCkgIT0gMCk7CgkJCQkJCWlmICgkcmljaFN0cmluZykgewoJCQkJ
CQkJLy8gUmVhZCBpbiB0aGUgY3J1bgoJCQkJCQkJJGZvcm1hdHRpbmdSdW5zID1vcmQoJGRh
dGFbJHhwb3NdKSB8IChvcmQoJGRhdGFbJHhwb3MrMV0pIDw8IDgpOwoJCQkJCQkJJHhwb3Mg
Kz0gMjsKCQkJCQkJfQoJCQkJCQlpZiAoJGV4dGVuZGVkU3RyaW5nKSB7CgkJCQkJCQkvLyBS
ZWFkIGluIGNjaEV4dFJzdAoJCQkJCQkJJGV4dGVuZGVkUnVuTGVuZ3RoID0kdGhpcy0+X0dl
dEludDRkKCR0aGlzLT5kYXRhLCAkeHBvcyk7CgkJCQkJCQkkeHBvcyArPSA0OwoJCQkJCQl9
CgkJCQkJCSRsZW4gPSAoJGFzY2lpRW5jb2RpbmcpPyRudW1DaGFycyA6ICRudW1DaGFycyoy
OwoJCQkJCQkkcmV0c3RyID1zdWJzdHIoJGRhdGEsICR4cG9zLCAkbGVuKTsKCQkJCQkJJHhw
b3MgKz0gJGxlbjsKCQkJCQkJJHJldHN0ciA9ICgkYXNjaWlFbmNvZGluZyk/ICRyZXRzdHIg
OiAkdGhpcy0+X2VuY29kZVVURjE2KCRyZXRzdHIpOwoJCQkJCX0KCQkJCQllbHNlaWYgKCR2
ZXJzaW9uID09IFNQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9CSUZGNyl7CgkJCQkJCS8vIFNp
bXBsZSBieXRlIHN0cmluZwoJCQkJCQkkeHBvcyA9ICRzcG9zOwoJCQkJCQkkbnVtQ2hhcnMg
PW9yZCgkZGF0YVskeHBvc10pIHwgKG9yZCgkZGF0YVskeHBvcysxXSkgPDwgOCk7CgkJCQkJ
CSR4cG9zICs9IDI7CgkJCQkJCSRyZXRzdHIgPXN1YnN0cigkZGF0YSwgJHhwb3MsICRudW1D
aGFycyk7CgkJCQkJfQoJCQkJCSR0aGlzLT5hZGRjZWxsKCRwcmV2aW91c1JvdywgJHByZXZp
b3VzQ29sLCAkcmV0c3RyKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgU1BSRUFEU0hFRVRfRVhD
RUxfUkVBREVSX1RZUEVfUk9XOgoJCQkJCSRyb3cJPSBvcmQoJGRhdGFbJHNwb3NdKSB8IG9y
ZCgkZGF0YVskc3BvcysxXSk8PDg7CgkJCQkJJHJvd0luZm8gPSBvcmQoJGRhdGFbJHNwb3Mg
KyA2XSkgfCAoKG9yZCgkZGF0YVskc3Bvcys3XSkgPDwgOCkgJiAweDdGRkYpOwoJCQkJCWlm
ICgoJHJvd0luZm8gJiAweDgwMDApID4gMCkgewoJCQkJCQkkcm93SGVpZ2h0ID0gLTE7CgkJ
CQkJfSBlbHNlIHsKCQkJCQkJJHJvd0hlaWdodCA9ICRyb3dJbmZvICYgMHg3RkZGOwoJCQkJ
CX0KCQkJCQkkcm93SGlkZGVuID0gKG9yZCgkZGF0YVskc3BvcyArIDEyXSkgJiAweDIwKSA+
PiA1OwoJCQkJCSR0aGlzLT5yb3dJbmZvWyR0aGlzLT5zbl1bJHJvdysxXSA9IEFycmF5KCdo
ZWlnaHQnID0+ICRyb3dIZWlnaHQgLyAyMCwgJ2hpZGRlbic9PiRyb3dIaWRkZW4gKTsKCQkJ
CQlicmVhazsKCQkJCWNhc2UgU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfREJDRUxM
OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSBTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQRV9N
VUxCTEFOSzoKCQkJCQkkcm93ID0gb3JkKCRkYXRhWyRzcG9zXSkgfCBvcmQoJGRhdGFbJHNw
b3MrMV0pPDw4OwoJCQkJCSRjb2x1bW4gPSBvcmQoJGRhdGFbJHNwb3MrMl0pIHwgb3JkKCRk
YXRhWyRzcG9zKzNdKTw8ODsKCQkJCQkkY29scyA9ICgkbGVuZ3RoIC8gMikgLSAzOwoJCQkJ
CWZvciAoJGMgPSAwOyAkYyA8ICRjb2xzOyAkYysrKSB7CgkJCQkJCSR4ZmluZGV4ID0gb3Jk
KCRkYXRhWyRzcG9zICsgNCArICgkYyAqIDIpXSkgfCBvcmQoJGRhdGFbJHNwb3MgKyA1ICsg
KCRjICogMildKTw8ODsKCQkJCQkJJHRoaXMtPmFkZGNlbGwoJHJvdywgJGNvbHVtbiArICRj
LCAiIiwgYXJyYXkoJ3hmSW5kZXgnPT4keGZpbmRleCkpOwoJCQkJCX0KCQkJCQlicmVhazsK
CQkJCWNhc2UgU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfTEFCRUw6CgkJCQkJJHJv
dwk9IG9yZCgkZGF0YVskc3Bvc10pIHwgb3JkKCRkYXRhWyRzcG9zKzFdKTw8ODsKCQkJCQkk
Y29sdW1uID0gb3JkKCRkYXRhWyRzcG9zKzJdKSB8IG9yZCgkZGF0YVskc3BvcyszXSk8PDg7
CgkJCQkJJHRoaXMtPmFkZGNlbGwoJHJvdywgJGNvbHVtbiwgc3Vic3RyKCRkYXRhLCAkc3Bv
cyArIDgsIG9yZCgkZGF0YVskc3BvcyArIDZdKSB8IG9yZCgkZGF0YVskc3BvcyArIDddKTw8
OCkpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVFlQ
RV9FT0Y6CgkJCQkJJGNvbnQgPSBmYWxzZTsKCQkJCQlicmVhazsKCQkJCWNhc2UgU1BSRUFE
U0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfSFlQRVI6CgkJCQkJLy8gIE9ubHkgaGFuZGxlIGh5
cGVybGlua3MgdG8gYSBVUkwKCQkJCQkkcm93CT0gb3JkKCR0aGlzLT5kYXRhWyRzcG9zXSkg
fCBvcmQoJHRoaXMtPmRhdGFbJHNwb3MrMV0pPDw4OwoJCQkJCSRyb3cyICAgPSBvcmQoJHRo
aXMtPmRhdGFbJHNwb3MrMl0pIHwgb3JkKCR0aGlzLT5kYXRhWyRzcG9zKzNdKTw8ODsKCQkJ
CQkkY29sdW1uID0gb3JkKCR0aGlzLT5kYXRhWyRzcG9zKzRdKSB8IG9yZCgkdGhpcy0+ZGF0
YVskc3Bvcys1XSk8PDg7CgkJCQkJJGNvbHVtbjIgPSBvcmQoJHRoaXMtPmRhdGFbJHNwb3Mr
Nl0pIHwgb3JkKCR0aGlzLT5kYXRhWyRzcG9zKzddKTw8ODsKCQkJCQkkbGlua2RhdGEgPSBB
cnJheSgpOwoJCQkJCSRmbGFncyA9IG9yZCgkdGhpcy0+ZGF0YVskc3BvcyArIDI4XSk7CgkJ
CQkJJHVkZXNjID0gIiI7CgkJCQkJJHVsaW5rID0gIiI7CgkJCQkJJHVsb2MgPSAzMjsKCQkJ
CQkkbGlua2RhdGFbJ2ZsYWdzJ10gPSAkZmxhZ3M7CgkJCQkJaWYgKCgkZmxhZ3MgJiAxKSA+
IDAgKSB7ICAgLy8gaXMgYSB0eXBlIHdlIHVuZGVyc3RhbmQKCQkJCQkJLy8gIGlzIHRoZXJl
IGEgZGVzY3JpcHRpb24gPwoJCQkJCQlpZiAoKCRmbGFncyAmIDB4MTQpID09IDB4MTQgKSB7
ICAgLy8gaGFzIGEgZGVzY3JpcHRpb24KCQkJCQkJCSR1bG9jICs9IDQ7CgkJCQkJCQkkZGVz
Y0xlbiA9IG9yZCgkdGhpcy0+ZGF0YVskc3BvcyArIDMyXSkgfCBvcmQoJHRoaXMtPmRhdGFb
JHNwb3MgKyAzM10pIDw8IDg7CgkJCQkJCQkkdWRlc2MgPSBzdWJzdHIoJHRoaXMtPmRhdGEs
ICRzcG9zICsgJHVsb2MsICRkZXNjTGVuICogMik7CgkJCQkJCQkkdWxvYyArPSAyICogJGRl
c2NMZW47CgkJCQkJCX0KCQkJCQkJJHVsaW5rID0gJHRoaXMtPnJlYWQxNmJpdHN0cmluZygk
dGhpcy0+ZGF0YSwgJHNwb3MgKyAkdWxvYyArIDIwKTsKCQkJCQkJaWYgKCR1ZGVzYyA9PSAi
IikgewoJCQkJCQkJJHVkZXNjID0gJHVsaW5rOwoJCQkJCQl9CgkJCQkJfQoJCQkJCSRsaW5r
ZGF0YVsnZGVzYyddID0gJHVkZXNjOwoJCQkJCSRsaW5rZGF0YVsnbGluayddID0gJHRoaXMt
Pl9lbmNvZGVVVEYxNigkdWxpbmspOwoJCQkJCWZvciAoJHI9JHJvdzsgJHI8PSRyb3cyOyAk
cisrKSB7CgkJCQkJCWZvciAoJGM9JGNvbHVtbjsgJGM8PSRjb2x1bW4yOyAkYysrKSB7CgkJ
CQkJCQkkdGhpcy0+c2hlZXRzWyR0aGlzLT5zbl1bJ2NlbGxzSW5mbyddWyRyKzFdWyRjKzFd
WydoeXBlcmxpbmsnXSA9ICRsaW5rZGF0YTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlicmVhazsK
CQkJCWNhc2UgU1BSRUFEU0hFRVRfRVhDRUxfUkVBREVSX1RZUEVfREVGQ09MV0lEVEg6CgkJ
CQkJJHRoaXMtPmRlZmF1bHRDb2xXaWR0aCAgPSBvcmQoJGRhdGFbJHNwb3MrNF0pIHwgb3Jk
KCRkYXRhWyRzcG9zKzVdKSA8PCA4OwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBTUFJFQURTSEVF
VF9FWENFTF9SRUFERVJfVFlQRV9TVEFOREFSRFdJRFRIOgoJCQkJCSR0aGlzLT5zdGFuZGFy
ZENvbFdpZHRoICA9IG9yZCgkZGF0YVskc3Bvcys0XSkgfCBvcmQoJGRhdGFbJHNwb3MrNV0p
IDw8IDg7CgkJCQkJYnJlYWs7CgkJCQljYXNlIFNQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9U
WVBFX0NPTElORk86CgkJCQkJJGNvbGZyb20gPSBvcmQoJGRhdGFbJHNwb3MrMF0pIHwgb3Jk
KCRkYXRhWyRzcG9zKzFdKSA8PCA4OwoJCQkJCSRjb2x0byA9IG9yZCgkZGF0YVskc3Bvcysy
XSkgfCBvcmQoJGRhdGFbJHNwb3MrM10pIDw8IDg7CgkJCQkJJGN3ID0gb3JkKCRkYXRhWyRz
cG9zKzRdKSB8IG9yZCgkZGF0YVskc3Bvcys1XSkgPDwgODsKCQkJCQkkY3hmID0gb3JkKCRk
YXRhWyRzcG9zKzZdKSB8IG9yZCgkZGF0YVskc3Bvcys3XSkgPDwgODsKCQkJCQkkY28gPSBv
cmQoJGRhdGFbJHNwb3MrOF0pOwoJCQkJCWZvciAoJGNvbGkgPSAkY29sZnJvbTsgJGNvbGkg
PD0gJGNvbHRvOyAkY29saSsrKSB7CgkJCQkJCSR0aGlzLT5jb2xJbmZvWyR0aGlzLT5zbl1b
JGNvbGkrMV0gPSBBcnJheSgnd2lkdGgnID0+ICRjdywgJ3hmJyA9PiAkY3hmLCAnaGlkZGVu
JyA9PiAoJGNvICYgMHgwMSksICdjb2xsYXBzZWQnID0+ICgkY28gJiAweDEwMDApID4+IDEy
KTsKCQkJCQl9CgkJCQkJYnJlYWs7CgoJCQkJZGVmYXVsdDoKCQkJCQlicmVhazsKCQkJfQoJ
CQkkc3BvcyArPSAkbGVuZ3RoOwoJCX0KCgkJaWYgKCFpc3NldCgkdGhpcy0+c2hlZXRzWyR0
aGlzLT5zbl1bJ251bVJvd3MnXSkpCgkJCSAkdGhpcy0+c2hlZXRzWyR0aGlzLT5zbl1bJ251
bVJvd3MnXSA9ICR0aGlzLT5zaGVldHNbJHRoaXMtPnNuXVsnbWF4cm93J107CgkJaWYgKCFp
c3NldCgkdGhpcy0+c2hlZXRzWyR0aGlzLT5zbl1bJ251bUNvbHMnXSkpCgkJCSAkdGhpcy0+
c2hlZXRzWyR0aGlzLT5zbl1bJ251bUNvbHMnXSA9ICR0aGlzLT5zaGVldHNbJHRoaXMtPnNu
XVsnbWF4Y29sJ107CgkJfQoKCQlmdW5jdGlvbiBpc0RhdGUoJHNwb3MpIHsKCQkJJHhmaW5k
ZXggPSBvcmQoJHRoaXMtPmRhdGFbJHNwb3MrNF0pIHwgb3JkKCR0aGlzLT5kYXRhWyRzcG9z
KzVdKSA8PCA4OwoJCQlyZXR1cm4gKCR0aGlzLT54ZlJlY29yZHNbJHhmaW5kZXhdWyd0eXBl
J10gPT0gJ2RhdGUnKTsKCQl9CgoJCS8vIEdldCB0aGUgZGV0YWlscyBmb3IgYSBwYXJ0aWN1
bGFyIGNlbGwKCQlmdW5jdGlvbiBfZ2V0Q2VsbERldGFpbHMoJHNwb3MsJG51bVZhbHVlLCRj
b2x1bW4pIHsKCQkJJHhmaW5kZXggPSBvcmQoJHRoaXMtPmRhdGFbJHNwb3MrNF0pIHwgb3Jk
KCR0aGlzLT5kYXRhWyRzcG9zKzVdKSA8PCA4OwoJCQkkeGZyZWNvcmQgPSAkdGhpcy0+eGZS
ZWNvcmRzWyR4ZmluZGV4XTsKCQkJJHR5cGUgPSAkeGZyZWNvcmRbJ3R5cGUnXTsKCgkJCSRm
b3JtYXQgPSAkeGZyZWNvcmRbJ2Zvcm1hdCddOwoJCQkkZm9ybWF0SW5kZXggPSAkeGZyZWNv
cmRbJ2Zvcm1hdEluZGV4J107CgkJCSRmb250SW5kZXggPSAkeGZyZWNvcmRbJ2ZvbnRJbmRl
eCddOwoJCQkkZm9ybWF0Q29sb3IgPSAiIjsKCQkJJHJlY3R5cGUgPSAnJzsKCQkJJHN0cmlu
ZyA9ICcnOwoJCQkkcmF3ID0gJyc7CgoJCQlpZiAoaXNzZXQoJHRoaXMtPl9jb2x1bW5zRm9y
bWF0WyRjb2x1bW4gKyAxXSkpewoJCQkJJGZvcm1hdCA9ICR0aGlzLT5fY29sdW1uc0Zvcm1h
dFskY29sdW1uICsgMV07CgkJCX0KCgkJCWlmICgkdHlwZSA9PSAnZGF0ZScpIHsKCQkJCS8v
IFNlZSBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvcGhwLWV4Y2VsLXJlYWRlci1k
aXNjdXNzL2Jyb3dzZV9mcm0vdGhyZWFkLzljM2Y5NzkwZDEyZDhlMTAvZjIwNDVjMjM2OWFj
NzlkZQoJCQkJJHJlY3R5cGUgPSAnZGF0ZSc7CgkJCQkvLyBDb252ZXJ0IG51bWVyaWMgdmFs
dWUgaW50byBhIGRhdGUKCQkJCSR1dGNEYXlzID0gZmxvb3IoJG51bVZhbHVlIC0gKCR0aGlz
LT5uaW5ldGVlbkZvdXIgPyBTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVVRDT0ZGU0VUREFZ
UzE5MDQgOiBTUFJFQURTSEVFVF9FWENFTF9SRUFERVJfVVRDT0ZGU0VUREFZUykpOwoJCQkJ
JHV0Y1ZhbHVlID0gKCR1dGNEYXlzKSAqIFNQUkVBRFNIRUVUX0VYQ0VMX1JFQURFUl9NU0lO
QURBWTsKCQkJCSRkYXRlaW5mbyA9IGdtZ2V0ZGF0ZSgkdXRjVmFsdWUpOwoKCQkJCSRyYXcg
PSAkbnVtVmFsdWU7CgkJCQkkZnJhY3Rpb25hbERheSA9ICRudW1WYWx1ZSAtIGZsb29yKCRu
dW1WYWx1ZSkgKyAuMDAwMDAwMTsgLy8gVGhlIC4wMDAwMDAxIGlzIHRvIGZpeCBmb3IgcGhw
L2V4Y2VsIGZyYWN0aW9uYWwgZGlmZnMKCgkJCQkkdG90YWxzZWNvbmRzID0gZmxvb3IoU1BS
RUFEU0hFRVRfRVhDRUxfUkVBREVSX01TSU5BREFZICogJGZyYWN0aW9uYWxEYXkpOwoJCQkJ
JHNlY3MgPSAkdG90YWxzZWNvbmRzICUgNjA7CgkJCQkkdG90YWxzZWNvbmRzIC09ICRzZWNz
OwoJCQkJJGhvdXJzID0gZmxvb3IoJHRvdGFsc2Vjb25kcyAvICg2MCAqIDYwKSk7CgkJCQkk
bWlucyA9IGZsb29yKCR0b3RhbHNlY29uZHMgLyA2MCkgJSA2MDsKCQkJCSRzdHJpbmcgPSBk
YXRlICgkZm9ybWF0LCBta3RpbWUoJGhvdXJzLCAkbWlucywgJHNlY3MsICRkYXRlaW5mb1si
bW9uIl0sICRkYXRlaW5mb1sibWRheSJdLCAkZGF0ZWluZm9bInllYXIiXSkpOwoJCQl9IGVs
c2UgaWYgKCR0eXBlID09ICdudW1iZXInKSB7CgkJCQkkcmVjdHlwZSA9ICdudW1iZXInOwoJ
CQkJJGZvcm1hdHRlZCA9ICR0aGlzLT5fZm9ybWF0X3ZhbHVlKCRmb3JtYXQsICRudW1WYWx1
ZSwgJGZvcm1hdEluZGV4KTsKCQkJCSRzdHJpbmcgPSAkZm9ybWF0dGVkWydzdHJpbmcnXTsK
CQkJCSRmb3JtYXRDb2xvciA9ICRmb3JtYXR0ZWRbJ2Zvcm1hdENvbG9yJ107CgkJCQkkcmF3
ID0gJG51bVZhbHVlOwoJCQl9IGVsc2V7CgkJCQlpZiAoJGZvcm1hdD09IiIpIHsKCQkJCQkk
Zm9ybWF0ID0gJHRoaXMtPl9kZWZhdWx0Rm9ybWF0OwoJCQkJfQoJCQkJJHJlY3R5cGUgPSAn
dW5rbm93bic7CgkJCQkkZm9ybWF0dGVkID0gJHRoaXMtPl9mb3JtYXRfdmFsdWUoJGZvcm1h
dCwgJG51bVZhbHVlLCAkZm9ybWF0SW5kZXgpOwoJCQkJJHN0cmluZyA9ICRmb3JtYXR0ZWRb
J3N0cmluZyddOwoJCQkJJGZvcm1hdENvbG9yID0gJGZvcm1hdHRlZFsnZm9ybWF0Q29sb3In
XTsKCQkJCSRyYXcgPSAkbnVtVmFsdWU7CgkJCX0KCgkJCXJldHVybiBhcnJheSgKCQkJCSdz
dHJpbmcnPT4kc3RyaW5nLAoJCQkJJ3Jhdyc9PiRyYXcsCgkJCQkncmVjdHlwZSc9PiRyZWN0
eXBlLAoJCQkJJ2Zvcm1hdCc9PiRmb3JtYXQsCgkJCQknZm9ybWF0SW5kZXgnPT4kZm9ybWF0
SW5kZXgsCgkJCQknZm9udEluZGV4Jz0+JGZvbnRJbmRleCwKCQkJCSdmb3JtYXRDb2xvcic9
PiRmb3JtYXRDb2xvciwKCQkJCSd4ZkluZGV4Jz0+JHhmaW5kZXgKCQkJKTsKCgkJfQoKCglm
dW5jdGlvbiBjcmVhdGVOdW1iZXIoJHNwb3MpIHsKCQkkcmtudW1oaWdoID0gJHRoaXMtPl9H
ZXRJbnQ0ZCgkdGhpcy0+ZGF0YSwgJHNwb3MgKyAxMCk7CgkJJHJrbnVtbG93ID0gJHRoaXMt
Pl9HZXRJbnQ0ZCgkdGhpcy0+ZGF0YSwgJHNwb3MgKyA2KTsKCQkkc2lnbiA9ICgkcmtudW1o
aWdoICYgMHg4MDAwMDAwMCkgPj4gMzE7CgkJJGV4cCA9ICAoJHJrbnVtaGlnaCAmIDB4N2Zm
MDAwMDApID4+IDIwOwoJCSRtYW50aXNzYSA9ICgweDEwMDAwMCB8ICgkcmtudW1oaWdoICYg
MHgwMDBmZmZmZikpOwoJCSRtYW50aXNzYWxvdzEgPSAoJHJrbnVtbG93ICYgMHg4MDAwMDAw
MCkgPj4gMzE7CgkJJG1hbnRpc3NhbG93MiA9ICgkcmtudW1sb3cgJiAweDdmZmZmZmZmKTsK
CQkkdmFsdWUgPSAkbWFudGlzc2EgLyBwb3coIDIgLCAoMjAtICgkZXhwIC0gMTAyMykpKTsK
CQlpZiAoJG1hbnRpc3NhbG93MSAhPSAwKSAkdmFsdWUgKz0gMSAvIHBvdyAoMiAsICgyMSAt
ICgkZXhwIC0gMTAyMykpKTsKCQkkdmFsdWUgKz0gJG1hbnRpc3NhbG93MiAvIHBvdyAoMiAs
ICg1MiAtICgkZXhwIC0gMTAyMykpKTsKCQlpZiAoJHNpZ24pIHskdmFsdWUgPSAtMSAqICR2
YWx1ZTt9CgkJcmV0dXJuICAkdmFsdWU7Cgl9CgoJZnVuY3Rpb24gYWRkY2VsbCgkcm93LCAk
Y29sLCAkc3RyaW5nLCAkaW5mbz1udWxsKSB7CgkJJHRoaXMtPnNoZWV0c1skdGhpcy0+c25d
WydtYXhyb3cnXSA9IG1heCgkdGhpcy0+c2hlZXRzWyR0aGlzLT5zbl1bJ21heHJvdyddLCAk
cm93ICsgJHRoaXMtPl9yb3dvZmZzZXQpOwoJCSR0aGlzLT5zaGVldHNbJHRoaXMtPnNuXVsn
bWF4Y29sJ10gPSBtYXgoJHRoaXMtPnNoZWV0c1skdGhpcy0+c25dWydtYXhjb2wnXSwgJGNv
bCArICR0aGlzLT5fY29sb2Zmc2V0KTsKCQkkdGhpcy0+c2hlZXRzWyR0aGlzLT5zbl1bJ2Nl
bGxzJ11bJHJvdyArICR0aGlzLT5fcm93b2Zmc2V0XVskY29sICsgJHRoaXMtPl9jb2xvZmZz
ZXRdID0gJHN0cmluZzsKCQlpZiAoJHRoaXMtPnN0b3JlX2V4dGVuZGVkX2luZm8gJiYgJGlu
Zm8pIHsKCQkJZm9yZWFjaCAoJGluZm8gYXMgJGtleT0+JHZhbCkgewoJCQkJJHRoaXMtPnNo
ZWV0c1skdGhpcy0+c25dWydjZWxsc0luZm8nXVskcm93ICsgJHRoaXMtPl9yb3dvZmZzZXRd
WyRjb2wgKyAkdGhpcy0+X2NvbG9mZnNldF1bJGtleV0gPSAkdmFsOwoJCQl9CgkJfQoJfQoK
CglmdW5jdGlvbiBfR2V0SUVFRTc1NCgkcmtudW0pIHsKCQlpZiAoKCRya251bSAmIDB4MDIp
ICE9IDApIHsKCQkJCSR2YWx1ZSA9ICRya251bSA+PiAyOwoJCX0gZWxzZSB7CgkJCS8vbW1w
CgkJCS8vIEkgZ290IG15IGluZm8gb24gSUVFRTc1NCBlbmNvZGluZyBmcm9tCgkJCS8vIGh0
dHA6Ly9yZXNlYXJjaC5taWNyb3NvZnQuY29tL35ob2xsYXNjaC9jZ2luZGV4L2NvZGluZy9p
ZWVlZmxvYXQuaHRtbAoJCQkvLyBUaGUgUksgZm9ybWF0IGNhbGxzIGZvciB1c2luZyBvbmx5
IHRoZSBtb3N0IHNpZ25pZmljYW50IDMwIGJpdHMgb2YgdGhlCgkJCS8vIDY0IGJpdCBmbG9h
dGluZyBwb2ludCB2YWx1ZS4gVGhlIG90aGVyIDM0IGJpdHMgYXJlIGFzc3VtZWQgdG8gYmUg
MAoJCQkvLyBTbywgd2UgdXNlIHRoZSB1cHBlciAzMCBiaXRzIG9mICRya251bSBhcyBmb2xs
b3dzLi4uCgkJCSRzaWduID0gKCRya251bSAmIDB4ODAwMDAwMDApID4+IDMxOwoJCQkkZXhw
ID0gKCRya251bSAmIDB4N2ZmMDAwMDApID4+IDIwOwoJCQkkbWFudGlzc2EgPSAoMHgxMDAw
MDAgfCAoJHJrbnVtICYgMHgwMDBmZmZmYykpOwoJCQkkdmFsdWUgPSAkbWFudGlzc2EgLyBw
b3coIDIgLCAoMjAtICgkZXhwIC0gMTAyMykpKTsKCQkJaWYgKCRzaWduKSB7CgkJCQkkdmFs
dWUgPSAtMSAqICR2YWx1ZTsKCQkJfQoJCQkvL2VuZCBvZiBjaGFuZ2VzIGJ5IG1tcAoJCX0K
CQlpZiAoKCRya251bSAmIDB4MDEpICE9IDApIHsKCQkJJHZhbHVlIC89IDEwMDsKCQl9CgkJ
cmV0dXJuICR2YWx1ZTsKCX0KCglmdW5jdGlvbiBfZW5jb2RlVVRGMTYoJHN0cmluZykgewoJ
CSRyZXN1bHQgPSAkc3RyaW5nOwoJCWlmICgkdGhpcy0+X2RlZmF1bHRFbmNvZGluZyl7CgkJ
CXN3aXRjaCAoJHRoaXMtPl9lbmNvZGVyRnVuY3Rpb24pewoJCQkJY2FzZSAnaWNvbnYnIDoJ
ICRyZXN1bHQgPSBpY29udignVVRGLTE2TEUnLCAkdGhpcy0+X2RlZmF1bHRFbmNvZGluZywg
JHN0cmluZyk7CgkJCQkJCQkJYnJlYWs7CgkJCQljYXNlICdtYl9jb252ZXJ0X2VuY29kaW5n
JyA6CSAkcmVzdWx0ID0gbWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nLCAkdGhpcy0+X2Rl
ZmF1bHRFbmNvZGluZywgJ1VURi0xNkxFJyApOwoJCQkJCQkJCWJyZWFrOwoJCQl9CgkJfQoJ
CXJldHVybiAkcmVzdWx0OwoJfQoKCWZ1bmN0aW9uIF9HZXRJbnQ0ZCgkZGF0YSwgJHBvcykg
ewoJCSR2YWx1ZSA9IG9yZCgkZGF0YVskcG9zXSkgfCAob3JkKCRkYXRhWyRwb3MrMV0pIDw8
IDgpIHwgKG9yZCgkZGF0YVskcG9zKzJdKSA8PCAxNikgfCAob3JkKCRkYXRhWyRwb3MrM10p
IDw8IDI0KTsKCQlpZiAoJHZhbHVlPj00Mjk0OTY3Mjk0KSB7CgkJCSR2YWx1ZT0tMjsKCQl9
CgkJcmV0dXJuICR2YWx1ZTsKCX0KCn0KCgoKLyoKKiBFeHRlbmRlZCBieSBSdXNzZWxsIEJy
b3duIGZvciBUZXh0cGF0dGVybgoqLwpjbGFzcyBUZXh0cGF0dGVybl9FeGNlbF9SZWFkZXIg
ZXh0ZW5kcyBTcHJlYWRzaGVldF9FeGNlbF9SZWFkZXIgewoKZnVuY3Rpb24gZHVtcCgkcm93
X251bWJlcnM9ZmFsc2UsJGNvbF9sZXR0ZXJzPWZhbHNlLCRoZWFkZXJzPXRydWUsJG9kZD1u
dWxsLCRldmVuPW51bGwsJHNoZWV0PTAsJHRhYmxlX2NsYXNzPW51bGwpIHsKCgkJLy8gcHVs
bCBzdHlsZSBpbmZvIGZyb20gRXhjZWw/CgkJJHMgPSAkdGhpcy0+c3RvcmVfZXh0ZW5kZWRf
aW5mbzsKCgkJLy8gdG8gcHJldmVudCBsaW5lYnJlYWtzIHdoZW4gcHJlc2VydmluZyBFeGNl
bCBmb3JtYXR0aW5nLCBpbnN0ZWFkIG9mIG5vbi1zdGFuZGFyZCA8bm9icj4gdGFncwoJCSRu
b2JyID0gIndoaXRlLXNwYWNlOm5vd3JhcCI7CgoJCS8vIG9ubHkgYXBwbHkgdGFibGUgY2xh
c3MgaWYgdXNlciBoYXMgc3VwcGxpZWQKCQkkdGFibGVfY2xhc3MgPSAoJHRhYmxlX2NsYXNz
KSA/ICIgY2xhc3M9XCIiLiAkdGFibGVfY2xhc3MgLiAiXCIiIDogIiI7CgoJCSRvZGQgPSAo
JG9kZCkgPyAiIGNsYXNzPVwiIi4kb2RkLiJcIiIgOiAiIjsKCQkkZXZlbiA9ICgkZXZlbikg
PyAiIGNsYXNzPVwiIi4kZXZlbi4iXCIiIDogIiI7CgoJCS8vIHdoYXQgaXMgdGhlIGhlYWRl
cj8KCQkkaGVhZGVycyA9ICghJGNvbF9sZXR0ZXJzICYmICRoZWFkZXJzPT0xKSA/IHRydWUg
OiBmYWxzZTsKCgkJJG91dCA9ICI8dGFibGUiLiR0YWJsZV9jbGFzcy4iPlxuIjsKCgkJLy8g
Y29sdW1uIGxldHRlcnMKCQlpZiAoJGNvbF9sZXR0ZXJzKSB7CgkJCSRvdXQgLj0gIjx0aGVh
ZD5cblx0PHRyPiI7CgkJCWlmICgkcm93X251bWJlcnMpIHsKCQkJCSRvdXQgLj0gIlxuXHRc
dDx0aD4mbmJzcDwvdGg+IjsKCQkJfQoJCQlmb3IoJGk9MTskaTw9JHRoaXMtPmNvbGNvdW50
KCRzaGVldCk7JGkrKykgewoJCQkJJHN0eWxlID0gIndpZHRoOiIgLiAoJHRoaXMtPmNvbHdp
ZHRoKCRpLCRzaGVldCkqMSkgLiAicHg7IjsKCQkJCWlmICgkdGhpcy0+Y29saGlkZGVuKCRp
LCRzaGVldCkpIHsKCQkJCQkkc3R5bGUgLj0gImRpc3BsYXk6bm9uZTsiOwoJCQkJfQoJCQkJ
JHN0eWxlIC49ICRub2JyOwoJCQkJJHN0eWxlID0gJHMgPyAiIHN0eWxlPVwiIi4kc3R5bGUu
IlwiIiA6ICIiOwoJCQkJJG91dCAuPSAiXG5cdFx0PHRoIi4kc3R5bGUuIj4iIC4gc3RydG91
cHBlcigkdGhpcy0+Y29saW5kZXhlc1skaV0pIC4gIjwvdGg+IjsKCQkJfQoJCQkkb3V0IC49
ICI8L3RyPjwvdGhlYWQ+XG4iOwoJCX0KCgkJJG91dCAuPSAoISRoZWFkZXJzKSA/ICI8dGJv
ZHk+IiA6ICIiOwoJCWZvcigkcm93PTE7JHJvdzw9JHRoaXMtPnJvd2NvdW50KCRzaGVldCk7
JHJvdysrKSB7CgkJCSRyb3doZWlnaHQgPSAkdGhpcy0+cm93aGVpZ2h0KCRyb3csJHNoZWV0
KTsKCQkJJHN0eWxlID0gImhlaWdodDoiIC4gKCRyb3doZWlnaHQqKDQvMykpIC4gInB4OyI7
CgkJCWlmICgkdGhpcy0+cm93aGlkZGVuKCRyb3csJHNoZWV0KSkgewoJCQkJJHN0eWxlIC49
ICJkaXNwbGF5Om5vbmU7IjsKCQkJfQoJCQkkc3R5bGUgPSAkcyA/ICIgc3R5bGU9XCIiLiRz
dHlsZS4iXCIiIDogIiI7CgoJCQkkcm93Q2xhc3MgPSAoJHJvdyAlIDIgPT0gMCkgPyAkb2Rk
IDogJGV2ZW47CgkJCSRvdXQgLj0gKCRoZWFkZXJzICYmICRyb3cgPT0gMSkgPyAiPHRoZWFk
PlxuXHRcdCIgOiAiIjsKCQkJJG91dCAuPSAiXG5cdDx0ciIuJHN0eWxlLiRyb3dDbGFzcy4i
PiI7CgkJCWlmICgkcm93X251bWJlcnMpIHsKCQkJCSRvdXQgLj0gIlxuXHRcdDx0aD4kcm93
PC90aD4iOwoJCQl9CgkJCWZvcigkY29sPTE7JGNvbDw9JHRoaXMtPmNvbGNvdW50KCRzaGVl
dCk7JGNvbCsrKSB7CgkJCQkvLyBBY2NvdW50IGZvciBSb3dzcGFucy9Db2xzcGFucwoJCQkJ
JHJvd3NwYW4gPSAkdGhpcy0+cm93c3Bhbigkcm93LCRjb2wsJHNoZWV0KTsKCQkJCSRjb2xz
cGFuID0gJHRoaXMtPmNvbHNwYW4oJHJvdywkY29sLCRzaGVldCk7CgkJCQlmb3IoJGk9MDsk
aTwkcm93c3BhbjskaSsrKSB7CgkJCQkJZm9yKCRqPTA7JGo8JGNvbHNwYW47JGorKykgewoJ
CQkJCQlpZiAoJGk+MCB8fCAkaj4wKSB7CgkJCQkJCQkkdGhpcy0+c2hlZXRzWyRzaGVldF1b
J2NlbGxzSW5mbyddWyRyb3crJGldWyRjb2wrJGpdWydkb250cHJpbnQnXT0xOwoJCQkJCQl9
CgkJCQkJfQoJCQkJfQoJCQkJaWYoISR0aGlzLT5zaGVldHNbJHNoZWV0XVsnY2VsbHNJbmZv
J11bJHJvd11bJGNvbF1bJ2RvbnRwcmludCddKSB7CgkJCQkJJHN0eWxlID0gJHRoaXMtPnN0
eWxlKCRyb3csJGNvbCwkc2hlZXQpOwoJCQkJCWlmICgkdGhpcy0+Y29saGlkZGVuKCRjb2ws
JHNoZWV0KSkgewoJCQkJCQkkc3R5bGUgLj0gImRpc3BsYXk6bm9uZTsiOwoJCQkJCX0KCQkJ
CQkkc3R5bGUgLj0gJG5vYnI7CgkJCQkJJHN0eWxlID0gJHMgPyAiIHN0eWxlPVwiIi4kc3R5
bGUuIlwiIiA6ICIiOwoJCQkJCSR0YWcgPSAoJGhlYWRlcnMgJiYgJHJvdz09MSkgPyAidGgi
IDogInRkIjsKCQkJCQkkb3V0IC49ICJcblx0XHQ8Ii4kdGFnLiRzdHlsZS4gKCRjb2xzcGFu
ID4gMT8iIGNvbHNwYW49JGNvbHNwYW4iOiIiKSAuICgkcm93c3BhbiA+IDE/IiByb3dzcGFu
PSRyb3dzcGFuIjoiIikgLiAiPiI7CgkJCQkJJHZhbCA9ICR0aGlzLT52YWwoJHJvdywkY29s
LCRzaGVldCk7CgkJCQkJaWYgKCR2YWw9PScnKSB7ICR2YWw9IiZuYnNwOyI7IH0KCQkJCQll
bHNlIHsKCQkJCQkJJHZhbCA9IGh0bWxlbnRpdGllcygkdmFsKTsKCQkJCQkJJGxpbmsgPSAk
dGhpcy0+aHlwZXJsaW5rKCRyb3csJGNvbCwkc2hlZXQpOwoJCQkJCQlpZiAoJGxpbmshPScn
KSB7CgkJCQkJCQkkdmFsID0gIjxhIGhyZWY9XCIkbGlua1wiPiR2YWw8L2E+IjsKCQkJCQkJ
fQoJCQkJCX0KCQkJCQkkb3V0IC49IG5sMmJyKCR2YWwpOwoJCQkJCSRvdXQgLj0gIjwvIi4k
dGFnLiI+IjsKCQkJCX0KCQkJfQoJCQkkb3V0IC49ICI8L3RyPlxuIjsKCQkJJG91dCAuPSAo
JGhlYWRlcnMgJiYgJHJvdz09MSkgPyAiXG48L3RoZWFkPlxuPHRib2R5PiIgOiAiIjsKCQl9
CgkJJG91dCAuPSAiPC90Ym9keT48L3RhYmxlPiI7CgoKCgkJcmV0dXJuICRvdXQ7CgoKCgl9
CgoKCn0KCj8+CgoKCgoKPD9waHAKCmZ1bmN0aW9uIHJjYl9leGNlbCgkYXR0cywkdGhpbmcp
IHsKCgkJZ2xvYmFsICRyY2JfZXhjZWwsJGZpbGVfYmFzZV9wYXRoLCRwcm9kdWN0aW9uX3N0
YXR1czsKCgkJZXh0cmFjdChsQXR0cyhhcnJheSgKCQkJJ2ZpbGUnICAgPT4gJycsCgkJCSdz
dHlsZScgPT4gMCwKCQkJJ3RhYmxlY2xhc3MnID0+ICcnLAoJCQknc2hlZXQnID0+ICcxJywK
CQkJJ3Nob3dyb3dudW1iZXJzJyA9PiAwLAoJCQknc2hvd2NvbGxldHRlcnMnID0+IDAsCgkJ
CSdoZWFkZXJzJyA9PiAxLAoJCQknb2RkY2xhc3MnID0+ICcnLAoJCQknZXZlbmNsYXNzJyA9
PiAnJywKCQkJJ2NhY2hlZGlyJyA9PiAnY2FjaGUnCgkJKSwkYXR0cykpOwoKCgkJLy8gTWFr
ZSBzaGVldCBudW1iZXJzIG9uZS1iYXNlZAoJCSRzaGVldCA9ICRzaGVldCAtIDE7CgoKCQlp
ZiAoaXNfbnVtZXJpYygkZmlsZSkpIHsKCQkJJHdoZXJlID0gImlkID0gJGZpbGUiOwoJCX0K
CQllbHNlIHsKCQkJJHdoZXJlID0gImZpbGVuYW1lID0gJyRmaWxlJyI7CgkJfQoKCQkvLyBH
ZXQgdGhlIGZpbGUgaW5mbyBmcm9tIHRoZSBkYXRhYmFzZQoJCSRycyA9IHNhZmVfcm93KCcq
JywgJ3R4cF9maWxlJywgJHdoZXJlKTsKCgkJaWYgKGNvdW50KCRycykgPT0gMCkgewoJCQly
ZXR1cm4gcmNiX2Vycm9yKCJGaWxlIG5vdCBmb3VuZCBpbiBkYXRhYmFzZS4gIFBsZWFzZSBj
aGVjayB5b3VyIHNwZWxsaW5nIGFuZCBlbnN1cmUgdGhhdCB0aGUgZmlsZSBoYXMgYmVlbiB1
cGxvYWRlZCBmcm9tIHRoZSAnRmlsZXMnIHRhYiBpbiB5b3VyIFRleHRwYXR0ZXJuIGNvbnRy
b2wgcGFuZWwuIik7CgkJfQoKCQkkZmlsZW5hbWUgPSAkcnNbImZpbGVuYW1lIl07CgkJaWYg
KHN0cnRvbG93ZXIoc3Vic3RyKCRmaWxlbmFtZSxzdHJsZW4oJGZpbGVuYW1lKS00LDQpKSAh
PSAnLnhscycpIHsKCQkJcmV0dXJuIHJjYl9lcnJvcigiSW52YWxpZCBmaWxlIGZvcm1hdC4g
IEZpbGUgZm9ybWF0IG11c3QgYmUgLnhscyIpOwoJCX0KCgkJLy8gQ2hlY2sgaWYgdGhlIGZp
bGUgZXhpc3RzCgkJaWYgKCFmaWxlX2V4aXN0cygkZmlsZV9iYXNlX3BhdGguJy8nLiRmaWxl
bmFtZSkpIHsKCQkJcmV0dXJuIHJjYl9lcnJvcigiRmlsZSBub3QgZm91bmQgaW4gZGlyZWN0
b3J5LiAgUGxlYXNlIHJlLXVwbG9hZCBmcm9tIHRoZSAnRmlsZXMnIHRhYiBpbiB5b3VyIFRl
eHRwYXR0ZXJuIGNvbnRyb2wgcGFuZWwuIik7CgkJfQoKCQkvLyBDaGVjayBpZiB0aGUgY2Fj
aGUgZGlyZWN0b3J5IGV4aXN0cwoJCWlmICghZmlsZV9leGlzdHMoJGZpbGVfYmFzZV9wYXRo
LicvJy4kY2FjaGVkaXIpKSB7CgkJCS8vIFRyeSBhbmQgbWFrZSB0aGUgY2FjaGUgZGlyZWN0
b3J5CgkJCWlmKCFta2RpcigkZmlsZV9iYXNlX3BhdGguJy8nLiRjYWNoZWRpcikpIHsKCQkJ
cmV0dXJuIHJjYl9lcnJvcigiVGhlIGNhY2hlIGRpcmVjdG9yeSBjb3VsZCBub3QgYmUgY3Jl
YXRlZC4gIFBsZWFzZSBjcmVhdGUgaXQgbWFudWFsbHkuIik7CgkJCX0KCQl9CgoKCQkvLyBX
aGVuIHdhcyB0aGUgZmlsZSBsYXN0IG1vZGlmaWVkPwoJCSRtb2RpZmllZCA9IHN0cnRvdGlt
ZSgkcnNbIm1vZGlmaWVkIl0pOwoKCQkvLyBHZW5lcmF0ZSB0aGUgY2FjaGVkIGZpbGVuYW1l
IGJhc2VkIG9uIGxhc3QgbW9kaWZpZWQgZGF0ZSBhbmQgY29tYmluYXRpb24gb2YgdGFnIGF0
dHJpYnV0ZXMuCgkJLy8gSWYgYW55IG9mIHRoZXNlIHZhcmlhYmxlcyBjaGFuZ2UsIGEgbmV3
IGNhY2hlZCBmaWxlIHdpbGwgYmUgY3JlYXRlZCAtIGNsZXZlciwgaHVoPwoJCSRjYWNoZV9m
aWxlbmFtZSA9IG1kNSgkZmlsZW5hbWUuJHN0eWxlLiR0YWJsZWNsYXNzLiRzaGVldC4kc2hv
d3Jvd251bWJlcnMuJHNob3djb2xsZXR0ZXJzLiRoZWFkZXJzLiRvZGRjbGFzcy4kZXZlbmNs
YXNzLiRjYWNoZWRpci4kbW9kaWZpZWQpOwoJCSRjYWNoZV9sb2MgPSAkZmlsZV9iYXNlX3Bh
dGguJy8nLiRjYWNoZWRpci4nLycuJGNhY2hlX2ZpbGVuYW1lLicuaHRtbCc7CgoJCS8vIElm
IHRoZSBjYWNoZWQgZmlsZSBhbHJlYWR5IGV4aXN0cywgc2hvdyBpdCBhbmQgc3RvcCB0aGUg
cmVzdCBvZiB0aGUgcGx1Z2luIGZyb20gZXhlY3V0aW5nCgkJaWYgKGZpbGVfZXhpc3RzKCRj
YWNoZV9sb2MpKSB7CgkJCSRvdXQgPSBmaWxlX2dldF9jb250ZW50cygkY2FjaGVfbG9jKTsK
CQkJcmV0dXJuICRvdXQ7CgkJfQoJCS8vIFRoZSBjYWNoZWQgZmlsZSBkb2Vzbid0IGV4aXN0
IHlldCwgc28gbWFrZSBpdCwgc2F2ZSBpdCBhbmQgc2hvdyBpdAoJCWVsc2UgewoJCQkkcmNi
X2V4Y2VsID0gbmV3IFRleHRwYXR0ZXJuX0V4Y2VsX1JlYWRlcigkZmlsZV9iYXNlX3BhdGgu
Jy8nLiRmaWxlbmFtZSwkc3R5bGUpOwoJCQkkb3V0ID0gJHJjYl9leGNlbC0+ZHVtcCgkc2hv
d3Jvd251bWJlcnMsJHNob3djb2xsZXR0ZXJzLCRoZWFkZXJzLCRvZGRjbGFzcywkZXZlbmNs
YXNzLCRzaGVldCwkdGFibGVjbGFzcyk7CgkJCSRmcCA9IGZvcGVuKCRjYWNoZV9sb2MsJ3cn
KTsKCQkJZndyaXRlKCRmcCwkb3V0KTsKCQkJZmNsb3NlKCRmcCk7CgkJCXJldHVybiAkb3V0
OwoJCX0KCgp9CgpmdW5jdGlvbiByY2JfZXJyb3IoJGVycl9tZXNzYWdlKSB7CgoJZ2xvYmFs
ICRwcm9kdWN0aW9uX3N0YXR1czsKCgkvLyBEb24ndCBkaXNwbGF5IGFueSBlcnJvcnMgaWYg
c2l0ZSdzIHByb2R1Y3Rpb24gc3RhdHVzIGlzIGxpdmUKCWlmICgkcHJvZHVjdGlvbl9zdGF0
dXMgPT0gJ2xpdmUnKSByZXR1cm47CglyZXR1cm4gJGVycl9tZXNzYWdlOwoKfQoKCgoiO3M6
MzoibWQ1IjtzOjMyOiJlMDU4NzczYTFkMjFjZWNiMTFhNzU2MDYyYTRhZDdhZCI7fQ==
Last edited by txpdevcoder (2014-05-14 13:43:40)
Offline