Go to main content

Textpattern CMS support forum

You are not logged in. Register | Login | Help

#817 2020-06-24 19:45:31

whocarez
Plugin Author
From: Germany/Ukraine
Registered: 2007-10-08
Posts: 305
Website GitHub Twitter

Re: tru_tags: A tagging plugin for textpattern

After updating another installation without my own permanent link format, means with untouched files, I have to correct my answer from the release thread, . The bug is still present in 4.8.1.. Changing the load order, didn’t help.

For nginx I needed this rewriting rule:
rewrite ^/tag/(.+)/$ /index.php?s=tag&t=$1;

In the 4.8.1 installation where it works, I use my modified permalink format "title_id". And there I added for example in the chopUrl function in publish.php the line $req = preg_replace('/\_/', '/', $req);. Maybe that’s why it is working there.

Last edited by whocarez (2020-06-24 19:59:31)

Offline

#818 2020-06-24 21:01:03

Bloke
Developer
From: Leeds, UK
Registered: 2006-01-29
Posts: 11,250
Website GitHub

Re: tru_tags: A tagging plugin for textpattern

Hmmmm, what happens if you set the load order to 4 and mod the plugin as follows:

if (tru_tags_clean_urls()) {
	// register_callback('tru_tags_clean_url_handler', 'pretext');
	tru_tags_clean_url_handler();
}

function tru_tags_clean_url_handler($event = null, $step = null) {
...
}

The smd plugin menagerie — for when you need one more gribble of power from Textpattern. Bleeding-edge code available on GitHub.

Txp Builders – finely-crafted code, design and Txp

Online

#819 2020-06-24 21:28:11

whocarez
Plugin Author
From: Germany/Ukraine
Registered: 2007-10-08
Posts: 305
Website GitHub Twitter

Re: tru_tags: A tagging plugin for textpattern

It works, but only with an load order of at least 4 … Thanks!

Last edited by whocarez (2020-06-24 22:05:57)

Offline

#820 2020-06-24 22:04:25

etc
Developer
Registered: 2010-11-11
Posts: 5,028
Website GitHub

Re: tru_tags: A tagging plugin for textpattern

Probably, if your plugin sets global $pretext['s'] on pretext callback, the load order is not important (untested) not valid any more, sorry. Instead, if your plugin rewrites request_uri, you must set its load order < 5 and

register_callback('my_uri_rewrite', 'pretext', '', 1);

Last edited by etc (2020-06-25 12:07:34)

Offline

#821 2020-06-25 12:08:13

etc
Developer
Registered: 2010-11-11
Posts: 5,028
Website GitHub

Re: tru_tags: A tagging plugin for textpattern

Up, please test (4.8.1+ only).

# Name: tru_tags v3.9.2 
# Type: Admin/Public/AJAX plugin
# Article tagging
# Author: Nathan Arthur
# URL: http://www.rainskit.com/
# Recommended load order: 5

# .....................................................................
# This is a plugin for Textpattern CMS - http://textpattern.com/
# To install: textpattern > admin > plugins
# Paste the following text into the 'Install plugin' box:
# .....................................................................

