<?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.3.1</version>
  <mincmsversion>2.0</mincmsversion>
	<help><![CDATA[CiAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyB0aGUgcG9zc2liaWxpdHkgdG8gZXhwb3J0IGFuZCByZS1pbXBvcnQuPGJyLz4KICAgIFNvIHlvdSBjYW4gZWRpdCB0aGVtIHdpdGggYSBlZGl0b3Igb2YgeW91ciBjaG9pY2Ugb3V0c2lkZSB0aGUgQ01TPGJyIC8+CiAgICBBbmQgdGhpcyBpcyB0aGUgc2NvcGU6PGJyIC8+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDstIHBhZ2UgY29udGVudCAoaW5jbC4gaW5kaXZpZHVhbCBwcm9wZXJ0aWVzKTxici8+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDstIGRlc2lnbnMgIG9mIENNUyAodGVtcGxhdGVzIGFuZCBjc3MpPGJyLz4KICAgICZuYnNwOyZuYnNwOyZuYnNwOy0gdXNlciBwbHVnaW5zPGJyLz4KICAgIDxici8+CiAgICBUaGVyZSBhcmUgdHdvIG1vZGVzOjxici8+CiAgICA8YnIvPgogICAgPGI+MSkgbWFudWFsIGV4cG9ydC9pbXBvcnQ8L2I+PGJyIC8+CiAgICBpbXBvcnQgYW5kIGV4cG9ydCBpcyB0cmlnZ2VyZWQgYnkgYnV0dG9uPGJyLz4KICAgIDxici8+CiAgICA8Yj4yKSBhdXRvbWF0aWMgaW1wb3J0PC9iPjxiciAvPgogICAgYWxsb3dzIHlvdSB0byBsb2FkIG1vZGlmaWVkIGZpbGVzIGZyb20gdG1wLWRpciBvbiBldmVyeSByZXF1ZXN0LjxiciAvPgo=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBPbGl2ZXIgSm9vJnN6bGlnOzxiciAvPjxiciAvPlZlcnNpb246IDEuMy4xPGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+CiAgICA8cD4KICAgICAgICA8Yj5WZXJzaW9uIDEuMCAtIE5vdiAyMDE1PC9iPjxiciAvPgogICAgICAgIEluaXRpYWwgVmVyc2lvbgogICAgPC9wPgogICAgPHA+CiAgICAgICAgPGI+VmVyc2lvbiAxLjEgLSBEZXogMjAxNTwvYj48YnIgLz4KICAgICAgICAtIGZpeGVkIGJ1ZyBvbiBsb3NpbmcgZGVzaWduIGFzc2lnbm1lbnQ8YnIgLz4KICAgICAgICAtIGNoYW5nZWQgZXhwb3J0IHN0cnVjdHVyZTxiciAvPgogICAgICAgIC0gYWRkZWQgZmVhdHVyZSB0byBkZWZpbmUgPGk+Y29udGVudCBwcm9wczwvaT4gYW5kIDxpPmRlc2lnbnM8L2k+IHRvIGJlIGV4cG9ydGVkCiAgICA8L3A+CiAgICA8cD4KICAgICAgICA8Yj5WZXJzaW9uIDEuMiAtIERleiAyMDE1PC9iPjxiciAvPgogICAgICAgIC0gZml4ZWQgYnVnIG9uIGNvbnRlbnQgaW1wb3J0IChpZ25vcmUgLmJhayBldGMpPGJyIC8+CiAgICAgICAgLSBjaGFuZ2VkIGV4cG9ydCBzdHJ1Y3R1cmUgb2YgY29udGVudCBhY2NvcmRpbmcgdG8gcGFnZSBoaWVyYXJjaHk8YnIgLz4KICAgIDwvcD4KPGJyIC8+]]></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[W21vZHVsZV0KbmFtZSA9IE91dHNvdXJjZXIKdmVyc2lvbiA9IDEuMy4xCmRlc2NyaXB0aW9uID0gCmF1dGhvciA9IE9saXZlciBKb28mc3psaWc7CmF1dGhvcmVtYWlsID0gCm1pbmNtc3ZlcnNpb24gPSAyLjAKMTE=]]></data>
	</file>
	<file>
	  <filename>/Outsourcer.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmNsYXNzIE91dHNvdXJjZXIgZXh0ZW5kcyBDTVNNb2R1bGUgewoKICAgY29uc3QgTUVTU0FHRV9ISU5UICA9ICdoaW50JzsKICAgY29uc3QgTUVTU0FHRV9XQVJOICA9ICd3YXJuJzsKICAgY29uc3QgTUVTU0FHRV9FUlJPUiA9ICdlcnJvcic7CiAgIGNvbnN0IE1FU1NBR0VfREVCVUcgPSAnZGVidWcnOwoKICAgcHJpdmF0ZSAkc3RyVG1wRGlyID0gbnVsbDsKICAgcHJpdmF0ZSAkc3RyVG1wRGlyX0Rlc2lnbnMgPSBudWxsOwogICBwcml2YXRlICRzdHJUbXBEaXJfQ29udGVudCA9IG51bGw7CiAgIHByaXZhdGUgJHN0clRtcERpcl9Vc2VycGx1Z2lucyA9IG51bGw7CgogICBwdWJsaWMgZnVuY3Rpb24gR2V0TmFtZSgpIHsKICAgICAgcmV0dXJuICdPdXRzb3VyY2VyJzsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsKICAgICAgcmV0dXJuICdPdXRzb3VyY2VyJzsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7CiAgICAgIHJldHVybiAnMS4zLjEnOwogICB9CgogICBwdWJsaWMgZnVuY3Rpb24gR2V0SGVscCgpIHsKICAgICAgcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3IoKSB7CiAgICAgIHJldHVybiAnT2xpdmVyIEpvbyZzemxpZzsnOwogICB9CgogICBwdWJsaWMgZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKSB7CiAgICAgIHJldHVybiAnJzsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsKICAgICAgcmV0dXJuICR0aGlzLT5MYW5nKCdjaGFuZ2Vsb2cnKTsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBIYXNBZG1pbigpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBWaXNpYmxlVG9BZG1pblVzZXIoKSB7CiAgICAgIHJldHVybiAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCJPdXRzb3VyY2VyIik7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKSB7CiAgICAgIHJldHVybiAnbGF5b3V0JzsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7CiAgICAgIHJldHVybiAkdGhpcy0+TGFuZygnYWRtaW5kZXNjcmlwdGlvbicpOwogICB9CgogICBwdWJsaWMgZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7CiAgICAgIHJldHVybiAiMi4wIjsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEdldERlcGVuZGVuY2llcygpIHsKICAgICAgcmV0dXJuIGFycmF5KCk7CiAgIH0KCiAgIHB1YmxpYyBmdW5jdGlvbiBJbml0aWFsaXplQWRtaW4oKSB7CiAgICAgICR0aGlzLT5SZXN0cmljdFVua25vd25QYXJhbXMoKTsKICAgfQoKICAgcHVibGljIGZ1bmN0aW9uIEluaXRpYWxpemVGcm9udGVuZCgpIHsKICAgICAgJHRoaXMtPlJlc3RyaWN0VW5rbm93blBhcmFtcygpOwogICB9CgogICAvKioKICAgICogQHJldHVybiBPdXRzb3VyY2VyCiAgICAqLwogICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7CgogICAgICAkdGhpcy0+c3RyVG1wRGlyID0gQ01TX1JPT1RfUEFUSCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAndG1wJyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAnT3V0c291cmNlcic7CiAgICAgICR0aGlzLT5zdHJUbXBEaXJfRGVzaWducyA9ICR0aGlzLT5zdHJUbXBEaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ2Rlc2lnbnMnOwogICAgICAkdGhpcy0+c3RyVG1wRGlyX0NvbnRlbnQgPSAkdGhpcy0+c3RyVG1wRGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdjb250ZW50JzsKICAgICAgJHRoaXMtPnN0clRtcERpcl9Vc2VycGx1Z2lucyA9ICR0aGlzLT5zdHJUbXBEaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3VzZXJwbHVnaW5zJzsKCiAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoKTsKCiAgICAgIGlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgnc3RhdHVzJywgJ29mZicpID09ICdvbicpIHsKICAgICAgICAgJHRoaXMtPmltcG9ydCgpOwogICAgICB9CiAgIH0KCiAgIC8qKgogICAgKiBtYWluIGZ1bmN0aW9uIC0gZXhwb3J0CiAgICAqCiAgICAqIEByZXR1cm4gYXJyYXkKICAgICovCiAgIHB1YmxpYyBmdW5jdGlvbiBleHBvcnQoKSB7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXkoKTsKCiAgICAgICRhcnJSZXR1cm4gPSBhcnJheV9tZXJnZSgkYXJyUmV0dXJuLCAkdGhpcy0+ZXhwb3J0RGVzaWducygpKTsKCiAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiAnaHInKTsKCiAgICAgICRhcnJSZXR1cm4gPSBhcnJheV9tZXJnZSgkYXJyUmV0dXJuLCAkdGhpcy0+ZXhwb3J0Q29udGVudCgpKTsKCiAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiAnaHInKTsKCiAgICAgICRhcnJSZXR1cm4gPSBhcnJheV9tZXJnZSgkYXJyUmV0dXJuLCAkdGhpcy0+ZXhwb3J0VXNlcnBsdWdpbnMoKSk7CgogICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gJ2hyJyk7CgogICAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnbGFzdF9ydW4nLCB0aW1lKCkpOwogICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ISU5ULCAnbWVzc2FnZScgPT4gJ2xhc3QgcnVuIGlzIHNldCB0bzogJyAuIGRhdGUoIlktbS1kIEg6aTpzIikpOwoKICAgICAgcmV0dXJuICRhcnJSZXR1cm47CiAgIH0KCiAgIC8qKgogICAgKiBtYWluIGZ1bmN0aW9uIC0gaW1wb3J0CiAgICAqCiAgICAqIEByZXR1cm4gYXJyYXkKICAgICovCiAgIHB1YmxpYyBmdW5jdGlvbiBpbXBvcnQoKSB7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXkoKTsKCiAgICAgICRhcnJSZXR1cm4gPSBhcnJheV9tZXJnZSgkYXJyUmV0dXJuLCAgJHRoaXMtPmltcG9ydERlc2lnbnMoKSk7CgogICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gJ2hyJyk7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXlfbWVyZ2UoJGFyclJldHVybiwgJHRoaXMtPmltcG9ydENvbnRlbnQoKSk7CgogICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gJ2hyJyk7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXlfbWVyZ2UoJGFyclJldHVybiwgJHRoaXMtPmltcG9ydFVzZXJwbHVnaW5zKCkpOwoKICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+ICdocicpOwoKICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJ2xhc3RfcnVuJywgdGltZSgpKTsKICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfSElOVCwgJ21lc3NhZ2UnID0+ICdsYXN0IHJ1biBpcyBzZXQgdG86ICcgLiBkYXRlKCJZLW0tZCBIOmk6cyIpKTsKCiAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICB9CgogICAvKioKICAgICogbWFpbiBmdW5jdGlvbiAtIGNsZWFyCiAgICAqCiAgICAqIEByZXR1cm4gYXJyYXkKICAgICovCiAgIHB1YmxpYyBmdW5jdGlvbiBjbGVhclRlbXBEaXIoKSB7CiAgICAgICR0aGlzLT5kZWxldGVSZWN1cnNpdmUoJHRoaXMtPnN0clRtcERpcik7CiAgIH0KCiAgIC8qKgogICAgKiBoZWxwZXIgZnVuY3Rpb24gLSBsYXlvdXQgbWVzc2FnZXMKICAgICoKICAgICogQHBhcmFtICRhcnJNZXNzYWdlcwogICAgKiBAcmV0dXJuIEhUTUwgTGlzdAogICAgKi8KICAgcHVibGljIGZ1bmN0aW9uIGFyck1lc3NhZ2VzVG9IVE1MKCRhcnJNZXNzYWdlcykgewogICAgICAkc3RyUmV0dXJuID0gJzx1bCBzdHlsZT0ibGlzdC1zdHlsZS10eXBlOiBub25lOyI+JzsKICAgICAgZm9yZWFjaCAoKGFycmF5KSRhcnJNZXNzYWdlcyBhcyAkYXJyTWVzc2FnZSkgewogICAgICAgICBzd2l0Y2ggKCRhcnJNZXNzYWdlWyd0eXBlJ10pIHsKICAgICAgICAgICAgY2FzZSBPdXRzb3VyY2VyOjpNRVNTQUdFX0hJTlQ6CiAgICAgICAgICAgICAgICRzdHJSZXR1cm4gLj0gJzxsaSBzdHlsZT0iY29sb3I6ICMxRThBMDA7Ij4nIC4gJGFyck1lc3NhZ2VbJ21lc3NhZ2UnXSAuICc8L2xpPic7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIE91dHNvdXJjZXI6Ok1FU1NBR0VfV0FSTjoKICAgICAgICAgICAgICAgJHN0clJldHVybiAuPSAnPGxpIHN0eWxlPSJjb2xvcjogI2VlOTkwMDsiPicgLiAkYXJyTWVzc2FnZVsnbWVzc2FnZSddIC4gJzwvbGk+JzsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgT3V0c291cmNlcjo6TUVTU0FHRV9FUlJPUjoKICAgICAgICAgICAgICAgJHN0clJldHVybiAuPSAnPGxpIHN0eWxlPSJjb2xvcjogI2NjMDAwMDsiPicgLiAkYXJyTWVzc2FnZVsnbWVzc2FnZSddIC4gJzwvbGk+JzsKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgT3V0c291cmNlcjo6TUVTU0FHRV9ERUJVRzoKICAgICAgICAgICAgICAgaWYgKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdtZXNzYWdlc19kZWJ1ZycsICdvZmYnKSA9PSAnb24nKSB7CiAgICAgICAgICAgICAgICAgICRzdHJSZXR1cm4gLj0gJzxsaSBzdHlsZT0iY29sb3I6ICM5RTlFOUU7Ij4nIC4gJGFyck1lc3NhZ2VbJ21lc3NhZ2UnXSAuICc8L2xpPic7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICRzdHJSZXR1cm4gLj0gJzxsaT4mbmJzcDs8L2xpPic7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgIH0KICAgICAgJHN0clJldHVybiAuPSAiPC91bD4iOwoKICAgICAgcmV0dXJuICRzdHJSZXR1cm47CiAgIH0KCiAgIC8qKgogICAgKiB0aGVyZSBpcyBubyBmdW5jdGlvbiB0byBnZXQgYWxsIHBvc3NpYmx5IHByb3BfbmFtZXMgb2YgYWxsIENvbnRlbnRUeXBlcywgc28gZG8gU1FMCiAgICAqCiAgICAqIEByZXR1cm4gQXJyYXkgb2YgcHJvcF9uYW1lCiAgICAqLwogICBwdWJsaWMgZnVuY3Rpb24gZ2V0QWxsUG9zc2libGVDb250ZW50UHJvcGVydGllcygpIHsKICAgICAgJGFyclJldHVybiA9IGFycmF5KCk7CiAgICAgICRvYmpDTVMgPSBjbXNtcygpOwogICAgICAkb2JqQURPQ29ubmVjdGlvbiA9ICRvYmpDTVMtPkdldERiKCk7CiAgICAgICRxdWVyeSA9ICJTRUxFQ1QgcHJvcF9uYW1lIEZST00gIiAuIGNtc19kYl9wcmVmaXgoKSAuICJjb250ZW50X3Byb3BzIEdST1VQIEJZICBwcm9wX25hbWUgT1JERVIgQlkgIHByb3BfbmFtZSI7CiAgICAgICRkYnJlc3VsdCA9ICRvYmpBRE9Db25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSk7CiAgICAgIGlmICgkZGJyZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ0RCLUVSUk9SICgnIC4gYmFzZW5hbWUoX19GSUxFX18pIC4gJzonIC4gX19MSU5FX18gLiAnKTogJyAuICRvYmpBRE9Db25uZWN0aW9uLT5FcnJvck1zZygpIC4gJzxiciAvPlF1ZXJ5OiAnIC4gJHF1ZXJ5KTsKICAgICAgfQogICAgICB3aGlsZSAoJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSkgewogICAgICAgICAkYXJyUmV0dXJuW10gPSAkcm93Wydwcm9wX25hbWUnXTsKICAgICAgfQogICAgICByZXR1cm4gJGFyclJldHVybjsKICAgfQoKICAgLyoqCiAgICAqIGNoZWNrIGFuZCBjcmVhdGUgZGlyCiAgICAqIEBwYXJhbSAkc3RyRGlyCiAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAqLwogICBwcml2YXRlIGZ1bmN0aW9uIGNoZWNrRGlyZWN0b3J5KCRzdHJEaXIpIHsKICAgICAgJHN0ckRpciA9IHN0cl9yZXBsYWNlKERJUkVDVE9SWV9TRVBBUkFUT1IuRElSRUNUT1JZX1NFUEFSQVRPUiwgRElSRUNUT1JZX1NFUEFSQVRPUiwgJHN0ckRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IpOwogICAgICBpZiAoIWZpbGVfZXhpc3RzKCRzdHJEaXIpKSB7CiAgICAgICAgIGlmICghbWtkaXIoJHN0ckRpciwgMDc3MCwgdHJ1ZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignRElSLUVSUk9SOiBjYW4gbm90IG1ha2UgZGlyOiAnIC4gJHN0ckRpcik7CiAgICAgICAgIH0KICAgICAgfQogICB9CgogICAvKioKICAgICogcmVtb3ZlIHVud2FudGVkIGNoYXIKICAgICogQHBhcmFtICRzdHJOYW1lCiAgICAqIEByZXR1cm4gc3RyaW5nCiAgICAqLwogICBwcml2YXRlIGZ1bmN0aW9uIG5hbWVUb0Rpcm5hbWUoJHN0ck5hbWUpIHsKICAgICAgcmV0dXJuIHByZWdfcmVwbGFjZSgnflteYS16QS1aMC05X11+JywgJycsICRzdHJOYW1lKTsKICAgfQoKICAgLyoqCiAgICAqIEByZXR1cm4gYXJyYXkKICAgICogQHRocm93cyBcQ21zRGF0YU5vdEZvdW5kRXhjZXB0aW9uCiAgICAqIEB0aHJvd3MgXENtc0ludmFsaWREYXRhRXhjZXB0aW9uCiAgICAqIEB0aHJvd3MgXEV4Y2VwdGlvbgogICAgKi8KICAgcHJpdmF0ZSBmdW5jdGlvbiBleHBvcnREZXNpZ25zKCkgewoKICAgICAgJGFyclJldHVybiA9IGFycmF5KCk7CiAgICAgICRhcnJVc2VkRGVzaWducyA9IGV4cGxvZGUoJ3wnLCBzdHJ0b2xvd2VyKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdkZXNpZ25fbmFtZXMnKSkpOwogICAgICBpZiAoZW1wdHkoJGFyclVzZWREZXNpZ25zKSkgJGFyclVzZWREZXNpZ25zID0gYXJyYXkoKTsKCiAgICAgICRhcnJMYXlvdXRDb2xsZWN0aW9ucyA9IENtc0xheW91dENvbGxlY3Rpb246OmdldF9hbGwoKTsKICAgICAgaWYgKGVtcHR5KCRhcnJMYXlvdXRDb2xsZWN0aW9ucykpICRhcnJMYXlvdXRDb2xsZWN0aW9ucyA9IGFycmF5KCk7CiAgICAgIGZvcmVhY2ggKChhcnJheSkkYXJyTGF5b3V0Q29sbGVjdGlvbnMgYXMgJG9iakNtc0xheW91dENvbGxlY3Rpb24pIHsKCiAgICAgICAgICRpbnREZXNpZ25JZCA9ICRvYmpDbXNMYXlvdXRDb2xsZWN0aW9uLT5nZXRfaWQoKTsKICAgICAgICAgJHN0ckRlc2lnbk5hbWUgPSAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbi0+Z2V0X25hbWUoKTsKCiAgICAgICAgIC8vY2hlY2sgaWYgZGVzaWduIGlzIGludGVyZXN0aW5nCiAgICAgICAgIGlmICghaW5fYXJyYXkoc3RydG9sb3dlcigkc3RyRGVzaWduTmFtZSksICRhcnJVc2VkRGVzaWducykpIHsKICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfREVCVUcsICdtZXNzYWdlJyA9PiAnc2tpcHBpbmcgZGVzaWduOiAnIC4gJHN0ckRlc2lnbk5hbWUpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQoKICAgICAgICAgLy9jaGVjayBkaXIKICAgICAgICAgJHN0ckRlc2lnbkV4cG9ydERpciA9ICR0aGlzLT5zdHJUbXBEaXJfRGVzaWducyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkaW50RGVzaWduSWQgLiAnIycgLiAkdGhpcy0+bmFtZVRvRGlybmFtZSgkc3RyRGVzaWduTmFtZSk7CiAgICAgICAgICR0aGlzLT5jaGVja0RpcmVjdG9yeSgkc3RyRGVzaWduRXhwb3J0RGlyKTsKCiAgICAgICAgICRhcnJUZW1wbGF0ZXMgPSAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbi0+Z2V0X3RlbXBsYXRlcygpOwogICAgICAgICBpZiAoZW1wdHkoJGFyclRlbXBsYXRlcykpICRhcnJUZW1wbGF0ZXMgPSBhcnJheSgpOwogICAgICAgICAkc3RyVGVtcGxhdGVFeHBvcnREaXIgPSAkc3RyRGVzaWduRXhwb3J0RGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICd0ZW1wbGF0ZXMnOwogICAgICAgICAkdGhpcy0+Y2hlY2tEaXJlY3RvcnkoJHN0clRlbXBsYXRlRXhwb3J0RGlyKTsKICAgICAgICAgZm9yZWFjaCAoKGFycmF5KSRhcnJUZW1wbGF0ZXMgYXMgJGludFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgJG9iakNtc0xheW91dFRlbXBsYXRlID0gQ21zTGF5b3V0VGVtcGxhdGU6OmxvYWQoJGludFRlbXBsYXRlSWQpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAkb2JqQ21zTGF5b3V0VGVtcGxhdGVUeXBlID0gQ21zTGF5b3V0VGVtcGxhdGVUeXBlOjpsb2FkKCRvYmpDbXNMYXlvdXRUZW1wbGF0ZS0+Z2V0X3R5cGVfaWQoKSk7CiAgICAgICAgICAgICAgICRzdHJUZW1wbGF0ZU9yaWdpbmF0b3IgPSAkb2JqQ21zTGF5b3V0VGVtcGxhdGVUeXBlLT5nZXRfb3JpZ2luYXRvcih0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgJHN0clRlbXBsYXRlT3JpZ2luYXRvciA9ICd1bmtub3duJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkc3RyVGVtcGxhdGVPcmlnaW5hdG9yRXhwb3J0RGlyID0gJHN0clRlbXBsYXRlRXhwb3J0RGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICR0aGlzLT5uYW1lVG9EaXJuYW1lKCRzdHJUZW1wbGF0ZU9yaWdpbmF0b3IpOwogICAgICAgICAgICAkdGhpcy0+Y2hlY2tEaXJlY3RvcnkoJHN0clRlbXBsYXRlT3JpZ2luYXRvckV4cG9ydERpcik7CgogICAgICAgICAgICAkaW50SWQgPSAkb2JqQ21zTGF5b3V0VGVtcGxhdGUtPmdldF9pZCgpOwogICAgICAgICAgICAkc3RyTmFtZSA9ICRvYmpDbXNMYXlvdXRUZW1wbGF0ZS0+Z2V0X25hbWUoKTsKICAgICAgICAgICAgJHN0ckNvbnRlbnQgPSAkb2JqQ21zTGF5b3V0VGVtcGxhdGUtPmdldF9jb250ZW50KCk7CiAgICAgICAgICAgICRzdHJUZW1wRmlsZSA9ICRzdHJUZW1wbGF0ZU9yaWdpbmF0b3JFeHBvcnREaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGludElkIC4gJyMnIC4gJHRoaXMtPm5hbWVUb0Rpcm5hbWUoJHN0ck5hbWUpIC4gJy50cGwnOwogICAgICAgICAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoJHN0clRlbXBGaWxlLCAkc3RyQ29udGVudCkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0VSUk9SLCAnbWVzc2FnZScgPT4gJ2NhbiBub3Qgd3JpdGUgdGVtcGxhdGU6ICcgLiAkc3RyVGVtcEZpbGUpOwogICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ISU5ULCAnbWVzc2FnZScgPT4gJ0Rlc2lnbiAtIGV4cG9ydCBkb25lOiAnIC4gJHN0ckRlc2lnbk5hbWUgLiAnIHwgJyAuICRzdHJOYW1lIC4gJyB8ICcgLiBiYXNlbmFtZSgkc3RyVGVtcEZpbGUpKTsKICAgICAgICAgfQoKICAgICAgICAgJGFyclN0eWxzaGVldHMgPSAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbi0+Z2V0X3N0eWxlc2hlZXRzKCk7CiAgICAgICAgIGlmIChlbXB0eSgkYXJyU3R5bHNoZWV0cykpICRhcnJTdHlsc2hlZXRzID0gYXJyYXkoKTsKICAgICAgICAgJHN0clN0eWxlc2hlZXRFeHBvcnREaXIgPSAkc3RyRGVzaWduRXhwb3J0RGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdzdHlsZXNoZWV0cyc7CiAgICAgICAgICR0aGlzLT5jaGVja0RpcmVjdG9yeSgkc3RyU3R5bGVzaGVldEV4cG9ydERpcik7CiAgICAgICAgIGZvcmVhY2ggKChhcnJheSkkYXJyU3R5bHNoZWV0cyBhcyAkaW50U3R5bGVzaGVldElkKSB7CiAgICAgICAgICAgICRvYmpDbXNMYXlvdXRTdHlsZXNoZWV0ID0gQ21zTGF5b3V0U3R5bGVzaGVldDo6bG9hZCgkaW50U3R5bGVzaGVldElkKTsKICAgICAgICAgICAgJGludElkID0gJG9iakNtc0xheW91dFN0eWxlc2hlZXQtPmdldF9pZCgpOwogICAgICAgICAgICAkc3RyTmFtZSA9ICRvYmpDbXNMYXlvdXRTdHlsZXNoZWV0LT5nZXRfbmFtZSgpOwogICAgICAgICAgICAkc3RyQ29udGVudCA9ICRvYmpDbXNMYXlvdXRTdHlsZXNoZWV0LT5nZXRfY29udGVudCgpOwogICAgICAgICAgICAkc3RyVGVtcEZpbGUgPSAkc3RyU3R5bGVzaGVldEV4cG9ydERpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkaW50SWQgLiAnIycgLiAkdGhpcy0+bmFtZVRvRGlybmFtZSgkc3RyTmFtZSkgLiAnLmNzcyc7CiAgICAgICAgICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkc3RyVGVtcEZpbGUsICRzdHJDb250ZW50KSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfRVJST1IsICdtZXNzYWdlJyA9PiAnY2FuIG5vdCB3cml0ZSBzdHlsZXNoZWV0OiAnIC4gJHN0clRlbXBGaWxlKTsKICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfSElOVCwgJ21lc3NhZ2UnID0+ICdEZXNpZ24gLSBleHBvcnQgZG9uZTogJyAuICRzdHJEZXNpZ25OYW1lIC4gJyB8ICcgLiAkc3RyTmFtZSAuICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSk7CiAgICAgICAgIH0KCiAgICAgIH0KCiAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICB9CgogICAvKioKICAgICogQHJldHVybiBhcnJheQogICAgKiBAdGhyb3dzIFxFeGNlcHRpb24KICAgICovCiAgIHByaXZhdGUgZnVuY3Rpb24gZXhwb3J0Q29udGVudCgpIHsKCiAgICAgICRhcnJSZXR1cm4gPSBhcnJheSgpOwoKICAgICAgJGFyclVzZWRDb250ZW50UHJvcGVydGllcyA9IGV4cGxvZGUoJ3wnLCBzdHJ0b2xvd2VyKCR0aGlzLT5HZXRQcmVmZXJlbmNlKCdjb250ZW50X3Byb3BfbmFtZXMnLCAnY29udGVudF9lbicpKSk7CiAgICAgIGlmIChlbXB0eSgkYXJyVXNlZENvbnRlbnRQcm9wZXJ0aWVzKSkgJGFyclVzZWRDb250ZW50UHJvcGVydGllcyA9IGFycmF5KCk7CgogICAgICAkb2JqQ29udGVudE9wZXJhdGlvbnMgPSBDb250ZW50T3BlcmF0aW9uczo6Z2V0X2luc3RhbmNlKCk7CgogICAgICAkb2JqQ01TID0gY21zbXMoKTsKICAgICAgJG9iakFET0Nvbm5lY3Rpb24gPSAkb2JqQ01TLT5HZXREYigpOwoKICAgICAgJHF1ZXJ5ID0gIlNFTEVDVCBjcC5jb250ZW50X2lkLCBjLmNvbnRlbnRfbmFtZSwgY3AucHJvcF9uYW1lLCBjcC5jb250ZW50LCBjcC5tb2RpZmllZF9kYXRlCiAgICAgICAgICAgIEZST00gIiAuIGNtc19kYl9wcmVmaXgoKSAuICJjb250ZW50X3Byb3BzIGNwCiAgICAgICAgICAgIEpPSU4gIiAuIGNtc19kYl9wcmVmaXgoKSAuICJjb250ZW50IGMgT04gKGNwLmNvbnRlbnRfaWQgPSBjLmNvbnRlbnRfaWQpIjsKICAgICAgJGRicmVzdWx0ID0gJG9iakFET0Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgaWYgKCRkYnJlc3VsdCA9PT0gZmFsc2UpIHsKICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignREItRVJST1IgKCcgLiBiYXNlbmFtZShfX0ZJTEVfXykgLiAnOicgLiBfX0xJTkVfXyAuICcpOiAnIC4gJG9iakFET0Nvbm5lY3Rpb24tPkVycm9yTXNnKCkgLiAnPGJyIC8+UXVlcnk6ICcgLiAkcXVlcnkpOwogICAgICB9CiAgICAgIHdoaWxlICgkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CiAgICAgICAgIC8vY2hlY2sgb2YgcHJvcGVydHkgaXMgaW50ZXJlc3RpbmcKICAgICAgICAgaWYgKCFpbl9hcnJheShzdHJ0b2xvd2VyKCRyb3dbJ3Byb3BfbmFtZSddKSwgJGFyclVzZWRDb250ZW50UHJvcGVydGllcykpIHsKICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfREVCVUcsICdtZXNzYWdlJyA9PiAnc2tpcHBpbmcgY29udGVudCBwcm9wZXJ0eTogJyAuICRyb3dbJ3Byb3BfbmFtZSddKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KCiAgICAgICAgICRvYmpDb250ZW50ID0gJG9iakNvbnRlbnRPcGVyYXRpb25zLT5Mb2FkQ29udGVudEZyb21JZCgkcm93Wydjb250ZW50X2lkJ10sIHRydWUpOwogICAgICAgICAkc3RySGllcmFyY2h5UGF0aCA9ICcnOwogICAgICAgICBpZiAoJG9iakNvbnRlbnQgaW5zdGFuY2VvZiBDb250ZW50KSB7CiAgICAgICAgICAgICRzdHJIaWVyYXJjaHlQYXRoID0gJG9iakNvbnRlbnQtPkhpZXJhcmNoeVBhdGgoKTsKICAgICAgICAgfQogICAgICAgICAvL2NvbnZlcnQgaGllcmFyY2h5IHRvIGRpcmVjdG9yeQogICAgICAgICAkc3RySGllcmFyY2h5UGF0aCA9IHN0cl9yZXBsYWNlKCIvIiwgRElSRUNUT1JZX1NFUEFSQVRPUiwgJHN0ckhpZXJhcmNoeVBhdGgpOwogICAgICAgICAkc3RySGllcmFyY2h5UGF0aCA9IHN0cl9yZXBsYWNlKCJcXCIsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRzdHJIaWVyYXJjaHlQYXRoKTsKCiAgICAgICAgICRzdHJDb250ZW50TmFtZSA9ICR0aGlzLT5uYW1lVG9EaXJuYW1lKCRyb3dbJ2NvbnRlbnRfbmFtZSddKTsKICAgICAgICAgJHN0clRtcERpciA9ICR0aGlzLT5zdHJUbXBEaXJfQ29udGVudCAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkc3RySGllcmFyY2h5UGF0aCAuIERJUkVDVE9SWV9TRVBBUkFUT1I7CiAgICAgICAgICR0aGlzLT5jaGVja0RpcmVjdG9yeSgkc3RyVG1wRGlyKTsKICAgICAgICAgJHN0clRlbXBGaWxlID0gJHN0clRtcERpciAuICRyb3dbJ2NvbnRlbnRfaWQnXSAuICcjJyAuICRzdHJDb250ZW50TmFtZSAuICcjJyAuICRyb3dbJ3Byb3BfbmFtZSddIC4gJy50cGwnOwogICAgICAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoJHN0clRlbXBGaWxlLCAkcm93Wydjb250ZW50J10pID09PSBmYWxzZSkgewogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9FUlJPUiwgJ21lc3NhZ2UnID0+ICdjYW4gbm90IHdyaXRlIGNvbnRlbnRmaWxlOiAnIC4gJHN0clRlbXBGaWxlKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfSElOVCwgJ21lc3NhZ2UnID0+ICdDb250ZW50IC0gZXhwb3J0IGRvbmU6ICcgLiAkcm93Wydjb250ZW50X2lkJ10gLiAnIHwgJyAuICRyb3dbJ2NvbnRlbnRfbmFtZSddIC4gJyB8ICcgLiAkcm93Wydwcm9wX25hbWUnXSAuICAnIHwgJyAuIGJhc2VuYW1lKCRzdHJUZW1wRmlsZSkpOwogICAgICB9CgogICAgICByZXR1cm4gJGFyclJldHVybjsKICAgfQoKICAgLyoqCiAgICAqIEByZXR1cm4gYXJyYXkKICAgICogQHRocm93cyBcRXhjZXB0aW9uCiAgICAqLwogICBwcml2YXRlIGZ1bmN0aW9uIGV4cG9ydFVzZXJwbHVnaW5zKCkgewoKICAgICAgJGFyclJldHVybiA9IGFycmF5KCk7CgogICAgICAkb2JqQ01TID0gY21zbXMoKTsKICAgICAgJG9iakFET0Nvbm5lY3Rpb24gPSAkb2JqQ01TLT5HZXREYigpOwoKICAgICAgJHRoaXMtPmNoZWNrRGlyZWN0b3J5KCR0aGlzLT5zdHJUbXBEaXJfVXNlcnBsdWdpbnMpOwoKICAgICAgJHF1ZXJ5ID0gIlNFTEVDVCB1c2VycGx1Z2luX2lkLCB1c2VycGx1Z2luX25hbWUsIGNvZGUsIG1vZGlmaWVkX2RhdGUgRlJPTSAiIC4gY21zX2RiX3ByZWZpeCgpIC4gInVzZXJwbHVnaW5zIjsKICAgICAgJGRicmVzdWx0ID0gJG9iakFET0Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgaWYgKCRkYnJlc3VsdCA9PT0gZmFsc2UpIHsKICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignREItRVJST1IgKCcgLiBiYXNlbmFtZShfX0ZJTEVfXykgLiAnOicgLiBfX0xJTkVfXyAuICcpOiAnIC4gJG9iakFET0Nvbm5lY3Rpb24tPkVycm9yTXNnKCkgLiAnPGJyIC8+UXVlcnk6ICcgLiAkcXVlcnkpOwogICAgICB9CiAgICAgIHdoaWxlICgkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CiAgICAgICAgICRzdHJUZW1wRmlsZSA9ICR0aGlzLT5zdHJUbXBEaXJfVXNlcnBsdWdpbnMgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHJvd1sndXNlcnBsdWdpbl9pZCddIC4gJyMnIC4gJHJvd1sndXNlcnBsdWdpbl9uYW1lJ10gLiAnLnBocCc7CiAgICAgICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkc3RyVGVtcEZpbGUsICRyb3dbJ2NvZGUnXSkgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0VSUk9SLCAnbWVzc2FnZScgPT4gJ2NhbiBub3Qgd3JpdGUgdXNlcnBsdWdpbjogJyAuICRzdHJUZW1wRmlsZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0hJTlQsICdtZXNzYWdlJyA9PiAnVXNlcnBsdWdpbiAtIGV4cG9ydCBkb25lOiAnIC4gJHJvd1sndXNlcnBsdWdpbl9uYW1lJ10gLiAgJyB8ICcgLiBiYXNlbmFtZSgkc3RyVGVtcEZpbGUpKTsKICAgICAgfQoKICAgICAgcmV0dXJuICRhcnJSZXR1cm47CiAgIH0KCiAgIC8qKgogICAgKiBAcmV0dXJuIGFycmF5CiAgICAqIEB0aHJvd3MgXENtc0RhdGFOb3RGb3VuZEV4Y2VwdGlvbgogICAgKiBAdGhyb3dzIFxDbXNJbnZhbGlkRGF0YUV4Y2VwdGlvbgogICAgKiBAdGhyb3dzIFxFeGNlcHRpb24KICAgICovCiAgIHByaXZhdGUgZnVuY3Rpb24gaW1wb3J0RGVzaWducygpIHsKCiAgICAgICRhcnJSZXR1cm4gPSBhcnJheSgpOwogICAgICAkdHNMYXN0UnVuID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2xhc3RfcnVuJywgdGltZSgpKTsKICAgICAgJGFyclVzZWREZXNpZ25zID0gZXhwbG9kZSgnfCcsIHN0cnRvbG93ZXIoJHRoaXMtPkdldFByZWZlcmVuY2UoJ2Rlc2lnbl9uYW1lcycpKSk7CiAgICAgIGlmIChlbXB0eSgkYXJyVXNlZERlc2lnbnMpKSAkYXJyVXNlZERlc2lnbnMgPSBhcnJheSgpOwoKICAgICAgJGFyckxheW91dENvbGxlY3Rpb25zID0gQ21zTGF5b3V0Q29sbGVjdGlvbjo6Z2V0X2FsbCgpOwogICAgICBpZiAoZW1wdHkoJGFyckxheW91dENvbGxlY3Rpb25zKSkgJGFyckxheW91dENvbGxlY3Rpb25zID0gYXJyYXkoKTsKICAgICAgZm9yZWFjaCAoKGFycmF5KSRhcnJMYXlvdXRDb2xsZWN0aW9ucyBhcyAkb2JqQ21zTGF5b3V0Q29sbGVjdGlvbikgewoKICAgICAgICAgJGludERlc2lnbklkID0gJG9iakNtc0xheW91dENvbGxlY3Rpb24tPmdldF9pZCgpOwogICAgICAgICAkc3RyRGVzaWduTmFtZSA9ICRvYmpDbXNMYXlvdXRDb2xsZWN0aW9uLT5nZXRfbmFtZSgpOwoKICAgICAgICAgLy9jaGVjayBpZiBkZXNpZ24gaXMgaW50ZXJlc3RpbmcKICAgICAgICAgaWYgKCFpbl9hcnJheShzdHJ0b2xvd2VyKCRzdHJEZXNpZ25OYW1lKSwgJGFyclVzZWREZXNpZ25zKSkgewogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ERUJVRywgJ21lc3NhZ2UnID0+ICdza2lwcGluZyBkZXNpZ246ICcgLiAkc3RyRGVzaWduTmFtZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CgogICAgICAgICAvL2Jhc2UgZGlyIGZvciBkZXNpZ24KICAgICAgICAgJHN0ckRlc2lnbkV4cG9ydERpciA9ICR0aGlzLT5zdHJUbXBEaXJfRGVzaWducyAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkaW50RGVzaWduSWQgLiAnIycgLiAkdGhpcy0+bmFtZVRvRGlybmFtZSgkc3RyRGVzaWduTmFtZSk7CgogICAgICAgICAvL2NoZWNrIGRpcgogICAgICAgICAkc3RyVGVtcGxhdGVFeHBvcnREaXIgPSAkc3RyRGVzaWduRXhwb3J0RGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICd0ZW1wbGF0ZXMnOwogICAgICAgICAkYXJyVGVtcGxhdGVzID0gJG9iakNtc0xheW91dENvbGxlY3Rpb24tPmdldF90ZW1wbGF0ZXMoKTsKICAgICAgICAgaWYgKGVtcHR5KCRhcnJUZW1wbGF0ZXMpKSAkYXJyVGVtcGxhdGVzID0gYXJyYXkoKTsKICAgICAgICAgZm9yZWFjaCAoKGFycmF5KSRhcnJUZW1wbGF0ZXMgYXMgJGludFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgJG9iakNtc0xheW91dFRlbXBsYXRlID0gQ21zTGF5b3V0VGVtcGxhdGU6OmxvYWQoJGludFRlbXBsYXRlSWQpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAkb2JqQ21zTGF5b3V0VGVtcGxhdGVUeXBlID0gQ21zTGF5b3V0VGVtcGxhdGVUeXBlOjpsb2FkKCRvYmpDbXNMYXlvdXRUZW1wbGF0ZS0+Z2V0X3R5cGVfaWQoKSk7CiAgICAgICAgICAgICAgICRzdHJUZW1wbGF0ZU9yaWdpbmF0b3IgPSAkb2JqQ21zTGF5b3V0VGVtcGxhdGVUeXBlLT5nZXRfb3JpZ2luYXRvcih0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgJHN0clRlbXBsYXRlT3JpZ2luYXRvciA9ICd1bmtub3duJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkc3RyVGVtcGxhdGVPcmlnaW5hdG9yRXhwb3J0RGlyID0gJHN0clRlbXBsYXRlRXhwb3J0RGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICR0aGlzLT5uYW1lVG9EaXJuYW1lKCRzdHJUZW1wbGF0ZU9yaWdpbmF0b3IpOwoKICAgICAgICAgICAgJGludElkID0gJG9iakNtc0xheW91dFRlbXBsYXRlLT5nZXRfaWQoKTsKICAgICAgICAgICAgJHN0ck5hbWUgPSAkb2JqQ21zTGF5b3V0VGVtcGxhdGUtPmdldF9uYW1lKCk7CgogICAgICAgICAgICAkc3RyVGVtcEZpbGUgPSAkc3RyVGVtcGxhdGVPcmlnaW5hdG9yRXhwb3J0RGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRpbnRJZCAuICcjJyAuICR0aGlzLT5uYW1lVG9EaXJuYW1lKCRzdHJOYW1lKSAuICcudHBsJzsKICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkc3RyVGVtcEZpbGUpKSB7CiAgICAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX1dBUk4sICdtZXNzYWdlJyA9PiAnbm8gZXhwb3J0IGZvdW5kIGZvciB0ZW1wbGF0ZTogJyAuICRpbnRJZC4nIC0gJy4kc3RyTmFtZSAuICcgb24gJyAuICRzdHJUZW1wRmlsZSApOwogICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZpbGVtdGltZSgkc3RyVGVtcEZpbGUpIDw9ICR0c0xhc3RSdW4pIHsKICAgICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfREVCVUcsICdtZXNzYWdlJyA9PiAnZmlsZSBub3QgY2hhbmdlZDogJyAuICRzdHJEZXNpZ25OYW1lIC4gJyB8ICcgLiAkc3RyTmFtZSAuICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSApOwogICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHN0ckNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkc3RyVGVtcEZpbGUpOwogICAgICAgICAgICAkc3RyQ29udGVudCA9IHByZWdfcmVwbGFjZSgnfnsuKicgLiBfX0NMQVNTX18gLiAnLip9W1xuXSp+JywgJycsICRzdHJDb250ZW50KTsgLy9yZW1vdmUgZWFybHllciB0aW1lc3RhbXAKICAgICAgICAgICAgJHN0ckNvbnRlbnQgPSAneyogaW1wb3J0ZWQgd2l0aCAnIC4gX19DTEFTU19fIC4gJyBhdCAnIC4gZGF0ZSgnWS1tLWQgSDppOnMnKSAuICcgKn0nIC4gUEhQX0VPTCAuICRzdHJDb250ZW50OwoKICAgICAgICAgICAgJG9iakNtc0xheW91dFRlbXBsYXRlLT5zZXRfY29udGVudCgkc3RyQ29udGVudCk7CiAgICAgICAgICAgIC8vIHByZXZlbnQgbG9vc2luZyBhc3NvYwogICAgICAgICAgICAkb2JqQ21zTGF5b3V0VGVtcGxhdGUtPmdldF9kZXNpZ25zKCk7CiAgICAgICAgICAgICRvYmpDbXNMYXlvdXRUZW1wbGF0ZS0+Z2V0X2FkZGl0aW9uYWxfZWRpdG9ycygpOwogICAgICAgICAgICAvL3NhdmUKICAgICAgICAgICAgJG9iakNtc0xheW91dFRlbXBsYXRlLT5zYXZlKCk7CiAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0hJTlQsICdtZXNzYWdlJyA9PiAnbmV3IHZlcnNpb246ICcgLiAkc3RyRGVzaWduTmFtZSAuICcgfCAnIC4gJHN0ck5hbWUgLiAnIHwgJyAuIGJhc2VuYW1lKCRzdHJUZW1wRmlsZSkpOwogICAgICAgICB9CgogICAgICAgICAkYXJyU3R5bHNoZWV0cyA9ICRvYmpDbXNMYXlvdXRDb2xsZWN0aW9uLT5nZXRfc3R5bGVzaGVldHMoKTsKICAgICAgICAgaWYgKGVtcHR5KCRhcnJTdHlsc2hlZXRzKSkgJGFyclN0eWxzaGVldHMgPSBhcnJheSgpOwogICAgICAgICAkc3RyU3R5bGVzaGVldEV4cG9ydERpciA9ICRzdHJEZXNpZ25FeHBvcnREaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJ3N0eWxlc2hlZXRzJzsKICAgICAgICAgZm9yZWFjaCAoKGFycmF5KSRhcnJTdHlsc2hlZXRzIGFzICRpbnRTdHlsZXNoZWV0SWQpIHsKICAgICAgICAgICAgJG9iakNtc0xheW91dFN0eWxlc2hlZXQgPSBDbXNMYXlvdXRTdHlsZXNoZWV0Ojpsb2FkKCRpbnRTdHlsZXNoZWV0SWQpOwogICAgICAgICAgICAkaW50SWQgPSAkb2JqQ21zTGF5b3V0U3R5bGVzaGVldC0+Z2V0X2lkKCk7CiAgICAgICAgICAgICRzdHJOYW1lID0gJG9iakNtc0xheW91dFN0eWxlc2hlZXQtPmdldF9uYW1lKCk7CgogICAgICAgICAgICAkc3RyVGVtcEZpbGUgPSAkc3RyU3R5bGVzaGVldEV4cG9ydERpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkaW50SWQgLiAnIycgLiAkdGhpcy0+bmFtZVRvRGlybmFtZSgkc3RyTmFtZSkgLiAnLmNzcyc7CiAgICAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJHN0clRlbXBGaWxlKSkgewogICAgICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9XQVJOLCAnbWVzc2FnZScgPT4gJ25vIGV4cG9ydCBmb3VuZCBmb3Igc3R5bGVzaGVldDogJyAuICRpbnRJZC4nIC0gJy4kc3RyTmFtZSApOwogICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGZpbGVtdGltZSgkc3RyVGVtcEZpbGUpIDw9ICR0c0xhc3RSdW4pIHsKICAgICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfREVCVUcsICdtZXNzYWdlJyA9PiAnZmlsZSBub3QgY2hhbmdlZDogJyAuICRzdHJEZXNpZ25OYW1lIC4gJyB8ICcgLiAkc3RyTmFtZSAuICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSk7CiAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkc3RyQ29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRzdHJUZW1wRmlsZSk7CiAgICAgICAgICAgICRzdHJDb250ZW50ID0gcHJlZ19yZXBsYWNlKCd+LyouKicgLiBfX0NMQVNTX18gLiAnLiovW1xuXSp+JywgJycsICRzdHJDb250ZW50KTsgLy9yZW1vdmUgZWFybHllciB0aW1lc3RhbXAKICAgICAgICAgICAgJHN0ckNvbnRlbnQgPSAnLyogaW1wb3J0ZWQgd2l0aCAnIC4gX19DTEFTU19fIC4gJyBhdCAnIC4gZGF0ZSgnWS1tLWQgSDppOnMnKSAuICcgKi8nIC4gUEhQX0VPTCAuICRzdHJDb250ZW50OwoKICAgICAgICAgICAgJG9iakNtc0xheW91dFN0eWxlc2hlZXQtPnNldF9jb250ZW50KCRzdHJDb250ZW50KTsKICAgICAgICAgICAgLy8gcHJldmVudCBsb29zaW5nIGFzc29jCiAgICAgICAgICAgICRvYmpDbXNMYXlvdXRTdHlsZXNoZWV0LT5nZXRfZGVzaWducygpOwogICAgICAgICAgICAvL3NhdmUKICAgICAgICAgICAgJG9iakNtc0xheW91dFN0eWxlc2hlZXQtPnNhdmUoKTsKICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfSElOVCwgJ21lc3NhZ2UnID0+ICduZXcgdmVyc2lvbjogJyAuICRzdHJEZXNpZ25OYW1lIC4gJyB8ICcgLiAkc3RyTmFtZSAuICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSk7CiAgICAgICAgIH0KCiAgICAgIH0KCiAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICB9CgogICAvKioKICAgICogQHJldHVybiBhcnJheQogICAgKiBAdGhyb3dzIFxFeGNlcHRpb24KICAgICovCiAgIHByaXZhdGUgZnVuY3Rpb24gaW1wb3J0Q29udGVudCgpIHsKCiAgICAgICRhcnJSZXR1cm4gPSBhcnJheSgpOwoKICAgICAgJHRzTGFzdFJ1biA9ICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdsYXN0X3J1bicsIHRpbWUoKSk7CiAgICAgICRhcnJVc2VkQ29udGVudFByb3BlcnRpZXMgPSBleHBsb2RlKCd8Jywgc3RydG9sb3dlcigkdGhpcy0+R2V0UHJlZmVyZW5jZSgnY29udGVudF9wcm9wX25hbWVzJywgJ2NvbnRlbnRfZW4nKSkpOwogICAgICBpZiAoZW1wdHkoJGFyclVzZWRDb250ZW50UHJvcGVydGllcykpICRhcnJVc2VkQ29udGVudFByb3BlcnRpZXMgPSBhcnJheSgpOwoKICAgICAgJG9iakNvbnRlbnRPcGVyYXRpb25zID0gQ29udGVudE9wZXJhdGlvbnM6OmdldF9pbnN0YW5jZSgpOwoKICAgICAgJG9iakNNUyA9IGNtc21zKCk7CiAgICAgICRvYmpBRE9Db25uZWN0aW9uID0gJG9iakNNUy0+R2V0RGIoKTsKCiAgICAgICRxdWVyeSA9ICJTRUxFQ1QgY3AuY29udGVudF9pZCwgYy5jb250ZW50X25hbWUsIGNwLnByb3BfbmFtZSwgY3AuY29udGVudCwgY3AubW9kaWZpZWRfZGF0ZQogICAgICAgICAgICBGUk9NICIgLiBjbXNfZGJfcHJlZml4KCkgLiAiY29udGVudF9wcm9wcyBjcAogICAgICAgICAgICBKT0lOICIgLiBjbXNfZGJfcHJlZml4KCkgLiAiY29udGVudCBjIE9OIChjcC5jb250ZW50X2lkID0gYy5jb250ZW50X2lkKSI7CiAgICAgICRkYnJlc3VsdCA9ICRvYmpBRE9Db25uZWN0aW9uLT5FeGVjdXRlKCRxdWVyeSk7CiAgICAgIGlmICgkZGJyZXN1bHQgPT09IGZhbHNlKSB7CiAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ0RCLUVSUk9SICgnIC4gYmFzZW5hbWUoX19GSUxFX18pIC4gJzonIC4gX19MSU5FX18gLiAnKTogJyAuICRvYmpBRE9Db25uZWN0aW9uLT5FcnJvck1zZygpIC4gJzxiciAvPlF1ZXJ5OiAnIC4gJHF1ZXJ5KTsKICAgICAgfQogICAgICB3aGlsZSAoJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSkgewogICAgICAgICAvL2NoZWNrIG9mIHByb3BlcnR5IGlzIGludGVyZXN0aW5nCiAgICAgICAgIGlmICghaW5fYXJyYXkoc3RydG9sb3dlcigkcm93Wydwcm9wX25hbWUnXSksICRhcnJVc2VkQ29udGVudFByb3BlcnRpZXMpKSB7CiAgICAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0RFQlVHLCAnbWVzc2FnZScgPT4gJ3NraXBwaW5nIGNvbnRlbnQgcHJvcGVydHk6ICcgLiAkcm93Wydwcm9wX25hbWUnXSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CgogICAgICAgICAkb2JqQ29udGVudCA9ICRvYmpDb250ZW50T3BlcmF0aW9ucy0+TG9hZENvbnRlbnRGcm9tSWQoJHJvd1snY29udGVudF9pZCddLCB0cnVlKTsKICAgICAgICAgJHN0ckhpZXJhcmNoeVBhdGggPSAnJzsKICAgICAgICAgaWYgKCRvYmpDb250ZW50IGluc3RhbmNlb2YgQ29udGVudCkgewogICAgICAgICAgICAkc3RySGllcmFyY2h5UGF0aCA9ICRvYmpDb250ZW50LT5IaWVyYXJjaHlQYXRoKCk7CiAgICAgICAgIH0KICAgICAgICAgLy9jb252ZXJ0IGhpZXJhcmNoeSB0byBkaXJlY3RvcnkKICAgICAgICAgJHN0ckhpZXJhcmNoeVBhdGggPSBzdHJfcmVwbGFjZSgiLyIsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRzdHJIaWVyYXJjaHlQYXRoKTsKICAgICAgICAgJHN0ckhpZXJhcmNoeVBhdGggPSBzdHJfcmVwbGFjZSgiXFwiLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkc3RySGllcmFyY2h5UGF0aCk7CgogICAgICAgICAkc3RyQ29udGVudE5hbWUgPSAkdGhpcy0+bmFtZVRvRGlybmFtZSgkcm93Wydjb250ZW50X25hbWUnXSk7CiAgICAgICAgICRzdHJUbXBEaXIgPSAkdGhpcy0+c3RyVG1wRGlyX0NvbnRlbnQgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHN0ckhpZXJhcmNoeVBhdGggLiBESVJFQ1RPUllfU0VQQVJBVE9SOwogICAgICAgICAkc3RyVGVtcEZpbGUgPSAkc3RyVG1wRGlyIC4gJHJvd1snY29udGVudF9pZCddIC4gJyMnIC4gJHN0ckNvbnRlbnROYW1lIC4gJyMnIC4gJHJvd1sncHJvcF9uYW1lJ10gLiAnLnRwbCc7CiAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJHN0clRlbXBGaWxlKSkgewogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9XQVJOLCAnbWVzc2FnZScgPT4gJ2ZpbGUgbm90IGZvdW5kIChtYXkgYmUgY29udGVudCBpdGVtIGlzIG5ldyBhbmQgbm90IHlldCBleHBvcnRlZCk6ICcgLiAkc3RyQ29udGVudE5hbWUgLiAnIHwgJyAuICRyb3dbJ3Byb3BfbmFtZSddKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZpbGVtdGltZSgkc3RyVGVtcEZpbGUpIDw9ICR0c0xhc3RSdW4pIHsKICAgICAgICAgICAgJGFyclJldHVybltdID0gYXJyYXkoJ3R5cGUnID0+IHNlbGY6Ok1FU1NBR0VfREVCVUcsICdtZXNzYWdlJyA9PiAnZmlsZSBub3QgY2hhbmdlZDogJyAuICRzdHJDb250ZW50TmFtZSAuICcgfCAnIC4gJHJvd1sncHJvcF9uYW1lJ10gLiAnIHwgJyAuIGJhc2VuYW1lKCRzdHJUZW1wRmlsZSkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQoKICAgICAgICAgLy9sb2FkIENvbnRlbnRPYmplY3QKICAgICAgICAgJG9iakNvbnRlbnQgPSAkb2JqQ29udGVudE9wZXJhdGlvbnMtPkxvYWRDb250ZW50RnJvbUlkKCRyb3dbJ2NvbnRlbnRfaWQnXSwgdHJ1ZSk7CiAgICAgICAgIGlmICgkb2JqQ29udGVudCBpbnN0YW5jZW9mIENvbnRlbnQpIHsKICAgICAgICAgICAgJHN0ckNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkc3RyVGVtcEZpbGUpOwogICAgICAgICAgICAkc3RyQ29udGVudCA9IHByZWdfcmVwbGFjZSgnfnsuKicgLiBfX0NMQVNTX18gLiAnLip9W1xuXSp+JywgJycsICRzdHJDb250ZW50KTsgLy9yZW1vdmUgZWFybHllciB0aW1lc3RhbXAKICAgICAgICAgICAgJHN0ckNvbnRlbnQgPSAneyogaW1wb3J0ZWQgd2l0aCAnIC4gX19DTEFTU19fIC4gJyBhdCAnIC4gZGF0ZSgnWS1tLWQgSDppOnMnKSAuICcgKn0nIC4gUEhQX0VPTCAuICRzdHJDb250ZW50OwogICAgICAgICAgICAkb2JqQ29udGVudC0+U2V0UHJvcGVydHlWYWx1ZSgkcm93Wydwcm9wX25hbWUnXSwgJHN0ckNvbnRlbnQpOwogICAgICAgICAgICAkb2JqQ29udGVudC0+U2F2ZSgpOwogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ISU5ULCAnbWVzc2FnZScgPT4gJ25ldyB2ZXJzaW9uOiAnIC4gJHN0ckNvbnRlbnROYW1lIC4gJyB8ICcgLiAkcm93Wydwcm9wX25hbWUnXSAuICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSk7CiAgICAgICAgIH0KCiAgICAgIH0KCiAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICB9CgogICAvKioKICAgICogQHJldHVybiBhcnJheQogICAgKiBAdGhyb3dzIFxFeGNlcHRpb24KICAgICovCiAgIHByaXZhdGUgZnVuY3Rpb24gaW1wb3J0VXNlcnBsdWdpbnMoKSB7CgogICAgICAkYXJyUmV0dXJuID0gYXJyYXkoKTsKCiAgICAgICR0c0xhc3RSdW4gPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbGFzdF9ydW4nLCB0aW1lKCkpOwogICAgICAkb2JqQ01TID0gY21zbXMoKTsKICAgICAgJG9iakFET0Nvbm5lY3Rpb24gPSAkb2JqQ01TLT5HZXREYigpOwoKICAgICAgJHF1ZXJ5ID0gIlNFTEVDVCB1c2VycGx1Z2luX2lkLCB1c2VycGx1Z2luX25hbWUsIGNvZGUsIG1vZGlmaWVkX2RhdGUgRlJPTSAiIC4gY21zX2RiX3ByZWZpeCgpIC4gInVzZXJwbHVnaW5zIjsKICAgICAgJGRicmVzdWx0ID0gJG9iakFET0Nvbm5lY3Rpb24tPkV4ZWN1dGUoJHF1ZXJ5KTsKICAgICAgaWYgKCRkYnJlc3VsdCA9PT0gZmFsc2UpIHsKICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignREItRVJST1IgKCcgLiBiYXNlbmFtZShfX0ZJTEVfXykgLiAnOicgLiBfX0xJTkVfXyAuICcpOiAnIC4gJG9iakFET0Nvbm5lY3Rpb24tPkVycm9yTXNnKCkgLiAnPGJyIC8+UXVlcnk6ICcgLiAkcXVlcnkpOwogICAgICB9CiAgICAgIHdoaWxlICgkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpKSB7CiAgICAgICAgICRzdHJUZW1wRmlsZSA9ICR0aGlzLT5zdHJUbXBEaXJfVXNlcnBsdWdpbnMgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHJvd1sndXNlcnBsdWdpbl9pZCddIC4gJyMnIC4gJHJvd1sndXNlcnBsdWdpbl9uYW1lJ10gLiAnLnBocCc7CiAgICAgICAgIGlmICghZmlsZV9leGlzdHMoJHN0clRlbXBGaWxlKSkgewogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9XQVJOLCAnbWVzc2FnZScgPT4gJ2ZpbGUgbm90IGZvdW5kIChtYXkgYmUgdXNlcnBsdWdpbiBpcyBuZXcgYW5kIG5vdCB5ZXQgZXhwb3J0ZWQpOiAnIC4gJHJvd1sndXNlcnBsdWdpbl9uYW1lJ10pOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBpZiAoZmlsZW10aW1lKCRzdHJUZW1wRmlsZSkgPD0gJHRzTGFzdFJ1bikgewogICAgICAgICAgICAkYXJyUmV0dXJuW10gPSBhcnJheSgndHlwZScgPT4gc2VsZjo6TUVTU0FHRV9ERUJVRywgJ21lc3NhZ2UnID0+ICdmaWxlIG5vdCBjaGFuZ2VkOiAnIC4gJHJvd1sndXNlcnBsdWdpbl9uYW1lJ10gLiAnIHwgJyAuIGJhc2VuYW1lKCRzdHJUZW1wRmlsZSkpOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQoKICAgICAgICAgJHN0ckNvbnRlbnQgPSBmaWxlX2dldF9jb250ZW50cygkc3RyVGVtcEZpbGUpOwogICAgICAgICAkc3RyQ29udGVudCA9IHByZWdfcmVwbGFjZSgnfi8uKicgLiBfX0NMQVNTX18gLiAnLiovW1xuXSp+JywgJycsICRzdHJDb250ZW50KTsgLy9yZW1vdmUgZWFybHllciB0aW1lc3RhbXAKICAgICAgICAgJHN0ckNvbnRlbnQgPSAnLyogaW1wb3J0ZWQgd2l0aCAnIC4gX19DTEFTU19fIC4gJyBhdCAnIC4gZGF0ZSgnWS1tLWQgSDppOnMnKSAuICcgKi8nIC4gUEhQX0VPTCAuICRzdHJDb250ZW50OwoKICAgICAgICAgLy9zYXZlIG5ldyB2YWx1ZXMgdG8gZGF0YWJhc2UKICAgICAgICAgJG9ialVzZXJUYWdPcGVyYXRpb25zID0gVXNlclRhZ09wZXJhdGlvbnM6OmdldF9pbnN0YW5jZSgpOwogICAgICAgICAkb2JqVXNlclRhZ09wZXJhdGlvbnMtPlNldFVzZXJUYWcoJHJvd1sndXNlcnBsdWdpbl9uYW1lJ10sICRzdHJDb250ZW50LCBmYWxzZSk7CiAgICAgICAgICRhcnJSZXR1cm5bXSA9IGFycmF5KCd0eXBlJyA9PiBzZWxmOjpNRVNTQUdFX0hJTlQsICdtZXNzYWdlJyA9PiAnbmV3IHZlcnNpb246ICcgLiAkcm93Wyd1c2VycGx1Z2luX25hbWUnXSAuICcgfCAnIC4gYmFzZW5hbWUoJHN0clRlbXBGaWxlKSk7CiAgICAgIH0KCiAgICAgIHJldHVybiAkYXJyUmV0dXJuOwogICB9CgogICAvKioKICAgICogZGVsZXRlIGRpcmVjdG9yeSByZWN1cnNpdmVseQogICAgKiBAcGFyYW0gJHN0ckRpcgogICAgKi8KICAgcHJpdmF0ZSBmdW5jdGlvbiBkZWxldGVSZWN1cnNpdmUoJHN0ckRpcikgewogICAgICBpZiAoaXNfZGlyKCRzdHJEaXIpKSB7CiAgICAgICAgICRvYmplY3RzID0gc2NhbmRpcigkc3RyRGlyKTsKICAgICAgICAgZm9yZWFjaCAoKGFycmF5KSRvYmplY3RzIGFzICRvYmplY3QpIHsKICAgICAgICAgICAgaWYgKCRvYmplY3QgIT0gIi4iICYmICRvYmplY3QgIT0gIi4uIikgewogICAgICAgICAgICAgICBpZiAoaXNfZGlyKCRzdHJEaXIuIi8iLiRvYmplY3QpKQogICAgICAgICAgICAgICAgICAkdGhpcy0+ZGVsZXRlUmVjdXJzaXZlKCRzdHJEaXIuIi8iLiRvYmplY3QpOwogICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHVubGluaygkc3RyRGlyLiIvIi4kb2JqZWN0KTsKICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJtZGlyKCRzdHJEaXIpOwogICAgICB9CiAgIH0KCn0=]]></data>
	</file>
</module>
