Go to main content

Textpattern CMS support forum

You are not logged in. Register | Login | Help

#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: 5,202
Website GitHub

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

#829 2020-07-28 19:57:10

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

Re: tru_tags: A tagging plugin for textpattern

Thanks so much for your help. I’ve managed to fix it.

I’ve actually been procrastinating on rebuilding this site. I guess I’d better get to it! :)


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

#830 2020-09-25 10:21:14

jodeci
Member
From: Taipei
Registered: 2008-01-13
Posts: 38
Website

Re: tru_tags: A tagging plugin for textpattern

Hi, so I just upgraded my neglected site to 4.8.2 and tru_tags to 3.9.2.

In debugging mode, I will get this error:

User_Error "Table 'tru_tags_redirects' doesn't exist"
in /..../textpattern/lib/txplib_db.php at line 448.

I double checked and the table indeed does not exist. Re-installing the plugin does not help. I can try to manually create the table but where do I find the schema?

Offline

#831 2020-09-26 04:40:30

peterj
Member
From: Melbourne, Australia
Registered: 2005-06-02
Posts: 110

Re: tru_tags: A tagging plugin for textpattern

I have an install running TXP 4.8.2 with tru_tags 3.9(patched) – which isn’t the latest but seems to still work.
I tried renaming the prefix on the database table, and was able to get the redirects table back by visiting the tru_tags settings page on the extensions tab – just opening that settings page runs a script that checks for the table and creates it if not there.

Offline

#832 2020-09-28 06:33:29

jodeci
Member
From: Taipei
Registered: 2008-01-13
Posts: 38
Website

Re: tru_tags: A tagging plugin for textpattern

Weirdly the extensions tab did not trigger the table creation. Had to go through the plugin code and dig out the schema. Leaving it here if anyone else needs this:

tru_tags_redirects
—————————
lefttag (varchar 255, primary key)
righttag (varchar 255, not null)

Offline

#833 2020-12-10 17:06:31

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

Re: tru_tags: A tagging plugin for textpattern

For getting this plugin to work with php 8.0.0, I had to change the following line:

$count = $countwrapchars{0} . $weight . $countwrapchars{1};

into

$count = $countwrapchars[0] . $weight . $countwrapchars[1];

Without that I got an Fatal error: Array and string offset access syntax with curly braces is no longer supported.

I’m not sure, whether that breaks something or not, but works for now.

Last edited by whocarez (2021-06-03 09:29:52)

Offline

#834 2021-06-03 03:13:56

Vienuolis
Member
From: Vilnius, Lithuania
Registered: 2009-06-14
Posts: 327
Website GitHub GitLab Mastodon Twitter

Re: tru_tags: A tagging plugin for textpattern

Your patch helped me, too — thanks, whocarez!

Offline

#835 2022-01-20 06:42:57

peterj
Member
From: Melbourne, Australia
Registered: 2005-06-02
Posts: 110

Re: tru_tags: A tagging plugin for textpattern

Thanks whocarez, that does the trick. tru_tags lives to see another php version…

Offline

#836 2022-04-28 16:52:43

jordi
Member
From: Barcelona
Registered: 2005-09-14
Posts: 94
Website

Re: tru_tags: A tagging plugin for textpattern

Thank you whocarez, this works (TXP 4.8.8 – PHP 7.4)

Offline

#837 2023-03-18 13:47:39

truist
Plugin Author
From: Ohio, USA
Registered: 2004-11-09
Posts: 257
Website

Re: tru_tags: A tagging plugin for textpattern

I’m still not maintaining this… but @whocarez made it easy by making a PR! (There were still many yaks shaved to publish it!)

v3.10 is available on the website

I have NOT tested this build.

whocarez, if you want to take over the plugin, I’d be happy to turn it over to you ;)

Offline

#838 2023-03-20 12:37:37

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

Re: tru_tags: A tagging plugin for textpattern

I have not really the spare time (and often the programming knowledge) to maintain such a huge piece of code. As this plugin is from my opinion something essential for Textpattern, it would be better to make it as well as com_connect a community plugin.

Offline

#839 2023-03-20 13:10:08

Bloke
Developer
From: Leeds, UK
Registered: 2006-01-29
Posts: 12,452
Website GitHub

Re: tru_tags: A tagging plugin for textpattern

whocarez wrote #335142:

As this plugin is from my opinion something essential for Textpattern, it would be better to make it as well as com_connect a community plugin.

Not going to happen, sorry. But we are planning to migrate core Keywords into a tagging system at some point.


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

Hire Txp Builders – finely-crafted code, design and Txp

Offline

#840 2023-03-20 13:12:35

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

Re: tru_tags: A tagging plugin for textpattern

That is even better 😀

Offline

Board footer

Powered by FluxBB