<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (dtdversion,name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT dtdversion (#PCDATA)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT mincmsversion (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT help (#PCDATA)>
  <!ELEMENT about (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
	<dtdversion>1.3</dtdversion>
	<name>Outsourcer</name>
	<version>1.2</version>
  <mincmsversion>2.0</mincmsversion>
	<help><![CDATA[CiAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgcG9zc2liaWxpdHkgdG8gZXhwb3J0IGFuZCByZS1pbXBvcnQuPGJyLz4KICAgIFNvIHlvdSBjYW4gZWRpdCB0aGVtIHdpdGggYSBlZGl0b3Igb2YgeW91ciBjaG9pY2Ugb3V0c2lkZSB0aGUgQ01TPGJyIC8+CiAgICBBbmQgdGhpcyBpcyB0aGUgc2NvcGU6PGJyIC8+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDstIHBhZ2UgY29udGVudCAoaW5jbC4gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzKTxici8+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDstIGRlc2lnbnMgIG9mIENNUyAodGVtcGxhdGVzIGFuZCBjc3MpPGJyLz4KICAgICZuYnNwOyZuYnNwOyZuYnNwOy0gdXNlciBwbHVnaW5zPGJyLz4KICAgIDxici8+CiAgICBUaGVyZSBhcmUgdHdvIG1vZGVzOjxici8+CiAgICA8YnIvPgogICAgPGI+MSkgbWFudWFsIGV4cG9ydC9pbXBvcnQ8L2I+PGJyIC8+CiAgICBpbXBvcnQgYW5kIGV4cG9ydCBpcyB0cmlnZ2VyZWQgYnkgYnV0dG9uPGJyLz4KICAgIDxici8+CiAgICA8Yj4yKSBhdXRvbWF0aWMgaW1wb3J0PC9iPjxiciAvPgogICAgYWxsb3dzIHlvdSB0byBsb2FkIG1vZGlmaWVkIGZpbGVzIGZyb20gdG1wLWRpciBvbiBldmVyeSByZXF1ZXN0LjxiciAvPgo=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBPbGl2ZXIgSm9vJnN6bGlnOzxiciAvPjxiciAvPlZlcnNpb246IDEuMjxiciAvPjxiciAvPkNoYW5nZSBIaXN0b3J5OjxiciAvPgogICAgPHA+CiAgICAgICAgPGI+VmVyc2lvbiAxLjAgLSBOb3YgMjAxNTwvYj48YnIgLz4KICAgICAgICBJbml0aWFsIFZlcnNpb24KICAgIDwvcD4KICAgIDxwPgogICAgICAgIDxiPlZlcnNpb24gMS4xIC0gRGV6IDIwMTU8L2I+PGJyIC8+CiAgICAgICAgLSBmaXhlZCBidWcgb24gbG9zaW5nIGRlc2lnbiBhc3NpZ25tZW50PGJyIC8+CiAgICAgICAgLSBjaGFuZ2VkIGV4cG9ydCBzdHJ1Y3R1cmU8YnIgLz4KICAgICAgICAtIGFkZGVkIGZlYXR1cmUgdG8gZGVmaW5lIDxpPmNvbnRlbnQgcHJvcHM8L2k+IGFuZCA8aT5kZXNpZ25zPC9pPiB0byBiZSBleHBvcnRlZAogICAgPC9wPgogICAgPHA+CiAgICAgICAgPGI+VmVyc2lvbiAxLjIgLSBEZXogMjAxNTwvYj48YnIgLz4KICAgICAgICAtIGZpeGVkIGJ1ZyBvbiBjb250ZW50IGltcG9ydCAoaWdub3JlIC5iYWsgZXRjKTxiciAvPgogICAgICAgIC0gY2hhbmdlZCBleHBvcnQgc3RydWN0dXJlIG9mIGNvbnRlbnQgYWNjb3JkaW5nIHRvIHBhZ2UgaGllcmFyY2h5PGJyIC8+CiAgICA8L3A+CjxiciAvPg==]]></about>
	<description><![CDATA[Module to export and import content, userplugins, design and css templates]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.default.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiAgIGlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiAgIGlmICghaXNzZXQoJGdDbXMpKSBleGl0OwoKICAgZWNobyAnPGgxPicuX19DTEFTU19fLic8L2gxPic7CgogICBpZiAoISAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCJPdXRzb3VyY2VyX1ZpZXciKSkgewogICAgICBlY2hvICc8aDM+Jy4kdGhpcy0+TGFuZygnYWNjZXNzZGVuaWVkJykuJzwvaDM+JzsKICAgICAgcmV0dXJuIGZhbHNlOwogICB9CgogICAvLyB0b2dnbGUgYXV0b21hdGljIGltcG9ydCBzdGF0dXMKICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgaWYgKGlzc2V0KCRfUE9TVFsnT3V0c291cmNlclN0YXR1cyddKSkgewogICAgICBlY2hvICc8ZmllbGRzZXQgc3R5bGU9InBhZGRpbmctbGVmdDogMTVweDsiPjxsZWdlbmQ+bWVzc2FnZXM8L2xlZ2VuZD4nOwogICAgICBzd2l0Y2goJF9QT1NUWydPdXRzb3VyY2VyU3RhdHVzJ10pIHsKICAgICAgICAgY2FzZSAnZGlzYWJsZSc6CiAgICAgICAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdzdGF0dXMnLCAnb2ZmJyk7CiAgICAgICAgICAgIGVjaG8gJzxoNCBzdHlsZT0iY29sb3I6ICMxRThBMDA7Ij5hdXRvbWF0aWMgaW1wb3J0IGhhcyBiZWVuIGRpc2FibGVkPC9oND4nOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAnZW5hYmxlJzoKICAgICAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ3N0YXR1cycsICdvbicpOwogICAgICAgICAgICAkdGhpcy0+ZXhwb3J0KCk7CiAgICAgICAgICAgIGVjaG8gJzxoNCBzdHlsZT0iY29sb3I6ICMxRThBMDA7Ij5hdXRvbWF0aWMgaW1wb3J0IGhhcyBiZWVuIGVuYWJsZWQ8L2g0Pic7CiAgICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGVjaG8gJzwvZmllbGRzZXQ+JzsKICAgfQoKICAgLy8gc2V0IHNldHRpbmdzCiAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIGlmIChpc3NldCgkX1BPU1RbJ091dHNvdXJjZXJTZXR0aW5ncyddKSkgewogICAgICBlY2hvICc8ZmllbGRzZXQgc3R5bGU9InBhZGRpbmctbGVmdDogMTVweDsiPjxsZWdlbmQ+bWVzc2FnZXM8L2xlZ2VuZD4nOwogICAgICAkYXJyRGVzaWducyA9IChhcnJheSlAJF9QT1NUWydPdXRzb3VyY2VyRGVzaWducyddOwogICAgICBpZiAoIWVtcHR5KCRhcnJEZXNpZ25zKSkgewogICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZGVzaWduX25hbWVzJywgaW1wbG9kZSgnfCcsICRhcnJEZXNpZ25zKSk7CiAgICAgICAgIGVjaG8gJzxwIHN0eWxlPSJjb2xvcjogIzFFOEEwMDsiPjxpPmRlc2lnbnM8L2k+IHRvIGV4cG9ydCBoYXZlIGJlZW4gc2V0PC9wPic7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgIGVjaG8gJzxwIHN0eWxlPSJjb2xvcjogI2NjMDAwMDsiPjxpPmRlc2lnbnM8L2k+IHRvIGV4cG9ydCBtYXkgbm90IGJlIGVtcHR5PC9wPic7CiAgICAgIH0KICAgICAgJGFyckNvbnRlbnRQcm9wcyA9IChhcnJheSlAJF9QT1NUWydPdXRzb3VyY2VyQ29udGVudFByb3BzJ107CiAgICAgIGlmICghZW1wdHkoJGFyckNvbnRlbnRQcm9wcykpIHsKICAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2NvbnRlbnRfcHJvcF9uYW1lcycsIGltcGxvZGUoJ3wnLCAkYXJyQ29udGVudFByb3BzKSk7CiAgICAgICAgIGVjaG8gJzxwIHN0eWxlPSJjb2xvcjogIzFFOEEwMDsiPjxpPmNvbnRlbnQgcHJvcHM8L2k+IHRvIGV4cG9ydCBoYXZlIGJlZW4gc2V0PC9wPic7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgIGVjaG8gJzxwIHN0eWxlPSJjb2xvcjogI2NjMDAwMDsiPjxpPmNvbnRlbnQgcHJvcHM8L2k+IHRvIGV4cG9ydCBtYXkgbm90IGJlIGVtcHR5PC9wPic7CiAgICAgIH0KCiAgICAgIGlmIChpc3NldCgkX1BPU1RbJ091dHNvdXJjZXJEZWJ1ZyddKSkgewogICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbWVzc2FnZXNfZGVidWcnLCAnb24nKTsKICAgICAgICAgZWNobyAnPHAgc3R5bGU9ImNvbG9yOiAjMUU4QTAwOyI+PGk+ZGVidWcgbWVzc2FnZXM8L2k+IGhhcyBiZWVuIGVuYWJsZWQ8L3A+JzsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ21lc3NhZ2VzX2RlYnVnJywgJ29mZicpOwogICAgICAgICBlY2hvICc8cCBzdHlsZT0iY29sb3I6ICMxRThBMDA7Ij48aT5kZWJ1ZyBtZXNzYWdlczwvaT4gaGFzIGJlZW4gZGlzYWJsZWQ8L3A+JzsKICAgICAgfQoKICAgICAgZWNobyAnPC9maWVsZHNldD4nOwogICB9CgogICAvLyBjbGVhciB0ZW1wIGRpcgogICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpZiAoaXNzZXQoJF9QT1NUWydPdXRzb3VyY2VyQ2xlYXInXSkpIHsKICAgICAgZWNobyAnPGZpZWxkc2V0IHN0eWxlPSJwYWRkaW5nLWxlZnQ6IDE1cHg7Ij48bGVnZW5kPm1lc3NhZ2VzPC9sZWdlbmQ+JzsKICAgICAgZWNobyAnPGg0IHN0eWxlPSJjb2xvcjogIzFFOEEwMDsiPmV4cG9ydCBkaXJlY3RvcnkgaGFzIGJlZW4gY2xlYXJlZDwvaDQ+JzsKICAgICAgJGFyclJldHVybiA9ICR0aGlzLT5jbGVhclRlbXBEaXIoKTsKICAgICAgZWNobyAkdGhpcy0+YXJyTWVzc2FnZXNUb0hUTUwoJGFyclJldHVybik7CiAgICAgIGVjaG8gJzwvZmllbGRzZXQ+JzsKICAgfQoKCiAgIC8vIHJ1biBtYW51YWwgaW1wb3J0IC8gZXhwb3J0CiAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHRyeSB7CiAgICAgIGlmIChpc3NldCgkX1BPU1RbJ091dHNvdXJjZXInXSkpIHsKICAgICAgICAgZWNobyAnPGZpZWxkc2V0IHN0eWxlPSJwYWRkaW5nLWxlZnQ6IDE1cHg7Ij48bGVnZW5kPm1lc3NhZ2VzPC9sZWdlbmQ+JzsKCiAgICAgICAgIGlmICgkX1BPU1RbJ091dHNvdXJjZXInXSA9PSAnZXhwb3J0JykgewogICAgICAgICAgICBlY2hvICc8aDQgc3R5bGU9ImNvbG9yOiAjMUU4QTAwOyI+cnVubmluZyBtYW51YWwgZXhwb3J0PC9oND4nOwogICAgICAgICAgICAkYXJyUmV0dXJuID0gJHRoaXMtPmV4cG9ydCgpOwogICAgICAgICAgICBlY2hvICR0aGlzLT5hcnJNZXNzYWdlc1RvSFRNTCgkYXJyUmV0dXJuKTsKICAgICAgICAgfQogICAgICAgICBlbHNlaWYgKCRfUE9TVFsnT3V0c291cmNlciddID09ICdpbXBvcnQnKSB7CiAgICAgICAgICAgIGVjaG8gJzxoNCBzdHlsZT0iY29sb3I6ICMxRThBMDA7Ij5ydW5uaW5nIG1hbnVhbCBpbXBvcnQ8L2g0Pic7CiAgICAgICAgICAgICRhcnJSZXR1cm4gPSAkdGhpcy0+aW1wb3J0KCk7CiAgICAgICAgICAgIGVjaG8gJHRoaXMtPmFyck1lc3NhZ2VzVG9IVE1MKCRhcnJSZXR1cm4pOwogICAgICAgICB9CiAgICAgICAgIGVjaG8gJzwvZmllbGRzZXQ+JzsKICAgICAgfQogICB9CiAgIGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgZWNobyAiPGgyPkV4Y2VwdGlvbiBmcm9tIE91dHNvdXJjZXI8L2gyPiIuJGUtPmdldE1lc3NhZ2UoKTsKICAgfQoKLy8gc2hvdyBhZG1pbiBwYWdlCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmVjaG8gJwogICAgPGZpZWxkc2V0IHN0eWxlPSJwYWRkaW5nLWxlZnQ6IDE1cHg7Ij4KICAgICAgICA8bGVnZW5kPm1vZHVsZSBoZWxwPC9sZWdlbmQ+Jy4KICAgICAgICAkdGhpcy0+TGFuZygnaGVscCcpLgogICAgJzwvZmllbGRzZXQ+JzsKCiRhcnJQb3NzaWJsZUNvbnRlbnRQcm9wZXJ0aWVzID0gJHRoaXMtPmdldEFsbFBvc3NpYmxlQ29udGVudFByb3BlcnRpZXMoKTsKJGFyclVzZWRDb250ZW50UHJvcGVydGllcyA9IGV4cGxvZGUoJ3wnLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnY29udGVudF9wcm9wX25hbWVzJywgJ2NvbnRlbnRfZW4nKSk7CiRhcnJMYXlvdXRDb2xsZWN0aW9ucyA9IENtc0xheW91dENvbGxlY3Rpb246OmdldF9hbGwoKTsKJGFyclBvc3NpYmxlRGVzaWducyA9IGFycmF5KCk7CmZvcmVhY2ggKCRhcnJMYXlvdXRDb2xsZWN0aW9ucyBhcyAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbikgewogICAkYXJyUG9zc2libGVEZXNpZ25zW10gPSAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbi0+Z2V0X25hbWUoKTsKfQokYXJyVXNlZERlc2lnbnMgPSBleHBsb2RlKCd8JywgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Rlc2lnbl9uYW1lcycpKTsKZWNobyAnCiAgIDxmaWVsZHNldCBzdHlsZT0icGFkZGluZy1sZWZ0OiAxNXB4OyI+CiAgICAgIDxsZWdlbmQ+c2V0dGluZ3M8L2xlZ2VuZD4KICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgPHA+CiAgICAgICAgICAgIERlc2lnbnMgdG8gYmUgZXhwb3J0ZWQ6PGJyIC8+CiAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0iT3V0c291cmNlckRlc2lnbnNbXSIgc2l6ZT0iMyIgbXVsdGlwbGUgcmVxdWlyZWQ+CiAgICAgICAgICAgICc7CiAgICAgICAgICAgIGZvcmVhY2goJGFyclBvc3NpYmxlRGVzaWducyBhcyAkc3RyRGVzaWduTmFtZSkgewogICAgICAgICAgICAgICAgZWNobyAnPG9wdGlvbiB2YWx1ZT0iJy4kc3RyRGVzaWduTmFtZS4nIicuKGluX2FycmF5KCRzdHJEZXNpZ25OYW1lLCAkYXJyVXNlZERlc2lnbnMpPyAnIHNlbGVjdGVkPSJzZWxlY3RlZCInOicnKS4nPicuJHN0ckRlc2lnbk5hbWUuJzwvb3B0aW9uPicuUEhQX0VPTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlY2hvICcKICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgIDwvcD4KCiAgICAgICAgIDxwPgogICAgICAgICAgICBDb250ZW50UHJvcHMgdG8gYmUgZXhwb3J0ZWQ6PGJyIC8+CiAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0iT3V0c291cmNlckNvbnRlbnRQcm9wc1tdIiBzaXplPSI3IiBtdWx0aXBsZSByZXF1aXJlZD4KICAgICAgICAgICAgJzsKICAgICAgICAgICAgZm9yZWFjaCgkYXJyUG9zc2libGVDb250ZW50UHJvcGVydGllcyBhcyAkc3RyUHJvcE5hbWUpIHsKICAgICAgICAgICAgICAgIGVjaG8gJzxvcHRpb24gdmFsdWU9IicuJHN0clByb3BOYW1lLiciJy4oaW5fYXJyYXkoJHN0clByb3BOYW1lLCAkYXJyVXNlZENvbnRlbnRQcm9wZXJ0aWVzKT8gJyBzZWxlY3RlZD0ic2VsZWN0ZWQiJzonJykuJz4nLiRzdHJQcm9wTmFtZS4nPC9vcHRpb24+Jy5QSFBfRU9MOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gJwogICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgPC9wPgoKICAgICAgICAgPHA+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iT3V0c291cmNlckRlYnVnIicuKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdtZXNzYWdlc19kZWJ1ZycsICdvZmYnKSA9PSAnb24nPycgY2hlY2tlZD0iY2hlY2tlZCInOicnKS4nPiBzaG93IGRlYnVnIG1lc3NhZ2VzCiAgICAgICAgIDwvcD4KCiAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9Ik91dHNvdXJjZXJTZXR0aW5ncyIgdmFsdWU9InNhdmUgc2V0dGluZ3MiPgogICAgICAgICAmbmJzcDsmbmJzcDsmbmJzcDsKICAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iT3V0c291cmNlckNsZWFyIiB2YWx1ZT0iY2xlYXIgZXhwb3J0IGRpciI+CiAgICAgIDwvZm9ybT4KICAgPC9maWVsZHNldD4KJzsKCgplY2hvICc8ZmllbGRzZXQgc3R5bGU9InBhZGRpbmctbGVmdDogMTVweDsiPjxsZWdlbmQ+YXV0b21hdGljIGltcG9ydDwvbGVnZW5kPic7CmlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgnc3RhdHVzJywgJ29mZicpID09ICdvbicpIHsKICAgZWNobyAnCiAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCI+CiAgICAgICAgIGF1dG9tYXRpYyBpbXBvcnQgPGI+aXMgZW5hYmxlZDwvYj4gIDxpbnB1dCB0eXBlPSJzdWJtaXQiIG5hbWU9Ik91dHNvdXJjZXJTdGF0dXMiIHZhbHVlPSJkaXNhYmxlIj4KICAgICAgPC9mb3JtPgogICAnOwp9CmVsc2UgewogICBlY2hvICcKICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgYXV0b21hdGljIGltcG9ydDogPGlucHV0IHR5cGU9InN1Ym1pdCIgbmFtZT0iT3V0c291cmNlclN0YXR1cyIgdmFsdWU9ImVuYWJsZSI+PGJyIC8+CiAgICAgICAgIChhbiBpbml0aWFsIGV4cG9ydCB3aWxsIGJlIGRvbmUpCiAgICAgIDwvZm9ybT4KICAgJzsKfQplY2hvICc8L2ZpZWxkc2V0Pic7CgoKZWNobyAnCiAgIDxmaWVsZHNldCBzdHlsZT0icGFkZGluZy1sZWZ0OiAxNXB4OyI+CiAgICAgIDxsZWdlbmQ+bWFudWFsIGV4cG9ydC9pbXBvcnQ8L2xlZ2VuZD4KICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0Ij4KICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiB2YWx1ZT0iZXhwb3J0IiBuYW1lPSJPdXRzb3VyY2VyIiBjaGVja2VkPSJjaGVja2VkIi8+bWFudWFsIGV4cG9ydDxici8+CiAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgdmFsdWU9ImltcG9ydCIgbmFtZT0iT3V0c291cmNlciIvPm1hbnVhbCBpbXBvcnQ8YnIvPgogICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0icnVuIj4KICAgICAgPC9mb3JtPgogICA8L2ZpZWxkc2V0PgonOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiRsYW5nWydhY2Nlc3NkZW5pZWQnXSA9ICdBY2Nlc3MgZGVuaWVkISc7CiRsYW5nWydhZG1pbmRlc2NyaXB0aW9uJ10gPSAnTW9kdWxlIHRvIGV4cG9ydCBhbmQgaW1wb3J0IGNvbnRlbnQsIHVzZXJwbHVnaW5zLCBkZXNpZ24gYW5kIGNzcyB0ZW1wbGF0ZXMnOwoKJGxhbmdbJ2hlbHAnXSA9ICcKICAgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBwb3NzaWJpbGl0eSB0byBleHBvcnQgYW5kIHJlLWltcG9ydC48YnIvPgogICAgU28geW91IGNhbiBlZGl0IHRoZW0gd2l0aCBhIGVkaXRvciBvZiB5b3VyIGNob2ljZSBvdXRzaWRlIHRoZSBDTVM8YnIgLz4KICAgIEFuZCB0aGlzIGlzIHRoZSBzY29wZTo8YnIgLz4KICAgICZuYnNwOyZuYnNwOyZuYnNwOy0gcGFnZSBjb250ZW50IChpbmNsLiBpbmRpdmlkdWFsIHByb3BlcnRpZXMpPGJyLz4KICAgICZuYnNwOyZuYnNwOyZuYnNwOy0gZGVzaWducyAgb2YgQ01TICh0ZW1wbGF0ZXMgYW5kIGNzcyk8YnIvPgogICAgJm5ic3A7Jm5ic3A7Jm5ic3A7LSB1c2VyIHBsdWdpbnM8YnIvPgogICAgPGJyLz4KICAgIFRoZXJlIGFyZSB0d28gbW9kZXM6PGJyLz4KICAgIDxici8+CiAgICA8Yj4xKSBtYW51YWwgZXhwb3J0L2ltcG9ydDwvYj48YnIgLz4KICAgIGltcG9ydCBhbmQgZXhwb3J0IGlzIHRyaWdnZXJlZCBieSBidXR0b248YnIvPgogICAgPGJyLz4KICAgIDxiPjIpIGF1dG9tYXRpYyBpbXBvcnQ8L2I+PGJyIC8+CiAgICBhbGxvd3MgeW91IHRvIGxvYWQgbW9kaWZpZWQgZmlsZXMgZnJvbSB0bXAtZGlyIG9uIGV2ZXJ5IHJlcXVlc3QuPGJyIC8+Cic7CgokbGFuZ1snY2hhbmdlbG9nJ10gPSAnCiAgICA8cD4KICAgICAgICA8Yj5WZXJzaW9uIDEuMCAtIE5vdiAyMDE1PC9iPjxiciAvPgogICAgICAgIEluaXRpYWwgVmVyc2lvbgogICAgPC9wPgogICAgPHA+CiAgICAgICAgPGI+VmVyc2lvbiAxLjEgLSBEZXogMjAxNTwvYj48YnIgLz4KICAgICAgICAtIGZpeGVkIGJ1ZyBvbiBsb3NpbmcgZGVzaWduIGFzc2lnbm1lbnQ8YnIgLz4KICAgICAgICAtIGNoYW5nZWQgZXhwb3J0IHN0cnVjdHVyZTxiciAvPgogICAgICAgIC0gYWRkZWQgZmVhdHVyZSB0byBkZWZpbmUgPGk+Y29udGVudCBwcm9wczwvaT4gYW5kIDxpPmRlc2lnbnM8L2k+IHRvIGJlIGV4cG9ydGVkCiAgICA8L3A+CiAgICA8cD4KICAgICAgICA8Yj5WZXJzaW9uIDEuMiAtIERleiAyMDE1PC9iPjxiciAvPgogICAgICAgIC0gZml4ZWQgYnVnIG9uIGNvbnRlbnQgaW1wb3J0IChpZ25vcmUgLmJhayBldGMpPGJyIC8+CiAgICAgICAgLSBjaGFuZ2VkIGV4cG9ydCBzdHJ1Y3R1cmUgb2YgY29udGVudCBhY2NvcmRpbmcgdG8gcGFnZSBoaWVyYXJjaHk8YnIgLz4KICAgIDwvcD4KJzs=]]></data>
	</file>
	<file>
	  <filename>/lang/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8vIHBlcm1pc3Npb25zCiR0aGlzLT5DcmVhdGVQZXJtaXNzaW9uKCdPdXRzb3VyY2VyJywnT3V0c291cmNlcicpOwoKLy8gcHJlZmVyZW5jZQokdGhpcy0+U2V0UHJlZmVyZW5jZSgnc3RhdHVzJywgJ29mZicpOwokdGhpcy0+U2V0UHJlZmVyZW5jZSgnbGFzdF9ydW4nLCAnJyk7CgovLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+R2V0RnJpZW5kbHlOYW1lKCksICR0aGlzLT5MYW5nKCdpbnN0YWxsZWQnLCR0aGlzLT5HZXRWZXJzaW9uKCkpKTsKCj8+]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiAgIC8vY2xlYXIgdGVtcCBkaXIKICAgJHRoaXMtPmNsZWFyVGVtcERpcigpOwoKICAgLy8gcmVtb3ZlIHRoZSBwZXJtaXNzaW9ucwogICAkdGhpcy0+UmVtb3ZlUGVybWlzc2lvbignT3V0c291cmNlcicpOwoKICAgLy8gcmVtb3ZlIHByZWZlcmVuY2VzCiAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCk7CgogICAvLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+R2V0RnJpZW5kbHlOYW1lKCksICR0aGlzLT5MYW5nKCd1bmluc3RhbGxlZCcpKTsKCj8+]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiAgIHN3aXRjaCgkb2xkdmVyc2lvbikgewogICAgICBjYXNlICIxLjAiOgogICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc3RhdHVzJywgJ29mZicpOwogICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZGVzaWduX25hbWVzJywgJycpOwogICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbWVzc2FnZXNfZGVidWcnLCAnb24nKTsKICAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2NvbnRlbnRfcHJvcF9uYW1lcycsICdjb250ZW50X2VuJyk7CgogICB9CgogICAvL2Fsd2F5cyBjbGVhciBwcmV2aW91cyBzdHVmZgogICAkdGhpcy0+Y2xlYXJUZW1wRGlyKCk7CgogICAvLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+R2V0RnJpZW5kbHlOYW1lKCksICR0aGlzLT5MYW5nKCd1cGdyYWRlZCcsJHRoaXMtPkdldFZlcnNpb24oKSkpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/moduleinfo.ini</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[W21vZHVsZV0KbmFtZSA9IE91dHNvdXJjZXIKdmVyc2lvbiA9IDEuMgpkZXNjcmlwdGlvbiA9IAphdXRob3IgPSBPbGl2ZXIgSm9vJnN6bGlnOwphdXRob3JlbWFpbCA9IAptaW5jbXN2ZXJzaW9uID0gMi4wCjEx]]></data>
	</file>
	<file>
	  <filename>/Outsourcer.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmNsYXNzIE91dHNvdXJjZXIgZXh0ZW5kcyBDTVNNb2R1bGUgewoKICAgY29uc3QgTUVTU0FHRV9ISU5UICA9ICdoaW50JzsKICAgY29uc3QgTUVTU0FHRV9XQVJOICA9ICd3YXJuJzsKICAgY29uc3QgTUVTU0FHRV9FUlJPUiA9ICdlcnJvcic7CiAgIGNvbnN0IE1FU1NBR0VfREVCVUcgPSAnZGVidWcnOwoKICAgcHJpdmF0ZSAkc3RyVG1wRGlyID0gbnVsbDsKICAgcHJpdmF0ZSAkc3RyVG1wRGlyX0Rlc2lnbnMgPSBudWxsOwogICBwcml2YXRlICRzdHJUbXBEaXJfQ29udGVudCA9IG51bGw7CiAgIHByaXZhdGUgJHN0clRtcERpcl9Vc2VycGx1Z2lucyA9IG51bGw7CgogICBwdWJsaWMgZnVuY3Rpb24gR2V0TmFtZSgpIHsKICAgICAgcmV0dXJuICdPdXRzb3VyY2VyJzsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsKICAgICAgcmV0dXJuICdPdXRzb3VyY2VyJzsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7CiAgICAgIHJldHVybiAnMS4yJzsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEdldEhlbHAoKSB7CiAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnaGVscCcpOwogICB9CgogICBwdWJsaWMgZnVuY3Rpb24gR2V0QXV0aG9yKCkgewogICAgICByZXR1cm4gJ09saXZlciBKb28mc3psaWc7JzsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgewogICAgICByZXR1cm4gJyc7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBHZXRDaGFuZ2VMb2coKSB7CiAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnY2hhbmdlbG9nJyk7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICB9CgogICBwdWJsaWMgZnVuY3Rpb24gSGFzQWRtaW4oKSB7CiAgICAgIHJldHVybiB0cnVlOwogICB9CgogICBwdWJsaWMgZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkgewogICAgICByZXR1cm4gJHRoaXMtPkNoZWNrUGVybWlzc2lvbigiT3V0c291cmNlciIpOwogICB9CgogICBwdWJsaWMgZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uKCkgewogICAgICByZXR1cm4gJ2xheW91dCc7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkgewogICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2FkbWluZGVzY3JpcHRpb24nKTsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgewogICAgICByZXR1cm4gIjIuMCI7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKSB7CiAgICAgIHJldHVybiBhcnJheSgpOwogICB9CgogICBwdWJsaWMgZnVuY3Rpb24gSW5pdGlhbGl6ZUFkbWluKCkgewogICAgICAkdGhpcy0+UmVzdHJpY3RVbmtub3duUGFyYW1zKCk7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBJbml0aWFsaXplRnJvbnRlbmQoKSB7CiAgICAgICR0aGlzLT5SZXN0cmljdFVua25vd25QYXJhbXMoKTsKICAgfQoKICAgLyoqCiAgICAqIEByZXR1cm4gT3V0c291cmNlcgogICAgKi8KICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoKICAgICAgJHRoaXMtPnN0clRtcERpciA9IENNU19ST09UX1BBVEggLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3RtcCcgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ091dHNvdXJjZXInOwogICAgICAkdGhpcy0+c3RyVG1wRGlyX0Rlc2lnbnMgPSAkdGhpcy0+c3RyVG1wRGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdkZXNpZ25zJzsKICAgICAgJHRoaXMtPnN0clRtcERpcl9Db250ZW50ID0gJHRoaXMtPnN0clRtcERpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnY29udGVudCc7CiAgICAgICR0aGlzLT5zdHJUbXBEaXJfVXNlcnBsdWdpbnMgPSAkdGhpcy0+c3RyVG1wRGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICd1c2VycGx1Z2lucyc7CgogICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CgogICAgICBpZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoJ3N0YXR1cycsICdvZmYnKSA9PSAnb24nKSB7CiAgICAgICAgICR0aGlzLT5pbXBvcnQoKTsKICAgICAgfQogICB9CgogICAvKioKICAgICogbWFpbiBmdW5jdGlvbiAtIGV4cG9ydAogICAgKgogICAgKiBAcmV0dXJuIGFycmF5CiAgICAqLwogICBwdWJsaWMgZnVuY3Rpb24gZXhwb3J0KCkgewoKICAgICAgJGFyclJldHVybiA9IGFycmF5KCk7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXlfbWVyZ2UoJGFyclJldHVybiwgJHRoaXMtPmV4cG9ydERlc2lnbnMoKSk7CgogICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gJ2hyJyk7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXlfbWVyZ2UoJGFyclJldHVybiwgJHRoaXMtPmV4cG9ydENvbnRlbnQoKSk7CgogICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gJ2hyJyk7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXlfbWVyZ2UoJGFyclJldHVybiwgJHRoaXMtPmV4cG9ydFVzZXJwbHVnaW5zKCkpOwoKICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+ICdocicpOwoKICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xhc3RfcnVuJywgdGltZSgpKTsKICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfSElOVCwgJ21lc3NhZ2UnID0+ICdsYXN0IHJ1biBpcyBzZXQgdG86ICcgLiBkYXRlKCJZLW0tZCBIOmk6cyIpKTsKCiAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICB9CgogICAvKioKICAgICogbWFpbiBmdW5jdGlvbiAtIGltcG9ydAogICAgKgogICAgKiBAcmV0dXJuIGFycmF5CiAgICAqLwogICBwdWJsaWMgZnVuY3Rpb24gaW1wb3J0KCkgewoKICAgICAgJGFyclJldHVybiA9IGFycmF5KCk7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXlfbWVyZ2UoJGFyclJldHVybiwgICR0aGlzLT5pbXBvcnREZXNpZ25zKCkpOwoKICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+ICdocicpOwoKICAgICAgJGFyclJldHVybiA9IGFycmF5X21lcmdlKCRhcnJSZXR1cm4sICR0aGlzLT5pbXBvcnRDb250ZW50KCkpOwoKICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+ICdocicpOwoKICAgICAgJGFyclJldHVybiA9IGFycmF5X21lcmdlKCRhcnJSZXR1cm4sICR0aGlzLT5pbXBvcnRVc2VycGx1Z2lucygpKTsKCiAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiAnaHInKTsKCiAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdsYXN0X3J1bicsIHRpbWUoKSk7CiAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0hJTlQsICdtZXNzYWdlJyA9PiAnbGFzdCBydW4gaXMgc2V0IHRvOiAnIC4gZGF0ZSgiWS1tLWQgSDppOnMiKSk7CgogICAgICByZXR1cm4gJGFyclJldHVybjsKICAgfQoKICAgLyoqCiAgICAqIG1haW4gZnVuY3Rpb24gLSBjbGVhcgogICAgKgogICAgKiBAcmV0dXJuIGFycmF5CiAgICAqLwogICBwdWJsaWMgZnVuY3Rpb24gY2xlYXJUZW1wRGlyKCkgewogICAgICAkdGhpcy0+ZGVsZXRlUmVjdXJzaXZlKCR0aGlzLT5zdHJUbXBEaXIpOwogICB9CgogICAvKioKICAgICogaGVscGVyIGZ1bmN0aW9uIC0gbGF5b3V0IG1lc3NhZ2VzCiAgICAqCiAgICAqIEBwYXJhbSAkYXJyTWVzc2FnZXMKICAgICogQHJldHVybiBIVE1MIExpc3QKICAgICovCiAgIHB1YmxpYyBmdW5jdGlvbiBhcnJNZXNzYWdlc1RvSFRNTCgkYXJyTWVzc2FnZXMpIHsKICAgICAgJHN0clJldHVybiA9ICc8dWwgc3R5bGU9Imxpc3Qtc3R5bGUtdHlwZTogbm9uZTsiPic7CiAgICAgIGZvcmVhY2ggKChhcnJheSkkYXJyTWVzc2FnZXMgYXMgJGFyck1lc3NhZ2UpIHsKICAgICAgICAgc3dpdGNoICgkYXJyTWVzc2FnZVsndHlwZSddKSB7CiAgICAgICAgICAgIGNhc2UgT3V0c291cmNlcjo6TUVTU0FHRV9ISU5UOgogICAgICAgICAgICAgICAkc3RyUmV0dXJuIC49ICc8bGkgc3R5bGU9ImNvbG9yOiAjMUU4QTAwOyI+JyAuICRhcnJNZXNzYWdlWydtZXNzYWdlJ10gLiAnPC9saT4nOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBPdXRzb3VyY2VyOjpNRVNTQUdFX1dBUk46CiAgICAgICAgICAgICAgICRzdHJSZXR1cm4gLj0gJzxsaSBzdHlsZT0iY29sb3I6ICNlZTk5MDA7Ij4nIC4gJGFyck1lc3NhZ2VbJ21lc3NhZ2UnXSAuICc8L2xpPic7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIE91dHNvdXJjZXI6Ok1FU1NBR0VfRVJST1I6CiAgICAgICAgICAgICAgICRzdHJSZXR1cm4gLj0gJzxsaSBzdHlsZT0iY29sb3I6ICNjYzAwMDA7Ij4nIC4gJGFyck1lc3NhZ2VbJ21lc3NhZ2UnXSAuICc8L2xpPic7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIE91dHNvdXJjZXI6Ok1FU1NBR0VfREVCVUc6CiAgICAgICAgICAgICAgIGlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbWVzc2FnZXNfZGVidWcnLCAnb2ZmJykgPT0gJ29uJykgewogICAgICAgICAgICAgICAgICAkc3RyUmV0dXJuIC49ICc8bGkgc3R5bGU9ImNvbG9yOiAjOUU5RTlFOyI+JyAuICRhcnJNZXNzYWdlWydtZXNzYWdlJ10gLiAnPC9saT4nOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAkc3RyUmV0dXJuIC49ICc8bGk+Jm5ic3A7PC9saT4nOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICB9CiAgICAgICRzdHJSZXR1cm4gLj0gIjwvdWw+IjsKCiAgICAgIHJldHVybiAkc3RyUmV0dXJuOwogICB9CgogICAvKioKICAgICogdGhlcmUgaXMgbm8gZnVuY3Rpb24gdG8gZ2V0IGFsbCBwb3NzaWJseSBwcm9wX25hbWVzIG9mIGFsbCBDb250ZW50VHlwZXMsIHNvIGRvIFNRTAogICAgKgogICAgKiBAcmV0dXJuIEFycmF5IG9mIHByb3BfbmFtZQogICAgKi8KICAgcHVibGljIGZ1bmN0aW9uIGdldEFsbFBvc3NpYmxlQ29udGVudFByb3BlcnRpZXMoKSB7CiAgICAgICRhcnJSZXR1cm4gPSBhcnJheSgpOwogICAgICAkb2JqQ01TID0gY21zbXMoKTsKICAgICAgJG9iakFET0Nvbm5lY3Rpb24gPSAkb2JqQ01TLT5HZXREYigpOwogICAgICAkcXVlcnkgPSAiU0VMRUNUIHByb3BfbmFtZSBGUk9NICIgLiBjbXNfZGJfcHJlZml4KCkgLiAiY29udGVudF9wcm9wcyBHUk9VUCBCWSAgcHJvcF9uYW1lIE9SREVSIEJZICBwcm9wX25hbWUiOwogICAgICAkZGJyZXN1bHQgPSAkb2JqQURPQ29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnkpOwogICAgICBpZiAoJGRicmVzdWx0ID09PSBmYWxzZSkgewogICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdEQi1FUlJPUiAoJyAuIGJhc2VuYW1lKF9fRklMRV9fKSAuICc6JyAuIF9fTElORV9fIC4gJyk6ICcgLiAkb2JqQURPQ29ubmVjdGlvbi0+RXJyb3JNc2coKSAuICc8YnIgLz5RdWVyeTogJyAuICRxdWVyeSk7CiAgICAgIH0KICAgICAgd2hpbGUgKCRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkpIHsKICAgICAgICAgJGFyclJldHVybltdID0gJHJvd1sncHJvcF9uYW1lJ107CiAgICAgIH0KICAgICAgcmV0dXJuICRhcnJSZXR1cm47CiAgIH0KCiAgIC8qKgogICAgKiBjaGVjayBhbmQgY3JlYXRlIGRpcgogICAgKiBAcGFyYW0gJHN0ckRpcgogICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgKi8KICAgcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0RpcmVjdG9yeSgkc3RyRGlyKSB7CiAgICAgICRzdHJEaXIgPSBzdHJfcmVwbGFjZShESVJFQ1RPUllfU0VQQVJBVE9SLkRJUkVDVE9SWV9TRVBBUkFUT1IsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRzdHJEaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SKTsKICAgICAgaWYgKCFmaWxlX2V4aXN0cygkc3RyRGlyKSkgewogICAgICAgICBpZiAoIW1rZGlyKCRzdHJEaXIsIDA3NzAsIHRydWUpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ0RJUi1FUlJPUjogY2FuIG5vdCBtYWtlIGRpcjogJyAuICRzdHJEaXIpOwogICAgICAgICB9CiAgICAgIH0KICAgfQoKICAgLyoqCiAgICAqIHJlbW92ZSB1bndhbnRlZCBjaGFyCiAgICAqIEBwYXJhbSAkc3RyTmFtZQogICAgKiBAcmV0dXJuIHN0cmluZwogICAgKi8KICAgcHJpdmF0ZSBmdW5jdGlvbiBuYW1lVG9EaXJuYW1lKCRzdHJOYW1lKSB7CiAgICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJ35bXmEtekEtWjAtOV9dficsICcnLCAkc3RyTmFtZSk7CiAgIH0KCiAgIC8qKgogICAgKiBAcmV0dXJuIGFycmF5CiAgICAqIEB0aHJvd3MgXENtc0RhdGFOb3RGb3VuZEV4Y2VwdGlvbgogICAgKiBAdGhyb3dzIFxDbXNJbnZhbGlkRGF0YUV4Y2VwdGlvbgogICAgKiBAdGhyb3dzIFxFeGNlcHRpb24KICAgICovCiAgIHByaXZhdGUgZnVuY3Rpb24gZXhwb3J0RGVzaWducygpIHsKCiAgICAgICRhcnJSZXR1cm4gPSBhcnJheSgpOwogICAgICAkYXJyVXNlZERlc2lnbnMgPSBleHBsb2RlKCd8Jywgc3RydG9sb3dlcigkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZGVzaWduX25hbWVzJykpKTsKCiAgICAgICRhcnJMYXlvdXRDb2xsZWN0aW9ucyA9IENtc0xheW91dENvbGxlY3Rpb246OmdldF9hbGwoKTsKICAgICAgZm9yZWFjaCAoJGFyckxheW91dENvbGxlY3Rpb25zIGFzICRvYmpDbXNMYXlvdXRDb2xsZWN0aW9uKSB7CgogICAgICAgICAkaW50RGVzaWduSWQgPSAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbi0+Z2V0X2lkKCk7CiAgICAgICAgICRzdHJEZXNpZ25OYW1lID0gJG9iakNtc0xheW91dENvbGxlY3Rpb24tPmdldF9uYW1lKCk7CgogICAgICAgICAvL2NoZWNrIGlmIGRlc2lnbiBpcyBpbnRlcmVzdGluZwogICAgICAgICBpZiAoIWluX2FycmF5KHN0cnRvbG93ZXIoJHN0ckRlc2lnbk5hbWUpLCAkYXJyVXNlZERlc2lnbnMpKSB7CiAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0RFQlVHLCAnbWVzc2FnZScgPT4gJ3NraXBwaW5nIGRlc2lnbjogJyAuICRzdHJEZXNpZ25OYW1lKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KCiAgICAgICAgIC8vY2hlY2sgZGlyCiAgICAgICAgICRzdHJEZXNpZ25FeHBvcnREaXIgPSAkdGhpcy0+c3RyVG1wRGlyX0Rlc2lnbnMgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGludERlc2lnbklkIC4gJyMnIC4gJHRoaXMtPm5hbWVUb0Rpcm5hbWUoJHN0ckRlc2lnbk5hbWUpOwogICAgICAgICAkdGhpcy0+Y2hlY2tEaXJlY3RvcnkoJHN0ckRlc2lnbkV4cG9ydERpcik7CgogICAgICAgICAkYXJyVGVtcGxhdGVzID0gJG9iakNtc0xheW91dENvbGxlY3Rpb24tPmdldF90ZW1wbGF0ZXMoKTsKICAgICAgICAgJHN0clRlbXBsYXRlRXhwb3J0RGlyID0gJHN0ckRlc2lnbkV4cG9ydERpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAndGVtcGxhdGVzJzsKICAgICAgICAgJHRoaXMtPmNoZWNrRGlyZWN0b3J5KCRzdHJUZW1wbGF0ZUV4cG9ydERpcik7CiAgICAgICAgIGZvcmVhY2ggKCRhcnJUZW1wbGF0ZXMgYXMgJGludFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgJG9iakNtc0xheW91dFRlbXBsYXRlID0gQ21zTGF5b3V0VGVtcGxhdGU6OmxvYWQoJGludFRlbXBsYXRlSWQpOwogICAgICAgICAgICAkaW50SWQgPSAkb2JqQ21zTGF5b3V0VGVtcGxhdGUtPmdldF9pZCgpOwogICAgICAgICAgICAkc3RyTmFtZSA9ICRvYmpDbXNMYXlvdXRUZW1wbGF0ZS0+Z2V0X25hbWUoKTsKICAgICAgICAgICAgJHN0ckNvbnRlbnQgPSAkb2JqQ21zTGF5b3V0VGVtcGxhdGUtPmdldF9jb250ZW50KCk7CiAgICAgICAgICAgICRzdHJUZW1wRmlsZSA9ICRzdHJUZW1wbGF0ZUV4cG9ydERpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkaW50SWQgLiAnIycgLiAkdGhpcy0+bmFtZVRvRGlybmFtZSgkc3RyTmFtZSkgLiAnLnRwbCc7CiAgICAgICAgICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkc3RyVGVtcEZpbGUsICRzdHJDb250ZW50KSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfRVJST1IsICdtZXNzYWdlJyA9PiAnY2FuIG5vdCB3cml0ZSB0ZW1wbGF0ZTogJyAuICRzdHJUZW1wRmlsZSk7CiAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0hJTlQsICdtZXNzYWdlJyA9PiAnRGVzaWduIC0gZXhwb3J0IGRvbmU6ICcgLiAkc3RyRGVzaWduTmFtZSAuICcgfCAnIC4gJHN0ck5hbWUgLiAnIHwgJyAuIGJhc2VuYW1lKCRzdHJUZW1wRmlsZSkpOwogICAgICAgICB9CgogICAgICAgICAkYXJyU3R5bHNoZWV0cyA9ICRvYmpDbXNMYXlvdXRDb2xsZWN0aW9uLT5nZXRfc3R5bGVzaGVldHMoKTsKICAgICAgICAgJHN0clN0eWxlc2hlZXRFeHBvcnREaXIgPSAkc3RyRGVzaWduRXhwb3J0RGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdzdHlsZXNoZWV0cyc7CiAgICAgICAgICR0aGlzLT5jaGVja0RpcmVjdG9yeSgkc3RyU3R5bGVzaGVldEV4cG9ydERpcik7CiAgICAgICAgIGZvcmVhY2ggKCRhcnJTdHlsc2hlZXRzIGFzICRpbnRTdHlsZXNoZWV0SWQpIHsKICAgICAgICAgICAgJG9iakNtc0xheW91dFN0eWxlc2hlZXQgPSBDbXNMYXlvdXRTdHlsZXNoZWV0Ojpsb2FkKCRpbnRTdHlsZXNoZWV0SWQpOwogICAgICAgICAgICAkaW50SWQgPSAkb2JqQ21zTGF5b3V0U3R5bGVzaGVldC0+Z2V0X2lkKCk7CiAgICAgICAgICAgICRzdHJOYW1lID0gJG9iakNtc0xheW91dFN0eWxlc2hlZXQtPmdldF9uYW1lKCk7CiAgICAgICAgICAgICRzdHJDb250ZW50ID0gJG9iakNtc0xheW91dFN0eWxlc2hlZXQtPmdldF9jb250ZW50KCk7CiAgICAgICAgICAgICRzdHJUZW1wRmlsZSA9ICRzdHJTdHlsZXNoZWV0RXhwb3J0RGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRpbnRJZCAuICcjJyAuICR0aGlzLT5uYW1lVG9EaXJuYW1lKCRzdHJOYW1lKSAuICcuY3NzJzsKICAgICAgICAgICAgaWYgKGZpbGVfcHV0X2NvbnRlbnRzKCRzdHJUZW1wRmlsZSwgJHN0ckNvbnRlbnQpID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9FUlJPUiwgJ21lc3NhZ2UnID0+ICdjYW4gbm90IHdyaXRlIHN0eWxlc2hlZXQ6ICcgLiAkc3RyVGVtcEZpbGUpOwogICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ISU5ULCAnbWVzc2FnZScgPT4gJ0Rlc2lnbiAtIGV4cG9ydCBkb25lOiAnIC4gJHN0ckRlc2lnbk5hbWUgLiAnIHwgJyAuICRzdHJOYW1lIC4gJyB8ICcgLiBiYXNlbmFtZSgkc3RyVGVtcEZpbGUpKTsKICAgICAgICAgfQoKICAgICAgfQoKICAgICAgcmV0dXJuICRhcnJSZXR1cm47CiAgIH0KCiAgIC8qKgogICAgKiBAcmV0dXJuIGFycmF5CiAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgKi8KICAgcHJpdmF0ZSBmdW5jdGlvbiBleHBvcnRDb250ZW50KCkgewoKICAgICAgJGFyclJldHVybiA9IGFycmF5KCk7CgogICAgICAkYXJyVXNlZENvbnRlbnRQcm9wZXJ0aWVzID0gZXhwbG9kZSgnfCcsIHN0cnRvbG93ZXIoJHRoaXMtPkdldFByZWZlcmVuY2UoJ2NvbnRlbnRfcHJvcF9uYW1lcycsICdjb250ZW50X2VuJykpKTsKCiAgICAgICRvYmpDb250ZW50T3BlcmF0aW9ucyA9IENvbnRlbnRPcGVyYXRpb25zOjpnZXRfaW5zdGFuY2UoKTsKCiAgICAgICRvYmpDTVMgPSBjbXNtcygpOwogICAgICAkb2JqQURPQ29ubmVjdGlvbiA9ICRvYmpDTVMtPkdldERiKCk7CgogICAgICAkcXVlcnkgPSAiU0VMRUNUIGNwLmNvbnRlbnRfaWQsIGMuY29udGVudF9uYW1lLCBjcC5wcm9wX25hbWUsIGNwLmNvbnRlbnQsIGNwLm1vZGlmaWVkX2RhdGUKICAgICAgICAgICAgRlJPTSAiIC4gY21zX2RiX3ByZWZpeCgpIC4gImNvbnRlbnRfcHJvcHMgY3AKICAgICAgICAgICAgSk9JTiAiIC4gY21zX2RiX3ByZWZpeCgpIC4gImNvbnRlbnQgYyBPTiAoY3AuY29udGVudF9pZCA9IGMuY29udGVudF9pZCkiOwogICAgICAkZGJyZXN1bHQgPSAkb2JqQURPQ29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnkpOwogICAgICBpZiAoJGRicmVzdWx0ID09PSBmYWxzZSkgewogICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdEQi1FUlJPUiAoJyAuIGJhc2VuYW1lKF9fRklMRV9fKSAuICc6JyAuIF9fTElORV9fIC4gJyk6ICcgLiAkb2JqQURPQ29ubmVjdGlvbi0+RXJyb3JNc2coKSAuICc8YnIgLz5RdWVyeTogJyAuICRxdWVyeSk7CiAgICAgIH0KICAgICAgd2hpbGUgKCRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkpIHsKICAgICAgICAgLy9jaGVjayBvZiBwcm9wZXJ0eSBpcyBpbnRlcmVzdGluZwogICAgICAgICBpZiAoIWluX2FycmF5KHN0cnRvbG93ZXIoJHJvd1sncHJvcF9uYW1lJ10pLCAkYXJyVXNlZENvbnRlbnRQcm9wZXJ0aWVzKSkgewogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ERUJVRywgJ21lc3NhZ2UnID0+ICdza2lwcGluZyBjb250ZW50IHByb3BlcnR5OiAnIC4gJHJvd1sncHJvcF9uYW1lJ10pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQoKICAgICAgICAgJG9iakNvbnRlbnQgPSAkb2JqQ29udGVudE9wZXJhdGlvbnMtPkxvYWRDb250ZW50RnJvbUlkKCRyb3dbJ2NvbnRlbnRfaWQnXSwgdHJ1ZSk7CiAgICAgICAgICRzdHJIaWVyYXJjaHlQYXRoID0gJyc7CiAgICAgICAgIGlmICgkb2JqQ29udGVudCBpbnN0YW5jZW9mIENvbnRlbnQpIHsKICAgICAgICAgICAgJHN0ckhpZXJhcmNoeVBhdGggPSAkb2JqQ29udGVudC0+SGllcmFyY2h5UGF0aCgpOwogICAgICAgICB9CiAgICAgICAgIC8vY29udmVydCBoaWVyYXJjaHkgdG8gZGlyZWN0b3J5CiAgICAgICAgICRzdHJIaWVyYXJjaHlQYXRoID0gc3RyX3JlcGxhY2UoIi8iLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkc3RySGllcmFyY2h5UGF0aCk7CiAgICAgICAgICRzdHJIaWVyYXJjaHlQYXRoID0gc3RyX3JlcGxhY2UoIlxcIiwgRElSRUNUT1JZX1NFUEFSQVRPUiwgJHN0ckhpZXJhcmNoeVBhdGgpOwoKICAgICAgICAgJHN0ckNvbnRlbnROYW1lID0gJHRoaXMtPm5hbWVUb0Rpcm5hbWUoJHJvd1snY29udGVudF9uYW1lJ10pOwogICAgICAgICAkc3RyVG1wRGlyID0gJHRoaXMtPnN0clRtcERpcl9Db250ZW50IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRzdHJIaWVyYXJjaHlQYXRoIC4gRElSRUNUT1JZX1NFUEFSQVRPUjsKICAgICAgICAgJHRoaXMtPmNoZWNrRGlyZWN0b3J5KCRzdHJUbXBEaXIpOwogICAgICAgICAkc3RyVGVtcEZpbGUgPSAkc3RyVG1wRGlyIC4gJHJvd1snY29udGVudF9pZCddIC4gJyMnIC4gJHN0ckNvbnRlbnROYW1lIC4gJyMnIC4gJHJvd1sncHJvcF9uYW1lJ10gLiAnLnRwbCc7CiAgICAgICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkc3RyVGVtcEZpbGUsICRyb3dbJ2NvbnRlbnQnXSkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0VSUk9SLCAnbWVzc2FnZScgPT4gJ2NhbiBub3Qgd3JpdGUgY29udGVudGZpbGU6ICcgLiAkc3RyVGVtcEZpbGUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ISU5ULCAnbWVzc2FnZScgPT4gJ0NvbnRlbnQgLSBleHBvcnQgZG9uZTogJyAuICRyb3dbJ2NvbnRlbnRfaWQnXSAuICcgfCAnIC4gJHJvd1snY29udGVudF9uYW1lJ10gLiAnIHwgJyAuICRyb3dbJ3Byb3BfbmFtZSddIC4gICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSk7CiAgICAgIH0KCiAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICB9CgogICAvKioKICAgICogQHJldHVybiBhcnJheQogICAgKiBAdGhyb3dzIFxFeGNlcHRpb24KICAgICovCiAgIHByaXZhdGUgZnVuY3Rpb24gZXhwb3J0VXNlcnBsdWdpbnMoKSB7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXkoKTsKCiAgICAgICRvYmpDTVMgPSBjbXNtcygpOwogICAgICAkb2JqQURPQ29ubmVjdGlvbiA9ICRvYmpDTVMtPkdldERiKCk7CgogICAgICAkdGhpcy0+Y2hlY2tEaXJlY3RvcnkoJHRoaXMtPnN0clRtcERpcl9Vc2VycGx1Z2lucyk7CgogICAgICAkcXVlcnkgPSAiU0VMRUNUIHVzZXJwbHVnaW5faWQsIHVzZXJwbHVnaW5fbmFtZSwgY29kZSwgbW9kaWZpZWRfZGF0ZSBGUk9NICIgLiBjbXNfZGJfcHJlZml4KCkgLiAidXNlcnBsdWdpbnMiOwogICAgICAkZGJyZXN1bHQgPSAkb2JqQURPQ29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnkpOwogICAgICBpZiAoJGRicmVzdWx0ID09PSBmYWxzZSkgewogICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdEQi1FUlJPUiAoJyAuIGJhc2VuYW1lKF9fRklMRV9fKSAuICc6JyAuIF9fTElORV9fIC4gJyk6ICcgLiAkb2JqQURPQ29ubmVjdGlvbi0+RXJyb3JNc2coKSAuICc8YnIgLz5RdWVyeTogJyAuICRxdWVyeSk7CiAgICAgIH0KICAgICAgd2hpbGUgKCRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkpIHsKICAgICAgICAgJHN0clRlbXBGaWxlID0gJHRoaXMtPnN0clRtcERpcl9Vc2VycGx1Z2lucyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkcm93Wyd1c2VycGx1Z2luX2lkJ10gLiAnIycgLiAkcm93Wyd1c2VycGx1Z2luX25hbWUnXSAuICcucGhwJzsKICAgICAgICAgaWYgKGZpbGVfcHV0X2NvbnRlbnRzKCRzdHJUZW1wRmlsZSwgJHJvd1snY29kZSddKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfRVJST1IsICdtZXNzYWdlJyA9PiAnY2FuIG5vdCB3cml0ZSB1c2VycGx1Z2luOiAnIC4gJHN0clRlbXBGaWxlKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfSElOVCwgJ21lc3NhZ2UnID0+ICdVc2VycGx1Z2luIC0gZXhwb3J0IGRvbmU6ICcgLiAkcm93Wyd1c2VycGx1Z2luX25hbWUnXSAuICAnIHwgJyAuIGJhc2VuYW1lKCRzdHJUZW1wRmlsZSkpOwogICAgICB9CgogICAgICByZXR1cm4gJGFyclJldHVybjsKICAgfQoKICAgLyoqCiAgICAqIEByZXR1cm4gYXJyYXkKICAgICogQHRocm93cyBcQ21zRGF0YU5vdEZvdW5kRXhjZXB0aW9uCiAgICAqIEB0aHJvd3MgXENtc0ludmFsaWREYXRhRXhjZXB0aW9uCiAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgKi8KICAgcHJpdmF0ZSBmdW5jdGlvbiBpbXBvcnREZXNpZ25zKCkgewoKICAgICAgJGFyclJldHVybiA9IGFycmF5KCk7CiAgICAgICR0c0xhc3RSdW4gPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGFzdF9ydW4nLCB0aW1lKCkpOwogICAgICAkYXJyVXNlZERlc2lnbnMgPSBleHBsb2RlKCd8Jywgc3RydG9sb3dlcigkdGhpcy0+R2V0UHJlZmVyZW5jZSgnZGVzaWduX25hbWVzJykpKTsKCiAgICAgICRhcnJMYXlvdXRDb2xsZWN0aW9ucyA9IENtc0xheW91dENvbGxlY3Rpb246OmdldF9hbGwoKTsKICAgICAgZm9yZWFjaCAoJGFyckxheW91dENvbGxlY3Rpb25zIGFzICRvYmpDbXNMYXlvdXRDb2xsZWN0aW9uKSB7CgogICAgICAgICAkaW50RGVzaWduSWQgPSAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbi0+Z2V0X2lkKCk7CiAgICAgICAgICRzdHJEZXNpZ25OYW1lID0gJG9iakNtc0xheW91dENvbGxlY3Rpb24tPmdldF9uYW1lKCk7CgogICAgICAgICAvL2NoZWNrIGlmIGRlc2lnbiBpcyBpbnRlcmVzdGluZwogICAgICAgICBpZiAoIWluX2FycmF5KHN0cnRvbG93ZXIoJHN0ckRlc2lnbk5hbWUpLCAkYXJyVXNlZERlc2lnbnMpKSB7CiAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0RFQlVHLCAnbWVzc2FnZScgPT4gJ3NraXBwaW5nIGRlc2lnbjogJyAuICRzdHJEZXNpZ25OYW1lKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KCiAgICAgICAgIC8vYmFzZSBkaXIgZm9yIGRlc2lnbgogICAgICAgICAkc3RyRGVzaWduRXhwb3J0RGlyID0gJHRoaXMtPnN0clRtcERpcl9EZXNpZ25zIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRpbnREZXNpZ25JZCAuICcjJyAuICR0aGlzLT5uYW1lVG9EaXJuYW1lKCRzdHJEZXNpZ25OYW1lKTsKCiAgICAgICAgIC8vY2hlY2sgZGlyCiAgICAgICAgICRzdHJUZW1wbGF0ZUV4cG9ydERpciA9ICRzdHJEZXNpZ25FeHBvcnREaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3RlbXBsYXRlcyc7CiAgICAgICAgICRhcnJUZW1wbGF0ZXMgPSAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbi0+Z2V0X3RlbXBsYXRlcygpOwogICAgICAgICBmb3JlYWNoICgkYXJyVGVtcGxhdGVzIGFzICRpbnRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICRvYmpDbXNMYXlvdXRUZW1wbGF0ZSA9IENtc0xheW91dFRlbXBsYXRlOjpsb2FkKCRpbnRUZW1wbGF0ZUlkKTsKICAgICAgICAgICAgJGludElkID0gJG9iakNtc0xheW91dFRlbXBsYXRlLT5nZXRfaWQoKTsKICAgICAgICAgICAgJHN0ck5hbWUgPSAkb2JqQ21zTGF5b3V0VGVtcGxhdGUtPmdldF9uYW1lKCk7CgogICAgICAgICAgICAkc3RyVGVtcEZpbGUgPSAkc3RyVGVtcGxhdGVFeHBvcnREaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGludElkIC4gJyMnIC4gJHRoaXMtPm5hbWVUb0Rpcm5hbWUoJHN0ck5hbWUpIC4gJy50cGwnOwogICAgICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRzdHJUZW1wRmlsZSkpIHsKICAgICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfV0FSTiwgJ21lc3NhZ2UnID0+ICdubyBleHBvcnQgZm91bmQgZm9yIHRlbXBsYXRlOiAnIC4gJGludElkLicgLSAnLiRzdHJOYW1lIC4gJyBvbiAnIC4gJHN0clRlbXBGaWxlICk7CiAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmlsZW10aW1lKCRzdHJUZW1wRmlsZSkgPD0gJHRzTGFzdFJ1bikgewogICAgICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ERUJVRywgJ21lc3NhZ2UnID0+ICdmaWxlIG5vdCBjaGFuZ2VkOiAnIC4gJHN0ckRlc2lnbk5hbWUgLiAnIHwgJyAuICRzdHJOYW1lIC4gJyB8ICcgLiBiYXNlbmFtZSgkc3RyVGVtcEZpbGUpICk7CiAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkc3RyQ29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRzdHJUZW1wRmlsZSk7CiAgICAgICAgICAgICRzdHJDb250ZW50ID0gcHJlZ19yZXBsYWNlKCd+ey4qJyAuIF9fQ0xBU1NfXyAuICcuKn1bXG5dKn4nLCAnJywgJHN0ckNvbnRlbnQpOyAvL3JlbW92ZSBlYXJseWVyIHRpbWVzdGFtcAogICAgICAgICAgICAkc3RyQ29udGVudCA9ICd7KiBpbXBvcnRlZCB3aXRoICcgLiBfX0NMQVNTX18gLiAnIGF0ICcgLiBkYXRlKCdZLW0tZCBIOmk6cycpIC4gJyAqfScgLiBQSFBfRU9MIC4gJHN0ckNvbnRlbnQ7CgogICAgICAgICAgICAkb2JqQ21zTGF5b3V0VGVtcGxhdGUtPnNldF9jb250ZW50KCRzdHJDb250ZW50KTsKICAgICAgICAgICAgLy8gcHJldmVudCBsb29zaW5nIGFzc29jCiAgICAgICAgICAgICRvYmpDbXNMYXlvdXRUZW1wbGF0ZS0+Z2V0X2Rlc2lnbnMoKTsKICAgICAgICAgICAgJG9iakNtc0xheW91dFRlbXBsYXRlLT5nZXRfYWRkaXRpb25hbF9lZGl0b3JzKCk7CiAgICAgICAgICAgIC8vc2F2ZQogICAgICAgICAgICAkb2JqQ21zTGF5b3V0VGVtcGxhdGUtPnNhdmUoKTsKICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfSElOVCwgJ21lc3NhZ2UnID0+ICduZXcgdmVyc2lvbjogJyAuICRzdHJEZXNpZ25OYW1lIC4gJyB8ICcgLiAkc3RyTmFtZSAuICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSk7CiAgICAgICAgIH0KCiAgICAgICAgICRhcnJTdHlsc2hlZXRzID0gJG9iakNtc0xheW91dENvbGxlY3Rpb24tPmdldF9zdHlsZXNoZWV0cygpOwogICAgICAgICAkc3RyU3R5bGVzaGVldEV4cG9ydERpciA9ICRzdHJEZXNpZ25FeHBvcnREaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3N0eWxlc2hlZXRzJzsKICAgICAgICAgZm9yZWFjaCAoJGFyclN0eWxzaGVldHMgYXMgJGludFN0eWxlc2hlZXRJZCkgewogICAgICAgICAgICAkb2JqQ21zTGF5b3V0U3R5bGVzaGVldCA9IENtc0xheW91dFN0eWxlc2hlZXQ6OmxvYWQoJGludFN0eWxlc2hlZXRJZCk7CiAgICAgICAgICAgICRpbnRJZCA9ICRvYmpDbXNMYXlvdXRTdHlsZXNoZWV0LT5nZXRfaWQoKTsKICAgICAgICAgICAgJHN0ck5hbWUgPSAkb2JqQ21zTGF5b3V0U3R5bGVzaGVldC0+Z2V0X25hbWUoKTsKCiAgICAgICAgICAgICRzdHJUZW1wRmlsZSA9ICRzdHJTdHlsZXNoZWV0RXhwb3J0RGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRpbnRJZCAuICcjJyAuICR0aGlzLT5uYW1lVG9EaXJuYW1lKCRzdHJOYW1lKSAuICcuY3NzJzsKICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkc3RyVGVtcEZpbGUpKSB7CiAgICAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX1dBUk4sICdtZXNzYWdlJyA9PiAnbm8gZXhwb3J0IGZvdW5kIGZvciBzdHlsZXNoZWV0OiAnIC4gJGludElkLicgLSAnLiRzdHJOYW1lICk7CiAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZmlsZW10aW1lKCRzdHJUZW1wRmlsZSkgPD0gJHRzTGFzdFJ1bikgewogICAgICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ERUJVRywgJ21lc3NhZ2UnID0+ICdmaWxlIG5vdCBjaGFuZ2VkOiAnIC4gJHN0ckRlc2lnbk5hbWUgLiAnIHwgJyAuICRzdHJOYW1lIC4gJyB8ICcgLiBiYXNlbmFtZSgkc3RyVGVtcEZpbGUpKTsKICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRzdHJDb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJHN0clRlbXBGaWxlKTsKICAgICAgICAgICAgJHN0ckNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJ34vKi4qJyAuIF9fQ0xBU1NfXyAuICcuKi9bXG5dKn4nLCAnJywgJHN0ckNvbnRlbnQpOyAvL3JlbW92ZSBlYXJseWVyIHRpbWVzdGFtcAogICAgICAgICAgICAkc3RyQ29udGVudCA9ICcvKiBpbXBvcnRlZCB3aXRoICcgLiBfX0NMQVNTX18gLiAnIGF0ICcgLiBkYXRlKCdZLW0tZCBIOmk6cycpIC4gJyAqLycgLiBQSFBfRU9MIC4gJHN0ckNvbnRlbnQ7CgogICAgICAgICAgICAkb2JqQ21zTGF5b3V0U3R5bGVzaGVldC0+c2V0X2NvbnRlbnQoJHN0ckNvbnRlbnQpOwogICAgICAgICAgICAvLyBwcmV2ZW50IGxvb3NpbmcgYXNzb2MKICAgICAgICAgICAgJG9iakNtc0xheW91dFN0eWxlc2hlZXQtPmdldF9kZXNpZ25zKCk7CiAgICAgICAgICAgIC8vc2F2ZQogICAgICAgICAgICAkb2JqQ21zTGF5b3V0U3R5bGVzaGVldC0+c2F2ZSgpOwogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ISU5ULCAnbWVzc2FnZScgPT4gJ25ldyB2ZXJzaW9uOiAnIC4gJHN0ckRlc2lnbk5hbWUgLiAnIHwgJyAuICRzdHJOYW1lIC4gJyB8ICcgLiBiYXNlbmFtZSgkc3RyVGVtcEZpbGUpKTsKICAgICAgICAgfQoKICAgICAgfQoKICAgICAgcmV0dXJuICRhcnJSZXR1cm47CiAgIH0KCiAgIC8qKgogICAgKiBAcmV0dXJuIGFycmF5CiAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgKi8KICAgcHJpdmF0ZSBmdW5jdGlvbiBpbXBvcnRDb250ZW50KCkgewoKICAgICAgJGFyclJldHVybiA9IGFycmF5KCk7CgogICAgICAkdHNMYXN0UnVuID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xhc3RfcnVuJywgdGltZSgpKTsKICAgICAgJGFyclVzZWRDb250ZW50UHJvcGVydGllcyA9IGV4cGxvZGUoJ3wnLCBzdHJ0b2xvd2VyKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdjb250ZW50X3Byb3BfbmFtZXMnLCAnY29udGVudF9lbicpKSk7CgogICAgICAkb2JqQ29udGVudE9wZXJhdGlvbnMgPSBDb250ZW50T3BlcmF0aW9uczo6Z2V0X2luc3RhbmNlKCk7CgogICAgICAkb2JqQ01TID0gY21zbXMoKTsKICAgICAgJG9iakFET0Nvbm5lY3Rpb24gPSAkb2JqQ01TLT5HZXREYigpOwoKICAgICAgJHF1ZXJ5ID0gIlNFTEVDVCBjcC5jb250ZW50X2lkLCBjLmNvbnRlbnRfbmFtZSwgY3AucHJvcF9uYW1lLCBjcC5jb250ZW50LCBjcC5tb2RpZmllZF9kYXRlCiAgICAgICAgICAgIEZST00gIiAuIGNtc19kYl9wcmVmaXgoKSAuICJjb250ZW50X3Byb3BzIGNwCiAgICAgICAgICAgIEpPSU4gIiAuIGNtc19kYl9wcmVmaXgoKSAuICJjb250ZW50IGMgT04gKGNwLmNvbnRlbnRfaWQgPSBjLmNvbnRlbnRfaWQpIjsKICAgICAgJGRicmVzdWx0ID0gJG9iakFET0Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgaWYgKCRkYnJlc3VsdCA9PT0gZmFsc2UpIHsKICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignREItRVJST1IgKCcgLiBiYXNlbmFtZShfX0ZJTEVfXykgLiAnOicgLiBfX0xJTkVfXyAuICcpOiAnIC4gJG9iakFET0Nvbm5lY3Rpb24tPkVycm9yTXNnKCkgLiAnPGJyIC8+UXVlcnk6ICcgLiAkcXVlcnkpOwogICAgICB9CiAgICAgIHdoaWxlICgkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CiAgICAgICAgIC8vY2hlY2sgb2YgcHJvcGVydHkgaXMgaW50ZXJlc3RpbmcKICAgICAgICAgaWYgKCFpbl9hcnJheShzdHJ0b2xvd2VyKCRyb3dbJ3Byb3BfbmFtZSddKSwgJGFyclVzZWRDb250ZW50UHJvcGVydGllcykpIHsKICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfREVCVUcsICdtZXNzYWdlJyA9PiAnc2tpcHBpbmcgY29udGVudCBwcm9wZXJ0eTogJyAuICRyb3dbJ3Byb3BfbmFtZSddKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KCiAgICAgICAgICRvYmpDb250ZW50ID0gJG9iakNvbnRlbnRPcGVyYXRpb25zLT5Mb2FkQ29udGVudEZyb21JZCgkcm93Wydjb250ZW50X2lkJ10sIHRydWUpOwogICAgICAgICAkc3RySGllcmFyY2h5UGF0aCA9ICcnOwogICAgICAgICBpZiAoJG9iakNvbnRlbnQgaW5zdGFuY2VvZiBDb250ZW50KSB7CiAgICAgICAgICAgICRzdHJIaWVyYXJjaHlQYXRoID0gJG9iakNvbnRlbnQtPkhpZXJhcmNoeVBhdGgoKTsKICAgICAgICAgfQogICAgICAgICAvL2NvbnZlcnQgaGllcmFyY2h5IHRvIGRpcmVjdG9yeQogICAgICAgICAkc3RySGllcmFyY2h5UGF0aCA9IHN0cl9yZXBsYWNlKCIvIiwgRElSRUNUT1JZX1NFUEFSQVRPUiwgJHN0ckhpZXJhcmNoeVBhdGgpOwogICAgICAgICAkc3RySGllcmFyY2h5UGF0aCA9IHN0cl9yZXBsYWNlKCJcXCIsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRzdHJIaWVyYXJjaHlQYXRoKTsKCiAgICAgICAgICRzdHJDb250ZW50TmFtZSA9ICR0aGlzLT5uYW1lVG9EaXJuYW1lKCRyb3dbJ2NvbnRlbnRfbmFtZSddKTsKICAgICAgICAgJHN0clRtcERpciA9ICR0aGlzLT5zdHJUbXBEaXJfQ29udGVudCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkc3RySGllcmFyY2h5UGF0aCAuIERJUkVDVE9SWV9TRVBBUkFUT1I7CiAgICAgICAgICRzdHJUZW1wRmlsZSA9ICRzdHJUbXBEaXIgLiAkcm93Wydjb250ZW50X2lkJ10gLiAnIycgLiAkc3RyQ29udGVudE5hbWUgLiAnIycgLiAkcm93Wydwcm9wX25hbWUnXSAuICcudHBsJzsKICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkc3RyVGVtcEZpbGUpKSB7CiAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX1dBUk4sICdtZXNzYWdlJyA9PiAnZmlsZSBub3QgZm91bmQgKG1heSBiZSBjb250ZW50IGl0ZW0gaXMgbmV3IGFuZCBub3QgeWV0IGV4cG9ydGVkKTogJyAuICRzdHJDb250ZW50TmFtZSAuICcgfCAnIC4gJHJvd1sncHJvcF9uYW1lJ10pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoZmlsZW10aW1lKCRzdHJUZW1wRmlsZSkgPD0gJHRzTGFzdFJ1bikgewogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ERUJVRywgJ21lc3NhZ2UnID0+ICdmaWxlIG5vdCBjaGFuZ2VkOiAnIC4gJHN0ckNvbnRlbnROYW1lIC4gJyB8ICcgLiAkcm93Wydwcm9wX25hbWUnXSAuICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CgogICAgICAgICAvL2xvYWQgQ29udGVudE9iamVjdAogICAgICAgICAkb2JqQ29udGVudCA9ICRvYmpDb250ZW50T3BlcmF0aW9ucy0+TG9hZENvbnRlbnRGcm9tSWQoJHJvd1snY29udGVudF9pZCddLCB0cnVlKTsKICAgICAgICAgaWYgKCRvYmpDb250ZW50IGluc3RhbmNlb2YgQ29udGVudCkgewogICAgICAgICAgICAkc3RyQ29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRzdHJUZW1wRmlsZSk7CiAgICAgICAgICAgICRzdHJDb250ZW50ID0gcHJlZ19yZXBsYWNlKCd+ey4qJyAuIF9fQ0xBU1NfXyAuICcuKn1bXG5dKn4nLCAnJywgJHN0ckNvbnRlbnQpOyAvL3JlbW92ZSBlYXJseWVyIHRpbWVzdGFtcAogICAgICAgICAgICAkc3RyQ29udGVudCA9ICd7KiBpbXBvcnRlZCB3aXRoICcgLiBfX0NMQVNTX18gLiAnIGF0ICcgLiBkYXRlKCdZLW0tZCBIOmk6cycpIC4gJyAqfScgLiBQSFBfRU9MIC4gJHN0ckNvbnRlbnQ7CiAgICAgICAgICAgICRvYmpDb250ZW50LT5TZXRQcm9wZXJ0eVZhbHVlKCRyb3dbJ3Byb3BfbmFtZSddLCAkc3RyQ29udGVudCk7CiAgICAgICAgICAgICRvYmpDb250ZW50LT5TYXZlKCk7CiAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0hJTlQsICdtZXNzYWdlJyA9PiAnbmV3IHZlcnNpb246ICcgLiAkc3RyQ29udGVudE5hbWUgLiAnIHwgJyAuICRyb3dbJ3Byb3BfbmFtZSddIC4gJyB8ICcgLiBiYXNlbmFtZSgkc3RyVGVtcEZpbGUpKTsKICAgICAgICAgfQoKICAgICAgfQoKICAgICAgcmV0dXJuICRhcnJSZXR1cm47CiAgIH0KCiAgIC8qKgogICAgKiBAcmV0dXJuIGFycmF5CiAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgKi8KICAgcHJpdmF0ZSBmdW5jdGlvbiBpbXBvcnRVc2VycGx1Z2lucygpIHsKCiAgICAgICRhcnJSZXR1cm4gPSBhcnJheSgpOwoKICAgICAgJHRzTGFzdFJ1biA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsYXN0X3J1bicsIHRpbWUoKSk7CiAgICAgICRvYmpDTVMgPSBjbXNtcygpOwogICAgICAkb2JqQURPQ29ubmVjdGlvbiA9ICRvYmpDTVMtPkdldERiKCk7CgogICAgICAkcXVlcnkgPSAiU0VMRUNUIHVzZXJwbHVnaW5faWQsIHVzZXJwbHVnaW5fbmFtZSwgY29kZSwgbW9kaWZpZWRfZGF0ZSBGUk9NICIgLiBjbXNfZGJfcHJlZml4KCkgLiAidXNlcnBsdWdpbnMiOwogICAgICAkZGJyZXN1bHQgPSAkb2JqQURPQ29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnkpOwogICAgICBpZiAoJGRicmVzdWx0ID09PSBmYWxzZSkgewogICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdEQi1FUlJPUiAoJyAuIGJhc2VuYW1lKF9fRklMRV9fKSAuICc6JyAuIF9fTElORV9fIC4gJyk6ICcgLiAkb2JqQURPQ29ubmVjdGlvbi0+RXJyb3JNc2coKSAuICc8YnIgLz5RdWVyeTogJyAuICRxdWVyeSk7CiAgICAgIH0KICAgICAgd2hpbGUgKCRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkpIHsKICAgICAgICAgJHN0clRlbXBGaWxlID0gJHRoaXMtPnN0clRtcERpcl9Vc2VycGx1Z2lucyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkcm93Wyd1c2VycGx1Z2luX2lkJ10gLiAnIycgLiAkcm93Wyd1c2VycGx1Z2luX25hbWUnXSAuICcucGhwJzsKICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkc3RyVGVtcEZpbGUpKSB7CiAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX1dBUk4sICdtZXNzYWdlJyA9PiAnZmlsZSBub3QgZm91bmQgKG1heSBiZSB1c2VycGx1Z2luIGlzIG5ldyBhbmQgbm90IHlldCBleHBvcnRlZCk6ICcgLiAkcm93Wyd1c2VycGx1Z2luX25hbWUnXSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChmaWxlbXRpbWUoJHN0clRlbXBGaWxlKSA8PSAkdHNMYXN0UnVuKSB7CiAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0RFQlVHLCAnbWVzc2FnZScgPT4gJ2ZpbGUgbm90IGNoYW5nZWQ6ICcgLiAkcm93Wyd1c2VycGx1Z2luX25hbWUnXSAuICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CgogICAgICAgICAkc3RyQ29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRzdHJUZW1wRmlsZSk7CiAgICAgICAgICRzdHJDb250ZW50ID0gcHJlZ19yZXBsYWNlKCd+Ly4qJyAuIF9fQ0xBU1NfXyAuICcuKi9bXG5dKn4nLCAnJywgJHN0ckNvbnRlbnQpOyAvL3JlbW92ZSBlYXJseWVyIHRpbWVzdGFtcAogICAgICAgICAkc3RyQ29udGVudCA9ICcvKiBpbXBvcnRlZCB3aXRoICcgLiBfX0NMQVNTX18gLiAnIGF0ICcgLiBkYXRlKCdZLW0tZCBIOmk6cycpIC4gJyAqLycgLiBQSFBfRU9MIC4gJHN0ckNvbnRlbnQ7CgogICAgICAgICAvL3NhdmUgbmV3IHZhbHVlcyB0byBkYXRhYmFzZQogICAgICAgICAkb2JqVXNlclRhZ09wZXJhdGlvbnMgPSBVc2VyVGFnT3BlcmF0aW9uczo6Z2V0X2luc3RhbmNlKCk7CiAgICAgICAgICRvYmpVc2VyVGFnT3BlcmF0aW9ucy0+U2V0VXNlclRhZygkcm93Wyd1c2VycGx1Z2luX25hbWUnXSwgJHN0ckNvbnRlbnQsIGZhbHNlKTsKICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfSElOVCwgJ21lc3NhZ2UnID0+ICduZXcgdmVyc2lvbjogJyAuICRyb3dbJ3VzZXJwbHVnaW5fbmFtZSddIC4gJyB8ICcgLiBiYXNlbmFtZSgkc3RyVGVtcEZpbGUpKTsKICAgICAgfQoKICAgICAgcmV0dXJuICRhcnJSZXR1cm47CiAgIH0KCiAgIC8qKgogICAgKiBkZWxldGUgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5CiAgICAqIEBwYXJhbSAkc3RyRGlyCiAgICAqLwogICBwcml2YXRlIGZ1bmN0aW9uIGRlbGV0ZVJlY3Vyc2l2ZSgkc3RyRGlyKSB7CiAgICAgIGlmIChpc19kaXIoJHN0ckRpcikpIHsKICAgICAgICAgJG9iamVjdHMgPSBzY2FuZGlyKCRzdHJEaXIpOwogICAgICAgICBmb3JlYWNoICgkb2JqZWN0cyBhcyAkb2JqZWN0KSB7CiAgICAgICAgICAgIGlmICgkb2JqZWN0ICE9ICIuIiAmJiAkb2JqZWN0ICE9ICIuLiIpIHsKICAgICAgICAgICAgICAgaWYgKGlzX2Rpcigkc3RyRGlyLiIvIi4kb2JqZWN0KSkKICAgICAgICAgICAgICAgICAgJHRoaXMtPmRlbGV0ZVJlY3Vyc2l2ZSgkc3RyRGlyLiIvIi4kb2JqZWN0KTsKICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICB1bmxpbmsoJHN0ckRpci4iLyIuJG9iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBybWRpcigkc3RyRGlyKTsKICAgICAgfQogICB9Cgp9]]></data>
	</file>
</module>
