Go to main content

Textpattern CMS support forum

You are not logged in. Register | Login | Help

#313 2007-11-11 14:34:17

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

Re: tru_tags: A tagging plugin for textpattern

andreas, after you installed 3.0, did you update the preference on the Extensions -> tru_tags page?

If so, does “stichwort” have any non-ascii characters in it? The problem is likely that I didn’t handle extended character sets correctly. Please let me know and I’ll look into it.

Offline

#314 2007-11-11 15:34:27

andreas
Member
Registered: 2004-02-28
Posts: 453
Website

Re: tru_tags: A tagging plugin for textpattern

I did update the preference and these are just plain letters “s – t – i – c – h – w – o – r – t”.

Offline

#315 2007-11-11 15:53:49

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

Re: tru_tags: A tagging plugin for textpattern

Well, I was completely ready to believe that this was a bug in tru_tags, but now I’m not so sure. I converted my test site to match yours, as follows:

I renamed my ‘tag’ section to ‘stichwort’

I updated my ‘if_section’ call on my default page to use ‘stichwort’

I updated the “Tag section name” preference in tru_tags to say ‘stichwort’

…and that worked.

I did make one minor change to the plugin, but that shouldn’t have affected this situation. Nevertheless, it’s probably a good idea for you to grab v3.0 again and see if it helps.

One more question – are you using clean urls?

Offline

#316 2007-11-11 16:17:59

andreas
Member
Registered: 2004-02-28
Posts: 453
Website

Re: tru_tags: A tagging plugin for textpattern

Doesn’t work with the new version either. I use clean URLs (section/title). Everything worked fine before the upgrade, I had tag-based URLs working: /stichwort/tag-name

All I changed was the plugin update.

Here’s the page of the tag-cloud

Offline

#317 2007-11-11 16:42:29

merz1
Member
From: Hamburg
Registered: 2006-05-04
Posts: 994
Website

Re: tru_tags: A tagging plugin for textpattern

I am deeply impressed. Good work Nathan!

the issue you reported with spaces at the end of the keywords field is actually a bug with the 4.0.5 release of Textpattern. I found the issue and reported it, and it has already been fixed for the next Textpattern release.

Thanks! Just checking the roadmap…


Get all online mentions of Textpattern via OPML subscription: TXP Info Sources: Textpattern RSS feeds as dynamic OPML

Offline

#318 2007-11-11 16:46:12

merz1
Member
From: Hamburg
Registered: 2006-05-04
Posts: 994
Website

Re: tru_tags: A tagging plugin for textpattern

Higher priority for “Multi-tag search (tag1 + tag2)”?

  • Feature request: RSS feeds for tags
  • Feature request: boolean combinations :-) Example: (tag1 or tag2) and tag3
  • Feature request: Output the tag section as indexed pages (A-Z) to structure big amounts of tags. Examples can be seen here: SmashingMagazine (paragraph: Tag Index Instead Of Tag Clouds)

Last edited by merz1 (2007-11-11 16:55:55)


Get all online mentions of Textpattern via OPML subscription: TXP Info Sources: Textpattern RSS feeds as dynamic OPML

Offline

#319 2007-11-11 20:45:05

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

Re: tru_tags: A tagging plugin for textpattern

andreas – I’m still thinking that something might be funny about your site configuration. My clue is this:

This URL: http://www.rete-mirabile.net/?s=lernen seems to work,

but this URL: http://www.rete-mirabile.net/?s=stichwort doesn’t,

while this one: http://www.rete-mirabile.net/stichwort/ does.

As near as I can tell, tru_tags shouldn’t be touching that second URL, and Textpattern should just render the default page for your “stichwort” section. Presumably that should be the exact same page as the third URL, but it isn’t. Is there any chance that you have custom rewrite rules in your .htaccess file?

If that’s not it, the only thing I can think to try is to start putting debugging messages into tru_tags to see what it’s really doing. To do that, I’d need access to your site. If you’re willing to do that, please send credentials to truist-20071111@truist.com.

merz1 – thanks! For your feature requests:

  • Multi-search tag (in the current version of TXP) will require a major hack to work around the structure of the Textpattern code, so I’ve been avoiding it in the hope that future versions of TXP will be more modular. The fact that it’s as high on the priority list as it is, is a good sign :) Implementing that feature will also probably mean that I submit a major piece of code to Textpattern, to make the code be more modular.
  • Good reminder about RSS feeds for tags. That’s another one that’s waiting on better Textpattern code, although in this case I actually submitted the better code already, and it’s already committed to core, but I don’t think we’ll see it until the next major Textpattern release. I added this idea to the roadmap page, though, with an indication that it depends on the Textpattern release. Once we get that, though, this will be relatively easy.
  • I added the boolean combinations to the “multi-tag search” group – once multi-tag search is done, booleans should be relatively easy
  • The indexed output was already in “group 5”, but I added the idea of a single page per group.

Thanks!

Offline

#320 2007-11-16 10:37:41

iboi
New Member
Registered: 2007-11-16
Posts: 2

Re: tru_tags: A tagging plugin for textpattern

truist wrote:

All, I’m very pleased to announce the release of tru_tags v3.0.

I cannot reach your domain. Is there an alternative download location?

Offline

#321 2007-11-16 10:58:16

Gocom
Developer Emeritus
From: Helsinki, Finland
Registered: 2006-07-14
Posts: 4,533
Website

Re: tru_tags: A tagging plugin for textpattern

iboi, here is the plugin code. Well it’s a little modified version, but it works completely same way. Only comments are removed from the plugin’s php-code :)

# tru_tags 3.0
# Article tagging
# Nathan Arthur
# http://www.truist.com/

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