YToxMTp7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjY6ImF1dGhvciI7czoxMzoiTmF0
aGFuIEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoyNDoiaHR0cDovL3d3dy5yYWluc2tp
dC5jb20vIjtzOjc6InZlcnNpb24iO3M6NToiMy45LjIiO3M6MTE6ImRlc2NyaXB0aW9uIjtz
OjE1OiJBcnRpY2xlIHRhZ2dpbmciO3M6NDoiY29kZSI7czo0NTkyNToiIyBDb3B5cmlnaHQg
MjAxNyBOYXRoYW4gQXJ0aHVyDQojIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExp
Y2Vuc2UsIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNl
bnNlLnBocCBmb3IgZGV0YWlscw0KIw0KIyBUaGlzIHdvcmsgd2FzIG9yaWdpbmFsbHkgaW5z
cGlyZWQgYnkgcmFuX3RhZ3MgYnkgUmFuIEFyb3Vzc2ksIG9yaWdpbmFsbHkgZm91bmQgYXQg
aHR0cDovL2Fyb3Vzc2kuY29tL2FydGljbGUvNDUvdGFnZ2luZy10ZXh0cGF0dGVybg0KIyBK
YXZhc2NyaXB0IGJ1ZyBmaXhlcyB3ZXJlIHByb3ZpZGVkIGJ5IHRoZV9naG9zdCAtIGh0dHA6
Ly92aWN0b3J1cy5uZXQNCiMgSmF2YXNjcmlwdCBjb2RlIGZvciB0aGUgdGFnIGF1dG8tY29t
cGxldGUgZmVhdHVyZSB3YXMgcHJvdmlkZWQgYnkgSmltIEJpYW5jb2xvIC0gaHR0cDovL3d3
dy5iaWFuY29sby5jb20vDQojIEZpeGVzIGZvciBUZXh0cGF0dGVybiA0LjYgcHJvdmlkZWQg
Ynk6DQojICAgLSBSaW1hcyBLdWRlbGlzOyBodHRwczovL2dpdGh1Yi5jb20vcmltYXMta3Vk
ZWxpcw0KIyAgIC0gam9vbHMtcjsgaHR0cHM6Ly9naXRodWIuY29tL2pvb2xzLXINCiMgICAt
IFNpbW9uIEZpbmNoOyBodHRwczovL2dpdGh1Yi5jb20vc3BpZmZpbg0KDQoNCiMjIyBDT05G
SUdVUkFUSU9OICMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgVFVSTiBCQUNLISAg
Q29uZmlndXJhdGlvbiBpcyBubyBsb25nZXIgaGFuZGxlZCBieSBlZGl0aW5nIHRoZSBwbHVn
aW4uDQojIENoZWNrIG91dCB0aGUgJ0V4dGVuc2lvbnMnIHRhYiBpbiB0aGUgVGV4dHBhdHRl
cm4gYWRtaW4gOikNCg0KDQojIENoYW5naW5nIHRoZXNlIHdvbid0IGRvIGFueSBnb29kLiAg
VGhleSdyZSBqdXN0IGhlcmUgYXMgYSBjb252ZW5pZW5jZSBmb3IgZGV2ZWxvcG1lbnQuDQpk
ZWZpbmUoJ1RSVV9UQUdTX0ZJRUxEJywgJ0tleXdvcmRzJyk7DQpkZWZpbmUoJ0VOQ09ESU5H
JywgJ3V0Zi04Jyk7DQoNCmRlZmluZSgnQ0xFQU5fVVJMUycsICdjbGVhbl91cmxzJyk7DQpk
ZWZpbmUoJ1RBR19TRUNUSU9OJywgJ3RhZ19zZWN0aW9uJyk7DQpkZWZpbmUoJ1BBUk1fTkFN
RScsICdwYXJtJyk7DQpkZWZpbmUoJ1RBR1NfSU5fRkVFRF9DQVRFR09SSUVTJywgJ3RhZ3Nf
aW5fZmVlZF9jYXRlZ29yaWVzJyk7DQpkZWZpbmUoJ1RBR1NfSU5fRkVFRF9CT0RZJywgJ3Rh
Z3NfaW5fZmVlZF9ib2R5Jyk7DQpkZWZpbmUoJ1RBR1NfSU5fV1JJVEVfVEFCJywgJ3RhZ3Nf
aW5fd3JpdGVfdGFiJyk7DQpkZWZpbmUoJ0FVVE9DT01QTEVURV9JTl9XUklURV9UQUInLCAn
YXV0b2NvbXBsZXRlX2luX3dyaXRlX3RhYicpOw0KZGVmaW5lKCdVVEZfOF9DQVNFJywgJ3V0
Zl84X2Nhc2UnKTsNCg0KZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCiR0cnVfdGFnc19wcmVm
cyA9IHRydV90YWdzX2xvYWRfcHJlZnMoKTsNCg0KDQojIyMgVEFHIFJFR0lTVFJBVElPTiAj
IyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpUeHA6OmdldCgnXFRleHRwYXR0ZXJu
XFRhZ1xSZWdpc3RyeScpDQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfaGFuZGxlcicpDQoJLT5y
ZWdpc3RlcigndHJ1X3RhZ3NfaWZfaGFzX3RhZ3MnKQ0KCS0+cmVnaXN0ZXIoJ3RydV90YWdz
X2Zyb21fYXJ0aWNsZScpDQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfY2xvdWQnKQ0KCS0+cmVn
aXN0ZXIoJ3RydV90YWdzX2xpc3QnKQ0KCS0+cmVnaXN0ZXIoJ3RydV90YWdzX2lmX3RhZ19z
ZWFyY2gnKQ0KCS0+cmVnaXN0ZXIoJ3RydV90YWdzX3RhZ19wYXJhbWV0ZXInKQ0KCS0+cmVn
aXN0ZXIoJ3RydV90YWdzX3NlYXJjaF9yZXN1bHRfZXhjZXJwdCcpDQoJLT5yZWdpc3Rlcign
dHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcicpDQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfcmVs
YXRlZF90YWdzX2Zyb21fc2VhcmNoJykNCgktPnJlZ2lzdGVyKCd0cnVfdGFnc19hcmNoaXZl
JykNCgktPnJlZ2lzdGVyKCd0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnJyk7DQoNCiMj
IyBQUklNQVJZIFRBRyBGVU5DVElPTlMgIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIw0KDQpmdW5jdGlvbiB0cnVfdGFnc19oYW5kbGVyKCRhdHRzKSB7DQoJJHRhZ19wYXJh
bWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsNCglpZiAo
IWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgew0KCQlpZiAodHJ1X3RhZ3NfcmVkaXJlY3RfaWZf
bmVlZGVkKCR0YWdfcGFyYW1ldGVyKSkgew0KCQkJcmV0dXJuICcnOw0KCQl9DQoJCSRjbGVh
bl9hdHRzID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0
ZXIpOw0KCQkkcmVzdWx0ID0gZG9BcnRpY2xlcygkY2xlYW5fYXR0cywgdHJ1ZSk7CQkjZnVu
Y3Rpb24gaW4gVFhQIGNvZGUNCgkJaWYgKHRyaW0oJHJlc3VsdCkgPT0gJycpIHsNCgkJCWlm
IChpc3NldCgkYXR0c1snbm9hcnRpY2xlcyddKSkgew0KCQkJCXRydV90YWdzX3JlZGlyZWN0
KCRhdHRzWydub2FydGljbGVzJ10sIHRydWUpOw0KCQkJfSBlbHNlIGlmIChpc3NldCgkYXR0
c1snNDA0cmVkaXJlY3QnXSkgJiYgISRhdHRzWyc0MDRyZWRpcmVjdCddKSB7DQoJCQkJcmV0
dXJuICRyZXN1bHQ7DQoJCQl9IGVsc2Ugew0KCQkJCXR4cF9kaWUoZ1R4dCgnNDA0X25vdF9m
b3VuZCcpLCAnNDA0Jyk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gJHJlc3VsdDsN
CgkJfQ0KCX0gZWxzZSB7DQoJCXJldHVybiB0cnVfdGFnc19jbG91ZCgkYXR0cyk7DQoJfQ0K
fQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FyY2hpdmUoJGF0dHMpIHsNCglnbG9iYWwgJHRy
dV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWc7DQoJJHRhZ3MgPSBhcnJheV91bmlxdWUodHJ1
X3RhZ3NfY2xvdWRfcXVlcnkodHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0
dHMsIGZhbHNlLCBmYWxzZSkpKTsNCgluYXRjYXNlc29ydCgkdGFncyk7DQoJZm9yZWFjaCAo
JHRhZ3MgYXMgJHRhZykgew0KCQkkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZyA9ICR0
YWc7DQoJCSRjbGVhbl9hdHRzID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywg
JHRhZyk7DQoJCSRyZXN1bHRzW10gPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVlKTsJ
CSNmdW5jdGlvbiBpbiBUWFAgY29kZQ0KCX0NCglyZXR1cm4gam9pbignICcsICRyZXN1bHRz
KTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKCRhdHRz
KSB7DQoJZ2xvYmFsICR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnOw0KCWV4dHJhY3Qo
bEF0dHMoYXJyYXkoJ2xpbmsnID0+ICcwJyksICAkYXR0cywgMCkpOw0KCWlmICgkbGluaykg
ew0KCQlyZXR1cm4gJzxhIGhyZWY9IicgLiB0cnVfdGFnc19saW5raWZ5X3RhZygkdHJ1X3Rh
Z3NfY3VycmVudF9hcmNoaXZlX3RhZykgLiAnIj4nIC4gJHRydV90YWdzX2N1cnJlbnRfYXJj
aGl2ZV90YWcgLiAnPC9hPic7DQoJfSBlbHNlIHsNCgkJcmV0dXJuICR0cnVfdGFnc19jdXJy
ZW50X2FyY2hpdmVfdGFnOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZCgk
YXR0cykgew0KCXJldHVybiB0cnVfdGFnc19saXN0KHRydV90YWdzX2dldF9zdGFuZGFyZF9j
bG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVf
dGFnc19saXN0KCRhdHRzKSB7DQoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xv
dWRfYXR0cygkYXR0cywgdHJ1ZSwgZmFsc2UpOw0KCSRhbGxfdGFncyA9IHRydV90YWdzX2Ns
b3VkX3F1ZXJ5KCRhdHRzKTsNCg0KCXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0
dHMsICRhbGxfdGFncywgJGFsbF90YWdzKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19m
cm9tX2FydGljbGUoJGF0dHMpIHsNCglnbG9iYWwgJHRoaXNhcnRpY2xlOw0KCWV4dHJhY3Qo
JHRoaXNhcnRpY2xlKTsNCg0KCSRhbGxfdGFncyA9IHRydV90YWdzX2dldF90YWdzX2Zvcl9h
cnRpY2xlKCR0aGlzaWQpOw0KDQoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xv
dWRfYXR0cygkYXR0cywgZmFsc2UsIHRydWUpOw0KCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0g
JGFsbF90YWdzOw0KCWlmICgkYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7DQoJCSRhbGxf
dGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOw0KCX0NCg0K
CXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90
YWdzX2Zvcl93ZWlnaHQpOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2lmX2hhc190YWdz
KCRhdHRzLCAkdGhpbmcpIHsNCglnbG9iYWwgJHRoaXNhcnRpY2xlOw0KCWV4dHJhY3QoJHRo
aXNhcnRpY2xlKTsNCg0KCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7DQoNCgkkcnMg
PSBzYWZlX3JvdygkdGFnc19maWVsZCwgInRleHRwYXR0ZXJuIiwgIklEPSckdGhpc2lkJyBB
TkQgJHRhZ3NfZmllbGQgPD4gJyciKTsNCglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5n
LCAkcnMpKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19pZl90YWdfc2VhcmNoKCRhdHRz
LCAkdGhpbmcpIHsNCglleHRyYWN0KGxBdHRzKGFycmF5KCd0YWcnID0+ICcnKSwgICRhdHRz
LCAwKSk7DQoNCgkkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJy
YXkoJ3N0cmlwaHlwaGVucycgPT4gMSksIGZhbHNlKTsNCgkkY29uZGl0aW9uID0gKCFlbXB0
eSgkdGFnX3BhcmFtZXRlcikpID8gdHJ1ZSA6IGZhbHNlOw0KCWlmICgkY29uZGl0aW9uICYm
ICFlbXB0eSgkdGFnKSkgew0KCQkkY29uZGl0aW9uID0gKCR0YWdfcGFyYW1ldGVyID09ICR0
YWcpOw0KCX0NCglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkY29uZGl0aW9uKSk7
DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcigkYXR0cywgJHNhZmVo
dG1sID0gdHJ1ZSkgew0KCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJZXh0cmFjdChsQXR0
cyhhcnJheSgnc3RyaXBoeXBoZW5zJyA9PiAnMCcsICd1cmxlbmNvZGUnID0+IDApLCAgJGF0
dHMsIDApKTsNCg0KCSRwYXJtID0gdXJsZGVjb2RlKHN0cmlwX3RhZ3MoZ3BzKCR0cnVfdGFn
c19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSkpKTsNCglpZiAoJ2xvb2t1cCcgPT0gJHN0cmlw
aHlwaGVucykgew0KCQkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRz
KGFycmF5KCksIGZhbHNlLCBmYWxzZSk7DQoJCSR0YWdfbGlzdCA9IGFycmF5X3VuaXF1ZSh0
cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cykpOw0KCQlmb3JlYWNoICgkdGFnX2xpc3QgYXMg
JGNsb3VkX3RhZykgew0KCQkJaWYgKCRwYXJtID09IHN0cl9yZXBsYWNlKCcgJywgJy0nLCAk
Y2xvdWRfdGFnKSkgew0KCQkJCSRwYXJtID0gJGNsb3VkX3RhZzsNCgkJCQlicmVhazsNCgkJ
CX0NCgkJfQ0KCX0gZWxzZSBpZiAoJHN0cmlwaHlwaGVucykgew0KCQkkcGFybSA9IHN0cl9y
ZXBsYWNlKCctJywgJyAnLCAkcGFybSk7DQoJfQ0KCWlmICgkdXJsZW5jb2RlKSB7DQoJCSRw
YXJtID0gdXJsZW5jb2RlKCRwYXJtKTsNCgkgfSBlbHNlIGlmICgkc2FmZWh0bWwpIHsNCgkJ
JHBhcm0gPSBodG1sc3BlY2lhbGNoYXJzKCRwYXJtKTsNCgl9DQoNCglyZXR1cm4gJHBhcm07
DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3Jlc3VsdF9leGNlcnB0KCRhdHRz
KSB7DQoJZ2xvYmFsICRwcmV0ZXh0Ow0KDQoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190
YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsNCglpZiAodHJpbSgkdGFnX3BhcmFtZXRl
cikgIT0gJycpIHsNCgkJJHEgPSAkcHJldGV4dFsncSddOw0KCQkkcHJldGV4dFsncSddID0g
JHRhZ19wYXJhbWV0ZXI7DQoJCSRyZXN1bHQgPSBzZWFyY2hfcmVzdWx0X2V4Y2VycHQoJGF0
dHMpOw0KCQkkcHJldGV4dFsncSddID0gJHE7DQoJfSBlbHNlIHsNCgkJJHJlc3VsdCA9IHNl
YXJjaF9yZXN1bHRfZXhjZXJwdCgkYXR0cyk7DQoJfQ0KCXJldHVybiAkcmVzdWx0Ow0KfQ0K
DQoNCmZ1bmN0aW9uIHRydV90YWdzX3NlYXJjaF9wYXJhbWV0ZXIoKSB7DQoJdHJpZ2dlcl9l
cnJvcihnVHh0KCdkZXByZWNhdGVkX3RhZycpLCBFX1VTRVJfTk9USUNFKTsNCglyZXR1cm4g
c3RyaXBfdGFncyhncHMoJ3EnKSk7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfcmVsYXRl
ZF90YWdzX2Zyb21fc2VhcmNoKCRhdHRzKSB7DQoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFn
c190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsNCglleHRyYWN0KGxBdHRzKGFycmF5
KCd0YWdfcGFyYW1ldGVyJyA9PiAkdGFnX3BhcmFtZXRlciksICAkYXR0cywgMCkpOw0KCWlm
ICghZW1wdHkoJHRhZ19wYXJhbWV0ZXIpKSB7DQogICAgICAgICR0YWdzX2ZpZWxkID0gVFJV
X1RBR1NfRklFTEQ7DQoJCSRhbGxfdGFncyA9IGFycmF5KCk7DQoNCgkJJHF1ZXJ5X2F0dHMg
PSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7DQoJ
CSRycyA9IHRydV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2goJHF1ZXJ5X2F0dHMpOw0KCQlp
ZiAoJHJzKSB7DQoJCQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsNCgkJCQkkYXJ0aWNs
ZV90YWdzID0gYXJyYXkoKTsNCgkJCQlpZiAoaXNzZXQoJGFbJHRhZ3NfZmllbGRdKSkgew0K
CQkJCQkkYXJ0aWNsZV90YWdzID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9s
b3dlcigkYVskdGFnc19maWVsZF0pKSk7DQoJCQkJfQ0KCQkJCSMgZmFzdGVyIGltcGxlbWVu
dGF0aW9uIG9mIGFycmF5X21lcmdlKCksIHRoYW5rcyB0byB3aG9jYXJleg0KCQkJCSMgKGh0
dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9MjM4MzczI3Ay
MzgzNzMpDQoJCQkJZm9yZWFjaCh0cnVfdGFnc190cmltX3RhZ3MoJGFydGljbGVfdGFncykg
YXMgJGkpIHskYWxsX3RhZ3NbXSA9ICRpO30NCgkJCX0NCgkJfQ0KDQoJCSRhbHRfdGFnX3Bh
cmFtZXRlciA9IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkdGFnX3BhcmFtZXRlcik7DQoJCWZv
cmVhY2ggKCRhbGxfdGFncyBhcyAka2V5ID0+ICR0YWcpIHsNCgkJCWlmICgkdGFnID09ICR0
YWdfcGFyYW1ldGVyIHx8ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVyKSB7DQoJCQkJdW5z
ZXQoJGFsbF90YWdzWyRrZXldKTsNCgkJCX0NCgkJfQ0KDQoJCSRjbG91ZF9hdHRzID0gdHJ1
X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIGZhbHNlLCBmYWxzZSk7DQoJ
CSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gJGFsbF90YWdzOw0KCQlpZiAoJGNsb3VkX2F0dHNb
J3VzZW92ZXJhbGxjb3VudHMnXSkgew0KCQkJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSB0cnVf
dGFnc19jbG91ZF9xdWVyeSgkY2xvdWRfYXR0cyk7DQoJCX0NCg0KCQlyZXR1cm4gdHJ1X3Rh
Z3NfcmVuZGVyX2Nsb3VkKCRjbG91ZF9hdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFnc19mb3Jf
d2VpZ2h0KTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gJyc7DQoJfQ0KfQ0KDQoNCiMjIyBDTE9V
RCBTVVBQT1JUIEZVTkNUSU9OUyAjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMs
ICRpc0xpc3QsICRpc0FydGljbGUsICRzaG93QWxsPWZhbHNlKSB7DQoJcmV0dXJuIGxBdHRz
KGFycmF5KCd3cmFwdGFnJwk9PiAoJGlzTGlzdCA/ICd1bCcgOiAnJyksDQoJCQknYnJlYWsn
CQk9PiAoJGlzTGlzdCA/ICdsaScgOiAnLCAnKSwNCgkJCSdjbGFzcycJCT0+ICcnLA0KCQkJ
J2JyZWFrY2xhc3MnCT0+ICcnLA0KCQkJJ3NlY3Rpb24nCT0+ICcnLA0KCQkJJ21pbnBlcmNl
bnQnCT0+ICcxMDAnLA0KCQkJJ21heHBlcmNlbnQnCT0+ICgkaXNMaXN0IHx8ICRpc0FydGlj
bGUgPyAnMTAwJyA6ICcyMDAnKSwNCgkJCSdzaG93Y291bnRzJwk9PiAnJywNCgkJCSdjb3Vu
dHdyYXBjaGFycycJPT4gJ1tdJywNCgkJCSd1c2VyZWx0YWcnCT0+ICgkaXNBcnRpY2xlID8g
JzEnIDogJycpLA0KCQkJJ2dlbmVyYXRlbGlua3MnCT0+ICcxJywNCgkJCSdtaW50YWdjb3Vu
dCcJPT4gJzAnLA0KCQkJJ21heHRhZ2NvdW50Jwk9PiAnMTAwMCcsDQoJCQknc2V0c2l6ZXMn
CT0+ICgkaXNBcnRpY2xlID8gJzAnIDogJzEnKSwNCgkJCSd1c2Vub2ZvbGxvdycJPT4gJycs
DQoJCQknc29ydCcJCT0+ICdhbHBoYScsDQoJCQkndXNlb3ZlcmFsbGNvdW50cycJPT4gJycs
DQoJCQknc2V0Y2xhc3NlcycJPT4gKCRpc0FydGljbGUgPyAnMCcgOiAnMScpLA0KCQkJJ3Rp
dGxlJwkJPT4gJycsDQoJCQknbGlzdGxpbWl0Jwk9PiAnJywNCgkJCSdrZWVwJwkJPT4gJ2xh
cmdlc3QnLA0KCQkJJ2N1dG9mZicJPT4gJ2NodW5rJywNCgkJCSd0ZXh0dHJhbnNmb3JtJwk9
PiAnbm9uZScsDQoJCQknbGlua3BhdGgnCT0+ICcnLA0KCQkJJ2xpbmtwYXRodGFpbCcJPT4g
JycsDQoJCQknZmlsdGVyc2VhcmNoJwk9PiAoJHNob3dBbGwgPyAwIDogJzEnKSwNCgkJCSdl
eGNsdWRlc2VjdGlvbic9PiAnJywNCgkJCSdhY3RpdmVjbGFzcycJPT4gJ3RhZ0FjdGl2ZScs
DQoJCQkndGltZScJCT0+ICgkc2hvd0FsbCA/ICdhbnknIDogJ3Bhc3QnKQ0KCQkpLCRhdHRz
LCAwKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cykgew0K
CWV4dHJhY3QoJGF0dHMpOw0KDQoJJHNlY3Rpb25fY2xhdXNlID0gJyc7DQoJaWYgKCRzZWN0
aW9uIDw+ICcnKSB7DQoJCSRrZXlzID0gZXhwbG9kZSgnLCcsICRzZWN0aW9uKTsNCgkJZm9y
ZWFjaCAoJGtleXMgYXMgJGtleSkgew0KCQkJJGtleXBhcnRzW10gPSAiIFNlY3Rpb24gPSAn
IiAuIHRyaW0oJGtleSkgLiAiJyI7DQoJCX0NCgkJJHNlY3Rpb25fY2xhdXNlID0gIiBBTkQg
KCIgLiBqb2luKCcgb3IgJywgJGtleXBhcnRzKSAuICIpIjsNCgl9DQoNCgkkdGFnc19maWVs
ZCA9IFRSVV9UQUdTX0ZJRUxEOw0KCWluY2x1ZGVfb25jZSB0eHBhdGguJy9wdWJsaXNoL3Nl
YXJjaC5waHAnOw0KDQoJJGZpbHRlciA9IHRydV90YWdzX2ZpbHRlcl9zZWN0aW9ucygkZXhj
bHVkZXNlY3Rpb24pOw0KCSRmaWx0ZXIgLj0gKCRmaWx0ZXJzZWFyY2ggPyBmaWx0ZXJTZWFy
Y2goKSA6ICcnKTsNCg0KCXN3aXRjaCAoJHRpbWUpIHsNCgkJY2FzZSAnYW55JzoNCgkJCSR0
aW1lID0gIiI7IGJyZWFrOw0KCQljYXNlICdmdXR1cmUnOg0KCQkJJHRpbWUgPSAiIGFuZCBQ
b3N0ZWQgPiBub3coKSI7IGJyZWFrOw0KCQlkZWZhdWx0Og0KCQkJJHRpbWUgPSAiIGFuZCBQ
b3N0ZWQgPD0gbm93KCkiOw0KCX0NCglnbG9iYWwgJHByZWZzOw0KCWV4dHJhY3QoJHByZWZz
KTsNCglpZiAoISRwdWJsaXNoX2V4cGlyZWRfYXJ0aWNsZXMpIHsNCgkJJHRpbWUgLj0gIiBh
bmQgKG5vdygpIDw9IEV4cGlyZXMgb3IgRXhwaXJlcyBJUyBOVUxMKSI7DQoJfQ0KDQoJJGFs
bF90YWdzID0gYXJyYXkoKTsNCgkkcnMgPSBzYWZlX3Jvd3MoIiR0YWdzX2ZpZWxkIiwgInRl
eHRwYXR0ZXJuIiwgIiR0YWdzX2ZpZWxkIDw+ICcnIiAuICRzZWN0aW9uX2NsYXVzZSAuICRm
aWx0ZXIgLiAiIGFuZCBTdGF0dXMgPj0gJzQnIiAuICR0aW1lKTsNCglmb3JlYWNoICgkcnMg
YXMgJHJvdykgew0KCQkkdGVtcF9hcnJheSA9IGFycmF5KCk7DQoJCWlmIChpc3NldCgkcm93
WyR0YWdzX2ZpZWxkXSkpIHsNCgkJCSR0ZW1wX2FycmF5ID0gZXhwbG9kZSgiLCIsIHRyaW0o
dHJ1X3RhZ3Nfc3RydG9sb3dlcigkcm93WyR0YWdzX2ZpZWxkXSkpKTsNCgkJfQ0KCQkjIGZh
c3RlciBpbXBsZW1lbnRhdGlvbiBvZiBhcnJheV9tZXJnZSgpLCB0aGFua3MgdG8gd2hvY2Fy
ZXoNCgkJIyAoaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3Bp
ZD0yMzgzNzMjcDIzODM3MykNCgkJZm9yZWFjaCh0cnVfdGFnc190cmltX3RhZ3MoJHRlbXBf
YXJyYXkpIGFzICRpKSB7JGFsbF90YWdzW10gPSAkaTt9DQoJfQ0KDQoJcmV0dXJuICRhbGxf
dGFnczsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMoJGV4Y2x1
ZGVzZWN0aW9uKSB7DQoJJHNlY3Rpb25zID0gZXhwbG9kZSgnLCcsICRleGNsdWRlc2VjdGlv
bik7DQoJJGZpbHRlcnMgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCRzZWN0aW9ucyBhcyAkc2Vj
dGlvbikgew0KCQkkZmlsdGVyc1tdID0gImFuZCBTZWN0aW9uICE9ICciLmRvU2xhc2goJHNl
Y3Rpb24pLiInIjsNCgl9DQoJcmV0dXJuIGpvaW4oJyAnLCAkZmlsdGVycyk7DQp9DQoNCg0K
ZnVuY3Rpb24gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxf
dGFnc19mb3Jfd2VpZ2h0KSB7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCglleHRyYWN0
KCRhdHRzKTsNCg0KCSR0YWdzX3dlaWdodCA9IGFycmF5X2NvdW50X3ZhbHVlcygkYWxsX3Rh
Z3NfZm9yX3dlaWdodCk7DQoNCglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAk
d2VpZ2h0KSB7DQoJCWlmICghaW5fYXJyYXkoJHRhZywgJGFsbF90YWdzKQ0KCQkgICB8fCAk
dGFnc193ZWlnaHRbJHRhZ10gPCAkbWludGFnY291bnQNCgkJICAgfHwgJHRhZ3Nfd2VpZ2h0
WyR0YWddID4gJG1heHRhZ2NvdW50KSB7DQoJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRhZ10p
Ow0KCQl9DQoJfQ0KDQoJJHNvcnRfYnlfY291bnQgPSAoc3RycG9zKCRzb3J0LCAnY291bnQn
KSAhPT0gZmFsc2UpOw0KCSRzb3J0X2FzY2VuZGluZyA9IChzdHJwb3MoJHNvcnQsICdhc2Mn
KSAhPT0gZmFsc2UpOw0KCSR0YWdzX3dlaWdodCA9IHRydV90YWdzX3NvcnRfdGFncygkdGFn
c193ZWlnaHQsICRzb3J0X2J5X2NvdW50LCAkc29ydF9hc2NlbmRpbmcpOw0KDQoJaWYgKCRs
aXN0bGltaXQgPiAwICYmICRsaXN0bGltaXQgPCBjb3VudCgkdGFnc193ZWlnaHQpKSB7DQoJ
CSRyZXNvcnRlZF90YWdzID0gYXJyYXkoKTsNCgkJaWYgKCRrZWVwID09ICdsYXJnZXN0Jykg
ew0KCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKHRydV90YWdzX3NvcnRfdGFncygk
dGFnc193ZWlnaHQsIHRydWUsIGZhbHNlKSk7DQoJCX0gZWxzZSB7DQoJCQlpZiAoJGtlZXAg
PT0gJ3JhbmRvbScpIHsNCgkJCQlmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAk
d2VpZ2h0KSB7DQoJCQkJCSRyZXNvcnRlZF90YWdzWyR0YWddID0gcmFuZCgwLCAkd2VpZ2h0
KTsNCgkJCQl9DQoJCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKHRydV90YWdzX3Nv
cnRfdGFncygkcmVzb3J0ZWRfdGFncywgdHJ1ZSwgZmFsc2UpKTsNCgkJCX0gZWxzZSBpZiAo
JGtlZXAgPT0gJ2FscGhhJykgew0KCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cygk
dGFnc193ZWlnaHQpOw0KCQkJCW5hdGNhc2Vzb3J0KCRyZXNvcnRlZF90YWdzKTsNCgkJCX0N
CgkJCSRjdXRvZmYgPSAnZXhhY3QnOw0KCQl9DQoNCgkJJGxhc3RfZ29vZF9pbmRleCA9ICRs
aXN0bGltaXQgLSAxOw0KCQlpZiAoJGN1dG9mZiA9PSAnY2h1bmsnKSB7IC8vYWx0ZXJuYXRp
dmUgaXMgJ2V4YWN0Jw0KCQkJJGxhc3Rfd2VpZ2h0ID0gLTE7DQoJCQlmb3IgKCRpID0gMDsg
JGkgPCAkbGlzdGxpbWl0ICsgMTsgJGkrKykgew0KCQkJCSRuZXdfd2VpZ2h0ID0gJHRhZ3Nf
d2VpZ2h0WyRyZXNvcnRlZF90YWdzWyRpXV07DQoJCQkJaWYgKCRuZXdfd2VpZ2h0ICE9ICRs
YXN0X3dlaWdodCkgew0KCQkJCQkkbGFzdF9nb29kX2luZGV4ID0gJGkgLSAxOw0KCQkJCQkk
bGFzdF93ZWlnaHQgPSAkbmV3X3dlaWdodDsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoJGxhc3Rf
Z29vZF9pbmRleCA8IDApIHsNCgkJCQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAt
IDE7DQoJCQl9DQoJCX0NCg0KCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2NodW5rKCRyZXNv
cnRlZF90YWdzLCAkbGFzdF9nb29kX2luZGV4ICsgMSk7DQoJCSRyZXNvcnRlZF90YWdzID0g
JHJlc29ydGVkX3RhZ3NbMF07DQoNCgkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcg
PT4gJHdlaWdodCkgew0KCQkJaWYgKCFpbl9hcnJheSgkdGFnLCAkcmVzb3J0ZWRfdGFncykp
IHsNCgkJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRhZ10pOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJ
aWYgKCRnZW5lcmF0ZWxpbmtzKSB7DQoJCWlmICgkbGlua3BhdGgpIHsNCgkJCSR1cmxwcmVm
aXggPSAkbGlua3BhdGg7DQoJCQkkdXJsc3VmZml4ID0gJGxpbmtwYXRodGFpbDsNCgkJfSBl
bHNlIHsNCgkJCWlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsNCgkJCQkkdXJscHJlZml4
ID0gaHUgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsNCgkJ
CX0gZWxzZSB7DQoJCQkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJl
ZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcmYW1wOycgLiAkdHJ1X3RhZ3NfcHJlZnNbUEFS
TV9OQU1FXS0+dmFsdWUgLiAnPSc7DQoJCQl9DQoJCQkkdXJsc3VmZml4ID0gKHRydV90YWdz
X2NsZWFuX3VybHMoKSA/ICcvJyA6ICcnKTsNCgkJfQ0KDQoJCWlmICgkdXNlcmVsdGFnKSB7
DQoJCQlpZiAoJHVzZW5vZm9sbG93KSB7DQoJCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9InRh
ZyBub2ZvbGxvdyc7DQoJCQl9IGVsc2Ugew0KCQkJCSR1cmxzdWZmaXggLj0gJyIgcmVsPSJ0
YWcnOw0KCQkJfQ0KCQl9IGVsc2UgaWYgKCR1c2Vub2ZvbGxvdykgew0KCQkJJHVybHN1ZmZp
eCAuPSAnIiByZWw9Im5vZm9sbG93JzsNCgkJfQ0KCX0NCg0KCWlmIChjb3VudCgkdGFnc193
ZWlnaHQpID4gMCkgew0KCQkkbWF4ID0gbWF4KCR0YWdzX3dlaWdodCk7DQoJCSRtaW4gPSBt
aW4oJHRhZ3Nfd2VpZ2h0KTsNCgl9IGVsc2Ugew0KCQkkbWF4ID0gJG1pbiA9IDA7DQoJfQ0K
CSRzdGVwdmFsdWUgPSAoJG1heCA9PSAkbWluKSA/IDAgOiAoJG1heHBlcmNlbnQgLSAkbWlu
cGVyY2VudCkgLyAoJG1heCAtICRtaW4pOw0KDQoJJHRhZ3NfaHRtbCA9IGFycmF5KCk7DQoJ
JHRhZ19zZWFyY2hfdGFnID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgnc3RyaXBo
eXBoZW5zJyA9PiAnbG9va3VwJykpOw0KCSR0YWdfc2VhcmNoX3RhZyA9IGZ1bmN0aW9uX2V4
aXN0cygiaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUiKSA/IGh0bWxzcGVjaWFsY2hhcnNfZGVj
b2RlKCR0YWdfc2VhcmNoX3RhZykgOiBodG1sX2VudGl0eV9kZWNvZGUoJHRhZ19zZWFyY2hf
dGFnKTsNCglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7DQoJ
CSR0YWdfd2VpZ2h0ID0gZmxvb3IoJG1pbnBlcmNlbnQgKyAoJHdlaWdodCAtICRtaW4pICog
JHN0ZXB2YWx1ZSk7DQoNCgkJJHN0eWxlID0gJyc7DQoJCWlmICgkc2V0c2l6ZXMpDQoJCQkk
c3R5bGUgPSAnIHN0eWxlPSJmb250LXNpemU6ICcgLiAkdGFnX3dlaWdodCAuICclOyInOw0K
DQoJCSR0YWdfY2xhc3MgPSAnJzsNCgkJaWYgKCRzZXRjbGFzc2VzKSB7DQoJCQkkdGFnX2Ns
YXNzID0gJyBjbGFzcz0iJzsNCgkJCWlmICgkd2VpZ2h0ID09ICRtaW4pIHsNCgkJCQkkdGFn
X2NsYXNzIC49ICJ0YWdTaXplU21hbGxlc3QiOw0KCQkJfSBlbHNlIGlmICgkd2VpZ2h0ID09
ICRtYXgpIHsNCgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTGFyZ2VzdCI7DQoJCQl9IGVs
c2Ugew0KCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVNZWRpdW0iOw0KCQkJfQ0KCQkJJHRh
Z19jbGFzcyAuPSAnIHRhZ1NpemUnIC4gKCR3ZWlnaHQgKyAxIC0gJG1pbik7DQoJCQlpZiAo
JHRhZyA9PSAkdGFnX3NlYXJjaF90YWcpIHsNCgkJCQkkdGFnX2NsYXNzIC49ICcgJyAuICRh
Y3RpdmVjbGFzczsNCgkJCX0NCgkJCSR0YWdfY2xhc3MgLj0gJyInOw0KCQl9DQoNCgkJLy9h
ZGFwdGVkIGZyb20gY29kZSBieSBnZHRyb2lhbm8sIHNlZSBodHRwOi8vZm9ydW0udGV4dHBh
dHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTEwMjg3NSNwMTAyODc1DQoJCSR0aXRsZWNv
dW50ID0gJyc7DQoJCWlmICgkdGl0bGUpDQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9Iicg
LiAkdGl0bGUgLiAnIic7DQoJCSRkaXNwbGF5Y291bnQ9ICcnOw0KCQkkY291bnQgPSAkY291
bnR3cmFwY2hhcnN7MH0gLiAkd2VpZ2h0IC4gJGNvdW50d3JhcGNoYXJzezF9Ow0KCQlpZiAo
JHNob3djb3VudHMgPT0gJ3RpdGxlJyB8fCAkc2hvd2NvdW50cyA9PSAnYm90aCcpDQoJCQkk
dGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAkY291bnQgLiAnIic7DQoJCWlm
ICgkc2hvd2NvdW50cyAmJiAkc2hvd2NvdW50cyAhPSAndGl0bGUnKQ0KCQkJJGRpc3BsYXlj
b3VudCA9ICcgJyAuICRjb3VudDsNCg0KCQlpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2NhcGl0
YWxpemUnKSB7DQoJCQkkdGFnID0gdHJ1X3RhZ3NfdWN3b3JkcygkdGFnKTsNCgkJfSBlbHNl
IGlmICgkdGV4dHRyYW5zZm9ybSA9PSAndXBwZXJjYXNlJykgew0KCQkJJHRhZyA9IHRydV90
YWdzX3N0cnRvdXBwZXIoJHRhZyk7DQoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0g
J2xvd2VyY2FzZScpIHsNCgkJCSR0YWcgPSB0cnVfdGFnc19zdHJ0b2xvd2VyKCR0YWcpOw0K
CQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdjYXBmaXJzdCcpIHsNCgkJCSR0YWcg
PSB0cnVfdGFnc191Y2ZpcnN0KCR0YWcpOw0KCQl9DQoNCgkJaWYgKCRnZW5lcmF0ZWxpbmtz
KSB7DQoJCQkkd2hvbGV1cmwgPSAnIicgLiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKCR0YWcp
IC4gJHVybHN1ZmZpeCAuICciJzsNCgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPScgLiAk
d2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQgLiAnPicgLiBo
dG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsNCgkJfSBl
bHNlIGlmICgkdGFnX2NsYXNzIHx8ICRzdHlsZSB8fCAkdGl0bGVjb3VudCkgew0KCQkJJHRh
Z3NfaHRtbFtdID0gJzxzcGFuJyAuICR0YWdfY2xhc3MgLiAkc3R5bGUgLiAkdGl0bGVjb3Vu
dCAuICc+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnPC9zcGFuPicgLiAkZGlzcGxh
eWNvdW50Ow0KCQl9IGVsc2Ugew0KCQkJJHRhZ3NfaHRtbFtdID0gaHRtbHNwZWNpYWxjaGFy
cygkdGFnKSAuICRkaXNwbGF5Y291bnQ7DQoJCX0NCgl9DQoJcmV0dXJuIHRydV90YWdzX2Rv
X3dyYXAoJHRhZ3NfaHRtbCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFz
cyk7DQp9DQoNCg0KIyMjIENMRUFOIFVSTCBGVU5DVElPTlMgIyMjDQojIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMNCg0KaWYgKHRydV90YWdzX2NsZWFuX3VybHMoKSkgew0KCXJlZ2lz
dGVyX2NhbGxiYWNrKCd0cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcicsICdwcmV0ZXh0Jywg
JycsIDApOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2NsZWFuX3VybF9oYW5kbGVyKCRl
dmVudCwgJHN0ZXApIHsNCglnbG9iYWwgJHByZXRleHQsICR0cnVfdGFnc19wcmVmczsNCg0K
CWlmICgkcHJldGV4dFswXSA+PSAyICYmICRwcmV0ZXh0WzFdID09ICR0cnVfdGFnc19wcmVm
c1tUQUdfU0VDVElPTl0tPnZhbHVlKSB7DQoJCSR0YWcgPSAkcHJldGV4dFsyXTsNCgkJaWYg
KGNvdW50KCRfUE9TVCkgPiAwKSB7DQoJCQkkX1BPU1RbJ3NlY3Rpb24nXSA9ICR0cnVfdGFn
c19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOw0KCQkJJF9QT1NUWyR0cnVfdGFnc19wcmVm
c1tQQVJNX05BTUVdLT52YWx1ZV0gPSAkdGFnOw0KCQl9IGVsc2Ugew0KCQkJJF9HRVRbJ3Nl
Y3Rpb24nXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOw0KCQkJJF9H
RVRbJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7DQoJCX0NCgkJ
JHByZXRleHRbJ3MnXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOw0K
CX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jbGVhbl91cmxzKCkgew0KCWdsb2JhbCAk
dHJ1X3RhZ3NfcHJlZnM7DQoJcmV0dXJuICgnY2xlYW4nID09ICR0cnVfdGFnc19wcmVmc1tD
TEVBTl9VUkxTXS0+dmFsdWUpOw0KfQ0KDQoNCiMjIyBBRE1JTiBTSURFIEZVTkNUSU9OUyAj
IyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KaWYgKEB0eHBpbnRlcmZhY2Ug
PT0gJ2FkbWluJykgew0KCWFkZF9wcml2cygndHJ1X3RhZ3MnLCAnMSwyJyk7DQoJcmVnaXN0
ZXJfdGFiKCdleHRlbnNpb25zJywgJ3RydV90YWdzJywgJ3RydV90YWdzJyk7DQoJcmVnaXN0
ZXJfY2FsbGJhY2soJ3RydV90YWdzX2FkbWluX3RhYicsICd0cnVfdGFncycpOw0KDQoJaWYg
KCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlIHx8ICR0cnVfdGFn
c19wcmVmc1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXS0+dmFsdWUpIHsNCgkJcmVnaXN0
ZXJfY2FsbGJhY2soJ3RydV90YWdzX2FkbWluX3dyaXRlX3RhYl9oYW5kbGVyJywgJ2FydGlj
bGVfdWknLCAna2V5d29yZHMnKTsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRt
aW5fdGFiKCRldmVudCwgJHN0ZXApIHsNCglyZXF1aXJlX3ByaXZzKCd0cnVfdGFncycpOw0K
DQoJJHJlc3VsdHMgPSB0cnVfdGFnc19hZG1pbl90YWJfaGFuZGxlX2lucHV0KCk7DQoNCgkk
YXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNl
LCBmYWxzZSwgdHJ1ZSk7DQoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0
dHMpOw0KCSRjbG91ZCA9IHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdz
LCAkYWxsX3RhZ3MpOw0KDQoJJHJlZGlyZWN0cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3Rz
KCk7DQoNCgl0cnVfdGFnc19hZG1pbl90YWJfcmVuZGVyX3BhZ2UoJHJlc3VsdHMsICRjbG91
ZCwgJHJlZGlyZWN0cyk7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX3Jl
bmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpIHsNCglnbG9iYWwgJGV2
ZW50Ow0KCXBhZ2V0b3AoJ3RydV90YWdzJywgJycpOw0KDQoJaW5jbHVkZV9vbmNlKHR4cGF0
aCAuICcvaW5jbHVkZS90eHBfcHJlZnMucGhwJyk7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVm
czsNCg0KCWVjaG8gc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+
PHRkIHN0eWxlPSJib3JkZXItcmlnaHQ6MnB4IHNvbGlkIGdyYXkiPicuICAjIEkga25vdywg
SSBrbm93Li4uDQoJCXN0YXJ0VGFibGUoJ2xheW91dCcsICcnLCAnJywgJycsICcxMHB4Jyku
Jzx0cj48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXkiPicuDQoJCQlz
dGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzMwMHB4JykuDQoJCQkJdHIoaENlbGwo
Z1R4dCgnQ3VycmVudCB0YWdzJykpKS4NCgkJCQl0cih0ZCgkY2xvdWQpKS4NCgkJCWVuZFRh
YmxlKCkuDQoJCSc8L3RkPjwvdHI+PHRyPjx0ZD4nLg0KCQkJc3RhcnRUYWJsZSgnbGlzdCcs
ICcnLCAnJywgJycsICczMDBweCcpLg0KCQkJCXRyKGhDZWxsKGdUeHQoJ3RydV90YWdzIFJl
ZmVyZW5jZScpKSkuDQoJCQkJdHIodGQoJzxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQu
Y29tL3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMiPlVzYWdlIGlu
c3RydWN0aW9uczwvYT4nLg0KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRw
YXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTE1MDg0Ij5Gb3J1bSBwYWdlczwvYT4nLg0K
CQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzUz
Ny90cnVfdGFncy1yZWxlYXNlcyI+UmVsZWFzZXMgcGFnZTwvYT4nLg0KCQkJCSc8YnI+PGEg
aHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzU1NC90cnVfdGFncy1y
b2FkbWFwIj5SZWxlYXNlIHJvYWRtYXA8L2E+Jy4NCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6
Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS80OTUvdHJ1dGFncy1mZWF0dXJlLWxpc3Qi
PkZlYXR1cmUgbGlzdDwvYT4nLg0KCQkJCSc8YnI+PGJyPjxhIGhyZWY9Imh0dHBzOi8vZ2l0
aHViLmNvbS90cnVpc3QvdHJ1LXRhZ3MvYmxvYi9tYXN0ZXIvdHJ1X3RhZ3MucGhwIj50cnVf
dGFncyBzb3VyY2UgY29kZTwvYT4nLg0KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cHM6Ly9naXRo
dWIuY29tL3RydWlzdC90cnUtdGFncy9ibG9iL21hc3Rlci90cnVfdGFncy1kb2NzLmh0bWwi
PlNvdXJjZSBIVE1MIGZvciB0aGUgdXNhZ2UgaW5zdHJ1Y3Rpb25zPC9hPicuDQoJCQkJJzxi
cj48YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vYmxvZy80OTMvdHJ1dGFn
cy1hLXRhZ2dpbmctcGx1Z2luLWZvci10ZXh0cGF0dGVybiI+dHJ1X3RhZ3M8L2E+LCBieSA8
YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS8iPk5hdGhhbiBBcnRodXI8L2E+Jy4N
CgkJCQknPGJyPjxicj4nLg0KCQkJCSc8ZGl2IGlkPSJwYXlwYWwiPjxmb3JtIGFjdGlvbj0i
aHR0cHM6Ly93d3cucGF5cGFsLmNvbS9jZ2ktYmluL3dlYnNjciIgbWV0aG9kPSJwb3N0Ij48
aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjbWQiIHZhbHVlPSJfcy14Y2xpY2siIC8+PGlu
cHV0IHR5cGU9ImltYWdlIiBzcmM9Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vZW5fVVMvaS9i
dG4veC1jbGljay1idXQwNC5naWYiIG5hbWU9InN1Ym1pdCIgYWx0PSJNYWtlIGEgZG9uYXRp
b24gdG8gTmF0aGFuIEFydGh1ciIgLz48aW1nIGFsdD0iIiBib3JkZXI9IjAiIHNyYz0iaHR0
cHM6Ly93d3cucGF5cGFsLmNvbS9lbl9VUy9pL3Njci9waXhlbC5naWYiIHdpZHRoPSIxIiBo
ZWlnaHQ9IjEiIC8+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZW5jcnlwdGVkIiB2YWx1
ZT0iLS0tLS1CRUdJTiBQS0NTNy0tLS0tTUlJSFR3WUpLb1pJaHZjTkFRY0VvSUlIUURDQ0J6
d0NBUUV4Z2dFd01JSUJMQUlCQURDQmxEQ0JqakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05W
QkFnVEFrTkJNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBiaUJXYVdWM01SUXdFZ1lEVlFRS0V3
dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0ExVUVDeFFLYkdsMlpWOWpaWEowY3pFUk1BOEdBMVVF
QXhRSWJHbDJaVjloY0dreEhEQWFCZ2txaGtpRzl3MEJDUUVXRFhKbFFIQmhlWEJoYkM1amIy
MENBUUF3RFFZSktvWklodmNOQVFFQkJRQUVnWUM4aTFUMjdsaktmcE5URVFpMHdLSGNkR3Vs
eHhrTXF3ZENNbWJHdnM4N24vNFRzSnRpQXNxTW8yaHlzN1pzR3k1UkYvTzdzK0Iyb1E3NnpV
bFQ1MldXN1FlWFVLM0dwMG5yMmNQM2lvQlN0TnUrUlo2amthbTJFMEZHTFh5VjYrVU5WRU93
aDhsbW9JU1JvdHZTdklnUXlUTG5FZURIcUc5cXZVenF2RjNTcWpFTE1Ba0dCU3NPQXdJYUJR
QXdnY3dHQ1NxR1NJYjNEUUVIQVRBVUJnZ3Foa2lHOXcwREJ3UUlwbVBacmxyWmZabUFnYWll
UFZiK245c1Zkc3VmZ0dybUF3MnJYQXpSMzlrWXFQVUo3bjBMaU5EbWRBcTczSm9QNTNrWnk4
Z1Nwb3Z1Y0wyUzBqQzFzWHJjcEVMQXBMTDhCRlNIZmRMaVpvWlNWL0NZT3BwSDUrZHgyWXFG
SWR5Q0NkaklYN29PUGdReUF1Z1JhMlFyM2IreXV0dUcwREZzZCtMQUpHYjhsNENubnJibXdk
WUszTm5WREJQT214RU9qbFhVZ0V6bEZMWG1FM3c1K01vUEtRY3AybjhmZEpMc2dHMTV4b1ZQ
RnpDZC9LMmdnZ09ITUlJRGd6Q0NBdXlnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFE
Q0JqakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFrTkJNUll3RkFZRFZRUUhFdzFO
YjNWdWRHRnBiaUJXYVdWM01SUXdFZ1lEVlFRS0V3dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0Ex
VUVDeFFLYkdsMlpWOWpaWEowY3pFUk1BOEdBMVVFQXhRSWJHbDJaVjloY0dreEhEQWFCZ2tx
aGtpRzl3MEJDUUVXRFhKbFFIQmhlWEJoYkM1amIyMHdIaGNOTURRd01qRXpNVEF4TXpFMVdo
Y05NelV3TWpFek1UQXhNekUxV2pDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdU
QWtOQk1SWXdGQVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFLRXd0UVlY
bFFZV3dnU1c1akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0ExVUVBeFFJ
YkdsMlpWOWhjR2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVqYjIwd2da
OHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFNRkhUdDM4Uk14TFhKeU8yU21T
K05kbDcyVDdvS0o0dTR1dys2YXdudEFMV2gwM1Bld21JSnV6YkFMU2NzVFM0c1pvUzFmS2Np
QkdvaDExZ0lmSHp5bHZrZE5lL2hKbDY2L1JHcXJqNXJGYjA4c0FBQk5UekRUaXFxTnBKZUJz
WXMvYzJhaUdvenB0WDJSbG5Ca3RIK1NVTnBBYWpXNzI0TnYyV3ZoaWY2c0ZBZ01CQUFHamdl
NHdnZXN3SFFZRFZSME9CQllFRkphZmZMdkdieGU5V1Q5UzF3b2I3QkRXWkpSck1JRzdCZ05W
SFNNRWdiTXdnYkNBRkphZmZMdkdieGU5V1Q5UzF3b2I3QkRXWkpScm9ZR1VwSUdSTUlHT01R
c3dDUVlEVlFRR0V3SlZVekVMTUFrR0ExVUVDQk1DUTBFeEZqQVVCZ05WQkFjVERVMXZkVzUw
WVdsdUlGWnBaWGN4RkRBU0JnTlZCQW9UQzFCaGVWQmhiQ0JKYm1NdU1STXdFUVlEVlFRTEZB
cHNhWFpsWDJObGNuUnpNUkV3RHdZRFZRUURGQWhzYVhabFgyRndhVEVjTUJvR0NTcUdTSWIz
RFFFSkFSWU5jbVZBY0dGNWNHRnNMbU52YllJQkFEQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NT
cUdTSWIzRFFFQkJRVUFBNEdCQUlGZk9sYWFnRnJsNzEranE2T0tpZGJXRlNFK1E0RnFST3Zk
Z0lPTnRoKzhrU0svL1kvNGlodUU0WW12em41Y2VFM1MvaUJTUVFNanl2YitzMlRXYlFZRHdj
cDEyOU9QSWJEOWVwZHI0dEpPVU5pU29qdzdCSHdZUmlQaDU4UzF4R2xGZ0hGWHdyRUJiM2Rn
TmJNVWErdTRxZWN0c01BWHBWSG5EOXdJeWZtSE1ZSUJtakNDQVpZQ0FRRXdnWlF3Z1k0eEN6
QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlRXOTFiblJo
YVc0Z1ZtbGxkekVVTUJJR0ExVUVDaE1MVUdGNVVHRnNJRWx1WXk0eEV6QVJCZ05WQkFzVUNt
eHBkbVZmWTJWeWRITXhFVEFQQmdOVkJBTVVDR3hwZG1WZllYQnBNUnd3R2dZSktvWklodmNO
QVFrQkZnMXlaVUJ3WVhsd1lXd3VZMjl0QWdFQU1Ba0dCU3NPQXdJYUJRQ2dYVEFZQmdrcWhr
aUc5dzBCQ1FNeEN3WUpLb1pJaHZjTkFRY0JNQndHQ1NxR1NJYjNEUUVKQlRFUEZ3MHdPREEz
TURNd05ERTBNVEphTUNNR0NTcUdTSWIzRFFFSkJERVdCQlQwdGtqNGRaTGUvRTRRd2JpYjI5
WEVkSHhBWWpBTkJna3Foa2lHOXcwQkFRRUZBQVNCZ0w1SnNRSGpROVNnNFkzZURXS0RPMTZy
K3RmRXo0UllBRHQrNmg5ODFma1ZDeGZOSEZEeG9mRGN4eXpSTVlyN3k5NWNkblZpNEFOUXdN
VVk2eUpXNWptL0dEMTdyamdTeFpNRXZzQWU2WWNDU0xLNVphcEN3MXFseVNwUEdaQkEzTVR0
Nk9EK292Vm9hLzF2OENOc0VjSHA3ZjR0T3hPVVN3NVA0bkh5TFBXai0tLS0tRU5EIFBLQ1M3
LS0tLS0iPjwvZm9ybT48L2Rpdj4nDQoJCQkJKSkuDQoJCQllbmRUYWJsZSgpLg0KCQknPC90
ZD48L3RyPicuZW5kVGFibGUoKS4NCgknPC90ZD48dGQ+Jy4NCgkJc3RhcnRUYWJsZSgnbGF5
b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJw
eCBzb2xpZCBncmF5O3dpZHRoOjQwMHB4Ij4nOw0KDQoJCWlmICgkcmVzdWx0cykgew0KCQkJ
ZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4NCgkJCQl0ciho
Q2VsbChnVHh0KCdSZXN1bHRzJykpKS4NCgkJCQl0cih0ZGEoJHJlc3VsdHMpLCAnIHN0eWxl
PSJjb2xvcjpyZWQiJykuDQoJCQllbmRUYWJsZSgpOw0KCQkJZWNobyAnPC90ZD48L3RyPjx0
cj48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXkiPic7DQoJCX0NCg0K
DQoJCWVjaG8gc3RhcnRUYWJsZSgnbGlzdCcsICcnLCAnJywgJycsICcxMDAlJykuDQoJCQl0
cih0YWcoZ1R4dCgnQXJ0aWNsZSBUYWcgTWFpbnRlbmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2Ug
U2Vuc2l0aXZlJykuJyEpJywgJ3RoJywgJyBjb2xzcGFuPSI1IicpKS4NCgkJCXRyKA0KCQkJ
CWZvcm0oDQoJCQkJCXRkYShnVHh0KCdSZW5hbWUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNh
bC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoJ21hdGNodGFnJywgJycs
ICcxNScpKS4NCgkJCQkJdGRhKGdUeHQoJ3RvJykuJzonLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1h
bGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoJ3JlcGxhY2V0YWcnLCAnJywg
JzE1JykpLg0KCQkJCQl0ZChmSW5wdXQoJ3N1Ym1pdCcsICdyZXBsYWNlJywgZ1R4dCgnUnVu
JyksICdwdWJsaXNoJykuZUlucHV0KCd0cnVfdGFncycpKSwNCgkJCQkJJycsICcgdmVyaWZ5
KFwnJyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInDQoJCQkJKQ0KCQkJKS4NCgkJ
CXRyKA0KCQkJCWZvcm0oDQoJCQkJCXRkYShnVHh0KCdEZWxldGUnKS4nOiAnLCAnIHN0eWxl
PSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoJ2RlbGV0
ZXRhZycsICcnLCAnMTUnKSkuDQoJCQkJCXRkY3MoJycsIDIpLg0KCQkJCQl0ZChmSW5wdXQo
J3N1Ym1pdCcsICdkZWxldGUnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3Ry
dV90YWdzJykpLA0KCQkJCQknJywgJyB2ZXJpZnkoXCcnIC4gZ1R4dCgnYXJlX3lvdV9zdXJl
JykgLiAnXCcpIicNCgkJCQkpDQoJCQkpLg0KCQllbmRUYWJsZSgpOw0KDQoJZWNobyAnPC90
ZD48L3RyPjx0cj48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXkiPic7
DQoNCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4NCgkJ
CXRyKHRhZyhnVHh0KCdSZWRpcmVjdGlvbnMnKSwgJ3RoJywgJyBjb2xzcGFuPSI0IicpKTsN
CgkJCWZvcmVhY2ggKCRyZWRpcmVjdHMgYXMgJGxlZnR0YWcgPT4gJHJpZ2h0dGFnKSB7DQoJ
CQkJZWNobyB0cigNCgkJCQkJdGRhKGhyZWYoJGxlZnR0YWcsIHRydV90YWdzX2xpbmtpZnlf
dGFnKCRsZWZ0dGFnKSksICcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciInKS4NCgkJCQkJ
dGRhKGh0bWxzcGVjaWFsY2hhcnMoJz0+JyksICcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRl
ciInKS4NCgkJCQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVfdGFnc19saW5raWZ5X3RhZygk
cmlnaHR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLg0KCQkJCQl0ZCgn
PGEgaHJlZj0iaW5kZXgucGhwP2V2ZW50PXRydV90YWdzJmFtcDtkZWxldGVfcmVkaXJlY3Q9
Jy51cmxlbmNvZGUoJGxlZnR0YWcpLiciICBvbmNsaWNrPSJyZXR1cm4gdmVyaWZ5KFwnJy5n
VHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj5EZWxldGU8L2E+JykNCgkJCQkpOw0KCQkJfQ0K
CQkJZWNobyB0cigNCgkJCQknPGZvcm0gbmFtZT0icmVkaXJlY3QiIGlkPSJyZWRpcmVjdCIg
bWV0aG9kPSJwb3N0IiBhY3Rpb249ImluZGV4LnBocD9ldmVudD10cnVfdGFncyIgb25zdWJt
aXQ9InJldHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPicuDQoJ
CQkJCXRkYSh0ZXh0X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0
LWFsaWduOmNlbnRlciInKS4NCgkJCQkJdGRhKGh0bWxzcGVjaWFsY2hhcnMoJz0+JyksICcg
c3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTt0ZXh0LWFsaWduOmNlbnRlciInKS4NCgkJ
CQkJdGRhKHRleHRfaW5wdXQoJ3JpZ2h0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0
LWFsaWduOmNlbnRlciInKS4NCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBvbmNsaWNrPSJpZiAo
dmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZChcJ3JlZGlyZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7Ij5BZGQgbmV3
PC9hPicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJZklucHV0
KCdoaWRkZW4nLCAncmVkaXJlY3QnLCAnMScpLg0KCQkJCSc8L2Zvcm0+Jw0KDQoJCQkpLg0K
CQllbmRUYWJsZSgpOw0KDQoJZWNobyAnPC90ZD48L3RyPjx0cj48dGQ+JzsNCg0KCQllY2hv
IHN0YXJ0VGFibGUoJ2xpc3QnKS4NCgkJCXRyKHRhZyhnVHh0KCdQcmVmZXJlbmNlcycpLCAn
dGgnLCAnIGNvbHNwYW49IjIiJykpLg0KCQkJZm9ybSgNCgkJCQl0cigNCgkJCQkJdGRhKGdU
eHQoJ1VzZSBjbGVhbiBVUkxzJykuJyAoJy5nVHh0KCdzaXRlIGRlZmF1bHQgaXMnKS4nICcu
JHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT5kZWZhdWx0X3ZhbHVlLicpOiAnLCAnIHN0
eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHJhZGlvX2xpc3QoQ0xF
QU5fVVJMUywNCgkJCQkJCQlhcnJheSgnY2xlYW4nPT5nVHh0KCdjbGVhbicpLCAnbWVzc3kn
PT5nVHh0KCdtZXNzeScpKSwNCgkJCQkJCQkkdHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10t
PnZhbHVlKSkNCgkJCQkpLg0KCQkJCXRyKA0KCQkJCQl0ZGEoZ1R4dCgnVGFnIHNlY3Rpb24g
bmFtZScpLicgKGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+
ZGVmYXVsdF92YWx1ZS4nIik6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIn
KS4NCgkJCQkJdGQodGV4dF9pbnB1dChUQUdfU0VDVElPTiwgJHRydV90YWdzX3ByZWZzW1RB
R19TRUNUSU9OXS0+dmFsdWUsICcxNScpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJCXRkYShn
VHh0KCdVUkwgcGFyYW1ldGVyIGZvciB0YWcgc2VhcmNoJykuJyAoZGVmYXVsdCBpcyAiJy4k
dHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+ZGVmYXVsdF92YWx1ZS4nIik6ICcuDQoJCQkJ
CQknPGJyPjxlbT4oeW91IHNob3VsZG5cJ3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSByZWFs
bHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcpPC9lbT4nLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1h
bGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoUEFSTV9OQU1FLCAkdHJ1X3Rh
Z3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUsICcxNScpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJ
CQkJCXRkYShnVHh0KCdQdXQgdGFncyBpbnRvIFJTUy9BdG9tIGZlZWRzLCBpbiAiQ2F0ZWdv
cnkiIGVsZW1lbnRzJykuDQoJCQkJCQknOiA8YnI+PGVtPih5b3UgcHJvYmFibHkgd2FudCB0
aGlzKTwvZW0+JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0
ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9DQVRFR09SSUVTLCAkdHJ1X3RhZ3NfcHJlZnNb
VEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkpDQoJCQkJKS4NCgkJCQl0cigNCgkJ
CQkJdGRhKCdBcHBlbmQgdGhlIHRhZyBsaXN0IHRvIHRoZSBib2R5IG9mIFJTUy9BdG9tIGZl
ZWRzLCAnLg0KCQkJCQkJJ3dpdGggbGlua3MsIGFuZCB3aXRoIHJlbD0idGFnIjonLg0KCQkJ
CQkJJzxicj48ZW0+KGlmIHRoaXMgaXMgdHVybmVkIG9uLCcuDQoJCQkJCQkneW91IGNhbiBk
ZWZpbmUgYSAibWlzYyIgZm9ybSBuYW1lZCB0cnVfdGFnc19mZWVkX3RhZ3MgJy4NCgkJCQkJ
CSd0aGF0IHdpbGwgYmUgdXNlZCB0byByZW5kZXIgdGhlIHRhZ3MgaW4gdGhlIGZlZWQpPC9l
bT4nLA0KCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0
ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9CT0RZLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19J
Tl9GRUVEX0JPRFldLT52YWx1ZSkpDQoJCQkJKS4NCgkJCQl0cigNCgkJCQkJdGRhKGdUeHQo
J1Nob3cgYSBjbGlja2FibGUgbGlzdCBvZiB0YWdzIG9uIHRoZSAiV3JpdGUiIHBhZ2UnKS4n
OiAnLA0KCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0
ZCh5ZXNub1JhZGlvKFRBR1NfSU5fV1JJVEVfVEFCLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19J
Tl9XUklURV9UQUJdLT52YWx1ZSkpDQoJCQkJKS4NCgkJCQl0cigNCgkJCQkJdGRhKGdUeHQo
J0F1dG9jb21wbGV0ZSB0YWdzIG9uIHRoZSAiV3JpdGUiIHBhZ2UnKS4nOiA8YnI+Jy4NCgkJ
CQkJCSc8ZW0+KHJlcXVpcmVzIHRoYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9iYXNzaXN0YW5j
ZS5kZS9qcXVlcnktcGx1Z2lucy9qcXVlcnktcGx1Z2luLWF1dG9jb21wbGV0ZS8iPmpRdWVy
eSBBdXRvY29tcGxldGUgcGx1Z2luPC9hPiA8Y29kZT4uY3NzPC9jb2RlPiBhbmQgPGNvZGU+
Lm1pbi5qczwvY29kZT4gZmlsZXMgYmUgdXBsb2FkZWQgaW50byBhICI8Y29kZT5qczwvY29k
ZT4iIGZvbGRlciBvbiB5b3VyIHNpdGUpPC9lbT4nLA0KCQkJCQkJJyBzdHlsZT0idmVydGlj
YWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0ZCh5ZXNub1JhZGlvKEFVVE9DT01QTEVURV9J
Tl9XUklURV9UQUIsICR0cnVfdGFnc19wcmVmc1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFC
XS0+dmFsdWUpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJCXRkYShnVHh0KCdDb252ZXJ0IHRh
Z3MgdG8gbG93ZXJjYXNlIGJ5IGRlZmF1bHQnKS4nOiA8YnI+Jy4NCgkJCQkJCSc8ZW0+KHlv
dSBwcm9iYWJseSB3YW50IHRoaXMsIHVubGVzcyB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyB3
aXRoIHV0Zi04IGNoYXJhY3RlcnMpPC9lbT4nLA0KCQkJCQkJJyBzdHlsZT0idmVydGljYWwt
YWxpZ246bWlkZGxlIicpLg0KCQkJCQl0ZCh5ZXNub1JhZGlvKFVURl84X0NBU0UsICR0cnVf
dGFnc19wcmVmc1tVVEZfOF9DQVNFXS0+dmFsdWUpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJ
CXRkKCcnKS4NCgkJCQkJdGRhKGZJbnB1dCgnc3VibWl0JywgJ3ByZWZzJywgZ1R4dCgnU2F2
ZScpLCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSwgJyBzdHlsZT0idGV4dC1hbGln
bjpyaWdodCInKQ0KCQkJCSksDQoJCQkJJycsICcgdmVyaWZ5KFwnJyAuIGdUeHQoJ2FyZV95
b3Vfc3VyZScpIC4gJ1wnKSInDQoJCQkpLg0KCQllbmRUYWJsZSgpLic8L3RkPjwvdHI+Jy4N
CgkJZW5kVGFibGUoKTsNCg0KCWVjaG8gJzwvdGQ+PC90cj4nLmVuZFRhYmxlKCk7DQp9DQoN
Cg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX2hhbmRsZV9pbnB1dCgpIHsNCglpZiAo
Z3BzKCdwcmVmcycpKSB7DQoJCXJldHVybiB0cnVfdGFnc19hZG1pbl91cGRhdGVfcHJlZnMo
KTsNCgl9IGVsc2UgaWYgKGdwcygnZGVsZXRlJykpIHsNCgkJcmV0dXJuIHRydV90YWdzX2Fk
bWluX2RlbGV0ZV90YWcoZ3BzKCdkZWxldGV0YWcnKSk7DQoJfSBlbHNlIGlmIChncHMoJ3Jl
cGxhY2UnKSkgew0KCQkkcmVzdWx0ID0gdHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoZ3Bz
KCdtYXRjaHRhZycpLCBncHMoJ3JlcGxhY2V0YWcnKSwgZmFsc2UpOw0KCQlyZXR1cm4gJHJl
c3VsdCAuICc8YnI+JyAuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ21hdGNo
dGFnJyksIGdwcygncmVwbGFjZXRhZycpKTsNCgl9IGVsc2UgaWYgKGdwcygncmVkaXJlY3Qn
KSkgew0KCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3RfdGFnKGdwcygnbGVmdHRh
ZycpLCBncHMoJ3JpZ2h0dGFnJykpOw0KCX0gZWxzZSBpZiAoZ3BzKCdkZWxldGVfcmVkaXJl
Y3QnKSkgew0KCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0KGdwcygn
ZGVsZXRlX3JlZGlyZWN0JykpOw0KCX0gZWxzZSB7DQoJCXJldHVybiAnJzsNCgl9DQp9DQoN
Cg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdXBkYXRlX3ByZWZzKCkgew0KCWdsb2JhbCAk
dHJ1X3RhZ3NfcHJlZnM7DQoJJHJlc3VsdHMgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0cnVf
dGFnc19wcmVmcyBhcyAkcHJlZikgew0KCQkkdmFsaWRfdmFsdWUgPSAkcHJlZi0+dmFsaWRh
dGVfdmFsdWUoZ3BzKCRwcmVmLT5uYW1lKSk7DQoJCWlmICgkdmFsaWRfdmFsdWUgJiYgJHZh
bGlkX3ZhbHVlIDw+IGdwcygkcHJlZi0+bmFtZSkpIHsNCgkJCXJldHVybiAkdmFsaWRfdmFs
dWU7ICAjIyMgdGhpcyBpcyBhIHNuZWFreSB3YXkgdG8gaGFuZGxlIHZhbGlkYXRpb24gLSBz
b3JyeSA7KQ0KCQl9DQoJCWlmICgkdmFsaWRfdmFsdWUgPD4gJHByZWYtPnZhbHVlKSB7DQoJ
CQlpZiAoJHZhbGlkX3ZhbHVlID09ICRwcmVmLT5kZWZhdWx0X3ZhbHVlKSB7DQoJCQkJJHJl
c3VsdCA9IHRydV90YWdzX2RlbGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsNCgkJCX0gZWxzZSB7
DQoJCQkJJHJlc3VsdCA9IHRydV90YWdzX3Vwc2VydF9wcmVmKCRwcmVmLT5uYW1lLCAkdmFs
aWRfdmFsdWUpOw0KCQkJfQ0KCQkJaWYgKCRyZXN1bHQpIHsNCgkJCQkkcmVzdWx0c1tdID0g
J1VwZGF0ZWQgJyAuICRwcmVmLT5uYW1lOw0KCQkJCSRwcmVmLT52YWx1ZSA9ICR2YWxpZF92
YWx1ZTsNCgkJCX0gZWxzZSB7DQoJCQkJJHJlc3VsdHNbXSA9ICdFcnJvciB1cGRhdGluZyAn
IC4gJHByZWYtPm5hbWU7DQoJCQl9DQoJCX0NCgl9DQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9
PSAwKSB7DQoJCXJldHVybiAnTm8gcmVjb3JkcyBuZWVkIHVwZGF0aW5nJzsNCgl9IGVsc2Ug
ew0KCQlyZXR1cm4gam9pbignPGJyPicsICRyZXN1bHRzKTsNCgl9DQp9DQoNCg0KZnVuY3Rp
b24gdHJ1X3RhZ3NfdXBzZXJ0X3ByZWYoJG5hbWUsICR2YWx1ZSkgew0KCWlmICghc2FmZV9x
dWVyeSgnY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFn
c19wcmVmcycpLg0KCQknIChuYW1lIHZhcmNoYXIoMjU1KSBwcmltYXJ5IGtleSwgJy4NCgkJ
J3ZhbHVlIHZhcmNoYXIoMjU1KSBub3QgbnVsbCknKSkgew0KCQlyZXR1cm4gJ1NlcmlvdXMg
ZXJyb3IgLSB1bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3By
ZWZzJykgLiAnIHRhYmxlLic7DQoJfQ0KDQoJcmV0dXJuIHNhZmVfdXBzZXJ0KCd0cnVfdGFn
c19wcmVmcycsICd2YWx1ZT0iJy4kdmFsdWUuJyInLCAnbmFtZT0iJy4kbmFtZS4nIicpOw0K
fQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2RlbGV0ZV9wcmVmKCRuYW1lKSB7DQoJaWYgKHNh
ZmVfZGVsZXRlKCd0cnVfdGFnc19wcmVmcycsICduYW1lPSInLiRuYW1lLiciJykpIHsNCgkJ
aWYgKHNhZmVfY291bnQoJ3RydV90YWdzX3ByZWZzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1
ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSkpIHsNCgkJ
CXJldHVybiBmYWxzZTsNCgkJfQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9IGVsc2Ugew0KCQlyZXR1
cm4gZmFsc2U7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX2RlbGV0ZV90
YWcoJGRlbGV0ZXRhZykgew0KCWlmICh0cmltKCRkZWxldGV0YWcpKSB7DQoJCXJldHVybiB0
cnVfdGFnc19hZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRldGFnLCAnJywgdHJ1ZSk7DQoJfSBl
bHNlIHsNCgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSc7DQoJfQ0KfQ0KDQoNCmZ1
bmN0aW9uIHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKCRtYXRjaHRhZywgJHJlcGxhY2V0
YWcsICRhbGxvd19ibGFua19yZXBsYWNldGFnKSB7DQoJJG1hdGNodGFnID0gdHJpbSgkbWF0
Y2h0YWcpOw0KCSRyZXBsYWNldGFnID0gdHJpbSgkcmVwbGFjZXRhZyk7DQoJaWYgKCRtYXRj
aHRhZyAmJiAoJGFsbG93X2JsYW5rX3JlcGxhY2V0YWcgfHwgJHJlcGxhY2V0YWcpKSB7DQoJ
CWlmIChzYWZlX3VwZGF0ZSgndGV4dHBhdHRlcm4nLCBUUlVfVEFHU19GSUVMRC4nPXRyaW0o
Ym90aCBcJyxcJyBmcm9tIHJlcGxhY2UoY29uY2F0KCIsIiwgJy5UUlVfVEFHU19GSUVMRC4n
LCAiLCIpLCBjb25jYXQoIiwiLCBcJycuYWRkc2xhc2hlcygkbWF0Y2h0YWcpLidcJywgIiwi
KSwgXCcsJy5hZGRzbGFzaGVzKCRyZXBsYWNldGFnKS4nLFwnKSknLCAnMScpKSB7DQoJCQly
ZXR1cm4gJ1VwZGF0ZWQgJy5teXNxbGlfYWZmZWN0ZWRfcm93cygpLicgcm93cyAoIicuaHRt
bHNwZWNpYWxjaGFycygkbWF0Y2h0YWcpLiciPT4iJy5odG1sc3BlY2lhbGNoYXJzKCRyZXBs
YWNldGFnKS4nIiknOw0KCQl9IGVsc2Ugew0KCQkJcmV0dXJuICdFcnJvcjogJyAuIG15c3Fs
aV9lcnJvcigpOw0KCQl9DQoJfSBlbHNlIHsNCgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2
YWx1ZSBpbiBib3RoIGZpZWxkcyc7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2Fk
bWluX3JlZGlyZWN0X3RhZygkbGVmdHRhZywgJHJpZ2h0dGFnKSB7DQoJJGxlZnR0YWcgPSBh
ZGRzbGFzaGVzKHRydV90YWdzX3N0cnRvbG93ZXIodHJpbSgkbGVmdHRhZykpKTsNCgkkcmln
aHR0YWcgPSBhZGRzbGFzaGVzKHRydV90YWdzX3N0cnRvbG93ZXIodHJpbSgkcmlnaHR0YWcp
KSk7DQoJaWYgKCEkbGVmdHRhZyB8fCAhJHJpZ2h0dGFnKSB7DQoJCXJldHVybiAnUGxlYXNl
IGVudGVyIGEgdmFsdWUgaW4gYm90aCBmaWVsZHMnOw0KCX0NCg0KCWlmICghc2FmZV9xdWVy
eSgnY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19y
ZWRpcmVjdHMnKS4NCgkJJyAobGVmdHRhZyB2YXJjaGFyKDI1NSkgcHJpbWFyeSBrZXksICcu
DQoJCSdyaWdodHRhZyB2YXJjaGFyKDI1NSkgbm90IG51bGwpJykpIHsNCgkJcmV0dXJuICdT
ZXJpb3VzIGVycm9yIC0gdW5hYmxlIHRvIGNyZWF0ZSB0aGUgJyAuIHNhZmVfcGZ4KCd0cnVf
dGFnc19yZWRpcmVjdHMnKSAuICcgdGFibGUuJzsNCgl9DQoNCglpZiAoc2FmZV9pbnNlcnQo
J3RydV90YWdzX3JlZGlyZWN0cycsICdsZWZ0dGFnPSInLiRsZWZ0dGFnLiciLHJpZ2h0dGFn
PSInLiRyaWdodHRhZy4nIicpKSB7DQoJCXJldHVybiAnUmVkaXJlY3QgYWRkZWQgKCInLmh0
bWxzcGVjaWFsY2hhcnMoJGxlZnR0YWcpLiciPT4iJy5odG1sc3BlY2lhbGNoYXJzKCRyaWdo
dHRhZykuJyIpIC0gcGxlYXNlIHRlc3QgaXQhJzsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gJ0Vy
cm9yIGFkZGluZyByZWNvcmQgLSBkb2VzIGl0IGFscmVhZHkgZXhpc3Q/JzsNCgl9DQp9DQoN
Cg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0KCRsZWZ0dGFnKSB7
DQoJaWYgKHNhZmVfZGVsZXRlKCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnbGVmdHRhZz0iJy5h
ZGRzbGFzaGVzKCRsZWZ0dGFnKS4nIicpKSB7DQoJCWlmIChzYWZlX2NvdW50KCd0cnVfdGFn
c19yZWRpcmVjdHMnLCAnMScpID09IDAgJiYgIXNhZmVfcXVlcnkoJ2Ryb3AgdGFibGUgJyAu
IHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKSkpIHsNCgkJCXJldHVybiAnUmVkaXJl
Y3QgZGVsZXRlZCwgYnV0IHVuYWJsZSB0byBkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1
X3RhZ3NfcmVkaXJlY3RzJyk7DQoJCX0NCgkJcmV0dXJuICdSZWRpcmVjdCBkZWxldGVkICgi
Jy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIiknOw0KCX0gZWxzZSB7DQoJCXJldHVy
biAnRXJyb3IgZGVsZXRpbmcgcmVkaXJlY3QnOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVf
dGFnc19hZG1pbl93cml0ZV90YWJfaGFuZGxlcigkZXZlbnQsICRzdGVwLCAkZGF0YSkgew0K
CWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRh
cmRfY2xvdWRfYXR0cyhhcnJheSgpLCB0cnVlLCB0cnVlLCB0cnVlKTsNCgkkY2xvdWQgPSBh
cnJheV91bmlxdWUodHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpKTsNCgluYXRjYXNlc29y
dCgkY2xvdWQpOw0KDQoJJGlkID0gKGVtcHR5KCRHTE9CQUxTWydJRCddKSA/IGdwcygnSUQn
KSA6ICRHTE9CQUxTWydJRCddKTsNCgkkYXJ0aWNsZV90YWdzID0gKGVtcHR5KCRpZCkgPyBh
cnJheSgpIDogdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJGlkKSk7DQoNCgkkbGlu
a3MgPSBhcnJheSgpOw0KCSRyYXdfY2xvdWQgPSAnJzsNCglmb3JlYWNoICgkY2xvdWQgYXMg
JHRhZykgew0KCQkkc3R5bGUgPSAoaW5fYXJyYXkoJHRhZywgJGFydGljbGVfdGFncykgPyAn
IGNsYXNzPSJ0YWdfY2hvc2VuIicgOiAnJyk7DQoJCSRsaW5rc1tdID0gJzxhIGhyZWY9IiNh
ZHZhbmNlZCInLiRzdHlsZS4nIG9uY2xpY2s9InRvZ2dsZUNsYXNzKHRoaXMsIHRvZ2dsZVRh
ZyhcXFwnJy5hZGRzbGFzaGVzKGFkZHNsYXNoZXMoaHRtbHNwZWNpYWxjaGFycygkdGFnKSkp
LidcXFwnKSk7IHJldHVybiBmYWxzZTsiPicgLiBhZGRzbGFzaGVzKGh0bWxzcGVjaWFsY2hh
cnMoJHRhZykpIC4gJzxcL2E+JzsNCgkJJHJhd19jbG91ZCAuPSAnIicgLiBhZGRTbGFzaGVz
KCR0YWcpIC4gJyIsJzsNCgl9DQoJJHJhd19jbG91ZCA9IHN1YnN0cigkcmF3X2Nsb3VkLCAw
LCBzdHJsZW4oJHJhd19jbG91ZCkgLSAxKTsNCgkkdG9faW5zZXJ0ID0gam9pbignLCAnLCAk
bGlua3MpOw0KDQoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZh
bHVlKSB7DQoJCSRqcyA9IDw8PEVPRg0KCQkJdmFyIGtleXdvcmRzRmllbGQgPSBkb2N1bWVu
dC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsNCgkJCWtleXdvcmRzRmllbGQucGFyZW50
Tm9kZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsNCgkJCXZh
ciBjbG91ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsNCgkJCWtleXdvcmRz
RmllbGQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjbG91ZCk7DQoJCQljbG91ZC5zZXRBdHRy
aWJ1dGUoJ2NsYXNzJywgJ3RydV90YWdzX2FkbWluX3RhZ3MnKTsNCgkJCWNsb3VkLmlubmVy
SFRNTCA9ICd7JHRvX2luc2VydH0nOw0KDQoJCQl2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1l
bnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsNCgkJCXN0eWxlRWxlbWVudC5zZXRBdHRyaWJ1
dGUoInR5cGUiLCAidGV4dC9jc3MiKTsNCgkJCXZhciBzdHlsZVRleHQgPSAnYS50YWdfY2hv
c2Vue2JhY2tncm91bmQtY29sb3I6ICNGRUI7IGNvbG9yOiBibGFjazt9JzsNCgkJCWlmIChz
dHlsZUVsZW1lbnQuc3R5bGVTaGVldCkgeyAvL0lFDQoJCQkJc3R5bGVFbGVtZW50LnN0eWxl
U2hlZXQuY3NzVGV4dCA9IHN0eWxlVGV4dDsNCgkJCX0gZWxzZSB7DQoJCQkJdmFyIHRleHRO
b2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoc3R5bGVUZXh0KTsNCgkJCQlzdHlsZUVs
ZW1lbnQuYXBwZW5kQ2hpbGQodGV4dE5vZGUpOw0KCQkJfQ0KCQkJdmFyIGhlYWRFbGVtZW50
ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsNCgkJCWhlYWRF
bGVtZW50LmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudCk7DQoNCgkJCWZ1bmN0aW9uIHRvZ2ds
ZVRhZyh0YWdOYW1lKSB7DQoJCQkJdmFyIHJlZ2V4VGFnID0gdGFnTmFtZS5yZXBsYWNlKC8o
W1xcXFxcXlxcJCorW1xcXT97fS49IToofCldKS9nLCJcXFxcJDEiKTsNCgkJCQl2YXIgdGFn
UmVnZXggPSBuZXcgUmVnRXhwKCIoKF58LClcXFxzKikiICsgcmVnZXhUYWcgKyAiXFxccyoo
LFxcXHMqfCQpIik7DQoJCQkJdmFyIHRleHRhcmVhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
SWQoJ2tleXdvcmRzJyk7DQoJCQkJdmFyIGN1cnZhbCA9IHRleHRhcmVhLnZhbHVlLnJlcGxh
Y2UoLyw/XHMrJC8sICcnKTsNCgkJCQlpZiAoJycgPT0gY3VydmFsKSB7DQoJCQkJCXRleHRh
cmVhLnZhbHVlID0gdGFnTmFtZTsNCgkJCQl9IGVsc2UgaWYgKGN1cnZhbC5tYXRjaCh0YWdS
ZWdleCkpIHsNCgkJCQkJdGV4dGFyZWEudmFsdWUgPSBjdXJ2YWwucmVwbGFjZSh0YWdSZWdl
eCwgJyQxJykucmVwbGFjZSgvLD9ccyskLywgJycpOw0KCQkJCQlyZXR1cm4gJyc7DQoJCQkJ
fSBlbHNlIGlmICgnLCcgPT0gY3VydmFsLmNoYXJBdChjdXJ2YWwubGVuZ3RoIC0gMSkpIHsN
CgkJCQkJdGV4dGFyZWEudmFsdWUgKz0gJyAnICsgdGFnTmFtZTsNCgkJCQl9IGVsc2Ugew0K
CQkJCQl0ZXh0YXJlYS52YWx1ZSArPSAnLCAnICsgdGFnTmFtZTsNCgkJCQl9DQoJCQkJcmV0
dXJuICd0YWdfY2hvc2VuJzsNCgkJCX0NCg0KCQkJZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWxl
bWVudCwgY2xhc3NOYW1lKSB7DQoJCQkJZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywg
Y2xhc3NOYW1lKTsNCgkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3NOYW1lJywgY2xh
c3NOYW1lKTsgLyogZm9yIElFICovDQoJCQl9DQpFT0Y7DQoJCXJldHVybiAkZGF0YSAuIHNj
cmlwdF9qcygkanMpOw0KCX0NCg0KCWlmICgkdHJ1X3RhZ3NfcHJlZnNbQVVUT0NPTVBMRVRF
X0lOX1dSSVRFX1RBQl0tPnZhbHVlKSB7DQoJCWVjaG8gPDw8RU9GDQoJCQk8bGluayByZWw9
InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9qcy9qcXVlcnkuYXV0b2Nv
bXBsZXRlLmNzcyIgbWVkaWE9InByb2plY3Rpb24sIHNjcmVlbiIgLz4NCgkJCTxzY3JpcHQg
c3JjPSIuLi9qcy9qcXVlcnkuYXV0b2NvbXBsZXRlLm1pbi5qcyIgdHlwZT0idGV4dC9qYXZh
c2NyaXB0Ij48L3NjcmlwdD4NCgkJCTxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHR5
cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLQ0KCQkJCSQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0
aW9uKCl7IHZhciB0YWdzID0gbmV3IEFycmF5KHskcmF3X2Nsb3VkfSk7DQoJCQkJCSQoIiNr
ZXl3b3JkcyIpLmF1dG9jb21wbGV0ZSh0YWdzLCB7IG11bHRpcGxlOiB0cnVlLCBtdXN0TWF0
Y2g6IGZhbHNlLCBhdXRvRmlsbDogZmFsc2UgfSk7DQoJCQkJfSk7DQoJCQkvLy0tPjwvc2Ny
aXB0Pg0KRU9GOw0KCX0NCg0KfQ0KDQoNCiMjIyBBVE9NL1JTUyBGRUVEIEZVTkNUSU9OUyAj
IyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcmVnaXN0ZXJfY2FsbGJh
Y2soJ3RydV90YWdzX2F0b21faGFuZGxlcicsICdhdG9tX2VudHJ5Jyk7DQpmdW5jdGlvbiB0
cnVfdGFnc19hdG9tX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3Nf
ZmVlZF9oYW5kbGVyKHRydWUpOyB9DQpyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfcnNz
X2hhbmRsZXInLCAncnNzX2VudHJ5Jyk7DQpmdW5jdGlvbiB0cnVfdGFnc19yc3NfaGFuZGxl
cigkZXZlbnQsICRzdGVwKSB7IHJldHVybiB0cnVfdGFnc19mZWVkX2hhbmRsZXIoZmFsc2Up
OyB9DQoNCmZ1bmN0aW9uIHRydV90YWdzX2ZlZWRfaGFuZGxlcigkYXRvbSkgew0KCWdsb2Jh
bCAkdGhpc2FydGljbGUsICR0cnVfdGFnc19wcmVmczsNCglleHRyYWN0KCR0aGlzYXJ0aWNs
ZSk7DQoNCgkkdGFncyA9IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCR0aGlzaWQp
Ow0KDQoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0tPnZhbHVlKSB7
DQoJCSRleHRyYWJvZHkgPSAnJzsNCgkJJEZPUk1fTkFNRSA9ICd0cnVfdGFnc19mZWVkX3Rh
Z3MnOw0KCQlpZiAoZmV0Y2goJ2Zvcm0nLCAndHhwX2Zvcm0nLCAnbmFtZScsICRGT1JNX05B
TUUpKSB7DQoJCQkkZm9ybSA9IGZldGNoX2Zvcm0oJEZPUk1fTkFNRSk7DQoJCQkkZXh0cmFi
b2R5ID0gdHJpbShwYXJzZSgkZm9ybSkpOw0KCQl9IGVsc2Ugew0KCQkJJGF0dHMgPSB0cnVf
dGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgdHJ1ZSk7DQoJ
CQkkZXh0cmFib2R5ID0gJzxwPnRhZ3M6ICcgLiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0
dHMsICR0YWdzLCAkdGFncykgLiAnPC9wPic7DQoJCX0NCgkJZ2xvYmFsICR0aGlzYXJ0aWNs
ZTsNCgkJaWYgKHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pKSB7DQoJCQkkdGhpc2Fy
dGljbGVbJ2V4Y2VycHQnXSA9IHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pLm4uJGV4
dHJhYm9keS5uOw0KCQl9DQoJCSR0aGlzYXJ0aWNsZVsnYm9keSddID0gdHJpbSgkdGhpc2Fy
dGljbGVbJ2JvZHknXSkubi4kZXh0cmFib2R5Lm47DQoJfQ0KDQoJaWYgKCR0cnVfdGFnc19w
cmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklFU10tPnZhbHVlKSB7DQoJCSRvdXRwdXQgPSBh
cnJheSgpOw0KCQlmb3JlYWNoICgkdGFncyBhcyAkdGFnKSB7DQoJCQlpZiAoJGF0b20pIHsN
CgkJCQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5IHRlcm09IicgLiBodG1sc3BlY2lhbGNoYXJz
KCR0YWcpIC4gJyIgLz4nOw0KCQkJfSBlbHNlIHsNCgkJCQkkb3V0cHV0W10gPSAnPGNhdGVn
b3J5PicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvY2F0ZWdvcnk+JzsNCgkJCX0N
CgkJfQ0KCQlyZXR1cm4gbi5qb2luKG4sICRvdXRwdXQpLm47DQoJfQ0KfQ0KDQoNCiMjIyBQ
UkVGUyBGVU5DVElPTlMgLyBDTEFTU0VTICMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjDQoNCmNsYXNzIHRydV90YWdzX3ByZWYgew0KCWZ1bmN0aW9uIF9fY29uc3Ry
dWN0KCRuYW1lLCAkZGVmYXVsdF92YWx1ZSwgJHR5cGUpIHsNCgkJJHRoaXMtPm5hbWUgPSAk
bmFtZTsNCgkJJHRoaXMtPnZhbHVlID0gJGRlZmF1bHRfdmFsdWU7DQoJCSR0aGlzLT5kZWZh
dWx0X3ZhbHVlID0gJGRlZmF1bHRfdmFsdWU7DQoJCSR0aGlzLT50eXBlID0gJHR5cGU7DQoJ
fQ0KDQoJZnVuY3Rpb24gdmFsaWRhdGVfdmFsdWUoJHZhbHVlKSB7DQoJCWlmICgkdmFsdWUp
IHsNCgkJCXJldHVybiAkdmFsdWU7DQoJCX0gZWxzZSBpZiAoJHRoaXMtPnR5cGUgPT0gJ2Jv
b2xlYW4nKSB7DQoJCQlyZXR1cm4gJzAnOw0KCQl9IGVsc2Ugew0KCQkJcmV0dXJuICdQbGVh
c2UgZW50ZXIgYSB2YWx1ZSBmb3IgJyAuICR0aGlzLT5uYW1lOw0KCQl9DQoJfQ0KfQ0KDQpm
dW5jdGlvbiB0cnVfdGFnc19sb2FkX3ByZWZzKCkgew0KCSRwcmVmcyA9IGFycmF5KCk7DQoN
CglnbG9iYWwgJHBlcm1saW5rX21vZGU7DQoJJHByZWZzW0NMRUFOX1VSTFNdID0gbmV3IHRy
dV90YWdzX3ByZWYoQ0xFQU5fVVJMUywgKCRwZXJtbGlua19tb2RlICE9ICdtZXNzeScgPyAn
Y2xlYW4nIDogJ21lc3N5JyksICdzdHJpbmcnKTsNCgkkcHJlZnNbVEFHX1NFQ1RJT05dID0g
bmV3IHRydV90YWdzX3ByZWYoVEFHX1NFQ1RJT04sICd0YWcnLCAnc3RyaW5nJyk7DQoJJHBy
ZWZzW1BBUk1fTkFNRV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihQQVJNX05BTUUsICd0JywgJ3N0
cmluZycpOw0KCSRwcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklFU10gPSBuZXcgdHJ1X3Rh
Z3NfcHJlZihUQUdTX0lOX0ZFRURfQ0FURUdPUklFUywgJzEnLCAnYm9vbGVhbicpOw0KCSRw
cmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lOX0ZF
RURfQk9EWSwgJzAnLCAnYm9vbGVhbicpOw0KCSRwcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0g
PSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lOX1dSSVRFX1RBQiwgJzEnLCAnYm9vbGVhbicp
Ow0KCSRwcmVmc1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXSA9IG5ldyB0cnVfdGFnc19w
cmVmKEFVVE9DT01QTEVURV9JTl9XUklURV9UQUIsICcwJywgJ2Jvb2xlYW4nKTsNCgkkcHJl
ZnNbVVRGXzhfQ0FTRV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihVVEZfOF9DQVNFLCAnMScsICdi
b29sZWFuJyk7DQoNCglpZiAoc2FmZV9xdWVyeSgiZGVzY3JpYmUgIiAuIFBGWCAuICJ0cnVf
dGFnc19wcmVmcyIpKSB7DQoJCSRycyA9IHNhZmVfcm93cygnKicsICd0cnVfdGFnc19wcmVm
cycsICcxJyk7DQoJCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7DQoJCQkkcHJlZnNbJHJvd1sn
bmFtZSddXS0+dmFsdWUgPSAkcm93Wyd2YWx1ZSddOw0KCQl9DQoJfQ0KDQoJcmV0dXJuICRw
cmVmczsNCn0NCg0KDQojIyMgT1RIRVIgU1VQUE9SVCBGVU5DVElPTlMgIyMjDQojIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0
X2lmX25lZWRlZCgkdGFnX3BhcmFtZXRlcikgew0KCSRyZWRpcmVjdHMgPSB0cnVfdGFnc19s
b2FkX3JlZGlyZWN0cygpOw0KCWZvcmVhY2ggKCRyZWRpcmVjdHMgYXMgJGxlZnR0YWcgPT4g
JHJpZ2h0dGFnKSB7DQoJCWlmICgkbGVmdHRhZyA9PSAkdGFnX3BhcmFtZXRlciB8fCAkbGVm
dHRhZyA9PSBzdHJfcmVwbGFjZSgnLScsICcgJywgJHRhZ19wYXJhbWV0ZXIpKSB7DQoJCQl0
cnVfdGFnc19yZWRpcmVjdCgkcmlnaHR0YWcsIGZhbHNlKTsNCgkJCXJldHVybiB0cnVlOw0K
CQl9DQoJfQ0KDQoJcmV0dXJuIGZhbHNlOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2xv
YWRfcmVkaXJlY3RzKCkgew0KCSRyZWRpcmVjdHMgPSBhcnJheSgpOw0KCWlmIChzYWZlX3F1
ZXJ5KCJkZXNjcmliZSAiIC4gUEZYIC4gInRydV90YWdzX3JlZGlyZWN0cyIpKSB7DQoJCSRy
cyA9IHNhZmVfcm93cygnKicsICd0cnVfdGFnc19yZWRpcmVjdHMnLCAnMSBvcmRlciBieSBs
ZWZ0dGFnJyk7DQoJCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7DQoJCQkkcmVkaXJlY3RzWyRy
b3dbJ2xlZnR0YWcnXV0gPSAkcm93WydyaWdodHRhZyddOw0KCQl9DQoJfQ0KCXJldHVybiAk
cmVkaXJlY3RzOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0KCRkZXN0aW5h
dGlvbiwgJGlzX2Z1bGxfdXJsKSB7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCglpZiAo
JGlzX2Z1bGxfdXJsKSB7DQoJCSR1cmwgPSAkZGVzdGluYXRpb247DQoJCSRtZXNzYWdlID0g
J1RoZSByZXNvdXJjZSB5b3UgcmVxdWVzdGVkIGhhcyBtb3ZlZCB0byAnIC4gJGRlc3RpbmF0
aW9uOw0KCX0gZWxzZSB7DQoJCSR1cmwgPSB0cnVfdGFnc19saW5raWZ5X3RhZygkZGVzdGlu
YXRpb24sIGZhbHNlKTsNCgkJJG1lc3NhZ2UgPSAnVGhlIHJlcXVlc3RlZCB0YWcgaGFzIGJl
ZW4gcmVwbGFjZWQgYnkgJyAuICRkZXN0aW5hdGlvbjsNCgl9DQoNCgloZWFkZXIoJ0xvY2F0
aW9uOiAnIC4gJHVybCk7DQoJdHhwX2RpZSgkbWVzc2FnZSwgJzMwMScpOw0KfQ0KDQoNCmZ1
bmN0aW9uIHRydV90YWdzX2xpbmtpZnlfdGFnKCR0YWcsICR1c2VfYW1wID0gdHJ1ZSkgew0K
CWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJaWYgKHRydV90YWdzX2NsZWFuX3VybHMoKSkg
ew0KCQkkdXJscHJlZml4ID0gaHUgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52
YWx1ZSAuICcvJzsNCgl9IGVsc2Ugew0KCQkkdXJscHJlZml4ID0gaHUgLiAnP3M9JyAuICR0
cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gKCR1c2VfYW1wID8gJyZhbXA7
JyA6ICcmJykgLiAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPSc7DQoJ
fQ0KCSR1cmxzdWZmaXggPSAodHJ1X3RhZ3NfY2xlYW5fdXJscygpID8gJy8nIDogJycpOw0K
CXJldHVybiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKCR0YWcpIC4gJHVybHN1ZmZpeDsNCn0N
Cg0KDQpmdW5jdGlvbiB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkYXJ0aWNsZUlE
KSB7DQoJZ2xvYmFsICR0aGlzYXJ0aWNsZSwgJHRydV90YWdzX3ByZWZzOw0KCWlmIChpc3Nl
dCgkdGhpc2FydGljbGUpKSB7DQoJCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsNCgl9DQoJJGtl
eXdvcmRzID0gJyc7DQoJaWYgKGlzc2V0KCR0aGlzaWQpICYmICR0aGlzaWQgPT0gJGFydGlj
bGVJRCkgew0KCQlpZiAoaXNzZXQoJHRoaXNhcnRpY2xlWydrZXl3b3JkcyddKSkgew0KCQkJ
JGtleXdvcmRzID0gJHRoaXNhcnRpY2xlWydrZXl3b3JkcyddOw0KCQl9DQoJfSBlbHNlIHsN
CgkJJHRhZ3NfZmllbGQgPSBUUlVfVEFHU19GSUVMRDsNCgkJJHJzID0gc2FmZV9yb3coJHRh
Z3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJGFydGljbGVJRCcgQU5EICR0YWdzX2Zp
ZWxkIDw+ICcnIik7DQoJCWlmIChpc3NldCgkcnNbJHRhZ3NfZmllbGRdKSkgew0KCQkJJGtl
eXdvcmRzID0gJHJzWyR0YWdzX2ZpZWxkXTsNCgkJfQ0KCX0NCgkkYWxsX3RhZ3MgPSBhcnJh
eSgpOw0KCSRhbGxfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdzX3N0cnRvbG93
ZXIoJGtleXdvcmRzKSkpOw0KDQoJcmV0dXJuIHRydV90YWdzX3RyaW1fdGFncygkYWxsX3Rh
Z3MpOw0KfQ0KDQoNCiMgZml4ZXMgYnVnIHdpdGggNC4wLjQncyB2ZXJzaW9uIG9mIGRvV3Jh
cCB0aGF0IGNhdXNlZCBzcGFjZXMgdG8gc2hvdyB1cCBiZWZvcmUgdGhlIGNvbW1hcw0KZnVu
Y3Rpb24gdHJ1X3RhZ3NfZG9fd3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNz
LCAkYnJlYWtjbGFzcykgew0KCWlmICghJHdyYXB0YWcgJiYgIXByZWdfbWF0Y2goJy9eXHcr
JC8nLCAkYnJlYWspKSB7DQoJCXJldHVybiBqb2luKCRicmVhay5uLCAkbGlzdCk7DQoJfSBl
bHNlIHsNCgkJcmV0dXJuIGRvV3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNz
LCAkYnJlYWtjbGFzcyk7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3RyaW1fdGFn
cygkdGFnX2FycmF5KSB7DQoJJHRyaW1tZWQgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0YWdf
YXJyYXkgYXMgJHRhZykgew0KCQlpZiAoIiIgIT0gdHJpbSgkdGFnKSkgew0KCQkJJHRyaW1t
ZWRbXSA9IHRyaW0oJHRhZyk7DQoJCX0NCgl9DQoJcmV0dXJuICR0cmltbWVkOw0KfQ0KDQoN
CmZ1bmN0aW9uIHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1l
dGVyKSB7DQoJJGtleXdvcmRzID0gZXhwbG9kZSgnLCcsICR0YWdfcGFyYW1ldGVyKTsNCglm
b3JlYWNoICgka2V5d29yZHMgYXMgJGtleXdvcmQpIHsNCgkJaWYgKHN0cnBvcygka2V5d29y
ZCwgJy0nKSAhPT0gZmFsc2UpIHsNCgkJCSRrZXl3b3Jkc1tdID0gc3RyX3JlcGxhY2UoJy0n
LCAnICcsICRrZXl3b3JkKTsNCgkJfQ0KCX0NCgkkYXR0c1sna2V5d29yZHMnXSA9IGltcGxv
ZGUoJywnLCAka2V5d29yZHMpOw0KDQoJaWYgKGlzc2V0KCRhdHRzWydzZWN0aW9uJ10pICYm
IHN0cnBvcygkYXR0c1snc2VjdGlvbiddLCAnLCcpICE9PSBmYWxzZSkgew0KCQkkYXR0c1sn
c2VjdGlvbiddID0gJyc7DQoJfQ0KDQoJaWYgKGlzc2V0KCRhdHRzWydleGNsdWRlc2VjdGlv
biddKSkgew0KCQl1bnNldCgkYXR0c1snZXhjbHVkZXNlY3Rpb24nXSk7DQoJfQ0KDQoJaWYg
KGlzc2V0KCRhdHRzWydub2FydGljbGVzJ10pKSB7DQoJCXVuc2V0KCRhdHRzWydub2FydGlj
bGVzJ10pOw0KCX0NCg0KCWlmICghaXNzZXQoJGF0dHNbJ2xpbWl0J10pKSB7DQoJCSRhdHRz
WydsaW1pdCddID0gJzEwMDAnOw0KCX0NCg0KCWlmICghaXNzZXQoJGF0dHNbJ2FsbG93b3Zl
cnJpZGUnXSkpIHsNCgkJJGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSA9IHRydWU7DQoJfQ0KDQoJ
aWYgKGlzc2V0KCRhdHRzWydzZWFyY2hmb3JtJ10pICYmICFpc3NldCgkYXR0c1snbGlzdGZv
cm0nXSkpIHsNCgkJJGF0dHNbJ2xpc3Rmb3JtJ10gPSAkYXR0c1snc2VhcmNoZm9ybSddOw0K
CX0NCg0KCWlmIChpc3NldCgkYXR0c1snc2hvd2NvdW50cyddKSkgew0KCQl1bnNldCgkYXR0
c1snc2hvd2NvdW50cyddKTsNCgl9DQoNCglpZiAoaXNzZXQoJGF0dHNbJzQwNHJlZGlyZWN0
J10pKSB7DQoJCXVuc2V0KCRhdHRzWyc0MDRyZWRpcmVjdCddKTsNCgl9DQoNCglyZXR1cm4g
JGF0dHM7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3Nfc3RydG9sb3dlcigkc3RyKSB7DQoJ
Z2xvYmFsICR0cnVfdGFnc19wcmVmczsNCglpZiAoJHRydV90YWdzX3ByZWZzW1VURl84X0NB
U0VdLT52YWx1ZSkgew0KCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ0b2xvd2VyJykp
IHsNCgkJCXJldHVybiBtYl9zdHJ0b2xvd2VyKCRzdHIsIEVOQ09ESU5HKTsNCgkJfSBlbHNl
IHsNCgkJCXJldHVybiBzdHJ0b2xvd2VyKCRzdHIpOw0KCQl9DQoJfSBlbHNlIHsNCgkJcmV0
dXJuICRzdHI7DQoJfQ0KfQ0KDQpmdW5jdGlvbiB0cnVfdGFnc19zdHJ0b3VwcGVyKCRzdHIp
IHsNCglpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ0b3VwcGVyJykpIHsNCgkJcmV0dXJu
IG1iX3N0cnRvdXBwZXIoJHN0ciwgRU5DT0RJTkcpOw0KCX0gZWxzZSB7DQoJCXJldHVybiBz
dHJ0b3VwcGVyKCRzdHIpOw0KCX0NCn0NCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfdWNmaXJzdCgk
c3RyKSB7DQoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyJykgJiYgZnVuY3Rpb25f
ZXhpc3RzKCdtYl9zdHJ0b3VwcGVyJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4n
KSAmJiBtYl9zdHJsZW4oJHN0ciwgRU5DT0RJTkcpID4gMSkgew0KCQlyZXR1cm4gbWJfc3Ry
dG91cHBlcihtYl9zdWJzdHIoJHN0ciwgMCwgMSwgRU5DT0RJTkcpLCBFTkNPRElORykgLiBt
Yl9zdWJzdHIoJHN0ciwgMSwgbWJfc3RybGVuKCRzdHIsIEVOQ09ESU5HKSwgRU5DT0RJTkcp
Ow0KCX0gZWxzZSB7DQoJCXJldHVybiB1Y2ZpcnN0KCRzdHIpOw0KCX0NCn0NCg0KZnVuY3Rp
b24gdHJ1X3RhZ3NfdWN3b3Jkcygkc3RyKSB7DQoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJf
Y29udmVydF9jYXNlJykpIHsNCgkJcmV0dXJuIG1iX2NvbnZlcnRfY2FzZSgkc3RyLCBNQl9D
QVNFX1RJVExFLCBFTkNPRElORyk7DQoJfSBlbHNlIHsNCgkJcmV0dXJuIHVjd29yZHMoJHN0
cik7DQoJfQ0KfQ0KDQoNCi8vdGhlc2UgbmV4dCB0d28gZnVuY3Rpb25zIGFyZSBncm9zcywg
YnV0IEkgY2FuJ3QgZmlndXJlIG91dCBhbm90aGVyIHdheSB0byBkbyBpdA0KZnVuY3Rpb24g
dHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdodCwgJHNvcnRfYnlfY291bnQsICRzb3J0
X2FzY2VuZGluZykgew0KCWdsb2JhbCAkdHJ1X3RhZ3NfdGFnc193ZWlnaHQsICR0cnVfdGFn
c19zb3J0X2FzY2VuZGluZzsNCg0KCSR0cnVfdGFnc190YWdzX3dlaWdodCA9ICR0YWdzX3dl
aWdodDsNCgkkdHJ1X3RhZ3Nfc29ydF9hc2NlbmRpbmcgPSAkc29ydF9hc2NlbmRpbmc7DQoN
CgkkdGVtcF9hcnJheSA9IGFycmF5X2tleXMoJHRhZ3Nfd2VpZ2h0KTsNCglpZiAoJHNvcnRf
YnlfY291bnQpIHsNCgkJdXNvcnQoJHRlbXBfYXJyYXksICJ0cnVfdGFnc19zb3J0X3RhZ3Nf
Y29tcGFyYXRvciIpOw0KCX0gZWxzZSB7DQoJCW5hdGNhc2Vzb3J0KCR0ZW1wX2FycmF5KTsN
CgkJJHRlbXBfYXJyYXkgPSBhcnJheV92YWx1ZXMoJHRlbXBfYXJyYXkpOw0KCX0NCg0KCSRz
b3J0ZWRfYXJyYXkgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0ZW1wX2FycmF5IGFzICR0YWcp
IHsNCgkJJHNvcnRlZF9hcnJheVskdGFnXSA9ICR0YWdzX3dlaWdodFskdGFnXTsNCgl9DQoN
CglyZXR1cm4gJHNvcnRlZF9hcnJheTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19zb3J0
X3RhZ3NfY29tcGFyYXRvcigkbGVmdCwgJHJpZ2h0KSB7DQoJZ2xvYmFsICR0cnVfdGFnc190
YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nOw0KDQoJJGxlZnRfd2VpZ2h0
ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0WyRsZWZ0XTsNCgkkcmlnaHRfd2VpZ2h0ID0gJHRy
dV90YWdzX3RhZ3Nfd2VpZ2h0WyRyaWdodF07DQoJaWYgKCRsZWZ0X3dlaWdodCA9PSAkcmln
aHRfd2VpZ2h0KSB7DQoJCSR0ZW1wX2FycmF5ID0gYXJyYXkoJGxlZnQsICRyaWdodCk7DQoJ
CW5hdGNhc2Vzb3J0KCR0ZW1wX2FycmF5KTsNCgkJJHRlbXBfYXJyYXkgPSBhcnJheV92YWx1
ZXMoJHRlbXBfYXJyYXkpOw0KCQlyZXR1cm4gKCR0ZW1wX2FycmF5WzBdID09ICRsZWZ0ID8g
LTEgOiAxKTsNCgl9IGVsc2UgaWYgKCR0cnVfdGFnc19zb3J0X2FzY2VuZGluZykgew0KCQly
ZXR1cm4gJGxlZnRfd2VpZ2h0IC0gJHJpZ2h0X3dlaWdodDsNCgl9IGVsc2Ugew0KCQlyZXR1
cm4gJHJpZ2h0X3dlaWdodCAtICRsZWZ0X3dlaWdodDsNCgl9DQp9DQoNCg0KDQojIyMgQkFT
VEFSRCBGVU5DVElPTlMgVEhBVCBTSE9VTEROJ1QgSEFWRSBUTyBFWElTVCAjIyMNCiMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQoN
CmZ1bmN0aW9uIHRydV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2goJGF0dHMpIHsNCgkkdGhl
QXR0cyA9IGxBdHRzKGFycmF5KCdsaW1pdCcgICAgID0+IDEwMDAsDQoJCQkJJ2NhdGVnb3J5
JyAgPT4gJycsDQoJCQkJJ3NlY3Rpb24nICAgPT4gJycsDQoJCQkJJ2V4Y2VycHRlZCcgPT4g
JycsDQoJCQkJJ2F1dGhvcicgICAgPT4gJycsDQoJCQkJJ3NvcnRieScgICAgPT4gJ1Bvc3Rl
ZCcsDQoJCQkJJ3NvcnRkaXInICAgPT4gJ2Rlc2MnLA0KCQkJCSdtb250aCcgICAgID0+ICcn
LA0KCQkJCSdrZXl3b3JkcycgID0+ICcnLA0KCQkJCSdmcm9udHBhZ2UnID0+ICcnLA0KCQkJ
CSdpZCcgICAgICAgID0+ICcnLA0KCQkJCSd0aW1lJyAgICAgID0+ICdwYXN0JywNCgkJCQkn
c3RhdHVzJyAgICA9PiAnNCcsDQoJCQkJJ29mZnNldCcgICAgPT4gMA0KCQkJKSwkYXR0cywg
MCk7DQoJZXh0cmFjdCgkdGhlQXR0cyk7DQoNCgkvL0J1aWxkaW5nIHF1ZXJ5IHBhcnRzDQoJ
JGZyb250cGFnZSA9ICgkZnJvbnRwYWdlKSA/IGZpbHRlckZyb250UGFnZSgpIDogJyc7DQoJ
JGNhdGVnb3J5ICA9ICghJGNhdGVnb3J5KSAgPyAnJyA6ICIgYW5kICgoQ2F0ZWdvcnkxPSci
LmRvc2xhc2goJGNhdGVnb3J5KS4iJykgb3IgKENhdGVnb3J5Mj0nIi5kb1NsYXNoKCRjYXRl
Z29yeSkuIicpKSAiOw0KCSRzZWN0aW9uICAgPSAoISRzZWN0aW9uKSAgID8gJycgOiAiIGFu
ZCBTZWN0aW9uID0gJyIuZG9zbGFzaCgkc2VjdGlvbikuIiciOw0KCSRleGNlcnB0ZWQgPSAo
JGV4Y2VycHRlZD09J3knKSAgPyAiIGFuZCBFeGNlcnB0ICE9JyciIDogJyc7DQoJJGF1dGhv
ciAgICA9ICghJGF1dGhvcikgICAgPyAnJyA6ICIgYW5kIEF1dGhvcklEID0gJyIuZG9zbGFz
aCgkYXV0aG9yKS4iJyI7DQoJJG1vbnRoICAgICA9ICghJG1vbnRoKSAgICAgPyAnJyA6ICIg
YW5kIFBvc3RlZCBsaWtlICciLmRvU2xhc2goJG1vbnRoKS4iJSciOw0KCSRpZCAgICAgICAg
PSAoISRpZCkgICAgICAgID8gJycgOiAiIGFuZCBJRCA9ICciLmludHZhbCgkaWQpLiInIjsN
Cglzd2l0Y2ggKCR0aW1lKSB7DQoJCWNhc2UgJ2FueSc6DQoJCQkkdGltZSA9ICIiOyBicmVh
azsNCgkJY2FzZSAnZnV0dXJlJzoNCgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkID4gbm93KCki
OyBicmVhazsNCgkJZGVmYXVsdDoNCgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkIDwgbm93KCki
Ow0KCX0NCglpZiAoIWlzX251bWVyaWMoJHN0YXR1cykpDQoJCSRzdGF0dXMgPSBnZXRTdGF0
dXNOdW0oJHN0YXR1cyk7DQoNCgkkY3VzdG9tID0gJyc7DQoJLy8gdHJ5aW5nIGN1c3RvbSBm
aWVsZHMgaGVyZQ0KCSRjdXN0b21GaWVsZHMgPSBnZXRDdXN0b21GaWVsZHMoKTsNCglpZiAo
JGN1c3RvbUZpZWxkcykgew0KCQlmb3JlYWNoKCRjdXN0b21GaWVsZHMgYXMgJGNGaWVsZCkg
ew0KCQkJaWYgKGlzc2V0KCRhdHRzWyRjRmllbGRdKSkNCgkJCQkkY3VzdG9tUGFpcnNbJGNG
aWVsZF0gPSAkYXR0c1skY0ZpZWxkXTsNCgkJfQ0KCQlpZighZW1wdHkoJGN1c3RvbVBhaXJz
KSkNCgkJCSRjdXN0b20gPSAgYnVpbGRDdXN0b21TcWwoJGN1c3RvbUZpZWxkcywkY3VzdG9t
UGFpcnMpOw0KCQllbHNlDQoJCQkkY3VzdG9tID0gJyc7DQoJfQ0KDQoJLy9BbGxvdyBrZXl3
b3JkcyBmb3Igbm8tY3VzdG9tIGFydGljbGVzLiBUaGF0IHRhZ2dpbmcgbW9kZSwgeW91IGtu
b3cNCglpZiAoJGtleXdvcmRzKSB7DQoJCSRrZXlzID0gZG9TbGFzaChhcnJheV9tYXAoJ3Ry
aW0nLCBleHBsb2RlKCcsJywgJGtleXdvcmRzKSkpOw0KCQlmb3JlYWNoICgka2V5cyBhcyAk
a2V5KSB7DQoJCQkka2V5cGFydHNbXSA9ICJGSU5EX0lOX1NFVCgnIi4ka2V5LiInLEtleXdv
cmRzKSI7DQoJCX0NCgkJJGtleXdvcmRzID0gIiBhbmQgKCIgLiBqb2luKCcgb3IgJywka2V5
cGFydHMpIC4gIikiOw0KCX0NCg0KCWlmICgkaWQpDQoJCSRzdGF0dXNxID0gIiBhbmQgU3Rh
dHVzID49ICc0JyI7DQoJZWxzZQ0KCQkkc3RhdHVzcSA9ICIgYW5kIFN0YXR1cz0nIi5kb1Ns
YXNoKCRzdGF0dXMpLiInIjsNCg0KCSR3aGVyZSA9ICIxIiAuICRzdGF0dXNxLiAkdGltZS4N
CgkJJGlkIC4gJGNhdGVnb3J5IC4gJHNlY3Rpb24gLiAkZXhjZXJwdGVkIC4gJG1vbnRoIC4g
JGF1dGhvciAuICRrZXl3b3JkcyAuICRjdXN0b20gLiAkZnJvbnRwYWdlOw0KDQoJCSRwZ29m
ZnNldCA9ICRvZmZzZXQgLiAnLCAnOw0KDQoJJHJzID0gc2FmZV9yb3dzX3N0YXJ0KCIqLCB1
bml4X3RpbWVzdGFtcChQb3N0ZWQpIGFzIHVQb3N0ZWQiLCAndGV4dHBhdHRlcm4nLA0KCQkk
d2hlcmUuICcgb3JkZXIgYnkgJyAuIGRvc2xhc2goJHNvcnRieSkgLiAnICcgLiBkb1NsYXNo
KCRzb3J0ZGlyKSAuICcgbGltaXQgJyAuIGRvU2xhc2goJGxpbWl0KSk7DQoNCglyZXR1cm4g
JHJzOw0KfQ0KDQoNCiI7czo0OiJ0eXBlIjtzOjE6IjUiO3M6NToib3JkZXIiO3M6MToiNSI7
czo1OiJmbGFncyI7czoxOiIwIjtzOjQ6ImhlbHAiO3M6MTExODoiPHA+VG8gbGVhcm4gbW9y
ZSBhYm91dCB0cnVfdGFncywgY2hlY2sgb3V0IHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnJh
aW5za2l0LmNvbS9ibG9nLzQ5My90cnV0YWdzLWEtdGFnZ2luZy1wbHVnaW4tZm9yLXRleHRw
YXR0ZXJuIiByZWw9Im5vZm9sbG93Ij5pbnRyb2R1Y3RvcnkgYXJ0aWNsZTwvYT4sIDxhIGhy
ZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVs
ZWFzZXMiIHJlbD0ibm9mb2xsb3ciPnJlbGVhc2VzIHBhZ2U8L2E+LCA8YSBocmVmPSJodHRw
Oi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVyZS1saXN0
IiByZWw9Im5vZm9sbG93Ij5mZWF0dXJlIGxpc3Q8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3
LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3RydV90YWdzLXJvYWRtYXAiIHJlbD0ibm9m
b2xsb3ciPnJvYWRtYXA8L2E+LCBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5j
b20vcmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyIgcmVsPSJub2Zv
bGxvdyI+dXNhZ2UgaW5zdHJ1Y3Rpb25zPC9hPi48L3A+Cgo8cD5Zb3UgY2FuIGFsc28gZmlu
ZCB0aGUgc291cmNlIGNvZGUgYXQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RydWlz
dC90cnUtdGFncyIgcmVsPSJub2ZvbGxvdyI+Z2l0aHViLmNvbS90cnVpc3QvdHJ1LXRhZ3M8
L2E+LjwvcD4KCjxwPkkmIzgyMTc7dmUgdGFrZW4gdGhlIGRldGFpbGVkIGhlbHAgb3V0IG9m
IHRoZSBwbHVnaW47IG15IGFwb2xvZ2llcy4gIEl0IHdhcyB0b28gYmlnIGFuZCB0b28gZGlm
ZmljdWx0IHRvIGtlZXAgbWFpbnRhaW5pbmcgb24gbXkgc2l0ZSBhbmQgaW4gdGhlIHBsdWdp
bi4gIElmLCBteSBzaXRlIGlzIGV2ZXIgZG93biwgaG93ZXZlciwgdGhlIHNvdXJjZSA8c3Bh
biBjbGFzcz0iY2FwcyI+SFRNTDwvc3Bhbj4gb2YgdGhlIHVzYWdlIGluc3RydWN0aW9ucyBp
cyBhdmFpbGFibGUgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RydWlz
dC90cnUtdGFncy9ibG9iL21hc3Rlci90cnVfdGFncy1kb2NzLmh0bWwiIHJlbD0ibm9mb2xs
b3ciPmdpdGh1YiByZXBvPC9hPjwvcD4iO3M6MzoibWQ1IjtzOjMyOiIwYTVkZTRkMmY5NzM5
NzcxYTY1ZWQyYmUyMGZlZjY2MyI7fQ==

