# Name: gbp_permanent_links v0.14.8 # Type: Admin/Public plugin # Custom permanent links rules # Author: Graeme Porteous # URL: http://rgbp.co.uk/projects/textpattern/gbp_permanent_links/ # 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: # ..................................................................... YToxMTp7czo0OiJuYW1lIjtzOjE5OiJnYnBfcGVybWFuZW50X2xpbmtzIjtzOjY6ImF1dGhv ciI7czoxNToiR3JhZW1lIFBvcnRlb3VzIjtzOjEwOiJhdXRob3JfdXJpIjtzOjU5OiJodHRw Oi8vcmdicC5jby51ay9wcm9qZWN0cy90ZXh0cGF0dGVybi9nYnBfcGVybWFuZW50X2xpbmtz LyI7czo3OiJ2ZXJzaW9uIjtzOjY6IjAuMTQuOCI7czoxMToiZGVzY3JpcHRpb24iO3M6Mjg6 IkN1c3RvbSBwZXJtYW5lbnQgbGlua3MgcnVsZXMiO3M6NDoiY29kZSI7czo2ODg2NToiLy8g Q29uc3RhbnRzCkBkZWZpbmUoJ2dicF9zYXZlJywgJ3NhdmUnKTsKQGRlZmluZSgnZ2JwX3Bv c3QnLCAncG9zdCcpOwpAZGVmaW5lKCdnYnBfc2VwYXJhdG9yJywgJyZ+Jn4mJyk7CgovLyBy ZXF1aXJlX3BsdWdpbigpIHdpbGwgcmVzZXQgdGhlICR0eHBfY3VycmVudF9wbHVnaW4gZ2xv YmFsCmdsb2JhbCAkdHhwX2N1cnJlbnRfcGx1Z2luOwokZ2JwX2N1cnJlbnRfcGx1Z2luID0g JHR4cF9jdXJyZW50X3BsdWdpbjsKcmVxdWlyZV9wbHVnaW4oJ2dicF9hZG1pbl9saWJyYXJ5 Jyk7CiR0eHBfY3VycmVudF9wbHVnaW4gPSAkZ2JwX2N1cnJlbnRfcGx1Z2luOwoKY2xhc3Mg UGVybWFuZW50TGlua3MgZXh0ZW5kcyBHQlBQbHVnaW4KewoJdmFyICRwcmVmZXJlbmNlcyA9 IGFycmF5KAoJCSdzaG93X3ByZWZpeCcgPT4gYXJyYXkoJ3ZhbHVlJyA9PiAwLCAndHlwZScg PT4gJ3llc25vcmFkaW8nKSwKCQknc2hvd19zdWZmaXgnID0+IGFycmF5KCd2YWx1ZScgPT4g MCwgJ3R5cGUnID0+ICd5ZXNub3JhZGlvJyksCgkJJ29taXRfdHJhaWxpbmdfc2xhc2gnID0+ IGFycmF5KCd2YWx1ZScgPT4gMCAsICd0eXBlJyA9PiAneWVzbm9yYWRpbycpLAoJCSdyZWRp cmVjdF9tdF9zdHlsZV9saW5rcycgPT4gYXJyYXkoJ3ZhbHVlJyA9PiAxICwgJ3R5cGUnID0+ ICd5ZXNub3JhZGlvJyksCgkJJ2NsZWFuX3BhZ2VfYXJjaGl2ZV9saW5rcycgPT4gYXJyYXko J3ZhbHVlJyA9PiAxICwgJ3R5cGUnID0+ICd5ZXNub3JhZGlvJyksCgkJJ2pvaW5fcHJldGV4 dF90b19wYWdlbGlua3MnID0+IGFycmF5KCd2YWx1ZScgPT4gMSAsICd0eXBlJyA9PiAneWVz bm9yYWRpbycpLAoJCSdjaGVja19wcmV0ZXh0X2NhdGVnb3J5X2NvbnRleHQnID0+IGFycmF5 KCd2YWx1ZScgPT4gMCAsICd0eXBlJyA9PiAneWVzbm9yYWRpbycpLAoJCSdjaGVja19wcmV0 ZXh0X3NlY3Rpb25fY29udGV4dCcgPT4gYXJyYXkoJ3ZhbHVlJyA9PiAwICwgJ3R5cGUnID0+ ICd5ZXNub3JhZGlvJyksCgkJJ2ZvcmNlX2xvd2VyY2FzZV91cmxzJyA9PiBhcnJheSgndmFs dWUnID0+IDEgLCAndHlwZScgPT4gJ3llc25vcmFkaW8nKSwKCQknYXV0b21hdGljYWxseV9h cHBlbmRfdGl0bGUnID0+IGFycmF5KCd2YWx1ZScgPT4gMSAsICd0eXBlJyA9PiAneWVzbm9y YWRpbycpLAoJCSd1c2VfY2xlYXZlcl9wYXJ0aWFsX21hdGNoZXMnID0+IGFycmF5KCd2YWx1 ZScgPT4gMSAsICd0eXBlJyA9PiAneWVzbm9yYWRpbycpLAoJCSdwZXJtbGlua19yZWRpcmVj dF9odHRwX3N0YXR1cycgPT4gYXJyYXkoJ3ZhbHVlJyA9PiAnMzAxJyAsICd0eXBlJyA9PiAn dGV4dF9pbnB1dCcpLAoJCSd1cmxfcmVkaXJlY3RfaHR0cF9zdGF0dXMnID0+IGFycmF5KCd2 YWx1ZScgPT4gJzMwMicgLCAndHlwZScgPT4gJ3RleHRfaW5wdXQnKSwKCQkndGV4dF9hbmRf cmVnZXhfc2VnbWVudF9zY29yZXMnID0+IGFycmF5KCd2YWx1ZScgPT4gJzAnICwgJ3R5cGUn ID0+ICd0ZXh0X2lucHV0JyksCgkJJ2RlYnVnJyA9PiBhcnJheSgndmFsdWUnID0+IDAsICd0 eXBlJyA9PiAneWVzbm9yYWRpbycpLAoJKTsKCXZhciAkbWF0Y2hlZF9wZXJtbGluayA9IGFy cmF5KCk7Cgl2YXIgJHBhcnRpYWxfbWF0Y2hlcyA9IGFycmF5KCk7Cgl2YXIgJGNsZWF2ZXJf cGFydGlhbF9tYXRjaDsKCXZhciAkYnVmZmVyX2RlYnVnID0gYXJyYXkoKTsKCglmdW5jdGlv biBwcmVsb2FkICgpIHsKCQluZXcgUGVybWFuZW50TGlua3NMaXN0VGFiVmlldygnbGlzdCcs ICdsaXN0JywgJHRoaXMpOwoJCW5ldyBQZXJtYW5lbnRMaW5rc0J1aWxkVGFiVmlldygnYnVp bGQnLCAnYnVpbGQnLCAkdGhpcyk7CgkJbmV3IEdCUFByZWZlcmVuY2VUYWJWaWV3KCR0aGlz KTsKCX0KCglmdW5jdGlvbiBtYWluICgpIHsKCQlyZXF1aXJlX3ByaXZzKCR0aGlzLT5ldmVu dCk7Cgl9CgoJZnVuY3Rpb24gZ2V0X2FsbF9wZXJtbGlua3MgKCRzb3J0ID0gMCwgJGV4Y2x1 ZGUgPSBhcnJheSgpKSB7CgkJc3RhdGljICRyczsKCQlpZiAoIWlzc2V0KCRycykpCgkJCSRy cyA9IHNhZmVfY29sdW1uKAoJCQkJIlJFUExBQ0UobmFtZSwgJ3skdGhpcy0+cGx1Z2luX25h bWV9XycsICcnKSBBUyBpZCIsICd0eHBfcHJlZnMnLAoJCQkJImBldmVudGAgPSAneyR0aGlz LT5ldmVudH0nIEFORCBgbmFtZWAgUkVHRVhQICdeeyR0aGlzLT5wbHVnaW5fbmFtZX1fLnsx M30kJyIKCQkJKTsKCgkJaWYgKEB0eHBpbnRlcmZhY2UgPT0gJ3B1YmxpYycpCgkJCSR0aGlz LT5kZWJ1ZygnTG9hZGluZyBwZXJtbGlua3MgZnJvbSBkYicpOwoJCSRpID0gMDsKCgkJJHBl cm1saW5rcyA9IGFycmF5KCk7CgkJZm9yZWFjaCAoJHJzIGFzICRpZCkgewoJCQkkcGwgPSAk dGhpcy0+Z2V0X3Blcm1saW5rKCRpZCk7CgoJCQkvLyBEb24ndCB0cnkgYW5kIGxvYWQgcGVy bWxpbmsgcnVsZXMgZnJvbSB0aGUgbmV3IHZlcnNpb24KCQkJaWYgKCFpc3NldCgkcGxbJ2Nv bXBvbmVudHMnXSkpCgkJCQljb250aW51ZTsKCgkJCWlmIChjb3VudCgkZXhjbHVkZSkgPiAw KQoJCQkJZm9yZWFjaCAoJHBsWydjb21wb25lbnRzJ10gYXMgJHBsX2MpIHsKCQkJCQlpZiAo aXNfYXJyYXkoJGV4Y2x1ZGUpICYmIGluX2FycmF5KCRwbF9jWyd0eXBlJ10sICRleGNsdWRl KSkKCQkJCQkJY29udGludWUgMjsKCQkJCQlpZiAoaXNfc3RyaW5nKCRleGNsdWRlKSAmJiAk cGxfY1sndHlwZSddID09PSAkZXhjbHVkZSkKCQkJCQkJY29udGludWUgMjsKCQkJCX0KCgkJ CSRwZXJtbGlua3NbJGlkXSA9ICRwbDsKCgkJCWlmICgkc29ydCkKCQkJCSRwcmVjZWRlbmNl WyRpZF0gPSAkcGVybWxpbmtzWyRpZF1bJ3NldHRpbmdzJ11bJ3BsX3ByZWNlZGVuY2UnXTsK CQl9CgoJCS8vIElmIG1vcmUgdGhhbiBvbmUgcGVybWFuZW50IGxpbmssIHNvcnQgYnkgdGhl aXIgcHJlY2VkZW5jZSB2YWx1ZS4KCQlpZiAoJHNvcnQgJiYgY291bnQoJHBlcm1saW5rcykg PiAxKQoJCQlhcnJheV9tdWx0aXNvcnQoJHByZWNlZGVuY2UsIFNPUlRfREVTQywgJHBlcm1s aW5rcyk7CgoJCWlmIChAdHhwaW50ZXJmYWNlID09ICdwdWJsaWMnKSB7CgkJCWZvcmVhY2gg KCRwZXJtbGlua3MgYXMgJHBsKQoJCQkJJHRoaXMtPmRlYnVnKCRwbFsnc2V0dGluZ3MnXVsn cGxfcHJlY2VkZW5jZSddLic6ICcuJHBsWydzZXR0aW5ncyddWydwbF9uYW1lJ10uJyAoJy4k cGxbJ3NldHRpbmdzJ11bJ3BsX3ByZXZpZXcnXS4nKScpOwoJCX0KCgkJcmV0dXJuICRwZXJt bGlua3M7Cgl9CgoJZnVuY3Rpb24gZ2V0X3Blcm1saW5rICgkaWQpIHsKCQkkcGVybWxpbmsg PSAkdGhpcy0+cHJlZigkaWQpOwoJCXJldHVybiBpc19hcnJheSgkcGVybWxpbmspID8gJHBl cm1saW5rIDogYXJyYXkoKTsKCX0KCglmdW5jdGlvbiByZW1vdmVfcGVybWxpbmsgKCRpZCkg ewoJCSRwZXJtbGluayA9ICR0aGlzLT5nZXRfcGVybWxpbmsoJGlkKTsKCQlzYWZlX2RlbGV0 ZSgndHhwX3ByZWZzJywgImBldmVudGAgPSAneyR0aGlzLT5ldmVudH0nIEFORCBgbmFtZWAg TElLRSAneyR0aGlzLT5wbHVnaW5fbmFtZX1feyRpZH0lJyIpOwoJCXJldHVybiAkcGVybWxp bmtbJ3NldHRpbmdzJ11bJ3BsX25hbWUnXTsKCX0KCglmdW5jdGlvbiBfZmVlZF9lbnRyeSAo KSB7CgkJc3RhdGljICRzZXQ7CgkJaWYgKCFpc3NldCgkc2V0KSkgewoJCQkvLyBXZSdyZSBp biBhIGZlZWQgZm9yY2UgZGVidWdnaW5nIG9mZi4KCQkJJHRoaXMtPnByZWZlcmVuY2VzWydk ZWJ1ZyddWyd2YWx1ZSddID0gJEdMT0JBTFNbJ3ByZWZzJ11bJHRoaXMtPnBsdWdpbl9uYW1l LidfZGVidWcnXSA9IDA7CgoJCQkkdGhpcy0+c2V0X3Blcm1saW5rX21vZGUodHJ1ZSk7CgkJ CSRzZXQgPSB0cnVlOwoJCX0KCX0KCglmdW5jdGlvbiBfdGV4dHBhdHRlcm4gKCkgewoJCWds b2JhbCAkcGx1Z2luc192ZXIsICRwcmV0ZXh0LCAkcHJlZnMsICRwbHVnaW5fY2FsbGJhY2s7 CgoJCSR0aGlzLT5kZWJ1ZygnUGx1Z2luOiAnLiR0aGlzLT5wbHVnaW5fbmFtZS4nIC0gJy4k cGx1Z2luc192ZXJbJHRoaXMtPnBsdWdpbl9uYW1lXSk7CgkJJHRoaXMtPmRlYnVnKCdGdW5j dGlvbjogJy5fX0ZVTkNUSU9OX18uJygpJyk7CgoJCS8vIFVSSQoJCSRyZXEgPSAkcHJldGV4 dFsncmVxJ107CgkJJHJlcSA9IHByZWdfcmVwbGFjZSgnJVw/W15cL10rJCUnLCAnJywgJHJl cSk7CgkJJHRoaXMtPmRlYnVnKCdSZXF1ZXN0IFVSSTogJy4kcmVxKTsKCQkkdXJpID0gZXhw bG9kZSgnLycsIHRyaW0oJHJlcSwgJy8nKSk7CgoJCS8vIFRoZSBudW1iZXIgb2YgY29tcG9u ZW50cyBjb21lcyBpbiB1c2VmdWwgd2hlbiBkZXRlcm1pbmluZyB0aGUgYmVzdCBwYXJ0aWFs IG1hdGNoLgoJCSR1cmlfY29tcG9uZW50X2NvdW50ID0gY291bnQoJHVyaSk7CgoJCS8vIFBl cm1hbmVudCBsaW5rcwoJCSRwZXJtbGlua3MgPSAkdGhpcy0+Z2V0X2FsbF9wZXJtbGlua3Mo MSk7CgoJCS8vIEZvcmNlIFRleHRwYXR0ZXJuIGFuZCB0YWdzIHRvIHVzZSBtZXNzeSBVUkxz IC0gdGhlc2UgYXJlIGVhc2llciB0bwoJCS8vIGZpbmQgaW4gcmVnZXgKCQkkdGhpcy0+c2V0 X3Blcm1saW5rX21vZGUoKTsKCgkJaWYgKGNvdW50KCRwZXJtbGlua3MpKSB7CgoJCQkvLyBX ZSBhbHNvIHdhbnQgdG8gbWF0Y2ggdGhlIGZyb250IHBhZ2Ugb2YgdGhlIHNpdGUgKGZvciBw YWdlIG51bWJlcnMgLyBmZWVkcyBldGMuLikuCgkJCS8vIEFkZCBhIHBlcm1saW5rcyBydWxl IHdoaWNoIHdpbGwgZG8gdGhhdC4KCQkJJHBlcm1saW5rc1snZGVmYXVsdCddID0gYXJyYXko CgkJCQknY29tcG9uZW50cycgPT4gYXJyYXkoKSwKCQkJCSdzZXR0aW5ncycgPT4gYXJyYXko CgkJCQkJJ3BsX25hbWUnID0+ICdnYnBfcGVybWFuZW50X2xpbmtzX2RlZmF1bHQnLCAncGxf cHJlY2VkZW5jZScgPT4gJycsICdwbF9wcmV2aWV3JyA9PiAnLycsCgkJCQkJJ2Nvbl9zZWN0 aW9uJyA9PiAnJywgJ2Nvbl9jYXRlZ29yeScgPT4gJycsICdkZXNfc2VjdGlvbicgPT4gJycs ICdkZXNfY2F0ZWdvcnknID0+ICcnLAoJCQkJCSdkZXNfcGVybWxpbmsnID0+ICcnLCAnZGVz X2ZlZWQnID0+ICcnLCAnZGVzX2xvY2F0aW9uJyA9PiAnJywgJ2Rlc19wYWdlJyA9PiAnJwoJ CQkpKTsKCgkJCS8vIEV4dGVuZCB0aGUgcHJldGV4dF9yZXBsYWNlbWVudCBzY29wZSBvdXRz aWRlIHRoZSBmb3JlYWNoIHBlcm1saW5rIGxvb3AKCQkJJHByZXRleHRfcmVwbGFjZW1lbnQg PSBOVUxMOwoKCQkJZm9yZWFjaCgkcGVybWxpbmtzIGFzICRpZCA9PiAkcGwpIHsKCQkJCS8v IEV4dHJhY3QgdGhlIHBlcm1saW5rIHNldHRpbmdzCgkJCQkkcGxfc2V0dGluZ3MgPSAkcGxb J3NldHRpbmdzJ107CgkJCQlleHRyYWN0KCRwbF9zZXR0aW5ncyk7CgoJCQkJJHRoaXMtPmRl YnVnKCdQZXJtbGluayBuYW1lOiAnLiRwbF9uYW1lKTsKCQkJCSR0aGlzLT5kZWJ1ZygnUGVy bWxpbmsgaWQ6ICcuJGlkKTsKCQkJCSR0aGlzLT5kZWJ1ZygnUHJldmlldzogJy4kcGxfcHJl dmlldyk7CgoJCQkJJHBsX2NvbXBvbmVudHMgPSAkcGxbJ2NvbXBvbmVudHMnXTsKCgkJCQkv LyBVUkkgY29tcG9uZW50cwoJCQkJJHVyaV9jb21wb25lbnRzID0gJHVyaTsKCgkJCQkkdGhp cy0+ZGVidWcoJ1BMIGNvbXBvbmVudCBjb3VudDogJy5jb3VudCgkcGxfY29tcG9uZW50cykp OwoJCQkJJHRoaXMtPmRlYnVnKCdVUkwgY29tcG9uZW50IGNvdW50OiAnLmNvdW50KCR1cmlf Y29tcG9uZW50cykpOwoKCQkJCSRkYXRlID0gZmFsc2U7ICR0aXRsZV9wYWdlX2ZlZWQgPSBm YWxzZTsKCQkJCWZvcmVhY2goJHBsX2NvbXBvbmVudHMgYXMgJHBsX2MpCgkJCQkJLy8gQXJl IHdlIGV4cGVjdGluZyBhIGRhdGUgY29tcG9uZW50PyBJZiBzbyB0aGUgbnVtYmVyIG9mIHBs IGFuZCB1cmkgY29tcG9uZW50cyB3b24ndCBtYXRjaAoJCQkJCWlmICgkcGxfY1sndHlwZSdd ID09ICdkYXRlJykKCQkJCQkJJGRhdGUgPSB0cnVlOwoJCQkJCS8vIERvIHdlIGhhdmUgZWl0 aGVyIGEgdGl0bGUsIHBhZ2Ugb3IgYSBmZWVkIGNvbXBvbmVudD8KCQkJCQllbHNlIGlmIChp bl9hcnJheSgkcGxfY1sndHlwZSddLCBhcnJheSgndGl0bGUnLCAncGFnZScsICdmZWVkJykp KQoJCQkJCQkkdGl0bGVfcGFnZV9mZWVkID0gdHJ1ZTsKCgkJCQlpZiAoISR0aXRsZV9wYWdl X2ZlZWQpCgkJCQkJLy8gSWYgdGhlcmUgaXNuJ3QgYSB0aXRsZSwgcGFnZSBvciBmZWVkIGNv bXBvbmVudCB0aGVuIGFwcGVuZCBhIHNwZWNpYWwgdHlwZSBmb3IgY2xlYXZlciBwYXJ0aWFs IG1hdGNoaW5nCgkJCQkJJHBsX2NvbXBvbmVudHNbXSA9IGFycmF5KCd0eXBlJyA9PiAndGl0 bGVfcGFnZV9mZWVkJywgJ3ByZWZpeCcgPT4gJycsICdzdWZmaXgnID0+ICcnLCAncmVnZXgn ID0+ICcnLCAndGV4dCcgPT4gJycpOwoKCQkJCS8vIEV4aXQgZWFybHkgaWYgdGhlcmUgYXJl IG1vcmUgVVJMIGNvbXBvbmVudHMgdGhhbiBQTCBjb21wb25lbnRzLAoJCQkJLy8gdGFraW5n IGludG8gYWNjb3VudCB3aGV0aGVyIHRoZXJlIGlzIGEgZGF0YSBjb21wb25lbnQKCQkJCWlm ICghJHVyaV9jb21wb25lbnRzWzBdIHx8IGNvdW50KCR1cmlfY29tcG9uZW50cykgPiBjb3Vu dCgkcGxfY29tcG9uZW50cykgKyAoJGRhdGUgPyAyIDogMCkpIHsKCQkJCQkkdGhpcy0+ZGVi dWcoJ01vcmUgVVJMIGNvbXBvbmVudHMgdGhhbiBQTCBjb21wb25lbnRzJyk7CgkJCQkJY29u dGludWU7CgkJCQl9CgoJCQkJLy8gUmVzZXQgcHJldGV4dF9yZXBsYWNlbWVudCBhcyB3ZSBh cmUgYWJvdXQgdG8gc3RhcnQgYW5vdGhlciBjb21wYXJpc29uCgkJCQkkcHJldGV4dF9yZXBs YWNlbWVudCA9IGFycmF5KCdwZXJtbGlua19pZCcgPT4gJGlkKTsKCgkJCQkvLyBSZXNldCB0 aGUgYXJ0aWNsZSBjb250ZXh0IHN0cmluZwoJCQkJJGNvbnRleHQgPSBhcnJheSgpOwoJCQkJ dW5zZXQoJGNvbnRleHRfc3RyKTsKCQkJCWlmICghZW1wdHkoJGRlc19zZWN0aW9uKSkKCQkJ CQkkY29udGV4dFtdID0gImBTZWN0aW9uYCA9ICckZGVzX3NlY3Rpb24nIjsKCQkJCWlmICgh ZW1wdHkoJGRlc19jYXRlZ29yeSkpCgkJCQkJJGNvbnRleHRbXSA9ICIoYENhdGVnb3J5MWAg PSAnJGRlc19jYXRlZ29yeScgT1IgYENhdGVnb3J5MmAgPSAnJGRlc19jYXRlZ29yeScpIjsK CQkJCSRjb250ZXh0X3N0ciA9IChjb3VudCgkY29udGV4dCkgPiAwID8gJ2FuZCAnLmpvaW4o JyBhbmQgJywgJGNvbnRleHQpIDogJycpOwoKCQkJCS8vIEFzc3VtZSB0aGVyZSBpcyBubyBt YXRjaAoJCQkJJHBhcnRpYWxfbWF0Y2ggPSBmYWxzZTsKCQkJCSRjbGVhdmVyX3BhcnRpYWxf bWF0Y2ggPSBmYWxzZTsKCgkJCQkvLyBMb29wIHRocm91Z2ggdGhlIHBlcm1saW5rIGNvbXBv bmVudHMKCQkJCWZvcmVhY2ggKCRwbF9jb21wb25lbnRzIGFzICRwbF9jX2luZGV4ID0+ICRw bF9jKSB7CgkJCQkJLy8gQXNzdW1lIHRoZXJlIGlzIG5vIG1hdGNoCgkJCQkJJG1hdGNoID0g ZmFsc2U7CgoJCQkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBhcmUgc3RpbGwgVVJJIGNv bXBvbmVudHMgdG8gYmUgY2hlY2tlZC4KCQkJCQlpZiAoY291bnQoJHVyaV9jb21wb25lbnRz KSkKCQkJCQkJLy8gR2V0IHRoZSBuZXh0IGNvbXBvbmVudC4KCQkJCQkJJHVyaV9jID0gYXJy YXlfc2hpZnQoJHVyaV9jb21wb25lbnRzKTsKCgkJCQkJZWxzZSBpZiAoISR0aXRsZV9wYWdl X2ZlZWQgJiYgY291bnQoJHBsX2NvbXBvbmVudHMpIC0gMSA9PSAkdXJpX2NvbXBvbmVudF9j b3VudCkgewoJCQkJCQkvLyBJZiB3ZSBhcHBlbmRlZCBhIHRpdGxlX3BhZ2VfZmVlZCBjb21w b25lbnQgZWFybGllciBhbmQgcGVybWxpbmsgYW5kIFVSSSBjb21wb25lbnRzCgkJCQkJCS8v IGNvdW50cyBhcmUgZXF1YWwsIHdlIG11c3Qgb2YgZmluaXNoZWQgY2hlY2tpbmcgdGhpcyBw ZXJtbGluaywgYW5kIGl0IG1hdGNoZXMgc28gYnJlYWsuCgkJCQkJCSRtYXRjaCA9IHRydWU7 CgkJCQkJCWJyZWFrOwoKCQkJCQl9IGVsc2UgewoJCQkJCQkvLyBJZiB0aGVyZSBhcmUgbm8g bW9yZSBVUkkgY29tcG9uZW50cyB0aGVuIHdlIGhhdmUgYSBwYXJ0aWFsIG1hdGNoLgoJCQkJ CQkvLyBTdG9yZSB0aGUgcGFydGlhbCBtYXRjaCBkYXRhIHVubGVzcyB0aGVyZSBoYXMgYmVl biBhIHByZWNlZGluZyBwZXJtbGluayB3aXRoIHRoZQoJCQkJCQkvLyBzYW1lIG51bWJlciBv ZiBjb21wb25lbnRzLCBhcyBwZXJtbGluayBoYXZlIGFscmVhZHkgYmVlbiBzb3J0ZWQgYnkg cHJlY2VkZW5jZS4KCQkJCQkJaWYgKCFhcnJheV9rZXlfZXhpc3RzKCR1cmlfY29tcG9uZW50 X2NvdW50LCAkdGhpcy0+cGFydGlhbF9tYXRjaGVzKSkKCQkJCQkJCSR0aGlzLT5wYXJ0aWFs X21hdGNoZXNbJHVyaV9jb21wb25lbnRfY291bnRdID0gJHByZXRleHRfcmVwbGFjZW1lbnQ7 CgoJCQkJCQkvLyBVbnNldCBwcmV0ZXh0X3JlcGxhY2VtZW50IGFzIGNoYW5nZXMgY291bGQg b2YgYmVlbiBtYWRlIGluIGEgcHJlY2VkaW5nIGNvbXBvbmVudAoJCQkJCQl1bnNldCgkcHJl dGV4dF9yZXBsYWNlbWVudCk7CgoJCQkJCQkvLyBCcmVhayBlYXJseSBmb3JtIHRoZSBmb3Jl YWNoIHBlcm1saW5rIGNvbXBvbmVudHMgbG9vcC4KCQkJCQkJJHBhcnRpYWxfbWF0Y2ggPSB0 cnVlOwoJCQkJCQlicmVhazsKCQkJCQl9CgoJCQkJCS8vIEV4dHJhY3QgdGhlIHBlcm1saW5r IGNvbXBvbmVudHMuCgkJCQkJZXh0cmFjdCgkcGxfYyk7CgoJCQkJCS8vIElmIGl0J3MgYSBk YXRlLCBncmFiIGFuZCBjb21iaW5lIHRoZSBuZXh0IHR3byBVUkkgY29tcG9uZW50cy4KCQkJ CQlpZiAoJHR5cGUgPT0gJ2RhdGUnKQoJCQkJCQkkdXJpX2MgLj0gJy8nLmFycmF5X3NoaWZ0 KCR1cmlfY29tcG9uZW50cykuJy8nLmFycmF5X3NoaWZ0KCR1cmlfY29tcG9uZW50cyk7CgoJ CQkJCS8vIERlY29kZSB0aGUgVVJMCgkJCQkJJHVyaV9jID0gdXJsZGVjb2RlKCR1cmlfYyk7 CgoJCQkJCS8vIEFsd2F5cyBjaGVjayB0aGUgdHlwZSB1bmxlc3MgdGhlIHByZWZpeCBvciBz dWZmaXggYXJlbid0IHRoZXJlCgkJCQkJJGNoZWNrX3R5cGUgPSB0cnVlOwoKCQkJCQkvLyBD aGVjayBwcmVmaXgKCQkJCQlpZiAoJHByZWZpeCAmJiAkdGhpcy0+cHJlZignc2hvd19wcmVm aXgnKSkgewoJCQkJCQkkc2FuaXRpemVkX3ByZWZpeCA9IHVybGRlY29kZSgkdGhpcy0+ZW5j b2RlX3VybCgkcHJlZml4KSk7CgkJCQkJCWlmICgoJHBvcyA9IHN0cnBvcygkdXJpX2MsICRz YW5pdGl6ZWRfcHJlZml4KSkgPT09IGZhbHNlIHx8ICRwb3MgIT0gMCkgewoJCQkJCQkJJGNo ZWNrX3R5cGUgPSBmYWxzZTsKCQkJCQkJCSR0aGlzLT5kZWJ1ZygnQ2FuXCd0IGZpbmQgcHJl Zml4OiAnLiRwcmVmaXgpOwoJCQkJCQl9IGVsc2UKCQkJCQkJCS8vIENoZWNrIHBhc3NlZCwg cmVtb3ZlIHByZWZpeCByZWFkeSBmb3IgdGhlIG5leHQgY2hlY2sKCQkJCQkJCSR1cmlfYyA9 IHN1YnN0cl9yZXBsYWNlKCR1cmlfYywgJycsIDAsIHN0cmxlbigkc2FuaXRpemVkX3ByZWZp eCkpOwoJCQkJCX0KCgkJCQkJLy8gQ2hlY2sgc3VmZml4CgkJCQkJaWYgKCRjaGVja190eXBl ICYmICRzdWZmaXggJiYgJHRoaXMtPnByZWYoJ3Nob3dfc3VmZml4JykpIHsKCQkJCQkJJHNh bml0aXplZF9zdWZmaXggPSB1cmxkZWNvZGUoJHRoaXMtPmVuY29kZV91cmwoJHN1ZmZpeCkp OwoJCQkJCQlpZiAoKCRwb3MgPSBzdHJycG9zKCR1cmlfYywgJHNhbml0aXplZF9zdWZmaXgp KSA9PT0gZmFsc2UpIHsKCQkJCQkJCSRjaGVja190eXBlID0gZmFsc2U7CgkJCQkJCQkkdGhp cy0+ZGVidWcoJ0NhblwndCBmaW5kIHN1ZmZpeDogJy4kc3VmZml4KTsKCQkJCQkJfSBlbHNl CgkJCQkJCQkvLyBDaGVjayBwYXNzZWQsIHJlbW92ZSBzdWZmaXggcmVhZHkgZm9yIHRoZSBu ZXh0IGNoZWNrCgkJCQkJCQkkdXJpX2MgPSBzdWJzdHJfcmVwbGFjZSgkdXJpX2MsICcnLCAk cG9zLCBzdHJsZW4oJHNhbml0aXplZF9zdWZmaXgpKTsKCQkJCQl9CgoJCQkJCS8vIEJvdGgg dGhlIHByZWZpeCBhbmQgc3VmZml4IHNldHRpbmdzIGhhdmUgcGFzc2VkCgkJCQkJaWYgKCRj aGVja190eXBlKSB7CgkJCQkJCSR0aGlzLT5kZWJ1ZygnQ2hlY2tpbmcgaWYgIicuJHVyaV9j LiciIGlzIG9mIHR5cGUgIicuJHR5cGUuJyInKTsKCQkJCQkJJHVyaV9jID0gZG9TbGFzaCgk dXJpX2MpOwoKCQkJCQkJLy8KCQkJCQkJaWYgKCRwcmVmc1sncGVybWxpbmtfZm9ybWF0J10p IHsKCQkJCQkJCSRtdF9zZWFyY2ggPSBhcnJheSgnL18vJywgJy9cLmh0bWwkLycpOwoJCQkJ CQkJJG10X3JlcGxhY2UgPSBhcnJheSgnLScsICcnKTsKCQkJCQkJCSRtdF91cmlfYyA9ICR0 aGlzLT5wcmVmKCdyZWRpcmVjdF9tdF9zdHlsZV9saW5rcycpCgkJCQkJCQkJPyBwcmVnX3Jl cGxhY2UoJG10X3NlYXJjaCwgJG10X3JlcGxhY2UsICR1cmlfYykKCQkJCQkJCQk6ICcnOwoJ CQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gQ2FuJ3QgZmlndXJlIG91dCBob3cgdG8ga25vdyB3 aGljaCBvZiB0aGUgbXRfc2VhcmNoIGFycmF5cwoJCQkJCQkJLy8gdGhlIGNhbGxiYWNrIHJl Y2lldmVzLCBzbyBpdCdzIHNpbXBsZXIgdG8gY2FsbCBpdCB0d2ljZS4KCQkJCQkJCSRtdF9z ZWFyY2ggPSAnLyg/Ol58XykoLikvJzsKCQkJCQkJCSRtdF91cmlfYyA9ICR0aGlzLT5wcmVm KCdyZWRpcmVjdF9tdF9zdHlsZV9saW5rcycpCgkJCQkJCQkJPyBwcmVnX3JlcGxhY2VfY2Fs bGJhY2soJG10X3NlYXJjaCwKCQkJCQkJCQkJZnVuY3Rpb24oJG1hdGNoZXMpIHsKCQkJCQkJ CQkJCWlmICghZW1wdHkoJG1hdGNoZXNbMV0pKSB7CgkJCQkJCQkJCQkJcmV0dXJuIHN0cnRv dXBwZXIoJG1hdGNoZXNbMV1bMF0pOwoJCQkJCQkJCQkJfQoJCSAgICAJCQkJCQl9CgkJCQkJ CQkJCSwgJHVyaV9jKQoJCQkJCQkJOiAnJzsKCgkJCQkJCQkkbXRfc2VhcmNoID0gJy9cLmh0 bWwkLyc7CgkJCQkJCQkkbXRfcmVwbGFjZSA9ICcnOwoJCQkJCQkJJG10X3VyaV9jID0gJHRo aXMtPnByZWYoJ3JlZGlyZWN0X210X3N0eWxlX2xpbmtzJykKCQkJCQkJCQk/IHByZWdfcmVw bGFjZSgkbXRfc2VhcmNoLCAkbXRfcmVwbGFjZSwgJG10X3VyaV9jKQoJCQkJCQkJCTogJyc7 CgkJCQkJCX0KCgkJCQkJCS8vIENvbXBhcmUgYmFzZWQgb24gdHlwZQoJCQkJCQlzd2l0Y2gg KCR0eXBlKSB7CgkJCQkJCQljYXNlICdzZWN0aW9uJzoKCQkJCQkJCQlpZiAoJHJzID0gc2Fm ZV9yb3coJ25hbWUnLCAndHhwX3NlY3Rpb24nLCAiKGBuYW1lYCBsaWtlICckdXJpX2MnIG9y IGBuYW1lYCBsaWtlICckbXRfdXJpX2MnKSBsaW1pdCAxIikpIHsKCQkJCQkJCQkJJHRoaXMt PmRlYnVnKCdTZWN0aW9uIG5hbWU6ICcuJHJzWyduYW1lJ10pOwoJCQkJCQkJCQkkcHJldGV4 dF9yZXBsYWNlbWVudFsncyddID0gJHJzWyduYW1lJ107CgkJCQkJCQkJCSRjb250ZXh0W10g PSAiYFNlY3Rpb25gID0gJ3skcnNbJ25hbWUnXX0nIjsKCQkJCQkJCQkJJG1hdGNoID0gdHJ1 ZTsKCQkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ2NhdGVnb3J5JzoKCQkJ CQkJCQlpZiAoJHJzID0gc2FmZV9yb3coJ25hbWUnLCAndHhwX2NhdGVnb3J5JywgIihgbmFt ZWAgbGlrZSAnJHVyaV9jJyBvciBgbmFtZWAgbGlrZSAnJG10X3VyaV9jJykgYW5kIGB0eXBl YCA9ICdhcnRpY2xlJyBsaW1pdCAxIikpIHsKCQkJCQkJCQkJJHRoaXMtPmRlYnVnKCdDYXRl Z29yeSBuYW1lOiAnLiRyc1snbmFtZSddKTsKCQkJCQkJCQkJJHByZXRleHRfcmVwbGFjZW1l bnRbJ2MnXSA9ICRyc1snbmFtZSddOwoJCQkJCQkJCQkkY29udGV4dFtdID0gIihgQ2F0ZWdv cnkxYCA9ICd7JHJzWyduYW1lJ119JyBPUiBgQ2F0ZWdvcnkyYCA9ICckdXJpX2MnKSI7CgkJ CQkJCQkJCSRtYXRjaCA9IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQlj YXNlICd0aXRsZSc6CgkJCQkJCQkJaWYgKCRycyA9IHNhZmVfcm93KCd1cmxfdGl0bGUnLCAn dGV4dHBhdHRlcm4nLCAiKGB1cmxfdGl0bGVgIGxpa2UgJyR1cmlfYycgb3IgYHVybF90aXRs ZWAgbGlrZSAnJG10X3VyaV9jJykgJGNvbnRleHRfc3RyIGFuZCBgU3RhdHVzYCA+PSA0IGxp bWl0IDEiKSkgewoJCQkJCQkJCQkkdGhpcy0+ZGVidWcoJ1VSTCBUaXRsZTogJy4kcnNbJ3Vy bF90aXRsZSddKTsKCQkJCQkJCQkJJG10X3JlZGlyZWN0ID0gKCR1cmlfYyAhPSAkbXRfdXJp X2MpOwoJCQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFsndXJsX3RpdGxlJ10gPSAkcnNb J3VybF90aXRsZSddOwoJCQkJCQkJCQkkbWF0Y2ggPSB0cnVlOwoJCQkJCQkJCX0KCQkJCQkJ CWJyZWFrOwoJCQkJCQkJY2FzZSAnaWQnOgoJCQkJCQkJCWlmICgkcnMgPSBzYWZlX3Jvdygn SUQsIFBvc3RlZCcsICd0ZXh0cGF0dGVybicsICJgSURgID0gJyR1cmlfYycgJGNvbnRleHRf c3RyIGFuZCBgU3RhdHVzYCA+PSA0IGxpbWl0IDEiKSkgewoJCQkJCQkJCQkkcHJldGV4dF9y ZXBsYWNlbWVudFsnaWQnXSA9ICRyc1snSUQnXTsKCQkJCQkJCQkJJHByZXRleHRfcmVwbGFj ZW1lbnRbJ1Bvc3RlZCddID0gJHJzWydQb3N0ZWQnXTsKCQkJCQkJCQkJJHByZXRleHRbJ251 bVBhZ2VzJ10gPSAxOwoJCQkJCQkJCQkkcHJldGV4dFsnaXNfYXJ0aWNsZV9saXN0J10gPSBm YWxzZTsKCQkJCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJCQkJCQl9CgkJCQkJCQlicmVhazsK CQkJCQkJCWNhc2UgJ2F1dGhvcic6CgkJCQkJCQkJaWYgKCRhdXRob3IgPSBzYWZlX2ZpZWxk KCduYW1lJywgJ3R4cF91c2VycycsICJSZWFsTmFtZSBsaWtlICckdXJpX2MnIGxpbWl0IDEi KSkgewoJCQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFsnYXV0aG9yJ10gPSAkYXV0aG9y OwoJCQkJCQkJCQkkY29udGV4dFtdID0gImBBdXRob3JJRGAgPSAnJGF1dGhvciciOwoJCQkJ CQkJCQkkbWF0Y2ggPSB0cnVlOwoJCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2Fz ZSAnbG9naW4nOgoJCQkJCQkJCWlmICgkYXV0aG9yID0gc2FmZV9maWVsZCgnbmFtZScsICd0 eHBfdXNlcnMnLCAibmFtZSBsaWtlICckdXJpX2MnIGxpbWl0IDEiKSkgewoJCQkJCQkJCQkk cHJldGV4dF9yZXBsYWNlbWVudFsnYXV0aG9yJ10gPSAkYXV0aG9yOwoJCQkJCQkJCQkkY29u dGV4dFtdID0gImBBdXRob3JJRGAgPSAnJGF1dGhvciciOwoJCQkJCQkJCQkkbWF0Y2ggPSB0 cnVlOwoJCQkJCQkJCX0KCQkJCQkJCWJyZWFrOwoJCQkJCQkJY2FzZSAnY3VzdG9tJzoKCQkJ CQkJCQkkY3VzdG9tX29wdGlvbnMgPSBhcnJheV92YWx1ZXMoYXJyYXlfbWFwKGFycmF5KCR0 aGlzLCAiZW5jb2RlX3VybCIpLCBzYWZlX2NvbHVtbigiY3VzdG9tXyRjdXN0b20iLCAndGV4 dHBhdHRlcm4nLCAiY3VzdG9tXyRjdXN0b20gIT0gJyciKSkpOwoJCQkJCQkJCWlmICgkdGhp cy0+cHJlZignZm9yY2VfbG93ZXJjYXNlX3VybHMnKSkKCQkJCQkJCQkJJGN1c3RvbV9vcHRp b25zID0gYXJyYXlfbWFwKCJzdHJ0b2xvd2VyIiwgJGN1c3RvbV9vcHRpb25zKTsKCQkJCQkJ CQlpZiAoaW5fYXJyYXkoJHVyaV9jLCAkY3VzdG9tX29wdGlvbnMpKSB7CgkJCQkJCQkJCSRt YXRjaCA9IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdkYXRl JzoKCQkJCQkJCQlpZiAocHJlZ19tYXRjaCgnL15cZHs0fVwvXGR7Mn1cL1xkezJ9JC8nLCAk dXJpX2MpKSB7CgkJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydkYXRlJ10gPSBzdHJf cmVwbGFjZSgnLycsICctJywgJHVyaV9jKTsKCQkJCQkJCQkJJG1hdGNoID0gdHJ1ZTsKCQkJ CQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2UgJ3llYXInOgoJCQkJCQkJCWlmIChw cmVnX21hdGNoKCcvXlxkezR9JC8nLCAkdXJpX2MpKSB7CgkJCQkJCQkJCSRwcmV0ZXh0X3Jl cGxhY2VtZW50Wyd5ZWFyJ10gPSAkdXJpX2M7CgkJCQkJCQkJCSRtYXRjaCA9IHRydWU7CgkJ CQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdtb250aCc6CgkJCQkJCQljYXNl ICdkYXknOgoJCQkJCQkJCWlmIChwcmVnX21hdGNoKCcvXlxkezJ9JC8nLCAkdXJpX2MpKSB7 CgkJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WyR0eXBlXSA9ICR1cmlfYzsKCQkJCQkJ CQkJJG1hdGNoID0gdHJ1ZTsKCQkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJCWNhc2Ug J3BhZ2UnOgoJCQkJCQkJCWlmIChpc19udW1lcmljKCR1cmlfYykpIHsKCQkJCQkJCQkJJHBy ZXRleHRfcmVwbGFjZW1lbnRbJ3BnJ10gPSAkdXJpX2M7CgkJCQkJCQkJCSRtYXRjaCA9IHRy dWU7CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdmZWVkJzoKCQkJCQkJ CQlpZiAoaW5fYXJyYXkoJHVyaV9jLCBhcnJheSgncnNzJywgJ2F0b20nKSkpIHsKCQkJCQkJ CQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJHVyaV9jXSA9IDE7CgkJCQkJCQkJCSRtYXRjaCA9 IHRydWU7CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICdzZWFyY2gnOgoJ CQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFsncSddID0gJHVyaV9jOwoJCQkJCQkJCQkk bWF0Y2ggPSB0cnVlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCQljYXNlICd0ZXh0JzoKCQkJCQkJ CQlpZiAoJHRoaXMtPmVuY29kZV91cmwoJHRleHQpID09ICR1cmlfYykgewoJCQkJCQkJCQkk bWF0Y2ggPSB0cnVlOwoJCQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFsicGVybWxpbmtf dGV4dF97JG5hbWV9Il0gPSAkdXJpX2M7CgkJCQkJCQkJfQoJCQkJCQkJYnJlYWs7CgkJCQkJ CQljYXNlICdyZWdleCc6CgkJCQkJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHJlZ2V4IGlzIHZh bGlkIHdpdGhvdXQgb3V0cHV0dGluZyBlcnJvciBtZXNzYWdlcy4KCQkJCQkJCQlvYl9zdGFy dCgpOwoJCQkJCQkJCXByZWdfbWF0Y2goJHJlZ2V4LCAkdXJpX2MsICRyZWdleF9tYXRjaGVz KTsKCQkJCQkJCQkkaXNfdmFsaWRfcmVnZXggPSAhKG9iX2dldF9jbGVhbigpKTsKCQkJCQkJ CQlpZiAoJGlzX3ZhbGlkX3JlZ2V4ICYmIEAkcmVnZXhfbWF0Y2hlc1swXSkgewoJCQkJCQkJ CQkkbWF0Y2ggPSB0cnVlOwoJCQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFsicGVybWxp bmtfcmVnZXhfeyRuYW1lfSJdID0gJHJlZ2V4X21hdGNoZXNbMF07CgkJCQkJCQkJfQoJCQkJ CQkJYnJlYWs7CgkJCQkJCX0gLy8gc3dpdGNoIHR5cGUgZW5kCgoJCQkJCQkvLyBVcGRhdGUg dGhlIGFydGljbGUgY29udGV4dCBzdHJpbmcKCQkJCQkJJGNvbnRleHRfc3RyID0gKGNvdW50 KCRjb250ZXh0KSA+IDAgPyAnYW5kICcuam9pbignIGFuZCAnLCAkY29udGV4dCkgOiAnJyk7 CgoJCQkJCQkkdGhpcy0+ZGVidWcoKCRtYXRjaCA9PSB0cnVlKSA/ICdZRVMnIDogJ05PJyk7 CgoJCQkJCQlpZiAoISRtYXRjaCAmJiAhJGNsZWF2ZXJfcGFydGlhbF9tYXRjaCAmJiAkdGhp cy0+cHJlZigndXNlX2NsZWF2ZXJfcGFydGlhbF9tYXRjaGVzJykpIHsKCQkJCQkJCS8vIFRo ZXJlIGhhc24ndCBiZWVuIGEgbWF0Y2ggb3IgYSBjb21wbGV0ZSBjbGVhdmVyIHBhcnRpYWwg bWF0Y2guIExldHMgdHJ5IHRvIGJlIGNsZWF2ZXIgYW5kCgkJCQkJCQkvLyBjaGVjayB0byBz ZWUgaWYgdGhpcyBjb21wb25lbnQgaXMgZWl0aGVyIGEgdGl0bGUsIHBhZ2Ugb3IgYSBmZWVk LiBUaGlzIG1ha2VzIGl0IG1vcmUgcHJvYmFibGUKCQkJCQkJCS8vIGEgc3VjY2Vzc2Z1bCBt YXRjaCBmb3IgYSBnaXZlbiBwZXJtbGluayBydWxlIG9jY3Vycy4KCQkJCQkJCSR0aGlzLT5k ZWJ1ZygnQ2hlY2tpbmcgaWYgIicuJHVyaV9jLiciIGlzIG9mIHR5cGUgInRpdGxlX3BhZ2Vf ZmVlZCInKTsKCgkJCQkJCQlpZiAoJHR5cGUgIT0gJ3RpdGxlJyAmJiAkdXJsX3RpdGxlID0g c2FmZV9maWVsZCgndXJsX3RpdGxlJywgJ3RleHRwYXR0ZXJuJywgImB1cmxfdGl0bGVgIGxp a2UgJyR1cmlfYycgJGNvbnRleHRfc3RyIGFuZCBgU3RhdHVzYCA+PSA0IGxpbWl0IDEiKSkg ewoJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50Wyd1cmxfdGl0bGUnXSA9ICR1cmxfdGl0 bGU7CgkJCQkJCQkJJHByZXRleHRbJ251bVBhZ2VzJ10gPSAxOwoJCQkJCQkJCSRwcmV0ZXh0 Wydpc19hcnRpY2xlX2xpc3QnXSA9IGZhbHNlOwoJCQkJCQkJCSRjbGVhdmVyX3BhcnRpYWxf bWF0Y2ggPSB0cnVlOwoJCQkJCQkJfSBlbHNlIGlmICgkdGhpcy0+cHJlZignY2xlYW5fcGFn ZV9hcmNoaXZlX2xpbmtzJykgJiYgJHR5cGUgIT0gJ3BhZ2UnICYmIGlzX251bWVyaWMoJHVy aV9jKSkgewoJCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydwZyddID0gJHVyaV9jOwoJ CQkJCQkJCSRjbGVhdmVyX3BhcnRpYWxfbWF0Y2ggPSB0cnVlOwoJCQkJCQkJfSBlbHNlIGlm ICgkdHlwZSAhPSAnZmVlZCcgJiYgaW5fYXJyYXkoJHVyaV9jLCBhcnJheSgncnNzJywgJ2F0 b20nKSkpIHsKCQkJCQkJCQkkcHJldGV4dF9yZXBsYWNlbWVudFskdXJpX2NdID0gMTsKCQkJ CQkJCQkkY2xlYXZlcl9wYXJ0aWFsX21hdGNoID0gdHJ1ZTsKCQkJCQkJCX0KCgkJCQkJCQkk dGhpcy0+ZGVidWcoKCRjbGVhdmVyX3BhcnRpYWxfbWF0Y2ggPT0gdHJ1ZSkgPyAnWUVTJyA6 ICdOTycpOwoKCQkJCQkJCWlmICgkY2xlYXZlcl9wYXJ0aWFsX21hdGNoKSB7CgkJCQkJCQkJ JHRoaXMtPmNsZWF2ZXJfcGFydGlhbF9tYXRjaCA9ICRwcmV0ZXh0X3JlcGxhY2VtZW50OwoK CQkJCQkJCQkvLyBVbnNldCBwcmV0ZXh0X3JlcGxhY2VtZW50IGFzIGNoYW5nZXMgY291bGQg b2YgYmVlbiBtYWRlIGluIGEgcHJlY2VkaW5nIGNvbXBvbmVudAoJCQkJCQkJCXVuc2V0KCRw cmV0ZXh0X3JlcGxhY2VtZW50KTsKCgkJCQkJCQkJJGNsZWF2ZXJfcGFydGlhbF9tYXRjaCA9 IHRydWU7CgkJCQkJCQkJY29udGludWUgMjsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0gLy8g Y2hlY2sgdHlwZSBlbmQKCgkJCQkJLy8gQnJlYWsgZWFybHkgaWYgdGhlIGNvbXBvbmVudCBk b2Vzbid0IG1hdGNoLCBhcyB0aGVyZSBpcyBubyBwb2ludCBjb250aW51aW5nCgkJCQkJaWYg KCRtYXRjaCA9PSBmYWxzZSkgewoJCQkJCQkvLyBVbnNldCBwcmV0ZXh0X3JlcGxhY2VtZW50 IGFzIGNoYW5nZXMgY291bGQgb2YgYmVlbiBtYWRlIGluIGEgcHJlY2VkaW5nIGNvbXBvbmVu dAoJCQkJCQl1bnNldCgkcHJldGV4dF9yZXBsYWNlbWVudCk7CgkJCQkJCWJyZWFrOwoJCQkJ CX0KCQkJCX0gLy8gZm9yZWFjaCBwZXJtbGluayBjb21wb25lbnQgZW5kCgoJCQkJaWYgKCFp c3NldCgkcHJldGV4dF9yZXBsYWNlbWVudFsnaWQnXSkpIHsKCQkJCQlpZiAoaXNzZXQoJHBy ZXRleHRfcmVwbGFjZW1lbnRbJ3VybF90aXRsZSddKSkgewoJCQkJCQlpZiAoaXNzZXQoJHBy ZXRleHRfcmVwbGFjZW1lbnRbJ2RhdGUnXSkpIHsKCQkJCQkJCSRkYXRlX3ZhbCA9ICRwcmV0 ZXh0X3JlcGxhY2VtZW50WydkYXRlJ107CgkJCQkJCX0gZWxzZSBpZiAoaXNzZXQoJHByZXRl eHRfcmVwbGFjZW1lbnRbJ3llYXInXSkpIHsKCQkJCQkJCSRkYXRlX3ZhbCA9ICRwcmV0ZXh0 X3JlcGxhY2VtZW50Wyd5ZWFyJ107CgkJCQkJCQlpZiAoaXNzZXQoJHByZXRleHRfcmVwbGFj ZW1lbnRbJ21vbnRoJ10pKSB7CgkJCQkJCQkJJGRhdGVfdmFsIC49ICctJyAuICRwcmV0ZXh0 X3JlcGxhY2VtZW50Wydtb250aCddOwoJCQkJCQkJCWlmIChpc3NldCgkcHJldGV4dF9yZXBs YWNlbWVudFsnZGF5J10pKSB7CgkJCQkJCQkJCSRkYXRlX3ZhbCAuPSAnLScgLiAkcHJldGV4 dF9yZXBsYWNlbWVudFsnZGF5J107CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJ CWlmIChpc3NldCgkZGF0ZV92YWwpKQoJCQkJCQkJJGNvbnRleHRfc3RyIC49ICIgYW5kIGBQ b3N0ZWRgIGxpa2UgJyRkYXRlX3ZhbCUnIjsKCQkJCQkJaWYgKCRycyA9IHNhZmVfcm93KCdJ RCwgUG9zdGVkJywgJ3RleHRwYXR0ZXJuJywgImB1cmxfdGl0bGVgIGxpa2UgJ3skcHJldGV4 dF9yZXBsYWNlbWVudFsndXJsX3RpdGxlJ119JyAkY29udGV4dF9zdHIgYW5kIGBTdGF0dXNg ID49IDQgb3JkZXIgYnkgYFBvc3RlZGAgZGVzYyBsaW1pdCAxIikpIHsKCQkJCQkJCWlmIChp c3NldCgkZGF0ZV92YWwpKQoJCQkJCQkJCSR0aGlzLT5kZWJ1ZygnRm91bmQgZGF0ZSBhbmQg dGl0bGUtYmFzZWQgbWF0Y2guJyk7CgkJCQkJCQllbHNlCgkJCQkJCQkJJHRoaXMtPmRlYnVn KCdGb3VuZCB0aXRsZS1iYXNlZCBtYXRjaC4nKTsKCQkJCQkJCSRwcmV0ZXh0X3JlcGxhY2Vt ZW50WydpZCddID0gJHJzWydJRCddOwoJCQkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ1Bv c3RlZCddID0gJHJzWydQb3N0ZWQnXTsKCQkJCQkJCSRwcmV0ZXh0WydudW1QYWdlcyddID0g MTsKCQkJCQkJCSRwcmV0ZXh0Wydpc19hcnRpY2xlX2xpc3QnXSA9IGZhbHNlOwoJCQkJCQl9 IGVsc2UgewoJCQkJCQkJJG1hdGNoID0gZmFsc2U7CgkJCQkJCQl1bnNldCgkcHJldGV4dF9y ZXBsYWNlbWVudCk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCRtYXRjaCB8fCAk cGFydGlhbF9tYXRjaCB8fCAkY2xlYXZlcl9wYXJ0aWFsX21hdGNoKSB7CgkJCQkJLy8gRXh0 cmFjdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgcGVybWxpbmsKCQkJCQlAZXh0cmFjdCgkcGVy bWxpbmtzWyRwcmV0ZXh0X3JlcGxhY2VtZW50WydwZXJtbGlua19pZCddXVsnc2V0dGluZ3Mn XSk7CgoJCQkJCS8vIENoZWNrIHRoZSBwZXJtbGluayBzZWN0aW9uIGFuZCBjYXRlZ29yeSBj b25kaXRpb25zCgkJCQkJaWYgKCghZW1wdHkoJGNvbl9zZWN0aW9uKSAmJiAkY29uX3NlY3Rp b24gIT0gQCRwcmV0ZXh0X3JlcGxhY2VtZW50WydzJ10pIHx8CgkJCQkJKCFlbXB0eSgkY29u X2NhdGVnb3J5KSAmJiAkY29uX2NhdGVnb3J5ICE9IEAkcHJldGV4dF9yZXBsYWNlbWVudFsn YyddKSkgewoJCQkJCQkkdGhpcy0+ZGVidWcoJ1Blcm1saW5rIGNvbmRpdGlvbnMgZmFpbGVk Jyk7CgkJCQkJCWlmIChAJGNvbl9zZWN0aW9uKSAgJHRoaXMtPmRlYnVnKCdjb25fc2VjdGlv biA9ICcuICRjb25fc2VjdGlvbik7CgkJCQkJCWlmIChAJGNvbl9jYXRlZ29yeSkgJHRoaXMt PmRlYnVnKCdjb25fY2F0ZWdvcnkgPSAnLiAkY29uX2NhdGVnb3J5KTsKCgkJCQkJCXVuc2V0 KCRwcmV0ZXh0X3JlcGxhY2VtZW50KTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoJG1hdGNoICYm IGlzc2V0KCRwcmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJCQkJJHRoaXMtPmRlYnVnKCdXZSBo YXZlIGEgbWF0Y2ghJyk7CgoJCQkJCWVsc2UgaWYgKCRwYXJ0aWFsX21hdGNoICYmIGNvdW50 KCR0aGlzLT5wYXJ0aWFsX21hdGNoZXMpKQoJCQkJCQkkdGhpcy0+ZGVidWcoJ1dlIGhhdmUg YSBcJ3BhcnRpYWwgbWF0Y2hcJycpOwoKCQkJCQllbHNlIGlmICgkY2xlYXZlcl9wYXJ0aWFs X21hdGNoICYmIGlzc2V0KCRjbGVhdmVyX3BhcnRpYWxfbWF0Y2gpKQoJCQkJCQkkdGhpcy0+ ZGVidWcoJ1dlIGhhdmUgYSBcJ2NsZWF2ZXIgcGFydGlhbCBtYXRjaFwnJyk7CgoJCQkJCWVs c2UgewoJCQkJCQkkdGhpcy0+ZGVidWcoJ0Vycm9yOiBDYW5cJ3QgZGV0ZXJtaW5lIHRoZSBj b3JyZWN0IHR5cGUgbWF0Y2gnKTsKCQkJCQkJLy8gVGhpcyBwZXJtbGluayBoYXMgZmFpbGVk LCBjb250aW51ZSBleGVjdXRpb24gb2YgdGhlIGZvcmVhY2ggcGVybWxpbmtzIGxvb3AKCQkJ CQkJdW5zZXQoJHByZXRleHRfcmVwbGFjZW1lbnQpOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBX ZSBoYXZlIGEgbWF0Y2gKCQkJCWlmIChAJHByZXRleHRfcmVwbGFjZW1lbnQpCgkJCQkJYnJl YWs7CgoJCQl9IC8vIGZvcmVhY2ggcGVybWxpbmtzIGVuZAoKCQkJLy8gSWYgdGhlcmUgaXMg bm8gbWF0Y2ggcmVzdG9yZSB0aGUgbW9zdCBsaWtlbHkgcGFydGlhbCBtYXRjaC4gU29ydGVk IGJ5IG51bWJlciBvZiBjb21wb25lbnRzIGFuZCB0aGVuIHByZWNlZGVuY2UKCQkJaWYgKCFA JHByZXRleHRfcmVwbGFjZW1lbnQgJiYgY291bnQoJHRoaXMtPnBhcnRpYWxfbWF0Y2hlcykp IHsKCQkJCSRwdF9zbGljZSA9IGFycmF5X3NsaWNlKCR0aGlzLT5wYXJ0aWFsX21hdGNoZXMs IC0xKTsKCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50ID0gYXJyYXlfc2hpZnQoJHB0X3NsaWNl KTsKCQkJfQoJCQl1bnNldCgkdGhpcy0+cGFydGlhbF9tYXRjaGVzKTsKCgkJCS8vIFJlc3Rv cmUgdGhlIGNsZWF2ZXJfcGFydGlhbF9tYXRjaCBpZiB0aGVyZSBpcyBubyBvdGhlciBtYXRj aGVzCgkJCWlmICghQCRwcmV0ZXh0X3JlcGxhY2VtZW50ICYmICR0aGlzLT5jbGVhdmVyX3Bh cnRpYWxfbWF0Y2gpCgkJCQkkcHJldGV4dF9yZXBsYWNlbWVudCA9ICR0aGlzLT5jbGVhdmVy X3BhcnRpYWxfbWF0Y2g7CgkJCXVuc2V0KCR0aGlzLT5jbGVhdmVyX3BhcnRpYWxfbWF0Y2gp OwoKCQkJLy8gRXh0cmFjdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgcGVybWxpbmsKCQkJQGV4 dHJhY3QoJHBlcm1saW5rc1skcHJldGV4dF9yZXBsYWNlbWVudFsncGVybWxpbmtfaWQnXV1b J3NldHRpbmdzJ10pOwoKCQkJLy8gSWYgcHJldGV4dF9yZXBsYWNlbWVudCBpcyBzdGlsbCBz ZXQgaGVyZSB0aGVuIHdlIGhhdmUgYSBtYXRjaAoJCQlpZiAoQCRwcmV0ZXh0X3JlcGxhY2Vt ZW50KSB7CgkJCQkkdGhpcy0+ZGVidWcoJ1ByZXRleHQgUmVwbGFjZW1lbnQgJy5wcmludF9y KCRwcmV0ZXh0X3JlcGxhY2VtZW50LCAxKSk7CgoJCQkJaWYgKCFlbXB0eSgkZGVzX3NlY3Rp b24pKQoJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydzJ10gPSAkZGVzX3NlY3Rpb247CgkJ CQlpZiAoIWVtcHR5KCRkZXNfY2F0ZWdvcnkpKQoJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50 WydjJ10gPSAkZGVzX2NhdGVnb3J5OwoJCQkJaWYgKCFlbXB0eSgkZGVzX2ZlZWQpKQoJCQkJ CSRwcmV0ZXh0X3JlcGxhY2VtZW50WyRkZXNfZmVlZF0gPSAxOwoKCQkJCWlmIChAJHByZXRl eHRfcmVwbGFjZW1lbnRbJ2lkJ10gJiYgQCRwcmV0ZXh0X3JlcGxhY2VtZW50WydQb3N0ZWQn XSkgewoJCQkJCWlmICgkbnAgPSBnZXROZXh0UHJldigkcHJldGV4dF9yZXBsYWNlbWVudFsn aWQnXSwgJHByZXRleHRfcmVwbGFjZW1lbnRbJ1Bvc3RlZCddLCBAJHByZXRleHRfcmVwbGFj ZW1lbnRbJ3MnXSkpCgkJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50ID0gYXJyYXlfbWVyZ2Uo JHByZXRleHRfcmVwbGFjZW1lbnQsICRucCk7CgkJCQl9CgkJCQl1bnNldCgkcHJldGV4dF9y ZXBsYWNlbWVudFsnUG9zdGVkJ10pOwoKCQkJCS8vIElmIHRoZXJlIGlzIGEgbWF0Y2ggdGhl biB3ZSBtb3N0IHNldCB0aGUgaHR0cCBzdGF0dXMgY29ycmVjdGx5IGFzIHR4cCdzIHByZXRl eHQgbWlnaHQgc2V0IGl0IHRvIDQwNAoJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ3N0YXR1 cyddID0gJzIwMCc7CgoJCQkJLy8gU3RvcmUgdGhlIG9yZ2luaWFsIEhUVFAgc3RhdHVzIGNv ZGUKCQkJCS8vIFdlIG1pZ2h0IG5lZWQgdG8gbG9nIHRoZSBwYWdlIGhpdCBpZiBpdCBlcXVh bHMgNDA0CgkJCQkkb3JnaW5pYWxfc3RhdHVzID0gJHByZXRleHRbJ3N0YXR1cyddOwoKCQkJ CS8vIFR4cCBvbmx5IGxvb2tzIGF0IHRoZSBtb250aCwgYnV0IGR1ZSB0byBob3cgd2UgcGhh c2UgdGhlIG1vbnRoIHdlIGNhbiBtYW5pcHVsYXRlIHRoZSBzcWwgdG8gb3VyIG5lZWRzCgkJ CQlpZiAoYXJyYXlfa2V5X2V4aXN0cygnZGF0ZScsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkg ewoJCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50Wydtb250aCddID0gJHByZXRleHRfcmVwbGFj ZW1lbnRbJ2RhdGUnXTsKCQkJCQl1bnNldCgkcHJldGV4dF9yZXBsYWNlbWVudFsnZGF0ZSdd KTsKCQkJCX0gZWxzZSBpZiAoYXJyYXlfa2V5X2V4aXN0cygneWVhcicsICRwcmV0ZXh0X3Jl cGxhY2VtZW50KSB8fAoJCQkJYXJyYXlfa2V5X2V4aXN0cygnbW9udGgnLCAkcHJldGV4dF9y ZXBsYWNlbWVudCkgfHwKCQkJCWFycmF5X2tleV9leGlzdHMoJ2RheScsICRwcmV0ZXh0X3Jl cGxhY2VtZW50KSkgewoJCQkJCSRtb250aCA9ICcnOwoJCQkJCSRtb250aCAuPSAoYXJyYXlf a2V5X2V4aXN0cygneWVhcicsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJCQkJPyAkcHJl dGV4dF9yZXBsYWNlbWVudFsneWVhciddLictJyA6ICdfX19fLSc7CgkJCQkJJG1vbnRoIC49 IChhcnJheV9rZXlfZXhpc3RzKCdtb250aCcsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJ CQkJPyAkcHJldGV4dF9yZXBsYWNlbWVudFsnbW9udGgnXS4nLScgOiAnX18tJzsKCQkJCQkk bW9udGggLj0gKGFycmF5X2tleV9leGlzdHMoJ2RheScsICRwcmV0ZXh0X3JlcGxhY2VtZW50 KSkKCQkJCQkJPyAkcHJldGV4dF9yZXBsYWNlbWVudFsnZGF5J10uJyAnIDogJ19fICc7CgoJ CQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50Wydtb250aCddID0gJG1vbnRoOwoJCQkJCXVuc2V0 KCRwcmV0ZXh0X3JlcGxhY2VtZW50Wyd5ZWFyJ10pOwoJCQkJCXVuc2V0KCRwcmV0ZXh0X3Jl cGxhY2VtZW50WydkYXknXSk7CgkJCQl9CgoJCQkJLy8gU2VjdGlvbiBuZWVkcyB0byBiZSBk ZWZpbmVkIHNvIHdlIGNhbiBhbHdheXMgZ2V0IGEgcGFnZSB0ZW1wbGF0ZS4KCQkJCWlmICgh YXJyYXlfa2V5X2V4aXN0cygncycsICRwcmV0ZXh0X3JlcGxhY2VtZW50KSkKCQkJCXsKCQkJ CQlpZiAoIUAkcHJldGV4dF9yZXBsYWNlbWVudFsnaWQnXSkKCQkJCQkJJHByZXRleHRfcmVw bGFjZW1lbnRbJ3MnXSA9ICdkZWZhdWx0JzsKCQkJCQllbHNlCgkJCQkJCSRwcmV0ZXh0X3Jl cGxhY2VtZW50WydzJ10gPSBzYWZlX2ZpZWxkKCdTZWN0aW9uJywgJ3RleHRwYXR0ZXJuJywg J0lEID0gJy4kcHJldGV4dF9yZXBsYWNlbWVudFsnaWQnXSk7CgkJCQl9CgoJCQkJLy8gU2V0 IHRoZSBjc3MgYW5kIHBhZ2UgdGVtcGxhdGUsIG90aGVyd2lzZSB3ZSBnZXQgYW4gdW5rbm93 biBzZWN0aW9uCgkJCQkkc2VjdGlvbl9zZXR0aW5ncyA9IHNhZmVfcm93KCdjc3MsIHBhZ2Un LCAndHhwX3NlY3Rpb24nLCAibmFtZSA9ICd7JHByZXRleHRfcmVwbGFjZW1lbnRbJ3MnXX0n IGxpbWl0IDEiKTsKCQkJCSRwcmV0ZXh0X3JlcGxhY2VtZW50WydwYWdlJ10gPSAoQCRkZXNf cGFnZSkgPyAkZGVzX3BhZ2UgOiAkc2VjdGlvbl9zZXR0aW5nc1sncGFnZSddOwoJCQkJJHBy ZXRleHRfcmVwbGFjZW1lbnRbJ2NzcyddICA9ICRzZWN0aW9uX3NldHRpbmdzWydjc3MnXTsK CgkJCQkkdGhpcy0+bWF0Y2hlZF9wZXJtbGluayA9ICRwcmV0ZXh0X3JlcGxhY2VtZW50OwoK CQkJCWdsb2JhbCAkcGVybWxpbmtfbW9kZTsKCgkJCQlpZiAoaW5fYXJyYXkoJHByZWZzWydw ZXJtbGlua19tb2RlJ10sIGFycmF5KCdpZF90aXRsZScsICdzZWN0aW9uX2lkX3RpdGxlJykp ICYmIEAkcHJldGV4dF9yZXBsYWNlbWVudFsncGcnXSAmJiAhQCRwcmV0ZXh0X3JlcGxhY2Vt ZW50WydpZCddKSB7CgkJCQkJJHByZXRleHRfcmVwbGFjZW1lbnRbJ2lkJ10gPSAnJzsKCQkJ CQkkcHJldGV4dF9yZXBsYWNlbWVudFsnaXNfYXJ0aWNsZV9saXN0J10gPSB0cnVlOwoJCQkJ fQoKCQkJCS8vIE1lcmdlIHByZXRleHRfcmVwbGFjZW1lbnQgd2l0aCBwcmV0ZXh0CgkJCQkk cHJldGV4dCA9IGFycmF5X21lcmdlKCRwcmV0ZXh0LCAkcHJldGV4dF9yZXBsYWNlbWVudCk7 CgoJCQkJaWYgKGlzX251bWVyaWMoQCRwcmV0ZXh0WydpZCddKSkgewoJCQkJCSRhID0gc2Fm ZV9yb3coJyosIHVuaXhfdGltZXN0YW1wKFBvc3RlZCkgYXMgdVBvc3RlZCwgdW5peF90aW1l c3RhbXAoRXhwaXJlcykgYXMgdUV4cGlyZXMsIHVuaXhfdGltZXN0YW1wKExhc3RNb2QpIGFz IHVMYXN0TW9kJywgJ3RleHRwYXR0ZXJuJywgJ0lEPScuaW50dmFsKCRwcmV0ZXh0WydpZCdd KS4nIGFuZCBTdGF0dXMgPj0gNCcpOwoJCQkJCXBvcHVsYXRlQXJ0aWNsZURhdGEoJGEpOwoJ CQkJfQoKCQkJCS8vIEV4cG9ydCByZXF1aXJlZCB2YWx1ZXMgdG8gdGhlIGdsb2JhbCBuYW1l c3BhY2UKCQkJCWZvcmVhY2ggKGFycmF5KCdpZCcsICdzJywgJ2MnLCAncGcnLCAnaXNfYXJ0 aWNsZV9saXN0JywgJ3ByZXZfaWQnLCAncHJldl90aXRsZScsICduZXh0X2lkJywgJ25leHRf dGl0bGUnLCAnY3NzJykgYXMgJGtleSkgewoJCQkJCWlmIChhcnJheV9rZXlfZXhpc3RzKCRr ZXksICRwcmV0ZXh0KSkKCQkJCQkJJEdMT0JBTFNbJGtleV0gPSAkcHJldGV4dFska2V5XTsK CQkJCX0KCgkJCQlpZiAoY291bnQoJHRoaXMtPm1hdGNoZWRfcGVybWxpbmspIHx8IEAkbXRf cmVkaXJlY3QpIHsKCQkJCQkkcGxfaW5kZXggPSAkcHJldGV4dFsncGVybWxpbmtfaWQnXTsK CQkJCQlpZiAoIUAkbXRfcmVkaXJlY3QgfHwgISR0aGlzLT5wcmVmKCdyZWRpcmVjdF9tdF9z dHlsZV9saW5rcycpKSB7CgkJCQkJCSRwbCA9ICR0aGlzLT5nZXRfcGVybWxpbmsoJHByZXRl eHRbJ3Blcm1saW5rX2lkJ10pOwoJCQkJCQkkcGxfaW5kZXggPSBAJHBsWydzZXR0aW5ncydd WydkZXNfcGVybWxpbmsnXTsKCQkJCQl9CgoJCQkJCWlmIChAJHByZXRleHRbJ2lkJ10gJiYg JHBsX2luZGV4KSB7CgkJCQkJCWlmIChjb3VudCgkdGhpcy0+Z2V0X3Blcm1saW5rKCRwbF9p bmRleCkpID4gMCkgewoJCQkJCQkJb2JfY2xlYW4oKTsKCQkJCQkJCWdsb2JhbCAkc2l0ZXVy bDsKCQkJCQkJCSRycyA9IHNhZmVfcm93KCcqLCBJRCBhcyB0aGlzaWQsIHVuaXhfdGltZXN0 YW1wKFBvc3RlZCkgYXMgcG9zdGVkJywgJ3RleHRwYXR0ZXJuJywgIklEID0gJ3skcHJldGV4 dFsnaWQnXX0nIik7CgkJCQkJCQkkaG9zdCA9IHJ0cmltKHN0cl9yZXBsYWNlKHJ0cmltKGRv U3RyaXAoJHByZXRleHRbJ3N1YnBhdGgnXSksICcvJyksICcnLCBodSksICcvJyk7CgkJCQkJ CQkkdGhpcy0+cmVkaXJlY3QoJGhvc3QuJHRoaXMtPl9wZXJtbGlua3VybCgkcnMsIFBFUk1M SU5LVVJMLCAkcGxfaW5kZXgpLCAkdGhpcy0+cHJlZigncGVybWxpbmtfcmVkaXJlY3RfaHR0 cF9zdGF0dXMnKSk7CgkJCQkJCX0KCQkJCQl9IGVsc2UgaWYgKCR1cmwgPSBAJHBsWydzZXR0 aW5ncyddWydkZXNfbG9jYXRpb24nXSkgewoJCQkJCQlvYl9jbGVhbigpOwoJCQkJCQkkdGhp cy0+cmVkaXJlY3QoJHVybCwgJHRoaXMtPnByZWYoJ3VybF9yZWRpcmVjdF9odHRwX3N0YXR1 cycpKTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKEAkcHJldGV4dFsncnNzJ10pIHsKCQkJCQlp ZiAoQCRwcmV0ZXh0WydzJ10pCgkJCQkJCSRfUE9TVFsnc2VjdGlvbiddID0gJHByZXRleHRb J3MnXTsKCQkJCQlpZiAoQCRwcmV0ZXh0WydjJ10pCgkJCQkJCSRfUE9TVFsnY2F0ZWdvcnkn XSA9ICRwcmV0ZXh0WydjJ107CgkJCQkJb2JfY2xlYW4oKTsKCQkJCQlpbmNsdWRlIHR4cGF0 aC4nL3B1Ymxpc2gvcnNzLnBocCc7CgkJCQkJZXhpdChyc3MoKSk7CgkJCQl9CgoJCQkJaWYg KEAkcHJldGV4dFsnYXRvbSddKSB7CgkJCQkJaWYgKEAkcHJldGV4dFsncyddKQoJCQkJCQkk X1BPU1RbJ3NlY3Rpb24nXSA9ICRwcmV0ZXh0WydzJ107CgkJCQkJaWYgKEAkcHJldGV4dFsn YyddKQoJCQkJCQkkX1BPU1RbJ2NhdGVnb3J5J10gPSAkcHJldGV4dFsnYyddOwoJCQkJCW9i X2NsZWFuKCk7CgkJCQkJaW5jbHVkZSB0eHBhdGguJy9wdWJsaXNoL2F0b20ucGhwJzsKCQkJ CQlleGl0KGF0b20oKSk7CgkJCQl9CgoJCQkJJHRoaXMtPmRlYnVnKCdQcmV0ZXh0ICcucHJp bnRfcigkcHJldGV4dCwgMSkpOwoJCQl9IGVsc2UgewoJCQkJJHRoaXMtPmRlYnVnKCdOTyBD SEFOR0VTIE1BREUnKTsKCQkJfQoKCQkJLy8gTG9nIHRoaXMgcGFnZSBoaXQKCQkJaWYgKEAk b3JnaW5pYWxfc3RhdHVzID09IDQwNCkKCQkJCWxvZ19oaXQoJHByZXRleHRbJ3N0YXR1cydd KTsKCgkJCS8vIFN0YXJ0IG91dHB1dCBidWZmZXJpbmcgYW5kIHBzZXVkbyBjYWxsYmFjayB0 byB0ZXh0cGF0dGVybl9lbmQKCQkJb2Jfc3RhcnQoYXJyYXkoJiR0aGlzLCAnX3RleHRwYXR0 ZXJuX2VuZF9jYWxsYmFjaycpKTsKCgkJCS8vIFR4UCA0LjAuNSAocjI0MzYpIGludHJvZHVj ZWQgdGhlIHRleHRwYXR0ZXJuX2VuZCBjYWxsYmFjayBtYWtpbmcgdGhlIGZvbGxvd2luZyBy ZWR1bmRhbnQKCQkJJHZlcnNpb24gPSBhcnJheV9zdW0oYXJyYXlfbWFwKAoJCQkJY3JlYXRl X2Z1bmN0aW9uKCckbGluZScsICdpZiAocHJlZ19tYXRjaChcJy9eXCQnLidMYXN0Q2hhbmdl ZFJldmlzaW9uOiAoXHcrKSBcJC9cJywgJGxpbmUsICRtYXRjaCkpIHJldHVybiAkbWF0Y2hb MV07JyksCgkJCQlAZmlsZSh0eHBhdGggLiAnL3B1Ymxpc2gucGhwJykKCQkJKSk7CgkJCWlm ICgkdmVyc2lvbiA+PSAnMjQzNicpIHJldHVybjsKCgkJCS8vIFJlbW92ZSB0aGUgcGx1Z2lu IGNhbGxiYWNrcyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQKCQkJZnVuY3Rpb24g ZmlsdGVyX2NhbGxiYWNrcygkYykgewoJCQkJaWYgKCRjWydldmVudCddIT0ndGV4dHBhdHRl cm4nKSByZXR1cm4gdHJ1ZTsKCQkJCWlmIChAJGNbJ2Z1bmN0aW9uJ11bMF0tPnBsdWdpbl9u YW1lID09ICdnYnBfcGVybWFuZW50X2xpbmtzJyAmJgoJCQkJCQlAJGNbJ2Z1bmN0aW9uJ11b MV0gPT0gJ190ZXh0cGF0dGVybicpCgkJCQl7CgkJCQkJJEdMT0JBTFNbJ2dicF9mb3VuZF9z ZWxmJ10gPSB0cnVlOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJCXJldHVybiBAJEdM T0JBTFNbJ2dicF9mb3VuZF9zZWxmJ107CgkJCX0KCQkJJHBsdWdpbl9jYWxsYmFjayA9IGFy cmF5X2ZpbHRlcigkcGx1Z2luX2NhbGxiYWNrLCAnZmlsdGVyX2NhbGxiYWNrcycpOwoJCQl1 bnNldCgkR0xPQkFMU1snZ2JwX2ZvdW5kX3NlbGYnXSk7CgoJCQkvLyBSZS1jYWxsIHRleHRw YXR0ZXJuCgkJCXRleHRwYXR0ZXJuKCk7CgoJCQkvLyBDYWxsIGN1c3RvbSB0ZXh0cGF0dGVy bl9lbmQgY2FsbGJhY2sKCQkJJHRoaXMtPl90ZXh0cGF0dGVybl9lbmQoKTsKCgkJCS8vIHRl eHRwYXR0ZXJuKCkgaGFzIHJ1biwga2lsbCB0aGUgY29ubmVjdGlvbgoJCQlkaWUoKTsKCQl9 CgoJfSAvLyBmdW5jdGlvbiBfdGV4dHBhdHRlcm4gZW5kCgoJZnVuY3Rpb24gX3RleHRwYXR0 ZXJuX2VuZCAoKSB7CgkJLy8gUmVkaXJlY3QgdG8gYSA0MDQgaWYgdGhlIHBhZ2UgbnVtYmVy IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IG51bWJlciBvZiBwYWdlcwoJCS8vIEhhcyB0byBi ZSBhZnRlciB0ZXh0cGF0dGVybigpIGFzICR0aGlzcGFnZSBpcyBzZXQgZHVyaW5nIDx0eHA6 YXJ0aWNsZSAvPgoJCWdsb2JhbCAkdGhpc3BhZ2UsICRwcmV0ZXh0OwoJCWlmICgoQCRwcmV0 ZXh0WydwZyddICYmIGlzc2V0KCR0aGlzcGFnZSkpICYmCgkJKCR0aGlzcGFnZVsnbnVtUGFn ZXMnXSA8ICRwcmV0ZXh0WydwZyddKSkgewoJCQlvYl9lbmRfY2xlYW4oKTsKCQkJdHhwX2Rp ZShnVHh0KCc0MDRfbm90X2ZvdW5kJyksICc0MDQnKTsKCQl9CgoJCS8vIFN0b3Agb3V0cHV0 IGJ1ZmZlcmluZywgdGhpcyBzZW5kcyB0aGUgYnVmZmVyIHRvIF90ZXh0cGF0dGVybl9lbmRf Y2FsbGJhY2soKQoJCXdoaWxlIChAb2JfZW5kX2ZsdXNoKCkpOwoKCX0gLy8gZnVuY3Rpb24g X3RleHRwYXR0ZXJuX2VuZCBlbmQKCglmdW5jdGlvbiBfdGV4dHBhdHRlcm5fZW5kX2NhbGxi YWNrICgkaHRtbCwgJG92ZXJyaWRlID0gJycpIHsKCQlnbG9iYWwgJHByZXRleHQsICRwcm9k dWN0aW9uX3N0YXR1czsKCgkJaWYgKCRvdmVycmlkZSkgJHByZXRleHRbJ3Blcm1saW5rX292 ZXJyaWRlJ10gPSAkb3ZlcnJpZGU7CgkJJGh0bWwgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2so CgkJCSclaHJlZj0iKCcuaHUuJ3xcPykoW14iXSopIiUnLAoJCQlhcnJheSgmJHRoaXMsICdf cGFnZWxpbmt1cmwnKSwKCQkJJGh0bWwKCQkpOwoJCXVuc2V0KCRwcmV0ZXh0WydwZXJtbGlu a19vdmVycmlkZSddKTsKCgkJaWYgKCR0aGlzLT5wcmVmKCdkZWJ1ZycpICYmIGluX2FycmF5 KCRwcm9kdWN0aW9uX3N0YXR1cywgYXJyYXkoJ2RlYnVnJywgJ3Rlc3RpbmcnKSkpIHsKCQkJ JGRlYnVnID0gam9pbihuLCAkdGhpcy0+YnVmZmVyX2RlYnVnKTsKCQkJJHRoaXMtPmJ1ZmZl cl9kZWJ1ZyA9IGFycmF5KCk7CgkJCWlmICgkZGVidWcpCgkJCQkkaHRtbCA9IGNvbW1lbnQo bi4kZGVidWcubikgLiAkaHRtbDsKCQl9CgoJCXJldHVybiAkaHRtbDsKCX0gLy8gZnVuY3Rp b24gX3RleHRwYXR0ZXJuX2VuZF9jYWxsYmFjayBlbmQKCglmdW5jdGlvbiBjaGVja19wZXJt bGlua19jb25kaXRpb25zICgkcGwsICRhcnRpY2xlX2FycmF5KSB7CgkJaWYgKGVtcHR5KCRh cnRpY2xlX2FycmF5WydzZWN0aW9uJ10pKSAkYXJ0aWNsZV9hcnJheVsnc2VjdGlvbiddID0g QCRhcnRpY2xlX2FycmF5WydTZWN0aW9uJ107CgkJaWYgKGVtcHR5KCRhcnRpY2xlX2FycmF5 WydjYXRlZ29yeTEnXSkpICRhcnRpY2xlX2FycmF5WydjYXRlZ29yeTEnXSA9IEAkYXJ0aWNs ZV9hcnJheVsnQ2F0ZWdvcnkxJ107CgkJaWYgKGVtcHR5KCRhcnRpY2xlX2FycmF5WydjYXRl Z29yeTInXSkpICRhcnRpY2xlX2FycmF5WydjYXRlZ29yeTInXSA9IEAkYXJ0aWNsZV9hcnJh eVsnQ2F0ZWdvcnkyJ107CgoJCWlmIChAJHBsWydzZXR0aW5ncyddWydjb25fY2F0ZWdvcnkn XSAmJiAoJHBsWydzZXR0aW5ncyddWydjb25fY2F0ZWdvcnknXSAhPSAkYXJ0aWNsZV9hcnJh eVsnY2F0ZWdvcnkxJ10gfHwgJHBsWydzZXR0aW5ncyddWydjb25fY2F0ZWdvcnknXSAhPSAk YXJ0aWNsZV9hcnJheVsnY2F0ZWdvcnkyJ10pKQoJCQlyZXR1cm4gZmFsc2U7CgkJaWYgKEAk cGxbJ3NldHRpbmdzJ11bJ2Nvbl9zZWN0aW9uJ10gJiYgJHBsWydzZXR0aW5ncyddWydjb25f c2VjdGlvbiddICE9ICRhcnRpY2xlX2FycmF5WydzZWN0aW9uJ10pCgkJCXJldHVybiBmYWxz ZTsKCgkJcmV0dXJuIHRydWU7Cgl9CgoJZnVuY3Rpb24gX3Blcm1saW5rdXJsICgkYXJ0aWNs ZV9hcnJheSwgJHR5cGUgPSBQRVJNTElOS1VSTCwgJHBsX2luZGV4ID0gTlVMTCkgewoJCWds b2JhbCAkcHJldGV4dCwgJHByZWZzLCAkcHJvZHVjdGlvbl9zdGF0dXM7CgoJCWlmICgkdHlw ZSA9PSBQQUdFTElOS1VSTCkKCQkJcmV0dXJuICR0aGlzLT50b2dnbGVfY3VzdG9tX3VybF9m dW5jKCdwYWdlbGlua3VybCcsICRhcnRpY2xlX2FycmF5KTsKCgkJaWYgKGVtcHR5KCRhcnRp Y2xlX2FycmF5KSkgcmV0dXJuOwoKCQlpZiAoJHBsX2luZGV4KQoJCQkkcGwgPSAkdGhpcy0+ Z2V0X3Blcm1saW5rKCRwbF9pbmRleCk7CgkJZWxzZSB7CgkJCS8vIEdldCB0aGUgbWF0Y2hl ZCBwcmV0ZXh0IHJlcGxhY2VtZW50IGFycmF5LgoJCQkkbWF0Y2hlZCA9IChjb3VudCgkdGhp cy0+bWF0Y2hlZF9wZXJtbGluaykpCgkJCT8gJHRoaXMtPm1hdGNoZWRfcGVybWxpbmsKCQkJ OiBAYXJyYXlfc2hpZnQoYXJyYXlfc2xpY2UoJHRoaXMtPnBhcnRpYWxfbWF0Y2hlcywgLTEp KTsKCgkJCWlmICghaXNzZXQoJHBsKSAmJiAkbWF0Y2hlZCAmJiBhcnJheV9rZXlfZXhpc3Rz KCdpZCcsICRtYXRjaGVkKSkgewoJCQkJLy8gVGhlIHBlcm1saW5rIGlkIGlzIHN0b3JlZCBp biB0aGUgcHJldGV4dCByZXBsYWNlbWVudCBhcnJheSwgc28gd2UgY2FuIGZpbmQgdGhlIHBl cm1saW5rLgoJCQkJJHBsID0gJHRoaXMtPmdldF9wZXJtbGluaygkbWF0Y2hlZFsncGVybWxp bmtfaWQnXSk7CgkJCQlmb3JlYWNoICgkcGxbJ2NvbXBvbmVudHMnXSBhcyAkcGxfYykKCQkJ CQlpZiAoaW5fYXJyYXkoJHBsX2NbJ3R5cGUnXSwgYXJyYXkoJ2ZlZWQnLCAncGFnZScpKSB8 fCAhJHRoaXMtPmNoZWNrX3Blcm1saW5rX2NvbmRpdGlvbnMoJHBsLCAkYXJ0aWNsZV9hcnJh eSkpIHsKCQkJCQkJdW5zZXQoJHBsKTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQl9CgoJCQlp ZiAoIWlzc2V0KCRwbCkpIHsKCQkJCS8vIFdlIGhhdmUgbm8gcGVybWxpbmsgaWQgc28gZ3Jh YiB0aGUgcGVybWxpbmsgd2l0aCB0aGUgaGlnaGVzdCBwcmVjZWRlbmNlLgoJCQkJJHBlcm1s aW5rcyA9ICR0aGlzLT5nZXRfYWxsX3Blcm1saW5rcygxLCBhcnJheSgnZmVlZCcsICdwYWdl JykpOwoJCQkJZm9yZWFjaCAoJHBlcm1saW5rcyBhcyAka2V5ID0+ICRwbCkKCQkJCQlpZiAo ISR0aGlzLT5jaGVja19wZXJtbGlua19jb25kaXRpb25zKCRwbCwgJGFydGljbGVfYXJyYXkp KQoJCQkJCQl1bnNldCgkcGVybWxpbmtzWyRrZXldKTsKCQkJCSRwbCA9IGFycmF5X3NoaWZ0 KCRwZXJtbGlua3MpOwoJCQl9CgkJfQoKCQkkdXJpID0gJyc7CgoJCWlmIChpc19hcnJheSgk cGwpICYmIGFycmF5X2tleV9leGlzdHMoJ2NvbXBvbmVudHMnLCAkcGwpKSB7CgkJCWV4dHJh Y3QoJGFydGljbGVfYXJyYXkpOwoKCQkJaWYgKCFpc3NldCgkdGl0bGUpKSAkdGl0bGUgPSAk VGl0bGU7CgkJCWlmIChlbXB0eSgkdXJsX3RpdGxlKSkgJHVybF90aXRsZSA9IHN0cmlwU3Bh Y2UoJHRpdGxlKTsKCQkJaWYgKGVtcHR5KCRzZWN0aW9uKSkgJHNlY3Rpb24gPSAkU2VjdGlv bjsKCQkJaWYgKGVtcHR5KCRwb3N0ZWQpKSAkcG9zdGVkID0gJFBvc3RlZDsKCQkJaWYgKGVt cHR5KCRhdXRob3JpZCkpICRhdXRob3JpZCA9IEAkQXV0aG9ySUQ7CgkJCWlmIChlbXB0eSgk Y2F0ZWdvcnkxKSkgJGNhdGVnb3J5MSA9IEAkQ2F0ZWdvcnkxOwoJCQlpZiAoZW1wdHkoJGNh dGVnb3J5MikpICRjYXRlZ29yeTIgPSBAJENhdGVnb3J5MjsKCQkJaWYgKGVtcHR5KCR0aGlz aWQpKSAkdGhpc2lkID0gJElEOwoKCQkJJHBsX2NvbXBvbmVudHMgPSAkcGxbJ2NvbXBvbmVu dHMnXTsKCgkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIHRpdGxlIGNvbXBvbmVu dC4KCQkJJHRpdGxlID0gZmFsc2U7CgkJCWZvcmVhY2goJHBsX2NvbXBvbmVudHMgYXMgJHBs X2MpCgkJCQlpZiAoJHBsX2NbJ3R5cGUnXSA9PSAndGl0bGUnIHx8ICRwbF9jWyd0eXBlJ10g PT0gJ2lkJykKCQkJCQkkdGl0bGUgPSB0cnVlOwoKCQkJLy8gSWYgdGhlcmUgaXNuJ3QgYSB0 aXRsZSBjb21wb25lbnQgdGhlbiB3ZSBuZWVkIHRvIGFwcGVuZCBvbmUgdG8gdGhlIGVuZCBv ZiB0aGUgVVJJCgkJCWlmICghJHRpdGxlICYmICR0aGlzLT5wcmVmKCdhdXRvbWF0aWNhbGx5 X2FwcGVuZF90aXRsZScpKQoJCQkJJHBsX2NvbXBvbmVudHNbXSA9IGFycmF5KCd0eXBlJyA9 PiAndGl0bGUnLCAncHJlZml4JyA9PiAnJywgJ3N1ZmZpeCcgPT4gJycsICdyZWdleCcgPT4g JycsICd0ZXh0JyA9PiAnJyk7CgoJCQkkdXJpID0gcnRyaW0oZG9TdHJpcChAJHByZXRleHRb J3N1YnBhdGgnXSksICcvJyk7CgkJCWZvcmVhY2ggKCRwbF9jb21wb25lbnRzIGFzICRwbF9j KSB7CgkJCQkkdXJpIC49ICcvJzsKCgkJCQkkdHlwZSA9ICRwbF9jWyd0eXBlJ107CgkJCQlz d2l0Y2ggKCR0eXBlKSB7CgkJCQkJY2FzZSAnY2F0ZWdvcnknOgoJCQkJCQlpZiAoIUAkcGxf Y1snY2F0ZWdvcnknXSkgJHBsX2NbJ2NhdGVnb3J5J10gPSAxOwoJCQkJCQkkcHJpbWFyeSA9 ICdjYXRlZ29yeScuICRwbF9jWydjYXRlZ29yeSddOwoJCQkJCQkkc2Vjb25kYXJ5ID0gJ2Nh dGVnb3J5Jy4gKDMtKGludCkkcGxfY1snY2F0ZWdvcnknXSk7CgkJCQkJCSRjaGVja19jb250 ZXh0ID0gKCR0aGlzLT5wcmVmKCdqb2luX3ByZXRleHRfdG9fcGFnZWxpbmtzJykgJiYgJHRo aXMtPnByZWYoJ2NoZWNrX3ByZXRleHRfY2F0ZWdvcnlfY29udGV4dCcpKTsKCQkJCQkJaWYg KCEkY2hlY2tfY29udGV4dCB8fCAkJHByaW1hcnkgPT0gJHByZXRleHRbJ2MnXSkKCQkJCQkJ CSR1cmlfYyA9ICQkcHJpbWFyeTsKCQkJCQkJZWxzZSBpZiAoISRjaGVja19jb250ZXh0IHx8 ICQkc2Vjb25kYXJ5ID09ICRwcmV0ZXh0WydjJ10pCgkJCQkJCQkkdXJpX2MgPSAkJHNlY29u ZGFyeTsKCQkJCQkJZWxzZSBpZiAoJHRoaXMtPnByZWYoJ2RlYnVnJykgJiYgaW5fYXJyYXko JHByb2R1Y3Rpb25fc3RhdHVzLCBhcnJheSgnZGVidWcnLCAndGVzdGluZycpKSkKCQkJCQkJ CSR1cmlfYyA9ICctLUlOVkFMSURfQ0FURUdPUlktLSc7CgkJCQkJCWVsc2UgewoJCQkJCQkJ dW5zZXQoJHVyaSk7CgkJCQkJCQlicmVhayAyOwoJCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQkJ Y2FzZSAnc2VjdGlvbic6CgkJCQkJCSRjaGVja19jb250ZXh0ID0gKCR0aGlzLT5wcmVmKCdq b2luX3ByZXRleHRfdG9fcGFnZWxpbmtzJykgJiYgJHRoaXMtPnByZWYoJ2NoZWNrX3ByZXRl eHRfc2VjdGlvbl9jb250ZXh0JykpOwoJCQkJCQlpZiAoISRjaGVja19jb250ZXh0IHx8ICRz ZWN0aW9uID09ICRwcmV0ZXh0WydzJ10pCgkJCQkJCQkkdXJpX2MgPSAkc2VjdGlvbjsKCQkJ CQkJZWxzZSB7CgkJCQkJCQl1bnNldCgkdXJpKTsKCQkJCQkJCWJyZWFrIDI7CgkJCQkJCX0K CQkJCQlicmVhazsKCQkJCQljYXNlICd0aXRsZSc6ICR1cmlfYyA9ICR1cmxfdGl0bGU7IGJy ZWFrOwoJCQkJCWNhc2UgJ2lkJzogJHVyaV9jID0gJHRoaXNpZDsgYnJlYWs7CgkJCQkJY2Fz ZSAnYXV0aG9yJzogJHVyaV9jID0gc2FmZV9maWVsZCgnUmVhbE5hbWUnLCAndHhwX3VzZXJz JywgIm5hbWUgbGlrZSAneyRhdXRob3JpZH0nIik7IGJyZWFrOwoJCQkJCWNhc2UgJ2xvZ2lu JzogJHVyaV9jID0gJGF1dGhvcmlkOyBicmVhazsKCQkJCQljYXNlICdkYXRlJzogJHVyaV9j ID0gZXhwbG9kZSgnLycsIGRhdGUoJ1kvbS9kJywgJHBvc3RlZCkpOyBicmVhazsKCQkJCQlj YXNlICd5ZWFyJzogJHVyaV9jID0gZGF0ZSgnWScsICRwb3N0ZWQpOyBicmVhazsKCQkJCQlj YXNlICdtb250aCc6ICR1cmlfYyA9IGRhdGUoJ20nLCAkcG9zdGVkKTsgYnJlYWs7CgkJCQkJ Y2FzZSAnZGF5JzogJHVyaV9jID0gZGF0ZSgnZCcsICRwb3N0ZWQpOyBicmVhazsKCQkJCQlj YXNlICdjdXN0b20nOgoJCQkJCQlpZiAoJHVyaV9jID0gQCRhcnRpY2xlX2FycmF5WyRwcmVm c1siY3VzdG9tX3skcGxfY1snY3VzdG9tJ119X3NldCJdXSk7CgkJCQkJCWVsc2UgaWYgKCR1 cmlfYyA9IEAkYXJ0aWNsZV9hcnJheVsiY3VzdG9tX3skcGxfY1snY3VzdG9tJ119Il0pOwoJ CQkJCQllbHNlIGlmICgkdGhpcy0+cHJlZignZGVidWcnKSAmJiBpbl9hcnJheSgkcHJvZHVj dGlvbl9zdGF0dXMsIGFycmF5KCdkZWJ1ZycsICd0ZXN0aW5nJykpKQoJCQkJCQkJJHVyaV9j ID0gJy0tVU5TRVRfQ1VTVE9NX0ZJRUxELS0nOwoJCQkJCQllbHNlIHsKCQkJCQkJCXVuc2V0 KCR1cmkpOwoJCQkJCQkJYnJlYWsgMjsKCQkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJCWNhc2Ug J3RleHQnOiAkdXJpX2MgPSAkcGxfY1sndGV4dCddOyBicmVhazsKCQkJCQljYXNlICdyZWdl eCc6CgkJCQkJCS8vIENoZWNrIHRvIHNlZSBpZiByZWdleCBpcyB2YWxpZCB3aXRob3V0IG91 dHB1dHRpbmcgZXJyb3IgbWVzc2FnZXMuCgkJCQkJCW9iX3N0YXJ0KCk7CgkJCQkJCXByZWdf bWF0Y2goJHBsX2NbJ3JlZ2V4J10sICRwbF9jWydyZWdleCddLCAkcmVnZXhfbWF0Y2hlcyk7 CgkJCQkJCSRpc192YWxpZF9yZWdleCA9ICEob2JfZ2V0X2NsZWFuKCkpOwoJCQkJCQlpZiAo JGlzX3ZhbGlkX3JlZ2V4KSB7CgkJCQkJCQkka2V5ID0gInBlcm1saW5rX3JlZ2V4X3skcGxf Y1snbmFtZSddfSI7CgkJCQkJCQkkdXJpX2MgPSAoYXJyYXlfa2V5X2V4aXN0cygka2V5LCAk cHJldGV4dCkpID8gJHByZXRleHRbJGtleV0gOiAkcmVnZXhfbWF0Y2hlc1swXTsKCQkJCQkJ fSBlbHNlIGlmICgkdGhpcy0+cHJlZignZGVidWcnKSkKCQkJCQkJCSR1cmlfYyA9ICctLUlO VkFMSURfUkVHRVgtLSc7CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKGVtcHR5KCR1cmlf YykpCgkJCQkJaWYgKCR0aGlzLT5wcmVmKCdkZWJ1ZycpICYmIGluX2FycmF5KCRwcm9kdWN0 aW9uX3N0YXR1cywgYXJyYXkoJ2RlYnVnJywgJ3Rlc3RpbmcnKSkpCgkJCQkJCSR1cmlfYyA9 ICctLVBFUk1MSU5LX0ZPUk1BVF9FUlJPUi0tJzsKCQkJCQllbHNlIHsKCQkJCQkJdW5zZXQo JHVyaSk7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCgkJCQlpZiAoQCRwbF9jWydwcmVmaXgnXSkK CQkJCQkkdXJpIC49ICR0aGlzLT5lbmNvZGVfdXJsKCRwbF9jWydwcmVmaXgnXSk7CgoJCQkJ aWYgKGlzX2FycmF5KCR1cmlfYykpIHsKCQkJCQlmb3JlYWNoICgkdXJpX2MgYXMgJHVyaV9j MikKCQkJCQkJJHVyaSAuPSAkdGhpcy0+ZW5jb2RlX3VybCgkdXJpX2MyKSAuICcvJzsKCQkJ CQkkdXJpID0gcnRyaW0oJHVyaSwgJy8nKTsKCQkJCX0gZWxzZQoJCQkJCSR1cmkgLj0gJHRo aXMtPmVuY29kZV91cmwoJHVyaV9jKTsKCgkJCQlpZiAoQCRwbF9jWydzdWZmaXgnXSkKCQkJ CQkkdXJpIC49ICR0aGlzLT5lbmNvZGVfdXJsKCRwbF9jWydzdWZmaXgnXSk7CgoJCQkJdW5z ZXQoJHVyaV9jKTsKCQkJfQoKCQkJaWYgKGlzc2V0KCR1cmkpKQoJCQkJJHVyaSAuPSAnLyc7 CgkJfQoKCQlpZiAoJHVyaV9lbXB0eSA9IGVtcHR5KCR1cmkpKSB7CgkJCS8vIEl0IGlzIHBv c3NpYmxlIHRoZSB1cmkgaXMgc3RpbGwgZW1wdHkgaWYgdGhlcmUgaXMgbm8gbWF0Y2ggb3Ig aWYgd2UncmUgdXNpbmcKCQkJLy8gc3RyaWN0IG1hdGNoaW5nIGlmIHNvIHRyeSB0aGUgZGVm YXVsdCBwZXJtbGluayBtb2RlLgoJCQkkdXJpID0gJHRoaXMtPnRvZ2dsZV9wZXJtbGlua19t b2RlKCdwZXJtbGlua3VybCcsICRhcnRpY2xlX2FycmF5KTsKCQl9CgoJCWlmICgkdGhpcy0+ cHJlZignb21pdF90cmFpbGluZ19zbGFzaCcpKQoJCQkkdXJpID0gcnRyaW0oJHVyaSwgJy8n KTsKCgkJaWYgKCEkdXJpX2VtcHR5ICYmIGluX2FycmF5KHR4cGF0aC4nL3B1Ymxpc2gvcnNz LnBocCcsIGdldF9pbmNsdWRlZF9maWxlcygpKSB8fCBpbl9hcnJheSh0eHBhdGguJy9wdWJs aXNoL2F0b20ucGhwJywgZ2V0X2luY2x1ZGVkX2ZpbGVzKCkpIHx8IHR4cGludGVyZmFjZSA9 PSAnYWRtaW4nKSB7CgkJCSRob3N0ID0gcnRyaW0oc3RyX3JlcGxhY2UocnRyaW0oZG9TdHJp cChAJHByZXRleHRbJ3N1YnBhdGgnXSksICcvJyksICcnLCBodSksICcvJyk7CgkJCSR1cmkg PSAkaG9zdCAuICR1cmk7CgkJfQoKCQlyZXR1cm4gKCR0aGlzLT5wcmVmKCdmb3JjZV9sb3dl cmNhc2VfdXJscycpKSA/IHN0cnRvbG93ZXIoJHVyaSkgOiAkdXJpOwoJfQoKCWZ1bmN0aW9u IF9wYWdlbGlua3VybCAoJHBhcnRzKSB7CgkJZXh0cmFjdChsQXR0cyhhcnJheSgKCQkJJ3Bh dGgnCQk9PiAnaW5kZXgucGhwJywKCQkJJ3F1ZXJ5JwkJPT4gJycsCgkJCSdmcmFnbWVudCcJ PT4gJycsCgkJKSwgcGFyc2VfdXJsKGh0bWxfZW50aXR5X2RlY29kZShzdHJfcmVwbGFjZSgn JiMzODsnLCAnJicsICRwYXJ0c1syXSkpKSkpOwoKCQkvLyBUaWR5IHVwIGxpbmtzIGJhY2sg dG8gdGhlIHNpdGUgaG9tZXBhZ2UKCQlpZiAoJHBhdGggPT0gJ2luZGV4LnBocCcgJiYgZW1w dHkoJHF1ZXJ5KSkKCQkJcmV0dXJuICdocmVmPSInIC5odS4gJyInOwoKCQkvLyBGaXggbWF0 Y2hlcyBsaWtlIGhyZWY9Ij9zPWZvbyIKCQllbHNlIGlmICgkcGF0aCAmJiBlbXB0eSgkcXVl cnkpICYmICRwYXJ0c1sxXSA9PSAnPycpIHsKCQkJJHF1ZXJ5ID0gJHBhdGg7CgkJCSRwYXRo ID0gJ2luZGV4LnBocCc7CgkJfQoKCQkvLyBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgcXVl cnkgdG8gd29yayB3aXRoLgoJCWVsc2UgaWYgKGVtcHR5KCRxdWVyeSkgfHwgJHBhdGggIT0g J2luZGV4LnBocCcgfHwgc3RycG9zKCRxdWVyeSwgJy8nKSA9PT0gdHJ1ZSkKCQkJcmV0dXJu ICRwYXJ0c1swXTsKCgkJLy8gJyZhbXA7JyB3aWxsIGJyZWFrIHBhcnNlX3N0cigpIGlmIHRo ZXkgYXJlIGZvdW5kIGluIGEgcXVlcnkgc3RyaW5nCgkJJHF1ZXJ5ID0gc3RyX3JlcGxhY2Uo JyZhbXA7JywgJyYnLCAkcXVlcnkpOwoKCQlpZiAoJGZyYWdtZW50KQoJCQkkZnJhZ21lbnQg PSAnIycuJGZyYWdtZW50OwoKCQlnbG9iYWwgJHByZXRleHQ7CgkJcGFyc2Vfc3RyKCRxdWVy eSwgJHF1ZXJ5X3BhcnQpOwoJCWlmICghYXJyYXlfa2V5X2V4aXN0cygncGcnLCAkcXVlcnlf cGFydCkpCgkJCSRxdWVyeV9wYXJ0WydwZyddID0gMDsKCQlpZiAoIWFycmF5X2tleV9leGlz dHMoJ2lkJywgJHF1ZXJ5X3BhcnQpKQoJCQkkcXVlcnlfcGFydFsnaWQnXSA9IDA7CgkJaWYg KCFhcnJheV9rZXlfZXhpc3RzKCdyc3MnLCAkcXVlcnlfcGFydCkpCgkJCSRxdWVyeV9wYXJ0 Wydyc3MnXSA9IDA7CgkJaWYgKCFhcnJheV9rZXlfZXhpc3RzKCdhdG9tJywgJHF1ZXJ5X3Bh cnQpKQoJCQkkcXVlcnlfcGFydFsnYXRvbSddID0gMDsKCQlpZiAoJHRoaXMtPnByZWYoJ2pv aW5fcHJldGV4dF90b19wYWdlbGlua3MnKSkKCQkJZXh0cmFjdChhcnJheV9tZXJnZSgkcHJl dGV4dCwgJHF1ZXJ5X3BhcnQpKTsKCQllbHNlCgkJCWV4dHJhY3QoJHF1ZXJ5X3BhcnQpOwoK CQkvLyBXZSBoYXZlIGEgaWQsIHBhc3MgdG8gcGVybWxpbmt1cmwoKQoJCWlmICgkaWQpIHsK CQkJaWYgKEAkcyA9PSAnZmlsZV9kb3dubG9hZCcpIHsKCQkJCSR0aXRsZSA9ICh2ZXJzaW9u X2NvbXBhcmUoJGRidmVyc2lvbiwgJzQuMicsICc+PScpKSA/IE5VTEwgOiBzYWZlX2ZpZWxk KCdmaWxlbmFtZScsICd0eHBfZmlsZScsICJpZCA9ICd7JGlkfSciKTsKCQkJCSR1cmwgPSAk dGhpcy0+dG9nZ2xlX3Blcm1saW5rX21vZGUoJ2ZpbGVkb3dubG9hZHVybCcsIGFycmF5KCRp ZCwgJHRpdGxlKSwgdHJ1ZSk7CgkJCX0gZWxzZSB7CgkJCQkkcnMgPSBzYWZlX3JvdygnKiwg SUQgYXMgdGhpc2lkLCB1bml4X3RpbWVzdGFtcChQb3N0ZWQpIGFzIHBvc3RlZCcsICd0ZXh0 cGF0dGVybicsICJJRCA9ICd7JGlkfSciKTsKCQkJCSR1cmwgPSAkdGhpcy0+X3Blcm1saW5r dXJsKCRycywgUEVSTUxJTktVUkwpIC4gJGZyYWdtZW50OwoJCQl9CgkJCXJldHVybiAnaHJl Zj0iJy4gJHVybCAuJyInOwoJCX0KCgkJaWYgKEAkcyA9PSAnZGVmYXVsdCcpCgkJCXVuc2V0 KCRzKTsKCgkJLy8gU29tZSBUeFAgdGFncywgZS5nLiA8dHhwOmZlZWRfbGluayAvPiB1c2Ug J3NlY3Rpb24nIG9yICdjYXRlZ29yeScgaW5jb25zaXN0ZW50CgkJLy8gd2l0aCBtb3N0IG90 aGVyIHRhZ3MuIFByb2Nlc3MgdGhlc2Ugbm93IHNvIHdlIG9ubHkgaGF2ZSB0byBjaGVjayAk cyBhbmQgJGMuCgkJaWYgKEAkc2VjdGlvbikgICRzID0gJHNlY3Rpb247CgkJaWYgKEAkY2F0 ZWdvcnkpICRjID0gJGNhdGVnb3J5OwoKCQkvLyBEZWJ1Z2dpbmcgZm9yIGJ1ZmZlcnMKCQkk dGhpcy0+YnVmZmVyX2RlYnVnW10gPSAndXJsOiAnLnN0cl9yZXBsYWNlKCcmYW1wOycsICcm JywgJHBhcnRzWzFdLiRwYXJ0c1syXSk7CgkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ3Bh dGg6ICcuJHBhdGg7CgkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ3F1ZXJ5OiAnLiRxdWVy eTsKCQlpZiAoJGZyYWdtZW50KSAkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnZnJhZ21lbnQ6 ICcuJGZyYWdtZW50OwoKCQlpZiAoQCRpZCkgJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ2lk OiAnLiRpZDsKCQlpZiAoQCRzKSAkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnczogJy4kczsK CQlpZiAoQCRjKSAkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnYzogJy4kYzsKCQlpZiAoQCRy c3MpICR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICdyc3M6ICcuJHJzczsKCQlpZiAoQCRhdG9t KSAkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnYXRvbTogJy4kYXRvbTsKCQlpZiAoQCRwZykg JHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ3BnOiAnLiRwZzsKCQlpZiAoQCRxKSAkdGhpcy0+ YnVmZmVyX2RlYnVnW10gPSAncTogJy4kcTsKCgkJaWYgKEAkcHJldGV4dFsncGVybWxpbmtf b3ZlcnJpZGUnXSkgewoJCQkkb3ZlcnJpZGVfaWRzID0gZXhwbG9kZSgnLCcsICRwcmV0ZXh0 WydwZXJtbGlua19vdmVycmlkZSddKTsKCQkJZm9yZWFjaCAoJG92ZXJyaWRlX2lkcyBhcyAk b3ZlcnJpZGVfaWQpIHsKCQkJCSRwbCA9ICR0aGlzLT5nZXRfcGVybWxpbmsoJG92ZXJyaWRl X2lkKTsKCQkJCWlmIChjb3VudCgkcGwpID4gMCkgJHBlcm1saW5rc1tdID0gJHBsOwoJCQl9 CgkJfQoKCQlpZiAoZW1wdHkoJHBlcm1saW5rcykpIHsKCQkJJHBlcm1saW5rcyA9ICR0aGlz LT5nZXRfYWxsX3Blcm1saW5rcygxKTsKCgkJCSRwZXJtbGlua3NbJ2dicF9wZXJtYW5lbnRf bGlua3NfZGVmYXVsdCddID0gYXJyYXkoCgkJCQknY29tcG9uZW50cycgPT4gYXJyYXkoCgkJ CQkJYXJyYXkoJ3R5cGUnID0+ICd0ZXh0JywgJ3RleHQnID0+IHN0cnRvbG93ZXIodXJsZW5j b2RlKGdUeHQoJ2NhdGVnb3J5JykpKSksCgkJCQkJYXJyYXkoJ3R5cGUnID0+ICdjYXRlZ29y eScpLAoJCQkJKSwKCQkJCSdzZXR0aW5ncycgPT4gYXJyYXkoCgkJCQkJJ3BsX25hbWUnID0+ ICdnYnBfcGVybWFuZW50X2xpbmtzX2RlZmF1bHQnLCAncGxfcHJlY2VkZW5jZScgPT4gJycs ICdwbF9wcmV2aWV3JyA9PiAnJywKCQkJCQknY29uX3NlY3Rpb24nID0+ICcnLCAnY29uX2Nh dGVnb3J5JyA9PiAnJywgJ2Rlc19zZWN0aW9uJyA9PiAnJywgJ2Rlc19jYXRlZ29yeScgPT4g JycsCgkJCQkJJ2Rlc19wZXJtbGluaycgPT4gJycsICdkZXNfZmVlZCcgPT4gJycsICdkZXNf bG9jYXRpb24nID0+ICcnLAoJCQkpKTsKCQl9CgoJCSRjdXJyZW50X3NlZ21lbnRzID0gZXhw bG9kZSgnLycsIGx0cmltKCRwcmV0ZXh0WydyZXF1ZXN0X3VyaSddLCAnLycpKTsKCgkJJGhp Z2hlc3RfbWF0Y2hfY291bnQgPSBudWxsOwoJCWZvcmVhY2ggKCRwZXJtbGlua3MgYXMgJGtl eSA9PiAkcGwpIHsKCQkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ1Rlc3RpbmcgcGVybWxp bms6ICcuICRwbFsnc2V0dGluZ3MnXVsncGxfbmFtZSddIC4nIC0gJy4gJGtleTsKCQkJJHRo aXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ1ByZXZpZXc6ICcuICRwbFsnc2V0dGluZ3MnXVsncGxf cHJldmlldyddOwoJCQkkb3V0ID0gYXJyYXkoKTsgJGtleXMgPSBhcnJheSgpOyAkbWF0Y2hf Y291bnQgPSAwOwoJCQlmb3JlYWNoICgkcGxbJ2NvbXBvbmVudHMnXSBhcyAkaSA9PiAkcGxf YykgewoJCQkJc3dpdGNoICgkcGxfY1sndHlwZSddKSB7CgkJCQkJY2FzZSAndGV4dCc6CgkJ CQkJCSRvdXRbXSA9ICRwbF9jWyd0ZXh0J107CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAncmVn ZXgnOgoJCQkJCQkkb3V0W10gPSAkcHJldGV4dFsncGVybWxpbmtfcmVnZXhfJy4kcGxfY1sn bmFtZSddXTsKCQkJCQlicmVhazsKCQkJCQljYXNlICdzZWN0aW9uJzoKCQkJCQkJaWYgKEAk cykgJG91dFtdID0gJHM7CgkJCQkJCWVsc2UgYnJlYWsgMjsKCQkJCQlicmVhazsKCQkJCQlj YXNlICdjYXRlZ29yeSc6CgkJCQkJCWlmIChAJGMpICRvdXRbXSA9ICRjOwoJCQkJCQllbHNl IGJyZWFrIDI7CgkJCQkJYnJlYWs7CgkJCQkJY2FzZSAnZmVlZCc6CgkJCQkJCWlmIChAJHJz cykgJGtleXNbXSA9ICRvdXRbXSA9ICdyc3MnOwoJCQkJCQllbHNlIGlmIChAJGF0b20pICRr ZXlzW10gPSAkb3V0W10gPSAnYXRvbSc7CgkJCQkJCWVsc2UgYnJlYWsgMjsKCQkJCQlicmVh azsKCQkJCQljYXNlICdzZWFyY2gnOgoJCQkJCQlpZiAoQCRxKSAkb3V0W10gPSAkcTsKCQkJ CQkJZWxzZSBicmVhayAyOwoJCQkJCWJyZWFrOwoJCQkJCWNhc2UgJ3BhZ2UnOgoJCQkJCQlp ZiAoQCRwZykgewoJCQkJCQkJJG91dFtdID0gJHBnOwoJCQkJCQkJJGtleXNbXSA9ICdwZyc7 CgkJCQkJCX0KCQkJCQkJZWxzZSBicmVhayAyOwoJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6 IGJyZWFrIDI7CgkJCQl9CgkJCQlpZiAoaW5fYXJyYXkoJHBsX2NbJ3R5cGUnXSwgYXJyYXko J3RleHQnLCAncmVnZXgnKSkpIHsKCQkJCQlpZiAoJGN1cnJlbnRfc2VnbWVudHNbJGldID09 IGVuZCgkb3V0KSAmJiBzdHJsZW4oZW5kKCRvdXQpKSA+IDApCgkJCQkJCSRtYXRjaF9jb3Vu dCArPSAkdGhpcy0+cHJlZigndGV4dF9hbmRfcmVnZXhfc2VnbWVudF9zY29yZXMnKTsKCQkJ CX0KCQkJCWVsc2VpZiAoIWluX2FycmF5KCRwbF9jWyd0eXBlJ10sIGFycmF5KCd0aXRsZScs ICdpZCcpKSkKCQkJCQkkbWF0Y2hfY291bnQrKzsKCQkJCWVsc2UgYnJlYWs7CgkJCX0KCgkJ CSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICdNYXRjaCBjb3VudDogJy4gJG1hdGNoX2NvdW50 OwoKCQkJLy8gVG9kbzogU3RvcmUgYWNjb3JkaW5nIHRvIHRoZSBwcmVjZWRlbmNlIHZhbHVl CgkJCWlmIChjb3VudCgkb3V0KSA+IDAgJiYgKCRtYXRjaF9jb3VudCA+ICRoaWdoZXN0X21h dGNoX2NvdW50IHx8ICFpc3NldCgkaGlnaGVzdF9tYXRjaF9jb3VudCkpICYmCgkJCSEoJGtl eSA9PSAnZ2JwX3Blcm1hbmVudF9saW5rc19kZWZhdWx0JyAmJiAhJG1hdGNoX2NvdW50KSkg ewoJCQkJZXh0cmFjdCgkcGxbJ3NldHRpbmdzJ10pOwoJCQkJaWYgKChlbXB0eSgkcykgJiYg ZW1wdHkoJGMpKSB8fAoJCQkJKGVtcHR5KCRjb25fc2VjdGlvbikgfHwgQCRzID09ICRjb25f c2VjdGlvbikgfHwKCQkJCShlbXB0eSgkY29uX2NhdGVnb3J5KSB8fCBAJGMgPT0gJGNvbl9j YXRlZ29yeSkpIHsKCQkJCQkkdGhpcy0+YnVmZmVyX2RlYnVnW10gPSAnTmV3IGhpZ2hlc3Qg bWF0Y2ghICcuIGltcGxvZGUoJy8nLCAkb3V0KTsKCQkJCQkkaGlnaGVzdF9tYXRjaF9jb3Vu dCA9ICRtYXRjaF9jb3VudDsKCQkJCQkkbWF0Y2ggPSAkb3V0OwoJCQkJCSRtYXRjaF9rZXlz ID0gJGtleXM7CgkJCQl9CgkJCX0KCQl9CgoJCWlmIChlbXB0eSgkbWF0Y2gpICYmICghKEAk cGcgJiYgJHRoaXMtPnByZWYoJ2NsZWFuX3BhZ2VfYXJjaGl2ZV9saW5rcycpKSB8fCAoQCRw ZyAmJiBAJHEpKSkgewoJCQlnbG9iYWwgJHByZWZzLCAkcHJldGV4dCwgJHBlcm1saW5rX21v ZGU7CgkJCSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICdObyBtYXRjaCc7CgkJCSR0aGlzLT5i dWZmZXJfZGVidWdbXSA9ICctLS0tJzsKCQkJJHByZXRleHRbJ3Blcm1saW5rX21vZGUnXSA9 ICRwZXJtbGlua19tb2RlID0gJHByZWZzWydwZXJtbGlua19tb2RlJ107CgkJCSR1cmwgPSBw YWdlbGlua3VybCgkcXVlcnlfcGFydCk7CgkJCSRwcmV0ZXh0WydwZXJtbGlua19tb2RlJ10g PSAkcGVybWxpbmtfbW9kZSA9ICdtZXNzeSc7CgkJCXJldHVybiAnaHJlZj0iJy4gJHVybCAu JyInOwoJCX0KCgkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJ21hdGNoOiAnLiAgICAgIHNl cmlhbGl6ZSgkbWF0Y2gpOwoJCSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICdtYXRjaF9rZXlz OiAnLiBzZXJpYWxpemUoJG1hdGNoX2tleXMpOwoKCQkkdXJsID0gJy8nLmpvaW4oJy8nLCAk bWF0Y2gpOwoJCSR1cmwgPSBydHJpbShodSwgJy8nKS5ydHJpbSgkdXJsLCAnLycpLicvJzsK CgkJaWYgKCRyc3MgJiYgIWluX2FycmF5KCdyc3MnLCAkbWF0Y2hfa2V5cykpCgkJCSR1cmwg Lj0gJ3Jzcyc7CgkJZWxzZSBpZiAoJGF0b20gJiYgIWluX2FycmF5KCdhdG9tJywgJG1hdGNo X2tleXMpKQoJCQkkdXJsIC49ICdhdG9tJzsKCQllbHNlIGlmICgkcGcgJiYgIWluX2FycmF5 KCdwZycsICRtYXRjaF9rZXlzKSkgewoJCQlpZiAoJHRoaXMtPnByZWYoJ2NsZWFuX3BhZ2Vf YXJjaGl2ZV9saW5rcycpKQoJCQkJJHVybCAuPSAkcGc7CgkJCWVsc2UgewoJCQkJJHVybCAu PSAnP3BnPScuICRwZzsKCQkJCSRvbWl0X3RyYWlsaW5nX3NsYXNoID0gdHJ1ZTsKCQkJfQoJ CX0KCgkJJHVybCA9IHJ0cmltKCR1cmwsICcvJykgLiAnLyc7CgoJCWlmIChAJG9taXRfdHJh aWxpbmdfc2xhc2ggfHwgJHRoaXMtPnByZWYoJ29taXRfdHJhaWxpbmdfc2xhc2gnKSkKCQkJ JHVybCA9IHJ0cmltKCR1cmwsICcvJyk7CgoJCSR0aGlzLT5idWZmZXJfZGVidWdbXSA9ICR1 cmw7CgkJJHRoaXMtPmJ1ZmZlcl9kZWJ1Z1tdID0gJy0tLS0nOwoKCQlpZiAoJHBhdGggPT0g J2luZGV4LnBocCcgJiYgJHVybCAhPSBodSkKCQkJcmV0dXJuICdocmVmPSInLiAkdXJsIC4g JGZyYWdtZW50IC4nIic7CgoJCS8qCgkJMSA9IGluZGV4LCB0ZXh0cGF0dGVybi9jc3MsIE5V TEwgKD1pbmRleCkKCQkyID0gaWQsIHMsIHNlY3Rpb24sIGMsIGNhdGVnb3J5LCByc3MsIGF0 b20sIHBnLCBxLCAobiwgcCwgbW9udGgsIGF1dGhvcikKCQkqLwoKCQlyZXR1cm4gKCR0aGlz LT5wcmVmKCdmb3JjZV9sb3dlcmNhc2VfdXJscycpKSA/IHN0cnRvbG93ZXIoJHBhcnRzWzBd KSA6ICRwYXJ0c1swXTsKCX0KCglmdW5jdGlvbiBzZXRfcGVybWxpbmtfbW9kZSAoJHJlc2V0 X2Z1bmN0aW9uID0gZmFsc2UpIHsKCQlnbG9iYWwgJHByZWZzLCAkcHJldGV4dCwgJHBlcm1s aW5rX21vZGU7CgkJJHByZWZzWydjdXN0b21fdXJsX2Z1bmMnXSA9IGFycmF5KCYkdGhpcywg J19wZXJtbGlua3VybCcpOwoKCQlpZiAoISRyZXNldF9mdW5jdGlvbikKCQkJJHByZXRleHRb J3Blcm1saW5rX21vZGUnXSA9ICRwZXJtbGlua19tb2RlID0gJ21lc3N5JzsKCQllbHNlCgkJ CSRwcmV0ZXh0WydwZXJtbGlua19tb2RlJ10gPSAkcGVybWxpbmtfbW9kZSA9ICRwcmVmc1sn cGVybWxpbmtfbW9kZSddOwoJfQoKCWZ1bmN0aW9uIHJlc2V0X3Blcm1saW5rX21vZGUgKCkg ewoJCWdsb2JhbCAkcHJlZnMsICRwcmV0ZXh0LCAkcGVybWxpbmtfbW9kZTsKCQl1bnNldCgk cHJlZnNbJ2N1c3RvbV91cmxfZnVuYyddKTsKCQkkcHJldGV4dFsncGVybWxpbmtfbW9kZSdd ID0gJHBlcm1saW5rX21vZGUgPSAkcHJlZnNbJ3Blcm1saW5rX21vZGUnXTsKCX0KCglmdW5j dGlvbiB0b2dnbGVfY3VzdG9tX3VybF9mdW5jICgkZnVuYywgJGF0dHMgPSBOVUxMLCAkdG9v Z2xlX3Blcm1saW5rX21vZGUgPSBmYWxzZSwgJGV4cGFuZF9hcmd1bWVudHMgPSBmYWxzZSkg ewoJCWdsb2JhbCAkcHJlZnMsICRwcmV0ZXh0OwoKCQlpZiAoJHRvb2dsZV9wZXJtbGlua19t b2RlKSB7CgkJCWdsb2JhbCAkcGVybWxpbmtfbW9kZTsKCQkJJF9wZXJtbGlua19tb2RlID0g JHBlcm1saW5rX21vZGU7CgkJfQoKCQkkX2NhbGxfdXNlcl9mdW5jID0gQCRwcmVmc1snY3Vz dG9tX3VybF9mdW5jJ107CgoJCXVuc2V0KCRwcmVmc1snY3VzdG9tX3VybF9mdW5jJ10pOwoJ CWlmICgkdG9vZ2xlX3Blcm1saW5rX21vZGUpCgkJCSRwcmV0ZXh0WydwZXJtbGlua19tb2Rl J10gPSAkcGVybWxpbmtfbW9kZSA9ICRwcmVmc1sncGVybWxpbmtfbW9kZSddOwoKCQlpZiAo aXNfY2FsbGFibGUoJGZ1bmMpKSB7CgkJCWlmIChpc19hcnJheSgkYXR0cykgYW5kICRleHBh bmRfYXJndW1lbnRzKQoJCQkJJHJzID0gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGZ1bmMsICRh dHRzKTsKCQkJZWxzZQoJCQkJJHJzID0gY2FsbF91c2VyX2Z1bmMoJGZ1bmMsICRhdHRzKTsK CQl9CgoJCSRwcmVmc1snY3VzdG9tX3VybF9mdW5jJ10gPSAkX2NhbGxfdXNlcl9mdW5jOwoK CQlpZiAoJHRvb2dsZV9wZXJtbGlua19tb2RlKQoJCQkkcHJldGV4dFsncGVybWxpbmtfbW9k ZSddID0gJHBlcm1saW5rX21vZGUgPSAkX3Blcm1saW5rX21vZGU7CgoJCXJldHVybiAkcnM7 Cgl9CgoJZnVuY3Rpb24gdG9nZ2xlX3Blcm1saW5rX21vZGUgKCRmdW5jLCAkYXR0cyA9IE5V TEwsICRleHBhbmRfYXJndW1lbnRzID0gZmFsc2UpIHsKCQlyZXR1cm4gJHRoaXMtPnRvZ2ds ZV9jdXN0b21fdXJsX2Z1bmMoJGZ1bmMsICRhdHRzLCB0cnVlLCAkZXhwYW5kX2FyZ3VtZW50 cyk7Cgl9CgoJZnVuY3Rpb24gZW5jb2RlX3VybCAoJHRleHQpIHsKCQlyZXR1cm4gdXJsZW5j b2RlKHRyaW0oZHVtYkRvd24odXJsZGVjb2RlKCR0ZXh0KSkpKTsKCX0KCglmdW5jdGlvbiBk ZWJ1ZyAoKSB7CgkJaWYgKCR0aGlzLT5wcmVmKCdkZWJ1ZycpKSB7CgkJCWdsb2JhbCAkcHJv ZHVjdGlvbl9zdGF0dXM7CgkJCSRhID0gZnVuY19nZXRfYXJncygpOwoKCQkJaWYgKEB0eHBp bnRlcmZhY2UgPT0gJ2FkbWluJykKCQkJCWZvcmVhY2ggKCRhIGFzICR0aGluZykKCQkJCQlk bXAoJHRoaW5nKTsKCgkJCWlmIChAdHhwaW50ZXJmYWNlID09ICdwdWJsaWMnICYmIGluX2Fy cmF5KCRwcm9kdWN0aW9uX3N0YXR1cywgYXJyYXkoJ2RlYnVnJywgJ3Rlc3RpbmcnKSkpCgkJ CQlmb3JlYWNoICgkYSBhcyAkdGhpbmcpCgkJCQkJZWNobyBjb21tZW50KGlzX3NjYWxhcigk dGhpbmcpID8gc3RydmFsKCR0aGluZykgOiB2YXJfZXhwb3J0KCR0aGluZywgdHJ1ZSkpLG47 CgkJfQoJfQp9CgpjbGFzcyBQZXJtYW5lbnRMaW5rc0J1aWxkVGFiVmlldyBleHRlbmRzIEdC UEFkbWluVGFiVmlldwp7CglmdW5jdGlvbiBwcmVsb2FkICgpIHsKCQlyZWdpc3Rlcl9jYWxs YmFjayhhcnJheSgmJHRoaXMsICdwb3N0X3NhdmVfcGVybWxpbmsnKSwgJHRoaXMtPnBhcmVu dC0+ZXZlbnQsIGdicF9zYXZlLCAxKTsKCQlyZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJHRo aXMsICdwb3N0X3NhdmVfcGVybWxpbmsnKSwgJHRoaXMtPnBhcmVudC0+ZXZlbnQsIGdicF9w b3N0LCAxKTsKCX0KCglmdW5jdGlvbiBtYWluICgpIHsKCQlnbG9iYWwgJHByZWZzOwoJCWV4 dHJhY3QoZ3BzYShhcnJheSgnc3RlcCcsIGdicF9pZCkpKTsKCgkJLy8gV2l0aCBoYXZlIGFu IElELCBlaXRoZXIgdGhlIHBlcm1saW5rIGhhcyBqdXN0IGJlZW4gc2F2ZWQgb3IgdGhlIHVz ZXIgd2FudHMgdG8gZWRpdCBpdAoJCWlmICgkaWQpIHsKCQkJLy8gTmV3bHkgc2F2ZWQgb3Ig YmVlbmluZyBlZGl0ZWQsIGVpdGhlciB3YXkgd2UncmUgZWRpdGluZyBhIHBlcm1saW5rCgkJ CSRzdGVwID0gZ2JwX3NhdmU7CgoJCQkvLyBVc2UgdGhlIElEIHRvIGdyYWIgdGhlIHBlcm1s aW5rIGRhdGEgKGNvbXBvbmVudHMgJiBzZXR0aW5ncykKCQkJJHBlcm1saW5rID0gJHRoaXMt PnBhcmVudC0+Z2V0X3Blcm1saW5rKCRpZCk7CgkJCSRjb21wb25lbnRzID0gJHRoaXMtPnBo cEFycmF5VG9Kc0FycmF5KCdjb21wb25lbnRzJywgJHBlcm1saW5rWydjb21wb25lbnRzJ10p OwoJCQkkc2V0dGluZ3MgPSAkcGVybWxpbmtbJ3NldHRpbmdzJ107CgkJfSBlbHNlIHsKCQkJ Ly8gQ3JlYXRpbmcgYSBuZXcgSUQgYW5kIHBlcm1saW5rLgoJCQkkc3RlcCA9IGdicF9wb3N0 OwoJCQkkaWQgPSB1bmlxaWQoJycpOwoKCQkJLy8gU2V0IHRoZSBkZWZhdWx0IHNldCBvZiBj b21wb25lbnRzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZXJlIGlzIHBhcmVudCBwZXJtbGlu awoJCQkkY29tcG9uZW50cyA9ICR0aGlzLT5waHBBcnJheVRvSnNBcnJheSgnY29tcG9uZW50 cycsIGFycmF5KAoJCQkJYXJyYXkoJ3R5cGUnID0+ICdzZWN0aW9uJywgJ3ByZWZpeCcgPT4g JycsICdzdWZmaXgnID0+ICcnLCAncmVnZXgnID0+ICcnLCAndGV4dCcgPT4gJycpLAoJCQkJ YXJyYXkoJ3R5cGUnID0+ICdjYXRlZ29yeScsICdwcmVmaXgnID0+ICcnLCAnc3VmZml4JyA9 PiAnJywgJ3JlZ2V4JyA9PiAnJywgJ3RleHQnID0+ICcnLCAnY2F0ZWdvcnknID0+ICcxJyks CgkJCQlhcnJheSgndHlwZScgPT4gJ3RpdGxlJywgJ3ByZWZpeCcgPT4gJycsICdzdWZmaXgn ID0+ICcnLCAncmVnZXgnID0+ICcnLCAndGV4dCcgPT4gJycpLAoJCQkpKTsKCgkJCSRzZXR0 aW5ncyA9IGFycmF5KAoJCQkJJ3BsX25hbWUnID0+ICdVbnRpdGxlZCcsICdwbF9wcmVjZWRl bmNlJyA9PiAnMCcsCgkJCQknY29uX3NlY3Rpb24nID0+ICcnLCAnY29uX2NhdGVnb3J5JyA9 PiAnJywKCQkJCSdkZXNfc2VjdGlvbicgPT4gJycsICdkZXNfY2F0ZWdvcnknID0+ICcnLCAn ZGVzX3BhZ2UnID0+ICcnLAoJCQkJJ2Rlc19wZXJtbGluaycgPT4gJycsICdkZXNfZmVlZCcg PT4gJycsICdkZXNfbG9jYXRpb24nID0+ICcnLAoJCQkpOwoJCX0KCgkJLy8gRXh0cmFjdCBz ZXR0aW5ncyAtIHRoaXMgd2lsbCBiZSB1c2VmdWwgd2hlbiBjcmVhdGluZyB0aGUgdXNlciBp bnRlcmZhY2UKCQlleHRyYWN0KCRzZXR0aW5ncyk7CgoJCS8vIFBIUCAmIEphdmFzY3JpcHQg Y29uc3RhbnRzOwoJCSRzZXBhcmF0b3IgPSBnYnBfc2VwYXJhdG9yOwoJCSRjb21wb25lbnRz X2RpdiA9ICdwZXJtbGlua19jb21wb25lbnRzX3VpJzsKCQkkY29tcG9uZW50c19mb3JtID0g J3Blcm1saW5rX2NvbXBvbmVudHMnOwoJCSRzZXR0aW5nc19mb3JtID0gJ3Blcm1saW5rX3Nl dHRpbmdzJzsKCQkkc2hvd19wcmVmaXggPSAkdGhpcy0+cHJlZignc2hvd19wcmVmaXgnKTsK CQkkc2hvd19zdWZmaXggPSAkdGhpcy0+cHJlZignc2hvd19zdWZmaXgnKTsKCgkJLy8gQSBs aXR0bGUgY3JlZGl0IGhlcmUgYW5kIHRoZXJlIGRvZXNuJ3QgaHVydAoJCSRvdXRbXSA9ICI8 IS0tIHskdGhpcy0+cGFyZW50LT5wbHVnaW5fbmFtZX0gYnkgR3JhZW1lIFBvcnRlb3VzIC0t PiI7CgoJCS8vIFRoZSBKYXZhc2NyaXB0CiRvdXRbXSA9IDw8PEhUTUwKCTxzY3JpcHQgdHlw ZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iamF2YXNjcmlwdCIgY2hhcnNldD0idXRm LTgiPgoJLy8gPCFbQ0RBVEFbCgoJLy8gR2xvYmFsIHZhcmlhYmxlcwp2YXIgeyRjb21wb25l bnRzfS8vIGNvbXBvbmVudHMgYXJyYXkgZm9yIGFsbCB0aGUgZGF0YQoKCXZhciBfY3VycmVu dCA9IDA7IC8vIEluZGV4IG9mIHRoZSBjb21wb25lbnRzIGFycmF5LCBvZiB0aGUgY3VycmVu dGx5IHNlbGVjdGVkIGNvbXBvbmVudAoJdmFyIGNfdmFscyA9IG5ldyBBcnJheSgndHlwZScs ICdjdXN0b20nLCAnY2F0ZWdvcnknLCAnbmFtZScsICdwcmVmaXgnLCAnc3VmZml4JywgJ3Jl Z2V4JywgJ3RleHQnKTsKCgl3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7CgkJY29tcG9u ZW50X3JlZnJlc2hfYWxsKCk7CgkJY29tcG9uZW50X3N3aXRjaChjb21wb25lbnQoX2N1cnJl bnQpKTsKCX0KCglmdW5jdGlvbiBjb21wb25lbnRfYWRkICgpIHsKCQkvLyBDcmVhdGUgZGF0 YSBzZXQKCQl2YXIgZGF0YSA9IG5ldyBBcnJheSgpOwoJCWZvciAoa2V5IGluIGNfdmFscykg ewoJCQlkYXRhW2NfdmFsc1trZXldXSA9ICcnOwoJCX0KCgkJLy8gQWRkIGRhdGEKCQljb21w b25lbnRzLnB1c2goZGF0YSk7CgoJCS8vIFJlc2V0IGNvbXBvbmVudCB0eXBlIGxpc3QKCQlm b3JtKCd7JGNvbXBvbmVudHNfZm9ybX0nKS50eXBlLnZhbHVlID0gJyc7CgoJCS8vIFN3aXRj aCB0byB0aGUgbmV3IGNvbXBvbmVudAoJCV9jdXJyZW50ID0gY29tcG9uZW50cy5sZW5ndGgg LSAxOwoKCQkvLyBSZWZyZXNoIFVJCgkJY29tcG9uZW50X3JlZnJlc2hfYWxsKCk7CgkJY29t cG9uZW50X3VwZGF0ZSgpOwoJfQoKCWZ1bmN0aW9uIGNvbXBvbmVudF9yZWZyZXNoIChlbGVt ZW50KSB7CgkJdmFyIGMgPSBjb21wb25lbnRzW2VsZW1lbnQuaWRdOwoKCQkvLyBDU1MKCQlp ZiAoX2N1cnJlbnQgPT0gZWxlbWVudC5pZCkKCQkJZWxlbWVudC5zdHlsZVsnYmFja2dyb3Vu ZENvbG9yJ10gPSAncmdiKDI0OSwgMjA2LCA3MyknOwoJCWVsc2UKCQkJZWxlbWVudC5zdHls ZVsnYmFja2dyb3VuZENvbG9yJ10gPSAncmdiKDI1NSwgMjU0LCAyMTEpJzsKCQllbGVtZW50 LnN0eWxlWydjb2xvciddID0gJ3JnYigwLCAwLCAwKSc7CgkJZWxlbWVudC5zdHlsZVsnZm9u dEZhbWlseSddID0gJ0FyaWFsJzsKCQllbGVtZW50LnN0eWxlWydmb250V2VpZ2h0J10gPSAn Ym9sZCc7CgkJZWxlbWVudC5zdHlsZVsndmVydGljYWxBbGlnbiddID0gJ21pZGRsZSc7CgkJ ZWxlbWVudC5zdHlsZVsndGV4dEFsaWduJ10gPSAnY2VudGVyJzsKCQllbGVtZW50LnN0eWxl WydsaW5lSGVpZ2h0J10gPSAnMS41ZW0nOwoJCWVsZW1lbnQuc3R5bGVbJ2hlaWdodCddID0g JzEuNWVtJzsKCQllbGVtZW50LnN0eWxlWydwYWRkaW5nJ10gPSAnMCA1cHgnOwoJCWVsZW1l bnQuc3R5bGVbJ21hcmdpblJpZ2h0J10gPSAnNXB4JzsKCQllbGVtZW50LnN0eWxlWydjc3NG bG9hdCddID0gJ2xlZnQnOwoJCWVsZW1lbnQuc3R5bGVbJ2Rpc3BsYXknXSA9ICdpbmxpbmUn OwoKCQkvLyBSZW1vdmUgYWxsIGNoaWxkIG5vZGVzCgkJd2hpbGUgKGVsZW1lbnQuaGFzQ2hp bGROb2RlcygpKSB7IGVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudC5maXJzdENoaWxkKTsg fQoKCQkvLyBDcmVhdGUgdGhlIHZpc2libGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGNv bXBvbmVudAoJCXN3aXRjaCAoY1sndHlwZSddKSB7CgkJCWNhc2UgJycgOgoJCQkJc3RyaW5n ID0gJy8nOwoJCQkJYnJlYWs7CgkJCWNhc2UgJ3JlZ2V4JyA6CgkJCWNhc2UgJ3RleHQnIDoK CQkJCXN0cmluZyA9IGNbY1sndHlwZSddXSArICcgLyc7CgkJCQlicmVhazsKCQkJY2FzZSAn ZGF0ZScgOgoJCQkJc3RyaW5nID0gY1sndHlwZSddICsgJyAvJzsKCQkJCWJyZWFrOwoJCQlj YXNlICdjdXN0b20nIDoKCQkJCXN0cmluZyA9IGNbJ3ByZWZpeCddICsgJ2N1c3RvbV8nICsg Y1snY3VzdG9tJ10gKyBjWydzdWZmaXgnXSArICcgLyc7CgkJCQlicmVhazsKCQkJZGVmYXVs dCA6CgkJCQlzdHJpbmcgPSBjWydwcmVmaXgnXSArIGNbJ3R5cGUnXSArIGNbJ3N1ZmZpeCdd ICsgJyAvJzsKCQkJYnJlYWs7CgkJfQoKCQkvLyBTZXQgdGhlIHZpc2libGUgc3RyaW5nCgkJ ZWxlbWVudC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHJpbmcpKTsK CgkJcmV0dXJuIGVsZW1lbnQ7Cgl9CgoJZnVuY3Rpb24gY29tcG9uZW50X3JlZnJlc2hfYWxs ICgpIHsKCQkvLyBSZW1vdmUgYWxsIGNoaWxkIG5vZGVzCgkJd2hpbGUgKHBlcm1saW5rX2Rp digpLmhhc0NoaWxkTm9kZXMoKSkgeyBwZXJtbGlua19kaXYoKS5yZW1vdmVDaGlsZChwZXJt bGlua19kaXYoKS5maXJzdENoaWxkKTsgfQoKCQlmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBv bmVudHMubGVuZ3RoOyBpKyspIHsKCQkJdmFyIGMgPSBjb21wb25lbnRzW2ldOwoKCQkJLy8g Q3JlYXRlIHRoZSBuZXcgY29tcG9uZW50CgkJCXZhciBuZXdfY29tcG9uZW50ID0gZG9jdW1l bnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CgoJCQkvLyBTZXQgdGhlIGlkIGludGVyZ2VyIGZv ciB0aGlzIGNvbXBvbmVudAoJCQluZXdfY29tcG9uZW50LmlkID0gaTsKCgkJCS8vIEphdmFz Y3JpcHQsIG9ubW91c2V1cCBzZXR0aW5nCgkJCW5ld19jb21wb25lbnQuc2V0QXR0cmlidXRl KCdvbm1vdXNlZG93bicsICdjb21wb25lbnRfc3dpdGNoKHRoaXMpOycpOwoJCQluZXdfY29t cG9uZW50Lm9ubW91c2Vkb3duID0gZnVuY3Rpb24oKSB7IGNvbXBvbmVudF9zd2l0Y2godGhp cyk7IH07CgoJCQkvLyBSZWZyZXNoIHRoZSBsb29rIG9mIHRoZSBjb21wb25lbnQKCQkJbmV3 X2NvbXBvbmVudCA9IGNvbXBvbmVudF9yZWZyZXNoKG5ld19jb21wb25lbnQpOwoKCQkJLy8g QW5kIGFkZCB0aGUgbmV3IGNvbXBvbmVudCB0byB0aGUgdWkKCQkJcGVybWxpbmtfZGl2KCku YXBwZW5kQ2hpbGQobmV3X2NvbXBvbmVudCk7CgkJfQoJfQoKCWZ1bmN0aW9uIGNvbXBvbmVu dF9yZW1vdmUgKCkgewoJCWlmIChjb21wb25lbnRzLmxlbmd0aCA+IDEpIHsKCQkJY29tcG9u ZW50cy5zcGxpY2UoX2N1cnJlbnQsIDEpOwoKCQkJaWYgKF9jdXJyZW50ID49IGNvbXBvbmVu dHMubGVuZ3RoKQoJCQkJX2N1cnJlbnQgPSBjb21wb25lbnRzLmxlbmd0aCAtIDE7CgoJCQlj b21wb25lbnRfcmVmcmVzaF9hbGwoKTsKCQl9Cgl9CgoJZnVuY3Rpb24gY29tcG9uZW50X3N3 aXRjaCAoZWxlbWVudCkgewoJCS8vIFVwZGF0ZSBjdXJyZW50IGluZGV4CgkJX2N1cnJlbnQg PSBlbGVtZW50LmlkOwoKCQkvLyBSZWZyZXNoIFVJCgkJY29tcG9uZW50X3JlZnJlc2hfYWxs KCk7CgoJCS8vIFNldCBmb3JtIGlucHV0IHZhbHVlcwoJCXZhciBjID0gY29tcG9uZW50c1tf Y3VycmVudF07CgkJZm9yIChrZXkgaW4gY192YWxzKSB7CgkJCXZhciBrID0gY192YWxzW2tl eV07CgkJCXZhciBlID0gZm9ybSgneyRjb21wb25lbnRzX2Zvcm19JykuZWxlbWVudHMubmFt ZWRJdGVtKGspOwoKCQkJaWYgKGNba10pIGUudmFsdWUgPSBjW2tdOwoJCQllbHNlIGUudmFs dWUgPSAnJzsKCQl9CgoJCS8vIEhpZGUgdW5uZWVkZWQgZm9ybSBpbnB1dHMKCQljb21wb25l bnRfdXBkYXRlKCk7Cgl9CgoJZnVuY3Rpb24gY29tcG9uZW50X3VwZGF0ZSAoZWxlbWVudCkg ewoJCS8vIFN0b3JlIHRoZSBkYXRhIGluIGZvcm0gaW5wdXRzLCBhbmQgaGlkZSBhbGwgZm9y bSBpbnB1dHMKCQl2YXIgYyA9IG5ldyBBcnJheSgpCgkJZm9yIChrZXkgaW4gY192YWxzKSB7 CgkJCXZhciBrID0gY192YWxzW2tleV07CgkJCXZhciBlID0gZm9ybSgneyRjb21wb25lbnRz X2Zvcm19JykuZWxlbWVudHMubmFtZWRJdGVtKGspOwoKCQkJY1trXSA9IGUudmFsdWU7CgoJ CQllLnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICdub25lJzsKCQl9CgoJCS8vIFJl c2hvdyB0eXBlIG9wdGlvbiBsaXN0CgkJZm9ybSgneyRjb21wb25lbnRzX2Zvcm19JykudHlw ZS5wYXJlbnROb2RlLnN0eWxlWydkaXNwbGF5J10gPSAnJzsKCgkJLy8gU2V0IG90aGVyIGZv cm0gaW5wdXRzIHRvIHRoZSBjb3JyZWN0IHZpc2liaWxpdHkgc3RhdGUsIGRlcGVuZGVudCBv biB0eXBlCgkJc3dpdGNoIChjWyd0eXBlJ10pIHsKCQkJY2FzZSAnJyA6CgkJCWNhc2UgJ2Rh dGUnIDogYnJlYWs7CgkJCWNhc2UgJ3JlZ2V4JyA6CgkJCQlmb3JtKCd7JGNvbXBvbmVudHNf Zm9ybX0nKS5uYW1lLnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcnOwoJCQkJZm9y bSgneyRjb21wb25lbnRzX2Zvcm19JykucmVnZXgucGFyZW50Tm9kZS5zdHlsZVsnZGlzcGxh eSddID0gJyc7CgkJCWJyZWFrOwoJCQljYXNlICd0ZXh0JyA6CgkJCQlmb3JtKCd7JGNvbXBv bmVudHNfZm9ybX0nKS5uYW1lLnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcnOwoJ CQkJZm9ybSgneyRjb21wb25lbnRzX2Zvcm19JykudGV4dC5wYXJlbnROb2RlLnN0eWxlWydk aXNwbGF5J10gPSAnJzsKCQkJYnJlYWs7CgkJCWNhc2UgJ2N1c3RvbScgOgoJCQkJZm9ybSgn eyRjb21wb25lbnRzX2Zvcm19JykuY3VzdG9tLnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXkn XSA9ICcnOwoJCQkJZGlzcGxheV9maXhlcygpOwoJCQlicmVhazsKCQkJY2FzZSAnY2F0ZWdv cnknIDoKCQkJCWZvcm0oJ3skY29tcG9uZW50c19mb3JtfScpLmNhdGVnb3J5LnBhcmVudE5v ZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcnOwoJCQkJZGlzcGxheV9maXhlcygpOwoJCQlicmVh azsKCQkJZGVmYXVsdCA6CgkJCQlkaXNwbGF5X2ZpeGVzKCk7CgkJCWJyZWFrOwoJCX0KCgkJ Ly8gU2F2ZSBkYXRhCgkJY29tcG9uZW50c1tfY3VycmVudF0gPSBjOwoKCQkvLyBSZWZyZXNo IGNvbXBvbmVudCB0byByZWZsZWN0IG5ldyBkYXRhCgkJY29tcG9uZW50X3JlZnJlc2goY29t cG9uZW50KF9jdXJyZW50KSk7CgoJCS8vIFJlLWZvY3VzIHRoZSBhY3RpdmUgZm9ybSBpbnB1 dAoJCWlmIChlbGVtZW50KQoJCQllbGVtZW50LmZvY3VzKCk7Cgl9CgoJZnVuY3Rpb24gZGlz cGxheV9maXhlcyAoKSB7CgkJaWYgKCd7JHNob3dfcHJlZml4fScpCgkJCWZvcm0oJ3skY29t cG9uZW50c19mb3JtfScpLnByZWZpeC5wYXJlbnROb2RlLnN0eWxlWydkaXNwbGF5J10gPSAn JzsKCQlpZiAoJ3skc2hvd19zdWZmaXh9JykKCQkJZm9ybSgneyRjb21wb25lbnRzX2Zvcm19 Jykuc3VmZml4LnBhcmVudE5vZGUuc3R5bGVbJ2Rpc3BsYXknXSA9ICcnOwoJfQoKCWZ1bmN0 aW9uIGNvbXBvbmVudF9sZWZ0ICgpIHsKCQlpZiAoY29tcG9uZW50cy5sZW5ndGggPiAxICYm IF9jdXJyZW50ID4gMCkgewoJCQkvLyBTdG9yZSBjdXJyZW50IGNvbXBvbmVudAoJCQl2YXIg YyA9IGNvbXBvbmVudHNbX2N1cnJlbnRdOwoKCQkJLy8gUmVtb3ZlIGN1cnJlbnQgY29tcG9u ZW50CgkJCWNvbXBvbmVudHMuc3BsaWNlKF9jdXJyZW50LCAxKTsKCgkJCS8vIFVwZGF0ZSBj dXJyZW50IGluZGV4CgkJCV9jdXJyZW50LS07CgoJCQkvLyBSZS1hZGQgY3VycmVudCBjb21w b25lbnQKCQkJY29tcG9uZW50cy5zcGxpY2UoX2N1cnJlbnQsIDAsIGMpOwoKCQkJLy8gUmVm cmVzaCBVSQoJCQljb21wb25lbnRfcmVmcmVzaF9hbGwoKTsKCQl9Cgl9CgoJZnVuY3Rpb24g Y29tcG9uZW50X3JpZ2h0ICgpIHsKCQlpZiAoX2N1cnJlbnQgPCBjb21wb25lbnRzLmxlbmd0 aCAtIDEpIHsKCQkJLy8gU3RvcmUgY3VycmVudCBjb21wb25lbnQKCQkJdmFyIGMgPSBjb21w b25lbnRzW19jdXJyZW50XTsKCgkJCS8vIFJlbW92ZSBjdXJyZW50IGNvbXBvbmVudAoJCQlj b21wb25lbnRzLnNwbGljZShfY3VycmVudCwgMSk7CgoJCQkvLyBVcGRhdGUgY3VycmVudCBp bmRleAoJCQlfY3VycmVudCsrOwoKCQkJLy8gUmUtYWRkIGN1cnJlbnQgY29tcG9uZW50CgkJ CWNvbXBvbmVudHMuc3BsaWNlKF9jdXJyZW50LCAwLCBjKTsKCgkJCS8vIFJlZnJlc2ggVUkK CQkJY29tcG9uZW50X3JlZnJlc2hfYWxsKCk7CgkJfQoJfQoKCWZ1bmN0aW9uIHNhdmUgKGZv cm0pIHsKCQl2YXIgYyA9ICcnOyB2YXIgaXNfcGVybWxpbmsgPSBmYWxzZTsgdmFyIGhhc19w YWdlX29yX3NlYXJjaCA9IGZhbHNlOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50 cy5sZW5ndGg7IGkrKykgewoJCQlpZiAoY29tcG9uZW50c1tpXVsndHlwZSddID09ICd0aXRs ZScgfHwgY29tcG9uZW50c1tpXVsndHlwZSddID09ICdpZCcpCgkJCQlpc19wZXJtbGluayA9 IHRydWU7CgkJCWlmIChjb21wb25lbnRzW2ldWyd0eXBlJ10gPT0gJ3BhZ2UnIHx8IGNvbXBv bmVudHNbaV1bJ3R5cGUnXSA9PSAnZmVlZCcgfHwgY29tcG9uZW50c1tpXVsndHlwZSddID09 ICdzZWFyY2gnKQoJCQkJaGFzX3BhZ2VfZmVlZF9zZWFyY2ggPSB0cnVlOwoJCQljID0gYyAr IGpzQXJyYXlUb1BocEFycmF5KGNvbXBvbmVudHNbaV0pICsgJ3skc2VwYXJhdG9yfSc7CgkJ fQoKCQlpZiAoaXNfcGVybWxpbmsgJiYgaGFzX3BhZ2Vfb3Jfc2VhcmNoKQoJCQlhbGVydCgi WW91ciBwZXJtYW5lbnQgbGluayBjYW4ndCBjb250YWluIGVpdGhlciBhICdwYWdlJywgJ2Zl ZWQnIG9yIGEgJ3NlYXJjaCcgY29tcG9uZW50IHdpdGggJ3RpdGxlJyBvciAnaWQnIGNvbXBv bmVudHMuIik7CgoJCWVsc2UgaWYgKGlzX3Blcm1saW5rICYmIChmb3JtLnBsX25hbWUudmFs dWUgPT0gJycgfHwgZm9ybS5wbF9uYW1lLnZhbHVlID09ICdVbnRpdGxlZCcpKSB7CgkJCWRv Y3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncycpLnN0eWxlWydkaXNwbGF5J10gPSAn JzsKCQkJZm9ybS5wbF9uYW1lLnN0eWxlWydib3JkZXInXSA9ICczcHggc29saWQgcmdiKDIy MSwgMCwgMCknOwoJCQlmb3JtLnBsX3ByZWNlZGVuY2Uuc3R5bGVbJ2JvcmRlciddID0gJyc7 CgkJCWFsZXJ0KCdQbGVhc2UgZW50ZXIgYSBuYW1lIGZvciB0aGlzIHBlcm1hbmVudCBsaW5r IHJ1bGUuJyk7CgkJfSBlbHNlIGlmIChmb3JtLnBsX3ByZWNlZGVuY2UudmFsdWUgPT0gJycp IHsKCQkJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHRpbmdzJykuc3R5bGVbJ2Rpc3Bs YXknXSA9ICcnOwoJCQlmb3JtLnBsX3ByZWNlZGVuY2Uuc3R5bGVbJ2JvcmRlciddID0gJzNw eCBzb2xpZCByZ2IoMjIxLCAwLCAwKSc7CgkJCWZvcm0ucGxfbmFtZS5zdHlsZVsnYm9yZGVy J10gPSAnJzsKCQkJYWxlcnQoJ1BsZWFzZSBlbnRlciBhIHByZWNlZGVuY2UgdmFsdWUgZm9y IHRoaXMgcGVybWFuZW50IGxpbmsgcnVsZS4nKTsKCQl9IGVsc2UgewoJCQlmb3JtLmNvbXBv bmVudHMudmFsdWUgPSBjOwoJCQlpZiAocGVybWxpbmtfZGl2KCkudGV4dENvbnRlbnQpCgkJ CQlmb3JtLnBsX3ByZXZpZXcudmFsdWUgPSBwZXJtbGlua19kaXYoKS50ZXh0Q29udGVudDsK CQkJZWxzZSBpZiAocGVybWxpbmtfZGl2KCkuaW5uZXJUZXh0KQoJCQkJZm9ybS5wbF9wcmV2 aWV3LnZhbHVlID0gcGVybWxpbmtfZGl2KCkuaW5uZXJUZXh0OwoJCQlyZXR1cm4gdHJ1ZTsK CQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBqc0FycmF5VG9QaHBBcnJheSAo YXJyYXkpIHsKCQkvLyBodHRwOi8vZmFybS50dWNvd3MuY29tL2Jsb2cvX2FyY2hpdmVzLzIw MDUvNS8zMC84OTU5MDEuaHRtbAoJCXZhciBhcnJheV9waHAgPSAiIjsKCQl2YXIgdG90YWwg PSAwOwoJCWZvciAodmFyIGtleSBpbiBhcnJheSkgewoJCQkrKyB0b3RhbDsKCQkJYXJyYXlf cGhwID0gYXJyYXlfcGhwICsgInM6IiArCgkJCQlTdHJpbmcoa2V5KS5sZW5ndGggKyAiOlwi IiArIFN0cmluZyhrZXkpICsgIlwiO3M6IiArCgkJCQlTdHJpbmcoYXJyYXlba2V5XSkubGVu Z3RoICsgIjpcIiIgKyBTdHJpbmcoYXJyYXlba2V5XSkgKyAiXCI7IjsKCQl9CgkJYXJyYXlf cGhwID0gImE6IiArIHRvdGFsICsgIjp7IiArIGFycmF5X3BocCArICJ9IjsKCQlyZXR1cm4g YXJyYXlfcGhwOwoJfQoKCWZ1bmN0aW9uIHBlcm1saW5rX2RpdiAoKSB7CgkJLy8gUmV0dXJu IHRoZSBwZXJtbGluayBydWxlIGVsZW1lbnQKCQlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVu dEJ5SWQoJ3skY29tcG9uZW50c19kaXZ9Jyk7Cgl9CgoJZnVuY3Rpb24gZm9ybSAobmFtZSkg ewoJCWlmICghbmFtZSkKCQkJbmFtZSA9ICd7JGNvbXBvbmVudHNfZm9ybX0nCgkJLy8gUmV0 dXJuIHRoZSBmb3JtIGVsZW1lbnQgd2l0aCBuYW1lCgkJcmV0dXJuIGRvY3VtZW50LmZvcm1z Lm5hbWVkSXRlbShuYW1lKTsKCX0KCglmdW5jdGlvbiBjb21wb25lbnQgKGluZGV4KSB7CgkJ Ly8gUmV0dXJuIGNvbXBvbmVudCB3aXRoIGluZGV4CgkJcmV0dXJuIHBlcm1saW5rX2Rpdigp LmNoaWxkTm9kZXNbaW5kZXhdOwoJfQoKCS8vIF1dPgoJPC9zY3JpcHQ+CkhUTUw7CgoJCS8v IC0tLSBSdWxlIC0tLSAvLwoKCQkkb3V0W10gPSBoZWQoJ1Blcm1hbmVudCBsaW5rIHJ1bGUn LCAyKTsKCQkkb3V0W10gPSAnPGRpdiBpZD0iJy4kY29tcG9uZW50c19kaXYuJyIgc3R5bGU9 ImJhY2tncm91bmQtY29sb3I6IHJnYigyMzAsIDIzMCwgMjMwKTsgd2lkdGg6IGF1dG87IGhl aWdodDogMS41ZW07IG1hcmdpbjogMTBweCAwOyBwYWRkaW5nOiA1cHg7Ij48L2Rpdj4nOwoJ CSRvdXRbXSA9IGdyYWYKCQkJKAoJCQkkdGhpcy0+ZklucHV0KCdidXR0b24nLCAnY29tcG9u ZW50X2FkZCcsICdBZGQgY29tcG9uZW50JywgYXJyYXkoJ2NsaWNrJyA9PiAnY29tcG9uZW50 X2FkZCgpOycpKS5uLgoJCQkkdGhpcy0+ZklucHV0KCdidXR0b24nLCAnY29tcG9uZW50X3Jl bW92ZScsICdSZW1vdmUgY29tcG9uZW50JywgYXJyYXkoJ2NsaWNrJyA9PiAnY29tcG9uZW50 X3JlbW92ZSgpOycpKS5uLgoJCQkkdGhpcy0+ZklucHV0KCdidXR0b24nLCAnY29tcG9uZW50 X2xlZnQnLCAnTW92ZSBsZWZ0JywgYXJyYXkoJ2NsaWNrJyA9PiAnY29tcG9uZW50X2xlZnQo KTsnKSkubi4KCQkJJHRoaXMtPmZJbnB1dCgnYnV0dG9uJywgJ2NvbXBvbmVudF9yaWdodCcs ICdNb3ZlIHJpZ2h0JywgYXJyYXkoJ2NsaWNrJyA9PiAnY29tcG9uZW50X3JpZ2h0KCk7Jykp CgkJCSk7CgoJCS8vIC0tLSBDb21wb25lbnQgZm9ybSAtLS0gLy8KCgkJJG91dFtdID0gJzxm b3JtIGFjdGlvbj0iaW5kZXgucGhwIiBuYW1lPSInLiRjb21wb25lbnRzX2Zvcm0uJyIgb25z dWJtaXQ9InJldHVybiBmYWxzZTsiPic7CgoJCS8vIC0tLSBDb21wb25lbnQgdHlwZSAtLS0g Ly8KCgkJJGNvbXBvbmVudF90eXBlcyA9IGFycmF5ICgKCQkJJ3NlY3Rpb24nID0+ICdTZWN0 aW9uJywgJ2NhdGVnb3J5JyA9PiAnQ2F0ZWdvcnknLAoJCQkndGl0bGUnID0+ICdUaXRsZScs ICdpZCcgPT4gJ0lEJywKCQkJJ2RhdGUnID0+ICdEYXRlICh5eXl5L21tL2RkKScsICd5ZWFy JyA9PiAnWWVhcicsCgkJCSdtb250aCcgPT4gJ01vbnRoJywgJ2RheScgPT4gJ0RheScsCgkJ CSdhdXRob3InID0+ICdBdXRob3IgKFJlYWwgbmFtZSknLCAnbG9naW4nID0+ICdBdXRob3Ig KExvZ2luKScsCgkJCSdjdXN0b20nID0+ICdDdXN0b20gRmllbGQnLCAncGFnZScgPT4gJ1Bh Z2UgTnVtYmVyJywKCQkJJ2ZlZWQnID0+ICdGZWVkJywgJ3NlYXJjaCcgPT4gJ1NlYXJjaCBy ZXF1ZXN0JywKCQkJJ3RleHQnID0+ICdQbGFpbiBUZXh0JywgJ3JlZ2V4JyA9PiAnUmVndWxh ciBFeHByZXNzaW9uJwoJCSk7CgkJJG91dFtdID0gZ3JhZigkdGhpcy0+ZlNlbGVjdCgndHlw ZScsICRjb21wb25lbnRfdHlwZXMsICcnLCAxLCAnQ29tcG9uZW50IHR5cGUnLCAnIG9uY2hh bmdlPSJjb21wb25lbnRfdXBkYXRlKCk7IicpKTsKCgkJLy8gLS0tIENvbXBvbmVudCBkYXRh IC0tLSAvLwoKCQkvLyBHcmFiIHRoZSBjdXN0b20gZmllbGQgdGl0bGVzCgkJJGN1c3RvbV9m aWVsZHMgPSBhcnJheSgpOwoJCWZvciAoJGkgPSAxOyAkaSA8PSAxMDsgJGkrKykgewoJCQlp ZiAoJHYgPSAkcHJlZnNbImN1c3RvbV97JGl9X3NldCJdKQoJCQkJJGN1c3RvbV9maWVsZHNb JGldID0gJHY7CgkJfQoKCQkkb3V0W10gPSBncmFmICgKCQkJJHRoaXMtPmZTZWxlY3QoJ2N1 c3RvbScsICRjdXN0b21fZmllbGRzLCAnJywgMCwgJ0N1c3RvbScsICcgb25jaGFuZ2U9ImNv bXBvbmVudF91cGRhdGUodGhpcyk7IicpLm4uCgkJCSR0aGlzLT5mU2VsZWN0KCdjYXRlZ29y eScsIGFycmF5KCcxJyA9PiAnQ2F0ZWdvcnkgMScsICcyJyA9PiAnQ2F0ZWdvcnkgMicpLCAn JywgMCwgJ1ByaW1hcnkgQ2F0ZWdvcnknLCAnIG9uY2hhbmdlPSJjb21wb25lbnRfdXBkYXRl KHRoaXMpOyInKS5uLgoJCQkkdGhpcy0+ZklucHV0KCd0ZXh0JywgJ25hbWUnLCAnJywgYXJy YXkoJ2tleXVwJyA9PiAnY29tcG9uZW50X3VwZGF0ZSh0aGlzKTsnKSwgJ05hbWUnKS5uLgoJ CQkkdGhpcy0+ZklucHV0KCd0ZXh0JywgJ3ByZWZpeCcsICcnLCBhcnJheSgna2V5dXAnID0+ ICdjb21wb25lbnRfdXBkYXRlKHRoaXMpOycpLCAnUHJlZml4Jykubi4KCQkJJHRoaXMtPmZJ bnB1dCgndGV4dCcsICdyZWdleCcsICcnLCBhcnJheSgna2V5dXAnID0+ICdjb21wb25lbnRf dXBkYXRlKHRoaXMpOycpLCAnUmVndWxhciBFeHByZXNzaW9uJykubi4KCQkJJHRoaXMtPmZJ bnB1dCgndGV4dCcsICdzdWZmaXgnLCAnJywgYXJyYXkoJ2tleXVwJyA9PiAnY29tcG9uZW50 X3VwZGF0ZSh0aGlzKTsnKSwgJ1N1ZmZpeCcpLm4uCgkJCSR0aGlzLT5mSW5wdXQoJ3RleHQn LCAndGV4dCcsICcnLCBhcnJheSgna2V5dXAnID0+ICdjb21wb25lbnRfdXBkYXRlKHRoaXMp OycpLCAnVGV4dCcpCgkJKTsKCQkkaHIgPSAnPGhyIHN0eWxlPSJib3JkZXI6IDA7IGhlaWdo dDogMXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjAwLCAyMDAsIDIwMCk7IGNvbG9yOiBy Z2IoMjAwLCAyMDAsIDIwMCk7IG1hcmdpbi1ib3R0b206IDEwcHg7IiAvPic7CgkJJG91dFtd ID0gJGhyOwoJCSRvdXRbXSA9ICc8L2Zvcm0+JzsKCgkJLy8gLS0tIFNldHRpbmdzIGZvcm0g LS0tIC8vCgoJCSRvdXRbXSA9ICc8Zm9ybSBhY3Rpb249ImluZGV4LnBocCIgbWV0aG9kPSJw b3N0IiBuYW1lPSInLiRzZXR0aW5nc19mb3JtLiciIG9uc3VibWl0PSJyZXR1cm4gc2F2ZSh0 aGlzKTsiPic7CgoJCS8vIC0tLSBTZXR0aW5ncyAtLS0gLy8KCgkJJG91dFtdID0gaGVkKCc8 YSBocmVmPSIjIiBvbmNsaWNrPSJ0b2dnbGVEaXNwbGF5KFwnc2V0dGluZ3NcJyk7IHJldHVy biBmYWxzZTsiPlNldHRpbmdzPC9hPicsIDIpOwoJCSRvdXRbXSA9ICc8ZGl2IGlkPSJzZXR0 aW5ncyI+JzsKCQkkb3V0W10gPSBncmFmKCR0aGlzLT5mSW5wdXQoJ3RleHQnLCAncGxfbmFt ZScsICRwbF9uYW1lLCBOVUxMLCAnTmFtZScpKTsKCQkkb3V0W10gPSBncmFmKCR0aGlzLT5m SW5wdXQoJ3RleHQnLCAncGxfcHJlY2VkZW5jZScsICRwbF9wcmVjZWRlbmNlLCBOVUxMLCAn UHJlY2VkZW5jZScpKTsKCQkkb3V0W10gPSAnPC9kaXY+JzsKCQkkb3V0W10gPSAkaHI7CgoJ CS8vIC0tLSBDb25kaXRpb25zIC0tLSAvLwoKCQkkb3V0W10gPSBoZWQoJzxhIGhyZWY9IiMi IG9uY2xpY2s9InRvZ2dsZURpc3BsYXkoXCdjb25kaXRpb25zXCcpOyByZXR1cm4gZmFsc2U7 Ij5Db25kaXRpb25zPC9hPicsIDIpOwoJCSRvdXRbXSA9ICc8ZGl2IGlkPSJjb25kaXRpb25z IiBzdHlsZT0iZGlzcGxheTpub25lIj4nOwoJCSRvdXRbXSA9IGdyYWYoc3Ryb25nKCdPbmx5 IHVzZSB0aGlzIHBlcm1hbmVudCBsaW5rIGlmIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh cHBseS4uLicpKTsKCgkJLy8gR2VuZXJhdGUgYSBzZWN0aW9ucyBhcnJheSAobmFtZT0+dGl0 bGUpCgkJJHNlY3Rpb25zID0gYXJyYXkoKTsKCQkkcnMgPSBzYWZlX3Jvd3MoJ25hbWUsIHRp dGxlJywgJ3R4cF9zZWN0aW9uJywgIm5hbWUgIT0gJ2RlZmF1bHQnIG9yZGVyIGJ5IG5hbWUi KTsKCQlmb3JlYWNoICgkcnMgYXMgJHNlYykgewoJCQkkc2VjdGlvbnNbJHNlY1snbmFtZSdd XSA9ICRzZWNbJ3RpdGxlJ107CgkJfQoKCQkvLyBHZW5lcmF0ZSBhIGNhdGVnb3JpZXMgYXJy YXkgKG5hbWU9PnRpdGxlKQoJCSRjYXRlZ29yaWVzID0gYXJyYXkoKTsKCQkkcnMgPSBzYWZl X3Jvd3MoJ25hbWUsIHRpdGxlJywgJ3R4cF9jYXRlZ29yeScsICJ0eXBlID0gJ2FydGljbGUn IGFuZCBuYW1lICE9ICdyb290JyBvcmRlciBieSBuYW1lIik7CgkJZm9yZWFjaCAoJHJzIGFz ICRzZWMpIHsKCQkJJGNhdGVnb3JpZXNbJHNlY1snbmFtZSddXSA9ICRzZWNbJ3RpdGxlJ107 CgkJfQoKCQkkb3V0W10gPSBncmFmICgKCQkJJHRoaXMtPmZTZWxlY3QoJ2Nvbl9zZWN0aW9u JywgJHNlY3Rpb25zLCAkY29uX3NlY3Rpb24sIDEsICdXaXRoaW4gc2VjdGlvbicpLm4uCgkJ CSR0aGlzLT5mU2VsZWN0KCdjb25fY2F0ZWdvcnknLCAkY2F0ZWdvcmllcywgJGNvbl9jYXRl Z29yeSwgMSwgJ1dpdGhpbiBjYXRlZ29yeScpCgkJKTsKCQkkb3V0W10gPSAnPC9kaXY+JzsK CQkkb3V0W10gPSAkaHI7CgoJCS8vIC0tLSBEZXN0aW5hdGlvbiAtLS0gLy8KCgkJJG91dFtd ID0gaGVkKCc8YSBocmVmPSIjIiBvbmNsaWNrPSJ0b2dnbGVEaXNwbGF5KFwnZGVzdGluYXRp b25cJyk7IHJldHVybiBmYWxzZTsiPkRlc3RpbmF0aW9uPC9hPicsIDIpOwoJCSRvdXRbXSA9 ICc8ZGl2IGlkPSJkZXN0aW5hdGlvbiIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+JzsKCQkkb3V0 W10gPSBncmFmKHN0cm9uZygnRm9yd2FyZCB0aGlzIHBlcm1hbmVudCBsaW5rIHRvLi4uJykp OwoJCSRvdXRbXSA9IGdyYWYgKAoJCQkkdGhpcy0+ZlNlbGVjdCgnZGVzX3NlY3Rpb24nLCAk c2VjdGlvbnMsICRkZXNfc2VjdGlvbiwgMSwgJ1NlY3Rpb24nKS5uLgoJCQkkdGhpcy0+ZlNl bGVjdCgnZGVzX2NhdGVnb3J5JywgJGNhdGVnb3JpZXMsICRkZXNfY2F0ZWdvcnksIDEsICdD YXRlZ29yeScpCgkJKTsKCQkkb3V0W10gPSBncmFmKCR0aGlzLT5mU2VsZWN0KCdkZXNfcGFn ZScsIHNhZmVfY29sdW1uKCduYW1lJywgJ3R4cF9wYWdlJywgIjEiKSwgQCRkZXNfcGFnZSwg MSwgJ1BhZ2UnKSk7CgkJJG91dFtdID0gZ3JhZigkdGhpcy0+ZkJveGVzKCdkZXNfZmVlZCcs IGFycmF5KCdyc3MnLCAnYXRvbScsICcnKSwgJGRlc19mZWVkLCBOVUxMLCBhcnJheSgnUlNT IGZlZWQnLCAnQXRvbSBmZWVkJywgJ05laXRoZXInKSkpOwoJCSRvdXRbXSA9IGdyYWYoc3Ry b25nKCdSZWRpcmVjdCB0aGlzIHBlcm1hbmVudCBsaW5rIHRvLi4uJykpOwoJCS8vIEdlbmVy YXRlIGEgcGVybWxpbmtzIGFycmF5CgkJJHBlcm1saW5rcyA9ICR0aGlzLT5wYXJlbnQtPmdl dF9hbGxfcGVybWxpbmtzKDEpOwoJCWZvcmVhY2ggKCRwZXJtbGlua3MgYXMgJGtleSA9PiAk cGwpIHsKCQkJJHBlcm1saW5rc1ska2V5XSA9ICRwbFsnc2V0dGluZ3MnXVsncGxfbmFtZSdd OwoJCX0KCQl1bnNldCgkcGVybWxpbmtzWyRpZF0pOwoJCSRvdXRbXSA9IGdyYWYoJHRoaXMt PmZTZWxlY3QoJ2Rlc19wZXJtbGluaycsICRwZXJtbGlua3MsIEAkZGVzX3Blcm1saW5rLCAx LCAnUGVybWFuZW50IGxpbmsnKSk7CgkJJG91dFtdID0gZ3JhZigkdGhpcy0+ZklucHV0KCd0 ZXh0JywgJ2Rlc19sb2NhdGlvbicsICRkZXNfbG9jYXRpb24sIE5VTEwsICdIVFRQIGxvY2F0 aW9uJykpOwoJCSRvdXRbXSA9ICc8L2Rpdj4nOwoJCSRvdXRbXSA9ICRocjsKCgkJLy8gU2F2 ZSBidXR0b24KCQkkb3V0W10gPSBmSW5wdXQoJ3N1Ym1pdCcsICcnLCAnU2F2ZSBwZXJtYW5l bnQgbGluaycpOwoKCQkvLyBFeHRyYSBmb3JtIGlucHV0cyB3aGljaCBnZXQgZmlsbGVkIG9u IHN1Ym1pdAoJCSRvdXRbXSA9IGhJbnB1dCgnY29tcG9uZW50cycsICcnKTsKCQkkb3V0W10g PSBoSW5wdXQoJ3BsX3ByZXZpZXcnLCAnJyk7CgkJLy8gRXZlbnQgYW5kIHRhYiBmb3JtIGlu cHV0cwoJCSRvdXRbXSA9ICR0aGlzLT5mb3JtX2lucHV0cygpOwoJCS8vIFN0ZXAgYW5kIElE IGZvcm0gaW5wdXRzCgkJJG91dFtdID0gc0lucHV0KCRzdGVwKTsKCQkkb3V0W10gPSBoSW5w dXQoZ2JwX2lkLCAkaWQpOwoKCQkkb3V0W10gPSAnPC9mb3JtPic7CgoJCS8vIExldHMgZWNo byBldmVyeXRoaW5nIG91dC4gWWFoIQoJCWVjaG8gam9pbihuLCAkb3V0KTsKCX0KCglmdW5j dGlvbiBmTGFiZWwgKCRsYWJlbCwgJGNvbnRlbnRzID0gJycsICRsYWJlbF9yaWdodCA9IGZh bHNlKSB7CgkJLy8gPGxhYmVsPiB0aGUgY29udGVudHMgd2l0aCB0aGUgbmFtZSAkbGFibGUK CQkkY29udGVudHMgPSAoJGxhYmVsX3JpZ2h0KQoJCT8gJGNvbnRlbnRzLiRsYWJlbAoJCTog JGxhYmVsLigkY29udGVudHMgPyAnOiAnLiRjb250ZW50cyA6ICcnKTsKCQlyZXR1cm4gdGFn KCRjb250ZW50cywgJ2xhYmVsJyk7Cgl9CgoJZnVuY3Rpb24gZkJveGVzICgkbmFtZSA9ICcn LCAkdmFsdWUgPSAnJywgJGNoZWNrZWRfdmFsdWUgPSAnJywgJG9uID0gYXJyYXkoKSwgJGxh YmVsID0gJycpIHsKCQkkb3V0ID0gYXJyYXkoKTsKCQlpZiAoaXNfYXJyYXkoJHZhbHVlKSkg ewoJCQkkaSA9IDA7CgkJCWZvcmVhY2ggKCR2YWx1ZSBhcyAkdmFsKSB7CgkJCQkkbyA9ICc8 aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9IicuJG5hbWUuJyIgdmFsdWU9IicuJHZhbC4nIic7 CgkJCQkkbyAuPSAoJGNoZWNrZWRfdmFsdWUgPT0gJHZhbCkgPyAnIGNoZWNrZWQ9ImNoZWNr ZWQiJyA6ICcnOwoJCQkJaWYgKGlzX2FycmF5KCRvbikpIGZvcmVhY2goJG9uIGFzICRrID0+ ICR2KQoJCQkJCSRvIC49ICgkb24pID8gJyBvbicuJGsuJz0iJy4kdi4nIicgOiAnJzsKCQkJ CSRvIC49ICcgLz4nOwoJCQkJJG91dFtdID0gJHRoaXMtPmZMYWJlbCgkbGFiZWxbJGkrK10s ICRvLCB0cnVlKTsKCQkJfQoJCX0gZWxzZSB7CgkJCSRvID0gJzxpbnB1dCB0eXBlPSJjaGVj a2JveCIgbmFtZT0iJy4kbmFtZS4nIiB2YWx1ZT0iJy4kdmFsdWUuJyInOwoJCQkkbyAuPSAo JGNoZWNrZWRfdmFsdWUgPT0gJHZhbHVlKSA/ICcgY2hlY2tlZD0iY2hlY2tlZCInIDogJyc7 CgkJCWlmIChpc19hcnJheSgkb24pKSBmb3JlYWNoKCRvbiBhcyAkayA9PiAkdikKCQkJCSRv IC49ICgkb24pID8gJyBvbicuJGsuJz0iJy4kdi4nIicgOiAnJzsKCQkJJG8gLj0gJyAvPic7 CgkJCSRvdXRbXSA9ICR0aGlzLT5mTGFiZWwoJGxhYmVsLCAkbywgdHJ1ZSk7CgkJfQoKCQly ZXR1cm4gam9pbignJywgJG91dCk7Cgl9CgoJZnVuY3Rpb24gZklucHV0ICgkdHlwZSwgJG5h bWUgPSAnJywgJHZhbHVlID0gJycsICRvbiA9IGFycmF5KCksICRsYWJlbCA9ICcnKSB7CgkJ aWYgKCR0eXBlID09ICdyYWRpbycgfHwgJHR5cGUgPT0gJ2NoZWNrYm94JykKCQkJcmV0dXJu ICR0aGlzLT5mQm94ZXMoJG5hbWUsICR2YWx1ZSwgJG9uLCAkbGFiZWwpOwoKCQkkbyA9ICc8 aW5wdXQgdHlwZT0iJy4kdHlwZS4nIiBuYW1lPSInLiRuYW1lLiciIHZhbHVlPSInLiR2YWx1 ZS4nIic7CgkJaWYgKGlzX2FycmF5KCRvbikpIGZvcmVhY2goJG9uIGFzICRrID0+ICR2KQoJ CQkkbyAuPSAoJG9uKSA/ICcgb24nLiRrLic9IicuJHYuJyInIDogJyc7CgkJJG8gLj0gJyAv Pic7CgkJcmV0dXJuICgkbGFiZWwpID8gJHRoaXMtPmZMYWJlbCgkbGFiZWwsICRvKSA6ICRv OwoJfQoKCWZ1bmN0aW9uIGZTZWxlY3QgKCRuYW1lID0gJycsICRhcnJheSA9ICcnLCAkdmFs dWUgPSAnJywgJGJsYW5rX2ZpcnN0ID0gJycsICRsYWJlbCA9ICcnLCAkb25fc3VibWl0ID0g JycpIHsKCQkkbyA9IHNlbGVjdElucHV0KCRuYW1lLCAkYXJyYXksICR2YWx1ZSwgJGJsYW5r X2ZpcnN0LCAkb25fc3VibWl0KTsKCQlyZXR1cm4gKCRsYWJlbCA/ICR0aGlzLT5mTGFiZWwo JGxhYmVsLCAkbykgOiAkbyk7Cgl9CgoJZnVuY3Rpb24gcG9zdF9zYXZlX3Blcm1saW5rICgp IHsKCQkvLyBUaGUgZnVuY3Rpb24gcG9zdHMgb3Igc2F2ZXMgYSBwZXJtYW5lbnQgbGluayB0 byB0eHBfcHJlZnMKCgkJZXh0cmFjdChncHNhKGFycmF5KCdzdGVwJywgZ2JwX2lkKSkpOwoK CQkvLyBHcmFiIHRoZSB1c2VyIGRlZmluZWQgc2V0dGluZ3MgZnJvbSB0aGUgZm9ybSBQT1NU IGRhdGEKCQkkc2V0dGluZ3MgPSBncHNhKGFycmF5KAoJCQkncGxfbmFtZScsICdwbF9wcmVj ZWRlbmNlJywgJ3BsX3ByZXZpZXcnLAoJCQknY29uX3NlY3Rpb24nLCAnY29uX2NhdGVnb3J5 JywKCQkJJ2Rlc19zZWN0aW9uJywgJ2Rlc19jYXRlZ29yeScsICdkZXNfcGFnZScsCgkJCSdk ZXNfcGVybWxpbmsnLCAnZGVzX2ZlZWQnLCAnZGVzX2xvY2F0aW9uJywKCQkpKTsKCgkJLy8g UmVtb3ZlIHNwYWNlcyBmcm9tIHRoZSBwZXJtYW5lbnQgbGluayBwcmV2aWV3CgkJJHNldHRp bmdzWydwbF9wcmV2aWV3J10gPSBwcmVnX3JlcGxhY2UoJyVccysvXHMqJScsICcvJywgJHNl dHRpbmdzWydwbF9wcmV2aWV3J10pOwoKCQkvLyBFeHBsb2RlIHRoZSBzZXBhcmF0ZWQgc3Ry aW5nIG9mIHNlcmlhbGl6ZSBjb21wb25lbnRzIC0gdGhpcyB3YXMgbWFkZSBieSBKYXZhU2Ny aXB0LgoJCSRzZXJpYWxpemVfY29tcG9uZW50cyA9IGV4cGxvZGUoZ2JwX3NlcGFyYXRvciwg cnRyaW0oZ3BzKCdjb21wb25lbnRzJyksIGdicF9zZXBhcmF0b3IpKTsKCgkJLy8gVW5zZXJp YWxpemUgdGhlIGNvbXBvbmVudHMKCQkkY29tcG9uZW50cyA9IGFycmF5KCk7CgkJZm9yZWFj aCAoJHNlcmlhbGl6ZV9jb21wb25lbnRzIGFzICRjKQoJCQkkY29tcG9uZW50c1tdID0gdW5z ZXJpYWxpemUoc3RyaXBzbGFzaGVzKCRjKSk7CgoJCS8vIENvbXBsZXRlIHRoZSBwZXJtYW5l bnQgbGluayBhcnJheSAtIHRoaXMgaXMgZXhhY3RseSB3aGF0IG5lZWRzIHRvIGJlIHN0b3Jl ZCBpbiB0aGUgZGIKCQkkcGVybWxpbmsgPSBhcnJheSgnc2V0dGluZ3MnID0+ICRzZXR0aW5n cywgJ2NvbXBvbmVudHMnID0+ICRjb21wb25lbnRzKTsKCgkJLy8gU2F2ZSBpdAoJCSR0aGlz LT5zZXRfcHJlZmVyZW5jZSgkaWQsICRwZXJtbGluaywgJ2dicF9zZXJpYWxpemVkJyk7CgoJ CSR0aGlzLT5wYXJlbnQtPm1lc3NhZ2UgPSBtZXNzZW5nZXIoJycsICRzZXR0aW5nc1sncGxf bmFtZSddLCAnc2F2ZWQnKTsKCX0KCglmdW5jdGlvbiBwaHBBcnJheVRvSnNBcnJheSAoJG5h bWUsICRhcnJheSkgewoJCS8vIEZyb20gUEhQLm5ldAoJCWlmIChpc19hcnJheSgkYXJyYXkp KSB7CgkJCSRyZXN1bHQgPSAkbmFtZS4nID0gbmV3IEFycmF5KCk7Jy5uOwoJCQlmb3JlYWNo ICgkYXJyYXkgYXMgJGtleSA9PiAkdmFsdWUpCgkJCQkkcmVzdWx0IC49ICR0aGlzLT5waHBB cnJheVRvSnNBcnJheSgkbmFtZS4nW1wnJy4ka2V5LidcJ10nLCR2YWx1ZSwnJykubjsKCQl9 IGVsc2UgewoJCQkkcmVzdWx0ID0gJG5hbWUuJyA9IFwnJy4kYXJyYXkuJ1wnOyc7CgkJfQoJ CXJldHVybiAkcmVzdWx0OwoJfQp9CgpjbGFzcyBQZXJtYW5lbnRMaW5rc0xpc3RUYWJWaWV3 IGV4dGVuZHMgR0JQQWRtaW5UYWJWaWV3CnsKCWZ1bmN0aW9uIHByZWxvYWQgKCkgewoJCXJl Z2lzdGVyX2NhbGxiYWNrKGFycmF5KCYkdGhpcywgJHRoaXMtPnBhcmVudC0+ZXZlbnQuJ19t dWx0aV9lZGl0JyksICR0aGlzLT5wYXJlbnQtPmV2ZW50LCAkdGhpcy0+cGFyZW50LT5ldmVu dC4nX211bHRpX2VkaXQnLCAxKTsKCQlyZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJHRoaXMs ICR0aGlzLT5wYXJlbnQtPmV2ZW50LidfY2hhbmdlX3BhZ2VieScpLCAkdGhpcy0+cGFyZW50 LT5ldmVudCwgJHRoaXMtPnBhcmVudC0+ZXZlbnQuJ19jaGFuZ2VfcGFnZWJ5JywgMSk7Cgl9 CgoJZnVuY3Rpb24gbWFpbiAoKSB7CgkJZXh0cmFjdChncHNhKGFycmF5KCdwYWdlJywgJ3Nv cnQnLCAnZGlyJywgJ2NyaXQnLCAnc2VhcmNoX21ldGhvZCcpKSk7CgoJCSRldmVudCA9ICR0 aGlzLT5wYXJlbnQtPmV2ZW50OwoKCQkkcGVybWxpbmtzID0gJHRoaXMtPnBhcmVudC0+Z2V0 X2FsbF9wZXJtbGlua3MoKTsKCQkkdG90YWwgPSBjb3VudCgkcGVybWxpbmtzKTsKCgkJaWYg KCR0b3RhbCA8IDEpIHsKCQkJZWNobyBncmFmKCdZb3UgaGF2ZW5cJ3QgY3JlYXRlZCBhbnkg Y3VzdG9tIHBlcm1hbmVudCBsaW5rcyBydWxlcyB5ZXQuJywgJyBzdHlsZT0idGV4dC1hbGln bjogY2VudGVyOyInKS4KCQkJCSBncmFmKCc8YSBocmVmPSInLiR0aGlzLT51cmwoYXJyYXko Z2JwX3RhYiA9PiAnYnVpbGQnKSwgdHJ1ZSkuJyI+Q2xpY2sgaGVyZTwvYT4gdG8gYWRkIG9u ZS4nLCAnIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IicpOwoJCQlyZXR1cm47CgkJfQoK CQkkbGltaXQgPSBtYXgoJHRoaXMtPnByZWYoJ2xpc3RfcGFnZWJ5JyksIDE1KTsKCgkJbGlz dCgkcGFnZSwgJG9mZnNldCwgJG51bVBhZ2VzKSA9ICR0aGlzLT5wYWdlcigkdG90YWwsICRs aW1pdCwgJHBhZ2UpOwoKCQlpZiAoZW1wdHkoJHNvcnQpKQoJCQkkc29ydCA9ICdwbF9wcmVj ZWRlbmNlJzsKCgkJaWYgKGVtcHR5KCRkaXIpKQoJCQkkZGlyID0gJ2Rlc2MnOwoKCQkkZGly ID0gKCRkaXIgPT0gJ2Rlc2MnKSA/ICdkZXNjJyA6ICdhc2MnOwoKCQkvLyBTb3J0IHRoZSBw ZXJtbGlua3MgdmlhIHRoZSBzZWxlY3RlZCBjb2x1bW4gYW5kIHRoZW4gdGhlaXIgbmFtZXMu CgkJZm9yZWFjaCAoJHBlcm1saW5rcyBhcyAkaWQgPT4gJHBlcm1saW5rKSB7CgkJCSRzb3J0 X2tleXNbJGlkXSA9ICRwZXJtbGlua1snc2V0dGluZ3MnXVskc29ydF07CgkJCSRuYW1lWyRp ZF0gPSAkcGVybWxpbmtbJ3NldHRpbmdzJ11bJ3BsX25hbWUnXTsKCQl9CgkJYXJyYXlfbXVs dGlzb3J0KCRzb3J0X2tleXMsICgoJGRpciA9PSAnZGVzYycpID8gU09SVF9ERVNDIDogU09S VF9BU0MpLCAkbmFtZSwgU09SVF9BU0MsICRwZXJtbGlua3MpOwoKCQkkc3dpdGNoX2RpciA9 ICgkZGlyID09ICdkZXNjJykgPyAnYXNjJyA6ICdkZXNjJzsKCgkJJHBlcm1saW5rcyA9IGFy cmF5X3NsaWNlKCRwZXJtbGlua3MsICRvZmZzZXQsICRsaW1pdCk7CgoJCWlmIChjb3VudCgk cGVybWxpbmtzKSkgewoJCQllY2hvIG4ubi4nPGZvcm0gbmFtZT0ibG9uZ2Zvcm0iIG1ldGhv ZD0icG9zdCIgYWN0aW9uPSJpbmRleC5waHAiIG9uc3VibWl0PSJyZXR1cm4gdmVyaWZ5KFwn Jy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj4nLgoKCQkJCW4uc3RhcnRUYWJsZSgnbGlz dCcpLgoJCQkJbi50cigKCQkJCQluLmNvbHVtbl9oZWFkKCduYW1lJywgJ3BsX25hbWUnLCAk ZXZlbnQsIHRydWUsICRzd2l0Y2hfZGlyLCAkY3JpdCwgJHNlYXJjaF9tZXRob2QpLgoJCQkJ CWhDZWxsKCkuCgkJCQkJY29sdW1uX2hlYWQoJ3ByZXZpZXcnLCAncGxfcHJldmlldycsICRl dmVudCwgdHJ1ZSwgJHN3aXRjaF9kaXIsICRjcml0LCAkc2VhcmNoX21ldGhvZCkuCgkJCQkJ Y29sdW1uX2hlYWQoJ3ByZWNlZGVuY2UnLCAncGxfcHJlY2VkZW5jZScsICRldmVudCwgdHJ1 ZSwgJHN3aXRjaF9kaXIsICRjcml0LCAkc2VhcmNoX21ldGhvZCkuCgkJCQkJaENlbGwoKQoJ CQkJKTsKCgkJCWluY2x1ZGVfb25jZSB0eHBhdGguJy9wdWJsaXNoL3RhZ2hhbmRsZXJzLnBo cCc7CgoJCQlmb3JlYWNoICgkcGVybWxpbmtzIGFzICRpZCA9PiAkcGVybWxpbmspIHsKCQkJ CWV4dHJhY3QoJHBlcm1saW5rWydzZXR0aW5ncyddKTsKCgkJCQkkbWFuYWdlID0gbi4nPHVs Jy4odmVyc2lvbl9jb21wYXJlKCRHTE9CQUxTWyd0aGlzdmVyc2lvbiddLCAnNC4wLjMnLCAn PD0nKSA/ICcgc3R5bGU9Im1hcmdpbjowO3BhZGRpbmc6MDtsaXN0LXN0eWxlLXR5cGU6bm9u ZTsiPicgOiAnPicpLgoJCQkJCQluLnQuJzxsaT4nLmhyZWYoZ1R4dCgnZWRpdCcpLCAkdGhp cy0+dXJsKGFycmF5KGdicF90YWIgPT4gJ2J1aWxkJywgZ2JwX2lkID0+ICRpZCksIHRydWUp KS4nPC9saT4nLgoJCQkJCQluLic8L3VsPic7CgoJCQkJZWNobyBuLm4udHIoCgoJCQkJCXRk KAoJCQkJCQlocmVmKCRwbF9uYW1lLCAkdGhpcy0+dXJsKGFycmF5KGdicF90YWIgPT4gJ2J1 aWxkJywgZ2JwX2lkID0+ICRpZCksIHRydWUpKQoJCQkJCSwgNzUpLgoKCQkJCQl0ZCgkbWFu YWdlLCAzNSkuCgoJCQkJCXRkKCRwbF9wcmV2aWV3LCAxNzUpLgoJCQkJCXRkKCRwbF9wcmVj ZWRlbmNlLicmbmJzcDsnLCA1MCkuCgoJCQkJCXRkKAoJCQkJCQlmSW5wdXQoJ2NoZWNrYm94 JywgJ3NlbGVjdGVkW10nLCAkaWQpCgkJCQkJKQoJCQkJKTsKCQkJfQoKCQkJZWNobyBuLm4u dHIoCgkJCQl0ZGEoCgkJCQkJc2VsZWN0X2J1dHRvbnMoKS4KCQkJCQkkdGhpcy0+cGVybWxp bmtzX211bHRpZWRpdF9mb3JtKCRwYWdlLCAkc29ydCwgJGRpciwgJGNyaXQsICRzZWFyY2hf bWV0aG9kKQoJCQkJLCcgY29sc3Bhbj0iNCIgc3R5bGU9InRleHQtYWxpZ246IHJpZ2h0OyBi b3JkZXI6IG5vbmU7IicpCgkJCSkuCgoJCQluLmVuZFRhYmxlKCkuCgkJCW4uJzwvZm9ybT4n LgoKCQkJbi4kdGhpcy0+bmF2X2Zvcm0oJGV2ZW50LCAkcGFnZSwgJG51bVBhZ2VzLCAkc29y dCwgJGRpciwgJGNyaXQsICRzZWFyY2hfbWV0aG9kKS4KCgkJCW4ucGFnZWJ5X2Zvcm0oJGV2 ZW50LCAkdGhpcy0+cHJlZignbGlzdF9wYWdlYnknKSk7CgkJfQoJfQoKCWZ1bmN0aW9uIHBh Z2VyICgkdG90YWwsICRsaW1pdCwgJHBhZ2UpIHsKCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdw YWdlcicpKQoJCQlyZXR1cm4gcGFnZXIoJHRvdGFsLCAkbGltaXQsICRwYWdlKTsKCgkJLy8g VGhpcyBpcyB0YWtlbiBmcm9tIHR4cGxpYl9taXNjLnBocCByMTU4OCBpdCBpcyByZXF1aXJl ZCBmb3IgNC4wLjMgY29tcGF0aWJpdGx5CgkJJG51bV9wYWdlcyA9IGNlaWwoJHRvdGFsIC8g JGxpbWl0KTsKCQkkcGFnZSA9ICRwYWdlID8gKGludCkgJHBhZ2UgOiAxOwoJCSRwYWdlID0g bWluKG1heCgkcGFnZSwgMSksICRudW1fcGFnZXMpOwoJCSRvZmZzZXQgPSBtYXgoKCRwYWdl IC0gMSkgKiAkbGltaXQsIDApOwoJCXJldHVybiBhcnJheSgkcGFnZSwgJG9mZnNldCwgJG51 bV9wYWdlcyk7Cgl9CgoJZnVuY3Rpb24gbmF2X2Zvcm0gKCRldmVudCwgJHBhZ2UsICRudW1Q YWdlcywgJHNvcnQsICRkaXIsICRjcml0LCAkbWV0aG9kKSB7CgkJaWYgKGZ1bmN0aW9uX2V4 aXN0cygnbmF2X2Zvcm0nKSkKCQkJcmV0dXJuIG5hdl9mb3JtKCRldmVudCwgJHBhZ2UsICRu dW1QYWdlcywgJHNvcnQsICRkaXIsICRjcml0LCAkbWV0aG9kKTsKCgkJLy8gVGhpcyBpcyBi YXNpY2FsbHkgc3RvbGVuIGZyb20gdGhlIDQuMC4zIHZlcnNpb24gb2YgaW5jbHVkZXMvdHhw X2xpc3QucGhwCgkJLy8gLSBsaXN0X25hdl9mb3JtKCkgZm9yIDQuMC4zIGNvbXBhdGliaXRs eQoJCSRuYXZbXSA9ICgkcGFnZSA+IDEpCgkJCT8gUHJldk5leHRMaW5rKCRldmVudCwgJHBh Z2UtMSwgZ1R4dCgncHJldicpLCAncHJldicsICRzb3J0LCAkZGlyKSA6ICcnOwoJCSRuYXZb XSA9IHNwLnNtYWxsKCRwYWdlLiAnLycuJG51bVBhZ2VzKS5zcDsKCQkkbmF2W10gPSAoJHBh Z2UgIT0gJG51bVBhZ2VzKQoJCQk/IFByZXZOZXh0TGluaygkZXZlbnQsICRwYWdlKzEsIGdU eHQoJ25leHQnKSwgJ25leHQnLCAkc29ydCwgJGRpcikgOiAnJzsKCQlyZXR1cm4gKCRuYXYp CgkJCT8gZ3JhZihqb2luKCcnLCAkbmF2KSwgJyBhbGlnbj0iY2VudGVyIicpIDogJyc7Cgl9 CgoJZnVuY3Rpb24gcGVybWxpbmtzX211bHRpZWRpdF9mb3JtICgkcGFnZSwgJHNvcnQsICRk aXIsICRjcml0LCAkc2VhcmNoX21ldGhvZCkgewoJCSRtZXRob2RzID0gYXJyYXkoCgkJCSdk ZWxldGUnID0+IGdUeHQoJ2RlbGV0ZScpLAoJCSk7CgoJCXJldHVybiBldmVudF9tdWx0aWVk aXRfZm9ybSgkdGhpcy0+cGFyZW50LT5ldmVudCwgJG1ldGhvZHMsICRwYWdlLCAkc29ydCwg JGRpciwgJGNyaXQsICRzZWFyY2hfbWV0aG9kKTsKCX0KCglmdW5jdGlvbiBwZXJtbGlua3Nf Y2hhbmdlX3BhZ2VieSAoKSB7CgkJJHRoaXMtPnNldF9wcmVmZXJlbmNlKCdsaXN0X3BhZ2Vi eScsIGdwcygncXR5JykpOwoJfQoKCWZ1bmN0aW9uIHBlcm1saW5rc19tdWx0aV9lZGl0ICgp IHsKCQkkbWV0aG9kID0gZ3BzKCdlZGl0X21ldGhvZCcpCgkJCT8gZ3BzKCdlZGl0X21ldGhv ZCcpIC8vIEZyb20gVHhwIDQuMC40IGFuZCBncmVhdGVyCgkJCTogZ3BzKCdtZXRob2QnKTsg Ly8gVXAgdG8gVHhwIDQuMC4zCgoJCXN3aXRjaCAoJG1ldGhvZCkgewoJCQljYXNlICdkZWxl dGUnOgoJCQkJZm9yZWFjaCAoZ3BzKCdzZWxlY3RlZCcpIGFzICRpZCkgewoJCQkJCQkJJGRl bGV0ZWRbXSA9ICR0aGlzLT5wYXJlbnQtPnJlbW92ZV9wZXJtbGluaygkaWQpOwoJCQkJfQoJ CQlicmVhazsKCQl9CgoJCSR0aGlzLT5wYXJlbnQtPm1lc3NhZ2UgPSAoaXNzZXQoJGRlbGV0 ZWQpICYmIGlzX2FycmF5KCRkZWxldGVkKSAmJiBjb3VudCgkZGVsZXRlZCkpCgkJCT8gbWVz c2VuZ2VyKCcnLCBqb2luKCcsICcsICRkZWxldGVkKSAsJ2RlbGV0ZWQnKQoJCQk6IG1lc3Nl bmdlcignYW4gZXJyb3Igb2NjdXJyZWQnLCAnJywgJycpOwoJfQp9CgpnbG9iYWwgJGdicF9w bDsKJGdicF9wbCA9IG5ldyBQZXJtYW5lbnRMaW5rcygnUGVybWFuZW50IExpbmtzJywgJ3Bl cm1saW5rcycsICdhZG1pbicpOwppZiAoQHR4cGludGVyZmFjZSA9PSAncHVibGljJykgewoJ cmVnaXN0ZXJfY2FsbGJhY2soYXJyYXkoJiRnYnBfcGwsICdfZmVlZF9lbnRyeScpLCAncnNz X2VudHJ5Jyk7CglyZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJGdicF9wbCwgJ19mZWVkX2Vu dHJ5JyksICdhdG9tX2VudHJ5Jyk7CglyZWdpc3Rlcl9jYWxsYmFjayhhcnJheSgmJGdicF9w bCwgJ190ZXh0cGF0dGVybicpLCAndGV4dHBhdHRlcm4nKTsKCXJlZ2lzdGVyX2NhbGxiYWNr KGFycmF5KCYkZ2JwX3BsLCAnX3RleHRwYXR0ZXJuX2VuZCcpLCAndGV4dHBhdHRlcm5fZW5k Jyk7CgoJZnVuY3Rpb24gZ2JwX2lmX3JlZ2V4ICgkYXR0cywgJHRoaW5nKSB7CgkJZ2xvYmFs ICRwcmV0ZXh0OwoJCWV4dHJhY3QobEF0dHMoYXJyYXkoCgkJCSduYW1lJyA9PiAnJywKCQkJ J3ZhbCcgID0+ICcnLAoJCSksJGF0dHMpKTsKCQkkbWF0Y2ggPSAoQCRwcmV0ZXh0WyJwZXJt bGlua19yZWdleF97JG5hbWV9Il0gPT0gJHZhbCk7CgkJcmV0dXJuIHBhcnNlKEV2YWxFbHNl KCR0aGluZywgJG1hdGNoKSk7Cgl9CgoJZnVuY3Rpb24gZ2JwX2lmX3RleHQgKCRhdHRzLCAk dGhpbmcpIHsKCQlnbG9iYWwgJHByZXRleHQ7CgkJZXh0cmFjdChsQXR0cyhhcnJheSgKCQkJ J25hbWUnID0+ICcnLAoJCQkndmFsJyAgPT4gJycsCgkJKSwkYXR0cykpOwoKCQkkbWF0Y2gg PSBmYWxzZTsKCQlpZiAoIWVtcHR5KCRuYW1lKSkgewoJCQlpZiAoZW1wdHkoJHZhbCkpCgkJ CQkkbWF0Y2ggPSAoaXNzZXQoJHByZXRleHRbInBlcm1saW5rX3RleHRfeyRuYW1lfSJdKSk7 CgkJCWVsc2UKCQkJCSRtYXRjaCA9IChAJHByZXRleHRbInBlcm1saW5rX3RleHRfeyRuYW1l fSJdID09ICR2YWwpOwoJCX0KCQlyZXR1cm4gcGFyc2UoRXZhbEVsc2UoJHRoaW5nLCAkbWF0 Y2gpKTsKCX0KCglmdW5jdGlvbiBnYnBfdXNlX3BhZ2VsaW5rICgkYXR0cywgJHRoaW5nID0g JycpIHsKCQlnbG9iYWwgJGdicF9wbDsKCQlleHRyYWN0KGxBdHRzKGFycmF5KAoJCQkncnVs ZScgPT4gJycsCgkJKSwkYXR0cykpOwoJCXJldHVybiAkZ2JwX3BsLT5fdGV4dHBhdHRlcm5f ZW5kX2NhbGxiYWNrKHBhcnNlKCR0aGluZyksICRydWxlKTsKCX0KCglmdW5jdGlvbiBnYnBf ZGlzYWJsZV9wZXJtbGlua3MgKCRhdHRzLCAkdGhpbmcgPSAnJykgewoJCWdsb2JhbCAkZ2Jw X3BsOwoJCXJldHVybiAkZ2JwX3BsLT50b2dnbGVfcGVybWxpbmtfbW9kZSgncGFyc2UnLCAk dGhpbmcpOwoJfQp9IjtzOjQ6InR5cGUiO3M6MToiMSI7czo1OiJvcmRlciI7czoxOiI1Ijtz OjU6ImZsYWdzIjtzOjE6IjAiO3M6NDoiaGVscCI7czoxOTA6IjxoMT5nYnBfcGVybWFuZW50 X2xpbmtzLjwvaDE+Cgo8cD5UaGVyZSBpcyBubyBwbHVnaW4gZG9jdW1lbnRhdGlvbi4gRm9y IGhlbHAgcGxlYXNlIHVzZSB0aGUgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLnRleHRwYXR0ZXJu LmNvbS92aWV3dG9waWMucGhwP2lkPTE4OTE4IiByZWw9Im5vZm9sbG93Ij5mb3J1bSB0aHJl YWQ8L2E+LjwvcD4iO3M6MzoibWQ1IjtzOjMyOiIyMzc0MDJkYmMxZTM1NzI3NWYwZGVhNTA5 Njc2NjIxYyI7fQ==