<?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>2.0</version>
    <mincmsversion>2.0</mincmsversion>
	<help><![CDATA[CiAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgcG9zc2liaWxpdHkgdG8gZXhwb3J0IGFuZCByZS1pbXBvcnQuPGJyLz4KICAgIFNvIHlvdSBjYW4gZWRpdCB0aGVtIHdpdGggYSBlZGl0b3Igb2YgeW91ciBjaG9pY2Ugb3V0c2lkZSB0aGUgQ01TPGJyIC8+CiAgICBBbmQgdGhpcyBpcyB0aGUgc2NvcGU6PGJyIC8+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDstIHBhZ2UgY29udGVudCAoaW5jbC4gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzKTxici8+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDstIGRlc2lnbnMgIG9mIENNUyAodGVtcGxhdGVzIGFuZCBjc3MpPGJyLz4KICAgICZuYnNwOyZuYnNwOyZuYnNwOy0gdXNlciBwbHVnaW5zPGJyLz4KICAgIDxici8+CiAgICBUaGVyZSBhcmUgdHdvIG1vZGVzOjxici8+CiAgICA8YnIvPgogICAgPGI+MSkgbWFudWFsIGV4cG9ydC9pbXBvcnQ8L2I+PGJyIC8+CiAgICBpbXBvcnQgYW5kIGV4cG9ydCBpcyB0cmlnZ2VyZWQgYnkgYnV0dG9uPGJyLz4KICAgIDxici8+CiAgICA8Yj4yKSBhdXRvbWF0aWMgaW1wb3J0PC9iPjxiciAvPgogICAgYWxsb3dzIHlvdSB0byBsb2FkIG1vZGlmaWVkIGZpbGVzIGZyb20gdG1wLWRpciBvbiBldmVyeSByZXF1ZXN0LjxiciAvPgo=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBPbGl2ZXIgSm9vJnN6bGlnOzxiciAvPjxiciAvPlZlcnNpb246IDIuMDxiciAvPjxiciAvPkNoYW5nZSBIaXN0b3J5OjxiciAvPgogICAgPHA+CiAgICAgICAgPGI+VmVyc2lvbiAyLjAgLSBKdWwgMjAxOTwvYj48YnIgLz4KICAgICAgICAtIHByZXBhcmVkIGZvciBDTVNNUyAyLjM8YnIgLz4KICAgICAgICAtIGZpeGVkIGJ1ZyBvbiBleHBvcnQgb2YgY3NzIGZpbGVzPGJyIC8+CiAgICA8L3A+CiAgICA8cD4KICAgICAgICA8Yj5WZXJzaW9uIDEuMiAtIERleiAyMDE1PC9iPjxiciAvPgogICAgICAgIC0gZml4ZWQgYnVnIG9uIGNvbnRlbnQgaW1wb3J0IChpZ25vcmUgLmJhayBldGMpPGJyIC8+CiAgICAgICAgLSBjaGFuZ2VkIGV4cG9ydCBzdHJ1Y3R1cmUgb2YgY29udGVudCBhY2NvcmRpbmcgdG8gcGFnZSBoaWVyYXJjaHk8YnIgLz4KICAgIDwvcD4KICAgIDxwPgogICAgICAgIDxiPlZlcnNpb24gMS4xIC0gRGV6IDIwMTU8L2I+PGJyIC8+CiAgICAgICAgLSBmaXhlZCBidWcgb24gbG9zaW5nIGRlc2lnbiBhc3NpZ25tZW50PGJyIC8+CiAgICAgICAgLSBjaGFuZ2VkIGV4cG9ydCBzdHJ1Y3R1cmU8YnIgLz4KICAgICAgICAtIGFkZGVkIGZlYXR1cmUgdG8gZGVmaW5lIDxpPmNvbnRlbnQgcHJvcHM8L2k+IGFuZCA8aT5kZXNpZ25zPC9pPiB0byBiZSBleHBvcnRlZAogICAgPC9wPgogICAgPHA+CiAgICAgICAgPGI+VmVyc2lvbiAxLjAgLSBOb3YgMjAxNTwvYj48YnIgLz4KICAgICAgICBJbml0aWFsIFZlcnNpb24KICAgIDwvcD4KPGJyIC8+]]></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[PD9waHAKCiAgIGlmICghaXNzZXQoJGdDbXMpKSBleGl0Ow==]]></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+CiAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgdmFsdWU9ImltcG9ydCIgbmFtZT0iT3V0c291cmNlciIvPm1hbnVhbCBpbXBvcnQ8YnIvPgogICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0icnVuIj4KICAgICAgPC9mb3JtPgogICA8L2ZpZWxkc2V0PgonOwo=]]></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+Cic7CgokbGFuZ1snY2hhbmdlbG9nJ10gPSAnCiAgICA8cD4KICAgICAgICA8Yj5WZXJzaW9uIDIuMCAtIEp1bCAyMDE5PC9iPjxiciAvPgogICAgICAgIC0gcHJlcGFyZWQgZm9yIENNU01TIDIuMzxiciAvPgogICAgICAgIC0gZml4ZWQgYnVnIG9uIGV4cG9ydCBvZiBjc3MgZmlsZXM8YnIgLz4KICAgIDwvcD4KICAgIDxwPgogICAgICAgIDxiPlZlcnNpb24gMS4yIC0gRGV6IDIwMTU8L2I+PGJyIC8+CiAgICAgICAgLSBmaXhlZCBidWcgb24gY29udGVudCBpbXBvcnQgKGlnbm9yZSAuYmFrIGV0Yyk8YnIgLz4KICAgICAgICAtIGNoYW5nZWQgZXhwb3J0IHN0cnVjdHVyZSBvZiBjb250ZW50IGFjY29yZGluZyB0byBwYWdlIGhpZXJhcmNoeTxiciAvPgogICAgPC9wPgogICAgPHA+CiAgICAgICAgPGI+VmVyc2lvbiAxLjEgLSBEZXogMjAxNTwvYj48YnIgLz4KICAgICAgICAtIGZpeGVkIGJ1ZyBvbiBsb3NpbmcgZGVzaWduIGFzc2lnbm1lbnQ8YnIgLz4KICAgICAgICAtIGNoYW5nZWQgZXhwb3J0IHN0cnVjdHVyZTxiciAvPgogICAgICAgIC0gYWRkZWQgZmVhdHVyZSB0byBkZWZpbmUgPGk+Y29udGVudCBwcm9wczwvaT4gYW5kIDxpPmRlc2lnbnM8L2k+IHRvIGJlIGV4cG9ydGVkCiAgICA8L3A+CiAgICA8cD4KICAgICAgICA8Yj5WZXJzaW9uIDEuMCAtIE5vdiAyMDE1PC9iPjxiciAvPgogICAgICAgIEluaXRpYWwgVmVyc2lvbgogICAgPC9wPgonOw==]]></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+R2V0RnJpZW5kbHlOYW1lKCksICR0aGlzLT5MYW5nKCdpbnN0YWxsZWQnLCR0aGlzLT5HZXRWZXJzaW9uKCkpKTsK]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiAgIC8vY2xlYXIgdGVtcCBkaXIKICAgJHRoaXMtPmNsZWFyVGVtcERpcigpOwoKICAgLy8gcmVtb3ZlIHRoZSBwZXJtaXNzaW9ucwogICAkdGhpcy0+UmVtb3ZlUGVybWlzc2lvbignT3V0c291cmNlcicpOwoKICAgLy8gcmVtb3ZlIHByZWZlcmVuY2VzCiAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCk7CgogICAvLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+R2V0RnJpZW5kbHlOYW1lKCksICR0aGlzLT5MYW5nKCd1bmluc3RhbGxlZCcpKTsK]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiAgIHN3aXRjaCgkb2xkdmVyc2lvbikgewogICAgICBjYXNlICIxLjAiOgogICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc3RhdHVzJywgJ29mZicpOwogICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnZGVzaWduX25hbWVzJywgJycpOwogICAgICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbWVzc2FnZXNfZGVidWcnLCAnb24nKTsKICAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2NvbnRlbnRfcHJvcF9uYW1lcycsICdjb250ZW50X2VuJyk7CgogICB9CgogICAvL2Fsd2F5cyBjbGVhciBwcmV2aW91cyBzdHVmZgogICAkdGhpcy0+Y2xlYXJUZW1wRGlyKCk7CgogICAvLyBwdXQgbWVudGlvbiBpbnRvIHRoZSBhZG1pbiBsb2cKICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+R2V0RnJpZW5kbHlOYW1lKCksICR0aGlzLT5MYW5nKCd1cGdyYWRlZCcsJHRoaXMtPkdldFZlcnNpb24oKSkpOwoK]]></data>
	</file>
	<file>
	  <filename>/moduleinfo.ini</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[W21vZHVsZV0KbmFtZSA9ICJPdXRzb3VyY2VyIgp2ZXJzaW9uID0gMi4wCmF1dGhvciA9ICJPbGl2ZXIgSm9vJnN6bGlnOyIKYXV0aG9yZW1haWwgPSAiIgptaW5jbXN2ZXJzaW9uID0gMi4wCmxhenlsb2FkYWRtaW4gPSAwCmxhenlsb2FkZnJvbnRlbmQgPSAwClttZXRhXQpnZW5lcmF0ZWQgPSAxNTY0NDI2NDUzCmNtc192ZXIgPSAyLjMtYmV0YTUK]]></data>
	</file>
	<file>
	  <filename>/Outsourcer.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmNsYXNzIE91dHNvdXJjZXIgZXh0ZW5kcyBDTVNNb2R1bGUgewoKICAgY29uc3QgTUVTU0FHRV9ISU5UICA9ICdoaW50JzsKICAgY29uc3QgTUVTU0FHRV9XQVJOICA9ICd3YXJuJzsKICAgY29uc3QgTUVTU0FHRV9FUlJPUiA9ICdlcnJvcic7CiAgIGNvbnN0IE1FU1NBR0VfREVCVUcgPSAnZGVidWcnOwoKICAgcHJpdmF0ZSAkc3RyVG1wRGlyID0gbnVsbDsKICAgcHJpdmF0ZSAkc3RyVG1wRGlyX0Rlc2lnbnMgPSBudWxsOwogICBwcml2YXRlICRzdHJUbXBEaXJfQ29udGVudCA9IG51bGw7CiAgIHByaXZhdGUgJHN0clRtcERpcl9Vc2VycGx1Z2lucyA9IG51bGw7CgogICBwdWJsaWMgZnVuY3Rpb24gR2V0TmFtZSgpIHsKICAgICAgcmV0dXJuICdPdXRzb3VyY2VyJzsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsKICAgICAgcmV0dXJuICdPdXRzb3VyY2VyJzsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7CiAgICAgIHJldHVybiAnMi4wJzsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEdldEhlbHAoKSB7CiAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnaGVscCcpOwogICB9CgogICBwdWJsaWMgZnVuY3Rpb24gR2V0QXV0aG9yKCkgewogICAgICByZXR1cm4gJ09saXZlciBKb28mc3psaWc7JzsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgewogICAgICByZXR1cm4gJyc7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBHZXRDaGFuZ2VMb2coKSB7CiAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnY2hhbmdlbG9nJyk7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICB9CgogICBwdWJsaWMgZnVuY3Rpb24gSGFzQWRtaW4oKSB7CiAgICAgIHJldHVybiB0cnVlOwogICB9CgogICBwdWJsaWMgZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkgewogICAgICByZXR1cm4gJHRoaXMtPkNoZWNrUGVybWlzc2lvbigiT3V0c291cmNlciIpOwogICB9CgogICBwdWJsaWMgZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uKCkgewogICAgICByZXR1cm4gJ2xheW91dCc7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkgewogICAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2FkbWluZGVzY3JpcHRpb24nKTsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgewogICAgICByZXR1cm4gIjIuMCI7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKSB7CiAgICAgIHJldHVybiBhcnJheSgpOwogICB9CgogICBwdWJsaWMgZnVuY3Rpb24gSW5pdGlhbGl6ZUFkbWluKCkgewogICAgICAkdGhpcy0+UmVzdHJpY3RVbmtub3duUGFyYW1zKCk7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBJbml0aWFsaXplRnJvbnRlbmQoKSB7CiAgICAgICR0aGlzLT5SZXN0cmljdFVua25vd25QYXJhbXMoKTsKICAgfQoKICAgLyoqCiAgICAqIEByZXR1cm4gT3V0c291cmNlcgogICAgKi8KICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkgewoKICAgICAgJHRoaXMtPnN0clRtcERpciA9IENNU19ST09UX1BBVEggLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3RtcCcgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ091dHNvdXJjZXInOwogICAgICAkdGhpcy0+c3RyVG1wRGlyX0Rlc2lnbnMgPSAkdGhpcy0+c3RyVG1wRGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdkZXNpZ25zJzsKICAgICAgJHRoaXMtPnN0clRtcERpcl9Db250ZW50ID0gJHRoaXMtPnN0clRtcERpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnY29udGVudCc7CiAgICAgICR0aGlzLT5zdHJUbXBEaXJfVXNlcnBsdWdpbnMgPSAkdGhpcy0+c3RyVG1wRGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICd1c2VycGx1Z2lucyc7CgogICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CgogICAgICBpZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoJ3N0YXR1cycsICdvZmYnKSA9PSAnb24nKSB7CiAgICAgICAgICR0aGlzLT5pbXBvcnQoKTsKICAgICAgfQogICB9CgogICAvKioKICAgICogbWFpbiBmdW5jdGlvbiAtIGV4cG9ydAogICAgKgogICAgKiBAcmV0dXJuIGFycmF5CiAgICAqLwogICBwdWJsaWMgZnVuY3Rpb24gZXhwb3J0KCkgewoKICAgICAgJGFyclJldHVybiA9IGFycmF5KCk7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXlfbWVyZ2UoJGFyclJldHVybiwgJHRoaXMtPmV4cG9ydERlc2lnbnMoKSk7CgogICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gJ2hyJyk7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXlfbWVyZ2UoJGFyclJldHVybiwgJHRoaXMtPmV4cG9ydENvbnRlbnQoKSk7CgogICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gJ2hyJyk7CgogICAgICAgLy8gbm8gbmVlZCB0byBleHBvcnQgdXNlcnBsdWdpbnMgc2luY2UgQ01TTVMgMi4zLCB0aGV5IGFyZSBubyBsb25nZXIgc3RvcmVkIGluIGRhdGFiYXNlCiAgICAgICBpZiAoIWZpbGVfZXhpc3RzKENNU19ST09UX1BBVEggLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ2Fzc2V0cycgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3BsdWdpbnMnKSkgewogICAgICAgICAgICRhcnJSZXR1cm4gPSBhcnJheV9tZXJnZSgkYXJyUmV0dXJuLCAkdGhpcy0+ZXhwb3J0VXNlcnBsdWdpbnMoKSk7CiAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+ICdocicpOwogICAgICAgfQoKICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xhc3RfcnVuJywgdGltZSgpKTsKICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfSElOVCwgJ21lc3NhZ2UnID0+ICdsYXN0IHJ1biBpcyBzZXQgdG86ICcgLiBkYXRlKCJZLW0tZCBIOmk6cyIpKTsKCiAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICB9CgogICAvKioKICAgICogbWFpbiBmdW5jdGlvbiAtIGltcG9ydAogICAgKgogICAgKiBAcmV0dXJuIGFycmF5CiAgICAqLwogICBwdWJsaWMgZnVuY3Rpb24gaW1wb3J0KCkgewoKICAgICAgJGFyclJldHVybiA9IGFycmF5KCk7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXlfbWVyZ2UoJGFyclJldHVybiwgICR0aGlzLT5pbXBvcnREZXNpZ25zKCkpOwoKICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+ICdocicpOwoKICAgICAgJGFyclJldHVybiA9IGFycmF5X21lcmdlKCRhcnJSZXR1cm4sICR0aGlzLT5pbXBvcnRDb250ZW50KCkpOwoKICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+ICdocicpOwoKICAgICAgLy8gbm8gbmVlZCB0byBleHBvcnQgdXNlcnBsdWdpbnMgc2luY2UgQ01TTVMgMi4zLCB0aGV5IGFyZSBubyBsb25nZXIgc3RvcmVkIGluIGRhdGFiYXNlCiAgICAgIGlmICghZmlsZV9leGlzdHMoQ01TX1JPT1RfUEFUSCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnYXNzZXRzJyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAncGx1Z2lucycpKSB7CiAgICAgICAgICAkYXJyUmV0dXJuID0gYXJyYXlfbWVyZ2UoJGFyclJldHVybiwgJHRoaXMtPmltcG9ydFVzZXJwbHVnaW5zKCkpOwogICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+ICdocicpOwogICAgICB9CgogICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbGFzdF9ydW4nLCB0aW1lKCkpOwogICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ISU5ULCAnbWVzc2FnZScgPT4gJ2xhc3QgcnVuIGlzIHNldCB0bzogJyAuIGRhdGUoIlktbS1kIEg6aTpzIikpOwoKICAgICAgJG9iakNNUyA9IGNtc21zKCk7CiAgICAgICRvYmpDTVMtPmNsZWFyX2NhY2hlZF9maWxlcygpOwoKICAgICAgcmV0dXJuICRhcnJSZXR1cm47CiAgIH0KCiAgIC8qKgogICAgKiBtYWluIGZ1bmN0aW9uIC0gY2xlYXIKICAgICoKICAgICogQHJldHVybiBhcnJheQogICAgKi8KICAgcHVibGljIGZ1bmN0aW9uIGNsZWFyVGVtcERpcigpIHsKICAgICAgJHRoaXMtPmRlbGV0ZVJlY3Vyc2l2ZSgkdGhpcy0+c3RyVG1wRGlyKTsKICAgfQoKICAgLyoqCiAgICAqIGhlbHBlciBmdW5jdGlvbiAtIGxheW91dCBtZXNzYWdlcwogICAgKgogICAgKiBAcGFyYW0gJGFyck1lc3NhZ2VzCiAgICAqIEByZXR1cm4gSFRNTCBMaXN0CiAgICAqLwogICBwdWJsaWMgZnVuY3Rpb24gYXJyTWVzc2FnZXNUb0hUTUwoJGFyck1lc3NhZ2VzKSB7CiAgICAgICRzdHJSZXR1cm4gPSAnPHVsIHN0eWxlPSJsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ij4nOwogICAgICBmb3JlYWNoICgoYXJyYXkpJGFyck1lc3NhZ2VzIGFzICRhcnJNZXNzYWdlKSB7CiAgICAgICAgIHN3aXRjaCAoJGFyck1lc3NhZ2VbJ3R5cGUnXSkgewogICAgICAgICAgICBjYXNlIE91dHNvdXJjZXI6Ok1FU1NBR0VfSElOVDoKICAgICAgICAgICAgICAgJHN0clJldHVybiAuPSAnPGxpIHN0eWxlPSJjb2xvcjogIzFFOEEwMDsiPicgLiAkYXJyTWVzc2FnZVsnbWVzc2FnZSddIC4gJzwvbGk+JzsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgT3V0c291cmNlcjo6TUVTU0FHRV9XQVJOOgogICAgICAgICAgICAgICAkc3RyUmV0dXJuIC49ICc8bGkgc3R5bGU9ImNvbG9yOiAjZWU5OTAwOyI+JyAuICRhcnJNZXNzYWdlWydtZXNzYWdlJ10gLiAnPC9saT4nOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBPdXRzb3VyY2VyOjpNRVNTQUdFX0VSUk9SOgogICAgICAgICAgICAgICAkc3RyUmV0dXJuIC49ICc8bGkgc3R5bGU9ImNvbG9yOiAjY2MwMDAwOyI+JyAuICRhcnJNZXNzYWdlWydtZXNzYWdlJ10gLiAnPC9saT4nOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBPdXRzb3VyY2VyOjpNRVNTQUdFX0RFQlVHOgogICAgICAgICAgICAgICBpZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoJ21lc3NhZ2VzX2RlYnVnJywgJ29mZicpID09ICdvbicpIHsKICAgICAgICAgICAgICAgICAgJHN0clJldHVybiAuPSAnPGxpIHN0eWxlPSJjb2xvcjogIzlFOUU5RTsiPicgLiAkYXJyTWVzc2FnZVsnbWVzc2FnZSddIC4gJzwvbGk+JzsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgJHN0clJldHVybiAuPSAnPGxpPiZuYnNwOzwvbGk+JzsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgfQogICAgICAkc3RyUmV0dXJuIC49ICI8L3VsPiI7CgogICAgICByZXR1cm4gJHN0clJldHVybjsKICAgfQoKICAgLyoqCiAgICAqIHRoZXJlIGlzIG5vIGZ1bmN0aW9uIHRvIGdldCBhbGwgcG9zc2libHkgcHJvcF9uYW1lcyBvZiBhbGwgQ29udGVudFR5cGVzLCBzbyBkbyBTUUwKICAgICoKICAgICogQHJldHVybiBBcnJheSBvZiBwcm9wX25hbWUKICAgICovCiAgIHB1YmxpYyBmdW5jdGlvbiBnZXRBbGxQb3NzaWJsZUNvbnRlbnRQcm9wZXJ0aWVzKCkgewogICAgICAkYXJyUmV0dXJuID0gYXJyYXkoKTsKICAgICAgJG9iakNNUyA9IGNtc21zKCk7CiAgICAgICRvYmpBRE9Db25uZWN0aW9uID0gJG9iakNNUy0+R2V0RGIoKTsKICAgICAgJHF1ZXJ5ID0gIlNFTEVDVCBwcm9wX25hbWUgRlJPTSAiIC4gY21zX2RiX3ByZWZpeCgpIC4gImNvbnRlbnRfcHJvcHMgR1JPVVAgQlkgIHByb3BfbmFtZSBPUkRFUiBCWSAgcHJvcF9uYW1lIjsKICAgICAgJGRicmVzdWx0ID0gJG9iakFET0Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgaWYgKGlzX251bGwoJGRicmVzdWx0KSB8fCAkZGJyZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ0RCLUVSUk9SICgnIC4gYmFzZW5hbWUoX19GSUxFX18pIC4gJzonIC4gX19MSU5FX18gLiAnKTogJyAuICRvYmpBRE9Db25uZWN0aW9uLT5FcnJvck1zZygpIC4gJzxiciAvPlF1ZXJ5OiAnIC4gJHF1ZXJ5KTsKICAgICAgfQogICAgICB3aGlsZSAoJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSkgewogICAgICAgICAkYXJyUmV0dXJuW10gPSAkcm93Wydwcm9wX25hbWUnXTsKICAgICAgfQogICAgICByZXR1cm4gJGFyclJldHVybjsKICAgfQoKICAgLyoqCiAgICAqIGNoZWNrIGFuZCBjcmVhdGUgZGlyCiAgICAqIEBwYXJhbSAkc3RyRGlyCiAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAqLwogICBwcml2YXRlIGZ1bmN0aW9uIGNoZWNrRGlyZWN0b3J5KCRzdHJEaXIpIHsKICAgICAgJHN0ckRpciA9IHN0cl9yZXBsYWNlKERJUkVDVE9SWV9TRVBBUkFUT1IuRElSRUNUT1JZX1NFUEFSQVRPUiwgRElSRUNUT1JZX1NFUEFSQVRPUiwgJHN0ckRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IpOwogICAgICBpZiAoIWZpbGVfZXhpc3RzKCRzdHJEaXIpKSB7CiAgICAgICAgIGlmICghbWtkaXIoJHN0ckRpciwgMDc3MCwgdHJ1ZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignRElSLUVSUk9SOiBjYW4gbm90IG1ha2UgZGlyOiAnIC4gJHN0ckRpcik7CiAgICAgICAgIH0KICAgICAgfQogICB9CgogICAvKioKICAgICogcmVtb3ZlIHVud2FudGVkIGNoYXIKICAgICogQHBhcmFtICRzdHJOYW1lCiAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAqLwogICBwcml2YXRlIGZ1bmN0aW9uIG5hbWVUb0Rpcm5hbWUoJHN0ck5hbWUpIHsKICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZSgnflteYS16QS1aMC05X11+JywgJycsICRzdHJOYW1lKTsKICAgfQoKICAgLyoqCiAgICAqIEByZXR1cm4gYXJyYXkKICAgICogQHRocm93cyBcQ21zRGF0YU5vdEZvdW5kRXhjZXB0aW9uCiAgICAqIEB0aHJvd3MgXENtc0ludmFsaWREYXRhRXhjZXB0aW9uCiAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgKi8KICAgcHJpdmF0ZSBmdW5jdGlvbiBleHBvcnREZXNpZ25zKCkgewoKICAgICAgJGFyclJldHVybiA9IGFycmF5KCk7CiAgICAgICRhcnJVc2VkRGVzaWducyA9IGV4cGxvZGUoJ3wnLCBzdHJ0b2xvd2VyKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdkZXNpZ25fbmFtZXMnKSkpOwogICAgICBpZiAoZW1wdHkoJGFyclVzZWREZXNpZ25zKSkgJGFyclVzZWREZXNpZ25zID0gYXJyYXkoKTsKCiAgICAgICRhcnJMYXlvdXRDb2xsZWN0aW9ucyA9IENtc0xheW91dENvbGxlY3Rpb246OmdldF9hbGwoKTsKICAgICAgaWYgKGVtcHR5KCRhcnJMYXlvdXRDb2xsZWN0aW9ucykpICRhcnJMYXlvdXRDb2xsZWN0aW9ucyA9IGFycmF5KCk7CiAgICAgIGZvcmVhY2ggKChhcnJheSkkYXJyTGF5b3V0Q29sbGVjdGlvbnMgYXMgJG9iakNtc0xheW91dENvbGxlY3Rpb24pIHsKCiAgICAgICAgICRpbnREZXNpZ25JZCA9ICRvYmpDbXNMYXlvdXRDb2xsZWN0aW9uLT5nZXRfaWQoKTsKICAgICAgICAgJHN0ckRlc2lnbk5hbWUgPSAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbi0+Z2V0X25hbWUoKTsKCiAgICAgICAgIC8vY2hlY2sgaWYgZGVzaWduIGlzIGludGVyZXN0aW5nCiAgICAgICAgIGlmICghaW5fYXJyYXkoc3RydG9sb3dlcigkc3RyRGVzaWduTmFtZSksICRhcnJVc2VkRGVzaWducykpIHsKICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfREVCVUcsICdtZXNzYWdlJyA9PiAnc2tpcHBpbmcgZGVzaWduOiAnIC4gJHN0ckRlc2lnbk5hbWUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQoKICAgICAgICAgLy9jaGVjayBkaXIKICAgICAgICAgJHN0ckRlc2lnbkV4cG9ydERpciA9ICR0aGlzLT5zdHJUbXBEaXJfRGVzaWducyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkaW50RGVzaWduSWQgLiAnIycgLiAkdGhpcy0+bmFtZVRvRGlybmFtZSgkc3RyRGVzaWduTmFtZSk7CiAgICAgICAgICR0aGlzLT5jaGVja0RpcmVjdG9yeSgkc3RyRGVzaWduRXhwb3J0RGlyKTsKCiAgICAgICAgICRhcnJUZW1wbGF0ZXMgPSAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbi0+Z2V0X3RlbXBsYXRlcygpOwogICAgICAgICBpZiAoZW1wdHkoJGFyclRlbXBsYXRlcykpICRhcnJUZW1wbGF0ZXMgPSBhcnJheSgpOwogICAgICAgICAkc3RyVGVtcGxhdGVFeHBvcnREaXIgPSAkc3RyRGVzaWduRXhwb3J0RGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICd0ZW1wbGF0ZXMnOwogICAgICAgICAkdGhpcy0+Y2hlY2tEaXJlY3RvcnkoJHN0clRlbXBsYXRlRXhwb3J0RGlyKTsKICAgICAgICAgZm9yZWFjaCAoKGFycmF5KSRhcnJUZW1wbGF0ZXMgYXMgJGludFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgJG9iakNtc0xheW91dFRlbXBsYXRlID0gQ21zTGF5b3V0VGVtcGxhdGU6OmxvYWQoJGludFRlbXBsYXRlSWQpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAkb2JqQ21zTGF5b3V0VGVtcGxhdGVUeXBlID0gQ21zTGF5b3V0VGVtcGxhdGVUeXBlOjpsb2FkKCRvYmpDbXNMYXlvdXRUZW1wbGF0ZS0+Z2V0X3R5cGVfaWQoKSk7CiAgICAgICAgICAgICAgICRzdHJUZW1wbGF0ZU9yaWdpbmF0b3IgPSAkb2JqQ21zTGF5b3V0VGVtcGxhdGVUeXBlLT5nZXRfb3JpZ2luYXRvcih0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgJHN0clRlbXBsYXRlT3JpZ2luYXRvciA9ICd1bmtub3duJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkc3RyVGVtcGxhdGVPcmlnaW5hdG9yRXhwb3J0RGlyID0gJHN0clRlbXBsYXRlRXhwb3J0RGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICR0aGlzLT5uYW1lVG9EaXJuYW1lKCRzdHJUZW1wbGF0ZU9yaWdpbmF0b3IpOwogICAgICAgICAgICAkdGhpcy0+Y2hlY2tEaXJlY3RvcnkoJHN0clRlbXBsYXRlT3JpZ2luYXRvckV4cG9ydERpcik7CgogICAgICAgICAgICAkaW50SWQgPSAkb2JqQ21zTGF5b3V0VGVtcGxhdGUtPmdldF9pZCgpOwogICAgICAgICAgICAkc3RyTmFtZSA9ICRvYmpDbXNMYXlvdXRUZW1wbGF0ZS0+Z2V0X25hbWUoKTsKICAgICAgICAgICAgJHN0ckNvbnRlbnQgPSAkb2JqQ21zTGF5b3V0VGVtcGxhdGUtPmdldF9jb250ZW50KCk7CiAgICAgICAgICAgICRzdHJUZW1wRmlsZSA9ICRzdHJUZW1wbGF0ZU9yaWdpbmF0b3JFeHBvcnREaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGludElkIC4gJyMnIC4gJHRoaXMtPm5hbWVUb0Rpcm5hbWUoJHN0ck5hbWUpIC4gJy50cGwnOwogICAgICAgICAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoJHN0clRlbXBGaWxlLCAkc3RyQ29udGVudCkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0VSUk9SLCAnbWVzc2FnZScgPT4gJ2NhbiBub3Qgd3JpdGUgdGVtcGxhdGU6ICcgLiAkc3RyVGVtcEZpbGUpOwogICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ISU5ULCAnbWVzc2FnZScgPT4gJ0Rlc2lnbiAtIGV4cG9ydCBkb25lOiAnIC4gJHN0ckRlc2lnbk5hbWUgLiAnIHwgJyAuICRzdHJOYW1lIC4gJyB8ICcgLiBiYXNlbmFtZSgkc3RyVGVtcEZpbGUpKTsKICAgICAgICAgfQoKICAgICAgICAgJGFyclN0eWxzaGVldHMgPSAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbi0+Z2V0X3N0eWxlc2hlZXRzKCk7CiAgICAgICAgIGlmIChlbXB0eSgkYXJyU3R5bHNoZWV0cykpICRhcnJTdHlsc2hlZXRzID0gYXJyYXkoKTsKICAgICAgICAgJHN0clN0eWxlc2hlZXRFeHBvcnREaXIgPSAkc3RyRGVzaWduRXhwb3J0RGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdzdHlsZXNoZWV0cyc7CiAgICAgICAgICR0aGlzLT5jaGVja0RpcmVjdG9yeSgkc3RyU3R5bGVzaGVldEV4cG9ydERpcik7CiAgICAgICAgIGZvcmVhY2ggKChhcnJheSkkYXJyU3R5bHNoZWV0cyBhcyAkaW50U3R5bGVzaGVldElkKSB7CiAgICAgICAgICAgICRvYmpDbXNMYXlvdXRTdHlsZXNoZWV0ID0gQ21zTGF5b3V0U3R5bGVzaGVldDo6bG9hZCgkaW50U3R5bGVzaGVldElkKTsKICAgICAgICAgICAgJGludElkID0gJG9iakNtc0xheW91dFN0eWxlc2hlZXQtPmdldF9pZCgpOwogICAgICAgICAgICAkc3RyTmFtZSA9ICRvYmpDbXNMYXlvdXRTdHlsZXNoZWV0LT5nZXRfbmFtZSgpOwogICAgICAgICAgICAkc3RyQ29udGVudCA9ICRvYmpDbXNMYXlvdXRTdHlsZXNoZWV0LT5nZXRfY29udGVudCgpOwogICAgICAgICAgICAkc3RyVGVtcEZpbGUgPSAkc3RyU3R5bGVzaGVldEV4cG9ydERpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkaW50SWQgLiAnIycgLiAkdGhpcy0+bmFtZVRvRGlybmFtZSgkc3RyTmFtZSkgLiAnLmNzcyc7CiAgICAgICAgICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkc3RyVGVtcEZpbGUsICRzdHJDb250ZW50KSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfRVJST1IsICdtZXNzYWdlJyA9PiAnY2FuIG5vdCB3cml0ZSBzdHlsZXNoZWV0OiAnIC4gJHN0clRlbXBGaWxlKTsKICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfSElOVCwgJ21lc3NhZ2UnID0+ICdEZXNpZ24gLSBleHBvcnQgZG9uZTogJyAuICRzdHJEZXNpZ25OYW1lIC4gJyB8ICcgLiAkc3RyTmFtZSAuICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSk7CiAgICAgICAgIH0KCiAgICAgIH0KCiAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICB9CgogICAvKioKICAgICogQHJldHVybiBhcnJheQogICAgKiBAdGhyb3dzIFxFeGNlcHRpb24KICAgICovCiAgIHByaXZhdGUgZnVuY3Rpb24gZXhwb3J0Q29udGVudCgpIHsKCiAgICAgICRhcnJSZXR1cm4gPSBhcnJheSgpOwoKICAgICAgJGFyclVzZWRDb250ZW50UHJvcGVydGllcyA9IGV4cGxvZGUoJ3wnLCBzdHJ0b2xvd2VyKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdjb250ZW50X3Byb3BfbmFtZXMnLCAnY29udGVudF9lbicpKSk7CiAgICAgIGlmIChlbXB0eSgkYXJyVXNlZENvbnRlbnRQcm9wZXJ0aWVzKSkgJGFyclVzZWRDb250ZW50UHJvcGVydGllcyA9IGFycmF5KCk7CgogICAgICAkb2JqQ29udGVudE9wZXJhdGlvbnMgPSBDb250ZW50T3BlcmF0aW9uczo6Z2V0X2luc3RhbmNlKCk7CgogICAgICAkb2JqQ01TID0gY21zbXMoKTsKICAgICAgJG9iakFET0Nvbm5lY3Rpb24gPSAkb2JqQ01TLT5HZXREYigpOwoKICAgICAgJHF1ZXJ5ID0gIlNFTEVDVCBjcC5jb250ZW50X2lkLCBjLmNvbnRlbnRfbmFtZSwgY3AucHJvcF9uYW1lLCBjcC5jb250ZW50LCBjcC5tb2RpZmllZF9kYXRlCiAgICAgICAgICAgIEZST00gIiAuIGNtc19kYl9wcmVmaXgoKSAuICJjb250ZW50X3Byb3BzIGNwCiAgICAgICAgICAgIEpPSU4gIiAuIGNtc19kYl9wcmVmaXgoKSAuICJjb250ZW50IGMgT04gKGNwLmNvbnRlbnRfaWQgPSBjLmNvbnRlbnRfaWQpIjsKICAgICAgJGRicmVzdWx0ID0gJG9iakFET0Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgaWYgKGlzX251bGwoJGRicmVzdWx0KSB8fCAkZGJyZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9FUlJPUiwgJ21lc3NhZ2UnID0+ICdEQi1FUlJPUjogJyAuICRvYmpBRE9Db25uZWN0aW9uLT5FcnJvck1zZygpKTsKICAgICAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICAgICB9CiAgICAgIHdoaWxlICgkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CiAgICAgICAgIC8vY2hlY2sgb2YgcHJvcGVydHkgaXMgaW50ZXJlc3RpbmcKICAgICAgICAgaWYgKCFpbl9hcnJheShzdHJ0b2xvd2VyKCRyb3dbJ3Byb3BfbmFtZSddKSwgJGFyclVzZWRDb250ZW50UHJvcGVydGllcykpIHsKICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfREVCVUcsICdtZXNzYWdlJyA9PiAnc2tpcHBpbmcgY29udGVudCBwcm9wZXJ0eTogJyAuICRyb3dbJ3Byb3BfbmFtZSddKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KCiAgICAgICAgICRvYmpDb250ZW50ID0gJG9iakNvbnRlbnRPcGVyYXRpb25zLT5Mb2FkQ29udGVudEZyb21JZCgkcm93Wydjb250ZW50X2lkJ10sIHRydWUpOwogICAgICAgICAkc3RySGllcmFyY2h5UGF0aCA9ICcnOwogICAgICAgICBpZiAoJG9iakNvbnRlbnQgaW5zdGFuY2VvZiBDb250ZW50KSB7CiAgICAgICAgICAgICRzdHJIaWVyYXJjaHlQYXRoID0gJG9iakNvbnRlbnQtPkhpZXJhcmNoeVBhdGgoKTsKICAgICAgICAgfQogICAgICAgICAvL2NvbnZlcnQgaGllcmFyY2h5IHRvIGRpcmVjdG9yeQogICAgICAgICAkc3RySGllcmFyY2h5UGF0aCA9IHN0cl9yZXBsYWNlKCIvIiwgRElSRUNUT1JZX1NFUEFSQVRPUiwgJHN0ckhpZXJhcmNoeVBhdGgpOwogICAgICAgICAkc3RySGllcmFyY2h5UGF0aCA9IHN0cl9yZXBsYWNlKCJcXCIsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRzdHJIaWVyYXJjaHlQYXRoKTsKCiAgICAgICAgICRzdHJDb250ZW50TmFtZSA9ICR0aGlzLT5uYW1lVG9EaXJuYW1lKCRyb3dbJ2NvbnRlbnRfbmFtZSddKTsKICAgICAgICAgJHN0clRtcERpciA9ICR0aGlzLT5zdHJUbXBEaXJfQ29udGVudCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkc3RySGllcmFyY2h5UGF0aCAuIERJUkVDVE9SWV9TRVBBUkFUT1I7CiAgICAgICAgICR0aGlzLT5jaGVja0RpcmVjdG9yeSgkc3RyVG1wRGlyKTsKICAgICAgICAgJHN0clRlbXBGaWxlID0gJHN0clRtcERpciAuICRyb3dbJ2NvbnRlbnRfaWQnXSAuICcjJyAuICRzdHJDb250ZW50TmFtZSAuICcjJyAuICRyb3dbJ3Byb3BfbmFtZSddIC4gJy50cGwnOwogICAgICAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoJHN0clRlbXBGaWxlLCAkcm93Wydjb250ZW50J10pID09PSBmYWxzZSkgewogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9FUlJPUiwgJ21lc3NhZ2UnID0+ICdjYW4gbm90IHdyaXRlIGNvbnRlbnRmaWxlOiAnIC4gJHN0clRlbXBGaWxlKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfSElOVCwgJ21lc3NhZ2UnID0+ICdDb250ZW50IC0gZXhwb3J0IGRvbmU6ICcgLiAkcm93Wydjb250ZW50X2lkJ10gLiAnIHwgJyAuICRyb3dbJ2NvbnRlbnRfbmFtZSddIC4gJyB8ICcgLiAkcm93Wydwcm9wX25hbWUnXSAuICAnIHwgJyAuIGJhc2VuYW1lKCRzdHJUZW1wRmlsZSkpOwogICAgICB9CgogICAgICByZXR1cm4gJGFyclJldHVybjsKICAgfQoKICAgLyoqCiAgICAqIEByZXR1cm4gYXJyYXkKICAgICogQHRocm93cyBcRXhjZXB0aW9uCiAgICAqLwogICBwcml2YXRlIGZ1bmN0aW9uIGV4cG9ydFVzZXJwbHVnaW5zKCkgewoKICAgICAgJGFyclJldHVybiA9IGFycmF5KCk7CiAgICAgICRvYmpDTVMgPSBjbXNtcygpOwogICAgICAkb2JqQURPQ29ubmVjdGlvbiA9ICRvYmpDTVMtPkdldERiKCk7CiAgICAgICR0aGlzLT5jaGVja0RpcmVjdG9yeSgkdGhpcy0+c3RyVG1wRGlyX1VzZXJwbHVnaW5zKTsKICAgICAgJHF1ZXJ5ID0gIlNFTEVDVCB1c2VycGx1Z2luX2lkLCB1c2VycGx1Z2luX25hbWUsIGNvZGUsIG1vZGlmaWVkX2RhdGUgRlJPTSAiIC4gY21zX2RiX3ByZWZpeCgpIC4gInVzZXJwbHVnaW5zIjsKICAgICAgJGRicmVzdWx0ID0gJG9iakFET0Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgaWYgKGlzX251bGwoJGRicmVzdWx0KSB8fCAkZGJyZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0VSUk9SLCAnbWVzc2FnZScgPT4gJ0RCLUVSUk9SOiAnIC4gJG9iakFET0Nvbm5lY3Rpb24tPkVycm9yTXNnKCkpOwogICAgICAgICByZXR1cm4gJGFyclJldHVybjsKICAgICAgfQogICAgICB3aGlsZSAoJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSkgewogICAgICAgICAkc3RyVGVtcEZpbGUgPSAkdGhpcy0+c3RyVG1wRGlyX1VzZXJwbHVnaW5zIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRyb3dbJ3VzZXJwbHVnaW5faWQnXSAuICcjJyAuICRyb3dbJ3VzZXJwbHVnaW5fbmFtZSddIC4gJy5waHAnOwogICAgICAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoJHN0clRlbXBGaWxlLCAkcm93Wydjb2RlJ10pID09PSBmYWxzZSkgewogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9FUlJPUiwgJ21lc3NhZ2UnID0+ICdjYW4gbm90IHdyaXRlIHVzZXJwbHVnaW46ICcgLiAkc3RyVGVtcEZpbGUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ISU5ULCAnbWVzc2FnZScgPT4gJ1VzZXJwbHVnaW4gLSBleHBvcnQgZG9uZTogJyAuICRyb3dbJ3VzZXJwbHVnaW5fbmFtZSddIC4gICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSk7CiAgICAgIH0KCiAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICB9CgogICAvKioKICAgICogQHJldHVybiBhcnJheQogICAgKiBAdGhyb3dzIFxDbXNEYXRhTm90Rm91bmRFeGNlcHRpb24KICAgICogQHRocm93cyBcQ21zSW52YWxpZERhdGFFeGNlcHRpb24KICAgICogQHRocm93cyBcRXhjZXB0aW9uCiAgICAqLwogICBwcml2YXRlIGZ1bmN0aW9uIGltcG9ydERlc2lnbnMoKSB7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXkoKTsKICAgICAgJHRzTGFzdFJ1biA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsYXN0X3J1bicsIHRpbWUoKSk7CiAgICAgICRhcnJVc2VkRGVzaWducyA9IGV4cGxvZGUoJ3wnLCBzdHJ0b2xvd2VyKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdkZXNpZ25fbmFtZXMnKSkpOwogICAgICBpZiAoZW1wdHkoJGFyclVzZWREZXNpZ25zKSkgJGFyclVzZWREZXNpZ25zID0gYXJyYXkoKTsKCiAgICAgICRhcnJMYXlvdXRDb2xsZWN0aW9ucyA9IENtc0xheW91dENvbGxlY3Rpb246OmdldF9hbGwoKTsKICAgICAgaWYgKGVtcHR5KCRhcnJMYXlvdXRDb2xsZWN0aW9ucykpICRhcnJMYXlvdXRDb2xsZWN0aW9ucyA9IGFycmF5KCk7CiAgICAgIGZvcmVhY2ggKChhcnJheSkkYXJyTGF5b3V0Q29sbGVjdGlvbnMgYXMgJG9iakNtc0xheW91dENvbGxlY3Rpb24pIHsKCiAgICAgICAgICRpbnREZXNpZ25JZCA9ICRvYmpDbXNMYXlvdXRDb2xsZWN0aW9uLT5nZXRfaWQoKTsKICAgICAgICAgJHN0ckRlc2lnbk5hbWUgPSAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbi0+Z2V0X25hbWUoKTsKCiAgICAgICAgIC8vY2hlY2sgaWYgZGVzaWduIGlzIGludGVyZXN0aW5nCiAgICAgICAgIGlmICghaW5fYXJyYXkoc3RydG9sb3dlcigkc3RyRGVzaWduTmFtZSksICRhcnJVc2VkRGVzaWducykpIHsKICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfREVCVUcsICdtZXNzYWdlJyA9PiAnc2tpcHBpbmcgZGVzaWduOiAnIC4gJHN0ckRlc2lnbk5hbWUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQoKICAgICAgICAgLy9iYXNlIGRpciBmb3IgZGVzaWduCiAgICAgICAgICRzdHJEZXNpZ25FeHBvcnREaXIgPSAkdGhpcy0+c3RyVG1wRGlyX0Rlc2lnbnMgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGludERlc2lnbklkIC4gJyMnIC4gJHRoaXMtPm5hbWVUb0Rpcm5hbWUoJHN0ckRlc2lnbk5hbWUpOwoKICAgICAgICAgLy9jaGVjayBkaXIKICAgICAgICAgJHN0clRlbXBsYXRlRXhwb3J0RGlyID0gJHN0ckRlc2lnbkV4cG9ydERpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAndGVtcGxhdGVzJzsKICAgICAgICAgJGFyclRlbXBsYXRlcyA9ICRvYmpDbXNMYXlvdXRDb2xsZWN0aW9uLT5nZXRfdGVtcGxhdGVzKCk7CiAgICAgICAgIGlmIChlbXB0eSgkYXJyVGVtcGxhdGVzKSkgJGFyclRlbXBsYXRlcyA9IGFycmF5KCk7CiAgICAgICAgIGZvcmVhY2ggKChhcnJheSkkYXJyVGVtcGxhdGVzIGFzICRpbnRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICRvYmpDbXNMYXlvdXRUZW1wbGF0ZSA9IENtc0xheW91dFRlbXBsYXRlOjpsb2FkKCRpbnRUZW1wbGF0ZUlkKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgJG9iakNtc0xheW91dFRlbXBsYXRlVHlwZSA9IENtc0xheW91dFRlbXBsYXRlVHlwZTo6bG9hZCgkb2JqQ21zTGF5b3V0VGVtcGxhdGUtPmdldF90eXBlX2lkKCkpOwogICAgICAgICAgICAgICAkc3RyVGVtcGxhdGVPcmlnaW5hdG9yID0gJG9iakNtc0xheW91dFRlbXBsYXRlVHlwZS0+Z2V0X29yaWdpbmF0b3IodHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2goRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICRzdHJUZW1wbGF0ZU9yaWdpbmF0b3IgPSAndW5rbm93bic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHN0clRlbXBsYXRlT3JpZ2luYXRvckV4cG9ydERpciA9ICRzdHJUZW1wbGF0ZUV4cG9ydERpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkdGhpcy0+bmFtZVRvRGlybmFtZSgkc3RyVGVtcGxhdGVPcmlnaW5hdG9yKTsKCiAgICAgICAgICAgICRpbnRJZCA9ICRvYmpDbXNMYXlvdXRUZW1wbGF0ZS0+Z2V0X2lkKCk7CiAgICAgICAgICAgICRzdHJOYW1lID0gJG9iakNtc0xheW91dFRlbXBsYXRlLT5nZXRfbmFtZSgpOwoKICAgICAgICAgICAgJHN0clRlbXBGaWxlID0gJHN0clRlbXBsYXRlT3JpZ2luYXRvckV4cG9ydERpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkaW50SWQgLiAnIycgLiAkdGhpcy0+bmFtZVRvRGlybmFtZSgkc3RyTmFtZSkgLiAnLnRwbCc7CiAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJHN0clRlbXBGaWxlKSkgewogICAgICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9XQVJOLCAnbWVzc2FnZScgPT4gJ25vIGV4cG9ydCBmb3VuZCBmb3IgdGVtcGxhdGU6ICcgLiAkaW50SWQuJyAtICcuJHN0ck5hbWUgLiAnIG9uICcgLiAkc3RyVGVtcEZpbGUgKTsKICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChmaWxlbXRpbWUoJHN0clRlbXBGaWxlKSA8PSAkdHNMYXN0UnVuKSB7CiAgICAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0RFQlVHLCAnbWVzc2FnZScgPT4gJ2ZpbGUgbm90IGNoYW5nZWQ6ICcgLiAkc3RyRGVzaWduTmFtZSAuICcgfCAnIC4gJHN0ck5hbWUgLiAnIHwgJyAuIGJhc2VuYW1lKCRzdHJUZW1wRmlsZSkgKTsKICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRzdHJDb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJHN0clRlbXBGaWxlKTsKICAgICAgICAgICAgJHN0ckNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJ357LionIC4gX19DTEFTU19fIC4gJy4qfVtcbl0qficsICcnLCAkc3RyQ29udGVudCk7IC8vcmVtb3ZlIGVhcmx5ZXIgdGltZXN0YW1wCiAgICAgICAgICAgICRzdHJDb250ZW50ID0gJ3sqIGltcG9ydGVkIHdpdGggJyAuIF9fQ0xBU1NfXyAuICcgYXQgJyAuIGRhdGUoJ1ktbS1kIEg6aTpzJykgLiAnICp9JyAuIFBIUF9FT0wgLiAkc3RyQ29udGVudDsKCiAgICAgICAgICAgICRvYmpDbXNMYXlvdXRUZW1wbGF0ZS0+c2V0X2NvbnRlbnQoJHN0ckNvbnRlbnQpOwogICAgICAgICAgICAvLyBwcmV2ZW50IGxvb3NpbmcgYXNzb2MKICAgICAgICAgICAgJG9iakNtc0xheW91dFRlbXBsYXRlLT5nZXRfZGVzaWducygpOwogICAgICAgICAgICAkb2JqQ21zTGF5b3V0VGVtcGxhdGUtPmdldF9hZGRpdGlvbmFsX2VkaXRvcnMoKTsKICAgICAgICAgICAgLy9zYXZlCiAgICAgICAgICAgICRvYmpDbXNMYXlvdXRUZW1wbGF0ZS0+c2F2ZSgpOwogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ISU5ULCAnbWVzc2FnZScgPT4gJ25ldyB2ZXJzaW9uOiAnIC4gJHN0ckRlc2lnbk5hbWUgLiAnIHwgJyAuICRzdHJOYW1lIC4gJyB8ICcgLiBiYXNlbmFtZSgkc3RyVGVtcEZpbGUpKTsKICAgICAgICAgfQoKICAgICAgICAgJGFyclN0eWxzaGVldHMgPSAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbi0+Z2V0X3N0eWxlc2hlZXRzKCk7CiAgICAgICAgIGlmIChlbXB0eSgkYXJyU3R5bHNoZWV0cykpICRhcnJTdHlsc2hlZXRzID0gYXJyYXkoKTsKICAgICAgICAgJHN0clN0eWxlc2hlZXRFeHBvcnREaXIgPSAkc3RyRGVzaWduRXhwb3J0RGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdzdHlsZXNoZWV0cyc7CiAgICAgICAgIGZvcmVhY2ggKChhcnJheSkkYXJyU3R5bHNoZWV0cyBhcyAkaW50U3R5bGVzaGVldElkKSB7CiAgICAgICAgICAgICRvYmpDbXNMYXlvdXRTdHlsZXNoZWV0ID0gQ21zTGF5b3V0U3R5bGVzaGVldDo6bG9hZCgkaW50U3R5bGVzaGVldElkKTsKICAgICAgICAgICAgJGludElkID0gJG9iakNtc0xheW91dFN0eWxlc2hlZXQtPmdldF9pZCgpOwogICAgICAgICAgICAkc3RyTmFtZSA9ICRvYmpDbXNMYXlvdXRTdHlsZXNoZWV0LT5nZXRfbmFtZSgpOwoKICAgICAgICAgICAgJHN0clRlbXBGaWxlID0gJHN0clN0eWxlc2hlZXRFeHBvcnREaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGludElkIC4gJyMnIC4gJHRoaXMtPm5hbWVUb0Rpcm5hbWUoJHN0ck5hbWUpIC4gJy5jc3MnOwogICAgICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRzdHJUZW1wRmlsZSkpIHsKICAgICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfV0FSTiwgJ21lc3NhZ2UnID0+ICdubyBleHBvcnQgZm91bmQgZm9yIHN0eWxlc2hlZXQ6ICcgLiAkaW50SWQuJyAtICcuJHN0ck5hbWUgKTsKICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChmaWxlbXRpbWUoJHN0clRlbXBGaWxlKSA8PSAkdHNMYXN0UnVuKSB7CiAgICAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0RFQlVHLCAnbWVzc2FnZScgPT4gJ2ZpbGUgbm90IGNoYW5nZWQ6ICcgLiAkc3RyRGVzaWduTmFtZSAuICcgfCAnIC4gJHN0ck5hbWUgLiAnIHwgJyAuIGJhc2VuYW1lKCRzdHJUZW1wRmlsZSkpOwogICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHN0ckNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkc3RyVGVtcEZpbGUpOwogICAgICAgICAgICAkc3RyQ29udGVudCA9IHByZWdfcmVwbGFjZSgnfi8qLionIC4gX19DTEFTU19fIC4gJy4qL1tcbl0qficsICcnLCAkc3RyQ29udGVudCk7IC8vcmVtb3ZlIGVhcmx5ZXIgdGltZXN0YW1wCiAgICAgICAgICAgICRzdHJDb250ZW50ID0gJy8qIGltcG9ydGVkIHdpdGggJyAuIF9fQ0xBU1NfXyAuICcgYXQgJyAuIGRhdGUoJ1ktbS1kIEg6aTpzJykgLiAnICovJyAuIFBIUF9FT0wgLiAkc3RyQ29udGVudDsKCiAgICAgICAgICAgICRvYmpDbXNMYXlvdXRTdHlsZXNoZWV0LT5zZXRfY29udGVudCgkc3RyQ29udGVudCk7CiAgICAgICAgICAgIC8vIHByZXZlbnQgbG9vc2luZyBhc3NvYwogICAgICAgICAgICAkb2JqQ21zTGF5b3V0U3R5bGVzaGVldC0+Z2V0X2Rlc2lnbnMoKTsKICAgICAgICAgICAgLy9zYXZlCiAgICAgICAgICAgICRvYmpDbXNMYXlvdXRTdHlsZXNoZWV0LT5zYXZlKCk7CiAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0hJTlQsICdtZXNzYWdlJyA9PiAnbmV3IHZlcnNpb246ICcgLiAkc3RyRGVzaWduTmFtZSAuICcgfCAnIC4gJHN0ck5hbWUgLiAnIHwgJyAuIGJhc2VuYW1lKCRzdHJUZW1wRmlsZSkpOwogICAgICAgICB9CgogICAgICB9CgogICAgICByZXR1cm4gJGFyclJldHVybjsKICAgfQoKICAgLyoqCiAgICAqIEByZXR1cm4gYXJyYXkKICAgICogQHRocm93cyBcRXhjZXB0aW9uCiAgICAqLwogICBwcml2YXRlIGZ1bmN0aW9uIGltcG9ydENvbnRlbnQoKSB7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXkoKTsKCiAgICAgICR0c0xhc3RSdW4gPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGFzdF9ydW4nLCB0aW1lKCkpOwogICAgICAkYXJyVXNlZENvbnRlbnRQcm9wZXJ0aWVzID0gZXhwbG9kZSgnfCcsIHN0cnRvbG93ZXIoJHRoaXMtPkdldFByZWZlcmVuY2UoJ2NvbnRlbnRfcHJvcF9uYW1lcycsICdjb250ZW50X2VuJykpKTsKICAgICAgaWYgKGVtcHR5KCRhcnJVc2VkQ29udGVudFByb3BlcnRpZXMpKSAkYXJyVXNlZENvbnRlbnRQcm9wZXJ0aWVzID0gYXJyYXkoKTsKCiAgICAgICRvYmpDb250ZW50T3BlcmF0aW9ucyA9IENvbnRlbnRPcGVyYXRpb25zOjpnZXRfaW5zdGFuY2UoKTsKCiAgICAgICRvYmpDTVMgPSBjbXNtcygpOwogICAgICAkb2JqQURPQ29ubmVjdGlvbiA9ICRvYmpDTVMtPkdldERiKCk7CgogICAgICAkcXVlcnkgPSAiU0VMRUNUIGNwLmNvbnRlbnRfaWQsIGMuY29udGVudF9uYW1lLCBjcC5wcm9wX25hbWUsIGNwLmNvbnRlbnQsIGNwLm1vZGlmaWVkX2RhdGUKICAgICAgICAgICAgRlJPTSAiIC4gY21zX2RiX3ByZWZpeCgpIC4gImNvbnRlbnRfcHJvcHMgY3AKICAgICAgICAgICAgSk9JTiAiIC4gY21zX2RiX3ByZWZpeCgpIC4gImNvbnRlbnQgYyBPTiAoY3AuY29udGVudF9pZCA9IGMuY29udGVudF9pZCkiOwogICAgICAkZGJyZXN1bHQgPSAkb2JqQURPQ29ubmVjdGlvbi0+RXhlY3V0ZSgkcXVlcnkpOwogICAgICBpZiAoaXNfbnVsbCgkZGJyZXN1bHQpIHx8ICRkYnJlc3VsdCA9PT0gZmFsc2UpIHsKICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0VSUk9SLCAnbWVzc2FnZScgPT4gJ0RCLUVSUk9SOiAnIC4gJG9iakFET0Nvbm5lY3Rpb24tPkVycm9yTXNnKCkpOwogICAgICAgICAgcmV0dXJuICRhcnJSZXR1cm47CiAgICAgIH0KICAgICAgd2hpbGUgKCRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkpIHsKICAgICAgICAgLy9jaGVjayBvZiBwcm9wZXJ0eSBpcyBpbnRlcmVzdGluZwogICAgICAgICBpZiAoIWluX2FycmF5KHN0cnRvbG93ZXIoJHJvd1sncHJvcF9uYW1lJ10pLCAkYXJyVXNlZENvbnRlbnRQcm9wZXJ0aWVzKSkgewogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ERUJVRywgJ21lc3NhZ2UnID0+ICdza2lwcGluZyBjb250ZW50IHByb3BlcnR5OiAnIC4gJHJvd1sncHJvcF9uYW1lJ10pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQoKICAgICAgICAgJG9iakNvbnRlbnQgPSAkb2JqQ29udGVudE9wZXJhdGlvbnMtPkxvYWRDb250ZW50RnJvbUlkKCRyb3dbJ2NvbnRlbnRfaWQnXSwgdHJ1ZSk7CiAgICAgICAgICRzdHJIaWVyYXJjaHlQYXRoID0gJyc7CiAgICAgICAgIGlmICgkb2JqQ29udGVudCBpbnN0YW5jZW9mIENvbnRlbnQpIHsKICAgICAgICAgICAgJHN0ckhpZXJhcmNoeVBhdGggPSAkb2JqQ29udGVudC0+SGllcmFyY2h5UGF0aCgpOwogICAgICAgICB9CiAgICAgICAgIC8vY29udmVydCBoaWVyYXJjaHkgdG8gZGlyZWN0b3J5CiAgICAgICAgICRzdHJIaWVyYXJjaHlQYXRoID0gc3RyX3JlcGxhY2UoIi8iLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkc3RySGllcmFyY2h5UGF0aCk7CiAgICAgICAgICRzdHJIaWVyYXJjaHlQYXRoID0gc3RyX3JlcGxhY2UoIlxcIiwgRElSRUNUT1JZX1NFUEFSQVRPUiwgJHN0ckhpZXJhcmNoeVBhdGgpOwoKICAgICAgICAgJHN0ckNvbnRlbnROYW1lID0gJHRoaXMtPm5hbWVUb0Rpcm5hbWUoJHJvd1snY29udGVudF9uYW1lJ10pOwogICAgICAgICAkc3RyVG1wRGlyID0gJHRoaXMtPnN0clRtcERpcl9Db250ZW50IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRzdHJIaWVyYXJjaHlQYXRoIC4gRElSRUNUT1JZX1NFUEFSQVRPUjsKICAgICAgICAgJHN0clRlbXBGaWxlID0gJHN0clRtcERpciAuICRyb3dbJ2NvbnRlbnRfaWQnXSAuICcjJyAuICRzdHJDb250ZW50TmFtZSAuICcjJyAuICRyb3dbJ3Byb3BfbmFtZSddIC4gJy50cGwnOwogICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCRzdHJUZW1wRmlsZSkpIHsKICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfV0FSTiwgJ21lc3NhZ2UnID0+ICdmaWxlIG5vdCBmb3VuZCAobWF5IGJlIGNvbnRlbnQgaXRlbSBpcyBuZXcgYW5kIG5vdCB5ZXQgZXhwb3J0ZWQpOiAnIC4gJHN0ckNvbnRlbnROYW1lIC4gJyB8ICcgLiAkcm93Wydwcm9wX25hbWUnXSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChmaWxlbXRpbWUoJHN0clRlbXBGaWxlKSA8PSAkdHNMYXN0UnVuKSB7CiAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0RFQlVHLCAnbWVzc2FnZScgPT4gJ2ZpbGUgbm90IGNoYW5nZWQ6ICcgLiAkc3RyQ29udGVudE5hbWUgLiAnIHwgJyAuICRyb3dbJ3Byb3BfbmFtZSddIC4gJyB8ICcgLiBiYXNlbmFtZSgkc3RyVGVtcEZpbGUpKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KCiAgICAgICAgIC8vbG9hZCBDb250ZW50T2JqZWN0CiAgICAgICAgICRvYmpDb250ZW50ID0gJG9iakNvbnRlbnRPcGVyYXRpb25zLT5Mb2FkQ29udGVudEZyb21JZCgkcm93Wydjb250ZW50X2lkJ10sIHRydWUpOwogICAgICAgICBpZiAoJG9iakNvbnRlbnQgaW5zdGFuY2VvZiBDb250ZW50KSB7CiAgICAgICAgICAgICRzdHJDb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJHN0clRlbXBGaWxlKTsKICAgICAgICAgICAgJHN0ckNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJ357LionIC4gX19DTEFTU19fIC4gJy4qfVtcbl0qficsICcnLCAkc3RyQ29udGVudCk7IC8vcmVtb3ZlIGVhcmx5ZXIgdGltZXN0YW1wCiAgICAgICAgICAgICRzdHJDb250ZW50ID0gJ3sqIGltcG9ydGVkIHdpdGggJyAuIF9fQ0xBU1NfXyAuICcgYXQgJyAuIGRhdGUoJ1ktbS1kIEg6aTpzJykgLiAnICp9JyAuIFBIUF9FT0wgLiAkc3RyQ29udGVudDsKICAgICAgICAgICAgJG9iakNvbnRlbnQtPlNldFByb3BlcnR5VmFsdWUoJHJvd1sncHJvcF9uYW1lJ10sICRzdHJDb250ZW50KTsKICAgICAgICAgICAgJG9iakNvbnRlbnRPcGVyYXRpb25zLT5zYXZlX2NvbnRlbnQoJG9iakNvbnRlbnQpOwogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ISU5ULCAnbWVzc2FnZScgPT4gJ25ldyB2ZXJzaW9uOiAnIC4gJHN0ckNvbnRlbnROYW1lIC4gJyB8ICcgLiAkcm93Wydwcm9wX25hbWUnXSAuICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSk7CiAgICAgICAgIH0KCiAgICAgIH0KCiAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICB9CgogICAvKioKICAgICogQHJldHVybiBhcnJheQogICAgKiBAdGhyb3dzIFxFeGNlcHRpb24KICAgICovCiAgIHByaXZhdGUgZnVuY3Rpb24gaW1wb3J0VXNlcnBsdWdpbnMoKSB7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXkoKTsKCiAgICAgICR0c0xhc3RSdW4gPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGFzdF9ydW4nLCB0aW1lKCkpOwogICAgICAkb2JqQ01TID0gY21zbXMoKTsKICAgICAgJG9iakFET0Nvbm5lY3Rpb24gPSAkb2JqQ01TLT5HZXREYigpOwoKICAgICAgJHF1ZXJ5ID0gIlNFTEVDVCB1c2VycGx1Z2luX2lkLCB1c2VycGx1Z2luX25hbWUsIGNvZGUsIG1vZGlmaWVkX2RhdGUgRlJPTSAiIC4gY21zX2RiX3ByZWZpeCgpIC4gInVzZXJwbHVnaW5zIjsKICAgICAgJGRicmVzdWx0ID0gJG9iakFET0Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgaWYgKGlzX251bGwoJGRicmVzdWx0KSB8fCAkZGJyZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9FUlJPUiwgJ21lc3NhZ2UnID0+ICdEQi1FUlJPUjogJyAuICRvYmpBRE9Db25uZWN0aW9uLT5FcnJvck1zZygpKTsKICAgICAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICAgICB9CiAgICAgIHdoaWxlICgkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CiAgICAgICAgICRzdHJUZW1wRmlsZSA9ICR0aGlzLT5zdHJUbXBEaXJfVXNlcnBsdWdpbnMgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHJvd1sndXNlcnBsdWdpbl9pZCddIC4gJyMnIC4gJHJvd1sndXNlcnBsdWdpbl9uYW1lJ10gLiAnLnBocCc7CiAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJHN0clRlbXBGaWxlKSkgewogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9XQVJOLCAnbWVzc2FnZScgPT4gJ2ZpbGUgbm90IGZvdW5kIChtYXkgYmUgdXNlcnBsdWdpbiBpcyBuZXcgYW5kIG5vdCB5ZXQgZXhwb3J0ZWQpOiAnIC4gJHJvd1sndXNlcnBsdWdpbl9uYW1lJ10pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoZmlsZW10aW1lKCRzdHJUZW1wRmlsZSkgPD0gJHRzTGFzdFJ1bikgewogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ERUJVRywgJ21lc3NhZ2UnID0+ICdmaWxlIG5vdCBjaGFuZ2VkOiAnIC4gJHJvd1sndXNlcnBsdWdpbl9uYW1lJ10gLiAnIHwgJyAuIGJhc2VuYW1lKCRzdHJUZW1wRmlsZSkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQoKICAgICAgICAgJHN0ckNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkc3RyVGVtcEZpbGUpOwogICAgICAgICAkc3RyQ29udGVudCA9IHByZWdfcmVwbGFjZSgnfi8uKicgLiBfX0NMQVNTX18gLiAnLiovW1xuXSp+JywgJycsICRzdHJDb250ZW50KTsgLy9yZW1vdmUgZWFybHllciB0aW1lc3RhbXAKICAgICAgICAgJHN0ckNvbnRlbnQgPSAnLyogaW1wb3J0ZWQgd2l0aCAnIC4gX19DTEFTU19fIC4gJyBhdCAnIC4gZGF0ZSgnWS1tLWQgSDppOnMnKSAuICcgKi8nIC4gUEhQX0VPTCAuICRzdHJDb250ZW50OwoKICAgICAgICAgLy9zYXZlIG5ldyB2YWx1ZXMgdG8gZGF0YWJhc2UKICAgICAgICAgJG9ialVzZXJUYWdPcGVyYXRpb25zID0gVXNlclRhZ09wZXJhdGlvbnM6OmdldF9pbnN0YW5jZSgpOwogICAgICAgICAkb2JqVXNlclRhZ09wZXJhdGlvbnMtPlNldFVzZXJUYWcoJHJvd1sndXNlcnBsdWdpbl9uYW1lJ10sICRzdHJDb250ZW50LCBmYWxzZSk7CiAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0hJTlQsICdtZXNzYWdlJyA9PiAnbmV3IHZlcnNpb246ICcgLiAkcm93Wyd1c2VycGx1Z2luX25hbWUnXSAuICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSk7CiAgICAgIH0KCiAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICB9CgogICAvKioKICAgICogZGVsZXRlIGRpcmVjdG9yeSByZWN1cnNpdmVseQogICAgKiBAcGFyYW0gJHN0ckRpcgogICAgKi8KICAgcHJpdmF0ZSBmdW5jdGlvbiBkZWxldGVSZWN1cnNpdmUoJHN0ckRpcikgewogICAgICBpZiAoaXNfZGlyKCRzdHJEaXIpKSB7CiAgICAgICAgICRvYmplY3RzID0gc2NhbmRpcigkc3RyRGlyKTsKICAgICAgICAgZm9yZWFjaCAoKGFycmF5KSRvYmplY3RzIGFzICRvYmplY3QpIHsKICAgICAgICAgICAgaWYgKCRvYmplY3QgIT0gIi4iICYmICRvYmplY3QgIT0gIi4uIikgewogICAgICAgICAgICAgICBpZiAoaXNfZGlyKCRzdHJEaXIuIi8iLiRvYmplY3QpKQogICAgICAgICAgICAgICAgICAkdGhpcy0+ZGVsZXRlUmVjdXJzaXZlKCRzdHJEaXIuIi8iLiRvYmplY3QpOwogICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHVubGluaygkc3RyRGlyLiIvIi4kb2JqZWN0KTsKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJtZGlyKCRzdHJEaXIpOwogICAgICB9CiAgIH0KCn0=]]></data>
	</file>
</module>
