# Name: kuo_admin_chat v0.1 # Type: Admin plugin # A minimalistic chat in Textpattern's admin-side. # Author: Petri Ikonen # URL: https://www.paypal.me/kuopassa # Recommended load order: 5 # ..................................................................... # This is a plugin for Textpattern CMS - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjE0OiJrdW9fYWRtaW5fY2hhdCI7czo2OiJhdXRob3IiO3M6 MTI6IlBldHJpIElrb25lbiI7czoxMDoiYXV0aG9yX3VyaSI7czozMDoiaHR0cHM6Ly93d3cu cGF5cGFsLm1lL2t1b3Bhc3NhIjtzOjc6InZlcnNpb24iO3M6MzoiMC4xIjtzOjExOiJkZXNj cmlwdGlvbiI7czo0ODoiQSBtaW5pbWFsaXN0aWMgY2hhdCBpbiBUZXh0cGF0dGVybidzIGFk bWluLXNpZGUuIjtzOjQ6ImNvZGUiO3M6MTAyMjU6ImlmIChzdHJjbXAodHhwaW50ZXJmYWNl LCdhZG1pbicpID09IDApIHsNCgkNCglhZGRfcHJpdnMoDQoJCSdrdW9fYWRtaW5fY2hhdCcs DQoJCScxLDIsMyw0LDUsNicNCgkpOw0KDQoJcmVnaXN0ZXJfdGFiKA0KCQknYWRtaW4nLA0K CQkna3VvX2FkbWluX2NoYXQnLA0KCQknQ2hhdCcNCgkpOw0KCQ0KCXJlZ2lzdGVyX2NhbGxi YWNrKA0KCQkna3VvX2FkbWluX2NoYXRfdGFiJywNCgkJJ2t1b19hZG1pbl9jaGF0Jw0KCSk7 DQoJDQoJcmVnaXN0ZXJfY2FsbGJhY2soDQoJCSdrdW9fYWRtaW5fY2hhdF9jc3MnLA0KCQkn YWRtaW5fc2lkZScsDQoJCSdoZWFkX2VuZCcNCgkpOw0KDQoJcmVnaXN0ZXJfY2FsbGJhY2so DQoJCSdrdW9fYWRtaW5fY2hhdF9lbmFibGVkJywNCgkJJ3BsdWdpbl9saWZlY3ljbGUua3Vv X2FkbWluX2NoYXQnLA0KCQknZW5hYmxlZCcNCgkpOw0KCQ0KCXJlZ2lzdGVyX2NhbGxiYWNr KA0KCQkna3VvX2FkbWluX2NoYXRfZGVsZXRlZCcsDQoJCSdwbHVnaW5fbGlmZWN5Y2xlLmt1 b19hZG1pbl9jaGF0JywNCgkJJ2RlbGV0ZWQnDQoJKTsNCn0NCg0KZnVuY3Rpb24ga3VvX2Fk bWluX2NoYXRfZW5hYmxlZCgpIHsNCgkNCgkkbWVzc2FnZXNfdGFibGUgPSBzYWZlX2NyZWF0 ZSgNCgkJJ2t1b19hZG1pbl9jaGF0JywNCgkJJw0KCQkJYHJvd2AgaW50KDEwKSBVTlNJR05F RCBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwNCgkJCWBuYW1lYCB2YXJjaGFyKDY0KSBOT1Qg TlVMTCwNCgkJCWBjcmVhdGVkYCB0aW1lc3RhbXAgTk9UIE5VTEwgREVGQVVMVCBjdXJyZW50 X3RpbWVzdGFtcCgpLA0KCQkJYG1vZGlmaWVkYCB0aW1lc3RhbXAgTk9UIE5VTEwgREVGQVVM VCBjdXJyZW50X3RpbWVzdGFtcCgpLA0KCQkJYHN0YXR1c2AgdGlueWludCgxKSBVTlNJR05F RCBOT1QgTlVMTCBERUZBVUxUIDEsDQoJCQlgbWVzc2FnZWAgdGV4dCBOT1QgTlVMTCwNCgkJ CVBSSU1BUlkgS0VZIChgcm93YCkNCgkJJywNCgkJJycsDQoJCTANCgkpOw0KCQ0KCSRzZXR0 aW5nc190YWJsZSA9IHNhZmVfY3JlYXRlKA0KCQkna3VvX2FkbWluX2NoYXRfcHJlZnMnLA0K CQknDQoJCQlgbmFtZWAgdmFyY2hhcig2NCkgTk9UIE5VTEwsDQoJCQlgbWVzc2FnZV9saW1p dGAgdGlueWludCgyNSkgVU5TSUdORUQgTk9UIE5VTEwsDQoJCQlQUklNQVJZIEtFWSAoYG5h bWVgKQ0KCQknLA0KCQknJywNCgkJMA0KCSk7DQoJDQoJaWYgKCgkbWVzc2FnZXNfdGFibGUp ICYmICgkc2V0dGluZ3NfdGFibGUpKSB7DQoJCXJldHVybiB0cnVlOw0KCX0NCgllbHNlIHsN CgkJcmV0dXJuIGZhbHNlOw0KCX0NCn0NCg0KZnVuY3Rpb24ga3VvX2FkbWluX2NoYXRfZGVs ZXRlZCgpIHsNCgkNCglpZiAoKHNhZmVfZHJvcCgna3VvX2FkbWluX2NoYXQnKSkgJiYgKHNh ZmVfZHJvcCgna3VvX2FkbWluX2NoYXRfcHJlZnMnKSkpIHsNCgkJcmV0dXJuIHRydWU7DQoJ fQ0KCWVsc2Ugew0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KfQ0KDQpmdW5jdGlvbiBrdW9fYWRt aW5fY2hhdF90YWIoJGV2ZW50LCRzdGVwKSB7DQoJDQoJZ2xvYmFsICR0eHBfdXNlcjsNCgkN CgkjIEJFR0lOUzogJF9QT1NUDQoJaWYgKChpc3NldCgkX1BPU1QpKSAmJiAoIWVtcHR5KCRf UE9TVCkpKSB7DQoJCQ0KCQkjIEJFR0lOUzogU0FWRSBORVcgTUVTU0FHRQ0KCQlpZiAoDQoJ CQkoaXNzZXQoJF9QT1NUWydtZXNzYWdlJ10pKQ0KCQkJJiYNCgkJCShzdHJsZW4oJF9QT1NU WydtZXNzYWdlJ10pID49IDEpDQoJCQkmJg0KCQkJKHN0cmxlbigkX1BPU1RbJ21lc3NhZ2Un XSkgPD0gMTAwMDApDQoJCSkgew0KCQkJDQoJCQlrdW9fYWRtaW5fY2hhdF9zYXZlX21lc3Nh Z2UoDQoJCQkJJHR4cF91c2VyLA0KCQkJCSRfUE9TVFsnbWVzc2FnZSddDQoJCQkpOw0KCQl9 DQoJCSMgRU5EUzogU0FWRSBORVcgTUVTU0FHRQ0KCQkNCgkJaGVhZGVyKCdMb2NhdGlvbjog aW5kZXgucGhwP2V2ZW50PScuJGV2ZW50KTsNCgkJZGllOw0KCX0NCgkjIEVORFM6ICRfUE9T VA0KCQ0KCSMgQkVHSU5TOiBTUEVDSUFMICRfR0VUDQoJaWYgKChpc3NldCgkX0dFVFsnc2hv dyddKSkgfHwgKGlzc2V0KCRfR0VUWydkZWxldGUnXSkpKSB7DQoJCQ0KCQlpZiAoDQoJCQko aXNzZXQoJF9HRVRbJ3Nob3cnXSkpDQoJCQkmJg0KCQkJKGluX2FycmF5KCRfR0VUWydzaG93 J10sYXJyYXkoMjUsNTAsMTAwKSkpDQoJCSkgew0KCQkJDQoJCQlrdW9fYWRtaW5fY2hhdF9z YXZlX3NldHRpbmdzKA0KCQkJCSR0eHBfdXNlciwNCgkJCQlhcnJheSgNCgkJCQkJJ21lc3Nh Z2VfbGltaXQnPT4kX0dFVFsnc2hvdyddLA0KCQkJCSkNCgkJCSk7DQoJCX0NCgkJZWxzZWlm ICgNCgkJCShpc3NldCgkX0dFVFsnZGVsZXRlJ10pKQ0KCQkJJiYNCgkJCShpc19udW1lcmlj KCRfR0VUWydkZWxldGUnXSkpDQoJCSkgew0KCQkJa3VvX2FkbWluX2NoYXRfZGVsZXRlX21l c3NhZ2UoDQoJCQkJJF9HRVRbJ2RlbGV0ZSddDQoJCQkpOw0KCQl9DQoJCQ0KCQloZWFkZXIo J0xvY2F0aW9uOiBpbmRleC5waHA/ZXZlbnQ9Jy4kZXZlbnQpOw0KCQlkaWU7DQoJfQ0KCSMg RU5EUzogU1BFQ0lBTCAkX0dFVA0KCQ0KCSRzZXR0aW5ncyA9IHNhZmVfcm93KA0KCQknbWVz c2FnZV9saW1pdCcsDQoJCSdrdW9fYWRtaW5fY2hhdF9wcmVmcycsDQoJCSdgbmFtZWAgPSAi Jy5zYWZlX2VzY2FwZSgkdHhwX3VzZXIpLiciJywNCgkJMA0KCSk7DQoJDQoJaWYgKChlbXB0 eSgkc2V0dGluZ3MpKSB8fCAoIWlzc2V0KCRzZXR0aW5nc1snbWVzc2FnZV9saW1pdCddKSkp IHsNCgkJDQoJCSRzZXR0aW5ncyA9IGFycmF5KA0KCQkJJ21lc3NhZ2VfbGltaXQnPT4yNQ0K CQkpOw0KCX0NCgkNCgkkbWVzc2FnZXMgPSBnZXRSb3dzKA0KCScNCglTRUxFQ1QNCgkJYHJv d2AsDQoJCWBuYW1lYCwNCgkJYGNyZWF0ZWRgLA0KCQlgbWVzc2FnZWANCglGUk9NDQoJCWAn LnNhZmVfcGZ4KCdrdW9fYWRtaW5fY2hhdCcpLidgDQoJV0hFUkUNCgkJYHN0YXR1c2AgPSAx DQoJT1JERVIgQlkNCgkJYGNyZWF0ZWRgIERFU0MNCglMSU1JVA0KCQkwLCAnLiRzZXR0aW5n c1snbWVzc2FnZV9saW1pdCddLA0KCQkwDQoJKTsNCgkNCglpZiAoJG1lc3NhZ2VzID09IGZh bHNlKSB7DQoJCSRjb250ZW50ID0gDQoJCQknPGRpdiBpZD0ia3VvX2FkbWluX2NoYXQiPicu DQoJCQkJa3VvX2FkbWluX2NoYXRfc2hvdygkbWVzc2FnZXMsJGV2ZW50LCR0eHBfdXNlciku DQoJCQkJa3VvX2FkbWluX2NoYXRfcG9zdCgkdHhwX3VzZXIpLg0KCQkJJzwvZGl2Pic7DQoJ fQ0KCWVsc2Ugew0KCQkkY29udGVudCA9IA0KCQkJJzxkaXYgaWQ9Imt1b19hZG1pbl9jaGF0 Ij4nLg0KCQkJCWt1b19hZG1pbl9jaGF0X3NldHRpbmdzX3Rvb2woJHNldHRpbmdzWydtZXNz YWdlX2xpbWl0J10sJGV2ZW50KS4NCgkJCQlrdW9fYWRtaW5fY2hhdF9zaG93KCRtZXNzYWdl cywkZXZlbnQsJHR4cF91c2VyKS4NCgkJCQlrdW9fYWRtaW5fY2hhdF9wb3N0KCR0eHBfdXNl cikuDQoJCQknPC9kaXY+Jy4NCgkJCWt1b19hZG1pbl9jaGF0X2pzKCk7DQoJfQ0KCQ0KCXBh Z2V0b3AoJ0NoYXQnKTsNCgkNCgllY2hvICRjb250ZW50Ow0KfQ0KDQpmdW5jdGlvbiBrdW9f YWRtaW5fY2hhdF9qcygpIHsNCg0KCXJldHVybiAnDQoJCTxzY3JpcHQ+DQoJCQljb25zdCBt ZXNzYWdlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJrdW9fYWRtaW5fY2hhdF9tZXNz YWdlcyIpOw0KCQkJDQoJCQlpZiAobWVzc2FnZXMpIHsNCgkJCQltZXNzYWdlcy5zY3JvbGxU b3AgPSBtZXNzYWdlcy5zY3JvbGxIZWlnaHQtbWVzc2FnZXMuY2xpZW50SGVpZ2h0Ow0KCQkJ fSANCgkJPC9zY3JpcHQ+DQoJJzsNCn0NCg0KZnVuY3Rpb24ga3VvX2FkbWluX2NoYXRfc2V0 dGluZ3NfdG9vbCgkc2VsZWN0ZWQgPSAyNSwkZXZlbnQpIHsNCgkNCgkkY3NzX2lkID0gJyBp ZD0ia3VvX2FkbWluX2NoYXRfc2VsZWN0ZWQiJzsNCgkNCglpZiAoJHNlbGVjdGVkID09IDI1 KSB7DQoJCQ0KCQkkc2VsZWN0ZWQgPSBhcnJheSgNCgkJCSRjc3NfaWQsDQoJCQludWxsLA0K CQkJbnVsbA0KCQkpOw0KCX0NCgllbHNlaWYgKCRzZWxlY3RlZCA9PSA1MCkgew0KCQkNCgkJ JHNlbGVjdGVkID0gYXJyYXkoDQoJCQludWxsLA0KCQkJJGNzc19pZCwNCgkJCW51bGwNCgkJ KTsNCgl9DQoJZWxzZSB7DQoJCQ0KCQkkc2VsZWN0ZWQgPSBhcnJheSgNCgkJCW51bGwsDQoJ CQludWxsLA0KCQkJJGNzc19pZA0KCQkpOw0KCX0NCgkNCgkkaHJlZiA9ICc/ZXZlbnQ9Jy4k ZXZlbnQuJyZhbXA7c2hvdz0nOw0KCQ0KCXJldHVybiAnDQoJCTxuYXY+DQoJCQk8cD48YSBo cmVmPSI/ZXZlbnQ9Jy4kZXZlbnQuJyI+UmVmcmVzaCAmIzg2MzU7PC9hPjwvcD4NCgkJCTxw PlNob3cgbWF4LiANCgkJCTxhIGhyZWY9IicuJGhyZWYuJzI1IicuJHNlbGVjdGVkWzBdLic+ MjU8L2E+LCANCgkJCTxhIGhyZWY9IicuJGhyZWYuJzUwIicuJHNlbGVjdGVkWzFdLic+NTA8 L2E+LCANCgkJCTxhIGhyZWY9IicuJGhyZWYuJzEwMCInLiRzZWxlY3RlZFsyXS4nPjEwMDwv YT4gDQoJCQltZXNzYWdlcy48L3A+DQoJCTwvbmF2Pg0KCSc7DQp9DQoNCmZ1bmN0aW9uIGt1 b19hZG1pbl9jaGF0X2NzcygpIHsNCgkNCgllY2hvICcNCgkJPHN0eWxlPg0KCQkJI2t1b19h ZG1pbl9jaGF0IHsNCgkJCQlmb250LXNpemU6IDEuMmVtOw0KCQkJfQ0KCQkJI2t1b19hZG1p bl9jaGF0IGxhYmVsLA0KCQkJI2t1b19hZG1pbl9jaGF0IGJ1dHRvbiB7DQoJCQkJY3Vyc29y OiBwb2ludGVyOw0KCQkJfQ0KCQkJI2t1b19hZG1pbl9jaGF0IGZvcm0gcCB7DQoJCQkJZGlz cGxheTogaW5saW5lLWJsb2NrOw0KCQkJCXZlcnRpY2FsLWFsaWduOiB0b3A7DQoJCQl9DQoJ CQkja3VvX2FkbWluX2NoYXQgcTpiZWZvcmUsDQoJCQkja3VvX2FkbWluX2NoYXQgcTphZnRl ciB7DQoJCQkJY29udGVudDogIiI7DQoJCQl9DQoJCQkja3VvX2FkbWluX2NoYXQgb2wgew0K CQkJCWxpc3Qtc3R5bGU6IG5vbmU7DQoJCQkJZGlzcGxheTogYmxvY2s7DQoJCQkJb3ZlcmZs b3c6IHNjcm9sbDsNCgkJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOw0KCQkJCXBhZGRpbmc6 IDA7DQoJCQkJbWFyZ2luOiAwIDAgMWVtIDA7DQoJCQkJYmFja2dyb3VuZDogI2ZmZjsNCgkJ CQltaW4taGVpZ2h0OiAxNTBweDsNCgkJCQltYXgtaGVpZ2h0OiAzNTBweDsNCgkJCX0NCgkJ CSNrdW9fYWRtaW5fY2hhdCBsaSB7DQoJCQkJZGlzcGxheTogYmxvY2s7DQoJCQkJY2xlYXI6 IGJvdGg7DQoJCQkJcGFkZGluZzogMC40ZW0gMC43ZW07DQoJCQkJb3ZlcmZsb3c6IGF1dG87 DQoJCQl9DQoJCQkja3VvX2FkbWluX2NoYXQgbGk6aG92ZXIgew0KCQkJCWJhY2tncm91bmQt Y29sb3I6ICNmMGYwZjA7DQoJCQl9DQoJCQkja3VvX2FkbWluX2NoYXQgc3BhbiB7DQoJCQkJ Y29sb3I6IGdyYXk7DQoJCQl9DQoJCQkja3VvX2FkbWluX2NoYXQgc3BhbjpiZWZvcmUgew0K CQkJCWNvbnRlbnQ6ICJbIjsNCgkJCX0NCgkJCSNrdW9fYWRtaW5fY2hhdCBzcGFuOmFmdGVy IHsNCgkJCQljb250ZW50OiAiXSI7DQoJCQl9DQoJCQkja3VvX2FkbWluX2NoYXQgc3Ryb25n IHsNCgkJCQlmb250LXdlaWdodDogNjAwOw0KCQkJCXBhZGRpbmc6IDAgMC41ZW07DQoJCQl9 DQoJCQkja3VvX2FkbWluX2NoYXRfc2VsZWN0ZWQgew0KCQkJCWZvbnQtd2VpZ2h0OiA4MDA7 DQoJCQl9DQoJCQkja3VvX2FkbWluX2NoYXQgbmF2IHAgew0KCQkJCWRpc3BsYXk6IGlubGlu ZS1ibG9jazsNCgkJCQl2ZXJ0aWNhbC1hbGlnbjogdG9wOw0KCQkJCWZvbnQtc2l6ZTogMS4y ZW07DQoJCQl9DQoJCQkja3VvX2FkbWluX2NoYXQgbmF2IHA6Zmlyc3Qtb2YtdHlwZSB7DQoJ CQkJbWFyZ2luLXJpZ2h0OiAxZW07DQoJCQl9DQoJCQkja3VvX2FkbWluX2NoYXQgaW5wdXQg ew0KCQkJCW1pbi13aWR0aDogNTBweDsNCgkJCQltYXgtd2lkdGg6IDkwJTsNCgkJCQl3aWR0 aDogYXV0bzsNCgkJCX0NCgkJCSNrdW9fYWRtaW5fY2hhdCBhLmRlbGV0ZSB7DQoJCQkJcGFk ZGluZzogMC4xZW07DQoJCQl9DQoJCQkja3VvX2FkbWluX2NoYXQgYS5kZWxldGU6aG92ZXIs DQoJCQkja3VvX2FkbWluX2NoYXQgYS5kZWxldGU6Zm9jdXMsDQoJCQkja3VvX2FkbWluX2No YXQgYS5kZWxldGU6YWN0aXZlIHsNCgkJCQl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQoJCQkJ YmFja2dyb3VuZDogY3lhbjsNCgkJCQljb2xvcjogI2ZmZjsNCgkJCX0NCgkJPC9zdHlsZT4N CgknOw0KfQ0KDQpmdW5jdGlvbiBrdW9fYWRtaW5fY2hhdF91c2VyX3ByaXZpbGVnZXMoJG5h bWUpIHsNCgkNCgkkcHJpdmlsZWdlcyA9IHNhZmVfcm93KA0KCQkncHJpdnMnLA0KCQkndHhw X3VzZXJzJywNCgkJJ2BuYW1lYCA9ICInLnNhZmVfZXNjYXBlKCRuYW1lKS4nIiBBTkQgYHBy aXZzYCBJTiAoMSwyKScsDQoJCTANCgkpOw0KCQ0KCWlmICgNCgkJKGlzX2FycmF5KCRwcml2 aWxlZ2VzKSkNCgkJJiYNCgkJKGlzc2V0KCRwcml2aWxlZ2VzWydwcml2cyddKSkNCgkJJiYN CgkJKGNvdW50KCRwcml2aWxlZ2VzKSA9PSAxKQ0KCSkgew0KCQkkcHJpdmlsZWdlcyA9ICRw cml2aWxlZ2VzWydwcml2cyddOw0KCQkNCgkJc2V0dHlwZSgkcHJpdmlsZWdlcywnaW50Jyk7 DQoJfQ0KCQ0KCXJldHVybiAkcHJpdmlsZWdlczsNCn0NCg0KZnVuY3Rpb24ga3VvX2FkbWlu X2NoYXRfZGVsZXRlX2xpbmsoJHJvdywkZXZlbnQpIHsNCgkNCgkkaHJlZiA9ICdpbmRleC5w aHA/ZXZlbnQ9Jy4kZXZlbnQuJyZhbXA7ZGVsZXRlPScuJHJvdzsNCgkNCglyZXR1cm4gJzxh IGhyZWY9IicuJGhyZWYuJyIgY2xhc3M9ImRlbGV0ZSI+JiMxMDA2MDs8L2E+ICc7DQp9DQoN CmZ1bmN0aW9uIGt1b19hZG1pbl9jaGF0X3Nob3coJG1lc3NhZ2VzID0gYXJyYXkoKSwkZXZl bnQsJHJlYWRlcl9uYW1lKSB7DQoJDQoJJG91dHB1dCA9IG51bGw7DQoJDQoJIyBCRUdJTlM6 IE1FU1NBR0VTIEFSUkFZDQoJaWYgKCghZW1wdHkoJG1lc3NhZ2VzKSkgJiYgKGlzX2FycmF5 KCRtZXNzYWdlcykpKSB7DQoJCQ0KCQkkbWVzc2FnZXMgPSBhcnJheV9yZXZlcnNlKCRtZXNz YWdlcyk7DQoJCQ0KCQkkZGF0ZXRpbWVfZm9ybWF0ID0gZ2V0X3ByZWYoDQoJCQknY29tbWVu dHNfZGF0ZWZvcm1hdCcsDQoJCQknJWMnLA0KCQkJMA0KCQkpOw0KCQkNCgkJJGlzX2FsbG93 ZWRfdG9fZGVsZXRlID0ga3VvX2FkbWluX2NoYXRfdXNlcl9wcml2aWxlZ2VzKCRyZWFkZXJf bmFtZSk7DQoJCQ0KCQkjIEJFR0lOUzogRk9SRUFDSA0KCQlmb3JlYWNoKCRtZXNzYWdlcyBh cyAkbWVzc2FnZXMpIHsNCgkJCQ0KCQkJIyBCRUdJTlM6IElTU0VUIE1FU1NBR0UgREFUQQ0K CQkJaWYgKGlzc2V0KA0KCQkJCSRtZXNzYWdlc1snbmFtZSddLA0KCQkJCSRtZXNzYWdlc1sn Y3JlYXRlZCddLA0KCQkJCSRtZXNzYWdlc1snbWVzc2FnZSddKQ0KCQkJKSB7DQoJCQkJDQoJ CQkJJG1lc3NhZ2VzWydjcmVhdGVkJ10gPSBzdHJ0b3RpbWUoJG1lc3NhZ2VzWydjcmVhdGVk J10pOw0KCQkJCSRtZXNzYWdlc1snY3JlYXRlZCddID0gDQoJCQkJCXN0cmZ0aW1lKCRkYXRl dGltZV9mb3JtYXQsJG1lc3NhZ2VzWydjcmVhdGVkJ10pOw0KCQkJCQ0KCQkJCSRtZXNzYWdl c1snbmFtZSddID0gDQoJCQkJCWh0bWxlbnRpdGllcygkbWVzc2FnZXNbJ25hbWUnXSk7DQoJ CQkJCQ0KCQkJCSRtZXNzYWdlc1snbWVzc2FnZSddID0gDQoJCQkJCXdvcmR3cmFwKCRtZXNz YWdlc1snbWVzc2FnZSddLDE3NSxQSFBfRU9MLGZhbHNlKTsNCgkJCQkNCgkJCQkkbWVzc2Fn ZXNbJ21lc3NhZ2UnXSA9IA0KCQkJCQlodG1sZW50aXRpZXMoJG1lc3NhZ2VzWydtZXNzYWdl J10pOw0KCQkJCQkNCgkJCQkkbWVzc2FnZXNbJ21lc3NhZ2UnXSA9IA0KCQkJCQlzdHJfcmVw bGFjZShQSFBfRU9MLCc8YnIgLz4nLCRtZXNzYWdlc1snbWVzc2FnZSddKTsNCgkJCQkJDQoJ CQkJIyBCRUdJTlM6IFRISVMgUkVBREVSIElTIEFMTE9XRUQgVE8gREVMRVRFIEFOWSBNRVNT QUdFDQoJCQkJaWYgKCRpc19hbGxvd2VkX3RvX2RlbGV0ZSkgew0KCQkJCQkNCgkJCQkJJGRl bGV0ZV9saW5rID0ga3VvX2FkbWluX2NoYXRfZGVsZXRlX2xpbmsoDQoJCQkJCQkkbWVzc2Fn ZXNbJ3JvdyddLA0KCQkJCQkJJGV2ZW50DQoJCQkJCSk7DQoJCQkJfQ0KCQkJCSMgRU5EUzog VEhJUyBSRUFERVIgSVMgQUxMT1dFRCBUTyBERUxFVEUgQU5ZIE1FU1NBR0UNCgkJCQllbHNl IHsNCgkJCQkJJGRlbGV0ZV9saW5rID0gbnVsbDsNCgkJCQl9DQoJCQkJDQoJCQkJJG91dHB1 dCAuPSANCgkJCQkJJzxsaT4nLg0KCQkJCQkJJGRlbGV0ZV9saW5rLg0KCQkJCQkJJzxzcGFu PicuJG1lc3NhZ2VzWydjcmVhdGVkJ10uJzwvc3Bhbj4gJy4NCgkJCQkJCSc8c3Ryb25nPicu JG1lc3NhZ2VzWyduYW1lJ10uJzo8L3N0cm9uZz4gJy4NCgkJCQkJCSc8cSBjaXRlPSInLiRt ZXNzYWdlc1snbmFtZSddLiciPicuDQoJCQkJCQkJJG1lc3NhZ2VzWydtZXNzYWdlJ10uDQoJ CQkJCQknPC9xPicuDQoJCQkJCSc8L2xpPicNCgkJCQk7DQoJCQl9DQoJCQkjIEVORFM6IElT U0VUIE1FU1NBR0UgREFUQQ0KCQl9DQoJCSMgRU5EUzogRk9SRUFDSA0KCQkNCgkJJG91dHB1 dCA9ICc8b2wgaWQ9Imt1b19hZG1pbl9jaGF0X21lc3NhZ2VzIj4nLiRvdXRwdXQuJzwvb2w+ JzsNCgl9DQoJIyBFTkRTOiBNRVNTQUdFUyBBUlJBWQ0KCWVsc2Ugew0KCQkkb3V0cHV0ID0g JzxwPjxtYXJrPk5vIG1lc3NhZ2VzLjwvbWFyaz48L3A+JzsNCgl9DQoJDQoJcmV0dXJuICRv dXRwdXQ7DQp9DQoNCmZ1bmN0aW9uIGt1b19hZG1pbl9jaGF0X3Bvc3QoJHNlbmRlcl9uYW1l KSB7DQoJDQoJJHNlbmRlcl9uYW1lID0gaHRtbGVudGl0aWVzKCRzZW5kZXJfbmFtZSk7DQoJ DQoJcmV0dXJuICcNCgkJPGZvcm0gbWV0aG9kPSJwb3N0IiBhdXRvY29tcGxldGU9Im9mZiI+ DQoJCQk8ZmllbGRzZXQ+DQoJCQkJPGxlZ2VuZD5Xcml0ZSBhIG5ldyBtZXNzYWdlPC9sZWdl bmQ+DQoJCQkJPHA+PGxhYmVsIA0KCQkJCWZvcj0ia3VvX25ld19tZXNzYWdlIj4nLiRzZW5k ZXJfbmFtZS4nOiZuYnNwOzwvbGFiZWw+Jy5maW5wdXQoDQoJCQkJCSd0ZXh0JywNCgkJCQkJ J21lc3NhZ2UnLA0KCQkJCQknJywNCgkJCQkJJycsDQoJCQkJCScnLA0KCQkJCQknJywNCgkJ CQkJMTAwLA0KCQkJCQknJywNCgkJCQkJJ2t1b19uZXdfbWVzc2FnZScsDQoJCQkJCWZhbHNl LA0KCQkJCQl0cnVlLA0KCQkJCQknJw0KCQkJCSkuJzwvcD4NCgkJCQk8cD48YnV0dG9uIHR5 cGU9InN1Ym1pdCI+Jy5nVHh0KCdzdWJtaXQnKS4nPC9idXR0b24+PC9wPg0KCQkJPC9maWVs ZHNldD4NCgkJPC9mb3JtPg0KCSc7DQp9DQoNCmZ1bmN0aW9uIGt1b19hZG1pbl9jaGF0X3Nh dmVfbWVzc2FnZSgkbmFtZSwkbWVzc2FnZSkgew0KCQ0KCSRzdGF0dXMgPSBmYWxzZTsNCgkN CglpZiAoaXNzZXQoJG5hbWUsJG1lc3NhZ2UpKSB7DQoJCQ0KCQkkc3RhdHVzID0gc2FmZV9p bnNlcnQoDQoJCQkna3VvX2FkbWluX2NoYXQnLA0KCQkJJw0KCQkJCWBuYW1lYCA9ICInLnNh ZmVfZXNjYXBlKCRuYW1lKS4nIiwNCgkJCQlgY3JlYXRlZGAgPSAiJy5kYXRlKCdZLW0tZCBI Omk6cycpLiciLA0KCQkJCWBtb2RpZmllZGAgPSAiJy5kYXRlKCdZLW0tZCBIOmk6cycpLici LA0KCQkJCWBzdGF0dXNgID0gMSwNCgkJCQlgbWVzc2FnZWAgPSAiJy5zYWZlX2VzY2FwZSgk bWVzc2FnZSkuJyINCgkJCScsDQoJCQkwDQoJCSk7DQoJfQ0KDQoJcmV0dXJuICRzdGF0dXM7 DQp9DQoNCmZ1bmN0aW9uIGt1b19hZG1pbl9jaGF0X3NhdmVfc2V0dGluZ3MoJG5hbWUsJHNl dHRpbmdzKSB7DQoJDQoJJHN0YXR1cyA9IGZhbHNlOw0KCQ0KCWlmIChpc3NldCgkbmFtZSwk c2V0dGluZ3NbJ21lc3NhZ2VfbGltaXQnXSkpIHsNCgkJDQoJCSRzdGF0dXMgPSBzYWZlX3Vw c2VydCgNCgkJCSdrdW9fYWRtaW5fY2hhdF9wcmVmcycsDQoJCQknYG1lc3NhZ2VfbGltaXRg ID0gJy5zYWZlX2VzY2FwZSgkc2V0dGluZ3NbJ21lc3NhZ2VfbGltaXQnXSksDQoJCQknYG5h bWVgID0gIicuc2FmZV9lc2NhcGUoJG5hbWUpLiciJywNCgkJCTANCgkJKTsNCgl9DQoJDQoJ cmV0dXJuICRzdGF0dXM7DQp9DQoNCmZ1bmN0aW9uIGt1b19hZG1pbl9jaGF0X2RlbGV0ZV9t ZXNzYWdlKCRyb3cpIHsNCgkNCgkkc3RhdHVzID0gZmFsc2U7DQoJDQoJaWYgKGlzc2V0KCRy b3cpKSB7DQoJCQ0KCQkkc3RhdHVzID0gc2FmZV91cGRhdGUoDQoJCQkna3VvX2FkbWluX2No YXQnLA0KCQkJJ2BzdGF0dXNgID0gMCwgYG1vZGlmaWVkYCA9ICInLmRhdGUoJ1ktbS1kIEg6 aTpzJykuJyInLA0KCQkJJ2Byb3dgID0gJy5zYWZlX2VzY2FwZSgkcm93KS4nIEFORCBgc3Rh dHVzYCA9IDEnLA0KCQkJMA0KCQkpOw0KCX0NCgkNCglyZXR1cm4gJHN0YXR1czsNCn0iO3M6 NDoidHlwZSI7czoxOiIzIjtzOjU6Im9yZGVyIjtzOjE6IjUiO3M6NToiZmxhZ3MiO3M6MToi MiI7czo0OiJoZWxwIjtzOjY1MjoiPHA+VGhlIGFkbWluLXNpZGUgY2hhdCBzaG91bGQgYmUg dmlzaWJsZSB0byBhbGwgVGV4dHBhdHRlcm4gdXNlcnMsIGV4Y2VwdCB0aG9zZSB3aG8gaGF2 ZSAiTm9uZSIgYXMgcHJpdmlsZWdlcy4gQ2hhdCBzaG91bGQgYmUgbG9jYXRlZCBhdCA8c3Ry b25nPkFkbWluPC9zdHJvbmc+ICZyYXJyOyA8c3Ryb25nPkNoYXQ8L3N0cm9uZz4uPC9wPgo8 cD5QdWJsaXNoZXJzIGFuZCBNYW5hZ2luZyBFZGl0b3JzIGNhbiBkZWxldGUgbWVzc2FnZXMu IERlbGV0ZWQgbWVzc2FnZXMgYXJlIGFjdHVhbGx5IG5vdCBjb21wbGV0ZWx5IHJlbW92ZWQg ZnJvbSBkYXRhYmFzZSwgYnV0IHRoZXkgYXJlIG1hcmtlZCBhcyBoaWRkZW4gbWVzc2FnZXMu PC9wPgo8aDM+S2VlcCB0aGUgY2hhdCBpbiBzaWdodDwvaDM+CjxwPlRvIDxhIGhyZWY9Imlu ZGV4LnBocD9ldmVudD1rdW9fYWRtaW5fY2hhdCI+bGF1bmNoIHRoZSBjaGF0PC9hPiBwYWdl IHdoZW4gYSB1c2VyIG9wZW5zIFRleHRwYXR0ZXJuLCBnbyB0byA8c3Ryb25nPlByZWZlcmVu Y2VzPC9zdHJvbmc+ICZyYXJyOyA8c3Ryb25nPkFkbWluPC9zdHJvbmc+ICZyYXJyOyA8c3Ry b25nPkRlZmF1bHQgYWRtaW5pc3RyYXRpb24gcGFuZWw8L3N0cm9uZz4gYW5kIHNlbGVjdCA8 c3Ryb25nPkNoYXQ8L3N0cm9uZz4uPC9wPiI7czozOiJtZDUiO3M6MzI6IjJiN2I3YzgzNDFm MWYzYmRkZGZjYTQzMWFmNDAyYmJlIjt9