# tru_tags v3.10 # Article tagging # Nathan Arthur # http://www.rainskit.com/ # ...................................................................... # This is a plugin for Textpattern - http://textpattern.com/ # To install: textpattern > admin > plugins # Paste the following text into the 'Install plugin' box: # ...................................................................... YToxMTp7czoxNToiYWxsb3dfaHRtbF9oZWxwIjtpOjA7czo3OiJ2ZXJzaW9uIjtzOjQ6IjMu MTAiO3M6NjoiYXV0aG9yIjtzOjEzOiJOYXRoYW4gQXJ0aHVyIjtzOjEwOiJhdXRob3JfdXJp IjtzOjI0OiJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS8iO3M6MTE6ImRlc2NyaXB0aW9uIjtz OjE1OiJBcnRpY2xlIHRhZ2dpbmciO3M6NDoidHlwZSI7aToxO3M6NDoibmFtZSI7czo4OiJ0 cnVfdGFncyI7czo0OiJoZWxwIjtzOjQ6IgoKCgoiO3M6NDoiY29kZSI7czo0NzE1OToiCiMg Q29weXJpZ2h0IDIwMTcgTmF0aGFuIEFydGh1cgojIFJlbGVhc2VkIHVuZGVyIHRoZSBHTlUg UHVibGljIExpY2Vuc2UsIHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2Vz L2dwbC1saWNlbnNlLnBocCBmb3IgZGV0YWlscwojCiMgVGhpcyB3b3JrIHdhcyBvcmlnaW5h bGx5IGluc3BpcmVkIGJ5IHJhbl90YWdzIGJ5IFJhbiBBcm91c3NpLCBvcmlnaW5hbGx5IGZv dW5kIGF0IGh0dHA6Ly9hcm91c3NpLmNvbS9hcnRpY2xlLzQ1L3RhZ2dpbmctdGV4dHBhdHRl cm4KIyBKYXZhc2NyaXB0IGJ1ZyBmaXhlcyB3ZXJlIHByb3ZpZGVkIGJ5IHRoZV9naG9zdCAt IGh0dHA6Ly92aWN0b3J1cy5uZXQKIyBKYXZhc2NyaXB0IGNvZGUgZm9yIHRoZSB0YWcgYXV0 by1jb21wbGV0ZSBmZWF0dXJlIHdhcyBwcm92aWRlZCBieSBKaW0gQmlhbmNvbG8gLSBodHRw Oi8vd3d3LmJpYW5jb2xvLmNvbS8KIyBGaXhlcyBmb3IgVGV4dHBhdHRlcm4gNC42IHByb3Zp ZGVkIGJ5OgojICAgLSBSaW1hcyBLdWRlbGlzOyBodHRwczovL2dpdGh1Yi5jb20vcmltYXMt a3VkZWxpcwojICAgLSBqb29scy1yOyBodHRwczovL2dpdGh1Yi5jb20vam9vbHMtcgojICAg LSBTaW1vbiBGaW5jaDsgaHR0cHM6Ly9naXRodWIuY29tL3NwaWZmaW4KCgojIyMgQ09ORklH VVJBVElPTiAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIFRVUk4gQkFDSyEgIENvbmZp Z3VyYXRpb24gaXMgbm8gbG9uZ2VyIGhhbmRsZWQgYnkgZWRpdGluZyB0aGUgcGx1Z2luLgoj IENoZWNrIG91dCB0aGUgJ0V4dGVuc2lvbnMnIHRhYiBpbiB0aGUgVGV4dHBhdHRlcm4gYWRt aW4gOikKCgojIENoYW5naW5nIHRoZXNlIHdvbid0IGRvIGFueSBnb29kLiAgVGhleSdyZSBq dXN0IGhlcmUgYXMgYSBjb252ZW5pZW5jZSBmb3IgZGV2ZWxvcG1lbnQuCmRlZmluZSgnVFJV X1RBR1NfRklFTEQnLCAnS2V5d29yZHMnKTsKZGVmaW5lKCdFTkNPRElORycsICd1dGYtOCcp OwoKZGVmaW5lKCdDTEVBTl9VUkxTJywgJ2NsZWFuX3VybHMnKTsKZGVmaW5lKCdUQUdfU0VD VElPTicsICd0YWdfc2VjdGlvbicpOwpkZWZpbmUoJ1BBUk1fTkFNRScsICdwYXJtJyk7CmRl ZmluZSgnVEFHU19JTl9GRUVEX0NBVEVHT1JJRVMnLCAndGFnc19pbl9mZWVkX2NhdGVnb3Jp ZXMnKTsKZGVmaW5lKCdUQUdTX0lOX0ZFRURfQk9EWScsICd0YWdzX2luX2ZlZWRfYm9keScp OwpkZWZpbmUoJ1RBR1NfSU5fV1JJVEVfVEFCJywgJ3RhZ3NfaW5fd3JpdGVfdGFiJyk7CmRl ZmluZSgnQVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQicsICdhdXRvY29tcGxldGVfaW5fd3Jp dGVfdGFiJyk7CmRlZmluZSgnVVRGXzhfQ0FTRScsICd1dGZfOF9jYXNlJyk7CgpnbG9iYWwg JHRydV90YWdzX3ByZWZzOwpnbG9iYWwgJHRydV90YWdzX3F1ZXJ5X2NhY2hlOwokdHJ1X3Rh Z3NfcHJlZnMgPSB0cnVfdGFnc19sb2FkX3ByZWZzKCk7CiR0cnVfdGFnc19xdWVyeV9jYWNo ZSA9IGFycmF5KCk7CgoKIyMjIFRBRyBSRUdJU1RSQVRJT04gIyMjCiMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIwoKVHhwOjpnZXQoJ1xUZXh0cGF0dGVyblxUYWdcUmVnaXN0cnknKQoJLT5y ZWdpc3RlcigndHJ1X3RhZ3NfaGFuZGxlcicpCgktPnJlZ2lzdGVyKCd0cnVfdGFnc19pZl9o YXNfdGFncycpCgktPnJlZ2lzdGVyKCd0cnVfdGFnc19mcm9tX2FydGljbGUnKQoJLT5yZWdp c3RlcigndHJ1X3RhZ3NfY2xvdWQnKQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfbGlzdCcpCgkt PnJlZ2lzdGVyKCd0cnVfdGFnc19pZl90YWdfc2VhcmNoJykKCS0+cmVnaXN0ZXIoJ3RydV90 YWdzX3RhZ19wYXJhbWV0ZXInKQoJLT5yZWdpc3RlcigndHJ1X3RhZ3Nfc2VhcmNoX3Jlc3Vs dF9leGNlcnB0JykKCS0+cmVnaXN0ZXIoJ3RydV90YWdzX3NlYXJjaF9wYXJhbWV0ZXInKQoJ LT5yZWdpc3RlcigndHJ1X3RhZ3NfcmVsYXRlZF90YWdzX2Zyb21fc2VhcmNoJykKCS0+cmVn aXN0ZXIoJ3RydV90YWdzX2FyY2hpdmUnKQoJLT5yZWdpc3RlcigndHJ1X3RhZ3NfY3VycmVu dF9hcmNoaXZlX3RhZycpOwoKIyMjIFBSSU1BUlkgVEFHIEZVTkNUSU9OUyAjIyMKIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZ1bmN0aW9uIHRydV90YWdzX2hhbmRsZXIoJGF0 dHMpIHsKCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgp LCBmYWxzZSk7CglpZiAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgewoJCWlmICh0cnVfdGFn c19yZWRpcmVjdF9pZl9uZWVkZWQoJHRhZ19wYXJhbWV0ZXIpKSB7CgkJCXJldHVybiAnJzsK CQl9CgkJJGNsZWFuX2F0dHMgPSB0cnVfdGFnc19maXh1cF9xdWVyeV9hdHRzKCRhdHRzLCAk dGFnX3BhcmFtZXRlcik7CgkJJHJlc3VsdCA9IGRvQXJ0aWNsZXMoJGNsZWFuX2F0dHMsIHRy dWUpOwkJI2Z1bmN0aW9uIGluIFRYUCBjb2RlCgkJaWYgKHRyaW0oJHJlc3VsdCkgPT0gJycp IHsKCQkJaWYgKGlzc2V0KCRhdHRzWydub2FydGljbGVzJ10pKSB7CgkJCQl0cnVfdGFnc19y ZWRpcmVjdCgkYXR0c1snbm9hcnRpY2xlcyddLCB0cnVlKTsKCQkJfSBlbHNlIGlmIChpc3Nl dCgkYXR0c1snNDA0cmVkaXJlY3QnXSkgJiYgISRhdHRzWyc0MDRyZWRpcmVjdCddKSB7CgkJ CQlyZXR1cm4gJHJlc3VsdDsKCQkJfSBlbHNlIHsKCQkJCXR4cF9kaWUoZ1R4dCgnNDA0X25v dF9mb3VuZCcpLCAnNDA0Jyk7CgkJCX0KCQl9IGVsc2UgewoJCQlyZXR1cm4gJHJlc3VsdDsK CQl9Cgl9IGVsc2UgewoJCXJldHVybiB0cnVfdGFnc19jbG91ZCgkYXR0cyk7Cgl9Cn0KCgpm dW5jdGlvbiB0cnVfdGFnc19hcmNoaXZlKCRhdHRzKSB7CglnbG9iYWwgJHRydV90YWdzX2N1 cnJlbnRfYXJjaGl2ZV90YWc7CgkkdGFncyA9IGFycmF5X3VuaXF1ZSh0cnVfdGFnc19jbG91 ZF9xdWVyeSh0cnVfdGFnc19nZXRfc3RhbmRhcmRfY2xvdWRfYXR0cygkYXR0cywgZmFsc2Us IGZhbHNlKSkpOwoJbmF0Y2FzZXNvcnQoJHRhZ3MpOwoJZm9yZWFjaCAoJHRhZ3MgYXMgJHRh ZykgewoJCSR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnID0gJHRhZzsKCQkkY2xlYW5f YXR0cyA9IHRydV90YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWcpOwoJCSRyZXN1 bHRzW10gPSBkb0FydGljbGVzKCRjbGVhbl9hdHRzLCB0cnVlKTsJCSNmdW5jdGlvbiBpbiBU WFAgY29kZQoJfQoJcmV0dXJuIGpvaW4oJyAnLCAkcmVzdWx0cyk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKCRhdHRzKSB7CglnbG9iYWwgJHRydV90YWdz X2N1cnJlbnRfYXJjaGl2ZV90YWc7CglleHRyYWN0KGxBdHRzKGFycmF5KCdsaW5rJyA9PiAn MCcpLCAgJGF0dHMsIDApKTsKCWlmICgkbGluaykgewoJCXJldHVybiAnPGEgaHJlZj0iJyAu IHRydV90YWdzX2xpbmtpZnlfdGFnKCR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnKSAu ICciPicgLiAkdHJ1X3RhZ3NfY3VycmVudF9hcmNoaXZlX3RhZyAuICc8L2E+JzsKCX0gZWxz ZSB7CgkJcmV0dXJuICR0cnVfdGFnc19jdXJyZW50X2FyY2hpdmVfdGFnOwoJfQp9CgoKZnVu Y3Rpb24gdHJ1X3RhZ3NfY2xvdWQoJGF0dHMpIHsKCXJldHVybiB0cnVfdGFnc19saXN0KHRy dV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpKTsK fQoKCmZ1bmN0aW9uIHRydV90YWdzX2xpc3QoJGF0dHMpIHsKCSRhdHRzID0gdHJ1X3RhZ3Nf Z2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsIHRydWUsIGZhbHNlKTsKCSRhbGxfdGFn cyA9IHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKTsKCglyZXR1cm4gdHJ1X3RhZ3NfcmVu ZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19mcm9tX2FydGljbGUoJGF0dHMpIHsKCWdsb2JhbCAkdGhpc2FydGljbGU7Cgll eHRyYWN0KCR0aGlzYXJ0aWNsZSk7CgoJJGFsbF90YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3Nf Zm9yX2FydGljbGUoJHRoaXNpZCk7CgoJJGF0dHMgPSB0cnVfdGFnc19nZXRfc3RhbmRhcmRf Y2xvdWRfYXR0cygkYXR0cywgZmFsc2UsIHRydWUpOwoJJGFsbF90YWdzX2Zvcl93ZWlnaHQg PSAkYWxsX3RhZ3M7CglpZiAoJGF0dHNbJ3VzZW92ZXJhbGxjb3VudHMnXSkgewoJCSRhbGxf dGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJfQoKCXJl dHVybiB0cnVfdGFnc19yZW5kZXJfY2xvdWQoJGF0dHMsICRhbGxfdGFncywgJGFsbF90YWdz X2Zvcl93ZWlnaHQpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfaWZfaGFzX3RhZ3MoJGF0dHMs ICR0aGluZykgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZTsKCWV4dHJhY3QoJHRoaXNhcnRpY2xl KTsKCgkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOwoKCSRycyA9IHNhZmVfcm93KCR0 YWdzX2ZpZWxkLCAidGV4dHBhdHRlcm4iLCAiSUQ9JyR0aGlzaWQnIEFORCAkdGFnc19maWVs ZCA8PiAnJyIpOwoJcmV0dXJuIHBhcnNlKEV2YWxFbHNlKCR0aGluZywgJHJzKSk7Cn0KCgpm dW5jdGlvbiB0cnVfdGFnc19pZl90YWdfc2VhcmNoKCRhdHRzLCAkdGhpbmcpIHsKCWV4dHJh Y3QobEF0dHMoYXJyYXkoJ3RhZycgPT4gJycpLCAgJGF0dHMsIDApKTsKCgkkdGFnX3BhcmFt ZXRlciA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4g MSksIGZhbHNlKTsKCSRjb25kaXRpb24gPSAoIWVtcHR5KCR0YWdfcGFyYW1ldGVyKSkgPyB0 cnVlIDogZmFsc2U7CglpZiAoJGNvbmRpdGlvbiAmJiAhZW1wdHkoJHRhZykpIHsKCQkkY29u ZGl0aW9uID0gKCR0YWdfcGFyYW1ldGVyID09ICR0YWcpOwoJfQoJcmV0dXJuIHBhcnNlKEV2 YWxFbHNlKCR0aGluZywgJGNvbmRpdGlvbikpOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdGFn X3BhcmFtZXRlcigkYXR0cywgJHNhZmVodG1sID0gdHJ1ZSkgewoJZ2xvYmFsICR0cnVfdGFn c19wcmVmczsKCWV4dHJhY3QobEF0dHMoYXJyYXkoJ3N0cmlwaHlwaGVucycgPT4gJzAnLCAn dXJsZW5jb2RlJyA9PiAwKSwgICRhdHRzLCAwKSk7CgoJJHBhcm0gPSB1cmxkZWNvZGUoc3Ry aXBfdGFncyhncHMoJHRydV90YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlKSkpOwoJaWYg KCdsb29rdXAnID09ICRzdHJpcGh5cGhlbnMpIHsKCQkkYXR0cyA9IHRydV90YWdzX2dldF9z dGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNlLCBmYWxzZSk7CgkJJHRhZ19saXN0 ID0gYXJyYXlfdW5pcXVlKHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRzKSk7CgkJZm9yZWFj aCAoJHRhZ19saXN0IGFzICRjbG91ZF90YWcpIHsKCQkJaWYgKCRwYXJtID09IHN0cl9yZXBs YWNlKCcgJywgJy0nLCAkY2xvdWRfdGFnKSkgewoJCQkJJHBhcm0gPSAkY2xvdWRfdGFnOwoJ CQkJYnJlYWs7CgkJCX0KCQl9Cgl9IGVsc2UgaWYgKCRzdHJpcGh5cGhlbnMpIHsKCQkkcGFy bSA9IHN0cl9yZXBsYWNlKCctJywgJyAnLCAkcGFybSk7Cgl9CglpZiAoJHVybGVuY29kZSkg ewoJCSRwYXJtID0gdXJsZW5jb2RlKCRwYXJtKTsKCSB9IGVsc2UgaWYgKCRzYWZlaHRtbCkg ewoJCSRwYXJtID0gaHRtbHNwZWNpYWxjaGFycygkcGFybSk7Cgl9CgoJcmV0dXJuICRwYXJt Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc2VhcmNoX3Jlc3VsdF9leGNlcnB0KCRhdHRzKSB7 CglnbG9iYWwgJHByZXRleHQ7CgoJJHRhZ19wYXJhbWV0ZXIgPSB0cnVfdGFnc190YWdfcGFy YW1ldGVyKGFycmF5KCksIGZhbHNlKTsKCWlmICh0cmltKCR0YWdfcGFyYW1ldGVyKSAhPSAn JykgewoJCSRxID0gJHByZXRleHRbJ3EnXTsKCQkkcHJldGV4dFsncSddID0gJHRhZ19wYXJh bWV0ZXI7CgkJJHJlc3VsdCA9IHNlYXJjaF9yZXN1bHRfZXhjZXJwdCgkYXR0cyk7CgkJJHBy ZXRleHRbJ3EnXSA9ICRxOwoJfSBlbHNlIHsKCQkkcmVzdWx0ID0gc2VhcmNoX3Jlc3VsdF9l eGNlcnB0KCRhdHRzKTsKCX0KCXJldHVybiAkcmVzdWx0Owp9CgoKZnVuY3Rpb24gdHJ1X3Rh Z3Nfc2VhcmNoX3BhcmFtZXRlcigpIHsKCXRyaWdnZXJfZXJyb3IoZ1R4dCgnZGVwcmVjYXRl ZF90YWcnKSwgRV9VU0VSX05PVElDRSk7CglyZXR1cm4gc3RyaXBfdGFncyhncHMoJ3EnKSk7 Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19yZWxhdGVkX3RhZ3NfZnJvbV9zZWFyY2goJGF0dHMp IHsKCSR0YWdfcGFyYW1ldGVyID0gdHJ1X3RhZ3NfdGFnX3BhcmFtZXRlcihhcnJheSgpLCBm YWxzZSk7CglleHRyYWN0KGxBdHRzKGFycmF5KCd0YWdfcGFyYW1ldGVyJyA9PiAkdGFnX3Bh cmFtZXRlciksICAkYXR0cywgMCkpOwoJaWYgKCFlbXB0eSgkdGFnX3BhcmFtZXRlcikpIHsK ICAgICAgICAkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOwoJCSRhbGxfdGFncyA9IGFy cmF5KCk7CgoJCSRxdWVyeV9hdHRzID0gdHJ1X3RhZ3NfZml4dXBfcXVlcnlfYXR0cygkYXR0 cywgJHRhZ19wYXJhbWV0ZXIpOwoJCSRycyA9IHRydV90YWdzX3JlZG9fYXJ0aWNsZV9zZWFy Y2goJHF1ZXJ5X2F0dHMpOwoJCWlmICgkcnMpIHsKCQkJd2hpbGUgKCRhID0gbmV4dFJvdygk cnMpKSB7CgkJCQkkYXJ0aWNsZV90YWdzID0gYXJyYXkoKTsKCQkJCWlmIChpc3NldCgkYVsk dGFnc19maWVsZF0pKSB7CgkJCQkJJGFydGljbGVfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmlt KHRydV90YWdzX3N0cnRvbG93ZXIoJGFbJHRhZ3NfZmllbGRdKSkpOwoJCQkJfQoJCQkJIyBm YXN0ZXIgaW1wbGVtZW50YXRpb24gb2YgYXJyYXlfbWVyZ2UoKSwgdGhhbmtzIHRvIHdob2Nh cmV6CgkJCQkjIChodHRwOi8vZm9ydW0udGV4dHBhdHRlcm4uY29tL3ZpZXd0b3BpYy5waHA/ cGlkPTIzODM3MyNwMjM4MzczKQoJCQkJZm9yZWFjaCh0cnVfdGFnc190cmltX3RhZ3MoJGFy dGljbGVfdGFncykgYXMgJGkpIHskYWxsX3RhZ3NbXSA9ICRpO30KCQkJfQoJCX0KCgkJJGFs dF90YWdfcGFyYW1ldGVyID0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVy KTsKCQlmb3JlYWNoICgkYWxsX3RhZ3MgYXMgJGtleSA9PiAkdGFnKSB7CgkJCWlmICgkdGFn ID09ICR0YWdfcGFyYW1ldGVyIHx8ICR0YWcgPT0gJGFsdF90YWdfcGFyYW1ldGVyKSB7CgkJ CQl1bnNldCgkYWxsX3RhZ3NbJGtleV0pOwoJCQl9CgkJfQoKCQkkY2xvdWRfYXR0cyA9IHRy dV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKCRhdHRzLCBmYWxzZSwgZmFsc2UpOwoJ CSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gJGFsbF90YWdzOwoJCWlmICgkY2xvdWRfYXR0c1sn dXNlb3ZlcmFsbGNvdW50cyddKSB7CgkJCSRhbGxfdGFnc19mb3Jfd2VpZ2h0ID0gdHJ1X3Rh Z3NfY2xvdWRfcXVlcnkoJGNsb3VkX2F0dHMpOwoJCX0KCgkJcmV0dXJuIHRydV90YWdzX3Jl bmRlcl9jbG91ZCgkY2xvdWRfYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdo dCk7Cgl9IGVsc2UgewoJCXJldHVybiAnJzsKCX0KfQoKCiMjIyBDTE9VRCBTVVBQT1JUIEZV TkNUSU9OUyAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnVuY3Rpb24g dHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0dHMoJGF0dHMsICRpc0xpc3QsICRpc0Fy dGljbGUsICRzaG93QWxsPWZhbHNlKSB7CglyZXR1cm4gbEF0dHMoYXJyYXkoJ3dyYXB0YWcn CT0+ICgkaXNMaXN0ID8gJ3VsJyA6ICcnKSwKCQkJJ2JyZWFrJwkJPT4gKCRpc0xpc3QgPyAn bGknIDogJywgJyksCgkJCSdjbGFzcycJCT0+ICcnLAoJCQknYnJlYWtjbGFzcycJPT4gJycs CgkJCSdzZWN0aW9uJwk9PiAnJywKCQkJJ21pbnBlcmNlbnQnCT0+ICcxMDAnLAoJCQknbWF4 cGVyY2VudCcJPT4gKCRpc0xpc3QgfHwgJGlzQXJ0aWNsZSA/ICcxMDAnIDogJzIwMCcpLAoJ CQknc2hvd2NvdW50cycJPT4gJycsCgkJCSdjb3VudHdyYXBjaGFycycJPT4gJ1tdJywKCQkJ J3VzZXJlbHRhZycJPT4gKCRpc0FydGljbGUgPyAnMScgOiAnJyksCgkJCSdnZW5lcmF0ZWxp bmtzJwk9PiAnMScsCgkJCSdtaW50YWdjb3VudCcJPT4gJzAnLAoJCQknbWF4dGFnY291bnQn CT0+ICcxMDAwJywKCQkJJ3NldHNpemVzJwk9PiAoJGlzQXJ0aWNsZSA/ICcwJyA6ICcxJyks CgkJCSd1c2Vub2ZvbGxvdycJPT4gJycsCgkJCSdzb3J0JwkJPT4gJ2FscGhhJywKCQkJJ3Vz ZW92ZXJhbGxjb3VudHMnCT0+ICcnLAoJCQknc2V0Y2xhc3NlcycJPT4gKCRpc0FydGljbGUg PyAnMCcgOiAnMScpLAoJCQkndGl0bGUnCQk9PiAnJywKCQkJJ2xpc3RsaW1pdCcJPT4gJycs CgkJCSdrZWVwJwkJPT4gJ2xhcmdlc3QnLAoJCQknY3V0b2ZmJwk9PiAnY2h1bmsnLAoJCQkn dGV4dHRyYW5zZm9ybScJPT4gJ25vbmUnLAoJCQknbGlua3BhdGgnCT0+ICcnLAoJCQknbGlu a3BhdGh0YWlsJwk9PiAnJywKCQkJJ2ZpbHRlcnNlYXJjaCcJPT4gKCRzaG93QWxsID8gMCA6 ICcxJyksCgkJCSdleGNsdWRlc2VjdGlvbic9PiAnJywKCQkJJ2FjdGl2ZWNsYXNzJwk9PiAn dGFnQWN0aXZlJywKCQkJJ3RpbWUnCQk9PiAoJHNob3dBbGwgPyAnYW55JyA6ICdwYXN0JykK CQkpLCRhdHRzLCAwKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2Nsb3VkX3F1ZXJ5KCRhdHRz KSB7CglnbG9iYWwgJHRydV90YWdzX3F1ZXJ5X2NhY2hlOwoJZXh0cmFjdCgkYXR0cyk7CgoJ JHNlY3Rpb25fY2xhdXNlID0gJyc7CglpZiAoJHNlY3Rpb24gPD4gJycpIHsKCQkka2V5cyA9 IGV4cGxvZGUoJywnLCAkc2VjdGlvbik7CgkJZm9yZWFjaCAoJGtleXMgYXMgJGtleSkgewoJ CQkka2V5cGFydHNbXSA9ICIgU2VjdGlvbiA9ICciIC4gdHJpbSgka2V5KSAuICInIjsKCQl9 CgkJJHNlY3Rpb25fY2xhdXNlID0gIiBBTkQgKCIgLiBqb2luKCcgb3IgJywgJGtleXBhcnRz KSAuICIpIjsKCX0KCgkkdGFnc19maWVsZCA9IFRSVV9UQUdTX0ZJRUxEOwoJaW5jbHVkZV9v bmNlIHR4cGF0aC4nL3B1Ymxpc2gvc2VhcmNoLnBocCc7CgoJJGZpbHRlciA9IHRydV90YWdz X2ZpbHRlcl9zZWN0aW9ucygkZXhjbHVkZXNlY3Rpb24pOwoJJGZpbHRlciAuPSAoJGZpbHRl cnNlYXJjaCA/IGZpbHRlclNlYXJjaCgpIDogJycpOwoKCS8vIFVzaW5nIFNRTCBjYWNoaW5n IGNhcGFiaWxpdGllcy4gVHhwIDQuNisKCWlmIChmdW5jdGlvbl9leGlzdHMoJ25vdycpKSB7 CgkJJHdoZXJlX3Bvc3RlZCA9IG5vdygncG9zdGVkJyk7CgkJJHdoZXJlX2V4cGlyZWQgPSAi IEFORCAoIi5ub3coJ2V4cGlyZXMnKS4iIDw9IEV4cGlyZXMgT1IgRXhwaXJlcyBJUyBOVUxM KSI7Cgl9IGVsc2UgewoJCSR3aGVyZV9wb3N0ZWQgPSAibm93KCkiOwoJCSR3aGVyZV9leHBp cmVkID0gIiBBTkQgKG5vdygpIDw9IEV4cGlyZXMgT1IgRXhwaXJlcyA9ICIuTlVMTERBVEVU SU1FLiIpIjsKCX0KCglzd2l0Y2ggKCR0aW1lKSB7CgkJY2FzZSAnYW55JzoKCQkJJHRpbWUg PSAiIjsgYnJlYWs7CgkJY2FzZSAnZnV0dXJlJzoKCQkJJHRpbWUgPSAiIEFORCBQb3N0ZWQg PiAiLiR3aGVyZV9wb3N0ZWQ7IGJyZWFrOwoJCWRlZmF1bHQ6CgkJCSR0aW1lID0gIiBBTkQg UG9zdGVkIDw9ICIuJHdoZXJlX3Bvc3RlZDsKCX0KCWdsb2JhbCAkcHJlZnM7CglleHRyYWN0 KCRwcmVmcyk7CglpZiAoISRwdWJsaXNoX2V4cGlyZWRfYXJ0aWNsZXMpIHsKCQkkdGltZSAu PSAkd2hlcmVfZXhwaXJlZDsKCX0KCgkkYWxsX3RhZ3MgPSBhcnJheSgpOwoJJHF1ZXJ5X3do ZXJlID0gIiR0YWdzX2ZpZWxkIDw+ICcnIiAuICRzZWN0aW9uX2NsYXVzZSAuICRmaWx0ZXIg LiAiIGFuZCBTdGF0dXMgPj0gJzQnIiAuICR0aW1lOwoJaWYgKGFycmF5X2tleV9leGlzdHMo JHF1ZXJ5X3doZXJlLCAkdHJ1X3RhZ3NfcXVlcnlfY2FjaGUpKSB7CgkJJHJzID0gJHRydV90 YWdzX3F1ZXJ5X2NhY2hlWyRxdWVyeV93aGVyZV07Cgl9IGVsc2UgewoJCSRycyA9IHNhZmVf cm93cygiJHRhZ3NfZmllbGQiLCAidGV4dHBhdHRlcm4iLCAkcXVlcnlfd2hlcmUpOwoJCSR0 cnVfdGFnc19xdWVyeV9jYWNoZVskcXVlcnlfd2hlcmVdID0gJHJzOwoJfQoJZm9yZWFjaCAo JHJzIGFzICRyb3cpIHsKCQkkdGVtcF9hcnJheSA9IGFycmF5KCk7CgkJaWYgKGlzc2V0KCRy b3dbJHRhZ3NfZmllbGRdKSkgewoJCQkkdGVtcF9hcnJheSA9IGV4cGxvZGUoIiwiLCB0cmlt KHRydV90YWdzX3N0cnRvbG93ZXIoJHJvd1skdGFnc19maWVsZF0pKSk7CgkJfQoJCSMgZmFz dGVyIGltcGxlbWVudGF0aW9uIG9mIGFycmF5X21lcmdlKCksIHRoYW5rcyB0byB3aG9jYXJl egoJCSMgKGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9 MjM4MzczI3AyMzgzNzMpCgkJZm9yZWFjaCh0cnVfdGFnc190cmltX3RhZ3MoJHRlbXBfYXJy YXkpIGFzICRpKSB7JGFsbF90YWdzW10gPSAkaTt9Cgl9CgoJcmV0dXJuICRhbGxfdGFnczsK fQoKCmZ1bmN0aW9uIHRydV90YWdzX2ZpbHRlcl9zZWN0aW9ucygkZXhjbHVkZXNlY3Rpb24p IHsKCSRzZWN0aW9ucyA9IGV4cGxvZGUoJywnLCAkZXhjbHVkZXNlY3Rpb24pOwoJJGZpbHRl cnMgPSBhcnJheSgpOwoJZm9yZWFjaCAoJHNlY3Rpb25zIGFzICRzZWN0aW9uKSB7CgkJJGZp bHRlcnNbXSA9ICJhbmQgU2VjdGlvbiAhPSAnIi5kb1NsYXNoKCRzZWN0aW9uKS4iJyI7Cgl9 CglyZXR1cm4gam9pbignICcsICRmaWx0ZXJzKTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3Jl bmRlcl9jbG91ZCgkYXR0cywgJGFsbF90YWdzLCAkYWxsX3RhZ3NfZm9yX3dlaWdodCkgewoJ Z2xvYmFsICR0cnVfdGFnc19wcmVmczsKCWV4dHJhY3QoJGF0dHMpOwoKCSR0YWdzX3dlaWdo dCA9IGFycmF5X2NvdW50X3ZhbHVlcygkYWxsX3RhZ3NfZm9yX3dlaWdodCk7CgoJZm9yZWFj aCAoJHRhZ3Nfd2VpZ2h0IGFzICR0YWcgPT4gJHdlaWdodCkgewoJCWlmICghaW5fYXJyYXko JHRhZywgJGFsbF90YWdzKQoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFnXSA8ICRtaW50YWdj b3VudAoJCSAgIHx8ICR0YWdzX3dlaWdodFskdGFnXSA+ICRtYXh0YWdjb3VudCkgewoJCQl1 bnNldCgkdGFnc193ZWlnaHRbJHRhZ10pOwoJCX0KCX0KCgkkc29ydF9ieV9jb3VudCA9IChz dHJwb3MoJHNvcnQsICdjb3VudCcpICE9PSBmYWxzZSk7Cgkkc29ydF9hc2NlbmRpbmcgPSAo c3RycG9zKCRzb3J0LCAnYXNjJykgIT09IGZhbHNlKTsKCSR0YWdzX3dlaWdodCA9IHRydV90 YWdzX3NvcnRfdGFncygkdGFnc193ZWlnaHQsICRzb3J0X2J5X2NvdW50LCAkc29ydF9hc2Nl bmRpbmcpOwoKCWlmICgkbGlzdGxpbWl0ID4gMCAmJiAkbGlzdGxpbWl0IDwgY291bnQoJHRh Z3Nfd2VpZ2h0KSkgewoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXkoKTsKCQlpZiAoJGtlZXAg PT0gJ2xhcmdlc3QnKSB7CgkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVfdGFn c19zb3J0X3RhZ3MoJHRhZ3Nfd2VpZ2h0LCB0cnVlLCBmYWxzZSkpOwoJCX0gZWxzZSB7CgkJ CWlmICgka2VlcCA9PSAncmFuZG9tJykgewoJCQkJZm9yZWFjaCAoJHRhZ3Nfd2VpZ2h0IGFz ICR0YWcgPT4gJHdlaWdodCkgewoJCQkJCSRyZXNvcnRlZF90YWdzWyR0YWddID0gcmFuZCgw LCAkd2VpZ2h0KTsKCQkJCX0KCQkJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfa2V5cyh0cnVf dGFnc19zb3J0X3RhZ3MoJHJlc29ydGVkX3RhZ3MsIHRydWUsIGZhbHNlKSk7CgkJCX0gZWxz ZSBpZiAoJGtlZXAgPT0gJ2FscGhhJykgewoJCQkJJHJlc29ydGVkX3RhZ3MgPSBhcnJheV9r ZXlzKCR0YWdzX3dlaWdodCk7CgkJCQluYXRjYXNlc29ydCgkcmVzb3J0ZWRfdGFncyk7CgkJ CX0KCQkJJGN1dG9mZiA9ICdleGFjdCc7CgkJfQoKCQkkbGFzdF9nb29kX2luZGV4ID0gJGxp c3RsaW1pdCAtIDE7CgkJaWYgKCRjdXRvZmYgPT0gJ2NodW5rJykgeyAvL2FsdGVybmF0aXZl IGlzICdleGFjdCcKCQkJJGxhc3Rfd2VpZ2h0ID0gLTE7CgkJCWZvciAoJGkgPSAwOyAkaSA8 ICRsaXN0bGltaXQgKyAxOyAkaSsrKSB7CgkJCQkkbmV3X3dlaWdodCA9ICR0YWdzX3dlaWdo dFskcmVzb3J0ZWRfdGFnc1skaV1dOwoJCQkJaWYgKCRuZXdfd2VpZ2h0ICE9ICRsYXN0X3dl aWdodCkgewoJCQkJCSRsYXN0X2dvb2RfaW5kZXggPSAkaSAtIDE7CgkJCQkJJGxhc3Rfd2Vp Z2h0ID0gJG5ld193ZWlnaHQ7CgkJCQl9CgkJCX0KCQkJaWYgKCRsYXN0X2dvb2RfaW5kZXgg PCAwKSB7CgkJCQkkbGFzdF9nb29kX2luZGV4ID0gJGxpc3RsaW1pdCAtIDE7CgkJCX0KCQl9 CgoJCSRyZXNvcnRlZF90YWdzID0gYXJyYXlfY2h1bmsoJHJlc29ydGVkX3RhZ3MsICRsYXN0 X2dvb2RfaW5kZXggKyAxKTsKCQkkcmVzb3J0ZWRfdGFncyA9ICRyZXNvcnRlZF90YWdzWzBd OwoKCQlmb3JlYWNoICgkdGFnc193ZWlnaHQgYXMgJHRhZyA9PiAkd2VpZ2h0KSB7CgkJCWlm ICghaW5fYXJyYXkoJHRhZywgJHJlc29ydGVkX3RhZ3MpKSB7CgkJCQl1bnNldCgkdGFnc193 ZWlnaHRbJHRhZ10pOwoJCQl9CgkJfQoJfQoKCWlmICgkZ2VuZXJhdGVsaW5rcykgewoJCWlm ICgkbGlua3BhdGgpIHsKCQkJJHVybHByZWZpeCA9ICRsaW5rcGF0aDsKCQkJJHVybHN1ZmZp eCA9ICRsaW5rcGF0aHRhaWw7CgkJfSBlbHNlIHsKCQkJaWYgKHRydV90YWdzX2NsZWFuX3Vy bHMoKSkgewoJCQkJJHVybHByZWZpeCA9IGh1IC4gJHRydV90YWdzX3ByZWZzW1RBR19TRUNU SU9OXS0+dmFsdWUgLiAnLyc7CgkJCX0gZWxzZSB7CgkJCQkkdXJscHJlZml4ID0gaHUgLiAn P3M9JyAuICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlIC4gJyZhbXA7JyAu ICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZSAuICc9JzsKCQkJfQoJCQkkdXJs c3VmZml4ID0gKHRydV90YWdzX2NsZWFuX3VybHMoKSA/ICcvJyA6ICcnKTsKCQl9CgoJCWlm ICgkdXNlcmVsdGFnKSB7CgkJCWlmICgkdXNlbm9mb2xsb3cpIHsKCQkJCSR1cmxzdWZmaXgg Lj0gJyIgcmVsPSJ0YWcgbm9mb2xsb3cnOwoJCQl9IGVsc2UgewoJCQkJJHVybHN1ZmZpeCAu PSAnIiByZWw9InRhZyc7CgkJCX0KCQl9IGVsc2UgaWYgKCR1c2Vub2ZvbGxvdykgewoJCQkk dXJsc3VmZml4IC49ICciIHJlbD0ibm9mb2xsb3cnOwoJCX0KCX0KCglpZiAoY291bnQoJHRh Z3Nfd2VpZ2h0KSA+IDApIHsKCQkkbWF4ID0gbWF4KCR0YWdzX3dlaWdodCk7CgkJJG1pbiA9 IG1pbigkdGFnc193ZWlnaHQpOwoJfSBlbHNlIHsKCQkkbWF4ID0gJG1pbiA9IDA7Cgl9Cgkk c3RlcHZhbHVlID0gKCRtYXggPT0gJG1pbikgPyAwIDogKCRtYXhwZXJjZW50IC0gJG1pbnBl cmNlbnQpIC8gKCRtYXggLSAkbWluKTsKCgkkdGFnc19odG1sID0gYXJyYXkoKTsKCSR0YWdf c2VhcmNoX3RhZyA9IHRydV90YWdzX3RhZ19wYXJhbWV0ZXIoYXJyYXkoJ3N0cmlwaHlwaGVu cycgPT4gJ2xvb2t1cCcpKTsKCSR0YWdfc2VhcmNoX3RhZyA9IGZ1bmN0aW9uX2V4aXN0cygi aHRtbHNwZWNpYWxjaGFyc19kZWNvZGUiKSA/IGh0bWxzcGVjaWFsY2hhcnNfZGVjb2RlKCR0 YWdfc2VhcmNoX3RhZykgOiBodG1sX2VudGl0eV9kZWNvZGUoJHRhZ19zZWFyY2hfdGFnKTsK CWZvcmVhY2ggKCR0YWdzX3dlaWdodCBhcyAkdGFnID0+ICR3ZWlnaHQpIHsKCQkkdGFnX3dl aWdodCA9IGZsb29yKCRtaW5wZXJjZW50ICsgKCR3ZWlnaHQgLSAkbWluKSAqICRzdGVwdmFs dWUpOwoKCQkkc3R5bGUgPSAnJzsKCQlpZiAoJHNldHNpemVzKQoJCQkkc3R5bGUgPSAnIHN0 eWxlPSJmb250LXNpemU6ICcgLiAkdGFnX3dlaWdodCAuICclOyInOwoKCQkkdGFnX2NsYXNz ID0gJyc7CgkJaWYgKCRzZXRjbGFzc2VzKSB7CgkJCSR0YWdfY2xhc3MgPSAnIGNsYXNzPSIn OwoJCQlpZiAoJHdlaWdodCA9PSAkbWluKSB7CgkJCQkkdGFnX2NsYXNzIC49ICJ0YWdTaXpl U21hbGxlc3QiOwoJCQl9IGVsc2UgaWYgKCR3ZWlnaHQgPT0gJG1heCkgewoJCQkJJHRhZ19j bGFzcyAuPSAidGFnU2l6ZUxhcmdlc3QiOwoJCQl9IGVsc2UgewoJCQkJJHRhZ19jbGFzcyAu PSAidGFnU2l6ZU1lZGl1bSI7CgkJCX0KCQkJJHRhZ19jbGFzcyAuPSAnIHRhZ1NpemUnIC4g KCR3ZWlnaHQgKyAxIC0gJG1pbik7CgkJCWlmICgkdGFnID09ICR0YWdfc2VhcmNoX3RhZykg ewoJCQkJJHRhZ19jbGFzcyAuPSAnICcgLiAkYWN0aXZlY2xhc3M7CgkJCX0KCQkJJHRhZ19j bGFzcyAuPSAnIic7CgkJfQoKCQkvL2FkYXB0ZWQgZnJvbSBjb2RlIGJ5IGdkdHJvaWFubywg c2VlIGh0dHA6Ly9mb3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9waWQ9MTAy ODc1I3AxMDI4NzUKCQkkdGl0bGVjb3VudCA9ICcnOwoJCWlmICgkdGl0bGUpCgkJCSR0aXRs ZWNvdW50ID0gJyB0aXRsZT0iJyAuICR0aXRsZSAuICciJzsKCQkkZGlzcGxheWNvdW50PSAn JzsKCQkkY291bnQgPSAkY291bnR3cmFwY2hhcnNbMF0gLiAkd2VpZ2h0IC4gJGNvdW50d3Jh cGNoYXJzWzFdOwoJCWlmICgkc2hvd2NvdW50cyA9PSAndGl0bGUnIHx8ICRzaG93Y291bnRz ID09ICdib3RoJykKCQkJJHRpdGxlY291bnQgPSAnIHRpdGxlPSInIC4gJHRpdGxlIC4gJGNv dW50IC4gJyInOwoJCWlmICgkc2hvd2NvdW50cyAmJiAkc2hvd2NvdW50cyAhPSAndGl0bGUn KQoJCQkkZGlzcGxheWNvdW50ID0gJyAnIC4gJGNvdW50OwoKCQlpZiAoJHRleHR0cmFuc2Zv cm0gPT0gJ2NhcGl0YWxpemUnKSB7CgkJCSR0YWcgPSB0cnVfdGFnc191Y3dvcmRzKCR0YWcp OwoJCX0gZWxzZSBpZiAoJHRleHR0cmFuc2Zvcm0gPT0gJ3VwcGVyY2FzZScpIHsKCQkJJHRh ZyA9IHRydV90YWdzX3N0cnRvdXBwZXIoJHRhZyk7CgkJfSBlbHNlIGlmICgkdGV4dHRyYW5z Zm9ybSA9PSAnbG93ZXJjYXNlJykgewoJCQkkdGFnID0gdHJ1X3RhZ3Nfc3RydG9sb3dlcigk dGFnKTsKCQl9IGVsc2UgaWYgKCR0ZXh0dHJhbnNmb3JtID09ICdjYXBmaXJzdCcpIHsKCQkJ JHRhZyA9IHRydV90YWdzX3VjZmlyc3QoJHRhZyk7CgkJfQoKCQlpZiAoJGdlbmVyYXRlbGlu a3MpIHsKCQkJJHdob2xldXJsID0gJyInIC4gJHVybHByZWZpeCAuIHVybGVuY29kZSgkdGFn KSAuICR1cmxzdWZmaXggLiAnIic7CgkJCSR0YWdzX2h0bWxbXSA9ICc8YSBocmVmPScgLiAk d2hvbGV1cmwgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQgLiAnPicgLiBo dG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvYT4nIC4gJGRpc3BsYXljb3VudDsKCQl9IGVs c2UgaWYgKCR0YWdfY2xhc3MgfHwgJHN0eWxlIHx8ICR0aXRsZWNvdW50KSB7CgkJCSR0YWdz X2h0bWxbXSA9ICc8c3BhbicgLiAkdGFnX2NsYXNzIC4gJHN0eWxlIC4gJHRpdGxlY291bnQg LiAnPicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJzwvc3Bhbj4nIC4gJGRpc3BsYXlj b3VudDsKCQl9IGVsc2UgewoJCQkkdGFnc19odG1sW10gPSBodG1sc3BlY2lhbGNoYXJzKCR0 YWcpIC4gJGRpc3BsYXljb3VudDsKCQl9Cgl9CglyZXR1cm4gdHJ1X3RhZ3NfZG9fd3JhcCgk dGFnc19odG1sLCAkd3JhcHRhZywgJGJyZWFrLCAkY2xhc3MsICRicmVha2NsYXNzKTsKfQoK CiMjIyBDTEVBTiBVUkwgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMKCmlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCXJlZ2lzdGVyX2NhbGxiYWNrKCd0 cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcicsICdwcmV0ZXh0Jyk7Cn0KCgpmdW5jdGlvbiB0 cnVfdGFnc19jbGVhbl91cmxfaGFuZGxlcigkZXZlbnQsICRzdGVwKSB7CglnbG9iYWwgJHRy dV90YWdzX3ByZWZzOwoJJHN1YnBhdGggPSBwcmVnX3JlcGxhY2UoIi9odHRwcz86XC9cLy4q KFwvLiopL1VpIiwiJDEiLGh1KTsKCSRyZWdzYWZlc3VicGF0aCA9IHByZWdfcXVvdGUoJHN1 YnBhdGgsICcvJyk7CgkkcmVxID0gcHJlZ19yZXBsYWNlKCIvXiRyZWdzYWZlc3VicGF0aC9p IiwnLycsJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pOwoKCSRxcyA9IHN0cnBvcygkcmVxLCAn PycpOwoJJHFhdHRzID0gKCRxcyA/ICcmJy5zdWJzdHIoJHJlcSwgJHFzICsgMSkgOiAnJyk7 CglpZiAoJHFzKSAkcmVxID0gc3Vic3RyKCRyZXEsIDAsICRxcyk7CgoJJHBhcnRzID0gYXJy YXlfdmFsdWVzKGFycmF5X2ZpbHRlcihleHBsb2RlKCcvJywgJHJlcSkpKTsKCWlmIChjb3Vu dCgkcGFydHMpID09IDIgJiYgJHBhcnRzWzBdID09ICR0cnVfdGFnc19wcmVmc1tUQUdfU0VD VElPTl0tPnZhbHVlKSB7CgkJJHRhZyA9ICRwYXJ0c1sxXTsKCQkkX1NFUlZFUlsnUVVFUllf U1RSSU5HJ10gPSAkdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWUgLiAnPScgLiAk dGFnIC4gJHFhdHRzOwoJCSRfU0VSVkVSWydSRVFVRVNUX1VSSSddID0gJHN1YnBhdGggLiAk dHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvPycgLiAkX1NFUlZFUlsn UVVFUllfU1RSSU5HJ107CgkJaWYgKGNvdW50KCRfUE9TVCkgPiAwKSB7CgkJCSRfUE9TVFsn c2VjdGlvbiddID0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9OXS0+dmFsdWU7CgkJCSRf UE9TVFskdHJ1X3RhZ3NfcHJlZnNbUEFSTV9OQU1FXS0+dmFsdWVdID0gJHRhZzsKCQl9IGVs c2UgewoJCQkkX0dFVFsnc2VjdGlvbiddID0gJHRydV90YWdzX3ByZWZzW1RBR19TRUNUSU9O XS0+dmFsdWU7CgkJCSRfR0VUWyR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1ZV0g PSAkdGFnOwoJCX0KCX0KfQoKCmZ1bmN0aW9uIHRydV90YWdzX2NsZWFuX3VybHMoKSB7Cgln bG9iYWwgJHRydV90YWdzX3ByZWZzOwoJcmV0dXJuICgnY2xlYW4nID09ICR0cnVfdGFnc19w cmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUpOwp9CgoKIyMjIEFETUlOIFNJREUgRlVOQ1RJT05T ICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppZiAoQHR4cGludGVyZmFjZSA9 PSAnYWRtaW4nKSB7CglhZGRfcHJpdnMoJ3RydV90YWdzJywgJzEsMicpOwoJcmVnaXN0ZXJf dGFiKCdleHRlbnNpb25zJywgJ3RydV90YWdzJywgJ3RydV90YWdzJyk7CglyZWdpc3Rlcl9j YWxsYmFjaygndHJ1X3RhZ3NfYWRtaW5fdGFiJywgJ3RydV90YWdzJyk7CgoJaWYgKCR0cnVf dGFnc19wcmVmc1tUQUdTX0lOX1dSSVRFX1RBQl0tPnZhbHVlIHx8ICR0cnVfdGFnc19wcmVm c1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXS0+dmFsdWUpIHsKCQlyZWdpc3Rlcl9jYWxs YmFjaygndHJ1X3RhZ3NfYWRtaW5fd3JpdGVfdGFiX2hhbmRsZXInLCAnYXJ0aWNsZV91aScs ICdrZXl3b3JkcycpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiKCRldmVu dCwgJHN0ZXApIHsKCXJlcXVpcmVfcHJpdnMoJ3RydV90YWdzJyk7CgoJJHJlc3VsdHMgPSB0 cnVfdGFnc19hZG1pbl90YWJfaGFuZGxlX2lucHV0KCk7CgoJJGF0dHMgPSB0cnVfdGFnc19n ZXRfc3RhbmRhcmRfY2xvdWRfYXR0cyhhcnJheSgpLCBmYWxzZSwgZmFsc2UsIHRydWUpOwoJ JGFsbF90YWdzID0gdHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpOwoJJGNsb3VkID0gdHJ1 X3RhZ3NfcmVuZGVyX2Nsb3VkKCRhdHRzLCAkYWxsX3RhZ3MsICRhbGxfdGFncyk7CgoJJHJl ZGlyZWN0cyA9IHRydV90YWdzX2xvYWRfcmVkaXJlY3RzKCk7CgoJdHJ1X3RhZ3NfYWRtaW5f dGFiX3JlbmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQsICRyZWRpcmVjdHMpOwp9CgoKZnVu Y3Rpb24gdHJ1X3RhZ3NfYWRtaW5fdGFiX3JlbmRlcl9wYWdlKCRyZXN1bHRzLCAkY2xvdWQs ICRyZWRpcmVjdHMpIHsKCWdsb2JhbCAkZXZlbnQ7CglwYWdldG9wKCd0cnVfdGFncycsICcn KTsKCglpbmNsdWRlX29uY2UodHhwYXRoIC4gJy9pbmNsdWRlL3R4cF9wcmVmcy5waHAnKTsK CWdsb2JhbCAkdHJ1X3RhZ3NfcHJlZnM7CgoJZWNobyBzdGFydFRhYmxlKCdsYXlvdXQnLCAn JywgJycsICcxMHB4JykuJzx0cj48dGQgc3R5bGU9ImJvcmRlci1yaWdodDoycHggc29saWQg Z3JheSI+Jy4gICMgSSBrbm93LCBJIGtub3cuLi4KCQlzdGFydFRhYmxlKCdsYXlvdXQnLCAn JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBz b2xpZCBncmF5Ij4nLgoJCQlzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzMwMHB4 JykuCgkJCQl0cihoQ2VsbChnVHh0KCdDdXJyZW50IHRhZ3MnKSkpLgoJCQkJdHIodGQoJGNs b3VkKSkuCgkJCWVuZFRhYmxlKCkuCgkJJzwvdGQ+PC90cj48dHI+PHRkPicuCgkJCXN0YXJ0 VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMzAwcHgnKS4KCQkJCXRyKGhDZWxsKGdUeHQo J3RydV90YWdzIFJlZmVyZW5jZScpKSkuCgkJCQl0cih0ZCgnPGEgaHJlZj0iaHR0cDovL3d3 dy5yYWluc2tpdC5jb20vcmVmZXJlbmNlLzQ5Ny90cnV0YWdzLXVzYWdlLWluc3RydWN0aW9u cyI+VXNhZ2UgaW5zdHJ1Y3Rpb25zPC9hPicuCgkJCQknPGJyPjxhIGhyZWY9Imh0dHA6Ly9m b3J1bS50ZXh0cGF0dGVybi5jb20vdmlld3RvcGljLnBocD9pZD0xNTA4NCI+Rm9ydW0gcGFn ZXM8L2E+Jy4KCQkJCSc8YnI+PGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vcmVm ZXJlbmNlLzUzNy90cnVfdGFncy1yZWxlYXNlcyI+UmVsZWFzZXMgcGFnZTwvYT4nLgoJCQkJ Jzxicj48YSBocmVmPSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3Ry dV90YWdzLXJvYWRtYXAiPlJlbGVhc2Ugcm9hZG1hcDwvYT4nLgoJCQkJJzxicj48YSBocmVm PSJodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNDk1L3RydXRhZ3MtZmVhdHVy ZS1saXN0Ij5GZWF0dXJlIGxpc3Q8L2E+Jy4KCQkJCSc8YnI+PGJyPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS90cnVpc3QvdHJ1LXRhZ3MvYmxvYi9tYXN0ZXIvdHJ1X3RhZ3MucGhw Ij50cnVfdGFncyBzb3VyY2UgY29kZTwvYT4nLgoJCQkJJzxicj48YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vdHJ1aXN0L3RydS10YWdzL2Jsb2IvbWFzdGVyL3RydV90YWdzLWRvY3Mu aHRtbCI+U291cmNlIEhUTUwgZm9yIHRoZSB1c2FnZSBpbnN0cnVjdGlvbnM8L2E+Jy4KCQkJ CSc8YnI+PGJyPjxhIGhyZWY9Imh0dHA6Ly93d3cucmFpbnNraXQuY29tL2Jsb2cvNDkzL3Ry dXRhZ3MtYS10YWdnaW5nLXBsdWdpbi1mb3ItdGV4dHBhdHRlcm4iPnRydV90YWdzPC9hPiwg YnkgPGEgaHJlZj0iaHR0cDovL3d3dy5yYWluc2tpdC5jb20vIj5OYXRoYW4gQXJ0aHVyPC9h PicuCgkJCQknPGJyPjxicj4nLgoJCQkJJzxkaXYgaWQ9InBheXBhbCI+PGZvcm0gYWN0aW9u PSJodHRwczovL3d3dy5wYXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyIiBtZXRob2Q9InBvc3Qi PjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayIgLz48 aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9lbl9VUy9p L2J0bi94LWNsaWNrLWJ1dDA0LmdpZiIgbmFtZT0ic3VibWl0IiBhbHQ9Ik1ha2UgYSBkb25h dGlvbiB0byBOYXRoYW4gQXJ0aHVyIiAvPjxpbWcgYWx0PSIiIGJvcmRlcj0iMCIgc3JjPSJo dHRwczovL3d3dy5wYXlwYWwuY29tL2VuX1VTL2kvc2NyL3BpeGVsLmdpZiIgd2lkdGg9IjEi IGhlaWdodD0iMSIgLz48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJlbmNyeXB0ZWQiIHZh bHVlPSItLS0tLUJFR0lOIFBLQ1M3LS0tLS1NSUlIVHdZSktvWklodmNOQVFjRW9JSUhRREND Qnp3Q0FRRXhnZ0V3TUlJQkxBSUJBRENCbERDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJn TlZCQWdUQWtOQk1SWXdGQVlEVlFRSEV3MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFL RXd0UVlYbFFZV3dnU1c1akxqRVRNQkVHQTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0Ex VUVBeFFJYkdsMlpWOWhjR2t4SERBYUJna3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVq YjIwQ0FRQXdEUVlKS29aSWh2Y05BUUVCQlFBRWdZQzhpMVQyN2xqS2ZwTlRFUWkwd0tIY2RH dWx4eGtNcXdkQ01tYkd2czg3bi80VHNKdGlBc3FNbzJoeXM3WnNHeTVSRi9PN3MrQjJvUTc2 elVsVDUyV1c3UWVYVUszR3AwbnIyY1AzaW9CU3ROdStSWjZqa2FtMkUwRkdMWHlWNitVTlZF T3doOGxtb0lTUm90dlN2SWdReVRMbkVlREhxRzlxdlV6cXZGM1NxakVMTUFrR0JTc09Bd0lh QlFBd2djd0dDU3FHU0liM0RRRUhBVEFVQmdncWhraUc5dzBEQndRSXBtUFpybHJaZlptQWdh aWVQVmIrbjlzVmRzdWZnR3JtQXcyclhBelIzOWtZcVBVSjduMExpTkRtZEFxNzNKb1A1M2ta eThnU3BvdnVjTDJTMGpDMXNYcmNwRUxBcExMOEJGU0hmZExpWm9aU1YvQ1lPcHBINStkeDJZ cUZJZHlDQ2RqSVg3b09QZ1F5QXVnUmEyUXIzYit5dXR1RzBERnNkK0xBSkdiOGw0Q25ucmJt d2RZSzNOblZEQlBPbXhFT2psWFVnRXpsRkxYbUUzdzUrTW9QS1FjcDJuOGZkSkxzZ0cxNXhv VlBGekNkL0syZ2dnT0hNSUlEZ3pDQ0F1eWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVG QURDQmpqRUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQk1SWXdGQVlEVlFRSEV3 MU5iM1Z1ZEdGcGJpQldhV1YzTVJRd0VnWURWUVFLRXd0UVlYbFFZV3dnU1c1akxqRVRNQkVH QTFVRUN4UUtiR2wyWlY5alpYSjBjekVSTUE4R0ExVUVBeFFJYkdsMlpWOWhjR2t4SERBYUJn a3Foa2lHOXcwQkNRRVdEWEpsUUhCaGVYQmhiQzVqYjIwd0hoY05NRFF3TWpFek1UQXhNekUx V2hjTk16VXdNakV6TVRBeE16RTFXakNCampFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJB Z1RBa05CTVJZd0ZBWURWUVFIRXcxTmIzVnVkR0ZwYmlCV2FXVjNNUlF3RWdZRFZRUUtFd3RR WVhsUVlXd2dTVzVqTGpFVE1CRUdBMVVFQ3hRS2JHbDJaVjlqWlhKMGN6RVJNQThHQTFVRUF4 UUliR2wyWlY5aGNHa3hIREFhQmdrcWhraUc5dzBCQ1FFV0RYSmxRSEJoZVhCaGJDNWpiMjB3 Z1o4d0RRWUpLb1pJaHZjTkFRRUJCUUFEZ1kwQU1JR0pBb0dCQU1GSFR0MzhSTXhMWEp5TzJT bVMrTmRsNzJUN29LSjR1NHV3KzZhd250QUxXaDAzUGV3bUlKdXpiQUxTY3NUUzRzWm9TMWZL Y2lCR29oMTFnSWZIenlsdmtkTmUvaEpsNjYvUkdxcmo1ckZiMDhzQUFCTlR6RFRpcXFOcEpl QnNZcy9jMmFpR296cHRYMlJsbkJrdEgrU1VOcEFhalc3MjROdjJXdmhpZjZzRkFnTUJBQUdq Z2U0d2dlc3dIUVlEVlIwT0JCWUVGSmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFdaSlJyTUlHN0Jn TlZIU01FZ2JNd2diQ0FGSmFmZkx2R2J4ZTlXVDlTMXdvYjdCRFdaSlJyb1lHVXBJR1JNSUdP TVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNCTUNRMEV4RmpBVUJnTlZCQWNURFUxdmRX NTBZV2x1SUZacFpYY3hGREFTQmdOVkJBb1RDMUJoZVZCaGJDQkpibU11TVJNd0VRWURWUVFM RkFwc2FYWmxYMk5sY25Sek1SRXdEd1lEVlFRREZBaHNhWFpsWDJGd2FURWNNQm9HQ1NxR1NJ YjNEUUVKQVJZTmNtVkFjR0Y1Y0dGc0xtTnZiWUlCQURBTUJnTlZIUk1FQlRBREFRSC9NQTBH Q1NxR1NJYjNEUUVCQlFVQUE0R0JBSUZmT2xhYWdGcmw3MStqcTZPS2lkYldGU0UrUTRGcVJP dmRnSU9OdGgrOGtTSy8vWS80aWh1RTRZbXZ6bjVjZUUzUy9pQlNRUU1qeXZiK3MyVFdiUVlE d2NwMTI5T1BJYkQ5ZXBkcjR0Sk9VTmlTb2p3N0JId1lSaVBoNThTMXhHbEZnSEZYd3JFQmIz ZGdOYk1VYSt1NHFlY3RzTUFYcFZIbkQ5d0l5Zm1ITVlJQm1qQ0NBWllDQVFFd2daUXdnWTR4 Q3pBSkJnTlZCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkRRVEVXTUJRR0ExVUVCeE1OVFc5MWJu UmhhVzRnVm1sbGR6RVVNQklHQTFVRUNoTUxVR0Y1VUdGc0lFbHVZeTR4RXpBUkJnTlZCQXNV Q214cGRtVmZZMlZ5ZEhNeEVUQVBCZ05WQkFNVUNHeHBkbVZmWVhCcE1Sd3dHZ1lKS29aSWh2 Y05BUWtCRmcxeVpVQndZWGx3WVd3dVkyOXRBZ0VBTUFrR0JTc09Bd0lhQlFDZ1hUQVlCZ2tx aGtpRzl3MEJDUU14Q3dZSktvWklodmNOQVFjQk1Cd0dDU3FHU0liM0RRRUpCVEVQRncwd09E QTNNRE13TkRFME1USmFNQ01HQ1NxR1NJYjNEUUVKQkRFV0JCVDB0a2o0ZFpMZS9FNFF3Ymli MjlYRWRIeEFZakFOQmdrcWhraUc5dzBCQVFFRkFBU0JnTDVKc1FIalE5U2c0WTNlRFdLRE8x NnIrdGZFejRSWUFEdCs2aDk4MWZrVkN4Zk5IRkR4b2ZEY3h5elJNWXI3eTk1Y2RuVmk0QU5R d01VWTZ5Slc1am0vR0QxN3JqZ1N4Wk1FdnNBZTZZY0NTTEs1WmFwQ3cxcWx5U3BQR1pCQTNN VHQ2T0Qrb3ZWb2EvMXY4Q05zRWNIcDdmNHRPeE9VU3c1UDRuSHlMUFdqLS0tLS1FTkQgUEtD UzctLS0tLSI+PC9mb3JtPjwvZGl2PicKCQkJCSkpLgoJCQllbmRUYWJsZSgpLgoJCSc8L3Rk PjwvdHI+Jy5lbmRUYWJsZSgpLgoJJzwvdGQ+PHRkPicuCgkJc3RhcnRUYWJsZSgnbGF5b3V0 JywgJycsICcnLCAnMTBweCcpLic8dHI+PHRkIHN0eWxlPSJib3JkZXItYm90dG9tOjJweCBz b2xpZCBncmF5O3dpZHRoOjQwMHB4Ij4nOwoKCQlpZiAoJHJlc3VsdHMpIHsKCQkJZWNobyBz dGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAnJywgJzEwMCUnKS4KCQkJCXRyKGhDZWxsKGdU eHQoJ1Jlc3VsdHMnKSkpLgoJCQkJdHIodGRhKCRyZXN1bHRzKSwgJyBzdHlsZT0iY29sb3I6 cmVkIicpLgoJCQllbmRUYWJsZSgpOwoJCQllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHls ZT0iYm9yZGVyLWJvdHRvbToycHggc29saWQgZ3JheSI+JzsKCQl9CgoKCQllY2hvIHN0YXJ0 VGFibGUoJ2xpc3QnLCAnJywgJycsICcnLCAnMTAwJScpLgoJCQl0cih0YWcoZ1R4dCgnQXJ0 aWNsZSBUYWcgTWFpbnRlbmFuY2UnKS4nICgnLmdUeHQoJ0Nhc2UgU2Vuc2l0aXZlJykuJyEp JywgJ3RoJywgJyBjb2xzcGFuPSI1IicpKS4KCQkJdHIoCgkJCQlmb3JtKAoJCQkJCXRkYShn VHh0KCdSZW5hbWUnKS4nOiAnLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJyku CgkJCQkJdGQodGV4dF9pbnB1dCgnbWF0Y2h0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkYShn VHh0KCd0bycpLic6JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJ CXRkKHRleHRfaW5wdXQoJ3JlcGxhY2V0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkKGZJbnB1 dCgnc3VibWl0JywgJ3JlcGxhY2UnLCBnVHh0KCdSdW4nKSwgJ3B1Ymxpc2gnKS5lSW5wdXQo J3RydV90YWdzJykpLAoJCQkJCScnLCAnIHZlcmlmeShcJycgLiBnVHh0KCdhcmVfeW91X3N1 cmUnKSAuICdcJykiJwoJCQkJKQoJCQkpLgoJCQl0cigKCQkJCWZvcm0oCgkJCQkJdGRhKGdU eHQoJ0RlbGV0ZScpLic6ICcsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4K CQkJCQl0ZCh0ZXh0X2lucHV0KCdkZWxldGV0YWcnLCAnJywgJzE1JykpLgoJCQkJCXRkY3Mo JycsIDIpLgoJCQkJCXRkKGZJbnB1dCgnc3VibWl0JywgJ2RlbGV0ZScsIGdUeHQoJ1J1bicp LCAncHVibGlzaCcpLmVJbnB1dCgndHJ1X3RhZ3MnKSksCgkJCQkJJycsICcgdmVyaWZ5KFwn JyAuIGdUeHQoJ2FyZV95b3Vfc3VyZScpIC4gJ1wnKSInCgkJCQkpCgkJCSkuCgkJZW5kVGFi bGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbToy cHggc29saWQgZ3JheSI+JzsKCgkJZWNobyBzdGFydFRhYmxlKCdsaXN0JywgJycsICcnLCAn JywgJzEwMCUnKS4KCQkJdHIodGFnKGdUeHQoJ1JlZGlyZWN0aW9ucycpLCAndGgnLCAnIGNv bHNwYW49IjQiJykpOwoJCQlmb3JlYWNoICgkcmVkaXJlY3RzIGFzICRsZWZ0dGFnID0+ICRy aWdodHRhZykgewoJCQkJZWNobyB0cigKCQkJCQl0ZGEoaHJlZigkbGVmdHRhZywgdHJ1X3Rh Z3NfbGlua2lmeV90YWcoJGxlZnR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVy IicpLgoJCQkJCXRkYShodG1sc3BlY2lhbGNoYXJzKCc9PicpLCAnIHN0eWxlPSJ0ZXh0LWFs aWduOiBjZW50ZXIiJykuCgkJCQkJdGRhKGhyZWYoJHJpZ2h0dGFnLCB0cnVfdGFnc19saW5r aWZ5X3RhZygkcmlnaHR0YWcpKSwgJyBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIicpLgoJ CQkJCXRkKCc8YSBocmVmPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MmYW1wO2RlbGV0ZV9y ZWRpcmVjdD0nLnVybGVuY29kZSgkbGVmdHRhZykuJyIgIG9uY2xpY2s9InJldHVybiB2ZXJp ZnkoXCcnLmdUeHQoJ2FyZV95b3Vfc3VyZScpLidcJykiPkRlbGV0ZTwvYT4nKQoJCQkJKTsK CQkJfQoJCQllY2hvIHRyKAoJCQkJJzxmb3JtIG5hbWU9InJlZGlyZWN0IiBpZD0icmVkaXJl Y3QiIG1ldGhvZD0icG9zdCIgYWN0aW9uPSJpbmRleC5waHA/ZXZlbnQ9dHJ1X3RhZ3MiIG9u c3VibWl0PSJyZXR1cm4gdmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpIj4n LgoJCQkJCXRkYSh0ZXh0X2lucHV0KCdsZWZ0dGFnJywgJycsICcxNScpLCAnIHN0eWxlPSJ0 ZXh0LWFsaWduOmNlbnRlciInKS4KCQkJCQl0ZGEoaHRtbHNwZWNpYWxjaGFycygnPT4nKSwg JyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlO3RleHQtYWxpZ246Y2VudGVyIicpLgoJ CQkJCXRkYSh0ZXh0X2lucHV0KCdyaWdodHRhZycsICcnLCAnMTUnKSwgJyBzdHlsZT0idGV4 dC1hbGlnbjpjZW50ZXIiJykuCgkJCQkJdGRhKCc8YSBocmVmPSIjIiBvbmNsaWNrPSJpZiAo dmVyaWZ5KFwnJy5nVHh0KCdhcmVfeW91X3N1cmUnKS4nXCcpKSBkb2N1bWVudC5nZXRFbGVt ZW50QnlJZChcJ3JlZGlyZWN0XCcpLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7Ij5BZGQgbmV3 PC9hPicsICcgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1pZGRsZSInKS4KCQkJCQlmSW5wdXQo J2hpZGRlbicsICdyZWRpcmVjdCcsICcxJykuCgkJCQknPC9mb3JtPicKCgkJCSkuCgkJZW5k VGFibGUoKTsKCgllY2hvICc8L3RkPjwvdHI+PHRyPjx0ZD4nOwoKCQllY2hvIHN0YXJ0VGFi bGUoJ2xpc3QnKS4KCQkJdHIodGFnKGdUeHQoJ1ByZWZlcmVuY2VzJyksICd0aCcsICcgY29s c3Bhbj0iMiInKSkuCgkJCWZvcm0oCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnVXNlIGNsZWFu IFVSTHMnKS4nICgnLmdUeHQoJ3NpdGUgZGVmYXVsdCBpcycpLicgJy4kdHJ1X3RhZ3NfcHJl ZnNbQ0xFQU5fVVJMU10tPmRlZmF1bHRfdmFsdWUuJyk6ICcsICcgc3R5bGU9InZlcnRpY2Fs LWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZChyYWRpb19saXN0KENMRUFOX1VSTFMsCgkJCQkJ CQlhcnJheSgnY2xlYW4nPT5nVHh0KCdjbGVhbicpLCAnbWVzc3knPT5nVHh0KCdtZXNzeScp KSwKCQkJCQkJCSR0cnVfdGFnc19wcmVmc1tDTEVBTl9VUkxTXS0+dmFsdWUpKQoJCQkJKS4K CQkJCXRyKAoJCQkJCXRkYShnVHh0KCdUYWcgc2VjdGlvbiBuYW1lJykuJyAoZGVmYXVsdCBp cyAiJy4kdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT5kZWZhdWx0X3ZhbHVlLiciKTog JywgJyBzdHlsZT0idmVydGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHRleHRfaW5w dXQoVEFHX1NFQ1RJT04sICR0cnVfdGFnc19wcmVmc1tUQUdfU0VDVElPTl0tPnZhbHVlLCAn MTUnKSkKCQkJCSkuCgkJCQl0cigKCQkJCQl0ZGEoZ1R4dCgnVVJMIHBhcmFtZXRlciBmb3Ig dGFnIHNlYXJjaCcpLicgKGRlZmF1bHQgaXMgIicuJHRydV90YWdzX3ByZWZzW1BBUk1fTkFN RV0tPmRlZmF1bHRfdmFsdWUuJyIpOiAnLgoJCQkJCQknPGJyPjxlbT4oeW91IHNob3VsZG5c J3QgY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUgZG9p bmcpPC9lbT4nLCAnIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUiJykuCgkJCQkJdGQo dGV4dF9pbnB1dChQQVJNX05BTUUsICR0cnVfdGFnc19wcmVmc1tQQVJNX05BTUVdLT52YWx1 ZSwgJzE1JykpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ1B1dCB0YWdzIGludG8g UlNTL0F0b20gZmVlZHMsIGluICJDYXRlZ29yeSIgZWxlbWVudHMnKS4KCQkJCQkJJzogPGJy PjxlbT4oeW91IHByb2JhYmx5IHdhbnQgdGhpcyk8L2VtPicsICcgc3R5bGU9InZlcnRpY2Fs LWFsaWduOm1pZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9DQVRF R09SSUVTLCAkdHJ1X3RhZ3NfcHJlZnNbVEFHU19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1 ZSkpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKCdBcHBlbmQgdGhlIHRhZyBsaXN0IHRvIHRo ZSBib2R5IG9mIFJTUy9BdG9tIGZlZWRzLCAnLgoJCQkJCQknd2l0aCBsaW5rcywgYW5kIHdp dGggcmVsPSJ0YWciOicuCgkJCQkJCSc8YnI+PGVtPihpZiB0aGlzIGlzIHR1cm5lZCBvbiwn LgoJCQkJCQkneW91IGNhbiBkZWZpbmUgYSAibWlzYyIgZm9ybSBuYW1lZCB0cnVfdGFnc19m ZWVkX3RhZ3MgJy4KCQkJCQkJJ3RoYXQgd2lsbCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgdGFn cyBpbiB0aGUgZmVlZCk8L2VtPicsCgkJCQkJCScgc3R5bGU9InZlcnRpY2FsLWFsaWduOm1p ZGRsZSInKS4KCQkJCQl0ZCh5ZXNub1JhZGlvKFRBR1NfSU5fRkVFRF9CT0RZLCAkdHJ1X3Rh Z3NfcHJlZnNbVEFHU19JTl9GRUVEX0JPRFldLT52YWx1ZSkpCgkJCQkpLgoJCQkJdHIoCgkJ CQkJdGRhKGdUeHQoJ1Nob3cgYSBjbGlja2FibGUgbGlzdCBvZiB0YWdzIG9uIHRoZSAiV3Jp dGUiIHBhZ2UnKS4nOiAnLAoJCQkJCQknIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjptaWRkbGUi JykuCgkJCQkJdGQoeWVzbm9SYWRpbyhUQUdTX0lOX1dSSVRFX1RBQiwgJHRydV90YWdzX3By ZWZzW1RBR1NfSU5fV1JJVEVfVEFCXS0+dmFsdWUpKQoJCQkJKS4KCQkJCXRyKAoJCQkJCXRk YShnVHh0KCdBdXRvY29tcGxldGUgdGFncyBvbiB0aGUgIldyaXRlIiBwYWdlJykuJzogPGJy PicuCgkJCSAJCQknPGVtPih5b3UgY2FuIGFkanVzdCB0aGUgYXBwZWFyYW5jZSB2aWEgPGNv ZGU+Y3NzL2pxdWVyeS11aS5jc3M8L2NvZGU+KTwvZW0+JywKCQkJCQkJJyBzdHlsZT0idmVy dGljYWwtYWxpZ246bWlkZGxlIicpLgoJCQkJCXRkKHllc25vUmFkaW8oQVVUT0NPTVBMRVRF X0lOX1dSSVRFX1RBQiwgJHRydV90YWdzX3ByZWZzW0FVVE9DT01QTEVURV9JTl9XUklURV9U QUJdLT52YWx1ZSkpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGRhKGdUeHQoJ0NvbnZlcnQgdGFn cyB0byBsb3dlcmNhc2UgYnkgZGVmYXVsdCcpLic6IDxicj4nLgoJCQkJCQknPGVtPih5b3Ug cHJvYmFibHkgd2FudCB0aGlzLCB1bmxlc3MgeW91IGFyZSBoYXZpbmcgcHJvYmxlbXMgd2l0 aCB1dGYtOCBjaGFyYWN0ZXJzKTwvZW0+JywKCQkJCQkJJyBzdHlsZT0idmVydGljYWwtYWxp Z246bWlkZGxlIicpLgoJCQkJCXRkKHllc25vUmFkaW8oVVRGXzhfQ0FTRSwgJHRydV90YWdz X3ByZWZzW1VURl84X0NBU0VdLT52YWx1ZSkpCgkJCQkpLgoJCQkJdHIoCgkJCQkJdGQoJycp LgoJCQkJCXRkYShmSW5wdXQoJ3N1Ym1pdCcsICdwcmVmcycsIGdUeHQoJ1NhdmUnKSwgJ3B1 Ymxpc2gnKS5lSW5wdXQoJ3RydV90YWdzJyksICcgc3R5bGU9InRleHQtYWxpZ246cmlnaHQi JykKCQkJCSksCgkJCQknJywgJyB2ZXJpZnkoXCcnIC4gZ1R4dCgnYXJlX3lvdV9zdXJlJykg LiAnXCcpIicKCQkJKS4KCQllbmRUYWJsZSgpLic8L3RkPjwvdHI+Jy4KCQllbmRUYWJsZSgp OwoKCWVjaG8gJzwvdGQ+PC90cj4nLmVuZFRhYmxlKCk7Cn0KCgpmdW5jdGlvbiB0cnVfdGFn c19hZG1pbl90YWJfaGFuZGxlX2lucHV0KCkgewoJaWYgKGdwcygncHJlZnMnKSkgewoJCXJl dHVybiB0cnVfdGFnc19hZG1pbl91cGRhdGVfcHJlZnMoKTsKCX0gZWxzZSBpZiAoZ3BzKCdk ZWxldGUnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1pbl9kZWxldGVfdGFnKGdwcygnZGVs ZXRldGFnJykpOwoJfSBlbHNlIGlmIChncHMoJ3JlcGxhY2UnKSkgewoJCSRyZXN1bHQgPSB0 cnVfdGFnc19hZG1pbl9yZXBsYWNlX3RhZyhncHMoJ21hdGNodGFnJyksIGdwcygncmVwbGFj ZXRhZycpLCBmYWxzZSk7CgkJcmV0dXJuICRyZXN1bHQgLiAnPGJyPicgLiB0cnVfdGFnc19h ZG1pbl9yZWRpcmVjdF90YWcoZ3BzKCdtYXRjaHRhZycpLCBncHMoJ3JlcGxhY2V0YWcnKSk7 Cgl9IGVsc2UgaWYgKGdwcygncmVkaXJlY3QnKSkgewoJCXJldHVybiB0cnVfdGFnc19hZG1p bl9yZWRpcmVjdF90YWcoZ3BzKCdsZWZ0dGFnJyksIGdwcygncmlnaHR0YWcnKSk7Cgl9IGVs c2UgaWYgKGdwcygnZGVsZXRlX3JlZGlyZWN0JykpIHsKCQlyZXR1cm4gdHJ1X3RhZ3NfYWRt aW5fZGVsZXRlX3JlZGlyZWN0KGdwcygnZGVsZXRlX3JlZGlyZWN0JykpOwoJfSBlbHNlIHsK CQlyZXR1cm4gJyc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl91cGRhdGVfcHJl ZnMoKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJJHJlc3VsdHMgPSBhcnJheSgpOwoJ Zm9yZWFjaCAoJHRydV90YWdzX3ByZWZzIGFzICRwcmVmKSB7CgkJJHZhbGlkX3ZhbHVlID0g JHByZWYtPnZhbGlkYXRlX3ZhbHVlKGdwcygkcHJlZi0+bmFtZSkpOwoJCWlmICgkdmFsaWRf dmFsdWUgJiYgJHZhbGlkX3ZhbHVlIDw+IGdwcygkcHJlZi0+bmFtZSkpIHsKCQkJcmV0dXJu ICR2YWxpZF92YWx1ZTsgICMjIyB0aGlzIGlzIGEgc25lYWt5IHdheSB0byBoYW5kbGUgdmFs aWRhdGlvbiAtIHNvcnJ5IDspCgkJfQoJCWlmICgkdmFsaWRfdmFsdWUgPD4gJHByZWYtPnZh bHVlKSB7CgkJCWlmICgkdmFsaWRfdmFsdWUgPT0gJHByZWYtPmRlZmF1bHRfdmFsdWUpIHsK CQkJCSRyZXN1bHQgPSB0cnVfdGFnc19kZWxldGVfcHJlZigkcHJlZi0+bmFtZSk7CgkJCX0g ZWxzZSB7CgkJCQkkcmVzdWx0ID0gdHJ1X3RhZ3NfdXBzZXJ0X3ByZWYoJHByZWYtPm5hbWUs ICR2YWxpZF92YWx1ZSk7CgkJCX0KCQkJaWYgKCRyZXN1bHQpIHsKCQkJCSRyZXN1bHRzW10g PSAnVXBkYXRlZCAnIC4gJHByZWYtPm5hbWU7CgkJCQkkcHJlZi0+dmFsdWUgPSAkdmFsaWRf dmFsdWU7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0c1tdID0gJ0Vycm9yIHVwZGF0aW5nICcg LiAkcHJlZi0+bmFtZTsKCQkJfQoJCX0KCX0KCWlmIChjb3VudCgkcmVzdWx0cykgPT0gMCkg ewoJCXJldHVybiAnTm8gcmVjb3JkcyBuZWVkIHVwZGF0aW5nJzsKCX0gZWxzZSB7CgkJcmV0 dXJuIGpvaW4oJzxicj4nLCAkcmVzdWx0cyk7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc191 cHNlcnRfcHJlZigkbmFtZSwgJHZhbHVlKSB7CglyZXR1cm4gc2FmZV91cHNlcnQoJ3RydV90 YWdzX3ByZWZzJywgJ3ZhbHVlPSInLiR2YWx1ZS4nIicsICduYW1lPSInLiRuYW1lLiciJyk7 Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19kZWxldGVfcHJlZigkbmFtZSkgewoJaWYgKHNhZmVf ZGVsZXRlKCd0cnVfdGFnc19wcmVmcycsICduYW1lPSInLiRuYW1lLiciJykpIHsKCQlpZiAo c2FmZV9jb3VudCgndHJ1X3RhZ3NfcHJlZnMnLCAnMScpID09IDAgJiYgIXNhZmVfcXVlcnko J2Ryb3AgdGFibGUgJyAuIHNhZmVfcGZ4KCd0cnVfdGFnc19wcmVmcycpKSkgewoJCQlyZXR1 cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfSBlbHNlIHsKCQlyZXR1cm4gZmFsc2U7 Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl9kZWxldGVfdGFnKCRkZWxldGV0YWcp IHsKCWlmICh0cmltKCRkZWxldGV0YWcpKSB7CgkJcmV0dXJuIHRydV90YWdzX2FkbWluX3Jl cGxhY2VfdGFnKCRkZWxldGV0YWcsICcnLCB0cnVlKTsKCX0gZWxzZSB7CgkJcmV0dXJuICdQ bGVhc2UgZW50ZXIgYSB2YWx1ZSc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1pbl9y ZXBsYWNlX3RhZygkbWF0Y2h0YWcsICRyZXBsYWNldGFnLCAkYWxsb3dfYmxhbmtfcmVwbGFj ZXRhZykgewoJJG1hdGNodGFnID0gdHJpbSgkbWF0Y2h0YWcpOwoJJHJlcGxhY2V0YWcgPSB0 cmltKCRyZXBsYWNldGFnKTsKCWlmICgkbWF0Y2h0YWcgJiYgKCRhbGxvd19ibGFua19yZXBs YWNldGFnIHx8ICRyZXBsYWNldGFnKSkgewoJCWlmIChzYWZlX3VwZGF0ZSgndGV4dHBhdHRl cm4nLCBUUlVfVEFHU19GSUVMRC4nPXRyaW0oYm90aCBcJyxcJyBmcm9tIHJlcGxhY2UoY29u Y2F0KCIsIiwgJy5UUlVfVEFHU19GSUVMRC4nLCAiLCIpLCBjb25jYXQoIiwiLCBcJycuYWRk c2xhc2hlcygkbWF0Y2h0YWcpLidcJywgIiwiKSwgXCcsJy5hZGRzbGFzaGVzKCRyZXBsYWNl dGFnKS4nLFwnKSknLCAnMScpKSB7CgkJCXJldHVybiAnVXBkYXRlZCAnLm15c3FsaV9hZmZl Y3RlZF9yb3dzKCkuJyByb3dzICgiJy5odG1sc3BlY2lhbGNoYXJzKCRtYXRjaHRhZykuJyI9 PiInLmh0bWxzcGVjaWFsY2hhcnMoJHJlcGxhY2V0YWcpLiciKSc7CgkJfSBlbHNlIHsKCQkJ cmV0dXJuICdFcnJvcjogJyAuIG15c3FsaV9lcnJvcigpOwoJCX0KCX0gZWxzZSB7CgkJcmV0 dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSBpbiBib3RoIGZpZWxkcyc7Cgl9Cn0KCgpmdW5j dGlvbiB0cnVfdGFnc19hZG1pbl9yZWRpcmVjdF90YWcoJGxlZnR0YWcsICRyaWdodHRhZykg ewoJJGxlZnR0YWcgPSBhZGRzbGFzaGVzKHRydV90YWdzX3N0cnRvbG93ZXIodHJpbSgkbGVm dHRhZykpKTsKCSRyaWdodHRhZyA9IGFkZHNsYXNoZXModHJ1X3RhZ3Nfc3RydG9sb3dlcih0 cmltKCRyaWdodHRhZykpKTsKCWlmICghJGxlZnR0YWcgfHwgISRyaWdodHRhZykgewoJCXJl dHVybiAnUGxlYXNlIGVudGVyIGEgdmFsdWUgaW4gYm90aCBmaWVsZHMnOwoJfQoKCWlmIChz YWZlX2luc2VydCgndHJ1X3RhZ3NfcmVkaXJlY3RzJywgJ2xlZnR0YWc9IicuJGxlZnR0YWcu JyIscmlnaHR0YWc9IicuJHJpZ2h0dGFnLiciJykpIHsKCQlyZXR1cm4gJ1JlZGlyZWN0IGFk ZGVkICgiJy5odG1sc3BlY2lhbGNoYXJzKCRsZWZ0dGFnKS4nIj0+IicuaHRtbHNwZWNpYWxj aGFycygkcmlnaHR0YWcpLiciKSAtIHBsZWFzZSB0ZXN0IGl0ISc7Cgl9IGVsc2UgewoJCXJl dHVybiAnRXJyb3IgYWRkaW5nIHJlY29yZCAtIGRvZXMgaXQgYWxyZWFkeSBleGlzdD8nOwoJ fQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfYWRtaW5fZGVsZXRlX3JlZGlyZWN0KCRsZWZ0dGFn KSB7CglpZiAoc2FmZV9kZWxldGUoJ3RydV90YWdzX3JlZGlyZWN0cycsICdsZWZ0dGFnPSIn LmFkZHNsYXNoZXMoJGxlZnR0YWcpLiciJykpIHsKCQlpZiAoc2FmZV9jb3VudCgndHJ1X3Rh Z3NfcmVkaXJlY3RzJywgJzEnKSA9PSAwICYmICFzYWZlX3F1ZXJ5KCdkcm9wIHRhYmxlICcg LiBzYWZlX3BmeCgndHJ1X3RhZ3NfcmVkaXJlY3RzJykpKSB7CgkJCXJldHVybiAnUmVkaXJl Y3QgZGVsZXRlZCwgYnV0IHVuYWJsZSB0byBkcm9wIHRhYmxlICcgLiBzYWZlX3BmeCgndHJ1 X3RhZ3NfcmVkaXJlY3RzJyk7CgkJfQoJCXJldHVybiAnUmVkaXJlY3QgZGVsZXRlZCAoIicu aHRtbHNwZWNpYWxjaGFycygkbGVmdHRhZykuJyIpJzsKCX0gZWxzZSB7CgkJcmV0dXJuICdF cnJvciBkZWxldGluZyByZWRpcmVjdCc7Cgl9Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19hZG1p bl93cml0ZV90YWJfaGFuZGxlcigkZXZlbnQsICRzdGVwLCAkZGF0YSkgewoJZ2xvYmFsICR0 cnVfdGFnc19wcmVmczsKCSRhdHRzID0gdHJ1X3RhZ3NfZ2V0X3N0YW5kYXJkX2Nsb3VkX2F0 dHMoYXJyYXkoKSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CgkkY2xvdWQgPSBhcnJheV91bmlxdWUo dHJ1X3RhZ3NfY2xvdWRfcXVlcnkoJGF0dHMpKTsKCW5hdGNhc2Vzb3J0KCRjbG91ZCk7CgoJ JGlkID0gKGVtcHR5KCRHTE9CQUxTWydJRCddKSA/IGdwcygnSUQnKSA6ICRHTE9CQUxTWydJ RCddKTsKCSRhcnRpY2xlX3RhZ3MgPSAoZW1wdHkoJGlkKSA/IGFycmF5KCkgOiB0cnVfdGFn c19nZXRfdGFnc19mb3JfYXJ0aWNsZSgkaWQpKTsKCgkkbGlua3MgPSBhcnJheSgpOwoJJHJh d19jbG91ZCA9ICcnOwoJZm9yZWFjaCAoJGNsb3VkIGFzICR0YWcpIHsKCQkkc3R5bGUgPSAo aW5fYXJyYXkoJHRhZywgJGFydGljbGVfdGFncykgPyAnIGNsYXNzPSJ0YWdfY2hvc2VuIicg OiAnJyk7CgkJJGxpbmtzW10gPSAnPGEgaHJlZj0iI2FkdmFuY2VkIicuJHN0eWxlLicgb25j bGljaz0idG9nZ2xlQ2xhc3ModGhpcywgdG9nZ2xlVGFnKFxcXCcnLmFkZHNsYXNoZXMoYWRk c2xhc2hlcyhodG1sc3BlY2lhbGNoYXJzKCR0YWcpKSkuJ1xcXCcpKTsgcmV0dXJuIGZhbHNl OyI+JyAuIGFkZHNsYXNoZXMoaHRtbHNwZWNpYWxjaGFycygkdGFnKSkgLiAnPFwvYT4nOwoJ CSRyYXdfY2xvdWQgLj0gJyInIC4gYWRkU2xhc2hlcygkdGFnKSAuICciLCc7Cgl9CgkkcmF3 X2Nsb3VkID0gc3Vic3RyKCRyYXdfY2xvdWQsIDAsIHN0cmxlbigkcmF3X2Nsb3VkKSAtIDEp OwoJJHRvX2luc2VydCA9IGpvaW4oJywgJywgJGxpbmtzKTsKCglpZiAoJHRydV90YWdzX3By ZWZzW1RBR1NfSU5fV1JJVEVfVEFCXS0+dmFsdWUpIHsKCQkkanMgPSA8PDxFT0YKCQkJdmFy IGtleXdvcmRzRmllbGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgna2V5d29yZHMnKTsK CQkJa2V5d29yZHNGaWVsZC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0 ZUVsZW1lbnQoJ2JyJykpOwoJCQl2YXIgY2xvdWQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50 KCdzcGFuJyk7CgkJCWtleXdvcmRzRmllbGQucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChjbG91 ZCk7CgkJCWNsb3VkLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAndHJ1X3RhZ3NfYWRtaW5fdGFn cycpOwoJCQljbG91ZC5pbm5lckhUTUwgPSAneyR0b19pbnNlcnR9JzsKCgkJCXZhciBzdHls ZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwoJCQlzdHlsZUVs ZW1lbnQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgInRleHQvY3NzIik7CgkJCXZhciBzdHlsZVRl eHQgPSAnYS50YWdfY2hvc2Vue2JhY2tncm91bmQtY29sb3I6ICNGRUI7IGNvbG9yOiBibGFj azt9JzsKCQkJaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7IC8vSUUKCQkJCXN0eWxl RWxlbWVudC5zdHlsZVNoZWV0LmNzc1RleHQgPSBzdHlsZVRleHQ7CgkJCX0gZWxzZSB7CgkJ CQl2YXIgdGV4dE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHlsZVRleHQpOwoJ CQkJc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKHRleHROb2RlKTsKCQkJfQoJCQl2YXIgaGVh ZEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOwoJ CQloZWFkRWxlbWVudC5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpOwoKCQkJZnVuY3Rpb24g dG9nZ2xlVGFnKHRhZ05hbWUpIHsKCQkJCXZhciByZWdleFRhZyA9IHRhZ05hbWUucmVwbGFj ZSgvKFtcXFxcXF5cXCQqK1tcXF0/e30uPSE6KHwpXSkvZywiXFxcXCQxIik7CgkJCQl2YXIg dGFnUmVnZXggPSBuZXcgUmVnRXhwKCIoKF58LClcXFxzKikiICsgcmVnZXhUYWcgKyAiXFxc cyooLFxcXHMqfCQpIik7CgkJCQl2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50 QnlJZCgna2V5d29yZHMnKTsKCQkJCXZhciBjdXJ2YWwgPSB0ZXh0YXJlYS52YWx1ZS5yZXBs YWNlKC8sP1xzKyQvLCAnJyk7CgkJCQlpZiAoJycgPT0gY3VydmFsKSB7CgkJCQkJdGV4dGFy ZWEudmFsdWUgPSB0YWdOYW1lOwoJCQkJfSBlbHNlIGlmIChjdXJ2YWwubWF0Y2godGFnUmVn ZXgpKSB7CgkJCQkJdGV4dGFyZWEudmFsdWUgPSBjdXJ2YWwucmVwbGFjZSh0YWdSZWdleCwg JyQxJykucmVwbGFjZSgvLD9ccyskLywgJycpOwoJCQkJCXJldHVybiAnJzsKCQkJCX0gZWxz ZSBpZiAoJywnID09IGN1cnZhbC5jaGFyQXQoY3VydmFsLmxlbmd0aCAtIDEpKSB7CgkJCQkJ dGV4dGFyZWEudmFsdWUgKz0gJyAnICsgdGFnTmFtZTsKCQkJCX0gZWxzZSB7CgkJCQkJdGV4 dGFyZWEudmFsdWUgKz0gJywgJyArIHRhZ05hbWU7CgkJCQl9CgkJCQlyZXR1cm4gJ3RhZ19j aG9zZW4nOwoJCQl9CgoJCQlmdW5jdGlvbiB0b2dnbGVDbGFzcyhlbGVtZW50LCBjbGFzc05h bWUpIHsKCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsIGNsYXNzTmFtZSk7CgkJ CQllbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3NOYW1lJywgY2xhc3NOYW1lKTsgLyogZm9y IElFICovCgkJCX0KRU9GOwoJCXJldHVybiAkZGF0YSAuIHNjcmlwdF9qcygkanMpOwoJfQoK CWlmICgkdHJ1X3RhZ3NfcHJlZnNbQVVUT0NPTVBMRVRFX0lOX1dSSVRFX1RBQl0tPnZhbHVl KSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICRvdXRwdXQ9JzxsaW5rIHJlbD0ic3R5 bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uL2Nzcy9qcXVlcnktdWkuY3NzIiBt ZWRpYT0icHJvamVjdGlvbiwgc2NyZWVuIiAvPgogICAgICAgIAkgICAgPHNjcmlwdCBsYW5n dWFnZT0iSmF2YVNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCiAgICAgICAg CQkkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICAgICAgIAkJICAgIHZhciBhdmFp bGFibGVUYWdzID0gWycuJHJhd19jbG91ZC4nXTsKICAgICAgICAJCSAgICBmdW5jdGlvbiBz cGxpdCggdmFsICkgeyByZXR1cm4gdmFsLnNwbGl0KCAvLFxzKi8gKTsgfQogICAgICAgIAkJ ICAgIGZ1bmN0aW9uIGV4dHJhY3RMYXN0KCB0ZXJtICkgeyByZXR1cm4gc3BsaXQoIHRlcm0g KS5wb3AoKTsgfQogICAgICAgIAkJICAgICQoIiNrZXl3b3JkcyIpLmF1dG9jb21wbGV0ZSh7 IG1pbkxlbmd0aDogMywgZGVsYXk6IDUwMCwKICAgICAgICAJCSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uKCByZXF1ZXN0LCByZXNwb25zZSAp IHsKICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgLy8gZGVsZWdhdGUgYmFjayB0byBhdXRvY29tcGxldGUsIGJ1dCBleHRyYWN0IHRoZSBs YXN0IHRlcm0KICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzcG9uc2UoICQudWkuYXV0b2NvbXBsZXRlLmZpbHRlcigKICAgICAgICAJ CSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFi bGVUYWdzLCBleHRyYWN0TGFzdCggcmVxdWVzdC50ZXJtICkgKSApOwogICAgICAgIAkJICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAJCSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzOiBmdW5jdGlv bigpIHsKICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLy8gcHJldmVudCB2YWx1ZSBpbnNlcnRlZCBvbiBmb2N1cwogICAgICAgIAkJICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7 CiAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9 LAogICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg c2VsZWN0OiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewogICAgICAgIAkJICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVybXMgPSBzcGxpdCggdGhp cy52YWx1ZSApOwogICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAvLyByZW1vdmUgdGhlIGN1cnJlbnQgaW5wdXQKICAgICAgICAJCSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMucG9wKCk7CiAg ICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v IGFkZCB0aGUgc2VsZWN0ZWQgaXRlbQogICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcy5wdXNoKCB1aS5pdGVtLnZhbHVlICk7CiAg ICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v IGFkZCBwbGFjZWhvbGRlciB0byBnZXQgdGhlIGNvbW1hLWFuZC1zcGFjZSBhdCB0aGUgZW5k CiAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHRlcm1zLnB1c2goICIiICk7CiAgICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0ZXJtcy5qb2luKCAiLCAiICk7CiAg ICAgICAgCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJl dHVybiBmYWxzZTsKICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB9fSk7CiAgICAgICAgCQl9KTsKICAgICAgICAJCS8vLS0+PC9zY3JpcHQ+JzsKICAgICAg ICAgICAgICAgICAgICAgICAgICAgZWNobyBuLiRvdXRwdXQubjsKCgl9Cgp9CgoKIyMjIEFU T00vUlNTIEZFRUQgRlVOQ1RJT05TICMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjCgpyZWdpc3Rlcl9jYWxsYmFjaygndHJ1X3RhZ3NfYXRvbV9oYW5kbGVyJywgJ2F0b21f ZW50cnknKTsKZnVuY3Rpb24gdHJ1X3RhZ3NfYXRvbV9oYW5kbGVyKCRldmVudCwgJHN0ZXAp IHsgcmV0dXJuIHRydV90YWdzX2ZlZWRfaGFuZGxlcih0cnVlKTsgfQpyZWdpc3Rlcl9jYWxs YmFjaygndHJ1X3RhZ3NfcnNzX2hhbmRsZXInLCAncnNzX2VudHJ5Jyk7CmZ1bmN0aW9uIHRy dV90YWdzX3Jzc19oYW5kbGVyKCRldmVudCwgJHN0ZXApIHsgcmV0dXJuIHRydV90YWdzX2Zl ZWRfaGFuZGxlcihmYWxzZSk7IH0KCmZ1bmN0aW9uIHRydV90YWdzX2ZlZWRfaGFuZGxlcigk YXRvbSkgewoJZ2xvYmFsICR0aGlzYXJ0aWNsZSwgJHRydV90YWdzX3ByZWZzOwoJZXh0cmFj dCgkdGhpc2FydGljbGUpOwoKCSR0YWdzID0gdHJ1X3RhZ3NfZ2V0X3RhZ3NfZm9yX2FydGlj bGUoJHRoaXNpZCk7CgoJaWYgKCR0cnVfdGFnc19wcmVmc1tUQUdTX0lOX0ZFRURfQk9EWV0t PnZhbHVlKSB7CgkJJGV4dHJhYm9keSA9ICcnOwoJCSRGT1JNX05BTUUgPSAndHJ1X3RhZ3Nf ZmVlZF90YWdzJzsKCQlpZiAoZmV0Y2goJ2Zvcm0nLCAndHhwX2Zvcm0nLCAnbmFtZScsICRG T1JNX05BTUUpKSB7CgkJCSRmb3JtID0gZmV0Y2hfZm9ybSgkRk9STV9OQU1FKTsKCQkJJGV4 dHJhYm9keSA9IHRyaW0ocGFyc2UoJGZvcm0pKTsKCQl9IGVsc2UgewoJCQkkYXR0cyA9IHRy dV90YWdzX2dldF9zdGFuZGFyZF9jbG91ZF9hdHRzKGFycmF5KCksIGZhbHNlLCB0cnVlKTsK CQkJJGV4dHJhYm9keSA9ICc8cD50YWdzOiAnIC4gdHJ1X3RhZ3NfcmVuZGVyX2Nsb3VkKCRh dHRzLCAkdGFncywgJHRhZ3MpIC4gJzwvcD4nOwoJCX0KCQlnbG9iYWwgJHRoaXNhcnRpY2xl OwoJCWlmICh0cmltKCR0aGlzYXJ0aWNsZVsnZXhjZXJwdCddKSkgewoJCQkkdGhpc2FydGlj bGVbJ2V4Y2VycHQnXSA9IHRyaW0oJHRoaXNhcnRpY2xlWydleGNlcnB0J10pLm4uJGV4dHJh Ym9keS5uOwoJCX0KCQkkdGhpc2FydGljbGVbJ2JvZHknXSA9IHRyaW0oJHRoaXNhcnRpY2xl Wydib2R5J10pLm4uJGV4dHJhYm9keS5uOwoJfQoKCWlmICgkdHJ1X3RhZ3NfcHJlZnNbVEFH U19JTl9GRUVEX0NBVEVHT1JJRVNdLT52YWx1ZSkgewoJCSRvdXRwdXQgPSBhcnJheSgpOwoJ CWZvcmVhY2ggKCR0YWdzIGFzICR0YWcpIHsKCQkJaWYgKCRhdG9tKSB7CgkJCQkkb3V0cHV0 W10gPSAnPGNhdGVnb3J5IHRlcm09IicgLiBodG1sc3BlY2lhbGNoYXJzKCR0YWcpIC4gJyIg Lz4nOwoJCQl9IGVsc2UgewoJCQkJJG91dHB1dFtdID0gJzxjYXRlZ29yeT4nIC4gaHRtbHNw ZWNpYWxjaGFycygkdGFnKSAuICc8L2NhdGVnb3J5Pic7CgkJCX0KCQl9CgkJcmV0dXJuIG4u am9pbihuLCAkb3V0cHV0KS5uOwoJfQp9CgoKIyMjIFBSRUZTIEZVTkNUSU9OUyAvIENMQVNT RVMgIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKY2xhc3MgdHJ1X3Rh Z3NfcHJlZiB7CglmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbmFtZSwgJGRlZmF1bHRfdmFsdWUs ICR0eXBlKSB7CgkJJHRoaXMtPm5hbWUgPSAkbmFtZTsKCQkkdGhpcy0+dmFsdWUgPSAkZGVm YXVsdF92YWx1ZTsKCQkkdGhpcy0+ZGVmYXVsdF92YWx1ZSA9ICRkZWZhdWx0X3ZhbHVlOwoJ CSR0aGlzLT50eXBlID0gJHR5cGU7Cgl9CgoJZnVuY3Rpb24gdmFsaWRhdGVfdmFsdWUoJHZh bHVlKSB7CgkJaWYgKCR2YWx1ZSkgewoJCQlyZXR1cm4gJHZhbHVlOwoJCX0gZWxzZSBpZiAo JHRoaXMtPnR5cGUgPT0gJ2Jvb2xlYW4nKSB7CgkJCXJldHVybiAnMCc7CgkJfSBlbHNlIHsK CQkJcmV0dXJuICdQbGVhc2UgZW50ZXIgYSB2YWx1ZSBmb3IgJyAuICR0aGlzLT5uYW1lOwoJ CX0KCX0KfQoKZnVuY3Rpb24gdHJ1X3RhZ3NfbG9hZF9wcmVmcygpIHsKCSRwcmVmcyA9IGFy cmF5KCk7CgoJZ2xvYmFsICRwZXJtbGlua19tb2RlOwoJJHByZWZzW0NMRUFOX1VSTFNdID0g bmV3IHRydV90YWdzX3ByZWYoQ0xFQU5fVVJMUywgKCRwZXJtbGlua19tb2RlICE9ICdtZXNz eScgPyAnY2xlYW4nIDogJ21lc3N5JyksICdzdHJpbmcnKTsKCSRwcmVmc1tUQUdfU0VDVElP Tl0gPSBuZXcgdHJ1X3RhZ3NfcHJlZihUQUdfU0VDVElPTiwgJ3RhZycsICdzdHJpbmcnKTsK CSRwcmVmc1tQQVJNX05BTUVdID0gbmV3IHRydV90YWdzX3ByZWYoUEFSTV9OQU1FLCAndCcs ICdzdHJpbmcnKTsKCSRwcmVmc1tUQUdTX0lOX0ZFRURfQ0FURUdPUklFU10gPSBuZXcgdHJ1 X3RhZ3NfcHJlZihUQUdTX0lOX0ZFRURfQ0FURUdPUklFUywgJzEnLCAnYm9vbGVhbicpOwoJ JHByZWZzW1RBR1NfSU5fRkVFRF9CT0RZXSA9IG5ldyB0cnVfdGFnc19wcmVmKFRBR1NfSU5f RkVFRF9CT0RZLCAnMCcsICdib29sZWFuJyk7CgkkcHJlZnNbVEFHU19JTl9XUklURV9UQUJd ID0gbmV3IHRydV90YWdzX3ByZWYoVEFHU19JTl9XUklURV9UQUIsICcxJywgJ2Jvb2xlYW4n KTsKCSRwcmVmc1tBVVRPQ09NUExFVEVfSU5fV1JJVEVfVEFCXSA9IG5ldyB0cnVfdGFnc19w cmVmKEFVVE9DT01QTEVURV9JTl9XUklURV9UQUIsICcwJywgJ2Jvb2xlYW4nKTsKCSRwcmVm c1tVVEZfOF9DQVNFXSA9IG5ldyB0cnVfdGFnc19wcmVmKFVURl84X0NBU0UsICcxJywgJ2Jv b2xlYW4nKTsKCglpZiAoICEoZ2V0Um93cygiU0hPVyBUQUJMRVMgTElLRSAnIi5QRlguInRy dV90YWdzX3ByZWZzJyIpKSApIHsKCQlzYWZlX2NyZWF0ZSgidHJ1X3RhZ3NfcHJlZnMiLCAi YG5hbWVgIHZhcmNoYXIoMjUwKSBOT1QgTlVMTCwgYHZhbHVlYCB2YXJjaGFyKDI1NSkgTk9U IE5VTEwsIFBSSU1BUlkgS0VZIChgbmFtZWApIik7Cgl9CgoJJHJzID0gc2FmZV9yb3dzKCcq JywgJ3RydV90YWdzX3ByZWZzJywgJzEnKTsKCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7CgkJ JHByZWZzWyRyb3dbJ25hbWUnXV0tPnZhbHVlID0gJHJvd1sndmFsdWUnXTsKCX0KCglyZXR1 cm4gJHByZWZzOwp9CgoKIyMjIE9USEVSIFNVUFBPUlQgRlVOQ1RJT05TICMjIwojIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmdW5jdGlvbiB0cnVfdGFnc19yZWRpcmVjdF9p Zl9uZWVkZWQoJHRhZ19wYXJhbWV0ZXIpIHsKCSRyZWRpcmVjdHMgPSB0cnVfdGFnc19sb2Fk X3JlZGlyZWN0cygpOwoJZm9yZWFjaCAoJHJlZGlyZWN0cyBhcyAkbGVmdHRhZyA9PiAkcmln aHR0YWcpIHsKCQlpZiAoJGxlZnR0YWcgPT0gJHRhZ19wYXJhbWV0ZXIgfHwgJGxlZnR0YWcg PT0gc3RyX3JlcGxhY2UoJy0nLCAnICcsICR0YWdfcGFyYW1ldGVyKSkgewoJCQl0cnVfdGFn c19yZWRpcmVjdCgkcmlnaHR0YWcsIGZhbHNlKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfQoK CXJldHVybiBmYWxzZTsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX2xvYWRfcmVkaXJlY3RzKCkg ewoJJHJlZGlyZWN0cyA9IGFycmF5KCk7CgoJaWYgKCAhKGdldFJvd3MoIlNIT1cgVEFCTEVT IExJS0UgJyIuUEZYLiJ0cnVfdGFnc19yZWRpcmVjdHMnIikpICkgewoJCXNhZmVfY3JlYXRl KCJ0cnVfdGFnc19yZWRpcmVjdHMiLCAiYGxlZnR0YWdgIHZhcmNoYXIoMjUwKSBOT1QgTlVM TCwgYHJpZ2h0dGFnYCB2YXJjaGFyKDI1NSkgTk9UIE5VTEwsIFBSSU1BUlkgS0VZIChgbGVm dHRhZ2ApIik7Cgl9CgoJJHJzID0gc2FmZV9yb3dzKCcqJywgJ3RydV90YWdzX3JlZGlyZWN0 cycsICcxIG9yZGVyIGJ5IGxlZnR0YWcnKTsKCWZvcmVhY2ggKCRycyBhcyAkcm93KSB7CgkJ JHJlZGlyZWN0c1skcm93WydsZWZ0dGFnJ11dID0gJHJvd1sncmlnaHR0YWcnXTsKCX0KCgly ZXR1cm4gJHJlZGlyZWN0czsKfQoKCmZ1bmN0aW9uIHRydV90YWdzX3JlZGlyZWN0KCRkZXN0 aW5hdGlvbiwgJGlzX2Z1bGxfdXJsKSB7CglnbG9iYWwgJHRydV90YWdzX3ByZWZzOwoJaWYg KCRpc19mdWxsX3VybCkgewoJCSR1cmwgPSAkZGVzdGluYXRpb247CgkJJG1lc3NhZ2UgPSAn VGhlIHJlc291cmNlIHlvdSByZXF1ZXN0ZWQgaGFzIG1vdmVkIHRvICcgLiAkZGVzdGluYXRp b247Cgl9IGVsc2UgewoJCSR1cmwgPSB0cnVfdGFnc19saW5raWZ5X3RhZygkZGVzdGluYXRp b24sIGZhbHNlKTsKCQkkbWVzc2FnZSA9ICdUaGUgcmVxdWVzdGVkIHRhZyBoYXMgYmVlbiBy ZXBsYWNlZCBieSAnIC4gJGRlc3RpbmF0aW9uOwoJfQoKCWhlYWRlcignTG9jYXRpb246ICcg LiAkdXJsKTsKCXR4cF9kaWUoJG1lc3NhZ2UsICczMDEnKTsKfQoKCmZ1bmN0aW9uIHRydV90 YWdzX2xpbmtpZnlfdGFnKCR0YWcsICR1c2VfYW1wID0gdHJ1ZSkgewoJZ2xvYmFsICR0cnVf dGFnc19wcmVmczsKCWlmICh0cnVfdGFnc19jbGVhbl91cmxzKCkpIHsKCQkkdXJscHJlZml4 ID0gaHUgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFHX1NFQ1RJT05dLT52YWx1ZSAuICcvJzsKCX0g ZWxzZSB7CgkJJHVybHByZWZpeCA9IGh1IC4gJz9zPScgLiAkdHJ1X3RhZ3NfcHJlZnNbVEFH X1NFQ1RJT05dLT52YWx1ZSAuICgkdXNlX2FtcCA/ICcmYW1wOycgOiAnJicpIC4gJHRydV90 YWdzX3ByZWZzW1BBUk1fTkFNRV0tPnZhbHVlIC4gJz0nOwoJfQoJJHVybHN1ZmZpeCA9ICh0 cnVfdGFnc19jbGVhbl91cmxzKCkgPyAnLycgOiAnJyk7CglyZXR1cm4gJHVybHByZWZpeCAu IHVybGVuY29kZSgkdGFnKSAuICR1cmxzdWZmaXg7Cn0KCgpmdW5jdGlvbiB0cnVfdGFnc19n ZXRfdGFnc19mb3JfYXJ0aWNsZSgkYXJ0aWNsZUlEKSB7CglnbG9iYWwgJHRoaXNhcnRpY2xl LCAkdHJ1X3RhZ3NfcHJlZnM7CglpZiAoaXNzZXQoJHRoaXNhcnRpY2xlKSkgewoJCWV4dHJh Y3QoJHRoaXNhcnRpY2xlKTsKCX0KCSRrZXl3b3JkcyA9ICcnOwoJaWYgKGlzc2V0KCR0aGlz aWQpICYmICR0aGlzaWQgPT0gJGFydGljbGVJRCkgewoJCWlmIChpc3NldCgkdGhpc2FydGlj bGVbJ2tleXdvcmRzJ10pKSB7CgkJCSRrZXl3b3JkcyA9ICR0aGlzYXJ0aWNsZVsna2V5d29y ZHMnXTsKCQl9Cgl9IGVsc2UgewoJCSR0YWdzX2ZpZWxkID0gVFJVX1RBR1NfRklFTEQ7CgkJ JHJzID0gc2FmZV9yb3coJHRhZ3NfZmllbGQsICJ0ZXh0cGF0dGVybiIsICJJRD0nJGFydGlj bGVJRCcgQU5EICR0YWdzX2ZpZWxkIDw+ICcnIik7CgkJaWYgKGlzc2V0KCRyc1skdGFnc19m aWVsZF0pKSB7CgkJCSRrZXl3b3JkcyA9ICRyc1skdGFnc19maWVsZF07CgkJfQoJfQoJJGFs bF90YWdzID0gYXJyYXkoKTsKCSRhbGxfdGFncyA9IGV4cGxvZGUoIiwiLCB0cmltKHRydV90 YWdzX3N0cnRvbG93ZXIoJGtleXdvcmRzKSkpOwoKCXJldHVybiB0cnVfdGFnc190cmltX3Rh Z3MoJGFsbF90YWdzKTsKfQoKCiMgZml4ZXMgYnVnIHdpdGggNC4wLjQncyB2ZXJzaW9uIG9m IGRvV3JhcCB0aGF0IGNhdXNlZCBzcGFjZXMgdG8gc2hvdyB1cCBiZWZvcmUgdGhlIGNvbW1h cwpmdW5jdGlvbiB0cnVfdGFnc19kb193cmFwKCRsaXN0LCAkd3JhcHRhZywgJGJyZWFrLCAk Y2xhc3MsICRicmVha2NsYXNzKSB7CglpZiAoISR3cmFwdGFnICYmICFwcmVnX21hdGNoKCcv Xlx3KyQvJywgJGJyZWFrKSkgewoJCXJldHVybiBqb2luKCRicmVhay5uLCAkbGlzdCk7Cgl9 IGVsc2UgewoJCXJldHVybiBkb1dyYXAoJGxpc3QsICR3cmFwdGFnLCAkYnJlYWssICRjbGFz cywgJGJyZWFrY2xhc3MpOwoJfQp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3NfdHJpbV90YWdzKCR0 YWdfYXJyYXkpIHsKCSR0cmltbWVkID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0YWdfYXJyYXkg YXMgJHRhZykgewoJCWlmICgiIiAhPSB0cmltKCR0YWcpKSB7CgkJCSR0cmltbWVkW10gPSB0 cmltKCR0YWcpOwoJCX0KCX0KCXJldHVybiAkdHJpbW1lZDsKfQoKCmZ1bmN0aW9uIHRydV90 YWdzX2ZpeHVwX3F1ZXJ5X2F0dHMoJGF0dHMsICR0YWdfcGFyYW1ldGVyKSB7Cgkka2V5d29y ZHMgPSBleHBsb2RlKCcsJywgJHRhZ19wYXJhbWV0ZXIpOwoJZm9yZWFjaCAoJGtleXdvcmRz IGFzICRrZXl3b3JkKSB7CgkJaWYgKHN0cnBvcygka2V5d29yZCwgJy0nKSAhPT0gZmFsc2Up IHsKCQkJJGtleXdvcmRzW10gPSBzdHJfcmVwbGFjZSgnLScsICcgJywgJGtleXdvcmQpOwoJ CX0KCX0KCSRhdHRzWydrZXl3b3JkcyddID0gaW1wbG9kZSgnLCcsICRrZXl3b3Jkcyk7CgoJ aWYgKGlzc2V0KCRhdHRzWydzZWN0aW9uJ10pICYmIHN0cnBvcygkYXR0c1snc2VjdGlvbidd LCAnLCcpICE9PSBmYWxzZSkgewoJCSRhdHRzWydzZWN0aW9uJ10gPSAnJzsKCX0KCglpZiAo aXNzZXQoJGF0dHNbJ2V4Y2x1ZGVzZWN0aW9uJ10pKSB7CgkJdW5zZXQoJGF0dHNbJ2V4Y2x1 ZGVzZWN0aW9uJ10pOwoJfQoKCWlmIChpc3NldCgkYXR0c1snbm9hcnRpY2xlcyddKSkgewoJ CXVuc2V0KCRhdHRzWydub2FydGljbGVzJ10pOwoJfQoKCWlmICghaXNzZXQoJGF0dHNbJ2xp bWl0J10pKSB7CgkJJGF0dHNbJ2xpbWl0J10gPSAnMTAwMCc7Cgl9CgoJaWYgKCFpc3NldCgk YXR0c1snYWxsb3dvdmVycmlkZSddKSkgewoJCSRhdHRzWydhbGxvd292ZXJyaWRlJ10gPSB0 cnVlOwoJfQoKCWlmIChpc3NldCgkYXR0c1snc2VhcmNoZm9ybSddKSAmJiAhaXNzZXQoJGF0 dHNbJ2xpc3Rmb3JtJ10pKSB7CgkJJGF0dHNbJ2xpc3Rmb3JtJ10gPSAkYXR0c1snc2VhcmNo Zm9ybSddOwoJfQoKCWlmIChpc3NldCgkYXR0c1snc2hvd2NvdW50cyddKSkgewoJCXVuc2V0 KCRhdHRzWydzaG93Y291bnRzJ10pOwoJfQoKCWlmIChpc3NldCgkYXR0c1snNDA0cmVkaXJl Y3QnXSkpIHsKCQl1bnNldCgkYXR0c1snNDA0cmVkaXJlY3QnXSk7Cgl9CgoJcmV0dXJuICRh dHRzOwp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc3RydG9sb3dlcigkc3RyKSB7CglnbG9iYWwg JHRydV90YWdzX3ByZWZzOwoJaWYgKCR0cnVfdGFnc19wcmVmc1tVVEZfOF9DQVNFXS0+dmFs dWUpIHsKCQlpZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJ0b2xvd2VyJykpIHsKCQkJcmV0 dXJuIG1iX3N0cnRvbG93ZXIoJHN0ciwgRU5DT0RJTkcpOwoJCX0gZWxzZSB7CgkJCXJldHVy biBzdHJ0b2xvd2VyKCRzdHIpOwoJCX0KCX0gZWxzZSB7CgkJcmV0dXJuICRzdHI7Cgl9Cn0K CmZ1bmN0aW9uIHRydV90YWdzX3N0cnRvdXBwZXIoJHN0cikgewoJaWYgKGZ1bmN0aW9uX2V4 aXN0cygnbWJfc3RydG91cHBlcicpKSB7CgkJcmV0dXJuIG1iX3N0cnRvdXBwZXIoJHN0ciwg RU5DT0RJTkcpOwoJfSBlbHNlIHsKCQlyZXR1cm4gc3RydG91cHBlcigkc3RyKTsKCX0KfQoK ZnVuY3Rpb24gdHJ1X3RhZ3NfdWNmaXJzdCgkc3RyKSB7CglpZiAoZnVuY3Rpb25fZXhpc3Rz KCdtYl9zdWJzdHInKSAmJiBmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnRvdXBwZXInKSAmJiBm dW5jdGlvbl9leGlzdHMoJ21iX3N0cmxlbicpICYmIG1iX3N0cmxlbigkc3RyLCBFTkNPRElO RykgPiAxKSB7CgkJcmV0dXJuIG1iX3N0cnRvdXBwZXIobWJfc3Vic3RyKCRzdHIsIDAsIDEs IEVOQ09ESU5HKSwgRU5DT0RJTkcpIC4gbWJfc3Vic3RyKCRzdHIsIDEsIG1iX3N0cmxlbigk c3RyLCBFTkNPRElORyksIEVOQ09ESU5HKTsKCX0gZWxzZSB7CgkJcmV0dXJuIHVjZmlyc3Qo JHN0cik7Cgl9Cn0KCmZ1bmN0aW9uIHRydV90YWdzX3Vjd29yZHMoJHN0cikgewoJaWYgKGZ1 bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9jYXNlJykpIHsKCQlyZXR1cm4gbWJfY29udmVy dF9jYXNlKCRzdHIsIE1CX0NBU0VfVElUTEUsIEVOQ09ESU5HKTsKCX0gZWxzZSB7CgkJcmV0 dXJuIHVjd29yZHMoJHN0cik7Cgl9Cn0KCgovL3RoZXNlIG5leHQgdHdvIGZ1bmN0aW9ucyBh cmUgZ3Jvc3MsIGJ1dCBJIGNhbid0IGZpZ3VyZSBvdXQgYW5vdGhlciB3YXkgdG8gZG8gaXQK ZnVuY3Rpb24gdHJ1X3RhZ3Nfc29ydF90YWdzKCR0YWdzX3dlaWdodCwgJHNvcnRfYnlfY291 bnQsICRzb3J0X2FzY2VuZGluZykgewoJZ2xvYmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwg JHRydV90YWdzX3NvcnRfYXNjZW5kaW5nOwoKCSR0cnVfdGFnc190YWdzX3dlaWdodCA9ICR0 YWdzX3dlaWdodDsKCSR0cnVfdGFnc19zb3J0X2FzY2VuZGluZyA9ICRzb3J0X2FzY2VuZGlu ZzsKCgkkdGVtcF9hcnJheSA9IGFycmF5X2tleXMoJHRhZ3Nfd2VpZ2h0KTsKCWlmICgkc29y dF9ieV9jb3VudCkgewoJCXVzb3J0KCR0ZW1wX2FycmF5LCAidHJ1X3RhZ3Nfc29ydF90YWdz X2NvbXBhcmF0b3IiKTsKCX0gZWxzZSB7CgkJbmF0Y2FzZXNvcnQoJHRlbXBfYXJyYXkpOwoJ CSR0ZW1wX2FycmF5ID0gYXJyYXlfdmFsdWVzKCR0ZW1wX2FycmF5KTsKCX0KCgkkc29ydGVk X2FycmF5ID0gYXJyYXkoKTsKCWZvcmVhY2ggKCR0ZW1wX2FycmF5IGFzICR0YWcpIHsKCQkk c29ydGVkX2FycmF5WyR0YWddID0gJHRhZ3Nfd2VpZ2h0WyR0YWddOwoJfQoKCXJldHVybiAk c29ydGVkX2FycmF5Owp9CgoKZnVuY3Rpb24gdHJ1X3RhZ3Nfc29ydF90YWdzX2NvbXBhcmF0 b3IoJGxlZnQsICRyaWdodCkgewoJZ2xvYmFsICR0cnVfdGFnc190YWdzX3dlaWdodCwgJHRy dV90YWdzX3NvcnRfYXNjZW5kaW5nOwoKCSRsZWZ0X3dlaWdodCA9ICR0cnVfdGFnc190YWdz X3dlaWdodFskbGVmdF07CgkkcmlnaHRfd2VpZ2h0ID0gJHRydV90YWdzX3RhZ3Nfd2VpZ2h0 WyRyaWdodF07CglpZiAoJGxlZnRfd2VpZ2h0ID09ICRyaWdodF93ZWlnaHQpIHsKCQkkdGVt cF9hcnJheSA9IGFycmF5KCRsZWZ0LCAkcmlnaHQpOwoJCW5hdGNhc2Vzb3J0KCR0ZW1wX2Fy cmF5KTsKCQkkdGVtcF9hcnJheSA9IGFycmF5X3ZhbHVlcygkdGVtcF9hcnJheSk7CgkJcmV0 dXJuICgkdGVtcF9hcnJheVswXSA9PSAkbGVmdCA/IC0xIDogMSk7Cgl9IGVsc2UgaWYgKCR0 cnVfdGFnc19zb3J0X2FzY2VuZGluZykgewoJCXJldHVybiAkbGVmdF93ZWlnaHQgLSAkcmln aHRfd2VpZ2h0OwoJfSBlbHNlIHsKCQlyZXR1cm4gJHJpZ2h0X3dlaWdodCAtICRsZWZ0X3dl aWdodDsKCX0KfQoKCgojIyMgQkFTVEFSRCBGVU5DVElPTlMgVEhBVCBTSE9VTEROJ1QgSEFW RSBUTyBFWElTVCAjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjCgoKZnVuY3Rpb24gdHJ1X3RhZ3NfcmVkb19hcnRpY2xlX3NlYXJj aCgkYXR0cykgewoJJHRoZUF0dHMgPSBsQXR0cyhhcnJheSgnbGltaXQnICAgICA9PiAxMDAw LAoJCQkJJ2NhdGVnb3J5JyAgPT4gJycsCgkJCQknc2VjdGlvbicgICA9PiAnJywKCQkJCSdl eGNlcnB0ZWQnID0+ICcnLAoJCQkJJ2F1dGhvcicgICAgPT4gJycsCgkJCQknc29ydGJ5JyAg ICA9PiAnUG9zdGVkJywKCQkJCSdzb3J0ZGlyJyAgID0+ICdkZXNjJywKCQkJCSdtb250aCcg ICAgID0+ICcnLAoJCQkJJ2tleXdvcmRzJyAgPT4gJycsCgkJCQknZnJvbnRwYWdlJyA9PiAn JywKCQkJCSdpZCcgICAgICAgID0+ICcnLAoJCQkJJ3RpbWUnICAgICAgPT4gJ3Bhc3QnLAoJ CQkJJ3N0YXR1cycgICAgPT4gJzQnLAoJCQkJJ29mZnNldCcgICAgPT4gMAoJCQkpLCRhdHRz LCAwKTsKCWV4dHJhY3QoJHRoZUF0dHMpOwoKCS8vQnVpbGRpbmcgcXVlcnkgcGFydHMKCSRm cm9udHBhZ2UgPSAoJGZyb250cGFnZSkgPyBmaWx0ZXJGcm9udFBhZ2UoKSA6ICcnOwoJJGNh dGVnb3J5ICA9ICghJGNhdGVnb3J5KSAgPyAnJyA6ICIgYW5kICgoQ2F0ZWdvcnkxPSciLmRv c2xhc2goJGNhdGVnb3J5KS4iJykgb3IgKENhdGVnb3J5Mj0nIi5kb1NsYXNoKCRjYXRlZ29y eSkuIicpKSAiOwoJJHNlY3Rpb24gICA9ICghJHNlY3Rpb24pICAgPyAnJyA6ICIgYW5kIFNl Y3Rpb24gPSAnIi5kb3NsYXNoKCRzZWN0aW9uKS4iJyI7CgkkZXhjZXJwdGVkID0gKCRleGNl cnB0ZWQ9PSd5JykgID8gIiBhbmQgRXhjZXJwdCAhPScnIiA6ICcnOwoJJGF1dGhvciAgICA9 ICghJGF1dGhvcikgICAgPyAnJyA6ICIgYW5kIEF1dGhvcklEID0gJyIuZG9zbGFzaCgkYXV0 aG9yKS4iJyI7CgkkbW9udGggICAgID0gKCEkbW9udGgpICAgICA/ICcnIDogIiBhbmQgUG9z dGVkIGxpa2UgJyIuZG9TbGFzaCgkbW9udGgpLiIlJyI7CgkkaWQgICAgICAgID0gKCEkaWQp ICAgICAgICA/ICcnIDogIiBhbmQgSUQgPSAnIi5pbnR2YWwoJGlkKS4iJyI7CgoJLy8gVXNp bmcgU1FMIGNhY2hpbmcgY2FwYWJpbGl0aWVzLiBUeHAgNC42KwoJaWYgKGZ1bmN0aW9uX2V4 aXN0cygnbm93JykpIHsKCQkkd2hlcmVfcG9zdGVkID0gbm93KCdwb3N0ZWQnKTsKCX0gZWxz ZSB7CgkJJHdoZXJlX3Bvc3RlZCA9ICJub3coKSI7Cgl9Cglzd2l0Y2ggKCR0aW1lKSB7CgkJ Y2FzZSAnYW55JzoKCQkJJHRpbWUgPSAiIjsgYnJlYWs7CgkJY2FzZSAnZnV0dXJlJzoKCQkJ JHRpbWUgPSAiIEFORCBQb3N0ZWQgPiAiLiR3aGVyZV9wb3N0ZWQ7IGJyZWFrOwoJCWRlZmF1 bHQ6CgkJCSR0aW1lID0gIiBBTkQgUG9zdGVkIDw9ICIuJHdoZXJlX3Bvc3RlZDsKCX0KCWlm ICghaXNfbnVtZXJpYygkc3RhdHVzKSkKCQkkc3RhdHVzID0gZ2V0U3RhdHVzTnVtKCRzdGF0 dXMpOwoKCSRjdXN0b20gPSAnJzsKCS8vIHRyeWluZyBjdXN0b20gZmllbGRzIGhlcmUKCSRj dXN0b21GaWVsZHMgPSBnZXRDdXN0b21GaWVsZHMoKTsKCWlmICgkY3VzdG9tRmllbGRzKSB7 CgkJZm9yZWFjaCgkY3VzdG9tRmllbGRzIGFzICRjRmllbGQpIHsKCQkJaWYgKGlzc2V0KCRh dHRzWyRjRmllbGRdKSkKCQkJCSRjdXN0b21QYWlyc1skY0ZpZWxkXSA9ICRhdHRzWyRjRmll bGRdOwoJCX0KCQlpZighZW1wdHkoJGN1c3RvbVBhaXJzKSkKCQkJJGN1c3RvbSA9ICBidWls ZEN1c3RvbVNxbCgkY3VzdG9tRmllbGRzLCRjdXN0b21QYWlycyk7CgkJZWxzZQoJCQkkY3Vz dG9tID0gJyc7Cgl9CgoJLy9BbGxvdyBrZXl3b3JkcyBmb3Igbm8tY3VzdG9tIGFydGljbGVz LiBUaGF0IHRhZ2dpbmcgbW9kZSwgeW91IGtub3cKCWlmICgka2V5d29yZHMpIHsKCQkka2V5 cyA9IGRvU2xhc2goYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgnLCcsICRrZXl3b3Jkcykp KTsKCQlmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CgkJCSRrZXlwYXJ0c1tdID0gIkZJTkRf SU5fU0VUKCciLiRrZXkuIicsS2V5d29yZHMpIjsKCQl9CgkJJGtleXdvcmRzID0gIiBhbmQg KCIgLiBqb2luKCcgb3IgJywka2V5cGFydHMpIC4gIikiOwoJfQoKCWlmICgkaWQpCgkJJHN0 YXR1c3EgPSAiIGFuZCBTdGF0dXMgPj0gJzQnIjsKCWVsc2UKCQkkc3RhdHVzcSA9ICIgYW5k IFN0YXR1cz0nIi5kb1NsYXNoKCRzdGF0dXMpLiInIjsKCgkkd2hlcmUgPSAiMSIgLiAkc3Rh dHVzcS4gJHRpbWUuCgkJJGlkIC4gJGNhdGVnb3J5IC4gJHNlY3Rpb24gLiAkZXhjZXJwdGVk IC4gJG1vbnRoIC4gJGF1dGhvciAuICRrZXl3b3JkcyAuICRjdXN0b20gLiAkZnJvbnRwYWdl OwoKCQkkcGdvZmZzZXQgPSAkb2Zmc2V0IC4gJywgJzsKCgkkcnMgPSBzYWZlX3Jvd3Nfc3Rh cnQoIiosIHVuaXhfdGltZXN0YW1wKFBvc3RlZCkgYXMgdVBvc3RlZCIsICd0ZXh0cGF0dGVy bicsCgkJJHdoZXJlLiAnIG9yZGVyIGJ5ICcgLiBkb3NsYXNoKCRzb3J0YnkpIC4gJyAnIC4g ZG9TbGFzaCgkc29ydGRpcikgLiAnIGxpbWl0ICcgLiBkb1NsYXNoKCRsaW1pdCkpOwoKCXJl dHVybiAkcnM7Cn0KCgoiO3M6ODoiaGVscF9yYXciO3M6ODc2OiJUbyBsZWFybiBtb3JlIGFi b3V0IHRydV90YWdzLCBjaGVjayBvdXQgdGhlICJpbnRyb2R1Y3RvcnkgYXJ0aWNsZSI6aHR0 cDovL3d3dy5yYWluc2tpdC5jb20vYmxvZy80OTMvdHJ1dGFncy1hLXRhZ2dpbmctcGx1Z2lu LWZvci10ZXh0cGF0dGVybiwgInJlbGVhc2VzIHBhZ2UiOmh0dHA6Ly93d3cucmFpbnNraXQu Y29tL3JlZmVyZW5jZS81MzcvdHJ1X3RhZ3MtcmVsZWFzZXMsICJmZWF0dXJlIGxpc3QiOmh0 dHA6Ly93d3cucmFpbnNraXQuY29tL3JlZmVyZW5jZS80OTUvdHJ1dGFncy1mZWF0dXJlLWxp c3QsICJyb2FkbWFwIjpodHRwOi8vd3d3LnJhaW5za2l0LmNvbS9yZWZlcmVuY2UvNTU0L3Ry dV90YWdzLXJvYWRtYXAsIGFuZCAidXNhZ2UgaW5zdHJ1Y3Rpb25zIjpodHRwOi8vd3d3LnJh aW5za2l0LmNvbS9yZWZlcmVuY2UvNDk3L3RydXRhZ3MtdXNhZ2UtaW5zdHJ1Y3Rpb25zLgoK WW91IGNhbiBhbHNvIGZpbmQgdGhlIHNvdXJjZSBjb2RlIGF0ICJnaXRodWIuY29tL3RydWlz dC90cnUtdGFncyI6aHR0cHM6Ly9naXRodWIuY29tL3RydWlzdC90cnUtdGFncy4KCkkndmUg dGFrZW4gdGhlIGRldGFpbGVkIGhlbHAgb3V0IG9mIHRoZSBwbHVnaW47IG15IGFwb2xvZ2ll cy4gIEl0IHdhcyB0b28gYmlnIGFuZCB0b28gZGlmZmljdWx0IHRvIGtlZXAgbWFpbnRhaW5p bmcgb24gbXkgc2l0ZSBhbmQgaW4gdGhlIHBsdWdpbi4gIElmLCBteSBzaXRlIGlzIGV2ZXIg ZG93biwgaG93ZXZlciwgdGhlIHNvdXJjZSBIVE1MIG9mIHRoZSB1c2FnZSBpbnN0cnVjdGlv bnMgaXMgYXZhaWxhYmxlIGZyb20gdGhlICJnaXRodWIgcmVwbyI6aHR0cHM6Ly9naXRodWIu Y29tL3RydWlzdC90cnUtdGFncy9ibG9iL21hc3Rlci90cnVfdGFncy1kb2NzLmh0bWwiO3M6 MzoibWQ1IjtzOjMyOiI3NWM2ODhlODYzYzhkMzQ2MjQzNjZkYWIwN2NiMjBhNCI7fQ==