Go to main content

Textpattern CMS support forum

You are not logged in. Register | Login | Help

#781 2017-02-04 08:56:19

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

Re: tru_tags: A tagging plugin for textpattern

frickinmuck wrote #303831:

undefined constant NULLDATETIME

Thanks, that’s the main issue then. Here’s the primer to help fix it.

The other mysql issue can more than likely be solved by perusing the mysql to mysqli thread.

You can ignore the warnings for now, but there is a fix for unregistered tags. Hope all that helps.


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

Offline

#782 2017-02-04 20:56:19

michaelkpate
Moderator
From: Avon Park, FL
Registered: 2004-02-24
Posts: 1,379
Website GitHub Mastodon

Re: tru_tags: A tagging plugin for textpattern

My mini-fork that includes all of Stef’s modifications and seems to be working correctly:

# Name: tru_tags v3.7a 
# Type: Admin/Public 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
dC5jb20vIjtzOjc6InZlcnNpb24iO3M6NDoiMy43YSI7czoxMToiZGVzY3JpcHRpb24iO3M6
MTU6IkFydGljbGUgdGFnZ2luZyI7czo0OiJjb2RlIjtzOjQ1ODc2OiIvLyBUWFAgNC42IHRh
ZyByZWdpc3RyYXRpb24NCmlmIChjbGFzc19leGlzdHMoJ1xUZXh0cGF0dGVyblxUYWdcUmVn
aXN0cnknKSkgew0KVHhwOjpnZXQoJ1xUZXh0cGF0dGVyblxUYWdcUmVnaXN0cnknKQ0KLT5y
ZWdpc3RlcigndHJ1X3RhZ3MnKQ0KOw0KfQ0KDQojIENvcHlyaWdodCAyMDA5IE5hdGhhbiBB
cnRodXINCiMgUmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBQdWJsaWMgTGljZW5zZSwgc2VlIGh0
dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvZ3BsLWxpY2Vuc2UucGhwIGZvciBk
ZXRhaWxzDQojIFRoaXMgd29yayB3YXMgb3JpZ2luYWxseSBpbnNwaXJlZCBieSByYW5fdGFn
cyBieSBSYW4gQXJvdXNzaSwgb3JpZ2luYWxseSBmb3VuZCBhdCBodHRwOi8vYXJvdXNzaS5j
b20vYXJ0aWNsZS80NS90YWdnaW5nLXRleHRwYXR0ZXJuDQojIEphdmFzY3JpcHQgYnVnIGZp
eGVzIHdlcmUgcHJvdmlkZWQgYnkgdGhlX2dob3N0IC0gaHR0cDovL3ZpY3RvcnVzLm5ldA0K
IyBKYXZhc2NyaXB0IGNvZGUgZm9yIHRoZSB0YWcgYXV0by1jb21wbGV0ZSBmZWF0dXJlIHdh
cyBwcm92aWRlZCBieSBKaW0gQmlhbmNvbG8gLSBodHRwOi8vd3d3LmJpYW5jb2xvLmNvbS8N
Cg0KDQojIyMgQ09ORklHVVJBVElPTiAjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQoj
IFRVUk4gQkFDSyEgIENvbmZpZ3VyYXRpb24gaXMgbm8gbG9uZ2VyIGhhbmRsZWQgYnkgZWRp
dGluZyB0aGUgcGx1Z2luLg0KIyBDaGVjayBvdXQgdGhlICdFeHRlbnNpb25zJyB0YWIgaW4g
dGhlIFRleHRwYXR0ZXJuIGFkbWluIDopDQoNCg0KIyBDaGFuZ2luZyB0aGVzZSB3b24ndCBk
byBhbnkgZ29vZC4gIFRoZXkncmUganVzdCBoZXJlIGFzIGEgY29udmVuaWVuY2UgZm9yIGRl
dmVsb3BtZW50Lg0KZGVmaW5lKCdUUlVfVEFHU19GSUVMRCcsICdLZXl3b3JkcycpOw0KZGVm
aW5lKCdFTkNPRElORycsICd1dGYtOCcpOw0KDQpkZWZpbmUoJ0NMRUFOX1VSTFMnLCAnY2xl
YW5fdXJscycpOw0KZGVmaW5lKCdUQUdfU0VDVElPTicsICd0YWdfc2VjdGlvbicpOw0KZGVm
aW5lKCdQQVJNX05BTUUnLCAncGFybScpOw0KZGVmaW5lKCdUQUdTX0lOX0ZFRURfQ0FURUdP
UklFUycsICd0YWdzX2luX2ZlZWRfY2F0ZWdvcmllcycpOw0KZGVmaW5lKCdUQUdTX0lOX0ZF
RURfQk9EWScsICd0YWdzX2luX2ZlZWRfYm9keScpOw0KZGVmaW5lKCdUQUdTX0lOX1dSSVRF
X1RBQicsICd0YWdzX2luX3dyaXRlX3RhYicpOw0KZGVmaW5lKCdBVVRPQ09NUExFVEVfSU5f
V1JJVEVfVEFCJywgJ2F1dG9jb21wbGV0ZV9pbl93cml0ZV90YWInKTsNCmRlZmluZSgnVVRG
XzhfQ0FTRScsICd1dGZfOF9jYXNlJyk7DQoNCmdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQok
dHJ1X3RhZ3NfcHJlZnMgPSB0cnVfdGFnc19sb2FkX3ByZWZzKCk7DQoNCg0KIyMjIFBSSU1B
UlkgVEFHIEZVTkNUSU9OUyAjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoN
CmZ1bmN0aW9uIHRydV90YWdzX2hhbmRsZXIoJGF0dHMpIHsNCgkkdGFnX3BhcmFtZXRlciA9
IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoKSwgZmFsc2UpOw0KCWlmICghZW1wdHko
JHRhZ19wYXJhbWV0ZXIpKSB7DQoJCWlmICh0cnVfdGFnc19yZWRpcmVjdF9pZl9uZWVkZWQo
JHRhZ19wYXJhbWV0ZXIpKSB7DQoJCQlyZXR1cm4gJyc7DQoJCX0NCgkJJGNsZWFuX2F0dHMg
PSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7DQoJ
CSRyZXN1bHQgPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVlKTsJCSNmdW5jdGlvbiBp
biBUWFAgY29kZQ0KCQlpZiAodHJpbSgkcmVzdWx0KSA9PSAnJykgew0KCQkJaWYgKGlzc2V0
KCRhdHRzWydub2FydGljbGVzJ10pKSB7DQoJCQkJdHJ1X3RhZ3NfcmVkaXJlY3QoJGF0dHNb
J25vYXJ0aWNsZXMnXSwgdHJ1ZSk7DQoJCQl9IGVsc2UgaWYgKGlzc2V0KCRhdHRzWyc0MDRy
ZWRpcmVjdCddKSAmJiAhJGF0dHNbJzQwNHJlZGlyZWN0J10pIHsNCgkJCQlyZXR1cm4gJHJl
c3VsdDsNCgkJCX0gZWxzZSB7DQoJCQkJdHhwX2RpZShnVHh0KCc0MDRfbm90X2ZvdW5kJyks
ICc0MDQnKTsNCgkJCX0NCgkJfSBlbHNlIHsNCgkJCXJldHVybiAkcmVzdWx0Ow0KCQl9DQoJ
fSBlbHNlIHsNCgkJcmV0dXJuIHRydV90YWdzX2Nsb3VkKCRhdHRzKTsNCgl9DQp9DQoNCg0K
ZnVuY3Rpb24gdHJ1X3RhZ3NfYXJjaGl2ZSgkYXR0cykgew0KCWdsb2JhbCAkdHJ1X3RhZ3Nf
Y3VycmVudF9hcmNoaXZlX3RhZzsNCgkkdGFncyA9IGFycmF5X3VuaXF1ZSh0cnVfdGFnc19j
bG91ZF9xdWVyeSh0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFs
c2UsIGZhbHNlKSkpOw0KCW5hdGNhc2Vzb3J0KCR0YWdzKTsNCglmb3JlYWNoICgkdGFncyBh
cyAkdGFnKSB7DQoJCSR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnID0gJHRhZzsNCgkJ
JGNsZWFuX2F0dHMgPSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnKTsN
CgkJJHJlc3VsdHNbXSA9IGRvQXJ0aWNsZXMoJGNsZWFuX2F0dHMsIHRydWUpOwkJI2Z1bmN0
aW9uIGluIFRYUCBjb2RlDQoJfQ0KCXJldHVybiBqb2luKCcgJywgJHJlc3VsdHMpOw0KfQ0K
DQoNCmZ1bmN0aW9uIHRydV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWcoJGF0dHMpIHsNCgln
bG9iYWwgJHRydV90YWdzX2N1cnJlbnRfYXJjaGl2ZV90YWc7DQoJZXh0cmFjdChsQXR0cyhh
cnJheSgnbGluaycgPT4gJzAnKSwgICRhdHRzLCAwKSk7DQoJaWYgKCRsaW5rKSB7DQoJCXJl
dHVybiAnPGEgaHJlZj0iJyAuIHRydV90YWdzX2xpbmtpZnlfdGFnKCR0cnVfdGFnc19jdXJy
ZW50X2FyY2hpdmVfdGFnKSAuICciPicgLiAkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3Rh
ZyAuICc8L2E+JzsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gJHRydV90YWdzX2N1cnJlbnRfYXJj
aGl2ZV90YWc7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2Nsb3VkKCRhdHRzKSB7
DQoJcmV0dXJuIHRydV90YWdzX2xpc3QodHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0
dHMoJGF0dHMsIGZhbHNlLCBmYWxzZSkpOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2xp
c3QoJGF0dHMpIHsNCgkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRz
KCRhdHRzLCB0cnVlLCBmYWxzZSk7DQoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfY2xvdWRfcXVl
cnkoJGF0dHMpOw0KDQoJcmV0dXJuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFs
bF90YWdzLCAkYWxsX3RhZ3MpOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2Zyb21fYXJ0
aWNsZSgkYXR0cykgew0KCWdsb2JhbCAkdGhpc2FydGljbGU7DQoJZXh0cmFjdCgkdGhpc2Fy
dGljbGUpOw0KDQoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUo
JHRoaXNpZCk7DQoNCgkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRz
KCRhdHRzLCBmYWxzZSwgdHJ1ZSk7DQoJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3Rh
Z3M7DQoJaWYgKCRhdHRzWyd1c2VvdmVyYWxsY291bnRzJ10pIHsNCgkJJGFsbF90YWdzX2Zv
cl93ZWlnaHQgPSB0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cyk7DQoJfQ0KDQoJcmV0dXJu
IHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9y
X3dlaWdodCk7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfaGFzX3RhZ3MoJGF0dHMs
ICR0aGluZykgew0KCWdsb2JhbCAkdGhpc2FydGljbGU7DQoJZXh0cmFjdCgkdGhpc2FydGlj
bGUpOw0KDQoJJHRhZ3NfZmllbGQgPSBUUlVfVEFHU19GSUVMRDsNCg0KCSRycyA9IHNhZmVf
cm93KCR0YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAkdGFn
c19maWVsZCA8PiAnJyIpOw0KCXJldHVybiBwYXJzZShFdmFsRWxzZSgkdGhpbmcsICRycykp
Ow0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2lmX3RhZ19zZWFyY2goJGF0dHMsICR0aGlu
Zykgew0KCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3RhZycgPT4gJycpLCAgJGF0dHMsIDApKTsN
Cg0KCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgnc3Ry
aXBoeXBoZW5zJyA9PiAxKSwgZmFsc2UpOw0KCSRjb25kaXRpb24gPSAoIWVtcHR5KCR0YWdf
cGFyYW1ldGVyKSkgPyB0cnVlIDogZmFsc2U7DQoJaWYgKCRjb25kaXRpb24gJiYgIWVtcHR5
KCR0YWcpKSB7DQoJCSRjb25kaXRpb24gPSAoJHRhZ19wYXJhbWV0ZXIgPT0gJHRhZyk7DQoJ
fQ0KCXJldHVybiBwYXJzZShFdmFsRWxzZSgkdGhpbmcsICRjb25kaXRpb24pKTsNCn0NCg0K
DQpmdW5jdGlvbiB0cnVfdGFnc190YWdfcGFyYW1ldGVyKCRhdHRzLCAkc2FmZWh0bWwgPSB0
cnVlKSB7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCglleHRyYWN0KGxBdHRzKGFycmF5
KCdzdHJpcGh5cGhlbnMnID0+ICcwJywgJ3VybGVuY29kZScgPT4gMCksICAkYXR0cywgMCkp
Ow0KDQoJJHBhcm0gPSB1cmxkZWNvZGUoc3RyaXBfdGFncyhncHMoJHRydV90YWdzX3ByZWZz
W1BBUk1fTkFNRV0tPnZhbHVlKSkpOw0KCWlmICgnbG9va3VwJyA9PSAkc3RyaXBoeXBoZW5z
KSB7DQoJCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJyYXko
KSwgZmFsc2UsIGZhbHNlKTsNCgkJJHRhZ19saXN0ID0gYXJyYXlfdW5pcXVlKHRydV90YWdz
X2Nsb3VkX3F1ZXJ5KCRhdHRzKSk7DQoJCWZvcmVhY2ggKCR0YWdfbGlzdCBhcyAkY2xvdWRf
dGFnKSB7DQoJCQlpZiAoJHBhcm0gPT0gc3RyX3JlcGxhY2UoJyAnLCAnLScsICRjbG91ZF90
YWcpKSB7DQoJCQkJJHBhcm0gPSAkY2xvdWRfdGFnOw0KCQkJCWJyZWFrOw0KCQkJfQ0KCQl9
DQoJfSBlbHNlIGlmICgkc3RyaXBoeXBoZW5zKSB7DQoJCSRwYXJtID0gc3RyX3JlcGxhY2Uo
Jy0nLCAnICcsICRwYXJtKTsNCgl9DQoJaWYgKCR1cmxlbmNvZGUpIHsNCgkJJHBhcm0gPSB1
cmxlbmNvZGUoJHBhcm0pOw0KCSB9IGVsc2UgaWYgKCRzYWZlaHRtbCkgew0KCQkkcGFybSA9
IGh0bWxzcGVjaWFsY2hhcnMoJHBhcm0pOw0KCX0NCg0KCXJldHVybiAkcGFybTsNCn0NCg0K
DQpmdW5jdGlvbiB0cnVfdGFnc19zZWFyY2hfcmVzdWx0X2V4Y2VycHQoJGF0dHMpIHsNCgln
bG9iYWwgJHByZXRleHQ7DQoNCgkkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19wYXJh
bWV0ZXIoYXJyYXkoKSwgZmFsc2UpOw0KCWlmICh0cmltKCR0YWdfcGFyYW1ldGVyKSAhPSAn
Jykgew0KCQkkcSA9ICRwcmV0ZXh0WydxJ107DQoJCSRwcmV0ZXh0WydxJ10gPSAkdGFnX3Bh
cmFtZXRlcjsNCgkJJHJlc3VsdCA9IHNlYXJjaF9yZXN1bHRfZXhjZXJwdCgkYXR0cyk7DQoJ
CSRwcmV0ZXh0WydxJ10gPSAkcTsNCgl9IGVsc2Ugew0KCQkkcmVzdWx0ID0gc2VhcmNoX3Jl
c3VsdF9leGNlcnB0KCRhdHRzKTsNCgl9DQoJcmV0dXJuICRyZXN1bHQ7DQp9DQoNCg0KZnVu
Y3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpIHsNCgl0cmlnZ2VyX2Vycm9yKGdU
eHQoJ2RlcHJlY2F0ZWRfdGFnJyksIEVfVVNFUl9OT1RJQ0UpOw0KCXJldHVybiBzdHJpcF90
YWdzKGdwcygncScpKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19yZWxhdGVkX3RhZ3Nf
ZnJvbV9zZWFyY2goJGF0dHMpIHsNCgkkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19w
YXJhbWV0ZXIoYXJyYXkoKSwgZmFsc2UpOw0KCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3RhZ19w
YXJhbWV0ZXInID0+ICR0YWdfcGFyYW1ldGVyKSwgICRhdHRzLCAwKSk7DQoJaWYgKCFlbXB0
eSgkdGFnX3BhcmFtZXRlcikpIHsNCiAgICAgICAgJHRhZ3NfZmllbGQgPSBUUlVfVEFHU19G
SUVMRDsNCgkJJGFsbF90YWdzID0gYXJyYXkoKTsNCg0KCQkkcXVlcnlfYXR0cyA9IHRydV90
YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1ldGVyKTsNCgkJJHJzID0g
dHJ1X3RhZ3NfcmVkb19hcnRpY2xlX3NlYXJjaCgkcXVlcnlfYXR0cyk7DQoJCWlmICgkcnMp
IHsNCgkJCXdoaWxlICgkYSA9IG5leHRSb3coJHJzKSkgew0KCQkJCSRhcnRpY2xlX3RhZ3Mg
PSBhcnJheSgpOw0KCQkJCWlmIChpc3NldCgkYVskdGFnc19maWVsZF0pKSB7DQoJCQkJCSRh
cnRpY2xlX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRh
WyR0YWdzX2ZpZWxkXSkpKTsNCgkJCQl9DQoJCQkJIyBmYXN0ZXIgaW1wbGVtZW50YXRpb24g
b2YgYXJyYXlfbWVyZ2UoKSwgdGhhbmtzIHRvIHdob2NhcmV6DQoJCQkJIyAoaHR0cDovL2Zv
cnVtLnRleHRwYXR0ZXJuLmNvbS92aWV3dG9waWMucGhwP3BpZD0yMzgzNzMjcDIzODM3MykN
CgkJCQlmb3JlYWNoKHRydV90YWdzX3RyaW1fdGFncygkYXJ0aWNsZV90YWdzKSBhcyAkaSkg
eyRhbGxfdGFnc1tdID0gJGk7fQ0KCQkJfQ0KCQl9DQoNCgkJJGFsdF90YWdfcGFyYW1ldGVy
ID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKTsNCgkJZm9yZWFjaCAo
JGFsbF90YWdzIGFzICRrZXkgPT4gJHRhZykgew0KCQkJaWYgKCR0YWcgPT0gJHRhZ19wYXJh
bWV0ZXIgfHwgJHRhZyA9PSAkYWx0X3RhZ19wYXJhbWV0ZXIpIHsNCgkJCQl1bnNldCgkYWxs
X3RhZ3NbJGtleV0pOw0KCQkJfQ0KCQl9DQoNCgkJJGNsb3VkX2F0dHMgPSB0cnVfdGFnc19n
ZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIGZhbHNlKTsNCgkJJGFsbF90
YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3RhZ3M7DQoJCWlmICgkY2xvdWRfYXR0c1sndXNlb3Zl
cmFsbGNvdW50cyddKSB7DQoJCQkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9IHRydV90YWdzX2Ns
b3VkX3F1ZXJ5KCRjbG91ZF9hdHRzKTsNCgkJfQ0KDQoJCXJldHVybiB0cnVfdGFnc19yZW5k
ZXJfY2xvdWQoJGNsb3VkX2F0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQp
Ow0KCX0gZWxzZSB7DQoJCXJldHVybiAnJzsNCgl9DQp9DQoNCg0KIyMjIENMT1VEIFNVUFBP
UlQgRlVOQ1RJT05TICMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpm
dW5jdGlvbiB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgJGlzTGlz
dCwgJGlzQXJ0aWNsZSwgJHNob3dBbGw9ZmFsc2UpIHsNCglyZXR1cm4gbEF0dHMoYXJyYXko
J3dyYXB0YWcnCT0+ICgkaXNMaXN0ID8gJ3VsJyA6ICcnKSwNCgkJCSdicmVhaycJCT0+ICgk
aXNMaXN0ID8gJ2xpJyA6ICcsICcpLA0KCQkJJ2NsYXNzJwkJPT4gJycsDQoJCQknYnJlYWtj
bGFzcycJPT4gJycsDQoJCQknc2VjdGlvbicJPT4gJycsDQoJCQknbWlucGVyY2VudCcJPT4g
JzEwMCcsDQoJCQknbWF4cGVyY2VudCcJPT4gKCRpc0xpc3QgfHwgJGlzQXJ0aWNsZSA/ICcx
MDAnIDogJzIwMCcpLA0KCQkJJ3Nob3djb3VudHMnCT0+ICcnLA0KCQkJJ2NvdW50d3JhcGNo
YXJzJwk9PiAnW10nLA0KCQkJJ3VzZXJlbHRhZycJPT4gKCRpc0FydGljbGUgPyAnMScgOiAn
JyksDQoJCQknZ2VuZXJhdGVsaW5rcycJPT4gJzEnLA0KCQkJJ21pbnRhZ2NvdW50Jwk9PiAn
MCcsDQoJCQknbWF4dGFnY291bnQnCT0+ICcxMDAwJywNCgkJCSdzZXRzaXplcycJPT4gKCRp
c0FydGljbGUgPyAnMCcgOiAnMScpLA0KCQkJJ3VzZW5vZm9sbG93Jwk9PiAnJywNCgkJCSdz
b3J0JwkJPT4gJ2FscGhhJywNCgkJCSd1c2VvdmVyYWxsY291bnRzJwk9PiAnJywNCgkJCSdz
ZXRjbGFzc2VzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyksDQoJCQkndGl0bGUnCQk9
PiAnJywNCgkJCSdsaXN0bGltaXQnCT0+ICcnLA0KCQkJJ2tlZXAnCQk9PiAnbGFyZ2VzdCcs
DQoJCQknY3V0b2ZmJwk9PiAnY2h1bmsnLA0KCQkJJ3RleHR0cmFuc2Zvcm0nCT0+ICdub25l
JywNCgkJCSdsaW5rcGF0aCcJPT4gJycsDQoJCQknbGlua3BhdGh0YWlsJwk9PiAnJywNCgkJ
CSdmaWx0ZXJzZWFyY2gnCT0+ICgkc2hvd0FsbCA/IDAgOiAnMScpLA0KCQkJJ2V4Y2x1ZGVz
ZWN0aW9uJz0+ICcnLA0KCQkJJ2FjdGl2ZWNsYXNzJwk9PiAndGFnQWN0aXZlJywNCgkJCSd0
aW1lJwkJPT4gKCRzaG93QWxsID8gJ2FueScgOiAncGFzdCcpDQoJCSksJGF0dHMsIDApOw0K
fQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSB7DQoJZXh0cmFj
dCgkYXR0cyk7DQoNCgkkc2VjdGlvbl9jbGF1c2UgPSAnJzsNCglpZiAoJHNlY3Rpb24gPD4g
JycpIHsNCgkJJGtleXMgPSBleHBsb2RlKCcsJywgJHNlY3Rpb24pOw0KCQlmb3JlYWNoICgk
a2V5cyBhcyAka2V5KSB7DQoJCQkka2V5cGFydHNbXSA9ICIgU2VjdGlvbiA9ICciIC4gdHJp
bSgka2V5KSAuICInIjsNCgkJfQ0KCQkkc2VjdGlvbl9jbGF1c2UgPSAiIEFORCAoIiAuIGpv
aW4oJyBvciAnLCAka2V5cGFydHMpIC4gIikiOw0KCX0NCg0KCSR0YWdzX2ZpZWxkID0gVFJV
X1RBR1NfRklFTEQ7DQoJaW5jbHVkZV9vbmNlIHR4cGF0aC4nL3B1Ymxpc2gvc2VhcmNoLnBo
cCc7DQoNCgkkZmlsdGVyID0gdHJ1X3RhZ3NfZmlsdGVyX3NlY3Rpb25zKCRleGNsdWRlc2Vj
dGlvbik7DQoJJGZpbHRlciAuPSAoJGZpbHRlcnNlYXJjaCA/IGZpbHRlclNlYXJjaCgpIDog
JycpOw0KDQoJc3dpdGNoICgkdGltZSkgew0KCQljYXNlICdhbnknOg0KCQkJJHRpbWUgPSAi
IjsgYnJlYWs7DQoJCWNhc2UgJ2Z1dHVyZSc6DQoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA+
IG5vdygpIjsgYnJlYWs7DQoJCWRlZmF1bHQ6DQoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA8
PSBub3coKSI7DQoJfQ0KCWdsb2JhbCAkcHJlZnM7DQoJZXh0cmFjdCgkcHJlZnMpOw0KCWlm
ICghJHB1Ymxpc2hfZXhwaXJlZF9hcnRpY2xlcykgew0KCQkkdGltZSAuPSAiIGFuZCAobm93
KCkgPD0gRXhwaXJlcyBvciBFeHBpcmVzIElTIE5VTEwpIjsNCgl9DQoNCgkkYWxsX3RhZ3Mg
PSBhcnJheSgpOw0KCSRycyA9IHNhZmVfcm93cygiJHRhZ3NfZmllbGQiLCAidGV4dHBhdHRl
cm4iLCAiJHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rpb25fY2xhdXNlIC4gJGZpbHRlciAu
ICIgYW5kIFN0YXR1cyA+PSAnNCciIC4gJHRpbWUpOw0KCWZvcmVhY2ggKCRycyBhcyAkcm93
KSB7DQoJCSR0ZW1wX2FycmF5ID0gYXJyYXkoKTsNCgkJaWYgKGlzc2V0KCRyb3dbJHRhZ3Nf
ZmllbGRdKSkgew0KCQkJJHRlbXBfYXJyYXkgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFn
c19zdHJ0b2xvd2VyKCRyb3dbJHRhZ3NfZmllbGRdKSkpOw0KCQl9DQoJCSMgZmFzdGVyIGlt
cGxlbWVudGF0aW9uIG9mIGFycmF5X21lcmdlKCksIHRoYW5rcyB0byB3aG9jYXJleg0KCQkj
IChodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTIzODM3
MyNwMjM4MzczKQ0KCQlmb3JlYWNoKHRydV90YWdzX3RyaW1fdGFncygkdGVtcF9hcnJheSkg
YXMgJGkpIHskYWxsX3RhZ3NbXSA9ICRpO30NCgl9DQoNCglyZXR1cm4gJGFsbF90YWdzOw0K
fQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2ZpbHRlcl9zZWN0aW9ucygkZXhjbHVkZXNlY3Rp
b24pIHsNCgkkc2VjdGlvbnMgPSBleHBsb2RlKCcsJywgJGV4Y2x1ZGVzZWN0aW9uKTsNCgkk
ZmlsdGVycyA9IGFycmF5KCk7DQoJZm9yZWFjaCAoJHNlY3Rpb25zIGFzICRzZWN0aW9uKSB7
DQoJCSRmaWx0ZXJzW10gPSAiYW5kIFNlY3Rpb24gIT0gJyIuZG9TbGFzaCgkc2VjdGlvbiku
IiciOw0KCX0NCglyZXR1cm4gam9pbignICcsICRmaWx0ZXJzKTsNCn0NCg0KDQpmdW5jdGlv
biB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zv
cl93ZWlnaHQpIHsNCglnbG9iYWwgJHRydV90YWdzX3ByZWZzOw0KCWV4dHJhY3QoJGF0dHMp
Ow0KDQoJJHRhZ3Nfd2VpZ2h0ID0gYXJyYXlfY291bnRfdmFsdWVzKCRhbGxfdGFnc19mb3Jf
d2VpZ2h0KTsNCg0KCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQp
IHsNCgkJaWYgKCFpbl9hcnJheSgkdGFnLCAkYWxsX3RhZ3MpDQoJCSAgIHx8ICR0YWdzX3dl
aWdodFskdGFnXSA8ICRtaW50YWdjb3VudA0KCQkgICB8fCAkdGFnc193ZWlnaHRbJHRhZ10g
PiAkbWF4dGFnY291bnQpIHsNCgkJCXVuc2V0KCR0YWdzX3dlaWdodFskdGFnXSk7DQoJCX0N
Cgl9DQoNCgkkc29ydF9ieV9jb3VudCA9IChzdHJwb3MoJHNvcnQsICdjb3VudCcpICE9PSBm
YWxzZSk7DQoJJHNvcnRfYXNjZW5kaW5nID0gKHN0cnBvcygkc29ydCwgJ2FzYycpICE9PSBm
YWxzZSk7DQoJJHRhZ3Nfd2VpZ2h0ID0gdHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdo
dCwgJHNvcnRfYnlfY291bnQsICRzb3J0X2FzY2VuZGluZyk7DQoNCglpZiAoJGxpc3RsaW1p
dCA+IDAgJiYgJGxpc3RsaW1pdCA8IGNvdW50KCR0YWdzX3dlaWdodCkpIHsNCgkJJHJlc29y
dGVkX3RhZ3MgPSBhcnJheSgpOw0KCQlpZiAoJGtlZXAgPT0gJ2xhcmdlc3QnKSB7DQoJCQkk
cmVzb3J0ZWRfdGFncyA9IGFycmF5X2tleXModHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dl
aWdodCwgdHJ1ZSwgZmFsc2UpKTsNCgkJfSBlbHNlIHsNCgkJCWlmICgka2VlcCA9PSAncmFu
ZG9tJykgew0KCQkJCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQp
IHsNCgkJCQkJJHJlc29ydGVkX3RhZ3NbJHRhZ10gPSByYW5kKDAsICR3ZWlnaHQpOw0KCQkJ
CX0NCgkJCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2tleXModHJ1X3RhZ3Nfc29ydF90YWdz
KCRyZXNvcnRlZF90YWdzLCB0cnVlLCBmYWxzZSkpOw0KCQkJfSBlbHNlIGlmICgka2VlcCA9
PSAnYWxwaGEnKSB7DQoJCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKCR0YWdzX3dl
aWdodCk7DQoJCQkJbmF0Y2FzZXNvcnQoJHJlc29ydGVkX3RhZ3MpOw0KCQkJfQ0KCQkJJGN1
dG9mZiA9ICdleGFjdCc7DQoJCX0NCg0KCQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1p
dCAtIDE7DQoJCWlmICgkY3V0b2ZmID09ICdjaHVuaycpIHsgLy9hbHRlcm5hdGl2ZSBpcyAn
ZXhhY3QnDQoJCQkkbGFzdF93ZWlnaHQgPSAtMTsNCgkJCWZvciAoJGkgPSAwOyAkaSA8ICRs
aXN0bGltaXQgKyAxOyAkaSsrKSB7DQoJCQkJJG5ld193ZWlnaHQgPSAkdGFnc193ZWlnaHRb
JHJlc29ydGVkX3RhZ3NbJGldXTsNCgkJCQlpZiAoJG5ld193ZWlnaHQgIT0gJGxhc3Rfd2Vp
Z2h0KSB7DQoJCQkJCSRsYXN0X2dvb2RfaW5kZXggPSAkaSAtIDE7DQoJCQkJCSRsYXN0X3dl
aWdodCA9ICRuZXdfd2VpZ2h0Ow0KCQkJCX0NCgkJCX0NCgkJCWlmICgkbGFzdF9nb29kX2lu
ZGV4IDwgMCkgew0KCQkJCSRsYXN0X2dvb2RfaW5kZXggPSAkbGlzdGxpbWl0IC0gMTsNCgkJ
CX0NCgkJfQ0KDQoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfY2h1bmsoJHJlc29ydGVkX3Rh
Z3MsICRsYXN0X2dvb2RfaW5kZXggKyAxKTsNCgkJJHJlc29ydGVkX3RhZ3MgPSAkcmVzb3J0
ZWRfdGFnc1swXTsNCg0KCQlmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2Vp
Z2h0KSB7DQoJCQlpZiAoIWluX2FycmF5KCR0YWcsICRyZXNvcnRlZF90YWdzKSkgew0KCQkJ
CXVuc2V0KCR0YWdzX3dlaWdodFskdGFnXSk7DQoJCQl9DQoJCX0NCgl9DQoNCglpZiAoJGdl
bmVyYXRlbGlua3MpIHsNCgkJaWYgKCRsaW5rcGF0aCkgew0KCQkJJHVybHByZWZpeCA9ICRs
aW5rcGF0aDsNCgkJCSR1cmxzdWZmaXggPSAkbGlua3BhdGh0YWlsOw0KCQl9IGVsc2Ugew0K
CQkJaWYgKHRydV90YWdzX2NsZWFuX3VybHMoKSkgew0KCQkJCSR1cmxwcmVmaXggPSBodSAu
ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJy8nOw0KCQkJfSBlbHNl
IHsNCgkJCQkkdXJscHJlZml4ID0gaHUgLiAnP3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdf
U0VDVElPTl0tPnZhbHVlIC4gJyZhbXA7JyAuICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVd
LT52YWx1ZSAuICc9JzsNCgkJCX0NCgkJCSR1cmxzdWZmaXggPSAodHJ1X3RhZ3NfY2xlYW5f
dXJscygpID8gJy8nIDogJycpOw0KCQl9DQoNCgkJaWYgKCR1c2VyZWx0YWcpIHsNCgkJCWlm
ICgkdXNlbm9mb2xsb3cpIHsNCgkJCQkkdXJsc3VmZml4IC49ICciIHJlbD0idGFnIG5vZm9s
bG93JzsNCgkJCX0gZWxzZSB7DQoJCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9InRhZyc7DQoJ
CQl9DQoJCX0gZWxzZSBpZiAoJHVzZW5vZm9sbG93KSB7DQoJCQkkdXJsc3VmZml4IC49ICci
IHJlbD0ibm9mb2xsb3cnOw0KCQl9DQoJfQ0KDQoJaWYgKGNvdW50KCR0YWdzX3dlaWdodCkg
PiAwKSB7DQoJCSRtYXggPSBtYXgoJHRhZ3Nfd2VpZ2h0KTsNCgkJJG1pbiA9IG1pbigkdGFn
c193ZWlnaHQpOw0KCX0gZWxzZSB7DQoJCSRtYXggPSAkbWluID0gMDsNCgl9DQoJJHN0ZXB2
YWx1ZSA9ICgkbWF4ID09ICRtaW4pID8gMCA6ICgkbWF4cGVyY2VudCAtICRtaW5wZXJjZW50
KSAvICgkbWF4IC0gJG1pbik7DQoNCgkkdGFnc19odG1sID0gYXJyYXkoKTsNCgkkdGFnX3Nl
YXJjaF90YWcgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCdzdHJpcGh5cGhlbnMn
ID0+ICdsb29rdXAnKSk7DQoJJHRhZ19zZWFyY2hfdGFnID0gZnVuY3Rpb25fZXhpc3RzKCJo
dG1sc3BlY2lhbGNoYXJzX2RlY29kZSIpID8gaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUoJHRh
Z19zZWFyY2hfdGFnKSA6IGh0bWxfZW50aXR5X2RlY29kZSgkdGFnX3NlYXJjaF90YWcpOw0K
CWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsNCgkJJHRhZ193
ZWlnaHQgPSBmbG9vcigkbWlucGVyY2VudCArICgkd2VpZ2h0IC0gJG1pbikgKiAkc3RlcHZh
bHVlKTsNCg0KCQkkc3R5bGUgPSAnJzsNCgkJaWYgKCRzZXRzaXplcykNCgkJCSRzdHlsZSA9
ICcgc3R5bGU9ImZvbnQtc2l6ZTogJyAuICR0YWdfd2VpZ2h0IC4gJyU7Iic7DQoNCgkJJHRh
Z19jbGFzcyA9ICcnOw0KCQlpZiAoJHNldGNsYXNzZXMpIHsNCgkJCSR0YWdfY2xhc3MgPSAn
IGNsYXNzPSInOw0KCQkJaWYgKCR3ZWlnaHQgPT0gJG1pbikgew0KCQkJCSR0YWdfY2xhc3Mg
Lj0gInRhZ1NpemVTbWFsbGVzdCI7DQoJCQl9IGVsc2UgaWYgKCR3ZWlnaHQgPT0gJG1heCkg
ew0KCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVMYXJnZXN0IjsNCgkJCX0gZWxzZSB7DQoJ
CQkJJHRhZ19jbGFzcyAuPSAidGFnU2l6ZU1lZGl1bSI7DQoJCQl9DQoJCQkkdGFnX2NsYXNz
IC49ICcgdGFnU2l6ZScgLiAoJHdlaWdodCArIDEgLSAkbWluKTsNCgkJCWlmICgkdGFnID09
ICR0YWdfc2VhcmNoX3RhZykgew0KCQkJCSR0YWdfY2xhc3MgLj0gJyAnIC4gJGFjdGl2ZWNs
YXNzOw0KCQkJfQ0KCQkJJHRhZ19jbGFzcyAuPSAnIic7DQoJCX0NCg0KCQkvL2FkYXB0ZWQg
ZnJvbSBjb2RlIGJ5IGdkdHJvaWFubywgc2VlIGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5j
b20vdmlld3RvcGljLnBocD9waWQ9MTAyODc1I3AxMDI4NzUNCgkJJHRpdGxlY291bnQgPSAn
JzsNCgkJaWYgKCR0aXRsZSkNCgkJCSR0aXRsZWNvdW50ID0gJyB0aXRsZT0iJyAuICR0aXRs
ZSAuICciJzsNCgkJJGRpc3BsYXljb3VudD0gJyc7DQoJCSRjb3VudCA9ICRjb3VudHdyYXBj
aGFyc3swfSAuICR3ZWlnaHQgLiAkY291bnR3cmFwY2hhcnN7MX07DQoJCWlmICgkc2hvd2Nv
dW50cyA9PSAndGl0bGUnIHx8ICRzaG93Y291bnRzID09ICdib3RoJykNCgkJCSR0aXRsZWNv
dW50ID0gJyB0aXRsZT0iJyAuICR0aXRsZSAuICRjb3VudCAuICciJzsNCgkJaWYgKCRzaG93
Y291bnRzICYmICRzaG93Y291bnRzICE9ICd0aXRsZScpDQoJCQkkZGlzcGxheWNvdW50ID0g
JyAnIC4gJGNvdW50Ow0KDQoJCWlmICgkdGV4dHRyYW5zZm9ybSA9PSAnY2FwaXRhbGl6ZScp
IHsNCgkJCSR0YWcgPSB0cnVfdGFnc191Y3dvcmRzKCR0YWcpOw0KCQl9IGVsc2UgaWYgKCR0
ZXh0dHJhbnNmb3JtID09ICd1cHBlcmNhc2UnKSB7DQoJCQkkdGFnID0gdHJ1X3RhZ3Nfc3Ry
dG91cHBlcigkdGFnKTsNCgkJfSBlbHNlIGlmICgkdGV4dHRyYW5zZm9ybSA9PSAnbG93ZXJj
YXNlJykgew0KCQkJJHRhZyA9IHRydV90YWdzX3N0cnRvbG93ZXIoJHRhZyk7DQoJCX0gZWxz
ZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2NhcGZpcnN0Jykgew0KCQkJJHRhZyA9IHRydV90
YWdzX3VjZmlyc3QoJHRhZyk7DQoJCX0NCg0KCQlpZiAoJGdlbmVyYXRlbGlua3MpIHsNCgkJ
CSR3aG9sZXVybCA9ICciJyAuICR1cmxwcmVmaXggLiB1cmxlbmNvZGUoJHRhZykgLiAkdXJs
c3VmZml4IC4gJyInOw0KCQkJJHRhZ3NfaHRtbFtdID0gJzxhIGhyZWY9JyAuICR3aG9sZXVy
bCAuICR0YWdfY2xhc3MgLiAkc3R5bGUgLiAkdGl0bGVjb3VudCAuICc+JyAuIGh0bWxzcGVj
aWFsY2hhcnMoJHRhZykgLiAnPC9hPicgLiAkZGlzcGxheWNvdW50Ow0KCQl9IGVsc2UgaWYg
KCR0YWdfY2xhc3MgfHwgJHN0eWxlIHx8ICR0aXRsZWNvdW50KSB7DQoJCQkkdGFnc19odG1s
W10gPSAnPHNwYW4nIC4gJHRhZ19jbGFzcyAuICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4n
IC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L3NwYW4+JyAuICRkaXNwbGF5Y291bnQ7
DQoJCX0gZWxzZSB7DQoJCQkkdGFnc19odG1sW10gPSBodG1sc3BlY2lhbGNoYXJzKCR0YWcp
IC4gJGRpc3BsYXljb3VudDsNCgkJfQ0KCX0NCglyZXR1cm4gdHJ1X3RhZ3NfZG9fd3JhcCgk
dGFnc19odG1sLCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKTsNCn0N
Cg0KDQojIyMgQ0xFQU4gVVJMIEZVTkNUSU9OUyAjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIw0KDQppZiAodHJ1X3RhZ3NfY2xlYW5fdXJscygpKSB7DQoJcmVnaXN0ZXJfY2Fs
bGJhY2soJ3RydV90YWdzX2NsZWFuX3VybF9oYW5kbGVyJywgJ3ByZXRleHQnKTsNCn0NCg0K
DQpmdW5jdGlvbiB0cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7
DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCgkkc3VicGF0aCA9IHByZWdfcmVwbGFjZSgi
L2h0dHBzPzpcL1wvLiooXC8uKikvVWkiLCIkMSIsaHUpOw0KCSRyZWdzYWZlc3VicGF0aCA9
IHByZWdfcXVvdGUoJHN1YnBhdGgsICcvJyk7DQoJJHJlcSA9IHByZWdfcmVwbGFjZSgiL14k
cmVnc2FmZXN1YnBhdGgvaSIsJy8nLCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKTsNCg0KCSRx
cyA9IHN0cnBvcygkcmVxLCAnPycpOw0KCSRxYXR0cyA9ICgkcXMgPyAnJicuc3Vic3RyKCRy
ZXEsICRxcyArIDEpIDogJycpOw0KCWlmICgkcXMpICRyZXEgPSBzdWJzdHIoJHJlcSwgMCwg
JHFzKTsNCg0KCSRwYXJ0cyA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoZXhwbG9kZSgn
LycsICRyZXEpKSk7DQoJaWYgKGNvdW50KCRwYXJ0cykgPT0gMiAmJiAkcGFydHNbMF0gPT0g
JHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUpIHsNCgkJJHRhZyA9ICRwYXJ0
c1sxXTsNCgkJJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddID0gJHRydV90YWdzX3ByZWZzW1BB
Uk1fTkFNRV0tPnZhbHVlIC4gJz0nIC4gJHRhZyAuICRxYXR0czsNCgkJJF9TRVJWRVJbJ1JF
UVVFU1RfVVJJJ10gPSAkc3VicGF0aCAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0t
PnZhbHVlIC4gJy8/JyAuICRfU0VSVkVSWydRVUVSWV9TVFJJTkcnXTsNCgkJaWYgKGNvdW50
KCRfUE9TVCkgPiAwKSB7DQoJCQkkX1BPU1RbJ3NlY3Rpb24nXSA9ICR0cnVfdGFnc19wcmVm
c1tUQUdfU0VDVElPTl0tPnZhbHVlOw0KCQkJJF9QT1NUWyR0cnVfdGFnc19wcmVmc1tQQVJN
X05BTUVdLT52YWx1ZV0gPSAkdGFnOw0KCQl9IGVsc2Ugew0KCQkJJF9HRVRbJ3NlY3Rpb24n
XSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOw0KCQkJJF9HRVRbJHRy
dV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7DQoJCX0NCgl9DQp9DQoN
Cg0KZnVuY3Rpb24gdHJ1X3RhZ3NfY2xlYW5fdXJscygpIHsNCglnbG9iYWwgJHRydV90YWdz
X3ByZWZzOw0KCXJldHVybiAoJ2NsZWFuJyA9PSAkdHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJM
U10tPnZhbHVlKTsNCn0NCg0KDQojIyMgQURNSU4gU0lERSBGVU5DVElPTlMgIyMjDQojIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmlmIChAdHhwaW50ZXJmYWNlID09ICdhZG1p
bicpIHsNCglhZGRfcHJpdnMoJ3RydV90YWdzJywgJzEsMicpOw0KCXJlZ2lzdGVyX3RhYign
ZXh0ZW5zaW9ucycsICd0cnVfdGFncycsICd0cnVfdGFncycpOw0KCXJlZ2lzdGVyX2NhbGxi
YWNrKCd0cnVfdGFnc19hZG1pbl90YWInLCAndHJ1X3RhZ3MnKTsNCg0KCWlmICgkdHJ1X3Rh
Z3NfcHJlZnNbVEFHU19JTl9XUklURV9UQUJdLT52YWx1ZSB8fCAkdHJ1X3RhZ3NfcHJlZnNb
QVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQl0tPnZhbHVlKSB7DQoJCXJlZ2lzdGVyX2NhbGxi
YWNrKCd0cnVfdGFnc19hZG1pbl93cml0ZV90YWJfaGFuZGxlcicsICdhcnRpY2xlJyk7DQoJ
fQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3RhYigkZXZlbnQsICRzdGVwKSB7
DQoJcmVxdWlyZV9wcml2cygndHJ1X3RhZ3MnKTsNCg0KCSRyZXN1bHRzID0gdHJ1X3RhZ3Nf
YWRtaW5fdGFiX2hhbmRsZV9pbnB1dCgpOw0KDQoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3Rh
bmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgZmFsc2UsIHRydWUpOw0KCSRhbGxf
dGFncyA9IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsNCgkkY2xvdWQgPSB0cnVfdGFn
c19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzKTsNCg0KCSRyZWRp
cmVjdHMgPSB0cnVfdGFnc19sb2FkX3JlZGlyZWN0cygpOw0KDQoJdHJ1X3RhZ3NfYWRtaW5f
dGFiX3JlbmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpOw0KfQ0KDQoN
CmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3RhYl9yZW5kZXJfcGFnZSgkcmVzdWx0cywgJGNs
b3VkLCAkcmVkaXJlY3RzKSB7DQoJZ2xvYmFsICRldmVudDsNCglwYWdldG9wKCd0cnVfdGFn
cycsICcnKTsNCg0KCWluY2x1ZGVfb25jZSh0eHBhdGggLiAnL2luY2x1ZGUvdHhwX3ByZWZz
LnBocCcpOw0KCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoNCgllY2hvIHN0YXJ0VGFibGUo
J2xheW91dCcsICcnLCAnJywgJzEwcHgnKS4nPHRyPjx0ZCBzdHlsZT0iYm9yZGVyLXJpZ2h0
OjJweCBzb2xpZCBncmF5Ij4nLiAgIyBJIGtub3csIEkga25vdy4uLg0KCQlzdGFydFRhYmxl
KCdsYXlvdXQnLCAnJywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXIt
Ym90dG9tOjJweCBzb2xpZCBncmF5Ij4nLg0KCQkJc3RhcnRUYWJsZSgnbGlzdCcsICcnLCAn
JywgJycsICczMDBweCcpLg0KCQkJCXRyKGhDZWxsKGdUeHQoJ0N1cnJlbnQgdGFncycpKSku
DQoJCQkJdHIodGQoJGNsb3VkKSkuDQoJCQllbmRUYWJsZSgpLg0KCQknPC90ZD48L3RyPjx0
cj48dGQ+Jy4NCgkJCXN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMzAwcHgnKS4N
CgkJCQl0cihoQ2VsbChnVHh0KCd0cnVfdGFncyBSZWZlcmVuY2UnKSkpLg0KCQkJCXRyKHRk
KCc8YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk3L3RydXRh
Z3MtdXNhZ2UtaW5zdHJ1Y3Rpb25zIj5Vc2FnZSBpbnN0cnVjdGlvbnM8L2E+Jy4NCgkJCQkn
PGJyPjxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBo
cD9pZD0xNTA4NCI+Rm9ydW0gcGFnZXM8L2E+Jy4NCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6
Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVsZWFzZXMiPlJl
bGVhc2VzIHBhZ2U8L2E+Jy4NCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNr
aXQuY29tL3JlZmVyZW5jZS81NTQvdHJ1X3RhZ3Mtcm9hZG1hcCI+UmVsZWFzZSByb2FkbWFw
PC9hPicuDQoJCQkJJzxicj48YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZl
cmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVyZS1saXN0Ij5GZWF0dXJlIGxpc3Q8L2E+Jy4NCgkJ
CQknPGJyPjxicj48YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdHJ1LXRhZ3Mv
c291cmNlL2Jyb3dzZS90cnVuay90cnVfdGFncy5waHAiPnRydV90YWdzIHNvdXJjZSBjb2Rl
PC9hPicuDQoJCQkJJzxicj48YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdHJ1
LXRhZ3Mvc291cmNlL2Jyb3dzZS90cnVuay90cnVfdGFncy1kb2NzLmh0bWwiPlNvdXJjZSBI
VE1MIGZvciB0aGUgdXNhZ2UgaW5zdHJ1Y3Rpb25zPC9hPicuDQoJCQkJJzxicj48YnI+PGEg
aHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dp
bmctcGx1Z2luLWZvci10ZXh0cGF0dGVybiI+dHJ1X3RhZ3M8L2E+LCBieSA8YSBocmVmPSJo
dHRwOi8vd3d3LnJhaW5za2l0LmNvbS8iPk5hdGhhbiBBcnRodXI8L2E+Jy4NCgkJCQknPGJy
Pjxicj4nLg0KCQkJCSc8ZGl2IGlkPSJwYXlwYWwiPjxmb3JtIGFjdGlvbj0iaHR0cHM6Ly93
d3cucGF5cGFsLmNvbS9jZ2ktYmluL3dlYnNjciIgbWV0aG9kPSJwb3N0Ij48aW5wdXQgdHlw
ZT0iaGlkZGVuIiBuYW1lPSJjbWQiIHZhbHVlPSJfcy14Y2xpY2siIC8+PGlucHV0IHR5cGU9
ImltYWdlIiBzcmM9Imh0dHBzOi8vd3d3LnBheXBhbC5jb20vZW5fVVMvaS9idG4veC1jbGlj
ay1idXQwNC5naWYiIG5hbWU9InN1Ym1pdCIgYWx0PSJNYWtlIGEgZG9uYXRpb24gdG8gTmF0
aGFuIEFydGh1ciIgLz48aW1nIGFsdD0iIiBib3JkZXI9IjAiIHNyYz0iaHR0cHM6Ly93d3cu
cGF5cGFsLmNvbS9lbl9VUy9pL3Njci9waXhlbC5naWYiIHdpZHRoPSIxIiBoZWlnaHQ9IjEi
IC8+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZW5jcnlwdGVkIiB2YWx1ZT0iLS0tLS1C
RUdJTiBQS0NTNy0tLS0tTUlJSFR3WUpLb1pJaHZjTkFRY0VvSUlIUURDQ0J6d0NBUUV4Z2dF
d01JSUJMQUlCQURDQmxEQ0JqakVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFrTkJN
Ull3RkFZRFZRUUhFdzFOYjNWdWRHRnBiaUJXYVdWM01SUXdFZ1lEVlFRS0V3dFFZWGxRWVd3
Z1NXNWpMakVUTUJFR0ExVUVDeFFLYkdsMlpWOWpaWEowY3pFUk1BOEdBMVVFQXhRSWJHbDJa
VjloY0dreEhEQWFCZ2txaGtpRzl3MEJDUUVXRFhKbFFIQmhlWEJoYkM1amIyMENBUUF3RFFZ
SktvWklodmNOQVFFQkJRQUVnWUM4aTFUMjdsaktmcE5URVFpMHdLSGNkR3VseHhrTXF3ZENN
bWJHdnM4N24vNFRzSnRpQXNxTW8yaHlzN1pzR3k1UkYvTzdzK0Iyb1E3NnpVbFQ1MldXN1Fl
WFVLM0dwMG5yMmNQM2lvQlN0TnUrUlo2amthbTJFMEZHTFh5VjYrVU5WRU93aDhsbW9JU1Jv
dHZTdklnUXlUTG5FZURIcUc5cXZVenF2RjNTcWpFTE1Ba0dCU3NPQXdJYUJRQXdnY3dHQ1Nx
R1NJYjNEUUVIQVRBVUJnZ3Foa2lHOXcwREJ3UUlwbVBacmxyWmZabUFnYWllUFZiK245c1Zk
c3VmZ0dybUF3MnJYQXpSMzlrWXFQVUo3bjBMaU5EbWRBcTczSm9QNTNrWnk4Z1Nwb3Z1Y0wy
UzBqQzFzWHJjcEVMQXBMTDhCRlNIZmRMaVpvWlNWL0NZT3BwSDUrZHgyWXFGSWR5Q0NkaklY
N29PUGdReUF1Z1JhMlFyM2IreXV0dUcwREZzZCtMQUpHYjhsNENubnJibXdkWUszTm5WREJQ
T214RU9qbFhVZ0V6bEZMWG1FM3c1K01vUEtRY3AybjhmZEpMc2dHMTV4b1ZQRnpDZC9LMmdn
Z09ITUlJRGd6Q0NBdXlnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQ0JqakVMTUFr
R0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFrTkJNUll3RkFZRFZRUUhFdzFOYjNWdWRHRnBi
aUJXYVdWM01SUXdFZ1lEVlFRS0V3dFFZWGxRWVd3Z1NXNWpMakVUTUJFR0ExVUVDeFFLYkds
MlpWOWpaWEowY3pFUk1BOEdBMVVFQXhRSWJHbDJaVjloY0dreEhEQWFCZ2txaGtpRzl3MEJD
UUVXRFhKbFFIQmhlWEJoYkM1amIyMHdIaGNOTURRd01qRXpNVEF4TXpFMVdoY05NelV3TWpF
ek1UQXhNekUxV2pDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQk1SWXdG
QVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFLRXd0UVlYbFFZV3dnU1c1
akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0ExVUVBeFFJYkdsMlpWOWhj
R2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVqYjIwd2daOHdEUVlKS29a
SWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFNRkhUdDM4Uk14TFhKeU8yU21TK05kbDcyVDdv
S0o0dTR1dys2YXdudEFMV2gwM1Bld21JSnV6YkFMU2NzVFM0c1pvUzFmS2NpQkdvaDExZ0lm
SHp5bHZrZE5lL2hKbDY2L1JHcXJqNXJGYjA4c0FBQk5UekRUaXFxTnBKZUJzWXMvYzJhaUdv
enB0WDJSbG5Ca3RIK1NVTnBBYWpXNzI0TnYyV3ZoaWY2c0ZBZ01CQUFHamdlNHdnZXN3SFFZ
RFZSME9CQllFRkphZmZMdkdieGU5V1Q5UzF3b2I3QkRXWkpSck1JRzdCZ05WSFNNRWdiTXdn
YkNBRkphZmZMdkdieGU5V1Q5UzF3b2I3QkRXWkpScm9ZR1VwSUdSTUlHT01Rc3dDUVlEVlFR
R0V3SlZVekVMTUFrR0ExVUVDQk1DUTBFeEZqQVVCZ05WQkFjVERVMXZkVzUwWVdsdUlGWnBa
WGN4RkRBU0JnTlZCQW9UQzFCaGVWQmhiQ0JKYm1NdU1STXdFUVlEVlFRTEZBcHNhWFpsWDJO
bGNuUnpNUkV3RHdZRFZRUURGQWhzYVhabFgyRndhVEVjTUJvR0NTcUdTSWIzRFFFSkFSWU5j
bVZBY0dGNWNHRnNMbU52YllJQkFEQU1CZ05WSFJNRUJUQURBUUgvTUEwR0NTcUdTSWIzRFFF
QkJRVUFBNEdCQUlGZk9sYWFnRnJsNzEranE2T0tpZGJXRlNFK1E0RnFST3ZkZ0lPTnRoKzhr
U0svL1kvNGlodUU0WW12em41Y2VFM1MvaUJTUVFNanl2YitzMlRXYlFZRHdjcDEyOU9QSWJE
OWVwZHI0dEpPVU5pU29qdzdCSHdZUmlQaDU4UzF4R2xGZ0hGWHdyRUJiM2RnTmJNVWErdTRx
ZWN0c01BWHBWSG5EOXdJeWZtSE1ZSUJtakNDQVpZQ0FRRXdnWlF3Z1k0eEN6QUpCZ05WQkFZ
VEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlRXOTFiblJoYVc0Z1ZtbGxk
ekVVTUJJR0ExVUVDaE1MVUdGNVVHRnNJRWx1WXk0eEV6QVJCZ05WQkFzVUNteHBkbVZmWTJW
eWRITXhFVEFQQmdOVkJBTVVDR3hwZG1WZllYQnBNUnd3R2dZSktvWklodmNOQVFrQkZnMXla
VUJ3WVhsd1lXd3VZMjl0QWdFQU1Ba0dCU3NPQXdJYUJRQ2dYVEFZQmdrcWhraUc5dzBCQ1FN
eEN3WUpLb1pJaHZjTkFRY0JNQndHQ1NxR1NJYjNEUUVKQlRFUEZ3MHdPREEzTURNd05ERTBN
VEphTUNNR0NTcUdTSWIzRFFFSkJERVdCQlQwdGtqNGRaTGUvRTRRd2JpYjI5WEVkSHhBWWpB
TkJna3Foa2lHOXcwQkFRRUZBQVNCZ0w1SnNRSGpROVNnNFkzZURXS0RPMTZyK3RmRXo0UllB
RHQrNmg5ODFma1ZDeGZOSEZEeG9mRGN4eXpSTVlyN3k5NWNkblZpNEFOUXdNVVk2eUpXNWpt
L0dEMTdyamdTeFpNRXZzQWU2WWNDU0xLNVphcEN3MXFseVNwUEdaQkEzTVR0Nk9EK292Vm9h
LzF2OENOc0VjSHA3ZjR0T3hPVVN3NVA0bkh5TFBXai0tLS0tRU5EIFBLQ1M3LS0tLS0iPjwv
Zm9ybT48L2Rpdj4nDQoJCQkJKSkuDQoJCQllbmRUYWJsZSgpLg0KCQknPC90ZD48L3RyPicu
ZW5kVGFibGUoKS4NCgknPC90ZD48dGQ+Jy4NCgkJc3RhcnRUYWJsZSgnbGF5b3V0JywgJycs
ICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBn
cmF5O3dpZHRoOjQwMHB4Ij4nOw0KDQoJCWlmICgkcmVzdWx0cykgew0KCQkJZWNobyBzdGFy
dFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4NCgkJCQl0cihoQ2VsbChnVHh0
KCdSZXN1bHRzJykpKS4NCgkJCQl0cih0ZGEoJHJlc3VsdHMpLCAnIHN0eWxlPSJjb2xvcjpy
ZWQiJykuDQoJCQllbmRUYWJsZSgpOw0KCQkJZWNobyAnPC90ZD48L3RyPjx0cj48dGQgc3R5
bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXkiPic7DQoJCX0NCg0KDQoJCWVjaG8g
c3RhcnRUYWJsZSgnbGlzdCcsICcnLCAnJywgJycsICcxMDAlJykuDQoJCQl0cih0YWcoZ1R4
dCgnQXJ0aWNsZSBUYWcgTWFpbnRlbmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2UgU2Vuc2l0aXZl
JykuJyEpJywgJ3RoJywgJyBjb2xzcGFuPSI1IicpKS4NCgkJCXRyKA0KCQkJCWZvcm0oDQoJ
CQkJCXRkYShnVHh0KCdSZW5hbWUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjpt
aWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoJ21hdGNodGFnJywgJycsICcxNScpKS4N
CgkJCQkJdGRhKGdUeHQoJ3RvJykuJzonLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRk
bGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoJ3JlcGxhY2V0YWcnLCAnJywgJzE1JykpLg0K
CQkJCQl0ZChmSW5wdXQoJ3N1Ym1pdCcsICdyZXBsYWNlJywgZ1R4dCgnUnVuJyksICdwdWJs
aXNoJykuZUlucHV0KCd0cnVfdGFncycpKSwNCgkJCQkJJycsICcgdmVyaWZ5KFwnJyAuIGdU
eHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInDQoJCQkJKQ0KCQkJKS4NCgkJCXRyKA0KCQkJ
CWZvcm0oDQoJCQkJCXRkYShnVHh0KCdEZWxldGUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNh
bC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoJ2RlbGV0ZXRhZycsICcn
LCAnMTUnKSkuDQoJCQkJCXRkY3MoJycsIDIpLg0KCQkJCQl0ZChmSW5wdXQoJ3N1Ym1pdCcs
ICdkZWxldGUnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3RydV90YWdzJykp
LA0KCQkJCQknJywgJyB2ZXJpZnkoXCcnIC4gZ1R4dCgnYXJlX3lvdV9zdXJlJykgLiAnXCcp
IicNCgkJCQkpDQoJCQkpLg0KCQllbmRUYWJsZSgpOw0KDQoJZWNobyAnPC90ZD48L3RyPjx0
cj48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXkiPic7DQoNCgkJZWNo
byBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4NCgkJCXRyKHRhZyhn
VHh0KCdSZWRpcmVjdGlvbnMnKSwgJ3RoJywgJyBjb2xzcGFuPSI0IicpKTsNCgkJCWZvcmVh
Y2ggKCRyZWRpcmVjdHMgYXMgJGxlZnR0YWcgPT4gJHJpZ2h0dGFnKSB7DQoJCQkJZWNobyB0
cigNCgkJCQkJdGRhKGhyZWYoJGxlZnR0YWcsIHRydV90YWdzX2xpbmtpZnlfdGFnKCRsZWZ0
dGFnKSksICcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciInKS4NCgkJCQkJdGRhKGh0bWxz
cGVjaWFsY2hhcnMoJz0+JyksICcgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciInKS4NCgkJ
CQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVfdGFnc19saW5raWZ5X3RhZygkcmlnaHR0YWcp
KSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLg0KCQkJCQl0ZCgnPGEgaHJlZj0i
aW5kZXgucGhwP2V2ZW50PXRydV90YWdzJmFtcDtkZWxldGVfcmVkaXJlY3Q9Jy51cmxlbmNv
ZGUoJGxlZnR0YWcpLiciICBvbmNsaWNrPSJyZXR1cm4gdmVyaWZ5KFwnJy5nVHh0KCdhcmVf
eW91X3N1cmUnKS4nXCcpIj5EZWxldGU8L2E+JykNCgkJCQkpOw0KCQkJfQ0KCQkJZWNobyB0
cigNCgkJCQknPGZvcm0gbmFtZT0icmVkaXJlY3QiIGlkPSJyZWRpcmVjdCIgbWV0aG9kPSJw
b3N0IiBhY3Rpb249ImluZGV4LnBocD9ldmVudD10cnVfdGFncyIgb25zdWJtaXQ9InJldHVy
biB2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPicuDQoJCQkJCXRkYSh0
ZXh0X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOmNl
bnRlciInKS4NCgkJCQkJdGRhKGh0bWxzcGVjaWFsY2hhcnMoJz0+JyksICcgc3R5bGU9InZl
cnRpY2FsLWFsaWduOm1pZGRsZTt0ZXh0LWFsaWduOmNlbnRlciInKS4NCgkJCQkJdGRhKHRl
eHRfaW5wdXQoJ3JpZ2h0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOmNl
bnRlciInKS4NCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBvbmNsaWNrPSJpZiAodmVyaWZ5KFwn
Jy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChc
J3JlZGlyZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7Ij5BZGQgbmV3PC9hPicsICcg
c3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJZklucHV0KCdoaWRkZW4n
LCAncmVkaXJlY3QnLCAnMScpLg0KCQkJCSc8L2Zvcm0+Jw0KDQoJCQkpLg0KCQllbmRUYWJs
ZSgpOw0KDQoJZWNobyAnPC90ZD48L3RyPjx0cj48dGQ+JzsNCg0KCQllY2hvIHN0YXJ0VGFi
bGUoJ2xpc3QnKS4NCgkJCXRyKHRhZyhnVHh0KCdQcmVmZXJlbmNlcycpLCAndGgnLCAnIGNv
bHNwYW49IjIiJykpLg0KCQkJZm9ybSgNCgkJCQl0cigNCgkJCQkJdGRhKGdUeHQoJ1VzZSBj
bGVhbiBVUkxzJykuJyAoJy5nVHh0KCdzaXRlIGRlZmF1bHQgaXMnKS4nICcuJHRydV90YWdz
X3ByZWZzW0NMRUFOX1VSTFNdLT5kZWZhdWx0X3ZhbHVlLicpOiAnLCAnIHN0eWxlPSJ2ZXJ0
aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHJhZGlvX2xpc3QoQ0xFQU5fVVJMUywN
CgkJCQkJCQlhcnJheSgnY2xlYW4nPT5nVHh0KCdjbGVhbicpLCAnbWVzc3knPT5nVHh0KCdt
ZXNzeScpKSwNCgkJCQkJCQkkdHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlKSkN
CgkJCQkpLg0KCQkJCXRyKA0KCQkJCQl0ZGEoZ1R4dCgnVGFnIHNlY3Rpb24gbmFtZScpLicg
KGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+ZGVmYXVsdF92
YWx1ZS4nIik6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJ
dGQodGV4dF9pbnB1dChUQUdfU0VDVElPTiwgJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9O
XS0+dmFsdWUsICcxNScpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJCXRkYShnVHh0KCdVUkwg
cGFyYW1ldGVyIGZvciB0YWcgc2VhcmNoJykuJyAoZGVmYXVsdCBpcyAiJy4kdHJ1X3RhZ3Nf
cHJlZnNbUEFSTV9OQU1FXS0+ZGVmYXVsdF92YWx1ZS4nIik6ICcuDQoJCQkJCQknPGJyPjxl
bT4oeW91IHNob3VsZG5cJ3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3
aGF0IHlvdSBhcmUgZG9pbmcpPC9lbT4nLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRk
bGUiJykuDQoJCQkJCXRkKHRleHRfaW5wdXQoUEFSTV9OQU1FLCAkdHJ1X3RhZ3NfcHJlZnNb
UEFSTV9OQU1FXS0+dmFsdWUsICcxNScpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJCXRkYShn
VHh0KCdQdXQgdGFncyBpbnRvIFJTUy9BdG9tIGZlZWRzLCBpbiAiQ2F0ZWdvcnkiIGVsZW1l
bnRzJykuDQoJCQkJCQknOiA8YnI+PGVtPih5b3UgcHJvYmFibHkgd2FudCB0aGlzKTwvZW0+
JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0ZCh5ZXNub1Jh
ZGlvKFRBR1NfSU5fRkVFRF9DQVRFR09SSUVTLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9G
RUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkpDQoJCQkJKS4NCgkJCQl0cigNCgkJCQkJdGRhKCdB
cHBlbmQgdGhlIHRhZyBsaXN0IHRvIHRoZSBib2R5IG9mIFJTUy9BdG9tIGZlZWRzLCAnLg0K
CQkJCQkJJ3dpdGggbGlua3MsIGFuZCB3aXRoIHJlbD0idGFnIjonLg0KCQkJCQkJJzxicj48
ZW0+KGlmIHRoaXMgaXMgdHVybmVkIG9uLCcuDQoJCQkJCQkneW91IGNhbiBkZWZpbmUgYSAi
bWlzYyIgZm9ybSBuYW1lZCB0cnVfdGFnc19mZWVkX3RhZ3MgJy4NCgkJCQkJCSd0aGF0IHdp
bGwgYmUgdXNlZCB0byByZW5kZXIgdGhlIHRhZ3MgaW4gdGhlIGZlZWQpPC9lbT4nLA0KCQkJ
CQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0ZCh5ZXNub1Jh
ZGlvKFRBR1NfSU5fRkVFRF9CT0RZLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0JP
RFldLT52YWx1ZSkpDQoJCQkJKS4NCgkJCQl0cigNCgkJCQkJdGRhKGdUeHQoJ1Nob3cgYSBj
bGlja2FibGUgbGlzdCBvZiB0YWdzIG9uIHRoZSAiV3JpdGUiIHBhZ2UnKS4nOiAnLA0KCQkJ
CQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQl0ZCh5ZXNub1Jh
ZGlvKFRBR1NfSU5fV1JJVEVfVEFCLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9XUklURV9U
QUJdLT52YWx1ZSkpDQoJCQkJKS4NCgkJCQl0cigNCgkJCQkJdGRhKGdUeHQoJ0F1dG9jb21w
bGV0ZSB0YWdzIG9uIHRoZSAiV3JpdGUiIHBhZ2UnKS4nOiA8YnI+Jy4NCgkJCQkJCSc8ZW0+
KHJlcXVpcmVzIHRoYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9iYXNzaXN0YW5jZS5kZS9qcXVl
cnktcGx1Z2lucy9qcXVlcnktcGx1Z2luLWF1dG9jb21wbGV0ZS8iPmpRdWVyeSBBdXRvY29t
cGxldGUgcGx1Z2luPC9hPiA8Y29kZT4uY3NzPC9jb2RlPiBhbmQgPGNvZGU+Lm1pbi5qczwv
Y29kZT4gZmlsZXMgYmUgdXBsb2FkZWQgaW50byBhICI8Y29kZT5qczwvY29kZT4iIGZvbGRl
ciBvbiB5b3VyIHNpdGUpPC9lbT4nLA0KCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246
bWlkZGxlIicpLg0KCQkJCQl0ZCh5ZXNub1JhZGlvKEFVVE9DT01QTEVURV9JTl9XUklURV9U
QUIsICR0cnVfdGFnc19wcmVmc1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXS0+dmFsdWUp
KQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJCXRkYShnVHh0KCdDb252ZXJ0IHRhZ3MgdG8gbG93
ZXJjYXNlIGJ5IGRlZmF1bHQnKS4nOiA8YnI+Jy4NCgkJCQkJCSc8ZW0+KHlvdSBwcm9iYWJs
eSB3YW50IHRoaXMsIHVubGVzcyB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyB3aXRoIHV0Zi04
IGNoYXJhY3RlcnMpPC9lbT4nLA0KCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlk
ZGxlIicpLg0KCQkJCQl0ZCh5ZXNub1JhZGlvKFVURl84X0NBU0UsICR0cnVfdGFnc19wcmVm
c1tVVEZfOF9DQVNFXS0+dmFsdWUpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJCXRkKCcnKS4N
CgkJCQkJdGRhKGZJbnB1dCgnc3VibWl0JywgJ3ByZWZzJywgZ1R4dCgnU2F2ZScpLCAncHVi
bGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSwgJyBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCIn
KQ0KCQkJCSksDQoJCQkJJycsICcgdmVyaWZ5KFwnJyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScp
IC4gJ1wnKSInDQoJCQkpLg0KCQllbmRUYWJsZSgpLic8L3RkPjwvdHI+Jy4NCgkJZW5kVGFi
bGUoKTsNCg0KCWVjaG8gJzwvdGQ+PC90cj4nLmVuZFRhYmxlKCk7DQp9DQoNCg0KZnVuY3Rp
b24gdHJ1X3RhZ3NfYWRtaW5fdGFiX2hhbmRsZV9pbnB1dCgpIHsNCglpZiAoZ3BzKCdwcmVm
cycpKSB7DQoJCXJldHVybiB0cnVfdGFnc19hZG1pbl91cGRhdGVfcHJlZnMoKTsNCgl9IGVs
c2UgaWYgKGdwcygnZGVsZXRlJykpIHsNCgkJcmV0dXJuIHRydV90YWdzX2FkbWluX2RlbGV0
ZV90YWcoZ3BzKCdkZWxldGV0YWcnKSk7DQoJfSBlbHNlIGlmIChncHMoJ3JlcGxhY2UnKSkg
ew0KCQkkcmVzdWx0ID0gdHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoZ3BzKCdtYXRjaHRh
ZycpLCBncHMoJ3JlcGxhY2V0YWcnKSwgZmFsc2UpOw0KCQlyZXR1cm4gJHJlc3VsdCAuICc8
YnI+JyAuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ21hdGNodGFnJyksIGdw
cygncmVwbGFjZXRhZycpKTsNCgl9IGVsc2UgaWYgKGdwcygncmVkaXJlY3QnKSkgew0KCQly
ZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3RfdGFnKGdwcygnbGVmdHRhZycpLCBncHMo
J3JpZ2h0dGFnJykpOw0KCX0gZWxzZSBpZiAoZ3BzKCdkZWxldGVfcmVkaXJlY3QnKSkgew0K
CQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0KGdwcygnZGVsZXRlX3Jl
ZGlyZWN0JykpOw0KCX0gZWxzZSB7DQoJCXJldHVybiAnJzsNCgl9DQp9DQoNCg0KZnVuY3Rp
b24gdHJ1X3RhZ3NfYWRtaW5fdXBkYXRlX3ByZWZzKCkgew0KCWdsb2JhbCAkdHJ1X3RhZ3Nf
cHJlZnM7DQoJJHJlc3VsdHMgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0cnVfdGFnc19wcmVm
cyBhcyAkcHJlZikgew0KCQkkdmFsaWRfdmFsdWUgPSAkcHJlZi0+dmFsaWRhdGVfdmFsdWUo
Z3BzKCRwcmVmLT5uYW1lKSk7DQoJCWlmICgkdmFsaWRfdmFsdWUgJiYgJHZhbGlkX3ZhbHVl
IDw+IGdwcygkcHJlZi0+bmFtZSkpIHsNCgkJCXJldHVybiAkdmFsaWRfdmFsdWU7ICAjIyMg
dGhpcyBpcyBhIHNuZWFreSB3YXkgdG8gaGFuZGxlIHZhbGlkYXRpb24gLSBzb3JyeSA7KQ0K
CQl9DQoJCWlmICgkdmFsaWRfdmFsdWUgPD4gJHByZWYtPnZhbHVlKSB7DQoJCQlpZiAoJHZh
bGlkX3ZhbHVlID09ICRwcmVmLT5kZWZhdWx0X3ZhbHVlKSB7DQoJCQkJJHJlc3VsdCA9IHRy
dV90YWdzX2RlbGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsNCgkJCX0gZWxzZSB7DQoJCQkJJHJl
c3VsdCA9IHRydV90YWdzX3Vwc2VydF9wcmVmKCRwcmVmLT5uYW1lLCAkdmFsaWRfdmFsdWUp
Ow0KCQkJfQ0KCQkJaWYgKCRyZXN1bHQpIHsNCgkJCQkkcmVzdWx0c1tdID0gJ1VwZGF0ZWQg
JyAuICRwcmVmLT5uYW1lOw0KCQkJCSRwcmVmLT52YWx1ZSA9ICR2YWxpZF92YWx1ZTsNCgkJ
CX0gZWxzZSB7DQoJCQkJJHJlc3VsdHNbXSA9ICdFcnJvciB1cGRhdGluZyAnIC4gJHByZWYt
Pm5hbWU7DQoJCQl9DQoJCX0NCgl9DQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9PSAwKSB7DQoJ
CXJldHVybiAnTm8gcmVjb3JkcyBuZWVkIHVwZGF0aW5nJzsNCgl9IGVsc2Ugew0KCQlyZXR1
cm4gam9pbignPGJyPicsICRyZXN1bHRzKTsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3Rh
Z3NfdXBzZXJ0X3ByZWYoJG5hbWUsICR2YWx1ZSkgew0KCWlmICghc2FmZV9xdWVyeSgnY3Jl
YXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycp
Lg0KCQknIChuYW1lIHZhcmNoYXIoMjU1KSBwcmltYXJ5IGtleSwgJy4NCgkJJ3ZhbHVlIHZh
cmNoYXIoMjU1KSBub3QgbnVsbCknKSkgew0KCQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1
bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3ByZWZzJykgLiAn
IHRhYmxlLic7DQoJfQ0KDQoJcmV0dXJuIHNhZmVfdXBzZXJ0KCd0cnVfdGFnc19wcmVmcycs
ICd2YWx1ZT0iJy4kdmFsdWUuJyInLCAnbmFtZT0iJy4kbmFtZS4nIicpOw0KfQ0KDQoNCmZ1
bmN0aW9uIHRydV90YWdzX2RlbGV0ZV9wcmVmKCRuYW1lKSB7DQoJaWYgKHNhZmVfZGVsZXRl
KCd0cnVfdGFnc19wcmVmcycsICduYW1lPSInLiRuYW1lLiciJykpIHsNCgkJaWYgKHNhZmVf
Y291bnQoJ3RydV90YWdzX3ByZWZzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9w
IHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSkpIHsNCgkJCXJldHVybiBm
YWxzZTsNCgkJfQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gZmFsc2U7
DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX2RlbGV0ZV90YWcoJGRlbGV0
ZXRhZykgew0KCWlmICh0cmltKCRkZWxldGV0YWcpKSB7DQoJCXJldHVybiB0cnVfdGFnc19h
ZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRldGFnLCAnJywgdHJ1ZSk7DQoJfSBlbHNlIHsNCgkJ
cmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSc7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRy
dV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKCRtYXRjaHRhZywgJHJlcGxhY2V0YWcsICRhbGxv
d19ibGFua19yZXBsYWNldGFnKSB7DQoJZ2xvYmFsICREQjsNCgkkbWF0Y2h0YWcgPSB0cmlt
KCRtYXRjaHRhZyk7DQoJJHJlcGxhY2V0YWcgPSB0cmltKCRyZXBsYWNldGFnKTsNCglpZiAo
JG1hdGNodGFnICYmICgkYWxsb3dfYmxhbmtfcmVwbGFjZXRhZyB8fCAkcmVwbGFjZXRhZykp
IHsNCgkJaWYgKHNhZmVfdXBkYXRlKCd0ZXh0cGF0dGVybicsIFRSVV9UQUdTX0ZJRUxELic9
dHJpbShib3RoIFwnLFwnIGZyb20gcmVwbGFjZShjb25jYXQoIiwiLCAnLlRSVV9UQUdTX0ZJ
RUxELicsICIsIiksIGNvbmNhdCgiLCIsIFwnJy5hZGRzbGFzaGVzKCRtYXRjaHRhZykuJ1wn
LCAiLCIpLCBcJywnLmFkZHNsYXNoZXMoJHJlcGxhY2V0YWcpLicsXCcpKScsICcxJykpIHsN
CgkJCXJldHVybiAnVXBkYXRlZCAnLm15c3FsX2FmZmVjdGVkX3Jvd3MoJERCLT5saW5rKS4n
IHJvd3MgKCInLmh0bWxzcGVjaWFsY2hhcnMoJG1hdGNodGFnKS4nIj0+IicuaHRtbHNwZWNp
YWxjaGFycygkcmVwbGFjZXRhZykuJyIpJzsNCgkJfSBlbHNlIHsNCgkJCXJldHVybiAnRXJy
b3I6ICcgLiBteXNxbF9lcnJvcigkREItPmxpbmspOw0KCQl9DQoJfSBlbHNlIHsNCgkJcmV0
dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSBpbiBib3RoIGZpZWxkcyc7DQoJfQ0KfQ0KDQoN
CmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZygkbGVmdHRhZywgJHJpZ2h0
dGFnKSB7DQoJJGxlZnR0YWcgPSBhZGRzbGFzaGVzKHRydV90YWdzX3N0cnRvbG93ZXIodHJp
bSgkbGVmdHRhZykpKTsNCgkkcmlnaHR0YWcgPSBhZGRzbGFzaGVzKHRydV90YWdzX3N0cnRv
bG93ZXIodHJpbSgkcmlnaHR0YWcpKSk7DQoJaWYgKCEkbGVmdHRhZyB8fCAhJHJpZ2h0dGFn
KSB7DQoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUgaW4gYm90aCBmaWVsZHMnOw0K
CX0NCg0KCWlmICghc2FmZV9xdWVyeSgnY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAu
IHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKS4NCgkJJyAobGVmdHRhZyB2YXJjaGFy
KDI1NSkgcHJpbWFyeSBrZXksICcuDQoJCSdyaWdodHRhZyB2YXJjaGFyKDI1NSkgbm90IG51
bGwpJykpIHsNCgkJcmV0dXJuICdTZXJpb3VzIGVycm9yIC0gdW5hYmxlIHRvIGNyZWF0ZSB0
aGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKSAuICcgdGFibGUuJzsNCgl9
DQoNCglpZiAoc2FmZV9pbnNlcnQoJ3RydV90YWdzX3JlZGlyZWN0cycsICdsZWZ0dGFnPSIn
LiRsZWZ0dGFnLiciLHJpZ2h0dGFnPSInLiRyaWdodHRhZy4nIicpKSB7DQoJCXJldHVybiAn
UmVkaXJlY3QgYWRkZWQgKCInLmh0bWxzcGVjaWFsY2hhcnMoJGxlZnR0YWcpLiciPT4iJy5o
dG1sc3BlY2lhbGNoYXJzKCRyaWdodHRhZykuJyIpIC0gcGxlYXNlIHRlc3QgaXQhJzsNCgl9
IGVsc2Ugew0KCQlyZXR1cm4gJ0Vycm9yIGFkZGluZyByZWNvcmQgLSBkb2VzIGl0IGFscmVh
ZHkgZXhpc3Q/JzsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRl
X3JlZGlyZWN0KCRsZWZ0dGFnKSB7DQoJaWYgKHNhZmVfZGVsZXRlKCd0cnVfdGFnc19yZWRp
cmVjdHMnLCAnbGVmdHRhZz0iJy5hZGRzbGFzaGVzKCRsZWZ0dGFnKS4nIicpKSB7DQoJCWlm
IChzYWZlX2NvdW50KCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnMScpID09IDAgJiYgIXNhZmVf
cXVlcnkoJ2Ryb3AgdGFibGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19yZWRpcmVjdHMnKSkp
IHsNCgkJCXJldHVybiAnUmVkaXJlY3QgZGVsZXRlZCwgYnV0IHVuYWJsZSB0byBkcm9wIHRh
YmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJyk7DQoJCX0NCgkJcmV0dXJu
ICdSZWRpcmVjdCBkZWxldGVkICgiJy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIikn
Ow0KCX0gZWxzZSB7DQoJCXJldHVybiAnRXJyb3IgZGVsZXRpbmcgcmVkaXJlY3QnOw0KCX0N
Cn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl93cml0ZV90YWJfaGFuZGxlcigkZXZl
bnQsICRzdGVwKSB7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCgkkYXR0cyA9IHRydV90
YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIHRydWUsIHRydWUsIHRydWUp
Ow0KCSRjbG91ZCA9IGFycmF5X3VuaXF1ZSh0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cykp
Ow0KCW5hdGNhc2Vzb3J0KCRjbG91ZCk7DQoNCgkkaWQgPSAoZW1wdHkoJEdMT0JBTFNbJ0lE
J10pID8gZ3BzKCdJRCcpIDogJEdMT0JBTFNbJ0lEJ10pOw0KCSRhcnRpY2xlX3RhZ3MgPSAo
ZW1wdHkoJGlkKSA/IGFycmF5KCkgOiB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgk
aWQpKTsNCg0KCSRsaW5rcyA9IGFycmF5KCk7DQoJJHJhd19jbG91ZCA9ICcnOw0KCWZvcmVh
Y2ggKCRjbG91ZCBhcyAkdGFnKSB7DQoJCSRzdHlsZSA9IChpbl9hcnJheSgkdGFnLCAkYXJ0
aWNsZV90YWdzKSA/ICcgY2xhc3M9InRhZ19jaG9zZW4iJyA6ICcnKTsNCgkJJGxpbmtzW10g
PSAnPGEgaHJlZj0iI2FkdmFuY2VkIicuJHN0eWxlLicgb25jbGljaz0idG9nZ2xlQ2xhc3Mo
dGhpcywgdG9nZ2xlVGFnKFxcXCcnLmFkZHNsYXNoZXMoYWRkc2xhc2hlcyhodG1sc3BlY2lh
bGNoYXJzKCR0YWcpKSkuJ1xcXCcpKTsgcmV0dXJuIGZhbHNlOyI+JyAuIGFkZHNsYXNoZXMo
aHRtbHNwZWNpYWxjaGFycygkdGFnKSkgLiAnPFwvYT4nOw0KCQkkcmF3X2Nsb3VkIC49ICci
JyAuIGFkZFNsYXNoZXMoJHRhZykgLiAnIiwnOw0KCX0NCgkkcmF3X2Nsb3VkID0gc3Vic3Ry
KCRyYXdfY2xvdWQsIDAsIHN0cmxlbigkcmF3X2Nsb3VkKSAtIDEpOw0KCSR0b19pbnNlcnQg
PSBqb2luKCcsICcsICRsaW5rcyk7DQoNCglpZiAoJHRydV90YWdzX3ByZWZzW1RBR1NfSU5f
V1JJVEVfVEFCXS0+dmFsdWUpIHsNCgkJJGpzID0gPDw8RU9GDQoJCQl2YXIga2V5d29yZHNG
aWVsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdrZXl3b3JkcycpOw0KCQkJa2V5d29y
ZHNGaWVsZC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQo
J2JyJykpOw0KCQkJdmFyIGNsb3VkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3Bhbicp
Ow0KCQkJa2V5d29yZHNGaWVsZC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGNsb3VkKTsNCgkJ
CWNsb3VkLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAndHJ1X3RhZ3NfYWRtaW5fdGFncycpOw0K
CQkJY2xvdWQuaW5uZXJIVE1MID0gJ3skdG9faW5zZXJ0fSc7DQoNCgkJCXZhciBzdHlsZUVs
ZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOw0KCQkJc3R5bGVFbGVt
ZW50LnNldEF0dHJpYnV0ZSgidHlwZSIsICJ0ZXh0L2NzcyIpOw0KCQkJdmFyIHN0eWxlVGV4
dCA9ICdhLnRhZ19jaG9zZW57YmFja2dyb3VuZC1jb2xvcjogI0ZFQjsgY29sb3I6IGJsYWNr
O30nOw0KCQkJaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7IC8vSUUNCgkJCQlzdHls
ZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gc3R5bGVUZXh0Ow0KCQkJfSBlbHNlIHsN
CgkJCQl2YXIgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHlsZVRleHQp
Ow0KCQkJCXN0eWxlRWxlbWVudC5hcHBlbmRDaGlsZCh0ZXh0Tm9kZSk7DQoJCQl9DQoJCQl2
YXIgaGVhZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcp
WzBdOw0KCQkJaGVhZEVsZW1lbnQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTsNCg0KCQkJ
ZnVuY3Rpb24gdG9nZ2xlVGFnKHRhZ05hbWUpIHsNCgkJCQl2YXIgcmVnZXhUYWcgPSB0YWdO
YW1lLnJlcGxhY2UoLyhbXFxcXFxeXFwkKitbXFxdP3t9Lj0hOih8KV0pL2csIlxcXFwkMSIp
Ow0KCQkJCXZhciB0YWdSZWdleCA9IG5ldyBSZWdFeHAoIigoXnwsKVxcXHMqKSIgKyByZWdl
eFRhZyArICJcXFxzKigsXFxccyp8JCkiKTsNCgkJCQl2YXIgdGV4dGFyZWEgPSBkb2N1bWVu
dC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsNCgkJCQl2YXIgY3VydmFsID0gdGV4dGFy
ZWEudmFsdWUucmVwbGFjZSgvLD9ccyskLywgJycpOw0KCQkJCWlmICgnJyA9PSBjdXJ2YWwp
IHsNCgkJCQkJdGV4dGFyZWEudmFsdWUgPSB0YWdOYW1lOw0KCQkJCX0gZWxzZSBpZiAoY3Vy
dmFsLm1hdGNoKHRhZ1JlZ2V4KSkgew0KCQkJCQl0ZXh0YXJlYS52YWx1ZSA9IGN1cnZhbC5y
ZXBsYWNlKHRhZ1JlZ2V4LCAnJDEnKS5yZXBsYWNlKC8sP1xzKyQvLCAnJyk7DQoJCQkJCXJl
dHVybiAnJzsNCgkJCQl9IGVsc2UgaWYgKCcsJyA9PSBjdXJ2YWwuY2hhckF0KGN1cnZhbC5s
ZW5ndGggLSAxKSkgew0KCQkJCQl0ZXh0YXJlYS52YWx1ZSArPSAnICcgKyB0YWdOYW1lOw0K
CQkJCX0gZWxzZSB7DQoJCQkJCXRleHRhcmVhLnZhbHVlICs9ICcsICcgKyB0YWdOYW1lOw0K
CQkJCX0NCgkJCQlyZXR1cm4gJ3RhZ19jaG9zZW4nOw0KCQkJfQ0KDQoJCQlmdW5jdGlvbiB0
b2dnbGVDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHsNCgkJCQllbGVtZW50LnNldEF0dHJp
YnV0ZSgnY2xhc3MnLCBjbGFzc05hbWUpOw0KCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCdj
bGFzc05hbWUnLCBjbGFzc05hbWUpOyAvKiBmb3IgSUUgKi8NCgkJCX0NCkVPRjsNCgkJZWNo
byBzY3JpcHRfanMoJGpzKTsNCgl9DQoNCglpZiAoJHRydV90YWdzX3ByZWZzW0FVVE9DT01Q
TEVURV9JTl9XUklURV9UQUJdLT52YWx1ZSkgew0KCQllY2hvIDw8PEVPRg0KCQkJPGxpbmsg
cmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vanMvanF1ZXJ5LmF1
dG9jb21wbGV0ZS5jc3MiIG1lZGlhPSJwcm9qZWN0aW9uLCBzY3JlZW4iIC8+DQoJCQk8c2Ny
aXB0IHNyYz0iLi4vanMvanF1ZXJ5LmF1dG9jb21wbGV0ZS5taW4uanMiIHR5cGU9InRleHQv
amF2YXNjcmlwdCI+PC9zY3JpcHQ+DQoJCQk8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0
IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwhLS0NCgkJCQkkKGRvY3VtZW50KS5yZWFkeShm
dW5jdGlvbigpeyB2YXIgdGFncyA9IG5ldyBBcnJheSh7JHJhd19jbG91ZH0pOw0KCQkJCQkk
KCIja2V5d29yZHMiKS5hdXRvY29tcGxldGUodGFncywgeyBtdWx0aXBsZTogdHJ1ZSwgbXVz
dE1hdGNoOiBmYWxzZSwgYXV0b0ZpbGw6IGZhbHNlIH0pOw0KCQkJCX0pOw0KCQkJLy8tLT48
L3NjcmlwdD4NCkVPRjsNCgl9DQoNCn0NCg0KDQojIyMgQVRPTS9SU1MgRkVFRCBGVU5DVElP
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
IyMjIyMjIyMjIyMjIw0KDQpjbGFzcyB0cnVfdGFnc19wcmVmIHsNCglmdW5jdGlvbiB0cnVf
dGFnc19wcmVmKCRuYW1lLCAkZGVmYXVsdF92YWx1ZSwgJHR5cGUpIHsNCgkJJHRoaXMtPm5h
bWUgPSAkbmFtZTsNCgkJJHRoaXMtPnZhbHVlID0gJGRlZmF1bHRfdmFsdWU7DQoJCSR0aGlz
LT5kZWZhdWx0X3ZhbHVlID0gJGRlZmF1bHRfdmFsdWU7DQoJCSR0aGlzLT50eXBlID0gJHR5
cGU7DQoJfQ0KDQoJZnVuY3Rpb24gdmFsaWRhdGVfdmFsdWUoJHZhbHVlKSB7DQoJCWlmICgk
dmFsdWUpIHsNCgkJCXJldHVybiAkdmFsdWU7DQoJCX0gZWxzZSBpZiAoJHRoaXMtPnR5cGUg
PT0gJ2Jvb2xlYW4nKSB7DQoJCQlyZXR1cm4gJzAnOw0KCQl9IGVsc2Ugew0KCQkJcmV0dXJu
ICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSBmb3IgJyAuICR0aGlzLT5uYW1lOw0KCQl9DQoJfQ0K
fQ0KDQpmdW5jdGlvbiB0cnVfdGFnc19sb2FkX3ByZWZzKCkgew0KCSRwcmVmcyA9IGFycmF5
KCk7DQoJZ2xvYmFsICREQjsNCg0KCWdsb2JhbCAkcGVybWxpbmtfbW9kZTsNCgkkcHJlZnNb
Q0xFQU5fVVJMU10gPSBuZXcgdHJ1X3RhZ3NfcHJlZihDTEVBTl9VUkxTLCAoJHBlcm1saW5r
X21vZGUgIT0gJ21lc3N5JyA/ICdjbGVhbicgOiAnbWVzc3knKSwgJ3N0cmluZycpOw0KCSRw
cmVmc1tUQUdfU0VDVElPTl0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdfU0VDVElPTiwgJ3Rh
ZycsICdzdHJpbmcnKTsNCgkkcHJlZnNbUEFSTV9OQU1FXSA9IG5ldyB0cnVfdGFnc19wcmVm
KFBBUk1fTkFNRSwgJ3QnLCAnc3RyaW5nJyk7DQoJJHByZWZzW1RBR1NfSU5fRkVFRF9DQVRF
R09SSUVTXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fRkVFRF9DQVRFR09SSUVTLCAn
MScsICdib29sZWFuJyk7DQoJJHByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXSA9IG5ldyB0cnVf
dGFnc19wcmVmKFRBR1NfSU5fRkVFRF9CT0RZLCAnMCcsICdib29sZWFuJyk7DQoJJHByZWZz
W1RBR1NfSU5fV1JJVEVfVEFCXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fV1JJVEVf
VEFCLCAnMScsICdib29sZWFuJyk7DQoJJHByZWZzW0FVVE9DT01QTEVURV9JTl9XUklURV9U
QUJdID0gbmV3IHRydV90YWdzX3ByZWYoQVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQiwgJzAn
LCAnYm9vbGVhbicpOw0KCSRwcmVmc1tVVEZfOF9DQVNFXSA9IG5ldyB0cnVfdGFnc19wcmVm
KFVURl84X0NBU0UsICcxJywgJ2Jvb2xlYW4nKTsNCg0KCWlmIChteXNxbGlfcXVlcnkoJERC
LT5saW5rLCJkZXNjcmliZSAiIC4gUEZYIC4gInRydV90YWdzX3ByZWZzIikpIHsNCgkJJHJz
ID0gc2FmZV9yb3dzKCcqJywgJ3RydV90YWdzX3ByZWZzJywgJzEnKTsNCgkJZm9yZWFjaCAo
JHJzIGFzICRyb3cpIHsNCgkJCSRwcmVmc1skcm93WyduYW1lJ11dLT52YWx1ZSA9ICRyb3db
J3ZhbHVlJ107DQoJCX0NCgl9DQoNCglyZXR1cm4gJHByZWZzOw0KfQ0KDQoNCiMjIyBPVEhF
UiBTVVBQT1JUIEZVTkNUSU9OUyAjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfcmVkaXJlY3RfaWZfbmVlZGVkKCR0YWdfcGFyYW1l
dGVyKSB7DQoJJHJlZGlyZWN0cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3RzKCk7DQoJZm9y
ZWFjaCAoJHJlZGlyZWN0cyBhcyAkbGVmdHRhZyA9PiAkcmlnaHR0YWcpIHsNCgkJaWYgKCRs
ZWZ0dGFnID09ICR0YWdfcGFyYW1ldGVyIHx8ICRsZWZ0dGFnID09IHN0cl9yZXBsYWNlKCct
JywgJyAnLCAkdGFnX3BhcmFtZXRlcikpIHsNCgkJCXRydV90YWdzX3JlZGlyZWN0KCRyaWdo
dHRhZywgZmFsc2UpOw0KCQkJcmV0dXJuIHRydWU7DQoJCX0NCgl9DQoNCglyZXR1cm4gZmFs
c2U7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfbG9hZF9yZWRpcmVjdHMoKSB7DQoJZ2xv
YmFsICREQjsNCgkkcmVkaXJlY3RzID0gYXJyYXkoKTsNCglpZiAobXlzcWxpX3F1ZXJ5KCRE
Qi0+bGluaywiZGVzY3JpYmUgIiAuIFBGWCAuICJ0cnVfdGFnc19yZWRpcmVjdHMiKSkgew0K
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
dXJuICRyczsNCn0NCg0KDQoiO3M6NDoidHlwZSI7czoxOiIxIjtzOjU6Im9yZGVyIjtzOjE6
IjUiO3M6NToiZmxhZ3MiO3M6MToiMCI7czo0OiJoZWxwIjtzOjExOTA6IjxwPlRvIGxlYXJu
IG1vcmUgYWJvdXQgdHJ1X3RhZ3MsIGNoZWNrIG91dCB0aGUgPGEgaHJlZj0iaHR0cDovL3d3
dy5yYWluc2tpdC5jb20vYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2luLWZvci10
ZXh0cGF0dGVybiIgcmVsPSJub2ZvbGxvdyI+aW50cm9kdWN0b3J5IGFydGljbGU8L2E+LCA8
YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTM3L3RydV90YWdz
LXJlbGVhc2VzIiByZWw9Im5vZm9sbG93Ij5yZWxlYXNlcyBwYWdlPC9hPiwgPGEgaHJlZj0i
aHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5NS90cnV0YWdzLWZlYXR1cmUt
bGlzdCIgcmVsPSJub2ZvbGxvdyI+ZmVhdHVyZSBsaXN0PC9hPiwgPGEgaHJlZj0iaHR0cDov
L3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzU1NC90cnVfdGFncy1yb2FkbWFwIiByZWw9
Im5vZm9sbG93Ij5yb2FkbWFwPC9hPiwgYW5kIDxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNr
aXQuY29tL3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMiIHJlbD0i
bm9mb2xsb3ciPnVzYWdlIGluc3RydWN0aW9uczwvYT4uPC9wPgoKCTxwPllvdSBjYW4gYWxz
byBmaW5kIHRoZSBzb3VyY2UgY29kZSBhdCA8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUu
Y29tL3AvdHJ1LXRhZ3MvIiByZWw9Im5vZm9sbG93Ij5odHRwOi8vY29kZS5nb29nbGUuY29t
L3AvdHJ1LXRhZ3MvPC9hPi48L3A+CgoJPHA+SSYjODIxNzt2ZSB0YWtlbiB0aGUgZGV0YWls
ZWQgaGVscCBvdXQgb2YgdGhlIHBsdWdpbjsgbXkgYXBvbG9naWVzLiAgSXQgd2FzIHRvbyBi
aWcgYW5kIHRvbyBkaWZmaWN1bHQgdG8ga2VlcCBtYWludGFpbmluZyBvbiBteSBzaXRlIGFu
ZCBpbiB0aGUgcGx1Z2luLiAgSWYsIG15IHNpdGUgaXMgZXZlciBkb3duLCBob3dldmVyLCB0
aGUgc291cmNlIDxzcGFuIGNsYXNzPSJjYXBzIj5IVE1MPC9zcGFuPiBvZiB0aGUgdXNhZ2Ug
aW5zdHJ1Y3Rpb25zIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vY29kZS5nb29n
bGUuY29tL3AvdHJ1LXRhZ3Mvc291cmNlL2Jyb3dzZS90cnVuay90cnVfdGFncy1kb2NzLmh0
bWwiIHJlbD0ibm9mb2xsb3ciPmh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC90cnUtdGFncy9z
b3VyY2UvYnJvd3NlL3RydW5rL3RydV90YWdzLWRvY3MuaHRtbDwvYT48L3A+IjtzOjM6Im1k
NSI7czozMjoiYTM3ODI3ODNkNzc0MDY4YmZiMmJlMWQzOGViNDEwYWUiO30=

