<?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>CMSForms</name>
	<version>0.0.10</version>
  <mincmsversion>1.8.2</mincmsversion>
	<help><![CDATA[PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0ZXIgaXMgdXNlZCB0byBzcGVjaWZ5IHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIGZvciBkaXNwbGF5IG9uIHRoZSBmcm9udGVuZC4gTm90IGFsbCBtb2R1bGVzIHN1cHBvcnQgb3IgbmVlZCB0aGlzLjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBKZWFuLUNocmlzdG9waGUgQ3V2ZWxpZXIgJmx0O2N5YmVydG90b3BoZUBnbWFpbC5jb20mZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4wLjEwPGJyIC8+]]></about>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/CMSForms.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCi8qCglNb2R1bGU6IENNUyBGb3JtcyAtIFRoaXMgbW9kdWxlIGhlbHBzIGRldmVsb3BlcnMgdG8gaGFuZGxlIGZvcm1zIGZvciB0aGVpciBmcm9udGVuZCBvciBiYWNrZW5kIGFwcGxpY2F0aW9ucwoJCglDb3B5cmlnaHRzOiBKZWFuLUNocmlzdG9waGUgQ3V2ZWxpZXIgLSBNb3JyaXMgJiBDaGFwbWFuIEJlbGdpdW0gLSAyMDEwIMKpCiovCgpyZXF1aXJlX29uY2UgZGlybmFtZShfX0ZJTEVfXykgLiAnL2xpYi9jbGFzc2VzL0NNU0Zvcm0uY2xhc3MucGhwJzsKcmVxdWlyZV9vbmNlIGRpcm5hbWUoX19GSUxFX18pIC4gJy9saWIvY2xhc3Nlcy9DTVNGb3JtV2lkZ2V0LmNsYXNzLnBocCc7CnJlcXVpcmVfb25jZSBkaXJuYW1lKF9fRklMRV9fKSAuICcvbGliL2NsYXNzZXMvQ01TRm9ybVZhbGlkYXRvci5jbGFzcy5waHAnOwoKY2xhc3MgQ01TRm9ybXMgZXh0ZW5kcyBDTVNNb2R1bGUKewoJcHVibGljIGZ1bmN0aW9uIEdldE5hbWUoKQkJCQl7CXJldHVybiAnQ01TRm9ybXMnOwkgfQoJcHVibGljIGZ1bmN0aW9uIEdldFZlcnNpb24oKSAgICAgICAgICAgCXsgcmV0dXJuICcwLjAuMTAnOyB9CglwdWJsaWMgZnVuY3Rpb24gR2V0QXV0aG9yKCkgICAgICAgICAgICAJeyByZXR1cm4gJ0plYW4tQ2hyaXN0b3BoZSBDdXZlbGllcic7IH0KCXB1YmxpYyBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpICAgICAgIAl7IHJldHVybiAnY3liZXJ0b3RvcGhlQGdtYWlsLmNvbSc7IH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCiRsYW5nID0gYXJyYXkoCgkKCQoJCgkKCQovLyBFeGNlcHRpb25zCgonZmllbGRfaXNfZW1wdHknID0+ICdUaGUgZmllbGQgJXMgaXMgZW1wdHkuJywJCidmaWVsZF9jYW5ub3RfYmVfZW1wdHknID0+ICdUaGUgZmllbGQgIiVzIiBjYW5ub3QgYmUgZW1wdHkuJywJCid1bmtub3duIGZpZWxkJyA9PiAnVW5rbm93biBmaWVsZCAiJXMiJywKJ2ZpZWxkcyBub3QgZXF1YWwnID0+ICdUaGUgIiVzIiBhbmQgIiVzIiBoYXZlIHRvIGJlIHRoZSBzYW1lLicsCidpbnZhbGlkIGVtYWlsJyA9PiAnVGhlIGVtYWlsICZsYXF1bzslcyZyYXF1bzsgaXMgbm90IHZhbGlkLicsCidmaWVsZCBub3QgdW5pcXVlJyA9PiAnJXMgYWxyZWFkeSBleGlzdHMuJwoJCgkKCQoJCgkKCQopOw==]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/classes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/classes/CMSForm.class.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCgkvKgoJCVRoaXMgY2xhc3MgYWltIHRvIGhhbmRsZSBDTVMgRm9ybXMgdmVyeSBkaWZmZXJlbnRseS4KCQkKCQlBdXRob3I6IEplYW4tQ2hyaXN0b3BoZSBDdXZlbGllciA8Y3liZXJ0b3RvcGhlQGdtYWlsLmNvbT4KCQlDb3B5cmlnaHRzOiBKZWFuLUNocmlzdG9waGUgQ3V2ZWxpZXIgLSBNb3JyaXMgJiBDaGFwbWFuIEJlbGdpdW0gLSAyMDEwCgkJTGljZW5jZTogR1BMCQkKCQoJKi8KCmNsYXNzIENNU0Zvcm0JZXh0ZW5kcwlDbXNPYmplY3QKewoJCglwcm90ZWN0ZWQgJG1vZHVsZV9uYW1lOwoJcHJvdGVjdGVkICRpZDsgLy8gVGhlIGZvcm0gSUQKCXByb3RlY3RlZCAkcmV0dXJuaWQ7Cglwcm90ZWN0ZWQgJGFjdGlvbjsJCglwcm90ZWN0ZWQgJG1ldGhvZCA9ICdnZXQnOwoJcHJvdGVjdGVkICRlbmN0eXBlOwoJCglwcm90ZWN0ZWQgJHdpZGdldHMgPSBhcnJheSgpOyAvLyBUaGUgZm9ybSB3aWRnZXRzCglwcm90ZWN0ZWQgJGhpZGRlbl93aWRnZXRzID0gYXJyYXkoKTsgLy8gU3BlY2lmaWMgd2lkZ2V0cyBzaG93biBvbiB0aGUgYmVnaW47Cglwcm90ZWN0ZWQgJGZpZWxkc2V0cyA9IGFycmF5KCk7IC8vIFN1YiBmb3JtcyBmb3IgZmllbGRzZXRzCgkKCXByb3RlY3RlZCAkbGFiZWxzID0gYXJyYXkoCgkJJ3N1Ym1pdCcgPT4gJ1N1Ym1pdCcsCgkJJ2FwcGx5JyA9PiAnQXBwbHknLAoJCSdjYW5jZWwnID0+ICdDYW5jZWwnLAoJCSduZXh0JyA9PiAnTmV4dCcsCgkJJ3ByZXZpb3VzJyA9PiAnUHJldmlvdXMnCgkJKTsKCQkKCXByb3RlY3RlZCAkYWN0aXZlX2J1dHRvbnMgPSBhcnJheSgnc3VibWl0JywnY2FuY2VsJyk7Cglwcm90ZWN0ZWQgJGZvcm1fZXJyb3JzID0gYXJyYXkoKTsgCglwcm90ZWN0ZWQgJHNob3dfcHJpb3JpdHkgPSBmYWxzZTsKCQoJcHJvdGVjdGVkICR0ZW1wbGF0ZXMgPSBhcnJheSgKCQknd2lkZ2V0JyA9PiAnPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQkJPGRpdiBjbGFzcz0icGFnZXRleHQiPiVMQUJFTCU6PC9kaXY+CgkJCTxkaXYgY2xhc3M9InBhZ2VpbnB1dCI+JUlOUFVUJSA8ZW0+JVRJUFMlPC9lbT48L2Rpdj4KCQkJPGRpdiBjbGFzcz0icGFnZWlucHV0IiBzdHlsZT0iY29sb3I6IHJlZDsiPiVFUlJPUlMlPC9kaXY+CgkJPC9kaXY+JywKCQknZXJyb3JzJyA9PiAnPGRpdiBzdHlsZT0iY29sb3I6IHJlZDsiPiVFUlJPUlMlPC9kaXY+JywKCQknYnV0dG9ucycgPT4gJzxwPiVCVVRUT05TJTwvcD4nCgkJKTsKCQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtb2R1bGVfbmFtZSwgJGlkLCAkYWN0aW9uLCAkcmV0dXJuaWQpCgl7CgkJJHRoaXMtPm1vZHVsZV9uYW1lID0gJG1vZHVsZV9uYW1lOwoJCSR0aGlzLT5pZCA9ICRpZDsKCQkkdGhpcy0+cmV0dXJuaWQgPSAkcmV0dXJuaWQ7CgkJJHRoaXMtPmFjdGlvbiA9ICRhY3Rpb247Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBzZXRNZXRob2QoJG1ldGhvZCA9ICdnZXQnKQoJewoJCWlmICgkbWV0aG9kID09ICdwb3N0JykKCQl7CgkJCSR0aGlzLT5tZXRob2QgPSAncG9zdCc7CgkJfQoJfQoJCglwdWJsaWMgZnVuY3Rpb24gc2V0TXVsdGlwYXJ0Rm9ybSgpCgl7CgkJJHRoaXMtPm1ldGhvZCA9ICdwb3N0JzsKCQkkdGhpcy0+ZW5jdHlwZSA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhJzsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIHByb2Nlc3MoKQoJewoJCWZvcmVhY2goJHRoaXMtPndpZGdldHMgYXMgJHdpZGdldCkKCQl7CgkJCSR3aWRnZXQtPnByb2Nlc3MoKTsKCQl9CgkJCgkJZm9yZWFjaCgkdGhpcy0+aGlkZGVuX3dpZGdldHMgYXMgJHdpZGdldCkKCQl7CgkJCSR3aWRnZXQtPnByb2Nlc3MoKTsKCQl9CQkKCQkKCQlmb3JlYWNoKCR0aGlzLT5maWVsZHNldHMgYXMgJGZpZWxkc2V0KQoJCXsKCQkJJGZpZWxkc2V0LT5wcm9jZXNzKCk7CgkJfQoJfQoJCglwdWJsaWMgZnVuY3Rpb24gcmVuZGVyKCkKCXsKCQkvLyBUT0RPCgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBzZXRUZW1wbGF0ZSgkdGVtcGxhdGVfbmFtZSwgJHRlbXBsYXRlKQoJewoJCSR0aGlzLT50ZW1wbGF0ZXNbJHRlbXBsYXRlX25hbWVdID0gJHRlbXBsYXRlOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0SGVhZGVycygpCgl7CgkJZ2xvYmFsICRnQ21zOwoJCWlmIChpc3NldCgkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXSkpCgkJewkJCQoJCQkkaHRtbCA9ICRnQ21zLT5tb2R1bGVzWyR0aGlzLT5tb2R1bGVfbmFtZV1bJ29iamVjdCddLT5DcmVhdGVGb3JtU3RhcnQoJHRoaXMtPmlkLCAkdGhpcy0+YWN0aW9uLCAkdGhpcy0+cmV0dXJuaWQsICR0aGlzLT5tZXRob2QsICR0aGlzLT5lbmN0eXBlKTsKCQkJZm9yZWFjaCgkdGhpcy0+aGlkZGVuX3dpZGdldHMgYXMgJHdpZGdldCkKCQkJewoJCQkJJGh0bWwgLj0gJHdpZGdldDsKCQkJfQkJCQoJCQlyZXR1cm4gJGh0bWw7CgkJfQoJCXJldHVybiBudWxsOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9vdGVycygpCgl7CgkJZ2xvYmFsICRnQ21zOwoJCWlmIChpc3NldCgkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXSkpCgkJewkJCQoJCQkkaHRtbCA9ICRnQ21zLT5tb2R1bGVzWyR0aGlzLT5tb2R1bGVfbmFtZV1bJ29iamVjdCddLT5DcmVhdGVGb3JtRW5kKCk7CgkJCXJldHVybiAkaHRtbDsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBzZXRMYWJlbCgkbGFiZWwsICR0aXRsZSkKCXsKCQkkdGhpcy0+bGFiZWxzWyRsYWJlbF0gPSAkdGl0bGU7Cgl9CgkKCQoJcHVibGljIGZ1bmN0aW9uIHNldEJ1dHRvbnMoJGJ1dHRvbnMgPSBhcnJheSgpKQoJewoJCWlmIChpc19hcnJheSgkYnV0dG9ucykpCSR0aGlzLT5hY3RpdmVfYnV0dG9ucyA9ICRidXR0b25zOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0QnV0dG9ucygpCgl7CgkJZ2xvYmFsICRnQ21zOwoJCSRodG1sID0gJyc7CgkJZm9yZWFjaCgkdGhpcy0+YWN0aXZlX2J1dHRvbnMgYXMgJGJ1dHRvbikKCQl7CgkJCSRodG1sIC49ICRnQ21zLT5tb2R1bGVzWyR0aGlzLT5tb2R1bGVfbmFtZV1bJ29iamVjdCddLT5DcmVhdGVJbnB1dFN1Ym1pdCgkdGhpcy0+aWQsICRidXR0b24sICR0aGlzLT5sYWJlbHNbJGJ1dHRvbl0pOwoJCX0KCQkKCQlyZXR1cm4gJGh0bWw7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBzZXRXaWRnZXQoJG5hbWUsJHR5cGUsJHNldHRpbmdzID0gYXJyYXkoKSkKCXsKCQkkd2lkZ2V0ID0gbmV3IENNU0Zvcm1XaWRnZXQoJiR0aGlzLCR0aGlzLT5pZCwkdGhpcy0+bW9kdWxlX25hbWUsJG5hbWUsJHR5cGUsJHNldHRpbmdzKTsKCQlpZiAoJHR5cGUgPT0gJ2hpZGRlbicpCgkJewoJCQkkdGhpcy0+aGlkZGVuX3dpZGdldHNbJG5hbWVdID0gJHdpZGdldDsKCQl9CgkJZWxzZWlmICgkdHlwZSA9PSAnZmlsZScpCgkJewoJCQkkdGhpcy0+c2V0TXVsdGlwYXJ0Rm9ybSgpOyAvLyBJZiB3ZSBhZGQgZmlsZXMsIHdlIGhhdmUgdG8gYmUgcG9zdGVkIG11bHRpcGFydCBmb3Jtcy4uLgoJCQkkdGhpcy0+d2lkZ2V0c1skbmFtZV0gPSAkd2lkZ2V0OwoJCX0KCQllbHNlCgkJewoJCQkkdGhpcy0+d2lkZ2V0c1skbmFtZV0gPSAkd2lkZ2V0OwoJCX0KCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldFdpZGdldHMoKQoJewoJCXJldHVybiAkdGhpcy0+d2lkZ2V0czsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldFdpZGdldCgkbmFtZSkKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPndpZGdldHNbJG5hbWVdKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+d2lkZ2V0c1skbmFtZV07CgkJfQoJCWVsc2VpZiAoaXNzZXQoJHRoaXMtPmhpZGRlbl93aWRnZXRzWyRuYW1lXSkpCgkJewoJCQlyZXR1cm4gJHRoaXMtPmhpZGRlbl93aWRnZXRzWyRuYW1lXTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJfQoJCglwdWJsaWMgZnVuY3Rpb24gc2hvd1dpZGdldHMoJHRlbXBsYXRlPW51bGwpCgl7CgkJJGh0bWwgPSAnJzsKCQlmb3JlYWNoKCR0aGlzLT53aWRnZXRzIGFzICR3aWRnZXQpCgkJewoJCQkkaHRtbCAuPSAkd2lkZ2V0LT5zaG93KCR0ZW1wbGF0ZSk7CgkJfQoJCXJldHVybiAkaHRtbDsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGhhc0Vycm9ycygpCgl7CgkJJGhhc19lcnJvcnMgPSBmYWxzZTsKCQkKCQlmb3JlYWNoKCR0aGlzLT53aWRnZXRzIGFzICR3aWRnZXQpCgkJewoJCQlpZigkd2lkZ2V0LT5oYXNFcnJvcnMoKSkKCQkJewoJCQkJJGhhc19lcnJvcnMgPSB0cnVlOwoJCQl9CgkJfQoJCQoJCWZvcmVhY2goJHRoaXMtPmhpZGRlbl93aWRnZXRzIGFzICR3aWRnZXQpCgkJewoJCQlpZigkd2lkZ2V0LT5oYXNFcnJvcnMoKSkKCQkJewoJCQkJJGhhc19lcnJvcnMgPSB0cnVlOwoJCQl9CgkJfQoJCQoJCWZvcmVhY2goJHRoaXMtPmZpZWxkc2V0cyBhcyAkZmllbGRzZXQpCgkJewoJCQlpZigkZmllbGRzZXQtPmhhc0Vycm9ycygpKQoJCQl7CgkJCQkkaGFzX2Vycm9ycyA9IHRydWU7CgkJCX0KCQl9CgkJCgkJaWYgKGNvdW50KCR0aGlzLT5mb3JtX2Vycm9ycykgIT0gMCkKCQl7CgkJCSRoYXNfZXJyb3JzID0gdHJ1ZTsKCQl9CgkJCgkJcmV0dXJuICRoYXNfZXJyb3JzOyAKCX0KCQoJcHVibGljIGZ1bmN0aW9uIG5vRXJyb3IoKQoJewoJCXJldHVybiAhJHRoaXMtPmhhc0Vycm9ycygpOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmZvcm1fZXJyb3JzOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gc2hvd0Vycm9ycygpCgl7CgkJJGh0bWwgPSAnJzsKCQlpZihjb3VudCgkdGhpcy0+Zm9ybV9lcnJvcnMpID4gMCkKCQl7CgkJCSRodG1sIC49ICc8dWwgY2xhc3M9ImVycm9ycyI+JzsKCQkJZm9yZWFjaCgkdGhpcy0+Zm9ybV9lcnJvcnMgYXMgJHByaW9yaXR5ID0+ICRlcnJvcnMpCgkJCXsKCQkJCSRodG1sIC49ICc8bGk+JzsKCQkJCWlmICgkdGhpcy0+c2hvd19wcmlvcml0eSkJJGh0bWwgLj0gJzxlbSBjbGFzcz0iZm9ybV9lcnJvcl9wcmlvcml0eSI+Jy4kcHJpb3JpdHkuJzwvZW0+JzsKCQkJCSRodG1sIC49ICc8dWw+JzsKCQkJCWZvcmVhY2goJGVycm9ycyBhcyAkZXJyb3IpCgkJCQl7CgkJCQkJJGh0bWwgLj0gJzxsaT4nLiRlcnJvci4nPC9saT4nOwoJCQkJfQkJCQkKCQkJCSRodG1sIC49ICc8L3VsPjwvbGk+JzsKCQkJfQoJCQkkaHRtbCAuPSAnPC91bD4nOwoJCX0KCQlyZXR1cm4gJGh0bWw7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBzZXRFcnJvcigkbWVzc2FnZSwkcHJpb3JpdHk9J2RlZmF1bHQnKQoJewoJCSR0aGlzLT5mb3JtX2Vycm9yc1skcHJpb3JpdHldW10gPSAkbWVzc2FnZTsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGlzU3VibWl0dGVkKCkKCXsKCQlpZiAoaXNzZXQoJF9SRVFVRVNUWyR0aGlzLT5pZC4nc3VibWl0J10pKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGlzQXBwbGllZCgpCgl7CgkJaWYgKGlzc2V0KCRfUkVRVUVTVFskdGhpcy0+aWQuJ2FwcGx5J10pKQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0JCgkKCXB1YmxpYyBmdW5jdGlvbiBpc0NhbmNlbGxlZCgpCgl7CgkJaWYgKGlzc2V0KCRfUkVRVUVTVFskdGhpcy0+aWQuJ2NhbmNlbCddKSkKCQl7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGlzUG9zdGVkKCkKCXsKCQkvLyBBZGQgY2hlY2sgZm9yIG5leHQgYW5kIHByZXZpb3VzCgkJaWYgKCR0aGlzLT5pc1N1Ym1pdHRlZCgpIHx8ICR0aGlzLT5pc0FwcGxpZWQoKSkKCQl7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBpc1B1c2hlZCgkYnV0dG9uKQoJewoJCWlmIChpc3NldCgkX1JFUVVFU1RbJHRoaXMtPmlkLiRidXR0b25dKSkKCQl7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBpc1NlbnQoKQoJewoJCQlmb3JlYWNoKCR0aGlzLT5hY3RpdmVfYnV0dG9ucyBhcyAkYnV0dG9uKQoJCQl7CgkJCQkJaWYgKGlzc2V0KCRfUkVRVUVTVFskdGhpcy0+aWQuJGJ1dHRvbl0pKQoJCQkJCXsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQl9CgkJCQoJCQlyZXR1cm4gZmFsc2U7Cgl9CgkKCQoJCglwdWJsaWMgZnVuY3Rpb24gc2V0RmllbGRzZXQoJGxlZ2VuZCkKCXsKCQkkdGhpcy0+ZmllbGRzZXRzWyRsZWdlbmRdID0gbmV3IENNU0Zvcm1GaWVsZHNldCgkdGhpcywkbGVnZW5kKTsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldEZpZWxkc2V0KCRsZWdlbmQpCgl7CgkJaWYgKGlzc2V0KCR0aGlzLT5maWVsZHNldHNbJGxlZ2VuZF0pKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5maWVsZHNldHNbJGxlZ2VuZF07CgkJfQoJCXJldHVybiBudWxsOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gcmVuZGVyRmllbGRzZXRzKCR3aWRnZXRfdGVtcGxhdGUgPSBudWxsKQoJewoJCSRodG1sID0gJyc7CgkJZm9yZWFjaCgkdGhpcy0+ZmllbGRzZXRzIGFzICRmaWVsZHNldCkKCQl7CgkJCSRodG1sIC49ICRmaWVsZHNldC0+cmVuZGVyKCR3aWRnZXRfdGVtcGxhdGUpOwoJCX0KCQlyZXR1cm4gJGh0bWw7Cgl9CgkKfQoKY2xhc3MgQ01TRm9ybUZpZWxkc2V0IGV4dGVuZHMgQ01TRm9ybQp7Cglwcm90ZWN0ZWQgJHBhcmVudF9mb3JtOwoJcHJvdGVjdGVkICRsZWdlbmQ7CgkKCXB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgmJGZvcm0sICRsZWdlbmQpCgl7CgkJcGFyZW50OjpfX2NvbnN0cnVjdCgkZm9ybS0+bW9kdWxlX25hbWUsICRmb3JtLT5pZCwgJGZvcm0tPmFjdGlvbiwgJGZvcm0tPnJldHVybmlkKTsKCQkkdGhpcy0+bGVnZW5kID0gJGxlZ2VuZDsKCQkkdGhpcy0+cGFyZW50X2Zvcm0gPSYgJGZvcm07Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiByZW5kZXIoJHdpZGdldF90ZW1wbGF0ZT1udWxsKQoJewoJCSRodG1sID0gJzxmaWVsZHNldD48bGVnZW5kPicuJHRoaXMtPmxlZ2VuZC4nPC9sZWdlbmQ+JzsKCQkkaHRtbCAuPSAkdGhpcy0+c2hvd1dpZGdldHMoJHdpZGdldF90ZW1wbGF0ZSk7CgkJJGh0bWwgLj0gJzwvZmllbGRzZXQ+JzsKCQlyZXR1cm4gJGh0bWw7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBzZXRXaWRnZXQoJG5hbWUsJHR5cGUsJHNldHRpbmdzID0gYXJyYXkoKSkKCXsKCQlpZiAoJHR5cGUgPT0gJ2ZpbGUnKQoJCXsKCQkJJHRoaXMtPnBhcmVudF9mb3JtLT5zZXRNdWx0aXBhcnRGb3JtKCk7CgkJfQoJCXBhcmVudDo6c2V0V2lkZ2V0KCRuYW1lLCR0eXBlLCRzZXR0aW5ncyk7Cgl9CgkKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/classes/CMSFormValidator.class.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCgkvKgoJCVRoaXMgY2xhc3MgYWltIHRvIGhhbmRsZSBDTVMgRm9ybXMgdmVyeSBkaWZmZXJlbnRseS4KCQkKCQlBdXRob3I6IEplYW4tQ2hyaXN0b3BoZSBDdXZlbGllciA8Y3liZXJ0b3RvcGhlQGdtYWlsLmNvbT4KCQlDb3B5cmlnaHRzOiBKZWFuLUNocmlzdG9waGUgQ3V2ZWxpZXIgLSBNb3JyaXMgJiBDaGFwbWFuIEJlbGdpdW0gLSAyMDEwCgkJTGljZW5jZTogR1BMCQkKCQoJKi8KCQpjbGFzcyBDTVNGb3JtVmFsaWRhdG9yCnsKCXByb3RlY3RlZCAkd2lkZ2V0OwoJcHJvdGVjdGVkICR2YWxpZGF0b3I7Cglwcm90ZWN0ZWQgJHBhcmFtczsKCQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCYkd2lkZ2V0LCR2YWxpZGF0b3IsJHBhcmFtcykKCXsKCQkkdGhpcy0+d2lkZ2V0ID0gJHdpZGdldDsKCQkkdGhpcy0+dmFsaWRhdG9yID0gJHZhbGlkYXRvcjsKCQkkdGhpcy0+cGFyYW1zID0gJHBhcmFtczsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGNoZWNrKCkKCXsKCQlzd2l0Y2goJHRoaXMtPnZhbGlkYXRvcikKCQl7CgkJCWNhc2UgJ25vdF9lbXB0eSc6CgkJCQlyZXR1cm4gJHRoaXMtPkNoZWNrTm90RW1wdHkoKTsKCQkJY2FzZSAnZXF1YWxfZmllbGQnOgoJCQkJcmV0dXJuICR0aGlzLT5DaGVja0VxdWFsRmllbGQoKTsKCQkJY2FzZSAnZW1haWwnOgoJCQkJcmV0dXJuICR0aGlzLT5DaGVja0VtYWlsKCk7CgkJCWNhc2UgJ3VuaXF1ZSc6CgkJCQlyZXR1cm4gJHRoaXMtPkNoZWNrVW5pcXVlKCk7CgkJCWRlZmF1bHQ6CgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCdVbmtub3duIGZvcm0gdmFsaWRhdG9yICInLiR0aGlzLT52YWxpZGF0b3IgLiciLicpOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCQoJcHJvdGVjdGVkIGZ1bmN0aW9uIENoZWNrVW5pcXVlKCkKCXsKCQkkdmFsdWUgPSBpbXBsb2RlKCd8JywkdGhpcy0+d2lkZ2V0LT5nZXRWYWx1ZXMoKSk7CgkJaWYgKGNhbGxfdXNlcl9mdW5jKCR0aGlzLT5wYXJhbXMsICR2YWx1ZSkgIT09IG51bGwpCgkJewoJCQlnbG9iYWwgJGdDbXM7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJGdDbXMtPm1vZHVsZXNbJ0NNU0Zvcm1zJ11bJ29iamVjdCddLT5sYW5nKCdmaWVsZCBub3QgdW5pcXVlJywgJHZhbHVlKSk7CgkJfQoJCXJldHVybiB0cnVlOwoJfQoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gQ2hlY2tOb3RFbXB0eSgpCgl7CQoJCWdsb2JhbCAkZ0NtczsKCQkkdmFsdWVzID0gJHRoaXMtPndpZGdldC0+Z2V0VmFsdWVzKCk7CgkJaWYgKGlzX2FycmF5KCR2YWx1ZXMpICYmIGNvdW50KCR2YWx1ZXMpID09IDApCgkJewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCRnQ21zLT5tb2R1bGVzWydDTVNGb3JtcyddWydvYmplY3QnXS0+bGFuZygnZmllbGRfY2Fubm90X2JlX2VtcHR5JywgJHRoaXMtPndpZGdldC0+Z2V0RnJpZW5kbHlOYW1lKCkpKTsKCQl9CgkJZWxzZWlmKGVtcHR5KCR2YWx1ZXMpKQoJCXsKCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigkZ0Ntcy0+bW9kdWxlc1snQ01TRm9ybXMnXVsnb2JqZWN0J10tPmxhbmcoJ2ZpZWxkX2Nhbm5vdF9iZV9lbXB0eScsICR0aGlzLT53aWRnZXQtPmdldEZyaWVuZGx5TmFtZSgpKSk7CgkJfQoJCQoJCXJldHVybiB0cnVlOwoJfQoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gQ2hlY2tFcXVhbEZpZWxkKCkKCXsKCQlnbG9iYWwgJGdDbXM7CgkJCSR2YWx1ZTEgPSBzZXJpYWxpemUoJHRoaXMtPndpZGdldC0+Z2V0VmFsdWVzKCkpOwoJCQkKCQkJdHJ5CgkJCXsKCQkJCSR2YWx1ZTIgPSBzZXJpYWxpemUoJHRoaXMtPndpZGdldC0+Z2V0Rm9ybSgpLT5nZXRXaWRnZXQoJHRoaXMtPnBhcmFtcyktPmdldFZhbHVlcygpKTsKCQkJfQoJCQljYXRjaChFeGNlcHRpb24gJGUpCgkJCXsKCQkJCXRocm93IG5ldyBFeGNlcHRpb24oJGdDbXMtPm1vZHVsZXNbJ0NNU0Zvcm1zJ11bJ29iamVjdCddLT5sYW5nKCd1bmtub3duIGZpZWxkJywgJHRoaXMtPnBhcmFtcykpOwoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCQoJCQlpZiAoJHZhbHVlMSAhPSAkdmFsdWUyKQoJCQl7CgkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCRnQ21zLT5tb2R1bGVzWydDTVNGb3JtcyddWydvYmplY3QnXS0+bGFuZygnZmllbGRzIG5vdCBlcXVhbCcsICR0aGlzLT53aWRnZXQtPmdldEZyaWVuZGx5TmFtZSgpLCAkdGhpcy0+d2lkZ2V0LT5nZXRGb3JtKCktPmdldFdpZGdldCgkdGhpcy0+cGFyYW1zKS0+Z2V0RnJpZW5kbHlOYW1lKCkpKTsKCQkJfQoJCQkKCQkJcmV0dXJuIHRydWU7CgkJCgl9CgkKCXByb3RlY3RlZCBmdW5jdGlvbiBDaGVja0VtYWlsKCkKCXsKCQkkZW1haWwgPSBpbXBsb2RlKCd8JywgJHRoaXMtPndpZGdldC0+Z2V0VmFsdWVzKCkpOwoJCWlmICghc2VsZjo6dmFsaWRFbWFpbCgkZW1haWwpKQoJCXsKCQkJZ2xvYmFsICRnQ21zOwoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCRnQ21zLT5tb2R1bGVzWydDTVNGb3JtcyddWydvYmplY3QnXS0+bGFuZygnaW52YWxpZCBlbWFpbCcsICRlbWFpbCkpOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCS8vIEV4dGVybmFsIGZ1bmN0aW9ucwoJLyoqCglWYWxpZGF0ZSBhbiBlbWFpbCBhZGRyZXNzLgoJUHJvdmlkZSBlbWFpbCBhZGRyZXNzIChyYXcgaW5wdXQpCglSZXR1cm5zIHRydWUgaWYgdGhlIGVtYWlsIGFkZHJlc3MgaGFzIHRoZSBlbWFpbCAKCWFkZHJlc3MgZm9ybWF0IGFuZCB0aGUgZG9tYWluIGV4aXN0cy4KCSovCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZhbGlkRW1haWwoJGVtYWlsKQoJewoJICAgJGlzVmFsaWQgPSB0cnVlOwoJICAgJGF0SW5kZXggPSBzdHJycG9zKCRlbWFpbCwgIkAiKTsKCSAgIGlmIChpc19ib29sKCRhdEluZGV4KSAmJiAhJGF0SW5kZXgpCgkgICB7CgkgICAgICAkaXNWYWxpZCA9IGZhbHNlOwoJICAgfQoJICAgZWxzZQoJICAgewoJICAgICAgJGRvbWFpbiA9IHN1YnN0cigkZW1haWwsICRhdEluZGV4KzEpOwoJICAgICAgJGxvY2FsID0gc3Vic3RyKCRlbWFpbCwgMCwgJGF0SW5kZXgpOwoJICAgICAgJGxvY2FsTGVuID0gc3RybGVuKCRsb2NhbCk7CgkgICAgICAkZG9tYWluTGVuID0gc3RybGVuKCRkb21haW4pOwoJICAgICAgaWYgKCRsb2NhbExlbiA8IDEgfHwgJGxvY2FsTGVuID4gNjQpCgkgICAgICB7CgkgICAgICAgICAvLyBsb2NhbCBwYXJ0IGxlbmd0aCBleGNlZWRlZAoJICAgICAgICAgJGlzVmFsaWQgPSBmYWxzZTsKCSAgICAgIH0KCSAgICAgIGVsc2UgaWYgKCRkb21haW5MZW4gPCAxIHx8ICRkb21haW5MZW4gPiAyNTUpCgkgICAgICB7CgkgICAgICAgICAvLyBkb21haW4gcGFydCBsZW5ndGggZXhjZWVkZWQKCSAgICAgICAgICRpc1ZhbGlkID0gZmFsc2U7CgkgICAgICB9CgkgICAgICBlbHNlIGlmICgkbG9jYWxbMF0gPT0gJy4nIHx8ICRsb2NhbFskbG9jYWxMZW4tMV0gPT0gJy4nKQoJICAgICAgewoJICAgICAgICAgLy8gbG9jYWwgcGFydCBzdGFydHMgb3IgZW5kcyB3aXRoICcuJwoJICAgICAgICAgJGlzVmFsaWQgPSBmYWxzZTsKCSAgICAgIH0KCSAgICAgIGVsc2UgaWYgKHByZWdfbWF0Y2goJy9cXC5cXC4vJywgJGxvY2FsKSkKCSAgICAgIHsKCSAgICAgICAgIC8vIGxvY2FsIHBhcnQgaGFzIHR3byBjb25zZWN1dGl2ZSBkb3RzCgkgICAgICAgICAkaXNWYWxpZCA9IGZhbHNlOwoJICAgICAgfQoJICAgICAgZWxzZSBpZiAoIXByZWdfbWF0Y2goJy9eW0EtWmEtejAtOVxcLVxcLl0rJC8nLCAkZG9tYWluKSkKCSAgICAgIHsKCSAgICAgICAgIC8vIGNoYXJhY3RlciBub3QgdmFsaWQgaW4gZG9tYWluIHBhcnQKCSAgICAgICAgICRpc1ZhbGlkID0gZmFsc2U7CgkgICAgICB9CgkgICAgICBlbHNlIGlmIChwcmVnX21hdGNoKCcvXFwuXFwuLycsICRkb21haW4pKQoJICAgICAgewoJICAgICAgICAgLy8gZG9tYWluIHBhcnQgaGFzIHR3byBjb25zZWN1dGl2ZSBkb3RzCgkgICAgICAgICAkaXNWYWxpZCA9IGZhbHNlOwoJICAgICAgfQoJICAgICAgZWxzZSBpZgoJKCFwcmVnX21hdGNoKCcvXihcXFxcLnxbQS1aYS16MC05ISMlJmBfPVxcLyRcJyorP157fXx+Li1dKSskLycsCgkgICAgICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCJcXFxcIiwiIiwkbG9jYWwpKSkKCSAgICAgIHsKCSAgICAgICAgIC8vIGNoYXJhY3RlciBub3QgdmFsaWQgaW4gbG9jYWwgcGFydCB1bmxlc3MgCgkgICAgICAgICAvLyBsb2NhbCBwYXJ0IGlzIHF1b3RlZAoJICAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcvXiIoXFxcXCJ8W14iXSkrIiQvJywKCSAgICAgICAgICAgICBzdHJfcmVwbGFjZSgiXFxcXCIsIiIsJGxvY2FsKSkpCgkgICAgICAgICB7CgkgICAgICAgICAgICAkaXNWYWxpZCA9IGZhbHNlOwoJICAgICAgICAgfQoJICAgICAgfQoJICAgICAgaWYgKCRpc1ZhbGlkICYmICEoY2hlY2tkbnNycigkZG9tYWluLCJNWCIpIHx8IAoJIGNoZWNrZG5zcnIoJGRvbWFpbiwiQSIpKSkKCSAgICAgIHsKCSAgICAgICAgIC8vIGRvbWFpbiBub3QgZm91bmQgaW4gRE5TCgkgICAgICAgICAkaXNWYWxpZCA9IGZhbHNlOwoJICAgICAgfQoJICAgfQoJICAgcmV0dXJuICRpc1ZhbGlkOwoJfQp9]]></data>
	</file>
	<file>
	  <filename>/lib/classes/CMSFormWidget.class.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCgkvKgoJCVRoaXMgY2xhc3MgYWltIHRvIGhhbmRsZSBDTVMgRm9ybXMgdmVyeSBkaWZmZXJlbnRseS4KCQkKCQlBdXRob3I6IEplYW4tQ2hyaXN0b3BoZSBDdXZlbGllciA8Y3liZXJ0b3RvcGhlQGdtYWlsLmNvbT4KCQlDb3B5cmlnaHRzOiBKZWFuLUNocmlzdG9waGUgQ3V2ZWxpZXIgLSBNb3JyaXMgJiBDaGFwbWFuIEJlbGdpdW0gLSAyMDEwCgkJTGljZW5jZTogR1BMCQkKCQoJKi8KCmNsYXNzIENNU0Zvcm1XaWRnZXQJZXh0ZW5kcyBDbXNPYmplY3QKewoJLy8gU2V0dGluZ3MKCXByb3RlY3RlZCAkaWQ7IC8vIFRoZSBmb3JtIElECglwcm90ZWN0ZWQgJG1vZHVsZV9uYW1lOwoJcHJvdGVjdGVkICRuYW1lOyAvLyBUaGUgaW5wdXQgbmFtZQoJcHJvdGVjdGVkICR0eXBlOwoJcHJvdGVjdGVkICRpbnB1dDsKCXByb3RlY3RlZCAkdmFsdWVzID0gYXJyYXkoKTsKCXByb3RlY3RlZCAkc2V0dGluZ3MgPSBhcnJheSgpOwoJcHJvdGVjdGVkICRmb3JtX2Vycm9yczsKCXByb3RlY3RlZCAkc2hvd19wcmlvcml0eSA9IGZhbHNlOwovLwlwcm90ZWN0ZWQgJHZhbGlkYXRpb25zID0gYXJyYXkoKTsKCXByb3RlY3RlZCAkc2hvd25lZCA9IGZhbHNlOwoJcHJvdGVjdGVkICRmb3JtOwoJCglwcm90ZWN0ZWQgJGlzX3ZhbGlkID0gdHJ1ZTsKCQoJcHVibGljIHN0YXRpYyAkZmllbGRzID0gYXJyYXkoCgkJJ3RleHQnIAkJCT0+IGFycmF5KCd0aXRsZScgPT4gJ1RleHQgZmllbGQnLCAnYWRvJyA9PiAnQygyNTUpJyksCgkJJ3RleHRhcmVhJyAJPT4gYXJyYXkoJ3RpdGxlJyA9PiAnVGV4dCBhcmVhJywgCSdhZG8nID0+ICdYTCcpLAoJCSdjaGVja2JveCcgCT0+IGFycmF5KCd0aXRsZScgPT4gJ0NoZWNrYm94JywgCSdhZG8nID0+ICdJJyksCgkJJ3NlbGVjdCcgCQk9PiBhcnJheSgndGl0bGUnID0+ICdTZWxlY3QnLCAJCSdhZG8nID0+ICdDKDI1NSknKSwKCQkncGFzc3dvcmQnICA9PiBhcnJheSgndGl0bGUnID0+ICdQYXNzd29yZCcsIAknYWRvJyA9PiAnQygyNTUpJyksCgkJJ2RhdGUnIAkJCT0+IGFycmF5KCd0aXRsZScgPT4gJ0RhdGUnLCAJCQknYWRvJyA9PiAnRFQnKSwKCQkndGltZScgCQkJPT4gYXJyYXkoJ3RpdGxlJyA9PiAnVGltZScsIAkJCSdhZG8nID0+ICdEVCcpLAoJCSdmaWxlJyAJCQk9PiBhcnJheSgndGl0bGUnID0+ICdGaWxlJywgCQkJJ2FkbycgPT4gJ0MoMjU1KScpCgkJKTsKCQoJcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCYkZm9ybSwgJGlkLCAkbW9kdWxlX25hbWUsICRuYW1lLCAkdHlwZSwkc2V0dGluZ3M9YXJyYXkoKSkKCXsKCQkkdGhpcy0+Zm9ybSA9ICYkZm9ybTsKCQkkdGhpcy0+aWQgPSAkaWQ7CgkJJHRoaXMtPm1vZHVsZV9uYW1lID0gJG1vZHVsZV9uYW1lOwoJCSR0aGlzLT5uYW1lID0gaXNzZXQoJHNldHRpbmdzWyduYW1lJ10pPyRzZXR0aW5nc1snbmFtZSddOiRuYW1lOwoJCSR0aGlzLT50eXBlID0gJHR5cGU7CgkJJHRoaXMtPnNldHRpbmdzID0gJHNldHRpbmdzOwoJCSR0aGlzLT5pbml0KCk7Cgl9CgkKCS8vIFNFVFVQCgkKCS8vIEZJTEwKCQoJcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXQoKQoJewoJCSR0aGlzLT5pbml0VmFsdWVzKCk7Cgl9CgkKCQlwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdFZhbHVlcygpCgkJewkKCQkJZ2xvYmFsICRnQ21zOwoJCQlzd2l0Y2goJHRoaXMtPnR5cGUpCgkJCXsKCQkJCWNhc2UgJ2NoZWNrYm94JzoKCQkJCQlpZigKCQkJCQkJIWlzc2V0KCRfUkVRVUVTVFskdGhpcy0+aWQuJHRoaXMtPm5hbWVdKQoJCQkJCQkmJgoJCQkJCQkoCgkJCQkJCQlpc3NldCgkX1JFUVVFU1RbJHRoaXMtPmlkLidzdWJtaXQnXSkKCQkJCQkJCXx8CgkJCQkJCQlpc3NldCgkX1JFUVVFU1RbJHRoaXMtPmlkLidhcHBseSddKQoJCQkJCQkpCgoJCQkJCSkKCQkJCQl7CgkJCQkJCS8vIENhc2Ugd2hlbiBjaGVja2JveCBpcyB1bmNoZWNrZWQgYW5kIGZvcm0gaXMgc3VibWl0dGVkLCB3ZSBzaG91bGQgZW1wdHkgdGhlIHZhbHVlCgkJCQkJCSR0aGlzLT5zZXRWYWx1ZXMoKTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJZGVmYXVsdDoKCQkJCQlpZiAoaXNzZXQoJF9SRVFVRVNUWyR0aGlzLT5pZC4kdGhpcy0+bmFtZV0pKQoJCQkJCXsKCQkJCQkJaWYgKGlzX2FycmF5KCRfUkVRVUVTVFskdGhpcy0+aWQuJHRoaXMtPm5hbWVdKSkKCQkJCQkJewoJCQkJCQkJJHRoaXMtPnNldFZhbHVlcygkX1JFUVVFU1RbJHRoaXMtPmlkLiR0aGlzLT5uYW1lXSk7CgkJCQkJCX0gCgkJCQkJCWVsc2UKCQkJCQkJewoJCQkJCQkJJHRoaXMtPnNldFZhbHVlcyhodG1sX2VudGl0eV9kZWNvZGUoJF9SRVFVRVNUWyR0aGlzLT5pZC4kdGhpcy0+bmFtZV0pKTsKCQkJCQkJfQoJCQkJCX0KCQkJCQllbHNlaWYoaXNzZXQoJHRoaXMtPnNldHRpbmdzWyd2YWx1ZSddKSkKCQkJCQl7CgkJCQkJCSR0aGlzLT5zZXRWYWx1ZXMoJHRoaXMtPnNldHRpbmdzWyd2YWx1ZSddKTsKCQkJCQl9CgkJCQkJZWxzZWlmKAoJCQkJCQlpc3NldCgkdGhpcy0+c2V0dGluZ3NbJ29iamVjdCddKSAmJiAhaXNzZXQoJF9SRVFVRVNUWyR0aGlzLT5pZC4nc3VibWl0J10pICYmICFpc3NldCgkX1JFUVVFU1RbJHRoaXMtPmlkLidhcHBseSddKSkKCQkJCQl7CgkJCQkJCSR0aGlzLT5zZXRWYWx1ZXMoJHRoaXMtPmZldGNoVmFsdWVzKCkpOwoJCQkJCX0KCQkJCQllbHNlaWYoaXNzZXQoJHRoaXMtPnNldHRpbmdzWydwcmVmZXJlbmNlJ10pICYmICRnQ21zLT5tb2R1bGVzWyR0aGlzLT5tb2R1bGVfbmFtZV1bJ29iamVjdCddLT5nZXRQcmVmZXJlbmNlKCR0aGlzLT5zZXR0aW5nc1sncHJlZmVyZW5jZSddKSAhPSAnJykKCQkJCQl7CgkJCQkJCSR0aGlzLT5zZXRWYWx1ZXMoJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10tPmdldFByZWZlcmVuY2UoJHRoaXMtPnNldHRpbmdzWydwcmVmZXJlbmNlJ10pKTsKCQkJCQl9CgoJCQkJCWlmKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1snZGVmYXVsdF92YWx1ZSddKSAmJiAhJHRoaXMtPmZvcm0tPmlzUG9zdGVkKCkpIAoJCQkJCXsKCQkJCQkJaWYgKCR0aGlzLT5pc0VtcHR5KCkpCgkJCQkJCXsKCQkJCQkJCSR0aGlzLT5zZXRWYWx1ZXMoJHRoaXMtPnNldHRpbmdzWydkZWZhdWx0X3ZhbHVlJ10pOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQl9CgkJfQoKCgoJCXByb3RlY3RlZCBmdW5jdGlvbiBmZXRjaFZhbHVlcygpCgkJewoJCQlpZihpc3NldCgkdGhpcy0+c2V0dGluZ3NbJ29iamVjdCddKSAmJiBpc19vYmplY3QoJHRoaXMtPnNldHRpbmdzWydvYmplY3QnXSkpCgkJCXsKCQkJCWlmIChpc3NldCgkdGhpcy0+c2V0dGluZ3NbJ2dldF9tZXRob2QnXSkpCgkJCQl7CgkJCQkJcmV0dXJuICR0aGlzLT5zZXR0aW5nc1snb2JqZWN0J10tPnskdGhpcy0+c2V0dGluZ3NbJ2dldF9tZXRob2QnXX0oKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkbmFtZSA9IGlzc2V0KCR0aGlzLT5zZXR0aW5nc1snZmllbGRfbmFtZSddKT8kdGhpcy0+c2V0dGluZ3NbJ2ZpZWxkX25hbWUnXTokdGhpcy0+bmFtZTsKCQkKCQkJCQlpZihtZXRob2RfZXhpc3RzKCR0aGlzLT5zZXR0aW5nc1snb2JqZWN0J10sICdnZXQnKSkKCQkJCQl7CgkJCQkJCXJldHVybiAkdGhpcy0+c2V0dGluZ3NbJ29iamVjdCddLT5nZXQoJG5hbWUpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQkJdHJ5CgkJCQkJCQl7CgkJCQkJCQkJcmV0dXJuICR0aGlzLT5zZXR0aW5nc1snb2JqZWN0J10tPiRuYW1lOwoJCQkJCQkJfQoJCQkJCQkJY2F0Y2goRXhjZXB0aW9uICRlKQoJCQkJCQkJewoJCQkJCQkJLy8JZGllKCd1bmFibGUgdG8gZG8nKTsgLy8gVE9ETzogVHJlYXRoIGVycm9yCgkJCQkJCQl9CgkJCQkJfQoJCQkJfQkJCQoJCQl9CgkJfQoJCgkvLyBSRU5ERVIKCQoJcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQoJewoJCS8vIFRPRE86IFJFRkFDVE9SSU5HCgkJaWYgKCR0aGlzLT50eXBlID09ICdoaWRkZW4nKQoJCXsKCQkJcmV0dXJuICR0aGlzLT5nZXRJbnB1dCgpOwoJCX0KCQllbHNlCgkJewoJCQkkaHRtbCA9ICcKCQkJPGRpdiBjbGFzcz0iZm9ybV93aWRnZXQiPgoJCQkJPGRpdiBjbGFzcz0iZm9ybV9sYWJlbCI+PGxhYmVsIGZvcj0iJy4kdGhpcy0+aWQuJHRoaXMtPm5hbWUuJyI+Jy4kdGhpcy0+Z2V0TGFiZWwoKS4nPC9sYWJlbD48L2Rpdj4nOwkJCQkJCQoJCQlpZiAoY291bnQoJHRoaXMtPmZvcm1fZXJyb3JzKSkKCQkJewoJCQkJJGh0bWwgLj0gJzxkaXYgY2xhc3M9ImZvcm1fZXJyb3JzIj4nIC4gJHRoaXMtPnNob3dFcnJvcnMoKSAuICc8L2Rpdj4nOwoJCQl9CQkJCQoJCQkkaHRtbCAuPSAnCgkJCQk8ZGl2IGNsYXNzPSJmb3JtX2lucHV0Ij4nLiR0aGlzLT5nZXRJbnB1dCgpLic8L2Rpdj4KCQkJPC9kaXY+JzsKCQkJcmV0dXJuICRodG1sOwoJCX0KCX0KCQoJcHVibGljIGZ1bmN0aW9uIHNob3coJHRlbXBsYXRlID0gbnVsbCwgJGZvcmNlID0gZmFsc2UpCgl7CgkJLy8gVE9ETzogUkVGQUNUT1JJTkcKCQkKCQlpZiAoISR0aGlzLT5zaG93bmVkIHx8ICRmb3JjZSkKCQl7CgkJCSRodG1sID0gJyc7CgkJCWlmICghaXNfbnVsbCgkdGVtcGxhdGUpKQoJCQl7CgkJCQkkdGV4dCA9IHN0cl9yZXBsYWNlKCclTEFCRUwlJywgJHRoaXMtPmdldExhYmVsKCksICR0ZW1wbGF0ZSk7CgkJCQkkdGV4dCA9IHN0cl9yZXBsYWNlKCclSU5QVVQlJywgJHRoaXMtPmdldElucHV0KCksICR0ZXh0KTsKCQkJCSR0ZXh0ID0gc3RyX3JlcGxhY2UoJyVFUlJPUlMlJywgJHRoaXMtPnNob3dFcnJvcnMoKSwgJHRleHQpOwoJCQkJJHRleHQgPSBzdHJfcmVwbGFjZSgnJVRJUFMlJywgJHRoaXMtPmdldFRpcHMoKSwgJHRleHQpOwoJCQkJJGh0bWwgLj0gJHRleHQ7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkaHRtbCAuPSAkdGhpczsJCQkJCgkJCX0JCQoJCQkkdGhpcy0+c2hvd25lZCA9IHRydWU7CgkJCXJldHVybiAkaHRtbDsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkKCXsKCQlyZXR1cm4gJHRoaXMtPm5hbWU7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtKCkKCXsKCQlpZighaXNfb2JqZWN0KCR0aGlzLT5mb3JtKSkKCQl7CgkJCXRocm93IG5ldyBFeGNlcHRpb24oJ0FuIGVycm9yIG9jY3VyZWQgcmV0cmlldmluZyB0aGUgZm9ybSBvYmplY3QuJyk7CgkJfQoJCXJldHVybiAkdGhpcy0+Zm9ybTsKCX0KCQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0RnJpZW5kbHlOYW1lKCkKCXsKCQlpZiAoaXNzZXQoJHRoaXMtPnNldHRpbmdzWydsYWJlbCddKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2V0dGluZ3NbJ2xhYmVsJ107CgkJfQoJCS8vIFRyeSB0byBnZXQgaXQgZnJvbSBsYW5ndWFnZSBmaWxlCgkJZ2xvYmFsICRnQ21zOwoJCWlmIChpc3NldCgkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXSkpCgkJewoJCQlyZXR1cm4gJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10tPmxhbmcoJ2Zvcm1fJy4kdGhpcy0+bmFtZSk7CgkJfQoJCXJldHVybiBudWxsOwoJfQoJCQoJcHVibGljIGZ1bmN0aW9uIGdldExhYmVsKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmdldEZyaWVuZGx5TmFtZSgpOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0VGlwcygpCgl7CgkJaWYgKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1sndGlwcyddKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+c2V0dGluZ3NbJ3RpcHMnXTsKCQl9CgkJLy8gVHJ5IHRvIGdldCBpdCBmcm9tIGxhbmd1YWdlIGZpbGUKCQlnbG9iYWwgJGdDbXM7CgkJaWYgKGlzc2V0KCRnQ21zLT5tb2R1bGVzWyR0aGlzLT5tb2R1bGVfbmFtZV1bJ29iamVjdCddKSkKCQl7CgkJCS8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIHNob3duIG9ubHkgaXQgdGhlIGxhbmcga2V5IGV4aXN0cy4uLgoJCQkvL3JldHVybiAkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+bGFuZygndGlwc18nLiR0aGlzLT5uYW1lKTsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dCgpCgl7CQoJCWlmICghZW1wdHkoJHRoaXMtPmlucHV0KSkKCQl7CgkJCXJldHVybiAkdGhpcy0+aW5wdXQ7CgkJfQoJCQoJCWdsb2JhbCAkZ0NtczsKCQlpZiAoaXNzZXQoJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10pKQoJCXsKCQkJc3dpdGNoKCR0aGlzLT50eXBlKQoJCQl7CgkJCQljYXNlICd0ZXh0JzoKCQkJCQlyZXR1cm4gJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10tPkNyZWF0ZUlucHV0VGV4dCgkdGhpcy0+aWQsICR0aGlzLT5uYW1lLCAkdGhpcy0+Z2V0VmFsdWUoKSwgaXNzZXQoJHRoaXMtPnNldHRpbmdzWydzaXplJ10pPyR0aGlzLT5zZXR0aW5nc1snc2l6ZSddOjgwKTsJCQkJCgkJCQljYXNlICdoaWRkZW4nOgoJCQkJCXJldHVybiAkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+Q3JlYXRlSW5wdXRIaWRkZW4oJHRoaXMtPmlkLCAkdGhpcy0+bmFtZSwgJHRoaXMtPmdldFZhbHVlKCkpOwoJCQkJY2FzZSAnc2VsZWN0JzoKCQkJCQlpZihpc3NldCgkdGhpcy0+c2V0dGluZ3NbJ2V4cGFuZGVkJ10pICYmICR0aGlzLT5zZXR0aW5nc1snZXhwYW5kZWQnXSA9PSB0cnVlKQoJCQkJCXsKCQkJCQkJcmV0dXJuIHNlbGY6OkNyZWF0ZUlucHV0RXhwYW5kZWRMaXN0KCR0aGlzLT5pZCwgJHRoaXMtPm5hbWUsIGlzc2V0KCR0aGlzLT5zZXR0aW5nc1sndmFsdWVzJ10pPyR0aGlzLT5zZXR0aW5nc1sndmFsdWVzJ106YXJyYXkoKSwgJHRoaXMtPmdldFZhbHVlcygpLCAnJywgaXNzZXQoJHRoaXMtPnNldHRpbmdzWydtdWx0aXBsZSddKT90cnVlOmZhbHNlLCAkdGhpcy0+c2V0dGluZ3MpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlyZXR1cm4gc2VsZjo6Q3JlYXRlSW5wdXRTZWxlY3RMaXN0KCR0aGlzLT5pZCwgJHRoaXMtPm5hbWUsIGlzc2V0KCR0aGlzLT5zZXR0aW5nc1sndmFsdWVzJ10pPyR0aGlzLT5zZXR0aW5nc1sndmFsdWVzJ106YXJyYXkoKSwgJHRoaXMtPmdldFZhbHVlcygpLCBpc3NldCgkdGhpcy0+c2V0dGluZ3NbJ3NpemUnXSk/JHRoaXMtPnNldHRpbmdzWydzaXplJ106MSwgJycsIGlzc2V0KCR0aGlzLT5zZXR0aW5nc1snbXVsdGlwbGUnXSk/dHJ1ZTpmYWxzZSk7CgkJCQkJfQoJCQkJCQoJCQkJY2FzZSAnY2hlY2tib3gnOgoJCQkJCXJldHVybiAkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+Q3JlYXRlSW5wdXRDaGVja2JveCgkdGhpcy0+aWQsICR0aGlzLT5uYW1lLCAnMScsIChpbnRlZ2VyKSR0aGlzLT5nZXRWYWx1ZSgpKTsKCQkJCWNhc2UgJ3RleHRhcmVhJzoKCQkJCQlpZiAoaXNzZXQoJHRoaXMtPnNldHRpbmdzWydzaG93X3d5c2l3eWcnXSkgJiYgJHRoaXMtPnNldHRpbmdzWydzaG93X3d5c2l3eWcnXSA9PSB0cnVlKQoJCQkJCXsKCQkJCQkJcmV0dXJuICRnQ21zLT5tb2R1bGVzWyR0aGlzLT5tb2R1bGVfbmFtZV1bJ29iamVjdCddLT5DcmVhdGVUZXh0QXJlYSh0cnVlLCAkdGhpcy0+aWQsICR0aGlzLT5nZXRWYWx1ZSgpLCAkdGhpcy0+bmFtZSk7CQkJCQkJCgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXJldHVybiAkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+Q3JlYXRlVGV4dEFyZWEoZmFsc2UsICR0aGlzLT5pZCwgJHRoaXMtPmdldFZhbHVlKCksICR0aGlzLT5uYW1lKTsKCQkJCQl9CgkJCQljYXNlICdjb2RlYXJlYSc6CgkJCQkJcmV0dXJuICRnQ21zLT5tb2R1bGVzWyR0aGlzLT5tb2R1bGVfbmFtZV1bJ29iamVjdCddLT5DcmVhdGVUZXh0QXJlYSh0cnVlLCAkdGhpcy0+aWQsICR0aGlzLT5nZXRWYWx1ZSgpLCAkdGhpcy0+bmFtZSwncGFnZWJpZ3RleHRhcmVhJywgJycsJycsICcnLCA5MCwgMTUsICdFZGl0QXJlYScpOwoJCQkJY2FzZSAndGltZSc6CgkJCQkJcmV0dXJuIHNlbGY6OkNyZWF0ZVRpbWVTZWxlY3QoJHRoaXMtPmlkLCR0aGlzLT5uYW1lLCR0aGlzLT5nZXRWYWx1ZXMoKSk7CgkJCQljYXNlICdkYXRlJzoKCQkJCQlyZXR1cm4gc2VsZjo6Q3JlYXRlRGF0ZVNlbGVjdCgkdGhpcy0+aWQsJHRoaXMtPm5hbWUsJHRoaXMtPmdldFZhbHVlcygpLCAkdGhpcy0+c2V0dGluZ3MpOwoJCQkJY2FzZSAncGFnZXMnOgoJCQkJCXJldHVybiAkZ0Ntcy0+R2V0Q29udGVudE9wZXJhdGlvbnMoKS0+Q3JlYXRlSGllcmFyY2h5RHJvcGRvd24oJycsICR0aGlzLT5nZXRWYWx1ZSgpLCAkdGhpcy0+aWQgLiAkdGhpcy0+bmFtZSk7CgkJCQkJCS8vJHRoaXMtPmdldFByZWZlcmVuY2UoJ2RlZmF1bHRfcGFnZScsKQoJCQkJY2FzZSAnc3RhdGljJzoKCQkJCQlyZXR1cm4gJHRoaXMtPmdldFZhbHVlKCk7CgkJCQljYXNlICdmaWxlJzoKCQkJCQlyZXR1cm4gJHRoaXMtPmdldFVwbG9hZEZpZWxkKCk7CgkJCQljYXNlICdwYXNzd29yZCc6CgkJCQkJcmV0dXJuICRnQ21zLT5tb2R1bGVzWyR0aGlzLT5tb2R1bGVfbmFtZV1bJ29iamVjdCddLT5DcmVhdGVJbnB1dFBhc3N3b3JkKCR0aGlzLT5pZCwgJHRoaXMtPm5hbWUsICR0aGlzLT5nZXRWYWx1ZSgpCgkJCQkJLGlzc2V0KCR0aGlzLT5zZXR0aW5nc1snc2l6ZSddKT8kdGhpcy0+c2V0dGluZ3NbJ3NpemUnXToyMCk7CgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBudWxsOwoJCQl9CgkJfQoJCXJldHVybiBudWxsOwoJCQoJfQoJCgkvLyBQUk9DRVNTCgkKCXB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzKCRzYXZlID0gdHJ1ZSkKCXsKCQkvLyBWYWxpZGF0ZQoJCSR0aGlzLT52YWxpZGF0ZSgpOwoJCQoJCS8vIFNhdmUgdmFsdWVzCgkJaWYgKCRzYXZlID09IHRydWUpCgkJewoJCQkkdGhpcy0+c2F2ZSgpOwoJCX0KCX0KCQoJLy8gVkFMSURBVElPTgoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGUoKQoJewoJCWlmIChpc3NldCgkdGhpcy0+c2V0dGluZ3NbJ3ZhbGlkYXRvcnMnXSkgJiYgaXNfYXJyYXkoJHRoaXMtPnNldHRpbmdzWyd2YWxpZGF0b3JzJ10pKQoJCXsKCQkJLy92YXJfZHVtcCgkdGhpcy0+c2V0dGluZ3NbJ3ZhbGlkYXRvcnMnXSk7CgkJCS8vIENIQU5HRSBUSEFUCgkJCQoJCQlmb3JlYWNoICgkdGhpcy0+c2V0dGluZ3NbJ3ZhbGlkYXRvcnMnXSBhcyAkdmFsaWRhdG9yID0+ICR2YWx1ZSkKCQkJewoJCQkJJHZhbGlkYXRlID0gbmV3IENNU0Zvcm1WYWxpZGF0b3IoJiR0aGlzLCR2YWxpZGF0b3IsJHZhbHVlKTsKCQkJCXRyeQoJCQkJewoJCQkJCWlmKCR2YWxpZGF0ZS0+Y2hlY2soKSA9PT0gZmFsc2UpICR0aGlzLT5pc192YWxpZCA9IGZhbHNlOwoJCQkJfQoJCQkJY2F0Y2goRXhjZXB0aW9uICRlKQoJCQkJewoJCQkJCSR0aGlzLT5zZXRFcnJvcigkZS0+Z2V0TWVzc2FnZSgpLCAnZm9ybSBlcnJvcicpOwoJCQkJfQoJCQkJCgkJCX0KCQl9Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBpc1ZhbGlkKCkKCXsKCQlpZiAoKCR0aGlzLT5pc192YWxpZCA9PSBmYWxzZSApIHx8ICR0aGlzLT5oYXNFcnJvcnMoKSkKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIHRydWU7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBhZGRWYWxpZGF0b3IoJHZhbGlkYXRvciwgJHBhcmFtcyA9IGFycmF5KCkpCgl7CgkJJHRoaXMtPnNldHRpbmdzWyd2YWxpZGF0b3JzJ11bJHZhbGlkYXRvcl0gPSAkcGFyYW1zOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlVmFsaWRhdG9yKCR2YWxpZGF0b3IpCgl7CgkJdW5zZXQoJHRoaXMtPnNldHRpbmdzWyd2YWxpZGF0b3JzJ11bJHZhbGlkYXRvcl0pOwoJfQoJCgkvLyBTQVZFCgkKCXByb3RlY3RlZCBmdW5jdGlvbiBzYXZlKCkKCXsKCQlpZigkdGhpcy0+aXNWYWxpZCgpID09IHRydWUpCgkJewoJCQlpZiAoaXNzZXQoJHRoaXMtPnNldHRpbmdzWydvYmplY3QnXSkpCgkJCXsKCQkJCSR0aGlzLT5zYXZlT2JqZWN0KCk7CgkJCX0KCQkJaWYgKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1sncHJlZmVyZW5jZSddKSkKCQkJewoJCQkJJHRoaXMtPnNhdmVQcmVmZXJlbmNlKCk7CgkJCX0KCQl9Cgl9CgkKCXByb3RlY3RlZCBmdW5jdGlvbiBzYXZlT2JqZWN0KCkKCXsKCQlpZihpc19vYmplY3QoJHRoaXMtPnNldHRpbmdzWydvYmplY3QnXSkgJiYgJHRoaXMtPnR5cGUgIT0gJ2ZpbGUnKQoJCXsKCQkJLy8gVGhpcyBkbyBub3Qgc2F2ZSB0aGUgb2JqZWN0IHN0YXRlLCBzbyB3ZSBoYXZlIHRvIGRvIGl0IG91dHNpZGUgdGhlIGZvcm0KCgkJCWlmICgkdGhpcy0+dHlwZSA9PSAnZGF0ZScpCgkJCXsKCQkJCS8vJHZhbHVlcyA9ICR0aGlzLT52YWx1ZXM7IEFsd2F5cyBzYXZlIGl0IGFzIGEgc3RyaW5nCgkJCQlpZiAoY291bnQoJHRoaXMtPnZhbHVlcykgPiAxKQoJCQkJewkJCQkJCgkJCQkJJHZhbHVlcyA9ICR0aGlzLT52YWx1ZXNbJzAnXSAuICctJyAuICR0aGlzLT52YWx1ZXNbJzEnXSAuICctJyAuICR0aGlzLT52YWx1ZXNbJzInXTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQkkdmFsdWVzID0gJHRoaXMtPmdldFZhbHVlKCk7CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdmFsdWVzID0gJHRoaXMtPmdldFZhbHVlKCk7CgkJCX0JCQoJCQoJCQlpZiAoaXNzZXQoJHRoaXMtPnNldHRpbmdzWydzZXRfbWV0aG9kJ10pKQoJCQl7CgkJCQkkdGhpcy0+c2V0dGluZ3NbJ29iamVjdCddLT57JHRoaXMtPnNldHRpbmdzWydzZXRfbWV0aG9kJ119KCR2YWx1ZXMpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaWYgKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1snZmllbGRfbmFtZSddKSkKCQkJCXsKCQkJCQkkbmFtZSA9ICR0aGlzLT5zZXR0aW5nc1snZmllbGRfbmFtZSddOwoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCSRuYW1lID0gJHRoaXMtPm5hbWU7CgkJCQl9CgkJCQkKCQkJCWlmKG1ldGhvZF9leGlzdHMoJHRoaXMtPnNldHRpbmdzWydvYmplY3QnXSwgJ3NldCcpKQoJCQkJewkJCgkJCQkJJHRoaXMtPnNldHRpbmdzWydvYmplY3QnXS0+c2V0KCRuYW1lLCAkdmFsdWVzKTsKCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQl0cnkKCQkJCQl7CgkJCQkJCSR0aGlzLT5zZXR0aW5nc1snb2JqZWN0J10tPiRuYW1lID0gJHZhbHVlczsKCQkJCQl9CgkJCQkJY2F0Y2goRXhjZXB0aW9uICRlKQoJCQkJCXsKCQkJCQkJZGllKCd1bmFibGUgdG8gZG8nKTsKCQkJCQl9CgkJCQl9CgkJCQkKCQkJCQoJCQl9CgkJfQoJfQoJCglwcm90ZWN0ZWQgZnVuY3Rpb24gc2F2ZVByZWZlcmVuY2UoKQoJewoJCWlmKGlzc2V0KCR0aGlzLT5zZXR0aW5nc1sncHJlZmVyZW5jZSddKSAmJiAhaXNzZXQoJF9SRVFVRVNUWyR0aGlzLT5pZC4nY2FuY2VsJ10pKQoJCXsKCQkJLy8gQ2hlY2sgaWYgdGhlcmUgaXMgbm8gY2FuY2VsIGJ1dHRvbiBmaXJzdCBiZWNhdXNlIHdlIHNhdmUgdGhlIHZhbHVlIGRpcmVjdGx5ICEKCQkJZ2xvYmFsICRnQ21zOwoJCQkkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+c2V0UHJlZmVyZW5jZSgkdGhpcy0+c2V0dGluZ3NbJ3ByZWZlcmVuY2UnXSwgJHRoaXMtPmdldFZhbHVlKCkpOwoJCX0KCX0KCQoJLy8gQUNDRVNTCgkKCXB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZSgpCgl7CgkJaWYgKCgkdGhpcy0+dHlwZSA9PSAnZGF0ZScpICYmICAoY291bnQoJHRoaXMtPnZhbHVlcykgPiAxKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+dmFsdWVzWycwJ10gLiAnLScgLiAkdGhpcy0+dmFsdWVzWycxJ10gLiAnLScgLiAkdGhpcy0+dmFsdWVzWycyJ107CgkJfQoJCWVsc2VpZiAoY291bnQoJHRoaXMtPnZhbHVlcykgPT0gMSkKCQl7CgkJCXJlc2V0KCR0aGlzLT52YWx1ZXMpOwoJCQlyZXR1cm4gKHN0cmluZykgY3VycmVudCgkdGhpcy0+dmFsdWVzKTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIChzdHJpbmcpIGltcGxvZGUoJ3x8fCcsJHRoaXMtPnZhbHVlcyk7CgkJfQkJCgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBzZXRWYWx1ZSgkdmFsdWUsICRrZXkgPSAwKQoJewoJCSR0aGlzLT52YWx1ZXNbJGtleV0gPSAoc3RyaW5nKSR2YWx1ZTsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlcygpCgl7CgkJcmV0dXJuICR0aGlzLT52YWx1ZXM7Cgl9CgkKCXB1YmxpYyBmdW5jdGlvbiBzZXRWYWx1ZXMoJHZhbHVlcyA9IGFycmF5KCkpCgl7CgkJaWYgKGlzX2FycmF5KCR2YWx1ZXMpKQoJCXsKCQkJJHRoaXMtPnZhbHVlcyA9ICR2YWx1ZXM7CgkJfQoJCWVsc2VpZiAoc3RycG9zKCR2YWx1ZXMsICd8fHwnKSAhPT0gZmFsc2UpCgkJewoJCQkkdGhpcy0+dmFsdWVzID0gZXhwbG9kZSgnfHx8JywgJHZhbHVlcyk7CgkJfQoJCWVsc2UKCQl7CgkJCSR0aGlzLT52YWx1ZXNbMF0gPSAkdmFsdWVzOwoJCX0JCQoJfQkKCQoJcHVibGljIGZ1bmN0aW9uIHNldERlZmF1bHRWYWx1ZXMoJHZhbHVlcykKCXsKCQlpZiAoaXNfYXJyYXkoJHZhbHVlcykpCgkJewoJCQkkdGhpcy0+dmFsdWVzID0gJHZhbHVlczsKCQl9CgkJZWxzZQoJCXsKCQkJJHRoaXMtPnZhbHVlcyA9IGFycmF5KCR2YWx1ZXMpOwoJCX0KCX0KCQkKCXB1YmxpYyBmdW5jdGlvbiBpc0VtcHR5KCkKCXsKCQlpZiAoKGNvdW50KCR0aGlzLT52YWx1ZXMpID09IDEpICYmIChlbXB0eSgkdGhpcy0+dmFsdWVzWzBdKSkgfHwgKGNvdW50KCR0aGlzLT52YWx1ZXMpID09IDApKQoJCQlyZXR1cm4gdHJ1ZTsKCQkJcmV0dXJuIGZhbHNlOwoJfQoJCQoJcHVibGljIGZ1bmN0aW9uIGdldFN0cmluZ1ZhbHVlKCkKCXsKCQkvL0RFUFJFQ0FURUQKCQlyZXR1cm4gJHRoaXMtPmdldFZhbHVlKCk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlc1RvU3RyaW5nKCkKCXsKCQkvLyBERVBSRUNBVEVECgkJcmV0dXJuIChzdHJpbmcpJHRoaXMtPmdldFZhbHVlKCk7Cgl9CgkKCQoJcHVibGljIGZ1bmN0aW9uIGlzRW1wdHlWYWx1ZXMoKQoJewoJCS8vREVQUkVDQVRFRAoJCQoJCWlmIChpc19hcnJheSgkdGhpcy0+dmFsdWVzKSkKCQl7CgkJCXJldHVybiAkdGhpcy0+aXNFbXB0eSgpOwoJCX0KCQllbHNlaWYoZW1wdHkoJHRoaXMtPnZhbHVlcykpCgkJewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoJCgkKCS8vIERJVkVSUwoJCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZpZWxkc0xpc3QoKQoJewoJCSRsaXN0ID0gYXJyYXkoKTsKCQlmb3JlYWNoKHNlbGY6OiRmaWVsZHMgYXMgJHR5cGUgPT4gJGZpZWxkKQoJCXsKCQkJJGxpc3RbJHR5cGVdID0gJGZpZWxkWyd0aXRsZSddOwoJCX0KCQlyZXR1cm4gJGxpc3Q7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QWRvVHlwZSgkdHlwZSkKCXsKCQlpZiAoaXNzZXQoc2VsZjo6JGZpZWxkc1skdHlwZV1bJ2FkbyddKSkKCQl7CgkJCXJldHVybiBzZWxmOjokZmllbGRzWyR0eXBlXVsnYWRvJ107CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiAnQygyNTUpJzsgLy8gQmV0dGVyIHRoYW4gbm90aGluZy4uLgoJCX0KCX0KCQkJCQoJcHVibGljIGZ1bmN0aW9uIGdldFVwbG9hZEZpZWxkKCkKCXsKCQlnbG9iYWwgJGdDbXM7CgkJJGZpZWxkID0gJGdDbXMtPm1vZHVsZXNbJHRoaXMtPm1vZHVsZV9uYW1lXVsnb2JqZWN0J10tPkNyZWF0ZUlucHV0RmlsZSgkdGhpcy0+aWQsICR0aGlzLT5uYW1lLCAnJywgaXNzZXQoJHRoaXMtPnNldHRpbmdzWydzaXplJ10pPyR0aGlzLT5zZXR0aW5nc1snc2l6ZSddOjMwKTsKCQkkaG1sID0gJzxzcGFuPic7CgkJaWYgKGNvdW50KCR0aGlzLT52YWx1ZXMpKQoJCXsKCQkJJGZpbGVfdXJsID0gaXNzZXQoJHRoaXMtPnNldHRpbmdzWydiYXNlX3VybCddKT8kdGhpcy0+c2V0dGluZ3NbJ2Jhc2VfdXJsJ106Jyc7CgkJCWlmICgoc3Vic3RyKCRmaWxlX3VybCwgLTEpICE9ICcvJykgJiYgKHN1YnN0cigkdGhpcy0+dmFsdWVzWzBdLDAsMSkgIT0gJy8nKSkgJGZpbGVfdXJsIC4nLyc7CgkJCSRmaWxlX3VybCAuPSAkdGhpcy0+dmFsdWVzWzBdOwoJCQkKCQkJaWYgKHNlbGY6OmlzSW1hZ2UoJHRoaXMtPnZhbHVlc1swXSkpCgkJCXsKCQkJCSR0ZXh0ID0gJzxpbWcgc3JjPSInLiRmaWxlX3VybC4nIiAvPic7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGV4dCA9IGJhc2VuYW1lKCR0aGlzLT52YWx1ZXNbMF0pOwoJCQl9CgkJCQoJCQkkaHRtbCAuPSAnPHNwYW4gc3R5bGU9ImRpc3BsYXk6YmxvY2s7IG1hcmdpbi1ib3R0b206IDdweDsiPjxhIGhyZWY9IicuJGZpbGVfdXJsLiAnIiByZWw9ImV4dGVybmFsIiA+Jy4gJHRleHQgLic8L2E+PC9zcGFuPiAnOwoJCX0KCQkKCQlpZiAoaXNzZXQoJHRoaXMtPnNldHRpbmdzWydkZWxldGVfY2hlY2tib3gnXSkpCgkJewoJCQkkZmllbGQgLj0gJyAnIC4gICRnQ21zLT5tb2R1bGVzWyR0aGlzLT5tb2R1bGVfbmFtZV1bJ29iamVjdCddLT5DcmVhdGVJbnB1dENoZWNrYm94KCR0aGlzLT5pZCwgJHRoaXMtPnNldHRpbmdzWydkZWxldGVfY2hlY2tib3gnXSwgJzEnKSAuICcgJyAuICAkZ0Ntcy0+bW9kdWxlc1skdGhpcy0+bW9kdWxlX25hbWVdWydvYmplY3QnXS0+bGFuZygnZGVsZXRlJyk7CgkJfQoJCQoJCSRodG1sIC49ICRmaWVsZCAuICc8L3NwYW4+JzsKCQlyZXR1cm4gJGh0bWw7Cgl9CgkKCS8vIFRvb2xzCgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlRGF0ZVNlbGVjdCgkaWQsJG5hbWUsJHZhbHVlcywkc2V0dGluZ3MpCgl7CgkJaWYgKGNvdW50KCR2YWx1ZXMpID09IDEpCgkJewoJCQlpZiAoc3RycG9zKCR2YWx1ZXNbMF0sICctJykgIT09IGZhbHNlKSAkdmFsdWVzID0gZXhwbG9kZSgnLScsJHZhbHVlc1swXSk7CgkJfQoJCSRzdGFydF95ZWFyID0gaXNzZXQoJHNldHRpbmdzWydzdGFydF95ZWFyJ10pPyRzZXR0aW5nc1snc3RhcnRfeWVhciddOmRhdGUoJ1knKTsKCQkkbnVtYmVyX3llYXJzID0gaXNzZXQoJHNldHRpbmdzWydudW1iZXJfeWVhcnMnXSk/JHNldHRpbmdzWydudW1iZXJfeWVhcnMnXToyMDsKCQkkZW5kX3llYXIgPSAkc3RhcnRfeWVhciArICRudW1iZXJfeWVhcnM7CgkJCgkJJHllYXIgPSBzZWxmOjpDcmVhdGVJbnB1dFNlbGVjdExpc3QoJGlkLCRuYW1lLidbMF0nLHNlbGY6OkNyZWF0ZU51bWJlckxpc3QoJGVuZF95ZWFyLCRzdGFydF95ZWFyKSxhcnJheSgkdmFsdWVzWzBdKSwxLCcnLGZhbHNlKTsKCQkkbW9udGggPSBzZWxmOjpDcmVhdGVJbnB1dFNlbGVjdExpc3QoJGlkLCRuYW1lLidbMV0nLHNlbGY6OkNyZWF0ZU1vbnRoc0xpc3QoKSxhcnJheSgkdmFsdWVzWzFdKSwxLCcnLGZhbHNlKTsKCQkkZGF5ID0gc2VsZjo6Q3JlYXRlSW5wdXRTZWxlY3RMaXN0KCRpZCwkbmFtZS4nWzJdJyxzZWxmOjpDcmVhdGVOdW1iZXJMaXN0KDMxLDEpLGFycmF5KCR2YWx1ZXNbMl0pLDEsJycsZmFsc2UpOwoJCWlmIChpc3NldCgkc2V0dGluZ3NbJ2V1cm9wZWFuX2RhdGUnXSkpCgkJewoJCQlyZXR1cm4gJGRheSAuICRtb250aCAuICR5ZWFyOwoJCX0KCQlyZXR1cm4gJHllYXIgLiAkbW9udGggLiAkZGF5OwoJfQoJCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENyZWF0ZVRpbWVTZWxlY3QoJGlkLCRuYW1lLCR2YWx1ZXMpCgl7CgkJJGhvdXJzID0gc2VsZjo6Q3JlYXRlSW5wdXRTZWxlY3RMaXN0KCRpZCwkbmFtZS4nWzBdJyxzZWxmOjpDcmVhdGVOdW1iZXJMaXN0KDIzKSxhcnJheSgkdmFsdWVzWzBdKSwxLCcnLGZhbHNlKTsKCQkkbWludXRlcyA9IHNlbGY6OkNyZWF0ZUlucHV0U2VsZWN0TGlzdCgkaWQsJG5hbWUuJ1sxXScsc2VsZjo6Q3JlYXRlTnVtYmVyTGlzdCg1OSksYXJyYXkoJHZhbHVlc1sxXSksMSwnJyxmYWxzZSk7CgkJJHNlY29uZHMgPSBzZWxmOjpDcmVhdGVJbnB1dFNlbGVjdExpc3QoJGlkLCRuYW1lLidbMl0nLHNlbGY6OkNyZWF0ZU51bWJlckxpc3QoNTkpLGFycmF5KCR2YWx1ZXNbMl0pLDEsJycsZmFsc2UpOwoJCXJldHVybiAkaG91cnMgLiAnIDogJyAuICRtaW51dGVzIC4gJyA6ICcgLiAkc2Vjb25kczsKCX0KCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIENyZWF0ZU1vbnRoc0xpc3QoKQoJewoJCSRtb250aHMgPSBhcnJheSgpOwoJCWZvciAoJGkgPSAxOyAkaSA8PSAxMjsgKyskaSkgewoJCQkkdCA9IG1rdGltZSgwLCAwLCAwLCAkaSwgMSwgMjAwMCk7CgkJCSRtb250aHNbJGldID0gZGF0ZSgnTScsICR0KTsKCQl9CgkJcmV0dXJuICRtb250aHM7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBDcmVhdGVOdW1iZXJMaXN0KCRlbmQsICRzdGFydD0wKQoJewoJCWlmICgoJGVuZCA8IDApfHwoIWlzX251bWVyaWMoJGVuZCkpKSAkZW5kID0gMTsKCQkkbGlzdCA9IGFycmF5KCk7CgkJZm9yICgkaSA9ICRzdGFydDsgJGkgPD0gJGVuZDsgJGkrKykKCQl7CgkJCSRsaXN0WyRpXSA9IChzdHJpbmcpJGk7CgkJfQoJCXJldHVybiAkbGlzdDsKCX0KCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBDcmVhdGVJbnB1dFNlbGVjdExpc3QoJGlkLCAkbmFtZSwgJGl0ZW1zLCAkc2VsZWN0ZWRpdGVtcz1hcnJheSgpLCAkc2l6ZT0zLCAkYWRkdHRleHQ9JycsICRtdWx0aXBsZSA9IHRydWUpCgl7CgkgICRpZCA9IGNtc19odG1sZW50aXRpZXMoJGlkKTsKCSAgJG5hbWUgPSBjbXNfaHRtbGVudGl0aWVzKCRuYW1lKTsKCSAgJHNpemUgPSBjbXNfaHRtbGVudGl0aWVzKCRzaXplKTsKCSAgJG11bHRpcGxlID0gY21zX2h0bWxlbnRpdGllcygkbXVsdGlwbGUpOwoJCgkJaWYoJG11bHRpcGxlID09IHRydWUpCgkJewoJCQkkbmFtZSAuPSAnW10nOwoJCX0KCQoJCSR0ZXh0ID0gJzxzZWxlY3QgbmFtZT0iJy4kaWQuJG5hbWUuJyInOwoJCWlmICgkYWRkdHRleHQgIT0gJycpCgkJewoJCQkkdGV4dCAuPSAnICcgLiAkYWRkdHRleHQ7CgkJfQoJCWlmKCAkbXVsdGlwbGUgKQoJCSAgewoJCQkkdGV4dCAuPSAnIG11bHRpcGxlPSJtdWx0aXBsZSIgJzsKCQkgIH0KCQkgIAoJCSAgaWYgKCRzaXplID4gMSkKCQkgIHsKCQkgIAkkdGV4dCAuPSAnIHNpemU9IicuJHNpemUuJyInOwoJCSAgfQoJCQoJCSR0ZXh0IC49ICc+JzsKCQkKCQkkY291bnQgPSAwOwoJCWZvcmVhY2ggKCRpdGVtcyBhcyAka2V5PT4kdmFsdWUpCgkJewoJCSAgaWYgKGlzX2FycmF5KCR2YWx1ZSkpCgkJIAl7CgkJCQkkdGV4dCAuPSAnPG9wdGdyb3VwIGxhYmVsPSInIC4gJGtleSAuICciPic7CgkJCQlmb3JlYWNoICgkdmFsdWUgYXMgJGtleTIgPT4gJGVudHJ5KQoJCQkJewoJCQkJCSR0ZXh0IC49IHNlbGY6OmdlbmVyYXRlT3B0aW9uKCRrZXkyLCAkZW50cnksICRzZWxlY3RlZGl0ZW1zKTsKCQkJCQkkY291bnQrKzsKCQkJCX0KCQkJCSR0ZXh0IC49ICc8L29wdGdyb3VwPic7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkkdGV4dCAuPSBzZWxmOjpnZW5lcmF0ZU9wdGlvbigka2V5LCAkdmFsdWUsICRzZWxlY3RlZGl0ZW1zKTsKCQkJCSRjb3VudCsrOwoJCQl9CgkJfQoJCSR0ZXh0IC49ICc8L3NlbGVjdD4nLiJcbiI7CgkKCQlyZXR1cm4gJHRleHQ7Cgl9CgkKCXByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gZ2VuZXJhdGVPcHRpb24oJGtleSwgJHZhbHVlLCAkc2VsZWN0ZWRpdGVtcykKCXsKICAJLy8gaWYgKGlzX2FycmF5KCR2YWx1ZSkpCiAgCS8vICAJewogIAkvLyAJCSRhcnJheSA9IGFycmF5X3NoaWZ0KCR2YWx1ZSk7CiAgCS8vIAkJJGtleSA9IGltcGxvZGUoJ3wnLGFycmF5X2tleXMoJGFycmF5KSk7CiAgCS8vIAkJJHZhbHVlID0gaW1wbG9kZSgnfCcsICRhcnJheSk7CiAgCS8vIAl9CgoJCS8vJHZhbHVlID0gY21zX2h0bWxlbnRpdGllcygkdmFsdWUpOwoJCSR2YWx1ZSA9ICR2YWx1ZTsKCgkJJHRleHQgPSAnPG9wdGlvbiB2YWx1ZT0iJy4ka2V5LiciJzsKCQlpZiAoaW5fYXJyYXkoJGtleSwgJHNlbGVjdGVkaXRlbXMpKQoJCXsKCQkJJHRleHQgLj0gJyAnIC4gJ3NlbGVjdGVkPSJzZWxlY3RlZCInOwoJCX0KCQkkdGV4dCAuPSAnPic7CgkJJHRleHQgLj0gJHZhbHVlOwoJCSR0ZXh0IC49ICc8L29wdGlvbj4nOwoJCQoJCXJldHVybiAkdGV4dDsJCgl9CgkKCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gQ3JlYXRlSW5wdXRFeHBhbmRlZExpc3QoJGlkLCAkbmFtZSwgJGl0ZW1zLCAkc2VsZWN0ZWRpdGVtcz1hcnJheSgpLCAkYWRkdHRleHQ9JycsICRtdWx0aXBsZSA9IHRydWUsICRwYXJhbXMgPSBhcnJheSgpKQoJewoJCWdsb2JhbCAkZ0NtczsKCSAgJGlkID0gY21zX2h0bWxlbnRpdGllcygkaWQpOwoJICAkbmFtZSA9IGNtc19odG1sZW50aXRpZXMoJG5hbWUpOwoJICAkbXVsdGlwbGUgPSBjbXNfaHRtbGVudGl0aWVzKCRtdWx0aXBsZSk7CgkKCQkkbGlzdCA9IGFycmF5KCk7CgkJZm9yZWFjaCgkaXRlbXMgYXMgJGtleSA9PiAkaXRlbSkKCQl7CgkJCWlmIChpc19hcnJheSgkaXRlbSkpCgkJCXsKCQkJCSRsaXN0W10gPSBhcnJheSgnbGFiZWwnID0+ICc8c3Ryb25nPicgLiAka2V5IC4gJzwvc3Ryb25nPicsICdpbnB1dCcgPT4gJycpOwoJCgkJCQlmb3JlYWNoKCRpdGVtIGFzICRrZXkyID0+ICRlbnRyeSkKCQkJCXsKCQkJCQkgc2VsZjo6Z2VuZXJhdGVFeHBhbmRlZExpc3QoJiRsaXN0LCAkaWQsICRlbnRyeSwgJG5hbWUsICRrZXkyLCAkc2VsZWN0ZWRpdGVtcywgJG11bHRpcGxlLCAkYWRkdHRleHQpOwoJCQkJfQoJCQkJCgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlzZWxmOjpnZW5lcmF0ZUV4cGFuZGVkTGlzdCgmJGxpc3QsICRpZCwgJGl0ZW0sICRuYW1lLCAka2V5LCAkc2VsZWN0ZWRpdGVtcywgJG11bHRpcGxlLCAkYWRkdHRleHQpOwoJCQl9CgkJfQoJCQoJCWlmKGlzc2V0KCRwYXJhbXNbJ21vZGUnXSkgJiYgKCRwYXJhbXNbJ21vZGUnXSA9PSAnaHRtbCcpKQoJCXsKCQkJLy8gVE9ETwoJCQlyZXR1cm4gJ05vdCBpbXBsZW1lbnRlZCB5ZXQnOwoJCX0KCQllbHNlaWYoaXNzZXQoJHBhcmFtc1snbW9kZSddKSAmJiAoJHBhcmFtc1snbW9kZSddID09ICdhcnJheScpKQoJCXsKCQkJcmV0dXJuICRsaXN0OwoJCX0KCQllbHNlCgkJewoJCQkkaHRtbCA9ICcnOwoJCQlpZiAoY291bnQoJGxpc3QpID4gMCkKCQkJewoJCQkJJGh0bWwgLj0gJzx1bD4nOwoJCQkJZm9yZWFjaCgkbGlzdCBhcyAkaXRlbSkKCQkJCXsKCQkJCQkkaHRtbCAuPSAnPGxpPicuJGl0ZW1bJ2lucHV0J10uICcgJy4gJGl0ZW1bJ2xhYmVsJ10gLic8L2xpPic7CgkJCQl9CgkJCQkkaHRtbCAuPSAnPC91bD4nOwoJCQl9CgkJCXJldHVybiAkaHRtbDsKCQl9CgkKCX0KCQoJcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBnZW5lcmF0ZUV4cGFuZGVkTGlzdCgmJGxpc3QsICRpZCwgJGl0ZW0sICRuYW1lLCAka2V5LCAkc2VsZWN0ZWRpdGVtcywgJG11bHRpcGxlLCAkYWRkdHRleHQpCgl7CgkJaWYgKGluX2FycmF5KCRrZXksICRzZWxlY3RlZGl0ZW1zKSkKCQl7CgkJCSR0ZXh0ID0gJyBjaGVja2VkPSJjaGVja2VkIicgLiAnICcgLiAkYWRkdHRleHQ7CgkJfQoJCWVsc2UKCQl7CgkJCSR0ZXh0ID0gJyAnIC4gJGFkZHR0ZXh0OwoJCX0KCQkKCQlpZigkbXVsdGlwbGUpCgkJewkJCQkKCQkJJGxpc3RbXSA9IGFycmF5KAoJCQkJJ2xhYmVsJyA9PiAnPGxhYmVsIGZvcj0iJy4kaWQuJG5hbWUuJ1snLiRrZXkuJ10iPicgLiAkaXRlbSAuICc8L2xhYmVsPicsCgkJCQknaW5wdXQnID0+ICc8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9IicuJGlkLiRuYW1lLidbJy4ka2V5LiddIiBpZD0iJy4kaWQuJG5hbWUuJ1snLiRrZXkuJ10iIHZhbHVlPSInLiRrZXkuJyInLiR0ZXh0LicgLz4nCgkJCQkpOwoJCX0KCQllbHNlCgkJewoJCQkkbGlzdFtdID0gYXJyYXkoCgkJCQknbGFiZWwnID0+ICc8bGFiZWwgZm9yPSInLiRpZC4kbmFtZS4ka2V5LiciPicgLiAkaXRlbSAuICc8L2xhYmVsPicsCgkJCQknaW5wdXQnID0+ICc8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9IicuJGlkLiRuYW1lLiciIGlkPSInLiRpZC4kbmFtZS4ka2V5LiciIHZhbHVlPSInLiRrZXkuJyInLiR0ZXh0LicgLz4nCgkJCQkpOwoJCX0KCX0KCQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0ltYWdlKCRmaWxlbmFtZSkKCXsKCQkkdmFsaWRfZXh0ZW5zaW9ucyA9IGFycmF5KCdqcGVnJywnanBnJywnZ2lmJywncG5nJyk7CgkJaWYgKGluX2FycmF5KHNlbGY6OmdldEZpbGVFeHRlbnNpb24oJGZpbGVuYW1lKSwkdmFsaWRfZXh0ZW5zaW9ucykpCgkJewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJcmV0dXJuIGZhbHNlOwoJfQoJCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEZpbGVFeHRlbnNpb24oJGZpbGVuYW1lKQoJewoJCSRmaWxlID0gZXhwbG9kZSgnLicsICRmaWxlbmFtZSk7CiAgCQlpZiAoY291bnQoJGZpbGUpID4gMSkKCSAgCXsKCSAgCQlyZXR1cm4gZW5kKCRmaWxlKTsKCSAgCX0KCSAgCWVsc2UgCgkgIAl7CgkgIAkJcmV0dXJuIG51bGw7CgkgIAl9Cgl9CgoJLy8gRVJST1JTCgkJCglwdWJsaWMgZnVuY3Rpb24gaGFzRXJyb3JzKCkKCXsKCQlpZiAoY291bnQoJHRoaXMtPmZvcm1fZXJyb3JzKSA9PSAwKQoJCXsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIG5vRXJyb3IoKQoJewoJCXJldHVybiAhJHRoaXMtPmhhc0Vycm9ycygpOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JzKCkKCXsKCQlyZXR1cm4gJHRoaXMtPmZvcm1fZXJyb3JzOwoJfQoJCglwdWJsaWMgZnVuY3Rpb24gc2hvd0Vycm9ycygpCgl7CgkJJGh0bWwgPSAnJzsKCQlpZihjb3VudCgkdGhpcy0+Zm9ybV9lcnJvcnMpID4gMCkKCQl7CgkJCSRodG1sIC49ICc8dWwgY2xhc3M9ImZvcm1fd2lkZ2V0X2Vycm9ycyI+JzsKCQkJZm9yZWFjaCgkdGhpcy0+Zm9ybV9lcnJvcnMgYXMgJHByaW9yaXR5ID0+ICRlcnJvcnMpCgkJCXsKCQkJCSRodG1sIC49ICc8bGk+JzsKCQkJCWlmICgkdGhpcy0+c2hvd19wcmlvcml0eSkgJGh0bWwgLj0gJzxlbSBjbGFzcz0iZm9ybV93aWRnZXRfZXJyb3JfcHJpb3JpdHkiPicuJHByaW9yaXR5Lic8L2VtPic7CgkJCQkkaHRtbCAuPSAnPHVsPic7CgkJCQlmb3JlYWNoKCRlcnJvcnMgYXMgJGVycm9yKQoJCQkJewoJCQkJCSRodG1sIC49ICc8bGkgY2xhc3M9ImZvcm1fd2lkZ2V0X2Vycm9yX21lc3NhZ2UiPicuJGVycm9yLic8L2xpPic7CgkJCQl9CQkJCQoJCQkJJGh0bWwgLj0gJzwvdWw+PC9saT4nOwoJCQl9CgkJCSRodG1sIC49ICc8L3VsPic7CgkJfQoJCXJldHVybiAkaHRtbDsKCX0KCQoJcHVibGljIGZ1bmN0aW9uIHNldEVycm9yKCRtZXNzYWdlLCRwcmlvcml0eT0nZGVmYXVsdCcpCgl7CgkJJHRoaXMtPmZvcm1fZXJyb3JzWyRwcmlvcml0eV1bXSA9ICRtZXNzYWdlOwoJfQoJCgoJCn0=]]></data>
	</file>
</module>
