Textpattern CMS support forum
You are not logged in. Register | Login | Help
- Topics: Active | Unanswered
#313 2007-11-11 14:34:17
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
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
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
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
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
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
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
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
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
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