Offline

#783 2017-02-25 03:27:48

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

Re: tru_tags: A tagging plugin for textpattern

Hello all, sorry for my long absence. Prompted by the generosity of the people who submitted pull requests, I finally got my site updated to the latest Textpattern (4.6 as of this writing) and updated tru_tags to work with it.

As far as I can tell, the pull requests were sufficient to make it work. If that’s not correct, please let me know so I can apply whatever other fixes are needed.

You can grab the latest version from the Releases page.

Offline

#784 2017-04-05 14:09:08

michaelkpate
Moderator
From: Avon Park, FL
Registered: 2004-02-24
Posts: 1,379
Website GitHub Mastodon

Re: tru_tags: A tagging plugin for textpattern

truist wrote #304258:

Hello all, sorry for my long absence.

As someone who has been using tru_tags on their personal site for nearly a decade, good to have you back.

I am trying to get tru_tags 3.9 working on a site running 4.7 dev. I am constantly getting this error in the backend.

A problem occurred while loading the plugin: tru_tags -> User_Error: Table '[databasename].tru_tags_prefs' doesn't exist on line 409

Offline

#785 2017-04-05 15:47:46

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

Re: tru_tags: A tagging plugin for textpattern

Do you have a way to build a local version? Poking around the code, I’m guessing I need to change “PFX” to “safe_pfx(” on line 1039 (and probably line 1068, too). Does that fix it for you?

Offline

#786 2017-04-05 17:38:17

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

Re: tru_tags: A tagging plugin for textpattern

truist wrote #305228:

I’m guessing I need to change “PFX” to “safe_pfx(”

They should still both work. Sounds like installation failed or maybe we broke something in 4.7.0-dev…


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

Offline

#787 2017-04-05 17:56:16

michaelkpate
Moderator
From: Avon Park, FL
Registered: 2004-02-24
Posts: 1,379
Website GitHub Mastodon

Re: tru_tags: A tagging plugin for textpattern

Bloke wrote #305233:

They should still both work. Sounds like installation failed or maybe we broke something in 4.7.0-dev…

I haven’t been able to get the fix to work but I think I may have the coding wrong. I sent truist an e-mail with an account so he can login and get a better look.

It is a tiny bit frustrating because I can’t smd_tags working either. The price you pay to live on the bleeding edge… :)

Offline

#788 2017-04-06 07:50:21

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

Re: tru_tags: A tagging plugin for textpattern

michaelkpate wrote #305235:

It is a tiny bit frustrating because I can’t smd_tags working either. The price you pay to live on the bleeding edge… :)