Last edited by etc (2020-06-25 20:54:57)

Offline

#822 2020-06-25 12:33:41

whocarez
Plugin Author
From: Germany/Ukraine
Registered: 2007-10-08
Posts: 305
Website GitHub Twitter

Re: tru_tags: A tagging plugin for textpattern

Do I understand it right, that you only changed the load order to 3, means lower than 5 and these lines?

if (tru_tags_clean_urls()) {
	register_callback('tru_tags_clean_url_handler', 'pretext', '', 1);
}

Than it doesn’t solve the problem.

Offline

#823 2020-06-25 12:42:51

etc
Developer
Registered: 2010-11-11
Posts: 5,028
Website GitHub

Re: tru_tags: A tagging plugin for textpattern

whocarez wrote #324008:

Than it doesn’t solve the problem.

It’s a 4.8.2+ only version, sorry.

Offline

#824 2020-06-25 12:43:40

whocarez
Plugin Author
From: Germany/Ukraine
Registered: 2007-10-08
Posts: 305
Website GitHub Twitter

Re: tru_tags: A tagging plugin for textpattern

Ok, than we have to wait :-).

Offline

#825 2020-06-25 21:03:20

etc
Developer
Registered: 2010-11-11
Posts: 5,028
Website GitHub

Re: tru_tags: A tagging plugin for textpattern