YTo5OntzOjQ6Im5hbWUiO3M6ODoidHJ1X3RhZ3MiO3M6NjoiYXV0aG9yIjtzOjEzOiJOYXRoYW4gQXJ0aHVyIjtzOjEwOiJhdXRob3JfdXJpIjtzOjIyOiJodHRwOi8vd3d3LnRydWlzdC5jb20vIjtzOjc6InZlcnNpb24iO3M6MzoiMy4wIjtzOjExOiJkZXNjcmlwdGlvbiI7czoxNToiQXJ0aWNsZSB0YWdnaW5nIjtzOjQ6ImhlbHAiO3M6NjMwOiIJPHA+VG8gbGVhcm4gbW9yZSBhYm91dCB0cnVfdGFncywgY2hlY2sgb3V0IHRoZSA8YSBocmVmPSIvYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2luLWZvci10ZXh0cGF0dGVybiIgcmVsPSJub2ZvbGxvdyI+aW50cm9kdWN0b3J5IGFydGljbGU8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnRydWlzdC5jb20vcmVmZXJlbmNlLzUzNy90cnVfdGFncy1yZWxlYXNlcyIgcmVsPSJub2ZvbGxvdyI+cmVsZWFzZXMgcGFnZTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cudHJ1aXN0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVyZS1saXN0IiByZWw9Im5vZm9sbG93Ij5mZWF0dXJlIGxpc3Q8L2E+LCBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy50cnVpc3QuY29tL3JlZmVyZW5jZS80OTcvdHJ1dGFncy11c2FnZS1pbnN0cnVjdGlvbnMiIHJlbD0ibm9mb2xsb3ciPnVzYWdlIGluc3RydWN0aW9uczwvYT4uPC9wPg0KDQoJPHA+SSYjODIxNzt2ZSB0YWtlbiB0aGUgZGV0YWlsZWQgaGVscCBvdXQgb2YgdGhlIHBsdWdpbjsgbXkgYXBvbG9naWVzLiAgSXQgd2FzIHRvbyBiaWcgYW5kIHRvbyBkaWZmaWN1bHQgdG8ga2VlcCBtYWludGFpbmluZyBvbiBteSBzaXRlIGFuZCBpbiB0aGUgcGx1Z2luLjwvcD4iO3M6NDoiY29kZSI7czozMzk0NToiDQoJZGVmaW5lKCdUUlVfVEFHU19GSUVMRCcsICdLZXl3b3JkcycpOw0KCWRlZmluZSgnQ0xFQU5fVVJMUycsICdjbGVhbl91cmxzJyk7DQoJZGVmaW5lKCdUQUdfU0VDVElPTicsICd0YWdfc2VjdGlvbicpOw0KCWRlZmluZSgnUEFSTV9OQU1FJywgJ3Bhcm0nKTsNCglkZWZpbmUoJ1RBR1NfSU5fRkVFRF9DQVRFR09SSUVTJywgJ3RhZ3NfaW5fZmVlZF9jYXRlZ29yaWVzJyk7DQoJZGVmaW5lKCdUQUdTX0lOX0ZFRURfQk9EWScsICd0YWdzX2luX2ZlZWRfYm9keScpOw0KCWRlZmluZSgnVEFHU19JTl9XUklURV9UQUInLCAndGFnc19pbl93cml0ZV90YWInKTsNCglnbG9iYWwgJHRydV90YWdzX3ByZWZzOw0KCSR0cnVfdGFnc19wcmVmcyA9IHRydV90YWdzX2xvYWRfcHJlZnMoKTsNCgkJDQoJZnVuY3Rpb24gdHJ1X3RhZ3NfaGFuZGxlcigkYXR0cykgew0KCQkkdGFnX3BhcmFtZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoKSwgZmFsc2UpOw0KCQlpZiAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgew0KCQkJaWYgKHRydV90YWdzX3JlZGlyZWN0X2lmX25lZWRlZCgkdGFnX3BhcmFtZXRlcikpIHsNCgkJCQlyZXR1cm4gJyc7DQoJCQl9DQoJCQkkY2xlYW5fYXR0cyA9IHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1ldGVyKTsNCgkJCSRyZXN1bHQgPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVlKTsNCgkJCWlmICh0cmltKCRyZXN1bHQpID09ICcnKSB7DQoJCQkJaWYgKGlzc2V0KCRhdHRzWydub2FydGljbGVzJ10pKSB7DQoJCQkJCXRydV90YWdzX3JlZGlyZWN0KCRhdHRzWydub2FydGljbGVzJ10sIHRydWUpOw0KCQkJCX0gZWxzZSB7DQoJCQkJCXR4cF9kaWUoZ1R4dCgnNDA0X25vdF9mb3VuZCcpLCAnNDA0Jyk7DQoJCQkJfQ0KCQkJfSBlbHNlIHsNCgkJCQlyZXR1cm4gJHJlc3VsdDsNCgkJCX0NCgkJfSBlbHNlIHsNCgkJCXJldHVybiB0cnVfdGFnc19jbG91ZCgkYXR0cyk7DQoJCX0NCgl9DQoNCglmdW5jdGlvbiB0cnVfdGFnc19jbG91ZCgkYXR0cykgew0KCQlyZXR1cm4gdHJ1X3RhZ3NfbGlzdCh0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIGZhbHNlKSk7DQoJfQ0KDQoJZnVuY3Rpb24gdHJ1X3RhZ3NfbGlzdCgkYXR0cykgew0KCQkkYXR0cyA9IHRydV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCB0cnVlLCBmYWxzZSk7DQoJCSRhbGxfdGFncyA9IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsNCgkJcmV0dXJuIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3MpOw0KCX0NCg0KDQoJZnVuY3Rpb24gdHJ1X3RhZ3NfZnJvbV9hcnRpY2xlKCRhdHRzKSB7DQoJCWdsb2JhbCAkdGhpc2FydGljbGU7DQoJCWV4dHJhY3QoJHRoaXNhcnRpY2xlKTsNCgkJJGFsbF90YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJHRoaXNpZCk7DQoJCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIGZhbHNlLCB0cnVlKTsNCgkJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3RhZ3M7DQoJCWlmICgkYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7DQoJCQkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsNCgkJfQ0KCQkkb3V0ID0gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFnc19mb3Jfd2VpZ2h0KTsNCgkJJG91dCA9IHN0cl9yZXBsYWNlKCJcbiIsIiIsJG91dCk7DQoJCXJldHVybiAkb3V0Ow0KCX0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19pZl9oYXNfdGFncygkYXR0cywgJHRoaW5nKSB7DQoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsNCglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7DQoNCgkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOw0KDQoJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJHRoaXNpZCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7DQoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfdGFnX3NlYXJjaCgkYXR0cywgJHRoaW5nKSB7DQoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCksIGZhbHNlKTsNCgkkY29uZGl0aW9uID0gKCFlbXB0eSgkdGFnX3BhcmFtZXRlcikpID8gdHJ1ZSA6IGZhbHNlOw0KCXJldHVybiBwYXJzZShFdmFsRWxzZSgkdGhpbmcsICRjb25kaXRpb24pKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc190YWdfcGFyYW1ldGVyKCRhdHRzLCAkc2FmZWh0bWwgPSB0cnVlKSB7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCglleHRyYWN0KGxBdHRzKGFycmF5KCdzdHJpcGh5cGhlbnMnID0+IDAsICd1cmxlbmNvZGUnID0+IDApLCAgJGF0dHMsIDApKTsNCg0KCSRwYXJtID0gdXJsZGVjb2RlKHN0cmlwX3RhZ3MoZ3BzKCR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSkpKTsNCgkkcGFybSA9ICgkc3RyaXBoeXBoZW5zID8gc3RyX3JlcGxhY2UoJy0nLCAnICcsICRwYXJtKSA6ICRwYXJtKTsNCglpZiAoJHVybGVuY29kZSkgew0KCQkkcGFybSA9IHVybGVuY29kZSgkcGFybSk7DQoJIH0gZWxzZSBpZiAoJHNhZmVodG1sKSB7DQoJCSRwYXJtID0gaHRtbHNwZWNpYWxjaGFycygkcGFybSk7DQoJfQ0KDQoJcmV0dXJuICRwYXJtOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3NlYXJjaF9wYXJhbWV0ZXIoKSB7DQoJcmV0dXJuIHN0cmlwX3RhZ3MoZ3BzKCdxJykpOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3JlbGF0ZWRfdGFnc19mcm9tX3NlYXJjaCgkYXR0cykgew0KCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBmYWxzZSk7DQoJaWYgKCFlbXB0eSgkdGFnX3BhcmFtZXRlcikpIHsNCgkgICAgICAgICR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7DQoJCSRhbGxfdGFncyA9IGFycmF5KCk7DQoNCgkJJHF1ZXJ5X2F0dHMgPSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAkdGFnX3BhcmFtZXRlcik7DQoJCSRycyA9IHRydV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFyY2goJHF1ZXJ5X2F0dHMpOw0KCQlpZiAoJHJzKSB7DQoJCQl3aGlsZSAoJGEgPSBuZXh0Um93KCRycykpIHsNCgkJCQkkYXJ0aWNsZV90YWdzID0gYXJyYXkoKTsNCgkJCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkdGFnc19maWVsZCwgJGEpKSB7DQoJCQkJCSRhcnRpY2xlX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRhWyR0YWdzX2ZpZWxkXSkpKTsNCgkJCQl9DQoJCQkJJGFsbF90YWdzID0gYXJyYXlfbWVyZ2UoJGFsbF90YWdzLCB0cnVfdGFnc190cmltX3RhZ3MoJGFydGljbGVfdGFncykpOw0KCQkJfQ0KCQl9DQoNCgkJJGFsdF90YWdfcGFyYW1ldGVyID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKTsNCgkJZm9yZWFjaCAoJGFsbF90YWdzIGFzICRrZXkgPT4gJHRhZykgew0KCQkJaWYgKCR0YWcgPT0gJHRhZ19wYXJhbWV0ZXIgfHwgJHRhZyA9PSAkYWx0X3RhZ19wYXJhbWV0ZXIpIHsNCgkJCQl1bnNldCgkYWxsX3RhZ3NbJGtleV0pOw0KCQkJfQ0KCQl9DQoNCgkJJGNsb3VkX2F0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIGZhbHNlKTsNCgkJJGFsbF90YWdzX2Zvcl93ZWlnaHQgPSAkYWxsX3RhZ3M7DQoJCWlmICgkY2xvdWRfYXR0c1sndXNlb3ZlcmFsbGNvdW50cyddKSB7DQoJCQkkYWxsX3RhZ3NfZm9yX3dlaWdodCA9IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRjbG91ZF9hdHRzKTsNCgkJfQ0KDQoJCXJldHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGNsb3VkX2F0dHMsICRhbGxfdGFncywgJGFsbF90YWdzX2Zvcl93ZWlnaHQpOw0KCX0gZWxzZSB7DQoJCXJldHVybiAnJzsNCgl9DQp9DQoNCg0KIyMjIENMT1VEIFNVUFBPUlQgRlVOQ1RJT05TICMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpmdW5jdGlvbiB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgJGlzTGlzdCwgJGlzQXJ0aWNsZSkgew0KCXJldHVybiBsQXR0cyhhcnJheSgnd3JhcHRhZycJPT4gKCRpc0xpc3QgPyAndWwnIDogJycpLA0KCQkJJ2JyZWFrJwkJPT4gKCRpc0xpc3QgPyAnbGknIDogJywgJyksDQoJCQknY2xhc3MnCQk9PiAnJywNCgkJCSdicmVha2NsYXNzJwk9PiAnJywNCgkJCSdzZWN0aW9uJwk9PiAnJywNCgkJCSdtaW5wZXJjZW50Jwk9PiAnMTAwJywNCgkJCSdtYXhwZXJjZW50Jwk9PiAoJGlzTGlzdCB8fCAkaXNBcnRpY2xlID8gJzEwMCcgOiAnMjAwJyksDQoJCQknc2hvd2NvdW50cycJPT4gJycsDQoJCQknY291bnR3cmFwY2hhcnMnCT0+ICdbXScsDQoJCQkndXNlcmVsdGFnJwk9PiAoJGlzQXJ0aWNsZSA/ICcxJyA6ICcnKSwNCgkJCSdnZW5lcmF0ZWxpbmtzJwk9PiAnMScsDQoJCQknbWludGFnY291bnQnCT0+ICcwJywNCgkJCSdtYXh0YWdjb3VudCcJPT4gJzEwMDAnLA0KCQkJJ3NldHNpemVzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyksDQoJCQkndXNlbm9mb2xsb3cnCT0+ICcnLA0KCQkJJ3NvcnQnCQk9PiAnYWxwaGEnLA0KCQkJJ3VzZW92ZXJhbGxjb3VudHMnCT0+ICcnLA0KCQkJJ3NldGNsYXNzZXMnCT0+ICgkaXNBcnRpY2xlID8gJzAnIDogJzEnKSwNCgkJCSd0aXRsZScJCT0+ICcnLA0KCQkJJ2xpc3RsaW1pdCcJPT4gJycsDQoJCQkna2VlcCcJCT0+ICdsYXJnZXN0JywNCgkJCSdjdXRvZmYnCT0+ICdjaHVuaycsDQoJCQkndGV4dHRyYW5zZm9ybScJPT4gJ25vbmUnLA0KCQkJJ2xpbmtwYXRoJwk9PiAnJywNCgkJCSdsaW5rcGF0aHRhaWwnCT0+ICcnLA0KCQkJJ2ZpbHRlcnNlYXJjaCcJPT4gJzEnLA0KCQkJJ2V4Y2x1ZGVzZWN0aW9uJz0+ICcnLA0KCQkJJ2FjdGl2ZWNsYXNzJwk9PiAndGFnQWN0aXZlJw0KCQkpLCRhdHRzLCAwKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cykgew0KCWV4dHJhY3QoJGF0dHMpOw0KDQoJJHNlY3Rpb25fY2xhdXNlID0gJyc7DQoJaWYgKCRzZWN0aW9uIDw+ICcnKSB7DQoJCSRrZXlzID0gc3BsaXQoJywnLCAkc2VjdGlvbik7DQoJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsNCgkJCSRrZXlwYXJ0c1tdID0gIiBTZWN0aW9uID0gJyIgLiB0cmltKCRrZXkpIC4gIiciOw0KCQl9DQoJCSRzZWN0aW9uX2NsYXVzZSA9ICIgQU5EICgiIC4gam9pbignIG9yICcsICRrZXlwYXJ0cykgLiAiKSI7DQoJfQ0KDQoJJHRhZ3NfZmllbGQgPSBUUlVfVEFHU19GSUVMRDsNCglpbmNsdWRlX29uY2UgdHhwYXRoLicvcHVibGlzaC9zZWFyY2gucGhwJzsNCg0KCSRmaWx0ZXIgPSB0cnVfdGFnc19maWx0ZXJfc2VjdGlvbnMoJGV4Y2x1ZGVzZWN0aW9uKTsNCgkkZmlsdGVyIC49ICgkZmlsdGVyc2VhcmNoID8gZmlsdGVyU2VhcmNoKCkgOiAnJyk7DQoNCgkkYWxsX3RhZ3MgPSBhcnJheSgpOw0KCSRycyA9IHNhZmVfcm93cygiJHRhZ3NfZmllbGQiLCAidGV4dHBhdHRlcm4iLCAiJHRhZ3NfZmllbGQgPD4gJyciIC4gJHNlY3Rpb25fY2xhdXNlIC4gJGZpbHRlciAuICIgYW5kIFN0YXR1cyA+PSAnNCcgYW5kIFBvc3RlZCA8IG5vdygpIik7DQoJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsNCgkJJHRlbXBfYXJyYXkgPSBhcnJheSgpOw0KCQlpZiAoYXJyYXlfa2V5X2V4aXN0cygkdGFnc19maWVsZCwgJHJvdykpIHsNCgkJCSR0ZW1wX2FycmF5ID0gZXhwbG9kZSgiLCIsIHRyaW0odHJ1X3RhZ3Nfc3RydG9sb3dlcigkcm93WyR0YWdzX2ZpZWxkXSkpKTsNCgkJfQ0KCQkkYWxsX3RhZ3MgPSBhcnJheV9tZXJnZSgkYWxsX3RhZ3MsIHRydV90YWdzX3RyaW1fdGFncygkdGVtcF9hcnJheSkpOw0KCX0NCg0KCXJldHVybiAkYWxsX3RhZ3M7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfZmlsdGVyX3NlY3Rpb25zKCRleGNsdWRlc2VjdGlvbikgew0KCSRzZWN0aW9ucyA9IGV4cGxvZGUoJywnLCAkZXhjbHVkZXNlY3Rpb24pOw0KCSRmaWx0ZXJzID0gYXJyYXkoKTsNCglmb3JlYWNoICgkc2VjdGlvbnMgYXMgJHNlY3Rpb24pIHsNCgkJJGZpbHRlcnNbXSA9ICJhbmQgU2VjdGlvbiAhPSAnIi5kb1NsYXNoKCRzZWN0aW9uKS4iJyI7DQoJfQ0KCXJldHVybiBqb2luKCcgJywgJGZpbHRlcnMpOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3JlbmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCkgew0KCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJZXh0cmFjdCgkYXR0cyk7DQoNCgkkdGFnc193ZWlnaHQgPSBhcnJheV9jb3VudF92YWx1ZXMoJGFsbF90YWdzX2Zvcl93ZWlnaHQpOw0KDQoJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgew0KCQlpZiAoIWluX2FycmF5KCR0YWcsICRhbGxfdGFncykNCgkJICAgfHwgJHRhZ3Nfd2VpZ2h0WyR0YWddIDwgJG1pbnRhZ2NvdW50DQoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFnXSA+ICRtYXh0YWdjb3VudCkgew0KCQkJdW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsNCgkJfQ0KCX0NCg0KCSRzb3J0X2J5X2NvdW50ID0gKHN0cnBvcygkc29ydCwgJ2NvdW50JykgIT09IGZhbHNlKTsNCgkkc29ydF9hc2NlbmRpbmcgPSAoc3RycG9zKCRzb3J0LCAnYXNjJykgIT09IGZhbHNlKTsNCgkkdGFnc193ZWlnaHQgPSB0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCAkc29ydF9ieV9jb3VudCwgJHNvcnRfYXNjZW5kaW5nKTsNCg0KCWlmICgkbGlzdGxpbWl0ID4gMCAmJiAkbGlzdGxpbWl0IDwgY291bnQoJHRhZ3Nfd2VpZ2h0KSkgew0KCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5KCk7DQoJCWlmICgka2VlcCA9PSAnbGFyZ2VzdCcpIHsNCgkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCB0cnVlLCBmYWxzZSkpOw0KCQl9IGVsc2Ugew0KCQkJaWYgKCRrZWVwID09ICdyYW5kb20nKSB7DQoJCQkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgew0KCQkJCQkkcmVzb3J0ZWRfdGFnc1skdGFnXSA9IHJhbmQoMCwgJHdlaWdodCk7DQoJCQkJfQ0KCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFnc19zb3J0X3RhZ3MoJHJlc29ydGVkX3RhZ3MsIHRydWUsIGZhbHNlKSk7DQoJCQl9IGVsc2UgaWYgKCRrZWVwID09ICdhbHBoYScpIHsNCgkJCQkkcmVzb3J0ZWRfdGFncyA9IGFycmF5X2tleXMoJHRhZ3Nfd2VpZ2h0KTsNCgkJCQluYXRjYXNlc29ydCgkcmVzb3J0ZWRfdGFncyk7DQoJCQl9DQoJCQkkY3V0b2ZmID0gJ2V4YWN0JzsNCgkJfQ0KDQoJCSRsYXN0X2dvb2RfaW5kZXggPSAkbGlzdGxpbWl0IC0gMTsNCgkJaWYgKCRjdXRvZmYgPT0gJ2NodW5rJykgeyAvL2FsdGVybmF0aXZlIGlzICdleGFjdCcNCgkJCSRsYXN0X3dlaWdodCA9IC0xOw0KCQkJZm9yICgkaSA9IDA7ICRpIDwgJGxpc3RsaW1pdCArIDE7ICRpKyspIHsNCgkJCQkkbmV3X3dlaWdodCA9ICR0YWdzX3dlaWdodFskcmVzb3J0ZWRfdGFnc1skaV1dOw0KCQkJCWlmICgkbmV3X3dlaWdodCAhPSAkbGFzdF93ZWlnaHQpIHsNCgkJCQkJJGxhc3RfZ29vZF9pbmRleCA9ICRpIC0gMTsNCgkJCQkJJGxhc3Rfd2VpZ2h0ID0gJG5ld193ZWlnaHQ7DQoJCQkJfQ0KCQkJfQ0KCQkJaWYgKCRsYXN0X2dvb2RfaW5kZXggPCAwKSB7DQoJCQkJJGxhc3RfZ29vZF9pbmRleCA9ICRsaXN0bGltaXQgLSAxOw0KCQkJfQ0KCQl9DQoNCgkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9jaHVuaygkcmVzb3J0ZWRfdGFncywgJGxhc3RfZ29vZF9pbmRleCArIDEpOw0KCQkkcmVzb3J0ZWRfdGFncyA9ICRyZXNvcnRlZF90YWdzWzBdOw0KDQoJCWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsNCgkJCWlmICghaW5fYXJyYXkoJHRhZywgJHJlc29ydGVkX3RhZ3MpKSB7DQoJCQkJdW5zZXQoJHRhZ3Nfd2VpZ2h0WyR0YWddKTsNCgkJCX0NCgkJfQ0KCX0NCg0KCWlmICgkZ2VuZXJhdGVsaW5rcykgew0KCQlpZiAoJGxpbmtwYXRoKSB7DQoJCQkkdXJscHJlZml4ID0gJGxpbmtwYXRoOw0KCQkJJHVybHN1ZmZpeCA9ICRsaW5rcGF0aHRhaWw7DQoJCX0gZWxzZSB7DQoJCQlpZiAoJHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT52YWx1ZSkgew0KCQkJCSR1cmxwcmVmaXggPSBodSAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJy8nOw0KCQkJfSBlbHNlIHsNCgkJCQkkdXJscHJlZml4ID0gaHUgLiAnP3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJyZhbXA7dD0nOw0KCQkJfQ0KCQkJJHVybHN1ZmZpeCA9ICgkdHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlID8gJy8nIDogJycpOw0KCQl9DQoNCgkJaWYgKCR1c2VyZWx0YWcpIHsNCgkJCWlmICgkdXNlbm9mb2xsb3cpIHsNCgkJCQkkdXJsc3VmZml4IC49ICciIHJlbD0idGFnIG5vZm9sbG93JzsNCgkJCX0gZWxzZSB7DQoJCQkJJHVybHN1ZmZpeCAuPSAnIiByZWw9InRhZyc7DQoJCQl9DQoJCX0gZWxzZSBpZiAoJHVzZW5vZm9sbG93KSB7DQoJCQkkdXJsc3VmZml4IC49ICciIHJlbD0ibm9mb2xsb3cnOw0KCQl9DQoJfQ0KDQoJaWYgKGNvdW50KCR0YWdzX3dlaWdodCkgPiAwKSB7DQoJCSRtYXggPSBtYXgoJHRhZ3Nfd2VpZ2h0KTsNCgkJJG1pbiA9IG1pbigkdGFnc193ZWlnaHQpOw0KCX0gZWxzZSB7DQoJCSRtYXggPSAkbWluID0gMDsNCgl9DQoJJHN0ZXB2YWx1ZSA9ICgkbWF4ID09ICRtaW4pID8gMCA6ICgkbWF4cGVyY2VudCAtICRtaW5wZXJjZW50KSAvICgkbWF4IC0gJG1pbik7DQoNCgkkdGFnc19odG1sID0gYXJyYXkoKTsNCgkkdGFnX3NlYXJjaF90YWcgPSB0cnVfdGFnc190YWdfcGFyYW1ldGVyKGFycmF5KCdzdHJpcGh5cGhlbnMnID0+ICcxJykpOw0KCSR0YWdfc2VhcmNoX3RhZyA9IGZ1bmN0aW9uX2V4aXN0cygiaHRtbHNwZWNpYWxjaGFyc19kZWNvZGUiKSA/IGh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlKCR0YWdfc2VhcmNoX3RhZykgOiBodG1sX2VudGl0eV9kZWNvZGUoJHRhZ19zZWFyY2hfdGFnKTsNCglmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7DQoJCSR0YWdfd2VpZ2h0ID0gZmxvb3IoJG1pbnBlcmNlbnQgKyAoJHdlaWdodCAtICRtaW4pICogJHN0ZXB2YWx1ZSk7DQoNCgkJJHN0eWxlID0gJyc7DQoJCWlmICgkc2V0c2l6ZXMpDQoJCQkkc3R5bGUgPSAnIHN0eWxlPSJmb250LXNpemU6ICcgLiAkdGFnX3dlaWdodCAuICclOyInOw0KDQoJCSR0YWdfY2xhc3MgPSAnJzsNCgkJaWYgKCRzZXRjbGFzc2VzKSB7DQoJCQkkdGFnX2NsYXNzID0gJyBjbGFzcz0iJzsNCgkJCWlmICgkd2VpZ2h0ID09ICRtaW4pIHsNCgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplU21hbGxlc3QiOw0KCQkJfSBlbHNlIGlmICgkd2VpZ2h0ID09ICRtYXgpIHsNCgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXplTGFyZ2VzdCI7DQoJCQl9IGVsc2Ugew0KCQkJCSR0YWdfY2xhc3MgLj0gInRhZ1NpemVNZWRpdW0iOw0KCQkJfQ0KCQkJJHRhZ19jbGFzcyAuPSAnIHRhZ1NpemUnIC4gKCR3ZWlnaHQgKyAxIC0gJG1pbik7DQoJCQlpZiAoJHRhZyA9PSAkdGFnX3NlYXJjaF90YWcpIHsNCgkJCQkkdGFnX2NsYXNzIC49ICcgJyAuICRhY3RpdmVjbGFzczsNCgkJCX0NCgkJCSR0YWdfY2xhc3MgLj0gJyInOw0KCQl9DQoNCgkJLy9hZGFwdGVkIGZyb20gY29kZSBieSBnZHRyb2lhbm8sIHNlZSBodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/cGlkPTEwMjg3NSNwMTAyODc1DQoJCSR0aXRsZWNvdW50ID0gJyc7DQoJCWlmICgkdGl0bGUpDQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAnIic7DQoJCSRkaXNwbGF5Y291bnQ9ICcnOw0KCQkkY291bnQgPSAkY291bnR3cmFwY2hhcnN7MH0gLiAkd2VpZ2h0IC4gJGNvdW50d3JhcGNoYXJzezF9Ow0KCQlpZiAoJHNob3djb3VudHMgPT0gJ3RpdGxlJyB8fCAkc2hvd2NvdW50cyA9PSAnYm90aCcpDQoJCQkkdGl0bGVjb3VudCA9ICcgdGl0bGU9IicgLiAkdGl0bGUgLiAkY291bnQgLiAnIic7DQoJCWlmICgkc2hvd2NvdW50cyAmJiAkc2hvd2NvdW50cyAhPSAndGl0bGUnKQ0KCQkJJGRpc3BsYXljb3VudCA9ICcgJyAuICRjb3VudDsNCg0KCQlpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2NhcGl0YWxpemUnKSB7DQoJCQkkdGFnID0gdWN3b3JkcygkdGFnKTsNCgkJfSBlbHNlIGlmICgkdGV4dHRyYW5zZm9ybSA9PSAndXBwZXJjYXNlJykgew0KCQkJJHRhZyA9IHN0cnRvdXBwZXIoJHRhZyk7DQoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ2xvd2VyY2FzZScpIHsNCgkJCSR0YWcgPSBzdHJ0b2xvd2VyKCR0YWcpOw0KCQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdjYXBmaXJzdCcpIHsNCgkJCSR0YWcgPSB1Y2ZpcnN0KCR0YWcpOw0KCQl9DQoNCgkJaWYgKCRnZW5lcmF0ZWxpbmtzKSB7DQoJCQkkd2hvbGV1cmwgPSAnIicgLiAkdXJscHJlZml4IC4gdXJsZW5jb2RlKHN0cl9yZXBsYWNlKCcgJywgJy0nLCAkdGFnKSkgLiAkdXJsc3VmZml4IC4gJyInOw0KCQkJJHRhZ3NfaHRtbFtdID0gJzxhIGhyZWY9JyAuICR3aG9sZXVybCAuICR0YWdfY2xhc3MgLiAkc3R5bGUgLiAkdGl0bGVjb3VudCAuICc+JyAuIGh0bWxzcGVjaWFsY2hhcnMoJHRhZykgLiAnPC9hPicgLiAkZGlzcGxheWNvdW50Ow0KCQl9IGVsc2UgaWYgKCR0YWdfY2xhc3MgfHwgJHN0eWxlIHx8ICR0aXRsZWNvdW50KSB7DQoJCQkkdGFnc19odG1sW10gPSAnPHNwYW4nIC4gJHRhZ19jbGFzcyAuICRzdHlsZSAuICR0aXRsZWNvdW50IC4gJz4nIC4gaHRtbHNwZWNpYWxjaGFycygkdGFnKSAuICc8L3NwYW4+JyAuICRkaXNwbGF5Y291bnQ7DQoJCX0gZWxzZSB7DQoJCQkkdGFnc19odG1sW10gPSBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJGRpc3BsYXljb3VudDsNCgkJfQ0KCX0NCglyZXR1cm4gdHJ1X3RhZ3NfZG9fd3JhcCgkdGFnc19odG1sLCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKTsNCn0NCg0KDQojIyMgQ0xFQU4gVVJMIEZVTkNUSU9OUyAjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQppZiAoJHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT52YWx1ZSA9PSAnY2xlYW4nKSB7DQoJcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90YWdzX2NsZWFuX3VybF9oYW5kbGVyJywgJ3ByZXRleHQnKTsNCn0NCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfY2xlYW5fdXJsX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgew0KCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJJHN1YnBhdGggPSBwcmVnX3JlcGxhY2UoIi9odHRwcz86XC9cLy4qKFwvLiopL1VpIiwiJDEiLGh1KTsNCgkkcmVnc2FmZXN1YnBhdGggPSBwcmVnX3F1b3RlKCRzdWJwYXRoLCAnLycpOw0KCSRyZXEgPSBwcmVnX3JlcGxhY2UoIi9eJHJlZ3NhZmVzdWJwYXRoL2kiLCcvJywkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSk7DQoNCgkkcXMgPSBzdHJwb3MoJHJlcSwgJz8nKTsNCgkkcWF0dHMgPSAoJHFzID8gJyYnLnN1YnN0cigkcmVxLCAkcXMgKyAxKSA6ICcnKTsNCglpZiAoJHFzKSAkcmVxID0gc3Vic3RyKCRyZXEsIDAsICRxcyk7DQoNCgkkcGFydHMgPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKHNwbGl0KCcvJywgJHJlcSkpKTsNCglpZiAoY291bnQoJHBhcnRzKSA9PSAyICYmICRwYXJ0c1swXSA9PSAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSkgew0KCQkkdGFnID0gJHBhcnRzWzFdOw0KCQkkX1NFUlZFUlsnUVVFUllfU1RSSU5HJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPScgLiAkdGFnIC4gJHFhdHRzOw0KCQkkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA9ICRzdWJwYXRoIC4gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUgLiAnLz8nIC4gJF9TRVJWRVJbJ1FVRVJZX1NUUklORyddOw0KCQlpZiAoY291bnQoJF9QT1NUKSA+IDApIHsNCgkJCSRfUE9TVFsnc2VjdGlvbiddID0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWU7DQoJCQkkX1BPU1RbJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlXSA9ICR0YWc7DQoJCX0gZWxzZSB7DQoJCQkkX0dFVFsnc2VjdGlvbiddID0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWU7DQoJCQkkX0dFVFskdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWVdID0gJHRhZzsNCgkJfQ0KCX0NCn0NCg0KDQojIyMgQURNSU4gU0lERSBGVU5DVElPTlMgIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmlmIChAdHhwaW50ZXJmYWNlID09ICdhZG1pbicpIHsNCglhZGRfcHJpdnMoJ3RydV90YWdzJywgJzEsMicpOw0KCXJlZ2lzdGVyX3RhYignZXh0ZW5zaW9ucycsICd0cnVfdGFncycsICd0cnVfdGFncycpOw0KCXJlZ2lzdGVyX2NhbGxiYWNrKCd0cnVfdGFnc19hZG1pbl90YWInLCAndHJ1X3RhZ3MnKTsNCg0KCWlmICgkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9XUklURV9UQUJdLT52YWx1ZSkgew0KCQlyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfYWRtaW5fd3JpdGVfdGFiX2hhbmRsZXInLCAnYXJ0aWNsZScpOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl90YWIoJGV2ZW50LCAkc3RlcCkgew0KCXJlcXVpcmVfcHJpdnMoJ3RydV90YWdzJyk7DQoNCgkkcmVzdWx0cyA9IHRydV90YWdzX2FkbWluX3RhYl9oYW5kbGVfaW5wdXQoKTsNCg0KCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoYXJyYXkoKSwgZmFsc2UsIGZhbHNlKTsNCgkkYWxsX3RhZ3MgPSB0cnVfdGFnc19jbG91ZF9xdWVyeSgkYXR0cyk7DQoJJGNsb3VkID0gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7DQoNCgkkcmVkaXJlY3RzID0gdHJ1X3RhZ3NfbG9hZF9yZWRpcmVjdHMoKTsNCg0KCXRydV90YWdzX2FkbWluX3RhYl9yZW5kZXJfcGFnZSgkcmVzdWx0cywgJGNsb3VkLCAkcmVkaXJlY3RzKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl90YWJfcmVuZGVyX3BhZ2UoJHJlc3VsdHMsICRjbG91ZCwgJHJlZGlyZWN0cykgew0KCWdsb2JhbCAkZXZlbnQ7DQoJcGFnZXRvcCgndHJ1X3RhZ3MnLCAnJyk7DQoNCglpbmNsdWRlKHR4cGF0aCAuICcvaW5jbHVkZS90eHBfcHJlZnMucGhwJyk7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCg0KCWVjaG8gc3RhcnRUYWJsZSgnbGF5b3V0JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHJvd3NwYW49IjQiIHN0eWxlPSJib3JkZXItcmlnaHQ6MnB4IHNvbGlkIGdyYXkiPicuICAjIEkga25vdywgSSBrbm93Li4uDQoJCXN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMzAwcHgnKS4NCgkJCXRyKGhDZWxsKGdUeHQoJ0N1cnJlbnQgdGFncycpKSkuDQoJCQl0cih0ZCgkY2xvdWQpKS4NCgkJZW5kVGFibGUoKS4NCgknPC90ZD48dGQgc3R5bGU9ImJvcmRlci1ib3R0b206MnB4IHNvbGlkIGdyYXk7d2lkdGg6NDAwcHgiPic7DQoNCgkJaWYgKCRyZXN1bHRzKSB7DQoJCQllY2hvIHN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLg0KCQkJCXRyKGhDZWxsKGdUeHQoJ1Jlc3VsdHMnKSkpLg0KCQkJCXRyKHRkYSgkcmVzdWx0cyksICcgc3R5bGU9ImNvbG9yOnJlZCInKS4NCgkJCWVuZFRhYmxlKCk7DQoJCQllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsNCgkJfQ0KDQoNCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4NCgkJCXRyKHRhZyhnVHh0KCdBcnRpY2xlIFRhZyBNYWludGVuYW5jZScpLicgKCcuZ1R4dCgnQ2FzZSBTZW5zaXRpdmUnKS4nISknLCAndGgnLCAnIGNvbHNwYW49IjUiJykpLg0KCQkJdHIoDQoJCQkJZm9ybSgNCgkJCQkJdGRhKGdUeHQoJ1JlbmFtZScpLic6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJdGQodGV4dF9pbnB1dCgnbWF0Y2h0YWcnLCAnJywgJzE1JykpLg0KCQkJCQl0ZGEoZ1R4dCgndG8nKS4nOicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJdGQodGV4dF9pbnB1dCgncmVwbGFjZXRhZycsICcnLCAnMTUnKSkuDQoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ3JlcGxhY2UnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3RydV90YWdzJykpLA0KCQkJCQknJywgJyB2ZXJpZnkoXCcnIC4gZ1R4dCgnYXJlX3lvdV9zdXJlJykgLiAnXCcpIicNCgkJCQkpDQoJCQkpLg0KCQkJdHIoDQoJCQkJZm9ybSgNCgkJCQkJdGRhKGdUeHQoJ0RlbGV0ZScpLic6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJdGQodGV4dF9pbnB1dCgnZGVsZXRldGFnJywgJycsICcxNScpKS4NCgkJCQkJdGRjcygnJywgMikuDQoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ2RlbGV0ZScsIGdUeHQoJ1J1bicpLCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSksDQoJCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAuICdcJykiJw0KCQkJCSkNCgkJCSkuDQoJCWVuZFRhYmxlKCk7DQoNCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsNCg0KCQllY2hvIHN0YXJ0VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLg0KCQkJdHIodGFnKGdUeHQoJ1JlZGlyZWN0aW9ucycpLCAndGgnLCAnIGNvbHNwYW49IjQiJykpOw0KCQkJZm9yZWFjaCAoJHJlZGlyZWN0cyBhcyAkbGVmdHRhZyA9PiAkcmlnaHR0YWcpIHsNCgkJCQllY2hvIHRyKA0KCQkJCQl0ZGEoaHJlZigkbGVmdHRhZywgdHJ1X3RhZ3NfbGlua2lmeV90YWcoJGxlZnR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLg0KCQkJCQl0ZGEoaHRtbHNwZWNpYWxjaGFycygnPT4nKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLg0KCQkJCQl0ZGEoaHJlZigkcmlnaHR0YWcsIHRydV90YWdzX2xpbmtpZnlfdGFnKCRyaWdodHRhZykpLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiJykuDQoJCQkJCXRkKCc8YSBocmVmPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MmYW1wO2RlbGV0ZV9yZWRpcmVjdD0nLnVybGVuY29kZSgkbGVmdHRhZykuJyIgIG9uY2xpY2s9InJldHVybiB2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPkRlbGV0ZTwvYT4nKQ0KCQkJCSk7DQoJCQl9DQoJCQllY2hvIHRyKA0KCQkJCSc8Zm9ybSBuYW1lPSJyZWRpcmVjdCIgaWQ9InJlZGlyZWN0IiBtZXRob2Q9InBvc3QiIGFjdGlvbj0iaW5kZXgucGhwP2V2ZW50PXRydV90YWdzIiBvbnN1Ym1pdD0icmV0dXJuIHZlcmlmeShcJycuZ1R4dCgnYXJlX3lvdV9zdXJlJykuJ1wnKSI+Jy4NCgkJCQkJdGRhKHRleHRfaW5wdXQoJ2xlZnR0YWcnLCAnJywgJzE1JyksICcgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIicpLg0KCQkJCQl0ZGEoaHRtbHNwZWNpYWxjaGFycygnPT4nKSwgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyIicpLg0KCQkJCQl0ZGEodGV4dF9pbnB1dCgncmlnaHR0YWcnLCAnJywgJzE1JyksICcgc3R5bGU9InRleHQtYWxpZ246Y2VudGVyIicpLg0KCQkJCQl0ZGEoJzxhIGhyZWY9IiMiIG9uY2xpY2s9ImlmICh2ZXJpZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykpIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwncmVkaXJlY3RcJykuc3VibWl0KCk7IHJldHVybiBmYWxzZTsiPkFkZCBuZXc8L2E+JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLg0KCQkJCQlmSW5wdXQoJ2hpZGRlbicsICdyZWRpcmVjdCcsICcxJykuDQoJCQkJJzwvZm9ybT4nDQoNCgkJCSkuDQoJCWVuZFRhYmxlKCk7DQoNCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZD4nOw0KDQoJCWVjaG8gc3RhcnRUYWJsZSgnbGlzdCcpLg0KCQkJdHIodGFnKGdUeHQoJ1ByZWZlcmVuY2VzJyksICd0aCcsICcgY29sc3Bhbj0iMiInKSkuDQoJCQlmb3JtKA0KCQkJCXRyKA0KCQkJCQl0ZGEoZ1R4dCgnVXNlIGNsZWFuIFVSTHMnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHJhZGlvX2xpc3QoQ0xFQU5fVVJMUywNCgkJCQkJCQlhcnJheSgnY2xlYW4nPT5nVHh0KCdjbGVhbicpLCAnbWVzc3knPT5nVHh0KCdtZXNzeScpKSwNCgkJCQkJCQkkdHJ1X3RhZ3NfcHJlZnNbQ0xFQU5fVVJMU10tPnZhbHVlKSkNCgkJCQkpLg0KCQkJCXRyKA0KCQkJCQl0ZGEoZ1R4dCgnVGFnIHNlY3Rpb24gbmFtZScpLicgKGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+ZGVmYXVsdF92YWx1ZS4nIik6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJdGQodGV4dF9pbnB1dChUQUdfU0VDVElPTiwgJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWUsICcxNScpKQ0KCQkJCSkuDQoJCQkJdHIoDQoJCQkJCXRkYShnVHh0KCdVUkwgcGFyYW1ldGVyIGZvciB0YWcgc2VhcmNoJykuJyAoZGVmYXVsdCBpcyAiJy4kdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+ZGVmYXVsdF92YWx1ZS4nIik6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4NCgkJCQkJdGQodGV4dF9pbnB1dChQQVJNX05BTUUsICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSwgJzE1JykpDQoJCQkJKS4NCgkJCQl0cigNCgkJCQkJdGRhKGdUeHQoJ1B1dCB0YWdzIGludG8gUlNTL0F0b20gZmVlZHMsIGluICJDYXRlZ29yeSIgZWxlbWVudHMnKS4NCgkJCQkJCSc6IDxicj4oeW91IHByb2JhYmx5IHdhbnQgdGhpcyknLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHllc25vUmFkaW8oVEFHU19JTl9GRUVEX0NBVEVHT1JJRVMsICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklFU10tPnZhbHVlKSkNCgkJCQkpLg0KCQkJCXRyKA0KCQkJCQl0ZGEoJ0FwcGVuZCB0aGUgdGFnIGxpc3QgdG8gdGhlIGJvZHkgb2YgUlNTL0F0b20gZmVlZHMsICcuDQoJCQkJCQknd2l0aCBsaW5rcywgYW5kIHdpdGggcmVsPSJ0YWciOjxicj5JZiB0aGlzIGlzIHR1cm5lZCBvbiwnLg0KCQkJCQkJJ3lvdSBjYW4gZGVmaW5lIGEgIm1pc2MiIGZvcm0gbmFtZWQgdHJ1X3RhZ3NfZmVlZF90YWdzICcuDQoJCQkJCQkndGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVuZGVyIHRoZSB0YWdzIGluIHRoZSBmZWVkLicsDQoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHllc25vUmFkaW8oVEFHU19JTl9GRUVEX0JPRFksICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0tPnZhbHVlKSkNCgkJCQkpLg0KCQkJCXRyKA0KCQkJCQl0ZGEoZ1R4dCgnU2hvdyBhIGNsaWNrYWJsZSBsaXN0IG9mIHRhZ3Mgb24gdGhlICJXcml0ZSIgcGFnZScpLic6ICcsDQoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuDQoJCQkJCXRkKHllc25vUmFkaW8oVEFHU19JTl9XUklURV9UQUIsICR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlKSkNCgkJCQkpLg0KCQkJCXRyKA0KCQkJCQl0ZCgnJykuDQoJCQkJCXRkYShmSW5wdXQoJ3N1Ym1pdCcsICdwcmVmcycsIGdUeHQoJ1NhdmUnKSwgJ3B1Ymxpc2gnKS5lSW5wdXQoJ3RydV90YWdzJyksICcgc3R5bGU9InRleHQtYWxpZ246cmlnaHQiJykNCgkJCQkpLA0KCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1cmUnKSAuICdcJykiJw0KCQkJKS4NCgkJZW5kVGFibGUoKTsNCg0KCWVjaG8gJzwvdGQ+PC90cj4nLmVuZFRhYmxlKCk7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX2hhbmRsZV9pbnB1dCgpIHsNCglpZiAoZ3BzKCdwcmVmcycpKSB7DQoJCXJldHVybiB0cnVfdGFnc19hZG1pbl91cGRhdGVfcHJlZnMoKTsNCgl9IGVsc2UgaWYgKGdwcygnZGVsZXRlJykpIHsNCgkJcmV0dXJuIHRydV90YWdzX2FkbWluX2RlbGV0ZV90YWcoZ3BzKCdkZWxldGV0YWcnKSk7DQoJfSBlbHNlIGlmIChncHMoJ3JlcGxhY2UnKSkgew0KCQkkcmVzdWx0ID0gdHJ1X3RhZ3NfYWRtaW5fcmVwbGFjZV90YWcoZ3BzKCdtYXRjaHRhZycpLCBncHMoJ3JlcGxhY2V0YWcnKSwgZmFsc2UpOw0KCQlyZXR1cm4gJHJlc3VsdCAuICc8YnI+JyAuIHRydV90YWdzX2FkbWluX3JlZGlyZWN0X3RhZyhncHMoJ21hdGNodGFnJyksIGdwcygncmVwbGFjZXRhZycpKTsNCgl9IGVsc2UgaWYgKGdwcygncmVkaXJlY3QnKSkgew0KCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fcmVkaXJlY3RfdGFnKGdwcygnbGVmdHRhZycpLCBncHMoJ3JpZ2h0dGFnJykpOw0KCX0gZWxzZSBpZiAoZ3BzKCdkZWxldGVfcmVkaXJlY3QnKSkgew0KCQlyZXR1cm4gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0KGdwcygnZGVsZXRlX3JlZGlyZWN0JykpOw0KCX0gZWxzZSB7DQoJCXJldHVybiAnJzsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdXBkYXRlX3ByZWZzKCkgew0KCWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7DQoJJHJlc3VsdHMgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0cnVfdGFnc19wcmVmcyBhcyAkcHJlZikgew0KCQkkdmFsaWRfdmFsdWUgPSAkcHJlZi0+dmFsaWRhdGVfdmFsdWUoZ3BzKCRwcmVmLT5uYW1lKSk7DQoJCWlmICgkdmFsaWRfdmFsdWUgJiYgJHZhbGlkX3ZhbHVlIDw+IGdwcygkcHJlZi0+bmFtZSkpIHsNCgkJCXJldHVybiAkdmFsaWRfdmFsdWU7ICAjIyMgdGhpcyBpcyBhIHNuZWFreSB3YXkgdG8gaGFuZGxlIHZhbGlkYXRpb24gLSBzb3JyeSA7KQ0KCQl9DQoJCWlmICgkdmFsaWRfdmFsdWUgPD4gJHByZWYtPnZhbHVlKSB7DQoJCQlpZiAoJHZhbGlkX3ZhbHVlID09ICRwcmVmLT5kZWZhdWx0X3ZhbHVlKSB7DQoJCQkJJHJlc3VsdCA9IHRydV90YWdzX2RlbGV0ZV9wcmVmKCRwcmVmLT5uYW1lKTsNCgkJCX0gZWxzZSB7DQoJCQkJJHJlc3VsdCA9IHRydV90YWdzX3Vwc2VydF9wcmVmKCRwcmVmLT5uYW1lLCAkdmFsaWRfdmFsdWUpOw0KCQkJfQ0KCQkJaWYgKCRyZXN1bHQpIHsNCgkJCQkkcmVzdWx0c1tdID0gJ1VwZGF0ZWQgJyAuICRwcmVmLT5uYW1lOw0KCQkJCSRwcmVmLT52YWx1ZSA9ICR2YWxpZF92YWx1ZTsNCgkJCX0gZWxzZSB7DQoJCQkJJHJlc3VsdHNbXSA9ICdFcnJvciB1cGRhdGluZyAnIC4gJHByZWYtPm5hbWU7DQoJCQl9DQoJCX0NCgl9DQoJaWYgKGNvdW50KCRyZXN1bHRzKSA9PSAwKSB7DQoJCXJldHVybiAnTm8gcmVjb3JkcyBuZWVkIHVwZGF0aW5nJzsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gam9pbignPGJyPicsICRyZXN1bHRzKTsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfdXBzZXJ0X3ByZWYoJG5hbWUsICR2YWx1ZSkgew0KCWlmICghc2FmZV9xdWVyeSgnY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycpLg0KCQknIChuYW1lIHZhcmNoYXIoMjU1KSBwcmltYXJ5IGtleSwgJy4NCgkJJ3ZhbHVlIHZhcmNoYXIoMjU1KSBub3QgbnVsbCknKSkgew0KCQlyZXR1cm4gJ1NlcmlvdXMgZXJyb3IgLSB1bmFibGUgdG8gY3JlYXRlIHRoZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3ByZWZzJykgLiAnIHRhYmxlLic7DQoJfQ0KDQoJcmV0dXJuIHNhZmVfdXBzZXJ0KCd0cnVfdGFnc19wcmVmcycsICd2YWx1ZT0iJy4kdmFsdWUuJyInLCAnbmFtZT0iJy4kbmFtZS4nIicpOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2RlbGV0ZV9wcmVmKCRuYW1lKSB7DQoJaWYgKHNhZmVfZGVsZXRlKCd0cnVfdGFnc19wcmVmcycsICduYW1lPSInLiRuYW1lLiciJykpIHsNCgkJaWYgKHNhZmVfY291bnQoJ3RydV90YWdzX3ByZWZzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcHJlZnMnKSkpIHsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQlyZXR1cm4gdHJ1ZTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX2RlbGV0ZV90YWcoJGRlbGV0ZXRhZykgew0KCWlmICh0cmltKCRkZWxldGV0YWcpKSB7DQoJCXJldHVybiB0cnVfdGFnc19hZG1pbl9yZXBsYWNlX3RhZygkZGVsZXRldGFnLCAnJywgdHJ1ZSk7DQoJfSBlbHNlIHsNCgkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSc7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX3JlcGxhY2VfdGFnKCRtYXRjaHRhZywgJHJlcGxhY2V0YWcsICRhbGxvd19ibGFua19yZXBsYWNldGFnKSB7DQoJJG1hdGNodGFnID0gdHJpbSgkbWF0Y2h0YWcpOw0KCSRyZXBsYWNldGFnID0gdHJpbSgkcmVwbGFjZXRhZyk7DQoJaWYgKCRtYXRjaHRhZyAmJiAoJGFsbG93X2JsYW5rX3JlcGxhY2V0YWcgfHwgJHJlcGxhY2V0YWcpKSB7DQoJCWlmIChzYWZlX3VwZGF0ZSgndGV4dHBhdHRlcm4nLCBUUlVfVEFHU19GSUVMRC4nPXRyaW0oYm90aCBcJyxcJyBmcm9tIHJlcGxhY2UoY29uY2F0KCIsIiwgJy5UUlVfVEFHU19GSUVMRC4nLCAiLCIpLCBjb25jYXQoIiwiLCBcJycuYWRkc2xhc2hlcygkbWF0Y2h0YWcpLidcJywgIiwiKSwgXCcsJy5hZGRzbGFzaGVzKCRyZXBsYWNldGFnKS4nLFwnKSknLCAnMScpKSB7DQoJCQlyZXR1cm4gJ1VwZGF0ZWQgJy5teXNxbF9hZmZlY3RlZF9yb3dzKCkuJyByb3dzICgiJy5odG1sc3BlY2lhbGNoYXJzKCRtYXRjaHRhZykuJyI9PiInLmh0bWxzcGVjaWFsY2hhcnMoJHJlcGxhY2V0YWcpLiciKSc7DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gJ0Vycm9yOiAnIC4gbXlzcWxfZXJyb3IoKTsNCgkJfQ0KCX0gZWxzZSB7DQoJCXJldHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUgaW4gYm90aCBmaWVsZHMnOw0KCX0NCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl9yZWRpcmVjdF90YWcoJGxlZnR0YWcsICRyaWdodHRhZykgew0KCSRsZWZ0dGFnID0gYWRkc2xhc2hlcyh0cnVfdGFnc19zdHJ0b2xvd2VyKHRyaW0oJGxlZnR0YWcpKSk7DQoJJHJpZ2h0dGFnID0gYWRkc2xhc2hlcyh0cnVfdGFnc19zdHJ0b2xvd2VyKHRyaW0oJHJpZ2h0dGFnKSkpOw0KCWlmICghJGxlZnR0YWcgfHwgISRyaWdodHRhZykgew0KCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlIGluIGJvdGggZmllbGRzJzsNCgl9DQoNCglpZiAoIXNhZmVfcXVlcnkoJ2NyZWF0ZSB0YWJsZSBpZiBub3QgZXhpc3RzICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykuDQoJCScgKGxlZnR0YWcgdmFyY2hhcigyNTUpIHByaW1hcnkga2V5LCAnLg0KCQkncmlnaHR0YWcgdmFyY2hhcigyNTUpIG5vdCBudWxsKScpKSB7DQoJCXJldHVybiAnU2VyaW91cyBlcnJvciAtIHVuYWJsZSB0byBjcmVhdGUgdGhlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykgLiAnIHRhYmxlLic7DQoJfQ0KDQoJaWYgKHNhZmVfaW5zZXJ0KCd0cnVfdGFnc19yZWRpcmVjdHMnLCAnbGVmdHRhZz0iJy4kbGVmdHRhZy4nIixyaWdodHRhZz0iJy4kcmlnaHR0YWcuJyInKSkgew0KCQlyZXR1cm4gJ1JlZGlyZWN0IGFkZGVkICgiJy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIj0+IicuaHRtbHNwZWNpYWxjaGFycygkcmlnaHR0YWcpLiciKSAtIHBsZWFzZSB0ZXN0IGl0ISc7DQoJfSBlbHNlIHsNCgkJcmV0dXJuICdFcnJvciBhZGRpbmcgcmVjb3JkIC0gZG9lcyBpdCBhbHJlYWR5IGV4aXN0Pyc7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2FkbWluX2RlbGV0ZV9yZWRpcmVjdCgkbGVmdHRhZykgew0KCWlmIChzYWZlX2RlbGV0ZSgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJ2xlZnR0YWc9IicuYWRkc2xhc2hlcygkbGVmdHRhZykuJyInKSkgew0KCQlpZiAoc2FmZV9jb3VudCgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykpKSB7DQoJCQlyZXR1cm4gJ1JlZGlyZWN0IGRlbGV0ZWQsIGJ1dCB1bmFibGUgdG8gZHJvcCB0YWJsZSAnIC4gc2FmZV9wZngoJ3RydV90YWdzX3JlZGlyZWN0cycpOw0KCQl9DQoJCXJldHVybiAnUmVkaXJlY3QgZGVsZXRlZCAoIicuaHRtbHNwZWNpYWxjaGFycygkbGVmdHRhZykuJyIpJzsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gJ0Vycm9yIGRlbGV0aW5nIHJlZGlyZWN0JzsNCgl9DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fd3JpdGVfdGFiX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgew0KCSRjbG91ZCA9IGFycmF5X3VuaXF1ZSh0cnVfdGFnc19jbG91ZF9xdWVyeSh0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCB0cnVlLCB0cnVlKSkpOw0KCXNvcnQoJGNsb3VkKTsNCg0KCSRpZCA9IChlbXB0eSgkR0xPQkFMU1snSUQnXSkgPyBncHMoJ0lEJykgOiAkR0xPQkFMU1snSUQnXSk7DQoJJGFydGljbGVfdGFncyA9IChlbXB0eSgkaWQpID8gYXJyYXkoKSA6IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCRpZCkpOw0KDQoJJGxpbmtzID0gYXJyYXkoKTsNCglmb3JlYWNoICgkY2xvdWQgYXMgJHRhZykgew0KCQkkc3R5bGUgPSAoaW5fYXJyYXkoJHRhZywgJGFydGljbGVfdGFncykgPyAnIGNsYXNzPSJ0YWdfY2hvc2VuIicgOiAnJyk7DQoJCSRsaW5rc1tdID0gJzxhIGhyZWY9IiNhZHZhbmNlZCInLiRzdHlsZS4nIG9uY2xpY2s9InRoaXMuc2V0QXR0cmlidXRlKFxcXCdjbGFzc1xcXCcsIHRvZ2dsZVRhZyhcXFwnJy5hZGRzbGFzaGVzKGFkZHNsYXNoZXMoJHRhZykpLidcXFwnKSk7IHJldHVybiBmYWxzZTsiPicgLiBhZGRzbGFzaGVzKGh0bWxzcGVjaWFsY2hhcnMoJHRhZykpIC4gJzxcL2E+JzsNCgl9DQoJJHRvX2luc2VydCA9IGpvaW4oJywgJywgJGxpbmtzKTsNCgkkdG9faW5zZXJ0ID0gIjxzdHlsZT5hLnRhZ19jaG9zZW57YmFja2dyb3VuZC1jb2xvcjogI0ZFQjsgY29sb3I6IGJsYWNrO308L3N0eWxlPiIgLiAkdG9faW5zZXJ0Ow0KDQoJJGpzID0gPDw8RU9GDQoJCXZhciBrZXl3b3Jkc0ZpZWxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2tleXdvcmRzJyk7DQoJCXZhciBwYXJlbnQgPSBrZXl3b3Jkc0ZpZWxkLnBhcmVudE5vZGU7DQoJCXBhcmVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsNCgkJdmFyIGNsb3VkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOw0KCQljbG91ZC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3RydV90YWdzX2FkbWluX3RhZ3MnKTsNCgkJY2xvdWQuaW5uZXJIVE1MID0gJ3skdG9faW5zZXJ0fSc7DQoJCXBhcmVudC5hcHBlbmRDaGlsZChjbG91ZCk7DQoNCgkJZnVuY3Rpb24gdG9nZ2xlVGFnKHRhZ05hbWUpIHsNCgkJCXZhciByZWdleFRhZyA9IHRhZ05hbWUucmVwbGFjZSgvKFtcXFxcXF5cXCQqK1tcXF0/e30uPSE6KHwpXSkvZywiXFxcXCQxIik7DQoJCQl2YXIgdGFnUmVnZXggPSBuZXcgUmVnRXhwKCIoKF58LClcXFxzKikiICsgcmVnZXhUYWcgKyAiXFxccyooLFxcXHMqfCQpIik7DQoJCQl2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsNCgkJCXZhciBjdXJ2YWwgPSB0ZXh0YXJlYS52YWx1ZS5yZXBsYWNlKC8sP1xzKyQvLCAnJyk7DQoJCQlpZiAoJycgPT0gY3VydmFsKSB7DQoJCQkJdGV4dGFyZWEudmFsdWUgPSB0YWdOYW1lOw0KCQkJfSBlbHNlIGlmIChjdXJ2YWwubWF0Y2godGFnUmVnZXgpKSB7DQoJCQkJdGV4dGFyZWEudmFsdWUgPSBjdXJ2YWwucmVwbGFjZSh0YWdSZWdleCwgJyQxJykucmVwbGFjZSgvLD9ccyskLywgJycpOw0KCQkJCXJldHVybiAnJzsNCgkJCX0gZWxzZSBpZiAoJywnID09IGN1cnZhbC5jaGFyQXQoY3VydmFsLmxlbmd0aCAtIDEpKSB7DQoJCQkJdGV4dGFyZWEudmFsdWUgKz0gJyAnICsgdGFnTmFtZTsNCgkJCX0gZWxzZSB7DQoJCQkJdGV4dGFyZWEudmFsdWUgKz0gJywgJyArIHRhZ05hbWU7DQoJCQl9DQoJCQlyZXR1cm4gJ3RhZ19jaG9zZW4nOw0KCQl9DQpFT0Y7DQoNCgllY2hvIHNjcmlwdF9qcygkanMpOw0KfQ0KDQoNCiMjIyBBVE9NL1JTUyBGRUVEIEZVTkNUSU9OUyAjIyMNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KcmVnaXN0ZXJfY2FsbGJhY2soJ3RydV90YWdzX2F0b21faGFuZGxlcicsICdhdG9tX2VudHJ5Jyk7DQpmdW5jdGlvbiB0cnVfdGFnc19hdG9tX2hhbmRsZXIoJGV2ZW50LCAkc3RlcCkgeyByZXR1cm4gdHJ1X3RhZ3NfZmVlZF9oYW5kbGVyKHRydWUpOyB9DQpyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfcnNzX2hhbmRsZXInLCAncnNzX2VudHJ5Jyk7DQpmdW5jdGlvbiB0cnVfdGFnc19yc3NfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7IHJldHVybiB0cnVfdGFnc19mZWVkX2hhbmRsZXIoZmFsc2UpOyB9DQoNCmZ1bmN0aW9uIHRydV90YWdzX2ZlZWRfaGFuZGxlcigkYXRvbSkgew0KCWdsb2JhbCAkdGhpc2FydGljbGUsICR0cnVfdGFnc19wcmVmczsNCglleHRyYWN0KCR0aGlzYXJ0aWNsZSk7DQoNCgkkdGFncyA9IHRydV90YWdzX2dldF90YWdzX2Zvcl9hcnRpY2xlKCR0aGlzaWQpOw0KDQoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0tPnZhbHVlKSB7DQoJCSRleHRyYWJvZHkgPSAnJzsNCgkJJEZPUk1fTkFNRSA9ICd0cnVfdGFnc19mZWVkX3RhZ3MnOw0KCQlpZiAoZmV0Y2goJ2Zvcm0nLCAndHhwX2Zvcm0nLCAnbmFtZScsICRGT1JNX05BTUUpKSB7DQoJCQkkZm9ybSA9IGZldGNoX2Zvcm0oJEZPUk1fTkFNRSk7DQoJCQkkZXh0cmFib2R5ID0gdHJpbShwYXJzZSgkZm9ybSkpOw0KCQl9IGVsc2Ugew0KCQkJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgdHJ1ZSk7DQoJCQkkZXh0cmFib2R5ID0gJzxwPnRhZ3M6ICcgLiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICR0YWdzLCAkdGFncykgLiAnPC9wPic7DQoJCX0NCgkJZ2xvYmFsICR0aGlzYXJ0aWNsZTsNCgkJaWYgKHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pKSB7DQoJCQkkdGhpc2FydGljbGVbJ2V4Y2VycHQnXSA9IHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pLm4uJGV4dHJhYm9keS5uOw0KCQl9DQoJCSR0aGlzYXJ0aWNsZVsnYm9keSddID0gdHJpbSgkdGhpc2FydGljbGVbJ2JvZHknXSkubi4kZXh0cmFib2R5Lm47DQoJfQ0KDQoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklFU10tPnZhbHVlKSB7DQoJCSRvdXRwdXQgPSBhcnJheSgpOw0KCQlmb3JlYWNoICgkdGFncyBhcyAkdGFnKSB7DQoJCQlpZiAoJGF0b20pIHsNCgkJCQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5IHRlcm09IicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJyIgLz4nOw0KCQkJfSBlbHNlIHsNCgkJCQkkb3V0cHV0W10gPSAnPGNhdGVnb3J5PicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvY2F0ZWdvcnk+JzsNCgkJCX0NCgkJfQ0KCQlyZXR1cm4gbi5qb2luKG4sICRvdXRwdXQpLm47DQoJfQ0KfQ0KDQoNCiMjIyBQUkVGUyBGVU5DVElPTlMgLyBDTEFTU0VTICMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmNsYXNzIHRydV90YWdzX3ByZWYgew0KCWZ1bmN0aW9uIHRydV90YWdzX3ByZWYoJG5hbWUsICRkZWZhdWx0X3ZhbHVlLCAkdHlwZSkgew0KCQkkdGhpcy0+bmFtZSA9ICRuYW1lOw0KCQkkdGhpcy0+dmFsdWUgPSAkZGVmYXVsdF92YWx1ZTsNCgkJJHRoaXMtPmRlZmF1bHRfdmFsdWUgPSAkZGVmYXVsdF92YWx1ZTsNCgkJJHRoaXMtPnR5cGUgPSAkdHlwZTsNCgl9DQoNCglmdW5jdGlvbiB2YWxpZGF0ZV92YWx1ZSgkdmFsdWUpIHsNCgkJaWYgKCR2YWx1ZSkgew0KCQkJcmV0dXJuICR2YWx1ZTsNCgkJfSBlbHNlIGlmICgkdGhpcy0+dHlwZSA9PSAnYm9vbGVhbicpIHsNCgkJCXJldHVybiAnMCc7DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gJ1BsZWFzZSBlbnRlciBhIHZhbHVlIGZvciAnIC4gJHRoaXMtPm5hbWU7DQoJCX0NCgl9DQp9DQoNCmZ1bmN0aW9uIHRydV90YWdzX2xvYWRfcHJlZnMoKSB7DQoJJHByZWZzID0gYXJyYXkoKTsNCg0KCWdsb2JhbCAkcGVybWxpbmtfbW9kZTsNCgkkcHJlZnNbQ0xFQU5fVVJMU10gPSBuZXcgdHJ1X3RhZ3NfcHJlZihDTEVBTl9VUkxTLCAoJHBlcm1saW5rX21vZGUgIT0gJ21lc3N5JyA/ICdjbGVhbicgOiAnbWVzc3knKSwgJ3N0cmluZycpOw0KCSRwcmVmc1tUQUdfU0VDVElPTl0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdfU0VDVElPTiwgJ3RhZycsICdzdHJpbmcnKTsNCgkkcHJlZnNbUEFSTV9OQU1FXSA9IG5ldyB0cnVfdGFnc19wcmVmKFBBUk1fTkFNRSwgJ3QnLCAnc3RyaW5nJyk7DQoJJHByZWZzW1RBR1NfSU5fRkVFRF9DQVRFR09SSUVTXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fRkVFRF9DQVRFR09SSUVTLCAnMScsICdib29sZWFuJyk7DQoJJHByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fRkVFRF9CT0RZLCAnMCcsICdib29sZWFuJyk7DQoJJHByZWZzW1RBR1NfSU5fV1JJVEVfVEFCXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5fV1JJVEVfVEFCLCAnMScsICdib29sZWFuJyk7DQoNCglpZiAobXlzcWxfcXVlcnkoImRlc2NyaWJlICIgLiBQRlggLiAidHJ1X3RhZ3NfcHJlZnMiKSkgew0KCQkkcnMgPSBzYWZlX3Jvd3MoJyonLCAndHJ1X3RhZ3NfcHJlZnMnLCAnMScpOw0KCQlmb3JlYWNoICgkcnMgYXMgJHJvdykgew0KCQkJJHByZWZzWyRyb3dbJ25hbWUnXV0tPnZhbHVlID0gJHJvd1sndmFsdWUnXTsNCgkJfQ0KCX0NCg0KCXJldHVybiAkcHJlZnM7DQp9DQoNCg0KIyMjIE9USEVSIFNVUFBPUlQgRlVOQ1RJT05TICMjIw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpmdW5jdGlvbiB0cnVfdGFnc19yZWRpcmVjdF9pZl9uZWVkZWQoJHRhZ19wYXJhbWV0ZXIpIHsNCgkkcmVkaXJlY3RzID0gdHJ1X3RhZ3NfbG9hZF9yZWRpcmVjdHMoKTsNCglmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0dGFnID0+ICRyaWdodHRhZykgew0KCQlpZiAoJGxlZnR0YWcgPT0gJHRhZ19wYXJhbWV0ZXIgfHwgJGxlZnR0YWcgPT0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKSkgew0KCQkJdHJ1X3RhZ3NfcmVkaXJlY3QoJHJpZ2h0dGFnLCBmYWxzZSk7DQoJCQlyZXR1cm4gdHJ1ZTsNCgkJfQ0KCX0NCg0KCXJldHVybiBmYWxzZTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19sb2FkX3JlZGlyZWN0cygpIHsNCgkkcmVkaXJlY3RzID0gYXJyYXkoKTsNCglpZiAobXlzcWxfcXVlcnkoImRlc2NyaWJlICIgLiBQRlggLiAidHJ1X3RhZ3NfcmVkaXJlY3RzIikpIHsNCgkJJHJzID0gc2FmZV9yb3dzKCcqJywgJ3RydV90YWdzX3JlZGlyZWN0cycsICcxIG9yZGVyIGJ5IGxlZnR0YWcnKTsNCgkJZm9yZWFjaCAoJHJzIGFzICRyb3cpIHsNCgkJCSRyZWRpcmVjdHNbJHJvd1snbGVmdHRhZyddXSA9ICRyb3dbJ3JpZ2h0dGFnJ107DQoJCX0NCgl9DQoJcmV0dXJuICRyZWRpcmVjdHM7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfcmVkaXJlY3QoJGRlc3RpbmF0aW9uLCAkaXNfZnVsbF91cmwpIHsNCglnbG9iYWwgJHRydV90YWdzX3ByZWZzOw0KCWlmICgkaXNfZnVsbF91cmwpIHsNCgkJJHVybCA9ICRkZXN0aW5hdGlvbjsNCgkJJG1lc3NhZ2UgPSAnVGhlIHJlc291cmNlIHlvdSByZXF1ZXN0ZWQgaGFzIG1vdmVkIHRvICcgLiAkZGVzdGluYXRpb247DQoJfSBlbHNlIHsNCgkJJHVybCA9IHRydV90YWdzX2xpbmtpZnlfdGFnKCRkZXN0aW5hdGlvbik7DQoJCSRtZXNzYWdlID0gJ1RoZSByZXF1ZXN0ZWQgdGFnIGhhcyBiZWVuIHJlcGxhY2VkIGJ5ICcgLiAkZGVzdGluYXRpb247DQoJfQ0KDQoJaGVhZGVyKCdMb2NhdGlvbjogJyAuICR1cmwpOw0KCXR4cF9kaWUoJG1lc3NhZ2UsICczMDEnKTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19saW5raWZ5X3RhZygkdGFnKSB7DQoJZ2xvYmFsICR0cnVfdGFnc19wcmVmczsNCglpZiAoJHRydV90YWdzX3ByZWZzW0NMRUFOX1VSTFNdLT52YWx1ZSkgew0KCQkkdXJscHJlZml4ID0gaHUgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsNCgl9IGVsc2Ugew0KCQkkdXJscHJlZml4ID0gaHUgLiAnP3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJyZhbXA7dD0nOw0KCX0NCgkkdXJsc3VmZml4ID0gKCR0cnVfdGFnc19wcmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUgPyAnLycgOiAnJyk7DQoJcmV0dXJuICR1cmxwcmVmaXggLiB1cmxlbmNvZGUoc3RyX3JlcGxhY2UoJyAnLCAnLScsICR0YWcpKSAuICR1cmxzdWZmaXg7DQp9DQoNCg0KZnVuY3Rpb24gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGljbGUoJGFydGljbGVJRCkgew0KCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7DQoJJHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJGFydGljbGVJRCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7DQoJJGFsbF90YWdzID0gYXJyYXkoKTsNCglpZiAoYXJyYXlfa2V5X2V4aXN0cygkdGFnc19maWVsZCwgJHJzKSkgew0KCQkkYWxsX3RhZ3MgPSBleHBsb2RlKCIsIiwgdHJpbSh0cnVfdGFnc19zdHJ0b2xvd2VyKCRyc1skdGFnc19maWVsZF0pKSk7DQoJfQ0KDQoJcmV0dXJuIHRydV90YWdzX3RyaW1fdGFncygkYWxsX3RhZ3MpOw0KfQ0KDQoNCiMgZml4ZXMgYnVnIHdpdGggNC4wLjQncyB2ZXJzaW9uIG9mIGRvV3JhcCB0aGF0IGNhdXNlZCBzcGFjZXMgdG8gc2hvdyB1cCBiZWZvcmUgdGhlIGNvbW1hcw0KZnVuY3Rpb24gdHJ1X3RhZ3NfZG9fd3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcykgew0KCWlmICghJHdyYXB0YWcgJiYgIXByZWdfbWF0Y2goJy9eXHcrJC8nLCAkYnJlYWspKSB7DQoJCXJldHVybiBqb2luKCRicmVhay5uLCAkbGlzdCk7DQoJfSBlbHNlIHsNCgkJcmV0dXJuIGRvV3JhcCgkbGlzdCwgJHdyYXB0YWcsICRicmVhaywgJGNsYXNzLCAkYnJlYWtjbGFzcyk7DQoJfQ0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3RyaW1fdGFncygkdGFnX2FycmF5KSB7DQoJJHRyaW1tZWQgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0YWdfYXJyYXkgYXMgJHRhZykgew0KCQlpZiAoIiIgIT0gdHJpbSgkdGFnKSkgew0KCQkJJHRyaW1tZWRbXSA9IHRyaW0oJHRhZyk7DQoJCX0NCgl9DQoJcmV0dXJuICR0cmltbWVkOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1ldGVyKSB7DQoJJGtleXdvcmRzID0gZXhwbG9kZSgnLCcsICR0YWdfcGFyYW1ldGVyKTsNCglmb3JlYWNoICgka2V5d29yZHMgYXMgJGtleXdvcmQpIHsNCgkJaWYgKHN0cnBvcygka2V5d29yZCwgJy0nKSAhPT0gZmFsc2UpIHsNCgkJCSRrZXl3b3Jkc1tdID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICRrZXl3b3JkKTsNCgkJfQ0KCX0NCgkkYXR0c1sna2V5d29yZHMnXSA9IGltcGxvZGUoJywnLCAka2V5d29yZHMpOw0KDQoJaWYgKGlzc2V0KCRhdHRzWydzZWN0aW9uJ10pICYmIHN0cnBvcygkYXR0c1snc2VjdGlvbiddLCAnLCcpICE9PSBmYWxzZSkgew0KCQkkYXR0c1snc2VjdGlvbiddID0gJyc7DQoJfQ0KDQoJaWYgKGlzc2V0KCRhdHRzWydleGNsdWRlc2VjdGlvbiddKSkgew0KCQl1bnNldCgkYXR0c1snZXhjbHVkZXNlY3Rpb24nXSk7DQoJfQ0KDQoJaWYgKGlzc2V0KCRhdHRzWydub2FydGljbGVzJ10pKSB7DQoJCXVuc2V0KCRhdHRzWydub2FydGljbGVzJ10pOw0KCX0NCg0KCWlmICghaXNzZXQoJGF0dHNbJ2xpbWl0J10pKSB7DQoJCSRhdHRzWydsaW1pdCddID0gJzEwMDAnOw0KCX0NCg0KCWlmICghaXNzZXQoJGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSkpIHsNCgkJJGF0dHNbJ2FsbG93b3ZlcnJpZGUnXSA9IHRydWU7DQoJfQ0KDQoJcmV0dXJuICRhdHRzOw0KfQ0KDQoNCmZ1bmN0aW9uIHRydV90YWdzX3N0cnRvbG93ZXIoJHN0cikgew0KCWlmIChmdW5jdGlvbl9leGlzdHMoIm1iX3N0cnRvbG93ZXIiKSkgew0KCQlyZXR1cm4gbWJfc3RydG9sb3dlcigkc3RyLCAiVVRGLTgiKTsNCgl9IGVsc2Ugew0KCQlyZXR1cm4gc3RydG9sb3dlcigkc3RyKTsNCgl9DQp9DQoNCg0KLy90aGVzZSBuZXh0IHR3byBmdW5jdGlvbnMgYXJlIGdyb3NzLCBidXQgSSBjYW4ndCBmaWd1cmUgb3V0IGFub3RoZXIgd2F5IHRvIGRvIGl0DQpmdW5jdGlvbiB0cnVfdGFnc19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCAkc29ydF9ieV9jb3VudCwgJHNvcnRfYXNjZW5kaW5nKSB7DQoJZ2xvYmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYnlfY291bnQsICR0cnVfdGFnc19zb3J0X2FzY2VuZGluZzsNCg0KCSR0cnVfdGFnc190YWdzX3dlaWdodCA9ICR0YWdzX3dlaWdodDsNCgkkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCA9ICRzb3J0X2J5X2NvdW50Ow0KCSR0cnVfdGFnc19zb3J0X2FzY2VuZGluZyA9ICRzb3J0X2FzY2VuZGluZzsNCg0KCSR0ZW1wX2FycmF5ID0gYXJyYXlfa2V5cygkdGFnc193ZWlnaHQpOw0KCXVzb3J0KCR0ZW1wX2FycmF5LCAidHJ1X3RhZ3Nfc29ydF90YWdzX2NvbXBhcmF0b3IiKTsNCg0KCSRzb3J0ZWRfYXJyYXkgPSBhcnJheSgpOw0KCWZvcmVhY2ggKCR0ZW1wX2FycmF5IGFzICR0YWcpIHsNCgkJJHNvcnRlZF9hcnJheVskdGFnXSA9ICR0YWdzX3dlaWdodFskdGFnXTsNCgl9DQoNCglyZXR1cm4gJHNvcnRlZF9hcnJheTsNCn0NCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19zb3J0X3RhZ3NfY29tcGFyYXRvcigkbGVmdCwgJHJpZ2h0KSB7DQoJZ2xvYmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRydV90YWdzX3NvcnRfYnlfY291bnQsICR0cnVfdGFnc19zb3J0X2FzY2VuZGluZzsNCg0KCWlmICgkdHJ1X3RhZ3Nfc29ydF9ieV9jb3VudCkgew0KCQkkbGVmdF93ZWlnaHQgPSAkdHJ1X3RhZ3NfdGFnc193ZWlnaHRbJGxlZnRdOw0KCQkkcmlnaHRfd2VpZ2h0ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0WyRyaWdodF07DQoJCWlmICgkbGVmdF93ZWlnaHQgPT0gJHJpZ2h0X3dlaWdodCkgew0KCQkJcmV0dXJuIHN0cm5hdGNhc2VjbXAoJGxlZnQsICRyaWdodCk7DQoJCX0gZWxzZSBpZiAoJHRydV90YWdzX3NvcnRfYXNjZW5kaW5nKSB7DQoJCQlyZXR1cm4gJGxlZnRfd2VpZ2h0IC0gJHJpZ2h0X3dlaWdodDsNCgkJfSBlbHNlIHsNCgkJCXJldHVybiAkcmlnaHRfd2VpZ2h0IC0gJGxlZnRfd2VpZ2h0Ow0KCQl9DQoJfSBlbHNlIHsNCgkJcmV0dXJuIHN0cm5hdGNhc2VjbXAoJGxlZnQsICRyaWdodCk7DQoJfQ0KfQ0KDQoNCg0KIyMjIEJBU1RBUkQgRlVOQ1RJT05TIFRIQVQgU0hPVUxETidUIEhBVkUgVE8gRVhJU1QgIyMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KDQpmdW5jdGlvbiB0cnVfdGFnc19yZWRvX2FydGljbGVfc2VhcmNoKCRhdHRzKSB7DQoJJHRoZUF0dHMgPSBsQXR0cyhhcnJheSgnbGltaXQnICAgICA9PiAxMDAwLA0KCQkJCSdjYXRlZ29yeScgID0+ICcnLA0KCQkJCSdzZWN0aW9uJyAgID0+ICcnLA0KCQkJCSdleGNlcnB0ZWQnID0+ICcnLA0KCQkJCSdhdXRob3InICAgID0+ICcnLA0KCQkJCSdzb3J0YnknICAgID0+ICdQb3N0ZWQnLA0KCQkJCSdzb3J0ZGlyJyAgID0+ICdkZXNjJywNCgkJCQknbW9udGgnICAgICA9PiAnJywNCgkJCQkna2V5d29yZHMnICA9PiAnJywNCgkJCQknZnJvbnRwYWdlJyA9PiAnJywNCgkJCQknaWQnICAgICAgICA9PiAnJywNCgkJCQkndGltZScgICAgICA9PiAncGFzdCcsDQoJCQkJJ3N0YXR1cycgICAgPT4gJzQnLA0KCQkJCSdvZmZzZXQnICAgID0+IDANCgkJCSksJGF0dHMsIDApOw0KCWV4dHJhY3QoJHRoZUF0dHMpOw0KDQoJLy9CdWlsZGluZyBxdWVyeSBwYXJ0cw0KCSRmcm9udHBhZ2UgPSAoJGZyb250cGFnZSkgPyBmaWx0ZXJGcm9udFBhZ2UoKSA6ICcnOw0KCSRjYXRlZ29yeSAgPSAoISRjYXRlZ29yeSkgID8gJycgOiAiIGFuZCAoKENhdGVnb3J5MT0nIi5kb3NsYXNoKCRjYXRlZ29yeSkuIicpIG9yIChDYXRlZ29yeTI9JyIuZG9TbGFzaCgkY2F0ZWdvcnkpLiInKSkgIjsNCgkkc2VjdGlvbiAgID0gKCEkc2VjdGlvbikgICA/ICcnIDogIiBhbmQgU2VjdGlvbiA9ICciLmRvc2xhc2goJHNlY3Rpb24pLiInIjsNCgkkZXhjZXJwdGVkID0gKCRleGNlcnB0ZWQ9PSd5JykgID8gIiBhbmQgRXhjZXJwdCAhPScnIiA6ICcnOw0KCSRhdXRob3IgICAgPSAoISRhdXRob3IpICAgID8gJycgOiAiIGFuZCBBdXRob3JJRCA9ICciLmRvc2xhc2goJGF1dGhvcikuIiciOw0KCSRtb250aCAgICAgPSAoISRtb250aCkgICAgID8gJycgOiAiIGFuZCBQb3N0ZWQgbGlrZSAnIi5kb1NsYXNoKCRtb250aCkuIiUnIjsNCgkkaWQgICAgICAgID0gKCEkaWQpICAgICAgICA/ICcnIDogIiBhbmQgSUQgPSAnIi5pbnR2YWwoJGlkKS4iJyI7DQoJc3dpdGNoICgkdGltZSkgew0KCQljYXNlICdhbnknOg0KCQkJJHRpbWUgPSAiIjsgYnJlYWs7DQoJCWNhc2UgJ2Z1dHVyZSc6DQoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA+IG5vdygpIjsgYnJlYWs7DQoJCWRlZmF1bHQ6DQoJCQkkdGltZSA9ICIgYW5kIFBvc3RlZCA8IG5vdygpIjsNCgl9DQoJaWYgKCFpc19udW1lcmljKCRzdGF0dXMpKQ0KCQkkc3RhdHVzID0gZ2V0U3RhdHVzTnVtKCRzdGF0dXMpOw0KDQoJJGN1c3RvbSA9ICcnOw0KCS8vIHRyeWluZyBjdXN0b20gZmllbGRzIGhlcmUNCgkkY3VzdG9tRmllbGRzID0gZ2V0Q3VzdG9tRmllbGRzKCk7DQoJaWYgKCRjdXN0b21GaWVsZHMpIHsNCgkJZm9yZWFjaCgkY3VzdG9tRmllbGRzIGFzICRjRmllbGQpIHsNCgkJCWlmIChpc3NldCgkYXR0c1skY0ZpZWxkXSkpDQoJCQkJJGN1c3RvbVBhaXJzWyRjRmllbGRdID0gJGF0dHNbJGNGaWVsZF07DQoJCX0NCgkJaWYoIWVtcHR5KCRjdXN0b21QYWlycykpDQoJCQkkY3VzdG9tID0gIGJ1aWxkQ3VzdG9tU3FsKCRjdXN0b21GaWVsZHMsJGN1c3RvbVBhaXJzKTsNCgkJZWxzZQ0KCQkJJGN1c3RvbSA9ICcnOw0KCX0NCg0KCS8vQWxsb3cga2V5d29yZHMgZm9yIG5vLWN1c3RvbSBhcnRpY2xlcy4gVGhhdCB0YWdnaW5nIG1vZGUsIHlvdSBrbm93DQoJaWYgKCRrZXl3b3Jkcykgew0KCQkka2V5cyA9IGRvU2xhc2goYXJyYXlfbWFwKCd0cmltJywgc3BsaXQoJywnLCAka2V5d29yZHMpKSk7DQoJCWZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsNCgkJCSRrZXlwYXJ0c1tdID0gIkZJTkRfSU5fU0VUKCciLiRrZXkuIicsS2V5d29yZHMpIjsNCgkJfQ0KCQkka2V5d29yZHMgPSAiIGFuZCAoIiAuIGpvaW4oJyBvciAnLCRrZXlwYXJ0cykgLiAiKSI7DQoJfQ0KDQoJaWYgKCRpZCkNCgkJJHN0YXR1c3EgPSAiIGFuZCBTdGF0dXMgPj0gJzQnIjsNCgllbHNlDQoJCSRzdGF0dXNxID0gIiBhbmQgU3RhdHVzPSciLmRvU2xhc2goJHN0YXR1cykuIiciOw0KDQoJJHdoZXJlID0gIjEiIC4gJHN0YXR1c3EuICR0aW1lLg0KCQkkaWQgLiAkY2F0ZWdvcnkgLiAkc2VjdGlvbiAuICRleGNlcnB0ZWQgLiAkbW9udGggLiAkYXV0aG9yIC4gJGtleXdvcmRzIC4gJGN1c3RvbSAuICRmcm9udHBhZ2U7DQoNCgkJJHBnb2Zmc2V0ID0gJG9mZnNldCAuICcsICc7DQoNCgkkcnMgPSBzYWZlX3Jvd3Nfc3RhcnQoIiosIHVuaXhfdGltZXN0YW1wKFBvc3RlZCkgYXMgdVBvc3RlZCIsICd0ZXh0cGF0dGVybicsDQoJCSR3aGVyZS4gJyBvcmRlciBieSAnIC4gZG9zbGFzaCgkc29ydGJ5KSAuICcgJyAuIGRvU2xhc2goJHNvcnRkaXIpIC4gJyBsaW1pdCAnIC4gZG9TbGFzaCgkbGltaXQpKTsNCg0KCXJldHVybiAkcnM7DQp9DQoNCg0KIjtzOjQ6InR5cGUiO3M6MToiMSI7czozOiJtZDUiO3M6MzI6IjFmOGUwNzdmYjYyZWM1YTNiNDExN2NiYWFhYTMyNzE4Ijt9

