DIR : /home/kozerus/public_html/ko/test_form.html
/home/kozerus/public_html/ko
<html>
<head>
<title>/ko/test.html</title>
<!-- <script id="script_jquery360" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script id="script_jquery360_end"> -->
<!-- <script id="script_jquery_latest" src="/js/jquery_latest.js" ></script>
<!-- <script id="script_wz_dragdrop" src="/js/wz/wz_dragdrop.js" ></script> -->
<script id="script_b64_wz_dragdrop"
src='data:/text/plain;base64,LyogVGhpcyBub3RpY2UgbXVzdCBiZSB1bnRvdWNoZWQgYXQgYWxsIHRpbWVzLCBhbmQgbXVzdCBub3QgYmUgcmVtb3ZlZC4KCnd6X2RyYWdkcm9wLmpzCXYuIDQuOTEKVGhlIGxhdGVzdCB2ZXJzaW9uIGlzIGF2YWlsYWJsZSBhdApodHRwOi8vd3d3LndhbHRlcnpvcm4uY29tCm9yIGh0dHA6Ly93d3cuZGV2aXJhLmNvbQpvciBodHRwOi8vd3d3LndhbHRlcnpvcm4uZGUKCkNvcHlyaWdodCAoYykgV2FsdGVyIFpvcm4uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkNyZWF0ZWQgMjYuIDguIDIwMDIgYnkgV2FsdGVyIFpvcm4gKFdlYjogaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmNvbSApCkxhc3QgbW9kaWZpZWQ6IDEwLjEwLjIwMDgKClRoaXMgREhUTUwgJiBEcmFnJkRyb3AgTGlicmFyeSBhZGRzIERyYWcmRHJvcCBmdW5jdGlvbmFsaXR5IHRvOgotIGltYWdlcywgZXZlbiB0aG9zZSBub3QgcG9zaXRpb25lZCB2aWEgbGF5ZXJzLAogIG5vciB2aWEgc3R5bGVzaGVldHMgb3IgYW55IG90aGVyIGtpbmQgb2YgImhhcmQtY29kaW5nIjsKLSByZWxhdGl2ZWx5IGFuZCBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgbGF5ZXJzIChESVYgZWxlbWVudHMpLgpNb3Jlb3ZlciwgaXQgcHJvdmlkZXMgZXh0ZW5kZWQgREhUTUwgY2FwYWJpbGl0aWVzLgoKTElDRU5TRTogTEdQTAoKVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkxpY2Vuc2UgKExHUEwpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgpUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgoKRm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApzZWUgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2xlc3Nlci5odG1sCiovCgoKLy8gUEFUSCBUTyBUSEUgVFJBTlNQQVJFTlQgMSoxIFBYIElNQUdFIChyZXF1aXJlZCBieSBOUyA0IGFzIHNwYWNlcikKdmFyIHNwYWNlciA9ICd0cmFuc3BhcmVudHBpeGVsLmdpZic7CgoKCgovL3dpbmRvdy5vbmVycm9yID0gbmV3IEZ1bmN0aW9uKCdyZXR1cm4gdHJ1ZTsnKTsKCgovLyBPcHRpb25hbCBjb21tYW5kcyBwYXNzZWQgdG8gU0VUX0RIVE1MKCkgb24gdGhlIGh0bWwtcGFnZSAoZzogbWF5IGJlIGFwcGxpZWQgZ2xvYmFsbHksIGk6IGluZGl2aWR1YWxseSkKdmFyIENMT05FCQkJPSAnQzEwbkUnOyAgIC8vIGkgIGltZwkgIGNsb25lIGltYWdlCnZhciBDT1BZCQkJPSAnQzBwWSc7CS8vIGkgIGltZwkgIGNyZWF0ZSBjb3BpZXMKdmFyIERFVEFDSF9DSElMRFJFTiA9ICdkMzdhQ0gnOyAgLy8gaSAgbHlyCSAgZGV0YWNoIGltYWdlcwp2YXIgSE9SSVpPTlRBTAkJPSAnSDByMVonOyAgIC8vIGkgIGltZyxseXIgIGhvcml6b250YWxseSBkcmFnZ2FibGUgb25seQp2YXIgTUFYSEVJR0hUCQk9ICdtN3g4SSc7ICAgLy8gaSAgaW1nLGx5ciAgbWF4aW11bSBoZWlnaHQgbGltaXQsICIKdmFyIE1BWE9GRkJPVFRPTQk9ICdtN3hkMHdOJzsgLy8gaSAgaW1nLGx5ciAgZG93bndhcmQgb2Zmc2V0IGxpbWl0CnZhciBNQVhPRkZMRUZUCQk9ICdtN3gyM0Z0JzsgLy8gaSAgaW1nLGx5ciAgbGVmdHdhcmQgb2Zmc2V0IGxpbWl0CnZhciBNQVhPRkZSSUdIVAkJPSAnbTd4MEZmOCc7IC8vIGkgIGltZyxseXIgIHJpZ2h0d2FyZCBvZmZzZXQgbGltaXQKdmFyIE1BWE9GRlRPUAkJPSAnbTd4dTknOyAgIC8vIGkgIGltZyxseXIgIHVwd2FyZCBvZmZzZXQgbGltaXQKdmFyIE1BWFdJRFRICQk9ICdtN3hXMSc7ICAgLy8gaSAgaW1nLGx5ciAgbWF4aW11bSB3aWR0aCBsaW1pdCwgdXNlIHdpdGggcmVzaXphYmxlIG9yIHNjYWxhYmxlCnZhciBNSU5XSURUSAkJPSAnbTFudzEnOyAgIC8vIGkgIGltZyxseXIgIG1pbmltdW0gd2lkdGggbGltaXQsICIKdmFyIE1JTkhFSUdIVAkJPSAnbTFuOEknOyAgIC8vIGkgIGltZyxseXIgIG1pbmltdW0gaGVpZ2h0IGxpbWl0LCAiCnZhciBOT19BTFQJCQk9ICdubzgxVCc7ICAgLy8gZ2kgaW1nCSAgZGlzYWJsZSBhbHQgYW5kIHRpdGxlIGF0dHJpYnV0ZXMKdmFyIE5PX0RSQUcJCQk9ICdOMGQ0QWcnOyAgLy8gaSAgaW1nLGx5ciAgZGlzYWJsZSBkcmFnZ2FiaWxpdHkKdmFyIFJFU0VUX1oJCQk9ICdyMzVFN3onOyAgLy8gZ2kgaW1nLGx5ciAgcmVzZXQgei1pbmRleCB3aGVuIGRyb3BwZWQKdmFyIFJFU0laQUJMRQkJPSAncjVJWmJsJzsgIC8vIGdpIGltZyxseXIgIHJlc2l6YWJsZSBpZiA8Y3RybD4gb3IgPHNoaWZ0PiBwcmVzc2VkCnZhciBTQ0FMQUJMRQkJPSAnU0NMYmwnOyAgIC8vIGdpIGltZyxseXIgIHNjYWxhYmxlCQkgICAiCnZhciBTQ1JPTEwJCQk9ICdzQzhsTCc7ICAgLy8gZ2kgaW1nLGx5ciAgZW5hYmxlIGF1dG8gc2Nyb2xsIGZ1bmN0aW9uYWxpdHkKdmFyIFRSQU5TUEFSRU5UCQk9ICdkSUFwSEFuJzsgLy8gZ2kgaW1nLGx5ciAgdHJhbnNsdWNlbnQgd2hpbGUgZHJhZ2dlZAp2YXIgVkVSVElDQUwJCT0gJ1YzUnQxQyc7ICAvLyBpICBpbWcsbHlyICB2ZXJ0aWNhbGx5IGRyYWdnYWJsZSBvbmx5CnZhciBkZF9jdXJzb3JzID0gbmV3IEFycmF5KAoJJ2M6ZGVmYXVsdCcsCgknYzpjcm9zc2hhaXInLAoJJ2M6ZS1yZXNpemUnLAoJJ2M6aGFuZCcsCgknYzpoZWxwJywKCSdjOm1vdmUnLAoJJ2M6bi1yZXNpemUnLAoJJ2M6bmUtcmVzaXplJywKCSdjOm53LXJlc2l6ZScsCgknYzpzLXJlc2l6ZScsCgknYzpzZS1yZXNpemUnLAoJJ2M6c3ctcmVzaXplJywKCSdjOnRleHQnLAoJJ2M6dy1yZXNpemUnLAoJJ2M6d2FpdCcKKTsKZm9yKHZhciBkZF9pID0gZGRfY3Vyc29ycy5sZW5ndGg7IGRkX2k7KQp7LS1kZF9pOwoJZXZhbCgndmFyIENVUlNPUl8nICsgKGRkX2N1cnNvcnNbZGRfaV0uc3Vic3RyaW5nKDIpLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgnLScsICdfJykpICsgJyA9ICInICsgZGRfY3Vyc29yc1tkZF9pXSArICciOycpOwp9CnZhciBkZF91ID0gInVuZGVmaW5lZCI7CmZ1bmN0aW9uIFdaREQoKQp7Cgl0aGlzLmVsZW1lbnRzID0gbmV3IEFycmF5KDApOwoJdGhpcy5vYmogPSBudWxsOwoJdGhpcy5uID0gbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpOwoJdGhpcy5kYiA9IChkb2N1bWVudC5jb21wYXRNb2RlICYmIGRvY3VtZW50LmNvbXBhdE1vZGUudG9Mb3dlckNhc2UoKSAhPSAiYmFja2NvbXBhdCIpPwoJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudAoJCTogKGRvY3VtZW50LmJvZHkgfHwgbnVsbCk7Cgl0aGlzLm9wID0gISEod2luZG93Lm9wZXJhICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKTsKCWlmKHRoaXMub3ApIGRvY3VtZW50Lm9ubW91c2Vkb3duID0gbmV3IEZ1bmN0aW9uKCdlJywKCQknaWYoKChlID0gZSB8fCB3aW5kb3cuZXZlbnQpLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQpLnRhZ05hbWUgPT0gIklNQUdFIikgcmV0dXJuIGZhbHNlOycpOwoJdGhpcy5pZSA9ICEhKHRoaXMubi5pbmRleE9mKCJtc2llIikgPj0gMCAmJiBkb2N1bWVudC5hbGwgJiYgdGhpcy5kYiAmJiAhdGhpcy5vcCk7Cgl0aGlzLmllbWFjID0gISEodGhpcy5pZSAmJiB0aGlzLm4uaW5kZXhPZigibWFjIikgPj0gMCk7Cgl0aGlzLmllNCA9ICEhKHRoaXMuaWUgJiYgIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKTsKCXRoaXMubjQgPSAhIShkb2N1bWVudC5sYXllcnMgJiYgdHlwZW9mIGRvY3VtZW50LmNsYXNzZXMgIT0gZGRfdSk7Cgl0aGlzLm42ID0gISEodHlwZW9mIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlICE9IGRkX3UgJiYgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZVJhbmdlICE9IGRkX3UpOwoJdGhpcy53M2MgPSAhISghdGhpcy5vcCAmJiAhdGhpcy5pZSAmJiAhdGhpcy5uNiAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCk7Cgl0aGlzLmNlID0gISEoZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyAmJiBkb2N1bWVudC5yZWxlYXNlRXZlbnRzICYmICF0aGlzLm42KTsKCXRoaXMucHggPSB0aGlzLm40PyAnJyA6ICdweCc7Cgl0aGlzLnRXYWl0ID0gdGhpcy53M2M/IDQwIDogMTA7Cgl0aGlzLm5vUmVjYWxjID0gZmFsc2U7Cn0KdmFyIGRkID0gbmV3IFdaREQoKTsKCmRkLkludCA9IGZ1bmN0aW9uKGRfeCwgZF95KQp7CglyZXR1cm4gaXNOYU4oZF95ID0gcGFyc2VJbnQoZF94KSk/IDAgOiBkX3k7Cn07CmRkLmdldFduZFcgPSBmdW5jdGlvbigpCnsKCXJldHVybiBkZC5JbnQoCgkJKGRkLmRiICYmICFkZC5vcCAmJiAhZGQudzNjICYmIGRkLmRiLmNsaWVudFdpZHRoKT8gZGQuZGIuY2xpZW50V2lkdGgKCQk6ICh3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKQoJKTsKfTsKZGQuZ2V0V25kSCA9IGZ1bmN0aW9uKCkKewoJcmV0dXJuIGRkLkludCgKCQkoZGQuZGIgJiYgIWRkLm9wICYmICFkZC53M2MgJiYgZGQuZGIuY2xpZW50SGVpZ2h0KT8gZGQuZGIuY2xpZW50SGVpZ2h0CgkJOiAod2luZG93LmlubmVySGVpZ2h0IHx8IDApCgkpOwp9OwpkZC5nZXRTY3JvbGxYID0gZnVuY3Rpb24oKQp7CglyZXR1cm4gZGQuSW50KHdpbmRvdy5wYWdlWE9mZnNldCB8fCAoZGQuZGI/IGRkLmRiLnNjcm9sbExlZnQgOiAwKSk7Cn07CmRkLmdldFNjcm9sbFkgPSBmdW5jdGlvbigpCnsKCXJldHVybiBkZC5JbnQod2luZG93LnBhZ2VZT2Zmc2V0IHx8IChkZC5kYj8gZGQuZGIuc2Nyb2xsVG9wIDogMCkpOwp9OwpkZC5nZXRQYWdlWFkgPSBmdW5jdGlvbihkX28pCnsKCWlmKGRkLm40ICYmIGRfbykKCXsKCQlkZC54ID0gZF9vLnBhZ2VYIHx8IDA7CgkJZGQueSA9IGRfby5wYWdlWSB8fCAwOwoJfQoJZWxzZQoJewoJCWRkLnggPSBkZC55ID0gMDsgLy9nbG9iYWwgaGVscGVyIHZhcnMKCQl3aGlsZShkX28pCgkJewoJCQlkZC54ICs9IGRkLkludChkX28ub2Zmc2V0TGVmdCk7CgkJCWRkLnkgKz0gZGQuSW50KGRfby5vZmZzZXRUb3ApOwoJCQlkX28gPSBkX28ub2Zmc2V0UGFyZW50IHx8IG51bGw7CgkJfQoJfQp9OwpkZC5nZXRDc3NYWSA9IGZ1bmN0aW9uKGRfbykKewoJaWYoZF9vLmRpdikKCXsKCQlpZihkZC5uNCkKCQl7CgkJCWRfby5jc3N4ID0gZF9vLmRpdi54OwoJCQlkX28uY3NzeSA9IGRfby5kaXYueTsKCQl9CgkJZWxzZSBpZihkZC5pZTQpCgkJewoJCQlkX28uY3NzeCA9IGRfby5jc3MucGl4ZWxMZWZ0OwoJCQlkX28uY3NzeSA9IGRfby5jc3MucGl4ZWxUb3A7CgkJfQoJCWVsc2UKCQl7CgkJCWRfby5jc3MubGVmdCA9IGRfby5jc3MudG9wID0gMCArIGRkLnB4OwoJCQlkZC5nZXRQYWdlWFkoZF9vLmRpdik7CgkJCWRfby5jc3N4ID0gZF9vLnggLSBkZC54OwoJCQlkX28uY3NzeSA9IGRfby55IC0gZGQueTsKCQkJZF9vLmNzcy5sZWZ0ID0gZF9vLmNzc3ggKyBkZC5weDsKCQkJZF9vLmNzcy50b3AgPSBkX28uY3NzeSArIGRkLnB4OwoJCX0KCX0KCWVsc2UKCXsKCQlkX28uY3NzeCA9IDA7CgkJZF9vLmNzc3kgPSAwOwoJfQp9OwpkZC5nZXRJbWdXID0gZnVuY3Rpb24oZF9vKQp7CglyZXR1cm4gZF9vPyBkZC5JbnQoZF9vLndpZHRoKSA6IDA7Cn07CmRkLmdldEltZ0ggPSBmdW5jdGlvbihkX28pCnsKCXJldHVybiBkX28/IGRkLkludChkX28uaGVpZ2h0KSA6IDA7Cn07CmRkLmdldERpdlcgPSBmdW5jdGlvbihkX28pCnsKCXJldHVybiBkZC5JbnQoCgkJZGQubjQ/IChkX28uZGl2PyBkX28uZGl2LmNsaXAud2lkdGggOiAwKQoJCTogZF9vLmRpdj8gKGRfby5kaXYub2Zmc2V0V2lkdGggfHwgZF9vLmNzcy5waXhlbFdpZHRoIHx8IGRfby5jc3Mud2lkdGggfHwgMCkKCQk6IDAKCSk7Cn07CmRkLmdldERpdkggPSBmdW5jdGlvbihkX28pCnsKCXJldHVybiBkZC5JbnQoCgkJZGQubjQ/IChkX28uZGl2PyBkX28uZGl2LmNsaXAuaGVpZ2h0IDogMCkKCQk6IGRfby5kaXY/IChkX28uZGl2Lm9mZnNldEhlaWdodCB8fCBkX28uY3NzLnBpeGVsSGVpZ2h0IHx8IGRfby5jc3MuaGVpZ2h0IHx8IDApCgkJOiAwCgkpOwp9OwpkZC5nZXRXSCA9IGZ1bmN0aW9uKGRfbykKewoJZF9vLncgPSBkZC5nZXREaXZXKGRfbyk7CglkX28uaCA9IGRkLmdldERpdkgoZF9vKTsKCWlmKGRfby5jc3MpCgl7CgkJZF9vLmNzcy53aWR0aCA9IGRfby53ICsgZGQucHg7CgkJZF9vLmNzcy5oZWlnaHQgPSBkX28uaCArIGRkLnB4OwoJCWRfby5kdyA9IGRkLmdldERpdlcoZF9vKS1kX28udzsKCQlkX28uZGggPSBkZC5nZXREaXZIKGRfbyktZF9vLmg7CgkJZF9vLmNzcy53aWR0aCA9IChkX28udy1kX28uZHcpICsgZGQucHg7CgkJZF9vLmNzcy5oZWlnaHQgPSAoZF9vLmgtZF9vLmRoKSArIGRkLnB4OwoJfQoJZWxzZSBkX28uZHcgPSBkX28uZGggPSAwOwp9OwpkZC5nZXRDc3NQcm9wID0gZnVuY3Rpb24oZF9vLCBkX3BuNiwgZF9wc3R5bGUsIGRfcG40KQp7CglpZihkX28gJiYgZGQubjYpIHJldHVybiAnJyt3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkX28sIG51bGwpLmdldFByb3BlcnR5VmFsdWUoZF9wbjYpOwoJaWYoZF9vICYmIGRfby5jdXJyZW50U3R5bGUpIHJldHVybiAnJytldmFsKCdkX28uY3VycmVudFN0eWxlLicrZF9wc3R5bGUpOwoJaWYoZF9vICYmIGRfby5zdHlsZSkgcmV0dXJuICcnK2V2YWwoJ2Rfby5zdHlsZS4nK2RfcHN0eWxlKTsKCWlmKGRfbyAmJiBkZC5uNCkgcmV0dXJuICcnK2V2YWwoJ2Rfby4nK2RfcG40KTsKCXJldHVybiAnJzsKfTsKZGQuZ2V0RGl2ID0gZnVuY3Rpb24oZF94LCBkX2QpCnsKCWRfZCA9IGRfZCB8fCBkb2N1bWVudDsKCWlmKGRkLm40KQoJewoJCWlmKGRfZC5sYXllcnNbZF94XSkgcmV0dXJuIGRfZC5sYXllcnNbZF94XTsKCQlmb3IodmFyIGRfaSA9IGRfZC5sYXllcnMubGVuZ3RoOyBkX2k7KQoJCXsKCQkJdmFyIGRfeSA9IGRkLmdldERpdihkX3gsIGRfZC5sYXllcnNbLS1kX2ldLmRvY3VtZW50KTsKCQkJaWYoZF95KSByZXR1cm4gZF95OwoJCX0KCX0KCWlmKGRkLmllKSByZXR1cm4gZF9kLmFsbFtkX3hdIHx8IG51bGw7CglpZihkX2QuZ2V0RWxlbWVudEJ5SWQpIHJldHVybiBkX2QuZ2V0RWxlbWVudEJ5SWQoZF94KSB8fCBudWxsOwoJcmV0dXJuIG51bGw7Cn07CmRkLmdldEltZyA9IGZ1bmN0aW9uKGRfbywgZF9ubSwgZF94eSwgZF93KQp7CglkX3cgPSBkX3cgfHwgd2luZG93OwoJdmFyIGRfaW1nOwoJaWYoZG9jdW1lbnQuaW1hZ2VzICYmIChkX2ltZyA9IGRfdy5kb2N1bWVudC5pbWFnZXNbZF9ubV0pKQoJewoJCWlmKGRfeHkpCgkJewoJCQlpZihkZC5uNCkKCQkJewoJCQkJZGQuZ2V0UGFnZVhZKGRfdyk7CgkJCQlkX28uZGVmeCA9IGRfaW1nLnggKyBkZC54OwoJCQkJZF9vLmRlZnkgPSBkX2ltZy55ICsgZGQueTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRkLmdldFBhZ2VYWShkX2ltZyk7CgkJCQlkX28uZGVmeCA9IGRkLng7CgkJCQlkX28uZGVmeSA9IGRkLnk7CgkJCX0KCQl9CgkJcmV0dXJuIGRfaW1nOwoJfQoJaWYoZGQubjQpIGZvcih2YXIgZF9pID0gZF93LmRvY3VtZW50LmxheWVycy5sZW5ndGg7IGRfaTspCgl7CgkJdmFyIGRfeSA9IGRkLmdldEltZyhkX28sIGRfbm0sIGRfeHksIGRfdy5kb2N1bWVudC5sYXllcnNbLS1kX2ldKTsKCQlpZihkX3kpIHJldHVybiBkX3k7Cgl9CglyZXR1cm4gbnVsbDsKfTsKZGQuZ2V0UGFyZW50ID0gZnVuY3Rpb24oZF9vLCBkX3ApCnsKCWlmKGRkLm40KQoJewoJCWZvcih2YXIgZF9pID0gZGQuZWxlbWVudHMubGVuZ3RoOyBkX2k7KQoJCXsKCQkJaWYoISgoZF9wID0gZGQuZWxlbWVudHNbLS1kX2ldKS5pc19pbWFnZSkgJiYgZF9wLmRpdiAmJiAoZF9wLmRpdi5kb2N1bWVudC5sYXllcnNbZF9vLm5hbWVdIHx8IGRfby5vaW1nICYmIGRfcC5kaXYuZG9jdW1lbnQuaW1hZ2VzW2Rfby5vaW1nLm5hbWVdKSkKCQkJCWRfcC5hZGRDaGlsZChkX28sIGRfcC5kZXRhY2gsIDEpOwoJCX0KCX0KCWVsc2UKCXsKCQlkX3AgPSBkX28uaXNfaW1hZ2U/IGRkLmdldEltZyhkX28sIGRfby5vaW1nLm5hbWUpIDogKGRfby5kaXYgfHwgbnVsbCk7CgkJd2hpbGUoZF9wICYmICEhKGRfcCA9IGRfcC5vZmZzZXRQYXJlbnQgfHwgZF9wLnBhcmVudE5vZGUgfHwgbnVsbCkpCgkJewoJCQlpZihkX3AuZGRPYmopCgkJCXsKCQkJCWRfcC5kZE9iai5hZGRDaGlsZChkX28sIGRfcC5kZE9iai5kZXRhY2gsIDEpOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn07CmRkLmdldENtZCA9IGZ1bmN0aW9uKGRfbywgZF9jbWQsIGRfY21kU3RyKQp7Cgl2YXIgZF9pID0gZF9vLmlkLmluZGV4T2YoZF9jbWQpLCBkX2osCglkX3kgPSAoZF9pID49IDApKjE7CglpZihkX3kpCgl7CgkJZF9qID0gZF9pK2RfY21kLmxlbmd0aDsKCQlpZihkX2NtZFN0cikgZF9vLmNtZCArPSBkX28uaWQuc3Vic3RyaW5nKGRfaSwgZF9qKTsKCQlkX28uaWQgPSBkX28uaWQuc3Vic3RyaW5nKDAsIGRfaSkgKyBkX28uaWQuc3Vic3RyaW5nKGRfaik7Cgl9CglyZXR1cm4gZF95Owp9OwpkZC5nZXRDbWRWYWwgPSBmdW5jdGlvbihkX28sIGRfY21kLCBkX2NtZFN0ciwgaW50MCkKewoJdmFyIGRfaSA9IGRfby5pZC5pbmRleE9mKGRfY21kKSwgZF9qLAoJZF95ID0gKGRfby5pZC5pbmRleE9mKGRfY21kKSA+PSAwKT8gZGQuSW50KGRfby5pZC5zdWJzdHJpbmcoZF9vLmlkLmluZGV4T2YoZF9jbWQpK2RfY21kLmxlbmd0aCkpIDogaW50MD8gLTEgOiAwOwoJaWYoIWludDAgJiYgZF95IHx8IGludDAgJiYgZF95ID49IDApCgl7CgkJZF9qID0gZF9pK2RfY21kLmxlbmd0aCsoIiIrZF95KS5sZW5ndGg7CgkJaWYoZF9jbWRTdHIpIGRfby5jbWQgKz0gZF9vLmlkLnN1YnN0cmluZyhkX2ksIGRfaik7CgkJZF9vLmlkID0gZF9vLmlkLnN1YnN0cmluZygwLCBkX2kpICsgZF9vLmlkLnN1YnN0cmluZyhkX2opOwoJfQoJcmV0dXJuIGRfeTsKfTsKZGQuYWRkRWx0ID0gZnVuY3Rpb24oZF9vLCBkX3ApCnsKCWRkLmVsZW1lbnRzW2Rfby5uYW1lXSA9IGRkLmVsZW1lbnRzW2Rfby5pbmRleCA9IGRkLmVsZW1lbnRzLmxlbmd0aF0gPSBkX287CglpZihkX3ApIGRfcC5jb3BpZXNbZF9vLm5hbWVdID0gZF9wLmNvcGllc1tkX3AuY29waWVzLmxlbmd0aF0gPSBkX287Cn07CmRkLm1rV3pEb20gPSBmdW5jdGlvbigpCnsKCXZhciBkX28sIGRfbCA9IGRkLmVsZW1lbnRzLmxlbmd0aCwgZF9pOwoJZm9yKGRfaSA9IGRfbDsgZF9pOykgZGQuZ2V0UGFyZW50KGRkLmVsZW1lbnRzWy0tZF9pXSk7Cglmb3IoZF9pID0gZF9sOyBkX2k7KQoJewoJCWlmKChkX28gPSBkZC5lbGVtZW50c1stLWRfaV0pLmNoaWxkcmVuICYmICFkX28ucGFyZW50KQoJCXsKCQkJZm9yKHZhciBkX2ogPSBkX28uY2hpbGRyZW4ubGVuZ3RoOyBkX2o7KQoJCQl7LS1kX2o7CgkJCQlkX28uY2hpbGRyZW5bZF9qXS5zZXRaKGRfby56K2Rfby5jaGlsZHJlbltkX2pdLnosIDEpOwoJCQl9CgkJfQoJfQp9OwpkZC5hZGRQcm9wcyA9IGZ1bmN0aW9uKGRfbykKewoJaWYoZF9vLmlzX2ltYWdlKQoJewoJCWRfby5kaXYgPSBkZC5nZXREaXYoZF9vLmlkKTsKCQlkX28uY3NzID0gKGRfby5kaXYgJiYgdHlwZW9mIGRfby5kaXYuc3R5bGUgIT0gZGRfdSk/IGRfby5kaXYuc3R5bGUgOiBudWxsOwoJCWRfby5uaW1nID0gKGRkLm40ICYmIGRfby5kaXYpPyBkX28uZGl2LmRvY3VtZW50LmltYWdlc1swXSA6IChkb2N1bWVudC5pbWFnZXNbZF9vLmlkKyJOSTFtNkciXSB8fCBudWxsKTsKCQlpZighZF9vLm5vYWx0ICYmICFkZC5ub2FsdCAmJiBkX28ubmltZyAmJiBkX28ub2ltZykKCQl7CgkJCWRfby5uaW1nLmFsdCA9IGRfby5vaW1nLmFsdCB8fCAnJzsKCQkJZF9vLm5pbWcudGl0bGUgPSBkX28ub2ltZy50aXRsZTsKCQkJZF9vLm5pbWcub25tb3VzZW92ZXIgPSBkX28ub2ltZy5vbm1vdXNlb3ZlcjsKCQkJZF9vLm5pbWcub25tb3VzZW91dCA9IGRfby5vaW1nLm9ubW91c2VvdXQ7CgkJfQoJCWRfby5iZ0NvbG9yID0gJyc7Cgl9CgllbHNlCgl7CgkJZF9vLmJnQ29sb3IgPSBkZC5nZXRDc3NQcm9wKGRfby5kaXYsICdiYWNrZ3JvdW5kLWNvbG9yJywnYmFja2dyb3VuZENvbG9yJywnYmdDb2xvcicpLnRvTG93ZXJDYXNlKCk7CgkJaWYoZGQubjYgJiYgZF9vLmRpdikKCQl7CgkJCXZhciBkX2MgPSBkX28uYmdDb2xvci50b0xvd2VyQ2FzZSgpOwoJCQlpZihkX2MuaW5kZXhPZigncmdiJykgPj0gMCkKCQkJewoJCQkJZF9jID0gZF9jLnN1YnN0cmluZyg0LCBkX2MubGVuZ3RoLTEpLnNwbGl0KCcsJyk7CgkJCQlkX28uYmdDb2xvciA9ICcjJzsKCQkJCWZvcih2YXIgZF9sID0gZF9jLmxlbmd0aCwgZF9pID0gMDsgZF9pIDwgZF9sOyBkX2krKykgZF9vLmJnQ29sb3IgKz0gcGFyc2VJbnQoZF9jW2RfaV0pLnRvU3RyaW5nKDB4MTApOwoJCQl9CgkJCWVsc2UgZF9vLmJnQ29sb3IgPSBkX2M7CgkJfQoJfQoJaWYoZGQuc2NhbGFibGUpIGRfby5zY2FsYWJsZSA9IGRfby5yZXNpemFibGVeMTsKCWVsc2UgaWYoZGQucmVzaXphYmxlKSBkX28ucmVzaXphYmxlID0gZF9vLnNjYWxhYmxlXjE7CglkX28uc2V0WihkX28uZGVmeik7CglkX28uY3Vyc29yID0gZF9vLmN1cnNvciB8fCBkZC5jdXJzb3IgfHwgJ2F1dG8nOwoJZF9vLl9zZXRDcnMoZF9vLm5vZHJhZz8gJ2F1dG8nIDogZF9vLmN1cnNvcik7CglkX28uZGlhcGhhbiA9IGRfby5kaWFwaGFuIHx8IGRkLmRpYXBoYW4gfHwgMDsKCWRfby5vcGFjaXR5ID0gMS4wOwoJZF9vLnZpc2libGUgPSB0cnVlOwp9OwpkZC5pbml0eiA9IGZ1bmN0aW9uKCkKewoJaWYoIShkZCAmJiAoZGQubjQgfHwgZGQubjYgfHwgZGQuaWUgfHwgZGQub3AgfHwgZGQudzNjKSkpIHJldHVybjsKCWVsc2UgaWYoZGQubjYgfHwgZGQuaWUgfHwgZGQub3AgfHwgZGQudzNjKSBkZC5yZWNhbGMoMSk7Cgl2YXIgZF9kcmFnID0gKGRvY3VtZW50Lm9ubW91c2Vtb3ZlID09IERSQUcpLAoJZF9yZXNpemUgPSAoZG9jdW1lbnQub25tb3VzZW1vdmUgPT0gUkVTSVpFKTsKCWlmKGRkLmxvYWRGdW5jKSBkZC5sb2FkRnVuYygpOwoJaWYoZF9kcmFnKSBkZC5zZXRNb3ZIZGwoRFJBRyk7CgllbHNlIGlmKGRfcmVzaXplKSBkZC5zZXRNb3ZIZGwoUkVTSVpFKTsKCWlmKGRfZHJhZyB8fCBkX3Jlc2l6ZSkgZGQuc2V0VXBIZGwoRFJPUCk7CglkZC5zZXREd25IZGwoUElDSyk7Cn07CmRkLmZpbmx6ID0gZnVuY3Rpb24oKQp7CglpZihkZC5pZSAmJiBkZC5lbGVtZW50cykKCXsKCQlkZC5ub1JlY2FsYyA9IHRydWU7CgkJZm9yKHZhciBkX2kgPSBkZC5lbGVtZW50cy5sZW5ndGg7IGRfaTspCgkJCWRkLmVsZW1lbnRzWy0tZF9pXS5kZWwoKTsKCQlkZC5ub1JlY2FsYyA9IGZhbHNlOwoJfQoJaWYoZGQudWxvYWRGdW5jKSBkZC51bG9hZEZ1bmMoKTsKfTsKZGQuc2V0Q2UgPSBmdW5jdGlvbihkX2UsIGRfZm5jKQp7CglkX2ZuYz8gZG9jdW1lbnQuY2FwdHVyZUV2ZW50cyhkX2UpIDogZG9jdW1lbnQucmVsZWFzZUV2ZW50cyhkX2UpOwp9OwpkZC5zZXREd25IZGwgPSBmdW5jdGlvbihkX3gpCnsKCWlmKGRvY3VtZW50Lm9ubW91c2Vkb3duICE9IGRfeCkKCXsKCQlkZC5kb3duRnVuYyA9IGRvY3VtZW50Lm9ubW91c2Vkb3duOwoJCWRvY3VtZW50Lm9ubW91c2Vkb3duID0gZF94OwoJCWlmKGRkLmNlKSBkZC5zZXRDZShFdmVudC5NT1VTRURPV04sIGRfeCk7Cgl9Cn07CmRkLnNldE1vdkhkbCA9IGZ1bmN0aW9uKGRfeCkKewoJaWYoZG9jdW1lbnQub25tb3VzZW1vdmUgIT0gZF94KQoJewoJCWRkLm1vdmVGdW5jID0gZG9jdW1lbnQub25tb3VzZW1vdmU7CgkJZG9jdW1lbnQub25tb3VzZW1vdmUgPSBkX3g7CgkJaWYoZGQuY2UpIGRkLnNldENlKEV2ZW50Lk1PVVNFTU9WRSwgZF94KTsKCX0KfTsKZGQuc2V0VXBIZGwgPSBmdW5jdGlvbihkX3gpCnsKCWlmKGRvY3VtZW50Lm9ubW91c2V1cCAhPSBkX3gpCgl7CgkJZGQudXBGdW5jID0gZG9jdW1lbnQub25tb3VzZXVwOwoJCWRvY3VtZW50Lm9ubW91c2V1cCA9IGRfeDsKCQlpZihkZC5jZSkgZGQuc2V0Q2UoRXZlbnQuTU9VU0VVUCwgZF94KTsKCX0KfTsKZGQuZXZ0ID0gZnVuY3Rpb24oZF9lKQp7Cgl0aGlzLmJ1dCA9ICh0aGlzLmUgPSBkX2UgfHwgd2luZG93LmV2ZW50KS53aGljaCB8fCB0aGlzLmUuYnV0dG9uIHx8IDA7Cgl0aGlzLmJ1dHRvbiA9ICh0aGlzLmUudHlwZSA9PSAnbW91c2Vkb3duJyk/IHRoaXMuYnV0CgkJOiAoZGQuZSAmJiBkZC5lLmJ1dHRvbik/IGRkLmUuYnV0dG9uCgkJOiAwOwoJdGhpcy5zcmMgPSB0aGlzLmUudGFyZ2V0IHx8IHRoaXMuZS5zcmNFbGVtZW50IHx8IG51bGw7Cgl0aGlzLnNyYy50YWcgPSAoIiIgKyAodGhpcy5zcmMudGFnTmFtZSB8fCB0aGlzLnNyYykpLnRvTG93ZXJDYXNlKCk7Cgl0aGlzLnggPSBkZC5JbnQodGhpcy5lLnBhZ2VYIHx8IHRoaXMuZS5jbGllbnRYIHx8IDApOwoJdGhpcy55ID0gZGQuSW50KHRoaXMuZS5wYWdlWSB8fCB0aGlzLmUuY2xpZW50WSB8fCAwKTsKCWlmKGRkLmllKQoJewoJCXRoaXMueCArPSBkZC5nZXRTY3JvbGxYKCkgLSAoZGQuaWUgJiYgIWRkLmllbWFjKSoxOwoJCXRoaXMueSArPSBkZC5nZXRTY3JvbGxZKCkgLSAoZGQuaWUgJiYgIWRkLmllbWFjKSoxOwoJfQoJdGhpcy5tb2RpZktleSA9IHRoaXMuZS5tb2RpZmllcnM/IHRoaXMuZS5tb2RpZmllcnMmRXZlbnQuU0hJRlRfTUFTSyA6ICh0aGlzLmUuc2hpZnRLZXkgfHwgZmFsc2UpOwp9OwpkZC5nZXRFdmVudFRhcmdldCA9IGZ1bmN0aW9uKGRfZSwgZF9zLCBkX24pCnsKCWRfZSA9IGRfZSB8fCB3aW5kb3cuZXZlbnQ7CglpZihkX2UgJiYgKGRfcyA9IGRfZS50YXJnZXQgfHwgZF9lLnNyY0VsZW1lbnQgfHwgbnVsbCkgIT0gbnVsbCkKCXsKCQlpZihudWxsICE9IChkX24gPSBkX3MuaWQgfHwgZF9zLm5hbWUgfHwgbnVsbCkpCgkJewoJCQlpZihkX24uaW5kZXhPZigiZElpMTV2TkkxbTZHIikgPT0gZF9uLmxlbmd0aC0xMikKCQkJCXJldHVybiBkZC5lbGVtZW50c1tkX24uc3Vic3RyaW5nKDAsIGRfbi5sZW5ndGgtMTIpXSB8fCBudWxsOwoJCQlpZihkX24uaW5kZXhPZigiZElpMTV2IikgPT0gZF9uLmxlbmd0aC02KQoJCQkJcmV0dXJuIGRkLmVsZW1lbnRzW2Rfbi5zdWJzdHJpbmcoMCwgZF9uLmxlbmd0aC02KV0gfHwgbnVsbDsKCQkJcmV0dXJuIGRkLmVsZW1lbnRzW2Rfbl0gfHwgbnVsbDsKCQl9Cgl9CglyZXR1cm4gbnVsbDsKfTsKZGQucmVjYWxjID0gZnVuY3Rpb24oZF94KQp7CglpZihkZC5ub1JlY2FsYykgcmV0dXJuOwoJZm9yKHZhciBkX28sIGRfaSA9IGRkLmVsZW1lbnRzLmxlbmd0aDsgZF9pOykKCXsKCQlpZighKGRfbyA9IGRkLmVsZW1lbnRzWy0tZF9pXSkuaXNfaW1hZ2UgJiYgZF9vLmRpdikKCQl7CgkJCWRkLmdldFdIKGRfbyk7CgkJCWlmKGRfby5kaXYucG9zX3JlbCkKCQkJewoJCQkJZGQuZ2V0UGFnZVhZKGRfby5kaXYpOwoJCQkJdmFyIGRfZHggPSBkZC54IC0gZF9vLngsIGRfZHkgPSBkZC55IC0gZF9vLnk7CgkJCQlkX28uZGVmeCArPSBkX2R4OwoJCQkJZF9vLnggKz0gZF9keDsKCQkJCWRfby5kZWZ5ICs9IGRfZHk7CgkJCQlkX28ueSArPSBkX2R5OwoJCQkJZm9yKHZhciBkX3AsIGRfaiA9IGRfby5jaGlsZHJlbi5sZW5ndGg7IGRfajspCgkJCQl7CgkJCQkJaWYoIShkX3AgPSBkX28uY2hpbGRyZW5bLS1kX2pdKS5kZXRhY2hlZCAmJiAoZF9vICE9IGRfcC5kZWZwYXJlbnQgfHwgIShkX3AuaXNfaW1hZ2UgJiYgZGQuZ2V0SW1nKGRfcCwgZF9wLm9pbWcubmFtZSwgMSkpKSkKCQkJCQl7CgkJCQkJCWRfcC5kZWZ4ICs9IGRfZHg7CgkJCQkJCWRfcC5kZWZ5ICs9IGRfZHk7CgkJCQkJCWRfcC5tb3ZlQnkoZF9keCwgZF9keSk7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCWVsc2UgaWYoZF9vLmlzX2ltYWdlICYmICFkZC5uNCkKCQl7CgkJCWlmKGRkLm42ICYmIGRfeCAmJiAhZF9vLmRlZncpIGRfby5yZXNpemVUbyhkX28uZGVmdyA9IGRkLmdldEltZ1coZF9vLm9pbWcpLCBkX28uZGVmaCA9IGRkLmdldEltZ0goZF9vLm9pbWcpKTsKCQkJdmFyIGRfZGVmeCA9IGRfby5kZWZ4LCBkX2RlZnkgPSBkX28uZGVmeTsKCQkJaWYoIShkX28ucGFyZW50ICYmIGRfby5wYXJlbnQgIT0gZF9vLmRlZnBhcmVudCkgJiYgKGRfeCB8fCAhZF9vLmRldGFjaGVkIHx8IGRfby5ob3Jpem9udGFsIHx8IGRfby52ZXJ0aWNhbCkgJiYgZGQuZ2V0SW1nKGRfbywgZF9vLm9pbWcubmFtZSwgMSkpCgkJCQlkX28ubW92ZUJ5KGRfby5kZWZ4LWRfZGVmeCwgZF9vLmRlZnktZF9kZWZ5KTsKCQl9Cgl9Cn07CmZ1bmN0aW9uIFdJTlNaKGRfeCkKewoJaWYoZF94KQoJewoJCWlmKGRkLm40KQoJCXsKCQkJZGQuaVcgPSBpbm5lcldpZHRoOwoJCQlkZC5pSCA9IGlubmVySGVpZ2h0OwoJCX0KCQl3aW5kb3cub25yZXNpemUgPSBuZXcgRnVuY3Rpb24oJ1dJTlNaKCk7Jyk7Cgl9CgllbHNlIGlmKGRkLm40ICYmIChpbm5lcldpZHRoICE9IGRkLmlXIHx8IGlubmVySGVpZ2h0ICE9IGRkLmlIKSkgbG9jYXRpb24ucmVsb2FkKCk7CgllbHNlIGlmKCFkZC5uNCkgc2V0VGltZW91dCgnZGQucmVjYWxjKCknLCAweGEpOwp9CldJTlNaKDEpOwoKZnVuY3Rpb24gRERPYmooZF9vLCBkX2kpCnsKCXRoaXMuaWQgPSBkX287Cgl0aGlzLmNtZCA9ICcnOwoJdGhpcy5jcHlfbiA9IGRkLmdldENtZFZhbCh0aGlzLCBDT1BZKTsKCXRoaXMubWF4b2ZmYiA9IGRkLmdldENtZFZhbCh0aGlzLCBNQVhPRkZCT1RUT00sIDAsIDEpOwoJdGhpcy5tYXhvZmZsID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWE9GRkxFRlQsIDAsIDEpOwoJdGhpcy5tYXhvZmZyID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWE9GRlJJR0hULCAwLCAxKTsKCXRoaXMubWF4b2ZmdCA9IGRkLmdldENtZFZhbCh0aGlzLCBNQVhPRkZUT1AsIDAsIDEpOwoJdmFyIGRfaiA9IGRkX2N1cnNvcnMubGVuZ3RoOyB3aGlsZShkX2otLSkKCQlpZihkZC5nZXRDbWQodGhpcywgZGRfY3Vyc29yc1tkX2pdLCAxKSkgdGhpcy5jdXJzb3IgPSBkZF9jdXJzb3JzW2Rfal0uc3Vic3RyaW5nKDIpOwoJdGhpcy5jbG9uZSA9IGRkLmdldENtZCh0aGlzLCBDTE9ORSwgMSk7Cgl0aGlzLmRldGFjaCA9IGRkLmdldENtZCh0aGlzLCBERVRBQ0hfQ0hJTERSRU4pOwoJdGhpcy5zY2FsYWJsZSA9IGRkLmdldENtZCh0aGlzLCBTQ0FMQUJMRSwgMSk7Cgl0aGlzLmhvcml6b250YWwgPSBkZC5nZXRDbWQodGhpcywgSE9SSVpPTlRBTCk7Cgl0aGlzLm5vYWx0ID0gZGQuZ2V0Q21kKHRoaXMsIE5PX0FMVCwgMSk7Cgl0aGlzLm5vZHJhZyA9IGRkLmdldENtZCh0aGlzLCBOT19EUkFHKTsKCXRoaXMuc2Nyb2xsID0gZGQuZ2V0Q21kKHRoaXMsIFNDUk9MTCwgMSk7Cgl0aGlzLnJlc2l6YWJsZSA9IGRkLmdldENtZCh0aGlzLCBSRVNJWkFCTEUsIDEpOwoJdGhpcy5yZV96ID0gZGQuZ2V0Q21kKHRoaXMsIFJFU0VUX1osIDEpOwoJdGhpcy5kaWFwaGFuID0gZGQuZ2V0Q21kKHRoaXMsIFRSQU5TUEFSRU5ULCAxKTsKCXRoaXMudmVydGljYWwgPSBkZC5nZXRDbWQodGhpcywgVkVSVElDQUwpOwoJdGhpcy5tYXh3ID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWFdJRFRILCAxLCAxKTsKCXRoaXMubWludyA9IE1hdGguYWJzKGRkLmdldENtZFZhbCh0aGlzLCBNSU5XSURUSCwgMSwgMSkpOwoJdGhpcy5tYXhoID0gZGQuZ2V0Q21kVmFsKHRoaXMsIE1BWEhFSUdIVCwgMSwgMSk7Cgl0aGlzLm1pbmggPSBNYXRoLmFicyhkZC5nZXRDbWRWYWwodGhpcywgTUlOSEVJR0hULCAxLCAxKSk7Cgl0aGlzLnBpY2tGdW5jID0gdGhpcy5kcmFnRnVuYyA9IHRoaXMucmVzaXplRnVuYyA9IHRoaXMuZHJvcEZ1bmMgPSBudWxsOwoKCXRoaXMubmFtZSA9IHRoaXMuaWQgKyAoZF9pIHx8ICcnKTsKCXRoaXMub2ltZyA9IGRkLmdldEltZyh0aGlzLCB0aGlzLmlkLCAxKTsKCXRoaXMuaXNfaW1hZ2UgPSAhIXRoaXMub2ltZzsKCXRoaXMuY29waWVzID0gbmV3IEFycmF5KCk7Cgl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5KCk7Cgl0aGlzLnBhcmVudCA9IHRoaXMub3JpZ2luYWwgPSBudWxsOwoJaWYodGhpcy5vaW1nKQoJewoJCXRoaXMuaWQgPSB0aGlzLm5hbWUgKyAiZElpMTV2IjsKCQl0aGlzLncgPSBkZC5nZXRJbWdXKHRoaXMub2ltZyk7CgkJdGhpcy5oID0gZGQuZ2V0SW1nSCh0aGlzLm9pbWcpOwoJCXRoaXMuZHcgPSB0aGlzLmRoID0gMDsKCQl0aGlzLmRlZnogPSBkZC5JbnQoZGQuZ2V0Q3NzUHJvcCh0aGlzLm9pbWcsICd6LWluZGV4JywnekluZGV4JywnekluZGV4JykpIHx8IDE7CgkJdGhpcy5kZWZzcmMgPSB0aGlzLnNyYyA9IHRoaXMub2ltZy5zcmM7CgkJdGhpcy5odG0gPSAnPGltZyBuYW1lPSInICsgdGhpcy5pZCArICdOSTFtNkciJysKCQkJJyBzcmM9IicgKyB0aGlzLm9pbWcuc3JjICsgJyIgJysKCQkJJ3dpZHRoPSInICsgdGhpcy53ICsgJyIgaGVpZ2h0PSInICsgdGhpcy5oICsgJyI+JzsKCQl0aGlzLnRfaHRtID0gJzxkaXYgaWQ9IicgKyB0aGlzLmlkICsKCQkJJyIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlOycrCgkJCSdsZWZ0OicgKyAodGhpcy5jc3N4ID0gdGhpcy54ID0gdGhpcy5kZWZ4KSArICdweDsnKwoJCQkndG9wOicgKyAodGhpcy5jc3N5ID0gdGhpcy55ID0gdGhpcy5kZWZ5KSArICdweDsnKwoJCQknd2lkdGg6JyArIHRoaXMudyArICdweDsnKwoJCQknaGVpZ2h0OicgKyB0aGlzLmggKyAncHg7Ij4nKwoJCQl0aGlzLmh0bSArICc8L2Rpdj4nOwoJfQoJZWxzZQoJewoJCWlmKCEhKHRoaXMuZGl2ID0gZGQuZ2V0RGl2KHRoaXMuaWQpKSAmJiB0eXBlb2YgdGhpcy5kaXYuc3R5bGUgIT0gZGRfdSkgdGhpcy5jc3MgPSB0aGlzLmRpdi5zdHlsZTsKCQlkZC5nZXRXSCh0aGlzKTsKCQlpZih0aGlzLmRpdikKCQl7CgkJCXRoaXMuZGl2LmRkT2JqID0gdGhpczsKCQkJdGhpcy5kaXYucG9zX3JlbCA9IGRkLmdldENzc1Byb3AodGhpcy5kaXYsICdwb3NpdGlvbicsJ3Bvc2l0aW9uJywncG9zaXRpb24nKSA9PSAicmVsYXRpdmUiOwoJCX0KCQlkZC5nZXRQYWdlWFkodGhpcy5kaXYpOwoJCXRoaXMuZGVmeCA9IHRoaXMueCA9IGRkLng7CgkJdGhpcy5kZWZ5ID0gdGhpcy55ID0gZGQueTsKCQlkZC5nZXRDc3NYWSh0aGlzKTsKCQl0aGlzLmRlZnogPSBkZC5JbnQoZGQuZ2V0Q3NzUHJvcCh0aGlzLmRpdiwgJ3otaW5kZXgnLCd6SW5kZXgnLCd6SW5kZXgnKSk7Cgl9Cgl0aGlzLmRlZncgPSB0aGlzLncgfHwgMDsKCXRoaXMuZGVmaCA9IHRoaXMuaCB8fCAwOwp9CkRET2JqLnByb3RvdHlwZS5zZXRQaWNrRnVuYyA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5waWNrRnVuYyA9IGRfeDsKfTsKRERPYmoucHJvdG90eXBlLnNldERyYWdGdW5jID0gZnVuY3Rpb24oZF94KQp7Cgl0aGlzLmRyYWdGdW5jID0gZF94Owp9OwpERE9iai5wcm90b3R5cGUuc2V0UmVzaXplRnVuYyA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5yZXNpemVGdW5jID0gZF94Owp9OwpERE9iai5wcm90b3R5cGUuc2V0RHJvcEZ1bmMgPSBmdW5jdGlvbihkX3gpCnsKCXRoaXMuZHJvcEZ1bmMgPSBkX3g7Cn07CkRET2JqLnByb3RvdHlwZS5tb3ZlQnkgPSBmdW5jdGlvbihkX3gsIGRfeSwgZF9rZHMsIGRfbykKewoJaWYoIXRoaXMuZGl2KSByZXR1cm47Cgl0aGlzLnggKz0gKGRfeCA9IGRkLkludChkX3gpKTsKCXRoaXMueSArPSAoZF95ID0gZGQuSW50KGRfeSkpOwoJaWYoIWRfa2RzIHx8IHRoaXMuaXNfaW1hZ2UgfHwgdGhpcy5wYXJlbnQgIT0gdGhpcy5kZWZwYXJlbnQpCgl7CgkJKGRfbyA9IHRoaXMuY3NzIHx8IHRoaXMuZGl2KS5sZWZ0ID0gKHRoaXMuY3NzeCArPSBkX3gpICsgZGQucHg7CgkJZF9vLnRvcCA9ICh0aGlzLmNzc3kgKz0gZF95KSArIGRkLnB4OwoJfQoJZm9yKHZhciBkX2kgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgZF9pOykKCXsKCQlpZighKGRfbyA9IHRoaXMuY2hpbGRyZW5bLS1kX2ldKS5kZXRhY2hlZCkgZF9vLm1vdmVCeShkX3gsIGRfeSwgMSk7CgkJZF9vLmRlZnggKz0gZF94OwoJCWRfby5kZWZ5ICs9IGRfeTsKCX0KfTsKCkRET2JqLnByb3RvdHlwZS5tb3ZlVG8gPSBmdW5jdGlvbihkX3gsIGRfeSkKewoJdGhpcy5tb3ZlQnkoZGQuSW50KGRfeCktdGhpcy54LCBkZC5JbnQoZF95KS10aGlzLnkpOwp9OwpERE9iai5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uKGRfbSwgZF9vLCBkX3ApCnsKCWlmKHRoaXMuZGl2ICYmIHRoaXMudmlzaWJsZSkKCXsKCQlkX3AgPSB0aGlzLmNzcyB8fCB0aGlzLmRpdjsKCQlpZihkX20gJiYgIWRkLm40KQoJCXsKCQkJdGhpcy5kaXNwbGF5ID0gZGQuZ2V0Q3NzUHJvcCh0aGlzLmRpdiwgImRpc3BsYXkiLCAiZGlzcGxheSIsICJkaXNwbGF5Iik7CgkJCWlmKHRoaXMub2ltZykKCQkJewoJCQkJdGhpcy5vaW1nLmRpc3BsYXkgPSBkZC5nZXRDc3NQcm9wKHRoaXMub2ltZywgImRpc3BsYXkiLCAiZGlzcGxheSIsICJkaXNwbGF5Iik7CgkJCQl0aGlzLm9pbWcuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCQkJfQoJCQlkX3AuZGlzcGxheSA9ICJub25lIjsKCQkJZGQucmVjYWxjKCk7CgkJfQoJCWVsc2UgZF9wLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKCX0KCXRoaXMudmlzaWJsZSA9IGZhbHNlOwoJZm9yKHZhciBkX2kgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgZF9pOykKCQlpZighKGRfbyA9IHRoaXMuY2hpbGRyZW5bLS1kX2ldKS5kZXRhY2hlZCkgZF9vLmhpZGUoZF9tKTsKfTsKRERPYmoucHJvdG90eXBlLnNob3cgPSBmdW5jdGlvbihkX28sIGRfcCkKewoJaWYodGhpcy5kaXYpCgl7CgkJZF9wID0gdGhpcy5jc3MgfHwgdGhpcy5kaXY7CgkJaWYoZF9wLmRpc3BsYXkgJiYgZF9wLmRpc3BsYXkgPT0gIm5vbmUiKQoJCXsKCQkJZF9wLmRpc3BsYXkgPSB0aGlzLmRpc3BsYXkgfHwgImJsb2NrIjsKCQkJaWYodGhpcy5vaW1nKSB0aGlzLm9pbWcuc3R5bGUuZGlzcGxheSA9IHRoaXMub2ltZy5kaXNwbGF5IHx8ICJpbmxpbmUiOwoJCQlkZC5yZWNhbGMoKTsKCQl9CgkJZWxzZSBkX3AudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKCX0KCXRoaXMudmlzaWJsZSA9IHRydWU7Cglmb3IodmFyIGRfaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBkX2k7KQoJCWlmKCEoZF9vID0gdGhpcy5jaGlsZHJlblstLWRfaV0pLmRldGFjaGVkKSBkX28uc2hvdygpOwp9OwpERE9iai5wcm90b3R5cGUucmVzaXplVG8gPSBmdW5jdGlvbihkX3csIGRfaCwgZF9vKQp7CglpZighdGhpcy5kaXYpIHJldHVybjsKCWRfdyA9ICh0aGlzLncgPSBkZC5JbnQoZF93KSktdGhpcy5kdzsKCWRfaCA9ICh0aGlzLmggPSBkZC5JbnQoZF9oKSktdGhpcy5kaDsKCWlmKGRkLm40KQoJewoJCXRoaXMuZGl2LnJlc2l6ZVRvKGRfdywgZF9oKTsKCQlpZih0aGlzLmlzX2ltYWdlKQoJCXsKCQkJdGhpcy53cml0ZSgnPGltZyBzcmM9IicgKyB0aGlzLnNyYyArICciIHdpZHRoPSInICsgZF93ICsgJyIgaGVpZ2h0PSInICsgZF9oICsgJyI+Jyk7CgkJCSh0aGlzLm5pbWcgPSB0aGlzLmRpdi5kb2N1bWVudC5pbWFnZXNbMF0pLnNyYyA9IHRoaXMuc3JjOwoJCX0KCX0KCWVsc2UgaWYodHlwZW9mIHRoaXMuY3NzLnBpeGVsV2lkdGggIT0gZGRfdSkKCXsKCQl0aGlzLmNzcy5waXhlbFdpZHRoID0gZF93OwoJCXRoaXMuY3NzLnBpeGVsSGVpZ2h0ID0gZF9oOwoJCWlmKHRoaXMuaXNfaW1hZ2UpCgkJewoJCQkoZF9vID0gdGhpcy5uaW1nLnN0eWxlKS5waXhlbFdpZHRoID0gZF93OwoJCQlkX28ucGl4ZWxIZWlnaHQgPSBkX2g7CgkJfQoJfQoJZWxzZQoJewoJCXRoaXMuY3NzLndpZHRoID0gZF93ICsgZGQucHg7CgkJdGhpcy5jc3MuaGVpZ2h0ID0gZF9oICsgZGQucHg7CgkJaWYodGhpcy5pc19pbWFnZSkKCQl7CgkJCShkX28gPSB0aGlzLm5pbWcpLndpZHRoID0gZF93OwoJCQlkX28uaGVpZ2h0ID0gZF9oOwoJCQlpZighZF9vLmNvbXBsZXRlKSBkX28uc3JjID0gdGhpcy5zcmM7CgkJfQoJfQp9OwpERE9iai5wcm90b3R5cGUucmVzaXplQnkgPSBmdW5jdGlvbihkX2R3LCBkX2RoKQp7Cgl0aGlzLnJlc2l6ZVRvKHRoaXMudytkZC5JbnQoZF9kdyksIHRoaXMuaCtkZC5JbnQoZF9kaCkpOwp9OwpERE9iai5wcm90b3R5cGUuc3dhcEltYWdlID0gZnVuY3Rpb24oZF94LCBkX2NwKQp7CglpZighdGhpcy5uaW1nKSByZXR1cm47Cgl0aGlzLm5pbWcuc3JjID0gZF94OwoJdGhpcy5zcmMgPSB0aGlzLm5pbWcuc3JjOwoJaWYoZF9jcCkKCXsKCQlmb3IodmFyIGRfaSA9IHRoaXMuY29waWVzLmxlbmd0aDsgZF9pOykKCQl7LS1kX2k7CgkJCXRoaXMuY29waWVzW2RfaV0uc3JjID0gdGhpcy5jb3BpZXNbZF9pXS5uaW1nLnNyYyA9IHRoaXMubmltZy5zcmM7CgkJfQoJfQp9OwpERE9iai5wcm90b3R5cGUuc2V0QmdDb2xvciA9IGZ1bmN0aW9uKGRfeCkKewoJaWYoZGQubjQgJiYgdGhpcy5kaXYpIHRoaXMuZGl2LmJnQ29sb3IgPSBkX3g7CgllbHNlIGlmKHRoaXMuY3NzKSB0aGlzLmNzcy5iYWNrZ3JvdW5kID0gZF94OwoJdGhpcy5iZ0NvbG9yID0gZF94Owp9OwpERE9iai5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbihkX3gsIGRfbykKewoJdGhpcy50ZXh0ID0gZF94OwoJaWYoIXRoaXMuZGl2KSByZXR1cm47CglpZihkZC5uNCkKCXsKCQkoZF9vID0gdGhpcy5kaXYuZG9jdW1lbnQpLm9wZW4oKTsKCQlkX28ud3JpdGUoZF94KTsKCQlkX28uY2xvc2UoKTsKCQlkZC5nZXRXSCh0aGlzKTsKCX0KCWVsc2UKCXsKCQl0aGlzLmNzcy5oZWlnaHQgPSAnYXV0byc7CgkJdGhpcy5kaXYuaW5uZXJIVE1MID0gZF94OwoJCWlmKCFkZC5pZTQpIGRkLnJlY2FsYygpOwoJCWlmKGRkLmllNCB8fCBkZC5uNikgc2V0VGltZW91dCgnZGQucmVjYWxjKCk7JywgMCk7IC8vIG42LjA6IHJlY2FsYyB0d2ljZQoJfQp9OwpERE9iai5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uKGRfbiwgZF9wLCBkX2IpCnsKCWlmKCF0aGlzLm9pbWcpIHJldHVybjsKCWRfYiA9IChkZC5pZSAmJiBkb2N1bWVudC5hbGwudGFncygnYm9keScpKT8gZG9jdW1lbnQuYWxsLnRhZ3MoJ2JvZHknKVswXSA6IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lPyAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXSB8fCBkZC5kYikgOiBkZC5kYjsKCWZvcihkX24gPSBkX24gfHwgMTsgZF9uID4gMDsgLS1kX24pCgl7CgkJdmFyIGRfbCA9IHRoaXMuY29waWVzLmxlbmd0aCwKCQlkX28gPSBuZXcgRERPYmoodGhpcy5uYW1lK3RoaXMuY21kLCBkX2wrMSk7CgkJaWYoZGQubjQpCgkJewoJCQlkX28uaWQgPSAoZF9wID0gbmV3IExheWVyKGRfby53KSkubmFtZTsKCQkJZF9wLmNsaXAuaGVpZ2h0ID0gZF9vLmg7CgkJCWRfcC52aXNpYmlsaXR5ID0gJ3Nob3cnOwoJCQkoZF9wID0gZF9wLmRvY3VtZW50KS5vcGVuKCk7CgkJCWRfcC53cml0ZShkX28uaHRtKTsKCQkJZF9wLmNsb3NlKCk7CgkJfQoJCWVsc2UgaWYoZF9iICYmIGRfYi5pbnNlcnRBZGphY2VudEhUTUwpIGRfYi5pbnNlcnRBZGphY2VudEhUTUwoIkFmdGVyQmVnaW4iLCBkX28udF9odG0pOwoJCWVsc2UgaWYoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAmJiBkX2IgJiYgZF9iLmFwcGVuZENoaWxkKQoJCXsKCQkJZF9iLmFwcGVuZENoaWxkKGRfcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRJaTE1diIpKTsKCQkJZF9wLmlubmVySFRNTCA9IGRfby5odG07CgkJCWRfcC5pZCA9IGRfby5pZDsKCQkJZF9wLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKCQkJZF9wLnN0eWxlLndpZHRoID0gZF9vLncgKyAncHgnOwoJCQlkX3Auc3R5bGUuaGVpZ2h0ID0gZF9vLmggKyAncHgnOwoJCX0KCQllbHNlIGlmKGRfYiAmJiBkX2IuaW5uZXJIVE1MKSBkX2IuaW5uZXJIVE1MICs9IGRfby50X2h0bTsKCQlkX28uZGVmeiA9IHRoaXMuZGVmeisxK2RfbDsKCQlkZC5hZGRQcm9wcyhkX28pOwoJCWRfby5vcmlnaW5hbCA9IHRoaXM7CgkJZGQuYWRkRWx0KGRfbywgdGhpcyk7CgkJaWYodGhpcy5wYXJlbnQpCgkJewoJCQl0aGlzLnBhcmVudC5hZGRDaGlsZChkX28sIHRoaXMuZGV0YWNoZWQpOwoJCQlkX28uZGVmcGFyZW50ID0gdGhpcy5kZWZwYXJlbnQ7CgkJfQoJCWRfby5tb3ZlVG8oZF9vLmRlZnggPSB0aGlzLmRlZngsIGRfby5kZWZ5ID0gdGhpcy5kZWZ5KTsKCQlpZihkZC5uNCkgZF9vLmRlZnNyYyA9IGRfby5zcmMgPSB0aGlzLmRlZnNyYzsKCQlkX28uc3dhcEltYWdlKHRoaXMuc3JjKTsKCX0KfTsKRERPYmoucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24oZF9rZCwgZGV0YWNoLCBkZWZwKQp7CglpZih0eXBlb2YgZF9rZCAhPSAib2JqZWN0IikgZF9rZCA9IGRkLmVsZW1lbnRzW2Rfa2RdOwoJaWYoZF9rZC5wYXJlbnQgJiYgZF9rZC5wYXJlbnQgPT0gdGhpcyB8fCBkX2tkID09IHRoaXMgfHwgIWRfa2QuaXNfaW1hZ2UgJiYgZF9rZC5kZWZwYXJlbnQgJiYgIWRlZnApIHJldHVybjsKCgl0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoXSA9IHRoaXMuY2hpbGRyZW5bZF9rZC5uYW1lXSA9IGRfa2Q7CglkX2tkLmRldGFjaGVkID0gZGV0YWNoIHx8IDA7CglpZihkZWZwKSBkX2tkLmRlZnBhcmVudCA9IHRoaXM7CgllbHNlIGlmKHRoaXMgPT0gZF9rZC5kZWZwYXJlbnQgJiYgZF9rZC5pc19pbWFnZSkgZGQuZ2V0SW1nKHRoaXMsIGRfa2Qub2ltZy5uYW1lLCAxKTsKCWlmKCFkX2tkLmRlZnBhcmVudCB8fCB0aGlzICE9IGRfa2QuZGVmcGFyZW50KQoJewoJCWRfa2QuZGVmeCA9IGRfa2QueDsKCQlkX2tkLmRlZnkgPSBkX2tkLnk7Cgl9CglpZighZGV0YWNoKQoJewoJCWRfa2QuZGVmeiA9IGRfa2QuZGVmeit0aGlzLmRlZnotKGRfa2QucGFyZW50PyBkX2tkLnBhcmVudC5kZWZ6IDogMCkrKCFkX2tkLmlzX2ltYWdlKjEpOwoJCWRfa2Quc2V0WihkX2tkLnordGhpcy56LShkX2tkLnBhcmVudD8gZF9rZC5wYXJlbnQueiA6IDApKyghZF9rZC5pc19pbWFnZSoxKSwgMSk7Cgl9CglpZihkX2tkLnBhcmVudCkgZF9rZC5wYXJlbnQucmVtb3ZlQ2hpbGQoZF9rZCwgMSk7CglkX2tkLnBhcmVudCA9IHRoaXM7Cn07CkRET2JqLnByb3RvdHlwZS5yZW1vdmVDaGlsZCA9IGZ1bmN0aW9uKGRfa2QsIGRfbmV3cCkKewoJaWYodHlwZW9mIGRfa2QgIT0gIm9iamVjdCIpIGRfa2QgPSB0aGlzLmNoaWxkcmVuW2Rfa2RdOwoJdmFyIGRfb2MgPSB0aGlzLmNoaWxkcmVuLCBkX25jID0gbmV3IEFycmF5KCk7Cglmb3IodmFyIGRfaSA9IDA7IGRfaSA8IGRfb2MubGVuZ3RoOyBkX2krKykKCQlpZihkX29jW2RfaV0gIT0gZF9rZCkgZF9uY1tkX25jLmxlbmd0aF0gPSBkX29jW2RfaV07Cgl0aGlzLmNoaWxkcmVuID0gZF9uYzsKCWRfa2QucGFyZW50ID0gbnVsbDsKCWlmKCFkX25ld3ApCgl7CgkJZF9rZC5kZXRhY2hlZCA9IGRfa2QuZGVmcCA9IDA7CgkJaWYoZF9rZC5pc19pbWFnZSkgZGQuZ2V0SW1nKGRfa2QsIGRfa2Qub2ltZy5uYW1lLCAxKTsKCX0KfTsKRERPYmoucHJvdG90eXBlLmF0dGFjaENoaWxkID0gZnVuY3Rpb24oZF9rZCkKewoJKGRfa2QgPSAodHlwZW9mIGRfa2QgIT0gIm9iamVjdCIpPyB0aGlzLmNoaWxkcmVuW2Rfa2RdOiBkX2tkKS5kZXRhY2hlZCA9IDA7CglkX2tkLnNldFooZF9rZC5kZWZ6ICsgdGhpcy56LXRoaXMuZGVmeiwgMSk7Cn07CkRET2JqLnByb3RvdHlwZS5kZXRhY2hDaGlsZCA9IGZ1bmN0aW9uKGRfa2QpCnsKCShkX2tkID0gKHR5cGVvZiBkX2tkICE9ICJvYmplY3QiKT8gdGhpcy5jaGlsZHJlbltkX2tkXTogZF9rZCkuZGV0YWNoZWQgPSAxOwp9OwpERE9iai5wcm90b3R5cGUuc2V0WiA9IGZ1bmN0aW9uKGRfeCwgZF9rZHMsIGRfbykKewoJaWYoZF9rZHMpCgl7CgkJZm9yKHZhciBkX2R6ID0gZF94LXRoaXMueiwgZF9pID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGRfaTspCgkJCWlmKCEoZF9vID0gdGhpcy5jaGlsZHJlblstLWRfaV0pLmRldGFjaGVkKSBkX28uc2V0WihkX28ueitkX2R6LCAxKTsKCX0KCWRkLnogPSBNYXRoLm1heChkZC56LCB0aGlzLnogPSB0aGlzLmRpdj8gKCh0aGlzLmNzcyB8fCB0aGlzLmRpdikuekluZGV4ID0gZF94KSA6IDApOwp9OwpERE9iai5wcm90b3R5cGUubWF4aW1pemVaID0gZnVuY3Rpb24oKQp7Cgl0aGlzLnNldFooZGQueisxLCAxKTsKfTsKRERPYmoucHJvdG90eXBlLl9yZXNldFogPSBmdW5jdGlvbihkX28pCnsKCWlmKHRoaXMucmVfeiB8fCBkZC5yZV96KQoJewoJCXRoaXMuc2V0Wih0aGlzLmRlZnopOwoJCWZvcih2YXIgZF9pID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGRfaTspCgkJCWlmKCEoZF9vID0gdGhpcy5jaGlsZHJlblstLWRfaV0pLmRldGFjaGVkKSBkX28uc2V0WihkX28uZGVmeik7Cgl9Cn07CkRET2JqLnByb3RvdHlwZS5zZXRPcGFjaXR5ID0gZnVuY3Rpb24oZF94KQp7Cgl0aGlzLm9wYWNpdHkgPSBkX3g7Cgl0aGlzLl9zZXRPcGFSZWwoMS4wLCAxKTsKfTsKRERPYmoucHJvdG90eXBlLl9zZXRPcGFSZWwgPSBmdW5jdGlvbihkX3gsIGRfa2QsIGRfeSwgZF9vKQp7CglpZih0aGlzLmNzcyAmJiAodGhpcy5kaWFwaGFuIHx8IGRfa2QpKQoJewoJCWRfeSA9IHRoaXMub3BhY2l0eSpkX3g7CgkJaWYodHlwZW9mIHRoaXMuY3NzLk1vek9wYWNpdHkgIT0gZGRfdSkgdGhpcy5jc3MuTW96T3BhY2l0eSA9IGRfeTsKCQllbHNlIGlmICh0eXBlb2YgdGhpcy5jc3Mub3BhY2l0eSAhPSBkZF91KSB0aGlzLmNzcy5vcGFjaXR5ID0gZF95OwoJCWVsc2UgaWYodHlwZW9mIHRoaXMuY3NzLmZpbHRlciAhPSBkZF91KQoJCQl0aGlzLmNzcy5maWx0ZXIgPSAiQWxwaGEob3BhY2l0eT0iK3BhcnNlSW50KDEwMCpkX3kpKyIpIjsKCQlmb3IodmFyIGRfaSA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBkX2k7KQoJCQlpZighKGRfbyA9IHRoaXMuY2hpbGRyZW5bLS1kX2ldKS5kZXRhY2hlZCkgZF9vLl9zZXRPcGFSZWwoZF94LCAxKTsKCX0KfTsKRERPYmoucHJvdG90eXBlLnNldEN1cnNvciA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5fc2V0Q3JzKHRoaXMuY3Vyc29yID0gKGRfeC5pbmRleE9mKCdjOicpKzEpPyBkX3guc3Vic3RyaW5nKDIpIDogZF94KTsKfTsKRERPYmoucHJvdG90eXBlLl9zZXRDcnMgPSBmdW5jdGlvbihkX3gpCnsKCWlmKHRoaXMuY3NzKSB0aGlzLmNzcy5jdXJzb3IgPSAoKCFkZC5pZSB8fCBkZC5pZW1hYykgJiYgZF94ID09ICdoYW5kJyk/ICdwb2ludGVyJyA6IGRfeDsKfTsKRERPYmoucHJvdG90eXBlLnNldERyYWdnYWJsZSA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5ub2RyYWcgPSAhZF94KjE7Cgl0aGlzLl9zZXRDcnMoZF94PyB0aGlzLmN1cnNvciA6ICdhdXRvJyk7Cn07CkRET2JqLnByb3RvdHlwZS5zZXRSZXNpemFibGUgPSBmdW5jdGlvbihkX3gpCnsKCXRoaXMucmVzaXphYmxlID0gZF94KjE7CglpZihkX3gpIHRoaXMuc2NhbGFibGUgPSAwOwp9OwpERE9iai5wcm90b3R5cGUuc2V0U2NhbGFibGUgPSBmdW5jdGlvbihkX3gpCnsKCXRoaXMuc2NhbGFibGUgPSBkX3gqMTsKCWlmKGRfeCkgdGhpcy5yZXNpemFibGUgPSAwOwp9OwpERE9iai5wcm90b3R5cGUuc2V0SG9yaXpvbnRhbCA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy5ob3Jpem9udGFsID0gZF94KjE7Cn07CkRET2JqLnByb3RvdHlwZS5zZXRWZXJ0aWNhbCA9IGZ1bmN0aW9uKGRfeCkKewoJdGhpcy52ZXJ0aWNhbCA9IGRfeCoxOwp9OwpERE9iai5wcm90b3R5cGUuZ2V0RWx0QmVsb3cgPSBmdW5jdGlvbihkX3JldCwgZF94LCBkX3kpCnsKCXZhciBkX28sIGRfY21wID0gLTEsIGRfaSA9IGRkLmVsZW1lbnRzLmxlbmd0aDsgd2hpbGUoZF9pLS0pCgl7CgkJZF9vID0gZGQuZWxlbWVudHNbZF9pXTsKCQlkX3ggPSBkX28ueC10aGlzLncvMjsKCQlkX3kgPSBkX28ueS10aGlzLmgvMjsKCQlpZihkX28udmlzaWJsZSAmJiBkX28ueiA8IHRoaXMueiAmJiB0aGlzLnggPj0gZF94ICYmIHRoaXMueCA8PSBkX3grZF9vLncgJiYgdGhpcy55ID49IGRfeSAmJiB0aGlzLnkgPD0gZF95K2Rfby5oKQoJCXsKCQkJaWYoZF9vLnogPiBkX2NtcCkKCQkJewoJCQkJZF9jbXAgPSBkX28uejsKCQkJCWRfcmV0ID0gZF9vOwoJCQl9CgkJfQoJfQoJcmV0dXJuIGRfcmV0Owp9OwpERE9iai5wcm90b3R5cGUuZGVsID0gZnVuY3Rpb24oZF9vcywgZF9vKQp7Cgl2YXIgZF9pLCBkX2w7CglpZih0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5yZW1vdmVDaGlsZCkgdGhpcy5wYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CglpZih0aGlzLm9yaWdpbmFsKQoJewoJCXRoaXMuaGlkZSgpOwoJCWlmKHRoaXMub3JpZ2luYWwuY29waWVzKQoJCXsKCQkJZF9vcyA9IG5ldyBBcnJheSgpOwoJCQlmb3IoZF9sID0gdGhpcy5vcmlnaW5hbC5jb3BpZXMubGVuZ3RoLCBkX2kgPSAwOyBkX2kgPCBkX2w7IGRfaSsrKQoJCQkJaWYoKGRfbyA9IHRoaXMub3JpZ2luYWwuY29waWVzW2RfaV0pICE9IHRoaXMpIGRfb3NbZF9vLm5hbWVdID0gZF9vc1tkX29zLmxlbmd0aF0gPSBkX287CgkJCXRoaXMub3JpZ2luYWwuY29waWVzID0gZF9vczsKCQl9Cgl9CgllbHNlIGlmKHRoaXMuaXNfaW1hZ2UpCgl7CgkJdGhpcy5oaWRlKCk7CgkJaWYodGhpcy5vaW1nKQoJCXsKCQkgIGlmKGRkLm40KSB0aGlzLm9pbWcuc3JjID0gdGhpcy5kZWZzcmM7CgkJICBlbHNlIHRoaXMub2ltZy5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnOwoJCX0KCX0KCWVsc2UgaWYodGhpcy5tb3ZlVG8pCgl7CgkJaWYodGhpcy5jc3MpIHRoaXMuY3NzLmN1cnNvciA9ICdkZWZhdWx0JzsKCQl0aGlzLm1vdmVUbyh0aGlzLmRlZngsIHRoaXMuZGVmeSk7CgkJdGhpcy5yZXNpemVUbyh0aGlzLmRlZncsIHRoaXMuZGVmaCk7Cgl9CglkX29zID0gbmV3IEFycmF5KCk7Cglmb3IoZF9sID0gZGQuZWxlbWVudHMubGVuZ3RoLCBkX2kgPSAwOyBkX2kgPCBkX2w7IGRfaSsrKQoJewoJCWlmKChkX28gPSBkZC5lbGVtZW50c1tkX2ldKSAhPSB0aGlzKSBkX29zW2Rfby5uYW1lXSA9IGRfb3NbZF9vLmluZGV4ID0gZF9vcy5sZW5ndGhdID0gZF9vOwoJCWVsc2UgZF9vLl9mcmVlKCk7Cgl9CglkZC5lbGVtZW50cyA9IGRfb3M7CglpZighZGQubjQpIGRkLnJlY2FsYygpOwp9OwpERE9iai5wcm90b3R5cGUuX2ZyZWUgPSBmdW5jdGlvbigpCnsKCWZvcih2YXIgZF9pIGluIHRoaXMpCgkJdGhpc1tkX2ldID0gbnVsbDsKCWRkLmVsZW1lbnRzW3RoaXMubmFtZV0gPSBudWxsOwp9OwpkZC5uNFJlY3RWaXMgPSBmdW5jdGlvbih2aXMpCnsKCWZvcih2YXIgZF9pID0gNDsgZF9pOykKCXstLWRfaTsKCQlkZC5yZWN0SVtkX2ldLnZpc2liaWxpdHkgPSBkZC5yZWN0QVtkX2ldLnZpc2liaWxpdHkgPSB2aXM/ICdzaG93JyA6ICdoaWRlJzsKCQlpZih2aXMpIGRkLnJlY3RJW2RfaV0uekluZGV4ID0gZGQucmVjdEFbZF9pXS56SW5kZXggPSBkZC56KzI7Cgl9Cn07CmRkLm40UmVjdFBvcyA9IGZ1bmN0aW9uKGRfbywgZF94LCBkX3ksIGRfdywgZF9oKQp7CglkX28ueCA9IGRfeDsKCWRfby55ID0gZF95OwoJZF9vLmNsaXAud2lkdGggPSBkX3c7CglkX28uY2xpcC5oZWlnaHQgPSBkX2g7Cn07Ci8vIE5ONDogRHJhdyBpbWcgc2l6aW5nIHJlY3QKZGQubjRSZWN0ID0gZnVuY3Rpb24oZF93LCBkX2gpCnsKCXZhciBkX2k7CglpZighZGQucmVjdEkpCgl7CgkJZGQucmVjdEkgPSBuZXcgQXJyYXkoKTsKCQlkZC5yZWN0QSA9IG5ldyBBcnJheSgpOwoJfQoJaWYoIWRkLnJlY3RJWzBdKQoJewoJCWZvcihkX2kgPSA0OyBkX2k7KQoJCXsKCQkJKGRkLnJlY3RJWy0tZF9pXSA9IG5ldyBMYXllcigxKSkuYmdDb2xvciA9ICcjMDAwMDAwJzsKCQkJKGRkLnJlY3RBW2RfaV0gPSBuZXcgTGF5ZXIoMSkpLmJnQ29sb3IgPSAnI2ZmZmZmZic7CgkJfQoJfQoJaWYoIWRkLnJlY3RJWzBdLnZpc2liaWxpdHkgfHwgZGQucmVjdElbMF0udmlzaWJpbGl0eSA9PSAnaGlkZScpIGRkLm40UmVjdFZpcygxKTsKCWRkLm9iai53ID0gZF93OwoJZGQub2JqLmggPSBkX2g7Cglmb3IoZF9pID0gNDsgZF9pOykKCXstLWRfaTsKCQlkZC5uNFJlY3RQb3MoZGQucmVjdElbZF9pXSwgZGQub2JqLnggKyAoIShkX2ktMSk/IChkZC5vYmoudy0xKSA6IDApLCBkZC5vYmoueSArICghKGRfaS0yKT8gKGRkLm9iai5oLTEpIDogMCksIGRfaSYxIHx8IGRkLm9iai53LCAhKGRfaSYxKSB8fCBkZC5vYmouaCk7CgkJZGQubjRSZWN0UG9zKGRkLnJlY3RBW2RfaV0sICEoZF9pLTEpPyBkZC5yZWN0SVsxXS54KzEgOiAoZGQub2JqLngtMSksICEoZF9pLTIpPyBkZC5yZWN0SVsyXS55KzEgOiAoZGQub2JqLnktMSksIGRfaSYxIHx8IGRkLm9iai53KzIsICEoZF9pJjEpIHx8IGRkLm9iai5oKzIpOwoJfQp9OwpkZC5yZXN6VG8gPSBmdW5jdGlvbihkX3csIGRfaCkKewoJaWYoZGQubjQgJiYgZGQub2JqLmlzX2ltYWdlKSBkZC5uNFJlY3QoZF93LCBkX2gpOwoJZWxzZSBkZC5vYmoucmVzaXplVG8oZF93LCBkX2gpOwp9OwpkZC5lbWJlZFZpcyA9IGZ1bmN0aW9uKGRfdmlzKQp7Cgl2YXIgZF9vID0gbmV3IEFycmF5KCdpZnJhbWUnLCAnYXBwbGV0JywgJ2VtYmVkJywgJ29iamVjdCcpOwoJZm9yKHZhciBkX2kgPSBkX28ubGVuZ3RoOyBkX2k7KQoJey0tZF9pOwoJCXZhciBkX3AgPSBkZC5pZT8gZG9jdW1lbnQuYWxsLnRhZ3MoZF9vW2RfaV0pIDogZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWU/IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKGRfb1tkX2ldKSA6IG51bGw7CgkJaWYoZF9wKQoJCXsKCQkJZm9yKHZhciBkX2ogPSBkX3AubGVuZ3RoOyBkX2o7KQoJCQl7CgkJCQl2YXIgZF9xID0gZF9wWy0tZF9qXTsKCQkJCXdoaWxlKGRfcS5vZmZzZXRQYXJlbnQgfHwgZF9xLnBhcmVudE5vZGUpCgkJCQl7CgkJCQkJaWYoKGRfcSA9IGRfcS5wYXJlbnROb2RlIHx8IGRfcS5vZmZzZXRQYXJlbnQgfHwgbnVsbCkgPT0gZGQub2JqLmRpdikKCQkJCQl7CgkJCQkJCWRfcFtkX2pdLnN0eWxlLnZpc2liaWxpdHkgPSBkX3ZpczsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKZGQubWF4T2ZmWCA9IGZ1bmN0aW9uKGRfeCwgZF95KQp7CglyZXR1cm4oCgkJKGRkLm9iai5tYXhvZmZsKzEgJiYgKGRfeSA9IGRkLm9iai5kZWZ4LWRkLm9iai5tYXhvZmZsKS1kX3ggPiAwCgkJfHwgZGQub2JqLm1heG9mZnIrMSAmJiAoZF95ID0gZGQub2JqLmRlZngrZGQub2JqLm1heG9mZnIpLWRfeCA8IDApPyBkX3kKCQk6IGRfeAoJKTsKfTsKZGQubWF4T2ZmWSA9IGZ1bmN0aW9uKGRfeCwgZF95KQp7CglyZXR1cm4oCgkJKGRkLm9iai5tYXhvZmZ0KzEgJiYgKGRfeSA9IGRkLm9iai5kZWZ5LWRkLm9iai5tYXhvZmZ0KS1kX3ggPiAwCgkJfHwgZGQub2JqLm1heG9mZmIrMSAmJiAoZF95ID0gZGQub2JqLmRlZnkrZGQub2JqLm1heG9mZmIpLWRfeCA8IDApPyBkX3kKCQk6IGRfeAoJKTsKfTsKZGQuaW5XbmRXID0gZnVuY3Rpb24oZF94LCBkX3kpCnsKCXZhciBkX3d4ID0gZGQuZ2V0U2Nyb2xsWCgpLAoJZF93dyA9IGRkLmdldFduZFcoKTsKCXJldHVybigKCQkoKGRfeSA9IGRfd3grMiktZF94ID4gMCkgfHwgKChkX3kgPSBkX3d4K2Rfd3crZGQub2JqLnctMiktZF94IDwgMCk/IGRfeQoJCTogZF94CgkpOwp9OwpkZC5pblduZEggPSBmdW5jdGlvbihkX3gsIGRfeSkKewoJdmFyIGRfd3kgPSBkZC5nZXRTY3JvbGxZKCksCglkX3doID0gZGQuZ2V0V25kSCgpOwoJcmV0dXJuKAoJCSgoZF95ID0gZF93eSsyKS1kX3ggPiAwKSB8fCAoKGRfeSA9IGRfd3krZF93aCtkZC5vYmouaC0yKS1kX3ggPCAwKT8gZF95CgkJOiBkX3gKCSk7Cn07Ci8vIFRoZXNlIHR3byBmdW5jcyBsaW1pdCB0aGUgc2l6ZSBvZiBlbGVtZW50IHdoZW4gbW91c2VyZXNpemVkLgovLyBJbXBsZW1lbnRlZCAyMi41LjIwMDMgYnkgR3JlZ29yIEx0b2xmLCBtb2RpZmllZCBieSBXYWx0ZXIgWm9ybgpkZC5saW1XID0gZnVuY3Rpb24oZF93KQp7CglyZXR1cm4oCgkJKGRkLm9iai5taW53LWRfdyA+IDApPyBkZC5vYmoubWludwoJCTogKGRkLm9iai5tYXh3ID4gMCAmJiBkZC5vYmoubWF4dy1kX3cgPCAwKT8gZGQub2JqLm1heHcKCQk6IGRfdwoJKTsKfTsKZGQubGltSCA9IGZ1bmN0aW9uKGRfaCkKewoJcmV0dXJuKAoJCShkZC5vYmoubWluaC1kX2ggPiAwKT8gZGQub2JqLm1pbmgKCQk6IChkZC5vYmoubWF4aCA+IDAgJiYgZGQub2JqLm1heGgtZF9oIDwgMCk/IGRkLm9iai5tYXhoCgkJOiBkX2gKCSk7Cn07Ci8vIE9wdGlvbmFsIGF1dG9zY3JvbGwtcGFnZSBmdW5jdGlvbmFsaXR5LiBDb3VydGVzeSBDZWRyaWMgU2F2YXJlc2UuCi8vIE1vZGlmaWVkIGJ5IFdhbHRlciBab3JuLgpmdW5jdGlvbiBERFNjcm9sbCgpCnsKCWlmKCFkZC5vYmogfHwgIWRkLm9iai5zY3JvbGwgJiYgIWRkLnNjcm9sbCB8fCBkZC5pZTQgfHwgZGQud2hyYXRpbykKCXsKCQlkZC5zY3J4ID0gZGQuc2NyeSA9IDA7CgkJcmV0dXJuOwoJfQoJdmFyIGRfYm5kID0gMHgxYywKCWRfd3ggPSBkZC5nZXRTY3JvbGxYKCksIGRfd3kgPSBkZC5nZXRTY3JvbGxZKCk7CglpZihkZC5tc21vdmVkKQoJewoJCXZhciBkX3d3ID0gZGQuZ2V0V25kVygpLCBkX3doID0gZGQuZ2V0V25kSCgpLCBkX3k7CgkJZGQuc2NyeCA9ICgoZF95ID0gZGQuZS54LWRfd3ctZF93eCtkX2JuZCkgPiAwKT8gKGRfeT4+PTIpKmRfeQoJCQk6ICgoZF95ID0gZF93eCtkX2JuZC1kZC5lLngpID4gMCk/IC0oZF95Pj49MikqZF95CgkJCTogMDsKCQlkZC5zY3J5ID0gKChkX3kgPSBkZC5lLnktZF93aC1kX3d5K2RfYm5kKSA+IDApPyAoZF95Pj49MikqZF95CgkJCTogKChkX3kgPSBkX3d5K2RfYm5kLWRkLmUueSkgPiAwKT8gLShkX3k+Pj0yKSpkX3kKCQkJOiAwOwoJfQoJaWYoZGQuc2NyeCB8fCBkZC5zY3J5KQoJewoJCXdpbmRvdy5zY3JvbGxUbygKCQkJZF93eCArIChkZC5zY3J4ID0gZGQub2JqLmlzX3Jlc2l6ZWQ/IGRkLmxpbVcoZGQub2JqLncrZGQuc2NyeCktZGQub2JqLncgOiBkZC5vYmoudmVydGljYWw/IDAgOiAoZGQubWF4T2ZmWChkZC5vYmoueCtkZC5zY3J4KS1kZC5vYmoueCkpLAoJCQlkX3d5ICsgKGRkLnNjcnkgPSBkZC5vYmouaXNfcmVzaXplZD8gZGQubGltSChkZC5vYmouaCtkZC5zY3J5KS1kZC5vYmouaCA6IGRkLm9iai5ob3Jpem9udGFsPyAwIDogKGRkLm1heE9mZlkoZGQub2JqLnkrZGQuc2NyeSktZGQub2JqLnkpKQoJCSk7CgkJZGQub2JqLmlzX2RyYWdnZWQ/IGRkLm9iai5tb3ZlVG8oZGQub2JqLngrZGQuZ2V0U2Nyb2xsWCgpLWRfd3gsIGRkLm9iai55K2RkLmdldFNjcm9sbFkoKS1kX3d5KQoJCQk6IGRkLnJlc3pUbyhkZC5vYmoudytkZC5nZXRTY3JvbGxYKCktZF93eCwgZGQub2JqLmgrZGQuZ2V0U2Nyb2xsWSgpLWRfd3kpOwoJfQoJZGQubXNtb3ZlZCA9IDA7Cgl3aW5kb3cuc2V0VGltZW91dCgnRERTY3JvbGwoKScsIDB4MzMpOwp9CmZ1bmN0aW9uIFBJQ0soZF9ldikKewoJZGQuZSA9IG5ldyBkZC5ldnQoZF9ldik7CglpZihkZC5lLnggPj0gZGQuZ2V0V25kVygpK2RkLmdldFNjcm9sbFgoKSB8fCBkZC5lLnkgPj0gZGQuZ2V0V25kSCgpK2RkLmdldFNjcm9sbFkoKSkgcmV0dXJuIHRydWU7IC8vIG9uIHNjcm9sbGJhcgoJZm9yKHZhciBkX28sIGRfdCwgZF9jbXAgPSAtMSwgZF9pID0gZGQuZWxlbWVudHMubGVuZ3RoOyBkX2k7KQoJewoJCWRfbyA9IGRkLmVsZW1lbnRzWy0tZF9pXTsKCQlpZihkZC5uNCAmJiBkZC5lLmJ1dCA+IDEgJiYgZGQuZS5zcmMgPT0gZF9vLm9pbWcgJiYgIWRfby5jbG9uZSkgcmV0dXJuIGZhbHNlOwoJCWlmKGRfby52aXNpYmxlICYmIGRkLmUuYnV0IDw9IDEgJiYgZGQuZS54ID49IGRfby54ICYmIGRkLmUueCA8PSBkX28ueCtkX28udyAmJiBkZC5lLnkgPj0gZF9vLnkgJiYgZGQuZS55IDw9IGRfby55K2Rfby5oKQoJCXsKCQkJaWYoZF9vLnogPiBkX2NtcCAmJiAoZF90ID0gZGQuZS5zcmMudGFnKS5pbmRleE9mKCdpbnB1JykgPCAwICYmIGRfdC5pbmRleE9mKCd0ZXh0YScpIDwgMCAmJiBkX3QuaW5kZXhPZignc2VsZScpIDwgMCAmJiBkX3QuaW5kZXhPZignb3B0aScpIDwgMCAmJiBkX3QuaW5kZXhPZignc2Nyb2wnKSA8IDApCgkJCXsKCQkJCWRfY21wID0gZF9vLno7CgkJCQlkZC5vYmogPSBkX287CgkJCX0KCQl9Cgl9CglpZihkZC5vYmopCgl7CgkJaWYoZGQub2JqLm5vZHJhZykgZGQub2JqID0gbnVsbDsKCQllbHNlCgkJewoJCQlkZC5lLmUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKCQkJdmFyIGRfcnN6ID0gZGQuZS5tb2RpZktleSAmJiAoZGQub2JqLnJlc2l6YWJsZSB8fCBkZC5vYmouc2NhbGFibGUpOwoJCQlpZihkZC5vcCkKCQkJewoJCQkJKGRfbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdPcEJsVXInKSkuc3R5bGUucGl4ZWxMZWZ0ID0gZGQuZS54OwoJCQkJZF9vLnN0eWxlLnBpeGVsVG9wID0gZGQuZS55OwoJCQkJKGRfbyA9IGRfby5jaGlsZHJlblswXS5jaGlsZHJlblswXSkuZm9jdXMoKTsKCQkJCWRfby5ibHVyKCk7CgkJCX0KCQkJZWxzZSBpZihkZC5pZSAmJiAhZGQuaWU0KQoJCQl7CgkJCQlpZihkb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KSBkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsKCQkJCWRkLmRiLm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbigpCgkJCQl7CgkJCQkJZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTsKCQkJCX07CgkJCX0KCQkJaWYoZF9yc3opCgkJCXsKCQkJCWRkLm9iai5fc2V0Q3JzKCdzZS1yZXNpemUnKTsKCQkJCWRkLm9iai5pc19yZXNpemVkID0gMTsKCQkJCWRkLndocmF0aW8gPSBkZC5vYmouc2NhbGFibGU/IGRkLm9iai5kZWZ3L2RkLm9iai5kZWZoIDogMDsKCQkJCWlmKGRkLmllKQoJCQkJewoJCQkJCWlmKGRkLmllNCkKCQkJCQl7CgkJCQkJCXdpbmRvdy5kZF94ID0gZGQuZ2V0U2Nyb2xsWCgpOwoJCQkJCQl3aW5kb3cuZGRfeSA9IGRkLmdldFNjcm9sbFkoKTsKCQkJCQl9CgkJCQkJc2V0VGltZW91dCgKCQkJCQkJJ2lmKGRkLm9iaiAmJiBkb2N1bWVudC5zZWxlY3Rpb24gJiYgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KScrCgkJCQkJCSd7JysKCQkJCQkJCSdkb2N1bWVudC5zZWxlY3Rpb24uZW1wdHkoKTsnKwoJCQkJCQkJJ2lmKGRkLmllNCkgd2luZG93LnNjcm9sbFRvKHdpbmRvdy5kZF94LCB3aW5kb3cuZGRfeSk7JysKCQkJCQkJJ30nCgkJCQkJLDApOwoJCQkJfQoJCQkJZGQuc2V0TW92SGRsKFJFU0laRSk7CgkJCQlkZC5yZXN6VG8oZGQub2JqLncsIGRkLm9iai5oKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRkLm9iai5pc19kcmFnZ2VkID0gMTsKCQkJCWRkLnNldE1vdkhkbChEUkFHKTsKCQkJfQoJCQlkZC5zZXRVcEhkbChEUk9QKTsKCQkJZGQuZW1iZWRWaXMoJ2hpZGRlbicpOwoJCQlkZC5vYmouX3NldE9wYVJlbCgwLjcpOwoJCQlkZC5vYmoubWF4aW1pemVaKCk7CgkJCWRkLm9meCA9IGRkLm9iai54K2RkLm9iai53LWRkLmUueDsKCQkJZGQub2Z5ID0gZGQub2JqLnkrZGQub2JqLmgtZGQuZS55OwoJCQlpZih3aW5kb3cubXlfUGlja0Z1bmMpIG15X1BpY2tGdW5jKCk7CgkJCWlmKGRkLm9iai5waWNrRnVuYykgZGQub2JqLnBpY2tGdW5jKCk7CgkJCUREU2Nyb2xsKCk7CgkJCXJldHVybiAhKAoJCQkJZGQub2JqLmlzX3Jlc2l6ZWQKCQkJCXx8IGRkLm40ICYmIGRkLm9iai5pc19pbWFnZQoJCQkJfHwgZGQubjYgfHwgZGQudzNjCgkJCSk7CgkJfQoJfQoJaWYoZGQuZG93bkZ1bmMpIHJldHVybiBkZC5kb3duRnVuYyhkX2V2KTsKCXJldHVybiB0cnVlOwp9CmZ1bmN0aW9uIERSQUcoZF9ldikKewoJaWYoIWRkLm9iaiB8fCAhZGQub2JqLnZpc2libGUpIHJldHVybiB0cnVlOwoJaWYoZGQuaWU0IHx8IGRkLnczYyB8fCBkZC5uNiB8fCBkZC5vYmouY2hpbGRyZW4ubGVuZ3RoID4gMHhmKQoJewoJCWlmKGRkLndhaXQpIHJldHVybiBmYWxzZTsKCQlkZC53YWl0ID0gMTsKCQlzZXRUaW1lb3V0KCdkZC53YWl0ID0gMDsnLCBkZC50V2FpdCk7Cgl9CglkZC5lID0gbmV3IGRkLmV2dChkX2V2KTsKCWlmKGRkLmllICYmICFkZC5lLmJ1dCkKCXsKCQlEUk9QKGRfZXYpOwoJCXJldHVybiB0cnVlOwoJfQoJZGQubXNtb3ZlZCA9IDE7CglkZC5vYmoubW92ZVRvKAoJCWRkLm9iai52ZXJ0aWNhbD8gZGQub2JqLnggOiBkZC5tYXhPZmZYKGRkLmluV25kVyhkZC5vZngrZGQuZS54KS1kZC5vYmoudyksCgkJZGQub2JqLmhvcml6b250YWw/IGRkLm9iai55IDogZGQubWF4T2ZmWShkZC5pblduZEgoZGQub2Z5K2RkLmUueSktZGQub2JqLmgpCgkpOwoKCWlmKHdpbmRvdy5teV9EcmFnRnVuYykgbXlfRHJhZ0Z1bmMoKTsKCWlmKGRkLm9iai5kcmFnRnVuYykgZGQub2JqLmRyYWdGdW5jKCk7CglpZihkZC5tb3ZlRnVuYykgcmV0dXJuIGRkLm1vdmVGdW5jKGRfZXYpOwoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIFJFU0laRShkX2V2KQp7CglpZighZGQub2JqIHx8ICFkZC5vYmoudmlzaWJsZSkgcmV0dXJuIHRydWU7CglpZihkZC53YWl0KSByZXR1cm4gZmFsc2U7CglkZC53YWl0ID0gMTsKCXNldFRpbWVvdXQoJ2RkLndhaXQgPSAwOycsIGRkLnRXYWl0KTsKCWRkLmUgPSBuZXcgZGQuZXZ0KGRfZXYpOwoJaWYoZGQuaWUgJiYgIWRkLmUuYnV0KQoJewoJCURST1AoZF9ldik7CgkJcmV0dXJuIHRydWU7Cgl9CglkZC5tc21vdmVkID0gMTsKCXZhciBkX3cgPSBkZC5saW1XKGRkLmluV25kVyhkZC5vZngrZGQuZS54KS1kZC5vYmoueCksIGRfaDsKCWlmKCFkZC53aHJhdGlvKSBkX2ggPSBkZC5saW1IKGRkLmluV25kSChkZC5vZnkrZGQuZS55KS1kZC5vYmoueSk7CgllbHNlCgl7CgkJZF9oID0gZGQubGltSChkZC5pblduZEgoTWF0aC5yb3VuZChkX3cvZGQud2hyYXRpbykrZGQub2JqLnkpLWRkLm9iai55KTsKCQlkX3cgPSBNYXRoLnJvdW5kKGRfaCpkZC53aHJhdGlvKTsKCX0KCWRkLnJlc3pUbyhkX3csIGRfaCk7CglpZih3aW5kb3cubXlfUmVzaXplRnVuYykgbXlfUmVzaXplRnVuYygpOwoJaWYoZGQub2JqLnJlc2l6ZUZ1bmMpIGRkLm9iai5yZXNpemVGdW5jKCk7CglpZihkZC5tb3ZlRnVuYykgcmV0dXJuIGRkLm1vdmVGdW5jKGRfZXYpOwoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIERST1AoZF9ldikKewoJaWYoZGQub2JqKQoJewoJCWlmKGRkLm9iai5pc19kcmFnZ2VkKQoJCXsKCQkJaWYoIWRkLm9iai5pc19pbWFnZSkgZGQuZ2V0V0goZGQub2JqKTsKCQl9CgkJZWxzZSBpZihkZC5uNCkKCQl7CgkJCWlmKGRkLm9iai5pc19pbWFnZSkKCQkJewoJCQkJZGQubjRSZWN0VmlzKDApOwoJCQkJZGQub2JqLnJlc2l6ZVRvKGRkLm9iai53LCBkZC5vYmouaCk7CgkJCX0KCQl9CgkJaWYoIWRkLm40IHx8ICFkZC5vYmouaXNfaW1hZ2UpIGRkLnJlY2FsYygpOwoJCWRkLnNldE1vdkhkbChkZC5tb3ZlRnVuYyk7CgkJZGQuc2V0VXBIZGwoZGQudXBGdW5jKTsKCQlpZihkZC5kYikgZGQuZGIub25zZWxlY3RzdGFydCA9IG51bGw7CgkJZGQub2JqLl9zZXRPcGFSZWwoMS4wKTsKCQlkZC5vYmouX3NldENycyhkZC5vYmouY3Vyc29yKTsKCQlkZC5lbWJlZFZpcygndmlzaWJsZScpOwoJCWRkLm9iai5fcmVzZXRaKCk7CgkJZGQuZSA9IG5ldyBkZC5ldnQoZF9ldik7CgkJaWYod2luZG93Lm15X0Ryb3BGdW5jKSBteV9Ecm9wRnVuYygpOwoJCWlmKGRkLm9iai5kcm9wRnVuYykgZGQub2JqLmRyb3BGdW5jKCk7CgkJZGQubXNtb3ZlZCA9IGRkLm9iai5pc19kcmFnZ2VkID0gZGQub2JqLmlzX3Jlc2l6ZWQgPSBkZC53aHJhdGlvID0gMDsKCQlkZC5vYmogPSBudWxsOwoJfQoJZGQuc2V0RHduSGRsKFBJQ0spOwp9CmZ1bmN0aW9uIFNFVF9ESFRNTCgpCnsKCXZhciBkX2EgPSBhcmd1bWVudHMsIGRfYWksIGRfaHRtID0gJycsIGRfbywgZF9pID0gZF9hLmxlbmd0aDsKCXdoaWxlKGRfaSkKCXsKCQlpZighKGRfYWkgPSBkX2FbLS1kX2ldKS5pbmRleE9mKCdjOicpKSBkZC5jdXJzb3IgPSBkX2FpLnN1YnN0cmluZygyKTsKCQllbHNlIGlmKGRfYWkgPT0gTk9fQUxUKSBkZC5ub2FsdCA9IDE7CgkJZWxzZSBpZihkX2FpID09IFNDUk9MTCkgZGQuc2Nyb2xsID0gMTsKCQllbHNlIGlmKGRfYWkgPT0gUkVTRVRfWikgZGQucmVfeiA9IDE7CgkJZWxzZSBpZihkX2FpID09IFJFU0laQUJMRSkgZGQucmVzaXphYmxlID0gMTsKCQllbHNlIGlmKGRfYWkgPT0gU0NBTEFCTEUpIGRkLnNjYWxhYmxlID0gMTsKCQllbHNlIGlmKGRfYWkgPT0gVFJBTlNQQVJFTlQpIGRkLmRpYXBoYW4gPSAxOwoJCWVsc2UKCQl7CgkJCWRfbyA9IG5ldyBERE9iaihkX2FpKTsKCQkJZGQuYWRkRWx0KGRfbyk7CgkJCWRfaHRtICs9IGRfby50X2h0bSB8fCAnJzsKCQkJaWYoZF9vLm9pbWcgJiYgZF9vLmNweV9uKQoJCQl7CgkJCQlmb3IodmFyIGRfbCA9IGRfby5jcHlfbiwgZF9qID0gMDsgZF9qIDwgZF9sOykKCQkJCXsKCQkJCQl2YXIgZF9wID0gbmV3IERET2JqKGRfby5uYW1lK2Rfby5jbWQsICsrZF9qKTsKCQkJCQlkZC5hZGRFbHQoZF9wLCBkX28pOwoJCQkJCWRfcC5kZWZ6ID0gZF9vLmRlZnorZF9qOwoJCQkJCWRfcC5vcmlnaW5hbCA9IGRfbzsKCQkJCQlkX2h0bSArPSBkX3AudF9odG07CgkJCQl9CgkJCX0KCQl9Cgl9CglpZiAoZGQubjQgfHwgZGQubjYgfHwgZGQuaWUgfHwgZGQub3AgfHwgZGQudzNjKSBkb2N1bWVudC53cml0ZSgKCQkoZGQubjQ/ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsiPjxcL2Rpdj5cbicKCQk6IChkZC5vcCAmJiAhZGQub3A2KT8gJzxkaXYgaWQ9Ik9wQmxVciIgc3R5bGU9InBvc2l0aW9uOmFic29sdXRlO3Zpc2liaWxpdHk6aGlkZGVuO3dpZHRoOjBweDtoZWlnaHQ6MHB4OyI+PGZvcm0+PGlucHV0IHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDowcHg7aGVpZ2h0OjBweDsiPjxcL2Zvcm0+PFwvZGl2PicKCQk6ICcnKSArIGRfaHRtCgkpOwoJZGQueiA9IDB4MzM7Cglmb3IoZF9pID0gZGQuZWxlbWVudHMubGVuZ3RoOyBkX2k7KQoJewoJCWRkLmFkZFByb3BzKGRfbyA9IGRkLmVsZW1lbnRzWy0tZF9pXSk7CgkJaWYoZF9vLmlzX2ltYWdlICYmICFkX28ub3JpZ2luYWwgJiYgIWRfby5jbG9uZSkKCQkJZGQubjQ/IGRfby5vaW1nLnNyYyA9IHNwYWNlciA6IGRfby5vaW1nLnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKCX0KCWRkLm1rV3pEb20oKTsKCWlmKHdpbmRvdy5vbmxvYWQpIGRkLmxvYWRGdW5jID0gd2luZG93Lm9ubG9hZDsKCWlmKHdpbmRvdy5vbnVubG9hZCkgZGQudWxvYWRGdW5jID0gd2luZG93Lm9udW5sb2FkOwoJd2luZG93Lm9ubG9hZCA9IGRkLmluaXR6OwoJd2luZG93Lm9udW5sb2FkID0gZGQuZmlubHo7CglkZC5zZXREd25IZGwoUElDSyk7Cn0KZnVuY3Rpb24gQUREX0RIVE1MKCkgLy8gbGF5ZXJzIG9ubHkhCnsKCXZhciBkX2EgPSBhcmd1bWVudHMsIGRfbywgZF9pID0gZF9hLmxlbmd0aDsgd2hpbGUoZF9pKQoJewoJCWRfbyA9IG5ldyBERE9iaihkX2FbLS1kX2ldKTsKCQlkZC5hZGRFbHQoZF9vKTsKCQlkZC5hZGRQcm9wcyhkX28pOwoJfQoJZGQubWtXekRvbSgpOwp9CgoKCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gSWYgbm90IG5lZWRlZCwgYWxsIGNvZGUgYmVsb3cgdGhpcyBsaW5lIG1heSBiZSByZW1vdmVkCgoKLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKZGQuZCA9IGRvY3VtZW50OwkJCS8vIDwgdi4gMi43Mgp2YXIgUkVTRVRfWklOREVYID0gUkVTRVRfWjsgLy8gPCAzLjQ0CnZhciBLRVlET1dOX1JFU0laRSA9IFJFU0laQUJMRTsgLy8gPCA0LjQzCnZhciBDVVJTT1JfUE9JTlRFUiA9IENVUlNPUl9IQU5EOyAvLyA8IDQuNDQKdmFyIE5PX1NDUk9MTCA9ICcnOwkJIC8vIDwgdi4gNC40OQoKCgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIEZVTkNUSU9OUyBGT1IgRVhURU5ERUQgU0NSSVBUSU5HCi8vIFVzZSB0aGVzZSBmb3IgeW91ciBvd24gZXh0ZW5zaW9ucywKLy8gb3IgdG8gY2FsbCBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUKCgoKLyogbXlfUGlja0Z1bmMgSVMgQVVUT01BVElDQUxMWSBDQUxMRUQgV0hFTiBBTiBJVEVNIFNUQVJUUyBUTyBCRSBEUkFHR0VELgpUaGUgZm9sbG93aW5nIG9iamVjdHMvcHJvcGVydGllcyBhcmUgYWNjZXNzaWJsZSBmcm9tIGhlcmU6CgotIGRkLmU6IGN1cnJlbnQgbW91c2UgZXZlbnQKLSBkZC5lLnByb3BlcnR5OiBhY2Nlc3MgdG8gYSBwcm9wZXJ0eSBvZiB0aGUgY3VycmVudCBtb3VzZSBldmVudC4KICBNb3N0bHkgcmVxdWVzdGVkIHByb3BlcnRpZXM6CiAgLSBkZC5lLng6IGRvY3VtZW50LXJlbGF0ZWQgeCBjby1vcmRpbmF0ZQogIC0gZGQuZS55OiBkb2N1bWVudC1yZWxhdGVkIHkgY28tb3JkCiAgLSBkZC5lLnNyYzogdGFyZ2V0IG9mIG1vdXNlIGV2ZW50IChub3QgaWRlbnRpY2FsIHdpdGggdGhlIGRyYWcgZHJvcCBvYmplY3QgaXRzZWxmKS4KICAtIGRkLmUuYnV0dG9uOiBjdXJyZW50bHkgcHJlc3NlZCBtb3VzZSBidXR0b24uIExlZnQgYnV0dG9uOiBkZC5lLmJ1dHRvbiA8PSAxCgotIGRkLm9iajogcmVmZXJlbmNlIHRvIGN1cnJlbnRseSBkcmFnZ2VkIGl0ZW0uCi0gZGQub2JqLnByb3BlcnR5OiBhY2Nlc3MgdG8gYW55IHByb3BlcnR5IG9mIHRoYXQgaXRlbS4KLSBkZC5vYmoubWV0aG9kKCk6IGZvciBleGFtcGxlIGRkLm9iai5yZXNpemVUbygpIG9yIGRkLm9iai5zd2FwSW1hZ2UoKSAuCiAgTW9zdGx5IHJlcXVlc3RlZCBwcm9wZXJ0aWVzOgoJLSBkZC5vYmoubmFtZTogaW1hZ2UgbmFtZSBvciBsYXllciBJRCBwYXNzZWQgdG8gU0VUX0RIVE1MKCk7CgktIGRkLm9iai54IGFuZCBkZC5vYmoueTogY28tb3JkaW5hdGVzOwoJLSBkZC5vYmoudyBhbmQgZGQub2JqLmg6IHNpemU7CgktIGRkLm9iai5pc19kcmFnZ2VkOiAxIHdoaWxlIGl0ZW0gaXMgZHJhZ2dlZCwgZWxzZSAwOwoJLSBkZC5vYmouaXNfcmVzaXplZDogMSB3aGlsZSBpdGVtIGlzIHJlc2l6ZWQsIGkuZS4gaWYgPGN0cmw+IG9yIDxzaGlmdD4gaXMgcHJlc3NlZCwgZWxzZSAwCgpGb3IgbW9yZSBwcm9wZXJ0aWVzIGFuZCBkZXRhaWxzLCB2aXNpdCB0aGUgQVBJIGRvY3VtZW50YXRpb24KYXQgaHR0cDovL3d3dy53YWx0ZXJ6b3JuLmNvbS9kcmFnZHJvcC9hcGlfZS5odG0gKGVuZ2xpc2gpIG9yCmh0dHA6Ly93d3cud2FsdGVyem9ybi5kZS9kcmFnZHJvcC9hcGkuaHRtIChnZXJtYW4pCSovCmZ1bmN0aW9uIG15X1BpY2tGdW5jKCkKewp9CgoKCgovKiBteV9EcmFnRnVuYyBJUyBDQUxMRUQgV0hJTEUgQU4gSVRFTSBJUyBEUkFHR0VEClNlZSB0aGUgZGVzY3JpcHRpb24gb2YgbXlfUGlja0Z1bmMgYWJvdmUgZm9yIHdoYXQncyBhY2Nlc3NpYmxlIGZyb20gaGVyZS4gKi8KZnVuY3Rpb24gbXlfRHJhZ0Z1bmMoKQp7CgkvL3dpbmRvdy5zdGF0dXMgPSAnZGQuZWxlbWVudHMuJyArIGRkLm9iai5uYW1lICsgJy54ICA9ICcgKyBkZC5vYmoueCArICcJIGRkLmVsZW1lbnRzLicgKyBkZC5vYmoubmFtZSArICcueSA9ICcgKyBkZC5vYmoueTsKfQoKCgoKLyogbXlfUmVzaXplRnVuYyBJUyBDQUxMRUQgV0hJTEUgQU4gSVRFTSBJUyBSRVNJWkVEClNlZSB0aGUgZGVzY3JpcHRpb24gb2YgbXlfUGlja0Z1bmMgYWJvdmUgZm9yIHdoYXQncyBhY2Nlc3NpYmxlIGZyb20gaGVyZS4gKi8KZnVuY3Rpb24gbXlfUmVzaXplRnVuYygpCnsKCS8vd2luZG93LnN0YXR1cyA9ICdkZC5lbGVtZW50cy4nICsgZGQub2JqLm5hbWUgKyAnLncgID0gJyArIGRkLm9iai53ICsgJwkgZGQuZWxlbWVudHMuJyArIGRkLm9iai5uYW1lICsgJy5oID0gJyArIGRkLm9iai5oOwp9CgoKCgovKiBUSElTIE9ORSBJUyBDQUxMRUQgT05DRSBBTiBJVEVNIElTIERST1BQRUQKU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBteV9QaWNrRnVuYyBmb3Igd2hhdCdzIGFjY2Vzc2libGUgZnJvbSBoZXJlLgpIZXJlIG1heSBiZSBpbnZlc3RpZ2F0ZWQsIGZvciBleGFtcGxlLCB3aGF0J3MgdGhlIG5hbWUgKGRkLm9iai5uYW1lKQpvZiB0aGUgZHJvcHBlZCBpdGVtLCBhbmQgd2hlcmUgKGRkLm9iai54LCBkZC5vYmoueSkgaXQgaGFzIGJlZW4gZHJvcHBlZC4uLiAqLwpmdW5jdGlvbiBteV9Ecm9wRnVuYygpCnsKfQo='>
</script id="script_b64_wz_dragdrop_end" >
<script id="fb_extras_jquery_min_17_js" src='data:/text/plain;base64,LyohIGpRdWVyeSB2MS43IGpxdWVyeS5jb20gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KKGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gY0EoYSl7cmV0dXJuIGYuaXNXaW5kb3coYSk/YTphLm5vZGVUeXBlPT09OT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1mdW5jdGlvbiBjeChhKXtpZighY21bYV0pe3ZhciBiPWMuYm9keSxkPWYoIjwiK2ErIj4iKS5hcHBlbmRUbyhiKSxlPWQuY3NzKCJkaXNwbGF5Iik7ZC5yZW1vdmUoKTtpZihlPT09Im5vbmUifHxlPT09IiIpe2NufHwoY249Yy5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKSxjbi5mcmFtZUJvcmRlcj1jbi53aWR0aD1jbi5oZWlnaHQ9MCksYi5hcHBlbmRDaGlsZChjbik7aWYoIWNvfHwhY24uY3JlYXRlRWxlbWVudCljbz0oY24uY29udGVudFdpbmRvd3x8Y24uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxjby53cml0ZSgoYy5jb21wYXRNb2RlPT09IkNTUzFDb21wYXQiPyI8IWRvY3R5cGUgaHRtbD4iOiIiKSsiPGh0bWw+PGJvZHk+IiksY28uY2xvc2UoKTtkPWNvLmNyZWF0ZUVsZW1lbnQoYSksY28uYm9keS5hcHBlbmRDaGlsZChkKSxlPWYuY3NzKGQsImRpc3BsYXkiKSxiLnJlbW92ZUNoaWxkKGNuKX1jbVthXT1lfXJldHVybiBjbVthXX1mdW5jdGlvbiBjdyhhLGIpe3ZhciBjPXt9O2YuZWFjaChjcy5jb25jYXQuYXBwbHkoW10sY3Muc2xpY2UoMCxiKSksZnVuY3Rpb24oKXtjW3RoaXNdPWF9KTtyZXR1cm4gY31mdW5jdGlvbiBjdigpe2N0PWJ9ZnVuY3Rpb24gY3UoKXtzZXRUaW1lb3V0KGN2LDApO3JldHVybiBjdD1mLm5vdygpfWZ1bmN0aW9uIGNsKCl7dHJ5e3JldHVybiBuZXcgYS5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfWNhdGNoKGIpe319ZnVuY3Rpb24gY2soKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gY2UoYSxjKXthLmRhdGFGaWx0ZXImJihjPWEuZGF0YUZpbHRlcihjLGEuZGF0YVR5cGUpKTt2YXIgZD1hLmRhdGFUeXBlcyxlPXt9LGcsaCxpPWQubGVuZ3RoLGosaz1kWzBdLGwsbSxuLG8scDtmb3IoZz0xO2c8aTtnKyspe2lmKGc9PT0xKWZvcihoIGluIGEuY29udmVydGVycyl0eXBlb2YgaD09InN0cmluZyImJihlW2gudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2hdKTtsPWssaz1kW2ddO2lmKGs9PT0iKiIpaz1sO2Vsc2UgaWYobCE9PSIqIiYmbCE9PWspe209bCsiICIrayxuPWVbbV18fGVbIiogIitrXTtpZighbil7cD1iO2ZvcihvIGluIGUpe2o9by5zcGxpdCgiICIpO2lmKGpbMF09PT1sfHxqWzBdPT09IioiKXtwPWVbalsxXSsiICIra107aWYocCl7bz1lW29dLG89PT0hMD9uPXA6cD09PSEwJiYobj1vKTticmVha319fX0hbiYmIXAmJmYuZXJyb3IoIk5vIGNvbnZlcnNpb24gZnJvbSAiK20ucmVwbGFjZSgiICIsIiB0byAiKSksbiE9PSEwJiYoYz1uP24oYyk6cChvKGMpKSl9fXJldHVybiBjfWZ1bmN0aW9uIGNkKGEsYyxkKXt2YXIgZT1hLmNvbnRlbnRzLGY9YS5kYXRhVHlwZXMsZz1hLnJlc3BvbnNlRmllbGRzLGgsaSxqLGs7Zm9yKGkgaW4gZylpIGluIGQmJihjW2dbaV1dPWRbaV0pO3doaWxlKGZbMF09PT0iKiIpZi5zaGlmdCgpLGg9PT1iJiYoaD1hLm1pbWVUeXBlfHxjLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSk7aWYoaClmb3IoaSBpbiBlKWlmKGVbaV0mJmVbaV0udGVzdChoKSl7Zi51bnNoaWZ0KGkpO2JyZWFrfWlmKGZbMF1pbiBkKWo9ZlswXTtlbHNle2ZvcihpIGluIGQpe2lmKCFmWzBdfHxhLmNvbnZlcnRlcnNbaSsiICIrZlswXV0pe2o9aTticmVha31rfHwoaz1pKX1qPWp8fGt9aWYoail7aiE9PWZbMF0mJmYudW5zaGlmdChqKTtyZXR1cm4gZFtqXX19ZnVuY3Rpb24gY2MoYSxiLGMsZCl7aWYoZi5pc0FycmF5KGIpKWYuZWFjaChiLGZ1bmN0aW9uKGIsZSl7Y3x8YkcudGVzdChhKT9kKGEsZSk6Y2MoYSsiWyIrKHR5cGVvZiBlPT0ib2JqZWN0Inx8Zi5pc0FycmF5KGUpP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKCFjJiZiIT1udWxsJiZ0eXBlb2YgYj09Im9iamVjdCIpZm9yKHZhciBlIGluIGIpY2MoYSsiWyIrZSsiXSIsYltlXSxjLGQpO2Vsc2UgZChhLGIpfWZ1bmN0aW9uIGNiKGEsYyl7dmFyIGQsZSxnPWYuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IoZCBpbiBjKWNbZF0hPT1iJiYoKGdbZF0/YTplfHwoZT17fSkpW2RdPWNbZF0pO2UmJmYuZXh0ZW5kKCEwLGEsZSl9ZnVuY3Rpb24gY2EoYSxjLGQsZSxmLGcpe2Y9Znx8Yy5kYXRhVHlwZXNbMF0sZz1nfHx7fSxnW2ZdPSEwO3ZhciBoPWFbZl0saT0wLGo9aD9oLmxlbmd0aDowLGs9YT09PWJWLGw7Zm9yKDtpPGomJihrfHwhbCk7aSsrKWw9aFtpXShjLGQsZSksdHlwZW9mIGw9PSJzdHJpbmciJiYoIWt8fGdbbF0/bD1iOihjLmRhdGFUeXBlcy51bnNoaWZ0KGwpLGw9Y2EoYSxjLGQsZSxsLGcpKSk7KGt8fCFsKSYmIWdbIioiXSYmKGw9Y2EoYSxjLGQsZSwiKiIsZykpO3JldHVybiBsfWZ1bmN0aW9uIGJfKGEpe3JldHVybiBmdW5jdGlvbihiLGMpe3R5cGVvZiBiIT0ic3RyaW5nIiYmKGM9YixiPSIqIik7aWYoZi5pc0Z1bmN0aW9uKGMpKXt2YXIgZD1iLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlIpLGU9MCxnPWQubGVuZ3RoLGgsaSxqO2Zvcig7ZTxnO2UrKyloPWRbZV0saj0vXlwrLy50ZXN0KGgpLGomJihoPWguc3Vic3RyKDEpfHwiKiIpLGk9YVtoXT1hW2hdfHxbXSxpW2o/InVuc2hpZnQiOiJwdXNoIl0oYyl9fX1mdW5jdGlvbiBiRShhLGIsYyl7dmFyIGQ9Yj09PSJ3aWR0aCI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxlPWI9PT0id2lkdGgiP2J6OmJBO2lmKGQ+MCl7YyE9PSJib3JkZXIiJiZmLmVhY2goZSxmdW5jdGlvbigpe2N8fChkLT1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK3RoaXMpKXx8MCksYz09PSJtYXJnaW4iP2QrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK3RoaXMpKXx8MDpkLT1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrdGhpcysiV2lkdGgiKSl8fDB9KTtyZXR1cm4gZCsicHgifWQ9YkIoYSxiLGIpO2lmKGQ8MHx8ZD09bnVsbClkPWEuc3R5bGVbYl18fDA7ZD1wYXJzZUZsb2F0KGQpfHwwLGMmJmYuZWFjaChlLGZ1bmN0aW9uKCl7ZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJwYWRkaW5nIit0aGlzKSl8fDAsYyE9PSJwYWRkaW5nIiYmKGQrPXBhcnNlRmxvYXQoZi5jc3MoYSwiYm9yZGVyIit0aGlzKyJXaWR0aCIpKXx8MCksYz09PSJtYXJnaW4iJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLGMrdGhpcykpfHwwKX0pO3JldHVybiBkKyJweCJ9ZnVuY3Rpb24gYnIoYSxiKXtiLnNyYz9mLmFqYXgoe3VybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmYuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYmksIi8qJDAqLyIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBicShhKXt2YXIgYj0oYS5ub2RlTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCk7Yj09PSJpbnB1dCI/YnAoYSk6YiE9PSJzY3JpcHQiJiZ0eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCImJmYuZ3JlcChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpLGJwKX1mdW5jdGlvbiBicChhKXtpZihhLnR5cGU9PT0iY2hlY2tib3gifHxhLnR5cGU9PT0icmFkaW8iKWEuZGVmYXVsdENoZWNrZWQ9YS5jaGVja2VkfWZ1bmN0aW9uIGJvKGEpe3JldHVybiB0eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCI/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOnR5cGVvZiBhLnF1ZXJ5U2VsZWN0b3JBbGwhPSJ1bmRlZmluZWQiP2EucXVlcnlTZWxlY3RvckFsbCgiKiIpOltdfWZ1bmN0aW9uIGJuKGEsYil7dmFyIGM7aWYoYi5ub2RlVHlwZT09PTEpe2IuY2xlYXJBdHRyaWJ1dGVzJiZiLmNsZWFyQXR0cmlidXRlcygpLGIubWVyZ2VBdHRyaWJ1dGVzJiZiLm1lcmdlQXR0cmlidXRlcyhhKSxjPWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtpZihjPT09Im9iamVjdCIpYi5vdXRlckhUTUw9YS5vdXRlckhUTUw7ZWxzZSBpZihjIT09ImlucHV0Inx8YS50eXBlIT09ImNoZWNrYm94IiYmYS50eXBlIT09InJhZGlvIil7aWYoYz09PSJvcHRpb24iKWIuc2VsZWN0ZWQ9YS5kZWZhdWx0U2VsZWN0ZWQ7ZWxzZSBpZihjPT09ImlucHV0Inx8Yz09PSJ0ZXh0YXJlYSIpYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWV9ZWxzZSBhLmNoZWNrZWQmJihiLmRlZmF1bHRDaGVja2VkPWIuY2hlY2tlZD1hLmNoZWNrZWQpLGIudmFsdWUhPT1hLnZhbHVlJiYoYi52YWx1ZT1hLnZhbHVlKTtiLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pfX1mdW5jdGlvbiBibShhLGIpe2lmKGIubm9kZVR5cGU9PT0xJiYhIWYuaGFzRGF0YShhKSl7dmFyIGMsZCxlLGc9Zi5fZGF0YShhKSxoPWYuX2RhdGEoYixnKSxpPWcuZXZlbnRzO2lmKGkpe2RlbGV0ZSBoLmhhbmRsZSxoLmV2ZW50cz17fTtmb3IoYyBpbiBpKWZvcihkPTAsZT1pW2NdLmxlbmd0aDtkPGU7ZCsrKWYuZXZlbnQuYWRkKGIsYysoaVtjXVtkXS5uYW1lc3BhY2U/Ii4iOiIiKStpW2NdW2RdLm5hbWVzcGFjZSxpW2NdW2RdLGlbY11bZF0uZGF0YSl9aC5kYXRhJiYoaC5kYXRhPWYuZXh0ZW5kKHt9LGguZGF0YSkpfX1mdW5jdGlvbiBibChhLGIpe3JldHVybiBmLm5vZGVOYW1lKGEsInRhYmxlIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiBYKGEpe3ZhciBiPVkuc3BsaXQoIiAiKSxjPWEuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2lmKGMuY3JlYXRlRWxlbWVudCl3aGlsZShiLmxlbmd0aCljLmNyZWF0ZUVsZW1lbnQoYi5wb3AoKSk7cmV0dXJuIGN9ZnVuY3Rpb24gVyhhLGIsYyl7Yj1ifHwwO2lmKGYuaXNGdW5jdGlvbihiKSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXt2YXIgZT0hIWIuY2FsbChhLGQsYSk7cmV0dXJuIGU9PT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gYT09PWI9PT1jfSk7aWYodHlwZW9mIGI9PSJzdHJpbmciKXt2YXIgZD1mLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PTF9KTtpZihSLnRlc3QoYikpcmV0dXJuIGYuZmlsdGVyKGIsZCwhYyk7Yj1mLmZpbHRlcihiLGQpfXJldHVybiBmLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiBmLmluQXJyYXkoYSxiKT49MD09PWN9KX1mdW5jdGlvbiBWKGEpe3JldHVybiFhfHwhYS5wYXJlbnROb2RlfHxhLnBhcmVudE5vZGUubm9kZVR5cGU9PT0xMX1mdW5jdGlvbiBOKCl7cmV0dXJuITB9ZnVuY3Rpb24gTSgpe3JldHVybiExfWZ1bmN0aW9uIG4oYSxiLGMpe3ZhciBkPWIrImRlZmVyIixlPWIrInF1ZXVlIixnPWIrIm1hcmsiLGg9Zi5fZGF0YShhLGQpO2gmJihjPT09InF1ZXVlInx8IWYuX2RhdGEoYSxlKSkmJihjPT09Im1hcmsifHwhZi5fZGF0YShhLGcpKSYmc2V0VGltZW91dChmdW5jdGlvbigpeyFmLl9kYXRhKGEsZSkmJiFmLl9kYXRhKGEsZykmJihmLnJlbW92ZURhdGEoYSxkLCEwKSxoLmZpcmUoKSl9LDApfWZ1bmN0aW9uIG0oYSl7Zm9yKHZhciBiIGluIGEpe2lmKGI9PT0iZGF0YSImJmYuaXNFbXB0eU9iamVjdChhW2JdKSljb250aW51ZTtpZihiIT09InRvSlNPTiIpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gbChhLGMsZCl7aWYoZD09PWImJmEubm9kZVR5cGU9PT0xKXt2YXIgZT0iZGF0YS0iK2MucmVwbGFjZShrLCItJDEiKS50b0xvd2VyQ2FzZSgpO2Q9YS5nZXRBdHRyaWJ1dGUoZSk7aWYodHlwZW9mIGQ9PSJzdHJpbmciKXt0cnl7ZD1kPT09InRydWUiPyEwOmQ9PT0iZmFsc2UiPyExOmQ9PT0ibnVsbCI/bnVsbDpmLmlzTnVtZXJpYyhkKT9wYXJzZUZsb2F0KGQpOmoudGVzdChkKT9mLnBhcnNlSlNPTihkKTpkfWNhdGNoKGcpe31mLmRhdGEoYSxjLGQpfWVsc2UgZD1ifXJldHVybiBkfWZ1bmN0aW9uIGgoYSl7dmFyIGI9Z1thXT17fSxjLGQ7YT1hLnNwbGl0KC9ccysvKTtmb3IoYz0wLGQ9YS5sZW5ndGg7YzxkO2MrKyliW2FbY11dPSEwO3JldHVybiBifXZhciBjPWEuZG9jdW1lbnQsZD1hLm5hdmlnYXRvcixlPWEubG9jYXRpb24sZj1mdW5jdGlvbigpe2Z1bmN0aW9uIEsoKXtpZighZS5pc1JlYWR5KXt0cnl7Yy5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKX1jYXRjaChhKXtzZXRUaW1lb3V0KEssMSk7cmV0dXJufWUucmVhZHkoKX19dmFyIGU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IGUuZm4uaW5pdChhLGIsaCl9LGY9YS5qUXVlcnksZz1hLiQsaCxpPS9eKD86W14jPF0qKDxbXHdcV10rPilbXj5dKiR8IyhbXHdcLV0qKSQpLyxqPS9cUy8saz0vXlxzKy8sbD0vXHMrJC8sbT0vXGQvLG49L148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLyxvPS9eW1xdLDp7fVxzXSokLyxwPS9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2cscT0vIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2cscj0vKD86Xnw6fCwpKD86XHMqXFspKy9nLHM9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8sdD0vKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sdT0vKG1zaWUpIChbXHcuXSspLyx2PS8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sdz0vLShbYS16XXxbMC05XSkvaWcseD0vXi1tcy0vLHk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYisiIikudG9VcHBlckNhc2UoKX0sej1kLnVzZXJBZ2VudCxBLEIsQyxEPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEY9QXJyYXkucHJvdG90eXBlLnB1c2gsRz1BcnJheS5wcm90b3R5cGUuc2xpY2UsSD1TdHJpbmcucHJvdG90eXBlLnRyaW0sST1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixKPXt9O2UuZm49ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUsaW5pdDpmdW5jdGlvbihhLGQsZil7dmFyIGcsaCxqLGs7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFkJiZjLmJvZHkpe3RoaXMuY29udGV4dD1jLHRoaXNbMF09Yy5ib2R5LHRoaXMuc2VsZWN0b3I9YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ic3RyaW5nIil7YS5jaGFyQXQoMCkhPT0iPCJ8fGEuY2hhckF0KGEubGVuZ3RoLTEpIT09Ij4ifHxhLmxlbmd0aDwzP2c9aS5leGVjKGEpOmc9W251bGwsYSxudWxsXTtpZihnJiYoZ1sxXXx8IWQpKXtpZihnWzFdKXtkPWQgaW5zdGFuY2VvZiBlP2RbMF06ZCxrPWQ/ZC5vd25lckRvY3VtZW50fHxkOmMsaj1uLmV4ZWMoYSksaj9lLmlzUGxhaW5PYmplY3QoZCk/KGE9W2MuY3JlYXRlRWxlbWVudChqWzFdKV0sZS5mbi5hdHRyLmNhbGwoYSxkLCEwKSk6YT1bay5jcmVhdGVFbGVtZW50KGpbMV0pXTooaj1lLmJ1aWxkRnJhZ21lbnQoW2dbMV1dLFtrXSksYT0oai5jYWNoZWFibGU/ZS5jbG9uZShqLmZyYWdtZW50KTpqLmZyYWdtZW50KS5jaGlsZE5vZGVzKTtyZXR1cm4gZS5tZXJnZSh0aGlzLGEpfWg9Yy5nZXRFbGVtZW50QnlJZChnWzJdKTtpZihoJiZoLnBhcmVudE5vZGUpe2lmKGguaWQhPT1nWzJdKXJldHVybiBmLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWh9dGhpcy5jb250ZXh0PWMsdGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfXJldHVybiFkfHxkLmpxdWVyeT8oZHx8ZikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSl9aWYoZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBmLnJlYWR5KGEpO2Euc2VsZWN0b3IhPT1iJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpO3JldHVybiBlLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNyIsbGVuZ3RoOjAsc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0aH0sdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBHLmNhbGwodGhpcywwKX0sZ2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP3RoaXMudG9BcnJheSgpOmE8MD90aGlzW3RoaXMubGVuZ3RoK2FdOnRoaXNbYV19LHB1c2hTdGFjazpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5jb25zdHJ1Y3RvcigpO2UuaXNBcnJheShhKT9GLmFwcGx5KGQsYSk6ZS5tZXJnZShkLGEpLGQucHJldk9iamVjdD10aGlzLGQuY29udGV4dD10aGlzLmNvbnRleHQsYj09PSJmaW5kIj9kLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrKHRoaXMuc2VsZWN0b3I/IiAiOiIiKStjOmImJihkLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3IrIi4iK2IrIigiK2MrIikiKTtyZXR1cm4gZH0sZWFjaDpmdW5jdGlvbihhLGIpe3JldHVybiBlLmVhY2godGhpcyxhLGIpfSxyZWFkeTpmdW5jdGlvbihhKXtlLmJpbmRSZWFkeSgpLEIuYWRkKGEpO3JldHVybiB0aGlzfSxlcTpmdW5jdGlvbihhKXtyZXR1cm4gYT09PS0xP3RoaXMuc2xpY2UoYSk6dGhpcy5zbGljZShhLCthKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhHLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLEcuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOkYsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLmV4dGVuZD1lLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxmLGcsaCxpPWFyZ3VtZW50c1swXXx8e30saj0xLGs9YXJndW1lbnRzLmxlbmd0aCxsPSExO3R5cGVvZiBpPT0iYm9vbGVhbiImJihsPWksaT1hcmd1bWVudHNbMV18fHt9LGo9MiksdHlwZW9mIGkhPSJvYmplY3QiJiYhZS5pc0Z1bmN0aW9uKGkpJiYoaT17fSksaz09PWomJihpPXRoaXMsLS1qKTtmb3IoO2o8aztqKyspaWYoKGE9YXJndW1lbnRzW2pdKSE9bnVsbClmb3IoYyBpbiBhKXtkPWlbY10sZj1hW2NdO2lmKGk9PT1mKWNvbnRpbnVlO2wmJmYmJihlLmlzUGxhaW5PYmplY3QoZil8fChnPWUuaXNBcnJheShmKSkpPyhnPyhnPSExLGg9ZCYmZS5pc0FycmF5KGQpP2Q6W10pOmg9ZCYmZS5pc1BsYWluT2JqZWN0KGQpP2Q6e30saVtjXT1lLmV4dGVuZChsLGgsZikpOmYhPT1iJiYoaVtjXT1mKX1yZXR1cm4gaX0sZS5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYil7YS4kPT09ZSYmKGEuJD1nKSxiJiZhLmpRdWVyeT09PWUmJihhLmpRdWVyeT1mKTtyZXR1cm4gZX0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9lLnJlYWR5V2FpdCsrOmUucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITAmJiEtLWUucmVhZHlXYWl0fHxhIT09ITAmJiFlLmlzUmVhZHkpe2lmKCFjLmJvZHkpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtlLmlzUmVhZHk9ITA7aWYoYSE9PSEwJiYtLWUucmVhZHlXYWl0PjApcmV0dXJuO0IuZmlyZVdpdGgoYyxbZV0pLGUuZm4udHJpZ2dlciYmZShjKS50cmlnZ2VyKCJyZWFkeSIpLnVuYmluZCgicmVhZHkiKX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFCKXtCPWUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixDLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixDKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGUucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGQpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmSygpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0eXBlb2YgYT09Im9iamVjdCImJiJzZXRJbnRlcnZhbCJpbiBhfSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPW51bGwmJm0udGVzdChhKSYmIWlzTmFOKGEpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsP1N0cmluZyhhKTpKW0QuY2FsbChhKV18fCJvYmplY3QifSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe2lmKCFhfHxlLnR5cGUoYSkhPT0ib2JqZWN0Inx8YS5ub2RlVHlwZXx8ZS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIUUuY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhRS5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9dmFyIGQ7Zm9yKGQgaW4gYSk7cmV0dXJuIGQ9PT1ifHxFLmNhbGwoYSxkKX0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXtmb3IodmFyIGIgaW4gYSlyZXR1cm4hMTtyZXR1cm4hMH0sZXJyb3I6ZnVuY3Rpb24oYSl7dGhyb3cgYX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nInx8IWIpcmV0dXJuIG51bGw7Yj1lLnRyaW0oYik7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKTtpZihvLnRlc3QoYi5yZXBsYWNlKHAsIkAiKS5yZXBsYWNlKHEsIl0iKS5yZXBsYWNlKHIsIiIpKSlyZXR1cm4obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiKSkoKTtlLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LHBhcnNlWE1MOmZ1bmN0aW9uKGMpe3ZhciBkLGY7dHJ5e2EuRE9NUGFyc2VyPyhmPW5ldyBET01QYXJzZXIsZD1mLnBhcnNlRnJvbVN0cmluZyhjLCJ0ZXh0L3htbCIpKTooZD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGQuYXN5bmM9ImZhbHNlIixkLmxvYWRYTUwoYykpfWNhdGNoKGcpe2Q9Yn0oIWR8fCFkLmRvY3VtZW50RWxlbWVudHx8ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitjKTtyZXR1cm4gZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoeCwibXMtIikucmVwbGFjZSh3LHkpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpIP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkguY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/Ri5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihJKXJldHVybiBJLmNhbGwoYixhLGMpO2Q9Yi5sZW5ndGgsYz1jP2M8MD9NYXRoLm1heCgwLGQrYyk6YzowO2Zvcig7YzxkO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBjfXJldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1HLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEcuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgpe3ZhciBpPWEubGVuZ3RoO2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7Zm9yKHZhciBqIGluIGMpZS5hY2Nlc3MoYSxqLGNbal0sZixnLGQpO3JldHVybiBhfWlmKGQhPT1iKXtmPSFoJiZmJiZlLmlzRnVuY3Rpb24oZCk7Zm9yKHZhciBrPTA7azxpO2srKylnKGFba10sYyxmP2QuY2FsbChhW2tdLGssZyhhW2tdLGMpKTpkLGgpO3JldHVybiBhfXJldHVybiBpP2coYVswXSxjKTpifSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1zLmV4ZWMoYSl8fHQuZXhlYyhhKXx8dS5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ2LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SlsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSxBPWUudWFNYXRjaCh6KSxBLmJyb3dzZXImJihlLmJyb3dzZXJbQS5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj1BLnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIsKgIikmJihrPS9eW1xzXHhBMF0rLyxsPS9bXHNceEEwXSskLyksaD1lKGMpLGMuYWRkRXZlbnRMaXN0ZW5lcj9DPWZ1bmN0aW9uKCl7Yy5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixDLCExKSxlLnJlYWR5KCl9OmMuYXR0YWNoRXZlbnQmJihDPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPT09ImNvbXBsZXRlIiYmKGMuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsQyksZS5yZWFkeSgpKX0pLHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJmRlZmluZS5hbWQmJmRlZmluZS5hbWQualF1ZXJ5JiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4gZX0pO3JldHVybiBlfSgpLGc9e307Zi5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT1hP2dbYV18fGgoYSk6e307dmFyIGM9W10sZD1bXSxlLGksaixrLGwsbT1mdW5jdGlvbihiKXt2YXIgZCxlLGcsaCxpO2ZvcihkPTAsZT1iLmxlbmd0aDtkPGU7ZCsrKWc9YltkXSxoPWYudHlwZShnKSxoPT09ImFycmF5Ij9tKGcpOmg9PT0iZnVuY3Rpb24iJiYoIWEudW5pcXVlfHwhby5oYXMoZykpJiZjLnB1c2goZyl9LG49ZnVuY3Rpb24oYixmKXtmPWZ8fFtdLGU9IWEubWVtb3J5fHxbYixmXSxpPSEwLGw9anx8MCxqPTAsaz1jLmxlbmd0aDtmb3IoO2MmJmw8aztsKyspaWYoY1tsXS5hcHBseShiLGYpPT09ITEmJmEuc3RvcE9uRmFsc2Upe2U9ITA7YnJlYWt9aT0hMSxjJiYoYS5vbmNlP2U9PT0hMD9vLmRpc2FibGUoKTpjPVtdOmQmJmQubGVuZ3RoJiYoZT1kLnNoaWZ0KCksby5maXJlV2l0aChlWzBdLGVbMV0pKSl9LG89e2FkZDpmdW5jdGlvbigpe2lmKGMpe3ZhciBhPWMubGVuZ3RoO20oYXJndW1lbnRzKSxpP2s9Yy5sZW5ndGg6ZSYmZSE9PSEwJiYoaj1hLG4oZVswXSxlWzFdKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe2lmKGMpe3ZhciBiPWFyZ3VtZW50cyxkPTAsZT1iLmxlbmd0aDtmb3IoO2Q8ZTtkKyspZm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspaWYoYltkXT09PWNbZl0pe2kmJmY8PWsmJihrLS0sZjw9bCYmbC0tKSxjLnNwbGljZShmLS0sMSk7aWYoYS51bmlxdWUpYnJlYWt9fXJldHVybiB0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7aWYoYyl7dmFyIGI9MCxkPWMubGVuZ3RoO2Zvcig7YjxkO2IrKylpZihhPT09Y1tiXSlyZXR1cm4hMH1yZXR1cm4hMX0sZW1wdHk6ZnVuY3Rpb24oKXtjPVtdO3JldHVybiB0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7Yz1kPWU9YjtyZXR1cm4gdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hY30sbG9jazpmdW5jdGlvbigpe2Q9YiwoIWV8fGU9PT0hMCkmJm8uZGlzYWJsZSgpO3JldHVybiB0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hZH0sZmlyZVdpdGg6ZnVuY3Rpb24oYixjKXtkJiYoaT9hLm9uY2V8fGQucHVzaChbYixjXSk6KCFhLm9uY2V8fCFlKSYmbihiLGMpKTtyZXR1cm4gdGhpc30sZmlyZTpmdW5jdGlvbigpe28uZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpO3JldHVybiB0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZX19O3JldHVybiBvfTt2YXIgaT1bXS5zbGljZTtmLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksYz1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxkPWYuQ2FsbGJhY2tzKCJtZW1vcnkiKSxlPSJwZW5kaW5nIixnPXtyZXNvbHZlOmIscmVqZWN0OmMsbm90aWZ5OmR9LGg9e2RvbmU6Yi5hZGQsZmFpbDpjLmFkZCxwcm9ncmVzczpkLmFkZCxzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBlfSxpc1Jlc29sdmVkOmIuZmlyZWQsaXNSZWplY3RlZDpjLmZpcmVkLHRoZW46ZnVuY3Rpb24oYSxiLGMpe2kuZG9uZShhKS5mYWlsKGIpLnByb2dyZXNzKGMpO3JldHVybiB0aGlzfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gaS5kb25lLmFwcGx5KGksYXJndW1lbnRzKS5mYWlsLmFwcGx5KGksYXJndW1lbnRzKX0scGlwZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuRGVmZXJyZWQoZnVuY3Rpb24oZCl7Zi5lYWNoKHtkb25lOlthLCJyZXNvbHZlIl0sZmFpbDpbYiwicmVqZWN0Il0scHJvZ3Jlc3M6W2MsIm5vdGlmeSJdfSxmdW5jdGlvbihhLGIpe3ZhciBjPWJbMF0sZT1iWzFdLGc7Zi5pc0Z1bmN0aW9uKGMpP2lbYV0oZnVuY3Rpb24oKXtnPWMuYXBwbHkodGhpcyxhcmd1bWVudHMpLGcmJmYuaXNGdW5jdGlvbihnLnByb21pc2UpP2cucHJvbWlzZSgpLnRoZW4oZC5yZXNvbHZlLGQucmVqZWN0LGQubm90aWZ5KTpkW2UrIldpdGgiXSh0aGlzPT09aT9kOnRoaXMsW2ddKX0pOmlbYV0oZFtlXSl9KX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihhKXtpZihhPT1udWxsKWE9aDtlbHNlIGZvcih2YXIgYiBpbiBoKWFbYl09aFtiXTtyZXR1cm4gYX19LGk9aC5wcm9taXNlKHt9KSxqO2ZvcihqIGluIGcpaVtqXT1nW2pdLmZpcmUsaVtqKyJXaXRoIl09Z1tqXS5maXJlV2l0aDtpLmRvbmUoZnVuY3Rpb24oKXtlPSJyZXNvbHZlZCJ9LGMuZGlzYWJsZSxkLmxvY2spLmZhaWwoZnVuY3Rpb24oKXtlPSJyZWplY3RlZCJ9LGIuZGlzYWJsZSxkLmxvY2spLGEmJmEuY2FsbChpLGkpO3JldHVybiBpfSx3aGVuOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIG0oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe2VbYV09YXJndW1lbnRzLmxlbmd0aD4xP2kuY2FsbChhcmd1bWVudHMsMCk6YixqLm5vdGlmeVdpdGgoayxlKX19ZnVuY3Rpb24gbChhKXtyZXR1cm4gZnVuY3Rpb24oYyl7YlthXT1hcmd1bWVudHMubGVuZ3RoPjE/aS5jYWxsKGFyZ3VtZW50cywwKTpjLC0tZ3x8ai5yZXNvbHZlV2l0aChqLGIpfX12YXIgYj1pLmNhbGwoYXJndW1lbnRzLDApLGM9MCxkPWIubGVuZ3RoLGU9QXJyYXkoZCksZz1kLGg9ZCxqPWQ8PTEmJmEmJmYuaXNGdW5jdGlvbihhLnByb21pc2UpP2E6Zi5EZWZlcnJlZCgpLGs9ai5wcm9taXNlKCk7aWYoZD4xKXtmb3IoO2M8ZDtjKyspYltjXSYmYltjXS5wcm9taXNlJiZmLmlzRnVuY3Rpb24oYltjXS5wcm9taXNlKT9iW2NdLnByb21pc2UoKS50aGVuKGwoYyksai5yZWplY3QsbShjKSk6LS1nO2d8fGoucmVzb2x2ZVdpdGgoaixiKX1lbHNlIGohPT1hJiZqLnJlc29sdmVXaXRoKGosZD9bYV06W10pO3JldHVybiBrfX0pLGYuc3VwcG9ydD1mdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksYj1jLmRvY3VtZW50RWxlbWVudCxkLGUsZyxoLGksaixrLGwsbSxuLG8scCxxLHIscyx0LHU7YS5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxhLmlubmVySFRNTD0iICAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJyBzdHlsZT0ndG9wOjFweDtmbG9hdDpsZWZ0O29wYWNpdHk6LjU1Oyc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz48bmF2PjwvbmF2PiIsZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIWR8fCFkLmxlbmd0aHx8IWUpcmV0dXJue307Zz1jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGg9Zy5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxpPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0saz17bGVhZGluZ1doaXRlc3BhY2U6YS5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChlLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNTUvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsdW5rbm93bkVsZW1zOiEhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgibmF2IikubGVuZ3RoLGNoZWNrT246aS52YWx1ZT09PSJvbiIsb3B0U2VsZWN0ZWQ6aC5zZWxlY3RlZCxnZXRTZXRBdHRyaWJ1dGU6YS5jbGFzc05hbWUhPT0idCIsZW5jdHlwZTohIWMuY3JlYXRlRWxlbWVudCgiZm9ybSIpLmVuY3R5cGUsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwfSxpLmNoZWNrZWQ9ITAsay5ub0Nsb25lQ2hlY2tlZD1pLmNsb25lTm9kZSghMCkuY2hlY2tlZCxnLmRpc2FibGVkPSEwLGsub3B0RGlzYWJsZWQ9IWguZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBhLnRlc3R9Y2F0Y2godil7ay5kZWxldGVFeHBhbmRvPSExfSFhLmFkZEV2ZW50TGlzdGVuZXImJmEuYXR0YWNoRXZlbnQmJmEuZmlyZUV2ZW50JiYoYS5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXtrLm5vQ2xvbmVFdmVudD0hMX0pLGEuY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSksaT1jLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaS52YWx1ZT0idCIsaS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGsucmFkaW9WYWx1ZT1pLnZhbHVlPT09InQiLGkuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLGEuYXBwZW5kQ2hpbGQoaSksbD1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxsLmFwcGVuZENoaWxkKGEubGFzdENoaWxkKSxrLmNoZWNrQ2xvbmU9bC5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYS5pbm5lckhUTUw9IiIsYS5zdHlsZS53aWR0aD1hLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiLG09Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLG89Yy5jcmVhdGVFbGVtZW50KG0/ImRpdiI6ImJvZHkiKSxwPXt2aXNpYmlsaXR5OiJoaWRkZW4iLHdpZHRoOjAsaGVpZ2h0OjAsYm9yZGVyOjAsbWFyZ2luOjAsYmFja2dyb3VuZDoibm9uZSJ9LG0mJmYuZXh0ZW5kKHAse3Bvc2l0aW9uOiJhYnNvbHV0ZSIsbGVmdDoiLTk5OXB4Iix0b3A6Ii05OTlweCJ9KTtmb3IodCBpbiBwKW8uc3R5bGVbdF09cFt0XTtvLmFwcGVuZENoaWxkKGEpLG49bXx8YixuLmluc2VydEJlZm9yZShvLG4uZmlyc3RDaGlsZCksay5hcHBlbmRDaGVja2VkPWkuY2hlY2tlZCxrLmJveE1vZGVsPWEub2Zmc2V0V2lkdGg9PT0yLCJ6b29tImluIGEuc3R5bGUmJihhLnN0eWxlLmRpc3BsYXk9ImlubGluZSIsYS5zdHlsZS56b29tPTEsay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWEub2Zmc2V0V2lkdGg9PT0yLGEuc3R5bGUuZGlzcGxheT0iIixhLmlubmVySFRNTD0iPGRpdiBzdHlsZT0nd2lkdGg6NHB4Oyc+PC9kaXY+IixrLnNocmlua1dyYXBCbG9ja3M9YS5vZmZzZXRXaWR0aCE9PTIpLGEuaW5uZXJIVE1MPSI8dGFibGU+PHRyPjx0ZCBzdHlsZT0ncGFkZGluZzowO2JvcmRlcjowO2Rpc3BsYXk6bm9uZSc+PC90ZD48dGQ+dDwvdGQ+PC90cj48L3RhYmxlPiIscT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0ZCIpLHU9cVswXS5vZmZzZXRIZWlnaHQ9PT0wLHFbMF0uc3R5bGUuZGlzcGxheT0iIixxWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGsucmVsaWFibGVIaWRkZW5PZmZzZXRzPXUmJnFbMF0ub2Zmc2V0SGVpZ2h0PT09MCxhLmlubmVySFRNTD0iIixjLmRlZmF1bHRWaWV3JiZjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUmJihqPWMuY3JlYXRlRWxlbWVudCgiZGl2Iiksai5zdHlsZS53aWR0aD0iMCIsai5zdHlsZS5tYXJnaW5SaWdodD0iMCIsYS5hcHBlbmRDaGlsZChqKSxrLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChjLmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoaixudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCk7aWYoYS5hdHRhY2hFdmVudClmb3IodCBpbntzdWJtaXQ6MSxjaGFuZ2U6MSxmb2N1c2luOjF9KXM9Im9uIit0LHU9cyBpbiBhLHV8fChhLnNldEF0dHJpYnV0ZShzLCJyZXR1cm47IiksdT10eXBlb2YgYVtzXT09ImZ1bmN0aW9uIiksa1t0KyJCdWJibGVzIl09dTtmKGZ1bmN0aW9uKCl7dmFyIGEsYixkLGUsZyxoLGk9MSxqPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7bWFyZ2luOjA7IixsPSJ2aXNpYmlsaXR5OmhpZGRlbjtib3JkZXI6MDsiLG49InN0eWxlPSciK2orImJvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7JyIscD0iPGRpdiAiK24rIj48ZGl2PjwvZGl2PjwvZGl2PiIrIjx0YWJsZSAiK24rIiBjZWxscGFkZGluZz0nMCcgY2VsbHNwYWNpbmc9JzAnPiIrIjx0cj48dGQ+PC90ZD48L3RyPjwvdGFibGU+IjttPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTshbXx8KGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxhLnN0eWxlLmNzc1RleHQ9bCsid2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjpzdGF0aWM7dG9wOjA7bWFyZ2luLXRvcDoiK2krInB4IixtLmluc2VydEJlZm9yZShhLG0uZmlyc3RDaGlsZCksbz1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG8uc3R5bGUuY3NzVGV4dD1qK2wsby5pbm5lckhUTUw9cCxhLmFwcGVuZENoaWxkKG8pLGI9by5maXJzdENoaWxkLGQ9Yi5maXJzdENoaWxkLGc9Yi5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQsaD17ZG9lc05vdEFkZEJvcmRlcjpkLm9mZnNldFRvcCE9PTUsZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHM6Zy5vZmZzZXRUb3A9PT01fSxkLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsZC5zdHlsZS50b3A9IjIwcHgiLGguZml4ZWRQb3NpdGlvbj1kLm9mZnNldFRvcD09PTIwfHxkLm9mZnNldFRvcD09PTE1LGQuc3R5bGUucG9zaXRpb249ZC5zdHlsZS50b3A9IiIsYi5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZC5vZmZzZXRUb3A9PT0tNSxoLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PW0ub2Zmc2V0VG9wIT09aSxtLnJlbW92ZUNoaWxkKGEpLG89YT1udWxsLGYuZXh0ZW5kKGssaCkpfSksby5pbm5lckhUTUw9IiIsbi5yZW1vdmVDaGlsZChvKSxvPWw9Zz1oPW09aj1hPWk9bnVsbDtyZXR1cm4ga30oKSxmLmJveE1vZGVsPWYuc3VwcG9ydC5ib3hNb2RlbDt2YXIgaj0vXig/Olx7LipcfXxcWy4qXF0pJC8saz0vKFtBLVpdKS9nO2YuZXh0ZW5kKHtjYWNoZTp7fSx1dWlkOjAsZXhwYW5kbzoialF1ZXJ5IisoZi5mbi5qcXVlcnkrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksbm9EYXRhOntlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsYXBwbGV0OiEwfSxoYXNEYXRhOmZ1bmN0aW9uKGEpe2E9YS5ub2RlVHlwZT9mLmNhY2hlW2FbZi5leHBhbmRvXV06YVtmLmV4cGFuZG9dO3JldHVybiEhYSYmIW0oYSl9LGRhdGE6ZnVuY3Rpb24oYSxjLGQsZSl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBnLGgsaSxqPWYuZXhwYW5kbyxrPXR5cGVvZiBjPT0ic3RyaW5nIixsPWEubm9kZVR5cGUsbT1sP2YuY2FjaGU6YSxuPWw/YVtmLmV4cGFuZG9dOmFbZi5leHBhbmRvXSYmZi5leHBhbmRvLG89Yz09PSJldmVudHMiO2lmKCghbnx8IW1bbl18fCFvJiYhZSYmIW1bbl0uZGF0YSkmJmsmJmQ9PT1iKXJldHVybjtufHwobD9hW2YuZXhwYW5kb109bj0rK2YudXVpZDpuPWYuZXhwYW5kbyksbVtuXXx8KG1bbl09e30sbHx8KG1bbl0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9tW25dPWYuZXh0ZW5kKG1bbl0sYyk6bVtuXS5kYXRhPWYuZXh0ZW5kKG1bbl0uZGF0YSxjKTtnPWg9bVtuXSxlfHwoaC5kYXRhfHwoaC5kYXRhPXt9KSxoPWguZGF0YSksZCE9PWImJihoW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihvJiYhaFtjXSlyZXR1cm4gZy5ldmVudHM7az8oaT1oW2NdLGk9PW51bGwmJihpPWhbZi5jYW1lbENhc2UoYyldKSk6aT1oO3JldHVybiBpfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsYyl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZyxoPWYuZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP2YuY2FjaGU6YSxrPWk/YVtmLmV4cGFuZG9dOmYuZXhwYW5kbztpZighaltrXSlyZXR1cm47aWYoYil7ZD1jP2pba106altrXS5kYXRhO2lmKGQpe2YuaXNBcnJheShiKT9iPWI6YiBpbiBkP2I9W2JdOihiPWYuY2FtZWxDYXNlKGIpLGIgaW4gZD9iPVtiXTpiPWIuc3BsaXQoIiAiKSk7Zm9yKGU9MCxnPWIubGVuZ3RoO2U8ZztlKyspZGVsZXRlIGRbYltlXV07aWYoIShjP206Zi5pc0VtcHR5T2JqZWN0KShkKSlyZXR1cm59fWlmKCFjKXtkZWxldGUgaltrXS5kYXRhO2lmKCFtKGpba10pKXJldHVybn1mLnN1cHBvcnQuZGVsZXRlRXhwYW5kb3x8IWouc2V0SW50ZXJ2YWw/ZGVsZXRlIGpba106altrXT1udWxsLGkmJihmLnN1cHBvcnQuZGVsZXRlRXhwYW5kbz9kZWxldGUgYVtmLmV4cGFuZG9dOmEucmVtb3ZlQXR0cmlidXRlP2EucmVtb3ZlQXR0cmlidXRlKGYuZXhwYW5kbyk6YVtmLmV4cGFuZG9dPW51bGwpfX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRhdGEoYSxiLGMsITApfSxhY2NlcHREYXRhOmZ1bmN0aW9uKGEpe2lmKGEubm9kZU5hbWUpe3ZhciBiPWYubm9EYXRhW2Eubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07aWYoYilyZXR1cm4gYiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn1yZXR1cm4hMH19KSxmLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihhLGMpe3ZhciBkLGUsZyxoPW51bGw7aWYodHlwZW9mIGE9PSJ1bmRlZmluZWQiKXtpZih0aGlzLmxlbmd0aCl7aD1mLmRhdGEodGhpc1swXSk7aWYodGhpc1swXS5ub2RlVHlwZT09PTEmJiFmLl9kYXRhKHRoaXNbMF0sInBhcnNlZEF0dHJzIikpe2U9dGhpc1swXS5hdHRyaWJ1dGVzO2Zvcih2YXIgaT0wLGo9ZS5sZW5ndGg7aTxqO2krKylnPWVbaV0ubmFtZSxnLmluZGV4T2YoImRhdGEtIik9PT0wJiYoZz1mLmNhbWVsQ2FzZShnLnN1YnN0cmluZyg1KSksbCh0aGlzWzBdLGcsaFtnXSkpO2YuX2RhdGEodGhpc1swXSwicGFyc2VkQXR0cnMiLCEwKX19cmV0dXJuIGh9aWYodHlwZW9mIGE9PSJvYmplY3QiKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmRhdGEodGhpcyxhKX0pO2Q9YS5zcGxpdCgiLiIpLGRbMV09ZFsxXT8iLiIrZFsxXToiIjtpZihjPT09Yil7aD10aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitkWzFdKyIhIixbZFswXV0pLGg9PT1iJiZ0aGlzLmxlbmd0aCYmKGg9Zi5kYXRhKHRoaXNbMF0sYSksaD1sKHRoaXNbMF0sYSxoKSk7cmV0dXJuIGg9PT1iJiZkWzFdP3RoaXMuZGF0YShkWzBdKTpofXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mKHRoaXMpLGU9W2RbMF0sY107Yi50cmlnZ2VySGFuZGxlcigic2V0RGF0YSIrZFsxXSsiISIsZSksZi5kYXRhKHRoaXMsYSxjKSxiLnRyaWdnZXJIYW5kbGVyKCJjaGFuZ2VEYXRhIitkWzFdKyIhIixlKX0pfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLGYuZXh0ZW5kKHtfbWFyazpmdW5jdGlvbihhLGIpe2EmJihiPShifHwiZngiKSsibWFyayIsZi5fZGF0YShhLGIsKGYuX2RhdGEoYSxiKXx8MCkrMSkpfSxfdW5tYXJrOmZ1bmN0aW9uKGEsYixjKXthIT09ITAmJihjPWIsYj1hLGE9ITEpO2lmKGIpe2M9Y3x8ImZ4Ijt2YXIgZD1jKyJtYXJrIixlPWE/MDooZi5fZGF0YShiLGQpfHwxKS0xO2U/Zi5fZGF0YShiLGQsZSk6KGYucmVtb3ZlRGF0YShiLGQsITApLG4oYixjLCJtYXJrIikpfX0scXVldWU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGEpe2I9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1mLl9kYXRhKGEsYiksYyYmKCFkfHxmLmlzQXJyYXkoYyk/ZD1mLl9kYXRhKGEsYixmLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKTtyZXR1cm4gZHx8W119fSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPWYucXVldWUoYSxiKSxkPWMuc2hpZnQoKSxlPXt9O2Q9PT0iaW5wcm9ncmVzcyImJihkPWMuc2hpZnQoKSksZCYmKGI9PT0iZngiJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxmLl9kYXRhKGEsYisiLnJ1biIsZSksZC5jYWxsKGEsZnVuY3Rpb24oKXtmLmRlcXVldWUoYSxiKX0sZSkpLGMubGVuZ3RofHwoZi5yZW1vdmVEYXRhKGEsYisicXVldWUgIitiKyIucnVuIiwhMCksbihhLGIsInF1ZXVlIikpfX0pLGYuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGMpe3R5cGVvZiBhIT0ic3RyaW5nIiYmKGM9YSxhPSJmeCIpO2lmKGM9PT1iKXJldHVybiBmLnF1ZXVlKHRoaXNbMF0sYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYucXVldWUodGhpcyxhLGMpO2E9PT0iZngiJiZiWzBdIT09ImlucHJvZ3Jlc3MiJiZmLmRlcXVldWUodGhpcyxhKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmRlcXVldWUodGhpcyxhKX0pfSxkZWxheTpmdW5jdGlvbihhLGIpe2E9Zi5meD9mLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4IjtyZXR1cm4gdGhpcy5xdWV1ZShiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9c2V0VGltZW91dChiLGEpO2Muc3RvcD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChkKX19KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xdWV1ZShhfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIG0oKXstLWh8fGQucmVzb2x2ZVdpdGgoZSxbZV0pfXR5cGVvZiBhIT0ic3RyaW5nIiYmKGM9YSxhPWIpLGE9YXx8ImZ4Ijt2YXIgZD1mLkRlZmVycmVkKCksZT10aGlzLGc9ZS5sZW5ndGgsaD0xLGk9YSsiZGVmZXIiLGo9YSsicXVldWUiLGs9YSsibWFyayIsbDt3aGlsZShnLS0paWYobD1mLmRhdGEoZVtnXSxpLGIsITApfHwoZi5kYXRhKGVbZ10saixiLCEwKXx8Zi5kYXRhKGVbZ10sayxiLCEwKSkmJmYuZGF0YShlW2ddLGksZi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksITApKWgrKyxsLmFkZChtKTttKCk7cmV0dXJuIGQucHJvbWlzZSgpfX0pO3ZhciBvPS9bXG5cdFxyXS9nLHA9L1xzKy8scT0vXHIvZyxyPS9eKD86YnV0dG9ufGlucHV0KSQvaSxzPS9eKD86YnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpJC9pLHQ9L15hKD86cmVhKT8kL2ksdT0vXig/OmF1dG9mb2N1c3xhdXRvcGxheXxhc3luY3xjaGVja2VkfGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkfHNlbGVjdGVkKSQvaSx2PWYuc3VwcG9ydC5nZXRTZXRBdHRyaWJ1dGUsdyx4LHk7Zi5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5hdHRyKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVBdHRyKHRoaXMsYSl9KX0scHJvcDpmdW5jdGlvbihhLGIpe3JldHVybiBmLmFjY2Vzcyh0aGlzLGEsYiwhMCxmLnByb3ApfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGEpe2E9Zi5wcm9wRml4W2FdfHxhO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1thXT1iLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGMpe319KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZyxoLGk7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5hZGRDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyIpe2I9YS5zcGxpdChwKTtmb3IoYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl7ZT10aGlzW2NdO2lmKGUubm9kZVR5cGU9PT0xKWlmKCFlLmNsYXNzTmFtZSYmYi5sZW5ndGg9PT0xKWUuY2xhc3NOYW1lPWE7ZWxzZXtnPSIgIitlLmNsYXNzTmFtZSsiICI7Zm9yKGg9MCxpPWIubGVuZ3RoO2g8aTtoKyspfmcuaW5kZXhPZigiICIrYltoXSsiICIpfHwoZys9YltoXSsiICIpO2UuY2xhc3NOYW1lPWYudHJpbShnKX19fXJldHVybiB0aGlzfSxyZW1vdmVDbGFzczpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZyxoLGksajtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGEmJnR5cGVvZiBhPT0ic3RyaW5nInx8YT09PWIpe2M9KGF8fCIiKS5zcGxpdChwKTtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO2lmKGcubm9kZVR5cGU9PT0xJiZnLmNsYXNzTmFtZSlpZihhKXtoPSgiICIrZy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG8sIiAiKTtmb3IoaT0wLGo9Yy5sZW5ndGg7aTxqO2krKyloPWgucmVwbGFjZSgiICIrY1tpXSsiICIsIiAiKTtnLmNsYXNzTmFtZT1mLnRyaW0oaCl9ZWxzZSBnLmNsYXNzTmFtZT0iIn19cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEsZD10eXBlb2YgYj09ImJvb2xlYW4iO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGMpe2YodGhpcykudG9nZ2xlQ2xhc3MoYS5jYWxsKHRoaXMsYyx0aGlzLmNsYXNzTmFtZSxiKSxiKX0pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZihjPT09InN0cmluZyIpe3ZhciBlLGc9MCxoPWYodGhpcyksaT1iLGo9YS5zcGxpdChwKTt3aGlsZShlPWpbZysrXSlpPWQ/aTohaC5oYXNDbGFzcyhlKSxoW2k/ImFkZENsYXNzIjoicmVtb3ZlQ2xhc3MiXShlKX1lbHNlIGlmKGM9PT0idW5kZWZpbmVkInx8Yz09PSJib29sZWFuIil0aGlzLmNsYXNzTmFtZSYmZi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjpmLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiJ9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGI9IiAiK2ErIiAiLGM9MCxkPXRoaXMubGVuZ3RoO2Zvcig7YzxkO2MrKylpZih0aGlzW2NdLm5vZGVUeXBlPT09MSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UobywiICIpLmluZGV4T2YoYik+LTEpcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihhKXt2YXIgYyxkLGUsZz10aGlzWzBdO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtpZihnKXtjPWYudmFsSG9va3NbZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1tnLnR5cGVdO2lmKGMmJiJnZXQiaW4gYyYmKGQ9Yy5nZXQoZywidmFsdWUiKSkhPT1iKXJldHVybiBkO2Q9Zy52YWx1ZTtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2QucmVwbGFjZShxLCIiKTpkPT1udWxsPyIiOmR9cmV0dXJuIGJ9ZT1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihkKXt2YXIgZz1mKHRoaXMpLGg7aWYodGhpcy5ub2RlVHlwZT09PTEpe2U/aD1hLmNhbGwodGhpcyxkLGcudmFsKCkpOmg9YSxoPT1udWxsP2g9IiI6dHlwZW9mIGg9PSJudW1iZXIiP2grPSIiOmYuaXNBcnJheShoKSYmKGg9Zi5tYXAoaCxmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD8iIjphKyIifSkpLGM9Zi52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldfHxmLnZhbEhvb2tzW3RoaXMudHlwZV07aWYoIWN8fCEoInNldCJpbiBjKXx8Yy5zZXQodGhpcyxoLCJ2YWx1ZSIpPT09Yil0aGlzLnZhbHVlPWh9fSl9fSksZi5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLmF0dHJpYnV0ZXMudmFsdWU7cmV0dXJuIWJ8fGIuc3BlY2lmaWVkP2EudmFsdWU6YS50ZXh0fX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZz1hLnNlbGVjdGVkSW5kZXgsaD1bXSxpPWEub3B0aW9ucyxqPWEudHlwZT09PSJzZWxlY3Qtb25lIjtpZihnPDApcmV0dXJuIG51bGw7Yz1qP2c6MCxkPWo/ZysxOmkubGVuZ3RoO2Zvcig7YzxkO2MrKyl7ZT1pW2NdO2lmKGUuc2VsZWN0ZWQmJihmLnN1cHBvcnQub3B0RGlzYWJsZWQ/IWUuZGlzYWJsZWQ6ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIik9PT1udWxsKSYmKCFlLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFmLm5vZGVOYW1lKGUucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2I9ZihlKS52YWwoKTtpZihqKXJldHVybiBiO2gucHVzaChiKX19aWYoaiYmIWgubGVuZ3RoJiZpLmxlbmd0aClyZXR1cm4gZihpW2ddKS52YWwoKTtyZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9Zi5tYWtlQXJyYXkoYik7ZihhKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD1mLmluQXJyYXkoZih0aGlzKS52YWwoKSxjKT49MH0pLGMubGVuZ3RofHwoYS5zZWxlY3RlZEluZGV4PS0xKTtyZXR1cm4gY319fSxhdHRyRm46e3ZhbDohMCxjc3M6ITAsaHRtbDohMCx0ZXh0OiEwLGRhdGE6ITAsd2lkdGg6ITAsaGVpZ2h0OiEwLG9mZnNldDohMH0sYXR0cjpmdW5jdGlvbihhLGMsZCxlKXt2YXIgZyxoLGksaj1hLm5vZGVUeXBlO2lmKCFhfHxqPT09M3x8aj09PTh8fGo9PT0yKXJldHVybiBiO2lmKGUmJmMgaW4gZi5hdHRyRm4pcmV0dXJuIGYoYSlbY10oZCk7aWYoISgiZ2V0QXR0cmlidXRlImluIGEpKXJldHVybiBmLnByb3AoYSxjLGQpO2k9aiE9PTF8fCFmLmlzWE1MRG9jKGEpLGkmJihjPWMudG9Mb3dlckNhc2UoKSxoPWYuYXR0ckhvb2tzW2NdfHwodS50ZXN0KGMpP3g6dykpO2lmKGQhPT1iKXtpZihkPT09bnVsbCl7Zi5yZW1vdmVBdHRyKGEsYyk7cmV0dXJuIGJ9aWYoaCYmInNldCJpbiBoJiZpJiYoZz1oLnNldChhLGQsYykpIT09YilyZXR1cm4gZzthLnNldEF0dHJpYnV0ZShjLCIiK2QpO3JldHVybiBkfWlmKGgmJiJnZXQiaW4gaCYmaSYmKGc9aC5nZXQoYSxjKSkhPT1udWxsKXJldHVybiBnO2c9YS5nZXRBdHRyaWJ1dGUoYyk7cmV0dXJuIGc9PT1udWxsP2I6Z30scmVtb3ZlQXR0cjpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxnLGg9MDtpZihhLm5vZGVUeXBlPT09MSl7ZD0oYnx8IiIpLnNwbGl0KHApLGc9ZC5sZW5ndGg7Zm9yKDtoPGc7aCsrKWU9ZFtoXS50b0xvd2VyQ2FzZSgpLGM9Zi5wcm9wRml4W2VdfHxlLGYuYXR0cihhLGUsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHY/ZTpjKSx1LnRlc3QoZSkmJmMgaW4gYSYmKGFbY109ITEpfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oYSxiKXtpZihyLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSlmLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCFmLnN1cHBvcnQucmFkaW9WYWx1ZSYmYj09PSJyYWRpbyImJmYubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTthLnNldEF0dHJpYnV0ZSgidHlwZSIsYiksYyYmKGEudmFsdWU9Yyk7cmV0dXJuIGJ9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihhLGIpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuZ2V0KGEsYik7cmV0dXJuIGIgaW4gYT9hLnZhbHVlOm51bGx9LHNldDpmdW5jdGlvbihhLGIsYyl7aWYodyYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdy5zZXQoYSxiLGMpO2EudmFsdWU9Yn19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJsZSJ9LHByb3A6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpPWEubm9kZVR5cGU7aWYoIWF8fGk9PT0zfHxpPT09OHx8aT09PTIpcmV0dXJuIGI7aD1pIT09MXx8IWYuaXNYTUxEb2MoYSksaCYmKGM9Zi5wcm9wRml4W2NdfHxjLGc9Zi5wcm9wSG9va3NbY10pO3JldHVybiBkIT09Yj9nJiYic2V0ImluIGcmJihlPWcuc2V0KGEsZCxjKSkhPT1iP2U6YVtjXT1kOmcmJiJnZXQiaW4gZyYmKGU9Zy5nZXQoYSxjKSkhPT1udWxsP2U6YVtjXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6cy50ZXN0KGEubm9kZU5hbWUpfHx0LnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fX19KSxmLmF0dHJIb29rcy50YWJpbmRleD1mLnByb3BIb29rcy50YWJJbmRleCx4PXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlPWYucHJvcChhLGMpO3JldHVybiBlPT09ITB8fHR5cGVvZiBlIT0iYm9vbGVhbiImJihkPWEuZ2V0QXR0cmlidXRlTm9kZShjKSkmJmQubm9kZVZhbHVlIT09ITE/Yy50b0xvd2VyQ2FzZSgpOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7Yj09PSExP2YucmVtb3ZlQXR0cihhLGMpOihkPWYucHJvcEZpeFtjXXx8YyxkIGluIGEmJihhW2RdPSEwKSxhLnNldEF0dHJpYnV0ZShjLGMudG9Mb3dlckNhc2UoKSkpO3JldHVybiBjfX0sdnx8KHk9e25hbWU6ITAsaWQ6ITB9LHc9Zi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO2Q9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkJiYoeVtjXT9kLm5vZGVWYWx1ZSE9PSIiOmQuc3BlY2lmaWVkKT9kLm5vZGVWYWx1ZTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0QXR0cmlidXRlTm9kZShkKTtlfHwoZT1jLmNyZWF0ZUF0dHJpYnV0ZShkKSxhLnNldEF0dHJpYnV0ZU5vZGUoZSkpO3JldHVybiBlLm5vZGVWYWx1ZT1iKyIifX0sZi5hdHRySG9va3MudGFiaW5kZXguc2V0PXcuc2V0LGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmF0dHJIb29rc1tiXT1mLmV4dGVuZChmLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXthLnNldEF0dHJpYnV0ZShiLCJhdXRvIik7cmV0dXJuIGN9fX0pfSksZi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6dy5nZXQsc2V0OmZ1bmN0aW9uKGEsYixjKXtiPT09IiImJihiPSJmYWxzZSIpLHcuc2V0KGEsYixjKX19KSxmLnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fGYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYyl7Zi5hdHRySG9va3NbY109Zi5leHRlbmQoZi5hdHRySG9va3NbY10se2dldDpmdW5jdGlvbihhKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShjLDIpO3JldHVybiBkPT09bnVsbD9iOmR9fSl9KSxmLnN1cHBvcnQuc3R5bGV8fChmLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8Yn0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pLGYuc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPWYuZXh0ZW5kKGYucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCk7cmV0dXJuIG51bGx9fSkpLGYuc3VwcG9ydC5lbmN0eXBlfHwoZi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksZi5zdXBwb3J0LmNoZWNrT258fGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6YS52YWx1ZX19fSksZi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT1mLmV4dGVuZChmLnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oYSxiKXtpZihmLmlzQXJyYXkoYikpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxiKT49MH19KX0pO3ZhciB6PS9cLiguKikkLyxBPS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxCPS9cLi9nLEM9LyAvZyxEPS9bXlx3XHMufGBdL2csRT0vXihbXlwuXSopPyg/OlwuKC4rKSk/JC8sRj0vXGJob3ZlcihcLlxTKyk/LyxHPS9ea2V5LyxIPS9eKD86bW91c2V8Y29udGV4dG1lbnUpfGNsaWNrLyxJPS9eKFx3KikoPzojKFtcd1wtXSspKT8oPzpcLihbXHdcLV0rKSk/JC8sSj1mdW5jdGlvbihhKXt2YXIgYj1JLmV4ZWMoYSk7YiYmCihiWzFdPShiWzFdfHwiIikudG9Mb3dlckNhc2UoKSxiWzNdPWJbM10mJm5ldyBSZWdFeHAoIig/Ol58XFxzKSIrYlszXSsiKD86XFxzfCQpIikpO3JldHVybiBifSxLPWZ1bmN0aW9uKGEsYil7cmV0dXJuKCFiWzFdfHxhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iWzFdKSYmKCFiWzJdfHxhLmlkPT09YlsyXSkmJighYlszXXx8YlszXS50ZXN0KGEuY2xhc3NOYW1lKSl9LEw9ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZXZlbnQuc3BlY2lhbC5ob3Zlcj9hOmEucmVwbGFjZShGLCJtb3VzZWVudGVyJDEgbW91c2VsZWF2ZSQxIil9O2YuZXZlbnQ9e2FkZDpmdW5jdGlvbihhLGMsZCxlLGcpe3ZhciBoLGksaixrLGwsbSxuLG8scCxxLHIscztpZighKGEubm9kZVR5cGU9PT0zfHxhLm5vZGVUeXBlPT09OHx8IWN8fCFkfHwhKGg9Zi5fZGF0YShhKSkpKXtkLmhhbmRsZXImJihwPWQsZD1wLmhhbmRsZXIpLGQuZ3VpZHx8KGQuZ3VpZD1mLmd1aWQrKyksaj1oLmV2ZW50cyxqfHwoaC5ldmVudHM9aj17fSksaT1oLmhhbmRsZSxpfHwoaC5oYW5kbGU9aT1mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGYhPSJ1bmRlZmluZWQiJiYoIWF8fGYuZXZlbnQudHJpZ2dlcmVkIT09YS50eXBlKT9mLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGkuZWxlbSxhcmd1bWVudHMpOmJ9LGkuZWxlbT1hKSxjPUwoYykuc3BsaXQoIiAiKTtmb3Ioaz0wO2s8Yy5sZW5ndGg7aysrKXtsPUUuZXhlYyhjW2tdKXx8W10sbT1sWzFdLG49KGxbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxzPWYuZXZlbnQuc3BlY2lhbFttXXx8e30sbT0oZz9zLmRlbGVnYXRlVHlwZTpzLmJpbmRUeXBlKXx8bSxzPWYuZXZlbnQuc3BlY2lhbFttXXx8e30sbz1mLmV4dGVuZCh7dHlwZTptLG9yaWdUeXBlOmxbMV0sZGF0YTplLGhhbmRsZXI6ZCxndWlkOmQuZ3VpZCxzZWxlY3RvcjpnLG5hbWVzcGFjZTpuLmpvaW4oIi4iKX0scCksZyYmKG8ucXVpY2s9SihnKSwhby5xdWljayYmZi5leHByLm1hdGNoLlBPUy50ZXN0KGcpJiYoby5pc1Bvc2l0aW9uYWw9ITApKSxyPWpbbV07aWYoIXIpe3I9alttXT1bXSxyLmRlbGVnYXRlQ291bnQ9MDtpZighcy5zZXR1cHx8cy5zZXR1cC5jYWxsKGEsZSxuLGkpPT09ITEpYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihtLGksITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIittLGkpfXMuYWRkJiYocy5hZGQuY2FsbChhLG8pLG8uaGFuZGxlci5ndWlkfHwoby5oYW5kbGVyLmd1aWQ9ZC5ndWlkKSksZz9yLnNwbGljZShyLmRlbGVnYXRlQ291bnQrKywwLG8pOnIucHVzaChvKSxmLmV2ZW50Lmdsb2JhbFttXT0hMH1hPW51bGx9fSxnbG9iYWw6e30scmVtb3ZlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWYuaGFzRGF0YShhKSYmZi5fZGF0YShhKSxnLGgsaSxqLGssbCxtLG4sbyxwLHE7aWYoISFlJiYhIShtPWUuZXZlbnRzKSl7Yj1MKGJ8fCIiKS5zcGxpdCgiICIpO2ZvcihnPTA7ZzxiLmxlbmd0aDtnKyspe2g9RS5leGVjKGJbZ10pfHxbXSxpPWhbMV0saj1oWzJdO2lmKCFpKXtqPWo/Ii4iK2o6IiI7Zm9yKGwgaW4gbSlmLmV2ZW50LnJlbW92ZShhLGwraixjLGQpO3JldHVybn1uPWYuZXZlbnQuc3BlY2lhbFtpXXx8e30saT0oZD9uLmRlbGVnYXRlVHlwZTpuLmJpbmRUeXBlKXx8aSxwPW1baV18fFtdLGs9cC5sZW5ndGgsaj1qP25ldyBSZWdFeHAoIihefFxcLikiK2ouc3BsaXQoIi4iKS5zb3J0KCkuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbDtpZihjfHxqfHxkfHxuLnJlbW92ZSlmb3IobD0wO2w8cC5sZW5ndGg7bCsrKXtxPXBbbF07aWYoIWN8fGMuZ3VpZD09PXEuZ3VpZClpZighanx8ai50ZXN0KHEubmFtZXNwYWNlKSlpZighZHx8ZD09PXEuc2VsZWN0b3J8fGQ9PT0iKioiJiZxLnNlbGVjdG9yKXAuc3BsaWNlKGwtLSwxKSxxLnNlbGVjdG9yJiZwLmRlbGVnYXRlQ291bnQtLSxuLnJlbW92ZSYmbi5yZW1vdmUuY2FsbChhLHEpfWVsc2UgcC5sZW5ndGg9MDtwLmxlbmd0aD09PTAmJmshPT1wLmxlbmd0aCYmKCghbi50ZWFyZG93bnx8bi50ZWFyZG93bi5jYWxsKGEsaik9PT0hMSkmJmYucmVtb3ZlRXZlbnQoYSxpLGUuaGFuZGxlKSxkZWxldGUgbVtpXSl9Zi5pc0VtcHR5T2JqZWN0KG0pJiYobz1lLmhhbmRsZSxvJiYoby5lbGVtPW51bGwpLGYucmVtb3ZlRGF0YShhLFsiZXZlbnRzIiwiaGFuZGxlIl0sITApKX19LGN1c3RvbUV2ZW50OntnZXREYXRhOiEwLHNldERhdGE6ITAsY2hhbmdlRGF0YTohMH0sdHJpZ2dlcjpmdW5jdGlvbihjLGQsZSxnKXtpZighZXx8ZS5ub2RlVHlwZSE9PTMmJmUubm9kZVR5cGUhPT04KXt2YXIgaD1jLnR5cGV8fGMsaT1bXSxqLGssbCxtLG4sbyxwLHEscixzO2guaW5kZXhPZigiISIpPj0wJiYoaD1oLnNsaWNlKDAsLTEpLGs9ITApLGguaW5kZXhPZigiLiIpPj0wJiYoaT1oLnNwbGl0KCIuIiksaD1pLnNoaWZ0KCksaS5zb3J0KCkpO2lmKCghZXx8Zi5ldmVudC5jdXN0b21FdmVudFtoXSkmJiFmLmV2ZW50Lmdsb2JhbFtoXSlyZXR1cm47Yz10eXBlb2YgYz09Im9iamVjdCI/Y1tmLmV4cGFuZG9dP2M6bmV3IGYuRXZlbnQoaCxjKTpuZXcgZi5FdmVudChoKSxjLnR5cGU9aCxjLmlzVHJpZ2dlcj0hMCxjLmV4Y2x1c2l2ZT1rLGMubmFtZXNwYWNlPWkuam9pbigiLiIpLGMubmFtZXNwYWNlX3JlPWMubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2kuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbCxvPWguaW5kZXhPZigiOiIpPDA/Im9uIitoOiIiLChnfHwhZSkmJmMucHJldmVudERlZmF1bHQoKTtpZighZSl7aj1mLmNhY2hlO2ZvcihsIGluIGopaltsXS5ldmVudHMmJmpbbF0uZXZlbnRzW2hdJiZmLmV2ZW50LnRyaWdnZXIoYyxkLGpbbF0uaGFuZGxlLmVsZW0sITApO3JldHVybn1jLnJlc3VsdD1iLGMudGFyZ2V0fHwoYy50YXJnZXQ9ZSksZD1kIT1udWxsP2YubWFrZUFycmF5KGQpOltdLGQudW5zaGlmdChjKSxwPWYuZXZlbnQuc3BlY2lhbFtoXXx8e307aWYocC50cmlnZ2VyJiZwLnRyaWdnZXIuYXBwbHkoZSxkKT09PSExKXJldHVybjtyPVtbZSxwLmJpbmRUeXBlfHxoXV07aWYoIWcmJiFwLm5vQnViYmxlJiYhZi5pc1dpbmRvdyhlKSl7cz1wLmRlbGVnYXRlVHlwZXx8aCxuPW51bGw7Zm9yKG09ZS5wYXJlbnROb2RlO207bT1tLnBhcmVudE5vZGUpci5wdXNoKFttLHNdKSxuPW07biYmbj09PWUub3duZXJEb2N1bWVudCYmci5wdXNoKFtuLmRlZmF1bHRWaWV3fHxuLnBhcmVudFdpbmRvd3x8YSxzXSl9Zm9yKGw9MDtsPHIubGVuZ3RoO2wrKyl7bT1yW2xdWzBdLGMudHlwZT1yW2xdWzFdLHE9KGYuX2RhdGEobSwiZXZlbnRzIil8fHt9KVtjLnR5cGVdJiZmLl9kYXRhKG0sImhhbmRsZSIpLHEmJnEuYXBwbHkobSxkKSxxPW8mJm1bb10scSYmZi5hY2NlcHREYXRhKG0pJiZxLmFwcGx5KG0sZCk7aWYoYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrfWMudHlwZT1oLGMuaXNEZWZhdWx0UHJldmVudGVkKCl8fCghcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShlLm93bmVyRG9jdW1lbnQsZCk9PT0hMSkmJihoIT09ImNsaWNrInx8IWYubm9kZU5hbWUoZSwiYSIpKSYmZi5hY2NlcHREYXRhKGUpJiZvJiZlW2hdJiYoaCE9PSJmb2N1cyImJmghPT0iYmx1ciJ8fGMudGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiFmLmlzV2luZG93KGUpJiYobj1lW29dLG4mJihlW29dPW51bGwpLGYuZXZlbnQudHJpZ2dlcmVkPWgsZVtoXSgpLGYuZXZlbnQudHJpZ2dlcmVkPWIsbiYmKGVbb109bikpO3JldHVybiBjLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGMpe2M9Zi5ldmVudC5maXgoY3x8YS5ldmVudCk7dmFyIGQ9KGYuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtjLnR5cGVdfHxbXSxlPWQuZGVsZWdhdGVDb3VudCxnPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLGg9IWMuZXhjbHVzaXZlJiYhYy5uYW1lc3BhY2UsaT0oZi5ldmVudC5zcGVjaWFsW2MudHlwZV18fHt9KS5oYW5kbGUsaj1bXSxrLGwsbSxuLG8scCxxLHIscyx0LHU7Z1swXT1jLGMuZGVsZWdhdGVUYXJnZXQ9dGhpcztpZihlJiYhYy50YXJnZXQuZGlzYWJsZWQmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKWZvcihtPWMudGFyZ2V0O20hPXRoaXM7bT1tLnBhcmVudE5vZGV8fHRoaXMpe289e30scT1bXTtmb3Ioaz0wO2s8ZTtrKyspcj1kW2tdLHM9ci5zZWxlY3Rvcix0PW9bc10sci5pc1Bvc2l0aW9uYWw/dD0odHx8KG9bc109ZihzKSkpLmluZGV4KG0pPj0wOnQ9PT1iJiYodD1vW3NdPXIucXVpY2s/SyhtLHIucXVpY2spOmYobSkuaXMocykpLHQmJnEucHVzaChyKTtxLmxlbmd0aCYmai5wdXNoKHtlbGVtOm0sbWF0Y2hlczpxfSl9ZC5sZW5ndGg+ZSYmai5wdXNoKHtlbGVtOnRoaXMsbWF0Y2hlczpkLnNsaWNlKGUpfSk7Zm9yKGs9MDtrPGoubGVuZ3RoJiYhYy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO2srKyl7cD1qW2tdLGMuY3VycmVudFRhcmdldD1wLmVsZW07Zm9yKGw9MDtsPHAubWF0Y2hlcy5sZW5ndGgmJiFjLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKXtyPXAubWF0Y2hlc1tsXTtpZihofHwhYy5uYW1lc3BhY2UmJiFyLm5hbWVzcGFjZXx8Yy5uYW1lc3BhY2VfcmUmJmMubmFtZXNwYWNlX3JlLnRlc3Qoci5uYW1lc3BhY2UpKWMuZGF0YT1yLmRhdGEsYy5oYW5kbGVPYmo9cixuPShpfHxyLmhhbmRsZXIpLmFwcGx5KHAuZWxlbSxnKSxuIT09YiYmKGMucmVzdWx0PW4sbj09PSExJiYoYy5wcmV2ZW50RGVmYXVsdCgpLGMuc3RvcFByb3BhZ2F0aW9uKCkpKX19cmV0dXJuIGMucmVzdWx0fSxwcm9wczoiYXR0ckNoYW5nZSBhdHRyTmFtZSByZWxhdGVkTm9kZSBzcmNFbGVtZW50IGFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGV2ZW50UGhhc2UgbWV0YUtleSByZWxhdGVkVGFyZ2V0IHNoaWZ0S2V5IHRhcmdldCB0aW1lU3RhbXAgdmlldyB3aGljaCIuc3BsaXQoIiAiKSxmaXhIb29rczp7fSxrZXlIb29rczp7cHJvcHM6ImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGUiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7YS53aGljaD09bnVsbCYmKGEud2hpY2g9Yi5jaGFyQ29kZSE9bnVsbD9iLmNoYXJDb2RlOmIua2V5Q29kZSk7cmV0dXJuIGF9fSxtb3VzZUhvb2tzOntwcm9wczoiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIGZyb21FbGVtZW50IG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBzY3JlZW5YIHNjcmVlblkgdG9FbGVtZW50IHdoZWVsRGVsdGEiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsZCl7dmFyIGUsZixnLGg9ZC5idXR0b24saT1kLmZyb21FbGVtZW50O2EucGFnZVg9PW51bGwmJmQuY2xpZW50WCE9bnVsbCYmKGU9YS50YXJnZXQub3duZXJEb2N1bWVudHx8YyxmPWUuZG9jdW1lbnRFbGVtZW50LGc9ZS5ib2R5LGEucGFnZVg9ZC5jbGllbnRYKyhmJiZmLnNjcm9sbExlZnR8fGcmJmcuc2Nyb2xsTGVmdHx8MCktKGYmJmYuY2xpZW50TGVmdHx8ZyYmZy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWQuY2xpZW50WSsoZiYmZi5zY3JvbGxUb3B8fGcmJmcuc2Nyb2xsVG9wfHwwKS0oZiYmZi5jbGllbnRUb3B8fGcmJmcuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmaSYmKGEucmVsYXRlZFRhcmdldD1pPT09YS50YXJnZXQ/ZC50b0VsZW1lbnQ6aSksIWEud2hpY2gmJmghPT1iJiYoYS53aGljaD1oJjE/MTpoJjI/MzpoJjQ/MjowKTtyZXR1cm4gYX19LGZpeDpmdW5jdGlvbihhKXtpZihhW2YuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGQsZSxnPWEsaD1mLmV2ZW50LmZpeEhvb2tzW2EudHlwZV18fHt9LGk9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzO2E9Zi5FdmVudChnKTtmb3IoZD1pLmxlbmd0aDtkOyllPWlbLS1kXSxhW2VdPWdbZV07YS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGMpLGEudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT09PWImJihhLm1ldGFLZXk9YS5jdHJsS2V5KTtyZXR1cm4gaC5maWx0ZXI/aC5maWx0ZXIoYSxnKTphfSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Zi5iaW5kUmVhZHl9LGZvY3VzOntkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4iLG5vQnViYmxlOiEwfSxibHVyOntkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0Iixub0J1YmJsZTohMH0sYmVmb3JldW5sb2FkOntzZXR1cDpmdW5jdGlvbihhLGIsYyl7Zi5pc1dpbmRvdyh0aGlzKSYmKHRoaXMub25iZWZvcmV1bmxvYWQ9Yyl9LHRlYXJkb3duOmZ1bmN0aW9uKGEsYil7dGhpcy5vbmJlZm9yZXVubG9hZD09PWImJih0aGlzLm9uYmVmb3JldW5sb2FkPW51bGwpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPWYuZXh0ZW5kKG5ldyBmLkV2ZW50LGMse3R5cGU6YSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7ZD9mLmV2ZW50LnRyaWdnZXIoZSxudWxsLGIpOmYuZXZlbnQuZGlzcGF0Y2guY2FsbChiLGUpLGUuaXNEZWZhdWx0UHJldmVudGVkKCkmJmMucHJldmVudERlZmF1bHQoKX19LGYuZXZlbnQuaGFuZGxlPWYuZXZlbnQuZGlzcGF0Y2gsZi5yZW1vdmVFdmVudD1jLnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXthLmRldGFjaEV2ZW50JiZhLmRldGFjaEV2ZW50KCJvbiIrYixjKX0sZi5FdmVudD1mdW5jdGlvbihhLGIpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGYuRXZlbnQpKXJldHVybiBuZXcgZi5FdmVudChhLGIpO2EmJmEudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWEsdGhpcy50eXBlPWEudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1hLmRlZmF1bHRQcmV2ZW50ZWR8fGEucmV0dXJuVmFsdWU9PT0hMXx8YS5nZXRQcmV2ZW50RGVmYXVsdCYmYS5nZXRQcmV2ZW50RGVmYXVsdCgpP046TSk6dGhpcy50eXBlPWEsYiYmZi5leHRlbmQodGhpcyxiKSx0aGlzLnRpbWVTdGFtcD1hJiZhLnRpbWVTdGFtcHx8Zi5ub3coKSx0aGlzW2YuZXhwYW5kb109ITB9LGYuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPU47dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5wcmV2ZW50RGVmYXVsdD9hLnByZXZlbnREZWZhdWx0KCk6YS5yZXR1cm5WYWx1ZT0hMSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9Tjt2YXIgYT10aGlzLm9yaWdpbmFsRXZlbnQ7IWF8fChhLnN0b3BQcm9wYWdhdGlvbiYmYS5zdG9wUHJvcGFnYXRpb24oKSxhLmNhbmNlbEJ1YmJsZT0hMCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9Tix0aGlzLnN0b3BQcm9wYWdhdGlvbigpfSxpc0RlZmF1bHRQcmV2ZW50ZWQ6TSxpc1Byb3BhZ2F0aW9uU3RvcHBlZDpNLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOk19LGYuZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9LGZ1bmN0aW9uKGEsYil7Zi5ldmVudC5zcGVjaWFsW2FdPWYuZXZlbnQuc3BlY2lhbFtiXT17ZGVsZWdhdGVUeXBlOmIsYmluZFR5cGU6YixoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEucmVsYXRlZFRhcmdldCxkPWEuaGFuZGxlT2JqLGU9ZC5zZWxlY3RvcixnLGg7aWYoIWN8fGQub3JpZ1R5cGU9PT1hLnR5cGV8fGMhPT1iJiYhZi5jb250YWlucyhiLGMpKWc9YS50eXBlLGEudHlwZT1kLm9yaWdUeXBlLGg9ZC5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhLnR5cGU9ZztyZXR1cm4gaH19fSksZi5zdXBwb3J0LnN1Ym1pdEJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGM9YS50YXJnZXQsZD1mLm5vZGVOYW1lKGMsImlucHV0Iil8fGYubm9kZU5hbWUoYywiYnV0dG9uIik/Yy5mb3JtOmI7ZCYmIWQuX3N1Ym1pdF9hdHRhY2hlZCYmKGYuZXZlbnQuYWRkKGQsInN1Ym1pdC5fc3VibWl0IixmdW5jdGlvbihhKXt0aGlzLnBhcmVudE5vZGUmJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksZC5fc3VibWl0X2F0dGFjaGVkPSEwKX0pfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksZi5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe2lmKEEudGVzdCh0aGlzLm5vZGVOYW1lKSl7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIilmLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lPT09ImNoZWNrZWQiJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLGYuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmKHRoaXMuX2p1c3RfY2hhbmdlZD0hMSxmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMsYSwhMCkpfSk7cmV0dXJuITF9Zi5ldmVudC5hZGQodGhpcywiYmVmb3JlYWN0aXZhdGUuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7QS50ZXN0KGIubm9kZU5hbWUpJiYhYi5fY2hhbmdlX2F0dGFjaGVkJiYoZi5ldmVudC5hZGQoYiwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZSYmIWEuaXNTaW11bGF0ZWQmJmYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksYi5fY2hhbmdlX2F0dGFjaGVkPSEwKX0pfSxoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQ7aWYodGhpcyE9PWJ8fGEuaXNTaW11bGF0ZWR8fGEuaXNUcmlnZ2VyfHxiLnR5cGUhPT0icmFkaW8iJiZiLnR5cGUhPT0iY2hlY2tib3giKXJldHVybiBhLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtmLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpO3JldHVybiBBLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksZi5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHxmLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPWZ1bmN0aW9uKGEpe2YuZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxmLmV2ZW50LmZpeChhKSwhMCl9O2YuZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXtkKys9PT0wJiZjLmFkZEV2ZW50TGlzdGVuZXIoYSxlLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXstLWQ9PT0wJiZjLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxlLCEwKX19fSksZi5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaTtpZih0eXBlb2YgYT09Im9iamVjdCIpe3R5cGVvZiBjIT0ic3RyaW5nIiYmKGQ9YyxjPWIpO2ZvcihpIGluIGEpdGhpcy5vbihpLGMsZCxhW2ldLGcpO3JldHVybiB0aGlzfWQ9PW51bGwmJmU9PW51bGw/KGU9YyxkPWM9Yik6ZT09bnVsbCYmKHR5cGVvZiBjPT0ic3RyaW5nIj8oZT1kLGQ9Yik6KGU9ZCxkPWMsYz1iKSk7aWYoZT09PSExKWU9TTtlbHNlIGlmKCFlKXJldHVybiB0aGlzO2c9PT0xJiYoaD1lLGU9ZnVuY3Rpb24oYSl7ZigpLm9mZihhKTtyZXR1cm4gaC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZ3VpZD1oLmd1aWR8fChoLmd1aWQ9Zi5ndWlkKyspKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5hZGQodGhpcyxhLGUsZCxjKX0pfSxvbmU6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMub24uY2FsbCh0aGlzLGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGMsZCl7aWYoYSYmYS5wcmV2ZW50RGVmYXVsdCYmYS5oYW5kbGVPYmope3ZhciBlPWEuaGFuZGxlT2JqO2YoYS5kZWxlZ2F0ZVRhcmdldCkub2ZmKGUubmFtZXNwYWNlP2UudHlwZSsiLiIrZS5uYW1lc3BhY2U6ZS50eXBlLGUuc2VsZWN0b3IsZS5oYW5kbGVyKTtyZXR1cm4gdGhpc31pZih0eXBlb2YgYT09Im9iamVjdCIpe2Zvcih2YXIgZyBpbiBhKXRoaXMub2ZmKGcsYyxhW2ddKTtyZXR1cm4gdGhpc31pZihjPT09ITF8fHR5cGVvZiBjPT0iZnVuY3Rpb24iKWQ9YyxjPWI7ZD09PSExJiYoZD1NKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcyxhLGQsYyl9KX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGxpdmU6ZnVuY3Rpb24oYSxiLGMpe2YodGhpcy5jb250ZXh0KS5vbihhLHRoaXMuc2VsZWN0b3IsYixjKTtyZXR1cm4gdGhpc30sZGllOmZ1bmN0aW9uKGEsYil7Zih0aGlzLmNvbnRleHQpLm9mZihhLHRoaXMuc2VsZWN0b3J8fCIqKiIsYik7cmV0dXJuIHRoaXN9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09MT90aGlzLm9mZihhLCIqKiIpOnRoaXMub2ZmKGIsYSxjKX0sdHJpZ2dlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmLmV2ZW50LnRyaWdnZXIoYSxiLHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGEsYil7aWYodGhpc1swXSlyZXR1cm4gZi5ldmVudC50cmlnZ2VyKGEsYix0aGlzWzBdLCEwKX0sdG9nZ2xlOmZ1bmN0aW9uKGEpe3ZhciBiPWFyZ3VtZW50cyxjPWEuZ3VpZHx8Zi5ndWlkKyssZD0wLGU9ZnVuY3Rpb24oYyl7dmFyIGU9KGYuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrYS5ndWlkKXx8MCklZDtmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCxlKzEpLGMucHJldmVudERlZmF1bHQoKTtyZXR1cm4gYltlXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCExfTtlLmd1aWQ9Yzt3aGlsZShkPGIubGVuZ3RoKWJbZCsrXS5ndWlkPWM7cmV0dXJuIHRoaXMuY2xpY2soZSl9LGhvdmVyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubW91c2VlbnRlcihhKS5tb3VzZWxlYXZlKGJ8fGEpfX0pLGYuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSxjKXtjPT1udWxsJiYoYz1hLGE9bnVsbCk7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLmJpbmQoYixhLGMpOnRoaXMudHJpZ2dlcihiKX0sZi5hdHRyRm4mJihmLmF0dHJGbltiXT0hMCksRy50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50LmtleUhvb2tzKSxILnRlc3QoYikmJihmLmV2ZW50LmZpeEhvb2tzW2JdPWYuZXZlbnQubW91c2VIb29rcyl9KSxmdW5jdGlvbigpe2Z1bmN0aW9uIHgoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9aWYoai5ub2RlVHlwZT09PTEpe2d8fChqW2RdPWMsai5zaXpzZXQ9aCk7aWYodHlwZW9mIGIhPSJzdHJpbmciKXtpZihqPT09Yil7az0hMDticmVha319ZWxzZSBpZihtLmZpbHRlcihiLFtqXSkubGVuZ3RoPjApe2s9ajticmVha319aj1qW2FdfWVbaF09a319fWZ1bmN0aW9uIHcoYSxiLGMsZSxmLGcpe2Zvcih2YXIgaD0wLGk9ZS5sZW5ndGg7aDxpO2grKyl7dmFyIGo9ZVtoXTtpZihqKXt2YXIgaz0hMTtqPWpbYV07d2hpbGUoail7aWYoaltkXT09PWMpe2s9ZVtqLnNpenNldF07YnJlYWt9ai5ub2RlVHlwZT09PTEmJiFnJiYoaltkXT1jLGouc2l6c2V0PWgpO2lmKGoubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWIpe2s9ajticmVha31qPWpbYV19ZVtoXT1rfX19dmFyIGE9LygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZyxkPSJzaXpjYWNoZSIrKE1hdGgucmFuZG9tKCkrIiIpLnJlcGxhY2UoIi4iLCIiKSxlPTAsZz1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGg9ITEsaT0hMCxqPS9cXC9nLGs9L1xyXG4vZyxsPS9cVy87WzAsMF0uc29ydChmdW5jdGlvbigpe2k9ITE7cmV0dXJuIDB9KTt2YXIgbT1mdW5jdGlvbihiLGQsZSxmKXtlPWV8fFtdLGQ9ZHx8Yzt2YXIgaD1kO2lmKGQubm9kZVR5cGUhPT0xJiZkLm5vZGVUeXBlIT09OSlyZXR1cm5bXTtpZighYnx8dHlwZW9mIGIhPSJzdHJpbmciKXJldHVybiBlO3ZhciBpLGosayxsLG4scSxyLHQsdT0hMCx2PW0uaXNYTUwoZCksdz1bXSx4PWI7ZG97YS5leGVjKCIiKSxpPWEuZXhlYyh4KTtpZihpKXt4PWlbM10sdy5wdXNoKGlbMV0pO2lmKGlbMl0pe2w9aVszXTticmVha319fXdoaWxlKGkpO2lmKHcubGVuZ3RoPjEmJnAuZXhlYyhiKSlpZih3Lmxlbmd0aD09PTImJm8ucmVsYXRpdmVbd1swXV0paj15KHdbMF0rd1sxXSxkLGYpO2Vsc2V7aj1vLnJlbGF0aXZlW3dbMF1dP1tkXTptKHcuc2hpZnQoKSxkKTt3aGlsZSh3Lmxlbmd0aCliPXcuc2hpZnQoKSxvLnJlbGF0aXZlW2JdJiYoYis9dy5zaGlmdCgpKSxqPXkoYixqLGYpfWVsc2V7IWYmJncubGVuZ3RoPjEmJmQubm9kZVR5cGU9PT05JiYhdiYmby5tYXRjaC5JRC50ZXN0KHdbMF0pJiYhby5tYXRjaC5JRC50ZXN0KHdbdy5sZW5ndGgtMV0pJiYobj1tLmZpbmQody5zaGlmdCgpLGQsdiksZD1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KVswXTpuLnNldFswXSk7aWYoZCl7bj1mP3tleHByOncucG9wKCksc2V0OnMoZil9Om0uZmluZCh3LnBvcCgpLHcubGVuZ3RoPT09MSYmKHdbMF09PT0ifiJ8fHdbMF09PT0iKyIpJiZkLnBhcmVudE5vZGU/ZC5wYXJlbnROb2RlOmQsdiksaj1uLmV4cHI/bS5maWx0ZXIobi5leHByLG4uc2V0KTpuLnNldCx3Lmxlbmd0aD4wP2s9cyhqKTp1PSExO3doaWxlKHcubGVuZ3RoKXE9dy5wb3AoKSxyPXEsby5yZWxhdGl2ZVtxXT9yPXcucG9wKCk6cT0iIixyPT1udWxsJiYocj1kKSxvLnJlbGF0aXZlW3FdKGsscix2KX1lbHNlIGs9dz1bXX1rfHwoaz1qKSxrfHxtLmVycm9yKHF8fGIpO2lmKGcuY2FsbChrKT09PSJbb2JqZWN0IEFycmF5XSIpaWYoIXUpZS5wdXNoLmFwcGx5KGUsayk7ZWxzZSBpZihkJiZkLm5vZGVUeXBlPT09MSlmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJihrW3RdPT09ITB8fGtbdF0ubm9kZVR5cGU9PT0xJiZtLmNvbnRhaW5zKGQsa1t0XSkpJiZlLnB1c2goalt0XSk7ZWxzZSBmb3IodD0wO2tbdF0hPW51bGw7dCsrKWtbdF0mJmtbdF0ubm9kZVR5cGU9PT0xJiZlLnB1c2goalt0XSk7ZWxzZSBzKGssZSk7bCYmKG0obCxoLGUsZiksbS51bmlxdWVTb3J0KGUpKTtyZXR1cm4gZX07bS51bmlxdWVTb3J0PWZ1bmN0aW9uKGEpe2lmKHUpe2g9aSxhLnNvcnQodSk7aWYoaClmb3IodmFyIGI9MTtiPGEubGVuZ3RoO2IrKylhW2JdPT09YVtiLTFdJiZhLnNwbGljZShiLS0sMSl9cmV0dXJuIGF9LG0ubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBtKGEsbnVsbCxudWxsLGIpfSxtLm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihhLGIpe3JldHVybiBtKGIsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9LG0uZmluZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpO2lmKCFhKXJldHVybltdO2ZvcihlPTAsZj1vLm9yZGVyLmxlbmd0aDtlPGY7ZSsrKXtoPW8ub3JkZXJbZV07aWYoZz1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKXtpPWdbMV0sZy5zcGxpY2UoMSwxKTtpZihpLnN1YnN0cihpLmxlbmd0aC0xKSE9PSJcXCIpe2dbMV09KGdbMV18fCIiKS5yZXBsYWNlKGosIiIpLGQ9by5maW5kW2hdKGcsYixjKTtpZihkIT1udWxsKXthPWEucmVwbGFjZShvLm1hdGNoW2hdLCIiKTticmVha319fX1kfHwoZD10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZSE9InVuZGVmaW5lZCI/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpOltdKTtyZXR1cm57c2V0OmQsZXhwcjphfX0sbS5maWx0ZXI9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixwLHE9YSxyPVtdLHM9Yyx0PWMmJmNbMF0mJm0uaXNYTUwoY1swXSk7d2hpbGUoYSYmYy5sZW5ndGgpe2ZvcihoIGluIG8uZmlsdGVyKWlmKChmPW8ubGVmdE1hdGNoW2hdLmV4ZWMoYSkpIT1udWxsJiZmWzJdKXtrPW8uZmlsdGVyW2hdLGw9ZlsxXSxnPSExLGYuc3BsaWNlKDEsMSk7aWYobC5zdWJzdHIobC5sZW5ndGgtMSk9PT0iXFwiKWNvbnRpbnVlO3M9PT1yJiYocj1bXSk7aWYoby5wcmVGaWx0ZXJbaF0pe2Y9by5wcmVGaWx0ZXJbaF0oZixzLGQscixlLHQpO2lmKCFmKWc9aT0hMDtlbHNlIGlmKGY9PT0hMCljb250aW51ZX1pZihmKWZvcihuPTA7KGo9c1tuXSkhPW51bGw7bisrKWomJihpPWsoaixmLG4scykscD1lXmksZCYmaSE9bnVsbD9wP2c9ITA6c1tuXT0hMTpwJiYoci5wdXNoKGopLGc9ITApKTtpZihpIT09Yil7ZHx8KHM9ciksYT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7aWYoIWcpcmV0dXJuW107YnJlYWt9fWlmKGE9PT1xKWlmKGc9PW51bGwpbS5lcnJvcihhKTtlbHNlIGJyZWFrO3E9YX1yZXR1cm4gc30sbS5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2F9O3ZhciBuPW0uZ2V0VGV4dD1mdW5jdGlvbihhKXt2YXIgYixjLGQ9YS5ub2RlVHlwZSxlPSIiO2lmKGQpe2lmKGQ9PT0xKXtpZih0eXBlb2YgYS50ZXh0Q29udGVudD09InN0cmluZyIpcmV0dXJuIGEudGV4dENvbnRlbnQ7aWYodHlwZW9mIGEuaW5uZXJUZXh0PT0ic3RyaW5nIilyZXR1cm4gYS5pbm5lclRleHQucmVwbGFjZShrLCIiKTtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpZSs9bihhKX1lbHNlIGlmKGQ9PT0zfHxkPT09NClyZXR1cm4gYS5ub2RlVmFsdWV9ZWxzZSBmb3IoYj0wO2M9YVtiXTtiKyspYy5ub2RlVHlwZSE9PTgmJihlKz1uKGMpKTtyZXR1cm4gZX0sbz1tLnNlbGVjdG9ycz17b3JkZXI6WyJJRCIsIk5BTUUiLCJUQUciXSxtYXRjaDp7SUQ6LyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLENMQVNTOi9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sTkFNRTovXFtuYW1lPVsnIl0qKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspWyciXSpcXS8sQVRUUjovXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLyxUQUc6L14oKD86W1x3XHUwMGMwLVx1RkZGRlwqXC1dfFxcLikrKS8sQ0hJTEQ6Lzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKFxzKihldmVufG9kZHwoPzpbK1wtXT9cZCt8KD86WytcLV0/XGQqKT9uXHMqKD86WytcLV1ccypcZCspPykpXHMqXCkpPy8sUE9TOi86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLFBTRVVETzovOigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKSg/OlwoKFsnIl0/KSgoPzpcKFteXCldK1wpfFteXChcKV0qKSspXDJcKSk/L30sbGVmdE1hdGNoOnt9LGF0dHJNYXA6eyJjbGFzcyI6ImNsYXNzTmFtZSIsImZvciI6Imh0bWxGb3IifSxhdHRySGFuZGxlOntocmVmOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSx0eXBlOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgidHlwZSIpfX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBiPT0ic3RyaW5nIixkPWMmJiFsLnRlc3QoYiksZT1jJiYhZDtkJiYoYj1iLnRvTG93ZXJDYXNlKCkpO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGgsaDtmPGc7ZisrKWlmKGg9YVtmXSl7d2hpbGUoKGg9aC5wcmV2aW91c1NpYmxpbmcpJiZoLm5vZGVUeXBlIT09MSk7YVtmXT1lfHxoJiZoLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iP2h8fCExOmg9PT1ifWUmJm0uZmlsdGVyKGIsYSwhMCl9LCI+IjpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9dHlwZW9mIGI9PSJzdHJpbmciLGU9MCxmPWEubGVuZ3RoO2lmKGQmJiFsLnRlc3QoYikpe2I9Yi50b0xvd2VyQ2FzZSgpO2Zvcig7ZTxmO2UrKyl7Yz1hW2VdO2lmKGMpe3ZhciBnPWMucGFyZW50Tm9kZTthW2VdPWcubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/ZzohMX19fWVsc2V7Zm9yKDtlPGY7ZSsrKWM9YVtlXSxjJiYoYVtlXT1kP2MucGFyZW50Tm9kZTpjLnBhcmVudE5vZGU9PT1iKTtkJiZtLmZpbHRlcihiLGEsITApfX0sIiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwYXJlbnROb2RlIixiLGYsYSxkLGMpfSwifiI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGY9ZSsrLGc9eDt0eXBlb2YgYj09InN0cmluZyImJiFsLnRlc3QoYikmJihiPWIudG9Mb3dlckNhc2UoKSxkPWIsZz13KSxnKCJwcmV2aW91c1NpYmxpbmciLGIsZixhLGQsYyl9fSxmaW5kOntJRDpmdW5jdGlvbihhLGIsYyl7aWYodHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQhPSJ1bmRlZmluZWQiJiYhYyl7dmFyIGQ9Yi5nZXRFbGVtZW50QnlJZChhWzFdKTtyZXR1cm4gZCYmZC5wYXJlbnROb2RlP1tkXTpbXX19LE5BTUU6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5TmFtZSE9InVuZGVmaW5lZCIpe3ZhciBjPVtdLGQ9Yi5nZXRFbGVtZW50c0J5TmFtZShhWzFdKTtmb3IodmFyIGU9MCxmPWQubGVuZ3RoO2U8ZjtlKyspZFtlXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKT09PWFbMV0mJmMucHVzaChkW2VdKTtyZXR1cm4gYy5sZW5ndGg9PT0wP251bGw6Y319LFRBRzpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lIT0idW5kZWZpbmVkIilyZXR1cm4gYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhWzFdKX19LHByZUZpbHRlcjp7Q0xBU1M6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe2E9IiAiK2FbMV0ucmVwbGFjZShqLCIiKSsiICI7aWYoZilyZXR1cm4gYTtmb3IodmFyIGc9MCxoOyhoPWJbZ10pIT1udWxsO2crKyloJiYoZV4oaC5jbGFzc05hbWUmJigiICIraC5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKC9bXHRcblxyXS9nLCIgIikuaW5kZXhPZihhKT49MCk/Y3x8ZC5wdXNoKGgpOmMmJihiW2ddPSExKSk7cmV0dXJuITF9LElEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIil9LFRBRzpmdW5jdGlvbihhLGIpe3JldHVybiBhWzFdLnJlcGxhY2UoaiwiIikudG9Mb3dlckNhc2UoKX0sQ0hJTEQ6ZnVuY3Rpb24oYSl7aWYoYVsxXT09PSJudGgiKXthWzJdfHxtLmVycm9yKGFbMF0pLGFbMl09YVsyXS5yZXBsYWNlKC9eXCt8XHMqL2csIiIpO3ZhciBiPS8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYyhhWzJdPT09ImV2ZW4iJiYiMm4ifHxhWzJdPT09Im9kZCImJiIybisxInx8IS9cRC8udGVzdChhWzJdKSYmIjBuKyIrYVsyXXx8YVsyXSk7YVsyXT1iWzFdKyhiWzJdfHwxKS0wLGFbM109YlszXS0wfWVsc2UgYVsyXSYmbS5lcnJvcihhWzBdKTthWzBdPWUrKztyZXR1cm4gYX0sQVRUUjpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIGc9YVsxXT1hWzFdLnJlcGxhY2UoaiwiIik7IWYmJm8uYXR0ck1hcFtnXSYmKGFbMV09by5hdHRyTWFwW2ddKSxhWzRdPShhWzRdfHxhWzVdfHwiIikucmVwbGFjZShqLCIiKSxhWzJdPT09In49IiYmKGFbNF09IiAiK2FbNF0rIiAiKTtyZXR1cm4gYX0sUFNFVURPOmZ1bmN0aW9uKGIsYyxkLGUsZil7aWYoYlsxXT09PSJub3QiKWlmKChhLmV4ZWMoYlszXSl8fCIiKS5sZW5ndGg+MXx8L15cdy8udGVzdChiWzNdKSliWzNdPW0oYlszXSxudWxsLG51bGwsYyk7ZWxzZXt2YXIgZz1tLmZpbHRlcihiWzNdLGMsZCwhMF5mKTtkfHxlLnB1c2guYXBwbHkoZSxnKTtyZXR1cm4hMX1lbHNlIGlmKG8ubWF0Y2guUE9TLnRlc3QoYlswXSl8fG8ubWF0Y2guQ0hJTEQudGVzdChiWzBdKSlyZXR1cm4hMDtyZXR1cm4gYn0sUE9TOmZ1bmN0aW9uKGEpe2EudW5zaGlmdCghMCk7cmV0dXJuIGF9fSxmaWx0ZXJzOntlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITEmJmEudHlwZSE9PSJoaWRkZW4ifSxkaXNhYmxlZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNoZWNrZWQ9PT0hMH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7YS5wYXJlbnROb2RlJiZhLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtyZXR1cm4gYS5zZWxlY3RlZD09PSEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuISFhLmZpcnN0Q2hpbGR9LGVtcHR5OmZ1bmN0aW9uKGEpe3JldHVybiFhLmZpcnN0Q2hpbGR9LGhhczpmdW5jdGlvbihhLGIsYyl7cmV0dXJuISFtKGNbM10sYSkubGVuZ3RofSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJuL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSl9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxjPWEudHlwZTtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInRleHQiPT09YyYmKGI9PT1jfHxiPT09bnVsbCl9LHJhZGlvOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicmFkaW8iPT09YS50eXBlfSxjaGVja2JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImNoZWNrYm94Ij09PWEudHlwZX0sZmlsZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImZpbGUiPT09YS50eXBlfSxwYXNzd29yZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmInBhc3N3b3JkIj09PWEudHlwZX0sc3VibWl0OmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oYj09PSJpbnB1dCJ8fGI9PT0iYnV0dG9uIikmJiJzdWJtaXQiPT09YS50eXBlfSxpbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmImltYWdlIj09PWEudHlwZX0scmVzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInJlc2V0Ij09PWEudHlwZX0sYnV0dG9uOmZ1bmN0aW9uKGEpe3ZhciBiPWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gYj09PSJpbnB1dCImJiJidXR0b24iPT09YS50eXBlfHxiPT09ImJ1dHRvbiJ9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChhLm5vZGVOYW1lKX0sZm9jdXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1hLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudH19LHNldEZpbHRlcnM6e2ZpcnN0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0wfSxsYXN0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBiPT09ZC5sZW5ndGgtMX0sZXZlbjpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0wfSxvZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYiUyPT09MX0sbHQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPGNbM10tMH0sZ3Q6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPmNbM10tMH0sbnRoOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gY1szXS0wPT09Yn0sZXE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifX0sZmlsdGVyOntQU0VVRE86ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsxXSxmPW8uZmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpO2lmKGU9PT0iY29udGFpbnMiKXJldHVybihhLnRleHRDb250ZW50fHxhLmlubmVyVGV4dHx8bihbYV0pfHwiIikuaW5kZXhPZihiWzNdKT49MDtpZihlPT09Im5vdCIpe3ZhciBnPWJbM107Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKWlmKGdbaF09PT1hKXJldHVybiExO3JldHVybiEwfW0uZXJyb3IoZSl9LENISUxEOmZ1bmN0aW9uKGEsYil7dmFyIGMsZSxmLGcsaCxpLGosaz1iWzFdLGw9YTtzd2l0Y2goayl7Y2FzZSJvbmx5IjpjYXNlImZpcnN0Ijp3aGlsZShsPWwucHJldmlvdXNTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO2lmKGs9PT0iZmlyc3QiKXJldHVybiEwO2w9YTtjYXNlImxhc3QiOndoaWxlKGw9bC5uZXh0U2libGluZylpZihsLm5vZGVUeXBlPT09MSlyZXR1cm4hMTtyZXR1cm4hMDtjYXNlIm50aCI6Yz1iWzJdLGU9YlszXTtpZihjPT09MSYmZT09PTApcmV0dXJuITA7Zj1iWzBdLGc9YS5wYXJlbnROb2RlO2lmKGcmJihnW2RdIT09Znx8IWEubm9kZUluZGV4KSl7aT0wO2ZvcihsPWcuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZylsLm5vZGVUeXBlPT09MSYmKGwubm9kZUluZGV4PSsraSk7Z1tkXT1mfWo9YS5ub2RlSW5kZXgtZTtyZXR1cm4gYz09PTA/aj09PTA6aiVjPT09MCYmai9jPj0wfX0sSUQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGI9PT0iKiImJmEubm9kZVR5cGU9PT0xfHwhIWEubm9kZU5hbWUmJmEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJ9LENMQVNTOmZ1bmN0aW9uKGEsYil7cmV0dXJuKCIgIisoYS5jbGFzc05hbWV8fGEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpKSsiICIpLmluZGV4T2YoYik+LTF9LEFUVFI6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzFdLGQ9bS5hdHRyP20uYXR0cihhLGMpOm8uYXR0ckhhbmRsZVtjXT9vLmF0dHJIYW5kbGVbY10oYSk6YVtjXSE9bnVsbD9hW2NdOmEuZ2V0QXR0cmlidXRlKGMpLGU9ZCsiIixmPWJbMl0sZz1iWzRdO3JldHVybiBkPT1udWxsP2Y9PT0iIT0iOiFmJiZtLmF0dHI/ZCE9bnVsbDpmPT09Ij0iP2U9PT1nOmY9PT0iKj0iP2UuaW5kZXhPZihnKT49MDpmPT09In49Ij8oIiAiK2UrIiAiKS5pbmRleE9mKGcpPj0wOmc/Zj09PSIhPSI/ZSE9PWc6Zj09PSJePSI/ZS5pbmRleE9mKGcpPT09MDpmPT09IiQ9Ij9lLnN1YnN0cihlLmxlbmd0aC1nLmxlbmd0aCk9PT1nOmY9PT0ifD0iP2U9PT1nfHxlLnN1YnN0cigwLGcubGVuZ3RoKzEpPT09ZysiLSI6ITE6ZSYmZCE9PSExfSxQT1M6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9YlsyXSxmPW8uc2V0RmlsdGVyc1tlXTtpZihmKXJldHVybiBmKGEsYyxiLGQpfX19LHA9by5tYXRjaC5QT1MscT1mdW5jdGlvbihhLGIpe3JldHVybiJcXCIrKGItMCsxKX07Zm9yKHZhciByIGluIG8ubWF0Y2gpby5tYXRjaFtyXT1uZXcgUmVnRXhwKG8ubWF0Y2hbcl0uc291cmNlKy8oPyFbXlxbXSpcXSkoPyFbXlwoXSpcKSkvLnNvdXJjZSksby5sZWZ0TWF0Y2hbcl09bmV3IFJlZ0V4cCgvKF4oPzoufFxyfFxuKSo/KS8uc291cmNlK28ubWF0Y2hbcl0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZyxxKSk7dmFyIHM9ZnVuY3Rpb24oYSxiKXthPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEsMCk7aWYoYil7Yi5wdXNoLmFwcGx5KGIsYSk7cmV0dXJuIGJ9cmV0dXJuIGF9O3RyeXtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzLDApWzBdLm5vZGVUeXBlfWNhdGNoKHQpe3M9ZnVuY3Rpb24oYSxiKXt2YXIgYz0wLGQ9Ynx8W107aWYoZy5jYWxsKGEpPT09IltvYmplY3QgQXJyYXldIilBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShkLGEpO2Vsc2UgaWYodHlwZW9mIGEubGVuZ3RoPT0ibnVtYmVyIilmb3IodmFyIGU9YS5sZW5ndGg7YzxlO2MrKylkLnB1c2goYVtjXSk7ZWxzZSBmb3IoO2FbY107YysrKWQucHVzaChhW2NdKTtyZXR1cm4gZH19dmFyIHUsdjtjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj91PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb258fCFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uPy0xOjE7cmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmND8tMToxfToodT1mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXtoPSEwO3JldHVybiAwfWlmKGEuc291cmNlSW5kZXgmJmIuc291cmNlSW5kZXgpcmV0dXJuIGEuc291cmNlSW5kZXgtYi5zb3VyY2VJbmRleDt2YXIgYyxkLGU9W10sZj1bXSxnPWEucGFyZW50Tm9kZSxpPWIucGFyZW50Tm9kZSxqPWc7aWYoZz09PWkpcmV0dXJuIHYoYSxiKTtpZighZylyZXR1cm4tMTtpZighaSlyZXR1cm4gMTt3aGlsZShqKWUudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtqPWk7d2hpbGUoailmLnVuc2hpZnQoaiksaj1qLnBhcmVudE5vZGU7Yz1lLmxlbmd0aCxkPWYubGVuZ3RoO2Zvcih2YXIgaz0wO2s8YyYmazxkO2srKylpZihlW2tdIT09ZltrXSlyZXR1cm4gdihlW2tdLGZba10pO3JldHVybiBrPT09Yz92KGEsZltrXSwtMSk6dihlW2tdLGIsMSl9LHY9ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PT1iKXJldHVybiBjO3ZhciBkPWEubmV4dFNpYmxpbmc7d2hpbGUoZCl7aWYoZD09PWIpcmV0dXJuLTE7ZD1kLm5leHRTaWJsaW5nfXJldHVybiAxfSksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9InNjcmlwdCIrKG5ldyBEYXRlKS5nZXRUaW1lKCksZT1jLmRvY3VtZW50RWxlbWVudDthLmlubmVySFRNTD0iPGEgbmFtZT0nIitkKyInLz4iLGUuaW5zZXJ0QmVmb3JlKGEsZS5maXJzdENoaWxkKSxjLmdldEVsZW1lbnRCeUlkKGQpJiYoby5maW5kLklEPWZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYy5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFkKXt2YXIgZT1jLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBlP2UuaWQ9PT1hWzFdfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT0idW5kZWZpbmVkIiYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZT09PWFbMV0/W2VdOmI6W119fSxvLmZpbHRlci5JRD1mdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGEubm9kZVR5cGU9PT0xJiZjJiZjLm5vZGVWYWx1ZT09PWJ9KSxlLnJlbW92ZUNoaWxkKGEpLGU9YT1udWxsfSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmFwcGVuZENoaWxkKGMuY3JlYXRlQ29tbWVudCgiIikpLGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGg+MCYmKG8uZmluZC5UQUc9ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pO2lmKGFbMV09PT0iKiIpe3ZhciBkPVtdO2Zvcih2YXIgZT0wO2NbZV07ZSsrKWNbZV0ubm9kZVR5cGU9PT0xJiZkLnB1c2goY1tlXSk7Yz1kfXJldHVybiBjfSksYS5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iLGEuZmlyc3RDaGlsZCYmdHlwZW9mIGEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUhPSJ1bmRlZmluZWQiJiZhLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikhPT0iIyImJihvLmF0dHJIYW5kbGUuaHJlZj1mdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImhyZWYiLDIpfSksYT1udWxsfSgpLGMucXVlcnlTZWxlY3RvckFsbCYmZnVuY3Rpb24oKXt2YXIgYT1tLGI9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPSJfX3NpenpsZV9fIjtiLmlubmVySFRNTD0iPHAgY2xhc3M9J1RFU1QnPjwvcD4iO2lmKCFiLnF1ZXJ5U2VsZWN0b3JBbGx8fGIucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGghPT0wKXttPWZ1bmN0aW9uKGIsZSxmLGcpe2U9ZXx8YztpZighZyYmIW0uaXNYTUwoZSkpe3ZhciBoPS9eKFx3KyQpfF5cLihbXHdcLV0rJCl8XiMoW1x3XC1dKyQpLy5leGVjKGIpO2lmKGgmJihlLm5vZGVUeXBlPT09MXx8ZS5ub2RlVHlwZT09PTkpKXtpZihoWzFdKXJldHVybiBzKGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYiksZik7aWYoaFsyXSYmby5maW5kLkNMQVNTJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGhbMl0pLGYpfWlmKGUubm9kZVR5cGU9PT05KXtpZihiPT09ImJvZHkiJiZlLmJvZHkpcmV0dXJuIHMoW2UuYm9keV0sZik7aWYoaCYmaFszXSl7dmFyIGk9ZS5nZXRFbGVtZW50QnlJZChoWzNdKTtpZighaXx8IWkucGFyZW50Tm9kZSlyZXR1cm4gcyhbXSxmKTtpZihpLmlkPT09aFszXSlyZXR1cm4gcyhbaV0sZil9dHJ5e3JldHVybiBzKGUucXVlcnlTZWxlY3RvckFsbChiKSxmKX1jYXRjaChqKXt9fWVsc2UgaWYoZS5ub2RlVHlwZT09PTEmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PSJvYmplY3QiKXt2YXIgaz1lLGw9ZS5nZXRBdHRyaWJ1dGUoImlkIiksbj1sfHxkLHA9ZS5wYXJlbnROb2RlLHE9L15ccypbK35dLy50ZXN0KGIpO2w/bj1uLnJlcGxhY2UoLycvZywiXFwkJiIpOmUuc2V0QXR0cmlidXRlKCJpZCIsbikscSYmcCYmKGU9ZS5wYXJlbnROb2RlKTt0cnl7aWYoIXF8fHApcmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKCJbaWQ9JyIrbisiJ10gIitiKSxmKX1jYXRjaChyKXt9ZmluYWxseXtsfHxrLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBhKGIsZSxmLGcpfTtmb3IodmFyIGUgaW4gYSltW2VdPWFbZV07Yj1udWxsfX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuZG9jdW1lbnRFbGVtZW50LGI9YS5tYXRjaGVzU2VsZWN0b3J8fGEubW96TWF0Y2hlc1NlbGVjdG9yfHxhLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8YS5tc01hdGNoZXNTZWxlY3RvcjtpZihiKXt2YXIgZD0hYi5jYWxsKGMuY3JlYXRlRWxlbWVudCgiZGl2IiksImRpdiIpLGU9ITE7dHJ5e2IuY2FsbChjLmRvY3VtZW50RWxlbWVudCwiW3Rlc3QhPScnXTpzaXp6bGUiKX1jYXRjaChmKXtlPSEwfW0ubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYyl7Yz1jLnJlcGxhY2UoL1w9XHMqKFteJyJcXV0qKVxzKlxdL2csIj0nJDEnXSIpO2lmKCFtLmlzWE1MKGEpKXRyeXtpZihlfHwhby5tYXRjaC5QU0VVRE8udGVzdChjKSYmIS8hPS8udGVzdChjKSl7dmFyIGY9Yi5jYWxsKGEsYyk7aWYoZnx8IWR8fGEuZG9jdW1lbnQmJmEuZG9jdW1lbnQubm9kZVR5cGUhPT0xMSlyZXR1cm4gZn19Y2F0Y2goZyl7fXJldHVybiBtKGMsbnVsbCxudWxsLFthXSkubGVuZ3RoPjB9fX0oKSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J3Rlc3QgZSc+PC9kaXY+PGRpdiBjbGFzcz0ndGVzdCc+PC9kaXY+IjtpZighIWEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJlIikubGVuZ3RoIT09MCl7YS5sYXN0Q2hpbGQuY2xhc3NOYW1lPSJlIjtpZihhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGg9PT0xKXJldHVybjtvLm9yZGVyLnNwbGljZSgxLDAsIkNMQVNTIiksby5maW5kLkNMQVNTPWZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT0idW5kZWZpbmVkIiYmIWMpcmV0dXJuIGIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhWzFdKX0sYT1udWxsfX0oKSxjLmRvY3VtZW50RWxlbWVudC5jb250YWlucz9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEhPT1iJiYoYS5jb250YWlucz9hLmNvbnRhaW5zKGIpOiEwKX06Yy5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24/bS5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybiEhKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikmMTYpfTptLmNvbnRhaW5zPWZ1bmN0aW9uKCl7cmV0dXJuITF9LG0uaXNYTUw9ZnVuY3Rpb24oYSl7dmFyIGI9KGE/YS5vd25lckRvY3VtZW50fHxhOjApLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj9iLm5vZGVOYW1lIT09IkhUTUwiOiExfTt2YXIgeT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZT1bXSxmPSIiLGc9Yi5ub2RlVHlwZT9bYl06Yjt3aGlsZShkPW8ubWF0Y2guUFNFVURPLmV4ZWMoYSkpZis9ZFswXSxhPWEucmVwbGFjZShvLm1hdGNoLlBTRVVETywiIik7YT1vLnJlbGF0aXZlW2FdP2ErIioiOmE7Zm9yKHZhciBoPTAsaT1nLmxlbmd0aDtoPGk7aCsrKW0oYSxnW2hdLGUsYyk7cmV0dXJuIG0uZmlsdGVyKGYsZSl9O20uYXR0cj1mLmF0dHIsbS5zZWxlY3RvcnMuYXR0ck1hcD17fSxmLmZpbmQ9bSxmLmV4cHI9bS5zZWxlY3RvcnMsZi5leHByWyI6Il09Zi5leHByLmZpbHRlcnMsZi51bmlxdWU9bS51bmlxdWVTb3J0LGYudGV4dD1tLmdldFRleHQsZi5pc1hNTERvYz1tLmlzWE1MLGYuY29udGFpbnM9bS5jb250YWluc30oKTt2YXIgTz0vVW50aWwkLyxQPS9eKD86cGFyZW50c3xwcmV2VW50aWx8cHJldkFsbCkvLFE9LywvLFI9L14uW146I1xbXC4sXSokLyxTPUFycmF5LnByb3RvdHlwZS5zbGljZSxUPWYuZXhwci5tYXRjaC5QT1MsVT17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTtmLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLGMsZDtpZih0eXBlb2YgYSE9InN0cmluZyIpcmV0dXJuIGYoYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGM9MCxkPWIubGVuZ3RoO2M8ZDtjKyspaWYoZi5jb250YWlucyhiW2NdLHRoaXMpKXJldHVybiEwfSk7dmFyIGU9dGhpcy5wdXNoU3RhY2soIiIsImZpbmQiLGEpLGcsaCxpO2ZvcihjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXtnPWUubGVuZ3RoLGYuZmluZChhLHRoaXNbY10sZSk7aWYoYz4wKWZvcihoPWc7aDxlLmxlbmd0aDtoKyspZm9yKGk9MDtpPGc7aSsrKWlmKGVbaV09PT1lW2hdKXtlLnNwbGljZShoLS0sMSk7YnJlYWt9fXJldHVybiBlfSxoYXM6ZnVuY3Rpb24oYSl7dmFyIGI9ZihhKTtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxjPWIubGVuZ3RoO2E8YzthKyspaWYoZi5jb250YWlucyh0aGlzLGJbYV0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVyh0aGlzLGEsITEpLCJub3QiLGEpfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFcodGhpcyxhLCEwKSwiZmlsdGVyIixhKX0saXM6ZnVuY3Rpb24oYSl7cmV0dXJuISFhJiYodHlwZW9mIGE9PSJzdHJpbmciP1QudGVzdChhKT9mKGEsdGhpcy5jb250ZXh0KS5pbmRleCh0aGlzWzBdKT49MDpmLmZpbHRlcihhLHRoaXMpLmxlbmd0aD4wOnRoaXMuZmlsdGVyKGEpLmxlbmd0aD4wKX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQsZSxnPXRoaXNbMF07aWYoZi5pc0FycmF5KGEpKXt2YXIgaD0xO3doaWxlKGcmJmcub3duZXJEb2N1bWVudCYmZyE9PWIpe2ZvcihkPTA7ZDxhLmxlbmd0aDtkKyspZihnKS5pcyhhW2RdKSYmYy5wdXNoKHtzZWxlY3RvcjphW2RdLGVsZW06ZyxsZXZlbDpofSk7Zz1nLnBhcmVudE5vZGUsaCsrfXJldHVybiBjfXZhciBpPVQudGVzdChhKXx8dHlwZW9mIGEhPSJzdHJpbmciP2YoYSxifHx0aGlzLmNvbnRleHQpOjA7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTt3aGlsZShnKXtpZihpP2kuaW5kZXgoZyk+LTE6Zi5maW5kLm1hdGNoZXNTZWxlY3RvcihnLGEpKXtjLnB1c2goZyk7YnJlYWt9Zz1nLnBhcmVudE5vZGU7aWYoIWd8fCFnLm93bmVyRG9jdW1lbnR8fGc9PT1ifHxnLm5vZGVUeXBlPT09MTEpYnJlYWt9fWM9Yy5sZW5ndGg+MT9mLnVuaXF1ZShjKTpjO3JldHVybiB0aGlzLnB1c2hTdGFjayhjLCJjbG9zZXN0IixhKX0saW5kZXg6ZnVuY3Rpb24oYSl7aWYoIWEpcmV0dXJuIHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZT90aGlzLnByZXZBbGwoKS5sZW5ndGg6LTE7aWYodHlwZW9mIGE9PSJzdHJpbmciKXJldHVybiBmLmluQXJyYXkodGhpc1swXSxmKGEpKTtyZXR1cm4gZi5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKX0sYWRkOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE9PSJzdHJpbmciP2YoYSxiKTpmLm1ha2VBcnJheShhJiZhLm5vZGVUeXBlP1thXTphKSxkPWYubWVyZ2UodGhpcy5nZXQoKSxjKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVihjWzBdKXx8VihkWzBdKT9kOmYudW5pcXVlKGQpKX0sYW5kU2VsZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFkZCh0aGlzLnByZXZPYmplY3QpfX0pLGYuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGEpe3ZhciBiPWEucGFyZW50Tm9kZTtyZXR1cm4gYiYmYi5ub2RlVHlwZSE9PTExP2I6bnVsbH0scGFyZW50czpmdW5jdGlvbihhKXtyZXR1cm4gZi5kaXIoYSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIixjKX0sbmV4dDpmdW5jdGlvbihhKXtyZXR1cm4gZi5udGgoYSwyLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kaXIoYSwibmV4dFNpYmxpbmciLGMpfSxwcmV2VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJwcmV2aW91c1NpYmxpbmciLGMpfSxzaWJsaW5nczpmdW5jdGlvbihhKXtyZXR1cm4gZi5zaWJsaW5nKGEucGFyZW50Tm9kZS5maXJzdENoaWxkLGEpfSxjaGlsZHJlbjpmdW5jdGlvbihhKXtyZXR1cm4gZi5zaWJsaW5nKGEuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLm5vZGVOYW1lKGEsImlmcmFtZSIpP2EuY29udGVudERvY3VtZW50fHxhLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6Zi5tYWtlQXJyYXkoYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPWYubWFwKHRoaXMsYixjKSxnPVMuY2FsbChhcmd1bWVudHMpO08udGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFVW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fFEudGVzdChkKSkmJlAudGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsZy5qb2luKCIsIikpfX0pLGYuZXh0ZW5kKHtmaWx0ZXI6ZnVuY3Rpb24oYSxiLGMpe2MmJihhPSI6bm90KCIrYSsiKSIpO3JldHVybiBiLmxlbmd0aD09PTE/Zi5maW5kLm1hdGNoZXNTZWxlY3RvcihiWzBdLGEpP1tiWzBdXTpbXTpmLmZpbmQubWF0Y2hlcyhhLGIpfSxkaXI6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPVtdLGc9YVtjXTt3aGlsZShnJiZnLm5vZGVUeXBlIT09OSYmKGQ9PT1ifHxnLm5vZGVUeXBlIT09MXx8IWYoZykuaXMoZCkpKWcubm9kZVR5cGU9PT0xJiZlLnB1c2goZyksZz1nW2NdO3JldHVybiBlfSxudGg6ZnVuY3Rpb24oYSxiLGMsZCl7Yj1ifHwxO3ZhciBlPTA7Zm9yKDthO2E9YVtjXSlpZihhLm5vZGVUeXBlPT09MSYmKytlPT09YilicmVhaztyZXR1cm4gYX0sc2libGluZzpmdW5jdGlvbihhLGIpe3ZhciBjPVtdO2Zvcig7YTthPWEubmV4dFNpYmxpbmcpYS5ub2RlVHlwZT09PTEmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSk7dmFyIFk9ImFiYnIgYXJ0aWNsZSBhc2lkZSBhdWRpbyBjYW52YXMgZGF0YWxpc3QgZGV0YWlscyBmaWdjYXB0aW9uIGZpZ3VyZSBmb290ZXIgaGVhZGVyIGhncm91cCBtYXJrIG1ldGVyIG5hdiBvdXRwdXQgcHJvZ3Jlc3Mgc2VjdGlvbiBzdW1tYXJ5IHRpbWUgdmlkZW8iLFo9LyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywkPS9eXHMrLyxfPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vaWcsYmE9LzwoW1x3Ol0rKS8sYmI9Lzx0Ym9keS9pLGJjPS88fCYjP1x3KzsvLGJkPS88KD86c2NyaXB0fHN0eWxlKS9pLGJlPS88KD86c2NyaXB0fG9iamVjdHxlbWJlZHxvcHRpb258c3R5bGUpL2ksYmY9bmV3IFJlZ0V4cCgiPCg/OiIrWS5yZXBsYWNlKCIgIiwifCIpKyIpIiwiaSIpLGJnPS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGJoPS9cLyhqYXZhfGVjbWEpc2NyaXB0L2ksYmk9L15ccyo8ISg/OlxbQ0RBVEFcW3xcLVwtKS8sYmo9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLF9kZWZhdWx0OlswLCIiLCIiXX0sYms9WChjKTtiai5vcHRncm91cD1iai5vcHRpb24sYmoudGJvZHk9YmoudGZvb3Q9YmouY29sZ3JvdXA9YmouY2FwdGlvbj1iai50aGVhZCxiai50aD1iai50ZCxmLnN1cHBvcnQuaHRtbFNlcmlhbGl6ZXx8KGJqLl9kZWZhdWx0PVsxLCJkaXY8ZGl2PiIsIjwvZGl2PiJdKSxmLmZuLmV4dGVuZCh7dGV4dDpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpO2MudGV4dChhLmNhbGwodGhpcyxiLGMudGV4dCgpKSl9KTtpZih0eXBlb2YgYSE9Im9iamVjdCImJmEhPT1iKXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGMpLmNyZWF0ZVRleHROb2RlKGEpKTtyZXR1cm4gZi50ZXh0KHRoaXMpfSx3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1mKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKSxiLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXM7d2hpbGUoYS5maXJzdENoaWxkJiZhLmZpcnN0Q2hpbGQubm9kZVR5cGU9PT0xKWE9YS5maXJzdENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWYodGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YodGhpcykud3JhcEFsbChhKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Zihhcmd1bWVudHNbMF0pO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIgosYXJndW1lbnRzKTthLnB1c2guYXBwbHkoYSxmKGFyZ3VtZW50c1swXSkudG9BcnJheSgpKTtyZXR1cm4gYX19LHJlbW92ZTpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wLGQ7KGQ9dGhpc1tjXSkhPW51bGw7YysrKWlmKCFhfHxmLmZpbHRlcihhLFtkXSkubGVuZ3RoKSFiJiZkLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksZi5jbGVhbkRhdGEoW2RdKSksZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYjsoYj10aGlzW2FdKSE9bnVsbDthKyspe2Iubm9kZVR5cGU9PT0xJiZmLmNsZWFuRGF0YShiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpO3doaWxlKGIuZmlyc3RDaGlsZCliLnJlbW92ZUNoaWxkKGIuZmlyc3RDaGlsZCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7YT1hPT1udWxsPyExOmEsYj1iPT1udWxsP2E6YjtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZi5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtpZihhPT09YilyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5ub2RlVHlwZT09PTE/dGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShaLCIiKTpudWxsO2lmKHR5cGVvZiBhPT0ic3RyaW5nIiYmIWJkLnRlc3QoYSkmJihmLnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2V8fCEkLnRlc3QoYSkpJiYhYmpbKGJhLmV4ZWMoYSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXthPWEucmVwbGFjZShfLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKHZhciBjPTAsZD10aGlzLmxlbmd0aDtjPGQ7YysrKXRoaXNbY10ubm9kZVR5cGU9PT0xJiYoZi5jbGVhbkRhdGEodGhpc1tjXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKSx0aGlzW2NdLmlubmVySFRNTD1hKX1jYXRjaChlKXt0aGlzLmVtcHR5KCkuYXBwZW5kKGEpfX1lbHNlIGYuaXNGdW5jdGlvbihhKT90aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKTtjLmh0bWwoYS5jYWxsKHRoaXMsYixjLmh0bWwoKSkpfSk6dGhpcy5lbXB0eSgpLmFwcGVuZChhKTtyZXR1cm4gdGhpc30scmVwbGFjZVdpdGg6ZnVuY3Rpb24oYSl7aWYodGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXt2YXIgYz1mKHRoaXMpLGQ9Yy5odG1sKCk7Yy5yZXBsYWNlV2l0aChhLmNhbGwodGhpcyxiLGQpKX0pO3R5cGVvZiBhIT0ic3RyaW5nIiYmKGE9ZihhKS5kZXRhY2goKSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPXRoaXMubmV4dFNpYmxpbmcsYz10aGlzLnBhcmVudE5vZGU7Zih0aGlzKS5yZW1vdmUoKSxiP2YoYikuYmVmb3JlKGEpOmYoYykuYXBwZW5kKGEpfSl9cmV0dXJuIHRoaXMubGVuZ3RoP3RoaXMucHVzaFN0YWNrKGYoZi5pc0Z1bmN0aW9uKGEpP2EoKTphKSwicmVwbGFjZVdpdGgiLGEpOnRoaXN9LGRldGFjaDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yZW1vdmUoYSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnLGgsaSxqPWFbMF0saz1bXTtpZighZi5zdXBwb3J0LmNoZWNrQ2xvbmUmJmFyZ3VtZW50cy5sZW5ndGg9PT0zJiZ0eXBlb2Ygaj09InN0cmluZyImJmJnLnRlc3QoaikpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YodGhpcykuZG9tTWFuaXAoYSxjLGQsITApfSk7aWYoZi5pc0Z1bmN0aW9uKGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7dmFyIGc9Zih0aGlzKTthWzBdPWouY2FsbCh0aGlzLGUsYz9nLmh0bWwoKTpiKSxnLmRvbU1hbmlwKGEsYyxkKX0pO2lmKHRoaXNbMF0pe2k9aiYmai5wYXJlbnROb2RlLGYuc3VwcG9ydC5wYXJlbnROb2RlJiZpJiZpLm5vZGVUeXBlPT09MTEmJmkuY2hpbGROb2Rlcy5sZW5ndGg9PT10aGlzLmxlbmd0aD9lPXtmcmFnbWVudDppfTplPWYuYnVpbGRGcmFnbWVudChhLHRoaXMsayksaD1lLmZyYWdtZW50LGguY2hpbGROb2Rlcy5sZW5ndGg9PT0xP2c9aD1oLmZpcnN0Q2hpbGQ6Zz1oLmZpcnN0Q2hpbGQ7aWYoZyl7Yz1jJiZmLm5vZGVOYW1lKGcsInRyIik7Zm9yKHZhciBsPTAsbT10aGlzLmxlbmd0aCxuPW0tMTtsPG07bCsrKWQuY2FsbChjP2JsKHRoaXNbbF0sZyk6dGhpc1tsXSxlLmNhY2hlYWJsZXx8bT4xJiZsPG4/Zi5jbG9uZShoLCEwLCEwKTpoKX1rLmxlbmd0aCYmZi5lYWNoKGssYnIpfXJldHVybiB0aGlzfX0pLGYuYnVpbGRGcmFnbWVudD1mdW5jdGlvbihhLGIsZCl7dmFyIGUsZyxoLGksaj1hWzBdO2ImJmJbMF0mJihpPWJbMF0ub3duZXJEb2N1bWVudHx8YlswXSksaS5jcmVhdGVEb2N1bWVudEZyYWdtZW50fHwoaT1jKSxhLmxlbmd0aD09PTEmJnR5cGVvZiBqPT0ic3RyaW5nIiYmai5sZW5ndGg8NTEyJiZpPT09YyYmai5jaGFyQXQoMCk9PT0iPCImJiFiZS50ZXN0KGopJiYoZi5zdXBwb3J0LmNoZWNrQ2xvbmV8fCFiZy50ZXN0KGopKSYmIWYuc3VwcG9ydC51bmtub3duRWxlbXMmJmJmLnRlc3QoaikmJihnPSEwLGg9Zi5mcmFnbWVudHNbal0saCYmaCE9PTEmJihlPWgpKSxlfHwoZT1pLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxmLmNsZWFuKGEsaSxlLGQpKSxnJiYoZi5mcmFnbWVudHNbal09aD9lOjEpO3JldHVybntmcmFnbWVudDplLGNhY2hlYWJsZTpnfX0sZi5mcmFnbWVudHM9e30sZi5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMpe3ZhciBkPVtdLGU9ZihjKSxnPXRoaXMubGVuZ3RoPT09MSYmdGhpc1swXS5wYXJlbnROb2RlO2lmKGcmJmcubm9kZVR5cGU9PT0xMSYmZy5jaGlsZE5vZGVzLmxlbmd0aD09PTEmJmUubGVuZ3RoPT09MSl7ZVtiXSh0aGlzWzBdKTtyZXR1cm4gdGhpc31mb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPShoPjA/dGhpcy5jbG9uZSghMCk6dGhpcykuZ2V0KCk7ZihlW2hdKVtiXShqKSxkPWQuY29uY2F0KGopfXJldHVybiB0aGlzLnB1c2hTdGFjayhkLGEsZS5zZWxlY3Rvcil9fSksZi5leHRlbmQoe2Nsb25lOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hLmNsb25lTm9kZSghMCksZSxnLGg7aWYoKCFmLnN1cHBvcnQubm9DbG9uZUV2ZW50fHwhZi5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSl7Ym4oYSxkKSxlPWJvKGEpLGc9Ym8oZCk7Zm9yKGg9MDtlW2hdOysraClnW2hdJiZibihlW2hdLGdbaF0pfWlmKGIpe2JtKGEsZCk7aWYoYyl7ZT1ibyhhKSxnPWJvKGQpO2ZvcihoPTA7ZVtoXTsrK2gpYm0oZVtoXSxnW2hdKX19ZT1nPW51bGw7cmV0dXJuIGR9LGNsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBnO2I9Ynx8Yyx0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIiYmKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fGMpO3ZhciBoPVtdLGk7Zm9yKHZhciBqPTAsazsoaz1hW2pdKSE9bnVsbDtqKyspe3R5cGVvZiBrPT0ibnVtYmVyIiYmKGsrPSIiKTtpZighayljb250aW51ZTtpZih0eXBlb2Ygaz09InN0cmluZyIpaWYoIWJjLnRlc3Qoaykpaz1iLmNyZWF0ZVRleHROb2RlKGspO2Vsc2V7az1rLnJlcGxhY2UoXywiPCQxPjwvJDI+Iik7dmFyIGw9KGJhLmV4ZWMoayl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCksbT1ialtsXXx8YmouX2RlZmF1bHQsbj1tWzBdLG89Yi5jcmVhdGVFbGVtZW50KCJkaXYiKTtiPT09Yz9iay5hcHBlbmRDaGlsZChvKTpYKGIpLmFwcGVuZENoaWxkKG8pLG8uaW5uZXJIVE1MPW1bMV0rayttWzJdO3doaWxlKG4tLSlvPW8ubGFzdENoaWxkO2lmKCFmLnN1cHBvcnQudGJvZHkpe3ZhciBwPWJiLnRlc3QoaykscT1sPT09InRhYmxlIiYmIXA/by5maXJzdENoaWxkJiZvLmZpcnN0Q2hpbGQuY2hpbGROb2RlczptWzFdPT09Ijx0YWJsZT4iJiYhcD9vLmNoaWxkTm9kZXM6W107Zm9yKGk9cS5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHFbaV0sInRib2R5IikmJiFxW2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZxW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocVtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmJC50ZXN0KGspJiZvLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKCQuZXhlYyhrKVswXSksby5maXJzdENoaWxkKSxrPW8uY2hpbGROb2Rlc312YXIgcjtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYoa1swXSYmdHlwZW9mIChyPWsubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHI7aSsrKWJxKGtbaV0pO2Vsc2UgYnEoayk7ay5ub2RlVHlwZT9oLnB1c2goayk6aD1mLm1lcmdlKGgsayl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiaC50ZXN0KGEudHlwZSl9O2ZvcihqPTA7aFtqXTtqKyspaWYoZSYmZi5ub2RlTmFtZShoW2pdLCJzY3JpcHQiKSYmKCFoW2pdLnR5cGV8fGhbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWUucHVzaChoW2pdLnBhcmVudE5vZGU/aFtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhbal0pOmhbal0pO2Vsc2V7aWYoaFtqXS5ub2RlVHlwZT09PTEpe3ZhciBzPWYuZ3JlcChoW2pdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxnKTtoLnNwbGljZS5hcHBseShoLFtqKzEsMF0uY29uY2F0KHMpKX1kLmFwcGVuZENoaWxkKGhbal0pfX1yZXR1cm4gaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1mLmNhY2hlLGU9Zi5ldmVudC5zcGVjaWFsLGc9Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG87Zm9yKHZhciBoPTAsaTsoaT1hW2hdKSE9bnVsbDtoKyspe2lmKGkubm9kZU5hbWUmJmYubm9EYXRhW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pY29udGludWU7Yz1pW2YuZXhwYW5kb107aWYoYyl7Yj1kW2NdO2lmKGImJmIuZXZlbnRzKXtmb3IodmFyIGogaW4gYi5ldmVudHMpZVtqXT9mLmV2ZW50LnJlbW92ZShpLGopOmYucmVtb3ZlRXZlbnQoaSxqLGIuaGFuZGxlKTtiLmhhbmRsZSYmKGIuaGFuZGxlLmVsZW09bnVsbCl9Zz9kZWxldGUgaVtmLmV4cGFuZG9dOmkucmVtb3ZlQXR0cmlidXRlJiZpLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGRlbGV0ZSBkW2NdfX19fSk7dmFyIGJzPS9hbHBoYVwoW14pXSpcKS9pLGJ0PS9vcGFjaXR5PShbXildKikvLGJ1PS8oW0EtWl18Xm1zKS9nLGJ2PS9eLT9cZCsoPzpweCk/JC9pLGJ3PS9eLT9cZC8sYng9L14oW1wtK10pPShbXC0rLlxkZV0rKS8sYnk9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJ6PVsiTGVmdCIsIlJpZ2h0Il0sYkE9WyJUb3AiLCJCb3R0b20iXSxiQixiQyxiRDtmLmZuLmNzcz1mdW5jdGlvbihhLGMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yJiZjPT09YilyZXR1cm4gdGhpcztyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGMsITAsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSl9LGYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9YkIoYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gYz09PSIiPyIxIjpjfXJldHVybiBhLnN0eWxlLm9wYWNpdHl9fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6Zi5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWEmJmEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCYmISFhLnN0eWxlKXt2YXIgZyxoLGk9Zi5jYW1lbENhc2UoYyksaj1hLnN0eWxlLGs9Zi5jc3NIb29rc1tpXTtjPWYuY3NzUHJvcHNbaV18fGk7aWYoZD09PWIpe2lmKGsmJiJnZXQiaW4gayYmKGc9ay5nZXQoYSwhMSxlKSkhPT1iKXJldHVybiBnO3JldHVybiBqW2NdfWg9dHlwZW9mIGQsaD09PSJzdHJpbmciJiYoZz1ieC5leGVjKGQpKSYmKGQ9KyhnWzFdKzEpKitnWzJdK3BhcnNlRmxvYXQoZi5jc3MoYSxjKSksaD0ibnVtYmVyIik7aWYoZD09bnVsbHx8aD09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47aD09PSJudW1iZXIiJiYhZi5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChsKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnO2M9Zi5jYW1lbENhc2UoYyksZz1mLmNzc0hvb2tzW2NdLGM9Zi5jc3NQcm9wc1tjXXx8YyxjPT09ImNzc0Zsb2F0IiYmKGM9ImZsb2F0Iik7aWYoZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGQpKSE9PWIpcmV0dXJuIGU7aWYoYkIpcmV0dXJuIGJCKGEsYyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9O2Zvcih2YXIgZSBpbiBiKWRbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07Yy5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1kW2VdfX0pLGYuY3VyQ1NTPWYuY3NzLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlO2lmKGMpe2lmKGEub2Zmc2V0V2lkdGghPT0wKXJldHVybiBiRShhLGIsZCk7Zi5zd2FwKGEsYnksZnVuY3Rpb24oKXtlPWJFKGEsYixkKX0pO3JldHVybiBlfX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoIWJ2LnRlc3QoYikpcmV0dXJuIGI7Yj1wYXJzZUZsb2F0KGIpO2lmKGI+PTApcmV0dXJuIGIrInB4In19fSksZi5zdXBwb3J0Lm9wYWNpdHl8fChmLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBidC50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9Zi5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZz1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJmYudHJpbShnLnJlcGxhY2UoYnMsIiIpKT09PSIiKXtjLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7aWYoZCYmIWQuZmlsdGVyKXJldHVybn1jLmZpbHRlcj1icy50ZXN0KGcpP2cucmVwbGFjZShicyxlKTpnKyIgIitlfX0pLGYoZnVuY3Rpb24oKXtmLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBjO2Yuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe2I/Yz1iQihhLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW5SaWdodCIpOmM9YS5zdHlsZS5tYXJnaW5SaWdodH0pO3JldHVybiBjfX0pfSksYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYkM9ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGc7Yz1jLnJlcGxhY2UoYnUsIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoIShlPWEub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykpcmV0dXJuIGI7aWYoZz1lLmdldENvbXB1dGVkU3R5bGUoYSxudWxsKSlkPWcuZ2V0UHJvcGVydHlWYWx1ZShjKSxkPT09IiImJiFmLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYSkmJihkPWYuc3R5bGUoYSxjKSk7cmV0dXJuIGR9KSxjLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihiRD1mdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmPWEuY3VycmVudFN0eWxlJiZhLmN1cnJlbnRTdHlsZVtiXSxnPWEuc3R5bGU7Zj09PW51bGwmJmcmJihlPWdbYl0pJiYoZj1lKSwhYnYudGVzdChmKSYmYncudGVzdChmKSYmKGM9Zy5sZWZ0LGQ9YS5ydW50aW1lU3R5bGUmJmEucnVudGltZVN0eWxlLmxlZnQsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9YS5jdXJyZW50U3R5bGUubGVmdCksZy5sZWZ0PWI9PT0iZm9udFNpemUiPyIxZW0iOmZ8fDAsZj1nLnBpeGVsTGVmdCsicHgiLGcubGVmdD1jLGQmJihhLnJ1bnRpbWVTdHlsZS5sZWZ0PWQpKTtyZXR1cm4gZj09PSIiPyJhdXRvIjpmfSksYkI9YkN8fGJELGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7dmFyIGI9YS5vZmZzZXRXaWR0aCxjPWEub2Zmc2V0SGVpZ2h0O3JldHVybiBiPT09MCYmYz09PTB8fCFmLnN1cHBvcnQucmVsaWFibGVIaWRkZW5PZmZzZXRzJiYoYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxmLmNzcyhhLCJkaXNwbGF5IikpPT09Im5vbmUifSxmLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFmLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9KTt2YXIgYkY9LyUyMC9nLGJHPS9cW1xdJC8sYkg9L1xyP1xuL2csYkk9LyMuKiQvLGJKPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsYks9L14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGRhdGV0aW1lLWxvY2FsfGVtYWlsfGhpZGRlbnxtb250aHxudW1iZXJ8cGFzc3dvcmR8cmFuZ2V8c2VhcmNofHRlbHx0ZXh0fHRpbWV8dXJsfHdlZWspJC9pLGJMPS9eKD86YWJvdXR8YXBwfGFwcFwtc3RvcmFnZXwuK1wtZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sYk09L14oPzpHRVR8SEVBRCkkLyxiTj0vXlwvXC8vLGJPPS9cPy8sYlA9LzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksYlE9L14oPzpzZWxlY3R8dGV4dGFyZWEpL2ksYlI9L1xzKy8sYlM9LyhbPyZdKV89W14mXSovLGJUPS9eKFtcd1wrXC5cLV0rOikoPzpcL1wvKFteXC8/IzpdKikoPzo6KFxkKykpPyk/LyxiVT1mLmZuLmxvYWQsYlY9e30sYlc9e30sYlgsYlksYlo9WyIqLyJdK1siKiJdO3RyeXtiWD1lLmhyZWZ9Y2F0Y2goYiQpe2JYPWMuY3JlYXRlRWxlbWVudCgiYSIpLGJYLmhyZWY9IiIsYlg9YlguaHJlZn1iWT1iVC5leGVjKGJYLnRvTG93ZXJDYXNlKCkpfHxbXSxmLmZuLmV4dGVuZCh7bG9hZDpmdW5jdGlvbihhLGMsZCl7aWYodHlwZW9mIGEhPSJzdHJpbmciJiZiVSlyZXR1cm4gYlUuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKCF0aGlzLmxlbmd0aClyZXR1cm4gdGhpczt2YXIgZT1hLmluZGV4T2YoIiAiKTtpZihlPj0wKXt2YXIgZz1hLnNsaWNlKGUsYS5sZW5ndGgpO2E9YS5zbGljZSgwLGUpfXZhciBoPSJHRVQiO2MmJihmLmlzRnVuY3Rpb24oYyk/KGQ9YyxjPWIpOnR5cGVvZiBjPT0ib2JqZWN0IiYmKGM9Zi5wYXJhbShjLGYuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsKSxoPSJQT1NUIikpO3ZhciBpPXRoaXM7Zi5hamF4KHt1cmw6YSx0eXBlOmgsZGF0YVR5cGU6Imh0bWwiLGRhdGE6Yyxjb21wbGV0ZTpmdW5jdGlvbihhLGIsYyl7Yz1hLnJlc3BvbnNlVGV4dCxhLmlzUmVzb2x2ZWQoKSYmKGEuZG9uZShmdW5jdGlvbihhKXtjPWF9KSxpLmh0bWwoZz9mKCI8ZGl2PiIpLmFwcGVuZChjLnJlcGxhY2UoYlAsIiIpKS5maW5kKGcpOmMpKSxkJiZpLmVhY2goZCxbYyxiLGFdKX19KTtyZXR1cm4gdGhpc30sc2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGYucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50cz9mLm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fGJRLnRlc3QodGhpcy5ub2RlTmFtZSl8fGJLLnRlc3QodGhpcy50eXBlKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1mKHRoaXMpLnZhbCgpO3JldHVybiBjPT1udWxsP251bGw6Zi5pc0FycmF5KGMpP2YubWFwKGMsZnVuY3Rpb24oYSxjKXtyZXR1cm57bmFtZTpiLm5hbWUsdmFsdWU6YS5yZXBsYWNlKGJILCJcclxuIil9fSk6e25hbWU6Yi5uYW1lLHZhbHVlOmMucmVwbGFjZShiSCwiXHJcbiIpfX0pLmdldCgpfX0pLGYuZWFjaCgiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJpbmQoYixhKX19KSxmLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtmW2NdPWZ1bmN0aW9uKGEsZCxlLGcpe2YuaXNGdW5jdGlvbihkKSYmKGc9Z3x8ZSxlPWQsZD1iKTtyZXR1cm4gZi5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpnfSl9fSksZi5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBmLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtiP2NiKGEsZi5hamF4U2V0dGluZ3MpOihiPWEsYT1mLmFqYXhTZXR0aW5ncyksY2IoYSxiKTtyZXR1cm4gYX0sYWpheFNldHRpbmdzOnt1cmw6YlgsaXNMb2NhbDpiTC50ZXN0KGJZWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Ylp9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpmLnBhcnNlSlNPTiwidGV4dCB4bWwiOmYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6Yl8oYlYpLGFqYXhUcmFuc3BvcnQ6Yl8oYlcpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB3KGEsYyxsLG0pe2lmKHMhPT0yKXtzPTIscSYmY2xlYXJUaW1lb3V0KHEpLHA9YixuPW18fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowO3ZhciBvLHIsdSx3PWMseD1sP2NkKGQsdixsKTpiLHksejtpZihhPj0yMDAmJmE8MzAwfHxhPT09MzA0KXtpZihkLmlmTW9kaWZpZWQpe2lmKHk9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKWYubGFzdE1vZGlmaWVkW2tdPXk7aWYoej12LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIikpZi5ldGFnW2tdPXp9aWYoYT09PTMwNCl3PSJub3Rtb2RpZmllZCIsbz0hMDtlbHNlIHRyeXtyPWNlKGQseCksdz0ic3VjY2VzcyIsbz0hMH1jYXRjaChBKXt3PSJwYXJzZXJlcnJvciIsdT1BfX1lbHNle3U9dztpZighd3x8YSl3PSJlcnJvciIsYTwwJiYoYT0wKX12LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0iIisoY3x8dyksbz9oLnJlc29sdmVXaXRoKGUsW3Isdyx2XSk6aC5yZWplY3RXaXRoKGUsW3Ysdyx1XSksdi5zdGF0dXNDb2RlKGopLGo9Yix0JiZnLnRyaWdnZXIoImFqYXgiKyhvPyJTdWNjZXNzIjoiRXJyb3IiKSxbdixkLG8/cjp1XSksaS5maXJlV2l0aChlLFt2LHddKSx0JiYoZy50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGRdKSwtLWYuYWN0aXZlfHxmLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfX10eXBlb2YgYT09Im9iamVjdCImJihjPWEsYT1iKSxjPWN8fHt9O3ZhciBkPWYuYWpheFNldHVwKHt9LGMpLGU9ZC5jb250ZXh0fHxkLGc9ZSE9PWQmJihlLm5vZGVUeXBlfHxlIGluc3RhbmNlb2YgZik/ZihlKTpmLmV2ZW50LGg9Zi5EZWZlcnJlZCgpLGk9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksaj1kLnN0YXR1c0NvZGV8fHt9LGssbD17fSxtPXt9LG4sbyxwLHEscixzPTAsdCx1LHY9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXMpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPW1bY109bVtjXXx8YSxsW2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBzPT09Mj9uOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHM9PT0yKXtpZighbyl7bz17fTt3aGlsZShjPWJKLmV4ZWMobikpb1tjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1vW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtzfHwoZC5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiLHAmJnAuYWJvcnQoYSksdygwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHYpLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsdi5jb21wbGV0ZT1pLmFkZCx2LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYoczwyKWZvcihiIGluIGEpaltiXT1baltiXSxhW2JdXTtlbHNlIGI9YVt2LnN0YXR1c10sdi50aGVuKGIsYil9cmV0dXJuIHRoaXN9LGQudXJsPSgoYXx8ZC51cmwpKyIiKS5yZXBsYWNlKGJJLCIiKS5yZXBsYWNlKGJOLGJZWzFdKyIvLyIpLGQuZGF0YVR5cGVzPWYudHJpbShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlIpLGQuY3Jvc3NEb21haW49PW51bGwmJihyPWJULmV4ZWMoZC51cmwudG9Mb3dlckNhc2UoKSksZC5jcm9zc0RvbWFpbj0hKCFyfHxyWzFdPT1iWVsxXSYmclsyXT09YllbMl0mJihyWzNdfHwoclsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShiWVszXXx8KGJZWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmdHlwZW9mIGQuZGF0YSE9InN0cmluZyImJihkLmRhdGE9Zi5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLGNhKGJWLGQsYyx2KTtpZihzPT09MilyZXR1cm4hMTt0PWQuZ2xvYmFsLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IWJNLnRlc3QoZC50eXBlKSx0JiZmLmFjdGl2ZSsrPT09MCYmZi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighZC5oYXNDb250ZW50KXtkLmRhdGEmJihkLnVybCs9KGJPLnRlc3QoZC51cmwpPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSxrPWQudXJsO2lmKGQuY2FjaGU9PT0hMSl7dmFyIHg9Zi5ub3coKSx5PWQudXJsLnJlcGxhY2UoYlMsIiQxXz0iK3gpO2QudXJsPXkrKHk9PT1kLnVybD8oYk8udGVzdChkLnVybCk/IiYiOiI/IikrIl89Iit4OiIiKX19KGQuZGF0YSYmZC5oYXNDb250ZW50JiZkLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksZC5pZk1vZGlmaWVkJiYoaz1rfHxkLnVybCxmLmxhc3RNb2RpZmllZFtrXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRba10pLGYuZXRhZ1trXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixmLmV0YWdba10pKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoZC5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitiWisiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSk7Zm9yKHUgaW4gZC5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcih1LGQuaGVhZGVyc1t1XSk7aWYoZC5iZWZvcmVTZW5kJiYoZC5iZWZvcmVTZW5kLmNhbGwoZSx2LGQpPT09ITF8fHM9PT0yKSl7di5hYm9ydCgpO3JldHVybiExfWZvcih1IGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbdV0oZFt1XSk7cD1jYShiVyxkLGMsdik7aWYoIXApdygtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt2LnJlYWR5U3RhdGU9MSx0JiZnLnRyaWdnZXIoImFqYXhTZW5kIixbdixkXSksZC5hc3luYyYmZC50aW1lb3V0PjAmJihxPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtzPTEscC5zZW5kKGwsdyl9Y2F0Y2goeil7czwyP3coLTEseik6Zi5lcnJvcih6KX19cmV0dXJuIHZ9LHBhcmFtOmZ1bmN0aW9uKGEsYyl7dmFyIGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9Zi5pc0Z1bmN0aW9uKGIpP2IoKTpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtjPT09YiYmKGM9Zi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpO2lmKGYuaXNBcnJheShhKXx8YS5qcXVlcnkmJiFmLmlzUGxhaW5PYmplY3QoYSkpZi5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHZhciBnIGluIGEpY2MoZyxhW2ddLGMsZSk7cmV0dXJuIGQuam9pbigiJiIpLnJlcGxhY2UoYkYsIisiKX19KSxmLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e319KTt2YXIgY2Y9Zi5ub3coKSxjZz0vKFw9KVw/KCZ8JCl8XD9cPy9pO2YuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZi5leHBhbmRvKyJfIitjZisrfX0pLGYuYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlPWIuY29udGVudFR5cGU9PT0iYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiYmdHlwZW9mIGIuZGF0YT09InN0cmluZyI7aWYoYi5kYXRhVHlwZXNbMF09PT0ianNvbnAifHxiLmpzb25wIT09ITEmJihjZy50ZXN0KGIudXJsKXx8ZSYmY2cudGVzdChiLmRhdGEpKSl7dmFyIGcsaD1iLmpzb25wQ2FsbGJhY2s9Zi5pc0Z1bmN0aW9uKGIuanNvbnBDYWxsYmFjayk/Yi5qc29ucENhbGxiYWNrKCk6Yi5qc29ucENhbGxiYWNrLGk9YVtoXSxqPWIudXJsLGs9Yi5kYXRhLGw9IiQxIitoKyIkMiI7Yi5qc29ucCE9PSExJiYoaj1qLnJlcGxhY2UoY2csbCksYi51cmw9PT1qJiYoZSYmKGs9ay5yZXBsYWNlKGNnLGwpKSxiLmRhdGE9PT1rJiYoais9KC9cPy8udGVzdChqKT8iJiI6Ij8iKStiLmpzb25wKyI9IitoKSkpLGIudXJsPWosYi5kYXRhPWssYVtoXT1mdW5jdGlvbihhKXtnPVthXX0sZC5hbHdheXMoZnVuY3Rpb24oKXthW2hdPWksZyYmZi5pc0Z1bmN0aW9uKGkpJiZhW2hdKGdbMF0pfSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7Z3x8Zi5lcnJvcihoKyIgd2FzIG5vdCBjYWxsZWQiKTtyZXR1cm4gZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iO3JldHVybiJzY3JpcHQifX0pLGYuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovamF2YXNjcmlwdHxlY21hc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtmLmdsb2JhbEV2YWwoYSk7cmV0dXJuIGF9fX0pLGYuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXthLmNhY2hlPT09YiYmKGEuY2FjaGU9ITEpLGEuY3Jvc3NEb21haW4mJihhLnR5cGU9IkdFVCIsYS5nbG9iYWw9ITEpfSksZi5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2lmKGEuY3Jvc3NEb21haW4pe3ZhciBkLGU9Yy5oZWFkfHxjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGMuZG9jdW1lbnRFbGVtZW50O3JldHVybntzZW5kOmZ1bmN0aW9uKGYsZyl7ZD1jLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLGQuYXN5bmM9ImFzeW5jIixhLnNjcmlwdENoYXJzZXQmJihkLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KSxkLnNyYz1hLnVybCxkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGMpe2lmKGN8fCFkLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoZC5yZWFkeVN0YXRlKSlkLm9ubG9hZD1kLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGUmJmQucGFyZW50Tm9kZSYmZS5yZW1vdmVDaGlsZChkKSxkPWIsY3x8ZygyMDAsInN1Y2Nlc3MiKX0sZS5pbnNlcnRCZWZvcmUoZCxlLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQub25sb2FkKDAsMSl9fX19KTt2YXIgY2g9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7Zm9yKHZhciBhIGluIGNqKWNqW2FdKDAsMSl9OiExLGNpPTAsY2o7Zi5hamF4U2V0dGluZ3MueGhyPWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJmNrKCl8fGNsKCl9OmNrLGZ1bmN0aW9uKGEpe2YuZXh0ZW5kKGYuc3VwcG9ydCx7YWpheDohIWEsY29yczohIWEmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gYX0pfShmLmFqYXhTZXR0aW5ncy54aHIoKSksZi5zdXBwb3J0LmFqYXgmJmYuYWpheFRyYW5zcG9ydChmdW5jdGlvbihjKXtpZighYy5jcm9zc0RvbWFpbnx8Zi5zdXBwb3J0LmNvcnMpe3ZhciBkO3JldHVybntzZW5kOmZ1bmN0aW9uKGUsZyl7dmFyIGg9Yy54aHIoKSxpLGo7Yy51c2VybmFtZT9oLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMsYy51c2VybmFtZSxjLnBhc3N3b3JkKTpoLm9wZW4oYy50eXBlLGMudXJsLGMuYXN5bmMpO2lmKGMueGhyRmllbGRzKWZvcihqIGluIGMueGhyRmllbGRzKWhbal09Yy54aHJGaWVsZHNbal07Yy5taW1lVHlwZSYmaC5vdmVycmlkZU1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUoYy5taW1lVHlwZSksIWMuY3Jvc3NEb21haW4mJiFlWyJYLVJlcXVlc3RlZC1XaXRoIl0mJihlWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7dHJ5e2ZvcihqIGluIGUpaC5zZXRSZXF1ZXN0SGVhZGVyKGosZVtqXSl9Y2F0Y2goayl7fWguc2VuZChjLmhhc0NvbnRlbnQmJmMuZGF0YXx8bnVsbCksZD1mdW5jdGlvbihhLGUpe3ZhciBqLGssbCxtLG47dHJ5e2lmKGQmJihlfHxoLnJlYWR5U3RhdGU9PT00KSl7ZD1iLGkmJihoLm9ucmVhZHlzdGF0ZWNoYW5nZT1mLm5vb3AsY2gmJmRlbGV0ZSBjaltpXSk7aWYoZSloLnJlYWR5U3RhdGUhPT00JiZoLmFib3J0KCk7ZWxzZXtqPWguc3RhdHVzLGw9aC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSxtPXt9LG49aC5yZXNwb25zZVhNTCxuJiZuLmRvY3VtZW50RWxlbWVudCYmKG0ueG1sPW4pLG0udGV4dD1oLnJlc3BvbnNlVGV4dDt0cnl7az1oLnN0YXR1c1RleHR9Y2F0Y2gobyl7az0iIn0haiYmYy5pc0xvY2FsJiYhYy5jcm9zc0RvbWFpbj9qPW0udGV4dD8yMDA6NDA0Omo9PT0xMjIzJiYoaj0yMDQpfX19Y2F0Y2gocCl7ZXx8ZygtMSxwKX1tJiZnKGosayxtLGwpfSwhYy5hc3luY3x8aC5yZWFkeVN0YXRlPT09ND9kKCk6KGk9KytjaSxjaCYmKGNqfHwoY2o9e30sZihhKS51bmxvYWQoY2gpKSxjaltpXT1kKSxoLm9ucmVhZHlzdGF0ZWNoYW5nZT1kKX0sYWJvcnQ6ZnVuY3Rpb24oKXtkJiZkKDAsMSl9fX19KTt2YXIgY209e30sY24sY28sY3A9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGNxPS9eKFsrXC1dPSk/KFtcZCsuXC1dKykoW2EteiVdKikkL2ksY3IsY3M9W1siaGVpZ2h0IiwibWFyZ2luVG9wIiwibWFyZ2luQm90dG9tIiwicGFkZGluZ1RvcCIsInBhZGRpbmdCb3R0b20iXSxbIndpZHRoIiwibWFyZ2luTGVmdCIsIm1hcmdpblJpZ2h0IiwicGFkZGluZ0xlZnQiLCJwYWRkaW5nUmlnaHQiXSxbIm9wYWNpdHkiXV0sY3Q7Zi5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdygic2hvdyIsMyksYSxiLGMpO2Zvcih2YXIgZz0wLGg9dGhpcy5sZW5ndGg7ZzxoO2crKylkPXRoaXNbZ10sZC5zdHlsZSYmKGU9ZC5zdHlsZS5kaXNwbGF5LCFmLl9kYXRhKGQsIm9sZGRpc3BsYXkiKSYmZT09PSJub25lIiYmKGU9ZC5zdHlsZS5kaXNwbGF5PSIiKSxlPT09IiImJmYuY3NzKGQsImRpc3BsYXkiKT09PSJub25lIiYmZi5fZGF0YShkLCJvbGRkaXNwbGF5IixjeChkLm5vZGVOYW1lKSkpO2ZvcihnPTA7ZzxoO2crKyl7ZD10aGlzW2ddO2lmKGQuc3R5bGUpe2U9ZC5zdHlsZS5kaXNwbGF5O2lmKGU9PT0iInx8ZT09PSJub25lIilkLnN0eWxlLmRpc3BsYXk9Zi5fZGF0YShkLCJvbGRkaXNwbGF5Iil8fCIifX1yZXR1cm4gdGhpc30saGlkZTpmdW5jdGlvbihhLGIsYyl7aWYoYXx8YT09PTApcmV0dXJuIHRoaXMuYW5pbWF0ZShjdygiaGlkZSIsMyksYSxiLGMpO3ZhciBkLGUsZz0wLGg9dGhpcy5sZW5ndGg7Zm9yKDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1mLmNzcyhkLCJkaXNwbGF5IiksZSE9PSJub25lIiYmIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGUpKTtmb3IoZz0wO2c8aDtnKyspdGhpc1tnXS5zdHlsZSYmKHRoaXNbZ10uc3R5bGUuZGlzcGxheT0ibm9uZSIpO3JldHVybiB0aGlzfSxfdG9nZ2xlOmYuZm4udG9nZ2xlLHRvZ2dsZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dHlwZW9mIGE9PSJib29sZWFuIjtmLmlzRnVuY3Rpb24oYSkmJmYuaXNGdW5jdGlvbihiKT90aGlzLl90b2dnbGUuYXBwbHkodGhpcyxhcmd1bWVudHMpOmE9PW51bGx8fGQ/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9ZD9hOmYodGhpcykuaXMoIjpoaWRkZW4iKTtmKHRoaXMpW2I/InNob3ciOiJoaWRlIl0oKX0pOnRoaXMuYW5pbWF0ZShjdygidG9nZ2xlIiwzKSxhLGIsYyk7cmV0dXJuIHRoaXN9LGZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OmJ9LGEsYyxkKX0sYW5pbWF0ZTpmdW5jdGlvbihhLGIsYyxkKXtmdW5jdGlvbiBnKCl7ZS5xdWV1ZT09PSExJiZmLl9tYXJrKHRoaXMpO3ZhciBiPWYuZXh0ZW5kKHt9LGUpLGM9dGhpcy5ub2RlVHlwZT09PTEsZD1jJiZmKHRoaXMpLmlzKCI6aGlkZGVuIiksZyxoLGksaixrLGwsbSxuLG87Yi5hbmltYXRlZFByb3BlcnRpZXM9e307Zm9yKGkgaW4gYSl7Zz1mLmNhbWVsQ2FzZShpKSxpIT09ZyYmKGFbZ109YVtpXSxkZWxldGUgYVtpXSksaD1hW2ddLGYuaXNBcnJheShoKT8oYi5hbmltYXRlZFByb3BlcnRpZXNbZ109aFsxXSxoPWFbZ109aFswXSk6Yi5hbmltYXRlZFByb3BlcnRpZXNbZ109Yi5zcGVjaWFsRWFzaW5nJiZiLnNwZWNpYWxFYXNpbmdbZ118fGIuZWFzaW5nfHwic3dpbmciO2lmKGg9PT0iaGlkZSImJmR8fGg9PT0ic2hvdyImJiFkKXJldHVybiBiLmNvbXBsZXRlLmNhbGwodGhpcyk7YyYmKGc9PT0iaGVpZ2h0Inx8Zz09PSJ3aWR0aCIpJiYoYi5vdmVyZmxvdz1bdGhpcy5zdHlsZS5vdmVyZmxvdyx0aGlzLnN0eWxlLm92ZXJmbG93WCx0aGlzLnN0eWxlLm92ZXJmbG93WV0sZi5jc3ModGhpcywiZGlzcGxheSIpPT09ImlubGluZSImJmYuY3NzKHRoaXMsImZsb2F0Iik9PT0ibm9uZSImJighZi5zdXBwb3J0LmlubGluZUJsb2NrTmVlZHNMYXlvdXR8fGN4KHRoaXMubm9kZU5hbWUpPT09ImlubGluZSI/dGhpcy5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2siOnRoaXMuc3R5bGUuem9vbT0xKSl9Yi5vdmVyZmxvdyE9bnVsbCYmKHRoaXMuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpO2ZvcihpIGluIGEpaj1uZXcgZi5meCh0aGlzLGIsaSksaD1hW2ldLGNwLnRlc3QoaCk/KG89Zi5fZGF0YSh0aGlzLCJ0b2dnbGUiK2kpfHwoaD09PSJ0b2dnbGUiP2Q/InNob3ciOiJoaWRlIjowKSxvPyhmLl9kYXRhKHRoaXMsInRvZ2dsZSIraSxvPT09InNob3ciPyJoaWRlIjoic2hvdyIpLGpbb10oKSk6altoXSgpKTooaz1jcS5leGVjKGgpLGw9ai5jdXIoKSxrPyhtPXBhcnNlRmxvYXQoa1syXSksbj1rWzNdfHwoZi5jc3NOdW1iZXJbaV0/IiI6InB4IiksbiE9PSJweCImJihmLnN0eWxlKHRoaXMsaSwobXx8MSkrbiksbD0obXx8MSkvai5jdXIoKSpsLGYuc3R5bGUodGhpcyxpLGwrbikpLGtbMV0mJihtPShrWzFdPT09Ii09Ij8tMToxKSptK2wpLGouY3VzdG9tKGwsbSxuKSk6ai5jdXN0b20obCxoLCIiKSk7cmV0dXJuITB9dmFyIGU9Zi5zcGVlZChiLGMsZCk7aWYoZi5pc0VtcHR5T2JqZWN0KGEpKXJldHVybiB0aGlzLmVhY2goZS5jb21wbGV0ZSxbITFdKTthPWYuZXh0ZW5kKHt9LGEpO3JldHVybiBlLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZS5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGMsZCl7dHlwZW9mIGEhPSJzdHJpbmciJiYoZD1jLGM9YSxhPWIpLGMmJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChhLGIsYyl7dmFyIGU9YltjXTtmLnJlbW92ZURhdGEoYSxjLCEwKSxlLnN0b3AoZCl9dmFyIGIsYz0hMSxlPWYudGltZXJzLGc9Zi5fZGF0YSh0aGlzKTtkfHxmLl91bm1hcmsoITAsdGhpcyk7aWYoYT09bnVsbClmb3IoYiBpbiBnKWdbYl0uc3RvcCYmYi5pbmRleE9mKCIucnVuIik9PT1iLmxlbmd0aC00JiZoKHRoaXMsZyxiKTtlbHNlIGdbYj1hKyIucnVuIl0mJmdbYl0uc3RvcCYmaCh0aGlzLGcsYik7Zm9yKGI9ZS5sZW5ndGg7Yi0tOyllW2JdLmVsZW09PT10aGlzJiYoYT09bnVsbHx8ZVtiXS5xdWV1ZT09PWEpJiYoZD9lW2JdKCEwKTplW2JdLnNhdmVTdGF0ZSgpLGM9ITAsZS5zcGxpY2UoYiwxKSk7KCFkfHwhYykmJmYuZGVxdWV1ZSh0aGlzLGEpfSl9fSksZi5lYWNoKHtzbGlkZURvd246Y3coInNob3ciLDEpLHNsaWRlVXA6Y3coImhpZGUiLDEpLHNsaWRlVG9nZ2xlOmN3KCJ0b2dnbGUiLDEpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGEsYyxkKXtyZXR1cm4gdGhpcy5hbmltYXRlKGIsYSxjLGQpfX0pLGYuZXh0ZW5kKHtzcGVlZDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmdHlwZW9mIGE9PSJvYmplY3QiP2YuZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8Zi5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFmLmlzRnVuY3Rpb24oYikmJmJ9O2QuZHVyYXRpb249Zi5meC5vZmY/MDp0eXBlb2YgZC5kdXJhdGlvbj09Im51bWJlciI/ZC5kdXJhdGlvbjpkLmR1cmF0aW9uIGluIGYuZnguc3BlZWRzP2YuZnguc3BlZWRzW2QuZHVyYXRpb25dOmYuZnguc3BlZWRzLl9kZWZhdWx0O2lmKGQucXVldWU9PW51bGx8fGQucXVldWU9PT0hMClkLnF1ZXVlPSJmeCI7ZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKGEpe2YuaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZT9mLmRlcXVldWUodGhpcyxkLnF1ZXVlKTphIT09ITEmJmYuX3VubWFyayh0aGlzKX07cmV0dXJuIGR9LGVhc2luZzp7bGluZWFyOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBjK2QqYX0sc3dpbmc6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuKC1NYXRoLmNvcyhhKk1hdGguUEkpLzIrLjUpKmQrY319LHRpbWVyczpbXSxmeDpmdW5jdGlvbihhLGIsYyl7dGhpcy5vcHRpb25zPWIsdGhpcy5lbGVtPWEsdGhpcy5wcm9wPWMsYi5vcmlnPWIub3JpZ3x8e319fSksZi5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSwoZi5meC5zdGVwW3RoaXMucHJvcF18fGYuZnguc3RlcC5fZGVmYXVsdCkodGhpcyl9LGN1cjpmdW5jdGlvbigpe2lmKHRoaXMuZWxlbVt0aGlzLnByb3BdIT1udWxsJiYoIXRoaXMuZWxlbS5zdHlsZXx8dGhpcy5lbGVtLnN0eWxlW3RoaXMucHJvcF09PW51bGwpKXJldHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXTt2YXIgYSxiPWYuY3NzKHRoaXMuZWxlbSx0aGlzLnByb3ApO3JldHVybiBpc05hTihhPXBhcnNlRmxvYXQoYikpPyFifHxiPT09ImF1dG8iPzA6YjphfSxjdXN0b206ZnVuY3Rpb24oYSxjLGQpe2Z1bmN0aW9uIGgoYSl7cmV0dXJuIGUuc3RlcChhKX12YXIgZT10aGlzLGc9Zi5meDt0aGlzLnN0YXJ0VGltZT1jdHx8Y3UoKSx0aGlzLmVuZD1jLHRoaXMubm93PXRoaXMuc3RhcnQ9YSx0aGlzLnBvcz10aGlzLnN0YXRlPTAsdGhpcy51bml0PWR8fHRoaXMudW5pdHx8KGYuY3NzTnVtYmVyW3RoaXMucHJvcF0/IiI6InB4IiksaC5xdWV1ZT10aGlzLm9wdGlvbnMucXVldWUsaC5lbGVtPXRoaXMuZWxlbSxoLnNhdmVTdGF0ZT1mdW5jdGlvbigpe2Uub3B0aW9ucy5oaWRlJiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3ApPT09YiYmZi5fZGF0YShlLmVsZW0sImZ4c2hvdyIrZS5wcm9wLGUuc3RhcnQpfSxoKCkmJmYudGltZXJzLnB1c2goaCkmJiFjciYmKGNyPXNldEludGVydmFsKGcudGljayxnLmludGVydmFsKSl9LHNob3c6ZnVuY3Rpb24oKXt2YXIgYT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApO3RoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09YXx8Zi5zdHlsZSh0aGlzLmVsZW0sdGhpcy5wcm9wKSx0aGlzLm9wdGlvbnMuc2hvdz0hMCxhIT09Yj90aGlzLmN1c3RvbSh0aGlzLmN1cigpLGEpOnRoaXMuY3VzdG9tKHRoaXMucHJvcD09PSJ3aWR0aCJ8fHRoaXMucHJvcD09PSJoZWlnaHQiPzE6MCx0aGlzLmN1cigpKSxmKHRoaXMuZWxlbSkuc2hvdygpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1mLl9kYXRhKHRoaXMuZWxlbSwiZnhzaG93Iit0aGlzLnByb3ApfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5oaWRlPSEwLHRoaXMuY3VzdG9tKHRoaXMuY3VyKCksMCl9LHN0ZXA6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU9Y3R8fGN1KCksZz0hMCxoPXRoaXMuZWxlbSxpPXRoaXMub3B0aW9ucztpZihhfHxlPj1pLmR1cmF0aW9uK3RoaXMuc3RhcnRUaW1lKXt0aGlzLm5vdz10aGlzLmVuZCx0aGlzLnBvcz10aGlzLnN0YXRlPTEsdGhpcy51cGRhdGUoKSxpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdPSEwO2ZvcihiIGluIGkuYW5pbWF0ZWRQcm9wZXJ0aWVzKWkuYW5pbWF0ZWRQcm9wZXJ0aWVzW2JdIT09ITAmJihnPSExKTtpZihnKXtpLm92ZXJmbG93IT1udWxsJiYhZi5zdXBwb3J0LnNocmlua1dyYXBCbG9ja3MmJmYuZWFjaChbIiIsIlgiLCJZIl0sZnVuY3Rpb24oYSxiKXtoLnN0eWxlWyJvdmVyZmxvdyIrYl09aS5vdmVyZmxvd1thXX0pLGkuaGlkZSYmZihoKS5oaWRlKCk7aWYoaS5oaWRlfHxpLnNob3cpZm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpZi5zdHlsZShoLGIsaS5vcmlnW2JdKSxmLnJlbW92ZURhdGEoaCwiZnhzaG93IitiLCEwKSxmLnJlbW92ZURhdGEoaCwidG9nZ2xlIitiLCEwKTtkPWkuY29tcGxldGUsZCYmKGkuY29tcGxldGU9ITEsZC5jYWxsKGgpKX1yZXR1cm4hMX1pLmR1cmF0aW9uPT1JbmZpbml0eT90aGlzLm5vdz1lOihjPWUtdGhpcy5zdGFydFRpbWUsdGhpcy5zdGF0ZT1jL2kuZHVyYXRpb24sdGhpcy5wb3M9Zi5lYXNpbmdbaS5hbmltYXRlZFByb3BlcnRpZXNbdGhpcy5wcm9wXV0odGhpcy5zdGF0ZSxjLDAsMSxpLmR1cmF0aW9uKSx0aGlzLm5vdz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLnBvcyksdGhpcy51cGRhdGUoKTtyZXR1cm4hMH19LGYuZXh0ZW5kKGYuZngse3RpY2s6ZnVuY3Rpb24oKXt2YXIgYSxiPWYudGltZXJzLGM9MDtmb3IoO2M8Yi5sZW5ndGg7YysrKWE9YltjXSwhYSgpJiZiW2NdPT09YSYmYi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxmLmZ4LnN0b3AoKX0saW50ZXJ2YWw6MTMsc3RvcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoY3IpLGNyPW51bGx9LHNwZWVkczp7c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxzdGVwOntvcGFjaXR5OmZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLCJvcGFjaXR5IixhLm5vdyl9LF9kZWZhdWx0OmZ1bmN0aW9uKGEpe2EuZWxlbS5zdHlsZSYmYS5lbGVtLnN0eWxlW2EucHJvcF0hPW51bGw/YS5lbGVtLnN0eWxlW2EucHJvcF09YS5ub3crYS51bml0OmEuZWxlbVthLnByb3BdPWEubm93fX19KSxmLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7Zi5meC5zdGVwW2JdPWZ1bmN0aW9uKGEpe2Yuc3R5bGUoYS5lbGVtLGIsTWF0aC5tYXgoMCxhLm5vdykpfX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGN5PS9edCg/OmFibGV8ZHxoKSQvaSxjej0vXig/OmJvZHl8aHRtbCkkL2k7ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBjLmRvY3VtZW50RWxlbWVudD9mLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdLGM7aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dHJ5e2M9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChkKXt9dmFyIGU9Yi5vd25lckRvY3VtZW50LGc9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoIWN8fCFmLmNvbnRhaW5zKGcsYikpcmV0dXJuIGM/e3RvcDpjLnRvcCxsZWZ0OmMubGVmdH06e3RvcDowLGxlZnQ6MH07dmFyIGg9ZS5ib2R5LGk9Y0EoZSksaj1nLmNsaWVudFRvcHx8aC5jbGllbnRUb3B8fDAsaz1nLmNsaWVudExlZnR8fGguY2xpZW50TGVmdHx8MCxsPWkucGFnZVlPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxUb3B8fGguc2Nyb2xsVG9wLG09aS5wYWdlWE9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZnLnNjcm9sbExlZnR8fGguc2Nyb2xsTGVmdCxuPWMudG9wK2wtaixvPWMubGVmdCttLWs7cmV0dXJue3RvcDpuLGxlZnQ6b319OmYuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dmFyIGMsZD1iLm9mZnNldFBhcmVudCxlPWIsZz1iLm93bmVyRG9jdW1lbnQsaD1nLmRvY3VtZW50RWxlbWVudCxpPWcuYm9keSxqPWcuZGVmYXVsdFZpZXcsaz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGw9Yi5vZmZzZXRUb3AsbT1iLm9mZnNldExlZnQ7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmYiE9PWkmJmIhPT1oKXtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7Yz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGwtPWIuc2Nyb2xsVG9wLG0tPWIuc2Nyb2xsTGVmdCxiPT09ZCYmKGwrPWIub2Zmc2V0VG9wLG0rPWIub2Zmc2V0TGVmdCxmLnN1cHBvcnQuZG9lc05vdEFkZEJvcmRlciYmKCFmLnN1cHBvcnQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHN8fCFjeS50ZXN0KGIubm9kZU5hbWUpKSYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGU9ZCxkPWIub2Zmc2V0UGFyZW50KSxmLnN1cHBvcnQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZjLm92ZXJmbG93IT09InZpc2libGUiJiYobCs9cGFyc2VGbG9hdChjLmJvcmRlclRvcFdpZHRoKXx8MCxtKz1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKXx8MCksaz1jfWlmKGsucG9zaXRpb249PT0icmVsYXRpdmUifHxrLnBvc2l0aW9uPT09InN0YXRpYyIpbCs9aS5vZmZzZXRUb3AsbSs9aS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5maXhlZFBvc2l0aW9uJiZrLnBvc2l0aW9uPT09ImZpeGVkIiYmKGwrPU1hdGgubWF4KGguc2Nyb2xsVG9wLGkuc2Nyb2xsVG9wKSxtKz1NYXRoLm1heChoLnNjcm9sbExlZnQsaS5zY3JvbGxMZWZ0KSk7cmV0dXJue3RvcDpsLGxlZnQ6bX19LGYub2Zmc2V0PXtib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGM9YS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCk7cmV0dXJue3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Zi5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPWYoYSksZz1lLm9mZnNldCgpLGg9Zi5jc3MoYSwidG9wIiksaT1mLmNzcyhhLCJsZWZ0Iiksaj0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmZi5pbkFycmF5KCJhdXRvIixbaCxpXSk+LTEsaz17fSxsPXt9LG0sbjtqPyhsPWUucG9zaXRpb24oKSxtPWwudG9wLG49bC5sZWZ0KToobT1wYXJzZUZsb2F0KGgpfHwwLG49cGFyc2VGbG9hdChpKXx8MCksZi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGcpKSxiLnRvcCE9bnVsbCYmKGsudG9wPWIudG9wLWcudG9wK20pLGIubGVmdCE9bnVsbCYmKGsubGVmdD1iLmxlZnQtZy5sZWZ0K24pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGspOmUuY3NzKGspfX0sZi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksYz10aGlzLm9mZnNldCgpLGQ9Y3oudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2MudG9wLT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjLmxlZnQtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCxkLnRvcCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJUb3BXaWR0aCIpKXx8MCxkLmxlZnQrPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIikpfHwwO3JldHVybnt0b3A6Yy50b3AtZC50b3AsbGVmdDpjLmxlZnQtZC5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGMuYm9keTt3aGlsZShhJiYhY3oudGVzdChhLm5vZGVOYW1lKSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KSxmLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD0ic2Nyb2xsIitjO2YuZm5bZF09ZnVuY3Rpb24oYyl7dmFyIGUsZztpZihjPT09Yil7ZT10aGlzWzBdO2lmKCFlKXJldHVybiBudWxsO2c9Y0EoZSk7cmV0dXJuIGc/InBhZ2VYT2Zmc2V0ImluIGc/Z1thPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Zi5zdXBwb3J0LmJveE1vZGVsJiZnLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8Zy5kb2N1bWVudC5ib2R5W2RdOmVbZF19cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2c9Y0EodGhpcyksZz9nLnNjcm9sbFRvKGE/ZihnKS5zY3JvbGxMZWZ0KCk6YyxhP2M6ZihnKS5zY3JvbGxUb3AoKSk6dGhpc1tkXT1jfSl9fSksZi5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGMpe3ZhciBkPWMudG9Mb3dlckNhc2UoKTtmLmZuWyJpbm5lciIrY109ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhP2Euc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGQsInBhZGRpbmciKSk6dGhpc1tkXSgpOm51bGx9LGYuZm5bIm91dGVyIitjXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiP2Iuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGQsYT8ibWFyZ2luIjoiYm9yZGVyIikpOnRoaXNbZF0oKTpudWxsfSxmLmZuW2RdPWZ1bmN0aW9uKGEpe3ZhciBlPXRoaXNbMF07aWYoIWUpcmV0dXJuIGE9PW51bGw/bnVsbDp0aGlzO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Y1tkXShhLmNhbGwodGhpcyxiLGNbZF0oKSkpfSk7aWYoZi5pc1dpbmRvdyhlKSl7dmFyIGc9ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10saD1lLmRvY3VtZW50LmJvZHk7cmV0dXJuIGUuZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IiYmZ3x8aCYmaFsiY2xpZW50IitjXXx8Z31pZihlLm5vZGVUeXBlPT09OSlyZXR1cm4gTWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10sZS5ib2R5WyJzY3JvbGwiK2NdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2NdLGUuYm9keVsib2Zmc2V0IitjXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitjXSk7aWYoYT09PWIpe3ZhciBpPWYuY3NzKGUsZCksaj1wYXJzZUZsb2F0KGkpO3JldHVybiBmLmlzTnVtZXJpYyhqKT9qOml9cmV0dXJuIHRoaXMuY3NzKGQsdHlwZW9mIGE9PSJzdHJpbmciP2E6YSsicHgiKX19KSxhLmpRdWVyeT1hLiQ9Zn0pKHdpbmRvdyk7'></script>
<script id=script_head>
var myb64=new Array();
var myb64_js=new Array();
var myb64_png=new Array();
var myb64_jpg=new Array();
var myb64_pdf=new Array();
var myb64_csv=new Array();
var myb64_psv=new Array();
var mylinks=new Array();
</script>
<style type="text/css">
.exampleserif {font-family: Times, "Times New Roman", Georgia, serif;}
.examplesansserif {font-family: Verdana, Arial, Helvetica, sans-serif;}
.examplemonospace {font-family: "Lucida Console", Courier, monospace;}
.examplecursive {font-family: cursive;}
.examplefantasy {font-family: fantasy;}
.exampleyokkmokk {font-family: yokkmokkOT; font-size:38pt;}
.exampleyokkmokk_small {font-family: yokkmokkOT_file; font-size:20pt;}
.exampleyokkmokk_file {font-family: yokkmokkOT_file; font-size:50pt;}
</style>
<style id="popups">
/*HOVER POPUP LINKS*/
/*hoverpopups type 1*/
#popup { color: #000; background-color: #c0c0c0; }
#popup a, #popup a:visited {
position: relative;
display: block;
width: 130px;
line-height: 30px;
text-align: right;
padding: 0 10px;
margin: 0;
border: 1px solid #666;
text-decoration: none;
font-size: 1em;
font-weight: bold;
}
#popup a span {display: none;}
#popup a:hover { background-color: #e9e9e2; }
/* the IE correction rule */
#popup a:hover {color: #f00; background-color: #e9e9e2; text-indent: 0; /* added the default value */
#popup a:hover span {
display: block;
position: absolute;
top: 0px;
left: 170px;
width: 320px;
margin: 0px;
padding: 10px;
color: #335500;
font-weight: normal;
background: #e5e5e5;
text-align: left;
border: 1px solid #666;
}
</style>
<style id="style_popover" >
.popover {
position: relative;
float: left;
padding: 5px;
/*z-index: 0;*/
}
.popover:hover {
background-color: slategrey;
// background-color: #e9e9e2;
/*z-index: 50;*/
color: goldenrod;
// color: #335500;
text-decoration: none;
}
/*CSS for enlarged image*/
.popover span {
position: absolute;
// background-color: #e5e5e5;
background-color: slategrey;
padding: 5px;
/*left: -1000px;*/
border: 1px solid #666;
visibility: hidden;
color: black;
text-decoration: none;
}
/*CSS for enlarged image*/
.popover span img {
border-width: 0px;
/*padding: 2px;*/
}
/*CSS for enlarged image on hover*/
.popover:hover span {
visibility: visible;
// width: 200px;
top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
left: 5px;/*position where enlarged image should offset horizontally */
}
</style>
<style>
.thumbnail {
position: relative;
float: left;
padding: 5px;
/*z-index: 0;*/
}
.thumbnail:hover {
background-color: #e9e9e2;
/*z-index: 50;*/
color: #335500;
text-decoration: none;
}
.thumbnail span { /*CSS for enlarged image*/
position: absolute;
background-color: #e5e5e5;
padding: 5px;
/*left: -1000px;*/
border: 1px solid #666;
visibility: hidden;
color: black;
text-decoration: none;
}
.thumbnail span img { /*CSS for enlarged image*/
border-width: 0px;
/*padding: 2px;*/
}
.thumbnail:hover span { /*CSS for enlarged image on hover*/
visibility: visible;
width: 200px;
top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
left: 300px;/*position where enlarged image should offset horizontally */
}
/*THUMBNAIL2 - thumbnail2 has border and border on hover*/
.thumbnail2 {
position: relative;
float: left;
padding: 5px;
/*z-index: 0;*/
}
.thumbnail2:hover {
background-color: #e9e9e2;
/*z-index: 50;*/
color: #335500;
text-decoration: none;
}
.thumbnail2 span { /*CSS for enlarged image*/
position: absolute;
background-color: #e5e5e5;
padding: 5px;
/*left: -1000px;*/
border: 1px solid #666;
visibility: hidden;
color: black;
text-decoration: none;
}
.thumbnail2 span img { /*CSS for enlarged image*/
border-width: 0px;
/*padding: 2px;*/
}
.thumbnail2:hover span { /*CSS for enlarged image on hover*/
visibility: visible; width: 208px;
top: 5px; /* use IF IE6 style to correct IE6 positions of larger image relative to thumb */
left: 300px;/*position where enlarged image should offset horizontally */
}
a.thumbnail2 img {
text-decoration:none;
z-index: 50;
}
/*if same attribute for all 4 states, then declare here in
a.thumbnail2*/
a.thumbnail2 img:link {
border: 2px solid #e9e9e2;
background: transparent;
}
a.thumbnail2 img:visited {
border: 2px solid #e9e9e2;
background : transparent;
}
a.thumbnail2 img:hover {
border: 2px solid #f00;
background : transparent;
}
a.thumbnail2 img:active {
border: 2px solid #e9e9e2;
background : transparent;
}
a.thumbnail2 img {
border: 2px solid #e9e9e2;
}
/*end of hover popup links*/
</style>
<script id="script_fileexists">
function html_error() {
document.write("<hr><h1>ERR_206</h1><hr>");
exit();
}
function myfileexists(myfilename) {
var fs = require('fs'),
filename = process.args[2];
filename = "index.png";
fs.exists(filename, function(exists) {
if (exists) {
fs.stat(filename, function(err, stats) {
if (stats.isDirectory()) {
// console.log(filename + ": is a directory");
document.write(filename + ": is a directory");
}
else {
// do something with file
// console.log(filename);
document.write(filename);
}
});
}
else {
// console.log(filename + ": no such file");
document.write(filename + ": disabled<hr><hr><hr><hr><hr><hr><hr>");
html_error();
}
});
</script id=script_fileexists_end>
<script id=script_kojax>
var default_jaxurl = "main.html";
var jaxurl = default_jaxurl;
function kojax(jaxurl,divid,callback) {
if( divid == "" ) { divid="pre_kojax"; }
alert( "BUGS_1000 kojax jaxurl="+jaxurl+" divid="+divid+" callback="+callback );
$.ajax({
url: jaxurl,
context: document.body,
success: function(responseText) {
// alert( "BUGS_1001 KOJAX responseText="+responseText );
// if( document.getElementById('pre_kojax')) {
// document.getElementById('pre_kojax').innerHTML=responseText;
// }
if( document.getElementById(divid)) {
document.getElementById(divid).innerHTML=responseText;
}
kolists['kojax'] = responseText;
// alert( "BUGS_1002 KOJAX kolists_kojax="+kolists['kojax'] );
if( callback == "leds" ) {
kolists['leds']=responseText;
alert( "BUGS_1003 KOJAX kolists_leds="+kolists['leds'] );
// leds('');
}
if( callback == "items" ) { kolists['items']=responseText; items(''); }
if( callback == "contacts" ) { kolists['contacts']=responseText; contacts(''); }
if( callback == "letter" ) { kolists['letter']=responseText; letter(''); }
$("#div_kojax").html(responseText);
$("#div_kojax").find("script").each(function(i) {
eval($(this).text());
alert( "BUGS_1004 kojaxj responseText="+responseText );
return( responseText );
});
// alert( "BUGS_1005 kojax return responseText="+responseText );
return(responseText);
}
});
};
</script id=script_kojax_end>
<script id=script_kojaxj>
var default_jaxurl = "main.html";
var jaxurl = default_jaxurl;
function kojaxj(jaxurl,divid,callback) {
if( divid == "" ) { divid="pre_kojaxj"; }
alert( "BUGS_5111 kojaxj jaxurl="+jaxurl+" divid="+divid+" callback="+callback );
$.ajax({
url: jaxurl,
dataType: "json",
context: document.body,
success: function(responseText) {
alert( "BUGS_5121 KOJAXJ responseText="+responseText );
json=JSON.parse(responseText);
for(j=0;j<json.length;j++ ){
alert( "BUGS_5121 j="+j+" json.pathfile="+json[j].pathfile );
}
alert( "BUGS_5122 KOJAX json="+json );
if( document.getElementById('pre_kojaxj')) {
document.getElementById('pre_kojaxj').innerHTML=responseText;
}
// kolists['kojaxj'] = responseText;
alert( "BUGS_5105 jax kolists_jtfdcr="+kolists['jtfdcr'] );
$("#div_kojaxj").html(responseText);
$("#div_kojaxj").find("script").each(function(i) {
eval($(this).text());
alert( "BUGS_5106 kojaxj responseText="+responseText );
return( responseText );
});
}
});
};
</script id=script_kojaxj_end>
<script id="script_filecheck" >
function filecheck(url) {
alert( "BUGS_500 filecheck url="+url );
if(url) {
var req = new XMLHttpRequest();
req.open('GET', url, false);
req.send();
return req.status==200;
}
else {
return false;
}
}
</script>
<script id="script_imgcheck" >
function imgcheck(url) {
var img = new Image();
img.src = url;
return img.height != 0;
}
</script>
<script id="script_linkcheck" >
function linkcheck(url) {
var http = new XMLHttpRequest();
http.open('HEAD', url, false);
http.send();
return http.status!=404;
}
</script>
<script id=script_toggle>
function toggle(divid) {
var imgid=divid.replace("div_","img_" );
if(! document.getElementById(divid)) { return; }
var imgid=divid.replace("div_","img_" );
style_display=document.getElementById(divid).style.display;
if( style_display == "none" ) {
img="<img src=/imgs/btn/koeyew.png id="+imgid+" height=75 onclick=\"toggle('"+divid+"'); return false;\" >";
document.getElementById(divid).style.display="inline";
document.getElementById(imgid).innerHTML=img;
document.getElementById(imgid).src="/imgs/btn/koeyew.png";
// alert( "BUGS_37891 INLINE img="+img );
}
else {
img="<img src=/imgs/btn/koeyeb.png id="+imgid+" height=75 onclick=\"toggle('"+divid+"'); return false;\" >";
document.getElementById(divid).style.display="none";
document.getElementById(imgid).innerHTML=img;
document.getElementById(imgid).src="/imgs/btn/koeyeb.png";
}
}
</script id=script_toggle_end>
<script id=script_toggles>
function toggles(div_ids,cmd) {
htmout=0; j=0; k=0; divid=""; divids="".split(" ");
// alert( "BUGS_440 toggles div_ids="+div_ids+" cmd="+cmd );
var ids = "letter contacts items kojax files parse cfg main help wz konet iperms jtfdcr fb pdf pn tm tl zm file forms lists lists_letters lists_contacts lists_items lists_postturtles lists_monkeytraps lists_floods koslots views fb pdf pn tl zm mp3 mp4";
if( div_ids == "" ) {
for(j=0; j<ids.split(" ").length; j++ ) {
divids[j]="div_"+ids.split(" ")[j];
// alert( "BUGS_210 j="+j+" divid="+divid)
}
// alert( "BUGS_211 j="+j+" div_ids="+div_ids+" divids0="+divids[0] );
}
else {
divids=div_ids.split(" ")
// alert( "BUGS_212 j="+j+" div_ids="+div_ids+" divids0="+divids[0] );
}
// alert( "BUGS_220 toggles divids_length="+divids.length+" cmd="+cmd );
for( j=0; j<divids.length; j++ ) {
divid=divids[j];
imgid=divid.replace("div_","img_");
// alert( "BUGS_221 toggles j="+j+" divid="+divid+" cmd="+cmd+" imgid="+imgid );
if( ! document.getElementById(divid)) { continue; }
// alert( "BUGS_222 toggles j="+j+" FOUND divid="+divid+" cmd="+cmd+" imgid="+imgid );
if( cmd == "allon" ) {
// alert( "BUGS_230 toggles ALLON div_ids="+div_ids+" cmd="+cmd );
document.getElementById(divid).style.display="inline";
if (! document.getElementById(imgid)) { continue; }
document.getElementById(imgid).src="/imgs/btn/koeyew.png";
// if( document.getElementById('img_toggle_allon')) {
// document.getElementById('img_toggle_allon').style.display="inline";
// }
// if( document.getElementById('img_toggle_toggle')) {
// document.getElementById('img_toggle_toggle').style.display="inline";
// }
// if( document.getElementById('img_toggle_alloff')) {
// document.getElementById('img_toggle_alloff').style.display="inline";
// }
}
if(( cmd == "toggle" ) || ( cmd == "" )) {
display=document.getElementById(divid).style.display;
if( display == "none" ) {
document.getElementById(divid).style.display="inline";
if (document.getElementById(imgid)) {
document.getElementById(imgid).src="/imgs/btn/koeyew.png";
}
}
else {
document.getElementById(divid).style.display="none";
if (document.getElementById(imgid)) {
document.getElementById(imgid).src="/imgs/btn/koeyeb.png";
}
}
}
if( cmd == "alloff" ) {
document.getElementById(divid).style.display="none";
if (! document.getElementById(imgid)) { continue; }
document.getElementById(imgid).src="/imgs/btn/koeyeb.png";
// if( document.getElementById('img_toggle_allon')) {
// document.getElementById('img_toggle_allon').style.display="inline";
// }
// if( document.getElementById('img_toggle_toggle')) {
// document.getElementById('img_toggle_toggle').style.display="none";
// }
// if( document.getElementById('img_toggle_alloff')) {
// document.getElementById('img_toggle_alloff').style.display="none";
// }
}
}
return("");
}
</script id=script_toggles_end>
<script id=script_toggles1>
function toggles1(div_ids,cmd) {
htmout=0; j=0; k=0; divid=""; divids="".split(" ");
alert( "BUGS_520 toggles div_ids="+div_ids+" cmd="+cmd );
var ids = "letter contacts items kojax files parse cfg main help wz konet iperms jtfdcr fb pdf pn tm tl zm file forms lists lists_letters lists_contacts lists_items lists_postturtles lists_monkeytraps lists_floods koslots views fb pdf pn tl zm mp3 mp4";
if( div_ids == "" ) {
for(j=0; j<ids.split(" ").length; j++ ) {
divids[j]="div_"+ids.split(" ")[j];
// alert( "BUGS_210 j="+j+" divid="+divid)
}
// alert( "BUGS_211 j="+j+" div_ids="+div_ids+" divids0="+divids[0] );
}
else {
divids=div_ids.split(" ")
// alert( "BUGS_212 j="+j+" div_ids="+div_ids+" divids0="+divids[0] );
}
// alert( "BUGS_220 toggles divids_length="+divids.length+" cmd="+cmd );
for( j=0; j<divids.length; j++ ) {
divid=divids[j];
imgid=divid.replace("div_","img_");
// alert( "BUGS_221 toggles j="+j+" divid="+divid+" cmd="+cmd+" imgid="+imgid );
if( ! document.getElementById(divid)) { continue; }
// alert( "BUGS_222 toggles j="+j+" FOUND divid="+divid+" cmd="+cmd+" imgid="+imgid );
if( cmd == "allon" ) {
// alert( "BUGS_230 toggles ALLON div_ids="+div_ids+" cmd="+cmd );
document.getElementById(divid).style.display="inline";
if (! document.getElementById(imgid)) { continue; }
document.getElementById(imgid).src="/imgs/btn/koeyew.png";
// if( document.getElementById('img_toggle_allon')) {
// document.getElementById('img_toggle_allon').style.display="inline";
// }
// if( document.getElementById('img_toggle_toggle')) {
// document.getElementById('img_toggle_toggle').style.display="inline";
// }
// if( document.getElementById('img_toggle_alloff')) {
// document.getElementById('img_toggle_alloff').style.display="inline";
// }
}
if(( cmd == "toggle" ) || ( cmd == "" )) {
display=document.getElementById(divid).style.display;
if( display == "none" ) {
document.getElementById(divid).style.display="inline";
if (document.getElementById(imgid)) {
document.getElementById(imgid).src="/imgs/btn/koeyew.png";
}
}
else {
document.getElementById(divid).style.display="none";
if (document.getElementById(imgid)) {
document.getElementById(imgid).src="/imgs/btn/koeyeb.png";
}
}
}
if( cmd == "alloff" ) {
document.getElementById(divid).style.display="none";
if (! document.getElementById(imgid)) { continue; }
document.getElementById(imgid).src="/imgs/btn/koeyeb.png";
// if( document.getElementById('img_toggle_allon')) {
// document.getElementById('img_toggle_allon').style.display="inline";
// }
// if( document.getElementById('img_toggle_toggle')) {
// document.getElementById('img_toggle_toggle').style.display="none";
// }
// if( document.getElementById('img_toggle_alloff')) {
// document.getElementById('img_toggle_alloff').style.display="none";
// }
}
}
return("");
</script id=script_toggles_end>
<style id="style_body_scroll">
body{ overflow-y:scroll; }
</style>
<script id="script_filecheck" >
function filecheck(url) {
if(url) {
var req = new XMLHttpRequest();
req.open('GET', url, false);
req.send();
return req.status==200;
}
else {
return false;
}
}
</script>
<script id="script_imgcheck" >
function imgcheck(url) {
var img = new Image();
img.src = url;
return img.height != 0;
}
</script>
<script id="script_linkcheck" >
function linkcheck(url) {
var http = new XMLHttpRequest();
http.open('HEAD', url, false);
http.send();
return http.status!=404;
}
</script>
<script id="script_urlexists" >
function UrlExists(url) {
var http = new XMLHttpRequest();
http.open('HEAD', url, false);
http.send();
return http.status!=404;
}
</script>
<script id="script_parse">
var jklists = new Array();
var jkid="";
function parse(args) {
// alert( "BUGS_20 parse args="+args);
var parser = document.createElement('a');
// parser.href = "/";
// parser.href = "http://example.com:3000/pathname/?search=test#hash";
parser.href=document.location;
// parser.protocol; // => "http:"
// parser.hostname; // => "example.com"
// parser.port; // => "3000"
// parser.pathname; // => "/pathname/"
// parser.search; // => "?search=test"
// parser.hash; // => "#hash"
// parser.host; // => "example.com:3000"
protocol=parser.protocol; // => "http:"
hostname=parser.hostname; // => "example.com"
port=parser.port; // => "3000"
pathname=parser.pathname; // => "/pathname/"
search=parser.search; // => "?search=test"
hash=parser.hash; // => "#hash"
host=parser.host; // => "example.com:3000"
htmout += "<br>\n";
htmout += "<hr color=black>\n";
htmout += "<hr color=white>\n";
htmout += "protocol="+protocol+"<br>\n"
htmout += "hostname="+hostname+"<br>\n"
htmout += "port="+port+"<br>\n"
htmout += "pathname="+pathname+"<br>\n"
htmout += "search="+search+"<br>\n"
htmout += "hash="+hash+"<br>\n"
htmout += "host="+host+"<br>\n"
if ( document.getElementById('div_parsed')) {
document.getElementById('div_parsed').innerHTML=htmout;
}
// alert( "BUGS_60 parser htmout="+htmout );
psvrec=protocol+"|"+hostname+"|"+port+"|"+pathname+"|"+search+"|"+hash+"|"+host+"|"+dttm+"|";
return(psvrec);
// return(htmout);
// if( parser.search != "" ) {
// var jkid = parser.search.split("=")[1];
// var jklist = new Array();
// jklist = jkload(jkid);
// var htmout = "";
// for( j=0; j< jklist.length; j++ ) {
// if( jklist[j] == "" ) { continue; }
// if( jklist[j] == "#" ) { continue; }
// htmout += jklist[j]+"<br>\n";
// }
// document.write( htmout );
// return;
// }
// var str = "jkwii is me"
var regx = /is/g;
var result = regx.test(str);
// alert( "BUGS_80 str="+str+" regx="+regx+" result="+result );
id=geturlparameter('id');
}
</script id=script_parse_end>
<script id="script_geturlvars" >
// var number = geturlvars()["x"];
// var mytext = geturlvars()["text"];
// var mytext = geturlparam('text','Empty');
function geturlvars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}
</script id=script_geturlvars_end>
<script id=script_geturlparam >
function geturlparam(parameter, defaultvalue){
var urlparameter = defaultvalue;
if(window.location.href.indexOf(parameter) > -1) {
urlparameter = getUrlVars()[parameter];
}
return urlparameter;
}
// var mytext = getUrlParam('text','Empty');
</script id=script_geturlparam_end>
<script id="script_pathfile2url" >
function pathfile2url(pathfile) {
path="path"; file="file"; base="base"; ext="ext";
pathinfo(pathfile);
info = pathinfo(pathfile);
path=info[1]; file=info[2]; base=info[3]; ext=info[4];
// (pathfile,path,file,base,ext) = pathinfo(pathfile);
// alert( "BUGS_762 info0="+info[0] );
alert( "BUGS_763 path="+path+" file="+file+" base="+base+" ext="+ext+" pathfile="+pathfile );
}
</script id="script_pathfile2url" >
<script id="script_pathfile2url1" >
function pathfile2url1(pathfile) {
alert( "BUGS_780 pathfile2url1 pathfile="+pathfile );
// file=pathfile.replace(/^.*[\\\/], '');
// file=pathfile.replace(/^.*(\\|\/|\:)/, '');
// file=pathfile.substring(pathfile.lastIndexOf('/')+1;
// file=pathfile.split('\\').pop().split('/').pop();
// file=pathfile.split(['/','\\']).pop();
// file=/([^\\]+)$/.exec(pathfile)[1];
// base = (file.split('\\').pop().split('/').pop().split('.'))[0];
// ext = (file.split('\\').pop().split('/').pop().split('.'))[1];
// values = pathinfo(pathfile);
// path=values.path; file=values.file; base=values.base; ext=values.ext;
// vals = pathinfo(pathfile);
// path=vals[0]; file=vals[1]; base=vals[2]; ext=vals[3];
// let {baz, foo} = (function(){ return {foo: 3, bar: 500, baz: 40} })();
// baz; // 40
// foo; // 3
path="path"; file="file"; base="base"; ext="ext";
alert( "BUGS_801 path="+path+" file="+file+" base="+base+" ext="+ext+" pathfile="+pathfile );
// pathinfo(pathfile);
// { path,file,base,ext } = pathinfo(pathfile);
alert( "BUGS_802 path="+path+" file="+file+" base="+base+" ext="+ext+" pathfile="+pathfile );
// if( /mp3/.test(ext)) { ; }
// if( /mp4/.test(ext)) { ; }
// if( /pdf/.test(ext)) { ; }
// if( /jpg/.test(ext)) { ; }
// if( /gif/.test(ext)) { ; }
// if( /png/.test(ext)) { ; }
//
if( ext.match(/mp3/g)) {
tn="/imgs/btn/koeye_mp3.png";
id="mp3id";
htmout+="<a href="+pathfile+" target=_blank>";
htmout+="<img id=\""+id+"\" title=\" "+id+"\" ";
htmout+="src=\""+tn+"\" ";
htmout+="onclick=\"window.open('"+pathfile+"'); return false;\" ";
htmout+="height=20 border=0>";
htmout+="</a>";
return(htmout);
}
if( ext.match(/mp4/g)) {
tn="/imgs/btn/koeye_mp4.png";
id="mp4id";
htmout+="<a href="+pathfile+" target=_blank>";
htmout+="<img id=\""+id+"\" title=\" "+id+"\" ";
htmout+="src=\""+tn+"\" ";
htmout+="onclick=\"window.open('"+pathfile+"'); return false;\" ";
htmout+="height=20 border=0>";
htmout+="</a>";
}
if( ext.match(/pdf/g)) {
tn="/imgs/btn/koeye_pdf.png";
htmout+="<a href=/pdf/web/viewer.html?file="+pathfile+" target=_blank>";
htmout+="<img id=\""+id+"\" title=\" "+id+"\" ";
htmout+="src=\""+tn+"\" ";
htmout+="onclick=\"window.open('"+pathfile+"'); return false;\" ";
htmout+="height=20 border=0>";
htmout+="</a>";
return(htmout);
}
if(( ext.match(/jpg/g)) ||( ext.match(/gif/g)) ||( ext.match(/png/g))) {
tn="/imgs/gif/disks/disk_black.gif";
id="imgid";
htmout+="<a href="+pathfile+" target=_blank>";
htmout+="<img id=\""+id+"\" title=\" "+id+"\" ";
htmout+="src=\""+tn+"\" ";
htmout+="onclick=\"window.open('"+pathfile+"'); return false;\" ";
htmout+="height=20 border=0>";
htmout+="</a>";
}
return("");
}
</script id="script_pathfile2url1_end" >
<script id="script_startup" >
function startup(args) {
htmout=""; j=0; k=0;
alert( "BUGS_000 script_startup args="+args );
url=pathfile2url(pathfile);
alert( "BUGS_102 startup pathfile="+pathfile+" url="+url );
return(htmout);
}
</script id="script_test_end" >
<img id="img_pathfile2url" src=/imgs/btn/brdb.png height=100 onclick="pathfile2url('/path/sub/file.txt');return false;" >pathfile2url
<!--
<br>
<hr color="yellow" />
<div id="div_test"><h1>div_test</h1></div id="div_test_end">
<input oninput="document.getElementById('div_test').textContent=pathinfo(this.value).file" value="c:\folder\folder.name\file.ext" style="width:300px">
<hr color="yellow" />
<br />
-->
<script id="script_pathinfo" >
function pathinfo(s) {
// alert( "BUGS_770 pathinfo s="+s );
s=s.match(/(.*?[\\/:])?(([^\\/:]*?)(\.[^\\/.]+?)?)(?:[?#].*)?$/);
// alert( "BUGS_850 pathinfo s1="+s[1]+" s2="+s[2]+" s3="+s[3]+" s4="+s[4] );
// return {path:s[1],file:s[2],base:s[3],ext:s[4]};
return(s);
}
</script id="script_pathinfo_end" >
<script id="script_test" >
// pathfile="http://ka12/ko/idx.html?test=test";
// url="<img src=/imgs/btn/koeye.png>";
// url=pathfile2url(pathfile);
// alert( "BUGS_801 startup pathfile="+pathfile+" url="+url );
function test(args) {
htmout=""; j=0; k=0;
alert( "BUGS_860 test args="+args );
return(htmout);
}
</script id="script_test_end" >
</head>
<body bgcolor=linen onload="startup('onload');return false;" >
<div id="div_dhtml" >
<img id="img_ko" name="img_ko" title=" img_ko" src="/imgs/btn/ko.png" onclick="alert('onclick_ko'); return false;" height=20 border=0>"
<img id="img_ok" name="img_ok" title=" img_ok" src="/imgs/btn/ok.png" onclick="alert('onclick_ok'); return false;" height=20 border=0>"
<img id="img_koeye" name="img_koeye" title=" img_koeye" src="/imgs/btn/koeye.png" onclick="alert('onclick_koeye'); return false;" height=20 border=0>"
<img id="img_koeyeb" name="img_koeyeb" title=" img_koeyeb" src="/imgs/btn/koeyeb.png" onclick="alert('onclick_koeyeb'); return false;" height=20 border=0>"
<img id="img_koeyew" name="img_koeyew" title=" img_koeyew" src="/imgs/btn/koeyew.png" onclick="alert('onclick_koeyew'); return false;" height=20 border=0>"
<img id="img_brdb" name="img_brdb" title=" img_brdb" src="/imgs/btn/brdb.png" onclick="alert('onclick_brdb'); return false;" height=20 border=0>"
<img id="img_brdw" name="img_brdw" title=" img_brdw" src="/imgs/btn/brdw.png" onclick="alert('onclick_brdw'); return false;" height=20 border=0>"
<img id="img_topgif" name="img_topgif" title=" img_topgif" src="/imgs/btn/koeye_handhither.gif" onclick="alert('onclick_topgif'); return false;" height=20 border=0>"
<style id="style_leds" >
#div_leds {
position:absolute;
left:400px;
top:200px;
width:400px;
height:600px;
visibility:visible;
}
</style id="style_leds_end" >
<div id="div_leds" >
<hr color="black" />
<h3>div_leds</h3>
<img src=/imgs/gif/disks/disk_white.gif height=20 >
<hr color="black" />
</div id="div_leds_end" >
</div id="div_dhtml_end"
<br />
<hr color="black" />
<h1>oninput_text</h1>
<input type="text" oninput="func_oninput_text(this.value)">
<p id="p_oninput_text" >p_oninput_reverse: </p id="p_oninput_text_end">
<p id="p_oninput_text1" >p_oninput_text1: </p id="p_oninput_text1_end">
<p id="p_oninput_text2" >p_oninput_text2: </p id="p_oninput_text2_end">
<p id="p_oninput_text3" >p_oninput_text3: </p id="p_oninput_text3_end">
<div id="div_oninput_text" >div_oninput_text: </div id="div_oninput_text_end">
<div id="div_oninput_text1" >div_oninput_text1: </div id="div_oninput_text1_end">
<div id="div_oninput_text2" >div_oninput_text2: </div id="div_oninput_text2_end">
<div id="div_oninput_text3" >div_oninput_text3: </div id="div_oninput_text3_end">
<hr color="black" />
<br />
<br />
<br />
<script id="script_oninput_text" >
function func_oninput_text(value) {
htmout=value;
url="";
// isfile=filecheck(value);
// if( filecheck(value) != false ) {
// alert( "BUGS_890 func_oninput_text FILECHECK value="+value+" isfile="+isfile );
// pathfile=value;
// vals=pathinfo(pathfile);
// pathfile=vals[0]; path=vals[1]; file=vals[2]; base=vals[3]; ext=vals[4];
// url=pathfile2url(pathfile);
// htmout=url;
// }
// else {
// htmout=value;
// }
htmout_reverse="";
chars=value.split("");
k=chars.length-1;
for( j=0; j< chars.length; j++ ) {
htmout_reverse+=chars[k];
k=k-1;
}
vals=pathinfo(value);
pathfile=vals[0]; path=vals[1]; file=vals[2]; base=vals[3]; ext=vals[4];
htmout_pathinfo="";
htmout_pathinfo+='pathfile='+pathfile+' ';
htmout_pathinfo+='path='+path+' ';
htmout_pathinfo+='file='+file+' ';
htmout_pathinfo+='base='+base+' ';
htmout_pathinfo+='ext='+ext+' ';
link=``; htmout_link="";
if( value.endsWith("pdf")) {
tn="/imgs/btn/koeye_pdf.png";
link+=`<img id="img_link" name="img_link" title=" img_link" `;
link+=`src="/`+tn+`" onclick="window.open('/pdf/web/viewer.html?file=`+value+`'); return false;" height=20 border=0>`;
htmout_link=link;
}
if( value.endsWith("mp3")) {
tn="/imgs/btn/koeye_mp3.png";
link+=`<img id="img_link" name="img_link" title=" `+value+`" `;
link+=`src="/`+tn+`" onclick="window.open('`+value+`'); return false;" height=20 border=0>`;
htmout_link=link;
}
if( value.endsWith("mp4")) {
tn="/imgs/btn/koeye_mp4.png";
link+=`<img id="img_link" name="img_link" title=" `+value+`" `;
link+=`src="/`+tn+`" onclick="window.open('`+value+`'); return false;" height=20 border=0>`;
htmout_link=link;
}
if( value.endsWith("mp3")) {
tn="/imgs/btn/koeye_mp3.png";
link+=`<img id="img_link" name="img_link" title=" `+value+`" `;
link+=`src="/`+tn+`" onclick="window.open('`+value+`'); return false;" height=20 border=0>`;
htmout_link=link;
}
if( value.endsWith("json")) {
tn="/imgs/btn/tl.png";
link+=`<img id="img_link" name="img_link" title=" `+value+`" `;
link+=`src="/`+tn+`" onclick="window.open('ko_tl.html?tlid=`+value+`'); return false;" height=100 border=0>`;
htmout_link=link;
}
if( value.endsWith("0-0-0.jpg")) {
tn=value;
link+=`<img id="img_link" name="img_link" title=" `+value+`" `;
link+=`src="/`+tn+`" onclick="window.open('ko_zm.html?zmid=`+value.replace("/TileGroup0/0-0-0.jpg","")+`'); return false;" height=100 border=0>`;
htmout_link=link;
}
if(( value.endsWith("jpg")) || ( value.endsWith("png")) || ( value.endsWith("gif"))) {
tn=value;
link+=`<img id="img_link" name="img_link" title=" `+value+`" `;
link+=`src="/`+tn+`" onclick="window.open('`+value+`'); return false;" height=100 border=0>`;
htmout_link=link;
}
// htmout_htmlentities=value.htmlentities();
// htmout_htmlentities=value.replace("e","E").replace("i","I").replace("a","A").replace("o","O").replace("u"."U");
htmout_htmlentities=value;
htmout_touppercase=value.toUpperCase();
htmout_link="<img src="+value+" height=100>";
document.getElementById('p_oninput_text').innerHTML=htmout;
document.getElementById('p_oninput_text1').innerHTML=htmout_reverse;
document.getElementById('p_oninput_text2').innerHTML=htmout_pathinfo;
document.getElementById('p_oninput_text3').innerHTML=htmout_link;
document.getElementById('div_oninput_text').innerHTML=htmout_reverse;
document.getElementById('div_oninput_text1').innerHTML=htmout_pathinfo;
document.getElementById('div_oninput_text2').innerHTML=htmout_touppercase;
document.getElementById('div_oninput_text3').innerHTML=htmout_htmlentities;
}
</script id="script_oninput_text_end" >
<input type="range" oninput="oninput_slider(this.value)">
<p id="p_oninput_slider"></p>
<div id="div_oninput" >
<h1>div_oninput</h1>
<p>type</p>
<input type="text" id="id_oninput" oninput="ko_oninput">
<div id="div_oninput_out">div_oninput_out</div id="div_oninput_out_end">
<p id="p_oninput_out">p_oninput_out</p id="p_oninput_out_end">
<br />
<hr color="black" />
<!-- <input id="input_fld0" oninput="alert( 'blah blah blah' );" ></input> -->
<input id="input_flds" type=text" >input_flds</input id="input_flds_end">
<input id="input_fld0" type=text" >input_fld0</input id="input_fld0_end">
<input id="input_fld1" type=text" >input_fld1</input id="input_fld1_end">
<input id="input_fld2" type=text" >input_fld2</input id="input_fld2_end">
<br />
<div id="div_output_flds"><h1>div_output_flds</h1></div id="div_output_flds_end">
<div id="div_output_fld0"><h1>div_output_fld0</h1></div id="div_output_fld0_end">
<div id="div_output_fld1"><h1>div_output_fld1</h1></div id="div_output_fld1_end">
<div id="div_output_fld2"><h1>div_output_fld2</h1></div id="div_output_fld2_end">
<br />
<hr color="black" />
<script id="script_eventlisteners" >
document.getElementById('input_flds').addEventListener('input',func_oninput_flds, true);
document.getElementById('input_fld0').addEventListener('input',func_oninput_fld0, true);
document.getElementById('input_fld1').addEventListener('input',func_oninput_fld1, true);
document.getElementById('input_fld2').addEventListener('input',func_oninput_fld2, true);
function func_oninput_flds(args){
// alert( "BUGS_940 func_oninput_flds args="+args );
htmout=""; j=0; k=0;
value=document.getElementById('input_flds').value;
url="";
if( filecheck(value)) {
pathfile=value;
vals=pathinfo(pathfile);
pathfile=vals[0]; path=vals[1]; file=vals[2]; base=vals[3]; ext=vals[4];
url=pathfile2url(pathfile);
htmout=url;
}
else {
htmout=value;
}
// htmout=value;
// htmout=value.indexOf("match");
// htmout=value.lastindexOf("match");
// htmout=value.search("match");
// htmout=value.slice("match");
// htmout=value.substr(7,4);
// htmout=value.replace("match","MATCH");
// htmout=value.charCodeAt(0);
// htmout=value.toLowerCase();
// htmout=value.toUpperCase();
// htmout=value.trim();
// htmout=value.split("|");
// htmout=value.endsWith("pdf");
// htmout=value.startsWith("ko");
// htmout=value.length;
// htmout+=value.anchor();
// htmout+=value.big();
// htmout+=value.blink();
// htmout+=value.bold();
// htmout+=value.fixed();
// htmout+=value.fontcolor();
// htmout+=value.fontsize();
// htmout+=value.italics();
// htmout+=value.link();
// htmout+=value.small();
// htmout+=value.strike();
// htmout+=value.sub();
// htmout+=value.sup();
// search(regexp)
// var intRegex = /[0-9 -()+]+$/;
// var myNumber = '999';
// var isInt = myNumber.search(intRegex);
// console.log(isInt);
// output: 0
// alert("BUGS_88s: oninput_flds args="+args+" htmout="+htmout );
document.getElementById('div_output_flds').innerHTML=htmout;
return(htmout);
}
function func_oninput_fld0(args){
value=document.getElementById('input_fld0').value;
htmout="fld1..."+value;
alert("BUGS_880: oninput_fld0 args="+args+" value="+value );
document.getElementById('div_output_fld0').innerHTML=htmout;
return(htmout);
}
function func_oninput_fld1(args){
value=document.getElementById('input_fld1').value;
htmout=value.toLowerCase();
alert("BUGS_881: oninput_fld1 args="+args+" value="+value );
document.getElementById('div_output_fld1').innerHTML=htmout;
return(htmout);
}
function func_oninput_fld2(args){
value=document.getElementById('input_fld2').value;
htmout=value.toUpperCase();
alert("BUGS_882: oninput_fld2 args="+args+" value="+value );
document.getElementById('div_output_fld2').innerHTML=htmout;
return(htmout);
}
</script id="script_eventlisteners_end" >
<script id="script_ko_oninput">
function myFunction() {
let text = document.getElementById("id_oninput").value;
document.getElementById("div_oninput_out").innerHTML = "div_oninput_outt: " + text;
document.getElementById("p_oninput_out").innerHTML = "p_oninput_out: " + text;
}
</script id="script_ko_oninput_end">
</div id="div_oninput_end" >
<input type="text" onkeypress="ko_onkeypress(event)" >
<script id="script_ko_onkeypress" >
function ko_onkeypress(event) {
if( event.keyCode == 13 ) {
alert( "BUGS_920 ko_onkeypress 13 ENTER" );
}
}
function oninput_slider(value) {
document.getElementById("p_oninput_slider").innerHTML=value;
}
</script id="script_oninput_slider_end" >
<div id="div_test">
<h1>div_test</h1>
</div id="div_test_end">
<script id="script_files" >
function files(args) {
htmout=""; j=0; k=0;
alert( "BUGS_880 files args="+args );
return(htmout);
}
</script id="script_files_end" >
<br />
<hr color="black" />
<img id="img_files" name="img_files" title=" img_files" src="/imgs/btn/kokeye.png"
onclick="toggles('div_files'); return false; height=20 border=0>div_files
<img id="img_files_go" name="img_files_go" title=" img_files_go" src="/imgs/btn/kokeye.png"
onclick="files('click'); return false; height=20 border=0>div_files_go
<div id="div_files" >
<output id="zonelist"></output>
<div id="dropzone">
dropzone
<div id="div_canvas" style="position:relative; width:400px; height:200px background:white">
<canvas id="canvas_dropzone" style="z-index: 1;
position:absolute;
left:0px;
top:0px;
" height="100px" width="200" background-color="darkSlategrey" color="ivory">
WARN_1387 unauthorized access has been logged
</canvas>
</div id=div_canvas_end>
</div id=dropzone_end>
</div id=div_files>
<script name="script_fileselect">
function handleFileSelect(evt) {
evt.stopPropagation();
evt.preventDefault();
var files = evt.dataTransfer.files; // FileList object.
// files is a FileList of File objects. List some properties.
var output = [];
for (var i = 0, f; f = files[i]; i++) {
output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
f.size, ' bytes, last modified: ',
f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
'</li>');
}
document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
}
function handleDragOver(evt) {
evt.stopPropagation();
evt.preventDefault();
evt.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
}
// Setup the dnd listeners.
var dropZone = document.getElementById('dropzone');
dropZone.addEventListener('dragover', handleDragOver, false);
dropZone.addEventListener('drop', handleFileSelect, false);
</script>
<hr><hr><hr>
<label class="fileContainer">
files
<input id="files" name="files[]" multiple="" type="file">
</label>
<output id="zonelist"></output>
<script>
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
// files is a FileList of File objects. List some properties.
var output = [];
for (var i = 0, f; f = files[i]; i++) {
output.push('<li><strong>', escape(f.name), '</strong> (', f.type || 'n/a', ') - ',
f.size, ' bytes, last modified: ',
f.lastModifiedDate ? f.lastModifiedDate.toLocaleDateString() : 'n/a',
'</li>');
}
document.getElementById('zonelist').innerHTML = '<ul>' + output.join('') + '</ul>';
}
document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>
<div id="div_files2" hidden >
<label class="fileContainer">
files2
<input id="files" name="files[]" multiple="" type="file">
</label>
<output id="zonelist"></output>
</div>
<script>
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
alert( "BUGS_1078 handleFileSelect files_length="+files.length ):
// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {
// Only process image files.
if (!f.type.match('image.*')) { continue; }
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = (function(theFile) {
return function(e) {
// Render thumbnail.
var span = document.createElement('span');
span.innerHTML = ['<img class="thumb" src="', e.target.result,
'" title="', escape(theFile.name), '"/>'].join('');
document.getElementById('zonelist').insertBefore(span, null);
};
})(f);
// Read in the image file as a data URL.
reader.readAsDataURL(f);
}
}
document.getElementById('files').addEventListener('change', handleFileSelect, false);
</script>
<script id="script_previewfile">
function previewfile(file) {
if (tests.filereader === true && acceptedTypes[file.type] === true) {
var reader = new FileReader();
reader.onload = function (event) {
var image = new Image();
image.src = event.target.result;
image.width = 250; // a fake resize
holder.appendChild(image);
};
reader.readAsDataURL(file);
}
else {
holder.innerHTML +=
'<p>done: koupload'
+ file.name
+ ' '
+ (file.size ? (file.size/1024|0) + 'K' : '');
console.log(file);
}
}
function readfiles(files) {
debugger;
var formData = tests.formdata ? new FormData() : null;
for (var i = 0; i < files.length; i++) {
if (tests.formdata) formData.append('file', files[i]);
previewfile(files[i]);
}
// now post a new XHR request
if (tests.formdata) {
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://ka6/ko/bin/php/ko.php?ko=ajax,upload,filenames,phpi,ok');
// xhr.open('POST', 'ka6/ko/bin/php/index.php?q=upload,filenames');
xhr.onload = function() {
progress.value = progress.innerHTML = 100;
};
if (tests.progress) {
xhr.upload.onprogress = function (event) {
if (event.lengthComputable) {
var complete = (event.loaded / event.total * 100 | 0);
progress.value = progress.innerHTML = complete;
}
}
}
xhr.send(formData);
}
}
alert( 'BUGS_1170 dnd="+dnd );
if (tests.dnd) {
holder.ondragover = function () { this.className = 'hover'; return false; };
holder.ondragend = function () { this.className = ''; return false; };
holder.ondrop = function (e) {
this.className = '';
e.preventDefault();
readfiles(e.dataTransfer.files);
}
}
else {
fileupload.className = 'hidden';
fileupload.querySelector('input').onchange = function () {
readfiles(this.files);
};
}
</script>
<script id="script_handlepaste" >
function handlepaste0(args) {
alert( "BUGS_1188 handlepaste args="+args );
}
// Stop data actually being pasted into div
// Get pasted data via clipboard API
// Do whatever with pasteddata
function handlepaste(e) {
alert("BUGS_1201 handlepaste e="+e );
var clipboardData, pastedData;
e.stopPropagation();
e.preventDefault();
clipboardData = e.clipboardData || window.clipboardData;
pastedData = clipboardData.getData('Text');
alert("BUGS_1202 handlepaste pastedData="+pastedDate );
}
</script id="script_handlepaste_end" >
<script id="script_myfilework>
funtion myfilework( j, file ) {
alert( j+" file="+file );
}
</script>
<script id="script_upload_input">>
var upload = document.getElementsByTagName('input')[0],
holder2 = document.getElementById('holder2'),
state = document.getElementById('status');
if (typeof window.FileReader === 'undefined') {
state.className = 'fail';
}
else {
state.className = 'success';
state.innerHTML = 'File API & FileReader available';
}
upload.onchange = function (e) {
e.preventDefault();
var file = upload.files[0],
reader = new FileReader();
reader.onload = function (event) {
var img = new Image();
img.src = event.target.result;
// note: no onload required since we've got the dataurl...I think! :)
if (img.width > 560) { // holder width
img.width = 560;
}
holder2.innerHTML = '';
holder.appendChild(img);
};
reader.readAsDataURL(file);
return false;
};
// var formData = new FormData();
// formData.append("part_num", "123ABC");
// formData.append("part_price", 7.95);
// formData.append("part_image", somefile)
//
// var xhr = new XMLHttpRequest();
// xhr.open("POST", "http://ka6/ko/bin/php/ko.php?ko=ajax,upload/");
// xhr.send(formData);
</script>
<canvas color="darkSlategrey" height="100" width="400"></canvas>
<script>
var canvas = document.getElementsByTagName('canvas')[0],
ctx = null,
grad = null,
body = document.getElementsByTagName('body')[0],
color = 255;
// color = lightblue;
if (canvas.getContext('2d')) {
ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, 600, 600);
ctx.save();
// Create radial gradient
// grad = ctx.createRadialGradient(0,0,0,0,0,600);
// grad.addColorStop(0, '#000');
// grad.addColorStop(1, 'rgb(' + color + ', ' + color + ', ' + color + ')');
// assign gradients to fill
// ctx.fillStyle = grad;
ctx.fillstyle = "lightblue";
// draw 600x600 fill
ctx.fillRect(0,0,600,600);
ctx.save();
body.onmousemove = function (event) {
var width = window.innerWidth,
height = window.innerHeight,
x = event.clientX,
y = event.clientY,
rx = 600 * x / width,
ry = 600 * y / height;
var xc = ~~(256 * x / width);
var yc = ~~(256 * y / height);
grad = ctx.createRadialGradient(rx, ry, 0, rx, ry, 600);
grad.addColorStop(0, '#000');
grad.addColorStop(1, ['rgb(', xc, ', ', (255 - xc), ', ', yc, ')'].join(''));
// ctx.restore();
// ctx.fillStyle = grad;
ctx.fillstyle="lightblue";
ctx.fillRect(0,0,600,600);
// ctx.save();
};
}
</script>
<1-- DIV_CSV -->
<div id="div_csv"><h3>div_csv 300</h3></div id="div_csv_end" >
<script id="script_upload_csv" type="text/javascript">
// function upload_csv() {
function Upload() {
// var files = evt.dataTransfer.files; // FileList object.
// var fileUpload = document.getElementById("upload_files");
var fileUpload = document.getElementById("fileUpload");
var regex = /^([a-zA-Z0-9\s_\\.\-:])+(.csv|.txt|.psv|.py|.htm|.html|.php)$/;
if (regex.test(fileUpload.value.toLowerCase())) {
if (typeof (FileReader) != "undefined") {
var reader = new FileReader();
reader.onload = function (e) {
var table = document.createElement("table");
var rows = e.target.result.split("\n");
for (var i = 0; i < rows.length; i++) {
var row = table.insertRow(-1);
// var cells = rows[i].split("|");
var cells = rows[i].split(",");
for (var j = 0; j < cells.length; j++) {
var cell = row.insertCell(-1);
cell.innerHTML = cells[j];
}
}
var csv2tbl = document.getElementById("csv2tbl");
csv2tbl.innerHTML = "";
csv2tbl.appendChild(table);
}
reader.readAsText(fileUpload.files[0]);
file_csv=fileUpload.files[0];
file_csvlen = fileUpload.files.length;
alert( "BUGS_4390 CSV file_csvlen="+file_csvlen+" file_csv="+file_csv );
load_file_csv(file_csv);
}
else {
alert("csv2tbl warn: unauthorized access noted");
}
}
else {
alert("csv2tbl fail: unsuppoted format");
}
}
</script id="script_upload_csv" >
<script id="script_load_file_csv">
function load_file_csv(file_csv) {
alert( "BUGS_4400 load_file_csv file_csv="+file_csv" );
file_psv=file_csv.replace(",","|");
return(file_psv);
}
</script id="script_load_file_csv_end">
<label id="label_upload_csv" class="fileContainer">
files.csv.psv.txt
<input id="fileUpload" type="file"></input id="fileUpload_end" >
</label id="label_upload_csv_end" >
     
<label id="label_parse_csv" class="fileContainer">
parse.csv.psv.txt
<input id="upload" value="Upload" onclick="Upload()" type="button"></input>
</label id="label_parse_csv" >
<div id="csv2tbl"><h3>csv2tbl MSG_367</h3></div id="csv2tbl_end" >
<script id="script_uploads" type="text/javascript">
// grab the file input and bind a change event onto it
// new html5 formdata object.
// for each entry, add to formdata to later access via $_FILES["file" + i]
//send formdata to server-side
$(function() {
$('#file').bind("change", function() {
var formData = new FormData();
for (var i = 0, len = document.getElementById('file').files.length; i < len; i++) {
formData.append("file" + i, document.getElementById('file').files[i]);
}
$.ajax({
// url: "file-upload.php", // our php file
// url: "ka1_fileupload.php", // our php file
// nurl: "http://ka1/ka1.php?q=up", // our php file
// url: "/kup.php", // our php file
// url: "/ka1_up.php", // our php file
// url: "/ka1.php?q=kup", // our php file
// url: "/ko0.php?q=kup", // our php file
// url: "/ko1.php?q=kup", // our php file
// bugs url: "10.0.0.112:/ka1.php?q=up", // our php file
// url: "/ko.php?todo=mp3s", // our php file
url: "/ko.php?kup", // our php file
type: 'post',
data: formData,
dataType: 'html', // we return html from our php file
async: true,
processData: false, // tell jQuery not to process the data
contentType: false, // tell jQuery not to set contentType
success : function(data) {
$('#upload-result').append('<div class="alert alert-success"><p>File(s) uploaded successfully!</p><br />');
$('#upload-result .alert').append(data);
},
error : function(request) {
console.log(request.responseText);
}
});
});
});
</script id="script_uploads_end" >
<hr color=white>
<hr color=black>
<div id='editableDiv' contenteditable='true'>paste</div id='editableDiv_end' >
<hr color=black>
<hr color=white>
<hr color=black>
<div id='div' contenteditable='true'>ffpaste</div id='div_end'>
<hr color=black>
<hr color=white>
<script id="script_clipboard" >
function handlePaste (e) {
var clipboardData, pastedData;
// Stop data actually being pasted into div
e.stopPropagation();
e.preventDefault();
// Get pasted data via clipboard API
clipboardData = e.clipboardData || window.clipboardData;
pastedData = clipboardData.getData('Text');
// Do whatever with pasteddata
alert(pastedData);
}
document.getElementById('editableDiv').addEventListener('paste', handlePaste);
</script id="script_clipboard_end" >
<script id="script_clipboard_ff" >
// Browsers that support the 'text/html' type in the Clipboard API (Chrome, Firefox 22+)
// Check for 'text/html' in types list. See abligh's answer below for deatils on
// why the DOMStringList bit is needed. We cannot fall back to 'text/plain' as
// Safari/Edge don't advertise HTML data even if it is available
// Extract data and pass it to callback
// Stop the data from actually being pasted
// Everything else: Move existing element contents to a DocumentFragment for safekeeping
// Then wait for browser to paste content into it and cleanup
function handlepaste_ff (e) {
var types, pastedData, savedContent;
if (e && e.clipboardData && e.clipboardData.types && e.clipboardData.getData) {
types = e.clipboardData.types;
if (((types instanceof DOMStringList) && types.contains("text/html")) || (types.indexOf && types.indexOf('text/html') !== -1)) {
pastedData = e.clipboardData.getData('text/html');
// processPaste(editableDiv, pastedData);
processPaste_ff(editableDiv, pastedData);
e.stopPropagation();
e.preventDefault();
return false;
}
}
savedContent = document.createDocumentFragment();
while(editableDiv.childNodes.length > 0) {
savedContent.appendChild(editableDiv.childNodes[0]);
}
waitForPastedData(editableDiv, savedContent);
return true;
}
// If data has been processes by browser, process it
// Retrieve pasted content via innerHTML
// (Alternatively loop through elem.childNodes or elem.getElementsByTagName here)
// Restore saved content
// Call callback
// Else wait 20ms and try again
function waitForPastedData (elem, savedContent) {
if (elem.childNodes && elem.childNodes.length > 0) {
var pastedData = elem.innerHTML;
elem.innerHTML = "";
elem.appendChild(savedContent);
processPaste_ff(elem, pastedData);
}
else {
setTimeout(function () {
waitForPastedData(elem, savedContent)
}, 20);
}
}
// Do whatever with gathered data;
// Modern browsers. Note: 3rd argument is required for Firefox <= 6
function processPaste_ff (elem, pastedData) {
alert(pastedData);
elem.focus();
}
if (editableDiv.addEventListener) {
editableDiv.addEventListener('paste', handlepaste, false);
}
// IE <= 8
else {
editableDiv.attachEvent('onpaste', handlepaste);
}
$(document).on('paste','[contenteditable]',function(e) {
e.preventDefault();
var text = (e.originalEvent || e).clipboardData.getData('text/plain');
window.document.execCommand('insertText', false, text);
});
</script id="script_clipboard_ff_end" >
<script id="script_clipboard_jskit" >
function getSelectionText(){
var selectedText = ""
if (window.getSelection){ // all modern browsers and IE9+
selectedText = window.getSelection().toString()
}
return selectedText
}
document.addEventListener('mouseup', function(){
var thetext = getSelectionText()
if (thetext.length > 0){ // check there's some text selected
console.log(thetext) // logs whatever textual content the user has selected on the page
}
}, false)
function copySelectionText(){
var copysuccess // var to check whether execCommand successfully executed
try{
copysuccess = document.execCommand("copy") // run command to copy selected text to clipboard
}
catch(e){
copysuccess = false
}
return copysuccess
}
</script id="script_clipboard_jskit_end" >
<br />
<hr color="yellow" />
<div id="div_tail" >
<h1>div_tail</h1>
<a href=./ target=_blank><img src=/imgs/gif/disks/disk_yellow.gif></a>
</div id="div_tail_end" >
<br />
<hr color="white" />
<hr color=white>
<img src=/imgs/btn/koeye.png onclick="toggle('div_form',''); return false;" height=20 border=0>div_form
<hr color=goldenrod>
<div id="div_form" >
<h1>div_form</h1>
<form id="form" name=form type="POST" action="/ko/ko.php?form" >
<!-- <form id="form" name=form type="POST" action="ka12:8000/ko.php?ko_coffeeshop?fmt=json" > -->
<input id=form_fmt name=form_fmt type=radio value="json">json
<input id=form_fmt name=form_fmt type=radio value="txt">txt
<input id=form_fmt name=form_fmt type=radio value="csv">csv
<input id=form_fmt name=form_fmt type=radio value="psv">psv
<input id=form_fmt name=form_fmt type=radio value="html">html
<table id=table_form>
<tr><td>fmt</td><td><input id=fmt type=text name=fmt value=""></td></tr>
<tr><td>todo</td><td><input id=todo type=text name=todo value=""></td></tr>
<tr><td>step</td><td><input id=step type=text name=step value=""></td></tr>
<tr><td>x</td><td><input id=x type=text name=x value=""></td></tr>
<tr><td>y</td><td><input id=y type=text name=y value=""></td></tr>
<tr><td>t</td><td><input id=t type=text name=t value=""></td></tr>
<tr><td>xlim</td><td><input id=fmt type=text name=xlim value=""></td></tr>
<tr><td>ylim</td><td><input id=ylim type=text name=ylim value=""></td></tr>
<tr><td>date</td><td><input id=date type=date name=date value=""></td></tr>
<tr><td>time</td><td><input id=time type=time name=form_time value=""></td></tr>
<tr><td>color</td><td><input id=color type=color name=form_color value=""></td></tr>
</table>
<input id="submit" type="submit">
<!--
<div id="div_form_fname"> </div>
<label for="fname">First name: </label>
<input id="fname" type="text"></input>
<div id="div_form_lname"> </div>
<label for="lname">Last name: </label>
<input id="lname" type="text"></input>
<div id="div_form_submit"> </div>
<input id="submit" type="submit">
-->
</form>
<p></p>
</div id=div_form_end>
<hr color=white>
<div id="div_ko_form2">
<h1>ko_form2</h1>
<form name=”latlon” action=”test2a.php” method=’post’
onchange=”return usePointFromPostcode(document.getElementById(‘postcode’).value) && usePointFromPostcode1(document.getElementById(‘postcode1’).value) “>
<input id=”postcode” type=”text” size=”10″ /><br>
<input id=”postcode1″ type=”text” size=”10″/><br>
Latitude:<input name=”lat” type=”text” id=”lat” size=”10″/><br />
Longitude:<input name=”lon” type=”text” id=”lon” size=”10″/><br><br>
Latitude:<input name=”lat1″ type=”text” id=”lat1″ size=”10″/><br />
Longitude:<input name=”lon1″ type=”text” id=”lon1″ size=”10″/>
<input type=”submit” value=”Get Lat / Lon”/>
</form>
<script id="script_ko_form2">
function usePointFromPostcode(postcode, callbackFunction) {
localSearch.setSearchCompleteCallback(null,
function() {
if (localSearch.results[0]) {
var resultLat = localSearch.results[0].lat;
var resultLng = localSearch.results[0].lng;
var point = new GLatLng(resultLat,resultLng);
document.forms[‘latlon’].lat.value=resultLat;
document.forms[‘latlon’].lon.value=resultLng;
callbackFunction(point);
}
else{
alert(“Postcode not found!”);
}
});
localSearch.execute(postcode + “, UK”);
}
function usePointFromPostcode1(postcode1, callbackFunction) {
localSearch.setSearchCompleteCallback(null,
function() {
if (localSearch.results[0]) {
var resultLat = localSearch.results[0].lat;
var resultLng = localSearch.results[0].lng;
var point = new GLatLng(resultLat,resultLng);
document.forms[‘latlon’].lat1.value=resultLat;
document.forms[‘latlon’].lon1.value=resultLng;
callbackFunction(point);
}
else{
alert(“Postcode not found!”);
}
});
localSearch.execute(postcode1 + “, UK”);
}
</script id="script_ko_form2">
</div id="div_ko_form2">
<br />
<hr color="white" />
<div id="div_ko_form3">
<h1>ko_form3</h1>
<form action="signup.html" method="post" id="signup">
<h1>Sign Up</h1>
<div id="div_ko_form3b" class="field">
<label for="name">Name:</label>
<input type="text" id="name" name="name" placeholder="Enter your fullname" />
<small></small>
</div id="div_ko_form3b_end">
<div class="field">
<label for="email">Email:</label>
<input type="text" id="email" name="email" placeholder="Enter your email address" />
<small></small>
</div>
<button type="submit">Subscribe</button>
</form>
<script id="script_ko_form3b"
// To access the elements of the form, you get the form element first:
// And use index, id, or name to access the element. The following accesses the first form element:
// The following accesses the second input element:
// After accessing a form field, you can use the value property to access its value, for example:
// getting the element's value
const form = document.getElementById('signup');
form.elements[0]; // by index
form.elements['name']; // by name
form.elements['name']; // by id (name & id are the same in this case)
form.elements[1]; // by index
form.elements['email']; // by name
form.elements['email']; // by id
const form = document.getElementById('signup');
const name = form.elements['name'];
const email = form.elements['email'];
let fullName = name.value;
let emailAddress = email.value;
</script id="script_ko_form3b_end"
</div id="div_ko_form">
<script id="script_form">
const form = document.querySelector('form');
const fname = document.getElementById('fname');
const lname = document.getElementById('lname');
const para = document.querySelector('p');
form.onsubmit = function(e) {
if (fname.value === '' || lname.value === '') {
e.preventDefault();
para.textContent = 'both';
}
}
</script id="script_form_end">
<script id="script_ko_form4">
// Handles jquery, dojo, etc. ajax requests
$('button').click(function() {
preventDefault();
captureForm();
});
(function (send) {
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
XMLHttpRequest.prototype.send = function (data) {
if (isNotEmptyString(token) && isNotEmptyString(header)) {
this.setRequestHeader(header, token);
}
send.call(this, data);
};
})(XMLHttpRequest.prototype.send);
// Handles javascript submit
(function (submit) {
HTMLFormElement.prototype.submit = function (data) {
var token = $("meta[name='_csrf']").attr("content");
var paramName = $("meta[name='_csrf_parameterName']").attr("content");
$('<input>').attr({
type: 'hidden',
name: paramName,
value: token
}).appendTo(this);
submit.call(this, data);
};
})(HTMLFormElement.prototype.submit);
// Handles html submit
document.body.addEventListener('submit', function (event) {
var token = $("meta[name='_csrf']").attr("content");
var paramName = $("meta[name='_csrf_parameterName']").attr("content");
$('<input>').attr({
type: 'hidden',
name: paramName,
value: token
}).appendTo(event.target);
}, false);
// Should only be triggered on first page load
// console.log('ho');
// alert( "BUGS_200 ko_form4 FIRST_PAGE_LOAD ho" );
/* do what you want with the form */
window.onload = function() {
document.getElementById('my-form').onsubmit = function() {
// Should be triggered on form submit
// You must return false to prevent the default form behavior
// console.log('hi');
alert( "BUGS_300 ko_form4 hi" );
return false;
}
}
</script id="script_ko_form4_end">
<div id="div_ko_form4">
<form id="my-form">
<input type="text" name="in" value="some data" />
<button type="submit">Go</button>
</form>
</div id="div_ko_form4_end">
<script id="script_ko_form4b" >
$(function() {
$('#my-form').on("submit", function(e) {
e.preventDefault(); // cancel the actual submit
/* do what you want with the form */
// Should be triggered on form submit
console.log('hi');
alert( "BUGS_820 script_ko_form4b hi" );
});
});
// Should only be triggered on first page load
// console.log('ho');
// alert( "BUGS_821 script_ko_form4b hi" );
window.addEventListener("DOMContentLoaded", function() {
document.getElementById('my-form').addEventListener("submit", function(e) {
e.preventDefault(); // before the code
/* do what you want with the form */
// Should be triggered on form submit
// console.log('hi');
alert( "BUGS_222 script_ko_form4b ho" );
})
});
// "the contorstionists daughter"
function processForm(e) {
if (e.preventDefault) e.preventDefault();
/* do what you want with the form */
// You must return false to prevent the default form behavior
return false;
}
var form = document.getElementById('my-form');
if (form.attachEvent) {
form.attachEvent("submit", processForm);
}
else {
form.addEventListener("submit", processForm);
}
</script id="script_ko_form4b_end" >
<script id="script_anim" >
// Kreuzotter-vs-Uplefts Animation, demonstrating how to use the API of the DragDrop-Library
function ANIM() {
alert( "BUGS_510 ANIM<br>\n" );
if (!dd.obj || !dd.op6) { return; }
alert( "BUGS_511 ANIM<br>\n" );
if (dd.elements.img_ko.z <= dd.elements.img_ok.z) dd.elements.img_ko.setZ(dd.img_ok.low.z - 1);
dd.elements.img_ko.moveTo(
dd.elements.img_ko.x <= -dd.elements.img_ko.w?
iW - dd.elements.img_ko.w - 20 :
(dd.elements.img_ko.x - 3),
(dd.obj==dd.elements.img_ko)?
dd.elements.img_ko.y :
(dd.elements.img_ok.y - dh)
);
dd.elements.img_ok.moveTo(
dd.elements.img_ok.x <= -dd.elements.img_ok.w?
iW - dd.elements.img_ok.w - 20 :
(dd.elements.img_ok.x - 3),
(dd.obj==dd.elements.img_blobw)?
dd.elements.img_ok.y :
(dd.elements.img_ok.y - dh)
);
dd.elements.img_koeye.moveTo(
dd.elements.img_koeye.x <= -dd.elments.img_koeye.w? iW-dd.elements.img_koeye.w-20 :
(dd.elements.img_koeye.x+5), dd.elements.img_koeye.y + dh
);
dd.elements.img_koeyeb.moveTo(
dd.elements.img_koeyeb.x <= -dd.elments.img_koeyeb.w? iW-dd.elements.img_koeyeb.w-20 :
(dd.elements.img_koeyeb.x+5), dd.elements.img_koeyeb.y + dh
);
dd.elements.img_koeyew.moveTo(
dd.elements.img_koeyew.x <= -dd.elments.img_koeyew.w? iW-dd.elements.img_koeyew.w-20 :
(dd.elements.img_koeyew.x+5), dd.elements.img_koeyew.y + dh
);
dd.elements.img_brdb.moveTo(
dd.elements.img_brdb.x <= -dd.elments.img_brdb.w? iW-dd.elements.img_brdb.w-20 :
(dd.elements.img_brdb.x+5), dd.elements.img_brdb.y + dh
);
dd.elements.img_brdw.moveTo(
dd.elements.img_brdw.x <= -dd.elments.img_brdw.w? iW-dd.elements.img_brdw.w-20 :
(dd.elements.img_brdw.x+5), dd.elements.img_brdw.y + dh
);
dd.elements.img_topgif.moveTo(
dd.elements.img_topgif.x <= -dd.elments.img_topgif.w? iW-dd.elements.img_topgif.w-20 :
(dd.elements.img_topgif.x+5), dd.elements.img_topgif.y + dh
);
}
setTimeout("ANIM()", dd.kq? 200 : 100);
}
// override funcs defined within the Lib
insetbutton="/imgs/btn/img_blobw.png";
function my_PickFunc() {
// alert( "BUGS_550 my_PickFunc dd.obj.name="+dd.obj.name );
if (dd.obj.name == 'button') dd.obj.swapImage(insetbutton.src);
if (!dd.obj.name.indexOf('imb_blobb') && dd.obj.x == dd.obj.defx) {
if (dd.elements.img_blobb.copies.length < 80) dd.elements.img_blobb.copy();
}
}
function my_DragFunc() {
// alert( "BUGS_560 my_DragFunc dd.obj.name="+dd.obj.name );
if (dd.obj.name == 'thumb') {
var red = parseInt((dd.elements.thumb.x-dd.elements.thumb.defx)*255/45),
blue = -red,
green = (255-Math.abs(red)).toString(16);
red = (red > 0? red : 0).toString(16);
blue = (blue > 0? blue : 0).toString(16);
while (red.length < 2) red = '0'+red;
while (blue.length < 2) blue = '0'+blue;
while (green.length < 2) green = '0'+green;
dd.elements.slidercanvas.setBgColor("#"+red+green+blue);
}
}
function my_DropFunc() {
// alert( "BUGS_1120 my_DropFunc dd.obj.name="+dd.obj.name );
var dropTarget = dd.obj.getEltBelow();
if( dropTarget != null ) {
// alert( "BUGS_1121 my_DropFunc dropTarget.name="+dropTarget.name );
// alert( "BUGS_1122 my_DropFunc dropTarget.name="+dropTarget.name );
// alert( "BUGS_1123 my_DropFunc dropTarget.x="+dropTarget.x );
// alert( "BUGS_1124 my_DropFunc dropTarget.y="+dropTarget.y );
// alert( "BUGS_1125 my_DropFunc dropTarget.desc="+dropTarget.desc );
// alert( "BUGS_1126 my_DropFunc dropTarget.role="+dropTarget.role );
// alert( "BUGS_1127 my_DropFunc dropTarget.dx="+dropTarget.dx );
}
if (dd.obj.name == 'button') {
dd.obj.swapImage(outsetbutton.src);
var minh = dd.elements.button.h+((dd.elements.button.y-dd.elements.div_notice_leds.y)<<1);
// dd.elements.img_blobb.resizeTo(
// dd.elements.img_blobb.w,
// (dd.elements.img_blobb.h != minh)? minh : 300
// );
}
}
var outsetbutton = new Image();
outsetbutton.src = '/imgs/btn/koeyeb.png';
var insetbutton = new Image();
insetbutton.src = '/imgs/btn/koeyew.png';
var iH = dd.getWndH();
var iW = dd.getWndW();
// alert( "BUGS_1980 iH="+iH+" iW="+iW );
ANIM();
</script id=script_anim_end>
<script id="script_dhtml">
SET_DHTML("img_ko"+RESIZABLE+TRANSPARENT );
SET_DHTML("img_ok"+RESIZABLE+TRANSPARENT );
SET_DHTML("img_koeye"+RESIZABLE+TRANSPARENT );
SET_DHTML("img_koeyeb"+RESIZABLE+TRANSPARENT );
SET_DHTML("img_koeyew"+RESIZABLE+TRANSPARENT );
SET_DHTML("img_brdb"+RESIZABLE+TRANSPARENT );
SET_DHTML("img_brdw"+RESIZABLE+TRANSPARENT );
SET_DHTML("img_topgif"+RESIZABLE+TRANSPARENT );
SET_DHTML("div_leds"+RESIZABLE+TRANSPARENT );
dh = dd.elements.img_koeye.h - dd.elements.img_koeye.h;
</script id="script_dhtml_end">
</body>
</html>
//
koh5_pano
Drag mouse to navigate.
Navigation
- Left/Right Mouse drag: Changes camera heading.
- Up/Sown Mouse drag: Changes camera pitch.
- Scroll wheel: Changes camera field of view.
- I-Key: Displays Info panel with canvas size, image size and FPS.
17.Aug.2010, Martin Wengenmayer