Okay, this version should work in both 4.8.1 et 4.8.2.

Basic facts:

  • if you need to rewrite request_uri, set load order to something < 5 and register_callback('my_url_handler', 'pretext', '', 0); in 4.8.2 or call my_url_handler() directly in 4.8.1.
  • but actually it suffices to register_callback('my_url_handler', 'pretext'); and set global $pretext['s'] = 'my_section' in my_url_handler(), no need to rewrite URI. At this point URI chunks are stored in $pretext[1|2|...] so you can easily analyse them.

Offline

#826 2020-06-25 22:16:35

whocarez
Plugin Author
From: Germany/Ukraine
Registered: 2007-10-08
Posts: 305
Website GitHub Twitter

Re: tru_tags: A tagging plugin for textpattern

Thanks, it works. I really appreciate your help!

With working jquery-ui autocomplete function, it looks like that:

# Name: tru_tags v3.9.2 
# Type: Admin/Public/AJAX plugin
# Article tagging
# Author: Nathan Arthur
# URL: http://www.rainskit.com/
# Recommended load order: 1

# .....................................................................
# This is a plugin for Textpattern CMS - http://textpattern.com/
# To install: textpattern > admin > plugins
# Paste the following text into the 'Install plugin' box:
# .....................................................................

YToxMTp7czo0OiJuYW1lIjtzOjg6InRydV90YWdzIjtzOjY6ImF1dGhvciI7czoxMzoiTmF0
aGFuIEFydGh1ciI7czoxMDoiYXV0aG9yX3VyaSI7czoyNDoiaHR0cDovL3d3dy5yYWluc2tp
dC5jb20vIjtzOjc6InZlcnNpb24iO3M6NToiMy45LjIiO3M6MTE6ImRlc2NyaXB0aW9uIjtz
OjE1OiJBcnRpY2xlIHRhZ2dpbmciO3M6NDoiY29kZSI7czo0Nzg3MzoiIyBDb3B5cmlnaHQg
MjAxNyBOYXRoYW4gQXJ0aHVyDQojIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUgUHVibGljIExp
Y2Vuc2UsIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNl
bnNlLnBocCBmb3IgZGV0YWlscw0KIw0KIyBUaGlzIHdvcmsgd2FzIG9yaWdpbmFsbHkgaW5z
cGlyZWQgYnkgcmFuX3RhZ3MgYnkgUmFuIEFyb3Vzc2ksIG9yaWdpbmFsbHkgZm91bmQgYXQg
aHR0cDovL2Fyb3Vzc2kuY29tL2FydGljbGUvNDUvdGFnZ2luZy10ZXh0cGF0dGVybg0KIyBK
YXZhc2NyaXB0IGJ1ZyBmaXhlcyB3ZXJlIHByb3ZpZGVkIGJ5IHRoZV9naG9zdCAtIGh0dHA6
Ly92aWN0b3J1cy5uZXQNCiMgSmF2YXNjcmlwdCBjb2RlIGZvciB0aGUgdGFnIGF1dG8tY29t
cGxldGUgZmVhdHVyZSB3YXMgcHJvdmlkZWQgYnkgSmltIEJpYW5jb2xvIC0gaHR0cDovL3d3
dy5iaWFuY29sby5jb20vDQojIEZpeGVzIGZvciBUZXh0cGF0dGVybiA0LjYgcHJvdmlkZWQg
Ynk6DQojICAgLSBSaW1hcyBLdWRlbGlzOyBodHRwczovL2dpdGh1Yi5jb20vcmltYXMta3Vk
ZWxpcw0KIyAgIC0gam9vbHMtcjsgaHR0cHM6Ly9naXRodWIuY29tL2pvb2xzLXINCiMgICAt
IFNpbW9uIEZpbmNoOyBodHRwczovL2dpdGh1Yi5jb20vc3BpZmZpbg0KDQoNCiMjIyBDT05G
SUdVUkFUSU9OICMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgVFVSTiBCQUNLISAg
Q29uZmlndXJhdGlvbiBpcyBubyBsb25nZXIgaGFuZGxlZCBieSBlZGl0aW5nIHRoZSBwbHVn
aW4uDQojIENoZWNrIG91dCB0aGUgJ0V4dGVuc2lvbnMnIHRhYiBpbiB0aGUgVGV4dHBhdHRl
cm4gYWRtaW4gOikNCg0KDQojIENoYW5naW5nIHRoZXNlIHdvbid0IGRvIGFueSBnb29kLiAg
VGhleSdyZSBqdXN0IGhlcmUgYXMgYSBjb252ZW5pZW5jZSBmb3IgZGV2ZWxvcG1lbnQuDQpk
ZWZpbmUoJ1RSVV9UQUdTX0ZJRUxEJywgJ0tleXdvcmRzJyk7DQpkZWZpbmUoJ0VOQ09ESU5H
JywgJ3V0Zi04Jyk7DQoNCmRlZmluZSgnQ0xFQU5fVVJMUycsICdjbGVhbl91cmxzJyk7DQpk
ZWZpbmUoJ1RBR19TRUNUSU9OJywgJ3RhZ19zZWN0aW9uJyk7DQpkZWZpbmUoJ1BBUk1fTkFN
RScsICdwYXJtJyk7DQpkZWZpbmUoJ1RBR1NfSU5fRkVFRF9DQVRFR09SSUVTJywgJ3RhZ3Nf
aW5fZmVlZF9jYXRlZ29yaWVzJyk7DQpkZWZpbmUoJ1RBR1NfSU5fRkVFRF9CT0RZJywgJ3Rh
Z3NfaW5fZmVlZF9ib2R5Jyk7DQpkZWZpbmUoJ1RBR1NfSU5fV1JJVEVfVEFCJywgJ3RhZ3Nf
aW5fd3JpdGVfdGFiJyk7DQpkZWZpbmUoJ0FVVE9DT01QTEVURV9JTl9XUklURV9UQUInLCAn
YXV0b2NvbXBsZXRlX2luX3dyaXRlX3RhYicpOw0KZGVmaW5lKCdVVEZfOF9DQVNFJywgJ3V0
Zl84X2Nhc2UnKTsNCg0KZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCiR0cnVfdGFnc19wcmVm
cyA9IHRydV90YWdzX2xvYWRfcHJlZnMoKTsNCg0KDQojIyMgVEFHIFJFR0lTVFJBVElPTiAj
IyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpUeHA6OmdldCgnXFRleHRwYXR0ZXJu
XFRhZ1xSZWdpc3RyeScpDQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfaGFuZGxlcicpDQoJLT5y
ZWdpc3RlcigndHJ1X3RhZ3NfaWZfaGFzX3RhZ3MnKQ0KCS0+cmVnaXN0ZXIoJ3RydV90YWdz
X2Zyb21fYXJ0aWNsZScpDQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfY2xvdWQnKQ0KCS0+cmVn
aXN0ZXIoJ3RydV90YWdzX2xpc3QnKQ0KCS0+cmVnaXN0ZXIoJ3RydV90YWdzX2lmX3RhZ19z
ZWFyY2gnKQ0KCS0+cmVnaXN0ZXIoJ3RydV90YWdzX3RhZ19wYXJhbWV0ZXInKQ0KCS0+cmVn
aXN0ZXIoJ3RydV90YWdzX3NlYXJjaF9yZXN1bHRfZXhjZXJwdCcpDQoJLT5yZWdpc3Rlcign
dHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcicpDQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfcmVs
YXRlZF90YWdzX2Zyb21fc2VhcmNoJykNCgktPnJlZ2lzdGVyKCd0cnVfdGFnc19hcmNoaXZl
JykNCgktPnJlZ2lzdGVyKCd0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnJyk7DQoNCiMj
IyBQUklNQVJZIFRBRyBGVU5DVElPTlMgIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIw0KDQpmdW5jdGlvbiB0cnVfdGFnc19oYW5kbGVyKCRhdHRzKSB7DQoJJHRhZ19wYXJh
bWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsNCglpZiAo
IWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgew0KCQlpZiAodHJ1X3RhZ3NfcmVkaXJlY3RfaWZf
bmVlZGVkKCR0YWdfcGFyYW1ldGVyKSkgew0KCQkJcmV0dXJuICcnOw0KCQl9DQoJCSRjbGVh
bl9hdHRzID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0
ZXIpOw0KCQkkcmVzdWx0ID0gZG9BcnRpY2xlcygkY2xlYW5fYXR0cywgdHJ1ZSk7CQkjZnVu
Y3Rpb24gaW4gVFhQIGNvZGUNCgkJaWYgKHRyaW0oJHJlc3VsdCkgPT0gJycpIHsNCgkJCWlm
IChpc3NldCgkYXR0c1snbm9hcnRpY2xlcyddKSkgew0KCQkJCXRydV90YWdzX3JlZGlyZWN0
KCRhdHRzWydub2FydGljbGVzJ10sIHRydWUpOw0KCQkJfSBlbHNlIGlmIChpc3NldCgkYXR0
c1snNDA0cmVkaXJlY3QnXSkgJiYgISRhdHRzWyc0MDRyZWRpcmVjdCddKSB7DQoJCQkJcmV0
dXJuICRyZXN1bHQ7DQoJCQl9IGVsc2Ugew0KCQkJCXR4cF9kaWUoZ1R4dCgnNDA0X25vdF9m
b3VuZCcpLCAnNDA0Jyk7DQoJCQl9DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gJHJlc3VsdDsN
CgkJfQ0KCX0gZWxzZSB7DQoJCXJldHVybiB0cnVfdGFnc19jbG91ZCgkYXR0cyk7DQoJfQ0K
fQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FyY2hpdmUoJGF0dHMpIHsNCglnbG9iYWwgJHRy
dV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWc7DQoJJHRhZ3MgPSBhcnJheV91bmlxdWUodHJ1
X3RhZ3NfY2xvdWRfcXVlcnkodHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0
dHMsIGZhbHNlLCBmYWxzZSkpKTsNCgluYXRjYXNlc29ydCgkdGFncyk7DQoJZm9yZWFjaCAo
JHRhZ3MgYXMgJHRhZykgew0KCQkkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZyA9ICR0
YWc7DQoJCSRjbGVhbl9hdHRzID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywg
JHRhZyk7DQoJCSRyZXN1bHRzW10gPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVlKTsJ
CSNmdW5jdGlvbiBpbiBUWFAgY29kZQ0KCX0NCglyZXR1cm4gam9pbignICcsICRyZXN1bHRz
KTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKCRhdHRz
KSB7DQoJZ2xvYmFsICR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnOw0KCWV4dHJhY3Qo
bEF0dHMoYXJyYXkoJ2xpbmsnID0+ICcwJyksICAkYXR0cywgMCkpOw0KCWlmICgkbGluaykg
ew0KCQlyZXR1cm4gJzxhIGhyZWY9IicgLiB0cnVfdGFnc19saW5raWZ5X3RhZygkdHJ1X3Rh
Z3NfY3VycmVudF9hcmNoaXZlX3RhZykgLiAnIj4nIC4gJHRydV90YWdzX2N1cnJlbnRfYXJj
aGl2ZV90YWcgLiAnPC9hPic7DQoJfSBlbHNlIHsNCgkJcmV0dXJuICR0cnVfdGFnc19jdXJy
ZW50X2FyY2hpdmVfdGFnOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZCgk
YXR0cykgew0KCXJldHVybiB0cnVfdGFnc19saXN0KHRydV90YWdzX2dldF9zdGFuZGFyZF9j
bG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVf
dGFnc19saXN0KCRhdHRzKSB7DQoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xv
dWRfYXR0cygkYXR0cywgdHJ1ZSwgZmFsc2UpOw0KCSRhbGxfdGFncyA9IHRydV90YWdzX2Ns
b3VkX3F1ZXJ5KCRhdHRzKTsNCg0KCXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0
dHMsICRhbGxfdGFncywgJGFsbF90YWdzKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19m
cm9tX2FydGljbGUoJGF0dHMpIHsNCglnbG9iYWwgJHRoaXNhcnRpY2xlOw0KCWV4dHJhY3Qo
JHRoaXNhcnRpY2xlKTsNCg0KCSRhbGxfdGFncyA9IHRydV90YWdzX2dldF90YWdzX2Zvcl9h
cnRpY2xlKCR0aGlzaWQpOw0KDQoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xv
dWRfYXR0cygkYXR0cywgZmFsc2UsIHRydWUpOw0KCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0g
JGFsbF90YWdzOw0KCWlmICgkYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7DQoJCSRhbGxf
dGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOw0KCX0NCg0K
CXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90
YWdzX2Zvcl93ZWlnaHQpOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2lmX2hhc190YWdz
KCRhdHRzLCAkdGhpbmcpIHsNCglnbG9iYWwgJHRoaXNhcnRpY2xlOw0KCWV4dHJhY3QoJHRo
aXNhcnRpY2xlKTsNCg0KCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7DQoNCgkkcnMg
PSBzYWZlX3JvdygkdGFnc19maWVsZCwgInRleHRwYXR0ZXJuIiwgIklEPSckdGhpc2lkJyBB
TkQgJHRhZ3NfZmllbGQgPD4gJyciKTsNCglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5n
LCAkcnMpKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19pZl90YWdfc2VhcmNoKCRhdHRz
LCAkdGhpbmcpIHsNCglleHRyYWN0KGxBdHRzKGFycmF5KCd0YWcnID0+ICcnKSwgICRhdHRz
LCAwKSk7DQoNCgkkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJy
YXkoJ3N0cmlwaHlwaGVucycgPT4gMSksIGZhbHNlKTsNCgkkY29uZGl0aW9uID0gKCFlbXB0
eSgkdGFnX3BhcmFtZXRlcikpID8gdHJ1ZSA6IGZhbHNlOw0KCWlmICgkY29uZGl0aW9uICYm
ICFlbXB0eSgkdGFnKSkgew0KCQkkY29uZGl0aW9uID0gKCR0YWdfcGFyYW1ldGVyID09ICR0
YWcpOw0KCX0NCglyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkY29uZGl0aW9uKSk7
DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcigkYXR0cywgJHNhZmVo
dG1sID0gdHJ1ZSkgew0KCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJZXh0cmFjdChsQXR0
cyhhcnJheSgnc3RyaXBoeXBoZW5zJyA9PiAnMCcsICd1cmxlbmNvZGUnID0+IDApLCAgJGF0
dHMsIDApKTsNCg0KCSRwYXJtID0gdXJsZGVjb2RlKHN0cmlwX3RhZ3MoZ3BzKCR0cnVfdGFn
c19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSkpKTsNCglpZiAoJ2xvb2t1cCcgPT0gJHN0cmlw
aHlwaGVucykgew0KCQkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRz
KGFycmF5KCksIGZhbHNlLCBmYWxzZSk7DQoJCSR0YWdfbGlzdCA9IGFycmF5X3VuaXF1ZSh0
cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cykpOw0KCQlmb3JlYWNoICgkdGFnX2xpc3QgYXMg
JGNsb3VkX3RhZykgew0KCQkJaWYgKCRwYXJtID09IHN0cl9yZXBsYWNlKCcgJywgJy0nLCAk
Y2xvdWRfdGFnKSkgew0KCQkJCSRwYXJtID0gJGNsb3VkX3RhZzsNCgkJCQlicmVhazsNCgkJ
CX0NCgkJfQ0KCX0gZWxzZSBpZiAoJHN0cmlwaHlwaGVucykgew0KCQkkcGFybSA9IHN0cl9y
ZXBsYWNlKCctJywgJyAnLCAkcGFybSk7DQoJfQ0KCWlmICgkdXJsZW5jb2RlKSB7DQoJCSRw
YXJtID0gdXJsZW5jb2RlKCRwYXJtKTsNCgkgfSBlbHNlIGlmICgkc2FmZWh0bWwpIHsNCgkJ
JHBhcm0gPSBodG1sc3BlY2lhbGNoYXJzKCRwYXJtKTsNCgl9DQoNCglyZXR1cm4gJHBhcm07
DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3Jlc3VsdF9leGNlcnB0KCRhdHRz
KSB7DQoJZ2xvYmFsICRwcmV0ZXh0Ow0KDQoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190
YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsNCglpZiAodHJpbSgkdGFnX3BhcmFtZXRl
cikgIT0gJycpIHsNCgkJJHEgPSAkcHJldGV4dFsncSddOw0KCQkkcHJldGV4dFsncSddID0g
JHRhZ19wYXJhbWV0ZXI7DQoJCSRyZXN1bHQgPSBzZWFyY2hfcmVzdWx0X2V4Y2VycHQoJGF0
dHMpOw0KCQkkcHJldGV4dFsncSddID0gJHE7DQoJfSBlbHNlIHsNCgkJJHJlc3VsdCA9IHNl
YXJjaF9yZXN1bHRfZXhjZXJwdCgkYXR0cyk7DQoJfQ0KCXJldHVybiAkcmVzdWx0Ow0KfQ0K
DQoNCmZ1bmN0aW9uIHRydV90YWdzX3NlYXJjaF9wYXJhbWV0ZXIoKSB7DQoJdHJpZ2dlcl9l
cnJvcihnVHh0KCdkZXByZWNhdGVkX3RhZycpLCBFX1VTRVJfTk9USUNFKTsNCglyZXR1cm4g
c3RyaXBfdGFncyhncHMoJ3EnKSk7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfcmVsYXRl
ZF90YWdzX2Zyb21fc2VhcmNoKCRhdHRzKSB7DQoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFn
c190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsNCglleHRyYWN0KGxBdHRzKGFycmF5
KCd0YWdfcGFyYW1ldGVyJyA9PiAkdGFnX3BhcmFtZXRlciksICAkYXR0cywgMCkpOw0KCWlm
ICghZW1wdHkoJHRhZ19wYXJhbWV0ZXIpKSB7DQogICAgICAgICR0YWdzX2ZpZWxkID0gVFJV
X1RBR1NfRklFTEQ7DQoJCSRhbGxfdGFncyA9IGFycmF5KCk7DQoNCgkJJHF1ZXJ5X2F0dHMg
PSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7DQoJ
CSRycyA9IHRydV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2goJHF1ZXJ5X2F0dHMpOw0KCQlp
ZiAoJHJzKSB7DQoJCQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsNCgkJCQkkYXJ0aWNs
ZV90YWdzID0gYXJyYXkoKTsNCgkJCQlpZiAoaXNzZXQoJGFbJHRhZ3NfZmllbGRdKSkgew0K
CQkJCQkkYXJ0aWNsZV90YWdzID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9s
b3dlcigkYVskdGFnc19maWVsZF0pKSk7DQoJCQkJfQ0KCQkJCSMgZmFzdGVyIGltcGxlbWVu
dGF0aW9uIG9mIGFycmF5X21lcmdlKCksIHRoYW5rcyB0byB3aG9jYXJleg0KCQkJCSMgKGh0
dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9MjM4MzczI3Ay
MzgzNzMpDQoJCQkJZm9yZWFjaCh0cnVfdGFnc190cmltX3RhZ3MoJGFydGljbGVfdGFncykg
YXMgJGkpIHskYWxsX3RhZ3NbXSA9ICRpO30NCgkJCX0NCgkJfQ0KDQoJCSRhbHRfdGFnX3Bh
cmFtZXRlciA9IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkdGFnX3BhcmFtZXRlcik7DQoJCWZv
cmVhY2ggKCRhbGxfdGFncyBhcyAka2V5ID0+ICR0YWcpIHsNCgkJCWlmICgkdGFnID09ICR0
YWdfcGFyYW1ldGVyIHx8ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVyKSB7DQoJCQkJdW5z
ZXQoJGFsbF90YWdzWyRrZXldKTsNCgkJCX0NCgkJfQ0KDQoJCSRjbG91ZF9hdHRzID0gdHJ1
X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIGZhbHNlLCBmYWxzZSk7DQoJ
CSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gJGFsbF90YWdzOw0KCQlpZiAoJGNsb3VkX2F0dHNb
J3VzZW92ZXJhbGxjb3VudHMnXSkgew0KCQkJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSB0cnVf
dGFnc19jbG91ZF9xdWVyeSgkY2xvdWRfYXR0cyk7DQoJCX0NCg0KCQlyZXR1cm4gdHJ1X3Rh
Z3NfcmVuZGVyX2Nsb3VkKCRjbG91ZF9hdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFnc19mb3Jf
d2VpZ2h0KTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gJyc7DQoJfQ0KfQ0KDQoNCiMjIyBDTE9V
RCBTVVBQT1JUIEZVTkNUSU9OUyAjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMs
ICRpc0xpc3QsICRpc0FydGljbGUsICRzaG93QWxsPWZhbHNlKSB7DQoJcmV0dXJuIGxBdHRz
KGFycmF5KCd3cmFwdGFnJwk9PiAoJGlzTGlzdCA/ICd1bCcgOiAnJyksDQoJCQknYnJlYWsn
CQk9PiAoJGlzTGlzdCA/ICdsaScgOiAnLCAnKSwNCgkJCSdjbGFzcycJCT0+ICcnLA0KCQkJ
J2JyZWFrY2xhc3MnCT0+ICcnLA0KCQkJJ3NlY3Rpb24nCT0+ICcnLA0KCQkJJ21pbnBlcmNl
bnQnCT0+ICcxMDAnLA0KCQkJJ21heHBlcmNlbnQnCT0+ICgkaXNMaXN0IHx8ICRpc0FydGlj
bGUgPyAnMTAwJyA6ICcyMDAnKSwNCgkJCSdzaG93Y291bnRzJwk9PiAnJywNCgkJCSdjb3Vu
dHdyYXBjaGFycycJPT4gJ1tdJywNCgkJCSd1c2VyZWx0YWcnCT0+ICgkaXNBcnRpY2xlID8g
JzEnIDogJycpLA0KCQkJJ2dlbmVyYXRlbGlua3MnCT0+ICcxJywNCgkJCSdtaW50YWdjb3Vu
dCcJPT4gJzAnLA0KCQkJJ21heHRhZ2NvdW50Jwk9PiAnMTAwMCcsDQoJCQknc2V0c2l6ZXMn
CT0+ICgkaXNBcnRpY2xlID8gJzAnIDogJzEnKSwNCgkJCSd1c2Vub2ZvbGxvdycJPT4gJycs
DQoJCQknc29ydCcJCT0+ICdhbHBoYScsDQoJCQkndXNlb3ZlcmFsbGNvdW50cycJPT4gJycs
DQoJCQknc2V0Y2xhc3NlcycJPT4gKCRpc0FydGljbGUgPyAnMCcgOiAnMScpLA0KCQkJJ3Rp
dGxlJwkJPT4gJycsDQoJCQknbGlzdGxpbWl0Jwk9PiAnJywNCgkJCSdrZWVwJwkJPT4gJ2xh
cmdlc3QnLA0KCQkJJ2N1dG9mZicJPT4gJ2NodW5rJywNCgkJCSd0ZXh0dHJhbnNmb3JtJwk9
PiAnbm9uZScsDQoJCQknbGlua3BhdGgnCT0+ICcnLA0KCQkJJ2xpbmtwYXRodGFpbCcJPT4g
JycsDQoJCQknZmlsdGVyc2VhcmNoJwk9PiAoJHNob3dBbGwgPyAwIDogJzEnKSwNCgkJCSdl
eGNsdWRlc2VjdGlvbic9PiAnJywNCgkJCSdhY3RpdmVjbGFzcycJPT4gJ3RhZ0FjdGl2ZScs
DQoJCQkndGltZScJCT0+ICgkc2hvd0FsbCA/ICdhbnknIDogJ3Bhc3QnKQ0KCQkpLCRhdHRz
LCAwKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cykgew0K
CWV4dHJhY3QoJGF0dHMpOw0KDQoJJHNlY3Rpb25fY2xhdXNlID0gJyc7DQoJaWYgKCRzZWN0
aW9uIDw+ICcnKSB7DQoJCSRrZXlzID0gZXhwbG9kZSgnLCcsICRzZWN0aW9uKTsNCgkJZm9y
ZWFjaCAoJGtleXMgYXMgJGtleSkgew0KCQkJJGtleXBhcnRzW10gPSAiIFNlY3Rpb24gPSAn
IiAuIHRyaW0oJGtleSkgLiAiJyI7DQoJCX0NCgkJJHNlY3Rpb25fY2xhdXNlID0gIiBBTkQg
KCIgLiBqb2luKCcgb3IgJywgJGtleXBhcnRzKSAuICIpIjsNCgl9DQoNCgkkdGFnc19maWVs
ZCA9IFRSVV9UQUdTX0ZJRUxEOw0KCWluY2x1ZGVfb25jZSB0eHBhdGguJy9wdWJsaXNoL3Nl
YXJjaC5waHAnOw0KDQoJJGZpbHRlciA9IHRydV90YWdzX2ZpbHRlcl9zZWN0aW9ucygkZXhj
bHVkZXNlY3Rpb24pOw0KCSRmaWx0ZXIgLj0gKCRmaWx0ZXJzZWFyY2ggPyBmaWx0ZXJTZWFy
Y2goKSA6ICcnKTsNCg0KCXN3aXRjaCAoJHRpbWUpIHsNCgkJY2FzZSAnYW55JzoNCgkJCSR0
aW1lID0gIiI7IGJyZWFrOw0KCQljYXNlICdmdXR1cmUnOg0KCQkJJHRpbWUgPSAiIGFuZCBQ
b3N0ZWQgPiBub3coKSI7IGJyZWFrOw0KCQlkZWZhdWx0Og0KCQkJJHRpbWUgPSAiIGFuZCBQ
b3N0ZWQgPD0gbm93KCkiOw0KCX0NCglnbG9iYWwgJHByZWZzOw0KCWV4dHJhY3QoJHByZWZz
KTsNCglpZiAoISRwdWJsaXNoX2V4cGlyZWRfYXJ0aWNsZXMpIHsNCgkJJHRpbWUgLj0gIiBh
bmQgKG5vdygpIDw9IEV4cGlyZXMgb3IgRXhwaXJlcyBJUyBOVUxMKSI7DQoJfQ0KDQoJJGFs
bF90YWdzID0gYXJyYXkoKTsNCgkkcnMgPSBzYWZlX3Jvd3MoIiR0YWdzX2ZpZWxkIiwgInRl
eHRwYXR0ZXJuIiwgIiR0YWdzX2ZpZWxkIDw+ICcnIiAuICRzZWN0aW9uX2NsYXVzZSAuICRm
aWx0ZXIgLiAiIGFuZCBTdGF0dXMgPj0gJzQnIiAuICR0aW1lKTsNCglmb3JlYWNoICgkcnMg
YXMgJHJvdykgew0KCQkkdGVtcF9hcnJheSA9IGFycmF5KCk7DQoJCWlmIChpc3NldCgkcm93
WyR0YWdzX2ZpZWxkXSkpIHsNCgkJCSR0ZW1wX2FycmF5ID0gZXhwbG9kZSgiLCIsIHRyaW0o
dHJ1X3RhZ3Nfc3RydG9sb3dlcigkcm93WyR0YWdzX2ZpZWxkXSkpKTsNCgkJfQ0KCQkjIGZh
c3RlciBpbXBsZW1lbnRhdGlvbiBvZiBhcnJheV9tZXJnZSgpLCB0aGFua3MgdG8gd2hvY2Fy
ZXoNCgkJIyAoaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3Bp
ZD0yMzgzNzMjcDIzODM3MykNCgkJZm9yZWFjaCh0cnVfdGFnc190cmltX3RhZ3MoJHRlbXBf
YXJyYXkpIGFzICRpKSB7JGFsbF90YWdzW10gPSAkaTt9DQoJfQ0KDQoJcmV0dXJuICRhbGxf
dGFnczsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMoJGV4Y2x1
ZGVzZWN0aW9uKSB7DQoJJHNlY3Rpb25zID0gZXhwbG9kZSgnLCcsICRleGNsdWRlc2VjdGlv
bik7DQoJJGZpbHRlcnMgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCRzZWN0aW9ucyBhcyAkc2Vj
dGlvbikgew0KCQkkZmlsdGVyc1tdID0gImFuZCBTZWN0aW9uICE9ICciLmRvU2xhc2goJHNl
Y3Rpb24pLiInIjsNCgl9DQoJcmV0dXJuIGpvaW4oJyAnLCAkZmlsdGVycyk7DQp9DQoNCg0K
ZnVuY3Rpb24gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxf
dGFnc19mb3Jfd2VpZ2h0KSB7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCglleHRyYWN0
KCRhdHRzKTsNCg0KCSR0YWdzX3dlaWdodCA9IGFycmF5X2NvdW50X3ZhbHVlcygkYWxsX3Rh
Z3NfZm9yX3dlaWdodCk7DQoNCglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAk
d2VpZ2h0KSB7DQoJCWlmICghaW5fYXJyYXkoJHRhZywgJGFsbF90YWdzKQ0KCQkgICB8fCAk
dGFnc193ZWlnaHRbJHRhZ10gPCAkbWludGFnY291bnQNCgkJICAgfHwgJHRhZ3Nfd2VpZ2h0
WyR0YWddID4gJG1heHRhZ2NvdW50KSB7DQoJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRhZ10p
Ow0KCQl9DQoJfQ0KDQoJJHNvcnRfYnlfY291bnQgPSAoc3RycG9zKCRzb3J0LCAnY291bnQn
KSAhPT0gZmFsc2UpOw0KCSRzb3J0X2FzY2VuZGluZyA9IChzdHJwb3MoJHNvcnQsICdhc2Mn
KSAhPT0gZmFsc2UpOw0KCSR0YWdzX3dlaWdodCA9IHRydV90YWdzX3NvcnRfdGFncygkdGFn
c193ZWlnaHQsICRzb3J0X2J5X2NvdW50LCAkc29ydF9hc2NlbmRpbmcpOw0KDQoJaWYgKCRs
aXN0bGltaXQgPiAwICYmICRsaXN0bGltaXQgPCBjb3VudCgkdGFnc193ZWlnaHQpKSB7DQoJ
CSRyZXNvcnRlZF90YWdzID0gYXJyYXkoKTsNCgkJaWYgKCRrZWVwID09ICdsYXJnZXN0Jykg
ew0KCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKHRydV90YWdzX3NvcnRfdGFncygk
dGFnc193ZWlnaHQsIHRydWUsIGZhbHNlKSk7DQoJCX0gZWxzZSB7DQoJCQlpZiAoJGtlZXAg
PT0gJ3JhbmRvbScpIHsNCgkJCQlmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAk
d2VpZ2h0KSB7DQoJCQkJCSRyZXNvcnRlZF90YWdzWyR0YWddID0gcmFuZCgwLCAkd2VpZ2h0
KTsNCgkJCQl9DQoJCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKHRydV90YWdzX3Nv
cnRfdGFncygkcmVzb3J0ZWRfdGFncywgdHJ1ZSwgZmFsc2UpKTsNCgkJCX0gZWxzZSBpZiAo
JGtlZXAgPT0gJ2FscGhhJykgew0KCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cygk
dGFnc193ZWlnaHQpOw0KCQkJCW5hdGNhc2Vzb3J0KCRyZXNvcnRlZF90YWdzKTsNCgkJCX0N
CgkJCSRjdXRvZmYgPSAnZXhhY3QnOw0KCQl9DQoNCgkJJGxhc3RfZ29vZF9pbmRleCA9ICRs
aXN0bGltaXQgLSAxOw0KCQlpZiAoJGN1dG9mZiA9PSAnY2h1bmsnKSB7IC8vYWx0ZXJuYXRp
dmUgaXMgJ2V4YWN0Jw0KCQkJJGxhc3Rfd2VpZ2h0ID0gLTE7DQoJCQlmb3IgKCRpID0gMDsg
JGkgPCAkbGlzdGxpbWl0ICsgMTsgJGkrKykgew0KCQkJCSRuZXdfd2VpZ2h0ID0gJHRhZ3Nf
d2VpZ2h0WyRyZXNvcnRlZF90YWdzWyRpXV07DQoJCQkJaWYgKCRuZXdfd2VpZ2h0ICE9ICRs
YXN0X3dlaWdodCkgew0KCQkJCQkkbGFzdF9nb29kX2luZGV4ID0gJGkgLSAxOw0KCQkJCQkk
bGFzdF93ZWlnaHQgPSAkbmV3X3dlaWdodDsNCgkJCQl9DQoJCQl9DQoJCQlpZiAoJGxhc3Rf
Z29vZF9pbmRleCA8IDApIHsNCgkJCQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAt
IDE7DQoJCQl9DQoJCX0NCg0KCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2NodW5rKCRyZXNv
cnRlZF90YWdzLCAkbGFzdF9nb29kX2luZGV4ICsgMSk7DQoJCSRyZXNvcnRlZF90YWdzID0g
JHJlc29ydGVkX3RhZ3NbMF07DQoNCgkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcg
PT4gJHdlaWdodCkgew0KCQkJaWYgKCFpbl9hcnJheSgkdGFnLCAkcmVzb3J0ZWRfdGFncykp
IHsNCgkJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRhZ10pOw0KCQkJfQ0KCQl9DQoJfQ0KDQoJ
aWYgKCRnZW5lcmF0ZWxpbmtzKSB7DQoJCWlmICgkbGlua3BhdGgpIHsNCgkJCSR1cmxwcmVm
aXggPSAkbGlua3BhdGg7DQoJCQkkdXJsc3VmZml4ID0gJGxpbmtwYXRodGFpbDsNCgkJfSBl
bHNlIHsNCgkJCWlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsNCgkJCQkkdXJscHJlZml4
ID0gaHUgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsNCgkJ
CX0gZWxzZSB7DQoJCQkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJl
ZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcmYW1wOycgLiAkdHJ1X3RhZ3NfcHJlZnNbUEFS
TV9OQU1FXS0+dmFsdWUgLiAnPSc7DQoJCQl9DQoJCQkkdXJsc3VmZml4ID0gKHRydV90YWdz
X2NsZWFuX3VybHMoKSA/ICcvJyA6ICcnKTsNCgkJfQ0KDQoJCWlmICgkdXNlcmVsdGFnKSB7
DQoJCQlpZiAoJHVzZW5vZm9sbG93KSB7DQoJCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9InRh
ZyBub2ZvbGxvdyc7DQoJCQl9IGVsc2Ugew0KCQkJCSR1cmxzdWZmaXggLj0gJyIgcmVsPSJ0
YWcnOw0KCQkJfQ0KCQl9IGVsc2UgaWYgKCR1c2Vub2ZvbGxvdykgew0KCQkJJHVybHN1ZmZp
eCAuPSAnIiByZWw9Im5vZm9sbG93JzsNCgkJfQ0KCX0NCg0KCWlmIChjb3VudCgkdGFnc193
ZWlnaHQpID4gMCkgew0KCQkkbWF4ID0gbWF4KCR0YWdzX3dlaWdodCk7DQoJCSRtaW4gPSBt
aW4oJHRhZ3Nfd2VpZ2h0KTsNCgl9IGVsc2Ugew0KCQkkbWF4ID0gJG1pbiA9IDA7DQoJfQ0K
CSRzdGVwdmFsdWUgPSAoJG1heCA9PSAkbWluKSA/IDAgOiAoJG1heHBlcmNlbnQgLSAkbWlu
cGVyY2VudCkgLyAoJG1heCAtICRtaW4pOw0KDQoJJHRhZ3NfaHRtbCA9IGFycmF5KCk7DQoJ
JHRhZ19zZWFyY2hfdGFnID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgnc3RyaXBo
eXBoZW5zJyA9PiAnbG9va3VwJykpOw0KCSR0YWdfc2VhcmNoX3RhZyA9IGZ1bmN0aW9uX2V4
aXN0cygiaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUiKSA/IGh0bWxzcGVjaWFsY2hhcnNfZGVj
b2RlKCR0YWdfc2VhcmNoX3RhZykgOiBodG1sX2VudGl0eV9kZWNvZGUoJHRhZ19zZWFyY2hf
dGFnKTsNCglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7DQoJ
CSR0YWdfd2VpZ2h0ID0gZmxvb3IoJG1pbnBlcmNlbnQgKyAoJHdlaWdodCAtICRtaW4pICog
JHN0ZXB2YWx1ZSk7DQoNCgkJJHN0eWxlID0gJyc7DQoJCWlmICgkc2V0c2l6ZXMpDQoJCQkk
c3R5bGUgPSAnIHN0eWxlPSJmb250LXNpemU6ICcgLiAkdGFnX3dlaWdodCAuICclOyInOw0K
DQoJCSR0YWdfY2xhc3MgPSAnJzsNCgkJaWYgKCRzZXRjbGFzc2VzKSB7DQoJCQkkdGFnX2Ns
YXNzID0gJyBjbGFzcz0iJzsNCgkJCWlmICgkd2VpZ2h0ID09ICRtaW4pIHsNCgkJCQkkdGFn
X2NsYXNzIC49ICJ0YWdTaXplU21hbGxlc3QiOw0KCQkJfSBlbHNlIGlmICgkd2VpZ2h0ID09
ICRtYXgpIHsNCgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTGFyZ2VzdCI7DQoJCQl9IGVs
c2Ugew0KCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVNZWRpdW0iOw0KCQkJfQ0KCQkJJHRh
Z19jbGFzcyAuPSAnIHRhZ1NpemUnIC4gKCR3ZWlnaHQgKyAxIC0gJG1pbik7DQoJCQlpZiAo
JHRhZyA9PSAkdGFnX3NlYXJjaF90YWcpIHsNCgkJCQkkdGFnX2NsYXNzIC49ICcgJyAuICRh
Y3RpdmVjbGFzczsNCgkJCX0NCgkJCSR0YWdfY2xhc3MgLj0gJyInOw0KCQl9DQoNCgkJLy9h
ZGFwdGVkIGZyb20gY29kZSBieSBnZHRyb2lhbm8sIHNlZSBodHRwOi8vZm9ydW0udGV4dHBh
dHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTEwMjg3NSNwMTAyODc1DQoJCSR0aXRsZWNv
dW50ID0gJyc7DQoJCWlmICgkdGl0bGUpDQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9Iicg
LiAkdGl0bGUgLiAnIic7DQoJCSRkaXNwbGF5Y291bnQ9ICcnOw0KCQkkY291bnQgPSAkY291
bnR3cmFwY2hhcnN7MH0gLiAkd2VpZ2h0IC4gJGNvdW50d3JhcGNoYXJzezF9Ow0KCQlpZiAo
JHNob3djb3VudHMgPT0gJ3RpdGxlJyB8fCAkc2hvd2NvdW50cyA9PSAnYm90aCcpDQoJCQkk
dGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAkY291bnQgLiAnIic7DQoJCWlm
ICgkc2hvd2NvdW50cyAmJiAkc2hvd2NvdW50cyAhPSAndGl0bGUnKQ0KCQkJJGRpc3BsYXlj
b3VudCA9ICcgJyAuICRjb3VudDsNCg0KCQlpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2NhcGl0
YWxpemUnKSB7DQoJCQkkdGFnID0gdHJ1X3RhZ3NfdWN3b3JkcygkdGFnKTsNCgkJfSBlbHNl
IGlmICgkdGV4dHRyYW5zZm9ybSA9PSAndXBwZXJjYXNlJykgew0KCQkJJHRhZyA9IHRydV90
YWdzX3N0cnRvdXBwZXIoJHRhZyk7DQoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0g
J2xvd2VyY2FzZScpIHsNCgkJCSR0YWcgPSB0cnVfdGFnc19zdHJ0b2xvd2VyKCR0YWcpOw0K
CQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdjYXBmaXJzdCcpIHsNCgkJCSR0YWcg
PSB0cnVfdGFnc191Y2ZpcnN0KCR0YWcpOw0KCQl9DQoNCgkJaWYgKCRnZW5lcmF0ZWxpbmtz
KSB7DQoJCQkkd2hvbGV1cmwgPSAnIicgLiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKCR0YWcp
IC4gJHVybHN1ZmZpeCAuICciJzsNCgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPScgLiAk
d2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQgLiAnPicgLiBo
dG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsNCgkJfSBl
bHNlIGlmICgkdGFnX2NsYXNzIHx8ICRzdHlsZSB8fCAkdGl0bGVjb3VudCkgew0KCQkJJHRh
Z3NfaHRtbFtdID0gJzxzcGFuJyAuICR0YWdfY2xhc3MgLiAkc3R5bGUgLiAkdGl0bGVjb3Vu
dCAuICc+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnPC9zcGFuPicgLiAkZGlzcGxh
eWNvdW50Ow0KCQl9IGVsc2Ugew0KCQkJJHRhZ3NfaHRtbFtdID0gaHRtbHNwZWNpYWxjaGFy
cygkdGFnKSAuICRkaXNwbGF5Y291bnQ7DQoJCX0NCgl9DQoJcmV0dXJuIHRydV90YWdzX2Rv
X3dyYXAoJHRhZ3NfaHRtbCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFz
cyk7DQp9DQoNCg0KIyMjIENMRUFOIFVSTCBGVU5DVElPTlMgIyMjDQojIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMNCg0KaWYgKHRydV90YWdzX2NsZWFuX3VybHMoKSkgew0KCXJlZ2lz
dGVyX2NhbGxiYWNrKCd0cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcicsICdwcmV0ZXh0Jywg
JycsIDApOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2NsZWFuX3VybF9oYW5kbGVyKCRl
dmVudCwgJHN0ZXApIHsNCglnbG9iYWwgJHByZXRleHQsICR0cnVfdGFnc19wcmVmczsNCg0K
CWlmICgkcHJldGV4dFswXSA+PSAyICYmICRwcmV0ZXh0WzFdID09ICR0cnVfdGFnc19wcmVm
c1tUQUdfU0VDVElPTl0tPnZhbHVlKSB7DQoJCSR0YWcgPSAkcHJldGV4dFsyXTsNCgkJaWYg
KGNvdW50KCRfUE9TVCkgPiAwKSB7DQoJCQkkX1BPU1RbJ3NlY3Rpb24nXSA9ICR0cnVfdGFn
c19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOw0KCQkJJF9QT1NUWyR0cnVfdGFnc19wcmVm
c1tQQVJNX05BTUVdLT52YWx1ZV0gPSAkdGFnOw0KCQl9IGVsc2Ugew0KCQkJJF9HRVRbJ3Nl
Y3Rpb24nXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOw0KCQkJJF9H
RVRbJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7DQoJCX0NCgkJ
JHByZXRleHRbJ3MnXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOw0K
CX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jbGVhbl91cmxzKCkgew0KCWdsb2JhbCAk
dHJ1X3RhZ3NfcHJlZnM7DQoJcmV0dXJuICgnY2xlYW4nID09ICR0cnVfdGFnc19wcmVmc1tD
TEVBTl9VUkxTXS0+dmFsdWUpOw0KfQ0KDQoNCiMjIyBBRE1JTiBTSURFIEZVTkNUSU9OUyAj
IyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KaWYgKEB0eHBpbnRlcmZhY2Ug
PT0gJ2FkbWluJykgew0KCWFkZF9wcml2cygndHJ1X3RhZ3MnLCAnMSwyJyk7DQoJcmVnaXN0
ZXJfdGFiKCdleHRlbnNpb25zJywgJ3RydV90YWdzJywgJ3RydV90YWdzJyk7DQoJcmVnaXN0
ZXJfY2FsbGJhY2soJ3RydV90YWdzX2FkbWluX3RhYicsICd0cnVfdGFncycpOw0KDQoJaWYg
KCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlIHx8ICR0cnVfdGFn
c19wcmVmc1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXS0+dmFsdWUpIHsNCgkJcmVnaXN0
ZXJfY2FsbGJhY2soJ3RydV90YWdzX2FkbWluX3dyaXRlX3RhYl9oYW5kbGVyJywgJ2FydGlj
bGVfdWknLCAna2V5d29yZHMnKTsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRt
aW5fdGFiKCRldmVudCwgJHN0ZXApIHsNCglyZXF1aXJlX3ByaXZzKCd0cnVfdGFncycpOw0K
DQoJJHJlc3VsdHMgPSB0cnVfdGFnc19hZG1pbl90YWJfaGFuZGxlX2lucHV0KCk7DQoNCgkk
YXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNl
LCBmYWxzZSwgdHJ1ZSk7DQoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0
dHMpOw0KCSRjbG91ZCA9IHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdz
LCAkYWxsX3RhZ3MpOw0KDQoJJHJlZGlyZWN0cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3Rz
KCk7DQoNCgl0cnVfdGFnc19hZG1pbl90YWJfcmVuZGVyX3BhZ2UoJHJlc3VsdHMsICRjbG91
ZCwgJHJlZGlyZWN0cyk7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX3Jl
bmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpIHsNCglnbG9iYWwgJGV2
ZW50Ow0KCXBhZ2V0b3AoJ3RydV90YWdzJywgJycpOw0KDQoJaW5jbHVkZV9vbmNlKHR4cGF0
aCAuICcvaW5jbHVkZS90eHBfcHJlZnMucGhwJyk7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVm
czsNCg0KCWVjaG8gc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+
PHRkIHN0eWxlPSJib3JkZXItcmlnaHQ6MnB4IHNvbGlkIGdyYXkiPicuICAjIEkga25vdywg
SSBrbm93Li4uDQoJCXN0YXJ0VGFibGUoJ2xheW91dCcsICcnLCAnJywgJycsICcxMHB4Jyku
Jzx0cj48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXkiPicuDQoJCQlz
dGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzMwMHB4JykuDQoJCQkJdHIoaENlbGwo
Z1R4dCgnQ3VycmVudCB0YWdzJykpKS4NCgkJCQl0cih0ZCgkY2xvdWQpKS4NCgkJCWVuZFRh
YmxlKCkuDQoJCSc8L3RkPjwvdHI+PHRyPjx0ZD4nLg0KCQkJc3RhcnRUYWJsZSgnbGlzdCcs
ICcnLCAnJywgJycsICczMDBweCcpLg0KCQkJCXRyKGhDZWxsKGdUeHQoJ3RydV90YWdzIFJl
ZmVyZW5jZScpKSkuDQoJCQkJdHIodGQoJzxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQu
Y29tL3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMiPlVzYWdlIGlu
c3RydWN0aW9uczwvYT4nLg0KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRw
YXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP2lkPTE1MDg0Ij5Gb3J1bSBwYWdlczwvYT4nLg0K
CQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzUz
Ny90cnVfdGFncy1yZWxlYXNlcyI+UmVsZWFzZXMgcGFnZTwvYT4nLg0KCQkJCSc8YnI+PGEg
aHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzU1NC90cnVfdGFncy1y
b2FkbWFwIj5SZWxlYXNlIHJvYWRtYXA8L2E+Jy4NCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6
Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS80OTUvdHJ1dGFncy1mZWF0dXJlLWxpc3Qi
PkZlYXR1cmUgbGlzdDwvYT4nLg0KCQkJCSc8YnI+PGJyPjxhIGhyZWY9Imh0dHBzOi8vZ2l0
aHViLmNvbS90cnVpc3QvdHJ1LXRhZ3MvYmxvYi9tYXN0ZXIvdHJ1X3RhZ3MucGhwIj50cnVf
dGFncyBzb3VyY2UgY29kZTwvYT4nLg0KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cHM6Ly9naXRo
dWIuY29tL3RydWlzdC90cnUtdGFncy9ibG9iL21hc3Rlci90cnVfdGFncy1kb2NzLmh0bWwi
PlNvdXJjZSBIVE1MIGZvciB0aGUgdXNhZ2UgaW5zdHJ1Y3Rpb25zPC9hPicuDQoJCQkJJzxi
cj48YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vYmxvZy80OTMvdHJ1dGFn
cy1hLXRhZ2dpbmctcGx1Z2luLWZvci10ZXh0cGF0dGVybiI+dHJ1X3RhZ3M8L2E+LCBieSA8
YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS8iPk5hdGhhbiBBcnRodXI8L2E+Jy4N
CgkJCQknPGJyPjxicj4nLg0KCQkJCSc8ZGl2IGlkPSJwYXlwYWwiPjxmb3JtIGFjdGlvbj0i
aHR0cHM6Ly93d3cucGF5cGFsLmNvbS9jZ2ktYmluL3dlYnNjciIgbWV0aG9kPSJwb3N0Ij48
aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjbWQiIHZhbHVlPSJfcy14Y2xpY2siIC8+PGlu
cHV0IHR5cGU9ImltYWdlIiBzcmM9Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vZW5fVVMvaS9i
dG4veC1jbGljay1idXQwNC5naWYiIG5hbWU9InN1Ym1pdCIgYWx0PSJNYWtlIGEgZG9uYXRp
b24gdG8gTmF0aGFuIEFydGh1ciIgLz48aW1nIGFsdD0iIiBib3JkZXI9IjAiIHNyYz0iaHR0
cHM6Ly93d3cucGF5cGFsLmNvbS9lbl9VUy9pL3Njci9waXhlbC5naWYiIHdpZHRoPSIxIiBo
ZWlnaHQ9IjEiIC8+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZW5jcnlwdGVkIiB2YWx1
ZT0iLS0tLS1CRUdJTiBQS0NTNy0tLS0tTUlJSFR3WUpLb1pJaHZjTkFRY0VvSUlIUURDQ0J6
d0NBUUV4Z2dFd01JSUJMQUlCQURDQmxEQ0JqakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05W
QkFnVEFrTkJNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBiaUJXYVdWM01SUXdFZ1lEVlFRS0V3
dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0ExVUVDeFFLYkdsMlpWOWpaWEowY3pFUk1BOEdBMVVF
QXhRSWJHbDJaVjloY0dreEhEQWFCZ2txaGtpRzl3MEJDUUVXRFhKbFFIQmhlWEJoYkM1amIy
MENBUUF3RFFZSktvWklodmNOQVFFQkJRQUVnWUM4aTFUMjdsaktmcE5URVFpMHdLSGNkR3Vs
eHhrTXF3ZENNbWJHdnM4N24vNFRzSnRpQXNxTW8yaHlzN1pzR3k1UkYvTzdzK0Iyb1E3NnpV
bFQ1MldXN1FlWFVLM0dwMG5yMmNQM2lvQlN0TnUrUlo2amthbTJFMEZHTFh5VjYrVU5WRU93
aDhsbW9JU1JvdHZTdklnUXlUTG5FZURIcUc5cXZVenF2RjNTcWpFTE1Ba0dCU3NPQXdJYUJR
QXdnY3dHQ1NxR1NJYjNEUUVIQVRBVUJnZ3Foa2lHOXcwREJ3UUlwbVBacmxyWmZabUFnYWll
UFZiK245c1Zkc3VmZ0dybUF3MnJYQXpSMzlrWXFQVUo3bjBMaU5EbWRBcTczSm9QNTNrWnk4
Z1Nwb3Z1Y0wyUzBqQzFzWHJjcEVMQXBMTDhCRlNIZmRMaVpvWlNWL0NZT3BwSDUrZHgyWXFG
SWR5Q0NkaklYN29PUGdReUF1Z1JhMlFyM2IreXV0dUcwREZzZCtMQUpHYjhsNENubnJibXdk
WUszTm5WREJQT214RU9qbFhVZ0V6bEZMWG1FM3c1K01vUEtRY3AybjhmZEpMc2dHMTV4b1ZQ
RnpDZC9LMmdnZ09ITUlJRGd6Q0NBdXlnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFE
Q0JqakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFrTkJNUll3RkFZRFZRUUhFdzFO
YjNWdWRHRnBiaUJXYVdWM01SUXdFZ1lEVlFRS0V3dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0Ex
VUVDeFFLYkdsMlpWOWpaWEowY3pFUk1BOEdBMVVFQXhRSWJHbDJaVjloY0dreEhEQWFCZ2tx
aGtpRzl3MEJDUUVXRFhKbFFIQmhlWEJoYkM1amIyMHdIaGNOTURRd01qRXpNVEF4TXpFMVdo
Y05NelV3TWpFek1UQXhNekUxV2pDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdU
QWtOQk1SWXdGQVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFLRXd0UVlY
bFFZV3dnU1c1akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0ExVUVBeFFJ
YkdsMlpWOWhjR2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVqYjIwd2da
OHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFNRkhUdDM4Uk14TFhKeU8yU21T
K05kbDcyVDdvS0o0dTR1dys2YXdudEFMV2gwM1Bld21JSnV6YkFMU2NzVFM0c1pvUzFmS2Np
QkdvaDExZ0lmSHp5bHZrZE5lL2hKbDY2L1JHcXJqNXJGYjA4c0FBQk5UekRUaXFxTnBKZUJz
WXMvYzJhaUdvenB0WDJSbG5Ca3RIK1NVTnBBYWpXNzI0TnYyV3ZoaWY2c0ZBZ01CQUFHamdl
NHdnZXN3SFFZRFZSME9CQllFRkphZmZMdkdieGU5V1Q5UzF3b2I3QkRXWkpSck1JRzdCZ05W
SFNNRWdiTXdnYkNBRkphZmZMdkdieGU5V1Q5UzF3b2I3QkRXWkpScm9ZR1VwSUdSTUlHT01R
c3dDUVlEVlFRR0V3SlZVekVMTUFrR0ExVUVDQk1DUTBFeEZqQVVCZ05WQkFjVERVMXZkVzUw
WVdsdUlGWnBaWGN4RkRBU0JnTlZCQW9UQzFCaGVWQmhiQ0JKYm1NdU1STXdFUVlEVlFRTEZB
cHNhWFpsWDJObGNuUnpNUkV3RHdZRFZRUURGQWhzYVhabFgyRndhVEVjTUJvR0NTcUdTSWIz
RFFFSkFSWU5jbVZBY0dGNWNHRnNMbU52YllJQkFEQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NT
cUdTSWIzRFFFQkJRVUFBNEdCQUlGZk9sYWFnRnJsNzEranE2T0tpZGJXRlNFK1E0RnFST3Zk
Z0lPTnRoKzhrU0svL1kvNGlodUU0WW12em41Y2VFM1MvaUJTUVFNanl2YitzMlRXYlFZRHdj
cDEyOU9QSWJEOWVwZHI0dEpPVU5pU29qdzdCSHdZUmlQaDU4UzF4R2xGZ0hGWHdyRUJiM2Rn
TmJNVWErdTRxZWN0c01BWHBWSG5EOXdJeWZtSE1ZSUJtakNDQVpZQ0FRRXdnWlF3Z1k0eEN6
QUpCZ05WQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlRXOTFiblJo
YVc0Z1ZtbGxkekVVTUJJR0ExVUVDaE1MVUdGNVVHRnNJRWx1WXk0eEV6QVJCZ05WQkFzVUNt
eHBkbVZmWTJWeWRITXhFVEFQQmdOVkJBTVVDR3hwZG1WZllYQnBNUnd3R2dZSktvWklodmNO
QVFrQkZnMXlaVUJ3WVhsd1lXd3VZMjl0QWdFQU1Ba0dCU3NPQXdJYUJRQ2dYVEFZQmdrcWhr
aUc5dzBCQ1FNeEN3WUpLb1pJaHZjTkFRY0JNQndHQ1NxR1NJYjNEUUVKQlRFUEZ3MHdPREEz
TURNd05ERTBNVEphTUNNR0NTcUdTSWIzRFFFSkJERVdCQlQwdGtqNGRaTGUvRTRRd2JpYjI5
WEVkSHhBWWpBTkJna3Foa2lHOXcwQkFRRUZBQVNCZ0w1SnNRSGpROVNnNFkzZURXS0RPMTZy
K3RmRXo0UllBRHQrNmg5ODFma1ZDeGZOSEZEeG9mRGN4eXpSTVlyN3k5NWNkblZpNEFOUXdN
VVk2eUpXNWptL0dEMTdyamdTeFpNRXZzQWU2WWNDU0xLNVphcEN3MXFseVNwUEdaQkEzTVR0
Nk9EK292Vm9hLzF2OENOc0VjSHA3ZjR0T3hPVVN3NVA0bkh5TFBXai0tLS0tRU5EIFBLQ1M3
LS0tLS0iPjwvZm9ybT48L2Rpdj4nDQoJCQkJKSkuDQoJCQllbmRUYWJsZSgpLg0KCQknPC90
ZD48L3RyPicuZW5kVGFibGUoKS4NCgknPC90ZD48dGQ+Jy4NCgkJc3RhcnRUYWJsZSgnbGF5
b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJw
eCBzb2xpZCBncmF5O3dpZHRoOjQwMHB4Ij4nOw0KDQoJCWlmICgkcmVzdWx0cykgew0KCQkJ
ZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4NCgkJCQl0ciho
Q2VsbChnVHh0KCdSZXN1bHRzJykpKS4NCgkJCQl0cih0ZGEoJHJlc3VsdHMpLCAnIHN0eWxl
PSJjb2xvcjpyZWQiJykuDQoJCQllbmRUYWJsZSgpOw0KCQkJZWNobyAnPC90ZD48L3RyPjx0
cj48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXkiPic7DQoJCX0NCg0K
DQoJCWVjaG8gc3RhcnRUYWJsZSgnbGlzdCcsICcnLCAnJywgJycsICcxMDAlJykuDQoJCQl0
cih0YWcoZ1R4dCgnQXJ0aWNsZSBUYWcgTWFpbnRlbmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2Ug
U2Vuc2l0aXZlJykuJyEpJywgJ3RoJywgJyBjb2xzcGFuPSI1IicpKS4NCgkJCXRyKA0KCQkJ
CWZvcm0oDQoJCQkJCXRkYShnVHh0KCdSZW5hbWUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNh
bC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoJ21hdGNodGFnJywgJycs
ICcxNScpKS4NCgkJCQkJdGRhKGdUeHQoJ3RvJykuJzonLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1h
bGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoJ3JlcGxhY2V0YWcnLCAnJywg
JzE1JykpLg0KCQkJCQl0ZChmSW5wdXQoJ3N1Ym1pdCcsICdyZXBsYWNlJywgZ1R4dCgnUnVu
JyksICdwdWJsaXNoJykuZUlucHV0KCd0cnVfdGFncycpKSwNCgkJCQkJJycsICcgdmVyaWZ5
KFwnJyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInDQoJCQkJKQ0KCQkJKS4NCgkJ
CXRyKA0KCQkJCWZvcm0oDQoJCQkJCXRkYShnVHh0KCdEZWxldGUnKS4nOiAnLCAnIHN0eWxl
PSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoJ2RlbGV0
ZXRhZycsICcnLCAnMTUnKSkuDQoJCQkJCXRkY3MoJycsIDIpLg0KCQkJCQl0ZChmSW5wdXQo
J3N1Ym1pdCcsICdkZWxldGUnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3Ry
dV90YWdzJykpLA0KCQkJCQknJywgJyB2ZXJpZnkoXCcnIC4gZ1R4dCgnYXJlX3lvdV9zdXJl
JykgLiAnXCcpIicNCgkJCQkpDQoJCQkpLg0KCQllbmRUYWJsZSgpOw0KDQoJZWNobyAnPC90
ZD48L3RyPjx0cj48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXkiPic7
DQoNCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4NCgkJ
CXRyKHRhZyhnVHh0KCdSZWRpcmVjdGlvbnMnKSwgJ3RoJywgJyBjb2xzcGFuPSI0IicpKTsN
CgkJCWZvcmVhY2ggKCRyZWRpcmVjdHMgYXMgJGxlZnR0YWcgPT4gJHJpZ2h0dGFnKSB7DQoJ
CQkJZWNobyB0cigNCgkJCQkJdGRhKGhyZWYoJGxlZnR0YWcsIHRydV90YWdzX2xpbmtpZnlf
dGFnKCRsZWZ0dGFnKSksICcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciInKS4NCgkJCQkJ
dGRhKGh0bWxzcGVjaWFsY2hhcnMoJz0+JyksICcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRl
ciInKS4NCgkJCQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVfdGFnc19saW5raWZ5X3RhZygk
cmlnaHR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLg0KCQkJCQl0ZCgn
PGEgaHJlZj0iaW5kZXgucGhwP2V2ZW50PXRydV90YWdzJmFtcDtkZWxldGVfcmVkaXJlY3Q9
Jy51cmxlbmNvZGUoJGxlZnR0YWcpLiciICBvbmNsaWNrPSJyZXR1cm4gdmVyaWZ5KFwnJy5n
VHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj5EZWxldGU8L2E+JykNCgkJCQkpOw0KCQkJfQ0K
CQkJZWNobyB0cigNCgkJCQknPGZvcm0gbmFtZT0icmVkaXJlY3QiIGlkPSJyZWRpcmVjdCIg
bWV0aG9kPSJwb3N0IiBhY3Rpb249ImluZGV4LnBocD9ldmVudD10cnVfdGFncyIgb25zdWJt
aXQ9InJldHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPicuDQoJ
CQkJCXRkYSh0ZXh0X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0
LWFsaWduOmNlbnRlciInKS4NCgkJCQkJdGRhKGh0bWxzcGVjaWFsY2hhcnMoJz0+JyksICcg
c3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZTt0ZXh0LWFsaWduOmNlbnRlciInKS4NCgkJ
CQkJdGRhKHRleHRfaW5wdXQoJ3JpZ2h0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0
LWFsaWduOmNlbnRlciInKS4NCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBvbmNsaWNrPSJpZiAo
dmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZChcJ3JlZGlyZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7Ij5BZGQgbmV3
PC9hPicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJZklucHV0
KCdoaWRkZW4nLCAncmVkaXJlY3QnLCAnMScpLg0KCQkJCSc8L2Zvcm0+Jw0KDQoJCQkpLg0K
CQllbmRUYWJsZSgpOw0KDQoJZWNobyAnPC90ZD48L3RyPjx0cj48dGQ+JzsNCg0KCQllY2hv
IHN0YXJ0VGFibGUoJ2xpc3QnKS4NCgkJCXRyKHRhZyhnVHh0KCdQcmVmZXJlbmNlcycpLCAn
dGgnLCAnIGNvbHNwYW49IjIiJykpLg0KCQkJZm9ybSgNCgkJCQl0cigNCgkJCQkJdGRhKGdU
eHQoJ1VzZSBjbGVhbiBVUkxzJykuJyAoJy5nVHh0KCdzaXRlIGRlZmF1bHQgaXMnKS4nICcu
JHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT5kZWZhdWx0X3ZhbHVlLicpOiAnLCAnIHN0
eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHJhZGlvX2xpc3QoQ0xF
QU5fVVJMUywNCgkJCQkJCQlhcnJheSgnY2xlYW4nPT5nVHh0KCdjbGVhbicpLCAnbWVzc3kn
PT5nVHh0KCdtZXNzeScpKSwNCgkJCQkJCQkkdHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10t
PnZhbHVlKSkNCgkJCQkpLg0KCQkJCXRyKA0KCQkJCQl0ZGEoZ1R4dCgnVGFnIHNlY3Rpb24g
bmFtZScpLicgKGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+
ZGVmYXVsdF92YWx1ZS4nIik6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSIn
KS4NCgkJCQkJdGQodGV4dF9pbnB1dChUQUdfU0VDVElPTiwgJHRydV90YWdzX3ByZWZzW1RB
R19TRUNUSU9OXS0+dmFsdWUsICcxNScpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJCXRkYShn
VHh0KCdVUkwgcGFyYW1ldGVyIGZvciB0YWcgc2VhcmNoJykuJyAoZGVmYXVsdCBpcyAiJy4k
dHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+ZGVmYXVsdF92YWx1ZS4nIik6ICcuDQoJCQkJ
CQknPGJyPjxlbT4oeW91IHNob3VsZG5cJ3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSByZWFs
bHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcpPC9lbT4nLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1h
bGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoUEFSTV9OQU1FLCAkdHJ1X3Rh
Z3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUsICcxNScpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJ
CQkJCXRkYShnVHh0KCdQdXQgdGFncyBpbnRvIFJTUy9BdG9tIGZlZWRzLCBpbiAiQ2F0ZWdv
cnkiIGVsZW1lbnRzJykuDQoJCQkJCQknOiA8YnI+PGVtPih5b3UgcHJvYmFibHkgd2FudCB0
aGlzKTwvZW0+JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0
ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9DQVRFR09SSUVTLCAkdHJ1X3RhZ3NfcHJlZnNb
VEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkpDQoJCQkJKS4NCgkJCQl0cigNCgkJ
CQkJdGRhKCdBcHBlbmQgdGhlIHRhZyBsaXN0IHRvIHRoZSBib2R5IG9mIFJTUy9BdG9tIGZl
ZWRzLCAnLg0KCQkJCQkJJ3dpdGggbGlua3MsIGFuZCB3aXRoIHJlbD0idGFnIjonLg0KCQkJ
CQkJJzxicj48ZW0+KGlmIHRoaXMgaXMgdHVybmVkIG9uLCcuDQoJCQkJCQkneW91IGNhbiBk
ZWZpbmUgYSAibWlzYyIgZm9ybSBuYW1lZCB0cnVfdGFnc19mZWVkX3RhZ3MgJy4NCgkJCQkJ
CSd0aGF0IHdpbGwgYmUgdXNlZCB0byByZW5kZXIgdGhlIHRhZ3MgaW4gdGhlIGZlZWQpPC9l
bT4nLA0KCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0
ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9CT0RZLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19J
Tl9GRUVEX0JPRFldLT52YWx1ZSkpDQoJCQkJKS4NCgkJCQl0cigNCgkJCQkJdGRhKGdUeHQo
J1Nob3cgYSBjbGlja2FibGUgbGlzdCBvZiB0YWdzIG9uIHRoZSAiV3JpdGUiIHBhZ2UnKS4n
OiAnLA0KCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0
ZCh5ZXNub1JhZGlvKFRBR1NfSU5fV1JJVEVfVEFCLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19J
Tl9XUklURV9UQUJdLT52YWx1ZSkpDQoJCQkJKS4NCgkJCQl0cigNCgkJCQkJdGRhKGdUeHQo
J0F1dG9jb21wbGV0ZSB0YWdzIG9uIHRoZSAiV3JpdGUiIHBhZ2UnKS4nOiA8YnI+Jy4NCgkJ
CQkJCSc8ZW0+KHlvdSBjYW4gYWRqdXN0IHRoZSBhcHBlYXJhbmNlIHZpYSA8Y29kZT5jc3Mv
anF1ZXJ5LXVpLmNzczwvY29kZT4pPC9lbT4nLA0KCQkJCQkJJyBzdHlsZT0idmVydGljYWwt
YWxpZ246bWlkZGxlIicpLg0KCQkJCQl0ZCh5ZXNub1JhZGlvKEFVVE9DT01QTEVURV9JTl9X
UklURV9UQUIsICR0cnVfdGFnc19wcmVmc1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXS0+
dmFsdWUpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJCXRkYShnVHh0KCdDb252ZXJ0IHRhZ3Mg
dG8gbG93ZXJjYXNlIGJ5IGRlZmF1bHQnKS4nOiA8YnI+Jy4NCgkJCQkJCSc8ZW0+KHlvdSBw
cm9iYWJseSB3YW50IHRoaXMsIHVubGVzcyB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyB3aXRo
IHV0Zi04IGNoYXJhY3RlcnMpPC9lbT4nLA0KCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxp
Z246bWlkZGxlIicpLg0KCQkJCQl0ZCh5ZXNub1JhZGlvKFVURl84X0NBU0UsICR0cnVfdGFn
c19wcmVmc1tVVEZfOF9DQVNFXS0+dmFsdWUpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJCXRk
KCcnKS4NCgkJCQkJdGRhKGZJbnB1dCgnc3VibWl0JywgJ3ByZWZzJywgZ1R4dCgnU2F2ZScp
LCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSwgJyBzdHlsZT0idGV4dC1hbGlnbjpy
aWdodCInKQ0KCQkJCSksDQoJCQkJJycsICcgdmVyaWZ5KFwnJyAuIGdUeHQoJ2FyZV95b3Vf
c3VyZScpIC4gJ1wnKSInDQoJCQkpLg0KCQllbmRUYWJsZSgpLic8L3RkPjwvdHI+Jy4NCgkJ
ZW5kVGFibGUoKTsNCg0KCWVjaG8gJzwvdGQ+PC90cj4nLmVuZFRhYmxlKCk7DQp9DQoNCg0K
ZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX2hhbmRsZV9pbnB1dCgpIHsNCglpZiAoZ3Bz
KCdwcmVmcycpKSB7DQoJCXJldHVybiB0cnVfdGFnc19hZG1pbl91cGRhdGVfcHJlZnMoKTsN
Cgl9IGVsc2UgaWYgKGdwcygnZGVsZXRlJykpIHsNCgkJcmV0dXJuIHRydV90YWdzX2FkbWlu
X2RlbGV0ZV90YWcoZ3BzKCdkZWxldGV0YWcnKSk7DQoJfSBlbHNlIGlmIChncHMoJ3JlcGxh
Y2UnKSkgew0KCQkkcmVzdWx0ID0gdHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoZ3BzKCdt
YXRjaHRhZycpLCBncHMoJ3JlcGxhY2V0YWcnKSwgZmFsc2UpOw0KCQlyZXR1cm4gJHJlc3Vs
dCAuICc8YnI+JyAuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ21hdGNodGFn
JyksIGdwcygncmVwbGFjZXRhZycpKTsNCgl9IGVsc2UgaWYgKGdwcygncmVkaXJlY3QnKSkg
ew0KCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3RfdGFnKGdwcygnbGVmdHRhZycp
LCBncHMoJ3JpZ2h0dGFnJykpOw0KCX0gZWxzZSBpZiAoZ3BzKCdkZWxldGVfcmVkaXJlY3Qn
KSkgew0KCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0KGdwcygnZGVs
ZXRlX3JlZGlyZWN0JykpOw0KCX0gZWxzZSB7DQoJCXJldHVybiAnJzsNCgl9DQp9DQoNCg0K
ZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdXBkYXRlX3ByZWZzKCkgew0KCWdsb2JhbCAkdHJ1
X3RhZ3NfcHJlZnM7DQoJJHJlc3VsdHMgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0cnVfdGFn
c19wcmVmcyBhcyAkcHJlZikgew0KCQkkdmFsaWRfdmFsdWUgPSAkcHJlZi0+dmFsaWRhdGVf
dmFsdWUoZ3BzKCRwcmVmLT5uYW1lKSk7DQoJCWlmICgkdmFsaWRfdmFsdWUgJiYgJHZhbGlk
X3ZhbHVlIDw+IGdwcygkcHJlZi0+bmFtZSkpIHsNCgkJCXJldHVybiAkdmFsaWRfdmFsdWU7
ICAjIyMgdGhpcyBpcyBhIHNuZWFreSB3YXkgdG8gaGFuZGxlIHZhbGlkYXRpb24gLSBzb3Jy
eSA7KQ0KCQl9DQoJCWlmICgkdmFsaWRfdmFsdWUgPD4gJHByZWYtPnZhbHVlKSB7DQoJCQlp
ZiAoJHZhbGlkX3ZhbHVlID09ICRwcmVmLT5kZWZhdWx0X3ZhbHVlKSB7DQoJCQkJJHJlc3Vs
dCA9IHRydV90YWdzX2RlbGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsNCgkJCX0gZWxzZSB7DQoJ
CQkJJHJlc3VsdCA9IHRydV90YWdzX3Vwc2VydF9wcmVmKCRwcmVmLT5uYW1lLCAkdmFsaWRf
dmFsdWUpOw0KCQkJfQ0KCQkJaWYgKCRyZXN1bHQpIHsNCgkJCQkkcmVzdWx0c1tdID0gJ1Vw
ZGF0ZWQgJyAuICRwcmVmLT5uYW1lOw0KCQkJCSRwcmVmLT52YWx1ZSA9ICR2YWxpZF92YWx1
ZTsNCgkJCX0gZWxzZSB7DQoJCQkJJHJlc3VsdHNbXSA9ICdFcnJvciB1cGRhdGluZyAnIC4g
JHByZWYtPm5hbWU7DQoJCQl9DQoJCX0NCgl9DQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9PSAw
KSB7DQoJCXJldHVybiAnTm8gcmVjb3JkcyBuZWVkIHVwZGF0aW5nJzsNCgl9IGVsc2Ugew0K
CQlyZXR1cm4gam9pbignPGJyPicsICRyZXN1bHRzKTsNCgl9DQp9DQoNCg0KZnVuY3Rpb24g
dHJ1X3RhZ3NfdXBzZXJ0X3ByZWYoJG5hbWUsICR2YWx1ZSkgew0KCWlmICghc2FmZV9xdWVy
eSgnY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19w
cmVmcycpLg0KCQknIChuYW1lIHZhcmNoYXIoMjU1KSBwcmltYXJ5IGtleSwgJy4NCgkJJ3Zh
bHVlIHZhcmNoYXIoMjU1KSBub3QgbnVsbCknKSkgew0KCQlyZXR1cm4gJ1NlcmlvdXMgZXJy
b3IgLSB1bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3ByZWZz
JykgLiAnIHRhYmxlLic7DQoJfQ0KDQoJcmV0dXJuIHNhZmVfdXBzZXJ0KCd0cnVfdGFnc19w
cmVmcycsICd2YWx1ZT0iJy4kdmFsdWUuJyInLCAnbmFtZT0iJy4kbmFtZS4nIicpOw0KfQ0K
DQoNCmZ1bmN0aW9uIHRydV90YWdzX2RlbGV0ZV9wcmVmKCRuYW1lKSB7DQoJaWYgKHNhZmVf
ZGVsZXRlKCd0cnVfdGFnc19wcmVmcycsICduYW1lPSInLiRuYW1lLiciJykpIHsNCgkJaWYg
KHNhZmVfY291bnQoJ3RydV90YWdzX3ByZWZzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5
KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSkpIHsNCgkJCXJl
dHVybiBmYWxzZTsNCgkJfQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4g
ZmFsc2U7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX2RlbGV0ZV90YWco
JGRlbGV0ZXRhZykgew0KCWlmICh0cmltKCRkZWxldGV0YWcpKSB7DQoJCXJldHVybiB0cnVf
dGFnc19hZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRldGFnLCAnJywgdHJ1ZSk7DQoJfSBlbHNl
IHsNCgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSc7DQoJfQ0KfQ0KDQoNCmZ1bmN0
aW9uIHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKCRtYXRjaHRhZywgJHJlcGxhY2V0YWcs
ICRhbGxvd19ibGFua19yZXBsYWNldGFnKSB7DQoJJG1hdGNodGFnID0gdHJpbSgkbWF0Y2h0
YWcpOw0KCSRyZXBsYWNldGFnID0gdHJpbSgkcmVwbGFjZXRhZyk7DQoJaWYgKCRtYXRjaHRh
ZyAmJiAoJGFsbG93X2JsYW5rX3JlcGxhY2V0YWcgfHwgJHJlcGxhY2V0YWcpKSB7DQoJCWlm
IChzYWZlX3VwZGF0ZSgndGV4dHBhdHRlcm4nLCBUUlVfVEFHU19GSUVMRC4nPXRyaW0oYm90
aCBcJyxcJyBmcm9tIHJlcGxhY2UoY29uY2F0KCIsIiwgJy5UUlVfVEFHU19GSUVMRC4nLCAi
LCIpLCBjb25jYXQoIiwiLCBcJycuYWRkc2xhc2hlcygkbWF0Y2h0YWcpLidcJywgIiwiKSwg
XCcsJy5hZGRzbGFzaGVzKCRyZXBsYWNldGFnKS4nLFwnKSknLCAnMScpKSB7DQoJCQlyZXR1
cm4gJ1VwZGF0ZWQgJy5teXNxbGlfYWZmZWN0ZWRfcm93cygpLicgcm93cyAoIicuaHRtbHNw
ZWNpYWxjaGFycygkbWF0Y2h0YWcpLiciPT4iJy5odG1sc3BlY2lhbGNoYXJzKCRyZXBsYWNl
dGFnKS4nIiknOw0KCQl9IGVsc2Ugew0KCQkJcmV0dXJuICdFcnJvcjogJyAuIG15c3FsaV9l
cnJvcigpOw0KCQl9DQoJfSBlbHNlIHsNCgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1
ZSBpbiBib3RoIGZpZWxkcyc7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FkbWlu
X3JlZGlyZWN0X3RhZygkbGVmdHRhZywgJHJpZ2h0dGFnKSB7DQoJJGxlZnR0YWcgPSBhZGRz
bGFzaGVzKHRydV90YWdzX3N0cnRvbG93ZXIodHJpbSgkbGVmdHRhZykpKTsNCgkkcmlnaHR0
YWcgPSBhZGRzbGFzaGVzKHRydV90YWdzX3N0cnRvbG93ZXIodHJpbSgkcmlnaHR0YWcpKSk7
DQoJaWYgKCEkbGVmdHRhZyB8fCAhJHJpZ2h0dGFnKSB7DQoJCXJldHVybiAnUGxlYXNlIGVu
dGVyIGEgdmFsdWUgaW4gYm90aCBmaWVsZHMnOw0KCX0NCg0KCWlmICghc2FmZV9xdWVyeSgn
Y3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRp
cmVjdHMnKS4NCgkJJyAobGVmdHRhZyB2YXJjaGFyKDI1NSkgcHJpbWFyeSBrZXksICcuDQoJ
CSdyaWdodHRhZyB2YXJjaGFyKDI1NSkgbm90IG51bGwpJykpIHsNCgkJcmV0dXJuICdTZXJp
b3VzIGVycm9yIC0gdW5hYmxlIHRvIGNyZWF0ZSB0aGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFn
c19yZWRpcmVjdHMnKSAuICcgdGFibGUuJzsNCgl9DQoNCglpZiAoc2FmZV9pbnNlcnQoJ3Ry
dV90YWdzX3JlZGlyZWN0cycsICdsZWZ0dGFnPSInLiRsZWZ0dGFnLiciLHJpZ2h0dGFnPSIn
LiRyaWdodHRhZy4nIicpKSB7DQoJCXJldHVybiAnUmVkaXJlY3QgYWRkZWQgKCInLmh0bWxz
cGVjaWFsY2hhcnMoJGxlZnR0YWcpLiciPT4iJy5odG1sc3BlY2lhbGNoYXJzKCRyaWdodHRh
ZykuJyIpIC0gcGxlYXNlIHRlc3QgaXQhJzsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gJ0Vycm9y
IGFkZGluZyByZWNvcmQgLSBkb2VzIGl0IGFscmVhZHkgZXhpc3Q/JzsNCgl9DQp9DQoNCg0K
ZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0KCRsZWZ0dGFnKSB7DQoJ
aWYgKHNhZmVfZGVsZXRlKCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnbGVmdHRhZz0iJy5hZGRz
bGFzaGVzKCRsZWZ0dGFnKS4nIicpKSB7DQoJCWlmIChzYWZlX2NvdW50KCd0cnVfdGFnc19y
ZWRpcmVjdHMnLCAnMScpID09IDAgJiYgIXNhZmVfcXVlcnkoJ2Ryb3AgdGFibGUgJyAuIHNh
ZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKSkpIHsNCgkJCXJldHVybiAnUmVkaXJlY3Qg
ZGVsZXRlZCwgYnV0IHVuYWJsZSB0byBkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3Rh
Z3NfcmVkaXJlY3RzJyk7DQoJCX0NCgkJcmV0dXJuICdSZWRpcmVjdCBkZWxldGVkICgiJy5o
dG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIiknOw0KCX0gZWxzZSB7DQoJCXJldHVybiAn
RXJyb3IgZGVsZXRpbmcgcmVkaXJlY3QnOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFn
c19hZG1pbl93cml0ZV90YWJfaGFuZGxlcigkZXZlbnQsICRzdGVwLCAkZGF0YSkgew0KCWds
b2JhbCAkdHJ1X3RhZ3NfcHJlZnMsJHJhd19jbG91ZDsNCgkkYXR0cyA9IHRydV90YWdzX2dl
dF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIHRydWUsIHRydWUsIHRydWUpOw0KCSRj
bG91ZCA9IGFycmF5X3VuaXF1ZSh0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cykpOw0KCW5h
dGNhc2Vzb3J0KCRjbG91ZCk7DQoNCgkkaWQgPSAoZW1wdHkoJEdMT0JBTFNbJ0lEJ10pID8g
Z3BzKCdJRCcpIDogJEdMT0JBTFNbJ0lEJ10pOw0KCSRhcnRpY2xlX3RhZ3MgPSAoZW1wdHko
JGlkKSA/IGFycmF5KCkgOiB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkaWQpKTsN
Cg0KCSRsaW5rcyA9IGFycmF5KCk7DQoJJHJhd19jbG91ZCA9ICcnOw0KCWZvcmVhY2ggKCRj
bG91ZCBhcyAkdGFnKSB7DQoJCSRzdHlsZSA9IChpbl9hcnJheSgkdGFnLCAkYXJ0aWNsZV90
YWdzKSA/ICcgY2xhc3M9InRhZ19jaG9zZW4iJyA6ICcnKTsNCgkJJGxpbmtzW10gPSAnPGEg
aHJlZj0iI2FkdmFuY2VkIicuJHN0eWxlLicgb25jbGljaz0idG9nZ2xlQ2xhc3ModGhpcywg
dG9nZ2xlVGFnKFxcXCcnLmFkZHNsYXNoZXMoYWRkc2xhc2hlcyhodG1sc3BlY2lhbGNoYXJz
KCR0YWcpKSkuJ1xcXCcpKTsgcmV0dXJuIGZhbHNlOyI+JyAuIGFkZHNsYXNoZXMoaHRtbHNw
ZWNpYWxjaGFycygkdGFnKSkgLiAnPFwvYT4nOw0KCQkkcmF3X2Nsb3VkIC49ICciJyAuIGFk
ZFNsYXNoZXMoJHRhZykgLiAnIiwnOw0KCX0NCgkkcmF3X2Nsb3VkID0gc3Vic3RyKCRyYXdf
Y2xvdWQsIDAsIHN0cmxlbigkcmF3X2Nsb3VkKSAtIDEpOw0KCSR0b19pbnNlcnQgPSBqb2lu
KCcsICcsICRsaW5rcyk7DQoNCglpZiAoJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fV1JJVEVf
VEFCXS0+dmFsdWUpIHsNCgkJJGpzID0gPDw8RU9GDQoJCQl2YXIga2V5d29yZHNGaWVsZCA9
IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXl3b3JkcycpOw0KCQkJa2V5d29yZHNGaWVs
ZC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JyJykp
Ow0KCQkJdmFyIGNsb3VkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KCQkJ
a2V5d29yZHNGaWVsZC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGNsb3VkKTsNCgkJCWNsb3Vk
LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAndHJ1X3RhZ3NfYWRtaW5fdGFncycpOw0KCQkJY2xv
dWQuaW5uZXJIVE1MID0gJ3skdG9faW5zZXJ0fSc7DQoNCgkJCXZhciBzdHlsZUVsZW1lbnQg
PSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOw0KCQkJc3R5bGVFbGVtZW50LnNl
dEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2NzcyIpOw0KCQkJdmFyIHN0eWxlVGV4dCA9ICdh
LnRhZ19jaG9zZW57YmFja2dyb3VuZC1jb2xvcjogI0ZFQjsgY29sb3I6IGJsYWNrO30nOw0K
CQkJaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7IC8vSUUNCgkJCQlzdHlsZUVsZW1l
bnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gc3R5bGVUZXh0Ow0KCQkJfSBlbHNlIHsNCgkJCQl2
YXIgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHlsZVRleHQpOw0KCQkJ
CXN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7DQoJCQl9DQoJCQl2YXIgaGVh
ZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOw0K
CQkJaGVhZEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTsNCg0KCQkJZnVuY3Rp
b24gdG9nZ2xlVGFnKHRhZ05hbWUpIHsNCgkJCQl2YXIgcmVnZXhUYWcgPSB0YWdOYW1lLnJl
cGxhY2UoLyhbXFxcXFxeXFwkKitbXFxdP3t9Lj0hOih8KV0pL2csIlxcXFwkMSIpOw0KCQkJ
CXZhciB0YWdSZWdleCA9IG5ldyBSZWdFeHAoIigoXnwsKVxcXHMqKSIgKyByZWdleFRhZyAr
ICJcXFxzKigsXFxccyp8JCkiKTsNCgkJCQl2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRF
bGVtZW50QnlJZCgna2V5d29yZHMnKTsNCgkJCQl2YXIgY3VydmFsID0gdGV4dGFyZWEudmFs
dWUucmVwbGFjZSgvLD9ccyskLywgJycpOw0KCQkJCWlmICgnJyA9PSBjdXJ2YWwpIHsNCgkJ
CQkJdGV4dGFyZWEudmFsdWUgPSB0YWdOYW1lOw0KCQkJCX0gZWxzZSBpZiAoY3VydmFsLm1h
dGNoKHRhZ1JlZ2V4KSkgew0KCQkJCQl0ZXh0YXJlYS52YWx1ZSA9IGN1cnZhbC5yZXBsYWNl
KHRhZ1JlZ2V4LCAnJDEnKS5yZXBsYWNlKC8sP1xzKyQvLCAnJyk7DQoJCQkJCXJldHVybiAn
JzsNCgkJCQl9IGVsc2UgaWYgKCcsJyA9PSBjdXJ2YWwuY2hhckF0KGN1cnZhbC5sZW5ndGgg
LSAxKSkgew0KCQkJCQl0ZXh0YXJlYS52YWx1ZSArPSAnICcgKyB0YWdOYW1lOw0KCQkJCX0g
ZWxzZSB7DQoJCQkJCXRleHRhcmVhLnZhbHVlICs9ICcsICcgKyB0YWdOYW1lOw0KCQkJCX0N
CgkJCQlyZXR1cm4gJ3RhZ19jaG9zZW4nOw0KCQkJfQ0KDQoJCQlmdW5jdGlvbiB0b2dnbGVD
bGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHsNCgkJCQllbGVtZW50LnNldEF0dHJpYnV0ZSgn
Y2xhc3MnLCBjbGFzc05hbWUpOw0KCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzc05h
bWUnLCBjbGFzc05hbWUpOyAvKiBmb3IgSUUgKi8NCgkJCX0NCkVPRjsNCgkJcmV0dXJuICRk
YXRhIC4gc2NyaXB0X2pzKCRqcyk7DQoJfQ0KDQoJaWYgKCR0cnVfdGFnc19wcmVmc1tBVVRP
Q09NUExFVEVfSU5fV1JJVEVfVEFCXS0+dmFsdWUpIHsNCg0KCQlyZWdpc3Rlcl9jYWxsYmFj
aygndHJ1X3RhZ3NfYWRtaW5fd3JpdGVfdGFiX2JvZHllbmQnLCAnYWRtaW5fc2lkZScsICdi
b2R5X2VuZCcpOw0KDQogICAgICAgICAgICAgICAgZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5f
d3JpdGVfdGFiX2JvZHllbmQgKCRldmVudCwgJHN0ZXApIHsNCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgZ2xvYmFsICRyYXdfY2xvdWQ7DQoNCiAgICAgICAgICAgICAgICAgICAgICAg
ICAgJG91dHB1dD0nPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJl
Zj0iLi4vY3NzL2pxdWVyeS11aS5jc3MiIG1lZGlhPSJwcm9qZWN0aW9uLCBzY3JlZW4iIC8+
DQogICAgICAgICAJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiB0eXBlPSJ0ZXh0
L2phdmFzY3JpcHQiPjwhLS0NCiAgICAgICAgICAJCQkJJChkb2N1bWVudCkucmVhZHkoZnVu
Y3Rpb24oKXsgDQogICAgICAgICAgCQkJCSAgICB2YXIgYXZhaWxhYmxlVGFncyA9IFsnLiRy
YXdfY2xvdWQuJ107DQogICAgICAgICAgCQkJCSAgICBmdW5jdGlvbiBzcGxpdCggdmFsICkg
eyByZXR1cm4gdmFsLnNwbGl0KCAvLFxzKi8gKTsgfQ0KICAgICAgICAgIAkJCQkgICAgZnVu
Y3Rpb24gZXh0cmFjdExhc3QoIHRlcm0gKSB7IHJldHVybiBzcGxpdCggdGVybSApLnBvcCgp
OyB9DQogICAgICAgICAgCQkJCSAgICAkKCIja2V5d29yZHMiKS5hdXRvY29tcGxldGUoeyBt
aW5MZW5ndGg6IDMsIGRlbGF5OiA1MDAsDQogICAgICAgICAgCQkJCSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uKCByZXF1ZXN0LCByZXNwb25z
ZSApIHsNCiAgICAgICAgICAJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAvLyBkZWxlZ2F0ZSBiYWNrIHRvIGF1dG9jb21wbGV0ZSwgYnV0IGV4dHJh
Y3QgdGhlIGxhc3QgdGVybQ0KICAgICAgICAgIAkJCQkgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlKCAkLnVpLmF1dG9jb21wbGV0ZS5maWx0
ZXIoDQogICAgICAgICAgCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBhdmFpbGFibGVUYWdzLCBleHRyYWN0TGFzdCggcmVxdWVzdC50ZXJtICkg
KSApOw0KICAgICAgICAgIAkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9LA0KICAgICAgICAgIAkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBmb2N1czogZnVuY3Rpb24oKSB7DQogICAgICAgICAgCQkJCSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudCB2YWx1
ZSBpbnNlcnRlZCBvbiBmb2N1cw0KICAgICAgICAgIAkJCQkgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAJCQkJ
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwNCiAgICAgICAg
ICAJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0
OiBmdW5jdGlvbiggZXZlbnQsIHVpICkgew0KICAgICAgICAgIAkJCQkgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXJtcyA9IHNwbGl0KCB0aGlz
LnZhbHVlICk7DQogICAgICAgICAgCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBjdXJyZW50IGlucHV0DQogICAgICAgICAg
CQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMu
cG9wKCk7DQogICAgICAgICAgCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgLy8gYWRkIHRoZSBzZWxlY3RlZCBpdGVtDQogICAgICAgICAgCQkJCSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMucHVzaCgg
dWkuaXRlbS52YWx1ZSApOw0KICAgICAgICAgIAkJCQkgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBwbGFjZWhvbGRlciB0byBnZXQgdGhlIGNv
bW1hLWFuZC1zcGFjZSBhdCB0aGUgZW5kDQogICAgICAgICAgCQkJCSAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMucHVzaCggIiIgKTsNCiAgICAg
ICAgICAJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0
aGlzLnZhbHVlID0gdGVybXMuam9pbiggIiwgIiApOw0KICAgICAgICAgIAkJCQkgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAg
ICAgICAgICAJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19KTsNCiAg
ICAgICAgIAkJCQl9KTsNCiAgICAgICAgICAgIAkJCS8vLS0+PC9zY3JpcHQ+JzsNCiAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGVjaG8gbi4kb3V0cHV0Lm47DQogICAgICAgICAgICAg
ICAgCX0NCg0KICAgICAgICB9DQoNCn0NCg0KDQojIyMgQVRPTS9SU1MgRkVFRCBGVU5DVElP
TlMgIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCnJlZ2lzdGVyX2Nh
bGxiYWNrKCd0cnVfdGFnc19hdG9tX2hhbmRsZXInLCAnYXRvbV9lbnRyeScpOw0KZnVuY3Rp
b24gdHJ1X3RhZ3NfYXRvbV9oYW5kbGVyKCRldmVudCwgJHN0ZXApIHsgcmV0dXJuIHRydV90
YWdzX2ZlZWRfaGFuZGxlcih0cnVlKTsgfQ0KcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90YWdz
X3Jzc19oYW5kbGVyJywgJ3Jzc19lbnRyeScpOw0KZnVuY3Rpb24gdHJ1X3RhZ3NfcnNzX2hh
bmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKGZh
bHNlKTsgfQ0KDQpmdW5jdGlvbiB0cnVfdGFnc19mZWVkX2hhbmRsZXIoJGF0b20pIHsNCgln
bG9iYWwgJHRoaXNhcnRpY2xlLCAkdHJ1X3RhZ3NfcHJlZnM7DQoJZXh0cmFjdCgkdGhpc2Fy
dGljbGUpOw0KDQoJJHRhZ3MgPSB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkdGhp
c2lkKTsNCg0KCWlmICgkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0JPRFldLT52YWx1
ZSkgew0KCQkkZXh0cmFib2R5ID0gJyc7DQoJCSRGT1JNX05BTUUgPSAndHJ1X3RhZ3NfZmVl
ZF90YWdzJzsNCgkJaWYgKGZldGNoKCdmb3JtJywgJ3R4cF9mb3JtJywgJ25hbWUnLCAkRk9S
TV9OQU1FKSkgew0KCQkJJGZvcm0gPSBmZXRjaF9mb3JtKCRGT1JNX05BTUUpOw0KCQkJJGV4
dHJhYm9keSA9IHRyaW0ocGFyc2UoJGZvcm0pKTsNCgkJfSBlbHNlIHsNCgkJCSRhdHRzID0g
dHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJyYXkoKSwgZmFsc2UsIHRydWUp
Ow0KCQkJJGV4dHJhYm9keSA9ICc8cD50YWdzOiAnIC4gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3Vk
KCRhdHRzLCAkdGFncywgJHRhZ3MpIC4gJzwvcD4nOw0KCQl9DQoJCWdsb2JhbCAkdGhpc2Fy
dGljbGU7DQoJCWlmICh0cmltKCR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddKSkgew0KCQkJJHRo
aXNhcnRpY2xlWydleGNlcnB0J10gPSB0cmltKCR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddKS5u
LiRleHRyYWJvZHkubjsNCgkJfQ0KCQkkdGhpc2FydGljbGVbJ2JvZHknXSA9IHRyaW0oJHRo
aXNhcnRpY2xlWydib2R5J10pLm4uJGV4dHJhYm9keS5uOw0KCX0NCg0KCWlmICgkdHJ1X3Rh
Z3NfcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkgew0KCQkkb3V0cHV0
ID0gYXJyYXkoKTsNCgkJZm9yZWFjaCAoJHRhZ3MgYXMgJHRhZykgew0KCQkJaWYgKCRhdG9t
KSB7DQoJCQkJJG91dHB1dFtdID0gJzxjYXRlZ29yeSB0ZXJtPSInIC4gaHRtbHNwZWNpYWxj
aGFycygkdGFnKSAuICciIC8+JzsNCgkJCX0gZWxzZSB7DQoJCQkJJG91dHB1dFtdID0gJzxj
YXRlZ29yeT4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L2NhdGVnb3J5Pic7DQoJ
CQl9DQoJCX0NCgkJcmV0dXJuIG4uam9pbihuLCAkb3V0cHV0KS5uOw0KCX0NCn0NCg0KDQoj
IyMgUFJFRlMgRlVOQ1RJT05TIC8gQ0xBU1NFUyAjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIw0KDQpjbGFzcyB0cnVfdGFnc19wcmVmIHsNCglmdW5jdGlvbiBfX2Nv
bnN0cnVjdCgkbmFtZSwgJGRlZmF1bHRfdmFsdWUsICR0eXBlKSB7DQoJCSR0aGlzLT5uYW1l
ID0gJG5hbWU7DQoJCSR0aGlzLT52YWx1ZSA9ICRkZWZhdWx0X3ZhbHVlOw0KCQkkdGhpcy0+
ZGVmYXVsdF92YWx1ZSA9ICRkZWZhdWx0X3ZhbHVlOw0KCQkkdGhpcy0+dHlwZSA9ICR0eXBl
Ow0KCX0NCg0KCWZ1bmN0aW9uIHZhbGlkYXRlX3ZhbHVlKCR2YWx1ZSkgew0KCQlpZiAoJHZh
bHVlKSB7DQoJCQlyZXR1cm4gJHZhbHVlOw0KCQl9IGVsc2UgaWYgKCR0aGlzLT50eXBlID09
ICdib29sZWFuJykgew0KCQkJcmV0dXJuICcwJzsNCgkJfSBlbHNlIHsNCgkJCXJldHVybiAn
UGxlYXNlIGVudGVyIGEgdmFsdWUgZm9yICcgLiAkdGhpcy0+bmFtZTsNCgkJfQ0KCX0NCn0N
Cg0KZnVuY3Rpb24gdHJ1X3RhZ3NfbG9hZF9wcmVmcygpIHsNCgkkcHJlZnMgPSBhcnJheSgp
Ow0KDQoJZ2xvYmFsICRwZXJtbGlua19tb2RlOw0KCSRwcmVmc1tDTEVBTl9VUkxTXSA9IG5l
dyB0cnVfdGFnc19wcmVmKENMRUFOX1VSTFMsICgkcGVybWxpbmtfbW9kZSAhPSAnbWVzc3kn
ID8gJ2NsZWFuJyA6ICdtZXNzeScpLCAnc3RyaW5nJyk7DQoJJHByZWZzW1RBR19TRUNUSU9O
XSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR19TRUNUSU9OLCAndGFnJywgJ3N0cmluZycpOw0K
CSRwcmVmc1tQQVJNX05BTUVdID0gbmV3IHRydV90YWdzX3ByZWYoUEFSTV9OQU1FLCAndCcs
ICdzdHJpbmcnKTsNCgkkcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdID0gbmV3IHRy
dV90YWdzX3ByZWYoVEFHU19JTl9GRUVEX0NBVEVHT1JJRVMsICcxJywgJ2Jvb2xlYW4nKTsN
CgkkcHJlZnNbVEFHU19JTl9GRUVEX0JPRFldID0gbmV3IHRydV90YWdzX3ByZWYoVEFHU19J
Tl9GRUVEX0JPRFksICcwJywgJ2Jvb2xlYW4nKTsNCgkkcHJlZnNbVEFHU19JTl9XUklURV9U
QUJdID0gbmV3IHRydV90YWdzX3ByZWYoVEFHU19JTl9XUklURV9UQUIsICcxJywgJ2Jvb2xl
YW4nKTsNCgkkcHJlZnNbQVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQl0gPSBuZXcgdHJ1X3Rh
Z3NfcHJlZihBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCLCAnMCcsICdib29sZWFuJyk7DQoJ
JHByZWZzW1VURl84X0NBU0VdID0gbmV3IHRydV90YWdzX3ByZWYoVVRGXzhfQ0FTRSwgJzEn
LCAnYm9vbGVhbicpOw0KDQoJaWYgKHNhZmVfcXVlcnkoImRlc2NyaWJlICIgLiBQRlggLiAi
dHJ1X3RhZ3NfcHJlZnMiKSkgew0KCQkkcnMgPSBzYWZlX3Jvd3MoJyonLCAndHJ1X3RhZ3Nf
cHJlZnMnLCAnMScpOw0KCQlmb3JlYWNoICgkcnMgYXMgJHJvdykgew0KCQkJJHByZWZzWyRy
b3dbJ25hbWUnXV0tPnZhbHVlID0gJHJvd1sndmFsdWUnXTsNCgkJfQ0KCX0NCg0KCXJldHVy
biAkcHJlZnM7DQp9DQoNCg0KIyMjIE9USEVSIFNVUFBPUlQgRlVOQ1RJT05TICMjIw0KIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpmdW5jdGlvbiB0cnVfdGFnc19yZWRp
cmVjdF9pZl9uZWVkZWQoJHRhZ19wYXJhbWV0ZXIpIHsNCgkkcmVkaXJlY3RzID0gdHJ1X3Rh
Z3NfbG9hZF9yZWRpcmVjdHMoKTsNCglmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0dGFn
ID0+ICRyaWdodHRhZykgew0KCQlpZiAoJGxlZnR0YWcgPT0gJHRhZ19wYXJhbWV0ZXIgfHwg
JGxlZnR0YWcgPT0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKSkgew0K
CQkJdHJ1X3RhZ3NfcmVkaXJlY3QoJHJpZ2h0dGFnLCBmYWxzZSk7DQoJCQlyZXR1cm4gdHJ1
ZTsNCgkJfQ0KCX0NCg0KCXJldHVybiBmYWxzZTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFn
c19sb2FkX3JlZGlyZWN0cygpIHsNCgkkcmVkaXJlY3RzID0gYXJyYXkoKTsNCglpZiAoc2Fm
ZV9xdWVyeSgiZGVzY3JpYmUgIiAuIFBGWCAuICJ0cnVfdGFnc19yZWRpcmVjdHMiKSkgew0K
CQkkcnMgPSBzYWZlX3Jvd3MoJyonLCAndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJzEgb3JkZXIg
YnkgbGVmdHRhZycpOw0KCQlmb3JlYWNoICgkcnMgYXMgJHJvdykgew0KCQkJJHJlZGlyZWN0
c1skcm93WydsZWZ0dGFnJ11dID0gJHJvd1sncmlnaHR0YWcnXTsNCgkJfQ0KCX0NCglyZXR1
cm4gJHJlZGlyZWN0czsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19yZWRpcmVjdCgkZGVz
dGluYXRpb24sICRpc19mdWxsX3VybCkgew0KCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJ
aWYgKCRpc19mdWxsX3VybCkgew0KCQkkdXJsID0gJGRlc3RpbmF0aW9uOw0KCQkkbWVzc2Fn
ZSA9ICdUaGUgcmVzb3VyY2UgeW91IHJlcXVlc3RlZCBoYXMgbW92ZWQgdG8gJyAuICRkZXN0
aW5hdGlvbjsNCgl9IGVsc2Ugew0KCQkkdXJsID0gdHJ1X3RhZ3NfbGlua2lmeV90YWcoJGRl
c3RpbmF0aW9uLCBmYWxzZSk7DQoJCSRtZXNzYWdlID0gJ1RoZSByZXF1ZXN0ZWQgdGFnIGhh
cyBiZWVuIHJlcGxhY2VkIGJ5ICcgLiAkZGVzdGluYXRpb247DQoJfQ0KDQoJaGVhZGVyKCdM
b2NhdGlvbjogJyAuICR1cmwpOw0KCXR4cF9kaWUoJG1lc3NhZ2UsICczMDEnKTsNCn0NCg0K
DQpmdW5jdGlvbiB0cnVfdGFnc19saW5raWZ5X3RhZygkdGFnLCAkdXNlX2FtcCA9IHRydWUp
IHsNCglnbG9iYWwgJHRydV90YWdzX3ByZWZzOw0KCWlmICh0cnVfdGFnc19jbGVhbl91cmxz
KCkpIHsNCgkJJHVybHByZWZpeCA9IGh1IC4gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9O
XS0+dmFsdWUgLiAnLyc7DQoJfSBlbHNlIHsNCgkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScg
LiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICgkdXNlX2FtcCA/ICcm
YW1wOycgOiAnJicpIC4gJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlIC4gJz0n
Ow0KCX0NCgkkdXJsc3VmZml4ID0gKHRydV90YWdzX2NsZWFuX3VybHMoKSA/ICcvJyA6ICcn
KTsNCglyZXR1cm4gJHVybHByZWZpeCAuIHVybGVuY29kZSgkdGFnKSAuICR1cmxzdWZmaXg7
DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJGFydGlj
bGVJRCkgew0KCWdsb2JhbCAkdGhpc2FydGljbGUsICR0cnVfdGFnc19wcmVmczsNCglpZiAo
aXNzZXQoJHRoaXNhcnRpY2xlKSkgew0KCQlleHRyYWN0KCR0aGlzYXJ0aWNsZSk7DQoJfQ0K
CSRrZXl3b3JkcyA9ICcnOw0KCWlmIChpc3NldCgkdGhpc2lkKSAmJiAkdGhpc2lkID09ICRh
cnRpY2xlSUQpIHsNCgkJaWYgKGlzc2V0KCR0aGlzYXJ0aWNsZVsna2V5d29yZHMnXSkpIHsN
CgkJCSRrZXl3b3JkcyA9ICR0aGlzYXJ0aWNsZVsna2V5d29yZHMnXTsNCgkJfQ0KCX0gZWxz
ZSB7DQoJCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7DQoJCSRycyA9IHNhZmVfcm93
KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyRhcnRpY2xlSUQnIEFORCAkdGFn
c19maWVsZCA8PiAnJyIpOw0KCQlpZiAoaXNzZXQoJHJzWyR0YWdzX2ZpZWxkXSkpIHsNCgkJ
CSRrZXl3b3JkcyA9ICRyc1skdGFnc19maWVsZF07DQoJCX0NCgl9DQoJJGFsbF90YWdzID0g
YXJyYXkoKTsNCgkkYWxsX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0
b2xvd2VyKCRrZXl3b3JkcykpKTsNCg0KCXJldHVybiB0cnVfdGFnc190cmltX3RhZ3MoJGFs
bF90YWdzKTsNCn0NCg0KDQojIGZpeGVzIGJ1ZyB3aXRoIDQuMC40J3MgdmVyc2lvbiBvZiBk
b1dyYXAgdGhhdCBjYXVzZWQgc3BhY2VzIHRvIHNob3cgdXAgYmVmb3JlIHRoZSBjb21tYXMN
CmZ1bmN0aW9uIHRydV90YWdzX2RvX3dyYXAoJGxpc3QsICR3cmFwdGFnLCAkYnJlYWssICRj
bGFzcywgJGJyZWFrY2xhc3MpIHsNCglpZiAoISR3cmFwdGFnICYmICFwcmVnX21hdGNoKCcv
Xlx3KyQvJywgJGJyZWFrKSkgew0KCQlyZXR1cm4gam9pbigkYnJlYWsubiwgJGxpc3QpOw0K
CX0gZWxzZSB7DQoJCXJldHVybiBkb1dyYXAoJGxpc3QsICR3cmFwdGFnLCAkYnJlYWssICRj
bGFzcywgJGJyZWFrY2xhc3MpOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc190cmlt
X3RhZ3MoJHRhZ19hcnJheSkgew0KCSR0cmltbWVkID0gYXJyYXkoKTsNCglmb3JlYWNoICgk
dGFnX2FycmF5IGFzICR0YWcpIHsNCgkJaWYgKCIiICE9IHRyaW0oJHRhZykpIHsNCgkJCSR0
cmltbWVkW10gPSB0cmltKCR0YWcpOw0KCQl9DQoJfQ0KCXJldHVybiAkdHJpbW1lZDsNCn0N
Cg0KDQpmdW5jdGlvbiB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3Bh
cmFtZXRlcikgew0KCSRrZXl3b3JkcyA9IGV4cGxvZGUoJywnLCAkdGFnX3BhcmFtZXRlcik7
DQoJZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkKSB7DQoJCWlmIChzdHJwb3MoJGtl
eXdvcmQsICctJykgIT09IGZhbHNlKSB7DQoJCQkka2V5d29yZHNbXSA9IHN0cl9yZXBsYWNl
KCctJywgJyAnLCAka2V5d29yZCk7DQoJCX0NCgl9DQoJJGF0dHNbJ2tleXdvcmRzJ10gPSBp
bXBsb2RlKCcsJywgJGtleXdvcmRzKTsNCg0KCWlmIChpc3NldCgkYXR0c1snc2VjdGlvbidd
KSAmJiBzdHJwb3MoJGF0dHNbJ3NlY3Rpb24nXSwgJywnKSAhPT0gZmFsc2UpIHsNCgkJJGF0
dHNbJ3NlY3Rpb24nXSA9ICcnOw0KCX0NCg0KCWlmIChpc3NldCgkYXR0c1snZXhjbHVkZXNl
Y3Rpb24nXSkpIHsNCgkJdW5zZXQoJGF0dHNbJ2V4Y2x1ZGVzZWN0aW9uJ10pOw0KCX0NCg0K
CWlmIChpc3NldCgkYXR0c1snbm9hcnRpY2xlcyddKSkgew0KCQl1bnNldCgkYXR0c1snbm9h
cnRpY2xlcyddKTsNCgl9DQoNCglpZiAoIWlzc2V0KCRhdHRzWydsaW1pdCddKSkgew0KCQkk
YXR0c1snbGltaXQnXSA9ICcxMDAwJzsNCgl9DQoNCglpZiAoIWlzc2V0KCRhdHRzWydhbGxv
d292ZXJyaWRlJ10pKSB7DQoJCSRhdHRzWydhbGxvd292ZXJyaWRlJ10gPSB0cnVlOw0KCX0N
Cg0KCWlmIChpc3NldCgkYXR0c1snc2VhcmNoZm9ybSddKSAmJiAhaXNzZXQoJGF0dHNbJ2xp
c3Rmb3JtJ10pKSB7DQoJCSRhdHRzWydsaXN0Zm9ybSddID0gJGF0dHNbJ3NlYXJjaGZvcm0n
XTsNCgl9DQoNCglpZiAoaXNzZXQoJGF0dHNbJ3Nob3djb3VudHMnXSkpIHsNCgkJdW5zZXQo
JGF0dHNbJ3Nob3djb3VudHMnXSk7DQoJfQ0KDQoJaWYgKGlzc2V0KCRhdHRzWyc0MDRyZWRp
cmVjdCddKSkgew0KCQl1bnNldCgkYXR0c1snNDA0cmVkaXJlY3QnXSk7DQoJfQ0KDQoJcmV0
dXJuICRhdHRzOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3N0cnRvbG93ZXIoJHN0cikg
ew0KCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJaWYgKCR0cnVfdGFnc19wcmVmc1tVVEZf
OF9DQVNFXS0+dmFsdWUpIHsNCgkJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RydG9sb3dl
cicpKSB7DQoJCQlyZXR1cm4gbWJfc3RydG9sb3dlcigkc3RyLCBFTkNPRElORyk7DQoJCX0g
ZWxzZSB7DQoJCQlyZXR1cm4gc3RydG9sb3dlcigkc3RyKTsNCgkJfQ0KCX0gZWxzZSB7DQoJ
CXJldHVybiAkc3RyOw0KCX0NCn0NCg0KZnVuY3Rpb24gdHJ1X3RhZ3Nfc3RydG91cHBlcigk
c3RyKSB7DQoJaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RydG91cHBlcicpKSB7DQoJCXJl
dHVybiBtYl9zdHJ0b3VwcGVyKCRzdHIsIEVOQ09ESU5HKTsNCgl9IGVsc2Ugew0KCQlyZXR1
cm4gc3RydG91cHBlcigkc3RyKTsNCgl9DQp9DQoNCmZ1bmN0aW9uIHRydV90YWdzX3VjZmly
c3QoJHN0cikgew0KCWlmIChmdW5jdGlvbl9leGlzdHMoJ21iX3N1YnN0cicpICYmIGZ1bmN0
aW9uX2V4aXN0cygnbWJfc3RydG91cHBlcicpICYmIGZ1bmN0aW9uX2V4aXN0cygnbWJfc3Ry
bGVuJykgJiYgbWJfc3RybGVuKCRzdHIsIEVOQ09ESU5HKSA+IDEpIHsNCgkJcmV0dXJuIG1i
X3N0cnRvdXBwZXIobWJfc3Vic3RyKCRzdHIsIDAsIDEsIEVOQ09ESU5HKSwgRU5DT0RJTkcp
IC4gbWJfc3Vic3RyKCRzdHIsIDEsIG1iX3N0cmxlbigkc3RyLCBFTkNPRElORyksIEVOQ09E
SU5HKTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gdWNmaXJzdCgkc3RyKTsNCgl9DQp9DQoNCmZ1
bmN0aW9uIHRydV90YWdzX3Vjd29yZHMoJHN0cikgew0KCWlmIChmdW5jdGlvbl9leGlzdHMo
J21iX2NvbnZlcnRfY2FzZScpKSB7DQoJCXJldHVybiBtYl9jb252ZXJ0X2Nhc2UoJHN0ciwg
TUJfQ0FTRV9USVRMRSwgRU5DT0RJTkcpOw0KCX0gZWxzZSB7DQoJCXJldHVybiB1Y3dvcmRz
KCRzdHIpOw0KCX0NCn0NCg0KDQovL3RoZXNlIG5leHQgdHdvIGZ1bmN0aW9ucyBhcmUgZ3Jv
c3MsIGJ1dCBJIGNhbid0IGZpZ3VyZSBvdXQgYW5vdGhlciB3YXkgdG8gZG8gaXQNCmZ1bmN0
aW9uIHRydV90YWdzX3NvcnRfdGFncygkdGFnc193ZWlnaHQsICRzb3J0X2J5X2NvdW50LCAk
c29ydF9hc2NlbmRpbmcpIHsNCglnbG9iYWwgJHRydV90YWdzX3RhZ3Nfd2VpZ2h0LCAkdHJ1
X3RhZ3Nfc29ydF9hc2NlbmRpbmc7DQoNCgkkdHJ1X3RhZ3NfdGFnc193ZWlnaHQgPSAkdGFn
c193ZWlnaHQ7DQoJJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nID0gJHNvcnRfYXNjZW5kaW5n
Ow0KDQoJJHRlbXBfYXJyYXkgPSBhcnJheV9rZXlzKCR0YWdzX3dlaWdodCk7DQoJaWYgKCRz
b3J0X2J5X2NvdW50KSB7DQoJCXVzb3J0KCR0ZW1wX2FycmF5LCAidHJ1X3RhZ3Nfc29ydF90
YWdzX2NvbXBhcmF0b3IiKTsNCgl9IGVsc2Ugew0KCQluYXRjYXNlc29ydCgkdGVtcF9hcnJh
eSk7DQoJCSR0ZW1wX2FycmF5ID0gYXJyYXlfdmFsdWVzKCR0ZW1wX2FycmF5KTsNCgl9DQoN
Cgkkc29ydGVkX2FycmF5ID0gYXJyYXkoKTsNCglmb3JlYWNoICgkdGVtcF9hcnJheSBhcyAk
dGFnKSB7DQoJCSRzb3J0ZWRfYXJyYXlbJHRhZ10gPSAkdGFnc193ZWlnaHRbJHRhZ107DQoJ
fQ0KDQoJcmV0dXJuICRzb3J0ZWRfYXJyYXk7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3Nf
c29ydF90YWdzX2NvbXBhcmF0b3IoJGxlZnQsICRyaWdodCkgew0KCWdsb2JhbCAkdHJ1X3Rh
Z3NfdGFnc193ZWlnaHQsICR0cnVfdGFnc19zb3J0X2FzY2VuZGluZzsNCg0KCSRsZWZ0X3dl
aWdodCA9ICR0cnVfdGFnc190YWdzX3dlaWdodFskbGVmdF07DQoJJHJpZ2h0X3dlaWdodCA9
ICR0cnVfdGFnc190YWdzX3dlaWdodFskcmlnaHRdOw0KCWlmICgkbGVmdF93ZWlnaHQgPT0g
JHJpZ2h0X3dlaWdodCkgew0KCQkkdGVtcF9hcnJheSA9IGFycmF5KCRsZWZ0LCAkcmlnaHQp
Ow0KCQluYXRjYXNlc29ydCgkdGVtcF9hcnJheSk7DQoJCSR0ZW1wX2FycmF5ID0gYXJyYXlf
dmFsdWVzKCR0ZW1wX2FycmF5KTsNCgkJcmV0dXJuICgkdGVtcF9hcnJheVswXSA9PSAkbGVm
dCA/IC0xIDogMSk7DQoJfSBlbHNlIGlmICgkdHJ1X3RhZ3Nfc29ydF9hc2NlbmRpbmcpIHsN
CgkJcmV0dXJuICRsZWZ0X3dlaWdodCAtICRyaWdodF93ZWlnaHQ7DQoJfSBlbHNlIHsNCgkJ
cmV0dXJuICRyaWdodF93ZWlnaHQgLSAkbGVmdF93ZWlnaHQ7DQoJfQ0KfQ0KDQoNCg0KIyMj
IEJBU1RBUkQgRlVOQ1RJT05TIFRIQVQgU0hPVUxETidUIEhBVkUgVE8gRVhJU1QgIyMjDQoj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMN
Cg0KDQpmdW5jdGlvbiB0cnVfdGFnc19yZWRvX2FydGljbGVfc2VhcmNoKCRhdHRzKSB7DQoJ
JHRoZUF0dHMgPSBsQXR0cyhhcnJheSgnbGltaXQnICAgICA9PiAxMDAwLA0KCQkJCSdjYXRl
Z29yeScgID0+ICcnLA0KCQkJCSdzZWN0aW9uJyAgID0+ICcnLA0KCQkJCSdleGNlcnB0ZWQn
ID0+ICcnLA0KCQkJCSdhdXRob3InICAgID0+ICcnLA0KCQkJCSdzb3J0YnknICAgID0+ICdQ
b3N0ZWQnLA0KCQkJCSdzb3J0ZGlyJyAgID0+ICdkZXNjJywNCgkJCQknbW9udGgnICAgICA9
PiAnJywNCgkJCQkna2V5d29yZHMnICA9PiAnJywNCgkJCQknZnJvbnRwYWdlJyA9PiAnJywN
CgkJCQknaWQnICAgICAgICA9PiAnJywNCgkJCQkndGltZScgICAgICA9PiAncGFzdCcsDQoJ
CQkJJ3N0YXR1cycgICAgPT4gJzQnLA0KCQkJCSdvZmZzZXQnICAgID0+IDANCgkJCSksJGF0
dHMsIDApOw0KCWV4dHJhY3QoJHRoZUF0dHMpOw0KDQoJLy9CdWlsZGluZyBxdWVyeSBwYXJ0
cw0KCSRmcm9udHBhZ2UgPSAoJGZyb250cGFnZSkgPyBmaWx0ZXJGcm9udFBhZ2UoKSA6ICcn
Ow0KCSRjYXRlZ29yeSAgPSAoISRjYXRlZ29yeSkgID8gJycgOiAiIGFuZCAoKENhdGVnb3J5
MT0nIi5kb3NsYXNoKCRjYXRlZ29yeSkuIicpIG9yIChDYXRlZ29yeTI9JyIuZG9TbGFzaCgk
Y2F0ZWdvcnkpLiInKSkgIjsNCgkkc2VjdGlvbiAgID0gKCEkc2VjdGlvbikgICA/ICcnIDog
IiBhbmQgU2VjdGlvbiA9ICciLmRvc2xhc2goJHNlY3Rpb24pLiInIjsNCgkkZXhjZXJwdGVk
ID0gKCRleGNlcnB0ZWQ9PSd5JykgID8gIiBhbmQgRXhjZXJwdCAhPScnIiA6ICcnOw0KCSRh
dXRob3IgICAgPSAoISRhdXRob3IpICAgID8gJycgOiAiIGFuZCBBdXRob3JJRCA9ICciLmRv
c2xhc2goJGF1dGhvcikuIiciOw0KCSRtb250aCAgICAgPSAoISRtb250aCkgICAgID8gJycg
OiAiIGFuZCBQb3N0ZWQgbGlrZSAnIi5kb1NsYXNoKCRtb250aCkuIiUnIjsNCgkkaWQgICAg
ICAgID0gKCEkaWQpICAgICAgICA/ICcnIDogIiBhbmQgSUQgPSAnIi5pbnR2YWwoJGlkKS4i
JyI7DQoJc3dpdGNoICgkdGltZSkgew0KCQljYXNlICdhbnknOg0KCQkJJHRpbWUgPSAiIjsg
YnJlYWs7DQoJCWNhc2UgJ2Z1dHVyZSc6DQoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA+IG5v
dygpIjsgYnJlYWs7DQoJCWRlZmF1bHQ6DQoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA8IG5v
dygpIjsNCgl9DQoJaWYgKCFpc19udW1lcmljKCRzdGF0dXMpKQ0KCQkkc3RhdHVzID0gZ2V0
U3RhdHVzTnVtKCRzdGF0dXMpOw0KDQoJJGN1c3RvbSA9ICcnOw0KCS8vIHRyeWluZyBjdXN0
b20gZmllbGRzIGhlcmUNCgkkY3VzdG9tRmllbGRzID0gZ2V0Q3VzdG9tRmllbGRzKCk7DQoJ
aWYgKCRjdXN0b21GaWVsZHMpIHsNCgkJZm9yZWFjaCgkY3VzdG9tRmllbGRzIGFzICRjRmll
bGQpIHsNCgkJCWlmIChpc3NldCgkYXR0c1skY0ZpZWxkXSkpDQoJCQkJJGN1c3RvbVBhaXJz
WyRjRmllbGRdID0gJGF0dHNbJGNGaWVsZF07DQoJCX0NCgkJaWYoIWVtcHR5KCRjdXN0b21Q
YWlycykpDQoJCQkkY3VzdG9tID0gIGJ1aWxkQ3VzdG9tU3FsKCRjdXN0b21GaWVsZHMsJGN1
c3RvbVBhaXJzKTsNCgkJZWxzZQ0KCQkJJGN1c3RvbSA9ICcnOw0KCX0NCg0KCS8vQWxsb3cg
a2V5d29yZHMgZm9yIG5vLWN1c3RvbSBhcnRpY2xlcy4gVGhhdCB0YWdnaW5nIG1vZGUsIHlv
dSBrbm93DQoJaWYgKCRrZXl3b3Jkcykgew0KCQkka2V5cyA9IGRvU2xhc2goYXJyYXlfbWFw
KCd0cmltJywgZXhwbG9kZSgnLCcsICRrZXl3b3JkcykpKTsNCgkJZm9yZWFjaCAoJGtleXMg
YXMgJGtleSkgew0KCQkJJGtleXBhcnRzW10gPSAiRklORF9JTl9TRVQoJyIuJGtleS4iJyxL
ZXl3b3JkcykiOw0KCQl9DQoJCSRrZXl3b3JkcyA9ICIgYW5kICgiIC4gam9pbignIG9yICcs
JGtleXBhcnRzKSAuICIpIjsNCgl9DQoNCglpZiAoJGlkKQ0KCQkkc3RhdHVzcSA9ICIgYW5k
IFN0YXR1cyA+PSAnNCciOw0KCWVsc2UNCgkJJHN0YXR1c3EgPSAiIGFuZCBTdGF0dXM9JyIu
ZG9TbGFzaCgkc3RhdHVzKS4iJyI7DQoNCgkkd2hlcmUgPSAiMSIgLiAkc3RhdHVzcS4gJHRp
bWUuDQoJCSRpZCAuICRjYXRlZ29yeSAuICRzZWN0aW9uIC4gJGV4Y2VycHRlZCAuICRtb250
aCAuICRhdXRob3IgLiAka2V5d29yZHMgLiAkY3VzdG9tIC4gJGZyb250cGFnZTsNCg0KCQkk
cGdvZmZzZXQgPSAkb2Zmc2V0IC4gJywgJzsNCg0KCSRycyA9IHNhZmVfcm93c19zdGFydCgi
KiwgdW5peF90aW1lc3RhbXAoUG9zdGVkKSBhcyB1UG9zdGVkIiwgJ3RleHRwYXR0ZXJuJywN
CgkJJHdoZXJlLiAnIG9yZGVyIGJ5ICcgLiBkb3NsYXNoKCRzb3J0YnkpIC4gJyAnIC4gZG9T
bGFzaCgkc29ydGRpcikgLiAnIGxpbWl0ICcgLiBkb1NsYXNoKCRsaW1pdCkpOw0KDQoJcmV0
dXJuICRyczsNCn0NCg0KDQoiO3M6NDoidHlwZSI7czoxOiI1IjtzOjU6Im9yZGVyIjtzOjE6
IjEiO3M6NToiZmxhZ3MiO3M6MToiMCI7czo0OiJoZWxwIjtzOjExMTg6IjxwPlRvIGxlYXJu
IG1vcmUgYWJvdXQgdHJ1X3RhZ3MsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3
dy5yYWluc2tpdC5jb20vYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2luLWZvci10
ZXh0cGF0dGVybiIgcmVsPSJub2ZvbGxvdyI+aW50cm9kdWN0b3J5IGFydGljbGU8L2E+LCA8
YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTM3L3RydV90YWdz
LXJlbGVhc2VzIiByZWw9Im5vZm9sbG93Ij5yZWxlYXNlcyBwYWdlPC9hPiwgPGEgaHJlZj0i
aHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUt
bGlzdCIgcmVsPSJub2ZvbGxvdyI+ZmVhdHVyZSBsaXN0PC9hPiwgPGEgaHJlZj0iaHR0cDov
L3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzU1NC90cnVfdGFncy1yb2FkbWFwIiByZWw9
Im5vZm9sbG93Ij5yb2FkbWFwPC9hPiwgYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNr
aXQuY29tL3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMiIHJlbD0i
bm9mb2xsb3ciPnVzYWdlIGluc3RydWN0aW9uczwvYT4uPC9wPgoKPHA+WW91IGNhbiBhbHNv
IGZpbmQgdGhlIHNvdXJjZSBjb2RlIGF0IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90
cnVpc3QvdHJ1LXRhZ3MiIHJlbD0ibm9mb2xsb3ciPmdpdGh1Yi5jb20vdHJ1aXN0L3RydS10
YWdzPC9hPi48L3A+Cgo8cD5JJiM4MjE3O3ZlIHRha2VuIHRoZSBkZXRhaWxlZCBoZWxwIG91
dCBvZiB0aGUgcGx1Z2luOyBteSBhcG9sb2dpZXMuICBJdCB3YXMgdG9vIGJpZyBhbmQgdG9v
IGRpZmZpY3VsdCB0byBrZWVwIG1haW50YWluaW5nIG9uIG15IHNpdGUgYW5kIGluIHRoZSBw
bHVnaW4uICBJZiwgbXkgc2l0ZSBpcyBldmVyIGRvd24sIGhvd2V2ZXIsIHRoZSBzb3VyY2Ug
PHNwYW4gY2xhc3M9ImNhcHMiPkhUTUw8L3NwYW4+IG9mIHRoZSB1c2FnZSBpbnN0cnVjdGlv
bnMgaXMgYXZhaWxhYmxlIGZyb20gdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90
cnVpc3QvdHJ1LXRhZ3MvYmxvYi9tYXN0ZXIvdHJ1X3RhZ3MtZG9jcy5odG1sIiByZWw9Im5v
Zm9sbG93Ij5naXRodWIgcmVwbzwvYT48L3A+IjtzOjM6Im1kNSI7czozMjoiNmQwOWEzYTY1
MzFkZGQyYjczZGZiM2Y3MjM3YzY4MGEiO30=