Cheers!

Last edited by Gocom (2007-11-16 10:59:21)

Offline

#322 2007-11-16 11:27:04

iboi
New Member
Registered: 2007-11-16
Posts: 2

Re: tru_tags: A tagging plugin for textpattern

Gocom wrote:

iboi, here is the plugin code. Well it’s a little modified version, but it works completely same way. Only comments are removed from the plugin’s php-code :)

Thank you very much! Still waiting for the domain to resolve since the intructions are also available there.

Offline

#323 2007-11-16 11:58:50

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

Re: tru_tags: A tagging plugin for textpattern

Sorry, folks. The server is down, but it should be back up later this morning. Thanks for posting the code, Gocom.

Offline

#324 2007-11-20 20:56:13

andreas
Member
Registered: 2004-02-28
Posts: 453
Website

Re: tru_tags: A tagging plugin for textpattern

Sorry, for some reason the e-Mail notification of this thread didn’t work so I only noticed your post just now.

truist wrote:

Is there any chance that you have custom rewrite rules in your .htaccess file?

No – none that would interact with the “stichwort” section.

If that’s not it, the only thing I can think to try is to start putting debugging messages into tru_tags to see what it’s really doing. To do that, I’d need access to your site. If you’re willing to do that, please send credentials to truist-20071111@truist.com.

Send you account info. Thanks for taking the time to look into it.

Offline

Board footer

Powered by FluxBB