[OT, sorry] I’m running smd_tags on 4.7.0-dev. It’s not pretty, but it’s working and I’ll be ironing out the kinks soon. Get in touch if you’d like me to help you figure it out.


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

Offline

#789 2017-04-06 12:41:42

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

Re: tru_tags: A tagging plugin for textpattern

Sidenote: I have set up a recent 4.7 to share an existing db with 4.5.7 and 4.6.2, for tests. After the install, prefs_id column is gone from txp_prefs table. This has left pre-4.7 versions prefless and mostly inoperable. Related?

Offline

#790 2017-04-06 13:19:05

michaelkpate
Moderator
From: Avon Park, FL
Registered: 2004-02-24
Posts: 1,379
Website GitHub Mastodon

Re: tru_tags: A tagging plugin for textpattern

etc wrote #305241:

Related?

I just reinstalled the smd_tags beta. I got a whole page full of this.

User_Error "Unknown column 'prefs_id' in 'field list'"
in /home/cmsstyles/cmsstyles.com/textpattern/lib/txplib_db.php at line 409.
adminErrorHandler()
textpattern/lib/txplib_db.php:409 trigger_error()
textpattern/lib/txplib_db.php:483 safe_query()
textpattern/lib/txplib_misc.php(1407) : eval()'d code:847 safe_insert()
textpattern/lib/txplib_misc.php(1407) : eval()'d code:787 smd_tags_prefs_install()
textpattern/lib/txplib_misc.php(1407) : eval()'d code:193 smd_tags_table_install()
smd_tags_welcome()
textpattern/lib/txplib_misc.php:1948 call_user_func_array()
textpattern/include/txp_plugin.php:565 callback_event()
textpattern/include/txp_plugin.php:50 plugin_install()

So I think it is safe to say it is definitely related in some manner.

Offline

#791 2017-04-07 01:10:17

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

Re: tru_tags: A tagging plugin for textpattern

I’d like to help debug, but I don’t have the time available to spend trying out prerelease versions of textpattern and debugging issues. If 4.7 comes out, and has an issue, I’ll upgrade and try to fix it. Before that, though, is a bigger investment than I’m willing to make in this.

Offline

#792 2017-04-07 01:31:24

michaelkpate
Moderator
From: Avon Park, FL
Registered: 2004-02-24
Posts: 1,379
Website GitHub Mastodon

Re: tru_tags: A tagging plugin for textpattern

truist wrote #305247:

I’d like to help debug, but I don’t have the time available to spend trying out prerelease versions of textpattern and debugging issues. If 4.7 comes out, and has an issue, I’ll upgrade and try to fix it. Before that, though, is a bigger investment than I’m willing to make in this.

That makes perfect sense. I mainly wanted to make sure you had a heads-up that there may be a problem when 4.7 is finalized – which is several months away at least.

Offline

Board footer

Powered by FluxBB