Textpattern CMS support forum
You are not logged in. Register | Login | Help
- Topics: Active | Unanswered
#517 2008-12-02 11:59:10
Re: tru_tags: A tagging plugin for textpattern
@nathan Re: truist.com changes
I will send the message to some rainskit.com mail addresses :)
- Your forum profile still mentions truist.com.
- I have no idea where the forum mail form is going to but I hope you can be reached.
- rainskit.com also still has truist.com in the page title.
Get all online mentions of Textpattern via OPML subscription: TXP Info Sources: Textpattern RSS feeds as dynamic OPML
Offline
#518 2008-12-02 14:06:06
Re: tru_tags: A tagging plugin for textpattern
All – I haven’t yet tried tru_tags in a 4.0.7 environment, but I will, sometime this week or weekend. If anyone does encounter a problem, please post as much detail as you can here, and that will speed the fix :)
Markus – thanks for sending me the notes. I had updated my email address on the forum, but I didn’t realize that there was a separate link to my (old) website, so now I’ve updated that also. But your third item – truist.com in the page title – I don’t see that. Can you send me a link to a page that has the problem?
Offline
#519 2008-12-02 16:40:35
- els
- Moderator
- From: The Netherlands
- Registered: 2004-06-06
- Posts: 7,458
Re: tru_tags: A tagging plugin for textpattern
Markus (and Nathan), I just updated tru_tags to 3.3 in my local 4.0.7 install, and so far I haven’t seen anything that doesn’t work. But I must say I’m not (yet) using all possible tags. Do you know what was the problem on the site you mentioned?
Offline
#520 2008-12-03 14:06:43
Re: tru_tags: A tagging plugin for textpattern
Els: No descriptions, no code and no reaction to my comments on the blog so far. I believe the owner might have some issues with the new parser and should check all his parameters for correctly "
quoted parameters. But as I said: no confirmation and it seems to be the only case with tru_tags so far.
Last edited by merz1 (2008-12-03 14:07:09)
Get all online mentions of Textpattern via OPML subscription: TXP Info Sources: Textpattern RSS feeds as dynamic OPML
Offline
#521 2008-12-08 02:47:12
Re: tru_tags: A tagging plugin for textpattern
Markus, I updated the documentation according to your suggestion. Thanks.
I’m working (this minute!) on finalizing the documentation for v3.3 and updating the roadmap. Look for an “official” announcement of v3.3 sometime tonight :)
Offline
#522 2008-12-08 02:47:44
Re: tru_tags: A tagging plugin for textpattern
P.S. – I have updated my sites to TXP 4.0.7 and I haven’t seen any problems with tru_tags.
Offline
#523 2008-12-08 04:07:32
Re: tru_tags: A tagging plugin for textpattern
All –
I have finally “officially” announced tru_tags v3.3 on my releases page, because all the features from v3.2 are finally documented.
Most of the valuable stuff in v3.3 was really released in v3.2 (see the forum post for details) – specifically, the ability to make a tag-based archive page. But v3.2 still points to my old website (truist.com) which I sold recently, so if you’re using v3.2, your documentation links won’t work. v3.3 fixes that.
But: v3.3 requires TXP 4.0.7. I fixed a bug and updated v3.3 to support article expiration dates (so tru_tags will hide expired articles from the cloud), but that support means that you have to have 4.0.7. So if you really don’t want to upgrade to TXP 4.0.7, please don’t upgrade tru_tags past v3.2.
Sorry for all the confusion – I will avoid overlapping releases in the future =)
I have also made minor updates to the roadmap, just to make sure it was synced up with the requests here in the forum. Please shout if I’m missing something.
Enjoy!
Nathan
Offline
#524 2008-12-08 14:16:35
Re: tru_tags: A tagging plugin for textpattern
I also updated to TXP 4.0.7 and to the updated tru_tags 3.3. No problems with tru_tags.
@Nathan You should have announced 3.3.1 (or 3.4) to make clear that this is a new updated 3.3.n version. Not everybody will read your announcement until or immediately note “updated v3.3” :)
Last edited by merz1 (2008-12-08 14:18:20)
Get all online mentions of Textpattern via OPML subscription: TXP Info Sources: Textpattern RSS feeds as dynamic OPML
Offline
#525 2008-12-09 00:13:05
Re: tru_tags: A tagging plugin for textpattern
Good point. But I don’t think there’s much harm in it – the only thing missing from the earlier copy of v3.3 is the bugfix and the article expiration date support, which seem minor. And since they require TXP 4.0.7, maybe anyone who already has v3.3 on TxP 4.0.6 is happy that way :)
Offline
#526 2008-12-09 17:19:29
Re: tru_tags: A tagging plugin for textpattern
maybe anyone who already has v3.3 on TxP 4.0.6 is happy that way :)
Yes I was for sure :) but that’s the point. Maybe somebody who has 4.0.6 and is downloading the ‘updated 3.3’ now without reading the release note is not so happy this way.
Get all online mentions of Textpattern via OPML subscription: TXP Info Sources: Textpattern RSS feeds as dynamic OPML
Offline
#527 2009-01-03 07:32:44
Offline
#528 2009-01-03 10:40:44
Re: tru_tags: A tagging plugin for textpattern
Here you go:
# tru_tags v3.3
# Article tagging
# Nathan Arthur
# http://www.rainskit.com/
# ......................................................................
# This is a plugin for Textpattern - http://textpattern.com/
# To install: textpattern > admin > plugins
# Paste the following text into the 'Install plugin' box:
# ......................................................................
YToxMTp7czoxNToiYWxsb3dfaHRtbF9oZWxwIjtpOjA7czo3OiJ2ZXJzaW9uIjtzOjM6IjMu
MyI7czo2OiJhdXRob3IiO3M6MTM6Ik5hdGhhbiBBcnRodXIiO3M6MTA6ImF1dGhvcl91cmki
O3M6MjQ6Imh0dHA6Ly93d3cucmFpbnNraXQuY29tLyI7czoxMToiZGVzY3JpcHRpb24iO3M6
MTU6IkFydGljbGUgdGFnZ2luZyI7czo0OiJ0eXBlIjtpOjE7czo0OiJuYW1lIjtzOjg6InRy
dV90YWdzIjtzOjQ6ImhlbHAiO3M6Njc1OiIJPHA+VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVf
dGFncywgY2hlY2sgb3V0IHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9i
bG9nLzQ5My90cnV0YWdzLWEtdGFnZ2luZy1wbHVnaW4tZm9yLXRleHRwYXR0ZXJuIj5pbnRy
b2R1Y3RvcnkgYXJ0aWNsZTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29t
L3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVsZWFzZXMiPnJlbGVhc2VzIHBhZ2U8L2E+LCA8
YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3Mt
ZmVhdHVyZS1saXN0Ij5mZWF0dXJlIGxpc3Q8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnJh
aW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3RydV90YWdzLXJvYWRtYXAiPnJvYWRtYXA8L2E+
LCBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5Ny90
cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyI+dXNhZ2UgaW5zdHJ1Y3Rpb25zPC9hPi48L3A+
CgoJPHA+SSYjODIxNzt2ZSB0YWtlbiB0aGUgZGV0YWlsZWQgaGVscCBvdXQgb2YgdGhlIHBs
dWdpbjsgbXkgYXBvbG9naWVzLiAgSXQgd2FzIHRvbyBiaWcgYW5kIHRvbyBkaWZmaWN1bHQg
dG8ga2VlcCBtYWludGFpbmluZyBvbiBteSBzaXRlIGFuZCBpbiB0aGUgcGx1Z2luLjwvcD4i
O3M6NDoiY29kZSI7czozOTQ4MzoiCiNDb3B5cmlnaHQgMjAwOCBOYXRoYW4gQXJ0aHVyCiNS
ZWxlYXNlZCB1bmRlciB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBzZWUgaHR0cDovL3d3dy5v
cGVuc291cmNlLm9yZy9saWNlbnNlcy9ncGwtbGljZW5zZS5waHAgZm9yIGRldGFpbHMKI1Ro
aXMgd29yayBpcyBpbnNwaXJlZCBieSByYW5fdGFncyBieSBSYW4gQXJvdXNzaSwgb3JpZ2lu
YWxseSBmb3VuZCBhdCBodHRwOi8vYXJvdXNzaS5jb20vYXJ0aWNsZS80NS90YWdnaW5nLXRl
eHRwYXR0ZXJuCgoKIyMjIENPTkZJR1VSQVRJT04gIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMj
IwoKIyBUVVJOIEJBQ0shICBDb25maWd1cmF0aW9uIGlzIG5vIGxvbmdlciBoYW5kbGVkIGJ5
IGVkaXRpbmcgdGhlIHBsdWdpbi4KIyBDaGVjayBvdXQgdGhlICdFeHRlbnNpb25zJyB0YWIg
aW4gdGhlIFRleHRwYXR0ZXJuIGFkbWluIDopCgoKIyBDaGFuZ2luZyB0aGVzZSB3b24ndCBk
byBhbnkgZ29vZC4gIFRoZXkncmUganVzdCBoZXJlIGFzIGEgY29udmVuaWVuY2UgZm9yIGRl
dmVsb3BtZW50LgpkZWZpbmUoJ1RSVV9UQUdTX0ZJRUxEJywgJ0tleXdvcmRzJyk7CmRlZmlu
ZSgnQ0xFQU5fVVJMUycsICdjbGVhbl91cmxzJyk7CmRlZmluZSgnVEFHX1NFQ1RJT04nLCAn
dGFnX3NlY3Rpb24nKTsKZGVmaW5lKCdQQVJNX05BTUUnLCAncGFybScpOwpkZWZpbmUoJ1RB
R1NfSU5fRkVFRF9DQVRFR09SSUVTJywgJ3RhZ3NfaW5fZmVlZF9jYXRlZ29yaWVzJyk7CmRl
ZmluZSgnVEFHU19JTl9GRUVEX0JPRFknLCAndGFnc19pbl9mZWVkX2JvZHknKTsKZGVmaW5l
KCdUQUdTX0lOX1dSSVRFX1RBQicsICd0YWdzX2luX3dyaXRlX3RhYicpOwoKZ2xvYmFsICR0
cnVfdGFnc19wcmVmczsKJHRydV90YWdzX3ByZWZzID0gdHJ1X3RhZ3NfbG9hZF9wcmVmcygp
OwoKCiMjIyBQUklNQVJZIFRBRyBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjCgpmdW5jdGlvbiB0cnVfdGFnc19oYW5kbGVyKCRhdHRzKSB7CgkkdGFnX3Bh
cmFtZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoKSwgZmFsc2UpOwoJaWYg
KCFlbXB0eSgkdGFnX3BhcmFtZXRlcikpIHsKCQlpZiAodHJ1X3RhZ3NfcmVkaXJlY3RfaWZf
bmVlZGVkKCR0YWdfcGFyYW1ldGVyKSkgewoJCQlyZXR1cm4gJyc7CgkJfQoJCSRjbGVhbl9h
dHRzID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0ZXIp
OwoJCSRyZXN1bHQgPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVlKTsJCSNmdW5jdGlv
biBpbiBUWFAgY29kZQoJCWlmICh0cmltKCRyZXN1bHQpID09ICcnKSB7CgkJCWlmIChpc3Nl
dCgkYXR0c1snbm9hcnRpY2xlcyddKSkgewoJCQkJdHJ1X3RhZ3NfcmVkaXJlY3QoJGF0dHNb
J25vYXJ0aWNsZXMnXSwgdHJ1ZSk7CgkJCX0gZWxzZSB7CgkJCQl0eHBfZGllKGdUeHQoJzQw
NF9ub3RfZm91bmQnKSwgJzQwNCcpOwoJCQl9CgkJfSBlbHNlIHsKCQkJcmV0dXJuICRyZXN1
bHQ7CgkJfQoJfSBlbHNlIHsKCQlyZXR1cm4gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpOwoJfQp9
CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYXJjaGl2ZSgkYXR0cykgewoJZ2xvYmFsICR0cnVfdGFn
c19jdXJyZW50X2FyY2hpdmVfdGFnOwoJJHRhZ3MgPSBhcnJheV91bmlxdWUodHJ1X3RhZ3Nf
Y2xvdWRfcXVlcnkodHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIGZh
bHNlLCBmYWxzZSkpKTsKCXNvcnQoJHRhZ3MpOwoJZm9yZWFjaCAoJHRhZ3MgYXMgJHRhZykg
ewoJCSR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnID0gJHRhZzsKCQkkY2xlYW5fYXR0
cyA9IHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWcpOwoJCSRyZXN1bHRz
W10gPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVlKTsJCSNmdW5jdGlvbiBpbiBUWFAg
Y29kZQoJfQoJcmV0dXJuIGpvaW4oJyAnLCAkcmVzdWx0cyk7Cn0KCgpmdW5jdGlvbiB0cnVf
dGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKCRhdHRzKSB7CglnbG9iYWwgJHRydV90YWdzX2N1
cnJlbnRfYXJjaGl2ZV90YWc7CglleHRyYWN0KGxBdHRzKGFycmF5KCdsaW5rJyA9PiAnMCcp
LCAgJGF0dHMsIDApKTsKCWlmICgkbGluaykgewoJCXJldHVybiAnPGEgaHJlZj0iJyAuIHRy
dV90YWdzX2xpbmtpZnlfdGFnKCR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKSAuICci
PicgLiAkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZyAuICc8L2E+JzsKCX0gZWxzZSB7
CgkJcmV0dXJuICR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnOwoJfQp9CgoKZnVuY3Rp
b24gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpIHsKCXJldHVybiB0cnVfdGFnc19saXN0KHRydV90
YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKTsKfQoK
CmZ1bmN0aW9uIHRydV90YWdzX2xpc3QoJGF0dHMpIHsKCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0
X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIHRydWUsIGZhbHNlKTsKCSRhbGxfdGFncyA9
IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsKCglyZXR1cm4gdHJ1X3RhZ3NfcmVuZGVy
X2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7Cn0KCgpmdW5jdGlvbiB0cnVf
dGFnc19mcm9tX2FydGljbGUoJGF0dHMpIHsKCWdsb2JhbCAkdGhpc2FydGljbGU7CglleHRy
YWN0KCR0aGlzYXJ0aWNsZSk7CgoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9y
X2FydGljbGUoJHRoaXNpZCk7CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xv
dWRfYXR0cygkYXR0cywgZmFsc2UsIHRydWUpOwoJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAk
YWxsX3RhZ3M7CglpZiAoJGF0dHNbJ3VzZW92ZXJhbGxjb3VudHMnXSkgewoJCSRhbGxfdGFn
c19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJfQoKCXJldHVy
biB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zv
cl93ZWlnaHQpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfaGFzX3RhZ3MoJGF0dHMsICR0
aGluZykgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsK
CgkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOwoKCSRycyA9IHNhZmVfcm93KCR0YWdz
X2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAkdGFnc19maWVsZCA8
PiAnJyIpOwoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7Cn0KCgpmdW5j
dGlvbiB0cnVfdGFnc19pZl90YWdfc2VhcmNoKCRhdHRzLCAkdGhpbmcpIHsKCWV4dHJhY3Qo
bEF0dHMoYXJyYXkoJ3RhZycgPT4gJycpLCAgJGF0dHMsIDApKTsKCgkkdGFnX3BhcmFtZXRl
ciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gMSks
IGZhbHNlKTsKCSRjb25kaXRpb24gPSAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgPyB0cnVl
IDogZmFsc2U7CglpZiAoJGNvbmRpdGlvbiAmJiAhZW1wdHkoJHRhZykpIHsKCQkkY29uZGl0
aW9uID0gKCR0YWdfcGFyYW1ldGVyID09ICR0YWcpOwoJfQoJcmV0dXJuIHBhcnNlKEV2YWxF
bHNlKCR0aGluZywgJGNvbmRpdGlvbikpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdGFnX3Bh
cmFtZXRlcigkYXR0cywgJHNhZmVodG1sID0gdHJ1ZSkgewoJZ2xvYmFsICR0cnVfdGFnc19w
cmVmczsKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gJzAnLCAndXJs
ZW5jb2RlJyA9PiAwKSwgICRhdHRzLCAwKSk7CgoJJHBhcm0gPSB1cmxkZWNvZGUoc3RyaXBf
dGFncyhncHMoJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlKSkpOwoJaWYgKCds
b29rdXAnID09ICRzdHJpcGh5cGhlbnMpIHsKCQkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFu
ZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNlLCBmYWxzZSk7CgkJJHRhZ19saXN0ID0g
YXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSk7CgkJZm9yZWFjaCAo
JHRhZ19saXN0IGFzICRjbG91ZF90YWcpIHsKCQkJaWYgKCRwYXJtID09IHN0cl9yZXBsYWNl
KCcgJywgJy0nLCAkY2xvdWRfdGFnKSkgewoJCQkJJHBhcm0gPSAkY2xvdWRfdGFnOwoJCQkJ
YnJlYWs7CgkJCX0KCQl9Cgl9IGVsc2UgaWYgKCRzdHJpcGh5cGhlbnMpIHsKCQkkcGFybSA9
IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkcGFybSk7Cgl9CglpZiAoJHVybGVuY29kZSkgewoJ
CSRwYXJtID0gdXJsZW5jb2RlKCRwYXJtKTsKCSB9IGVsc2UgaWYgKCRzYWZlaHRtbCkgewoJ
CSRwYXJtID0gaHRtbHNwZWNpYWxjaGFycygkcGFybSk7Cgl9CgoJcmV0dXJuICRwYXJtOwp9
CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3BhcmFtZXRlcigpIHsKCXRyaWdnZXJfZXJy
b3IoZ1R4dCgnZGVwcmVjYXRlZF90YWcnKSwgRV9VU0VSX05PVElDRSk7CglyZXR1cm4gc3Ry
aXBfdGFncyhncHMoJ3EnKSk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19yZWxhdGVkX3RhZ3Nf
ZnJvbV9zZWFyY2goJGF0dHMpIHsKCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3Bh
cmFtZXRlcihhcnJheSgpLCBmYWxzZSk7CglleHRyYWN0KGxBdHRzKGFycmF5KCd0YWdfcGFy
YW1ldGVyJyA9PiAkdGFnX3BhcmFtZXRlciksICAkYXR0cywgMCkpOwoJaWYgKCFlbXB0eSgk
dGFnX3BhcmFtZXRlcikpIHsKICAgICAgICAkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxE
OwoJCSRhbGxfdGFncyA9IGFycmF5KCk7CgoJCSRxdWVyeV9hdHRzID0gdHJ1X3RhZ3NfZml4
dXBfcXVlcnlfYXR0cygkYXR0cywgJHRhZ19wYXJhbWV0ZXIpOwoJCSRycyA9IHRydV90YWdz
X3JlZG9fYXJ0aWNsZV9zZWFyY2goJHF1ZXJ5X2F0dHMpOwoJCWlmICgkcnMpIHsKCQkJd2hp
bGUgKCRhID0gbmV4dFJvdygkcnMpKSB7CgkJCQkkYXJ0aWNsZV90YWdzID0gYXJyYXkoKTsK
CQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCR0YWdzX2ZpZWxkLCAkYSkpIHsKCQkJCQkkYXJ0
aWNsZV90YWdzID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9sb3dlcigkYVsk
dGFnc19maWVsZF0pKSk7CgkJCQl9CgkJCQkkYWxsX3RhZ3MgPSBhcnJheV9tZXJnZSgkYWxs
X3RhZ3MsIHRydV90YWdzX3RyaW1fdGFncygkYXJ0aWNsZV90YWdzKSk7CgkJCX0KCQl9CgoJ
CSRhbHRfdGFnX3BhcmFtZXRlciA9IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkdGFnX3BhcmFt
ZXRlcik7CgkJZm9yZWFjaCAoJGFsbF90YWdzIGFzICRrZXkgPT4gJHRhZykgewoJCQlpZiAo
JHRhZyA9PSAkdGFnX3BhcmFtZXRlciB8fCAkdGFnID09ICRhbHRfdGFnX3BhcmFtZXRlcikg
ewoJCQkJdW5zZXQoJGFsbF90YWdzWyRrZXldKTsKCQkJfQoJCX0KCgkJJGNsb3VkX2F0dHMg
PSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIGZhbHNl
KTsKCQkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9ICRhbGxfdGFnczsKCQlpZiAoJGNsb3VkX2F0
dHNbJ3VzZW92ZXJhbGxjb3VudHMnXSkgewoJCQkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9IHRy
dV90YWdzX2Nsb3VkX3F1ZXJ5KCRjbG91ZF9hdHRzKTsKCQl9CgoJCXJldHVybiB0cnVfdGFn
c19yZW5kZXJfY2xvdWQoJGNsb3VkX2F0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93
ZWlnaHQpOwoJfSBlbHNlIHsKCQlyZXR1cm4gJyc7Cgl9Cn0KCgojIyMgQ0xPVUQgU1VQUE9S
VCBGVU5DVElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZ1bmN0
aW9uIHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCAkaXNMaXN0LCAk
aXNBcnRpY2xlKSB7CglyZXR1cm4gbEF0dHMoYXJyYXkoJ3dyYXB0YWcnCT0+ICgkaXNMaXN0
ID8gJ3VsJyA6ICcnKSwKCQkJJ2JyZWFrJwkJPT4gKCRpc0xpc3QgPyAnbGknIDogJywgJyks
CgkJCSdjbGFzcycJCT0+ICcnLAoJCQknYnJlYWtjbGFzcycJPT4gJycsCgkJCSdzZWN0aW9u
Jwk9PiAnJywKCQkJJ21pbnBlcmNlbnQnCT0+ICcxMDAnLAoJCQknbWF4cGVyY2VudCcJPT4g
KCRpc0xpc3QgfHwgJGlzQXJ0aWNsZSA/ICcxMDAnIDogJzIwMCcpLAoJCQknc2hvd2NvdW50
cycJPT4gJycsCgkJCSdjb3VudHdyYXBjaGFycycJPT4gJ1tdJywKCQkJJ3VzZXJlbHRhZycJ
PT4gKCRpc0FydGljbGUgPyAnMScgOiAnJyksCgkJCSdnZW5lcmF0ZWxpbmtzJwk9PiAnMScs
CgkJCSdtaW50YWdjb3VudCcJPT4gJzAnLAoJCQknbWF4dGFnY291bnQnCT0+ICcxMDAwJywK
CQkJJ3NldHNpemVzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyksCgkJCSd1c2Vub2Zv
bGxvdycJPT4gJycsCgkJCSdzb3J0JwkJPT4gJ2FscGhhJywKCQkJJ3VzZW92ZXJhbGxjb3Vu
dHMnCT0+ICcnLAoJCQknc2V0Y2xhc3NlcycJPT4gKCRpc0FydGljbGUgPyAnMCcgOiAnMScp
LAoJCQkndGl0bGUnCQk9PiAnJywKCQkJJ2xpc3RsaW1pdCcJPT4gJycsCgkJCSdrZWVwJwkJ
PT4gJ2xhcmdlc3QnLAoJCQknY3V0b2ZmJwk9PiAnY2h1bmsnLAoJCQkndGV4dHRyYW5zZm9y
bScJPT4gJ25vbmUnLAoJCQknbGlua3BhdGgnCT0+ICcnLAoJCQknbGlua3BhdGh0YWlsJwk9
PiAnJywKCQkJJ2ZpbHRlcnNlYXJjaCcJPT4gJzEnLAoJCQknZXhjbHVkZXNlY3Rpb24nPT4g
JycsCgkJCSdhY3RpdmVjbGFzcycJPT4gJ3RhZ0FjdGl2ZScsCgkJCSd0aW1lJwkJPT4gJ3Bh
c3QnCgkJKSwkYXR0cywgMCk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZF9xdWVyeSgk
YXR0cykgewoJZXh0cmFjdCgkYXR0cyk7CgoJJHNlY3Rpb25fY2xhdXNlID0gJyc7CglpZiAo
JHNlY3Rpb24gPD4gJycpIHsKCQkka2V5cyA9IHNwbGl0KCcsJywgJHNlY3Rpb24pOwoJCWZv
cmVhY2ggKCRrZXlzIGFzICRrZXkpIHsKCQkJJGtleXBhcnRzW10gPSAiIFNlY3Rpb24gPSAn
IiAuIHRyaW0oJGtleSkgLiAiJyI7CgkJfQoJCSRzZWN0aW9uX2NsYXVzZSA9ICIgQU5EICgi
IC4gam9pbignIG9yICcsICRrZXlwYXJ0cykgLiAiKSI7Cgl9CgoJJHRhZ3NfZmllbGQgPSBU
UlVfVEFHU19GSUVMRDsKCWluY2x1ZGVfb25jZSB0eHBhdGguJy9wdWJsaXNoL3NlYXJjaC5w
aHAnOwoKCSRmaWx0ZXIgPSB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMoJGV4Y2x1ZGVzZWN0
aW9uKTsKCSRmaWx0ZXIgLj0gKCRmaWx0ZXJzZWFyY2ggPyBmaWx0ZXJTZWFyY2goKSA6ICcn
KTsKCglzd2l0Y2ggKCR0aW1lKSB7CgkJY2FzZSAnYW55JzoKCQkJJHRpbWUgPSAiIjsgYnJl
YWs7CgkJY2FzZSAnZnV0dXJlJzoKCQkJJHRpbWUgPSAiIGFuZCBQb3N0ZWQgPiBub3coKSI7
IGJyZWFrOwoJCWRlZmF1bHQ6CgkJCSR0aW1lID0gIiBhbmQgUG9zdGVkIDw9IG5vdygpIjsK
CX0KCWdsb2JhbCAkcHJlZnM7CglleHRyYWN0KCRwcmVmcyk7CglpZiAoISRwdWJsaXNoX2V4
cGlyZWRfYXJ0aWNsZXMpIHsKCQkkdGltZSAuPSAiIGFuZCAobm93KCkgPD0gRXhwaXJlcyBv
ciBFeHBpcmVzID0gIi5OVUxMREFURVRJTUUuIikiOwoJfQoKCSRhbGxfdGFncyA9IGFycmF5
KCk7CgkkcnMgPSBzYWZlX3Jvd3MoIiR0YWdzX2ZpZWxkIiwgInRleHRwYXR0ZXJuIiwgIiR0
YWdzX2ZpZWxkIDw+ICcnIiAuICRzZWN0aW9uX2NsYXVzZSAuICRmaWx0ZXIgLiAiIGFuZCBT
dGF0dXMgPj0gJzQnIiAuICR0aW1lKTsKCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7CgkJJHRl
bXBfYXJyYXkgPSBhcnJheSgpOwoJCWlmIChhcnJheV9rZXlfZXhpc3RzKCR0YWdzX2ZpZWxk
LCAkcm93KSkgewoJCQkkdGVtcF9hcnJheSA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdz
X3N0cnRvbG93ZXIoJHJvd1skdGFnc19maWVsZF0pKSk7CgkJfQoJCSRhbGxfdGFncyA9IGFy
cmF5X21lcmdlKCRhbGxfdGFncywgdHJ1X3RhZ3NfdHJpbV90YWdzKCR0ZW1wX2FycmF5KSk7
Cgl9CgoJcmV0dXJuICRhbGxfdGFnczsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2ZpbHRlcl9z
ZWN0aW9ucygkZXhjbHVkZXNlY3Rpb24pIHsKCSRzZWN0aW9ucyA9IGV4cGxvZGUoJywnLCAk
ZXhjbHVkZXNlY3Rpb24pOwoJJGZpbHRlcnMgPSBhcnJheSgpOwoJZm9yZWFjaCAoJHNlY3Rp
b25zIGFzICRzZWN0aW9uKSB7CgkJJGZpbHRlcnNbXSA9ICJhbmQgU2VjdGlvbiAhPSAnIi5k
b1NsYXNoKCRzZWN0aW9uKS4iJyI7Cgl9CglyZXR1cm4gam9pbignICcsICRmaWx0ZXJzKTsK
fQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAk
YWxsX3RhZ3NfZm9yX3dlaWdodCkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWV4dHJh
Y3QoJGF0dHMpOwoKCSR0YWdzX3dlaWdodCA9IGFycmF5X2NvdW50X3ZhbHVlcygkYWxsX3Rh
Z3NfZm9yX3dlaWdodCk7CgoJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdl
aWdodCkgewoJCWlmICghaW5fYXJyYXkoJHRhZywgJGFsbF90YWdzKQoJCSAgIHx8ICR0YWdz
X3dlaWdodFskdGFnXSA8ICRtaW50YWdjb3VudAoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFn
XSA+ICRtYXh0YWdjb3VudCkgewoJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRhZ10pOwoJCX0K
CX0KCgkkc29ydF9ieV9jb3VudCA9IChzdHJwb3MoJHNvcnQsICdjb3VudCcpICE9PSBmYWxz
ZSk7Cgkkc29ydF9hc2NlbmRpbmcgPSAoc3RycG9zKCRzb3J0LCAnYXNjJykgIT09IGZhbHNl
KTsKCSR0YWdzX3dlaWdodCA9IHRydV90YWdzX3NvcnRfdGFncygkdGFnc193ZWlnaHQsICRz
b3J0X2J5X2NvdW50LCAkc29ydF9hc2NlbmRpbmcpOwoKCWlmICgkbGlzdGxpbWl0ID4gMCAm
JiAkbGlzdGxpbWl0IDwgY291bnQoJHRhZ3Nfd2VpZ2h0KSkgewoJCSRyZXNvcnRlZF90YWdz
ID0gYXJyYXkoKTsKCQlpZiAoJGtlZXAgPT0gJ2xhcmdlc3QnKSB7CgkJCSRyZXNvcnRlZF90
YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCB0cnVl
LCBmYWxzZSkpOwoJCX0gZWxzZSB7CgkJCWlmICgka2VlcCA9PSAncmFuZG9tJykgewoJCQkJ
Zm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCQkJCSRyZXNv
cnRlZF90YWdzWyR0YWddID0gcmFuZCgwLCAkd2VpZ2h0KTsKCQkJCX0KCQkJCSRyZXNvcnRl
ZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0X3RhZ3MoJHJlc29ydGVkX3RhZ3Ms
IHRydWUsIGZhbHNlKSk7CgkJCX0gZWxzZSBpZiAoJGtlZXAgPT0gJ2FscGhhJykgewoJCQkJ
JHJlc29ydGVkX3RhZ3MgPSBhcnJheV9rZXlzKCR0YWdzX3dlaWdodCk7CgkJCQluYXRjYXNl
c29ydCgkcmVzb3J0ZWRfdGFncyk7CgkJCX0KCQkJJGN1dG9mZiA9ICdleGFjdCc7CgkJfQoK
CQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAtIDE7CgkJaWYgKCRjdXRvZmYgPT0g
J2NodW5rJykgeyAvL2FsdGVybmF0aXZlIGlzICdleGFjdCcKCQkJJGxhc3Rfd2VpZ2h0ID0g
LTE7CgkJCWZvciAoJGkgPSAwOyAkaSA8ICRsaXN0bGltaXQgKyAxOyAkaSsrKSB7CgkJCQkk
bmV3X3dlaWdodCA9ICR0YWdzX3dlaWdodFskcmVzb3J0ZWRfdGFnc1skaV1dOwoJCQkJaWYg
KCRuZXdfd2VpZ2h0ICE9ICRsYXN0X3dlaWdodCkgewoJCQkJCSRsYXN0X2dvb2RfaW5kZXgg
PSAkaSAtIDE7CgkJCQkJJGxhc3Rfd2VpZ2h0ID0gJG5ld193ZWlnaHQ7CgkJCQl9CgkJCX0K
CQkJaWYgKCRsYXN0X2dvb2RfaW5kZXggPCAwKSB7CgkJCQkkbGFzdF9nb29kX2luZGV4ID0g
JGxpc3RsaW1pdCAtIDE7CgkJCX0KCQl9CgoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfY2h1
bmsoJHJlc29ydGVkX3RhZ3MsICRsYXN0X2dvb2RfaW5kZXggKyAxKTsKCQkkcmVzb3J0ZWRf
dGFncyA9ICRyZXNvcnRlZF90YWdzWzBdOwoKCQlmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMg
JHRhZyA9PiAkd2VpZ2h0KSB7CgkJCWlmICghaW5fYXJyYXkoJHRhZywgJHJlc29ydGVkX3Rh
Z3MpKSB7CgkJCQl1bnNldCgkdGFnc193ZWlnaHRbJHRhZ10pOwoJCQl9CgkJfQoJfQoKCWlm
ICgkZ2VuZXJhdGVsaW5rcykgewoJCWlmICgkbGlua3BhdGgpIHsKCQkJJHVybHByZWZpeCA9
ICRsaW5rcGF0aDsKCQkJJHVybHN1ZmZpeCA9ICRsaW5rcGF0aHRhaWw7CgkJfSBlbHNlIHsK
CQkJaWYgKHRydV90YWdzX2NsZWFuX3VybHMoKSkgewoJCQkJJHVybHByZWZpeCA9IGh1IC4g
JHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUgLiAnLyc7CgkJCX0gZWxzZSB7
CgkJCQkkdXJscHJlZml4ID0gaHUgLiAnP3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VD
VElPTl0tPnZhbHVlIC4gJyZhbXA7JyAuICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52
YWx1ZSAuICc9JzsKCQkJfQoJCQkkdXJsc3VmZml4ID0gKHRydV90YWdzX2NsZWFuX3VybHMo
KSA/ICcvJyA6ICcnKTsKCQl9CgoJCWlmICgkdXNlcmVsdGFnKSB7CgkJCWlmICgkdXNlbm9m
b2xsb3cpIHsKCQkJCSR1cmxzdWZmaXggLj0gJyIgcmVsPSJ0YWcgbm9mb2xsb3cnOwoJCQl9
IGVsc2UgewoJCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9InRhZyc7CgkJCX0KCQl9IGVsc2Ug
aWYgKCR1c2Vub2ZvbGxvdykgewoJCQkkdXJsc3VmZml4IC49ICciIHJlbD0ibm9mb2xsb3cn
OwoJCX0KCX0KCglpZiAoY291bnQoJHRhZ3Nfd2VpZ2h0KSA+IDApIHsKCQkkbWF4ID0gbWF4
KCR0YWdzX3dlaWdodCk7CgkJJG1pbiA9IG1pbigkdGFnc193ZWlnaHQpOwoJfSBlbHNlIHsK
CQkkbWF4ID0gJG1pbiA9IDA7Cgl9Cgkkc3RlcHZhbHVlID0gKCRtYXggPT0gJG1pbikgPyAw
IDogKCRtYXhwZXJjZW50IC0gJG1pbnBlcmNlbnQpIC8gKCRtYXggLSAkbWluKTsKCgkkdGFn
c19odG1sID0gYXJyYXkoKTsKCSR0YWdfc2VhcmNoX3RhZyA9IHRydV90YWdzX3RhZ19wYXJh
bWV0ZXIoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gJzEnKSk7CgkkdGFnX3NlYXJjaF90YWcg
PSBmdW5jdGlvbl9leGlzdHMoImh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlIikgPyBodG1sc3Bl
Y2lhbGNoYXJzX2RlY29kZSgkdGFnX3NlYXJjaF90YWcpIDogaHRtbF9lbnRpdHlfZGVjb2Rl
KCR0YWdfc2VhcmNoX3RhZyk7Cglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAk
d2VpZ2h0KSB7CgkJJHRhZ193ZWlnaHQgPSBmbG9vcigkbWlucGVyY2VudCArICgkd2VpZ2h0
IC0gJG1pbikgKiAkc3RlcHZhbHVlKTsKCgkJJHN0eWxlID0gJyc7CgkJaWYgKCRzZXRzaXpl
cykKCQkJJHN0eWxlID0gJyBzdHlsZT0iZm9udC1zaXplOiAnIC4gJHRhZ193ZWlnaHQgLiAn
JTsiJzsKCgkJJHRhZ19jbGFzcyA9ICcnOwoJCWlmICgkc2V0Y2xhc3NlcykgewoJCQkkdGFn
X2NsYXNzID0gJyBjbGFzcz0iJzsKCQkJaWYgKCR3ZWlnaHQgPT0gJG1pbikgewoJCQkJJHRh
Z19jbGFzcyAuPSAidGFnU2l6ZVNtYWxsZXN0IjsKCQkJfSBlbHNlIGlmICgkd2VpZ2h0ID09
ICRtYXgpIHsKCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVMYXJnZXN0IjsKCQkJfSBlbHNl
IHsKCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVNZWRpdW0iOwoJCQl9CgkJCSR0YWdfY2xh
c3MgLj0gJyB0YWdTaXplJyAuICgkd2VpZ2h0ICsgMSAtICRtaW4pOwoJCQlpZiAoJHRhZyA9
PSAkdGFnX3NlYXJjaF90YWcpIHsKCQkJCSR0YWdfY2xhc3MgLj0gJyAnIC4gJGFjdGl2ZWNs
YXNzOwoJCQl9CgkJCSR0YWdfY2xhc3MgLj0gJyInOwoJCX0KCgkJLy9hZGFwdGVkIGZyb20g
Y29kZSBieSBnZHRyb2lhbm8sIHNlZSBodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3Zp
ZXd0b3BpYy5waHA/cGlkPTEwMjg3NSNwMTAyODc1CgkJJHRpdGxlY291bnQgPSAnJzsKCQlp
ZiAoJHRpdGxlKQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAnIic7
CgkJJGRpc3BsYXljb3VudD0gJyc7CgkJJGNvdW50ID0gJGNvdW50d3JhcGNoYXJzezB9IC4g
JHdlaWdodCAuICRjb3VudHdyYXBjaGFyc3sxfTsKCQlpZiAoJHNob3djb3VudHMgPT0gJ3Rp
dGxlJyB8fCAkc2hvd2NvdW50cyA9PSAnYm90aCcpCgkJCSR0aXRsZWNvdW50ID0gJyB0aXRs
ZT0iJyAuICR0aXRsZSAuICRjb3VudCAuICciJzsKCQlpZiAoJHNob3djb3VudHMgJiYgJHNo
b3djb3VudHMgIT0gJ3RpdGxlJykKCQkJJGRpc3BsYXljb3VudCA9ICcgJyAuICRjb3VudDsK
CgkJaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdjYXBpdGFsaXplJykgewoJCQkkdGFnID0gdWN3
b3JkcygkdGFnKTsKCQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICd1cHBlcmNhc2Un
KSB7CgkJCSR0YWcgPSBzdHJ0b3VwcGVyKCR0YWcpOwoJCX0gZWxzZSBpZiAoJHRleHR0cmFu
c2Zvcm0gPT0gJ2xvd2VyY2FzZScpIHsKCQkJJHRhZyA9IHN0cnRvbG93ZXIoJHRhZyk7CgkJ
fSBlbHNlIGlmICgkdGV4dHRyYW5zZm9ybSA9PSAnY2FwZmlyc3QnKSB7CgkJCSR0YWcgPSB1
Y2ZpcnN0KCR0YWcpOwoJCX0KCgkJaWYgKCRnZW5lcmF0ZWxpbmtzKSB7CgkJCSR3aG9sZXVy
bCA9ICciJyAuICR1cmxwcmVmaXggLiB1cmxlbmNvZGUoc3RyX3JlcGxhY2UoJyAnLCAnLScs
ICR0YWcpKSAuICR1cmxzdWZmaXggLiAnIic7CgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVm
PScgLiAkd2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQgLiAn
PicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsK
CQl9IGVsc2UgaWYgKCR0YWdfY2xhc3MgfHwgJHN0eWxlIHx8ICR0aXRsZWNvdW50KSB7CgkJ
CSR0YWdzX2h0bWxbXSA9ICc8c3BhbicgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxl
Y291bnQgLiAnPicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvc3Bhbj4nIC4gJGRp
c3BsYXljb3VudDsKCQl9IGVsc2UgewoJCQkkdGFnc19odG1sW10gPSBodG1sc3BlY2lhbGNo
YXJzKCR0YWcpIC4gJGRpc3BsYXljb3VudDsKCQl9Cgl9CglyZXR1cm4gdHJ1X3RhZ3NfZG9f
d3JhcCgkdGFnc19odG1sLCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNz
KTsKfQoKCiMjIyBDTEVBTiBVUkwgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMKCmlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCXJlZ2lzdGVyX2NhbGxi
YWNrKCd0cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcicsICdwcmV0ZXh0Jyk7Cn0KCgpmdW5j
dGlvbiB0cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7CglnbG9i
YWwgJHRydV90YWdzX3ByZWZzOwoJJHN1YnBhdGggPSBwcmVnX3JlcGxhY2UoIi9odHRwcz86
XC9cLy4qKFwvLiopL1VpIiwiJDEiLGh1KTsKCSRyZWdzYWZlc3VicGF0aCA9IHByZWdfcXVv
dGUoJHN1YnBhdGgsICcvJyk7CgkkcmVxID0gcHJlZ19yZXBsYWNlKCIvXiRyZWdzYWZlc3Vi
cGF0aC9pIiwnLycsJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pOwoKCSRxcyA9IHN0cnBvcygk
cmVxLCAnPycpOwoJJHFhdHRzID0gKCRxcyA/ICcmJy5zdWJzdHIoJHJlcSwgJHFzICsgMSkg
OiAnJyk7CglpZiAoJHFzKSAkcmVxID0gc3Vic3RyKCRyZXEsIDAsICRxcyk7CgoJJHBhcnRz
ID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcihzcGxpdCgnLycsICRyZXEpKSk7CglpZiAo
Y291bnQoJHBhcnRzKSA9PSAyICYmICRwYXJ0c1swXSA9PSAkdHJ1X3RhZ3NfcHJlZnNbVEFH
X1NFQ1RJT05dLT52YWx1ZSkgewoJCSR0YWcgPSAkcGFydHNbMV07CgkJJF9TRVJWRVJbJ1FV
RVJZX1NUUklORyddID0gJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlIC4gJz0n
IC4gJHRhZyAuICRxYXR0czsKCQkkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA9ICRzdWJwYXRo
IC4gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUgLiAnLz8nIC4gJF9TRVJW
RVJbJ1FVRVJZX1NUUklORyddOwoJCWlmIChjb3VudCgkX1BPU1QpID4gMCkgewoJCQkkX1BP
U1RbJ3NlY3Rpb24nXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlOwoJ
CQkkX1BPU1RbJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7CgkJ
fSBlbHNlIHsKCQkJJF9HRVRbJ3NlY3Rpb24nXSA9ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VD
VElPTl0tPnZhbHVlOwoJCQkkX0dFVFskdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFs
dWVdID0gJHRhZzsKCQl9Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19jbGVhbl91cmxzKCkg
ewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsKCXJldHVybiAoJ2NsZWFuJyA9PSAkdHJ1X3Rh
Z3NfcHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlKTsKfQoKCiMjIyBBRE1JTiBTSURFIEZVTkNU
SU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKaWYgKEB0eHBpbnRlcmZh
Y2UgPT0gJ2FkbWluJykgewoJYWRkX3ByaXZzKCd0cnVfdGFncycsICcxLDInKTsKCXJlZ2lz
dGVyX3RhYignZXh0ZW5zaW9ucycsICd0cnVfdGFncycsICd0cnVfdGFncycpOwoJcmVnaXN0
ZXJfY2FsbGJhY2soJ3RydV90YWdzX2FkbWluX3RhYicsICd0cnVfdGFncycpOwoKCWlmICgk
dHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9XUklURV9UQUJdLT52YWx1ZSkgewoJCXJlZ2lzdGVy
X2NhbGxiYWNrKCd0cnVfdGFnc19hZG1pbl93cml0ZV90YWJfaGFuZGxlcicsICdhcnRpY2xl
Jyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl90YWIoJGV2ZW50LCAkc3RlcCkg
ewoJcmVxdWlyZV9wcml2cygndHJ1X3RhZ3MnKTsKCgkkcmVzdWx0cyA9IHRydV90YWdzX2Fk
bWluX3RhYl9oYW5kbGVfaW5wdXQoKTsKCgkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFy
ZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNlLCBmYWxzZSk7CgkkYWxsX3RhZ3MgPSB0cnVf
dGFnc19jbG91ZF9xdWVyeSgkYXR0cyk7CgkkY2xvdWQgPSB0cnVfdGFnc19yZW5kZXJfY2xv
dWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdzKTsKCgkkcmVkaXJlY3RzID0gdHJ1X3Rh
Z3NfbG9hZF9yZWRpcmVjdHMoKTsKCgl0cnVfdGFnc19hZG1pbl90YWJfcmVuZGVyX3BhZ2Uo
JHJlc3VsdHMsICRjbG91ZCwgJHJlZGlyZWN0cyk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19h
ZG1pbl90YWJfcmVuZGVyX3BhZ2UoJHJlc3VsdHMsICRjbG91ZCwgJHJlZGlyZWN0cykgewoJ
Z2xvYmFsICRldmVudDsKCXBhZ2V0b3AoJ3RydV90YWdzJywgJycpOwoKCWluY2x1ZGUodHhw
YXRoIC4gJy9pbmNsdWRlL3R4cF9wcmVmcy5waHAnKTsKCWdsb2JhbCAkdHJ1X3RhZ3NfcHJl
ZnM7CgoJZWNobyBzdGFydFRhYmxlKCdsYXlvdXQnLCAnJywgJycsICcxMHB4JykuJzx0cj48
dGQgc3R5bGU9ImJvcmRlci1yaWdodDoycHggc29saWQgZ3JheSI+Jy4gICMgSSBrbm93LCBJ
IGtub3cuLi4KCQlzdGFydFRhYmxlKCdsYXlvdXQnLCAnJywgJycsICcnLCAnMTBweCcpLic8
dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBzb2xpZCBncmF5Ij4nLgoJCQlzdGFy
dFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzMwMHB4JykuCgkJCQl0cihoQ2VsbChnVHh0
KCdDdXJyZW50IHRhZ3MnKSkpLgoJCQkJdHIodGQoJGNsb3VkKSkuCgkJCWVuZFRhYmxlKCku
CgkJJzwvdGQ+PC90cj48dHI+PHRkPicuCgkJCXN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycs
ICcnLCAnMzAwcHgnKS4KCQkJCXRyKGhDZWxsKGdUeHQoJ3RydV90YWdzIFJlZmVyZW5jZScp
KSkuCgkJCQl0cih0ZCgnPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJl
bmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9ucyI+VXNhZ2UgaW5zdHJ1Y3Rpb25z
PC9hPicuCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20v
dmlld3RvcGljLnBocD9pZD0xNTA4NCI+Rm9ydW0gcGFnZXM8L2E+Jy4KCQkJCSc8YnI+PGEg
aHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzUzNy90cnVfdGFncy1y
ZWxlYXNlcyI+UmVsZWFzZXMgcGFnZTwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJodHRwOi8v
d3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3RydV90YWdzLXJvYWRtYXAiPlJlbGVh
c2Ugcm9hZG1hcDwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0
LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVyZS1saXN0Ij5GZWF0dXJlIGxpc3Q8
L2E+Jy4KCQkJCSc8YnI+PGJyPjxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL2Js
b2cvNDkzL3RydXRhZ3MtYS10YWdnaW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iPnRydV90
YWdzPC9hPiwgYnkgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vIj5OYXRoYW4g
QXJ0aHVyPC9hPicuCgkJCQknPGJyPjxicj4nLgoJCQkJJzxkaXYgaWQ9InBheXBhbCI+PGZv
cm0gYWN0aW9uPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyIiBtZXRo
b2Q9InBvc3QiPjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhj
bGljayIgLz48aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsLmNv
bS9lbl9VUy9pL2J0bi94LWNsaWNrLWJ1dDA0LmdpZiIgbmFtZT0ic3VibWl0IiBhbHQ9Ik1h
a2UgYSBkb25hdGlvbiB0byBOYXRoYW4gQXJ0aHVyIiAvPjxpbWcgYWx0PSIiIGJvcmRlcj0i
MCIgc3JjPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2VuX1VTL2kvc2NyL3BpeGVsLmdpZiIg
d2lkdGg9IjEiIGhlaWdodD0iMSIgLz48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJlbmNy
eXB0ZWQiIHZhbHVlPSItLS0tLUJFR0lOIFBLQ1M3LS0tLS1NSUlIVHdZSktvWklodmNOQVFj
RW9JSUhRRENDQnp3Q0FRRXhnZ0V3TUlJQkxBSUJBRENCbERDQmpqRUxNQWtHQTFVRUJoTUNW
Vk14Q3pBSkJnTlZCQWdUQWtOQk1SWXdGQVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJR
d0VnWURWUVFLRXd0UVlYbFFZV3dnU1c1akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBj
ekVSTUE4R0ExVUVBeFFJYkdsMlpWOWhjR2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhC
aGVYQmhiQzVqYjIwQ0FRQXdEUVlKS29aSWh2Y05BUUVCQlFBRWdZQzhpMVQyN2xqS2ZwTlRF
UWkwd0tIY2RHdWx4eGtNcXdkQ01tYkd2czg3bi80VHNKdGlBc3FNbzJoeXM3WnNHeTVSRi9P
N3MrQjJvUTc2elVsVDUyV1c3UWVYVUszR3AwbnIyY1AzaW9CU3ROdStSWjZqa2FtMkUwRkdM
WHlWNitVTlZFT3doOGxtb0lTUm90dlN2SWdReVRMbkVlREhxRzlxdlV6cXZGM1NxakVMTUFr
R0JTc09Bd0lhQlFBd2djd0dDU3FHU0liM0RRRUhBVEFVQmdncWhraUc5dzBEQndRSXBtUFpy
bHJaZlptQWdhaWVQVmIrbjlzVmRzdWZnR3JtQXcyclhBelIzOWtZcVBVSjduMExpTkRtZEFx
NzNKb1A1M2taeThnU3BvdnVjTDJTMGpDMXNYcmNwRUxBcExMOEJGU0hmZExpWm9aU1YvQ1lP
cHBINStkeDJZcUZJZHlDQ2RqSVg3b09QZ1F5QXVnUmEyUXIzYit5dXR1RzBERnNkK0xBSkdi
OGw0Q25ucmJtd2RZSzNOblZEQlBPbXhFT2psWFVnRXpsRkxYbUUzdzUrTW9QS1FjcDJuOGZk
SkxzZ0cxNXhvVlBGekNkL0syZ2dnT0hNSUlEZ3pDQ0F1eWdBd0lCQWdJQkFEQU5CZ2txaGtp
Rzl3MEJBUVVGQURDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQk1SWXdG
QVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFLRXd0UVlYbFFZV3dnU1c1
akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0ExVUVBeFFJYkdsMlpWOWhj
R2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVqYjIwd0hoY05NRFF3TWpF
ek1UQXhNekUxV2hjTk16VXdNakV6TVRBeE16RTFXakNCampFTE1Ba0dBMVVFQmhNQ1ZWTXhD
ekFKQmdOVkJBZ1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZ
RFZRUUtFd3RRWVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJN
QThHQTFVRUF4UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhC
aGJDNWpiMjB3Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU1GSFR0MzhS
TXhMWEp5TzJTbVMrTmRsNzJUN29LSjR1NHV3KzZhd250QUxXaDAzUGV3bUlKdXpiQUxTY3NU
UzRzWm9TMWZLY2lCR29oMTFnSWZIenlsdmtkTmUvaEpsNjYvUkdxcmo1ckZiMDhzQUFCTlR6
RFRpcXFOcEplQnNZcy9jMmFpR296cHRYMlJsbkJrdEgrU1VOcEFhalc3MjROdjJXdmhpZjZz
RkFnTUJBQUdqZ2U0d2dlc3dIUVlEVlIwT0JCWUVGSmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFda
SlJyTUlHN0JnTlZIU01FZ2JNd2diQ0FGSmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFdaSlJyb1lH
VXBJR1JNSUdPTVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNCTUNRMEV4RmpBVUJnTlZC
QWNURFUxdmRXNTBZV2x1SUZacFpYY3hGREFTQmdOVkJBb1RDMUJoZVZCaGJDQkpibU11TVJN
d0VRWURWUVFMRkFwc2FYWmxYMk5sY25Sek1SRXdEd1lEVlFRREZBaHNhWFpsWDJGd2FURWNN
Qm9HQ1NxR1NJYjNEUUVKQVJZTmNtVkFjR0Y1Y0dGc0xtTnZiWUlCQURBTUJnTlZIUk1FQlRB
REFRSC9NQTBHQ1NxR1NJYjNEUUVCQlFVQUE0R0JBSUZmT2xhYWdGcmw3MStqcTZPS2lkYldG
U0UrUTRGcVJPdmRnSU9OdGgrOGtTSy8vWS80aWh1RTRZbXZ6bjVjZUUzUy9pQlNRUU1qeXZi
K3MyVFdiUVlEd2NwMTI5T1BJYkQ5ZXBkcjR0Sk9VTmlTb2p3N0JId1lSaVBoNThTMXhHbEZn
SEZYd3JFQmIzZGdOYk1VYSt1NHFlY3RzTUFYcFZIbkQ5d0l5Zm1ITVlJQm1qQ0NBWllDQVFF
d2daUXdnWTR4Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkRRVEVXTUJRR0ExVUVC
eE1OVFc5MWJuUmhhVzRnVm1sbGR6RVVNQklHQTFVRUNoTUxVR0Y1VUdGc0lFbHVZeTR4RXpB
UkJnTlZCQXNVQ214cGRtVmZZMlZ5ZEhNeEVUQVBCZ05WQkFNVUNHeHBkbVZmWVhCcE1Sd3dH
Z1lKS29aSWh2Y05BUWtCRmcxeVpVQndZWGx3WVd3dVkyOXRBZ0VBTUFrR0JTc09Bd0lhQlFD
Z1hUQVlCZ2txaGtpRzl3MEJDUU14Q3dZSktvWklodmNOQVFjQk1Cd0dDU3FHU0liM0RRRUpC
VEVQRncwd09EQTNNRE13TkRFME1USmFNQ01HQ1NxR1NJYjNEUUVKQkRFV0JCVDB0a2o0ZFpM
ZS9FNFF3YmliMjlYRWRIeEFZakFOQmdrcWhraUc5dzBCQVFFRkFBU0JnTDVKc1FIalE5U2c0
WTNlRFdLRE8xNnIrdGZFejRSWUFEdCs2aDk4MWZrVkN4Zk5IRkR4b2ZEY3h5elJNWXI3eTk1
Y2RuVmk0QU5Rd01VWTZ5Slc1am0vR0QxN3JqZ1N4Wk1FdnNBZTZZY0NTTEs1WmFwQ3cxcWx5
U3BQR1pCQTNNVHQ2T0Qrb3ZWb2EvMXY4Q05zRWNIcDdmNHRPeE9VU3c1UDRuSHlMUFdqLS0t
LS1FTkQgUEtDUzctLS0tLSI+PC9mb3JtPjwvZGl2PicKCQkJCSkpLgoJCQllbmRUYWJsZSgp
LgoJCSc8L3RkPjwvdHI+Jy5lbmRUYWJsZSgpLgoJJzwvdGQ+PHRkPicuCgkJc3RhcnRUYWJs
ZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90
dG9tOjJweCBzb2xpZCBncmF5O3dpZHRoOjQwMHB4Ij4nOwoKCQlpZiAoJHJlc3VsdHMpIHsK
CQkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJCXRy
KGhDZWxsKGdUeHQoJ1Jlc3VsdHMnKSkpLgoJCQkJdHIodGRhKCRyZXN1bHRzKSwgJyBzdHls
ZT0iY29sb3I6cmVkIicpLgoJCQllbmRUYWJsZSgpOwoJCQllY2hvICc8L3RkPjwvdHI+PHRy
Pjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsKCQl9CgoKCQll
Y2hvIHN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLgoJCQl0cih0YWco
Z1R4dCgnQXJ0aWNsZSBUYWcgTWFpbnRlbmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2UgU2Vuc2l0
aXZlJykuJyEpJywgJ3RoJywgJyBjb2xzcGFuPSI1IicpKS4KCQkJdHIoCgkJCQlmb3JtKAoJ
CQkJCXRkYShnVHh0KCdSZW5hbWUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjpt
aWRkbGUiJykuCgkJCQkJdGQodGV4dF9pbnB1dCgnbWF0Y2h0YWcnLCAnJywgJzE1JykpLgoJ
CQkJCXRkYShnVHh0KCd0bycpLic6JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxl
IicpLgoJCQkJCXRkKHRleHRfaW5wdXQoJ3JlcGxhY2V0YWcnLCAnJywgJzE1JykpLgoJCQkJ
CXRkKGZJbnB1dCgnc3VibWl0JywgJ3JlcGxhY2UnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gn
KS5lSW5wdXQoJ3RydV90YWdzJykpLAoJCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdh
cmVfeW91X3N1cmUnKSAuICdcJykiJwoJCQkJKQoJCQkpLgoJCQl0cigKCQkJCWZvcm0oCgkJ
CQkJdGRhKGdUeHQoJ0RlbGV0ZScpLic6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p
ZGRsZSInKS4KCQkJCQl0ZCh0ZXh0X2lucHV0KCdkZWxldGV0YWcnLCAnJywgJzE1JykpLgoJ
CQkJCXRkY3MoJycsIDIpLgoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ2RlbGV0ZScsIGdU
eHQoJ1J1bicpLCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSksCgkJCQkJJycsICcg
dmVyaWZ5KFwnJyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInCgkJCQkpCgkJCSku
CgkJZW5kVGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVy
LWJvdHRvbToycHggc29saWQgZ3JheSI+JzsKCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0Jywg
JycsICcnLCAnJywgJzEwMCUnKS4KCQkJdHIodGFnKGdUeHQoJ1JlZGlyZWN0aW9ucycpLCAn
dGgnLCAnIGNvbHNwYW49IjQiJykpOwoJCQlmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0
dGFnID0+ICRyaWdodHRhZykgewoJCQkJZWNobyB0cigKCQkJCQl0ZGEoaHJlZigkbGVmdHRh
ZywgdHJ1X3RhZ3NfbGlua2lmeV90YWcoJGxlZnR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGln
bjogY2VudGVyIicpLgoJCQkJCXRkYShodG1sc3BlY2lhbGNoYXJzKCc9PicpLCAnIHN0eWxl
PSJ0ZXh0LWFsaWduOiBjZW50ZXIiJykuCgkJCQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVf
dGFnc19saW5raWZ5X3RhZygkcmlnaHR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2Vu
dGVyIicpLgoJCQkJCXRkKCc8YSBocmVmPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MmYW1w
O2RlbGV0ZV9yZWRpcmVjdD0nLnVybGVuY29kZSgkbGVmdHRhZykuJyIgIG9uY2xpY2s9InJl
dHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPkRlbGV0ZTwvYT4n
KQoJCQkJKTsKCQkJfQoJCQllY2hvIHRyKAoJCQkJJzxmb3JtIG5hbWU9InJlZGlyZWN0IiBp
ZD0icmVkaXJlY3QiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSJpbmRleC5waHA/ZXZlbnQ9dHJ1
X3RhZ3MiIG9uc3VibWl0PSJyZXR1cm4gdmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUn
KS4nXCcpIj4nLgoJCQkJCXRkYSh0ZXh0X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScpLCAn
IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlciInKS4KCQkJCQl0ZGEoaHRtbHNwZWNpYWxjaGFy
cygnPT4nKSwgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2Vu
dGVyIicpLgoJCQkJCXRkYSh0ZXh0X2lucHV0KCdyaWdodHRhZycsICcnLCAnMTUnKSwgJyBz
dHlsZT0idGV4dC1hbGlnbjpjZW50ZXIiJykuCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBvbmNs
aWNrPSJpZiAodmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1bWVu
dC5nZXRFbGVtZW50QnlJZChcJ3JlZGlyZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7
Ij5BZGQgbmV3PC9hPicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJ
CQlmSW5wdXQoJ2hpZGRlbicsICdyZWRpcmVjdCcsICcxJykuCgkJCQknPC9mb3JtPicKCgkJ
CSkuCgkJZW5kVGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZD4nOwoKCQllY2hv
IHN0YXJ0VGFibGUoJ2xpc3QnKS4KCQkJdHIodGFnKGdUeHQoJ1ByZWZlcmVuY2VzJyksICd0
aCcsICcgY29sc3Bhbj0iMiInKSkuCgkJCWZvcm0oCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgn
VXNlIGNsZWFuIFVSTHMnKS4nICgnLmdUeHQoJ3NpdGUgZGVmYXVsdCBpcycpLicgJy4kdHJ1
X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10tPmRlZmF1bHRfdmFsdWUuJyk6ICcsICcgc3R5bGU9
InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZChyYWRpb19saXN0KENMRUFOX1VS
TFMsCgkJCQkJCQlhcnJheSgnY2xlYW4nPT5nVHh0KCdjbGVhbicpLCAnbWVzc3knPT5nVHh0
KCdtZXNzeScpKSwKCQkJCQkJCSR0cnVfdGFnc19wcmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUp
KQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShnVHh0KCdUYWcgc2VjdGlvbiBuYW1lJykuJyAo
ZGVmYXVsdCBpcyAiJy4kdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT5kZWZhdWx0X3Zh
bHVlLiciKTogJywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRk
KHRleHRfaW5wdXQoVEFHX1NFQ1RJT04sICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0t
PnZhbHVlLCAnMTUnKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnVVJMIHBhcmFt
ZXRlciBmb3IgdGFnIHNlYXJjaCcpLicgKGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZz
W1BBUk1fTkFNRV0tPmRlZmF1bHRfdmFsdWUuJyIpOiAnLgoJCQkJCQknPGJyPih5b3Ugc2hv
dWxkblwndCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFy
ZSBkb2luZyknLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQo
dGV4dF9pbnB1dChQQVJNX05BTUUsICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1
ZSwgJzE1JykpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1B1dCB0YWdzIGludG8g
UlNTL0F0b20gZmVlZHMsIGluICJDYXRlZ29yeSIgZWxlbWVudHMnKS4KCQkJCQkJJzogPGJy
Pih5b3UgcHJvYmFibHkgd2FudCB0aGlzKScsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p
ZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9DQVRFR09SSUVTLCAk
dHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkpCgkJCQkp
LgoJCQkJdHIoCgkJCQkJdGRhKCdBcHBlbmQgdGhlIHRhZyBsaXN0IHRvIHRoZSBib2R5IG9m
IFJTUy9BdG9tIGZlZWRzLCAnLgoJCQkJCQknd2l0aCBsaW5rcywgYW5kIHdpdGggcmVsPSJ0
YWciOjxicj5JZiB0aGlzIGlzIHR1cm5lZCBvbiwnLgoJCQkJCQkneW91IGNhbiBkZWZpbmUg
YSAibWlzYyIgZm9ybSBuYW1lZCB0cnVfdGFnc19mZWVkX3RhZ3MgJy4KCQkJCQkJJ3RoYXQg
d2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgdGFncyBpbiB0aGUgZmVlZC4nLAoJCQkJCQkn
IHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQoeWVzbm9SYWRpbyhU
QUdTX0lOX0ZFRURfQk9EWSwgJHRydV90YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXS0+
dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRkYShnVHh0KCdTaG93IGEgY2xpY2thYmxl
IGxpc3Qgb2YgdGFncyBvbiB0aGUgIldyaXRlIiBwYWdlJykuJzogJywKCQkJCQkJJyBzdHls
ZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHllc25vUmFkaW8oVEFHU19J
Tl9XUklURV9UQUIsICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVl
KSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZCgnJykuCgkJCQkJdGRhKGZJbnB1dCgnc3VibWl0
JywgJ3ByZWZzJywgZ1R4dCgnU2F2ZScpLCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3Mn
KSwgJyBzdHlsZT0idGV4dC1hbGlnbjpyaWdodCInKQoJCQkJKSwKCQkJCScnLCAnIHZlcmlm
eShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAuICdcJykiJwoJCQkpLgoJCWVuZFRhYmxl
KCkuJzwvdGQ+PC90cj4nLgoJCWVuZFRhYmxlKCk7CgoJZWNobyAnPC90ZD48L3RyPicuZW5k
VGFibGUoKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3RhYl9oYW5kbGVfaW5wdXQo
KSB7CglpZiAoZ3BzKCdwcmVmcycpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX3VwZGF0
ZV9wcmVmcygpOwoJfSBlbHNlIGlmIChncHMoJ2RlbGV0ZScpKSB7CgkJcmV0dXJuIHRydV90
YWdzX2FkbWluX2RlbGV0ZV90YWcoZ3BzKCdkZWxldGV0YWcnKSk7Cgl9IGVsc2UgaWYgKGdw
cygncmVwbGFjZScpKSB7CgkJJHJlc3VsdCA9IHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFn
KGdwcygnbWF0Y2h0YWcnKSwgZ3BzKCdyZXBsYWNldGFnJyksIGZhbHNlKTsKCQlyZXR1cm4g
JHJlc3VsdCAuICc8YnI+JyAuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ21h
dGNodGFnJyksIGdwcygncmVwbGFjZXRhZycpKTsKCX0gZWxzZSBpZiAoZ3BzKCdyZWRpcmVj
dCcpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ2xlZnR0
YWcnKSwgZ3BzKCdyaWdodHRhZycpKTsKCX0gZWxzZSBpZiAoZ3BzKCdkZWxldGVfcmVkaXJl
Y3QnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1pbl9kZWxldGVfcmVkaXJlY3QoZ3BzKCdk
ZWxldGVfcmVkaXJlY3QnKSk7Cgl9IGVsc2UgewoJCXJldHVybiAnJzsKCX0KfQoKCmZ1bmN0
aW9uIHRydV90YWdzX2FkbWluX3VwZGF0ZV9wcmVmcygpIHsKCWdsb2JhbCAkdHJ1X3RhZ3Nf
cHJlZnM7CgkkcmVzdWx0cyA9IGFycmF5KCk7Cglmb3JlYWNoICgkdHJ1X3RhZ3NfcHJlZnMg
YXMgJHByZWYpIHsKCQkkdmFsaWRfdmFsdWUgPSAkcHJlZi0+dmFsaWRhdGVfdmFsdWUoZ3Bz
KCRwcmVmLT5uYW1lKSk7CgkJaWYgKCR2YWxpZF92YWx1ZSAmJiAkdmFsaWRfdmFsdWUgPD4g
Z3BzKCRwcmVmLT5uYW1lKSkgewoJCQlyZXR1cm4gJHZhbGlkX3ZhbHVlOyAgIyMjIHRoaXMg
aXMgYSBzbmVha3kgd2F5IHRvIGhhbmRsZSB2YWxpZGF0aW9uIC0gc29ycnkgOykKCQl9CgkJ
aWYgKCR2YWxpZF92YWx1ZSA8PiAkcHJlZi0+dmFsdWUpIHsKCQkJaWYgKCR2YWxpZF92YWx1
ZSA9PSAkcHJlZi0+ZGVmYXVsdF92YWx1ZSkgewoJCQkJJHJlc3VsdCA9IHRydV90YWdzX2Rl
bGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHQgPSB0cnVf
dGFnc191cHNlcnRfcHJlZigkcHJlZi0+bmFtZSwgJHZhbGlkX3ZhbHVlKTsKCQkJfQoJCQlp
ZiAoJHJlc3VsdCkgewoJCQkJJHJlc3VsdHNbXSA9ICdVcGRhdGVkICcgLiAkcHJlZi0+bmFt
ZTsKCQkJCSRwcmVmLT52YWx1ZSA9ICR2YWxpZF92YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCSRy
ZXN1bHRzW10gPSAnRXJyb3IgdXBkYXRpbmcgJyAuICRwcmVmLT5uYW1lOwoJCQl9CgkJfQoJ
fQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9PSAwKSB7CgkJcmV0dXJuICdObyByZWNvcmRzIG5l
ZWQgdXBkYXRpbmcnOwoJfSBlbHNlIHsKCQlyZXR1cm4gam9pbignPGJyPicsICRyZXN1bHRz
KTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX3Vwc2VydF9wcmVmKCRuYW1lLCAkdmFsdWUp
IHsKCWlmICghc2FmZV9xdWVyeSgnY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNh
ZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycpLgoJCScgKG5hbWUgdmFyY2hhcigyNTUpIHByaW1h
cnkga2V5LCAnLgoJCSd2YWx1ZSB2YXJjaGFyKDI1NSkgbm90IG51bGwpJykpIHsKCQlyZXR1
cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngo
J3RydV90YWdzX3ByZWZzJykgLiAnIHRhYmxlLic7Cgl9CgoJcmV0dXJuIHNhZmVfdXBzZXJ0
KCd0cnVfdGFnc19wcmVmcycsICd2YWx1ZT0iJy4kdmFsdWUuJyInLCAnbmFtZT0iJy4kbmFt
ZS4nIicpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfZGVsZXRlX3ByZWYoJG5hbWUpIHsKCWlm
IChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3NfcHJlZnMnLCAnbmFtZT0iJy4kbmFtZS4nIicpKSB7
CgkJaWYgKHNhZmVfY291bnQoJ3RydV90YWdzX3ByZWZzJywgJzEnKSA9PSAwICYmICFzYWZl
X3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSkpIHsK
CQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0gZWxzZSB7CgkJcmV0dXJu
IGZhbHNlOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3RhZygkZGVs
ZXRldGFnKSB7CglpZiAodHJpbSgkZGVsZXRldGFnKSkgewoJCXJldHVybiB0cnVfdGFnc19h
ZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRldGFnLCAnJywgdHJ1ZSk7Cgl9IGVsc2UgewoJCXJl
dHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUnOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf
YWRtaW5fcmVwbGFjZV90YWcoJG1hdGNodGFnLCAkcmVwbGFjZXRhZywgJGFsbG93X2JsYW5r
X3JlcGxhY2V0YWcpIHsKCSRtYXRjaHRhZyA9IHRyaW0oJG1hdGNodGFnKTsKCSRyZXBsYWNl
dGFnID0gdHJpbSgkcmVwbGFjZXRhZyk7CglpZiAoJG1hdGNodGFnICYmICgkYWxsb3dfYmxh
bmtfcmVwbGFjZXRhZyB8fCAkcmVwbGFjZXRhZykpIHsKCQlpZiAoc2FmZV91cGRhdGUoJ3Rl
eHRwYXR0ZXJuJywgVFJVX1RBR1NfRklFTEQuJz10cmltKGJvdGggXCcsXCcgZnJvbSByZXBs
YWNlKGNvbmNhdCgiLCIsICcuVFJVX1RBR1NfRklFTEQuJywgIiwiKSwgY29uY2F0KCIsIiwg
XCcnLmFkZHNsYXNoZXMoJG1hdGNodGFnKS4nXCcsICIsIiksIFwnLCcuYWRkc2xhc2hlcygk
cmVwbGFjZXRhZykuJyxcJykpJywgJzEnKSkgewoJCQlyZXR1cm4gJ1VwZGF0ZWQgJy5teXNx
bF9hZmZlY3RlZF9yb3dzKCkuJyByb3dzICgiJy5odG1sc3BlY2lhbGNoYXJzKCRtYXRjaHRh
ZykuJyI9PiInLmh0bWxzcGVjaWFsY2hhcnMoJHJlcGxhY2V0YWcpLiciKSc7CgkJfSBlbHNl
IHsKCQkJcmV0dXJuICdFcnJvcjogJyAuIG15c3FsX2Vycm9yKCk7CgkJfQoJfSBlbHNlIHsK
CQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlIGluIGJvdGggZmllbGRzJzsKCX0KfQoK
CmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZygkbGVmdHRhZywgJHJpZ2h0
dGFnKSB7CgkkbGVmdHRhZyA9IGFkZHNsYXNoZXModHJ1X3RhZ3Nfc3RydG9sb3dlcih0cmlt
KCRsZWZ0dGFnKSkpOwoJJHJpZ2h0dGFnID0gYWRkc2xhc2hlcyh0cnVfdGFnc19zdHJ0b2xv
d2VyKHRyaW0oJHJpZ2h0dGFnKSkpOwoJaWYgKCEkbGVmdHRhZyB8fCAhJHJpZ2h0dGFnKSB7
CgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSBpbiBib3RoIGZpZWxkcyc7Cgl9CgoJ
aWYgKCFzYWZlX3F1ZXJ5KCdjcmVhdGUgdGFibGUgaWYgbm90IGV4aXN0cyAnIC4gc2FmZV9w
ZngoJ3RydV90YWdzX3JlZGlyZWN0cycpLgoJCScgKGxlZnR0YWcgdmFyY2hhcigyNTUpIHBy
aW1hcnkga2V5LCAnLgoJCSdyaWdodHRhZyB2YXJjaGFyKDI1NSkgbm90IG51bGwpJykpIHsK
CQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2Fm
ZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycpIC4gJyB0YWJsZS4nOwoJfQoKCWlmIChzYWZl
X2luc2VydCgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJ2xlZnR0YWc9IicuJGxlZnR0YWcuJyIs
cmlnaHR0YWc9IicuJHJpZ2h0dGFnLiciJykpIHsKCQlyZXR1cm4gJ1JlZGlyZWN0IGFkZGVk
ICgiJy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIj0+IicuaHRtbHNwZWNpYWxjaGFy
cygkcmlnaHR0YWcpLiciKSAtIHBsZWFzZSB0ZXN0IGl0ISc7Cgl9IGVsc2UgewoJCXJldHVy
biAnRXJyb3IgYWRkaW5nIHJlY29yZCAtIGRvZXMgaXQgYWxyZWFkeSBleGlzdD8nOwoJfQp9
CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0KCRsZWZ0dGFnKSB7
CglpZiAoc2FmZV9kZWxldGUoJ3RydV90YWdzX3JlZGlyZWN0cycsICdsZWZ0dGFnPSInLmFk
ZHNsYXNoZXMoJGxlZnR0YWcpLiciJykpIHsKCQlpZiAoc2FmZV9jb3VudCgndHJ1X3RhZ3Nf
cmVkaXJlY3RzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBz
YWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykpKSB7CgkJCXJldHVybiAnUmVkaXJlY3Qg
ZGVsZXRlZCwgYnV0IHVuYWJsZSB0byBkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3Rh
Z3NfcmVkaXJlY3RzJyk7CgkJfQoJCXJldHVybiAnUmVkaXJlY3QgZGVsZXRlZCAoIicuaHRt
bHNwZWNpYWxjaGFycygkbGVmdHRhZykuJyIpJzsKCX0gZWxzZSB7CgkJcmV0dXJuICdFcnJv
ciBkZWxldGluZyByZWRpcmVjdCc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl93
cml0ZV90YWJfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7CgkkYXR0cyA9IHRydV90YWdzX2dl
dF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIHRydWUsIHRydWUpOwoJJGF0dHNbJ3Rp
bWUnXSA9ICdhbnknOwoJJGNsb3VkID0gYXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1
ZXJ5KCRhdHRzKSk7Cglzb3J0KCRjbG91ZCk7CgoJJGlkID0gKGVtcHR5KCRHTE9CQUxTWydJ
RCddKSA/IGdwcygnSUQnKSA6ICRHTE9CQUxTWydJRCddKTsKCSRhcnRpY2xlX3RhZ3MgPSAo
ZW1wdHkoJGlkKSA/IGFycmF5KCkgOiB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgk
aWQpKTsKCgkkbGlua3MgPSBhcnJheSgpOwoJZm9yZWFjaCAoJGNsb3VkIGFzICR0YWcpIHsK
CQkkc3R5bGUgPSAoaW5fYXJyYXkoJHRhZywgJGFydGljbGVfdGFncykgPyAnIGNsYXNzPSJ0
YWdfY2hvc2VuIicgOiAnJyk7CgkJJGxpbmtzW10gPSAnPGEgaHJlZj0iI2FkdmFuY2VkIicu
JHN0eWxlLicgb25jbGljaz0idGhpcy5zZXRBdHRyaWJ1dGUoXFxcJ2NsYXNzXFxcJywgdG9n
Z2xlVGFnKFxcXCcnLmFkZHNsYXNoZXMoYWRkc2xhc2hlcygkdGFnKSkuJ1xcXCcpKTsgcmV0
dXJuIGZhbHNlOyI+JyAuIGFkZHNsYXNoZXMoaHRtbHNwZWNpYWxjaGFycygkdGFnKSkgLiAn
PFwvYT4nOwoJfQoJJHRvX2luc2VydCA9IGpvaW4oJywgJywgJGxpbmtzKTsKCSR0b19pbnNl
cnQgPSAiPHN0eWxlPmEudGFnX2Nob3NlbntiYWNrZ3JvdW5kLWNvbG9yOiAjRkVCOyBjb2xv
cjogYmxhY2s7fTwvc3R5bGU+IiAuICR0b19pbnNlcnQ7CgoJJGpzID0gPDw8RU9GCgkJdmFy
IGtleXdvcmRzRmllbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsK
CQl2YXIgcGFyZW50ID0ga2V5d29yZHNGaWVsZC5wYXJlbnROb2RlOwoJCXBhcmVudC5hcHBl
bmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsKCQl2YXIgY2xvdWQgPSBk
b2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7CgkJY2xvdWQuc2V0QXR0cmlidXRlKCdj
bGFzcycsICd0cnVfdGFnc19hZG1pbl90YWdzJyk7CgkJY2xvdWQuaW5uZXJIVE1MID0gJ3sk
dG9faW5zZXJ0fSc7CgkJcGFyZW50LmFwcGVuZENoaWxkKGNsb3VkKTsKCgkJZnVuY3Rpb24g
dG9nZ2xlVGFnKHRhZ05hbWUpIHsKCQkJdmFyIHJlZ2V4VGFnID0gdGFnTmFtZS5yZXBsYWNl
KC8oW1xcXFxcXlxcJCorW1xcXT97fS49IToofCldKS9nLCJcXFxcJDEiKTsKCQkJdmFyIHRh
Z1JlZ2V4ID0gbmV3IFJlZ0V4cCgiKChefCwpXFxccyopIiArIHJlZ2V4VGFnICsgIlxcXHMq
KCxcXFxzKnwkKSIpOwoJCQl2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJ
ZCgna2V5d29yZHMnKTsKCQkJdmFyIGN1cnZhbCA9IHRleHRhcmVhLnZhbHVlLnJlcGxhY2Uo
Lyw/XHMrJC8sICcnKTsKCQkJaWYgKCcnID09IGN1cnZhbCkgewoJCQkJdGV4dGFyZWEudmFs
dWUgPSB0YWdOYW1lOwoJCQl9IGVsc2UgaWYgKGN1cnZhbC5tYXRjaCh0YWdSZWdleCkpIHsK
CQkJCXRleHRhcmVhLnZhbHVlID0gY3VydmFsLnJlcGxhY2UodGFnUmVnZXgsICckMScpLnJl
cGxhY2UoLyw/XHMrJC8sICcnKTsKCQkJCXJldHVybiAnJzsKCQkJfSBlbHNlIGlmICgnLCcg
PT0gY3VydmFsLmNoYXJBdChjdXJ2YWwubGVuZ3RoIC0gMSkpIHsKCQkJCXRleHRhcmVhLnZh
bHVlICs9ICcgJyArIHRhZ05hbWU7CgkJCX0gZWxzZSB7CgkJCQl0ZXh0YXJlYS52YWx1ZSAr
PSAnLCAnICsgdGFnTmFtZTsKCQkJfQoJCQlyZXR1cm4gJ3RhZ19jaG9zZW4nOwoJCX0KRU9G
OwoKCWVjaG8gc2NyaXB0X2pzKCRqcyk7Cn0KCgojIyMgQVRPTS9SU1MgRkVFRCBGVU5DVElP
TlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnJlZ2lzdGVyX2NhbGxi
YWNrKCd0cnVfdGFnc19hdG9tX2hhbmRsZXInLCAnYXRvbV9lbnRyeScpOwpmdW5jdGlvbiB0
cnVfdGFnc19hdG9tX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3Nf
ZmVlZF9oYW5kbGVyKHRydWUpOyB9CnJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19yc3Nf
aGFuZGxlcicsICdyc3NfZW50cnknKTsKZnVuY3Rpb24gdHJ1X3RhZ3NfcnNzX2hhbmRsZXIo
JGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKGZhbHNlKTsg
fQoKZnVuY3Rpb24gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKCRhdG9tKSB7CglnbG9iYWwgJHRo
aXNhcnRpY2xlLCAkdHJ1X3RhZ3NfcHJlZnM7CglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7CgoJ
JHRhZ3MgPSB0cnVfdGFnc19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkdGhpc2lkKTsKCglpZiAo
JHRydV90YWdzX3ByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXS0+dmFsdWUpIHsKCQkkZXh0cmFi
b2R5ID0gJyc7CgkJJEZPUk1fTkFNRSA9ICd0cnVfdGFnc19mZWVkX3RhZ3MnOwoJCWlmIChm
ZXRjaCgnZm9ybScsICd0eHBfZm9ybScsICduYW1lJywgJEZPUk1fTkFNRSkpIHsKCQkJJGZv
cm0gPSBmZXRjaF9mb3JtKCRGT1JNX05BTUUpOwoJCQkkZXh0cmFib2R5ID0gdHJpbShwYXJz
ZSgkZm9ybSkpOwoJCX0gZWxzZSB7CgkJCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJk
X2Nsb3VkX2F0dHMoYXJyYXkoKSwgZmFsc2UsIHRydWUpOwoJCQkkZXh0cmFib2R5ID0gJzxw
PnRhZ3M6ICcgLiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICR0YWdzLCAkdGFncykg
LiAnPC9wPic7CgkJfQoJCWdsb2JhbCAkdGhpc2FydGljbGU7CgkJaWYgKHRyaW0oJHRoaXNh
cnRpY2xlWydleGNlcnB0J10pKSB7CgkJCSR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddID0gdHJp
bSgkdGhpc2FydGljbGVbJ2V4Y2VycHQnXSkubi4kZXh0cmFib2R5Lm47CgkJfQoJCSR0aGlz
YXJ0aWNsZVsnYm9keSddID0gdHJpbSgkdGhpc2FydGljbGVbJ2JvZHknXSkubi4kZXh0cmFi
b2R5Lm47Cgl9CgoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklF
U10tPnZhbHVlKSB7CgkJJG91dHB1dCA9IGFycmF5KCk7CgkJZm9yZWFjaCAoJHRhZ3MgYXMg
JHRhZykgewoJCQlpZiAoJGF0b20pIHsKCQkJCSRvdXRwdXRbXSA9ICc8Y2F0ZWdvcnkgdGVy
bT0iJyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnIiAvPic7CgkJCX0gZWxzZSB7CgkJ
CQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5PicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4g
JzwvY2F0ZWdvcnk+JzsKCQkJfQoJCX0KCQlyZXR1cm4gbi5qb2luKG4sICRvdXRwdXQpLm47
Cgl9Cn0KCgojIyMgUFJFRlMgRlVOQ1RJT05TIC8gQ0xBU1NFUyAjIyMKIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpjbGFzcyB0cnVfdGFnc19wcmVmIHsKCWZ1bmN0aW9u
IHRydV90YWdzX3ByZWYoJG5hbWUsICRkZWZhdWx0X3ZhbHVlLCAkdHlwZSkgewoJCSR0aGlz
LT5uYW1lID0gJG5hbWU7CgkJJHRoaXMtPnZhbHVlID0gJGRlZmF1bHRfdmFsdWU7CgkJJHRo
aXMtPmRlZmF1bHRfdmFsdWUgPSAkZGVmYXVsdF92YWx1ZTsKCQkkdGhpcy0+dHlwZSA9ICR0
eXBlOwoJfQoKCWZ1bmN0aW9uIHZhbGlkYXRlX3ZhbHVlKCR2YWx1ZSkgewoJCWlmICgkdmFs
dWUpIHsKCQkJcmV0dXJuICR2YWx1ZTsKCQl9IGVsc2UgaWYgKCR0aGlzLT50eXBlID09ICdi
b29sZWFuJykgewoJCQlyZXR1cm4gJzAnOwoJCX0gZWxzZSB7CgkJCXJldHVybiAnUGxlYXNl
IGVudGVyIGEgdmFsdWUgZm9yICcgLiAkdGhpcy0+bmFtZTsKCQl9Cgl9Cn0KCmZ1bmN0aW9u
IHRydV90YWdzX2xvYWRfcHJlZnMoKSB7CgkkcHJlZnMgPSBhcnJheSgpOwoKCWdsb2JhbCAk
cGVybWxpbmtfbW9kZTsKCSRwcmVmc1tDTEVBTl9VUkxTXSA9IG5ldyB0cnVfdGFnc19wcmVm
KENMRUFOX1VSTFMsICgkcGVybWxpbmtfbW9kZSAhPSAnbWVzc3knID8gJ2NsZWFuJyA6ICdt
ZXNzeScpLCAnc3RyaW5nJyk7CgkkcHJlZnNbVEFHX1NFQ1RJT05dID0gbmV3IHRydV90YWdz
X3ByZWYoVEFHX1NFQ1RJT04sICd0YWcnLCAnc3RyaW5nJyk7CgkkcHJlZnNbUEFSTV9OQU1F
XSA9IG5ldyB0cnVfdGFnc19wcmVmKFBBUk1fTkFNRSwgJ3QnLCAnc3RyaW5nJyk7CgkkcHJl
ZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdID0gbmV3IHRydV90YWdzX3ByZWYoVEFHU19J
Tl9GRUVEX0NBVEVHT1JJRVMsICcxJywgJ2Jvb2xlYW4nKTsKCSRwcmVmc1tUQUdTX0lOX0ZF
RURfQk9EWV0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdTX0lOX0ZFRURfQk9EWSwgJzAnLCAn
Ym9vbGVhbicpOwoJJHByZWZzW1RBR1NfSU5fV1JJVEVfVEFCXSA9IG5ldyB0cnVfdGFnc19w
cmVmKFRBR1NfSU5fV1JJVEVfVEFCLCAnMScsICdib29sZWFuJyk7CgoJaWYgKG15c3FsX3F1
ZXJ5KCJkZXNjcmliZSAiIC4gUEZYIC4gInRydV90YWdzX3ByZWZzIikpIHsKCQkkcnMgPSBz
YWZlX3Jvd3MoJyonLCAndHJ1X3RhZ3NfcHJlZnMnLCAnMScpOwoJCWZvcmVhY2ggKCRycyBh
cyAkcm93KSB7CgkJCSRwcmVmc1skcm93WyduYW1lJ11dLT52YWx1ZSA9ICRyb3dbJ3ZhbHVl
J107CgkJfQoJfQoKCXJldHVybiAkcHJlZnM7Cn0KCgojIyMgT1RIRVIgU1VQUE9SVCBGVU5D
VElPTlMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZ1bmN0aW9uIHRy
dV90YWdzX3JlZGlyZWN0X2lmX25lZWRlZCgkdGFnX3BhcmFtZXRlcikgewoJJHJlZGlyZWN0
cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3RzKCk7Cglmb3JlYWNoICgkcmVkaXJlY3RzIGFz
ICRsZWZ0dGFnID0+ICRyaWdodHRhZykgewoJCWlmICgkbGVmdHRhZyA9PSAkdGFnX3BhcmFt
ZXRlciB8fCAkbGVmdHRhZyA9PSBzdHJfcmVwbGFjZSgnLScsICcgJywgJHRhZ19wYXJhbWV0
ZXIpKSB7CgkJCXRydV90YWdzX3JlZGlyZWN0KCRyaWdodHRhZywgZmFsc2UpOwoJCQlyZXR1
cm4gdHJ1ZTsKCQl9Cgl9CgoJcmV0dXJuIGZhbHNlOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nf
bG9hZF9yZWRpcmVjdHMoKSB7CgkkcmVkaXJlY3RzID0gYXJyYXkoKTsKCWlmIChteXNxbF9x
dWVyeSgiZGVzY3JpYmUgIiAuIFBGWCAuICJ0cnVfdGFnc19yZWRpcmVjdHMiKSkgewoJCSRy
cyA9IHNhZmVfcm93cygnKicsICd0cnVfdGFnc19yZWRpcmVjdHMnLCAnMSBvcmRlciBieSBs
ZWZ0dGFnJyk7CgkJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsKCQkJJHJlZGlyZWN0c1skcm93
WydsZWZ0dGFnJ11dID0gJHJvd1sncmlnaHR0YWcnXTsKCQl9Cgl9CglyZXR1cm4gJHJlZGly
ZWN0czsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0KCRkZXN0aW5hdGlvbiwgJGlz
X2Z1bGxfdXJsKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJaWYgKCRpc19mdWxsX3Vy
bCkgewoJCSR1cmwgPSAkZGVzdGluYXRpb247CgkJJG1lc3NhZ2UgPSAnVGhlIHJlc291cmNl
IHlvdSByZXF1ZXN0ZWQgaGFzIG1vdmVkIHRvICcgLiAkZGVzdGluYXRpb247Cgl9IGVsc2Ug
ewoJCSR1cmwgPSB0cnVfdGFnc19saW5raWZ5X3RhZygkZGVzdGluYXRpb24sIGZhbHNlKTsK
CQkkbWVzc2FnZSA9ICdUaGUgcmVxdWVzdGVkIHRhZyBoYXMgYmVlbiByZXBsYWNlZCBieSAn
IC4gJGRlc3RpbmF0aW9uOwoJfQoKCWhlYWRlcignTG9jYXRpb246ICcgLiAkdXJsKTsKCXR4
cF9kaWUoJG1lc3NhZ2UsICczMDEnKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2xpbmtpZnlf
dGFnKCR0YWcsICR1c2VfYW1wID0gdHJ1ZSkgewoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsK
CWlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCQkkdXJscHJlZml4ID0gaHUgLiAkdHJ1
X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsKCX0gZWxzZSB7CgkJJHVy
bHByZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52
YWx1ZSAuICgkdXNlX2FtcCA/ICcmYW1wOycgOiAnJicpIC4gJHRydV90YWdzX3ByZWZzW1BB
Uk1fTkFNRV0tPnZhbHVlIC4gJz0nOwoJfQoJJHVybHN1ZmZpeCA9ICh0cnVfdGFnc19jbGVh
bl91cmxzKCkgPyAnLycgOiAnJyk7CglyZXR1cm4gJHVybHByZWZpeCAuIHVybGVuY29kZShz
dHJfcmVwbGFjZSgnICcsICctJywgJHRhZykpIC4gJHVybHN1ZmZpeDsKfQoKCmZ1bmN0aW9u
IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCRhcnRpY2xlSUQpIHsKCSR0YWdzX2Zp
ZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkkcnMgPSBzYWZlX3JvdygkdGFnc19maWVsZCwgInRl
eHRwYXR0ZXJuIiwgIklEPSckYXJ0aWNsZUlEJyBBTkQgJHRhZ3NfZmllbGQgPD4gJyciKTsK
CSRhbGxfdGFncyA9IGFycmF5KCk7CglpZiAoYXJyYXlfa2V5X2V4aXN0cygkdGFnc19maWVs
ZCwgJHJzKSkgewoJCSRhbGxfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90YWdzX3N0
cnRvbG93ZXIoJHJzWyR0YWdzX2ZpZWxkXSkpKTsKCX0KCglyZXR1cm4gdHJ1X3RhZ3NfdHJp
bV90YWdzKCRhbGxfdGFncyk7Cn0KCgojIGZpeGVzIGJ1ZyB3aXRoIDQuMC40J3MgdmVyc2lv
biBvZiBkb1dyYXAgdGhhdCBjYXVzZWQgc3BhY2VzIHRvIHNob3cgdXAgYmVmb3JlIHRoZSBj
b21tYXMKZnVuY3Rpb24gdHJ1X3RhZ3NfZG9fd3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVh
aywgJGNsYXNzLCAkYnJlYWtjbGFzcykgewoJaWYgKCEkd3JhcHRhZyAmJiAhcHJlZ19tYXRj
aCgnL15cdyskLycsICRicmVhaykpIHsKCQlyZXR1cm4gam9pbigkYnJlYWsubiwgJGxpc3Qp
OwoJfSBlbHNlIHsKCQlyZXR1cm4gZG9XcmFwKCRsaXN0LCAkd3JhcHRhZywgJGJyZWFrLCAk
Y2xhc3MsICRicmVha2NsYXNzKTsKCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX3RyaW1fdGFn
cygkdGFnX2FycmF5KSB7CgkkdHJpbW1lZCA9IGFycmF5KCk7Cglmb3JlYWNoICgkdGFnX2Fy
cmF5IGFzICR0YWcpIHsKCQlpZiAoIiIgIT0gdHJpbSgkdGFnKSkgewoJCQkkdHJpbW1lZFtd
ID0gdHJpbSgkdGFnKTsKCQl9Cgl9CglyZXR1cm4gJHRyaW1tZWQ7Cn0KCgpmdW5jdGlvbiB0
cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcikgewoJJGtl
eXdvcmRzID0gZXhwbG9kZSgnLCcsICR0YWdfcGFyYW1ldGVyKTsKCWZvcmVhY2ggKCRrZXl3
b3JkcyBhcyAka2V5d29yZCkgewoJCWlmIChzdHJwb3MoJGtleXdvcmQsICctJykgIT09IGZh
bHNlKSB7CgkJCSRrZXl3b3Jkc1tdID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICRrZXl3b3Jk
KTsKCQl9Cgl9CgkkYXR0c1sna2V5d29yZHMnXSA9IGltcGxvZGUoJywnLCAka2V5d29yZHMp
OwoKCWlmIChpc3NldCgkYXR0c1snc2VjdGlvbiddKSAmJiBzdHJwb3MoJGF0dHNbJ3NlY3Rp
b24nXSwgJywnKSAhPT0gZmFsc2UpIHsKCQkkYXR0c1snc2VjdGlvbiddID0gJyc7Cgl9CgoJ
aWYgKGlzc2V0KCRhdHRzWydleGNsdWRlc2VjdGlvbiddKSkgewoJCXVuc2V0KCRhdHRzWydl
eGNsdWRlc2VjdGlvbiddKTsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJ25vYXJ0aWNsZXMnXSkp
IHsKCQl1bnNldCgkYXR0c1snbm9hcnRpY2xlcyddKTsKCX0KCglpZiAoIWlzc2V0KCRhdHRz
WydsaW1pdCddKSkgewoJCSRhdHRzWydsaW1pdCddID0gJzEwMDAnOwoJfQoKCWlmICghaXNz
ZXQoJGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSkpIHsKCQkkYXR0c1snYWxsb3dvdmVycmlkZSdd
ID0gdHJ1ZTsKCX0KCglpZiAoaXNzZXQoJGF0dHNbJ3NlYXJjaGZvcm0nXSkgJiYgIWlzc2V0
KCRhdHRzWydsaXN0Zm9ybSddKSkgewoJCSRhdHRzWydsaXN0Zm9ybSddID0gJGF0dHNbJ3Nl
YXJjaGZvcm0nXTsKCX0KCglyZXR1cm4gJGF0dHM7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19z
dHJ0b2xvd2VyKCRzdHIpIHsKCWlmIChmdW5jdGlvbl9leGlzdHMoIm1iX3N0cnRvbG93ZXIi
KSkgewoJCXJldHVybiBtYl9zdHJ0b2xvd2VyKCRzdHIsICJVVEYtOCIpOwoJfSBlbHNlIHsK
CQlyZXR1cm4gc3RydG9sb3dlcigkc3RyKTsKCX0KfQoKCi8vdGhlc2UgbmV4dCB0d28gZnVu
Y3Rpb25zIGFyZSBncm9zcywgYnV0IEkgY2FuJ3QgZmlndXJlIG91dCBhbm90aGVyIHdheSB0
byBkbyBpdApmdW5jdGlvbiB0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCAkc29y
dF9ieV9jb3VudCwgJHNvcnRfYXNjZW5kaW5nKSB7CglnbG9iYWwgJHRydV90YWdzX3RhZ3Nf
d2VpZ2h0LCAkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCwgJHRydV90YWdzX3NvcnRfYXNjZW5k
aW5nOwoKCSR0cnVfdGFnc190YWdzX3dlaWdodCA9ICR0YWdzX3dlaWdodDsKCSR0cnVfdGFn
c19zb3J0X2J5X2NvdW50ID0gJHNvcnRfYnlfY291bnQ7CgkkdHJ1X3RhZ3Nfc29ydF9hc2Nl
bmRpbmcgPSAkc29ydF9hc2NlbmRpbmc7CgoJJHRlbXBfYXJyYXkgPSBhcnJheV9rZXlzKCR0
YWdzX3dlaWdodCk7Cgl1c29ydCgkdGVtcF9hcnJheSwgInRydV90YWdzX3NvcnRfdGFnc19j
b21wYXJhdG9yIik7CgoJJHNvcnRlZF9hcnJheSA9IGFycmF5KCk7Cglmb3JlYWNoICgkdGVt
cF9hcnJheSBhcyAkdGFnKSB7CgkJJHNvcnRlZF9hcnJheVskdGFnXSA9ICR0YWdzX3dlaWdo
dFskdGFnXTsKCX0KCglyZXR1cm4gJHNvcnRlZF9hcnJheTsKfQoKCmZ1bmN0aW9uIHRydV90
YWdzX3NvcnRfdGFnc19jb21wYXJhdG9yKCRsZWZ0LCAkcmlnaHQpIHsKCWdsb2JhbCAkdHJ1
X3RhZ3NfdGFnc193ZWlnaHQsICR0cnVfdGFnc19zb3J0X2J5X2NvdW50LCAkdHJ1X3RhZ3Nf
c29ydF9hc2NlbmRpbmc7CgoJaWYgKCR0cnVfdGFnc19zb3J0X2J5X2NvdW50KSB7CgkJJGxl
ZnRfd2VpZ2h0ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0WyRsZWZ0XTsKCQkkcmlnaHRfd2Vp
Z2h0ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0WyRyaWdodF07CgkJaWYgKCRsZWZ0X3dlaWdo
dCA9PSAkcmlnaHRfd2VpZ2h0KSB7CgkJCXJldHVybiBzdHJuYXRjYXNlY21wKCRsZWZ0LCAk
cmlnaHQpOwoJCX0gZWxzZSBpZiAoJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nKSB7CgkJCXJl
dHVybiAkbGVmdF93ZWlnaHQgLSAkcmlnaHRfd2VpZ2h0OwoJCX0gZWxzZSB7CgkJCXJldHVy
biAkcmlnaHRfd2VpZ2h0IC0gJGxlZnRfd2VpZ2h0OwoJCX0KCX0gZWxzZSB7CgkJcmV0dXJu
IHN0cm5hdGNhc2VjbXAoJGxlZnQsICRyaWdodCk7Cgl9Cn0KCgoKIyMjIEJBU1RBUkQgRlVO
Q1RJT05TIFRIQVQgU0hPVUxETidUIEhBVkUgVE8gRVhJU1QgIyMjCiMjIyMjIyMjIyMjIyMj
IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCmZ1bmN0aW9uIHRy
dV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2goJGF0dHMpIHsKCSR0aGVBdHRzID0gbEF0dHMo
YXJyYXkoJ2xpbWl0JyAgICAgPT4gMTAwMCwKCQkJCSdjYXRlZ29yeScgID0+ICcnLAoJCQkJ
J3NlY3Rpb24nICAgPT4gJycsCgkJCQknZXhjZXJwdGVkJyA9PiAnJywKCQkJCSdhdXRob3In
ICAgID0+ICcnLAoJCQkJJ3NvcnRieScgICAgPT4gJ1Bvc3RlZCcsCgkJCQknc29ydGRpcicg
ICA9PiAnZGVzYycsCgkJCQknbW9udGgnICAgICA9PiAnJywKCQkJCSdrZXl3b3JkcycgID0+
ICcnLAoJCQkJJ2Zyb250cGFnZScgPT4gJycsCgkJCQknaWQnICAgICAgICA9PiAnJywKCQkJ
CSd0aW1lJyAgICAgID0+ICdwYXN0JywKCQkJCSdzdGF0dXMnICAgID0+ICc0JywKCQkJCSdv
ZmZzZXQnICAgID0+IDAKCQkJKSwkYXR0cywgMCk7CglleHRyYWN0KCR0aGVBdHRzKTsKCgkv
L0J1aWxkaW5nIHF1ZXJ5IHBhcnRzCgkkZnJvbnRwYWdlID0gKCRmcm9udHBhZ2UpID8gZmls
dGVyRnJvbnRQYWdlKCkgOiAnJzsKCSRjYXRlZ29yeSAgPSAoISRjYXRlZ29yeSkgID8gJycg
OiAiIGFuZCAoKENhdGVnb3J5MT0nIi5kb3NsYXNoKCRjYXRlZ29yeSkuIicpIG9yIChDYXRl
Z29yeTI9JyIuZG9TbGFzaCgkY2F0ZWdvcnkpLiInKSkgIjsKCSRzZWN0aW9uICAgPSAoISRz
ZWN0aW9uKSAgID8gJycgOiAiIGFuZCBTZWN0aW9uID0gJyIuZG9zbGFzaCgkc2VjdGlvbiku
IiciOwoJJGV4Y2VycHRlZCA9ICgkZXhjZXJwdGVkPT0neScpICA/ICIgYW5kIEV4Y2VycHQg
IT0nJyIgOiAnJzsKCSRhdXRob3IgICAgPSAoISRhdXRob3IpICAgID8gJycgOiAiIGFuZCBB
dXRob3JJRCA9ICciLmRvc2xhc2goJGF1dGhvcikuIiciOwoJJG1vbnRoICAgICA9ICghJG1v
bnRoKSAgICAgPyAnJyA6ICIgYW5kIFBvc3RlZCBsaWtlICciLmRvU2xhc2goJG1vbnRoKS4i
JSciOwoJJGlkICAgICAgICA9ICghJGlkKSAgICAgICAgPyAnJyA6ICIgYW5kIElEID0gJyIu
aW50dmFsKCRpZCkuIiciOwoJc3dpdGNoICgkdGltZSkgewoJCWNhc2UgJ2FueSc6CgkJCSR0
aW1lID0gIiI7IGJyZWFrOwoJCWNhc2UgJ2Z1dHVyZSc6CgkJCSR0aW1lID0gIiBhbmQgUG9z
dGVkID4gbm93KCkiOyBicmVhazsKCQlkZWZhdWx0OgoJCQkkdGltZSA9ICIgYW5kIFBvc3Rl
ZCA8IG5vdygpIjsKCX0KCWlmICghaXNfbnVtZXJpYygkc3RhdHVzKSkKCQkkc3RhdHVzID0g
Z2V0U3RhdHVzTnVtKCRzdGF0dXMpOwoKCSRjdXN0b20gPSAnJzsKCS8vIHRyeWluZyBjdXN0
b20gZmllbGRzIGhlcmUKCSRjdXN0b21GaWVsZHMgPSBnZXRDdXN0b21GaWVsZHMoKTsKCWlm
ICgkY3VzdG9tRmllbGRzKSB7CgkJZm9yZWFjaCgkY3VzdG9tRmllbGRzIGFzICRjRmllbGQp
IHsKCQkJaWYgKGlzc2V0KCRhdHRzWyRjRmllbGRdKSkKCQkJCSRjdXN0b21QYWlyc1skY0Zp
ZWxkXSA9ICRhdHRzWyRjRmllbGRdOwoJCX0KCQlpZighZW1wdHkoJGN1c3RvbVBhaXJzKSkK
CQkJJGN1c3RvbSA9ICBidWlsZEN1c3RvbVNxbCgkY3VzdG9tRmllbGRzLCRjdXN0b21QYWly
cyk7CgkJZWxzZQoJCQkkY3VzdG9tID0gJyc7Cgl9CgoJLy9BbGxvdyBrZXl3b3JkcyBmb3Ig
bm8tY3VzdG9tIGFydGljbGVzLiBUaGF0IHRhZ2dpbmcgbW9kZSwgeW91IGtub3cKCWlmICgk
a2V5d29yZHMpIHsKCQkka2V5cyA9IGRvU2xhc2goYXJyYXlfbWFwKCd0cmltJywgc3BsaXQo
JywnLCAka2V5d29yZHMpKSk7CgkJZm9yZWFjaCAoJGtleXMgYXMgJGtleSkgewoJCQkka2V5
cGFydHNbXSA9ICJGSU5EX0lOX1NFVCgnIi4ka2V5LiInLEtleXdvcmRzKSI7CgkJfQoJCSRr
ZXl3b3JkcyA9ICIgYW5kICgiIC4gam9pbignIG9yICcsJGtleXBhcnRzKSAuICIpIjsKCX0K
CglpZiAoJGlkKQoJCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzID49ICc0JyI7CgllbHNlCgkJ
JHN0YXR1c3EgPSAiIGFuZCBTdGF0dXM9JyIuZG9TbGFzaCgkc3RhdHVzKS4iJyI7CgoJJHdo
ZXJlID0gIjEiIC4gJHN0YXR1c3EuICR0aW1lLgoJCSRpZCAuICRjYXRlZ29yeSAuICRzZWN0
aW9uIC4gJGV4Y2VycHRlZCAuICRtb250aCAuICRhdXRob3IgLiAka2V5d29yZHMgLiAkY3Vz
dG9tIC4gJGZyb250cGFnZTsKCgkJJHBnb2Zmc2V0ID0gJG9mZnNldCAuICcsICc7CgoJJHJz
ID0gc2FmZV9yb3dzX3N0YXJ0KCIqLCB1bml4X3RpbWVzdGFtcChQb3N0ZWQpIGFzIHVQb3N0
ZWQiLCAndGV4dHBhdHRlcm4nLAoJCSR3aGVyZS4gJyBvcmRlciBieSAnIC4gZG9zbGFzaCgk
c29ydGJ5KSAuICcgJyAuIGRvU2xhc2goJHNvcnRkaXIpIC4gJyBsaW1pdCAnIC4gZG9TbGFz
aCgkbGltaXQpKTsKCglyZXR1cm4gJHJzOwp9CgoKIjtzOjg6ImhlbHBfcmF3IjtzOjU5Mzoi
VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hlY2sgb3V0IHRoZSAiaW50cm9kdWN0
b3J5IGFydGljbGUiOmh0dHA6Ly93d3cucmFpbnNraXQuY29tL2Jsb2cvNDkzL3RydXRhZ3Mt
YS10YWdnaW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4sICJyZWxlYXNlcyBwYWdlIjpodHRw
Oi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTM3L3RydV90YWdzLXJlbGVhc2VzLCAi
ZmVhdHVyZSBsaXN0IjpodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1L3Ry
dXRhZ3MtZmVhdHVyZS1saXN0LCAicm9hZG1hcCI6aHR0cDovL3d3dy5yYWluc2tpdC5jb20v
cmVmZXJlbmNlLzU1NC90cnVfdGFncy1yb2FkbWFwLCBhbmQgInVzYWdlIGluc3RydWN0aW9u
cyI6aHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdl
LWluc3RydWN0aW9ucy4KCkkndmUgdGFrZW4gdGhlIGRldGFpbGVkIGhlbHAgb3V0IG9mIHRo
ZSBwbHVnaW47IG15IGFwb2xvZ2llcy4gIEl0IHdhcyB0b28gYmlnIGFuZCB0b28gZGlmZmlj
dWx0IHRvIGtlZXAgbWFpbnRhaW5pbmcgb24gbXkgc2l0ZSBhbmQgaW4gdGhlIHBsdWdpbi4i
O3M6MzoibWQ1IjtzOjMyOiI0MDdjYTA2YTJmYjg0NWVkZGJhYWUzNGFhM2YyOGRhNyI7fQ==
Last edited by jstubbs (2009-01-03 14:54:21)
Offline