Last edited by whocarez (2020-06-25 22:25:12)

Offline

#827 2020-07-28 18:25:01

frickinmuck
Member
Registered: 2008-05-01
Posts: 118

Re: tru_tags: A tagging plugin for textpattern

An error has killed one of my sites and I’m just wondering if anyone is able to help me figure out how to get this fixed. Not sure what could have changed because it was working yesterday and I’ve done nothing to the code or db.

Fatal error: Uncaught Error: Call to undefined function mysql_query() in /html/textpattern/plugins/tru_tags/tru_tags.php:948 Stack trace: #0 /html/textpattern/plugins/tru_tags/tru_tags.php(30): tru_tags_load_prefs() #1 /html/textpattern/lib/txplib_misc.php(1413): include(‘/nfs/c01/h07/mn…’) #2 /html/textpattern/publish.php(234): load_plugins() #3 /html/index.php(69): include(‘/nfs/c01/h07/mn…’) #4 {main} thrown in /html/textpattern/plugins/tru_tags/tru_tags.php on line 948


The AI does not hate you, nor does it love you, but you are made out of atoms which it can use for something else.

Offline

#828 2020-07-28 19:26:46

jakob
Admin
From: Germany
Registered: 2005-01-20
Posts: 4,578
Website

Re: tru_tags: A tagging plugin for textpattern

The error mentions mysql_query and as php.net says:

This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0.

My guess – when nothing else has changed – is that your host has upgraded your server to php 7 and this error has appeared as a result. It will likely affect Textpattern too if you haven’t updated in a while. tru_tags was patched to resolve that in October 2016 time ago (here) and there are more recent updates a couple of posts above your post that repair its functionality in the most recent version of Textpattern.

Long story short: try updating tru_tags, and if you haven’t updated Textpattern in a while, take a backup of your site and database first, and then update to a recent version. Textpattern 4.8.1 is current and 4.8.2 is imminent.


TXP Builders – finely-crafted code, design and txp

Offline

Board footer

Powered by FluxBB